Merge "Dump ExpandableView clipping from ENR" into main
diff --git a/ADPF_OWNERS b/ADPF_OWNERS
index e6ca8f4..bcdc338 100644
--- a/ADPF_OWNERS
+++ b/ADPF_OWNERS
@@ -1,3 +1,4 @@
-lpy@google.com
-mattbuckley@google.com
+sumir@google.com
+chingtangyu@google.com
 xwxw@google.com
+mattbuckley@google.com
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index a0f38d9..fbe4905 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -15,6 +15,7 @@
 aconfig_declarations_group {
     name: "framework-minus-apex-aconfig-declarations",
     aconfig_declarations_groups: [
+        "aconfig_trade_in_mode_flags",
         "audio-framework-aconfig",
     ],
     java_aconfig_libraries: [
@@ -1643,3 +1644,29 @@
     aconfig_declarations: "android.app.jank.flags-aconfig",
     defaults: ["framework-minus-apex-aconfig-java-defaults"],
 }
+
+// Trade in mode
+aconfig_declarations {
+    name: "aconfig_trade_in_mode_flags",
+    package: "com.android.tradeinmode.flags",
+    container: "system",
+    srcs: [
+        "core/java/android/os/image/flags/trade_in_mode_flags.aconfig",
+    ],
+}
+
+java_aconfig_library {
+    name: "aconfig_trade_in_mode_flags_java_lib",
+    aconfig_declarations: "aconfig_trade_in_mode_flags",
+    defaults: ["framework-minus-apex-aconfig-java-defaults"],
+}
+
+cc_aconfig_library {
+    name: "android_trade_in_mode_flags_cc_lib",
+    aconfig_declarations: "aconfig_trade_in_mode_flags",
+    apex_available: [
+        "//apex_available:platform",
+        "com.android.adbd",
+    ],
+    min_sdk_version: "apex_inherit",
+}
diff --git a/Android.bp b/Android.bp
index 8c01585..811755d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -64,7 +64,6 @@
     srcs: [
         // Java/AIDL sources under frameworks/base
         ":framework-annotations",
-        ":ravenwood-annotations",
         ":framework-blobstore-sources",
         ":framework-core-sources",
         ":framework-drm-sources",
@@ -296,7 +295,6 @@
         enforce_permissions_exceptions: [
             // Do not add entries to this list.
             ":framework-annotations",
-            ":ravenwood-annotations",
             ":framework-blobstore-sources",
             ":framework-core-sources",
             ":framework-drm-sources",
@@ -370,6 +368,7 @@
     jarjar_rules: ":framework-jarjar-rules",
     javac_shard_size: 150,
     plugins: [
+        "cached-property-annotation-processor",
         "view-inspector-annotation-processor",
         "staledataclass-annotation-processor",
         "error_prone_android_framework",
@@ -600,8 +599,6 @@
 filegroup {
     name: "framework-networkstack-shared-srcs",
     srcs: [
-        // TODO: remove these annotations as soon as we can use andoid.support.annotations.*
-        ":framework-annotations",
         ":modules-utils-preconditions-srcs",
         "core/java/android/util/IndentingPrintWriter.java",
         "core/java/android/util/LocalLog.java",
diff --git a/GAME_MANAGER_OWNERS b/GAME_MANAGER_OWNERS
index b65c43a..bcdc338 100644
--- a/GAME_MANAGER_OWNERS
+++ b/GAME_MANAGER_OWNERS
@@ -1,3 +1,4 @@
-lpy@google.com
+sumir@google.com
 chingtangyu@google.com
 xwxw@google.com
+mattbuckley@google.com
diff --git a/OWNERS b/OWNERS
index 096da29..afa60be 100644
--- a/OWNERS
+++ b/OWNERS
@@ -45,3 +45,7 @@
 per-file PACKAGE_MANAGER_OWNERS = file:/PACKAGE_MANAGER_OWNERS
 
 per-file WEAR_OWNERS = file:/WEAR_OWNERS
+
+per-file ADPF_OWNERS = file:/ADPF_OWNERS
+
+per-file GAME_MANAGER_OWNERS = file:/GAME_MANAGER_OWNERS
diff --git a/apct-tests/perftests/core/src/android/libcore/regression/CipherPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/CipherPerfTest.java
index 238c028..9eac108 100644
--- a/apct-tests/perftests/core/src/android/libcore/regression/CipherPerfTest.java
+++ b/apct-tests/perftests/core/src/android/libcore/regression/CipherPerfTest.java
@@ -18,6 +18,7 @@
 
 import android.perftests.utils.BenchmarkState;
 import android.perftests.utils.PerfStatusReporter;
+import android.util.Log;
 
 import androidx.test.filters.LargeTest;
 
@@ -47,6 +48,8 @@
 @RunWith(JUnitParamsRunner.class)
 @LargeTest
 public class CipherPerfTest {
+    private static final String TAG = "android.libcore.regression.CipherPerfTest";
+
     @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
 
     public static Collection getCases() {
@@ -71,6 +74,10 @@
                     }
                     for (int keySize : keySizes) {
                         for (int inputSize : inputSizes) {
+                            Log.i(TAG,
+                                    "param[" + params.size() + "] = " + mode.name() + ", "
+                                            + padding.name() + ", " + keySize + ", " + inputSize
+                                            + ", " + implementation.name());
                             params.add(
                                     new Object[] {
                                         mode, padding, keySize, inputSize, implementation
diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
index 3af36eb..e200434 100644
--- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
+++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
@@ -1404,7 +1404,11 @@
             if (LOGV) {
                 Slog.v(TAG, "Received " + intent);
             }
-            switch (intent.getAction()) {
+            final String action = intent.getAction();
+            if (action == null) {
+                return;
+            }
+            switch (action) {
                 case Intent.ACTION_PACKAGE_FULLY_REMOVED:
                 case Intent.ACTION_PACKAGE_DATA_CLEARED:
                     final String packageName = intent.getData().getSchemeSpecificPart();
@@ -1431,7 +1435,11 @@
             if (LOGV) {
                 Slog.v(TAG, "Received: " + intent);
             }
-            switch (intent.getAction()) {
+            final String action = intent.getAction();
+            if (action == null) {
+                return;
+            }
+            switch (action) {
                 case Intent.ACTION_USER_REMOVED:
                     final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
                             USER_NULL);
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobParameters.java b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
index 52a761f..31d2ecd 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
@@ -34,6 +34,7 @@
 import android.os.Parcelable;
 import android.os.PersistableBundle;
 import android.os.RemoteException;
+import android.os.Process;
 import android.system.SystemCleaner;
 import android.util.Log;
 
@@ -638,6 +639,12 @@
      * @hide
      */
     public void enableCleaner() {
+        // JobParameters objects are passed by reference in local Binder
+        // transactions for clients running as SYSTEM. The life cycle of the
+        // JobParameters objects are no longer controlled by the client.
+        if (Process.myUid() == Process.SYSTEM_UID) {
+            return;
+        }
         if (mJobCleanupCallback == null) {
             initCleaner(new JobCleanupCallback(IJobCallback.Stub.asInterface(callback), jobId));
         }
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
index 0f3b1c3..033da2d 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -4944,10 +4944,14 @@
 
         @Override
         public void onReceive(Context context, Intent intent) {
+            final String action = intent.getAction();
+            if (action == null) {
+                return;
+            }
             final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
             synchronized (mLock) {
                 String pkgList[] = null;
-                switch (intent.getAction()) {
+                switch (action) {
                     case Intent.ACTION_QUERY_PACKAGE_RESTART:
                         pkgList = intent.getStringArrayExtra(Intent.EXTRA_PACKAGES);
                         for (String packageName : pkgList) {
diff --git a/api/StubLibraries.bp b/api/StubLibraries.bp
index d1aa23c..a949ff5 100644
--- a/api/StubLibraries.bp
+++ b/api/StubLibraries.bp
@@ -364,19 +364,14 @@
 java_library {
     name: "android-non-updatable.stubs",
     defaults: ["android-non-updatable_defaults"],
-    static_libs: [
-        "android-non-updatable.stubs.from-source",
-    ],
-    product_variables: {
-        build_from_text_stub: {
-            static_libs: [
-                "android-non-updatable.stubs.from-text",
-            ],
-            exclude_static_libs: [
-                "android-non-updatable.stubs.from-source",
-            ],
-        },
-    },
+    static_libs: select(product_variable("build_from_text_stub"), {
+        true: [
+            "android-non-updatable.stubs.from-text",
+        ],
+        default: [
+            "android-non-updatable.stubs.from-source",
+        ],
+    }),
 }
 
 java_library {
@@ -390,19 +385,14 @@
 java_library {
     name: "android-non-updatable.stubs.system",
     defaults: ["android-non-updatable_defaults"],
-    static_libs: [
-        "android-non-updatable.stubs.system.from-source",
-    ],
-    product_variables: {
-        build_from_text_stub: {
-            static_libs: [
-                "android-non-updatable.stubs.system.from-text",
-            ],
-            exclude_static_libs: [
-                "android-non-updatable.stubs.system.from-source",
-            ],
-        },
-    },
+    static_libs: select(product_variable("build_from_text_stub"), {
+        true: [
+            "android-non-updatable.stubs.system.from-text",
+        ],
+        default: [
+            "android-non-updatable.stubs.system.from-source",
+        ],
+    }),
 }
 
 java_library {
@@ -416,19 +406,14 @@
 java_library {
     name: "android-non-updatable.stubs.module_lib",
     defaults: ["android-non-updatable_defaults"],
-    static_libs: [
-        "android-non-updatable.stubs.module_lib.from-source",
-    ],
-    product_variables: {
-        build_from_text_stub: {
-            static_libs: [
-                "android-non-updatable.stubs.module_lib.from-text",
-            ],
-            exclude_static_libs: [
-                "android-non-updatable.stubs.module_lib.from-source",
-            ],
-        },
-    },
+    static_libs: select(product_variable("build_from_text_stub"), {
+        true: [
+            "android-non-updatable.stubs.module_lib.from-text",
+        ],
+        default: [
+            "android-non-updatable.stubs.module_lib.from-source",
+        ],
+    }),
 }
 
 java_library {
@@ -442,19 +427,14 @@
 java_library {
     name: "android-non-updatable.stubs.test",
     defaults: ["android-non-updatable_defaults"],
-    static_libs: [
-        "android-non-updatable.stubs.test.from-source",
-    ],
-    product_variables: {
-        build_from_text_stub: {
-            static_libs: [
-                "android-non-updatable.stubs.test.from-text",
-            ],
-            exclude_static_libs: [
-                "android-non-updatable.stubs.test.from-source",
-            ],
-        },
-    },
+    static_libs: select(product_variable("build_from_text_stub"), {
+        true: [
+            "android-non-updatable.stubs.test.from-text",
+        ],
+        default: [
+            "android-non-updatable.stubs.test.from-source",
+        ],
+    }),
 }
 
 java_library {
@@ -468,19 +448,14 @@
 java_library {
     name: "android-non-updatable.stubs.system_server",
     defaults: ["android-non-updatable_defaults"],
-    static_libs: [
-        "android-non-updatable.stubs.system_server.from-source",
-    ],
-    product_variables: {
-        build_from_text_stub: {
-            static_libs: [
-                "android-non-updatable.stubs.system_server.from-text",
-            ],
-            exclude_static_libs: [
-                "android-non-updatable.stubs.system_server.from-source",
-            ],
-        },
-    },
+    static_libs: select(product_variable("build_from_text_stub"), {
+        true: [
+            "android-non-updatable.stubs.system_server.from-text",
+        ],
+        default: [
+            "android-non-updatable.stubs.system_server.from-source",
+        ],
+    }),
 }
 
 java_library {
diff --git a/api/api.go b/api/api.go
index e9f1fee..1bbf370 100644
--- a/api/api.go
+++ b/api/api.go
@@ -514,7 +514,7 @@
 func combinedApisModuleFactory() android.Module {
 	module := &CombinedApis{}
 	module.AddProperties(&module.properties)
-	android.InitAndroidModule(module)
+	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
 	android.AddLoadHook(module, func(ctx android.LoadHookContext) { module.createInternalModules(ctx) })
 	return module
 }
diff --git a/boot/README.md b/boot/README.md
new file mode 100644
index 0000000..d9219c8
--- /dev/null
+++ b/boot/README.md
@@ -0,0 +1,10 @@
+# Configuration files for ART compiling the framework
+
+*   boot-image-profile.txt: A list of methods from the framework boot classpath
+    to be compiled by dex2oat. The order in the file is not relevant.
+*   boot-profile.txt: An ordered list of methods from the boot classpath to be
+    compiled by the JIT in the order provided in the file. Used by JIT zygote,
+    when on-device signing failed.
+*   boot-image-profile-extra.txt: An extra list of methods from the framework
+    boot classpath to be compiled by dex2oat on top of what we have at
+    boot-image-profile.txt.
diff --git a/config/boot-image-profile-extra.txt b/boot/boot-image-profile-extra.txt
similarity index 100%
rename from config/boot-image-profile-extra.txt
rename to boot/boot-image-profile-extra.txt
diff --git a/config/boot-profile.txt b/boot/boot-profile.txt
similarity index 100%
rename from config/boot-profile.txt
rename to boot/boot-profile.txt
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index c2f6e30..87c9fa4 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -106,7 +106,6 @@
 static const int TEXT_MISSING_VALUE = INT_MIN;
 static const char EXIT_PROP_NAME[] = "service.bootanim.exit";
 static const char PROGRESS_PROP_NAME[] = "service.bootanim.progress";
-static const char DISPLAYS_PROP_NAME[] = "persist.service.bootanim.displays";
 static const char CLOCK_ENABLED_PROP_NAME[] = "persist.sys.bootanim.clock.enabled";
 static const int ANIM_ENTRY_NAME_MAX = ANIM_PATH_MAX + 1;
 static const int MAX_CHECK_EXIT_INTERVAL_US = 50000;
@@ -514,50 +513,9 @@
         return NAME_NOT_FOUND;
     }
 
-    // this system property specifies multi-display IDs to show the boot animation
-    // multiple ids can be set with comma (,) as separator, for example:
-    // setprop persist.boot.animation.displays 19260422155234049,19261083906282754
-    Vector<PhysicalDisplayId> physicalDisplayIds;
-    char displayValue[PROPERTY_VALUE_MAX] = "";
-    property_get(DISPLAYS_PROP_NAME, displayValue, "");
-    bool isValid = displayValue[0] != '\0';
-    if (isValid) {
-        char *p = displayValue;
-        while (*p) {
-            if (!isdigit(*p) && *p != ',') {
-                isValid = false;
-                break;
-            }
-            p ++;
-        }
-        if (!isValid)
-            SLOGE("Invalid syntax for the value of system prop: %s", DISPLAYS_PROP_NAME);
-    }
-    if (isValid) {
-        std::istringstream stream(displayValue);
-        for (PhysicalDisplayId id; stream >> id.value; ) {
-            physicalDisplayIds.add(id);
-            if (stream.peek() == ',')
-                stream.ignore();
-        }
-
-        // the first specified display id is used to retrieve mDisplayToken
-        for (const auto id : physicalDisplayIds) {
-            if (std::find(ids.begin(), ids.end(), id) != ids.end()) {
-                if (const auto token = SurfaceComposerClient::getPhysicalDisplayToken(id)) {
-                    mDisplayToken = token;
-                    break;
-                }
-            }
-        }
-    }
-
-    // If the system property is not present or invalid, display 0 is used
+    mDisplayToken = SurfaceComposerClient::getPhysicalDisplayToken(ids.front());
     if (mDisplayToken == nullptr) {
-        mDisplayToken = SurfaceComposerClient::getPhysicalDisplayToken(ids.front());
-        if (mDisplayToken == nullptr) {
-            return NAME_NOT_FOUND;
-        }
+        return NAME_NOT_FOUND;
     }
 
     DisplayMode displayMode;
@@ -577,17 +535,8 @@
             ISurfaceComposerClient::eOpaque);
 
     SurfaceComposerClient::Transaction t;
-    if (isValid) {
-        // In the case of multi-display, boot animation shows on the specified displays
-        for (const auto id : physicalDisplayIds) {
-            if (std::find(ids.begin(), ids.end(), id) != ids.end()) {
-                if (const auto token = SurfaceComposerClient::getPhysicalDisplayToken(id)) {
-                    t.setDisplayLayerStack(token, ui::DEFAULT_LAYER_STACK);
-                }
-            }
-        }
-        t.setLayerStack(control, ui::DEFAULT_LAYER_STACK);
-    }
+    t.setDisplayLayerStack(mDisplayToken, ui::DEFAULT_LAYER_STACK);
+    t.setLayerStack(control, ui::DEFAULT_LAYER_STACK);
 
     t.setLayer(control, 0x40000000)
         .apply();
diff --git a/cmds/hid/Android.bp b/cmds/hid/Android.bp
index a6e2769..b93227a 100644
--- a/cmds/hid/Android.bp
+++ b/cmds/hid/Android.bp
@@ -22,5 +22,5 @@
     name: "hid",
     wrapper: "hid.sh",
     srcs: ["**/*.java"],
-    required: ["libhidcommand_jni"],
+    jni_libs: ["libhidcommand_jni"],
 }
diff --git a/cmds/uinput/Android.bp b/cmds/uinput/Android.bp
index da497dc..cec8a0d8 100644
--- a/cmds/uinput/Android.bp
+++ b/cmds/uinput/Android.bp
@@ -25,7 +25,7 @@
         "src/**/*.java",
         ":uinputcommand_aidl",
     ],
-    required: ["libuinputcommand_jni"],
+    jni_libs: ["libuinputcommand_jni"],
 }
 
 filegroup {
diff --git a/cmds/uinput/README.md b/cmds/uinput/README.md
index 5d3f12e..6138388 100644
--- a/cmds/uinput/README.md
+++ b/cmds/uinput/README.md
@@ -83,6 +83,11 @@
 Due to the sequential nature in which this is parsed, the `type` field must be specified before
 the `data` field in this JSON Object.
 
+Every `register` command will need a `"UI_SET_EVBIT"` configuration entry that lists what types of
+axes it declares. This entry should be the first in the list. For example, if the uinput device has
+`"UI_SET_KEYBIT"` and `"UI_SET_RELBIT"` configuration entries, it will also need a `"UI_SET_EVBIT"`
+entry with data of `["EV_KEY", "EV_REL"]` or the other configuration entries will be ignored.
+
 `ff_effects_max` must be provided if `UI_SET_FFBIT` is used in `configuration`.
 
 `abs_info` fields are provided to set the device axes information. It is an array of below objects:
diff --git a/config/README.md b/config/README.md
index 450a5c6..f2c8930 100644
--- a/config/README.md
+++ b/config/README.md
@@ -1,10 +1,5 @@
 # Configuration files for ART compiling the framework
 
-* boot-image-profile.txt: A list of methods from the boot classpath to be compiled by dex2oat.
-  The order in the file is not relevant.
-* boot-profile.txt: An ordered list of methods from the boot classpath to be compiled by
-  the JIT in the order provided in the file. Used by JIT zygote, when on-device
-  signing failed.
 * dirty-image-objects: List of objects in the boot image which are known to
   become dirty. This helps binning objects in the image file.
 * preloaded-classes: classes that will be allocated in the boot image, and
diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt
deleted file mode 100644
index ee417e8..0000000
--- a/config/boot-image-profile.txt
+++ /dev/null
@@ -1,50393 +0,0 @@
-#
-# Copyright (C) 2017 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.
-#
-HSPLandroid/accessibilityservice/AccessibilityServiceInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/accessibilityservice/AccessibilityServiceInfo;
-HSPLandroid/accessibilityservice/AccessibilityServiceInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/accessibilityservice/AccessibilityServiceInfo;->getId()Ljava/lang/String;
-HSPLandroid/accessibilityservice/AccessibilityServiceInfo;->initFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/accounts/Account$1;->createFromParcel(Landroid/os/Parcel;)Landroid/accounts/Account;
-HSPLandroid/accounts/Account$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/accounts/Account$1;->newArray(I)[Landroid/accounts/Account;
-HSPLandroid/accounts/Account$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/accounts/Account;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/accounts/Account;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/Account;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/Account;->equals(Ljava/lang/Object;)Z
-HSPLandroid/accounts/Account;->hashCode()I
-HSPLandroid/accounts/Account;->onAccountAccessed(Ljava/lang/String;)V
-HSPLandroid/accounts/Account;->toString()Ljava/lang/String;
-HSPLandroid/accounts/Account;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/accounts/AccountManager$10;-><init>(Landroid/accounts/AccountManager;Landroid/app/Activity;Landroid/os/Handler;Landroid/accounts/AccountManagerCallback;Landroid/accounts/Account;Ljava/lang/String;ZLandroid/os/Bundle;)V
-HSPLandroid/accounts/AccountManager$10;->doWork()V
-HSPLandroid/accounts/AccountManager$18;->run()V
-HSPLandroid/accounts/AccountManager$1;-><init>(Landroid/accounts/AccountManager;ILjava/lang/String;)V
-HSPLandroid/accounts/AccountManager$1;->bypass(Landroid/content/pm/UserPackage;)Z
-HSPLandroid/accounts/AccountManager$1;->bypass(Ljava/lang/Object;)Z
-HSPLandroid/accounts/AccountManager$1;->recompute(Landroid/content/pm/UserPackage;)[Landroid/accounts/Account;
-HSPLandroid/accounts/AccountManager$1;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$20;-><init>(Landroid/accounts/AccountManager;)V
-HSPLandroid/accounts/AccountManager$2;-><init>(Landroid/accounts/AccountManager;ILjava/lang/String;)V
-HSPLandroid/accounts/AccountManager$2;->recompute(Landroid/accounts/AccountManager$AccountKeyData;)Ljava/lang/String;
-HSPLandroid/accounts/AccountManager$2;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$4;->bundleToResult(Landroid/os/Bundle;)Ljava/lang/Boolean;
-HSPLandroid/accounts/AccountManager$4;->bundleToResult(Landroid/os/Bundle;)Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$4;->doWork()V
-HSPLandroid/accounts/AccountManager$5;-><init>(Landroid/accounts/AccountManager;Landroid/os/Handler;Landroid/accounts/AccountManagerCallback;Ljava/lang/String;[Ljava/lang/String;)V
-HSPLandroid/accounts/AccountManager$5;->bundleToResult(Landroid/os/Bundle;)Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$5;->bundleToResult(Landroid/os/Bundle;)[Landroid/accounts/Account;
-HSPLandroid/accounts/AccountManager$5;->doWork()V
-HSPLandroid/accounts/AccountManager$AccountKeyData;-><init>(Landroid/accounts/Account;Ljava/lang/String;)V
-HSPLandroid/accounts/AccountManager$AccountKeyData;->equals(Ljava/lang/Object;)Z
-HSPLandroid/accounts/AccountManager$AccountKeyData;->hashCode()I
-HSPLandroid/accounts/AccountManager$AmsTask$1;-><init>(Landroid/accounts/AccountManager;)V
-HSPLandroid/accounts/AccountManager$AmsTask$Response;-><init>(Landroid/accounts/AccountManager$AmsTask;)V
-HSPLandroid/accounts/AccountManager$AmsTask$Response;-><init>(Landroid/accounts/AccountManager$AmsTask;Landroid/accounts/AccountManager$AmsTask$Response-IA;)V
-HSPLandroid/accounts/AccountManager$AmsTask$Response;->onResult(Landroid/os/Bundle;)V
-HSPLandroid/accounts/AccountManager$AmsTask;-><init>(Landroid/accounts/AccountManager;Landroid/app/Activity;Landroid/os/Handler;Landroid/accounts/AccountManagerCallback;)V
-HSPLandroid/accounts/AccountManager$AmsTask;->done()V
-HSPLandroid/accounts/AccountManager$AmsTask;->getResult()Landroid/os/Bundle;
-HSPLandroid/accounts/AccountManager$AmsTask;->getResult()Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$AmsTask;->getResult(JLjava/util/concurrent/TimeUnit;)Landroid/os/Bundle;
-HSPLandroid/accounts/AccountManager$AmsTask;->getResult(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$AmsTask;->internalGetResult(Ljava/lang/Long;Ljava/util/concurrent/TimeUnit;)Landroid/os/Bundle;
-HSPLandroid/accounts/AccountManager$AmsTask;->set(Landroid/os/Bundle;)V
-HSPLandroid/accounts/AccountManager$AmsTask;->start()Landroid/accounts/AccountManagerFuture;
-HSPLandroid/accounts/AccountManager$BaseFutureTask$1;-><init>(Landroid/accounts/AccountManager;)V
-HSPLandroid/accounts/AccountManager$BaseFutureTask$Response;-><init>(Landroid/accounts/AccountManager$BaseFutureTask;)V
-HSPLandroid/accounts/AccountManager$BaseFutureTask$Response;->onResult(Landroid/os/Bundle;)V
-HSPLandroid/accounts/AccountManager$BaseFutureTask;-><init>(Landroid/accounts/AccountManager;Landroid/os/Handler;)V
-HSPLandroid/accounts/AccountManager$BaseFutureTask;->startTask()V
-HSPLandroid/accounts/AccountManager$Future2Task;-><init>(Landroid/accounts/AccountManager;Landroid/os/Handler;Landroid/accounts/AccountManagerCallback;)V
-HSPLandroid/accounts/AccountManager$Future2Task;->done()V
-HSPLandroid/accounts/AccountManager$Future2Task;->getResult()Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$Future2Task;->internalGetResult(Ljava/lang/Long;Ljava/util/concurrent/TimeUnit;)Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$Future2Task;->start()Landroid/accounts/AccountManager$Future2Task;
-HSPLandroid/accounts/AccountManager;->-$$Nest$fgetmService(Landroid/accounts/AccountManager;)Landroid/accounts/IAccountManager;
-HSPLandroid/accounts/AccountManager;-><init>(Landroid/content/Context;Landroid/accounts/IAccountManager;)V
-HSPLandroid/accounts/AccountManager;->addOnAccountsUpdatedListener(Landroid/accounts/OnAccountsUpdateListener;Landroid/os/Handler;Z)V
-HSPLandroid/accounts/AccountManager;->addOnAccountsUpdatedListener(Landroid/accounts/OnAccountsUpdateListener;Landroid/os/Handler;Z[Ljava/lang/String;)V
-HSPLandroid/accounts/AccountManager;->blockingGetAuthToken(Landroid/accounts/Account;Ljava/lang/String;Z)Ljava/lang/String;
-HSPLandroid/accounts/AccountManager;->ensureNotOnMainThread()V
-HSPLandroid/accounts/AccountManager;->get(Landroid/content/Context;)Landroid/accounts/AccountManager;
-HSPLandroid/accounts/AccountManager;->getAccounts()[Landroid/accounts/Account;
-HSPLandroid/accounts/AccountManager;->getAccountsAsUser(I)[Landroid/accounts/Account;
-HSPLandroid/accounts/AccountManager;->getAccountsByType(Ljava/lang/String;)[Landroid/accounts/Account;
-HSPLandroid/accounts/AccountManager;->getAccountsByTypeAndFeatures(Ljava/lang/String;[Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;
-HSPLandroid/accounts/AccountManager;->getAccountsByTypeAsUser(Ljava/lang/String;Landroid/os/UserHandle;)[Landroid/accounts/Account;
-HSPLandroid/accounts/AccountManager;->getAccountsByTypeForPackage(Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;
-HSPLandroid/accounts/AccountManager;->getAuthToken(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;ZLandroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;
-HSPLandroid/accounts/AccountManager;->getAuthToken(Landroid/accounts/Account;Ljava/lang/String;ZLandroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;
-HSPLandroid/accounts/AccountManager;->getAuthenticatorTypes()[Landroid/accounts/AuthenticatorDescription;
-HSPLandroid/accounts/AccountManager;->getAuthenticatorTypesAsUser(I)[Landroid/accounts/AuthenticatorDescription;
-HSPLandroid/accounts/AccountManager;->getUserData(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/accounts/AccountManager;->hasFeatures(Landroid/accounts/Account;[Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;
-HSPLandroid/accounts/AccountManager;->invalidateAuthToken(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/AccountManager;->removeOnAccountsUpdatedListener(Landroid/accounts/OnAccountsUpdateListener;)V
-HSPLandroid/accounts/AccountManager;->setUserData(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/AuthenticatorDescription$1;->createFromParcel(Landroid/os/Parcel;)Landroid/accounts/AuthenticatorDescription;
-HSPLandroid/accounts/AuthenticatorDescription$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/accounts/AuthenticatorDescription$1;->newArray(I)[Landroid/accounts/AuthenticatorDescription;
-HSPLandroid/accounts/AuthenticatorDescription$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/accounts/AuthenticatorDescription;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->getAccountsAsUser(Ljava/lang/String;ILjava/lang/String;)[Landroid/accounts/Account;
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->getAccountsByFeatures(Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->getAccountsByTypeForPackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->getAuthToken(Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;Ljava/lang/String;ZZLandroid/os/Bundle;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->getAuthenticatorTypes(I)[Landroid/accounts/AuthenticatorDescription;
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->getUserData(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->invalidateAuthToken(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->onAccountAccessed(Ljava/lang/String;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->registerAccountListener([Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->setUserData(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->unregisterAccountListener([Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/IAccountManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountManager;
-HSPLandroid/accounts/IAccountManagerResponse$Stub;-><init>()V
-HSPLandroid/accounts/IAccountManagerResponse$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/accounts/IAccountManagerResponse$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
-HSPLandroid/accounts/IAccountManagerResponse$Stub;->getMaxTransactionId()I
-HSPLandroid/accounts/IAccountManagerResponse$Stub;->getTransactionName(I)Ljava/lang/String;
-HSPLandroid/accounts/IAccountManagerResponse$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/animation/AnimationHandler$$ExternalSyntheticLambda0;-><init>(Landroid/animation/AnimationHandler;)V
-HSPLandroid/animation/AnimationHandler$$ExternalSyntheticLambda0;->doFrame(J)V
-HSPLandroid/animation/AnimationHandler$1;-><init>(Landroid/animation/AnimationHandler;)V
-HSPLandroid/animation/AnimationHandler$1;->doFrame(J)V+]Landroid/animation/AnimationHandler$AnimationFrameCallbackProvider;Landroid/animation/AnimationHandler$MyFrameCallbackProvider;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/animation/AnimationHandler$MyFrameCallbackProvider;-><init>(Landroid/animation/AnimationHandler;)V
-HSPLandroid/animation/AnimationHandler$MyFrameCallbackProvider;->getFrameTime()J+]Landroid/view/Choreographer;Landroid/view/Choreographer;
-HSPLandroid/animation/AnimationHandler$MyFrameCallbackProvider;->postFrameCallback(Landroid/view/Choreographer$FrameCallback;)V+]Landroid/view/Choreographer;Landroid/view/Choreographer;
-HSPLandroid/animation/AnimationHandler;-><init>()V
-HSPLandroid/animation/AnimationHandler;->addAnimationFrameCallback(Landroid/animation/AnimationHandler$AnimationFrameCallback;J)V
-HSPLandroid/animation/AnimationHandler;->autoCancelBasedOn(Landroid/animation/ObjectAnimator;)V+]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/animation/AnimationHandler;->cleanUpList()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/animation/AnimationHandler;->doAnimationFrame(J)V+]Landroid/animation/AnimationHandler$AnimationFrameCallback;Landroid/animation/ObjectAnimator;,Landroid/animation/AnimatorSet;,Landroid/animation/ValueAnimator;,Lcom/android/internal/dynamicanimation/animation/SpringAnimation;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/animation/AnimationHandler;->getAnimationCount()I
-HSPLandroid/animation/AnimationHandler;->getInstance()Landroid/animation/AnimationHandler;
-HSPLandroid/animation/AnimationHandler;->getProvider()Landroid/animation/AnimationHandler$AnimationFrameCallbackProvider;
-HSPLandroid/animation/AnimationHandler;->isCallbackDue(Landroid/animation/AnimationHandler$AnimationFrameCallback;J)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLandroid/animation/AnimationHandler;->isPauseBgAnimationsEnabledInSystemProperties()Z
-HSPLandroid/animation/AnimationHandler;->removeCallback(Landroid/animation/AnimationHandler$AnimationFrameCallback;)V
-HSPLandroid/animation/AnimationHandler;->requestAnimatorsEnabled(ZLjava/lang/Object;)V
-HSPLandroid/animation/AnimationHandler;->requestAnimatorsEnabledImpl(ZLjava/lang/Object;)V
-HSPLandroid/animation/AnimationHandler;->resumeAnimators()V
-HSPLandroid/animation/AnimationHandler;->setAnimatorPausingEnabled(Z)V
-HSPLandroid/animation/AnimationHandler;->setProvider(Landroid/animation/AnimationHandler$AnimationFrameCallbackProvider;)V
-HSPLandroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda0;-><init>()V
-HSPLandroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda0;->call(Ljava/lang/Object;Ljava/lang/Object;Z)V
-HSPLandroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda1;-><init>()V
-HSPLandroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda1;->call(Ljava/lang/Object;Ljava/lang/Object;Z)V
-HSPLandroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda2;-><init>()V
-HSPLandroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda2;->call(Ljava/lang/Object;Ljava/lang/Object;Z)V
-HSPLandroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda3;-><init>()V
-HSPLandroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda4;-><init>()V
-HSPLandroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda5;-><init>()V
-HSPLandroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda6;-><init>()V
-HSPLandroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda6;->call(Ljava/lang/Object;Ljava/lang/Object;Z)V
-HSPLandroid/animation/Animator$AnimatorCaller;-><clinit>()V
-HSPLandroid/animation/Animator$AnimatorCaller;->lambda$static$0(Landroid/animation/Animator$AnimatorListener;Landroid/animation/Animator;Z)V
-HSPLandroid/animation/Animator$AnimatorCaller;->lambda$static$4(Landroid/animation/ValueAnimator$AnimatorUpdateListener;Landroid/animation/ValueAnimator;Z)V+]Landroid/animation/ValueAnimator$AnimatorUpdateListener;missing_types
-HSPLandroid/animation/Animator$AnimatorConstantState;-><init>(Landroid/animation/Animator;)V
-HSPLandroid/animation/Animator$AnimatorConstantState;->getChangingConfigurations()I
-HSPLandroid/animation/Animator$AnimatorConstantState;->newInstance()Landroid/animation/Animator;
-HSPLandroid/animation/Animator$AnimatorConstantState;->newInstance()Ljava/lang/Object;
-HSPLandroid/animation/Animator$AnimatorListener;->onAnimationEnd(Landroid/animation/Animator;Z)V+]Landroid/animation/Animator$AnimatorListener;missing_types
-HSPLandroid/animation/Animator$AnimatorListener;->onAnimationStart(Landroid/animation/Animator;Z)V+]Landroid/animation/Animator$AnimatorListener;missing_types
-HSPLandroid/animation/Animator;-><init>()V
-HSPLandroid/animation/Animator;->addListener(Landroid/animation/Animator$AnimatorListener;)V
-HSPLandroid/animation/Animator;->addPauseListener(Landroid/animation/Animator$AnimatorPauseListener;)V
-HSPLandroid/animation/Animator;->appendChangingConfigurations(I)V
-HSPLandroid/animation/Animator;->callOnList(Ljava/util/ArrayList;Landroid/animation/Animator$AnimatorCaller;Ljava/lang/Object;Z)V+]Landroid/animation/Animator$AnimatorCaller;Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda1;,Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda0;,Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda6;,Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda2;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference;
-HSPLandroid/animation/Animator;->clone()Landroid/animation/Animator;
-HSPLandroid/animation/Animator;->createConstantState()Landroid/content/res/ConstantState;
-HSPLandroid/animation/Animator;->getBackgroundPauseDelay()J
-HSPLandroid/animation/Animator;->getChangingConfigurations()I
-HSPLandroid/animation/Animator;->getListeners()Ljava/util/ArrayList;
-HSPLandroid/animation/Animator;->getStartAndEndTimes(Landroid/util/LongArray;J)V
-HSPLandroid/animation/Animator;->notifyEndListeners(Z)V
-HSPLandroid/animation/Animator;->notifyListeners(Landroid/animation/Animator$AnimatorCaller;Z)V
-HSPLandroid/animation/Animator;->notifyStartListeners(Z)V
-HSPLandroid/animation/Animator;->pause()V
-HSPLandroid/animation/Animator;->removeAllListeners()V
-HSPLandroid/animation/Animator;->removeListener(Landroid/animation/Animator$AnimatorListener;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/animation/Animator;->setAllowRunningAsynchronously(Z)V
-HSPLandroid/animation/AnimatorInflater$PathDataEvaluator;->evaluate(FLandroid/util/PathParser$PathData;Landroid/util/PathParser$PathData;)Landroid/util/PathParser$PathData;
-HSPLandroid/animation/AnimatorInflater$PathDataEvaluator;->evaluate(FLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/animation/AnimatorInflater;->createAnimatorFromXml(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Lorg/xmlpull/v1/XmlPullParser;F)Landroid/animation/Animator;
-HSPLandroid/animation/AnimatorInflater;->createAnimatorFromXml(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/animation/AnimatorSet;IF)Landroid/animation/Animator;
-HSPLandroid/animation/AnimatorInflater;->createStateListAnimatorFromXml(Landroid/content/Context;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Landroid/animation/StateListAnimator;
-HSPLandroid/animation/AnimatorInflater;->getChangingConfigs(Landroid/content/res/Resources;I)I
-HSPLandroid/animation/AnimatorInflater;->getPVH(Landroid/content/res/TypedArray;IIILjava/lang/String;)Landroid/animation/PropertyValuesHolder;
-HSPLandroid/animation/AnimatorInflater;->inferValueTypeFromValues(Landroid/content/res/TypedArray;II)I
-HSPLandroid/animation/AnimatorInflater;->loadAnimator(Landroid/content/Context;I)Landroid/animation/Animator;
-HSPLandroid/animation/AnimatorInflater;->loadAnimator(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;IF)Landroid/animation/Animator;
-HSPLandroid/animation/AnimatorInflater;->loadAnimator(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;Landroid/animation/ValueAnimator;F)Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorInflater;->loadObjectAnimator(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;F)Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/AnimatorInflater;->loadStateListAnimator(Landroid/content/Context;I)Landroid/animation/StateListAnimator;
-HSPLandroid/animation/AnimatorInflater;->parseAnimatorFromTypeArray(Landroid/animation/ValueAnimator;Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;F)V
-HSPLandroid/animation/AnimatorInflater;->setupObjectAnimator(Landroid/animation/ValueAnimator;Landroid/content/res/TypedArray;IF)V
-HSPLandroid/animation/AnimatorListenerAdapter;-><init>()V
-HSPLandroid/animation/AnimatorListenerAdapter;->onAnimationCancel(Landroid/animation/Animator;)V
-HSPLandroid/animation/AnimatorListenerAdapter;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/animation/AnimatorListenerAdapter;->onAnimationStart(Landroid/animation/Animator;)V
-HSPLandroid/animation/AnimatorSet$1;-><init>(Landroid/animation/AnimatorSet;)V
-HSPLandroid/animation/AnimatorSet$1;->onAnimationEnd(Landroid/animation/Animator;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLandroid/animation/AnimatorSet$2;-><init>(Landroid/animation/AnimatorSet;Landroid/animation/AnimatorSet;)V
-HSPLandroid/animation/AnimatorSet$2;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/animation/AnimatorSet$3;-><init>(Landroid/animation/AnimatorSet;)V
-HSPLandroid/animation/AnimatorSet$3;->compare(Landroid/animation/AnimatorSet$AnimationEvent;Landroid/animation/AnimatorSet$AnimationEvent;)I+]Landroid/animation/AnimatorSet$AnimationEvent;Landroid/animation/AnimatorSet$AnimationEvent;
-HSPLandroid/animation/AnimatorSet$3;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/animation/AnimatorSet$AnimationEvent;-><init>(Landroid/animation/AnimatorSet$Node;I)V
-HSPLandroid/animation/AnimatorSet$AnimationEvent;->getTime()J+]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/AnimatorSet$Builder;-><init>(Landroid/animation/AnimatorSet;Landroid/animation/Animator;)V
-HSPLandroid/animation/AnimatorSet$Builder;->after(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;
-HSPLandroid/animation/AnimatorSet$Builder;->before(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;
-HSPLandroid/animation/AnimatorSet$Builder;->with(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;
-HSPLandroid/animation/AnimatorSet$Node;-><init>(Landroid/animation/Animator;)V
-HSPLandroid/animation/AnimatorSet$Node;->addChild(Landroid/animation/AnimatorSet$Node;)V
-HSPLandroid/animation/AnimatorSet$Node;->addParent(Landroid/animation/AnimatorSet$Node;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/AnimatorSet$Node;Landroid/animation/AnimatorSet$Node;
-HSPLandroid/animation/AnimatorSet$Node;->addParents(Ljava/util/ArrayList;)V
-HSPLandroid/animation/AnimatorSet$Node;->addSibling(Landroid/animation/AnimatorSet$Node;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/AnimatorSet$Node;Landroid/animation/AnimatorSet$Node;
-HSPLandroid/animation/AnimatorSet$Node;->clone()Landroid/animation/AnimatorSet$Node;+]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorSet$SeekState;-><init>(Landroid/animation/AnimatorSet;)V
-HSPLandroid/animation/AnimatorSet$SeekState;->getPlayTimeNormalized()J
-HSPLandroid/animation/AnimatorSet$SeekState;->isActive()Z
-HSPLandroid/animation/AnimatorSet$SeekState;->reset()V
-HSPLandroid/animation/AnimatorSet;-><init>()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorSet;->addAnimationCallback(J)V
-HSPLandroid/animation/AnimatorSet;->addAnimationEndListener()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorSet;->cancel()V
-HSPLandroid/animation/AnimatorSet;->clone()Landroid/animation/Animator;
-HSPLandroid/animation/AnimatorSet;->clone()Landroid/animation/AnimatorSet;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/AnimatorSet$Node;Landroid/animation/AnimatorSet$Node;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/AnimatorSet;,Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorSet;->createDependencyGraph()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/AnimatorSet$AnimationEvent;Landroid/animation/AnimatorSet$AnimationEvent;]Landroid/animation/AnimatorSet$Node;Landroid/animation/AnimatorSet$Node;]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/AnimatorSet;,Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorSet;->doAnimationFrame(J)Z+]Landroid/animation/AnimatorSet$SeekState;Landroid/animation/AnimatorSet$SeekState;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/animation/AnimatorSet;->end()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/animation/AnimatorSet;Landroid/animation/AnimatorSet;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/AnimatorSet;->endAnimation()V+]Landroid/animation/AnimatorSet;Landroid/animation/AnimatorSet;]Landroid/animation/AnimatorSet$SeekState;Landroid/animation/AnimatorSet$SeekState;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/animation/AnimatorSet;->ensureChildStartAndEndTimes()[J
-HSPLandroid/animation/AnimatorSet;->findLatestEventIdForTime(J)I
-HSPLandroid/animation/AnimatorSet;->findNextIndex(J[J)I
-HSPLandroid/animation/AnimatorSet;->findSiblings(Landroid/animation/AnimatorSet$Node;Ljava/util/ArrayList;)V
-HSPLandroid/animation/AnimatorSet;->getChangingConfigurations()I
-HSPLandroid/animation/AnimatorSet;->getChildAnimations()Ljava/util/ArrayList;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/animation/AnimatorSet;->getNodeForAnimation(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Node;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/animation/AnimatorSet;->getStartAndEndTimes(Landroid/util/LongArray;J)V
-HSPLandroid/animation/AnimatorSet;->getStartDelay()J
-HSPLandroid/animation/AnimatorSet;->getTotalDuration()J
-HSPLandroid/animation/AnimatorSet;->handleAnimationEvents(IIJ)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorSet;->initAnimation()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorSet;->initChildren()V
-HSPLandroid/animation/AnimatorSet;->isEmptySet(Landroid/animation/AnimatorSet;)Z+]Landroid/animation/AnimatorSet;Landroid/animation/AnimatorSet;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/animation/AnimatorSet;->isInitialized()Z+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorSet;->isRunning()Z
-HSPLandroid/animation/AnimatorSet;->isStarted()Z
-HSPLandroid/animation/AnimatorSet;->play(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;
-HSPLandroid/animation/AnimatorSet;->playSequentially([Landroid/animation/Animator;)V
-HSPLandroid/animation/AnimatorSet;->playTogether(Ljava/util/Collection;)V
-HSPLandroid/animation/AnimatorSet;->playTogether([Landroid/animation/Animator;)V
-HSPLandroid/animation/AnimatorSet;->pulseAnimationFrame(J)Z
-HSPLandroid/animation/AnimatorSet;->pulseFrame(Landroid/animation/AnimatorSet$Node;J)V
-HSPLandroid/animation/AnimatorSet;->removeAnimationCallback()V
-HSPLandroid/animation/AnimatorSet;->removeAnimationEndListener()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorSet;->setDuration(J)Landroid/animation/Animator;
-HSPLandroid/animation/AnimatorSet;->setDuration(J)Landroid/animation/AnimatorSet;
-HSPLandroid/animation/AnimatorSet;->setInterpolator(Landroid/animation/TimeInterpolator;)V
-HSPLandroid/animation/AnimatorSet;->setStartDelay(J)V
-HSPLandroid/animation/AnimatorSet;->setTarget(Ljava/lang/Object;)V+]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/animation/AnimatorSet;->shouldPlayTogether()Z
-HSPLandroid/animation/AnimatorSet;->skipToEndValue(Z)V
-HSPLandroid/animation/AnimatorSet;->sortAnimationEvents()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/AnimatorSet;,Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorSet;->start()V
-HSPLandroid/animation/AnimatorSet;->start(ZZ)V+]Landroid/animation/AnimatorSet;Landroid/animation/AnimatorSet;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorSet;->startAnimation()V+]Landroid/animation/AnimatorSet;Landroid/animation/AnimatorSet;]Landroid/animation/AnimatorSet$SeekState;Landroid/animation/AnimatorSet$SeekState;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorSet;->startWithoutPulsing(Z)V
-HSPLandroid/animation/AnimatorSet;->updateAnimatorsDuration()V+]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;
-HSPLandroid/animation/AnimatorSet;->updatePlayTime(Landroid/animation/AnimatorSet$Node;Ljava/util/ArrayList;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/AnimatorSet;,Landroid/animation/ValueAnimator;
-HSPLandroid/animation/ArgbEvaluator;-><init>()V
-HSPLandroid/animation/ArgbEvaluator;->evaluate(FLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/animation/ArgbEvaluator;->getInstance()Landroid/animation/ArgbEvaluator;
-HSPLandroid/animation/FloatKeyframeSet;-><init>([Landroid/animation/Keyframe$FloatKeyframe;)V
-HSPLandroid/animation/FloatKeyframeSet;->clone()Landroid/animation/FloatKeyframeSet;
-HSPLandroid/animation/FloatKeyframeSet;->clone()Landroid/animation/Keyframes;
-HSPLandroid/animation/FloatKeyframeSet;->getFloatValue(F)F+]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Landroid/animation/Keyframe$FloatKeyframe;Landroid/animation/Keyframe$FloatKeyframe;
-HSPLandroid/animation/FloatKeyframeSet;->getValue(F)Ljava/lang/Object;
-HSPLandroid/animation/IntKeyframeSet;-><init>([Landroid/animation/Keyframe$IntKeyframe;)V
-HSPLandroid/animation/IntKeyframeSet;->clone()Landroid/animation/IntKeyframeSet;+]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Landroid/animation/Keyframe;Landroid/animation/Keyframe$IntKeyframe;
-HSPLandroid/animation/IntKeyframeSet;->clone()Landroid/animation/Keyframes;
-HSPLandroid/animation/IntKeyframeSet;->getIntValue(F)I
-HSPLandroid/animation/Keyframe$FloatKeyframe;-><init>(F)V
-HSPLandroid/animation/Keyframe$FloatKeyframe;-><init>(FF)V
-HSPLandroid/animation/Keyframe$FloatKeyframe;->clone()Landroid/animation/Keyframe$FloatKeyframe;+]Landroid/animation/Keyframe$FloatKeyframe;Landroid/animation/Keyframe$FloatKeyframe;
-HSPLandroid/animation/Keyframe$FloatKeyframe;->clone()Landroid/animation/Keyframe;
-HSPLandroid/animation/Keyframe$FloatKeyframe;->getFloatValue()F
-HSPLandroid/animation/Keyframe$FloatKeyframe;->getValue()Ljava/lang/Object;
-HSPLandroid/animation/Keyframe$FloatKeyframe;->setValue(Ljava/lang/Object;)V+]Ljava/lang/Object;Ljava/lang/Float;]Ljava/lang/Float;Ljava/lang/Float;
-HSPLandroid/animation/Keyframe$IntKeyframe;-><init>(FI)V
-HSPLandroid/animation/Keyframe$IntKeyframe;->clone()Landroid/animation/Keyframe$IntKeyframe;
-HSPLandroid/animation/Keyframe$IntKeyframe;->clone()Landroid/animation/Keyframe;
-HSPLandroid/animation/Keyframe$IntKeyframe;->getIntValue()I
-HSPLandroid/animation/Keyframe$IntKeyframe;->getValue()Ljava/lang/Object;
-HSPLandroid/animation/Keyframe$IntKeyframe;->setValue(Ljava/lang/Object;)V
-HSPLandroid/animation/Keyframe$ObjectKeyframe;-><init>(FLjava/lang/Object;)V
-HSPLandroid/animation/Keyframe$ObjectKeyframe;->clone()Landroid/animation/Keyframe$ObjectKeyframe;
-HSPLandroid/animation/Keyframe$ObjectKeyframe;->clone()Landroid/animation/Keyframe;
-HSPLandroid/animation/Keyframe$ObjectKeyframe;->getValue()Ljava/lang/Object;
-HSPLandroid/animation/Keyframe;-><init>()V
-HSPLandroid/animation/Keyframe;->getFraction()F
-HSPLandroid/animation/Keyframe;->getInterpolator()Landroid/animation/TimeInterpolator;
-HSPLandroid/animation/Keyframe;->hasValue()Z
-HSPLandroid/animation/Keyframe;->ofFloat(F)Landroid/animation/Keyframe;
-HSPLandroid/animation/Keyframe;->ofFloat(FF)Landroid/animation/Keyframe;
-HSPLandroid/animation/Keyframe;->ofInt(FI)Landroid/animation/Keyframe;
-HSPLandroid/animation/Keyframe;->ofObject(FLjava/lang/Object;)Landroid/animation/Keyframe;
-HSPLandroid/animation/Keyframe;->setInterpolator(Landroid/animation/TimeInterpolator;)V
-HSPLandroid/animation/Keyframe;->setValueWasSetOnStart(Z)V
-HSPLandroid/animation/Keyframe;->valueWasSetOnStart()Z
-HSPLandroid/animation/KeyframeSet;-><init>([Landroid/animation/Keyframe;)V+]Landroid/animation/Keyframe;Landroid/animation/Keyframe$ObjectKeyframe;,Landroid/animation/Keyframe$IntKeyframe;,Landroid/animation/Keyframe$FloatKeyframe;
-HSPLandroid/animation/KeyframeSet;->clone()Landroid/animation/KeyframeSet;
-HSPLandroid/animation/KeyframeSet;->clone()Landroid/animation/Keyframes;
-HSPLandroid/animation/KeyframeSet;->getKeyframes()Ljava/util/List;
-HSPLandroid/animation/KeyframeSet;->getValue(F)Ljava/lang/Object;+]Landroid/animation/Keyframe;Landroid/animation/Keyframe$ObjectKeyframe;
-HSPLandroid/animation/KeyframeSet;->ofFloat([F)Landroid/animation/KeyframeSet;
-HSPLandroid/animation/KeyframeSet;->ofInt([I)Landroid/animation/KeyframeSet;
-HSPLandroid/animation/KeyframeSet;->ofObject([Ljava/lang/Object;)Landroid/animation/KeyframeSet;
-HSPLandroid/animation/KeyframeSet;->setEvaluator(Landroid/animation/TypeEvaluator;)V
-HSPLandroid/animation/LayoutTransition$1;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/animation/LayoutTransition$2;->onLayoutChange(Landroid/view/View;IIIIIIII)V
-HSPLandroid/animation/LayoutTransition$3;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/animation/LayoutTransition$3;->onAnimationStart(Landroid/animation/Animator;)V
-HSPLandroid/animation/LayoutTransition$4;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/animation/LayoutTransition$5;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/animation/LayoutTransition$CleanupCallback;->cleanup()V
-HSPLandroid/animation/LayoutTransition$CleanupCallback;->onPreDraw()Z
-HSPLandroid/animation/LayoutTransition;-><init>()V
-HSPLandroid/animation/LayoutTransition;->addChild(Landroid/view/ViewGroup;Landroid/view/View;)V
-HSPLandroid/animation/LayoutTransition;->addChild(Landroid/view/ViewGroup;Landroid/view/View;Z)V
-HSPLandroid/animation/LayoutTransition;->addTransitionListener(Landroid/animation/LayoutTransition$TransitionListener;)V
-HSPLandroid/animation/LayoutTransition;->cancel()V
-HSPLandroid/animation/LayoutTransition;->cancel(I)V
-HSPLandroid/animation/LayoutTransition;->disableTransitionType(I)V
-HSPLandroid/animation/LayoutTransition;->hideChild(Landroid/view/ViewGroup;Landroid/view/View;I)V
-HSPLandroid/animation/LayoutTransition;->isChangingLayout()Z
-HSPLandroid/animation/LayoutTransition;->layoutChange(Landroid/view/ViewGroup;)V
-HSPLandroid/animation/LayoutTransition;->removeChild(Landroid/view/ViewGroup;Landroid/view/View;)V
-HSPLandroid/animation/LayoutTransition;->removeChild(Landroid/view/ViewGroup;Landroid/view/View;Z)V
-HSPLandroid/animation/LayoutTransition;->removeTransitionListener(Landroid/animation/LayoutTransition$TransitionListener;)V
-HSPLandroid/animation/LayoutTransition;->runAppearingTransition(Landroid/view/ViewGroup;Landroid/view/View;)V
-HSPLandroid/animation/LayoutTransition;->runChangeTransition(Landroid/view/ViewGroup;Landroid/view/View;I)V
-HSPLandroid/animation/LayoutTransition;->runDisappearingTransition(Landroid/view/ViewGroup;Landroid/view/View;)V
-HSPLandroid/animation/LayoutTransition;->setAnimateParentHierarchy(Z)V
-HSPLandroid/animation/LayoutTransition;->setAnimator(ILandroid/animation/Animator;)V
-HSPLandroid/animation/LayoutTransition;->setDuration(J)V
-HSPLandroid/animation/LayoutTransition;->setInterpolator(ILandroid/animation/TimeInterpolator;)V
-HSPLandroid/animation/LayoutTransition;->setStartDelay(IJ)V
-HSPLandroid/animation/LayoutTransition;->setupChangeAnimation(Landroid/view/ViewGroup;ILandroid/animation/Animator;JLandroid/view/View;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/view/View;missing_types]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/LayoutTransition;->showChild(Landroid/view/ViewGroup;Landroid/view/View;I)V
-HSPLandroid/animation/LayoutTransition;->startChangingAnimations()V
-HSPLandroid/animation/ObjectAnimator;-><init>()V
-HSPLandroid/animation/ObjectAnimator;-><init>(Ljava/lang/Object;Landroid/util/Property;)V
-HSPLandroid/animation/ObjectAnimator;-><init>(Ljava/lang/Object;Ljava/lang/String;)V
-HSPLandroid/animation/ObjectAnimator;->animateValue(F)V+]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator;]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder;
-HSPLandroid/animation/ObjectAnimator;->clone()Landroid/animation/Animator;
-HSPLandroid/animation/ObjectAnimator;->clone()Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ObjectAnimator;->getNameForTrace()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ObjectAnimator;->getPropertyName()Ljava/lang/String;+]Landroid/util/Property;missing_types
-HSPLandroid/animation/ObjectAnimator;->getTarget()Ljava/lang/Object;
-HSPLandroid/animation/ObjectAnimator;->hasSameTargetAndProperties(Landroid/animation/Animator;)Z
-HSPLandroid/animation/ObjectAnimator;->initAnimation()V+]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator;]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder;
-HSPLandroid/animation/ObjectAnimator;->isInitialized()Z
-HSPLandroid/animation/ObjectAnimator;->ofFloat(Ljava/lang/Object;Landroid/util/Property;[F)Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ObjectAnimator;->ofFloat(Ljava/lang/Object;Ljava/lang/String;[F)Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ObjectAnimator;->ofInt(Ljava/lang/Object;Landroid/util/Property;[I)Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ObjectAnimator;->ofInt(Ljava/lang/Object;Ljava/lang/String;[I)Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ObjectAnimator;->ofObject(Ljava/lang/Object;Landroid/util/Property;Landroid/animation/TypeConverter;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ObjectAnimator;->ofObject(Ljava/lang/Object;Landroid/util/Property;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ObjectAnimator;->ofPropertyValuesHolder(Ljava/lang/Object;[Landroid/animation/PropertyValuesHolder;)Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ObjectAnimator;->setAutoCancel(Z)V
-HSPLandroid/animation/ObjectAnimator;->setDuration(J)Landroid/animation/Animator;
-HSPLandroid/animation/ObjectAnimator;->setDuration(J)Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ObjectAnimator;->setDuration(J)Landroid/animation/ValueAnimator;
-HSPLandroid/animation/ObjectAnimator;->setFloatValues([F)V+]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ObjectAnimator;->setIntValues([I)V
-HSPLandroid/animation/ObjectAnimator;->setObjectValues([Ljava/lang/Object;)V
-HSPLandroid/animation/ObjectAnimator;->setProperty(Landroid/util/Property;)V
-HSPLandroid/animation/ObjectAnimator;->setPropertyName(Ljava/lang/String;)V
-HSPLandroid/animation/ObjectAnimator;->setTarget(Ljava/lang/Object;)V+]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ObjectAnimator;->setupEndValues()V
-HSPLandroid/animation/ObjectAnimator;->setupStartValues()V
-HSPLandroid/animation/ObjectAnimator;->shouldAutoCancel(Landroid/animation/AnimationHandler$AnimationFrameCallback;)Z
-HSPLandroid/animation/ObjectAnimator;->start()V
-HSPLandroid/animation/PathKeyframes$1;->getFloatValue(F)F
-HSPLandroid/animation/PathKeyframes$2;->getFloatValue(F)F
-HSPLandroid/animation/PathKeyframes$FloatKeyframesBase;->getValue(F)Ljava/lang/Object;
-HSPLandroid/animation/PathKeyframes$SimpleKeyframes;->clone()Landroid/animation/Keyframes;
-HSPLandroid/animation/PathKeyframes;-><init>(Landroid/graphics/Path;F)V
-HSPLandroid/animation/PathKeyframes;->getKeyframes()Ljava/util/ArrayList;
-HSPLandroid/animation/PathKeyframes;->getKeyframes()Ljava/util/List;
-HSPLandroid/animation/PathKeyframes;->getValue(F)Ljava/lang/Object;
-HSPLandroid/animation/PathKeyframes;->interpolateInRange(FII)Landroid/graphics/PointF;
-HSPLandroid/animation/PropertyValuesHolder$1;->getValueAtFraction(F)Ljava/lang/Object;
-HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;-><init>(Landroid/util/Property;[F)V
-HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;-><init>(Ljava/lang/String;[F)V
-HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->calculateValue(F)V+]Landroid/animation/Keyframes$FloatKeyframes;Landroid/animation/FloatKeyframeSet;
-HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->clone()Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;
-HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->clone()Landroid/animation/PropertyValuesHolder;
-HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->getAnimatedValue()Ljava/lang/Object;
-HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->setAnimatedValue(Ljava/lang/Object;)V+]Landroid/util/FloatProperty;Landroid/view/View$2;,Landroid/view/View$12;,Landroid/view/View$13;,Landroid/view/View$5;
-HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->setFloatValues([F)V
-HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->setProperty(Landroid/util/Property;)V
-HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->setupSetter(Ljava/lang/Class;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/Long;Ljava/lang/Long;
-HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;-><init>(Ljava/lang/String;[I)V
-HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->calculateValue(F)V+]Landroid/animation/Keyframes$IntKeyframes;Landroid/animation/IntKeyframeSet;
-HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->clone()Landroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;
-HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->clone()Landroid/animation/PropertyValuesHolder;
-HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->getAnimatedValue()Ljava/lang/Object;
-HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->setAnimatedValue(Ljava/lang/Object;)V
-HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->setIntValues([I)V
-HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->setupSetter(Ljava/lang/Class;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/Long;Ljava/lang/Long;
-HSPLandroid/animation/PropertyValuesHolder$PropertyValues;-><init>()V
-HSPLandroid/animation/PropertyValuesHolder;-><init>(Landroid/util/Property;)V+]Landroid/util/Property;missing_types
-HSPLandroid/animation/PropertyValuesHolder;-><init>(Ljava/lang/String;)V
-HSPLandroid/animation/PropertyValuesHolder;-><init>(Ljava/lang/String;Landroid/animation/PropertyValuesHolder-IA;)V
-HSPLandroid/animation/PropertyValuesHolder;->calculateValue(F)V+]Landroid/animation/Keyframes;Landroid/animation/KeyframeSet;
-HSPLandroid/animation/PropertyValuesHolder;->clone()Landroid/animation/PropertyValuesHolder;+]Landroid/animation/Keyframes;Landroid/animation/KeyframeSet;,Landroid/animation/IntKeyframeSet;,Landroid/animation/FloatKeyframeSet;
-HSPLandroid/animation/PropertyValuesHolder;->convertBack(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/animation/PropertyValuesHolder;->getAnimatedValue()Ljava/lang/Object;
-HSPLandroid/animation/PropertyValuesHolder;->getMethodName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/animation/PropertyValuesHolder;->getPropertyFunction(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/reflect/Method;
-HSPLandroid/animation/PropertyValuesHolder;->getPropertyName()Ljava/lang/String;
-HSPLandroid/animation/PropertyValuesHolder;->getPropertyValues(Landroid/animation/PropertyValuesHolder$PropertyValues;)V
-HSPLandroid/animation/PropertyValuesHolder;->getValueType()Ljava/lang/Class;
-HSPLandroid/animation/PropertyValuesHolder;->init()V
-HSPLandroid/animation/PropertyValuesHolder;->ofFloat(Landroid/util/Property;[F)Landroid/animation/PropertyValuesHolder;
-HSPLandroid/animation/PropertyValuesHolder;->ofFloat(Ljava/lang/String;[F)Landroid/animation/PropertyValuesHolder;
-HSPLandroid/animation/PropertyValuesHolder;->ofInt(Ljava/lang/String;[I)Landroid/animation/PropertyValuesHolder;
-HSPLandroid/animation/PropertyValuesHolder;->ofKeyframes(Ljava/lang/String;Landroid/animation/Keyframes;)Landroid/animation/PropertyValuesHolder;
-HSPLandroid/animation/PropertyValuesHolder;->ofObject(Ljava/lang/String;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;
-HSPLandroid/animation/PropertyValuesHolder;->setAnimatedValue(Ljava/lang/Object;)V+]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder;
-HSPLandroid/animation/PropertyValuesHolder;->setEvaluator(Landroid/animation/TypeEvaluator;)V
-HSPLandroid/animation/PropertyValuesHolder;->setFloatValues([F)V
-HSPLandroid/animation/PropertyValuesHolder;->setIntValues([I)V
-HSPLandroid/animation/PropertyValuesHolder;->setObjectValues([Ljava/lang/Object;)V
-HSPLandroid/animation/PropertyValuesHolder;->setProperty(Landroid/util/Property;)V
-HSPLandroid/animation/PropertyValuesHolder;->setPropertyName(Ljava/lang/String;)V
-HSPLandroid/animation/PropertyValuesHolder;->setupEndValue(Ljava/lang/Object;)V
-HSPLandroid/animation/PropertyValuesHolder;->setupGetter(Ljava/lang/Class;)V
-HSPLandroid/animation/PropertyValuesHolder;->setupSetterAndGetter(Ljava/lang/Object;)V+]Ljava/lang/Object;missing_types]Landroid/animation/Keyframes;Landroid/animation/IntKeyframeSet;,Landroid/animation/FloatKeyframeSet;,Landroid/animation/KeyframeSet;]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Landroid/animation/Keyframe;Landroid/animation/Keyframe$IntKeyframe;,Landroid/animation/Keyframe$FloatKeyframe;,Landroid/animation/Keyframe$ObjectKeyframe;]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;]Landroid/util/Property;missing_types]Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;
-HSPLandroid/animation/PropertyValuesHolder;->setupSetterOrGetter(Ljava/lang/Class;Ljava/util/HashMap;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/reflect/Method;
-HSPLandroid/animation/PropertyValuesHolder;->setupStartValue(Ljava/lang/Object;)V
-HSPLandroid/animation/PropertyValuesHolder;->setupValue(Ljava/lang/Object;Landroid/animation/Keyframe;)V+]Ljava/lang/Object;missing_types]Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;]Landroid/animation/Keyframe;Landroid/animation/Keyframe$IntKeyframe;
-HSPLandroid/animation/StateListAnimator$1;-><init>(Landroid/animation/StateListAnimator;)V
-HSPLandroid/animation/StateListAnimator$1;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/animation/StateListAnimator$StateListAnimatorConstantState;-><init>(Landroid/animation/StateListAnimator;)V
-HSPLandroid/animation/StateListAnimator$StateListAnimatorConstantState;->newInstance()Landroid/animation/StateListAnimator;
-HSPLandroid/animation/StateListAnimator$StateListAnimatorConstantState;->newInstance()Ljava/lang/Object;
-HSPLandroid/animation/StateListAnimator$Tuple;-><init>([ILandroid/animation/Animator;)V
-HSPLandroid/animation/StateListAnimator;-><init>()V
-HSPLandroid/animation/StateListAnimator;->addState([ILandroid/animation/Animator;)V
-HSPLandroid/animation/StateListAnimator;->appendChangingConfigurations(I)V
-HSPLandroid/animation/StateListAnimator;->clearTarget()V
-HSPLandroid/animation/StateListAnimator;->clone()Landroid/animation/StateListAnimator;
-HSPLandroid/animation/StateListAnimator;->createConstantState()Landroid/content/res/ConstantState;
-HSPLandroid/animation/StateListAnimator;->getChangingConfigurations()I
-HSPLandroid/animation/StateListAnimator;->getTarget()Landroid/view/View;
-HSPLandroid/animation/StateListAnimator;->initAnimatorListener()V
-HSPLandroid/animation/StateListAnimator;->jumpToCurrentState()V
-HSPLandroid/animation/StateListAnimator;->setChangingConfigurations(I)V
-HSPLandroid/animation/StateListAnimator;->setState([I)V
-HSPLandroid/animation/StateListAnimator;->setTarget(Landroid/view/View;)V
-HSPLandroid/animation/StateListAnimator;->start(Landroid/animation/StateListAnimator$Tuple;)V
-HSPLandroid/animation/TimeAnimator;-><init>()V
-HSPLandroid/animation/TimeAnimator;->setTimeListener(Landroid/animation/TimeAnimator$TimeListener;)V
-HSPLandroid/animation/ValueAnimator;-><init>()V
-HSPLandroid/animation/ValueAnimator;->addAnimationCallback(J)V
-HSPLandroid/animation/ValueAnimator;->addUpdateListener(Landroid/animation/ValueAnimator$AnimatorUpdateListener;)V
-HSPLandroid/animation/ValueAnimator;->animateBasedOnTime(J)Z+]Landroid/animation/ValueAnimator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator;
-HSPLandroid/animation/ValueAnimator;->animateValue(F)V+]Landroid/animation/TimeInterpolator;missing_types]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder;]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;,Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ValueAnimator;->areAnimatorsEnabled()Z
-HSPLandroid/animation/ValueAnimator;->cancel()V
-HSPLandroid/animation/ValueAnimator;->clampFraction(F)F
-HSPLandroid/animation/ValueAnimator;->clone()Landroid/animation/Animator;
-HSPLandroid/animation/ValueAnimator;->clone()Landroid/animation/ValueAnimator;+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder;
-HSPLandroid/animation/ValueAnimator;->doAnimationFrame(J)Z+]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;,Landroid/animation/ObjectAnimator;
-HSPLandroid/animation/ValueAnimator;->end()V
-HSPLandroid/animation/ValueAnimator;->endAnimation()V
-HSPLandroid/animation/ValueAnimator;->getAnimatedFraction()F
-HSPLandroid/animation/ValueAnimator;->getAnimatedValue()Ljava/lang/Object;+]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;
-HSPLandroid/animation/ValueAnimator;->getAnimationHandler()Landroid/animation/AnimationHandler;
-HSPLandroid/animation/ValueAnimator;->getCurrentAnimationsCount()I
-HSPLandroid/animation/ValueAnimator;->getCurrentIteration(F)I
-HSPLandroid/animation/ValueAnimator;->getCurrentIterationFraction(FZ)F
-HSPLandroid/animation/ValueAnimator;->getCurrentPlayTime()J
-HSPLandroid/animation/ValueAnimator;->getDuration()J
-HSPLandroid/animation/ValueAnimator;->getDurationScale()F
-HSPLandroid/animation/ValueAnimator;->getInterpolator()Landroid/animation/TimeInterpolator;
-HSPLandroid/animation/ValueAnimator;->getNameForTrace()Ljava/lang/String;
-HSPLandroid/animation/ValueAnimator;->getRepeatCount()I
-HSPLandroid/animation/ValueAnimator;->getRepeatMode()I
-HSPLandroid/animation/ValueAnimator;->getScaledDuration()J
-HSPLandroid/animation/ValueAnimator;->getStartDelay()J
-HSPLandroid/animation/ValueAnimator;->getTotalDuration()J
-HSPLandroid/animation/ValueAnimator;->getValues()[Landroid/animation/PropertyValuesHolder;
-HSPLandroid/animation/ValueAnimator;->initAnimation()V
-HSPLandroid/animation/ValueAnimator;->isInitialized()Z
-HSPLandroid/animation/ValueAnimator;->isPulsingInternal()Z
-HSPLandroid/animation/ValueAnimator;->isRunning()Z
-HSPLandroid/animation/ValueAnimator;->isStarted()Z
-HSPLandroid/animation/ValueAnimator;->ofFloat([F)Landroid/animation/ValueAnimator;
-HSPLandroid/animation/ValueAnimator;->ofInt([I)Landroid/animation/ValueAnimator;
-HSPLandroid/animation/ValueAnimator;->ofObject(Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ValueAnimator;
-HSPLandroid/animation/ValueAnimator;->pause()V
-HSPLandroid/animation/ValueAnimator;->pulseAnimationFrame(J)Z
-HSPLandroid/animation/ValueAnimator;->removeAllUpdateListeners()V
-HSPLandroid/animation/ValueAnimator;->removeAnimationCallback()V
-HSPLandroid/animation/ValueAnimator;->resolveDurationScale()F
-HSPLandroid/animation/ValueAnimator;->setAllowRunningAsynchronously(Z)V
-HSPLandroid/animation/ValueAnimator;->setAnimationHandler(Landroid/animation/AnimationHandler;)V
-HSPLandroid/animation/ValueAnimator;->setCurrentFraction(F)V
-HSPLandroid/animation/ValueAnimator;->setCurrentPlayTime(J)V
-HSPLandroid/animation/ValueAnimator;->setDuration(J)Landroid/animation/Animator;
-HSPLandroid/animation/ValueAnimator;->setDuration(J)Landroid/animation/ValueAnimator;
-HSPLandroid/animation/ValueAnimator;->setDurationScale(F)V
-HSPLandroid/animation/ValueAnimator;->setEvaluator(Landroid/animation/TypeEvaluator;)V
-HSPLandroid/animation/ValueAnimator;->setFloatValues([F)V
-HSPLandroid/animation/ValueAnimator;->setIntValues([I)V
-HSPLandroid/animation/ValueAnimator;->setInterpolator(Landroid/animation/TimeInterpolator;)V
-HSPLandroid/animation/ValueAnimator;->setObjectValues([Ljava/lang/Object;)V
-HSPLandroid/animation/ValueAnimator;->setRepeatCount(I)V
-HSPLandroid/animation/ValueAnimator;->setRepeatMode(I)V
-HSPLandroid/animation/ValueAnimator;->setStartDelay(J)V
-HSPLandroid/animation/ValueAnimator;->setValues([Landroid/animation/PropertyValuesHolder;)V
-HSPLandroid/animation/ValueAnimator;->shouldPlayBackward(IZ)Z
-HSPLandroid/animation/ValueAnimator;->skipToEndValue(Z)V
-HSPLandroid/animation/ValueAnimator;->start()V
-HSPLandroid/animation/ValueAnimator;->start(Z)V
-HSPLandroid/animation/ValueAnimator;->startAnimation()V
-HSPLandroid/animation/ValueAnimator;->startWithoutPulsing(Z)V
-HSPLandroid/app/Activity$1;-><init>(Landroid/app/Activity;)V
-HSPLandroid/app/Activity$1;->isTaskRoot()Z
-HSPLandroid/app/Activity$1;->updateNavigationBarColor(I)V
-HSPLandroid/app/Activity$1;->updateStatusBarColor(I)V
-HSPLandroid/app/Activity$HostCallbacks;-><init>(Landroid/app/Activity;)V
-HSPLandroid/app/Activity$HostCallbacks;->onAttachFragment(Landroid/app/Fragment;)V
-HSPLandroid/app/Activity$HostCallbacks;->onGetLayoutInflater()Landroid/view/LayoutInflater;
-HSPLandroid/app/Activity$HostCallbacks;->onUseFragmentManagerInflaterFactory()Z
-HSPLandroid/app/Activity;-><init>()V
-HSPLandroid/app/Activity;->attach(Landroid/content/Context;Landroid/app/ActivityThread;Landroid/app/Instrumentation;Landroid/os/IBinder;ILandroid/app/Application;Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Ljava/lang/CharSequence;Landroid/app/Activity;Ljava/lang/String;Landroid/app/Activity$NonConfigurationInstances;Landroid/content/res/Configuration;Ljava/lang/String;Lcom/android/internal/app/IVoiceInteractor;Landroid/view/Window;Landroid/view/ViewRootImpl$ActivityConfigCallback;Landroid/os/IBinder;Landroid/os/IBinder;)V
-HSPLandroid/app/Activity;->attachBaseContext(Landroid/content/Context;)V
-HSPLandroid/app/Activity;->cancelInputsAndStartExitTransition(Landroid/os/Bundle;)V
-HSPLandroid/app/Activity;->collectActivityLifecycleCallbacks()[Ljava/lang/Object;
-HSPLandroid/app/Activity;->dispatchActivityCreated(Landroid/os/Bundle;)V
-HSPLandroid/app/Activity;->dispatchActivityPostCreated(Landroid/os/Bundle;)V
-HSPLandroid/app/Activity;->dispatchActivityPostResumed()V
-HSPLandroid/app/Activity;->dispatchActivityPostStarted()V
-HSPLandroid/app/Activity;->dispatchActivityPreCreated(Landroid/os/Bundle;)V
-HSPLandroid/app/Activity;->dispatchActivityPreResumed()V
-HSPLandroid/app/Activity;->dispatchActivityPreStarted()V
-HSPLandroid/app/Activity;->dispatchActivityResult(Ljava/lang/String;IILandroid/content/Intent;Ljava/lang/String;)V
-HSPLandroid/app/Activity;->dispatchActivityResumed()V
-HSPLandroid/app/Activity;->dispatchActivityStarted()V
-HSPLandroid/app/Activity;->dispatchEnterAnimationComplete()V
-HSPLandroid/app/Activity;->dispatchKeyEvent(Landroid/view/KeyEvent;)Z
-HSPLandroid/app/Activity;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/app/Activity;->findViewById(I)Landroid/view/View;
-HSPLandroid/app/Activity;->finish()V
-HSPLandroid/app/Activity;->finish(I)V
-HSPLandroid/app/Activity;->finishAfterTransition()V
-HSPLandroid/app/Activity;->getActivityToken()Landroid/os/IBinder;
-HSPLandroid/app/Activity;->getApplication()Landroid/app/Application;
-HSPLandroid/app/Activity;->getAutofillClient()Landroid/view/autofill/AutofillManager$AutofillClient;
-HSPLandroid/app/Activity;->getAutofillClientController()Landroid/view/autofill/AutofillClientController;
-HSPLandroid/app/Activity;->getCallingActivity()Landroid/content/ComponentName;
-HSPLandroid/app/Activity;->getComponentName()Landroid/content/ComponentName;
-HSPLandroid/app/Activity;->getContentCaptureManager()Landroid/view/contentcapture/ContentCaptureManager;
-HSPLandroid/app/Activity;->getContentCaptureTypeAsString(I)Ljava/lang/String;
-HSPLandroid/app/Activity;->getCurrentFocus()Landroid/view/View;
-HSPLandroid/app/Activity;->getFragmentManager()Landroid/app/FragmentManager;
-HSPLandroid/app/Activity;->getIntent()Landroid/content/Intent;
-HSPLandroid/app/Activity;->getLastNonConfigurationInstance()Ljava/lang/Object;
-HSPLandroid/app/Activity;->getLayoutInflater()Landroid/view/LayoutInflater;
-HSPLandroid/app/Activity;->getNextAutofillId()I
-HSPLandroid/app/Activity;->getOnBackInvokedDispatcher()Landroid/window/OnBackInvokedDispatcher;
-HSPLandroid/app/Activity;->getReferrer()Landroid/net/Uri;
-HSPLandroid/app/Activity;->getRequestedOrientation()I
-HSPLandroid/app/Activity;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroid/app/Activity;->getTaskId()I
-HSPLandroid/app/Activity;->getTitle()Ljava/lang/CharSequence;
-HSPLandroid/app/Activity;->getTitleColor()I
-HSPLandroid/app/Activity;->getVolumeControlStream()I
-HSPLandroid/app/Activity;->getWindow()Landroid/view/Window;
-HSPLandroid/app/Activity;->getWindowManager()Landroid/view/WindowManager;
-HSPLandroid/app/Activity;->initWindowDecorActionBar()V
-HSPLandroid/app/Activity;->isChangingConfigurations()Z
-HSPLandroid/app/Activity;->isChild()Z
-HSPLandroid/app/Activity;->isDestroyed()Z
-HSPLandroid/app/Activity;->isFinishing()Z
-HSPLandroid/app/Activity;->isInMultiWindowMode()Z
-HSPLandroid/app/Activity;->isResumed()Z
-HSPLandroid/app/Activity;->isTaskRoot()Z
-HSPLandroid/app/Activity;->makeVisible()V
-HSPLandroid/app/Activity;->notifyContentCaptureManagerIfNeeded(I)V
-HSPLandroid/app/Activity;->notifyVoiceInteractionManagerServiceActivityEvent(I)V
-HSPLandroid/app/Activity;->onApplyThemeResource(Landroid/content/res/Resources$Theme;IZ)V
-HSPLandroid/app/Activity;->onAttachFragment(Landroid/app/Fragment;)V
-HSPLandroid/app/Activity;->onAttachedToWindow()V
-HSPLandroid/app/Activity;->onBackPressed()V
-HSPLandroid/app/Activity;->onConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/app/Activity;->onContentChanged()V
-HSPLandroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
-HSPLandroid/app/Activity;->onCreateDescription()Ljava/lang/CharSequence;
-HSPLandroid/app/Activity;->onCreateOptionsMenu(Landroid/view/Menu;)Z
-HSPLandroid/app/Activity;->onCreatePanelMenu(ILandroid/view/Menu;)Z
-HSPLandroid/app/Activity;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroid/app/Activity;->onCreateView(Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroid/app/Activity;->onDestroy()V
-HSPLandroid/app/Activity;->onDetachedFromWindow()V
-HSPLandroid/app/Activity;->onEnterAnimationComplete()V
-HSPLandroid/app/Activity;->onKeyDown(ILandroid/view/KeyEvent;)Z
-HSPLandroid/app/Activity;->onKeyUp(ILandroid/view/KeyEvent;)Z
-HSPLandroid/app/Activity;->onLowMemory()V
-HSPLandroid/app/Activity;->onMenuItemSelected(ILandroid/view/MenuItem;)Z
-HSPLandroid/app/Activity;->onNewIntent(Landroid/content/Intent;)V
-HSPLandroid/app/Activity;->onPause()V
-HSPLandroid/app/Activity;->onPictureInPictureRequested()Z
-HSPLandroid/app/Activity;->onPostCreate(Landroid/os/Bundle;)V
-HSPLandroid/app/Activity;->onPostResume()V
-HSPLandroid/app/Activity;->onPrepareOptionsMenu(Landroid/view/Menu;)Z
-HSPLandroid/app/Activity;->onPreparePanel(ILandroid/view/View;Landroid/view/Menu;)Z
-HSPLandroid/app/Activity;->onProvideReferrer()Landroid/net/Uri;
-HSPLandroid/app/Activity;->onRestart()V
-HSPLandroid/app/Activity;->onRestoreInstanceState(Landroid/os/Bundle;)V
-HSPLandroid/app/Activity;->onResume()V
-HSPLandroid/app/Activity;->onRetainNonConfigurationChildInstances()Ljava/util/HashMap;
-HSPLandroid/app/Activity;->onSaveInstanceState(Landroid/os/Bundle;)V
-HSPLandroid/app/Activity;->onStart()V
-HSPLandroid/app/Activity;->onStateNotSaved()V
-HSPLandroid/app/Activity;->onStop()V
-HSPLandroid/app/Activity;->onTitleChanged(Ljava/lang/CharSequence;I)V
-HSPLandroid/app/Activity;->onTopResumedActivityChanged(Z)V
-HSPLandroid/app/Activity;->onTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/app/Activity;->onTrimMemory(I)V
-HSPLandroid/app/Activity;->onUserInteraction()V
-HSPLandroid/app/Activity;->onUserLeaveHint()V
-HSPLandroid/app/Activity;->onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V+]Landroid/view/View;Lcom/android/internal/policy/DecorView;]Landroid/view/WindowManager;Landroid/view/WindowManagerImpl;
-HSPLandroid/app/Activity;->onWindowFocusChanged(Z)V
-HSPLandroid/app/Activity;->overridePendingTransition(II)V
-HSPLandroid/app/Activity;->overridePendingTransition(III)V
-HSPLandroid/app/Activity;->performCreate(Landroid/os/Bundle;)V
-HSPLandroid/app/Activity;->performCreate(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V
-HSPLandroid/app/Activity;->performDestroy()V
-HSPLandroid/app/Activity;->performPause()V
-HSPLandroid/app/Activity;->performResume(ZLjava/lang/String;)V
-HSPLandroid/app/Activity;->performStart(Ljava/lang/String;)V
-HSPLandroid/app/Activity;->performStop(ZLjava/lang/String;)V
-HSPLandroid/app/Activity;->performTopResumedActivityChanged(ZLjava/lang/String;)V
-HSPLandroid/app/Activity;->registerActivityLifecycleCallbacks(Landroid/app/Application$ActivityLifecycleCallbacks;)V
-HSPLandroid/app/Activity;->registerComponentCallbacks(Landroid/content/ComponentCallbacks;)V
-HSPLandroid/app/Activity;->reportFullyDrawn()V
-HSPLandroid/app/Activity;->restoreHasCurrentPermissionRequest(Landroid/os/Bundle;)V
-HSPLandroid/app/Activity;->restoreManagedDialogs(Landroid/os/Bundle;)V
-HSPLandroid/app/Activity;->retainNonConfigurationInstances()Landroid/app/Activity$NonConfigurationInstances;
-HSPLandroid/app/Activity;->runOnUiThread(Ljava/lang/Runnable;)V
-HSPLandroid/app/Activity;->saveManagedDialogs(Landroid/os/Bundle;)V
-HSPLandroid/app/Activity;->setContentView(I)V
-HSPLandroid/app/Activity;->setContentView(Landroid/view/View;)V
-HSPLandroid/app/Activity;->setIntent(Landroid/content/Intent;)V
-HSPLandroid/app/Activity;->setRequestedOrientation(I)V
-HSPLandroid/app/Activity;->setResult(ILandroid/content/Intent;)V
-HSPLandroid/app/Activity;->setTaskDescription(Landroid/app/ActivityManager$TaskDescription;)V
-HSPLandroid/app/Activity;->setTheme(I)V
-HSPLandroid/app/Activity;->setTitle(Ljava/lang/CharSequence;)V
-HSPLandroid/app/Activity;->setVolumeControlStream(I)V
-HSPLandroid/app/Activity;->startActivity(Landroid/content/Intent;)V
-HSPLandroid/app/Activity;->startActivity(Landroid/content/Intent;Landroid/os/Bundle;)V
-HSPLandroid/app/Activity;->startActivityForResult(Landroid/content/Intent;I)V
-HSPLandroid/app/Activity;->startActivityForResult(Landroid/content/Intent;ILandroid/os/Bundle;)V
-HSPLandroid/app/Activity;->transferSpringboardActivityOptions(Landroid/os/Bundle;)Landroid/os/Bundle;
-HSPLandroid/app/Activity;->unregisterComponentCallbacks(Landroid/content/ComponentCallbacks;)V
-HSPLandroid/app/ActivityClient$1;-><init>()V
-HSPLandroid/app/ActivityClient$1;->create()Landroid/app/ActivityClient;
-HSPLandroid/app/ActivityClient$1;->create()Ljava/lang/Object;
-HSPLandroid/app/ActivityClient$ActivityClientControllerSingleton;-><init>()V
-HSPLandroid/app/ActivityClient$ActivityClientControllerSingleton;->create()Landroid/app/IActivityClientController;
-HSPLandroid/app/ActivityClient$ActivityClientControllerSingleton;->create()Ljava/lang/Object;
-HSPLandroid/app/ActivityClient;-><clinit>()V
-HSPLandroid/app/ActivityClient;-><init>()V
-HSPLandroid/app/ActivityClient;->activityDestroyed(Landroid/os/IBinder;)V
-HSPLandroid/app/ActivityClient;->activityIdle(Landroid/os/IBinder;Landroid/content/res/Configuration;Z)V
-HSPLandroid/app/ActivityClient;->activityPaused(Landroid/os/IBinder;)V
-HSPLandroid/app/ActivityClient;->activityResumed(Landroid/os/IBinder;Z)V
-HSPLandroid/app/ActivityClient;->activityStopped(Landroid/os/IBinder;Landroid/os/Bundle;Landroid/os/PersistableBundle;Ljava/lang/CharSequence;)V
-HSPLandroid/app/ActivityClient;->activityTopResumedStateLost()V
-HSPLandroid/app/ActivityClient;->finishActivity(Landroid/os/IBinder;ILandroid/content/Intent;I)Z
-HSPLandroid/app/ActivityClient;->getActivityClientController()Landroid/app/IActivityClientController;
-HSPLandroid/app/ActivityClient;->getCallingActivity(Landroid/os/IBinder;)Landroid/content/ComponentName;
-HSPLandroid/app/ActivityClient;->getDisplayId(Landroid/os/IBinder;)I
-HSPLandroid/app/ActivityClient;->getInstance()Landroid/app/ActivityClient;
-HSPLandroid/app/ActivityClient;->getTaskForActivity(Landroid/os/IBinder;Z)I
-HSPLandroid/app/ActivityClient;->overridePendingTransition(Landroid/os/IBinder;Ljava/lang/String;III)V
-HSPLandroid/app/ActivityClient;->reportActivityFullyDrawn(Landroid/os/IBinder;Z)V
-HSPLandroid/app/ActivityClient;->reportSizeConfigurations(Landroid/os/IBinder;Landroid/window/SizeConfigurationBuckets;)V
-HSPLandroid/app/ActivityClient;->setActivityClientController(Landroid/app/IActivityClientController;)Landroid/app/IActivityClientController;
-HSPLandroid/app/ActivityClient;->setRequestedOrientation(Landroid/os/IBinder;I)V
-HSPLandroid/app/ActivityClient;->setTaskDescription(Landroid/os/IBinder;Landroid/app/ActivityManager$TaskDescription;)V
-HSPLandroid/app/ActivityManager$3;->create()Landroid/app/IActivityManager;
-HSPLandroid/app/ActivityManager$3;->create()Ljava/lang/Object;
-HSPLandroid/app/ActivityManager$AppTask;->getTaskInfo()Landroid/app/ActivityManager$RecentTaskInfo;
-HSPLandroid/app/ActivityManager$MemoryInfo;-><init>()V
-HSPLandroid/app/ActivityManager$MemoryInfo;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/app/ActivityManager$PendingIntentInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ActivityManager$PendingIntentInfo;
-HSPLandroid/app/ActivityManager$PendingIntentInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/ActivityManager$PendingIntentInfo;-><init>(Ljava/lang/String;IZI)V
-HSPLandroid/app/ActivityManager$RecentTaskInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ActivityManager$RecentTaskInfo;
-HSPLandroid/app/ActivityManager$RecentTaskInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/ActivityManager$RecentTaskInfo$PersistedTaskSnapshotData;-><init>()V
-HSPLandroid/app/ActivityManager$RecentTaskInfo;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/app/ActivityManager$RunningAppProcessInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ActivityManager$RunningAppProcessInfo;
-HSPLandroid/app/ActivityManager$RunningAppProcessInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/ActivityManager$RunningAppProcessInfo;-><init>()V
-HSPLandroid/app/ActivityManager$RunningAppProcessInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/ActivityManager$RunningAppProcessInfo;-><init>(Landroid/os/Parcel;Landroid/app/ActivityManager$RunningAppProcessInfo-IA;)V
-HSPLandroid/app/ActivityManager$RunningAppProcessInfo;->importanceToProcState(I)I
-HSPLandroid/app/ActivityManager$RunningAppProcessInfo;->procStateToImportance(I)I
-HSPLandroid/app/ActivityManager$RunningAppProcessInfo;->procStateToImportanceForClient(ILandroid/content/Context;)I
-HSPLandroid/app/ActivityManager$RunningAppProcessInfo;->procStateToImportanceForTargetSdk(II)I
-HSPLandroid/app/ActivityManager$RunningAppProcessInfo;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/app/ActivityManager$RunningServiceInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ActivityManager$RunningServiceInfo;
-HSPLandroid/app/ActivityManager$RunningServiceInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/ActivityManager$RunningServiceInfo;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/app/ActivityManager$RunningTaskInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ActivityManager$RunningTaskInfo;
-HSPLandroid/app/ActivityManager$RunningTaskInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/ActivityManager$TaskDescription$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ActivityManager$TaskDescription;
-HSPLandroid/app/ActivityManager$TaskDescription$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/ActivityManager$TaskDescription;-><init>()V
-HSPLandroid/app/ActivityManager$TaskDescription;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/ActivityManager$TaskDescription;-><init>(Ljava/lang/String;Landroid/graphics/Bitmap;I)V
-HSPLandroid/app/ActivityManager$TaskDescription;->copyFromPreserveHiddenFields(Landroid/app/ActivityManager$TaskDescription;)V
-HSPLandroid/app/ActivityManager$TaskDescription;->getBackgroundColor()I
-HSPLandroid/app/ActivityManager$TaskDescription;->getIcon()Landroid/graphics/Bitmap;
-HSPLandroid/app/ActivityManager$TaskDescription;->getIconFilename()Ljava/lang/String;
-HSPLandroid/app/ActivityManager$TaskDescription;->getInMemoryIcon()Landroid/graphics/Bitmap;
-HSPLandroid/app/ActivityManager$TaskDescription;->getPrimaryColor()I
-HSPLandroid/app/ActivityManager$TaskDescription;->loadTaskDescriptionIcon(Ljava/lang/String;I)Landroid/graphics/Bitmap;
-HSPLandroid/app/ActivityManager$TaskDescription;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/app/ActivityManager$TaskDescription;->setBackgroundColor(I)V
-HSPLandroid/app/ActivityManager$TaskDescription;->setBackgroundColorFloating(I)V
-HSPLandroid/app/ActivityManager$TaskDescription;->setEnsureNavigationBarContrastWhenTransparent(Z)V
-HSPLandroid/app/ActivityManager$TaskDescription;->setEnsureStatusBarContrastWhenTransparent(Z)V
-HSPLandroid/app/ActivityManager$TaskDescription;->setIcon(Landroid/graphics/drawable/Icon;)V
-HSPLandroid/app/ActivityManager$TaskDescription;->setNavigationBarColor(I)V
-HSPLandroid/app/ActivityManager$TaskDescription;->setPrimaryColor(I)V
-HSPLandroid/app/ActivityManager$TaskDescription;->setStatusBarColor(I)V
-HSPLandroid/app/ActivityManager$TaskDescription;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/ActivityManager;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
-HSPLandroid/app/ActivityManager;->addOnUidImportanceListener(Landroid/app/ActivityManager$OnUidImportanceListener;I)V
-HSPLandroid/app/ActivityManager;->checkComponentPermission(Ljava/lang/String;IIZ)I
-HSPLandroid/app/ActivityManager;->getAppTasks()Ljava/util/List;
-HSPLandroid/app/ActivityManager;->getCurrentUser()I
-HSPLandroid/app/ActivityManager;->getDeviceConfigurationInfo()Landroid/content/pm/ConfigurationInfo;
-HSPLandroid/app/ActivityManager;->getHistoricalProcessExitReasons(Ljava/lang/String;II)Ljava/util/List;
-HSPLandroid/app/ActivityManager;->getLargeMemoryClass()I
-HSPLandroid/app/ActivityManager;->getLauncherLargeIconSizeInner(Landroid/content/Context;)I
-HSPLandroid/app/ActivityManager;->getMemoryClass()I
-HSPLandroid/app/ActivityManager;->getMemoryInfo(Landroid/app/ActivityManager$MemoryInfo;)V
-HSPLandroid/app/ActivityManager;->getMyMemoryState(Landroid/app/ActivityManager$RunningAppProcessInfo;)V
-HSPLandroid/app/ActivityManager;->getPackageImportance(Ljava/lang/String;)I
-HSPLandroid/app/ActivityManager;->getProcessMemoryInfo([I)[Landroid/os/Debug$MemoryInfo;
-HSPLandroid/app/ActivityManager;->getRunningAppProcesses()Ljava/util/List;
-HSPLandroid/app/ActivityManager;->getRunningServices(I)Ljava/util/List;
-HSPLandroid/app/ActivityManager;->getService()Landroid/app/IActivityManager;
-HSPLandroid/app/ActivityManager;->getTaskService()Landroid/app/IActivityTaskManager;
-HSPLandroid/app/ActivityManager;->handleIncomingUser(IIIZZLjava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/ActivityManager;->isBackgroundRestricted()Z
-HSPLandroid/app/ActivityManager;->isHighEndGfx()Z
-HSPLandroid/app/ActivityManager;->isLowMemoryKillReportSupported()Z
-HSPLandroid/app/ActivityManager;->isLowRamDevice()Z
-HSPLandroid/app/ActivityManager;->isLowRamDeviceStatic()Z
-HSPLandroid/app/ActivityManager;->isRunningInTestHarness()Z
-HSPLandroid/app/ActivityManager;->isRunningInUserTestHarness()Z
-HSPLandroid/app/ActivityManager;->isStartResultFatalError(I)Z
-HSPLandroid/app/ActivityManager;->isUserAMonkey()Z
-HSPLandroid/app/ActivityManager;->isUserRunning(I)Z
-HSPLandroid/app/ActivityManager;->staticGetLargeMemoryClass()I
-HSPLandroid/app/ActivityManager;->staticGetMemoryClass()I
-HSPLandroid/app/ActivityOptions$SourceInfo;-><init>(IJ)V
-HSPLandroid/app/ActivityOptions;-><init>()V
-HSPLandroid/app/ActivityOptions;-><init>(Landroid/os/Bundle;)V
-HSPLandroid/app/ActivityOptions;->fromBundle(Landroid/os/Bundle;)Landroid/app/ActivityOptions;
-HSPLandroid/app/ActivityOptions;->getAnimationType()I
-HSPLandroid/app/ActivityOptions;->makeBasic()Landroid/app/ActivityOptions;
-HSPLandroid/app/ActivityOptions;->makeRemoteAnimation(Landroid/view/RemoteAnimationAdapter;)Landroid/app/ActivityOptions;
-HSPLandroid/app/ActivityOptions;->setLaunchWindowingMode(I)V
-HSPLandroid/app/ActivityOptions;->setSourceInfo(IJ)V
-HSPLandroid/app/ActivityOptions;->toBundle()Landroid/os/Bundle;
-HSPLandroid/app/ActivityTaskManager$1;->create()Landroid/app/ActivityTaskManager;
-HSPLandroid/app/ActivityTaskManager$1;->create()Ljava/lang/Object;
-HSPLandroid/app/ActivityTaskManager$2;->create()Landroid/app/IActivityTaskManager;
-HSPLandroid/app/ActivityTaskManager$2;->create()Ljava/lang/Object;
-HSPLandroid/app/ActivityTaskManager;-><init>()V
-HSPLandroid/app/ActivityTaskManager;->getDefaultAppRecentsLimitStatic()I
-HSPLandroid/app/ActivityTaskManager;->getInstance()Landroid/app/ActivityTaskManager;
-HSPLandroid/app/ActivityTaskManager;->getService()Landroid/app/IActivityTaskManager;
-HSPLandroid/app/ActivityTaskManager;->getTasks(IZ)Ljava/util/List;
-HSPLandroid/app/ActivityTaskManager;->getTasks(IZZ)Ljava/util/List;
-HSPLandroid/app/ActivityTaskManager;->supportsMultiWindow(Landroid/content/Context;)Z
-HSPLandroid/app/ActivityThread$$ExternalSyntheticLambda1;-><init>()V
-HSPLandroid/app/ActivityThread$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/app/ActivityThread$2;-><init>(Landroid/app/ActivityThread;Landroid/app/IActivityManager;)V
-HSPLandroid/app/ActivityThread$3;-><init>(Landroid/app/ActivityThread;)V
-HSPLandroid/app/ActivityThread$3;->setContentCaptureOptions(Landroid/content/ContentCaptureOptions;)V
-HSPLandroid/app/ActivityThread$4;-><init>(Landroid/app/ActivityThread;)V
-HSPLandroid/app/ActivityThread$4;->run()V
-HSPLandroid/app/ActivityThread$ActivityClientRecord$1;-><init>(Landroid/app/ActivityThread$ActivityClientRecord;)V
-HSPLandroid/app/ActivityThread$ActivityClientRecord;->-$$Nest$misPreHoneycomb(Landroid/app/ActivityThread$ActivityClientRecord;)Z
-HSPLandroid/app/ActivityThread$ActivityClientRecord;->getLifecycleState()I
-HSPLandroid/app/ActivityThread$ActivityClientRecord;->init()V
-HSPLandroid/app/ActivityThread$ActivityClientRecord;->isPersistable()Z
-HSPLandroid/app/ActivityThread$ActivityClientRecord;->isPreHoneycomb()Z
-HSPLandroid/app/ActivityThread$ActivityClientRecord;->setState(I)V
-HSPLandroid/app/ActivityThread$AndroidOs;-><init>(Llibcore/io/Os;)V
-HSPLandroid/app/ActivityThread$AndroidOs;->access(Ljava/lang/String;I)Z
-HSPLandroid/app/ActivityThread$AndroidOs;->install()V
-HSPLandroid/app/ActivityThread$AndroidOs;->open(Ljava/lang/String;II)Ljava/io/FileDescriptor;
-HSPLandroid/app/ActivityThread$AndroidOs;->remove(Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread$AndroidOs;->rename(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread$AndroidOs;->stat(Ljava/lang/String;)Landroid/system/StructStat;
-HSPLandroid/app/ActivityThread$AppBindData;-><init>()V
-HSPLandroid/app/ActivityThread$ApplicationThread$$ExternalSyntheticLambda2;-><init>()V
-HSPLandroid/app/ActivityThread$ApplicationThread$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;-><init>(Landroid/app/ActivityThread;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;-><init>(Landroid/app/ActivityThread;Landroid/app/ActivityThread$ApplicationThread-IA;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->clearDnsCache()V
-HSPLandroid/app/ActivityThread$ApplicationThread;->dispatchPackageBroadcast(I[Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->dumpCacheInfo(Landroid/os/ParcelFileDescriptor;[Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->dumpDbInfo(Landroid/os/ParcelFileDescriptor;[Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->dumpGfxInfo(Landroid/os/ParcelFileDescriptor;[Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->dumpProvider(Landroid/os/ParcelFileDescriptor;Landroid/os/IBinder;[Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->dumpResources(Landroid/os/ParcelFileDescriptor;Landroid/os/RemoteCallback;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->dumpService(Landroid/os/ParcelFileDescriptor;Landroid/os/IBinder;[Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->notifyContentProviderPublishStatus(Landroid/app/ContentProviderHolder;Ljava/lang/String;IZ)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->requestAssistContextExtras(Landroid/os/IBinder;Landroid/os/IBinder;III)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleApplicationInfoChanged(Landroid/content/pm/ApplicationInfo;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleBindService(Landroid/os/IBinder;Landroid/content/Intent;ZIJ)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleCreateBackupAgent(Landroid/content/pm/ApplicationInfo;III)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleCreateService(Landroid/os/IBinder;Landroid/content/pm/ServiceInfo;Landroid/content/res/CompatibilityInfo;I)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleDestroyBackupAgent(Landroid/content/pm/ApplicationInfo;I)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleEnterAnimationComplete(Landroid/os/IBinder;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleInstallProvider(Landroid/content/pm/ProviderInfo;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleLowMemory()V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleReceiver(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Landroid/content/res/CompatibilityInfo;ILjava/lang/String;Landroid/os/Bundle;ZZIIILjava/lang/String;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleReceiverList(Ljava/util/List;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleRegisteredReceiver(Landroid/content/IIntentReceiver;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZZIIILjava/lang/String;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleServiceArgs(Landroid/os/IBinder;Landroid/content/pm/ParceledListSlice;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleStopService(Landroid/os/IBinder;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleTransaction(Landroid/app/servertransaction/ClientTransaction;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleTrimMemory(I)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleUnbindService(Landroid/os/IBinder;Landroid/content/Intent;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->setCoreSettings(Landroid/os/Bundle;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->setNetworkBlockSeq(J)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->setProcessState(I)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->unstableProviderDied(Landroid/os/IBinder;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->updateCompatOverrideScale(Landroid/content/res/CompatibilityInfo;)V
-HSPLandroid/app/ActivityThread$BindServiceData;-><init>()V
-HSPLandroid/app/ActivityThread$BindServiceData;->toString()Ljava/lang/String;
-HSPLandroid/app/ActivityThread$ContextCleanupInfo;-><init>()V
-HSPLandroid/app/ActivityThread$CreateBackupAgentData;-><init>()V
-HSPLandroid/app/ActivityThread$CreateServiceData;-><init>()V
-HSPLandroid/app/ActivityThread$CreateServiceData;->toString()Ljava/lang/String;
-HSPLandroid/app/ActivityThread$DumpResourcesData;-><init>()V
-HSPLandroid/app/ActivityThread$GcIdler;-><init>(Landroid/app/ActivityThread;)V
-HSPLandroid/app/ActivityThread$GcIdler;->queueIdle()Z
-HSPLandroid/app/ActivityThread$H;-><init>(Landroid/app/ActivityThread;)V
-HSPLandroid/app/ActivityThread$H;->handleMessage(Landroid/os/Message;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/app/ActivityThread;Landroid/app/ActivityThread;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;]Landroid/app/servertransaction/TransactionExecutor;Landroid/app/servertransaction/TransactionExecutor;
-HSPLandroid/app/ActivityThread$Idler;-><init>(Landroid/app/ActivityThread;)V
-HSPLandroid/app/ActivityThread$Idler;-><init>(Landroid/app/ActivityThread;Landroid/app/ActivityThread$Idler-IA;)V
-HSPLandroid/app/ActivityThread$Idler;->queueIdle()Z
-HSPLandroid/app/ActivityThread$Profiler;-><init>()V
-HSPLandroid/app/ActivityThread$ProviderKey;-><init>(Ljava/lang/String;I)V
-HSPLandroid/app/ActivityThread$ProviderKey;->equals(Ljava/lang/Object;)Z
-HSPLandroid/app/ActivityThread$ProviderKey;->hashCode()I
-HSPLandroid/app/ActivityThread$ProviderRefCount;-><init>(Landroid/app/ContentProviderHolder;Landroid/app/ActivityThread$ProviderClientRecord;II)V
-HSPLandroid/app/ActivityThread$PurgeIdler;-><init>(Landroid/app/ActivityThread;)V
-HSPLandroid/app/ActivityThread$PurgeIdler;->queueIdle()Z
-HSPLandroid/app/ActivityThread$ReceiverData;-><init>(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZZLandroid/os/IBinder;IILjava/lang/String;)V
-HSPLandroid/app/ActivityThread$RequestAssistContextExtras;-><init>()V
-HSPLandroid/app/ActivityThread$ServiceArgsData;-><init>()V
-HSPLandroid/app/ActivityThread$ServiceArgsData;->toString()Ljava/lang/String;
-HSPLandroid/app/ActivityThread;->-$$Nest$fgetmTransactionExecutor(Landroid/app/ActivityThread;)Landroid/app/servertransaction/TransactionExecutor;
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleBindApplication(Landroid/app/ActivityThread;Landroid/app/ActivityThread$AppBindData;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleBindService(Landroid/app/ActivityThread;Landroid/app/ActivityThread$BindServiceData;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleCreateBackupAgent(Landroid/app/ActivityThread;Landroid/app/ActivityThread$CreateBackupAgentData;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleCreateService(Landroid/app/ActivityThread;Landroid/app/ActivityThread$CreateServiceData;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleDestroyBackupAgent(Landroid/app/ActivityThread;Landroid/app/ActivityThread$CreateBackupAgentData;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleDumpGfxInfo(Landroid/app/ActivityThread;Landroid/app/ActivityThread$DumpComponentInfo;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleDumpProvider(Landroid/app/ActivityThread;Landroid/app/ActivityThread$DumpComponentInfo;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleDumpResources(Landroid/app/ActivityThread;Landroid/app/ActivityThread$DumpResourcesData;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleDumpService(Landroid/app/ActivityThread;Landroid/app/ActivityThread$DumpComponentInfo;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleEnterAnimationComplete(Landroid/app/ActivityThread;Landroid/os/IBinder;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleReceiver(Landroid/app/ActivityThread;Landroid/app/ActivityThread$ReceiverData;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleServiceArgs(Landroid/app/ActivityThread;Landroid/app/ActivityThread$ServiceArgsData;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleSetContentCaptureOptionsCallback(Landroid/app/ActivityThread;Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleSetCoreSettings(Landroid/app/ActivityThread;Landroid/os/Bundle;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleStopService(Landroid/app/ActivityThread;Landroid/os/IBinder;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mhandleUnbindService(Landroid/app/ActivityThread;Landroid/app/ActivityThread$BindServiceData;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$mpurgePendingResources(Landroid/app/ActivityThread;)V
-HSPLandroid/app/ActivityThread;->-$$Nest$msendMessage(Landroid/app/ActivityThread;ILjava/lang/Object;IIZ)V
-HSPLandroid/app/ActivityThread;-><init>()V
-HSPLandroid/app/ActivityThread;->acquireExistingProvider(Landroid/content/Context;Ljava/lang/String;IZ)Landroid/content/IContentProvider;
-HSPLandroid/app/ActivityThread;->acquireProvider(Landroid/content/Context;Ljava/lang/String;IZ)Landroid/content/IContentProvider;
-HSPLandroid/app/ActivityThread;->attach(ZJ)V
-HSPLandroid/app/ActivityThread;->callActivityOnSaveInstanceState(Landroid/app/ActivityThread$ActivityClientRecord;)V
-HSPLandroid/app/ActivityThread;->callActivityOnStop(Landroid/app/ActivityThread$ActivityClientRecord;ZLjava/lang/String;)V
-HSPLandroid/app/ActivityThread;->checkAndBlockForNetworkAccess()V
-HSPLandroid/app/ActivityThread;->cleanUpPendingRemoveWindows(Landroid/app/ActivityThread$ActivityClientRecord;Z)V
-HSPLandroid/app/ActivityThread;->collectComponentCallbacks(Z)Ljava/util/ArrayList;
-HSPLandroid/app/ActivityThread;->completeRemoveProvider(Landroid/app/ActivityThread$ProviderRefCount;)V
-HSPLandroid/app/ActivityThread;->countLaunchingActivities(I)V
-HSPLandroid/app/ActivityThread;->createBaseContextForActivity(Landroid/app/ActivityThread$ActivityClientRecord;)Landroid/app/ContextImpl;
-HSPLandroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread;
-HSPLandroid/app/ActivityThread;->currentApplication()Landroid/app/Application;
-HSPLandroid/app/ActivityThread;->currentAttributionSource()Landroid/content/AttributionSource;
-HSPLandroid/app/ActivityThread;->currentOpPackageName()Ljava/lang/String;
-HSPLandroid/app/ActivityThread;->currentPackageName()Ljava/lang/String;
-HSPLandroid/app/ActivityThread;->currentProcessName()Ljava/lang/String;
-HSPLandroid/app/ActivityThread;->deliverNewIntents(Landroid/app/ActivityThread$ActivityClientRecord;Ljava/util/List;)V
-HSPLandroid/app/ActivityThread;->deliverResults(Landroid/app/ActivityThread$ActivityClientRecord;Ljava/util/List;Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread;->dumpMemoryInfo(Landroid/util/proto/ProtoOutputStream;JLjava/lang/String;IIIIIIZIII)V
-HSPLandroid/app/ActivityThread;->getActivitiesToBeDestroyed()Ljava/util/Map;
-HSPLandroid/app/ActivityThread;->getActivity(Landroid/os/IBinder;)Landroid/app/Activity;
-HSPLandroid/app/ActivityThread;->getActivityClient(Landroid/os/IBinder;)Landroid/app/ActivityThread$ActivityClientRecord;
-HSPLandroid/app/ActivityThread;->getApplication()Landroid/app/Application;
-HSPLandroid/app/ActivityThread;->getApplicationThread()Landroid/app/ActivityThread$ApplicationThread;
-HSPLandroid/app/ActivityThread;->getBackupAgentName(Landroid/app/ActivityThread$CreateBackupAgentData;)Ljava/lang/String;
-HSPLandroid/app/ActivityThread;->getBackupAgentsForUser(I)Landroid/util/ArrayMap;
-HSPLandroid/app/ActivityThread;->getExecutor()Ljava/util/concurrent/Executor;
-HSPLandroid/app/ActivityThread;->getFloatCoreSetting(Ljava/lang/String;F)F
-HSPLandroid/app/ActivityThread;->getGetProviderKey(Ljava/lang/String;I)Landroid/app/ActivityThread$ProviderKey;
-HSPLandroid/app/ActivityThread;->getHandler()Landroid/os/Handler;
-HSPLandroid/app/ActivityThread;->getInstrumentation()Landroid/app/Instrumentation;
-HSPLandroid/app/ActivityThread;->getIntCoreSetting(Ljava/lang/String;I)I+]Landroid/os/Bundle;Landroid/os/Bundle;
-HSPLandroid/app/ActivityThread;->getIntentBeingBroadcast()Landroid/content/Intent;
-HSPLandroid/app/ActivityThread;->getLooper()Landroid/os/Looper;
-HSPLandroid/app/ActivityThread;->getOperationTypeFromBackupMode(I)I
-HSPLandroid/app/ActivityThread;->getPackageInfo(Landroid/content/pm/ApplicationInfo;Landroid/content/res/CompatibilityInfo;I)Landroid/app/LoadedApk;
-HSPLandroid/app/ActivityThread;->getPackageInfo(Landroid/content/pm/ApplicationInfo;Landroid/content/res/CompatibilityInfo;Ljava/lang/ClassLoader;ZZZ)Landroid/app/LoadedApk;
-HSPLandroid/app/ActivityThread;->getPackageInfo(Landroid/content/pm/ApplicationInfo;Landroid/content/res/CompatibilityInfo;Ljava/lang/ClassLoader;ZZZZ)Landroid/app/LoadedApk;
-HSPLandroid/app/ActivityThread;->getPackageInfo(Ljava/lang/String;Landroid/content/res/CompatibilityInfo;II)Landroid/app/LoadedApk;
-HSPLandroid/app/ActivityThread;->getPackageInfoNoCheck(Landroid/content/pm/ApplicationInfo;)Landroid/app/LoadedApk;
-HSPLandroid/app/ActivityThread;->getPackageInfoNoCheck(Landroid/content/pm/ApplicationInfo;Landroid/content/res/CompatibilityInfo;)Landroid/app/LoadedApk;
-HSPLandroid/app/ActivityThread;->getPackageManager()Landroid/content/pm/IPackageManager;
-HSPLandroid/app/ActivityThread;->getPermissionManager()Landroid/permission/IPermissionManager;
-HSPLandroid/app/ActivityThread;->getStringCoreSetting(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/app/ActivityThread;->getSystemContext()Landroid/app/ContextImpl;
-HSPLandroid/app/ActivityThread;->getSystemUiContext()Landroid/app/ContextImpl;
-HSPLandroid/app/ActivityThread;->getSystemUiContextNoCreate()Landroid/app/ContextImpl;
-HSPLandroid/app/ActivityThread;->getTopLevelResources(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Landroid/app/LoadedApk;Landroid/content/res/Configuration;)Landroid/content/res/Resources;
-HSPLandroid/app/ActivityThread;->handleApplicationInfoChanged(Landroid/content/pm/ApplicationInfo;)V
-HSPLandroid/app/ActivityThread;->handleBindApplication(Landroid/app/ActivityThread$AppBindData;)V
-HSPLandroid/app/ActivityThread;->handleBindService(Landroid/app/ActivityThread$BindServiceData;)V
-HSPLandroid/app/ActivityThread;->handleConfigurationChanged(Landroid/content/res/Configuration;I)V
-HSPLandroid/app/ActivityThread;->handleCreateBackupAgent(Landroid/app/ActivityThread$CreateBackupAgentData;)V
-HSPLandroid/app/ActivityThread;->handleCreateService(Landroid/app/ActivityThread$CreateServiceData;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/LoadedApk;Landroid/app/LoadedApk;]Landroid/app/ActivityThread;Landroid/app/ActivityThread;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;]Ljava/util/List;Ljava/util/Collections$EmptyList;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/app/IActivityManager;Landroid/app/IActivityManager$Stub$Proxy;
-HSPLandroid/app/ActivityThread;->handleDestroyBackupAgent(Landroid/app/ActivityThread$CreateBackupAgentData;)V
-HSPLandroid/app/ActivityThread;->handleDispatchPackageBroadcast(I[Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread;->handleDumpGfxInfo(Landroid/app/ActivityThread$DumpComponentInfo;)V
-HSPLandroid/app/ActivityThread;->handleDumpProvider(Landroid/app/ActivityThread$DumpComponentInfo;)V
-HSPLandroid/app/ActivityThread;->handleDumpResources(Landroid/app/ActivityThread$DumpResourcesData;)V
-HSPLandroid/app/ActivityThread;->handleDumpService(Landroid/app/ActivityThread$DumpComponentInfo;)V
-HSPLandroid/app/ActivityThread;->handleEnterAnimationComplete(Landroid/os/IBinder;)V
-HSPLandroid/app/ActivityThread;->handleInstallProvider(Landroid/content/pm/ProviderInfo;)V
-HSPLandroid/app/ActivityThread;->handleLaunchActivity(Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;ILandroid/content/Intent;)Landroid/app/Activity;
-HSPLandroid/app/ActivityThread;->handleLowMemory()V
-HSPLandroid/app/ActivityThread;->handleNewIntent(Landroid/app/ActivityThread$ActivityClientRecord;Ljava/util/List;)V
-HSPLandroid/app/ActivityThread;->handleReceiver(Landroid/app/ActivityThread$ReceiverData;)V
-HSPLandroid/app/ActivityThread;->handleRelaunchActivity(Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/ActivityThread;->handleRequestAssistContextExtras(Landroid/app/ActivityThread$RequestAssistContextExtras;)V
-HSPLandroid/app/ActivityThread;->handleResumeActivity(Landroid/app/ActivityThread$ActivityClientRecord;ZZZLjava/lang/String;)V
-HSPLandroid/app/ActivityThread;->handleSendResult(Landroid/app/ActivityThread$ActivityClientRecord;Ljava/util/List;Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread;->handleServiceArgs(Landroid/app/ActivityThread$ServiceArgsData;)V
-HSPLandroid/app/ActivityThread;->handleSetContentCaptureOptionsCallback(Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread;->handleSetCoreSettings(Landroid/os/Bundle;)V
-HSPLandroid/app/ActivityThread;->handleStopService(Landroid/os/IBinder;)V
-HSPLandroid/app/ActivityThread;->handleTopResumedActivityChanged(Landroid/app/ActivityThread$ActivityClientRecord;ZLjava/lang/String;)V
-HSPLandroid/app/ActivityThread;->handleTrimMemory(I)V
-HSPLandroid/app/ActivityThread;->handleUnbindService(Landroid/app/ActivityThread$BindServiceData;)V
-HSPLandroid/app/ActivityThread;->handleUnstableProviderDied(Landroid/os/IBinder;Z)V
-HSPLandroid/app/ActivityThread;->handleUnstableProviderDiedLocked(Landroid/os/IBinder;Z)V
-HSPLandroid/app/ActivityThread;->incProviderRefLocked(Landroid/app/ActivityThread$ProviderRefCount;Z)V
-HSPLandroid/app/ActivityThread;->initZipPathValidatorCallback()V
-HSPLandroid/app/ActivityThread;->initializeMainlineModules()V
-HSPLandroid/app/ActivityThread;->installContentProviders(Landroid/content/Context;Ljava/util/List;)V
-HSPLandroid/app/ActivityThread;->installProvider(Landroid/content/Context;Landroid/app/ContentProviderHolder;Landroid/content/pm/ProviderInfo;ZZZ)Landroid/app/ContentProviderHolder;
-HSPLandroid/app/ActivityThread;->installProviderAuthoritiesLocked(Landroid/content/IContentProvider;Landroid/content/ContentProvider;Landroid/app/ContentProviderHolder;)Landroid/app/ActivityThread$ProviderClientRecord;
-HSPLandroid/app/ActivityThread;->isHandleSplashScreenExit(Landroid/os/IBinder;)Z
-HSPLandroid/app/ActivityThread;->isInDensityCompatMode()Z
-HSPLandroid/app/ActivityThread;->isLoadedApkResourceDirsUpToDate(Landroid/app/LoadedApk;Landroid/content/pm/ApplicationInfo;)Z
-HSPLandroid/app/ActivityThread;->isProtectedBroadcast(Landroid/content/Intent;)Z
-HSPLandroid/app/ActivityThread;->isProtectedComponent(Landroid/content/pm/ActivityInfo;)Z
-HSPLandroid/app/ActivityThread;->isProtectedComponent(Landroid/content/pm/ComponentInfo;Ljava/lang/String;)Z
-HSPLandroid/app/ActivityThread;->isProtectedComponent(Landroid/content/pm/ServiceInfo;)Z
-HSPLandroid/app/ActivityThread;->isSystem()Z
-HSPLandroid/app/ActivityThread;->lambda$getGetProviderKey$3(Landroid/app/ActivityThread$ProviderKey;)Landroid/app/ActivityThread$ProviderKey;
-HSPLandroid/app/ActivityThread;->main([Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread;->onCoreSettingsChange()V
-HSPLandroid/app/ActivityThread;->peekPackageInfo(Ljava/lang/String;Z)Landroid/app/LoadedApk;
-HSPLandroid/app/ActivityThread;->performLaunchActivity(Landroid/app/ActivityThread$ActivityClientRecord;Landroid/content/Intent;)Landroid/app/Activity;
-HSPLandroid/app/ActivityThread;->performPauseActivity(Landroid/app/ActivityThread$ActivityClientRecord;ZLjava/lang/String;Landroid/app/servertransaction/PendingTransactionActions;)Landroid/os/Bundle;
-HSPLandroid/app/ActivityThread;->performPauseActivityIfNeeded(Landroid/app/ActivityThread$ActivityClientRecord;Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread;->performRestartActivity(Landroid/app/ActivityThread$ActivityClientRecord;Z)V
-HSPLandroid/app/ActivityThread;->performResumeActivity(Landroid/app/ActivityThread$ActivityClientRecord;ZLjava/lang/String;)Z
-HSPLandroid/app/ActivityThread;->performStopActivityInner(Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions$StopInfo;ZZLjava/lang/String;)V
-HSPLandroid/app/ActivityThread;->performUserLeavingActivity(Landroid/app/ActivityThread$ActivityClientRecord;)V
-HSPLandroid/app/ActivityThread;->printRow(Ljava/io/PrintWriter;Ljava/lang/String;[Ljava/lang/Object;)V
-HSPLandroid/app/ActivityThread;->purgePendingResources()V
-HSPLandroid/app/ActivityThread;->relaunchAllActivities(ZLjava/lang/String;)V
-HSPLandroid/app/ActivityThread;->releaseProvider(Landroid/content/IContentProvider;Z)Z
-HSPLandroid/app/ActivityThread;->reportSizeConfigurations(Landroid/app/ActivityThread$ActivityClientRecord;)V
-HSPLandroid/app/ActivityThread;->reportStop(Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/ActivityThread;->reportTopResumedActivityChanged(Landroid/app/ActivityThread$ActivityClientRecord;ZLjava/lang/String;)V
-HSPLandroid/app/ActivityThread;->scheduleContextCleanup(Landroid/app/ContextImpl;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/ActivityThread;->schedulePurgeIdler()V
-HSPLandroid/app/ActivityThread;->sendMessage(ILjava/lang/Object;)V
-HSPLandroid/app/ActivityThread;->sendMessage(ILjava/lang/Object;I)V
-HSPLandroid/app/ActivityThread;->sendMessage(ILjava/lang/Object;IIZ)V
-HSPLandroid/app/ActivityThread;->setupGraphicsSupport(Landroid/content/Context;)V
-HSPLandroid/app/ActivityThread;->unscheduleGcIdler()V
-HSPLandroid/app/ActivityThread;->updateDebugViewAttributeState()Z
-HSPLandroid/app/ActivityThread;->updateDeviceIdForNonUIContexts(I)V
-HSPLandroid/app/ActivityThread;->updatePendingConfiguration(Landroid/content/res/Configuration;)V
-HSPLandroid/app/ActivityThread;->updateProcessState(IZ)V
-HSPLandroid/app/ActivityThread;->updateVisibility(Landroid/app/ActivityThread$ActivityClientRecord;Z)V
-HSPLandroid/app/ActivityThread;->updateVmProcessState(I)V
-HSPLandroid/app/ActivityTransitionState;-><init>()V
-HSPLandroid/app/ActivityTransitionState;->enterReady(Landroid/app/Activity;)V
-HSPLandroid/app/ActivityTransitionState;->getPendingExitNames()Ljava/util/ArrayList;
-HSPLandroid/app/ActivityTransitionState;->onResume(Landroid/app/Activity;)V
-HSPLandroid/app/ActivityTransitionState;->onStop(Landroid/app/Activity;)V
-HSPLandroid/app/ActivityTransitionState;->readState(Landroid/os/Bundle;)V
-HSPLandroid/app/ActivityTransitionState;->restoreExitedViews()V
-HSPLandroid/app/ActivityTransitionState;->restoreReenteringViews()V
-HSPLandroid/app/ActivityTransitionState;->saveState(Landroid/os/Bundle;)V
-HSPLandroid/app/ActivityTransitionState;->startExitBackTransition(Landroid/app/Activity;)Z
-HSPLandroid/app/ActivityTransitionState;->startExitOutTransition(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/AlarmManager$AlarmClockInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/AlarmManager$AlarmClockInfo;
-HSPLandroid/app/AlarmManager$AlarmClockInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/AlarmManager$AlarmClockInfo;->getTriggerTime()J
-HSPLandroid/app/AlarmManager$ListenerWrapper;-><init>(Landroid/app/AlarmManager;Landroid/app/AlarmManager$OnAlarmListener;)V
-HSPLandroid/app/AlarmManager$ListenerWrapper;->cancel()V
-HSPLandroid/app/AlarmManager$ListenerWrapper;->doAlarm(Landroid/app/IAlarmCompleteListener;)V
-HSPLandroid/app/AlarmManager$ListenerWrapper;->run()V
-HSPLandroid/app/AlarmManager;-><init>(Landroid/app/IAlarmManager;Landroid/content/Context;)V
-HSPLandroid/app/AlarmManager;->cancel(Landroid/app/AlarmManager$OnAlarmListener;)V
-HSPLandroid/app/AlarmManager;->cancel(Landroid/app/PendingIntent;)V
-HSPLandroid/app/AlarmManager;->getNextAlarmClock(I)Landroid/app/AlarmManager$AlarmClockInfo;
-HSPLandroid/app/AlarmManager;->legacyExactLength()J
-HSPLandroid/app/AlarmManager;->set(IJJJLandroid/app/AlarmManager$OnAlarmListener;Landroid/os/Handler;Landroid/os/WorkSource;)V
-HSPLandroid/app/AlarmManager;->set(IJLandroid/app/PendingIntent;)V
-HSPLandroid/app/AlarmManager;->set(IJLjava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;Landroid/os/Handler;)V
-HSPLandroid/app/AlarmManager;->setExact(IJLandroid/app/PendingIntent;)V
-HSPLandroid/app/AlarmManager;->setExact(IJLjava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;Landroid/os/Handler;)V
-HSPLandroid/app/AlarmManager;->setExactAndAllowWhileIdle(IJLandroid/app/PendingIntent;)V
-HSPLandroid/app/AlarmManager;->setImpl(IJJJILandroid/app/PendingIntent;Landroid/app/AlarmManager$OnAlarmListener;Ljava/lang/String;Landroid/os/Handler;Landroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;)V
-HSPLandroid/app/AlarmManager;->setImpl(IJJJILandroid/app/PendingIntent;Landroid/app/AlarmManager$OnAlarmListener;Ljava/lang/String;Ljava/util/concurrent/Executor;Landroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;)V
-HSPLandroid/app/AlarmManager;->setInexactRepeating(IJJLandroid/app/PendingIntent;)V
-HSPLandroid/app/AlertDialog;-><init>(Landroid/content/Context;IZ)V
-HSPLandroid/app/AlertDialog;->onCreate(Landroid/os/Bundle;)V
-HSPLandroid/app/AlertDialog;->resolveDialogTheme(Landroid/content/Context;I)I
-HSPLandroid/app/AppCompatCallbacks;->isChangeEnabled(J)Z
-HSPLandroid/app/AppComponentFactory;-><init>()V
-HSPLandroid/app/AppComponentFactory;->instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;
-HSPLandroid/app/AppComponentFactory;->instantiateApplication(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/app/Application;
-HSPLandroid/app/AppComponentFactory;->instantiateClassLoader(Ljava/lang/ClassLoader;Landroid/content/pm/ApplicationInfo;)Ljava/lang/ClassLoader;
-HSPLandroid/app/AppComponentFactory;->instantiateProvider(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/content/ContentProvider;
-HSPLandroid/app/AppComponentFactory;->instantiateReceiver(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/content/BroadcastReceiver;
-HSPLandroid/app/AppComponentFactory;->instantiateService(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Service;
-HSPLandroid/app/AppGlobals;->getInitialApplication()Landroid/app/Application;
-HSPLandroid/app/AppGlobals;->getIntCoreSetting(Ljava/lang/String;I)I+]Landroid/app/ActivityThread;Landroid/app/ActivityThread;
-HSPLandroid/app/AppGlobals;->getPackageManager()Landroid/content/pm/IPackageManager;
-HSPLandroid/app/AppOpsManager$1;->onNoted(Landroid/app/SyncNotedAppOp;)V
-HSPLandroid/app/AppOpsManager$1;->onSelfNoted(Landroid/app/SyncNotedAppOp;)V
-HSPLandroid/app/AppOpsManager$1;->reportStackTraceIfNeeded(Landroid/app/SyncNotedAppOp;)V
-HSPLandroid/app/AppOpsManager$AttributedOpEntry;->getLastAccessEvent(III)Landroid/app/AppOpsManager$NoteOpEvent;
-HSPLandroid/app/AppOpsManager$AttributedOpEntry;->getLastRejectEvent(III)Landroid/app/AppOpsManager$NoteOpEvent;
-HSPLandroid/app/AppOpsManager$NoteOpEvent;->getDuration()J
-HSPLandroid/app/AppOpsManager$NoteOpEvent;->getNoteTime()J
-HSPLandroid/app/AppOpsManager$OnOpNotedCallback$1;-><init>(Landroid/app/AppOpsManager$OnOpNotedCallback;)V
-HSPLandroid/app/AppOpsManager$OnOpNotedCallback$1;->opNoted(Landroid/app/AsyncNotedAppOp;)V
-HSPLandroid/app/AppOpsManager$OnOpNotedCallback;-><init>()V
-HSPLandroid/app/AppOpsManager$OnOpNotedCallback;->getAsyncNotedExecutor()Ljava/util/concurrent/Executor;
-HSPLandroid/app/AppOpsManager$OpEntry$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/AppOpsManager$OpEntry;
-HSPLandroid/app/AppOpsManager$OpEntry$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/AppOpsManager$OpEntry;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/AppOpsManager$PackageOps$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/AppOpsManager$PackageOps;
-HSPLandroid/app/AppOpsManager$PackageOps$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/AppOpsManager$PackageOps;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/AppOpsManager$PackageOps;->getOps()Ljava/util/List;
-HSPLandroid/app/AppOpsManager$PackageOps;->getPackageName()Ljava/lang/String;
-HSPLandroid/app/AppOpsManager$PausedNotedAppOpsCollection;-><init>(ILandroid/util/ArrayMap;)V
-HSPLandroid/app/AppOpsManager;-><init>(Landroid/content/Context;Lcom/android/internal/app/IAppOpsService;)V
-HSPLandroid/app/AppOpsManager;->checkOp(IILjava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->checkOpNoThrow(IILjava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->checkOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->checkPackage(ILjava/lang/String;)V
-HSPLandroid/app/AppOpsManager;->collectNoteOpCallsForValidation(I)V
-HSPLandroid/app/AppOpsManager;->extractFlagsFromKey(J)I
-HSPLandroid/app/AppOpsManager;->extractUidStateFromKey(J)I
-HSPLandroid/app/AppOpsManager;->finishNotedAppOpsCollection()V
-HSPLandroid/app/AppOpsManager;->finishOp(IILjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/AppOpsManager;->getClientId()Landroid/os/IBinder;
-HSPLandroid/app/AppOpsManager;->getFormattedStackTrace()Ljava/lang/String;
-HSPLandroid/app/AppOpsManager;->getLastEvent(Landroid/util/LongSparseArray;III)Landroid/app/AppOpsManager$NoteOpEvent;
-HSPLandroid/app/AppOpsManager;->getNotedOpCollectionMode(ILjava/lang/String;I)I
-HSPLandroid/app/AppOpsManager;->getPackagesForOps([I)Ljava/util/List;
-HSPLandroid/app/AppOpsManager;->getService()Lcom/android/internal/app/IAppOpsService;
-HSPLandroid/app/AppOpsManager;->getToken(Lcom/android/internal/app/IAppOpsService;)Landroid/os/IBinder;
-HSPLandroid/app/AppOpsManager;->isCollectingStackTraces()Z
-HSPLandroid/app/AppOpsManager;->isListeningForOpNoted()Z
-HSPLandroid/app/AppOpsManager;->lambda$new$0(Landroid/provider/DeviceConfig$Properties;)V
-HSPLandroid/app/AppOpsManager;->leftCircularDistance(III)I
-HSPLandroid/app/AppOpsManager;->makeKey(II)J
-HSPLandroid/app/AppOpsManager;->noteOp(IILjava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->noteOp(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->noteOp(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->noteOpNoThrow(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->noteOpNoThrow(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->noteProxyOp(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->noteProxyOpNoThrow(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->opToDefaultMode(I)I
-HSPLandroid/app/AppOpsManager;->opToPermission(I)Ljava/lang/String;
-HSPLandroid/app/AppOpsManager;->opToPublicName(I)Ljava/lang/String;
-HSPLandroid/app/AppOpsManager;->opToSwitch(I)I
-HSPLandroid/app/AppOpsManager;->pauseNotedAppOpsCollection()Landroid/app/AppOpsManager$PausedNotedAppOpsCollection;+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal;
-HSPLandroid/app/AppOpsManager;->permissionToOp(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/app/AppOpsManager;->permissionToOpCode(Ljava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->prefixParcelWithAppOpsIfNeeded(Landroid/os/Parcel;)V
-HSPLandroid/app/AppOpsManager;->readAndLogNotedAppops(Landroid/os/Parcel;)V
-HSPLandroid/app/AppOpsManager;->resolveLastRestrictedUidState(I)I
-HSPLandroid/app/AppOpsManager;->setOnOpNotedCallback(Ljava/util/concurrent/Executor;Landroid/app/AppOpsManager$OnOpNotedCallback;)V
-HSPLandroid/app/AppOpsManager;->setUidMode(Ljava/lang/String;II)V
-HSPLandroid/app/AppOpsManager;->startNotedAppOpsCollection(I)V
-HSPLandroid/app/AppOpsManager;->startOpNoThrow(IILjava/lang/String;ZLjava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->startWatchingActive([Ljava/lang/String;Ljava/util/concurrent/Executor;Landroid/app/AppOpsManager$OnOpActiveChangedListener;)V
-HSPLandroid/app/AppOpsManager;->startWatchingMode(ILjava/lang/String;ILandroid/app/AppOpsManager$OnOpChangedListener;)V
-HSPLandroid/app/AppOpsManager;->startWatchingMode(ILjava/lang/String;Landroid/app/AppOpsManager$OnOpChangedListener;)V
-HSPLandroid/app/AppOpsManager;->startWatchingMode(Ljava/lang/String;Ljava/lang/String;Landroid/app/AppOpsManager$OnOpChangedListener;)V
-HSPLandroid/app/AppOpsManager;->stopWatchingMode(Landroid/app/AppOpsManager$OnOpChangedListener;)V
-HSPLandroid/app/AppOpsManager;->strOpToOp(Ljava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->toReceiverId(Ljava/lang/Object;)Ljava/lang/String;
-HSPLandroid/app/AppOpsManager;->unsafeCheckOp(Ljava/lang/String;ILjava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->unsafeCheckOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->unsafeCheckOpRaw(Ljava/lang/String;ILjava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->unsafeCheckOpRawNoThrow(IILjava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->unsafeCheckOpRawNoThrow(Ljava/lang/String;ILjava/lang/String;)I
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPostCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPostDestroyed(Landroid/app/Activity;)V
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPostPaused(Landroid/app/Activity;)V
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPostResumed(Landroid/app/Activity;)V
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPostSaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPostStarted(Landroid/app/Activity;)V
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPostStopped(Landroid/app/Activity;)V
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPreCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPreDestroyed(Landroid/app/Activity;)V
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPrePaused(Landroid/app/Activity;)V
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPreResumed(Landroid/app/Activity;)V
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPreSaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPreStarted(Landroid/app/Activity;)V
-HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPreStopped(Landroid/app/Activity;)V
-HSPLandroid/app/Application;-><init>()V
-HSPLandroid/app/Application;->attach(Landroid/content/Context;)V
-HSPLandroid/app/Application;->collectActivityLifecycleCallbacks()[Ljava/lang/Object;
-HSPLandroid/app/Application;->dispatchActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Application;->dispatchActivityDestroyed(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivityPaused(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivityPostCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Application;->dispatchActivityPostDestroyed(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivityPostPaused(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivityPostResumed(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivityPostSaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Application;->dispatchActivityPostStarted(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivityPostStopped(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivityPreCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Application;->dispatchActivityPreDestroyed(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivityPrePaused(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivityPreResumed(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivityPreSaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Application;->dispatchActivityPreStarted(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivityPreStopped(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivityResumed(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Application;->dispatchActivityStarted(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->dispatchActivityStopped(Landroid/app/Activity;)V
-HSPLandroid/app/Application;->getAutofillClient()Landroid/view/autofill/AutofillManager$AutofillClient;
-HSPLandroid/app/Application;->getProcessName()Ljava/lang/String;
-HSPLandroid/app/Application;->onConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/app/Application;->onCreate()V
-HSPLandroid/app/Application;->onLowMemory()V
-HSPLandroid/app/Application;->onTrimMemory(I)V
-HSPLandroid/app/Application;->registerActivityLifecycleCallbacks(Landroid/app/Application$ActivityLifecycleCallbacks;)V
-HSPLandroid/app/Application;->registerComponentCallbacks(Landroid/content/ComponentCallbacks;)V
-HSPLandroid/app/Application;->unregisterActivityLifecycleCallbacks(Landroid/app/Application$ActivityLifecycleCallbacks;)V
-HSPLandroid/app/Application;->unregisterComponentCallbacks(Landroid/content/ComponentCallbacks;)V
-HSPLandroid/app/ApplicationErrorReport$CrashInfo;-><init>(Ljava/lang/Throwable;)V
-HSPLandroid/app/ApplicationErrorReport$CrashInfo;->sanitizeString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/app/ApplicationErrorReport$CrashInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/ApplicationExitInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ApplicationExitInfo;
-HSPLandroid/app/ApplicationExitInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/ApplicationExitInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/ApplicationExitInfo;->getImportance()I
-HSPLandroid/app/ApplicationExitInfo;->getProcessName()Ljava/lang/String;
-HSPLandroid/app/ApplicationExitInfo;->getPss()J
-HSPLandroid/app/ApplicationExitInfo;->getReason()I
-HSPLandroid/app/ApplicationExitInfo;->getRss()J
-HSPLandroid/app/ApplicationExitInfo;->getStatus()I
-HSPLandroid/app/ApplicationExitInfo;->getTimestamp()J
-HSPLandroid/app/ApplicationLoaders$CachedClassLoader;-><init>()V
-HSPLandroid/app/ApplicationLoaders$CachedClassLoader;-><init>(Landroid/app/ApplicationLoaders$CachedClassLoader-IA;)V
-HSPLandroid/app/ApplicationLoaders;->addNative(Ljava/lang/ClassLoader;Ljava/util/Collection;)V
-HSPLandroid/app/ApplicationLoaders;->createAndCacheNonBootclasspathSystemClassLoader(Landroid/content/pm/SharedLibraryInfo;)V
-HSPLandroid/app/ApplicationLoaders;->createAndCacheNonBootclasspathSystemClassLoaders(Ljava/util/List;)V
-HSPLandroid/app/ApplicationLoaders;->getCachedNonBootclasspathSystemLib(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/util/List;)Ljava/lang/ClassLoader;
-HSPLandroid/app/ApplicationLoaders;->getClassLoader(Ljava/lang/String;IZLjava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/ClassLoader;
-HSPLandroid/app/ApplicationLoaders;->getClassLoader(Ljava/lang/String;IZLjava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;)Ljava/lang/ClassLoader;
-HSPLandroid/app/ApplicationLoaders;->getClassLoaderWithSharedLibraries(Ljava/lang/String;IZLjava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;)Ljava/lang/ClassLoader;
-HSPLandroid/app/ApplicationLoaders;->getDefault()Landroid/app/ApplicationLoaders;
-HSPLandroid/app/ApplicationLoaders;->getSharedLibraryClassLoaderWithSharedLibraries(Ljava/lang/String;IZLjava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)Ljava/lang/ClassLoader;
-HSPLandroid/app/ApplicationLoaders;->sharedLibrariesEquals(Ljava/util/List;Ljava/util/List;)Z
-HSPLandroid/app/ApplicationPackageManager$1;->recompute(Landroid/app/ApplicationPackageManager$HasSystemFeatureQuery;)Ljava/lang/Boolean;
-HSPLandroid/app/ApplicationPackageManager$1;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/app/ApplicationPackageManager$2;-><init>(Landroid/app/ApplicationPackageManager;Landroid/content/pm/PackageManager$OnChecksumsReadyListener;)V
-HSPLandroid/app/ApplicationPackageManager$2;->onChecksumsReady(Ljava/util/List;)V
-HSPLandroid/app/ApplicationPackageManager$3;->recompute(Ljava/lang/Integer;)Landroid/app/ApplicationPackageManager$GetPackagesForUidResult;
-HSPLandroid/app/ApplicationPackageManager$3;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/app/ApplicationPackageManager$GetPackagesForUidResult;-><init>([Ljava/lang/String;)V
-HSPLandroid/app/ApplicationPackageManager$GetPackagesForUidResult;->value()[Ljava/lang/String;
-HSPLandroid/app/ApplicationPackageManager$HasSystemFeatureQuery;-><init>(Ljava/lang/String;I)V
-HSPLandroid/app/ApplicationPackageManager$HasSystemFeatureQuery;->equals(Ljava/lang/Object;)Z
-HSPLandroid/app/ApplicationPackageManager$HasSystemFeatureQuery;->hashCode()I
-HSPLandroid/app/ApplicationPackageManager$ResourceName;-><init>(Ljava/lang/String;I)V
-HSPLandroid/app/ApplicationPackageManager$ResourceName;->equals(Ljava/lang/Object;)Z
-HSPLandroid/app/ApplicationPackageManager$ResourceName;->hashCode()I
-HSPLandroid/app/ApplicationPackageManager;->addOnPermissionsChangeListener(Landroid/content/pm/PackageManager$OnPermissionsChangedListener;)V
-HSPLandroid/app/ApplicationPackageManager;->checkPermission(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/ApplicationPackageManager;->checkSignatures(II)I
-HSPLandroid/app/ApplicationPackageManager;->checkSignatures(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/ApplicationPackageManager;->configurationChanged()V
-HSPLandroid/app/ApplicationPackageManager;->encodeCertificates(Ljava/util/List;)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->getActivityInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;
-HSPLandroid/app/ApplicationPackageManager;->getActivityInfo(Landroid/content/ComponentName;Landroid/content/pm/PackageManager$ComponentInfoFlags;)Landroid/content/pm/ActivityInfo;
-HSPLandroid/app/ApplicationPackageManager;->getApplicationEnabledSetting(Ljava/lang/String;)I
-HSPLandroid/app/ApplicationPackageManager;->getApplicationIcon(Landroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/app/ApplicationPackageManager;->getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/app/ApplicationPackageManager;->getApplicationInfo(Ljava/lang/String;Landroid/content/pm/PackageManager$ApplicationInfoFlags;)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/app/ApplicationPackageManager;->getApplicationInfoAsUser(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/app/ApplicationPackageManager;->getApplicationInfoAsUser(Ljava/lang/String;Landroid/content/pm/PackageManager$ApplicationInfoFlags;I)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/app/ApplicationPackageManager;->getApplicationLabel(Landroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;
-HSPLandroid/app/ApplicationPackageManager;->getCachedIcon(Landroid/app/ApplicationPackageManager$ResourceName;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/app/ApplicationPackageManager;->getCachedString(Landroid/app/ApplicationPackageManager$ResourceName;)Ljava/lang/CharSequence;
-HSPLandroid/app/ApplicationPackageManager;->getComponentEnabledSetting(Landroid/content/ComponentName;)I
-HSPLandroid/app/ApplicationPackageManager;->getDefaultTextClassifierPackageName()Ljava/lang/String;
-HSPLandroid/app/ApplicationPackageManager;->getDrawable(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/app/ApplicationPackageManager;->getInstallSourceInfo(Ljava/lang/String;)Landroid/content/pm/InstallSourceInfo;
-HSPLandroid/app/ApplicationPackageManager;->getInstalledApplications(I)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->getInstalledApplicationsAsUser(II)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->getInstalledApplicationsAsUser(Landroid/content/pm/PackageManager$ApplicationInfoFlags;I)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->getInstalledPackages(I)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->getInstalledPackages(Landroid/content/pm/PackageManager$PackageInfoFlags;)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->getInstalledPackagesAsUser(II)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->getInstalledPackagesAsUser(Landroid/content/pm/PackageManager$PackageInfoFlags;I)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/app/ApplicationPackageManager;->getLaunchIntentForPackage(Ljava/lang/String;)Landroid/content/Intent;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/app/ApplicationPackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/Intent;Landroid/content/Intent;
-HSPLandroid/app/ApplicationPackageManager;->getModuleInfo(Ljava/lang/String;I)Landroid/content/pm/ModuleInfo;
-HSPLandroid/app/ApplicationPackageManager;->getNameForUid(I)Ljava/lang/String;
-HSPLandroid/app/ApplicationPackageManager;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
-HSPLandroid/app/ApplicationPackageManager;->getPackageInfo(Ljava/lang/String;Landroid/content/pm/PackageManager$PackageInfoFlags;)Landroid/content/pm/PackageInfo;
-HSPLandroid/app/ApplicationPackageManager;->getPackageInfoAsUser(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
-HSPLandroid/app/ApplicationPackageManager;->getPackageInfoAsUser(Ljava/lang/String;Landroid/content/pm/PackageManager$PackageInfoFlags;I)Landroid/content/pm/PackageInfo;
-HSPLandroid/app/ApplicationPackageManager;->getPackageInstaller()Landroid/content/pm/PackageInstaller;
-HSPLandroid/app/ApplicationPackageManager;->getPackageUid(Ljava/lang/String;I)I
-HSPLandroid/app/ApplicationPackageManager;->getPackageUid(Ljava/lang/String;Landroid/content/pm/PackageManager$PackageInfoFlags;)I
-HSPLandroid/app/ApplicationPackageManager;->getPackageUidAsUser(Ljava/lang/String;I)I
-HSPLandroid/app/ApplicationPackageManager;->getPackageUidAsUser(Ljava/lang/String;II)I
-HSPLandroid/app/ApplicationPackageManager;->getPackageUidAsUser(Ljava/lang/String;Landroid/content/pm/PackageManager$PackageInfoFlags;I)I
-HSPLandroid/app/ApplicationPackageManager;->getPackagesForUid(I)[Ljava/lang/String;
-HSPLandroid/app/ApplicationPackageManager;->getPackagesHoldingPermissions([Ljava/lang/String;I)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->getPermissionControllerPackageName()Ljava/lang/String;
-HSPLandroid/app/ApplicationPackageManager;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)I
-HSPLandroid/app/ApplicationPackageManager;->getPermissionInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;
-HSPLandroid/app/ApplicationPackageManager;->getPermissionManager()Landroid/permission/PermissionManager;
-HSPLandroid/app/ApplicationPackageManager;->getProviderInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ProviderInfo;
-HSPLandroid/app/ApplicationPackageManager;->getProviderInfo(Landroid/content/ComponentName;Landroid/content/pm/PackageManager$ComponentInfoFlags;)Landroid/content/pm/ProviderInfo;
-HSPLandroid/app/ApplicationPackageManager;->getReceiverInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;
-HSPLandroid/app/ApplicationPackageManager;->getReceiverInfo(Landroid/content/ComponentName;Landroid/content/pm/PackageManager$ComponentInfoFlags;)Landroid/content/pm/ActivityInfo;
-HSPLandroid/app/ApplicationPackageManager;->getResourcesForApplication(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/Resources;
-HSPLandroid/app/ApplicationPackageManager;->getResourcesForApplication(Landroid/content/pm/ApplicationInfo;Landroid/content/res/Configuration;)Landroid/content/res/Resources;+]Landroid/app/ActivityThread;Landroid/app/ActivityThread;]Ljava/lang/Object;Ljava/lang/String;
-HSPLandroid/app/ApplicationPackageManager;->getResourcesForApplication(Ljava/lang/String;)Landroid/content/res/Resources;
-HSPLandroid/app/ApplicationPackageManager;->getServiceInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ServiceInfo;
-HSPLandroid/app/ApplicationPackageManager;->getServiceInfo(Landroid/content/ComponentName;Landroid/content/pm/PackageManager$ComponentInfoFlags;)Landroid/content/pm/ServiceInfo;
-HSPLandroid/app/ApplicationPackageManager;->getServicesSystemSharedLibraryPackageName()Ljava/lang/String;
-HSPLandroid/app/ApplicationPackageManager;->getSystemAvailableFeatures()[Landroid/content/pm/FeatureInfo;
-HSPLandroid/app/ApplicationPackageManager;->getSystemSharedLibraryNames()[Ljava/lang/String;
-HSPLandroid/app/ApplicationPackageManager;->getText(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;
-HSPLandroid/app/ApplicationPackageManager;->getUserBadgeColor(Landroid/os/UserHandle;Z)I
-HSPLandroid/app/ApplicationPackageManager;->getUserBadgedIcon(Landroid/graphics/drawable/Drawable;Landroid/os/UserHandle;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/app/ApplicationPackageManager;->getUserId()I+]Landroid/app/ContextImpl;Landroid/app/ContextImpl;
-HSPLandroid/app/ApplicationPackageManager;->getUserManager()Landroid/os/UserManager;
-HSPLandroid/app/ApplicationPackageManager;->getXml(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Landroid/content/res/XmlResourceParser;
-HSPLandroid/app/ApplicationPackageManager;->handlePackageBroadcast(I[Ljava/lang/String;Z)V
-HSPLandroid/app/ApplicationPackageManager;->hasSystemFeature(Ljava/lang/String;)Z
-HSPLandroid/app/ApplicationPackageManager;->hasSystemFeature(Ljava/lang/String;I)Z
-HSPLandroid/app/ApplicationPackageManager;->hasUserBadge(I)Z
-HSPLandroid/app/ApplicationPackageManager;->isInstantApp()Z
-HSPLandroid/app/ApplicationPackageManager;->isInstantApp(Ljava/lang/String;)Z
-HSPLandroid/app/ApplicationPackageManager;->isPackageSuspended(Ljava/lang/String;)Z
-HSPLandroid/app/ApplicationPackageManager;->isPackageSuspendedForUser(Ljava/lang/String;I)Z
-HSPLandroid/app/ApplicationPackageManager;->isSafeMode()Z
-HSPLandroid/app/ApplicationPackageManager;->loadItemIcon(Landroid/content/pm/PackageItemInfo;Landroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/app/ApplicationPackageManager;->loadUnbadgedItemIcon(Landroid/content/pm/PackageItemInfo;Landroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/app/ApplicationPackageManager;->maybeAdjustApplicationInfo(Landroid/content/pm/ApplicationInfo;)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/app/ApplicationPackageManager;->onImplicitDirectBoot(I)V
-HSPLandroid/app/ApplicationPackageManager;->putCachedIcon(Landroid/app/ApplicationPackageManager$ResourceName;Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/app/ApplicationPackageManager;->putCachedString(Landroid/app/ApplicationPackageManager$ResourceName;Ljava/lang/CharSequence;)V
-HSPLandroid/app/ApplicationPackageManager;->queryBroadcastReceivers(Landroid/content/Intent;I)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryBroadcastReceivers(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryBroadcastReceiversAsUser(Landroid/content/Intent;II)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryBroadcastReceiversAsUser(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;I)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryIntentActivities(Landroid/content/Intent;I)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryIntentActivities(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryIntentActivitiesAsUser(Landroid/content/Intent;II)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryIntentActivitiesAsUser(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;I)Ljava/util/List;+]Landroid/content/pm/IPackageManager;Landroid/content/pm/IPackageManager$Stub$Proxy;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager$ResolveInfoFlags;Landroid/content/pm/PackageManager$ResolveInfoFlags;]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Landroid/content/Intent;Landroid/content/Intent;
-HSPLandroid/app/ApplicationPackageManager;->queryIntentContentProviders(Landroid/content/Intent;I)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryIntentContentProviders(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryIntentContentProvidersAsUser(Landroid/content/Intent;II)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryIntentContentProvidersAsUser(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;I)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryIntentServices(Landroid/content/Intent;I)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryIntentServices(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryIntentServicesAsUser(Landroid/content/Intent;II)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->queryIntentServicesAsUser(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;I)Ljava/util/List;
-HSPLandroid/app/ApplicationPackageManager;->removeOnPermissionsChangeListener(Landroid/content/pm/PackageManager$OnPermissionsChangedListener;)V
-HSPLandroid/app/ApplicationPackageManager;->requestChecksums(Ljava/lang/String;ZILjava/util/List;Landroid/content/pm/PackageManager$OnChecksumsReadyListener;)V
-HSPLandroid/app/ApplicationPackageManager;->resolveActivity(Landroid/content/Intent;I)Landroid/content/pm/ResolveInfo;
-HSPLandroid/app/ApplicationPackageManager;->resolveActivity(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Landroid/content/pm/ResolveInfo;
-HSPLandroid/app/ApplicationPackageManager;->resolveActivityAsUser(Landroid/content/Intent;II)Landroid/content/pm/ResolveInfo;
-HSPLandroid/app/ApplicationPackageManager;->resolveActivityAsUser(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;I)Landroid/content/pm/ResolveInfo;
-HSPLandroid/app/ApplicationPackageManager;->resolveContentProvider(Ljava/lang/String;I)Landroid/content/pm/ProviderInfo;
-HSPLandroid/app/ApplicationPackageManager;->resolveContentProvider(Ljava/lang/String;Landroid/content/pm/PackageManager$ComponentInfoFlags;)Landroid/content/pm/ProviderInfo;
-HSPLandroid/app/ApplicationPackageManager;->resolveContentProviderAsUser(Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
-HSPLandroid/app/ApplicationPackageManager;->resolveContentProviderAsUser(Ljava/lang/String;Landroid/content/pm/PackageManager$ComponentInfoFlags;I)Landroid/content/pm/ProviderInfo;
-HSPLandroid/app/ApplicationPackageManager;->resolveService(Landroid/content/Intent;I)Landroid/content/pm/ResolveInfo;
-HSPLandroid/app/ApplicationPackageManager;->resolveService(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Landroid/content/pm/ResolveInfo;
-HSPLandroid/app/ApplicationPackageManager;->resolveServiceAsUser(Landroid/content/Intent;II)Landroid/content/pm/ResolveInfo;
-HSPLandroid/app/ApplicationPackageManager;->resolveServiceAsUser(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;I)Landroid/content/pm/ResolveInfo;
-HSPLandroid/app/ApplicationPackageManager;->setComponentEnabledSetting(Landroid/content/ComponentName;II)V
-HSPLandroid/app/ApplicationPackageManager;->setSystemAppState(Ljava/lang/String;I)V
-HSPLandroid/app/ApplicationPackageManager;->updateFlagsForApplication(JI)J
-HSPLandroid/app/ApplicationPackageManager;->updateFlagsForComponent(JILandroid/content/Intent;)J
-HSPLandroid/app/ApplicationPackageManager;->updateFlagsForPackage(JI)J
-HSPLandroid/app/ApplicationPackageManager;->updatePermissionFlags(Ljava/lang/String;Ljava/lang/String;IILandroid/os/UserHandle;)V
-HSPLandroid/app/AsyncNotedAppOp$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/AsyncNotedAppOp;
-HSPLandroid/app/AsyncNotedAppOp$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/AsyncNotedAppOp;-><init>(IILjava/lang/String;Ljava/lang/String;J)V
-HSPLandroid/app/AsyncNotedAppOp;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/AsyncNotedAppOp;->getMessage()Ljava/lang/String;
-HSPLandroid/app/AsyncNotedAppOp;->getOp()Ljava/lang/String;
-HSPLandroid/app/AsyncNotedAppOp;->onConstructed()V
-HSPLandroid/app/BackStackRecord$Op;-><init>(ILandroid/app/Fragment;)V
-HSPLandroid/app/BackStackRecord;-><init>(Landroid/app/FragmentManagerImpl;)V
-HSPLandroid/app/BackStackRecord;->add(Landroid/app/Fragment;Ljava/lang/String;)Landroid/app/FragmentTransaction;
-HSPLandroid/app/BackStackRecord;->addOp(Landroid/app/BackStackRecord$Op;)V
-HSPLandroid/app/BackStackRecord;->bumpBackStackNesting(I)V
-HSPLandroid/app/BackStackRecord;->commit()I
-HSPLandroid/app/BackStackRecord;->commitInternal(Z)I
-HSPLandroid/app/BackStackRecord;->doAddOp(ILandroid/app/Fragment;Ljava/lang/String;I)V
-HSPLandroid/app/BackStackRecord;->executeOps()V
-HSPLandroid/app/BackStackRecord;->expandOps(Ljava/util/ArrayList;Landroid/app/Fragment;)Landroid/app/Fragment;
-HSPLandroid/app/BackStackRecord;->generateOps(Ljava/util/ArrayList;Ljava/util/ArrayList;)Z
-HSPLandroid/app/BackStackRecord;->isFragmentPostponed(Landroid/app/BackStackRecord$Op;)Z
-HSPLandroid/app/BackStackRecord;->isPostponed()Z
-HSPLandroid/app/BackStackRecord;->runOnCommitRunnables()V
-HSPLandroid/app/BroadcastOptions;-><init>()V
-HSPLandroid/app/BroadcastOptions;->isTemporaryAppAllowlistSet()Z
-HSPLandroid/app/BroadcastOptions;->makeBasic()Landroid/app/BroadcastOptions;
-HSPLandroid/app/BroadcastOptions;->setTemporaryAppWhitelistDuration(J)V
-HSPLandroid/app/BroadcastOptions;->toBundle()Landroid/os/Bundle;
-HSPLandroid/app/ClientTransactionHandler;-><init>()V
-HSPLandroid/app/ClientTransactionHandler;->scheduleTransaction(Landroid/app/servertransaction/ClientTransaction;)V
-HSPLandroid/app/ConfigurationChangedListenerController;-><init>()V
-HSPLandroid/app/ConfigurationController;-><init>(Landroid/app/ActivityThreadInternal;)V
-HSPLandroid/app/ConfigurationController;->applyCompatConfiguration()Landroid/content/res/Configuration;
-HSPLandroid/app/ConfigurationController;->createNewConfigAndUpdateIfNotNull(Landroid/content/res/Configuration;Landroid/content/res/Configuration;)Landroid/content/res/Configuration;
-HSPLandroid/app/ConfigurationController;->getCompatConfiguration()Landroid/content/res/Configuration;
-HSPLandroid/app/ConfigurationController;->getConfiguration()Landroid/content/res/Configuration;
-HSPLandroid/app/ConfigurationController;->getCurDefaultDisplayDpi()I
-HSPLandroid/app/ConfigurationController;->getPendingConfiguration(Z)Landroid/content/res/Configuration;
-HSPLandroid/app/ConfigurationController;->handleConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/app/ConfigurationController;->handleConfigurationChanged(Landroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;)V
-HSPLandroid/app/ConfigurationController;->performConfigurationChanged(Landroid/content/ComponentCallbacks2;Landroid/content/res/Configuration;)V
-HSPLandroid/app/ConfigurationController;->setCompatConfiguration(Landroid/content/res/Configuration;)V
-HSPLandroid/app/ConfigurationController;->setConfiguration(Landroid/content/res/Configuration;)V
-HSPLandroid/app/ConfigurationController;->updateDefaultDensity(I)V
-HSPLandroid/app/ConfigurationController;->updateLocaleListFromAppContext(Landroid/content/Context;)V
-HSPLandroid/app/ConfigurationController;->updatePendingConfiguration(Landroid/content/res/Configuration;)Landroid/content/res/Configuration;
-HSPLandroid/app/ContentProviderHolder$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ContentProviderHolder;
-HSPLandroid/app/ContentProviderHolder$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/ContentProviderHolder;-><init>(Landroid/content/pm/ProviderInfo;)V
-HSPLandroid/app/ContentProviderHolder;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/ContentProviderHolder;-><init>(Landroid/os/Parcel;Landroid/app/ContentProviderHolder-IA;)V
-HSPLandroid/app/ContentProviderHolder;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/ContextImpl$1;-><init>(Ljava/lang/String;)V
-HSPLandroid/app/ContextImpl$ApplicationContentResolver;-><init>(Landroid/content/Context;Landroid/app/ActivityThread;)V
-HSPLandroid/app/ContextImpl$ApplicationContentResolver;->acquireExistingProvider(Landroid/content/Context;Ljava/lang/String;)Landroid/content/IContentProvider;
-HSPLandroid/app/ContextImpl$ApplicationContentResolver;->acquireProvider(Landroid/content/Context;Ljava/lang/String;)Landroid/content/IContentProvider;
-HSPLandroid/app/ContextImpl$ApplicationContentResolver;->acquireUnstableProvider(Landroid/content/Context;Ljava/lang/String;)Landroid/content/IContentProvider;
-HSPLandroid/app/ContextImpl$ApplicationContentResolver;->releaseProvider(Landroid/content/IContentProvider;)Z
-HSPLandroid/app/ContextImpl$ApplicationContentResolver;->releaseUnstableProvider(Landroid/content/IContentProvider;)Z
-HSPLandroid/app/ContextImpl$ApplicationContentResolver;->resolveUserIdFromAuthority(Ljava/lang/String;)I
-HSPLandroid/app/ContextImpl$ApplicationContentResolver;->unstableProviderDied(Landroid/content/IContentProvider;)V
-HSPLandroid/app/ContextImpl;-><init>(Landroid/app/ContextImpl;Landroid/app/ActivityThread;Landroid/app/LoadedApk;Landroid/content/ContextParams;Ljava/lang/String;Landroid/content/AttributionSource;Ljava/lang/String;Landroid/os/IBinder;Landroid/os/UserHandle;ILjava/lang/ClassLoader;Ljava/lang/String;IZ)V+]Landroid/app/LoadedApk;Landroid/app/LoadedApk;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;]Landroid/content/ContextParams;Landroid/content/ContextParams;
-HSPLandroid/app/ContextImpl;->bindIsolatedService(Landroid/content/Intent;ILjava/lang/String;Ljava/util/concurrent/Executor;Landroid/content/ServiceConnection;)Z
-HSPLandroid/app/ContextImpl;->bindService(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z
-HSPLandroid/app/ContextImpl;->bindServiceAsUser(Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/Handler;Landroid/os/UserHandle;)Z
-HSPLandroid/app/ContextImpl;->bindServiceAsUser(Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/UserHandle;)Z
-HSPLandroid/app/ContextImpl;->bindServiceCommon(Landroid/content/Intent;Landroid/content/ServiceConnection;JLjava/lang/String;Landroid/os/Handler;Ljava/util/concurrent/Executor;Landroid/os/UserHandle;)Z
-HSPLandroid/app/ContextImpl;->canLoadUnsafeResources()Z
-HSPLandroid/app/ContextImpl;->checkCallingOrSelfPermission(Ljava/lang/String;)I
-HSPLandroid/app/ContextImpl;->checkCallingPermission(Ljava/lang/String;)I
-HSPLandroid/app/ContextImpl;->checkMode(I)V
-HSPLandroid/app/ContextImpl;->checkPermission(Ljava/lang/String;II)I
-HSPLandroid/app/ContextImpl;->checkPermission(Ljava/lang/String;IILandroid/os/IBinder;)I
-HSPLandroid/app/ContextImpl;->checkSelfPermission(Ljava/lang/String;)I
-HSPLandroid/app/ContextImpl;->checkUriPermission(Landroid/net/Uri;III)I
-HSPLandroid/app/ContextImpl;->checkUriPermission(Landroid/net/Uri;IIILandroid/os/IBinder;)I
-HSPLandroid/app/ContextImpl;->createActivityContext(Landroid/app/ActivityThread;Landroid/app/LoadedApk;Landroid/content/pm/ActivityInfo;Landroid/os/IBinder;ILandroid/content/res/Configuration;)Landroid/app/ContextImpl;
-HSPLandroid/app/ContextImpl;->createAppContext(Landroid/app/ActivityThread;Landroid/app/LoadedApk;)Landroid/app/ContextImpl;
-HSPLandroid/app/ContextImpl;->createAppContext(Landroid/app/ActivityThread;Landroid/app/LoadedApk;Ljava/lang/String;)Landroid/app/ContextImpl;
-HSPLandroid/app/ContextImpl;->createApplicationContext(Landroid/content/pm/ApplicationInfo;I)Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->createAttributionContext(Ljava/lang/String;)Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->createAttributionSource(Ljava/lang/String;Landroid/content/AttributionSource;Ljava/util/Set;ZI)Landroid/content/AttributionSource;+]Ljava/util/Set;missing_types]Landroid/permission/PermissionManager;Landroid/permission/PermissionManager;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;
-HSPLandroid/app/ContextImpl;->createConfigurationContext(Landroid/content/res/Configuration;)Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->createContext(Landroid/content/ContextParams;)Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->createContextAsUser(Landroid/os/UserHandle;I)Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->createCredentialProtectedStorageContext()Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->createDeviceProtectedStorageContext()Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->createDisplayContext(Landroid/view/Display;)Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->createPackageContext(Ljava/lang/String;I)Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->createPackageContextAsUser(Ljava/lang/String;ILandroid/os/UserHandle;)Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->createResources(Landroid/os/IBinder;Landroid/app/LoadedApk;Ljava/lang/String;Ljava/lang/Integer;Landroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;Ljava/util/List;)Landroid/content/res/Resources;
-HSPLandroid/app/ContextImpl;->createSystemContext(Landroid/app/ActivityThread;)Landroid/app/ContextImpl;
-HSPLandroid/app/ContextImpl;->createSystemUiContext(Landroid/app/ContextImpl;I)Landroid/app/ContextImpl;
-HSPLandroid/app/ContextImpl;->createWindowContext(ILandroid/os/Bundle;)Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->createWindowContext(ILandroid/os/Bundle;)Landroid/window/WindowContext;
-HSPLandroid/app/ContextImpl;->createWindowContext(Landroid/view/Display;ILandroid/os/Bundle;)Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->createWindowContext(Landroid/view/Display;ILandroid/os/Bundle;)Landroid/window/WindowContext;
-HSPLandroid/app/ContextImpl;->createWindowContextBase(Landroid/os/IBinder;I)Landroid/app/ContextImpl;
-HSPLandroid/app/ContextImpl;->createWindowContextInternal(Landroid/view/Display;ILandroid/os/Bundle;)Landroid/window/WindowContext;
-HSPLandroid/app/ContextImpl;->createWindowContextResources(Landroid/app/ContextImpl;)Landroid/content/res/Resources;
-HSPLandroid/app/ContextImpl;->databaseList()[Ljava/lang/String;
-HSPLandroid/app/ContextImpl;->deleteDatabase(Ljava/lang/String;)Z
-HSPLandroid/app/ContextImpl;->deleteFile(Ljava/lang/String;)Z
-HSPLandroid/app/ContextImpl;->deleteSharedPreferences(Ljava/lang/String;)Z
-HSPLandroid/app/ContextImpl;->enforce(Ljava/lang/String;IZILjava/lang/String;)V
-HSPLandroid/app/ContextImpl;->enforceCallingOrSelfPermission(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/ContextImpl;->enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/ContextImpl;->enforcePermission(Ljava/lang/String;IILjava/lang/String;)V
-HSPLandroid/app/ContextImpl;->ensureExternalDirsExistOrFilter([Ljava/io/File;Z)[Ljava/io/File;
-HSPLandroid/app/ContextImpl;->ensurePrivateCacheDirExists(Ljava/io/File;Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/app/ContextImpl;->ensurePrivateDirExists(Ljava/io/File;)Ljava/io/File;
-HSPLandroid/app/ContextImpl;->ensurePrivateDirExists(Ljava/io/File;IILjava/lang/String;)Ljava/io/File;
-HSPLandroid/app/ContextImpl;->fileList()[Ljava/lang/String;
-HSPLandroid/app/ContextImpl;->finalize()V
-HSPLandroid/app/ContextImpl;->getActivityToken()Landroid/os/IBinder;
-HSPLandroid/app/ContextImpl;->getApplicationContext()Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;+]Landroid/app/LoadedApk;Landroid/app/LoadedApk;
-HSPLandroid/app/ContextImpl;->getAssets()Landroid/content/res/AssetManager;
-HSPLandroid/app/ContextImpl;->getAssociatedDisplayId()I
-HSPLandroid/app/ContextImpl;->getAttributionSource()Landroid/content/AttributionSource;
-HSPLandroid/app/ContextImpl;->getAttributionTag()Ljava/lang/String;
-HSPLandroid/app/ContextImpl;->getAutofillClient()Landroid/view/autofill/AutofillManager$AutofillClient;
-HSPLandroid/app/ContextImpl;->getAutofillOptions()Landroid/content/AutofillOptions;
-HSPLandroid/app/ContextImpl;->getBasePackageName()Ljava/lang/String;
-HSPLandroid/app/ContextImpl;->getCacheDir()Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getClassLoader()Ljava/lang/ClassLoader;
-HSPLandroid/app/ContextImpl;->getCodeCacheDir()Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getCodeCacheDirBeforeBind(Ljava/io/File;)Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getContentCaptureOptions()Landroid/content/ContentCaptureOptions;
-HSPLandroid/app/ContextImpl;->getContentResolver()Landroid/content/ContentResolver;
-HSPLandroid/app/ContextImpl;->getDataDir()Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getDatabasePath(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getDatabasesDir()Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getDeviceId()I
-HSPLandroid/app/ContextImpl;->getDir(Ljava/lang/String;I)Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getDisplay()Landroid/view/Display;
-HSPLandroid/app/ContextImpl;->getDisplayAdjustments(I)Landroid/view/DisplayAdjustments;
-HSPLandroid/app/ContextImpl;->getDisplayId()I
-HSPLandroid/app/ContextImpl;->getDisplayNoVerify()Landroid/view/Display;
-HSPLandroid/app/ContextImpl;->getExternalCacheDir()Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getExternalCacheDirs()[Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getExternalFilesDir(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getExternalFilesDirs(Ljava/lang/String;)[Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getExternalMediaDirs()[Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getFileStreamPath(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getFilesDir()Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getImpl(Landroid/content/Context;)Landroid/app/ContextImpl;
-HSPLandroid/app/ContextImpl;->getMainExecutor()Ljava/util/concurrent/Executor;
-HSPLandroid/app/ContextImpl;->getMainLooper()Landroid/os/Looper;
-HSPLandroid/app/ContextImpl;->getMainThreadHandler()Landroid/os/Handler;
-HSPLandroid/app/ContextImpl;->getNoBackupFilesDir()Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getOpPackageName()Ljava/lang/String;
-HSPLandroid/app/ContextImpl;->getOuterContext()Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->getPackageCodePath()Ljava/lang/String;
-HSPLandroid/app/ContextImpl;->getPackageManager()Landroid/content/pm/PackageManager;
-HSPLandroid/app/ContextImpl;->getPackageName()Ljava/lang/String;
-HSPLandroid/app/ContextImpl;->getPackageResourcePath()Ljava/lang/String;
-HSPLandroid/app/ContextImpl;->getPreferencesDir()Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getReceiverRestrictedContext()Landroid/content/Context;
-HSPLandroid/app/ContextImpl;->getResources()Landroid/content/res/Resources;
-HSPLandroid/app/ContextImpl;->getSharedPreferences(Ljava/io/File;I)Landroid/content/SharedPreferences;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;
-HSPLandroid/app/ContextImpl;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/LoadedApk;Landroid/app/LoadedApk;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;
-HSPLandroid/app/ContextImpl;->getSharedPreferencesCacheLocked()Landroid/util/ArrayMap;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;
-HSPLandroid/app/ContextImpl;->getSharedPreferencesPath(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/app/ContextImpl;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;+]Ljava/lang/Object;Ljava/lang/String;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;
-HSPLandroid/app/ContextImpl;->getSystemServiceName(Ljava/lang/Class;)Ljava/lang/String;
-HSPLandroid/app/ContextImpl;->getTheme()Landroid/content/res/Resources$Theme;
-HSPLandroid/app/ContextImpl;->getThemeResId()I
-HSPLandroid/app/ContextImpl;->getUser()Landroid/os/UserHandle;
-HSPLandroid/app/ContextImpl;->getUserId()I
-HSPLandroid/app/ContextImpl;->getWindowContextToken()Landroid/os/IBinder;
-HSPLandroid/app/ContextImpl;->grantUriPermission(Ljava/lang/String;Landroid/net/Uri;I)V
-HSPLandroid/app/ContextImpl;->initializeTheme()V
-HSPLandroid/app/ContextImpl;->isAssociatedWithDisplay()Z
-HSPLandroid/app/ContextImpl;->isCredentialProtectedStorage()Z
-HSPLandroid/app/ContextImpl;->isDeviceProtectedStorage()Z
-HSPLandroid/app/ContextImpl;->isRestricted()Z
-HSPLandroid/app/ContextImpl;->isSystemOrSystemUI(Landroid/content/Context;)Z
-HSPLandroid/app/ContextImpl;->isUiContext()Z
-HSPLandroid/app/ContextImpl;->makeFilename(Ljava/io/File;Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/app/ContextImpl;->moveFiles(Ljava/io/File;Ljava/io/File;Ljava/lang/String;)I
-HSPLandroid/app/ContextImpl;->moveSharedPreferencesFrom(Landroid/content/Context;Ljava/lang/String;)Z
-HSPLandroid/app/ContextImpl;->openFileInput(Ljava/lang/String;)Ljava/io/FileInputStream;
-HSPLandroid/app/ContextImpl;->openFileOutput(Ljava/lang/String;I)Ljava/io/FileOutputStream;
-HSPLandroid/app/ContextImpl;->openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/app/ContextImpl;->openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/app/ContextImpl;->performFinalCleanup(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/ContextImpl;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;
-HSPLandroid/app/ContextImpl;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;I)Landroid/content/Intent;
-HSPLandroid/app/ContextImpl;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
-HSPLandroid/app/ContextImpl;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent;
-HSPLandroid/app/ContextImpl;->registerReceiverAsUser(Landroid/content/BroadcastReceiver;Landroid/os/UserHandle;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
-HSPLandroid/app/ContextImpl;->registerReceiverForAllUsers(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
-HSPLandroid/app/ContextImpl;->registerReceiverInternal(Landroid/content/BroadcastReceiver;ILandroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;Landroid/content/Context;I)Landroid/content/Intent;
-HSPLandroid/app/ContextImpl;->resolveUserId(Landroid/net/Uri;)I
-HSPLandroid/app/ContextImpl;->revokeUriPermission(Landroid/net/Uri;I)V
-HSPLandroid/app/ContextImpl;->scheduleFinalCleanup(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/ContextImpl;->sendBroadcast(Landroid/content/Intent;)V
-HSPLandroid/app/ContextImpl;->sendBroadcast(Landroid/content/Intent;Ljava/lang/String;)V
-HSPLandroid/app/ContextImpl;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
-HSPLandroid/app/ContextImpl;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;)V
-HSPLandroid/app/ContextImpl;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;I)V
-HSPLandroid/app/ContextImpl;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/app/ContextImpl;->sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;)V
-HSPLandroid/app/ContextImpl;->sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;ILandroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;Landroid/os/Bundle;)V
-HSPLandroid/app/ContextImpl;->sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/app/ContextImpl;->sendOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;ILandroid/os/Bundle;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/app/ContextImpl;->sendOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/app/ContextImpl;->sendStickyBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
-HSPLandroid/app/ContextImpl;->setAutofillClient(Landroid/view/autofill/AutofillManager$AutofillClient;)V
-HSPLandroid/app/ContextImpl;->setAutofillOptions(Landroid/content/AutofillOptions;)V
-HSPLandroid/app/ContextImpl;->setContentCaptureOptions(Landroid/content/ContentCaptureOptions;)V
-HSPLandroid/app/ContextImpl;->setDisplay(Landroid/view/Display;)V
-HSPLandroid/app/ContextImpl;->setFilePermissionsFromMode(Ljava/lang/String;II)V
-HSPLandroid/app/ContextImpl;->setOuterContext(Landroid/content/Context;)V
-HSPLandroid/app/ContextImpl;->setResources(Landroid/content/res/Resources;)V
-HSPLandroid/app/ContextImpl;->setTheme(I)V
-HSPLandroid/app/ContextImpl;->startActivity(Landroid/content/Intent;)V
-HSPLandroid/app/ContextImpl;->startActivity(Landroid/content/Intent;Landroid/os/Bundle;)V
-HSPLandroid/app/ContextImpl;->startForegroundService(Landroid/content/Intent;)Landroid/content/ComponentName;
-HSPLandroid/app/ContextImpl;->startService(Landroid/content/Intent;)Landroid/content/ComponentName;
-HSPLandroid/app/ContextImpl;->startServiceAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)Landroid/content/ComponentName;
-HSPLandroid/app/ContextImpl;->startServiceCommon(Landroid/content/Intent;ZLandroid/os/UserHandle;)Landroid/content/ComponentName;
-HSPLandroid/app/ContextImpl;->stopService(Landroid/content/Intent;)Z
-HSPLandroid/app/ContextImpl;->stopServiceCommon(Landroid/content/Intent;Landroid/os/UserHandle;)Z
-HSPLandroid/app/ContextImpl;->unbindService(Landroid/content/ServiceConnection;)V
-HSPLandroid/app/ContextImpl;->unregisterReceiver(Landroid/content/BroadcastReceiver;)V
-HSPLandroid/app/ContextImpl;->updateDeviceId(I)V
-HSPLandroid/app/ContextImpl;->updateDeviceIdIfChanged(I)V
-HSPLandroid/app/ContextImpl;->updateDisplay(I)V
-HSPLandroid/app/ContextImpl;->validateServiceIntent(Landroid/content/Intent;)V
-HSPLandroid/app/ContextImpl;->warnIfCallingFromSystemProcess()V
-HSPLandroid/app/DexLoadReporter;->getInstance()Landroid/app/DexLoadReporter;
-HSPLandroid/app/DexLoadReporter;->isSecondaryDexFile(Ljava/lang/String;[Ljava/lang/String;)Z
-HSPLandroid/app/DexLoadReporter;->notifyPackageManager(Ljava/util/Map;)V
-HSPLandroid/app/DexLoadReporter;->registerAppDataDir(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/DexLoadReporter;->registerSecondaryDexForProfiling(Ljava/lang/String;[Ljava/lang/String;)V
-HSPLandroid/app/DexLoadReporter;->registerSecondaryDexForProfiling(Ljava/util/Set;)V
-HSPLandroid/app/DexLoadReporter;->report(Ljava/util/Map;)V
-HSPLandroid/app/Dialog$ListenersHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/app/Dialog;-><init>(Landroid/content/Context;I)V
-HSPLandroid/app/Dialog;-><init>(Landroid/content/Context;IZ)V
-HSPLandroid/app/Dialog;->cancel()V
-HSPLandroid/app/Dialog;->dismiss()V
-HSPLandroid/app/Dialog;->dismissDialog()V
-HSPLandroid/app/Dialog;->dispatchOnCreate(Landroid/os/Bundle;)V
-HSPLandroid/app/Dialog;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/app/Dialog;->findViewById(I)Landroid/view/View;
-HSPLandroid/app/Dialog;->getContext()Landroid/content/Context;
-HSPLandroid/app/Dialog;->getWindow()Landroid/view/Window;
-HSPLandroid/app/Dialog;->hide()V
-HSPLandroid/app/Dialog;->onAttachedToWindow()V
-HSPLandroid/app/Dialog;->onContentChanged()V
-HSPLandroid/app/Dialog;->onCreate(Landroid/os/Bundle;)V
-HSPLandroid/app/Dialog;->onDetachedFromWindow()V
-HSPLandroid/app/Dialog;->onStart()V
-HSPLandroid/app/Dialog;->onStop()V
-HSPLandroid/app/Dialog;->onTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/app/Dialog;->onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/app/Dialog;->onWindowFocusChanged(Z)V
-HSPLandroid/app/Dialog;->setCancelable(Z)V
-HSPLandroid/app/Dialog;->setCanceledOnTouchOutside(Z)V
-HSPLandroid/app/Dialog;->setContentView(Landroid/view/View;)V
-HSPLandroid/app/Dialog;->setOnCancelListener(Landroid/content/DialogInterface$OnCancelListener;)V
-HSPLandroid/app/Dialog;->setOnDismissListener(Landroid/content/DialogInterface$OnDismissListener;)V
-HSPLandroid/app/Dialog;->setOnShowListener(Landroid/content/DialogInterface$OnShowListener;)V
-HSPLandroid/app/Dialog;->setOwnerActivity(Landroid/app/Activity;)V
-HSPLandroid/app/Dialog;->show()V
-HSPLandroid/app/DownloadManager$CursorTranslator;-><init>(Landroid/database/Cursor;Landroid/net/Uri;Z)V
-HSPLandroid/app/DownloadManager$Query;-><init>()V
-HSPLandroid/app/DownloadManager$Query;->joinStrings(Ljava/lang/String;Ljava/lang/Iterable;)Ljava/lang/String;
-HSPLandroid/app/DownloadManager$Query;->runQuery(Landroid/content/ContentResolver;[Ljava/lang/String;Landroid/net/Uri;)Landroid/database/Cursor;
-HSPLandroid/app/DownloadManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/app/DownloadManager;->query(Landroid/app/DownloadManager$Query;)Landroid/database/Cursor;
-HSPLandroid/app/DownloadManager;->query(Landroid/app/DownloadManager$Query;[Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/app/EventLogTags;->writeWmOnTopResumedGainedCalled(ILjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/FeatureFlagsImpl;->notificationChannelVibrationEffectApi()Z
-HSPLandroid/app/Fragment$1;-><init>(Landroid/app/Fragment;)V
-HSPLandroid/app/Fragment;-><init>()V
-HSPLandroid/app/Fragment;->equals(Ljava/lang/Object;)Z
-HSPLandroid/app/Fragment;->getActivity()Landroid/app/Activity;
-HSPLandroid/app/Fragment;->getAnimatingAway()Landroid/animation/Animator;
-HSPLandroid/app/Fragment;->getChildFragmentManager()Landroid/app/FragmentManager;
-HSPLandroid/app/Fragment;->getContext()Landroid/content/Context;
-HSPLandroid/app/Fragment;->getNextAnim()I
-HSPLandroid/app/Fragment;->getNextTransition()I
-HSPLandroid/app/Fragment;->getNextTransitionStyle()I
-HSPLandroid/app/Fragment;->getView()Landroid/view/View;
-HSPLandroid/app/Fragment;->initState()V
-HSPLandroid/app/Fragment;->instantiate(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroid/app/Fragment;
-HSPLandroid/app/Fragment;->instantiateChildFragmentManager()V
-HSPLandroid/app/Fragment;->noteStateNotSaved()V
-HSPLandroid/app/Fragment;->onActivityCreated(Landroid/os/Bundle;)V
-HSPLandroid/app/Fragment;->onAttach(Landroid/app/Activity;)V
-HSPLandroid/app/Fragment;->onAttach(Landroid/content/Context;)V
-HSPLandroid/app/Fragment;->onConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/app/Fragment;->onCreate(Landroid/os/Bundle;)V
-HSPLandroid/app/Fragment;->onCreateAnimator(IZI)Landroid/animation/Animator;
-HSPLandroid/app/Fragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View;
-HSPLandroid/app/Fragment;->onDestroy()V
-HSPLandroid/app/Fragment;->onDestroyView()V
-HSPLandroid/app/Fragment;->onDetach()V
-HSPLandroid/app/Fragment;->onGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater;
-HSPLandroid/app/Fragment;->onLowMemory()V
-HSPLandroid/app/Fragment;->onPause()V
-HSPLandroid/app/Fragment;->onResume()V
-HSPLandroid/app/Fragment;->onSaveInstanceState(Landroid/os/Bundle;)V
-HSPLandroid/app/Fragment;->onStart()V
-HSPLandroid/app/Fragment;->onStop()V
-HSPLandroid/app/Fragment;->onTrimMemory(I)V
-HSPLandroid/app/Fragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V
-HSPLandroid/app/Fragment;->onViewStateRestored(Landroid/os/Bundle;)V
-HSPLandroid/app/Fragment;->performActivityCreated(Landroid/os/Bundle;)V
-HSPLandroid/app/Fragment;->performConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/app/Fragment;->performCreate(Landroid/os/Bundle;)V
-HSPLandroid/app/Fragment;->performCreateOptionsMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)Z
-HSPLandroid/app/Fragment;->performCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View;
-HSPLandroid/app/Fragment;->performDestroy()V
-HSPLandroid/app/Fragment;->performDestroyView()V
-HSPLandroid/app/Fragment;->performDetach()V
-HSPLandroid/app/Fragment;->performGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater;
-HSPLandroid/app/Fragment;->performLowMemory()V
-HSPLandroid/app/Fragment;->performPause()V
-HSPLandroid/app/Fragment;->performPrepareOptionsMenu(Landroid/view/Menu;)Z
-HSPLandroid/app/Fragment;->performResume()V
-HSPLandroid/app/Fragment;->performSaveInstanceState(Landroid/os/Bundle;)V
-HSPLandroid/app/Fragment;->performStart()V
-HSPLandroid/app/Fragment;->performStop()V
-HSPLandroid/app/Fragment;->performTrimMemory(I)V
-HSPLandroid/app/Fragment;->restoreChildFragmentState(Landroid/os/Bundle;Z)V
-HSPLandroid/app/Fragment;->restoreViewState(Landroid/os/Bundle;)V
-HSPLandroid/app/Fragment;->setIndex(ILandroid/app/Fragment;)V
-HSPLandroid/app/Fragment;->setNextAnim(I)V
-HSPLandroid/app/Fragment;->setNextTransition(II)V
-HSPLandroid/app/FragmentContainer;-><init>()V
-HSPLandroid/app/FragmentContainer;->instantiate(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroid/app/Fragment;
-HSPLandroid/app/FragmentController;-><init>(Landroid/app/FragmentHostCallback;)V
-HSPLandroid/app/FragmentController;->attachHost(Landroid/app/Fragment;)V
-HSPLandroid/app/FragmentController;->createController(Landroid/app/FragmentHostCallback;)Landroid/app/FragmentController;
-HSPLandroid/app/FragmentController;->dispatchActivityCreated()V
-HSPLandroid/app/FragmentController;->dispatchConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/app/FragmentController;->dispatchCreate()V
-HSPLandroid/app/FragmentController;->dispatchCreateOptionsMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)Z
-HSPLandroid/app/FragmentController;->dispatchDestroy()V
-HSPLandroid/app/FragmentController;->dispatchLowMemory()V
-HSPLandroid/app/FragmentController;->dispatchPause()V
-HSPLandroid/app/FragmentController;->dispatchPrepareOptionsMenu(Landroid/view/Menu;)Z
-HSPLandroid/app/FragmentController;->dispatchResume()V
-HSPLandroid/app/FragmentController;->dispatchStart()V
-HSPLandroid/app/FragmentController;->dispatchStop()V
-HSPLandroid/app/FragmentController;->dispatchTrimMemory(I)V
-HSPLandroid/app/FragmentController;->doLoaderDestroy()V
-HSPLandroid/app/FragmentController;->doLoaderStart()V
-HSPLandroid/app/FragmentController;->doLoaderStop(Z)V
-HSPLandroid/app/FragmentController;->execPendingActions()Z
-HSPLandroid/app/FragmentController;->getFragmentManager()Landroid/app/FragmentManager;
-HSPLandroid/app/FragmentController;->noteStateNotSaved()V
-HSPLandroid/app/FragmentController;->reportLoaderStart()V
-HSPLandroid/app/FragmentController;->restoreAllState(Landroid/os/Parcelable;Landroid/app/FragmentManagerNonConfig;)V
-HSPLandroid/app/FragmentController;->retainLoaderNonConfig()Landroid/util/ArrayMap;
-HSPLandroid/app/FragmentController;->retainNestedNonConfig()Landroid/app/FragmentManagerNonConfig;
-HSPLandroid/app/FragmentController;->saveAllState()Landroid/os/Parcelable;
-HSPLandroid/app/FragmentHostCallback;-><init>(Landroid/app/Activity;)V
-HSPLandroid/app/FragmentHostCallback;-><init>(Landroid/app/Activity;Landroid/content/Context;Landroid/os/Handler;I)V
-HSPLandroid/app/FragmentHostCallback;->doLoaderDestroy()V
-HSPLandroid/app/FragmentHostCallback;->doLoaderStart()V
-HSPLandroid/app/FragmentHostCallback;->doLoaderStop(Z)V
-HSPLandroid/app/FragmentHostCallback;->getActivity()Landroid/app/Activity;
-HSPLandroid/app/FragmentHostCallback;->getContext()Landroid/content/Context;
-HSPLandroid/app/FragmentHostCallback;->getFragmentManagerImpl()Landroid/app/FragmentManagerImpl;
-HSPLandroid/app/FragmentHostCallback;->getHandler()Landroid/os/Handler;
-HSPLandroid/app/FragmentHostCallback;->getLoaderManager(Ljava/lang/String;ZZ)Landroid/app/LoaderManagerImpl;
-HSPLandroid/app/FragmentHostCallback;->getRetainLoaders()Z
-HSPLandroid/app/FragmentHostCallback;->inactivateFragment(Ljava/lang/String;)V
-HSPLandroid/app/FragmentHostCallback;->reportLoaderStart()V
-HSPLandroid/app/FragmentHostCallback;->retainLoaderNonConfig()Landroid/util/ArrayMap;
-HSPLandroid/app/FragmentManager;-><init>()V
-HSPLandroid/app/FragmentManagerImpl$1;-><init>(Landroid/app/FragmentManagerImpl;)V
-HSPLandroid/app/FragmentManagerImpl;-><init>()V
-HSPLandroid/app/FragmentManagerImpl;->addAddedFragments(Landroid/util/ArraySet;)V
-HSPLandroid/app/FragmentManagerImpl;->addFragment(Landroid/app/Fragment;Z)V
-HSPLandroid/app/FragmentManagerImpl;->attachController(Landroid/app/FragmentHostCallback;Landroid/app/FragmentContainer;Landroid/app/Fragment;)V
-HSPLandroid/app/FragmentManagerImpl;->beginTransaction()Landroid/app/FragmentTransaction;
-HSPLandroid/app/FragmentManagerImpl;->burpActive()V
-HSPLandroid/app/FragmentManagerImpl;->checkStateLoss()V
-HSPLandroid/app/FragmentManagerImpl;->cleanupExec()V
-HSPLandroid/app/FragmentManagerImpl;->dispatchActivityCreated()V
-HSPLandroid/app/FragmentManagerImpl;->dispatchCreate()V
-HSPLandroid/app/FragmentManagerImpl;->dispatchCreateOptionsMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)Z
-HSPLandroid/app/FragmentManagerImpl;->dispatchMoveToState(I)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentActivityCreated(Landroid/app/Fragment;Landroid/os/Bundle;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentAttached(Landroid/app/Fragment;Landroid/content/Context;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentCreated(Landroid/app/Fragment;Landroid/os/Bundle;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentDestroyed(Landroid/app/Fragment;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentDetached(Landroid/app/Fragment;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentPaused(Landroid/app/Fragment;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentPreAttached(Landroid/app/Fragment;Landroid/content/Context;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentPreCreated(Landroid/app/Fragment;Landroid/os/Bundle;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentResumed(Landroid/app/Fragment;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentSaveInstanceState(Landroid/app/Fragment;Landroid/os/Bundle;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentStarted(Landroid/app/Fragment;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentStopped(Landroid/app/Fragment;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentViewCreated(Landroid/app/Fragment;Landroid/view/View;Landroid/os/Bundle;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentViewDestroyed(Landroid/app/Fragment;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchPause()V
-HSPLandroid/app/FragmentManagerImpl;->dispatchPrepareOptionsMenu(Landroid/view/Menu;)Z
-HSPLandroid/app/FragmentManagerImpl;->dispatchResume()V
-HSPLandroid/app/FragmentManagerImpl;->dispatchStart()V
-HSPLandroid/app/FragmentManagerImpl;->dispatchStop()V
-HSPLandroid/app/FragmentManagerImpl;->doPendingDeferredStart()V
-HSPLandroid/app/FragmentManagerImpl;->endAnimatingAwayFragments()V
-HSPLandroid/app/FragmentManagerImpl;->enqueueAction(Landroid/app/FragmentManagerImpl$OpGenerator;Z)V
-HSPLandroid/app/FragmentManagerImpl;->ensureExecReady(Z)V
-HSPLandroid/app/FragmentManagerImpl;->ensureInflatedFragmentView(Landroid/app/Fragment;)V
-HSPLandroid/app/FragmentManagerImpl;->execPendingActions()Z
-HSPLandroid/app/FragmentManagerImpl;->executeOps(Ljava/util/ArrayList;Ljava/util/ArrayList;II)V
-HSPLandroid/app/FragmentManagerImpl;->executeOpsTogether(Ljava/util/ArrayList;Ljava/util/ArrayList;II)V
-HSPLandroid/app/FragmentManagerImpl;->executePendingTransactions()Z
-HSPLandroid/app/FragmentManagerImpl;->executePostponedTransaction(Ljava/util/ArrayList;Ljava/util/ArrayList;)V
-HSPLandroid/app/FragmentManagerImpl;->findFragmentByTag(Ljava/lang/String;)Landroid/app/Fragment;
-HSPLandroid/app/FragmentManagerImpl;->findFragmentUnder(Landroid/app/Fragment;)Landroid/app/Fragment;
-HSPLandroid/app/FragmentManagerImpl;->forcePostponedTransactions()V
-HSPLandroid/app/FragmentManagerImpl;->generateOpsForPendingActions(Ljava/util/ArrayList;Ljava/util/ArrayList;)Z
-HSPLandroid/app/FragmentManagerImpl;->getLayoutInflaterFactory()Landroid/view/LayoutInflater$Factory2;
-HSPLandroid/app/FragmentManagerImpl;->getPrimaryNavigationFragment()Landroid/app/Fragment;
-HSPLandroid/app/FragmentManagerImpl;->getTargetSdk()I
-HSPLandroid/app/FragmentManagerImpl;->isStateSaved()Z
-HSPLandroid/app/FragmentManagerImpl;->loadAnimator(Landroid/app/Fragment;IZI)Landroid/animation/Animator;
-HSPLandroid/app/FragmentManagerImpl;->makeActive(Landroid/app/Fragment;)V
-HSPLandroid/app/FragmentManagerImpl;->makeInactive(Landroid/app/Fragment;)V
-HSPLandroid/app/FragmentManagerImpl;->makeRemovedFragmentsInvisible(Landroid/util/ArraySet;)V
-HSPLandroid/app/FragmentManagerImpl;->moveFragmentToExpectedState(Landroid/app/Fragment;)V
-HSPLandroid/app/FragmentManagerImpl;->moveToState(IZ)V
-HSPLandroid/app/FragmentManagerImpl;->moveToState(Landroid/app/Fragment;IIIZ)V
-HSPLandroid/app/FragmentManagerImpl;->noteStateNotSaved()V
-HSPLandroid/app/FragmentManagerImpl;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroid/app/FragmentManagerImpl;->performPendingDeferredStart(Landroid/app/Fragment;)V
-HSPLandroid/app/FragmentManagerImpl;->popBackStackImmediate()Z
-HSPLandroid/app/FragmentManagerImpl;->popBackStackImmediate(Ljava/lang/String;II)Z
-HSPLandroid/app/FragmentManagerImpl;->popBackStackState(Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/lang/String;II)Z
-HSPLandroid/app/FragmentManagerImpl;->postponePostponableTransactions(Ljava/util/ArrayList;Ljava/util/ArrayList;IILandroid/util/ArraySet;)I
-HSPLandroid/app/FragmentManagerImpl;->removeRedundantOperationsAndExecute(Ljava/util/ArrayList;Ljava/util/ArrayList;)V
-HSPLandroid/app/FragmentManagerImpl;->restoreAllState(Landroid/os/Parcelable;Landroid/app/FragmentManagerNonConfig;)V
-HSPLandroid/app/FragmentManagerImpl;->saveAllState()Landroid/os/Parcelable;
-HSPLandroid/app/FragmentManagerImpl;->saveFragmentBasicState(Landroid/app/Fragment;)Landroid/os/Bundle;
-HSPLandroid/app/FragmentManagerImpl;->saveNonConfig()V
-HSPLandroid/app/FragmentManagerImpl;->scheduleCommit()V
-HSPLandroid/app/FragmentManagerImpl;->setRetaining(Landroid/app/FragmentManagerNonConfig;)V
-HSPLandroid/app/FragmentManagerImpl;->startPendingDeferredFragments()V
-HSPLandroid/app/FragmentManagerState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/FragmentManagerState;
-HSPLandroid/app/FragmentManagerState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/FragmentManagerState;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/FragmentManagerState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/FragmentState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/FragmentState;
-HSPLandroid/app/FragmentState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/FragmentState$1;->newArray(I)[Landroid/app/FragmentState;
-HSPLandroid/app/FragmentState$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/app/FragmentState;-><init>(Landroid/app/Fragment;)V
-HSPLandroid/app/FragmentState;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/FragmentState;->instantiate(Landroid/app/FragmentHostCallback;Landroid/app/FragmentContainer;Landroid/app/Fragment;Landroid/app/FragmentManagerNonConfig;)Landroid/app/Fragment;
-HSPLandroid/app/FragmentState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/FragmentTransaction;-><init>()V
-HSPLandroid/app/FragmentTransition;->addToFirstInLastOut(Landroid/app/BackStackRecord;Landroid/app/BackStackRecord$Op;Landroid/util/SparseArray;ZZ)V
-HSPLandroid/app/FragmentTransition;->calculateFragments(Landroid/app/BackStackRecord;Landroid/util/SparseArray;Z)V
-HSPLandroid/app/FragmentTransition;->startTransitions(Landroid/app/FragmentManagerImpl;Ljava/util/ArrayList;Ljava/util/ArrayList;IIZ)V
-HSPLandroid/app/GameManager;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
-HSPLandroid/app/GameManager;->isAngleEnabled(Ljava/lang/String;)Z
-HSPLandroid/app/IActivityClientController$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->activityDestroyed(Landroid/os/IBinder;)V
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->activityIdle(Landroid/os/IBinder;Landroid/content/res/Configuration;Z)V
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->activityPaused(Landroid/os/IBinder;)V
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->activityResumed(Landroid/os/IBinder;Z)V
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->activityStopped(Landroid/os/IBinder;Landroid/os/Bundle;Landroid/os/PersistableBundle;Ljava/lang/CharSequence;)V
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->activityTopResumedStateLost()V
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->finishActivity(Landroid/os/IBinder;ILandroid/content/Intent;I)Z
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->getCallingActivity(Landroid/os/IBinder;)Landroid/content/ComponentName;
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->getDisplayId(Landroid/os/IBinder;)I
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->getTaskForActivity(Landroid/os/IBinder;Z)I
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->overridePendingTransition(Landroid/os/IBinder;Ljava/lang/String;III)V
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->reportActivityFullyDrawn(Landroid/os/IBinder;Z)V
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->reportSizeConfigurations(Landroid/os/IBinder;Landroid/window/SizeConfigurationBuckets;)V
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->setRequestedOrientation(Landroid/os/IBinder;I)V
-HSPLandroid/app/IActivityClientController$Stub$Proxy;->setTaskDescription(Landroid/os/IBinder;Landroid/app/ActivityManager$TaskDescription;)V
-HSPLandroid/app/IActivityClientController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IActivityClientController;
-HSPLandroid/app/IActivityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->addPackageDependency(Ljava/lang/String;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->attachApplication(Landroid/app/IApplicationThread;J)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->backupAgentCreated(Ljava/lang/String;Landroid/os/IBinder;I)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->bindServiceInstance(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;JLjava/lang/String;Ljava/lang/String;I)I
-HSPLandroid/app/IActivityManager$Stub$Proxy;->broadcastIntentWithFeature(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/os/Bundle;ZZI)I
-HSPLandroid/app/IActivityManager$Stub$Proxy;->cancelIntentSender(Landroid/content/IIntentSender;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->checkPermission(Ljava/lang/String;II)I
-HSPLandroid/app/IActivityManager$Stub$Proxy;->checkPermissionForDevice(Ljava/lang/String;III)I+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/app/IActivityManager$Stub$Proxy;Landroid/app/IActivityManager$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->checkUriPermission(Landroid/net/Uri;IIIILandroid/os/IBinder;)I
-HSPLandroid/app/IActivityManager$Stub$Proxy;->finishAttachApplication(J)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->finishReceiver(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/Bundle;ZI)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->getContentProvider(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;IZ)Landroid/app/ContentProviderHolder;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->getCurrentUser()Landroid/content/pm/UserInfo;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->getCurrentUserId()I
-HSPLandroid/app/IActivityManager$Stub$Proxy;->getHistoricalProcessExitReasons(Ljava/lang/String;III)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->getInfoForIntentSender(Landroid/content/IIntentSender;)Landroid/app/ActivityManager$PendingIntentInfo;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->getIntentSenderWithFeature(ILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;I)Landroid/content/IIntentSender;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->getMemoryInfo(Landroid/app/ActivityManager$MemoryInfo;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->getMyMemoryState(Landroid/app/ActivityManager$RunningAppProcessInfo;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->getProcessMemoryInfo([I)[Landroid/os/Debug$MemoryInfo;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->getRunningAppProcesses()Ljava/util/List;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->getServices(II)Ljava/util/List;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->grantUriPermission(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/net/Uri;II)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->handleApplicationStrictModeViolation(Landroid/os/IBinder;ILandroid/os/StrictMode$ViolationInfo;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->handleApplicationWtf(Landroid/os/IBinder;Ljava/lang/String;ZLandroid/app/ApplicationErrorReport$ParcelableCrashInfo;I)Z
-HSPLandroid/app/IActivityManager$Stub$Proxy;->isBackgroundRestricted(Ljava/lang/String;)Z
-HSPLandroid/app/IActivityManager$Stub$Proxy;->isIntentSenderAnActivity(Landroid/content/IIntentSender;)Z
-HSPLandroid/app/IActivityManager$Stub$Proxy;->isUserAMonkey()Z
-HSPLandroid/app/IActivityManager$Stub$Proxy;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->publishService(Landroid/os/IBinder;Landroid/content/Intent;Landroid/os/IBinder;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->refContentProvider(Landroid/os/IBinder;II)Z
-HSPLandroid/app/IActivityManager$Stub$Proxy;->registerReceiverWithFeature(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/content/IIntentReceiver;Landroid/content/IntentFilter;Ljava/lang/String;II)Landroid/content/Intent;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->registerStrictModeCallback(Landroid/os/IBinder;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->registerUidObserver(Landroid/app/IUidObserver;IILjava/lang/String;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->removeContentProvider(Landroid/os/IBinder;Z)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->revokeUriPermission(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/net/Uri;II)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->serviceDoneExecuting(Landroid/os/IBinder;IIILandroid/content/Intent;)V+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/app/IActivityManager$Stub$Proxy;Landroid/app/IActivityManager$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->setRenderThread(I)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->setServiceForeground(Landroid/content/ComponentName;Landroid/os/IBinder;ILandroid/app/Notification;II)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->startService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;I)Landroid/content/ComponentName;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->stopService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;I)I
-HSPLandroid/app/IActivityManager$Stub$Proxy;->stopServiceToken(Landroid/content/ComponentName;Landroid/os/IBinder;I)Z
-HSPLandroid/app/IActivityManager$Stub$Proxy;->unbindFinished(Landroid/os/IBinder;Landroid/content/Intent;Z)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->unbindService(Landroid/app/IServiceConnection;)Z
-HSPLandroid/app/IActivityManager$Stub$Proxy;->unregisterReceiver(Landroid/content/IIntentReceiver;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->unstableProviderDied(Landroid/os/IBinder;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->waitForNetworkStateUpdate(J)V
-HSPLandroid/app/IActivityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IActivityManager;
-HSPLandroid/app/IActivityManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/app/IActivityTaskManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->getActivityClientController()Landroid/app/IActivityClientController;
-HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->getAppTasks(Ljava/lang/String;)Ljava/util/List;
-HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->getDeviceConfigurationInfo()Landroid/content/pm/ConfigurationInfo;
-HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->getLockTaskModeState()I
-HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->getRecentTasks(III)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->reportAssistContextExtras(Landroid/os/IBinder;Landroid/os/Bundle;Landroid/app/assist/AssistStructure;Landroid/app/assist/AssistContent;Landroid/net/Uri;)V
-HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->startActivity(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;)I
-HSPLandroid/app/IActivityTaskManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IActivityTaskManager;
-HSPLandroid/app/IAlarmCompleteListener$Stub$Proxy;->alarmComplete(Landroid/os/IBinder;)V
-HSPLandroid/app/IAlarmListener$Stub;-><init>()V
-HSPLandroid/app/IAlarmListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IAlarmListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/app/IAlarmManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/IAlarmManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IAlarmManager$Stub$Proxy;->getNextAlarmClock(I)Landroid/app/AlarmManager$AlarmClockInfo;
-HSPLandroid/app/IAlarmManager$Stub$Proxy;->remove(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)V
-HSPLandroid/app/IAlarmManager$Stub$Proxy;->set(Ljava/lang/String;IJJJILandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;Landroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;)V
-HSPLandroid/app/IAlarmManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IAlarmManager;
-HSPLandroid/app/IAppTask$Stub$Proxy;->getTaskInfo()Landroid/app/ActivityManager$RecentTaskInfo;
-HSPLandroid/app/IAppTraceRetriever$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/IAppTraceRetriever$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IAppTraceRetriever;
-HSPLandroid/app/IApplicationThread$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/IApplicationThread$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IApplicationThread$Stub;-><init>()V
-HSPLandroid/app/IApplicationThread$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IApplicationThread$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IApplicationThread;
-HSPLandroid/app/IApplicationThread$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
-HSPLandroid/app/IApplicationThread$Stub;->getMaxTransactionId()I
-HSPLandroid/app/IApplicationThread$Stub;->getTransactionName(I)Ljava/lang/String;
-HSPLandroid/app/IApplicationThread$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/app/IBackupAgent$Stub;-><init>()V
-HSPLandroid/app/IBackupAgent$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IBackupAgent$Stub;->getMaxTransactionId()I
-HSPLandroid/app/IBackupAgent$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/app/IGameManagerService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/IGameManagerService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IGameManagerService$Stub$Proxy;->isAngleEnabled(Ljava/lang/String;I)Z
-HSPLandroid/app/IGameManagerService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IGameManagerService;
-HSPLandroid/app/IInstrumentationWatcher$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IInstrumentationWatcher;
-HSPLandroid/app/ILocalWallpaperColorConsumer$Stub;-><init>()V
-HSPLandroid/app/INotificationManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/INotificationManager$Stub$Proxy;->areNotificationsEnabled(Ljava/lang/String;)Z
-HSPLandroid/app/INotificationManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/INotificationManager$Stub$Proxy;->cancelAllNotifications(Ljava/lang/String;I)V
-HSPLandroid/app/INotificationManager$Stub$Proxy;->cancelNotificationWithTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V
-HSPLandroid/app/INotificationManager$Stub$Proxy;->createNotificationChannelGroups(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
-HSPLandroid/app/INotificationManager$Stub$Proxy;->createNotificationChannels(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
-HSPLandroid/app/INotificationManager$Stub$Proxy;->deleteNotificationChannel(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/INotificationManager$Stub$Proxy;->enqueueNotificationWithTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/app/Notification;I)V
-HSPLandroid/app/INotificationManager$Stub$Proxy;->finishToken(Ljava/lang/String;Landroid/os/IBinder;)V
-HSPLandroid/app/INotificationManager$Stub$Proxy;->getActiveNotificationsFromListener(Landroid/service/notification/INotificationListener;[Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/app/INotificationManager$Stub$Proxy;->getAppActiveNotifications(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/app/INotificationManager$Stub$Proxy;->getNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannel;
-HSPLandroid/app/INotificationManager$Stub$Proxy;->getNotificationChannelGroup(Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannelGroup;
-HSPLandroid/app/INotificationManager$Stub$Proxy;->getNotificationChannelGroups(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/app/INotificationManager$Stub$Proxy;->getNotificationChannels(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/app/INotificationManager$Stub$Proxy;->getNotificationPolicy(Ljava/lang/String;)Landroid/app/NotificationManager$Policy;
-HSPLandroid/app/INotificationManager$Stub$Proxy;->getZenMode()I
-HSPLandroid/app/INotificationManager$Stub$Proxy;->getZenRules()Ljava/util/List;
-HSPLandroid/app/INotificationManager$Stub$Proxy;->isNotificationPolicyAccessGranted(Ljava/lang/String;)Z
-HSPLandroid/app/INotificationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/INotificationManager;
-HSPLandroid/app/IServiceConnection$Stub;-><init>()V
-HSPLandroid/app/IServiceConnection$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IServiceConnection$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
-HSPLandroid/app/IServiceConnection$Stub;->getMaxTransactionId()I
-HSPLandroid/app/IServiceConnection$Stub;->getTransactionName(I)Ljava/lang/String;
-HSPLandroid/app/IServiceConnection$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/app/ITaskStackListener$Stub;-><init>()V
-HSPLandroid/app/ITaskStackListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/ITaskStackListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/app/IUiAutomationConnection$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IUiAutomationConnection;
-HSPLandroid/app/IUiModeManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/IUiModeManager$Stub$Proxy;->addCallback(Landroid/app/IUiModeManagerCallback;)V
-HSPLandroid/app/IUiModeManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IUiModeManager$Stub$Proxy;->getContrast()F
-HSPLandroid/app/IUiModeManager$Stub$Proxy;->getCurrentModeType()I
-HSPLandroid/app/IUiModeManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IUiModeManager;
-HSPLandroid/app/IUiModeManagerCallback$Stub;-><init>()V
-HSPLandroid/app/IUiModeManagerCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IUidObserver$Stub;-><init>()V
-HSPLandroid/app/IUidObserver$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IUidObserver$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/app/IUnsafeIntentStrictModeCallback$Stub;-><init>()V
-HSPLandroid/app/IUriGrantsManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IUriGrantsManager$Stub$Proxy;->getUriPermissions(Ljava/lang/String;ZZ)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/app/IUserSwitchObserver$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IWallpaperManager$Stub$Proxy;->getWallpaperColors(III)Landroid/app/WallpaperColors;
-HSPLandroid/app/IWallpaperManager$Stub$Proxy;->getWallpaperInfo(I)Landroid/app/WallpaperInfo;
-HSPLandroid/app/IWallpaperManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IWallpaperManager;
-HSPLandroid/app/IWallpaperManagerCallback$Stub;-><init>()V
-HSPLandroid/app/IWallpaperManagerCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/Instrumentation;-><init>()V
-HSPLandroid/app/Instrumentation;->basicInit(Landroid/app/ActivityThread;)V
-HSPLandroid/app/Instrumentation;->callActivityOnCreate(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Instrumentation;->callActivityOnDestroy(Landroid/app/Activity;)V
-HSPLandroid/app/Instrumentation;->callActivityOnNewIntent(Landroid/app/Activity;Landroid/content/Intent;)V
-HSPLandroid/app/Instrumentation;->callActivityOnNewIntent(Landroid/app/Activity;Lcom/android/internal/content/ReferrerIntent;)V
-HSPLandroid/app/Instrumentation;->callActivityOnPause(Landroid/app/Activity;)V
-HSPLandroid/app/Instrumentation;->callActivityOnPictureInPictureRequested(Landroid/app/Activity;)V
-HSPLandroid/app/Instrumentation;->callActivityOnPostCreate(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Instrumentation;->callActivityOnRestart(Landroid/app/Activity;)V
-HSPLandroid/app/Instrumentation;->callActivityOnRestoreInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Instrumentation;->callActivityOnResume(Landroid/app/Activity;)V
-HSPLandroid/app/Instrumentation;->callActivityOnSaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroid/app/Instrumentation;->callActivityOnStart(Landroid/app/Activity;)V
-HSPLandroid/app/Instrumentation;->callActivityOnStop(Landroid/app/Activity;)V
-HSPLandroid/app/Instrumentation;->callActivityOnUserLeaving(Landroid/app/Activity;)V
-HSPLandroid/app/Instrumentation;->callApplicationOnCreate(Landroid/app/Application;)V
-HSPLandroid/app/Instrumentation;->checkStartActivityResult(ILjava/lang/Object;)V
-HSPLandroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Landroid/app/Activity;Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/Instrumentation$ActivityResult;
-HSPLandroid/app/Instrumentation;->getFactory(Ljava/lang/String;)Landroid/app/AppComponentFactory;
-HSPLandroid/app/Instrumentation;->isInstrumenting()Z
-HSPLandroid/app/Instrumentation;->newActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;
-HSPLandroid/app/Instrumentation;->newApplication(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Context;)Landroid/app/Application;
-HSPLandroid/app/Instrumentation;->notifyStartActivityResult(ILandroid/os/Bundle;)V
-HSPLandroid/app/Instrumentation;->onCreate(Landroid/os/Bundle;)V
-HSPLandroid/app/Instrumentation;->onEnterAnimationComplete()V
-HSPLandroid/app/Instrumentation;->postPerformCreate(Landroid/app/Activity;)V
-HSPLandroid/app/Instrumentation;->prePerformCreate(Landroid/app/Activity;)V
-HSPLandroid/app/IntentReceiverLeaked;-><init>(Ljava/lang/String;)V
-HSPLandroid/app/IntentService$ServiceHandler;-><init>(Landroid/app/IntentService;Landroid/os/Looper;)V
-HSPLandroid/app/IntentService$ServiceHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/app/IntentService;-><init>(Ljava/lang/String;)V
-HSPLandroid/app/IntentService;->onCreate()V
-HSPLandroid/app/IntentService;->onDestroy()V
-HSPLandroid/app/IntentService;->onStart(Landroid/content/Intent;I)V
-HSPLandroid/app/IntentService;->onStartCommand(Landroid/content/Intent;II)I
-HSPLandroid/app/JobSchedulerImpl;-><init>(Landroid/content/Context;Landroid/app/job/IJobScheduler;)V
-HSPLandroid/app/JobSchedulerImpl;-><init>(Landroid/content/Context;Landroid/app/job/IJobScheduler;Ljava/lang/String;)V
-HSPLandroid/app/JobSchedulerImpl;->cancel(I)V
-HSPLandroid/app/JobSchedulerImpl;->enqueue(Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;)I
-HSPLandroid/app/JobSchedulerImpl;->getAllPendingJobs()Ljava/util/List;
-HSPLandroid/app/JobSchedulerImpl;->getPendingJob(I)Landroid/app/job/JobInfo;
-HSPLandroid/app/JobSchedulerImpl;->schedule(Landroid/app/job/JobInfo;)I
-HSPLandroid/app/JobSchedulerImpl;->scheduleAsPackage(Landroid/app/job/JobInfo;Ljava/lang/String;ILjava/lang/String;)I
-HSPLandroid/app/KeyguardManager$1;-><init>(Landroid/app/KeyguardManager;)V
-HSPLandroid/app/KeyguardManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/app/KeyguardManager;->inKeyguardRestrictedInputMode()Z
-HSPLandroid/app/KeyguardManager;->isDeviceLocked()Z
-HSPLandroid/app/KeyguardManager;->isDeviceLocked(I)Z
-HSPLandroid/app/KeyguardManager;->isDeviceSecure()Z
-HSPLandroid/app/KeyguardManager;->isDeviceSecure(I)Z
-HSPLandroid/app/KeyguardManager;->isKeyguardLocked()Z
-HSPLandroid/app/KeyguardManager;->isKeyguardSecure()Z
-HSPLandroid/app/LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0;-><init>(Landroid/app/LoadedApk$ReceiverDispatcher$Args;)V
-HSPLandroid/app/LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/app/LoadedApk$ReceiverDispatcher$Args;-><init>(Landroid/app/LoadedApk$ReceiverDispatcher;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZZIILjava/lang/String;)V
-HSPLandroid/app/LoadedApk$ReceiverDispatcher$Args;->getRunnable()Ljava/lang/Runnable;
-HSPLandroid/app/LoadedApk$ReceiverDispatcher$Args;->lambda$getRunnable$0()V
-HSPLandroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
-HSPLandroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZZIILjava/lang/String;)V
-HSPLandroid/app/LoadedApk$ReceiverDispatcher;-><init>(Landroid/app/IApplicationThread;Landroid/content/BroadcastReceiver;Landroid/content/Context;Landroid/os/Handler;Landroid/app/Instrumentation;Z)V
-HSPLandroid/app/LoadedApk$ReceiverDispatcher;->getIIntentReceiver()Landroid/content/IIntentReceiver;
-HSPLandroid/app/LoadedApk$ReceiverDispatcher;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZZIILjava/lang/String;)V
-HSPLandroid/app/LoadedApk$ReceiverDispatcher;->validate(Landroid/content/Context;Landroid/os/Handler;)V
-HSPLandroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo;-><init>()V
-HSPLandroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo;-><init>(Landroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo-IA;)V
-HSPLandroid/app/LoadedApk$ServiceDispatcher$DeathMonitor;-><init>(Landroid/app/LoadedApk$ServiceDispatcher;Landroid/content/ComponentName;Landroid/os/IBinder;)V
-HSPLandroid/app/LoadedApk$ServiceDispatcher$DeathMonitor;->binderDied()V
-HSPLandroid/app/LoadedApk$ServiceDispatcher$InnerConnection;-><init>(Landroid/app/LoadedApk$ServiceDispatcher;)V
-HSPLandroid/app/LoadedApk$ServiceDispatcher$InnerConnection;->connected(Landroid/content/ComponentName;Landroid/os/IBinder;Z)V
-HSPLandroid/app/LoadedApk$ServiceDispatcher$RunConnection;-><init>(Landroid/app/LoadedApk$ServiceDispatcher;Landroid/content/ComponentName;Landroid/os/IBinder;IZ)V
-HSPLandroid/app/LoadedApk$ServiceDispatcher$RunConnection;->run()V
-HSPLandroid/app/LoadedApk$ServiceDispatcher;-><init>(Landroid/content/ServiceConnection;Landroid/content/Context;Landroid/os/Handler;J)V
-HSPLandroid/app/LoadedApk$ServiceDispatcher;-><init>(Landroid/content/ServiceConnection;Landroid/content/Context;Ljava/util/concurrent/Executor;J)V
-HSPLandroid/app/LoadedApk$ServiceDispatcher;->connected(Landroid/content/ComponentName;Landroid/os/IBinder;Z)V
-HSPLandroid/app/LoadedApk$ServiceDispatcher;->death(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-HSPLandroid/app/LoadedApk$ServiceDispatcher;->doConnected(Landroid/content/ComponentName;Landroid/os/IBinder;Z)V
-HSPLandroid/app/LoadedApk$ServiceDispatcher;->doDeath(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-HSPLandroid/app/LoadedApk$ServiceDispatcher;->doForget()V
-HSPLandroid/app/LoadedApk$ServiceDispatcher;->getFlags()J
-HSPLandroid/app/LoadedApk$ServiceDispatcher;->getIServiceConnection()Landroid/app/IServiceConnection;
-HSPLandroid/app/LoadedApk$ServiceDispatcher;->validate(Landroid/content/Context;Landroid/os/Handler;Ljava/util/concurrent/Executor;)V
-HSPLandroid/app/LoadedApk$SplitDependencyLoaderImpl;-><init>(Landroid/app/LoadedApk;Landroid/util/SparseArray;)V
-HSPLandroid/app/LoadedApk$SplitDependencyLoaderImpl;->constructSplit(I[II)V
-HSPLandroid/app/LoadedApk$SplitDependencyLoaderImpl;->ensureSplitLoaded(Ljava/lang/String;)I
-HSPLandroid/app/LoadedApk$SplitDependencyLoaderImpl;->getClassLoaderForSplit(Ljava/lang/String;)Ljava/lang/ClassLoader;
-HSPLandroid/app/LoadedApk$SplitDependencyLoaderImpl;->getSplitPathsForSplit(Ljava/lang/String;)[Ljava/lang/String;
-HSPLandroid/app/LoadedApk$SplitDependencyLoaderImpl;->isSplitCached(I)Z
-HSPLandroid/app/LoadedApk$WarningContextClassLoader;-><init>()V
-HSPLandroid/app/LoadedApk$WarningContextClassLoader;-><init>(Landroid/app/LoadedApk$WarningContextClassLoader-IA;)V
-HSPLandroid/app/LoadedApk;->-$$Nest$fgetmClassLoader(Landroid/app/LoadedApk;)Ljava/lang/ClassLoader;
-HSPLandroid/app/LoadedApk;->-$$Nest$fgetmLock(Landroid/app/LoadedApk;)Ljava/lang/Object;
-HSPLandroid/app/LoadedApk;->-$$Nest$fgetmSplitNames(Landroid/app/LoadedApk;)[Ljava/lang/String;
-HSPLandroid/app/LoadedApk;->-$$Nest$fgetmSplitResDirs(Landroid/app/LoadedApk;)[Ljava/lang/String;
-HSPLandroid/app/LoadedApk;->-$$Nest$mcreateOrUpdateClassLoaderLocked(Landroid/app/LoadedApk;Ljava/util/List;)V
-HSPLandroid/app/LoadedApk;-><init>(Landroid/app/ActivityThread;)V
-HSPLandroid/app/LoadedApk;-><init>(Landroid/app/ActivityThread;Landroid/content/pm/ApplicationInfo;Landroid/content/res/CompatibilityInfo;Ljava/lang/ClassLoader;ZZZ)V
-HSPLandroid/app/LoadedApk;->adjustNativeLibraryPaths(Landroid/content/pm/ApplicationInfo;)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/app/LoadedApk;->allowThreadDiskReads()Landroid/os/StrictMode$ThreadPolicy;
-HSPLandroid/app/LoadedApk;->allowVmViolations()Landroid/os/StrictMode$VmPolicy;
-HSPLandroid/app/LoadedApk;->appendApkLibPathIfNeeded(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;Ljava/util/List;)V
-HSPLandroid/app/LoadedApk;->appendSharedLibrariesLibPathsIfNeeded(Ljava/util/List;Landroid/content/pm/ApplicationInfo;Ljava/util/Set;Ljava/util/List;)V
-HSPLandroid/app/LoadedApk;->canAccessDataDir()Z
-HSPLandroid/app/LoadedApk;->createAppFactory(Landroid/content/pm/ApplicationInfo;Ljava/lang/ClassLoader;)Landroid/app/AppComponentFactory;
-HSPLandroid/app/LoadedApk;->createOrUpdateClassLoaderLocked(Ljava/util/List;)V
-HSPLandroid/app/LoadedApk;->createSharedLibrariesLoaders(Ljava/util/List;ZLjava/lang/String;Ljava/lang/String;)Landroid/util/Pair;
-HSPLandroid/app/LoadedApk;->createSharedLibraryLoader(Landroid/content/pm/SharedLibraryInfo;ZLjava/lang/String;Ljava/lang/String;)Ljava/lang/ClassLoader;
-HSPLandroid/app/LoadedApk;->forgetReceiverDispatcher(Landroid/content/Context;Landroid/content/BroadcastReceiver;)Landroid/content/IIntentReceiver;
-HSPLandroid/app/LoadedApk;->forgetServiceDispatcher(Landroid/content/Context;Landroid/content/ServiceConnection;)Landroid/app/IServiceConnection;
-HSPLandroid/app/LoadedApk;->getAppDir()Ljava/lang/String;
-HSPLandroid/app/LoadedApk;->getAppFactory()Landroid/app/AppComponentFactory;
-HSPLandroid/app/LoadedApk;->getApplication()Landroid/app/Application;
-HSPLandroid/app/LoadedApk;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;
-HSPLandroid/app/LoadedApk;->getAssets()Landroid/content/res/AssetManager;
-HSPLandroid/app/LoadedApk;->getClassLoader()Ljava/lang/ClassLoader;
-HSPLandroid/app/LoadedApk;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo;
-HSPLandroid/app/LoadedApk;->getCredentialProtectedDataDirFile()Ljava/io/File;
-HSPLandroid/app/LoadedApk;->getDataDirFile()Ljava/io/File;
-HSPLandroid/app/LoadedApk;->getDeviceProtectedDataDirFile()Ljava/io/File;
-HSPLandroid/app/LoadedApk;->getOverlayDirs()[Ljava/lang/String;
-HSPLandroid/app/LoadedApk;->getOverlayPaths()[Ljava/lang/String;
-HSPLandroid/app/LoadedApk;->getPackageName()Ljava/lang/String;
-HSPLandroid/app/LoadedApk;->getReceiverDispatcher(Landroid/content/BroadcastReceiver;Landroid/content/Context;Landroid/os/Handler;Landroid/app/Instrumentation;Z)Landroid/content/IIntentReceiver;
-HSPLandroid/app/LoadedApk;->getResDir()Ljava/lang/String;
-HSPLandroid/app/LoadedApk;->getResources()Landroid/content/res/Resources;
-HSPLandroid/app/LoadedApk;->getServiceDispatcher(Landroid/content/ServiceConnection;Landroid/content/Context;Landroid/os/Handler;J)Landroid/app/IServiceConnection;
-HSPLandroid/app/LoadedApk;->getServiceDispatcher(Landroid/content/ServiceConnection;Landroid/content/Context;Ljava/util/concurrent/Executor;J)Landroid/app/IServiceConnection;
-HSPLandroid/app/LoadedApk;->getServiceDispatcherCommon(Landroid/content/ServiceConnection;Landroid/content/Context;Landroid/os/Handler;Ljava/util/concurrent/Executor;J)Landroid/app/IServiceConnection;
-HSPLandroid/app/LoadedApk;->getSplitClassLoader(Ljava/lang/String;)Ljava/lang/ClassLoader;
-HSPLandroid/app/LoadedApk;->getSplitPaths(Ljava/lang/String;)[Ljava/lang/String;
-HSPLandroid/app/LoadedApk;->getSplitResDirs()[Ljava/lang/String;
-HSPLandroid/app/LoadedApk;->initializeJavaContextClassLoader()V
-HSPLandroid/app/LoadedApk;->isSecurityViolation()Z
-HSPLandroid/app/LoadedApk;->makeApplication(ZLandroid/app/Instrumentation;)Landroid/app/Application;
-HSPLandroid/app/LoadedApk;->makeApplicationInner(ZLandroid/app/Instrumentation;)Landroid/app/Application;
-HSPLandroid/app/LoadedApk;->makeApplicationInner(ZLandroid/app/Instrumentation;Z)Landroid/app/Application;
-HSPLandroid/app/LoadedApk;->makePaths(Landroid/app/ActivityThread;Landroid/content/pm/ApplicationInfo;Ljava/util/List;)V
-HSPLandroid/app/LoadedApk;->makePaths(Landroid/app/ActivityThread;ZLandroid/content/pm/ApplicationInfo;Ljava/util/List;Ljava/util/List;)V
-HSPLandroid/app/LoadedApk;->registerAppInfoToArt()V
-HSPLandroid/app/LoadedApk;->removeContextRegistrations(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/LoadedApk;->rewriteRValues(Ljava/lang/ClassLoader;Ljava/lang/String;I)V
-HSPLandroid/app/LoadedApk;->setApplicationInfo(Landroid/content/pm/ApplicationInfo;)Z
-HSPLandroid/app/LoadedApk;->setThreadPolicy(Landroid/os/StrictMode$ThreadPolicy;)V
-HSPLandroid/app/LoadedApk;->setVmPolicy(Landroid/os/StrictMode$VmPolicy;)V
-HSPLandroid/app/LoadedApk;->updateApplicationInfo(Landroid/content/pm/ApplicationInfo;Ljava/util/List;)V
-HSPLandroid/app/Notification$$ExternalSyntheticLambda0;-><init>(Landroid/app/Notification;Landroid/os/Parcel;)V
-HSPLandroid/app/Notification$$ExternalSyntheticLambda0;->onMarshaled(Landroid/app/PendingIntent;Landroid/os/Parcel;I)V
-HSPLandroid/app/Notification$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/Notification;
-HSPLandroid/app/Notification$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/Notification$Action$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/Notification$Action;
-HSPLandroid/app/Notification$Action$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/Notification$Action$1;->newArray(I)[Landroid/app/Notification$Action;
-HSPLandroid/app/Notification$Action$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/app/Notification$Action$Builder;-><init>(Landroid/graphics/drawable/Icon;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V
-HSPLandroid/app/Notification$Action$Builder;-><init>(Landroid/graphics/drawable/Icon;Ljava/lang/CharSequence;Landroid/app/PendingIntent;Landroid/os/Bundle;[Landroid/app/RemoteInput;ZIZ)V
-HSPLandroid/app/Notification$Action$Builder;->addExtras(Landroid/os/Bundle;)Landroid/app/Notification$Action$Builder;
-HSPLandroid/app/Notification$Action$Builder;->build()Landroid/app/Notification$Action;
-HSPLandroid/app/Notification$Action$Builder;->setAllowGeneratedReplies(Z)Landroid/app/Notification$Action$Builder;
-HSPLandroid/app/Notification$Action$Builder;->setAuthenticationRequired(Z)Landroid/app/Notification$Action$Builder;
-HSPLandroid/app/Notification$Action$Builder;->setContextual(Z)Landroid/app/Notification$Action$Builder;
-HSPLandroid/app/Notification$Action$Builder;->setSemanticAction(I)Landroid/app/Notification$Action$Builder;
-HSPLandroid/app/Notification$Action;-><init>(Landroid/graphics/drawable/Icon;Ljava/lang/CharSequence;Landroid/app/PendingIntent;Landroid/os/Bundle;[Landroid/app/RemoteInput;ZIZZ)V
-HSPLandroid/app/Notification$Action;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/Notification$Action;->getAllowGeneratedReplies()Z
-HSPLandroid/app/Notification$Action;->getIcon()Landroid/graphics/drawable/Icon;
-HSPLandroid/app/Notification$Action;->getRemoteInputs()[Landroid/app/RemoteInput;
-HSPLandroid/app/Notification$Action;->isContextual()Z
-HSPLandroid/app/Notification$Action;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/Notification$BigPictureStyle;-><init>()V
-HSPLandroid/app/Notification$BigPictureStyle;->addExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$BigPictureStyle;->purgeResources()V
-HSPLandroid/app/Notification$BigPictureStyle;->reduceImageSizes(Landroid/content/Context;)V
-HSPLandroid/app/Notification$BigPictureStyle;->restoreFromExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$BigTextStyle;-><init>()V
-HSPLandroid/app/Notification$BigTextStyle;-><init>(Landroid/app/Notification$Builder;)V
-HSPLandroid/app/Notification$BigTextStyle;->addExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$BigTextStyle;->bigText(Ljava/lang/CharSequence;)Landroid/app/Notification$BigTextStyle;
-HSPLandroid/app/Notification$BigTextStyle;->restoreFromExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$BigTextStyle;->setBigContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$BigTextStyle;
-HSPLandroid/app/Notification$BubbleMetadata$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/Notification$BubbleMetadata;
-HSPLandroid/app/Notification$BubbleMetadata$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/Notification$BubbleMetadata;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/Notification$Builder;-><init>(Landroid/content/Context;)V
-HSPLandroid/app/Notification$Builder;-><init>(Landroid/content/Context;Landroid/app/Notification;)V
-HSPLandroid/app/Notification$Builder;-><init>(Landroid/content/Context;Ljava/lang/String;)V
-HSPLandroid/app/Notification$Builder;->addAction(Landroid/app/Notification$Action;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->addExtras(Landroid/os/Bundle;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->addPerson(Landroid/app/Person;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->addPerson(Ljava/lang/String;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->build()Landroid/app/Notification;
-HSPLandroid/app/Notification$Builder;->buildUnstyled()Landroid/app/Notification;
-HSPLandroid/app/Notification$Builder;->getStyle()Landroid/app/Notification$Style;
-HSPLandroid/app/Notification$Builder;->maybeCloneStrippedForDelivery(Landroid/app/Notification;)Landroid/app/Notification;
-HSPLandroid/app/Notification$Builder;->recoverBuilder(Landroid/content/Context;Landroid/app/Notification;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->sanitizeColor()V
-HSPLandroid/app/Notification$Builder;->setAllowSystemGeneratedContextualActions(Z)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setAutoCancel(Z)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setBadgeIconType(I)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setBubbleMetadata(Landroid/app/Notification$BubbleMetadata;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setCategory(Ljava/lang/String;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setColor(I)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setContent(Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setContentInfo(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setContentIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setContentText(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setCustomContentView(Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setDefaults(I)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setDeleteIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setExtras(Landroid/os/Bundle;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setFlag(IZ)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setFullScreenIntent(Landroid/app/PendingIntent;Z)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setGroup(Ljava/lang/String;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setGroupAlertBehavior(I)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setGroupSummary(Z)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setLargeIcon(Landroid/graphics/Bitmap;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setLargeIcon(Landroid/graphics/drawable/Icon;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setLights(III)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setLocalOnly(Z)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setNumber(I)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setOngoing(Z)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setOnlyAlertOnce(Z)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setPriority(I)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setProgress(IIZ)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setPublicVersion(Landroid/app/Notification;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setRemoteInputHistory([Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setSettingsText(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setShortcutId(Ljava/lang/String;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setShowWhen(Z)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setSmallIcon(I)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setSmallIcon(II)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setSmallIcon(Landroid/graphics/drawable/Icon;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setSortKey(Ljava/lang/String;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setSound(Landroid/net/Uri;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setSound(Landroid/net/Uri;Landroid/media/AudioAttributes;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setStyle(Landroid/app/Notification$Style;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setSubText(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setTicker(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setTicker(Ljava/lang/CharSequence;Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setTimeoutAfter(J)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setUsesChronometer(Z)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setVibrate([J)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setVisibility(I)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->setWhen(J)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->usesStandardHeader()Z
-HSPLandroid/app/Notification$Colors;-><init>()V
-HSPLandroid/app/Notification$DecoratedCustomViewStyle;-><init>()V
-HSPLandroid/app/Notification$InboxStyle;-><init>()V
-HSPLandroid/app/Notification$InboxStyle;->addExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$InboxStyle;->restoreFromExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$MediaStyle;-><init>()V
-HSPLandroid/app/Notification$MediaStyle;->addExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$MediaStyle;->buildStyled(Landroid/app/Notification;)Landroid/app/Notification;
-HSPLandroid/app/Notification$MediaStyle;->restoreFromExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$MessagingStyle$Message;-><init>(Ljava/lang/CharSequence;JLandroid/app/Person;)V
-HSPLandroid/app/Notification$MessagingStyle$Message;-><init>(Ljava/lang/CharSequence;JLandroid/app/Person;Z)V
-HSPLandroid/app/Notification$MessagingStyle$Message;->getDataUri()Landroid/net/Uri;
-HSPLandroid/app/Notification$MessagingStyle$Message;->getMessageFromBundle(Landroid/os/Bundle;)Landroid/app/Notification$MessagingStyle$Message;
-HSPLandroid/app/Notification$MessagingStyle$Message;->getMessagesFromBundleArray([Landroid/os/Parcelable;)Ljava/util/List;
-HSPLandroid/app/Notification$MessagingStyle$Message;->getSenderPerson()Landroid/app/Person;
-HSPLandroid/app/Notification$MessagingStyle$Message;->getText()Ljava/lang/CharSequence;
-HSPLandroid/app/Notification$MessagingStyle$Message;->getTimestamp()J
-HSPLandroid/app/Notification$MessagingStyle$Message;->toBundle()Landroid/os/Bundle;
-HSPLandroid/app/Notification$MessagingStyle;-><init>()V
-HSPLandroid/app/Notification$MessagingStyle;-><init>(Landroid/app/Person;)V
-HSPLandroid/app/Notification$MessagingStyle;->addExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$MessagingStyle;->addMessage(Landroid/app/Notification$MessagingStyle$Message;)Landroid/app/Notification$MessagingStyle;
-HSPLandroid/app/Notification$MessagingStyle;->findLatestIncomingMessage(Ljava/util/List;)Landroid/app/Notification$MessagingStyle$Message;
-HSPLandroid/app/Notification$MessagingStyle;->fixTitleAndTextExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$MessagingStyle;->getMessages()Ljava/util/List;
-HSPLandroid/app/Notification$MessagingStyle;->restoreFromExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$MessagingStyle;->setConversationTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$MessagingStyle;
-HSPLandroid/app/Notification$MessagingStyle;->setGroupConversation(Z)Landroid/app/Notification$MessagingStyle;
-HSPLandroid/app/Notification$MessagingStyle;->validate(Landroid/content/Context;)V
-HSPLandroid/app/Notification$StandardTemplateParams;-><init>()V
-HSPLandroid/app/Notification$Style;-><init>()V
-HSPLandroid/app/Notification$Style;->addExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$Style;->buildStyled(Landroid/app/Notification;)Landroid/app/Notification;
-HSPLandroid/app/Notification$Style;->internalSetBigContentTitle(Ljava/lang/CharSequence;)V
-HSPLandroid/app/Notification$Style;->purgeResources()V
-HSPLandroid/app/Notification$Style;->reduceImageSizes(Landroid/content/Context;)V
-HSPLandroid/app/Notification$Style;->restoreFromExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$Style;->setBuilder(Landroid/app/Notification$Builder;)V
-HSPLandroid/app/Notification$Style;->validate(Landroid/content/Context;)V
-HSPLandroid/app/Notification;-><init>()V
-HSPLandroid/app/Notification;-><init>(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/app/Notification;->addFieldsFromContext(Landroid/content/Context;Landroid/app/Notification;)V
-HSPLandroid/app/Notification;->addFieldsFromContext(Landroid/content/pm/ApplicationInfo;Landroid/app/Notification;)V
-HSPLandroid/app/Notification;->areStyledNotificationsVisiblyDifferent(Landroid/app/Notification$Builder;Landroid/app/Notification$Builder;)Z
-HSPLandroid/app/Notification;->cloneInto(Landroid/app/Notification;Z)V
-HSPLandroid/app/Notification;->findRemoteInputActionPair(Z)Landroid/util/Pair;
-HSPLandroid/app/Notification;->fixDuplicateExtra(Landroid/os/Parcelable;Ljava/lang/String;)V
-HSPLandroid/app/Notification;->fixDuplicateExtras()V
-HSPLandroid/app/Notification;->getBubbleMetadata()Landroid/app/Notification$BubbleMetadata;
-HSPLandroid/app/Notification;->getChannelId()Ljava/lang/String;
-HSPLandroid/app/Notification;->getContextualActions()Ljava/util/List;
-HSPLandroid/app/Notification;->getGroup()Ljava/lang/String;
-HSPLandroid/app/Notification;->getGroupAlertBehavior()I
-HSPLandroid/app/Notification;->getLargeIcon()Landroid/graphics/drawable/Icon;
-HSPLandroid/app/Notification;->getNotificationStyle()Ljava/lang/Class;
-HSPLandroid/app/Notification;->getNotificationStyleClass(Ljava/lang/String;)Ljava/lang/Class;
-HSPLandroid/app/Notification;->getParcelableArrayFromBundle(Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/Class;)[Landroid/os/Parcelable;
-HSPLandroid/app/Notification;->getShortcutId()Ljava/lang/String;
-HSPLandroid/app/Notification;->getSmallIcon()Landroid/graphics/drawable/Icon;
-HSPLandroid/app/Notification;->getSortKey()Ljava/lang/String;
-HSPLandroid/app/Notification;->isColorized()Z
-HSPLandroid/app/Notification;->isForegroundService()Z
-HSPLandroid/app/Notification;->isGroupChild()Z
-HSPLandroid/app/Notification;->isGroupSummary()Z
-HSPLandroid/app/Notification;->isMediaNotification()Z
-HSPLandroid/app/Notification;->readFromParcelImpl(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/graphics/drawable/Icon$1;,Landroid/app/PendingIntent$1;,Landroid/media/AudioAttributes$1;]Landroid/graphics/drawable/Icon;Landroid/graphics/drawable/Icon;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/app/Notification;->reduceImageSizes(Landroid/content/Context;)V
-HSPLandroid/app/Notification;->reduceImageSizesForRemoteView(Landroid/widget/RemoteViews;Landroid/content/Context;Z)V
-HSPLandroid/app/Notification;->removeTextSizeSpans(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLandroid/app/Notification;->safeCharSequence(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLandroid/app/Notification;->setSmallIcon(Landroid/graphics/drawable/Icon;)V
-HSPLandroid/app/Notification;->suppressAlertingDueToGrouping()Z
-HSPLandroid/app/Notification;->toString()Ljava/lang/String;
-HSPLandroid/app/Notification;->visibilityToString(I)Ljava/lang/String;
-HSPLandroid/app/Notification;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/Notification;->writeToParcelImpl(Landroid/os/Parcel;I)V+]Landroid/app/PendingIntent;Landroid/app/PendingIntent;]Landroid/media/AudioAttributes;Landroid/media/AudioAttributes;]Landroid/graphics/drawable/Icon;Landroid/graphics/drawable/Icon;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/app/NotificationChannel$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/NotificationChannel;
-HSPLandroid/app/NotificationChannel$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/app/NotificationChannel$1;Landroid/app/NotificationChannel$1;
-HSPLandroid/app/NotificationChannel;-><init>(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/net/Uri$1;,Landroid/media/AudioAttributes$1;]Landroid/os/Parcel;Landroid/os/Parcel;]Landroid/net/Uri;Landroid/net/Uri$StringUri;
-HSPLandroid/app/NotificationChannel;-><init>(Ljava/lang/String;Ljava/lang/CharSequence;I)V
-HSPLandroid/app/NotificationChannel;->canBubble()Z
-HSPLandroid/app/NotificationChannel;->canBypassDnd()Z
-HSPLandroid/app/NotificationChannel;->canShowBadge()Z
-HSPLandroid/app/NotificationChannel;->enableLights(Z)V
-HSPLandroid/app/NotificationChannel;->enableVibration(Z)V
-HSPLandroid/app/NotificationChannel;->equals(Ljava/lang/Object;)Z
-HSPLandroid/app/NotificationChannel;->getAudioAttributes()Landroid/media/AudioAttributes;
-HSPLandroid/app/NotificationChannel;->getConversationId()Ljava/lang/String;
-HSPLandroid/app/NotificationChannel;->getDescription()Ljava/lang/String;
-HSPLandroid/app/NotificationChannel;->getGroup()Ljava/lang/String;
-HSPLandroid/app/NotificationChannel;->getId()Ljava/lang/String;
-HSPLandroid/app/NotificationChannel;->getImportance()I
-HSPLandroid/app/NotificationChannel;->getLightColor()I
-HSPLandroid/app/NotificationChannel;->getLockscreenVisibility()I
-HSPLandroid/app/NotificationChannel;->getName()Ljava/lang/CharSequence;
-HSPLandroid/app/NotificationChannel;->getOriginalImportance()I
-HSPLandroid/app/NotificationChannel;->getSound()Landroid/net/Uri;
-HSPLandroid/app/NotificationChannel;->getTrimmedString(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/app/NotificationChannel;->getUserLockedFields()I
-HSPLandroid/app/NotificationChannel;->getVibrationPattern()[J
-HSPLandroid/app/NotificationChannel;->hasUserSetImportance()Z
-HSPLandroid/app/NotificationChannel;->isBlockable()Z
-HSPLandroid/app/NotificationChannel;->isDeleted()Z
-HSPLandroid/app/NotificationChannel;->isImportantConversation()Z
-HSPLandroid/app/NotificationChannel;->setBlockable(Z)V
-HSPLandroid/app/NotificationChannel;->setBypassDnd(Z)V
-HSPLandroid/app/NotificationChannel;->setDescription(Ljava/lang/String;)V
-HSPLandroid/app/NotificationChannel;->setGroup(Ljava/lang/String;)V
-HSPLandroid/app/NotificationChannel;->setLightColor(I)V
-HSPLandroid/app/NotificationChannel;->setLockscreenVisibility(I)V
-HSPLandroid/app/NotificationChannel;->setShowBadge(Z)V
-HSPLandroid/app/NotificationChannel;->setSound(Landroid/net/Uri;Landroid/media/AudioAttributes;)V
-HSPLandroid/app/NotificationChannel;->setVibrationPattern([J)V
-HSPLandroid/app/NotificationChannel;->shouldShowLights()Z
-HSPLandroid/app/NotificationChannel;->shouldVibrate()Z
-HSPLandroid/app/NotificationChannel;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/NotificationChannel;->writeXml(Lorg/xmlpull/v1/XmlSerializer;)V
-HSPLandroid/app/NotificationChannelGroup$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/NotificationChannelGroup;
-HSPLandroid/app/NotificationChannelGroup$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/NotificationChannelGroup;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/NotificationChannelGroup;-><init>(Ljava/lang/String;Ljava/lang/CharSequence;)V
-HSPLandroid/app/NotificationChannelGroup;->equals(Ljava/lang/Object;)Z
-HSPLandroid/app/NotificationChannelGroup;->getChannels()Ljava/util/List;
-HSPLandroid/app/NotificationChannelGroup;->getDescription()Ljava/lang/String;
-HSPLandroid/app/NotificationChannelGroup;->getId()Ljava/lang/String;
-HSPLandroid/app/NotificationChannelGroup;->getName()Ljava/lang/CharSequence;
-HSPLandroid/app/NotificationChannelGroup;->getTrimmedString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/app/NotificationChannelGroup;->isBlocked()Z
-HSPLandroid/app/NotificationChannelGroup;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/NotificationManager$Policy$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/NotificationManager$Policy;
-HSPLandroid/app/NotificationManager$Policy$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/NotificationManager$Policy;-><init>(IIIIII)V
-HSPLandroid/app/NotificationManager$Policy;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/NotificationManager$Policy;->equals(Ljava/lang/Object;)Z
-HSPLandroid/app/NotificationManager$Policy;->suppressedVisualEffectsEqual(II)Z
-HSPLandroid/app/NotificationManager;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
-HSPLandroid/app/NotificationManager;->areNotificationsEnabled()Z
-HSPLandroid/app/NotificationManager;->cancel(I)V
-HSPLandroid/app/NotificationManager;->cancel(Ljava/lang/String;I)V
-HSPLandroid/app/NotificationManager;->cancelAll()V
-HSPLandroid/app/NotificationManager;->cancelAsUser(Ljava/lang/String;ILandroid/os/UserHandle;)V
-HSPLandroid/app/NotificationManager;->createNotificationChannel(Landroid/app/NotificationChannel;)V
-HSPLandroid/app/NotificationManager;->createNotificationChannelGroup(Landroid/app/NotificationChannelGroup;)V
-HSPLandroid/app/NotificationManager;->createNotificationChannelGroups(Ljava/util/List;)V
-HSPLandroid/app/NotificationManager;->createNotificationChannels(Ljava/util/List;)V
-HSPLandroid/app/NotificationManager;->deleteNotificationChannel(Ljava/lang/String;)V
-HSPLandroid/app/NotificationManager;->fixLegacySmallIcon(Landroid/app/Notification;Ljava/lang/String;)V
-HSPLandroid/app/NotificationManager;->fixNotification(Landroid/app/Notification;)Landroid/app/Notification;
-HSPLandroid/app/NotificationManager;->getActiveNotifications()[Landroid/service/notification/StatusBarNotification;
-HSPLandroid/app/NotificationManager;->getAutomaticZenRules()Ljava/util/Map;
-HSPLandroid/app/NotificationManager;->getConsolidatedNotificationPolicy()Landroid/app/NotificationManager$Policy;
-HSPLandroid/app/NotificationManager;->getCurrentInterruptionFilter()I
-HSPLandroid/app/NotificationManager;->getNotificationChannel(Ljava/lang/String;)Landroid/app/NotificationChannel;
-HSPLandroid/app/NotificationManager;->getNotificationChannelGroup(Ljava/lang/String;)Landroid/app/NotificationChannelGroup;
-HSPLandroid/app/NotificationManager;->getNotificationChannelGroups()Ljava/util/List;
-HSPLandroid/app/NotificationManager;->getNotificationChannels()Ljava/util/List;
-HSPLandroid/app/NotificationManager;->getNotificationPolicy()Landroid/app/NotificationManager$Policy;
-HSPLandroid/app/NotificationManager;->getService()Landroid/app/INotificationManager;
-HSPLandroid/app/NotificationManager;->isNotificationPolicyAccessGranted()Z
-HSPLandroid/app/NotificationManager;->notify(ILandroid/app/Notification;)V
-HSPLandroid/app/NotificationManager;->notify(Ljava/lang/String;ILandroid/app/Notification;)V
-HSPLandroid/app/NotificationManager;->notifyAsUser(Ljava/lang/String;ILandroid/app/Notification;Landroid/os/UserHandle;)V
-HSPLandroid/app/NotificationManager;->zenModeToInterruptionFilter(I)I
-HSPLandroid/app/PendingIntent$$ExternalSyntheticLambda3;->get()Ljava/lang/Object;
-HSPLandroid/app/PendingIntent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/PendingIntent;
-HSPLandroid/app/PendingIntent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/PendingIntent$FinishedDispatcher;-><init>(Landroid/app/PendingIntent;Landroid/app/PendingIntent$OnFinished;Landroid/os/Handler;)V
-HSPLandroid/app/PendingIntent$FinishedDispatcher;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
-HSPLandroid/app/PendingIntent$FinishedDispatcher;->run()V
-HSPLandroid/app/PendingIntent;-><init>(Landroid/content/IIntentSender;)V
-HSPLandroid/app/PendingIntent;-><init>(Landroid/os/IBinder;Ljava/lang/Object;)V
-HSPLandroid/app/PendingIntent;->buildServicePendingIntent(Landroid/content/Context;ILandroid/content/Intent;II)Landroid/app/PendingIntent;
-HSPLandroid/app/PendingIntent;->cancel()V
-HSPLandroid/app/PendingIntent;->checkPendingIntent(ILandroid/content/Intent;Landroid/content/Context;Z)V
-HSPLandroid/app/PendingIntent;->equals(Ljava/lang/Object;)Z
-HSPLandroid/app/PendingIntent;->getActivities(Landroid/content/Context;I[Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/PendingIntent;
-HSPLandroid/app/PendingIntent;->getActivitiesAsUser(Landroid/content/Context;I[Landroid/content/Intent;ILandroid/os/Bundle;Landroid/os/UserHandle;)Landroid/app/PendingIntent;
-HSPLandroid/app/PendingIntent;->getActivity(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;
-HSPLandroid/app/PendingIntent;->getActivity(Landroid/content/Context;ILandroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/PendingIntent;
-HSPLandroid/app/PendingIntent;->getActivityAsUser(Landroid/content/Context;ILandroid/content/Intent;ILandroid/os/Bundle;Landroid/os/UserHandle;)Landroid/app/PendingIntent;
-HSPLandroid/app/PendingIntent;->getBroadcast(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;
-HSPLandroid/app/PendingIntent;->getBroadcastAsUser(Landroid/content/Context;ILandroid/content/Intent;ILandroid/os/UserHandle;)Landroid/app/PendingIntent;
-HSPLandroid/app/PendingIntent;->getCachedInfo()Landroid/app/ActivityManager$PendingIntentInfo;
-HSPLandroid/app/PendingIntent;->getCreatorPackage()Ljava/lang/String;
-HSPLandroid/app/PendingIntent;->getCreatorUid()I
-HSPLandroid/app/PendingIntent;->getIntent()Landroid/content/Intent;
-HSPLandroid/app/PendingIntent;->getIntentSender()Landroid/content/IntentSender;
-HSPLandroid/app/PendingIntent;->getService(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;
-HSPLandroid/app/PendingIntent;->hashCode()I
-HSPLandroid/app/PendingIntent;->isActivity()Z
-HSPLandroid/app/PendingIntent;->isNewMutableDisallowedImplicitPendingIntent(ILandroid/content/Intent;Z)Z
-HSPLandroid/app/PendingIntent;->send()V
-HSPLandroid/app/PendingIntent;->send(Landroid/content/Context;ILandroid/content/Intent;)V
-HSPLandroid/app/PendingIntent;->send(Landroid/content/Context;ILandroid/content/Intent;Landroid/app/PendingIntent$OnFinished;Landroid/os/Handler;Ljava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/app/PendingIntent;->sendAndReturnResult(Landroid/content/Context;ILandroid/content/Intent;Landroid/app/PendingIntent$OnFinished;Landroid/os/Handler;Ljava/lang/String;Landroid/os/Bundle;)I
-HSPLandroid/app/PendingIntent;->setOnMarshaledListener(Landroid/app/PendingIntent$OnMarshaledListener;)V
-HSPLandroid/app/PendingIntent;->toString()Ljava/lang/String;
-HSPLandroid/app/PendingIntent;->writePendingIntentOrNullToParcel(Landroid/app/PendingIntent;Landroid/os/Parcel;)V
-HSPLandroid/app/PendingIntent;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/Person$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/Person;
-HSPLandroid/app/Person$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/Person$Builder;-><init>()V
-HSPLandroid/app/Person$Builder;-><init>(Landroid/app/Person;)V
-HSPLandroid/app/Person$Builder;->build()Landroid/app/Person;
-HSPLandroid/app/Person$Builder;->setBot(Z)Landroid/app/Person$Builder;
-HSPLandroid/app/Person$Builder;->setIcon(Landroid/graphics/drawable/Icon;)Landroid/app/Person$Builder;
-HSPLandroid/app/Person$Builder;->setImportant(Z)Landroid/app/Person$Builder;
-HSPLandroid/app/Person$Builder;->setKey(Ljava/lang/String;)Landroid/app/Person$Builder;
-HSPLandroid/app/Person$Builder;->setName(Ljava/lang/CharSequence;)Landroid/app/Person$Builder;
-HSPLandroid/app/Person$Builder;->setUri(Ljava/lang/String;)Landroid/app/Person$Builder;
-HSPLandroid/app/Person;-><init>(Landroid/app/Person$Builder;)V
-HSPLandroid/app/Person;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/Person;->getIcon()Landroid/graphics/drawable/Icon;
-HSPLandroid/app/Person;->getKey()Ljava/lang/String;
-HSPLandroid/app/Person;->getName()Ljava/lang/CharSequence;
-HSPLandroid/app/Person;->getUri()Ljava/lang/String;
-HSPLandroid/app/Person;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/PictureInPictureParams$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/PictureInPictureParams;
-HSPLandroid/app/PictureInPictureParams$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/PictureInPictureParams;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/PropertyInvalidatedCache$1;-><init>(Landroid/app/PropertyInvalidatedCache;IFZ)V
-HSPLandroid/app/PropertyInvalidatedCache$1;->removeEldestEntry(Ljava/util/Map$Entry;)Z
-HSPLandroid/app/PropertyInvalidatedCache$DefaultComputer;-><init>(Landroid/app/PropertyInvalidatedCache;)V
-HSPLandroid/app/PropertyInvalidatedCache$NoPreloadHolder;-><clinit>()V
-HSPLandroid/app/PropertyInvalidatedCache$NoPreloadHolder;->next()J
-HSPLandroid/app/PropertyInvalidatedCache$QueryHandler;-><init>()V
-HSPLandroid/app/PropertyInvalidatedCache$QueryHandler;->shouldBypassCache(Ljava/lang/Object;)Z
-HSPLandroid/app/PropertyInvalidatedCache;->-$$Nest$fgetmHighWaterMark(Landroid/app/PropertyInvalidatedCache;)J
-HSPLandroid/app/PropertyInvalidatedCache;->-$$Nest$fgetmMaxEntries(Landroid/app/PropertyInvalidatedCache;)I
-HSPLandroid/app/PropertyInvalidatedCache;->-$$Nest$fputmHighWaterMark(Landroid/app/PropertyInvalidatedCache;J)V
-HSPLandroid/app/PropertyInvalidatedCache;-><init>(ILjava/lang/String;)V
-HSPLandroid/app/PropertyInvalidatedCache;-><init>(ILjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/PropertyInvalidatedCache;-><init>(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PropertyInvalidatedCache$QueryHandler;)V
-HSPLandroid/app/PropertyInvalidatedCache;->bypass(Ljava/lang/Object;)Z+]Landroid/app/PropertyInvalidatedCache$QueryHandler;Landroid/app/PropertyInvalidatedCache$DefaultComputer;
-HSPLandroid/app/PropertyInvalidatedCache;->cacheName()Ljava/lang/String;
-HSPLandroid/app/PropertyInvalidatedCache;->clear()V
-HSPLandroid/app/PropertyInvalidatedCache;->createMap()Ljava/util/LinkedHashMap;
-HSPLandroid/app/PropertyInvalidatedCache;->createPropertyName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/app/PropertyInvalidatedCache;->disableLocal()V
-HSPLandroid/app/PropertyInvalidatedCache;->dumpCacheInfo(Landroid/os/ParcelFileDescriptor;[Ljava/lang/String;)V
-HSPLandroid/app/PropertyInvalidatedCache;->getActiveCaches()Ljava/util/ArrayList;
-HSPLandroid/app/PropertyInvalidatedCache;->getActiveCorks()Ljava/util/ArrayList;
-HSPLandroid/app/PropertyInvalidatedCache;->getCurrentNonce()J+]Landroid/os/SystemProperties$Handle;Landroid/os/SystemProperties$Handle;
-HSPLandroid/app/PropertyInvalidatedCache;->invalidateCache(Ljava/lang/String;)V
-HSPLandroid/app/PropertyInvalidatedCache;->invalidateCacheLocked(Ljava/lang/String;)V
-HSPLandroid/app/PropertyInvalidatedCache;->isDisabled()Z
-HSPLandroid/app/PropertyInvalidatedCache;->isReservedNonce(J)Z
-HSPLandroid/app/PropertyInvalidatedCache;->maybeCheckConsistency(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/app/PropertyInvalidatedCache;->query(Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/util/LinkedHashMap;Landroid/app/PropertyInvalidatedCache$1;]Landroid/app/PropertyInvalidatedCache;megamorphic_types
-HSPLandroid/app/PropertyInvalidatedCache;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/app/PropertyInvalidatedCache;->refresh(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/app/PropertyInvalidatedCache;->registerCache()V
-HSPLandroid/app/QueuedWork$QueuedWorkHandler;-><init>(Landroid/os/Looper;)V
-HSPLandroid/app/QueuedWork$QueuedWorkHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/app/QueuedWork;->-$$Nest$smprocessPendingWork()V
-HSPLandroid/app/QueuedWork;->addFinisher(Ljava/lang/Runnable;)V
-HSPLandroid/app/QueuedWork;->getHandler()Landroid/os/Handler;
-HSPLandroid/app/QueuedWork;->handlerRemoveMessages(I)V+]Landroid/os/Handler;Landroid/app/QueuedWork$QueuedWorkHandler;
-HSPLandroid/app/QueuedWork;->hasPendingWork()Z
-HSPLandroid/app/QueuedWork;->processPendingWork()V
-HSPLandroid/app/QueuedWork;->queue(Ljava/lang/Runnable;Z)V
-HSPLandroid/app/QueuedWork;->removeFinisher(Ljava/lang/Runnable;)V
-HSPLandroid/app/QueuedWork;->waitToFinish()V
-HSPLandroid/app/ReceiverInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ReceiverInfo;
-HSPLandroid/app/ReceiverInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/ReceiverInfo;-><init>()V
-HSPLandroid/app/ReceiverInfo;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/app/ReceiverRestrictedContext;-><init>(Landroid/content/Context;)V
-HSPLandroid/app/RemoteAction$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/RemoteAction;
-HSPLandroid/app/RemoteAction$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/RemoteAction;-><init>(Landroid/graphics/drawable/Icon;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V
-HSPLandroid/app/RemoteAction;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/RemoteAction;->getActionIntent()Landroid/app/PendingIntent;
-HSPLandroid/app/RemoteAction;->getIcon()Landroid/graphics/drawable/Icon;
-HSPLandroid/app/RemoteAction;->getTitle()Ljava/lang/CharSequence;
-HSPLandroid/app/RemoteAction;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/RemoteInput$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/RemoteInput;
-HSPLandroid/app/RemoteInput$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/RemoteInput$1;->newArray(I)[Landroid/app/RemoteInput;
-HSPLandroid/app/RemoteInput$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/app/RemoteInput;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/RemoteInput;->getAllowFreeFormInput()Z
-HSPLandroid/app/RemoteInput;->getChoices()[Ljava/lang/CharSequence;
-HSPLandroid/app/RemoteInput;->getEditChoicesBeforeSending()I
-HSPLandroid/app/RemoteInput;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/ResourcesManager$ActivityResource;-><init>()V
-HSPLandroid/app/ResourcesManager$ActivityResource;-><init>(Landroid/app/ResourcesManager$ActivityResource-IA;)V
-HSPLandroid/app/ResourcesManager$ActivityResources;-><init>()V
-HSPLandroid/app/ResourcesManager$ActivityResources;-><init>(Landroid/app/ResourcesManager$ActivityResources-IA;)V
-HSPLandroid/app/ResourcesManager$ApkAssetsSupplier;-><init>(Landroid/app/ResourcesManager;)V
-HSPLandroid/app/ResourcesManager$ApkAssetsSupplier;->load(Landroid/app/ResourcesManager$ApkKey;)Landroid/content/res/ApkAssets;
-HSPLandroid/app/ResourcesManager$ApkKey;-><init>(Ljava/lang/String;ZZ)V
-HSPLandroid/app/ResourcesManager$ApkKey;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Ljava/lang/String;
-HSPLandroid/app/ResourcesManager$ApkKey;->hashCode()I+]Ljava/lang/Object;Ljava/lang/String;
-HSPLandroid/app/ResourcesManager$UpdateHandler;-><init>(Landroid/app/ResourcesManager;)V
-HSPLandroid/app/ResourcesManager$UpdateHandler;-><init>(Landroid/app/ResourcesManager;Landroid/app/ResourcesManager$UpdateHandler-IA;)V
-HSPLandroid/app/ResourcesManager;->-$$Nest$mloadApkAssets(Landroid/app/ResourcesManager;Landroid/app/ResourcesManager$ApkKey;)Landroid/content/res/ApkAssets;
-HSPLandroid/app/ResourcesManager;-><init>()V
-HSPLandroid/app/ResourcesManager;->addApplicationPathsLocked(Ljava/lang/String;[Ljava/lang/String;)V
-HSPLandroid/app/ResourcesManager;->appendLibAssetsForMainAssetPath(Ljava/lang/String;[Ljava/lang/String;)V
-HSPLandroid/app/ResourcesManager;->appendPendingAppInfoUpdate([Ljava/lang/String;Landroid/content/pm/ApplicationInfo;)V
-HSPLandroid/app/ResourcesManager;->applyAllPendingAppInfoUpdates()V
-HSPLandroid/app/ResourcesManager;->applyCompatConfiguration(ILandroid/content/res/Configuration;)Z
-HSPLandroid/app/ResourcesManager;->applyConfigurationToResources(Landroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;)Z
-HSPLandroid/app/ResourcesManager;->applyConfigurationToResourcesLocked(Landroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;Landroid/content/res/Configuration;Landroid/content/res/ResourcesKey;Landroid/content/res/ResourcesImpl;)V
-HSPLandroid/app/ResourcesManager;->applyDisplayMetricsToConfiguration(Landroid/util/DisplayMetrics;Landroid/content/res/Configuration;)V
-HSPLandroid/app/ResourcesManager;->applyNewResourceDirsLocked([Ljava/lang/String;Landroid/content/pm/ApplicationInfo;)V
-HSPLandroid/app/ResourcesManager;->cleanupReferences(Ljava/util/ArrayList;Ljava/lang/ref/ReferenceQueue;)V
-HSPLandroid/app/ResourcesManager;->cleanupReferences(Ljava/util/ArrayList;Ljava/lang/ref/ReferenceQueue;Ljava/util/function/Function;)V
-HSPLandroid/app/ResourcesManager;->combinedOverlayPaths([Ljava/lang/String;[Ljava/lang/String;)[Ljava/lang/String;
-HSPLandroid/app/ResourcesManager;->createApkAssetsSupplierNotLocked(Landroid/content/res/ResourcesKey;)Landroid/app/ResourcesManager$ApkAssetsSupplier;
-HSPLandroid/app/ResourcesManager;->createAssetManager(Landroid/content/res/ResourcesKey;Landroid/app/ResourcesManager$ApkAssetsSupplier;)Landroid/content/res/AssetManager;
-HSPLandroid/app/ResourcesManager;->createBaseTokenResources(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;Ljava/lang/ClassLoader;Ljava/util/List;)Landroid/content/res/Resources;
-HSPLandroid/app/ResourcesManager;->createResources(Landroid/content/res/ResourcesKey;Ljava/lang/ClassLoader;Landroid/app/ResourcesManager$ApkAssetsSupplier;)Landroid/content/res/Resources;
-HSPLandroid/app/ResourcesManager;->createResourcesForActivity(Landroid/os/IBinder;Landroid/content/res/ResourcesKey;Landroid/content/res/Configuration;Ljava/lang/Integer;Ljava/lang/ClassLoader;Landroid/app/ResourcesManager$ApkAssetsSupplier;)Landroid/content/res/Resources;
-HSPLandroid/app/ResourcesManager;->createResourcesForActivityLocked(Landroid/os/IBinder;Landroid/content/res/Configuration;Ljava/lang/Integer;Ljava/lang/ClassLoader;Landroid/content/res/ResourcesImpl;Landroid/content/res/CompatibilityInfo;)Landroid/content/res/Resources;
-HSPLandroid/app/ResourcesManager;->createResourcesImpl(Landroid/content/res/ResourcesKey;Landroid/app/ResourcesManager$ApkAssetsSupplier;)Landroid/content/res/ResourcesImpl;
-HSPLandroid/app/ResourcesManager;->createResourcesLocked(Ljava/lang/ClassLoader;Landroid/content/res/ResourcesImpl;Landroid/content/res/CompatibilityInfo;)Landroid/content/res/Resources;+]Landroid/content/res/CompatibilityInfo;Landroid/content/res/CompatibilityInfo$1;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/app/ResourcesManager;->extractApkKeys(Landroid/content/res/ResourcesKey;)Ljava/util/ArrayList;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/app/ResourcesManager;->findKeyForResourceImplLocked(Landroid/content/res/ResourcesImpl;)Landroid/content/res/ResourcesKey;
-HSPLandroid/app/ResourcesManager;->findOrCreateResourcesImplForKeyLocked(Landroid/content/res/ResourcesKey;)Landroid/content/res/ResourcesImpl;
-HSPLandroid/app/ResourcesManager;->findOrCreateResourcesImplForKeyLocked(Landroid/content/res/ResourcesKey;Landroid/app/ResourcesManager$ApkAssetsSupplier;)Landroid/content/res/ResourcesImpl;
-HSPLandroid/app/ResourcesManager;->findResourcesForActivityLocked(Landroid/os/IBinder;Landroid/content/res/ResourcesKey;Ljava/lang/ClassLoader;)Landroid/content/res/Resources;
-HSPLandroid/app/ResourcesManager;->findResourcesImplForKeyLocked(Landroid/content/res/ResourcesKey;)Landroid/content/res/ResourcesImpl;
-HSPLandroid/app/ResourcesManager;->generateConfig(Landroid/content/res/ResourcesKey;)Landroid/content/res/Configuration;
-HSPLandroid/app/ResourcesManager;->generateDisplayId(Landroid/content/res/ResourcesKey;)I
-HSPLandroid/app/ResourcesManager;->getAdjustedDisplay(ILandroid/content/res/Resources;)Landroid/view/Display;
-HSPLandroid/app/ResourcesManager;->getConfiguration()Landroid/content/res/Configuration;
-HSPLandroid/app/ResourcesManager;->getDisplayMetrics()Landroid/util/DisplayMetrics;
-HSPLandroid/app/ResourcesManager;->getDisplayMetrics(ILandroid/view/DisplayAdjustments;)Landroid/util/DisplayMetrics;
-HSPLandroid/app/ResourcesManager;->getDisplayMetrics(Landroid/content/res/Configuration;)Landroid/util/DisplayMetrics;
-HSPLandroid/app/ResourcesManager;->getInstance()Landroid/app/ResourcesManager;
-HSPLandroid/app/ResourcesManager;->getLocaleConfig()Landroid/app/LocaleConfig;
-HSPLandroid/app/ResourcesManager;->getOrCreateActivityResourcesStructLocked(Landroid/os/IBinder;)Landroid/app/ResourcesManager$ActivityResources;
-HSPLandroid/app/ResourcesManager;->getResources(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Ljava/lang/Integer;Landroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;Ljava/lang/ClassLoader;Ljava/util/List;)Landroid/content/res/Resources;
-HSPLandroid/app/ResourcesManager;->initializeApplicationPaths(Ljava/lang/String;[Ljava/lang/String;)V
-HSPLandroid/app/ResourcesManager;->isSameResourcesOverrideConfig(Landroid/os/IBinder;Landroid/content/res/Configuration;)Z
-HSPLandroid/app/ResourcesManager;->lambda$cleanupReferences$1(Ljava/util/function/Function;Ljava/util/HashSet;Ljava/lang/Object;)Z
-HSPLandroid/app/ResourcesManager;->lambda$createResourcesForActivityLocked$0(Landroid/app/ResourcesManager$ActivityResource;)Ljava/lang/ref/WeakReference;
-HSPLandroid/app/ResourcesManager;->loadApkAssets(Landroid/app/ResourcesManager$ApkKey;)Landroid/content/res/ApkAssets;
-HSPLandroid/app/ResourcesManager;->overlayPathToIdmapPath(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/app/ResourcesManager;->rebaseActivityOverrideConfig(Landroid/app/ResourcesManager$ActivityResource;Landroid/content/res/Configuration;I)Landroid/content/res/ResourcesKey;
-HSPLandroid/app/ResourcesManager;->rebaseKeyForActivity(Landroid/os/IBinder;Landroid/content/res/ResourcesKey;Z)V
-HSPLandroid/app/ResourcesManager;->rebaseKeyForDisplay(Landroid/content/res/ResourcesKey;I)V
-HSPLandroid/app/ResourcesManager;->redirectResourcesToNewImplLocked(Landroid/util/ArrayMap;)V
-HSPLandroid/app/ResourcesManager;->updateResourcesForActivity(Landroid/os/IBinder;Landroid/content/res/Configuration;I)V
-HSPLandroid/app/ResultInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ResultInfo;
-HSPLandroid/app/ResultInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/ResultInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/Service;-><init>()V
-HSPLandroid/app/Service;->attach(Landroid/content/Context;Landroid/app/ActivityThread;Ljava/lang/String;Landroid/os/IBinder;Landroid/app/Application;Ljava/lang/Object;)V
-HSPLandroid/app/Service;->attachBaseContext(Landroid/content/Context;)V
-HSPLandroid/app/Service;->clearStartForegroundServiceStackTrace()V
-HSPLandroid/app/Service;->createServiceBaseContext(Landroid/app/ActivityThread;Landroid/app/LoadedApk;)Landroid/content/Context;
-HSPLandroid/app/Service;->detachAndCleanUp()V
-HSPLandroid/app/Service;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
-HSPLandroid/app/Service;->getApplication()Landroid/app/Application;
-HSPLandroid/app/Service;->getClassName()Ljava/lang/String;
-HSPLandroid/app/Service;->logForegroundServiceStopIfNecessary()V
-HSPLandroid/app/Service;->onConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/app/Service;->onCreate()V
-HSPLandroid/app/Service;->onDestroy()V
-HSPLandroid/app/Service;->onLowMemory()V
-HSPLandroid/app/Service;->onStart(Landroid/content/Intent;I)V
-HSPLandroid/app/Service;->onStartCommand(Landroid/content/Intent;II)I
-HSPLandroid/app/Service;->onTrimMemory(I)V
-HSPLandroid/app/Service;->onUnbind(Landroid/content/Intent;)Z
-HSPLandroid/app/Service;->setStartForegroundServiceStackTrace(Ljava/lang/String;Landroid/app/StackTrace;)V
-HSPLandroid/app/Service;->startForeground(ILandroid/app/Notification;)V
-HSPLandroid/app/Service;->stopForeground(I)V
-HSPLandroid/app/Service;->stopForeground(Z)V
-HSPLandroid/app/Service;->stopSelf()V
-HSPLandroid/app/Service;->stopSelf(I)V
-HSPLandroid/app/Service;->stopSelfResult(I)Z
-HSPLandroid/app/ServiceConnectionLeaked;-><init>(Ljava/lang/String;)V
-HSPLandroid/app/ServiceStartArgs$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ServiceStartArgs;
-HSPLandroid/app/ServiceStartArgs$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/ServiceStartArgs;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/SharedPreferencesImpl$$ExternalSyntheticLambda0;-><init>(Landroid/app/SharedPreferencesImpl;)V
-HSPLandroid/app/SharedPreferencesImpl$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/app/SharedPreferencesImpl$1;->run()V
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl$$ExternalSyntheticLambda0;-><init>(Landroid/app/SharedPreferencesImpl$EditorImpl;Landroid/app/SharedPreferencesImpl$MemoryCommitResult;)V
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl$1;-><init>(Landroid/app/SharedPreferencesImpl$EditorImpl;Landroid/app/SharedPreferencesImpl$MemoryCommitResult;J)V
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl$1;->run()V
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl$2;-><init>(Landroid/app/SharedPreferencesImpl$EditorImpl;Ljava/lang/Runnable;)V
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl$2;->run()V
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl;-><init>(Landroid/app/SharedPreferencesImpl;)V
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->apply()V
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->clear()Landroid/content/SharedPreferences$Editor;
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->commit()Z
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->commitToMemory()Landroid/app/SharedPreferencesImpl$MemoryCommitResult;+]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Ljava/lang/Object;Ljava/lang/String;,Ljava/lang/Boolean;,Ljava/lang/Long;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;]Ljava/util/Set;Ljava/util/HashMap$EntrySet;
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->notifyListeners(Landroid/app/SharedPreferencesImpl$MemoryCommitResult;)V
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->putBoolean(Ljava/lang/String;Z)Landroid/content/SharedPreferences$Editor;
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->putFloat(Ljava/lang/String;F)Landroid/content/SharedPreferences$Editor;
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->putInt(Ljava/lang/String;I)Landroid/content/SharedPreferences$Editor;
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->putLong(Ljava/lang/String;J)Landroid/content/SharedPreferences$Editor;
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->putString(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->putStringSet(Ljava/lang/String;Ljava/util/Set;)Landroid/content/SharedPreferences$Editor;
-HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->remove(Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;
-HSPLandroid/app/SharedPreferencesImpl$MemoryCommitResult;-><init>(JZLjava/util/List;Ljava/util/Set;Ljava/util/Map;)V
-HSPLandroid/app/SharedPreferencesImpl$MemoryCommitResult;-><init>(JZLjava/util/List;Ljava/util/Set;Ljava/util/Map;Landroid/app/SharedPreferencesImpl$MemoryCommitResult-IA;)V
-HSPLandroid/app/SharedPreferencesImpl$MemoryCommitResult;->setDiskWriteResult(ZZ)V
-HSPLandroid/app/SharedPreferencesImpl$SharedPreferencesThreadFactory;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;
-HSPLandroid/app/SharedPreferencesImpl;->-$$Nest$fgetmCurrentMemoryStateGeneration(Landroid/app/SharedPreferencesImpl;)J
-HSPLandroid/app/SharedPreferencesImpl;->-$$Nest$fgetmDiskWritesInFlight(Landroid/app/SharedPreferencesImpl;)I
-HSPLandroid/app/SharedPreferencesImpl;->-$$Nest$fgetmListeners(Landroid/app/SharedPreferencesImpl;)Ljava/util/WeakHashMap;
-HSPLandroid/app/SharedPreferencesImpl;->-$$Nest$fgetmLock(Landroid/app/SharedPreferencesImpl;)Ljava/lang/Object;
-HSPLandroid/app/SharedPreferencesImpl;->-$$Nest$fgetmMap(Landroid/app/SharedPreferencesImpl;)Ljava/util/Map;
-HSPLandroid/app/SharedPreferencesImpl;->-$$Nest$fgetmWritingToDiskLock(Landroid/app/SharedPreferencesImpl;)Ljava/lang/Object;
-HSPLandroid/app/SharedPreferencesImpl;->-$$Nest$fputmCurrentMemoryStateGeneration(Landroid/app/SharedPreferencesImpl;J)V
-HSPLandroid/app/SharedPreferencesImpl;->-$$Nest$fputmDiskWritesInFlight(Landroid/app/SharedPreferencesImpl;I)V
-HSPLandroid/app/SharedPreferencesImpl;->-$$Nest$fputmMap(Landroid/app/SharedPreferencesImpl;Ljava/util/Map;)V
-HSPLandroid/app/SharedPreferencesImpl;->-$$Nest$menqueueDiskWrite(Landroid/app/SharedPreferencesImpl;Landroid/app/SharedPreferencesImpl$MemoryCommitResult;Ljava/lang/Runnable;)V
-HSPLandroid/app/SharedPreferencesImpl;->-$$Nest$mwriteToFile(Landroid/app/SharedPreferencesImpl;Landroid/app/SharedPreferencesImpl$MemoryCommitResult;Z)V
-HSPLandroid/app/SharedPreferencesImpl;-><init>(Ljava/io/File;I)V
-HSPLandroid/app/SharedPreferencesImpl;->awaitLoadedLocked()V
-HSPLandroid/app/SharedPreferencesImpl;->contains(Ljava/lang/String;)Z
-HSPLandroid/app/SharedPreferencesImpl;->createFileOutputStream(Ljava/io/File;)Ljava/io/FileOutputStream;
-HSPLandroid/app/SharedPreferencesImpl;->edit()Landroid/content/SharedPreferences$Editor;
-HSPLandroid/app/SharedPreferencesImpl;->enqueueDiskWrite(Landroid/app/SharedPreferencesImpl$MemoryCommitResult;Ljava/lang/Runnable;)V
-HSPLandroid/app/SharedPreferencesImpl;->getAll()Ljava/util/Map;
-HSPLandroid/app/SharedPreferencesImpl;->getBoolean(Ljava/lang/String;Z)Z
-HSPLandroid/app/SharedPreferencesImpl;->getFloat(Ljava/lang/String;F)F
-HSPLandroid/app/SharedPreferencesImpl;->getInt(Ljava/lang/String;I)I
-HSPLandroid/app/SharedPreferencesImpl;->getLong(Ljava/lang/String;J)J
-HSPLandroid/app/SharedPreferencesImpl;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/app/SharedPreferencesImpl;->getStringSet(Ljava/lang/String;Ljava/util/Set;)Ljava/util/Set;
-HSPLandroid/app/SharedPreferencesImpl;->hasFileChangedUnexpectedly()Z
-HSPLandroid/app/SharedPreferencesImpl;->lambda$startLoadFromDisk$0()V
-HSPLandroid/app/SharedPreferencesImpl;->loadFromDisk()V
-HSPLandroid/app/SharedPreferencesImpl;->makeBackupFile(Ljava/io/File;)Ljava/io/File;
-HSPLandroid/app/SharedPreferencesImpl;->registerOnSharedPreferenceChangeListener(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V
-HSPLandroid/app/SharedPreferencesImpl;->startLoadFromDisk()V
-HSPLandroid/app/SharedPreferencesImpl;->startReloadIfChangedUnexpectedly()V
-HSPLandroid/app/SharedPreferencesImpl;->unregisterOnSharedPreferenceChangeListener(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V
-HSPLandroid/app/SharedPreferencesImpl;->writeToFile(Landroid/app/SharedPreferencesImpl$MemoryCommitResult;Z)V+]Ljava/io/File;Ljava/io/File;]Lcom/android/internal/util/ExponentiallyBucketedHistogram;Lcom/android/internal/util/ExponentiallyBucketedHistogram;]Landroid/app/SharedPreferencesImpl$MemoryCommitResult;Landroid/app/SharedPreferencesImpl$MemoryCommitResult;]Ljava/io/FileOutputStream;Ljava/io/FileOutputStream;
-HSPLandroid/app/StackTrace;-><init>(Ljava/lang/String;)V
-HSPLandroid/app/StatusBarManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/app/SyncNotedAppOp$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/SyncNotedAppOp;
-HSPLandroid/app/SyncNotedAppOp$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/SyncNotedAppOp;-><init>(IILjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/SyncNotedAppOp;-><init>(ILjava/lang/String;)V
-HSPLandroid/app/SyncNotedAppOp;-><init>(ILjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/SyncNotedAppOp;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/SyncNotedAppOp;->getAttributionTag()Ljava/lang/String;
-HSPLandroid/app/SyncNotedAppOp;->getOp()Ljava/lang/String;
-HSPLandroid/app/SyncNotedAppOp;->getOpMode()I
-HSPLandroid/app/SyncNotedAppOp;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/SystemServiceRegistry$100;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$103;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$104;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$105;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$106;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$107;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$108;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$109;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$10;->createService(Landroid/app/ContextImpl;)Landroid/media/MediaRouter;
-HSPLandroid/app/SystemServiceRegistry$10;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$110;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$111;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$112;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$113;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$114;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$115;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$116;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$117;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$122;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$123;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$124;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$125;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$126;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$127;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$128;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$129;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$12;->createService(Landroid/app/ContextImpl;)Landroid/view/textclassifier/TextClassificationManager;
-HSPLandroid/app/SystemServiceRegistry$12;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$130;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$131;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$138;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$139;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$13;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$14;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$15;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$18;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$1;->createService(Landroid/app/ContextImpl;)Landroid/view/accessibility/AccessibilityManager;
-HSPLandroid/app/SystemServiceRegistry$1;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$21;->createService(Landroid/app/ContextImpl;)Landroid/app/admin/DevicePolicyManager;
-HSPLandroid/app/SystemServiceRegistry$21;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$22;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$23;->createService(Landroid/app/ContextImpl;)Landroid/os/BatteryManager;
-HSPLandroid/app/SystemServiceRegistry$23;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$24;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$25;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$26;->createService(Landroid/app/ContextImpl;)Landroid/hardware/input/InputManager;
-HSPLandroid/app/SystemServiceRegistry$26;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$27;->createService(Landroid/app/ContextImpl;)Landroid/hardware/display/DisplayManager;
-HSPLandroid/app/SystemServiceRegistry$27;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$28;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$29;->getService(Landroid/app/ContextImpl;)Landroid/view/inputmethod/InputMethodManager;
-HSPLandroid/app/SystemServiceRegistry$29;->getService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$2;->createService(Landroid/app/ContextImpl;)Landroid/view/accessibility/CaptioningManager;
-HSPLandroid/app/SystemServiceRegistry$2;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$31;->createService(Landroid/app/ContextImpl;)Landroid/app/KeyguardManager;
-HSPLandroid/app/SystemServiceRegistry$31;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$32;->createService(Landroid/app/ContextImpl;)Landroid/view/LayoutInflater;
-HSPLandroid/app/SystemServiceRegistry$32;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$33;->createService(Landroid/app/ContextImpl;)Landroid/location/LocationManager;
-HSPLandroid/app/SystemServiceRegistry$33;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$34;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$35;->createService(Landroid/app/ContextImpl;)Landroid/app/NotificationManager;
-HSPLandroid/app/SystemServiceRegistry$35;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$36;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$37;->createService(Landroid/app/ContextImpl;)Landroid/os/PowerManager;
-HSPLandroid/app/SystemServiceRegistry$37;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$38;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$39;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$3;->createService(Landroid/app/ContextImpl;)Landroid/accounts/AccountManager;
-HSPLandroid/app/SystemServiceRegistry$3;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$40;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$41;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$42;->createService(Landroid/app/ContextImpl;)Landroid/hardware/SensorManager;
-HSPLandroid/app/SystemServiceRegistry$42;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$43;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$44;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$45;->createService(Landroid/app/ContextImpl;)Landroid/os/storage/StorageManager;
-HSPLandroid/app/SystemServiceRegistry$45;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$46;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$47;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$48;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$49;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$4;->createService(Landroid/app/ContextImpl;)Landroid/app/ActivityManager;
-HSPLandroid/app/SystemServiceRegistry$4;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$50;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$51;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$52;->createService(Landroid/app/ContextImpl;)Landroid/app/UiModeManager;
-HSPLandroid/app/SystemServiceRegistry$52;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$53;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$54;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$55;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$56;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$57;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$58;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$59;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$60;->createService(Landroid/app/ContextImpl;)Landroid/view/WindowManager;
-HSPLandroid/app/SystemServiceRegistry$60;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$61;->createService(Landroid/app/ContextImpl;)Landroid/os/UserManager;
-HSPLandroid/app/SystemServiceRegistry$61;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$62;->createService(Landroid/app/ContextImpl;)Landroid/app/AppOpsManager;
-HSPLandroid/app/SystemServiceRegistry$62;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$63;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$64;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$65;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$66;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$67;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$68;->createService(Landroid/app/ContextImpl;)Landroid/companion/virtual/VirtualDeviceManager;+]Landroid/app/ContextImpl;Landroid/app/ContextImpl;]Landroid/content/res/Resources;Landroid/content/res/Resources;
-HSPLandroid/app/SystemServiceRegistry$68;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$71;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$74;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$75;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$77;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$78;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$7;->createService(Landroid/app/ContextImpl;)Landroid/app/AlarmManager;
-HSPLandroid/app/SystemServiceRegistry$7;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$83;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$84;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$85;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$86;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$87;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$88;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$89;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$8;->createService(Landroid/app/ContextImpl;)Landroid/media/AudioManager;
-HSPLandroid/app/SystemServiceRegistry$8;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$90;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$91;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$92;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$93;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$94;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$95;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$96;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$97;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$98;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$99;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$9;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$CachedServiceFetcher;->getService(Landroid/app/ContextImpl;)Ljava/lang/Object;+]Landroid/app/SystemServiceRegistry$CachedServiceFetcher;megamorphic_types]Ljava/lang/Object;[Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$StaticServiceFetcher;->getService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry;->createServiceCache()[Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry;->getSystemService(Landroid/app/ContextImpl;Ljava/lang/String;)Ljava/lang/Object;+]Landroid/app/SystemServiceRegistry$ServiceFetcher;megamorphic_types
-HSPLandroid/app/SystemServiceRegistry;->getSystemServiceFetcher(Ljava/lang/String;)Landroid/app/SystemServiceRegistry$ServiceFetcher;+]Ljava/util/Map;Landroid/util/ArrayMap;
-HSPLandroid/app/SystemServiceRegistry;->getSystemServiceName(Ljava/lang/Class;)Ljava/lang/String;
-HSPLandroid/app/TaskInfo;-><init>()V
-HSPLandroid/app/TaskInfo;->getWindowingMode()I
-HSPLandroid/app/TaskInfo;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/app/TaskStackListener;-><init>()V
-HSPLandroid/app/TaskStackListener;->onActivityRequestedOrientationChanged(II)V
-HSPLandroid/app/TaskStackListener;->onActivityRestartAttempt(Landroid/app/ActivityManager$RunningTaskInfo;ZZZ)V
-HSPLandroid/app/TaskStackListener;->onRecentTaskListUpdated()V
-HSPLandroid/app/TaskStackListener;->onTaskCreated(ILandroid/content/ComponentName;)V
-HSPLandroid/app/TaskStackListener;->onTaskDescriptionChanged(ILandroid/app/ActivityManager$TaskDescription;)V
-HSPLandroid/app/TaskStackListener;->onTaskDescriptionChanged(Landroid/app/ActivityManager$RunningTaskInfo;)V
-HSPLandroid/app/TaskStackListener;->onTaskFocusChanged(IZ)V
-HSPLandroid/app/TaskStackListener;->onTaskMovedToFront(I)V
-HSPLandroid/app/TaskStackListener;->onTaskMovedToFront(Landroid/app/ActivityManager$RunningTaskInfo;)V
-HSPLandroid/app/TaskStackListener;->onTaskRemovalStarted(I)V
-HSPLandroid/app/TaskStackListener;->onTaskRemovalStarted(Landroid/app/ActivityManager$RunningTaskInfo;)V
-HSPLandroid/app/TaskStackListener;->onTaskRemoved(I)V
-HSPLandroid/app/TaskStackListener;->onTaskRequestedOrientationChanged(II)V
-HSPLandroid/app/UiModeManager$1;-><init>(Landroid/app/UiModeManager;)V
-HSPLandroid/app/UiModeManager$Globals;->-$$Nest$fgetmService(Landroid/app/UiModeManager$Globals;)Landroid/app/IUiModeManager;
-HSPLandroid/app/UiModeManager$Globals;-><init>(Landroid/app/IUiModeManager;)V
-HSPLandroid/app/UiModeManager$OnProjectionStateChangedListenerResourceManager;-><init>()V
-HSPLandroid/app/UiModeManager$OnProjectionStateChangedListenerResourceManager;-><init>(Landroid/app/UiModeManager$OnProjectionStateChangedListenerResourceManager-IA;)V
-HSPLandroid/app/UiModeManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/app/UiModeManager;->getActiveProjectionTypes()I
-HSPLandroid/app/UiModeManager;->getCurrentModeType()I
-HSPLandroid/app/UriGrantsManager$1;->create()Landroid/app/IUriGrantsManager;
-HSPLandroid/app/UriGrantsManager$1;->create()Ljava/lang/Object;
-HSPLandroid/app/UriGrantsManager;->getService()Landroid/app/IUriGrantsManager;
-HSPLandroid/app/WallpaperColors$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/WallpaperColors;
-HSPLandroid/app/WallpaperColors$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/WallpaperColors;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/WallpaperColors;->getColorHints()I
-HSPLandroid/app/WallpaperColors;->getMainColors()Ljava/util/List;
-HSPLandroid/app/WallpaperManager$Globals$1;-><init>(Landroid/app/WallpaperManager$Globals;)V
-HSPLandroid/app/WallpaperManager$Globals;-><init>(Landroid/app/IWallpaperManager;Landroid/os/Looper;)V
-HSPLandroid/app/WallpaperManager$Globals;->forgetLoadedWallpaper()V
-HSPLandroid/app/WallpaperManager$Globals;->getWallpaperColors(III)Landroid/app/WallpaperColors;
-HSPLandroid/app/WallpaperManager;-><init>(Landroid/app/IWallpaperManager;Landroid/content/Context;Landroid/os/Handler;)V
-HSPLandroid/app/WallpaperManager;->getWallpaperColors(I)Landroid/app/WallpaperColors;
-HSPLandroid/app/WallpaperManager;->getWallpaperColors(II)Landroid/app/WallpaperColors;
-HSPLandroid/app/WallpaperManager;->getWallpaperInfo()Landroid/app/WallpaperInfo;
-HSPLandroid/app/WallpaperManager;->getWallpaperInfo(I)Landroid/app/WallpaperInfo;
-HSPLandroid/app/WallpaperManager;->initGlobals(Landroid/app/IWallpaperManager;Landroid/os/Looper;)V
-HSPLandroid/app/WallpaperManager;->setWallpaperZoomOut(Landroid/os/IBinder;F)V
-HSPLandroid/app/WindowConfiguration$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/WindowConfiguration;
-HSPLandroid/app/WindowConfiguration$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/WindowConfiguration;-><init>()V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLandroid/app/WindowConfiguration;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/WindowConfiguration;->activityTypeToString(I)Ljava/lang/String;
-HSPLandroid/app/WindowConfiguration;->areConfigurationsEqualForDisplay(Landroid/content/res/Configuration;Landroid/content/res/Configuration;)Z+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLandroid/app/WindowConfiguration;->canReceiveKeys()Z
-HSPLandroid/app/WindowConfiguration;->compareTo(Landroid/app/WindowConfiguration;)I
-HSPLandroid/app/WindowConfiguration;->diff(Landroid/app/WindowConfiguration;Z)J+]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HSPLandroid/app/WindowConfiguration;->equals(Ljava/lang/Object;)Z
-HSPLandroid/app/WindowConfiguration;->getActivityType()I
-HSPLandroid/app/WindowConfiguration;->getAppBounds()Landroid/graphics/Rect;
-HSPLandroid/app/WindowConfiguration;->getBounds()Landroid/graphics/Rect;
-HSPLandroid/app/WindowConfiguration;->getDisplayRotation()I
-HSPLandroid/app/WindowConfiguration;->getMaxBounds()Landroid/graphics/Rect;
-HSPLandroid/app/WindowConfiguration;->getRotation()I
-HSPLandroid/app/WindowConfiguration;->getWindowingMode()I
-HSPLandroid/app/WindowConfiguration;->hasWindowDecorCaption()Z
-HSPLandroid/app/WindowConfiguration;->hasWindowShadow()Z
-HSPLandroid/app/WindowConfiguration;->inMultiWindowMode(I)Z
-HSPLandroid/app/WindowConfiguration;->isFloating(I)Z
-HSPLandroid/app/WindowConfiguration;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/app/WindowConfiguration;->setActivityType(I)V
-HSPLandroid/app/WindowConfiguration;->setAlwaysOnTop(I)V
-HSPLandroid/app/WindowConfiguration;->setAppBounds(IIII)V
-HSPLandroid/app/WindowConfiguration;->setAppBounds(Landroid/graphics/Rect;)V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLandroid/app/WindowConfiguration;->setBounds(Landroid/graphics/Rect;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HSPLandroid/app/WindowConfiguration;->setDisplayRotation(I)V
-HSPLandroid/app/WindowConfiguration;->setDisplayWindowingMode(I)V
-HSPLandroid/app/WindowConfiguration;->setMaxBounds(Landroid/graphics/Rect;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HSPLandroid/app/WindowConfiguration;->setRotation(I)V
-HSPLandroid/app/WindowConfiguration;->setTo(Landroid/app/WindowConfiguration;)V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLandroid/app/WindowConfiguration;->setTo(Landroid/app/WindowConfiguration;I)V
-HSPLandroid/app/WindowConfiguration;->setToDefaults()V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLandroid/app/WindowConfiguration;->setWindowingMode(I)V
-HSPLandroid/app/WindowConfiguration;->tasksAreFloating()Z
-HSPLandroid/app/WindowConfiguration;->toString()Ljava/lang/String;
-HSPLandroid/app/WindowConfiguration;->unset()V
-HSPLandroid/app/WindowConfiguration;->updateFrom(Landroid/app/WindowConfiguration;)I+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLandroid/app/WindowConfiguration;->windowingModeToString(I)Ljava/lang/String;
-HSPLandroid/app/WindowConfiguration;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda5;-><init>(Landroid/app/admin/DevicePolicyManager;)V
-HSPLandroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda5;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda6;-><init>(Landroid/app/admin/DevicePolicyManager;)V
-HSPLandroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda7;-><init>(Landroid/app/admin/DevicePolicyManager;)V
-HSPLandroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda8;-><init>(Landroid/app/admin/DevicePolicyManager;)V
-HSPLandroid/app/admin/DevicePolicyManager;-><init>(Landroid/content/Context;Landroid/app/admin/IDevicePolicyManager;)V
-HSPLandroid/app/admin/DevicePolicyManager;-><init>(Landroid/content/Context;Landroid/app/admin/IDevicePolicyManager;Z)V
-HSPLandroid/app/admin/DevicePolicyManager;->getActiveAdmins()Ljava/util/List;
-HSPLandroid/app/admin/DevicePolicyManager;->getActiveAdminsAsUser(I)Ljava/util/List;
-HSPLandroid/app/admin/DevicePolicyManager;->getDeviceOwner()Ljava/lang/String;
-HSPLandroid/app/admin/DevicePolicyManager;->getDeviceOwnerComponentInner(Z)Landroid/content/ComponentName;
-HSPLandroid/app/admin/DevicePolicyManager;->getDeviceOwnerComponentOnAnyUser()Landroid/content/ComponentName;
-HSPLandroid/app/admin/DevicePolicyManager;->getDeviceOwnerComponentOnCallingUser()Landroid/content/ComponentName;
-HSPLandroid/app/admin/DevicePolicyManager;->getKeyguardDisabledFeatures(Landroid/content/ComponentName;I)I
-HSPLandroid/app/admin/DevicePolicyManager;->getMaximumTimeToLock(Landroid/content/ComponentName;I)J
-HSPLandroid/app/admin/DevicePolicyManager;->getPasswordQuality(Landroid/content/ComponentName;)I
-HSPLandroid/app/admin/DevicePolicyManager;->getPasswordQuality(Landroid/content/ComponentName;I)I
-HSPLandroid/app/admin/DevicePolicyManager;->getProfileOwner()Landroid/content/ComponentName;
-HSPLandroid/app/admin/DevicePolicyManager;->getProfileOwnerAsUser(I)Landroid/content/ComponentName;
-HSPLandroid/app/admin/DevicePolicyManager;->getResources()Landroid/app/admin/DevicePolicyResourcesManager;
-HSPLandroid/app/admin/DevicePolicyManager;->getService()Landroid/app/admin/IDevicePolicyManager;
-HSPLandroid/app/admin/DevicePolicyManager;->getStorageEncryptionStatus()I
-HSPLandroid/app/admin/DevicePolicyManager;->getStorageEncryptionStatus(I)I
-HSPLandroid/app/admin/DevicePolicyManager;->isAdminActive(Landroid/content/ComponentName;)Z
-HSPLandroid/app/admin/DevicePolicyManager;->isAdminActiveAsUser(Landroid/content/ComponentName;I)Z
-HSPLandroid/app/admin/DevicePolicyManager;->isCommonCriteriaModeEnabled(Landroid/content/ComponentName;)Z
-HSPLandroid/app/admin/DevicePolicyManager;->isDeviceManaged()Z
-HSPLandroid/app/admin/DevicePolicyManager;->isDeviceOwnerApp(Ljava/lang/String;)Z
-HSPLandroid/app/admin/DevicePolicyManager;->isDeviceOwnerAppOnCallingUser(Ljava/lang/String;)Z
-HSPLandroid/app/admin/DevicePolicyManager;->isOrganizationOwnedDeviceWithManagedProfile()Z
-HSPLandroid/app/admin/DevicePolicyManager;->isParentInstance()Z
-HSPLandroid/app/admin/DevicePolicyManager;->isProfileOwnerApp(Ljava/lang/String;)Z
-HSPLandroid/app/admin/DevicePolicyManager;->myUserId()I
-HSPLandroid/app/admin/DevicePolicyManager;->throwIfParentInstance(Ljava/lang/String;)V
-HSPLandroid/app/admin/DevicePolicyResourcesManager;-><clinit>()V
-HSPLandroid/app/admin/DevicePolicyResourcesManager;-><init>(Landroid/content/Context;Landroid/app/admin/IDevicePolicyManager;)V
-HSPLandroid/app/admin/DevicePolicyResourcesManager;->getDrawable(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/function/Supplier;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getActiveAdmins(I)Ljava/util/List;
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getDeviceOwnerComponent(Z)Landroid/content/ComponentName;
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getKeyguardDisabledFeatures(Landroid/content/ComponentName;IZ)I
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getPasswordQuality(Landroid/content/ComponentName;IZ)I
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getProfileOwnerAsUser(I)Landroid/content/ComponentName;
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getStorageEncryptionStatus(Ljava/lang/String;I)I
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->hasDeviceOwner()Z
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->isAdminActive(Landroid/content/ComponentName;I)Z
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->isOrganizationOwnedDeviceWithManagedProfile()Z
-HSPLandroid/app/admin/IDevicePolicyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/admin/IDevicePolicyManager;
-HSPLandroid/app/admin/ParcelableResource$1;-><init>()V
-HSPLandroid/app/admin/ParcelableResource;-><clinit>()V
-HSPLandroid/app/admin/ParcelableResource;->loadDefaultDrawable(Ljava/util/function/Supplier;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/app/assist/AssistContent;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/assist/AssistContent;->writeToParcelInternal(Landroid/os/Parcel;I)V
-HSPLandroid/app/assist/AssistStructure$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/assist/AssistStructure;
-HSPLandroid/app/assist/AssistStructure$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/assist/AssistStructure$ParcelTransferReader;->fetchData()V
-HSPLandroid/app/assist/AssistStructure$ParcelTransferReader;->go()V
-HSPLandroid/app/assist/AssistStructure$ParcelTransferReader;->readParcel(II)Landroid/os/Parcel;
-HSPLandroid/app/assist/AssistStructure$ParcelTransferWriter;-><init>(Landroid/app/assist/AssistStructure;Landroid/os/Parcel;)V
-HSPLandroid/app/assist/AssistStructure$ParcelTransferWriter;->pushViewStackEntry(Landroid/app/assist/AssistStructure$ViewNode;I)V
-HSPLandroid/app/assist/AssistStructure$ParcelTransferWriter;->writeNextEntryToParcel(Landroid/app/assist/AssistStructure;Landroid/os/Parcel;Landroid/os/PooledStringWriter;)Z
-HSPLandroid/app/assist/AssistStructure$ParcelTransferWriter;->writeToParcel(Landroid/app/assist/AssistStructure;Landroid/os/Parcel;)V
-HSPLandroid/app/assist/AssistStructure$ParcelTransferWriter;->writeToParcelInner(Landroid/app/assist/AssistStructure;Landroid/os/Parcel;)Z
-HSPLandroid/app/assist/AssistStructure$ParcelTransferWriter;->writeView(Landroid/app/assist/AssistStructure$ViewNode;Landroid/os/Parcel;Landroid/os/PooledStringWriter;I)V
-HSPLandroid/app/assist/AssistStructure$SendChannel;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/app/assist/AssistStructure$ViewNode;-><init>()V
-HSPLandroid/app/assist/AssistStructure$ViewNode;-><init>(Landroid/app/assist/AssistStructure$ParcelTransferReader;I)V
-HSPLandroid/app/assist/AssistStructure$ViewNode;->getAutofillId()Landroid/view/autofill/AutofillId;
-HSPLandroid/app/assist/AssistStructure$ViewNode;->getChildCount()I
-HSPLandroid/app/assist/AssistStructure$ViewNode;->writeSelfToParcel(Landroid/os/Parcel;Landroid/os/PooledStringWriter;Z[FZ)I
-HSPLandroid/app/assist/AssistStructure$ViewNode;->writeString(Landroid/os/Parcel;Landroid/os/PooledStringWriter;Ljava/lang/String;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->getChildCount()I
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->getNodeText()Landroid/app/assist/AssistStructure$ViewNodeText;
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->newChild(I)Landroid/view/ViewStructure;
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setAutofillHints([Ljava/lang/String;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setAutofillId(Landroid/view/autofill/AutofillId;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setAutofillType(I)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setAutofillValue(Landroid/view/autofill/AutofillValue;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setChildCount(I)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setClassName(Ljava/lang/String;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setClickable(Z)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setContentDescription(Ljava/lang/CharSequence;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setDataIsSensitive(Z)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setDimens(IIIIII)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setEnabled(Z)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setFocusable(Z)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setFocused(Z)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setHint(Ljava/lang/CharSequence;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setHintIdEntry(Ljava/lang/String;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setId(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setImportantForAutofill(I)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setInputType(I)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setLongClickable(Z)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setMaxTextEms(I)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setMaxTextLength(I)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setMinTextEms(I)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setOpaque(Z)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setReceiveContentMimeTypes([Ljava/lang/String;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setText(Ljava/lang/CharSequence;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setTextIdEntry(Ljava/lang/String;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setVisibility(I)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeParcelable$1;-><init>()V
-HSPLandroid/app/assist/AssistStructure$ViewNodeParcelable;-><clinit>()V
-HSPLandroid/app/assist/AssistStructure$ViewNodeText;-><init>(Landroid/os/Parcel;Z)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeText;->isSimple()Z
-HSPLandroid/app/assist/AssistStructure$ViewNodeText;->writeToParcel(Landroid/os/Parcel;ZZ)V
-HSPLandroid/app/assist/AssistStructure$WindowNode;-><init>(Landroid/app/assist/AssistStructure$ParcelTransferReader;)V
-HSPLandroid/app/assist/AssistStructure$WindowNode;-><init>(Landroid/app/assist/AssistStructure;Landroid/view/ViewRootImpl;ZI)V
-HSPLandroid/app/assist/AssistStructure$WindowNode;->resolveViewAutofillFlags(Landroid/content/Context;I)I
-HSPLandroid/app/assist/AssistStructure$WindowNode;->writeSelfToParcel(Landroid/os/Parcel;Landroid/os/PooledStringWriter;[F)V
-HSPLandroid/app/assist/AssistStructure;-><init>()V
-HSPLandroid/app/assist/AssistStructure;-><init>(Landroid/app/Activity;ZI)V
-HSPLandroid/app/assist/AssistStructure;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/assist/AssistStructure;->clearSendChannel()V
-HSPLandroid/app/assist/AssistStructure;->ensureData()V
-HSPLandroid/app/assist/AssistStructure;->waitForReady()Z
-HSPLandroid/app/assist/AssistStructure;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/backup/BackupAgent$BackupServiceBinder;-><init>(Landroid/app/backup/BackupAgent;)V
-HSPLandroid/app/backup/BackupAgent$BackupServiceBinder;->doBackup(Landroid/os/ParcelFileDescriptor;Landroid/os/ParcelFileDescriptor;Landroid/os/ParcelFileDescriptor;JLandroid/app/backup/IBackupCallback;I)V
-HSPLandroid/app/backup/BackupAgent$SharedPrefsSynchronizer;-><init>(Landroid/app/backup/BackupAgent;)V
-HSPLandroid/app/backup/BackupAgent$SharedPrefsSynchronizer;->run()V
-HSPLandroid/app/backup/BackupAgent;-><init>()V
-HSPLandroid/app/backup/BackupAgent;->attach(Landroid/content/Context;)V
-HSPLandroid/app/backup/BackupAgent;->getHandler()Landroid/os/Handler;
-HSPLandroid/app/backup/BackupAgent;->onBind()Landroid/os/IBinder;
-HSPLandroid/app/backup/BackupAgent;->onCreate()V
-HSPLandroid/app/backup/BackupAgent;->onCreate(Landroid/os/UserHandle;)V
-HSPLandroid/app/backup/BackupAgent;->onCreate(Landroid/os/UserHandle;I)V
-HSPLandroid/app/backup/BackupAgent;->onCreate(Landroid/os/UserHandle;II)V
-HSPLandroid/app/backup/BackupAgent;->onDestroy()V
-HSPLandroid/app/backup/BackupAgent;->waitForSharedPrefs()V
-HSPLandroid/app/backup/BackupAgentHelper;-><init>()V
-HSPLandroid/app/backup/BackupAgentHelper;->addHelper(Ljava/lang/String;Landroid/app/backup/BackupHelper;)V
-HSPLandroid/app/backup/BackupAgentHelper;->onBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V
-HSPLandroid/app/backup/BackupDataOutput;-><init>(Ljava/io/FileDescriptor;JI)V
-HSPLandroid/app/backup/BackupDataOutput;->finalize()V
-HSPLandroid/app/backup/BackupDataOutput;->setKeyPrefix(Ljava/lang/String;)V
-HSPLandroid/app/backup/BackupDataOutput;->writeEntityData([BI)I
-HSPLandroid/app/backup/BackupDataOutput;->writeEntityHeader(Ljava/lang/String;I)I
-HSPLandroid/app/backup/BackupHelperDispatcher;-><init>()V
-HSPLandroid/app/backup/BackupHelperDispatcher;->addHelper(Ljava/lang/String;Landroid/app/backup/BackupHelper;)V
-HSPLandroid/app/backup/BackupHelperDispatcher;->doOneBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupHelperDispatcher$Header;Landroid/app/backup/BackupHelper;)V
-HSPLandroid/app/backup/BackupHelperDispatcher;->performBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V
-HSPLandroid/app/backup/BackupManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/app/backup/BackupManager;->checkServiceBinder()V
-HSPLandroid/app/backup/BackupManager;->dataChanged()V
-HSPLandroid/app/backup/BackupManager;->dataChanged(Ljava/lang/String;)V
-HSPLandroid/app/backup/BackupRestoreEventLogger;-><init>(I)V
-HSPLandroid/app/backup/FileBackupHelper;-><init>(Landroid/content/Context;[Ljava/lang/String;)V
-HSPLandroid/app/backup/FileBackupHelper;->performBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V
-HSPLandroid/app/backup/FileBackupHelperBase;->finalize()V
-HSPLandroid/app/backup/FileBackupHelperBase;->performBackup_checked(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;[Ljava/lang/String;[Ljava/lang/String;)V
-HSPLandroid/app/backup/IBackupCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/backup/IBackupCallback$Stub$Proxy;->operationComplete(J)V
-HSPLandroid/app/backup/IBackupCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/backup/IBackupCallback;
-HSPLandroid/app/backup/IBackupManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/backup/IBackupManager$Stub$Proxy;->dataChanged(Ljava/lang/String;)V
-HSPLandroid/app/backup/IBackupManager$Stub$Proxy;->getCurrentTransport()Ljava/lang/String;
-HSPLandroid/app/backup/IBackupManager$Stub$Proxy;->isBackupServiceActive(I)Z
-HSPLandroid/app/backup/IBackupManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/backup/IBackupManager;
-HSPLandroid/app/backup/SharedPreferencesBackupHelper;-><init>(Landroid/content/Context;[Ljava/lang/String;)V
-HSPLandroid/app/backup/SharedPreferencesBackupHelper;->performBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V
-HSPLandroid/app/blob/BlobStoreManager;-><init>(Landroid/content/Context;Landroid/app/blob/IBlobStoreManager;)V
-HSPLandroid/app/blob/BlobStoreManagerFrameworkInitializer$$ExternalSyntheticLambda0;->createService(Landroid/content/Context;Landroid/os/IBinder;)Ljava/lang/Object;
-HSPLandroid/app/blob/BlobStoreManagerFrameworkInitializer;->lambda$initialize$0(Landroid/content/Context;Landroid/os/IBinder;)Landroid/app/blob/BlobStoreManager;
-HSPLandroid/app/blob/IBlobStoreManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/blob/IBlobStoreManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/blob/IBlobStoreManager;
-HSPLandroid/app/compat/ChangeIdStateCache;->getPlatformCompatService()Lcom/android/internal/compat/IPlatformCompat;
-HSPLandroid/app/compat/ChangeIdStateCache;->recompute(Landroid/app/compat/ChangeIdStateQuery;)Ljava/lang/Boolean;
-HSPLandroid/app/compat/ChangeIdStateCache;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/app/compat/ChangeIdStateQuery;-><init>(IJLjava/lang/String;II)V
-HSPLandroid/app/compat/ChangeIdStateQuery;->byPackageName(JLjava/lang/String;I)Landroid/app/compat/ChangeIdStateQuery;
-HSPLandroid/app/compat/ChangeIdStateQuery;->byUid(JI)Landroid/app/compat/ChangeIdStateQuery;
-HSPLandroid/app/compat/ChangeIdStateQuery;->equals(Ljava/lang/Object;)Z
-HSPLandroid/app/compat/ChangeIdStateQuery;->hashCode()I
-HSPLandroid/app/compat/CompatChanges;->isChangeEnabled(J)Z
-HSPLandroid/app/compat/CompatChanges;->isChangeEnabled(JI)Z
-HSPLandroid/app/compat/CompatChanges;->isChangeEnabled(JLjava/lang/String;Landroid/os/UserHandle;)Z
-HSPLandroid/app/contentsuggestions/ContentSelection;-><init>(Ljava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/app/contentsuggestions/ISelectionsCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/contentsuggestions/ISelectionsCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/contentsuggestions/ISelectionsCallback;
-HSPLandroid/app/contentsuggestions/SelectionsRequest$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/contentsuggestions/SelectionsRequest;
-HSPLandroid/app/contentsuggestions/SelectionsRequest$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/contentsuggestions/SelectionsRequest;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/job/IJobCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/job/IJobCallback$Stub$Proxy;->acknowledgeStartMessage(IZ)V
-HSPLandroid/app/job/IJobCallback$Stub$Proxy;->acknowledgeStopMessage(IZ)V
-HSPLandroid/app/job/IJobCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/job/IJobCallback$Stub$Proxy;->completeWork(II)Z
-HSPLandroid/app/job/IJobCallback$Stub$Proxy;->dequeueWork(I)Landroid/app/job/JobWorkItem;
-HSPLandroid/app/job/IJobCallback$Stub$Proxy;->jobFinished(IZ)V
-HSPLandroid/app/job/IJobCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobCallback;
-HSPLandroid/app/job/IJobScheduler$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/job/IJobScheduler$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/job/IJobScheduler$Stub$Proxy;->cancel(Ljava/lang/String;I)V
-HSPLandroid/app/job/IJobScheduler$Stub$Proxy;->enqueue(Ljava/lang/String;Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;)I
-HSPLandroid/app/job/IJobScheduler$Stub$Proxy;->getAllPendingJobsInNamespace(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/app/job/IJobScheduler$Stub$Proxy;->getPendingJob(Ljava/lang/String;I)Landroid/app/job/JobInfo;
-HSPLandroid/app/job/IJobScheduler$Stub$Proxy;->schedule(Ljava/lang/String;Landroid/app/job/JobInfo;)I
-HSPLandroid/app/job/IJobScheduler$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobScheduler;
-HSPLandroid/app/job/IJobService$Stub;-><init>()V
-HSPLandroid/app/job/IJobService$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/job/IJobService$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
-HSPLandroid/app/job/IJobService$Stub;->getMaxTransactionId()I
-HSPLandroid/app/job/IJobService$Stub;->getTransactionName(I)Ljava/lang/String;
-HSPLandroid/app/job/IJobService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/app/job/JobInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/job/JobInfo;
-HSPLandroid/app/job/JobInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmBackoffPolicy(Landroid/app/job/JobInfo$Builder;)I
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmBias(Landroid/app/job/JobInfo$Builder;)I
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmClipData(Landroid/app/job/JobInfo$Builder;)Landroid/content/ClipData;
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmClipGrantFlags(Landroid/app/job/JobInfo$Builder;)I
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmConstraintFlags(Landroid/app/job/JobInfo$Builder;)I
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmExtras(Landroid/app/job/JobInfo$Builder;)Landroid/os/PersistableBundle;
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmFlags(Landroid/app/job/JobInfo$Builder;)I
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmFlexMillis(Landroid/app/job/JobInfo$Builder;)J
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmHasEarlyConstraint(Landroid/app/job/JobInfo$Builder;)Z
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmHasLateConstraint(Landroid/app/job/JobInfo$Builder;)Z
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmInitialBackoffMillis(Landroid/app/job/JobInfo$Builder;)J
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmIntervalMillis(Landroid/app/job/JobInfo$Builder;)J
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmIsPeriodic(Landroid/app/job/JobInfo$Builder;)Z
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmIsPersisted(Landroid/app/job/JobInfo$Builder;)Z
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmJobId(Landroid/app/job/JobInfo$Builder;)I
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmJobService(Landroid/app/job/JobInfo$Builder;)Landroid/content/ComponentName;
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmMaxExecutionDelayMillis(Landroid/app/job/JobInfo$Builder;)J
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmMinLatencyMillis(Landroid/app/job/JobInfo$Builder;)J
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmMinimumNetworkChunkBytes(Landroid/app/job/JobInfo$Builder;)J
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmNetworkDownloadBytes(Landroid/app/job/JobInfo$Builder;)J
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmNetworkRequest(Landroid/app/job/JobInfo$Builder;)Landroid/net/NetworkRequest;
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmNetworkUploadBytes(Landroid/app/job/JobInfo$Builder;)J
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmPriority(Landroid/app/job/JobInfo$Builder;)I
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmTransientExtras(Landroid/app/job/JobInfo$Builder;)Landroid/os/Bundle;
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmTriggerContentMaxDelay(Landroid/app/job/JobInfo$Builder;)J
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmTriggerContentUpdateDelay(Landroid/app/job/JobInfo$Builder;)J
-HSPLandroid/app/job/JobInfo$Builder;->-$$Nest$fgetmTriggerContentUris(Landroid/app/job/JobInfo$Builder;)Ljava/util/ArrayList;
-HSPLandroid/app/job/JobInfo$Builder;-><init>(ILandroid/content/ComponentName;)V
-HSPLandroid/app/job/JobInfo$Builder;->addTriggerContentUri(Landroid/app/job/JobInfo$TriggerContentUri;)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->build()Landroid/app/job/JobInfo;
-HSPLandroid/app/job/JobInfo$Builder;->setBackoffCriteria(JI)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setExtras(Landroid/os/PersistableBundle;)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setImportantWhileForeground(Z)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setMinimumLatency(J)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setOverrideDeadline(J)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setPeriodic(J)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setPeriodic(JJ)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setPersisted(Z)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setPrefetch(Z)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setRequiredNetwork(Landroid/net/NetworkRequest;)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setRequiredNetworkType(I)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setRequiresBatteryNotLow(Z)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setRequiresCharging(Z)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setRequiresDeviceIdle(Z)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setRequiresStorageNotLow(Z)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setTransientExtras(Landroid/os/Bundle;)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setTriggerContentMaxDelay(J)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setTriggerContentUpdateDelay(J)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$TriggerContentUri$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/job/JobInfo$TriggerContentUri;
-HSPLandroid/app/job/JobInfo$TriggerContentUri$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/job/JobInfo$TriggerContentUri$1;->newArray(I)[Landroid/app/job/JobInfo$TriggerContentUri;
-HSPLandroid/app/job/JobInfo$TriggerContentUri$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/app/job/JobInfo$TriggerContentUri;-><init>(Landroid/net/Uri;I)V
-HSPLandroid/app/job/JobInfo$TriggerContentUri;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/job/JobInfo;-><init>(Landroid/app/job/JobInfo$Builder;)V+]Landroid/os/PersistableBundle;Landroid/os/PersistableBundle;]Landroid/os/Bundle;Landroid/os/Bundle;
-HSPLandroid/app/job/JobInfo;-><init>(Landroid/app/job/JobInfo$Builder;Landroid/app/job/JobInfo-IA;)V
-HSPLandroid/app/job/JobInfo;-><init>(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/net/NetworkRequest$1;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/app/job/JobInfo;->enforceValidity(ZZZZ)V+]Landroid/net/NetworkRequest;Landroid/net/NetworkRequest;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/ComponentName;Landroid/content/ComponentName;
-HSPLandroid/app/job/JobInfo;->getExtras()Landroid/os/PersistableBundle;
-HSPLandroid/app/job/JobInfo;->getFlags()I
-HSPLandroid/app/job/JobInfo;->getFlexMillis()J
-HSPLandroid/app/job/JobInfo;->getId()I
-HSPLandroid/app/job/JobInfo;->getIntervalMillis()J
-HSPLandroid/app/job/JobInfo;->getMaxExecutionDelayMillis()J
-HSPLandroid/app/job/JobInfo;->getMinBackoffMillis()J
-HSPLandroid/app/job/JobInfo;->getMinFlexMillis()J
-HSPLandroid/app/job/JobInfo;->getMinLatencyMillis()J
-HSPLandroid/app/job/JobInfo;->getMinPeriodMillis()J
-HSPLandroid/app/job/JobInfo;->getNetworkType()I
-HSPLandroid/app/job/JobInfo;->getRequiredNetwork()Landroid/net/NetworkRequest;
-HSPLandroid/app/job/JobInfo;->getService()Landroid/content/ComponentName;
-HSPLandroid/app/job/JobInfo;->isPeriodic()Z
-HSPLandroid/app/job/JobInfo;->isPersisted()Z
-HSPLandroid/app/job/JobInfo;->isRequireCharging()Z
-HSPLandroid/app/job/JobInfo;->isRequireDeviceIdle()Z
-HSPLandroid/app/job/JobInfo;->validateTraceTag(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/app/job/JobInfo;->writeToParcel(Landroid/os/Parcel;I)V+]Landroid/net/NetworkRequest;Landroid/net/NetworkRequest;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/app/job/JobParameters$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/job/JobParameters;
-HSPLandroid/app/job/JobParameters$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/job/JobParameters;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/job/JobParameters;->completeWork(Landroid/app/job/JobWorkItem;)V
-HSPLandroid/app/job/JobParameters;->dequeueWork()Landroid/app/job/JobWorkItem;
-HSPLandroid/app/job/JobParameters;->getCallback()Landroid/app/job/IJobCallback;
-HSPLandroid/app/job/JobParameters;->getExtras()Landroid/os/PersistableBundle;
-HSPLandroid/app/job/JobParameters;->getJobId()I
-HSPLandroid/app/job/JobParameters;->getNetwork()Landroid/net/Network;
-HSPLandroid/app/job/JobParameters;->getStopReason()I
-HSPLandroid/app/job/JobParameters;->getTransientExtras()Landroid/os/Bundle;
-HSPLandroid/app/job/JobParameters;->getTriggeredContentAuthorities()[Ljava/lang/String;
-HSPLandroid/app/job/JobParameters;->getTriggeredContentUris()[Landroid/net/Uri;
-HSPLandroid/app/job/JobParameters;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/job/JobScheduler;-><init>()V
-HSPLandroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda0;->createService(Landroid/content/Context;Landroid/os/IBinder;)Ljava/lang/Object;
-HSPLandroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda1;->createService(Landroid/content/Context;Landroid/os/IBinder;)Ljava/lang/Object;
-HSPLandroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda2;->createService(Landroid/content/Context;)Ljava/lang/Object;
-HSPLandroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda3;->createService(Landroid/content/Context;)Ljava/lang/Object;
-HSPLandroid/app/job/JobSchedulerFrameworkInitializer;->lambda$registerServiceWrappers$0(Landroid/content/Context;Landroid/os/IBinder;)Landroid/app/job/JobScheduler;
-HSPLandroid/app/job/JobSchedulerFrameworkInitializer;->lambda$registerServiceWrappers$1(Landroid/content/Context;Landroid/os/IBinder;)Landroid/os/DeviceIdleManager;
-HSPLandroid/app/job/JobService$1;-><init>(Landroid/app/job/JobService;Landroid/app/Service;)V
-HSPLandroid/app/job/JobService$1;->onStartJob(Landroid/app/job/JobParameters;)Z
-HSPLandroid/app/job/JobService$1;->onStopJob(Landroid/app/job/JobParameters;)Z
-HSPLandroid/app/job/JobService;-><init>()V
-HSPLandroid/app/job/JobService;->jobFinished(Landroid/app/job/JobParameters;Z)V
-HSPLandroid/app/job/JobService;->onBind(Landroid/content/Intent;)Landroid/os/IBinder;
-HSPLandroid/app/job/JobServiceEngine$JobHandler;-><init>(Landroid/app/job/JobServiceEngine;Landroid/os/Looper;)V
-HSPLandroid/app/job/JobServiceEngine$JobHandler;->ackStartMessage(Landroid/app/job/JobParameters;Z)V
-HSPLandroid/app/job/JobServiceEngine$JobHandler;->ackStopMessage(Landroid/app/job/JobParameters;Z)V
-HSPLandroid/app/job/JobServiceEngine$JobHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/app/job/JobServiceEngine$JobInterface;-><init>(Landroid/app/job/JobServiceEngine;)V
-HSPLandroid/app/job/JobServiceEngine$JobInterface;->startJob(Landroid/app/job/JobParameters;)V
-HSPLandroid/app/job/JobServiceEngine$JobInterface;->stopJob(Landroid/app/job/JobParameters;)V
-HSPLandroid/app/job/JobServiceEngine;-><init>(Landroid/app/Service;)V
-HSPLandroid/app/job/JobServiceEngine;->getBinder()Landroid/os/IBinder;
-HSPLandroid/app/job/JobServiceEngine;->jobFinished(Landroid/app/job/JobParameters;Z)V
-HSPLandroid/app/job/JobWorkItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/job/JobWorkItem;
-HSPLandroid/app/job/JobWorkItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/job/JobWorkItem;-><init>(Landroid/content/Intent;)V
-HSPLandroid/app/job/JobWorkItem;-><init>(Landroid/content/Intent;JJJ)V
-HSPLandroid/app/job/JobWorkItem;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/job/JobWorkItem;->enforceValidity(Z)V
-HSPLandroid/app/job/JobWorkItem;->getIntent()Landroid/content/Intent;
-HSPLandroid/app/job/JobWorkItem;->getWorkId()I
-HSPLandroid/app/job/JobWorkItem;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/prediction/AppPredictionContext$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/prediction/AppPredictionContext;
-HSPLandroid/app/prediction/AppPredictionContext$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/prediction/AppPredictionContext;->getUiSurface()Ljava/lang/String;
-HSPLandroid/app/prediction/AppPredictionContext;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/prediction/AppPredictionSessionId$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/prediction/AppPredictionSessionId;
-HSPLandroid/app/prediction/AppPredictionSessionId$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/prediction/AppPredictionSessionId;->equals(Ljava/lang/Object;)Z
-HSPLandroid/app/prediction/AppPredictionSessionId;->hashCode()I
-HSPLandroid/app/prediction/AppPredictionSessionId;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/prediction/AppTarget$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/prediction/AppTarget;
-HSPLandroid/app/prediction/AppTarget$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/prediction/AppTarget$Builder;-><init>(Landroid/app/prediction/AppTargetId;Ljava/lang/String;Landroid/os/UserHandle;)V
-HSPLandroid/app/prediction/AppTarget$Builder;->build()Landroid/app/prediction/AppTarget;
-HSPLandroid/app/prediction/AppTarget$Builder;->setClassName(Ljava/lang/String;)Landroid/app/prediction/AppTarget$Builder;
-HSPLandroid/app/prediction/AppTarget;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/prediction/AppTarget;->getClassName()Ljava/lang/String;
-HSPLandroid/app/prediction/AppTarget;->getPackageName()Ljava/lang/String;
-HSPLandroid/app/prediction/AppTarget;->getShortcutInfo()Landroid/content/pm/ShortcutInfo;
-HSPLandroid/app/prediction/AppTarget;->getUser()Landroid/os/UserHandle;
-HSPLandroid/app/prediction/AppTarget;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/prediction/AppTargetEvent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/prediction/AppTargetEvent;
-HSPLandroid/app/prediction/AppTargetEvent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/prediction/AppTargetEvent;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/prediction/AppTargetId$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/prediction/AppTargetId;
-HSPLandroid/app/prediction/AppTargetId$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/prediction/AppTargetId;-><init>(Ljava/lang/String;)V
-HSPLandroid/app/prediction/AppTargetId;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/prediction/IPredictionCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/prediction/IPredictionCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/prediction/IPredictionCallback;
-HSPLandroid/app/servertransaction/ActivityConfigurationChangeItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/ActivityConfigurationChangeItem;
-HSPLandroid/app/servertransaction/ActivityConfigurationChangeItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/servertransaction/ActivityConfigurationChangeItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/servertransaction/ActivityLifecycleItem;-><init>()V
-HSPLandroid/app/servertransaction/ActivityRelaunchItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/servertransaction/ActivityResultItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/ActivityResultItem;
-HSPLandroid/app/servertransaction/ActivityResultItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/servertransaction/ActivityResultItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/servertransaction/ActivityResultItem;->getPostExecutionState()I
-HSPLandroid/app/servertransaction/ActivityTransactionItem;-><init>()V
-HSPLandroid/app/servertransaction/ClientTransaction$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/ClientTransaction;
-HSPLandroid/app/servertransaction/ClientTransaction$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/servertransaction/ClientTransaction;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/servertransaction/ClientTransaction;-><init>(Landroid/os/Parcel;Landroid/app/servertransaction/ClientTransaction-IA;)V
-HSPLandroid/app/servertransaction/ClientTransaction;->getCallbacks()Ljava/util/List;
-HSPLandroid/app/servertransaction/ClientTransaction;->getLifecycleStateRequest()Landroid/app/servertransaction/ActivityLifecycleItem;
-HSPLandroid/app/servertransaction/ClientTransaction;->preExecute(Landroid/app/ClientTransactionHandler;)V
-HSPLandroid/app/servertransaction/ClientTransactionItem;-><init>()V
-HSPLandroid/app/servertransaction/ClientTransactionItem;->getPostExecutionState()I
-HSPLandroid/app/servertransaction/ClientTransactionItem;->isActivityLifecycleItem()Z
-HSPLandroid/app/servertransaction/ClientTransactionItem;->shouldHaveDefinedPreExecutionState()Z
-HSPLandroid/app/servertransaction/ConfigurationChangeItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/ConfigurationChangeItem;
-HSPLandroid/app/servertransaction/ConfigurationChangeItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/servertransaction/ConfigurationChangeItem;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/servertransaction/ConfigurationChangeItem;-><init>(Landroid/os/Parcel;Landroid/app/servertransaction/ConfigurationChangeItem-IA;)V
-HSPLandroid/app/servertransaction/DestroyActivityItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/DestroyActivityItem;
-HSPLandroid/app/servertransaction/DestroyActivityItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/servertransaction/DestroyActivityItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/servertransaction/DestroyActivityItem;->getTargetState()I
-HSPLandroid/app/servertransaction/LaunchActivityItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/LaunchActivityItem;
-HSPLandroid/app/servertransaction/LaunchActivityItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/servertransaction/LaunchActivityItem;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/servertransaction/NewIntentItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/NewIntentItem;
-HSPLandroid/app/servertransaction/NewIntentItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/servertransaction/NewIntentItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/servertransaction/NewIntentItem;->getPostExecutionState()I
-HSPLandroid/app/servertransaction/PauseActivityItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/PauseActivityItem;
-HSPLandroid/app/servertransaction/PauseActivityItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/servertransaction/PauseActivityItem;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/servertransaction/PauseActivityItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/servertransaction/PauseActivityItem;->getTargetState()I
-HSPLandroid/app/servertransaction/PendingTransactionActions$StopInfo;-><init>()V
-HSPLandroid/app/servertransaction/PendingTransactionActions$StopInfo;->run()V
-HSPLandroid/app/servertransaction/PendingTransactionActions$StopInfo;->setActivity(Landroid/app/ActivityThread$ActivityClientRecord;)V
-HSPLandroid/app/servertransaction/PendingTransactionActions$StopInfo;->setDescription(Ljava/lang/CharSequence;)V
-HSPLandroid/app/servertransaction/PendingTransactionActions$StopInfo;->setPersistentState(Landroid/os/PersistableBundle;)V
-HSPLandroid/app/servertransaction/PendingTransactionActions$StopInfo;->setState(Landroid/os/Bundle;)V
-HSPLandroid/app/servertransaction/PendingTransactionActions;-><init>()V
-HSPLandroid/app/servertransaction/PendingTransactionActions;->clear()V
-HSPLandroid/app/servertransaction/PendingTransactionActions;->getOldState()Landroid/os/Bundle;
-HSPLandroid/app/servertransaction/PendingTransactionActions;->getStopInfo()Landroid/app/servertransaction/PendingTransactionActions$StopInfo;
-HSPLandroid/app/servertransaction/PendingTransactionActions;->setCallOnPostCreate(Z)V
-HSPLandroid/app/servertransaction/PendingTransactionActions;->setOldState(Landroid/os/Bundle;)V
-HSPLandroid/app/servertransaction/PendingTransactionActions;->setRestoreInstanceState(Z)V
-HSPLandroid/app/servertransaction/PendingTransactionActions;->setStopInfo(Landroid/app/servertransaction/PendingTransactionActions$StopInfo;)V
-HSPLandroid/app/servertransaction/PendingTransactionActions;->shouldCallOnPostCreate()Z
-HSPLandroid/app/servertransaction/PendingTransactionActions;->shouldRestoreInstanceState()Z
-HSPLandroid/app/servertransaction/ResumeActivityItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/ResumeActivityItem;
-HSPLandroid/app/servertransaction/ResumeActivityItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/servertransaction/ResumeActivityItem;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/servertransaction/ResumeActivityItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/servertransaction/ResumeActivityItem;->getTargetState()I
-HSPLandroid/app/servertransaction/StartActivityItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/StartActivityItem;
-HSPLandroid/app/servertransaction/StartActivityItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/servertransaction/StartActivityItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/servertransaction/StartActivityItem;->getTargetState()I
-HSPLandroid/app/servertransaction/StopActivityItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/StopActivityItem;
-HSPLandroid/app/servertransaction/StopActivityItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/servertransaction/StopActivityItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/servertransaction/StopActivityItem;->getTargetState()I
-HSPLandroid/app/servertransaction/TopResumedActivityChangeItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/TopResumedActivityChangeItem;
-HSPLandroid/app/servertransaction/TopResumedActivityChangeItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/servertransaction/TopResumedActivityChangeItem;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/servertransaction/TopResumedActivityChangeItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/servertransaction/TransactionExecutor;-><init>(Landroid/app/ClientTransactionHandler;)V
-HSPLandroid/app/servertransaction/TransactionExecutor;->cycleToPath(Landroid/app/ActivityThread$ActivityClientRecord;ILandroid/app/servertransaction/ClientTransaction;)V
-HSPLandroid/app/servertransaction/TransactionExecutor;->cycleToPath(Landroid/app/ActivityThread$ActivityClientRecord;IZLandroid/app/servertransaction/ClientTransaction;)V
-HSPLandroid/app/servertransaction/TransactionExecutor;->execute(Landroid/app/servertransaction/ClientTransaction;)V
-HSPLandroid/app/servertransaction/TransactionExecutor;->executeCallbacks(Landroid/app/servertransaction/ClientTransaction;)V
-HSPLandroid/app/servertransaction/TransactionExecutor;->executeLifecycleState(Landroid/app/servertransaction/ClientTransaction;)V
-HSPLandroid/app/servertransaction/TransactionExecutor;->executeNonLifecycleItem(Landroid/app/servertransaction/ClientTransaction;Landroid/app/servertransaction/ClientTransactionItem;Z)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/servertransaction/TransactionExecutorHelper;Landroid/app/servertransaction/TransactionExecutorHelper;]Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/app/servertransaction/ClientTransactionItem;megamorphic_types]Landroid/content/Context;missing_types]Ljava/util/Map;Ljava/util/Collections$SynchronizedMap;]Landroid/app/servertransaction/TransactionExecutor;Landroid/app/servertransaction/TransactionExecutor;
-HSPLandroid/app/servertransaction/TransactionExecutor;->executeTransactionItems(Landroid/app/servertransaction/ClientTransaction;)V+]Landroid/app/servertransaction/ClientTransaction;Landroid/app/servertransaction/ClientTransaction;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/app/servertransaction/ClientTransactionItem;megamorphic_types
-HSPLandroid/app/servertransaction/TransactionExecutor;->performLifecycleSequence(Landroid/app/ActivityThread$ActivityClientRecord;Landroid/util/IntArray;Landroid/app/servertransaction/ClientTransaction;)V
-HSPLandroid/app/servertransaction/TransactionExecutorHelper;-><init>()V
-HSPLandroid/app/servertransaction/TransactionExecutorHelper;->getClosestOfStates(Landroid/app/ActivityThread$ActivityClientRecord;[I)I
-HSPLandroid/app/servertransaction/TransactionExecutorHelper;->getClosestPreExecutionState(Landroid/app/ActivityThread$ActivityClientRecord;I)I
-HSPLandroid/app/servertransaction/TransactionExecutorHelper;->getLifecyclePath(IIZ)Landroid/util/IntArray;
-HSPLandroid/app/servertransaction/TransactionExecutorHelper;->lastCallbackRequestingState(Landroid/app/servertransaction/ClientTransaction;)I
-HSPLandroid/app/slice/ISliceManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/slice/ISliceManager$Stub$Proxy;->getPinnedSlices(Ljava/lang/String;)[Landroid/net/Uri;
-HSPLandroid/app/slice/ISliceManager$Stub$Proxy;->grantSlicePermission(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)V
-HSPLandroid/app/slice/ISliceManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/slice/ISliceManager;
-HSPLandroid/app/slice/Slice;->getHints()Ljava/util/List;
-HSPLandroid/app/slice/Slice;->getItems()Ljava/util/List;
-HSPLandroid/app/slice/SliceItem;->getAction()Landroid/app/PendingIntent;
-HSPLandroid/app/slice/SliceItem;->getFormat()Ljava/lang/String;
-HSPLandroid/app/slice/SliceItem;->getHints()Ljava/util/List;
-HSPLandroid/app/slice/SliceItem;->getText()Ljava/lang/CharSequence;
-HSPLandroid/app/slice/SliceManager;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
-HSPLandroid/app/slice/SliceManager;->bindSlice(Landroid/net/Uri;Ljava/util/Set;)Landroid/app/slice/Slice;
-HSPLandroid/app/slice/SliceManager;->getPinnedSlices()Ljava/util/List;
-HSPLandroid/app/slice/SliceManager;->grantSlicePermission(Ljava/lang/String;Landroid/net/Uri;)V
-HSPLandroid/app/slice/SliceProvider;-><init>([Ljava/lang/String;)V
-HSPLandroid/app/slice/SliceProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V
-HSPLandroid/app/slice/SliceProvider;->call(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
-HSPLandroid/app/slice/SliceProvider;->handleBindSlice(Landroid/net/Uri;Ljava/util/List;Ljava/lang/String;II)Landroid/app/slice/Slice;
-HSPLandroid/app/slice/SliceProvider;->onBindSliceStrict(Landroid/net/Uri;Ljava/util/List;)Landroid/app/slice/Slice;
-HSPLandroid/app/slice/SliceSpec$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/slice/SliceSpec;
-HSPLandroid/app/slice/SliceSpec$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/slice/SliceSpec$1;->newArray(I)[Landroid/app/slice/SliceSpec;
-HSPLandroid/app/slice/SliceSpec$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/app/slice/SliceSpec;-><init>(Ljava/lang/String;I)V
-HSPLandroid/app/slice/SliceSpec;->getRevision()I
-HSPLandroid/app/slice/SliceSpec;->getType()Ljava/lang/String;
-HSPLandroid/app/slice/SliceSpec;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/smartspace/SmartspaceAction$1;-><init>()V
-HSPLandroid/app/smartspace/SmartspaceAction;-><clinit>()V
-HSPLandroid/app/smartspace/SmartspaceConfig$1;-><init>()V
-HSPLandroid/app/smartspace/SmartspaceConfig;-><clinit>()V
-HSPLandroid/app/smartspace/SmartspaceSessionId$1;-><init>()V
-HSPLandroid/app/smartspace/SmartspaceSessionId;-><clinit>()V
-HSPLandroid/app/smartspace/SmartspaceTarget$1;-><init>()V
-HSPLandroid/app/smartspace/SmartspaceTarget;-><clinit>()V
-HSPLandroid/app/smartspace/SmartspaceTargetEvent$1;-><init>()V
-HSPLandroid/app/smartspace/SmartspaceTargetEvent;-><clinit>()V
-HSPLandroid/app/time/TimeZoneCapabilities$Builder;-><init>(Landroid/os/UserHandle;)V
-HSPLandroid/app/time/TimeZoneCapabilities$Builder;->build()Landroid/app/time/TimeZoneCapabilities;
-HSPLandroid/app/time/TimeZoneCapabilities$Builder;->setConfigureAutoDetectionEnabledCapability(I)Landroid/app/time/TimeZoneCapabilities$Builder;
-HSPLandroid/app/time/TimeZoneCapabilities$Builder;->setConfigureGeoDetectionEnabledCapability(I)Landroid/app/time/TimeZoneCapabilities$Builder;
-HSPLandroid/app/time/TimeZoneCapabilities$Builder;->verifyCapabilitySet(ILjava/lang/String;)V
-HSPLandroid/app/time/TimeZoneCapabilities;-><init>(Landroid/app/time/TimeZoneCapabilities$Builder;)V
-HSPLandroid/app/time/TimeZoneConfiguration$Builder;-><init>()V
-HSPLandroid/app/time/TimeZoneConfiguration$Builder;->build()Landroid/app/time/TimeZoneConfiguration;
-HSPLandroid/app/time/TimeZoneConfiguration;-><init>(Landroid/app/time/TimeZoneConfiguration$Builder;)V
-HSPLandroid/app/timedetector/ITimeDetectorService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/timedetector/ITimeDetectorService;
-HSPLandroid/app/timedetector/TimeDetectorImpl;-><init>()V
-HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;-><init>(I)V
-HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->build()Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion;
-HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->setMatchType(I)Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;
-HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->setQuality(I)Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;
-HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->setZoneId(Ljava/lang/String;)Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;
-HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->validate()V
-HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion;-><init>(Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;)V
-HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion;->toString()Ljava/lang/String;
-HSPLandroid/app/trust/ITrustManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/trust/ITrustManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/trust/ITrustManager$Stub$Proxy;->isDeviceLocked(II)Z
-HSPLandroid/app/trust/ITrustManager$Stub$Proxy;->isDeviceSecure(II)Z
-HSPLandroid/app/trust/ITrustManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/trust/ITrustManager;
-HSPLandroid/app/trust/TrustManager;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/usage/AppStandbyInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/usage/AppStandbyInfo;
-HSPLandroid/app/usage/AppStandbyInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/usage/AppStandbyInfo;-><init>(Ljava/lang/String;I)V
-HSPLandroid/app/usage/AppStandbyInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/usage/IStorageStatsManager$Stub$Proxy;->queryStatsForPackage(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats;+]Landroid/app/usage/IStorageStatsManager$Stub$Proxy;Landroid/app/usage/IStorageStatsManager$Stub$Proxy;]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/app/usage/IStorageStatsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/usage/IStorageStatsManager;
-HSPLandroid/app/usage/IUsageStatsManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/usage/IUsageStatsManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/usage/IUsageStatsManager$Stub$Proxy;->getAppStandbyBucket(Ljava/lang/String;Ljava/lang/String;I)I
-HSPLandroid/app/usage/IUsageStatsManager$Stub$Proxy;->queryEvents(JJLjava/lang/String;)Landroid/app/usage/UsageEvents;
-HSPLandroid/app/usage/IUsageStatsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/usage/IUsageStatsManager;
-HSPLandroid/app/usage/StorageStats$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/usage/StorageStats;
-HSPLandroid/app/usage/StorageStats$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/usage/StorageStats;->getAppBytes()J
-HSPLandroid/app/usage/StorageStats;->getCacheBytes()J
-HSPLandroid/app/usage/StorageStats;->getDataBytes()J
-HSPLandroid/app/usage/StorageStatsManager;-><init>(Landroid/content/Context;Landroid/app/usage/IStorageStatsManager;)V
-HSPLandroid/app/usage/StorageStatsManager;->queryStatsForPackage(Ljava/util/UUID;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/app/usage/StorageStats;
-HSPLandroid/app/usage/UsageEvents$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/usage/UsageEvents;
-HSPLandroid/app/usage/UsageEvents$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/usage/UsageEvents$Event;-><init>()V
-HSPLandroid/app/usage/UsageEvents$Event;->getClassName()Ljava/lang/String;
-HSPLandroid/app/usage/UsageEvents$Event;->getEventType()I
-HSPLandroid/app/usage/UsageEvents$Event;->getPackageName()Ljava/lang/String;
-HSPLandroid/app/usage/UsageEvents$Event;->getTimeStamp()J
-HSPLandroid/app/usage/UsageEvents;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/usage/UsageEvents;->getNextEvent(Landroid/app/usage/UsageEvents$Event;)Z
-HSPLandroid/app/usage/UsageEvents;->hasNextEvent()Z
-HSPLandroid/app/usage/UsageEvents;->readEventFromParcel(Landroid/os/Parcel;Landroid/app/usage/UsageEvents$Event;)V
-HSPLandroid/app/usage/UsageStats$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/usage/UsageStats;+]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Landroid/os/Parcel;Landroid/os/Parcel;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;
-HSPLandroid/app/usage/UsageStats$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/usage/UsageStats$1;->readBundleToEventMap(Landroid/os/Bundle;Landroid/util/ArrayMap;)V
-HSPLandroid/app/usage/UsageStats;-><init>()V
-HSPLandroid/app/usage/UsageStats;->getPackageName()Ljava/lang/String;
-HSPLandroid/app/usage/UsageStats;->update(Ljava/lang/String;JII)V
-HSPLandroid/app/usage/UsageStatsManager;-><init>(Landroid/content/Context;Landroid/app/usage/IUsageStatsManager;)V
-HSPLandroid/app/usage/UsageStatsManager;->queryEvents(JJ)Landroid/app/usage/UsageEvents;
-HSPLandroid/app/usage/UsageStatsManager;->queryUsageStats(IJJ)Ljava/util/List;
-HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda3;-><init>()V
-HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda5;-><init>()V
-HSPLandroid/appwidget/AppWidgetManager;-><init>(Landroid/content/Context;Lcom/android/internal/appwidget/IAppWidgetService;)V
-HSPLandroid/appwidget/AppWidgetManager;->getAppWidgetIds(Landroid/content/ComponentName;)[I
-HSPLandroid/appwidget/AppWidgetManager;->getInstalledProvidersForPackage(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;
-HSPLandroid/appwidget/AppWidgetManager;->getInstalledProvidersForProfile(ILandroid/os/UserHandle;Ljava/lang/String;)Ljava/util/List;
-HSPLandroid/appwidget/AppWidgetManager;->getInstance(Landroid/content/Context;)Landroid/appwidget/AppWidgetManager;
-HSPLandroid/appwidget/AppWidgetManager;->isBoundWidgetPackage(Ljava/lang/String;I)Z
-HSPLandroid/appwidget/AppWidgetManager;->lambda$new$0(Landroid/appwidget/AppWidgetProviderInfo;)Landroid/content/ComponentName;
-HSPLandroid/appwidget/AppWidgetManager;->lambda$new$1(Landroid/content/ComponentName;)Z
-HSPLandroid/appwidget/AppWidgetManager;->lambda$new$2(I)[Landroid/content/ComponentName;
-HSPLandroid/appwidget/AppWidgetManager;->lambda$new$3()V
-HSPLandroid/appwidget/AppWidgetProvider;-><init>()V
-HSPLandroid/appwidget/AppWidgetProvider;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
-HSPLandroid/appwidget/AppWidgetProviderInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/appwidget/AppWidgetProviderInfo;
-HSPLandroid/appwidget/AppWidgetProviderInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/appwidget/AppWidgetProviderInfo;-><init>(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/appwidget/AppWidgetProviderInfo;->getProfile()Landroid/os/UserHandle;
-HSPLandroid/appwidget/AppWidgetProviderInfo;->updateDimensions(Landroid/util/DisplayMetrics;)V
-HSPLandroid/appwidget/AppWidgetProviderInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/companion/ICompanionDeviceManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/companion/ICompanionDeviceManager;
-HSPLandroid/companion/virtual/IVirtualDeviceManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/companion/virtual/IVirtualDeviceManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/companion/virtual/IVirtualDeviceManager$Stub$Proxy;->getDeviceIdForDisplayId(I)I
-HSPLandroid/companion/virtual/IVirtualDeviceManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/companion/virtual/IVirtualDeviceManager;
-HSPLandroid/companion/virtual/VirtualDeviceManager;-><init>(Landroid/companion/virtual/IVirtualDeviceManager;Landroid/content/Context;)V
-HSPLandroid/companion/virtual/VirtualDeviceManager;->getDeviceIdForDisplayId(I)I
-HSPLandroid/companion/virtual/flags/FeatureFlagsImpl;-><init>()V
-HSPLandroid/companion/virtual/flags/FeatureFlagsImpl;->enableNativeVdm()Z
-HSPLandroid/companion/virtual/flags/Flags;-><clinit>()V
-HSPLandroid/companion/virtual/flags/Flags;->enableNativeVdm()Z+]Landroid/companion/virtual/flags/FeatureFlags;Landroid/companion/virtual/flags/FeatureFlagsImpl;
-HSPLandroid/compat/Compatibility$BehaviorChangeDelegate;->isChangeEnabled(J)Z
-HSPLandroid/compat/Compatibility;->isChangeEnabled(J)Z
-HSPLandroid/compat/Compatibility;->setBehaviorChangeDelegate(Landroid/compat/Compatibility$BehaviorChangeDelegate;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;->cancelSync(Landroid/content/ISyncContext;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;->isCallerSystem()Z
-HSPLandroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;->startSync(Landroid/content/ISyncContext;Ljava/lang/String;Landroid/accounts/Account;Landroid/os/Bundle;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter$SyncThread;-><init>(Landroid/content/AbstractThreadedSyncAdapter;Ljava/lang/String;Landroid/content/SyncContext;Ljava/lang/String;Landroid/accounts/Account;Landroid/os/Bundle;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter$SyncThread;->isCanceled()Z
-HSPLandroid/content/AbstractThreadedSyncAdapter$SyncThread;->run()V
-HSPLandroid/content/AbstractThreadedSyncAdapter;->-$$Nest$mtoSyncKey(Landroid/content/AbstractThreadedSyncAdapter;Landroid/accounts/Account;)Landroid/accounts/Account;
-HSPLandroid/content/AbstractThreadedSyncAdapter;-><init>(Landroid/content/Context;Z)V
-HSPLandroid/content/AbstractThreadedSyncAdapter;-><init>(Landroid/content/Context;ZZ)V
-HSPLandroid/content/AbstractThreadedSyncAdapter;->getContext()Landroid/content/Context;
-HSPLandroid/content/AbstractThreadedSyncAdapter;->getSyncAdapterBinder()Landroid/os/IBinder;
-HSPLandroid/content/AbstractThreadedSyncAdapter;->onSyncCanceled()V
-HSPLandroid/content/AbstractThreadedSyncAdapter;->toSyncKey(Landroid/accounts/Account;)Landroid/accounts/Account;
-HSPLandroid/content/AsyncQueryHandler$WorkerHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/content/AsyncQueryHandler;-><init>(Landroid/content/ContentResolver;)V
-HSPLandroid/content/AsyncQueryHandler;->createHandler(Landroid/os/Looper;)Landroid/os/Handler;
-HSPLandroid/content/AsyncQueryHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/content/AsyncQueryHandler;->startQuery(ILjava/lang/Object;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/AttributionSource$1;-><init>()V
-HSPLandroid/content/AttributionSource$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/AttributionSource;
-HSPLandroid/content/AttributionSource$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/AttributionSource$ScopedParcelState;-><init>(Landroid/content/AttributionSource;)V
-HSPLandroid/content/AttributionSource$ScopedParcelState;->close()V
-HSPLandroid/content/AttributionSource$ScopedParcelState;->getParcel()Landroid/os/Parcel;
-HSPLandroid/content/AttributionSource;-><clinit>()V
-HSPLandroid/content/AttributionSource;-><init>(IILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;[Ljava/lang/String;ILandroid/content/AttributionSource;)V
-HSPLandroid/content/AttributionSource;-><init>(IILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;[Ljava/lang/String;Landroid/content/AttributionSource;)V
-HSPLandroid/content/AttributionSource;-><init>(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;ILandroid/content/AttributionSource;)V
-HSPLandroid/content/AttributionSource;-><init>(ILjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/AttributionSource;-><init>(ILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;)V
-HSPLandroid/content/AttributionSource;-><init>(ILjava/lang/String;Ljava/lang/String;Ljava/util/Set;Landroid/content/AttributionSource;)V
-HSPLandroid/content/AttributionSource;-><init>(Landroid/content/AttributionSource;Landroid/content/AttributionSource;)V
-HSPLandroid/content/AttributionSource;-><init>(Landroid/content/AttributionSourceState;)V
-HSPLandroid/content/AttributionSource;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/AttributionSource;->asScopedParcelState()Landroid/content/AttributionSource$ScopedParcelState;
-HSPLandroid/content/AttributionSource;->asState()Landroid/content/AttributionSourceState;
-HSPLandroid/content/AttributionSource;->checkCallingPid()Z
-HSPLandroid/content/AttributionSource;->checkCallingUid()Z
-HSPLandroid/content/AttributionSource;->enforceCallingPid()V
-HSPLandroid/content/AttributionSource;->enforceCallingUid()V
-HSPLandroid/content/AttributionSource;->getAttributionTag()Ljava/lang/String;
-HSPLandroid/content/AttributionSource;->getNext()Landroid/content/AttributionSource;
-HSPLandroid/content/AttributionSource;->getPackageName()Ljava/lang/String;
-HSPLandroid/content/AttributionSource;->getRenouncedPermissions()Ljava/util/Set;
-HSPLandroid/content/AttributionSource;->getToken()Landroid/os/IBinder;
-HSPLandroid/content/AttributionSource;->getUid()I
-HSPLandroid/content/AttributionSource;->myAttributionSource()Landroid/content/AttributionSource;
-HSPLandroid/content/AttributionSource;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/AttributionSourceState$1;-><init>()V
-HSPLandroid/content/AttributionSourceState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/AttributionSourceState;
-HSPLandroid/content/AttributionSourceState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/AttributionSourceState$1;->newArray(I)[Landroid/content/AttributionSourceState;
-HSPLandroid/content/AttributionSourceState$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/content/AttributionSourceState;-><clinit>()V
-HSPLandroid/content/AttributionSourceState;-><init>()V
-HSPLandroid/content/AttributionSourceState;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/content/AttributionSourceState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/AutofillOptions$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/AutofillOptions;
-HSPLandroid/content/AutofillOptions$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/AutofillOptions;-><init>(IZ)V
-HSPLandroid/content/AutofillOptions;->isAutofillDisabledLocked(Landroid/content/ComponentName;)Z
-HSPLandroid/content/BroadcastReceiver$PendingResult$1;-><init>(Landroid/content/BroadcastReceiver$PendingResult;Landroid/app/IActivityManager;)V
-HSPLandroid/content/BroadcastReceiver$PendingResult$1;->run()V
-HSPLandroid/content/BroadcastReceiver$PendingResult;-><init>(ILjava/lang/String;Landroid/os/Bundle;IZZLandroid/os/IBinder;II)V
-HSPLandroid/content/BroadcastReceiver$PendingResult;-><init>(ILjava/lang/String;Landroid/os/Bundle;IZZZLandroid/os/IBinder;IIILjava/lang/String;)V
-HSPLandroid/content/BroadcastReceiver$PendingResult;->checkSynchronousHint()V
-HSPLandroid/content/BroadcastReceiver$PendingResult;->finish()V
-HSPLandroid/content/BroadcastReceiver$PendingResult;->sendFinished(Landroid/app/IActivityManager;)V
-HSPLandroid/content/BroadcastReceiver$PendingResult;->setExtrasClassLoader(Ljava/lang/ClassLoader;)V
-HSPLandroid/content/BroadcastReceiver$PendingResult;->setResultCode(I)V
-HSPLandroid/content/BroadcastReceiver;-><init>()V
-HSPLandroid/content/BroadcastReceiver;->checkSynchronousHint()V
-HSPLandroid/content/BroadcastReceiver;->getDebugUnregister()Z
-HSPLandroid/content/BroadcastReceiver;->getPendingResult()Landroid/content/BroadcastReceiver$PendingResult;
-HSPLandroid/content/BroadcastReceiver;->getResultCode()I
-HSPLandroid/content/BroadcastReceiver;->getResultExtras(Z)Landroid/os/Bundle;
-HSPLandroid/content/BroadcastReceiver;->getSendingUserId()I
-HSPLandroid/content/BroadcastReceiver;->goAsync()Landroid/content/BroadcastReceiver$PendingResult;
-HSPLandroid/content/BroadcastReceiver;->isInitialStickyBroadcast()Z
-HSPLandroid/content/BroadcastReceiver;->isOrderedBroadcast()Z
-HSPLandroid/content/BroadcastReceiver;->setPendingResult(Landroid/content/BroadcastReceiver$PendingResult;)V
-HSPLandroid/content/BroadcastReceiver;->setResultCode(I)V
-HSPLandroid/content/ClipData$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/ClipData;
-HSPLandroid/content/ClipData$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/ClipData$Item;-><init>(Landroid/content/Intent;)V
-HSPLandroid/content/ClipData$Item;->getText()Ljava/lang/CharSequence;
-HSPLandroid/content/ClipData;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/ClipData;-><init>(Ljava/lang/CharSequence;[Ljava/lang/String;Landroid/content/ClipData$Item;)V
-HSPLandroid/content/ClipData;->getDescription()Landroid/content/ClipDescription;
-HSPLandroid/content/ClipData;->getItemAt(I)Landroid/content/ClipData$Item;
-HSPLandroid/content/ClipData;->getItemCount()I
-HSPLandroid/content/ClipData;->isStyledText()Z
-HSPLandroid/content/ClipData;->newIntent(Ljava/lang/CharSequence;Landroid/content/Intent;)Landroid/content/ClipData;
-HSPLandroid/content/ClipData;->prepareToLeaveProcess(ZI)V
-HSPLandroid/content/ClipData;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/ClipDescription;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/ClipDescription;-><init>(Ljava/lang/CharSequence;[Ljava/lang/String;)V
-HSPLandroid/content/ClipDescription;->compareMimeTypes(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLandroid/content/ClipDescription;->confidencesToBundle()Landroid/os/Bundle;
-HSPLandroid/content/ClipDescription;->readBundleToConfidences(Landroid/os/Bundle;)V
-HSPLandroid/content/ClipDescription;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/ClipboardManager;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
-HSPLandroid/content/ClipboardManager;->addPrimaryClipChangedListener(Landroid/content/ClipboardManager$OnPrimaryClipChangedListener;)V
-HSPLandroid/content/ClipboardManager;->getPrimaryClip()Landroid/content/ClipData;
-HSPLandroid/content/ClipboardManager;->getPrimaryClipDescription()Landroid/content/ClipDescription;
-HSPLandroid/content/ComponentCallbacksController$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V
-HSPLandroid/content/ComponentCallbacksController$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V
-HSPLandroid/content/ComponentCallbacksController$$ExternalSyntheticLambda2;-><init>(Landroid/content/res/Configuration;)V
-HSPLandroid/content/ComponentCallbacksController$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V
-HSPLandroid/content/ComponentCallbacksController;-><init>()V
-HSPLandroid/content/ComponentCallbacksController;->dispatchConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/content/ComponentCallbacksController;->dispatchLowMemory()V
-HSPLandroid/content/ComponentCallbacksController;->dispatchTrimMemory(I)V
-HSPLandroid/content/ComponentCallbacksController;->forAllComponentCallbacks(Ljava/util/function/Consumer;)V
-HSPLandroid/content/ComponentCallbacksController;->lambda$dispatchConfigurationChanged$0(Landroid/content/res/Configuration;Landroid/content/ComponentCallbacks;)V
-HSPLandroid/content/ComponentCallbacksController;->lambda$dispatchTrimMemory$1(ILandroid/content/ComponentCallbacks;)V
-HSPLandroid/content/ComponentCallbacksController;->registerCallbacks(Landroid/content/ComponentCallbacks;)V
-HSPLandroid/content/ComponentCallbacksController;->unregisterCallbacks(Landroid/content/ComponentCallbacks;)V
-HSPLandroid/content/ComponentName$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/ComponentName;
-HSPLandroid/content/ComponentName$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/ComponentName$1;->newArray(I)[Landroid/content/ComponentName;
-HSPLandroid/content/ComponentName$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/content/ComponentName;-><init>(Landroid/content/Context;Ljava/lang/Class;)V
-HSPLandroid/content/ComponentName;-><init>(Landroid/content/Context;Ljava/lang/String;)V
-HSPLandroid/content/ComponentName;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/ComponentName;-><init>(Ljava/lang/String;Landroid/os/Parcel;)V
-HSPLandroid/content/ComponentName;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/ComponentName;->appendShortClassName(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/ComponentName;->appendShortString(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/ComponentName;->compareTo(Landroid/content/ComponentName;)I
-HSPLandroid/content/ComponentName;->createRelative(Ljava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;
-HSPLandroid/content/ComponentName;->equals(Ljava/lang/Object;)Z
-HSPLandroid/content/ComponentName;->flattenToShortString()Ljava/lang/String;
-HSPLandroid/content/ComponentName;->flattenToString()Ljava/lang/String;
-HSPLandroid/content/ComponentName;->getClassName()Ljava/lang/String;
-HSPLandroid/content/ComponentName;->getPackageName()Ljava/lang/String;
-HSPLandroid/content/ComponentName;->getShortClassName()Ljava/lang/String;
-HSPLandroid/content/ComponentName;->hashCode()I
-HSPLandroid/content/ComponentName;->readFromParcel(Landroid/os/Parcel;)Landroid/content/ComponentName;
-HSPLandroid/content/ComponentName;->toShortString()Ljava/lang/String;
-HSPLandroid/content/ComponentName;->toString()Ljava/lang/String;
-HSPLandroid/content/ComponentName;->unflattenFromString(Ljava/lang/String;)Landroid/content/ComponentName;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/content/ComponentName;->writeToParcel(Landroid/content/ComponentName;Landroid/os/Parcel;)V
-HSPLandroid/content/ComponentName;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/ContentCaptureOptions$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/ContentCaptureOptions;
-HSPLandroid/content/ContentCaptureOptions$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda1;-><init>()V
-HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda1;->apply(I)Ljava/lang/Object;
-HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda2;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions;->-$$Nest$smcreateFromParcel(Landroid/os/Parcel;)Landroid/content/ContentCaptureOptions$ContentProtectionOptions;
-HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions;-><init>(ZILjava/util/List;Ljava/util/List;I)V
-HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions;->createFromParcel(Landroid/os/Parcel;)Landroid/content/ContentCaptureOptions$ContentProtectionOptions;
-HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions;->createGroupsFromParcel(Landroid/os/Parcel;)Ljava/util/List;+]Ljava/util/stream/Stream;Ljava/util/stream/IntPipeline$4;,Ljava/util/stream/ReferencePipeline$11;,Ljava/util/stream/ReferencePipeline$15;,Ljava/util/stream/IntPipeline$1;]Ljava/util/stream/IntStream;Ljava/util/stream/IntPipeline$Head;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions;->lambda$createGroupsFromParcel$0(I)Ljava/util/ArrayList;
-HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions;->writeToParcel(Landroid/os/Parcel;)V
-HSPLandroid/content/ContentCaptureOptions;-><init>(IIIIILandroid/util/ArraySet;)V
-HSPLandroid/content/ContentCaptureOptions;-><init>(ZIIIIIZZLandroid/content/ContentCaptureOptions$ContentProtectionOptions;Landroid/util/ArraySet;)V
-HSPLandroid/content/ContentCaptureOptions;->isWhitelisted(Landroid/content/Context;)Z
-HSPLandroid/content/ContentCaptureOptions;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/ContentProvider$Transport;-><init>(Landroid/content/ContentProvider;)V
-HSPLandroid/content/ContentProvider$Transport;->call(Landroid/content/AttributionSource;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
-HSPLandroid/content/ContentProvider$Transport;->createCancellationSignal()Landroid/os/ICancellationSignal;
-HSPLandroid/content/ContentProvider$Transport;->delete(Landroid/content/AttributionSource;Landroid/net/Uri;Landroid/os/Bundle;)I
-HSPLandroid/content/ContentProvider$Transport;->enforceFilePermission(Landroid/content/AttributionSource;Landroid/net/Uri;Ljava/lang/String;)V
-HSPLandroid/content/ContentProvider$Transport;->enforceReadPermission(Landroid/content/AttributionSource;Landroid/net/Uri;)I
-HSPLandroid/content/ContentProvider$Transport;->enforceWritePermission(Landroid/content/AttributionSource;Landroid/net/Uri;)I
-HSPLandroid/content/ContentProvider$Transport;->getContentProvider()Landroid/content/ContentProvider;
-HSPLandroid/content/ContentProvider$Transport;->getProviderName()Ljava/lang/String;
-HSPLandroid/content/ContentProvider$Transport;->insert(Landroid/content/AttributionSource;Landroid/net/Uri;Landroid/content/ContentValues;Landroid/os/Bundle;)Landroid/net/Uri;
-HSPLandroid/content/ContentProvider$Transport;->openTypedAssetFile(Landroid/content/AttributionSource;Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/ICancellationSignal;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/ContentProvider$Transport;->query(Landroid/content/AttributionSource;Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/ICancellationSignal;)Landroid/database/Cursor;
-HSPLandroid/content/ContentProvider$Transport;->update(Landroid/content/AttributionSource;Landroid/net/Uri;Landroid/content/ContentValues;Landroid/os/Bundle;)I
-HSPLandroid/content/ContentProvider;->-$$Nest$fgetmTransport(Landroid/content/ContentProvider;)Landroid/content/ContentProvider$Transport;
-HSPLandroid/content/ContentProvider;->-$$Nest$mmaybeGetUriWithoutUserId(Landroid/content/ContentProvider;Landroid/net/Uri;)Landroid/net/Uri;
-HSPLandroid/content/ContentProvider;->-$$Nest$msetCallingAttributionSource(Landroid/content/ContentProvider;Landroid/content/AttributionSource;)Landroid/content/AttributionSource;
-HSPLandroid/content/ContentProvider;->-$$Nest$mvalidateIncomingAuthority(Landroid/content/ContentProvider;Ljava/lang/String;)V
-HSPLandroid/content/ContentProvider;->-$$Nest$smtraceBegin(JLjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/ContentProvider;-><init>()V
-HSPLandroid/content/ContentProvider;->applyBatch(Ljava/lang/String;Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;
-HSPLandroid/content/ContentProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V
-HSPLandroid/content/ContentProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;Z)V
-HSPLandroid/content/ContentProvider;->call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
-HSPLandroid/content/ContentProvider;->checkPermission(Ljava/lang/String;Landroid/content/AttributionSource;)I
-HSPLandroid/content/ContentProvider;->checkUser(IILandroid/content/Context;)Z
-HSPLandroid/content/ContentProvider;->clearCallingIdentity()Landroid/content/ContentProvider$CallingIdentity;
-HSPLandroid/content/ContentProvider;->coerceToLocalContentProvider(Landroid/content/IContentProvider;)Landroid/content/ContentProvider;
-HSPLandroid/content/ContentProvider;->delete(Landroid/net/Uri;Landroid/os/Bundle;)I
-HSPLandroid/content/ContentProvider;->deniedAccessSystemUserOnlyProvider(IZ)Z
-HSPLandroid/content/ContentProvider;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
-HSPLandroid/content/ContentProvider;->enforceReadPermissionInner(Landroid/net/Uri;Landroid/content/AttributionSource;)I
-HSPLandroid/content/ContentProvider;->enforceWritePermissionInner(Landroid/net/Uri;Landroid/content/AttributionSource;)I
-HSPLandroid/content/ContentProvider;->getAuthorityWithoutUserId(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/content/ContentProvider;->getCallingAttributionSource()Landroid/content/AttributionSource;
-HSPLandroid/content/ContentProvider;->getCallingPackage()Ljava/lang/String;
-HSPLandroid/content/ContentProvider;->getContext()Landroid/content/Context;
-HSPLandroid/content/ContentProvider;->getIContentProvider()Landroid/content/IContentProvider;
-HSPLandroid/content/ContentProvider;->getPathPermissions()[Landroid/content/pm/PathPermission;
-HSPLandroid/content/ContentProvider;->getReadPermission()Ljava/lang/String;
-HSPLandroid/content/ContentProvider;->getUriWithoutUserId(Landroid/net/Uri;)Landroid/net/Uri;
-HSPLandroid/content/ContentProvider;->getUserIdFromAuthority(Ljava/lang/String;I)I
-HSPLandroid/content/ContentProvider;->getUserIdFromUri(Landroid/net/Uri;)I
-HSPLandroid/content/ContentProvider;->getUserIdFromUri(Landroid/net/Uri;I)I
-HSPLandroid/content/ContentProvider;->getWritePermission()Ljava/lang/String;
-HSPLandroid/content/ContentProvider;->insert(Landroid/net/Uri;Landroid/content/ContentValues;Landroid/os/Bundle;)Landroid/net/Uri;
-HSPLandroid/content/ContentProvider;->matchesOurAuthorities(Ljava/lang/String;)Z
-HSPLandroid/content/ContentProvider;->maybeAddUserId(Landroid/net/Uri;I)Landroid/net/Uri;
-HSPLandroid/content/ContentProvider;->maybeGetUriWithoutUserId(Landroid/net/Uri;)Landroid/net/Uri;
-HSPLandroid/content/ContentProvider;->onCallingPackageChanged()V
-HSPLandroid/content/ContentProvider;->onConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/content/ContentProvider;->onLowMemory()V
-HSPLandroid/content/ContentProvider;->onTrimMemory(I)V
-HSPLandroid/content/ContentProvider;->openAssetFile(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/ContentProvider;->openAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/ContentProvider;->openTypedAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/ContentProvider;->openTypedAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/ContentProvider;->query(Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
-HSPLandroid/content/ContentProvider;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
-HSPLandroid/content/ContentProvider;->restoreCallingIdentity(Landroid/content/ContentProvider$CallingIdentity;)V
-HSPLandroid/content/ContentProvider;->setAuthorities(Ljava/lang/String;)V
-HSPLandroid/content/ContentProvider;->setCallingAttributionSource(Landroid/content/AttributionSource;)Landroid/content/AttributionSource;
-HSPLandroid/content/ContentProvider;->setPathPermissions([Landroid/content/pm/PathPermission;)V
-HSPLandroid/content/ContentProvider;->setReadPermission(Ljava/lang/String;)V
-HSPLandroid/content/ContentProvider;->setTransportLoggingEnabled(Z)V
-HSPLandroid/content/ContentProvider;->setWritePermission(Ljava/lang/String;)V
-HSPLandroid/content/ContentProvider;->traceBegin(JLjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/ContentProvider;->update(Landroid/net/Uri;Landroid/content/ContentValues;Landroid/os/Bundle;)I
-HSPLandroid/content/ContentProvider;->uriHasUserId(Landroid/net/Uri;)Z
-HSPLandroid/content/ContentProvider;->validateIncomingAuthority(Ljava/lang/String;)V
-HSPLandroid/content/ContentProvider;->validateIncomingUri(Landroid/net/Uri;)Landroid/net/Uri;
-HSPLandroid/content/ContentProviderClient$CursorWrapperInner;-><init>(Landroid/content/ContentProviderClient;Landroid/database/Cursor;)V
-HSPLandroid/content/ContentProviderClient$CursorWrapperInner;->close()V
-HSPLandroid/content/ContentProviderClient$CursorWrapperInner;->finalize()V
-HSPLandroid/content/ContentProviderClient;-><init>(Landroid/content/ContentResolver;Landroid/content/IContentProvider;Ljava/lang/String;Z)V
-HSPLandroid/content/ContentProviderClient;->afterRemote()V
-HSPLandroid/content/ContentProviderClient;->applyBatch(Ljava/lang/String;Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;
-HSPLandroid/content/ContentProviderClient;->applyBatch(Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;
-HSPLandroid/content/ContentProviderClient;->beforeRemote()V
-HSPLandroid/content/ContentProviderClient;->call(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
-HSPLandroid/content/ContentProviderClient;->call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
-HSPLandroid/content/ContentProviderClient;->close()V
-HSPLandroid/content/ContentProviderClient;->closeInternal()Z
-HSPLandroid/content/ContentProviderClient;->finalize()V
-HSPLandroid/content/ContentProviderClient;->getLocalContentProvider()Landroid/content/ContentProvider;
-HSPLandroid/content/ContentProviderClient;->query(Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
-HSPLandroid/content/ContentProviderClient;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/content/ContentProviderClient;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
-HSPLandroid/content/ContentProviderClient;->release()Z
-HSPLandroid/content/ContentProviderClient;->setDetectNotResponding(J)V
-HSPLandroid/content/ContentProviderNative;-><init>()V
-HSPLandroid/content/ContentProviderNative;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/ContentProviderNative;->asInterface(Landroid/os/IBinder;)Landroid/content/IContentProvider;
-HSPLandroid/content/ContentProviderNative;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/content/ContentProviderOperation$Builder;->assertSelectionAllowed()V
-HSPLandroid/content/ContentProviderOperation$Builder;->assertValuesAllowed()V
-HSPLandroid/content/ContentProviderOperation$Builder;->build()Landroid/content/ContentProviderOperation;
-HSPLandroid/content/ContentProviderOperation$Builder;->ensureSelectionArgs()V
-HSPLandroid/content/ContentProviderOperation$Builder;->setSelectionArg(ILjava/lang/Object;)V
-HSPLandroid/content/ContentProviderOperation$Builder;->setValue(Ljava/lang/String;Ljava/lang/Object;)V
-HSPLandroid/content/ContentProviderOperation$Builder;->withExpectedCount(I)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation$Builder;->withSelection(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation$Builder;->withValue(Ljava/lang/String;Ljava/lang/Object;)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation$Builder;->withValues(Landroid/content/ContentValues;)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation;-><init>(Landroid/content/ContentProviderOperation$Builder;)V
-HSPLandroid/content/ContentProviderOperation;->apply(Landroid/content/ContentProvider;[Landroid/content/ContentProviderResult;I)Landroid/content/ContentProviderResult;
-HSPLandroid/content/ContentProviderOperation;->applyInternal(Landroid/content/ContentProvider;[Landroid/content/ContentProviderResult;I)Landroid/content/ContentProviderResult;+]Landroid/content/ContentProviderOperation;Landroid/content/ContentProviderOperation;
-HSPLandroid/content/ContentProviderOperation;->getUri()Landroid/net/Uri;
-HSPLandroid/content/ContentProviderOperation;->isInsert()Z
-HSPLandroid/content/ContentProviderOperation;->isReadOperation()Z
-HSPLandroid/content/ContentProviderOperation;->isWriteOperation()Z
-HSPLandroid/content/ContentProviderOperation;->isYieldAllowed()Z
-HSPLandroid/content/ContentProviderOperation;->newAssertQuery(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation;->newDelete(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation;->newInsert(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation;->newUpdate(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation;->resolveExtrasBackReferences([Landroid/content/ContentProviderResult;I)Landroid/os/Bundle;
-HSPLandroid/content/ContentProviderOperation;->resolveSelectionArgsBackReferences([Landroid/content/ContentProviderResult;I)[Ljava/lang/String;
-HSPLandroid/content/ContentProviderOperation;->resolveValueBackReferences([Landroid/content/ContentProviderResult;I)Landroid/content/ContentValues;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/content/ContentValues;Landroid/content/ContentValues;
-HSPLandroid/content/ContentProviderOperation;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/ContentProviderProxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/content/ContentProviderProxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/ContentProviderProxy;->call(Landroid/content/AttributionSource;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
-HSPLandroid/content/ContentProviderProxy;->createCancellationSignal()Landroid/os/ICancellationSignal;
-HSPLandroid/content/ContentProviderProxy;->delete(Landroid/content/AttributionSource;Landroid/net/Uri;Landroid/os/Bundle;)I
-HSPLandroid/content/ContentProviderProxy;->insert(Landroid/content/AttributionSource;Landroid/net/Uri;Landroid/content/ContentValues;Landroid/os/Bundle;)Landroid/net/Uri;
-HSPLandroid/content/ContentProviderProxy;->openTypedAssetFile(Landroid/content/AttributionSource;Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/ICancellationSignal;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/ContentProviderProxy;->query(Landroid/content/AttributionSource;Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/ICancellationSignal;)Landroid/database/Cursor;+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Landroid/os/Parcelable$Creator;Landroid/database/BulkCursorDescriptor$1;]Landroid/database/IBulkCursor;Landroid/database/BulkCursorProxy;]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/os/ICancellationSignal;Landroid/os/ICancellationSignal$Stub$Proxy;]Landroid/database/BulkCursorToCursorAdaptor;Landroid/database/BulkCursorToCursorAdaptor;]Landroid/database/IContentObserver;Landroid/database/ContentObserver$Transport;]Landroid/os/Parcel;Landroid/os/Parcel;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;
-HSPLandroid/content/ContentProviderProxy;->update(Landroid/content/AttributionSource;Landroid/net/Uri;Landroid/content/ContentValues;Landroid/os/Bundle;)I
-HSPLandroid/content/ContentProviderResult$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/ContentProviderResult;
-HSPLandroid/content/ContentProviderResult$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/ContentProviderResult$1;->newArray(I)[Landroid/content/ContentProviderResult;
-HSPLandroid/content/ContentProviderResult$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/content/ContentProviderResult;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/ContentResolver$2;-><init>(Landroid/content/SyncStatusObserver;)V
-HSPLandroid/content/ContentResolver$2;->onStatusChanged(I)V
-HSPLandroid/content/ContentResolver$CursorWrapperInner;-><init>(Landroid/content/ContentResolver;Landroid/database/Cursor;Landroid/content/IContentProvider;)V
-HSPLandroid/content/ContentResolver$CursorWrapperInner;->close()V
-HSPLandroid/content/ContentResolver$CursorWrapperInner;->finalize()V
-HSPLandroid/content/ContentResolver$ParcelFileDescriptorInner;-><init>(Landroid/content/ContentResolver;Landroid/os/ParcelFileDescriptor;Landroid/content/IContentProvider;)V
-HSPLandroid/content/ContentResolver$ParcelFileDescriptorInner;->releaseResources()V
-HSPLandroid/content/ContentResolver$ResultListener;-><init>()V
-HSPLandroid/content/ContentResolver$ResultListener;->onResult(Landroid/os/Bundle;)V
-HSPLandroid/content/ContentResolver$ResultListener;->waitForResult(J)V
-HSPLandroid/content/ContentResolver$StringResultListener;->getResultFromBundle(Landroid/os/Bundle;)Ljava/lang/Object;
-HSPLandroid/content/ContentResolver$StringResultListener;->getResultFromBundle(Landroid/os/Bundle;)Ljava/lang/String;
-HSPLandroid/content/ContentResolver;-><init>(Landroid/content/Context;)V
-HSPLandroid/content/ContentResolver;-><init>(Landroid/content/Context;Landroid/content/ContentInterface;)V
-HSPLandroid/content/ContentResolver;->acquireContentProviderClient(Landroid/net/Uri;)Landroid/content/ContentProviderClient;
-HSPLandroid/content/ContentResolver;->acquireContentProviderClient(Ljava/lang/String;)Landroid/content/ContentProviderClient;
-HSPLandroid/content/ContentResolver;->acquireExistingProvider(Landroid/net/Uri;)Landroid/content/IContentProvider;
-HSPLandroid/content/ContentResolver;->acquireProvider(Landroid/net/Uri;)Landroid/content/IContentProvider;
-HSPLandroid/content/ContentResolver;->acquireProvider(Ljava/lang/String;)Landroid/content/IContentProvider;
-HSPLandroid/content/ContentResolver;->acquireUnstableContentProviderClient(Landroid/net/Uri;)Landroid/content/ContentProviderClient;
-HSPLandroid/content/ContentResolver;->acquireUnstableProvider(Landroid/net/Uri;)Landroid/content/IContentProvider;
-HSPLandroid/content/ContentResolver;->addPeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;J)V
-HSPLandroid/content/ContentResolver;->addStatusChangeListener(ILandroid/content/SyncStatusObserver;)Ljava/lang/Object;
-HSPLandroid/content/ContentResolver;->applyBatch(Ljava/lang/String;Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;
-HSPLandroid/content/ContentResolver;->bulkInsert(Landroid/net/Uri;[Landroid/content/ContentValues;)I
-HSPLandroid/content/ContentResolver;->call(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
-HSPLandroid/content/ContentResolver;->call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
-HSPLandroid/content/ContentResolver;->createSqlQueryBundle(Ljava/lang/String;[Ljava/lang/String;)Landroid/os/Bundle;
-HSPLandroid/content/ContentResolver;->createSqlQueryBundle(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/os/Bundle;
-HSPLandroid/content/ContentResolver;->delete(Landroid/net/Uri;Landroid/os/Bundle;)I
-HSPLandroid/content/ContentResolver;->delete(Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I
-HSPLandroid/content/ContentResolver;->getAttributionSource()Landroid/content/AttributionSource;
-HSPLandroid/content/ContentResolver;->getAttributionTag()Ljava/lang/String;
-HSPLandroid/content/ContentResolver;->getContentService()Landroid/content/IContentService;
-HSPLandroid/content/ContentResolver;->getIsSyncable(Landroid/accounts/Account;Ljava/lang/String;)I
-HSPLandroid/content/ContentResolver;->getMasterSyncAutomatically()Z
-HSPLandroid/content/ContentResolver;->getOutgoingPersistedUriPermissions()Ljava/util/List;
-HSPLandroid/content/ContentResolver;->getPackageName()Ljava/lang/String;
-HSPLandroid/content/ContentResolver;->getPeriodicSyncs(Landroid/accounts/Account;Ljava/lang/String;)Ljava/util/List;
-HSPLandroid/content/ContentResolver;->getResourceId(Landroid/net/Uri;)Landroid/content/ContentResolver$OpenResourceIdResult;
-HSPLandroid/content/ContentResolver;->getSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;)Z
-HSPLandroid/content/ContentResolver;->getType(Landroid/net/Uri;)Ljava/lang/String;
-HSPLandroid/content/ContentResolver;->getUserId()I
-HSPLandroid/content/ContentResolver;->insert(Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;
-HSPLandroid/content/ContentResolver;->insert(Landroid/net/Uri;Landroid/content/ContentValues;Landroid/os/Bundle;)Landroid/net/Uri;
-HSPLandroid/content/ContentResolver;->invalidPeriodicExtras(Landroid/os/Bundle;)Z
-HSPLandroid/content/ContentResolver;->maybeLogQueryToEventLog(JLandroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/content/ContentResolver;->maybeLogUpdateToEventLog(JLandroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/ContentResolver;->notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;)V
-HSPLandroid/content/ContentResolver;->notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;I)V
-HSPLandroid/content/ContentResolver;->notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;II)V
-HSPLandroid/content/ContentResolver;->notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;Z)V
-HSPLandroid/content/ContentResolver;->notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;ZI)V
-HSPLandroid/content/ContentResolver;->notifyChange([Landroid/net/Uri;Landroid/database/ContentObserver;II)V
-HSPLandroid/content/ContentResolver;->openAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/ContentResolver;->openAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/ContentResolver;->openFileDescriptor(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;
-HSPLandroid/content/ContentResolver;->openFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;
-HSPLandroid/content/ContentResolver;->openInputStream(Landroid/net/Uri;)Ljava/io/InputStream;
-HSPLandroid/content/ContentResolver;->openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/ContentResolver;->openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/ContentResolver;->query(Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
-HSPLandroid/content/ContentResolver;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/content/ContentResolver;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
-HSPLandroid/content/ContentResolver;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;)V
-HSPLandroid/content/ContentResolver;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;I)V
-HSPLandroid/content/ContentResolver;->removePeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/content/ContentResolver;->requestSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/content/ContentResolver;->requestSyncAsUser(Landroid/accounts/Account;Ljava/lang/String;ILandroid/os/Bundle;)V
-HSPLandroid/content/ContentResolver;->resolveUserId(Landroid/net/Uri;)I
-HSPLandroid/content/ContentResolver;->setIsSyncable(Landroid/accounts/Account;Ljava/lang/String;I)V
-HSPLandroid/content/ContentResolver;->setSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;Z)V
-HSPLandroid/content/ContentResolver;->setSyncAutomaticallyAsUser(Landroid/accounts/Account;Ljava/lang/String;ZI)V
-HSPLandroid/content/ContentResolver;->unregisterContentObserver(Landroid/database/ContentObserver;)V
-HSPLandroid/content/ContentResolver;->update(Landroid/net/Uri;Landroid/content/ContentValues;Landroid/os/Bundle;)I
-HSPLandroid/content/ContentResolver;->update(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I
-HSPLandroid/content/ContentResolver;->validateSyncExtrasBundle(Landroid/os/Bundle;)V
-HSPLandroid/content/ContentUris;->appendId(Landroid/net/Uri$Builder;J)Landroid/net/Uri$Builder;
-HSPLandroid/content/ContentUris;->parseId(Landroid/net/Uri;)J
-HSPLandroid/content/ContentUris;->withAppendedId(Landroid/net/Uri;J)Landroid/net/Uri;
-HSPLandroid/content/ContentValues$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/ContentValues;
-HSPLandroid/content/ContentValues$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/ContentValues;-><init>()V
-HSPLandroid/content/ContentValues;-><init>(I)V
-HSPLandroid/content/ContentValues;-><init>(Landroid/content/ContentValues;)V
-HSPLandroid/content/ContentValues;->clear()V
-HSPLandroid/content/ContentValues;->containsKey(Ljava/lang/String;)Z
-HSPLandroid/content/ContentValues;->equals(Ljava/lang/Object;)Z
-HSPLandroid/content/ContentValues;->get(Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroid/content/ContentValues;->getAsBoolean(Ljava/lang/String;)Ljava/lang/Boolean;
-HSPLandroid/content/ContentValues;->getAsByteArray(Ljava/lang/String;)[B
-HSPLandroid/content/ContentValues;->getAsInteger(Ljava/lang/String;)Ljava/lang/Integer;
-HSPLandroid/content/ContentValues;->getAsLong(Ljava/lang/String;)Ljava/lang/Long;
-HSPLandroid/content/ContentValues;->getAsString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/content/ContentValues;->getValues()Landroid/util/ArrayMap;
-HSPLandroid/content/ContentValues;->isEmpty()Z
-HSPLandroid/content/ContentValues;->isSupportedValue(Ljava/lang/Object;)Z
-HSPLandroid/content/ContentValues;->keySet()Ljava/util/Set;
-HSPLandroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/Boolean;)V
-HSPLandroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/Double;)V
-HSPLandroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/Float;)V
-HSPLandroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/Integer;)V
-HSPLandroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/Long;)V
-HSPLandroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/ContentValues;->put(Ljava/lang/String;[B)V
-HSPLandroid/content/ContentValues;->putAll(Landroid/content/ContentValues;)V
-HSPLandroid/content/ContentValues;->putNull(Ljava/lang/String;)V
-HSPLandroid/content/ContentValues;->putObject(Ljava/lang/String;Ljava/lang/Object;)V
-HSPLandroid/content/ContentValues;->remove(Ljava/lang/String;)V
-HSPLandroid/content/ContentValues;->size()I
-HSPLandroid/content/ContentValues;->toString()Ljava/lang/String;
-HSPLandroid/content/ContentValues;->valueSet()Ljava/util/Set;
-HSPLandroid/content/ContentValues;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/Context;-><init>()V
-HSPLandroid/content/Context;->getColor(I)I
-HSPLandroid/content/Context;->getColorStateList(I)Landroid/content/res/ColorStateList;
-HSPLandroid/content/Context;->getDrawable(I)Landroid/graphics/drawable/Drawable;
-HSPLandroid/content/Context;->getNextAutofillId()I
-HSPLandroid/content/Context;->getSharedPrefsFile(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/content/Context;->getString(I)Ljava/lang/String;
-HSPLandroid/content/Context;->getString(I[Ljava/lang/Object;)Ljava/lang/String;
-HSPLandroid/content/Context;->getSystemService(Ljava/lang/Class;)Ljava/lang/Object;
-HSPLandroid/content/Context;->getText(I)Ljava/lang/CharSequence;
-HSPLandroid/content/Context;->getToken(Landroid/content/Context;)Landroid/os/IBinder;
-HSPLandroid/content/Context;->isAutofillCompatibilityEnabled()Z
-HSPLandroid/content/Context;->obtainStyledAttributes(I[I)Landroid/content/res/TypedArray;
-HSPLandroid/content/Context;->obtainStyledAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;
-HSPLandroid/content/Context;->obtainStyledAttributes(Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray;+]Landroid/content/res/Resources$Theme;Landroid/content/res/Resources$Theme;]Landroid/content/Context;missing_types
-HSPLandroid/content/Context;->obtainStyledAttributes([I)Landroid/content/res/TypedArray;
-HSPLandroid/content/Context;->registerComponentCallbacks(Landroid/content/ComponentCallbacks;)V
-HSPLandroid/content/Context;->unregisterComponentCallbacks(Landroid/content/ComponentCallbacks;)V
-HSPLandroid/content/ContextParams$Builder;-><init>()V
-HSPLandroid/content/ContextParams$Builder;-><init>(Landroid/content/ContextParams;)V
-HSPLandroid/content/ContextParams$Builder;->build()Landroid/content/ContextParams;
-HSPLandroid/content/ContextParams$Builder;->setAttributionTag(Ljava/lang/String;)Landroid/content/ContextParams$Builder;
-HSPLandroid/content/ContextParams;->-$$Nest$fgetmAttributionTag(Landroid/content/ContextParams;)Ljava/lang/String;
-HSPLandroid/content/ContextParams;->-$$Nest$fgetmNext(Landroid/content/ContextParams;)Landroid/content/AttributionSource;
-HSPLandroid/content/ContextParams;->-$$Nest$fgetmRenouncedPermissions(Landroid/content/ContextParams;)Ljava/util/Set;
-HSPLandroid/content/ContextParams;-><clinit>()V
-HSPLandroid/content/ContextParams;->getAttributionTag()Ljava/lang/String;
-HSPLandroid/content/ContextParams;->getNextAttributionSource()Landroid/content/AttributionSource;
-HSPLandroid/content/ContextParams;->getRenouncedPermissions()Ljava/util/Set;
-HSPLandroid/content/ContextParams;->isRenouncedPermission(Ljava/lang/String;)Z
-HSPLandroid/content/ContextParams;->shouldRegisterAttributionSource()Z
-HSPLandroid/content/ContextWrapper;-><init>(Landroid/content/Context;)V
-HSPLandroid/content/ContextWrapper;->attachBaseContext(Landroid/content/Context;)V
-HSPLandroid/content/ContextWrapper;->bindIsolatedService(Landroid/content/Intent;ILjava/lang/String;Ljava/util/concurrent/Executor;Landroid/content/ServiceConnection;)Z
-HSPLandroid/content/ContextWrapper;->bindService(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z
-HSPLandroid/content/ContextWrapper;->bindServiceAsUser(Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/UserHandle;)Z
-HSPLandroid/content/ContextWrapper;->canLoadUnsafeResources()Z
-HSPLandroid/content/ContextWrapper;->checkCallingOrSelfPermission(Ljava/lang/String;)I
-HSPLandroid/content/ContextWrapper;->checkCallingPermission(Ljava/lang/String;)I
-HSPLandroid/content/ContextWrapper;->checkPermission(Ljava/lang/String;II)I
-HSPLandroid/content/ContextWrapper;->checkPermission(Ljava/lang/String;IILandroid/os/IBinder;)I
-HSPLandroid/content/ContextWrapper;->checkSelfPermission(Ljava/lang/String;)I
-HSPLandroid/content/ContextWrapper;->checkUriPermission(Landroid/net/Uri;III)I
-HSPLandroid/content/ContextWrapper;->checkUriPermission(Landroid/net/Uri;IIILandroid/os/IBinder;)I
-HSPLandroid/content/ContextWrapper;->createApplicationContext(Landroid/content/pm/ApplicationInfo;I)Landroid/content/Context;
-HSPLandroid/content/ContextWrapper;->createAttributionContext(Ljava/lang/String;)Landroid/content/Context;
-HSPLandroid/content/ContextWrapper;->createConfigurationContext(Landroid/content/res/Configuration;)Landroid/content/Context;
-HSPLandroid/content/ContextWrapper;->createContextAsUser(Landroid/os/UserHandle;I)Landroid/content/Context;
-HSPLandroid/content/ContextWrapper;->createCredentialProtectedStorageContext()Landroid/content/Context;
-HSPLandroid/content/ContextWrapper;->createDeviceProtectedStorageContext()Landroid/content/Context;
-HSPLandroid/content/ContextWrapper;->createDisplayContext(Landroid/view/Display;)Landroid/content/Context;
-HSPLandroid/content/ContextWrapper;->createPackageContext(Ljava/lang/String;I)Landroid/content/Context;
-HSPLandroid/content/ContextWrapper;->createPackageContextAsUser(Ljava/lang/String;ILandroid/os/UserHandle;)Landroid/content/Context;
-HSPLandroid/content/ContextWrapper;->createWindowContext(Landroid/view/Display;ILandroid/os/Bundle;)Landroid/content/Context;
-HSPLandroid/content/ContextWrapper;->databaseList()[Ljava/lang/String;
-HSPLandroid/content/ContextWrapper;->deleteDatabase(Ljava/lang/String;)Z
-HSPLandroid/content/ContextWrapper;->deleteFile(Ljava/lang/String;)Z
-HSPLandroid/content/ContextWrapper;->enforceCallingOrSelfPermission(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/ContextWrapper;->enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/ContextWrapper;->enforcePermission(Ljava/lang/String;IILjava/lang/String;)V
-HSPLandroid/content/ContextWrapper;->fileList()[Ljava/lang/String;
-HSPLandroid/content/ContextWrapper;->getActivityToken()Landroid/os/IBinder;
-HSPLandroid/content/ContextWrapper;->getApplicationContext()Landroid/content/Context;
-HSPLandroid/content/ContextWrapper;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;+]Landroid/content/Context;missing_types
-HSPLandroid/content/ContextWrapper;->getAssets()Landroid/content/res/AssetManager;
-HSPLandroid/content/ContextWrapper;->getAttributionSource()Landroid/content/AttributionSource;
-HSPLandroid/content/ContextWrapper;->getAttributionTag()Ljava/lang/String;
-HSPLandroid/content/ContextWrapper;->getAutofillClient()Landroid/view/autofill/AutofillManager$AutofillClient;
-HSPLandroid/content/ContextWrapper;->getAutofillOptions()Landroid/content/AutofillOptions;
-HSPLandroid/content/ContextWrapper;->getBaseContext()Landroid/content/Context;
-HSPLandroid/content/ContextWrapper;->getBasePackageName()Ljava/lang/String;
-HSPLandroid/content/ContextWrapper;->getCacheDir()Ljava/io/File;
-HSPLandroid/content/ContextWrapper;->getClassLoader()Ljava/lang/ClassLoader;
-HSPLandroid/content/ContextWrapper;->getContentCaptureOptions()Landroid/content/ContentCaptureOptions;
-HSPLandroid/content/ContextWrapper;->getContentResolver()Landroid/content/ContentResolver;+]Landroid/content/Context;missing_types
-HSPLandroid/content/ContextWrapper;->getDataDir()Ljava/io/File;
-HSPLandroid/content/ContextWrapper;->getDatabasePath(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/content/ContextWrapper;->getDeviceId()I
-HSPLandroid/content/ContextWrapper;->getDir(Ljava/lang/String;I)Ljava/io/File;
-HSPLandroid/content/ContextWrapper;->getDisplay()Landroid/view/Display;
-HSPLandroid/content/ContextWrapper;->getDisplayId()I+]Landroid/content/Context;missing_types
-HSPLandroid/content/ContextWrapper;->getDisplayNoVerify()Landroid/view/Display;
-HSPLandroid/content/ContextWrapper;->getExternalCacheDir()Ljava/io/File;
-HSPLandroid/content/ContextWrapper;->getExternalCacheDirs()[Ljava/io/File;
-HSPLandroid/content/ContextWrapper;->getExternalFilesDir(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/content/ContextWrapper;->getExternalFilesDirs(Ljava/lang/String;)[Ljava/io/File;
-HSPLandroid/content/ContextWrapper;->getExternalMediaDirs()[Ljava/io/File;
-HSPLandroid/content/ContextWrapper;->getFileStreamPath(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/content/ContextWrapper;->getFilesDir()Ljava/io/File;
-HSPLandroid/content/ContextWrapper;->getMainExecutor()Ljava/util/concurrent/Executor;
-HSPLandroid/content/ContextWrapper;->getMainLooper()Landroid/os/Looper;
-HSPLandroid/content/ContextWrapper;->getMainThreadHandler()Landroid/os/Handler;
-HSPLandroid/content/ContextWrapper;->getNextAutofillId()I
-HSPLandroid/content/ContextWrapper;->getNoBackupFilesDir()Ljava/io/File;
-HSPLandroid/content/ContextWrapper;->getOpPackageName()Ljava/lang/String;
-HSPLandroid/content/ContextWrapper;->getPackageCodePath()Ljava/lang/String;
-HSPLandroid/content/ContextWrapper;->getPackageManager()Landroid/content/pm/PackageManager;+]Landroid/content/Context;missing_types
-HSPLandroid/content/ContextWrapper;->getPackageName()Ljava/lang/String;
-HSPLandroid/content/ContextWrapper;->getPackageResourcePath()Ljava/lang/String;
-HSPLandroid/content/ContextWrapper;->getResources()Landroid/content/res/Resources;
-HSPLandroid/content/ContextWrapper;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;+]Landroid/content/Context;missing_types
-HSPLandroid/content/ContextWrapper;->getSharedPreferencesPath(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/content/ContextWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;+]Landroid/content/Context;missing_types
-HSPLandroid/content/ContextWrapper;->getSystemServiceName(Ljava/lang/Class;)Ljava/lang/String;+]Landroid/content/Context;missing_types
-HSPLandroid/content/ContextWrapper;->getTheme()Landroid/content/res/Resources$Theme;+]Landroid/content/Context;missing_types
-HSPLandroid/content/ContextWrapper;->getUser()Landroid/os/UserHandle;
-HSPLandroid/content/ContextWrapper;->getUserId()I
-HSPLandroid/content/ContextWrapper;->getWindowContextToken()Landroid/os/IBinder;
-HSPLandroid/content/ContextWrapper;->grantUriPermission(Ljava/lang/String;Landroid/net/Uri;I)V
-HSPLandroid/content/ContextWrapper;->isDeviceProtectedStorage()Z
-HSPLandroid/content/ContextWrapper;->isRestricted()Z
-HSPLandroid/content/ContextWrapper;->isUiContext()Z
-HSPLandroid/content/ContextWrapper;->openFileInput(Ljava/lang/String;)Ljava/io/FileInputStream;
-HSPLandroid/content/ContextWrapper;->openFileOutput(Ljava/lang/String;I)Ljava/io/FileOutputStream;
-HSPLandroid/content/ContextWrapper;->openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/content/ContextWrapper;->registerComponentCallbacks(Landroid/content/ComponentCallbacks;)V
-HSPLandroid/content/ContextWrapper;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;
-HSPLandroid/content/ContextWrapper;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;I)Landroid/content/Intent;
-HSPLandroid/content/ContextWrapper;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
-HSPLandroid/content/ContextWrapper;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent;
-HSPLandroid/content/ContextWrapper;->registerReceiverAsUser(Landroid/content/BroadcastReceiver;Landroid/os/UserHandle;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
-HSPLandroid/content/ContextWrapper;->registerReceiverForAllUsers(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
-HSPLandroid/content/ContextWrapper;->revokeUriPermission(Landroid/net/Uri;I)V
-HSPLandroid/content/ContextWrapper;->sendBroadcast(Landroid/content/Intent;)V
-HSPLandroid/content/ContextWrapper;->sendBroadcast(Landroid/content/Intent;Ljava/lang/String;)V
-HSPLandroid/content/ContextWrapper;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
-HSPLandroid/content/ContextWrapper;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;)V
-HSPLandroid/content/ContextWrapper;->sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;)V
-HSPLandroid/content/ContextWrapper;->sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/content/ContextWrapper;->sendStickyBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
-HSPLandroid/content/ContextWrapper;->setAutofillClient(Landroid/view/autofill/AutofillManager$AutofillClient;)V
-HSPLandroid/content/ContextWrapper;->setAutofillOptions(Landroid/content/AutofillOptions;)V
-HSPLandroid/content/ContextWrapper;->setContentCaptureOptions(Landroid/content/ContentCaptureOptions;)V
-HSPLandroid/content/ContextWrapper;->setTheme(I)V
-HSPLandroid/content/ContextWrapper;->startActivity(Landroid/content/Intent;)V
-HSPLandroid/content/ContextWrapper;->startForegroundService(Landroid/content/Intent;)Landroid/content/ComponentName;
-HSPLandroid/content/ContextWrapper;->startService(Landroid/content/Intent;)Landroid/content/ComponentName;
-HSPLandroid/content/ContextWrapper;->stopService(Landroid/content/Intent;)Z
-HSPLandroid/content/ContextWrapper;->unbindService(Landroid/content/ServiceConnection;)V
-HSPLandroid/content/ContextWrapper;->unregisterComponentCallbacks(Landroid/content/ComponentCallbacks;)V
-HSPLandroid/content/ContextWrapper;->unregisterReceiver(Landroid/content/BroadcastReceiver;)V
-HSPLandroid/content/ContextWrapper;->updateDeviceId(I)V
-HSPLandroid/content/ContextWrapper;->updateDisplay(I)V
-HSPLandroid/content/IClipboard$Stub$Proxy;->addPrimaryClipChangedListener(Landroid/content/IOnPrimaryClipChangedListener;Ljava/lang/String;Ljava/lang/String;II)V
-HSPLandroid/content/IClipboard$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/IContentService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/content/IContentService$Stub$Proxy;->addPeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;J)V
-HSPLandroid/content/IContentService$Stub$Proxy;->addStatusChangeListener(ILandroid/content/ISyncStatusObserver;)V
-HSPLandroid/content/IContentService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/IContentService$Stub$Proxy;->getIsSyncable(Landroid/accounts/Account;Ljava/lang/String;)I
-HSPLandroid/content/IContentService$Stub$Proxy;->getMasterSyncAutomatically()Z
-HSPLandroid/content/IContentService$Stub$Proxy;->getPeriodicSyncs(Landroid/accounts/Account;Ljava/lang/String;Landroid/content/ComponentName;)Ljava/util/List;
-HSPLandroid/content/IContentService$Stub$Proxy;->getSyncAdapterTypes()[Landroid/content/SyncAdapterType;
-HSPLandroid/content/IContentService$Stub$Proxy;->getSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;)Z
-HSPLandroid/content/IContentService$Stub$Proxy;->notifyChange([Landroid/net/Uri;Landroid/database/IContentObserver;ZIIILjava/lang/String;)V
-HSPLandroid/content/IContentService$Stub$Proxy;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/IContentObserver;II)V
-HSPLandroid/content/IContentService$Stub$Proxy;->removePeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/content/IContentService$Stub$Proxy;->setIsSyncable(Landroid/accounts/Account;Ljava/lang/String;I)V
-HSPLandroid/content/IContentService$Stub$Proxy;->setSyncAutomaticallyAsUser(Landroid/accounts/Account;Ljava/lang/String;ZI)V
-HSPLandroid/content/IContentService$Stub$Proxy;->syncAsUser(Landroid/content/SyncRequest;ILjava/lang/String;)V
-HSPLandroid/content/IContentService$Stub$Proxy;->unregisterContentObserver(Landroid/database/IContentObserver;)V
-HSPLandroid/content/IContentService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IContentService;
-HSPLandroid/content/IIntentReceiver$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/IIntentReceiver$Stub;-><init>()V
-HSPLandroid/content/IIntentReceiver$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/IIntentReceiver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IIntentReceiver;
-HSPLandroid/content/IIntentReceiver$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/content/IIntentSender$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/content/IIntentSender$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/IIntentSender$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IIntentSender;
-HSPLandroid/content/IOnPrimaryClipChangedListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/IRestrictionsManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/content/IRestrictionsManager$Stub$Proxy;->getApplicationRestrictions(Ljava/lang/String;)Landroid/os/Bundle;
-HSPLandroid/content/IRestrictionsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IRestrictionsManager;
-HSPLandroid/content/ISyncAdapter$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/ISyncAdapter$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/content/ISyncContext$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/content/ISyncContext$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/ISyncContext$Stub$Proxy;->onFinished(Landroid/content/SyncResult;)V
-HSPLandroid/content/ISyncContext$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/ISyncContext;
-HSPLandroid/content/ISyncStatusObserver$Stub;-><init>()V
-HSPLandroid/content/ISyncStatusObserver$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/ISyncStatusObserver$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/content/Intent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/Intent;
-HSPLandroid/content/Intent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/Intent$FilterComparison;-><init>(Landroid/content/Intent;)V
-HSPLandroid/content/Intent$FilterComparison;->equals(Ljava/lang/Object;)Z
-HSPLandroid/content/Intent$FilterComparison;->hashCode()I
-HSPLandroid/content/Intent;-><init>()V
-HSPLandroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V
-HSPLandroid/content/Intent;-><init>(Landroid/content/Intent;)V
-HSPLandroid/content/Intent;-><init>(Landroid/content/Intent;I)V
-HSPLandroid/content/Intent;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/Intent;-><init>(Ljava/lang/String;)V
-HSPLandroid/content/Intent;-><init>(Ljava/lang/String;Landroid/net/Uri;)V
-HSPLandroid/content/Intent;-><init>(Ljava/lang/String;Landroid/net/Uri;Landroid/content/Context;Ljava/lang/Class;)V
-HSPLandroid/content/Intent;->addCategory(Ljava/lang/String;)Landroid/content/Intent;+]Ljava/lang/String;Ljava/lang/String;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLandroid/content/Intent;->addFlags(I)Landroid/content/Intent;
-HSPLandroid/content/Intent;->cloneFilter()Landroid/content/Intent;
-HSPLandroid/content/Intent;->filterEquals(Landroid/content/Intent;)Z
-HSPLandroid/content/Intent;->filterHashCode()I
-HSPLandroid/content/Intent;->getAction()Ljava/lang/String;
-HSPLandroid/content/Intent;->getBooleanExtra(Ljava/lang/String;Z)Z
-HSPLandroid/content/Intent;->getBundleExtra(Ljava/lang/String;)Landroid/os/Bundle;
-HSPLandroid/content/Intent;->getByteArrayExtra(Ljava/lang/String;)[B
-HSPLandroid/content/Intent;->getCategories()Ljava/util/Set;
-HSPLandroid/content/Intent;->getClipData()Landroid/content/ClipData;
-HSPLandroid/content/Intent;->getComponent()Landroid/content/ComponentName;
-HSPLandroid/content/Intent;->getData()Landroid/net/Uri;
-HSPLandroid/content/Intent;->getDataString()Ljava/lang/String;
-HSPLandroid/content/Intent;->getExtras()Landroid/os/Bundle;
-HSPLandroid/content/Intent;->getFlags()I
-HSPLandroid/content/Intent;->getIdentifier()Ljava/lang/String;
-HSPLandroid/content/Intent;->getIntArrayExtra(Ljava/lang/String;)[I
-HSPLandroid/content/Intent;->getIntExtra(Ljava/lang/String;I)I
-HSPLandroid/content/Intent;->getLongExtra(Ljava/lang/String;J)J
-HSPLandroid/content/Intent;->getPackage()Ljava/lang/String;
-HSPLandroid/content/Intent;->getParcelableArrayExtra(Ljava/lang/String;)[Landroid/os/Parcelable;
-HSPLandroid/content/Intent;->getParcelableArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;
-HSPLandroid/content/Intent;->getParcelableExtra(Ljava/lang/String;)Landroid/os/Parcelable;
-HSPLandroid/content/Intent;->getParcelableExtra(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;
-HSPLandroid/content/Intent;->getScheme()Ljava/lang/String;
-HSPLandroid/content/Intent;->getSelector()Landroid/content/Intent;
-HSPLandroid/content/Intent;->getSerializableExtra(Ljava/lang/String;)Ljava/io/Serializable;
-HSPLandroid/content/Intent;->getSourceBounds()Landroid/graphics/Rect;
-HSPLandroid/content/Intent;->getStringArrayExtra(Ljava/lang/String;)[Ljava/lang/String;
-HSPLandroid/content/Intent;->getStringArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;
-HSPLandroid/content/Intent;->getStringExtra(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/content/Intent;->getType()Ljava/lang/String;
-HSPLandroid/content/Intent;->hasCategory(Ljava/lang/String;)Z
-HSPLandroid/content/Intent;->hasExtra(Ljava/lang/String;)Z
-HSPLandroid/content/Intent;->hasFileDescriptors()Z
-HSPLandroid/content/Intent;->hasWebURI()Z
-HSPLandroid/content/Intent;->isImageCaptureIntent()Z
-HSPLandroid/content/Intent;->isWebIntent()Z
-HSPLandroid/content/Intent;->makeMainActivity(Landroid/content/ComponentName;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->migrateExtraStreamToClipData(Landroid/content/Context;)Z
-HSPLandroid/content/Intent;->parseIntent(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->parseUri(Ljava/lang/String;I)Landroid/content/Intent;
-HSPLandroid/content/Intent;->parseUriInternal(Ljava/lang/String;I)Landroid/content/Intent;
-HSPLandroid/content/Intent;->prepareToEnterProcess(ILandroid/content/AttributionSource;)V
-HSPLandroid/content/Intent;->prepareToEnterProcess(ZLandroid/content/AttributionSource;)V
-HSPLandroid/content/Intent;->prepareToLeaveProcess(Landroid/content/Context;)V
-HSPLandroid/content/Intent;->prepareToLeaveProcess(Z)V
-HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;I)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;J)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/io/Serializable;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/CharSequence;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;[B)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;[I)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;[J)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;[Landroid/os/Parcelable;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtras(Landroid/content/Intent;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtras(Landroid/os/Bundle;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putParcelableArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putStringArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->readFromParcel(Landroid/os/Parcel;)V+]Ljava/lang/String;Ljava/lang/String;]Landroid/os/Parcelable$Creator;Landroid/net/Uri$1;,Landroid/graphics/Rect$1;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/os/Parcel;Landroid/os/Parcel;]Landroid/content/Intent;Landroid/content/Intent;
-HSPLandroid/content/Intent;->removeCategory(Ljava/lang/String;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLandroid/content/Intent;->removeExtra(Ljava/lang/String;)V
-HSPLandroid/content/Intent;->replaceExtras(Landroid/os/Bundle;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->resolveActivity(Landroid/content/pm/PackageManager;)Landroid/content/ComponentName;
-HSPLandroid/content/Intent;->resolveActivityInfo(Landroid/content/pm/PackageManager;I)Landroid/content/pm/ActivityInfo;
-HSPLandroid/content/Intent;->resolveSystemService(Landroid/content/pm/PackageManager;I)Landroid/content/ComponentName;
-HSPLandroid/content/Intent;->resolveType(Landroid/content/ContentResolver;)Ljava/lang/String;
-HSPLandroid/content/Intent;->resolveTypeIfNeeded(Landroid/content/ContentResolver;)Ljava/lang/String;
-HSPLandroid/content/Intent;->setAction(Ljava/lang/String;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->setAllowFds(Z)V
-HSPLandroid/content/Intent;->setClass(Landroid/content/Context;Ljava/lang/Class;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->setClassName(Landroid/content/Context;Ljava/lang/String;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->setClassName(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->setClipData(Landroid/content/ClipData;)V
-HSPLandroid/content/Intent;->setComponent(Landroid/content/ComponentName;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->setData(Landroid/net/Uri;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->setDataAndType(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->setDefusable(Z)V
-HSPLandroid/content/Intent;->setExtrasClassLoader(Ljava/lang/ClassLoader;)V
-HSPLandroid/content/Intent;->setFlags(I)Landroid/content/Intent;
-HSPLandroid/content/Intent;->setIdentifier(Ljava/lang/String;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->setPackage(Ljava/lang/String;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->setSelector(Landroid/content/Intent;)V
-HSPLandroid/content/Intent;->setSourceBounds(Landroid/graphics/Rect;)V
-HSPLandroid/content/Intent;->setType(Ljava/lang/String;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->toShortString(Ljava/lang/StringBuilder;ZZZZ)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/ComponentName;Landroid/content/ComponentName;
-HSPLandroid/content/Intent;->toString()Ljava/lang/String;
-HSPLandroid/content/Intent;->toString(Ljava/lang/StringBuilder;)V
-HSPLandroid/content/Intent;->toUri(I)Ljava/lang/String;
-HSPLandroid/content/Intent;->toUriFragment(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
-HSPLandroid/content/Intent;->toUriInner(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
-HSPLandroid/content/Intent;->writeToParcel(Landroid/os/Parcel;I)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/IntentFilter$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLandroid/content/IntentFilter$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/IntentFilter;
-HSPLandroid/content/IntentFilter$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/IntentFilter$AuthorityEntry;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/IntentFilter$AuthorityEntry;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/IntentFilter$AuthorityEntry;->getHost()Ljava/lang/String;
-HSPLandroid/content/IntentFilter$AuthorityEntry;->match(Landroid/net/Uri;Z)I
-HSPLandroid/content/IntentFilter$AuthorityEntry;->writeToParcel(Landroid/os/Parcel;)V
-HSPLandroid/content/IntentFilter;-><init>()V
-HSPLandroid/content/IntentFilter;-><init>(Landroid/content/IntentFilter;)V
-HSPLandroid/content/IntentFilter;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/IntentFilter;-><init>(Ljava/lang/String;)V
-HSPLandroid/content/IntentFilter;->actionsIterator()Ljava/util/Iterator;
-HSPLandroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
-HSPLandroid/content/IntentFilter;->addCategory(Ljava/lang/String;)V
-HSPLandroid/content/IntentFilter;->addDataAuthority(Landroid/content/IntentFilter$AuthorityEntry;)V
-HSPLandroid/content/IntentFilter;->addDataAuthority(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/IntentFilter;->addDataPath(Landroid/os/PatternMatcher;)V
-HSPLandroid/content/IntentFilter;->addDataPath(Ljava/lang/String;I)V
-HSPLandroid/content/IntentFilter;->addDataScheme(Ljava/lang/String;)V
-HSPLandroid/content/IntentFilter;->addDataSchemeSpecificPart(Landroid/os/PatternMatcher;)V
-HSPLandroid/content/IntentFilter;->addDataSchemeSpecificPart(Ljava/lang/String;I)V
-HSPLandroid/content/IntentFilter;->addDataType(Ljava/lang/String;)V
-HSPLandroid/content/IntentFilter;->authoritiesIterator()Ljava/util/Iterator;
-HSPLandroid/content/IntentFilter;->categoriesIterator()Ljava/util/Iterator;
-HSPLandroid/content/IntentFilter;->countActions()I
-HSPLandroid/content/IntentFilter;->countCategories()I
-HSPLandroid/content/IntentFilter;->countDataAuthorities()I
-HSPLandroid/content/IntentFilter;->countDataPaths()I
-HSPLandroid/content/IntentFilter;->countDataSchemes()I
-HSPLandroid/content/IntentFilter;->countDataTypes()I
-HSPLandroid/content/IntentFilter;->countMimeGroups()I
-HSPLandroid/content/IntentFilter;->debugCheck()Z
-HSPLandroid/content/IntentFilter;->getAction(I)Ljava/lang/String;
-HSPLandroid/content/IntentFilter;->getAutoVerify()Z
-HSPLandroid/content/IntentFilter;->getCategory(I)Ljava/lang/String;
-HSPLandroid/content/IntentFilter;->getDataScheme(I)Ljava/lang/String;
-HSPLandroid/content/IntentFilter;->getHosts()[Ljava/lang/String;
-HSPLandroid/content/IntentFilter;->getHostsList()Ljava/util/ArrayList;
-HSPLandroid/content/IntentFilter;->getOrder()I
-HSPLandroid/content/IntentFilter;->getPriority()I
-HSPLandroid/content/IntentFilter;->hasAction(Ljava/lang/String;)Z
-HSPLandroid/content/IntentFilter;->hasCategory(Ljava/lang/String;)Z
-HSPLandroid/content/IntentFilter;->isImplicitlyVisibleToInstantApp()Z
-HSPLandroid/content/IntentFilter;->isVisibleToInstantApp()Z
-HSPLandroid/content/IntentFilter;->lambda$addDataType$0(Ljava/lang/String;Ljava/lang/Boolean;)V
-HSPLandroid/content/IntentFilter;->match(Landroid/content/ContentResolver;Landroid/content/Intent;ZLjava/lang/String;)I
-HSPLandroid/content/IntentFilter;->match(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Ljava/util/Set;Ljava/lang/String;)I
-HSPLandroid/content/IntentFilter;->match(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Ljava/util/Set;Ljava/lang/String;ZLjava/util/Collection;Landroid/os/Bundle;)I
-HSPLandroid/content/IntentFilter;->matchAction(Ljava/lang/String;)Z
-HSPLandroid/content/IntentFilter;->matchAction(Ljava/lang/String;ZLjava/util/Collection;)Z
-HSPLandroid/content/IntentFilter;->matchCategories(Ljava/util/Set;)Ljava/lang/String;
-HSPLandroid/content/IntentFilter;->matchData(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)I
-HSPLandroid/content/IntentFilter;->matchData(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Z)I
-HSPLandroid/content/IntentFilter;->matchDataAuthority(Landroid/net/Uri;Z)I
-HSPLandroid/content/IntentFilter;->matchExtras(Landroid/os/Bundle;)Ljava/lang/String;
-HSPLandroid/content/IntentFilter;->processMimeType(Ljava/lang/String;Ljava/util/function/BiConsumer;)V
-HSPLandroid/content/IntentFilter;->schemesIterator()Ljava/util/Iterator;
-HSPLandroid/content/IntentFilter;->setAutoVerify(Z)V
-HSPLandroid/content/IntentFilter;->setOrder(I)V
-HSPLandroid/content/IntentFilter;->setPriority(I)V
-HSPLandroid/content/IntentFilter;->setVisibilityToInstantApp(I)V
-HSPLandroid/content/IntentFilter;->typesIterator()Ljava/util/Iterator;
-HSPLandroid/content/IntentFilter;->writeToParcel(Landroid/os/Parcel;I)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/IntentSender;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/LocusId$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/LocusId;
-HSPLandroid/content/LocusId$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/LocusId;-><init>(Ljava/lang/String;)V
-HSPLandroid/content/LocusId;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/PeriodicSync$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/PeriodicSync;
-HSPLandroid/content/PeriodicSync$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/PeriodicSync;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/PermissionChecker;->checkPermissionForDataDeliveryCommon(Landroid/content/Context;Ljava/lang/String;Landroid/content/AttributionSource;Ljava/lang/String;ZZ)I
-HSPLandroid/content/PermissionChecker;->checkPermissionForDataDeliveryFromDataSource(Landroid/content/Context;Ljava/lang/String;ILandroid/content/AttributionSource;Ljava/lang/String;)I
-HSPLandroid/content/RestrictionsManager;-><init>(Landroid/content/Context;Landroid/content/IRestrictionsManager;)V
-HSPLandroid/content/RestrictionsManager;->getApplicationRestrictions()Landroid/os/Bundle;
-HSPLandroid/content/SearchRecentSuggestionsProvider$DatabaseHelper;-><init>(Landroid/content/Context;I)V
-HSPLandroid/content/SearchRecentSuggestionsProvider;-><init>()V
-HSPLandroid/content/SearchRecentSuggestionsProvider;->onCreate()Z
-HSPLandroid/content/SearchRecentSuggestionsProvider;->setupSuggestions(Ljava/lang/String;I)V
-HSPLandroid/content/ServiceConnection;->onBindingDied(Landroid/content/ComponentName;)V
-HSPLandroid/content/ServiceConnection;->onNullBinding(Landroid/content/ComponentName;)V
-HSPLandroid/content/SyncAdapterType$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/SyncAdapterType;
-HSPLandroid/content/SyncAdapterType$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/SyncAdapterType$1;->newArray(I)[Landroid/content/SyncAdapterType;
-HSPLandroid/content/SyncAdapterType$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/content/SyncAdapterType;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/SyncAdapterType;-><init>(Ljava/lang/String;Ljava/lang/String;ZZZZLjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/SyncAdapterType;->equals(Ljava/lang/Object;)Z
-HSPLandroid/content/SyncAdapterType;->supportsUploading()Z
-HSPLandroid/content/SyncAdaptersCache;->getSyncAdapterPackagesForAuthority(Ljava/lang/String;I)[Ljava/lang/String;
-HSPLandroid/content/SyncContext;-><init>(Landroid/content/ISyncContext;)V
-HSPLandroid/content/SyncContext;->getSyncContextBinder()Landroid/os/IBinder;
-HSPLandroid/content/SyncContext;->onFinished(Landroid/content/SyncResult;)V
-HSPLandroid/content/SyncRequest$Builder;->build()Landroid/content/SyncRequest;
-HSPLandroid/content/SyncRequest$Builder;->setExtras(Landroid/os/Bundle;)Landroid/content/SyncRequest$Builder;
-HSPLandroid/content/SyncRequest$Builder;->setSyncAdapter(Landroid/accounts/Account;Ljava/lang/String;)Landroid/content/SyncRequest$Builder;
-HSPLandroid/content/SyncRequest$Builder;->syncOnce()Landroid/content/SyncRequest$Builder;
-HSPLandroid/content/SyncRequest;-><init>(Landroid/content/SyncRequest$Builder;)V
-HSPLandroid/content/SyncRequest;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/SyncResult;-><init>()V
-HSPLandroid/content/SyncResult;->hasError()Z
-HSPLandroid/content/SyncResult;->hasHardError()Z
-HSPLandroid/content/SyncResult;->hasSoftError()Z
-HSPLandroid/content/SyncResult;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/SyncStats;->toString()Ljava/lang/String;
-HSPLandroid/content/SyncStats;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/UndoManager$UndoState;->addOperation(Landroid/content/UndoOperation;)V
-HSPLandroid/content/UndoManager$UndoState;->destroy()V
-HSPLandroid/content/UndoManager$UndoState;->getLastOperation(Ljava/lang/Class;Landroid/content/UndoOwner;)Landroid/content/UndoOperation;
-HSPLandroid/content/UndoManager$UndoState;->hasMultipleOwners()Z
-HSPLandroid/content/UndoManager$UndoState;->hasOperation(Landroid/content/UndoOwner;)Z
-HSPLandroid/content/UndoManager$UndoState;->writeToParcel(Landroid/os/Parcel;)V
-HSPLandroid/content/UndoManager;->addOperation(Landroid/content/UndoOperation;I)V
-HSPLandroid/content/UndoManager;->beginUpdate(Ljava/lang/CharSequence;)V
-HSPLandroid/content/UndoManager;->commitState(Landroid/content/UndoOwner;)I
-HSPLandroid/content/UndoManager;->endUpdate()V
-HSPLandroid/content/UndoManager;->findPrevState(Ljava/util/ArrayList;[Landroid/content/UndoOwner;I)I
-HSPLandroid/content/UndoManager;->forgetRedos([Landroid/content/UndoOwner;I)I
-HSPLandroid/content/UndoManager;->forgetUndos([Landroid/content/UndoOwner;I)I
-HSPLandroid/content/UndoManager;->getLastOperation(Ljava/lang/Class;Landroid/content/UndoOwner;I)Landroid/content/UndoOperation;
-HSPLandroid/content/UndoManager;->getOwner(Ljava/lang/String;Ljava/lang/Object;)Landroid/content/UndoOwner;
-HSPLandroid/content/UndoManager;->getTopUndo([Landroid/content/UndoOwner;)Landroid/content/UndoManager$UndoState;
-HSPLandroid/content/UndoManager;->isInUndo()Z
-HSPLandroid/content/UndoManager;->matchOwners(Landroid/content/UndoManager$UndoState;[Landroid/content/UndoOwner;)Z
-HSPLandroid/content/UndoManager;->pushWorkingState()V
-HSPLandroid/content/UndoManager;->removeOwner(Landroid/content/UndoOwner;)V
-HSPLandroid/content/UndoManager;->restoreInstanceState(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V
-HSPLandroid/content/UndoManager;->saveInstanceState(Landroid/os/Parcel;)V
-HSPLandroid/content/UndoManager;->saveOwner(Landroid/content/UndoOwner;Landroid/os/Parcel;)V
-HSPLandroid/content/UndoOperation;->allowMerge()Z
-HSPLandroid/content/UndoOperation;->getOwner()Landroid/content/UndoOwner;
-HSPLandroid/content/UndoOperation;->hasData()Z
-HSPLandroid/content/UndoOperation;->matchOwner(Landroid/content/UndoOwner;)Z
-HSPLandroid/content/UndoOwner;-><init>(Ljava/lang/String;Landroid/content/UndoManager;)V
-HSPLandroid/content/UriMatcher;-><init>(I)V
-HSPLandroid/content/UriMatcher;-><init>(ILjava/lang/String;)V
-HSPLandroid/content/UriMatcher;->addURI(Ljava/lang/String;Ljava/lang/String;I)V
-HSPLandroid/content/UriMatcher;->createChild(Ljava/lang/String;)Landroid/content/UriMatcher;
-HSPLandroid/content/UriMatcher;->match(Landroid/net/Uri;)I+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Landroid/net/Uri$PathSegments;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;
-HSPLandroid/content/om/OverlayInfo;->ensureValidState()V
-HSPLandroid/content/om/OverlayInfo;->isEnabled()Z
-HSPLandroid/content/pm/ActivityInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ActivityInfo;
-HSPLandroid/content/pm/ActivityInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/ActivityInfo$1;->newArray(I)[Landroid/content/pm/ActivityInfo;
-HSPLandroid/content/pm/ActivityInfo$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/content/pm/ActivityInfo$WindowLayout;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/ActivityInfo;-><init>(Landroid/os/Parcel;)V+]Lcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;Lcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;]Landroid/os/Parcel;Landroid/os/Parcel;]Ljava/util/Set;Landroid/util/ArraySet;
-HSPLandroid/content/pm/ActivityInfo;->activityInfoConfigNativeToJava(I)I
-HSPLandroid/content/pm/ActivityInfo;->getRealConfigChanged()I
-HSPLandroid/content/pm/ActivityInfo;->getThemeResource()I
-HSPLandroid/content/pm/ActivityInfo;->hasOnBackInvokedCallbackEnabled()Z
-HSPLandroid/content/pm/ActivityInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/ApkChecksum$1;-><init>()V
-HSPLandroid/content/pm/ApkChecksum$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ApkChecksum;
-HSPLandroid/content/pm/ApkChecksum$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/ApkChecksum;-><clinit>()V
-HSPLandroid/content/pm/ApkChecksum;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/ApkChecksum;->getType()I
-HSPLandroid/content/pm/ApkChecksum;->getValue()[B
-HSPLandroid/content/pm/ApplicationInfo$1$$ExternalSyntheticLambda0;-><init>()V
-HSPLandroid/content/pm/ApplicationInfo$1$$ExternalSyntheticLambda0;->readRawParceled(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/ApplicationInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/content/pm/ApplicationInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/ApplicationInfo;-><init>()V
-HSPLandroid/content/pm/ApplicationInfo;-><init>(Landroid/content/pm/ApplicationInfo;)V
-HSPLandroid/content/pm/ApplicationInfo;-><init>(Landroid/os/Parcel;)V+]Lcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;Lcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;Lcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;]Landroid/os/Parcel;Landroid/os/Parcel;]Ljava/util/Set;Ljava/util/Collections$EmptySet;
-HSPLandroid/content/pm/ApplicationInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/ApplicationInfo-IA;)V
-HSPLandroid/content/pm/ApplicationInfo;->getAllApkPaths()[Ljava/lang/String;
-HSPLandroid/content/pm/ApplicationInfo;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;
-HSPLandroid/content/pm/ApplicationInfo;->getBaseCodePath()Ljava/lang/String;
-HSPLandroid/content/pm/ApplicationInfo;->getBaseResourcePath()Ljava/lang/String;
-HSPLandroid/content/pm/ApplicationInfo;->getCodePath()Ljava/lang/String;
-HSPLandroid/content/pm/ApplicationInfo;->getCustomApplicationClassNameForProcess(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/content/pm/ApplicationInfo;->getResourcePath()Ljava/lang/String;
-HSPLandroid/content/pm/ApplicationInfo;->hasRequestedLegacyExternalStorage()Z
-HSPLandroid/content/pm/ApplicationInfo;->hasRtlSupport()Z
-HSPLandroid/content/pm/ApplicationInfo;->initForUser(I)V
-HSPLandroid/content/pm/ApplicationInfo;->isDirectBootAware()Z
-HSPLandroid/content/pm/ApplicationInfo;->isEncryptionAware()Z
-HSPLandroid/content/pm/ApplicationInfo;->isExternal()Z
-HSPLandroid/content/pm/ApplicationInfo;->isInstantApp()Z
-HSPLandroid/content/pm/ApplicationInfo;->isOnBackInvokedCallbackEnabled()Z
-HSPLandroid/content/pm/ApplicationInfo;->isPrivilegedApp()Z
-HSPLandroid/content/pm/ApplicationInfo;->isProduct()Z
-HSPLandroid/content/pm/ApplicationInfo;->isProfileable()Z
-HSPLandroid/content/pm/ApplicationInfo;->isProfileableByShell()Z
-HSPLandroid/content/pm/ApplicationInfo;->isSignedWithPlatformKey()Z
-HSPLandroid/content/pm/ApplicationInfo;->isStaticSharedLibrary()Z
-HSPLandroid/content/pm/ApplicationInfo;->isSystemApp()Z
-HSPLandroid/content/pm/ApplicationInfo;->isSystemExt()Z
-HSPLandroid/content/pm/ApplicationInfo;->isUpdatedSystemApp()Z
-HSPLandroid/content/pm/ApplicationInfo;->isVendor()Z
-HSPLandroid/content/pm/ApplicationInfo;->requestsIsolatedSplitLoading()Z
-HSPLandroid/content/pm/ApplicationInfo;->setBaseCodePath(Ljava/lang/String;)V
-HSPLandroid/content/pm/ApplicationInfo;->setBaseResourcePath(Ljava/lang/String;)V
-HSPLandroid/content/pm/ApplicationInfo;->setCodePath(Ljava/lang/String;)V
-HSPLandroid/content/pm/ApplicationInfo;->setGwpAsanMode(I)V
-HSPLandroid/content/pm/ApplicationInfo;->setResourcePath(Ljava/lang/String;)V
-HSPLandroid/content/pm/ApplicationInfo;->setSplitCodePaths([Ljava/lang/String;)V
-HSPLandroid/content/pm/ApplicationInfo;->setSplitResourcePaths([Ljava/lang/String;)V
-HSPLandroid/content/pm/ApplicationInfo;->setVersionCode(J)V
-HSPLandroid/content/pm/ApplicationInfo;->toString()Ljava/lang/String;
-HSPLandroid/content/pm/ApplicationInfo;->writeToParcel(Landroid/os/Parcel;I)V+]Lcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;Lcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;]Lcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;Lcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;]Landroid/os/Parcel;Landroid/os/Parcel;]Ljava/util/UUID;Ljava/util/UUID;
-HSPLandroid/content/pm/Attribution$1;-><init>()V
-HSPLandroid/content/pm/Attribution;-><clinit>()V
-HSPLandroid/content/pm/BaseParceledListSlice$1;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/content/pm/BaseParceledListSlice;-><init>(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V+]Landroid/content/pm/BaseParceledListSlice;Landroid/content/pm/ParceledListSlice;]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/pm/BaseParceledListSlice;-><init>(Ljava/util/List;)V
-HSPLandroid/content/pm/BaseParceledListSlice;->getList()Ljava/util/List;
-HSPLandroid/content/pm/BaseParceledListSlice;->readCreator(Landroid/os/Parcelable$Creator;Landroid/os/Parcel;Ljava/lang/ClassLoader;)Ljava/lang/Object;
-HSPLandroid/content/pm/BaseParceledListSlice;->readVerifyAndAddElement(Landroid/os/Parcelable$Creator;Landroid/os/Parcel;Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Class;+]Ljava/lang/Object;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList;
-HSPLandroid/content/pm/BaseParceledListSlice;->verifySameType(Ljava/lang/Class;Ljava/lang/Class;)V
-HSPLandroid/content/pm/BaseParceledListSlice;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/Checksum$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/Checksum;
-HSPLandroid/content/pm/Checksum$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/Checksum;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/Checksum;->getType()I
-HSPLandroid/content/pm/Checksum;->getValue()[B
-HSPLandroid/content/pm/ComponentInfo;-><init>()V
-HSPLandroid/content/pm/ComponentInfo;-><init>(Landroid/content/pm/ComponentInfo;)V
-HSPLandroid/content/pm/ComponentInfo;-><init>(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/content/pm/ApplicationInfo$1;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/pm/ComponentInfo;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;
-HSPLandroid/content/pm/ComponentInfo;->getComponentName()Landroid/content/ComponentName;
-HSPLandroid/content/pm/ComponentInfo;->getIconResource()I
-HSPLandroid/content/pm/ComponentInfo;->isEnabled()Z
-HSPLandroid/content/pm/ComponentInfo;->loadUnsafeLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
-HSPLandroid/content/pm/ComponentInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/ConfigurationInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ConfigurationInfo;
-HSPLandroid/content/pm/ConfigurationInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/ConfigurationInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/CrossProfileApps;-><init>(Landroid/content/Context;Landroid/content/pm/ICrossProfileApps;)V
-HSPLandroid/content/pm/CrossProfileApps;->getTargetUserProfiles()Ljava/util/List;
-HSPLandroid/content/pm/FallbackCategoryProvider;->getFallbackCategory(Ljava/lang/String;)I
-HSPLandroid/content/pm/FallbackCategoryProvider;->loadFallbacks()V
-HSPLandroid/content/pm/FeatureFlagsImpl;-><init>()V
-HSPLandroid/content/pm/FeatureFlagsImpl;->relativeReferenceIntentFilters()Z
-HSPLandroid/content/pm/FeatureInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/FeatureInfo;
-HSPLandroid/content/pm/FeatureInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/FeatureInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/Flags;-><clinit>()V
-HSPLandroid/content/pm/Flags;->relativeReferenceIntentFilters()Z+]Landroid/content/pm/FeatureFlags;Landroid/content/pm/FeatureFlagsImpl;
-HSPLandroid/content/pm/ICrossProfileApps$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/pm/ICrossProfileApps$Stub$Proxy;->getTargetUserProfiles(Ljava/lang/String;)Ljava/util/List;
-HSPLandroid/content/pm/ICrossProfileApps$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/ICrossProfileApps;
-HSPLandroid/content/pm/ILauncherApps$Stub$Proxy;->addOnAppsChangedListener(Ljava/lang/String;Landroid/content/pm/IOnAppsChangedListener;)V
-HSPLandroid/content/pm/ILauncherApps$Stub$Proxy;->getShortcutIconFd(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Landroid/os/ParcelFileDescriptor;
-HSPLandroid/content/pm/ILauncherApps$Stub$Proxy;->getShortcuts(Ljava/lang/String;Landroid/content/pm/ShortcutQueryWrapper;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/ILauncherApps$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/ILauncherApps;
-HSPLandroid/content/pm/IOnAppsChangedListener$Stub;-><init>()V
-HSPLandroid/content/pm/IOnAppsChangedListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/pm/IOnAppsChangedListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/content/pm/IOnChecksumsReadyListener$Stub;-><init>()V
-HSPLandroid/content/pm/IOnChecksumsReadyListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/pm/IOnChecksumsReadyListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/content/pm/IPackageInstaller$Stub$Proxy;->getSessionInfo(I)Landroid/content/pm/PackageInstaller$SessionInfo;
-HSPLandroid/content/pm/IPackageInstallerCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy$$ExternalSyntheticLambda1;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->checkPermission(Ljava/lang/String;Ljava/lang/String;I)I
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getActivityInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ActivityInfo;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getApplicationEnabledSetting(Ljava/lang/String;I)I+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/content/pm/IPackageManager$Stub$Proxy;Landroid/content/pm/IPackageManager$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getApplicationInfo(Ljava/lang/String;JI)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getComponentEnabledSetting(Landroid/content/ComponentName;I)I
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getHomeActivities(Ljava/util/List;)Landroid/content/ComponentName;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getInstalledApplications(JI)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getInstalledPackages(JI)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getNameForUid(I)Ljava/lang/String;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getPackageInfo(Ljava/lang/String;JI)Landroid/content/pm/PackageInfo;+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/content/pm/IPackageManager$Stub$Proxy;Landroid/content/pm/IPackageManager$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getPackageInstaller()Landroid/content/pm/IPackageInstaller;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getPackageUid(Ljava/lang/String;JI)I
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getPackagesForUid(I)[Ljava/lang/String;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getPermissionControllerPackageName()Ljava/lang/String;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getProviderInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ProviderInfo;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getReceiverInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ActivityInfo;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getServiceInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ServiceInfo;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getSystemAvailableFeatures()Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getSystemSharedLibraryNames()[Ljava/lang/String;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->hasSystemFeature(Ljava/lang/String;I)Z
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->isInstantApp(Ljava/lang/String;I)Z
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->isPackageSuspendedForUser(Ljava/lang/String;I)Z
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->isProtectedBroadcast(Ljava/lang/String;)Z
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->lambda$notifyDexLoad$1(Landroid/os/Parcel;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->notifyDexLoad(Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;)V
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->notifyPackageUse(Ljava/lang/String;I)V
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->notifyPackagesReplacedReceived([Ljava/lang/String;)V
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->queryIntentActivities(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/content/pm/IPackageManager$Stub$Proxy;Landroid/content/pm/IPackageManager$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->queryIntentContentProviders(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->queryIntentReceivers(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->queryIntentServices(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->requestPackageChecksums(Ljava/lang/String;ZIILjava/util/List;Landroid/content/pm/IOnChecksumsReadyListener;I)V
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->resolveContentProvider(Ljava/lang/String;JI)Landroid/content/pm/ProviderInfo;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ResolveInfo;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->resolveService(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ResolveInfo;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->setComponentEnabledSetting(Landroid/content/ComponentName;IIILjava/lang/String;)V
-HSPLandroid/content/pm/IPackageManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageManager;
-HSPLandroid/content/pm/IPackageManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/content/pm/IShortcutService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/content/pm/IShortcutService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/pm/IShortcutService$Stub$Proxy;->getMaxShortcutCountPerActivity(Ljava/lang/String;I)I
-HSPLandroid/content/pm/IShortcutService$Stub$Proxy;->getShortcuts(Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/IShortcutService$Stub$Proxy;->setDynamicShortcuts(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;I)Z
-HSPLandroid/content/pm/IShortcutService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IShortcutService;
-HSPLandroid/content/pm/IncrementalStatesInfo$1;-><init>()V
-HSPLandroid/content/pm/IncrementalStatesInfo;-><clinit>()V
-HSPLandroid/content/pm/InstallSourceInfo;->getInitiatingPackageName()Ljava/lang/String;
-HSPLandroid/content/pm/InstallSourceInfo;->getInstallingPackageName()Ljava/lang/String;
-HSPLandroid/content/pm/LauncherActivityInfoInternal$1;-><init>()V
-HSPLandroid/content/pm/LauncherActivityInfoInternal;-><clinit>()V
-HSPLandroid/content/pm/LauncherActivityInfoInternal;->getActivityInfo()Landroid/content/pm/ActivityInfo;
-HSPLandroid/content/pm/LauncherApps$1;-><init>(Landroid/content/pm/LauncherApps;)V
-HSPLandroid/content/pm/LauncherApps$1;->onPackageChanged(Landroid/os/UserHandle;Ljava/lang/String;)V
-HSPLandroid/content/pm/LauncherApps$1;->onShortcutChanged(Landroid/os/UserHandle;Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
-HSPLandroid/content/pm/LauncherApps$Callback;-><init>()V
-HSPLandroid/content/pm/LauncherApps$Callback;->onShortcutsChanged(Ljava/lang/String;Ljava/util/List;Landroid/os/UserHandle;)V
-HSPLandroid/content/pm/LauncherApps$CallbackMessageHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/content/pm/LauncherApps$CallbackMessageHandler;->postOnPackageChanged(Ljava/lang/String;Landroid/os/UserHandle;)V
-HSPLandroid/content/pm/LauncherApps$CallbackMessageHandler;->postOnShortcutChanged(Ljava/lang/String;Landroid/os/UserHandle;Ljava/util/List;)V
-HSPLandroid/content/pm/LauncherApps$ShortcutQuery;-><init>()V
-HSPLandroid/content/pm/LauncherApps$ShortcutQuery;->setPackage(Ljava/lang/String;)Landroid/content/pm/LauncherApps$ShortcutQuery;
-HSPLandroid/content/pm/LauncherApps$ShortcutQuery;->setQueryFlags(I)Landroid/content/pm/LauncherApps$ShortcutQuery;
-HSPLandroid/content/pm/LauncherApps;-><init>(Landroid/content/Context;)V
-HSPLandroid/content/pm/LauncherApps;-><init>(Landroid/content/Context;Landroid/content/pm/ILauncherApps;)V
-HSPLandroid/content/pm/LauncherApps;->findCallbackLocked(Landroid/content/pm/LauncherApps$Callback;)I
-HSPLandroid/content/pm/LauncherApps;->getShortcutIconFd(Landroid/content/pm/ShortcutInfo;)Landroid/os/ParcelFileDescriptor;
-HSPLandroid/content/pm/LauncherApps;->getShortcutIconFd(Ljava/lang/String;Ljava/lang/String;I)Landroid/os/ParcelFileDescriptor;
-HSPLandroid/content/pm/LauncherApps;->getShortcuts(Landroid/content/pm/LauncherApps$ShortcutQuery;Landroid/os/UserHandle;)Ljava/util/List;
-HSPLandroid/content/pm/LauncherApps;->logErrorForInvalidProfileAccess(Landroid/os/UserHandle;)V
-HSPLandroid/content/pm/LauncherApps;->maybeUpdateDisabledMessage(Ljava/util/List;)Ljava/util/List;
-HSPLandroid/content/pm/LauncherApps;->registerCallback(Landroid/content/pm/LauncherApps$Callback;)V
-HSPLandroid/content/pm/LauncherApps;->registerCallback(Landroid/content/pm/LauncherApps$Callback;Landroid/os/Handler;)V
-HSPLandroid/content/pm/ModuleInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ModuleInfo;
-HSPLandroid/content/pm/ModuleInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/ModuleInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/ModuleInfo;->getPackageName()Ljava/lang/String;
-HSPLandroid/content/pm/PackageInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageInfo;
-HSPLandroid/content/pm/PackageInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/PackageInfo;-><init>()V
-HSPLandroid/content/pm/PackageInfo;-><init>(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/content/pm/ApplicationInfo$1;,Landroid/content/pm/SigningInfo$1;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/pm/PackageInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/PackageInfo-IA;)V
-HSPLandroid/content/pm/PackageInfo;->composeLongVersionCode(II)J
-HSPLandroid/content/pm/PackageInfo;->getLongVersionCode()J
-HSPLandroid/content/pm/PackageInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/PackageInstaller$SessionCallback;-><init>()V
-HSPLandroid/content/pm/PackageInstaller$SessionCallbackDelegate;-><init>(Landroid/content/pm/PackageInstaller$SessionCallback;Ljava/util/concurrent/Executor;)V
-HSPLandroid/content/pm/PackageInstaller$SessionCallbackDelegate;->onSessionActiveChanged(IZ)V
-HSPLandroid/content/pm/PackageInstaller$SessionCallbackDelegate;->onSessionBadgingChanged(I)V
-HSPLandroid/content/pm/PackageInstaller$SessionCallbackDelegate;->onSessionCreated(I)V
-HSPLandroid/content/pm/PackageInstaller$SessionCallbackDelegate;->onSessionFinished(IZ)V
-HSPLandroid/content/pm/PackageInstaller$SessionCallbackDelegate;->onSessionProgressChanged(IF)V
-HSPLandroid/content/pm/PackageInstaller$SessionInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageInstaller$SessionInfo;
-HSPLandroid/content/pm/PackageInstaller$SessionInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/PackageInstaller$SessionInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PackageInstaller$SessionInfo;->getAppPackageName()Ljava/lang/String;
-HSPLandroid/content/pm/PackageInstaller$SessionInfo;->getInstallerPackageName()Ljava/lang/String;
-HSPLandroid/content/pm/PackageInstaller$SessionInfo;->getSessionId()I
-HSPLandroid/content/pm/PackageInstaller$SessionParams;-><init>(I)V
-HSPLandroid/content/pm/PackageInstaller;-><init>(Landroid/content/pm/IPackageInstaller;Ljava/lang/String;Ljava/lang/String;I)V
-HSPLandroid/content/pm/PackageInstaller;->getSessionInfo(I)Landroid/content/pm/PackageInstaller$SessionInfo;
-HSPLandroid/content/pm/PackageInstaller;->registerSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;Landroid/os/Handler;)V
-HSPLandroid/content/pm/PackageItemInfo;-><init>()V
-HSPLandroid/content/pm/PackageItemInfo;-><init>(Landroid/content/pm/PackageItemInfo;)V
-HSPLandroid/content/pm/PackageItemInfo;-><init>(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/text/TextUtils$1;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/pm/PackageItemInfo;->forceSafeLabels()V
-HSPLandroid/content/pm/PackageItemInfo;->loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/content/pm/PackageItemInfo;->loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;
-HSPLandroid/content/pm/PackageItemInfo;->loadSafeLabel(Landroid/content/pm/PackageManager;FI)Ljava/lang/CharSequence;
-HSPLandroid/content/pm/PackageItemInfo;->loadUnsafeLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;
-HSPLandroid/content/pm/PackageItemInfo;->loadXmlMetaData(Landroid/content/pm/PackageManager;Ljava/lang/String;)Landroid/content/res/XmlResourceParser;
-HSPLandroid/content/pm/PackageItemInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/PackageManager$2;->recompute(Landroid/content/pm/PackageManager$ApplicationInfoQuery;)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/content/pm/PackageManager$2;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/content/pm/PackageManager$3;->recompute(Landroid/content/pm/PackageManager$PackageInfoQuery;)Landroid/content/pm/PackageInfo;
-HSPLandroid/content/pm/PackageManager$3;->recompute(Ljava/lang/Object;)Ljava/lang/Object;+]Landroid/content/pm/PackageManager$3;Landroid/content/pm/PackageManager$3;
-HSPLandroid/content/pm/PackageManager$ApplicationInfoFlags;-><init>(J)V
-HSPLandroid/content/pm/PackageManager$ApplicationInfoFlags;->of(J)Landroid/content/pm/PackageManager$ApplicationInfoFlags;
-HSPLandroid/content/pm/PackageManager$ApplicationInfoQuery;-><init>(Ljava/lang/String;JI)V
-HSPLandroid/content/pm/PackageManager$ApplicationInfoQuery;->equals(Ljava/lang/Object;)Z
-HSPLandroid/content/pm/PackageManager$ApplicationInfoQuery;->hashCode()I
-HSPLandroid/content/pm/PackageManager$ComponentInfoFlags;-><init>(J)V
-HSPLandroid/content/pm/PackageManager$ComponentInfoFlags;->of(J)Landroid/content/pm/PackageManager$ComponentInfoFlags;
-HSPLandroid/content/pm/PackageManager$Flags;-><init>(J)V
-HSPLandroid/content/pm/PackageManager$Flags;->getValue()J
-HSPLandroid/content/pm/PackageManager$NameNotFoundException;-><init>()V
-HSPLandroid/content/pm/PackageManager$NameNotFoundException;-><init>(Ljava/lang/String;)V
-HSPLandroid/content/pm/PackageManager$PackageInfoFlags;-><init>(J)V
-HSPLandroid/content/pm/PackageManager$PackageInfoFlags;->of(J)Landroid/content/pm/PackageManager$PackageInfoFlags;
-HSPLandroid/content/pm/PackageManager$PackageInfoQuery;-><init>(Ljava/lang/String;JI)V
-HSPLandroid/content/pm/PackageManager$PackageInfoQuery;->equals(Ljava/lang/Object;)Z
-HSPLandroid/content/pm/PackageManager$PackageInfoQuery;->hashCode()I
-HSPLandroid/content/pm/PackageManager$Property;-><init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/pm/PackageManager$Property;-><init>(Ljava/lang/String;IZLjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/pm/PackageManager$Property;->toBundle(Landroid/os/Bundle;)Landroid/os/Bundle;
-HSPLandroid/content/pm/PackageManager$ResolveInfoFlags;-><init>(J)V
-HSPLandroid/content/pm/PackageManager$ResolveInfoFlags;->of(J)Landroid/content/pm/PackageManager$ResolveInfoFlags;
-HSPLandroid/content/pm/PackageManager;->-$$Nest$smgetApplicationInfoAsUserUncached(Ljava/lang/String;JI)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/content/pm/PackageManager;->-$$Nest$smgetPackageInfoAsUserUncached(Ljava/lang/String;JI)Landroid/content/pm/PackageInfo;
-HSPLandroid/content/pm/PackageManager;-><init>()V
-HSPLandroid/content/pm/PackageManager;->getApplicationInfoAsUser(Ljava/lang/String;ILandroid/os/UserHandle;)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/content/pm/PackageManager;->getApplicationInfoAsUserCached(Ljava/lang/String;JI)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/content/pm/PackageManager;->getApplicationInfoAsUserUncached(Ljava/lang/String;JI)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/content/pm/PackageManager;->getPackageInfoAsUserCached(Ljava/lang/String;JI)Landroid/content/pm/PackageInfo;
-HSPLandroid/content/pm/PackageManager;->getPackageInfoAsUserUncached(Ljava/lang/String;JI)Landroid/content/pm/PackageInfo;
-HSPLandroid/content/pm/PackageManager;->queryBroadcastReceiversAsUser(Landroid/content/Intent;ILandroid/os/UserHandle;)Ljava/util/List;
-HSPLandroid/content/pm/PackageManager;->queryIntentActivitiesAsUser(Landroid/content/Intent;ILandroid/os/UserHandle;)Ljava/util/List;
-HSPLandroid/content/pm/PackageManager;->queryIntentServicesAsUser(Landroid/content/Intent;ILandroid/os/UserHandle;)Ljava/util/List;
-HSPLandroid/content/pm/PackageParser$Activity$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageParser$Activity;
-HSPLandroid/content/pm/PackageParser$Activity$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/PackageParser$Activity;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PackageParser$ActivityIntentInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PackageParser$ApkLite;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;ZIIIILjava/util/List;Landroid/content/pm/PackageParser$SigningDetails;ZZZZZZZZLjava/lang/String;ZIIII)V
-HSPLandroid/content/pm/PackageParser$Component;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PackageParser$Component;->createIntentsList(Landroid/os/Parcel;)Ljava/util/ArrayList;
-HSPLandroid/content/pm/PackageParser$Component;->getComponentName()Landroid/content/ComponentName;
-HSPLandroid/content/pm/PackageParser$IntentInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PackageParser$Package;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PackageParser$Package;->fixupOwner(Ljava/util/List;)V
-HSPLandroid/content/pm/PackageParser$Package;->getChildPackageNames()Ljava/util/List;
-HSPLandroid/content/pm/PackageParser$Package;->getLongVersionCode()J
-HSPLandroid/content/pm/PackageParser$Package;->internStringArrayList(Ljava/util/List;)V
-HSPLandroid/content/pm/PackageParser$Package;->isExternal()Z
-HSPLandroid/content/pm/PackageParser$Package;->isMatch(I)Z
-HSPLandroid/content/pm/PackageParser$Package;->isPrivileged()Z
-HSPLandroid/content/pm/PackageParser$Package;->isProduct()Z
-HSPLandroid/content/pm/PackageParser$Package;->isSystem()Z
-HSPLandroid/content/pm/PackageParser$Package;->isUpdatedSystemApp()Z
-HSPLandroid/content/pm/PackageParser$Package;->isVendor()Z
-HSPLandroid/content/pm/PackageParser$Package;->setApplicationInfoBaseCodePath(Ljava/lang/String;)V
-HSPLandroid/content/pm/PackageParser$Package;->setApplicationInfoBaseResourcePath(Ljava/lang/String;)V
-HSPLandroid/content/pm/PackageParser$Package;->setApplicationInfoCodePath(Ljava/lang/String;)V
-HSPLandroid/content/pm/PackageParser$Package;->setApplicationInfoResourcePath(Ljava/lang/String;)V
-HSPLandroid/content/pm/PackageParser$Package;->setApplicationInfoSplitCodePaths([Ljava/lang/String;)V
-HSPLandroid/content/pm/PackageParser$Package;->setApplicationInfoSplitResourcePaths([Ljava/lang/String;)V
-HSPLandroid/content/pm/PackageParser$Package;->setApplicationVolumeUuid(Ljava/lang/String;)V
-HSPLandroid/content/pm/PackageParser$Permission$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageParser$Permission;
-HSPLandroid/content/pm/PackageParser$Permission$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/PackageParser$Permission;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PackageParser$Provider$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageParser$Provider;
-HSPLandroid/content/pm/PackageParser$Provider$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/PackageParser$Provider;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PackageParser$Service$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageParser$Service;
-HSPLandroid/content/pm/PackageParser$Service$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/PackageParser$Service;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PackageParser$ServiceIntentInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PackageParser$SigningDetails$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageParser$SigningDetails;
-HSPLandroid/content/pm/PackageParser$SigningDetails$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/PackageParser$SigningDetails;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PackageParser$SigningDetails;->checkCapability(Landroid/content/pm/PackageParser$SigningDetails;I)Z
-HSPLandroid/content/pm/PackageParser$SigningDetails;->hasAncestorOrSelf(Landroid/content/pm/PackageParser$SigningDetails;)Z
-HSPLandroid/content/pm/PackageParser$SigningDetails;->hasCertificate(Landroid/content/pm/Signature;)Z
-HSPLandroid/content/pm/PackageParser$SigningDetails;->hasCertificate(Landroid/content/pm/Signature;I)Z
-HSPLandroid/content/pm/PackageParser$SigningDetails;->hasCertificateInternal(Landroid/content/pm/Signature;I)Z
-HSPLandroid/content/pm/PackageParser$SigningDetails;->hasPastSigningCertificates()Z
-HSPLandroid/content/pm/PackageParser;-><init>()V
-HSPLandroid/content/pm/PackageParser;->checkRequiredSystemProperties(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLandroid/content/pm/PackageParser;->generatePermissionInfo(Landroid/content/pm/PackageParser$Permission;I)Landroid/content/pm/PermissionInfo;
-HSPLandroid/content/pm/PackageParser;->isApkFile(Ljava/io/File;)Z
-HSPLandroid/content/pm/PackageParser;->isApkPath(Ljava/lang/String;)Z
-HSPLandroid/content/pm/PackageParser;->parsePackage(Ljava/io/File;IZ)Landroid/content/pm/PackageParser$Package;
-HSPLandroid/content/pm/PackageParser;->setCacheDir(Ljava/io/File;)V
-HSPLandroid/content/pm/PackageParser;->setCallback(Landroid/content/pm/PackageParser$Callback;)V
-HSPLandroid/content/pm/PackageParser;->setDisplayMetrics(Landroid/util/DisplayMetrics;)V
-HSPLandroid/content/pm/PackageParser;->setOnlyCoreApps(Z)V
-HSPLandroid/content/pm/PackageParser;->setSeparateProcesses([Ljava/lang/String;)V
-HSPLandroid/content/pm/PackageParser;->toSigningKeys([Landroid/content/pm/Signature;)Landroid/util/ArraySet;
-HSPLandroid/content/pm/PackageParser;->validateName(Ljava/lang/String;ZZ)Ljava/lang/String;
-HSPLandroid/content/pm/PackageParserCacheHelper$ReadHelper;->readString(Landroid/os/Parcel;)Ljava/lang/String;
-HSPLandroid/content/pm/PackageStats;-><init>(Ljava/lang/String;)V
-HSPLandroid/content/pm/ParceledListSlice$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/ParceledListSlice$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/ParceledListSlice$1;->createFromParcel(Landroid/os/Parcel;Ljava/lang/ClassLoader;)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/ParceledListSlice$1;->createFromParcel(Landroid/os/Parcel;Ljava/lang/ClassLoader;)Ljava/lang/Object;
-HSPLandroid/content/pm/ParceledListSlice;-><init>(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V
-HSPLandroid/content/pm/ParceledListSlice;-><init>(Landroid/os/Parcel;Ljava/lang/ClassLoader;Landroid/content/pm/ParceledListSlice-IA;)V
-HSPLandroid/content/pm/ParceledListSlice;-><init>(Ljava/util/List;)V
-HSPLandroid/content/pm/ParceledListSlice;->getList()Ljava/util/List;
-HSPLandroid/content/pm/ParceledListSlice;->readParcelableCreator(Landroid/os/Parcel;Ljava/lang/ClassLoader;)Landroid/os/Parcelable$Creator;
-HSPLandroid/content/pm/ParceledListSlice;->setInlineCountLimit(I)V
-HSPLandroid/content/pm/ParceledListSlice;->writeElement(Landroid/os/Parcelable;Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/ParceledListSlice;->writeElement(Ljava/lang/Object;Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/ParceledListSlice;->writeParcelableCreator(Landroid/os/Parcelable;Landroid/os/Parcel;)V
-HSPLandroid/content/pm/ParceledListSlice;->writeParcelableCreator(Ljava/lang/Object;Landroid/os/Parcel;)V
-HSPLandroid/content/pm/ParceledListSlice;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/PathPermission$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PathPermission;
-HSPLandroid/content/pm/PathPermission$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/PathPermission$1;->newArray(I)[Landroid/content/pm/PathPermission;
-HSPLandroid/content/pm/PathPermission$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/content/pm/PathPermission;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PathPermission;->getReadPermission()Ljava/lang/String;
-HSPLandroid/content/pm/PathPermission;->getWritePermission()Ljava/lang/String;
-HSPLandroid/content/pm/PathPermission;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/PermissionInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PermissionInfo;
-HSPLandroid/content/pm/PermissionInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/PermissionInfo$1;->newArray(I)[Landroid/content/pm/PermissionInfo;
-HSPLandroid/content/pm/PermissionInfo$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/content/pm/PermissionInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PermissionInfo;->fixProtectionLevel(I)I
-HSPLandroid/content/pm/PermissionInfo;->getProtection()I
-HSPLandroid/content/pm/PermissionInfo;->getProtectionFlags()I
-HSPLandroid/content/pm/PermissionInfo;->isAppOp()Z
-HSPLandroid/content/pm/PermissionInfo;->isHardRestricted()Z
-HSPLandroid/content/pm/PermissionInfo;->isRestricted()Z
-HSPLandroid/content/pm/PermissionInfo;->isRuntime()Z
-HSPLandroid/content/pm/PermissionInfo;->isSoftRestricted()Z
-HSPLandroid/content/pm/ProviderInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ProviderInfo;
-HSPLandroid/content/pm/ProviderInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/ProviderInfo$1;->newArray(I)[Landroid/content/pm/ProviderInfo;
-HSPLandroid/content/pm/ProviderInfo$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/content/pm/ProviderInfo;-><init>()V
-HSPLandroid/content/pm/ProviderInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/ProviderInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/ProviderInfoList$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ProviderInfoList;
-HSPLandroid/content/pm/ProviderInfoList$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/ProviderInfoList;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/ProviderInfoList;-><init>(Landroid/os/Parcel;Landroid/content/pm/ProviderInfoList-IA;)V
-HSPLandroid/content/pm/ProviderInfoList;->getList()Ljava/util/List;
-HSPLandroid/content/pm/RegisteredServicesCache;->containsType(Ljava/util/ArrayList;Ljava/lang/Object;)Z
-HSPLandroid/content/pm/ResolveInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ResolveInfo;
-HSPLandroid/content/pm/ResolveInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/ResolveInfo;-><init>()V
-HSPLandroid/content/pm/ResolveInfo;-><init>(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/content/pm/ServiceInfo$1;,Landroid/content/pm/ActivityInfo$1;,Landroid/text/TextUtils$1;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/pm/ResolveInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/ResolveInfo-IA;)V
-HSPLandroid/content/pm/ResolveInfo;->getComponentInfo()Landroid/content/pm/ComponentInfo;
-HSPLandroid/content/pm/ResolveInfo;->loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/content/pm/ResolveInfo;->loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;
-HSPLandroid/content/pm/ResolveInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/ServiceInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ServiceInfo;
-HSPLandroid/content/pm/ServiceInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/ServiceInfo$1;->newArray(I)[Landroid/content/pm/ServiceInfo;
-HSPLandroid/content/pm/ServiceInfo$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/content/pm/ServiceInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/ServiceInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/SharedLibraryInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/SharedLibraryInfo;
-HSPLandroid/content/pm/SharedLibraryInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/content/pm/SharedLibraryInfo$1;Landroid/content/pm/SharedLibraryInfo$1;
-HSPLandroid/content/pm/SharedLibraryInfo;-><init>(Landroid/os/Parcel;)V+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/pm/SharedLibraryInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/SharedLibraryInfo-IA;)V
-HSPLandroid/content/pm/SharedLibraryInfo;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;JILandroid/content/pm/VersionedPackage;Ljava/util/List;Ljava/util/List;Z)V
-HSPLandroid/content/pm/SharedLibraryInfo;->addDependency(Landroid/content/pm/SharedLibraryInfo;)V
-HSPLandroid/content/pm/SharedLibraryInfo;->getAllCodePaths()Ljava/util/List;
-HSPLandroid/content/pm/SharedLibraryInfo;->getDependencies()Ljava/util/List;
-HSPLandroid/content/pm/SharedLibraryInfo;->getName()Ljava/lang/String;
-HSPLandroid/content/pm/SharedLibraryInfo;->getPath()Ljava/lang/String;
-HSPLandroid/content/pm/SharedLibraryInfo;->isNative()Z
-HSPLandroid/content/pm/SharedLibraryInfo;->isSdk()Z
-HSPLandroid/content/pm/SharedLibraryInfo;->writeToParcel(Landroid/os/Parcel;I)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/pm/ShortcutInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ShortcutInfo;
-HSPLandroid/content/pm/ShortcutInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/ShortcutInfo$Builder;-><init>(Landroid/content/Context;Ljava/lang/String;)V
-HSPLandroid/content/pm/ShortcutInfo$Builder;->build()Landroid/content/pm/ShortcutInfo;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->setCategories(Ljava/util/Set;)Landroid/content/pm/ShortcutInfo$Builder;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->setIcon(Landroid/graphics/drawable/Icon;)Landroid/content/pm/ShortcutInfo$Builder;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->setIntent(Landroid/content/Intent;)Landroid/content/pm/ShortcutInfo$Builder;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->setIntents([Landroid/content/Intent;)Landroid/content/pm/ShortcutInfo$Builder;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->setLongLabel(Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->setLongLived(Z)Landroid/content/pm/ShortcutInfo$Builder;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->setRank(I)Landroid/content/pm/ShortcutInfo$Builder;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->setShortLabel(Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder;
-HSPLandroid/content/pm/ShortcutInfo;-><init>(Landroid/content/pm/ShortcutInfo$Builder;)V+]Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;
-HSPLandroid/content/pm/ShortcutInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/ShortcutInfo;->addFlags(I)V
-HSPLandroid/content/pm/ShortcutInfo;->cloneCapabilityBindings(Ljava/util/Map;)Ljava/util/Map;
-HSPLandroid/content/pm/ShortcutInfo;->cloneCategories(Ljava/util/Set;)Landroid/util/ArraySet;
-HSPLandroid/content/pm/ShortcutInfo;->cloneIntents([Landroid/content/Intent;)[Landroid/content/Intent;
-HSPLandroid/content/pm/ShortcutInfo;->clonePersons([Landroid/app/Person;)[Landroid/app/Person;
-HSPLandroid/content/pm/ShortcutInfo;->fixUpIntentExtras()V
-HSPLandroid/content/pm/ShortcutInfo;->getActivity()Landroid/content/ComponentName;
-HSPLandroid/content/pm/ShortcutInfo;->getCategories()Ljava/util/Set;
-HSPLandroid/content/pm/ShortcutInfo;->getDisabledMessage()Ljava/lang/CharSequence;
-HSPLandroid/content/pm/ShortcutInfo;->getDisabledReasonForRestoreIssue(Landroid/content/Context;I)Ljava/lang/String;
-HSPLandroid/content/pm/ShortcutInfo;->getExtras()Landroid/os/PersistableBundle;
-HSPLandroid/content/pm/ShortcutInfo;->getIconResourceId()I
-HSPLandroid/content/pm/ShortcutInfo;->getId()Ljava/lang/String;
-HSPLandroid/content/pm/ShortcutInfo;->getLastChangedTimestamp()J
-HSPLandroid/content/pm/ShortcutInfo;->getLongLabel()Ljava/lang/CharSequence;
-HSPLandroid/content/pm/ShortcutInfo;->getPackage()Ljava/lang/String;
-HSPLandroid/content/pm/ShortcutInfo;->getPersons()[Landroid/app/Person;
-HSPLandroid/content/pm/ShortcutInfo;->getRank()I
-HSPLandroid/content/pm/ShortcutInfo;->getShortLabel()Ljava/lang/CharSequence;
-HSPLandroid/content/pm/ShortcutInfo;->getUserHandle()Landroid/os/UserHandle;
-HSPLandroid/content/pm/ShortcutInfo;->hasFlags(I)Z
-HSPLandroid/content/pm/ShortcutInfo;->hasIconFile()Z
-HSPLandroid/content/pm/ShortcutInfo;->hasIconResource()Z
-HSPLandroid/content/pm/ShortcutInfo;->hasIconUri()Z
-HSPLandroid/content/pm/ShortcutInfo;->hasKeyFieldsOnly()Z
-HSPLandroid/content/pm/ShortcutInfo;->isCached()Z
-HSPLandroid/content/pm/ShortcutInfo;->isDeclaredInManifest()Z
-HSPLandroid/content/pm/ShortcutInfo;->isDynamic()Z
-HSPLandroid/content/pm/ShortcutInfo;->isEnabled()Z
-HSPLandroid/content/pm/ShortcutInfo;->isPinned()Z
-HSPLandroid/content/pm/ShortcutInfo;->setIntentExtras(Landroid/content/Intent;Landroid/os/PersistableBundle;)Landroid/content/Intent;
-HSPLandroid/content/pm/ShortcutInfo;->updateTimestamp()V
-HSPLandroid/content/pm/ShortcutInfo;->validateIcon(Landroid/graphics/drawable/Icon;)Landroid/graphics/drawable/Icon;
-HSPLandroid/content/pm/ShortcutInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/ShortcutManager;-><init>(Landroid/content/Context;Landroid/content/pm/IShortcutService;)V
-HSPLandroid/content/pm/ShortcutManager;->addDynamicShortcuts(Ljava/util/List;)Z
-HSPLandroid/content/pm/ShortcutManager;->getDynamicShortcuts()Ljava/util/List;
-HSPLandroid/content/pm/ShortcutManager;->getFutureOrThrow(Lcom/android/internal/infra/AndroidFuture;)Ljava/lang/Object;
-HSPLandroid/content/pm/ShortcutManager;->getManifestShortcuts()Ljava/util/List;
-HSPLandroid/content/pm/ShortcutManager;->getMaxShortcutCountPerActivity()I
-HSPLandroid/content/pm/ShortcutManager;->getPinnedShortcuts()Ljava/util/List;
-HSPLandroid/content/pm/ShortcutManager;->injectMyUserId()I
-HSPLandroid/content/pm/ShortcutManager;->setDynamicShortcuts(Ljava/util/List;)Z
-HSPLandroid/content/pm/ShortcutManager;->updateShortcuts(Ljava/util/List;)Z
-HSPLandroid/content/pm/ShortcutQueryWrapper;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/Signature$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/Signature;
-HSPLandroid/content/pm/Signature$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/Signature$1;->newArray(I)[Landroid/content/pm/Signature;
-HSPLandroid/content/pm/Signature$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/content/pm/Signature;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/Signature;-><init>(Landroid/os/Parcel;Landroid/content/pm/Signature-IA;)V
-HSPLandroid/content/pm/Signature;-><init>(Ljava/lang/String;)V
-HSPLandroid/content/pm/Signature;-><init>([B)V
-HSPLandroid/content/pm/Signature;->equals(Ljava/lang/Object;)Z
-HSPLandroid/content/pm/Signature;->hashCode()I
-HSPLandroid/content/pm/Signature;->parseHexDigit(I)I
-HSPLandroid/content/pm/Signature;->toByteArray()[B
-HSPLandroid/content/pm/Signature;->toChars()[C
-HSPLandroid/content/pm/Signature;->toChars([C[I)[C
-HSPLandroid/content/pm/Signature;->toCharsString()Ljava/lang/String;
-HSPLandroid/content/pm/SigningDetails$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/SigningDetails;
-HSPLandroid/content/pm/SigningDetails$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/SigningDetails;-><init>(Landroid/os/Parcel;)V+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/pm/SigningDetails;->getSignatures()[Landroid/content/pm/Signature;
-HSPLandroid/content/pm/SigningInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/SigningInfo;
-HSPLandroid/content/pm/SigningInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/SigningInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/SigningInfo;->getApkContentsSigners()[Landroid/content/pm/Signature;
-HSPLandroid/content/pm/SigningInfo;->getSigningCertificateHistory()[Landroid/content/pm/Signature;
-HSPLandroid/content/pm/SigningInfo;->hasMultipleSigners()Z
-HSPLandroid/content/pm/SigningInfo;->hasPastSigningCertificates()Z
-HSPLandroid/content/pm/StringParceledListSlice$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/StringParceledListSlice;
-HSPLandroid/content/pm/StringParceledListSlice$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/StringParceledListSlice;->getList()Ljava/util/List;
-HSPLandroid/content/pm/UserInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/UserInfo;
-HSPLandroid/content/pm/UserInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/UserInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/UserInfo;->getUserHandle()Landroid/os/UserHandle;
-HSPLandroid/content/pm/UserInfo;->isAdmin()Z
-HSPLandroid/content/pm/UserInfo;->isEnabled()Z
-HSPLandroid/content/pm/UserInfo;->isGuest()Z
-HSPLandroid/content/pm/UserInfo;->isManagedProfile()Z
-HSPLandroid/content/pm/UserInfo;->isPrimary()Z
-HSPLandroid/content/pm/UserInfo;->isProfile()Z
-HSPLandroid/content/pm/UserInfo;->isQuietModeEnabled()Z
-HSPLandroid/content/pm/UserInfo;->isRestricted()Z
-HSPLandroid/content/pm/UserInfo;->supportsSwitchTo()Z
-HSPLandroid/content/pm/UserInfo;->supportsSwitchToByUser()Z
-HSPLandroid/content/pm/UserPackage;-><clinit>()V
-HSPLandroid/content/pm/UserPackage;-><init>(ILjava/lang/String;)V
-HSPLandroid/content/pm/UserPackage;->equals(Ljava/lang/Object;)Z
-HSPLandroid/content/pm/UserPackage;->hashCode()I
-HSPLandroid/content/pm/UserPackage;->of(ILjava/lang/String;)Landroid/content/pm/UserPackage;
-HSPLandroid/content/pm/UserProperties;->isPresent(J)Z
-HSPLandroid/content/pm/VersionedPackage$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/VersionedPackage;
-HSPLandroid/content/pm/VersionedPackage$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/content/pm/VersionedPackage$1;Landroid/content/pm/VersionedPackage$1;
-HSPLandroid/content/pm/VersionedPackage;-><init>(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/content/pm/VersionedPackage;-><init>(Landroid/os/Parcel;Landroid/content/pm/VersionedPackage-IA;)V
-HSPLandroid/content/pm/VersionedPackage;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/dex/ArtManager;->getCurrentProfilePath(Ljava/lang/String;ILjava/lang/String;)Ljava/lang/String;
-HSPLandroid/content/pm/dex/ArtManager;->getProfileName(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/content/pm/dex/ArtManager;->getReferenceProfilePath(Ljava/lang/String;ILjava/lang/String;)Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ApkLiteParseUtils;->parseApkLite(Landroid/content/pm/parsing/result/ParseInput;Ljava/io/File;I)Landroid/content/pm/parsing/result/ParseResult;
-HSPLandroid/content/pm/parsing/ApkLiteParseUtils;->parseApkLiteInner(Landroid/content/pm/parsing/result/ParseInput;Ljava/io/File;Ljava/io/FileDescriptor;Ljava/lang/String;I)Landroid/content/pm/parsing/result/ParseResult;
-HSPLandroid/content/pm/parsing/ApkLiteParseUtils;->parseMonolithicPackageLite(Landroid/content/pm/parsing/result/ParseInput;Ljava/io/File;I)Landroid/content/pm/parsing/result/ParseResult;
-HSPLandroid/content/pm/parsing/result/ParseTypeImpl;-><init>(Landroid/content/pm/parsing/result/ParseInput$Callback;)V
-HSPLandroid/content/pm/parsing/result/ParseTypeImpl;->enableDeferredError(Ljava/lang/String;I)Landroid/content/pm/parsing/result/ParseResult;
-HSPLandroid/content/pm/parsing/result/ParseTypeImpl;->getResult()Ljava/lang/Object;
-HSPLandroid/content/pm/parsing/result/ParseTypeImpl;->isError()Z
-HSPLandroid/content/pm/parsing/result/ParseTypeImpl;->isSuccess()Z
-HSPLandroid/content/pm/parsing/result/ParseTypeImpl;->reset()Landroid/content/pm/parsing/result/ParseInput;
-HSPLandroid/content/pm/parsing/result/ParseTypeImpl;->success(Ljava/lang/Object;)Landroid/content/pm/parsing/result/ParseResult;
-HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/permission/SplitPermissionInfoParcelable;
-HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable;-><init>(Ljava/lang/String;Ljava/util/List;I)V
-HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable;->getNewPermissions()Ljava/util/List;
-HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable;->getSplitPermission()Ljava/lang/String;
-HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable;->getTargetSdk()I
-HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable;->onConstructed()V
-HSPLandroid/content/pm/split/SplitDependencyLoader;-><init>(Landroid/util/SparseArray;)V
-HSPLandroid/content/pm/split/SplitDependencyLoader;->collectConfigSplitIndices(I)[I
-HSPLandroid/content/pm/split/SplitDependencyLoader;->loadDependenciesForSplit(I)V
-HSPLandroid/content/res/ApkAssets;-><init>(ILjava/lang/String;ILandroid/content/res/loader/AssetsProvider;)V
-HSPLandroid/content/res/ApkAssets;->close()V
-HSPLandroid/content/res/ApkAssets;->definesOverlayable()Z
-HSPLandroid/content/res/ApkAssets;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
-HSPLandroid/content/res/ApkAssets;->finalize()V
-HSPLandroid/content/res/ApkAssets;->getAssetPath()Ljava/lang/String;
-HSPLandroid/content/res/ApkAssets;->getDebugName()Ljava/lang/String;
-HSPLandroid/content/res/ApkAssets;->getStringFromPool(I)Ljava/lang/CharSequence;+]Landroid/content/res/StringBlock;Landroid/content/res/StringBlock;
-HSPLandroid/content/res/ApkAssets;->isUpToDate()Z
-HSPLandroid/content/res/ApkAssets;->loadFromPath(Ljava/lang/String;)Landroid/content/res/ApkAssets;
-HSPLandroid/content/res/ApkAssets;->loadFromPath(Ljava/lang/String;I)Landroid/content/res/ApkAssets;
-HSPLandroid/content/res/ApkAssets;->loadOverlayFromPath(Ljava/lang/String;I)Landroid/content/res/ApkAssets;
-HSPLandroid/content/res/ApkAssets;->openXml(Ljava/lang/String;)Landroid/content/res/XmlResourceParser;
-HSPLandroid/content/res/AssetFileDescriptor$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/res/AssetFileDescriptor$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/res/AssetFileDescriptor$AutoCloseInputStream;->read([BII)I
-HSPLandroid/content/res/AssetFileDescriptor;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/res/AssetFileDescriptor;-><init>(Landroid/os/ParcelFileDescriptor;JJ)V
-HSPLandroid/content/res/AssetFileDescriptor;-><init>(Landroid/os/ParcelFileDescriptor;JJLandroid/os/Bundle;)V
-HSPLandroid/content/res/AssetFileDescriptor;->close()V
-HSPLandroid/content/res/AssetFileDescriptor;->createInputStream()Ljava/io/FileInputStream;
-HSPLandroid/content/res/AssetFileDescriptor;->getDeclaredLength()J
-HSPLandroid/content/res/AssetFileDescriptor;->getExtras()Landroid/os/Bundle;
-HSPLandroid/content/res/AssetFileDescriptor;->getFileDescriptor()Ljava/io/FileDescriptor;
-HSPLandroid/content/res/AssetFileDescriptor;->getLength()J
-HSPLandroid/content/res/AssetFileDescriptor;->getParcelFileDescriptor()Landroid/os/ParcelFileDescriptor;
-HSPLandroid/content/res/AssetFileDescriptor;->getStartOffset()J
-HSPLandroid/content/res/AssetFileDescriptor;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/res/AssetManager$AssetInputStream;-><init>(Landroid/content/res/AssetManager;J)V
-HSPLandroid/content/res/AssetManager$AssetInputStream;-><init>(Landroid/content/res/AssetManager;JLandroid/content/res/AssetManager$AssetInputStream-IA;)V
-HSPLandroid/content/res/AssetManager$AssetInputStream;->available()I
-HSPLandroid/content/res/AssetManager$AssetInputStream;->close()V
-HSPLandroid/content/res/AssetManager$AssetInputStream;->ensureOpen()V
-HSPLandroid/content/res/AssetManager$AssetInputStream;->finalize()V
-HSPLandroid/content/res/AssetManager$AssetInputStream;->getNativeAsset()J
-HSPLandroid/content/res/AssetManager$AssetInputStream;->mark(I)V
-HSPLandroid/content/res/AssetManager$AssetInputStream;->markSupported()Z
-HSPLandroid/content/res/AssetManager$AssetInputStream;->read()I
-HSPLandroid/content/res/AssetManager$AssetInputStream;->read([B)I
-HSPLandroid/content/res/AssetManager$AssetInputStream;->read([BII)I
-HSPLandroid/content/res/AssetManager$Builder;-><init>()V
-HSPLandroid/content/res/AssetManager$Builder;->addApkAssets(Landroid/content/res/ApkAssets;)Landroid/content/res/AssetManager$Builder;
-HSPLandroid/content/res/AssetManager$Builder;->build()Landroid/content/res/AssetManager;+]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/content/res/AssetManager;->-$$Nest$fgetmObject(Landroid/content/res/AssetManager;)J
-HSPLandroid/content/res/AssetManager;->-$$Nest$fputmApkAssets(Landroid/content/res/AssetManager;[Landroid/content/res/ApkAssets;)V
-HSPLandroid/content/res/AssetManager;->-$$Nest$fputmLoaders(Landroid/content/res/AssetManager;[Landroid/content/res/loader/ResourcesLoader;)V
-HSPLandroid/content/res/AssetManager;->-$$Nest$mdecRefsLocked(Landroid/content/res/AssetManager;J)V
-HSPLandroid/content/res/AssetManager;->-$$Nest$smnativeAssetDestroy(J)V
-HSPLandroid/content/res/AssetManager;->-$$Nest$smnativeAssetGetLength(J)J
-HSPLandroid/content/res/AssetManager;->-$$Nest$smnativeAssetGetRemainingLength(J)J
-HSPLandroid/content/res/AssetManager;->-$$Nest$smnativeAssetRead(J[BII)I
-HSPLandroid/content/res/AssetManager;-><init>()V
-HSPLandroid/content/res/AssetManager;-><init>(Z)V
-HSPLandroid/content/res/AssetManager;-><init>(ZLandroid/content/res/AssetManager-IA;)V
-HSPLandroid/content/res/AssetManager;->addAssetPathInternal(Ljava/lang/String;ZZ)I
-HSPLandroid/content/res/AssetManager;->applyStyle(JIILandroid/content/res/XmlBlock$Parser;[IJJ)V
-HSPLandroid/content/res/AssetManager;->applyStyleToTheme(JIZ)V
-HSPLandroid/content/res/AssetManager;->close()V
-HSPLandroid/content/res/AssetManager;->containsAllocatedTable()Z
-HSPLandroid/content/res/AssetManager;->createSystemAssetsInZygoteLocked(ZLjava/lang/String;)V
-HSPLandroid/content/res/AssetManager;->createTheme()J
-HSPLandroid/content/res/AssetManager;->decRefsLocked(J)V
-HSPLandroid/content/res/AssetManager;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
-HSPLandroid/content/res/AssetManager;->ensureOpenLocked()V
-HSPLandroid/content/res/AssetManager;->ensureValidLocked()V
-HSPLandroid/content/res/AssetManager;->finalize()V
-HSPLandroid/content/res/AssetManager;->findCookieForPath(Ljava/lang/String;)I
-HSPLandroid/content/res/AssetManager;->getApkAssets()[Landroid/content/res/ApkAssets;
-HSPLandroid/content/res/AssetManager;->getAssignedPackageIdentifiers()Landroid/util/SparseArray;
-HSPLandroid/content/res/AssetManager;->getAssignedPackageIdentifiers(ZZ)Landroid/util/SparseArray;
-HSPLandroid/content/res/AssetManager;->getLoaders()Ljava/util/List;
-HSPLandroid/content/res/AssetManager;->getLocales()[Ljava/lang/String;
-HSPLandroid/content/res/AssetManager;->getNonSystemLocales()[Ljava/lang/String;
-HSPLandroid/content/res/AssetManager;->getParentThemeIdentifier(I)I
-HSPLandroid/content/res/AssetManager;->getPooledStringForCookie(II)Ljava/lang/CharSequence;+]Landroid/content/res/ApkAssets;Landroid/content/res/ApkAssets;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;
-HSPLandroid/content/res/AssetManager;->getResourceArray(I[I)I
-HSPLandroid/content/res/AssetManager;->getResourceArraySize(I)I
-HSPLandroid/content/res/AssetManager;->getResourceBagText(II)Ljava/lang/CharSequence;
-HSPLandroid/content/res/AssetManager;->getResourceEntryName(I)Ljava/lang/String;
-HSPLandroid/content/res/AssetManager;->getResourceIdentifier(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/content/res/AssetManager;->getResourceIntArray(I)[I
-HSPLandroid/content/res/AssetManager;->getResourceName(I)Ljava/lang/String;
-HSPLandroid/content/res/AssetManager;->getResourcePackageName(I)Ljava/lang/String;
-HSPLandroid/content/res/AssetManager;->getResourceStringArray(I)[Ljava/lang/String;
-HSPLandroid/content/res/AssetManager;->getResourceText(I)Ljava/lang/CharSequence;
-HSPLandroid/content/res/AssetManager;->getResourceTextArray(I)[Ljava/lang/CharSequence;
-HSPLandroid/content/res/AssetManager;->getResourceTypeName(I)Ljava/lang/String;
-HSPLandroid/content/res/AssetManager;->getResourceValue(IILandroid/util/TypedValue;Z)Z+]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;
-HSPLandroid/content/res/AssetManager;->getSizeConfigurations()[Landroid/content/res/Configuration;
-HSPLandroid/content/res/AssetManager;->getSystem()Landroid/content/res/AssetManager;
-HSPLandroid/content/res/AssetManager;->getThemeValue(JILandroid/util/TypedValue;Z)Z
-HSPLandroid/content/res/AssetManager;->incRefsLocked(J)V
-HSPLandroid/content/res/AssetManager;->isUpToDate()Z
-HSPLandroid/content/res/AssetManager;->list(Ljava/lang/String;)[Ljava/lang/String;
-HSPLandroid/content/res/AssetManager;->open(Ljava/lang/String;)Ljava/io/InputStream;
-HSPLandroid/content/res/AssetManager;->open(Ljava/lang/String;I)Ljava/io/InputStream;
-HSPLandroid/content/res/AssetManager;->openFd(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/res/AssetManager;->openNonAsset(ILjava/lang/String;I)Ljava/io/InputStream;
-HSPLandroid/content/res/AssetManager;->openNonAssetFd(ILjava/lang/String;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/res/AssetManager;->openNonAssetFd(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/res/AssetManager;->openXmlBlockAsset(ILjava/lang/String;)Landroid/content/res/XmlBlock;+]Ljava/lang/Object;Landroid/content/res/XmlBlock;
-HSPLandroid/content/res/AssetManager;->openXmlResourceParser(ILjava/lang/String;)Landroid/content/res/XmlResourceParser;
-HSPLandroid/content/res/AssetManager;->rebaseTheme(JLandroid/content/res/AssetManager;[I[ZI)Landroid/content/res/AssetManager;
-HSPLandroid/content/res/AssetManager;->releaseTheme(J)V
-HSPLandroid/content/res/AssetManager;->resolveAttrs(JII[I[I[I[I)Z
-HSPLandroid/content/res/AssetManager;->retrieveAttributes(Landroid/content/res/XmlBlock$Parser;[I[I[I)Z
-HSPLandroid/content/res/AssetManager;->setApkAssets([Landroid/content/res/ApkAssets;Z)V
-HSPLandroid/content/res/AssetManager;->setConfiguration(IILjava/lang/String;IIIIIIIIIIIIIIII)V
-HSPLandroid/content/res/AssetManager;->setConfigurationInternal(IILjava/lang/String;[Ljava/lang/String;IIIIIIIIIIIIIIIIZ)V
-HSPLandroid/content/res/AssetManager;->setThemeTo(JLandroid/content/res/AssetManager;J)V
-HSPLandroid/content/res/AssetManager;->xmlBlockGone(I)V
-HSPLandroid/content/res/ColorStateList$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/res/ColorStateList;
-HSPLandroid/content/res/ColorStateList$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/res/ColorStateList$ColorStateListFactory;-><init>(Landroid/content/res/ColorStateList;)V
-HSPLandroid/content/res/ColorStateList$ColorStateListFactory;->getChangingConfigurations()I
-HSPLandroid/content/res/ColorStateList$ColorStateListFactory;->newInstance()Landroid/content/res/ColorStateList;
-HSPLandroid/content/res/ColorStateList$ColorStateListFactory;->newInstance()Ljava/lang/Object;
-HSPLandroid/content/res/ColorStateList$ColorStateListFactory;->newInstance(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;
-HSPLandroid/content/res/ColorStateList$ColorStateListFactory;->newInstance(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Ljava/lang/Object;
-HSPLandroid/content/res/ColorStateList;-><init>()V
-HSPLandroid/content/res/ColorStateList;-><init>(Landroid/content/res/ColorStateList;)V
-HSPLandroid/content/res/ColorStateList;-><init>([[I[I)V
-HSPLandroid/content/res/ColorStateList;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/content/res/ColorStateList;->canApplyTheme()Z
-HSPLandroid/content/res/ColorStateList;->createFromXmlInner(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;
-HSPLandroid/content/res/ColorStateList;->getChangingConfigurations()I
-HSPLandroid/content/res/ColorStateList;->getColorForState([II)I
-HSPLandroid/content/res/ColorStateList;->getConstantState()Landroid/content/res/ConstantState;
-HSPLandroid/content/res/ColorStateList;->getDefaultColor()I
-HSPLandroid/content/res/ColorStateList;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/content/res/ColorStateList;->isStateful()Z
-HSPLandroid/content/res/ColorStateList;->modulateColor(IFF)I
-HSPLandroid/content/res/ColorStateList;->obtainForTheme(Landroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;
-HSPLandroid/content/res/ColorStateList;->obtainForTheme(Landroid/content/res/Resources$Theme;)Landroid/content/res/ComplexColor;
-HSPLandroid/content/res/ColorStateList;->onColorsChanged()V
-HSPLandroid/content/res/ColorStateList;->valueOf(I)Landroid/content/res/ColorStateList;
-HSPLandroid/content/res/ColorStateList;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/res/CompatibilityInfo$2;->createFromParcel(Landroid/os/Parcel;)Landroid/content/res/CompatibilityInfo;
-HSPLandroid/content/res/CompatibilityInfo$2;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/res/CompatibilityInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/res/CompatibilityInfo;-><init>(Landroid/os/Parcel;Landroid/content/res/CompatibilityInfo-IA;)V
-HSPLandroid/content/res/CompatibilityInfo;->applyDisplayMetricsIfNeeded(Landroid/util/DisplayMetrics;Z)V
-HSPLandroid/content/res/CompatibilityInfo;->applyOverrideScaleIfNeeded(Landroid/content/res/Configuration;)V
-HSPLandroid/content/res/CompatibilityInfo;->applyOverrideScaleIfNeeded(Landroid/util/MergedConfiguration;)V
-HSPLandroid/content/res/CompatibilityInfo;->applyToConfiguration(ILandroid/content/res/Configuration;)V
-HSPLandroid/content/res/CompatibilityInfo;->applyToDisplayMetrics(Landroid/util/DisplayMetrics;)V
-HSPLandroid/content/res/CompatibilityInfo;->equals(Ljava/lang/Object;)Z
-HSPLandroid/content/res/CompatibilityInfo;->getOverrideInvertedScale()F
-HSPLandroid/content/res/CompatibilityInfo;->getTranslator()Landroid/content/res/CompatibilityInfo$Translator;
-HSPLandroid/content/res/CompatibilityInfo;->hasOverrideScale()Z
-HSPLandroid/content/res/CompatibilityInfo;->hasOverrideScaling()Z
-HSPLandroid/content/res/CompatibilityInfo;->hashCode()I
-HSPLandroid/content/res/CompatibilityInfo;->isScalingRequired()Z
-HSPLandroid/content/res/CompatibilityInfo;->needsCompatResources()Z
-HSPLandroid/content/res/CompatibilityInfo;->setOverrideInvertedScale(F)V
-HSPLandroid/content/res/CompatibilityInfo;->supportsScreen()Z
-HSPLandroid/content/res/ComplexColor;-><init>()V
-HSPLandroid/content/res/ComplexColor;->getChangingConfigurations()I
-HSPLandroid/content/res/ComplexColor;->setBaseChangingConfigurations(I)V
-HSPLandroid/content/res/Configuration$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/res/Configuration;
-HSPLandroid/content/res/Configuration$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/res/Configuration;-><init>()V
-HSPLandroid/content/res/Configuration;-><init>(Landroid/content/res/Configuration;)V
-HSPLandroid/content/res/Configuration;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/res/Configuration;-><init>(Landroid/os/Parcel;Landroid/content/res/Configuration-IA;)V
-HSPLandroid/content/res/Configuration;->compareTo(Landroid/content/res/Configuration;)I
-HSPLandroid/content/res/Configuration;->diff(Landroid/content/res/Configuration;)I
-HSPLandroid/content/res/Configuration;->diff(Landroid/content/res/Configuration;ZZ)I
-HSPLandroid/content/res/Configuration;->diffPublicOnly(Landroid/content/res/Configuration;)I
-HSPLandroid/content/res/Configuration;->equals(Landroid/content/res/Configuration;)Z
-HSPLandroid/content/res/Configuration;->equals(Ljava/lang/Object;)Z
-HSPLandroid/content/res/Configuration;->fixUpLocaleList()V
-HSPLandroid/content/res/Configuration;->generateDelta(Landroid/content/res/Configuration;Landroid/content/res/Configuration;)Landroid/content/res/Configuration;
-HSPLandroid/content/res/Configuration;->getGrammaticalGender()I
-HSPLandroid/content/res/Configuration;->getLayoutDirection()I
-HSPLandroid/content/res/Configuration;->getLocales()Landroid/os/LocaleList;
-HSPLandroid/content/res/Configuration;->getScreenLayoutNoDirection(I)I
-HSPLandroid/content/res/Configuration;->hashCode()I+]Landroid/os/LocaleList;Landroid/os/LocaleList;
-HSPLandroid/content/res/Configuration;->isLayoutSizeAtLeast(I)Z
-HSPLandroid/content/res/Configuration;->isOtherSeqNewer(Landroid/content/res/Configuration;)Z
-HSPLandroid/content/res/Configuration;->isScreenRound()Z
-HSPLandroid/content/res/Configuration;->isScreenWideColorGamut()Z
-HSPLandroid/content/res/Configuration;->needNewResources(II)Z
-HSPLandroid/content/res/Configuration;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/content/res/Configuration;->readFromProto(Landroid/util/proto/ProtoInputStream;J)V
-HSPLandroid/content/res/Configuration;->reduceScreenLayout(III)I
-HSPLandroid/content/res/Configuration;->resetScreenLayout(I)I
-HSPLandroid/content/res/Configuration;->setLayoutDirection(Ljava/util/Locale;)V
-HSPLandroid/content/res/Configuration;->setLocale(Ljava/util/Locale;)V
-HSPLandroid/content/res/Configuration;->setLocales(Landroid/os/LocaleList;)V
-HSPLandroid/content/res/Configuration;->setTo(Landroid/content/res/Configuration;)V+]Ljava/lang/Object;Ljava/util/Locale;]Ljava/util/Locale;Ljava/util/Locale;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLandroid/content/res/Configuration;->setTo(Landroid/content/res/Configuration;II)V
-HSPLandroid/content/res/Configuration;->setToDefaults()V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLandroid/content/res/Configuration;->toString()Ljava/lang/String;
-HSPLandroid/content/res/Configuration;->unset()V
-HSPLandroid/content/res/Configuration;->updateFrom(Landroid/content/res/Configuration;)I+]Ljava/lang/Object;Ljava/util/Locale;]Ljava/util/Locale;Ljava/util/Locale;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/os/LocaleList;Landroid/os/LocaleList;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLandroid/content/res/Configuration;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/res/ConfigurationBoundResourceCache;-><init>()V
-HSPLandroid/content/res/ConfigurationBoundResourceCache;->get(JLandroid/content/res/Resources$Theme;)Ljava/lang/Object;
-HSPLandroid/content/res/ConfigurationBoundResourceCache;->getGeneration()I
-HSPLandroid/content/res/ConfigurationBoundResourceCache;->getInstance(JLandroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Ljava/lang/Object;
-HSPLandroid/content/res/ConfigurationBoundResourceCache;->onConfigurationChange(I)V
-HSPLandroid/content/res/ConfigurationBoundResourceCache;->put(JLandroid/content/res/Resources$Theme;Ljava/lang/Object;I)V
-HSPLandroid/content/res/ConfigurationBoundResourceCache;->put(JLandroid/content/res/Resources$Theme;Ljava/lang/Object;IZ)V
-HSPLandroid/content/res/ConfigurationBoundResourceCache;->shouldInvalidateEntry(Landroid/content/res/ConstantState;I)Z
-HSPLandroid/content/res/ConfigurationBoundResourceCache;->shouldInvalidateEntry(Ljava/lang/Object;I)Z
-HSPLandroid/content/res/ConstantState;-><init>()V
-HSPLandroid/content/res/ConstantState;->newInstance(Landroid/content/res/Resources;)Ljava/lang/Object;
-HSPLandroid/content/res/ConstantState;->newInstance(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Ljava/lang/Object;
-HSPLandroid/content/res/DrawableCache;-><init>()V
-HSPLandroid/content/res/DrawableCache;->getInstance(JLandroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/content/res/DrawableCache;->shouldInvalidateEntry(Landroid/graphics/drawable/Drawable$ConstantState;I)Z
-HSPLandroid/content/res/DrawableCache;->shouldInvalidateEntry(Ljava/lang/Object;I)Z
-HSPLandroid/content/res/FeatureFlagsImpl;->defaultLocale()Z
-HSPLandroid/content/res/Flags;->defaultLocale()Z+]Landroid/content/res/FeatureFlags;Landroid/content/res/FeatureFlagsImpl;
-HSPLandroid/content/res/FontResourcesParser;->parse(Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources;)Landroid/content/res/FontResourcesParser$FamilyResourceEntry;
-HSPLandroid/content/res/FontResourcesParser;->readFamilies(Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources;)Landroid/content/res/FontResourcesParser$FamilyResourceEntry;
-HSPLandroid/content/res/FontResourcesParser;->readFamily(Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources;)Landroid/content/res/FontResourcesParser$FamilyResourceEntry;
-HSPLandroid/content/res/FontScaleConverterFactory;->forScale(F)Landroid/content/res/FontScaleConverter;
-HSPLandroid/content/res/FontScaleConverterFactory;->isNonLinearFontScalingActive(F)Z
-HSPLandroid/content/res/GradientColor;-><init>()V
-HSPLandroid/content/res/GradientColor;->canApplyTheme()Z
-HSPLandroid/content/res/GradientColor;->createFromXmlInner(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroid/content/res/GradientColor;
-HSPLandroid/content/res/GradientColor;->getConstantState()Landroid/content/res/ConstantState;
-HSPLandroid/content/res/GradientColor;->getDefaultColor()I
-HSPLandroid/content/res/GradientColor;->getShader()Landroid/graphics/Shader;
-HSPLandroid/content/res/GradientColor;->inflateChildElements(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/content/res/GradientColor;->onColorsChange()V
-HSPLandroid/content/res/GradientColor;->updateRootElementState(Landroid/content/res/TypedArray;)V
-HSPLandroid/content/res/ResourceId;->isValid(I)Z
-HSPLandroid/content/res/Resources$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z
-HSPLandroid/content/res/Resources$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V
-HSPLandroid/content/res/Resources$NotFoundException;-><init>(Ljava/lang/String;)V
-HSPLandroid/content/res/Resources$Theme;-><init>(Landroid/content/res/Resources;)V
-HSPLandroid/content/res/Resources$Theme;-><init>(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme-IA;)V
-HSPLandroid/content/res/Resources$Theme;->applyStyle(IZ)V
-HSPLandroid/content/res/Resources$Theme;->equals(Ljava/lang/Object;)Z
-HSPLandroid/content/res/Resources$Theme;->getAppliedStyleResId()I
-HSPLandroid/content/res/Resources$Theme;->getChangingConfigurations()I
-HSPLandroid/content/res/Resources$Theme;->getKey()Landroid/content/res/Resources$ThemeKey;
-HSPLandroid/content/res/Resources$Theme;->getParentThemeIdentifier(I)I
-HSPLandroid/content/res/Resources$Theme;->getResources()Landroid/content/res/Resources;
-HSPLandroid/content/res/Resources$Theme;->getTheme()[Ljava/lang/String;
-HSPLandroid/content/res/Resources$Theme;->hashCode()I
-HSPLandroid/content/res/Resources$Theme;->obtainStyledAttributes(I[I)Landroid/content/res/TypedArray;
-HSPLandroid/content/res/Resources$Theme;->obtainStyledAttributes(Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray;+]Landroid/content/res/ResourcesImpl$ThemeImpl;Landroid/content/res/ResourcesImpl$ThemeImpl;
-HSPLandroid/content/res/Resources$Theme;->obtainStyledAttributes([I)Landroid/content/res/TypedArray;
-HSPLandroid/content/res/Resources$Theme;->rebase()V
-HSPLandroid/content/res/Resources$Theme;->rebase(Landroid/content/res/ResourcesImpl;)V
-HSPLandroid/content/res/Resources$Theme;->resolveAttribute(ILandroid/util/TypedValue;Z)Z
-HSPLandroid/content/res/Resources$Theme;->resolveAttributes([I[I)Landroid/content/res/TypedArray;
-HSPLandroid/content/res/Resources$Theme;->setImpl(Landroid/content/res/ResourcesImpl$ThemeImpl;)V
-HSPLandroid/content/res/Resources$Theme;->setTo(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/content/res/Resources$Theme;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/res/Resources$Theme;Landroid/content/res/Resources$Theme;]Landroid/content/res/Resources;Landroid/content/res/Resources;
-HSPLandroid/content/res/Resources$ThemeKey;-><init>()V
-HSPLandroid/content/res/Resources$ThemeKey;->append(IZ)V
-HSPLandroid/content/res/Resources$ThemeKey;->clone()Landroid/content/res/Resources$ThemeKey;
-HSPLandroid/content/res/Resources$ThemeKey;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Landroid/content/res/Resources$ThemeKey;]Landroid/content/res/Resources$ThemeKey;Landroid/content/res/Resources$ThemeKey;
-HSPLandroid/content/res/Resources$ThemeKey;->hashCode()I
-HSPLandroid/content/res/Resources$ThemeKey;->moveToLast(I)V
-HSPLandroid/content/res/Resources$ThemeKey;->setTo(Landroid/content/res/Resources$ThemeKey;)V+][I[I][Z[Z
-HSPLandroid/content/res/Resources;-><init>(Landroid/content/res/AssetManager;Landroid/util/DisplayMetrics;Landroid/content/res/Configuration;)V
-HSPLandroid/content/res/Resources;-><init>(Ljava/lang/ClassLoader;)V+]Ljava/util/Set;Ljava/util/Collections$SynchronizedSet;
-HSPLandroid/content/res/Resources;->addLoaders([Landroid/content/res/loader/ResourcesLoader;)V
-HSPLandroid/content/res/Resources;->checkCallbacksRegistered()V
-HSPLandroid/content/res/Resources;->cleanupThemeReferences()V
-HSPLandroid/content/res/Resources;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
-HSPLandroid/content/res/Resources;->dumpHistory(Ljava/io/PrintWriter;Ljava/lang/String;)V
-HSPLandroid/content/res/Resources;->finishPreloading()V
-HSPLandroid/content/res/Resources;->getAnimation(I)Landroid/content/res/XmlResourceParser;
-HSPLandroid/content/res/Resources;->getAnimatorCache()Landroid/content/res/ConfigurationBoundResourceCache;
-HSPLandroid/content/res/Resources;->getAssets()Landroid/content/res/AssetManager;+]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl;
-HSPLandroid/content/res/Resources;->getAttributeSetSourceResId(Landroid/util/AttributeSet;)I
-HSPLandroid/content/res/Resources;->getBoolean(I)Z
-HSPLandroid/content/res/Resources;->getClassLoader()Ljava/lang/ClassLoader;
-HSPLandroid/content/res/Resources;->getColor(I)I
-HSPLandroid/content/res/Resources;->getColor(ILandroid/content/res/Resources$Theme;)I
-HSPLandroid/content/res/Resources;->getColorStateList(I)Landroid/content/res/ColorStateList;
-HSPLandroid/content/res/Resources;->getColorStateList(ILandroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;
-HSPLandroid/content/res/Resources;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo;
-HSPLandroid/content/res/Resources;->getConfiguration()Landroid/content/res/Configuration;+]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl;
-HSPLandroid/content/res/Resources;->getDimension(I)F
-HSPLandroid/content/res/Resources;->getDimensionPixelOffset(I)I
-HSPLandroid/content/res/Resources;->getDimensionPixelSize(I)I
-HSPLandroid/content/res/Resources;->getDisplayAdjustments()Landroid/view/DisplayAdjustments;
-HSPLandroid/content/res/Resources;->getDisplayMetrics()Landroid/util/DisplayMetrics;+]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl;
-HSPLandroid/content/res/Resources;->getDrawable(I)Landroid/graphics/drawable/Drawable;
-HSPLandroid/content/res/Resources;->getDrawable(ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/content/res/Resources;->getDrawableForDensity(II)Landroid/graphics/drawable/Drawable;
-HSPLandroid/content/res/Resources;->getDrawableForDensity(IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/content/res/Resources;->getDrawableInflater()Landroid/graphics/drawable/DrawableInflater;
-HSPLandroid/content/res/Resources;->getFloat(I)F
-HSPLandroid/content/res/Resources;->getFont(Landroid/util/TypedValue;I)Landroid/graphics/Typeface;
-HSPLandroid/content/res/Resources;->getFraction(III)F
-HSPLandroid/content/res/Resources;->getIdentifier(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/content/res/Resources;->getImpl()Landroid/content/res/ResourcesImpl;
-HSPLandroid/content/res/Resources;->getIntArray(I)[I
-HSPLandroid/content/res/Resources;->getInteger(I)I
-HSPLandroid/content/res/Resources;->getLayout(I)Landroid/content/res/XmlResourceParser;
-HSPLandroid/content/res/Resources;->getLoaders()Ljava/util/List;
-HSPLandroid/content/res/Resources;->getQuantityString(II)Ljava/lang/String;
-HSPLandroid/content/res/Resources;->getQuantityString(II[Ljava/lang/Object;)Ljava/lang/String;
-HSPLandroid/content/res/Resources;->getQuantityText(II)Ljava/lang/CharSequence;
-HSPLandroid/content/res/Resources;->getResourceEntryName(I)Ljava/lang/String;
-HSPLandroid/content/res/Resources;->getResourceName(I)Ljava/lang/String;
-HSPLandroid/content/res/Resources;->getResourcePackageName(I)Ljava/lang/String;
-HSPLandroid/content/res/Resources;->getResourceTypeName(I)Ljava/lang/String;
-HSPLandroid/content/res/Resources;->getSizeConfigurations()[Landroid/content/res/Configuration;
-HSPLandroid/content/res/Resources;->getStateListAnimatorCache()Landroid/content/res/ConfigurationBoundResourceCache;
-HSPLandroid/content/res/Resources;->getString(I)Ljava/lang/String;
-HSPLandroid/content/res/Resources;->getString(I[Ljava/lang/Object;)Ljava/lang/String;
-HSPLandroid/content/res/Resources;->getStringArray(I)[Ljava/lang/String;
-HSPLandroid/content/res/Resources;->getSystem()Landroid/content/res/Resources;
-HSPLandroid/content/res/Resources;->getText(I)Ljava/lang/CharSequence;
-HSPLandroid/content/res/Resources;->getTextArray(I)[Ljava/lang/CharSequence;
-HSPLandroid/content/res/Resources;->getValue(ILandroid/util/TypedValue;Z)V
-HSPLandroid/content/res/Resources;->getValueForDensity(IILandroid/util/TypedValue;Z)V
-HSPLandroid/content/res/Resources;->getXml(I)Landroid/content/res/XmlResourceParser;
-HSPLandroid/content/res/Resources;->hasOverrideDisplayAdjustments()Z
-HSPLandroid/content/res/Resources;->loadColorStateList(Landroid/util/TypedValue;ILandroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;
-HSPLandroid/content/res/Resources;->loadComplexColor(Landroid/util/TypedValue;ILandroid/content/res/Resources$Theme;)Landroid/content/res/ComplexColor;
-HSPLandroid/content/res/Resources;->loadDrawable(Landroid/util/TypedValue;IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/content/res/Resources;->loadXmlResourceParser(ILjava/lang/String;)Landroid/content/res/XmlResourceParser;
-HSPLandroid/content/res/Resources;->loadXmlResourceParser(Ljava/lang/String;IILjava/lang/String;)Landroid/content/res/XmlResourceParser;
-HSPLandroid/content/res/Resources;->newTheme()Landroid/content/res/Resources$Theme;
-HSPLandroid/content/res/Resources;->obtainAttributes(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;
-HSPLandroid/content/res/Resources;->obtainAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;+]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;
-HSPLandroid/content/res/Resources;->obtainTempTypedValue()Landroid/util/TypedValue;
-HSPLandroid/content/res/Resources;->obtainTypedArray(I)Landroid/content/res/TypedArray;
-HSPLandroid/content/res/Resources;->openRawResource(I)Ljava/io/InputStream;
-HSPLandroid/content/res/Resources;->openRawResource(ILandroid/util/TypedValue;)Ljava/io/InputStream;
-HSPLandroid/content/res/Resources;->openRawResourceFd(I)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/res/Resources;->parseBundleExtra(Ljava/lang/String;Landroid/util/AttributeSet;Landroid/os/Bundle;)V
-HSPLandroid/content/res/Resources;->preloadColorStateLists(Landroid/content/res/Resources;Landroid/content/res/TypedArray;)I
-HSPLandroid/content/res/Resources;->preloadDrawables(Landroid/content/res/Resources;Landroid/content/res/TypedArray;)I
-HSPLandroid/content/res/Resources;->preloadFonts(I)V
-HSPLandroid/content/res/Resources;->preloadResources()V
-HSPLandroid/content/res/Resources;->releaseTempTypedValue(Landroid/util/TypedValue;)V
-HSPLandroid/content/res/Resources;->resourceHasPackage(I)Z
-HSPLandroid/content/res/Resources;->selectDefaultTheme(II)I
-HSPLandroid/content/res/Resources;->selectSystemTheme(IIIIII)I
-HSPLandroid/content/res/Resources;->setCallbacks(Landroid/content/res/Resources$UpdateCallbacks;)V
-HSPLandroid/content/res/Resources;->setImpl(Landroid/content/res/ResourcesImpl;)V
-HSPLandroid/content/res/Resources;->startPreloading()V
-HSPLandroid/content/res/Resources;->updateConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;)V
-HSPLandroid/content/res/Resources;->updateConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;)V
-HSPLandroid/content/res/Resources;->updateSystemConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;)V
-HSPLandroid/content/res/ResourcesImpl$$ExternalSyntheticLambda0;-><init>()V
-HSPLandroid/content/res/ResourcesImpl$$ExternalSyntheticLambda0;->onHeaderDecoded(Landroid/graphics/ImageDecoder;Landroid/graphics/ImageDecoder$ImageInfo;Landroid/graphics/ImageDecoder$Source;)V
-HSPLandroid/content/res/ResourcesImpl$$ExternalSyntheticLambda1;-><init>()V
-HSPLandroid/content/res/ResourcesImpl$$ExternalSyntheticLambda1;->onHeaderDecoded(Landroid/graphics/ImageDecoder;Landroid/graphics/ImageDecoder$ImageInfo;Landroid/graphics/ImageDecoder$Source;)V
-HSPLandroid/content/res/ResourcesImpl$$ExternalSyntheticLambda2;-><init>()V
-HSPLandroid/content/res/ResourcesImpl$$ExternalSyntheticLambda2;->get()Ljava/lang/Object;
-HSPLandroid/content/res/ResourcesImpl$LookupStack;-><init>()V
-HSPLandroid/content/res/ResourcesImpl$LookupStack;-><init>(Landroid/content/res/ResourcesImpl$LookupStack-IA;)V
-HSPLandroid/content/res/ResourcesImpl$LookupStack;->contains(I)Z
-HSPLandroid/content/res/ResourcesImpl$LookupStack;->pop()V
-HSPLandroid/content/res/ResourcesImpl$LookupStack;->push(I)V
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;-><init>(Landroid/content/res/ResourcesImpl;)V+]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->applyStyle(IZ)V
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->finalize()V
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->getAppliedStyleResId()I
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->getChangingConfigurations()I
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->getKey()Landroid/content/res/Resources$ThemeKey;
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->getParentThemeIdentifier(I)I
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->getTheme()[Ljava/lang/String;
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->obtainStyledAttributes(Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray;+]Landroid/content/res/Resources$Theme;Landroid/content/res/Resources$Theme;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->rebase()V
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->rebase(Landroid/content/res/AssetManager;)V
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->resolveAttribute(ILandroid/util/TypedValue;Z)Z
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->resolveAttributes(Landroid/content/res/Resources$Theme;[I[I)Landroid/content/res/TypedArray;
-HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->setTo(Landroid/content/res/ResourcesImpl$ThemeImpl;)V
-HSPLandroid/content/res/ResourcesImpl;->-$$Nest$sfgetsThemeRegistry()Llibcore/util/NativeAllocationRegistry;
-HSPLandroid/content/res/ResourcesImpl;-><init>(Landroid/content/res/AssetManager;Landroid/util/DisplayMetrics;Landroid/content/res/Configuration;Landroid/view/DisplayAdjustments;)V+]Landroid/view/DisplayAdjustments;Landroid/view/DisplayAdjustments;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/util/DisplayMetrics;Landroid/util/DisplayMetrics;]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl;
-HSPLandroid/content/res/ResourcesImpl;->adjustLanguageTag(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/content/res/ResourcesImpl;->attrForQuantityCode(Ljava/lang/String;)I
-HSPLandroid/content/res/ResourcesImpl;->cacheDrawable(Landroid/util/TypedValue;ZLandroid/content/res/DrawableCache;Landroid/content/res/Resources$Theme;ZJLandroid/graphics/drawable/Drawable;I)V+]Landroid/content/res/DrawableCache;Landroid/content/res/DrawableCache;]Landroid/graphics/drawable/Drawable;megamorphic_types
-HSPLandroid/content/res/ResourcesImpl;->calcConfigChanges(Landroid/content/res/Configuration;)I
-HSPLandroid/content/res/ResourcesImpl;->decodeImageDrawable(Landroid/content/res/AssetManager$AssetInputStream;Landroid/content/res/Resources;Landroid/util/TypedValue;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/content/res/ResourcesImpl;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
-HSPLandroid/content/res/ResourcesImpl;->finishPreloading()V
-HSPLandroid/content/res/ResourcesImpl;->flushLayoutCache()V
-HSPLandroid/content/res/ResourcesImpl;->getAnimatorCache()Landroid/content/res/ConfigurationBoundResourceCache;
-HSPLandroid/content/res/ResourcesImpl;->getAssets()Landroid/content/res/AssetManager;
-HSPLandroid/content/res/ResourcesImpl;->getAttributeSetSourceResId(Landroid/util/AttributeSet;)I
-HSPLandroid/content/res/ResourcesImpl;->getColorStateListFromInt(Landroid/util/TypedValue;J)Landroid/content/res/ColorStateList;
-HSPLandroid/content/res/ResourcesImpl;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo;
-HSPLandroid/content/res/ResourcesImpl;->getConfiguration()Landroid/content/res/Configuration;
-HSPLandroid/content/res/ResourcesImpl;->getDisplayAdjustments()Landroid/view/DisplayAdjustments;
-HSPLandroid/content/res/ResourcesImpl;->getDisplayMetrics()Landroid/util/DisplayMetrics;
-HSPLandroid/content/res/ResourcesImpl;->getIdentifier(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/content/res/ResourcesImpl;->getPluralRule()Landroid/icu/text/PluralRules;
-HSPLandroid/content/res/ResourcesImpl;->getQuantityText(II)Ljava/lang/CharSequence;
-HSPLandroid/content/res/ResourcesImpl;->getResourceEntryName(I)Ljava/lang/String;
-HSPLandroid/content/res/ResourcesImpl;->getResourceName(I)Ljava/lang/String;
-HSPLandroid/content/res/ResourcesImpl;->getResourcePackageName(I)Ljava/lang/String;
-HSPLandroid/content/res/ResourcesImpl;->getResourceTypeName(I)Ljava/lang/String;
-HSPLandroid/content/res/ResourcesImpl;->getSizeConfigurations()[Landroid/content/res/Configuration;
-HSPLandroid/content/res/ResourcesImpl;->getStateListAnimatorCache()Landroid/content/res/ConfigurationBoundResourceCache;
-HSPLandroid/content/res/ResourcesImpl;->getValue(ILandroid/util/TypedValue;Z)V
-HSPLandroid/content/res/ResourcesImpl;->getValueForDensity(IILandroid/util/TypedValue;Z)V
-HSPLandroid/content/res/ResourcesImpl;->isIntLike(Ljava/lang/String;)Z
-HSPLandroid/content/res/ResourcesImpl;->lambda$decodeImageDrawable$1(Landroid/graphics/ImageDecoder;Landroid/graphics/ImageDecoder$ImageInfo;Landroid/graphics/ImageDecoder$Source;)V
-HSPLandroid/content/res/ResourcesImpl;->lambda$new$0()Landroid/content/res/ResourcesImpl$LookupStack;
-HSPLandroid/content/res/ResourcesImpl;->loadColorStateList(Landroid/content/res/Resources;Landroid/util/TypedValue;ILandroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;
-HSPLandroid/content/res/ResourcesImpl;->loadComplexColor(Landroid/content/res/Resources;Landroid/util/TypedValue;ILandroid/content/res/Resources$Theme;)Landroid/content/res/ComplexColor;
-HSPLandroid/content/res/ResourcesImpl;->loadComplexColorForCookie(Landroid/content/res/Resources;Landroid/util/TypedValue;ILandroid/content/res/Resources$Theme;)Landroid/content/res/ComplexColor;
-HSPLandroid/content/res/ResourcesImpl;->loadComplexColorFromName(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/TypedValue;I)Landroid/content/res/ComplexColor;+]Landroid/content/res/ConfigurationBoundResourceCache;Landroid/content/res/ConfigurationBoundResourceCache;
-HSPLandroid/content/res/ResourcesImpl;->loadDrawable(Landroid/content/res/Resources;Landroid/util/TypedValue;IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;+]Landroid/graphics/drawable/Drawable$ConstantState;megamorphic_types]Landroid/content/res/DrawableCache;Landroid/content/res/DrawableCache;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/graphics/drawable/Drawable;megamorphic_types
-HSPLandroid/content/res/ResourcesImpl;->loadDrawableForCookie(Landroid/content/res/Resources;Landroid/util/TypedValue;II)Landroid/graphics/drawable/Drawable;
-HSPLandroid/content/res/ResourcesImpl;->loadFont(Landroid/content/res/Resources;Landroid/util/TypedValue;I)Landroid/graphics/Typeface;
-HSPLandroid/content/res/ResourcesImpl;->loadXmlDrawable(Landroid/content/res/Resources;Landroid/util/TypedValue;IILjava/lang/String;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/content/res/ResourcesImpl;->loadXmlResourceParser(Ljava/lang/String;IILjava/lang/String;)Landroid/content/res/XmlResourceParser;+]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;]Landroid/content/res/XmlBlock;Landroid/content/res/XmlBlock;
-HSPLandroid/content/res/ResourcesImpl;->newThemeImpl()Landroid/content/res/ResourcesImpl$ThemeImpl;
-HSPLandroid/content/res/ResourcesImpl;->openRawResource(ILandroid/util/TypedValue;)Ljava/io/InputStream;
-HSPLandroid/content/res/ResourcesImpl;->openRawResourceFd(ILandroid/util/TypedValue;)Landroid/content/res/AssetFileDescriptor;
-HSPLandroid/content/res/ResourcesImpl;->startPreloading()V
-HSPLandroid/content/res/ResourcesImpl;->updateConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;)V+]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl;]Landroid/app/ResourcesManager;Landroid/app/ResourcesManager;]Landroid/content/res/CompatibilityInfo;Landroid/content/res/CompatibilityInfo$1;]Ljava/util/Locale;Ljava/util/Locale;]Landroid/content/res/DrawableCache;Landroid/content/res/DrawableCache;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/view/DisplayAdjustments;Landroid/view/DisplayAdjustments;]Landroid/os/LocaleList;Landroid/os/LocaleList;]Landroid/util/DisplayMetrics;Landroid/util/DisplayMetrics;]Landroid/content/res/ConfigurationBoundResourceCache;Landroid/content/res/ConfigurationBoundResourceCache;
-HSPLandroid/content/res/ResourcesImpl;->updateConfigurationImpl(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;Z)V+]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl;]Landroid/app/ResourcesManager;Landroid/app/ResourcesManager;]Landroid/content/res/CompatibilityInfo;Landroid/content/res/CompatibilityInfo$1;]Ljava/util/Locale;Ljava/util/Locale;]Landroid/content/res/DrawableCache;Landroid/content/res/DrawableCache;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/view/DisplayAdjustments;Landroid/view/DisplayAdjustments;]Landroid/os/LocaleList;Landroid/os/LocaleList;]Landroid/util/DisplayMetrics;Landroid/util/DisplayMetrics;]Landroid/content/res/ConfigurationBoundResourceCache;Landroid/content/res/ConfigurationBoundResourceCache;]Ljava/lang/Object;Ljava/util/Locale;
-HSPLandroid/content/res/ResourcesImpl;->verifyPreloadConfig(IIILjava/lang/String;)Z
-HSPLandroid/content/res/ResourcesKey;-><init>(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;[Landroid/content/res/loader/ResourcesLoader;)V
-HSPLandroid/content/res/ResourcesKey;->equals(Ljava/lang/Object;)Z
-HSPLandroid/content/res/ResourcesKey;->hasOverrideConfiguration()Z
-HSPLandroid/content/res/ResourcesKey;->hashCode()I
-HSPLandroid/content/res/StringBlock;-><init>(JZ)V
-HSPLandroid/content/res/StringBlock;->applyStyles(Ljava/lang/String;[ILandroid/content/res/StringBlock$StyleIDs;)Ljava/lang/CharSequence;
-HSPLandroid/content/res/StringBlock;->close()V
-HSPLandroid/content/res/StringBlock;->finalize()V
-HSPLandroid/content/res/StringBlock;->get(I)Ljava/lang/CharSequence;
-HSPLandroid/content/res/StringBlock;->getSequence(I)Ljava/lang/CharSequence;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLandroid/content/res/ThemedResourceCache;-><init>()V
-HSPLandroid/content/res/ThemedResourceCache;->get(JLandroid/content/res/Resources$Theme;)Ljava/lang/Object;
-HSPLandroid/content/res/ThemedResourceCache;->getGeneration()I
-HSPLandroid/content/res/ThemedResourceCache;->getThemedLocked(Landroid/content/res/Resources$Theme;Z)Landroid/util/LongSparseArray;
-HSPLandroid/content/res/ThemedResourceCache;->getUnthemedLocked(Z)Landroid/util/LongSparseArray;
-HSPLandroid/content/res/ThemedResourceCache;->onConfigurationChange(I)V
-HSPLandroid/content/res/ThemedResourceCache;->pruneEntriesLocked(Landroid/util/LongSparseArray;I)Z
-HSPLandroid/content/res/ThemedResourceCache;->pruneLocked(I)Z
-HSPLandroid/content/res/ThemedResourceCache;->put(JLandroid/content/res/Resources$Theme;Ljava/lang/Object;I)V
-HSPLandroid/content/res/ThemedResourceCache;->put(JLandroid/content/res/Resources$Theme;Ljava/lang/Object;IZ)V
-HSPLandroid/content/res/TypedArray;-><init>(Landroid/content/res/Resources;)V
-HSPLandroid/content/res/TypedArray;->extractThemeAttrs()[I
-HSPLandroid/content/res/TypedArray;->extractThemeAttrs([I)[I
-HSPLandroid/content/res/TypedArray;->getBoolean(IZ)Z
-HSPLandroid/content/res/TypedArray;->getChangingConfigurations()I+]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;
-HSPLandroid/content/res/TypedArray;->getColor(II)I
-HSPLandroid/content/res/TypedArray;->getColorStateList(I)Landroid/content/res/ColorStateList;+]Landroid/content/res/Resources;Landroid/content/res/Resources;
-HSPLandroid/content/res/TypedArray;->getComplexColor(I)Landroid/content/res/ComplexColor;
-HSPLandroid/content/res/TypedArray;->getDimension(IF)F
-HSPLandroid/content/res/TypedArray;->getDimensionPixelOffset(II)I
-HSPLandroid/content/res/TypedArray;->getDimensionPixelSize(II)I
-HSPLandroid/content/res/TypedArray;->getDrawable(I)Landroid/graphics/drawable/Drawable;+]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;
-HSPLandroid/content/res/TypedArray;->getDrawableForDensity(II)Landroid/graphics/drawable/Drawable;+]Landroid/content/res/Resources;Landroid/content/res/Resources;
-HSPLandroid/content/res/TypedArray;->getFloat(IF)F
-HSPLandroid/content/res/TypedArray;->getFont(I)Landroid/graphics/Typeface;
-HSPLandroid/content/res/TypedArray;->getFraction(IIIF)F
-HSPLandroid/content/res/TypedArray;->getIndex(I)I
-HSPLandroid/content/res/TypedArray;->getIndexCount()I
-HSPLandroid/content/res/TypedArray;->getInt(II)I
-HSPLandroid/content/res/TypedArray;->getInteger(II)I
-HSPLandroid/content/res/TypedArray;->getLayoutDimension(II)I
-HSPLandroid/content/res/TypedArray;->getLayoutDimension(ILjava/lang/String;)I
-HSPLandroid/content/res/TypedArray;->getNonConfigurationString(II)Ljava/lang/String;+]Ljava/lang/CharSequence;Ljava/lang/String;
-HSPLandroid/content/res/TypedArray;->getNonResourceString(I)Ljava/lang/String;
-HSPLandroid/content/res/TypedArray;->getPositionDescription()Ljava/lang/String;
-HSPLandroid/content/res/TypedArray;->getResourceId(II)I
-HSPLandroid/content/res/TypedArray;->getResources()Landroid/content/res/Resources;
-HSPLandroid/content/res/TypedArray;->getString(I)Ljava/lang/String;+]Ljava/lang/CharSequence;Ljava/lang/String;
-HSPLandroid/content/res/TypedArray;->getText(I)Ljava/lang/CharSequence;
-HSPLandroid/content/res/TypedArray;->getTextArray(I)[Ljava/lang/CharSequence;
-HSPLandroid/content/res/TypedArray;->getType(I)I
-HSPLandroid/content/res/TypedArray;->getValue(ILandroid/util/TypedValue;)Z
-HSPLandroid/content/res/TypedArray;->getValueAt(ILandroid/util/TypedValue;)Z
-HSPLandroid/content/res/TypedArray;->hasValue(I)Z
-HSPLandroid/content/res/TypedArray;->hasValueOrEmpty(I)Z
-HSPLandroid/content/res/TypedArray;->length()I
-HSPLandroid/content/res/TypedArray;->loadStringValueAt(I)Ljava/lang/CharSequence;+]Landroid/content/res/XmlBlock$Parser;Landroid/content/res/XmlBlock$Parser;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;]Landroid/content/res/Validator;Landroid/content/res/Validator;
-HSPLandroid/content/res/TypedArray;->obtain(Landroid/content/res/Resources;I)Landroid/content/res/TypedArray;+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool;
-HSPLandroid/content/res/TypedArray;->peekValue(I)Landroid/util/TypedValue;
-HSPLandroid/content/res/TypedArray;->recycle()V+]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool;
-HSPLandroid/content/res/TypedArray;->resize(I)V+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;
-HSPLandroid/content/res/XmlBlock$Parser;-><init>(Landroid/content/res/XmlBlock;JLandroid/content/res/XmlBlock;)V
-HSPLandroid/content/res/XmlBlock$Parser;->close()V
-HSPLandroid/content/res/XmlBlock$Parser;->finalize()V
-HSPLandroid/content/res/XmlBlock$Parser;->getAttributeBooleanValue(IZ)Z
-HSPLandroid/content/res/XmlBlock$Parser;->getAttributeBooleanValue(Ljava/lang/String;Ljava/lang/String;Z)Z
-HSPLandroid/content/res/XmlBlock$Parser;->getAttributeCount()I
-HSPLandroid/content/res/XmlBlock$Parser;->getAttributeIntValue(II)I
-HSPLandroid/content/res/XmlBlock$Parser;->getAttributeIntValue(Ljava/lang/String;Ljava/lang/String;I)I
-HSPLandroid/content/res/XmlBlock$Parser;->getAttributeName(I)Ljava/lang/String;
-HSPLandroid/content/res/XmlBlock$Parser;->getAttributeNameResource(I)I
-HSPLandroid/content/res/XmlBlock$Parser;->getAttributeResourceValue(II)I
-HSPLandroid/content/res/XmlBlock$Parser;->getAttributeResourceValue(Ljava/lang/String;Ljava/lang/String;I)I
-HSPLandroid/content/res/XmlBlock$Parser;->getAttributeValue(I)Ljava/lang/String;+]Landroid/content/res/StringBlock;Landroid/content/res/StringBlock;
-HSPLandroid/content/res/XmlBlock$Parser;->getAttributeValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/content/res/XmlBlock$Parser;->getClassAttribute()Ljava/lang/String;
-HSPLandroid/content/res/XmlBlock$Parser;->getDepth()I
-HSPLandroid/content/res/XmlBlock$Parser;->getEventType()I
-HSPLandroid/content/res/XmlBlock$Parser;->getLineNumber()I
-HSPLandroid/content/res/XmlBlock$Parser;->getName()Ljava/lang/String;+]Landroid/content/res/StringBlock;Landroid/content/res/StringBlock;
-HSPLandroid/content/res/XmlBlock$Parser;->getPooledString(I)Ljava/lang/CharSequence;+]Landroid/content/res/StringBlock;Landroid/content/res/StringBlock;
-HSPLandroid/content/res/XmlBlock$Parser;->getPositionDescription()Ljava/lang/String;
-HSPLandroid/content/res/XmlBlock$Parser;->getSequenceString(Ljava/lang/CharSequence;)Ljava/lang/String;
-HSPLandroid/content/res/XmlBlock$Parser;->getSourceResId()I
-HSPLandroid/content/res/XmlBlock$Parser;->getText()Ljava/lang/String;
-HSPLandroid/content/res/XmlBlock$Parser;->isEmptyElementTag()Z
-HSPLandroid/content/res/XmlBlock$Parser;->next()I+]Landroid/content/res/XmlBlock$Parser;Landroid/content/res/XmlBlock$Parser;]Landroid/content/res/Validator;Landroid/content/res/Validator;
-HSPLandroid/content/res/XmlBlock$Parser;->nextTag()I
-HSPLandroid/content/res/XmlBlock$Parser;->nextText()Ljava/lang/String;
-HSPLandroid/content/res/XmlBlock$Parser;->require(ILjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/res/XmlBlock;->-$$Nest$fgetmOpenCount(Landroid/content/res/XmlBlock;)I
-HSPLandroid/content/res/XmlBlock;->-$$Nest$fputmOpenCount(Landroid/content/res/XmlBlock;I)V
-HSPLandroid/content/res/XmlBlock;->-$$Nest$smnativeGetAttributeCount(J)I
-HSPLandroid/content/res/XmlBlock;->-$$Nest$smnativeGetAttributeData(JI)I
-HSPLandroid/content/res/XmlBlock;->-$$Nest$smnativeGetAttributeDataType(JI)I
-HSPLandroid/content/res/XmlBlock;->-$$Nest$smnativeGetAttributeIndex(JLjava/lang/String;Ljava/lang/String;)I
-HSPLandroid/content/res/XmlBlock;->-$$Nest$smnativeGetAttributeName(JI)I
-HSPLandroid/content/res/XmlBlock;->-$$Nest$smnativeGetAttributeStringValue(JI)I
-HSPLandroid/content/res/XmlBlock;->-$$Nest$smnativeGetClassAttribute(J)I
-HSPLandroid/content/res/XmlBlock;->-$$Nest$smnativeGetLineNumber(J)I
-HSPLandroid/content/res/XmlBlock;->-$$Nest$smnativeGetText(J)I
-HSPLandroid/content/res/XmlBlock;-><init>(Landroid/content/res/AssetManager;J)V
-HSPLandroid/content/res/XmlBlock;->close()V
-HSPLandroid/content/res/XmlBlock;->decOpenCountLocked()V
-HSPLandroid/content/res/XmlBlock;->finalize()V
-HSPLandroid/content/res/XmlBlock;->newParser()Landroid/content/res/XmlResourceParser;
-HSPLandroid/content/res/XmlBlock;->newParser(I)Landroid/content/res/XmlResourceParser;
-HSPLandroid/content/type/DefaultMimeMapFactory$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/content/type/DefaultMimeMapFactory;->create()Llibcore/content/type/MimeMap;
-HSPLandroid/content/type/DefaultMimeMapFactory;->lambda$create$0(Ljava/lang/Class;Ljava/lang/String;)Ljava/io/InputStream;
-HSPLandroid/content/type/DefaultMimeMapFactory;->parseTypes(Llibcore/content/type/MimeMap$Builder;Ljava/util/function/Function;Ljava/lang/String;)V
-HSPLandroid/database/AbstractCursor$SelfContentObserver;-><init>(Landroid/database/AbstractCursor;)V
-HSPLandroid/database/AbstractCursor$SelfContentObserver;->onChange(Z)V
-HSPLandroid/database/AbstractCursor;-><init>()V+]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard;
-HSPLandroid/database/AbstractCursor;->checkPosition()V+]Landroid/database/AbstractCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;
-HSPLandroid/database/AbstractCursor;->close()V+]Landroid/database/AbstractCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;,Landroid/database/MatrixCursor;]Landroid/database/ContentObservable;Landroid/database/ContentObservable;]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard;
-HSPLandroid/database/AbstractCursor;->fillWindow(ILandroid/database/CursorWindow;)V
-HSPLandroid/database/AbstractCursor;->finalize()V+]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard;
-HSPLandroid/database/AbstractCursor;->getColumnCount()I+]Landroid/database/AbstractCursor;Landroid/database/sqlite/SQLiteCursor;
-HSPLandroid/database/AbstractCursor;->getColumnIndex(Ljava/lang/String;)I
-HSPLandroid/database/AbstractCursor;->getColumnIndexOrThrow(Ljava/lang/String;)I
-HSPLandroid/database/AbstractCursor;->getColumnName(I)Ljava/lang/String;+]Landroid/database/AbstractCursor;Landroid/database/sqlite/SQLiteCursor;
-HSPLandroid/database/AbstractCursor;->getExtras()Landroid/os/Bundle;
-HSPLandroid/database/AbstractCursor;->getPosition()I
-HSPLandroid/database/AbstractCursor;->getWantsAllOnMoveCalls()Z
-HSPLandroid/database/AbstractCursor;->getWindow()Landroid/database/CursorWindow;
-HSPLandroid/database/AbstractCursor;->isAfterLast()Z+]Landroid/database/AbstractCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;
-HSPLandroid/database/AbstractCursor;->isClosed()Z
-HSPLandroid/database/AbstractCursor;->isLast()Z
-HSPLandroid/database/AbstractCursor;->move(I)Z
-HSPLandroid/database/AbstractCursor;->moveToFirst()Z
-HSPLandroid/database/AbstractCursor;->moveToLast()Z
-HSPLandroid/database/AbstractCursor;->moveToNext()Z+]Landroid/database/AbstractCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/MatrixCursor;,Landroid/database/BulkCursorToCursorAdaptor;
-HSPLandroid/database/AbstractCursor;->moveToPosition(I)Z+]Landroid/database/AbstractCursor;missing_types
-HSPLandroid/database/AbstractCursor;->onChange(Z)V
-HSPLandroid/database/AbstractCursor;->onDeactivateOrClose()V+]Landroid/database/DataSetObservable;Landroid/database/DataSetObservable;
-HSPLandroid/database/AbstractCursor;->onMove(II)Z
-HSPLandroid/database/AbstractCursor;->registerContentObserver(Landroid/database/ContentObserver;)V
-HSPLandroid/database/AbstractCursor;->registerDataSetObserver(Landroid/database/DataSetObserver;)V
-HSPLandroid/database/AbstractCursor;->setNotificationUri(Landroid/content/ContentResolver;Landroid/net/Uri;)V
-HSPLandroid/database/AbstractCursor;->setNotificationUris(Landroid/content/ContentResolver;Ljava/util/List;)V
-HSPLandroid/database/AbstractCursor;->setNotificationUris(Landroid/content/ContentResolver;Ljava/util/List;IZ)V
-HSPLandroid/database/AbstractCursor;->unregisterContentObserver(Landroid/database/ContentObserver;)V
-HSPLandroid/database/AbstractWindowedCursor;-><init>()V
-HSPLandroid/database/AbstractWindowedCursor;->checkPosition()V
-HSPLandroid/database/AbstractWindowedCursor;->clearOrCreateWindow(Ljava/lang/String;)V
-HSPLandroid/database/AbstractWindowedCursor;->closeWindow()V+]Landroid/database/CursorWindow;Landroid/database/CursorWindow;
-HSPLandroid/database/AbstractWindowedCursor;->getBlob(I)[B
-HSPLandroid/database/AbstractWindowedCursor;->getDouble(I)D+]Landroid/database/AbstractWindowedCursor;Landroid/database/sqlite/SQLiteCursor;]Landroid/database/CursorWindow;Landroid/database/CursorWindow;
-HSPLandroid/database/AbstractWindowedCursor;->getFloat(I)F
-HSPLandroid/database/AbstractWindowedCursor;->getInt(I)I+]Landroid/database/AbstractWindowedCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;]Landroid/database/CursorWindow;Landroid/database/CursorWindow;
-HSPLandroid/database/AbstractWindowedCursor;->getLong(I)J+]Landroid/database/AbstractWindowedCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;]Landroid/database/CursorWindow;Landroid/database/CursorWindow;
-HSPLandroid/database/AbstractWindowedCursor;->getString(I)Ljava/lang/String;+]Landroid/database/AbstractWindowedCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;]Landroid/database/CursorWindow;Landroid/database/CursorWindow;
-HSPLandroid/database/AbstractWindowedCursor;->getType(I)I
-HSPLandroid/database/AbstractWindowedCursor;->getWindow()Landroid/database/CursorWindow;
-HSPLandroid/database/AbstractWindowedCursor;->hasWindow()Z
-HSPLandroid/database/AbstractWindowedCursor;->isNull(I)Z+]Landroid/database/AbstractWindowedCursor;Landroid/database/sqlite/SQLiteCursor;]Landroid/database/CursorWindow;Landroid/database/CursorWindow;
-HSPLandroid/database/AbstractWindowedCursor;->onDeactivateOrClose()V+]Landroid/database/AbstractWindowedCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;
-HSPLandroid/database/AbstractWindowedCursor;->setWindow(Landroid/database/CursorWindow;)V
-HSPLandroid/database/BulkCursorDescriptor$1;->createFromParcel(Landroid/os/Parcel;)Landroid/database/BulkCursorDescriptor;
-HSPLandroid/database/BulkCursorDescriptor$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/database/BulkCursorDescriptor;-><init>()V
-HSPLandroid/database/BulkCursorDescriptor;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/database/BulkCursorDescriptor;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/database/BulkCursorNative;-><init>()V
-HSPLandroid/database/BulkCursorNative;->asBinder()Landroid/os/IBinder;
-HSPLandroid/database/BulkCursorNative;->asInterface(Landroid/os/IBinder;)Landroid/database/IBulkCursor;
-HSPLandroid/database/BulkCursorNative;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/database/BulkCursorProxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/database/BulkCursorProxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/database/BulkCursorProxy;->close()V
-HSPLandroid/database/BulkCursorProxy;->getWindow(I)Landroid/database/CursorWindow;
-HSPLandroid/database/BulkCursorToCursorAdaptor;-><init>()V
-HSPLandroid/database/BulkCursorToCursorAdaptor;->close()V
-HSPLandroid/database/BulkCursorToCursorAdaptor;->getColumnNames()[Ljava/lang/String;
-HSPLandroid/database/BulkCursorToCursorAdaptor;->getCount()I
-HSPLandroid/database/BulkCursorToCursorAdaptor;->getObserver()Landroid/database/IContentObserver;
-HSPLandroid/database/BulkCursorToCursorAdaptor;->initialize(Landroid/database/BulkCursorDescriptor;)V
-HSPLandroid/database/BulkCursorToCursorAdaptor;->onMove(II)Z+]Landroid/database/IBulkCursor;Landroid/database/BulkCursorProxy;]Landroid/database/BulkCursorToCursorAdaptor;Landroid/database/BulkCursorToCursorAdaptor;
-HSPLandroid/database/BulkCursorToCursorAdaptor;->throwIfCursorIsClosed()V
-HSPLandroid/database/ContentObservable;-><init>()V
-HSPLandroid/database/ContentObservable;->dispatchChange(ZLandroid/net/Uri;)V
-HSPLandroid/database/ContentObservable;->registerObserver(Landroid/database/ContentObserver;)V
-HSPLandroid/database/ContentObserver$$ExternalSyntheticLambda0;-><init>(Landroid/database/ContentObserver;ZLjava/util/Collection;II)V
-HSPLandroid/database/ContentObserver$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/database/ContentObserver$Transport;-><init>(Landroid/database/ContentObserver;)V
-HSPLandroid/database/ContentObserver$Transport;->onChangeEtc(Z[Landroid/net/Uri;II)V
-HSPLandroid/database/ContentObserver$Transport;->releaseContentObserver()V
-HSPLandroid/database/ContentObserver;-><init>(Landroid/os/Handler;)V
-HSPLandroid/database/ContentObserver;->dispatchChange(ZLjava/util/Collection;II)V
-HSPLandroid/database/ContentObserver;->getContentObserver()Landroid/database/IContentObserver;
-HSPLandroid/database/ContentObserver;->onChange(Z)V
-HSPLandroid/database/ContentObserver;->onChange(ZLandroid/net/Uri;)V
-HSPLandroid/database/ContentObserver;->onChange(ZLandroid/net/Uri;I)V
-HSPLandroid/database/ContentObserver;->onChange(ZLjava/util/Collection;I)V
-HSPLandroid/database/ContentObserver;->onChange(ZLjava/util/Collection;II)V
-HSPLandroid/database/ContentObserver;->releaseContentObserver()Landroid/database/IContentObserver;
-HSPLandroid/database/CrossProcessCursorWrapper;-><init>(Landroid/database/Cursor;)V
-HSPLandroid/database/CursorToBulkCursorAdaptor$ContentObserverProxy;-><init>(Landroid/database/IContentObserver;Landroid/os/IBinder$DeathRecipient;)V
-HSPLandroid/database/CursorToBulkCursorAdaptor$ContentObserverProxy;->unlinkToDeath(Landroid/os/IBinder$DeathRecipient;)Z
-HSPLandroid/database/CursorToBulkCursorAdaptor;-><init>(Landroid/database/Cursor;Landroid/database/IContentObserver;Ljava/lang/String;)V
-HSPLandroid/database/CursorToBulkCursorAdaptor;->binderDied()V
-HSPLandroid/database/CursorToBulkCursorAdaptor;->close()V
-HSPLandroid/database/CursorToBulkCursorAdaptor;->closeFilledWindowLocked()V
-HSPLandroid/database/CursorToBulkCursorAdaptor;->createAndRegisterObserverProxyLocked(Landroid/database/IContentObserver;)V
-HSPLandroid/database/CursorToBulkCursorAdaptor;->disposeLocked()V
-HSPLandroid/database/CursorToBulkCursorAdaptor;->getBulkCursorDescriptor()Landroid/database/BulkCursorDescriptor;
-HSPLandroid/database/CursorToBulkCursorAdaptor;->getWindow(I)Landroid/database/CursorWindow;
-HSPLandroid/database/CursorToBulkCursorAdaptor;->throwIfCursorIsClosed()V
-HSPLandroid/database/CursorToBulkCursorAdaptor;->unregisterObserverProxyLocked()V
-HSPLandroid/database/CursorWindow$1;->createFromParcel(Landroid/os/Parcel;)Landroid/database/CursorWindow;
-HSPLandroid/database/CursorWindow$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/database/CursorWindow$1;->newArray(I)[Landroid/database/CursorWindow;
-HSPLandroid/database/CursorWindow$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/database/CursorWindow;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/database/CursorWindow;-><init>(Landroid/os/Parcel;Landroid/database/CursorWindow-IA;)V
-HSPLandroid/database/CursorWindow;-><init>(Ljava/lang/String;)V
-HSPLandroid/database/CursorWindow;-><init>(Ljava/lang/String;J)V+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/database/CursorWindow;->allocRow()Z
-HSPLandroid/database/CursorWindow;->clear()V
-HSPLandroid/database/CursorWindow;->dispose()V+]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard;
-HSPLandroid/database/CursorWindow;->finalize()V+]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard;
-HSPLandroid/database/CursorWindow;->getBlob(II)[B
-HSPLandroid/database/CursorWindow;->getCursorWindowSize()I
-HSPLandroid/database/CursorWindow;->getDouble(II)D+]Landroid/database/CursorWindow;Landroid/database/CursorWindow;
-HSPLandroid/database/CursorWindow;->getFloat(II)F
-HSPLandroid/database/CursorWindow;->getInt(II)I+]Landroid/database/CursorWindow;Landroid/database/CursorWindow;
-HSPLandroid/database/CursorWindow;->getLong(II)J+]Landroid/database/CursorWindow;Landroid/database/CursorWindow;
-HSPLandroid/database/CursorWindow;->getNumRows()I+]Landroid/database/CursorWindow;Landroid/database/CursorWindow;
-HSPLandroid/database/CursorWindow;->getStartPosition()I
-HSPLandroid/database/CursorWindow;->getString(II)Ljava/lang/String;+]Landroid/database/CursorWindow;Landroid/database/CursorWindow;
-HSPLandroid/database/CursorWindow;->getType(II)I+]Landroid/database/CursorWindow;Landroid/database/CursorWindow;
-HSPLandroid/database/CursorWindow;->newFromParcel(Landroid/os/Parcel;)Landroid/database/CursorWindow;
-HSPLandroid/database/CursorWindow;->onAllReferencesReleased()V
-HSPLandroid/database/CursorWindow;->putLong(JII)Z
-HSPLandroid/database/CursorWindow;->putNull(II)Z
-HSPLandroid/database/CursorWindow;->putString(Ljava/lang/String;II)Z
-HSPLandroid/database/CursorWindow;->setNumColumns(I)Z
-HSPLandroid/database/CursorWindow;->setStartPosition(I)V
-HSPLandroid/database/CursorWindow;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/database/CursorWrapper;-><init>(Landroid/database/Cursor;)V
-HSPLandroid/database/CursorWrapper;->close()V
-HSPLandroid/database/CursorWrapper;->getBlob(I)[B
-HSPLandroid/database/CursorWrapper;->getColumnCount()I
-HSPLandroid/database/CursorWrapper;->getColumnIndex(Ljava/lang/String;)I
-HSPLandroid/database/CursorWrapper;->getColumnIndexOrThrow(Ljava/lang/String;)I
-HSPLandroid/database/CursorWrapper;->getColumnName(I)Ljava/lang/String;
-HSPLandroid/database/CursorWrapper;->getColumnNames()[Ljava/lang/String;
-HSPLandroid/database/CursorWrapper;->getCount()I
-HSPLandroid/database/CursorWrapper;->getExtras()Landroid/os/Bundle;
-HSPLandroid/database/CursorWrapper;->getInt(I)I+]Landroid/database/Cursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/content/ContentProviderClient$CursorWrapperInner;,Landroid/database/BulkCursorToCursorAdaptor;
-HSPLandroid/database/CursorWrapper;->getLong(I)J
-HSPLandroid/database/CursorWrapper;->getPosition()I
-HSPLandroid/database/CursorWrapper;->getString(I)Ljava/lang/String;
-HSPLandroid/database/CursorWrapper;->getType(I)I
-HSPLandroid/database/CursorWrapper;->getWrappedCursor()Landroid/database/Cursor;
-HSPLandroid/database/CursorWrapper;->isAfterLast()Z+]Landroid/database/Cursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/content/ContentProviderClient$CursorWrapperInner;,Landroid/database/BulkCursorToCursorAdaptor;
-HSPLandroid/database/CursorWrapper;->isClosed()Z
-HSPLandroid/database/CursorWrapper;->isLast()Z
-HSPLandroid/database/CursorWrapper;->isNull(I)Z+]Landroid/database/Cursor;Landroid/database/BulkCursorToCursorAdaptor;
-HSPLandroid/database/CursorWrapper;->moveToFirst()Z
-HSPLandroid/database/CursorWrapper;->moveToLast()Z
-HSPLandroid/database/CursorWrapper;->moveToNext()Z
-HSPLandroid/database/CursorWrapper;->moveToPosition(I)Z
-HSPLandroid/database/CursorWrapper;->registerContentObserver(Landroid/database/ContentObserver;)V
-HSPLandroid/database/DataSetObservable;-><init>()V
-HSPLandroid/database/DataSetObservable;->notifyChanged()V
-HSPLandroid/database/DataSetObservable;->notifyInvalidated()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/database/DataSetObserver;-><init>()V
-HSPLandroid/database/DatabaseUtils;->appendEscapedSQLString(Ljava/lang/StringBuilder;Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/database/DatabaseUtils;->categorizeStatement(Ljava/lang/String;Ljava/lang/String;)I+]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/database/DatabaseUtils;->cursorFillWindow(Landroid/database/Cursor;ILandroid/database/CursorWindow;)V
-HSPLandroid/database/DatabaseUtils;->getSqlStatementPrefixSimple(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/database/DatabaseUtils;->getSqlStatementType(Ljava/lang/String;)I
-HSPLandroid/database/DatabaseUtils;->getSqlStatementTypeExtended(Ljava/lang/String;)I
-HSPLandroid/database/DatabaseUtils;->getTypeOfObject(Ljava/lang/Object;)I
-HSPLandroid/database/DatabaseUtils;->longForQuery(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/String;)J
-HSPLandroid/database/DatabaseUtils;->longForQuery(Landroid/database/sqlite/SQLiteStatement;[Ljava/lang/String;)J
-HSPLandroid/database/DatabaseUtils;->queryNumEntries(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;)J
-HSPLandroid/database/DatabaseUtils;->queryNumEntries(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)J
-HSPLandroid/database/DatabaseUtils;->readExceptionFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/database/DatabaseUtils;->readExceptionFromParcel(Landroid/os/Parcel;Ljava/lang/String;I)V
-HSPLandroid/database/DatabaseUtils;->readExceptionWithFileNotFoundExceptionFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/database/DatabaseUtils;->readExceptionWithOperationApplicationExceptionFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/database/DatabaseUtils;->sqlEscapeString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/DatabaseUtils;->stringForQuery(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/DatabaseUtils;->stringForQuery(Landroid/database/sqlite/SQLiteStatement;[Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/DatabaseUtils;->writeExceptionToParcel(Landroid/os/Parcel;Ljava/lang/Exception;)V
-HSPLandroid/database/DefaultDatabaseErrorHandler;-><init>()V
-HSPLandroid/database/IContentObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/database/IContentObserver$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/database/IContentObserver$Stub$Proxy;->onChangeEtc(Z[Landroid/net/Uri;II)V
-HSPLandroid/database/IContentObserver$Stub;-><init>()V
-HSPLandroid/database/IContentObserver$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/database/IContentObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/database/IContentObserver;
-HSPLandroid/database/IContentObserver$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
-HSPLandroid/database/IContentObserver$Stub;->getMaxTransactionId()I
-HSPLandroid/database/IContentObserver$Stub;->getTransactionName(I)Ljava/lang/String;
-HSPLandroid/database/IContentObserver$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
-HSPLandroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
-HSPLandroid/database/MatrixCursor;-><init>([Ljava/lang/String;)V
-HSPLandroid/database/MatrixCursor;-><init>([Ljava/lang/String;I)V
-HSPLandroid/database/MatrixCursor;->addRow([Ljava/lang/Object;)V
-HSPLandroid/database/MatrixCursor;->ensureCapacity(I)V
-HSPLandroid/database/MatrixCursor;->get(I)Ljava/lang/Object;
-HSPLandroid/database/MatrixCursor;->getColumnNames()[Ljava/lang/String;
-HSPLandroid/database/MatrixCursor;->getCount()I
-HSPLandroid/database/MatrixCursor;->getDouble(I)D
-HSPLandroid/database/MatrixCursor;->getInt(I)I
-HSPLandroid/database/MatrixCursor;->getLong(I)J
-HSPLandroid/database/MatrixCursor;->getString(I)Ljava/lang/String;
-HSPLandroid/database/MatrixCursor;->getType(I)I
-HSPLandroid/database/MatrixCursor;->newRow()Landroid/database/MatrixCursor$RowBuilder;
-HSPLandroid/database/MergeCursor$1;-><init>(Landroid/database/MergeCursor;)V
-HSPLandroid/database/MergeCursor$1;->onInvalidated()V
-HSPLandroid/database/MergeCursor;-><init>([Landroid/database/Cursor;)V
-HSPLandroid/database/MergeCursor;->close()V
-HSPLandroid/database/MergeCursor;->getColumnNames()[Ljava/lang/String;
-HSPLandroid/database/MergeCursor;->getCount()I
-HSPLandroid/database/MergeCursor;->getString(I)Ljava/lang/String;
-HSPLandroid/database/MergeCursor;->onMove(II)Z
-HSPLandroid/database/Observable;-><init>()V
-HSPLandroid/database/Observable;->registerObserver(Ljava/lang/Object;)V
-HSPLandroid/database/Observable;->unregisterAll()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/database/Observable;->unregisterObserver(Ljava/lang/Object;)V
-HSPLandroid/database/sqlite/FeatureFlagsImpl;-><init>()V
-HSPLandroid/database/sqlite/FeatureFlagsImpl;->sqliteAllowTempTables()Z
-HSPLandroid/database/sqlite/Flags;-><clinit>()V
-HSPLandroid/database/sqlite/Flags;->sqliteAllowTempTables()Z+]Landroid/database/sqlite/FeatureFlags;Landroid/database/sqlite/FeatureFlagsImpl;
-HSPLandroid/database/sqlite/SQLiteClosable;-><init>()V
-HSPLandroid/database/sqlite/SQLiteClosable;->acquireReference()V
-HSPLandroid/database/sqlite/SQLiteClosable;->close()V+]Landroid/database/sqlite/SQLiteClosable;Landroid/database/CursorWindow;,Landroid/database/sqlite/SQLiteStatement;,Landroid/database/sqlite/SQLiteDatabase;,Landroid/database/sqlite/SQLiteQuery;
-HSPLandroid/database/sqlite/SQLiteClosable;->releaseReference()V+]Landroid/database/sqlite/SQLiteClosable;Landroid/database/CursorWindow;,Landroid/database/sqlite/SQLiteStatement;,Landroid/database/sqlite/SQLiteDatabase;,Landroid/database/sqlite/SQLiteQuery;
-HSPLandroid/database/sqlite/SQLiteCompatibilityWalFlags;->getTruncateSize()J
-HSPLandroid/database/sqlite/SQLiteCompatibilityWalFlags;->init(Ljava/lang/String;)V
-HSPLandroid/database/sqlite/SQLiteCompatibilityWalFlags;->initIfNeeded()V
-HSPLandroid/database/sqlite/SQLiteCompatibilityWalFlags;->isLegacyCompatibilityWalEnabled()Z
-HSPLandroid/database/sqlite/SQLiteConnection$Operation;-><init>()V
-HSPLandroid/database/sqlite/SQLiteConnection$Operation;-><init>(Landroid/database/sqlite/SQLiteConnection$Operation-IA;)V
-HSPLandroid/database/sqlite/SQLiteConnection$Operation;->describe(Ljava/lang/StringBuilder;Z)V
-HSPLandroid/database/sqlite/SQLiteConnection$Operation;->getTraceMethodName()Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;-><init>(Landroid/database/sqlite/SQLiteConnectionPool;)V
-HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->beginOperation(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)I+]Landroid/database/sqlite/SQLiteConnectionPool;Landroid/database/sqlite/SQLiteConnectionPool;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->dump(Landroid/util/Printer;)V
-HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->endOperation(I)V
-HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->endOperationDeferLog(I)Z
-HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->endOperationDeferLogLocked(I)Z+]Landroid/database/sqlite/SQLiteConnectionPool;Landroid/database/sqlite/SQLiteConnectionPool;
-HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->failOperation(ILjava/lang/Exception;)V
-HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->getOperationLocked(I)Landroid/database/sqlite/SQLiteConnection$Operation;
-HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->newOperationCookieLocked(I)I
-HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->setResult(J)V
-HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->setResult(Ljava/lang/String;)V
-HSPLandroid/database/sqlite/SQLiteConnection$PreparedStatement;-><init>()V
-HSPLandroid/database/sqlite/SQLiteConnection$PreparedStatementCache;-><init>(Landroid/database/sqlite/SQLiteConnection;I)V
-HSPLandroid/database/sqlite/SQLiteConnection$PreparedStatementCache;->createStatement(Ljava/lang/String;)J
-HSPLandroid/database/sqlite/SQLiteConnection$PreparedStatementCache;->entryRemoved(ZLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLandroid/database/sqlite/SQLiteConnection$PreparedStatementCache;->entryRemoved(ZLjava/lang/String;Landroid/database/sqlite/SQLiteConnection$PreparedStatement;Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V
-HSPLandroid/database/sqlite/SQLiteConnection$PreparedStatementCache;->getLastSeqNum()J
-HSPLandroid/database/sqlite/SQLiteConnection$PreparedStatementCache;->getStatement(Ljava/lang/String;)Landroid/database/sqlite/SQLiteConnection$PreparedStatement;+]Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;
-HSPLandroid/database/sqlite/SQLiteConnection;->-$$Nest$fgetmConnectionPtr(Landroid/database/sqlite/SQLiteConnection;)J
-HSPLandroid/database/sqlite/SQLiteConnection;->-$$Nest$mfinalizePreparedStatement(Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V
-HSPLandroid/database/sqlite/SQLiteConnection;->-$$Nest$smnativePrepareStatement(JLjava/lang/String;)J
-HSPLandroid/database/sqlite/SQLiteConnection;-><init>(Landroid/database/sqlite/SQLiteConnectionPool;Landroid/database/sqlite/SQLiteDatabaseConfiguration;IZ)V+]Landroid/database/sqlite/SQLiteDatabaseConfiguration;Landroid/database/sqlite/SQLiteDatabaseConfiguration;]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard;
-HSPLandroid/database/sqlite/SQLiteConnection;->acquirePreparedStatement(Ljava/lang/String;)Landroid/database/sqlite/SQLiteConnection$PreparedStatement;
-HSPLandroid/database/sqlite/SQLiteConnection;->acquirePreparedStatementLI(Ljava/lang/String;)Landroid/database/sqlite/SQLiteConnection$PreparedStatement;+]Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;
-HSPLandroid/database/sqlite/SQLiteConnection;->applyBlockGuardPolicy(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V+]Landroid/database/sqlite/SQLiteDatabaseConfiguration;Landroid/database/sqlite/SQLiteDatabaseConfiguration;]Ldalvik/system/BlockGuard$Policy;Ldalvik/system/BlockGuard$1;,Landroid/os/StrictMode$AndroidBlockGuardPolicy;
-HSPLandroid/database/sqlite/SQLiteConnection;->attachCancellationSignal(Landroid/os/CancellationSignal;)V+]Landroid/os/CancellationSignal;Landroid/os/CancellationSignal;
-HSPLandroid/database/sqlite/SQLiteConnection;->bindArguments(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;[Ljava/lang/Object;)V+]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/Number;Ljava/lang/Integer;,Ljava/lang/Double;,Ljava/lang/Long;
-HSPLandroid/database/sqlite/SQLiteConnection;->canonicalizeSyncMode(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteConnection;->checkDatabaseWiped()V
-HSPLandroid/database/sqlite/SQLiteConnection;->close()V
-HSPLandroid/database/sqlite/SQLiteConnection;->collectDbStats(Ljava/util/ArrayList;)V
-HSPLandroid/database/sqlite/SQLiteConnection;->detachCancellationSignal(Landroid/os/CancellationSignal;)V+]Landroid/os/CancellationSignal;Landroid/os/CancellationSignal;
-HSPLandroid/database/sqlite/SQLiteConnection;->dispose(Z)V
-HSPLandroid/database/sqlite/SQLiteConnection;->dumpUnsafe(Landroid/util/Printer;Z)V
-HSPLandroid/database/sqlite/SQLiteConnection;->execute(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog;
-HSPLandroid/database/sqlite/SQLiteConnection;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)I+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog;
-HSPLandroid/database/sqlite/SQLiteConnection;->executeForCursorWindow(Ljava/lang/String;[Ljava/lang/Object;Landroid/database/CursorWindow;IIZLandroid/os/CancellationSignal;)I+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/database/CursorWindow;Landroid/database/CursorWindow;]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog;
-HSPLandroid/database/sqlite/SQLiteConnection;->executeForLastInsertedRowId(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)J
-HSPLandroid/database/sqlite/SQLiteConnection;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)J+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog;
-HSPLandroid/database/sqlite/SQLiteConnection;->executeForString(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)Ljava/lang/String;+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog;
-HSPLandroid/database/sqlite/SQLiteConnection;->executePerConnectionSqlFromConfiguration(I)V
-HSPLandroid/database/sqlite/SQLiteConnection;->finalize()V
-HSPLandroid/database/sqlite/SQLiteConnection;->finalizePreparedStatement(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V
-HSPLandroid/database/sqlite/SQLiteConnection;->getConnectionId()I
-HSPLandroid/database/sqlite/SQLiteConnection;->getMainDbStatsUnsafe(IJJ)Landroid/database/sqlite/SQLiteDebug$DbStats;
-HSPLandroid/database/sqlite/SQLiteConnection;->isCacheable(I)Z
-HSPLandroid/database/sqlite/SQLiteConnection;->isPreparedStatementInCache(Ljava/lang/String;)Z+]Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;
-HSPLandroid/database/sqlite/SQLiteConnection;->isPrimaryConnection()Z
-HSPLandroid/database/sqlite/SQLiteConnection;->maybeTruncateWalFile()V
-HSPLandroid/database/sqlite/SQLiteConnection;->obtainPreparedStatement(Ljava/lang/String;JIIZJ)Landroid/database/sqlite/SQLiteConnection$PreparedStatement;
-HSPLandroid/database/sqlite/SQLiteConnection;->open()V+]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog;
-HSPLandroid/database/sqlite/SQLiteConnection;->open(Landroid/database/sqlite/SQLiteConnectionPool;Landroid/database/sqlite/SQLiteDatabaseConfiguration;IZ)Landroid/database/sqlite/SQLiteConnection;
-HSPLandroid/database/sqlite/SQLiteConnection;->prepare(Ljava/lang/String;Landroid/database/sqlite/SQLiteStatementInfo;)V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog;
-HSPLandroid/database/sqlite/SQLiteConnection;->reconfigure(Landroid/database/sqlite/SQLiteDatabaseConfiguration;)V
-HSPLandroid/database/sqlite/SQLiteConnection;->recyclePreparedStatement(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V
-HSPLandroid/database/sqlite/SQLiteConnection;->releasePreparedStatement(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V
-HSPLandroid/database/sqlite/SQLiteConnection;->releasePreparedStatementLI(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V+]Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;
-HSPLandroid/database/sqlite/SQLiteConnection;->setAutoCheckpointInterval()V
-HSPLandroid/database/sqlite/SQLiteConnection;->setCustomFunctionsFromConfiguration()V
-HSPLandroid/database/sqlite/SQLiteConnection;->setForeignKeyModeFromConfiguration()V
-HSPLandroid/database/sqlite/SQLiteConnection;->setJournalFromConfiguration()V
-HSPLandroid/database/sqlite/SQLiteConnection;->setJournalMode(Ljava/lang/String;)V
-HSPLandroid/database/sqlite/SQLiteConnection;->setJournalSizeLimit()V
-HSPLandroid/database/sqlite/SQLiteConnection;->setLocaleFromConfiguration()V
-HSPLandroid/database/sqlite/SQLiteConnection;->setOnlyAllowReadOnlyOperations(Z)V
-HSPLandroid/database/sqlite/SQLiteConnection;->setPageSize()V
-HSPLandroid/database/sqlite/SQLiteConnection;->setSyncMode(Ljava/lang/String;)V
-HSPLandroid/database/sqlite/SQLiteConnection;->setSyncModeFromConfiguration()V
-HSPLandroid/database/sqlite/SQLiteConnection;->throwIfStatementForbidden(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;-><init>()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;-><init>(Landroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter-IA;)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool$IdleConnectionHandler;->connectionAcquired(Landroid/database/sqlite/SQLiteConnection;)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool$IdleConnectionHandler;->connectionClosed(Landroid/database/sqlite/SQLiteConnection;)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool$IdleConnectionHandler;->connectionReleased(Landroid/database/sqlite/SQLiteConnection;)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool$IdleConnectionHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;-><init>(Landroid/database/sqlite/SQLiteDatabaseConfiguration;)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->acquireConnection(Ljava/lang/String;ILandroid/os/CancellationSignal;)Landroid/database/sqlite/SQLiteConnection;
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->clearAcquiredConnectionsPreparedStatementCache()V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;]Ljava/util/Iterator;Ljava/util/WeakHashMap$KeyIterator;]Ljava/util/Set;Ljava/util/WeakHashMap$KeySet;
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->close()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->closeAvailableConnectionLocked(I)Z
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->closeAvailableConnectionsAndLogExceptionsLocked()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->closeAvailableNonPrimaryConnectionsAndLogExceptions()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->closeAvailableNonPrimaryConnectionsAndLogExceptionsLocked()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->closeConnectionAndLogExceptionsLocked(Landroid/database/sqlite/SQLiteConnection;)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->closeExcessConnectionsAndLogExceptionsLocked()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->collectDbStats(Ljava/util/ArrayList;)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->disableIdleConnectionHandler()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->discardAcquiredConnectionsLocked()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->dispose(Z)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->dump(Landroid/util/Printer;ZLandroid/util/ArraySet;)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->finalize()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->finishAcquireConnectionLocked(Landroid/database/sqlite/SQLiteConnection;I)V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->getPath()Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->getPriority(I)I
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->isSessionBlockingImportantConnectionWaitersLocked(ZI)Z
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->markAcquiredConnectionsLocked(Landroid/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->obtainConnectionWaiterLocked(Ljava/lang/Thread;JIZLjava/lang/String;I)Landroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->onStatementExecuted(J)V+]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong;
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->open()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->open(Landroid/database/sqlite/SQLiteDatabaseConfiguration;)Landroid/database/sqlite/SQLiteConnectionPool;
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->openConnectionLocked(Landroid/database/sqlite/SQLiteDatabaseConfiguration;Z)Landroid/database/sqlite/SQLiteConnection;
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->reconfigure(Landroid/database/sqlite/SQLiteDatabaseConfiguration;)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->reconfigureAllConnectionsLocked()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->recycleConnectionLocked(Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;)Z
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->recycleConnectionWaiterLocked(Landroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->releaseConnection(Landroid/database/sqlite/SQLiteConnection;)V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->setMaxConnectionPoolSizeLocked()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->shouldYieldConnection(Landroid/database/sqlite/SQLiteConnection;I)Z
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->throwIfClosedLocked()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->tryAcquireNonPrimaryConnectionLocked(Ljava/lang/String;I)Landroid/database/sqlite/SQLiteConnection;+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->tryAcquirePrimaryConnectionLocked(I)Landroid/database/sqlite/SQLiteConnection;
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->waitForConnection(Ljava/lang/String;ILandroid/os/CancellationSignal;)Landroid/database/sqlite/SQLiteConnection;+]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean;
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->wakeConnectionWaitersLocked()V
-HSPLandroid/database/sqlite/SQLiteConstraintException;-><init>(Ljava/lang/String;)V
-HSPLandroid/database/sqlite/SQLiteCursor;-><init>(Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)V+]Landroid/database/sqlite/SQLiteQuery;Landroid/database/sqlite/SQLiteQuery;
-HSPLandroid/database/sqlite/SQLiteCursor;->close()V+]Landroid/database/sqlite/SQLiteCursorDriver;Landroid/database/sqlite/SQLiteDirectCursorDriver;]Landroid/database/sqlite/SQLiteQuery;Landroid/database/sqlite/SQLiteQuery;
-HSPLandroid/database/sqlite/SQLiteCursor;->fillWindow(I)V+]Landroid/database/CursorWindow;Landroid/database/CursorWindow;]Landroid/database/sqlite/SQLiteCursor;Landroid/database/sqlite/SQLiteCursor;]Landroid/database/sqlite/SQLiteQuery;Landroid/database/sqlite/SQLiteQuery;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteCursor;->finalize()V
-HSPLandroid/database/sqlite/SQLiteCursor;->getColumnIndex(Ljava/lang/String;)I+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/Map;Ljava/util/HashMap;
-HSPLandroid/database/sqlite/SQLiteCursor;->getColumnNames()[Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteCursor;->getCount()I
-HSPLandroid/database/sqlite/SQLiteCursor;->getDatabase()Landroid/database/sqlite/SQLiteDatabase;+]Landroid/database/sqlite/SQLiteQuery;Landroid/database/sqlite/SQLiteQuery;
-HSPLandroid/database/sqlite/SQLiteCursor;->onMove(II)Z+]Landroid/database/CursorWindow;Landroid/database/CursorWindow;
-HSPLandroid/database/sqlite/SQLiteDatabase$$ExternalSyntheticLambda0;-><init>(Landroid/database/sqlite/SQLiteDatabase;)V
-HSPLandroid/database/sqlite/SQLiteDatabase$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
-HSPLandroid/database/sqlite/SQLiteDatabase$$ExternalSyntheticLambda2;-><init>()V
-HSPLandroid/database/sqlite/SQLiteDatabase$1;-><init>(Ljava/lang/String;)V
-HSPLandroid/database/sqlite/SQLiteDatabase$1;->accept(Ljava/io/File;)Z
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;-><init>()V
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;-><init>(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)V
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;->addOpenFlags(I)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;->build()Landroid/database/sqlite/SQLiteDatabase$OpenParams;
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;->isWriteAheadLoggingEnabled()Z
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;->removeOpenFlags(I)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;->setCursorFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;->setErrorHandler(Landroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;->setIdleConnectionTimeout(J)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;->setWriteAheadLoggingEnabled(Z)V
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->-$$Nest$fgetmCursorFactory(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Landroid/database/sqlite/SQLiteDatabase$CursorFactory;
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->-$$Nest$fgetmErrorHandler(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Landroid/database/DatabaseErrorHandler;
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->-$$Nest$fgetmIdleConnectionTimeout(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)J
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->-$$Nest$fgetmJournalMode(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->-$$Nest$fgetmLookasideSlotCount(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)I
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->-$$Nest$fgetmLookasideSlotSize(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)I
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->-$$Nest$fgetmOpenFlags(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)I
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->-$$Nest$fgetmSyncMode(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;-><init>(ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;IIJLjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;-><init>(ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;IIJLjava/lang/String;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$OpenParams-IA;)V
-HSPLandroid/database/sqlite/SQLiteDatabase;-><init>(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;IIJLjava/lang/String;Ljava/lang/String;)V+]Landroid/database/sqlite/SQLiteDatabaseConfiguration;Landroid/database/sqlite/SQLiteDatabaseConfiguration;
-HSPLandroid/database/sqlite/SQLiteDatabase;->beginTransaction()V
-HSPLandroid/database/sqlite/SQLiteDatabase;->beginTransaction(Landroid/database/sqlite/SQLiteTransactionListener;Z)V
-HSPLandroid/database/sqlite/SQLiteDatabase;->beginTransactionNonExclusive()V
-HSPLandroid/database/sqlite/SQLiteDatabase;->beginTransactionWithListener(Landroid/database/sqlite/SQLiteTransactionListener;)V
-HSPLandroid/database/sqlite/SQLiteDatabase;->collectDbStats(Ljava/util/ArrayList;)V
-HSPLandroid/database/sqlite/SQLiteDatabase;->compileStatement(Ljava/lang/String;)Landroid/database/sqlite/SQLiteStatement;
-HSPLandroid/database/sqlite/SQLiteDatabase;->createSession()Landroid/database/sqlite/SQLiteSession;
-HSPLandroid/database/sqlite/SQLiteDatabase;->delete(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)I
-HSPLandroid/database/sqlite/SQLiteDatabase;->deleteDatabase(Ljava/io/File;)Z
-HSPLandroid/database/sqlite/SQLiteDatabase;->deleteDatabase(Ljava/io/File;Z)Z
-HSPLandroid/database/sqlite/SQLiteDatabase;->disableWriteAheadLogging()V
-HSPLandroid/database/sqlite/SQLiteDatabase;->dispose(Z)V
-HSPLandroid/database/sqlite/SQLiteDatabase;->dumpAll(Landroid/util/Printer;ZZ)V
-HSPLandroid/database/sqlite/SQLiteDatabase;->dumpDatabaseDirectory(Landroid/util/Printer;Ljava/io/File;Z)V
-HSPLandroid/database/sqlite/SQLiteDatabase;->enableWriteAheadLogging()Z
-HSPLandroid/database/sqlite/SQLiteDatabase;->endTransaction()V
-HSPLandroid/database/sqlite/SQLiteDatabase;->execSQL(Ljava/lang/String;)V
-HSPLandroid/database/sqlite/SQLiteDatabase;->execSQL(Ljava/lang/String;[Ljava/lang/Object;)V
-HSPLandroid/database/sqlite/SQLiteDatabase;->executeSql(Ljava/lang/String;[Ljava/lang/Object;)I
-HSPLandroid/database/sqlite/SQLiteDatabase;->finalize()V
-HSPLandroid/database/sqlite/SQLiteDatabase;->findEditTable(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteDatabase;->getActiveDatabasePools()Ljava/util/ArrayList;
-HSPLandroid/database/sqlite/SQLiteDatabase;->getActiveDatabases()Ljava/util/ArrayList;
-HSPLandroid/database/sqlite/SQLiteDatabase;->getFileTimestamps(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteDatabase;->getMaximumSize()J
-HSPLandroid/database/sqlite/SQLiteDatabase;->getPageSize()J
-HSPLandroid/database/sqlite/SQLiteDatabase;->getPath()Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteDatabase;->getThreadDefaultConnectionFlags(Z)I
-HSPLandroid/database/sqlite/SQLiteDatabase;->getThreadSession()Landroid/database/sqlite/SQLiteSession;+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;
-HSPLandroid/database/sqlite/SQLiteDatabase;->getVersion()I
-HSPLandroid/database/sqlite/SQLiteDatabase;->inTransaction()Z+]Landroid/database/sqlite/SQLiteSession;Landroid/database/sqlite/SQLiteSession;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteDatabase;->insert(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J
-HSPLandroid/database/sqlite/SQLiteDatabase;->insertOrThrow(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J
-HSPLandroid/database/sqlite/SQLiteDatabase;->insertWithOnConflict(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;I)J
-HSPLandroid/database/sqlite/SQLiteDatabase;->isMainThread()Z
-HSPLandroid/database/sqlite/SQLiteDatabase;->isOpen()Z
-HSPLandroid/database/sqlite/SQLiteDatabase;->isReadOnly()Z
-HSPLandroid/database/sqlite/SQLiteDatabase;->isReadOnlyLocked()Z
-HSPLandroid/database/sqlite/SQLiteDatabase;->isWriteAheadLoggingEnabled()Z
-HSPLandroid/database/sqlite/SQLiteDatabase;->onAllReferencesReleased()V
-HSPLandroid/database/sqlite/SQLiteDatabase;->open()V
-HSPLandroid/database/sqlite/SQLiteDatabase;->openDatabase(Ljava/io/File;Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteDatabase;->openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;I)Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteDatabase;->openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ILandroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteDatabase;->openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteDatabase;->openInner()V
-HSPLandroid/database/sqlite/SQLiteDatabase;->openOrCreateDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteDatabase;->query(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/database/sqlite/SQLiteDatabase;->query(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/database/sqlite/SQLiteDatabase;->query(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/database/sqlite/SQLiteDatabase;->query(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
-HSPLandroid/database/sqlite/SQLiteDatabase;->queryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;+]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteDatabase;->rawQuery(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/database/sqlite/SQLiteDatabase;->rawQuery(Ljava/lang/String;[Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
-HSPLandroid/database/sqlite/SQLiteDatabase;->rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;+]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteDatabase;->rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;+]Landroid/database/sqlite/SQLiteCursorDriver;Landroid/database/sqlite/SQLiteDirectCursorDriver;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteDatabase;->releaseMemory()I
-HSPLandroid/database/sqlite/SQLiteDatabase;->replace(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J
-HSPLandroid/database/sqlite/SQLiteDatabase;->replaceOrThrow(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J
-HSPLandroid/database/sqlite/SQLiteDatabase;->setForeignKeyConstraintsEnabled(Z)V
-HSPLandroid/database/sqlite/SQLiteDatabase;->setTransactionSuccessful()V
-HSPLandroid/database/sqlite/SQLiteDatabase;->throwIfNotOpenLocked()V
-HSPLandroid/database/sqlite/SQLiteDatabase;->update(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I
-HSPLandroid/database/sqlite/SQLiteDatabase;->updateWithOnConflict(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;I)I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/ContentValues;Landroid/content/ContentValues;]Landroid/database/sqlite/SQLiteStatement;Landroid/database/sqlite/SQLiteStatement;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;
-HSPLandroid/database/sqlite/SQLiteDatabase;->validateSql(Ljava/lang/String;Landroid/os/CancellationSignal;)V
-HSPLandroid/database/sqlite/SQLiteDatabase;->yieldIfContendedHelper(ZJ)Z
-HSPLandroid/database/sqlite/SQLiteDatabase;->yieldIfContendedSafely(J)Z
-HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;-><init>(Landroid/database/sqlite/SQLiteDatabaseConfiguration;)V
-HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;-><init>(Ljava/lang/String;I)V
-HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->isInMemoryDb()Z+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->isLegacyCompatibilityWalEnabled()Z
-HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->isReadOnlyDatabase()Z
-HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->isWalEnabledInternal()Z
-HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->resolveJournalMode()Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->resolveSyncMode()Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->stripPathForLogs(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->updateParametersFrom(Landroid/database/sqlite/SQLiteDatabaseConfiguration;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/database/sqlite/SQLiteDebug$NoPreloadHolder;-><clinit>()V
-HSPLandroid/database/sqlite/SQLiteDebug;->getDatabaseInfo()Landroid/database/sqlite/SQLiteDebug$PagerStats;
-HSPLandroid/database/sqlite/SQLiteDebug;->shouldLogSlowQuery(J)Z
-HSPLandroid/database/sqlite/SQLiteDirectCursorDriver;-><init>(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)V
-HSPLandroid/database/sqlite/SQLiteDirectCursorDriver;->cursorClosed()V
-HSPLandroid/database/sqlite/SQLiteDirectCursorDriver;->query(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;[Ljava/lang/String;)Landroid/database/Cursor;+]Landroid/database/sqlite/SQLiteQuery;Landroid/database/sqlite/SQLiteQuery;
-HSPLandroid/database/sqlite/SQLiteException;-><init>(Ljava/lang/String;)V
-HSPLandroid/database/sqlite/SQLiteGlobal;->checkDbWipe()Z
-HSPLandroid/database/sqlite/SQLiteGlobal;->getDefaultJournalMode()Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteGlobal;->getDefaultPageSize()I
-HSPLandroid/database/sqlite/SQLiteGlobal;->getDefaultSyncMode()Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteGlobal;->getJournalSizeLimit()I
-HSPLandroid/database/sqlite/SQLiteGlobal;->getWALAutoCheckpoint()I
-HSPLandroid/database/sqlite/SQLiteGlobal;->getWALConnectionPoolSize()I
-HSPLandroid/database/sqlite/SQLiteGlobal;->getWALSyncMode()Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteGlobal;->getWALTruncateSize()J
-HSPLandroid/database/sqlite/SQLiteGlobal;->releaseMemory()I
-HSPLandroid/database/sqlite/SQLiteOpenHelper;-><init>(Landroid/content/Context;Ljava/lang/String;IILandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;)V
-HSPLandroid/database/sqlite/SQLiteOpenHelper;-><init>(Landroid/content/Context;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;I)V
-HSPLandroid/database/sqlite/SQLiteOpenHelper;-><init>(Landroid/content/Context;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;IILandroid/database/DatabaseErrorHandler;)V
-HSPLandroid/database/sqlite/SQLiteOpenHelper;-><init>(Landroid/content/Context;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ILandroid/database/DatabaseErrorHandler;)V
-HSPLandroid/database/sqlite/SQLiteOpenHelper;->close()V
-HSPLandroid/database/sqlite/SQLiteOpenHelper;->getDatabaseLocked(Z)Landroid/database/sqlite/SQLiteDatabase;+]Ljava/io/File;Ljava/io/File;]Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteOpenHelper;->getDatabaseName()Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteOpenHelper;->getReadableDatabase()Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteOpenHelper;->getWritableDatabase()Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteOpenHelper;->onConfigure(Landroid/database/sqlite/SQLiteDatabase;)V
-HSPLandroid/database/sqlite/SQLiteOpenHelper;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V
-HSPLandroid/database/sqlite/SQLiteOpenHelper;->setFilePermissionsForDb(Ljava/lang/String;)V
-HSPLandroid/database/sqlite/SQLiteOpenHelper;->setIdleConnectionTimeout(J)V
-HSPLandroid/database/sqlite/SQLiteOpenHelper;->setOpenParamsBuilder(Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;)V
-HSPLandroid/database/sqlite/SQLiteOpenHelper;->setWriteAheadLoggingEnabled(Z)V
-HSPLandroid/database/sqlite/SQLiteProgram;-><init>(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)V+]Ljava/lang/String;Ljava/lang/String;]Landroid/database/sqlite/SQLiteSession;Landroid/database/sqlite/SQLiteSession;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteProgram;->bind(ILjava/lang/Object;)V
-HSPLandroid/database/sqlite/SQLiteProgram;->bindAllArgsAsStrings([Ljava/lang/String;)V+]Landroid/database/sqlite/SQLiteProgram;Landroid/database/sqlite/SQLiteQuery;,Landroid/database/sqlite/SQLiteStatement;
-HSPLandroid/database/sqlite/SQLiteProgram;->bindBlob(I[B)V
-HSPLandroid/database/sqlite/SQLiteProgram;->bindDouble(ID)V
-HSPLandroid/database/sqlite/SQLiteProgram;->bindLong(IJ)V
-HSPLandroid/database/sqlite/SQLiteProgram;->bindNull(I)V
-HSPLandroid/database/sqlite/SQLiteProgram;->bindString(ILjava/lang/String;)V
-HSPLandroid/database/sqlite/SQLiteProgram;->clearBindings()V
-HSPLandroid/database/sqlite/SQLiteProgram;->getBindArgs()[Ljava/lang/Object;
-HSPLandroid/database/sqlite/SQLiteProgram;->getColumnNames()[Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteProgram;->getConnectionFlags()I+]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteProgram;->getDatabase()Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteProgram;->getSession()Landroid/database/sqlite/SQLiteSession;+]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteProgram;->getSql()Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteProgram;->onAllReferencesReleased()V+]Landroid/database/sqlite/SQLiteProgram;Landroid/database/sqlite/SQLiteStatement;,Landroid/database/sqlite/SQLiteQuery;
-HSPLandroid/database/sqlite/SQLiteQuery;-><init>(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Landroid/os/CancellationSignal;)V
-HSPLandroid/database/sqlite/SQLiteQuery;->fillWindow(Landroid/database/CursorWindow;IIZ)I+]Landroid/database/sqlite/SQLiteSession;Landroid/database/sqlite/SQLiteSession;]Landroid/database/CursorWindow;Landroid/database/CursorWindow;]Landroid/database/sqlite/SQLiteQuery;Landroid/database/sqlite/SQLiteQuery;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;-><init>()V
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->appendClause(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->appendColumns(Ljava/lang/StringBuilder;[Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->appendWhere(Ljava/lang/CharSequence;)V
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->buildQuery([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->buildQueryString(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->computeProjection([Ljava/lang/String;)[Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->computeSingleProjection(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->computeSingleProjectionOrThrow(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->computeWhere(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->isStrict()Z
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->isStrictColumns()Z
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->isStrictGrammar()Z
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->maybeWithOperator(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->setDistinct(Z)V
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->setProjectionMap(Ljava/util/Map;)V
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->setStrict(Z)V
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->setTables(Ljava/lang/String;)V
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->wrap(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteSession$Transaction;-><init>()V
-HSPLandroid/database/sqlite/SQLiteSession$Transaction;-><init>(Landroid/database/sqlite/SQLiteSession$Transaction-IA;)V
-HSPLandroid/database/sqlite/SQLiteSession;-><init>(Landroid/database/sqlite/SQLiteConnectionPool;)V
-HSPLandroid/database/sqlite/SQLiteSession;->acquireConnection(Ljava/lang/String;ILandroid/os/CancellationSignal;)V+]Landroid/database/sqlite/SQLiteConnectionPool;Landroid/database/sqlite/SQLiteConnectionPool;
-HSPLandroid/database/sqlite/SQLiteSession;->beginTransaction(ILandroid/database/sqlite/SQLiteTransactionListener;ILandroid/os/CancellationSignal;)V
-HSPLandroid/database/sqlite/SQLiteSession;->beginTransactionUnchecked(ILandroid/database/sqlite/SQLiteTransactionListener;ILandroid/os/CancellationSignal;)V
-HSPLandroid/database/sqlite/SQLiteSession;->closeOpenDependents()V+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;
-HSPLandroid/database/sqlite/SQLiteSession;->endTransaction(Landroid/os/CancellationSignal;)V
-HSPLandroid/database/sqlite/SQLiteSession;->endTransactionUnchecked(Landroid/os/CancellationSignal;Z)V
-HSPLandroid/database/sqlite/SQLiteSession;->execute(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;
-HSPLandroid/database/sqlite/SQLiteSession;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)I+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;
-HSPLandroid/database/sqlite/SQLiteSession;->executeForCursorWindow(Ljava/lang/String;[Ljava/lang/Object;Landroid/database/CursorWindow;IIZILandroid/os/CancellationSignal;)I+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;
-HSPLandroid/database/sqlite/SQLiteSession;->executeForLastInsertedRowId(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)J
-HSPLandroid/database/sqlite/SQLiteSession;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)J
-HSPLandroid/database/sqlite/SQLiteSession;->executeForString(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteSession;->executeSpecial(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)Z+]Landroid/os/CancellationSignal;Landroid/os/CancellationSignal;
-HSPLandroid/database/sqlite/SQLiteSession;->hasNestedTransaction()Z
-HSPLandroid/database/sqlite/SQLiteSession;->hasTransaction()Z
-HSPLandroid/database/sqlite/SQLiteSession;->obtainTransaction(ILandroid/database/sqlite/SQLiteTransactionListener;)Landroid/database/sqlite/SQLiteSession$Transaction;
-HSPLandroid/database/sqlite/SQLiteSession;->prepare(Ljava/lang/String;ILandroid/os/CancellationSignal;Landroid/database/sqlite/SQLiteStatementInfo;)V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/os/CancellationSignal;Landroid/os/CancellationSignal;
-HSPLandroid/database/sqlite/SQLiteSession;->recycleTransaction(Landroid/database/sqlite/SQLiteSession$Transaction;)V
-HSPLandroid/database/sqlite/SQLiteSession;->releaseConnection()V+]Landroid/database/sqlite/SQLiteConnectionPool;Landroid/database/sqlite/SQLiteConnectionPool;
-HSPLandroid/database/sqlite/SQLiteSession;->setTransactionSuccessful()V
-HSPLandroid/database/sqlite/SQLiteSession;->throwIfNestedTransaction()V
-HSPLandroid/database/sqlite/SQLiteSession;->throwIfNoTransaction()V
-HSPLandroid/database/sqlite/SQLiteSession;->throwIfTransactionMarkedSuccessful()V
-HSPLandroid/database/sqlite/SQLiteSession;->yieldTransaction(JZLandroid/os/CancellationSignal;)Z
-HSPLandroid/database/sqlite/SQLiteSession;->yieldTransactionUnchecked(JLandroid/os/CancellationSignal;)Z
-HSPLandroid/database/sqlite/SQLiteStatement;-><init>(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;)V
-HSPLandroid/database/sqlite/SQLiteStatement;->execute()V+]Landroid/database/sqlite/SQLiteSession;Landroid/database/sqlite/SQLiteSession;]Landroid/database/sqlite/SQLiteStatement;Landroid/database/sqlite/SQLiteStatement;
-HSPLandroid/database/sqlite/SQLiteStatement;->executeInsert()J
-HSPLandroid/database/sqlite/SQLiteStatement;->executeUpdateDelete()I+]Landroid/database/sqlite/SQLiteSession;Landroid/database/sqlite/SQLiteSession;]Landroid/database/sqlite/SQLiteStatement;Landroid/database/sqlite/SQLiteStatement;
-HSPLandroid/database/sqlite/SQLiteStatement;->simpleQueryForLong()J
-HSPLandroid/database/sqlite/SQLiteStatement;->simpleQueryForString()Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteStatementInfo;-><init>()V
-HSPLandroid/ddm/DdmHandle;->putString(Ljava/nio/ByteBuffer;Ljava/lang/String;)V
-HSPLandroid/ddm/DdmHandleAppName$Names;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/ddm/DdmHandleAppName$Names;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/ddm/DdmHandleAppName$Names-IA;)V
-HSPLandroid/ddm/DdmHandleAppName;->sendAPNM(Ljava/lang/String;Ljava/lang/String;I)V
-HSPLandroid/ddm/DdmHandleAppName;->setAppName(Ljava/lang/String;I)V
-HSPLandroid/ddm/DdmHandleAppName;->setAppName(Ljava/lang/String;Ljava/lang/String;I)V
-HSPLandroid/ddm/DdmHandleHeap;->handleChunk(Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;
-HSPLandroid/ddm/DdmHandleHello;->handleChunk(Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;
-HSPLandroid/ddm/DdmHandleHello;->handleFEAT(Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;
-HSPLandroid/ddm/DdmHandleHello;->handleHELO(Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;
-HSPLandroid/ddm/DdmHandleProfiling;->handleChunk(Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;
-HSPLandroid/graphics/BLASTBufferQueue;-><init>(Ljava/lang/String;Landroid/view/SurfaceControl;III)V
-HSPLandroid/graphics/BLASTBufferQueue;-><init>(Ljava/lang/String;Z)V
-HSPLandroid/graphics/BLASTBufferQueue;->createSurface()Landroid/view/Surface;
-HSPLandroid/graphics/BLASTBufferQueue;->destroy()V
-HSPLandroid/graphics/BLASTBufferQueue;->finalize()V
-HSPLandroid/graphics/BLASTBufferQueue;->gatherPendingTransactions(J)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/graphics/BLASTBufferQueue;->isSameSurfaceControl(Landroid/view/SurfaceControl;)Z
-HSPLandroid/graphics/BLASTBufferQueue;->mergeWithNextTransaction(Landroid/view/SurfaceControl$Transaction;J)V
-HSPLandroid/graphics/BLASTBufferQueue;->setTransactionHangCallback(Landroid/graphics/BLASTBufferQueue$TransactionHangCallback;)V
-HSPLandroid/graphics/BLASTBufferQueue;->update(Landroid/view/SurfaceControl;III)V
-HSPLandroid/graphics/BaseCanvas;-><init>()V
-HSPLandroid/graphics/BaseCanvas;->drawARGB(IIII)V
-HSPLandroid/graphics/BaseCanvas;->drawArc(FFFFFFZLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseCanvas;->drawArc(Landroid/graphics/RectF;FFZLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseCanvas;->drawBitmap(Landroid/graphics/Bitmap;FFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseCanvas;->drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Matrix;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseCanvas;->drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseCanvas;->drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/RectF;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseCanvas;->drawColor(I)V
-HSPLandroid/graphics/BaseCanvas;->drawLine(FFFFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseCanvas;->drawPath(Landroid/graphics/Path;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseCanvas;->drawText(Ljava/lang/CharSequence;IIFFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseCanvas;->drawTextRun(Ljava/lang/CharSequence;IIIIFFZLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseCanvas;->throwIfCannotDraw(Landroid/graphics/Bitmap;)V
-HSPLandroid/graphics/BaseCanvas;->throwIfHasHwFeaturesInSwMode(Landroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseCanvas;->throwIfHasHwFeaturesInSwMode(Landroid/graphics/Shader;)V
-HSPLandroid/graphics/BaseCanvas;->throwIfHwBitmapInSwMode(Landroid/graphics/Bitmap;)V
-HSPLandroid/graphics/BaseRecordingCanvas;-><init>(J)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawArc(Landroid/graphics/RectF;FFZLandroid/graphics/Paint;)V+]Landroid/graphics/BaseRecordingCanvas;Landroid/graphics/RecordingCanvas;
-HSPLandroid/graphics/BaseRecordingCanvas;->drawBitmap(Landroid/graphics/Bitmap;FFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawCircle(FFFLandroid/graphics/Paint;)V+]Landroid/graphics/Paint;Landroid/graphics/Paint;
-HSPLandroid/graphics/BaseRecordingCanvas;->drawColor(I)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawColor(ILandroid/graphics/PorterDuff$Mode;)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawLine(FFFFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawOval(FFFFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawOval(Landroid/graphics/RectF;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawPatch(Landroid/graphics/NinePatch;Landroid/graphics/Rect;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawPath(Landroid/graphics/Path;Landroid/graphics/Paint;)V+]Landroid/graphics/Paint;Landroid/graphics/Paint;]Landroid/graphics/Path;Landroid/graphics/Path;
-HSPLandroid/graphics/BaseRecordingCanvas;->drawRect(FFFFLandroid/graphics/Paint;)V+]Landroid/graphics/Paint;Landroid/graphics/Paint;
-HSPLandroid/graphics/BaseRecordingCanvas;->drawRect(Landroid/graphics/Rect;Landroid/graphics/Paint;)V+]Landroid/graphics/BaseRecordingCanvas;Landroid/graphics/RecordingCanvas;
-HSPLandroid/graphics/BaseRecordingCanvas;->drawRect(Landroid/graphics/RectF;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawRoundRect(FFFFFFLandroid/graphics/Paint;)V+]Landroid/graphics/Paint;Landroid/graphics/Paint;
-HSPLandroid/graphics/BaseRecordingCanvas;->drawRoundRect(Landroid/graphics/RectF;FFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawText(Ljava/lang/CharSequence;IIFFLandroid/graphics/Paint;)V+]Landroid/graphics/Paint;Landroid/text/TextPaint;]Ljava/lang/CharSequence;Ljava/lang/String;,Landroid/text/Layout$Ellipsizer;
-HSPLandroid/graphics/BaseRecordingCanvas;->drawText(Ljava/lang/String;FFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawTextRun(Ljava/lang/CharSequence;IIIIFFZLandroid/graphics/Paint;)V+]Landroid/graphics/Paint;Landroid/text/TextPaint;]Ljava/lang/CharSequence;Landroid/text/SpannableString;
-HSPLandroid/graphics/BaseRecordingCanvas;->drawTextRun([CIIIIFFZLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Bitmap$1;->createFromParcel(Landroid/os/Parcel;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/Bitmap$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/graphics/Bitmap$Config;->nativeToConfig(I)Landroid/graphics/Bitmap$Config;
-HSPLandroid/graphics/Bitmap$Config;->values()[Landroid/graphics/Bitmap$Config;
-HSPLandroid/graphics/Bitmap;-><init>(JIIIZ[BLandroid/graphics/NinePatch$InsetStruct;Z)V
-HSPLandroid/graphics/Bitmap;->checkHardware(Ljava/lang/String;)V
-HSPLandroid/graphics/Bitmap;->checkPixelAccess(II)V
-HSPLandroid/graphics/Bitmap;->checkPixelsAccess(IIIIII[I)V
-HSPLandroid/graphics/Bitmap;->checkRecycled(Ljava/lang/String;)V
-HSPLandroid/graphics/Bitmap;->checkWidthHeight(II)V
-HSPLandroid/graphics/Bitmap;->checkXYSign(II)V
-HSPLandroid/graphics/Bitmap;->compress(Landroid/graphics/Bitmap$CompressFormat;ILjava/io/OutputStream;)Z
-HSPLandroid/graphics/Bitmap;->copy(Landroid/graphics/Bitmap$Config;Z)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/Bitmap;->copyPixelsToBuffer(Ljava/nio/Buffer;)V
-HSPLandroid/graphics/Bitmap;->createBitmap(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/Bitmap;->createBitmap(IILandroid/graphics/Bitmap$Config;Z)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/Bitmap;->createBitmap(Landroid/graphics/Bitmap;IIII)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/Bitmap;->createBitmap(Landroid/graphics/Bitmap;IIIILandroid/graphics/Matrix;Z)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/Bitmap;->createBitmap(Landroid/util/DisplayMetrics;IILandroid/graphics/Bitmap$Config;Z)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/Bitmap;->createBitmap(Landroid/util/DisplayMetrics;IILandroid/graphics/Bitmap$Config;ZLandroid/graphics/ColorSpace;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/Bitmap;->createScaledBitmap(Landroid/graphics/Bitmap;IIZ)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/Bitmap;->eraseColor(I)V
-HSPLandroid/graphics/Bitmap;->extractAlpha(Landroid/graphics/Paint;[I)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/Bitmap;->getAllocationByteCount()I
-HSPLandroid/graphics/Bitmap;->getByteCount()I
-HSPLandroid/graphics/Bitmap;->getColorSpace()Landroid/graphics/ColorSpace;
-HSPLandroid/graphics/Bitmap;->getConfig()Landroid/graphics/Bitmap$Config;
-HSPLandroid/graphics/Bitmap;->getDefaultDensity()I
-HSPLandroid/graphics/Bitmap;->getDensity()I
-HSPLandroid/graphics/Bitmap;->getHeight()I
-HSPLandroid/graphics/Bitmap;->getNativeInstance()J
-HSPLandroid/graphics/Bitmap;->getNinePatchChunk()[B
-HSPLandroid/graphics/Bitmap;->getNinePatchInsets()Landroid/graphics/NinePatch$InsetStruct;
-HSPLandroid/graphics/Bitmap;->getOpticalInsets(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/Bitmap;->getPixel(II)I
-HSPLandroid/graphics/Bitmap;->getPixels([IIIIIII)V
-HSPLandroid/graphics/Bitmap;->getRowBytes()I
-HSPLandroid/graphics/Bitmap;->getScaledHeight(I)I
-HSPLandroid/graphics/Bitmap;->getScaledWidth(I)I
-HSPLandroid/graphics/Bitmap;->getWidth()I
-HSPLandroid/graphics/Bitmap;->hasAlpha()Z
-HSPLandroid/graphics/Bitmap;->hasGainmap()Z
-HSPLandroid/graphics/Bitmap;->hasMipMap()Z
-HSPLandroid/graphics/Bitmap;->isMutable()Z
-HSPLandroid/graphics/Bitmap;->isPremultiplied()Z
-HSPLandroid/graphics/Bitmap;->isRecycled()Z
-HSPLandroid/graphics/Bitmap;->noteHardwareBitmapSlowCall()V
-HSPLandroid/graphics/Bitmap;->prepareToDraw()V
-HSPLandroid/graphics/Bitmap;->reconfigure(IILandroid/graphics/Bitmap$Config;)V
-HSPLandroid/graphics/Bitmap;->recycle()V
-HSPLandroid/graphics/Bitmap;->reinit(IIZ)V
-HSPLandroid/graphics/Bitmap;->scaleFromDensity(III)I
-HSPLandroid/graphics/Bitmap;->setDefaultDensity(I)V
-HSPLandroid/graphics/Bitmap;->setDensity(I)V
-HSPLandroid/graphics/Bitmap;->setHasAlpha(Z)V
-HSPLandroid/graphics/Bitmap;->setHasMipMap(Z)V
-HSPLandroid/graphics/Bitmap;->setPremultiplied(Z)V
-HSPLandroid/graphics/Bitmap;->wrapHardwareBuffer(Landroid/hardware/HardwareBuffer;Landroid/graphics/ColorSpace;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/Bitmap;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/graphics/BitmapFactory$Options;-><init>()V
-HSPLandroid/graphics/BitmapFactory$Options;->nativeColorSpace(Landroid/graphics/BitmapFactory$Options;)J
-HSPLandroid/graphics/BitmapFactory$Options;->nativeInBitmap(Landroid/graphics/BitmapFactory$Options;)J
-HSPLandroid/graphics/BitmapFactory$Options;->validate(Landroid/graphics/BitmapFactory$Options;)V
-HSPLandroid/graphics/BitmapFactory;->decodeByteArray([BII)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/BitmapFactory;->decodeByteArray([BIILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/BitmapFactory;->decodeFile(Ljava/lang/String;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/BitmapFactory;->decodeFileDescriptor(Ljava/io/FileDescriptor;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/BitmapFactory;->decodeFileDescriptor(Ljava/io/FileDescriptor;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/BitmapFactory;->decodeResource(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/BitmapFactory;->decodeResource(Landroid/content/res/Resources;ILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/BitmapFactory;->decodeResourceStream(Landroid/content/res/Resources;Landroid/util/TypedValue;Ljava/io/InputStream;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/BitmapFactory;->decodeStream(Ljava/io/InputStream;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/BitmapFactory;->decodeStream(Ljava/io/InputStream;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/BitmapFactory;->decodeStreamInternal(Ljava/io/InputStream;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/BitmapFactory;->setDensityFromOptions(Landroid/graphics/Bitmap;Landroid/graphics/BitmapFactory$Options;)V
-HSPLandroid/graphics/BitmapShader;-><init>(Landroid/graphics/Bitmap;II)V
-HSPLandroid/graphics/BitmapShader;-><init>(Landroid/graphics/Bitmap;Landroid/graphics/Shader$TileMode;Landroid/graphics/Shader$TileMode;)V
-HSPLandroid/graphics/BitmapShader;->createNativeInstance(JZ)J
-HSPLandroid/graphics/BitmapShader;->shouldDiscardNativeInstance(Z)Z
-HSPLandroid/graphics/BlendMode;->blendModeToPorterDuffMode(Landroid/graphics/BlendMode;)Landroid/graphics/PorterDuff$Mode;
-HSPLandroid/graphics/BlendMode;->fromValue(I)Landroid/graphics/BlendMode;
-HSPLandroid/graphics/BlendMode;->getXfermode()Landroid/graphics/Xfermode;
-HSPLandroid/graphics/BlendMode;->toValue(Landroid/graphics/BlendMode;)I
-HSPLandroid/graphics/BlendModeColorFilter;-><init>(ILandroid/graphics/BlendMode;)V
-HSPLandroid/graphics/BlendModeColorFilter;->createNativeInstance()J
-HSPLandroid/graphics/BlendModeColorFilter;->getColor()I
-HSPLandroid/graphics/BlendModeColorFilter;->getMode()Landroid/graphics/BlendMode;
-HSPLandroid/graphics/BlurMaskFilter;-><init>(FLandroid/graphics/BlurMaskFilter$Blur;)V
-HSPLandroid/graphics/Canvas;-><init>()V
-HSPLandroid/graphics/Canvas;-><init>(J)V
-HSPLandroid/graphics/Canvas;-><init>(Landroid/graphics/Bitmap;)V
-HSPLandroid/graphics/Canvas;->checkValidClipOp(Landroid/graphics/Region$Op;)V
-HSPLandroid/graphics/Canvas;->clipPath(Landroid/graphics/Path;)Z
-HSPLandroid/graphics/Canvas;->clipPath(Landroid/graphics/Path;Landroid/graphics/Region$Op;)Z
-HSPLandroid/graphics/Canvas;->clipRect(FFFF)Z
-HSPLandroid/graphics/Canvas;->clipRect(IIII)Z
-HSPLandroid/graphics/Canvas;->clipRect(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/Canvas;->clipRect(Landroid/graphics/RectF;)Z
-HSPLandroid/graphics/Canvas;->concat(Landroid/graphics/Matrix;)V
-HSPLandroid/graphics/Canvas;->disableZ()V
-HSPLandroid/graphics/Canvas;->drawARGB(IIII)V
-HSPLandroid/graphics/Canvas;->drawArc(FFFFFFZLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawArc(Landroid/graphics/RectF;FFZLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawBitmap(Landroid/graphics/Bitmap;FFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Matrix;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/RectF;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawCircle(FFFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawColor(I)V
-HSPLandroid/graphics/Canvas;->drawColor(ILandroid/graphics/PorterDuff$Mode;)V
-HSPLandroid/graphics/Canvas;->drawLine(FFFFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawOval(FFFFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawOval(Landroid/graphics/RectF;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawPath(Landroid/graphics/Path;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawRect(FFFFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawRect(Landroid/graphics/Rect;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawRect(Landroid/graphics/RectF;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawRoundRect(FFFFFFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawRoundRect(Landroid/graphics/RectF;FFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawText(Ljava/lang/CharSequence;IIFFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawText(Ljava/lang/String;FFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawTextRun(Ljava/lang/CharSequence;IIIIFFZLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->enableZ()V
-HSPLandroid/graphics/Canvas;->freeCaches()V
-HSPLandroid/graphics/Canvas;->freeTextLayoutCaches()V
-HSPLandroid/graphics/Canvas;->getClipBounds()Landroid/graphics/Rect;
-HSPLandroid/graphics/Canvas;->getClipBounds(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/Canvas;->getDensity()I
-HSPLandroid/graphics/Canvas;->getHeight()I
-HSPLandroid/graphics/Canvas;->getNativeCanvasWrapper()J
-HSPLandroid/graphics/Canvas;->getSaveCount()I
-HSPLandroid/graphics/Canvas;->getWidth()I
-HSPLandroid/graphics/Canvas;->isHardwareAccelerated()Z
-HSPLandroid/graphics/Canvas;->isOpaque()Z
-HSPLandroid/graphics/Canvas;->quickReject(FFFF)Z
-HSPLandroid/graphics/Canvas;->restore()V
-HSPLandroid/graphics/Canvas;->restoreToCount(I)V
-HSPLandroid/graphics/Canvas;->restoreUnclippedLayer(ILandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->rotate(F)V
-HSPLandroid/graphics/Canvas;->rotate(FFF)V
-HSPLandroid/graphics/Canvas;->save()I
-HSPLandroid/graphics/Canvas;->save(I)I
-HSPLandroid/graphics/Canvas;->saveLayer(FFFFLandroid/graphics/Paint;I)I
-HSPLandroid/graphics/Canvas;->saveLayer(Landroid/graphics/RectF;Landroid/graphics/Paint;)I
-HSPLandroid/graphics/Canvas;->saveLayer(Landroid/graphics/RectF;Landroid/graphics/Paint;I)I
-HSPLandroid/graphics/Canvas;->saveLayerAlpha(FFFFI)I
-HSPLandroid/graphics/Canvas;->saveLayerAlpha(FFFFII)I
-HSPLandroid/graphics/Canvas;->saveUnclippedLayer(IIII)I
-HSPLandroid/graphics/Canvas;->scale(FF)V
-HSPLandroid/graphics/Canvas;->scale(FFFF)V
-HSPLandroid/graphics/Canvas;->setBitmap(Landroid/graphics/Bitmap;)V
-HSPLandroid/graphics/Canvas;->setCompatibilityVersion(I)V
-HSPLandroid/graphics/Canvas;->setDensity(I)V
-HSPLandroid/graphics/Canvas;->setDrawFilter(Landroid/graphics/DrawFilter;)V
-HSPLandroid/graphics/Canvas;->setScreenDensity(I)V
-HSPLandroid/graphics/Canvas;->translate(FF)V
-HSPLandroid/graphics/CanvasProperty;-><init>(J)V
-HSPLandroid/graphics/CanvasProperty;->createFloat(F)Landroid/graphics/CanvasProperty;
-HSPLandroid/graphics/CanvasProperty;->createPaint(Landroid/graphics/Paint;)Landroid/graphics/CanvasProperty;
-HSPLandroid/graphics/CanvasProperty;->getNativeContainer()J
-HSPLandroid/graphics/Color;-><init>(FFFFLandroid/graphics/ColorSpace;)V
-HSPLandroid/graphics/Color;->HSVToColor(I[F)I
-HSPLandroid/graphics/Color;->RGBToHSV(III[F)V
-HSPLandroid/graphics/Color;->alpha()F
-HSPLandroid/graphics/Color;->alpha(I)I
-HSPLandroid/graphics/Color;->alpha(J)F
-HSPLandroid/graphics/Color;->argb(IIII)I
-HSPLandroid/graphics/Color;->blue()F
-HSPLandroid/graphics/Color;->blue(I)I
-HSPLandroid/graphics/Color;->blue(J)F
-HSPLandroid/graphics/Color;->colorSpace(J)Landroid/graphics/ColorSpace;
-HSPLandroid/graphics/Color;->colorToHSV(I[F)V
-HSPLandroid/graphics/Color;->getComponents()[F
-HSPLandroid/graphics/Color;->green()F
-HSPLandroid/graphics/Color;->green(I)I
-HSPLandroid/graphics/Color;->green(J)F
-HSPLandroid/graphics/Color;->luminance()F
-HSPLandroid/graphics/Color;->pack(FFFFLandroid/graphics/ColorSpace;)J
-HSPLandroid/graphics/Color;->pack(I)J
-HSPLandroid/graphics/Color;->parseColor(Ljava/lang/String;)I
-HSPLandroid/graphics/Color;->red()F
-HSPLandroid/graphics/Color;->red(I)I
-HSPLandroid/graphics/Color;->red(J)F
-HSPLandroid/graphics/Color;->rgb(III)I
-HSPLandroid/graphics/Color;->toArgb()I
-HSPLandroid/graphics/Color;->toArgb(J)I
-HSPLandroid/graphics/Color;->valueOf(I)Landroid/graphics/Color;
-HSPLandroid/graphics/ColorFilter;-><init>()V
-HSPLandroid/graphics/ColorFilter;->getNativeInstance()J
-HSPLandroid/graphics/ColorMatrixColorFilter;-><init>(Landroid/graphics/ColorMatrix;)V
-HSPLandroid/graphics/ColorMatrixColorFilter;-><init>([F)V
-HSPLandroid/graphics/ColorMatrixColorFilter;->createNativeInstance()J
-HSPLandroid/graphics/ColorSpace$Named;->values()[Landroid/graphics/ColorSpace$Named;
-HSPLandroid/graphics/ColorSpace$Rgb$TransferParameters;-><init>(DDDDDDD)V
-HSPLandroid/graphics/ColorSpace$Rgb$TransferParameters;->hashCode()I
-HSPLandroid/graphics/ColorSpace$Rgb;-><init>(Ljava/lang/String;[FLandroid/graphics/ColorSpace$Rgb$TransferParameters;)V
-HSPLandroid/graphics/ColorSpace$Rgb;-><init>(Ljava/lang/String;[F[F[FLandroid/graphics/ColorSpace$Rgb$TransferParameters;I)V
-HSPLandroid/graphics/ColorSpace$Rgb;-><init>(Ljava/lang/String;[F[F[FLjava/util/function/DoubleUnaryOperator;Ljava/util/function/DoubleUnaryOperator;FFLandroid/graphics/ColorSpace$Rgb$TransferParameters;I)V
-HSPLandroid/graphics/ColorSpace$Rgb;->area([F)F
-HSPLandroid/graphics/ColorSpace$Rgb;->computePrimaries([F)[F
-HSPLandroid/graphics/ColorSpace$Rgb;->computeWhitePoint([F)[F
-HSPLandroid/graphics/ColorSpace$Rgb;->computeXYZMatrix([F[F)[F
-HSPLandroid/graphics/ColorSpace$Rgb;->contains([F[F)Z
-HSPLandroid/graphics/ColorSpace$Rgb;->equals(Ljava/lang/Object;)Z
-HSPLandroid/graphics/ColorSpace$Rgb;->getNativeInstance()J
-HSPLandroid/graphics/ColorSpace$Rgb;->getTransferParameters()Landroid/graphics/ColorSpace$Rgb$TransferParameters;
-HSPLandroid/graphics/ColorSpace$Rgb;->getWhitePoint()[F
-HSPLandroid/graphics/ColorSpace$Rgb;->hashCode()I
-HSPLandroid/graphics/ColorSpace$Rgb;->isGray([F)Z
-HSPLandroid/graphics/ColorSpace$Rgb;->isSrgb()Z
-HSPLandroid/graphics/ColorSpace$Rgb;->isSrgb([F[FLjava/util/function/DoubleUnaryOperator;Ljava/util/function/DoubleUnaryOperator;FFI)Z
-HSPLandroid/graphics/ColorSpace$Rgb;->isWideGamut([FFF)Z
-HSPLandroid/graphics/ColorSpace$Rgb;->xyPrimaries([F)[F
-HSPLandroid/graphics/ColorSpace$Rgb;->xyWhitePoint([F)[F
-HSPLandroid/graphics/ColorSpace;->-$$Nest$smadaptToIlluminantD50([F[F)[F
-HSPLandroid/graphics/ColorSpace;->-$$Nest$sminverse3x3([F)[F
-HSPLandroid/graphics/ColorSpace;-><init>(Ljava/lang/String;Landroid/graphics/ColorSpace$Model;I)V
-HSPLandroid/graphics/ColorSpace;->adapt(Landroid/graphics/ColorSpace;[FLandroid/graphics/ColorSpace$Adaptation;)Landroid/graphics/ColorSpace;
-HSPLandroid/graphics/ColorSpace;->adaptToIlluminantD50([F[F)[F
-HSPLandroid/graphics/ColorSpace;->chromaticAdaptation([F[F[F)[F
-HSPLandroid/graphics/ColorSpace;->compare(Landroid/graphics/ColorSpace$Rgb$TransferParameters;Landroid/graphics/ColorSpace$Rgb$TransferParameters;)Z
-HSPLandroid/graphics/ColorSpace;->compare([F[F)Z
-HSPLandroid/graphics/ColorSpace;->get(I)Landroid/graphics/ColorSpace;
-HSPLandroid/graphics/ColorSpace;->get(Landroid/graphics/ColorSpace$Named;)Landroid/graphics/ColorSpace;
-HSPLandroid/graphics/ColorSpace;->getDataSpace()I
-HSPLandroid/graphics/ColorSpace;->getId()I
-HSPLandroid/graphics/ColorSpace;->getModel()Landroid/graphics/ColorSpace$Model;
-HSPLandroid/graphics/ColorSpace;->getName()Ljava/lang/String;
-HSPLandroid/graphics/ColorSpace;->inverse3x3([F)[F
-HSPLandroid/graphics/ColorSpace;->match([FLandroid/graphics/ColorSpace$Rgb$TransferParameters;)Landroid/graphics/ColorSpace;
-HSPLandroid/graphics/ColorSpace;->mul3x3([F[F)[F
-HSPLandroid/graphics/ColorSpace;->mul3x3Diag([F[F)[F
-HSPLandroid/graphics/ColorSpace;->mul3x3Float3([F[F)[F
-HSPLandroid/graphics/Compatibility;-><clinit>()V
-HSPLandroid/graphics/Compatibility;->getTargetSdkVersion()I
-HSPLandroid/graphics/Compatibility;->setTargetSdkVersion(I)V
-HSPLandroid/graphics/DrawFilter;-><init>()V
-HSPLandroid/graphics/FrameInfo;-><init>()V
-HSPLandroid/graphics/FrameInfo;->addFlags(J)V
-HSPLandroid/graphics/FrameInfo;->markAnimationsStart()V
-HSPLandroid/graphics/FrameInfo;->markInputHandlingStart()V
-HSPLandroid/graphics/FrameInfo;->markPerformTraversalsStart()V
-HSPLandroid/graphics/FrameInfo;->setVsync(JJJJJJ)V
-HSPLandroid/graphics/HardwareRenderer$DestroyContextRunnable;-><init>(J)V
-HSPLandroid/graphics/HardwareRenderer$DestroyContextRunnable;->run()V
-HSPLandroid/graphics/HardwareRenderer$FrameDrawingCallback;->onFrameDraw(IJ)Landroid/graphics/HardwareRenderer$FrameCommitCallback;
-HSPLandroid/graphics/HardwareRenderer$FrameRenderRequest;-><init>(Landroid/graphics/HardwareRenderer;)V
-HSPLandroid/graphics/HardwareRenderer$ProcessInitializer$1;->onRotateGraphicsStatsBuffer()V
-HSPLandroid/graphics/HardwareRenderer$ProcessInitializer;->init(J)V
-HSPLandroid/graphics/HardwareRenderer$ProcessInitializer;->initDisplayInfo()V
-HSPLandroid/graphics/HardwareRenderer$ProcessInitializer;->initGraphicsStats()V
-HSPLandroid/graphics/HardwareRenderer$ProcessInitializer;->initSched(J)V
-HSPLandroid/graphics/HardwareRenderer$ProcessInitializer;->initUsingContext()V
-HSPLandroid/graphics/HardwareRenderer$ProcessInitializer;->requestBuffer()V
-HSPLandroid/graphics/HardwareRenderer$ProcessInitializer;->setContext(Landroid/content/Context;)V
-HSPLandroid/graphics/HardwareRenderer$ProcessInitializer;->setPackageName(Ljava/lang/String;)V
-HSPLandroid/graphics/HardwareRenderer;-><init>()V
-HSPLandroid/graphics/HardwareRenderer;->addObserver(Landroid/graphics/HardwareRendererObserver;)V
-HSPLandroid/graphics/HardwareRenderer;->allocateBuffers()V
-HSPLandroid/graphics/HardwareRenderer;->clearContent()V
-HSPLandroid/graphics/HardwareRenderer;->destroy()V
-HSPLandroid/graphics/HardwareRenderer;->detachSurfaceTexture(J)V
-HSPLandroid/graphics/HardwareRenderer;->dumpGlobalProfileInfo(Ljava/io/FileDescriptor;I)V
-HSPLandroid/graphics/HardwareRenderer;->isDrawingEnabled()Z
-HSPLandroid/graphics/HardwareRenderer;->loadSystemProperties()Z
-HSPLandroid/graphics/HardwareRenderer;->notifyFramePending()V
-HSPLandroid/graphics/HardwareRenderer;->onLayerDestroyed(Landroid/graphics/TextureLayer;)V
-HSPLandroid/graphics/HardwareRenderer;->pause()Z
-HSPLandroid/graphics/HardwareRenderer;->pushLayerUpdate(Landroid/graphics/TextureLayer;)V
-HSPLandroid/graphics/HardwareRenderer;->registerVectorDrawableAnimator(Landroid/view/NativeVectorDrawableAnimator;)V
-HSPLandroid/graphics/HardwareRenderer;->removeObserver(Landroid/graphics/HardwareRendererObserver;)V
-HSPLandroid/graphics/HardwareRenderer;->sendDeviceConfigurationForDebugging(Landroid/content/res/Configuration;)V
-HSPLandroid/graphics/HardwareRenderer;->setASurfaceTransactionCallback(Landroid/graphics/HardwareRenderer$ASurfaceTransactionCallback;)V
-HSPLandroid/graphics/HardwareRenderer;->setColorMode(I)F
-HSPLandroid/graphics/HardwareRenderer;->setContextForInit(Landroid/content/Context;)V
-HSPLandroid/graphics/HardwareRenderer;->setDebuggingEnabled(Z)V
-HSPLandroid/graphics/HardwareRenderer;->setFPSDivisor(I)V
-HSPLandroid/graphics/HardwareRenderer;->setFrameCallback(Landroid/graphics/HardwareRenderer$FrameDrawingCallback;)V
-HSPLandroid/graphics/HardwareRenderer;->setFrameCompleteCallback(Landroid/graphics/HardwareRenderer$FrameCompleteCallback;)V
-HSPLandroid/graphics/HardwareRenderer;->setHighContrastText(Z)V
-HSPLandroid/graphics/HardwareRenderer;->setIsSystemOrPersistent()V
-HSPLandroid/graphics/HardwareRenderer;->setLightSourceAlpha(FF)V
-HSPLandroid/graphics/HardwareRenderer;->setLightSourceGeometry(FFFF)V
-HSPLandroid/graphics/HardwareRenderer;->setName(Ljava/lang/String;)V
-HSPLandroid/graphics/HardwareRenderer;->setOpaque(Z)V
-HSPLandroid/graphics/HardwareRenderer;->setPackageName(Ljava/lang/String;)V
-HSPLandroid/graphics/HardwareRenderer;->setPrepareSurfaceControlForWebviewCallback(Landroid/graphics/HardwareRenderer$PrepareSurfaceControlForWebviewCallback;)V
-HSPLandroid/graphics/HardwareRenderer;->setRtAnimationsEnabled(Z)V
-HSPLandroid/graphics/HardwareRenderer;->setStopped(Z)V
-HSPLandroid/graphics/HardwareRenderer;->setSurface(Landroid/view/Surface;)V
-HSPLandroid/graphics/HardwareRenderer;->setSurface(Landroid/view/Surface;Z)V
-HSPLandroid/graphics/HardwareRenderer;->setSurfaceControl(Landroid/view/SurfaceControl;Landroid/graphics/BLASTBufferQueue;)V
-HSPLandroid/graphics/HardwareRenderer;->setTargetHdrSdrRatio(F)V
-HSPLandroid/graphics/HardwareRenderer;->setupDiskCache(Ljava/io/File;)V
-HSPLandroid/graphics/HardwareRenderer;->syncAndDrawFrame(Landroid/graphics/FrameInfo;)I
-HSPLandroid/graphics/HardwareRenderer;->trimMemory(I)V
-HSPLandroid/graphics/HardwareRenderer;->validateAlpha(FLjava/lang/String;)V
-HSPLandroid/graphics/HardwareRenderer;->validateFinite(FLjava/lang/String;)V
-HSPLandroid/graphics/HardwareRenderer;->validatePositive(FLjava/lang/String;)V
-HSPLandroid/graphics/HardwareRendererObserver$$ExternalSyntheticLambda0;-><init>(Landroid/graphics/HardwareRendererObserver;)V
-HSPLandroid/graphics/HardwareRendererObserver$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/graphics/HardwareRendererObserver;-><init>(Landroid/graphics/HardwareRendererObserver$OnFrameMetricsAvailableListener;[JLandroid/os/Handler;Z)V
-HSPLandroid/graphics/HardwareRendererObserver;->getNativeInstance()J
-HSPLandroid/graphics/HardwareRendererObserver;->invokeDataAvailable(Ljava/lang/ref/WeakReference;)Z+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;
-HSPLandroid/graphics/HardwareRendererObserver;->notifyDataAvailable()V+]Landroid/os/Handler;Landroid/os/Handler;,Landroid/view/ViewRootImpl$ViewRootHandler;
-HSPLandroid/graphics/ImageDecoder$AssetInputStreamSource;-><init>(Landroid/content/res/AssetManager$AssetInputStream;Landroid/content/res/Resources;Landroid/util/TypedValue;)V
-HSPLandroid/graphics/ImageDecoder$AssetInputStreamSource;->createImageDecoder(Z)Landroid/graphics/ImageDecoder;
-HSPLandroid/graphics/ImageDecoder$AssetInputStreamSource;->getDensity()I
-HSPLandroid/graphics/ImageDecoder$AssetInputStreamSource;->getResources()Landroid/content/res/Resources;
-HSPLandroid/graphics/ImageDecoder$AssetInputStreamSource;->toString()Ljava/lang/String;
-HSPLandroid/graphics/ImageDecoder$ImageDecoderSourceTrace;-><init>(Landroid/graphics/ImageDecoder;)V
-HSPLandroid/graphics/ImageDecoder$ImageDecoderSourceTrace;->close()V
-HSPLandroid/graphics/ImageDecoder$ImageInfo;-><init>(Landroid/util/Size;ZLjava/lang/String;Landroid/graphics/ColorSpace;)V
-HSPLandroid/graphics/ImageDecoder$ImageInfo;-><init>(Landroid/util/Size;ZLjava/lang/String;Landroid/graphics/ColorSpace;Landroid/graphics/ImageDecoder$ImageInfo-IA;)V
-HSPLandroid/graphics/ImageDecoder$InputStreamSource;-><init>(Landroid/content/res/Resources;Ljava/io/InputStream;I)V
-HSPLandroid/graphics/ImageDecoder$InputStreamSource;->createImageDecoder(Z)Landroid/graphics/ImageDecoder;
-HSPLandroid/graphics/ImageDecoder$InputStreamSource;->getDensity()I
-HSPLandroid/graphics/ImageDecoder$InputStreamSource;->getResources()Landroid/content/res/Resources;
-HSPLandroid/graphics/ImageDecoder$Source;-><init>()V
-HSPLandroid/graphics/ImageDecoder$Source;-><init>(Landroid/graphics/ImageDecoder$Source-IA;)V
-HSPLandroid/graphics/ImageDecoder$Source;->computeDstDensity()I
-HSPLandroid/graphics/ImageDecoder;->-$$Nest$smdescribeDecoderForTrace(Landroid/graphics/ImageDecoder;)Ljava/lang/String;
-HSPLandroid/graphics/ImageDecoder;-><init>(JIIZZ)V
-HSPLandroid/graphics/ImageDecoder;->callHeaderDecoded(Landroid/graphics/ImageDecoder$OnHeaderDecodedListener;Landroid/graphics/ImageDecoder$Source;)V
-HSPLandroid/graphics/ImageDecoder;->checkForExtended()Z
-HSPLandroid/graphics/ImageDecoder;->checkState(Z)V
-HSPLandroid/graphics/ImageDecoder;->checkSubset(IILandroid/graphics/Rect;)V
-HSPLandroid/graphics/ImageDecoder;->close()V
-HSPLandroid/graphics/ImageDecoder;->computeDensity(Landroid/graphics/ImageDecoder$Source;)I
-HSPLandroid/graphics/ImageDecoder;->createFromAsset(Landroid/content/res/AssetManager$AssetInputStream;ZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;
-HSPLandroid/graphics/ImageDecoder;->createFromStream(Ljava/io/InputStream;ZZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;
-HSPLandroid/graphics/ImageDecoder;->createSource(Landroid/content/res/Resources;Ljava/io/InputStream;I)Landroid/graphics/ImageDecoder$Source;
-HSPLandroid/graphics/ImageDecoder;->decodeBitmap(Landroid/graphics/ImageDecoder$Source;Landroid/graphics/ImageDecoder$OnHeaderDecodedListener;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/ImageDecoder;->decodeBitmapImpl(Landroid/graphics/ImageDecoder$Source;Landroid/graphics/ImageDecoder$OnHeaderDecodedListener;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/ImageDecoder;->decodeBitmapInternal()Landroid/graphics/Bitmap;
-HSPLandroid/graphics/ImageDecoder;->decodeDrawable(Landroid/graphics/ImageDecoder$Source;Landroid/graphics/ImageDecoder$OnHeaderDecodedListener;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/ImageDecoder;->decodeDrawableImpl(Landroid/graphics/ImageDecoder$Source;Landroid/graphics/ImageDecoder$OnHeaderDecodedListener;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/ImageDecoder;->describeDecoderForTrace(Landroid/graphics/ImageDecoder;)Ljava/lang/String;
-HSPLandroid/graphics/ImageDecoder;->finalize()V
-HSPLandroid/graphics/ImageDecoder;->getColorSpace()Landroid/graphics/ColorSpace;
-HSPLandroid/graphics/ImageDecoder;->getColorSpacePtr()J
-HSPLandroid/graphics/ImageDecoder;->getMimeType()Ljava/lang/String;
-HSPLandroid/graphics/ImageDecoder;->requestedResize()Z
-HSPLandroid/graphics/ImageDecoder;->setAllocator(I)V
-HSPLandroid/graphics/ImageDecoder;->setTargetSize(II)V
-HSPLandroid/graphics/Insets$1;->createFromParcel(Landroid/os/Parcel;)Landroid/graphics/Insets;
-HSPLandroid/graphics/Insets$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/graphics/Insets;-><init>(IIII)V
-HSPLandroid/graphics/Insets;-><init>(IIIILandroid/graphics/Insets-IA;)V
-HSPLandroid/graphics/Insets;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Landroid/graphics/Insets;
-HSPLandroid/graphics/Insets;->hashCode()I
-HSPLandroid/graphics/Insets;->max(Landroid/graphics/Insets;Landroid/graphics/Insets;)Landroid/graphics/Insets;
-HSPLandroid/graphics/Insets;->min(Landroid/graphics/Insets;Landroid/graphics/Insets;)Landroid/graphics/Insets;
-HSPLandroid/graphics/Insets;->of(IIII)Landroid/graphics/Insets;
-HSPLandroid/graphics/Insets;->of(Landroid/graphics/Rect;)Landroid/graphics/Insets;
-HSPLandroid/graphics/Insets;->toRect()Landroid/graphics/Rect;
-HSPLandroid/graphics/Insets;->toString()Ljava/lang/String;
-HSPLandroid/graphics/Insets;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/graphics/Interpolator;-><init>(II)V
-HSPLandroid/graphics/Interpolator;->finalize()V
-HSPLandroid/graphics/Interpolator;->setKeyFrame(II[F)V
-HSPLandroid/graphics/Interpolator;->setKeyFrame(II[F[F)V
-HSPLandroid/graphics/Interpolator;->timeToValues(I[F)Landroid/graphics/Interpolator$Result;
-HSPLandroid/graphics/Interpolator;->timeToValues([F)Landroid/graphics/Interpolator$Result;
-HSPLandroid/graphics/LeakyTypefaceStorage;->readTypefaceFromParcel(Landroid/os/Parcel;)Landroid/graphics/Typeface;
-HSPLandroid/graphics/LeakyTypefaceStorage;->writeTypefaceToParcel(Landroid/graphics/Typeface;Landroid/os/Parcel;)V
-HSPLandroid/graphics/LinearGradient;-><init>(FFFFIILandroid/graphics/Shader$TileMode;)V
-HSPLandroid/graphics/LinearGradient;-><init>(FFFFJJLandroid/graphics/Shader$TileMode;)V
-HSPLandroid/graphics/LinearGradient;-><init>(FFFF[I[FLandroid/graphics/Shader$TileMode;)V
-HSPLandroid/graphics/LinearGradient;-><init>(FFFF[J[FLandroid/graphics/Shader$TileMode;)V+][J[J
-HSPLandroid/graphics/LinearGradient;-><init>(FFFF[J[FLandroid/graphics/Shader$TileMode;Landroid/graphics/ColorSpace;)V
-HSPLandroid/graphics/LinearGradient;->createNativeInstance(JZ)J
-HSPLandroid/graphics/MaskFilter;->finalize()V
-HSPLandroid/graphics/Matrix;-><init>()V+]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry;
-HSPLandroid/graphics/Matrix;-><init>(Landroid/graphics/Matrix;)V
-HSPLandroid/graphics/Matrix;->checkPointArrays([FI[FII)V
-HSPLandroid/graphics/Matrix;->equals(Ljava/lang/Object;)Z
-HSPLandroid/graphics/Matrix;->getValues([F)V
-HSPLandroid/graphics/Matrix;->invert(Landroid/graphics/Matrix;)Z
-HSPLandroid/graphics/Matrix;->isIdentity()Z
-HSPLandroid/graphics/Matrix;->mapPoints([F)V
-HSPLandroid/graphics/Matrix;->mapPoints([FI[FII)V
-HSPLandroid/graphics/Matrix;->mapRect(Landroid/graphics/RectF;)Z+]Landroid/graphics/Matrix;Landroid/graphics/Matrix;
-HSPLandroid/graphics/Matrix;->mapRect(Landroid/graphics/RectF;Landroid/graphics/RectF;)Z
-HSPLandroid/graphics/Matrix;->ni()J
-HSPLandroid/graphics/Matrix;->postConcat(Landroid/graphics/Matrix;)Z
-HSPLandroid/graphics/Matrix;->postRotate(F)Z
-HSPLandroid/graphics/Matrix;->postRotate(FFF)Z
-HSPLandroid/graphics/Matrix;->postScale(FF)Z
-HSPLandroid/graphics/Matrix;->postScale(FFFF)Z
-HSPLandroid/graphics/Matrix;->postTranslate(FF)Z
-HSPLandroid/graphics/Matrix;->preConcat(Landroid/graphics/Matrix;)Z
-HSPLandroid/graphics/Matrix;->preRotate(F)Z
-HSPLandroid/graphics/Matrix;->preScale(FF)Z
-HSPLandroid/graphics/Matrix;->preTranslate(FF)Z
-HSPLandroid/graphics/Matrix;->rectStaysRect()Z
-HSPLandroid/graphics/Matrix;->reset()V
-HSPLandroid/graphics/Matrix;->set(Landroid/graphics/Matrix;)V
-HSPLandroid/graphics/Matrix;->setRectToRect(Landroid/graphics/RectF;Landroid/graphics/RectF;Landroid/graphics/Matrix$ScaleToFit;)Z
-HSPLandroid/graphics/Matrix;->setRotate(F)V
-HSPLandroid/graphics/Matrix;->setRotate(FFF)V
-HSPLandroid/graphics/Matrix;->setScale(FF)V
-HSPLandroid/graphics/Matrix;->setScale(FFFF)V
-HSPLandroid/graphics/Matrix;->setTranslate(FF)V
-HSPLandroid/graphics/Matrix;->setValues([F)V
-HSPLandroid/graphics/NinePatch$InsetStruct;-><init>(IIIIIIIIFIF)V
-HSPLandroid/graphics/NinePatch$InsetStruct;->scaleInsets(IIIIF)Landroid/graphics/Rect;
-HSPLandroid/graphics/NinePatch;-><init>(Landroid/graphics/Bitmap;[BLjava/lang/String;)V
-HSPLandroid/graphics/NinePatch;->draw(Landroid/graphics/Canvas;Landroid/graphics/Rect;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/NinePatch;->finalize()V
-HSPLandroid/graphics/NinePatch;->getBitmap()Landroid/graphics/Bitmap;
-HSPLandroid/graphics/NinePatch;->getDensity()I
-HSPLandroid/graphics/NinePatch;->getHeight()I
-HSPLandroid/graphics/NinePatch;->getWidth()I
-HSPLandroid/graphics/Outline;-><init>()V
-HSPLandroid/graphics/Outline;->isEmpty()Z
-HSPLandroid/graphics/Outline;->setAlpha(F)V
-HSPLandroid/graphics/Outline;->setConvexPath(Landroid/graphics/Path;)V
-HSPLandroid/graphics/Outline;->setEmpty()V+]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HSPLandroid/graphics/Outline;->setOval(IIII)V
-HSPLandroid/graphics/Outline;->setOval(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/Outline;->setPath(Landroid/graphics/Path;)V
-HSPLandroid/graphics/Outline;->setRect(IIII)V+]Landroid/graphics/Outline;Landroid/graphics/Outline;
-HSPLandroid/graphics/Outline;->setRect(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/Outline;->setRoundRect(IIIIF)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/Outline;Landroid/graphics/Outline;
-HSPLandroid/graphics/Outline;->setRoundRect(Landroid/graphics/Rect;F)V
-HSPLandroid/graphics/Paint$FontMetrics;-><init>()V
-HSPLandroid/graphics/Paint$FontMetricsInt;-><init>()V
-HSPLandroid/graphics/Paint;-><init>()V
-HSPLandroid/graphics/Paint;-><init>(I)V+]Landroid/graphics/Paint;Landroid/graphics/Paint;,Landroid/text/TextPaint;]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry;
-HSPLandroid/graphics/Paint;-><init>(Landroid/graphics/Paint;)V
-HSPLandroid/graphics/Paint;->ascent()F
-HSPLandroid/graphics/Paint;->descent()F
-HSPLandroid/graphics/Paint;->getAlpha()I
-HSPLandroid/graphics/Paint;->getColor()I
-HSPLandroid/graphics/Paint;->getColorFilter()Landroid/graphics/ColorFilter;
-HSPLandroid/graphics/Paint;->getEndHyphenEdit()I
-HSPLandroid/graphics/Paint;->getFlags()I
-HSPLandroid/graphics/Paint;->getFontFeatureSettings()Ljava/lang/String;
-HSPLandroid/graphics/Paint;->getFontMetrics()Landroid/graphics/Paint$FontMetrics;
-HSPLandroid/graphics/Paint;->getFontMetrics(Landroid/graphics/Paint$FontMetrics;)F
-HSPLandroid/graphics/Paint;->getFontMetricsInt()Landroid/graphics/Paint$FontMetricsInt;+]Landroid/graphics/Paint;Landroid/text/TextPaint;
-HSPLandroid/graphics/Paint;->getFontMetricsInt(Landroid/graphics/Paint$FontMetricsInt;)I
-HSPLandroid/graphics/Paint;->getFontMetricsInt(Ljava/lang/CharSequence;IIIIZLandroid/graphics/Paint$FontMetricsInt;)V
-HSPLandroid/graphics/Paint;->getFontVariationSettings()Ljava/lang/String;
-HSPLandroid/graphics/Paint;->getHinting()I
-HSPLandroid/graphics/Paint;->getLetterSpacing()F
-HSPLandroid/graphics/Paint;->getMaskFilter()Landroid/graphics/MaskFilter;
-HSPLandroid/graphics/Paint;->getNativeInstance()J+]Landroid/graphics/ColorFilter;Landroid/graphics/PorterDuffColorFilter;,Landroid/graphics/BlendModeColorFilter;]Landroid/graphics/Paint;missing_types]Landroid/graphics/Shader;Landroid/graphics/LinearGradient;,Landroid/graphics/drawable/RippleShader;,Landroid/graphics/BitmapShader;,Landroid/graphics/RadialGradient;
-HSPLandroid/graphics/Paint;->getRunAdvance(Ljava/lang/CharSequence;IIIIZI)F
-HSPLandroid/graphics/Paint;->getRunAdvance([CIIIIZI)F
-HSPLandroid/graphics/Paint;->getRunCharacterAdvance(Ljava/lang/CharSequence;IIIIZI[FI)F
-HSPLandroid/graphics/Paint;->getRunCharacterAdvance(Ljava/lang/CharSequence;IIIIZI[FILandroid/graphics/RectF;Landroid/graphics/Paint$RunInfo;)F+]Landroid/graphics/Paint;Landroid/text/TextPaint;]Ljava/lang/CharSequence;megamorphic_types
-HSPLandroid/graphics/Paint;->getRunCharacterAdvance([CIIIIZI[FI)F
-HSPLandroid/graphics/Paint;->getShader()Landroid/graphics/Shader;
-HSPLandroid/graphics/Paint;->getShadowLayerColor()I
-HSPLandroid/graphics/Paint;->getShadowLayerDx()F
-HSPLandroid/graphics/Paint;->getShadowLayerDy()F
-HSPLandroid/graphics/Paint;->getShadowLayerRadius()F
-HSPLandroid/graphics/Paint;->getStartHyphenEdit()I
-HSPLandroid/graphics/Paint;->getStrokeCap()Landroid/graphics/Paint$Cap;
-HSPLandroid/graphics/Paint;->getStrokeJoin()Landroid/graphics/Paint$Join;
-HSPLandroid/graphics/Paint;->getStrokeMiter()F
-HSPLandroid/graphics/Paint;->getStrokeWidth()F
-HSPLandroid/graphics/Paint;->getStyle()Landroid/graphics/Paint$Style;
-HSPLandroid/graphics/Paint;->getTextAlign()Landroid/graphics/Paint$Align;
-HSPLandroid/graphics/Paint;->getTextBounds(Ljava/lang/CharSequence;IILandroid/graphics/Rect;)V+]Landroid/graphics/Paint;Landroid/text/TextPaint;]Ljava/lang/CharSequence;Landroid/text/SpannableString;
-HSPLandroid/graphics/Paint;->getTextBounds(Ljava/lang/String;IILandroid/graphics/Rect;)V
-HSPLandroid/graphics/Paint;->getTextBounds([CIILandroid/graphics/Rect;)V
-HSPLandroid/graphics/Paint;->getTextLocale()Ljava/util/Locale;
-HSPLandroid/graphics/Paint;->getTextLocales()Landroid/os/LocaleList;
-HSPLandroid/graphics/Paint;->getTextRunAdvances([CIIIIZ[FI)F
-HSPLandroid/graphics/Paint;->getTextRunCursor(Ljava/lang/CharSequence;IIZII)I
-HSPLandroid/graphics/Paint;->getTextRunCursor(Ljava/lang/String;IIZII)I
-HSPLandroid/graphics/Paint;->getTextRunCursor([CIIZII)I
-HSPLandroid/graphics/Paint;->getTextScaleX()F
-HSPLandroid/graphics/Paint;->getTextSize()F
-HSPLandroid/graphics/Paint;->getTextSkewX()F
-HSPLandroid/graphics/Paint;->getTypeface()Landroid/graphics/Typeface;
-HSPLandroid/graphics/Paint;->getUnderlinePosition()F
-HSPLandroid/graphics/Paint;->getWordSpacing()F
-HSPLandroid/graphics/Paint;->getXfermode()Landroid/graphics/Xfermode;
-HSPLandroid/graphics/Paint;->installXfermode(Landroid/graphics/Xfermode;)Landroid/graphics/Xfermode;
-HSPLandroid/graphics/Paint;->isAntiAlias()Z
-HSPLandroid/graphics/Paint;->isDither()Z
-HSPLandroid/graphics/Paint;->isElegantTextHeight()Z
-HSPLandroid/graphics/Paint;->isFilterBitmap()Z+]Landroid/graphics/Paint;missing_types
-HSPLandroid/graphics/Paint;->measureText(Ljava/lang/CharSequence;II)F
-HSPLandroid/graphics/Paint;->measureText(Ljava/lang/String;)F
-HSPLandroid/graphics/Paint;->measureText(Ljava/lang/String;II)F
-HSPLandroid/graphics/Paint;->reset()V
-HSPLandroid/graphics/Paint;->resetElegantTextHeight()V
-HSPLandroid/graphics/Paint;->set(Landroid/graphics/Paint;)V
-HSPLandroid/graphics/Paint;->setAlpha(I)V
-HSPLandroid/graphics/Paint;->setAntiAlias(Z)V
-HSPLandroid/graphics/Paint;->setBlendMode(Landroid/graphics/BlendMode;)V
-HSPLandroid/graphics/Paint;->setClassVariablesFrom(Landroid/graphics/Paint;)V
-HSPLandroid/graphics/Paint;->setColor(I)V
-HSPLandroid/graphics/Paint;->setColorFilter(Landroid/graphics/ColorFilter;)Landroid/graphics/ColorFilter;
-HSPLandroid/graphics/Paint;->setCompatibilityScaling(F)V
-HSPLandroid/graphics/Paint;->setDither(Z)V
-HSPLandroid/graphics/Paint;->setElegantTextHeight(Z)V
-HSPLandroid/graphics/Paint;->setEndHyphenEdit(I)V
-HSPLandroid/graphics/Paint;->setFakeBoldText(Z)V
-HSPLandroid/graphics/Paint;->setFilterBitmap(Z)V
-HSPLandroid/graphics/Paint;->setFlags(I)V
-HSPLandroid/graphics/Paint;->setFontFeatureSettings(Ljava/lang/String;)V
-HSPLandroid/graphics/Paint;->setLetterSpacing(F)V
-HSPLandroid/graphics/Paint;->setMaskFilter(Landroid/graphics/MaskFilter;)Landroid/graphics/MaskFilter;
-HSPLandroid/graphics/Paint;->setPathEffect(Landroid/graphics/PathEffect;)Landroid/graphics/PathEffect;
-HSPLandroid/graphics/Paint;->setShader(Landroid/graphics/Shader;)Landroid/graphics/Shader;
-HSPLandroid/graphics/Paint;->setShadowLayer(FFFI)V
-HSPLandroid/graphics/Paint;->setShadowLayer(FFFJ)V
-HSPLandroid/graphics/Paint;->setStartHyphenEdit(I)V
-HSPLandroid/graphics/Paint;->setStrokeCap(Landroid/graphics/Paint$Cap;)V
-HSPLandroid/graphics/Paint;->setStrokeJoin(Landroid/graphics/Paint$Join;)V
-HSPLandroid/graphics/Paint;->setStrokeMiter(F)V
-HSPLandroid/graphics/Paint;->setStrokeWidth(F)V
-HSPLandroid/graphics/Paint;->setStyle(Landroid/graphics/Paint$Style;)V
-HSPLandroid/graphics/Paint;->setTextAlign(Landroid/graphics/Paint$Align;)V
-HSPLandroid/graphics/Paint;->setTextLocales(Landroid/os/LocaleList;)V+]Landroid/os/LocaleList;Landroid/os/LocaleList;
-HSPLandroid/graphics/Paint;->setTextScaleX(F)V
-HSPLandroid/graphics/Paint;->setTextSize(F)V
-HSPLandroid/graphics/Paint;->setTextSkewX(F)V
-HSPLandroid/graphics/Paint;->setTypeface(Landroid/graphics/Typeface;)Landroid/graphics/Typeface;
-HSPLandroid/graphics/Paint;->setUnderlineText(Z)V
-HSPLandroid/graphics/Paint;->setXfermode(Landroid/graphics/Xfermode;)Landroid/graphics/Xfermode;
-HSPLandroid/graphics/Paint;->syncTextLocalesWithMinikin()V+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/os/LocaleList;Landroid/os/LocaleList;
-HSPLandroid/graphics/PaintFlagsDrawFilter;-><init>(II)V
-HSPLandroid/graphics/Path;-><init>()V
-HSPLandroid/graphics/Path;-><init>(Landroid/graphics/Path;)V
-HSPLandroid/graphics/Path;->addArc(FFFFFF)V
-HSPLandroid/graphics/Path;->addArc(Landroid/graphics/RectF;FF)V
-HSPLandroid/graphics/Path;->addCircle(FFFLandroid/graphics/Path$Direction;)V
-HSPLandroid/graphics/Path;->addOval(FFFFLandroid/graphics/Path$Direction;)V
-HSPLandroid/graphics/Path;->addOval(Landroid/graphics/RectF;Landroid/graphics/Path$Direction;)V
-HSPLandroid/graphics/Path;->addPath(Landroid/graphics/Path;Landroid/graphics/Matrix;)V+]Landroid/graphics/Matrix;Landroid/graphics/Matrix;
-HSPLandroid/graphics/Path;->addRect(FFFFLandroid/graphics/Path$Direction;)V
-HSPLandroid/graphics/Path;->addRect(Landroid/graphics/RectF;Landroid/graphics/Path$Direction;)V
-HSPLandroid/graphics/Path;->addRoundRect(FFFFFFLandroid/graphics/Path$Direction;)V
-HSPLandroid/graphics/Path;->addRoundRect(FFFF[FLandroid/graphics/Path$Direction;)V
-HSPLandroid/graphics/Path;->addRoundRect(Landroid/graphics/RectF;FFLandroid/graphics/Path$Direction;)V
-HSPLandroid/graphics/Path;->addRoundRect(Landroid/graphics/RectF;[FLandroid/graphics/Path$Direction;)V
-HSPLandroid/graphics/Path;->approximate(F)[F
-HSPLandroid/graphics/Path;->arcTo(FFFFFFZ)V
-HSPLandroid/graphics/Path;->arcTo(Landroid/graphics/RectF;FF)V
-HSPLandroid/graphics/Path;->arcTo(Landroid/graphics/RectF;FFZ)V+]Landroid/graphics/Path;Landroid/graphics/Path;
-HSPLandroid/graphics/Path;->close()V
-HSPLandroid/graphics/Path;->computeBounds(Landroid/graphics/RectF;Z)V+]Landroid/graphics/Path;Landroid/graphics/Path;
-HSPLandroid/graphics/Path;->cubicTo(FFFFFF)V
-HSPLandroid/graphics/Path;->getFillType()Landroid/graphics/Path$FillType;
-HSPLandroid/graphics/Path;->isConvex()Z
-HSPLandroid/graphics/Path;->isEmpty()Z
-HSPLandroid/graphics/Path;->lineTo(FF)V
-HSPLandroid/graphics/Path;->moveTo(FF)V
-HSPLandroid/graphics/Path;->offset(FF)V
-HSPLandroid/graphics/Path;->op(Landroid/graphics/Path;Landroid/graphics/Path$Op;)Z
-HSPLandroid/graphics/Path;->op(Landroid/graphics/Path;Landroid/graphics/Path;Landroid/graphics/Path$Op;)Z
-HSPLandroid/graphics/Path;->rLineTo(FF)V
-HSPLandroid/graphics/Path;->readOnlyNI()J
-HSPLandroid/graphics/Path;->reset()V+]Landroid/graphics/Path;Landroid/graphics/Path;
-HSPLandroid/graphics/Path;->rewind()V
-HSPLandroid/graphics/Path;->set(Landroid/graphics/Path;)V
-HSPLandroid/graphics/Path;->setFillType(Landroid/graphics/Path$FillType;)V
-HSPLandroid/graphics/Path;->transform(Landroid/graphics/Matrix;)V+]Landroid/graphics/Matrix;Landroid/graphics/Matrix;
-HSPLandroid/graphics/Path;->transform(Landroid/graphics/Matrix;Landroid/graphics/Path;)V
-HSPLandroid/graphics/PathMeasure;-><init>()V
-HSPLandroid/graphics/PathMeasure;-><init>(Landroid/graphics/Path;Z)V
-HSPLandroid/graphics/PathMeasure;->finalize()V
-HSPLandroid/graphics/PathMeasure;->getLength()F
-HSPLandroid/graphics/PathMeasure;->getPosTan(F[F[F)Z
-HSPLandroid/graphics/PathMeasure;->setPath(Landroid/graphics/Path;Z)V
-HSPLandroid/graphics/Picture;-><init>()V
-HSPLandroid/graphics/Picture;->beginRecording(II)Landroid/graphics/Canvas;
-HSPLandroid/graphics/Picture;->close()V
-HSPLandroid/graphics/Picture;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/Picture;->endRecording()V
-HSPLandroid/graphics/Picture;->finalize()V
-HSPLandroid/graphics/Picture;->getHeight()I
-HSPLandroid/graphics/Picture;->getWidth()I
-HSPLandroid/graphics/PixelFormat;->formatHasAlpha(I)Z
-HSPLandroid/graphics/Point$1;->createFromParcel(Landroid/os/Parcel;)Landroid/graphics/Point;
-HSPLandroid/graphics/Point$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/graphics/Point;-><init>()V
-HSPLandroid/graphics/Point;-><init>(II)V
-HSPLandroid/graphics/Point;-><init>(Landroid/graphics/Point;)V
-HSPLandroid/graphics/Point;->equals(II)Z
-HSPLandroid/graphics/Point;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Landroid/graphics/Point;
-HSPLandroid/graphics/Point;->hashCode()I
-HSPLandroid/graphics/Point;->offset(II)V
-HSPLandroid/graphics/Point;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/graphics/Point;->set(II)V
-HSPLandroid/graphics/Point;->set(Landroid/graphics/Point;)V
-HSPLandroid/graphics/Point;->toString()Ljava/lang/String;
-HSPLandroid/graphics/PointF;-><init>()V
-HSPLandroid/graphics/PointF;-><init>(FF)V
-HSPLandroid/graphics/PointF;->equals(FF)Z
-HSPLandroid/graphics/PointF;->equals(Ljava/lang/Object;)Z
-HSPLandroid/graphics/PointF;->length()F
-HSPLandroid/graphics/PointF;->length(FF)F
-HSPLandroid/graphics/PointF;->set(FF)V
-HSPLandroid/graphics/PointF;->set(Landroid/graphics/PointF;)V
-HSPLandroid/graphics/PorterDuffColorFilter;-><init>(ILandroid/graphics/PorterDuff$Mode;)V
-HSPLandroid/graphics/PorterDuffColorFilter;->createNativeInstance()J
-HSPLandroid/graphics/PorterDuffColorFilter;->equals(Ljava/lang/Object;)Z
-HSPLandroid/graphics/PorterDuffColorFilter;->getColor()I
-HSPLandroid/graphics/PorterDuffColorFilter;->getMode()Landroid/graphics/PorterDuff$Mode;
-HSPLandroid/graphics/PorterDuffXfermode;-><init>(Landroid/graphics/PorterDuff$Mode;)V
-HSPLandroid/graphics/RadialGradient;-><init>(FFFFFF[J[FLandroid/graphics/Shader$TileMode;Landroid/graphics/ColorSpace;)V
-HSPLandroid/graphics/RadialGradient;-><init>(FFF[I[FLandroid/graphics/Shader$TileMode;)V
-HSPLandroid/graphics/RadialGradient;->createNativeInstance(JZ)J
-HSPLandroid/graphics/RecordingCanvas;-><init>(Landroid/graphics/RenderNode;II)V
-HSPLandroid/graphics/RecordingCanvas;->disableZ()V
-HSPLandroid/graphics/RecordingCanvas;->drawRenderNode(Landroid/graphics/RenderNode;)V
-HSPLandroid/graphics/RecordingCanvas;->drawRipple(Landroid/graphics/CanvasProperty;Landroid/graphics/CanvasProperty;Landroid/graphics/CanvasProperty;Landroid/graphics/CanvasProperty;Landroid/graphics/CanvasProperty;Landroid/graphics/CanvasProperty;ILandroid/graphics/RuntimeShader;)V
-HSPLandroid/graphics/RecordingCanvas;->drawWebViewFunctor(I)V
-HSPLandroid/graphics/RecordingCanvas;->enableZ()V
-HSPLandroid/graphics/RecordingCanvas;->finishRecording(Landroid/graphics/RenderNode;)V
-HSPLandroid/graphics/RecordingCanvas;->getHeight()I
-HSPLandroid/graphics/RecordingCanvas;->getWidth()I
-HSPLandroid/graphics/RecordingCanvas;->isHardwareAccelerated()Z
-HSPLandroid/graphics/RecordingCanvas;->obtain(Landroid/graphics/RenderNode;II)Landroid/graphics/RecordingCanvas;+]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool;
-HSPLandroid/graphics/RecordingCanvas;->recycle()V+]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool;
-HSPLandroid/graphics/RecordingCanvas;->throwIfCannotDraw(Landroid/graphics/Bitmap;)V
-HSPLandroid/graphics/Rect$1;->createFromParcel(Landroid/os/Parcel;)Landroid/graphics/Rect;
-HSPLandroid/graphics/Rect$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/graphics/Rect$1;->newArray(I)[Landroid/graphics/Rect;
-HSPLandroid/graphics/Rect$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/graphics/Rect;-><init>()V
-HSPLandroid/graphics/Rect;-><init>(IIII)V
-HSPLandroid/graphics/Rect;-><init>(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/Rect;->centerX()I
-HSPLandroid/graphics/Rect;->centerY()I
-HSPLandroid/graphics/Rect;->contains(II)Z
-HSPLandroid/graphics/Rect;->contains(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/Rect;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Landroid/graphics/Rect;
-HSPLandroid/graphics/Rect;->exactCenterX()F
-HSPLandroid/graphics/Rect;->exactCenterY()F
-HSPLandroid/graphics/Rect;->hashCode()I
-HSPLandroid/graphics/Rect;->height()I
-HSPLandroid/graphics/Rect;->inset(II)V
-HSPLandroid/graphics/Rect;->inset(IIII)V
-HSPLandroid/graphics/Rect;->inset(Landroid/graphics/Insets;)V
-HSPLandroid/graphics/Rect;->inset(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/Rect;->intersect(IIII)Z
-HSPLandroid/graphics/Rect;->intersect(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/Rect;->intersectUnchecked(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/Rect;->intersects(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/Rect;->isEmpty()Z
-HSPLandroid/graphics/Rect;->isValid()Z
-HSPLandroid/graphics/Rect;->offset(II)V
-HSPLandroid/graphics/Rect;->offsetTo(II)V
-HSPLandroid/graphics/Rect;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/graphics/Rect;->scale(F)V
-HSPLandroid/graphics/Rect;->set(IIII)V
-HSPLandroid/graphics/Rect;->set(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/Rect;->setEmpty()V
-HSPLandroid/graphics/Rect;->setIntersect(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/Rect;->toShortString(Ljava/lang/StringBuilder;)Ljava/lang/String;
-HSPLandroid/graphics/Rect;->toString()Ljava/lang/String;
-HSPLandroid/graphics/Rect;->union(IIII)V
-HSPLandroid/graphics/Rect;->union(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/Rect;->width()I
-HSPLandroid/graphics/Rect;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/graphics/RectF;-><init>()V
-HSPLandroid/graphics/RectF;-><init>(FFFF)V
-HSPLandroid/graphics/RectF;-><init>(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/RectF;-><init>(Landroid/graphics/RectF;)V
-HSPLandroid/graphics/RectF;->centerX()F
-HSPLandroid/graphics/RectF;->centerY()F
-HSPLandroid/graphics/RectF;->contains(FF)Z
-HSPLandroid/graphics/RectF;->equals(Ljava/lang/Object;)Z
-HSPLandroid/graphics/RectF;->height()F
-HSPLandroid/graphics/RectF;->inset(FF)V
-HSPLandroid/graphics/RectF;->intersect(FFFF)Z
-HSPLandroid/graphics/RectF;->intersect(Landroid/graphics/RectF;)Z+]Landroid/graphics/RectF;Landroid/graphics/RectF;
-HSPLandroid/graphics/RectF;->isEmpty()Z
-HSPLandroid/graphics/RectF;->offset(FF)V
-HSPLandroid/graphics/RectF;->offsetTo(FF)V
-HSPLandroid/graphics/RectF;->round(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/RectF;->roundOut(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/RectF;->set(FFFF)V
-HSPLandroid/graphics/RectF;->set(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/RectF;->set(Landroid/graphics/RectF;)V
-HSPLandroid/graphics/RectF;->setEmpty()V
-HSPLandroid/graphics/RectF;->union(FFFF)V
-HSPLandroid/graphics/RectF;->union(Landroid/graphics/RectF;)V+]Landroid/graphics/RectF;Landroid/graphics/RectF;
-HSPLandroid/graphics/RectF;->width()F
-HSPLandroid/graphics/Region$1;->createFromParcel(Landroid/os/Parcel;)Landroid/graphics/Region;
-HSPLandroid/graphics/Region$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/graphics/Region;-><init>()V
-HSPLandroid/graphics/Region;-><init>(J)V
-HSPLandroid/graphics/Region;->equals(Ljava/lang/Object;)Z
-HSPLandroid/graphics/Region;->finalize()V
-HSPLandroid/graphics/Region;->getBounds()Landroid/graphics/Rect;
-HSPLandroid/graphics/Region;->op(IIIILandroid/graphics/Region$Op;)Z
-HSPLandroid/graphics/Region;->op(Landroid/graphics/Rect;Landroid/graphics/Region$Op;)Z
-HSPLandroid/graphics/Region;->op(Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z
-HSPLandroid/graphics/Region;->op(Landroid/graphics/Region;Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z
-HSPLandroid/graphics/Region;->set(IIII)Z
-HSPLandroid/graphics/Region;->set(Landroid/graphics/Region;)Z
-HSPLandroid/graphics/Region;->setEmpty()V
-HSPLandroid/graphics/Region;->setPath(Landroid/graphics/Path;Landroid/graphics/Region;)Z
-HSPLandroid/graphics/Region;->union(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/Region;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/graphics/RegionIterator;-><init>(Landroid/graphics/Region;)V
-HSPLandroid/graphics/RegionIterator;->finalize()V
-HSPLandroid/graphics/RegionIterator;->next(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/RenderNode$CompositePositionUpdateListener;-><init>([Landroid/graphics/RenderNode$PositionUpdateListener;)V
-HSPLandroid/graphics/RenderNode$CompositePositionUpdateListener;->positionChanged(JIIII)V
-HSPLandroid/graphics/RenderNode$CompositePositionUpdateListener;->positionLost(J)V
-HSPLandroid/graphics/RenderNode$CompositePositionUpdateListener;->without(Landroid/graphics/RenderNode$PositionUpdateListener;)Landroid/graphics/RenderNode$CompositePositionUpdateListener;
-HSPLandroid/graphics/RenderNode$PositionUpdateListener;->callPositionChanged(Ljava/lang/ref/WeakReference;JIIII)Z
-HSPLandroid/graphics/RenderNode$PositionUpdateListener;->callPositionLost(Ljava/lang/ref/WeakReference;J)Z
-HSPLandroid/graphics/RenderNode;-><init>(J)V
-HSPLandroid/graphics/RenderNode;-><init>(Ljava/lang/String;Landroid/graphics/RenderNode$AnimationHost;)V
-HSPLandroid/graphics/RenderNode;->addPositionUpdateListener(Landroid/graphics/RenderNode$PositionUpdateListener;)V
-HSPLandroid/graphics/RenderNode;->adopt(J)Landroid/graphics/RenderNode;
-HSPLandroid/graphics/RenderNode;->beginRecording(II)Landroid/graphics/RecordingCanvas;
-HSPLandroid/graphics/RenderNode;->clearStretch()Z
-HSPLandroid/graphics/RenderNode;->create(Ljava/lang/String;Landroid/graphics/RenderNode$AnimationHost;)Landroid/graphics/RenderNode;
-HSPLandroid/graphics/RenderNode;->discardDisplayList()V
-HSPLandroid/graphics/RenderNode;->endRecording()V+]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;
-HSPLandroid/graphics/RenderNode;->getClipToOutline()Z
-HSPLandroid/graphics/RenderNode;->getElevation()F
-HSPLandroid/graphics/RenderNode;->getMatrix(Landroid/graphics/Matrix;)V+]Landroid/graphics/Matrix;Landroid/graphics/Matrix;
-HSPLandroid/graphics/RenderNode;->getPivotY()F
-HSPLandroid/graphics/RenderNode;->getRotationX()F
-HSPLandroid/graphics/RenderNode;->getRotationY()F
-HSPLandroid/graphics/RenderNode;->getRotationZ()F
-HSPLandroid/graphics/RenderNode;->getScaleX()F
-HSPLandroid/graphics/RenderNode;->getScaleY()F
-HSPLandroid/graphics/RenderNode;->getTranslationX()F
-HSPLandroid/graphics/RenderNode;->getTranslationY()F
-HSPLandroid/graphics/RenderNode;->getTranslationZ()F
-HSPLandroid/graphics/RenderNode;->hasDisplayList()Z
-HSPLandroid/graphics/RenderNode;->hasIdentityMatrix()Z
-HSPLandroid/graphics/RenderNode;->isAttached()Z
-HSPLandroid/graphics/RenderNode;->offsetTopAndBottom(I)Z
-HSPLandroid/graphics/RenderNode;->removePositionUpdateListener(Landroid/graphics/RenderNode$PositionUpdateListener;)V
-HSPLandroid/graphics/RenderNode;->setAlpha(F)Z
-HSPLandroid/graphics/RenderNode;->setAmbientShadowColor(I)Z
-HSPLandroid/graphics/RenderNode;->setAnimationMatrix(Landroid/graphics/Matrix;)Z
-HSPLandroid/graphics/RenderNode;->setClipToBounds(Z)Z
-HSPLandroid/graphics/RenderNode;->setClipToOutline(Z)Z
-HSPLandroid/graphics/RenderNode;->setElevation(F)Z
-HSPLandroid/graphics/RenderNode;->setForceDarkAllowed(Z)Z
-HSPLandroid/graphics/RenderNode;->setHasOverlappingRendering(Z)Z
-HSPLandroid/graphics/RenderNode;->setLayerPaint(Landroid/graphics/Paint;)Z
-HSPLandroid/graphics/RenderNode;->setLayerType(I)Z
-HSPLandroid/graphics/RenderNode;->setLeftTopRightBottom(IIII)Z
-HSPLandroid/graphics/RenderNode;->setOutline(Landroid/graphics/Outline;)Z
-HSPLandroid/graphics/RenderNode;->setPivotX(F)Z
-HSPLandroid/graphics/RenderNode;->setProjectBackwards(Z)Z
-HSPLandroid/graphics/RenderNode;->setProjectionReceiver(Z)Z
-HSPLandroid/graphics/RenderNode;->setRenderEffect(Landroid/graphics/RenderEffect;)Z
-HSPLandroid/graphics/RenderNode;->setScaleX(F)Z
-HSPLandroid/graphics/RenderNode;->setScaleY(F)Z
-HSPLandroid/graphics/RenderNode;->setSpotShadowColor(I)Z
-HSPLandroid/graphics/RenderNode;->setTranslationX(F)Z
-HSPLandroid/graphics/RenderNode;->setTranslationY(F)Z
-HSPLandroid/graphics/RenderNode;->setUsageHint(I)V
-HSPLandroid/graphics/RenderNode;->stretch(FFFF)Z
-HSPLandroid/graphics/RuntimeShader$NoImagePreloadHolder;-><clinit>()V
-HSPLandroid/graphics/RuntimeShader;-><init>(Ljava/lang/String;)V
-HSPLandroid/graphics/RuntimeShader;->createNativeInstance(JZ)J
-HSPLandroid/graphics/RuntimeShader;->getNativeShaderBuilder()J
-HSPLandroid/graphics/RuntimeShader;->setFloatUniform(Ljava/lang/String;FF)V
-HSPLandroid/graphics/RuntimeShader;->setFloatUniform(Ljava/lang/String;FFFFI)V
-HSPLandroid/graphics/RuntimeShader;->setInputShader(Ljava/lang/String;Landroid/graphics/Shader;)V
-HSPLandroid/graphics/RuntimeShader;->setUniform(Ljava/lang/String;[FZ)V
-HSPLandroid/graphics/Shader;-><init>()V
-HSPLandroid/graphics/Shader;-><init>(Landroid/graphics/ColorSpace;)V
-HSPLandroid/graphics/Shader;->colorSpace()Landroid/graphics/ColorSpace;
-HSPLandroid/graphics/Shader;->convertColors([I)[J
-HSPLandroid/graphics/Shader;->detectColorSpace([J)Landroid/graphics/ColorSpace;
-HSPLandroid/graphics/Shader;->discardNativeInstance()V
-HSPLandroid/graphics/Shader;->discardNativeInstanceLocked()V
-HSPLandroid/graphics/Shader;->getNativeInstance()J
-HSPLandroid/graphics/Shader;->getNativeInstance(Z)J
-HSPLandroid/graphics/Shader;->setLocalMatrix(Landroid/graphics/Matrix;)V
-HSPLandroid/graphics/Shader;->shouldDiscardNativeInstance(Z)Z
-HSPLandroid/graphics/SurfaceTexture$1;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/graphics/SurfaceTexture;-><init>(I)V
-HSPLandroid/graphics/SurfaceTexture;->finalize()V
-HSPLandroid/graphics/SurfaceTexture;->isSingleBuffered()Z
-HSPLandroid/graphics/SurfaceTexture;->postEventFromNative(Ljava/lang/ref/WeakReference;)V
-HSPLandroid/graphics/SurfaceTexture;->release()V
-HSPLandroid/graphics/SurfaceTexture;->setDefaultBufferSize(II)V
-HSPLandroid/graphics/SurfaceTexture;->setOnFrameAvailableListener(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V
-HSPLandroid/graphics/SurfaceTexture;->setOnFrameAvailableListener(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;Landroid/os/Handler;)V
-HSPLandroid/graphics/TemporaryBuffer;->obtain(I)[C
-HSPLandroid/graphics/TemporaryBuffer;->recycle([C)V
-HSPLandroid/graphics/TextureLayer;-><init>(Landroid/graphics/HardwareRenderer;J)V
-HSPLandroid/graphics/TextureLayer;->close()V
-HSPLandroid/graphics/TextureLayer;->detachSurfaceTexture()V
-HSPLandroid/graphics/Typeface$Builder;->build()Landroid/graphics/Typeface;
-HSPLandroid/graphics/Typeface$Builder;->createAssetUid(Landroid/content/res/AssetManager;Ljava/lang/String;I[Landroid/graphics/fonts/FontVariationAxis;IILjava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;
-HSPLandroid/graphics/Typeface$CustomFallbackBuilder;-><init>(Landroid/graphics/fonts/FontFamily;)V
-HSPLandroid/graphics/Typeface$CustomFallbackBuilder;->build()Landroid/graphics/Typeface;
-HSPLandroid/graphics/Typeface$CustomFallbackBuilder;->setStyle(Landroid/graphics/fonts/FontStyle;)Landroid/graphics/Typeface$CustomFallbackBuilder;
-HSPLandroid/graphics/Typeface;-><init>(J)V
-HSPLandroid/graphics/Typeface;-><init>(JLjava/lang/String;)V
-HSPLandroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;
-HSPLandroid/graphics/Typeface;->create(Ljava/lang/String;I)Landroid/graphics/Typeface;
-HSPLandroid/graphics/Typeface;->createFromAsset(Landroid/content/res/AssetManager;Ljava/lang/String;)Landroid/graphics/Typeface;
-HSPLandroid/graphics/Typeface;->createFromResources(Landroid/content/res/FontResourcesParser$FamilyResourceEntry;Landroid/content/res/AssetManager;Ljava/lang/String;)Landroid/graphics/Typeface;
-HSPLandroid/graphics/Typeface;->createWeightStyle(Landroid/graphics/Typeface;IZ)Landroid/graphics/Typeface;
-HSPLandroid/graphics/Typeface;->defaultFromStyle(I)Landroid/graphics/Typeface;
-HSPLandroid/graphics/Typeface;->deserializeFontMap(Ljava/nio/ByteBuffer;Ljava/util/Map;)[J
-HSPLandroid/graphics/Typeface;->equals(Ljava/lang/Object;)Z
-HSPLandroid/graphics/Typeface;->findFromCache(Landroid/content/res/AssetManager;Ljava/lang/String;)Landroid/graphics/Typeface;
-HSPLandroid/graphics/Typeface;->getStyle()I
-HSPLandroid/graphics/Typeface;->getSystemDefaultTypeface(Ljava/lang/String;)Landroid/graphics/Typeface;
-HSPLandroid/graphics/Typeface;->getSystemFontFamilyName()Ljava/lang/String;
-HSPLandroid/graphics/Typeface;->hasFontFamily(Ljava/lang/String;)Z
-HSPLandroid/graphics/Typeface;->readString(Ljava/nio/ByteBuffer;)Ljava/lang/String;
-HSPLandroid/graphics/Typeface;->registerGenericFamilyNative(Ljava/lang/String;Landroid/graphics/Typeface;)V
-HSPLandroid/graphics/Typeface;->setDefault(Landroid/graphics/Typeface;)V
-HSPLandroid/graphics/Typeface;->setSystemFontMap(Landroid/os/SharedMemory;)V
-HSPLandroid/graphics/Typeface;->setSystemFontMap(Ljava/util/Map;)V
-HSPLandroid/graphics/Xfermode;-><init>()V
-HSPLandroid/graphics/animation/RenderNodeAnimator$$ExternalSyntheticLambda0;-><init>(Landroid/graphics/animation/RenderNodeAnimator;)V
-HSPLandroid/graphics/animation/RenderNodeAnimator$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/graphics/animation/RenderNodeAnimator;-><init>(Landroid/graphics/CanvasProperty;F)V
-HSPLandroid/graphics/animation/RenderNodeAnimator;-><init>(Landroid/graphics/CanvasProperty;IF)V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->applyInterpolator()V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->callOnFinished(Landroid/graphics/animation/RenderNodeAnimator;)V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->cancel()V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->checkMutable()V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->cloneListeners()Ljava/util/ArrayList;
-HSPLandroid/graphics/animation/RenderNodeAnimator;->doStart()V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->end()V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->getNativeAnimator()J
-HSPLandroid/graphics/animation/RenderNodeAnimator;->init(J)V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->isNativeInterpolator(Landroid/animation/TimeInterpolator;)Z
-HSPLandroid/graphics/animation/RenderNodeAnimator;->isRunning()Z
-HSPLandroid/graphics/animation/RenderNodeAnimator;->moveToRunningState()V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->notifyStartListeners()V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->onFinished()V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->setDuration(J)Landroid/animation/Animator;
-HSPLandroid/graphics/animation/RenderNodeAnimator;->setDuration(J)Landroid/graphics/animation/RenderNodeAnimator;
-HSPLandroid/graphics/animation/RenderNodeAnimator;->setInterpolator(Landroid/animation/TimeInterpolator;)V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->setStartDelay(J)V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->setTarget(Landroid/graphics/RecordingCanvas;)V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->setTarget(Landroid/graphics/RenderNode;)V
-HSPLandroid/graphics/animation/RenderNodeAnimator;->start()V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable$ChildDrawable;-><init>(I)V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable$ChildDrawable;-><init>(Landroid/graphics/drawable/AdaptiveIconDrawable$ChildDrawable;Landroid/graphics/drawable/AdaptiveIconDrawable;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable$ChildDrawable;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable$LayerState;-><init>(Landroid/graphics/drawable/AdaptiveIconDrawable$LayerState;Landroid/graphics/drawable/AdaptiveIconDrawable;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable$LayerState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable$LayerState;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable$LayerState;->invalidateCache()V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable$LayerState;->isStateful()Z
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable$LayerState;->newDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable$LayerState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;-><init>(Landroid/graphics/drawable/AdaptiveIconDrawable$LayerState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->addLayer(ILandroid/graphics/drawable/AdaptiveIconDrawable$ChildDrawable;)V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->createConstantState(Landroid/graphics/drawable/AdaptiveIconDrawable$LayerState;Landroid/content/res/Resources;)Landroid/graphics/drawable/AdaptiveIconDrawable$LayerState;
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->getExtraInsetFraction()F
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->getIntrinsicHeight()I
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->getIntrinsicWidth()I
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->getOpacity()I
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->inflateLayers(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->invalidateSelf()V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->isStateful()Z
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->jumpToCurrentState()V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->onBoundsChange(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->setVisible(ZZ)Z
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->updateLayerBounds(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->updateLayerBoundsInternal(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->updateLayerFromTypedArray(Landroid/graphics/drawable/AdaptiveIconDrawable$ChildDrawable;Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->updateMaskBoundsInternal(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/Animatable2$AnimationCallback;-><init>()V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;-><init>(Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;Landroid/graphics/drawable/AnimatedStateListDrawable;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->addStateSet([ILandroid/graphics/drawable/Drawable;I)I
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->addTransition(IILandroid/graphics/drawable/Drawable;Z)I
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->generateTransitionKey(II)J
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->getKeyframeIdAt(I)I
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->indexOfKeyframe([I)I
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->indexOfTransition(II)I
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->isTransitionReversed(II)Z
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->mutate()V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->transitionHasReversibleFlag(II)Z
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedVectorDrawableTransition;->start()V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedVectorDrawableTransition;->stop()V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;-><init>()V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;-><init>(Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;-><init>(Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;Landroid/content/res/Resources;Landroid/graphics/drawable/AnimatedStateListDrawable-IA;)V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->clearMutated()V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->cloneConstantState()Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->cloneConstantState()Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->inflateChildElements(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->init()V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->isStateful()Z
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->jumpToCurrentState()V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->parseItem(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)I
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->parseTransition(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)I
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->selectTransition(I)Z
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->setConstantState(Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;)V
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->setVisible(ZZ)Z
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$1;-><init>(Landroid/graphics/drawable/AnimatedVectorDrawable;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$1;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$2;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$2;->onAnimationStart(Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState$PendingAnimator;-><init>(IFLjava/lang/String;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState$PendingAnimator;->newInstance(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/animation/Animator;
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;-><init>(Landroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;Landroid/graphics/drawable/Drawable$Callback;Landroid/content/res/Resources;)V+]Landroid/graphics/drawable/Drawable$ConstantState;Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;]Landroid/graphics/drawable/VectorDrawable;Landroid/graphics/drawable/VectorDrawable;
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;->addPendingAnimator(IFLjava/lang/String;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;->addTargetAnimator(Ljava/lang/String;Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;->inflatePendingAnimators(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;->prepareLocalAnimator(I)Landroid/animation/Animator;
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;->prepareLocalAnimators(Landroid/animation/AnimatorSet;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;-><init>(Landroid/graphics/drawable/AnimatedVectorDrawable;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->callOnFinished(Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;I)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->createNativeChildAnimator(JJLandroid/animation/ObjectAnimator;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->createRTAnimator(Landroid/animation/ObjectAnimator;J)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->createRTAnimatorForFullPath(Landroid/animation/ObjectAnimator;Landroid/graphics/drawable/VectorDrawable$VFullPath;J)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->createRTAnimatorForGroup([Landroid/animation/PropertyValuesHolder;Landroid/animation/ObjectAnimator;Landroid/graphics/drawable/VectorDrawable$VGroup;J)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->createRTAnimatorForPath(Landroid/animation/ObjectAnimator;Landroid/graphics/drawable/VectorDrawable$VPath;J)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->end()V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->getAnimatorNativePtr()J
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->getFrameCount(J)I
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->handlePendingAction(I)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->init(Landroid/animation/AnimatorSet;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->invalidateOwningView()V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->isInfinite()Z
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->isStarted()Z
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->lambda$callOnFinished$0(Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;I)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->onDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->parseAnimatorSet(Landroid/animation/AnimatorSet;J)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->pause()V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->recordLastSeenTarget(Landroid/graphics/RecordingCanvas;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->setListener(Landroid/animation/Animator$AnimatorListener;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->start()V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->startAnimation()V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->useLastSeenTarget()Z
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->-$$Nest$smnCreateAnimatorSet()J
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->-$$Nest$smshouldIgnoreInvalidAnimation()Z
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;-><init>()V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;-><init>(Landroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;-><init>(Landroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;Landroid/content/res/Resources;Landroid/graphics/drawable/AnimatedVectorDrawable-IA;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->clearMutated()V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->containsSameValueType(Landroid/animation/PropertyValuesHolder;Landroid/util/Property;)Z
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->ensureAnimatorSet()V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->getIntrinsicHeight()I
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->getIntrinsicWidth()I
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->getOpacity()I
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->isStateful()Z
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->onBoundsChange(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->registerAnimationCallback(Landroid/graphics/drawable/Animatable2$AnimationCallback;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->setHotspot(FF)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->setTintBlendMode(Landroid/graphics/BlendMode;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->setTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->setVisible(ZZ)Z
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->shouldIgnoreInvalidAnimation()Z
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->start()V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->stop()V
-HSPLandroid/graphics/drawable/AnimatedVectorDrawable;->updateAnimatorProperty(Landroid/animation/Animator;Ljava/lang/String;Landroid/graphics/drawable/VectorDrawable;Z)V
-HSPLandroid/graphics/drawable/AnimationDrawable$AnimationState;->addFrame(Landroid/graphics/drawable/Drawable;I)V
-HSPLandroid/graphics/drawable/AnimationDrawable$AnimationState;->growArray(II)V
-HSPLandroid/graphics/drawable/AnimationDrawable$AnimationState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/AnimationDrawable;-><init>()V
-HSPLandroid/graphics/drawable/AnimationDrawable;->clearMutated()V
-HSPLandroid/graphics/drawable/AnimationDrawable;->cloneConstantState()Landroid/graphics/drawable/AnimationDrawable$AnimationState;
-HSPLandroid/graphics/drawable/AnimationDrawable;->cloneConstantState()Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;
-HSPLandroid/graphics/drawable/AnimationDrawable;->getDuration(I)I
-HSPLandroid/graphics/drawable/AnimationDrawable;->getNumberOfFrames()I
-HSPLandroid/graphics/drawable/AnimationDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/AnimationDrawable;->inflateChildElements(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/AnimationDrawable;->isRunning()Z
-HSPLandroid/graphics/drawable/AnimationDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/AnimationDrawable;->nextFrame(Z)V
-HSPLandroid/graphics/drawable/AnimationDrawable;->run()V
-HSPLandroid/graphics/drawable/AnimationDrawable;->setConstantState(Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;)V
-HSPLandroid/graphics/drawable/AnimationDrawable;->setFrame(IZZ)V
-HSPLandroid/graphics/drawable/AnimationDrawable;->setVisible(ZZ)Z
-HSPLandroid/graphics/drawable/AnimationDrawable;->start()V
-HSPLandroid/graphics/drawable/AnimationDrawable;->stop()V
-HSPLandroid/graphics/drawable/AnimationDrawable;->unscheduleSelf(Ljava/lang/Runnable;)V
-HSPLandroid/graphics/drawable/BitmapDrawable$$ExternalSyntheticLambda2;->onHeaderDecoded(Landroid/graphics/ImageDecoder;Landroid/graphics/ImageDecoder$ImageInfo;Landroid/graphics/ImageDecoder$Source;)V
-HSPLandroid/graphics/drawable/BitmapDrawable$BitmapState;-><init>(Landroid/graphics/Bitmap;)V
-HSPLandroid/graphics/drawable/BitmapDrawable$BitmapState;-><init>(Landroid/graphics/drawable/BitmapDrawable$BitmapState;)V
-HSPLandroid/graphics/drawable/BitmapDrawable$BitmapState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/BitmapDrawable$BitmapState;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/BitmapDrawable$BitmapState;->newDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/BitmapDrawable$BitmapState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/BitmapDrawable;-><init>()V
-HSPLandroid/graphics/drawable/BitmapDrawable;-><init>(Landroid/content/res/Resources;Landroid/graphics/Bitmap;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;-><init>(Landroid/graphics/Bitmap;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;-><init>(Landroid/graphics/drawable/BitmapDrawable$BitmapState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/BitmapDrawable;->clearMutated()V
-HSPLandroid/graphics/drawable/BitmapDrawable;->computeBitmapSize()V
-HSPLandroid/graphics/drawable/BitmapDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->getBitmap()Landroid/graphics/Bitmap;
-HSPLandroid/graphics/drawable/BitmapDrawable;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/BitmapDrawable;->getColorFilter()Landroid/graphics/ColorFilter;
-HSPLandroid/graphics/drawable/BitmapDrawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;
-HSPLandroid/graphics/drawable/BitmapDrawable;->getIntrinsicHeight()I
-HSPLandroid/graphics/drawable/BitmapDrawable;->getIntrinsicWidth()I
-HSPLandroid/graphics/drawable/BitmapDrawable;->getOpacity()I
-HSPLandroid/graphics/drawable/BitmapDrawable;->getOutline(Landroid/graphics/Outline;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->init(Landroid/graphics/drawable/BitmapDrawable$BitmapState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->isAutoMirrored()Z
-HSPLandroid/graphics/drawable/BitmapDrawable;->isStateful()Z
-HSPLandroid/graphics/drawable/BitmapDrawable;->lambda$updateStateFromTypedArray$2(Landroid/graphics/ImageDecoder;Landroid/graphics/ImageDecoder$ImageInfo;Landroid/graphics/ImageDecoder$Source;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/BitmapDrawable;->needMirroring()Z
-HSPLandroid/graphics/drawable/BitmapDrawable;->onBoundsChange(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/BitmapDrawable;->setAlpha(I)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->setAutoMirrored(Z)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->setBitmap(Landroid/graphics/Bitmap;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->setDither(Z)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->setGravity(I)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->setMipMap(Z)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->setTileModeXY(Landroid/graphics/Shader$TileMode;Landroid/graphics/Shader$TileMode;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->setTintBlendMode(Landroid/graphics/BlendMode;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->setTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->updateDstRectAndInsetsIfDirty()V
-HSPLandroid/graphics/drawable/BitmapDrawable;->updateLocalState(Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;I)V
-HSPLandroid/graphics/drawable/BitmapDrawable;->verifyRequiredAttributes(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/ClipDrawable$ClipState;-><init>(Landroid/graphics/drawable/ClipDrawable$ClipState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/ClipDrawable$ClipState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/ClipDrawable;-><init>(Landroid/graphics/drawable/ClipDrawable$ClipState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/ClipDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/ClipDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/ClipDrawable;->mutateConstantState()Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;
-HSPLandroid/graphics/drawable/ClipDrawable;->onLevelChange(I)Z
-HSPLandroid/graphics/drawable/ClipDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/ClipDrawable;->verifyRequiredAttributes(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/ColorDrawable$ColorState;-><init>()V
-HSPLandroid/graphics/drawable/ColorDrawable$ColorState;-><init>(Landroid/graphics/drawable/ColorDrawable$ColorState;)V
-HSPLandroid/graphics/drawable/ColorDrawable$ColorState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/ColorDrawable$ColorState;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/ColorDrawable$ColorState;->newDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/ColorDrawable$ColorState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/ColorDrawable;-><init>()V
-HSPLandroid/graphics/drawable/ColorDrawable;-><init>(I)V
-HSPLandroid/graphics/drawable/ColorDrawable;-><init>(Landroid/graphics/drawable/ColorDrawable$ColorState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/ColorDrawable;-><init>(Landroid/graphics/drawable/ColorDrawable$ColorState;Landroid/content/res/Resources;Landroid/graphics/drawable/ColorDrawable-IA;)V
-HSPLandroid/graphics/drawable/ColorDrawable;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/ColorDrawable;->clearMutated()V
-HSPLandroid/graphics/drawable/ColorDrawable;->draw(Landroid/graphics/Canvas;)V+]Landroid/graphics/Paint;Landroid/graphics/Paint;]Landroid/graphics/drawable/ColorDrawable;Landroid/graphics/drawable/ColorDrawable;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;
-HSPLandroid/graphics/drawable/ColorDrawable;->getAlpha()I
-HSPLandroid/graphics/drawable/ColorDrawable;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/ColorDrawable;->getColor()I
-HSPLandroid/graphics/drawable/ColorDrawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;
-HSPLandroid/graphics/drawable/ColorDrawable;->getOpacity()I
-HSPLandroid/graphics/drawable/ColorDrawable;->getOutline(Landroid/graphics/Outline;)V
-HSPLandroid/graphics/drawable/ColorDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/ColorDrawable;->isStateful()Z
-HSPLandroid/graphics/drawable/ColorDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/ColorDrawable;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/ColorDrawable;->setAlpha(I)V
-HSPLandroid/graphics/drawable/ColorDrawable;->setColor(I)V
-HSPLandroid/graphics/drawable/ColorDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V
-HSPLandroid/graphics/drawable/ColorDrawable;->setTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/ColorDrawable;->updateLocalState(Landroid/content/res/Resources;)V+]Landroid/graphics/drawable/ColorDrawable;Landroid/graphics/drawable/ColorDrawable;
-HSPLandroid/graphics/drawable/ColorDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/Drawable$ConstantState;-><init>()V
-HSPLandroid/graphics/drawable/Drawable$ConstantState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/Drawable$ConstantState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/Drawable$ConstantState;->newDrawable(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/Drawable;-><init>()V
-HSPLandroid/graphics/drawable/Drawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/Drawable;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/Drawable;->clearColorFilter()V
-HSPLandroid/graphics/drawable/Drawable;->clearMutated()V
-HSPLandroid/graphics/drawable/Drawable;->copyBounds(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/Drawable;->createFromXmlForDensity(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/Drawable;->createFromXmlInner(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/Drawable;->createFromXmlInnerForDensity(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/Drawable;->getBounds()Landroid/graphics/Rect;
-HSPLandroid/graphics/drawable/Drawable;->getCallback()Landroid/graphics/drawable/Drawable$Callback;+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;
-HSPLandroid/graphics/drawable/Drawable;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/Drawable;->getColorFilter()Landroid/graphics/ColorFilter;
-HSPLandroid/graphics/drawable/Drawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;
-HSPLandroid/graphics/drawable/Drawable;->getCurrent()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/Drawable;->getDirtyBounds()Landroid/graphics/Rect;
-HSPLandroid/graphics/drawable/Drawable;->getIntrinsicHeight()I
-HSPLandroid/graphics/drawable/Drawable;->getIntrinsicWidth()I
-HSPLandroid/graphics/drawable/Drawable;->getLayoutDirection()I
-HSPLandroid/graphics/drawable/Drawable;->getLevel()I
-HSPLandroid/graphics/drawable/Drawable;->getMinimumHeight()I+]Landroid/graphics/drawable/Drawable;missing_types
-HSPLandroid/graphics/drawable/Drawable;->getMinimumWidth()I+]Landroid/graphics/drawable/Drawable;missing_types
-HSPLandroid/graphics/drawable/Drawable;->getOutline(Landroid/graphics/Outline;)V
-HSPLandroid/graphics/drawable/Drawable;->getPadding(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/drawable/Drawable;->getState()[I
-HSPLandroid/graphics/drawable/Drawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/Drawable;->inflateWithAttributes(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/TypedArray;I)V
-HSPLandroid/graphics/drawable/Drawable;->invalidateSelf()V+]Landroid/graphics/drawable/Drawable$Callback;missing_types]Landroid/graphics/drawable/Drawable;missing_types
-HSPLandroid/graphics/drawable/Drawable;->isProjected()Z
-HSPLandroid/graphics/drawable/Drawable;->isStateful()Z
-HSPLandroid/graphics/drawable/Drawable;->isVisible()Z
-HSPLandroid/graphics/drawable/Drawable;->jumpToCurrentState()V
-HSPLandroid/graphics/drawable/Drawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/Drawable;->obtainAttributes(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;
-HSPLandroid/graphics/drawable/Drawable;->onBoundsChange(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/Drawable;->onLevelChange(I)Z
-HSPLandroid/graphics/drawable/Drawable;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/Drawable;->parseBlendMode(ILandroid/graphics/BlendMode;)Landroid/graphics/BlendMode;
-HSPLandroid/graphics/drawable/Drawable;->resolveDensity(Landroid/content/res/Resources;I)I
-HSPLandroid/graphics/drawable/Drawable;->resolveOpacity(II)I
-HSPLandroid/graphics/drawable/Drawable;->scaleFromDensity(FII)F
-HSPLandroid/graphics/drawable/Drawable;->scaleFromDensity(IIIZ)I
-HSPLandroid/graphics/drawable/Drawable;->scheduleSelf(Ljava/lang/Runnable;J)V
-HSPLandroid/graphics/drawable/Drawable;->setAutoMirrored(Z)V
-HSPLandroid/graphics/drawable/Drawable;->setBounds(IIII)V
-HSPLandroid/graphics/drawable/Drawable;->setBounds(Landroid/graphics/Rect;)V+]Landroid/graphics/drawable/Drawable;megamorphic_types
-HSPLandroid/graphics/drawable/Drawable;->setCallback(Landroid/graphics/drawable/Drawable$Callback;)V
-HSPLandroid/graphics/drawable/Drawable;->setChangingConfigurations(I)V
-HSPLandroid/graphics/drawable/Drawable;->setColorFilter(ILandroid/graphics/PorterDuff$Mode;)V
-HSPLandroid/graphics/drawable/Drawable;->setDither(Z)V
-HSPLandroid/graphics/drawable/Drawable;->setHotspot(FF)V
-HSPLandroid/graphics/drawable/Drawable;->setLayoutDirection(I)Z
-HSPLandroid/graphics/drawable/Drawable;->setLevel(I)Z
-HSPLandroid/graphics/drawable/Drawable;->setSrcDensityOverride(I)V
-HSPLandroid/graphics/drawable/Drawable;->setState([I)Z+]Landroid/graphics/drawable/Drawable;missing_types
-HSPLandroid/graphics/drawable/Drawable;->setTint(I)V
-HSPLandroid/graphics/drawable/Drawable;->setTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/Drawable;->setTintMode(Landroid/graphics/PorterDuff$Mode;)V
-HSPLandroid/graphics/drawable/Drawable;->setVisible(ZZ)Z
-HSPLandroid/graphics/drawable/Drawable;->unscheduleSelf(Ljava/lang/Runnable;)V
-HSPLandroid/graphics/drawable/Drawable;->updateBlendModeFilter(Landroid/graphics/BlendModeColorFilter;Landroid/content/res/ColorStateList;Landroid/graphics/BlendMode;)Landroid/graphics/BlendModeColorFilter;+]Landroid/content/res/ColorStateList;Landroid/content/res/ColorStateList;]Landroid/graphics/BlendModeColorFilter;Landroid/graphics/BlendModeColorFilter;]Landroid/graphics/drawable/Drawable;megamorphic_types
-HSPLandroid/graphics/drawable/Drawable;->updateTintFilter(Landroid/graphics/PorterDuffColorFilter;Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuffColorFilter;
-HSPLandroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;-><init>()V
-HSPLandroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;-><init>(Landroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback-IA;)V
-HSPLandroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;->unwrap()Landroid/graphics/drawable/Drawable$Callback;
-HSPLandroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;->wrap(Landroid/graphics/drawable/Drawable$Callback;)Landroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;-><init>(Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;Landroid/graphics/drawable/DrawableContainer;Landroid/content/res/Resources;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/graphics/drawable/Drawable;megamorphic_types
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->addChild(Landroid/graphics/drawable/Drawable;)I
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->canConstantState()Z
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->clearMutated()V
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->computeConstantSize()V
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->createAllFutures()V
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getCapacity()I
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getChild(I)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getChildCount()I
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getChildren()[Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getConstantPadding()Landroid/graphics/Rect;
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getOpacity()I
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->invalidateCache()V
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->isConstantSize()Z
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->isStateful()Z
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->mutate()V
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->prepareDrawable(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->setConstantSize(Z)V
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->setEnterFadeDuration(I)V
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->setExitFadeDuration(I)V
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->setVariablePadding(Z)V
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->updateDensity(Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/DrawableContainer;-><init>()V
-HSPLandroid/graphics/drawable/DrawableContainer;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/DrawableContainer;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/DrawableContainer;->clearMutated()V
-HSPLandroid/graphics/drawable/DrawableContainer;->cloneConstantState()Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;
-HSPLandroid/graphics/drawable/DrawableContainer;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/DrawableContainer;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/DrawableContainer;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;
-HSPLandroid/graphics/drawable/DrawableContainer;->getCurrent()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/DrawableContainer;->getCurrentIndex()I
-HSPLandroid/graphics/drawable/DrawableContainer;->getIntrinsicHeight()I
-HSPLandroid/graphics/drawable/DrawableContainer;->getIntrinsicWidth()I
-HSPLandroid/graphics/drawable/DrawableContainer;->getMinimumHeight()I
-HSPLandroid/graphics/drawable/DrawableContainer;->getMinimumWidth()I
-HSPLandroid/graphics/drawable/DrawableContainer;->getOpacity()I
-HSPLandroid/graphics/drawable/DrawableContainer;->getOpticalInsets()Landroid/graphics/Insets;
-HSPLandroid/graphics/drawable/DrawableContainer;->getOutline(Landroid/graphics/Outline;)V
-HSPLandroid/graphics/drawable/DrawableContainer;->getPadding(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/drawable/DrawableContainer;->initializeDrawableForDisplay(Landroid/graphics/drawable/Drawable;)V+]Landroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;Landroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;]Landroid/graphics/drawable/DrawableContainer;Landroid/graphics/drawable/AnimatedStateListDrawable;,Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable;,Landroid/graphics/drawable/StateListDrawable;]Landroid/graphics/drawable/Drawable;megamorphic_types
-HSPLandroid/graphics/drawable/DrawableContainer;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/DrawableContainer;->isAutoMirrored()Z
-HSPLandroid/graphics/drawable/DrawableContainer;->isStateful()Z
-HSPLandroid/graphics/drawable/DrawableContainer;->jumpToCurrentState()V
-HSPLandroid/graphics/drawable/DrawableContainer;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/DrawableContainer;->needsMirroring()Z
-HSPLandroid/graphics/drawable/DrawableContainer;->onBoundsChange(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/DrawableContainer;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/DrawableContainer;->selectDrawable(I)Z
-HSPLandroid/graphics/drawable/DrawableContainer;->setAlpha(I)V
-HSPLandroid/graphics/drawable/DrawableContainer;->setAutoMirrored(Z)V
-HSPLandroid/graphics/drawable/DrawableContainer;->setColorFilter(Landroid/graphics/ColorFilter;)V
-HSPLandroid/graphics/drawable/DrawableContainer;->setConstantState(Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;)V
-HSPLandroid/graphics/drawable/DrawableContainer;->setDither(Z)V
-HSPLandroid/graphics/drawable/DrawableContainer;->setHotspot(FF)V
-HSPLandroid/graphics/drawable/DrawableContainer;->setTintBlendMode(Landroid/graphics/BlendMode;)V
-HSPLandroid/graphics/drawable/DrawableContainer;->setTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/DrawableContainer;->setVisible(ZZ)Z
-HSPLandroid/graphics/drawable/DrawableContainer;->updateDensity(Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/DrawableInflater;-><init>(Landroid/content/res/Resources;Ljava/lang/ClassLoader;)V
-HSPLandroid/graphics/drawable/DrawableInflater;->inflateFromClass(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/DrawableInflater;->inflateFromTag(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/DrawableInflater;->inflateFromXmlForDensity(Ljava/lang/String;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;->-$$Nest$fputmThemeAttrs(Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;[I)V
-HSPLandroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;-><init>(Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;->canConstantState()Z
-HSPLandroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;->newDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;->onDensityChanged(II)V
-HSPLandroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;->setDensity(I)V
-HSPLandroid/graphics/drawable/DrawableWrapper;-><init>(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/DrawableWrapper;-><init>(Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/DrawableWrapper;->clearMutated()V
-HSPLandroid/graphics/drawable/DrawableWrapper;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/DrawableWrapper;->getColorFilter()Landroid/graphics/ColorFilter;
-HSPLandroid/graphics/drawable/DrawableWrapper;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;
-HSPLandroid/graphics/drawable/DrawableWrapper;->getDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/DrawableWrapper;->getIntrinsicHeight()I
-HSPLandroid/graphics/drawable/DrawableWrapper;->getIntrinsicWidth()I
-HSPLandroid/graphics/drawable/DrawableWrapper;->getOpacity()I
-HSPLandroid/graphics/drawable/DrawableWrapper;->getPadding(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/drawable/DrawableWrapper;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->inflateChildDrawable(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->isStateful()Z
-HSPLandroid/graphics/drawable/DrawableWrapper;->jumpToCurrentState()V
-HSPLandroid/graphics/drawable/DrawableWrapper;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/DrawableWrapper;->mutateConstantState()Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;
-HSPLandroid/graphics/drawable/DrawableWrapper;->onBoundsChange(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->onLevelChange(I)Z
-HSPLandroid/graphics/drawable/DrawableWrapper;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/DrawableWrapper;->setAlpha(I)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->setColorFilter(Landroid/graphics/ColorFilter;)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->setDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->setHotspot(FF)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->setTintBlendMode(Landroid/graphics/BlendMode;)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->setTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->setVisible(ZZ)Z
-HSPLandroid/graphics/drawable/DrawableWrapper;->updateLocalState(Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/DrawableWrapper;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->-$$Nest$mcomputeOpacity(Landroid/graphics/drawable/GradientDrawable$GradientState;)V
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;-><init>(Landroid/graphics/drawable/GradientDrawable$GradientState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;-><init>(Landroid/graphics/drawable/GradientDrawable$Orientation;[I)V+]Landroid/graphics/drawable/GradientDrawable$GradientState;Landroid/graphics/drawable/GradientDrawable$GradientState;
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->applyDensityScaling(II)V
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->computeOpacity()V
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->hasCenterColor()Z
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->newDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->setCornerRadii([F)V
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->setCornerRadius(F)V
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->setDensity(I)V
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->setGradientColors([I)V
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->setSolidColors(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->setStroke(ILandroid/content/res/ColorStateList;FF)V
-HSPLandroid/graphics/drawable/GradientDrawable;-><init>()V
-HSPLandroid/graphics/drawable/GradientDrawable;-><init>(Landroid/graphics/drawable/GradientDrawable$GradientState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/GradientDrawable;-><init>(Landroid/graphics/drawable/GradientDrawable$GradientState;Landroid/content/res/Resources;Landroid/graphics/drawable/GradientDrawable-IA;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->applyThemeChildElements(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/GradientDrawable;->clearMutated()V
-HSPLandroid/graphics/drawable/GradientDrawable;->draw(Landroid/graphics/Canvas;)V+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Landroid/graphics/Paint;Landroid/graphics/Paint;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;,Landroid/graphics/Canvas;
-HSPLandroid/graphics/drawable/GradientDrawable;->ensureValidRect()Z
-HSPLandroid/graphics/drawable/GradientDrawable;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/GradientDrawable;->getColorFilter()Landroid/graphics/ColorFilter;
-HSPLandroid/graphics/drawable/GradientDrawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;
-HSPLandroid/graphics/drawable/GradientDrawable;->getFloatOrFraction(Landroid/content/res/TypedArray;IF)F
-HSPLandroid/graphics/drawable/GradientDrawable;->getIntrinsicHeight()I
-HSPLandroid/graphics/drawable/GradientDrawable;->getIntrinsicWidth()I
-HSPLandroid/graphics/drawable/GradientDrawable;->getOpacity()I
-HSPLandroid/graphics/drawable/GradientDrawable;->getOutline(Landroid/graphics/Outline;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->getPadding(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/drawable/GradientDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->inflateChildElements(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->isOpaque(I)Z
-HSPLandroid/graphics/drawable/GradientDrawable;->isOpaqueForState()Z
-HSPLandroid/graphics/drawable/GradientDrawable;->isStateful()Z
-HSPLandroid/graphics/drawable/GradientDrawable;->modulateAlpha(I)I
-HSPLandroid/graphics/drawable/GradientDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/GradientDrawable;->onBoundsChange(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->onLevelChange(I)Z
-HSPLandroid/graphics/drawable/GradientDrawable;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/GradientDrawable;->setAlpha(I)V+]Landroid/graphics/drawable/GradientDrawable;Landroid/graphics/drawable/GradientDrawable;
-HSPLandroid/graphics/drawable/GradientDrawable;->setColor(I)V
-HSPLandroid/graphics/drawable/GradientDrawable;->setColor(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->setCornerRadii([F)V
-HSPLandroid/graphics/drawable/GradientDrawable;->setCornerRadius(F)V
-HSPLandroid/graphics/drawable/GradientDrawable;->setDither(Z)V
-HSPLandroid/graphics/drawable/GradientDrawable;->setShape(I)V
-HSPLandroid/graphics/drawable/GradientDrawable;->setStroke(II)V
-HSPLandroid/graphics/drawable/GradientDrawable;->setStroke(IIFF)V
-HSPLandroid/graphics/drawable/GradientDrawable;->setStroke(ILandroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->setStroke(ILandroid/content/res/ColorStateList;FF)V
-HSPLandroid/graphics/drawable/GradientDrawable;->setStrokeInternal(IIFF)V
-HSPLandroid/graphics/drawable/GradientDrawable;->setTintBlendMode(Landroid/graphics/BlendMode;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->setTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->updateDrawableCorners(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->updateGradientDrawableGradient(Landroid/content/res/Resources;Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->updateGradientDrawablePadding(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->updateGradientDrawableSize(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->updateGradientDrawableSolid(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->updateGradientDrawableStroke(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/GradientDrawable;->updateLocalState(Landroid/content/res/Resources;)V+]Landroid/graphics/drawable/GradientDrawable;Landroid/graphics/drawable/GradientDrawable;]Landroid/content/res/ColorStateList;Landroid/content/res/ColorStateList;]Landroid/graphics/Paint;Landroid/graphics/Paint;
-HSPLandroid/graphics/drawable/GradientDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/Icon$1;->createFromParcel(Landroid/os/Parcel;)Landroid/graphics/drawable/Icon;
-HSPLandroid/graphics/drawable/Icon$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/graphics/drawable/Icon;-><init>(I)V
-HSPLandroid/graphics/drawable/Icon;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/graphics/drawable/Icon;->createWithAdaptiveBitmap(Landroid/graphics/Bitmap;)Landroid/graphics/drawable/Icon;
-HSPLandroid/graphics/drawable/Icon;->createWithBitmap(Landroid/graphics/Bitmap;)Landroid/graphics/drawable/Icon;
-HSPLandroid/graphics/drawable/Icon;->createWithResource(Landroid/content/Context;I)Landroid/graphics/drawable/Icon;
-HSPLandroid/graphics/drawable/Icon;->createWithResource(Ljava/lang/String;I)Landroid/graphics/drawable/Icon;
-HSPLandroid/graphics/drawable/Icon;->getBitmap()Landroid/graphics/Bitmap;
-HSPLandroid/graphics/drawable/Icon;->getResId()I
-HSPLandroid/graphics/drawable/Icon;->getResPackage()Ljava/lang/String;
-HSPLandroid/graphics/drawable/Icon;->getResources()Landroid/content/res/Resources;
-HSPLandroid/graphics/drawable/Icon;->getType()I
-HSPLandroid/graphics/drawable/Icon;->getUriString()Ljava/lang/String;
-HSPLandroid/graphics/drawable/Icon;->hasTint()Z
-HSPLandroid/graphics/drawable/Icon;->loadDrawable(Landroid/content/Context;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/Icon;->loadDrawableAsUser(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/Icon;->loadDrawableInner(Landroid/content/Context;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/Icon;->scaleDownIfNecessary(Landroid/graphics/Bitmap;II)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/drawable/Icon;->setBitmap(Landroid/graphics/Bitmap;)V
-HSPLandroid/graphics/drawable/Icon;->setTint(I)Landroid/graphics/drawable/Icon;
-HSPLandroid/graphics/drawable/Icon;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/graphics/drawable/InsetDrawable$InsetState;->-$$Nest$fputmThemeAttrs(Landroid/graphics/drawable/InsetDrawable$InsetState;[I)V
-HSPLandroid/graphics/drawable/InsetDrawable$InsetState;-><init>(Landroid/graphics/drawable/InsetDrawable$InsetState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/InsetDrawable$InsetState;->applyDensityScaling(II)V
-HSPLandroid/graphics/drawable/InsetDrawable$InsetState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/InsetDrawable$InsetState;->onDensityChanged(II)V
-HSPLandroid/graphics/drawable/InsetDrawable$InsetValue;-><init>()V
-HSPLandroid/graphics/drawable/InsetDrawable$InsetValue;-><init>(FI)V
-HSPLandroid/graphics/drawable/InsetDrawable$InsetValue;->clone()Landroid/graphics/drawable/InsetDrawable$InsetValue;
-HSPLandroid/graphics/drawable/InsetDrawable$InsetValue;->getDimension(I)I
-HSPLandroid/graphics/drawable/InsetDrawable$InsetValue;->scaleFromDensity(II)V
-HSPLandroid/graphics/drawable/InsetDrawable;-><init>()V
-HSPLandroid/graphics/drawable/InsetDrawable;-><init>(Landroid/graphics/drawable/Drawable;I)V
-HSPLandroid/graphics/drawable/InsetDrawable;-><init>(Landroid/graphics/drawable/Drawable;IIII)V
-HSPLandroid/graphics/drawable/InsetDrawable;-><init>(Landroid/graphics/drawable/InsetDrawable$InsetState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/InsetDrawable;-><init>(Landroid/graphics/drawable/InsetDrawable$InsetState;Landroid/content/res/Resources;Landroid/graphics/drawable/InsetDrawable-IA;)V
-HSPLandroid/graphics/drawable/InsetDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/InsetDrawable;->getInset(Landroid/content/res/TypedArray;ILandroid/graphics/drawable/InsetDrawable$InsetValue;)Landroid/graphics/drawable/InsetDrawable$InsetValue;
-HSPLandroid/graphics/drawable/InsetDrawable;->getInsets(Landroid/graphics/Rect;)V+]Landroid/graphics/drawable/InsetDrawable;Landroid/graphics/drawable/InsetDrawable;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/InsetDrawable$InsetValue;Landroid/graphics/drawable/InsetDrawable$InsetValue;
-HSPLandroid/graphics/drawable/InsetDrawable;->getIntrinsicHeight()I
-HSPLandroid/graphics/drawable/InsetDrawable;->getIntrinsicWidth()I
-HSPLandroid/graphics/drawable/InsetDrawable;->getOpacity()I
-HSPLandroid/graphics/drawable/InsetDrawable;->getOutline(Landroid/graphics/Outline;)V
-HSPLandroid/graphics/drawable/InsetDrawable;->getPadding(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/drawable/InsetDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/InsetDrawable;->mutateConstantState()Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;
-HSPLandroid/graphics/drawable/InsetDrawable;->onBoundsChange(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/InsetDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/InsetDrawable;->verifyRequiredAttributes(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/LayerDrawable$ChildDrawable;-><init>(I)V
-HSPLandroid/graphics/drawable/LayerDrawable$ChildDrawable;-><init>(Landroid/graphics/drawable/LayerDrawable$ChildDrawable;Landroid/graphics/drawable/LayerDrawable;Landroid/content/res/Resources;)V+]Landroid/graphics/drawable/Drawable$ConstantState;missing_types]Landroid/graphics/drawable/Drawable;missing_types
-HSPLandroid/graphics/drawable/LayerDrawable$ChildDrawable;->applyDensityScaling(II)V
-HSPLandroid/graphics/drawable/LayerDrawable$ChildDrawable;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/LayerDrawable$ChildDrawable;->setDensity(I)V
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->-$$Nest$fgetmPaddingMode(Landroid/graphics/drawable/LayerDrawable$LayerState;)I
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->-$$Nest$fputmPaddingMode(Landroid/graphics/drawable/LayerDrawable$LayerState;I)V
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->-$$Nest$fputmThemeAttrs(Landroid/graphics/drawable/LayerDrawable$LayerState;[I)V
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;-><init>(Landroid/graphics/drawable/LayerDrawable$LayerState;Landroid/graphics/drawable/LayerDrawable;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->applyDensityScaling(II)V
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->canConstantState()Z
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->getOpacity()I
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->invalidateCache()V
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->isStateful()Z
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->newDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->onDensityChanged(II)V
-HSPLandroid/graphics/drawable/LayerDrawable$LayerState;->setDensity(I)V
-HSPLandroid/graphics/drawable/LayerDrawable;-><init>()V
-HSPLandroid/graphics/drawable/LayerDrawable;-><init>(Landroid/graphics/drawable/LayerDrawable$LayerState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/LayerDrawable;-><init>([Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/LayerDrawable;-><init>([Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/LayerDrawable$LayerState;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->addLayer(Landroid/graphics/drawable/Drawable;[IIIIII)Landroid/graphics/drawable/LayerDrawable$ChildDrawable;
-HSPLandroid/graphics/drawable/LayerDrawable;->addLayer(Landroid/graphics/drawable/LayerDrawable$ChildDrawable;)I
-HSPLandroid/graphics/drawable/LayerDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/LayerDrawable;->clearMutated()V
-HSPLandroid/graphics/drawable/LayerDrawable;->computeNestedPadding(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->computeStackedPadding(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->createConstantState(Landroid/graphics/drawable/LayerDrawable$LayerState;Landroid/content/res/Resources;)Landroid/graphics/drawable/LayerDrawable$LayerState;
-HSPLandroid/graphics/drawable/LayerDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->ensurePadding()V
-HSPLandroid/graphics/drawable/LayerDrawable;->findDrawableByLayerId(I)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/LayerDrawable;->findIndexByLayerId(I)I
-HSPLandroid/graphics/drawable/LayerDrawable;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/LayerDrawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;
-HSPLandroid/graphics/drawable/LayerDrawable;->getDrawable(I)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/LayerDrawable;->getIntrinsicHeight()I
-HSPLandroid/graphics/drawable/LayerDrawable;->getIntrinsicWidth()I
-HSPLandroid/graphics/drawable/LayerDrawable;->getNumberOfLayers()I
-HSPLandroid/graphics/drawable/LayerDrawable;->getOpacity()I
-HSPLandroid/graphics/drawable/LayerDrawable;->getOutline(Landroid/graphics/Outline;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->getPadding(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/drawable/LayerDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->inflateLayers(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->isAutoMirrored()Z
-HSPLandroid/graphics/drawable/LayerDrawable;->isProjected()Z
-HSPLandroid/graphics/drawable/LayerDrawable;->isStateful()Z
-HSPLandroid/graphics/drawable/LayerDrawable;->jumpToCurrentState()V
-HSPLandroid/graphics/drawable/LayerDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/LayerDrawable;->onBoundsChange(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/LayerDrawable;->refreshChildPadding(ILandroid/graphics/drawable/LayerDrawable$ChildDrawable;)Z
-HSPLandroid/graphics/drawable/LayerDrawable;->refreshPadding()V
-HSPLandroid/graphics/drawable/LayerDrawable;->resolveGravity(IIIII)I
-HSPLandroid/graphics/drawable/LayerDrawable;->resumeChildInvalidation()V
-HSPLandroid/graphics/drawable/LayerDrawable;->setAlpha(I)V
-HSPLandroid/graphics/drawable/LayerDrawable;->setAutoMirrored(Z)V
-HSPLandroid/graphics/drawable/LayerDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->setDither(Z)V
-HSPLandroid/graphics/drawable/LayerDrawable;->setDrawable(ILandroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->setDrawableByLayerId(ILandroid/graphics/drawable/Drawable;)Z
-HSPLandroid/graphics/drawable/LayerDrawable;->setHotspot(FF)V
-HSPLandroid/graphics/drawable/LayerDrawable;->setId(II)V
-HSPLandroid/graphics/drawable/LayerDrawable;->setLayerInset(IIIII)V
-HSPLandroid/graphics/drawable/LayerDrawable;->setPaddingMode(I)V
-HSPLandroid/graphics/drawable/LayerDrawable;->setTintBlendMode(Landroid/graphics/BlendMode;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->setTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->setVisible(ZZ)Z
-HSPLandroid/graphics/drawable/LayerDrawable;->suspendChildInvalidation()V
-HSPLandroid/graphics/drawable/LayerDrawable;->updateLayerBounds(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->updateLayerBoundsInternal(Landroid/graphics/Rect;)V+]Landroid/graphics/drawable/LayerDrawable;Landroid/graphics/drawable/LayerDrawable;,Landroid/graphics/drawable/RippleDrawable;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/Drawable;missing_types
-HSPLandroid/graphics/drawable/LayerDrawable;->updateLayerFromTypedArray(Landroid/graphics/drawable/LayerDrawable$ChildDrawable;Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/LayerDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable$$ExternalSyntheticLambda0;->onHeaderDecoded(Landroid/graphics/ImageDecoder;Landroid/graphics/ImageDecoder$ImageInfo;Landroid/graphics/ImageDecoder$Source;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable$NinePatchState;-><init>()V
-HSPLandroid/graphics/drawable/NinePatchDrawable$NinePatchState;-><init>(Landroid/graphics/NinePatch;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable$NinePatchState;-><init>(Landroid/graphics/NinePatch;Landroid/graphics/Rect;Landroid/graphics/Rect;ZZ)V
-HSPLandroid/graphics/drawable/NinePatchDrawable$NinePatchState;-><init>(Landroid/graphics/drawable/NinePatchDrawable$NinePatchState;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable$NinePatchState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/NinePatchDrawable$NinePatchState;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/NinePatchDrawable$NinePatchState;->newDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/NinePatchDrawable$NinePatchState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/NinePatchDrawable;-><init>(Landroid/content/res/Resources;Landroid/graphics/Bitmap;[BLandroid/graphics/Rect;Landroid/graphics/Rect;Ljava/lang/String;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;-><init>(Landroid/graphics/drawable/NinePatchDrawable$NinePatchState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/NinePatchDrawable;->clearMutated()V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->computeBitmapSize()V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->getAlpha()I
-HSPLandroid/graphics/drawable/NinePatchDrawable;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/NinePatchDrawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;
-HSPLandroid/graphics/drawable/NinePatchDrawable;->getIntrinsicHeight()I
-HSPLandroid/graphics/drawable/NinePatchDrawable;->getIntrinsicWidth()I
-HSPLandroid/graphics/drawable/NinePatchDrawable;->getOpacity()I
-HSPLandroid/graphics/drawable/NinePatchDrawable;->getOpticalInsets()Landroid/graphics/Insets;
-HSPLandroid/graphics/drawable/NinePatchDrawable;->getOutline(Landroid/graphics/Outline;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->getPadding(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/drawable/NinePatchDrawable;->getPaint()Landroid/graphics/Paint;
-HSPLandroid/graphics/drawable/NinePatchDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->isAutoMirrored()Z
-HSPLandroid/graphics/drawable/NinePatchDrawable;->isStateful()Z
-HSPLandroid/graphics/drawable/NinePatchDrawable;->lambda$updateStateFromTypedArray$0(Landroid/graphics/Rect;Landroid/graphics/ImageDecoder;Landroid/graphics/ImageDecoder$ImageInfo;Landroid/graphics/ImageDecoder$Source;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/NinePatchDrawable;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/NinePatchDrawable;->setAlpha(I)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->setAutoMirrored(Z)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->setDither(Z)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->setTintBlendMode(Landroid/graphics/BlendMode;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->setTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->updateLocalState(Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession$2;-><init>(Landroid/graphics/drawable/RippleAnimationSession;Landroid/graphics/drawable/RippleAnimationSession;Landroid/graphics/animation/RenderNodeAnimator;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession$2;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession$3;-><init>(Landroid/graphics/drawable/RippleAnimationSession;Landroid/graphics/drawable/RippleAnimationSession;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession$3;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession$AnimationProperties;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;ILandroid/graphics/drawable/RippleShader;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession$AnimationProperties;->getColor()I
-HSPLandroid/graphics/drawable/RippleAnimationSession$AnimationProperties;->getMaxRadius()Ljava/lang/Object;
-HSPLandroid/graphics/drawable/RippleAnimationSession$AnimationProperties;->getNoisePhase()Ljava/lang/Object;
-HSPLandroid/graphics/drawable/RippleAnimationSession$AnimationProperties;->getPaint()Ljava/lang/Object;
-HSPLandroid/graphics/drawable/RippleAnimationSession$AnimationProperties;->getProgress()Ljava/lang/Object;
-HSPLandroid/graphics/drawable/RippleAnimationSession$AnimationProperties;->getShader()Landroid/graphics/drawable/RippleShader;
-HSPLandroid/graphics/drawable/RippleAnimationSession$AnimationProperties;->getX()Ljava/lang/Object;
-HSPLandroid/graphics/drawable/RippleAnimationSession$AnimationProperties;->getY()Ljava/lang/Object;
-HSPLandroid/graphics/drawable/RippleAnimationSession$AnimatorListener;-><init>(Landroid/graphics/drawable/RippleAnimationSession;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession$AnimatorListener;->onAnimationCancel(Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession$AnimatorListener;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession$AnimatorListener;->onAnimationStart(Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession;->-$$Nest$fgetmCurrentAnimation(Landroid/graphics/drawable/RippleAnimationSession;)Landroid/animation/Animator;
-HSPLandroid/graphics/drawable/RippleAnimationSession;->-$$Nest$fgetmLoopAnimation(Landroid/graphics/drawable/RippleAnimationSession;)Landroid/animation/Animator;
-HSPLandroid/graphics/drawable/RippleAnimationSession;->-$$Nest$fgetmOnSessionEnd(Landroid/graphics/drawable/RippleAnimationSession;)Ljava/util/function/Consumer;
-HSPLandroid/graphics/drawable/RippleAnimationSession;->-$$Nest$fputmCurrentAnimation(Landroid/graphics/drawable/RippleAnimationSession;Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession;->-$$Nest$fputmLoopAnimation(Landroid/graphics/drawable/RippleAnimationSession;Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession;->-$$Nest$monAnimationEnd(Landroid/graphics/drawable/RippleAnimationSession;Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession;-><clinit>()V
-HSPLandroid/graphics/drawable/RippleAnimationSession;-><init>(Landroid/graphics/drawable/RippleAnimationSession$AnimationProperties;Z)V
-HSPLandroid/graphics/drawable/RippleAnimationSession;->computeDelay()J
-HSPLandroid/graphics/drawable/RippleAnimationSession;->end()V
-HSPLandroid/graphics/drawable/RippleAnimationSession;->enter(Landroid/graphics/Canvas;)Landroid/graphics/drawable/RippleAnimationSession;
-HSPLandroid/graphics/drawable/RippleAnimationSession;->enterHardware(Landroid/graphics/RecordingCanvas;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession;->exit(Landroid/graphics/Canvas;)Landroid/graphics/drawable/RippleAnimationSession;
-HSPLandroid/graphics/drawable/RippleAnimationSession;->exitHardware(Landroid/graphics/RecordingCanvas;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession;->getCanvasProperties()Landroid/graphics/drawable/RippleAnimationSession$AnimationProperties;
-HSPLandroid/graphics/drawable/RippleAnimationSession;->getProperties()Landroid/graphics/drawable/RippleAnimationSession$AnimationProperties;
-HSPLandroid/graphics/drawable/RippleAnimationSession;->notifyUpdate()V
-HSPLandroid/graphics/drawable/RippleAnimationSession;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession;->setForceSoftwareAnimation(Z)Landroid/graphics/drawable/RippleAnimationSession;
-HSPLandroid/graphics/drawable/RippleAnimationSession;->setOnAnimationUpdated(Ljava/lang/Runnable;)Landroid/graphics/drawable/RippleAnimationSession;
-HSPLandroid/graphics/drawable/RippleAnimationSession;->setOnSessionEnd(Ljava/util/function/Consumer;)Landroid/graphics/drawable/RippleAnimationSession;
-HSPLandroid/graphics/drawable/RippleAnimationSession;->startAnimation(Landroid/animation/Animator;Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/RippleAnimationSession;->useRTAnimations(Landroid/graphics/Canvas;)Z
-HSPLandroid/graphics/drawable/RippleComponent;->onBoundsChange()V
-HSPLandroid/graphics/drawable/RippleDrawable$$ExternalSyntheticLambda0;-><init>(Landroid/graphics/drawable/RippleDrawable;)V
-HSPLandroid/graphics/drawable/RippleDrawable$$ExternalSyntheticLambda0;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V
-HSPLandroid/graphics/drawable/RippleDrawable$$ExternalSyntheticLambda1;-><init>(Landroid/graphics/drawable/RippleDrawable;)V
-HSPLandroid/graphics/drawable/RippleDrawable$$ExternalSyntheticLambda1;->run()V
-HSPLandroid/graphics/drawable/RippleDrawable$$ExternalSyntheticLambda2;-><init>(Landroid/graphics/drawable/RippleDrawable;)V
-HSPLandroid/graphics/drawable/RippleDrawable$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V
-HSPLandroid/graphics/drawable/RippleDrawable$RippleState;-><init>(Landroid/graphics/drawable/LayerDrawable$LayerState;Landroid/graphics/drawable/RippleDrawable;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/RippleDrawable$RippleState;->applyDensityScaling(II)V
-HSPLandroid/graphics/drawable/RippleDrawable$RippleState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/RippleDrawable$RippleState;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/RippleDrawable$RippleState;->newDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/RippleDrawable$RippleState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/RippleDrawable$RippleState;->onDensityChanged(II)V
-HSPLandroid/graphics/drawable/RippleDrawable;-><init>()V
-HSPLandroid/graphics/drawable/RippleDrawable;-><init>(Landroid/content/res/ColorStateList;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/RippleDrawable;-><init>(Landroid/graphics/drawable/RippleDrawable$RippleState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/RippleDrawable;-><init>(Landroid/graphics/drawable/RippleDrawable$RippleState;Landroid/content/res/Resources;Landroid/graphics/drawable/RippleDrawable-IA;)V
-HSPLandroid/graphics/drawable/RippleDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/RippleDrawable;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/RippleDrawable;->cancelExitingRipples()V
-HSPLandroid/graphics/drawable/RippleDrawable;->clearHotspots()V
-HSPLandroid/graphics/drawable/RippleDrawable;->computeRadius()F
-HSPLandroid/graphics/drawable/RippleDrawable;->createAnimationProperties(FFFFFF)Landroid/graphics/drawable/RippleAnimationSession$AnimationProperties;
-HSPLandroid/graphics/drawable/RippleDrawable;->createConstantState(Landroid/graphics/drawable/LayerDrawable$LayerState;Landroid/content/res/Resources;)Landroid/graphics/drawable/LayerDrawable$LayerState;
-HSPLandroid/graphics/drawable/RippleDrawable;->createConstantState(Landroid/graphics/drawable/LayerDrawable$LayerState;Landroid/content/res/Resources;)Landroid/graphics/drawable/RippleDrawable$RippleState;
-HSPLandroid/graphics/drawable/RippleDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/RippleDrawable;->drawBackgroundAndRipples(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/RippleDrawable;->drawContent(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/RippleDrawable;->drawPatterned(Landroid/graphics/Canvas;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/RippleDrawable;Landroid/graphics/drawable/RippleDrawable;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/drawable/RippleAnimationSession$AnimationProperties;Landroid/graphics/drawable/RippleAnimationSession$AnimationProperties;]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/drawable/RippleAnimationSession;Landroid/graphics/drawable/RippleAnimationSession;
-HSPLandroid/graphics/drawable/RippleDrawable;->drawPatternedBackground(Landroid/graphics/Canvas;FF)V
-HSPLandroid/graphics/drawable/RippleDrawable;->exitPatternedAnimation()V
-HSPLandroid/graphics/drawable/RippleDrawable;->exitPatternedBackgroundAnimation()V
-HSPLandroid/graphics/drawable/RippleDrawable;->getComputedRadius()I
-HSPLandroid/graphics/drawable/RippleDrawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;
-HSPLandroid/graphics/drawable/RippleDrawable;->getDirtyBounds()Landroid/graphics/Rect;+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/RippleDrawable;Landroid/graphics/drawable/RippleDrawable;
-HSPLandroid/graphics/drawable/RippleDrawable;->getMaskType()I
-HSPLandroid/graphics/drawable/RippleDrawable;->getOpacity()I
-HSPLandroid/graphics/drawable/RippleDrawable;->getOutline(Landroid/graphics/Outline;)V+]Landroid/graphics/Outline;Landroid/graphics/Outline;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/InsetDrawable;,Landroid/graphics/drawable/StateListDrawable;
-HSPLandroid/graphics/drawable/RippleDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/RippleDrawable;->invalidateSelf()V
-HSPLandroid/graphics/drawable/RippleDrawable;->invalidateSelf(Z)V
-HSPLandroid/graphics/drawable/RippleDrawable;->isBounded()Z
-HSPLandroid/graphics/drawable/RippleDrawable;->isProjected()Z+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/RippleDrawable;Landroid/graphics/drawable/RippleDrawable;
-HSPLandroid/graphics/drawable/RippleDrawable;->isStateful()Z
-HSPLandroid/graphics/drawable/RippleDrawable;->jumpToCurrentState()V
-HSPLandroid/graphics/drawable/RippleDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/RippleDrawable;->onBoundsChange(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/RippleDrawable;->onHotspotBoundsChanged()V
-HSPLandroid/graphics/drawable/RippleDrawable;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/RippleDrawable;->pruneRipples()V
-HSPLandroid/graphics/drawable/RippleDrawable;->setBackgroundActive(ZZZZ)V
-HSPLandroid/graphics/drawable/RippleDrawable;->setColor(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/RippleDrawable;->setHotspot(FF)V
-HSPLandroid/graphics/drawable/RippleDrawable;->setHotspotBounds(IIII)V
-HSPLandroid/graphics/drawable/RippleDrawable;->setPaddingMode(I)V
-HSPLandroid/graphics/drawable/RippleDrawable;->setRippleActive(Z)V
-HSPLandroid/graphics/drawable/RippleDrawable;->setVisible(ZZ)Z
-HSPLandroid/graphics/drawable/RippleDrawable;->startBackgroundAnimation()V
-HSPLandroid/graphics/drawable/RippleDrawable;->tryRippleEnter()V
-HSPLandroid/graphics/drawable/RippleDrawable;->updateLocalState()V
-HSPLandroid/graphics/drawable/RippleDrawable;->updateMaskShaderIfNeeded()V
-HSPLandroid/graphics/drawable/RippleDrawable;->updateRipplePaint()Landroid/graphics/Paint;
-HSPLandroid/graphics/drawable/RippleDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/RippleDrawable;->verifyRequiredAttributes(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/RippleForeground$1;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/graphics/drawable/RippleForeground$2;->get(Landroid/graphics/drawable/RippleForeground;)Ljava/lang/Float;
-HSPLandroid/graphics/drawable/RippleForeground$2;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/graphics/drawable/RippleForeground$2;->setValue(Landroid/graphics/drawable/RippleForeground;F)V
-HSPLandroid/graphics/drawable/RippleForeground$2;->setValue(Ljava/lang/Object;F)V
-HSPLandroid/graphics/drawable/RippleForeground$3;->get(Landroid/graphics/drawable/RippleForeground;)Ljava/lang/Float;
-HSPLandroid/graphics/drawable/RippleForeground$3;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/graphics/drawable/RippleForeground$3;->setValue(Landroid/graphics/drawable/RippleForeground;F)V
-HSPLandroid/graphics/drawable/RippleForeground$3;->setValue(Ljava/lang/Object;F)V
-HSPLandroid/graphics/drawable/RippleForeground$4;->get(Landroid/graphics/drawable/RippleForeground;)Ljava/lang/Float;
-HSPLandroid/graphics/drawable/RippleForeground$4;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/graphics/drawable/RippleForeground$4;->setValue(Landroid/graphics/drawable/RippleForeground;F)V
-HSPLandroid/graphics/drawable/RippleForeground$4;->setValue(Ljava/lang/Object;F)V
-HSPLandroid/graphics/drawable/RippleForeground;-><init>(Landroid/graphics/drawable/RippleDrawable;Landroid/graphics/Rect;FFZ)V
-HSPLandroid/graphics/drawable/RippleForeground;->clampStartingPosition()V
-HSPLandroid/graphics/drawable/RippleForeground;->draw(Landroid/graphics/Canvas;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/drawable/RippleForeground;->drawSoftware(Landroid/graphics/Canvas;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/drawable/RippleForeground;->end()V
-HSPLandroid/graphics/drawable/RippleForeground;->getBounds(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/RippleForeground;->hasFinishedExit()Z
-HSPLandroid/graphics/drawable/RippleForeground;->move(FF)V
-HSPLandroid/graphics/drawable/RippleForeground;->onTargetRadiusChanged(F)V
-HSPLandroid/graphics/drawable/RippleForeground;->pruneHwFinished()V
-HSPLandroid/graphics/drawable/RippleForeground;->pruneSwFinished()V
-HSPLandroid/graphics/drawable/RippleForeground;->startHardwareEnter()V
-HSPLandroid/graphics/drawable/RippleForeground;->startHardwareExit()V
-HSPLandroid/graphics/drawable/RippleForeground;->startPending(Landroid/graphics/RecordingCanvas;)V
-HSPLandroid/graphics/drawable/RippleForeground;->startSoftwareEnter()V
-HSPLandroid/graphics/drawable/RippleForeground;->startSoftwareExit()V
-HSPLandroid/graphics/drawable/RippleForeground;->switchToUiThreadAnimation()V
-HSPLandroid/graphics/drawable/RippleShader;-><init>()V
-HSPLandroid/graphics/drawable/RippleShader;->setColor(II)V
-HSPLandroid/graphics/drawable/RippleShader;->setNoisePhase(F)V
-HSPLandroid/graphics/drawable/RippleShader;->setOrigin(FF)V
-HSPLandroid/graphics/drawable/RippleShader;->setProgress(F)V
-HSPLandroid/graphics/drawable/RippleShader;->setRadius(F)V
-HSPLandroid/graphics/drawable/RippleShader;->setResolution(FF)V
-HSPLandroid/graphics/drawable/RippleShader;->setShader(Landroid/graphics/Shader;)V
-HSPLandroid/graphics/drawable/RippleShader;->setTouch(FF)V
-HSPLandroid/graphics/drawable/RotateDrawable$RotateState;-><init>(Landroid/graphics/drawable/RotateDrawable$RotateState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/RotateDrawable$RotateState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/RotateDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/RotateDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/RotateDrawable;->mutateConstantState()Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;
-HSPLandroid/graphics/drawable/RotateDrawable;->onLevelChange(I)Z
-HSPLandroid/graphics/drawable/RotateDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/RotateDrawable;->verifyRequiredAttributes(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/ScaleDrawable$ScaleState;->-$$Nest$fputmThemeAttrs(Landroid/graphics/drawable/ScaleDrawable$ScaleState;[I)V
-HSPLandroid/graphics/drawable/ScaleDrawable$ScaleState;-><init>(Landroid/graphics/drawable/ScaleDrawable$ScaleState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/ScaleDrawable$ScaleState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/ScaleDrawable;-><init>()V
-HSPLandroid/graphics/drawable/ScaleDrawable;-><init>(Landroid/graphics/drawable/ScaleDrawable$ScaleState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/ScaleDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/ScaleDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/ScaleDrawable;->getPercent(Landroid/content/res/TypedArray;IF)F
-HSPLandroid/graphics/drawable/ScaleDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/ScaleDrawable;->mutateConstantState()Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;
-HSPLandroid/graphics/drawable/ScaleDrawable;->onBoundsChange(Landroid/graphics/Rect;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/ScaleDrawable;Landroid/graphics/drawable/ScaleDrawable;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/StateListDrawable;
-HSPLandroid/graphics/drawable/ScaleDrawable;->onLevelChange(I)Z
-HSPLandroid/graphics/drawable/ScaleDrawable;->updateLocalState()V
-HSPLandroid/graphics/drawable/ScaleDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/ScaleDrawable;->verifyRequiredAttributes(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/ShapeDrawable$ShapeState;-><init>(Landroid/graphics/drawable/ShapeDrawable$ShapeState;)V
-HSPLandroid/graphics/drawable/ShapeDrawable;-><init>()V
-HSPLandroid/graphics/drawable/ShapeDrawable;-><init>(Landroid/graphics/drawable/ShapeDrawable$ShapeState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/ShapeDrawable;-><init>(Landroid/graphics/drawable/shapes/Shape;)V
-HSPLandroid/graphics/drawable/ShapeDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/ShapeDrawable;->getAlpha()I
-HSPLandroid/graphics/drawable/ShapeDrawable;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/ShapeDrawable;->getIntrinsicHeight()I
-HSPLandroid/graphics/drawable/ShapeDrawable;->getIntrinsicWidth()I
-HSPLandroid/graphics/drawable/ShapeDrawable;->getOpacity()I
-HSPLandroid/graphics/drawable/ShapeDrawable;->getOutline(Landroid/graphics/Outline;)V
-HSPLandroid/graphics/drawable/ShapeDrawable;->getPadding(Landroid/graphics/Rect;)Z
-HSPLandroid/graphics/drawable/ShapeDrawable;->getPaint()Landroid/graphics/Paint;
-HSPLandroid/graphics/drawable/ShapeDrawable;->isStateful()Z
-HSPLandroid/graphics/drawable/ShapeDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/ShapeDrawable;->onBoundsChange(Landroid/graphics/Rect;)V
-HSPLandroid/graphics/drawable/ShapeDrawable;->onDraw(Landroid/graphics/drawable/shapes/Shape;Landroid/graphics/Canvas;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/drawable/ShapeDrawable;->setAlpha(I)V
-HSPLandroid/graphics/drawable/ShapeDrawable;->setIntrinsicHeight(I)V
-HSPLandroid/graphics/drawable/ShapeDrawable;->setIntrinsicWidth(I)V
-HSPLandroid/graphics/drawable/ShapeDrawable;->setShape(Landroid/graphics/drawable/shapes/Shape;)V
-HSPLandroid/graphics/drawable/ShapeDrawable;->setTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/ShapeDrawable;->updateLocalState()V
-HSPLandroid/graphics/drawable/ShapeDrawable;->updateShape()V
-HSPLandroid/graphics/drawable/StateListDrawable$StateListState;-><init>(Landroid/graphics/drawable/StateListDrawable$StateListState;Landroid/graphics/drawable/StateListDrawable;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/StateListDrawable$StateListState;->addStateSet([ILandroid/graphics/drawable/Drawable;)I
-HSPLandroid/graphics/drawable/StateListDrawable$StateListState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/StateListDrawable$StateListState;->indexOfStateSet([I)I
-HSPLandroid/graphics/drawable/StateListDrawable$StateListState;->mutate()V
-HSPLandroid/graphics/drawable/StateListDrawable$StateListState;->newDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/StateListDrawable$StateListState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/StateListDrawable;-><init>()V
-HSPLandroid/graphics/drawable/StateListDrawable;-><init>(Landroid/graphics/drawable/StateListDrawable$StateListState;)V
-HSPLandroid/graphics/drawable/StateListDrawable;-><init>(Landroid/graphics/drawable/StateListDrawable$StateListState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/StateListDrawable;-><init>(Landroid/graphics/drawable/StateListDrawable$StateListState;Landroid/content/res/Resources;Landroid/graphics/drawable/StateListDrawable-IA;)V
-HSPLandroid/graphics/drawable/StateListDrawable;->addState([ILandroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/StateListDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/StateListDrawable;->clearMutated()V
-HSPLandroid/graphics/drawable/StateListDrawable;->cloneConstantState()Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;
-HSPLandroid/graphics/drawable/StateListDrawable;->cloneConstantState()Landroid/graphics/drawable/StateListDrawable$StateListState;
-HSPLandroid/graphics/drawable/StateListDrawable;->extractStateSet(Landroid/util/AttributeSet;)[I
-HSPLandroid/graphics/drawable/StateListDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/StateListDrawable;->inflateChildElements(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/StateListDrawable;->isStateful()Z
-HSPLandroid/graphics/drawable/StateListDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/StateListDrawable;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/StateListDrawable;->setConstantState(Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;)V
-HSPLandroid/graphics/drawable/StateListDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/TransitionDrawable$TransitionState;-><init>(Landroid/graphics/drawable/TransitionDrawable$TransitionState;Landroid/graphics/drawable/TransitionDrawable;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/TransitionDrawable$TransitionState;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/TransitionDrawable;-><init>([Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/TransitionDrawable;->createConstantState(Landroid/graphics/drawable/LayerDrawable$LayerState;Landroid/content/res/Resources;)Landroid/graphics/drawable/LayerDrawable$LayerState;
-HSPLandroid/graphics/drawable/TransitionDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/TransitionDrawable;->setCrossFadeEnabled(Z)V
-HSPLandroid/graphics/drawable/TransitionDrawable;->startTransition(I)V
-HSPLandroid/graphics/drawable/VectorDrawable$VClipPath;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/VectorDrawable$VClipPath;->getNativePtr()J
-HSPLandroid/graphics/drawable/VectorDrawable$VClipPath;->getNativeSize()I
-HSPLandroid/graphics/drawable/VectorDrawable$VClipPath;->isStateful()Z
-HSPLandroid/graphics/drawable/VectorDrawable$VClipPath;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;-><init>()V
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;-><init>(Landroid/graphics/drawable/VectorDrawable$VFullPath;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->canComplexColorApplyTheme(Landroid/content/res/ComplexColor;)Z
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->getFillColor()I
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->getNativePtr()J
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->getNativeSize()I
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->getProperty(Ljava/lang/String;)Landroid/util/Property;
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->getPropertyIndex(Ljava/lang/String;)I
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->inflate(Landroid/content/res/Resources;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->isStateful()Z
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V+]Ljava/lang/String;Ljava/lang/String;]Landroid/content/res/ComplexColor;Landroid/content/res/ColorStateList;]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->-$$Nest$fgetmChangingConfigurations(Landroid/graphics/drawable/VectorDrawable$VGroup;)I
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->-$$Nest$fgetmNativePtr(Landroid/graphics/drawable/VectorDrawable$VGroup;)J
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;-><init>()V
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;-><init>(Landroid/graphics/drawable/VectorDrawable$VGroup;Landroid/util/ArrayMap;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/graphics/drawable/VectorDrawable$VGroup;Landroid/graphics/drawable/VectorDrawable$VGroup;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->addChild(Landroid/graphics/drawable/VectorDrawable$VObject;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/graphics/drawable/VectorDrawable$VObject;Landroid/graphics/drawable/VectorDrawable$VGroup;,Landroid/graphics/drawable/VectorDrawable$VFullPath;
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->getGroupName()Ljava/lang/String;
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->getNativePtr()J
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->getNativeSize()I
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->getProperty(Ljava/lang/String;)Landroid/util/Property;
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->inflate(Landroid/content/res/Resources;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->isStateful()Z
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->setTree(Lcom/android/internal/util/VirtualRefBasePtr;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VObject;-><init>()V
-HSPLandroid/graphics/drawable/VectorDrawable$VObject;->isTreeValid()Z
-HSPLandroid/graphics/drawable/VectorDrawable$VObject;->setTree(Lcom/android/internal/util/VirtualRefBasePtr;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VPath;-><init>()V
-HSPLandroid/graphics/drawable/VectorDrawable$VPath;-><init>(Landroid/graphics/drawable/VectorDrawable$VPath;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VPath;->getPathName()Ljava/lang/String;
-HSPLandroid/graphics/drawable/VectorDrawable$VPath;->getProperty(Ljava/lang/String;)Landroid/util/Property;
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->-$$Nest$mcreateNativeTree(Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/graphics/drawable/VectorDrawable$VGroup;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;-><init>(Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;)V+]Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->applyDensityScaling(II)V
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->canReuseCache()Z
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->createNativeTree(Landroid/graphics/drawable/VectorDrawable$VGroup;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->createNativeTreeFromCopy(Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/graphics/drawable/VectorDrawable$VGroup;)V
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->finalize()V
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->getAlpha()F
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->getNativeRenderer()J
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->isStateful()Z
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->newDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->onTreeConstructionFinished()V+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;]Landroid/graphics/drawable/VectorDrawable$VGroup;Landroid/graphics/drawable/VectorDrawable$VGroup;
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->setAlpha(F)Z
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->setDensity(I)Z
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->setViewportSize(FF)V
-HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->updateCacheStates()V
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnAddChild(JJ)V
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnCreateFullPath()J
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnCreateFullPath(J)J
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnCreateGroup()J
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnCreateGroup(J)J
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnCreateTree(J)J
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnCreateTreeFromCopy(JJ)J
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnGetFullPathProperties(J[BI)Z
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnGetGroupProperties(J[FI)Z
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnGetRootAlpha(J)F
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnSetName(JLjava/lang/String;)V
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnSetPathString(JLjava/lang/String;I)V
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnSetRendererViewportSize(JFF)V
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnSetRootAlpha(JF)Z
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnUpdateFullPathFillGradient(JJ)V
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnUpdateFullPathProperties(JFIFIFFFFFIII)V
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnUpdateFullPathStrokeGradient(JJ)V
-HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnUpdateGroupProperties(JFFFFFFF)V
-HSPLandroid/graphics/drawable/VectorDrawable;-><init>()V
-HSPLandroid/graphics/drawable/VectorDrawable;-><init>(Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/VectorDrawable;-><init>(Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/content/res/Resources;Landroid/graphics/drawable/VectorDrawable-IA;)V
-HSPLandroid/graphics/drawable/VectorDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V+]Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;]Landroid/content/res/ColorStateList;Landroid/content/res/ColorStateList;]Landroid/content/res/Resources$Theme;Landroid/content/res/Resources$Theme;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;
-HSPLandroid/graphics/drawable/VectorDrawable;->canApplyTheme()Z
-HSPLandroid/graphics/drawable/VectorDrawable;->clearMutated()V
-HSPLandroid/graphics/drawable/VectorDrawable;->computeVectorSize()V
-HSPLandroid/graphics/drawable/VectorDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/graphics/drawable/VectorDrawable;->getAlpha()I
-HSPLandroid/graphics/drawable/VectorDrawable;->getChangingConfigurations()I
-HSPLandroid/graphics/drawable/VectorDrawable;->getColorFilter()Landroid/graphics/ColorFilter;
-HSPLandroid/graphics/drawable/VectorDrawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;
-HSPLandroid/graphics/drawable/VectorDrawable;->getIntrinsicHeight()I
-HSPLandroid/graphics/drawable/VectorDrawable;->getIntrinsicWidth()I
-HSPLandroid/graphics/drawable/VectorDrawable;->getNativeTree()J
-HSPLandroid/graphics/drawable/VectorDrawable;->getOpacity()I
-HSPLandroid/graphics/drawable/VectorDrawable;->getPixelSize()F
-HSPLandroid/graphics/drawable/VectorDrawable;->getTargetByName(Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroid/graphics/drawable/VectorDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V+]Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;]Lcom/android/internal/util/VirtualRefBasePtr;Lcom/android/internal/util/VirtualRefBasePtr;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Landroid/graphics/drawable/VectorDrawable$VGroup;Landroid/graphics/drawable/VectorDrawable$VGroup;
-HSPLandroid/graphics/drawable/VectorDrawable;->inflateChildElements(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/XmlBlock$Parser;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Stack;Ljava/util/Stack;]Landroid/graphics/drawable/VectorDrawable$VGroup;Landroid/graphics/drawable/VectorDrawable$VGroup;]Landroid/graphics/drawable/VectorDrawable$VFullPath;Landroid/graphics/drawable/VectorDrawable$VFullPath;
-HSPLandroid/graphics/drawable/VectorDrawable;->isAutoMirrored()Z
-HSPLandroid/graphics/drawable/VectorDrawable;->isStateful()Z
-HSPLandroid/graphics/drawable/VectorDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/VectorDrawable;->needMirroring()Z
-HSPLandroid/graphics/drawable/VectorDrawable;->onStateChange([I)Z
-HSPLandroid/graphics/drawable/VectorDrawable;->setAllowCaching(Z)V
-HSPLandroid/graphics/drawable/VectorDrawable;->setAlpha(I)V
-HSPLandroid/graphics/drawable/VectorDrawable;->setAutoMirrored(Z)V
-HSPLandroid/graphics/drawable/VectorDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V
-HSPLandroid/graphics/drawable/VectorDrawable;->setTintBlendMode(Landroid/graphics/BlendMode;)V
-HSPLandroid/graphics/drawable/VectorDrawable;->setTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/VectorDrawable;->updateColorFilters(Landroid/graphics/BlendMode;Landroid/content/res/ColorStateList;)V
-HSPLandroid/graphics/drawable/VectorDrawable;->updateLocalState(Landroid/content/res/Resources;)V
-HSPLandroid/graphics/drawable/VectorDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V+]Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;
-HSPLandroid/graphics/drawable/shapes/OvalShape;-><init>()V
-HSPLandroid/graphics/drawable/shapes/OvalShape;->draw(Landroid/graphics/Canvas;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/drawable/shapes/OvalShape;->getOutline(Landroid/graphics/Outline;)V
-HSPLandroid/graphics/drawable/shapes/PathShape;->draw(Landroid/graphics/Canvas;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/drawable/shapes/RectShape;-><init>()V
-HSPLandroid/graphics/drawable/shapes/RectShape;->onResize(FF)V
-HSPLandroid/graphics/drawable/shapes/RectShape;->rect()Landroid/graphics/RectF;
-HSPLandroid/graphics/drawable/shapes/RoundRectShape;-><init>([FLandroid/graphics/RectF;[F)V
-HSPLandroid/graphics/drawable/shapes/RoundRectShape;->draw(Landroid/graphics/Canvas;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/drawable/shapes/RoundRectShape;->getOutline(Landroid/graphics/Outline;)V
-HSPLandroid/graphics/drawable/shapes/RoundRectShape;->onResize(FF)V
-HSPLandroid/graphics/drawable/shapes/Shape;-><init>()V
-HSPLandroid/graphics/drawable/shapes/Shape;->resize(FF)V
-HSPLandroid/graphics/fonts/Font$Builder;-><init>(Landroid/content/res/AssetManager;Ljava/lang/String;ZI)V
-HSPLandroid/graphics/fonts/Font$Builder;-><init>(Landroid/os/ParcelFileDescriptor;)V
-HSPLandroid/graphics/fonts/Font$Builder;-><init>(Landroid/os/ParcelFileDescriptor;JJ)V
-HSPLandroid/graphics/fonts/Font$Builder;-><init>(Ljava/nio/ByteBuffer;)V
-HSPLandroid/graphics/fonts/Font$Builder;-><init>(Ljava/nio/ByteBuffer;Ljava/io/File;Ljava/lang/String;)V
-HSPLandroid/graphics/fonts/Font$Builder;->build()Landroid/graphics/fonts/Font;
-HSPLandroid/graphics/fonts/Font$Builder;->createBuffer(Landroid/content/res/AssetManager;Ljava/lang/String;ZI)Ljava/nio/ByteBuffer;
-HSPLandroid/graphics/fonts/Font$Builder;->setFontVariationSettings(Ljava/lang/String;)Landroid/graphics/fonts/Font$Builder;
-HSPLandroid/graphics/fonts/Font$Builder;->setFontVariationSettings([Landroid/graphics/fonts/FontVariationAxis;)Landroid/graphics/fonts/Font$Builder;
-HSPLandroid/graphics/fonts/Font$Builder;->setSlant(I)Landroid/graphics/fonts/Font$Builder;
-HSPLandroid/graphics/fonts/Font$Builder;->setTtcIndex(I)Landroid/graphics/fonts/Font$Builder;
-HSPLandroid/graphics/fonts/Font$Builder;->setWeight(I)Landroid/graphics/fonts/Font$Builder;
-HSPLandroid/graphics/fonts/Font;-><init>(J)V
-HSPLandroid/graphics/fonts/Font;->getAxes()[Landroid/graphics/fonts/FontVariationAxis;
-HSPLandroid/graphics/fonts/Font;->getNativePtr()J
-HSPLandroid/graphics/fonts/Font;->getStyle()Landroid/graphics/fonts/FontStyle;
-HSPLandroid/graphics/fonts/FontFamily$Builder;-><init>(Landroid/graphics/fonts/Font;)V
-HSPLandroid/graphics/fonts/FontFamily$Builder;->build()Landroid/graphics/fonts/FontFamily;
-HSPLandroid/graphics/fonts/FontFamily$Builder;->makeStyleIdentifier(Landroid/graphics/fonts/Font;)I
-HSPLandroid/graphics/fonts/FontFamily;-><init>(J)V
-HSPLandroid/graphics/fonts/FontFamily;->getFont(I)Landroid/graphics/fonts/Font;
-HSPLandroid/graphics/fonts/FontFamily;->getNativePtr()J
-HSPLandroid/graphics/fonts/FontFamily;->getSize()I
-HSPLandroid/graphics/fonts/FontFileUtil;->analyzeStyle(Ljava/nio/ByteBuffer;I[Landroid/graphics/fonts/FontVariationAxis;)I
-HSPLandroid/graphics/fonts/FontStyle;-><init>(II)V
-HSPLandroid/graphics/fonts/FontStyle;->getSlant()I
-HSPLandroid/graphics/fonts/FontStyle;->getWeight()I
-HSPLandroid/graphics/fonts/FontVariationAxis;-><init>(Ljava/lang/String;F)V
-HSPLandroid/graphics/fonts/FontVariationAxis;->fromFontVariationSettings(Ljava/lang/String;)[Landroid/graphics/fonts/FontVariationAxis;
-HSPLandroid/graphics/fonts/FontVariationAxis;->isValidTag(Ljava/lang/String;)Z
-HSPLandroid/graphics/fonts/FontVariationAxis;->makeTag(Ljava/lang/String;)I
-HSPLandroid/graphics/fonts/SystemFonts;->mmap(Ljava/lang/String;)Ljava/nio/ByteBuffer;
-HSPLandroid/graphics/text/LineBreakConfig$Builder;-><init>()V
-HSPLandroid/graphics/text/LineBreakConfig$Builder;->build()Landroid/graphics/text/LineBreakConfig;
-HSPLandroid/graphics/text/LineBreakConfig$Builder;->setLineBreakStyle(I)Landroid/graphics/text/LineBreakConfig$Builder;
-HSPLandroid/graphics/text/LineBreakConfig$Builder;->setLineBreakWordStyle(I)Landroid/graphics/text/LineBreakConfig$Builder;
-HSPLandroid/graphics/text/LineBreakConfig;-><clinit>()V
-HSPLandroid/graphics/text/LineBreakConfig;->getLineBreakConfig(II)Landroid/graphics/text/LineBreakConfig;
-HSPLandroid/graphics/text/LineBreakConfig;->getLineBreakStyle()I
-HSPLandroid/graphics/text/LineBreakConfig;->getLineBreakWordStyle()I
-HSPLandroid/graphics/text/LineBreaker$Builder;-><init>()V
-HSPLandroid/graphics/text/LineBreaker$Builder;->build()Landroid/graphics/text/LineBreaker;
-HSPLandroid/graphics/text/LineBreaker$Builder;->setBreakStrategy(I)Landroid/graphics/text/LineBreaker$Builder;
-HSPLandroid/graphics/text/LineBreaker$Builder;->setHyphenationFrequency(I)Landroid/graphics/text/LineBreaker$Builder;
-HSPLandroid/graphics/text/LineBreaker$Builder;->setIndents([I)Landroid/graphics/text/LineBreaker$Builder;
-HSPLandroid/graphics/text/LineBreaker$Builder;->setJustificationMode(I)Landroid/graphics/text/LineBreaker$Builder;
-HSPLandroid/graphics/text/LineBreaker$ParagraphConstraints;-><init>()V
-HSPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->setIndent(FI)V
-HSPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->setTabStops([FF)V
-HSPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->setWidth(F)V
-HSPLandroid/graphics/text/LineBreaker$Result;-><init>(J)V
-HSPLandroid/graphics/text/LineBreaker$Result;->getEndLineHyphenEdit(I)I
-HSPLandroid/graphics/text/LineBreaker$Result;->getLineAscent(I)F
-HSPLandroid/graphics/text/LineBreaker$Result;->getLineBreakOffset(I)I
-HSPLandroid/graphics/text/LineBreaker$Result;->getLineCount()I
-HSPLandroid/graphics/text/LineBreaker$Result;->getLineDescent(I)F
-HSPLandroid/graphics/text/LineBreaker$Result;->getLineWidth(I)F
-HSPLandroid/graphics/text/LineBreaker$Result;->getStartLineHyphenEdit(I)I
-HSPLandroid/graphics/text/LineBreaker$Result;->hasLineTab(I)Z
-HSPLandroid/graphics/text/LineBreaker;->computeLineBreaks(Landroid/graphics/text/MeasuredText;Landroid/graphics/text/LineBreaker$ParagraphConstraints;I)Landroid/graphics/text/LineBreaker$Result;
-HSPLandroid/graphics/text/MeasuredText$Builder;-><init>([C)V
-HSPLandroid/graphics/text/MeasuredText$Builder;->appendReplacementRun(Landroid/graphics/Paint;IF)Landroid/graphics/text/MeasuredText$Builder;
-HSPLandroid/graphics/text/MeasuredText$Builder;->appendStyleRun(Landroid/graphics/Paint;IZ)Landroid/graphics/text/MeasuredText$Builder;
-HSPLandroid/graphics/text/MeasuredText$Builder;->appendStyleRun(Landroid/graphics/Paint;Landroid/graphics/text/LineBreakConfig;IZ)Landroid/graphics/text/MeasuredText$Builder;
-HSPLandroid/graphics/text/MeasuredText$Builder;->build()Landroid/graphics/text/MeasuredText;
-HSPLandroid/graphics/text/MeasuredText$Builder;->ensureNativePtrNoReuse()V
-HSPLandroid/graphics/text/MeasuredText$Builder;->setComputeHyphenation(I)Landroid/graphics/text/MeasuredText$Builder;
-HSPLandroid/graphics/text/MeasuredText$Builder;->setComputeHyphenation(Z)Landroid/graphics/text/MeasuredText$Builder;
-HSPLandroid/graphics/text/MeasuredText$Builder;->setComputeLayout(Z)Landroid/graphics/text/MeasuredText$Builder;
-HSPLandroid/graphics/text/MeasuredText;->getCharWidthAt(I)F
-HSPLandroid/graphics/text/MeasuredText;->getChars()[C
-HSPLandroid/graphics/text/MeasuredText;->getNativePtr()J
-HSPLandroid/hardware/Camera$CameraInfo;-><init>()V
-HSPLandroid/hardware/Camera;->getCameraInfo(ILandroid/hardware/Camera$CameraInfo;)V
-HSPLandroid/hardware/CameraStatus$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/CameraStatus;
-HSPLandroid/hardware/CameraStatus$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/CameraStatus$1;->newArray(I)[Landroid/hardware/CameraStatus;
-HSPLandroid/hardware/CameraStatus$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/hardware/GeomagneticField$LegendreTable;-><init>(IF)V
-HSPLandroid/hardware/GeomagneticField;-><init>(FFFJ)V
-HSPLandroid/hardware/GeomagneticField;->computeGeocentricCoordinates(FFF)V
-HSPLandroid/hardware/HardwareBuffer$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/HardwareBuffer;
-HSPLandroid/hardware/HardwareBuffer$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/HardwareBuffer;-><init>(J)V
-HSPLandroid/hardware/HardwareBuffer;->close()V
-HSPLandroid/hardware/HardwareBuffer;->finalize()V
-HSPLandroid/hardware/HardwareBuffer;->getFormat()I
-HSPLandroid/hardware/HardwareBuffer;->getUsage()J
-HSPLandroid/hardware/HardwareBuffer;->isClosed()Z
-HSPLandroid/hardware/ICameraService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/hardware/ICameraService$Stub$Proxy;->addListener(Landroid/hardware/ICameraServiceListener;)[Landroid/hardware/CameraStatus;
-HSPLandroid/hardware/ICameraService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/hardware/ICameraService$Stub$Proxy;->getCameraCharacteristics(Ljava/lang/String;IZ)Landroid/hardware/camera2/impl/CameraMetadataNative;
-HSPLandroid/hardware/ICameraService$Stub$Proxy;->getConcurrentCameraIds()[Landroid/hardware/camera2/utils/ConcurrentCameraIdCombination;
-HSPLandroid/hardware/ICameraService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/ICameraService;
-HSPLandroid/hardware/ICameraServiceListener$Stub;->getMaxTransactionId()I
-HSPLandroid/hardware/ICameraServiceListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/hardware/OverlayProperties$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/OverlayProperties;
-HSPLandroid/hardware/OverlayProperties$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/OverlayProperties;->-$$Nest$smnReadOverlayPropertiesFromParcel(Landroid/os/Parcel;)J
-HSPLandroid/hardware/OverlayProperties;-><init>(J)V
-HSPLandroid/hardware/Sensor;-><init>()V
-HSPLandroid/hardware/Sensor;->getHandle()I
-HSPLandroid/hardware/Sensor;->getMaxLengthValuesArray(Landroid/hardware/Sensor;I)I
-HSPLandroid/hardware/Sensor;->getMaximumRange()F
-HSPLandroid/hardware/Sensor;->getName()Ljava/lang/String;
-HSPLandroid/hardware/Sensor;->getReportingMode()I
-HSPLandroid/hardware/Sensor;->getStringType()Ljava/lang/String;
-HSPLandroid/hardware/Sensor;->getType()I
-HSPLandroid/hardware/Sensor;->getVendor()Ljava/lang/String;
-HSPLandroid/hardware/Sensor;->isWakeUpSensor()Z
-HSPLandroid/hardware/Sensor;->setId(I)V
-HSPLandroid/hardware/Sensor;->setType(I)Z
-HSPLandroid/hardware/Sensor;->setUuid(JJ)V
-HSPLandroid/hardware/SensorEvent;-><init>(I)V
-HSPLandroid/hardware/SensorManager;-><init>()V
-HSPLandroid/hardware/SensorManager;->cancelTriggerSensor(Landroid/hardware/TriggerEventListener;Landroid/hardware/Sensor;)Z
-HSPLandroid/hardware/SensorManager;->getDefaultSensor(I)Landroid/hardware/Sensor;
-HSPLandroid/hardware/SensorManager;->getDelay(I)I
-HSPLandroid/hardware/SensorManager;->getSensorList(I)Ljava/util/List;
-HSPLandroid/hardware/SensorManager;->registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;I)Z
-HSPLandroid/hardware/SensorManager;->registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;IILandroid/os/Handler;)Z
-HSPLandroid/hardware/SensorManager;->registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;ILandroid/os/Handler;)Z
-HSPLandroid/hardware/SensorManager;->requestTriggerSensor(Landroid/hardware/TriggerEventListener;Landroid/hardware/Sensor;)Z
-HSPLandroid/hardware/SensorManager;->unregisterListener(Landroid/hardware/SensorEventListener;)V
-HSPLandroid/hardware/SensorManager;->unregisterListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;)V
-HSPLandroid/hardware/SensorPrivacyManager;->isSensorPrivacyEnabled(II)Z
-HSPLandroid/hardware/SystemSensorManager$BaseEventQueue;-><init>(Landroid/os/Looper;Landroid/hardware/SystemSensorManager;ILjava/lang/String;)V
-HSPLandroid/hardware/SystemSensorManager$BaseEventQueue;->addSensor(Landroid/hardware/Sensor;II)Z
-HSPLandroid/hardware/SystemSensorManager$BaseEventQueue;->disableSensor(Landroid/hardware/Sensor;)I
-HSPLandroid/hardware/SystemSensorManager$BaseEventQueue;->dispose()V
-HSPLandroid/hardware/SystemSensorManager$BaseEventQueue;->dispose(Z)V
-HSPLandroid/hardware/SystemSensorManager$BaseEventQueue;->enableSensor(Landroid/hardware/Sensor;II)I
-HSPLandroid/hardware/SystemSensorManager$BaseEventQueue;->finalize()V
-HSPLandroid/hardware/SystemSensorManager$BaseEventQueue;->hasSensors()Z
-HSPLandroid/hardware/SystemSensorManager$BaseEventQueue;->removeAllSensors()Z
-HSPLandroid/hardware/SystemSensorManager$BaseEventQueue;->removeSensor(Landroid/hardware/Sensor;Z)Z
-HSPLandroid/hardware/SystemSensorManager$SensorEventQueue;-><init>(Landroid/hardware/SensorEventListener;Landroid/os/Looper;Landroid/hardware/SystemSensorManager;Ljava/lang/String;)V
-HSPLandroid/hardware/SystemSensorManager$SensorEventQueue;->addSensorEvent(Landroid/hardware/Sensor;)V
-HSPLandroid/hardware/SystemSensorManager$SensorEventQueue;->dispatchAdditionalInfoEvent(III[F[I)V
-HSPLandroid/hardware/SystemSensorManager$SensorEventQueue;->dispatchSensorEvent(I[FIJ)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/hardware/Sensor;Landroid/hardware/Sensor;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLandroid/hardware/SystemSensorManager$SensorEventQueue;->removeSensorEvent(Landroid/hardware/Sensor;)V
-HSPLandroid/hardware/SystemSensorManager$TriggerEventQueue;->addSensorEvent(Landroid/hardware/Sensor;)V
-HSPLandroid/hardware/SystemSensorManager$TriggerEventQueue;->dispatchSensorEvent(I[FIJ)V
-HSPLandroid/hardware/SystemSensorManager$TriggerEventQueue;->removeSensorEvent(Landroid/hardware/Sensor;)V
-HSPLandroid/hardware/SystemSensorManager;-><init>(Landroid/content/Context;Landroid/os/Looper;)V
-HSPLandroid/hardware/SystemSensorManager;->cancelTriggerSensorImpl(Landroid/hardware/TriggerEventListener;Landroid/hardware/Sensor;Z)Z
-HSPLandroid/hardware/SystemSensorManager;->getFullSensorList()Ljava/util/List;
-HSPLandroid/hardware/SystemSensorManager;->getSensorList(I)Ljava/util/List;
-HSPLandroid/hardware/SystemSensorManager;->isDeviceSensorPolicyDefault(I)Z
-HSPLandroid/hardware/SystemSensorManager;->registerListenerImpl(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;ILandroid/os/Handler;II)Z
-HSPLandroid/hardware/SystemSensorManager;->requestTriggerSensorImpl(Landroid/hardware/TriggerEventListener;Landroid/hardware/Sensor;)Z
-HSPLandroid/hardware/SystemSensorManager;->unregisterListenerImpl(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;)V
-HSPLandroid/hardware/TriggerEventListener;-><init>()V
-HSPLandroid/hardware/biometrics/BiometricManager;-><init>(Landroid/content/Context;Landroid/hardware/biometrics/IAuthService;)V
-HSPLandroid/hardware/biometrics/BiometricManager;->canAuthenticate()I
-HSPLandroid/hardware/biometrics/BiometricManager;->canAuthenticate(I)I
-HSPLandroid/hardware/biometrics/BiometricManager;->canAuthenticate(II)I
-HSPLandroid/hardware/biometrics/BiometricSourceType;->values()[Landroid/hardware/biometrics/BiometricSourceType;
-HSPLandroid/hardware/biometrics/BiometricSourceType;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/hardware/biometrics/IAuthService$Stub$Proxy;->canAuthenticate(Ljava/lang/String;II)I
-HSPLandroid/hardware/biometrics/IAuthService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/biometrics/IAuthService;
-HSPLandroid/hardware/biometrics/SensorPropertiesInternal$1;-><init>()V
-HSPLandroid/hardware/biometrics/SensorPropertiesInternal;-><clinit>()V
-HSPLandroid/hardware/camera2/CameraCharacteristics$1;->onDeviceStateChanged(Z)V
-HSPLandroid/hardware/camera2/CameraCharacteristics$Key;->equals(Ljava/lang/Object;)Z
-HSPLandroid/hardware/camera2/CameraCharacteristics$Key;->getNativeKey()Landroid/hardware/camera2/impl/CameraMetadataNative$Key;
-HSPLandroid/hardware/camera2/CameraCharacteristics;->-$$Nest$fgetmLock(Landroid/hardware/camera2/CameraCharacteristics;)Ljava/lang/Object;
-HSPLandroid/hardware/camera2/CameraCharacteristics;->-$$Nest$fputmFoldedDeviceState(Landroid/hardware/camera2/CameraCharacteristics;Z)V
-HSPLandroid/hardware/camera2/CameraCharacteristics;->get(Landroid/hardware/camera2/CameraCharacteristics$Key;)Ljava/lang/Object;
-HSPLandroid/hardware/camera2/CameraCharacteristics;->getDeviceStateListener()Landroid/hardware/camera2/CameraManager$DeviceStateListener;
-HSPLandroid/hardware/camera2/CameraCharacteristics;->overrideProperty(Landroid/hardware/camera2/CameraCharacteristics$Key;)Ljava/lang/Object;
-HSPLandroid/hardware/camera2/CameraManager$AvailabilityCallback;-><init>()V
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal$1;->compare(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal$3;-><init>(Landroid/hardware/camera2/CameraManager$CameraManagerGlobal;Landroid/hardware/camera2/CameraManager$AvailabilityCallback;)V
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->asBinder()Landroid/os/IBinder;
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->cameraIdHasConcurrentStreamsLocked(Ljava/lang/String;)Z
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->connectCameraServiceLocked()V
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->extractCameraIdListLocked()[Ljava/lang/String;
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->get()Landroid/hardware/camera2/CameraManager$CameraManagerGlobal;
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->getCameraIdList()[Ljava/lang/String;
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->getCameraService()Landroid/hardware/ICameraService;
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->onCameraAccessPrioritiesChanged()V
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->onStatusChanged(ILjava/lang/String;)V
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->onStatusChangedLocked(ILjava/lang/String;)V
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->onTorchStatusChanged(ILjava/lang/String;)V
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->onTorchStatusChangedLocked(ILjava/lang/String;)V
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->postSingleAccessPriorityChangeUpdate(Landroid/hardware/camera2/CameraManager$AvailabilityCallback;Ljava/util/concurrent/Executor;)V
-HSPLandroid/hardware/camera2/CameraManager$FoldStateListener;->addDeviceStateListener(Landroid/hardware/camera2/CameraManager$DeviceStateListener;)V
-HSPLandroid/hardware/camera2/CameraManager$FoldStateListener;->handleStateChange(I)V
-HSPLandroid/hardware/camera2/CameraManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/hardware/camera2/CameraManager;->getCameraCharacteristics(Ljava/lang/String;)Landroid/hardware/camera2/CameraCharacteristics;
-HSPLandroid/hardware/camera2/CameraManager;->getCameraIdList()[Ljava/lang/String;
-HSPLandroid/hardware/camera2/CameraManager;->getDisplaySize()Landroid/util/Size;
-HSPLandroid/hardware/camera2/CameraManager;->getPhysicalCameraMultiResolutionConfigs(Ljava/lang/String;Landroid/hardware/camera2/impl/CameraMetadataNative;Landroid/hardware/ICameraService;)Ljava/util/Map;
-HSPLandroid/hardware/camera2/CameraManager;->registerDeviceStateListener(Landroid/hardware/camera2/CameraCharacteristics;)V
-HSPLandroid/hardware/camera2/CameraManager;->shouldOverrideToPortrait(Landroid/content/Context;)Z
-HSPLandroid/hardware/camera2/CameraMetadata;-><init>()V
-HSPLandroid/hardware/camera2/CameraMetadata;->setNativeInstance(Landroid/hardware/camera2/impl/CameraMetadataNative;)V
-HSPLandroid/hardware/camera2/impl/CameraDeviceImpl$CameraHandlerExecutor;->execute(Ljava/lang/Runnable;)V
-HSPLandroid/hardware/camera2/impl/CameraDeviceImpl;->checkAndWrapHandler(Landroid/os/Handler;)Ljava/util/concurrent/Executor;
-HSPLandroid/hardware/camera2/impl/CameraDeviceImpl;->checkHandler(Landroid/os/Handler;)Landroid/os/Handler;
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/camera2/impl/CameraMetadataNative;
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative$Key;->equals(Ljava/lang/Object;)Z
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative$Key;->hashCode()I
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative;-><init>()V
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->finalize()V
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->get(Landroid/hardware/camera2/CameraCharacteristics$Key;)Ljava/lang/Object;
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->get(Landroid/hardware/camera2/impl/CameraMetadataNative$Key;)Ljava/lang/Object;
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->getBase(Landroid/hardware/camera2/impl/CameraMetadataNative$Key;)Ljava/lang/Object;
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->move(Landroid/hardware/camera2/impl/CameraMetadataNative;)Landroid/hardware/camera2/impl/CameraMetadataNative;
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->readValues(I)[B
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->setCameraId(I)V
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->setDisplaySize(Landroid/util/Size;)V
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->setHasMandatoryConcurrentStreams(Z)V
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->setupGlobalVendorTagDescriptor()V
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->updateNativeAllocation()V
-HSPLandroid/hardware/camera2/marshal/MarshalHelpers;->checkNativeType(I)I
-HSPLandroid/hardware/camera2/marshal/MarshalHelpers;->wrapClassIfPrimitive(Ljava/lang/Class;)Ljava/lang/Class;
-HSPLandroid/hardware/camera2/marshal/MarshalRegistry$MarshalToken;->equals(Ljava/lang/Object;)Z
-HSPLandroid/hardware/camera2/marshal/MarshalRegistry$MarshalToken;->hashCode()I
-HSPLandroid/hardware/camera2/marshal/MarshalRegistry;->getMarshaler(Landroid/hardware/camera2/utils/TypeReference;I)Landroid/hardware/camera2/marshal/Marshaler;
-HSPLandroid/hardware/camera2/marshal/Marshaler;-><init>(Landroid/hardware/camera2/marshal/MarshalQueryable;Landroid/hardware/camera2/utils/TypeReference;I)V
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableArray$MarshalerArray;->unmarshal(Ljava/nio/ByteBuffer;)Ljava/lang/Object;
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableArray;->createMarshaler(Landroid/hardware/camera2/utils/TypeReference;I)Landroid/hardware/camera2/marshal/Marshaler;
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableArray;->isTypeMappingSupported(Landroid/hardware/camera2/utils/TypeReference;I)Z
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableBoolean$MarshalerBoolean;->unmarshal(Ljava/nio/ByteBuffer;)Ljava/lang/Boolean;
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableBoolean$MarshalerBoolean;->unmarshal(Ljava/nio/ByteBuffer;)Ljava/lang/Object;
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableBoolean;->createMarshaler(Landroid/hardware/camera2/utils/TypeReference;I)Landroid/hardware/camera2/marshal/Marshaler;
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableBoolean;->isTypeMappingSupported(Landroid/hardware/camera2/utils/TypeReference;I)Z
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableEnum;->isTypeMappingSupported(Landroid/hardware/camera2/utils/TypeReference;I)Z
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableNativeByteToInteger$MarshalerNativeByteToInteger;->getNativeSize()I
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableNativeByteToInteger$MarshalerNativeByteToInteger;->unmarshal(Ljava/nio/ByteBuffer;)Ljava/lang/Integer;
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableNativeByteToInteger$MarshalerNativeByteToInteger;->unmarshal(Ljava/nio/ByteBuffer;)Ljava/lang/Object;
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableNativeByteToInteger;->createMarshaler(Landroid/hardware/camera2/utils/TypeReference;I)Landroid/hardware/camera2/marshal/Marshaler;
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableNativeByteToInteger;->isTypeMappingSupported(Landroid/hardware/camera2/utils/TypeReference;I)Z
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryablePrimitive$MarshalerPrimitive;->unmarshal(Ljava/nio/ByteBuffer;)Ljava/lang/Object;
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryablePrimitive$MarshalerPrimitive;->unmarshalObject(Ljava/nio/ByteBuffer;)Ljava/lang/Object;
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryablePrimitive;->createMarshaler(Landroid/hardware/camera2/utils/TypeReference;I)Landroid/hardware/camera2/marshal/Marshaler;
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryablePrimitive;->isTypeMappingSupported(Landroid/hardware/camera2/utils/TypeReference;I)Z
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableRange;->isTypeMappingSupported(Landroid/hardware/camera2/utils/TypeReference;I)Z
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableRect;->isTypeMappingSupported(Landroid/hardware/camera2/utils/TypeReference;I)Z
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableReprocessFormatsMap;->isTypeMappingSupported(Landroid/hardware/camera2/utils/TypeReference;I)Z
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableSize;->isTypeMappingSupported(Landroid/hardware/camera2/utils/TypeReference;I)Z
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableSizeF;->isTypeMappingSupported(Landroid/hardware/camera2/utils/TypeReference;I)Z
-HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableString;->isTypeMappingSupported(Landroid/hardware/camera2/utils/TypeReference;I)Z
-HSPLandroid/hardware/camera2/utils/ConcurrentCameraIdCombination$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/camera2/utils/ConcurrentCameraIdCombination;
-HSPLandroid/hardware/camera2/utils/ConcurrentCameraIdCombination$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/camera2/utils/ConcurrentCameraIdCombination$1;->newArray(I)[Landroid/hardware/camera2/utils/ConcurrentCameraIdCombination;
-HSPLandroid/hardware/camera2/utils/ConcurrentCameraIdCombination$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/hardware/camera2/utils/ConcurrentCameraIdCombination;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/hardware/camera2/utils/ConcurrentCameraIdCombination;-><init>(Landroid/os/Parcel;Landroid/hardware/camera2/utils/ConcurrentCameraIdCombination-IA;)V
-HSPLandroid/hardware/camera2/utils/ConcurrentCameraIdCombination;->getConcurrentCameraIdCombination()Ljava/util/Set;
-HSPLandroid/hardware/camera2/utils/ConcurrentCameraIdCombination;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/hardware/camera2/utils/TypeReference;->containsTypeVariable(Ljava/lang/reflect/Type;)Z
-HSPLandroid/hardware/camera2/utils/TypeReference;->equals(Ljava/lang/Object;)Z
-HSPLandroid/hardware/camera2/utils/TypeReference;->getComponentType()Landroid/hardware/camera2/utils/TypeReference;
-HSPLandroid/hardware/camera2/utils/TypeReference;->getComponentType(Ljava/lang/reflect/Type;)Ljava/lang/reflect/Type;
-HSPLandroid/hardware/camera2/utils/TypeReference;->getRawType()Ljava/lang/Class;
-HSPLandroid/hardware/camera2/utils/TypeReference;->getRawType(Ljava/lang/reflect/Type;)Ljava/lang/Class;
-HSPLandroid/hardware/camera2/utils/TypeReference;->getType()Ljava/lang/reflect/Type;
-HSPLandroid/hardware/camera2/utils/TypeReference;->hashCode()I
-HSPLandroid/hardware/devicestate/DeviceStateInfo$1;-><init>()V
-HSPLandroid/hardware/devicestate/DeviceStateInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/devicestate/DeviceStateInfo;
-HSPLandroid/hardware/devicestate/DeviceStateInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/devicestate/DeviceStateInfo;-><clinit>()V
-HSPLandroid/hardware/devicestate/DeviceStateManager;-><init>()V
-HSPLandroid/hardware/devicestate/DeviceStateManager;->registerCallback(Ljava/util/concurrent/Executor;Landroid/hardware/devicestate/DeviceStateManager$DeviceStateCallback;)V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda1;->run()V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda2;->run()V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper;-><init>(Landroid/hardware/devicestate/DeviceStateManager$DeviceStateCallback;Ljava/util/concurrent/Executor;)V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback;-><init>(Landroid/hardware/devicestate/DeviceStateManagerGlobal;)V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback;-><init>(Landroid/hardware/devicestate/DeviceStateManagerGlobal;Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback-IA;)V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback;->onDeviceStateInfoChanged(Landroid/hardware/devicestate/DeviceStateInfo;)V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;->-$$Nest$mhandleDeviceStateInfoChanged(Landroid/hardware/devicestate/DeviceStateManagerGlobal;Landroid/hardware/devicestate/DeviceStateInfo;)V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;-><init>(Landroid/hardware/devicestate/IDeviceStateManager;)V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;->findCallbackLocked(Landroid/hardware/devicestate/DeviceStateManager$DeviceStateCallback;)I
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;->getInstance()Landroid/hardware/devicestate/DeviceStateManagerGlobal;
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;->handleDeviceStateInfoChanged(Landroid/hardware/devicestate/DeviceStateInfo;)V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;->registerCallbackIfNeededLocked()V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;->registerDeviceStateCallback(Landroid/hardware/devicestate/DeviceStateManager$DeviceStateCallback;Ljava/util/concurrent/Executor;)V
-HSPLandroid/hardware/devicestate/IDeviceStateManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/hardware/devicestate/IDeviceStateManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/hardware/devicestate/IDeviceStateManager$Stub$Proxy;->registerCallback(Landroid/hardware/devicestate/IDeviceStateManagerCallback;)V
-HSPLandroid/hardware/devicestate/IDeviceStateManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/devicestate/IDeviceStateManager;
-HSPLandroid/hardware/devicestate/IDeviceStateManagerCallback$Stub;-><init>()V
-HSPLandroid/hardware/devicestate/IDeviceStateManagerCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/hardware/devicestate/IDeviceStateManagerCallback$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
-HSPLandroid/hardware/devicestate/IDeviceStateManagerCallback$Stub;->getMaxTransactionId()I
-HSPLandroid/hardware/devicestate/IDeviceStateManagerCallback$Stub;->getTransactionName(I)Ljava/lang/String;
-HSPLandroid/hardware/devicestate/IDeviceStateManagerCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/hardware/display/AmbientDisplayConfiguration;-><init>(Landroid/content/Context;)V
-HSPLandroid/hardware/display/AmbientDisplayConfiguration;->accessibilityInversionEnabled(I)Z
-HSPLandroid/hardware/display/AmbientDisplayConfiguration;->alwaysOnAvailable()Z
-HSPLandroid/hardware/display/AmbientDisplayConfiguration;->alwaysOnEnabled(I)Z
-HSPLandroid/hardware/display/AmbientDisplayConfiguration;->ambientDisplayAvailable()Z
-HSPLandroid/hardware/display/AmbientDisplayConfiguration;->ambientDisplayComponent()Ljava/lang/String;
-HSPLandroid/hardware/display/AmbientDisplayConfiguration;->boolSetting(Ljava/lang/String;II)Z
-HSPLandroid/hardware/display/AmbientDisplayConfiguration;->boolSettingDefaultOn(Ljava/lang/String;I)Z
-HSPLandroid/hardware/display/AmbientDisplayConfiguration;->doubleTapSensorType()Ljava/lang/String;
-HSPLandroid/hardware/display/AmbientDisplayConfiguration;->dozePickupSensorAvailable()Z
-HSPLandroid/hardware/display/AmbientDisplayConfiguration;->enabled(I)Z
-HSPLandroid/hardware/display/AmbientDisplayConfiguration;->pulseOnNotificationAvailable()Z
-HSPLandroid/hardware/display/AmbientDisplayConfiguration;->pulseOnNotificationEnabled(I)Z
-HSPLandroid/hardware/display/ColorDisplayManager$ColorDisplayManagerInternal;->getInstance()Landroid/hardware/display/ColorDisplayManager$ColorDisplayManagerInternal;
-HSPLandroid/hardware/display/ColorDisplayManager$ColorDisplayManagerInternal;->isNightDisplayActivated()Z
-HSPLandroid/hardware/display/ColorDisplayManager;-><init>()V
-HSPLandroid/hardware/display/ColorDisplayManager;->isDisplayWhiteBalanceAvailable(Landroid/content/Context;)Z
-HSPLandroid/hardware/display/ColorDisplayManager;->isNightDisplayActivated()Z
-HSPLandroid/hardware/display/ColorDisplayManager;->isNightDisplayAvailable(Landroid/content/Context;)Z
-HSPLandroid/hardware/display/DeviceProductInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/display/DeviceProductInfo;
-HSPLandroid/hardware/display/DeviceProductInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/display/DeviceProductInfo$ManufactureDate$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/display/DeviceProductInfo$ManufactureDate;
-HSPLandroid/hardware/display/DeviceProductInfo$ManufactureDate$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/display/DeviceProductInfo$ManufactureDate;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/hardware/display/DeviceProductInfo$ManufactureDate;->equals(Ljava/lang/Object;)Z
-HSPLandroid/hardware/display/DeviceProductInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/hardware/display/DeviceProductInfo;-><init>(Landroid/os/Parcel;Landroid/hardware/display/DeviceProductInfo-IA;)V
-HSPLandroid/hardware/display/DeviceProductInfo;->equals(Ljava/lang/Object;)Z
-HSPLandroid/hardware/display/DisplayManager$$ExternalSyntheticLambda2;-><init>()V
-HSPLandroid/hardware/display/DisplayManager$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z
-HSPLandroid/hardware/display/DisplayManager$WeakDisplayCache;-><init>()V
-HSPLandroid/hardware/display/DisplayManager$WeakDisplayCache;-><init>(Landroid/hardware/display/DisplayManager$WeakDisplayCache-IA;)V
-HSPLandroid/hardware/display/DisplayManager$WeakDisplayCache;->get(I)Landroid/view/Display;
-HSPLandroid/hardware/display/DisplayManager$WeakDisplayCache;->put(Landroid/view/Display;)V
-HSPLandroid/hardware/display/DisplayManager$WeakDisplayCache;->removeStaleEntries()V
-HSPLandroid/hardware/display/DisplayManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/hardware/display/DisplayManager;->getDisplay(I)Landroid/view/Display;
-HSPLandroid/hardware/display/DisplayManager;->getDisplays()[Landroid/view/Display;
-HSPLandroid/hardware/display/DisplayManager;->getDisplays(Ljava/lang/String;)[Landroid/view/Display;
-HSPLandroid/hardware/display/DisplayManager;->getDisplays([ILjava/util/function/Predicate;)[Landroid/view/Display;
-HSPLandroid/hardware/display/DisplayManager;->getOrCreateDisplay(IZ)Landroid/view/Display;
-HSPLandroid/hardware/display/DisplayManager;->getStableDisplaySize()Landroid/graphics/Point;
-HSPLandroid/hardware/display/DisplayManager;->getWifiDisplayStatus()Landroid/hardware/display/WifiDisplayStatus;
-HSPLandroid/hardware/display/DisplayManager;->registerDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;Landroid/os/Handler;)V
-HSPLandroid/hardware/display/DisplayManager;->registerDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;Landroid/os/Handler;J)V
-HSPLandroid/hardware/display/DisplayManager;->unregisterDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;)V
-HSPLandroid/hardware/display/DisplayManagerGlobal$1;-><init>(Landroid/hardware/display/DisplayManagerGlobal;ILjava/lang/String;)V
-HSPLandroid/hardware/display/DisplayManagerGlobal$1;->recompute(Ljava/lang/Integer;)Landroid/view/DisplayInfo;
-HSPLandroid/hardware/display/DisplayManagerGlobal$1;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;-><init>(Landroid/hardware/display/DisplayManager$DisplayListener;Ljava/util/concurrent/Executor;JLjava/lang/String;)V
-HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;->clearEvents()V
-HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;->handleDisplayEventInner(IILandroid/view/DisplayInfo;Z)V+]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;]Landroid/hardware/display/DisplayManager$DisplayListener;missing_types
-HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;-><init>(Landroid/hardware/display/DisplayManagerGlobal;)V
-HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;-><init>(Landroid/hardware/display/DisplayManagerGlobal;Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback-IA;)V
-HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;->onDisplayEvent(II)V
-HSPLandroid/hardware/display/DisplayManagerGlobal;->-$$Nest$fgetmDm(Landroid/hardware/display/DisplayManagerGlobal;)Landroid/hardware/display/IDisplayManager;
-HSPLandroid/hardware/display/DisplayManagerGlobal;-><init>(Landroid/hardware/display/IDisplayManager;)V
-HSPLandroid/hardware/display/DisplayManagerGlobal;->calculateEventsMaskLocked()I
-HSPLandroid/hardware/display/DisplayManagerGlobal;->extraLogging()Z
-HSPLandroid/hardware/display/DisplayManagerGlobal;->findDisplayListenerLocked(Landroid/hardware/display/DisplayManager$DisplayListener;)I
-HSPLandroid/hardware/display/DisplayManagerGlobal;->getCompatibleDisplay(ILandroid/content/res/Resources;)Landroid/view/Display;
-HSPLandroid/hardware/display/DisplayManagerGlobal;->getCompatibleDisplay(ILandroid/view/DisplayAdjustments;)Landroid/view/Display;
-HSPLandroid/hardware/display/DisplayManagerGlobal;->getDisplayIds()[I
-HSPLandroid/hardware/display/DisplayManagerGlobal;->getDisplayIds(Z)[I
-HSPLandroid/hardware/display/DisplayManagerGlobal;->getDisplayInfo(I)Landroid/view/DisplayInfo;
-HSPLandroid/hardware/display/DisplayManagerGlobal;->getDisplayInfoLocked(I)Landroid/view/DisplayInfo;+]Landroid/app/PropertyInvalidatedCache;Landroid/hardware/display/DisplayManagerGlobal$1;
-HSPLandroid/hardware/display/DisplayManagerGlobal;->getInstance()Landroid/hardware/display/DisplayManagerGlobal;
-HSPLandroid/hardware/display/DisplayManagerGlobal;->getLooperForHandler(Landroid/os/Handler;)Landroid/os/Looper;
-HSPLandroid/hardware/display/DisplayManagerGlobal;->getPreferredWideGamutColorSpace()Landroid/graphics/ColorSpace;
-HSPLandroid/hardware/display/DisplayManagerGlobal;->getStableDisplaySize()Landroid/graphics/Point;
-HSPLandroid/hardware/display/DisplayManagerGlobal;->getWifiDisplayStatus()Landroid/hardware/display/WifiDisplayStatus;
-HSPLandroid/hardware/display/DisplayManagerGlobal;->initExtraLogging()Z
-HSPLandroid/hardware/display/DisplayManagerGlobal;->maybeLogAllDisplayListeners()V
-HSPLandroid/hardware/display/DisplayManagerGlobal;->registerCallbackIfNeededLocked()V
-HSPLandroid/hardware/display/DisplayManagerGlobal;->registerDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;Ljava/util/concurrent/Executor;JLjava/lang/String;)V+]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;
-HSPLandroid/hardware/display/DisplayManagerGlobal;->registerNativeChoreographerForRefreshRateCallbacks()V
-HSPLandroid/hardware/display/DisplayManagerGlobal;->unregisterDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;)V
-HSPLandroid/hardware/display/DisplayManagerGlobal;->updateCallbackIfNeededLocked()V
-HSPLandroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;->equals(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;)Z
-HSPLandroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;->floatEquals(FF)Z
-HSPLandroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;->isBrightOrDim()Z
-HSPLandroid/hardware/display/IColorDisplayManager$Stub$Proxy;->isNightDisplayActivated()Z
-HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->getDisplayIds(Z)[I
-HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->getDisplayInfo(I)Landroid/view/DisplayInfo;
-HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->getOverlaySupport()Landroid/hardware/OverlayProperties;
-HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->getPreferredWideGamutColorSpaceId()I
-HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->getStableDisplaySize()Landroid/graphics/Point;
-HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->getWifiDisplayStatus()Landroid/hardware/display/WifiDisplayStatus;
-HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->registerCallback(Landroid/hardware/display/IDisplayManagerCallback;)V
-HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->registerCallbackWithEventMask(Landroid/hardware/display/IDisplayManagerCallback;J)V
-HSPLandroid/hardware/display/IDisplayManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/display/IDisplayManager;
-HSPLandroid/hardware/display/IDisplayManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/hardware/display/IDisplayManagerCallback$Stub;-><init>()V
-HSPLandroid/hardware/display/IDisplayManagerCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/hardware/display/IDisplayManagerCallback$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
-HSPLandroid/hardware/display/IDisplayManagerCallback$Stub;->getMaxTransactionId()I
-HSPLandroid/hardware/display/IDisplayManagerCallback$Stub;->getTransactionName(I)Ljava/lang/String;
-HSPLandroid/hardware/display/IDisplayManagerCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/hardware/display/WifiDisplay$1;->newArray(I)[Landroid/hardware/display/WifiDisplay;
-HSPLandroid/hardware/display/WifiDisplay$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/hardware/display/WifiDisplaySessionInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/display/WifiDisplaySessionInfo;
-HSPLandroid/hardware/display/WifiDisplaySessionInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/display/WifiDisplaySessionInfo;-><init>(ZILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/hardware/display/WifiDisplayStatus$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/display/WifiDisplayStatus;
-HSPLandroid/hardware/display/WifiDisplayStatus$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/display/WifiDisplayStatus;-><init>(IIILandroid/hardware/display/WifiDisplay;[Landroid/hardware/display/WifiDisplay;Landroid/hardware/display/WifiDisplaySessionInfo;)V
-HSPLandroid/hardware/display/WifiDisplayStatus;->getActiveDisplay()Landroid/hardware/display/WifiDisplay;
-HSPLandroid/hardware/display/WifiDisplayStatus;->getFeatureState()I
-HSPLandroid/hardware/face/FaceManager;->getSensorPropertiesInternal()Ljava/util/List;
-HSPLandroid/hardware/fingerprint/FingerprintManager;-><init>(Landroid/content/Context;Landroid/hardware/fingerprint/IFingerprintService;)V
-HSPLandroid/hardware/fingerprint/FingerprintManager;->hasEnrolledFingerprints(I)Z
-HSPLandroid/hardware/fingerprint/FingerprintManager;->isHardwareDetected()Z
-HSPLandroid/hardware/fingerprint/IFingerprintService$Stub$Proxy;->isHardwareDetectedDeprecated(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLandroid/hardware/fingerprint/IFingerprintService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/fingerprint/IFingerprintService;
-HSPLandroid/hardware/input/HostUsiVersion$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/input/HostUsiVersion;
-HSPLandroid/hardware/input/HostUsiVersion$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/input/HostUsiVersion;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/hardware/input/IInputDevicesChangedListener$Stub;-><init>()V
-HSPLandroid/hardware/input/IInputDevicesChangedListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/hardware/input/IInputDevicesChangedListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/hardware/input/IInputManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/hardware/input/IInputManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/hardware/input/IInputManager$Stub$Proxy;->getInputDevice(I)Landroid/view/InputDevice;
-HSPLandroid/hardware/input/IInputManager$Stub$Proxy;->getInputDeviceIds()[I
-HSPLandroid/hardware/input/IInputManager$Stub$Proxy;->getVelocityTrackerStrategy()Ljava/lang/String;
-HSPLandroid/hardware/input/IInputManager$Stub$Proxy;->hasKeys(II[I[Z)Z
-HSPLandroid/hardware/input/IInputManager$Stub$Proxy;->registerInputDevicesChangedListener(Landroid/hardware/input/IInputDevicesChangedListener;)V
-HSPLandroid/hardware/input/IInputManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/input/IInputManager;
-HSPLandroid/hardware/input/InputDeviceIdentifier;-><init>(Ljava/lang/String;II)V
-HSPLandroid/hardware/input/InputManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/hardware/input/InputManager;->deviceHasKeys(I[I)[Z
-HSPLandroid/hardware/input/InputManager;->getInputDevice(I)Landroid/view/InputDevice;
-HSPLandroid/hardware/input/InputManager;->getInputDeviceIds()[I
-HSPLandroid/hardware/input/InputManager;->getInstance()Landroid/hardware/input/InputManager;
-HSPLandroid/hardware/input/InputManager;->registerInputDeviceListener(Landroid/hardware/input/InputManager$InputDeviceListener;Landroid/os/Handler;)V
-HSPLandroid/hardware/input/InputManager;->unregisterInputDeviceListener(Landroid/hardware/input/InputManager$InputDeviceListener;)V
-HSPLandroid/hardware/input/InputManagerGlobal$InputDeviceListenerDelegate;-><init>(Landroid/hardware/input/InputManager$InputDeviceListener;Landroid/os/Handler;)V
-HSPLandroid/hardware/input/InputManagerGlobal$InputDevicesChangedListener;-><init>(Landroid/hardware/input/InputManagerGlobal;)V
-HSPLandroid/hardware/input/InputManagerGlobal$InputDevicesChangedListener;-><init>(Landroid/hardware/input/InputManagerGlobal;Landroid/hardware/input/InputManagerGlobal$InputDevicesChangedListener-IA;)V
-HSPLandroid/hardware/input/InputManagerGlobal;-><init>(Landroid/hardware/input/IInputManager;)V
-HSPLandroid/hardware/input/InputManagerGlobal;->getInputDevice(I)Landroid/view/InputDevice;
-HSPLandroid/hardware/input/InputManagerGlobal;->getInputDeviceIds()[I
-HSPLandroid/hardware/input/InputManagerGlobal;->getInputManagerService()Landroid/hardware/input/IInputManager;
-HSPLandroid/hardware/input/InputManagerGlobal;->getInstance()Landroid/hardware/input/InputManagerGlobal;
-HSPLandroid/hardware/input/InputManagerGlobal;->populateInputDevicesLocked()V
-HSPLandroid/hardware/input/InputManagerGlobal;->registerInputDeviceListener(Landroid/hardware/input/InputManager$InputDeviceListener;Landroid/os/Handler;)V
-HSPLandroid/hardware/input/InputSettings;->isStylusPointerIconEnabled(Landroid/content/Context;)Z
-HSPLandroid/hardware/location/ContextHubClient;-><init>(Landroid/hardware/location/ContextHubInfo;Z)V
-HSPLandroid/hardware/location/ContextHubClient;->sendMessageToNanoApp(Landroid/hardware/location/NanoAppMessage;)I
-HSPLandroid/hardware/location/ContextHubClient;->setClientProxy(Landroid/hardware/location/IContextHubClient;)V
-HSPLandroid/hardware/location/ContextHubClientCallback;-><init>()V
-HSPLandroid/hardware/location/ContextHubInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/location/ContextHubInfo;
-HSPLandroid/hardware/location/ContextHubInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/location/ContextHubInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/hardware/location/ContextHubInfo;->getId()I
-HSPLandroid/hardware/location/ContextHubInfo;->getMaxPacketLengthBytes()I
-HSPLandroid/hardware/location/ContextHubManager;->createClient(Landroid/hardware/location/ContextHubInfo;Landroid/hardware/location/ContextHubClientCallback;)Landroid/hardware/location/ContextHubClient;
-HSPLandroid/hardware/location/ContextHubManager;->createQueryCallback(Landroid/hardware/location/ContextHubTransaction;)Landroid/hardware/location/IContextHubTransactionCallback;
-HSPLandroid/hardware/location/ContextHubManager;->getContextHubs()Ljava/util/List;
-HSPLandroid/hardware/location/ContextHubManager;->queryNanoApps(Landroid/hardware/location/ContextHubInfo;)Landroid/hardware/location/ContextHubTransaction;
-HSPLandroid/hardware/location/ContextHubTransaction$Response;-><init>(ILjava/lang/Object;)V
-HSPLandroid/hardware/location/ContextHubTransaction$Response;->getContents()Ljava/lang/Object;
-HSPLandroid/hardware/location/ContextHubTransaction;-><init>(I)V
-HSPLandroid/hardware/location/ContextHubTransaction;->setResponse(Landroid/hardware/location/ContextHubTransaction$Response;)V
-HSPLandroid/hardware/location/ContextHubTransaction;->waitForResponse(JLjava/util/concurrent/TimeUnit;)Landroid/hardware/location/ContextHubTransaction$Response;
-HSPLandroid/hardware/location/IContextHubCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/hardware/location/IContextHubClient$Stub$Proxy;->sendMessageToNanoApp(Landroid/hardware/location/NanoAppMessage;)I
-HSPLandroid/hardware/location/IContextHubClient$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IContextHubClient;
-HSPLandroid/hardware/location/IContextHubClientCallback$Stub;-><init>()V
-HSPLandroid/hardware/location/IContextHubClientCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/hardware/location/IContextHubClientCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/hardware/location/IContextHubService$Stub$Proxy;->getContextHubs()Ljava/util/List;
-HSPLandroid/hardware/location/IContextHubService$Stub$Proxy;->queryNanoApps(ILandroid/hardware/location/IContextHubTransactionCallback;)V
-HSPLandroid/hardware/location/IContextHubService$Stub$Proxy;->registerCallback(Landroid/hardware/location/IContextHubCallback;)I
-HSPLandroid/hardware/location/IContextHubTransactionCallback$Stub;-><init>()V
-HSPLandroid/hardware/location/IContextHubTransactionCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/hardware/location/IContextHubTransactionCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/hardware/location/IGeofenceHardware$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IGeofenceHardware;
-HSPLandroid/hardware/location/MemoryRegion$1;->newArray(I)[Landroid/hardware/location/MemoryRegion;
-HSPLandroid/hardware/location/MemoryRegion$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/hardware/location/NanoAppMessage$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/location/NanoAppMessage;
-HSPLandroid/hardware/location/NanoAppMessage$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/location/NanoAppMessage;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/hardware/location/NanoAppMessage;->createMessageToNanoApp(JI[B)Landroid/hardware/location/NanoAppMessage;
-HSPLandroid/hardware/location/NanoAppMessage;->getMessageBody()[B
-HSPLandroid/hardware/location/NanoAppMessage;->getMessageType()I
-HSPLandroid/hardware/location/NanoAppMessage;->getNanoAppId()J
-HSPLandroid/hardware/location/NanoAppMessage;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/hardware/location/NanoAppState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/location/NanoAppState;
-HSPLandroid/hardware/location/NanoAppState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/location/NanoAppState;-><init>(Landroid/os/Parcel;)V+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/hardware/location/NanoAppState;->getNanoAppId()J
-HSPLandroid/hardware/security/keymint/KeyParameter$1;-><init>()V
-HSPLandroid/hardware/security/keymint/KeyParameter$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/security/keymint/KeyParameter;
-HSPLandroid/hardware/security/keymint/KeyParameter$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/security/keymint/KeyParameter$1;->newArray(I)[Landroid/hardware/security/keymint/KeyParameter;
-HSPLandroid/hardware/security/keymint/KeyParameter$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/hardware/security/keymint/KeyParameter;-><clinit>()V
-HSPLandroid/hardware/security/keymint/KeyParameter;-><init>()V
-HSPLandroid/hardware/security/keymint/KeyParameter;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/hardware/security/keymint/KeyParameter;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/hardware/security/keymint/KeyParameterValue$1;-><init>()V
-HSPLandroid/hardware/security/keymint/KeyParameterValue$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/security/keymint/KeyParameterValue;
-HSPLandroid/hardware/security/keymint/KeyParameterValue$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/security/keymint/KeyParameterValue;-><clinit>()V
-HSPLandroid/hardware/security/keymint/KeyParameterValue;-><init>(ILjava/lang/Object;)V
-HSPLandroid/hardware/security/keymint/KeyParameterValue;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/hardware/security/keymint/KeyParameterValue;-><init>(Landroid/os/Parcel;Landroid/hardware/security/keymint/KeyParameterValue-IA;)V
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->_assertTag(I)V
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->_set(ILjava/lang/Object;)V
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->algorithm(I)Landroid/hardware/security/keymint/KeyParameterValue;
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->blob([B)Landroid/hardware/security/keymint/KeyParameterValue;
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->blockMode(I)Landroid/hardware/security/keymint/KeyParameterValue;
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->getAlgorithm()I
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->getBlob()[B
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->getBlockMode()I
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->getDigest()I
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->getInteger()I
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->getKeyPurpose()I
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->getPaddingMode()I
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->getTag()I
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->integer(I)Landroid/hardware/security/keymint/KeyParameterValue;
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->keyPurpose(I)Landroid/hardware/security/keymint/KeyParameterValue;
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->paddingMode(I)Landroid/hardware/security/keymint/KeyParameterValue;
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/hardware/security/keymint/KeyParameterValue;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/hardware/soundtrigger/KeyphraseMetadata;-><init>(ILjava/lang/String;Ljava/util/Set;I)V
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;-><init>(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;IIIIZIZIZI)V
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->getAudioCapabilities()I
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->getDescription()Ljava/lang/String;
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->getId()I
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->getImplementor()Ljava/lang/String;
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->getMaxBufferMillis()I
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->getMaxKeyphrases()I
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->getMaxSoundModels()I
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->getMaxUsers()I
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->getPowerConsumptionMw()I
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->getRecognitionModes()I
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->getSupportedModelArch()Ljava/lang/String;
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->getUuid()Ljava/util/UUID;
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->getVersion()I
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->isCaptureTransitionSupported()Z
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->isConcurrentCaptureSupported()Z
-HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->isTriggerReturnedInEvent()Z
-HSPLandroid/hardware/soundtrigger/SoundTrigger$SoundModel;-><init>(Ljava/util/UUID;Ljava/util/UUID;I[BI)V
-HSPLandroid/hardware/soundtrigger/SoundTrigger$SoundModel;->getData()[B
-HSPLandroid/hardware/soundtrigger/SoundTrigger$SoundModel;->getUuid()Ljava/util/UUID;
-HSPLandroid/hardware/soundtrigger/SoundTrigger$SoundModel;->getVendorUuid()Ljava/util/UUID;
-HSPLandroid/hardware/soundtrigger/SoundTrigger$SoundModel;->getVersion()I
-HSPLandroid/hardware/usb/IUsbManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/hardware/usb/IUsbManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/hardware/usb/IUsbManager$Stub$Proxy;->getDeviceList(Landroid/os/Bundle;)V
-HSPLandroid/hardware/usb/IUsbManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/usb/IUsbManager;
-HSPLandroid/hardware/usb/ParcelableUsbPort;->getUsbPort(Landroid/hardware/usb/UsbManager;)Landroid/hardware/usb/UsbPort;
-HSPLandroid/hardware/usb/UsbManager;-><init>(Landroid/content/Context;Landroid/hardware/usb/IUsbManager;)V
-HSPLandroid/hardware/usb/UsbManager;->getDeviceList()Ljava/util/HashMap;
-HSPLandroid/hardware/usb/UsbPort;->getId()Ljava/lang/String;
-HSPLandroid/hardware/usb/UsbPortStatus;-><init>(IIIIII)V
-HSPLandroid/hardware/usb/UsbPortStatus;->isConnected()Z
-HSPLandroid/icu/impl/BMPSet;-><init>([II)V
-HSPLandroid/icu/impl/BMPSet;->contains(I)Z
-HSPLandroid/icu/impl/BMPSet;->containsSlow(III)Z
-HSPLandroid/icu/impl/BMPSet;->findCodePoint(III)I
-HSPLandroid/icu/impl/BMPSet;->initBits()V
-HSPLandroid/icu/impl/BMPSet;->set32x64Bits([III)V
-HSPLandroid/icu/impl/CacheValue$NullValue;->isNull()Z
-HSPLandroid/icu/impl/CacheValue$SoftValue;-><init>(Ljava/lang/Object;)V
-HSPLandroid/icu/impl/CacheValue$SoftValue;->get()Ljava/lang/Object;
-HSPLandroid/icu/impl/CacheValue$SoftValue;->resetIfCleared(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/impl/CacheValue$StrongValue;->get()Ljava/lang/Object;
-HSPLandroid/icu/impl/CacheValue;-><init>()V
-HSPLandroid/icu/impl/CacheValue;->futureInstancesWillBeStrong()Z
-HSPLandroid/icu/impl/CacheValue;->getInstance(Ljava/lang/Object;)Landroid/icu/impl/CacheValue;
-HSPLandroid/icu/impl/CacheValue;->isNull()Z
-HSPLandroid/icu/impl/CacheValue;->setStrength(Landroid/icu/impl/CacheValue$Strength;)V
-HSPLandroid/icu/impl/CalType;->getId()Ljava/lang/String;
-HSPLandroid/icu/impl/CalType;->values()[Landroid/icu/impl/CalType;
-HSPLandroid/icu/impl/CalendarUtil$CalendarPreferences;->getCalendarTypeForRegion(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/CalendarUtil;->getCalendarType(Landroid/icu/util/ULocale;)Ljava/lang/String;
-HSPLandroid/icu/impl/CaseMapImpl;->appendUnchanged(Ljava/lang/CharSequence;IILjava/lang/Appendable;ILandroid/icu/text/Edits;)V
-HSPLandroid/icu/impl/CaseMapImpl;->applyEdits(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;Landroid/icu/text/Edits;)Ljava/lang/String;
-HSPLandroid/icu/impl/CaseMapImpl;->internalToUpper(IILjava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)V
-HSPLandroid/icu/impl/CaseMapImpl;->toUpper(IILjava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)Ljava/lang/Appendable;
-HSPLandroid/icu/impl/CharacterIteration;->nextTrail32(Ljava/text/CharacterIterator;I)I
-HSPLandroid/icu/impl/CharacterIteration;->previous32(Ljava/text/CharacterIterator;)I
-HSPLandroid/icu/impl/ClassLoaderUtil;->getClassLoader(Ljava/lang/Class;)Ljava/lang/ClassLoader;
-HSPLandroid/icu/impl/CurrencyData$CurrencyDisplayInfo;-><init>()V
-HSPLandroid/icu/impl/CurrencyData$CurrencySpacingInfo;-><init>()V
-HSPLandroid/icu/impl/CurrencyData$CurrencySpacingInfo;->getAfterSymbols()[Ljava/lang/String;
-HSPLandroid/icu/impl/CurrencyData$CurrencySpacingInfo;->getBeforeSymbols()[Ljava/lang/String;
-HSPLandroid/icu/impl/CurrencyData$CurrencySpacingInfo;->setSymbolIfNull(Landroid/icu/impl/CurrencyData$CurrencySpacingInfo$SpacingType;Landroid/icu/impl/CurrencyData$CurrencySpacingInfo$SpacingPattern;Ljava/lang/String;)V
-HSPLandroid/icu/impl/DateNumberFormat;-><init>(Landroid/icu/util/ULocale;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/icu/impl/DateNumberFormat;->getDigits()[C
-HSPLandroid/icu/impl/DateNumberFormat;->initialize(Landroid/icu/util/ULocale;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/icu/impl/FormattedStringBuilder;-><init>()V
-HSPLandroid/icu/impl/FormattedStringBuilder;-><init>(I)V
-HSPLandroid/icu/impl/FormattedStringBuilder;-><init>(Landroid/icu/impl/FormattedStringBuilder;)V
-HSPLandroid/icu/impl/FormattedStringBuilder;->charAt(I)C
-HSPLandroid/icu/impl/FormattedStringBuilder;->clear()Landroid/icu/impl/FormattedStringBuilder;
-HSPLandroid/icu/impl/FormattedStringBuilder;->copyFrom(Landroid/icu/impl/FormattedStringBuilder;)V
-HSPLandroid/icu/impl/FormattedStringBuilder;->fieldAt(I)Ljava/lang/Object;
-HSPLandroid/icu/impl/FormattedStringBuilder;->getCapacity()I
-HSPLandroid/icu/impl/FormattedStringBuilder;->insert(ILjava/lang/CharSequence;IILjava/lang/Object;)I
-HSPLandroid/icu/impl/FormattedStringBuilder;->insert(ILjava/lang/CharSequence;Ljava/lang/Object;)I+]Ljava/lang/CharSequence;Ljava/lang/String;
-HSPLandroid/icu/impl/FormattedStringBuilder;->insert(I[C[Ljava/lang/Object;)I
-HSPLandroid/icu/impl/FormattedStringBuilder;->insertCodePoint(IILjava/lang/Object;)I
-HSPLandroid/icu/impl/FormattedStringBuilder;->length()I
-HSPLandroid/icu/impl/FormattedStringBuilder;->prepareForInsert(II)I
-HSPLandroid/icu/impl/FormattedStringBuilder;->subSequence(II)Ljava/lang/CharSequence;
-HSPLandroid/icu/impl/FormattedStringBuilder;->toCharArray()[C
-HSPLandroid/icu/impl/FormattedStringBuilder;->toFieldArray()[Ljava/lang/Object;
-HSPLandroid/icu/impl/FormattedStringBuilder;->toString()Ljava/lang/String;
-HSPLandroid/icu/impl/FormattedStringBuilder;->unwrapField(Ljava/lang/Object;)Ljava/text/Format$Field;
-HSPLandroid/icu/impl/FormattedValueStringBuilderImpl;->isIntOrGroup(Ljava/lang/Object;)Z
-HSPLandroid/icu/impl/FormattedValueStringBuilderImpl;->nextFieldPosition(Landroid/icu/impl/FormattedStringBuilder;Ljava/text/FieldPosition;)Z+]Landroid/icu/text/ConstrainedFieldPosition;Landroid/icu/text/ConstrainedFieldPosition;]Ljava/text/FieldPosition;Ljava/text/DontCareFieldPosition;
-HSPLandroid/icu/impl/FormattedValueStringBuilderImpl;->nextPosition(Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/text/ConstrainedFieldPosition;Ljava/text/Format$Field;)Z+]Landroid/icu/text/ConstrainedFieldPosition;Landroid/icu/text/ConstrainedFieldPosition;
-HSPLandroid/icu/impl/Grego;->dayOfWeek(J)I
-HSPLandroid/icu/impl/Grego;->dayToFields(J[I)[I
-HSPLandroid/icu/impl/Grego;->fieldsToDay(III)J
-HSPLandroid/icu/impl/Grego;->floorDivide(JJ)J
-HSPLandroid/icu/impl/Grego;->floorDivide(JJ[J)J
-HSPLandroid/icu/impl/Grego;->isLeapYear(I)Z
-HSPLandroid/icu/impl/Grego;->monthLength(II)I
-HSPLandroid/icu/impl/Grego;->previousMonthLength(II)I
-HSPLandroid/icu/impl/Grego;->timeToFields(J[I)[I
-HSPLandroid/icu/impl/ICUBinary$DatPackageReader;->addBaseName(Ljava/nio/ByteBuffer;ILjava/lang/String;Ljava/lang/String;Ljava/lang/StringBuilder;Ljava/util/Set;)Z
-HSPLandroid/icu/impl/ICUBinary$DatPackageReader;->addBaseNamesInFolder(Ljava/nio/ByteBuffer;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V
-HSPLandroid/icu/impl/ICUBinary$DatPackageReader;->binarySearch(Ljava/nio/ByteBuffer;Ljava/lang/CharSequence;)I
-HSPLandroid/icu/impl/ICUBinary$DatPackageReader;->getData(Ljava/nio/ByteBuffer;Ljava/lang/CharSequence;)Ljava/nio/ByteBuffer;
-HSPLandroid/icu/impl/ICUBinary$DatPackageReader;->getDataOffset(Ljava/nio/ByteBuffer;I)I
-HSPLandroid/icu/impl/ICUBinary$DatPackageReader;->getNameOffset(Ljava/nio/ByteBuffer;I)I
-HSPLandroid/icu/impl/ICUBinary$PackageDataFile;->addBaseNamesInFolder(Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V
-HSPLandroid/icu/impl/ICUBinary$PackageDataFile;->getData(Ljava/lang/String;)Ljava/nio/ByteBuffer;
-HSPLandroid/icu/impl/ICUBinary;->addBaseNamesInFileFolder(Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V
-HSPLandroid/icu/impl/ICUBinary;->compareKeys(Ljava/lang/CharSequence;Ljava/nio/ByteBuffer;I)I
-HSPLandroid/icu/impl/ICUBinary;->compareKeys(Ljava/lang/CharSequence;[BI)I+]Ljava/lang/CharSequence;Ljava/lang/String;
-HSPLandroid/icu/impl/ICUBinary;->getBytes(Ljava/nio/ByteBuffer;II)[B
-HSPLandroid/icu/impl/ICUBinary;->getChars(Ljava/nio/ByteBuffer;II)[C
-HSPLandroid/icu/impl/ICUBinary;->getData(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;)Ljava/nio/ByteBuffer;
-HSPLandroid/icu/impl/ICUBinary;->getData(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;Z)Ljava/nio/ByteBuffer;
-HSPLandroid/icu/impl/ICUBinary;->getData(Ljava/lang/String;)Ljava/nio/ByteBuffer;
-HSPLandroid/icu/impl/ICUBinary;->getDataFromFile(Ljava/lang/String;)Ljava/nio/ByteBuffer;
-HSPLandroid/icu/impl/ICUBinary;->getInts(Ljava/nio/ByteBuffer;II)[I
-HSPLandroid/icu/impl/ICUBinary;->getString(Ljava/nio/ByteBuffer;II)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUBinary;->readHeader(Ljava/nio/ByteBuffer;ILandroid/icu/impl/ICUBinary$Authenticate;)I
-HSPLandroid/icu/impl/ICUBinary;->skipBytes(Ljava/nio/ByteBuffer;I)V
-HSPLandroid/icu/impl/ICUBinary;->sliceWithOrder(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
-HSPLandroid/icu/impl/ICUConfig;->get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$CurrencySink;-><init>(ZLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$CurrencySink$EntrypointTable;)V
-HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$CurrencySink;->consumeCurrenciesEntry(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$CurrencySink;->consumeCurrencySpacingTable(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$CurrencySink;->put(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$FormattingData;-><init>(Ljava/lang/String;)V
-HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo;-><init>(Landroid/icu/util/ULocale;Landroid/icu/impl/ICUResourceBundle;Z)V
-HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo;->fetchFormattingData(Ljava/lang/String;)Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$FormattingData;
-HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo;->fetchSpacingInfo()Landroid/icu/impl/CurrencyData$CurrencySpacingInfo;
-HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo;->getFormatInfo(Ljava/lang/String;)Landroid/icu/impl/CurrencyData$CurrencyFormatInfo;
-HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo;->getSpacingInfo()Landroid/icu/impl/CurrencyData$CurrencySpacingInfo;
-HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo;->getSymbol(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider;->getInstance(Landroid/icu/util/ULocale;Z)Landroid/icu/impl/CurrencyData$CurrencyDisplayInfo;
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector;-><init>()V
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector;-><init>(Landroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector-IA;)V
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector;->collect(Ljava/lang/String;Ljava/lang/String;JJIZ)V
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector;->collects()I
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector;->getList()Ljava/util/List;
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo$UniqueList;->-$$Nest$smcreate()Landroid/icu/impl/ICUCurrencyMetaInfo$UniqueList;
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo$UniqueList;-><init>()V
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo$UniqueList;->add(Ljava/lang/Object;)V
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo$UniqueList;->create()Landroid/icu/impl/ICUCurrencyMetaInfo$UniqueList;
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo$UniqueList;->list()Ljava/util/List;
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->collect(Landroid/icu/impl/ICUCurrencyMetaInfo$Collector;Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;)Ljava/util/List;
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->collectRegion(Landroid/icu/impl/ICUCurrencyMetaInfo$Collector;Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;ILandroid/icu/impl/ICUResourceBundle;)V+]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/ICUResourceBundle;Landroid/icu/impl/ICUResourceBundleImpl$ResourceString;,Landroid/icu/impl/ICUResourceBundleImpl$ResourceTable;,Landroid/icu/impl/ICUResourceBundleImpl$ResourceArray;]Landroid/icu/impl/ICUCurrencyMetaInfo$Collector;Landroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector;
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->currencies(Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;)Ljava/util/List;
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->currencyDigits(Ljava/lang/String;Landroid/icu/util/Currency$CurrencyUsage;)Landroid/icu/text/CurrencyMetaInfo$CurrencyDigits;
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->getDate(Landroid/icu/impl/ICUResourceBundle;JZ)J
-HSPLandroid/icu/impl/ICUData;->checkStreamForBinaryData(Ljava/io/InputStream;Ljava/lang/String;)V
-HSPLandroid/icu/impl/ICUData;->getStream(Ljava/lang/ClassLoader;Ljava/lang/String;Z)Ljava/io/InputStream;
-HSPLandroid/icu/impl/ICULocaleService$ICUResourceBundleFactory;->getSupportedIDs()Ljava/util/Set;
-HSPLandroid/icu/impl/ICULocaleService$ICUResourceBundleFactory;->loader()Ljava/lang/ClassLoader;
-HSPLandroid/icu/impl/ICULocaleService$LocaleKey;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->createWithCanonical(Landroid/icu/util/ULocale;Ljava/lang/String;I)Landroid/icu/impl/ICULocaleService$LocaleKey;
-HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->currentDescriptor()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/icu/impl/ICULocaleService$LocaleKey;Landroid/icu/impl/ICULocaleService$LocaleKey;
-HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->currentID()Ljava/lang/String;
-HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->currentLocale()Landroid/icu/util/ULocale;
-HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->fallback()Z
-HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->kind()I
-HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->prefix()Ljava/lang/String;
-HSPLandroid/icu/impl/ICULocaleService$LocaleKeyFactory;->create(Landroid/icu/impl/ICUService$Key;Landroid/icu/impl/ICUService;)Ljava/lang/Object;
-HSPLandroid/icu/impl/ICULocaleService$LocaleKeyFactory;->handlesKey(Landroid/icu/impl/ICUService$Key;)Z
-HSPLandroid/icu/impl/ICULocaleService;->createKey(Landroid/icu/util/ULocale;I)Landroid/icu/impl/ICUService$Key;
-HSPLandroid/icu/impl/ICULocaleService;->get(Landroid/icu/util/ULocale;I[Landroid/icu/util/ULocale;)Ljava/lang/Object;
-HSPLandroid/icu/impl/ICULocaleService;->get(Landroid/icu/util/ULocale;[Landroid/icu/util/ULocale;)Ljava/lang/Object;
-HSPLandroid/icu/impl/ICULocaleService;->validateFallbackLocale()Ljava/lang/String;
-HSPLandroid/icu/impl/ICURWLock;->acquireRead()V
-HSPLandroid/icu/impl/ICURWLock;->releaseRead()V
-HSPLandroid/icu/impl/ICUResourceBundle$1;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/impl/ICUResourceBundle$1;->createInstance(Ljava/lang/String;Landroid/icu/impl/ICUResourceBundle$Loader;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle$1AllChildrenSink;-><init>(Landroid/icu/impl/ICUResourceBundle;Landroid/icu/impl/UResource$Sink;)V
-HSPLandroid/icu/impl/ICUResourceBundle$1AllChildrenSink;->put(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/impl/ICUResourceBundle$2$1;-><init>(Landroid/icu/impl/ICUResourceBundle$2;)V
-HSPLandroid/icu/impl/ICUResourceBundle$2;-><init>(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/util/Set;)V
-HSPLandroid/icu/impl/ICUResourceBundle$2;->run()Ljava/lang/Object;
-HSPLandroid/icu/impl/ICUResourceBundle$2;->run()Ljava/lang/Void;
-HSPLandroid/icu/impl/ICUResourceBundle$3;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/impl/ICUResourceBundle$3;->createInstance(Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/impl/ICUResourceBundle$AvailEntry;
-HSPLandroid/icu/impl/ICUResourceBundle$5;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Landroid/icu/impl/ICUResourceBundle$OpenType;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/icu/impl/ICUResourceBundle$5;->load()Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle$AvailEntry;->getFullLocaleNameSet()Ljava/util/Set;
-HSPLandroid/icu/impl/ICUResourceBundle$Loader;-><init>()V
-HSPLandroid/icu/impl/ICUResourceBundle$Loader;-><init>(Landroid/icu/impl/ICUResourceBundle$Loader-IA;)V
-HSPLandroid/icu/impl/ICUResourceBundle$WholeBundle;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Landroid/icu/impl/ICUResourceBundleReader;)V
-HSPLandroid/icu/impl/ICUResourceBundle;->-$$Nest$mgetNoFallback(Landroid/icu/impl/ICUResourceBundle;)Z
-HSPLandroid/icu/impl/ICUResourceBundle;->-$$Nest$sfgetDEBUG()Z
-HSPLandroid/icu/impl/ICUResourceBundle;->-$$Nest$smgetParentLocaleID(Ljava/lang/String;Ljava/lang/String;Landroid/icu/impl/ICUResourceBundle$OpenType;)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundle;->-$$Nest$sminstantiateBundle(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Landroid/icu/impl/ICUResourceBundle$OpenType;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;-><init>(Landroid/icu/impl/ICUResourceBundle$WholeBundle;)V
-HSPLandroid/icu/impl/ICUResourceBundle;-><init>(Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)V
-HSPLandroid/icu/impl/ICUResourceBundle;->addBundleBaseNamesFromClassLoader(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/Set;)V
-HSPLandroid/icu/impl/ICUResourceBundle;->at(I)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->at(Ljava/lang/String;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->countPathKeys(Ljava/lang/String;)I+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundle;->createBundle(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->createFullLocaleNameSet(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/util/Set;
-HSPLandroid/icu/impl/ICUResourceBundle;->equals(Ljava/lang/Object;)Z
-HSPLandroid/icu/impl/ICUResourceBundle;->findResourceWithFallback(Ljava/lang/String;Landroid/icu/util/UResourceBundle;Landroid/icu/util/UResourceBundle;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->findResourceWithFallback([Ljava/lang/String;ILandroid/icu/impl/ICUResourceBundle;Landroid/icu/util/UResourceBundle;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->findStringWithFallback(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundle;->findStringWithFallback(Ljava/lang/String;Landroid/icu/util/UResourceBundle;Landroid/icu/util/UResourceBundle;)Ljava/lang/String;+]Landroid/icu/impl/ICUResourceBundleReader$Container;Landroid/icu/impl/ICUResourceBundleReader$Table;,Landroid/icu/impl/ICUResourceBundleReader$Table1632;,Landroid/icu/impl/ICUResourceBundleReader$Table16;]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/ICUResourceBundle;Landroid/icu/impl/ICUResourceBundleImpl$ResourceTable;]Landroid/icu/impl/ICUResourceBundleReader;Landroid/icu/impl/ICUResourceBundleReader;
-HSPLandroid/icu/impl/ICUResourceBundle;->findTopLevel(Ljava/lang/String;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->findTopLevel(Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->findWithFallback(Ljava/lang/String;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->get(Ljava/lang/String;Ljava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->getAliasedResource(Landroid/icu/impl/ICUResourceBundle;[Ljava/lang/String;ILjava/lang/String;ILjava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->getAliasedResource(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/String;[Ljava/lang/String;I[Ljava/lang/String;Ljava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->getAllChildrenWithFallback(Ljava/lang/String;Landroid/icu/impl/UResource$Sink;)V
-HSPLandroid/icu/impl/ICUResourceBundle;->getAllItemsWithFallback(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/ICUResourceBundleReader$ReaderValue;Landroid/icu/impl/UResource$Sink;Landroid/icu/util/UResourceBundle;)V
-HSPLandroid/icu/impl/ICUResourceBundle;->getAllItemsWithFallback(Ljava/lang/String;Landroid/icu/impl/UResource$Sink;)V
-HSPLandroid/icu/impl/ICUResourceBundle;->getAllItemsWithFallbackNoFail(Ljava/lang/String;Landroid/icu/impl/UResource$Sink;)V
-HSPLandroid/icu/impl/ICUResourceBundle;->getAvailEntry(Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/impl/ICUResourceBundle$AvailEntry;
-HSPLandroid/icu/impl/ICUResourceBundle;->getBaseName()Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundle;->getBundle(Landroid/icu/impl/ICUResourceBundleReader;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->getBundleInstance(Ljava/lang/String;Landroid/icu/util/ULocale;Landroid/icu/impl/ICUResourceBundle$OpenType;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->getBundleInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Landroid/icu/impl/ICUResourceBundle$OpenType;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->getBundleInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Z)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->getDefaultScript(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundle;->getExplicitParent(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundle;->getFullLocaleNameSet(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/util/Set;
-HSPLandroid/icu/impl/ICUResourceBundle;->getKey()Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundle;->getLocale()Ljava/util/Locale;
-HSPLandroid/icu/impl/ICUResourceBundle;->getLocaleID()Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundle;->getNoFallback()Z
-HSPLandroid/icu/impl/ICUResourceBundle;->getParent()Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->getParent()Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->getParentLocaleID(Ljava/lang/String;Ljava/lang/String;Landroid/icu/impl/ICUResourceBundle$OpenType;)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundle;->getResDepth()I
-HSPLandroid/icu/impl/ICUResourceBundle;->getResPathKeys(Ljava/lang/String;I[Ljava/lang/String;I)V
-HSPLandroid/icu/impl/ICUResourceBundle;->getResPathKeys([Ljava/lang/String;I)V
-HSPLandroid/icu/impl/ICUResourceBundle;->getStringWithFallback(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundle;->getULocale()Landroid/icu/util/ULocale;
-HSPLandroid/icu/impl/ICUResourceBundle;->getWithFallback(Ljava/lang/String;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundle;->instantiateBundle(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Landroid/icu/impl/ICUResourceBundle$OpenType;)Landroid/icu/impl/ICUResourceBundle;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/icu/impl/ICUResourceBundle$OpenType;Landroid/icu/impl/ICUResourceBundle$OpenType;]Landroid/icu/impl/CacheBase;Landroid/icu/impl/ICUResourceBundle$1;
-HSPLandroid/icu/impl/ICUResourceBundle;->setParent(Ljava/util/ResourceBundle;)V
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceArray;-><init>(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceArray;->getStringArray()[Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceArray;->getType()I
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceArray;->handleGet(ILjava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceArray;->handleGetStringArray()[Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceBinary;-><init>(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceBinary;->getBinary([B)[B
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;-><init>(Landroid/icu/impl/ICUResourceBundle$WholeBundle;)V
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;-><init>(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;->createBundleObject(ILjava/lang/String;Ljava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;->getContainerResource(I)I+]Landroid/icu/impl/ICUResourceBundleReader$Container;Landroid/icu/impl/ICUResourceBundleReader$Table1632;,Landroid/icu/impl/ICUResourceBundleReader$Table16;
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;->getSize()I
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;->getString(I)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceInt;-><init>(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceInt;->getInt()I
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceIntVector;-><init>(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceIntVector;->getIntVector()[I
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceString;-><init>(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V+]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/ICUResourceBundleReader;Landroid/icu/impl/ICUResourceBundleReader;
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceString;->getString()Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceString;->getType()I
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;-><init>(Landroid/icu/impl/ICUResourceBundle$WholeBundle;I)V
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;-><init>(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V+]Landroid/icu/impl/ICUResourceBundleReader;Landroid/icu/impl/ICUResourceBundleReader;
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->findString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->getType()I
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->handleGet(ILjava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->handleGet(Ljava/lang/String;Ljava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/util/UResourceBundle;+]Landroid/icu/impl/ICUResourceBundleImpl$ResourceTable;Landroid/icu/impl/ICUResourceBundleImpl$ResourceTable;]Landroid/icu/impl/ICUResourceBundleReader$Table;Landroid/icu/impl/ICUResourceBundleReader$Table;,Landroid/icu/impl/ICUResourceBundleReader$Table1632;,Landroid/icu/impl/ICUResourceBundleReader$Table16;
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->handleGetObject(Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroid/icu/impl/ICUResourceBundleImpl;-><init>(Landroid/icu/impl/ICUResourceBundle$WholeBundle;)V
-HSPLandroid/icu/impl/ICUResourceBundleImpl;-><init>(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V
-HSPLandroid/icu/impl/ICUResourceBundleImpl;->createBundleObject(Ljava/lang/String;ILjava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/impl/ICUResourceBundle;
-HSPLandroid/icu/impl/ICUResourceBundleImpl;->getResource()I
-HSPLandroid/icu/impl/ICUResourceBundleReader$Array16;-><init>(Landroid/icu/impl/ICUResourceBundleReader;I)V
-HSPLandroid/icu/impl/ICUResourceBundleReader$Array16;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader$Array32;-><init>(Landroid/icu/impl/ICUResourceBundleReader;I)V
-HSPLandroid/icu/impl/ICUResourceBundleReader$Array32;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader$Array;-><init>()V
-HSPLandroid/icu/impl/ICUResourceBundleReader$Array;->getValue(ILandroid/icu/impl/UResource$Value;)Z
-HSPLandroid/icu/impl/ICUResourceBundleReader$Container;-><init>()V
-HSPLandroid/icu/impl/ICUResourceBundleReader$Container;->getContainer16Resource(Landroid/icu/impl/ICUResourceBundleReader;I)I+]Ljava/nio/CharBuffer;Ljava/nio/ByteBufferAsCharBuffer;
-HSPLandroid/icu/impl/ICUResourceBundleReader$Container;->getContainer32Resource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader$Container;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader$Container;->getSize()I
-HSPLandroid/icu/impl/ICUResourceBundleReader$IsAcceptable;->isDataVersionAcceptable([B)Z
-HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderCache;->createInstance(Landroid/icu/impl/ICUResourceBundleReader$ReaderCacheKey;Ljava/lang/ClassLoader;)Landroid/icu/impl/ICUResourceBundleReader;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderCache;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderCacheKey;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderCacheKey;->equals(Ljava/lang/Object;)Z
-HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderCacheKey;->hashCode()I
-HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderValue;-><init>()V
-HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderValue;->getAliasString()Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderValue;->getArray()Landroid/icu/impl/UResource$Array;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderValue;->getString()Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderValue;->getStringArray()[Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderValue;->getStringArray(Landroid/icu/impl/ICUResourceBundleReader$Array;)[Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderValue;->getTable()Landroid/icu/impl/UResource$Table;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderValue;->getType()I
-HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->get(I)Ljava/lang/Object;+]Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->putIfAbsent(ILjava/lang/Object;I)Ljava/lang/Object;+]Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;-><init>(I)V
-HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->findSimple(I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->get(I)Ljava/lang/Object;+]Ljava/lang/ref/SoftReference;Ljava/lang/ref/SoftReference;]Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->makeKey(I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->putIfAbsent(ILjava/lang/Object;I)Ljava/lang/Object;+]Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->putIfCleared([Ljava/lang/Object;ILjava/lang/Object;I)Ljava/lang/Object;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->storeDirectly(I)Z
-HSPLandroid/icu/impl/ICUResourceBundleReader$Table1632;-><init>(Landroid/icu/impl/ICUResourceBundleReader;I)V
-HSPLandroid/icu/impl/ICUResourceBundleReader$Table1632;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader$Table16;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader$Table;-><init>()V
-HSPLandroid/icu/impl/ICUResourceBundleReader$Table;->findTableItem(Landroid/icu/impl/ICUResourceBundleReader;Ljava/lang/CharSequence;)I
-HSPLandroid/icu/impl/ICUResourceBundleReader$Table;->findValue(Ljava/lang/CharSequence;Landroid/icu/impl/UResource$Value;)Z
-HSPLandroid/icu/impl/ICUResourceBundleReader$Table;->getKey(Landroid/icu/impl/ICUResourceBundleReader;I)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleReader$Table;->getKeyAndValue(ILandroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)Z+]Landroid/icu/impl/ICUResourceBundleReader$Table;Landroid/icu/impl/ICUResourceBundleReader$Table1632;,Landroid/icu/impl/ICUResourceBundleReader$Table16;
-HSPLandroid/icu/impl/ICUResourceBundleReader$Table;->getResource(Landroid/icu/impl/ICUResourceBundleReader;Ljava/lang/String;)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->-$$Nest$fgetb16BitUnits(Landroid/icu/impl/ICUResourceBundleReader;)Ljava/nio/CharBuffer;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->-$$Nest$fgetpoolStringIndex16Limit(Landroid/icu/impl/ICUResourceBundleReader;)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->-$$Nest$fgetpoolStringIndexLimit(Landroid/icu/impl/ICUResourceBundleReader;)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->-$$Nest$mcompareKeys(Landroid/icu/impl/ICUResourceBundleReader;Ljava/lang/CharSequence;C)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->-$$Nest$mgetInt(Landroid/icu/impl/ICUResourceBundleReader;I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->-$$Nest$mgetResourceByteOffset(Landroid/icu/impl/ICUResourceBundleReader;I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->-$$Nest$mgetTableKeyOffsets(Landroid/icu/impl/ICUResourceBundleReader;I)[C
-HSPLandroid/icu/impl/ICUResourceBundleReader;->-$$Nest$sfgetNULL_READER()Landroid/icu/impl/ICUResourceBundleReader;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->-$$Nest$sfgetPUBLIC_TYPES()[I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->-$$Nest$smRES_GET_OFFSET(I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;-><init>(Ljava/nio/ByteBuffer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V
-HSPLandroid/icu/impl/ICUResourceBundleReader;-><init>(Ljava/nio/ByteBuffer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Landroid/icu/impl/ICUResourceBundleReader-IA;)V
-HSPLandroid/icu/impl/ICUResourceBundleReader;->RES_GET_INT(I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->RES_GET_OFFSET(I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->RES_GET_TYPE(I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->URES_IS_ARRAY(I)Z
-HSPLandroid/icu/impl/ICUResourceBundleReader;->URES_IS_TABLE(I)Z
-HSPLandroid/icu/impl/ICUResourceBundleReader;->compareKeys(Ljava/lang/CharSequence;C)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getAlias(I)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getArray(I)Landroid/icu/impl/ICUResourceBundleReader$Array;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getBinary(I[B)[B
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getChars(II)[C
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getFullName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getIndexesInt(I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getInt(I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getIntVector(I)[I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getInts(II)[I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getKey16String(I)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getNoFallback()Z
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getReader(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/impl/ICUResourceBundleReader;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getResourceByteOffset(I)I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getRootResource()I
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getString(I)Ljava/lang/String;+]Landroid/icu/impl/ICUResourceBundleReader;Landroid/icu/impl/ICUResourceBundleReader;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getStringV2(I)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;]Ljava/nio/CharBuffer;Ljava/nio/ByteBufferAsCharBuffer;]Ljava/lang/CharSequence;Ljava/nio/ByteBufferAsCharBuffer;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getTable(I)Landroid/icu/impl/ICUResourceBundleReader$Table;+]Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;]Landroid/icu/impl/ICUResourceBundleReader$Table;Landroid/icu/impl/ICUResourceBundleReader$Table16;,Landroid/icu/impl/ICUResourceBundleReader$Table1632;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getTable16KeyOffsets(I)[C+]Ljava/nio/CharBuffer;Ljava/nio/ByteBufferAsCharBuffer;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getTableKeyOffsets(I)[C
-HSPLandroid/icu/impl/ICUResourceBundleReader;->init(Ljava/nio/ByteBuffer;)V
-HSPLandroid/icu/impl/ICUResourceBundleReader;->makeKeyStringFromBytes([BI)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->makeStringFromBytes(II)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->setKeyFromKey16(ILandroid/icu/impl/UResource$Key;)V
-HSPLandroid/icu/impl/ICUService$CacheEntry;-><init>(Ljava/lang/String;Ljava/lang/Object;)V
-HSPLandroid/icu/impl/ICUService$Key;-><init>(Ljava/lang/String;)V
-HSPLandroid/icu/impl/ICUService;->clearServiceCache()V
-HSPLandroid/icu/impl/ICUService;->getKey(Landroid/icu/impl/ICUService$Key;[Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroid/icu/impl/ICUService;->getKey(Landroid/icu/impl/ICUService$Key;[Ljava/lang/String;Landroid/icu/impl/ICUService$Factory;)Ljava/lang/Object;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap;]Landroid/icu/impl/ICURWLock;Landroid/icu/impl/ICURWLock;]Landroid/icu/impl/ICUService$Key;Landroid/icu/impl/ICULocaleService$LocaleKey;
-HSPLandroid/icu/impl/ICUService;->isDefault()Z
-HSPLandroid/icu/impl/IDNA2003;->convertIDNToASCII(Ljava/lang/String;I)Ljava/lang/StringBuffer;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;
-HSPLandroid/icu/impl/IDNA2003;->convertToASCII(Landroid/icu/text/UCharacterIterator;I)Ljava/lang/StringBuffer;+]Landroid/icu/text/UCharacterIterator;Landroid/icu/impl/ReplaceableUCharacterIterator;]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;
-HSPLandroid/icu/impl/IDNA2003;->getSeparatorIndex([CII)I
-HSPLandroid/icu/impl/IDNA2003;->isLDHChar(I)Z
-HSPLandroid/icu/impl/IDNA2003;->isLabelSeparator(I)Z
-HSPLandroid/icu/impl/LocaleIDParser$1;-><init>(Landroid/icu/impl/LocaleIDParser;)V
-HSPLandroid/icu/impl/LocaleIDParser$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/icu/impl/LocaleIDParser$1;->compare(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/icu/impl/LocaleIDParser;-><init>(Ljava/lang/String;)V
-HSPLandroid/icu/impl/LocaleIDParser;-><init>(Ljava/lang/String;Z)V+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/icu/impl/LocaleIDParser;->addSeparator()V
-HSPLandroid/icu/impl/LocaleIDParser;->append(C)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/icu/impl/LocaleIDParser;->append(Ljava/lang/String;)V
-HSPLandroid/icu/impl/LocaleIDParser;->atTerminator()Z
-HSPLandroid/icu/impl/LocaleIDParser;->getBaseName()Ljava/lang/String;
-HSPLandroid/icu/impl/LocaleIDParser;->getCountry()Ljava/lang/String;
-HSPLandroid/icu/impl/LocaleIDParser;->getKeyComparator()Ljava/util/Comparator;
-HSPLandroid/icu/impl/LocaleIDParser;->getKeyword()Ljava/lang/String;
-HSPLandroid/icu/impl/LocaleIDParser;->getKeywordMap()Ljava/util/Map;
-HSPLandroid/icu/impl/LocaleIDParser;->getKeywordValue(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/LocaleIDParser;->getKeywords()Ljava/util/Iterator;
-HSPLandroid/icu/impl/LocaleIDParser;->getLanguage()Ljava/lang/String;
-HSPLandroid/icu/impl/LocaleIDParser;->getName()Ljava/lang/String;
-HSPLandroid/icu/impl/LocaleIDParser;->getScript()Ljava/lang/String;
-HSPLandroid/icu/impl/LocaleIDParser;->getString(I)Ljava/lang/String;
-HSPLandroid/icu/impl/LocaleIDParser;->getValue()Ljava/lang/String;
-HSPLandroid/icu/impl/LocaleIDParser;->getVariant()Ljava/lang/String;
-HSPLandroid/icu/impl/LocaleIDParser;->haveExperimentalLanguagePrefix()Z
-HSPLandroid/icu/impl/LocaleIDParser;->haveKeywordAssign()Z
-HSPLandroid/icu/impl/LocaleIDParser;->isDoneOrItemSeparator(C)Z
-HSPLandroid/icu/impl/LocaleIDParser;->isDoneOrKeywordAssign(C)Z
-HSPLandroid/icu/impl/LocaleIDParser;->isTerminator(C)Z
-HSPLandroid/icu/impl/LocaleIDParser;->isTerminatorOrIDSeparator(C)Z
-HSPLandroid/icu/impl/LocaleIDParser;->next()C
-HSPLandroid/icu/impl/LocaleIDParser;->parseBaseName()V
-HSPLandroid/icu/impl/LocaleIDParser;->parseCountry()I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/icu/impl/LocaleIDParser;->parseKeywords()I
-HSPLandroid/icu/impl/LocaleIDParser;->parseLanguage()I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/icu/impl/LocaleIDParser;->parseScript()I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/icu/impl/LocaleIDParser;->parseVariant()I
-HSPLandroid/icu/impl/LocaleIDParser;->reset()V
-HSPLandroid/icu/impl/LocaleIDParser;->setKeywordValue(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/icu/impl/LocaleIDParser;->setKeywordValue(Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLandroid/icu/impl/LocaleIDParser;->setToKeywordStart()Z
-HSPLandroid/icu/impl/LocaleIDParser;->skipCountry()V
-HSPLandroid/icu/impl/LocaleIDParser;->skipLanguage()V
-HSPLandroid/icu/impl/LocaleIDParser;->skipScript()V
-HSPLandroid/icu/impl/LocaleIDParser;->skipUntilTerminatorOrIDSeparator()V
-HSPLandroid/icu/impl/Norm2AllModes$ComposeNormalizer2;->spanQuickCheckYes(Ljava/lang/CharSequence;)I
-HSPLandroid/icu/impl/Norm2AllModes$DecomposeNormalizer2;->normalizeAndAppend(Ljava/lang/CharSequence;ZLandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;)V
-HSPLandroid/icu/impl/Norm2AllModes$DecomposeNormalizer2;->spanQuickCheckYes(Ljava/lang/CharSequence;)I
-HSPLandroid/icu/impl/Norm2AllModes$NFKCSingleton;->-$$Nest$sfgetINSTANCE()Landroid/icu/impl/Norm2AllModes$Norm2AllModesSingleton;
-HSPLandroid/icu/impl/Norm2AllModes$Norm2AllModesSingleton;->-$$Nest$fgetallModes(Landroid/icu/impl/Norm2AllModes$Norm2AllModesSingleton;)Landroid/icu/impl/Norm2AllModes;
-HSPLandroid/icu/impl/Norm2AllModes$Norm2AllModesSingleton;->-$$Nest$fgetexception(Landroid/icu/impl/Norm2AllModes$Norm2AllModesSingleton;)Ljava/lang/RuntimeException;
-HSPLandroid/icu/impl/Norm2AllModes$Normalizer2WithImpl;->normalize(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;
-HSPLandroid/icu/impl/Norm2AllModes$Normalizer2WithImpl;->normalizeSecondAndAppend(Ljava/lang/StringBuilder;Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;
-HSPLandroid/icu/impl/Norm2AllModes$Normalizer2WithImpl;->normalizeSecondAndAppend(Ljava/lang/StringBuilder;Ljava/lang/CharSequence;Z)Ljava/lang/StringBuilder;
-HSPLandroid/icu/impl/Norm2AllModes;->getFCDNormalizer2()Landroid/icu/text/Normalizer2;
-HSPLandroid/icu/impl/Norm2AllModes;->getInstanceFromSingleton(Landroid/icu/impl/Norm2AllModes$Norm2AllModesSingleton;)Landroid/icu/impl/Norm2AllModes;
-HSPLandroid/icu/impl/Norm2AllModes;->getNFCInstance()Landroid/icu/impl/Norm2AllModes;
-HSPLandroid/icu/impl/Norm2AllModes;->getNFKCInstance()Landroid/icu/impl/Norm2AllModes;
-HSPLandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;-><init>(Landroid/icu/impl/Normalizer2Impl;Ljava/lang/Appendable;I)V
-HSPLandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->append(Ljava/lang/CharSequence;IIZII)V
-HSPLandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->flushAndAppendZeroCC(Ljava/lang/CharSequence;II)Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;
-HSPLandroid/icu/impl/Normalizer2Impl;->addToStartSet(Landroid/icu/util/MutableCodePointTrie;II)V
-HSPLandroid/icu/impl/Normalizer2Impl;->composeQuickCheck(Ljava/lang/CharSequence;IIZZ)I
-HSPLandroid/icu/impl/Normalizer2Impl;->decompose(IILandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;)V
-HSPLandroid/icu/impl/Normalizer2Impl;->decompose(Ljava/lang/CharSequence;IILandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;)I+]Ljava/lang/CharSequence;Ljava/lang/String;
-HSPLandroid/icu/impl/Normalizer2Impl;->decomposeAndAppend(Ljava/lang/CharSequence;ZLandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;)V
-HSPLandroid/icu/impl/Normalizer2Impl;->ensureCanonIterData()Landroid/icu/impl/Normalizer2Impl;
-HSPLandroid/icu/impl/Normalizer2Impl;->getRawNorm16(I)I
-HSPLandroid/icu/impl/Normalizer2Impl;->hangulLVT()I
-HSPLandroid/icu/impl/Normalizer2Impl;->isDecompNoAlgorithmic(I)Z
-HSPLandroid/icu/impl/Normalizer2Impl;->isDecompYes(I)Z
-HSPLandroid/icu/impl/Normalizer2Impl;->isHangulLV(I)Z
-HSPLandroid/icu/impl/Normalizer2Impl;->isHangulLVT(I)Z
-HSPLandroid/icu/impl/Normalizer2Impl;->isInert(I)Z
-HSPLandroid/icu/impl/Normalizer2Impl;->isMaybeOrNonZeroCC(I)Z
-HSPLandroid/icu/impl/Normalizer2Impl;->mapAlgorithmic(II)I
-HSPLandroid/icu/impl/OlsonTimeZone;-><init>(Landroid/icu/util/UResourceBundle;Landroid/icu/util/UResourceBundle;Ljava/lang/String;)V
-HSPLandroid/icu/impl/OlsonTimeZone;->clone()Ljava/lang/Object;
-HSPLandroid/icu/impl/OlsonTimeZone;->cloneAsThawed()Landroid/icu/util/TimeZone;
-HSPLandroid/icu/impl/OlsonTimeZone;->construct(Landroid/icu/util/UResourceBundle;Landroid/icu/util/UResourceBundle;Ljava/lang/String;)V
-HSPLandroid/icu/impl/OlsonTimeZone;->equals(Ljava/lang/Object;)Z
-HSPLandroid/icu/impl/OlsonTimeZone;->freeze()Landroid/icu/util/TimeZone;
-HSPLandroid/icu/impl/OlsonTimeZone;->getCanonicalID()Ljava/lang/String;
-HSPLandroid/icu/impl/OlsonTimeZone;->getHistoricalOffset(JZII[I)V
-HSPLandroid/icu/impl/OlsonTimeZone;->getInt(B)I
-HSPLandroid/icu/impl/OlsonTimeZone;->getNextTransition(JZ)Landroid/icu/util/TimeZoneTransition;
-HSPLandroid/icu/impl/OlsonTimeZone;->getOffset(JZ[I)V
-HSPLandroid/icu/impl/OlsonTimeZone;->getTimeZoneRules()[Landroid/icu/util/TimeZoneRule;
-HSPLandroid/icu/impl/OlsonTimeZone;->hashCode()I
-HSPLandroid/icu/impl/OlsonTimeZone;->initTransitionRules()V
-HSPLandroid/icu/impl/OlsonTimeZone;->initialDstOffset()I
-HSPLandroid/icu/impl/OlsonTimeZone;->initialRawOffset()I
-HSPLandroid/icu/impl/OlsonTimeZone;->isFrozen()Z
-HSPLandroid/icu/impl/OlsonTimeZone;->loadRule(Landroid/icu/util/UResourceBundle;Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/impl/OlsonTimeZone;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/icu/impl/PatternProps;->isWhiteSpace(I)Z
-HSPLandroid/icu/impl/PatternProps;->skipWhiteSpace(Ljava/lang/CharSequence;I)I
-HSPLandroid/icu/impl/PatternTokenizer;-><init>()V
-HSPLandroid/icu/impl/PatternTokenizer;->next(Ljava/lang/StringBuffer;)I+]Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/impl/PatternTokenizer;->quoteLiteral(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/PatternTokenizer;->setExtraQuotingCharacters(Landroid/icu/text/UnicodeSet;)Landroid/icu/impl/PatternTokenizer;
-HSPLandroid/icu/impl/PatternTokenizer;->setPattern(Ljava/lang/String;)Landroid/icu/impl/PatternTokenizer;
-HSPLandroid/icu/impl/PatternTokenizer;->setSyntaxCharacters(Landroid/icu/text/UnicodeSet;)Landroid/icu/impl/PatternTokenizer;
-HSPLandroid/icu/impl/PatternTokenizer;->setUsingQuote(Z)Landroid/icu/impl/PatternTokenizer;
-HSPLandroid/icu/impl/PluralRulesLoader;->checkBuildRulesIdMaps()V
-HSPLandroid/icu/impl/PluralRulesLoader;->forLocale(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules$PluralType;)Landroid/icu/text/PluralRules;
-HSPLandroid/icu/impl/PluralRulesLoader;->getLocaleIdToRulesIdMap(Landroid/icu/text/PluralRules$PluralType;)Ljava/util/Map;
-HSPLandroid/icu/impl/PluralRulesLoader;->getOrCreateRulesForLocale(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules$PluralType;)Landroid/icu/text/PluralRules;
-HSPLandroid/icu/impl/PluralRulesLoader;->getPluralBundle()Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/impl/PluralRulesLoader;->getRulesIdForLocale(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules$PluralType;)Ljava/lang/String;
-HSPLandroid/icu/impl/RBBIDataWrapper$IsAcceptable;->isDataVersionAcceptable([B)Z
-HSPLandroid/icu/impl/RBBIDataWrapper$RBBIDataHeader;-><init>()V
-HSPLandroid/icu/impl/RBBIDataWrapper$RBBIStateTable;-><init>()V
-HSPLandroid/icu/impl/RBBIDataWrapper$RBBIStateTable;->get(Ljava/nio/ByteBuffer;I)Landroid/icu/impl/RBBIDataWrapper$RBBIStateTable;
-HSPLandroid/icu/impl/RBBIDataWrapper;-><init>()V
-HSPLandroid/icu/impl/RBBIDataWrapper;->get(Ljava/nio/ByteBuffer;)Landroid/icu/impl/RBBIDataWrapper;
-HSPLandroid/icu/impl/ReplaceableUCharacterIterator;-><init>(Ljava/lang/String;)V
-HSPLandroid/icu/impl/ReplaceableUCharacterIterator;->getLength()I
-HSPLandroid/icu/impl/ReplaceableUCharacterIterator;->getText([CI)I
-HSPLandroid/icu/impl/ReplaceableUCharacterIterator;->next()I+]Landroid/icu/text/Replaceable;Landroid/icu/text/ReplaceableString;
-HSPLandroid/icu/impl/ReplaceableUCharacterIterator;->setIndex(I)V
-HSPLandroid/icu/impl/RuleCharacterIterator;->_advance(I)V
-HSPLandroid/icu/impl/RuleCharacterIterator;->_current()I
-HSPLandroid/icu/impl/RuleCharacterIterator;->atEnd()Z
-HSPLandroid/icu/impl/RuleCharacterIterator;->getPos(Landroid/icu/impl/RuleCharacterIterator$Position;)Landroid/icu/impl/RuleCharacterIterator$Position;
-HSPLandroid/icu/impl/RuleCharacterIterator;->isEscaped()Z
-HSPLandroid/icu/impl/RuleCharacterIterator;->next(I)I
-HSPLandroid/icu/impl/RuleCharacterIterator;->setPos(Landroid/icu/impl/RuleCharacterIterator$Position;)V
-HSPLandroid/icu/impl/RuleCharacterIterator;->skipIgnored(I)V
-HSPLandroid/icu/impl/SimpleCache;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/impl/SimpleCache;->put(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLandroid/icu/impl/SimpleFormatterImpl;->compileToStringMinMaxArguments(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;II)Ljava/lang/String;
-HSPLandroid/icu/impl/SimpleFormatterImpl;->format(Ljava/lang/String;[Ljava/lang/CharSequence;Ljava/lang/StringBuilder;Ljava/lang/String;Z[I)Ljava/lang/StringBuilder;
-HSPLandroid/icu/impl/SimpleFormatterImpl;->formatPrefixSuffix(Ljava/lang/String;Ljava/text/Format$Field;IILandroid/icu/impl/FormattedStringBuilder;)I
-HSPLandroid/icu/impl/SimpleFormatterImpl;->formatRawPattern(Ljava/lang/String;II[Ljava/lang/CharSequence;)Ljava/lang/String;
-HSPLandroid/icu/impl/SimpleFormatterImpl;->getArgumentLimit(Ljava/lang/String;)I
-HSPLandroid/icu/impl/SoftCache;->getInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/impl/StandardPlural;->fromString(Ljava/lang/CharSequence;)Landroid/icu/impl/StandardPlural;
-HSPLandroid/icu/impl/StandardPlural;->orNullFromString(Ljava/lang/CharSequence;)Landroid/icu/impl/StandardPlural;
-HSPLandroid/icu/impl/StandardPlural;->orOtherFromString(Ljava/lang/CharSequence;)Landroid/icu/impl/StandardPlural;
-HSPLandroid/icu/impl/StandardPlural;->values()[Landroid/icu/impl/StandardPlural;
-HSPLandroid/icu/impl/StaticUnicodeSets;->chooseFrom(Ljava/lang/String;Landroid/icu/impl/StaticUnicodeSets$Key;)Landroid/icu/impl/StaticUnicodeSets$Key;
-HSPLandroid/icu/impl/StaticUnicodeSets;->chooseFrom(Ljava/lang/String;Landroid/icu/impl/StaticUnicodeSets$Key;Landroid/icu/impl/StaticUnicodeSets$Key;)Landroid/icu/impl/StaticUnicodeSets$Key;
-HSPLandroid/icu/impl/StaticUnicodeSets;->get(Landroid/icu/impl/StaticUnicodeSets$Key;)Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/impl/StringSegment;-><init>(Ljava/lang/String;Z)V
-HSPLandroid/icu/impl/StringSegment;->adjustOffset(I)V
-HSPLandroid/icu/impl/StringSegment;->charAt(I)C
-HSPLandroid/icu/impl/StringSegment;->codePointsEqual(IIZ)Z
-HSPLandroid/icu/impl/StringSegment;->getCodePoint()I
-HSPLandroid/icu/impl/StringSegment;->getCommonPrefixLength(Ljava/lang/CharSequence;)I
-HSPLandroid/icu/impl/StringSegment;->getOffset()I
-HSPLandroid/icu/impl/StringSegment;->getPrefixLengthInternal(Ljava/lang/CharSequence;Z)I
-HSPLandroid/icu/impl/StringSegment;->length()I
-HSPLandroid/icu/impl/StringSegment;->startsWith(Landroid/icu/text/UnicodeSet;)Z
-HSPLandroid/icu/impl/StringSegment;->startsWith(Ljava/lang/CharSequence;)Z
-HSPLandroid/icu/impl/TextTrieMap$Node;-><init>(Landroid/icu/impl/TextTrieMap;)V
-HSPLandroid/icu/impl/TextTrieMap;-><init>(Z)V
-HSPLandroid/icu/impl/TimeZoneNamesFactoryImpl;->getTimeZoneNames(Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneNames;
-HSPLandroid/icu/impl/TimeZoneNamesImpl$MZMapEntry;-><init>(Ljava/lang/String;JJ)V
-HSPLandroid/icu/impl/TimeZoneNamesImpl$MZMapEntry;->from()J
-HSPLandroid/icu/impl/TimeZoneNamesImpl$MZMapEntry;->mzID()Ljava/lang/String;
-HSPLandroid/icu/impl/TimeZoneNamesImpl$MZMapEntry;->to()J
-HSPLandroid/icu/impl/TimeZoneNamesImpl$TZ2MZsCache;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/impl/TimeZoneNamesImpl$TZ2MZsCache;->createInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
-HSPLandroid/icu/impl/TimeZoneNamesImpl$TZ2MZsCache;->parseDate(Ljava/lang/String;)J
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNames;-><init>([Ljava/lang/String;)V
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNames;->createMetaZoneAndPutInCache(Ljava/util/Map;[Ljava/lang/String;Ljava/lang/String;)Landroid/icu/impl/TimeZoneNamesImpl$ZNames;
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNames;->createTimeZoneAndPutInCache(Ljava/util/Map;[Ljava/lang/String;Ljava/lang/String;)Landroid/icu/impl/TimeZoneNamesImpl$ZNames;
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNames;->getName(Landroid/icu/text/TimeZoneNames$NameType;)Ljava/lang/String;
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNames;->getNameTypeIndex(Landroid/icu/text/TimeZoneNames$NameType;)I
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->-$$Nest$mgetNames(Landroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;)[Ljava/lang/String;
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;-><init>()V
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;-><init>(Landroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader-IA;)V
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->getNames()[Ljava/lang/String;
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->loadMetaZone(Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)V
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->loadNames(Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)V
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->loadTimeZone(Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)V
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->nameTypeIndexFromKey(Landroid/icu/impl/UResource$Key;)Landroid/icu/impl/TimeZoneNamesImpl$ZNames$NameTypeIndex;
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->put(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->setNameIfEmpty(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-HSPLandroid/icu/impl/TimeZoneNamesImpl;-><init>(Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/impl/TimeZoneNamesImpl;->_getAvailableMetaZoneIDs(Ljava/lang/String;)Ljava/util/Set;
-HSPLandroid/icu/impl/TimeZoneNamesImpl;->_getMetaZoneID(Ljava/lang/String;J)Ljava/lang/String;
-HSPLandroid/icu/impl/TimeZoneNamesImpl;->getAvailableMetaZoneIDs(Ljava/lang/String;)Ljava/util/Set;
-HSPLandroid/icu/impl/TimeZoneNamesImpl;->getDefaultExemplarLocationName(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/TimeZoneNamesImpl;->getMetaZoneDisplayName(Ljava/lang/String;Landroid/icu/text/TimeZoneNames$NameType;)Ljava/lang/String;
-HSPLandroid/icu/impl/TimeZoneNamesImpl;->getMetaZoneID(Ljava/lang/String;J)Ljava/lang/String;
-HSPLandroid/icu/impl/TimeZoneNamesImpl;->getTimeZoneDisplayName(Ljava/lang/String;Landroid/icu/text/TimeZoneNames$NameType;)Ljava/lang/String;
-HSPLandroid/icu/impl/TimeZoneNamesImpl;->initialize(Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/impl/TimeZoneNamesImpl;->loadMetaZoneNames(Ljava/lang/String;)Landroid/icu/impl/TimeZoneNamesImpl$ZNames;
-HSPLandroid/icu/impl/TimeZoneNamesImpl;->loadStrings(Ljava/lang/String;)V
-HSPLandroid/icu/impl/TimeZoneNamesImpl;->loadTimeZoneNames(Ljava/lang/String;)Landroid/icu/impl/TimeZoneNamesImpl$ZNames;
-HSPLandroid/icu/impl/Trie2;-><init>()V
-HSPLandroid/icu/impl/Trie2;->createFromSerialized(Ljava/nio/ByteBuffer;)Landroid/icu/impl/Trie2;
-HSPLandroid/icu/impl/Trie2Writable;-><init>(II)V
-HSPLandroid/icu/impl/Trie2Writable;->allocDataBlock(I)I
-HSPLandroid/icu/impl/Trie2Writable;->fillBlock(IIIIIZ)V
-HSPLandroid/icu/impl/Trie2Writable;->getDataBlock(IZ)I
-HSPLandroid/icu/impl/Trie2Writable;->getIndex2Block(IZ)I
-HSPLandroid/icu/impl/Trie2Writable;->init(II)V
-HSPLandroid/icu/impl/Trie2Writable;->isWritableBlock(I)Z
-HSPLandroid/icu/impl/Trie2Writable;->set(II)Landroid/icu/impl/Trie2Writable;
-HSPLandroid/icu/impl/Trie2Writable;->set(IZI)Landroid/icu/impl/Trie2Writable;
-HSPLandroid/icu/impl/Trie2Writable;->setIndex2Entry(II)V
-HSPLandroid/icu/impl/Trie2Writable;->setRange(IIIZ)Landroid/icu/impl/Trie2Writable;
-HSPLandroid/icu/impl/Trie2Writable;->writeBlock(II)V
-HSPLandroid/icu/impl/Trie2_16;->get(I)I
-HSPLandroid/icu/impl/Trie2_32;->get(I)I
-HSPLandroid/icu/impl/Trie2_32;->getFromU16SingleLead(C)I
-HSPLandroid/icu/impl/UBiDiProps;->getClass(I)I
-HSPLandroid/icu/impl/UBiDiProps;->getClassFromProps(I)I
-HSPLandroid/icu/impl/UCaseProps;->fold(II)I
-HSPLandroid/icu/impl/UCaseProps;->getCaseLocale(Ljava/lang/String;)I
-HSPLandroid/icu/impl/UCaseProps;->getCaseLocale(Ljava/util/Locale;)I
-HSPLandroid/icu/impl/UCaseProps;->getDelta(I)I
-HSPLandroid/icu/impl/UCaseProps;->isUpperOrTitleFromProps(I)Z
-HSPLandroid/icu/impl/UCaseProps;->propsHasException(I)Z
-HSPLandroid/icu/impl/UCaseProps;->toUpperOrTitle(ILandroid/icu/impl/UCaseProps$ContextIterator;Ljava/lang/Appendable;IZ)I
-HSPLandroid/icu/impl/UCharacterProperty$IntProperty;->getValue(I)I
-HSPLandroid/icu/impl/UCharacterProperty;->digit(I)I
-HSPLandroid/icu/impl/UCharacterProperty;->getIntPropertyValue(II)I
-HSPLandroid/icu/impl/UCharacterProperty;->getNumericTypeValue(I)I
-HSPLandroid/icu/impl/UCharacterProperty;->getProperty(I)I
-HSPLandroid/icu/impl/UCharacterProperty;->getType(I)I
-HSPLandroid/icu/impl/UPropertyAliases;->asciiToLowercase(I)I
-HSPLandroid/icu/impl/UPropertyAliases;->containsName(Landroid/icu/util/BytesTrie;Ljava/lang/CharSequence;)Z
-HSPLandroid/icu/impl/UPropertyAliases;->findProperty(I)I
-HSPLandroid/icu/impl/UPropertyAliases;->getPropertyOrValueEnum(ILjava/lang/CharSequence;)I
-HSPLandroid/icu/impl/UPropertyAliases;->getPropertyValueEnumNoThrow(ILjava/lang/CharSequence;)I
-HSPLandroid/icu/impl/UResource$Key;-><init>()V
-HSPLandroid/icu/impl/UResource$Key;->charAt(I)C
-HSPLandroid/icu/impl/UResource$Key;->contentEquals(Ljava/lang/CharSequence;)Z
-HSPLandroid/icu/impl/UResource$Key;->endsWith(Ljava/lang/CharSequence;)Z
-HSPLandroid/icu/impl/UResource$Key;->internalSubString(II)Ljava/lang/String;
-HSPLandroid/icu/impl/UResource$Key;->length()I
-HSPLandroid/icu/impl/UResource$Key;->regionMatches(ILjava/lang/CharSequence;I)Z
-HSPLandroid/icu/impl/UResource$Key;->setBytes([BI)Landroid/icu/impl/UResource$Key;
-HSPLandroid/icu/impl/UResource$Key;->setString(Ljava/lang/String;)Landroid/icu/impl/UResource$Key;
-HSPLandroid/icu/impl/UResource$Key;->toString()Ljava/lang/String;
-HSPLandroid/icu/impl/UResource$Sink;-><init>()V
-HSPLandroid/icu/impl/UResource$Value;-><init>()V
-HSPLandroid/icu/impl/UResource$Value;->toString()Ljava/lang/String;
-HSPLandroid/icu/impl/Utility;->addExact(II)I
-HSPLandroid/icu/impl/Utility;->appendTo(Ljava/lang/CharSequence;Ljava/lang/Appendable;)Ljava/lang/Appendable;+]Ljava/lang/Appendable;Ljava/lang/StringBuffer;
-HSPLandroid/icu/impl/Utility;->arrayEquals([BLjava/lang/Object;)Z
-HSPLandroid/icu/impl/Utility;->arrayRegionMatches([BI[BII)Z
-HSPLandroid/icu/impl/Utility;->sameObjects(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLandroid/icu/impl/Utility;->shouldAlwaysBeEscaped(I)Z
-HSPLandroid/icu/impl/ZoneMeta$SystemTimeZoneCache;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/impl/ZoneMeta$SystemTimeZoneCache;->createInstance(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/impl/OlsonTimeZone;
-HSPLandroid/icu/impl/ZoneMeta;->findCLDRCanonicalID(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/ZoneMeta;->getCanonicalCLDRID(Landroid/icu/util/TimeZone;)Ljava/lang/String;
-HSPLandroid/icu/impl/ZoneMeta;->getCanonicalCLDRID(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/ZoneMeta;->getSystemTimeZone(Ljava/lang/String;)Landroid/icu/impl/OlsonTimeZone;
-HSPLandroid/icu/impl/ZoneMeta;->getZoneIDs()[Ljava/lang/String;
-HSPLandroid/icu/impl/ZoneMeta;->getZoneIndex(Ljava/lang/String;)I
-HSPLandroid/icu/impl/ZoneMeta;->openOlsonResource(Landroid/icu/util/UResourceBundle;Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/impl/breakiter/DictionaryBreakEngine$DequeI;->clone()Ljava/lang/Object;
-HSPLandroid/icu/impl/breakiter/DictionaryBreakEngine$DequeI;->removeAllElements()V
-HSPLandroid/icu/impl/coll/Collation;-><clinit>()V
-HSPLandroid/icu/impl/coll/Collation;->ceFromCE32(I)J
-HSPLandroid/icu/impl/coll/Collation;->ceFromSimpleCE32(I)J
-HSPLandroid/icu/impl/coll/Collation;->indexFromCE32(I)I
-HSPLandroid/icu/impl/coll/Collation;->isSpecialCE32(I)Z
-HSPLandroid/icu/impl/coll/Collation;->makeCE(J)J
-HSPLandroid/icu/impl/coll/Collation;->makeCE32FromTagAndIndex(II)I
-HSPLandroid/icu/impl/coll/Collation;->tagFromCE32(I)I
-HSPLandroid/icu/impl/coll/CollationBuilder$BundleImporter;-><init>()V
-HSPLandroid/icu/impl/coll/CollationBuilder;-><init>(Landroid/icu/impl/coll/CollationTailoring;)V
-HSPLandroid/icu/impl/coll/CollationBuilder;->parseAndBuild(Ljava/lang/String;)Landroid/icu/impl/coll/CollationTailoring;
-HSPLandroid/icu/impl/coll/CollationCompare;->compareUpToQuaternary(Landroid/icu/impl/coll/CollationIterator;Landroid/icu/impl/coll/CollationIterator;Landroid/icu/impl/coll/CollationSettings;)I
-HSPLandroid/icu/impl/coll/CollationData;->getCE32(I)I
-HSPLandroid/icu/impl/coll/CollationData;->getCE32FromContexts(I)I
-HSPLandroid/icu/impl/coll/CollationData;->isUnsafeBackward(IZ)Z
-HSPLandroid/icu/impl/coll/CollationDataBuilder;-><init>()V
-HSPLandroid/icu/impl/coll/CollationDataBuilder;->hasMappings()Z
-HSPLandroid/icu/impl/coll/CollationDataBuilder;->initForTailoring(Landroid/icu/impl/coll/CollationData;)V
-HSPLandroid/icu/impl/coll/CollationFCD;->hasTccc(I)Z
-HSPLandroid/icu/impl/coll/CollationFastLatin;->compareUTF16([C[CILjava/lang/CharSequence;Ljava/lang/CharSequence;I)I
-HSPLandroid/icu/impl/coll/CollationFastLatin;->getOptions(Landroid/icu/impl/coll/CollationData;Landroid/icu/impl/coll/CollationSettings;[C)I
-HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;-><init>()V
-HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;->append(J)V
-HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;->appendUnsafe(J)V
-HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;->ensureAppendCapacity(I)V
-HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;->get(I)J
-HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;->incLength()V
-HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;->set(IJ)J
-HSPLandroid/icu/impl/coll/CollationIterator;-><clinit>()V
-HSPLandroid/icu/impl/coll/CollationIterator;-><init>(Landroid/icu/impl/coll/CollationData;)V
-HSPLandroid/icu/impl/coll/CollationIterator;->appendCEsFromCE32(Landroid/icu/impl/coll/CollationData;IIZ)V
-HSPLandroid/icu/impl/coll/CollationIterator;->clearCEs()V
-HSPLandroid/icu/impl/coll/CollationIterator;->clearCEsIfNoneRemaining()V
-HSPLandroid/icu/impl/coll/CollationIterator;->makeCodePointAndCE32Pair(II)J
-HSPLandroid/icu/impl/coll/CollationIterator;->nextCE()J
-HSPLandroid/icu/impl/coll/CollationIterator;->nextCE32FromContraction(Landroid/icu/impl/coll/CollationData;ILjava/lang/CharSequence;III)I
-HSPLandroid/icu/impl/coll/CollationIterator;->nextCEFromCE32(Landroid/icu/impl/coll/CollationData;II)J
-HSPLandroid/icu/impl/coll/CollationIterator;->reset()V
-HSPLandroid/icu/impl/coll/CollationIterator;->reset(Z)V
-HSPLandroid/icu/impl/coll/CollationKeys$SortKeyByteSink;-><init>([B)V
-HSPLandroid/icu/impl/coll/CollationKeys$SortKeyByteSink;->Append(I)V
-HSPLandroid/icu/impl/coll/CollationKeys$SortKeyByteSink;->NumberOfBytesAppended()I
-HSPLandroid/icu/impl/coll/CollationKeys;->getSortKeyLevel(II)Landroid/icu/impl/coll/CollationKeys$SortKeyLevel;
-HSPLandroid/icu/impl/coll/CollationKeys;->writeSortKeyUpToQuaternary(Landroid/icu/impl/coll/CollationIterator;[ZLandroid/icu/impl/coll/CollationSettings;Landroid/icu/impl/coll/CollationKeys$SortKeyByteSink;ILandroid/icu/impl/coll/CollationKeys$LevelCallback;Z)V
-HSPLandroid/icu/impl/coll/CollationLoader;->findWithFallback(Landroid/icu/util/UResourceBundle;Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/impl/coll/CollationLoader;->loadTailoring(Landroid/icu/util/ULocale;Landroid/icu/util/Output;)Landroid/icu/impl/coll/CollationTailoring;
-HSPLandroid/icu/impl/coll/CollationRoot;->getRoot()Landroid/icu/impl/coll/CollationTailoring;
-HSPLandroid/icu/impl/coll/CollationRootElements;-><init>([J)V
-HSPLandroid/icu/impl/coll/CollationRuleParser$Sink;-><init>()V
-HSPLandroid/icu/impl/coll/CollationRuleParser;-><init>(Landroid/icu/impl/coll/CollationData;)V
-HSPLandroid/icu/impl/coll/CollationRuleParser;->getOnOffValue(Ljava/lang/String;)I
-HSPLandroid/icu/impl/coll/CollationRuleParser;->isSyntaxChar(I)Z
-HSPLandroid/icu/impl/coll/CollationRuleParser;->parse(Ljava/lang/String;)V
-HSPLandroid/icu/impl/coll/CollationRuleParser;->parse(Ljava/lang/String;Landroid/icu/impl/coll/CollationSettings;)V
-HSPLandroid/icu/impl/coll/CollationRuleParser;->parseSetting()V
-HSPLandroid/icu/impl/coll/CollationRuleParser;->readWords(ILjava/lang/StringBuilder;)I
-HSPLandroid/icu/impl/coll/CollationRuleParser;->setImporter(Landroid/icu/impl/coll/CollationRuleParser$Importer;)V
-HSPLandroid/icu/impl/coll/CollationRuleParser;->setSink(Landroid/icu/impl/coll/CollationRuleParser$Sink;)V
-HSPLandroid/icu/impl/coll/CollationRuleParser;->skipWhiteSpace(I)I
-HSPLandroid/icu/impl/coll/CollationSettings;->clone()Landroid/icu/impl/coll/CollationSettings;
-HSPLandroid/icu/impl/coll/CollationSettings;->clone()Landroid/icu/impl/coll/SharedObject;
-HSPLandroid/icu/impl/coll/CollationSettings;->dontCheckFCD()Z
-HSPLandroid/icu/impl/coll/CollationSettings;->getFlag(I)Z
-HSPLandroid/icu/impl/coll/CollationSettings;->getStrength()I
-HSPLandroid/icu/impl/coll/CollationSettings;->getStrength(I)I
-HSPLandroid/icu/impl/coll/CollationSettings;->getTertiaryMask(I)I
-HSPLandroid/icu/impl/coll/CollationSettings;->hasReordering()Z
-HSPLandroid/icu/impl/coll/CollationSettings;->isNumeric()Z
-HSPLandroid/icu/impl/coll/CollationSettings;->isTertiaryWithCaseBits(I)Z
-HSPLandroid/icu/impl/coll/CollationSettings;->setFlag(IZ)V
-HSPLandroid/icu/impl/coll/CollationSettings;->setStrength(I)V
-HSPLandroid/icu/impl/coll/CollationTailoring;-><init>(Landroid/icu/impl/coll/SharedObject$Reference;)V
-HSPLandroid/icu/impl/coll/CollationTailoring;->getRules()Ljava/lang/String;
-HSPLandroid/icu/impl/coll/CollationTailoring;->setRules(Ljava/lang/String;)V
-HSPLandroid/icu/impl/coll/CollationTailoring;->setVersion(II)V
-HSPLandroid/icu/impl/coll/FCDUTF16CollationIterator;-><clinit>()V
-HSPLandroid/icu/impl/coll/FCDUTF16CollationIterator;-><init>(Landroid/icu/impl/coll/CollationData;)V
-HSPLandroid/icu/impl/coll/FCDUTF16CollationIterator;->handleNextCE32()J
-HSPLandroid/icu/impl/coll/FCDUTF16CollationIterator;->setText(ZLjava/lang/CharSequence;I)V
-HSPLandroid/icu/impl/coll/SharedObject$Reference;->clear()V
-HSPLandroid/icu/impl/coll/SharedObject$Reference;->clone()Landroid/icu/impl/coll/SharedObject$Reference;
-HSPLandroid/icu/impl/coll/SharedObject$Reference;->copyOnWrite()Landroid/icu/impl/coll/SharedObject;
-HSPLandroid/icu/impl/coll/SharedObject$Reference;->finalize()V
-HSPLandroid/icu/impl/coll/SharedObject$Reference;->readOnly()Landroid/icu/impl/coll/SharedObject;
-HSPLandroid/icu/impl/coll/SharedObject;->addRef()V
-HSPLandroid/icu/impl/coll/SharedObject;->clone()Landroid/icu/impl/coll/SharedObject;
-HSPLandroid/icu/impl/coll/SharedObject;->getRefCount()I
-HSPLandroid/icu/impl/coll/SharedObject;->removeRef()V
-HSPLandroid/icu/impl/coll/UTF16CollationIterator;-><clinit>()V
-HSPLandroid/icu/impl/coll/UTF16CollationIterator;-><init>(Landroid/icu/impl/coll/CollationData;)V
-HSPLandroid/icu/impl/coll/UTF16CollationIterator;->handleNextCE32()J
-HSPLandroid/icu/impl/coll/UTF16CollationIterator;->nextCodePoint()I
-HSPLandroid/icu/impl/coll/UTF16CollationIterator;->setText(ZLjava/lang/CharSequence;I)V
-HSPLandroid/icu/impl/coll/UVector32;-><init>()V
-HSPLandroid/icu/impl/coll/UVector32;->addElement(I)V
-HSPLandroid/icu/impl/coll/UVector32;->ensureAppendCapacity()V
-HSPLandroid/icu/impl/coll/UVector64;-><init>()V
-HSPLandroid/icu/impl/locale/AsciiUtil;->caseIgnoreMatch(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLandroid/icu/impl/locale/AsciiUtil;->isAlpha(C)Z
-HSPLandroid/icu/impl/locale/AsciiUtil;->isAlphaString(Ljava/lang/String;)Z
-HSPLandroid/icu/impl/locale/AsciiUtil;->toLower(C)C
-HSPLandroid/icu/impl/locale/AsciiUtil;->toLowerString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/locale/AsciiUtil;->toTitleString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/locale/AsciiUtil;->toUpper(C)C
-HSPLandroid/icu/impl/locale/AsciiUtil;->toUpperString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/impl/locale/BaseLocale$Cache;->createObject(Landroid/icu/impl/locale/BaseLocale$Key;)Landroid/icu/impl/locale/BaseLocale;
-HSPLandroid/icu/impl/locale/BaseLocale$Cache;->createObject(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/impl/locale/BaseLocale$Cache;->normalizeKey(Landroid/icu/impl/locale/BaseLocale$Key;)Landroid/icu/impl/locale/BaseLocale$Key;
-HSPLandroid/icu/impl/locale/BaseLocale$Cache;->normalizeKey(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/impl/locale/BaseLocale$Key;->-$$Nest$fget_lang(Landroid/icu/impl/locale/BaseLocale$Key;)Ljava/lang/String;
-HSPLandroid/icu/impl/locale/BaseLocale$Key;->-$$Nest$fget_regn(Landroid/icu/impl/locale/BaseLocale$Key;)Ljava/lang/String;
-HSPLandroid/icu/impl/locale/BaseLocale$Key;->-$$Nest$fget_scrt(Landroid/icu/impl/locale/BaseLocale$Key;)Ljava/lang/String;
-HSPLandroid/icu/impl/locale/BaseLocale$Key;->-$$Nest$fget_vart(Landroid/icu/impl/locale/BaseLocale$Key;)Ljava/lang/String;
-HSPLandroid/icu/impl/locale/BaseLocale$Key;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/icu/impl/locale/BaseLocale$Key;->equals(Ljava/lang/Object;)Z
-HSPLandroid/icu/impl/locale/BaseLocale$Key;->hashCode()I+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/icu/impl/locale/BaseLocale$Key;->normalize(Landroid/icu/impl/locale/BaseLocale$Key;)Landroid/icu/impl/locale/BaseLocale$Key;
-HSPLandroid/icu/impl/locale/BaseLocale;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/icu/impl/locale/BaseLocale;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/icu/impl/locale/BaseLocale-IA;)V
-HSPLandroid/icu/impl/locale/BaseLocale;->getInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/icu/impl/locale/BaseLocale;
-HSPLandroid/icu/impl/locale/BaseLocale;->getLanguage()Ljava/lang/String;
-HSPLandroid/icu/impl/locale/BaseLocale;->getRegion()Ljava/lang/String;
-HSPLandroid/icu/impl/locale/BaseLocale;->getScript()Ljava/lang/String;
-HSPLandroid/icu/impl/locale/BaseLocale;->getVariant()Ljava/lang/String;
-HSPLandroid/icu/impl/locale/InternalLocaleBuilder;-><init>()V
-HSPLandroid/icu/impl/locale/InternalLocaleBuilder;->getBaseLocale()Landroid/icu/impl/locale/BaseLocale;
-HSPLandroid/icu/impl/locale/InternalLocaleBuilder;->getLocaleExtensions()Landroid/icu/impl/locale/LocaleExtensions;
-HSPLandroid/icu/impl/locale/InternalLocaleBuilder;->setLanguage(Ljava/lang/String;)Landroid/icu/impl/locale/InternalLocaleBuilder;
-HSPLandroid/icu/impl/locale/InternalLocaleBuilder;->setRegion(Ljava/lang/String;)Landroid/icu/impl/locale/InternalLocaleBuilder;
-HSPLandroid/icu/impl/locale/LanguageTag;->isLanguage(Ljava/lang/String;)Z
-HSPLandroid/icu/impl/locale/LanguageTag;->isRegion(Ljava/lang/String;)Z
-HSPLandroid/icu/impl/locale/LocaleExtensions;->getKeys()Ljava/util/Set;
-HSPLandroid/icu/impl/locale/LocaleObjectCache$CacheEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-HSPLandroid/icu/impl/locale/LocaleObjectCache$CacheEntry;->getKey()Ljava/lang/Object;
-HSPLandroid/icu/impl/locale/LocaleObjectCache;->cleanStaleEntries()V
-HSPLandroid/icu/impl/locale/LocaleObjectCache;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/impl/number/AdoptingModifierStore$1;-><clinit>()V
-HSPLandroid/icu/impl/number/AdoptingModifierStore;-><init>(Landroid/icu/impl/number/Modifier;Landroid/icu/impl/number/Modifier;Landroid/icu/impl/number/Modifier;Landroid/icu/impl/number/Modifier;)V
-HSPLandroid/icu/impl/number/AdoptingModifierStore;->getModifierWithoutPlural(Landroid/icu/impl/number/Modifier$Signum;)Landroid/icu/impl/number/Modifier;+]Landroid/icu/impl/number/Modifier$Signum;Landroid/icu/impl/number/Modifier$Signum;
-HSPLandroid/icu/impl/number/AffixUtils;->containsType(Ljava/lang/CharSequence;I)Z
-HSPLandroid/icu/impl/number/AffixUtils;->escape(Ljava/lang/CharSequence;)Ljava/lang/String;
-HSPLandroid/icu/impl/number/AffixUtils;->getFieldForType(I)Landroid/icu/text/NumberFormat$Field;
-HSPLandroid/icu/impl/number/AffixUtils;->getOffset(J)I
-HSPLandroid/icu/impl/number/AffixUtils;->getState(J)I
-HSPLandroid/icu/impl/number/AffixUtils;->getType(J)I
-HSPLandroid/icu/impl/number/AffixUtils;->getTypeOrCp(J)I
-HSPLandroid/icu/impl/number/AffixUtils;->hasCurrencySymbols(Ljava/lang/CharSequence;)Z
-HSPLandroid/icu/impl/number/AffixUtils;->hasNext(JLjava/lang/CharSequence;)Z
-HSPLandroid/icu/impl/number/AffixUtils;->iterateWithConsumer(Ljava/lang/CharSequence;Landroid/icu/impl/number/AffixUtils$TokenConsumer;)V
-HSPLandroid/icu/impl/number/AffixUtils;->makeTag(IIII)J
-HSPLandroid/icu/impl/number/AffixUtils;->nextToken(JLjava/lang/CharSequence;)J
-HSPLandroid/icu/impl/number/AffixUtils;->unescape(Ljava/lang/CharSequence;Landroid/icu/impl/FormattedStringBuilder;ILandroid/icu/impl/number/AffixUtils$SymbolProvider;Landroid/icu/text/NumberFormat$Field;)I
-HSPLandroid/icu/impl/number/AffixUtils;->unescapedCount(Ljava/lang/CharSequence;ZLandroid/icu/impl/number/AffixUtils$SymbolProvider;)I
-HSPLandroid/icu/impl/number/ConstantAffixModifier;->apply(Landroid/icu/impl/FormattedStringBuilder;II)I+]Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/impl/FormattedStringBuilder;
-HSPLandroid/icu/impl/number/ConstantMultiFieldModifier;-><init>(Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/impl/FormattedStringBuilder;ZZ)V
-HSPLandroid/icu/impl/number/ConstantMultiFieldModifier;-><init>(Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/impl/FormattedStringBuilder;ZZLandroid/icu/impl/number/Modifier$Parameters;)V
-HSPLandroid/icu/impl/number/ConstantMultiFieldModifier;->apply(Landroid/icu/impl/FormattedStringBuilder;II)I+]Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/impl/FormattedStringBuilder;
-HSPLandroid/icu/impl/number/ConstantMultiFieldModifier;->getPrefixLength()I
-HSPLandroid/icu/impl/number/CurrencySpacingEnabledModifier;->applyCurrencySpacing(Landroid/icu/impl/FormattedStringBuilder;IIIILandroid/icu/text/DecimalFormatSymbols;)I
-HSPLandroid/icu/impl/number/CurrencySpacingEnabledModifier;->applyCurrencySpacingAffix(Landroid/icu/impl/FormattedStringBuilder;IBLandroid/icu/text/DecimalFormatSymbols;)I
-HSPLandroid/icu/impl/number/CustomSymbolCurrency;->resolve(Landroid/icu/util/Currency;Landroid/icu/util/ULocale;Landroid/icu/text/DecimalFormatSymbols;)Landroid/icu/util/Currency;+]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/DecimalFormatSymbols;]Landroid/icu/util/Currency;Landroid/icu/util/Currency;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;-><init>()V
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->_clear()Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->_copyFrom(Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->clear()Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->clone()Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->copyFrom(Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getCompactStyle()Landroid/icu/text/CompactDecimalFormat$CompactStyle;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getCurrency()Landroid/icu/util/Currency;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getCurrencyAsDecimal()Z
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getCurrencyPluralInfo()Landroid/icu/text/CurrencyPluralInfo;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getCurrencyUsage()Landroid/icu/util/Currency$CurrencyUsage;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getDecimalPatternMatchRequired()Z
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getDecimalSeparatorAlwaysShown()Z
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getExponentSignAlwaysShown()Z
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getFormatWidth()I
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getGroupingSize()I
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getGroupingUsed()Z
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getMagnitudeMultiplier()I
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getMathContext()Ljava/math/MathContext;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getMaximumFractionDigits()I
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getMaximumIntegerDigits()I
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getMaximumSignificantDigits()I
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getMinimumExponentDigits()I
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getMinimumFractionDigits()I
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getMinimumGroupingDigits()I
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getMinimumIntegerDigits()I
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getMinimumSignificantDigits()I
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getMultiplier()Ljava/math/BigDecimal;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getNegativePrefix()Ljava/lang/String;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getNegativePrefixPattern()Ljava/lang/String;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getNegativeSuffix()Ljava/lang/String;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getNegativeSuffixPattern()Ljava/lang/String;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getPadPosition()Landroid/icu/impl/number/Padder$PadPosition;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getPadString()Ljava/lang/String;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getParseCaseSensitive()Z
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getParseIntegerOnly()Z
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getParseMode()Landroid/icu/impl/number/DecimalFormatProperties$ParseMode;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getParseNoExponent()Z
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getParseToBigDecimal()Z
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getPluralRules()Landroid/icu/text/PluralRules;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getPositivePrefix()Ljava/lang/String;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getPositivePrefixPattern()Ljava/lang/String;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getPositiveSuffix()Ljava/lang/String;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getPositiveSuffixPattern()Ljava/lang/String;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getRoundingIncrement()Ljava/math/BigDecimal;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getRoundingMode()Ljava/math/RoundingMode;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getSecondaryGroupingSize()I
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->getSignAlwaysShown()Z
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setCurrency(Landroid/icu/util/Currency;)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setCurrencyAsDecimal(Z)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setDecimalSeparatorAlwaysShown(Z)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setExponentSignAlwaysShown(Z)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setFormatWidth(I)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setGroupingSize(I)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setGroupingUsed(Z)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setMagnitudeMultiplier(I)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setMathContext(Ljava/math/MathContext;)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setMaximumFractionDigits(I)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setMaximumIntegerDigits(I)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setMaximumSignificantDigits(I)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setMinimumExponentDigits(I)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setMinimumFractionDigits(I)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setMinimumIntegerDigits(I)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setMinimumSignificantDigits(I)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setNegativePrefixPattern(Ljava/lang/String;)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setNegativeSuffixPattern(Ljava/lang/String;)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setPadPosition(Landroid/icu/impl/number/Padder$PadPosition;)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setPadString(Ljava/lang/String;)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setParseIntegerOnly(Z)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setParseMode(Landroid/icu/impl/number/DecimalFormatProperties$ParseMode;)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setPositivePrefixPattern(Ljava/lang/String;)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setPositiveSuffixPattern(Ljava/lang/String;)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setRoundingIncrement(Ljava/math/BigDecimal;)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setRoundingMode(Ljava/math/RoundingMode;)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalFormatProperties;->setSecondaryGroupingSize(I)Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;-><init>()V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToBigDecimal(Ljava/math/BigDecimal;)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToBigInteger(Ljava/math/BigInteger;)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToDoubleFast(D)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToLong(J)V+]Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->adjustMagnitude(I)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->appendDigit(BIZ)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->applyMaxInteger(I)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->convertToAccurateDouble()V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->copyFrom(Landroid/icu/impl/number/DecimalQuantity;)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->fitsInLong()Z
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->getDigit(I)B+]Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->getLowerDisplayMagnitude()I
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->getMagnitude()I
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->getPluralOperand(Landroid/icu/text/PluralRules$Operand;)D
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->getStandardPlural(Landroid/icu/text/PluralRules;)Landroid/icu/impl/StandardPlural;
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->getUpperDisplayMagnitude()I
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->isInfinite()Z
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->isNaN()Z
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->isNegative()Z
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->isZeroish()Z
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->negate()V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->populateUFieldPosition(Ljava/text/FieldPosition;)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->roundToMagnitude(ILjava/math/MathContext;)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->roundToMagnitude(ILjava/math/MathContext;Z)V+]Ljava/math/MathContext;Ljava/math/MathContext;]Ljava/math/RoundingMode;Ljava/math/RoundingMode;]Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->safeSubtract(II)I
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->setMinFraction(I)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->setMinInteger(I)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->setToBigDecimal(Ljava/math/BigDecimal;)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->setToDouble(D)V+]Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->setToInt(I)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->setToLong(J)V
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->signum()Landroid/icu/impl/number/Modifier$Signum;+]Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->toLong(Z)J
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;-><init>()V
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;-><init>(D)V+]Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;-><init>(I)V
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;-><init>(J)V
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;-><init>(Ljava/lang/Number;)V
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;-><init>(Ljava/math/BigDecimal;)V
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->compact()V
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->copyBcdFrom(Landroid/icu/impl/number/DecimalQuantity;)V
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->createCopy()Landroid/icu/impl/number/DecimalQuantity;
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->fromExponentString(Ljava/lang/String;)Landroid/icu/impl/number/DecimalQuantity;
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->getDigitPos(I)B
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->getVisibleFractionCount(Ljava/lang/String;)I
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->readIntToBcd(I)V
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->readLongToBcd(J)V
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->setBcdToZero()V
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->setDigitPos(IB)V
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->shiftLeft(I)V
-HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->shiftRight(I)V
-HSPLandroid/icu/impl/number/Grouper;-><init>(SSS)V
-HSPLandroid/icu/impl/number/Grouper;->forProperties(Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/impl/number/Grouper;
-HSPLandroid/icu/impl/number/Grouper;->getInstance(SSS)Landroid/icu/impl/number/Grouper;
-HSPLandroid/icu/impl/number/Grouper;->getMinGroupingForLocale(Landroid/icu/util/ULocale;)S
-HSPLandroid/icu/impl/number/Grouper;->getPrimary()S
-HSPLandroid/icu/impl/number/Grouper;->getSecondary()S
-HSPLandroid/icu/impl/number/Grouper;->groupAtPosition(ILandroid/icu/impl/number/DecimalQuantity;)Z
-HSPLandroid/icu/impl/number/Grouper;->withLocaleData(Landroid/icu/util/ULocale;Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;)Landroid/icu/impl/number/Grouper;
-HSPLandroid/icu/impl/number/LongNameHandler$PluralTableSink;->put(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/impl/number/LongNameHandler;->processQuantity(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps;
-HSPLandroid/icu/impl/number/LongNameHandler;->simpleFormatsToModifiers([Ljava/lang/String;Landroid/icu/text/NumberFormat$Field;)V
-HSPLandroid/icu/impl/number/MacroProps;-><init>()V
-HSPLandroid/icu/impl/number/MacroProps;->fallback(Landroid/icu/impl/number/MacroProps;)V
-HSPLandroid/icu/impl/number/MicroProps;-><init>(Z)V
-HSPLandroid/icu/impl/number/MicroProps;->clone()Ljava/lang/Object;
-HSPLandroid/icu/impl/number/MicroProps;->processQuantity(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps;+]Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/MicroProps;
-HSPLandroid/icu/impl/number/Modifier$Signum;->values()[Landroid/icu/impl/number/Modifier$Signum;
-HSPLandroid/icu/impl/number/MultiplierFormatHandler;-><init>(Landroid/icu/number/Scale;Landroid/icu/impl/number/MicroPropsGenerator;)V
-HSPLandroid/icu/impl/number/MultiplierFormatHandler;->processQuantity(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps;
-HSPLandroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;-><init>(Landroid/icu/impl/number/AdoptingModifierStore;Landroid/icu/text/PluralRules;)V
-HSPLandroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;->addToChain(Landroid/icu/impl/number/MicroPropsGenerator;)Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;
-HSPLandroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;->applyToMicros(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/DecimalQuantity;)V+]Landroid/icu/impl/number/AdoptingModifierStore;Landroid/icu/impl/number/AdoptingModifierStore;]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;->processQuantity(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps;+]Landroid/icu/impl/number/MicroPropsGenerator;Landroid/icu/impl/number/MicroProps;]Landroid/icu/number/Precision;Landroid/icu/number/Precision$FractionRounderImpl;]Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;
-HSPLandroid/icu/impl/number/MutablePatternModifier;-><init>(Z)V
-HSPLandroid/icu/impl/number/MutablePatternModifier;->addToChain(Landroid/icu/impl/number/MicroPropsGenerator;)Landroid/icu/impl/number/MicroPropsGenerator;
-HSPLandroid/icu/impl/number/MutablePatternModifier;->apply(Landroid/icu/impl/FormattedStringBuilder;II)I
-HSPLandroid/icu/impl/number/MutablePatternModifier;->createConstantModifier(Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/impl/FormattedStringBuilder;)Landroid/icu/impl/number/ConstantMultiFieldModifier;
-HSPLandroid/icu/impl/number/MutablePatternModifier;->createImmutable()Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;
-HSPLandroid/icu/impl/number/MutablePatternModifier;->getPrefixLength()I
-HSPLandroid/icu/impl/number/MutablePatternModifier;->getSymbol(I)Ljava/lang/CharSequence;
-HSPLandroid/icu/impl/number/MutablePatternModifier;->insertPrefix(Landroid/icu/impl/FormattedStringBuilder;I)I
-HSPLandroid/icu/impl/number/MutablePatternModifier;->insertSuffix(Landroid/icu/impl/FormattedStringBuilder;I)I
-HSPLandroid/icu/impl/number/MutablePatternModifier;->needsPlurals()Z
-HSPLandroid/icu/impl/number/MutablePatternModifier;->prepareAffix(Z)V
-HSPLandroid/icu/impl/number/MutablePatternModifier;->processQuantity(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps;
-HSPLandroid/icu/impl/number/MutablePatternModifier;->setNumberProperties(Landroid/icu/impl/number/Modifier$Signum;Landroid/icu/impl/StandardPlural;)V
-HSPLandroid/icu/impl/number/MutablePatternModifier;->setPatternAttributes(Landroid/icu/number/NumberFormatter$SignDisplay;ZZ)V
-HSPLandroid/icu/impl/number/MutablePatternModifier;->setPatternInfo(Landroid/icu/impl/number/AffixPatternProvider;Landroid/icu/text/NumberFormat$Field;)V
-HSPLandroid/icu/impl/number/MutablePatternModifier;->setSymbols(Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/util/Currency;Landroid/icu/number/NumberFormatter$UnitWidth;Landroid/icu/text/PluralRules;)V
-HSPLandroid/icu/impl/number/Padder;->isValid()Z
-HSPLandroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;-><init>(Ljava/lang/String;)V
-HSPLandroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;-><init>(Ljava/lang/String;Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo-IA;)V
-HSPLandroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;->getEndpoints(I)J
-HSPLandroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;->getString(I)Ljava/lang/String;
-HSPLandroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;-><init>()V
-HSPLandroid/icu/impl/number/PatternStringParser$ParserState;-><init>(Ljava/lang/String;)V
-HSPLandroid/icu/impl/number/PatternStringParser$ParserState;->next()I
-HSPLandroid/icu/impl/number/PatternStringParser$ParserState;->peek()I
-HSPLandroid/icu/impl/number/PatternStringParser;->consumeAffix(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)J
-HSPLandroid/icu/impl/number/PatternStringParser;->consumeExponent(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V
-HSPLandroid/icu/impl/number/PatternStringParser;->consumeFormat(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V
-HSPLandroid/icu/impl/number/PatternStringParser;->consumeFractionFormat(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V
-HSPLandroid/icu/impl/number/PatternStringParser;->consumeIntegerFormat(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V+]Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParserState;
-HSPLandroid/icu/impl/number/PatternStringParser;->consumeLiteral(Landroid/icu/impl/number/PatternStringParser$ParserState;)V
-HSPLandroid/icu/impl/number/PatternStringParser;->consumePadding(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;Landroid/icu/impl/number/Padder$PadPosition;)V
-HSPLandroid/icu/impl/number/PatternStringParser;->consumePattern(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;)V
-HSPLandroid/icu/impl/number/PatternStringParser;->consumeSubpattern(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V
-HSPLandroid/icu/impl/number/PatternStringParser;->parseToExistingProperties(Ljava/lang/String;Landroid/icu/impl/number/DecimalFormatProperties;I)V
-HSPLandroid/icu/impl/number/PatternStringParser;->parseToExistingPropertiesImpl(Ljava/lang/String;Landroid/icu/impl/number/DecimalFormatProperties;I)V
-HSPLandroid/icu/impl/number/PatternStringParser;->parseToPatternInfo(Ljava/lang/String;)Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;
-HSPLandroid/icu/impl/number/PatternStringParser;->patternInfoToProperties(Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;I)V
-HSPLandroid/icu/impl/number/PatternStringUtils$PatternSignType;-><clinit>()V
-HSPLandroid/icu/impl/number/PatternStringUtils$PatternSignType;-><init>(Ljava/lang/String;I)V
-HSPLandroid/icu/impl/number/PatternStringUtils$PatternSignType;->values()[Landroid/icu/impl/number/PatternStringUtils$PatternSignType;
-HSPLandroid/icu/impl/number/PatternStringUtils;->patternInfoToStringBuilder(Landroid/icu/impl/number/AffixPatternProvider;ZLandroid/icu/impl/number/PatternStringUtils$PatternSignType;ZLandroid/icu/impl/StandardPlural;ZLjava/lang/StringBuilder;)V
-HSPLandroid/icu/impl/number/PatternStringUtils;->propertiesToPatternString(Landroid/icu/impl/number/DecimalFormatProperties;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/icu/impl/number/AffixPatternProvider;Landroid/icu/impl/number/PropertiesAffixPatternProvider;]Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/PatternStringUtils;->resolveSignDisplay(Landroid/icu/number/NumberFormatter$SignDisplay;Landroid/icu/impl/number/Modifier$Signum;)Landroid/icu/impl/number/PatternStringUtils$PatternSignType;
-HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;-><init>(Landroid/icu/impl/number/DecimalFormatProperties;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->charAt(II)C
-HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->containsSymbolType(I)Z
-HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->currencyAsDecimal()Z
-HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->forProperties(Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/impl/number/AffixPatternProvider;
-HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->getString(I)Ljava/lang/String;
-HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->hasBody()Z
-HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->hasCurrencySign()Z
-HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->hasNegativeSubpattern()Z+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->length(I)I
-HSPLandroid/icu/impl/number/RoundingUtils;->getMathContextOr34Digits(Landroid/icu/impl/number/DecimalFormatProperties;)Ljava/math/MathContext;
-HSPLandroid/icu/impl/number/RoundingUtils;->getMathContextOrUnlimited(Landroid/icu/impl/number/DecimalFormatProperties;)Ljava/math/MathContext;
-HSPLandroid/icu/impl/number/RoundingUtils;->getRoundingDirection(ZZIILjava/lang/Object;)Z
-HSPLandroid/icu/impl/number/RoundingUtils;->roundsAtMidpoint(I)Z
-HSPLandroid/icu/impl/number/RoundingUtils;->scaleFromProperties(Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/number/Scale;
-HSPLandroid/icu/impl/number/SimpleModifier;-><init>(Ljava/lang/String;Ljava/text/Format$Field;ZLandroid/icu/impl/number/Modifier$Parameters;)V
-HSPLandroid/icu/impl/number/SimpleModifier;->apply(Landroid/icu/impl/FormattedStringBuilder;II)I
-HSPLandroid/icu/impl/number/parse/AffixMatcher$1;->compare(Landroid/icu/impl/number/parse/AffixMatcher;Landroid/icu/impl/number/parse/AffixMatcher;)I
-HSPLandroid/icu/impl/number/parse/AffixMatcher$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/icu/impl/number/parse/AffixMatcher;-><init>(Landroid/icu/impl/number/parse/AffixPatternMatcher;Landroid/icu/impl/number/parse/AffixPatternMatcher;I)V
-HSPLandroid/icu/impl/number/parse/AffixMatcher;->createMatchers(Landroid/icu/impl/number/AffixPatternProvider;Landroid/icu/impl/number/parse/NumberParserImpl;Landroid/icu/impl/number/parse/AffixTokenMatcherFactory;Landroid/icu/impl/number/parse/IgnorablesMatcher;I)V
-HSPLandroid/icu/impl/number/parse/AffixMatcher;->getInstance(Landroid/icu/impl/number/parse/AffixPatternMatcher;Landroid/icu/impl/number/parse/AffixPatternMatcher;I)Landroid/icu/impl/number/parse/AffixMatcher;
-HSPLandroid/icu/impl/number/parse/AffixMatcher;->isInteresting(Landroid/icu/impl/number/AffixPatternProvider;Landroid/icu/impl/number/parse/IgnorablesMatcher;I)Z
-HSPLandroid/icu/impl/number/parse/AffixMatcher;->length(Landroid/icu/impl/number/parse/AffixPatternMatcher;)I
-HSPLandroid/icu/impl/number/parse/AffixMatcher;->match(Landroid/icu/impl/StringSegment;Landroid/icu/impl/number/parse/ParsedNumber;)Z
-HSPLandroid/icu/impl/number/parse/AffixMatcher;->matched(Landroid/icu/impl/number/parse/AffixPatternMatcher;Ljava/lang/String;)Z
-HSPLandroid/icu/impl/number/parse/AffixMatcher;->postProcess(Landroid/icu/impl/number/parse/ParsedNumber;)V
-HSPLandroid/icu/impl/number/parse/AffixMatcher;->smokeTest(Landroid/icu/impl/StringSegment;)Z
-HSPLandroid/icu/impl/number/parse/AffixPatternMatcher;-><init>(Ljava/lang/String;)V
-HSPLandroid/icu/impl/number/parse/AffixPatternMatcher;->consumeToken(I)V
-HSPLandroid/icu/impl/number/parse/AffixPatternMatcher;->equals(Ljava/lang/Object;)Z
-HSPLandroid/icu/impl/number/parse/AffixPatternMatcher;->fromAffixPattern(Ljava/lang/String;Landroid/icu/impl/number/parse/AffixTokenMatcherFactory;I)Landroid/icu/impl/number/parse/AffixPatternMatcher;
-HSPLandroid/icu/impl/number/parse/AffixPatternMatcher;->getPattern()Ljava/lang/String;
-HSPLandroid/icu/impl/number/parse/AffixTokenMatcherFactory;-><init>()V
-HSPLandroid/icu/impl/number/parse/AffixTokenMatcherFactory;->minusSign()Landroid/icu/impl/number/parse/MinusSignMatcher;
-HSPLandroid/icu/impl/number/parse/DecimalMatcher;-><init>(Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/Grouper;I)V
-HSPLandroid/icu/impl/number/parse/DecimalMatcher;->getInstance(Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/Grouper;I)Landroid/icu/impl/number/parse/DecimalMatcher;
-HSPLandroid/icu/impl/number/parse/DecimalMatcher;->match(Landroid/icu/impl/StringSegment;Landroid/icu/impl/number/parse/ParsedNumber;)Z
-HSPLandroid/icu/impl/number/parse/DecimalMatcher;->match(Landroid/icu/impl/StringSegment;Landroid/icu/impl/number/parse/ParsedNumber;I)Z+]Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/number/parse/ParsedNumber;Landroid/icu/impl/number/parse/ParsedNumber;]Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;]Landroid/icu/impl/StringSegment;Landroid/icu/impl/StringSegment;
-HSPLandroid/icu/impl/number/parse/DecimalMatcher;->postProcess(Landroid/icu/impl/number/parse/ParsedNumber;)V
-HSPLandroid/icu/impl/number/parse/DecimalMatcher;->smokeTest(Landroid/icu/impl/StringSegment;)Z
-HSPLandroid/icu/impl/number/parse/DecimalMatcher;->validateGroup(IIZ)Z
-HSPLandroid/icu/impl/number/parse/IgnorablesMatcher;->getInstance(I)Landroid/icu/impl/number/parse/IgnorablesMatcher;
-HSPLandroid/icu/impl/number/parse/InfinityMatcher;->getInstance(Landroid/icu/text/DecimalFormatSymbols;)Landroid/icu/impl/number/parse/InfinityMatcher;
-HSPLandroid/icu/impl/number/parse/MinusSignMatcher;->getInstance(Landroid/icu/text/DecimalFormatSymbols;Z)Landroid/icu/impl/number/parse/MinusSignMatcher;
-HSPLandroid/icu/impl/number/parse/NanMatcher;->getInstance(Landroid/icu/text/DecimalFormatSymbols;I)Landroid/icu/impl/number/parse/NanMatcher;
-HSPLandroid/icu/impl/number/parse/NumberParserImpl;-><init>(I)V
-HSPLandroid/icu/impl/number/parse/NumberParserImpl;->addMatcher(Landroid/icu/impl/number/parse/NumberParseMatcher;)V
-HSPLandroid/icu/impl/number/parse/NumberParserImpl;->addMatchers(Ljava/util/Collection;)V
-HSPLandroid/icu/impl/number/parse/NumberParserImpl;->createParserFromProperties(Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/text/DecimalFormatSymbols;Z)Landroid/icu/impl/number/parse/NumberParserImpl;+]Landroid/icu/impl/number/Grouper;Landroid/icu/impl/number/Grouper;]Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/DecimalFormatSymbols;]Landroid/icu/impl/number/AffixPatternProvider;Landroid/icu/impl/number/PropertiesAffixPatternProvider;]Landroid/icu/impl/number/parse/NumberParserImpl;Landroid/icu/impl/number/parse/NumberParserImpl;]Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/impl/number/DecimalFormatProperties;
-HSPLandroid/icu/impl/number/parse/NumberParserImpl;->freeze()V
-HSPLandroid/icu/impl/number/parse/NumberParserImpl;->getParseFlags()I
-HSPLandroid/icu/impl/number/parse/NumberParserImpl;->parse(Ljava/lang/String;IZLandroid/icu/impl/number/parse/ParsedNumber;)V
-HSPLandroid/icu/impl/number/parse/NumberParserImpl;->parseGreedy(Landroid/icu/impl/StringSegment;Landroid/icu/impl/number/parse/ParsedNumber;)V
-HSPLandroid/icu/impl/number/parse/ParsedNumber;-><init>()V
-HSPLandroid/icu/impl/number/parse/ParsedNumber;->clear()V
-HSPLandroid/icu/impl/number/parse/ParsedNumber;->getNumber(I)Ljava/lang/Number;
-HSPLandroid/icu/impl/number/parse/ParsedNumber;->postProcess()V
-HSPLandroid/icu/impl/number/parse/ParsedNumber;->seenNumber()Z
-HSPLandroid/icu/impl/number/parse/ParsedNumber;->setCharsConsumed(Landroid/icu/impl/StringSegment;)V
-HSPLandroid/icu/impl/number/parse/ParsedNumber;->success()Z
-HSPLandroid/icu/impl/number/parse/RequireAffixValidator;-><init>()V
-HSPLandroid/icu/impl/number/parse/RequireAffixValidator;->postProcess(Landroid/icu/impl/number/parse/ParsedNumber;)V
-HSPLandroid/icu/impl/number/parse/RequireNumberValidator;-><init>()V
-HSPLandroid/icu/impl/number/parse/RequireNumberValidator;->postProcess(Landroid/icu/impl/number/parse/ParsedNumber;)V
-HSPLandroid/icu/impl/number/parse/ScientificMatcher;-><init>(Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/Grouper;)V
-HSPLandroid/icu/impl/number/parse/ScientificMatcher;->getInstance(Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/Grouper;)Landroid/icu/impl/number/parse/ScientificMatcher;
-HSPLandroid/icu/impl/number/parse/ScientificMatcher;->minusSignSet()Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/impl/number/parse/ScientificMatcher;->plusSignSet()Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/impl/number/parse/ScientificMatcher;->postProcess(Landroid/icu/impl/number/parse/ParsedNumber;)V
-HSPLandroid/icu/impl/number/parse/ScientificMatcher;->smokeTest(Landroid/icu/impl/StringSegment;)Z
-HSPLandroid/icu/impl/number/parse/SeriesMatcher;-><init>()V
-HSPLandroid/icu/impl/number/parse/SeriesMatcher;->addMatcher(Landroid/icu/impl/number/parse/NumberParseMatcher;)V
-HSPLandroid/icu/impl/number/parse/SeriesMatcher;->freeze()V
-HSPLandroid/icu/impl/number/parse/SeriesMatcher;->smokeTest(Landroid/icu/impl/StringSegment;)Z
-HSPLandroid/icu/impl/number/parse/SymbolMatcher;->postProcess(Landroid/icu/impl/number/parse/ParsedNumber;)V
-HSPLandroid/icu/impl/number/parse/SymbolMatcher;->smokeTest(Landroid/icu/impl/StringSegment;)Z
-HSPLandroid/icu/impl/number/parse/ValidationMatcher;-><init>()V
-HSPLandroid/icu/impl/number/parse/ValidationMatcher;->smokeTest(Landroid/icu/impl/StringSegment;)Z
-HSPLandroid/icu/impl/number/range/StandardPluralRanges$PluralRangeSetsDataSink;-><clinit>()V
-HSPLandroid/icu/impl/number/range/StandardPluralRanges$PluralRangeSetsDataSink;-><init>(Ljava/util/Map;)V
-HSPLandroid/icu/impl/number/range/StandardPluralRanges$PluralRangeSetsDataSink;->put(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/impl/number/range/StandardPluralRanges$PluralRangesDataSink;-><init>(Landroid/icu/impl/number/range/StandardPluralRanges;)V
-HSPLandroid/icu/impl/number/range/StandardPluralRanges$PluralRangesDataSink;->put(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/impl/number/range/StandardPluralRanges;-><init>()V
-HSPLandroid/icu/impl/number/range/StandardPluralRanges;->addPluralRange(Landroid/icu/impl/StandardPlural;Landroid/icu/impl/StandardPlural;Landroid/icu/impl/StandardPlural;)V
-HSPLandroid/icu/impl/number/range/StandardPluralRanges;->forSet(Ljava/lang/String;)Landroid/icu/impl/number/range/StandardPluralRanges;
-HSPLandroid/icu/impl/number/range/StandardPluralRanges;->getLanguageToSet()Ljava/util/Map;
-HSPLandroid/icu/impl/number/range/StandardPluralRanges;->getPluralRangesData(Ljava/lang/String;Landroid/icu/impl/number/range/StandardPluralRanges;)V
-HSPLandroid/icu/impl/number/range/StandardPluralRanges;->getSetForLocale(Landroid/icu/util/ULocale;)Ljava/lang/String;
-HSPLandroid/icu/impl/number/range/StandardPluralRanges;->setCapacity(I)V
-HSPLandroid/icu/lang/UCharacter;->codePointAt(Ljava/lang/CharSequence;I)I
-HSPLandroid/icu/lang/UCharacter;->digit(I)I
-HSPLandroid/icu/lang/UCharacter;->foldCase(II)I
-HSPLandroid/icu/lang/UCharacter;->foldCase(IZ)I
-HSPLandroid/icu/lang/UCharacter;->getPropertyValueEnumNoThrow(ILjava/lang/CharSequence;)I
-HSPLandroid/icu/lang/UCharacter;->getType(I)I
-HSPLandroid/icu/lang/UCharacter;->isDigit(I)Z
-HSPLandroid/icu/lang/UCharacter;->isLowerCase(I)Z
-HSPLandroid/icu/lang/UScript$ScriptMetadata;->getScriptProps(I)I
-HSPLandroid/icu/lang/UScript;->getCodeFromName(Ljava/lang/String;)I
-HSPLandroid/icu/lang/UScript;->isRightToLeft(I)Z
-HSPLandroid/icu/number/CurrencyPrecision;->withCurrency(Landroid/icu/util/Currency;)Landroid/icu/number/Precision;
-HSPLandroid/icu/number/FormattedNumber;->appendTo(Ljava/lang/Appendable;)Ljava/lang/Appendable;
-HSPLandroid/icu/number/FractionPrecision;-><init>()V
-HSPLandroid/icu/number/IntegerWidth;-><init>(II)V
-HSPLandroid/icu/number/IntegerWidth;->truncateAt(I)Landroid/icu/number/IntegerWidth;
-HSPLandroid/icu/number/IntegerWidth;->zeroFillTo(I)Landroid/icu/number/IntegerWidth;
-HSPLandroid/icu/number/LocalizedNumberFormatter;-><init>(Landroid/icu/number/NumberFormatterSettings;ILjava/lang/Object;)V
-HSPLandroid/icu/number/LocalizedNumberFormatter;->computeCompiled()Z+]Ljava/util/concurrent/atomic/AtomicLongFieldUpdater;Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;]Landroid/icu/number/LocalizedNumberFormatter;Landroid/icu/number/LocalizedNumberFormatter;]Ljava/lang/Long;Ljava/lang/Long;
-HSPLandroid/icu/number/LocalizedNumberFormatter;->create(ILjava/lang/Object;)Landroid/icu/number/LocalizedNumberFormatter;
-HSPLandroid/icu/number/LocalizedNumberFormatter;->create(ILjava/lang/Object;)Landroid/icu/number/NumberFormatterSettings;
-HSPLandroid/icu/number/LocalizedNumberFormatter;->format(D)Landroid/icu/number/FormattedNumber;
-HSPLandroid/icu/number/LocalizedNumberFormatter;->format(J)Landroid/icu/number/FormattedNumber;
-HSPLandroid/icu/number/LocalizedNumberFormatter;->format(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/number/FormattedNumber;
-HSPLandroid/icu/number/LocalizedNumberFormatter;->formatImpl(Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;)Landroid/icu/impl/number/MicroProps;+]Landroid/icu/number/NumberFormatterImpl;Landroid/icu/number/NumberFormatterImpl;
-HSPLandroid/icu/number/LocalizedNumberFormatter;->getAffixImpl(ZZ)Ljava/lang/String;
-HSPLandroid/icu/number/NumberFormatter;->fromDecimalFormat(Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/number/UnlocalizedNumberFormatter;
-HSPLandroid/icu/number/NumberFormatter;->with()Landroid/icu/number/UnlocalizedNumberFormatter;
-HSPLandroid/icu/number/NumberFormatterImpl;-><init>(Landroid/icu/impl/number/MacroProps;)V
-HSPLandroid/icu/number/NumberFormatterImpl;->format(Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;)Landroid/icu/impl/number/MicroProps;+]Landroid/icu/number/NumberFormatterImpl;Landroid/icu/number/NumberFormatterImpl;
-HSPLandroid/icu/number/NumberFormatterImpl;->formatStatic(Landroid/icu/impl/number/MacroProps;Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;)Landroid/icu/impl/number/MicroProps;
-HSPLandroid/icu/number/NumberFormatterImpl;->getPrefixSuffix(BLandroid/icu/impl/StandardPlural;Landroid/icu/impl/FormattedStringBuilder;)I
-HSPLandroid/icu/number/NumberFormatterImpl;->getPrefixSuffixImpl(Landroid/icu/impl/number/MicroPropsGenerator;BLandroid/icu/impl/FormattedStringBuilder;)I
-HSPLandroid/icu/number/NumberFormatterImpl;->getPrefixSuffixStatic(Landroid/icu/impl/number/MacroProps;BLandroid/icu/impl/StandardPlural;Landroid/icu/impl/FormattedStringBuilder;)I
-HSPLandroid/icu/number/NumberFormatterImpl;->macrosToMicroGenerator(Landroid/icu/impl/number/MacroProps;Landroid/icu/impl/number/MicroProps;Z)Landroid/icu/impl/number/MicroPropsGenerator;+]Landroid/icu/impl/number/MutablePatternModifier;Landroid/icu/impl/number/MutablePatternModifier;]Landroid/icu/text/NumberingSystem;Landroid/icu/text/NumberingSystem;]Landroid/icu/impl/number/Grouper;Landroid/icu/impl/number/Grouper;]Landroid/icu/impl/number/AffixPatternProvider;Landroid/icu/impl/number/PropertiesAffixPatternProvider;]Landroid/icu/number/Precision;Landroid/icu/number/Precision$FractionRounderImpl;
-HSPLandroid/icu/number/NumberFormatterImpl;->preProcess(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps;+]Landroid/icu/impl/number/MicroPropsGenerator;Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/number/NumberFormatterImpl;->preProcessUnsafe(Landroid/icu/impl/number/MacroProps;Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps;
-HSPLandroid/icu/number/NumberFormatterImpl;->unitIsBaseUnit(Landroid/icu/util/MeasureUnit;)Z
-HSPLandroid/icu/number/NumberFormatterImpl;->unitIsCurrency(Landroid/icu/util/MeasureUnit;)Z
-HSPLandroid/icu/number/NumberFormatterImpl;->unitIsPercent(Landroid/icu/util/MeasureUnit;)Z
-HSPLandroid/icu/number/NumberFormatterImpl;->unitIsPermille(Landroid/icu/util/MeasureUnit;)Z
-HSPLandroid/icu/number/NumberFormatterImpl;->writeAffixes(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/FormattedStringBuilder;II)I+]Landroid/icu/impl/number/Padder;Landroid/icu/impl/number/Padder;]Landroid/icu/impl/number/Modifier;Landroid/icu/impl/number/ConstantMultiFieldModifier;,Landroid/icu/impl/number/ConstantAffixModifier;
-HSPLandroid/icu/number/NumberFormatterImpl;->writeFractionDigits(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;I)I+]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/number/NumberFormatterImpl;->writeIntegerDigits(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;I)I+]Landroid/icu/impl/number/Grouper;Landroid/icu/impl/number/Grouper;]Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/DecimalFormatSymbols;]Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/impl/FormattedStringBuilder;]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/number/NumberFormatterImpl;->writeNumber(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;I)I+]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/number/NumberFormatterSettings;-><init>(Landroid/icu/number/NumberFormatterSettings;ILjava/lang/Object;)V
-HSPLandroid/icu/number/NumberFormatterSettings;->macros(Landroid/icu/impl/number/MacroProps;)Landroid/icu/number/NumberFormatterSettings;
-HSPLandroid/icu/number/NumberFormatterSettings;->perUnit(Landroid/icu/util/MeasureUnit;)Landroid/icu/number/NumberFormatterSettings;
-HSPLandroid/icu/number/NumberFormatterSettings;->resolve()Landroid/icu/impl/number/MacroProps;
-HSPLandroid/icu/number/NumberFormatterSettings;->unit(Landroid/icu/util/MeasureUnit;)Landroid/icu/number/NumberFormatterSettings;
-HSPLandroid/icu/number/NumberFormatterSettings;->unitWidth(Landroid/icu/number/NumberFormatter$UnitWidth;)Landroid/icu/number/NumberFormatterSettings;
-HSPLandroid/icu/number/NumberPropertyMapper;->create(Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/number/UnlocalizedNumberFormatter;
-HSPLandroid/icu/number/NumberPropertyMapper;->oldToNew(Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/impl/number/MacroProps;+]Ljava/math/MathContext;Ljava/math/MathContext;]Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/DecimalFormatSymbols;]Landroid/icu/impl/number/AffixPatternProvider;Landroid/icu/impl/number/PropertiesAffixPatternProvider;]Landroid/icu/number/Precision;Landroid/icu/number/Precision$FractionRounderImpl;,Landroid/icu/number/Precision$CurrencyRounderImpl;]Landroid/icu/number/IntegerWidth;Landroid/icu/number/IntegerWidth;]Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/impl/number/DecimalFormatProperties;]Landroid/icu/number/CurrencyPrecision;Landroid/icu/number/Precision$CurrencyRounderImpl;]Landroid/icu/util/Currency;Landroid/icu/util/Currency;
-HSPLandroid/icu/number/Precision$FractionRounderImpl;-><init>(II)V
-HSPLandroid/icu/number/Precision$FractionRounderImpl;->apply(Landroid/icu/impl/number/DecimalQuantity;)V+]Landroid/icu/number/Precision$FractionRounderImpl;Landroid/icu/number/Precision$FractionRounderImpl;]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/number/Precision$FractionRounderImpl;->createCopy()Landroid/icu/number/Precision$FractionRounderImpl;
-HSPLandroid/icu/number/Precision$FractionRounderImpl;->createCopy()Landroid/icu/number/Precision;
-HSPLandroid/icu/number/Precision;->-$$Nest$smgetDisplayMagnitudeFraction(I)I
-HSPLandroid/icu/number/Precision;->-$$Nest$smgetRoundingMagnitudeFraction(I)I
-HSPLandroid/icu/number/Precision;-><init>()V
-HSPLandroid/icu/number/Precision;->constructCurrency(Landroid/icu/util/Currency$CurrencyUsage;)Landroid/icu/number/CurrencyPrecision;
-HSPLandroid/icu/number/Precision;->constructFraction(II)Landroid/icu/number/FractionPrecision;
-HSPLandroid/icu/number/Precision;->constructFromCurrency(Landroid/icu/number/CurrencyPrecision;Landroid/icu/util/Currency;)Landroid/icu/number/Precision;
-HSPLandroid/icu/number/Precision;->getDisplayMagnitudeFraction(I)I
-HSPLandroid/icu/number/Precision;->getRoundingMagnitudeFraction(I)I
-HSPLandroid/icu/number/Precision;->setResolvedMinFraction(Landroid/icu/impl/number/DecimalQuantity;I)V+]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/number/Precision;->withLocaleData(Landroid/icu/util/Currency;)Landroid/icu/number/Precision;
-HSPLandroid/icu/number/Precision;->withMode(Ljava/math/MathContext;)Landroid/icu/number/Precision;
-HSPLandroid/icu/number/Scale;->applyTo(Landroid/icu/impl/number/DecimalQuantity;)V
-HSPLandroid/icu/number/Scale;->powerOfTen(I)Landroid/icu/number/Scale;
-HSPLandroid/icu/number/Scale;->withMathContext(Ljava/math/MathContext;)Landroid/icu/number/Scale;
-HSPLandroid/icu/number/UnlocalizedNumberFormatter;-><init>(Landroid/icu/number/NumberFormatterSettings;ILjava/lang/Object;)V
-HSPLandroid/icu/number/UnlocalizedNumberFormatter;->create(ILjava/lang/Object;)Landroid/icu/number/NumberFormatterSettings;
-HSPLandroid/icu/number/UnlocalizedNumberFormatter;->create(ILjava/lang/Object;)Landroid/icu/number/UnlocalizedNumberFormatter;
-HSPLandroid/icu/number/UnlocalizedNumberFormatter;->locale(Landroid/icu/util/ULocale;)Landroid/icu/number/LocalizedNumberFormatter;
-HSPLandroid/icu/platform/AndroidDataFiles;->generateIcuDataPath()Ljava/lang/String;
-HSPLandroid/icu/platform/AndroidDataFiles;->getI18nModuleFile(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/platform/AndroidDataFiles;->getI18nModuleIcuFile(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/platform/AndroidDataFiles;->getTimeZoneModuleFile(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/platform/AndroidDataFiles;->getTimeZoneModuleIcuFile(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/text/Bidi;-><init>(II)V
-HSPLandroid/icu/text/Bidi;->DirPropFlag(B)I
-HSPLandroid/icu/text/Bidi;->GetParaLevelAt(I)B
-HSPLandroid/icu/text/Bidi;->directionFromFlags()B
-HSPLandroid/icu/text/Bidi;->getCustomizedClass(I)I
-HSPLandroid/icu/text/Bidi;->getDirProps()V
-HSPLandroid/icu/text/Bidi;->getDirPropsMemory(I)V
-HSPLandroid/icu/text/Bidi;->getLevelsMemory(I)V
-HSPLandroid/icu/text/Bidi;->getMemory(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Class;ZI)Ljava/lang/Object;
-HSPLandroid/icu/text/Bidi;->resolveExplicitLevels()B
-HSPLandroid/icu/text/Bidi;->setPara([CB[B)V
-HSPLandroid/icu/text/Bidi;->verifyRange(III)V
-HSPLandroid/icu/text/BreakIterator$BreakIteratorCache;-><init>(Landroid/icu/util/ULocale;Landroid/icu/text/BreakIterator;)V
-HSPLandroid/icu/text/BreakIterator$BreakIteratorCache;->createBreakInstance()Landroid/icu/text/BreakIterator;
-HSPLandroid/icu/text/BreakIterator$BreakIteratorCache;->getLocale()Landroid/icu/util/ULocale;
-HSPLandroid/icu/text/BreakIterator;-><init>()V
-HSPLandroid/icu/text/BreakIterator;->clone()Ljava/lang/Object;
-HSPLandroid/icu/text/BreakIterator;->getBreakInstance(Landroid/icu/util/ULocale;I)Landroid/icu/text/BreakIterator;
-HSPLandroid/icu/text/BreakIterator;->getSentenceInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/BreakIterator;
-HSPLandroid/icu/text/BreakIterator;->getShim()Landroid/icu/text/BreakIterator$BreakIteratorServiceShim;
-HSPLandroid/icu/text/BreakIterator;->getWordInstance(Ljava/util/Locale;)Landroid/icu/text/BreakIterator;
-HSPLandroid/icu/text/BreakIterator;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/BreakIterator;->setText(Ljava/lang/String;)V
-HSPLandroid/icu/text/BreakIteratorFactory;->createBreakInstance(Landroid/icu/util/ULocale;I)Landroid/icu/text/BreakIterator;
-HSPLandroid/icu/text/BreakIteratorFactory;->createBreakIterator(Landroid/icu/util/ULocale;I)Landroid/icu/text/BreakIterator;
-HSPLandroid/icu/text/CaseMap$Upper;->apply(Ljava/util/Locale;Ljava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)Ljava/lang/Appendable;
-HSPLandroid/icu/text/CaseMap;->getCaseLocale(Ljava/util/Locale;)I
-HSPLandroid/icu/text/CaseMap;->toUpper()Landroid/icu/text/CaseMap$Upper;
-HSPLandroid/icu/text/CollationKey;-><init>(Ljava/lang/String;Landroid/icu/text/RawCollationKey;)V
-HSPLandroid/icu/text/CollationKey;->getLength()I
-HSPLandroid/icu/text/CollationKey;->toByteArray()[B
-HSPLandroid/icu/text/Collator$ServiceShim;-><init>()V
-HSPLandroid/icu/text/Collator;-><init>()V
-HSPLandroid/icu/text/Collator;->clone()Ljava/lang/Object;
-HSPLandroid/icu/text/Collator;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/Collator;+]Landroid/icu/text/Collator$ServiceShim;Landroid/icu/text/CollatorServiceShim;]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;
-HSPLandroid/icu/text/Collator;->getInstance(Ljava/util/Locale;)Landroid/icu/text/Collator;
-HSPLandroid/icu/text/Collator;->getShim()Landroid/icu/text/Collator$ServiceShim;
-HSPLandroid/icu/text/CollatorServiceShim$CService$1CollatorFactory;->handleCreate(Landroid/icu/util/ULocale;ILandroid/icu/impl/ICUService;)Ljava/lang/Object;
-HSPLandroid/icu/text/CollatorServiceShim$CService;->validateFallbackLocale()Ljava/lang/String;
-HSPLandroid/icu/text/CollatorServiceShim;-><init>()V
-HSPLandroid/icu/text/CollatorServiceShim;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/Collator;
-HSPLandroid/icu/text/CollatorServiceShim;->makeInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/Collator;
-HSPLandroid/icu/text/ConstrainedFieldPosition;-><init>()V+]Landroid/icu/text/ConstrainedFieldPosition;Landroid/icu/text/ConstrainedFieldPosition;
-HSPLandroid/icu/text/ConstrainedFieldPosition;->constrainField(Ljava/text/Format$Field;)V
-HSPLandroid/icu/text/ConstrainedFieldPosition;->getField()Ljava/text/Format$Field;
-HSPLandroid/icu/text/ConstrainedFieldPosition;->getFieldValue()Ljava/lang/Object;
-HSPLandroid/icu/text/ConstrainedFieldPosition;->getLimit()I
-HSPLandroid/icu/text/ConstrainedFieldPosition;->getStart()I
-HSPLandroid/icu/text/ConstrainedFieldPosition;->matchesField(Ljava/text/Format$Field;Ljava/lang/Object;)Z+]Landroid/icu/text/ConstrainedFieldPosition$ConstraintType;Landroid/icu/text/ConstrainedFieldPosition$ConstraintType;
-HSPLandroid/icu/text/ConstrainedFieldPosition;->reset()V
-HSPLandroid/icu/text/ConstrainedFieldPosition;->setState(Ljava/text/Format$Field;Ljava/lang/Object;II)V
-HSPLandroid/icu/text/CurrencyDisplayNames;-><init>()V
-HSPLandroid/icu/text/CurrencyDisplayNames;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/CurrencyDisplayNames;
-HSPLandroid/icu/text/CurrencyMetaInfo$CurrencyDigits;-><init>(II)V
-HSPLandroid/icu/text/CurrencyMetaInfo$CurrencyFilter;-><init>(Ljava/lang/String;Ljava/lang/String;JJZ)V
-HSPLandroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->onDate(Ljava/util/Date;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-HSPLandroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->onRegion(Ljava/lang/String;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-HSPLandroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->withDate(Ljava/util/Date;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-HSPLandroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->withRegion(Ljava/lang/String;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-HSPLandroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->withTender()Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-HSPLandroid/icu/text/CurrencyMetaInfo;->getInstance()Landroid/icu/text/CurrencyMetaInfo;
-HSPLandroid/icu/text/DateFormat;-><init>()V
-HSPLandroid/icu/text/DateFormat;->format(Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-HSPLandroid/icu/text/DateFormat;->format(Ljava/util/Date;)Ljava/lang/String;
-HSPLandroid/icu/text/DateFormat;->format(Ljava/util/Date;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-HSPLandroid/icu/text/DateFormat;->get(IILandroid/icu/util/ULocale;Landroid/icu/util/Calendar;)Landroid/icu/text/DateFormat;
-HSPLandroid/icu/text/DateFormat;->getCalendar()Landroid/icu/util/Calendar;
-HSPLandroid/icu/text/DateFormat;->getContext(Landroid/icu/text/DisplayContext$Type;)Landroid/icu/text/DisplayContext;
-HSPLandroid/icu/text/DateFormat;->getDateInstance(ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;
-HSPLandroid/icu/text/DateFormat;->getInstanceForSkeleton(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;
-HSPLandroid/icu/text/DateFormat;->getInstanceForSkeleton(Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateFormat;
-HSPLandroid/icu/text/DateFormat;->getPatternInstance(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;
-HSPLandroid/icu/text/DateFormat;->getTimeInstance(ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;
-HSPLandroid/icu/text/DateFormat;->setCalendar(Landroid/icu/util/Calendar;)V
-HSPLandroid/icu/text/DateFormat;->setContext(Landroid/icu/text/DisplayContext;)V
-HSPLandroid/icu/text/DateFormat;->setTimeZone(Landroid/icu/util/TimeZone;)V
-HSPLandroid/icu/text/DateFormatSymbols$1;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/text/DateFormatSymbols$1;->createInstance(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormatSymbols$AospExtendedDateFormatSymbols;
-HSPLandroid/icu/text/DateFormatSymbols$AospExtendedDateFormatSymbols;->-$$Nest$fgetdfs(Landroid/icu/text/DateFormatSymbols$AospExtendedDateFormatSymbols;)Landroid/icu/text/DateFormatSymbols;
-HSPLandroid/icu/text/DateFormatSymbols$AospExtendedDateFormatSymbols;-><init>(Landroid/icu/util/ULocale;Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)V
-HSPLandroid/icu/text/DateFormatSymbols$CalendarDataSink;-><init>()V
-HSPLandroid/icu/text/DateFormatSymbols$CalendarDataSink;->preEnumerate(Ljava/lang/String;)V
-HSPLandroid/icu/text/DateFormatSymbols$CalendarDataSink;->processAliasFromValue(Ljava/lang/String;Landroid/icu/impl/UResource$Value;)Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;
-HSPLandroid/icu/text/DateFormatSymbols$CalendarDataSink;->processResource(Ljava/lang/String;Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-HSPLandroid/icu/text/DateFormatSymbols$CalendarDataSink;->put(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->values()[Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-HSPLandroid/icu/text/DateFormatSymbols;-><init>(Landroid/icu/util/Calendar;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/DateFormatSymbols;-><init>(Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/DateFormatSymbols;-><init>(Landroid/icu/util/ULocale;Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;Landroid/icu/text/DateFormatSymbols$AospExtendedDateFormatSymbols;)V
-HSPLandroid/icu/text/DateFormatSymbols;-><init>(Ljava/lang/Class;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/DateFormatSymbols;-><init>(Ljava/lang/Class;Ljava/util/Locale;)V
-HSPLandroid/icu/text/DateFormatSymbols;->duplicate([Ljava/lang/String;)[Ljava/lang/String;
-HSPLandroid/icu/text/DateFormatSymbols;->getAmPmStrings()[Ljava/lang/String;
-HSPLandroid/icu/text/DateFormatSymbols;->getEras()[Ljava/lang/String;
-HSPLandroid/icu/text/DateFormatSymbols;->getExtendedInstance(Landroid/icu/util/ULocale;Ljava/lang/String;)Landroid/icu/text/DateFormatSymbols$AospExtendedDateFormatSymbols;
-HSPLandroid/icu/text/DateFormatSymbols;->getMonths(II)[Ljava/lang/String;
-HSPLandroid/icu/text/DateFormatSymbols;->getWeekdays(II)[Ljava/lang/String;
-HSPLandroid/icu/text/DateFormatSymbols;->initializeData(Landroid/icu/text/DateFormatSymbols;)V
-HSPLandroid/icu/text/DateFormatSymbols;->initializeData(Landroid/icu/util/ULocale;Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)V
-HSPLandroid/icu/text/DateFormatSymbols;->initializeData(Landroid/icu/util/ULocale;Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;Landroid/icu/text/DateFormatSymbols$AospExtendedDateFormatSymbols;)V
-HSPLandroid/icu/text/DateFormatSymbols;->initializeData(Landroid/icu/util/ULocale;Ljava/lang/String;)V
-HSPLandroid/icu/text/DateFormatSymbols;->loadDayPeriodStrings(Ljava/util/Map;)[Ljava/lang/String;
-HSPLandroid/icu/text/DateFormatSymbols;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/DateFormatSymbols;->setTimeSeparatorString(Ljava/lang/String;)V
-HSPLandroid/icu/text/DateIntervalFormat;-><init>(Ljava/lang/String;Landroid/icu/util/ULocale;Landroid/icu/text/SimpleDateFormat;)V
-HSPLandroid/icu/text/DateIntervalFormat;->adjustFieldWidth(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZ)Ljava/lang/String;
-HSPLandroid/icu/text/DateIntervalFormat;->concatSingleDate2TimeInterval(Ljava/lang/String;Ljava/lang/String;ILjava/util/Map;)V
-HSPLandroid/icu/text/DateIntervalFormat;->format(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-HSPLandroid/icu/text/DateIntervalFormat;->formatImpl(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;Landroid/icu/text/DateIntervalFormat$FormatOutput;Ljava/util/List;)Ljava/lang/StringBuffer;
-HSPLandroid/icu/text/DateIntervalFormat;->genIntervalPattern(ILjava/lang/String;Ljava/lang/String;ILjava/util/Map;)Landroid/icu/text/DateIntervalFormat$SkeletonAndItsBestMatch;
-HSPLandroid/icu/text/DateIntervalFormat;->genSeparateDateTimePtn(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Landroid/icu/text/DateTimePatternGenerator;)Z
-HSPLandroid/icu/text/DateIntervalFormat;->getConcatenationPattern(Landroid/icu/util/ULocale;)Ljava/lang/String;
-HSPLandroid/icu/text/DateIntervalFormat;->getDateTimeSkeleton(Ljava/lang/String;Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;)V
-HSPLandroid/icu/text/DateIntervalFormat;->getInstance(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateIntervalFormat;
-HSPLandroid/icu/text/DateIntervalFormat;->initializeIntervalPattern(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/util/Map;
-HSPLandroid/icu/text/DateIntervalFormat;->initializePattern(Landroid/icu/impl/ICUCache;)V
-HSPLandroid/icu/text/DateIntervalFormat;->normalizeHourMetacharacters(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;
-HSPLandroid/icu/text/DateIntervalFormat;->setTimeZone(Landroid/icu/util/TimeZone;)V
-HSPLandroid/icu/text/DateIntervalInfo$DateIntervalSink;->processSkeletonTable(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-HSPLandroid/icu/text/DateIntervalInfo$DateIntervalSink;->put(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/text/DateIntervalInfo$DateIntervalSink;->validateAndProcessPatternLetter(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLandroid/icu/text/DateIntervalInfo;->clone()Ljava/lang/Object;
-HSPLandroid/icu/text/DateIntervalInfo;->cloneUnfrozenDII()Ljava/lang/Object;
-HSPLandroid/icu/text/DateIntervalInfo;->freeze()Landroid/icu/text/DateIntervalInfo;
-HSPLandroid/icu/text/DateIntervalInfo;->getBestSkeleton(Ljava/lang/String;)Landroid/icu/text/DateIntervalFormat$BestMatchInfo;
-HSPLandroid/icu/text/DateIntervalInfo;->getDefaultOrder()Z
-HSPLandroid/icu/text/DateIntervalInfo;->getIntervalPattern(Ljava/lang/String;I)Landroid/icu/text/DateIntervalInfo$PatternInfo;
-HSPLandroid/icu/text/DateIntervalInfo;->initializeData(Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/DateIntervalInfo;->parseSkeleton(Ljava/lang/String;[I)V
-HSPLandroid/icu/text/DateIntervalInfo;->setFallbackIntervalPattern(Ljava/lang/String;)V
-HSPLandroid/icu/text/DateIntervalInfo;->setIntervalPatternInternally(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/icu/text/DateIntervalInfo$PatternInfo;
-HSPLandroid/icu/text/DateIntervalInfo;->setup(Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/DateIntervalInfo;->splitPatternInto2Part(Ljava/lang/String;)I
-HSPLandroid/icu/text/DateTimePatternGenerator$AppendItemFormatsSink;-><init>(Landroid/icu/text/DateTimePatternGenerator;)V
-HSPLandroid/icu/text/DateTimePatternGenerator$AppendItemFormatsSink;->put(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/text/DateTimePatternGenerator$AppendItemNamesSink;-><init>(Landroid/icu/text/DateTimePatternGenerator;)V
-HSPLandroid/icu/text/DateTimePatternGenerator$AppendItemNamesSink;->put(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/text/DateTimePatternGenerator$AvailableFormatsSink;-><init>(Landroid/icu/text/DateTimePatternGenerator;Landroid/icu/text/DateTimePatternGenerator$PatternInfo;)V
-HSPLandroid/icu/text/DateTimePatternGenerator$AvailableFormatsSink;->put(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;-><init>()V
-HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->compareTo(Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;)I
-HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->compareTo(Ljava/lang/Object;)I
-HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->equals(Ljava/lang/Object;)Z
-HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->fieldIsNumeric(I)Z
-HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->getBasePattern()Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->getDistance(Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;ILandroid/icu/text/DateTimePatternGenerator$DistanceInfo;)I
-HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->getFieldMask()I
-HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->set(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$FormatParser;Z)Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;+]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/text/DateTimePatternGenerator$VariableField;Landroid/icu/text/DateTimePatternGenerator$VariableField;]Landroid/icu/text/DateTimePatternGenerator$FormatParser;Landroid/icu/text/DateTimePatternGenerator$FormatParser;]Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
-HSPLandroid/icu/text/DateTimePatternGenerator$DisplayWidth;->cldrKey()Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator$DistanceInfo;-><init>()V
-HSPLandroid/icu/text/DateTimePatternGenerator$DistanceInfo;->addExtra(I)V
-HSPLandroid/icu/text/DateTimePatternGenerator$DistanceInfo;->addMissing(I)V
-HSPLandroid/icu/text/DateTimePatternGenerator$DistanceInfo;->clear()V
-HSPLandroid/icu/text/DateTimePatternGenerator$DistanceInfo;->setTo(Landroid/icu/text/DateTimePatternGenerator$DistanceInfo;)V
-HSPLandroid/icu/text/DateTimePatternGenerator$FormatParser;-><init>()V
-HSPLandroid/icu/text/DateTimePatternGenerator$FormatParser;->addVariable(Ljava/lang/StringBuffer;Z)V
-HSPLandroid/icu/text/DateTimePatternGenerator$FormatParser;->getItems()Ljava/util/List;
-HSPLandroid/icu/text/DateTimePatternGenerator$FormatParser;->quoteLiteral(Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroid/icu/text/DateTimePatternGenerator$FormatParser;->set(Ljava/lang/String;)Landroid/icu/text/DateTimePatternGenerator$FormatParser;
-HSPLandroid/icu/text/DateTimePatternGenerator$FormatParser;->set(Ljava/lang/String;Z)Landroid/icu/text/DateTimePatternGenerator$FormatParser;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;]Landroid/icu/impl/PatternTokenizer;Landroid/icu/impl/PatternTokenizer;
-HSPLandroid/icu/text/DateTimePatternGenerator$PatternInfo;-><init>()V
-HSPLandroid/icu/text/DateTimePatternGenerator$PatternWithMatcher;-><init>(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;)V
-HSPLandroid/icu/text/DateTimePatternGenerator$PatternWithSkeletonFlag;-><init>(Ljava/lang/String;Z)V
-HSPLandroid/icu/text/DateTimePatternGenerator$SkeletonFields;-><init>()V
-HSPLandroid/icu/text/DateTimePatternGenerator$SkeletonFields;->appendFieldTo(ILjava/lang/StringBuilder;Z)Ljava/lang/StringBuilder;
-HSPLandroid/icu/text/DateTimePatternGenerator$SkeletonFields;->appendTo(Ljava/lang/StringBuilder;ZZ)Ljava/lang/StringBuilder;
-HSPLandroid/icu/text/DateTimePatternGenerator$SkeletonFields;->clear()V
-HSPLandroid/icu/text/DateTimePatternGenerator$SkeletonFields;->compareTo(Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;)I
-HSPLandroid/icu/text/DateTimePatternGenerator$SkeletonFields;->getFieldChar(I)C
-HSPLandroid/icu/text/DateTimePatternGenerator$SkeletonFields;->getFieldLength(I)I
-HSPLandroid/icu/text/DateTimePatternGenerator$SkeletonFields;->isFieldEmpty(I)Z
-HSPLandroid/icu/text/DateTimePatternGenerator$SkeletonFields;->populate(ICI)V
-HSPLandroid/icu/text/DateTimePatternGenerator$SkeletonFields;->populate(ILjava/lang/String;)V
-HSPLandroid/icu/text/DateTimePatternGenerator$SkeletonFields;->toString(Z)Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator$VariableField;-><init>(Ljava/lang/String;Z)V
-HSPLandroid/icu/text/DateTimePatternGenerator$VariableField;->getCanonicalIndex()I
-HSPLandroid/icu/text/DateTimePatternGenerator$VariableField;->getType()I
-HSPLandroid/icu/text/DateTimePatternGenerator$VariableField;->isNumeric()Z
-HSPLandroid/icu/text/DateTimePatternGenerator$VariableField;->toString()Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;-><init>()V
-HSPLandroid/icu/text/DateTimePatternGenerator;->addCLDRData(Landroid/icu/text/DateTimePatternGenerator$PatternInfo;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/DateTimePatternGenerator;->addCanonicalItems()V
-HSPLandroid/icu/text/DateTimePatternGenerator;->addICUPatterns(Landroid/icu/text/DateTimePatternGenerator$PatternInfo;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/DateTimePatternGenerator;->addPattern(Ljava/lang/String;ZLandroid/icu/text/DateTimePatternGenerator$PatternInfo;)Landroid/icu/text/DateTimePatternGenerator;
-HSPLandroid/icu/text/DateTimePatternGenerator;->addPatternWithSkeleton(Ljava/lang/String;Ljava/lang/String;ZLandroid/icu/text/DateTimePatternGenerator$PatternInfo;)Landroid/icu/text/DateTimePatternGenerator;
-HSPLandroid/icu/text/DateTimePatternGenerator;->adjustFieldTypes(Landroid/icu/text/DateTimePatternGenerator$PatternWithMatcher;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;Ljava/util/EnumSet;I)Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->checkFrozen()V
-HSPLandroid/icu/text/DateTimePatternGenerator;->clone()Ljava/lang/Object;
-HSPLandroid/icu/text/DateTimePatternGenerator;->cloneAsThawed()Landroid/icu/text/DateTimePatternGenerator;
-HSPLandroid/icu/text/DateTimePatternGenerator;->consumeShortTimePattern(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$PatternInfo;)V
-HSPLandroid/icu/text/DateTimePatternGenerator;->fillInMissing()V
-HSPLandroid/icu/text/DateTimePatternGenerator;->freeze()Landroid/icu/text/DateTimePatternGenerator;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getAllowedHourFormats(Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/DateTimePatternGenerator;->getAllowedHourFormatsLangCountry(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getAppendFormatNumber(Landroid/icu/impl/UResource$Key;)I
-HSPLandroid/icu/text/DateTimePatternGenerator;->getAppendItemFormat(I)Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getBestAppending(Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;ILandroid/icu/text/DateTimePatternGenerator$DistanceInfo;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;Ljava/util/EnumSet;I)Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getBestPattern(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getBestPattern(Ljava/lang/String;IZ)Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getBestPattern(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;I)Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getBestPattern(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;IZ)Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getBestRaw(Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;ILandroid/icu/text/DateTimePatternGenerator$DistanceInfo;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;)Landroid/icu/text/DateTimePatternGenerator$PatternWithMatcher;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getCLDRFieldAndWidthNumber(Landroid/icu/impl/UResource$Key;)I+]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Key;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getCalendarTypeToUse(Landroid/icu/util/ULocale;)Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getCanonicalIndex(Ljava/lang/String;Z)I+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getDateTimeFormat()Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getFieldDisplayName(ILandroid/icu/text/DateTimePatternGenerator$DisplayWidth;)Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getFilteredPattern(Landroid/icu/text/DateTimePatternGenerator$FormatParser;Ljava/util/BitSet;)Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getFrozenInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/DateTimePatternGenerator;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/DateTimePatternGenerator;
-HSPLandroid/icu/text/DateTimePatternGenerator;->getInstance(Ljava/util/Locale;)Landroid/icu/text/DateTimePatternGenerator;
-HSPLandroid/icu/text/DateTimePatternGenerator;->hackTimes(Landroid/icu/text/DateTimePatternGenerator$PatternInfo;Ljava/lang/String;)V
-HSPLandroid/icu/text/DateTimePatternGenerator;->initData(Landroid/icu/util/ULocale;Z)V
-HSPLandroid/icu/text/DateTimePatternGenerator;->isAvailableFormatSet(Ljava/lang/String;)Z
-HSPLandroid/icu/text/DateTimePatternGenerator;->isFrozen()Z
-HSPLandroid/icu/text/DateTimePatternGenerator;->mapSkeletonMetacharacters(Ljava/lang/String;Ljava/util/EnumSet;)Ljava/lang/String;
-HSPLandroid/icu/text/DateTimePatternGenerator;->setAppendItemFormat(ILjava/lang/String;)V
-HSPLandroid/icu/text/DateTimePatternGenerator;->setAvailableFormat(Ljava/lang/String;)V
-HSPLandroid/icu/text/DateTimePatternGenerator;->setDateTimeFormat(ILjava/lang/String;)V
-HSPLandroid/icu/text/DateTimePatternGenerator;->setDateTimeFormat(Ljava/lang/String;)V
-HSPLandroid/icu/text/DateTimePatternGenerator;->setDateTimeFromCalendar(Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/DateTimePatternGenerator;->setDecimal(Ljava/lang/String;)V
-HSPLandroid/icu/text/DateTimePatternGenerator;->setDecimalSymbols(Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/DateTimePatternGenerator;->setFieldDisplayName(ILandroid/icu/text/DateTimePatternGenerator$DisplayWidth;Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormat;-><init>(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;)V
-HSPLandroid/icu/text/DecimalFormat;-><init>(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;I)V
-HSPLandroid/icu/text/DecimalFormat;->clone()Ljava/lang/Object;
-HSPLandroid/icu/text/DecimalFormat;->fieldPositionHelper(Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;Ljava/text/FieldPosition;I)V+]Ljava/text/FieldPosition;Ljava/text/DontCareFieldPosition;]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-HSPLandroid/icu/text/DecimalFormat;->format(DLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;+]Landroid/icu/number/LocalizedNumberFormatter;Landroid/icu/number/LocalizedNumberFormatter;]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;
-HSPLandroid/icu/text/DecimalFormat;->format(JLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-HSPLandroid/icu/text/DecimalFormat;->getDecimalFormatSymbols()Landroid/icu/text/DecimalFormatSymbols;
-HSPLandroid/icu/text/DecimalFormat;->getMaximumFractionDigits()I
-HSPLandroid/icu/text/DecimalFormat;->getMaximumIntegerDigits()I
-HSPLandroid/icu/text/DecimalFormat;->getMinimumFractionDigits()I
-HSPLandroid/icu/text/DecimalFormat;->getMinimumIntegerDigits()I
-HSPLandroid/icu/text/DecimalFormat;->getNegativePrefix()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormat;->getNegativeSuffix()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormat;->getParser()Landroid/icu/impl/number/parse/NumberParserImpl;
-HSPLandroid/icu/text/DecimalFormat;->getPositivePrefix()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormat;->getPositiveSuffix()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormat;->isParseBigDecimal()Z
-HSPLandroid/icu/text/DecimalFormat;->isParseIntegerOnly()Z
-HSPLandroid/icu/text/DecimalFormat;->parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Number;
-HSPLandroid/icu/text/DecimalFormat;->refreshFormatter()V+]Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/DecimalFormatSymbols;]Landroid/icu/number/UnlocalizedNumberFormatter;Landroid/icu/number/UnlocalizedNumberFormatter;]Landroid/icu/text/DecimalFormat;Landroid/icu/text/DecimalFormat;
-HSPLandroid/icu/text/DecimalFormat;->setCurrency(Landroid/icu/util/Currency;)V
-HSPLandroid/icu/text/DecimalFormat;->setDecimalSeparatorAlwaysShown(Z)V
-HSPLandroid/icu/text/DecimalFormat;->setGroupingUsed(Z)V
-HSPLandroid/icu/text/DecimalFormat;->setMaximumFractionDigits(I)V
-HSPLandroid/icu/text/DecimalFormat;->setMaximumIntegerDigits(I)V
-HSPLandroid/icu/text/DecimalFormat;->setMinimumFractionDigits(I)V
-HSPLandroid/icu/text/DecimalFormat;->setMinimumIntegerDigits(I)V
-HSPLandroid/icu/text/DecimalFormat;->setParseIntegerOnly(Z)V
-HSPLandroid/icu/text/DecimalFormat;->setParseStrictMode(Landroid/icu/impl/number/DecimalFormatProperties$ParseMode;)V
-HSPLandroid/icu/text/DecimalFormat;->setPropertiesFromPattern(Ljava/lang/String;I)V
-HSPLandroid/icu/text/DecimalFormat;->toNumberFormatter()Landroid/icu/number/LocalizedNumberFormatter;
-HSPLandroid/icu/text/DecimalFormat;->toPattern()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols$1;->createInstance(Landroid/icu/util/ULocale;Ljava/lang/Void;)Landroid/icu/text/DecimalFormatSymbols$CacheData;
-HSPLandroid/icu/text/DecimalFormatSymbols$1;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/text/DecimalFormatSymbols$CacheData;-><init>(Landroid/icu/util/ULocale;[Ljava/lang/String;[Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols$DecFmtDataSink;-><init>([Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols$DecFmtDataSink;->put(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->-$$Nest$sfgetSYMBOL_KEYS()[Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->-$$Nest$smloadData(Landroid/icu/util/ULocale;)Landroid/icu/text/DecimalFormatSymbols$CacheData;
-HSPLandroid/icu/text/DecimalFormatSymbols;-><init>(Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;-><init>(Ljava/util/Locale;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->clone()Ljava/lang/Object;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getCachedLocaleData(Landroid/icu/util/ULocale;Landroid/icu/text/NumberingSystem;)Landroid/icu/text/DecimalFormatSymbols$CacheData;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getCodePointZero()I
-HSPLandroid/icu/text/DecimalFormatSymbols;->getCurrency()Landroid/icu/util/Currency;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getCurrencyPattern()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getCurrencySymbol()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getDecimalSeparator()C
-HSPLandroid/icu/text/DecimalFormatSymbols;->getDecimalSeparatorString()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getDigit()C
-HSPLandroid/icu/text/DecimalFormatSymbols;->getExponentSeparator()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getGroupingSeparator()C
-HSPLandroid/icu/text/DecimalFormatSymbols;->getGroupingSeparatorString()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getInfinity()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getInstance(Ljava/util/Locale;)Landroid/icu/text/DecimalFormatSymbols;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getInternationalCurrencySymbol()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getLocale()Ljava/util/Locale;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getLocalizedPatternSeparator(Landroid/icu/util/ULocale;Landroid/icu/text/NumberingSystem;)Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getMinusSign()C
-HSPLandroid/icu/text/DecimalFormatSymbols;->getMinusSignString()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getMonetaryDecimalSeparator()C
-HSPLandroid/icu/text/DecimalFormatSymbols;->getMonetaryGroupingSeparator()C
-HSPLandroid/icu/text/DecimalFormatSymbols;->getNaN()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getPatternSeparator()C
-HSPLandroid/icu/text/DecimalFormatSymbols;->getPerMill()C
-HSPLandroid/icu/text/DecimalFormatSymbols;->getPerMillString()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getPercent()C
-HSPLandroid/icu/text/DecimalFormatSymbols;->getPercentString()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getPlusSignString()Ljava/lang/String;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getULocale()Landroid/icu/util/ULocale;
-HSPLandroid/icu/text/DecimalFormatSymbols;->getZeroDigit()C
-HSPLandroid/icu/text/DecimalFormatSymbols;->initSpacingInfo(Landroid/icu/impl/CurrencyData$CurrencySpacingInfo;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->initialize(Landroid/icu/util/ULocale;Landroid/icu/text/NumberingSystem;)V+]Landroid/icu/impl/CurrencyData$CurrencyDisplayInfoProvider;Landroid/icu/impl/ICUCurrencyDisplayInfoProvider;]Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;]Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/DecimalFormatSymbols;]Landroid/icu/impl/CurrencyData$CurrencyDisplayInfo;Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo;
-HSPLandroid/icu/text/DecimalFormatSymbols;->loadData(Landroid/icu/util/ULocale;)Landroid/icu/text/DecimalFormatSymbols$CacheData;
-HSPLandroid/icu/text/DecimalFormatSymbols;->setApproximatelySignString(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setCurrency(Landroid/icu/util/Currency;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setCurrencyOrNull(Landroid/icu/util/Currency;Landroid/icu/impl/CurrencyData$CurrencyDisplayInfo;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setCurrencySymbol(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setDecimalSeparator(C)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setDecimalSeparatorString(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setDigit(C)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setDigitStrings([Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setExponentMultiplicationSign(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setExponentSeparator(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setGroupingSeparator(C)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setGroupingSeparatorString(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setInfinity(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setInternationalCurrencySymbol(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setMinusSign(C)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setMinusSignString(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setMonetaryDecimalSeparator(C)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setMonetaryDecimalSeparatorString(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setMonetaryGroupingSeparator(C)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setMonetaryGroupingSeparatorString(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setNaN(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setPatternForCurrencySpacing(IZLjava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setPatternSeparator(C)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setPerMill(C)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setPerMillString(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setPercent(C)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setPercentString(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setPlusSign(C)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setPlusSignString(Ljava/lang/String;)V
-HSPLandroid/icu/text/DecimalFormatSymbols;->setZeroDigit(C)V
-HSPLandroid/icu/text/DisplayContext;->type()Landroid/icu/text/DisplayContext$Type;
-HSPLandroid/icu/text/Edits$Iterator;->next(Z)Z
-HSPLandroid/icu/text/Edits;-><init>()V
-HSPLandroid/icu/text/Edits;->addReplace(II)V
-HSPLandroid/icu/text/Edits;->addUnchanged(I)V
-HSPLandroid/icu/text/Edits;->append(I)V
-HSPLandroid/icu/text/Edits;->hasChanges()Z
-HSPLandroid/icu/text/Edits;->lastUnit()I
-HSPLandroid/icu/text/Edits;->reset()V
-HSPLandroid/icu/text/IDNA;->convertIDNToASCII(Ljava/lang/String;I)Ljava/lang/StringBuffer;
-HSPLandroid/icu/text/MeasureFormat;-><init>(Landroid/icu/util/ULocale;Landroid/icu/text/MeasureFormat$FormatWidth;Landroid/icu/text/NumberFormat;Landroid/icu/text/PluralRules;Landroid/icu/text/MeasureFormat$NumericFormatters;)V
-HSPLandroid/icu/text/MeasureFormat;->getNumberFormatter()Landroid/icu/number/LocalizedNumberFormatter;
-HSPLandroid/icu/text/MeasureFormat;->getUnitFormatterFromCache(ILandroid/icu/util/MeasureUnit;Landroid/icu/util/MeasureUnit;)Landroid/icu/number/LocalizedNumberFormatter;
-HSPLandroid/icu/text/Normalizer$NFKDMode;->getNormalizer2(I)Landroid/icu/text/Normalizer2;
-HSPLandroid/icu/text/Normalizer2;->getNFCInstance()Landroid/icu/text/Normalizer2;
-HSPLandroid/icu/text/Normalizer2;->getNFDInstance()Landroid/icu/text/Normalizer2;
-HSPLandroid/icu/text/Normalizer2;->getNFKDInstance()Landroid/icu/text/Normalizer2;
-HSPLandroid/icu/text/Normalizer2;->normalize(Ljava/lang/CharSequence;)Ljava/lang/String;
-HSPLandroid/icu/text/Normalizer;->normalize(Ljava/lang/String;Landroid/icu/text/Normalizer$Mode;)Ljava/lang/String;
-HSPLandroid/icu/text/NumberFormat;-><init>()V
-HSPLandroid/icu/text/NumberFormat;->clone()Ljava/lang/Object;
-HSPLandroid/icu/text/NumberFormat;->createInstance(Landroid/icu/util/ULocale;I)Landroid/icu/text/NumberFormat;
-HSPLandroid/icu/text/NumberFormat;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberFormat;
-HSPLandroid/icu/text/NumberFormat;->getInstance(Landroid/icu/util/ULocale;I)Landroid/icu/text/NumberFormat;
-HSPLandroid/icu/text/NumberFormat;->getInstance(Ljava/util/Locale;I)Landroid/icu/text/NumberFormat;
-HSPLandroid/icu/text/NumberFormat;->getPattern(Landroid/icu/util/ULocale;I)Ljava/lang/String;
-HSPLandroid/icu/text/NumberFormat;->getPatternForStyle(Landroid/icu/util/ULocale;I)Ljava/lang/String;
-HSPLandroid/icu/text/NumberFormat;->getPatternForStyleAndNumberingSystem(Landroid/icu/util/ULocale;Ljava/lang/String;I)Ljava/lang/String;
-HSPLandroid/icu/text/NumberFormat;->getShim()Landroid/icu/text/NumberFormat$NumberFormatShim;
-HSPLandroid/icu/text/NumberFormatServiceShim$NFService$1RBNumberFormatFactory;->handleCreate(Landroid/icu/util/ULocale;ILandroid/icu/impl/ICUService;)Ljava/lang/Object;
-HSPLandroid/icu/text/NumberFormatServiceShim;->createInstance(Landroid/icu/util/ULocale;I)Landroid/icu/text/NumberFormat;
-HSPLandroid/icu/text/NumberingSystem$1;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/text/NumberingSystem$1;->createInstance(Ljava/lang/String;Landroid/icu/text/NumberingSystem$LocaleLookupData;)Landroid/icu/text/NumberingSystem;
-HSPLandroid/icu/text/NumberingSystem$LocaleLookupData;-><init>(Landroid/icu/util/ULocale;Ljava/lang/String;)V
-HSPLandroid/icu/text/NumberingSystem;->getDescription()Ljava/lang/String;
-HSPLandroid/icu/text/NumberingSystem;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberingSystem;
-HSPLandroid/icu/text/NumberingSystem;->getInstanceByName(Ljava/lang/String;)Landroid/icu/text/NumberingSystem;
-HSPLandroid/icu/text/NumberingSystem;->getName()Ljava/lang/String;
-HSPLandroid/icu/text/NumberingSystem;->getRadix()I
-HSPLandroid/icu/text/NumberingSystem;->isAlgorithmic()Z
-HSPLandroid/icu/text/NumberingSystem;->isValidDigitString(Ljava/lang/String;)Z
-HSPLandroid/icu/text/NumberingSystem;->lookupInstanceByLocale(Landroid/icu/text/NumberingSystem$LocaleLookupData;)Landroid/icu/text/NumberingSystem;
-HSPLandroid/icu/text/PluralRules$1;->isFulfilled(Landroid/icu/text/PluralRules$IFixedDecimal;)Z
-HSPLandroid/icu/text/PluralRules$AndConstraint;-><init>(Landroid/icu/text/PluralRules$Constraint;Landroid/icu/text/PluralRules$Constraint;)V
-HSPLandroid/icu/text/PluralRules$AndConstraint;->isFulfilled(Landroid/icu/text/PluralRules$IFixedDecimal;)Z
-HSPLandroid/icu/text/PluralRules$BinaryConstraint;-><init>(Landroid/icu/text/PluralRules$Constraint;Landroid/icu/text/PluralRules$Constraint;)V
-HSPLandroid/icu/text/PluralRules$DecimalQuantitySamples;-><init>(Landroid/icu/text/PluralRules$SampleType;Ljava/util/Set;Z)V
-HSPLandroid/icu/text/PluralRules$DecimalQuantitySamples;->checkDecimal(Landroid/icu/text/PluralRules$SampleType;Landroid/icu/impl/number/DecimalQuantity;)V
-HSPLandroid/icu/text/PluralRules$DecimalQuantitySamples;->parse(Ljava/lang/String;)Landroid/icu/text/PluralRules$DecimalQuantitySamples;
-HSPLandroid/icu/text/PluralRules$DecimalQuantitySamplesRange;-><init>(Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity;)V
-HSPLandroid/icu/text/PluralRules$Factory;->getDefaultFactory()Landroid/icu/impl/PluralRulesLoader;
-HSPLandroid/icu/text/PluralRules$FixedDecimal;-><init>(D)V
-HSPLandroid/icu/text/PluralRules$FixedDecimal;-><init>(DI)V
-HSPLandroid/icu/text/PluralRules$FixedDecimal;-><init>(DIJ)V
-HSPLandroid/icu/text/PluralRules$FixedDecimal;-><init>(DIJI)V
-HSPLandroid/icu/text/PluralRules$FixedDecimal;-><init>(DIJII)V
-HSPLandroid/icu/text/PluralRules$FixedDecimal;-><init>(Landroid/icu/text/PluralRules$FixedDecimal;)V
-HSPLandroid/icu/text/PluralRules$FixedDecimal;->decimals(D)I
-HSPLandroid/icu/text/PluralRules$FixedDecimal;->getFractionalDigits(DI)I
-HSPLandroid/icu/text/PluralRules$FixedDecimal;->getOperand(Ljava/lang/String;)Landroid/icu/text/PluralRules$Operand;
-HSPLandroid/icu/text/PluralRules$FixedDecimal;->getPluralOperand(Landroid/icu/text/PluralRules$Operand;)D
-HSPLandroid/icu/text/PluralRules$FixedDecimal;->getVisibleDecimalDigitCount()I
-HSPLandroid/icu/text/PluralRules$FixedDecimal;->intValue()I
-HSPLandroid/icu/text/PluralRules$FixedDecimal;->isInfinite()Z
-HSPLandroid/icu/text/PluralRules$FixedDecimal;->isNaN()Z
-HSPLandroid/icu/text/PluralRules$FixedDecimal;->longValue()J
-HSPLandroid/icu/text/PluralRules$Operand;->valueOf(Ljava/lang/String;)Landroid/icu/text/PluralRules$Operand;
-HSPLandroid/icu/text/PluralRules$Operand;->values()[Landroid/icu/text/PluralRules$Operand;
-HSPLandroid/icu/text/PluralRules$RangeConstraint;-><init>(IZLandroid/icu/text/PluralRules$Operand;ZDD[J)V
-HSPLandroid/icu/text/PluralRules$RangeConstraint;->isFulfilled(Landroid/icu/text/PluralRules$IFixedDecimal;)Z
-HSPLandroid/icu/text/PluralRules$Rule;->appliesTo(Landroid/icu/text/PluralRules$IFixedDecimal;)Z
-HSPLandroid/icu/text/PluralRules$Rule;->getKeyword()Ljava/lang/String;
-HSPLandroid/icu/text/PluralRules$RuleList;-><init>()V
-HSPLandroid/icu/text/PluralRules$RuleList;->addRule(Landroid/icu/text/PluralRules$Rule;)Landroid/icu/text/PluralRules$RuleList;
-HSPLandroid/icu/text/PluralRules$RuleList;->finish()Landroid/icu/text/PluralRules$RuleList;
-HSPLandroid/icu/text/PluralRules$RuleList;->getKeywords()Ljava/util/Set;
-HSPLandroid/icu/text/PluralRules$RuleList;->select(Landroid/icu/text/PluralRules$IFixedDecimal;)Ljava/lang/String;
-HSPLandroid/icu/text/PluralRules$RuleList;->selectRule(Landroid/icu/text/PluralRules$IFixedDecimal;)Landroid/icu/text/PluralRules$Rule;
-HSPLandroid/icu/text/PluralRules$SimpleTokenizer;->split(Ljava/lang/String;)[Ljava/lang/String;
-HSPLandroid/icu/text/PluralRules;-><init>(Landroid/icu/text/PluralRules$RuleList;Landroid/icu/impl/number/range/StandardPluralRanges;)V
-HSPLandroid/icu/text/PluralRules;->forLocale(Landroid/icu/util/ULocale;)Landroid/icu/text/PluralRules;
-HSPLandroid/icu/text/PluralRules;->forLocale(Ljava/util/Locale;)Landroid/icu/text/PluralRules;
-HSPLandroid/icu/text/PluralRules;->isValidKeyword(Ljava/lang/String;)Z
-HSPLandroid/icu/text/PluralRules;->newInternal(Ljava/lang/String;Landroid/icu/impl/number/range/StandardPluralRanges;)Landroid/icu/text/PluralRules;
-HSPLandroid/icu/text/PluralRules;->nextToken([Ljava/lang/String;ILjava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/text/PluralRules;->parseConstraint(Ljava/lang/String;)Landroid/icu/text/PluralRules$Constraint;
-HSPLandroid/icu/text/PluralRules;->parseDescription(Ljava/lang/String;)Landroid/icu/text/PluralRules;
-HSPLandroid/icu/text/PluralRules;->parseRule(Ljava/lang/String;)Landroid/icu/text/PluralRules$Rule;
-HSPLandroid/icu/text/PluralRules;->parseRuleChain(Ljava/lang/String;)Landroid/icu/text/PluralRules$RuleList;
-HSPLandroid/icu/text/PluralRules;->select(D)Ljava/lang/String;
-HSPLandroid/icu/text/PluralRules;->select(Landroid/icu/text/PluralRules$IFixedDecimal;)Ljava/lang/String;
-HSPLandroid/icu/text/RawCollationKey;-><init>(I)V
-HSPLandroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;->values()[Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;
-HSPLandroid/icu/text/RelativeDateTimeFormatter$Cache$1;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/text/RelativeDateTimeFormatter$Cache$1;->createInstance(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeFormatterData;
-HSPLandroid/icu/text/RelativeDateTimeFormatter$Cache;->get(Landroid/icu/util/ULocale;)Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeFormatterData;
-HSPLandroid/icu/text/RelativeDateTimeFormatter$Direction;->values()[Landroid/icu/text/RelativeDateTimeFormatter$Direction;
-HSPLandroid/icu/text/RelativeDateTimeFormatter$Loader;->load()Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeFormatterData;
-HSPLandroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->orNullFromString(Ljava/lang/CharSequence;)Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-HSPLandroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->consumeTableRelative(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-HSPLandroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->consumeTableRelativeTime(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-HSPLandroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->consumeTimeDetail(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-HSPLandroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->consumeTimeUnit(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-HSPLandroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->handleAlias(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->handlePlainDirection(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-HSPLandroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->put(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-HSPLandroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;->values()[Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;
-HSPLandroid/icu/text/RelativeDateTimeFormatter$Style;->values()[Landroid/icu/text/RelativeDateTimeFormatter$Style;
-HSPLandroid/icu/text/RelativeDateTimeFormatter;-><init>(Ljava/util/EnumMap;Ljava/util/EnumMap;Ljava/lang/String;Landroid/icu/text/PluralRules;Landroid/icu/text/NumberFormat;Landroid/icu/text/RelativeDateTimeFormatter$Style;Landroid/icu/text/DisplayContext;Landroid/icu/text/BreakIterator;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/RelativeDateTimeFormatter;->adjustForContext(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/text/RelativeDateTimeFormatter;->getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/NumberFormat;Landroid/icu/text/RelativeDateTimeFormatter$Style;Landroid/icu/text/DisplayContext;)Landroid/icu/text/RelativeDateTimeFormatter;
-HSPLandroid/icu/text/RelativeDateTimeFormatter;->keyToDirection(Landroid/icu/impl/UResource$Key;)Landroid/icu/text/RelativeDateTimeFormatter$Direction;
-HSPLandroid/icu/text/ReplaceableString;-><init>(Ljava/lang/String;)V
-HSPLandroid/icu/text/ReplaceableString;->charAt(I)C
-HSPLandroid/icu/text/ReplaceableString;->getChars(II[CI)V
-HSPLandroid/icu/text/ReplaceableString;->length()I
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;-><init>(Landroid/icu/text/RuleBasedBreakIterator;)V
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;-><init>(Landroid/icu/text/RuleBasedBreakIterator;Landroid/icu/text/RuleBasedBreakIterator$BreakCache;)V
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;->addFollowing(IIZ)V
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;->addPreceding(IIZ)Z
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;->current()I
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;->following(I)V
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;->next()V
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;->populateFollowing()Z
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;->populateNear(I)Z
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;->populatePreceding()Z
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;->preceding(I)V
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;->previous()V
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;->reset()V
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;->reset(II)V
-HSPLandroid/icu/text/RuleBasedBreakIterator$BreakCache;->seek(I)Z
-HSPLandroid/icu/text/RuleBasedBreakIterator$DictionaryCache;-><init>(Landroid/icu/text/RuleBasedBreakIterator;)V
-HSPLandroid/icu/text/RuleBasedBreakIterator$DictionaryCache;-><init>(Landroid/icu/text/RuleBasedBreakIterator;Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;)V
-HSPLandroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->following(I)Z
-HSPLandroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->preceding(I)Z
-HSPLandroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->reset()V
-HSPLandroid/icu/text/RuleBasedBreakIterator;-><init>()V
-HSPLandroid/icu/text/RuleBasedBreakIterator;->CISetIndex32(Ljava/text/CharacterIterator;I)I
-HSPLandroid/icu/text/RuleBasedBreakIterator;->checkOffset(ILjava/text/CharacterIterator;)V
-HSPLandroid/icu/text/RuleBasedBreakIterator;->clone()Ljava/lang/Object;
-HSPLandroid/icu/text/RuleBasedBreakIterator;->first()I
-HSPLandroid/icu/text/RuleBasedBreakIterator;->following(I)I
-HSPLandroid/icu/text/RuleBasedBreakIterator;->getInstanceFromCompiledRules(Ljava/nio/ByteBuffer;)Landroid/icu/text/RuleBasedBreakIterator;
-HSPLandroid/icu/text/RuleBasedBreakIterator;->getText()Ljava/text/CharacterIterator;
-HSPLandroid/icu/text/RuleBasedBreakIterator;->handleNext()I
-HSPLandroid/icu/text/RuleBasedBreakIterator;->handleSafePrevious(I)I
-HSPLandroid/icu/text/RuleBasedBreakIterator;->isBoundary(I)Z
-HSPLandroid/icu/text/RuleBasedBreakIterator;->next()I
-HSPLandroid/icu/text/RuleBasedBreakIterator;->preceding(I)I
-HSPLandroid/icu/text/RuleBasedBreakIterator;->setText(Ljava/text/CharacterIterator;)V
-HSPLandroid/icu/text/RuleBasedCollator$CollationBuffer;-><init>(Landroid/icu/impl/coll/CollationData;)V
-HSPLandroid/icu/text/RuleBasedCollator$CollationBuffer;-><init>(Landroid/icu/impl/coll/CollationData;Landroid/icu/text/RuleBasedCollator$CollationBuffer-IA;)V
-HSPLandroid/icu/text/RuleBasedCollator$CollationKeyByteSink;-><init>(Landroid/icu/text/RawCollationKey;)V
-HSPLandroid/icu/text/RuleBasedCollator$FCDUTF16NFDIterator;-><init>()V
-HSPLandroid/icu/text/RuleBasedCollator$NFDIterator;-><init>()V
-HSPLandroid/icu/text/RuleBasedCollator$UTF16NFDIterator;-><init>()V
-HSPLandroid/icu/text/RuleBasedCollator;-><init>(Landroid/icu/impl/coll/CollationTailoring;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/RuleBasedCollator;-><init>(Ljava/lang/String;)V
-HSPLandroid/icu/text/RuleBasedCollator;->adoptTailoring(Landroid/icu/impl/coll/CollationTailoring;)V
-HSPLandroid/icu/text/RuleBasedCollator;->checkNotFrozen()V
-HSPLandroid/icu/text/RuleBasedCollator;->clone()Ljava/lang/Object;
-HSPLandroid/icu/text/RuleBasedCollator;->cloneAsThawed()Landroid/icu/text/RuleBasedCollator;
-HSPLandroid/icu/text/RuleBasedCollator;->compare(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/icu/text/RuleBasedCollator;->doCompare(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I+]Landroid/icu/impl/coll/CollationData;Landroid/icu/impl/coll/CollationData;]Landroid/icu/impl/coll/SharedObject$Reference;Landroid/icu/impl/coll/SharedObject$Reference;]Ljava/lang/CharSequence;Ljava/lang/String;]Landroid/icu/impl/coll/CollationSettings;Landroid/icu/impl/coll/CollationSettings;
-HSPLandroid/icu/text/RuleBasedCollator;->freeze()Landroid/icu/text/Collator;
-HSPLandroid/icu/text/RuleBasedCollator;->getCollationBuffer()Landroid/icu/text/RuleBasedCollator$CollationBuffer;
-HSPLandroid/icu/text/RuleBasedCollator;->getCollationKey(Ljava/lang/String;)Landroid/icu/text/CollationKey;
-HSPLandroid/icu/text/RuleBasedCollator;->getCollationKey(Ljava/lang/String;Landroid/icu/text/RuleBasedCollator$CollationBuffer;)Landroid/icu/text/CollationKey;
-HSPLandroid/icu/text/RuleBasedCollator;->getOwnedSettings()Landroid/icu/impl/coll/CollationSettings;
-HSPLandroid/icu/text/RuleBasedCollator;->getRawCollationKey(Ljava/lang/CharSequence;Landroid/icu/text/RawCollationKey;Landroid/icu/text/RuleBasedCollator$CollationBuffer;)Landroid/icu/text/RawCollationKey;
-HSPLandroid/icu/text/RuleBasedCollator;->getRules()Ljava/lang/String;
-HSPLandroid/icu/text/RuleBasedCollator;->getStrength()I
-HSPLandroid/icu/text/RuleBasedCollator;->internalBuildTailoring(Ljava/lang/String;)V
-HSPLandroid/icu/text/RuleBasedCollator;->isFrozen()Z
-HSPLandroid/icu/text/RuleBasedCollator;->releaseCollationBuffer(Landroid/icu/text/RuleBasedCollator$CollationBuffer;)V
-HSPLandroid/icu/text/RuleBasedCollator;->setDecomposition(I)V
-HSPLandroid/icu/text/RuleBasedCollator;->setFastLatinOptions(Landroid/icu/impl/coll/CollationSettings;)V
-HSPLandroid/icu/text/RuleBasedCollator;->setStrength(I)V
-HSPLandroid/icu/text/RuleBasedCollator;->simpleKeyLengthEstimate(Ljava/lang/CharSequence;)I
-HSPLandroid/icu/text/RuleBasedCollator;->writeSortKey(Ljava/lang/CharSequence;Landroid/icu/text/RuleBasedCollator$CollationKeyByteSink;Landroid/icu/text/RuleBasedCollator$CollationBuffer;)V
-HSPLandroid/icu/text/SimpleDateFormat$PatternItem;-><init>(CI)V
-HSPLandroid/icu/text/SimpleDateFormat;-><init>(Ljava/lang/String;Landroid/icu/text/DateFormatSymbols;Landroid/icu/util/Calendar;Landroid/icu/text/NumberFormat;Landroid/icu/util/ULocale;ZLjava/lang/String;)V
-HSPLandroid/icu/text/SimpleDateFormat;-><init>(Ljava/lang/String;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/SimpleDateFormat;->fastZeroPaddingNumber(Ljava/lang/StringBuffer;III)V
-HSPLandroid/icu/text/SimpleDateFormat;->format(Landroid/icu/util/Calendar;Landroid/icu/text/DisplayContext;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;Ljava/util/List;)Ljava/lang/StringBuffer;
-HSPLandroid/icu/text/SimpleDateFormat;->format(Landroid/icu/util/Calendar;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-HSPLandroid/icu/text/SimpleDateFormat;->format(Landroid/icu/util/Calendar;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;Ljava/util/List;)Ljava/lang/StringBuffer;
-HSPLandroid/icu/text/SimpleDateFormat;->getIndexFromChar(C)I
-HSPLandroid/icu/text/SimpleDateFormat;->getInstance(Landroid/icu/util/Calendar$FormatConfiguration;)Landroid/icu/text/SimpleDateFormat;
-HSPLandroid/icu/text/SimpleDateFormat;->getLocale()Landroid/icu/util/ULocale;
-HSPLandroid/icu/text/SimpleDateFormat;->getNumberFormat(C)Landroid/icu/text/NumberFormat;
-HSPLandroid/icu/text/SimpleDateFormat;->getPatternItems()[Ljava/lang/Object;
-HSPLandroid/icu/text/SimpleDateFormat;->initLocalZeroPaddingNumberFormat()V
-HSPLandroid/icu/text/SimpleDateFormat;->initialize()V
-HSPLandroid/icu/text/SimpleDateFormat;->isFieldUnitIgnored(Ljava/lang/String;I)Z
-HSPLandroid/icu/text/SimpleDateFormat;->isNumeric(CI)Z
-HSPLandroid/icu/text/SimpleDateFormat;->isSyntaxChar(C)Z
-HSPLandroid/icu/text/SimpleDateFormat;->parsePattern()V
-HSPLandroid/icu/text/SimpleDateFormat;->safeAppend([Ljava/lang/String;ILjava/lang/StringBuffer;)V
-HSPLandroid/icu/text/SimpleDateFormat;->safeAppendWithMonthPattern([Ljava/lang/String;ILjava/lang/StringBuffer;Ljava/lang/String;)V
-HSPLandroid/icu/text/SimpleDateFormat;->setContext(Landroid/icu/text/DisplayContext;)V
-HSPLandroid/icu/text/SimpleDateFormat;->subFormat(Ljava/lang/StringBuffer;CIIILandroid/icu/text/DisplayContext;Ljava/text/FieldPosition;CLandroid/icu/util/Calendar;)V
-HSPLandroid/icu/text/SimpleDateFormat;->toPattern()Ljava/lang/String;
-HSPLandroid/icu/text/SimpleDateFormat;->zeroPaddingNumber(Landroid/icu/text/NumberFormat;Ljava/lang/StringBuffer;III)V
-HSPLandroid/icu/text/TimeZoneNames$Cache;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/text/TimeZoneNames$Cache;->createInstance(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneNames;
-HSPLandroid/icu/text/TimeZoneNames;-><init>()V
-HSPLandroid/icu/text/TimeZoneNames;->getDisplayName(Ljava/lang/String;Landroid/icu/text/TimeZoneNames$NameType;J)Ljava/lang/String;
-HSPLandroid/icu/text/TimeZoneNames;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneNames;
-HSPLandroid/icu/text/TimeZoneNames;->getInstance(Ljava/util/Locale;)Landroid/icu/text/TimeZoneNames;
-HSPLandroid/icu/text/UCharacterIterator;-><init>()V
-HSPLandroid/icu/text/UCharacterIterator;->getInstance(Ljava/lang/String;)Landroid/icu/text/UCharacterIterator;
-HSPLandroid/icu/text/UCharacterIterator;->getText()Ljava/lang/String;
-HSPLandroid/icu/text/UCharacterIterator;->getText([C)I
-HSPLandroid/icu/text/UCharacterIterator;->setToStart()V
-HSPLandroid/icu/text/UFormat;-><init>()V
-HSPLandroid/icu/text/UFormat;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
-HSPLandroid/icu/text/UFormat;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/text/UTF16;->append(Ljava/lang/StringBuffer;I)Ljava/lang/StringBuffer;
-HSPLandroid/icu/text/UTF16;->charAt(Ljava/lang/String;I)I
-HSPLandroid/icu/text/UTF16;->charAt([CIII)I
-HSPLandroid/icu/text/UTF16;->getCharCount(I)I
-HSPLandroid/icu/text/UnicodeFilter;-><init>()V
-HSPLandroid/icu/text/UnicodeSet;-><init>()V
-HSPLandroid/icu/text/UnicodeSet;-><init>(Landroid/icu/text/UnicodeSet;)V
-HSPLandroid/icu/text/UnicodeSet;->_appendToPat(Ljava/lang/Appendable;IIZ)Ljava/lang/Appendable;
-HSPLandroid/icu/text/UnicodeSet;->_appendToPat(Ljava/lang/Appendable;IZ)Ljava/lang/Appendable;
-HSPLandroid/icu/text/UnicodeSet;->add(I)Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/text/UnicodeSet;->add(II)Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/text/UnicodeSet;->add([III)Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/text/UnicodeSet;->addAll(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/text/UnicodeSet;->add_unchecked(I)Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/text/UnicodeSet;->add_unchecked(II)Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/text/UnicodeSet;->appendCodePoint(Ljava/lang/Appendable;I)V
-HSPLandroid/icu/text/UnicodeSet;->appendNewPattern(Ljava/lang/Appendable;ZZ)Ljava/lang/Appendable;
-HSPLandroid/icu/text/UnicodeSet;->applyPattern(Landroid/icu/impl/RuleCharacterIterator;Landroid/icu/text/SymbolTable;Ljava/lang/Appendable;II)V
-HSPLandroid/icu/text/UnicodeSet;->applyPattern(Ljava/lang/String;Ljava/text/ParsePosition;Landroid/icu/text/SymbolTable;I)Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/text/UnicodeSet;->checkFrozen()V
-HSPLandroid/icu/text/UnicodeSet;->clear()Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/text/UnicodeSet;->clone()Ljava/lang/Object;
-HSPLandroid/icu/text/UnicodeSet;->compact()Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/text/UnicodeSet;->contains(I)Z+]Landroid/icu/impl/BMPSet;Landroid/icu/impl/BMPSet;
-HSPLandroid/icu/text/UnicodeSet;->contains(Ljava/lang/CharSequence;)Z
-HSPLandroid/icu/text/UnicodeSet;->containsAll(Ljava/lang/String;)Z
-HSPLandroid/icu/text/UnicodeSet;->findCodePoint(I)I
-HSPLandroid/icu/text/UnicodeSet;->freeze()Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/text/UnicodeSet;->getRangeCount()I
-HSPLandroid/icu/text/UnicodeSet;->getRangeEnd(I)I
-HSPLandroid/icu/text/UnicodeSet;->getRangeStart(I)I
-HSPLandroid/icu/text/UnicodeSet;->getSingleCP(Ljava/lang/CharSequence;)I
-HSPLandroid/icu/text/UnicodeSet;->hasStrings()Z
-HSPLandroid/icu/text/UnicodeSet;->isFrozen()Z
-HSPLandroid/icu/text/UnicodeSet;->resemblesPropertyPattern(Landroid/icu/impl/RuleCharacterIterator;I)Z
-HSPLandroid/icu/text/UnicodeSet;->set(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;
-HSPLandroid/icu/util/AnnualTimeZoneRule;-><init>(Ljava/lang/String;IILandroid/icu/util/DateTimeRule;II)V
-HSPLandroid/icu/util/AnnualTimeZoneRule;->getEndYear()I
-HSPLandroid/icu/util/AnnualTimeZoneRule;->getFirstStart(II)Ljava/util/Date;
-HSPLandroid/icu/util/AnnualTimeZoneRule;->getNextStart(JIIZ)Ljava/util/Date;
-HSPLandroid/icu/util/AnnualTimeZoneRule;->getRule()Landroid/icu/util/DateTimeRule;
-HSPLandroid/icu/util/AnnualTimeZoneRule;->getStartInYear(III)Ljava/util/Date;
-HSPLandroid/icu/util/AnnualTimeZoneRule;->getStartYear()I
-HSPLandroid/icu/util/AnnualTimeZoneRule;->isEquivalentTo(Landroid/icu/util/TimeZoneRule;)Z
-HSPLandroid/icu/util/BasicTimeZone;-><init>(Ljava/lang/String;)V
-HSPLandroid/icu/util/ByteArrayWrapper;-><init>()V
-HSPLandroid/icu/util/ByteArrayWrapper;->releaseBytes()[B
-HSPLandroid/icu/util/BytesTrie$Result;->hasNext()Z
-HSPLandroid/icu/util/BytesTrie$Result;->hasValue()Z
-HSPLandroid/icu/util/BytesTrie;-><init>([BI)V
-HSPLandroid/icu/util/BytesTrie;->branchNext(III)Landroid/icu/util/BytesTrie$Result;
-HSPLandroid/icu/util/BytesTrie;->getValue()I
-HSPLandroid/icu/util/BytesTrie;->jumpByDelta([BI)I
-HSPLandroid/icu/util/BytesTrie;->next(I)Landroid/icu/util/BytesTrie$Result;
-HSPLandroid/icu/util/BytesTrie;->nextImpl(II)Landroid/icu/util/BytesTrie$Result;
-HSPLandroid/icu/util/BytesTrie;->readValue([BII)I
-HSPLandroid/icu/util/BytesTrie;->skipDelta([BI)I
-HSPLandroid/icu/util/BytesTrie;->skipValue(II)I
-HSPLandroid/icu/util/BytesTrie;->skipValue([BI)I
-HSPLandroid/icu/util/Calendar$FormatConfiguration;-><init>()V
-HSPLandroid/icu/util/Calendar$FormatConfiguration;->getCalendar()Landroid/icu/util/Calendar;
-HSPLandroid/icu/util/Calendar$FormatConfiguration;->getDateFormatSymbols()Landroid/icu/text/DateFormatSymbols;
-HSPLandroid/icu/util/Calendar$FormatConfiguration;->getLocale()Landroid/icu/util/ULocale;
-HSPLandroid/icu/util/Calendar$FormatConfiguration;->getOverrideString()Ljava/lang/String;
-HSPLandroid/icu/util/Calendar$FormatConfiguration;->getPatternString()Ljava/lang/String;
-HSPLandroid/icu/util/Calendar$PatternData;->getDateTimePattern(I)Ljava/lang/String;
-HSPLandroid/icu/util/Calendar$PatternData;->make(Landroid/icu/util/Calendar;Landroid/icu/util/ULocale;)Landroid/icu/util/Calendar$PatternData;
-HSPLandroid/icu/util/Calendar$PatternData;->make(Landroid/icu/util/ULocale;Ljava/lang/String;)Landroid/icu/util/Calendar$PatternData;
-HSPLandroid/icu/util/Calendar$WeekDataCache;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/util/Calendar$WeekDataCache;->createInstance(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/Calendar$WeekData;
-HSPLandroid/icu/util/Calendar;-><init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/util/Calendar;->clone()Ljava/lang/Object;
-HSPLandroid/icu/util/Calendar;->complete()V
-HSPLandroid/icu/util/Calendar;->computeFields()V
-HSPLandroid/icu/util/Calendar;->computeGregorianAndDOWFields(I)V
-HSPLandroid/icu/util/Calendar;->computeGregorianFields(I)V
-HSPLandroid/icu/util/Calendar;->computeWeekFields()V
-HSPLandroid/icu/util/Calendar;->createInstance(Landroid/icu/util/ULocale;)Landroid/icu/util/Calendar;
-HSPLandroid/icu/util/Calendar;->floorDivide(II[I)I
-HSPLandroid/icu/util/Calendar;->floorDivide(JI[I)I
-HSPLandroid/icu/util/Calendar;->floorDivide(JJ)J
-HSPLandroid/icu/util/Calendar;->formatHelper(Landroid/icu/util/Calendar;Landroid/icu/util/ULocale;II)Landroid/icu/text/DateFormat;
-HSPLandroid/icu/util/Calendar;->get(I)I
-HSPLandroid/icu/util/Calendar;->getCalendarTypeForLocale(Landroid/icu/util/ULocale;)Landroid/icu/impl/CalType;
-HSPLandroid/icu/util/Calendar;->getDateTimeFormat(IILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;
-HSPLandroid/icu/util/Calendar;->getDateTimeFormatString(Landroid/icu/util/ULocale;Ljava/lang/String;II)Ljava/lang/String;
-HSPLandroid/icu/util/Calendar;->getDateTimePattern(Landroid/icu/util/Calendar;Landroid/icu/util/ULocale;I)Ljava/lang/String;
-HSPLandroid/icu/util/Calendar;->getFirstDayOfWeek()I
-HSPLandroid/icu/util/Calendar;->getGregorianDayOfMonth()I
-HSPLandroid/icu/util/Calendar;->getGregorianDayOfYear()I
-HSPLandroid/icu/util/Calendar;->getGregorianMonth()I
-HSPLandroid/icu/util/Calendar;->getGregorianYear()I
-HSPLandroid/icu/util/Calendar;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/util/Calendar;
-HSPLandroid/icu/util/Calendar;->getInstance(Ljava/util/Locale;)Landroid/icu/util/Calendar;
-HSPLandroid/icu/util/Calendar;->getInstanceInternal(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)Landroid/icu/util/Calendar;
-HSPLandroid/icu/util/Calendar;->getKeywordValuesForLocale(Ljava/lang/String;Landroid/icu/util/ULocale;Z)[Ljava/lang/String;
-HSPLandroid/icu/util/Calendar;->getLeastMaximum(I)I
-HSPLandroid/icu/util/Calendar;->getLimit(II)I
-HSPLandroid/icu/util/Calendar;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
-HSPLandroid/icu/util/Calendar;->getMinimalDaysInFirstWeek()I
-HSPLandroid/icu/util/Calendar;->getPatternData(Landroid/icu/util/ULocale;Ljava/lang/String;)Landroid/icu/util/Calendar$PatternData;
-HSPLandroid/icu/util/Calendar;->getRegionForCalendar(Landroid/icu/util/ULocale;)Ljava/lang/String;
-HSPLandroid/icu/util/Calendar;->getRepeatedWallTimeOption()I
-HSPLandroid/icu/util/Calendar;->getSkippedWallTimeOption()I
-HSPLandroid/icu/util/Calendar;->getTimeInMillis()J
-HSPLandroid/icu/util/Calendar;->getTimeZone()Landroid/icu/util/TimeZone;
-HSPLandroid/icu/util/Calendar;->getWeekDataForRegionInternal(Ljava/lang/String;)Landroid/icu/util/Calendar$WeekData;
-HSPLandroid/icu/util/Calendar;->handleCreateFields()[I
-HSPLandroid/icu/util/Calendar;->handleGetDateFormat(Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;
-HSPLandroid/icu/util/Calendar;->initInternal()V
-HSPLandroid/icu/util/Calendar;->internalSet(II)V
-HSPLandroid/icu/util/Calendar;->isEquivalentTo(Landroid/icu/util/Calendar;)Z
-HSPLandroid/icu/util/Calendar;->isLenient()Z
-HSPLandroid/icu/util/Calendar;->julianDayToDayOfWeek(I)I
-HSPLandroid/icu/util/Calendar;->setCalendarLocale(Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/util/Calendar;->setFirstDayOfWeek(I)V
-HSPLandroid/icu/util/Calendar;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/util/Calendar;->setMinimalDaysInFirstWeek(I)V
-HSPLandroid/icu/util/Calendar;->setTime(Ljava/util/Date;)V
-HSPLandroid/icu/util/Calendar;->setTimeInMillis(J)V
-HSPLandroid/icu/util/Calendar;->setTimeZone(Landroid/icu/util/TimeZone;)V
-HSPLandroid/icu/util/Calendar;->setWeekData(Landroid/icu/util/Calendar$WeekData;)Landroid/icu/util/Calendar;
-HSPLandroid/icu/util/Calendar;->setWeekData(Ljava/lang/String;)V
-HSPLandroid/icu/util/Calendar;->weekNumber(II)I
-HSPLandroid/icu/util/Calendar;->weekNumber(III)I
-HSPLandroid/icu/util/CharsTrie;-><init>(Ljava/lang/CharSequence;I)V
-HSPLandroid/icu/util/CharsTrie;->branchNext(III)Landroid/icu/util/BytesTrie$Result;
-HSPLandroid/icu/util/CharsTrie;->first(I)Landroid/icu/util/BytesTrie$Result;
-HSPLandroid/icu/util/CharsTrie;->firstForCodePoint(I)Landroid/icu/util/BytesTrie$Result;
-HSPLandroid/icu/util/CharsTrie;->getValue()I
-HSPLandroid/icu/util/CharsTrie;->jumpByDelta(Ljava/lang/CharSequence;I)I
-HSPLandroid/icu/util/CharsTrie;->next(I)Landroid/icu/util/BytesTrie$Result;
-HSPLandroid/icu/util/CharsTrie;->nextImpl(II)Landroid/icu/util/BytesTrie$Result;
-HSPLandroid/icu/util/CharsTrie;->readValue(Ljava/lang/CharSequence;II)I
-HSPLandroid/icu/util/CharsTrie;->skipDelta(Ljava/lang/CharSequence;I)I
-HSPLandroid/icu/util/CharsTrie;->skipValue(II)I
-HSPLandroid/icu/util/CharsTrie;->skipValue(Ljava/lang/CharSequence;I)I
-HSPLandroid/icu/util/CodePointMap$Range;->-$$Nest$fgetend(Landroid/icu/util/CodePointMap$Range;)I
-HSPLandroid/icu/util/CodePointMap$Range;->-$$Nest$fgetvalue(Landroid/icu/util/CodePointMap$Range;)I
-HSPLandroid/icu/util/CodePointMap$Range;->-$$Nest$fputstart(Landroid/icu/util/CodePointMap$Range;I)V
-HSPLandroid/icu/util/CodePointMap$Range;-><init>()V
-HSPLandroid/icu/util/CodePointMap$Range;->getEnd()I
-HSPLandroid/icu/util/CodePointMap$Range;->getValue()I
-HSPLandroid/icu/util/CodePointMap;-><init>()V
-HSPLandroid/icu/util/CodePointMap;->getRange(ILandroid/icu/util/CodePointMap$RangeOption;ILandroid/icu/util/CodePointMap$ValueFilter;Landroid/icu/util/CodePointMap$Range;)Z
-HSPLandroid/icu/util/CodePointTrie$Data16;->getFromIndex(I)I
-HSPLandroid/icu/util/CodePointTrie$Data32;-><init>([I)V
-HSPLandroid/icu/util/CodePointTrie$Data32;->getDataLength()I
-HSPLandroid/icu/util/CodePointTrie$Data32;->getFromIndex(I)I
-HSPLandroid/icu/util/CodePointTrie$Data8;-><init>([B)V
-HSPLandroid/icu/util/CodePointTrie$Data8;->getDataLength()I
-HSPLandroid/icu/util/CodePointTrie$Data8;->getFromIndex(I)I
-HSPLandroid/icu/util/CodePointTrie$Data;-><init>()V
-HSPLandroid/icu/util/CodePointTrie$Data;-><init>(Landroid/icu/util/CodePointTrie$Data-IA;)V
-HSPLandroid/icu/util/CodePointTrie$Fast16;->bmpGet(I)I
-HSPLandroid/icu/util/CodePointTrie$Fast16;->get(I)I
-HSPLandroid/icu/util/CodePointTrie$Fast8;-><init>([C[BIII)V
-HSPLandroid/icu/util/CodePointTrie$Fast8;->get(I)I
-HSPLandroid/icu/util/CodePointTrie$Fast;-><init>([CLandroid/icu/util/CodePointTrie$Data;III)V
-HSPLandroid/icu/util/CodePointTrie$Fast;->cpIndex(I)I
-HSPLandroid/icu/util/CodePointTrie$Fast;->getType()Landroid/icu/util/CodePointTrie$Type;
-HSPLandroid/icu/util/CodePointTrie$Small32;-><init>([C[IIII)V
-HSPLandroid/icu/util/CodePointTrie$Small;-><init>([CLandroid/icu/util/CodePointTrie$Data;III)V
-HSPLandroid/icu/util/CodePointTrie$Small;-><init>([CLandroid/icu/util/CodePointTrie$Data;IIILandroid/icu/util/CodePointTrie$Small-IA;)V
-HSPLandroid/icu/util/CodePointTrie;-><init>([CLandroid/icu/util/CodePointTrie$Data;III)V
-HSPLandroid/icu/util/CodePointTrie;-><init>([CLandroid/icu/util/CodePointTrie$Data;IIILandroid/icu/util/CodePointTrie-IA;)V
-HSPLandroid/icu/util/CodePointTrie;->fastIndex(I)I
-HSPLandroid/icu/util/CodePointTrie;->fromBinary(Landroid/icu/util/CodePointTrie$Type;Landroid/icu/util/CodePointTrie$ValueWidth;Ljava/nio/ByteBuffer;)Landroid/icu/util/CodePointTrie;
-HSPLandroid/icu/util/CodePointTrie;->getRange(ILandroid/icu/util/CodePointMap$ValueFilter;Landroid/icu/util/CodePointMap$Range;)Z
-HSPLandroid/icu/util/Currency$1;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/util/Currency$1;->createInstance(Ljava/lang/String;Ljava/lang/Void;)Landroid/icu/util/Currency;
-HSPLandroid/icu/util/Currency;->createCurrency(Landroid/icu/util/ULocale;)Landroid/icu/util/Currency;
-HSPLandroid/icu/util/Currency;->getAvailableCurrencyCodes(Landroid/icu/util/ULocale;Ljava/util/Date;)[Ljava/lang/String;
-HSPLandroid/icu/util/Currency;->getCurrencyCode()Ljava/lang/String;
-HSPLandroid/icu/util/Currency;->getDefaultFractionDigits(Landroid/icu/util/Currency$CurrencyUsage;)I
-HSPLandroid/icu/util/Currency;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/util/Currency;
-HSPLandroid/icu/util/Currency;->getInstance(Ljava/lang/String;)Landroid/icu/util/Currency;
-HSPLandroid/icu/util/Currency;->getInstance(Ljava/util/Locale;)Landroid/icu/util/Currency;
-HSPLandroid/icu/util/Currency;->getName(Landroid/icu/util/ULocale;I[Z)Ljava/lang/String;
-HSPLandroid/icu/util/Currency;->getRoundingIncrement(Landroid/icu/util/Currency$CurrencyUsage;)D
-HSPLandroid/icu/util/Currency;->getSymbol(Landroid/icu/util/ULocale;)Ljava/lang/String;
-HSPLandroid/icu/util/Currency;->getSymbol(Ljava/util/Locale;)Ljava/lang/String;
-HSPLandroid/icu/util/Currency;->getTenderCurrencies(Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;)Ljava/util/List;
-HSPLandroid/icu/util/Currency;->isAlpha3Code(Ljava/lang/String;)Z
-HSPLandroid/icu/util/Currency;->loadCurrency(Ljava/lang/String;)Landroid/icu/util/Currency;
-HSPLandroid/icu/util/DateTimeRule;-><init>(IIIZII)V
-HSPLandroid/icu/util/DateTimeRule;->getDateRuleType()I
-HSPLandroid/icu/util/DateTimeRule;->getRuleDayOfMonth()I
-HSPLandroid/icu/util/DateTimeRule;->getRuleDayOfWeek()I
-HSPLandroid/icu/util/DateTimeRule;->getRuleMillisInDay()I
-HSPLandroid/icu/util/DateTimeRule;->getRuleMonth()I
-HSPLandroid/icu/util/DateTimeRule;->getTimeRuleType()I
-HSPLandroid/icu/util/GregorianCalendar;-><init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V
-HSPLandroid/icu/util/GregorianCalendar;->getType()Ljava/lang/String;
-HSPLandroid/icu/util/GregorianCalendar;->handleComputeFields(I)V
-HSPLandroid/icu/util/GregorianCalendar;->handleGetYearLength(I)I
-HSPLandroid/icu/util/GregorianCalendar;->isEquivalentTo(Landroid/icu/util/Calendar;)Z
-HSPLandroid/icu/util/GregorianCalendar;->isLeapYear(I)Z
-HSPLandroid/icu/util/InitialTimeZoneRule;-><init>(Ljava/lang/String;II)V
-HSPLandroid/icu/util/Measure;-><init>(Ljava/lang/Number;Landroid/icu/util/MeasureUnit;)V
-HSPLandroid/icu/util/Measure;->getNumber()Ljava/lang/Number;
-HSPLandroid/icu/util/Measure;->getUnit()Landroid/icu/util/MeasureUnit;
-HSPLandroid/icu/util/MeasureUnit$2;->create(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/MeasureUnit;
-HSPLandroid/icu/util/MeasureUnit;->addUnit(Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/MeasureUnit$Factory;)Landroid/icu/util/MeasureUnit;
-HSPLandroid/icu/util/MeasureUnit;->equals(Ljava/lang/Object;)Z
-HSPLandroid/icu/util/MeasureUnit;->getSubtype()Ljava/lang/String;
-HSPLandroid/icu/util/MeasureUnit;->getType()Ljava/lang/String;
-HSPLandroid/icu/util/MeasureUnit;->internalGetInstance(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/MeasureUnit;
-HSPLandroid/icu/util/MutableCodePointTrie$AllSameBlocks;-><init>()V
-HSPLandroid/icu/util/MutableCodePointTrie$AllSameBlocks;->findMostUsed()I
-HSPLandroid/icu/util/MutableCodePointTrie$AllSameBlocks;->findOrAdd(III)I
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;-><init>()V
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;-><init>(Landroid/icu/util/MutableCodePointTrie$MixedBlocks-IA;)V
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->addEntry([I[CIII)V
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->extend([CIII)V
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->extend([IIII)V
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->findAllSameBlock([II)I
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->findBlock([C[CI)I
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->findBlock([C[II)I
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->findBlock([I[II)I
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->findEntry([III)I
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->findEntry([I[C[I[CII)I
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->init(II)V
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->makeHashCode(I)I
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->makeHashCode([CI)I
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->makeHashCode([II)I
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->modulo(II)I
-HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->nextIndex(II)I
-HSPLandroid/icu/util/MutableCodePointTrie;->-$$Nest$smallValuesSameAs([IIII)Z
-HSPLandroid/icu/util/MutableCodePointTrie;->-$$Nest$smequalBlocks([II[III)Z
-HSPLandroid/icu/util/MutableCodePointTrie;-><init>(II)V
-HSPLandroid/icu/util/MutableCodePointTrie;->allValuesSameAs([IIII)Z
-HSPLandroid/icu/util/MutableCodePointTrie;->allocDataBlock(I)I
-HSPLandroid/icu/util/MutableCodePointTrie;->build(Landroid/icu/util/CodePointTrie$Type;Landroid/icu/util/CodePointTrie$ValueWidth;)Landroid/icu/util/CodePointTrie;
-HSPLandroid/icu/util/MutableCodePointTrie;->buildImmutable(Landroid/icu/util/CodePointTrie$Type;Landroid/icu/util/CodePointTrie$ValueWidth;)Landroid/icu/util/CodePointTrie;
-HSPLandroid/icu/util/MutableCodePointTrie;->clear()V
-HSPLandroid/icu/util/MutableCodePointTrie;->compactData(I[IILandroid/icu/util/MutableCodePointTrie$MixedBlocks;)I
-HSPLandroid/icu/util/MutableCodePointTrie;->compactIndex(ILandroid/icu/util/MutableCodePointTrie$MixedBlocks;)I
-HSPLandroid/icu/util/MutableCodePointTrie;->compactTrie(I)I
-HSPLandroid/icu/util/MutableCodePointTrie;->compactWholeDataBlocks(ILandroid/icu/util/MutableCodePointTrie$AllSameBlocks;)I
-HSPLandroid/icu/util/MutableCodePointTrie;->ensureHighStart(I)V
-HSPLandroid/icu/util/MutableCodePointTrie;->equalBlocks([CI[CII)Z
-HSPLandroid/icu/util/MutableCodePointTrie;->equalBlocks([CI[III)Z
-HSPLandroid/icu/util/MutableCodePointTrie;->equalBlocks([II[III)Z
-HSPLandroid/icu/util/MutableCodePointTrie;->findHighStart()I
-HSPLandroid/icu/util/MutableCodePointTrie;->findSameBlock([CII[CII)I
-HSPLandroid/icu/util/MutableCodePointTrie;->get(I)I
-HSPLandroid/icu/util/MutableCodePointTrie;->getAllSameOverlap([IIII)I
-HSPLandroid/icu/util/MutableCodePointTrie;->getDataBlock(I)I
-HSPLandroid/icu/util/MutableCodePointTrie;->getOverlap([CI[CII)I
-HSPLandroid/icu/util/MutableCodePointTrie;->getOverlap([CI[III)I
-HSPLandroid/icu/util/MutableCodePointTrie;->getOverlap([II[III)I
-HSPLandroid/icu/util/MutableCodePointTrie;->set(II)V
-HSPLandroid/icu/util/MutableCodePointTrie;->writeBlock(II)V
-HSPLandroid/icu/util/Output;-><init>(Ljava/lang/Object;)V
-HSPLandroid/icu/util/STZInfo;-><init>()V
-HSPLandroid/icu/util/SimpleTimeZone;-><init>(ILjava/lang/String;IIIIIIIIIII)V
-HSPLandroid/icu/util/SimpleTimeZone;->clone()Ljava/lang/Object;
-HSPLandroid/icu/util/SimpleTimeZone;->cloneAsThawed()Landroid/icu/util/TimeZone;
-HSPLandroid/icu/util/SimpleTimeZone;->compareToRule(IIIIIIIIIIII)I
-HSPLandroid/icu/util/SimpleTimeZone;->construct(IIIIIIIIIIII)V
-HSPLandroid/icu/util/SimpleTimeZone;->decodeEndRule()V
-HSPLandroid/icu/util/SimpleTimeZone;->decodeRules()V
-HSPLandroid/icu/util/SimpleTimeZone;->decodeStartRule()V
-HSPLandroid/icu/util/SimpleTimeZone;->getDSTSavings()I
-HSPLandroid/icu/util/SimpleTimeZone;->getNextTransition(JZ)Landroid/icu/util/TimeZoneTransition;
-HSPLandroid/icu/util/SimpleTimeZone;->getOffset(IIIIII)I
-HSPLandroid/icu/util/SimpleTimeZone;->getOffset(IIIIIII)I
-HSPLandroid/icu/util/SimpleTimeZone;->getOffset(IIIIIIII)I
-HSPLandroid/icu/util/SimpleTimeZone;->getRawOffset()I
-HSPLandroid/icu/util/SimpleTimeZone;->getSTZInfo()Landroid/icu/util/STZInfo;
-HSPLandroid/icu/util/SimpleTimeZone;->getTimeZoneRules()[Landroid/icu/util/TimeZoneRule;
-HSPLandroid/icu/util/SimpleTimeZone;->hashCode()I
-HSPLandroid/icu/util/SimpleTimeZone;->initTransitionRules()V
-HSPLandroid/icu/util/SimpleTimeZone;->isFrozen()Z
-HSPLandroid/icu/util/SimpleTimeZone;->setStartYear(I)V
-HSPLandroid/icu/util/SimpleTimeZone;->toString()Ljava/lang/String;
-HSPLandroid/icu/util/SimpleTimeZone;->useDaylightTime()Z
-HSPLandroid/icu/util/TimeArrayTimeZoneRule;-><init>(Ljava/lang/String;II[JI)V
-HSPLandroid/icu/util/TimeArrayTimeZoneRule;->getStartTimes()[J
-HSPLandroid/icu/util/TimeArrayTimeZoneRule;->getTimeType()I
-HSPLandroid/icu/util/TimeZone;-><init>(Ljava/lang/String;)V
-HSPLandroid/icu/util/TimeZone;->cloneAsThawed()Landroid/icu/util/TimeZone;
-HSPLandroid/icu/util/TimeZone;->equals(Ljava/lang/Object;)Z
-HSPLandroid/icu/util/TimeZone;->forULocaleOrDefault(Landroid/icu/util/ULocale;)Landroid/icu/util/TimeZone;
-HSPLandroid/icu/util/TimeZone;->getCanonicalID(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/TimeZone;->getCanonicalID(Ljava/lang/String;[Z)Ljava/lang/String;
-HSPLandroid/icu/util/TimeZone;->getDefault()Landroid/icu/util/TimeZone;
-HSPLandroid/icu/util/TimeZone;->getFrozenICUTimeZone(Ljava/lang/String;Z)Landroid/icu/util/BasicTimeZone;
-HSPLandroid/icu/util/TimeZone;->getFrozenTimeZone(Ljava/lang/String;)Landroid/icu/util/TimeZone;
-HSPLandroid/icu/util/TimeZone;->getID()Ljava/lang/String;
-HSPLandroid/icu/util/TimeZone;->getOffset(JZ[I)V
-HSPLandroid/icu/util/TimeZone;->getTimeZone(Ljava/lang/String;)Landroid/icu/util/TimeZone;
-HSPLandroid/icu/util/TimeZone;->getTimeZone(Ljava/lang/String;IZ)Landroid/icu/util/TimeZone;
-HSPLandroid/icu/util/TimeZone;->hashCode()I
-HSPLandroid/icu/util/TimeZone;->setICUDefault(Landroid/icu/util/TimeZone;)V
-HSPLandroid/icu/util/TimeZoneRule;-><init>(Ljava/lang/String;II)V
-HSPLandroid/icu/util/TimeZoneRule;->getDSTSavings()I
-HSPLandroid/icu/util/TimeZoneRule;->getName()Ljava/lang/String;
-HSPLandroid/icu/util/TimeZoneRule;->getRawOffset()I
-HSPLandroid/icu/util/TimeZoneRule;->isEquivalentTo(Landroid/icu/util/TimeZoneRule;)Z
-HSPLandroid/icu/util/TimeZoneTransition;-><init>(JLandroid/icu/util/TimeZoneRule;Landroid/icu/util/TimeZoneRule;)V
-HSPLandroid/icu/util/TimeZoneTransition;->getFrom()Landroid/icu/util/TimeZoneRule;
-HSPLandroid/icu/util/TimeZoneTransition;->getTime()J
-HSPLandroid/icu/util/TimeZoneTransition;->getTo()Landroid/icu/util/TimeZoneRule;
-HSPLandroid/icu/util/ULocale$1;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/util/ULocale$1;->createInstance(Ljava/lang/String;Ljava/lang/Void;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale$2;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/util/ULocale$2;->createInstance(Ljava/util/Locale;Ljava/lang/Void;)Landroid/icu/util/ULocale;
-HSPLandroid/icu/util/ULocale$AliasReplacer;-><clinit>()V
-HSPLandroid/icu/util/ULocale$AliasReplacer;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/icu/util/ULocale$AliasReplacer;->generateKey(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale$AliasReplacer;->loadAliasData()V
-HSPLandroid/icu/util/ULocale$AliasReplacer;->replace()Ljava/lang/String;
-HSPLandroid/icu/util/ULocale$AliasReplacer;->replaceLanguage(ZZZ)Z
-HSPLandroid/icu/util/ULocale$AliasReplacer;->replaceRegion()Z
-HSPLandroid/icu/util/ULocale$AliasReplacer;->replaceScript()Z
-HSPLandroid/icu/util/ULocale$AliasReplacer;->replaceVariant()Z
-HSPLandroid/icu/util/ULocale$Builder;-><init>()V
-HSPLandroid/icu/util/ULocale$Builder;->build()Landroid/icu/util/ULocale;
-HSPLandroid/icu/util/ULocale$Builder;->setLanguage(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;
-HSPLandroid/icu/util/ULocale$Builder;->setRegion(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;
-HSPLandroid/icu/util/ULocale$JDKLocaleHelper;->getDefault(Landroid/icu/util/ULocale$Category;)Ljava/util/Locale;
-HSPLandroid/icu/util/ULocale$JDKLocaleHelper;->toLocale(Landroid/icu/util/ULocale;)Ljava/util/Locale;
-HSPLandroid/icu/util/ULocale$JDKLocaleHelper;->toULocale(Ljava/util/Locale;)Landroid/icu/util/ULocale;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Locale;Ljava/util/Locale;]Ljava/util/Set;Ljava/util/Collections$EmptySet;
-HSPLandroid/icu/util/ULocale;->-$$Nest$smgetInstance(Landroid/icu/impl/locale/BaseLocale;Landroid/icu/impl/locale/LocaleExtensions;)Landroid/icu/util/ULocale;
-HSPLandroid/icu/util/ULocale;-><init>(Ljava/lang/String;)V
-HSPLandroid/icu/util/ULocale;-><init>(Ljava/lang/String;Ljava/util/Locale;)V
-HSPLandroid/icu/util/ULocale;-><init>(Ljava/lang/String;Ljava/util/Locale;Landroid/icu/util/ULocale-IA;)V
-HSPLandroid/icu/util/ULocale;->addLikelySubtags(Landroid/icu/util/ULocale;)Landroid/icu/util/ULocale;
-HSPLandroid/icu/util/ULocale;->appendTag(Ljava/lang/String;Ljava/lang/StringBuilder;)V
-HSPLandroid/icu/util/ULocale;->base()Landroid/icu/impl/locale/BaseLocale;+]Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;]Landroid/icu/impl/LocaleIDParser;Landroid/icu/impl/LocaleIDParser;
-HSPLandroid/icu/util/ULocale;->canonicalize(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->createCanonical(Ljava/lang/String;)Landroid/icu/util/ULocale;
-HSPLandroid/icu/util/ULocale;->createLikelySubtagsString(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->createTagString(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->createTagString(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->equals(Ljava/lang/Object;)Z
-HSPLandroid/icu/util/ULocale;->forLocale(Ljava/util/Locale;)Landroid/icu/util/ULocale;
-HSPLandroid/icu/util/ULocale;->getBaseName()Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->getBaseName(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->getCountry()Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->getDefault()Landroid/icu/util/ULocale;
-HSPLandroid/icu/util/ULocale;->getDefault(Landroid/icu/util/ULocale$Category;)Landroid/icu/util/ULocale;
-HSPLandroid/icu/util/ULocale;->getInstance(Landroid/icu/impl/locale/BaseLocale;Landroid/icu/impl/locale/LocaleExtensions;)Landroid/icu/util/ULocale;
-HSPLandroid/icu/util/ULocale;->getKeywordValue(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->getKeywordValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->getKeywords()Ljava/util/Iterator;
-HSPLandroid/icu/util/ULocale;->getKeywords(Ljava/lang/String;)Ljava/util/Iterator;
-HSPLandroid/icu/util/ULocale;->getLanguage()Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->getName()Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->getName(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/CacheBase;Landroid/icu/util/ULocale$1;
-HSPLandroid/icu/util/ULocale;->getRegionForSupplementalData(Landroid/icu/util/ULocale;Z)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->getScript()Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->getScript(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->getShortestSubtagLength(Ljava/lang/String;)I
-HSPLandroid/icu/util/ULocale;->getVariant()Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->getVariant(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->hashCode()I
-HSPLandroid/icu/util/ULocale;->isEmptyString(Ljava/lang/String;)Z
-HSPLandroid/icu/util/ULocale;->isKnownCanonicalizedLocale(Ljava/lang/String;)Z
-HSPLandroid/icu/util/ULocale;->isRightToLeft()Z
-HSPLandroid/icu/util/ULocale;->lookupLikelySubtags(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->lscvToID(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->parseTagString(Ljava/lang/String;[Ljava/lang/String;)I
-HSPLandroid/icu/util/ULocale;->setKeywordValue(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/ULocale;
-HSPLandroid/icu/util/ULocale;->setKeywordValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->stripLeadingUnd(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/icu/util/ULocale;->toLocale()Ljava/util/Locale;
-HSPLandroid/icu/util/ULocale;->toString()Ljava/lang/String;
-HSPLandroid/icu/util/UResourceBundle;-><init>()V
-HSPLandroid/icu/util/UResourceBundle;->findTopLevel(Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/util/UResourceBundle;->get(I)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/util/UResourceBundle;->get(Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/util/UResourceBundle;->getBundleInstance(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/util/UResourceBundle;->getBundleInstance(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/util/UResourceBundle;->getBundleInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/util/UResourceBundle;->getBundleInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Z)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/util/UResourceBundle;->getIterator()Landroid/icu/util/UResourceBundleIterator;
-HSPLandroid/icu/util/UResourceBundle;->getRootType(Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/util/UResourceBundle$RootType;
-HSPLandroid/icu/util/UResourceBundle;->handleGetObject(Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroid/icu/util/UResourceBundle;->handleGetObjectImpl(Ljava/lang/String;Landroid/icu/util/UResourceBundle;)Ljava/lang/Object;
-HSPLandroid/icu/util/UResourceBundle;->instantiateBundle(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Z)Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/util/UResourceBundle;->resolveObject(Ljava/lang/String;Landroid/icu/util/UResourceBundle;)Ljava/lang/Object;
-HSPLandroid/icu/util/UResourceBundleIterator;-><init>(Landroid/icu/util/UResourceBundle;)V
-HSPLandroid/icu/util/UResourceBundleIterator;->hasNext()Z
-HSPLandroid/icu/util/UResourceBundleIterator;->next()Landroid/icu/util/UResourceBundle;
-HSPLandroid/icu/util/VersionInfo;->getMajor()I
-HSPLandroid/internal/modules/utils/build/SdkLevel;->isAtLeastPreReleaseCodename(Ljava/lang/String;)Z
-HSPLandroid/internal/modules/utils/build/SdkLevel;->isAtLeastV()Z
-HSPLandroid/location/Location$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
-HSPLandroid/location/Location$1;->createFromParcel(Landroid/os/Parcel;)Landroid/location/Location;
-HSPLandroid/location/Location$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/location/Location;-><init>(Landroid/location/Location;)V
-HSPLandroid/location/Location;-><init>(Ljava/lang/String;)V
-HSPLandroid/location/Location;->computeDistanceAndBearing(DDDDLandroid/location/Location$BearingDistanceCache;)V
-HSPLandroid/location/Location;->distanceTo(Landroid/location/Location;)F
-HSPLandroid/location/Location;->getAccuracy()F
-HSPLandroid/location/Location;->getAltitude()D
-HSPLandroid/location/Location;->getBearing()F
-HSPLandroid/location/Location;->getElapsedRealtimeMillis()J
-HSPLandroid/location/Location;->getElapsedRealtimeNanos()J
-HSPLandroid/location/Location;->getExtras()Landroid/os/Bundle;
-HSPLandroid/location/Location;->getLatitude()D
-HSPLandroid/location/Location;->getLongitude()D
-HSPLandroid/location/Location;->getProvider()Ljava/lang/String;
-HSPLandroid/location/Location;->getSpeed()F
-HSPLandroid/location/Location;->getTime()J
-HSPLandroid/location/Location;->getVerticalAccuracyMeters()F
-HSPLandroid/location/Location;->hasAccuracy()Z
-HSPLandroid/location/Location;->hasAltitude()Z
-HSPLandroid/location/Location;->hasBearing()Z
-HSPLandroid/location/Location;->hasBearingAccuracy()Z
-HSPLandroid/location/Location;->hasElapsedRealtimeUncertaintyNanos()Z
-HSPLandroid/location/Location;->hasSpeed()Z
-HSPLandroid/location/Location;->hasSpeedAccuracy()Z
-HSPLandroid/location/Location;->hasVerticalAccuracy()Z
-HSPLandroid/location/Location;->isFromMockProvider()Z
-HSPLandroid/location/Location;->isMock()Z
-HSPLandroid/location/Location;->set(Landroid/location/Location;)V
-HSPLandroid/location/Location;->setAccuracy(F)V
-HSPLandroid/location/Location;->setAltitude(D)V
-HSPLandroid/location/Location;->setBearing(F)V
-HSPLandroid/location/Location;->setBearingAccuracyDegrees(F)V
-HSPLandroid/location/Location;->setElapsedRealtimeNanos(J)V
-HSPLandroid/location/Location;->setExtras(Landroid/os/Bundle;)V
-HSPLandroid/location/Location;->setLatitude(D)V
-HSPLandroid/location/Location;->setLongitude(D)V
-HSPLandroid/location/Location;->setSpeed(F)V
-HSPLandroid/location/Location;->setSpeedAccuracyMetersPerSecond(F)V
-HSPLandroid/location/Location;->setTime(J)V
-HSPLandroid/location/Location;->setVerticalAccuracyMeters(F)V
-HSPLandroid/location/Location;->toString()Ljava/lang/String;
-HSPLandroid/location/Location;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/media/AudioAttributes$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/AudioAttributes;
-HSPLandroid/media/AudioAttributes$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/media/AudioAttributes$1;Landroid/media/AudioAttributes$1;
-HSPLandroid/media/AudioAttributes$Builder;-><init>()V
-HSPLandroid/media/AudioAttributes$Builder;-><init>(Landroid/media/AudioAttributes;)V
-HSPLandroid/media/AudioAttributes$Builder;->addTag(Ljava/lang/String;)Landroid/media/AudioAttributes$Builder;
-HSPLandroid/media/AudioAttributes$Builder;->build()Landroid/media/AudioAttributes;
-HSPLandroid/media/AudioAttributes$Builder;->replaceFlags(I)Landroid/media/AudioAttributes$Builder;
-HSPLandroid/media/AudioAttributes$Builder;->setAllowedCapturePolicy(I)Landroid/media/AudioAttributes$Builder;
-HSPLandroid/media/AudioAttributes$Builder;->setCapturePreset(I)Landroid/media/AudioAttributes$Builder;
-HSPLandroid/media/AudioAttributes$Builder;->setContentType(I)Landroid/media/AudioAttributes$Builder;
-HSPLandroid/media/AudioAttributes$Builder;->setFlags(I)Landroid/media/AudioAttributes$Builder;
-HSPLandroid/media/AudioAttributes$Builder;->setInternalCapturePreset(I)Landroid/media/AudioAttributes$Builder;
-HSPLandroid/media/AudioAttributes$Builder;->setInternalContentType(I)Landroid/media/AudioAttributes$Builder;
-HSPLandroid/media/AudioAttributes$Builder;->setInternalLegacyStreamType(I)Landroid/media/AudioAttributes$Builder;
-HSPLandroid/media/AudioAttributes$Builder;->setLegacyStreamType(I)Landroid/media/AudioAttributes$Builder;
-HSPLandroid/media/AudioAttributes$Builder;->setSystemUsage(I)Landroid/media/AudioAttributes$Builder;
-HSPLandroid/media/AudioAttributes$Builder;->setUsage(I)Landroid/media/AudioAttributes$Builder;
-HSPLandroid/media/AudioAttributes;->-$$Nest$fgetmFlags(Landroid/media/AudioAttributes;)I
-HSPLandroid/media/AudioAttributes;->-$$Nest$fgetmUsage(Landroid/media/AudioAttributes;)I
-HSPLandroid/media/AudioAttributes;->-$$Nest$fputmContentType(Landroid/media/AudioAttributes;I)V
-HSPLandroid/media/AudioAttributes;->-$$Nest$fputmFlags(Landroid/media/AudioAttributes;I)V
-HSPLandroid/media/AudioAttributes;->-$$Nest$fputmFormattedTags(Landroid/media/AudioAttributes;Ljava/lang/String;)V
-HSPLandroid/media/AudioAttributes;->-$$Nest$fputmSource(Landroid/media/AudioAttributes;I)V
-HSPLandroid/media/AudioAttributes;->-$$Nest$fputmTags(Landroid/media/AudioAttributes;Ljava/util/HashSet;)V
-HSPLandroid/media/AudioAttributes;->-$$Nest$fputmUsage(Landroid/media/AudioAttributes;I)V
-HSPLandroid/media/AudioAttributes;-><init>()V
-HSPLandroid/media/AudioAttributes;-><init>(Landroid/media/AudioAttributes-IA;)V
-HSPLandroid/media/AudioAttributes;-><init>(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/media/AudioAttributes;->areHapticChannelsMuted()Z
-HSPLandroid/media/AudioAttributes;->equals(Ljava/lang/Object;)Z
-HSPLandroid/media/AudioAttributes;->getAllFlags()I
-HSPLandroid/media/AudioAttributes;->getContentType()I
-HSPLandroid/media/AudioAttributes;->getFlags()I
-HSPLandroid/media/AudioAttributes;->getUsage()I
-HSPLandroid/media/AudioAttributes;->hashCode()I
-HSPLandroid/media/AudioAttributes;->isSystemUsage(I)Z
-HSPLandroid/media/AudioAttributes;->toVolumeStreamType(ZLandroid/media/AudioAttributes;)I
-HSPLandroid/media/AudioAttributes;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/media/AudioDeviceCallback;-><init>()V
-HSPLandroid/media/AudioDeviceInfo;-><init>(Landroid/media/AudioDevicePort;)V
-HSPLandroid/media/AudioDeviceInfo;->convertInternalDeviceToDeviceType(I)I
-HSPLandroid/media/AudioDeviceInfo;->getId()I
-HSPLandroid/media/AudioDeviceInfo;->getType()I
-HSPLandroid/media/AudioDevicePort;-><init>(Landroid/media/AudioHandle;Ljava/lang/String;Ljava/util/List;[Landroid/media/AudioGain;ILjava/lang/String;[I[ILjava/util/List;)V
-HSPLandroid/media/AudioDevicePort;-><init>(Landroid/media/AudioHandle;Ljava/lang/String;[I[I[I[I[Landroid/media/AudioGain;ILjava/lang/String;[I[I)V
-HSPLandroid/media/AudioDevicePort;->buildConfig(IIILandroid/media/AudioGainConfig;)Landroid/media/AudioDevicePortConfig;
-HSPLandroid/media/AudioDevicePort;->buildConfig(IIILandroid/media/AudioGainConfig;)Landroid/media/AudioPortConfig;
-HSPLandroid/media/AudioDevicePort;->type()I
-HSPLandroid/media/AudioDevicePortConfig;-><init>(Landroid/media/AudioDevicePort;IIILandroid/media/AudioGainConfig;)V
-HSPLandroid/media/AudioFocusRequest$Builder;-><init>(I)V
-HSPLandroid/media/AudioFocusRequest$Builder;->build()Landroid/media/AudioFocusRequest;
-HSPLandroid/media/AudioFocusRequest$Builder;->setAudioAttributes(Landroid/media/AudioAttributes;)Landroid/media/AudioFocusRequest$Builder;
-HSPLandroid/media/AudioFocusRequest$Builder;->setFocusGain(I)Landroid/media/AudioFocusRequest$Builder;
-HSPLandroid/media/AudioFocusRequest;->getOnAudioFocusChangeListener()Landroid/media/AudioManager$OnAudioFocusChangeListener;
-HSPLandroid/media/AudioFocusRequest;->isValidFocusGain(I)Z
-HSPLandroid/media/AudioFormat$Builder;-><init>()V
-HSPLandroid/media/AudioFormat$Builder;->build()Landroid/media/AudioFormat;
-HSPLandroid/media/AudioFormat$Builder;->setChannelMask(I)Landroid/media/AudioFormat$Builder;
-HSPLandroid/media/AudioFormat$Builder;->setEncoding(I)Landroid/media/AudioFormat$Builder;
-HSPLandroid/media/AudioFormat$Builder;->setSampleRate(I)Landroid/media/AudioFormat$Builder;
-HSPLandroid/media/AudioFormat;-><init>(IIIII)V
-HSPLandroid/media/AudioFormat;->getBytesPerSample(I)I
-HSPLandroid/media/AudioFormat;->getChannelCount()I
-HSPLandroid/media/AudioFormat;->getChannelMask()I
-HSPLandroid/media/AudioFormat;->getEncoding()I
-HSPLandroid/media/AudioFormat;->getPropertySetMask()I
-HSPLandroid/media/AudioFormat;->getSampleRate()I
-HSPLandroid/media/AudioFormat;->isEncodingLinearFrames(I)Z
-HSPLandroid/media/AudioFormat;->isEncodingLinearPcm(I)Z
-HSPLandroid/media/AudioFormat;->isPublicEncoding(I)Z
-HSPLandroid/media/AudioHandle;-><init>(I)V
-HSPLandroid/media/AudioHandle;->equals(Ljava/lang/Object;)Z
-HSPLandroid/media/AudioHandle;->id()I
-HSPLandroid/media/AudioManager$1;-><init>(Landroid/media/AudioManager;)V
-HSPLandroid/media/AudioManager$2;-><init>(Landroid/media/AudioManager;)V
-HSPLandroid/media/AudioManager$3;-><init>(Landroid/media/AudioManager;)V
-HSPLandroid/media/AudioManager$4;-><init>(Landroid/media/AudioManager;)V
-HSPLandroid/media/AudioManager$AudioPlaybackCallback;-><init>()V
-HSPLandroid/media/AudioManager$AudioPlaybackCallbackInfo;-><init>(Landroid/media/AudioManager$AudioPlaybackCallback;Landroid/os/Handler;)V
-HSPLandroid/media/AudioManager$AudioRecordingCallback;-><init>()V
-HSPLandroid/media/AudioManager$DevRoleListeners;-><init>(Landroid/media/AudioManager;)V
-HSPLandroid/media/AudioManager$DevRoleListeners;-><init>(Landroid/media/AudioManager;Landroid/media/AudioManager$DevRoleListeners-IA;)V
-HSPLandroid/media/AudioManager$NativeEventHandlerDelegate$1;-><init>(Landroid/media/AudioManager$NativeEventHandlerDelegate;Landroid/os/Looper;Landroid/media/AudioManager;Landroid/media/AudioDeviceCallback;)V
-HSPLandroid/media/AudioManager$NativeEventHandlerDelegate$1;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/media/AudioManager$NativeEventHandlerDelegate;-><init>(Landroid/media/AudioManager;Landroid/media/AudioDeviceCallback;Landroid/os/Handler;)V
-HSPLandroid/media/AudioManager$NativeEventHandlerDelegate;->getHandler()Landroid/os/Handler;
-HSPLandroid/media/AudioManager$OnAmPortUpdateListener;-><init>(Landroid/media/AudioManager;)V
-HSPLandroid/media/AudioManager$OnAmPortUpdateListener;->onAudioPatchListUpdate([Landroid/media/AudioPatch;)V
-HSPLandroid/media/AudioManager$OnAmPortUpdateListener;->onAudioPortListUpdate([Landroid/media/AudioPort;)V
-HSPLandroid/media/AudioManager$PlaybackConfigChangeCallbackData;-><init>(Landroid/media/AudioManager$AudioPlaybackCallback;Ljava/util/List;)V
-HSPLandroid/media/AudioManager$ServiceEventHandlerDelegate$1;-><init>(Landroid/media/AudioManager$ServiceEventHandlerDelegate;Landroid/os/Looper;Landroid/media/AudioManager;)V
-HSPLandroid/media/AudioManager$ServiceEventHandlerDelegate$1;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/media/AudioManager$ServiceEventHandlerDelegate;-><init>(Landroid/media/AudioManager;Landroid/os/Handler;)V
-HSPLandroid/media/AudioManager$ServiceEventHandlerDelegate;->getHandler()Landroid/os/Handler;
-HSPLandroid/media/AudioManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/media/AudioManager;->abandonAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;)I
-HSPLandroid/media/AudioManager;->abandonAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;Landroid/media/AudioAttributes;)I
-HSPLandroid/media/AudioManager;->areNavigationRepeatSoundEffectsEnabled()Z
-HSPLandroid/media/AudioManager;->broadcastDeviceListChange_sync(Landroid/os/Handler;)V
-HSPLandroid/media/AudioManager;->calcListDeltas(Ljava/util/ArrayList;Ljava/util/ArrayList;I)[Landroid/media/AudioDeviceInfo;
-HSPLandroid/media/AudioManager;->checkFlags(Landroid/media/AudioDevicePort;I)Z
-HSPLandroid/media/AudioManager;->checkTypes(Landroid/media/AudioDevicePort;)Z
-HSPLandroid/media/AudioManager;->filterDevicePorts(Ljava/util/ArrayList;Ljava/util/ArrayList;)V
-HSPLandroid/media/AudioManager;->generateAudioSessionId()I
-HSPLandroid/media/AudioManager;->getActiveRecordingConfigurations()Ljava/util/List;
-HSPLandroid/media/AudioManager;->getContext()Landroid/content/Context;
-HSPLandroid/media/AudioManager;->getDeviceForPortId(II)Landroid/media/AudioDeviceInfo;
-HSPLandroid/media/AudioManager;->getDevices(I)[Landroid/media/AudioDeviceInfo;
-HSPLandroid/media/AudioManager;->getDevicesForStream(I)I
-HSPLandroid/media/AudioManager;->getDevicesStatic(I)[Landroid/media/AudioDeviceInfo;
-HSPLandroid/media/AudioManager;->getIdForAudioFocusListener(Landroid/media/AudioManager$OnAudioFocusChangeListener;)Ljava/lang/String;
-HSPLandroid/media/AudioManager;->getMode()I
-HSPLandroid/media/AudioManager;->getProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/media/AudioManager;->getRingerMode()I
-HSPLandroid/media/AudioManager;->getRingerModeInternal()I
-HSPLandroid/media/AudioManager;->getService()Landroid/media/IAudioService;
-HSPLandroid/media/AudioManager;->getStreamMaxVolume(I)I
-HSPLandroid/media/AudioManager;->getStreamMinVolume(I)I
-HSPLandroid/media/AudioManager;->getStreamMinVolumeInt(I)I
-HSPLandroid/media/AudioManager;->getStreamVolume(I)I
-HSPLandroid/media/AudioManager;->hasPlaybackCallback_sync(Landroid/media/AudioManager$AudioPlaybackCallback;)Z
-HSPLandroid/media/AudioManager;->hasRecordCallback_sync(Landroid/media/AudioManager$AudioRecordingCallback;)Z
-HSPLandroid/media/AudioManager;->infoListFromPortList(Ljava/util/ArrayList;I)[Landroid/media/AudioDeviceInfo;
-HSPLandroid/media/AudioManager;->isBluetoothA2dpOn()Z
-HSPLandroid/media/AudioManager;->isBluetoothScoOn()Z
-HSPLandroid/media/AudioManager;->isInputDevice(I)Z
-HSPLandroid/media/AudioManager;->isMusicActive()Z
-HSPLandroid/media/AudioManager;->isPublicStreamType(I)Z
-HSPLandroid/media/AudioManager;->isSpeakerphoneOn()Z
-HSPLandroid/media/AudioManager;->isStreamMute(I)Z
-HSPLandroid/media/AudioManager;->isVolumeFixed()Z
-HSPLandroid/media/AudioManager;->isWiredHeadsetOn()Z
-HSPLandroid/media/AudioManager;->listAudioDevicePorts(Ljava/util/ArrayList;)I
-HSPLandroid/media/AudioManager;->playSoundEffect(I)V
-HSPLandroid/media/AudioManager;->playSoundEffect(II)V
-HSPLandroid/media/AudioManager;->preDispatchKeyEvent(Landroid/view/KeyEvent;I)V
-HSPLandroid/media/AudioManager;->registerAudioDeviceCallback(Landroid/media/AudioDeviceCallback;Landroid/os/Handler;)V
-HSPLandroid/media/AudioManager;->registerAudioFocusRequest(Landroid/media/AudioFocusRequest;)V
-HSPLandroid/media/AudioManager;->registerAudioPlaybackCallback(Landroid/media/AudioManager$AudioPlaybackCallback;Landroid/os/Handler;)V
-HSPLandroid/media/AudioManager;->registerAudioPortUpdateListener(Landroid/media/AudioManager$OnAudioPortUpdateListener;)V
-HSPLandroid/media/AudioManager;->registerAudioRecordingCallback(Landroid/media/AudioManager$AudioRecordingCallback;Landroid/os/Handler;)V
-HSPLandroid/media/AudioManager;->requestAudioFocus(Landroid/media/AudioFocusRequest;Landroid/media/audiopolicy/AudioPolicy;)I
-HSPLandroid/media/AudioManager;->requestAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;II)I
-HSPLandroid/media/AudioManager;->requestAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;Landroid/media/AudioAttributes;II)I
-HSPLandroid/media/AudioManager;->requestAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;Landroid/media/AudioAttributes;IILandroid/media/audiopolicy/AudioPolicy;)I
-HSPLandroid/media/AudioManager;->resetAudioPortGeneration()I
-HSPLandroid/media/AudioManager;->setContext(Landroid/content/Context;)V
-HSPLandroid/media/AudioManager;->setParameters(Ljava/lang/String;)V
-HSPLandroid/media/AudioManager;->unregisterAudioFocusRequest(Landroid/media/AudioManager$OnAudioFocusChangeListener;)V
-HSPLandroid/media/AudioManager;->updateAudioPortCache(Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;)I
-HSPLandroid/media/AudioManager;->updatePortConfig(Landroid/media/AudioPortConfig;Ljava/util/ArrayList;)Landroid/media/AudioPortConfig;
-HSPLandroid/media/AudioMixPort;-><init>(Landroid/media/AudioHandle;IILjava/lang/String;Ljava/util/List;[Landroid/media/AudioGain;)V
-HSPLandroid/media/AudioMixPort;-><init>(Landroid/media/AudioHandle;IILjava/lang/String;[I[I[I[I[Landroid/media/AudioGain;)V
-HSPLandroid/media/AudioMixPort;->buildConfig(IIILandroid/media/AudioGainConfig;)Landroid/media/AudioMixPortConfig;
-HSPLandroid/media/AudioMixPort;->buildConfig(IIILandroid/media/AudioGainConfig;)Landroid/media/AudioPortConfig;
-HSPLandroid/media/AudioMixPortConfig;-><init>(Landroid/media/AudioMixPort;IIILandroid/media/AudioGainConfig;)V
-HSPLandroid/media/AudioPatch;-><init>(Landroid/media/AudioHandle;[Landroid/media/AudioPortConfig;[Landroid/media/AudioPortConfig;)V
-HSPLandroid/media/AudioPatch;->sinks()[Landroid/media/AudioPortConfig;
-HSPLandroid/media/AudioPatch;->sources()[Landroid/media/AudioPortConfig;
-HSPLandroid/media/AudioPlaybackConfiguration$IPlayerShell;-><init>(Landroid/media/AudioPlaybackConfiguration;Landroid/media/IPlayer;)V
-HSPLandroid/media/AudioPlaybackConfiguration;->getAudioAttributes()Landroid/media/AudioAttributes;
-HSPLandroid/media/AudioPlaybackConfiguration;->isActive()Z
-HSPLandroid/media/AudioPort$$ExternalSyntheticLambda0;->applyAsInt(Ljava/lang/Object;)I
-HSPLandroid/media/AudioPort;-><init>(Landroid/media/AudioHandle;ILjava/lang/String;Ljava/util/List;[Landroid/media/AudioGain;Ljava/util/List;)V+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/stream/Stream;Ljava/util/stream/IntPipeline$4;,Ljava/util/stream/ReferencePipeline$Head;]Ljava/util/stream/IntStream;Ljava/util/stream/IntPipeline$Head;,Ljava/util/stream/ReferencePipeline$4;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/media/AudioProfile;Landroid/media/AudioProfile;]Ljava/util/Set;Ljava/util/HashSet;
-HSPLandroid/media/AudioPort;-><init>(Landroid/media/AudioHandle;ILjava/lang/String;[I[I[I[I[Landroid/media/AudioGain;)V
-HSPLandroid/media/AudioPort;->handle()Landroid/media/AudioHandle;
-HSPLandroid/media/AudioPort;->id()I
-HSPLandroid/media/AudioPort;->role()I
-HSPLandroid/media/AudioPortConfig;-><init>(Landroid/media/AudioPort;IIILandroid/media/AudioGainConfig;)V
-HSPLandroid/media/AudioPortConfig;->channelMask()I
-HSPLandroid/media/AudioPortConfig;->format()I
-HSPLandroid/media/AudioPortConfig;->gain()Landroid/media/AudioGainConfig;
-HSPLandroid/media/AudioPortConfig;->port()Landroid/media/AudioPort;
-HSPLandroid/media/AudioPortConfig;->samplingRate()I
-HSPLandroid/media/AudioPortEventHandler$1;-><init>(Landroid/media/AudioPortEventHandler;Landroid/os/Looper;)V
-HSPLandroid/media/AudioPortEventHandler$1;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/media/AudioPortEventHandler;->handler()Landroid/os/Handler;
-HSPLandroid/media/AudioPortEventHandler;->init()V
-HSPLandroid/media/AudioPortEventHandler;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V
-HSPLandroid/media/AudioPortEventHandler;->registerListener(Landroid/media/AudioManager$OnAudioPortUpdateListener;)V
-HSPLandroid/media/AudioProfile;-><init>(I[I[I[II)V
-HSPLandroid/media/AudioProfile;->getChannelIndexMasks()[I
-HSPLandroid/media/AudioProfile;->getChannelMasks()[I
-HSPLandroid/media/AudioProfile;->getFormat()I
-HSPLandroid/media/AudioProfile;->getSampleRates()[I
-HSPLandroid/media/AudioRecord;-><init>(Landroid/media/AudioAttributes;Landroid/media/AudioFormat;II)V
-HSPLandroid/media/AudioRecord;->audioBuffSizeCheck(I)V
-HSPLandroid/media/AudioRecord;->audioParamCheck(III)V
-HSPLandroid/media/AudioRecord;->getChannelMaskFromLegacyConfig(IZ)I
-HSPLandroid/media/AudioRecord;->getMinBufferSize(III)I
-HSPLandroid/media/AudioRecord;->release()V
-HSPLandroid/media/AudioRecord;->stop()V
-HSPLandroid/media/AudioRoutesInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/AudioRoutesInfo;
-HSPLandroid/media/AudioRoutesInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/media/AudioRoutesInfo;-><init>()V
-HSPLandroid/media/AudioRoutesInfo;->toString()Ljava/lang/String;
-HSPLandroid/media/AudioRoutesInfo;->typeToString(I)Ljava/lang/String;
-HSPLandroid/media/AudioSystem;->getOutputDeviceName(I)Ljava/lang/String;
-HSPLandroid/media/AudioSystem;->getPlatformType(Landroid/content/Context;)I
-HSPLandroid/media/AudioSystem;->isSingleVolume(Landroid/content/Context;)Z
-HSPLandroid/media/AudioSystem;->streamToString(I)Ljava/lang/String;
-HSPLandroid/media/AudioTimestamp;-><init>()V
-HSPLandroid/media/AudioTrack;-><init>(Landroid/media/AudioAttributes;Landroid/media/AudioFormat;III)V
-HSPLandroid/media/AudioTrack;->audioBuffSizeCheck(I)V
-HSPLandroid/media/AudioTrack;->audioParamCheck(IIIII)V
-HSPLandroid/media/AudioTrack;->blockUntilOffloadDrain(I)Z
-HSPLandroid/media/AudioTrack;->broadcastRoutingChange()V
-HSPLandroid/media/AudioTrack;->endStreamEventHandling()V
-HSPLandroid/media/AudioTrack;->finalize()V
-HSPLandroid/media/AudioTrack;->flush()V
-HSPLandroid/media/AudioTrack;->getMinBufferSize(III)I
-HSPLandroid/media/AudioTrack;->getPlayState()I
-HSPLandroid/media/AudioTrack;->getRoutedDevice()Landroid/media/AudioDeviceInfo;
-HSPLandroid/media/AudioTrack;->getSampleRate()I
-HSPLandroid/media/AudioTrack;->getState()I
-HSPLandroid/media/AudioTrack;->play()V
-HSPLandroid/media/AudioTrack;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V
-HSPLandroid/media/AudioTrack;->release()V
-HSPLandroid/media/AudioTrack;->shouldEnablePowerSaving(Landroid/media/AudioAttributes;Landroid/media/AudioFormat;II)Z
-HSPLandroid/media/AudioTrack;->startImpl()V
-HSPLandroid/media/AudioTrack;->stop()V
-HSPLandroid/media/AudioTrack;->testDisableNativeRoutingCallbacksLocked()V
-HSPLandroid/media/AudioTrack;->tryToDisableNativeRoutingCallback()V
-HSPLandroid/media/CallbackUtil$LazyListenerManager;-><init>()V
-HSPLandroid/media/IAudioFocusDispatcher$Stub;-><init>()V
-HSPLandroid/media/IAudioFocusDispatcher$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/IAudioRoutesObserver$Stub;-><init>()V
-HSPLandroid/media/IAudioRoutesObserver$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/IAudioRoutesObserver$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/media/IAudioServerStateDispatcher$Stub;-><init>()V
-HSPLandroid/media/IAudioService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/media/IAudioService$Stub$Proxy;->abandonAudioFocus(Landroid/media/IAudioFocusDispatcher;Ljava/lang/String;Landroid/media/AudioAttributes;Ljava/lang/String;)I
-HSPLandroid/media/IAudioService$Stub$Proxy;->areNavigationRepeatSoundEffectsEnabled()Z
-HSPLandroid/media/IAudioService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/IAudioService$Stub$Proxy;->getActiveRecordingConfigurations()Ljava/util/List;
-HSPLandroid/media/IAudioService$Stub$Proxy;->getMode()I
-HSPLandroid/media/IAudioService$Stub$Proxy;->getRingerModeExternal()I
-HSPLandroid/media/IAudioService$Stub$Proxy;->getStreamMaxVolume(I)I
-HSPLandroid/media/IAudioService$Stub$Proxy;->getStreamMinVolume(I)I
-HSPLandroid/media/IAudioService$Stub$Proxy;->getStreamVolume(I)I
-HSPLandroid/media/IAudioService$Stub$Proxy;->isBluetoothA2dpOn()Z
-HSPLandroid/media/IAudioService$Stub$Proxy;->isBluetoothScoOn()Z
-HSPLandroid/media/IAudioService$Stub$Proxy;->isCameraSoundForced()Z
-HSPLandroid/media/IAudioService$Stub$Proxy;->isMusicActive(Z)Z
-HSPLandroid/media/IAudioService$Stub$Proxy;->isStreamMute(I)Z
-HSPLandroid/media/IAudioService$Stub$Proxy;->isVolumeFixed()Z
-HSPLandroid/media/IAudioService$Stub$Proxy;->playSoundEffect(II)V
-HSPLandroid/media/IAudioService$Stub$Proxy;->playerAttributes(ILandroid/media/AudioAttributes;)V
-HSPLandroid/media/IAudioService$Stub$Proxy;->playerEvent(III)V
-HSPLandroid/media/IAudioService$Stub$Proxy;->registerRecordingCallback(Landroid/media/IRecordingConfigDispatcher;)V
-HSPLandroid/media/IAudioService$Stub$Proxy;->releasePlayer(I)V
-HSPLandroid/media/IAudioService$Stub$Proxy;->requestAudioFocus(Landroid/media/AudioAttributes;ILandroid/os/IBinder;Landroid/media/IAudioFocusDispatcher;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/media/audiopolicy/IAudioPolicyCallback;I)I
-HSPLandroid/media/IAudioService$Stub$Proxy;->startWatchingRoutes(Landroid/media/IAudioRoutesObserver;)Landroid/media/AudioRoutesInfo;
-HSPLandroid/media/IAudioService$Stub$Proxy;->trackPlayer(Landroid/media/PlayerBase$PlayerIdCard;)I
-HSPLandroid/media/IAudioService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IAudioService;
-HSPLandroid/media/IMediaRouter2Manager$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/IMediaRouter2Manager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/media/IMediaRouterClient$Stub;-><init>()V
-HSPLandroid/media/IMediaRouterClient$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/IMediaRouterClient$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/media/IMediaRouterService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/IMediaRouterService$Stub$Proxy;->getState(Landroid/media/IMediaRouterClient;)Landroid/media/MediaRouterClientState;
-HSPLandroid/media/IMediaRouterService$Stub$Proxy;->isPlaybackActive(Landroid/media/IMediaRouterClient;)Z
-HSPLandroid/media/IMediaRouterService$Stub$Proxy;->registerClientAsUser(Landroid/media/IMediaRouterClient;Ljava/lang/String;I)V
-HSPLandroid/media/IMediaRouterService$Stub$Proxy;->setDiscoveryRequest(Landroid/media/IMediaRouterClient;IZ)V
-HSPLandroid/media/IMediaRouterService$Stub$Proxy;->setSelectedRoute(Landroid/media/IMediaRouterClient;Ljava/lang/String;Z)V
-HSPLandroid/media/IMediaRouterService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaRouterService;
-HSPLandroid/media/IPlaybackConfigDispatcher$Stub;-><init>()V
-HSPLandroid/media/IPlaybackConfigDispatcher$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/IPlayer$Stub;-><init>()V
-HSPLandroid/media/IPlayer$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/IPlayer$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IPlayer;
-HSPLandroid/media/IRecordingConfigDispatcher$Stub;-><init>()V
-HSPLandroid/media/IRecordingConfigDispatcher$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/IRemoteSessionCallback$Stub;-><init>()V
-HSPLandroid/media/IRemoteVolumeObserver$Stub;-><init>()V
-HSPLandroid/media/MediaCodec$BufferInfo;-><init>()V
-HSPLandroid/media/MediaCodec$BufferInfo;->set(IIJI)V
-HSPLandroid/media/MediaCodec$BufferMap$CodecBuffer;->free()V
-HSPLandroid/media/MediaCodec$BufferMap$CodecBuffer;->setByteBuffer(Ljava/nio/ByteBuffer;)V
-HSPLandroid/media/MediaCodec$BufferMap;-><init>()V
-HSPLandroid/media/MediaCodec$BufferMap;-><init>(Landroid/media/MediaCodec$BufferMap-IA;)V
-HSPLandroid/media/MediaCodec$BufferMap;->clear()V
-HSPLandroid/media/MediaCodec$BufferMap;->put(ILjava/nio/ByteBuffer;)V+]Landroid/media/MediaCodec$BufferMap$CodecBuffer;Landroid/media/MediaCodec$BufferMap$CodecBuffer;]Ljava/util/Map;Ljava/util/HashMap;
-HSPLandroid/media/MediaCodec$BufferMap;->remove(I)V+]Landroid/media/MediaCodec$BufferMap$CodecBuffer;Landroid/media/MediaCodec$BufferMap$CodecBuffer;]Ljava/util/Map;Ljava/util/HashMap;
-HSPLandroid/media/MediaCodec$CryptoInfo$Pattern;-><init>(II)V
-HSPLandroid/media/MediaCodec$CryptoInfo$Pattern;->set(II)V
-HSPLandroid/media/MediaCodec$CryptoInfo;-><init>()V
-HSPLandroid/media/MediaCodec$EventHandler;-><init>(Landroid/media/MediaCodec;Landroid/media/MediaCodec;Landroid/os/Looper;)V
-HSPLandroid/media/MediaCodec;-><clinit>()V
-HSPLandroid/media/MediaCodec;-><init>(Ljava/lang/String;ZZ)V
-HSPLandroid/media/MediaCodec;-><init>(Ljava/lang/String;ZZII)V
-HSPLandroid/media/MediaCodec;->configure(Landroid/media/MediaFormat;Landroid/view/Surface;Landroid/media/MediaCrypto;I)V
-HSPLandroid/media/MediaCodec;->configure(Landroid/media/MediaFormat;Landroid/view/Surface;Landroid/media/MediaCrypto;Landroid/os/IHwBinder;I)V
-HSPLandroid/media/MediaCodec;->createByCodecName(Ljava/lang/String;)Landroid/media/MediaCodec;
-HSPLandroid/media/MediaCodec;->dequeueInputBuffer(J)I
-HSPLandroid/media/MediaCodec;->dequeueOutputBuffer(Landroid/media/MediaCodec$BufferInfo;J)I+]Landroid/media/MediaCodec$BufferInfo;Landroid/media/MediaCodec$BufferInfo;]Ljava/util/Map;Ljava/util/HashMap;
-HSPLandroid/media/MediaCodec;->finalize()V
-HSPLandroid/media/MediaCodec;->freeAllTrackedBuffers()V
-HSPLandroid/media/MediaCodec;->getInputBuffer(I)Ljava/nio/ByteBuffer;+]Landroid/media/MediaCodec$BufferMap;Landroid/media/MediaCodec$BufferMap;
-HSPLandroid/media/MediaCodec;->getOutputBuffer(I)Ljava/nio/ByteBuffer;+]Landroid/media/MediaCodec$BufferMap;Landroid/media/MediaCodec$BufferMap;
-HSPLandroid/media/MediaCodec;->getOutputFormat()Landroid/media/MediaFormat;
-HSPLandroid/media/MediaCodec;->lockAndGetContext()J+]Ljava/util/concurrent/locks/Lock;Ljava/util/concurrent/locks/ReentrantLock;
-HSPLandroid/media/MediaCodec;->queueInputBuffer(IIIJI)V+]Landroid/media/MediaCodec$BufferMap;Landroid/media/MediaCodec$BufferMap;
-HSPLandroid/media/MediaCodec;->release()V
-HSPLandroid/media/MediaCodec;->releaseOutputBuffer(IZ)V
-HSPLandroid/media/MediaCodec;->releaseOutputBufferInternal(IZZJ)V+]Landroid/media/MediaCodec$BufferMap;Landroid/media/MediaCodec$BufferMap;]Ljava/util/Map;Ljava/util/HashMap;
-HSPLandroid/media/MediaCodec;->setAndUnlockContext(J)V+]Ljava/util/concurrent/locks/Lock;Ljava/util/concurrent/locks/ReentrantLock;
-HSPLandroid/media/MediaCodec;->start()V
-HSPLandroid/media/MediaCodec;->stop()V
-HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->applyLevelLimits()V
-HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->applyLimits([Landroid/util/Range;Landroid/util/Range;)V
-HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->createDiscreteSampleRates()V
-HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->getDefaultFormat(Landroid/media/MediaFormat;)V
-HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->getMaxInputChannelCount()I
-HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->initWithPlatformLimits()V
-HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->isSampleRateSupported(I)Z
-HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->limitSampleRates([I)V
-HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->limitSampleRates([Landroid/util/Range;)V
-HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->parseFromInfo(Landroid/media/MediaFormat;)V
-HSPLandroid/media/MediaCodecInfo$CodecCapabilities;-><init>([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZLandroid/media/MediaFormat;Landroid/media/MediaFormat;)V
-HSPLandroid/media/MediaCodecInfo$CodecCapabilities;-><init>([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZLjava/util/Map;Ljava/util/Map;)V
-HSPLandroid/media/MediaCodecInfo$CodecCapabilities;->checkFeature(Ljava/lang/String;I)Z
-HSPLandroid/media/MediaCodecInfo$CodecCapabilities;->dup()Landroid/media/MediaCodecInfo$CodecCapabilities;
-HSPLandroid/media/MediaCodecInfo$CodecCapabilities;->getAudioCapabilities()Landroid/media/MediaCodecInfo$AudioCapabilities;
-HSPLandroid/media/MediaCodecInfo$CodecCapabilities;->getMimeType()Ljava/lang/String;
-HSPLandroid/media/MediaCodecInfo$CodecCapabilities;->getVideoCapabilities()Landroid/media/MediaCodecInfo$VideoCapabilities;
-HSPLandroid/media/MediaCodecInfo$CodecCapabilities;->isFeatureRequired(Ljava/lang/String;)Z
-HSPLandroid/media/MediaCodecInfo$CodecCapabilities;->isFeatureSupported(Ljava/lang/String;)Z
-HSPLandroid/media/MediaCodecInfo$EncoderCapabilities;->applyLevelLimits()V
-HSPLandroid/media/MediaCodecInfo$EncoderCapabilities;->getDefaultFormat(Landroid/media/MediaFormat;)V
-HSPLandroid/media/MediaCodecInfo$EncoderCapabilities;->parseFromInfo(Landroid/media/MediaFormat;)V
-HSPLandroid/media/MediaCodecInfo$LazyHolder;->-$$Nest$sfgetSIZE_RANGE()Landroid/util/Range;
-HSPLandroid/media/MediaCodecInfo$LazyHolder;-><clinit>()V
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities$PerformancePoint;-><init>(IIIILandroid/util/Size;)V
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities$PerformancePoint;-><init>(Landroid/media/MediaCodecInfo$VideoCapabilities$PerformancePoint;Landroid/util/Size;)V
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities$PerformancePoint;->covers(Landroid/media/MediaCodecInfo$VideoCapabilities$PerformancePoint;)Z
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities$PerformancePoint;->getCommonBlockSize(Landroid/media/MediaCodecInfo$VideoCapabilities$PerformancePoint;)Landroid/util/Size;
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities;->applyAlignment(II)V
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities;->applyBlockLimits(IILandroid/util/Range;Landroid/util/Range;Landroid/util/Range;)V
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities;->applyLevelLimits()V
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities;->applyMacroBlockLimits(IIIIIJIIII)V
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities;->applyMacroBlockLimits(IIIJIIII)V
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities;->getMeasuredFrameRates(Ljava/util/Map;)Ljava/util/Map;
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities;->getPerformancePoints(Ljava/util/Map;)Ljava/util/List;
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities;->initWithPlatformLimits()V
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities;->lambda$getPerformancePoints$0(Landroid/media/MediaCodecInfo$VideoCapabilities$PerformancePoint;Landroid/media/MediaCodecInfo$VideoCapabilities$PerformancePoint;)I
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities;->parseFromInfo(Landroid/media/MediaFormat;)V
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities;->parseWidthHeightRanges(Ljava/lang/Object;)Landroid/util/Pair;
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities;->supports(Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Number;)Z
-HSPLandroid/media/MediaCodecInfo$VideoCapabilities;->updateLimits()V
-HSPLandroid/media/MediaCodecInfo;-><init>(Ljava/lang/String;Ljava/lang/String;I[Landroid/media/MediaCodecInfo$CodecCapabilities;)V
-HSPLandroid/media/MediaCodecInfo;->checkPowerOfTwo(ILjava/lang/String;)I
-HSPLandroid/media/MediaCodecInfo;->getCapabilitiesForType(Ljava/lang/String;)Landroid/media/MediaCodecInfo$CodecCapabilities;
-HSPLandroid/media/MediaCodecInfo;->getName()Ljava/lang/String;
-HSPLandroid/media/MediaCodecInfo;->getSupportedTypes()[Ljava/lang/String;
-HSPLandroid/media/MediaCodecInfo;->isEncoder()Z
-HSPLandroid/media/MediaCodecInfo;->isHardwareAccelerated()Z
-HSPLandroid/media/MediaCodecInfo;->isSoftwareOnly()Z
-HSPLandroid/media/MediaCodecInfo;->isVendor()Z
-HSPLandroid/media/MediaCodecInfo;->makeRegular()Landroid/media/MediaCodecInfo;
-HSPLandroid/media/MediaCodecList;-><init>(I)V
-HSPLandroid/media/MediaCodecList;->getCodecInfos()[Landroid/media/MediaCodecInfo;
-HSPLandroid/media/MediaCodecList;->getGlobalSettings()Ljava/util/Map;
-HSPLandroid/media/MediaCodecList;->getNewCodecInfoAt(I)Landroid/media/MediaCodecInfo;
-HSPLandroid/media/MediaCodecList;->initCodecList()V
-HSPLandroid/media/MediaDescription$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/MediaDescription;
-HSPLandroid/media/MediaDescription$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/media/MediaDescription;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/media/MediaDescription;-><init>(Ljava/lang/String;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/graphics/Bitmap;Landroid/net/Uri;Landroid/os/Bundle;Landroid/net/Uri;)V
-HSPLandroid/media/MediaDescription;->toString()Ljava/lang/String;
-HSPLandroid/media/MediaFormat;-><init>()V
-HSPLandroid/media/MediaFormat;-><init>(Ljava/util/Map;)V
-HSPLandroid/media/MediaFormat;->containsKey(Ljava/lang/String;)Z
-HSPLandroid/media/MediaFormat;->createVideoFormat(Ljava/lang/String;II)Landroid/media/MediaFormat;
-HSPLandroid/media/MediaFormat;->getInteger(Ljava/lang/String;)I
-HSPLandroid/media/MediaFormat;->getString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/media/MediaFormat;->setFloat(Ljava/lang/String;F)V
-HSPLandroid/media/MediaFormat;->setInteger(Ljava/lang/String;I)V
-HSPLandroid/media/MediaFormat;->setString(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/media/MediaFrameworkPlatformInitializer$$ExternalSyntheticLambda0;->createService(Landroid/content/Context;)Ljava/lang/Object;
-HSPLandroid/media/MediaFrameworkPlatformInitializer;->getMediaServiceManager()Landroid/media/MediaServiceManager;
-HSPLandroid/media/MediaFrameworkPlatformInitializer;->lambda$registerServiceWrappers$0(Landroid/content/Context;)Landroid/media/session/MediaSessionManager;
-HSPLandroid/media/MediaFrameworkPlatformInitializer;->setMediaServiceManager(Landroid/media/MediaServiceManager;)V
-HSPLandroid/media/MediaMetadata$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/MediaMetadata;
-HSPLandroid/media/MediaMetadata$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/media/MediaMetadata$Builder;-><init>(Landroid/media/MediaMetadata;)V
-HSPLandroid/media/MediaMetadata$Builder;->build()Landroid/media/MediaMetadata;
-HSPLandroid/media/MediaMetadata$Builder;->setBitmapDimensionLimit(I)Landroid/media/MediaMetadata$Builder;
-HSPLandroid/media/MediaMetadata;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/media/MediaMetadata;->containsKey(Ljava/lang/String;)Z
-HSPLandroid/media/MediaMetadata;->getBitmap(Ljava/lang/String;)Landroid/graphics/Bitmap;
-HSPLandroid/media/MediaMetadata;->getDescription()Landroid/media/MediaDescription;
-HSPLandroid/media/MediaMetadata;->getLong(Ljava/lang/String;)J
-HSPLandroid/media/MediaMetadata;->getString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/media/MediaMetadata;->size()I
-HSPLandroid/media/MediaMetadata;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/media/MediaMetadataRetriever;-><init>()V
-HSPLandroid/media/MediaMetadataRetriever;->extractMetadata(I)Ljava/lang/String;
-HSPLandroid/media/MediaMetadataRetriever;->finalize()V
-HSPLandroid/media/MediaMetadataRetriever;->setDataSource(Ljava/io/FileDescriptor;)V
-HSPLandroid/media/MediaMetadataRetriever;->setDataSource(Ljava/io/FileDescriptor;JJ)V
-HSPLandroid/media/MediaPlayer$2$1;->getSubtitleLooper()Landroid/os/Looper;
-HSPLandroid/media/MediaPlayer$2$1;->setSubtitleWidget(Landroid/media/SubtitleTrack$RenderingWidget;)V
-HSPLandroid/media/MediaPlayer$2;->run()V
-HSPLandroid/media/MediaPlayer$3;-><init>(Landroid/media/MediaPlayer;)V
-HSPLandroid/media/MediaPlayer$7;-><init>(Landroid/media/MediaPlayer;)V
-HSPLandroid/media/MediaPlayer$7;->onCompletion(Landroid/media/MediaPlayer;)V
-HSPLandroid/media/MediaPlayer$EventHandler;-><init>(Landroid/media/MediaPlayer;Landroid/media/MediaPlayer;Landroid/os/Looper;)V
-HSPLandroid/media/MediaPlayer$EventHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/media/MediaPlayer$TimeProvider$EventHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/media/MediaPlayer$TimeProvider;-><init>(Landroid/media/MediaPlayer;)V
-HSPLandroid/media/MediaPlayer$TimeProvider;->close()V
-HSPLandroid/media/MediaPlayer$TimeProvider;->finalize()V
-HSPLandroid/media/MediaPlayer$TimeProvider;->getCurrentTimeUs(ZZ)J
-HSPLandroid/media/MediaPlayer$TimeProvider;->notifySeek()V
-HSPLandroid/media/MediaPlayer$TimeProvider;->onPaused(Z)V
-HSPLandroid/media/MediaPlayer$TimeProvider;->scheduleNotification(IJ)V
-HSPLandroid/media/MediaPlayer$TrackInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/MediaPlayer$TrackInfo;
-HSPLandroid/media/MediaPlayer$TrackInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/media/MediaPlayer$TrackInfo$1;->newArray(I)[Landroid/media/MediaPlayer$TrackInfo;
-HSPLandroid/media/MediaPlayer$TrackInfo$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/media/MediaPlayer$TrackInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/media/MediaPlayer$TrackInfo;->getTrackType()I
-HSPLandroid/media/MediaPlayer;-><init>()V
-HSPLandroid/media/MediaPlayer;->attemptDataSource(Landroid/content/ContentResolver;Landroid/net/Uri;)Z
-HSPLandroid/media/MediaPlayer;->cleanDrmObj()V
-HSPLandroid/media/MediaPlayer;->finalize()V
-HSPLandroid/media/MediaPlayer;->getInbandTrackInfo()[Landroid/media/MediaPlayer$TrackInfo;
-HSPLandroid/media/MediaPlayer;->getMediaTimeProvider()Landroid/media/MediaTimeProvider;
-HSPLandroid/media/MediaPlayer;->invoke(Landroid/os/Parcel;Landroid/os/Parcel;)V
-HSPLandroid/media/MediaPlayer;->playerSetVolume(ZFF)V
-HSPLandroid/media/MediaPlayer;->populateInbandTracks()V
-HSPLandroid/media/MediaPlayer;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V
-HSPLandroid/media/MediaPlayer;->prepare()V
-HSPLandroid/media/MediaPlayer;->release()V
-HSPLandroid/media/MediaPlayer;->reset()V
-HSPLandroid/media/MediaPlayer;->resetDrmState()V
-HSPLandroid/media/MediaPlayer;->setAudioAttributes(Landroid/media/AudioAttributes;)V
-HSPLandroid/media/MediaPlayer;->setDataSource(Landroid/content/Context;Landroid/net/Uri;)V
-HSPLandroid/media/MediaPlayer;->setDataSource(Landroid/content/Context;Landroid/net/Uri;Ljava/util/Map;Ljava/util/List;)V
-HSPLandroid/media/MediaPlayer;->setDataSource(Landroid/content/res/AssetFileDescriptor;)V
-HSPLandroid/media/MediaPlayer;->setDataSource(Ljava/io/FileDescriptor;)V
-HSPLandroid/media/MediaPlayer;->setDataSource(Ljava/io/FileDescriptor;JJ)V
-HSPLandroid/media/MediaPlayer;->setOnCompletionListener(Landroid/media/MediaPlayer$OnCompletionListener;)V
-HSPLandroid/media/MediaPlayer;->setOnErrorListener(Landroid/media/MediaPlayer$OnErrorListener;)V
-HSPLandroid/media/MediaPlayer;->setSubtitleAnchor()V
-HSPLandroid/media/MediaPlayer;->setVolume(FF)V
-HSPLandroid/media/MediaPlayer;->start()V
-HSPLandroid/media/MediaPlayer;->stayAwake(Z)V
-HSPLandroid/media/MediaPlayer;->tryToDisableNativeRoutingCallback()V
-HSPLandroid/media/MediaPlayer;->tryToEnableNativeRoutingCallback()V
-HSPLandroid/media/MediaRoute2Info$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/MediaRoute2Info;
-HSPLandroid/media/MediaRoute2Info$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/media/MediaRoute2Info$Builder;-><init>(Ljava/lang/String;Ljava/lang/CharSequence;)V
-HSPLandroid/media/MediaRoute2Info$Builder;->addFeature(Ljava/lang/String;)Landroid/media/MediaRoute2Info$Builder;
-HSPLandroid/media/MediaRoute2Info$Builder;->build()Landroid/media/MediaRoute2Info;
-HSPLandroid/media/MediaRoute2Info$Builder;->setConnectionState(I)Landroid/media/MediaRoute2Info$Builder;
-HSPLandroid/media/MediaRoute2Info$Builder;->setVolume(I)Landroid/media/MediaRoute2Info$Builder;
-HSPLandroid/media/MediaRoute2Info$Builder;->setVolumeHandling(I)Landroid/media/MediaRoute2Info$Builder;
-HSPLandroid/media/MediaRoute2Info$Builder;->setVolumeMax(I)Landroid/media/MediaRoute2Info$Builder;
-HSPLandroid/media/MediaRoute2Info;-><init>(Landroid/media/MediaRoute2Info$Builder;)V
-HSPLandroid/media/MediaRoute2Info;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/media/MediaRoute2Info;->getId()Ljava/lang/String;
-HSPLandroid/media/MediaRoute2Info;->getOriginalId()Ljava/lang/String;
-HSPLandroid/media/MediaRoute2Info;->isSystemRoute()Z
-HSPLandroid/media/MediaRoute2ProviderInfo$Builder;-><init>()V
-HSPLandroid/media/MediaRoute2ProviderInfo$Builder;->addRoute(Landroid/media/MediaRoute2Info;)Landroid/media/MediaRoute2ProviderInfo$Builder;
-HSPLandroid/media/MediaRoute2ProviderInfo$Builder;->build()Landroid/media/MediaRoute2ProviderInfo;
-HSPLandroid/media/MediaRoute2ProviderInfo;-><init>(Landroid/media/MediaRoute2ProviderInfo$Builder;)V
-HSPLandroid/media/MediaRouter$Callback;-><init>()V
-HSPLandroid/media/MediaRouter$CallbackInfo;-><init>(Landroid/media/MediaRouter$Callback;IILandroid/media/MediaRouter;)V
-HSPLandroid/media/MediaRouter$CallbackInfo;->filterRouteEvent(I)Z
-HSPLandroid/media/MediaRouter$CallbackInfo;->filterRouteEvent(Landroid/media/MediaRouter$RouteInfo;)Z
-HSPLandroid/media/MediaRouter$RouteCategory;-><init>(IIZ)V
-HSPLandroid/media/MediaRouter$RouteCategory;-><init>(Ljava/lang/CharSequence;IZ)V
-HSPLandroid/media/MediaRouter$RouteCategory;->getName()Ljava/lang/CharSequence;
-HSPLandroid/media/MediaRouter$RouteCategory;->getName(Landroid/content/res/Resources;)Ljava/lang/CharSequence;
-HSPLandroid/media/MediaRouter$RouteCategory;->isGroupable()Z
-HSPLandroid/media/MediaRouter$RouteCategory;->toString()Ljava/lang/String;
-HSPLandroid/media/MediaRouter$RouteInfo$1;-><init>(Landroid/media/MediaRouter$RouteInfo;)V
-HSPLandroid/media/MediaRouter$RouteInfo;-><init>(Landroid/media/MediaRouter$RouteCategory;)V
-HSPLandroid/media/MediaRouter$RouteInfo;->choosePresentationDisplay()Landroid/view/Display;
-HSPLandroid/media/MediaRouter$RouteInfo;->getAllPresentationDisplays()[Landroid/view/Display;
-HSPLandroid/media/MediaRouter$RouteInfo;->getCategory()Landroid/media/MediaRouter$RouteCategory;
-HSPLandroid/media/MediaRouter$RouteInfo;->getDescription()Ljava/lang/CharSequence;
-HSPLandroid/media/MediaRouter$RouteInfo;->getDeviceType()I
-HSPLandroid/media/MediaRouter$RouteInfo;->getName()Ljava/lang/CharSequence;
-HSPLandroid/media/MediaRouter$RouteInfo;->getName(Landroid/content/Context;)Ljava/lang/CharSequence;
-HSPLandroid/media/MediaRouter$RouteInfo;->getName(Landroid/content/res/Resources;)Ljava/lang/CharSequence;
-HSPLandroid/media/MediaRouter$RouteInfo;->getPlaybackStream()I
-HSPLandroid/media/MediaRouter$RouteInfo;->getPlaybackType()I
-HSPLandroid/media/MediaRouter$RouteInfo;->getPresentationDisplay()Landroid/view/Display;
-HSPLandroid/media/MediaRouter$RouteInfo;->getStatus()Ljava/lang/CharSequence;
-HSPLandroid/media/MediaRouter$RouteInfo;->getSupportedTypes()I
-HSPLandroid/media/MediaRouter$RouteInfo;->getTag()Ljava/lang/Object;
-HSPLandroid/media/MediaRouter$RouteInfo;->getVolume()I
-HSPLandroid/media/MediaRouter$RouteInfo;->getVolumeHandling()I
-HSPLandroid/media/MediaRouter$RouteInfo;->getVolumeMax()I
-HSPLandroid/media/MediaRouter$RouteInfo;->isBluetooth()Z
-HSPLandroid/media/MediaRouter$RouteInfo;->isConnecting()Z
-HSPLandroid/media/MediaRouter$RouteInfo;->isDefault()Z
-HSPLandroid/media/MediaRouter$RouteInfo;->isEnabled()Z
-HSPLandroid/media/MediaRouter$RouteInfo;->isSelected()Z
-HSPLandroid/media/MediaRouter$RouteInfo;->matchesTypes(I)Z
-HSPLandroid/media/MediaRouter$RouteInfo;->resolveStatusCode()Z
-HSPLandroid/media/MediaRouter$RouteInfo;->routeUpdated()V
-HSPLandroid/media/MediaRouter$RouteInfo;->select()V
-HSPLandroid/media/MediaRouter$RouteInfo;->setTag(Ljava/lang/Object;)V
-HSPLandroid/media/MediaRouter$RouteInfo;->toString()Ljava/lang/String;
-HSPLandroid/media/MediaRouter$RouteInfo;->updatePresentationDisplay()Z
-HSPLandroid/media/MediaRouter$SimpleCallback;-><init>()V
-HSPLandroid/media/MediaRouter$Static$1$1;->run()V
-HSPLandroid/media/MediaRouter$Static$1;-><init>(Landroid/media/MediaRouter$Static;)V
-HSPLandroid/media/MediaRouter$Static$1;->dispatchAudioRoutesChanged(Landroid/media/AudioRoutesInfo;)V
-HSPLandroid/media/MediaRouter$Static$Client$1;-><init>(Landroid/media/MediaRouter$Static$Client;)V
-HSPLandroid/media/MediaRouter$Static$Client$1;->run()V
-HSPLandroid/media/MediaRouter$Static$Client;-><init>(Landroid/media/MediaRouter$Static;)V
-HSPLandroid/media/MediaRouter$Static$Client;->onRestoreRoute()V
-HSPLandroid/media/MediaRouter$Static$Client;->onStateChanged()V
-HSPLandroid/media/MediaRouter$Static;-><init>(Landroid/content/Context;)V
-HSPLandroid/media/MediaRouter$Static;->getAllPresentationDisplays()[Landroid/view/Display;
-HSPLandroid/media/MediaRouter$Static;->getStreamVolume(I)I
-HSPLandroid/media/MediaRouter$Static;->isBluetoothA2dpOn()Z
-HSPLandroid/media/MediaRouter$Static;->isPlaybackActive()Z
-HSPLandroid/media/MediaRouter$Static;->onDisplayChanged(I)V
-HSPLandroid/media/MediaRouter$Static;->publishClientDiscoveryRequest()V
-HSPLandroid/media/MediaRouter$Static;->publishClientSelectedRoute(Z)V
-HSPLandroid/media/MediaRouter$Static;->rebindAsUser(I)V
-HSPLandroid/media/MediaRouter$Static;->setSelectedRoute(Landroid/media/MediaRouter$RouteInfo;Z)V
-HSPLandroid/media/MediaRouter$Static;->startMonitoringRoutes(Landroid/content/Context;)V
-HSPLandroid/media/MediaRouter$Static;->updateAudioRoutes(Landroid/media/AudioRoutesInfo;)V
-HSPLandroid/media/MediaRouter$Static;->updateClientState()V
-HSPLandroid/media/MediaRouter$Static;->updateDiscoveryRequest()V
-HSPLandroid/media/MediaRouter$Static;->updatePresentationDisplays(I)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;-><init>(Landroid/media/MediaRouter$RouteCategory;)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->configureSessionVolume()V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setDescription(Ljava/lang/CharSequence;)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setName(Ljava/lang/CharSequence;)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setPlaybackStream(I)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setPlaybackType(I)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setVolume(I)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setVolumeCallback(Landroid/media/MediaRouter$VolumeCallback;)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setVolumeHandling(I)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setVolumeMax(I)V
-HSPLandroid/media/MediaRouter$VolumeCallback;-><init>()V
-HSPLandroid/media/MediaRouter$VolumeCallbackInfo;-><init>(Landroid/media/MediaRouter$VolumeCallback;Landroid/media/MediaRouter$RouteInfo;)V
-HSPLandroid/media/MediaRouter$VolumeChangeReceiver;-><init>()V
-HSPLandroid/media/MediaRouter$VolumeChangeReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
-HSPLandroid/media/MediaRouter$WifiDisplayStatusChangedReceiver;-><init>()V
-HSPLandroid/media/MediaRouter2Manager;->getInstance(Landroid/content/Context;)Landroid/media/MediaRouter2Manager;
-HSPLandroid/media/MediaRouter2Utils;->toUniqueId(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/media/MediaRouter;-><init>(Landroid/content/Context;)V
-HSPLandroid/media/MediaRouter;->addCallback(ILandroid/media/MediaRouter$Callback;I)V
-HSPLandroid/media/MediaRouter;->addRouteStatic(Landroid/media/MediaRouter$RouteInfo;)V
-HSPLandroid/media/MediaRouter;->addUserRoute(Landroid/media/MediaRouter$UserRouteInfo;)V
-HSPLandroid/media/MediaRouter;->createRouteCategory(Ljava/lang/CharSequence;Z)Landroid/media/MediaRouter$RouteCategory;
-HSPLandroid/media/MediaRouter;->createUserRoute(Landroid/media/MediaRouter$RouteCategory;)Landroid/media/MediaRouter$UserRouteInfo;
-HSPLandroid/media/MediaRouter;->dispatchRouteAdded(Landroid/media/MediaRouter$RouteInfo;)V
-HSPLandroid/media/MediaRouter;->dispatchRouteChanged(Landroid/media/MediaRouter$RouteInfo;I)V
-HSPLandroid/media/MediaRouter;->dispatchRouteRemoved(Landroid/media/MediaRouter$RouteInfo;)V
-HSPLandroid/media/MediaRouter;->dispatchRouteSelected(ILandroid/media/MediaRouter$RouteInfo;)V
-HSPLandroid/media/MediaRouter;->dispatchRouteVolumeChanged(Landroid/media/MediaRouter$RouteInfo;)V
-HSPLandroid/media/MediaRouter;->findCallbackInfo(Landroid/media/MediaRouter$Callback;)I
-HSPLandroid/media/MediaRouter;->getDefaultRoute()Landroid/media/MediaRouter$RouteInfo;
-HSPLandroid/media/MediaRouter;->getRouteAt(I)Landroid/media/MediaRouter$RouteInfo;
-HSPLandroid/media/MediaRouter;->getRouteCount()I
-HSPLandroid/media/MediaRouter;->getSelectedRoute(I)Landroid/media/MediaRouter$RouteInfo;
-HSPLandroid/media/MediaRouter;->removeCallback(Landroid/media/MediaRouter$Callback;)V
-HSPLandroid/media/MediaRouter;->removeRouteStatic(Landroid/media/MediaRouter$RouteInfo;)V
-HSPLandroid/media/MediaRouter;->removeUserRoute(Landroid/media/MediaRouter$UserRouteInfo;)V
-HSPLandroid/media/MediaRouter;->selectDefaultRouteStatic()V
-HSPLandroid/media/MediaRouter;->selectRoute(ILandroid/media/MediaRouter$RouteInfo;)V
-HSPLandroid/media/MediaRouter;->selectRouteStatic(ILandroid/media/MediaRouter$RouteInfo;Z)V
-HSPLandroid/media/MediaRouter;->systemVolumeChanged(I)V
-HSPLandroid/media/MediaRouter;->typesToString(I)Ljava/lang/String;
-HSPLandroid/media/MediaRouter;->updateWifiDisplayStatus(Landroid/hardware/display/WifiDisplayStatus;)V
-HSPLandroid/media/MediaServiceManager$ServiceRegisterer;-><init>(Ljava/lang/String;)V
-HSPLandroid/media/MediaServiceManager$ServiceRegisterer;->get()Landroid/os/IBinder;
-HSPLandroid/media/MediaServiceManager;-><init>()V
-HSPLandroid/media/MediaServiceManager;->getMediaCommunicationServiceRegisterer()Landroid/media/MediaServiceManager$ServiceRegisterer;
-HSPLandroid/media/MediaServiceManager;->getMediaSessionServiceRegisterer()Landroid/media/MediaServiceManager$ServiceRegisterer;
-HSPLandroid/media/PlayerBase$IPlayerWrapper;-><init>(Landroid/media/PlayerBase;)V
-HSPLandroid/media/PlayerBase$PlayerIdCard;-><init>(ILandroid/media/AudioAttributes;Landroid/media/IPlayer;I)V
-HSPLandroid/media/PlayerBase$PlayerIdCard;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/media/PlayerBase;-><init>(Landroid/media/AudioAttributes;I)V
-HSPLandroid/media/PlayerBase;->basePause()V
-HSPLandroid/media/PlayerBase;->baseRegisterPlayer(I)V
-HSPLandroid/media/PlayerBase;->baseRelease()V
-HSPLandroid/media/PlayerBase;->baseSetVolume(FF)V
-HSPLandroid/media/PlayerBase;->baseStart(I)V
-HSPLandroid/media/PlayerBase;->baseStop()V
-HSPLandroid/media/PlayerBase;->baseUpdateAudioAttributes(Landroid/media/AudioAttributes;)V
-HSPLandroid/media/PlayerBase;->baseUpdateDeviceId(Landroid/media/AudioDeviceInfo;)V
-HSPLandroid/media/PlayerBase;->deprecateStreamTypeForPlayback(ILjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/media/PlayerBase;->getCurrentOpPackageName()Ljava/lang/String;
-HSPLandroid/media/PlayerBase;->getService()Landroid/media/IAudioService;
-HSPLandroid/media/PlayerBase;->getStartDelayMs()I
-HSPLandroid/media/PlayerBase;->resolvePlaybackSessionId(Landroid/content/Context;I)I
-HSPLandroid/media/PlayerBase;->updatePlayerVolume()V
-HSPLandroid/media/PlayerBase;->updateState(II)V
-HSPLandroid/media/RoutingSessionInfo$Builder;->build()Landroid/media/RoutingSessionInfo;
-HSPLandroid/media/RoutingSessionInfo;-><init>(Landroid/media/RoutingSessionInfo$Builder;)V
-HSPLandroid/media/RoutingSessionInfo;->convertToUniqueRouteIds(Ljava/util/List;)Ljava/util/List;
-HSPLandroid/media/SoundPool$Builder;-><init>()V
-HSPLandroid/media/SoundPool$Builder;->build()Landroid/media/SoundPool;
-HSPLandroid/media/SoundPool$Builder;->setAudioAttributes(Landroid/media/AudioAttributes;)Landroid/media/SoundPool$Builder;
-HSPLandroid/media/SoundPool$Builder;->setMaxStreams(I)Landroid/media/SoundPool$Builder;
-HSPLandroid/media/SoundPool$EventHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/media/SoundPool;-><init>(Landroid/content/Context;ILandroid/media/AudioAttributes;I)V
-HSPLandroid/media/SoundPool;->postEventFromNative(IIILjava/lang/Object;)V
-HSPLandroid/media/SoundPool;->setOnLoadCompleteListener(Landroid/media/SoundPool$OnLoadCompleteListener;)V
-HSPLandroid/media/SubtitleController$1;->handleMessage(Landroid/os/Message;)Z
-HSPLandroid/media/SubtitleController;-><init>(Landroid/content/Context;Landroid/media/MediaTimeProvider;Landroid/media/SubtitleController$Listener;)V
-HSPLandroid/media/SubtitleController;->doSelectDefaultTrack()V
-HSPLandroid/media/SubtitleController;->doSelectTrack(Landroid/media/SubtitleTrack;)V
-HSPLandroid/media/SubtitleController;->finalize()V
-HSPLandroid/media/SubtitleController;->getDefaultTrack()Landroid/media/SubtitleTrack;
-HSPLandroid/media/SubtitleController;->hide()V
-HSPLandroid/media/SubtitleController;->reset()V
-HSPLandroid/media/SubtitleController;->selectDefaultTrack()V
-HSPLandroid/media/SubtitleController;->selectTrack(Landroid/media/SubtitleTrack;)Z
-HSPLandroid/media/SubtitleController;->setAnchor(Landroid/media/SubtitleController$Anchor;)V
-HSPLandroid/media/Utils$1;-><init>()V
-HSPLandroid/media/Utils$1;->compare(Landroid/util/Range;Landroid/util/Range;)I
-HSPLandroid/media/Utils$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/media/Utils$2;->compare(Landroid/util/Range;Landroid/util/Range;)I
-HSPLandroid/media/Utils$2;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/media/Utils$ListenerList;-><init>()V
-HSPLandroid/media/Utils$ListenerList;-><init>(ZZZ)V
-HSPLandroid/media/Utils;->alignRange(Landroid/util/Range;I)Landroid/util/Range;
-HSPLandroid/media/Utils;->divUp(II)I
-HSPLandroid/media/Utils;->divUp(JJ)J
-HSPLandroid/media/Utils;->factorRange(Landroid/util/Range;I)Landroid/util/Range;
-HSPLandroid/media/Utils;->factorRange(Landroid/util/Range;J)Landroid/util/Range;
-HSPLandroid/media/Utils;->intersectSortedDistinctRanges([Landroid/util/Range;[Landroid/util/Range;)[Landroid/util/Range;
-HSPLandroid/media/Utils;->parseIntRange(Ljava/lang/Object;Landroid/util/Range;)Landroid/util/Range;
-HSPLandroid/media/Utils;->parseIntSafely(Ljava/lang/Object;I)I
-HSPLandroid/media/Utils;->parseLongRange(Ljava/lang/Object;Landroid/util/Range;)Landroid/util/Range;
-HSPLandroid/media/Utils;->parseRationalRange(Ljava/lang/Object;Landroid/util/Range;)Landroid/util/Range;
-HSPLandroid/media/Utils;->parseSize(Ljava/lang/Object;Landroid/util/Size;)Landroid/util/Size;
-HSPLandroid/media/Utils;->parseSizeRange(Ljava/lang/Object;)Landroid/util/Pair;
-HSPLandroid/media/Utils;->sortDistinctRanges([Landroid/util/Range;)V
-HSPLandroid/media/audiofx/AudioEffect$Descriptor;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/media/audiopolicy/AudioProductStrategy$AudioAttributesGroup;-><init>(II[Landroid/media/AudioAttributes;)V
-HSPLandroid/media/audiopolicy/AudioProductStrategy;-><init>(Ljava/lang/String;I[Landroid/media/audiopolicy/AudioProductStrategy$AudioAttributesGroup;)V
-HSPLandroid/media/audiopolicy/AudioProductStrategy;->attributesMatches(Landroid/media/AudioAttributes;Landroid/media/AudioAttributes;)Z
-HSPLandroid/media/audiopolicy/AudioProductStrategy;->getAudioAttributesForStrategyWithLegacyStreamType(I)Landroid/media/AudioAttributes;
-HSPLandroid/media/audiopolicy/AudioProductStrategy;->getAudioProductStrategies()Ljava/util/List;
-HSPLandroid/media/audiopolicy/AudioProductStrategy;->getLegacyStreamTypeForStrategyWithAudioAttributes(Landroid/media/AudioAttributes;)I
-HSPLandroid/media/audiopolicy/AudioProductStrategy;->initializeAudioProductStrategies()Ljava/util/List;
-HSPLandroid/media/browse/MediaBrowser$1;->run()V
-HSPLandroid/media/browse/MediaBrowser$2;->run()V
-HSPLandroid/media/browse/MediaBrowser$6;->run()V
-HSPLandroid/media/browse/MediaBrowser$ConnectionCallback;-><init>()V
-HSPLandroid/media/browse/MediaBrowser$MediaServiceConnection$1;->run()V
-HSPLandroid/media/browse/MediaBrowser$MediaServiceConnection;->isCurrent(Ljava/lang/String;)Z
-HSPLandroid/media/browse/MediaBrowser$MediaServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-HSPLandroid/media/browse/MediaBrowser$MediaServiceConnection;->postOrRun(Ljava/lang/Runnable;)V
-HSPLandroid/media/browse/MediaBrowser$ServiceCallbacks;->onConnect(Ljava/lang/String;Landroid/media/session/MediaSession$Token;Landroid/os/Bundle;)V
-HSPLandroid/media/browse/MediaBrowser;-><init>(Landroid/content/Context;Landroid/content/ComponentName;Landroid/media/browse/MediaBrowser$ConnectionCallback;Landroid/os/Bundle;)V
-HSPLandroid/media/browse/MediaBrowser;->connect()V
-HSPLandroid/media/browse/MediaBrowser;->disconnect()V
-HSPLandroid/media/browse/MediaBrowser;->forceCloseConnection()V
-HSPLandroid/media/browse/MediaBrowser;->isCurrent(Landroid/service/media/IMediaBrowserServiceCallbacks;Ljava/lang/String;)Z
-HSPLandroid/media/browse/MediaBrowserUtils;->areSameOptions(Landroid/os/Bundle;Landroid/os/Bundle;)Z
-HSPLandroid/media/metrics/Event;-><init>()V
-HSPLandroid/media/metrics/IMediaMetricsManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/media/metrics/IMediaMetricsManager$Stub$Proxy;->getPlaybackSessionId(I)Ljava/lang/String;
-HSPLandroid/media/metrics/IMediaMetricsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/metrics/IMediaMetricsManager;
-HSPLandroid/media/metrics/LogSessionId;-><init>(Ljava/lang/String;)V
-HSPLandroid/media/metrics/MediaMetricsManager;-><init>(Landroid/media/metrics/IMediaMetricsManager;I)V
-HSPLandroid/media/metrics/MediaMetricsManager;->createPlaybackSession()Landroid/media/metrics/PlaybackSession;
-HSPLandroid/media/metrics/NetworkEvent$1;-><init>()V
-HSPLandroid/media/metrics/NetworkEvent;-><clinit>()V
-HSPLandroid/media/metrics/PlaybackSession;-><init>(Ljava/lang/String;Landroid/media/metrics/MediaMetricsManager;)V
-HSPLandroid/media/metrics/PlaybackSession;->getSessionId()Landroid/media/metrics/LogSessionId;
-HSPLandroid/media/permission/ClearCallingIdentityContext;-><init>()V
-HSPLandroid/media/permission/ClearCallingIdentityContext;->close()V
-HSPLandroid/media/permission/ClearCallingIdentityContext;->create()Landroid/media/permission/SafeCloseable;
-HSPLandroid/media/permission/Identity;-><init>()V
-HSPLandroid/media/session/IActiveSessionsListener$Stub;-><init>()V
-HSPLandroid/media/session/IActiveSessionsListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/session/IActiveSessionsListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/media/session/IOnMediaKeyEventDispatchedListener$Stub;-><init>()V
-HSPLandroid/media/session/IOnMediaKeyEventSessionChangedListener$Stub;-><init>()V
-HSPLandroid/media/session/ISession$Stub$Proxy;->destroySession()V
-HSPLandroid/media/session/ISession$Stub$Proxy;->getController()Landroid/media/session/ISessionController;
-HSPLandroid/media/session/ISession$Stub$Proxy;->setFlags(I)V
-HSPLandroid/media/session/ISession$Stub$Proxy;->setMetadata(Landroid/media/MediaMetadata;JLjava/lang/String;)V
-HSPLandroid/media/session/ISession$Stub$Proxy;->setPlaybackState(Landroid/media/session/PlaybackState;)V
-HSPLandroid/media/session/ISessionCallback$Stub;-><init>()V
-HSPLandroid/media/session/ISessionCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/session/ISessionController$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/session/ISessionController$Stub$Proxy;->getMetadata()Landroid/media/MediaMetadata;
-HSPLandroid/media/session/ISessionController$Stub$Proxy;->getPackageName()Ljava/lang/String;
-HSPLandroid/media/session/ISessionController$Stub$Proxy;->getPlaybackState()Landroid/media/session/PlaybackState;
-HSPLandroid/media/session/ISessionController$Stub$Proxy;->getVolumeAttributes()Landroid/media/session/MediaController$PlaybackInfo;
-HSPLandroid/media/session/ISessionController$Stub$Proxy;->registerCallback(Ljava/lang/String;Landroid/media/session/ISessionControllerCallback;)V
-HSPLandroid/media/session/ISessionController$Stub$Proxy;->unregisterCallback(Landroid/media/session/ISessionControllerCallback;)V
-HSPLandroid/media/session/ISessionController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/session/ISessionController;
-HSPLandroid/media/session/ISessionControllerCallback$Stub;-><init>()V
-HSPLandroid/media/session/ISessionControllerCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/session/ISessionControllerCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/media/session/ISessionManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/media/session/ISessionManager$Stub$Proxy;->addSessionsListener(Landroid/media/session/IActiveSessionsListener;Landroid/content/ComponentName;I)V
-HSPLandroid/media/session/ISessionManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/session/ISessionManager$Stub$Proxy;->createSession(Ljava/lang/String;Landroid/media/session/ISessionCallback;Ljava/lang/String;Landroid/os/Bundle;I)Landroid/media/session/ISession;
-HSPLandroid/media/session/ISessionManager$Stub$Proxy;->dispatchVolumeKeyEvent(Ljava/lang/String;Ljava/lang/String;ZLandroid/view/KeyEvent;IZ)V
-HSPLandroid/media/session/ISessionManager$Stub$Proxy;->getSessions(Landroid/content/ComponentName;I)Ljava/util/List;
-HSPLandroid/media/session/ISessionManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/session/ISessionManager;
-HSPLandroid/media/session/MediaController$Callback;-><init>()V
-HSPLandroid/media/session/MediaController$CallbackStub;-><init>(Landroid/media/session/MediaController;)V
-HSPLandroid/media/session/MediaController$CallbackStub;->onMetadataChanged(Landroid/media/MediaMetadata;)V
-HSPLandroid/media/session/MediaController$CallbackStub;->onPlaybackStateChanged(Landroid/media/session/PlaybackState;)V
-HSPLandroid/media/session/MediaController$CallbackStub;->onSessionDestroyed()V
-HSPLandroid/media/session/MediaController$MessageHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/media/session/MediaController$PlaybackInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/session/MediaController$PlaybackInfo;
-HSPLandroid/media/session/MediaController$PlaybackInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/media/session/MediaController$PlaybackInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/media/session/MediaController$TransportControls;-><init>(Landroid/media/session/MediaController;)V
-HSPLandroid/media/session/MediaController;-><init>(Landroid/content/Context;Landroid/media/session/MediaSession$Token;)V
-HSPLandroid/media/session/MediaController;->addCallbackLocked(Landroid/media/session/MediaController$Callback;Landroid/os/Handler;)V
-HSPLandroid/media/session/MediaController;->getHandlerForCallbackLocked(Landroid/media/session/MediaController$Callback;)Landroid/media/session/MediaController$MessageHandler;
-HSPLandroid/media/session/MediaController;->getMetadata()Landroid/media/MediaMetadata;
-HSPLandroid/media/session/MediaController;->getPackageName()Ljava/lang/String;
-HSPLandroid/media/session/MediaController;->getPlaybackInfo()Landroid/media/session/MediaController$PlaybackInfo;
-HSPLandroid/media/session/MediaController;->getPlaybackState()Landroid/media/session/PlaybackState;
-HSPLandroid/media/session/MediaController;->getSessionToken()Landroid/media/session/MediaSession$Token;
-HSPLandroid/media/session/MediaController;->postMessage(ILjava/lang/Object;Landroid/os/Bundle;)V
-HSPLandroid/media/session/MediaController;->registerCallback(Landroid/media/session/MediaController$Callback;Landroid/os/Handler;)V
-HSPLandroid/media/session/MediaController;->removeCallbackLocked(Landroid/media/session/MediaController$Callback;)Z
-HSPLandroid/media/session/MediaController;->unregisterCallback(Landroid/media/session/MediaController$Callback;)V
-HSPLandroid/media/session/MediaSession$Callback;-><init>()V
-HSPLandroid/media/session/MediaSession$CallbackMessageHandler;-><init>(Landroid/media/session/MediaSession;Landroid/os/Looper;Landroid/media/session/MediaSession$Callback;)V
-HSPLandroid/media/session/MediaSession$CallbackStub;-><init>(Landroid/media/session/MediaSession;)V
-HSPLandroid/media/session/MediaSession$Token$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/session/MediaSession$Token;
-HSPLandroid/media/session/MediaSession$Token$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/media/session/MediaSession$Token;-><init>(ILandroid/media/session/ISessionController;)V
-HSPLandroid/media/session/MediaSession$Token;->equals(Ljava/lang/Object;)Z
-HSPLandroid/media/session/MediaSession$Token;->getBinder()Landroid/media/session/ISessionController;
-HSPLandroid/media/session/MediaSession$Token;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/media/session/MediaSession;-><init>(Landroid/content/Context;Ljava/lang/String;)V
-HSPLandroid/media/session/MediaSession;-><init>(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/media/session/MediaSession;->getSessionToken()Landroid/media/session/MediaSession$Token;
-HSPLandroid/media/session/MediaSession;->hasCustomParcelable(Landroid/os/Bundle;)Z
-HSPLandroid/media/session/MediaSession;->isActive()Z
-HSPLandroid/media/session/MediaSession;->release()V
-HSPLandroid/media/session/MediaSession;->setActive(Z)V
-HSPLandroid/media/session/MediaSession;->setCallback(Landroid/media/session/MediaSession$Callback;)V
-HSPLandroid/media/session/MediaSession;->setCallback(Landroid/media/session/MediaSession$Callback;Landroid/os/Handler;)V
-HSPLandroid/media/session/MediaSession;->setFlags(I)V
-HSPLandroid/media/session/MediaSession;->setMediaButtonReceiver(Landroid/app/PendingIntent;)V
-HSPLandroid/media/session/MediaSession;->setMetadata(Landroid/media/MediaMetadata;)V
-HSPLandroid/media/session/MediaSession;->setPlaybackState(Landroid/media/session/PlaybackState;)V
-HSPLandroid/media/session/MediaSession;->setPlaybackToLocal(Landroid/media/AudioAttributes;)V
-HSPLandroid/media/session/MediaSessionManager$OnMediaKeyEventDispatchedListenerStub;-><init>(Landroid/media/session/MediaSessionManager;)V
-HSPLandroid/media/session/MediaSessionManager$OnMediaKeyEventSessionChangedListenerStub;-><init>(Landroid/media/session/MediaSessionManager;)V
-HSPLandroid/media/session/MediaSessionManager$RemoteSessionCallbackStub;-><init>(Landroid/media/session/MediaSessionManager;)V
-HSPLandroid/media/session/MediaSessionManager$RemoteUserInfo;-><init>(Ljava/lang/String;II)V
-HSPLandroid/media/session/MediaSessionManager$SessionsChangedWrapper$1$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/media/session/MediaSessionManager$SessionsChangedWrapper$1;-><init>(Landroid/media/session/MediaSessionManager$SessionsChangedWrapper;)V
-HSPLandroid/media/session/MediaSessionManager$SessionsChangedWrapper$1;->onActiveSessionsChanged(Ljava/util/List;)V
-HSPLandroid/media/session/MediaSessionManager$SessionsChangedWrapper;->-$$Nest$fgetmStub(Landroid/media/session/MediaSessionManager$SessionsChangedWrapper;)Landroid/media/session/IActiveSessionsListener$Stub;
-HSPLandroid/media/session/MediaSessionManager$SessionsChangedWrapper;->-$$Nest$mcallOnActiveSessionsChangedListener(Landroid/media/session/MediaSessionManager$SessionsChangedWrapper;Ljava/util/List;)V
-HSPLandroid/media/session/MediaSessionManager$SessionsChangedWrapper;-><init>(Landroid/content/Context;Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener;Ljava/util/concurrent/Executor;)V
-HSPLandroid/media/session/MediaSessionManager$SessionsChangedWrapper;->callOnActiveSessionsChangedListener(Ljava/util/List;)V
-HSPLandroid/media/session/MediaSessionManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/media/session/MediaSessionManager;->addOnActiveSessionsChangedListener(Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener;Landroid/content/ComponentName;ILjava/util/concurrent/Executor;)V
-HSPLandroid/media/session/MediaSessionManager;->addOnActiveSessionsChangedListener(Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener;Landroid/content/ComponentName;Landroid/os/Handler;)V
-HSPLandroid/media/session/MediaSessionManager;->createSession(Landroid/media/session/MediaSession$CallbackStub;Ljava/lang/String;Landroid/os/Bundle;)Landroid/media/session/ISession;
-HSPLandroid/media/session/MediaSessionManager;->dispatchVolumeKeyEventInternal(Landroid/view/KeyEvent;IZZ)V
-HSPLandroid/media/session/MediaSessionManager;->getActiveSessions(Landroid/content/ComponentName;)Ljava/util/List;
-HSPLandroid/media/session/MediaSessionManager;->getActiveSessionsForUser(Landroid/content/ComponentName;I)Ljava/util/List;
-HSPLandroid/media/session/PlaybackState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/session/PlaybackState;
-HSPLandroid/media/session/PlaybackState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/media/session/PlaybackState$Builder;-><init>()V
-HSPLandroid/media/session/PlaybackState$Builder;->build()Landroid/media/session/PlaybackState;
-HSPLandroid/media/session/PlaybackState$Builder;->setActions(J)Landroid/media/session/PlaybackState$Builder;
-HSPLandroid/media/session/PlaybackState$Builder;->setActiveQueueItemId(J)Landroid/media/session/PlaybackState$Builder;
-HSPLandroid/media/session/PlaybackState$Builder;->setBufferedPosition(J)Landroid/media/session/PlaybackState$Builder;
-HSPLandroid/media/session/PlaybackState$Builder;->setErrorMessage(Ljava/lang/CharSequence;)Landroid/media/session/PlaybackState$Builder;
-HSPLandroid/media/session/PlaybackState$Builder;->setExtras(Landroid/os/Bundle;)Landroid/media/session/PlaybackState$Builder;
-HSPLandroid/media/session/PlaybackState$Builder;->setState(IJFJ)Landroid/media/session/PlaybackState$Builder;
-HSPLandroid/media/session/PlaybackState$CustomAction$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/session/PlaybackState$CustomAction;
-HSPLandroid/media/session/PlaybackState$CustomAction$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/media/session/PlaybackState;-><init>(IJJFJJLjava/util/List;JLjava/lang/CharSequence;Landroid/os/Bundle;)V
-HSPLandroid/media/session/PlaybackState;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/media/session/PlaybackState;->getPosition()J
-HSPLandroid/media/session/PlaybackState;->getState()I
-HSPLandroid/media/session/PlaybackState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/metrics/LogMaker;-><init>(I)V
-HSPLandroid/metrics/LogMaker;->addTaggedData(ILjava/lang/Object;)Landroid/metrics/LogMaker;
-HSPLandroid/metrics/LogMaker;->getEntries()Landroid/util/SparseArray;
-HSPLandroid/metrics/LogMaker;->getType()I
-HSPLandroid/metrics/LogMaker;->isValidValue(Ljava/lang/Object;)Z
-HSPLandroid/metrics/LogMaker;->serialize()[Ljava/lang/Object;
-HSPLandroid/metrics/LogMaker;->setCategory(I)Landroid/metrics/LogMaker;
-HSPLandroid/metrics/LogMaker;->setComponentName(Landroid/content/ComponentName;)Landroid/metrics/LogMaker;
-HSPLandroid/metrics/LogMaker;->setSubtype(I)Landroid/metrics/LogMaker;
-HSPLandroid/metrics/LogMaker;->setType(I)Landroid/metrics/LogMaker;
-HSPLandroid/multiuser/FeatureFlagsImpl;-><init>()V
-HSPLandroid/multiuser/FeatureFlagsImpl;->enableSystemUserOnlyForServicesAndProviders()Z
-HSPLandroid/multiuser/Flags;-><clinit>()V
-HSPLandroid/multiuser/Flags;->enableSystemUserOnlyForServicesAndProviders()Z+]Landroid/multiuser/FeatureFlags;Landroid/multiuser/FeatureFlagsImpl;
-HSPLandroid/net/Credentials;-><init>(III)V
-HSPLandroid/net/Credentials;->getPid()I
-HSPLandroid/net/Credentials;->getUid()I
-HSPLandroid/net/INetworkPolicyListener$Stub;-><init>()V
-HSPLandroid/net/INetworkPolicyListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/net/INetworkPolicyListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/net/INetworkPolicyManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/net/INetworkPolicyManager$Stub$Proxy;->getRestrictBackground()Z
-HSPLandroid/net/INetworkPolicyManager$Stub$Proxy;->getRestrictBackgroundByCaller()I
-HSPLandroid/net/INetworkPolicyManager$Stub$Proxy;->registerListener(Landroid/net/INetworkPolicyListener;)V
-HSPLandroid/net/INetworkPolicyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkPolicyManager;
-HSPLandroid/net/INetworkScoreCache$Stub;-><init>()V
-HSPLandroid/net/INetworkScoreCache$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/net/INetworkScoreService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkScoreService;
-HSPLandroid/net/LocalServerSocket;-><init>(Ljava/io/FileDescriptor;)V
-HSPLandroid/net/LocalServerSocket;->accept()Landroid/net/LocalSocket;
-HSPLandroid/net/LocalServerSocket;->close()V
-HSPLandroid/net/LocalServerSocket;->getFileDescriptor()Ljava/io/FileDescriptor;
-HSPLandroid/net/LocalSocket;-><init>(Landroid/net/LocalSocketImpl;I)V
-HSPLandroid/net/LocalSocket;->checkConnected()V
-HSPLandroid/net/LocalSocket;->close()V
-HSPLandroid/net/LocalSocket;->createLocalSocketForAccept(Landroid/net/LocalSocketImpl;)Landroid/net/LocalSocket;
-HSPLandroid/net/LocalSocket;->getFileDescriptor()Ljava/io/FileDescriptor;
-HSPLandroid/net/LocalSocket;->getInputStream()Ljava/io/InputStream;
-HSPLandroid/net/LocalSocket;->getOutputStream()Ljava/io/OutputStream;
-HSPLandroid/net/LocalSocket;->getPeerCredentials()Landroid/net/Credentials;
-HSPLandroid/net/LocalSocket;->implCreateIfNeeded()V
-HSPLandroid/net/LocalSocket;->setSoTimeout(I)V
-HSPLandroid/net/LocalSocketAddress$Namespace;->getId()I
-HSPLandroid/net/LocalSocketAddress;-><init>(Ljava/lang/String;)V
-HSPLandroid/net/LocalSocketAddress;-><init>(Ljava/lang/String;Landroid/net/LocalSocketAddress$Namespace;)V
-HSPLandroid/net/LocalSocketAddress;->getName()Ljava/lang/String;
-HSPLandroid/net/LocalSocketAddress;->getNamespace()Landroid/net/LocalSocketAddress$Namespace;
-HSPLandroid/net/LocalSocketImpl$SocketInputStream;-><init>(Landroid/net/LocalSocketImpl;)V
-HSPLandroid/net/LocalSocketImpl$SocketInputStream;->available()I
-HSPLandroid/net/LocalSocketImpl$SocketInputStream;->read([BII)I
-HSPLandroid/net/LocalSocketImpl$SocketOutputStream;-><init>(Landroid/net/LocalSocketImpl;)V
-HSPLandroid/net/LocalSocketImpl$SocketOutputStream;->write(I)V
-HSPLandroid/net/LocalSocketImpl$SocketOutputStream;->write([BII)V
-HSPLandroid/net/LocalSocketImpl;->-$$Nest$fgetfd(Landroid/net/LocalSocketImpl;)Ljava/io/FileDescriptor;
-HSPLandroid/net/LocalSocketImpl;->-$$Nest$fgetwriteMonitor(Landroid/net/LocalSocketImpl;)Ljava/lang/Object;
-HSPLandroid/net/LocalSocketImpl;->-$$Nest$mwrite_native(Landroid/net/LocalSocketImpl;ILjava/io/FileDescriptor;)V
-HSPLandroid/net/LocalSocketImpl;->-$$Nest$mwriteba_native(Landroid/net/LocalSocketImpl;[BIILjava/io/FileDescriptor;)V
-HSPLandroid/net/LocalSocketImpl;-><init>()V
-HSPLandroid/net/LocalSocketImpl;-><init>(Ljava/io/FileDescriptor;)V
-HSPLandroid/net/LocalSocketImpl;->accept(Landroid/net/LocalSocketImpl;)V
-HSPLandroid/net/LocalSocketImpl;->bind(Landroid/net/LocalSocketAddress;)V
-HSPLandroid/net/LocalSocketImpl;->close()V
-HSPLandroid/net/LocalSocketImpl;->create(I)V
-HSPLandroid/net/LocalSocketImpl;->finalize()V
-HSPLandroid/net/LocalSocketImpl;->getFileDescriptor()Ljava/io/FileDescriptor;
-HSPLandroid/net/LocalSocketImpl;->getInputStream()Ljava/io/InputStream;
-HSPLandroid/net/LocalSocketImpl;->getOutputStream()Ljava/io/OutputStream;
-HSPLandroid/net/LocalSocketImpl;->getPeerCredentials()Landroid/net/Credentials;
-HSPLandroid/net/LocalSocketImpl;->getSockAddress()Landroid/net/LocalSocketAddress;
-HSPLandroid/net/LocalSocketImpl;->listen(I)V
-HSPLandroid/net/LocalSocketImpl;->setOption(ILjava/lang/Object;)V
-HSPLandroid/net/MatchAllNetworkSpecifier;-><init>()V
-HSPLandroid/net/NetworkKey$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/NetworkKey;
-HSPLandroid/net/NetworkKey$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/net/NetworkKey$1;->newArray(I)[Landroid/net/NetworkKey;
-HSPLandroid/net/NetworkKey$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/net/NetworkKey;-><init>(Landroid/net/WifiKey;)V
-HSPLandroid/net/NetworkKey;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/net/NetworkKey;->createFromWifiInfo(Landroid/net/wifi/WifiInfo;)Landroid/net/NetworkKey;
-HSPLandroid/net/NetworkKey;->equals(Ljava/lang/Object;)Z
-HSPLandroid/net/NetworkKey;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/net/NetworkPolicyManager$Listener;-><init>()V
-HSPLandroid/net/NetworkPolicyManager$Listener;->onMeteredIfacesChanged([Ljava/lang/String;)V
-HSPLandroid/net/NetworkPolicyManager$Listener;->onSubscriptionPlansChanged(I[Landroid/telephony/SubscriptionPlan;)V
-HSPLandroid/net/NetworkPolicyManager$Listener;->onUidRulesChanged(II)V
-HSPLandroid/net/NetworkPolicyManager;-><init>(Landroid/content/Context;Landroid/net/INetworkPolicyManager;)V
-HSPLandroid/net/NetworkPolicyManager;->getRestrictBackground()Z
-HSPLandroid/net/NetworkPolicyManager;->registerListener(Landroid/net/INetworkPolicyListener;)V
-HSPLandroid/net/NetworkScoreManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/net/NetworkScoreManager;->getActiveScorerPackage()Ljava/lang/String;
-HSPLandroid/net/NetworkScoreManager;->registerNetworkScoreCache(ILandroid/net/INetworkScoreCache;I)V
-HSPLandroid/net/NetworkSpecifier;-><init>()V
-HSPLandroid/net/Proxy;->setHttpProxyConfiguration(Landroid/net/ProxyInfo;)V
-HSPLandroid/net/Proxy;->setHttpProxyConfiguration(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)V
-HSPLandroid/net/Proxy;->setHttpProxySystemProperty(Landroid/net/ProxyInfo;)V
-HSPLandroid/net/SSLCertificateSocketFactory;-><init>(ILandroid/net/SSLSessionCache;Z)V
-HSPLandroid/net/TelephonyNetworkSpecifier$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/TelephonyNetworkSpecifier;
-HSPLandroid/net/TelephonyNetworkSpecifier$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/net/TelephonyNetworkSpecifier$Builder;-><init>()V
-HSPLandroid/net/TelephonyNetworkSpecifier$Builder;->build()Landroid/net/TelephonyNetworkSpecifier;
-HSPLandroid/net/TelephonyNetworkSpecifier$Builder;->setSubscriptionId(I)Landroid/net/TelephonyNetworkSpecifier$Builder;
-HSPLandroid/net/TelephonyNetworkSpecifier;-><init>(I)V
-HSPLandroid/net/TelephonyNetworkSpecifier;->equals(Ljava/lang/Object;)Z
-HSPLandroid/net/TelephonyNetworkSpecifier;->hashCode()I
-HSPLandroid/net/TelephonyNetworkSpecifier;->toString()Ljava/lang/String;
-HSPLandroid/net/TelephonyNetworkSpecifier;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/net/Uri$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/Uri;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/net/Uri$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/net/Uri$1;Landroid/net/Uri$1;
-HSPLandroid/net/Uri$1;->newArray(I)[Landroid/net/Uri;
-HSPLandroid/net/Uri$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/net/Uri$AbstractHierarchicalUri;-><init>()V
-HSPLandroid/net/Uri$AbstractHierarchicalUri;-><init>(Landroid/net/Uri$AbstractHierarchicalUri-IA;)V
-HSPLandroid/net/Uri$AbstractHierarchicalUri;->findPortSeparator(Ljava/lang/String;)I
-HSPLandroid/net/Uri$AbstractHierarchicalUri;->getHost()Ljava/lang/String;
-HSPLandroid/net/Uri$AbstractHierarchicalUri;->getLastPathSegment()Ljava/lang/String;
-HSPLandroid/net/Uri$AbstractHierarchicalUri;->getPort()I
-HSPLandroid/net/Uri$AbstractHierarchicalUri;->getUserInfo()Ljava/lang/String;
-HSPLandroid/net/Uri$AbstractHierarchicalUri;->getUserInfoPart()Landroid/net/Uri$Part;
-HSPLandroid/net/Uri$AbstractHierarchicalUri;->parseHost()Ljava/lang/String;
-HSPLandroid/net/Uri$AbstractHierarchicalUri;->parsePort()I
-HSPLandroid/net/Uri$AbstractHierarchicalUri;->parseUserInfo()Ljava/lang/String;
-HSPLandroid/net/Uri$AbstractPart;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/net/Uri$AbstractPart;->getDecoded()Ljava/lang/String;
-HSPLandroid/net/Uri$Builder;-><init>()V
-HSPLandroid/net/Uri$Builder;->appendEncodedPath(Ljava/lang/String;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->appendPath(Ljava/lang/String;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->appendQueryParameter(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->authority(Landroid/net/Uri$Part;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->authority(Ljava/lang/String;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->build()Landroid/net/Uri;
-HSPLandroid/net/Uri$Builder;->clearQuery()Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->encodedAuthority(Ljava/lang/String;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->encodedFragment(Ljava/lang/String;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->encodedPath(Ljava/lang/String;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->encodedQuery(Ljava/lang/String;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->fragment(Landroid/net/Uri$Part;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->fragment(Ljava/lang/String;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->hasSchemeOrAuthority()Z
-HSPLandroid/net/Uri$Builder;->path(Landroid/net/Uri$PathPart;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->path(Ljava/lang/String;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->query(Landroid/net/Uri$Part;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->scheme(Ljava/lang/String;)Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$Builder;->toString()Ljava/lang/String;+]Landroid/net/Uri$Builder;Landroid/net/Uri$Builder;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;
-HSPLandroid/net/Uri$HierarchicalUri;-><init>(Ljava/lang/String;Landroid/net/Uri$Part;Landroid/net/Uri$PathPart;Landroid/net/Uri$Part;Landroid/net/Uri$Part;)V
-HSPLandroid/net/Uri$HierarchicalUri;->appendSspTo(Ljava/lang/StringBuilder;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/net/Uri$Part;Landroid/net/Uri$Part;,Landroid/net/Uri$Part$EmptyPart;]Landroid/net/Uri$PathPart;Landroid/net/Uri$PathPart;
-HSPLandroid/net/Uri$HierarchicalUri;->buildUpon()Landroid/net/Uri$Builder;+]Landroid/net/Uri$Builder;Landroid/net/Uri$Builder;
-HSPLandroid/net/Uri$HierarchicalUri;->generatePath(Landroid/net/Uri$PathPart;)Landroid/net/Uri$PathPart;+]Landroid/net/Uri$Part;Landroid/net/Uri$Part$EmptyPart;,Landroid/net/Uri$Part;]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/net/Uri$HierarchicalUri;->getAuthority()Ljava/lang/String;
-HSPLandroid/net/Uri$HierarchicalUri;->getEncodedAuthority()Ljava/lang/String;
-HSPLandroid/net/Uri$HierarchicalUri;->getEncodedFragment()Ljava/lang/String;
-HSPLandroid/net/Uri$HierarchicalUri;->getEncodedPath()Ljava/lang/String;
-HSPLandroid/net/Uri$HierarchicalUri;->getEncodedQuery()Ljava/lang/String;
-HSPLandroid/net/Uri$HierarchicalUri;->getFragment()Ljava/lang/String;
-HSPLandroid/net/Uri$HierarchicalUri;->getPath()Ljava/lang/String;
-HSPLandroid/net/Uri$HierarchicalUri;->getPathSegments()Ljava/util/List;
-HSPLandroid/net/Uri$HierarchicalUri;->getQuery()Ljava/lang/String;
-HSPLandroid/net/Uri$HierarchicalUri;->getScheme()Ljava/lang/String;
-HSPLandroid/net/Uri$HierarchicalUri;->getSchemeSpecificPart()Ljava/lang/String;
-HSPLandroid/net/Uri$HierarchicalUri;->isHierarchical()Z
-HSPLandroid/net/Uri$HierarchicalUri;->makeUriString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/net/Uri$Part;Landroid/net/Uri$Part$EmptyPart;
-HSPLandroid/net/Uri$HierarchicalUri;->readFrom(Landroid/os/Parcel;)Landroid/net/Uri;
-HSPLandroid/net/Uri$HierarchicalUri;->toString()Ljava/lang/String;
-HSPLandroid/net/Uri$HierarchicalUri;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/net/Uri$OpaqueUri;-><init>(Ljava/lang/String;Landroid/net/Uri$Part;Landroid/net/Uri$Part;)V
-HSPLandroid/net/Uri$OpaqueUri;-><init>(Ljava/lang/String;Landroid/net/Uri$Part;Landroid/net/Uri$Part;Landroid/net/Uri$OpaqueUri-IA;)V
-HSPLandroid/net/Uri$OpaqueUri;->getEncodedSchemeSpecificPart()Ljava/lang/String;
-HSPLandroid/net/Uri$OpaqueUri;->getScheme()Ljava/lang/String;
-HSPLandroid/net/Uri$OpaqueUri;->getSchemeSpecificPart()Ljava/lang/String;
-HSPLandroid/net/Uri$OpaqueUri;->toString()Ljava/lang/String;
-HSPLandroid/net/Uri$OpaqueUri;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/net/Uri$Part$EmptyPart;->isEmpty()Z
-HSPLandroid/net/Uri$Part;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/net/Uri$Part;->from(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri$Part;
-HSPLandroid/net/Uri$Part;->fromDecoded(Ljava/lang/String;)Landroid/net/Uri$Part;
-HSPLandroid/net/Uri$Part;->fromEncoded(Ljava/lang/String;)Landroid/net/Uri$Part;
-HSPLandroid/net/Uri$Part;->getEncoded()Ljava/lang/String;
-HSPLandroid/net/Uri$Part;->isEmpty()Z
-HSPLandroid/net/Uri$Part;->nonNull(Landroid/net/Uri$Part;)Landroid/net/Uri$Part;
-HSPLandroid/net/Uri$PathPart;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/net/Uri$PathPart;->appendDecodedSegment(Landroid/net/Uri$PathPart;Ljava/lang/String;)Landroid/net/Uri$PathPart;
-HSPLandroid/net/Uri$PathPart;->appendEncodedSegment(Landroid/net/Uri$PathPart;Ljava/lang/String;)Landroid/net/Uri$PathPart;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/net/Uri$PathPart;Landroid/net/Uri$PathPart;
-HSPLandroid/net/Uri$PathPart;->from(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri$PathPart;
-HSPLandroid/net/Uri$PathPart;->fromDecoded(Ljava/lang/String;)Landroid/net/Uri$PathPart;
-HSPLandroid/net/Uri$PathPart;->fromEncoded(Ljava/lang/String;)Landroid/net/Uri$PathPart;
-HSPLandroid/net/Uri$PathPart;->getEncoded()Ljava/lang/String;
-HSPLandroid/net/Uri$PathPart;->getPathSegments()Landroid/net/Uri$PathSegments;+]Ljava/lang/String;Ljava/lang/String;]Landroid/net/Uri$PathSegmentsBuilder;Landroid/net/Uri$PathSegmentsBuilder;]Landroid/net/Uri$PathPart;Landroid/net/Uri$PathPart;
-HSPLandroid/net/Uri$PathPart;->makeAbsolute(Landroid/net/Uri$PathPart;)Landroid/net/Uri$PathPart;+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/net/Uri$PathSegments;-><init>([Ljava/lang/String;I)V
-HSPLandroid/net/Uri$PathSegments;->get(I)Ljava/lang/Object;
-HSPLandroid/net/Uri$PathSegments;->get(I)Ljava/lang/String;
-HSPLandroid/net/Uri$PathSegments;->size()I
-HSPLandroid/net/Uri$PathSegmentsBuilder;->add(Ljava/lang/String;)V
-HSPLandroid/net/Uri$PathSegmentsBuilder;->build()Landroid/net/Uri$PathSegments;
-HSPLandroid/net/Uri$StringUri;-><init>(Ljava/lang/String;)V
-HSPLandroid/net/Uri$StringUri;-><init>(Ljava/lang/String;Landroid/net/Uri$StringUri-IA;)V
-HSPLandroid/net/Uri$StringUri;->buildUpon()Landroid/net/Uri$Builder;+]Landroid/net/Uri$Builder;Landroid/net/Uri$Builder;]Landroid/net/Uri$StringUri;Landroid/net/Uri$StringUri;
-HSPLandroid/net/Uri$StringUri;->findFragmentSeparator()I+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->findSchemeSeparator()I+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->getAuthority()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->getAuthorityPart()Landroid/net/Uri$Part;
-HSPLandroid/net/Uri$StringUri;->getEncodedAuthority()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->getEncodedFragment()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->getEncodedPath()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->getEncodedQuery()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->getFragment()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->getFragmentPart()Landroid/net/Uri$Part;
-HSPLandroid/net/Uri$StringUri;->getPath()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->getPathPart()Landroid/net/Uri$PathPart;
-HSPLandroid/net/Uri$StringUri;->getPathSegments()Ljava/util/List;
-HSPLandroid/net/Uri$StringUri;->getQuery()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->getQueryPart()Landroid/net/Uri$Part;
-HSPLandroid/net/Uri$StringUri;->getScheme()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->getSchemeSpecificPart()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->isHierarchical()Z
-HSPLandroid/net/Uri$StringUri;->isRelative()Z
-HSPLandroid/net/Uri$StringUri;->parseAuthority(Ljava/lang/String;I)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->parseFragment()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->parsePath()Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->parsePath(Ljava/lang/String;I)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->parseQuery()Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->parseScheme()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->toString()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/net/Uri;-><init>()V
-HSPLandroid/net/Uri;-><init>(Landroid/net/Uri-IA;)V
-HSPLandroid/net/Uri;->checkContentUriWithoutPermission(Ljava/lang/String;I)V
-HSPLandroid/net/Uri;->checkFileUriExposed(Ljava/lang/String;)V
-HSPLandroid/net/Uri;->compareTo(Landroid/net/Uri;)I
-HSPLandroid/net/Uri;->compareTo(Ljava/lang/Object;)I
-HSPLandroid/net/Uri;->decode(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/net/Uri;->encode(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/net/Uri;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/net/Uri;->equals(Ljava/lang/Object;)Z
-HSPLandroid/net/Uri;->fromFile(Ljava/io/File;)Landroid/net/Uri;
-HSPLandroid/net/Uri;->fromParts(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;
-HSPLandroid/net/Uri;->getBooleanQueryParameter(Ljava/lang/String;Z)Z
-HSPLandroid/net/Uri;->getQueryParameter(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Landroid/net/Uri;Landroid/net/Uri$StringUri;
-HSPLandroid/net/Uri;->getQueryParameterNames()Ljava/util/Set;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/Set;Ljava/util/LinkedHashSet;]Landroid/net/Uri;Landroid/net/Uri$StringUri;
-HSPLandroid/net/Uri;->hashCode()I
-HSPLandroid/net/Uri;->isAbsolute()Z
-HSPLandroid/net/Uri;->isAllowed(CLjava/lang/String;)Z+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/net/Uri;->isOpaque()Z
-HSPLandroid/net/Uri;->normalizeScheme()Landroid/net/Uri;
-HSPLandroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;
-HSPLandroid/net/Uri;->toSafeString()Ljava/lang/String;
-HSPLandroid/net/Uri;->withAppendedPath(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;
-HSPLandroid/net/Uri;->writeToParcel(Landroid/os/Parcel;Landroid/net/Uri;)V
-HSPLandroid/net/UriCodec;->appendDecoded(Ljava/lang/StringBuilder;Ljava/lang/String;ZLjava/nio/charset/Charset;Z)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;Ljava/lang/String;]Ljava/nio/charset/Charset;Lcom/android/icu/charset/CharsetICU;]Ljava/nio/charset/CharsetDecoder;Lcom/android/icu/charset/CharsetDecoderICU;]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
-HSPLandroid/net/UriCodec;->decode(Ljava/lang/String;ZLjava/nio/charset/Charset;Z)Ljava/lang/String;
-HSPLandroid/net/UriCodec;->flushDecodingByteAccumulator(Ljava/lang/StringBuilder;Ljava/nio/charset/CharsetDecoder;Ljava/nio/ByteBuffer;Z)V+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/nio/charset/CharsetDecoder;Lcom/android/icu/charset/CharsetDecoderICU;
-HSPLandroid/net/UriCodec;->getNextCharacter(Ljava/lang/String;IILjava/lang/String;)C
-HSPLandroid/net/UriCodec;->hexCharToValue(C)I
-HSPLandroid/net/WebAddress;-><init>(Ljava/lang/String;)V
-HSPLandroid/net/WebAddress;->toString()Ljava/lang/String;
-HSPLandroid/net/WifiKey$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/WifiKey;
-HSPLandroid/net/WifiKey$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/net/WifiKey;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/net/WifiKey;->equals(Ljava/lang/Object;)Z
-HSPLandroid/net/WifiKey;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/net/http/X509TrustManagerExtensions;-><init>(Ljavax/net/ssl/X509TrustManager;)V
-HSPLandroid/net/http/X509TrustManagerExtensions;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
-HSPLandroid/net/metrics/IpConnectivityLog;-><init>()V
-HSPLandroid/net/vcn/VcnTransportInfo$1;-><init>()V
-HSPLandroid/net/vcn/VcnTransportInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/vcn/VcnTransportInfo;
-HSPLandroid/net/vcn/VcnTransportInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/net/vcn/VcnTransportInfo;-><clinit>()V
-HSPLandroid/nfc/NfcFrameworkInitializer;->setNfcServiceManager(Landroid/nfc/NfcServiceManager;)V
-HSPLandroid/nfc/NfcServiceManager;-><init>()V
-HSPLandroid/nfc/cardemulation/AidGroup$1;->createFromParcel(Landroid/os/Parcel;)Landroid/nfc/cardemulation/AidGroup;
-HSPLandroid/nfc/cardemulation/AidGroup$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/nfc/cardemulation/AidGroup;-><init>(Ljava/util/List;Ljava/lang/String;)V
-HSPLandroid/nfc/cardemulation/AidGroup;->isValidCategory(Ljava/lang/String;)Z
-HSPLandroid/opengl/EGL14;->eglCreateWindowSurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/lang/Object;[II)Landroid/opengl/EGLSurface;
-HSPLandroid/opengl/EGLConfig;-><init>(J)V
-HSPLandroid/opengl/EGLContext;-><init>(J)V
-HSPLandroid/opengl/EGLDisplay;-><init>(J)V
-HSPLandroid/opengl/EGLObjectHandle;->getNativeHandle()J
-HSPLandroid/opengl/EGLSurface;-><init>(J)V
-HSPLandroid/opengl/GLES20;->glVertexAttribPointer(IIIZILjava/nio/Buffer;)V
-HSPLandroid/opengl/Matrix;->setIdentityM([FI)V
-HSPLandroid/os/AsyncTask$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;
-HSPLandroid/os/AsyncTask$3;-><init>(Landroid/os/AsyncTask;)V
-HSPLandroid/os/AsyncTask$3;->call()Ljava/lang/Object;
-HSPLandroid/os/AsyncTask$4;-><init>(Landroid/os/AsyncTask;Ljava/util/concurrent/Callable;)V
-HSPLandroid/os/AsyncTask$4;->done()V
-HSPLandroid/os/AsyncTask$AsyncTaskResult;-><init>(Landroid/os/AsyncTask;[Ljava/lang/Object;)V
-HSPLandroid/os/AsyncTask$InternalHandler;-><init>(Landroid/os/Looper;)V
-HSPLandroid/os/AsyncTask$InternalHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/os/AsyncTask$SerialExecutor$1;-><init>(Landroid/os/AsyncTask$SerialExecutor;Ljava/lang/Runnable;)V
-HSPLandroid/os/AsyncTask$SerialExecutor$1;->run()V
-HSPLandroid/os/AsyncTask$SerialExecutor;->execute(Ljava/lang/Runnable;)V
-HSPLandroid/os/AsyncTask$SerialExecutor;->scheduleNext()V
-HSPLandroid/os/AsyncTask$WorkerRunnable;-><init>()V
-HSPLandroid/os/AsyncTask$WorkerRunnable;-><init>(Landroid/os/AsyncTask$WorkerRunnable-IA;)V
-HSPLandroid/os/AsyncTask;->-$$Nest$fgetmTaskInvoked(Landroid/os/AsyncTask;)Ljava/util/concurrent/atomic/AtomicBoolean;
-HSPLandroid/os/AsyncTask;->-$$Nest$mfinish(Landroid/os/AsyncTask;Ljava/lang/Object;)V
-HSPLandroid/os/AsyncTask;->-$$Nest$mpostResult(Landroid/os/AsyncTask;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/os/AsyncTask;->-$$Nest$mpostResultIfNotInvoked(Landroid/os/AsyncTask;Ljava/lang/Object;)V
-HSPLandroid/os/AsyncTask;-><init>()V
-HSPLandroid/os/AsyncTask;-><init>(Landroid/os/Looper;)V
-HSPLandroid/os/AsyncTask;->cancel(Z)Z
-HSPLandroid/os/AsyncTask;->execute(Ljava/lang/Runnable;)V
-HSPLandroid/os/AsyncTask;->execute([Ljava/lang/Object;)Landroid/os/AsyncTask;
-HSPLandroid/os/AsyncTask;->executeOnExecutor(Ljava/util/concurrent/Executor;[Ljava/lang/Object;)Landroid/os/AsyncTask;
-HSPLandroid/os/AsyncTask;->finish(Ljava/lang/Object;)V
-HSPLandroid/os/AsyncTask;->getHandler()Landroid/os/Handler;
-HSPLandroid/os/AsyncTask;->getMainHandler()Landroid/os/Handler;
-HSPLandroid/os/AsyncTask;->getStatus()Landroid/os/AsyncTask$Status;
-HSPLandroid/os/AsyncTask;->isCancelled()Z
-HSPLandroid/os/AsyncTask;->onCancelled()V
-HSPLandroid/os/AsyncTask;->onCancelled(Ljava/lang/Object;)V
-HSPLandroid/os/AsyncTask;->onPostExecute(Ljava/lang/Object;)V
-HSPLandroid/os/AsyncTask;->onPreExecute()V
-HSPLandroid/os/AsyncTask;->postResult(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/os/AsyncTask;->postResultIfNotInvoked(Ljava/lang/Object;)V
-HSPLandroid/os/BaseBundle;-><init>()V
-HSPLandroid/os/BaseBundle;-><init>(I)V
-HSPLandroid/os/BaseBundle;-><init>(Landroid/os/BaseBundle;)V
-HSPLandroid/os/BaseBundle;-><init>(Landroid/os/BaseBundle;Z)V+]Landroid/os/BaseBundle;Landroid/os/Bundle;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/BaseBundle;-><init>(Landroid/os/Parcel;I)V
-HSPLandroid/os/BaseBundle;-><init>(Ljava/lang/ClassLoader;I)V+]Ljava/lang/Object;Landroid/os/Bundle;,Landroid/os/PersistableBundle;]Ljava/lang/Class;Ljava/lang/Class;
-HSPLandroid/os/BaseBundle;->clear()V
-HSPLandroid/os/BaseBundle;->containsKey(Ljava/lang/String;)Z
-HSPLandroid/os/BaseBundle;->deepCopyValue(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/os/BaseBundle;->get(Ljava/lang/String;)Ljava/lang/Object;+]Landroid/os/BaseBundle;Landroid/os/Bundle;
-HSPLandroid/os/BaseBundle;->get(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;
-HSPLandroid/os/BaseBundle;->getArrayList(Ljava/lang/String;Ljava/lang/Class;)Ljava/util/ArrayList;
-HSPLandroid/os/BaseBundle;->getBoolean(Ljava/lang/String;)Z
-HSPLandroid/os/BaseBundle;->getBoolean(Ljava/lang/String;Z)Z
-HSPLandroid/os/BaseBundle;->getBooleanArray(Ljava/lang/String;)[Z
-HSPLandroid/os/BaseBundle;->getByteArray(Ljava/lang/String;)[B
-HSPLandroid/os/BaseBundle;->getCharSequence(Ljava/lang/String;)Ljava/lang/CharSequence;
-HSPLandroid/os/BaseBundle;->getCharSequenceArray(Ljava/lang/String;)[Ljava/lang/CharSequence;
-HSPLandroid/os/BaseBundle;->getFloat(Ljava/lang/String;F)F+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Float;Ljava/lang/Float;]Landroid/os/BaseBundle;Landroid/os/Bundle;
-HSPLandroid/os/BaseBundle;->getInt(Ljava/lang/String;)I
-HSPLandroid/os/BaseBundle;->getInt(Ljava/lang/String;I)I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/os/BaseBundle;Landroid/os/Bundle;
-HSPLandroid/os/BaseBundle;->getIntArray(Ljava/lang/String;)[I
-HSPLandroid/os/BaseBundle;->getIntegerArrayList(Ljava/lang/String;)Ljava/util/ArrayList;
-HSPLandroid/os/BaseBundle;->getLong(Ljava/lang/String;)J
-HSPLandroid/os/BaseBundle;->getLong(Ljava/lang/String;J)J
-HSPLandroid/os/BaseBundle;->getLongArray(Ljava/lang/String;)[J
-HSPLandroid/os/BaseBundle;->getSerializable(Ljava/lang/String;)Ljava/io/Serializable;
-HSPLandroid/os/BaseBundle;->getSerializable(Ljava/lang/String;Ljava/lang/Class;)Ljava/io/Serializable;
-HSPLandroid/os/BaseBundle;->getString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/os/BaseBundle;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/os/BaseBundle;->getStringArray(Ljava/lang/String;)[Ljava/lang/String;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/BaseBundle;Landroid/os/Bundle;
-HSPLandroid/os/BaseBundle;->getStringArrayList(Ljava/lang/String;)Ljava/util/ArrayList;
-HSPLandroid/os/BaseBundle;->getValue(Ljava/lang/String;)Ljava/lang/Object;+]Landroid/os/BaseBundle;Landroid/os/Bundle;
-HSPLandroid/os/BaseBundle;->getValue(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/os/BaseBundle;Landroid/os/Bundle;
-HSPLandroid/os/BaseBundle;->getValue(Ljava/lang/String;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/BaseBundle;Landroid/os/Bundle;
-HSPLandroid/os/BaseBundle;->getValueAt(ILjava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Class;Ljava/lang/Class;
-HSPLandroid/os/BaseBundle;->initializeFromParcelLocked(Landroid/os/Parcel;ZZ)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/BaseBundle;->isEmpty()Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/BaseBundle;Landroid/os/Bundle;
-HSPLandroid/os/BaseBundle;->isEmptyParcel()Z
-HSPLandroid/os/BaseBundle;->isEmptyParcel(Landroid/os/Parcel;)Z
-HSPLandroid/os/BaseBundle;->isParcelled()Z
-HSPLandroid/os/BaseBundle;->keySet()Ljava/util/Set;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/BaseBundle;Landroid/os/Bundle;
-HSPLandroid/os/BaseBundle;->putAll(Landroid/os/PersistableBundle;)V
-HSPLandroid/os/BaseBundle;->putAll(Landroid/util/ArrayMap;)V
-HSPLandroid/os/BaseBundle;->putBoolean(Ljava/lang/String;Z)V
-HSPLandroid/os/BaseBundle;->putBooleanArray(Ljava/lang/String;[Z)V
-HSPLandroid/os/BaseBundle;->putByteArray(Ljava/lang/String;[B)V
-HSPLandroid/os/BaseBundle;->putCharSequence(Ljava/lang/String;Ljava/lang/CharSequence;)V
-HSPLandroid/os/BaseBundle;->putCharSequenceArray(Ljava/lang/String;[Ljava/lang/CharSequence;)V
-HSPLandroid/os/BaseBundle;->putDouble(Ljava/lang/String;D)V
-HSPLandroid/os/BaseBundle;->putFloat(Ljava/lang/String;F)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/BaseBundle;Landroid/os/Bundle;
-HSPLandroid/os/BaseBundle;->putInt(Ljava/lang/String;I)V
-HSPLandroid/os/BaseBundle;->putIntArray(Ljava/lang/String;[I)V
-HSPLandroid/os/BaseBundle;->putLong(Ljava/lang/String;J)V
-HSPLandroid/os/BaseBundle;->putLongArray(Ljava/lang/String;[J)V
-HSPLandroid/os/BaseBundle;->putSerializable(Ljava/lang/String;Ljava/io/Serializable;)V
-HSPLandroid/os/BaseBundle;->putString(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/os/BaseBundle;->putStringArray(Ljava/lang/String;[Ljava/lang/String;)V
-HSPLandroid/os/BaseBundle;->putStringArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V
-HSPLandroid/os/BaseBundle;->readFromParcelInner(Landroid/os/Parcel;)V
-HSPLandroid/os/BaseBundle;->readFromParcelInner(Landroid/os/Parcel;I)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/BaseBundle;->recycleParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/BaseBundle;->remove(Ljava/lang/String;)V
-HSPLandroid/os/BaseBundle;->setClassLoader(Ljava/lang/ClassLoader;)V
-HSPLandroid/os/BaseBundle;->setShouldDefuse(Z)V
-HSPLandroid/os/BaseBundle;->size()I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/BaseBundle;Landroid/os/Bundle;
-HSPLandroid/os/BaseBundle;->unparcel()V+]Landroid/os/BaseBundle;Landroid/os/Bundle;,Landroid/os/PersistableBundle;
-HSPLandroid/os/BaseBundle;->unparcel(Z)V
-HSPLandroid/os/BaseBundle;->unwrapLazyValueFromMapLocked(ILjava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/BiFunction;Landroid/os/Parcel$LazyValue;]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;
-HSPLandroid/os/BaseBundle;->writeToParcelInner(Landroid/os/Parcel;I)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/BatteryManager;-><init>(Landroid/content/Context;Lcom/android/internal/app/IBatteryStats;Landroid/os/IBatteryPropertiesRegistrar;)V
-HSPLandroid/os/BatteryManager;->getIntProperty(I)I
-HSPLandroid/os/BatteryManager;->getLongProperty(I)J
-HSPLandroid/os/BatteryManager;->isCharging()Z
-HSPLandroid/os/BatteryManager;->queryProperty(I)J
-HSPLandroid/os/BatteryProperty;-><init>()V
-HSPLandroid/os/BatteryProperty;->getLong()J
-HSPLandroid/os/BatteryProperty;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/os/BatterySaverPolicyConfig;->getAdjustBrightnessFactor()F
-HSPLandroid/os/BatterySaverPolicyConfig;->getAdvertiseIsEnabled()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getDeferFullBackup()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getDeferKeyValueBackup()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getDeviceSpecificSettings()Ljava/util/Map;
-HSPLandroid/os/BatterySaverPolicyConfig;->getDisableAnimation()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getDisableAod()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getDisableLaunchBoost()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getDisableOptionalSensors()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getDisableVibration()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getEnableAdjustBrightness()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getEnableDataSaver()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getEnableFirewall()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getEnableQuickDoze()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getForceAllAppsStandby()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getForceBackgroundCheck()Z
-HSPLandroid/os/BatterySaverPolicyConfig;->getLocationMode()I
-HSPLandroid/os/BatteryStats$Counter;-><init>()V
-HSPLandroid/os/BatteryStats$LongCounter;-><init>()V
-HSPLandroid/os/BatteryStats$Timer;-><init>()V
-HSPLandroid/os/BatteryStats$Uid$Pkg$Serv;-><init>()V
-HSPLandroid/os/BatteryStats$Uid$Wakelock;-><init>()V
-HSPLandroid/os/BatteryStatsManager;-><init>(Lcom/android/internal/app/IBatteryStats;)V
-HSPLandroid/os/Binder$$ExternalSyntheticLambda1;->resolveWorkSourceUid(I)I
-HSPLandroid/os/Binder$PropagateWorkSourceTransactListener;->onTransactEnded(Ljava/lang/Object;)V
-HSPLandroid/os/Binder$PropagateWorkSourceTransactListener;->onTransactStarted(Landroid/os/IBinder;I)Ljava/lang/Object;
-HSPLandroid/os/Binder$ProxyTransactListener;->onTransactStarted(Landroid/os/IBinder;II)Ljava/lang/Object;+]Landroid/os/Binder$ProxyTransactListener;Landroid/os/Binder$PropagateWorkSourceTransactListener;
-HSPLandroid/os/Binder;-><init>()V
-HSPLandroid/os/Binder;-><init>(Ljava/lang/String;)V+]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry;
-HSPLandroid/os/Binder;->allowBlocking(Landroid/os/IBinder;)Landroid/os/IBinder;
-HSPLandroid/os/Binder;->attachInterface(Landroid/os/IInterface;Ljava/lang/String;)V
-HSPLandroid/os/Binder;->checkParcel(Landroid/os/IBinder;ILandroid/os/Parcel;Ljava/lang/String;)V
-HSPLandroid/os/Binder;->copyAllowBlocking(Landroid/os/IBinder;Landroid/os/IBinder;)V
-HSPLandroid/os/Binder;->defaultBlocking(Landroid/os/IBinder;)Landroid/os/IBinder;
-HSPLandroid/os/Binder;->doDump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
-HSPLandroid/os/Binder;->dump(Ljava/io/FileDescriptor;[Ljava/lang/String;)V
-HSPLandroid/os/Binder;->execTransact(IJJI)Z+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Binder;->execTransactInternal(ILandroid/os/Parcel;Landroid/os/Parcel;II)Z+]Landroid/os/Binder;missing_types
-HSPLandroid/os/Binder;->getCallingUserHandle()Landroid/os/UserHandle;
-HSPLandroid/os/Binder;->getInterfaceDescriptor()Ljava/lang/String;
-HSPLandroid/os/Binder;->getMaxTransactionId()I
-HSPLandroid/os/Binder;->getSimpleDescriptor()Ljava/lang/String;
-HSPLandroid/os/Binder;->getTransactionName(I)Ljava/lang/String;
-HSPLandroid/os/Binder;->getTransactionTraceName(I)Ljava/lang/String;+]Landroid/os/Binder;megamorphic_types]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;]Ljava/util/concurrent/atomic/AtomicReferenceArray;Ljava/util/concurrent/atomic/AtomicReferenceArray;
-HSPLandroid/os/Binder;->isBinderAlive()Z
-HSPLandroid/os/Binder;->isDirectlyHandlingTransaction()Z
-HSPLandroid/os/Binder;->isProxy(Landroid/os/IInterface;)Z
-HSPLandroid/os/Binder;->isStackTrackingEnabled()Z
-HSPLandroid/os/Binder;->lambda$static$1(I)I
-HSPLandroid/os/Binder;->linkToDeath(Landroid/os/IBinder$DeathRecipient;I)V
-HSPLandroid/os/Binder;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/os/Binder;->pingBinder()Z
-HSPLandroid/os/Binder;->queryLocalInterface(Ljava/lang/String;)Landroid/os/IInterface;
-HSPLandroid/os/Binder;->setProxyTransactListener(Landroid/os/Binder$ProxyTransactListener;)V
-HSPLandroid/os/Binder;->setTransactionCallback(Landroid/os/IBinderCallback;)V
-HSPLandroid/os/Binder;->transact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/os/Binder;->unlinkToDeath(Landroid/os/IBinder$DeathRecipient;I)Z
-HSPLandroid/os/Binder;->withCleanCallingIdentity(Lcom/android/internal/util/FunctionalUtils$ThrowingRunnable;)V
-HSPLandroid/os/BinderProxy$ProxyMap;->get(J)Landroid/os/BinderProxy;
-HSPLandroid/os/BinderProxy$ProxyMap;->hash(J)I
-HSPLandroid/os/BinderProxy$ProxyMap;->remove(II)V
-HSPLandroid/os/BinderProxy$ProxyMap;->set(JLandroid/os/BinderProxy;)V
-HSPLandroid/os/BinderProxy;-><init>(J)V
-HSPLandroid/os/BinderProxy;->getInstance(JJ)Landroid/os/BinderProxy;
-HSPLandroid/os/BinderProxy;->linkToDeath(Landroid/os/IBinder$DeathRecipient;I)V+]Ljava/util/List;Ljava/util/Collections$SynchronizedRandomAccessList;
-HSPLandroid/os/BinderProxy;->queryLocalInterface(Ljava/lang/String;)Landroid/os/IInterface;
-HSPLandroid/os/BinderProxy;->sendDeathNotice(Landroid/os/IBinder$DeathRecipient;Landroid/os/IBinder;)V
-HSPLandroid/os/BinderProxy;->transact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z+]Landroid/os/BinderProxy;Landroid/os/BinderProxy;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/BinderProxy;->unlinkToDeath(Landroid/os/IBinder$DeathRecipient;I)Z+]Ljava/util/List;Ljava/util/Collections$SynchronizedRandomAccessList;
-HSPLandroid/os/BluetoothServiceManager$ServiceRegisterer;-><init>(Ljava/lang/String;)V
-HSPLandroid/os/BluetoothServiceManager$ServiceRegisterer;->get()Landroid/os/IBinder;
-HSPLandroid/os/BluetoothServiceManager;-><init>()V
-HSPLandroid/os/BluetoothServiceManager;->getBluetoothManagerServiceRegisterer()Landroid/os/BluetoothServiceManager$ServiceRegisterer;
-HSPLandroid/os/Build$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/os/Build;->getRadioVersion()Ljava/lang/String;
-HSPLandroid/os/Build;->getSerial()Ljava/lang/String;
-HSPLandroid/os/Build;->isDebuggable()Z
-HSPLandroid/os/Build;->joinListOrElse(Ljava/util/List;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/os/Build;->lambda$joinListOrElse$0(Ljava/lang/Object;)Ljava/lang/String;
-HSPLandroid/os/Bundle$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/Bundle;
-HSPLandroid/os/Bundle$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/Bundle$1;->newArray(I)[Landroid/os/Bundle;
-HSPLandroid/os/Bundle$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/os/Bundle;-><init>()V
-HSPLandroid/os/Bundle;-><init>(I)V
-HSPLandroid/os/Bundle;-><init>(Landroid/os/Bundle;)V
-HSPLandroid/os/Bundle;-><init>(Landroid/os/Bundle;Z)V
-HSPLandroid/os/Bundle;-><init>(Landroid/os/Parcel;I)V
-HSPLandroid/os/Bundle;-><init>(Landroid/os/PersistableBundle;)V
-HSPLandroid/os/Bundle;->clear()V
-HSPLandroid/os/Bundle;->clone()Ljava/lang/Object;
-HSPLandroid/os/Bundle;->deepCopy()Landroid/os/Bundle;
-HSPLandroid/os/Bundle;->forPair(Ljava/lang/String;Ljava/lang/String;)Landroid/os/Bundle;
-HSPLandroid/os/Bundle;->getBinder(Ljava/lang/String;)Landroid/os/IBinder;
-HSPLandroid/os/Bundle;->getBundle(Ljava/lang/String;)Landroid/os/Bundle;
-HSPLandroid/os/Bundle;->getByteArray(Ljava/lang/String;)[B
-HSPLandroid/os/Bundle;->getCharSequence(Ljava/lang/String;)Ljava/lang/CharSequence;
-HSPLandroid/os/Bundle;->getFloat(Ljava/lang/String;)F
-HSPLandroid/os/Bundle;->getFloat(Ljava/lang/String;F)F
-HSPLandroid/os/Bundle;->getIntegerArrayList(Ljava/lang/String;)Ljava/util/ArrayList;
-HSPLandroid/os/Bundle;->getParcelable(Ljava/lang/String;)Landroid/os/Parcelable;
-HSPLandroid/os/Bundle;->getParcelable(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;
-HSPLandroid/os/Bundle;->getParcelableArray(Ljava/lang/String;)[Landroid/os/Parcelable;+]Landroid/os/Bundle;Landroid/os/Bundle;
-HSPLandroid/os/Bundle;->getParcelableArray(Ljava/lang/String;Ljava/lang/Class;)[Ljava/lang/Object;
-HSPLandroid/os/Bundle;->getParcelableArrayList(Ljava/lang/String;)Ljava/util/ArrayList;
-HSPLandroid/os/Bundle;->getSerializable(Ljava/lang/String;)Ljava/io/Serializable;
-HSPLandroid/os/Bundle;->getSerializable(Ljava/lang/String;Ljava/lang/Class;)Ljava/io/Serializable;
-HSPLandroid/os/Bundle;->getSparseParcelableArray(Ljava/lang/String;)Landroid/util/SparseArray;
-HSPLandroid/os/Bundle;->getStringArrayList(Ljava/lang/String;)Ljava/util/ArrayList;
-HSPLandroid/os/Bundle;->hasFileDescriptors()Z
-HSPLandroid/os/Bundle;->maybePrefillHasFds()V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Bundle;->putAll(Landroid/os/Bundle;)V
-HSPLandroid/os/Bundle;->putBinder(Ljava/lang/String;Landroid/os/IBinder;)V
-HSPLandroid/os/Bundle;->putBundle(Ljava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/os/Bundle;->putByteArray(Ljava/lang/String;[B)V
-HSPLandroid/os/Bundle;->putCharSequence(Ljava/lang/String;Ljava/lang/CharSequence;)V
-HSPLandroid/os/Bundle;->putCharSequenceArray(Ljava/lang/String;[Ljava/lang/CharSequence;)V
-HSPLandroid/os/Bundle;->putFloat(Ljava/lang/String;F)V
-HSPLandroid/os/Bundle;->putIntegerArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V
-HSPLandroid/os/Bundle;->putParcelable(Ljava/lang/String;Landroid/os/Parcelable;)V
-HSPLandroid/os/Bundle;->putParcelableArray(Ljava/lang/String;[Landroid/os/Parcelable;)V
-HSPLandroid/os/Bundle;->putParcelableArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V
-HSPLandroid/os/Bundle;->putParcelableList(Ljava/lang/String;Ljava/util/List;)V
-HSPLandroid/os/Bundle;->putSerializable(Ljava/lang/String;Ljava/io/Serializable;)V
-HSPLandroid/os/Bundle;->putSparseParcelableArray(Ljava/lang/String;Landroid/util/SparseArray;)V
-HSPLandroid/os/Bundle;->putStringArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V
-HSPLandroid/os/Bundle;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/os/Bundle;->remove(Ljava/lang/String;)V
-HSPLandroid/os/Bundle;->setAllowFds(Z)Z
-HSPLandroid/os/Bundle;->setClassLoader(Ljava/lang/ClassLoader;)V
-HSPLandroid/os/Bundle;->setDefusable(Landroid/os/Bundle;Z)Landroid/os/Bundle;
-HSPLandroid/os/Bundle;->setDefusable(Z)V
-HSPLandroid/os/Bundle;->toString()Ljava/lang/String;
-HSPLandroid/os/Bundle;->writeToParcel(Landroid/os/Parcel;I)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/CancellationSignal$Transport;-><init>()V
-HSPLandroid/os/CancellationSignal$Transport;->cancel()V
-HSPLandroid/os/CancellationSignal;-><init>()V
-HSPLandroid/os/CancellationSignal;->cancel()V
-HSPLandroid/os/CancellationSignal;->createTransport()Landroid/os/ICancellationSignal;
-HSPLandroid/os/CancellationSignal;->fromTransport(Landroid/os/ICancellationSignal;)Landroid/os/CancellationSignal;
-HSPLandroid/os/CancellationSignal;->isCanceled()Z
-HSPLandroid/os/CancellationSignal;->setOnCancelListener(Landroid/os/CancellationSignal$OnCancelListener;)V
-HSPLandroid/os/CancellationSignal;->setRemote(Landroid/os/ICancellationSignal;)V
-HSPLandroid/os/CancellationSignal;->throwIfCanceled()V
-HSPLandroid/os/CancellationSignal;->waitForCancelFinishedLocked()V
-HSPLandroid/os/CombinedVibration$Mono$1;-><init>()V
-HSPLandroid/os/CombinedVibration$Mono;-><clinit>()V
-HSPLandroid/os/CombinedVibration$Mono;-><init>(Landroid/os/VibrationEffect;)V
-HSPLandroid/os/CombinedVibration$Mono;->validate()V
-HSPLandroid/os/CombinedVibration;-><init>()V
-HSPLandroid/os/ConditionVariable;-><init>()V
-HSPLandroid/os/ConditionVariable;-><init>(Z)V
-HSPLandroid/os/ConditionVariable;->block()V
-HSPLandroid/os/ConditionVariable;->block(J)Z
-HSPLandroid/os/ConditionVariable;->close()V
-HSPLandroid/os/ConditionVariable;->open()V
-HSPLandroid/os/DdmSyncStageUpdater;-><clinit>()V
-HSPLandroid/os/DdmSyncStageUpdater;-><init>()V
-HSPLandroid/os/DdmSyncStageUpdater;->next(Landroid/os/DdmSyncState$Stage;)V
-HSPLandroid/os/DdmSyncState$Stage;->$values()[Landroid/os/DdmSyncState$Stage;
-HSPLandroid/os/DdmSyncState$Stage;-><clinit>()V
-HSPLandroid/os/DdmSyncState$Stage;-><init>(Ljava/lang/String;ILjava/lang/String;)V
-HSPLandroid/os/DdmSyncState$Stage;->toInt()I
-HSPLandroid/os/DdmSyncState$Stage;->values()[Landroid/os/DdmSyncState$Stage;
-HSPLandroid/os/DdmSyncState;-><clinit>()V
-HSPLandroid/os/DdmSyncState;->next(Landroid/os/DdmSyncState$Stage;)V
-HSPLandroid/os/DeadObjectException;-><init>()V
-HSPLandroid/os/DeadObjectException;-><init>(Ljava/lang/String;)V
-HSPLandroid/os/Debug$MemoryInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/Debug$MemoryInfo;
-HSPLandroid/os/Debug$MemoryInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/Debug$MemoryInfo$1;->newArray(I)[Landroid/os/Debug$MemoryInfo;
-HSPLandroid/os/Debug$MemoryInfo$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/os/Debug$MemoryInfo;-><init>()V
-HSPLandroid/os/Debug$MemoryInfo;->getMemoryStat(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/os/Debug$MemoryInfo;->getMemoryStats()Ljava/util/Map;
-HSPLandroid/os/Debug$MemoryInfo;->getOtherLabel(I)Ljava/lang/String;
-HSPLandroid/os/Debug$MemoryInfo;->getOtherPrivate(I)I
-HSPLandroid/os/Debug$MemoryInfo;->getOtherPrivateClean(I)I
-HSPLandroid/os/Debug$MemoryInfo;->getOtherPrivateDirty(I)I
-HSPLandroid/os/Debug$MemoryInfo;->getOtherPss(I)I
-HSPLandroid/os/Debug$MemoryInfo;->getOtherRss(I)I
-HSPLandroid/os/Debug$MemoryInfo;->getOtherSharedClean(I)I
-HSPLandroid/os/Debug$MemoryInfo;->getOtherSharedDirty(I)I
-HSPLandroid/os/Debug$MemoryInfo;->getOtherSwappablePss(I)I
-HSPLandroid/os/Debug$MemoryInfo;->getOtherSwappedOut(I)I
-HSPLandroid/os/Debug$MemoryInfo;->getOtherSwappedOutPss(I)I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryCode()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryCodeRss()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryGraphics()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryGraphicsRss()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryJavaHeap()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryJavaHeapRss()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryNativeHeap()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryNativeHeapRss()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryPrivateOther()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryStack()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryStackRss()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummarySystem()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryTotalPss()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryTotalSwap()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryTotalSwapPss()I
-HSPLandroid/os/Debug$MemoryInfo;->getSummaryUnknownRss()I
-HSPLandroid/os/Debug$MemoryInfo;->getTotalPrivateClean()I
-HSPLandroid/os/Debug$MemoryInfo;->getTotalPrivateDirty()I
-HSPLandroid/os/Debug$MemoryInfo;->getTotalPss()I
-HSPLandroid/os/Debug$MemoryInfo;->getTotalRss()I
-HSPLandroid/os/Debug$MemoryInfo;->getTotalSharedClean()I
-HSPLandroid/os/Debug$MemoryInfo;->getTotalSharedDirty()I
-HSPLandroid/os/Debug$MemoryInfo;->getTotalSwappablePss()I
-HSPLandroid/os/Debug$MemoryInfo;->getTotalSwappedOut()I
-HSPLandroid/os/Debug$MemoryInfo;->getTotalSwappedOutPss()I
-HSPLandroid/os/Debug$MemoryInfo;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/os/Debug;->getCaller([Ljava/lang/StackTraceElement;I)Ljava/lang/String;
-HSPLandroid/os/Debug;->getCallers(ILjava/lang/String;)Ljava/lang/String;
-HSPLandroid/os/Debug;->isDebuggerConnected()Z
-HSPLandroid/os/Debug;->threadCpuTimeNanos()J
-HSPLandroid/os/Debug;->waitingForDebugger()Z
-HSPLandroid/os/DeviceIdleManager;-><init>(Landroid/content/Context;Landroid/os/IDeviceIdleController;)V
-HSPLandroid/os/DeviceIdleManager;->getService()Landroid/os/IDeviceIdleController;
-HSPLandroid/os/DropBoxManager$Entry$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/DropBoxManager$Entry;
-HSPLandroid/os/DropBoxManager$Entry$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/DropBoxManager$Entry;-><init>(Ljava/lang/String;JLandroid/os/ParcelFileDescriptor;I)V
-HSPLandroid/os/DropBoxManager$Entry;-><init>(Ljava/lang/String;JLjava/io/File;I)V
-HSPLandroid/os/DropBoxManager$Entry;->close()V
-HSPLandroid/os/DropBoxManager$Entry;->getFlags()I
-HSPLandroid/os/DropBoxManager$Entry;->getInputStream()Ljava/io/InputStream;
-HSPLandroid/os/DropBoxManager$Entry;->getTag()Ljava/lang/String;
-HSPLandroid/os/DropBoxManager$Entry;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/DropBoxManager;-><init>(Landroid/content/Context;Lcom/android/internal/os/IDropBoxManagerService;)V
-HSPLandroid/os/DropBoxManager;->addFile(Ljava/lang/String;Ljava/io/File;I)V
-HSPLandroid/os/DropBoxManager;->addText(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/os/Environment$UserEnvironment;-><init>(I)V
-HSPLandroid/os/Environment$UserEnvironment;->buildExternalStorageAppCacheDirs(Ljava/lang/String;)[Ljava/io/File;
-HSPLandroid/os/Environment$UserEnvironment;->buildExternalStorageAppFilesDirs(Ljava/lang/String;)[Ljava/io/File;
-HSPLandroid/os/Environment$UserEnvironment;->buildExternalStorageAppMediaDirs(Ljava/lang/String;)[Ljava/io/File;
-HSPLandroid/os/Environment$UserEnvironment;->buildExternalStoragePublicDirs(Ljava/lang/String;)[Ljava/io/File;
-HSPLandroid/os/Environment$UserEnvironment;->getExternalDirs()[Ljava/io/File;
-HSPLandroid/os/Environment;->buildExternalStorageAppFilesDirs(Ljava/lang/String;)[Ljava/io/File;
-HSPLandroid/os/Environment;->buildExternalStorageAppMediaDirs(Ljava/lang/String;)[Ljava/io/File;
-HSPLandroid/os/Environment;->buildPath(Ljava/io/File;[Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/os/Environment;->buildPaths([Ljava/io/File;[Ljava/lang/String;)[Ljava/io/File;
-HSPLandroid/os/Environment;->getDataDirectory()Ljava/io/File;
-HSPLandroid/os/Environment;->getDataDirectory(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/os/Environment;->getDataDirectoryPath()Ljava/lang/String;
-HSPLandroid/os/Environment;->getDataDirectoryPath(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/os/Environment;->getDataPreloadsDirectory()Ljava/io/File;
-HSPLandroid/os/Environment;->getDataProfilesDeDirectory(I)Ljava/io/File;
-HSPLandroid/os/Environment;->getDataProfilesDePackageDirectory(ILjava/lang/String;)Ljava/io/File;
-HSPLandroid/os/Environment;->getDataRefProfilesDePackageDirectory(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/os/Environment;->getDataUserCeDirectory(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/os/Environment;->getDataUserCeDirectory(Ljava/lang/String;I)Ljava/io/File;
-HSPLandroid/os/Environment;->getDataUserCePackageDirectory(Ljava/lang/String;ILjava/lang/String;)Ljava/io/File;
-HSPLandroid/os/Environment;->getDataUserDeDirectory(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/os/Environment;->getDataUserDeDirectory(Ljava/lang/String;I)Ljava/io/File;
-HSPLandroid/os/Environment;->getDataUserDePackageDirectory(Ljava/lang/String;ILjava/lang/String;)Ljava/io/File;
-HSPLandroid/os/Environment;->getDownloadCacheDirectory()Ljava/io/File;
-HSPLandroid/os/Environment;->getExternalStorageDirectory()Ljava/io/File;
-HSPLandroid/os/Environment;->getExternalStoragePublicDirectory(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/os/Environment;->getExternalStorageState()Ljava/lang/String;
-HSPLandroid/os/Environment;->getExternalStorageState(Ljava/io/File;)Ljava/lang/String;
-HSPLandroid/os/Environment;->getOemDirectory()Ljava/io/File;
-HSPLandroid/os/Environment;->getProductDirectory()Ljava/io/File;
-HSPLandroid/os/Environment;->getRootDirectory()Ljava/io/File;
-HSPLandroid/os/Environment;->getSystemExtDirectory()Ljava/io/File;
-HSPLandroid/os/Environment;->getUserConfigDirectory(I)Ljava/io/File;
-HSPLandroid/os/Environment;->initForCurrentUser()V
-HSPLandroid/os/Environment;->isExternalStorageEmulated()Z
-HSPLandroid/os/Environment;->isExternalStorageEmulated(Ljava/io/File;)Z
-HSPLandroid/os/Environment;->isExternalStorageRemovable(Ljava/io/File;)Z
-HSPLandroid/os/Environment;->throwIfUserRequired()V
-HSPLandroid/os/FactoryTest;->getMode()I
-HSPLandroid/os/FileObserver$ObserverThread;-><init>()V
-HSPLandroid/os/FileObserver$ObserverThread;->onEvent(IILjava/lang/String;)V
-HSPLandroid/os/FileObserver$ObserverThread;->run()V
-HSPLandroid/os/FileObserver$ObserverThread;->startWatching(Ljava/util/List;ILandroid/os/FileObserver;)[I
-HSPLandroid/os/FileObserver;-><clinit>()V
-HSPLandroid/os/FileObserver;-><init>(Ljava/io/File;I)V
-HSPLandroid/os/FileObserver;-><init>(Ljava/lang/String;I)V
-HSPLandroid/os/FileObserver;-><init>(Ljava/util/List;I)V
-HSPLandroid/os/FileObserver;->startWatching()V
-HSPLandroid/os/FileUtils;->buildValidExtFilename(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/Object;Ljava/lang/String;
-HSPLandroid/os/FileUtils;->bytesToFile(Ljava/lang/String;[B)V
-HSPLandroid/os/FileUtils;->closeQuietly(Ljava/lang/AutoCloseable;)V
-HSPLandroid/os/FileUtils;->contains(Ljava/io/File;Ljava/io/File;)Z
-HSPLandroid/os/FileUtils;->contains(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLandroid/os/FileUtils;->convertToModernFd(Ljava/io/FileDescriptor;)Landroid/os/ParcelFileDescriptor;
-HSPLandroid/os/FileUtils;->copy(Ljava/io/InputStream;Ljava/io/OutputStream;)J
-HSPLandroid/os/FileUtils;->copy(Ljava/io/InputStream;Ljava/io/OutputStream;Landroid/os/CancellationSignal;Ljava/util/concurrent/Executor;Landroid/os/FileUtils$ProgressListener;)J
-HSPLandroid/os/FileUtils;->copyInternalUserspace(Ljava/io/InputStream;Ljava/io/OutputStream;Landroid/os/CancellationSignal;Ljava/util/concurrent/Executor;Landroid/os/FileUtils$ProgressListener;)J
-HSPLandroid/os/FileUtils;->getMediaProviderAppId(Landroid/content/Context;)I
-HSPLandroid/os/FileUtils;->isValidExtFilename(Ljava/lang/String;)Z
-HSPLandroid/os/FileUtils;->listFilesOrEmpty(Ljava/io/File;Ljava/io/FilenameFilter;)[Ljava/io/File;
-HSPLandroid/os/FileUtils;->listOrEmpty(Ljava/io/File;)[Ljava/lang/String;
-HSPLandroid/os/FileUtils;->newFileOrNull(Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/os/FileUtils;->setPermissions(Ljava/lang/String;III)I
-HSPLandroid/os/FileUtils;->sync(Ljava/io/FileOutputStream;)Z
-HSPLandroid/os/FileUtils;->translateModePfdToPosix(I)I
-HSPLandroid/os/FileUtils;->translateModePosixToPfd(I)I
-HSPLandroid/os/FileUtils;->translateModeStringToPosix(Ljava/lang/String;)I
-HSPLandroid/os/FileUtils;->trimFilename(Ljava/lang/StringBuilder;I)V
-HSPLandroid/os/GraphicsEnvironment;->chooseDriver(Landroid/content/Context;Landroid/os/Bundle;Landroid/content/pm/PackageManager;Ljava/lang/String;Landroid/content/pm/ApplicationInfo;)Z
-HSPLandroid/os/GraphicsEnvironment;->chooseDriverInternal(Landroid/os/Bundle;Landroid/content/pm/ApplicationInfo;)Ljava/lang/String;
-HSPLandroid/os/GraphicsEnvironment;->debugLayerEnabled(Landroid/os/Bundle;Ljava/lang/String;Landroid/content/pm/ApplicationInfo;)Z
-HSPLandroid/os/GraphicsEnvironment;->getAppInfoWithMetadata(Landroid/content/Context;Landroid/content/pm/PackageManager;Ljava/lang/String;)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/os/GraphicsEnvironment;->getGlobalSettingsString(Landroid/content/ContentResolver;Landroid/os/Bundle;Ljava/lang/String;)Ljava/util/List;
-HSPLandroid/os/GraphicsEnvironment;->getInstance()Landroid/os/GraphicsEnvironment;
-HSPLandroid/os/GraphicsEnvironment;->getPackageIndex(Ljava/lang/String;Ljava/util/List;)I
-HSPLandroid/os/GraphicsEnvironment;->getVulkanVersion(Landroid/content/pm/PackageManager;)I
-HSPLandroid/os/GraphicsEnvironment;->queryAngleChoiceInternal(Landroid/content/Context;Landroid/os/Bundle;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/os/GraphicsEnvironment;->setLayerPaths(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/os/GraphicsEnvironment;->setup(Landroid/content/Context;Landroid/os/Bundle;)V
-HSPLandroid/os/GraphicsEnvironment;->setupAngle(Landroid/content/Context;Landroid/os/Bundle;Landroid/content/pm/PackageManager;Ljava/lang/String;)Z
-HSPLandroid/os/GraphicsEnvironment;->setupGpuLayers(Landroid/content/Context;Landroid/os/Bundle;Landroid/content/pm/PackageManager;Ljava/lang/String;Landroid/content/pm/ApplicationInfo;)V
-HSPLandroid/os/GraphicsEnvironment;->shouldShowAngleInUseDialogBox(Landroid/content/Context;)Z
-HSPLandroid/os/GraphicsEnvironment;->showAngleInUseDialogBox(Landroid/content/Context;)V
-HSPLandroid/os/Handler$BlockingRunnable;-><init>(Ljava/lang/Runnable;)V
-HSPLandroid/os/Handler$BlockingRunnable;->postAndWait(Landroid/os/Handler;J)Z
-HSPLandroid/os/Handler$BlockingRunnable;->run()V
-HSPLandroid/os/Handler$MessengerImpl;-><init>(Landroid/os/Handler;)V
-HSPLandroid/os/Handler$MessengerImpl;-><init>(Landroid/os/Handler;Landroid/os/Handler$MessengerImpl-IA;)V
-HSPLandroid/os/Handler$MessengerImpl;->send(Landroid/os/Message;)V
-HSPLandroid/os/Handler;-><init>()V
-HSPLandroid/os/Handler;-><init>(Landroid/os/Handler$Callback;)V
-HSPLandroid/os/Handler;-><init>(Landroid/os/Handler$Callback;Z)V
-HSPLandroid/os/Handler;-><init>(Landroid/os/Looper;)V
-HSPLandroid/os/Handler;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;)V
-HSPLandroid/os/Handler;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;Z)V
-HSPLandroid/os/Handler;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;ZZ)V
-HSPLandroid/os/Handler;-><init>(Z)V
-HSPLandroid/os/Handler;->createAsync(Landroid/os/Looper;)Landroid/os/Handler;
-HSPLandroid/os/Handler;->disallowNullArgumentIfShared(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/os/Handler;->dispatchMessage(Landroid/os/Message;)V+]Landroid/os/Handler;missing_types
-HSPLandroid/os/Handler;->enqueueMessage(Landroid/os/MessageQueue;Landroid/os/Message;J)Z+]Landroid/os/Message;Landroid/os/Message;]Landroid/os/MessageQueue;Landroid/os/MessageQueue;
-HSPLandroid/os/Handler;->executeOrSendMessage(Landroid/os/Message;)Z
-HSPLandroid/os/Handler;->getIMessenger()Landroid/os/IMessenger;
-HSPLandroid/os/Handler;->getLooper()Landroid/os/Looper;
-HSPLandroid/os/Handler;->getMain()Landroid/os/Handler;
-HSPLandroid/os/Handler;->getPostMessage(Ljava/lang/Runnable;)Landroid/os/Message;
-HSPLandroid/os/Handler;->getPostMessage(Ljava/lang/Runnable;Ljava/lang/Object;)Landroid/os/Message;
-HSPLandroid/os/Handler;->getTraceName(Landroid/os/Message;)Ljava/lang/String;
-HSPLandroid/os/Handler;->handleCallback(Landroid/os/Message;)V+]Ljava/lang/Runnable;missing_types
-HSPLandroid/os/Handler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/os/Handler;->hasCallbacks(Ljava/lang/Runnable;)Z
-HSPLandroid/os/Handler;->hasMessages(I)Z
-HSPLandroid/os/Handler;->hasMessages(ILjava/lang/Object;)Z
-HSPLandroid/os/Handler;->obtainMessage()Landroid/os/Message;
-HSPLandroid/os/Handler;->obtainMessage(I)Landroid/os/Message;
-HSPLandroid/os/Handler;->obtainMessage(III)Landroid/os/Message;
-HSPLandroid/os/Handler;->obtainMessage(IIILjava/lang/Object;)Landroid/os/Message;
-HSPLandroid/os/Handler;->obtainMessage(ILjava/lang/Object;)Landroid/os/Message;
-HSPLandroid/os/Handler;->post(Ljava/lang/Runnable;)Z+]Landroid/os/Handler;missing_types
-HSPLandroid/os/Handler;->postAtFrontOfQueue(Ljava/lang/Runnable;)Z
-HSPLandroid/os/Handler;->postAtTime(Ljava/lang/Runnable;J)Z+]Landroid/os/Handler;Landroid/view/ViewRootImpl$ViewRootHandler;
-HSPLandroid/os/Handler;->postAtTime(Ljava/lang/Runnable;Ljava/lang/Object;J)Z
-HSPLandroid/os/Handler;->postDelayed(Ljava/lang/Runnable;IJ)Z
-HSPLandroid/os/Handler;->postDelayed(Ljava/lang/Runnable;J)Z
-HSPLandroid/os/Handler;->postDelayed(Ljava/lang/Runnable;Ljava/lang/Object;J)Z
-HSPLandroid/os/Handler;->removeCallbacks(Ljava/lang/Runnable;)V
-HSPLandroid/os/Handler;->removeCallbacksAndMessages(Ljava/lang/Object;)V
-HSPLandroid/os/Handler;->removeMessages(I)V
-HSPLandroid/os/Handler;->removeMessages(ILjava/lang/Object;)V
-HSPLandroid/os/Handler;->runWithScissors(Ljava/lang/Runnable;J)Z
-HSPLandroid/os/Handler;->sendEmptyMessage(I)Z
-HSPLandroid/os/Handler;->sendEmptyMessageAtTime(IJ)Z
-HSPLandroid/os/Handler;->sendEmptyMessageDelayed(IJ)Z
-HSPLandroid/os/Handler;->sendMessage(Landroid/os/Message;)Z+]Landroid/os/Handler;missing_types
-HSPLandroid/os/Handler;->sendMessageAtFrontOfQueue(Landroid/os/Message;)Z
-HSPLandroid/os/Handler;->sendMessageAtTime(Landroid/os/Message;J)Z
-HSPLandroid/os/Handler;->sendMessageDelayed(Landroid/os/Message;J)Z+]Landroid/os/Handler;missing_types
-HSPLandroid/os/Handler;->toString()Ljava/lang/String;
-HSPLandroid/os/HandlerExecutor;-><init>(Landroid/os/Handler;)V
-HSPLandroid/os/HandlerExecutor;->execute(Ljava/lang/Runnable;)V
-HSPLandroid/os/HandlerThread;-><init>(Ljava/lang/String;)V
-HSPLandroid/os/HandlerThread;-><init>(Ljava/lang/String;I)V
-HSPLandroid/os/HandlerThread;->getLooper()Landroid/os/Looper;
-HSPLandroid/os/HandlerThread;->getThreadHandler()Landroid/os/Handler;
-HSPLandroid/os/HandlerThread;->getThreadId()I
-HSPLandroid/os/HandlerThread;->onCreated()V
-HSPLandroid/os/HandlerThread;->onLooperPrepared()V
-HSPLandroid/os/HandlerThread;->quit()Z
-HSPLandroid/os/HandlerThread;->quitSafely()Z
-HSPLandroid/os/HandlerThread;->run()V
-HSPLandroid/os/HwBinder;-><init>()V
-HSPLandroid/os/HwBinder;->getService(Ljava/lang/String;Ljava/lang/String;)Landroid/os/IHwBinder;
-HSPLandroid/os/HwBlob;-><init>(I)V
-HSPLandroid/os/HwBlob;->wrapArray([B)[Ljava/lang/Byte;
-HSPLandroid/os/HwParcel;-><init>()V
-HSPLandroid/os/HwParcel;-><init>(Z)V
-HSPLandroid/os/HwParcel;->readInt8Vector()Ljava/util/ArrayList;
-HSPLandroid/os/HwParcel;->readStringVector()Ljava/util/ArrayList;
-HSPLandroid/os/HwParcel;->writeInt8Vector(Ljava/util/ArrayList;)V
-HSPLandroid/os/HwParcel;->writeStringVector(Ljava/util/ArrayList;)V
-HSPLandroid/os/HwRemoteBinder;-><init>()V
-HSPLandroid/os/HwRemoteBinder;->queryLocalInterface(Ljava/lang/String;)Landroid/os/IHwInterface;
-HSPLandroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;->getProperty(ILandroid/os/BatteryProperty;)I
-HSPLandroid/os/IBatteryPropertiesRegistrar$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IBatteryPropertiesRegistrar;
-HSPLandroid/os/IBinder$DeathRecipient;->binderDied(Landroid/os/IBinder;)V+]Landroid/os/IBinder$DeathRecipient;Landroid/os/RemoteCallbackList$Callback;
-HSPLandroid/os/IBinder;->getSuggestedMaxIpcSizeBytes()I
-HSPLandroid/os/ICancellationSignal$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/ICancellationSignal$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/ICancellationSignal$Stub$Proxy;->cancel()V
-HSPLandroid/os/ICancellationSignal$Stub;-><init>()V
-HSPLandroid/os/ICancellationSignal$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/ICancellationSignal$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/ICancellationSignal;
-HSPLandroid/os/IDeviceIdentifiersPolicyService$Stub$Proxy;->getSerialForPackage(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/os/IDeviceIdentifiersPolicyService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IDeviceIdentifiersPolicyService;
-HSPLandroid/os/IDeviceIdleController$Stub$Proxy;->isPowerSaveWhitelistApp(Ljava/lang/String;)Z
-HSPLandroid/os/IDeviceIdleController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IDeviceIdleController;
-HSPLandroid/os/IHintManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/IHintManager$Stub$Proxy;->createHintSession(Landroid/os/IBinder;[IJ)Landroid/os/IHintSession;
-HSPLandroid/os/IHintManager$Stub$Proxy;->getHintSessionPreferredRate()J
-HSPLandroid/os/IHintManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IHintManager;
-HSPLandroid/os/IHintSession$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IHintSession;
-HSPLandroid/os/IMessenger$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/IMessenger$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/IMessenger$Stub$Proxy;->send(Landroid/os/Message;)V
-HSPLandroid/os/IMessenger$Stub;-><init>()V
-HSPLandroid/os/IMessenger$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/IMessenger$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IMessenger;
-HSPLandroid/os/IMessenger$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
-HSPLandroid/os/IMessenger$Stub;->getMaxTransactionId()I
-HSPLandroid/os/IMessenger$Stub;->getTransactionName(I)Ljava/lang/String;
-HSPLandroid/os/IMessenger$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/os/INetworkManagementService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/INetworkManagementService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/INetworkManagementService$Stub$Proxy;->setUidCleartextNetworkPolicy(II)V
-HSPLandroid/os/INetworkManagementService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/INetworkManagementService;
-HSPLandroid/os/IPowerManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/IPowerManager$Stub$Proxy;->acquireWakeLock(Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;ILandroid/os/IWakeLockCallback;)V
-HSPLandroid/os/IPowerManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/IPowerManager$Stub$Proxy;->getPowerSaveState(I)Landroid/os/PowerSaveState;
-HSPLandroid/os/IPowerManager$Stub$Proxy;->isDeviceIdleMode()Z
-HSPLandroid/os/IPowerManager$Stub$Proxy;->isInteractive()Z
-HSPLandroid/os/IPowerManager$Stub$Proxy;->isLightDeviceIdleMode()Z
-HSPLandroid/os/IPowerManager$Stub$Proxy;->isPowerSaveMode()Z
-HSPLandroid/os/IPowerManager$Stub$Proxy;->releaseWakeLock(Landroid/os/IBinder;I)V
-HSPLandroid/os/IPowerManager$Stub$Proxy;->updateWakeLockWorkSource(Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;)V
-HSPLandroid/os/IPowerManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IPowerManager;
-HSPLandroid/os/IPowerManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/os/IRemoteCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/IRemoteCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/IRemoteCallback$Stub$Proxy;->sendResult(Landroid/os/Bundle;)V
-HSPLandroid/os/IRemoteCallback$Stub;-><init>()V
-HSPLandroid/os/IRemoteCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/IRemoteCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IRemoteCallback;
-HSPLandroid/os/IRemoteCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/os/IServiceManager$Stub$Proxy;->addService(Ljava/lang/String;Landroid/os/IBinder;ZI)V
-HSPLandroid/os/IServiceManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/IServiceManager$Stub$Proxy;->checkService(Ljava/lang/String;)Landroid/os/IBinder;
-HSPLandroid/os/IServiceManager$Stub$Proxy;->isDeclared(Ljava/lang/String;)Z
-HSPLandroid/os/ISystemConfig$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/ISystemConfig;
-HSPLandroid/os/IThermalEventListener$Stub;-><init>()V
-HSPLandroid/os/IThermalEventListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/IThermalService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/IThermalService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/IThermalService$Stub$Proxy;->getCurrentThermalStatus()I
-HSPLandroid/os/IThermalService$Stub$Proxy;->registerThermalStatusListener(Landroid/os/IThermalStatusListener;)Z
-HSPLandroid/os/IThermalService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IThermalService;
-HSPLandroid/os/IThermalStatusListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/IThermalStatusListener$Stub;->getMaxTransactionId()I
-HSPLandroid/os/IThermalStatusListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/os/IUserManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/IUserManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/IUserManager$Stub$Proxy;->getApplicationRestrictions(Ljava/lang/String;)Landroid/os/Bundle;
-HSPLandroid/os/IUserManager$Stub$Proxy;->getApplicationRestrictionsForUser(Ljava/lang/String;I)Landroid/os/Bundle;
-HSPLandroid/os/IUserManager$Stub$Proxy;->getProfileIds(IZ)[I
-HSPLandroid/os/IUserManager$Stub$Proxy;->getProfileParent(I)Landroid/content/pm/UserInfo;
-HSPLandroid/os/IUserManager$Stub$Proxy;->getProfileType(I)Ljava/lang/String;
-HSPLandroid/os/IUserManager$Stub$Proxy;->getProfiles(IZ)Ljava/util/List;
-HSPLandroid/os/IUserManager$Stub$Proxy;->getUserBadgeColorResId(I)I
-HSPLandroid/os/IUserManager$Stub$Proxy;->getUserHandle(I)I
-HSPLandroid/os/IUserManager$Stub$Proxy;->getUserInfo(I)Landroid/content/pm/UserInfo;
-HSPLandroid/os/IUserManager$Stub$Proxy;->getUserRestrictionSources(Ljava/lang/String;I)Ljava/util/List;
-HSPLandroid/os/IUserManager$Stub$Proxy;->getUserRestrictions(I)Landroid/os/Bundle;
-HSPLandroid/os/IUserManager$Stub$Proxy;->getUserSerialNumber(I)I
-HSPLandroid/os/IUserManager$Stub$Proxy;->getUsers(ZZZ)Ljava/util/List;
-HSPLandroid/os/IUserManager$Stub$Proxy;->hasBadge(I)Z
-HSPLandroid/os/IUserManager$Stub$Proxy;->hasBaseUserRestriction(Ljava/lang/String;I)Z
-HSPLandroid/os/IUserManager$Stub$Proxy;->hasUserRestriction(Ljava/lang/String;I)Z
-HSPLandroid/os/IUserManager$Stub$Proxy;->isDemoUser(I)Z
-HSPLandroid/os/IUserManager$Stub$Proxy;->isQuietModeEnabled(I)Z
-HSPLandroid/os/IUserManager$Stub$Proxy;->isUserRunning(I)Z
-HSPLandroid/os/IUserManager$Stub$Proxy;->isUserUnlocked(I)Z
-HSPLandroid/os/IUserManager$Stub$Proxy;->isUserUnlockingOrUnlocked(I)Z
-HSPLandroid/os/IUserManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IUserManager;
-HSPLandroid/os/IVibratorManagerService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/IVibratorManagerService$Stub$Proxy;->getVibratorIds()[I
-HSPLandroid/os/IVibratorManagerService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IVibratorManagerService;
-HSPLandroid/os/IpcDataCache$Config;-><init>(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/os/IpcDataCache$Config;-><init>(Landroid/os/IpcDataCache$Config;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/os/IpcDataCache$Config;->api()Ljava/lang/String;
-HSPLandroid/os/IpcDataCache$Config;->child(Ljava/lang/String;)Landroid/os/IpcDataCache$Config;
-HSPLandroid/os/IpcDataCache$Config;->maxEntries()I
-HSPLandroid/os/IpcDataCache$Config;->module()Ljava/lang/String;
-HSPLandroid/os/IpcDataCache$Config;->name()Ljava/lang/String;
-HSPLandroid/os/IpcDataCache$Config;->registerChild(Ljava/lang/String;)V
-HSPLandroid/os/IpcDataCache$QueryHandler;-><init>()V
-HSPLandroid/os/IpcDataCache$QueryHandler;->shouldBypassCache(Ljava/lang/Object;)Z
-HSPLandroid/os/IpcDataCache$SystemServerCallHandler;-><init>(Landroid/os/IpcDataCache$RemoteCall;)V
-HSPLandroid/os/IpcDataCache$SystemServerCallHandler;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/os/IpcDataCache;-><init>(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/IpcDataCache$QueryHandler;)V
-HSPLandroid/os/IpcDataCache;-><init>(Landroid/os/IpcDataCache$Config;Landroid/os/IpcDataCache$QueryHandler;)V
-HSPLandroid/os/IpcDataCache;-><init>(Landroid/os/IpcDataCache$Config;Landroid/os/IpcDataCache$RemoteCall;)V
-HSPLandroid/os/IpcDataCache;->query(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/os/LocaleList$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/LocaleList;
-HSPLandroid/os/LocaleList$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/LocaleList;-><init>([Ljava/util/Locale;)V
-HSPLandroid/os/LocaleList;->computeFirstMatch(Ljava/util/Collection;Z)Ljava/util/Locale;
-HSPLandroid/os/LocaleList;->computeFirstMatchIndex(Ljava/util/Collection;Z)I
-HSPLandroid/os/LocaleList;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Ljava/util/Locale;
-HSPLandroid/os/LocaleList;->findFirstMatchIndex(Ljava/util/Locale;)I
-HSPLandroid/os/LocaleList;->forLanguageTags(Ljava/lang/String;)Landroid/os/LocaleList;
-HSPLandroid/os/LocaleList;->get(I)Ljava/util/Locale;
-HSPLandroid/os/LocaleList;->getAdjustedDefault()Landroid/os/LocaleList;
-HSPLandroid/os/LocaleList;->getDefault()Landroid/os/LocaleList;+]Ljava/lang/Object;Ljava/util/Locale;
-HSPLandroid/os/LocaleList;->getEmptyLocaleList()Landroid/os/LocaleList;
-HSPLandroid/os/LocaleList;->getFirstMatchWithEnglishSupported([Ljava/lang/String;)Ljava/util/Locale;
-HSPLandroid/os/LocaleList;->getLikelyScript(Ljava/util/Locale;)Ljava/lang/String;
-HSPLandroid/os/LocaleList;->hashCode()I
-HSPLandroid/os/LocaleList;->isEmpty()Z
-HSPLandroid/os/LocaleList;->isPseudoLocale(Ljava/util/Locale;)Z
-HSPLandroid/os/LocaleList;->isPseudoLocalesOnly([Ljava/lang/String;)Z
-HSPLandroid/os/LocaleList;->matchesLanguageAndScript(Ljava/util/Locale;Ljava/util/Locale;)Z
-HSPLandroid/os/LocaleList;->setDefault(Landroid/os/LocaleList;)V
-HSPLandroid/os/LocaleList;->setDefault(Landroid/os/LocaleList;I)V
-HSPLandroid/os/LocaleList;->size()I
-HSPLandroid/os/LocaleList;->toLanguageTags()Ljava/lang/String;
-HSPLandroid/os/LocaleList;->toString()Ljava/lang/String;
-HSPLandroid/os/LocaleList;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/Looper;-><init>(Z)V
-HSPLandroid/os/Looper;->getMainLooper()Landroid/os/Looper;
-HSPLandroid/os/Looper;->getQueue()Landroid/os/MessageQueue;
-HSPLandroid/os/Looper;->getThread()Ljava/lang/Thread;
-HSPLandroid/os/Looper;->getThresholdOverride()I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Thread;missing_types
-HSPLandroid/os/Looper;->isCurrentThread()Z
-HSPLandroid/os/Looper;->loop()V
-HSPLandroid/os/Looper;->loopOnce(Landroid/os/Looper;JI)Z+]Landroid/os/Handler;megamorphic_types]Landroid/os/Message;Landroid/os/Message;]Landroid/os/MessageQueue;Landroid/os/MessageQueue;
-HSPLandroid/os/Looper;->myLooper()Landroid/os/Looper;+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal;
-HSPLandroid/os/Looper;->myQueue()Landroid/os/MessageQueue;
-HSPLandroid/os/Looper;->prepare()V
-HSPLandroid/os/Looper;->prepare(Z)V
-HSPLandroid/os/Looper;->prepareMainLooper()V
-HSPLandroid/os/Looper;->quit()V
-HSPLandroid/os/Looper;->quitSafely()V
-HSPLandroid/os/Looper;->setSlowLogThresholdMs(JJ)V
-HSPLandroid/os/Looper;->setTraceTag(J)V
-HSPLandroid/os/Looper;->showSlowLog(JJJLjava/lang/String;Landroid/os/Message;)Z
-HSPLandroid/os/Looper;->toString()Ljava/lang/String;
-HSPLandroid/os/Message$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/Message;
-HSPLandroid/os/Message$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/Message;-><init>()V
-HSPLandroid/os/Message;->copyFrom(Landroid/os/Message;)V
-HSPLandroid/os/Message;->getCallback()Ljava/lang/Runnable;
-HSPLandroid/os/Message;->getData()Landroid/os/Bundle;
-HSPLandroid/os/Message;->getTarget()Landroid/os/Handler;
-HSPLandroid/os/Message;->getWhen()J
-HSPLandroid/os/Message;->isInUse()Z
-HSPLandroid/os/Message;->markInUse()V
-HSPLandroid/os/Message;->obtain()Landroid/os/Message;
-HSPLandroid/os/Message;->obtain(Landroid/os/Handler;)Landroid/os/Message;
-HSPLandroid/os/Message;->obtain(Landroid/os/Handler;I)Landroid/os/Message;
-HSPLandroid/os/Message;->obtain(Landroid/os/Handler;III)Landroid/os/Message;
-HSPLandroid/os/Message;->obtain(Landroid/os/Handler;IIILjava/lang/Object;)Landroid/os/Message;
-HSPLandroid/os/Message;->obtain(Landroid/os/Handler;ILjava/lang/Object;)Landroid/os/Message;
-HSPLandroid/os/Message;->obtain(Landroid/os/Handler;Ljava/lang/Runnable;)Landroid/os/Message;
-HSPLandroid/os/Message;->obtain(Landroid/os/Message;)Landroid/os/Message;
-HSPLandroid/os/Message;->peekData()Landroid/os/Bundle;
-HSPLandroid/os/Message;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/os/Message;->recycle()V
-HSPLandroid/os/Message;->recycleUnchecked()V
-HSPLandroid/os/Message;->sendToTarget()V+]Landroid/os/Handler;megamorphic_types
-HSPLandroid/os/Message;->setAsynchronous(Z)V
-HSPLandroid/os/Message;->setCallback(Ljava/lang/Runnable;)Landroid/os/Message;
-HSPLandroid/os/Message;->setData(Landroid/os/Bundle;)V
-HSPLandroid/os/Message;->setTarget(Landroid/os/Handler;)V
-HSPLandroid/os/Message;->setWhat(I)Landroid/os/Message;
-HSPLandroid/os/Message;->toString()Ljava/lang/String;
-HSPLandroid/os/Message;->toString(J)Ljava/lang/String;
-HSPLandroid/os/Message;->updateCheckRecycle(I)V
-HSPLandroid/os/Message;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/MessageQueue;-><init>(Z)V
-HSPLandroid/os/MessageQueue;->addIdleHandler(Landroid/os/MessageQueue$IdleHandler;)V
-HSPLandroid/os/MessageQueue;->addOnFileDescriptorEventListener(Ljava/io/FileDescriptor;ILandroid/os/MessageQueue$OnFileDescriptorEventListener;)V
-HSPLandroid/os/MessageQueue;->dispatchEvents(II)I
-HSPLandroid/os/MessageQueue;->dispose()V
-HSPLandroid/os/MessageQueue;->enqueueMessage(Landroid/os/Message;J)Z+]Landroid/os/Message;Landroid/os/Message;
-HSPLandroid/os/MessageQueue;->finalize()V
-HSPLandroid/os/MessageQueue;->hasMessages(Landroid/os/Handler;ILjava/lang/Object;)Z
-HSPLandroid/os/MessageQueue;->hasMessages(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;)Z
-HSPLandroid/os/MessageQueue;->next()Landroid/os/Message;+]Landroid/os/MessageQueue$IdleHandler;missing_types]Landroid/os/Message;Landroid/os/Message;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/os/MessageQueue;->postSyncBarrier()I
-HSPLandroid/os/MessageQueue;->postSyncBarrier(J)I+]Landroid/os/Message;Landroid/os/Message;
-HSPLandroid/os/MessageQueue;->quit(Z)V
-HSPLandroid/os/MessageQueue;->removeAllFutureMessagesLocked()V
-HSPLandroid/os/MessageQueue;->removeAllMessagesLocked()V
-HSPLandroid/os/MessageQueue;->removeCallbacksAndMessages(Landroid/os/Handler;Ljava/lang/Object;)V
-HSPLandroid/os/MessageQueue;->removeIdleHandler(Landroid/os/MessageQueue$IdleHandler;)V
-HSPLandroid/os/MessageQueue;->removeMessages(Landroid/os/Handler;ILjava/lang/Object;)V+]Landroid/os/Message;Landroid/os/Message;
-HSPLandroid/os/MessageQueue;->removeMessages(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;)V+]Landroid/os/Message;Landroid/os/Message;
-HSPLandroid/os/MessageQueue;->removeOnFileDescriptorEventListener(Ljava/io/FileDescriptor;)V
-HSPLandroid/os/MessageQueue;->removeSyncBarrier(I)V+]Landroid/os/Message;Landroid/os/Message;
-HSPLandroid/os/MessageQueue;->updateOnFileDescriptorEventListenerLocked(Ljava/io/FileDescriptor;ILandroid/os/MessageQueue$OnFileDescriptorEventListener;)V
-HSPLandroid/os/Messenger$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/Messenger;
-HSPLandroid/os/Messenger$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/Messenger;-><init>(Landroid/os/Handler;)V
-HSPLandroid/os/Messenger;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/Messenger;->getBinder()Landroid/os/IBinder;
-HSPLandroid/os/Messenger;->hashCode()I
-HSPLandroid/os/Messenger;->readMessengerOrNullFromParcel(Landroid/os/Parcel;)Landroid/os/Messenger;
-HSPLandroid/os/Messenger;->send(Landroid/os/Message;)V
-HSPLandroid/os/Messenger;->writeMessengerOrNullToParcel(Landroid/os/Messenger;Landroid/os/Parcel;)V
-HSPLandroid/os/Messenger;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/Parcel$2;-><init>(Landroid/os/Parcel;Ljava/io/InputStream;Ljava/lang/ClassLoader;)V
-HSPLandroid/os/Parcel$2;->resolveClass(Ljava/io/ObjectStreamClass;)Ljava/lang/Class;+]Ljava/io/ObjectStreamClass;Ljava/io/ObjectStreamClass;
-HSPLandroid/os/Parcel$LazyValue;-><init>(Landroid/os/Parcel;IIILjava/lang/ClassLoader;)V
-HSPLandroid/os/Parcel$LazyValue;->apply(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel$LazyValue;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+]Landroid/os/Parcel$LazyValue;Landroid/os/Parcel$LazyValue;
-HSPLandroid/os/Parcel$LazyValue;->writeToParcel(Landroid/os/Parcel;)V
-HSPLandroid/os/Parcel$ReadWriteHelper;->readString16(Landroid/os/Parcel;)Ljava/lang/String;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel$ReadWriteHelper;->readString8(Landroid/os/Parcel;)Ljava/lang/String;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel$ReadWriteHelper;->writeString16(Landroid/os/Parcel;Ljava/lang/String;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel$ReadWriteHelper;->writeString8(Landroid/os/Parcel;Ljava/lang/String;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->-$$Nest$mreadValue(Landroid/os/Parcel;Ljava/lang/ClassLoader;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object;
-HSPLandroid/os/Parcel;-><init>(J)V
-HSPLandroid/os/Parcel;->adoptClassCookies(Landroid/os/Parcel;)V
-HSPLandroid/os/Parcel;->appendFrom(Landroid/os/Parcel;II)V
-HSPLandroid/os/Parcel;->checkArrayTypeToUnparcel(Ljava/lang/Class;Ljava/lang/Class;)V
-HSPLandroid/os/Parcel;->checkTypeToUnparcel(Ljava/lang/Class;Ljava/lang/Class;)V
-HSPLandroid/os/Parcel;->copyClassCookies()Ljava/util/Map;
-HSPLandroid/os/Parcel;->createBinderArrayList()Ljava/util/ArrayList;
-HSPLandroid/os/Parcel;->createBooleanArray()[Z
-HSPLandroid/os/Parcel;->createByteArray()[B
-HSPLandroid/os/Parcel;->createException(ILjava/lang/String;)Ljava/lang/Exception;
-HSPLandroid/os/Parcel;->createExceptionOrNull(ILjava/lang/String;)Ljava/lang/Exception;
-HSPLandroid/os/Parcel;->createFloatArray()[F
-HSPLandroid/os/Parcel;->createIntArray()[I+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->createLongArray()[J+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->createString16Array()[Ljava/lang/String;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->createString8Array()[Ljava/lang/String;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->createStringArray()[Ljava/lang/String;
-HSPLandroid/os/Parcel;->createStringArrayList()Ljava/util/ArrayList;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->createTypedArray(Landroid/os/Parcelable$Creator;)[Ljava/lang/Object;+]Landroid/os/Parcelable$Creator;missing_types]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->createTypedArrayList(Landroid/os/Parcelable$Creator;)Ljava/util/ArrayList;+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->dataAvail()I
-HSPLandroid/os/Parcel;->dataPosition()I
-HSPLandroid/os/Parcel;->dataSize()I
-HSPLandroid/os/Parcel;->destroy()V
-HSPLandroid/os/Parcel;->enforceInterface(Ljava/lang/String;)V
-HSPLandroid/os/Parcel;->enforceNoDataAvail()V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->ensureReadSquashableParcelables()V
-HSPLandroid/os/Parcel;->ensureWithinMemoryLimit(II)V
-HSPLandroid/os/Parcel;->finalize()V
-HSPLandroid/os/Parcel;->freeBuffer()V
-HSPLandroid/os/Parcel;->getClassCookie(Ljava/lang/Class;)Ljava/lang/Object;
-HSPLandroid/os/Parcel;->getExceptionCode(Ljava/lang/Throwable;)I
-HSPLandroid/os/Parcel;->getValueType(Ljava/lang/Object;)I
-HSPLandroid/os/Parcel;->hasFileDescriptors()Z
-HSPLandroid/os/Parcel;->hasReadWriteHelper()Z
-HSPLandroid/os/Parcel;->init(J)V
-HSPLandroid/os/Parcel;->isLengthPrefixed(I)Z
-HSPLandroid/os/Parcel;->markForBinder(Landroid/os/IBinder;)V
-HSPLandroid/os/Parcel;->markSensitive()V
-HSPLandroid/os/Parcel;->marshall()[B
-HSPLandroid/os/Parcel;->maybeWriteSquashed(Landroid/os/Parcelable;)Z
-HSPLandroid/os/Parcel;->obtain()Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->obtain(J)Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->obtain(Landroid/os/IBinder;)Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->pushAllowFds(Z)Z
-HSPLandroid/os/Parcel;->readArrayList(Ljava/lang/ClassLoader;)Ljava/util/ArrayList;
-HSPLandroid/os/Parcel;->readArrayList(Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/util/ArrayList;
-HSPLandroid/os/Parcel;->readArrayListInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/util/ArrayList;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readArrayMap(Landroid/util/ArrayMap;IZZLjava/lang/ClassLoader;)I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readArrayMap(Landroid/util/ArrayMap;Ljava/lang/ClassLoader;)V
-HSPLandroid/os/Parcel;->readArrayMapInternal(Landroid/util/ArrayMap;ILjava/lang/ClassLoader;)V
-HSPLandroid/os/Parcel;->readArraySet(Ljava/lang/ClassLoader;)Landroid/util/ArraySet;
-HSPLandroid/os/Parcel;->readBinderList(Ljava/util/List;)V
-HSPLandroid/os/Parcel;->readBlob()[B
-HSPLandroid/os/Parcel;->readBoolean()Z+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readBooleanArray([Z)V
-HSPLandroid/os/Parcel;->readBundle()Landroid/os/Bundle;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readBundle(Ljava/lang/ClassLoader;)Landroid/os/Bundle;+]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readByte()B+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readByteArray([B)V
-HSPLandroid/os/Parcel;->readCallingWorkSourceUid()I
-HSPLandroid/os/Parcel;->readCharSequence()Ljava/lang/CharSequence;+]Landroid/os/Parcelable$Creator;Landroid/text/TextUtils$1;
-HSPLandroid/os/Parcel;->readCharSequenceArray()[Ljava/lang/CharSequence;
-HSPLandroid/os/Parcel;->readDouble()D
-HSPLandroid/os/Parcel;->readException()V
-HSPLandroid/os/Parcel;->readException(ILjava/lang/String;)V
-HSPLandroid/os/Parcel;->readExceptionCode()I
-HSPLandroid/os/Parcel;->readFloat()F
-HSPLandroid/os/Parcel;->readFloatArray([F)V
-HSPLandroid/os/Parcel;->readHashMap(Ljava/lang/ClassLoader;)Ljava/util/HashMap;
-HSPLandroid/os/Parcel;->readHashMapInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/HashMap;
-HSPLandroid/os/Parcel;->readInt()I
-HSPLandroid/os/Parcel;->readIntArray([I)V
-HSPLandroid/os/Parcel;->readLazyValue(Ljava/lang/ClassLoader;)Ljava/lang/Object;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readList(Ljava/util/List;Ljava/lang/ClassLoader;)V
-HSPLandroid/os/Parcel;->readList(Ljava/util/List;Ljava/lang/ClassLoader;Ljava/lang/Class;)V
-HSPLandroid/os/Parcel;->readListInternal(Ljava/util/List;ILjava/lang/ClassLoader;)V
-HSPLandroid/os/Parcel;->readListInternal(Ljava/util/List;ILjava/lang/ClassLoader;Ljava/lang/Class;)V
-HSPLandroid/os/Parcel;->readLong()J
-HSPLandroid/os/Parcel;->readLongArray([J)V
-HSPLandroid/os/Parcel;->readMap(Ljava/util/Map;Ljava/lang/ClassLoader;)V
-HSPLandroid/os/Parcel;->readMapInternal(Ljava/util/Map;ILjava/lang/ClassLoader;)V
-HSPLandroid/os/Parcel;->readMapInternal(Ljava/util/Map;ILjava/lang/ClassLoader;Ljava/lang/Class;Ljava/lang/Class;)V
-HSPLandroid/os/Parcel;->readParcelable(Ljava/lang/ClassLoader;)Landroid/os/Parcelable;
-HSPLandroid/os/Parcel;->readParcelable(Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Object;
-HSPLandroid/os/Parcel;->readParcelableArray(Ljava/lang/ClassLoader;)[Landroid/os/Parcelable;
-HSPLandroid/os/Parcel;->readParcelableArray(Ljava/lang/ClassLoader;Ljava/lang/Class;)[Ljava/lang/Object;
-HSPLandroid/os/Parcel;->readParcelableArrayInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)[Ljava/lang/Object;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readParcelableCreator(Ljava/lang/ClassLoader;)Landroid/os/Parcelable$Creator;
-HSPLandroid/os/Parcel;->readParcelableCreatorInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Landroid/os/Parcelable$Creator;+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/Object;Landroid/os/Parcel;]Ljava/lang/reflect/Field;Ljava/lang/reflect/Field;]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readParcelableInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/os/Parcelable$Creator;megamorphic_types]Landroid/os/Parcelable$ClassLoaderCreator;Landroid/content/pm/ParceledListSlice$1;
-HSPLandroid/os/Parcel;->readParcelableList(Ljava/util/List;Ljava/lang/ClassLoader;)Ljava/util/List;
-HSPLandroid/os/Parcel;->readParcelableList(Ljava/util/List;Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/util/List;
-HSPLandroid/os/Parcel;->readParcelableListInternal(Ljava/util/List;Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readPersistableBundle()Landroid/os/PersistableBundle;
-HSPLandroid/os/Parcel;->readPersistableBundle(Ljava/lang/ClassLoader;)Landroid/os/PersistableBundle;
-HSPLandroid/os/Parcel;->readRawFileDescriptor()Ljava/io/FileDescriptor;
-HSPLandroid/os/Parcel;->readSerializable()Ljava/io/Serializable;
-HSPLandroid/os/Parcel;->readSerializableInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Object;+]Ljava/io/ObjectInputStream;Landroid/os/Parcel$2;]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readSize()Landroid/util/Size;
-HSPLandroid/os/Parcel;->readSparseArray(Ljava/lang/ClassLoader;)Landroid/util/SparseArray;
-HSPLandroid/os/Parcel;->readSparseArray(Ljava/lang/ClassLoader;Ljava/lang/Class;)Landroid/util/SparseArray;
-HSPLandroid/os/Parcel;->readSparseArrayInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Landroid/util/SparseArray;
-HSPLandroid/os/Parcel;->readSparseIntArray()Landroid/util/SparseIntArray;
-HSPLandroid/os/Parcel;->readSparseIntArrayInternal(Landroid/util/SparseIntArray;I)V
-HSPLandroid/os/Parcel;->readSquashed(Landroid/os/Parcel$SquashReadHelper;)Landroid/os/Parcelable;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/Parcel$SquashReadHelper;Landroid/content/pm/ApplicationInfo$1$$ExternalSyntheticLambda0;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readString()Ljava/lang/String;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readString16()Ljava/lang/String;+]Landroid/os/Parcel$ReadWriteHelper;Landroid/os/Parcel$ReadWriteHelper;
-HSPLandroid/os/Parcel;->readString16Array([Ljava/lang/String;)V
-HSPLandroid/os/Parcel;->readString16NoHelper()Ljava/lang/String;
-HSPLandroid/os/Parcel;->readString8()Ljava/lang/String;+]Landroid/os/Parcel$ReadWriteHelper;Landroid/os/Parcel$ReadWriteHelper;
-HSPLandroid/os/Parcel;->readString8NoHelper()Ljava/lang/String;
-HSPLandroid/os/Parcel;->readStringArray()[Ljava/lang/String;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readStringArray([Ljava/lang/String;)V
-HSPLandroid/os/Parcel;->readStringList(Ljava/util/List;)V
-HSPLandroid/os/Parcel;->readStrongBinder()Landroid/os/IBinder;
-HSPLandroid/os/Parcel;->readTypedArray([Ljava/lang/Object;Landroid/os/Parcelable$Creator;)V
-HSPLandroid/os/Parcel;->readTypedList(Ljava/util/List;Landroid/os/Parcelable$Creator;)V
-HSPLandroid/os/Parcel;->readTypedObject(Landroid/os/Parcelable$Creator;)Ljava/lang/Object;+]Landroid/os/Parcelable$Creator;megamorphic_types]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readValue(ILjava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Object;
-HSPLandroid/os/Parcel;->readValue(ILjava/lang/ClassLoader;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object;+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->readValue(Ljava/lang/ClassLoader;)Ljava/lang/Object;
-HSPLandroid/os/Parcel;->readValue(Ljava/lang/ClassLoader;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->recycle()V
-HSPLandroid/os/Parcel;->resetSqaushingState()V
-HSPLandroid/os/Parcel;->restoreAllowFds(Z)V
-HSPLandroid/os/Parcel;->setClassCookie(Ljava/lang/Class;Ljava/lang/Object;)V
-HSPLandroid/os/Parcel;->setDataPosition(I)V
-HSPLandroid/os/Parcel;->setDataSize(I)V
-HSPLandroid/os/Parcel;->setReadWriteHelper(Landroid/os/Parcel$ReadWriteHelper;)V
-HSPLandroid/os/Parcel;->unmarshall([BII)V
-HSPLandroid/os/Parcel;->writeArrayMap(Landroid/util/ArrayMap;)V
-HSPLandroid/os/Parcel;->writeArrayMapInternal(Landroid/util/ArrayMap;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->writeArraySet(Landroid/util/ArraySet;)V
-HSPLandroid/os/Parcel;->writeBinderList(Ljava/util/List;)V
-HSPLandroid/os/Parcel;->writeBlob([B)V
-HSPLandroid/os/Parcel;->writeBoolean(Z)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->writeBooleanArray([Z)V
-HSPLandroid/os/Parcel;->writeBundle(Landroid/os/Bundle;)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->writeByte(B)V
-HSPLandroid/os/Parcel;->writeByteArray([B)V
-HSPLandroid/os/Parcel;->writeByteArray([BII)V
-HSPLandroid/os/Parcel;->writeCharSequence(Ljava/lang/CharSequence;)V
-HSPLandroid/os/Parcel;->writeDouble(D)V
-HSPLandroid/os/Parcel;->writeException(Ljava/lang/Exception;)V
-HSPLandroid/os/Parcel;->writeFileDescriptor(Ljava/io/FileDescriptor;)V
-HSPLandroid/os/Parcel;->writeFloat(F)V
-HSPLandroid/os/Parcel;->writeFloatArray([F)V
-HSPLandroid/os/Parcel;->writeInt(I)V
-HSPLandroid/os/Parcel;->writeIntArray([I)V
-HSPLandroid/os/Parcel;->writeInterfaceToken(Ljava/lang/String;)V
-HSPLandroid/os/Parcel;->writeList(Ljava/util/List;)V
-HSPLandroid/os/Parcel;->writeLong(J)V
-HSPLandroid/os/Parcel;->writeLongArray([J)V
-HSPLandroid/os/Parcel;->writeMap(Ljava/util/Map;)V
-HSPLandroid/os/Parcel;->writeMapInternal(Ljava/util/Map;)V
-HSPLandroid/os/Parcel;->writeNoException()V
-HSPLandroid/os/Parcel;->writeParcelable(Landroid/os/Parcelable;I)V+]Landroid/os/Parcelable;missing_types]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->writeParcelableArray([Landroid/os/Parcelable;I)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->writeParcelableCreator(Landroid/os/Parcelable;)V+]Ljava/lang/Object;missing_types]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->writeParcelableList(Ljava/util/List;I)V
-HSPLandroid/os/Parcel;->writePersistableBundle(Landroid/os/PersistableBundle;)V
-HSPLandroid/os/Parcel;->writeSerializable(Ljava/io/Serializable;)V
-HSPLandroid/os/Parcel;->writeSparseArray(Landroid/util/SparseArray;)V
-HSPLandroid/os/Parcel;->writeSparseBooleanArray(Landroid/util/SparseBooleanArray;)V
-HSPLandroid/os/Parcel;->writeSparseIntArray(Landroid/util/SparseIntArray;)V
-HSPLandroid/os/Parcel;->writeString(Ljava/lang/String;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->writeString16(Ljava/lang/String;)V+]Landroid/os/Parcel$ReadWriteHelper;Landroid/os/Parcel$ReadWriteHelper;
-HSPLandroid/os/Parcel;->writeString16Array([Ljava/lang/String;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->writeString16NoHelper(Ljava/lang/String;)V
-HSPLandroid/os/Parcel;->writeString8(Ljava/lang/String;)V+]Landroid/os/Parcel$ReadWriteHelper;Landroid/os/Parcel$ReadWriteHelper;
-HSPLandroid/os/Parcel;->writeString8Array([Ljava/lang/String;)V
-HSPLandroid/os/Parcel;->writeString8NoHelper(Ljava/lang/String;)V
-HSPLandroid/os/Parcel;->writeStringArray([Ljava/lang/String;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->writeStringList(Ljava/util/List;)V
-HSPLandroid/os/Parcel;->writeStrongBinder(Landroid/os/IBinder;)V
-HSPLandroid/os/Parcel;->writeStrongInterface(Landroid/os/IInterface;)V+]Landroid/os/IInterface;Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;,Landroid/app/ActivityThread$ApplicationThread;,Landroid/view/ViewRootImpl$W;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->writeTypedArray([Landroid/os/Parcelable;I)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->writeTypedArrayMap(Landroid/util/ArrayMap;I)V
-HSPLandroid/os/Parcel;->writeTypedList(Ljava/util/List;)V
-HSPLandroid/os/Parcel;->writeTypedList(Ljava/util/List;I)V
-HSPLandroid/os/Parcel;->writeTypedObject(Landroid/os/Parcelable;I)V+]Landroid/os/Parcelable;Landroid/view/WindowManager$LayoutParams;,Landroid/content/Intent;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->writeValue(ILjava/lang/Object;)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/lang/Long;Ljava/lang/Long;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/Parcel;->writeValue(Ljava/lang/Object;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/ParcelFileDescriptor$2;->createFromParcel(Landroid/os/Parcel;)Landroid/os/ParcelFileDescriptor;
-HSPLandroid/os/ParcelFileDescriptor$2;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/ParcelFileDescriptor$AutoCloseInputStream;-><init>(Landroid/os/ParcelFileDescriptor;)V
-HSPLandroid/os/ParcelFileDescriptor$AutoCloseInputStream;->close()V
-HSPLandroid/os/ParcelFileDescriptor$AutoCloseInputStream;->read([B)I
-HSPLandroid/os/ParcelFileDescriptor$AutoCloseInputStream;->read([BII)I
-HSPLandroid/os/ParcelFileDescriptor$AutoCloseOutputStream;-><init>(Landroid/os/ParcelFileDescriptor;)V
-HSPLandroid/os/ParcelFileDescriptor$AutoCloseOutputStream;->close()V
-HSPLandroid/os/ParcelFileDescriptor;-><init>(Landroid/os/ParcelFileDescriptor;)V
-HSPLandroid/os/ParcelFileDescriptor;-><init>(Ljava/io/FileDescriptor;)V
-HSPLandroid/os/ParcelFileDescriptor;-><init>(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;)V
-HSPLandroid/os/ParcelFileDescriptor;->adoptFd(I)Landroid/os/ParcelFileDescriptor;
-HSPLandroid/os/ParcelFileDescriptor;->canDetectErrors()Z
-HSPLandroid/os/ParcelFileDescriptor;->close()V
-HSPLandroid/os/ParcelFileDescriptor;->closeWithStatus(ILjava/lang/String;)V
-HSPLandroid/os/ParcelFileDescriptor;->createPipe()[Landroid/os/ParcelFileDescriptor;
-HSPLandroid/os/ParcelFileDescriptor;->detachFd()I
-HSPLandroid/os/ParcelFileDescriptor;->dup()Landroid/os/ParcelFileDescriptor;
-HSPLandroid/os/ParcelFileDescriptor;->dup(Ljava/io/FileDescriptor;)Landroid/os/ParcelFileDescriptor;
-HSPLandroid/os/ParcelFileDescriptor;->finalize()V
-HSPLandroid/os/ParcelFileDescriptor;->fromFd(I)Landroid/os/ParcelFileDescriptor;
-HSPLandroid/os/ParcelFileDescriptor;->fromSocket(Ljava/net/Socket;)Landroid/os/ParcelFileDescriptor;
-HSPLandroid/os/ParcelFileDescriptor;->getFd()I
-HSPLandroid/os/ParcelFileDescriptor;->getFile(Ljava/io/FileDescriptor;)Ljava/io/File;
-HSPLandroid/os/ParcelFileDescriptor;->getFileDescriptor()Ljava/io/FileDescriptor;
-HSPLandroid/os/ParcelFileDescriptor;->getStatSize()J
-HSPLandroid/os/ParcelFileDescriptor;->ifAtLeastQ(I)I
-HSPLandroid/os/ParcelFileDescriptor;->isAtLeastQ()Z
-HSPLandroid/os/ParcelFileDescriptor;->open(Ljava/io/File;I)Landroid/os/ParcelFileDescriptor;
-HSPLandroid/os/ParcelFileDescriptor;->openInternal(Ljava/io/File;I)Ljava/io/FileDescriptor;
-HSPLandroid/os/ParcelFileDescriptor;->parseMode(Ljava/lang/String;)I
-HSPLandroid/os/ParcelFileDescriptor;->releaseResources()V
-HSPLandroid/os/ParcelFileDescriptor;->writeCommStatusAndClose(ILjava/lang/String;)V
-HSPLandroid/os/ParcelFileDescriptor;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/ParcelUuid$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/ParcelUuid;
-HSPLandroid/os/ParcelUuid$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/ParcelUuid$1;->newArray(I)[Landroid/os/ParcelUuid;
-HSPLandroid/os/ParcelUuid$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/os/ParcelUuid;-><init>(Ljava/util/UUID;)V
-HSPLandroid/os/ParcelUuid;->equals(Ljava/lang/Object;)Z
-HSPLandroid/os/ParcelUuid;->fromString(Ljava/lang/String;)Landroid/os/ParcelUuid;
-HSPLandroid/os/ParcelUuid;->getUuid()Ljava/util/UUID;
-HSPLandroid/os/ParcelUuid;->hashCode()I
-HSPLandroid/os/ParcelUuid;->toString()Ljava/lang/String;
-HSPLandroid/os/ParcelUuid;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/ParcelableException;-><init>(Ljava/lang/Throwable;)V
-HSPLandroid/os/ParcelableParcel$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/ParcelableParcel;
-HSPLandroid/os/ParcelableParcel$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/ParcelableParcel;-><init>(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V
-HSPLandroid/os/ParcelableParcel;->getClassLoader()Ljava/lang/ClassLoader;
-HSPLandroid/os/ParcelableParcel;->getParcel()Landroid/os/Parcel;
-HSPLandroid/os/ParcelableParcel;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/PatternMatcher$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/PatternMatcher;
-HSPLandroid/os/PatternMatcher$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/PatternMatcher$1;->newArray(I)[Landroid/os/PatternMatcher;
-HSPLandroid/os/PatternMatcher$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/os/PatternMatcher;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/os/PatternMatcher;-><init>(Ljava/lang/String;I)V
-HSPLandroid/os/PatternMatcher;->match(Ljava/lang/String;)Z
-HSPLandroid/os/PatternMatcher;->matchPattern(Ljava/lang/String;Ljava/lang/String;[II)Z
-HSPLandroid/os/PatternMatcher;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/PerformanceHintManager;->createHintSession([IJ)Landroid/os/PerformanceHintManager$Session;
-HSPLandroid/os/PersistableBundle$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/PersistableBundle;
-HSPLandroid/os/PersistableBundle$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/PersistableBundle$MyReadMapCallback;-><init>()V
-HSPLandroid/os/PersistableBundle;-><init>()V
-HSPLandroid/os/PersistableBundle;-><init>(I)V
-HSPLandroid/os/PersistableBundle;-><init>(Landroid/os/Parcel;I)V
-HSPLandroid/os/PersistableBundle;-><init>(Landroid/os/PersistableBundle;)V
-HSPLandroid/os/PersistableBundle;-><init>(Landroid/os/PersistableBundle;Z)V
-HSPLandroid/os/PersistableBundle;-><init>(Landroid/util/ArrayMap;Z)V
-HSPLandroid/os/PersistableBundle;->deepCopy()Landroid/os/PersistableBundle;
-HSPLandroid/os/PersistableBundle;->getPersistableBundle(Ljava/lang/String;)Landroid/os/PersistableBundle;
-HSPLandroid/os/PersistableBundle;->isValidType(Ljava/lang/Object;)Z
-HSPLandroid/os/PersistableBundle;->putPersistableBundle(Ljava/lang/String;Landroid/os/PersistableBundle;)V
-HSPLandroid/os/PersistableBundle;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/PooledStringReader;->readString()Ljava/lang/String;
-HSPLandroid/os/PooledStringWriter;->writeString(Ljava/lang/String;)V
-HSPLandroid/os/PowerExemptionManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/os/PowerManager$1;-><init>(Landroid/os/PowerManager;ILjava/lang/String;)V
-HSPLandroid/os/PowerManager$1;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/os/PowerManager$1;->recompute(Ljava/lang/Void;)Ljava/lang/Boolean;
-HSPLandroid/os/PowerManager$2;-><init>(Landroid/os/PowerManager;ILjava/lang/String;)V
-HSPLandroid/os/PowerManager$2;->recompute(Ljava/lang/Integer;)Ljava/lang/Boolean;
-HSPLandroid/os/PowerManager$2;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/os/PowerManager$3$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/os/PowerManager$3;->lambda$onStatusChange$0(Landroid/os/PowerManager$OnThermalStatusChangedListener;I)V
-HSPLandroid/os/PowerManager$3;->onStatusChange(I)V
-HSPLandroid/os/PowerManager$WakeLock$$ExternalSyntheticLambda0;-><init>(Landroid/os/PowerManager$WakeLock;)V
-HSPLandroid/os/PowerManager$WakeLock$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/os/PowerManager$WakeLock;-><init>(Landroid/os/PowerManager;ILjava/lang/String;Ljava/lang/String;I)V
-HSPLandroid/os/PowerManager$WakeLock;->acquire()V
-HSPLandroid/os/PowerManager$WakeLock;->acquire(J)V
-HSPLandroid/os/PowerManager$WakeLock;->acquireLocked()V
-HSPLandroid/os/PowerManager$WakeLock;->finalize()V
-HSPLandroid/os/PowerManager$WakeLock;->isHeld()Z
-HSPLandroid/os/PowerManager$WakeLock;->release()V
-HSPLandroid/os/PowerManager$WakeLock;->release(I)V
-HSPLandroid/os/PowerManager$WakeLock;->setReferenceCounted(Z)V
-HSPLandroid/os/PowerManager$WakeLock;->setWorkSource(Landroid/os/WorkSource;)V
-HSPLandroid/os/PowerManager;-><init>(Landroid/content/Context;Landroid/os/IPowerManager;Landroid/os/IThermalService;Landroid/os/Handler;)V
-HSPLandroid/os/PowerManager;->addThermalStatusListener(Landroid/os/PowerManager$OnThermalStatusChangedListener;)V
-HSPLandroid/os/PowerManager;->addThermalStatusListener(Ljava/util/concurrent/Executor;Landroid/os/PowerManager$OnThermalStatusChangedListener;)V
-HSPLandroid/os/PowerManager;->getBrightnessConstraint(I)F
-HSPLandroid/os/PowerManager;->getCurrentThermalStatus()I
-HSPLandroid/os/PowerManager;->getPowerSaveState(I)Landroid/os/PowerSaveState;
-HSPLandroid/os/PowerManager;->isDeviceIdleMode()Z
-HSPLandroid/os/PowerManager;->isDeviceLightIdleMode()Z
-HSPLandroid/os/PowerManager;->isIgnoringBatteryOptimizations(Ljava/lang/String;)Z
-HSPLandroid/os/PowerManager;->isInteractive()Z
-HSPLandroid/os/PowerManager;->isLightDeviceIdleMode()Z
-HSPLandroid/os/PowerManager;->isPowerSaveMode()Z
-HSPLandroid/os/PowerManager;->isScreenOn()Z
-HSPLandroid/os/PowerManager;->newWakeLock(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;
-HSPLandroid/os/PowerManager;->userActivity(JII)V
-HSPLandroid/os/PowerManager;->userActivity(JZ)V
-HSPLandroid/os/PowerManager;->validateWakeLockParameters(ILjava/lang/String;)V
-HSPLandroid/os/PowerManager;->wakeUp(JILjava/lang/String;)V
-HSPLandroid/os/PowerSaveState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/PowerSaveState;
-HSPLandroid/os/PowerSaveState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/PowerSaveState$Builder;-><init>()V
-HSPLandroid/os/PowerSaveState$Builder;->build()Landroid/os/PowerSaveState;
-HSPLandroid/os/PowerSaveState$Builder;->setBatterySaverEnabled(Z)Landroid/os/PowerSaveState$Builder;
-HSPLandroid/os/PowerSaveState$Builder;->setBrightnessFactor(F)Landroid/os/PowerSaveState$Builder;
-HSPLandroid/os/PowerSaveState$Builder;->setGlobalBatterySaverEnabled(Z)Landroid/os/PowerSaveState$Builder;
-HSPLandroid/os/PowerSaveState;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/os/PowerSaveState;-><init>(Landroid/os/PowerSaveState$Builder;)V
-HSPLandroid/os/PowerWhitelistManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/os/PowerWhitelistManager;->isWhitelisted(Ljava/lang/String;Z)Z
-HSPLandroid/os/Process;->getStartElapsedRealtime()J
-HSPLandroid/os/Process;->getStartUptimeMillis()J
-HSPLandroid/os/Process;->is64Bit()Z
-HSPLandroid/os/Process;->isApplicationUid(I)Z
-HSPLandroid/os/Process;->isIsolated()Z
-HSPLandroid/os/Process;->isIsolated(I)Z
-HSPLandroid/os/Process;->isSdkSandbox()Z
-HSPLandroid/os/Process;->isSdkSandboxUid(I)Z
-HSPLandroid/os/Process;->myPid()I
-HSPLandroid/os/Process;->myProcessName()Ljava/lang/String;
-HSPLandroid/os/Process;->myTid()I
-HSPLandroid/os/Process;->myUid()I
-HSPLandroid/os/Process;->myUserHandle()Landroid/os/UserHandle;
-HSPLandroid/os/Process;->setArgV0(Ljava/lang/String;)V
-HSPLandroid/os/Process;->setStartTimes(JJJJ)V
-HSPLandroid/os/RemoteCallback$1;-><init>(Landroid/os/RemoteCallback;)V
-HSPLandroid/os/RemoteCallback$1;->sendResult(Landroid/os/Bundle;)V
-HSPLandroid/os/RemoteCallback$3;->createFromParcel(Landroid/os/Parcel;)Landroid/os/RemoteCallback;
-HSPLandroid/os/RemoteCallback$3;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/RemoteCallback;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/os/RemoteCallback;-><init>(Landroid/os/RemoteCallback$OnResultListener;)V
-HSPLandroid/os/RemoteCallback;-><init>(Landroid/os/RemoteCallback$OnResultListener;Landroid/os/Handler;)V
-HSPLandroid/os/RemoteCallback;->sendResult(Landroid/os/Bundle;)V
-HSPLandroid/os/RemoteCallback;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/RemoteCallbackList$Callback;-><init>(Landroid/os/RemoteCallbackList;Landroid/os/IInterface;Ljava/lang/Object;)V
-HSPLandroid/os/RemoteCallbackList$Callback;->binderDied()V
-HSPLandroid/os/RemoteCallbackList;-><init>()V
-HSPLandroid/os/RemoteCallbackList;->beginBroadcast()I
-HSPLandroid/os/RemoteCallbackList;->finishBroadcast()V
-HSPLandroid/os/RemoteCallbackList;->getBroadcastCookie(I)Ljava/lang/Object;
-HSPLandroid/os/RemoteCallbackList;->getBroadcastItem(I)Landroid/os/IInterface;
-HSPLandroid/os/RemoteCallbackList;->kill()V
-HSPLandroid/os/RemoteCallbackList;->logExcessiveCallbacks()V
-HSPLandroid/os/RemoteCallbackList;->onCallbackDied(Landroid/os/IInterface;)V
-HSPLandroid/os/RemoteCallbackList;->onCallbackDied(Landroid/os/IInterface;Ljava/lang/Object;)V
-HSPLandroid/os/RemoteCallbackList;->register(Landroid/os/IInterface;)Z
-HSPLandroid/os/RemoteCallbackList;->register(Landroid/os/IInterface;Ljava/lang/Object;)Z
-HSPLandroid/os/RemoteCallbackList;->unregister(Landroid/os/IInterface;)Z
-HSPLandroid/os/RemoteException;-><init>()V
-HSPLandroid/os/RemoteException;-><init>(Ljava/lang/String;)V
-HSPLandroid/os/RemoteException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V
-HSPLandroid/os/ResultReceiver$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/ResultReceiver;
-HSPLandroid/os/ResultReceiver$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/ResultReceiver$MyResultReceiver;-><init>(Landroid/os/ResultReceiver;)V
-HSPLandroid/os/ResultReceiver$MyResultReceiver;->send(ILandroid/os/Bundle;)V
-HSPLandroid/os/ResultReceiver$MyRunnable;->run()V
-HSPLandroid/os/ResultReceiver;-><init>(Landroid/os/Handler;)V
-HSPLandroid/os/ResultReceiver;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/os/ResultReceiver;->send(ILandroid/os/Bundle;)V
-HSPLandroid/os/ResultReceiver;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/ServiceManager$ServiceNotFoundException;-><init>(Ljava/lang/String;)V
-HSPLandroid/os/ServiceManager;->addService(Ljava/lang/String;Landroid/os/IBinder;)V
-HSPLandroid/os/ServiceManager;->addService(Ljava/lang/String;Landroid/os/IBinder;ZI)V
-HSPLandroid/os/ServiceManager;->checkService(Ljava/lang/String;)Landroid/os/IBinder;
-HSPLandroid/os/ServiceManager;->getIServiceManager()Landroid/os/IServiceManager;
-HSPLandroid/os/ServiceManager;->getService(Ljava/lang/String;)Landroid/os/IBinder;
-HSPLandroid/os/ServiceManager;->getServiceOrThrow(Ljava/lang/String;)Landroid/os/IBinder;
-HSPLandroid/os/ServiceManager;->initServiceCache(Ljava/util/Map;)V
-HSPLandroid/os/ServiceManager;->isDeclared(Ljava/lang/String;)Z
-HSPLandroid/os/ServiceManager;->rawGetService(Ljava/lang/String;)Landroid/os/IBinder;+]Lcom/android/internal/util/StatLogger;Lcom/android/internal/util/StatLogger;]Landroid/os/IServiceManager;Landroid/os/ServiceManagerProxy;
-HSPLandroid/os/ServiceManager;->waitForDeclaredService(Ljava/lang/String;)Landroid/os/IBinder;
-HSPLandroid/os/ServiceManagerProxy;->addService(Ljava/lang/String;Landroid/os/IBinder;ZI)V
-HSPLandroid/os/ServiceManagerProxy;->checkService(Ljava/lang/String;)Landroid/os/IBinder;
-HSPLandroid/os/ServiceManagerProxy;->getService(Ljava/lang/String;)Landroid/os/IBinder;
-HSPLandroid/os/ServiceManagerProxy;->isDeclared(Ljava/lang/String;)Z
-HSPLandroid/os/ServiceSpecificException;-><init>(ILjava/lang/String;)V
-HSPLandroid/os/SharedMemory$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/SharedMemory;
-HSPLandroid/os/SharedMemory$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/SharedMemory$Closer;-><init>(ILandroid/os/SharedMemory$MemoryRegistration;)V
-HSPLandroid/os/SharedMemory$Closer;-><init>(ILandroid/os/SharedMemory$MemoryRegistration;Landroid/os/SharedMemory$Closer-IA;)V
-HSPLandroid/os/SharedMemory$MemoryRegistration;-><init>(I)V
-HSPLandroid/os/SharedMemory$MemoryRegistration;-><init>(ILandroid/os/SharedMemory$MemoryRegistration-IA;)V
-HSPLandroid/os/SharedMemory$MemoryRegistration;->acquire()Landroid/os/SharedMemory$MemoryRegistration;
-HSPLandroid/os/SharedMemory$Unmapper;-><init>(JILandroid/os/SharedMemory$MemoryRegistration;)V
-HSPLandroid/os/SharedMemory$Unmapper;-><init>(JILandroid/os/SharedMemory$MemoryRegistration;Landroid/os/SharedMemory$Unmapper-IA;)V
-HSPLandroid/os/SharedMemory;-><init>(Ljava/io/FileDescriptor;)V
-HSPLandroid/os/SharedMemory;-><init>(Ljava/io/FileDescriptor;Landroid/os/SharedMemory-IA;)V
-HSPLandroid/os/SharedMemory;->checkOpen()V
-HSPLandroid/os/SharedMemory;->map(III)Ljava/nio/ByteBuffer;
-HSPLandroid/os/SharedMemory;->mapReadOnly()Ljava/nio/ByteBuffer;
-HSPLandroid/os/SharedMemory;->validateProt(I)V
-HSPLandroid/os/SimpleClock;-><init>(Ljava/time/ZoneId;)V
-HSPLandroid/os/StatFs;-><init>(Ljava/lang/String;)V
-HSPLandroid/os/StatFs;->doStat(Ljava/lang/String;)Landroid/system/StructStatVfs;
-HSPLandroid/os/StatFs;->getAvailableBlocks()I
-HSPLandroid/os/StatFs;->getAvailableBlocksLong()J
-HSPLandroid/os/StatFs;->getAvailableBytes()J
-HSPLandroid/os/StatFs;->getBlockCount()I
-HSPLandroid/os/StatFs;->getBlockCountLong()J
-HSPLandroid/os/StatFs;->getBlockSize()I
-HSPLandroid/os/StatFs;->getBlockSizeLong()J
-HSPLandroid/os/StatFs;->getTotalBytes()J
-HSPLandroid/os/StatFs;->restat(Ljava/lang/String;)V
-HSPLandroid/os/StatsServiceManager$ServiceRegisterer;-><init>(Ljava/lang/String;)V
-HSPLandroid/os/StatsServiceManager$ServiceRegisterer;->get()Landroid/os/IBinder;
-HSPLandroid/os/StatsServiceManager;-><init>()V
-HSPLandroid/os/StatsServiceManager;->getStatsManagerServiceRegisterer()Landroid/os/StatsServiceManager$ServiceRegisterer;
-HSPLandroid/os/StrictMode$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/os/StrictMode$$ExternalSyntheticLambda1;->log(Landroid/os/StrictMode$ViolationInfo;)V
-HSPLandroid/os/StrictMode$1;->initialValue()Ljava/lang/Object;
-HSPLandroid/os/StrictMode$1;->initialValue()Ljava/util/ArrayList;
-HSPLandroid/os/StrictMode$2;->initialValue()Ljava/lang/Object;
-HSPLandroid/os/StrictMode$2;->initialValue()Ljava/util/ArrayList;
-HSPLandroid/os/StrictMode$3;->initialValue()Landroid/os/Handler;
-HSPLandroid/os/StrictMode$3;->initialValue()Ljava/lang/Object;
-HSPLandroid/os/StrictMode$4;->initialValue()Landroid/os/StrictMode$AndroidBlockGuardPolicy;
-HSPLandroid/os/StrictMode$4;->initialValue()Ljava/lang/Object;
-HSPLandroid/os/StrictMode$5;->onPathAccess(Ljava/lang/String;)V
-HSPLandroid/os/StrictMode$8;->initialValue()Landroid/os/StrictMode$ThreadSpanState;
-HSPLandroid/os/StrictMode$8;->initialValue()Ljava/lang/Object;
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda1;->run()V
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;-><init>(I)V
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->getThreadPolicyMask()I
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->handleViolationWithTimingAttempt(Landroid/os/StrictMode$ViolationInfo;)V
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->lambda$handleViolationWithTimingAttempt$0(Landroid/view/IWindowManager;Ljava/util/ArrayList;)V
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->onCustomSlowCall(Ljava/lang/String;)V
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->onNetwork()V
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->onReadFromDisk()V+]Landroid/os/StrictMode$AndroidBlockGuardPolicy;Landroid/os/StrictMode$AndroidBlockGuardPolicy;
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->onThreadPolicyViolation(Landroid/os/StrictMode$ViolationInfo;)V
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->onUnbufferedIO()V
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->onWriteToDisk()V
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->setThreadPolicyMask(I)V
-HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->startHandlingViolationException(Landroid/os/strictmode/Violation;)V
-HSPLandroid/os/StrictMode$AndroidCloseGuardReporter;-><init>()V
-HSPLandroid/os/StrictMode$AndroidCloseGuardReporter;-><init>(Landroid/os/StrictMode$AndroidCloseGuardReporter-IA;)V
-HSPLandroid/os/StrictMode$AndroidCloseGuardReporter;->report(Ljava/lang/String;)V
-HSPLandroid/os/StrictMode$AndroidCloseGuardReporter;->report(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLandroid/os/StrictMode$InstanceTracker;-><init>(Ljava/lang/Object;)V
-HSPLandroid/os/StrictMode$InstanceTracker;->finalize()V
-HSPLandroid/os/StrictMode$Span;->finish()V
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;-><init>()V
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;-><init>(Landroid/os/StrictMode$ThreadPolicy;)V
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->build()Landroid/os/StrictMode$ThreadPolicy;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->detectAll()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->detectCustomSlowCalls()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->detectDiskReads()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->detectDiskWrites()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->detectExplicitGc()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->detectNetwork()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->detectResourceMismatches()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->detectUnbufferedIo()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->disable(I)Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->enable(I)Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->penaltyDeath()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->penaltyDeathOnNetwork()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->penaltyDropBox()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->penaltyLog()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->permitAll()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->permitCustomSlowCalls()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->permitDiskReads()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->permitDiskWrites()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->permitUnbufferedIo()Landroid/os/StrictMode$ThreadPolicy$Builder;
-HSPLandroid/os/StrictMode$ThreadPolicy;-><init>(ILandroid/os/StrictMode$OnThreadViolationListener;Ljava/util/concurrent/Executor;)V
-HSPLandroid/os/StrictMode$ThreadPolicy;-><init>(ILandroid/os/StrictMode$OnThreadViolationListener;Ljava/util/concurrent/Executor;Landroid/os/StrictMode$ThreadPolicy-IA;)V
-HSPLandroid/os/StrictMode$ThreadSpanState;-><init>()V
-HSPLandroid/os/StrictMode$ThreadSpanState;-><init>(Landroid/os/StrictMode$ThreadSpanState-IA;)V
-HSPLandroid/os/StrictMode$UnsafeIntentStrictModeCallback;-><init>()V
-HSPLandroid/os/StrictMode$UnsafeIntentStrictModeCallback;-><init>(Landroid/os/StrictMode$UnsafeIntentStrictModeCallback-IA;)V
-HSPLandroid/os/StrictMode$ViolationInfo;->-$$Nest$fgetmViolation(Landroid/os/StrictMode$ViolationInfo;)Landroid/os/strictmode/Violation;
-HSPLandroid/os/StrictMode$ViolationInfo;-><init>(Landroid/os/Parcel;Z)V+]Ljava/util/Deque;Ljava/util/ArrayDeque;]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/StrictMode$ViolationInfo;-><init>(Landroid/os/strictmode/Violation;I)V
-HSPLandroid/os/StrictMode$ViolationInfo;->getStackTrace()Ljava/lang/String;
-HSPLandroid/os/StrictMode$ViolationInfo;->hashCode()I
-HSPLandroid/os/StrictMode$ViolationInfo;->penaltyEnabled(I)Z
-HSPLandroid/os/StrictMode$ViolationInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/StrictMode$VmPolicy$Builder;-><init>()V
-HSPLandroid/os/StrictMode$VmPolicy$Builder;-><init>(Landroid/os/StrictMode$VmPolicy;)V
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->build()Landroid/os/StrictMode$VmPolicy;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectActivityLeaks()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectAll()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectContentUriWithoutPermission()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectCredentialProtectedWhileLocked()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectFileUriExposure()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectIncorrectContextUse()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectLeakedClosableObjects()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectLeakedRegistrationObjects()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectLeakedSqlLiteObjects()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectUnsafeIntentLaunch()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectUntaggedSockets()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->disable(I)Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->enable(I)Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->penaltyDeathOnFileUriExposure()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->penaltyDropBox()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->penaltyLog()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->permitActivityLeaks()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy$Builder;->permitUnsafeIntentLaunch()Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLandroid/os/StrictMode$VmPolicy;-><init>(ILjava/util/HashMap;Landroid/os/StrictMode$OnVmViolationListener;Ljava/util/concurrent/Executor;)V
-HSPLandroid/os/StrictMode$VmPolicy;-><init>(ILjava/util/HashMap;Landroid/os/StrictMode$OnVmViolationListener;Ljava/util/concurrent/Executor;Landroid/os/StrictMode$VmPolicy-IA;)V
-HSPLandroid/os/StrictMode;->-$$Nest$sfgetEMPTY_CLASS_LIMIT_MAP()Ljava/util/HashMap;
-HSPLandroid/os/StrictMode;->-$$Nest$sfgetLOGCAT_LOGGER()Landroid/os/StrictMode$ViolationLogger;
-HSPLandroid/os/StrictMode;->-$$Nest$sfgetLOG_V()Z
-HSPLandroid/os/StrictMode;->-$$Nest$sfgetsExpectedActivityInstanceCount()Ljava/util/HashMap;
-HSPLandroid/os/StrictMode;->-$$Nest$sfgetsLogger()Landroid/os/StrictMode$ViolationLogger;
-HSPLandroid/os/StrictMode;->-$$Nest$sfgetsThisThreadSpanState()Ljava/lang/ThreadLocal;
-HSPLandroid/os/StrictMode;->-$$Nest$sfgetsThreadViolationExecutor()Ljava/lang/ThreadLocal;
-HSPLandroid/os/StrictMode;->-$$Nest$sfgetsThreadViolationListener()Ljava/lang/ThreadLocal;
-HSPLandroid/os/StrictMode;->-$$Nest$smclampViolationTimeMap(Landroid/util/SparseLongArray;J)V
-HSPLandroid/os/StrictMode;->-$$Nest$smtooManyViolationsThisLoop()Z
-HSPLandroid/os/StrictMode;->allowThreadDiskReads()Landroid/os/StrictMode$ThreadPolicy;
-HSPLandroid/os/StrictMode;->allowThreadDiskReadsMask()I
-HSPLandroid/os/StrictMode;->allowThreadDiskWrites()Landroid/os/StrictMode$ThreadPolicy;
-HSPLandroid/os/StrictMode;->allowThreadDiskWritesMask()I
-HSPLandroid/os/StrictMode;->allowVmViolations()Landroid/os/StrictMode$VmPolicy;
-HSPLandroid/os/StrictMode;->assertConfigurationContext(Landroid/content/Context;Ljava/lang/String;)V
-HSPLandroid/os/StrictMode;->clampViolationTimeMap(Landroid/util/SparseLongArray;J)V
-HSPLandroid/os/StrictMode;->clearGatheredViolations()V+]Ljava/lang/ThreadLocal;Landroid/os/StrictMode$1;
-HSPLandroid/os/StrictMode;->decrementExpectedActivityCount(Ljava/lang/Class;)V
-HSPLandroid/os/StrictMode;->dropboxViolationAsync(ILandroid/os/StrictMode$ViolationInfo;)V
-HSPLandroid/os/StrictMode;->enterCriticalSpan(Ljava/lang/String;)Landroid/os/StrictMode$Span;
-HSPLandroid/os/StrictMode;->getThreadPolicy()Landroid/os/StrictMode$ThreadPolicy;
-HSPLandroid/os/StrictMode;->getThreadPolicyMask()I
-HSPLandroid/os/StrictMode;->getVmPolicy()Landroid/os/StrictMode$VmPolicy;
-HSPLandroid/os/StrictMode;->handleApplicationStrictModeViolation(ILandroid/os/StrictMode$ViolationInfo;)V
-HSPLandroid/os/StrictMode;->hasGatheredViolations()Z
-HSPLandroid/os/StrictMode;->incrementExpectedActivityCount(Ljava/lang/Class;)V
-HSPLandroid/os/StrictMode;->initThreadDefaults(Landroid/content/pm/ApplicationInfo;)V
-HSPLandroid/os/StrictMode;->initVmDefaults(Landroid/content/pm/ApplicationInfo;)V
-HSPLandroid/os/StrictMode;->isBundledSystemApp(Landroid/content/pm/ApplicationInfo;)Z
-HSPLandroid/os/StrictMode;->lambda$dropboxViolationAsync$2(ILandroid/os/StrictMode$ViolationInfo;)V
-HSPLandroid/os/StrictMode;->lambda$static$0(Landroid/os/StrictMode$ViolationInfo;)V
-HSPLandroid/os/StrictMode;->noteSlowCall(Ljava/lang/String;)V
-HSPLandroid/os/StrictMode;->noteUntaggedSocket()V
-HSPLandroid/os/StrictMode;->onBinderStrictModePolicyChange(I)V
-HSPLandroid/os/StrictMode;->onCredentialProtectedPathAccess(Ljava/lang/String;I)V
-HSPLandroid/os/StrictMode;->onVmPolicyViolation(Landroid/os/strictmode/Violation;)V
-HSPLandroid/os/StrictMode;->onVmPolicyViolation(Landroid/os/strictmode/Violation;Z)V
-HSPLandroid/os/StrictMode;->readAndHandleBinderCallViolations(Landroid/os/Parcel;)V
-HSPLandroid/os/StrictMode;->registerIntentMatchingRestrictionCallback()V
-HSPLandroid/os/StrictMode;->setBlockGuardPolicy(I)V
-HSPLandroid/os/StrictMode;->setBlockGuardVmPolicy(I)V
-HSPLandroid/os/StrictMode;->setCloseGuardEnabled(Z)V
-HSPLandroid/os/StrictMode;->setThreadPolicy(Landroid/os/StrictMode$ThreadPolicy;)V
-HSPLandroid/os/StrictMode;->setThreadPolicyMask(I)V
-HSPLandroid/os/StrictMode;->setVmPolicy(Landroid/os/StrictMode$VmPolicy;)V
-HSPLandroid/os/StrictMode;->tooManyViolationsThisLoop()Z
-HSPLandroid/os/StrictMode;->trackActivity(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/os/StrictMode;->vmClosableObjectLeaksEnabled()Z
-HSPLandroid/os/StrictMode;->vmContentUriWithoutPermissionEnabled()Z
-HSPLandroid/os/StrictMode;->vmFileUriExposureEnabled()Z
-HSPLandroid/os/StrictMode;->vmImplicitDirectBootEnabled()Z
-HSPLandroid/os/StrictMode;->vmIncorrectContextUseEnabled()Z
-HSPLandroid/os/StrictMode;->vmRegistrationLeaksEnabled()Z
-HSPLandroid/os/StrictMode;->vmSqliteObjectLeaksEnabled()Z
-HSPLandroid/os/StrictMode;->vmUnsafeIntentLaunchEnabled()Z
-HSPLandroid/os/StrictMode;->vmUntaggedSocketEnabled()Z
-HSPLandroid/os/StrictMode;->writeGatheredViolationsToParcel(Landroid/os/Parcel;)V
-HSPLandroid/os/SystemClock$2;->millis()J
-HSPLandroid/os/SystemClock;->sleep(J)V
-HSPLandroid/os/SystemConfigManager;-><init>()V
-HSPLandroid/os/SystemConfigManager;->getDisabledUntilUsedPreinstalledCarrierApps()Ljava/util/Set;
-HSPLandroid/os/SystemConfigManager;->getDisabledUntilUsedPreinstalledCarrierAssociatedAppEntries()Ljava/util/Map;
-HSPLandroid/os/SystemProperties$Handle;-><init>(J)V
-HSPLandroid/os/SystemProperties$Handle;-><init>(JLandroid/os/SystemProperties$Handle-IA;)V
-HSPLandroid/os/SystemProperties$Handle;->getLong(J)J
-HSPLandroid/os/SystemProperties;->-$$Nest$smnative_get_long(JJ)J
-HSPLandroid/os/SystemProperties;->addChangeCallback(Ljava/lang/Runnable;)V
-HSPLandroid/os/SystemProperties;->find(Ljava/lang/String;)Landroid/os/SystemProperties$Handle;
-HSPLandroid/os/SystemProperties;->get(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/os/SystemProperties;->get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/os/SystemProperties;->getBoolean(Ljava/lang/String;Z)Z
-HSPLandroid/os/SystemProperties;->getInt(Ljava/lang/String;I)I
-HSPLandroid/os/SystemProperties;->getLong(Ljava/lang/String;J)J
-HSPLandroid/os/SystemProperties;->native_get(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/os/SystemProperties;->set(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/os/SystemVibrator;-><init>(Landroid/content/Context;)V
-HSPLandroid/os/SystemVibrator;->hasVibrator()Z
-HSPLandroid/os/SystemVibrator;->vibrate(ILjava/lang/String;Landroid/os/VibrationEffect;Ljava/lang/String;Landroid/os/VibrationAttributes;)V
-HSPLandroid/os/SystemVibratorManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/os/SystemVibratorManager;->getVibratorIds()[I
-HSPLandroid/os/SystemVibratorManager;->vibrate(ILjava/lang/String;Landroid/os/CombinedVibration;Ljava/lang/String;Landroid/os/VibrationAttributes;)V
-HSPLandroid/os/TelephonyServiceManager$ServiceRegisterer;-><init>(Ljava/lang/String;)V
-HSPLandroid/os/TelephonyServiceManager$ServiceRegisterer;->get()Landroid/os/IBinder;
-HSPLandroid/os/TelephonyServiceManager;-><init>()V
-HSPLandroid/os/TelephonyServiceManager;->getCarrierConfigServiceRegisterer()Landroid/os/TelephonyServiceManager$ServiceRegisterer;
-HSPLandroid/os/TelephonyServiceManager;->getEuiccControllerService()Landroid/os/TelephonyServiceManager$ServiceRegisterer;
-HSPLandroid/os/TelephonyServiceManager;->getPhoneSubServiceRegisterer()Landroid/os/TelephonyServiceManager$ServiceRegisterer;
-HSPLandroid/os/TelephonyServiceManager;->getSmsServiceRegisterer()Landroid/os/TelephonyServiceManager$ServiceRegisterer;
-HSPLandroid/os/TelephonyServiceManager;->getSubscriptionServiceRegisterer()Landroid/os/TelephonyServiceManager$ServiceRegisterer;
-HSPLandroid/os/TelephonyServiceManager;->getTelephonyServiceRegisterer()Landroid/os/TelephonyServiceManager$ServiceRegisterer;
-HSPLandroid/os/Temperature;-><init>(FILjava/lang/String;I)V
-HSPLandroid/os/Temperature;->getStatus()I
-HSPLandroid/os/Temperature;->isValidStatus(I)Z
-HSPLandroid/os/ThreadLocalWorkSource$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
-HSPLandroid/os/ThreadLocalWorkSource;->getToken()J+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;
-HSPLandroid/os/ThreadLocalWorkSource;->getUid()I+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;
-HSPLandroid/os/ThreadLocalWorkSource;->lambda$static$0()[I
-HSPLandroid/os/ThreadLocalWorkSource;->parseUidFromToken(J)I
-HSPLandroid/os/ThreadLocalWorkSource;->restore(J)V+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;
-HSPLandroid/os/ThreadLocalWorkSource;->setUid(I)J+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;
-HSPLandroid/os/Trace;->asyncTraceBegin(JLjava/lang/String;I)V
-HSPLandroid/os/Trace;->asyncTraceEnd(JLjava/lang/String;I)V
-HSPLandroid/os/Trace;->asyncTraceForTrackBegin(JLjava/lang/String;Ljava/lang/String;I)V
-HSPLandroid/os/Trace;->asyncTraceForTrackEnd(JLjava/lang/String;I)V
-HSPLandroid/os/Trace;->beginAsyncSection(Ljava/lang/String;I)V
-HSPLandroid/os/Trace;->beginSection(Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/os/Trace;->endAsyncSection(Ljava/lang/String;I)V
-HSPLandroid/os/Trace;->endSection()V
-HSPLandroid/os/Trace;->instant(JLjava/lang/String;)V
-HSPLandroid/os/Trace;->instantForTrack(JLjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/os/Trace;->isEnabled()Z
-HSPLandroid/os/Trace;->isTagEnabled(J)Z
-HSPLandroid/os/Trace;->setAppTracingAllowed(Z)V
-HSPLandroid/os/Trace;->setCounter(Ljava/lang/String;J)V
-HSPLandroid/os/Trace;->traceBegin(JLjava/lang/String;)V
-HSPLandroid/os/Trace;->traceCounter(JLjava/lang/String;I)V
-HSPLandroid/os/Trace;->traceEnd(J)V
-HSPLandroid/os/UserHandle$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/UserHandle;
-HSPLandroid/os/UserHandle$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/UserHandle;-><init>(I)V
-HSPLandroid/os/UserHandle;->equals(Ljava/lang/Object;)Z
-HSPLandroid/os/UserHandle;->formatUid(I)Ljava/lang/String;
-HSPLandroid/os/UserHandle;->formatUid(Ljava/lang/StringBuilder;I)V
-HSPLandroid/os/UserHandle;->getAppId(I)I
-HSPLandroid/os/UserHandle;->getCacheAppGid(I)I
-HSPLandroid/os/UserHandle;->getCacheAppGid(II)I
-HSPLandroid/os/UserHandle;->getCallingUserId()I
-HSPLandroid/os/UserHandle;->getIdentifier()I
-HSPLandroid/os/UserHandle;->getUid(II)I
-HSPLandroid/os/UserHandle;->getUserHandleForUid(I)Landroid/os/UserHandle;
-HSPLandroid/os/UserHandle;->getUserId(I)I
-HSPLandroid/os/UserHandle;->hashCode()I
-HSPLandroid/os/UserHandle;->isApp(I)Z
-HSPLandroid/os/UserHandle;->isCore(I)Z
-HSPLandroid/os/UserHandle;->isIsolated(I)Z
-HSPLandroid/os/UserHandle;->isOwner()Z
-HSPLandroid/os/UserHandle;->isSameApp(II)Z
-HSPLandroid/os/UserHandle;->isSystem()Z
-HSPLandroid/os/UserHandle;->myUserId()I
-HSPLandroid/os/UserHandle;->of(I)Landroid/os/UserHandle;
-HSPLandroid/os/UserHandle;->readFromParcel(Landroid/os/Parcel;)Landroid/os/UserHandle;
-HSPLandroid/os/UserHandle;->toString()Ljava/lang/String;
-HSPLandroid/os/UserHandle;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/UserHandle;->writeToParcel(Landroid/os/UserHandle;Landroid/os/Parcel;)V
-HSPLandroid/os/UserManager$1;-><init>(Landroid/os/UserManager;ILjava/lang/String;)V
-HSPLandroid/os/UserManager$1;->bypass(Ljava/lang/Integer;)Z
-HSPLandroid/os/UserManager$1;->bypass(Ljava/lang/Object;)Z
-HSPLandroid/os/UserManager$1;->recompute(Ljava/lang/Integer;)Ljava/lang/Boolean;
-HSPLandroid/os/UserManager$1;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/os/UserManager$2;-><init>(Landroid/os/UserManager;ILjava/lang/String;)V
-HSPLandroid/os/UserManager$2;->bypass(Ljava/lang/Integer;)Z
-HSPLandroid/os/UserManager$2;->bypass(Ljava/lang/Object;)Z
-HSPLandroid/os/UserManager$2;->recompute(Ljava/lang/Integer;)Ljava/lang/Boolean;
-HSPLandroid/os/UserManager$2;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/os/UserManager$3;-><init>(Landroid/os/UserManager;ILjava/lang/String;)V
-HSPLandroid/os/UserManager$3;->bypass(Ljava/lang/Integer;)Z
-HSPLandroid/os/UserManager$3;->bypass(Ljava/lang/Object;)Z
-HSPLandroid/os/UserManager$3;->recompute(Ljava/lang/Integer;)Ljava/lang/String;
-HSPLandroid/os/UserManager$3;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/os/UserManager$4;-><init>(Landroid/os/UserManager;ILjava/lang/String;)V
-HSPLandroid/os/UserManager;->-$$Nest$fgetmService(Landroid/os/UserManager;)Landroid/os/IUserManager;
-HSPLandroid/os/UserManager;-><init>(Landroid/content/Context;Landroid/os/IUserManager;)V
-HSPLandroid/os/UserManager;->convertUserIdsToUserHandles([I)Ljava/util/List;
-HSPLandroid/os/UserManager;->get(Landroid/content/Context;)Landroid/os/UserManager;
-HSPLandroid/os/UserManager;->getAliveUsers()Ljava/util/List;
-HSPLandroid/os/UserManager;->getApplicationRestrictions(Ljava/lang/String;)Landroid/os/Bundle;
-HSPLandroid/os/UserManager;->getContextUserIfAppropriate()I
-HSPLandroid/os/UserManager;->getEnabledProfileIds(I)[I
-HSPLandroid/os/UserManager;->getEnabledProfiles(I)Ljava/util/List;
-HSPLandroid/os/UserManager;->getMaxSupportedUsers()I
-HSPLandroid/os/UserManager;->getPrimaryUser()Landroid/content/pm/UserInfo;
-HSPLandroid/os/UserManager;->getProfileIds(IZ)[I
-HSPLandroid/os/UserManager;->getProfileIdsWithDisabled(I)[I
-HSPLandroid/os/UserManager;->getProfileParent(I)Landroid/content/pm/UserInfo;
-HSPLandroid/os/UserManager;->getProfileType(I)Ljava/lang/String;
-HSPLandroid/os/UserManager;->getProfiles(I)Ljava/util/List;
-HSPLandroid/os/UserManager;->getProfiles(Z)Ljava/util/List;
-HSPLandroid/os/UserManager;->getSerialNumberForUser(Landroid/os/UserHandle;)J
-HSPLandroid/os/UserManager;->getUserBadgeColor(I)I
-HSPLandroid/os/UserManager;->getUserCount()I
-HSPLandroid/os/UserManager;->getUserForSerialNumber(J)Landroid/os/UserHandle;
-HSPLandroid/os/UserManager;->getUserHandle()I
-HSPLandroid/os/UserManager;->getUserHandle(I)I
-HSPLandroid/os/UserManager;->getUserHandles(Z)Ljava/util/List;
-HSPLandroid/os/UserManager;->getUserInfo(I)Landroid/content/pm/UserInfo;
-HSPLandroid/os/UserManager;->getUserProfiles()Ljava/util/List;
-HSPLandroid/os/UserManager;->getUserRestrictionSources(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;
-HSPLandroid/os/UserManager;->getUserRestrictions()Landroid/os/Bundle;
-HSPLandroid/os/UserManager;->getUserRestrictions(Landroid/os/UserHandle;)Landroid/os/Bundle;
-HSPLandroid/os/UserManager;->getUserSerialNumber(I)I
-HSPLandroid/os/UserManager;->getUsers()Ljava/util/List;
-HSPLandroid/os/UserManager;->getUsers(ZZZ)Ljava/util/List;
-HSPLandroid/os/UserManager;->hasBadge(I)Z
-HSPLandroid/os/UserManager;->hasBaseUserRestriction(Ljava/lang/String;Landroid/os/UserHandle;)Z
-HSPLandroid/os/UserManager;->hasUserRestriction(Ljava/lang/String;)Z
-HSPLandroid/os/UserManager;->hasUserRestriction(Ljava/lang/String;Landroid/os/UserHandle;)Z
-HSPLandroid/os/UserManager;->hasUserRestrictionForUser(Ljava/lang/String;I)Z
-HSPLandroid/os/UserManager;->hasUserRestrictionForUser(Ljava/lang/String;Landroid/os/UserHandle;)Z
-HSPLandroid/os/UserManager;->isDemoUser()Z
-HSPLandroid/os/UserManager;->isDeviceInDemoMode(Landroid/content/Context;)Z
-HSPLandroid/os/UserManager;->isHeadlessSystemUserMode()Z
-HSPLandroid/os/UserManager;->isManagedProfile()Z
-HSPLandroid/os/UserManager;->isManagedProfile(I)Z
-HSPLandroid/os/UserManager;->isProfile(I)Z
-HSPLandroid/os/UserManager;->isQuietModeEnabled(Landroid/os/UserHandle;)Z
-HSPLandroid/os/UserManager;->isSystemUser()Z
-HSPLandroid/os/UserManager;->isUserAdmin(I)Z
-HSPLandroid/os/UserManager;->isUserRunning(I)Z
-HSPLandroid/os/UserManager;->isUserRunning(Landroid/os/UserHandle;)Z
-HSPLandroid/os/UserManager;->isUserSwitcherEnabled()Z
-HSPLandroid/os/UserManager;->isUserSwitcherEnabled(Z)Z
-HSPLandroid/os/UserManager;->isUserTypeManagedProfile(Ljava/lang/String;)Z
-HSPLandroid/os/UserManager;->isUserTypeRestricted(Ljava/lang/String;)Z
-HSPLandroid/os/UserManager;->isUserUnlocked()Z
-HSPLandroid/os/UserManager;->isUserUnlocked(I)Z
-HSPLandroid/os/UserManager;->isUserUnlocked(Landroid/os/UserHandle;)Z
-HSPLandroid/os/UserManager;->isUserUnlockingOrUnlocked(I)Z
-HSPLandroid/os/UserManager;->supportsMultipleUsers()Z
-HSPLandroid/os/VibrationAttributes$Builder;-><init>()V
-HSPLandroid/os/VibrationAttributes$Builder;->build()Landroid/os/VibrationAttributes;
-HSPLandroid/os/VibrationAttributes$Builder;->setUsage(Landroid/media/AudioAttributes;)V
-HSPLandroid/os/VibrationEffect$Composed;->validate()V
-HSPLandroid/os/VibrationEffect;-><init>()V
-HSPLandroid/os/VibrationEffect;->createOneShot(JI)Landroid/os/VibrationEffect;
-HSPLandroid/os/VibrationEffect;->createWaveform([JI)Landroid/os/VibrationEffect;
-HSPLandroid/os/VibrationEffect;->createWaveform([J[II)Landroid/os/VibrationEffect;
-HSPLandroid/os/VibrationEffect;->get(IZ)Landroid/os/VibrationEffect;
-HSPLandroid/os/Vibrator;-><init>(Landroid/content/Context;)V
-HSPLandroid/os/Vibrator;->vibrate(Landroid/os/VibrationEffect;Landroid/media/AudioAttributes;)V
-HSPLandroid/os/Vibrator;->vibrate(Landroid/os/VibrationEffect;Landroid/os/VibrationAttributes;)V
-HSPLandroid/os/VibratorManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/os/WorkSource$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/WorkSource;
-HSPLandroid/os/WorkSource$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/WorkSource;-><init>()V
-HSPLandroid/os/WorkSource;-><init>(ILjava/lang/String;)V
-HSPLandroid/os/WorkSource;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/os/WorkSource;-><init>(Landroid/os/WorkSource;)V
-HSPLandroid/os/WorkSource;->add(ILjava/lang/String;)Z
-HSPLandroid/os/WorkSource;->add(Landroid/os/WorkSource;)Z
-HSPLandroid/os/WorkSource;->diff(Landroid/os/WorkSource;)Z
-HSPLandroid/os/WorkSource;->equals(Ljava/lang/Object;)Z
-HSPLandroid/os/WorkSource;->getPackageName(I)Ljava/lang/String;
-HSPLandroid/os/WorkSource;->getUid(I)I
-HSPLandroid/os/WorkSource;->getWorkChains()Ljava/util/List;
-HSPLandroid/os/WorkSource;->insert(IILjava/lang/String;)V
-HSPLandroid/os/WorkSource;->isEmpty()Z
-HSPLandroid/os/WorkSource;->remove(Landroid/os/WorkSource;)Z
-HSPLandroid/os/WorkSource;->removeUidsAndNames(Landroid/os/WorkSource;)Z
-HSPLandroid/os/WorkSource;->set(Landroid/os/WorkSource;)V
-HSPLandroid/os/WorkSource;->size()I
-HSPLandroid/os/WorkSource;->toString()Ljava/lang/String;
-HSPLandroid/os/WorkSource;->updateLocked(Landroid/os/WorkSource;ZZ)Z
-HSPLandroid/os/WorkSource;->updateUidsAndNamesLocked(Landroid/os/WorkSource;ZZ)Z
-HSPLandroid/os/WorkSource;->updateUidsLocked(Landroid/os/WorkSource;ZZ)Z
-HSPLandroid/os/WorkSource;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/os/connectivity/CellularBatteryStats;-><init>(JJJJJJJJJLjava/lang/Long;[J[J[JJ)V
-HSPLandroid/os/health/HealthStats;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/os/health/HealthStats;->getMeasurement(I)J
-HSPLandroid/os/health/HealthStats;->getMeasurements(I)Ljava/util/Map;
-HSPLandroid/os/health/HealthStats;->getStats(I)Ljava/util/Map;
-HSPLandroid/os/health/HealthStats;->getTimer(I)Landroid/os/health/TimerStat;
-HSPLandroid/os/health/HealthStats;->getTimers(I)Ljava/util/Map;
-HSPLandroid/os/health/HealthStats;->hasMeasurement(I)Z
-HSPLandroid/os/health/HealthStats;->hasMeasurements(I)Z
-HSPLandroid/os/health/HealthStats;->hasStats(I)Z
-HSPLandroid/os/health/HealthStats;->hasTimer(I)Z
-HSPLandroid/os/health/HealthStats;->hasTimers(I)Z
-HSPLandroid/os/health/HealthStatsParceler$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/health/HealthStatsParceler;
-HSPLandroid/os/health/HealthStatsParceler$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/health/HealthStatsParceler;->getHealthStats()Landroid/os/health/HealthStats;
-HSPLandroid/os/health/SystemHealthManager;->takeMyUidSnapshot()Landroid/os/health/HealthStats;
-HSPLandroid/os/health/SystemHealthManager;->takeUidSnapshot(I)Landroid/os/health/HealthStats;
-HSPLandroid/os/health/TimerStat$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/health/TimerStat;
-HSPLandroid/os/health/TimerStat$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/health/TimerStat;->getCount()I
-HSPLandroid/os/health/TimerStat;->getTime()J
-HSPLandroid/os/storage/IObbActionListener$Stub;-><init>()V
-HSPLandroid/os/storage/IStorageEventListener$Stub;-><init>()V
-HSPLandroid/os/storage/IStorageEventListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/storage/IStorageManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/storage/IStorageManager$Stub$Proxy;->allocateBytes(Ljava/lang/String;JILjava/lang/String;)V
-HSPLandroid/os/storage/IStorageManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/storage/IStorageManager$Stub$Proxy;->getAllocatableBytes(Ljava/lang/String;ILjava/lang/String;)J
-HSPLandroid/os/storage/IStorageManager$Stub$Proxy;->getVolumeList(ILjava/lang/String;I)[Landroid/os/storage/StorageVolume;
-HSPLandroid/os/storage/IStorageManager$Stub$Proxy;->getVolumes(I)[Landroid/os/storage/VolumeInfo;
-HSPLandroid/os/storage/IStorageManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/storage/IStorageManager;
-HSPLandroid/os/storage/StorageEventListener;-><init>()V
-HSPLandroid/os/storage/StorageEventListener;->onStorageStateChanged(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/os/storage/StorageManager$ObbActionListener;-><init>(Landroid/os/storage/StorageManager;)V
-HSPLandroid/os/storage/StorageManager$ObbActionListener;-><init>(Landroid/os/storage/StorageManager;Landroid/os/storage/StorageManager$ObbActionListener-IA;)V
-HSPLandroid/os/storage/StorageManager$StorageEventListenerDelegate;-><init>(Landroid/os/storage/StorageManager;Ljava/util/concurrent/Executor;Landroid/os/storage/StorageEventListener;Landroid/os/storage/StorageManager$StorageVolumeCallback;)V
-HSPLandroid/os/storage/StorageManager$StorageEventListenerDelegate;->onStorageStateChanged(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/os/storage/StorageManager$StorageEventListenerDelegate;->onVolumeStateChanged(Landroid/os/storage/VolumeInfo;II)V
-HSPLandroid/os/storage/StorageManager$StorageVolumeCallback;-><init>()V
-HSPLandroid/os/storage/StorageManager;-><init>(Landroid/content/Context;Landroid/os/Looper;)V
-HSPLandroid/os/storage/StorageManager;->allocateBytes(Ljava/io/FileDescriptor;JI)V
-HSPLandroid/os/storage/StorageManager;->allocateBytes(Ljava/util/UUID;JI)V
-HSPLandroid/os/storage/StorageManager;->convert(Ljava/lang/String;)Ljava/util/UUID;
-HSPLandroid/os/storage/StorageManager;->convert(Ljava/util/UUID;)Ljava/lang/String;+]Ljava/lang/Object;Ljava/util/UUID;
-HSPLandroid/os/storage/StorageManager;->getAllocatableBytes(Ljava/util/UUID;I)J
-HSPLandroid/os/storage/StorageManager;->getStorageVolume(Ljava/io/File;I)Landroid/os/storage/StorageVolume;
-HSPLandroid/os/storage/StorageManager;->getStorageVolume([Landroid/os/storage/StorageVolume;Ljava/io/File;)Landroid/os/storage/StorageVolume;
-HSPLandroid/os/storage/StorageManager;->getStorageVolumes()Ljava/util/List;
-HSPLandroid/os/storage/StorageManager;->getUuidForPath(Ljava/io/File;)Ljava/util/UUID;
-HSPLandroid/os/storage/StorageManager;->getVolumeList()[Landroid/os/storage/StorageVolume;
-HSPLandroid/os/storage/StorageManager;->getVolumeList(II)[Landroid/os/storage/StorageVolume;
-HSPLandroid/os/storage/StorageManager;->getVolumes()Ljava/util/List;
-HSPLandroid/os/storage/StorageManager;->isEncrypted()Z
-HSPLandroid/os/storage/StorageManager;->registerListener(Landroid/os/storage/StorageEventListener;)V
-HSPLandroid/os/storage/StorageVolume$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/storage/StorageVolume;
-HSPLandroid/os/storage/StorageVolume$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/storage/StorageVolume$1;->newArray(I)[Landroid/os/storage/StorageVolume;
-HSPLandroid/os/storage/StorageVolume$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/os/storage/StorageVolume;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/os/storage/StorageVolume;-><init>(Landroid/os/Parcel;Landroid/os/storage/StorageVolume-IA;)V
-HSPLandroid/os/storage/StorageVolume;->getId()Ljava/lang/String;
-HSPLandroid/os/storage/StorageVolume;->getOwner()Landroid/os/UserHandle;
-HSPLandroid/os/storage/StorageVolume;->getPath()Ljava/lang/String;
-HSPLandroid/os/storage/StorageVolume;->getPathFile()Ljava/io/File;
-HSPLandroid/os/storage/StorageVolume;->getState()Ljava/lang/String;
-HSPLandroid/os/storage/StorageVolume;->getUuid()Ljava/lang/String;
-HSPLandroid/os/storage/StorageVolume;->isEmulated()Z
-HSPLandroid/os/storage/StorageVolume;->isPrimary()Z
-HSPLandroid/os/storage/StorageVolume;->isRemovable()Z
-HSPLandroid/os/storage/VolumeInfo$2;->createFromParcel(Landroid/os/Parcel;)Landroid/os/storage/VolumeInfo;
-HSPLandroid/os/storage/VolumeInfo$2;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/storage/VolumeInfo$2;->newArray(I)[Landroid/os/storage/VolumeInfo;
-HSPLandroid/os/storage/VolumeInfo$2;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/os/storage/VolumeInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/os/storage/VolumeInfo;->getPathForUser(I)Ljava/io/File;
-HSPLandroid/os/storage/VolumeInfo;->getType()I
-HSPLandroid/os/strictmode/CredentialProtectedWhileLockedViolation;-><init>(Ljava/lang/String;)V
-HSPLandroid/os/strictmode/DiskReadViolation;-><init>()V
-HSPLandroid/os/strictmode/LeakedClosableViolation;-><init>(Ljava/lang/String;)V
-HSPLandroid/os/strictmode/Violation;-><init>(Ljava/lang/String;)V
-HSPLandroid/os/strictmode/Violation;->calcStackTraceHashCode([Ljava/lang/StackTraceElement;)I
-HSPLandroid/os/strictmode/Violation;->fillInStackTrace()Ljava/lang/Throwable;
-HSPLandroid/os/strictmode/Violation;->hashCode()I
-HSPLandroid/os/strictmode/Violation;->initCause(Ljava/lang/Throwable;)Ljava/lang/Throwable;
-HSPLandroid/os/vibrator/PrebakedSegment;->getDuration()J
-HSPLandroid/os/vibrator/PrebakedSegment;->isValidEffectStrength(I)Z
-HSPLandroid/os/vibrator/PrebakedSegment;->validate()V
-HSPLandroid/os/vibrator/StepSegment;->getDuration()J
-HSPLandroid/os/vibrator/StepSegment;->validate()V
-HSPLandroid/os/vibrator/VibrationEffectSegment;-><init>()V
-HSPLandroid/os/vibrator/VibrationEffectSegment;->checkDurationArgument(JLjava/lang/String;)V
-HSPLandroid/os/vibrator/VibrationEffectSegment;->checkFrequencyArgument(FLjava/lang/String;)V
-HSPLandroid/permission/ILegacyPermissionManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/permission/ILegacyPermissionManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/permission/ILegacyPermissionManager;
-HSPLandroid/permission/IOnPermissionsChangeListener$Stub;-><init>()V
-HSPLandroid/permission/IOnPermissionsChangeListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/permission/IPermissionChecker$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/permission/IPermissionChecker$Stub$Proxy;->checkPermission(Ljava/lang/String;Landroid/content/AttributionSourceState;Ljava/lang/String;ZZZI)I
-HSPLandroid/permission/IPermissionChecker$Stub;->asInterface(Landroid/os/IBinder;)Landroid/permission/IPermissionChecker;
-HSPLandroid/permission/IPermissionManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/permission/IPermissionManager$Stub$Proxy;->addOnPermissionsChangeListener(Landroid/permission/IOnPermissionsChangeListener;)V
-HSPLandroid/permission/IPermissionManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/permission/IPermissionManager$Stub$Proxy;->getPermissionInfo(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;
-HSPLandroid/permission/IPermissionManager$Stub$Proxy;->getSplitPermissions()Ljava/util/List;
-HSPLandroid/permission/IPermissionManager$Stub$Proxy;->removeOnPermissionsChangeListener(Landroid/permission/IOnPermissionsChangeListener;)V
-HSPLandroid/permission/IPermissionManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/permission/IPermissionManager;
-HSPLandroid/permission/LegacyPermissionManager;-><init>()V
-HSPLandroid/permission/LegacyPermissionManager;-><init>(Landroid/permission/ILegacyPermissionManager;)V
-HSPLandroid/permission/LegacyPermissionManager;->checkDeviceIdentifierAccess(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)I
-HSPLandroid/permission/PermissionCheckerManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/permission/PermissionCheckerManager;->checkPermission(Ljava/lang/String;Landroid/content/AttributionSourceState;Ljava/lang/String;ZZZI)I
-HSPLandroid/permission/PermissionManager$1;-><init>(ILjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/permission/PermissionManager$1;->recompute(Landroid/permission/PermissionManager$PermissionQuery;)Ljava/lang/Integer;
-HSPLandroid/permission/PermissionManager$1;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/permission/PermissionManager$2;-><init>(ILjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/permission/PermissionManager$2;->bypass(Landroid/permission/PermissionManager$PackageNamePermissionQuery;)Z
-HSPLandroid/permission/PermissionManager$2;->bypass(Ljava/lang/Object;)Z
-HSPLandroid/permission/PermissionManager$2;->recompute(Landroid/permission/PermissionManager$PackageNamePermissionQuery;)Ljava/lang/Integer;
-HSPLandroid/permission/PermissionManager$2;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/permission/PermissionManager$OnPermissionsChangeListenerDelegate;-><init>(Landroid/permission/PermissionManager;Landroid/content/pm/PackageManager$OnPermissionsChangedListener;Landroid/os/Looper;)V
-HSPLandroid/permission/PermissionManager$OnPermissionsChangeListenerDelegate;->handleMessage(Landroid/os/Message;)Z
-HSPLandroid/permission/PermissionManager$PackageNamePermissionQuery;->equals(Ljava/lang/Object;)Z
-HSPLandroid/permission/PermissionManager$PackageNamePermissionQuery;->hashCode()I
-HSPLandroid/permission/PermissionManager$PermissionQuery;->equals(Ljava/lang/Object;)Z
-HSPLandroid/permission/PermissionManager$PermissionQuery;->hashCode()I
-HSPLandroid/permission/PermissionManager$SplitPermissionInfo;-><init>(Landroid/content/pm/permission/SplitPermissionInfoParcelable;)V
-HSPLandroid/permission/PermissionManager$SplitPermissionInfo;->getNewPermissions()Ljava/util/List;
-HSPLandroid/permission/PermissionManager$SplitPermissionInfo;->getSplitPermission()Ljava/lang/String;
-HSPLandroid/permission/PermissionManager$SplitPermissionInfo;->getTargetSdk()I
-HSPLandroid/permission/PermissionManager;-><clinit>()V
-HSPLandroid/permission/PermissionManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/permission/PermissionManager;->addOnPermissionsChangeListener(Landroid/content/pm/PackageManager$OnPermissionsChangedListener;)V
-HSPLandroid/permission/PermissionManager;->checkPermissionUncached(Ljava/lang/String;III)I+]Landroid/app/IActivityManager;Landroid/app/IActivityManager$Stub$Proxy;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/permission/PermissionManager;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)I
-HSPLandroid/permission/PermissionManager;->getPermissionInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;
-HSPLandroid/permission/PermissionManager;->getPersistentDeviceId(I)Ljava/lang/String;
-HSPLandroid/permission/PermissionManager;->getSplitPermissions()Ljava/util/List;
-HSPLandroid/permission/PermissionManager;->removeOnPermissionsChangeListener(Landroid/content/pm/PackageManager$OnPermissionsChangedListener;)V
-HSPLandroid/permission/PermissionManager;->splitPermissionInfoListToNonParcelableList(Ljava/util/List;)Ljava/util/List;
-HSPLandroid/permission/PermissionManager;->updatePermissionFlags(Ljava/lang/String;Ljava/lang/String;IILandroid/os/UserHandle;)V
-HSPLandroid/preference/PreferenceManager;->getDefaultSharedPreferences(Landroid/content/Context;)Landroid/content/SharedPreferences;
-HSPLandroid/preference/PreferenceManager;->getDefaultSharedPreferencesMode()I
-HSPLandroid/preference/PreferenceManager;->getDefaultSharedPreferencesName(Landroid/content/Context;)Ljava/lang/String;
-HSPLandroid/provider/CallLog$Calls;->shouldHaveSharedCallLogEntries(Landroid/content/Context;Landroid/os/UserManager;I)Z
-HSPLandroid/provider/ContactsContract$CommonDataKinds$Email;->getTypeLabelResource(I)I
-HSPLandroid/provider/ContactsContract$CommonDataKinds$Phone;->getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLandroid/provider/ContactsContract$CommonDataKinds$Phone;->getTypeLabelResource(I)I
-HSPLandroid/provider/ContactsContract$Contacts;->getLookupUri(JLjava/lang/String;)Landroid/net/Uri;
-HSPLandroid/provider/DeviceConfigInitializer;-><clinit>()V
-HSPLandroid/provider/DeviceConfigInitializer;->setDeviceConfigServiceManager(Landroid/provider/DeviceConfigServiceManager;)V
-HSPLandroid/provider/DeviceConfigServiceManager;-><init>()V
-HSPLandroid/provider/FontRequest;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V
-HSPLandroid/provider/FontsContract$1;->run()V
-HSPLandroid/provider/FontsContract$FontFamilyResult;->getFonts()[Landroid/provider/FontsContract$FontInfo;
-HSPLandroid/provider/FontsContract$FontFamilyResult;->getStatusCode()I
-HSPLandroid/provider/FontsContract$FontInfo;->getAxes()[Landroid/graphics/fonts/FontVariationAxis;
-HSPLandroid/provider/FontsContract$FontInfo;->getResultCode()I
-HSPLandroid/provider/FontsContract$FontInfo;->getTtcIndex()I
-HSPLandroid/provider/FontsContract$FontInfo;->getUri()Landroid/net/Uri;
-HSPLandroid/provider/FontsContract$FontInfo;->getWeight()I
-HSPLandroid/provider/FontsContract$FontInfo;->isItalic()Z
-HSPLandroid/provider/FontsContract;->buildTypeface(Landroid/content/Context;Landroid/os/CancellationSignal;[Landroid/provider/FontsContract$FontInfo;)Landroid/graphics/Typeface;
-HSPLandroid/provider/FontsContract;->fetchFonts(Landroid/content/Context;Landroid/os/CancellationSignal;Landroid/provider/FontRequest;)Landroid/provider/FontsContract$FontFamilyResult;
-HSPLandroid/provider/FontsContract;->getFontFromProvider(Landroid/content/Context;Landroid/provider/FontRequest;Ljava/lang/String;Landroid/os/CancellationSignal;)[Landroid/provider/FontsContract$FontInfo;
-HSPLandroid/provider/FontsContract;->getFontSync(Landroid/provider/FontRequest;)Landroid/graphics/Typeface;
-HSPLandroid/provider/FontsContract;->getProvider(Landroid/content/pm/PackageManager;Landroid/provider/FontRequest;)Landroid/content/pm/ProviderInfo;
-HSPLandroid/provider/FontsContract;->lambda$getFontSync$0(Landroid/provider/FontRequest;Ljava/lang/String;Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/locks/Lock;Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/locks/Condition;)V
-HSPLandroid/provider/FontsContract;->prepareFontData(Landroid/content/Context;[Landroid/provider/FontsContract$FontInfo;Landroid/os/CancellationSignal;)Ljava/util/Map;
-HSPLandroid/provider/FontsContract;->setApplicationContextForResources(Landroid/content/Context;)V
-HSPLandroid/provider/SearchIndexablesProvider;-><init>()V
-HSPLandroid/provider/SearchIndexablesProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V
-HSPLandroid/provider/SearchIndexablesProvider;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/provider/SearchIndexablesProvider;->queryDynamicRawData([Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/provider/SearchIndexablesProvider;->querySiteMapPairs()Landroid/database/Cursor;
-HSPLandroid/provider/SearchIndexablesProvider;->querySliceUriPairs()Landroid/database/Cursor;
-HSPLandroid/provider/Settings$Config;->checkCallingOrSelfPermission(Ljava/lang/String;)I
-HSPLandroid/provider/Settings$Config;->createCompositeName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/provider/Settings$Config;->createNamespaceUri(Ljava/lang/String;)Landroid/net/Uri;
-HSPLandroid/provider/Settings$Config;->createPrefix(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/provider/Settings$Config;->getContentResolver()Landroid/content/ContentResolver;
-HSPLandroid/provider/Settings$Config;->getStrings(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/util/List;)Ljava/util/Map;
-HSPLandroid/provider/Settings$Config;->getStrings(Ljava/lang/String;Ljava/util/List;)Ljava/util/Map;
-HSPLandroid/provider/Settings$Config;->registerContentObserver(Ljava/lang/String;ZLandroid/database/ContentObserver;)V
-HSPLandroid/provider/Settings$ContentProviderHolder;->-$$Nest$fgetmUri(Landroid/provider/Settings$ContentProviderHolder;)Landroid/net/Uri;
-HSPLandroid/provider/Settings$ContentProviderHolder;->getProvider(Landroid/content/ContentResolver;)Landroid/content/IContentProvider;
-HSPLandroid/provider/Settings$GenerationTracker;-><init>(Ljava/lang/String;Landroid/util/MemoryIntArray;IILjava/util/function/Consumer;)V
-HSPLandroid/provider/Settings$GenerationTracker;->destroy()V
-HSPLandroid/provider/Settings$GenerationTracker;->getCurrentGeneration()I
-HSPLandroid/provider/Settings$GenerationTracker;->isGenerationChanged()Z
-HSPLandroid/provider/Settings$GenerationTracker;->readCurrentGeneration()I
-HSPLandroid/provider/Settings$Global;->getFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)F
-HSPLandroid/provider/Settings$Global;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;)I
-HSPLandroid/provider/Settings$Global;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
-HSPLandroid/provider/Settings$Global;->getLong(Landroid/content/ContentResolver;Ljava/lang/String;J)J
-HSPLandroid/provider/Settings$Global;->getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/provider/Settings$Global;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;+]Landroid/provider/Settings$NameValueCache;Landroid/provider/Settings$NameValueCache;]Ljava/util/HashSet;Ljava/util/HashSet;
-HSPLandroid/provider/Settings$Global;->getUriFor(Ljava/lang/String;)Landroid/net/Uri;
-HSPLandroid/provider/Settings$Global;->putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z
-HSPLandroid/provider/Settings$Global;->putLong(Landroid/content/ContentResolver;Ljava/lang/String;J)Z
-HSPLandroid/provider/Settings$Global;->putString(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z
-HSPLandroid/provider/Settings$Global;->putStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZIZ)Z
-HSPLandroid/provider/Settings$NameValueCache$$ExternalSyntheticLambda0;-><init>(Landroid/provider/Settings$NameValueCache;)V
-HSPLandroid/provider/Settings$NameValueCache;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/content/IContentProvider;Landroid/content/ContentProviderProxy;]Landroid/provider/Settings$GenerationTracker;Landroid/provider/Settings$GenerationTracker;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/provider/Settings$ContentProviderHolder;Landroid/provider/Settings$ContentProviderHolder;]Landroid/content/ContentResolver;Landroid/app/ContextImpl$ApplicationContentResolver;]Landroid/net/Uri;Landroid/net/Uri$StringUri;
-HSPLandroid/provider/Settings$NameValueCache;->getStringsForPrefixStripPrefix(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/util/List;)Ljava/util/Map;+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Landroid/provider/Settings$GenerationTracker;Landroid/provider/Settings$GenerationTracker;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/provider/Settings$ContentProviderHolder;Landroid/provider/Settings$ContentProviderHolder;]Ljava/util/Set;Ljava/util/HashMap$EntrySet;]Ljava/lang/String;Ljava/lang/String;]Landroid/content/IContentProvider;Landroid/content/ContentProviderProxy;,Landroid/content/ContentProvider$Transport;]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Landroid/content/ContentResolver;Landroid/app/ContextImpl$ApplicationContentResolver;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;,Ljava/util/Arrays$ArrayItr;]Landroid/net/Uri;Landroid/net/Uri$StringUri;
-HSPLandroid/provider/Settings$NameValueCache;->isCallerExemptFromReadableRestriction()Z
-HSPLandroid/provider/Settings$NameValueCache;->putStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZIZ)Z
-HSPLandroid/provider/Settings$NameValueTable;->getUriFor(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;
-HSPLandroid/provider/Settings$Secure;->getFloatForUser(Landroid/content/ContentResolver;Ljava/lang/String;FI)F
-HSPLandroid/provider/Settings$Secure;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;)I
-HSPLandroid/provider/Settings$Secure;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
-HSPLandroid/provider/Settings$Secure;->getIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)I
-HSPLandroid/provider/Settings$Secure;->getIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;II)I
-HSPLandroid/provider/Settings$Secure;->getLong(Landroid/content/ContentResolver;Ljava/lang/String;J)J
-HSPLandroid/provider/Settings$Secure;->getLongForUser(Landroid/content/ContentResolver;Ljava/lang/String;JI)J
-HSPLandroid/provider/Settings$Secure;->getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;+]Landroid/content/ContentResolver;Landroid/app/ContextImpl$ApplicationContentResolver;
-HSPLandroid/provider/Settings$Secure;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;
-HSPLandroid/provider/Settings$Secure;->getUriFor(Ljava/lang/String;)Landroid/net/Uri;
-HSPLandroid/provider/Settings$Secure;->putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z
-HSPLandroid/provider/Settings$Secure;->putIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;II)Z
-HSPLandroid/provider/Settings$Secure;->putStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;I)Z
-HSPLandroid/provider/Settings$Secure;->putStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZIZ)Z
-HSPLandroid/provider/Settings$SettingNotFoundException;-><init>(Ljava/lang/String;)V
-HSPLandroid/provider/Settings$System;->getFloat(Landroid/content/ContentResolver;Ljava/lang/String;)F
-HSPLandroid/provider/Settings$System;->getFloatForUser(Landroid/content/ContentResolver;Ljava/lang/String;FI)F
-HSPLandroid/provider/Settings$System;->getFloatForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)F
-HSPLandroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;)I
-HSPLandroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
-HSPLandroid/provider/Settings$System;->getIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)I
-HSPLandroid/provider/Settings$System;->getIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;II)I
-HSPLandroid/provider/Settings$System;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;+]Landroid/provider/Settings$NameValueCache;Landroid/provider/Settings$NameValueCache;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/HashSet;Ljava/util/HashSet;
-HSPLandroid/provider/Settings$System;->getUriFor(Ljava/lang/String;)Landroid/net/Uri;
-HSPLandroid/provider/Settings$System;->putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z
-HSPLandroid/provider/Settings$System;->putIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;II)Z
-HSPLandroid/provider/Settings$System;->putStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;I)Z
-HSPLandroid/provider/Settings$System;->putStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;IZ)Z
-HSPLandroid/provider/Settings;->-$$Nest$smparseIntSetting(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/provider/Settings;->-$$Nest$smparseIntSettingWithDefault(Ljava/lang/String;I)I
-HSPLandroid/provider/Settings;->canDrawOverlays(Landroid/content/Context;)Z
-HSPLandroid/provider/Settings;->isCallingPackageAllowedToDrawOverlays(Landroid/content/Context;ILjava/lang/String;Z)Z
-HSPLandroid/provider/Settings;->isCallingPackageAllowedToPerformAppOpsProtectedOperation(Landroid/content/Context;ILjava/lang/String;Ljava/lang/String;ZI[Ljava/lang/String;Z)Z
-HSPLandroid/provider/Settings;->isInSystemServer()Z
-HSPLandroid/provider/Settings;->parseFloatSettingWithDefault(Ljava/lang/String;F)F
-HSPLandroid/provider/Settings;->parseIntSetting(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/provider/Settings;->parseIntSettingWithDefault(Ljava/lang/String;I)I
-HSPLandroid/provider/Settings;->parseLongSettingWithDefault(Ljava/lang/String;J)J
-HSPLandroid/provider/Telephony$Sms;->getDefaultSmsPackage(Landroid/content/Context;)Ljava/lang/String;
-HSPLandroid/renderscript/RenderScriptCacheDir;->setupDiskCache(Ljava/io/File;)V
-HSPLandroid/se/omapi/SeServiceManager;-><init>()V
-HSPLandroid/security/FeatureFlagsImpl;-><init>()V
-HSPLandroid/security/Flags;-><clinit>()V
-HSPLandroid/security/KeyChain$1;-><init>(Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/CountDownLatch;)V
-HSPLandroid/security/KeyChain$1;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-HSPLandroid/security/KeyChain$KeyChainConnection;-><init>(Landroid/content/Context;Landroid/content/ServiceConnection;Landroid/security/IKeyChainService;)V
-HSPLandroid/security/KeyChain$KeyChainConnection;->close()V
-HSPLandroid/security/KeyChain$KeyChainConnection;->getService()Landroid/security/IKeyChainService;
-HSPLandroid/security/KeyChain;->bindAsUser(Landroid/content/Context;Landroid/os/Handler;Landroid/os/UserHandle;)Landroid/security/KeyChain$KeyChainConnection;
-HSPLandroid/security/KeyChain;->bindAsUser(Landroid/content/Context;Landroid/os/UserHandle;)Landroid/security/KeyChain$KeyChainConnection;
-HSPLandroid/security/KeyChain;->ensureNotOnMainThread(Landroid/content/Context;)V
-HSPLandroid/security/KeyStore2$$ExternalSyntheticLambda3;->execute(Landroid/system/keystore2/IKeystoreService;)Ljava/lang/Object;
-HSPLandroid/security/KeyStore2$$ExternalSyntheticLambda4;->execute(Landroid/system/keystore2/IKeystoreService;)Ljava/lang/Object;
-HSPLandroid/security/KeyStore2;-><init>()V
-HSPLandroid/security/KeyStore2;->getInstance()Landroid/security/KeyStore2;
-HSPLandroid/security/KeyStore2;->getKeyEntry(Landroid/system/keystore2/KeyDescriptor;)Landroid/system/keystore2/KeyEntryResponse;
-HSPLandroid/security/KeyStore2;->getKeyStoreException(ILjava/lang/String;)Landroid/security/KeyStoreException;
-HSPLandroid/security/KeyStore2;->getService(Z)Landroid/system/keystore2/IKeystoreService;
-HSPLandroid/security/KeyStore2;->handleRemoteExceptionWithRetry(Landroid/security/KeyStore2$CheckedRemoteRequest;)Ljava/lang/Object;
-HSPLandroid/security/KeyStore;->getInstance()Landroid/security/KeyStore;
-HSPLandroid/security/KeyStoreException;-><init>(ILjava/lang/String;)V
-HSPLandroid/security/KeyStoreException;-><init>(ILjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/security/KeyStoreException;->getErrorCode()I
-HSPLandroid/security/KeyStoreException;->initializeRkpStatusForRegularErrors(I)I
-HSPLandroid/security/KeyStoreOperation$$ExternalSyntheticLambda0;->execute()Ljava/lang/Object;
-HSPLandroid/security/KeyStoreOperation$$ExternalSyntheticLambda1;->execute()Ljava/lang/Object;
-HSPLandroid/security/KeyStoreOperation$$ExternalSyntheticLambda2;->execute()Ljava/lang/Object;
-HSPLandroid/security/KeyStoreOperation$$ExternalSyntheticLambda3;->execute()Ljava/lang/Object;
-HSPLandroid/security/KeyStoreOperation;-><init>(Landroid/system/keystore2/IKeystoreOperation;Ljava/lang/Long;[Landroid/hardware/security/keymint/KeyParameter;)V
-HSPLandroid/security/KeyStoreOperation;->abort()V
-HSPLandroid/security/KeyStoreOperation;->finish([B[B)[B
-HSPLandroid/security/KeyStoreOperation;->getChallenge()Ljava/lang/Long;
-HSPLandroid/security/KeyStoreOperation;->getParameters()[Landroid/hardware/security/keymint/KeyParameter;
-HSPLandroid/security/KeyStoreOperation;->handleExceptions(Landroid/security/CheckedRemoteRequest;)Ljava/lang/Object;
-HSPLandroid/security/KeyStoreOperation;->update([B)[B
-HSPLandroid/security/KeyStoreSecurityLevel;-><init>(Landroid/system/keystore2/IKeystoreSecurityLevel;)V
-HSPLandroid/security/KeyStoreSecurityLevel;->createOperation(Landroid/system/keystore2/KeyDescriptor;Ljava/util/Collection;)Landroid/security/KeyStoreOperation;
-HSPLandroid/security/NetworkSecurityPolicy;->getInstance()Landroid/security/NetworkSecurityPolicy;
-HSPLandroid/security/NetworkSecurityPolicy;->isCleartextTrafficPermitted(Ljava/lang/String;)Z
-HSPLandroid/security/keymaster/ExportResult$1;->createFromParcel(Landroid/os/Parcel;)Landroid/security/keymaster/ExportResult;
-HSPLandroid/security/keymaster/ExportResult$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/security/keymaster/ExportResult;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/security/keymaster/KeyCharacteristics$1;->createFromParcel(Landroid/os/Parcel;)Landroid/security/keymaster/KeyCharacteristics;
-HSPLandroid/security/keymaster/KeyCharacteristics$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/security/keymaster/KeyCharacteristics;-><init>()V
-HSPLandroid/security/keymaster/KeyCharacteristics;->getEnum(I)Ljava/lang/Integer;
-HSPLandroid/security/keymaster/KeyCharacteristics;->getEnums(I)Ljava/util/List;
-HSPLandroid/security/keymaster/KeyCharacteristics;->getUnsignedInt(IJ)J
-HSPLandroid/security/keymaster/KeyCharacteristics;->shallowCopyFrom(Landroid/security/keymaster/KeyCharacteristics;)V
-HSPLandroid/security/keymaster/KeymasterArgument$1;->createFromParcel(Landroid/os/Parcel;)Landroid/security/keymaster/KeymasterArgument;
-HSPLandroid/security/keymaster/KeymasterArgument$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/security/keymaster/KeymasterArgument;-><init>(I)V
-HSPLandroid/security/keymaster/KeymasterArgument;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/security/keymaster/KeymasterArguments$1;->createFromParcel(Landroid/os/Parcel;)Landroid/security/keymaster/KeymasterArguments;
-HSPLandroid/security/keymaster/KeymasterArguments$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/security/keymaster/KeymasterArguments;-><init>()V
-HSPLandroid/security/keymaster/KeymasterArguments;->addBoolean(I)V
-HSPLandroid/security/keymaster/KeymasterArguments;->addBytes(I[B)V
-HSPLandroid/security/keymaster/KeymasterArguments;->addDateIfNotNull(ILjava/util/Date;)V
-HSPLandroid/security/keymaster/KeymasterArguments;->addEnum(II)V
-HSPLandroid/security/keymaster/KeymasterArguments;->addEnums(I[I)V
-HSPLandroid/security/keymaster/KeymasterArguments;->addLongTag(ILjava/math/BigInteger;)V
-HSPLandroid/security/keymaster/KeymasterArguments;->addUnsignedInt(IJ)V
-HSPLandroid/security/keymaster/KeymasterArguments;->addUnsignedLong(ILjava/math/BigInteger;)V
-HSPLandroid/security/keymaster/KeymasterArguments;->containsTag(I)Z
-HSPLandroid/security/keymaster/KeymasterArguments;->getArgumentByTag(I)Landroid/security/keymaster/KeymasterArgument;
-HSPLandroid/security/keymaster/KeymasterArguments;->getBytes(I[B)[B
-HSPLandroid/security/keymaster/KeymasterArguments;->getEnum(II)I
-HSPLandroid/security/keymaster/KeymasterArguments;->getEnums(I)Ljava/util/List;
-HSPLandroid/security/keymaster/KeymasterArguments;->getUnsignedInt(IJ)J
-HSPLandroid/security/keymaster/KeymasterArguments;->toUint64(J)Ljava/math/BigInteger;
-HSPLandroid/security/keymaster/KeymasterArguments;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/security/keymaster/KeymasterBlob;-><init>([B)V
-HSPLandroid/security/keymaster/KeymasterBlob;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/security/keymaster/KeymasterBlobArgument;-><init>(I[B)V
-HSPLandroid/security/keymaster/KeymasterBlobArgument;->writeValue(Landroid/os/Parcel;)V
-HSPLandroid/security/keymaster/KeymasterBooleanArgument;-><init>(I)V
-HSPLandroid/security/keymaster/KeymasterBooleanArgument;->writeValue(Landroid/os/Parcel;)V
-HSPLandroid/security/keymaster/KeymasterDefs;->getErrorMessage(I)Ljava/lang/String;
-HSPLandroid/security/keymaster/KeymasterDefs;->getTagType(I)I
-HSPLandroid/security/keymaster/KeymasterIntArgument;-><init>(II)V
-HSPLandroid/security/keymaster/KeymasterIntArgument;->writeValue(Landroid/os/Parcel;)V
-HSPLandroid/security/keymaster/KeymasterLongArgument;-><init>(IJ)V
-HSPLandroid/security/keymaster/KeymasterLongArgument;->writeValue(Landroid/os/Parcel;)V
-HSPLandroid/security/keymaster/OperationResult$1;->createFromParcel(Landroid/os/Parcel;)Landroid/security/keymaster/OperationResult;
-HSPLandroid/security/keymaster/OperationResult$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/security/keymaster/OperationResult;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/security/keystore/AndroidKeyStoreProvider;-><init>(Ljava/lang/String;)V
-HSPLandroid/security/keystore/AndroidKeyStoreProvider;->getKeyStoreForUid(I)Ljava/security/KeyStore;
-HSPLandroid/security/keystore/ArrayUtils;->cloneIfNotEmpty([B)[B
-HSPLandroid/security/keystore/ArrayUtils;->cloneIfNotEmpty([Ljava/lang/String;)[Ljava/lang/String;
-HSPLandroid/security/keystore/ArrayUtils;->concat([BII[BII)[B
-HSPLandroid/security/keystore/ArrayUtils;->concat([B[B)[B
-HSPLandroid/security/keystore/ArrayUtils;->nullToEmpty([Ljava/lang/String;)[Ljava/lang/String;
-HSPLandroid/security/keystore/ArrayUtils;->subarray([BII)[B
-HSPLandroid/security/keystore/DelegatingX509Certificate;-><init>(Ljava/security/cert/X509Certificate;)V
-HSPLandroid/security/keystore/KeyGenParameterSpec$Builder;-><init>(Ljava/lang/String;I)V
-HSPLandroid/security/keystore/KeyGenParameterSpec$Builder;->build()Landroid/security/keystore/KeyGenParameterSpec;
-HSPLandroid/security/keystore/KeyGenParameterSpec$Builder;->setBlockModes([Ljava/lang/String;)Landroid/security/keystore/KeyGenParameterSpec$Builder;
-HSPLandroid/security/keystore/KeyGenParameterSpec$Builder;->setEncryptionPaddings([Ljava/lang/String;)Landroid/security/keystore/KeyGenParameterSpec$Builder;
-HSPLandroid/security/keystore/KeyGenParameterSpec$Builder;->setKeySize(I)Landroid/security/keystore/KeyGenParameterSpec$Builder;
-HSPLandroid/security/keystore/KeyGenParameterSpec;->getBlockModes()[Ljava/lang/String;
-HSPLandroid/security/keystore/KeyGenParameterSpec;->getEncryptionPaddings()[Ljava/lang/String;
-HSPLandroid/security/keystore/KeyGenParameterSpec;->getKeySize()I
-HSPLandroid/security/keystore/KeyGenParameterSpec;->getKeyValidityForConsumptionEnd()Ljava/util/Date;
-HSPLandroid/security/keystore/KeyGenParameterSpec;->getKeyValidityForOriginationEnd()Ljava/util/Date;
-HSPLandroid/security/keystore/KeyGenParameterSpec;->getKeyValidityStart()Ljava/util/Date;
-HSPLandroid/security/keystore/KeyGenParameterSpec;->getKeystoreAlias()Ljava/lang/String;
-HSPLandroid/security/keystore/KeyGenParameterSpec;->getPurposes()I
-HSPLandroid/security/keystore/KeyGenParameterSpec;->getSignaturePaddings()[Ljava/lang/String;
-HSPLandroid/security/keystore/KeyGenParameterSpec;->getUid()I
-HSPLandroid/security/keystore/KeyGenParameterSpec;->isCriticalToDeviceEncryption()Z
-HSPLandroid/security/keystore/KeyGenParameterSpec;->isDigestsSpecified()Z
-HSPLandroid/security/keystore/KeyGenParameterSpec;->isStrongBoxBacked()Z
-HSPLandroid/security/keystore/KeyGenParameterSpec;->isUnlockedDeviceRequired()Z
-HSPLandroid/security/keystore/KeyGenParameterSpec;->isUserAuthenticationRequired()Z
-HSPLandroid/security/keystore/KeyGenParameterSpec;->isUserConfirmationRequired()Z
-HSPLandroid/security/keystore/KeyGenParameterSpec;->isUserPresenceRequired()Z
-HSPLandroid/security/keystore/KeyProperties$BlockMode;->allToKeymaster([Ljava/lang/String;)[I
-HSPLandroid/security/keystore/KeyProperties$Digest;->toKeymaster(Ljava/lang/String;)I
-HSPLandroid/security/keystore/KeyProperties$EncryptionPadding;->allToKeymaster([Ljava/lang/String;)[I
-HSPLandroid/security/keystore/KeyProperties$KeyAlgorithm;->fromKeymasterAsymmetricKeyAlgorithm(I)Ljava/lang/String;
-HSPLandroid/security/keystore/KeyProperties$KeyAlgorithm;->fromKeymasterSecretKeyAlgorithm(II)Ljava/lang/String;
-HSPLandroid/security/keystore/KeyProperties$Purpose;->allToKeymaster(I)[I
-HSPLandroid/security/keystore/KeyProperties$Purpose;->toKeymaster(I)I
-HSPLandroid/security/keystore/KeystoreResponse$1;->createFromParcel(Landroid/os/Parcel;)Landroid/security/keystore/KeystoreResponse;
-HSPLandroid/security/keystore/KeystoreResponse$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/security/keystore/KeystoreResponse;->getErrorCode()I
-HSPLandroid/security/keystore/Utils;->cloneIfNotNull(Ljava/util/Date;)Ljava/util/Date;
-HSPLandroid/security/keystore/Utils;->cloneIfNotNull([B)[B
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream;-><init>(Landroid/security/KeyStoreOperation;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream;-><init>(Landroid/security/KeyStoreOperation;Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream-IA;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream;->finish([B[B)[B
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer;-><init>(Landroid/security/keystore2/KeyStoreCryptoOperationStreamer;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer;-><init>(Landroid/security/keystore2/KeyStoreCryptoOperationStreamer;Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer-IA;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer;->doFinal([BII[B)[B
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM$NoPadding;-><init>()V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM$NoPadding;->finalize()V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM;-><init>(I)V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM;->addAlgorithmSpecificParametersToBegin(Ljava/util/List;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM;->createAdditionalAuthenticationDataStreamer(Landroid/security/KeyStoreOperation;)Landroid/security/keystore2/KeyStoreCryptoOperationStreamer;
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM;->createMainDataStreamer(Landroid/security/KeyStoreOperation;)Landroid/security/keystore2/KeyStoreCryptoOperationStreamer;
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM;->initAlgorithmSpecificParameters()V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM;->initAlgorithmSpecificParameters(Ljava/security/spec/AlgorithmParameterSpec;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM;->resetAll()V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM;->resetWhilePreservingInitState()V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi;-><init>(II)V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi;->addAlgorithmSpecificParametersToBegin(Ljava/util/List;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi;->engineGetIV()[B
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi;->initKey(ILjava/security/Key;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi;->loadAlgorithmSpecificParametersFromBeginResult([Landroid/hardware/security/keymint/KeyParameter;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi;->resetAll()V
-HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi;->setIv([B)V
-HSPLandroid/security/keystore2/AndroidKeyStoreBCWorkaroundProvider;-><init>()V
-HSPLandroid/security/keystore2/AndroidKeyStoreBCWorkaroundProvider;->putAsymmetricCipherImpl(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreBCWorkaroundProvider;->putMacImpl(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreBCWorkaroundProvider;->putSignatureImpl(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreBCWorkaroundProvider;->putSymmetricCipherImpl(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreCipherSpiBase;-><init>()V
-HSPLandroid/security/keystore2/AndroidKeyStoreCipherSpiBase;->abortOperation()V
-HSPLandroid/security/keystore2/AndroidKeyStoreCipherSpiBase;->engineDoFinal([BII)[B
-HSPLandroid/security/keystore2/AndroidKeyStoreCipherSpiBase;->engineDoFinal([BII[BI)I
-HSPLandroid/security/keystore2/AndroidKeyStoreCipherSpiBase;->engineInit(ILjava/security/Key;Ljava/security/SecureRandom;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreCipherSpiBase;->engineInit(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreCipherSpiBase;->finalize()V
-HSPLandroid/security/keystore2/AndroidKeyStoreCipherSpiBase;->flushAAD()V
-HSPLandroid/security/keystore2/AndroidKeyStoreCipherSpiBase;->init(ILjava/security/Key;Ljava/security/SecureRandom;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreCipherSpiBase;->isEncrypting()Z
-HSPLandroid/security/keystore2/AndroidKeyStoreCipherSpiBase;->resetAll()V
-HSPLandroid/security/keystore2/AndroidKeyStoreCipherSpiBase;->resetWhilePreservingInitState()V
-HSPLandroid/security/keystore2/AndroidKeyStoreCipherSpiBase;->setKey(Landroid/security/keystore2/AndroidKeyStoreKey;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreKey;-><init>(Landroid/system/keystore2/KeyDescriptor;J[Landroid/system/keystore2/Authorization;Ljava/lang/String;Landroid/security/KeyStoreSecurityLevel;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreKey;->getAlgorithm()Ljava/lang/String;
-HSPLandroid/security/keystore2/AndroidKeyStoreKey;->getFormat()Ljava/lang/String;
-HSPLandroid/security/keystore2/AndroidKeyStoreKey;->getKeyIdDescriptor()Landroid/system/keystore2/KeyDescriptor;
-HSPLandroid/security/keystore2/AndroidKeyStoreKey;->getSecurityLevel()Landroid/security/KeyStoreSecurityLevel;
-HSPLandroid/security/keystore2/AndroidKeyStoreProvider;-><init>()V
-HSPLandroid/security/keystore2/AndroidKeyStoreProvider;->install()V
-HSPLandroid/security/keystore2/AndroidKeyStoreProvider;->loadAndroidKeyStoreKeyFromKeystore(Landroid/security/KeyStore2;Landroid/system/keystore2/KeyDescriptor;)Landroid/security/keystore2/AndroidKeyStoreKey;
-HSPLandroid/security/keystore2/AndroidKeyStoreProvider;->loadAndroidKeyStoreKeyFromKeystore(Landroid/security/KeyStore2;Ljava/lang/String;I)Landroid/security/keystore2/AndroidKeyStoreKey;
-HSPLandroid/security/keystore2/AndroidKeyStoreProvider;->makeAndroidKeyStoreSecretKeyFromKeyEntryResponse(Landroid/system/keystore2/KeyDescriptor;Landroid/system/keystore2/KeyEntryResponse;II)Landroid/security/keystore2/AndroidKeyStoreSecretKey;
-HSPLandroid/security/keystore2/AndroidKeyStoreProvider;->putKeyFactoryImpl(Ljava/lang/String;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreProvider;->putSecretKeyFactoryImpl(Ljava/lang/String;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreSecretKey;-><init>(Landroid/system/keystore2/KeyDescriptor;Landroid/system/keystore2/KeyMetadata;Ljava/lang/String;Landroid/security/KeyStoreSecurityLevel;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreSpi;-><init>()V
-HSPLandroid/security/keystore2/AndroidKeyStoreSpi;->engineContainsAlias(Ljava/lang/String;)Z
-HSPLandroid/security/keystore2/AndroidKeyStoreSpi;->engineGetKey(Ljava/lang/String;[C)Ljava/security/Key;
-HSPLandroid/security/keystore2/AndroidKeyStoreSpi;->engineIsKeyEntry(Ljava/lang/String;)Z
-HSPLandroid/security/keystore2/AndroidKeyStoreSpi;->engineLoad(Ljava/security/KeyStore$LoadStoreParameter;)V
-HSPLandroid/security/keystore2/AndroidKeyStoreSpi;->getKeyMetadata(Ljava/lang/String;)Landroid/system/keystore2/KeyEntryResponse;
-HSPLandroid/security/keystore2/AndroidKeyStoreSpi;->getTargetDomain()I
-HSPLandroid/security/keystore2/AndroidKeyStoreSpi;->isKeyEntry(Ljava/lang/String;)Z
-HSPLandroid/security/keystore2/AndroidKeyStoreSpi;->makeKeyDescriptor(Ljava/lang/String;)Landroid/system/keystore2/KeyDescriptor;
-HSPLandroid/security/keystore2/KeyStore2ParameterUtils;->makeBytes(I[B)Landroid/hardware/security/keymint/KeyParameter;
-HSPLandroid/security/keystore2/KeyStore2ParameterUtils;->makeEnum(II)Landroid/hardware/security/keymint/KeyParameter;
-HSPLandroid/security/keystore2/KeyStore2ParameterUtils;->makeInt(II)Landroid/hardware/security/keymint/KeyParameter;
-HSPLandroid/security/keystore2/KeyStoreCryptoOperationChunkedStreamer$MainDataStream;-><init>(Landroid/security/KeyStoreOperation;)V
-HSPLandroid/security/keystore2/KeyStoreCryptoOperationChunkedStreamer$MainDataStream;->finish([B[B)[B
-HSPLandroid/security/keystore2/KeyStoreCryptoOperationChunkedStreamer$MainDataStream;->update([B)[B
-HSPLandroid/security/keystore2/KeyStoreCryptoOperationChunkedStreamer;-><init>(Landroid/security/keystore2/KeyStoreCryptoOperationChunkedStreamer$Stream;I)V
-HSPLandroid/security/keystore2/KeyStoreCryptoOperationChunkedStreamer;-><init>(Landroid/security/keystore2/KeyStoreCryptoOperationChunkedStreamer$Stream;II)V
-HSPLandroid/security/keystore2/KeyStoreCryptoOperationChunkedStreamer;->doFinal([BII[B)[B
-HSPLandroid/security/keystore2/KeyStoreCryptoOperationChunkedStreamer;->update([BII)[B
-HSPLandroid/security/keystore2/KeyStoreCryptoOperationUtils;->abortOperation(Landroid/security/KeyStoreOperation;)V
-HSPLandroid/security/keystore2/KeyStoreCryptoOperationUtils;->getOrMakeOperationChallenge(Landroid/security/KeyStoreOperation;Landroid/security/keystore2/AndroidKeyStoreKey;)J
-HSPLandroid/security/keystore2/KeyStoreCryptoOperationUtils;->getRandomBytesToMixIntoKeystoreRng(Ljava/security/SecureRandom;I)[B
-HSPLandroid/security/net/config/ApplicationConfig;-><init>(Landroid/security/net/config/ConfigSource;)V
-HSPLandroid/security/net/config/ApplicationConfig;->ensureInitialized()V
-HSPLandroid/security/net/config/ApplicationConfig;->getConfigForHostname(Ljava/lang/String;)Landroid/security/net/config/NetworkSecurityConfig;
-HSPLandroid/security/net/config/ApplicationConfig;->getDefaultInstance()Landroid/security/net/config/ApplicationConfig;
-HSPLandroid/security/net/config/ApplicationConfig;->getTrustManager()Ljavax/net/ssl/X509TrustManager;
-HSPLandroid/security/net/config/ApplicationConfig;->hasPerDomainConfigs()Z
-HSPLandroid/security/net/config/ApplicationConfig;->isCleartextTrafficPermitted()Z
-HSPLandroid/security/net/config/ApplicationConfig;->isCleartextTrafficPermitted(Ljava/lang/String;)Z
-HSPLandroid/security/net/config/ApplicationConfig;->setDefaultInstance(Landroid/security/net/config/ApplicationConfig;)V
-HSPLandroid/security/net/config/CertificatesEntryRef;-><init>(Landroid/security/net/config/CertificateSource;Z)V
-HSPLandroid/security/net/config/CertificatesEntryRef;->findAllCertificatesByIssuerAndSignature(Ljava/security/cert/X509Certificate;)Ljava/util/Set;
-HSPLandroid/security/net/config/CertificatesEntryRef;->findBySubjectAndPublicKey(Ljava/security/cert/X509Certificate;)Landroid/security/net/config/TrustAnchor;
-HSPLandroid/security/net/config/ConfigNetworkSecurityPolicy;-><init>(Landroid/security/net/config/ApplicationConfig;)V
-HSPLandroid/security/net/config/ConfigNetworkSecurityPolicy;->isCertificateTransparencyVerificationRequired(Ljava/lang/String;)Z
-HSPLandroid/security/net/config/ConfigNetworkSecurityPolicy;->isCleartextTrafficPermitted(Ljava/lang/String;)Z
-HSPLandroid/security/net/config/DirectoryCertificateSource$1;-><init>(Landroid/security/net/config/DirectoryCertificateSource;Ljava/security/cert/X509Certificate;)V
-HSPLandroid/security/net/config/DirectoryCertificateSource$3;-><init>(Landroid/security/net/config/DirectoryCertificateSource;Ljava/security/cert/X509Certificate;)V
-HSPLandroid/security/net/config/DirectoryCertificateSource$3;->match(Ljava/security/cert/X509Certificate;)Z
-HSPLandroid/security/net/config/DirectoryCertificateSource;-><init>(Ljava/io/File;)V
-HSPLandroid/security/net/config/DirectoryCertificateSource;->findAllByIssuerAndSignature(Ljava/security/cert/X509Certificate;)Ljava/util/Set;
-HSPLandroid/security/net/config/DirectoryCertificateSource;->findBySubjectAndPublicKey(Ljava/security/cert/X509Certificate;)Ljava/security/cert/X509Certificate;
-HSPLandroid/security/net/config/DirectoryCertificateSource;->findCert(Ljavax/security/auth/x500/X500Principal;Landroid/security/net/config/DirectoryCertificateSource$CertSelector;)Ljava/security/cert/X509Certificate;
-HSPLandroid/security/net/config/DirectoryCertificateSource;->findCerts(Ljavax/security/auth/x500/X500Principal;Landroid/security/net/config/DirectoryCertificateSource$CertSelector;)Ljava/util/Set;
-HSPLandroid/security/net/config/DirectoryCertificateSource;->getHash(Ljavax/security/auth/x500/X500Principal;)Ljava/lang/String;
-HSPLandroid/security/net/config/DirectoryCertificateSource;->hashName(Ljavax/security/auth/x500/X500Principal;)I
-HSPLandroid/security/net/config/DirectoryCertificateSource;->intToHexString(II)Ljava/lang/String;
-HSPLandroid/security/net/config/DirectoryCertificateSource;->readCertificate(Ljava/lang/String;)Ljava/security/cert/X509Certificate;
-HSPLandroid/security/net/config/Domain;->hashCode()I
-HSPLandroid/security/net/config/KeyStoreCertificateSource;-><init>(Ljava/security/KeyStore;)V
-HSPLandroid/security/net/config/KeyStoreCertificateSource;->ensureInitialized()V
-HSPLandroid/security/net/config/KeyStoreCertificateSource;->findAllByIssuerAndSignature(Ljava/security/cert/X509Certificate;)Ljava/util/Set;
-HSPLandroid/security/net/config/KeyStoreCertificateSource;->findBySubjectAndPublicKey(Ljava/security/cert/X509Certificate;)Ljava/security/cert/X509Certificate;
-HSPLandroid/security/net/config/KeyStoreConfigSource;-><init>(Ljava/security/KeyStore;)V
-HSPLandroid/security/net/config/KeyStoreConfigSource;->getDefaultConfig()Landroid/security/net/config/NetworkSecurityConfig;
-HSPLandroid/security/net/config/KeyStoreConfigSource;->getPerDomainConfigs()Ljava/util/Set;
-HSPLandroid/security/net/config/ManifestConfigSource$DefaultConfigSource;-><init>(ZLandroid/content/pm/ApplicationInfo;)V
-HSPLandroid/security/net/config/ManifestConfigSource$DefaultConfigSource;->getDefaultConfig()Landroid/security/net/config/NetworkSecurityConfig;
-HSPLandroid/security/net/config/ManifestConfigSource$DefaultConfigSource;->getPerDomainConfigs()Ljava/util/Set;
-HSPLandroid/security/net/config/ManifestConfigSource;-><init>(Landroid/content/Context;)V
-HSPLandroid/security/net/config/ManifestConfigSource;->getConfigSource()Landroid/security/net/config/ConfigSource;
-HSPLandroid/security/net/config/ManifestConfigSource;->getDefaultConfig()Landroid/security/net/config/NetworkSecurityConfig;
-HSPLandroid/security/net/config/ManifestConfigSource;->getPerDomainConfigs()Ljava/util/Set;
-HSPLandroid/security/net/config/NetworkSecurityConfig$1;-><init>(Landroid/security/net/config/NetworkSecurityConfig;)V
-HSPLandroid/security/net/config/NetworkSecurityConfig$1;->compare(Landroid/security/net/config/CertificatesEntryRef;Landroid/security/net/config/CertificatesEntryRef;)I
-HSPLandroid/security/net/config/NetworkSecurityConfig$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;-><init>()V
-HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->addCertificatesEntryRef(Landroid/security/net/config/CertificatesEntryRef;)Landroid/security/net/config/NetworkSecurityConfig$Builder;
-HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->addCertificatesEntryRefs(Ljava/util/Collection;)Landroid/security/net/config/NetworkSecurityConfig$Builder;
-HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->build()Landroid/security/net/config/NetworkSecurityConfig;
-HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->getEffectiveCertificatesEntryRefs()Ljava/util/List;
-HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->getEffectiveCleartextTrafficPermitted()Z
-HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->getEffectiveHstsEnforced()Z
-HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->getEffectivePinSet()Landroid/security/net/config/PinSet;
-HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->getParent()Landroid/security/net/config/NetworkSecurityConfig$Builder;
-HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->setCleartextTrafficPermitted(Z)Landroid/security/net/config/NetworkSecurityConfig$Builder;
-HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->setHstsEnforced(Z)Landroid/security/net/config/NetworkSecurityConfig$Builder;
-HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->setParent(Landroid/security/net/config/NetworkSecurityConfig$Builder;)Landroid/security/net/config/NetworkSecurityConfig$Builder;
-HSPLandroid/security/net/config/NetworkSecurityConfig;-><init>(ZZZLandroid/security/net/config/PinSet;Ljava/util/List;)V
-HSPLandroid/security/net/config/NetworkSecurityConfig;->findAllCertificatesByIssuerAndSignature(Ljava/security/cert/X509Certificate;)Ljava/util/Set;
-HSPLandroid/security/net/config/NetworkSecurityConfig;->findTrustAnchorBySubjectAndPublicKey(Ljava/security/cert/X509Certificate;)Landroid/security/net/config/TrustAnchor;
-HSPLandroid/security/net/config/NetworkSecurityConfig;->getDefaultBuilder(Landroid/content/pm/ApplicationInfo;)Landroid/security/net/config/NetworkSecurityConfig$Builder;
-HSPLandroid/security/net/config/NetworkSecurityConfig;->getPins()Landroid/security/net/config/PinSet;
-HSPLandroid/security/net/config/NetworkSecurityConfig;->getTrustManager()Landroid/security/net/config/NetworkSecurityTrustManager;
-HSPLandroid/security/net/config/NetworkSecurityConfig;->isCleartextTrafficPermitted()Z
-HSPLandroid/security/net/config/NetworkSecurityConfigProvider;-><init>()V
-HSPLandroid/security/net/config/NetworkSecurityConfigProvider;->handleNewApplication(Landroid/content/Context;)V
-HSPLandroid/security/net/config/NetworkSecurityConfigProvider;->install(Landroid/content/Context;)V
-HSPLandroid/security/net/config/NetworkSecurityTrustManager;-><init>(Landroid/security/net/config/NetworkSecurityConfig;)V
-HSPLandroid/security/net/config/NetworkSecurityTrustManager;->checkPins(Ljava/util/List;)V
-HSPLandroid/security/net/config/NetworkSecurityTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
-HSPLandroid/security/net/config/NetworkSecurityTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/net/Socket;)V
-HSPLandroid/security/net/config/RootTrustManager;-><init>(Landroid/security/net/config/ApplicationConfig;)V
-HSPLandroid/security/net/config/RootTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
-HSPLandroid/security/net/config/RootTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/net/Socket;)V
-HSPLandroid/security/net/config/RootTrustManagerFactorySpi;-><init>()V
-HSPLandroid/security/net/config/RootTrustManagerFactorySpi;->engineGetTrustManagers()[Ljavax/net/ssl/TrustManager;
-HSPLandroid/security/net/config/RootTrustManagerFactorySpi;->engineInit(Ljava/security/KeyStore;)V
-HSPLandroid/security/net/config/SystemCertificateSource$NoPreloadHolder;->-$$Nest$sfgetINSTANCE()Landroid/security/net/config/SystemCertificateSource;
-HSPLandroid/security/net/config/SystemCertificateSource$NoPreloadHolder;-><clinit>()V
-HSPLandroid/security/net/config/SystemCertificateSource;-><init>()V
-HSPLandroid/security/net/config/SystemCertificateSource;-><init>(Landroid/security/net/config/SystemCertificateSource-IA;)V
-HSPLandroid/security/net/config/SystemCertificateSource;->findAllByIssuerAndSignature(Ljava/security/cert/X509Certificate;)Ljava/util/Set;
-HSPLandroid/security/net/config/SystemCertificateSource;->findBySubjectAndPublicKey(Ljava/security/cert/X509Certificate;)Ljava/security/cert/X509Certificate;
-HSPLandroid/security/net/config/SystemCertificateSource;->getDirectory()Ljava/io/File;
-HSPLandroid/security/net/config/SystemCertificateSource;->getInstance()Landroid/security/net/config/SystemCertificateSource;
-HSPLandroid/security/net/config/SystemCertificateSource;->isCertMarkedAsRemoved(Ljava/lang/String;)Z
-HSPLandroid/security/net/config/TrustedCertificateStoreAdapter;-><init>(Landroid/security/net/config/NetworkSecurityConfig;)V
-HSPLandroid/security/net/config/TrustedCertificateStoreAdapter;->findAllIssuers(Ljava/security/cert/X509Certificate;)Ljava/util/Set;
-HSPLandroid/security/net/config/TrustedCertificateStoreAdapter;->getTrustAnchor(Ljava/security/cert/X509Certificate;)Ljava/security/cert/X509Certificate;
-HSPLandroid/security/net/config/UserCertificateSource$NoPreloadHolder;-><clinit>()V
-HSPLandroid/security/net/config/UserCertificateSource;->findAllByIssuerAndSignature(Ljava/security/cert/X509Certificate;)Ljava/util/Set;
-HSPLandroid/security/net/config/UserCertificateSource;->findBySubjectAndPublicKey(Ljava/security/cert/X509Certificate;)Ljava/security/cert/X509Certificate;
-HSPLandroid/security/net/config/XmlConfigSource;-><init>(Landroid/content/Context;ILandroid/content/pm/ApplicationInfo;)V
-HSPLandroid/security/net/config/XmlConfigSource;->addDebugAnchorsIfNeeded(Landroid/security/net/config/NetworkSecurityConfig$Builder;Landroid/security/net/config/NetworkSecurityConfig$Builder;)V
-HSPLandroid/security/net/config/XmlConfigSource;->ensureInitialized()V
-HSPLandroid/security/net/config/XmlConfigSource;->getDefaultConfig()Landroid/security/net/config/NetworkSecurityConfig;
-HSPLandroid/security/net/config/XmlConfigSource;->getPerDomainConfigs()Ljava/util/Set;
-HSPLandroid/security/net/config/XmlConfigSource;->parseCertificatesEntry(Landroid/content/res/XmlResourceParser;Z)Landroid/security/net/config/CertificatesEntryRef;
-HSPLandroid/security/net/config/XmlConfigSource;->parseConfigEntry(Landroid/content/res/XmlResourceParser;Ljava/util/Set;Landroid/security/net/config/NetworkSecurityConfig$Builder;I)Ljava/util/List;
-HSPLandroid/security/net/config/XmlConfigSource;->parseDomain(Landroid/content/res/XmlResourceParser;Ljava/util/Set;)Landroid/security/net/config/Domain;
-HSPLandroid/security/net/config/XmlConfigSource;->parseNetworkSecurityConfig(Landroid/content/res/XmlResourceParser;)V
-HSPLandroid/security/net/config/XmlConfigSource;->parseTrustAnchors(Landroid/content/res/XmlResourceParser;Z)Ljava/util/Collection;
-HSPLandroid/server/FeatureFlagsImpl;->telemetryApisService()Z
-HSPLandroid/service/appprediction/IPredictionService$Stub;-><init>()V
-HSPLandroid/service/dreams/IDreamManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/dreams/IDreamManager;
-HSPLandroid/service/media/IMediaBrowserService$Stub;-><init>()V
-HSPLandroid/service/media/IMediaBrowserService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/service/media/IMediaBrowserServiceCallbacks$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/service/media/IMediaBrowserServiceCallbacks$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/service/media/IMediaBrowserServiceCallbacks$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/service/media/IMediaBrowserServiceCallbacks$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/media/IMediaBrowserServiceCallbacks;
-HSPLandroid/service/media/MediaBrowserService$ServiceBinder;->connect(Ljava/lang/String;Landroid/os/Bundle;Landroid/service/media/IMediaBrowserServiceCallbacks;)V
-HSPLandroid/service/media/MediaBrowserService;->-$$Nest$fgetmHandler(Landroid/service/media/MediaBrowserService;)Landroid/os/Handler;
-HSPLandroid/service/media/MediaBrowserService;-><init>()V
-HSPLandroid/service/media/MediaBrowserService;->onBind(Landroid/content/Intent;)Landroid/os/IBinder;
-HSPLandroid/service/media/MediaBrowserService;->onCreate()V
-HSPLandroid/service/media/MediaBrowserService;->setSessionToken(Landroid/media/session/MediaSession$Token;)V
-HSPLandroid/service/notification/Condition$1;->createFromParcel(Landroid/os/Parcel;)Landroid/service/notification/Condition;
-HSPLandroid/service/notification/Condition$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/service/notification/Condition;-><init>(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;III)V
-HSPLandroid/service/notification/Condition;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/service/notification/Condition;->equals(Ljava/lang/Object;)Z
-HSPLandroid/service/notification/Condition;->isValidState(I)Z
-HSPLandroid/service/notification/ConditionProviderService$H;-><init>(Landroid/service/notification/ConditionProviderService;)V
-HSPLandroid/service/notification/ConditionProviderService$H;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/service/notification/ConditionProviderService$Provider;-><init>(Landroid/service/notification/ConditionProviderService;)V
-HSPLandroid/service/notification/ConditionProviderService$Provider;->onConnected()V
-HSPLandroid/service/notification/ConditionProviderService;-><init>()V
-HSPLandroid/service/notification/ConditionProviderService;->getNotificationInterface()Landroid/app/INotificationManager;
-HSPLandroid/service/notification/ConditionProviderService;->onBind(Landroid/content/Intent;)Landroid/os/IBinder;
-HSPLandroid/service/notification/IConditionProvider$Stub;-><init>()V
-HSPLandroid/service/notification/IConditionProvider$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/service/notification/INotificationListener$Stub;-><init>()V
-HSPLandroid/service/notification/INotificationListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/service/notification/INotificationListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/service/notification/IStatusBarNotificationHolder$Stub$Proxy;->get()Landroid/service/notification/StatusBarNotification;
-HSPLandroid/service/notification/NotificationListenerService$MyHandler;-><init>(Landroid/service/notification/NotificationListenerService;Landroid/os/Looper;)V
-HSPLandroid/service/notification/NotificationListenerService$MyHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;-><init>(Landroid/service/notification/NotificationListenerService;)V
-HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onInterruptionFilterChanged(I)V
-HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onListenerConnected(Landroid/service/notification/NotificationRankingUpdate;)V
-HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onNotificationChannelGroupModification(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannelGroup;I)V
-HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onNotificationChannelModification(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannel;I)V
-HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onNotificationPosted(Landroid/service/notification/IStatusBarNotificationHolder;Landroid/service/notification/NotificationRankingUpdate;)V+]Landroid/os/Handler;Landroid/service/notification/NotificationListenerService$MyHandler;]Landroid/service/notification/IStatusBarNotificationHolder;Landroid/service/notification/IStatusBarNotificationHolder$Stub$Proxy;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/os/Message;Landroid/os/Message;
-HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onNotificationRankingUpdate(Landroid/service/notification/NotificationRankingUpdate;)V
-HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onNotificationRemoved(Landroid/service/notification/IStatusBarNotificationHolder;Landroid/service/notification/NotificationRankingUpdate;Landroid/service/notification/NotificationStats;I)V
-HSPLandroid/service/notification/NotificationListenerService$Ranking;-><init>()V
-HSPLandroid/service/notification/NotificationListenerService$Ranking;-><init>(Landroid/os/Parcel;)V+]Ljava/lang/Object;Landroid/service/notification/NotificationListenerService$Ranking;]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/service/notification/NotificationListenerService$Ranking;->getChannel()Landroid/app/NotificationChannel;
-HSPLandroid/service/notification/NotificationListenerService$Ranking;->getKey()Ljava/lang/String;
-HSPLandroid/service/notification/NotificationListenerService$Ranking;->populate(Landroid/service/notification/NotificationListenerService$Ranking;)V+]Landroid/service/notification/NotificationListenerService$Ranking;Landroid/service/notification/NotificationListenerService$Ranking;
-HSPLandroid/service/notification/NotificationListenerService$Ranking;->populate(Ljava/lang/String;IZIIILjava/lang/CharSequence;Ljava/lang/String;Landroid/app/NotificationChannel;Ljava/util/ArrayList;Ljava/util/ArrayList;ZIZJZLjava/util/ArrayList;Ljava/util/ArrayList;ZZZLandroid/content/pm/ShortcutInfo;IZIZ)V
-HSPLandroid/service/notification/NotificationListenerService$RankingMap$1;->createFromParcel(Landroid/os/Parcel;)Landroid/service/notification/NotificationListenerService$RankingMap;
-HSPLandroid/service/notification/NotificationListenerService$RankingMap$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/service/notification/NotificationListenerService$RankingMap;-><init>(Landroid/os/Parcel;)V+]Landroid/service/notification/NotificationListenerService$Ranking;Landroid/service/notification/NotificationListenerService$Ranking;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Landroid/service/notification/NotificationListenerService$RankingMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/service/notification/NotificationListenerService$RankingMap;->getOrderedKeys()[Ljava/lang/String;
-HSPLandroid/service/notification/NotificationListenerService$RankingMap;->getRanking(Ljava/lang/String;Landroid/service/notification/NotificationListenerService$Ranking;)Z
-HSPLandroid/service/notification/NotificationListenerService;-><init>()V
-HSPLandroid/service/notification/NotificationListenerService;->applyUpdateLocked(Landroid/service/notification/NotificationRankingUpdate;)V
-HSPLandroid/service/notification/NotificationListenerService;->attachBaseContext(Landroid/content/Context;)V
-HSPLandroid/service/notification/NotificationListenerService;->cleanUpNotificationList(Landroid/content/pm/ParceledListSlice;)[Landroid/service/notification/StatusBarNotification;
-HSPLandroid/service/notification/NotificationListenerService;->createLegacyIconExtras(Landroid/app/Notification;)V
-HSPLandroid/service/notification/NotificationListenerService;->getActiveNotifications()[Landroid/service/notification/StatusBarNotification;
-HSPLandroid/service/notification/NotificationListenerService;->getActiveNotifications([Ljava/lang/String;I)[Landroid/service/notification/StatusBarNotification;
-HSPLandroid/service/notification/NotificationListenerService;->getContext()Landroid/content/Context;
-HSPLandroid/service/notification/NotificationListenerService;->getCurrentRanking()Landroid/service/notification/NotificationListenerService$RankingMap;
-HSPLandroid/service/notification/NotificationListenerService;->getNotificationInterface()Landroid/app/INotificationManager;
-HSPLandroid/service/notification/NotificationListenerService;->isBound()Z
-HSPLandroid/service/notification/NotificationListenerService;->maybePopulatePeople(Landroid/app/Notification;)V
-HSPLandroid/service/notification/NotificationListenerService;->maybePopulateRemoteViews(Landroid/app/Notification;)V
-HSPLandroid/service/notification/NotificationListenerService;->onBind(Landroid/content/Intent;)Landroid/os/IBinder;
-HSPLandroid/service/notification/NotificationListenerService;->onInterruptionFilterChanged(I)V
-HSPLandroid/service/notification/NotificationListenerService;->onListenerConnected()V
-HSPLandroid/service/notification/NotificationListenerService;->onNotificationChannelGroupModified(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannelGroup;I)V
-HSPLandroid/service/notification/NotificationListenerService;->onNotificationPosted(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationListenerService$RankingMap;)V
-HSPLandroid/service/notification/NotificationListenerService;->onNotificationRankingUpdate(Landroid/service/notification/NotificationListenerService$RankingMap;)V
-HSPLandroid/service/notification/NotificationListenerService;->onNotificationRemoved(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationListenerService$RankingMap;Landroid/service/notification/NotificationStats;I)V
-HSPLandroid/service/notification/NotificationRankingUpdate$1;->createFromParcel(Landroid/os/Parcel;)Landroid/service/notification/NotificationRankingUpdate;
-HSPLandroid/service/notification/NotificationRankingUpdate$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/service/notification/NotificationRankingUpdate;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/service/notification/NotificationRankingUpdate;->getRankingMap()Landroid/service/notification/NotificationListenerService$RankingMap;
-HSPLandroid/service/notification/StatusBarNotification$1;->createFromParcel(Landroid/os/Parcel;)Landroid/service/notification/StatusBarNotification;
-HSPLandroid/service/notification/StatusBarNotification$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/service/notification/StatusBarNotification;-><init>(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Lcom/android/internal/logging/InstanceId$1;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/service/notification/StatusBarNotification;->getGroupKey()Ljava/lang/String;
-HSPLandroid/service/notification/StatusBarNotification;->getId()I
-HSPLandroid/service/notification/StatusBarNotification;->getInstanceId()Lcom/android/internal/logging/InstanceId;
-HSPLandroid/service/notification/StatusBarNotification;->getKey()Ljava/lang/String;
-HSPLandroid/service/notification/StatusBarNotification;->getNotification()Landroid/app/Notification;
-HSPLandroid/service/notification/StatusBarNotification;->getOpPkg()Ljava/lang/String;
-HSPLandroid/service/notification/StatusBarNotification;->getOverrideGroupKey()Ljava/lang/String;
-HSPLandroid/service/notification/StatusBarNotification;->getPackageContext(Landroid/content/Context;)Landroid/content/Context;
-HSPLandroid/service/notification/StatusBarNotification;->getPackageName()Ljava/lang/String;
-HSPLandroid/service/notification/StatusBarNotification;->getPostTime()J
-HSPLandroid/service/notification/StatusBarNotification;->getTag()Ljava/lang/String;
-HSPLandroid/service/notification/StatusBarNotification;->getUid()I
-HSPLandroid/service/notification/StatusBarNotification;->getUser()Landroid/os/UserHandle;
-HSPLandroid/service/notification/StatusBarNotification;->getUserId()I
-HSPLandroid/service/notification/StatusBarNotification;->groupKey()Ljava/lang/String;
-HSPLandroid/service/notification/StatusBarNotification;->isAppGroup()Z
-HSPLandroid/service/notification/StatusBarNotification;->isGroup()Z
-HSPLandroid/service/notification/StatusBarNotification;->isOngoing()Z
-HSPLandroid/service/notification/StatusBarNotification;->key()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/UserHandle;Landroid/os/UserHandle;
-HSPLandroid/service/notification/ZenModeConfig$ZenRule$1;->createFromParcel(Landroid/os/Parcel;)Landroid/service/notification/ZenModeConfig$ZenRule;
-HSPLandroid/service/notification/ZenModeConfig$ZenRule$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/service/notification/ZenModeConfig$ZenRule;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/service/notification/ZenModeConfig$ZenRule;->equals(Ljava/lang/Object;)Z
-HSPLandroid/service/notification/ZenModeConfig;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/service/notification/ZenModeConfig;->areAllPriorityOnlyRingerSoundsMuted(Landroid/app/NotificationManager$Policy;)Z
-HSPLandroid/service/notification/ZenModeConfig;->equals(Ljava/lang/Object;)Z
-HSPLandroid/service/textclassifier/ITextClassifierCallback$Stub$Proxy;->onSuccess(Landroid/os/Bundle;)V
-HSPLandroid/service/textclassifier/ITextClassifierCallback$Stub;-><init>()V
-HSPLandroid/service/textclassifier/ITextClassifierCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/service/textclassifier/ITextClassifierCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/service/textclassifier/ITextClassifierService$Stub$Proxy;->onClassifyText(Landroid/view/textclassifier/TextClassificationSessionId;Landroid/view/textclassifier/TextClassification$Request;Landroid/service/textclassifier/ITextClassifierCallback;)V
-HSPLandroid/service/textclassifier/ITextClassifierService$Stub$Proxy;->onCreateTextClassificationSession(Landroid/view/textclassifier/TextClassificationContext;Landroid/view/textclassifier/TextClassificationSessionId;)V
-HSPLandroid/service/textclassifier/ITextClassifierService$Stub$Proxy;->onDestroyTextClassificationSession(Landroid/view/textclassifier/TextClassificationSessionId;)V
-HSPLandroid/service/textclassifier/ITextClassifierService$Stub$Proxy;->onGenerateLinks(Landroid/view/textclassifier/TextClassificationSessionId;Landroid/view/textclassifier/TextLinks$Request;Landroid/service/textclassifier/ITextClassifierCallback;)V
-HSPLandroid/service/textclassifier/ITextClassifierService$Stub$Proxy;->onSelectionEvent(Landroid/view/textclassifier/TextClassificationSessionId;Landroid/view/textclassifier/SelectionEvent;)V
-HSPLandroid/service/textclassifier/ITextClassifierService$Stub$Proxy;->onSuggestConversationActions(Landroid/view/textclassifier/TextClassificationSessionId;Landroid/view/textclassifier/ConversationActions$Request;Landroid/service/textclassifier/ITextClassifierCallback;)V
-HSPLandroid/service/textclassifier/ITextClassifierService$Stub$Proxy;->onTextClassifierEvent(Landroid/view/textclassifier/TextClassificationSessionId;Landroid/view/textclassifier/TextClassifierEvent;)V
-HSPLandroid/service/textclassifier/ITextClassifierService$Stub;-><init>()V
-HSPLandroid/service/textclassifier/ITextClassifierService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/textclassifier/ITextClassifierService;
-HSPLandroid/service/textclassifier/ITextClassifierService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/service/textclassifier/TextClassifierService;->getResponse(Landroid/os/Bundle;)Landroid/os/Parcelable;
-HSPLandroid/service/voice/VoiceInteractionServiceInfo;-><init>(Landroid/content/pm/PackageManager;Landroid/content/pm/ServiceInfo;)V
-HSPLandroid/service/voice/VoiceInteractionServiceInfo;->getParseError()Ljava/lang/String;
-HSPLandroid/service/voice/VoiceInteractionServiceInfo;->getRecognitionService()Ljava/lang/String;
-HSPLandroid/service/voice/VoiceInteractionServiceInfo;->getServiceInfo()Landroid/content/pm/ServiceInfo;
-HSPLandroid/service/vr/IVrManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/vr/IVrManager;
-HSPLandroid/service/vr/IVrStateCallbacks$Stub;-><init>()V
-HSPLandroid/speech/tts/ITextToSpeechCallback$Stub;-><init>()V
-HSPLandroid/speech/tts/ITextToSpeechCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/speech/tts/ITextToSpeechService$Stub$Proxy;->getClientDefaultLanguage()[Ljava/lang/String;
-HSPLandroid/speech/tts/ITextToSpeechService$Stub$Proxy;->getDefaultVoiceNameFor(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/speech/tts/ITextToSpeechService$Stub$Proxy;->setCallback(Landroid/os/IBinder;Landroid/speech/tts/ITextToSpeechCallback;)V
-HSPLandroid/speech/tts/TextToSpeech$Connection$1;-><init>(Landroid/speech/tts/TextToSpeech$Connection;)V
-HSPLandroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;->doInBackground([Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;->doInBackground([Ljava/lang/Void;)Ljava/lang/Integer;
-HSPLandroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;->onPostExecute(Ljava/lang/Integer;)V
-HSPLandroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;->onPostExecute(Ljava/lang/Object;)V
-HSPLandroid/speech/tts/TextToSpeech$Connection;-><init>(Landroid/speech/tts/TextToSpeech;)V
-HSPLandroid/speech/tts/TextToSpeech$Connection;->getCallerIdentity()Landroid/os/IBinder;
-HSPLandroid/speech/tts/TextToSpeech$Connection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-HSPLandroid/speech/tts/TextToSpeech$EngineInfo;-><init>()V
-HSPLandroid/speech/tts/TextToSpeech;-><init>(Landroid/content/Context;Landroid/speech/tts/TextToSpeech$OnInitListener;)V
-HSPLandroid/speech/tts/TextToSpeech;-><init>(Landroid/content/Context;Landroid/speech/tts/TextToSpeech$OnInitListener;Ljava/lang/String;)V
-HSPLandroid/speech/tts/TextToSpeech;-><init>(Landroid/content/Context;Landroid/speech/tts/TextToSpeech$OnInitListener;Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLandroid/speech/tts/TextToSpeech;->connectToEngine(Ljava/lang/String;)Z
-HSPLandroid/speech/tts/TextToSpeech;->dispatchOnInit(I)V
-HSPLandroid/speech/tts/TextToSpeech;->getDefaultEngine()Ljava/lang/String;
-HSPLandroid/speech/tts/TextToSpeech;->initTts()I
-HSPLandroid/speech/tts/TextToSpeech;->runAction(Landroid/speech/tts/TextToSpeech$Action;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroid/speech/tts/TextToSpeech;->runAction(Landroid/speech/tts/TextToSpeech$Action;Ljava/lang/Object;Ljava/lang/String;ZZ)Ljava/lang/Object;
-HSPLandroid/speech/tts/TtsEngines;-><init>(Landroid/content/Context;)V
-HSPLandroid/speech/tts/TtsEngines;->getDefaultEngine()Ljava/lang/String;
-HSPLandroid/speech/tts/TtsEngines;->getEngineInfo(Landroid/content/pm/ResolveInfo;Landroid/content/pm/PackageManager;)Landroid/speech/tts/TextToSpeech$EngineInfo;
-HSPLandroid/speech/tts/TtsEngines;->getEngines()Ljava/util/List;
-HSPLandroid/speech/tts/TtsEngines;->isEngineInstalled(Ljava/lang/String;)Z
-HSPLandroid/speech/tts/TtsEngines;->isSystemEngine(Landroid/content/pm/ServiceInfo;)Z
-HSPLandroid/sysprop/DisplayProperties;->debug_force_rtl()Ljava/util/Optional;
-HSPLandroid/sysprop/DisplayProperties;->debug_layout()Ljava/util/Optional;
-HSPLandroid/sysprop/DisplayProperties;->debug_vri_package()Ljava/util/Optional;
-HSPLandroid/sysprop/DisplayProperties;->tryParseBoolean(Ljava/lang/String;)Ljava/lang/Boolean;
-HSPLandroid/sysprop/DisplayProperties;->tryParseString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/sysprop/InputProperties;->tryParseString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda10;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda4;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda5;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda6;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda7;-><init>()V
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda7;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda8;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda9;-><init>()V
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda9;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/sysprop/TelephonyProperties;->baseband_version()Ljava/util/List;
-HSPLandroid/sysprop/TelephonyProperties;->current_active_phone()Ljava/util/List;
-HSPLandroid/sysprop/TelephonyProperties;->icc_operator_alpha()Ljava/util/List;
-HSPLandroid/sysprop/TelephonyProperties;->icc_operator_iso_country()Ljava/util/List;
-HSPLandroid/sysprop/TelephonyProperties;->icc_operator_numeric()Ljava/util/List;
-HSPLandroid/sysprop/TelephonyProperties;->lambda$baseband_version$0(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/sysprop/TelephonyProperties;->lambda$icc_operator_alpha$8(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/sysprop/TelephonyProperties;->lambda$icc_operator_iso_country$9(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/sysprop/TelephonyProperties;->lambda$icc_operator_numeric$7(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/sysprop/TelephonyProperties;->lambda$operator_alpha$1(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/sysprop/TelephonyProperties;->lambda$operator_is_roaming$3(Ljava/lang/String;)Ljava/lang/Boolean;
-HSPLandroid/sysprop/TelephonyProperties;->lambda$operator_numeric$2(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/sysprop/TelephonyProperties;->max_active_modems()Ljava/util/Optional;
-HSPLandroid/sysprop/TelephonyProperties;->multi_sim_config()Ljava/util/Optional;
-HSPLandroid/sysprop/TelephonyProperties;->operator_alpha()Ljava/util/List;
-HSPLandroid/sysprop/TelephonyProperties;->operator_is_roaming()Ljava/util/List;
-HSPLandroid/sysprop/TelephonyProperties;->operator_numeric()Ljava/util/List;
-HSPLandroid/sysprop/TelephonyProperties;->tryParseBoolean(Ljava/lang/String;)Ljava/lang/Boolean;
-HSPLandroid/sysprop/TelephonyProperties;->tryParseInteger(Ljava/lang/String;)Ljava/lang/Integer;
-HSPLandroid/sysprop/TelephonyProperties;->tryParseList(Ljava/util/function/Function;Ljava/lang/String;)Ljava/util/List;
-HSPLandroid/sysprop/TelephonyProperties;->tryParseString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/sysprop/VndkProperties;->product_vndk_version()Ljava/util/Optional;
-HSPLandroid/sysprop/VndkProperties;->tryParseString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/system/ErrnoException;-><init>(Ljava/lang/String;I)V
-HSPLandroid/system/ErrnoException;->getMessage()Ljava/lang/String;
-HSPLandroid/system/ErrnoException;->rethrowAsIOException()Ljava/io/IOException;
-HSPLandroid/system/GaiException;-><init>(Ljava/lang/String;I)V
-HSPLandroid/system/GaiException;->getMessage()Ljava/lang/String;
-HSPLandroid/system/GaiException;->rethrowAsUnknownHostException(Ljava/lang/String;)Ljava/net/UnknownHostException;
-HSPLandroid/system/Int32Ref;-><init>(I)V
-HSPLandroid/system/Os;->accept(Ljava/io/FileDescriptor;Ljava/net/InetSocketAddress;)Ljava/io/FileDescriptor;
-HSPLandroid/system/Os;->accept(Ljava/io/FileDescriptor;Ljava/net/SocketAddress;)Ljava/io/FileDescriptor;
-HSPLandroid/system/Os;->bind(Ljava/io/FileDescriptor;Ljava/net/SocketAddress;)V
-HSPLandroid/system/Os;->capget(Landroid/system/StructCapUserHeader;)[Landroid/system/StructCapUserData;
-HSPLandroid/system/Os;->chmod(Ljava/lang/String;I)V
-HSPLandroid/system/Os;->close(Ljava/io/FileDescriptor;)V
-HSPLandroid/system/Os;->fcntlInt(Ljava/io/FileDescriptor;II)I
-HSPLandroid/system/Os;->fdatasync(Ljava/io/FileDescriptor;)V
-HSPLandroid/system/Os;->fstat(Ljava/io/FileDescriptor;)Landroid/system/StructStat;
-HSPLandroid/system/Os;->getpeername(Ljava/io/FileDescriptor;)Ljava/net/SocketAddress;
-HSPLandroid/system/Os;->getpgid(I)I
-HSPLandroid/system/Os;->getpid()I
-HSPLandroid/system/Os;->gettid()I
-HSPLandroid/system/Os;->getuid()I
-HSPLandroid/system/Os;->getxattr(Ljava/lang/String;Ljava/lang/String;)[B
-HSPLandroid/system/Os;->ioctlInt(Ljava/io/FileDescriptor;I)I
-HSPLandroid/system/Os;->listen(Ljava/io/FileDescriptor;I)V
-HSPLandroid/system/Os;->lseek(Ljava/io/FileDescriptor;JI)J
-HSPLandroid/system/Os;->lstat(Ljava/lang/String;)Landroid/system/StructStat;
-HSPLandroid/system/Os;->mkdir(Ljava/lang/String;I)V
-HSPLandroid/system/Os;->mmap(JJIILjava/io/FileDescriptor;J)J
-HSPLandroid/system/Os;->open(Ljava/lang/String;II)Ljava/io/FileDescriptor;
-HSPLandroid/system/Os;->poll([Landroid/system/StructPollfd;I)I
-HSPLandroid/system/Os;->read(Ljava/io/FileDescriptor;[BII)I
-HSPLandroid/system/Os;->rename(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/system/Os;->setenv(Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLandroid/system/Os;->setpgid(II)V
-HSPLandroid/system/Os;->setregid(II)V
-HSPLandroid/system/Os;->setreuid(II)V
-HSPLandroid/system/Os;->setsockoptInt(Ljava/io/FileDescriptor;III)V
-HSPLandroid/system/Os;->setsockoptTimeval(Ljava/io/FileDescriptor;IILandroid/system/StructTimeval;)V
-HSPLandroid/system/Os;->socket(III)Ljava/io/FileDescriptor;
-HSPLandroid/system/Os;->socketpair(IIILjava/io/FileDescriptor;Ljava/io/FileDescriptor;)V
-HSPLandroid/system/Os;->stat(Ljava/lang/String;)Landroid/system/StructStat;
-HSPLandroid/system/Os;->statvfs(Ljava/lang/String;)Landroid/system/StructStatVfs;
-HSPLandroid/system/Os;->sysconf(I)J
-HSPLandroid/system/Os;->write(Ljava/io/FileDescriptor;[BII)I
-HSPLandroid/system/OsConstants;->S_ISDIR(I)Z
-HSPLandroid/system/OsConstants;->errnoName(I)Ljava/lang/String;
-HSPLandroid/system/OsConstants;->gaiName(I)Ljava/lang/String;
-HSPLandroid/system/StructAddrinfo;-><init>()V
-HSPLandroid/system/StructCapUserData;-><init>(III)V
-HSPLandroid/system/StructCapUserHeader;-><init>(II)V
-HSPLandroid/system/StructIfaddrs;-><init>(Ljava/lang/String;ILjava/net/InetAddress;Ljava/net/InetAddress;Ljava/net/InetAddress;[B)V
-HSPLandroid/system/StructLinger;-><init>(II)V
-HSPLandroid/system/StructLinger;->isOn()Z
-HSPLandroid/system/StructPollfd;-><init>()V
-HSPLandroid/system/StructStat;-><init>(JJIJIIJJLandroid/system/StructTimespec;Landroid/system/StructTimespec;Landroid/system/StructTimespec;JJ)V
-HSPLandroid/system/StructStatVfs;-><init>(JJJJJJJJJJJ)V
-HSPLandroid/system/StructTimespec;-><init>(JJ)V
-HSPLandroid/system/StructTimespec;->equals(Ljava/lang/Object;)Z
-HSPLandroid/system/StructTimeval;-><init>(JJ)V
-HSPLandroid/system/StructTimeval;->fromMillis(J)Landroid/system/StructTimeval;
-HSPLandroid/system/UnixSocketAddress;-><init>([B)V
-HSPLandroid/system/keystore2/Authorization$1;-><init>()V
-HSPLandroid/system/keystore2/Authorization$1;->createFromParcel(Landroid/os/Parcel;)Landroid/system/keystore2/Authorization;
-HSPLandroid/system/keystore2/Authorization$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/system/keystore2/Authorization$1;->newArray(I)[Landroid/system/keystore2/Authorization;
-HSPLandroid/system/keystore2/Authorization$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/system/keystore2/Authorization;-><clinit>()V
-HSPLandroid/system/keystore2/Authorization;-><init>()V
-HSPLandroid/system/keystore2/Authorization;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/system/keystore2/CreateOperationResponse$1;-><init>()V
-HSPLandroid/system/keystore2/CreateOperationResponse$1;->createFromParcel(Landroid/os/Parcel;)Landroid/system/keystore2/CreateOperationResponse;
-HSPLandroid/system/keystore2/CreateOperationResponse$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/system/keystore2/CreateOperationResponse;-><clinit>()V
-HSPLandroid/system/keystore2/CreateOperationResponse;-><init>()V
-HSPLandroid/system/keystore2/CreateOperationResponse;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/system/keystore2/IKeystoreOperation$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/system/keystore2/IKeystoreOperation$Stub$Proxy;->abort()V
-HSPLandroid/system/keystore2/IKeystoreOperation$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/system/keystore2/IKeystoreOperation$Stub$Proxy;->finish([B[B)[B
-HSPLandroid/system/keystore2/IKeystoreOperation$Stub$Proxy;->update([B)[B
-HSPLandroid/system/keystore2/IKeystoreOperation$Stub;->asInterface(Landroid/os/IBinder;)Landroid/system/keystore2/IKeystoreOperation;
-HSPLandroid/system/keystore2/IKeystoreOperation;-><clinit>()V
-HSPLandroid/system/keystore2/IKeystoreSecurityLevel$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/system/keystore2/IKeystoreSecurityLevel$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/system/keystore2/IKeystoreSecurityLevel$Stub$Proxy;->createOperation(Landroid/system/keystore2/KeyDescriptor;[Landroid/hardware/security/keymint/KeyParameter;Z)Landroid/system/keystore2/CreateOperationResponse;
-HSPLandroid/system/keystore2/IKeystoreSecurityLevel$Stub;->asInterface(Landroid/os/IBinder;)Landroid/system/keystore2/IKeystoreSecurityLevel;
-HSPLandroid/system/keystore2/IKeystoreSecurityLevel;-><clinit>()V
-HSPLandroid/system/keystore2/IKeystoreService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/system/keystore2/IKeystoreService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/system/keystore2/IKeystoreService$Stub$Proxy;->getKeyEntry(Landroid/system/keystore2/KeyDescriptor;)Landroid/system/keystore2/KeyEntryResponse;
-HSPLandroid/system/keystore2/IKeystoreService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/system/keystore2/IKeystoreService;
-HSPLandroid/system/keystore2/IKeystoreService;-><clinit>()V
-HSPLandroid/system/keystore2/KeyDescriptor$1;-><init>()V
-HSPLandroid/system/keystore2/KeyDescriptor$1;->createFromParcel(Landroid/os/Parcel;)Landroid/system/keystore2/KeyDescriptor;
-HSPLandroid/system/keystore2/KeyDescriptor$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/system/keystore2/KeyDescriptor;-><clinit>()V
-HSPLandroid/system/keystore2/KeyDescriptor;-><init>()V
-HSPLandroid/system/keystore2/KeyDescriptor;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/system/keystore2/KeyDescriptor;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/system/keystore2/KeyEntryResponse$1;-><init>()V
-HSPLandroid/system/keystore2/KeyEntryResponse$1;->createFromParcel(Landroid/os/Parcel;)Landroid/system/keystore2/KeyEntryResponse;
-HSPLandroid/system/keystore2/KeyEntryResponse$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/system/keystore2/KeyEntryResponse;-><clinit>()V
-HSPLandroid/system/keystore2/KeyEntryResponse;-><init>()V
-HSPLandroid/system/keystore2/KeyEntryResponse;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/system/keystore2/KeyMetadata$1;-><init>()V
-HSPLandroid/system/keystore2/KeyMetadata$1;->createFromParcel(Landroid/os/Parcel;)Landroid/system/keystore2/KeyMetadata;
-HSPLandroid/system/keystore2/KeyMetadata$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/system/keystore2/KeyMetadata;-><clinit>()V
-HSPLandroid/system/keystore2/KeyMetadata;-><init>()V
-HSPLandroid/system/keystore2/KeyMetadata;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/system/keystore2/KeyParameters$1;-><init>()V
-HSPLandroid/system/keystore2/KeyParameters$1;->createFromParcel(Landroid/os/Parcel;)Landroid/system/keystore2/KeyParameters;
-HSPLandroid/system/keystore2/KeyParameters$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/system/keystore2/KeyParameters;-><clinit>()V
-HSPLandroid/system/keystore2/KeyParameters;-><init>()V
-HSPLandroid/system/keystore2/KeyParameters;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/system/keystore2/OperationChallenge$1;-><init>()V
-HSPLandroid/system/keystore2/OperationChallenge;-><clinit>()V
-HSPLandroid/telecom/AudioState;-><init>(Landroid/telecom/CallAudioState;)V
-HSPLandroid/telecom/CallAudioState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telecom/CallAudioState;
-HSPLandroid/telecom/CallAudioState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telecom/CallAudioState;-><init>(ZIILandroid/bluetooth/BluetoothDevice;Ljava/util/Collection;)V
-HSPLandroid/telecom/CallAudioState;->audioRouteToString(I)Ljava/lang/String;
-HSPLandroid/telecom/CallAudioState;->getRoute()I
-HSPLandroid/telecom/CallAudioState;->getSupportedRouteMask()I
-HSPLandroid/telecom/CallAudioState;->isMuted()Z
-HSPLandroid/telecom/CallAudioState;->toString()Ljava/lang/String;
-HSPLandroid/telecom/DisconnectCause$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telecom/DisconnectCause;
-HSPLandroid/telecom/DisconnectCause$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telecom/DisconnectCause;->getCode()I
-HSPLandroid/telecom/DisconnectCause;->getReason()Ljava/lang/String;
-HSPLandroid/telecom/Log;->buildMessage(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
-HSPLandroid/telecom/Log;->continueSession(Landroid/telecom/Logging/Session;Ljava/lang/String;)V
-HSPLandroid/telecom/Log;->createSubsession()Landroid/telecom/Logging/Session;
-HSPLandroid/telecom/Log;->d(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)V
-HSPLandroid/telecom/Log;->d(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
-HSPLandroid/telecom/Log;->endSession()V
-HSPLandroid/telecom/Log;->getSessionId()Ljava/lang/String;
-HSPLandroid/telecom/Log;->getSessionManager()Landroid/telecom/Logging/SessionManager;
-HSPLandroid/telecom/Log;->i(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)V
-HSPLandroid/telecom/Log;->obfuscatePhoneNumber(Ljava/lang/StringBuilder;Ljava/lang/String;)V
-HSPLandroid/telecom/Log;->pii(Ljava/lang/Object;)Ljava/lang/String;
-HSPLandroid/telecom/Log;->piiHandle(Ljava/lang/Object;)Ljava/lang/String;
-HSPLandroid/telecom/Log;->v(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)V
-HSPLandroid/telecom/Logging/Session;-><init>(Ljava/lang/String;Ljava/lang/String;JZLjava/lang/String;)V
-HSPLandroid/telecom/Logging/Session;->addChild(Landroid/telecom/Logging/Session;)V
-HSPLandroid/telecom/Logging/Session;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telecom/Logging/Session;->getChildSessions()Ljava/util/ArrayList;
-HSPLandroid/telecom/Logging/Session;->getExecutionStartTimeMilliseconds()J
-HSPLandroid/telecom/Logging/Session;->getFullMethodPath(Ljava/lang/StringBuilder;ZI)V
-HSPLandroid/telecom/Logging/Session;->getFullMethodPath(Z)Ljava/lang/String;
-HSPLandroid/telecom/Logging/Session;->getFullSessionId(I)Ljava/lang/String;
-HSPLandroid/telecom/Logging/Session;->getLocalExecutionTime()J
-HSPLandroid/telecom/Logging/Session;->getNextChildId()Ljava/lang/String;
-HSPLandroid/telecom/Logging/Session;->getOwnerInfo()Ljava/lang/String;
-HSPLandroid/telecom/Logging/Session;->getParentSession()Landroid/telecom/Logging/Session;
-HSPLandroid/telecom/Logging/Session;->getShortMethodName()Ljava/lang/String;
-HSPLandroid/telecom/Logging/Session;->isExternal()Z
-HSPLandroid/telecom/Logging/Session;->isSessionCompleted()Z
-HSPLandroid/telecom/Logging/Session;->isStartedFromActiveSession()Z
-HSPLandroid/telecom/Logging/Session;->markSessionCompleted(J)V
-HSPLandroid/telecom/Logging/Session;->removeChild(Landroid/telecom/Logging/Session;)V
-HSPLandroid/telecom/Logging/Session;->setExecutionStartTimeMs(J)V
-HSPLandroid/telecom/Logging/Session;->setParentSession(Landroid/telecom/Logging/Session;)V
-HSPLandroid/telecom/Logging/Session;->setSessionId(Ljava/lang/String;)V
-HSPLandroid/telecom/Logging/Session;->setShortMethodName(Ljava/lang/String;)V
-HSPLandroid/telecom/Logging/Session;->toString()Ljava/lang/String;
-HSPLandroid/telecom/Logging/SessionManager;-><init>()V
-HSPLandroid/telecom/Logging/SessionManager;->cleanupStaleSessions(J)V
-HSPLandroid/telecom/Logging/SessionManager;->continueSession(Landroid/telecom/Logging/Session;Ljava/lang/String;)V
-HSPLandroid/telecom/Logging/SessionManager;->createSubsession()Landroid/telecom/Logging/Session;
-HSPLandroid/telecom/Logging/SessionManager;->createSubsession(Z)Landroid/telecom/Logging/Session;
-HSPLandroid/telecom/Logging/SessionManager;->endParentSessions(Landroid/telecom/Logging/Session;)V
-HSPLandroid/telecom/Logging/SessionManager;->endSession()V
-HSPLandroid/telecom/Logging/SessionManager;->getSessionId()Ljava/lang/String;
-HSPLandroid/telecom/Logging/SessionManager;->resetStaleSessionTimer()V
-HSPLandroid/telecom/PhoneAccount$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telecom/PhoneAccount;
-HSPLandroid/telecom/PhoneAccount$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telecom/PhoneAccount$Builder;-><init>(Landroid/telecom/PhoneAccountHandle;Ljava/lang/CharSequence;)V
-HSPLandroid/telecom/PhoneAccount$Builder;->addSupportedUriScheme(Ljava/lang/String;)Landroid/telecom/PhoneAccount$Builder;
-HSPLandroid/telecom/PhoneAccount$Builder;->build()Landroid/telecom/PhoneAccount;
-HSPLandroid/telecom/PhoneAccount$Builder;->setAddress(Landroid/net/Uri;)Landroid/telecom/PhoneAccount$Builder;
-HSPLandroid/telecom/PhoneAccount$Builder;->setCapabilities(I)Landroid/telecom/PhoneAccount$Builder;
-HSPLandroid/telecom/PhoneAccount$Builder;->setExtras(Landroid/os/Bundle;)Landroid/telecom/PhoneAccount$Builder;
-HSPLandroid/telecom/PhoneAccount$Builder;->setHighlightColor(I)Landroid/telecom/PhoneAccount$Builder;
-HSPLandroid/telecom/PhoneAccount$Builder;->setIcon(Landroid/graphics/drawable/Icon;)Landroid/telecom/PhoneAccount$Builder;
-HSPLandroid/telecom/PhoneAccount$Builder;->setShortDescription(Ljava/lang/CharSequence;)Landroid/telecom/PhoneAccount$Builder;
-HSPLandroid/telecom/PhoneAccount$Builder;->setSubscriptionAddress(Landroid/net/Uri;)Landroid/telecom/PhoneAccount$Builder;
-HSPLandroid/telecom/PhoneAccount$Builder;->setSupportedUriSchemes(Ljava/util/List;)Landroid/telecom/PhoneAccount$Builder;
-HSPLandroid/telecom/PhoneAccount;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telecom/PhoneAccount;->audioRoutesToString()Ljava/lang/String;
-HSPLandroid/telecom/PhoneAccount;->builder(Landroid/telecom/PhoneAccountHandle;Ljava/lang/CharSequence;)Landroid/telecom/PhoneAccount$Builder;
-HSPLandroid/telecom/PhoneAccount;->capabilitiesToString()Ljava/lang/String;
-HSPLandroid/telecom/PhoneAccount;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telecom/PhoneAccount;->getAccountHandle()Landroid/telecom/PhoneAccountHandle;
-HSPLandroid/telecom/PhoneAccount;->hasAudioRoutes(I)Z
-HSPLandroid/telecom/PhoneAccount;->hasCapabilities(I)Z
-HSPLandroid/telecom/PhoneAccount;->toString()Ljava/lang/String;
-HSPLandroid/telecom/PhoneAccount;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telecom/PhoneAccountHandle$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telecom/PhoneAccountHandle;
-HSPLandroid/telecom/PhoneAccountHandle$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telecom/PhoneAccountHandle;-><init>(Landroid/content/ComponentName;Ljava/lang/String;)V
-HSPLandroid/telecom/PhoneAccountHandle;-><init>(Landroid/content/ComponentName;Ljava/lang/String;Landroid/os/UserHandle;)V
-HSPLandroid/telecom/PhoneAccountHandle;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telecom/PhoneAccountHandle;->checkParameters(Landroid/content/ComponentName;Landroid/os/UserHandle;)V
-HSPLandroid/telecom/PhoneAccountHandle;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telecom/PhoneAccountHandle;->getComponentName()Landroid/content/ComponentName;
-HSPLandroid/telecom/PhoneAccountHandle;->getId()Ljava/lang/String;
-HSPLandroid/telecom/PhoneAccountHandle;->getUserHandle()Landroid/os/UserHandle;
-HSPLandroid/telecom/PhoneAccountHandle;->hashCode()I
-HSPLandroid/telecom/PhoneAccountHandle;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/ComponentName;Landroid/content/ComponentName;
-HSPLandroid/telecom/PhoneAccountHandle;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telecom/TelecomManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/telecom/TelecomManager;-><init>(Landroid/content/Context;Lcom/android/internal/telecom/ITelecomService;)V
-HSPLandroid/telecom/TelecomManager;->getCallCapablePhoneAccounts()Ljava/util/List;
-HSPLandroid/telecom/TelecomManager;->getCallCapablePhoneAccounts(Z)Ljava/util/List;
-HSPLandroid/telecom/TelecomManager;->getCallState()I
-HSPLandroid/telecom/TelecomManager;->getCurrentTtyMode()I
-HSPLandroid/telecom/TelecomManager;->getDefaultDialerPackage()Ljava/lang/String;
-HSPLandroid/telecom/TelecomManager;->getDefaultDialerPackage(Landroid/os/UserHandle;)Ljava/lang/String;
-HSPLandroid/telecom/TelecomManager;->getPhoneAccount(Landroid/telecom/PhoneAccountHandle;)Landroid/telecom/PhoneAccount;
-HSPLandroid/telecom/TelecomManager;->getSystemDialerPackage()Ljava/lang/String;
-HSPLandroid/telecom/TelecomManager;->getTelecomService()Lcom/android/internal/telecom/ITelecomService;
-HSPLandroid/telecom/TelecomManager;->isInCall()Z
-HSPLandroid/telephony/AccessNetworkConstants;->transportTypeToString(I)Ljava/lang/String;
-HSPLandroid/telephony/AccessNetworkUtils;->getDuplexModeForEutranBand(I)I
-HSPLandroid/telephony/AccessNetworkUtils;->getOperatingBandForEarfcn(I)I
-HSPLandroid/telephony/BinderCacheManager$BinderDeathTracker;-><init>(Landroid/telephony/BinderCacheManager;Landroid/os/IInterface;)V
-HSPLandroid/telephony/BinderCacheManager$BinderDeathTracker;->getConnection()Landroid/os/IInterface;
-HSPLandroid/telephony/BinderCacheManager$BinderDeathTracker;->isAlive()Z
-HSPLandroid/telephony/BinderCacheManager;->getBinder()Landroid/os/IInterface;
-HSPLandroid/telephony/BinderCacheManager;->getTracker()Landroid/telephony/BinderCacheManager$BinderDeathTracker;
-HSPLandroid/telephony/CarrierConfigManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/telephony/CarrierConfigManager;->getConfig()Landroid/os/PersistableBundle;
-HSPLandroid/telephony/CarrierConfigManager;->getConfigForSubId(I)Landroid/os/PersistableBundle;
-HSPLandroid/telephony/CarrierConfigManager;->getDefaultCarrierServicePackageName()Ljava/lang/String;
-HSPLandroid/telephony/CarrierConfigManager;->getDefaultConfig()Landroid/os/PersistableBundle;
-HSPLandroid/telephony/CarrierConfigManager;->getICarrierConfigLoader()Lcom/android/internal/telephony/ICarrierConfigLoader;
-HSPLandroid/telephony/CarrierConfigManager;->isConfigForIdentifiedCarrier(Landroid/os/PersistableBundle;)Z
-HSPLandroid/telephony/CellConfigLte$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellConfigLte;
-HSPLandroid/telephony/CellConfigLte$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellIdentity$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellIdentity;
-HSPLandroid/telephony/CellIdentity$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellIdentity;-><init>(Ljava/lang/String;ILandroid/os/Parcel;)V
-HSPLandroid/telephony/CellIdentity;-><init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/telephony/CellIdentity;->getPlmn()Ljava/lang/String;
-HSPLandroid/telephony/CellIdentity;->isMcc(Ljava/lang/String;)Z
-HSPLandroid/telephony/CellIdentity;->isMnc(Ljava/lang/String;)Z
-HSPLandroid/telephony/CellIdentity;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellIdentityGsm;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CellIdentityGsm;->updateGlobalCellId()V
-HSPLandroid/telephony/CellIdentityLte$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellIdentityLte;
-HSPLandroid/telephony/CellIdentityLte$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellIdentityLte;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CellIdentityLte;->createFromParcelBody(Landroid/os/Parcel;)Landroid/telephony/CellIdentityLte;
-HSPLandroid/telephony/CellIdentityLte;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellIdentityLte;->getCi()I
-HSPLandroid/telephony/CellIdentityLte;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellIdentityLte;->updateGlobalCellId()V
-HSPLandroid/telephony/CellIdentityLte;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellIdentityWcdma$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellIdentityWcdma;
-HSPLandroid/telephony/CellIdentityWcdma$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellIdentityWcdma;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CellIdentityWcdma;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellIdentityWcdma;->updateGlobalCellId()V
-HSPLandroid/telephony/CellIdentityWcdma;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellInfo;
-HSPLandroid/telephony/CellInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellInfo;->isRegistered()Z
-HSPLandroid/telephony/CellInfoLte;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CellInfoLte;->getCellIdentity()Landroid/telephony/CellIdentityLte;
-HSPLandroid/telephony/CellSignalStrength;-><init>()V
-HSPLandroid/telephony/CellSignalStrength;->getNumSignalStrengthLevels()I
-HSPLandroid/telephony/CellSignalStrengthCdma$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellSignalStrengthCdma;
-HSPLandroid/telephony/CellSignalStrengthCdma$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellSignalStrengthCdma;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CellSignalStrengthCdma;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellSignalStrengthCdma;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellSignalStrengthGsm$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellSignalStrengthGsm;
-HSPLandroid/telephony/CellSignalStrengthGsm$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellSignalStrengthGsm;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CellSignalStrengthGsm;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellSignalStrengthGsm;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellSignalStrengthLte$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellSignalStrengthLte;
-HSPLandroid/telephony/CellSignalStrengthLte$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellSignalStrengthLte;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CellSignalStrengthLte;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellSignalStrengthLte;->getDbm()I
-HSPLandroid/telephony/CellSignalStrengthLte;->getLevel()I
-HSPLandroid/telephony/CellSignalStrengthLte;->isValid()Z
-HSPLandroid/telephony/CellSignalStrengthLte;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellSignalStrengthLte;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellSignalStrengthNr$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellSignalStrengthNr;
-HSPLandroid/telephony/CellSignalStrengthNr$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellSignalStrengthNr;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CellSignalStrengthNr;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellSignalStrengthNr;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellSignalStrengthTdscdma$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellSignalStrengthTdscdma;
-HSPLandroid/telephony/CellSignalStrengthTdscdma$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellSignalStrengthTdscdma;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CellSignalStrengthTdscdma;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellSignalStrengthTdscdma;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellSignalStrengthWcdma$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellSignalStrengthWcdma;
-HSPLandroid/telephony/CellSignalStrengthWcdma$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellSignalStrengthWcdma;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CellSignalStrengthWcdma;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellSignalStrengthWcdma;->getLevel()I
-HSPLandroid/telephony/CellSignalStrengthWcdma;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/DataFailCause;->toString(I)Ljava/lang/String;
-HSPLandroid/telephony/DataSpecificRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/DataSpecificRegistrationInfo;
-HSPLandroid/telephony/DataSpecificRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/DataSpecificRegistrationInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/DataSpecificRegistrationInfo;-><init>(Landroid/telephony/DataSpecificRegistrationInfo;)V
-HSPLandroid/telephony/DataSpecificRegistrationInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/DataSpecificRegistrationInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;-><init>()V
-HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;->build()Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery;
-HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;->setCallingFeatureId(Ljava/lang/String;)Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;
-HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;->setCallingPackage(Ljava/lang/String;)Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;
-HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;->setCallingPid(I)Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;
-HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;->setCallingUid(I)Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;
-HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;->setLogAsInfo(Z)Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;
-HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;->setMethod(Ljava/lang/String;)Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;
-HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;->setMinSdkVersionForCoarse(I)Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;
-HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;->setMinSdkVersionForEnforcement(I)Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;
-HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;->setMinSdkVersionForFine(I)Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;
-HSPLandroid/telephony/LocationAccessPolicy;->checkAppLocationPermissionHelper(Landroid/content/Context;Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery;Ljava/lang/String;)Landroid/telephony/LocationAccessPolicy$LocationPermissionResult;
-HSPLandroid/telephony/LocationAccessPolicy;->checkLocationPermission(Landroid/content/Context;Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery;)Landroid/telephony/LocationAccessPolicy$LocationPermissionResult;
-HSPLandroid/telephony/LocationAccessPolicy;->getAppOpsString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/telephony/LocationAccessPolicy;->isAppAtLeastSdkVersion(Landroid/content/Context;Ljava/lang/String;I)Z
-HSPLandroid/telephony/LocationAccessPolicy;->isCurrentProfile(Landroid/content/Context;I)Z
-HSPLandroid/telephony/LteVopsSupportInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/LteVopsSupportInfo;
-HSPLandroid/telephony/LteVopsSupportInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/LteVopsSupportInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/LteVopsSupportInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/LteVopsSupportInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/ModemActivityInfo;-><init>(JII[II)V
-HSPLandroid/telephony/ModemActivityInfo;-><init>(JJJ[IJ)V
-HSPLandroid/telephony/ModemActivityInfo;->getIdleTimeMillis()J
-HSPLandroid/telephony/ModemActivityInfo;->getNumTxPowerLevels()I
-HSPLandroid/telephony/ModemActivityInfo;->getReceiveTimeMillis()J
-HSPLandroid/telephony/ModemActivityInfo;->getSleepTimeMillis()J
-HSPLandroid/telephony/ModemActivityInfo;->getTimestampMillis()J
-HSPLandroid/telephony/ModemActivityInfo;->isEmpty()Z
-HSPLandroid/telephony/ModemActivityInfo;->isValid()Z
-HSPLandroid/telephony/ModemActivityInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/NetworkRegistrationInfo$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/telephony/NetworkRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/NetworkRegistrationInfo;
-HSPLandroid/telephony/NetworkRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/NetworkRegistrationInfo;-><init>(Landroid/os/Parcel;)V+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/telephony/NetworkRegistrationInfo;-><init>(Landroid/telephony/NetworkRegistrationInfo;)V
-HSPLandroid/telephony/NetworkRegistrationInfo;->domainToString(I)Ljava/lang/String;
-HSPLandroid/telephony/NetworkRegistrationInfo;->getAccessNetworkTechnology()I
-HSPLandroid/telephony/NetworkRegistrationInfo;->getDomain()I
-HSPLandroid/telephony/NetworkRegistrationInfo;->getNrState()I
-HSPLandroid/telephony/NetworkRegistrationInfo;->getRegistrationState()I
-HSPLandroid/telephony/NetworkRegistrationInfo;->getRoamingType()I
-HSPLandroid/telephony/NetworkRegistrationInfo;->getTransportType()I
-HSPLandroid/telephony/NetworkRegistrationInfo;->isInService()Z
-HSPLandroid/telephony/NetworkRegistrationInfo;->isUsingCarrierAggregation()Z
-HSPLandroid/telephony/NetworkRegistrationInfo;->lambda$toString$0(Ljava/lang/Integer;)Ljava/lang/String;
-HSPLandroid/telephony/NetworkRegistrationInfo;->nrStateToString(I)Ljava/lang/String;
-HSPLandroid/telephony/NetworkRegistrationInfo;->registrationStateToString(I)Ljava/lang/String;
-HSPLandroid/telephony/NetworkRegistrationInfo;->serviceTypeToString(I)Ljava/lang/String;
-HSPLandroid/telephony/NetworkRegistrationInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/NetworkRegistrationInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/PhoneNumberUtils;->convertKeypadLettersToDigits(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/telephony/PhoneNumberUtils;->extractNetworkPortionAlt(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/telephony/PhoneNumberUtils;->formatNumberInternal(Ljava/lang/String;Ljava/lang/String;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;)Ljava/lang/String;
-HSPLandroid/telephony/PhoneNumberUtils;->formatNumberToE164(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/telephony/PhoneNumberUtils;->getMinMatch()I
-HSPLandroid/telephony/PhoneNumberUtils;->isDialable(C)Z
-HSPLandroid/telephony/PhoneNumberUtils;->isNonSeparator(C)Z
-HSPLandroid/telephony/PhoneNumberUtils;->normalizeNumber(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/telephony/PhoneNumberUtils;->stripSeparators(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda10;->runOrThrow()V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda19;->runOrThrow()V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda27;->run()V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda51;->run()V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;-><init>(Landroid/telephony/PhoneStateListener;Ljava/util/concurrent/Executor;)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onActiveDataSubIdChanged$56(Landroid/telephony/PhoneStateListener;I)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onDataActivity$16(Landroid/telephony/PhoneStateListener;I)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onDataConnectionStateChanged$14(Landroid/telephony/PhoneStateListener;II)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onDisplayInfoChanged$38(Landroid/telephony/PhoneStateListener;Landroid/telephony/TelephonyDisplayInfo;)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onDisplayInfoChanged$39(Landroid/telephony/PhoneStateListener;Landroid/telephony/TelephonyDisplayInfo;)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onLegacyCallStateChanged$10(Landroid/telephony/PhoneStateListener;ILjava/lang/String;)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onServiceStateChanged$0(Landroid/telephony/PhoneStateListener;Landroid/telephony/ServiceState;)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onSignalStrengthsChanged$18(Landroid/telephony/PhoneStateListener;Landroid/telephony/SignalStrength;)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->onActiveDataSubIdChanged(I)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->onDataActivity(I)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->onDataConnectionStateChanged(II)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->onDisplayInfoChanged(Landroid/telephony/TelephonyDisplayInfo;)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->onLegacyCallStateChanged(ILjava/lang/String;)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->onServiceStateChanged(Landroid/telephony/ServiceState;)V
-HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->onSignalStrengthsChanged(Landroid/telephony/SignalStrength;)V
-HSPLandroid/telephony/PhoneStateListener;-><init>()V
-HSPLandroid/telephony/PhoneStateListener;-><init>(Landroid/os/Looper;)V
-HSPLandroid/telephony/PhoneStateListener;-><init>(Ljava/lang/Integer;Landroid/os/Looper;)V
-HSPLandroid/telephony/PhoneStateListener;-><init>(Ljava/lang/Integer;Ljava/util/concurrent/Executor;)V
-HSPLandroid/telephony/PhoneStateListener;-><init>(Ljava/util/concurrent/Executor;)V
-HSPLandroid/telephony/PhoneStateListener;->onDataConnectionStateChanged(I)V
-HSPLandroid/telephony/Rlog;->d(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/telephony/ServiceState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/ServiceState;
-HSPLandroid/telephony/ServiceState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/ServiceState;-><init>()V
-HSPLandroid/telephony/ServiceState;-><init>(Landroid/os/Parcel;)V+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/telephony/ServiceState;-><init>(Landroid/telephony/ServiceState;)V
-HSPLandroid/telephony/ServiceState;->copyFrom(Landroid/telephony/ServiceState;)V
-HSPLandroid/telephony/ServiceState;->createLocationInfoSanitizedCopy(Z)Landroid/telephony/ServiceState;
-HSPLandroid/telephony/ServiceState;->getCellBandwidths()[I
-HSPLandroid/telephony/ServiceState;->getDataNetworkType()I
-HSPLandroid/telephony/ServiceState;->getDataRegState()I
-HSPLandroid/telephony/ServiceState;->getDataRegistrationState()I
-HSPLandroid/telephony/ServiceState;->getDataRoaming()Z
-HSPLandroid/telephony/ServiceState;->getDataRoamingFromRegistration()Z
-HSPLandroid/telephony/ServiceState;->getDataRoamingType()I
-HSPLandroid/telephony/ServiceState;->getDuplexMode()I
-HSPLandroid/telephony/ServiceState;->getNetworkRegistrationInfo(II)Landroid/telephony/NetworkRegistrationInfo;
-HSPLandroid/telephony/ServiceState;->getNetworkRegistrationInfoList()Ljava/util/List;
-HSPLandroid/telephony/ServiceState;->getNrState()I
-HSPLandroid/telephony/ServiceState;->getRilDataRadioTechnology()I
-HSPLandroid/telephony/ServiceState;->getRilVoiceRadioTechnology()I
-HSPLandroid/telephony/ServiceState;->getRoaming()Z
-HSPLandroid/telephony/ServiceState;->getState()I
-HSPLandroid/telephony/ServiceState;->getVoiceRegState()I
-HSPLandroid/telephony/ServiceState;->getVoiceRoaming()Z
-HSPLandroid/telephony/ServiceState;->getVoiceRoamingType()I
-HSPLandroid/telephony/ServiceState;->isEmergencyOnly()Z
-HSPLandroid/telephony/ServiceState;->isPsOnlyTech(I)Z
-HSPLandroid/telephony/ServiceState;->isUsingCarrierAggregation()Z
-HSPLandroid/telephony/ServiceState;->networkTypeToRilRadioTechnology(I)I
-HSPLandroid/telephony/ServiceState;->newFromBundle(Landroid/os/Bundle;)Landroid/telephony/ServiceState;
-HSPLandroid/telephony/ServiceState;->rilRadioTechnologyToString(I)Ljava/lang/String;
-HSPLandroid/telephony/ServiceState;->rilServiceStateToString(I)Ljava/lang/String;
-HSPLandroid/telephony/ServiceState;->roamingTypeToString(I)Ljava/lang/String;
-HSPLandroid/telephony/ServiceState;->toString()Ljava/lang/String;
-HSPLandroid/telephony/ServiceState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/SignalStrength$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/SignalStrength;
-HSPLandroid/telephony/SignalStrength$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/SignalStrength;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/SignalStrength;->getCellSignalStrengths()Ljava/util/List;
-HSPLandroid/telephony/SignalStrength;->getCellSignalStrengths(Ljava/lang/Class;)Ljava/util/List;
-HSPLandroid/telephony/SignalStrength;->getLevel()I
-HSPLandroid/telephony/SignalStrength;->getPrimary()Landroid/telephony/CellSignalStrength;
-HSPLandroid/telephony/SignalStrength;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/SubscriptionInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/SubscriptionInfo;+]Landroid/os/Parcelable$Creator;Landroid/text/TextUtils$1;]Landroid/telephony/SubscriptionInfo$Builder;Landroid/telephony/SubscriptionInfo$Builder;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/telephony/SubscriptionInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmAreUiccApplicationsEnabled(Landroid/telephony/SubscriptionInfo$Builder;)Z
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmCardId(Landroid/telephony/SubscriptionInfo$Builder;)I
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmCardString(Landroid/telephony/SubscriptionInfo$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmCarrierConfigAccessRules(Landroid/telephony/SubscriptionInfo$Builder;)[Landroid/telephony/UiccAccessRule;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmCarrierId(Landroid/telephony/SubscriptionInfo$Builder;)I
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmCarrierName(Landroid/telephony/SubscriptionInfo$Builder;)Ljava/lang/CharSequence;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmCountryIso(Landroid/telephony/SubscriptionInfo$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmDataRoaming(Landroid/telephony/SubscriptionInfo$Builder;)I
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmDisplayName(Landroid/telephony/SubscriptionInfo$Builder;)Ljava/lang/CharSequence;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmDisplayNameSource(Landroid/telephony/SubscriptionInfo$Builder;)I
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmEhplmns(Landroid/telephony/SubscriptionInfo$Builder;)[Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmGroupOwner(Landroid/telephony/SubscriptionInfo$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmGroupUuid(Landroid/telephony/SubscriptionInfo$Builder;)Landroid/os/ParcelUuid;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmHplmns(Landroid/telephony/SubscriptionInfo$Builder;)[Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmIccId(Landroid/telephony/SubscriptionInfo$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmIconBitmap(Landroid/telephony/SubscriptionInfo$Builder;)Landroid/graphics/Bitmap;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmIconTint(Landroid/telephony/SubscriptionInfo$Builder;)I
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmId(Landroid/telephony/SubscriptionInfo$Builder;)I
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmIsEmbedded(Landroid/telephony/SubscriptionInfo$Builder;)Z
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmIsGroupDisabled(Landroid/telephony/SubscriptionInfo$Builder;)Z
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmIsOpportunistic(Landroid/telephony/SubscriptionInfo$Builder;)Z
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmMcc(Landroid/telephony/SubscriptionInfo$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmMnc(Landroid/telephony/SubscriptionInfo$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmNativeAccessRules(Landroid/telephony/SubscriptionInfo$Builder;)[Landroid/telephony/UiccAccessRule;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmNumber(Landroid/telephony/SubscriptionInfo$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmPortIndex(Landroid/telephony/SubscriptionInfo$Builder;)I
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmProfileClass(Landroid/telephony/SubscriptionInfo$Builder;)I
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmSimSlotIndex(Landroid/telephony/SubscriptionInfo$Builder;)I
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmType(Landroid/telephony/SubscriptionInfo$Builder;)I
-HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmUsageSetting(Landroid/telephony/SubscriptionInfo$Builder;)I
-HSPLandroid/telephony/SubscriptionInfo$Builder;-><init>()V
-HSPLandroid/telephony/SubscriptionInfo$Builder;->build()Landroid/telephony/SubscriptionInfo;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setCardId(I)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setCardString(Ljava/lang/String;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setCarrierConfigAccessRules([Landroid/telephony/UiccAccessRule;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setCarrierId(I)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setCarrierName(Ljava/lang/CharSequence;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setCountryIso(Ljava/lang/String;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setDataRoaming(I)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setDisplayName(Ljava/lang/CharSequence;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setDisplayNameSource(I)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setEhplmns([Ljava/lang/String;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setEmbedded(Z)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setGroupDisabled(Z)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setGroupOwner(Ljava/lang/String;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setGroupUuid(Ljava/lang/String;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setHplmns([Ljava/lang/String;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setIccId(Ljava/lang/String;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setIconTint(I)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setId(I)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setMcc(Ljava/lang/String;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setMnc(Ljava/lang/String;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setNativeAccessRules([Landroid/telephony/UiccAccessRule;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setNumber(Ljava/lang/String;)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setOpportunistic(Z)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setPortIndex(I)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setProfileClass(I)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setSimSlotIndex(I)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setType(I)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setUiccApplicationsEnabled(Z)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo$Builder;->setUsageSetting(I)Landroid/telephony/SubscriptionInfo$Builder;
-HSPLandroid/telephony/SubscriptionInfo;-><init>(ILjava/lang/String;ILjava/lang/CharSequence;Ljava/lang/CharSequence;IILjava/lang/String;ILandroid/graphics/Bitmap;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z[Landroid/telephony/UiccAccessRule;Ljava/lang/String;IZLjava/lang/String;ZIIILjava/lang/String;[Landroid/telephony/UiccAccessRule;Z)V
-HSPLandroid/telephony/SubscriptionInfo;-><init>(ILjava/lang/String;ILjava/lang/CharSequence;Ljava/lang/CharSequence;IILjava/lang/String;ILandroid/graphics/Bitmap;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z[Landroid/telephony/UiccAccessRule;Ljava/lang/String;IZLjava/lang/String;ZIIILjava/lang/String;[Landroid/telephony/UiccAccessRule;ZII)V
-HSPLandroid/telephony/SubscriptionInfo;-><init>(Landroid/telephony/SubscriptionInfo$Builder;)V
-HSPLandroid/telephony/SubscriptionInfo;-><init>(Landroid/telephony/SubscriptionInfo$Builder;Landroid/telephony/SubscriptionInfo-IA;)V
-HSPLandroid/telephony/SubscriptionInfo;->getCarrierId()I
-HSPLandroid/telephony/SubscriptionInfo;->getCarrierName()Ljava/lang/CharSequence;
-HSPLandroid/telephony/SubscriptionInfo;->getCountryIso()Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo;->getDisplayName()Ljava/lang/CharSequence;
-HSPLandroid/telephony/SubscriptionInfo;->getGroupUuid()Landroid/os/ParcelUuid;
-HSPLandroid/telephony/SubscriptionInfo;->getIccId()Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo;->getMcc()I
-HSPLandroid/telephony/SubscriptionInfo;->getMccString()Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo;->getMnc()I
-HSPLandroid/telephony/SubscriptionInfo;->getMncString()Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo;->getNumber()Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionInfo;->getSimSlotIndex()I
-HSPLandroid/telephony/SubscriptionInfo;->getSubscriptionId()I
-HSPLandroid/telephony/SubscriptionInfo;->isEmbedded()Z
-HSPLandroid/telephony/SubscriptionInfo;->isOpportunistic()Z
-HSPLandroid/telephony/SubscriptionInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionManager$$ExternalSyntheticLambda10;->applyOrThrow(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/telephony/SubscriptionManager$$ExternalSyntheticLambda15;->applyOrThrow(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/telephony/SubscriptionManager$$ExternalSyntheticLambda9;->applyOrThrow(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/telephony/SubscriptionManager$IntegerPropertyInvalidatedCache;->query(Ljava/lang/Integer;)Ljava/lang/Object;
-HSPLandroid/telephony/SubscriptionManager$IntegerPropertyInvalidatedCache;->recompute(Ljava/lang/Integer;)Ljava/lang/Object;
-HSPLandroid/telephony/SubscriptionManager$IntegerPropertyInvalidatedCache;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;-><init>()V
-HSPLandroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;-><init>(Landroid/os/Looper;)V
-HSPLandroid/telephony/SubscriptionManager$VoidPropertyInvalidatedCache;->query(Ljava/lang/Void;)Ljava/lang/Object;
-HSPLandroid/telephony/SubscriptionManager$VoidPropertyInvalidatedCache;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/telephony/SubscriptionManager$VoidPropertyInvalidatedCache;->recompute(Ljava/lang/Void;)Ljava/lang/Object;
-HSPLandroid/telephony/SubscriptionManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/telephony/SubscriptionManager;->addOnSubscriptionsChangedListener(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V
-HSPLandroid/telephony/SubscriptionManager;->addOnSubscriptionsChangedListener(Ljava/util/concurrent/Executor;Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V
-HSPLandroid/telephony/SubscriptionManager;->from(Landroid/content/Context;)Landroid/telephony/SubscriptionManager;
-HSPLandroid/telephony/SubscriptionManager;->getActiveDataSubscriptionId()I
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionIdList()[I
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionIdList(Z)[I
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionInfo(I)Landroid/telephony/SubscriptionInfo;
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionInfoCount()I
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionInfoCountMax()I
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionInfoForSimSlotIndex(I)Landroid/telephony/SubscriptionInfo;
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionInfoList()Ljava/util/List;
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionInfoList(Z)Ljava/util/List;
-HSPLandroid/telephony/SubscriptionManager;->getAvailableSubscriptionInfoList()Ljava/util/List;
-HSPLandroid/telephony/SubscriptionManager;->getCompleteActiveSubscriptionIdList()[I
-HSPLandroid/telephony/SubscriptionManager;->getCompleteActiveSubscriptionInfoList()Ljava/util/List;
-HSPLandroid/telephony/SubscriptionManager;->getDefaultDataSubscriptionId()I
-HSPLandroid/telephony/SubscriptionManager;->getDefaultSmsSubscriptionId()I
-HSPLandroid/telephony/SubscriptionManager;->getDefaultSubscriptionId()I
-HSPLandroid/telephony/SubscriptionManager;->getDefaultVoiceSubscriptionId()I
-HSPLandroid/telephony/SubscriptionManager;->getPhoneId(I)I
-HSPLandroid/telephony/SubscriptionManager;->getResourcesForSubId(Landroid/content/Context;I)Landroid/content/res/Resources;
-HSPLandroid/telephony/SubscriptionManager;->getResourcesForSubId(Landroid/content/Context;IZ)Landroid/content/res/Resources;
-HSPLandroid/telephony/SubscriptionManager;->getSlotIndex(I)I
-HSPLandroid/telephony/SubscriptionManager;->getSubId(I)[I
-HSPLandroid/telephony/SubscriptionManager;->getSubscriptionIds(I)[I
-HSPLandroid/telephony/SubscriptionManager;->isSubscriptionVisible(Landroid/telephony/SubscriptionInfo;)Z
-HSPLandroid/telephony/SubscriptionManager;->isUsableSubIdValue(I)Z
-HSPLandroid/telephony/SubscriptionManager;->isValidSlotIndex(I)Z
-HSPLandroid/telephony/SubscriptionManager;->isValidSubscriptionId(I)Z
-HSPLandroid/telephony/SubscriptionPlan$1;->newArray(I)[Landroid/telephony/SubscriptionPlan;
-HSPLandroid/telephony/SubscriptionPlan$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/telephony/TelephonyCallback$IPhoneStateListenerStub;-><init>(Landroid/telephony/TelephonyCallback;Ljava/util/concurrent/Executor;)V
-HSPLandroid/telephony/TelephonyCallback;-><init>()V
-HSPLandroid/telephony/TelephonyCallback;->init(Ljava/util/concurrent/Executor;)V
-HSPLandroid/telephony/TelephonyDisplayInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/TelephonyDisplayInfo;
-HSPLandroid/telephony/TelephonyDisplayInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/TelephonyDisplayInfo;-><init>(II)V
-HSPLandroid/telephony/TelephonyDisplayInfo;->getNetworkType()I
-HSPLandroid/telephony/TelephonyDisplayInfo;->getOverrideNetworkType()I
-HSPLandroid/telephony/TelephonyDisplayInfo;->overrideNetworkTypeToString(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyDisplayInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyDisplayInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/TelephonyFrameworkInitializer$$ExternalSyntheticLambda0;->createService(Landroid/content/Context;)Ljava/lang/Object;
-HSPLandroid/telephony/TelephonyFrameworkInitializer$$ExternalSyntheticLambda1;->createService(Landroid/content/Context;)Ljava/lang/Object;
-HSPLandroid/telephony/TelephonyFrameworkInitializer$$ExternalSyntheticLambda2;->createService(Landroid/content/Context;)Ljava/lang/Object;
-HSPLandroid/telephony/TelephonyFrameworkInitializer;->getTelephonyServiceManager()Landroid/os/TelephonyServiceManager;
-HSPLandroid/telephony/TelephonyFrameworkInitializer;->lambda$registerServiceWrappers$0(Landroid/content/Context;)Landroid/telephony/TelephonyManager;
-HSPLandroid/telephony/TelephonyFrameworkInitializer;->lambda$registerServiceWrappers$1(Landroid/content/Context;)Landroid/telephony/SubscriptionManager;
-HSPLandroid/telephony/TelephonyFrameworkInitializer;->lambda$registerServiceWrappers$2(Landroid/content/Context;)Landroid/telephony/CarrierConfigManager;
-HSPLandroid/telephony/TelephonyFrameworkInitializer;->lambda$registerServiceWrappers$3(Landroid/content/Context;)Landroid/telephony/euicc/EuiccManager;
-HSPLandroid/telephony/TelephonyFrameworkInitializer;->setTelephonyServiceManager(Landroid/os/TelephonyServiceManager;)V
-HSPLandroid/telephony/TelephonyManager$1;-><init>(Landroid/telephony/TelephonyManager;ILjava/lang/String;)V
-HSPLandroid/telephony/TelephonyManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/telephony/TelephonyManager;-><init>(Landroid/content/Context;I)V
-HSPLandroid/telephony/TelephonyManager;->checkCarrierPrivilegesForPackageAnyPhone(Ljava/lang/String;)I
-HSPLandroid/telephony/TelephonyManager;->createForPhoneAccountHandle(Landroid/telecom/PhoneAccountHandle;)Landroid/telephony/TelephonyManager;
-HSPLandroid/telephony/TelephonyManager;->createForSubscriptionId(I)Landroid/telephony/TelephonyManager;
-HSPLandroid/telephony/TelephonyManager;->from(Landroid/content/Context;)Landroid/telephony/TelephonyManager;
-HSPLandroid/telephony/TelephonyManager;->getActiveModemCount()I
-HSPLandroid/telephony/TelephonyManager;->getAttributionTag()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getCallState()I
-HSPLandroid/telephony/TelephonyManager;->getCardIdForDefaultEuicc()I
-HSPLandroid/telephony/TelephonyManager;->getCarrierPrivilegeStatus(I)I
-HSPLandroid/telephony/TelephonyManager;->getCurrentPhoneType()I
-HSPLandroid/telephony/TelephonyManager;->getCurrentPhoneType(I)I
-HSPLandroid/telephony/TelephonyManager;->getCurrentPhoneTypeForSlot(I)I
-HSPLandroid/telephony/TelephonyManager;->getDataEnabled()Z
-HSPLandroid/telephony/TelephonyManager;->getDataEnabled(I)Z
-HSPLandroid/telephony/TelephonyManager;->getDataNetworkType()I
-HSPLandroid/telephony/TelephonyManager;->getDataNetworkType(I)I
-HSPLandroid/telephony/TelephonyManager;->getDefault()Landroid/telephony/TelephonyManager;
-HSPLandroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getGroupIdLevel1()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getITelephony()Lcom/android/internal/telephony/ITelephony;
-HSPLandroid/telephony/TelephonyManager;->getImei()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getImei(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getLine1Number()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getLine1Number(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getLocationData()I
-HSPLandroid/telephony/TelephonyManager;->getMeid()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getMeid(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getMultiSimConfiguration()Landroid/telephony/TelephonyManager$MultiSimVariants;
-HSPLandroid/telephony/TelephonyManager;->getNetworkCountryIso()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getNetworkCountryIso(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getNetworkOperator()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getNetworkOperatorForPhone(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getNetworkOperatorName()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getNetworkOperatorName(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getNetworkType()I
-HSPLandroid/telephony/TelephonyManager;->getNetworkType(I)I
-HSPLandroid/telephony/TelephonyManager;->getNetworkTypeName(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getOpPackageName()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getPhoneCount()I
-HSPLandroid/telephony/TelephonyManager;->getPhoneId()I
-HSPLandroid/telephony/TelephonyManager;->getPhoneType()I
-HSPLandroid/telephony/TelephonyManager;->getPhoneType(I)I
-HSPLandroid/telephony/TelephonyManager;->getRenouncedPermissions()Ljava/util/Set;
-HSPLandroid/telephony/TelephonyManager;->getServiceState()Landroid/telephony/ServiceState;
-HSPLandroid/telephony/TelephonyManager;->getServiceState(I)Landroid/telephony/ServiceState;
-HSPLandroid/telephony/TelephonyManager;->getServiceStateForSubscriber(I)Landroid/telephony/ServiceState;
-HSPLandroid/telephony/TelephonyManager;->getServiceStateForSubscriber(IZZ)Landroid/telephony/ServiceState;
-HSPLandroid/telephony/TelephonyManager;->getSignalStrength()Landroid/telephony/SignalStrength;
-HSPLandroid/telephony/TelephonyManager;->getSimCarrierId()I
-HSPLandroid/telephony/TelephonyManager;->getSimCountryIso()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimCountryIsoForPhone(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimOperator()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimOperatorName()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimOperatorNameForPhone(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimOperatorNumeric()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimOperatorNumeric(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimOperatorNumericForPhone(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimSerialNumber()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimSerialNumber(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimSpecificCarrierId()I
-HSPLandroid/telephony/TelephonyManager;->getSimState()I
-HSPLandroid/telephony/TelephonyManager;->getSimState(I)I
-HSPLandroid/telephony/TelephonyManager;->getSimStateForSlotIndex(I)I
-HSPLandroid/telephony/TelephonyManager;->getSimStateIncludingLoaded()I
-HSPLandroid/telephony/TelephonyManager;->getSlotIndex()I
-HSPLandroid/telephony/TelephonyManager;->getSmsService()Lcom/android/internal/telephony/ISms;
-HSPLandroid/telephony/TelephonyManager;->getSubId()I
-HSPLandroid/telephony/TelephonyManager;->getSubId(I)I
-HSPLandroid/telephony/TelephonyManager;->getSubscriberId()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSubscriberId(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSubscriberInfoService()Lcom/android/internal/telephony/IPhoneSubInfo;
-HSPLandroid/telephony/TelephonyManager;->getSubscriptionId(Landroid/telecom/PhoneAccountHandle;)I
-HSPLandroid/telephony/TelephonyManager;->getSubscriptionService()Lcom/android/internal/telephony/ISub;
-HSPLandroid/telephony/TelephonyManager;->getSupportedModemCount()I
-HSPLandroid/telephony/TelephonyManager;->getTelephonyProperty(ILjava/util/List;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/telephony/TelephonyManager;->getVoiceNetworkType()I
-HSPLandroid/telephony/TelephonyManager;->getVoiceNetworkType(I)I
-HSPLandroid/telephony/TelephonyManager;->hasCarrierPrivileges(I)Z
-HSPLandroid/telephony/TelephonyManager;->isDataCapable()Z
-HSPLandroid/telephony/TelephonyManager;->isDataConnectionAllowed()Z
-HSPLandroid/telephony/TelephonyManager;->isDataEnabled()Z
-HSPLandroid/telephony/TelephonyManager;->isDataEnabledForReason(I)Z
-HSPLandroid/telephony/TelephonyManager;->isDataEnabledForReason(II)Z
-HSPLandroid/telephony/TelephonyManager;->isEmergencyNumber(Ljava/lang/String;)Z
-HSPLandroid/telephony/TelephonyManager;->isNetworkRoaming()Z
-HSPLandroid/telephony/TelephonyManager;->isNetworkRoaming(I)Z
-HSPLandroid/telephony/TelephonyManager;->isSmsCapable()Z
-HSPLandroid/telephony/TelephonyManager;->isVoiceCapable()Z
-HSPLandroid/telephony/TelephonyManager;->listen(Landroid/telephony/PhoneStateListener;I)V
-HSPLandroid/telephony/TelephonyManager;->mergeAttributionAndRenouncedPermissions(Landroid/content/Context;Landroid/content/Context;)Landroid/content/Context;
-HSPLandroid/telephony/TelephonyManager;->registerTelephonyCallback(ILjava/util/concurrent/Executor;Landroid/telephony/TelephonyCallback;)V
-HSPLandroid/telephony/TelephonyManager;->registerTelephonyCallback(Ljava/util/concurrent/Executor;Landroid/telephony/TelephonyCallback;)V
-HSPLandroid/telephony/TelephonyRegistryManager$$ExternalSyntheticLambda0;-><init>()V
-HSPLandroid/telephony/TelephonyRegistryManager$$ExternalSyntheticLambda0;->applyAsInt(Ljava/lang/Object;)I
-HSPLandroid/telephony/TelephonyRegistryManager$$ExternalSyntheticLambda1;-><init>()V
-HSPLandroid/telephony/TelephonyRegistryManager$$ExternalSyntheticLambda1;->applyAsInt(Ljava/lang/Object;)I
-HSPLandroid/telephony/TelephonyRegistryManager$1$$ExternalSyntheticLambda0;-><init>(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V
-HSPLandroid/telephony/TelephonyRegistryManager$1$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/telephony/TelephonyRegistryManager$1;-><init>(Landroid/telephony/TelephonyRegistryManager;Ljava/util/concurrent/Executor;Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V
-HSPLandroid/telephony/TelephonyRegistryManager$1;->lambda$onSubscriptionsChanged$0(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V
-HSPLandroid/telephony/TelephonyRegistryManager$1;->onSubscriptionsChanged()V
-HSPLandroid/telephony/TelephonyRegistryManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/telephony/TelephonyRegistryManager;->addOnSubscriptionsChangedListener(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;Ljava/util/concurrent/Executor;)V
-HSPLandroid/telephony/TelephonyRegistryManager;->getEventsFromBitmask(I)Ljava/util/Set;
-HSPLandroid/telephony/TelephonyRegistryManager;->getEventsFromCallback(Landroid/telephony/TelephonyCallback;)Ljava/util/Set;
-HSPLandroid/telephony/TelephonyRegistryManager;->lambda$listenFromListener$0(Ljava/lang/Integer;)I
-HSPLandroid/telephony/TelephonyRegistryManager;->listenFromCallback(ZZILjava/lang/String;Ljava/lang/String;Landroid/telephony/TelephonyCallback;[IZ)V
-HSPLandroid/telephony/TelephonyRegistryManager;->listenFromListener(IZZLjava/lang/String;Ljava/lang/String;Landroid/telephony/PhoneStateListener;IZ)V
-HSPLandroid/telephony/TelephonyRegistryManager;->registerTelephonyCallback(ZZLjava/util/concurrent/Executor;ILjava/lang/String;Ljava/lang/String;Landroid/telephony/TelephonyCallback;Z)V
-HSPLandroid/telephony/UiccAccessRule$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/UiccAccessRule;
-HSPLandroid/telephony/UiccAccessRule$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/UiccAccessRule$1;->newArray(I)[Landroid/telephony/UiccAccessRule;
-HSPLandroid/telephony/UiccAccessRule$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/VoiceSpecificRegistrationInfo;
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo;-><init>(Landroid/telephony/VoiceSpecificRegistrationInfo;)V
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/data/ApnSetting$Builder;-><init>()V
-HSPLandroid/telephony/data/ApnSetting$Builder;->buildWithoutCheck()Landroid/telephony/data/ApnSetting;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setAlwaysOn(Z)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setApnName(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setApnSetId(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setApnTypeBitmask(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setAuthType(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setCarrierEnabled(Z)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setCarrierId(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setEntryName(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setId(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setLingeringNetworkTypeBitmask(J)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setMaxConns(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setMaxConnsTime(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setMmsProxyAddress(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setMmsProxyPort(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setMmsc(Landroid/net/Uri;)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setModemCognitive(Z)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setMtuV4(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setMtuV6(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setMvnoMatchData(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setMvnoType(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setNetworkTypeBitmask(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setOperatorNumeric(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setPassword(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setProfileId(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setProtocol(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setProxyAddress(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setProxyPort(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setRoamingProtocol(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setSkip464Xlat(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setUser(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setWaitTime(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting;-><init>(Landroid/telephony/data/ApnSetting$Builder;)V
-HSPLandroid/telephony/data/ApnSetting;->UriToString(Landroid/net/Uri;)Ljava/lang/String;
-HSPLandroid/telephony/data/ApnSetting;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/data/ApnSetting;->getApnName()Ljava/lang/String;
-HSPLandroid/telephony/data/ApnSetting;->getApnTypeBitmask()I
-HSPLandroid/telephony/data/ApnSetting;->getApnTypesStringFromBitmask(I)Ljava/lang/String;
-HSPLandroid/telephony/data/ApnSetting;->portToString(I)Ljava/lang/String;
-HSPLandroid/telephony/data/ApnSetting;->toString()Ljava/lang/String;
-HSPLandroid/telephony/euicc/EuiccManager;->getIEuiccController()Lcom/android/internal/telephony/euicc/IEuiccController;
-HSPLandroid/telephony/euicc/EuiccManager;->isEnabled()Z
-HSPLandroid/telephony/ims/ImsMmTelManager;->createForSubscriptionId(I)Landroid/telephony/ims/ImsMmTelManager;
-HSPLandroid/telephony/ims/ImsMmTelManager;->getITelephony()Lcom/android/internal/telephony/ITelephony;
-HSPLandroid/telephony/ims/ImsMmTelManager;->getITelephonyInterface()Lcom/android/internal/telephony/ITelephony;
-HSPLandroid/telephony/ims/ImsMmTelManager;->isAvailable(II)Z
-HSPLandroid/telephony/ims/ImsReasonInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/ims/ImsReasonInfo;
-HSPLandroid/telephony/ims/ImsReasonInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/ims/ImsReasonInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/ims/RegistrationManager$RegistrationCallback$RegistrationBinder;-><init>(Landroid/telephony/ims/RegistrationManager$RegistrationCallback;)V
-HSPLandroid/telephony/ims/RegistrationManager$RegistrationCallback;-><init>()V
-HSPLandroid/telephony/ims/RegistrationManager$RegistrationCallback;->getBinder()Landroid/telephony/ims/aidl/IImsRegistrationCallback;
-HSPLandroid/telephony/ims/RegistrationManager$RegistrationCallback;->setExecutor(Ljava/util/concurrent/Executor;)V
-HSPLandroid/telephony/ims/aidl/IImsRegistrationCallback$Stub;-><init>()V
-HSPLandroid/telephony/ims/aidl/IImsRegistrationCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/text/AndroidBidi;->bidi(I[C[B)I
-HSPLandroid/text/AndroidBidi;->directions(I[BI[CII)Landroid/text/Layout$Directions;
-HSPLandroid/text/AutoGrowArray$ByteArray;-><init>()V
-HSPLandroid/text/AutoGrowArray$ByteArray;-><init>(I)V
-HSPLandroid/text/AutoGrowArray$ByteArray;->clear()V
-HSPLandroid/text/AutoGrowArray$ByteArray;->clearWithReleasingLargeArray()V
-HSPLandroid/text/AutoGrowArray$ByteArray;->get(I)B
-HSPLandroid/text/AutoGrowArray$ByteArray;->getRawArray()[B
-HSPLandroid/text/AutoGrowArray$ByteArray;->resize(I)V
-HSPLandroid/text/AutoGrowArray$FloatArray;-><init>()V
-HSPLandroid/text/AutoGrowArray$FloatArray;-><init>(I)V
-HSPLandroid/text/AutoGrowArray$FloatArray;->clear()V
-HSPLandroid/text/AutoGrowArray$FloatArray;->clearWithReleasingLargeArray()V
-HSPLandroid/text/AutoGrowArray$FloatArray;->ensureCapacity(I)V
-HSPLandroid/text/AutoGrowArray$FloatArray;->getRawArray()[F
-HSPLandroid/text/AutoGrowArray$FloatArray;->resize(I)V
-HSPLandroid/text/AutoGrowArray$IntArray;-><init>(I)V
-HSPLandroid/text/AutoGrowArray$IntArray;->append(I)V
-HSPLandroid/text/AutoGrowArray$IntArray;->clear()V
-HSPLandroid/text/AutoGrowArray$IntArray;->clearWithReleasingLargeArray()V
-HSPLandroid/text/AutoGrowArray$IntArray;->ensureCapacity(I)V
-HSPLandroid/text/AutoGrowArray$IntArray;->getRawArray()[I
-HSPLandroid/text/AutoGrowArray;->computeNewCapacity(II)I
-HSPLandroid/text/BidiFormatter$DirectionalityEstimator;->dirTypeBackward()B
-HSPLandroid/text/BidiFormatter$DirectionalityEstimator;->dirTypeForward()B
-HSPLandroid/text/BidiFormatter$DirectionalityEstimator;->getEntryDir()I
-HSPLandroid/text/BidiFormatter$DirectionalityEstimator;->getExitDir()I
-HSPLandroid/text/BidiFormatter;->getInstance()Landroid/text/BidiFormatter;
-HSPLandroid/text/BidiFormatter;->markAfter(Ljava/lang/CharSequence;Landroid/text/TextDirectionHeuristic;)Ljava/lang/String;
-HSPLandroid/text/BidiFormatter;->markBefore(Ljava/lang/CharSequence;Landroid/text/TextDirectionHeuristic;)Ljava/lang/String;
-HSPLandroid/text/BidiFormatter;->unicodeWrap(Ljava/lang/CharSequence;Landroid/text/TextDirectionHeuristic;Z)Ljava/lang/CharSequence;
-HSPLandroid/text/BoringLayout$Metrics;->-$$Nest$mreset(Landroid/text/BoringLayout$Metrics;)V
-HSPLandroid/text/BoringLayout$Metrics;-><init>()V
-HSPLandroid/text/BoringLayout$Metrics;->reset()V
-HSPLandroid/text/BoringLayout;-><init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)V
-HSPLandroid/text/BoringLayout;-><init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)V
-HSPLandroid/text/BoringLayout;-><init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;IZ)V
-HSPLandroid/text/BoringLayout;->draw(Landroid/graphics/Canvas;Landroid/graphics/Path;Landroid/graphics/Paint;I)V
-HSPLandroid/text/BoringLayout;->ellipsized(II)V
-HSPLandroid/text/BoringLayout;->getEllipsisCount(I)I
-HSPLandroid/text/BoringLayout;->getEllipsisStart(I)I
-HSPLandroid/text/BoringLayout;->getEllipsizedWidth()I
-HSPLandroid/text/BoringLayout;->getHeight()I
-HSPLandroid/text/BoringLayout;->getLineContainsTab(I)Z
-HSPLandroid/text/BoringLayout;->getLineCount()I
-HSPLandroid/text/BoringLayout;->getLineDescent(I)I
-HSPLandroid/text/BoringLayout;->getLineDirections(I)Landroid/text/Layout$Directions;
-HSPLandroid/text/BoringLayout;->getLineMax(I)F
-HSPLandroid/text/BoringLayout;->getLineStart(I)I
-HSPLandroid/text/BoringLayout;->getLineTop(I)I
-HSPLandroid/text/BoringLayout;->getLineWidth(I)F
-HSPLandroid/text/BoringLayout;->getParagraphDirection(I)I
-HSPLandroid/text/BoringLayout;->hasAnyInterestingChars(Ljava/lang/CharSequence;I)Z
-HSPLandroid/text/BoringLayout;->init(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/Layout$Alignment;Landroid/text/BoringLayout$Metrics;ZZZ)V+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Ljava/lang/CharSequence;Ljava/lang/String;
-HSPLandroid/text/BoringLayout;->isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;Landroid/text/BoringLayout$Metrics;)Landroid/text/BoringLayout$Metrics;
-HSPLandroid/text/BoringLayout;->isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;ZLandroid/graphics/Paint$FontMetrics;Landroid/text/BoringLayout$Metrics;)Landroid/text/BoringLayout$Metrics;+]Landroid/text/TextLine;Landroid/text/TextLine;]Landroid/text/Spanned;megamorphic_types]Ljava/lang/CharSequence;megamorphic_types]Landroid/text/TextDirectionHeuristic;Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicLocale;,Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicInternal;
-HSPLandroid/text/BoringLayout;->isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;ZLandroid/text/BoringLayout$Metrics;)Landroid/text/BoringLayout$Metrics;
-HSPLandroid/text/BoringLayout;->isFallbackLineSpacingEnabled()Z
-HSPLandroid/text/BoringLayout;->make(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)Landroid/text/BoringLayout;
-HSPLandroid/text/BoringLayout;->make(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)Landroid/text/BoringLayout;
-HSPLandroid/text/BoringLayout;->replaceOrMake(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)Landroid/text/BoringLayout;
-HSPLandroid/text/BoringLayout;->replaceOrMake(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)Landroid/text/BoringLayout;
-HSPLandroid/text/BoringLayout;->replaceOrMake(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;Landroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;IZ)Landroid/text/BoringLayout;
-HSPLandroid/text/CharSequenceCharacterIterator;->current()C
-HSPLandroid/text/CharSequenceCharacterIterator;->first()C
-HSPLandroid/text/CharSequenceCharacterIterator;->getBeginIndex()I
-HSPLandroid/text/CharSequenceCharacterIterator;->getEndIndex()I
-HSPLandroid/text/CharSequenceCharacterIterator;->getIndex()I
-HSPLandroid/text/CharSequenceCharacterIterator;->next()C
-HSPLandroid/text/CharSequenceCharacterIterator;->setIndex(I)C
-HSPLandroid/text/ClientFlags;->icuBidiMigration()Z
-HSPLandroid/text/DynamicLayout$Builder;->obtain(Ljava/lang/CharSequence;Landroid/text/TextPaint;I)Landroid/text/DynamicLayout$Builder;+]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool;
-HSPLandroid/text/DynamicLayout$ChangeWatcher;->afterTextChanged(Landroid/text/Editable;)V
-HSPLandroid/text/DynamicLayout$ChangeWatcher;->beforeTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroid/text/DynamicLayout$ChangeWatcher;->onSpanAdded(Landroid/text/Spannable;Ljava/lang/Object;II)V
-HSPLandroid/text/DynamicLayout$ChangeWatcher;->onSpanChanged(Landroid/text/Spannable;Ljava/lang/Object;IIII)V
-HSPLandroid/text/DynamicLayout$ChangeWatcher;->onSpanRemoved(Landroid/text/Spannable;Ljava/lang/Object;II)V
-HSPLandroid/text/DynamicLayout$ChangeWatcher;->onTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroid/text/DynamicLayout;-><init>(Landroid/text/DynamicLayout$Builder;)V
-HSPLandroid/text/DynamicLayout;->addBlockAtOffset(I)V+]Landroid/text/DynamicLayout;Landroid/text/DynamicLayout;
-HSPLandroid/text/DynamicLayout;->contentMayProtrudeFromLineTopOrBottom(Ljava/lang/CharSequence;II)Z+]Landroid/text/DynamicLayout;Landroid/text/DynamicLayout;]Landroid/graphics/Paint;Landroid/text/TextPaint;]Landroid/text/Spanned;Landroid/text/SpannableString;
-HSPLandroid/text/DynamicLayout;->createBlocks()V
-HSPLandroid/text/DynamicLayout;->generate(Landroid/text/DynamicLayout$Builder;)V+]Landroid/text/DynamicLayout;Landroid/text/DynamicLayout;]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;]Landroid/text/PackedObjectVector;Landroid/text/PackedObjectVector;]Landroid/text/TextPaint;Landroid/text/TextPaint;]Ljava/lang/CharSequence;Landroid/text/method/ReplacementTransformationMethod$SpannedReplacementCharSequence;,Landroid/text/SpannableStringBuilder;]Landroid/text/Spannable;Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/DynamicLayout;->getBlockEndLines()[I
-HSPLandroid/text/DynamicLayout;->getBlockIndices()[I
-HSPLandroid/text/DynamicLayout;->getBlocksAlwaysNeedToBeRedrawn()Landroid/util/ArraySet;
-HSPLandroid/text/DynamicLayout;->getEllipsisCount(I)I
-HSPLandroid/text/DynamicLayout;->getEllipsisStart(I)I
-HSPLandroid/text/DynamicLayout;->getEllipsizedWidth()I
-HSPLandroid/text/DynamicLayout;->getEndHyphenEdit(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;
-HSPLandroid/text/DynamicLayout;->getIndexFirstChangedBlock()I
-HSPLandroid/text/DynamicLayout;->getLineContainsTab(I)Z+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;
-HSPLandroid/text/DynamicLayout;->getLineCount()I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;
-HSPLandroid/text/DynamicLayout;->getLineDescent(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;
-HSPLandroid/text/DynamicLayout;->getLineDirections(I)Landroid/text/Layout$Directions;+]Landroid/text/PackedObjectVector;Landroid/text/PackedObjectVector;
-HSPLandroid/text/DynamicLayout;->getLineExtra(I)I
-HSPLandroid/text/DynamicLayout;->getLineStart(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;
-HSPLandroid/text/DynamicLayout;->getLineTop(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;
-HSPLandroid/text/DynamicLayout;->getNumberOfBlocks()I
-HSPLandroid/text/DynamicLayout;->getParagraphDirection(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;
-HSPLandroid/text/DynamicLayout;->getStartHyphenEdit(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;
-HSPLandroid/text/DynamicLayout;->reflow(Ljava/lang/CharSequence;III)V+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;]Landroid/text/DynamicLayout;Landroid/text/DynamicLayout;]Landroid/text/PackedObjectVector;Landroid/text/PackedObjectVector;]Landroid/text/StaticLayout;Landroid/text/StaticLayout;]Landroid/text/Spanned;Landroid/text/SpannableString;]Ljava/lang/CharSequence;Landroid/text/SpannableString;]Landroid/text/StaticLayout$Builder;Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/DynamicLayout;->setIndexFirstChangedBlock(I)V
-HSPLandroid/text/DynamicLayout;->updateAlwaysNeedsToBeRedrawn(I)V
-HSPLandroid/text/DynamicLayout;->updateBlocks(III)V
-HSPLandroid/text/Editable$Factory;-><init>()V
-HSPLandroid/text/Editable$Factory;->getInstance()Landroid/text/Editable$Factory;
-HSPLandroid/text/Editable$Factory;->newEditable(Ljava/lang/CharSequence;)Landroid/text/Editable;
-HSPLandroid/text/FontConfig$Font;->getAxes()[Landroid/graphics/fonts/FontVariationAxis;
-HSPLandroid/text/FontConfig$Font;->getTtcIndex()I
-HSPLandroid/text/FontConfig$Font;->getWeight()I
-HSPLandroid/text/FontConfig$Font;->isItalic()Z
-HSPLandroid/text/Html;->fromHtml(Ljava/lang/String;)Landroid/text/Spanned;
-HSPLandroid/text/Html;->fromHtml(Ljava/lang/String;I)Landroid/text/Spanned;
-HSPLandroid/text/Html;->fromHtml(Ljava/lang/String;ILandroid/text/Html$ImageGetter;Landroid/text/Html$TagHandler;)Landroid/text/Spanned;
-HSPLandroid/text/HtmlToSpannedConverter;-><init>(Ljava/lang/String;Landroid/text/Html$ImageGetter;Landroid/text/Html$TagHandler;Lorg/ccil/cowan/tagsoup/Parser;I)V
-HSPLandroid/text/HtmlToSpannedConverter;->characters([CII)V
-HSPLandroid/text/HtmlToSpannedConverter;->convert()Landroid/text/Spanned;
-HSPLandroid/text/HtmlToSpannedConverter;->end(Landroid/text/Editable;Ljava/lang/Class;Ljava/lang/Object;)V
-HSPLandroid/text/HtmlToSpannedConverter;->endA(Landroid/text/Editable;)V
-HSPLandroid/text/HtmlToSpannedConverter;->endDocument()V
-HSPLandroid/text/HtmlToSpannedConverter;->endElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/text/HtmlToSpannedConverter;->endPrefixMapping(Ljava/lang/String;)V
-HSPLandroid/text/HtmlToSpannedConverter;->getLast(Landroid/text/Spanned;Ljava/lang/Class;)Ljava/lang/Object;
-HSPLandroid/text/HtmlToSpannedConverter;->handleBr(Landroid/text/Editable;)V
-HSPLandroid/text/HtmlToSpannedConverter;->handleEndTag(Ljava/lang/String;)V
-HSPLandroid/text/HtmlToSpannedConverter;->handleStartTag(Ljava/lang/String;Lorg/xml/sax/Attributes;)V
-HSPLandroid/text/HtmlToSpannedConverter;->setDocumentLocator(Lorg/xml/sax/Locator;)V
-HSPLandroid/text/HtmlToSpannedConverter;->setSpanFromMark(Landroid/text/Spannable;Ljava/lang/Object;[Ljava/lang/Object;)V
-HSPLandroid/text/HtmlToSpannedConverter;->start(Landroid/text/Editable;Ljava/lang/Object;)V
-HSPLandroid/text/HtmlToSpannedConverter;->startDocument()V
-HSPLandroid/text/HtmlToSpannedConverter;->startElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/xml/sax/Attributes;)V
-HSPLandroid/text/HtmlToSpannedConverter;->startPrefixMapping(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/text/Hyphenator;->init()V
-HSPLandroid/text/InputFilter$LengthFilter;-><init>(I)V
-HSPLandroid/text/InputFilter$LengthFilter;->filter(Ljava/lang/CharSequence;IILandroid/text/Spanned;II)Ljava/lang/CharSequence;
-HSPLandroid/text/InputFilter$LengthFilter;->getMax()I
-HSPLandroid/text/Layout$Alignment;->values()[Landroid/text/Layout$Alignment;
-HSPLandroid/text/Layout$Directions;->getRunCount()I
-HSPLandroid/text/Layout$Directions;->getRunLength(I)I
-HSPLandroid/text/Layout$Directions;->getRunStart(I)I
-HSPLandroid/text/Layout$Directions;->isRunRtl(I)Z
-HSPLandroid/text/Layout$Ellipsizer;-><init>(Ljava/lang/CharSequence;)V
-HSPLandroid/text/Layout$Ellipsizer;->charAt(I)C
-HSPLandroid/text/Layout$Ellipsizer;->getChars(II[CI)V
-HSPLandroid/text/Layout$Ellipsizer;->length()I
-HSPLandroid/text/Layout$HorizontalMeasurementProvider;->init()V
-HSPLandroid/text/Layout$SpannedEllipsizer;->getSpanEnd(Ljava/lang/Object;)I
-HSPLandroid/text/Layout$SpannedEllipsizer;->getSpanFlags(Ljava/lang/Object;)I
-HSPLandroid/text/Layout$SpannedEllipsizer;->getSpanStart(Ljava/lang/Object;)I
-HSPLandroid/text/Layout$SpannedEllipsizer;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;
-HSPLandroid/text/Layout$SpannedEllipsizer;->nextSpanTransition(IILjava/lang/Class;)I
-HSPLandroid/text/Layout;-><init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FF)V
-HSPLandroid/text/Layout;-><init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;Landroid/text/TextDirectionHeuristic;FFZZILandroid/text/TextUtils$TruncateAt;III[I[IILandroid/graphics/text/LineBreakConfig;ZZLandroid/graphics/Paint$FontMetrics;)V
-HSPLandroid/text/Layout;->addSelection(IIIIILandroid/text/Layout$SelectionRectangleConsumer;)V
-HSPLandroid/text/Layout;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/text/Layout;->draw(Landroid/graphics/Canvas;Landroid/graphics/Path;Landroid/graphics/Paint;I)V
-HSPLandroid/text/Layout;->draw(Landroid/graphics/Canvas;Ljava/util/List;Ljava/util/List;Landroid/graphics/Path;Landroid/graphics/Paint;I)V+]Landroid/text/Layout;Landroid/text/BoringLayout;,Landroid/text/StaticLayout;
-HSPLandroid/text/Layout;->drawBackground(Landroid/graphics/Canvas;II)V
-HSPLandroid/text/Layout;->drawText(Landroid/graphics/Canvas;II)V+]Landroid/text/Layout;Landroid/text/BoringLayout;,Landroid/text/StaticLayout;,Landroid/text/DynamicLayout;]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;]Landroid/text/TextLine;Landroid/text/TextLine;]Landroid/text/Spanned;Landroid/text/SpannableString;]Ljava/lang/CharSequence;Landroid/text/SpannableString;
-HSPLandroid/text/Layout;->drawWithoutText(Landroid/graphics/Canvas;Ljava/util/List;Ljava/util/List;Landroid/graphics/Path;Landroid/graphics/Paint;III)V
-HSPLandroid/text/Layout;->ellipsize(III[CILandroid/text/TextUtils$TruncateAt;)V
-HSPLandroid/text/Layout;->getCursorPath(ILandroid/graphics/Path;Ljava/lang/CharSequence;)V
-HSPLandroid/text/Layout;->getDesiredWidth(Ljava/lang/CharSequence;IILandroid/text/TextPaint;)F
-HSPLandroid/text/Layout;->getDesiredWidth(Ljava/lang/CharSequence;Landroid/text/TextPaint;)F
-HSPLandroid/text/Layout;->getEndHyphenEdit(I)I
-HSPLandroid/text/Layout;->getHeight()I
-HSPLandroid/text/Layout;->getHeight(Z)I
-HSPLandroid/text/Layout;->getHorizontal(IZ)F
-HSPLandroid/text/Layout;->getHorizontal(IZIZ)F
-HSPLandroid/text/Layout;->getIndentAdjust(ILandroid/text/Layout$Alignment;)I
-HSPLandroid/text/Layout;->getLineBaseline(I)I
-HSPLandroid/text/Layout;->getLineBottom(I)I
-HSPLandroid/text/Layout;->getLineBottom(IZ)I
-HSPLandroid/text/Layout;->getLineEnd(I)I+]Landroid/text/Layout;Landroid/text/DynamicLayout;,Landroid/text/BoringLayout;,Landroid/text/StaticLayout;
-HSPLandroid/text/Layout;->getLineExtent(ILandroid/text/Layout$TabStops;Z)F
-HSPLandroid/text/Layout;->getLineExtent(IZ)F
-HSPLandroid/text/Layout;->getLineForOffset(I)I+]Landroid/text/Layout;Landroid/text/DynamicLayout;
-HSPLandroid/text/Layout;->getLineForVertical(I)I+]Landroid/text/Layout;Landroid/text/DynamicLayout;,Landroid/text/BoringLayout;
-HSPLandroid/text/Layout;->getLineLeft(I)F
-HSPLandroid/text/Layout;->getLineMax(I)F
-HSPLandroid/text/Layout;->getLineRangeForDraw(Landroid/graphics/Canvas;)J+]Landroid/text/Layout;Landroid/text/BoringLayout;,Landroid/text/StaticLayout;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;
-HSPLandroid/text/Layout;->getLineRight(I)F
-HSPLandroid/text/Layout;->getLineStartPos(III)I
-HSPLandroid/text/Layout;->getLineVisibleEnd(I)I
-HSPLandroid/text/Layout;->getLineWidth(I)F
-HSPLandroid/text/Layout;->getOffsetAtStartOf(I)I
-HSPLandroid/text/Layout;->getOffsetForHorizontal(IF)I
-HSPLandroid/text/Layout;->getOffsetForHorizontal(IFZ)I+]Landroid/text/Layout;Landroid/text/DynamicLayout;]Landroid/text/TextLine;Landroid/text/TextLine;]Landroid/text/Layout$HorizontalMeasurementProvider;Landroid/text/Layout$HorizontalMeasurementProvider;
-HSPLandroid/text/Layout;->getPaint()Landroid/text/TextPaint;
-HSPLandroid/text/Layout;->getParagraphAlignment(I)Landroid/text/Layout$Alignment;+]Landroid/text/Layout;Landroid/text/DynamicLayout;
-HSPLandroid/text/Layout;->getParagraphLeadingMargin(I)I+]Landroid/text/Layout;Landroid/text/DynamicLayout;]Landroid/text/Spanned;missing_types
-HSPLandroid/text/Layout;->getParagraphLeft(I)I
-HSPLandroid/text/Layout;->getParagraphRight(I)I
-HSPLandroid/text/Layout;->getParagraphSpans(Landroid/text/Spanned;IILjava/lang/Class;)[Ljava/lang/Object;+]Landroid/text/Spanned;Landroid/text/SpannableString;
-HSPLandroid/text/Layout;->getPrimaryHorizontal(I)F
-HSPLandroid/text/Layout;->getPrimaryHorizontal(IZ)F
-HSPLandroid/text/Layout;->getSelection(IILandroid/text/Layout$SelectionRectangleConsumer;)V
-HSPLandroid/text/Layout;->getSelectionPath(IILandroid/graphics/Path;)V
-HSPLandroid/text/Layout;->getSpacingAdd()F
-HSPLandroid/text/Layout;->getSpacingMultiplier()F
-HSPLandroid/text/Layout;->getStartHyphenEdit(I)I
-HSPLandroid/text/Layout;->getText()Ljava/lang/CharSequence;
-HSPLandroid/text/Layout;->getTextDirectionHeuristic()Landroid/text/TextDirectionHeuristic;
-HSPLandroid/text/Layout;->getWidth()I
-HSPLandroid/text/Layout;->increaseWidthTo(I)V
-HSPLandroid/text/Layout;->isFallbackLineSpacingEnabled()Z
-HSPLandroid/text/Layout;->isJustificationRequired(I)Z
-HSPLandroid/text/Layout;->isRtlCharAt(I)Z
-HSPLandroid/text/Layout;->primaryIsTrailingPrevious(I)Z
-HSPLandroid/text/Layout;->replaceWith(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FF)V
-HSPLandroid/text/Layout;->shouldClampCursor(I)Z
-HSPLandroid/text/MeasuredParagraph;-><init>()V
-HSPLandroid/text/MeasuredParagraph;->applyMetricsAffectingSpan(Landroid/text/TextPaint;Landroid/graphics/text/LineBreakConfig;[Landroid/text/style/MetricAffectingSpan;[Landroid/text/style/LineBreakConfigSpan;IILandroid/graphics/text/MeasuredText$Builder;Landroid/text/MeasuredParagraph$StyleRunCallback;)V+]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/graphics/text/LineBreakConfig$Builder;Landroid/graphics/text/LineBreakConfig$Builder;]Landroid/text/AutoGrowArray$IntArray;Landroid/text/AutoGrowArray$IntArray;]Landroid/text/style/MetricAffectingSpan;missing_types
-HSPLandroid/text/MeasuredParagraph;->applyStyleRun(IILandroid/text/TextPaint;Landroid/graphics/text/LineBreakConfig;Landroid/graphics/text/MeasuredText$Builder;Landroid/text/MeasuredParagraph$StyleRunCallback;)V+]Landroid/text/AutoGrowArray$FloatArray;Landroid/text/AutoGrowArray$FloatArray;]Landroid/graphics/text/MeasuredText$Builder;Landroid/graphics/text/MeasuredText$Builder;]Landroid/text/AutoGrowArray$ByteArray;Landroid/text/AutoGrowArray$ByteArray;]Landroid/text/TextPaint;Landroid/text/TextPaint;
-HSPLandroid/text/MeasuredParagraph;->breakText(IZF)I
-HSPLandroid/text/MeasuredParagraph;->buildForBidi(Ljava/lang/CharSequence;IILandroid/text/TextDirectionHeuristic;Landroid/text/MeasuredParagraph;)Landroid/text/MeasuredParagraph;
-HSPLandroid/text/MeasuredParagraph;->buildForMeasurement(Landroid/text/TextPaint;Ljava/lang/CharSequence;IILandroid/text/TextDirectionHeuristic;Landroid/text/MeasuredParagraph;)Landroid/text/MeasuredParagraph;
-HSPLandroid/text/MeasuredParagraph;->getCharWidthAt(I)F
-HSPLandroid/text/MeasuredParagraph;->getChars()[C
-HSPLandroid/text/MeasuredParagraph;->getDirections(II)Landroid/text/Layout$Directions;
-HSPLandroid/text/MeasuredParagraph;->getFontMetrics()Landroid/text/AutoGrowArray$IntArray;
-HSPLandroid/text/MeasuredParagraph;->getMeasuredText()Landroid/graphics/text/MeasuredText;
-HSPLandroid/text/MeasuredParagraph;->getParagraphDir()I
-HSPLandroid/text/MeasuredParagraph;->getSpanEndCache()Landroid/text/AutoGrowArray$IntArray;
-HSPLandroid/text/MeasuredParagraph;->getWholeWidth()F
-HSPLandroid/text/MeasuredParagraph;->obtain()Landroid/text/MeasuredParagraph;
-HSPLandroid/text/MeasuredParagraph;->recycle()V
-HSPLandroid/text/MeasuredParagraph;->release()V
-HSPLandroid/text/MeasuredParagraph;->reset()V
-HSPLandroid/text/MeasuredParagraph;->resetAndAnalyzeBidi(Ljava/lang/CharSequence;IILandroid/text/TextDirectionHeuristic;)V
-HSPLandroid/text/PackedIntVector;->adjustValuesBelow(III)V
-HSPLandroid/text/PackedIntVector;->deleteAt(II)V
-HSPLandroid/text/PackedIntVector;->getValue(II)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;
-HSPLandroid/text/PackedIntVector;->growBuffer()V
-HSPLandroid/text/PackedIntVector;->insertAt(I[I)V+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;
-HSPLandroid/text/PackedIntVector;->moveRowGapTo(I)V
-HSPLandroid/text/PackedIntVector;->moveValueGapTo(II)V
-HSPLandroid/text/PackedIntVector;->size()I
-HSPLandroid/text/PackedIntVector;->width()I
-HSPLandroid/text/PackedObjectVector;->deleteAt(II)V
-HSPLandroid/text/PackedObjectVector;->getValue(II)Ljava/lang/Object;
-HSPLandroid/text/PackedObjectVector;->growBuffer()V
-HSPLandroid/text/PackedObjectVector;->insertAt(I[Ljava/lang/Object;)V+]Landroid/text/PackedObjectVector;Landroid/text/PackedObjectVector;
-HSPLandroid/text/PackedObjectVector;->moveRowGapTo(I)V
-HSPLandroid/text/PackedObjectVector;->setValue(IILjava/lang/Object;)V
-HSPLandroid/text/PackedObjectVector;->size()I
-HSPLandroid/text/PrecomputedText$ParagraphInfo;-><init>(ILandroid/text/MeasuredParagraph;)V
-HSPLandroid/text/PrecomputedText$Params;-><init>(Landroid/text/TextPaint;Landroid/graphics/text/LineBreakConfig;Landroid/text/TextDirectionHeuristic;II)V
-HSPLandroid/text/PrecomputedText$Params;->getBreakStrategy()I
-HSPLandroid/text/PrecomputedText$Params;->getHyphenationFrequency()I
-HSPLandroid/text/PrecomputedText$Params;->getTextDirection()Landroid/text/TextDirectionHeuristic;
-HSPLandroid/text/PrecomputedText$Params;->getTextPaint()Landroid/text/TextPaint;
-HSPLandroid/text/Selection;->getSelectionEnd(Ljava/lang/CharSequence;)I
-HSPLandroid/text/Selection;->getSelectionStart(Ljava/lang/CharSequence;)I+]Landroid/text/Spanned;missing_types
-HSPLandroid/text/Selection;->removeMemory(Landroid/text/Spannable;)V
-HSPLandroid/text/Selection;->removeSelection(Landroid/text/Spannable;)V
-HSPLandroid/text/Selection;->setSelection(Landroid/text/Spannable;I)V
-HSPLandroid/text/Selection;->setSelection(Landroid/text/Spannable;II)V
-HSPLandroid/text/Selection;->setSelection(Landroid/text/Spannable;III)V
-HSPLandroid/text/Selection;->updateMemory(Landroid/text/Spannable;I)V
-HSPLandroid/text/SpanSet;-><init>(Ljava/lang/Class;)V
-HSPLandroid/text/SpanSet;->getNextTransition(II)I
-HSPLandroid/text/SpanSet;->hasSpansIntersecting(II)Z
-HSPLandroid/text/SpanSet;->init(Landroid/text/Spanned;II)V+]Landroid/text/Spanned;Landroid/text/SpannableString;
-HSPLandroid/text/SpanSet;->recycle()V
-HSPLandroid/text/Spannable$Factory;->getInstance()Landroid/text/Spannable$Factory;
-HSPLandroid/text/Spannable$Factory;->newSpannable(Ljava/lang/CharSequence;)Landroid/text/Spannable;
-HSPLandroid/text/SpannableString;-><init>(Ljava/lang/CharSequence;)V
-HSPLandroid/text/SpannableString;-><init>(Ljava/lang/CharSequence;Z)V
-HSPLandroid/text/SpannableString;->equals(Ljava/lang/Object;)Z
-HSPLandroid/text/SpannableString;->getSpanEnd(Ljava/lang/Object;)I
-HSPLandroid/text/SpannableString;->getSpanFlags(Ljava/lang/Object;)I
-HSPLandroid/text/SpannableString;->getSpanStart(Ljava/lang/Object;)I
-HSPLandroid/text/SpannableString;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;
-HSPLandroid/text/SpannableString;->nextSpanTransition(IILjava/lang/Class;)I
-HSPLandroid/text/SpannableString;->removeSpan(Ljava/lang/Object;)V
-HSPLandroid/text/SpannableString;->removeSpan(Ljava/lang/Object;I)V
-HSPLandroid/text/SpannableString;->setSpan(Ljava/lang/Object;III)V
-HSPLandroid/text/SpannableString;->subSequence(II)Ljava/lang/CharSequence;
-HSPLandroid/text/SpannableString;->valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannableString;
-HSPLandroid/text/SpannableStringBuilder;-><init>()V
-HSPLandroid/text/SpannableStringBuilder;-><init>(Ljava/lang/CharSequence;)V+]Ljava/lang/CharSequence;missing_types
-HSPLandroid/text/SpannableStringBuilder;-><init>(Ljava/lang/CharSequence;II)V
-HSPLandroid/text/SpannableStringBuilder;->append(C)Landroid/text/Editable;
-HSPLandroid/text/SpannableStringBuilder;->append(C)Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannableStringBuilder;->append(Ljava/lang/CharSequence;)Landroid/text/Editable;
-HSPLandroid/text/SpannableStringBuilder;->append(Ljava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;+]Ljava/lang/CharSequence;Ljava/lang/String;,Landroid/text/SpannedString;,Landroid/text/SpannableStringBuilder;,Landroid/text/SpannableString;]Landroid/text/SpannableStringBuilder;Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannableStringBuilder;->append(Ljava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannableStringBuilder;->calcMax(I)I
-HSPLandroid/text/SpannableStringBuilder;->change(IILjava/lang/CharSequence;II)V+]Landroid/text/Spanned;Landroid/text/SpannedString;,Landroid/text/SpannableStringBuilder;,Landroid/text/SpannableString;]Landroid/text/SpannableStringBuilder;Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannableStringBuilder;->charAt(I)C
-HSPLandroid/text/SpannableStringBuilder;->checkRange(Ljava/lang/String;II)V+]Landroid/text/SpannableStringBuilder;missing_types
-HSPLandroid/text/SpannableStringBuilder;->checkSortBuffer([II)[I
-HSPLandroid/text/SpannableStringBuilder;->clear()V
-HSPLandroid/text/SpannableStringBuilder;->compareSpans(II[I[I)I
-HSPLandroid/text/SpannableStringBuilder;->countSpans(IILjava/lang/Class;I)I+]Ljava/lang/Class;Ljava/lang/Class;
-HSPLandroid/text/SpannableStringBuilder;->delete(II)Landroid/text/Editable;
-HSPLandroid/text/SpannableStringBuilder;->delete(II)Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannableStringBuilder;->drawTextRun(Landroid/graphics/BaseCanvas;IIIIFFZLandroid/graphics/Paint;)V
-HSPLandroid/text/SpannableStringBuilder;->equals(Ljava/lang/Object;)Z
-HSPLandroid/text/SpannableStringBuilder;->getChars(II[CI)V
-HSPLandroid/text/SpannableStringBuilder;->getSpanEnd(Ljava/lang/Object;)I+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap;
-HSPLandroid/text/SpannableStringBuilder;->getSpanFlags(Ljava/lang/Object;)I+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap;
-HSPLandroid/text/SpannableStringBuilder;->getSpanStart(Ljava/lang/Object;)I+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap;
-HSPLandroid/text/SpannableStringBuilder;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;+]Landroid/text/SpannableStringBuilder;missing_types
-HSPLandroid/text/SpannableStringBuilder;->getSpans(IILjava/lang/Class;Z)[Ljava/lang/Object;
-HSPLandroid/text/SpannableStringBuilder;->getSpansRec(IILjava/lang/Class;I[Ljava/lang/Object;[I[IIZ)I+]Ljava/lang/Class;Ljava/lang/Class;
-HSPLandroid/text/SpannableStringBuilder;->getTextWatcherDepth()I
-HSPLandroid/text/SpannableStringBuilder;->hasNonExclusiveExclusiveSpanAt(Ljava/lang/CharSequence;I)Z
-HSPLandroid/text/SpannableStringBuilder;->insert(ILjava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannableStringBuilder;->invalidateIndex(I)V
-HSPLandroid/text/SpannableStringBuilder;->isInvalidParagraph(II)Z
-HSPLandroid/text/SpannableStringBuilder;->leftChild(I)I
-HSPLandroid/text/SpannableStringBuilder;->length()I
-HSPLandroid/text/SpannableStringBuilder;->moveGapTo(I)V
-HSPLandroid/text/SpannableStringBuilder;->nextSpanTransition(IILjava/lang/Class;)I
-HSPLandroid/text/SpannableStringBuilder;->nextSpanTransitionRec(IILjava/lang/Class;I)I
-HSPLandroid/text/SpannableStringBuilder;->obtain(I)[I
-HSPLandroid/text/SpannableStringBuilder;->recycle([I)V
-HSPLandroid/text/SpannableStringBuilder;->removeSpan(II)V
-HSPLandroid/text/SpannableStringBuilder;->removeSpan(Ljava/lang/Object;)V
-HSPLandroid/text/SpannableStringBuilder;->removeSpan(Ljava/lang/Object;I)V
-HSPLandroid/text/SpannableStringBuilder;->removeSpansForChange(IIZI)Z
-HSPLandroid/text/SpannableStringBuilder;->replace(IILjava/lang/CharSequence;)Landroid/text/Editable;
-HSPLandroid/text/SpannableStringBuilder;->replace(IILjava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannableStringBuilder;->replace(IILjava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;+]Landroid/text/SpannableStringBuilder;Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannableStringBuilder;->resizeFor(I)V
-HSPLandroid/text/SpannableStringBuilder;->resolveGap(I)I
-HSPLandroid/text/SpannableStringBuilder;->restoreInvariants()V+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap;
-HSPLandroid/text/SpannableStringBuilder;->rightChild(I)I
-HSPLandroid/text/SpannableStringBuilder;->sendAfterTextChanged([Landroid/text/TextWatcher;)V
-HSPLandroid/text/SpannableStringBuilder;->sendBeforeTextChanged([Landroid/text/TextWatcher;III)V
-HSPLandroid/text/SpannableStringBuilder;->sendSpanAdded(Ljava/lang/Object;II)V+]Landroid/text/SpannableStringBuilder;Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannableStringBuilder;->sendSpanChanged(Ljava/lang/Object;IIII)V
-HSPLandroid/text/SpannableStringBuilder;->sendSpanRemoved(Ljava/lang/Object;II)V
-HSPLandroid/text/SpannableStringBuilder;->sendTextChanged([Landroid/text/TextWatcher;III)V
-HSPLandroid/text/SpannableStringBuilder;->sendToSpanWatchers(III)V
-HSPLandroid/text/SpannableStringBuilder;->setFilters([Landroid/text/InputFilter;)V
-HSPLandroid/text/SpannableStringBuilder;->setSpan(Ljava/lang/Object;III)V
-HSPLandroid/text/SpannableStringBuilder;->setSpan(ZLjava/lang/Object;IIIZ)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap;
-HSPLandroid/text/SpannableStringBuilder;->siftDown(I[Ljava/lang/Object;I[I[I)V
-HSPLandroid/text/SpannableStringBuilder;->sort([Ljava/lang/Object;[I[I)V
-HSPLandroid/text/SpannableStringBuilder;->subSequence(II)Ljava/lang/CharSequence;
-HSPLandroid/text/SpannableStringBuilder;->toString()Ljava/lang/String;+]Landroid/text/SpannableStringBuilder;Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannableStringBuilder;->treeRoot()I
-HSPLandroid/text/SpannableStringBuilder;->updatedIntervalBound(IIIIZZ)I
-HSPLandroid/text/SpannableStringInternal;-><init>(Ljava/lang/CharSequence;IIZ)V+]Ljava/lang/CharSequence;Ljava/lang/String;,Landroid/text/SpannedString;,Landroid/text/SpannableStringBuilder;,Landroid/text/SpannableString;
-HSPLandroid/text/SpannableStringInternal;->charAt(I)C+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/text/SpannableStringInternal;->checkRange(Ljava/lang/String;II)V+]Landroid/text/SpannableStringInternal;Landroid/text/SpannedString;,Landroid/text/SpannableString;
-HSPLandroid/text/SpannableStringInternal;->copySpansFromInternal(Landroid/text/SpannableStringInternal;IIZ)V+]Landroid/text/SpannableStringInternal;Landroid/text/SpannedString;,Landroid/text/SpannableString;
-HSPLandroid/text/SpannableStringInternal;->copySpansFromSpanned(Landroid/text/Spanned;IIZ)V+]Landroid/text/Spanned;Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannableStringInternal;->equals(Ljava/lang/Object;)Z
-HSPLandroid/text/SpannableStringInternal;->getChars(II[CI)V+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/text/SpannableStringInternal;->getSpanEnd(Ljava/lang/Object;)I
-HSPLandroid/text/SpannableStringInternal;->getSpanFlags(Ljava/lang/Object;)I
-HSPLandroid/text/SpannableStringInternal;->getSpanStart(Ljava/lang/Object;)I
-HSPLandroid/text/SpannableStringInternal;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/text/SpannableStringInternal;Landroid/text/SpannableString;
-HSPLandroid/text/SpannableStringInternal;->length()I+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/text/SpannableStringInternal;->nextSpanTransition(IILjava/lang/Class;)I
-HSPLandroid/text/SpannableStringInternal;->removeSpan(Ljava/lang/Object;I)V
-HSPLandroid/text/SpannableStringInternal;->sendSpanAdded(Ljava/lang/Object;II)V+]Landroid/text/SpanWatcher;Landroid/text/DynamicLayout$ChangeWatcher;,Landroid/widget/Editor$SpanController;,Landroid/widget/TextView$ChangeWatcher;]Landroid/text/SpannableStringInternal;Landroid/text/SpannableString;
-HSPLandroid/text/SpannableStringInternal;->sendSpanChanged(Ljava/lang/Object;IIII)V
-HSPLandroid/text/SpannableStringInternal;->setSpan(Ljava/lang/Object;III)V
-HSPLandroid/text/SpannableStringInternal;->setSpan(Ljava/lang/Object;IIIZ)V
-HSPLandroid/text/SpannableStringInternal;->toString()Ljava/lang/String;
-HSPLandroid/text/SpannedString;-><init>(Ljava/lang/CharSequence;)V
-HSPLandroid/text/SpannedString;-><init>(Ljava/lang/CharSequence;Z)V+]Ljava/lang/CharSequence;Ljava/lang/String;,Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannedString;->equals(Ljava/lang/Object;)Z
-HSPLandroid/text/SpannedString;->getSpanEnd(Ljava/lang/Object;)I
-HSPLandroid/text/SpannedString;->getSpanFlags(Ljava/lang/Object;)I
-HSPLandroid/text/SpannedString;->getSpanStart(Ljava/lang/Object;)I
-HSPLandroid/text/SpannedString;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;
-HSPLandroid/text/SpannedString;->nextSpanTransition(IILjava/lang/Class;)I
-HSPLandroid/text/SpannedString;->subSequence(II)Ljava/lang/CharSequence;
-HSPLandroid/text/SpannedString;->valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannedString;
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmAddLastLineLineSpacing(Landroid/text/StaticLayout$Builder;)Z
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmBreakStrategy(Landroid/text/StaticLayout$Builder;)I
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmEllipsize(Landroid/text/StaticLayout$Builder;)Landroid/text/TextUtils$TruncateAt;
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmEllipsizedWidth(Landroid/text/StaticLayout$Builder;)I
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmEnd(Landroid/text/StaticLayout$Builder;)I
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmFallbackLineSpacing(Landroid/text/StaticLayout$Builder;)Z
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmFontMetricsInt(Landroid/text/StaticLayout$Builder;)Landroid/graphics/Paint$FontMetricsInt;
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmHyphenationFrequency(Landroid/text/StaticLayout$Builder;)I
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmIncludePad(Landroid/text/StaticLayout$Builder;)Z
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmJustificationMode(Landroid/text/StaticLayout$Builder;)I
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmLineBreakConfig(Landroid/text/StaticLayout$Builder;)Landroid/graphics/text/LineBreakConfig;
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmPaint(Landroid/text/StaticLayout$Builder;)Landroid/text/TextPaint;
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmSpacingAdd(Landroid/text/StaticLayout$Builder;)F
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmSpacingMult(Landroid/text/StaticLayout$Builder;)F
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmStart(Landroid/text/StaticLayout$Builder;)I
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmText(Landroid/text/StaticLayout$Builder;)Ljava/lang/CharSequence;
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmTextDir(Landroid/text/StaticLayout$Builder;)Landroid/text/TextDirectionHeuristic;
-HSPLandroid/text/StaticLayout$Builder;->-$$Nest$fgetmWidth(Landroid/text/StaticLayout$Builder;)I
-HSPLandroid/text/StaticLayout$Builder;-><init>()V
-HSPLandroid/text/StaticLayout$Builder;->build()Landroid/text/StaticLayout;
-HSPLandroid/text/StaticLayout$Builder;->obtain(Ljava/lang/CharSequence;IILandroid/text/TextPaint;I)Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/StaticLayout$Builder;->recycle(Landroid/text/StaticLayout$Builder;)V
-HSPLandroid/text/StaticLayout$Builder;->setAlignment(Landroid/text/Layout$Alignment;)Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/StaticLayout$Builder;->setBreakStrategy(I)Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/StaticLayout$Builder;->setEllipsize(Landroid/text/TextUtils$TruncateAt;)Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/StaticLayout$Builder;->setEllipsizedWidth(I)Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/StaticLayout$Builder;->setHyphenationFrequency(I)Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/StaticLayout$Builder;->setIncludePad(Z)Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/StaticLayout$Builder;->setIndents([I[I)Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/StaticLayout$Builder;->setJustificationMode(I)Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/StaticLayout$Builder;->setLineSpacing(FF)Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/StaticLayout$Builder;->setMaxLines(I)Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/StaticLayout$Builder;->setTextDirection(Landroid/text/TextDirectionHeuristic;)Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/StaticLayout$Builder;->setUseLineSpacingFromFallbacks(Z)Landroid/text/StaticLayout$Builder;
-HSPLandroid/text/StaticLayout;-><init>(Landroid/text/StaticLayout$Builder;ZI)V+]Landroid/text/StaticLayout;Landroid/text/StaticLayout;
-HSPLandroid/text/StaticLayout;->calculateEllipsis(IILandroid/text/MeasuredParagraph;IFLandroid/text/TextUtils$TruncateAt;IFLandroid/text/TextPaint;Z)V
-HSPLandroid/text/StaticLayout;->generate(Landroid/text/StaticLayout$Builder;ZZ)V+]Landroid/text/MeasuredParagraph;Landroid/text/MeasuredParagraph;]Landroid/graphics/text/LineBreaker$Builder;Landroid/graphics/text/LineBreaker$Builder;]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/graphics/text/LineBreaker;Landroid/graphics/text/LineBreaker;]Ljava/lang/CharSequence;Landroid/text/SpannableString;]Landroid/graphics/text/LineBreaker$ParagraphConstraints;Landroid/graphics/text/LineBreaker$ParagraphConstraints;]Landroid/graphics/text/LineBreaker$Result;Landroid/graphics/text/LineBreaker$Result;]Landroid/text/AutoGrowArray$IntArray;Landroid/text/AutoGrowArray$IntArray;
-HSPLandroid/text/StaticLayout;->getBottomPadding()I
-HSPLandroid/text/StaticLayout;->getEllipsisCount(I)I
-HSPLandroid/text/StaticLayout;->getEllipsisStart(I)I
-HSPLandroid/text/StaticLayout;->getEndHyphenEdit(I)I
-HSPLandroid/text/StaticLayout;->getHeight(Z)I
-HSPLandroid/text/StaticLayout;->getIndentAdjust(ILandroid/text/Layout$Alignment;)I
-HSPLandroid/text/StaticLayout;->getLineContainsTab(I)Z
-HSPLandroid/text/StaticLayout;->getLineCount()I
-HSPLandroid/text/StaticLayout;->getLineDescent(I)I
-HSPLandroid/text/StaticLayout;->getLineDirections(I)Landroid/text/Layout$Directions;+]Landroid/text/StaticLayout;Landroid/text/StaticLayout;
-HSPLandroid/text/StaticLayout;->getLineExtra(I)I
-HSPLandroid/text/StaticLayout;->getLineForVertical(I)I
-HSPLandroid/text/StaticLayout;->getLineStart(I)I
-HSPLandroid/text/StaticLayout;->getLineTop(I)I
-HSPLandroid/text/StaticLayout;->getParagraphDirection(I)I
-HSPLandroid/text/StaticLayout;->getStartHyphenEdit(I)I
-HSPLandroid/text/StaticLayout;->getTopPadding()I
-HSPLandroid/text/StaticLayout;->getTotalInsets(I)F
-HSPLandroid/text/StaticLayout;->out(Ljava/lang/CharSequence;IIIIIIIFF[Landroid/text/style/LineHeightSpan;[ILandroid/graphics/Paint$FontMetricsInt;ZIZLandroid/text/MeasuredParagraph;IZZZ[CILandroid/text/TextUtils$TruncateAt;FFLandroid/text/TextPaint;Z)I+]Landroid/text/MeasuredParagraph;Landroid/text/MeasuredParagraph;]Ljava/lang/CharSequence;Landroid/text/SpannableString;
-HSPLandroid/text/StaticLayout;->packHyphenEdit(II)I
-HSPLandroid/text/StaticLayout;->unpackEndHyphenEdit(I)I
-HSPLandroid/text/StaticLayout;->unpackStartHyphenEdit(I)I
-HSPLandroid/text/TextDirectionHeuristics$FirstStrong;->checkRtl(Ljava/lang/CharSequence;II)I
-HSPLandroid/text/TextDirectionHeuristics$TextDirectionHeuristicImpl;->doCheck(Ljava/lang/CharSequence;II)Z
-HSPLandroid/text/TextDirectionHeuristics$TextDirectionHeuristicImpl;->isRtl(Ljava/lang/CharSequence;II)Z
-HSPLandroid/text/TextDirectionHeuristics$TextDirectionHeuristicImpl;->isRtl([CII)Z
-HSPLandroid/text/TextDirectionHeuristics$TextDirectionHeuristicInternal;->defaultIsRtl()Z
-HSPLandroid/text/TextDirectionHeuristics$TextDirectionHeuristicLocale;->defaultIsRtl()Z
-HSPLandroid/text/TextDirectionHeuristics;->isRtlCodePoint(I)I
-HSPLandroid/text/TextFlags;->getKeyForFlag(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLandroid/text/TextFlags;->isFeatureEnabled(Ljava/lang/String;)Z
-HSPLandroid/text/TextLine$DecorationInfo;-><init>()V
-HSPLandroid/text/TextLine$DecorationInfo;->copyInfo()Landroid/text/TextLine$DecorationInfo;
-HSPLandroid/text/TextLine$DecorationInfo;->hasDecoration()Z
-HSPLandroid/text/TextLine;-><init>()V
-HSPLandroid/text/TextLine;->adjustEndHyphenEdit(II)I
-HSPLandroid/text/TextLine;->adjustStartHyphenEdit(II)I
-HSPLandroid/text/TextLine;->draw(Landroid/graphics/Canvas;FIII)V+]Landroid/text/Layout$Directions;Landroid/text/Layout$Directions;
-HSPLandroid/text/TextLine;->drawStroke(Landroid/text/TextPaint;Landroid/graphics/Canvas;IFFFFF)V
-HSPLandroid/text/TextLine;->drawTextRun(Landroid/graphics/Canvas;Landroid/text/TextPaint;IIIIZFI)V+]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;
-HSPLandroid/text/TextLine;->equalAttributes(Landroid/text/TextPaint;Landroid/text/TextPaint;)Z
-HSPLandroid/text/TextLine;->expandMetricsFromPaint(Landroid/graphics/Paint$FontMetricsInt;Landroid/text/TextPaint;)V
-HSPLandroid/text/TextLine;->expandMetricsFromPaint(Landroid/text/TextPaint;IIIIZLandroid/graphics/Paint$FontMetricsInt;)V+]Landroid/text/TextPaint;Landroid/text/TextPaint;
-HSPLandroid/text/TextLine;->extractDecorationInfo(Landroid/text/TextPaint;Landroid/text/TextLine$DecorationInfo;)V+]Landroid/text/TextPaint;Landroid/text/TextPaint;
-HSPLandroid/text/TextLine;->getOffsetBeforeAfter(IIIZIZ)I+]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/text/Spanned;Landroid/text/SpannableString;
-HSPLandroid/text/TextLine;->getOffsetToLeftRightOf(IZ)I
-HSPLandroid/text/TextLine;->getRunAdvance(Landroid/text/TextPaint;IIIIZI[FILandroid/graphics/RectF;Landroid/text/TextLine$LineInfo;)F+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Landroid/text/PrecomputedText;Landroid/text/PrecomputedText;]Landroid/text/TextPaint;Landroid/text/TextPaint;
-HSPLandroid/text/TextLine;->handleReplacement(Landroid/text/style/ReplacementSpan;Landroid/text/TextPaint;IIZLandroid/graphics/Canvas;FIIILandroid/graphics/Paint$FontMetricsInt;Z)F
-HSPLandroid/text/TextLine;->handleRun(IIIZLandroid/graphics/Canvas;Landroid/text/TextShaper$GlyphsConsumer;FIIILandroid/graphics/Paint$FontMetricsInt;Landroid/graphics/RectF;Z[FILandroid/text/TextLine$LineInfo;I)F+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Landroid/text/style/MetricAffectingSpan;megamorphic_types]Landroid/text/style/CharacterStyle;megamorphic_types]Landroid/text/TextPaint;missing_types]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/text/TextLine$DecorationInfo;Landroid/text/TextLine$DecorationInfo;]Landroid/text/SpanSet;Landroid/text/SpanSet;
-HSPLandroid/text/TextLine;->handleText(Landroid/text/TextPaint;IIIIZLandroid/graphics/Canvas;Landroid/text/TextShaper$GlyphsConsumer;FIIILandroid/graphics/Paint$FontMetricsInt;Landroid/graphics/RectF;ZILjava/util/ArrayList;[FILandroid/text/TextLine$LineInfo;I)F+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Landroid/text/TextPaint;Landroid/text/TextPaint;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;,Landroid/graphics/Canvas;,Landroid/view/Surface$CompatibleCanvas;
-HSPLandroid/text/TextLine;->isLineEndSpace(C)Z
-HSPLandroid/text/TextLine;->measure(IZLandroid/graphics/Paint$FontMetricsInt;Landroid/graphics/RectF;Landroid/text/TextLine$LineInfo;)F+]Landroid/text/Layout$Directions;Landroid/text/Layout$Directions;]Landroid/text/TextLine;Landroid/text/TextLine;
-HSPLandroid/text/TextLine;->obtain()Landroid/text/TextLine;
-HSPLandroid/text/TextLine;->recycle(Landroid/text/TextLine;)Landroid/text/TextLine;+]Landroid/text/SpanSet;Landroid/text/SpanSet;
-HSPLandroid/text/TextLine;->set(Landroid/text/TextPaint;Ljava/lang/CharSequence;IIILandroid/text/Layout$Directions;ZLandroid/text/Layout$TabStops;IIZ)V+]Landroid/text/SpanSet;Landroid/text/SpanSet;
-HSPLandroid/text/TextLine;->updateMetrics(Landroid/graphics/Paint$FontMetricsInt;IIIII)V
-HSPLandroid/text/TextPaint;-><init>()V
-HSPLandroid/text/TextPaint;-><init>(I)V
-HSPLandroid/text/TextPaint;-><init>(Landroid/graphics/Paint;)V
-HSPLandroid/text/TextPaint;->getUnderlineThickness()F
-HSPLandroid/text/TextPaint;->set(Landroid/text/TextPaint;)V
-HSPLandroid/text/TextPaint;->setUnderlineText(IF)V
-HSPLandroid/text/TextUtils$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/CharSequence;+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/text/TextUtils$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/text/TextUtils$1;Landroid/text/TextUtils$1;
-HSPLandroid/text/TextUtils$SimpleStringSplitter;-><init>(C)V
-HSPLandroid/text/TextUtils$SimpleStringSplitter;->hasNext()Z
-HSPLandroid/text/TextUtils$SimpleStringSplitter;->iterator()Ljava/util/Iterator;
-HSPLandroid/text/TextUtils$SimpleStringSplitter;->next()Ljava/lang/Object;
-HSPLandroid/text/TextUtils$SimpleStringSplitter;->next()Ljava/lang/String;
-HSPLandroid/text/TextUtils$SimpleStringSplitter;->setString(Ljava/lang/String;)V
-HSPLandroid/text/TextUtils$StringWithRemovedChars;->toString()Ljava/lang/String;
-HSPLandroid/text/TextUtils;->concat([Ljava/lang/CharSequence;)Ljava/lang/CharSequence;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/text/SpannableStringBuilder;Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/TextUtils;->copySpansFrom(Landroid/text/Spanned;IILjava/lang/Class;Landroid/text/Spannable;I)V
-HSPLandroid/text/TextUtils;->couldAffectRtl(C)Z
-HSPLandroid/text/TextUtils;->doesNotNeedBidi([CII)Z
-HSPLandroid/text/TextUtils;->ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;)Ljava/lang/CharSequence;
-HSPLandroid/text/TextUtils;->ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;ZLandroid/text/TextUtils$EllipsizeCallback;)Ljava/lang/CharSequence;
-HSPLandroid/text/TextUtils;->ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;ZLandroid/text/TextUtils$EllipsizeCallback;Landroid/text/TextDirectionHeuristic;Ljava/lang/String;)Ljava/lang/CharSequence;
-HSPLandroid/text/TextUtils;->emptyIfNull(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z+]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/CharSequence;Ljava/lang/String;
-HSPLandroid/text/TextUtils;->expandTemplate(Ljava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLandroid/text/TextUtils;->formatSimple(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Boolean;Ljava/lang/Boolean;
-HSPLandroid/text/TextUtils;->getCapsMode(Ljava/lang/CharSequence;II)I
-HSPLandroid/text/TextUtils;->getChars(Ljava/lang/CharSequence;II[CI)V+]Ljava/lang/Object;Landroid/text/SpannableString;]Landroid/text/GetChars;Landroid/text/SpannableString;
-HSPLandroid/text/TextUtils;->getEllipsisString(Landroid/text/TextUtils$TruncateAt;)Ljava/lang/String;
-HSPLandroid/text/TextUtils;->getLayoutDirectionFromLocale(Ljava/util/Locale;)I
-HSPLandroid/text/TextUtils;->getTrimmedLength(Ljava/lang/CharSequence;)I
-HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;C)I
-HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;CI)I
-HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;CII)I+]Ljava/lang/Object;Landroid/text/SpannableString;
-HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I
-HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;Ljava/lang/CharSequence;II)I
-HSPLandroid/text/TextUtils;->isDigitsOnly(Ljava/lang/CharSequence;)Z
-HSPLandroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z+]Ljava/lang/CharSequence;Ljava/lang/String;
-HSPLandroid/text/TextUtils;->isGraphic(Ljava/lang/CharSequence;)Z
-HSPLandroid/text/TextUtils;->join(Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Iterable;missing_types]Ljava/util/Iterator;missing_types
-HSPLandroid/text/TextUtils;->join(Ljava/lang/CharSequence;[Ljava/lang/Object;)Ljava/lang/String;
-HSPLandroid/text/TextUtils;->lastIndexOf(Ljava/lang/CharSequence;CI)I
-HSPLandroid/text/TextUtils;->lastIndexOf(Ljava/lang/CharSequence;CII)I
-HSPLandroid/text/TextUtils;->makeSafeForPresentation(Ljava/lang/String;IFI)Ljava/lang/CharSequence;
-HSPLandroid/text/TextUtils;->nullIfEmpty(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/text/TextUtils;->obtain(I)[C
-HSPLandroid/text/TextUtils;->packRangeInLong(II)J
-HSPLandroid/text/TextUtils;->recycle([C)V
-HSPLandroid/text/TextUtils;->removeEmptySpans([Ljava/lang/Object;Landroid/text/Spanned;Ljava/lang/Class;)[Ljava/lang/Object;
-HSPLandroid/text/TextUtils;->safeIntern(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/text/TextUtils;->split(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
-HSPLandroid/text/TextUtils;->stringOrSpannedString(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLandroid/text/TextUtils;->substring(Ljava/lang/CharSequence;II)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
-HSPLandroid/text/TextUtils;->toUpperCase(Ljava/util/Locale;Ljava/lang/CharSequence;Z)Ljava/lang/CharSequence;
-HSPLandroid/text/TextUtils;->trimNoCopySpans(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLandroid/text/TextUtils;->trimToParcelableSize(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLandroid/text/TextUtils;->trimToSize(Ljava/lang/CharSequence;I)Ljava/lang/CharSequence;
-HSPLandroid/text/TextUtils;->unpackRangeEndFromLong(J)I
-HSPLandroid/text/TextUtils;->unpackRangeStartFromLong(J)I
-HSPLandroid/text/TextUtils;->writeToParcel(Ljava/lang/CharSequence;Landroid/os/Parcel;I)V+]Ljava/lang/CharSequence;Ljava/lang/String;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/text/format/DateFormat;->format(Ljava/lang/CharSequence;J)Ljava/lang/CharSequence;
-HSPLandroid/text/format/DateFormat;->format(Ljava/lang/CharSequence;Ljava/util/Calendar;)Ljava/lang/CharSequence;
-HSPLandroid/text/format/DateFormat;->format(Ljava/lang/CharSequence;Ljava/util/Date;)Ljava/lang/CharSequence;
-HSPLandroid/text/format/DateFormat;->getBestDateTimePattern(Ljava/util/Locale;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/text/format/DateFormat;->getIcuDateFormatSymbols(Ljava/util/Locale;)Landroid/icu/text/DateFormatSymbols;
-HSPLandroid/text/format/DateFormat;->getMonthString(Landroid/icu/text/DateFormatSymbols;III)Ljava/lang/String;
-HSPLandroid/text/format/DateFormat;->getTimeFormat(Landroid/content/Context;)Ljava/text/DateFormat;
-HSPLandroid/text/format/DateFormat;->getTimeFormatString(Landroid/content/Context;I)Ljava/lang/String;
-HSPLandroid/text/format/DateFormat;->getYearString(II)Ljava/lang/String;
-HSPLandroid/text/format/DateFormat;->hasDesignator(Ljava/lang/CharSequence;C)Z
-HSPLandroid/text/format/DateFormat;->is24HourFormat(Landroid/content/Context;)Z
-HSPLandroid/text/format/DateFormat;->is24HourFormat(Landroid/content/Context;I)Z
-HSPLandroid/text/format/DateFormat;->is24HourLocale(Ljava/util/Locale;)Z
-HSPLandroid/text/format/DateFormat;->zeroPad(II)Ljava/lang/String;
-HSPLandroid/text/format/DateIntervalFormat;-><clinit>()V
-HSPLandroid/text/format/DateIntervalFormat;->formatDateRange(JJILjava/lang/String;)Ljava/lang/String;
-HSPLandroid/text/format/DateIntervalFormat;->formatDateRange(Landroid/icu/util/ULocale;Landroid/icu/util/TimeZone;JJI)Ljava/lang/String;
-HSPLandroid/text/format/DateIntervalFormat;->getFormatter(Ljava/lang/String;Landroid/icu/util/ULocale;Landroid/icu/util/TimeZone;)Landroid/icu/text/DateIntervalFormat;
-HSPLandroid/text/format/DateIntervalFormat;->isExactlyMidnight(Landroid/icu/util/Calendar;)Z
-HSPLandroid/text/format/DateUtils;->formatDateRange(Landroid/content/Context;JJI)Ljava/lang/String;
-HSPLandroid/text/format/DateUtils;->formatDateRange(Landroid/content/Context;Ljava/util/Formatter;JJILjava/lang/String;)Ljava/util/Formatter;
-HSPLandroid/text/format/DateUtils;->formatDateTime(Landroid/content/Context;JI)Ljava/lang/String;
-HSPLandroid/text/format/DateUtils;->formatElapsedTime(J)Ljava/lang/String;
-HSPLandroid/text/format/DateUtils;->formatElapsedTime(Ljava/lang/StringBuilder;J)Ljava/lang/String;
-HSPLandroid/text/format/DateUtils;->getRelativeTimeSpanString(JJJI)Ljava/lang/CharSequence;
-HSPLandroid/text/format/DateUtils;->initFormatStrings()V
-HSPLandroid/text/format/DateUtils;->initFormatStringsLocked()V
-HSPLandroid/text/format/DateUtils;->isSameDate(JJ)Z
-HSPLandroid/text/format/DateUtils;->isToday(J)Z
-HSPLandroid/text/format/DateUtilsBridge;->createIcuCalendar(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;J)Landroid/icu/util/Calendar;
-HSPLandroid/text/format/DateUtilsBridge;->fallInSameMonth(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;)Z
-HSPLandroid/text/format/DateUtilsBridge;->fallInSameYear(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;)Z
-HSPLandroid/text/format/DateUtilsBridge;->fallOnDifferentDates(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;)Z
-HSPLandroid/text/format/DateUtilsBridge;->icuTimeZone(Ljava/util/TimeZone;)Landroid/icu/util/TimeZone;
-HSPLandroid/text/format/DateUtilsBridge;->isThisYear(Landroid/icu/util/Calendar;)Z
-HSPLandroid/text/format/DateUtilsBridge;->toSkeleton(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;I)Ljava/lang/String;
-HSPLandroid/text/format/Formatter;->formatBytes(Landroid/content/res/Resources;JI)Landroid/text/format/Formatter$BytesResult;
-HSPLandroid/text/format/Formatter;->formatFileSize(Landroid/content/Context;J)Ljava/lang/String;
-HSPLandroid/text/format/Formatter;->formatFileSize(Landroid/content/Context;JI)Ljava/lang/String;
-HSPLandroid/text/format/RelativeDateTimeFormatter;->getFormatter(Landroid/icu/util/ULocale;Landroid/icu/text/RelativeDateTimeFormatter$Style;Landroid/icu/text/DisplayContext;)Landroid/icu/text/RelativeDateTimeFormatter;
-HSPLandroid/text/format/RelativeDateTimeFormatter;->getRelativeTimeSpanString(Landroid/icu/util/ULocale;Landroid/icu/util/TimeZone;JJJILandroid/icu/text/DisplayContext;)Ljava/lang/String;
-HSPLandroid/text/format/RelativeDateTimeFormatter;->getRelativeTimeSpanString(Ljava/util/Locale;Ljava/util/TimeZone;JJJILandroid/icu/text/DisplayContext;)Ljava/lang/String;
-HSPLandroid/text/format/Time$TimeCalculator;->copyFieldsFromTime(Landroid/text/format/Time;)V
-HSPLandroid/text/format/Time$TimeCalculator;->copyFieldsToTime(Landroid/text/format/Time;)V
-HSPLandroid/text/format/Time$TimeCalculator;->lookupZoneInfoData(Ljava/lang/String;)Lcom/android/i18n/timezone/ZoneInfoData;
-HSPLandroid/text/format/Time$TimeCalculator;->setTimeInMillis(J)V
-HSPLandroid/text/format/Time$TimeCalculator;->updateZoneInfoFromTimeZone()V
-HSPLandroid/text/format/Time;-><init>()V
-HSPLandroid/text/format/Time;->getJulianDay(JJ)I
-HSPLandroid/text/format/Time;->initialize(Ljava/lang/String;)V
-HSPLandroid/text/format/Time;->set(J)V
-HSPLandroid/text/method/AllCapsTransformationMethod;-><init>(Landroid/content/Context;)V
-HSPLandroid/text/method/AllCapsTransformationMethod;->getTransformation(Ljava/lang/CharSequence;Landroid/view/View;)Ljava/lang/CharSequence;
-HSPLandroid/text/method/AllCapsTransformationMethod;->setLengthChangesAllowed(Z)V
-HSPLandroid/text/method/ArrowKeyMovementMethod;->canSelectArbitrarily()Z
-HSPLandroid/text/method/ArrowKeyMovementMethod;->getInstance()Landroid/text/method/MovementMethod;
-HSPLandroid/text/method/ArrowKeyMovementMethod;->handleMovementKey(Landroid/widget/TextView;Landroid/text/Spannable;IILandroid/view/KeyEvent;)Z
-HSPLandroid/text/method/ArrowKeyMovementMethod;->initialize(Landroid/widget/TextView;Landroid/text/Spannable;)V
-HSPLandroid/text/method/ArrowKeyMovementMethod;->onTakeFocus(Landroid/widget/TextView;Landroid/text/Spannable;I)V
-HSPLandroid/text/method/ArrowKeyMovementMethod;->onTouchEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z
-HSPLandroid/text/method/BaseKeyListener;-><init>()V
-HSPLandroid/text/method/BaseKeyListener;->makeTextContentType(Landroid/text/method/TextKeyListener$Capitalize;Z)I
-HSPLandroid/text/method/BaseMovementMethod;-><init>()V
-HSPLandroid/text/method/BaseMovementMethod;->getMovementMetaState(Landroid/text/Spannable;Landroid/view/KeyEvent;)I
-HSPLandroid/text/method/BaseMovementMethod;->handleMovementKey(Landroid/widget/TextView;Landroid/text/Spannable;IILandroid/view/KeyEvent;)Z
-HSPLandroid/text/method/BaseMovementMethod;->onKeyDown(Landroid/widget/TextView;Landroid/text/Spannable;ILandroid/view/KeyEvent;)Z
-HSPLandroid/text/method/BaseMovementMethod;->onKeyUp(Landroid/widget/TextView;Landroid/text/Spannable;ILandroid/view/KeyEvent;)Z
-HSPLandroid/text/method/LinkMovementMethod;-><init>()V
-HSPLandroid/text/method/LinkMovementMethod;->getInstance()Landroid/text/method/MovementMethod;
-HSPLandroid/text/method/LinkMovementMethod;->initialize(Landroid/widget/TextView;Landroid/text/Spannable;)V
-HSPLandroid/text/method/MetaKeyKeyListener;-><init>()V
-HSPLandroid/text/method/MetaKeyKeyListener;->getMetaState(Ljava/lang/CharSequence;I)I
-HSPLandroid/text/method/MetaKeyKeyListener;->isMetaTracker(Ljava/lang/CharSequence;Ljava/lang/Object;)Z
-HSPLandroid/text/method/MetaKeyKeyListener;->onKeyDown(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z
-HSPLandroid/text/method/MetaKeyKeyListener;->onKeyUp(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z
-HSPLandroid/text/method/QwertyKeyListener;->onKeyDown(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z
-HSPLandroid/text/method/ReplacementTransformationMethod$ReplacementCharSequence;->charAt(I)C
-HSPLandroid/text/method/ReplacementTransformationMethod$ReplacementCharSequence;->getChars(II[CI)V
-HSPLandroid/text/method/ReplacementTransformationMethod$ReplacementCharSequence;->length()I
-HSPLandroid/text/method/ReplacementTransformationMethod$SpannedReplacementCharSequence;->getSpanEnd(Ljava/lang/Object;)I
-HSPLandroid/text/method/ReplacementTransformationMethod$SpannedReplacementCharSequence;->getSpanFlags(Ljava/lang/Object;)I
-HSPLandroid/text/method/ReplacementTransformationMethod$SpannedReplacementCharSequence;->getSpanStart(Ljava/lang/Object;)I
-HSPLandroid/text/method/ReplacementTransformationMethod$SpannedReplacementCharSequence;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;
-HSPLandroid/text/method/ReplacementTransformationMethod$SpannedReplacementCharSequence;->nextSpanTransition(IILjava/lang/Class;)I
-HSPLandroid/text/method/ReplacementTransformationMethod;-><init>()V
-HSPLandroid/text/method/ReplacementTransformationMethod;->getTransformation(Ljava/lang/CharSequence;Landroid/view/View;)Ljava/lang/CharSequence;
-HSPLandroid/text/method/ReplacementTransformationMethod;->onFocusChanged(Landroid/view/View;Ljava/lang/CharSequence;ZILandroid/graphics/Rect;)V
-HSPLandroid/text/method/ScrollingMovementMethod;-><init>()V
-HSPLandroid/text/method/SingleLineTransformationMethod;-><init>()V
-HSPLandroid/text/method/SingleLineTransformationMethod;->getInstance()Landroid/text/method/SingleLineTransformationMethod;
-HSPLandroid/text/method/SingleLineTransformationMethod;->getOriginal()[C
-HSPLandroid/text/method/SingleLineTransformationMethod;->getReplacement()[C
-HSPLandroid/text/method/TextKeyListener$SettingsObserver;->onChange(Z)V
-HSPLandroid/text/method/TextKeyListener;-><init>(Landroid/text/method/TextKeyListener$Capitalize;Z)V
-HSPLandroid/text/method/TextKeyListener;->getInputType()I
-HSPLandroid/text/method/TextKeyListener;->getInstance()Landroid/text/method/TextKeyListener;
-HSPLandroid/text/method/TextKeyListener;->getInstance(ZLandroid/text/method/TextKeyListener$Capitalize;)Landroid/text/method/TextKeyListener;
-HSPLandroid/text/method/TextKeyListener;->getKeyListener(Landroid/view/KeyEvent;)Landroid/text/method/KeyListener;
-HSPLandroid/text/method/TextKeyListener;->getPrefs(Landroid/content/Context;)I
-HSPLandroid/text/method/TextKeyListener;->initPrefs(Landroid/content/Context;)V
-HSPLandroid/text/method/TextKeyListener;->onKeyDown(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z
-HSPLandroid/text/method/TextKeyListener;->onKeyUp(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z
-HSPLandroid/text/method/TextKeyListener;->onSpanAdded(Landroid/text/Spannable;Ljava/lang/Object;II)V
-HSPLandroid/text/method/TextKeyListener;->onSpanChanged(Landroid/text/Spannable;Ljava/lang/Object;IIII)V
-HSPLandroid/text/method/TextKeyListener;->onSpanRemoved(Landroid/text/Spannable;Ljava/lang/Object;II)V
-HSPLandroid/text/method/TextKeyListener;->updatePrefs(Landroid/content/ContentResolver;)V
-HSPLandroid/text/method/Touch;->onTouchEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z+]Landroid/text/Layout;Landroid/text/DynamicLayout;]Landroid/view/ViewConfiguration;Landroid/view/ViewConfiguration;]Landroid/text/Spannable;Landroid/text/SpannableString;]Landroid/view/MotionEvent;Landroid/view/MotionEvent;
-HSPLandroid/text/method/WordIterator;-><init>(Ljava/util/Locale;)V
-HSPLandroid/text/method/WordIterator;->checkOffsetIsValid(I)V
-HSPLandroid/text/method/WordIterator;->following(I)I
-HSPLandroid/text/method/WordIterator;->getBeginning(I)I
-HSPLandroid/text/method/WordIterator;->getBeginning(IZ)I
-HSPLandroid/text/method/WordIterator;->getEnd(I)I
-HSPLandroid/text/method/WordIterator;->getEnd(IZ)I
-HSPLandroid/text/method/WordIterator;->preceding(I)I
-HSPLandroid/text/method/WordIterator;->setCharSequence(Ljava/lang/CharSequence;II)V
-HSPLandroid/text/style/AbsoluteSizeSpan;-><init>(IZ)V
-HSPLandroid/text/style/AbsoluteSizeSpan;->updateDrawState(Landroid/text/TextPaint;)V
-HSPLandroid/text/style/CharacterStyle;-><init>()V
-HSPLandroid/text/style/CharacterStyle;->getUnderlying()Landroid/text/style/CharacterStyle;
-HSPLandroid/text/style/ClickableSpan;-><init>()V
-HSPLandroid/text/style/ClickableSpan;->updateDrawState(Landroid/text/TextPaint;)V
-HSPLandroid/text/style/DynamicDrawableSpan;-><init>(I)V
-HSPLandroid/text/style/ForegroundColorSpan;-><init>(I)V
-HSPLandroid/text/style/ForegroundColorSpan;->getSpanTypeIdInternal()I
-HSPLandroid/text/style/ForegroundColorSpan;->updateDrawState(Landroid/text/TextPaint;)V+]Landroid/text/TextPaint;Landroid/text/TextPaint;
-HSPLandroid/text/style/ForegroundColorSpan;->writeToParcelInternal(Landroid/os/Parcel;I)V
-HSPLandroid/text/style/ImageSpan;-><init>(Landroid/graphics/drawable/Drawable;I)V
-HSPLandroid/text/style/ImageSpan;->getDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/text/style/MetricAffectingSpan;-><init>()V
-HSPLandroid/text/style/MetricAffectingSpan;->getUnderlying()Landroid/text/style/CharacterStyle;
-HSPLandroid/text/style/MetricAffectingSpan;->getUnderlying()Landroid/text/style/MetricAffectingSpan;
-HSPLandroid/text/style/RelativeSizeSpan;-><init>(F)V
-HSPLandroid/text/style/ReplacementSpan;-><init>()V
-HSPLandroid/text/style/SpellCheckSpan;->getSpanTypeIdInternal()I
-HSPLandroid/text/style/SpellCheckSpan;->isSpellCheckInProgress()Z
-HSPLandroid/text/style/SpellCheckSpan;->setSpellCheckInProgress(Z)V
-HSPLandroid/text/style/SpellCheckSpan;->writeToParcelInternal(Landroid/os/Parcel;I)V
-HSPLandroid/text/style/StyleSpan;-><init>(I)V
-HSPLandroid/text/style/StyleSpan;-><init>(II)V
-HSPLandroid/text/style/StyleSpan;->apply(Landroid/graphics/Paint;II)V
-HSPLandroid/text/style/StyleSpan;->getSpanTypeIdInternal()I
-HSPLandroid/text/style/StyleSpan;->updateDrawState(Landroid/text/TextPaint;)V
-HSPLandroid/text/style/StyleSpan;->updateMeasureState(Landroid/text/TextPaint;)V
-HSPLandroid/text/style/StyleSpan;->writeToParcelInternal(Landroid/os/Parcel;I)V
-HSPLandroid/text/style/TextAppearanceSpan;-><init>(Landroid/content/Context;I)V
-HSPLandroid/text/style/TextAppearanceSpan;-><init>(Landroid/content/Context;II)V
-HSPLandroid/text/style/TextAppearanceSpan;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/text/style/TextAppearanceSpan;-><init>(Ljava/lang/String;IILandroid/content/res/ColorStateList;Landroid/content/res/ColorStateList;)V
-HSPLandroid/text/style/TextAppearanceSpan;->getFamily()Ljava/lang/String;
-HSPLandroid/text/style/TextAppearanceSpan;->getLinkTextColor()Landroid/content/res/ColorStateList;
-HSPLandroid/text/style/TextAppearanceSpan;->getSpanTypeIdInternal()I
-HSPLandroid/text/style/TextAppearanceSpan;->getTextColor()Landroid/content/res/ColorStateList;
-HSPLandroid/text/style/TextAppearanceSpan;->getTextStyle()I
-HSPLandroid/text/style/TextAppearanceSpan;->updateDrawState(Landroid/text/TextPaint;)V
-HSPLandroid/text/style/TextAppearanceSpan;->updateMeasureState(Landroid/text/TextPaint;)V
-HSPLandroid/text/style/TextAppearanceSpan;->writeToParcelInternal(Landroid/os/Parcel;I)V
-HSPLandroid/text/style/TtsSpan$Builder;->build()Landroid/text/style/TtsSpan;
-HSPLandroid/text/style/TtsSpan$Builder;->setStringArgument(Ljava/lang/String;Ljava/lang/String;)Landroid/text/style/TtsSpan$Builder;
-HSPLandroid/text/style/TtsSpan$SemioticClassBuilder;-><init>(Ljava/lang/String;)V
-HSPLandroid/text/style/TypefaceSpan;-><init>(Ljava/lang/String;)V
-HSPLandroid/text/style/TypefaceSpan;-><init>(Ljava/lang/String;Landroid/graphics/Typeface;)V
-HSPLandroid/text/style/URLSpan;-><init>(Ljava/lang/String;)V
-HSPLandroid/text/style/URLSpan;->getURL()Ljava/lang/String;
-HSPLandroid/text/style/UnderlineSpan;-><init>()V
-HSPLandroid/text/style/UnderlineSpan;->getSpanTypeIdInternal()I
-HSPLandroid/text/style/UnderlineSpan;->updateDrawState(Landroid/text/TextPaint;)V
-HSPLandroid/text/style/UnderlineSpan;->writeToParcelInternal(Landroid/os/Parcel;I)V
-HSPLandroid/text/util/Linkify$4;-><init>()V
-HSPLandroid/text/util/Linkify;->addLinks(Landroid/text/Spannable;ILandroid/content/Context;Ljava/util/function/Function;)Z
-HSPLandroid/text/util/Linkify;->containsUnsupportedCharacters(Ljava/lang/String;)Z
-HSPLandroid/text/util/Linkify;->gatherLinks(Ljava/util/ArrayList;Landroid/text/Spannable;Ljava/util/regex/Pattern;[Ljava/lang/String;Landroid/text/util/Linkify$MatchFilter;Landroid/text/util/Linkify$TransformFilter;)V
-HSPLandroid/text/util/Linkify;->pruneOverlaps(Ljava/util/ArrayList;)V
-HSPLandroid/transition/ChangeBounds;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/transition/ChangeBounds;->setResizeClip(Z)V
-HSPLandroid/transition/ChangeClipBounds;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/transition/ChangeImageTransform;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/transition/ChangeTransform;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/transition/Fade$1;->onTransitionEnd(Landroid/transition/Transition;)V
-HSPLandroid/transition/Fade$FadeAnimatorListener;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/transition/Fade$FadeAnimatorListener;->onAnimationStart(Landroid/animation/Animator;)V
-HSPLandroid/transition/Fade;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/transition/Fade;->captureStartValues(Landroid/transition/TransitionValues;)V
-HSPLandroid/transition/Fade;->createAnimation(Landroid/view/View;FF)Landroid/animation/Animator;
-HSPLandroid/transition/Fade;->onAppear(Landroid/view/ViewGroup;Landroid/view/View;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;
-HSPLandroid/transition/Fade;->onDisappear(Landroid/view/ViewGroup;Landroid/view/View;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;
-HSPLandroid/transition/Scene;->enter()V
-HSPLandroid/transition/Transition$2;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/transition/Transition$2;->onAnimationStart(Landroid/animation/Animator;)V
-HSPLandroid/transition/Transition$3;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/transition/Transition;-><init>()V
-HSPLandroid/transition/Transition;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V+]Ljava/lang/Object;megamorphic_types]Landroid/content/Context;missing_types]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Ljava/lang/Class;Ljava/lang/Class;
-HSPLandroid/transition/Transition;->addListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/Transition;
-HSPLandroid/transition/Transition;->addTarget(Landroid/view/View;)Landroid/transition/Transition;
-HSPLandroid/transition/Transition;->addUnmatched(Landroid/util/ArrayMap;Landroid/util/ArrayMap;)V
-HSPLandroid/transition/Transition;->addViewValues(Landroid/transition/TransitionValuesMaps;Landroid/view/View;Landroid/transition/TransitionValues;)V
-HSPLandroid/transition/Transition;->animate(Landroid/animation/Animator;)V
-HSPLandroid/transition/Transition;->captureHierarchy(Landroid/view/View;Z)V
-HSPLandroid/transition/Transition;->capturePropagationValues(Landroid/transition/TransitionValues;)V
-HSPLandroid/transition/Transition;->captureValues(Landroid/view/ViewGroup;Z)V
-HSPLandroid/transition/Transition;->clearValues(Z)V
-HSPLandroid/transition/Transition;->clone()Landroid/transition/Transition;
-HSPLandroid/transition/Transition;->createAnimators(Landroid/view/ViewGroup;Landroid/transition/TransitionValuesMaps;Landroid/transition/TransitionValuesMaps;Ljava/util/ArrayList;Ljava/util/ArrayList;)V
-HSPLandroid/transition/Transition;->end()V
-HSPLandroid/transition/Transition;->getDuration()J
-HSPLandroid/transition/Transition;->getInterpolator()Landroid/animation/TimeInterpolator;
-HSPLandroid/transition/Transition;->getName()Ljava/lang/String;
-HSPLandroid/transition/Transition;->getStartDelay()J
-HSPLandroid/transition/Transition;->isValidTarget(Landroid/view/View;)Z
-HSPLandroid/transition/Transition;->matchIds(Landroid/util/ArrayMap;Landroid/util/ArrayMap;Landroid/util/SparseArray;Landroid/util/SparseArray;)V
-HSPLandroid/transition/Transition;->matchInstances(Landroid/util/ArrayMap;Landroid/util/ArrayMap;)V
-HSPLandroid/transition/Transition;->matchItemIds(Landroid/util/ArrayMap;Landroid/util/ArrayMap;Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;)V
-HSPLandroid/transition/Transition;->matchNames(Landroid/util/ArrayMap;Landroid/util/ArrayMap;Landroid/util/ArrayMap;Landroid/util/ArrayMap;)V
-HSPLandroid/transition/Transition;->matchStartAndEnd(Landroid/transition/TransitionValuesMaps;Landroid/transition/TransitionValuesMaps;)V
-HSPLandroid/transition/Transition;->playTransition(Landroid/view/ViewGroup;)V
-HSPLandroid/transition/Transition;->removeListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/Transition;
-HSPLandroid/transition/Transition;->runAnimators()V
-HSPLandroid/transition/Transition;->setDuration(J)Landroid/transition/Transition;
-HSPLandroid/transition/Transition;->setEpicenterCallback(Landroid/transition/Transition$EpicenterCallback;)V
-HSPLandroid/transition/Transition;->start()V
-HSPLandroid/transition/TransitionInflater;-><init>(Landroid/content/Context;)V
-HSPLandroid/transition/TransitionInflater;->createCustom(Landroid/util/AttributeSet;Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroid/transition/TransitionInflater;->createTransitionFromXml(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/transition/Transition;)Landroid/transition/Transition;
-HSPLandroid/transition/TransitionInflater;->from(Landroid/content/Context;)Landroid/transition/TransitionInflater;
-HSPLandroid/transition/TransitionInflater;->inflateTransition(I)Landroid/transition/Transition;
-HSPLandroid/transition/TransitionListenerAdapter;-><init>()V
-HSPLandroid/transition/TransitionListenerAdapter;->onTransitionStart(Landroid/transition/Transition;)V
-HSPLandroid/transition/TransitionManager$MultiListener$1;->onTransitionEnd(Landroid/transition/Transition;)V
-HSPLandroid/transition/TransitionManager$MultiListener;->onPreDraw()Z
-HSPLandroid/transition/TransitionManager;-><init>()V
-HSPLandroid/transition/TransitionManager;->beginDelayedTransition(Landroid/view/ViewGroup;Landroid/transition/Transition;)V
-HSPLandroid/transition/TransitionManager;->endTransitions(Landroid/view/ViewGroup;)V
-HSPLandroid/transition/TransitionManager;->getRunningTransitions()Landroid/util/ArrayMap;
-HSPLandroid/transition/TransitionManager;->sceneChangeSetup(Landroid/view/ViewGroup;Landroid/transition/Transition;)V
-HSPLandroid/transition/TransitionSet$TransitionSetListener;->onTransitionEnd(Landroid/transition/Transition;)V
-HSPLandroid/transition/TransitionSet$TransitionSetListener;->onTransitionStart(Landroid/transition/Transition;)V
-HSPLandroid/transition/TransitionSet;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/transition/TransitionSet;->addListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/Transition;
-HSPLandroid/transition/TransitionSet;->addListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/TransitionSet;
-HSPLandroid/transition/TransitionSet;->addTarget(Landroid/view/View;)Landroid/transition/TransitionSet;
-HSPLandroid/transition/TransitionSet;->addTransition(Landroid/transition/Transition;)Landroid/transition/TransitionSet;
-HSPLandroid/transition/TransitionSet;->addTransitionInternal(Landroid/transition/Transition;)V
-HSPLandroid/transition/TransitionSet;->captureEndValues(Landroid/transition/TransitionValues;)V
-HSPLandroid/transition/TransitionSet;->capturePropagationValues(Landroid/transition/TransitionValues;)V
-HSPLandroid/transition/TransitionSet;->captureStartValues(Landroid/transition/TransitionValues;)V
-HSPLandroid/transition/TransitionSet;->clone()Landroid/transition/Transition;
-HSPLandroid/transition/TransitionSet;->clone()Landroid/transition/TransitionSet;
-HSPLandroid/transition/TransitionSet;->createAnimators(Landroid/view/ViewGroup;Landroid/transition/TransitionValuesMaps;Landroid/transition/TransitionValuesMaps;Ljava/util/ArrayList;Ljava/util/ArrayList;)V
-HSPLandroid/transition/TransitionSet;->getTransitionCount()I
-HSPLandroid/transition/TransitionSet;->removeListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/Transition;
-HSPLandroid/transition/TransitionSet;->removeListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/TransitionSet;
-HSPLandroid/transition/TransitionSet;->runAnimators()V
-HSPLandroid/transition/TransitionSet;->setEpicenterCallback(Landroid/transition/Transition$EpicenterCallback;)V
-HSPLandroid/transition/TransitionSet;->setOrdering(I)Landroid/transition/TransitionSet;
-HSPLandroid/transition/TransitionSet;->setupStartEndListeners()V
-HSPLandroid/transition/TransitionValuesMaps;-><init>()V
-HSPLandroid/transition/Visibility$DisappearListener;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/transition/Visibility$DisappearListener;->onAnimationStart(Landroid/animation/Animator;)V
-HSPLandroid/transition/Visibility$DisappearListener;->onTransitionEnd(Landroid/transition/Transition;)V
-HSPLandroid/transition/Visibility;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/transition/Visibility;->captureEndValues(Landroid/transition/TransitionValues;)V
-HSPLandroid/transition/Visibility;->captureValues(Landroid/transition/TransitionValues;)V
-HSPLandroid/transition/Visibility;->createAnimator(Landroid/view/ViewGroup;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;
-HSPLandroid/transition/Visibility;->getMode()I
-HSPLandroid/transition/Visibility;->getTransitionProperties()[Ljava/lang/String;
-HSPLandroid/transition/Visibility;->getVisibilityChangeInfo(Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/transition/Visibility$VisibilityInfo;
-HSPLandroid/transition/Visibility;->isTransitionRequired(Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Z
-HSPLandroid/transition/Visibility;->onAppear(Landroid/view/ViewGroup;Landroid/transition/TransitionValues;ILandroid/transition/TransitionValues;I)Landroid/animation/Animator;
-HSPLandroid/transition/Visibility;->onDisappear(Landroid/view/ViewGroup;Landroid/transition/TransitionValues;ILandroid/transition/TransitionValues;I)Landroid/animation/Animator;
-HSPLandroid/transition/Visibility;->setMode(I)V
-HSPLandroid/util/AndroidException;-><init>()V
-HSPLandroid/util/AndroidException;-><init>(Ljava/lang/String;)V
-HSPLandroid/util/AndroidException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V
-HSPLandroid/util/AndroidRuntimeException;-><init>(Ljava/lang/String;)V
-HSPLandroid/util/ArrayMap$1;-><init>(Landroid/util/ArrayMap;)V
-HSPLandroid/util/ArrayMap$1;->colGetEntry(II)Ljava/lang/Object;
-HSPLandroid/util/ArrayMap$1;->colGetMap()Ljava/util/Map;
-HSPLandroid/util/ArrayMap$1;->colGetSize()I
-HSPLandroid/util/ArrayMap$1;->colIndexOfKey(Ljava/lang/Object;)I
-HSPLandroid/util/ArrayMap$1;->colRemoveAt(I)V
-HSPLandroid/util/ArrayMap;-><init>()V
-HSPLandroid/util/ArrayMap;-><init>(I)V
-HSPLandroid/util/ArrayMap;-><init>(IZ)V
-HSPLandroid/util/ArrayMap;-><init>(Landroid/util/ArrayMap;)V
-HSPLandroid/util/ArrayMap;->allocArrays(I)V
-HSPLandroid/util/ArrayMap;->append(Ljava/lang/Object;Ljava/lang/Object;)V+]Ljava/lang/Object;Ljava/lang/String;
-HSPLandroid/util/ArrayMap;->binarySearchHashes([III)I
-HSPLandroid/util/ArrayMap;->clear()V
-HSPLandroid/util/ArrayMap;->containsKey(Ljava/lang/Object;)Z
-HSPLandroid/util/ArrayMap;->containsValue(Ljava/lang/Object;)Z
-HSPLandroid/util/ArrayMap;->ensureCapacity(I)V
-HSPLandroid/util/ArrayMap;->entrySet()Ljava/util/Set;
-HSPLandroid/util/ArrayMap;->equals(Ljava/lang/Object;)Z
-HSPLandroid/util/ArrayMap;->freeArrays([I[Ljava/lang/Object;I)V
-HSPLandroid/util/ArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLandroid/util/ArrayMap;->getCollection()Landroid/util/MapCollections;
-HSPLandroid/util/ArrayMap;->hashCode()I
-HSPLandroid/util/ArrayMap;->indexOf(Ljava/lang/Object;I)I+]Ljava/lang/Object;megamorphic_types
-HSPLandroid/util/ArrayMap;->indexOfKey(Ljava/lang/Object;)I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;megamorphic_types
-HSPLandroid/util/ArrayMap;->indexOfNull()I
-HSPLandroid/util/ArrayMap;->indexOfValue(Ljava/lang/Object;)I
-HSPLandroid/util/ArrayMap;->isEmpty()Z
-HSPLandroid/util/ArrayMap;->keyAt(I)Ljava/lang/Object;
-HSPLandroid/util/ArrayMap;->keySet()Ljava/util/Set;+]Landroid/util/MapCollections;Landroid/util/ArrayMap$1;
-HSPLandroid/util/ArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;megamorphic_types
-HSPLandroid/util/ArrayMap;->putAll(Landroid/util/ArrayMap;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLandroid/util/ArrayMap;->putAll(Ljava/util/Map;)V
-HSPLandroid/util/ArrayMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/util/ArrayMap;->removeAt(I)Ljava/lang/Object;
-HSPLandroid/util/ArrayMap;->retainAll(Ljava/util/Collection;)Z
-HSPLandroid/util/ArrayMap;->setValueAt(ILjava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/util/ArrayMap;->size()I
-HSPLandroid/util/ArrayMap;->toString()Ljava/lang/String;
-HSPLandroid/util/ArrayMap;->validate()V
-HSPLandroid/util/ArrayMap;->valueAt(I)Ljava/lang/Object;
-HSPLandroid/util/ArrayMap;->values()Ljava/util/Collection;
-HSPLandroid/util/ArraySet$1;-><init>(Landroid/util/ArraySet;)V
-HSPLandroid/util/ArraySet$1;->colGetEntry(II)Ljava/lang/Object;
-HSPLandroid/util/ArraySet$1;->colGetSize()I
-HSPLandroid/util/ArraySet$1;->colRemoveAt(I)V
-HSPLandroid/util/ArraySet;-><init>()V
-HSPLandroid/util/ArraySet;-><init>(I)V
-HSPLandroid/util/ArraySet;-><init>(IZ)V
-HSPLandroid/util/ArraySet;-><init>(Landroid/util/ArraySet;)V
-HSPLandroid/util/ArraySet;-><init>(Ljava/util/Collection;)V
-HSPLandroid/util/ArraySet;-><init>([Ljava/lang/Object;)V
-HSPLandroid/util/ArraySet;->add(Ljava/lang/Object;)Z+]Ljava/lang/Object;Ljava/lang/String;,Landroid/accounts/Account;,Landroid/window/SurfaceSyncGroup$2;,Landroid/net/UidRange;
-HSPLandroid/util/ArraySet;->addAll(Landroid/util/ArraySet;)V
-HSPLandroid/util/ArraySet;->addAll(Ljava/util/Collection;)Z
-HSPLandroid/util/ArraySet;->allocArrays(I)V
-HSPLandroid/util/ArraySet;->append(Ljava/lang/Object;)V+]Ljava/lang/Object;Lcom/android/org/conscrypt/OpenSSLRSAPublicKey;,Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;
-HSPLandroid/util/ArraySet;->binarySearch([II)I
-HSPLandroid/util/ArraySet;->clear()V
-HSPLandroid/util/ArraySet;->contains(Ljava/lang/Object;)Z
-HSPLandroid/util/ArraySet;->ensureCapacity(I)V
-HSPLandroid/util/ArraySet;->equals(Ljava/lang/Object;)Z
-HSPLandroid/util/ArraySet;->forEach(Ljava/util/function/Consumer;)V
-HSPLandroid/util/ArraySet;->freeArrays([I[Ljava/lang/Object;I)V
-HSPLandroid/util/ArraySet;->getCollection()Landroid/util/MapCollections;
-HSPLandroid/util/ArraySet;->hashCode()I
-HSPLandroid/util/ArraySet;->indexOf(Ljava/lang/Object;)I
-HSPLandroid/util/ArraySet;->indexOf(Ljava/lang/Object;I)I
-HSPLandroid/util/ArraySet;->indexOfNull()I
-HSPLandroid/util/ArraySet;->isEmpty()Z
-HSPLandroid/util/ArraySet;->iterator()Ljava/util/Iterator;
-HSPLandroid/util/ArraySet;->remove(Ljava/lang/Object;)Z
-HSPLandroid/util/ArraySet;->removeAll(Ljava/util/Collection;)Z
-HSPLandroid/util/ArraySet;->removeAt(I)Ljava/lang/Object;
-HSPLandroid/util/ArraySet;->shouldShrink()Z
-HSPLandroid/util/ArraySet;->size()I
-HSPLandroid/util/ArraySet;->toArray()[Ljava/lang/Object;
-HSPLandroid/util/ArraySet;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLandroid/util/ArraySet;->toString()Ljava/lang/String;
-HSPLandroid/util/ArraySet;->valueAt(I)Ljava/lang/Object;
-HSPLandroid/util/ArraySet;->valueAtUnchecked(I)Ljava/lang/Object;
-HSPLandroid/util/AtomicFile;-><init>(Ljava/io/File;)V
-HSPLandroid/util/AtomicFile;-><init>(Ljava/io/File;Landroid/util/SystemConfigFileCommitEventLogger;)V
-HSPLandroid/util/AtomicFile;-><init>(Ljava/io/File;Ljava/lang/String;)V
-HSPLandroid/util/AtomicFile;->finishWrite(Ljava/io/FileOutputStream;)V
-HSPLandroid/util/AtomicFile;->openRead()Ljava/io/FileInputStream;
-HSPLandroid/util/AtomicFile;->rename(Ljava/io/File;Ljava/io/File;)V
-HSPLandroid/util/AtomicFile;->startWrite()Ljava/io/FileOutputStream;
-HSPLandroid/util/AtomicFile;->startWrite(J)Ljava/io/FileOutputStream;
-HSPLandroid/util/Base64$Coder;-><init>()V
-HSPLandroid/util/Base64$Decoder;-><init>(I[B)V
-HSPLandroid/util/Base64$Decoder;->process([BIIZ)Z
-HSPLandroid/util/Base64$Encoder;-><init>(I[B)V
-HSPLandroid/util/Base64$Encoder;->process([BIIZ)Z
-HSPLandroid/util/Base64;->decode(Ljava/lang/String;I)[B
-HSPLandroid/util/Base64;->decode([BI)[B
-HSPLandroid/util/Base64;->decode([BIII)[B+]Landroid/util/Base64$Decoder;Landroid/util/Base64$Decoder;
-HSPLandroid/util/Base64;->encode([BI)[B
-HSPLandroid/util/Base64;->encode([BIII)[B
-HSPLandroid/util/Base64;->encodeToString([BI)Ljava/lang/String;
-HSPLandroid/util/Base64;->encodeToString([BIII)Ljava/lang/String;
-HSPLandroid/util/CloseGuard;-><init>()V
-HSPLandroid/util/CloseGuard;->close()V
-HSPLandroid/util/CloseGuard;->open(Ljava/lang/String;)V
-HSPLandroid/util/ContainerHelpers;->binarySearch([III)I
-HSPLandroid/util/ContainerHelpers;->binarySearch([JIJ)I
-HSPLandroid/util/DebugUtils;->constNameWithoutPrefix(Ljava/lang/String;Ljava/lang/reflect/Field;)Ljava/lang/String;
-HSPLandroid/util/DebugUtils;->flagsToString(Ljava/lang/Class;Ljava/lang/String;J)Ljava/lang/String;
-HSPLandroid/util/DebugUtils;->getFieldValue(Ljava/lang/reflect/Field;)J
-HSPLandroid/util/DisplayMetrics;-><init>()V
-HSPLandroid/util/DisplayMetrics;->setTo(Landroid/util/DisplayMetrics;)V
-HSPLandroid/util/DisplayMetrics;->setToDefaults()V
-HSPLandroid/util/DisplayUtils;->getDisplayUniqueIdConfigIndex(Landroid/content/res/Resources;Ljava/lang/String;)I
-HSPLandroid/util/EventLog$Event;-><init>([B)V
-HSPLandroid/util/EventLog$Event;->decodeObject()Ljava/lang/Object;+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
-HSPLandroid/util/EventLog$Event;->getData()Ljava/lang/Object;
-HSPLandroid/util/EventLog$Event;->getHeaderSize()I
-HSPLandroid/util/EventLog$Event;->getUid()I
-HSPLandroid/util/EventLog;->getTagCode(Ljava/lang/String;)I
-HSPLandroid/util/EventLog;->readTagsFile()V
-HSPLandroid/util/ExceptionUtils;->appendCause(Ljava/lang/Throwable;Ljava/lang/Throwable;)Ljava/lang/Throwable;
-HSPLandroid/util/ExceptionUtils;->getRootCause(Ljava/lang/Throwable;)Ljava/lang/Throwable;
-HSPLandroid/util/FastImmutableArraySet$FastIterator;->hasNext()Z
-HSPLandroid/util/FastImmutableArraySet$FastIterator;->next()Ljava/lang/Object;
-HSPLandroid/util/FastImmutableArraySet;->iterator()Ljava/util/Iterator;
-HSPLandroid/util/FeatureFlagUtils;->getAllFeatureFlags()Ljava/util/Map;
-HSPLandroid/util/FeatureFlagUtils;->getSystemPropertyPrefix(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/util/FeatureFlagUtils;->isEnabled(Landroid/content/Context;Ljava/lang/String;)Z
-HSPLandroid/util/FloatProperty;-><init>(Ljava/lang/String;)V
-HSPLandroid/util/FloatProperty;->set(Ljava/lang/Object;Ljava/lang/Float;)V
-HSPLandroid/util/IndentingPrintWriter;-><init>(Ljava/io/Writer;Ljava/lang/String;I)V
-HSPLandroid/util/IndentingPrintWriter;-><init>(Ljava/io/Writer;Ljava/lang/String;Ljava/lang/String;I)V
-HSPLandroid/util/IndentingPrintWriter;->decreaseIndent()Landroid/util/IndentingPrintWriter;
-HSPLandroid/util/IndentingPrintWriter;->increaseIndent()Landroid/util/IndentingPrintWriter;
-HSPLandroid/util/IndentingPrintWriter;->maybeWriteIndent()V
-HSPLandroid/util/IndentingPrintWriter;->print(Ljava/lang/String;Ljava/lang/Object;)Landroid/util/IndentingPrintWriter;
-HSPLandroid/util/IndentingPrintWriter;->println()V
-HSPLandroid/util/IndentingPrintWriter;->write(I)V
-HSPLandroid/util/IndentingPrintWriter;->write(Ljava/lang/String;II)V
-HSPLandroid/util/IndentingPrintWriter;->write([CII)V
-HSPLandroid/util/IntArray;-><init>()V
-HSPLandroid/util/IntArray;-><init>(I)V
-HSPLandroid/util/IntArray;->add(I)V
-HSPLandroid/util/IntArray;->add(II)V
-HSPLandroid/util/IntArray;->addAll(Landroid/util/IntArray;)V
-HSPLandroid/util/IntArray;->binarySearch(I)I
-HSPLandroid/util/IntArray;->clear()V
-HSPLandroid/util/IntArray;->ensureCapacity(I)V
-HSPLandroid/util/IntArray;->get(I)I
-HSPLandroid/util/IntArray;->indexOf(I)I
-HSPLandroid/util/IntArray;->remove(I)V
-HSPLandroid/util/IntArray;->size()I
-HSPLandroid/util/IntArray;->toArray()[I
-HSPLandroid/util/IntProperty;-><init>(Ljava/lang/String;)V
-HSPLandroid/util/JsonReader;-><init>(Ljava/io/Reader;)V
-HSPLandroid/util/JsonReader;->advance()Landroid/util/JsonToken;
-HSPLandroid/util/JsonReader;->beginArray()V
-HSPLandroid/util/JsonReader;->beginObject()V
-HSPLandroid/util/JsonReader;->close()V
-HSPLandroid/util/JsonReader;->decodeLiteral()Landroid/util/JsonToken;
-HSPLandroid/util/JsonReader;->decodeNumber([CII)Landroid/util/JsonToken;
-HSPLandroid/util/JsonReader;->endArray()V
-HSPLandroid/util/JsonReader;->endObject()V
-HSPLandroid/util/JsonReader;->expect(Landroid/util/JsonToken;)V
-HSPLandroid/util/JsonReader;->fillBuffer(I)Z
-HSPLandroid/util/JsonReader;->hasNext()Z
-HSPLandroid/util/JsonReader;->nextBoolean()Z
-HSPLandroid/util/JsonReader;->nextDouble()D
-HSPLandroid/util/JsonReader;->nextInArray(Z)Landroid/util/JsonToken;
-HSPLandroid/util/JsonReader;->nextInObject(Z)Landroid/util/JsonToken;
-HSPLandroid/util/JsonReader;->nextLiteral(Z)Ljava/lang/String;
-HSPLandroid/util/JsonReader;->nextName()Ljava/lang/String;
-HSPLandroid/util/JsonReader;->nextNonWhitespace()I
-HSPLandroid/util/JsonReader;->nextString()Ljava/lang/String;
-HSPLandroid/util/JsonReader;->nextString(C)Ljava/lang/String;
-HSPLandroid/util/JsonReader;->nextValue()Landroid/util/JsonToken;
-HSPLandroid/util/JsonReader;->objectValue()Landroid/util/JsonToken;
-HSPLandroid/util/JsonReader;->peek()Landroid/util/JsonToken;
-HSPLandroid/util/JsonReader;->peekStack()Landroid/util/JsonScope;
-HSPLandroid/util/JsonReader;->pop()Landroid/util/JsonScope;
-HSPLandroid/util/JsonReader;->push(Landroid/util/JsonScope;)V
-HSPLandroid/util/JsonReader;->readEscapeCharacter()C
-HSPLandroid/util/JsonReader;->readLiteral()Landroid/util/JsonToken;
-HSPLandroid/util/JsonReader;->replaceTop(Landroid/util/JsonScope;)V
-HSPLandroid/util/JsonReader;->skipValue()V
-HSPLandroid/util/JsonToken;->values()[Landroid/util/JsonToken;
-HSPLandroid/util/JsonWriter;-><init>(Ljava/io/Writer;)V
-HSPLandroid/util/JsonWriter;->beforeName()V
-HSPLandroid/util/JsonWriter;->beforeValue(Z)V
-HSPLandroid/util/JsonWriter;->beginArray()Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->beginObject()Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->close()V
-HSPLandroid/util/JsonWriter;->close(Landroid/util/JsonScope;Landroid/util/JsonScope;Ljava/lang/String;)Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->endArray()Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->endObject()Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->flush()V
-HSPLandroid/util/JsonWriter;->name(Ljava/lang/String;)Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->newline()V
-HSPLandroid/util/JsonWriter;->open(Landroid/util/JsonScope;Ljava/lang/String;)Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->peek()Landroid/util/JsonScope;+]Ljava/util/List;Ljava/util/ArrayList;
-HSPLandroid/util/JsonWriter;->replaceTop(Landroid/util/JsonScope;)V+]Ljava/util/List;Ljava/util/ArrayList;
-HSPLandroid/util/JsonWriter;->string(Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String;]Ljava/io/Writer;Ljava/io/BufferedWriter;
-HSPLandroid/util/JsonWriter;->value(J)Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->value(Ljava/lang/String;)Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->value(Z)Landroid/util/JsonWriter;
-HSPLandroid/util/KeyValueListParser$IntValue;->getValue()I
-HSPLandroid/util/KeyValueListParser;-><init>(C)V
-HSPLandroid/util/KeyValueListParser;->getBoolean(Ljava/lang/String;Z)Z
-HSPLandroid/util/KeyValueListParser;->getInt(Ljava/lang/String;I)I
-HSPLandroid/util/KeyValueListParser;->getLong(Ljava/lang/String;J)J
-HSPLandroid/util/KeyValueListParser;->setString(Ljava/lang/String;)V
-HSPLandroid/util/LocalLog;-><init>(I)V
-HSPLandroid/util/LocalLog;-><init>(IZ)V
-HSPLandroid/util/LocalLog;->append(Ljava/lang/String;)V
-HSPLandroid/util/LocalLog;->log(Ljava/lang/String;)V
-HSPLandroid/util/Log$1;->onTerribleFailure(Ljava/lang/String;Landroid/util/Log$TerribleFailure;Z)V
-HSPLandroid/util/Log$ImmediateLogWriter;-><init>(IILjava/lang/String;)V
-HSPLandroid/util/Log$ImmediateLogWriter;->flush()V
-HSPLandroid/util/Log$ImmediateLogWriter;->getWritten()I
-HSPLandroid/util/Log$ImmediateLogWriter;->write([CII)V
-HSPLandroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
-HSPLandroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
-HSPLandroid/util/Log;->getStackTraceString(Ljava/lang/Throwable;)Ljava/lang/String;
-HSPLandroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
-HSPLandroid/util/Log;->logToRadioBuffer(ILjava/lang/String;Ljava/lang/String;)I
-HSPLandroid/util/Log;->println(ILjava/lang/String;Ljava/lang/String;)I
-HSPLandroid/util/Log;->printlns(IILjava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
-HSPLandroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
-HSPLandroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
-HSPLandroid/util/Log;->wtf(ILjava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;ZZ)I
-HSPLandroid/util/LogPrinter;-><init>(ILjava/lang/String;)V
-HSPLandroid/util/LongArray;-><init>()V
-HSPLandroid/util/LongArray;-><init>(I)V
-HSPLandroid/util/LongArray;->add(IJ)V
-HSPLandroid/util/LongArray;->add(J)V
-HSPLandroid/util/LongArray;->ensureCapacity(I)V
-HSPLandroid/util/LongArray;->get(I)J
-HSPLandroid/util/LongArray;->indexOf(J)I
-HSPLandroid/util/LongArray;->size()I
-HSPLandroid/util/LongArray;->toArray()[J
-HSPLandroid/util/LongSparseArray;-><init>()V
-HSPLandroid/util/LongSparseArray;-><init>(I)V
-HSPLandroid/util/LongSparseArray;->append(JLjava/lang/Object;)V
-HSPLandroid/util/LongSparseArray;->clear()V
-HSPLandroid/util/LongSparseArray;->delete(J)V
-HSPLandroid/util/LongSparseArray;->gc()V
-HSPLandroid/util/LongSparseArray;->get(J)Ljava/lang/Object;+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
-HSPLandroid/util/LongSparseArray;->get(JLjava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/util/LongSparseArray;->indexOfKey(J)I
-HSPLandroid/util/LongSparseArray;->keyAt(I)J
-HSPLandroid/util/LongSparseArray;->put(JLjava/lang/Object;)V
-HSPLandroid/util/LongSparseArray;->remove(J)V
-HSPLandroid/util/LongSparseArray;->removeAt(I)V
-HSPLandroid/util/LongSparseArray;->size()I
-HSPLandroid/util/LongSparseArray;->valueAt(I)Ljava/lang/Object;
-HSPLandroid/util/LongSparseLongArray;-><init>()V
-HSPLandroid/util/LongSparseLongArray;-><init>(I)V
-HSPLandroid/util/LongSparseLongArray;->append(JJ)V
-HSPLandroid/util/LongSparseLongArray;->clear()V
-HSPLandroid/util/LongSparseLongArray;->clone()Landroid/util/LongSparseLongArray;
-HSPLandroid/util/LongSparseLongArray;->get(JJ)J
-HSPLandroid/util/LongSparseLongArray;->indexOfKey(J)I
-HSPLandroid/util/LongSparseLongArray;->put(JJ)V
-HSPLandroid/util/LongSparseLongArray;->size()I
-HSPLandroid/util/LongSparseLongArray;->valueAt(I)J
-HSPLandroid/util/LruCache;-><init>(I)V
-HSPLandroid/util/LruCache;->create(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/util/LruCache;->entryRemoved(ZLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLandroid/util/LruCache;->evictAll()V
-HSPLandroid/util/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;]Landroid/util/LruCache;missing_types
-HSPLandroid/util/LruCache;->hitCount()I
-HSPLandroid/util/LruCache;->maxSize()I
-HSPLandroid/util/LruCache;->missCount()I
-HSPLandroid/util/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;]Landroid/util/LruCache;Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;,Landroid/util/LruCache;
-HSPLandroid/util/LruCache;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/util/LruCache;->resize(I)V
-HSPLandroid/util/LruCache;->safeSizeOf(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/util/LruCache;->size()I
-HSPLandroid/util/LruCache;->sizeOf(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/util/LruCache;->snapshot()Ljava/util/Map;
-HSPLandroid/util/LruCache;->trimToSize(I)V+]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;]Landroid/util/LruCache;Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;
-HSPLandroid/util/MapCollections$ArrayIterator;-><init>(Landroid/util/MapCollections;I)V+]Landroid/util/MapCollections;Landroid/util/ArraySet$1;,Landroid/util/ArrayMap$1;
-HSPLandroid/util/MapCollections$ArrayIterator;->hasNext()Z
-HSPLandroid/util/MapCollections$ArrayIterator;->next()Ljava/lang/Object;+]Landroid/util/MapCollections$ArrayIterator;Landroid/util/MapCollections$ArrayIterator;]Landroid/util/MapCollections;Landroid/util/ArraySet$1;,Landroid/util/ArrayMap$1;
-HSPLandroid/util/MapCollections$ArrayIterator;->remove()V
-HSPLandroid/util/MapCollections$EntrySet;-><init>(Landroid/util/MapCollections;)V
-HSPLandroid/util/MapCollections$EntrySet;->iterator()Ljava/util/Iterator;
-HSPLandroid/util/MapCollections$EntrySet;->size()I
-HSPLandroid/util/MapCollections$KeySet;-><init>(Landroid/util/MapCollections;)V
-HSPLandroid/util/MapCollections$KeySet;->contains(Ljava/lang/Object;)Z
-HSPLandroid/util/MapCollections$KeySet;->containsAll(Ljava/util/Collection;)Z
-HSPLandroid/util/MapCollections$KeySet;->iterator()Ljava/util/Iterator;
-HSPLandroid/util/MapCollections$KeySet;->size()I
-HSPLandroid/util/MapCollections$KeySet;->toArray()[Ljava/lang/Object;
-HSPLandroid/util/MapCollections$KeySet;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLandroid/util/MapCollections$MapIterator;-><init>(Landroid/util/MapCollections;)V
-HSPLandroid/util/MapCollections$MapIterator;->getKey()Ljava/lang/Object;
-HSPLandroid/util/MapCollections$MapIterator;->getValue()Ljava/lang/Object;
-HSPLandroid/util/MapCollections$MapIterator;->hasNext()Z
-HSPLandroid/util/MapCollections$MapIterator;->next()Ljava/lang/Object;
-HSPLandroid/util/MapCollections$MapIterator;->next()Ljava/util/Map$Entry;
-HSPLandroid/util/MapCollections$ValuesCollection;->iterator()Ljava/util/Iterator;
-HSPLandroid/util/MapCollections$ValuesCollection;->size()I
-HSPLandroid/util/MapCollections$ValuesCollection;->toArray()[Ljava/lang/Object;
-HSPLandroid/util/MapCollections;-><init>()V
-HSPLandroid/util/MapCollections;->getEntrySet()Ljava/util/Set;
-HSPLandroid/util/MapCollections;->getKeySet()Ljava/util/Set;
-HSPLandroid/util/MapCollections;->getValues()Ljava/util/Collection;
-HSPLandroid/util/MapCollections;->retainAllHelper(Ljava/util/Map;Ljava/util/Collection;)Z
-HSPLandroid/util/MapCollections;->toArrayHelper(I)[Ljava/lang/Object;
-HSPLandroid/util/MapCollections;->toArrayHelper([Ljava/lang/Object;I)[Ljava/lang/Object;
-HSPLandroid/util/MathUtils;->addOrThrow(II)I
-HSPLandroid/util/MathUtils;->constrain(FFF)F
-HSPLandroid/util/MathUtils;->constrain(III)I
-HSPLandroid/util/MathUtils;->constrainedMap(FFFFF)F
-HSPLandroid/util/MathUtils;->lerp(FFF)F
-HSPLandroid/util/MathUtils;->lerpInv(FFF)F
-HSPLandroid/util/MathUtils;->lerpInvSat(FFF)F
-HSPLandroid/util/MathUtils;->saturate(F)F
-HSPLandroid/util/MemoryIntArray$1;->createFromParcel(Landroid/os/Parcel;)Landroid/util/MemoryIntArray;
-HSPLandroid/util/MemoryIntArray$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/util/MemoryIntArray;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/util/MemoryIntArray;-><init>(Landroid/os/Parcel;Landroid/util/MemoryIntArray-IA;)V
-HSPLandroid/util/MemoryIntArray;->close()V
-HSPLandroid/util/MemoryIntArray;->enforceNotClosed()V
-HSPLandroid/util/MemoryIntArray;->enforceValidIndex(I)V
-HSPLandroid/util/MemoryIntArray;->finalize()V
-HSPLandroid/util/MemoryIntArray;->get(I)I
-HSPLandroid/util/MemoryIntArray;->isClosed()Z
-HSPLandroid/util/MemoryIntArray;->size()I
-HSPLandroid/util/MergedConfiguration$1;->createFromParcel(Landroid/os/Parcel;)Landroid/util/MergedConfiguration;
-HSPLandroid/util/MergedConfiguration$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/util/MergedConfiguration;-><init>()V
-HSPLandroid/util/MergedConfiguration;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/util/MergedConfiguration;-><init>(Landroid/util/MergedConfiguration;)V
-HSPLandroid/util/MergedConfiguration;->equals(Ljava/lang/Object;)Z
-HSPLandroid/util/MergedConfiguration;->getGlobalConfiguration()Landroid/content/res/Configuration;
-HSPLandroid/util/MergedConfiguration;->getMergedConfiguration()Landroid/content/res/Configuration;
-HSPLandroid/util/MergedConfiguration;->getOverrideConfiguration()Landroid/content/res/Configuration;
-HSPLandroid/util/MergedConfiguration;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/util/MergedConfiguration;->setConfiguration(Landroid/content/res/Configuration;Landroid/content/res/Configuration;)V
-HSPLandroid/util/MergedConfiguration;->updateMergedConfig()V
-HSPLandroid/util/MutableBoolean;-><init>(Z)V
-HSPLandroid/util/Pair;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLandroid/util/Pair;->create(Ljava/lang/Object;Ljava/lang/Object;)Landroid/util/Pair;
-HSPLandroid/util/Pair;->equals(Ljava/lang/Object;)Z
-HSPLandroid/util/Pair;->hashCode()I
-HSPLandroid/util/Pair;->toString()Ljava/lang/String;
-HSPLandroid/util/PathParser$PathData;-><init>(Landroid/util/PathParser$PathData;)V
-HSPLandroid/util/PathParser$PathData;-><init>(Ljava/lang/String;)V
-HSPLandroid/util/PathParser$PathData;->finalize()V
-HSPLandroid/util/PathParser$PathData;->getNativePtr()J
-HSPLandroid/util/PathParser;->-$$Nest$smnCreateEmptyPathData()J
-HSPLandroid/util/PathParser;->-$$Nest$smnCreatePathData(J)J
-HSPLandroid/util/PathParser;->-$$Nest$smnCreatePathDataFromString(Ljava/lang/String;I)J
-HSPLandroid/util/PathParser;->-$$Nest$smnFinalize(J)V
-HSPLandroid/util/PathParser;->createPathFromPathData(Ljava/lang/String;)Landroid/graphics/Path;
-HSPLandroid/util/Pools$SimplePool;-><init>(I)V
-HSPLandroid/util/Pools$SimplePool;->acquire()Ljava/lang/Object;
-HSPLandroid/util/Pools$SimplePool;->isInPool(Ljava/lang/Object;)Z
-HSPLandroid/util/Pools$SimplePool;->release(Ljava/lang/Object;)Z
-HSPLandroid/util/Pools$SynchronizedPool;-><init>(I)V
-HSPLandroid/util/Pools$SynchronizedPool;-><init>(ILjava/lang/Object;)V
-HSPLandroid/util/Pools$SynchronizedPool;->acquire()Ljava/lang/Object;
-HSPLandroid/util/Pools$SynchronizedPool;->release(Ljava/lang/Object;)Z
-HSPLandroid/util/PrefixPrinter;->println(Ljava/lang/String;)V
-HSPLandroid/util/PrintWriterPrinter;->println(Ljava/lang/String;)V
-HSPLandroid/util/Property;-><init>(Ljava/lang/Class;Ljava/lang/String;)V
-HSPLandroid/util/Property;->getName()Ljava/lang/String;
-HSPLandroid/util/Property;->getType()Ljava/lang/Class;
-HSPLandroid/util/Range;-><init>(Ljava/lang/Comparable;Ljava/lang/Comparable;)V
-HSPLandroid/util/Range;->clamp(Ljava/lang/Comparable;)Ljava/lang/Comparable;
-HSPLandroid/util/Range;->contains(Landroid/util/Range;)Z
-HSPLandroid/util/Range;->contains(Ljava/lang/Comparable;)Z
-HSPLandroid/util/Range;->create(Ljava/lang/Comparable;Ljava/lang/Comparable;)Landroid/util/Range;
-HSPLandroid/util/Range;->equals(Ljava/lang/Object;)Z
-HSPLandroid/util/Range;->extend(Landroid/util/Range;)Landroid/util/Range;
-HSPLandroid/util/Range;->getLower()Ljava/lang/Comparable;
-HSPLandroid/util/Range;->getUpper()Ljava/lang/Comparable;
-HSPLandroid/util/Range;->hashCode()I
-HSPLandroid/util/Range;->intersect(Landroid/util/Range;)Landroid/util/Range;
-HSPLandroid/util/Range;->intersect(Ljava/lang/Comparable;Ljava/lang/Comparable;)Landroid/util/Range;
-HSPLandroid/util/Rational;-><init>(II)V
-HSPLandroid/util/Rational;->compareTo(Landroid/util/Rational;)I
-HSPLandroid/util/Rational;->compareTo(Ljava/lang/Object;)I
-HSPLandroid/util/Singleton;-><init>()V
-HSPLandroid/util/Singleton;->get()Ljava/lang/Object;
-HSPLandroid/util/Size;-><init>(II)V
-HSPLandroid/util/Size;->equals(Ljava/lang/Object;)Z
-HSPLandroid/util/Size;->getHeight()I
-HSPLandroid/util/Size;->getWidth()I
-HSPLandroid/util/Size;->hashCode()I
-HSPLandroid/util/Size;->parseSize(Ljava/lang/String;)Landroid/util/Size;
-HSPLandroid/util/Size;->toString()Ljava/lang/String;
-HSPLandroid/util/Slog;->d(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/util/Slog;->e(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/util/Slog;->i(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/util/Slog;->v(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/util/Slog;->w(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/util/SparseArray;-><init>()V
-HSPLandroid/util/SparseArray;-><init>(I)V
-HSPLandroid/util/SparseArray;->append(ILjava/lang/Object;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLandroid/util/SparseArray;->clear()V
-HSPLandroid/util/SparseArray;->clone()Landroid/util/SparseArray;
-HSPLandroid/util/SparseArray;->contains(I)Z
-HSPLandroid/util/SparseArray;->contentEquals(Landroid/util/SparseArray;)Z
-HSPLandroid/util/SparseArray;->delete(I)V
-HSPLandroid/util/SparseArray;->gc()V
-HSPLandroid/util/SparseArray;->get(I)Ljava/lang/Object;+]Landroid/util/SparseArray;missing_types
-HSPLandroid/util/SparseArray;->get(ILjava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/util/SparseArray;->indexOfKey(I)I
-HSPLandroid/util/SparseArray;->indexOfValue(Ljava/lang/Object;)I
-HSPLandroid/util/SparseArray;->keyAt(I)I
-HSPLandroid/util/SparseArray;->put(ILjava/lang/Object;)V
-HSPLandroid/util/SparseArray;->remove(I)V
-HSPLandroid/util/SparseArray;->removeAt(I)V
-HSPLandroid/util/SparseArray;->removeReturnOld(I)Ljava/lang/Object;
-HSPLandroid/util/SparseArray;->setValueAt(ILjava/lang/Object;)V
-HSPLandroid/util/SparseArray;->size()I
-HSPLandroid/util/SparseArray;->toString()Ljava/lang/String;
-HSPLandroid/util/SparseArray;->valueAt(I)Ljava/lang/Object;
-HSPLandroid/util/SparseArrayMap;-><init>()V
-HSPLandroid/util/SparseArrayMap;->add(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/util/SparseArrayMap;->get(ILjava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/util/SparseBooleanArray;-><init>()V
-HSPLandroid/util/SparseBooleanArray;-><init>(I)V
-HSPLandroid/util/SparseBooleanArray;->append(IZ)V
-HSPLandroid/util/SparseBooleanArray;->clear()V
-HSPLandroid/util/SparseBooleanArray;->clone()Landroid/util/SparseBooleanArray;
-HSPLandroid/util/SparseBooleanArray;->delete(I)V
-HSPLandroid/util/SparseBooleanArray;->get(I)Z
-HSPLandroid/util/SparseBooleanArray;->get(IZ)Z
-HSPLandroid/util/SparseBooleanArray;->indexOfKey(I)I
-HSPLandroid/util/SparseBooleanArray;->indexOfValue(Z)I
-HSPLandroid/util/SparseBooleanArray;->keyAt(I)I
-HSPLandroid/util/SparseBooleanArray;->put(IZ)V
-HSPLandroid/util/SparseBooleanArray;->size()I
-HSPLandroid/util/SparseBooleanArray;->valueAt(I)Z
-HSPLandroid/util/SparseIntArray;-><init>()V
-HSPLandroid/util/SparseIntArray;-><init>(I)V
-HSPLandroid/util/SparseIntArray;->append(II)V
-HSPLandroid/util/SparseIntArray;->clear()V
-HSPLandroid/util/SparseIntArray;->clone()Landroid/util/SparseIntArray;
-HSPLandroid/util/SparseIntArray;->copyKeys()[I
-HSPLandroid/util/SparseIntArray;->delete(I)V
-HSPLandroid/util/SparseIntArray;->get(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HSPLandroid/util/SparseIntArray;->get(II)I
-HSPLandroid/util/SparseIntArray;->indexOfKey(I)I
-HSPLandroid/util/SparseIntArray;->indexOfValue(I)I
-HSPLandroid/util/SparseIntArray;->keyAt(I)I
-HSPLandroid/util/SparseIntArray;->put(II)V
-HSPLandroid/util/SparseIntArray;->removeAt(I)V
-HSPLandroid/util/SparseIntArray;->size()I
-HSPLandroid/util/SparseIntArray;->valueAt(I)I
-HSPLandroid/util/SparseLongArray;-><init>()V
-HSPLandroid/util/SparseLongArray;-><init>(I)V
-HSPLandroid/util/SparseLongArray;->clear()V
-HSPLandroid/util/SparseLongArray;->delete(I)V
-HSPLandroid/util/SparseLongArray;->get(I)J
-HSPLandroid/util/SparseLongArray;->get(IJ)J
-HSPLandroid/util/SparseLongArray;->indexOfKey(I)I
-HSPLandroid/util/SparseLongArray;->keyAt(I)I
-HSPLandroid/util/SparseLongArray;->put(IJ)V
-HSPLandroid/util/SparseLongArray;->removeAt(I)V
-HSPLandroid/util/SparseLongArray;->size()I
-HSPLandroid/util/SparseLongArray;->valueAt(I)J
-HSPLandroid/util/SparseSetArray;-><init>()V
-HSPLandroid/util/SparseSetArray;->add(ILjava/lang/Object;)Z
-HSPLandroid/util/SparseSetArray;->get(I)Landroid/util/ArraySet;
-HSPLandroid/util/Spline$MonotoneCubicSpline;-><init>([F[F)V
-HSPLandroid/util/Spline$MonotoneCubicSpline;->interpolate(F)F
-HSPLandroid/util/StateSet;->get(I)[I
-HSPLandroid/util/StateSet;->stateSetMatches([I[I)Z
-HSPLandroid/util/StateSet;->trimStateSet([II)[I
-HSPLandroid/util/SystemConfigFileCommitEventLogger;-><init>(Ljava/lang/String;)V
-HSPLandroid/util/TimeUtils;->formatDuration(J)Ljava/lang/String;
-HSPLandroid/util/TimeUtils;->formatDuration(JLjava/lang/StringBuilder;)V
-HSPLandroid/util/TimeUtils;->formatDurationLocked(JI)I
-HSPLandroid/util/TimeUtils;->printFieldLocked([CICIZI)I
-HSPLandroid/util/TimingLogger;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/util/TimingLogger;->addSplit(Ljava/lang/String;)V
-HSPLandroid/util/TimingLogger;->dumpToLog()V
-HSPLandroid/util/TimingLogger;->reset()V
-HSPLandroid/util/TimingLogger;->reset(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/util/TimingsTraceLog;-><init>(Ljava/lang/String;J)V
-HSPLandroid/util/TimingsTraceLog;-><init>(Ljava/lang/String;JI)V
-HSPLandroid/util/TimingsTraceLog;->assertSameThread()V
-HSPLandroid/util/TimingsTraceLog;->logDuration(Ljava/lang/String;J)V
-HSPLandroid/util/TimingsTraceLog;->traceBegin(Ljava/lang/String;)V
-HSPLandroid/util/TimingsTraceLog;->traceEnd()V
-HSPLandroid/util/TypedValue;-><init>()V
-HSPLandroid/util/TypedValue;->applyDimension(IFLandroid/util/DisplayMetrics;)F
-HSPLandroid/util/TypedValue;->coerceToString()Ljava/lang/CharSequence;
-HSPLandroid/util/TypedValue;->coerceToString(II)Ljava/lang/String;
-HSPLandroid/util/TypedValue;->complexToDimension(ILandroid/util/DisplayMetrics;)F
-HSPLandroid/util/TypedValue;->complexToDimensionPixelOffset(ILandroid/util/DisplayMetrics;)I
-HSPLandroid/util/TypedValue;->complexToDimensionPixelSize(ILandroid/util/DisplayMetrics;)I
-HSPLandroid/util/TypedValue;->complexToFloat(I)F
-HSPLandroid/util/TypedValue;->complexToFraction(IFF)F
-HSPLandroid/util/TypedValue;->getComplexUnit()I
-HSPLandroid/util/TypedValue;->getDimension(Landroid/util/DisplayMetrics;)F
-HSPLandroid/util/TypedValue;->getFloat()F
-HSPLandroid/util/TypedValue;->getFraction(FF)F
-HSPLandroid/util/TypedValue;->toString()Ljava/lang/String;
-HSPLandroid/util/UtilConfig;->setThrowExceptionForUpperArrayOutOfBounds(Z)V
-HSPLandroid/util/Xml;->asAttributeSet(Lorg/xmlpull/v1/XmlPullParser;)Landroid/util/AttributeSet;
-HSPLandroid/util/Xml;->newFastPullParser()Lcom/android/modules/utils/TypedXmlPullParser;
-HSPLandroid/util/Xml;->newFastSerializer()Lcom/android/modules/utils/TypedXmlSerializer;
-HSPLandroid/util/Xml;->newPullParser()Lorg/xmlpull/v1/XmlPullParser;
-HSPLandroid/util/Xml;->newSerializer()Lorg/xmlpull/v1/XmlSerializer;
-HSPLandroid/util/proto/EncodedBuffer;-><init>(I)V
-HSPLandroid/util/proto/EncodedBuffer;->editRawFixed32(II)V
-HSPLandroid/util/proto/EncodedBuffer;->getBytes(I)[B
-HSPLandroid/util/proto/EncodedBuffer;->getRawFixed32At(I)I
-HSPLandroid/util/proto/EncodedBuffer;->getRawVarint32Size(I)I
-HSPLandroid/util/proto/EncodedBuffer;->getReadPos()I
-HSPLandroid/util/proto/EncodedBuffer;->getReadableSize()I
-HSPLandroid/util/proto/EncodedBuffer;->getWritePos()I
-HSPLandroid/util/proto/EncodedBuffer;->readRawByte()B
-HSPLandroid/util/proto/EncodedBuffer;->readRawFixed32()I
-HSPLandroid/util/proto/EncodedBuffer;->readRawUnsigned()J
-HSPLandroid/util/proto/EncodedBuffer;->rewindWriteTo(I)V
-HSPLandroid/util/proto/EncodedBuffer;->skipRead(I)V
-HSPLandroid/util/proto/EncodedBuffer;->startEditing()V
-HSPLandroid/util/proto/EncodedBuffer;->writeFromThisBuffer(II)V
-HSPLandroid/util/proto/EncodedBuffer;->writeRawBuffer([B)V
-HSPLandroid/util/proto/EncodedBuffer;->writeRawBuffer([BII)V
-HSPLandroid/util/proto/EncodedBuffer;->writeRawByte(B)V
-HSPLandroid/util/proto/EncodedBuffer;->writeRawFixed32(I)V
-HSPLandroid/util/proto/EncodedBuffer;->writeRawVarint32(I)V
-HSPLandroid/util/proto/EncodedBuffer;->writeRawVarint64(J)V
-HSPLandroid/util/proto/ProtoInputStream;->assertFieldNumber(J)V
-HSPLandroid/util/proto/ProtoInputStream;->assertFreshData()V
-HSPLandroid/util/proto/ProtoInputStream;->assertWireType(I)V
-HSPLandroid/util/proto/ProtoInputStream;->checkPacked(J)V
-HSPLandroid/util/proto/ProtoInputStream;->end(J)V
-HSPLandroid/util/proto/ProtoInputStream;->fillBuffer()V
-HSPLandroid/util/proto/ProtoInputStream;->getFieldNumber()I
-HSPLandroid/util/proto/ProtoInputStream;->getOffset()I
-HSPLandroid/util/proto/ProtoInputStream;->incOffset(I)V
-HSPLandroid/util/proto/ProtoInputStream;->nextField()I
-HSPLandroid/util/proto/ProtoInputStream;->nextField(J)Z
-HSPLandroid/util/proto/ProtoInputStream;->readInt(J)I
-HSPLandroid/util/proto/ProtoInputStream;->readLong(J)J
-HSPLandroid/util/proto/ProtoInputStream;->readRawString(I)Ljava/lang/String;
-HSPLandroid/util/proto/ProtoInputStream;->readString(J)Ljava/lang/String;
-HSPLandroid/util/proto/ProtoInputStream;->readTag()V
-HSPLandroid/util/proto/ProtoInputStream;->readVarint()J
-HSPLandroid/util/proto/ProtoInputStream;->start(J)J
-HSPLandroid/util/proto/ProtoOutputStream;-><init>()V
-HSPLandroid/util/proto/ProtoOutputStream;-><init>(I)V
-HSPLandroid/util/proto/ProtoOutputStream;->assertNotCompacted()V
-HSPLandroid/util/proto/ProtoOutputStream;->compactIfNecessary()V
-HSPLandroid/util/proto/ProtoOutputStream;->compactSizes(I)V
-HSPLandroid/util/proto/ProtoOutputStream;->editEncodedSize(I)I
-HSPLandroid/util/proto/ProtoOutputStream;->end(J)V
-HSPLandroid/util/proto/ProtoOutputStream;->endObjectImpl(JZ)V
-HSPLandroid/util/proto/ProtoOutputStream;->flush()V
-HSPLandroid/util/proto/ProtoOutputStream;->getTagSize(I)I
-HSPLandroid/util/proto/ProtoOutputStream;->readRawTag()I
-HSPLandroid/util/proto/ProtoOutputStream;->start(J)J
-HSPLandroid/util/proto/ProtoOutputStream;->startObjectImpl(IZ)J
-HSPLandroid/util/proto/ProtoOutputStream;->write(JI)V
-HSPLandroid/util/proto/ProtoOutputStream;->write(JJ)V
-HSPLandroid/util/proto/ProtoOutputStream;->write(JLjava/lang/String;)V
-HSPLandroid/util/proto/ProtoOutputStream;->writeInt32Impl(II)V
-HSPLandroid/util/proto/ProtoOutputStream;->writeKnownLengthHeader(II)V
-HSPLandroid/util/proto/ProtoOutputStream;->writeStringImpl(ILjava/lang/String;)V
-HSPLandroid/util/proto/ProtoOutputStream;->writeTag(II)V
-HSPLandroid/util/proto/ProtoOutputStream;->writeUnsignedVarintFromSignedInt(I)V
-HSPLandroid/util/proto/ProtoOutputStream;->writeUtf8String(ILjava/lang/String;)V
-HSPLandroid/util/proto/ProtoStream;-><init>()V
-HSPLandroid/util/proto/ProtoStream;->getDepthFromToken(J)I
-HSPLandroid/util/proto/ProtoStream;->getOffsetFromToken(J)I
-HSPLandroid/util/proto/ProtoStream;->getRepeatedFromToken(J)Z
-HSPLandroid/util/proto/ProtoStream;->makeToken(IZIII)J
-HSPLandroid/view/AbsSavedState$2;->createFromParcel(Landroid/os/Parcel;Ljava/lang/ClassLoader;)Landroid/view/AbsSavedState;
-HSPLandroid/view/AbsSavedState$2;->createFromParcel(Landroid/os/Parcel;Ljava/lang/ClassLoader;)Ljava/lang/Object;
-HSPLandroid/view/AbsSavedState;-><init>(Landroid/os/Parcelable;)V
-HSPLandroid/view/AbsSavedState;->getSuperState()Landroid/os/Parcelable;
-HSPLandroid/view/AbsSavedState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/Choreographer$1;->initialValue()Landroid/view/Choreographer;
-HSPLandroid/view/Choreographer$1;->initialValue()Ljava/lang/Object;
-HSPLandroid/view/Choreographer$2;->initialValue()Landroid/view/Choreographer;
-HSPLandroid/view/Choreographer$2;->initialValue()Ljava/lang/Object;
-HSPLandroid/view/Choreographer$CallbackQueue;-><init>(Landroid/view/Choreographer;)V
-HSPLandroid/view/Choreographer$CallbackQueue;-><init>(Landroid/view/Choreographer;Landroid/view/Choreographer$CallbackQueue-IA;)V
-HSPLandroid/view/Choreographer$CallbackQueue;->addCallbackLocked(JLjava/lang/Object;Ljava/lang/Object;)V
-HSPLandroid/view/Choreographer$CallbackQueue;->extractDueCallbacksLocked(J)Landroid/view/Choreographer$CallbackRecord;
-HSPLandroid/view/Choreographer$CallbackQueue;->removeCallbacksLocked(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLandroid/view/Choreographer$CallbackRecord;-><init>()V
-HSPLandroid/view/Choreographer$CallbackRecord;-><init>(Landroid/view/Choreographer$CallbackRecord-IA;)V
-HSPLandroid/view/Choreographer$CallbackRecord;->run(J)V+]Landroid/view/Choreographer$FrameCallback;missing_types]Ljava/lang/Runnable;missing_types
-HSPLandroid/view/Choreographer$CallbackRecord;->run(Landroid/view/Choreographer$FrameData;)V+]Landroid/view/Choreographer$FrameData;Landroid/view/Choreographer$FrameData;]Landroid/view/Choreographer$CallbackRecord;Landroid/view/Choreographer$CallbackRecord;
-HSPLandroid/view/Choreographer$FrameData;->-$$Nest$fgetmFrameTimeNanos(Landroid/view/Choreographer$FrameData;)J
-HSPLandroid/view/Choreographer$FrameData;-><init>()V
-HSPLandroid/view/Choreographer$FrameData;->allocateFrameTimelines(I)V
-HSPLandroid/view/Choreographer$FrameData;->checkInCallback()V
-HSPLandroid/view/Choreographer$FrameData;->getFrameTimeNanos()J
-HSPLandroid/view/Choreographer$FrameData;->getFrameTimelines()[Landroid/view/Choreographer$FrameTimeline;
-HSPLandroid/view/Choreographer$FrameData;->getPreferredFrameTimeline()Landroid/view/Choreographer$FrameTimeline;
-HSPLandroid/view/Choreographer$FrameData;->setInCallback(Z)V+]Landroid/view/Choreographer$FrameTimeline;Landroid/view/Choreographer$FrameTimeline;
-HSPLandroid/view/Choreographer$FrameData;->update(JI)V
-HSPLandroid/view/Choreographer$FrameData;->update(JLandroid/view/DisplayEventReceiver$VsyncEventData;)Landroid/view/Choreographer$FrameTimeline;+]Landroid/view/Choreographer$FrameTimeline;Landroid/view/Choreographer$FrameTimeline;
-HSPLandroid/view/Choreographer$FrameData;->update(JLandroid/view/DisplayEventReceiver;J)Landroid/view/Choreographer$FrameTimeline;
-HSPLandroid/view/Choreographer$FrameDisplayEventReceiver;-><init>(Landroid/view/Choreographer;Landroid/os/Looper;IJ)V
-HSPLandroid/view/Choreographer$FrameDisplayEventReceiver;->onVsync(JJILandroid/view/DisplayEventReceiver$VsyncEventData;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/Message;Landroid/os/Message;]Landroid/view/Choreographer$FrameHandler;Landroid/view/Choreographer$FrameHandler;]Landroid/view/DisplayEventReceiver$VsyncEventData;Landroid/view/DisplayEventReceiver$VsyncEventData;
-HSPLandroid/view/Choreographer$FrameDisplayEventReceiver;->run()V+]Landroid/view/Choreographer;Landroid/view/Choreographer;
-HSPLandroid/view/Choreographer$FrameHandler;-><init>(Landroid/view/Choreographer;Landroid/os/Looper;)V
-HSPLandroid/view/Choreographer$FrameHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/view/Choreographer$FrameTimeline;->-$$Nest$fgetmDeadlineNanos(Landroid/view/Choreographer$FrameTimeline;)J
-HSPLandroid/view/Choreographer$FrameTimeline;->-$$Nest$fgetmExpectedPresentationTimeNanos(Landroid/view/Choreographer$FrameTimeline;)J
-HSPLandroid/view/Choreographer$FrameTimeline;->-$$Nest$fgetmVsyncId(Landroid/view/Choreographer$FrameTimeline;)J
-HSPLandroid/view/Choreographer$FrameTimeline;-><init>()V
-HSPLandroid/view/Choreographer$FrameTimeline;->getDeadlineNanos()J
-HSPLandroid/view/Choreographer$FrameTimeline;->setInCallback(Z)V
-HSPLandroid/view/Choreographer$FrameTimeline;->update(JJJ)V
-HSPLandroid/view/Choreographer;->-$$Nest$fgetmHandler(Landroid/view/Choreographer;)Landroid/view/Choreographer$FrameHandler;
-HSPLandroid/view/Choreographer;->-$$Nest$mobtainCallbackLocked(Landroid/view/Choreographer;JLjava/lang/Object;Ljava/lang/Object;)Landroid/view/Choreographer$CallbackRecord;
-HSPLandroid/view/Choreographer;->-$$Nest$sfgetVSYNC_CALLBACK_TOKEN()Ljava/lang/Object;
-HSPLandroid/view/Choreographer;->-$$Nest$sfputmMainInstance(Landroid/view/Choreographer;)V
-HSPLandroid/view/Choreographer;-><init>(Landroid/os/Looper;I)V
-HSPLandroid/view/Choreographer;-><init>(Landroid/os/Looper;IJ)V
-HSPLandroid/view/Choreographer;-><init>(Landroid/os/Looper;ILandroid/view/Choreographer-IA;)V
-HSPLandroid/view/Choreographer;->doCallbacks(IJ)V+]Landroid/view/Choreographer$CallbackQueue;Landroid/view/Choreographer$CallbackQueue;]Landroid/view/Choreographer$CallbackRecord;Landroid/view/Choreographer$CallbackRecord;]Landroid/view/Choreographer$FrameData;Landroid/view/Choreographer$FrameData;
-HSPLandroid/view/Choreographer;->doFrame(JILandroid/view/DisplayEventReceiver$VsyncEventData;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/view/Choreographer$FrameData;Landroid/view/Choreographer$FrameData;]Landroid/graphics/FrameInfo;Landroid/graphics/FrameInfo;]Landroid/view/Choreographer;Landroid/view/Choreographer;]Landroid/view/DisplayEventReceiver$VsyncEventData;Landroid/view/DisplayEventReceiver$VsyncEventData;
-HSPLandroid/view/Choreographer;->doScheduleCallback(I)V
-HSPLandroid/view/Choreographer;->doScheduleVsync()V
-HSPLandroid/view/Choreographer;->getFrameIntervalNanos()J
-HSPLandroid/view/Choreographer;->getFrameTime()J+]Landroid/view/Choreographer;Landroid/view/Choreographer;
-HSPLandroid/view/Choreographer;->getFrameTimeNanos()J
-HSPLandroid/view/Choreographer;->getInstance()Landroid/view/Choreographer;
-HSPLandroid/view/Choreographer;->getMainThreadInstance()Landroid/view/Choreographer;
-HSPLandroid/view/Choreographer;->getRefreshRate()F
-HSPLandroid/view/Choreographer;->getSfInstance()Landroid/view/Choreographer;
-HSPLandroid/view/Choreographer;->getVsyncId()J
-HSPLandroid/view/Choreographer;->isRunningOnLooperThreadLocked()Z
-HSPLandroid/view/Choreographer;->obtainCallbackLocked(JLjava/lang/Object;Ljava/lang/Object;)Landroid/view/Choreographer$CallbackRecord;
-HSPLandroid/view/Choreographer;->postCallback(ILjava/lang/Runnable;Ljava/lang/Object;)V+]Landroid/view/Choreographer;Landroid/view/Choreographer;
-HSPLandroid/view/Choreographer;->postCallbackDelayed(ILjava/lang/Runnable;Ljava/lang/Object;J)V
-HSPLandroid/view/Choreographer;->postCallbackDelayedInternal(ILjava/lang/Object;Ljava/lang/Object;J)V+]Landroid/view/Choreographer$CallbackQueue;Landroid/view/Choreographer$CallbackQueue;]Landroid/os/Message;Landroid/os/Message;]Landroid/view/Choreographer$FrameHandler;Landroid/view/Choreographer$FrameHandler;
-HSPLandroid/view/Choreographer;->postFrameCallback(Landroid/view/Choreographer$FrameCallback;)V+]Landroid/view/Choreographer;Landroid/view/Choreographer;
-HSPLandroid/view/Choreographer;->postFrameCallbackDelayed(Landroid/view/Choreographer$FrameCallback;J)V
-HSPLandroid/view/Choreographer;->recycleCallbackLocked(Landroid/view/Choreographer$CallbackRecord;)V
-HSPLandroid/view/Choreographer;->removeCallbacks(ILjava/lang/Runnable;Ljava/lang/Object;)V
-HSPLandroid/view/Choreographer;->removeCallbacksInternal(ILjava/lang/Object;Ljava/lang/Object;)V
-HSPLandroid/view/Choreographer;->removeFrameCallback(Landroid/view/Choreographer$FrameCallback;)V
-HSPLandroid/view/Choreographer;->scheduleFrameLocked(J)V
-HSPLandroid/view/Choreographer;->scheduleVsyncLocked()V+]Landroid/view/Choreographer$FrameDisplayEventReceiver;Landroid/view/Choreographer$FrameDisplayEventReceiver;
-HSPLandroid/view/Choreographer;->setFPSDivisor(I)V
-HSPLandroid/view/ContextThemeWrapper;-><init>()V
-HSPLandroid/view/ContextThemeWrapper;-><init>(Landroid/content/Context;I)V
-HSPLandroid/view/ContextThemeWrapper;-><init>(Landroid/content/Context;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/view/ContextThemeWrapper;->attachBaseContext(Landroid/content/Context;)V
-HSPLandroid/view/ContextThemeWrapper;->getAssets()Landroid/content/res/AssetManager;
-HSPLandroid/view/ContextThemeWrapper;->getOverrideConfiguration()Landroid/content/res/Configuration;
-HSPLandroid/view/ContextThemeWrapper;->getResources()Landroid/content/res/Resources;
-HSPLandroid/view/ContextThemeWrapper;->getResourcesInternal()Landroid/content/res/Resources;
-HSPLandroid/view/ContextThemeWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroid/view/ContextThemeWrapper;->getTheme()Landroid/content/res/Resources$Theme;+]Landroid/view/ContextThemeWrapper;Landroid/view/ContextThemeWrapper;
-HSPLandroid/view/ContextThemeWrapper;->initializeTheme()V
-HSPLandroid/view/ContextThemeWrapper;->onApplyThemeResource(Landroid/content/res/Resources$Theme;IZ)V
-HSPLandroid/view/ContextThemeWrapper;->setTheme(I)V
-HSPLandroid/view/CrossWindowBlurListeners;-><clinit>()V
-HSPLandroid/view/Display$HdrCapabilities$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/Display$HdrCapabilities;
-HSPLandroid/view/Display$HdrCapabilities$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/Display$HdrCapabilities;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/Display$HdrCapabilities;-><init>(Landroid/os/Parcel;Landroid/view/Display$HdrCapabilities-IA;)V
-HSPLandroid/view/Display$HdrCapabilities;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/Display$HdrCapabilities;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/view/Display$HdrCapabilities;->toString()Ljava/lang/String;
-HSPLandroid/view/Display$HdrCapabilities;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/Display$Mode$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/Display$Mode;
-HSPLandroid/view/Display$Mode$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/Display$Mode;-><init>(IIIF)V
-HSPLandroid/view/Display$Mode;-><init>(IIIFF[F[I)V
-HSPLandroid/view/Display$Mode;-><init>(IIIF[F[I)V
-HSPLandroid/view/Display$Mode;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/Display$Mode;-><init>(Landroid/os/Parcel;Landroid/view/Display$Mode-IA;)V
-HSPLandroid/view/Display$Mode;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/Display$Mode;->getModeId()I
-HSPLandroid/view/Display$Mode;->getPhysicalHeight()I
-HSPLandroid/view/Display$Mode;->getPhysicalWidth()I
-HSPLandroid/view/Display$Mode;->getRefreshRate()F
-HSPLandroid/view/Display$Mode;->matches(IIF)Z
-HSPLandroid/view/Display$Mode;->toString()Ljava/lang/String;
-HSPLandroid/view/Display;-><init>(Landroid/hardware/display/DisplayManagerGlobal;ILandroid/view/DisplayInfo;Landroid/content/res/Resources;)V
-HSPLandroid/view/Display;-><init>(Landroid/hardware/display/DisplayManagerGlobal;ILandroid/view/DisplayInfo;Landroid/view/DisplayAdjustments;)V
-HSPLandroid/view/Display;-><init>(Landroid/hardware/display/DisplayManagerGlobal;ILandroid/view/DisplayInfo;Landroid/view/DisplayAdjustments;Landroid/content/res/Resources;)V
-HSPLandroid/view/Display;->getAppVsyncOffsetNanos()J
-HSPLandroid/view/Display;->getCutout()Landroid/view/DisplayCutout;
-HSPLandroid/view/Display;->getDisplayAdjustments()Landroid/view/DisplayAdjustments;
-HSPLandroid/view/Display;->getDisplayId()I
-HSPLandroid/view/Display;->getDisplayInfo(Landroid/view/DisplayInfo;)Z
-HSPLandroid/view/Display;->getFlags()I
-HSPLandroid/view/Display;->getHdrSdrRatio()F
-HSPLandroid/view/Display;->getHeight()I
-HSPLandroid/view/Display;->getInstallOrientation()I
-HSPLandroid/view/Display;->getLocalRotation()I+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLandroid/view/Display;->getMetrics(Landroid/util/DisplayMetrics;)V
-HSPLandroid/view/Display;->getMode()Landroid/view/Display$Mode;
-HSPLandroid/view/Display;->getName()Ljava/lang/String;
-HSPLandroid/view/Display;->getPreferredWideGamutColorSpace()Landroid/graphics/ColorSpace;
-HSPLandroid/view/Display;->getPresentationDeadlineNanos()J
-HSPLandroid/view/Display;->getRealMetrics(Landroid/util/DisplayMetrics;)V
-HSPLandroid/view/Display;->getRealSize(Landroid/graphics/Point;)V
-HSPLandroid/view/Display;->getRefreshRate()F
-HSPLandroid/view/Display;->getRotation()I
-HSPLandroid/view/Display;->getSize(Landroid/graphics/Point;)V
-HSPLandroid/view/Display;->getState()I
-HSPLandroid/view/Display;->getSupportedColorModes()[I
-HSPLandroid/view/Display;->getSupportedModes()[Landroid/view/Display$Mode;
-HSPLandroid/view/Display;->getSupportedWideColorGamut()[Landroid/graphics/ColorSpace;
-HSPLandroid/view/Display;->getWidth()I
-HSPLandroid/view/Display;->hasAccess(IIII)Z
-HSPLandroid/view/Display;->isValid()Z
-HSPLandroid/view/Display;->isWideColorGamut()Z
-HSPLandroid/view/Display;->shouldReportMaxBounds()Z
-HSPLandroid/view/Display;->stateToString(I)Ljava/lang/String;
-HSPLandroid/view/Display;->updateCachedAppSizeIfNeededLocked()V
-HSPLandroid/view/Display;->updateDisplayInfoLocked()V+]Landroid/hardware/display/DisplayManagerGlobal;Landroid/hardware/display/DisplayManagerGlobal;
-HSPLandroid/view/DisplayAddress$Physical$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/DisplayAddress$Physical;
-HSPLandroid/view/DisplayAddress$Physical$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/DisplayAddress$Physical;-><init>(J)V
-HSPLandroid/view/DisplayAddress$Physical;-><init>(JLandroid/view/DisplayAddress$Physical-IA;)V
-HSPLandroid/view/DisplayAddress$Physical;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/DisplayAddress$Physical;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/DisplayAddress;-><init>()V
-HSPLandroid/view/DisplayAdjustments;-><init>()V
-HSPLandroid/view/DisplayAdjustments;-><init>(Landroid/content/res/Configuration;)V
-HSPLandroid/view/DisplayAdjustments;-><init>(Landroid/view/DisplayAdjustments;)V
-HSPLandroid/view/DisplayAdjustments;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/DisplayAdjustments;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo;
-HSPLandroid/view/DisplayAdjustments;->getConfiguration()Landroid/content/res/Configuration;
-HSPLandroid/view/DisplayAdjustments;->hashCode()I
-HSPLandroid/view/DisplayAdjustments;->setCompatibilityInfo(Landroid/content/res/CompatibilityInfo;)V
-HSPLandroid/view/DisplayAdjustments;->setConfiguration(Landroid/content/res/Configuration;)V
-HSPLandroid/view/DisplayCutout$Bounds;->-$$Nest$mgetRects(Landroid/view/DisplayCutout$Bounds;)[Landroid/graphics/Rect;
-HSPLandroid/view/DisplayCutout$Bounds;-><init>([Landroid/graphics/Rect;Z)V
-HSPLandroid/view/DisplayCutout$Bounds;-><init>([Landroid/graphics/Rect;ZLandroid/view/DisplayCutout$Bounds-IA;)V
-HSPLandroid/view/DisplayCutout$Bounds;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/DisplayCutout$Bounds;->getRects()[Landroid/graphics/Rect;
-HSPLandroid/view/DisplayCutout$Bounds;->isEmpty()Z
-HSPLandroid/view/DisplayCutout$CutoutPathParserInfo;-><init>(IIIIFLjava/lang/String;IFF)V
-HSPLandroid/view/DisplayCutout$CutoutPathParserInfo;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/DisplayCutout$ParcelableWrapper$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/DisplayCutout$ParcelableWrapper;
-HSPLandroid/view/DisplayCutout$ParcelableWrapper$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/DisplayCutout$ParcelableWrapper;-><init>()V
-HSPLandroid/view/DisplayCutout$ParcelableWrapper;-><init>(Landroid/view/DisplayCutout;)V
-HSPLandroid/view/DisplayCutout$ParcelableWrapper;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/DisplayCutout$ParcelableWrapper;->get()Landroid/view/DisplayCutout;
-HSPLandroid/view/DisplayCutout$ParcelableWrapper;->readCutoutFromParcel(Landroid/os/Parcel;)Landroid/view/DisplayCutout;
-HSPLandroid/view/DisplayCutout$ParcelableWrapper;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/view/DisplayCutout$ParcelableWrapper;->set(Landroid/view/DisplayCutout$ParcelableWrapper;)V
-HSPLandroid/view/DisplayCutout$ParcelableWrapper;->set(Landroid/view/DisplayCutout;)V
-HSPLandroid/view/DisplayCutout$ParcelableWrapper;->writeCutoutToParcel(Landroid/view/DisplayCutout;Landroid/os/Parcel;I)V
-HSPLandroid/view/DisplayCutout$ParcelableWrapper;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/DisplayCutout;-><init>(Landroid/graphics/Rect;Landroid/graphics/Insets;Landroid/view/DisplayCutout$Bounds;Landroid/view/DisplayCutout$CutoutPathParserInfo;[I)V
-HSPLandroid/view/DisplayCutout;-><init>(Landroid/graphics/Rect;Landroid/graphics/Insets;Landroid/view/DisplayCutout$Bounds;Landroid/view/DisplayCutout$CutoutPathParserInfo;[ILandroid/view/DisplayCutout-IA;)V
-HSPLandroid/view/DisplayCutout;-><init>(Landroid/graphics/Rect;Landroid/graphics/Insets;[Landroid/graphics/Rect;Landroid/view/DisplayCutout$CutoutPathParserInfo;Z)V
-HSPLandroid/view/DisplayCutout;->atLeastZero(I)I
-HSPLandroid/view/DisplayCutout;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/DisplayCutout;->getBoundingRects()Ljava/util/List;
-HSPLandroid/view/DisplayCutout;->getBoundingRectsAll()[Landroid/graphics/Rect;
-HSPLandroid/view/DisplayCutout;->getCopyOrRef(Landroid/graphics/Rect;Z)Landroid/graphics/Rect;
-HSPLandroid/view/DisplayCutout;->getSafeInsetBottom()I
-HSPLandroid/view/DisplayCutout;->getSafeInsetLeft()I
-HSPLandroid/view/DisplayCutout;->getSafeInsetRight()I
-HSPLandroid/view/DisplayCutout;->getSafeInsetTop()I
-HSPLandroid/view/DisplayCutout;->inset(IIII)Landroid/view/DisplayCutout;
-HSPLandroid/view/DisplayCutout;->insetInsets(IIIILandroid/graphics/Rect;)Landroid/graphics/Rect;
-HSPLandroid/view/DisplayCutout;->isBoundsEmpty()Z
-HSPLandroid/view/DisplayCutout;->isEmpty()Z+]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HSPLandroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;-><init>()V
-HSPLandroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;-><init>(JJJ)V
-HSPLandroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;->copyFrom(Landroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;)V
-HSPLandroid/view/DisplayEventReceiver$VsyncEventData;-><init>()V
-HSPLandroid/view/DisplayEventReceiver$VsyncEventData;-><init>([Landroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;IIJ)V
-HSPLandroid/view/DisplayEventReceiver$VsyncEventData;->copyFrom(Landroid/view/DisplayEventReceiver$VsyncEventData;)V+]Landroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;Landroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;
-HSPLandroid/view/DisplayEventReceiver$VsyncEventData;->preferredFrameTimeline()Landroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;
-HSPLandroid/view/DisplayEventReceiver;-><init>(Landroid/os/Looper;II)V
-HSPLandroid/view/DisplayEventReceiver;-><init>(Landroid/os/Looper;IIJ)V
-HSPLandroid/view/DisplayEventReceiver;->dispatchVsync(JJI)V+]Landroid/view/DisplayEventReceiver;Landroid/view/Choreographer$FrameDisplayEventReceiver;
-HSPLandroid/view/DisplayEventReceiver;->getLatestVsyncEventData()Landroid/view/DisplayEventReceiver$VsyncEventData;
-HSPLandroid/view/DisplayEventReceiver;->scheduleVsync()V
-HSPLandroid/view/DisplayInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/DisplayInfo;
-HSPLandroid/view/DisplayInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/DisplayInfo;-><init>()V
-HSPLandroid/view/DisplayInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/DisplayInfo;-><init>(Landroid/os/Parcel;Landroid/view/DisplayInfo-IA;)V
-HSPLandroid/view/DisplayInfo;->copyFrom(Landroid/view/DisplayInfo;)V
-HSPLandroid/view/DisplayInfo;->equals(Landroid/view/DisplayInfo;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;
-HSPLandroid/view/DisplayInfo;->findMode(I)Landroid/view/Display$Mode;
-HSPLandroid/view/DisplayInfo;->flagsToString(I)Ljava/lang/String;
-HSPLandroid/view/DisplayInfo;->getAppMetrics(Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;Landroid/content/res/Configuration;)V
-HSPLandroid/view/DisplayInfo;->getAppMetrics(Landroid/util/DisplayMetrics;Landroid/view/DisplayAdjustments;)V
-HSPLandroid/view/DisplayInfo;->getLogicalMetrics(Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;Landroid/content/res/Configuration;)V
-HSPLandroid/view/DisplayInfo;->getMaxBoundsMetrics(Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;Landroid/content/res/Configuration;)V
-HSPLandroid/view/DisplayInfo;->getMetricsWithSize(Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;Landroid/content/res/Configuration;II)V+]Landroid/content/res/CompatibilityInfo;Landroid/content/res/CompatibilityInfo$1;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLandroid/view/DisplayInfo;->getMode()Landroid/view/Display$Mode;
-HSPLandroid/view/DisplayInfo;->getRefreshRate()F
-HSPLandroid/view/DisplayInfo;->hasAccess(I)Z
-HSPLandroid/view/DisplayInfo;->isWideColorGamut()Z
-HSPLandroid/view/DisplayInfo;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/view/DisplayInfo;->toString()Ljava/lang/String;
-HSPLandroid/view/DisplayInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/DisplayShape$1;-><init>()V
-HSPLandroid/view/DisplayShape$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/DisplayShape;
-HSPLandroid/view/DisplayShape$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/DisplayShape;-><clinit>()V
-HSPLandroid/view/DisplayShape;-><init>(Ljava/lang/String;IIFI)V
-HSPLandroid/view/DisplayShape;-><init>(Ljava/lang/String;IIFIIIF)V
-HSPLandroid/view/DisplayShape;-><init>(Ljava/lang/String;IIFIIIFLandroid/view/DisplayShape-IA;)V
-HSPLandroid/view/DisplayShape;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/FocusFinder$1;->initialValue()Landroid/view/FocusFinder;
-HSPLandroid/view/FocusFinder$1;->initialValue()Ljava/lang/Object;
-HSPLandroid/view/FocusFinder$FocusSorter$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/view/FocusFinder$FocusSorter$$ExternalSyntheticLambda1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/view/FocusFinder$FocusSorter;->sort([Landroid/view/View;IILandroid/view/ViewGroup;Z)V
-HSPLandroid/view/FocusFinder$UserSpecifiedFocusComparator;-><init>(Landroid/view/FocusFinder$UserSpecifiedFocusComparator$NextFocusGetter;)V
-HSPLandroid/view/FocusFinder;-><init>()V
-HSPLandroid/view/FocusFinder;->findNextFocus(Landroid/view/ViewGroup;Landroid/view/View;I)Landroid/view/View;
-HSPLandroid/view/FocusFinder;->findNextFocus(Landroid/view/ViewGroup;Landroid/view/View;Landroid/graphics/Rect;I)Landroid/view/View;
-HSPLandroid/view/FocusFinder;->findNextFocus(Landroid/view/ViewGroup;Landroid/view/View;Landroid/graphics/Rect;ILjava/util/ArrayList;)Landroid/view/View;
-HSPLandroid/view/FocusFinder;->findNextFocusInAbsoluteDirection(Ljava/util/ArrayList;Landroid/view/ViewGroup;Landroid/view/View;Landroid/graphics/Rect;I)Landroid/view/View;
-HSPLandroid/view/FocusFinder;->findNextUserSpecifiedFocus(Landroid/view/ViewGroup;Landroid/view/View;I)Landroid/view/View;
-HSPLandroid/view/FocusFinder;->getEffectiveRoot(Landroid/view/ViewGroup;Landroid/view/View;)Landroid/view/ViewGroup;
-HSPLandroid/view/FocusFinder;->getInstance()Landroid/view/FocusFinder;
-HSPLandroid/view/FocusFinder;->isBetterCandidate(ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
-HSPLandroid/view/FocusFinder;->isCandidate(Landroid/graphics/Rect;Landroid/graphics/Rect;I)Z
-HSPLandroid/view/FrameMetrics;-><init>()V
-HSPLandroid/view/FrameMetrics;->getMetric(I)J
-HSPLandroid/view/FrameMetricsObserver;-><init>(Landroid/view/Window;Landroid/os/Handler;Landroid/view/Window$OnFrameMetricsAvailableListener;)V
-HSPLandroid/view/FrameMetricsObserver;->getRendererObserver()Landroid/graphics/HardwareRendererObserver;
-HSPLandroid/view/FrameMetricsObserver;->onFrameMetricsAvailable(I)V+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;
-HSPLandroid/view/GestureDetector$GestureHandler;-><init>(Landroid/view/GestureDetector;)V
-HSPLandroid/view/GestureDetector$GestureHandler;-><init>(Landroid/view/GestureDetector;Landroid/os/Handler;)V
-HSPLandroid/view/GestureDetector$GestureHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/view/GestureDetector$SimpleOnGestureListener;-><init>()V
-HSPLandroid/view/GestureDetector$SimpleOnGestureListener;->onDoubleTapEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/view/GestureDetector$SimpleOnGestureListener;->onDown(Landroid/view/MotionEvent;)Z
-HSPLandroid/view/GestureDetector$SimpleOnGestureListener;->onFling(Landroid/view/MotionEvent;Landroid/view/MotionEvent;FF)Z
-HSPLandroid/view/GestureDetector$SimpleOnGestureListener;->onLongPress(Landroid/view/MotionEvent;)V
-HSPLandroid/view/GestureDetector$SimpleOnGestureListener;->onScroll(Landroid/view/MotionEvent;Landroid/view/MotionEvent;FF)Z
-HSPLandroid/view/GestureDetector$SimpleOnGestureListener;->onShowPress(Landroid/view/MotionEvent;)V
-HSPLandroid/view/GestureDetector$SimpleOnGestureListener;->onSingleTapConfirmed(Landroid/view/MotionEvent;)Z
-HSPLandroid/view/GestureDetector$SimpleOnGestureListener;->onSingleTapUp(Landroid/view/MotionEvent;)Z
-HSPLandroid/view/GestureDetector;-><init>(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;)V
-HSPLandroid/view/GestureDetector;-><init>(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;Landroid/os/Handler;)V
-HSPLandroid/view/GestureDetector;->cancel()V
-HSPLandroid/view/GestureDetector;->cancelTaps()V
-HSPLandroid/view/GestureDetector;->init(Landroid/content/Context;)V
-HSPLandroid/view/GestureDetector;->isConsideredDoubleTap(Landroid/view/MotionEvent;Landroid/view/MotionEvent;Landroid/view/MotionEvent;)Z
-HSPLandroid/view/GestureDetector;->onTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/view/GestureDetector;->recordGestureClassification(I)V
-HSPLandroid/view/GestureDetector;->setContextClickListener(Landroid/view/GestureDetector$OnContextClickListener;)V
-HSPLandroid/view/GestureDetector;->setIsLongpressEnabled(Z)V
-HSPLandroid/view/GestureDetector;->setOnDoubleTapListener(Landroid/view/GestureDetector$OnDoubleTapListener;)V
-HSPLandroid/view/Gravity;->apply(IIILandroid/graphics/Rect;IILandroid/graphics/Rect;)V
-HSPLandroid/view/Gravity;->apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;)V
-HSPLandroid/view/Gravity;->apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;I)V
-HSPLandroid/view/Gravity;->applyDisplay(ILandroid/graphics/Rect;Landroid/graphics/Rect;)V
-HSPLandroid/view/Gravity;->getAbsoluteGravity(II)I
-HSPLandroid/view/Gravity;->isHorizontal(I)Z
-HSPLandroid/view/Gravity;->isVertical(I)Z
-HSPLandroid/view/HandlerActionQueue$HandlerAction;-><init>(Ljava/lang/Runnable;J)V
-HSPLandroid/view/HandlerActionQueue$HandlerAction;->matches(Ljava/lang/Runnable;)Z
-HSPLandroid/view/HandlerActionQueue;-><init>()V
-HSPLandroid/view/HandlerActionQueue;->executeActions(Landroid/os/Handler;)V+]Landroid/os/Handler;Landroid/view/ViewRootImpl$ViewRootHandler;
-HSPLandroid/view/HandlerActionQueue;->post(Ljava/lang/Runnable;)V
-HSPLandroid/view/HandlerActionQueue;->postDelayed(Ljava/lang/Runnable;J)V
-HSPLandroid/view/HandlerActionQueue;->removeCallbacks(Ljava/lang/Runnable;)V
-HSPLandroid/view/HandwritingInitiator$HandwritableViewInfo;-><init>(Landroid/view/View;)V
-HSPLandroid/view/HandwritingInitiator$HandwritableViewInfo;->getView()Landroid/view/View;
-HSPLandroid/view/HandwritingInitiator$HandwritingAreaTracker;-><init>()V
-HSPLandroid/view/HandwritingInitiator$HandwritingAreaTracker;->updateHandwritingAreaForView(Landroid/view/View;)V
-HSPLandroid/view/HandwritingInitiator$State;->-$$Nest$fgetmShouldInitHandwriting(Landroid/view/HandwritingInitiator$State;)Z
-HSPLandroid/view/HandwritingInitiator$State;->-$$Nest$fgetmStylusPointerId(Landroid/view/HandwritingInitiator$State;)I
-HSPLandroid/view/HandwritingInitiator;->-$$Nest$smisViewActive(Landroid/view/View;)Z
-HSPLandroid/view/HandwritingInitiator;-><init>(Landroid/view/ViewConfiguration;Landroid/view/inputmethod/InputMethodManager;)V
-HSPLandroid/view/HandwritingInitiator;->clearConnectedView()V
-HSPLandroid/view/HandwritingInitiator;->getConnectedView()Landroid/view/View;
-HSPLandroid/view/HandwritingInitiator;->isViewActive(Landroid/view/View;)Z
-HSPLandroid/view/HandwritingInitiator;->onInputConnectionClosed(Landroid/view/View;)V
-HSPLandroid/view/HandwritingInitiator;->onInputConnectionCreated(Landroid/view/View;)V
-HSPLandroid/view/HandwritingInitiator;->onTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/view/HandwritingInitiator;->updateHandwritingAreasForView(Landroid/view/View;)V
-HSPLandroid/view/HdrRenderState;->updateForFrame(J)Z
-HSPLandroid/view/IGraphicsStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/view/IGraphicsStats$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/IGraphicsStats$Stub$Proxy;->requestBufferForProcess(Ljava/lang/String;Landroid/view/IGraphicsStatsCallback;)Landroid/os/ParcelFileDescriptor;
-HSPLandroid/view/IGraphicsStats$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IGraphicsStats;
-HSPLandroid/view/IGraphicsStatsCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/IGraphicsStatsCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/view/IRemoteAnimationRunner$Stub;-><init>()V
-HSPLandroid/view/IRemoteAnimationRunner$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/ISystemGestureExclusionListener$Stub;-><init>()V
-HSPLandroid/view/IWindow$Stub;-><init>()V
-HSPLandroid/view/IWindow$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/IWindow$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
-HSPLandroid/view/IWindow$Stub;->getMaxTransactionId()I
-HSPLandroid/view/IWindow$Stub;->getTransactionName(I)Ljava/lang/String;
-HSPLandroid/view/IWindow$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/view/IWindowManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/view/IWindowManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/IWindowManager$Stub$Proxy;->getCurrentAnimatorScale()F
-HSPLandroid/view/IWindowManager$Stub$Proxy;->getWindowInsets(ILandroid/os/IBinder;Landroid/view/InsetsState;)Z
-HSPLandroid/view/IWindowManager$Stub$Proxy;->hasNavigationBar(I)Z
-HSPLandroid/view/IWindowManager$Stub$Proxy;->isInTouchMode(I)Z
-HSPLandroid/view/IWindowManager$Stub$Proxy;->isKeyguardLocked()Z
-HSPLandroid/view/IWindowManager$Stub$Proxy;->isKeyguardSecure(I)Z
-HSPLandroid/view/IWindowManager$Stub$Proxy;->openSession(Landroid/view/IWindowSessionCallback;)Landroid/view/IWindowSession;
-HSPLandroid/view/IWindowManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IWindowManager;
-HSPLandroid/view/IWindowSession$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/view/IWindowSession$Stub$Proxy;->addToDisplayAsUser(Landroid/view/IWindow;Landroid/view/WindowManager$LayoutParams;IIIILandroid/view/InputChannel;Landroid/view/InsetsState;Landroid/view/InsetsSourceControl$Array;Landroid/graphics/Rect;[F)I
-HSPLandroid/view/IWindowSession$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/IWindowSession$Stub$Proxy;->finishDrawing(Landroid/view/IWindow;Landroid/view/SurfaceControl$Transaction;I)V
-HSPLandroid/view/IWindowSession$Stub$Proxy;->getWindowId(Landroid/os/IBinder;)Landroid/view/IWindowId;
-HSPLandroid/view/IWindowSession$Stub$Proxy;->onRectangleOnScreenRequested(Landroid/os/IBinder;Landroid/graphics/Rect;)V
-HSPLandroid/view/IWindowSession$Stub$Proxy;->pokeDrawLock(Landroid/os/IBinder;)V
-HSPLandroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;Landroid/view/WindowManager$LayoutParams;IIIIIILandroid/window/ClientWindowFrames;Landroid/util/MergedConfiguration;Landroid/view/SurfaceControl;Landroid/view/InsetsState;Landroid/view/InsetsSourceControl$Array;Landroid/os/Bundle;)I
-HSPLandroid/view/IWindowSession$Stub$Proxy;->relayoutAsync(Landroid/view/IWindow;Landroid/view/WindowManager$LayoutParams;IIIIII)V+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/view/IWindowSession$Stub$Proxy;Landroid/view/IWindowSession$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/view/IWindowSession$Stub$Proxy;->reportSystemGestureExclusionChanged(Landroid/view/IWindow;Ljava/util/List;)V
-HSPLandroid/view/IWindowSession$Stub$Proxy;->setInsets(Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V
-HSPLandroid/view/IWindowSession$Stub$Proxy;->setOnBackInvokedCallbackInfo(Landroid/view/IWindow;Landroid/window/OnBackInvokedCallbackInfo;)V
-HSPLandroid/view/IWindowSession$Stub$Proxy;->setWallpaperZoomOut(Landroid/os/IBinder;F)V
-HSPLandroid/view/IWindowSession$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IWindowSession;
-HSPLandroid/view/IWindowSessionCallback$Stub;-><init>()V
-HSPLandroid/view/IWindowSessionCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/ImeFocusController;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ImeFocusController;->getImmDelegate()Landroid/view/ImeFocusController$InputMethodManagerDelegate;
-HSPLandroid/view/ImeFocusController;->hasImeFocus()Z
-HSPLandroid/view/ImeFocusController;->isInLocalFocusMode(Landroid/view/WindowManager$LayoutParams;)Z
-HSPLandroid/view/ImeFocusController;->onPostWindowFocus(Landroid/view/View;ZLandroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/view/ImeFocusController;->onPreWindowFocus(ZLandroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/view/ImeFocusController;->onProcessImeInputStage(Ljava/lang/Object;Landroid/view/InputEvent;Landroid/view/WindowManager$LayoutParams;Landroid/view/inputmethod/InputMethodManager$FinishedInputEventCallback;)I
-HSPLandroid/view/ImeFocusController;->onTraversal(ZLandroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/view/ImeFocusController;->onViewDetachedFromWindow(Landroid/view/View;)V
-HSPLandroid/view/ImeFocusController;->onViewFocusChanged(Landroid/view/View;Z)V
-HSPLandroid/view/ImeFocusController;->onWindowDismissed()V
-HSPLandroid/view/ImeInsetsSourceConsumer;-><init>(ILandroid/view/InsetsState;Ljava/util/function/Supplier;Landroid/view/InsetsController;)V
-HSPLandroid/view/ImeInsetsSourceConsumer;->applyLocalVisibilityOverride()Z
-HSPLandroid/view/ImeInsetsSourceConsumer;->getImm()Landroid/view/inputmethod/InputMethodManager;
-HSPLandroid/view/ImeInsetsSourceConsumer;->isRequestedVisibleAwaitingControl()Z
-HSPLandroid/view/ImeInsetsSourceConsumer;->onPerceptible(Z)V
-HSPLandroid/view/ImeInsetsSourceConsumer;->onShowRequested()V
-HSPLandroid/view/ImeInsetsSourceConsumer;->onWindowFocusGained(Z)V
-HSPLandroid/view/ImeInsetsSourceConsumer;->onWindowFocusLost()V
-HSPLandroid/view/ImeInsetsSourceConsumer;->removeSurface()V
-HSPLandroid/view/ImeInsetsSourceConsumer;->setControl(Landroid/view/InsetsSourceControl;[I[I)Z
-HSPLandroid/view/InputChannel$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/InputChannel;
-HSPLandroid/view/InputChannel$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/InputChannel;-><init>()V
-HSPLandroid/view/InputChannel;->dispose()V
-HSPLandroid/view/InputChannel;->getToken()Landroid/os/IBinder;
-HSPLandroid/view/InputChannel;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/view/InputChannel;->setNativeInputChannel(J)V
-HSPLandroid/view/InputDevice$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/InputDevice;
-HSPLandroid/view/InputDevice$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/InputDevice$MotionRange;-><init>(IIFFFFF)V
-HSPLandroid/view/InputDevice;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/InputDevice;->addMotionRange(IIFFFFF)V
-HSPLandroid/view/InputDevice;->getDevice(I)Landroid/view/InputDevice;
-HSPLandroid/view/InputDevice;->getDeviceIds()[I
-HSPLandroid/view/InputDevice;->getGeneration()I
-HSPLandroid/view/InputDevice;->getSources()I
-HSPLandroid/view/InputDevice;->isVirtual()Z
-HSPLandroid/view/InputEvent;-><init>()V
-HSPLandroid/view/InputEvent;->getSequenceNumber()I
-HSPLandroid/view/InputEvent;->isFromSource(I)Z+]Landroid/view/InputEvent;Landroid/view/MotionEvent;
-HSPLandroid/view/InputEvent;->prepareForReuse()V
-HSPLandroid/view/InputEvent;->recycle()V
-HSPLandroid/view/InputEvent;->recycleIfNeededAfterDispatch()V
-HSPLandroid/view/InputEventAssigner;-><init>()V
-HSPLandroid/view/InputEventAssigner;->notifyFrameProcessed()V
-HSPLandroid/view/InputEventAssigner;->processEvent(Landroid/view/InputEvent;)I
-HSPLandroid/view/InputEventCompatProcessor;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/InputEventCompatProcessor;->processInputEventForCompatibility(Landroid/view/InputEvent;)Ljava/util/List;
-HSPLandroid/view/InputEventConsistencyVerifier;->isInstrumentationEnabled()Z
-HSPLandroid/view/InputEventReceiver;-><init>(Landroid/view/InputChannel;Landroid/os/Looper;)V
-HSPLandroid/view/InputEventReceiver;->consumeBatchedInputEvents(J)Z
-HSPLandroid/view/InputEventReceiver;->dispatchInputEvent(ILandroid/view/InputEvent;)V
-HSPLandroid/view/InputEventReceiver;->dispose()V
-HSPLandroid/view/InputEventReceiver;->dispose(Z)V
-HSPLandroid/view/InputEventReceiver;->finalize()V
-HSPLandroid/view/InputEventReceiver;->finishInputEvent(Landroid/view/InputEvent;Z)V
-HSPLandroid/view/InputEventReceiver;->onBatchedInputEventPending(I)V
-HSPLandroid/view/InputEventReceiver;->reportTimeline(IJJ)V
-HSPLandroid/view/InputEventSender;-><init>(Landroid/view/InputChannel;Landroid/os/Looper;)V
-HSPLandroid/view/InputEventSender;->dispatchInputEventFinished(IZ)V
-HSPLandroid/view/InputEventSender;->dispose()V
-HSPLandroid/view/InputEventSender;->dispose(Z)V
-HSPLandroid/view/InputEventSender;->finalize()V
-HSPLandroid/view/InputEventSender;->sendInputEvent(ILandroid/view/InputEvent;)Z
-HSPLandroid/view/InputMonitor$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/InputMonitor;
-HSPLandroid/view/InputMonitor$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/InputMonitor;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/InputMonitor;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/InsetsAnimationControlImpl$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V
-HSPLandroid/view/InsetsAnimationControlImpl;-><init>(Landroid/util/SparseArray;Landroid/graphics/Rect;Landroid/view/InsetsState;Landroid/view/WindowInsetsAnimationControlListener;ILandroid/view/InsetsAnimationControlCallbacks;JLandroid/view/animation/Interpolator;IILandroid/content/res/CompatibilityInfo$Translator;Landroid/view/inputmethod/ImeTracker$Token;)V
-HSPLandroid/view/InsetsAnimationControlImpl;->addTranslationToMatrix(IILandroid/graphics/Matrix;Landroid/graphics/Rect;)V
-HSPLandroid/view/InsetsAnimationControlImpl;->applyChangeInsets(Landroid/view/InsetsState;)Z
-HSPLandroid/view/InsetsAnimationControlImpl;->buildSideControlsMap(Landroid/util/SparseSetArray;Landroid/util/SparseArray;)V
-HSPLandroid/view/InsetsAnimationControlImpl;->calculateInsets(Landroid/view/InsetsState;Landroid/graphics/Rect;Landroid/util/SparseArray;ZLandroid/util/SparseIntArray;)Landroid/graphics/Insets;
-HSPLandroid/view/InsetsAnimationControlImpl;->calculateInsets(Landroid/view/InsetsState;Landroid/util/SparseArray;Z)Landroid/graphics/Insets;
-HSPLandroid/view/InsetsAnimationControlImpl;->calculatePerceptible(Landroid/graphics/Insets;F)Z
-HSPLandroid/view/InsetsAnimationControlImpl;->cancel()V
-HSPLandroid/view/InsetsAnimationControlImpl;->finish(Z)V
-HSPLandroid/view/InsetsAnimationControlImpl;->getAnimation()Landroid/view/WindowInsetsAnimation;
-HSPLandroid/view/InsetsAnimationControlImpl;->getAnimationType()I
-HSPLandroid/view/InsetsAnimationControlImpl;->getControllingTypes()I
-HSPLandroid/view/InsetsAnimationControlImpl;->getControls()Landroid/util/SparseArray;
-HSPLandroid/view/InsetsAnimationControlImpl;->getCurrentAlpha()F
-HSPLandroid/view/InsetsAnimationControlImpl;->getHiddenStateInsets()Landroid/graphics/Insets;
-HSPLandroid/view/InsetsAnimationControlImpl;->getInsetsFromState(Landroid/view/InsetsState;Landroid/graphics/Rect;Landroid/util/SparseIntArray;)Landroid/graphics/Insets;
-HSPLandroid/view/InsetsAnimationControlImpl;->getShownStateInsets()Landroid/graphics/Insets;
-HSPLandroid/view/InsetsAnimationControlImpl;->getTypes()I
-HSPLandroid/view/InsetsAnimationControlImpl;->hasZeroInsetsIme()Z
-HSPLandroid/view/InsetsAnimationControlImpl;->isCancelled()Z
-HSPLandroid/view/InsetsAnimationControlImpl;->notifyControlRevoked(I)V
-HSPLandroid/view/InsetsAnimationControlImpl;->releaseLeashes()V
-HSPLandroid/view/InsetsAnimationControlImpl;->setInsetsAndAlpha(Landroid/graphics/Insets;FF)V
-HSPLandroid/view/InsetsAnimationControlImpl;->setInsetsAndAlpha(Landroid/graphics/Insets;FFZ)V
-HSPLandroid/view/InsetsAnimationControlImpl;->updateSurfacePosition(Landroid/util/SparseArray;)V
-HSPLandroid/view/InsetsAnimationThread;->ensureThreadLocked()V
-HSPLandroid/view/InsetsAnimationThread;->getHandler()Landroid/os/Handler;
-HSPLandroid/view/InsetsAnimationThread;->release()V
-HSPLandroid/view/InsetsAnimationThreadControlRunner$$ExternalSyntheticLambda1;->run()V
-HSPLandroid/view/InsetsAnimationThreadControlRunner$1$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/view/InsetsAnimationThreadControlRunner$1$$ExternalSyntheticLambda1;->run()V
-HSPLandroid/view/InsetsAnimationThreadControlRunner$1;-><init>(Landroid/view/InsetsAnimationThreadControlRunner;)V
-HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->applySurfaceParams([Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;)V
-HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->notifyFinished(Landroid/view/InsetsAnimationControlRunner;Z)V
-HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->releaseSurfaceControlFromRt(Landroid/view/SurfaceControl;)V
-HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->reportPerceptible(IZ)V
-HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->scheduleApplyChangeInsets(Landroid/view/InsetsAnimationControlRunner;)V
-HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->startAnimation(Landroid/view/InsetsAnimationControlRunner;Landroid/view/WindowInsetsAnimationControlListener;ILandroid/view/WindowInsetsAnimation;Landroid/view/WindowInsetsAnimation$Bounds;)V
-HSPLandroid/view/InsetsAnimationThreadControlRunner;->-$$Nest$fgetmOuterCallbacks(Landroid/view/InsetsAnimationThreadControlRunner;)Landroid/view/InsetsAnimationControlCallbacks;
-HSPLandroid/view/InsetsAnimationThreadControlRunner;->cancel()V
-HSPLandroid/view/InsetsAnimationThreadControlRunner;->getAnimation()Landroid/view/WindowInsetsAnimation;
-HSPLandroid/view/InsetsAnimationThreadControlRunner;->getAnimationType()I
-HSPLandroid/view/InsetsAnimationThreadControlRunner;->getControllingTypes()I
-HSPLandroid/view/InsetsAnimationThreadControlRunner;->getTypes()I
-HSPLandroid/view/InsetsAnimationThreadControlRunner;->notifyControlRevoked(I)V
-HSPLandroid/view/InsetsAnimationThreadControlRunner;->updateSurfacePosition(Landroid/util/SparseArray;)V
-HSPLandroid/view/InsetsController$$ExternalSyntheticLambda10;-><init>(Landroid/view/InsetsController;)V
-HSPLandroid/view/InsetsController$$ExternalSyntheticLambda7;-><init>()V
-HSPLandroid/view/InsetsController$$ExternalSyntheticLambda9;-><init>(Landroid/view/InsetsController;)V
-HSPLandroid/view/InsetsController$1;-><init>(Landroid/view/InsetsController;)V
-HSPLandroid/view/InsetsController$2;-><init>(Landroid/view/InsetsController;)V
-HSPLandroid/view/InsetsController$2;->onFinish(Landroid/view/InsetsState;Landroid/view/InsetsState;)V
-HSPLandroid/view/InsetsController$3;-><init>(Landroid/view/InsetsController;)V
-HSPLandroid/view/InsetsController$3;->onFinish(Landroid/view/InsetsState;Landroid/view/InsetsState;)V
-HSPLandroid/view/InsetsController$3;->onStart(Landroid/view/InsetsState;Landroid/view/InsetsState;)V
-HSPLandroid/view/InsetsController$InternalAnimationControlListener$$ExternalSyntheticLambda0;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V
-HSPLandroid/view/InsetsController$InternalAnimationControlListener$$ExternalSyntheticLambda3;->getInterpolation(F)F
-HSPLandroid/view/InsetsController$InternalAnimationControlListener$$ExternalSyntheticLambda4;->getInterpolation(F)F
-HSPLandroid/view/InsetsController$InternalAnimationControlListener$1;->initialValue()Landroid/animation/AnimationHandler;
-HSPLandroid/view/InsetsController$InternalAnimationControlListener$1;->initialValue()Ljava/lang/Object;
-HSPLandroid/view/InsetsController$InternalAnimationControlListener$2;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/view/InsetsController$InternalAnimationControlListener;-><init>(ZZIIZILandroid/view/WindowInsetsAnimationControlListener;Landroid/view/inputmethod/ImeTracker$InputMethodJankContext;)V
-HSPLandroid/view/InsetsController$InternalAnimationControlListener;->calculateDurationMs()J
-HSPLandroid/view/InsetsController$InternalAnimationControlListener;->getAlphaInterpolator()Landroid/view/animation/Interpolator;
-HSPLandroid/view/InsetsController$InternalAnimationControlListener;->getDurationMs()J
-HSPLandroid/view/InsetsController$InternalAnimationControlListener;->getInsetsInterpolator()Landroid/view/animation/Interpolator;
-HSPLandroid/view/InsetsController$InternalAnimationControlListener;->lambda$getAlphaInterpolator$2(F)F
-HSPLandroid/view/InsetsController$InternalAnimationControlListener;->lambda$getAlphaInterpolator$3(F)F
-HSPLandroid/view/InsetsController$InternalAnimationControlListener;->lambda$getAlphaInterpolator$4(F)F
-HSPLandroid/view/InsetsController$InternalAnimationControlListener;->onAnimationFinish()V
-HSPLandroid/view/InsetsController$InternalAnimationControlListener;->onCancelled(Landroid/view/WindowInsetsAnimationController;)V
-HSPLandroid/view/InsetsController$InternalAnimationControlListener;->onFinished(Landroid/view/WindowInsetsAnimationController;)V
-HSPLandroid/view/InsetsController$InternalAnimationControlListener;->onReady(Landroid/view/WindowInsetsAnimationController;I)V
-HSPLandroid/view/InsetsController$RunningAnimation;-><init>(Landroid/view/InsetsAnimationControlRunner;I)V
-HSPLandroid/view/InsetsController;->-$$Nest$sfgetsEvaluator()Landroid/animation/TypeEvaluator;
-HSPLandroid/view/InsetsController;-><init>(Landroid/view/InsetsController$Host;)V
-HSPLandroid/view/InsetsController;-><init>(Landroid/view/InsetsController$Host;Lcom/android/internal/util/function/TriFunction;Landroid/os/Handler;)V
-HSPLandroid/view/InsetsController;->abortPendingImeControlRequest()V
-HSPLandroid/view/InsetsController;->applyAnimation(IZZLandroid/view/inputmethod/ImeTracker$Token;)V
-HSPLandroid/view/InsetsController;->applyAnimation(IZZZLandroid/view/inputmethod/ImeTracker$Token;)V
-HSPLandroid/view/InsetsController;->applyLocalVisibilityOverride()V
-HSPLandroid/view/InsetsController;->calculateControllableTypes()I
-HSPLandroid/view/InsetsController;->calculateInsets(ZIIIII)Landroid/view/WindowInsets;
-HSPLandroid/view/InsetsController;->calculateVisibleInsets(IIII)Landroid/graphics/Insets;
-HSPLandroid/view/InsetsController;->cancelAnimation(Landroid/view/InsetsAnimationControlRunner;Z)V
-HSPLandroid/view/InsetsController;->cancelExistingAnimations()V
-HSPLandroid/view/InsetsController;->cancelExistingControllers(I)V
-HSPLandroid/view/InsetsController;->captionInsetsUnchanged()Z
-HSPLandroid/view/InsetsController;->collectSourceControls(ZILandroid/util/SparseArray;ILandroid/view/inputmethod/ImeTracker$Token;)Landroid/util/Pair;
-HSPLandroid/view/InsetsController;->controlAnimationUncheckedInner(ILandroid/os/CancellationSignal;Landroid/view/WindowInsetsAnimationControlListener;Landroid/graphics/Rect;ZJLandroid/view/animation/Interpolator;IIZLandroid/view/inputmethod/ImeTracker$Token;)V
-HSPLandroid/view/InsetsController;->dispatchAnimationEnd(Landroid/view/WindowInsetsAnimation;)V
-HSPLandroid/view/InsetsController;->getAnimationType(I)I
-HSPLandroid/view/InsetsController;->getHost()Landroid/view/InsetsController$Host;
-HSPLandroid/view/InsetsController;->getLastDispatchedState()Landroid/view/InsetsState;
-HSPLandroid/view/InsetsController;->getRequestedVisibleTypes()I
-HSPLandroid/view/InsetsController;->getSourceConsumer(II)Landroid/view/InsetsSourceConsumer;
-HSPLandroid/view/InsetsController;->getState()Landroid/view/InsetsState;
-HSPLandroid/view/InsetsController;->getSystemBarsAppearance()I
-HSPLandroid/view/InsetsController;->hide(I)V
-HSPLandroid/view/InsetsController;->invokeControllableInsetsChangedListeners()I
-HSPLandroid/view/InsetsController;->lambda$new$2(Landroid/view/InsetsController;Ljava/lang/Integer;Ljava/lang/Integer;)Landroid/view/InsetsSourceConsumer;
-HSPLandroid/view/InsetsController;->lambda$static$1(FLandroid/graphics/Insets;Landroid/graphics/Insets;)Landroid/graphics/Insets;
-HSPLandroid/view/InsetsController;->notifyControlRevoked(Landroid/view/InsetsSourceConsumer;)V
-HSPLandroid/view/InsetsController;->notifyFinished(Landroid/view/InsetsAnimationControlRunner;Z)V
-HSPLandroid/view/InsetsController;->notifyVisibilityChanged()V
-HSPLandroid/view/InsetsController;->onControlsChanged([Landroid/view/InsetsSourceControl;)V
-HSPLandroid/view/InsetsController;->onFrameChanged(Landroid/graphics/Rect;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HSPLandroid/view/InsetsController;->onStateChanged(Landroid/view/InsetsState;)Z
-HSPLandroid/view/InsetsController;->onWindowFocusGained(Z)V
-HSPLandroid/view/InsetsController;->onWindowFocusLost()V
-HSPLandroid/view/InsetsController;->reportPerceptible(IZ)V
-HSPLandroid/view/InsetsController;->reportRequestedVisibleTypes()V
-HSPLandroid/view/InsetsController;->setRequestedVisibleTypes(II)V
-HSPLandroid/view/InsetsController;->show(I)V
-HSPLandroid/view/InsetsController;->show(IZLandroid/view/inputmethod/ImeTracker$Token;)V
-HSPLandroid/view/InsetsController;->updateCompatSysUiVisibility()V
-HSPLandroid/view/InsetsController;->updateState(Landroid/view/InsetsState;)V
-HSPLandroid/view/InsetsFlags;-><init>()V
-HSPLandroid/view/InsetsSource$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/InsetsSource;
-HSPLandroid/view/InsetsSource$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/InsetsSource;-><init>(II)V
-HSPLandroid/view/InsetsSource;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/InsetsSource;-><init>(Landroid/view/InsetsSource;)V
-HSPLandroid/view/InsetsSource;->calculateInsets(Landroid/graphics/Rect;Landroid/graphics/Rect;Z)Landroid/graphics/Insets;+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HSPLandroid/view/InsetsSource;->calculateInsets(Landroid/graphics/Rect;Z)Landroid/graphics/Insets;
-HSPLandroid/view/InsetsSource;->calculateVisibleInsets(Landroid/graphics/Rect;)Landroid/graphics/Insets;
-HSPLandroid/view/InsetsSource;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/InsetsSource;->equals(Ljava/lang/Object;Z)Z
-HSPLandroid/view/InsetsSource;->getFlags()I
-HSPLandroid/view/InsetsSource;->getFrame()Landroid/graphics/Rect;
-HSPLandroid/view/InsetsSource;->getId()I
-HSPLandroid/view/InsetsSource;->getIntersection(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
-HSPLandroid/view/InsetsSource;->getType()I
-HSPLandroid/view/InsetsSource;->getVisibleFrame()Landroid/graphics/Rect;
-HSPLandroid/view/InsetsSource;->hasFlags(I)Z
-HSPLandroid/view/InsetsSource;->isVisible()Z
-HSPLandroid/view/InsetsSource;->setVisible(Z)Landroid/view/InsetsSource;
-HSPLandroid/view/InsetsSource;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/InsetsSourceConsumer;-><init>(IILandroid/view/InsetsState;Ljava/util/function/Supplier;Landroid/view/InsetsController;)V
-HSPLandroid/view/InsetsSourceConsumer;->applyLocalVisibilityOverride()Z
-HSPLandroid/view/InsetsSourceConsumer;->applyRequestedVisibilityToControl()V
-HSPLandroid/view/InsetsSourceConsumer;->getControl()Landroid/view/InsetsSourceControl;
-HSPLandroid/view/InsetsSourceConsumer;->getId()I
-HSPLandroid/view/InsetsSourceConsumer;->getType()I
-HSPLandroid/view/InsetsSourceConsumer;->isRequestedVisibleAwaitingControl()Z
-HSPLandroid/view/InsetsSourceConsumer;->onPerceptible(Z)V
-HSPLandroid/view/InsetsSourceConsumer;->onWindowFocusGained(Z)V
-HSPLandroid/view/InsetsSourceConsumer;->onWindowFocusLost()V
-HSPLandroid/view/InsetsSourceConsumer;->removeSurface()V
-HSPLandroid/view/InsetsSourceConsumer;->setControl(Landroid/view/InsetsSourceControl;[I[I)Z
-HSPLandroid/view/InsetsSourceConsumer;->updateSource(Landroid/view/InsetsSource;I)V
-HSPLandroid/view/InsetsSourceControl$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/InsetsSourceControl;
-HSPLandroid/view/InsetsSourceControl$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/InsetsSourceControl$1;->newArray(I)[Landroid/view/InsetsSourceControl;
-HSPLandroid/view/InsetsSourceControl$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/view/InsetsSourceControl$Array$1;-><init>()V
-HSPLandroid/view/InsetsSourceControl$Array;-><clinit>()V
-HSPLandroid/view/InsetsSourceControl$Array;-><init>()V
-HSPLandroid/view/InsetsSourceControl$Array;->get()[Landroid/view/InsetsSourceControl;
-HSPLandroid/view/InsetsSourceControl$Array;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/view/InsetsSourceControl;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/InsetsSourceControl;-><init>(Landroid/view/InsetsSourceControl;)V
-HSPLandroid/view/InsetsSourceControl;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/InsetsSourceControl;->getAndClearSkipAnimationOnce()Z
-HSPLandroid/view/InsetsSourceControl;->getId()I
-HSPLandroid/view/InsetsSourceControl;->getInsetsHint()Landroid/graphics/Insets;
-HSPLandroid/view/InsetsSourceControl;->getLeash()Landroid/view/SurfaceControl;
-HSPLandroid/view/InsetsSourceControl;->getSurfacePosition()Landroid/graphics/Point;
-HSPLandroid/view/InsetsSourceControl;->getType()I
-HSPLandroid/view/InsetsSourceControl;->hashCode()I
-HSPLandroid/view/InsetsSourceControl;->isInitiallyVisible()Z
-HSPLandroid/view/InsetsSourceControl;->release(Ljava/util/function/Consumer;)V
-HSPLandroid/view/InsetsSourceControl;->setSurfacePosition(II)Z
-HSPLandroid/view/InsetsState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/InsetsState;
-HSPLandroid/view/InsetsState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/InsetsState$OnTraverseCallbacks;->onIdMatch(Landroid/view/InsetsSource;Landroid/view/InsetsSource;)V
-HSPLandroid/view/InsetsState$OnTraverseCallbacks;->onStart(Landroid/view/InsetsState;Landroid/view/InsetsState;)V
-HSPLandroid/view/InsetsState;-><init>()V
-HSPLandroid/view/InsetsState;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/InsetsState;-><init>(Landroid/view/InsetsState;Z)V
-HSPLandroid/view/InsetsState;->addSource(Landroid/view/InsetsSource;)V
-HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;II)Landroid/graphics/Insets;+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;IZ)Landroid/graphics/Insets;+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;Landroid/view/InsetsState;ZIIIIILandroid/util/SparseIntArray;)Landroid/view/WindowInsets;
-HSPLandroid/view/InsetsState;->calculateRelativeCutout(Landroid/graphics/Rect;)Landroid/view/DisplayCutout;
-HSPLandroid/view/InsetsState;->calculateRelativeDisplayShape(Landroid/graphics/Rect;)Landroid/view/DisplayShape;
-HSPLandroid/view/InsetsState;->calculateRelativePrivacyIndicatorBounds(Landroid/graphics/Rect;)Landroid/view/PrivacyIndicatorBounds;
-HSPLandroid/view/InsetsState;->calculateRelativeRoundedCorners(Landroid/graphics/Rect;)Landroid/view/RoundedCorners;
-HSPLandroid/view/InsetsState;->calculateUncontrollableInsetsFromFrame(Landroid/graphics/Rect;)I
-HSPLandroid/view/InsetsState;->calculateVisibleInsets(Landroid/graphics/Rect;IIII)Landroid/graphics/Insets;
-HSPLandroid/view/InsetsState;->canControlSource(Landroid/graphics/Rect;Landroid/view/InsetsSource;)Z
-HSPLandroid/view/InsetsState;->clearsCompatInsets(IIII)Z
-HSPLandroid/view/InsetsState;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/InsetsState;->equals(Ljava/lang/Object;ZZ)Z
-HSPLandroid/view/InsetsState;->getDisplayCutout()Landroid/view/DisplayCutout;+]Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/view/DisplayCutout$ParcelableWrapper;
-HSPLandroid/view/InsetsState;->getDisplayCutoutSafe(Landroid/graphics/Rect;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/DisplayCutout;Landroid/view/DisplayCutout;]Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/view/DisplayCutout$ParcelableWrapper;
-HSPLandroid/view/InsetsState;->getDisplayFrame()Landroid/graphics/Rect;
-HSPLandroid/view/InsetsState;->getDisplayShape()Landroid/view/DisplayShape;
-HSPLandroid/view/InsetsState;->getPrivacyIndicatorBounds()Landroid/view/PrivacyIndicatorBounds;
-HSPLandroid/view/InsetsState;->getRoundedCorners()Landroid/view/RoundedCorners;
-HSPLandroid/view/InsetsState;->isSourceOrDefaultVisible(II)Z
-HSPLandroid/view/InsetsState;->peekSource(I)Landroid/view/InsetsSource;
-HSPLandroid/view/InsetsState;->readFromParcel(Landroid/os/Parcel;)Landroid/util/SparseArray;
-HSPLandroid/view/InsetsState;->set(Landroid/view/InsetsState;I)V
-HSPLandroid/view/InsetsState;->set(Landroid/view/InsetsState;Z)V
-HSPLandroid/view/InsetsState;->setDisplayCutout(Landroid/view/DisplayCutout;)V
-HSPLandroid/view/InsetsState;->setDisplayFrame(Landroid/graphics/Rect;)V
-HSPLandroid/view/InsetsState;->setPrivacyIndicatorBounds(Landroid/view/PrivacyIndicatorBounds;)V
-HSPLandroid/view/InsetsState;->setRoundedCorners(Landroid/view/RoundedCorners;)V
-HSPLandroid/view/InsetsState;->sourceAt(I)Landroid/view/InsetsSource;
-HSPLandroid/view/InsetsState;->sourceIdAt(I)I
-HSPLandroid/view/InsetsState;->sourceSize()I
-HSPLandroid/view/InsetsState;->traverse(Landroid/view/InsetsState;Landroid/view/InsetsState;Landroid/view/InsetsState$OnTraverseCallbacks;)V
-HSPLandroid/view/InsetsState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/KeyCharacterMap$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/KeyCharacterMap;
-HSPLandroid/view/KeyCharacterMap$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/KeyCharacterMap;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/KeyCharacterMap;->finalize()V
-HSPLandroid/view/KeyCharacterMap;->get(II)I
-HSPLandroid/view/KeyCharacterMap;->getKeyboardType()I
-HSPLandroid/view/KeyCharacterMap;->getModifierBehavior()I
-HSPLandroid/view/KeyCharacterMap;->load(I)Landroid/view/KeyCharacterMap;
-HSPLandroid/view/KeyEvent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/KeyEvent;
-HSPLandroid/view/KeyEvent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/KeyEvent$DispatcherState;-><init>()V
-HSPLandroid/view/KeyEvent$DispatcherState;->handleUpEvent(Landroid/view/KeyEvent;)V
-HSPLandroid/view/KeyEvent$DispatcherState;->isTracking(Landroid/view/KeyEvent;)Z
-HSPLandroid/view/KeyEvent$DispatcherState;->reset()V
-HSPLandroid/view/KeyEvent$DispatcherState;->reset(Ljava/lang/Object;)V
-HSPLandroid/view/KeyEvent$DispatcherState;->startTracking(Landroid/view/KeyEvent;Ljava/lang/Object;)V
-HSPLandroid/view/KeyEvent;-><init>(JJIIIIIIII)V
-HSPLandroid/view/KeyEvent;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/KeyEvent;->actionToString(I)Ljava/lang/String;
-HSPLandroid/view/KeyEvent;->dispatch(Landroid/view/KeyEvent$Callback;Landroid/view/KeyEvent$DispatcherState;Ljava/lang/Object;)Z
-HSPLandroid/view/KeyEvent;->getAction()I
-HSPLandroid/view/KeyEvent;->getDeviceId()I
-HSPLandroid/view/KeyEvent;->getEventTime()J
-HSPLandroid/view/KeyEvent;->getFlags()I
-HSPLandroid/view/KeyEvent;->getId()I
-HSPLandroid/view/KeyEvent;->getKeyCharacterMap()Landroid/view/KeyCharacterMap;
-HSPLandroid/view/KeyEvent;->getKeyCode()I
-HSPLandroid/view/KeyEvent;->getMetaState()I
-HSPLandroid/view/KeyEvent;->getRepeatCount()I
-HSPLandroid/view/KeyEvent;->getSource()I
-HSPLandroid/view/KeyEvent;->getUnicodeChar()I
-HSPLandroid/view/KeyEvent;->getUnicodeChar(I)I
-HSPLandroid/view/KeyEvent;->isCanceled()Z
-HSPLandroid/view/KeyEvent;->isModifierKey(I)Z
-HSPLandroid/view/KeyEvent;->isTracking()Z
-HSPLandroid/view/KeyEvent;->metaStateToString(I)Ljava/lang/String;
-HSPLandroid/view/KeyEvent;->normalizeMetaState(I)I
-HSPLandroid/view/KeyEvent;->obtain()Landroid/view/KeyEvent;
-HSPLandroid/view/KeyEvent;->obtain(IJJIIIIIIIII[BLjava/lang/String;)Landroid/view/KeyEvent;
-HSPLandroid/view/KeyEvent;->recycleIfNeededAfterDispatch()V
-HSPLandroid/view/KeyEvent;->startTracking()V
-HSPLandroid/view/KeyEvent;->toString()Ljava/lang/String;
-HSPLandroid/view/KeyEvent;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/LayoutInflater$FactoryMerger;-><init>(Landroid/view/LayoutInflater$Factory;Landroid/view/LayoutInflater$Factory2;Landroid/view/LayoutInflater$Factory;Landroid/view/LayoutInflater$Factory2;)V
-HSPLandroid/view/LayoutInflater$FactoryMerger;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroid/view/LayoutInflater;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/LayoutInflater;-><init>(Landroid/view/LayoutInflater;Landroid/content/Context;)V
-HSPLandroid/view/LayoutInflater;->advanceToRootNode(Lorg/xmlpull/v1/XmlPullParser;)V
-HSPLandroid/view/LayoutInflater;->consumeChildElements(Lorg/xmlpull/v1/XmlPullParser;)V
-HSPLandroid/view/LayoutInflater;->createView(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroid/view/LayoutInflater;->createView(Ljava/lang/String;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroid/view/LayoutInflater;->createViewFromTag(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroid/view/LayoutInflater;->createViewFromTag(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;Z)Landroid/view/View;
-HSPLandroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater;
-HSPLandroid/view/LayoutInflater;->getContext()Landroid/content/Context;
-HSPLandroid/view/LayoutInflater;->getFactory()Landroid/view/LayoutInflater$Factory;
-HSPLandroid/view/LayoutInflater;->getFactory2()Landroid/view/LayoutInflater$Factory2;
-HSPLandroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View;
-HSPLandroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;
-HSPLandroid/view/LayoutInflater;->inflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/ViewGroup;Z)Landroid/view/View;
-HSPLandroid/view/LayoutInflater;->onCreateView(Landroid/content/Context;Landroid/view/View;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroid/view/LayoutInflater;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroid/view/LayoutInflater;->onCreateView(Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroid/view/LayoutInflater;->parseInclude(Lorg/xmlpull/v1/XmlPullParser;Landroid/content/Context;Landroid/view/View;Landroid/util/AttributeSet;)V+]Landroid/util/AttributeSet;Landroid/content/res/XmlBlock$Parser;]Landroid/view/View;missing_types]Landroid/view/ViewGroup;Landroid/widget/FrameLayout;,Landroid/widget/LinearLayout;]Landroid/view/LayoutInflater;Lcom/android/internal/policy/PhoneLayoutInflater;]Landroid/content/res/Resources$Theme;Landroid/content/res/Resources$Theme;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/Context;missing_types]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Landroid/content/res/XmlResourceParser;Landroid/content/res/XmlBlock$Parser;
-HSPLandroid/view/LayoutInflater;->rInflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/View;Landroid/content/Context;Landroid/util/AttributeSet;Z)V+]Landroid/view/View;missing_types]Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/XmlBlock$Parser;]Landroid/view/ViewGroup;Landroid/widget/RelativeLayout;,Landroid/widget/FrameLayout;,Landroid/widget/LinearLayout;]Landroid/view/LayoutInflater;Lcom/android/internal/policy/PhoneLayoutInflater;]Ljava/lang/Object;Ljava/lang/String;
-HSPLandroid/view/LayoutInflater;->rInflateChildren(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/View;Landroid/util/AttributeSet;Z)V
-HSPLandroid/view/LayoutInflater;->setFactory2(Landroid/view/LayoutInflater$Factory2;)V
-HSPLandroid/view/LayoutInflater;->setFilter(Landroid/view/LayoutInflater$Filter;)V
-HSPLandroid/view/LayoutInflater;->setPrivateFactory(Landroid/view/LayoutInflater$Factory2;)V
-HSPLandroid/view/LayoutInflater;->tryCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroid/view/LayoutInflater;->verifyClassLoader(Ljava/lang/reflect/Constructor;)Z
-HSPLandroid/view/MenuInflater;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/MotionEvent$PointerCoords;-><init>()V
-HSPLandroid/view/MotionEvent$PointerProperties;-><init>()V
-HSPLandroid/view/MotionEvent;-><init>()V
-HSPLandroid/view/MotionEvent;->ensureSharedTempPointerCapacity(I)V
-HSPLandroid/view/MotionEvent;->finalize()V
-HSPLandroid/view/MotionEvent;->findPointerIndex(I)I
-HSPLandroid/view/MotionEvent;->getAction()I
-HSPLandroid/view/MotionEvent;->getActionIndex()I
-HSPLandroid/view/MotionEvent;->getActionMasked()I
-HSPLandroid/view/MotionEvent;->getAxisValue(I)F
-HSPLandroid/view/MotionEvent;->getButtonState()I
-HSPLandroid/view/MotionEvent;->getClassification()I
-HSPLandroid/view/MotionEvent;->getDeviceId()I
-HSPLandroid/view/MotionEvent;->getDownTime()J
-HSPLandroid/view/MotionEvent;->getEdgeFlags()I
-HSPLandroid/view/MotionEvent;->getEventTime()J
-HSPLandroid/view/MotionEvent;->getFlags()I
-HSPLandroid/view/MotionEvent;->getHistoricalEventTime(I)J
-HSPLandroid/view/MotionEvent;->getHistoricalX(II)F
-HSPLandroid/view/MotionEvent;->getHistoricalY(II)F
-HSPLandroid/view/MotionEvent;->getHistorySize()I
-HSPLandroid/view/MotionEvent;->getId()I
-HSPLandroid/view/MotionEvent;->getMetaState()I
-HSPLandroid/view/MotionEvent;->getOrientation()F
-HSPLandroid/view/MotionEvent;->getPointerCount()I
-HSPLandroid/view/MotionEvent;->getPointerId(I)I
-HSPLandroid/view/MotionEvent;->getPointerIdBits()I
-HSPLandroid/view/MotionEvent;->getPressure(I)F
-HSPLandroid/view/MotionEvent;->getRawX()F
-HSPLandroid/view/MotionEvent;->getRawY()F
-HSPLandroid/view/MotionEvent;->getSource()I
-HSPLandroid/view/MotionEvent;->getToolType(I)I
-HSPLandroid/view/MotionEvent;->getTouchMajor()F
-HSPLandroid/view/MotionEvent;->getTouchMinor()F
-HSPLandroid/view/MotionEvent;->getX()F
-HSPLandroid/view/MotionEvent;->getX(I)F
-HSPLandroid/view/MotionEvent;->getY()F
-HSPLandroid/view/MotionEvent;->getY(I)F
-HSPLandroid/view/MotionEvent;->initialize(IIIIIIIIIFFFFJJI[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;)Z
-HSPLandroid/view/MotionEvent;->isTargetAccessibilityFocus()Z+]Landroid/view/MotionEvent;Landroid/view/MotionEvent;
-HSPLandroid/view/MotionEvent;->isTouchEvent()Z
-HSPLandroid/view/MotionEvent;->obtain()Landroid/view/MotionEvent;
-HSPLandroid/view/MotionEvent;->obtain(JJIFFFFIFFII)Landroid/view/MotionEvent;
-HSPLandroid/view/MotionEvent;->obtain(JJIFFFFIFFIIII)Landroid/view/MotionEvent;
-HSPLandroid/view/MotionEvent;->obtain(JJIFFI)Landroid/view/MotionEvent;
-HSPLandroid/view/MotionEvent;->obtain(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-HSPLandroid/view/MotionEvent;->offsetLocation(FF)V
-HSPLandroid/view/MotionEvent;->recycle()V
-HSPLandroid/view/MotionEvent;->setAction(I)V
-HSPLandroid/view/MotionEvent;->setLocation(FF)V
-HSPLandroid/view/MotionEvent;->setTargetAccessibilityFocus(Z)V+]Landroid/view/MotionEvent;Landroid/view/MotionEvent;
-HSPLandroid/view/MotionEvent;->split(I)Landroid/view/MotionEvent;
-HSPLandroid/view/MotionEvent;->transform(Landroid/graphics/Matrix;)V
-HSPLandroid/view/MotionEvent;->updateCursorPosition()V
-HSPLandroid/view/OrientationEventListener$SensorEventListenerImpl;->onAccuracyChanged(Landroid/hardware/Sensor;I)V
-HSPLandroid/view/OrientationEventListener$SensorEventListenerImpl;->onSensorChanged(Landroid/hardware/SensorEvent;)V
-HSPLandroid/view/OrientationEventListener;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/OrientationEventListener;-><init>(Landroid/content/Context;I)V
-HSPLandroid/view/OrientationEventListener;->disable()V
-HSPLandroid/view/OrientationEventListener;->enable()V
-HSPLandroid/view/PendingInsetsController;-><init>()V
-HSPLandroid/view/PendingInsetsController;->detach()V
-HSPLandroid/view/PendingInsetsController;->getRequestedVisibleTypes()I
-HSPLandroid/view/PendingInsetsController;->getSystemBarsAppearance()I
-HSPLandroid/view/PendingInsetsController;->replayAndAttach(Landroid/view/InsetsController;)V
-HSPLandroid/view/PointerIcon;->getSystemIcon(Landroid/content/Context;I)Landroid/view/PointerIcon;
-HSPLandroid/view/PointerIcon;->getSystemIconTypeIndex(I)I
-HSPLandroid/view/PrivacyIndicatorBounds$1;-><init>()V
-HSPLandroid/view/PrivacyIndicatorBounds$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/PrivacyIndicatorBounds;
-HSPLandroid/view/PrivacyIndicatorBounds$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/PrivacyIndicatorBounds;-><clinit>()V
-HSPLandroid/view/PrivacyIndicatorBounds;-><init>()V
-HSPLandroid/view/PrivacyIndicatorBounds;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/PrivacyIndicatorBounds;-><init>([Landroid/graphics/Rect;I)V
-HSPLandroid/view/PrivacyIndicatorBounds;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/PrivacyIndicatorBounds;->inset(IIII)Landroid/view/PrivacyIndicatorBounds;
-HSPLandroid/view/PrivacyIndicatorBounds;->insetRect(Landroid/graphics/Rect;IIII)Landroid/graphics/Rect;
-HSPLandroid/view/PrivacyIndicatorBounds;->updateStaticBounds([Landroid/graphics/Rect;)Landroid/view/PrivacyIndicatorBounds;
-HSPLandroid/view/PrivacyIndicatorBounds;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/RemoteAccessibilityController;-><init>(Landroid/view/View;)V
-HSPLandroid/view/RemoteAccessibilityController;->connected()Z
-HSPLandroid/view/RemoteAccessibilityController;->disassosciateHierarchy()V
-HSPLandroid/view/RemoteAccessibilityController;->setRemoteAccessibilityEmbeddedConnection(Landroid/view/accessibility/IAccessibilityEmbeddedConnection;Landroid/os/IBinder;)V
-HSPLandroid/view/RemoteAnimationAdapter;-><init>(Landroid/view/IRemoteAnimationRunner;JJ)V
-HSPLandroid/view/RemoteAnimationAdapter;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/RoundedCorner$1;-><init>()V
-HSPLandroid/view/RoundedCorner$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/RoundedCorner;
-HSPLandroid/view/RoundedCorner$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/RoundedCorner;-><clinit>()V
-HSPLandroid/view/RoundedCorner;-><init>(I)V
-HSPLandroid/view/RoundedCorner;-><init>(IIII)V
-HSPLandroid/view/RoundedCorner;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/RoundedCorner;->getCenter()Landroid/graphics/Point;
-HSPLandroid/view/RoundedCorner;->getRadius()I
-HSPLandroid/view/RoundedCorner;->isEmpty()Z
-HSPLandroid/view/RoundedCorners$1;-><init>()V
-HSPLandroid/view/RoundedCorners$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/RoundedCorners;
-HSPLandroid/view/RoundedCorners$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/RoundedCorners;-><clinit>()V
-HSPLandroid/view/RoundedCorners;-><init>(Landroid/view/RoundedCorner;Landroid/view/RoundedCorner;Landroid/view/RoundedCorner;Landroid/view/RoundedCorner;)V
-HSPLandroid/view/RoundedCorners;-><init>([Landroid/view/RoundedCorner;)V
-HSPLandroid/view/RoundedCorners;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/RoundedCorners;->getRoundedCornerBottomRadius(Landroid/content/res/Resources;Ljava/lang/String;)I
-HSPLandroid/view/RoundedCorners;->getRoundedCornerRadius(Landroid/content/res/Resources;Ljava/lang/String;)I
-HSPLandroid/view/RoundedCorners;->getRoundedCornerTopRadius(Landroid/content/res/Resources;Ljava/lang/String;)I
-HSPLandroid/view/RoundedCorners;->inset(IIII)Landroid/view/RoundedCorners;
-HSPLandroid/view/RoundedCorners;->insetRoundedCorner(IIIIIIII)Landroid/view/RoundedCorner;
-HSPLandroid/view/RoundedCorners;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/ScaleGestureDetector;-><init>(Landroid/content/Context;Landroid/view/ScaleGestureDetector$OnScaleGestureListener;)V
-HSPLandroid/view/ScaleGestureDetector;-><init>(Landroid/content/Context;Landroid/view/ScaleGestureDetector$OnScaleGestureListener;Landroid/os/Handler;)V
-HSPLandroid/view/ScaleGestureDetector;->onTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/view/ScaleGestureDetector;->setQuickScaleEnabled(Z)V
-HSPLandroid/view/ScaleGestureDetector;->setStylusScaleEnabled(Z)V
-HSPLandroid/view/Surface$CompatibleCanvas;-><init>(Landroid/view/Surface;)V
-HSPLandroid/view/Surface;-><init>()V
-HSPLandroid/view/Surface;-><init>(J)V
-HSPLandroid/view/Surface;-><init>(Landroid/graphics/SurfaceTexture;)V
-HSPLandroid/view/Surface;->checkNotReleasedLocked()V
-HSPLandroid/view/Surface;->copyFrom(Landroid/graphics/BLASTBufferQueue;)V
-HSPLandroid/view/Surface;->copyFrom(Landroid/view/SurfaceControl;)V
-HSPLandroid/view/Surface;->destroy()V
-HSPLandroid/view/Surface;->finalize()V
-HSPLandroid/view/Surface;->forceScopedDisconnect()V
-HSPLandroid/view/Surface;->getGenerationId()I
-HSPLandroid/view/Surface;->getNextFrameNumber()J
-HSPLandroid/view/Surface;->isValid()Z
-HSPLandroid/view/Surface;->lockCanvas(Landroid/graphics/Rect;)Landroid/graphics/Canvas;
-HSPLandroid/view/Surface;->release()V
-HSPLandroid/view/Surface;->rotationToString(I)Ljava/lang/String;
-HSPLandroid/view/Surface;->setNativeObjectLocked(J)V
-HSPLandroid/view/Surface;->transferFrom(Landroid/view/Surface;)V
-HSPLandroid/view/Surface;->unlockCanvasAndPost(Landroid/graphics/Canvas;)V
-HSPLandroid/view/Surface;->unlockSwCanvasAndPost(Landroid/graphics/Canvas;)V
-HSPLandroid/view/Surface;->updateNativeObject(J)V
-HSPLandroid/view/Surface;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/SurfaceControl$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/SurfaceControl;
-HSPLandroid/view/SurfaceControl$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/SurfaceControl$Builder;-><init>(Landroid/view/SurfaceSession;)V
-HSPLandroid/view/SurfaceControl$Builder;->build()Landroid/view/SurfaceControl;
-HSPLandroid/view/SurfaceControl$Builder;->setBLASTLayer()Landroid/view/SurfaceControl$Builder;
-HSPLandroid/view/SurfaceControl$Builder;->setBufferSize(II)Landroid/view/SurfaceControl$Builder;
-HSPLandroid/view/SurfaceControl$Builder;->setCallsite(Ljava/lang/String;)Landroid/view/SurfaceControl$Builder;
-HSPLandroid/view/SurfaceControl$Builder;->setColorLayer()Landroid/view/SurfaceControl$Builder;
-HSPLandroid/view/SurfaceControl$Builder;->setContainerLayer()Landroid/view/SurfaceControl$Builder;
-HSPLandroid/view/SurfaceControl$Builder;->setFlags(I)Landroid/view/SurfaceControl$Builder;
-HSPLandroid/view/SurfaceControl$Builder;->setFlags(II)Landroid/view/SurfaceControl$Builder;
-HSPLandroid/view/SurfaceControl$Builder;->setFormat(I)Landroid/view/SurfaceControl$Builder;
-HSPLandroid/view/SurfaceControl$Builder;->setHidden(Z)Landroid/view/SurfaceControl$Builder;
-HSPLandroid/view/SurfaceControl$Builder;->setLocalOwnerView(Landroid/view/View;)Landroid/view/SurfaceControl$Builder;
-HSPLandroid/view/SurfaceControl$Builder;->setName(Ljava/lang/String;)Landroid/view/SurfaceControl$Builder;
-HSPLandroid/view/SurfaceControl$Builder;->setOpaque(Z)Landroid/view/SurfaceControl$Builder;
-HSPLandroid/view/SurfaceControl$Builder;->setParent(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Builder;
-HSPLandroid/view/SurfaceControl$Builder;->unsetBufferSize()V
-HSPLandroid/view/SurfaceControl$Transaction;-><init>()V
-HSPLandroid/view/SurfaceControl$Transaction;-><init>(J)V+]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry;
-HSPLandroid/view/SurfaceControl$Transaction;->apply()V
-HSPLandroid/view/SurfaceControl$Transaction;->apply(Z)V
-HSPLandroid/view/SurfaceControl$Transaction;->applyResizedSurfaces()V
-HSPLandroid/view/SurfaceControl$Transaction;->checkPreconditions(Landroid/view/SurfaceControl;)V
-HSPLandroid/view/SurfaceControl$Transaction;->clear()V
-HSPLandroid/view/SurfaceControl$Transaction;->close()V
-HSPLandroid/view/SurfaceControl$Transaction;->hide(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->merge(Landroid/view/SurfaceControl$Transaction;)Landroid/view/SurfaceControl$Transaction;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLandroid/view/SurfaceControl$Transaction;->notifyReparentedSurfaces()V
-HSPLandroid/view/SurfaceControl$Transaction;->remove(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->reparent(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->sanitize(II)V
-HSPLandroid/view/SurfaceControl$Transaction;->setAlpha(Landroid/view/SurfaceControl;F)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setBufferSize(Landroid/view/SurfaceControl;II)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setColor(Landroid/view/SurfaceControl;[F)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setCornerRadius(Landroid/view/SurfaceControl;F)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setDesintationFrame(Landroid/view/SurfaceControl;II)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setExtendedRangeBrightness(Landroid/view/SurfaceControl;FF)Landroid/view/SurfaceControl$Transaction;+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setFrameTimelineVsync(J)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setLayer(Landroid/view/SurfaceControl;I)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setMatrix(Landroid/view/SurfaceControl;FFFF)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setMatrix(Landroid/view/SurfaceControl;Landroid/graphics/Matrix;[F)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setOpaque(Landroid/view/SurfaceControl;Z)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setPosition(Landroid/view/SurfaceControl;FF)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setRelativeLayer(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;I)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setWindowCrop(Landroid/view/SurfaceControl;II)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->setWindowCrop(Landroid/view/SurfaceControl;Landroid/graphics/Rect;)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->show(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceControl$Transaction;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/SurfaceControl;->-$$Nest$smnativeCreateTransaction()J
-HSPLandroid/view/SurfaceControl;->-$$Nest$smnativeSanitize(JII)V
-HSPLandroid/view/SurfaceControl;->-$$Nest$smnativeSetDestinationFrame(JJIIII)V
-HSPLandroid/view/SurfaceControl;->-$$Nest$smnativeSetExtendedRangeBrightness(JJFF)V
-HSPLandroid/view/SurfaceControl;->-$$Nest$smnativeSetFlags(JJII)V
-HSPLandroid/view/SurfaceControl;-><init>()V
-HSPLandroid/view/SurfaceControl;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/SurfaceControl;-><init>(Landroid/view/SurfaceControl;Ljava/lang/String;)V
-HSPLandroid/view/SurfaceControl;-><init>(Landroid/view/SurfaceSession;Ljava/lang/String;IIIILandroid/view/SurfaceControl;Landroid/util/SparseIntArray;Ljava/lang/ref/WeakReference;Ljava/lang/String;)V
-HSPLandroid/view/SurfaceControl;->assignNativeObject(JLjava/lang/String;)V
-HSPLandroid/view/SurfaceControl;->checkNotReleased()V
-HSPLandroid/view/SurfaceControl;->copyFrom(Landroid/view/SurfaceControl;Ljava/lang/String;)V
-HSPLandroid/view/SurfaceControl;->finalize()V
-HSPLandroid/view/SurfaceControl;->getTransformHint()I
-HSPLandroid/view/SurfaceControl;->isSameSurface(Landroid/view/SurfaceControl;)Z
-HSPLandroid/view/SurfaceControl;->isValid()Z
-HSPLandroid/view/SurfaceControl;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/view/SurfaceControl;->release()V
-HSPLandroid/view/SurfaceControl;->rotationToBufferTransform(I)I
-HSPLandroid/view/SurfaceControl;->setTransformHint(I)V
-HSPLandroid/view/SurfaceControlRegistry$DefaultReporter;-><init>()V
-HSPLandroid/view/SurfaceControlRegistry$DefaultReporter;-><init>(Landroid/view/SurfaceControlRegistry$DefaultReporter-IA;)V
-HSPLandroid/view/SurfaceControlRegistry;-><clinit>()V
-HSPLandroid/view/SurfaceControlRegistry;->getProcessInstance()Landroid/view/SurfaceControlRegistry;
-HSPLandroid/view/SurfaceSession;-><init>()V
-HSPLandroid/view/SurfaceSession;->finalize()V
-HSPLandroid/view/SurfaceSession;->kill()V
-HSPLandroid/view/SurfaceView$$ExternalSyntheticLambda1;-><init>(Landroid/view/SurfaceView;)V
-HSPLandroid/view/SurfaceView$1;-><init>(Landroid/view/SurfaceView;)V
-HSPLandroid/view/SurfaceView$SurfaceViewPositionUpdateListener;-><init>(Landroid/view/SurfaceView;II)V
-HSPLandroid/view/SurfaceView$SurfaceViewPositionUpdateListener;->positionChanged(JIIII)V
-HSPLandroid/view/SurfaceView$SurfaceViewPositionUpdateListener;->positionLost(J)V
-HSPLandroid/view/SurfaceView;->-$$Nest$fgetmRTLastReportedPosition(Landroid/view/SurfaceView;)Landroid/graphics/Rect;
-HSPLandroid/view/SurfaceView;->-$$Nest$fgetmRtTransaction(Landroid/view/SurfaceView;)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceView;->-$$Nest$mapplyOrMergeTransaction(Landroid/view/SurfaceView;Landroid/view/SurfaceControl$Transaction;J)V
-HSPLandroid/view/SurfaceView;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/SurfaceView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/view/SurfaceView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/view/SurfaceView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;IIZ)V
-HSPLandroid/view/SurfaceView;->applyOrMergeTransaction(Landroid/view/SurfaceControl$Transaction;J)V
-HSPLandroid/view/SurfaceView;->applyTransactionOnVriDraw(Landroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/view/SurfaceView;->clearSurfaceViewPort(Landroid/graphics/Canvas;)V
-HSPLandroid/view/SurfaceView;->copySurface(ZZ)V
-HSPLandroid/view/SurfaceView;->createBlastSurfaceControls(Landroid/view/ViewRootImpl;Ljava/lang/String;Landroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/view/SurfaceView;->dispatchDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/view/SurfaceView;->gatherTransparentRegion(Landroid/graphics/Region;)Z
-HSPLandroid/view/SurfaceView;->getHolder()Landroid/view/SurfaceHolder;
-HSPLandroid/view/SurfaceView;->getSurfaceCallbacks()[Landroid/view/SurfaceHolder$Callback;
-HSPLandroid/view/SurfaceView;->notifySurfaceDestroyed()V
-HSPLandroid/view/SurfaceView;->onAttachedToWindow()V
-HSPLandroid/view/SurfaceView;->onDetachedFromWindow()V
-HSPLandroid/view/SurfaceView;->onDrawFinished()V
-HSPLandroid/view/SurfaceView;->onMeasure(II)V
-HSPLandroid/view/SurfaceView;->onSetSurfacePositionAndScale(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;IIFF)V
-HSPLandroid/view/SurfaceView;->onWindowVisibilityChanged(I)V
-HSPLandroid/view/SurfaceView;->performDrawFinished()V
-HSPLandroid/view/SurfaceView;->performSurfaceTransaction(Landroid/view/ViewRootImpl;Landroid/content/res/CompatibilityInfo$Translator;ZZZZLandroid/view/SurfaceControl$Transaction;)Z
-HSPLandroid/view/SurfaceView;->releaseSurfaces(Z)V
-HSPLandroid/view/SurfaceView;->replacePositionUpdateListener(II)V
-HSPLandroid/view/SurfaceView;->requiresSurfaceControlCreation(ZZ)Z
-HSPLandroid/view/SurfaceView;->setFrame(IIII)Z
-HSPLandroid/view/SurfaceView;->setVisibility(I)V
-HSPLandroid/view/SurfaceView;->setZOrderOnTop(Z)V
-HSPLandroid/view/SurfaceView;->setZOrderedOnTop(ZZ)Z
-HSPLandroid/view/SurfaceView;->surfaceCreated(Landroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/view/SurfaceView;->surfaceDestroyed()V
-HSPLandroid/view/SurfaceView;->updateBackgroundColor(Landroid/view/SurfaceControl$Transaction;)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/SurfaceView;->updateBackgroundVisibility(Landroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/view/SurfaceView;->updateEmbeddedAccessibilityMatrix(Z)V
-HSPLandroid/view/SurfaceView;->updateRelativeZ(Landroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/view/SurfaceView;->updateSurface()V
-HSPLandroid/view/SurfaceView;->vriDrawStarted(Z)V
-HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;-><init>(Landroid/view/SurfaceControl;)V
-HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;->build()Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;
-HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;->withAlpha(F)Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;
-HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;->withMatrix(Landroid/graphics/Matrix;)Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;
-HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;->withVisibility(Z)Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;
-HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;-><init>(Landroid/view/SurfaceControl;IFLandroid/graphics/Matrix;Landroid/graphics/Rect;IFIZLandroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/view/SyncRtSurfaceTransactionApplier;->applyParams(Landroid/view/SurfaceControl$Transaction;Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;[F)V
-HSPLandroid/view/TextureView;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/TextureView;->applyUpdate()V
-HSPLandroid/view/TextureView;->destroyHardwareLayer()V
-HSPLandroid/view/TextureView;->destroyHardwareResources()V
-HSPLandroid/view/TextureView;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/view/TextureView;->getLayerType()I
-HSPLandroid/view/TextureView;->getTextureLayer()Landroid/graphics/TextureLayer;
-HSPLandroid/view/TextureView;->isOpaque()Z
-HSPLandroid/view/TextureView;->onAttachedToWindow()V
-HSPLandroid/view/TextureView;->onDetachedFromWindowInternal()V
-HSPLandroid/view/TextureView;->onSizeChanged(IIII)V
-HSPLandroid/view/TextureView;->onVisibilityChanged(Landroid/view/View;I)V
-HSPLandroid/view/TextureView;->releaseSurfaceTexture()V
-HSPLandroid/view/TextureView;->setSurfaceTextureListener(Landroid/view/TextureView$SurfaceTextureListener;)V
-HSPLandroid/view/TextureView;->updateLayer()V
-HSPLandroid/view/ThreadedRenderer$1$$ExternalSyntheticLambda0;-><init>(Ljava/util/ArrayList;)V
-HSPLandroid/view/ThreadedRenderer$1$$ExternalSyntheticLambda0;->onFrameCommit(Z)V
-HSPLandroid/view/ThreadedRenderer$1;-><init>(Landroid/view/ThreadedRenderer;Ljava/util/ArrayList;)V
-HSPLandroid/view/ThreadedRenderer$1;->lambda$onFrameDraw$0(Ljava/util/ArrayList;Z)V+]Landroid/graphics/HardwareRenderer$FrameCommitCallback;Landroid/view/ViewRootImpl$7$$ExternalSyntheticLambda0;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ThreadedRenderer$1;->onFrameDraw(IJ)Landroid/graphics/HardwareRenderer$FrameCommitCallback;+]Landroid/graphics/HardwareRenderer$FrameDrawingCallback;Landroid/view/ViewRootImpl$3;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;->-$$Nest$fgetmSurfaceControl(Landroid/view/ThreadedRenderer$WebViewOverlayProvider;)Landroid/view/SurfaceControl;
-HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;-><clinit>()V
-HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;-><init>()V
-HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;-><init>(Landroid/view/ThreadedRenderer$WebViewOverlayProvider-IA;)V
-HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;->setBLASTBufferQueue(Landroid/graphics/BLASTBufferQueue;)V
-HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;->setSurfaceControl(Landroid/view/SurfaceControl;)V
-HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;->setSurfaceControlOpaque(Z)Z
-HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;->shouldEnableOverlaySupport()Z
-HSPLandroid/view/ThreadedRenderer;-><init>(Landroid/content/Context;ZLjava/lang/String;)V
-HSPLandroid/view/ThreadedRenderer;->access$000()Z
-HSPLandroid/view/ThreadedRenderer;->create(Landroid/content/Context;ZLjava/lang/String;)Landroid/view/ThreadedRenderer;
-HSPLandroid/view/ThreadedRenderer;->destroy()V
-HSPLandroid/view/ThreadedRenderer;->destroyHardwareResources(Landroid/view/View;)V
-HSPLandroid/view/ThreadedRenderer;->destroyResources(Landroid/view/View;)V
-HSPLandroid/view/ThreadedRenderer;->draw(Landroid/view/View;Landroid/view/View$AttachInfo;Landroid/view/ThreadedRenderer$DrawCallbacks;)V+]Landroid/view/ViewFrameInfo;Landroid/view/ViewFrameInfo;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;
-HSPLandroid/view/ThreadedRenderer;->dumpArgsToFlags([Ljava/lang/String;)I
-HSPLandroid/view/ThreadedRenderer;->getHeight()I
-HSPLandroid/view/ThreadedRenderer;->getWidth()I
-HSPLandroid/view/ThreadedRenderer;->handleDumpGfxInfo(Ljava/io/FileDescriptor;[Ljava/lang/String;)V
-HSPLandroid/view/ThreadedRenderer;->initialize(Landroid/view/Surface;)Z
-HSPLandroid/view/ThreadedRenderer;->initializeIfNeeded(IILandroid/view/View$AttachInfo;Landroid/view/Surface;Landroid/graphics/Rect;)Z
-HSPLandroid/view/ThreadedRenderer;->invalidateRoot()V
-HSPLandroid/view/ThreadedRenderer;->isEnabled()Z
-HSPLandroid/view/ThreadedRenderer;->isRequested()Z
-HSPLandroid/view/ThreadedRenderer;->loadSystemProperties()Z
-HSPLandroid/view/ThreadedRenderer;->registerRtFrameCallback(Landroid/graphics/HardwareRenderer$FrameDrawingCallback;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ThreadedRenderer;->rendererOwnsSurfaceControlOpacity()Z
-HSPLandroid/view/ThreadedRenderer;->setEnabled(Z)V
-HSPLandroid/view/ThreadedRenderer;->setLightCenter(Landroid/view/View$AttachInfo;)V
-HSPLandroid/view/ThreadedRenderer;->setRequested(Z)V
-HSPLandroid/view/ThreadedRenderer;->setSurface(Landroid/view/Surface;)V
-HSPLandroid/view/ThreadedRenderer;->setSurfaceControl(Landroid/view/SurfaceControl;Landroid/graphics/BLASTBufferQueue;)V+]Landroid/view/ThreadedRenderer$WebViewOverlayProvider;Landroid/view/ThreadedRenderer$WebViewOverlayProvider;
-HSPLandroid/view/ThreadedRenderer;->setSurfaceControlOpaque(Z)Z
-HSPLandroid/view/ThreadedRenderer;->setup(IILandroid/view/View$AttachInfo;Landroid/graphics/Rect;)V
-HSPLandroid/view/ThreadedRenderer;->updateEnabledState(Landroid/view/Surface;)V
-HSPLandroid/view/ThreadedRenderer;->updateRootDisplayList(Landroid/view/View;Landroid/view/ThreadedRenderer$DrawCallbacks;)V+]Landroid/view/View;Lcom/android/internal/policy/DecorView;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/view/ThreadedRenderer$DrawCallbacks;Landroid/view/ViewRootImpl;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;
-HSPLandroid/view/ThreadedRenderer;->updateSurface(Landroid/view/Surface;)V
-HSPLandroid/view/ThreadedRenderer;->updateViewTreeDisplayList(Landroid/view/View;)V+]Landroid/view/View;Lcom/android/internal/policy/DecorView;
-HSPLandroid/view/ThreadedRenderer;->updateWebViewOverlayCallbacks()V+]Landroid/view/ThreadedRenderer$WebViewOverlayProvider;Landroid/view/ThreadedRenderer$WebViewOverlayProvider;
-HSPLandroid/view/TouchDelegate;-><init>(Landroid/graphics/Rect;Landroid/view/View;)V
-HSPLandroid/view/VelocityTracker;-><init>(I)V
-HSPLandroid/view/VelocityTracker;->addMovement(Landroid/view/MotionEvent;)V
-HSPLandroid/view/VelocityTracker;->clear()V
-HSPLandroid/view/VelocityTracker;->computeCurrentVelocity(I)V
-HSPLandroid/view/VelocityTracker;->computeCurrentVelocity(IF)V
-HSPLandroid/view/VelocityTracker;->finalize()V
-HSPLandroid/view/VelocityTracker;->getXVelocity()F
-HSPLandroid/view/VelocityTracker;->getXVelocity(I)F
-HSPLandroid/view/VelocityTracker;->getYVelocity()F
-HSPLandroid/view/VelocityTracker;->getYVelocity(I)F
-HSPLandroid/view/VelocityTracker;->obtain()Landroid/view/VelocityTracker;
-HSPLandroid/view/VelocityTracker;->recycle()V
-HSPLandroid/view/View$$ExternalSyntheticLambda4;-><init>(Landroid/view/View;)V
-HSPLandroid/view/View$$ExternalSyntheticLambda4;->run()V
-HSPLandroid/view/View$$ExternalSyntheticLambda5;->run()V
-HSPLandroid/view/View$$ExternalSyntheticLambda7;-><init>(Landroid/view/View;)V
-HSPLandroid/view/View$$ExternalSyntheticLambda7;->run()V
-HSPLandroid/view/View$12;->get(Landroid/view/View;)Ljava/lang/Float;
-HSPLandroid/view/View$12;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/view/View$12;->setValue(Landroid/view/View;F)V
-HSPLandroid/view/View$12;->setValue(Ljava/lang/Object;F)V+]Landroid/view/View$12;Landroid/view/View$12;
-HSPLandroid/view/View$13;->get(Landroid/view/View;)Ljava/lang/Float;
-HSPLandroid/view/View$13;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/view/View$13;->setValue(Landroid/view/View;F)V
-HSPLandroid/view/View$13;->setValue(Ljava/lang/Object;F)V
-HSPLandroid/view/View$1;-><init>(Landroid/view/View;Landroid/view/View$ListenerInfo;)V
-HSPLandroid/view/View$1;->positionChanged(JIIII)V
-HSPLandroid/view/View$1;->positionLost(J)V
-HSPLandroid/view/View$2;->get(Landroid/view/View;)Ljava/lang/Float;
-HSPLandroid/view/View$2;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/view/View$2;->setValue(Landroid/view/View;F)V
-HSPLandroid/view/View$2;->setValue(Ljava/lang/Object;F)V
-HSPLandroid/view/View$3;->get(Landroid/view/View;)Ljava/lang/Float;
-HSPLandroid/view/View$3;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/view/View$3;->setValue(Landroid/view/View;F)V
-HSPLandroid/view/View$3;->setValue(Ljava/lang/Object;F)V
-HSPLandroid/view/View$4;->get(Landroid/view/View;)Ljava/lang/Float;
-HSPLandroid/view/View$4;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/view/View$4;->setValue(Landroid/view/View;F)V
-HSPLandroid/view/View$4;->setValue(Ljava/lang/Object;F)V
-HSPLandroid/view/View$5;->get(Landroid/view/View;)Ljava/lang/Float;
-HSPLandroid/view/View$5;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/view/View$5;->setValue(Landroid/view/View;F)V
-HSPLandroid/view/View$5;->setValue(Ljava/lang/Object;F)V
-HSPLandroid/view/View$AccessibilityDelegate;-><init>()V
-HSPLandroid/view/View$AccessibilityDelegate;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider;
-HSPLandroid/view/View$AccessibilityDelegate;->sendAccessibilityEvent(Landroid/view/View;I)V
-HSPLandroid/view/View$AttachInfo;-><init>(Landroid/view/IWindowSession;Landroid/view/IWindow;Landroid/view/Display;Landroid/view/ViewRootImpl;Landroid/os/Handler;Landroid/view/View$AttachInfo$Callbacks;Landroid/content/Context;)V
-HSPLandroid/view/View$AttachInfo;->delayNotifyContentCaptureInsetsEvent(Landroid/graphics/Insets;)V
-HSPLandroid/view/View$AttachInfo;->ensureEvents(Landroid/view/contentcapture/ContentCaptureSession;)Ljava/util/ArrayList;
-HSPLandroid/view/View$BaseSavedState$1;->createFromParcel(Landroid/os/Parcel;Ljava/lang/ClassLoader;)Landroid/view/View$BaseSavedState;
-HSPLandroid/view/View$BaseSavedState$1;->createFromParcel(Landroid/os/Parcel;Ljava/lang/ClassLoader;)Ljava/lang/Object;
-HSPLandroid/view/View$BaseSavedState;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/View$BaseSavedState;-><init>(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V
-HSPLandroid/view/View$BaseSavedState;-><init>(Landroid/os/Parcelable;)V
-HSPLandroid/view/View$BaseSavedState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/View$CheckForLongPress;->run()V
-HSPLandroid/view/View$CheckForTap;->run()V
-HSPLandroid/view/View$ForegroundInfo;->-$$Nest$fgetmInsidePadding(Landroid/view/View$ForegroundInfo;)Z
-HSPLandroid/view/View$ForegroundInfo;->-$$Nest$fputmInsidePadding(Landroid/view/View$ForegroundInfo;Z)V
-HSPLandroid/view/View$ForegroundInfo;-><init>()V
-HSPLandroid/view/View$ListenerInfo;->-$$Nest$fgetmHandwritingArea(Landroid/view/View$ListenerInfo;)Landroid/graphics/Rect;
-HSPLandroid/view/View$ListenerInfo;->-$$Nest$fgetmKeepClearRects(Landroid/view/View$ListenerInfo;)Ljava/util/List;
-HSPLandroid/view/View$ListenerInfo;->-$$Nest$fgetmPreferKeepClear(Landroid/view/View$ListenerInfo;)Z
-HSPLandroid/view/View$ListenerInfo;->-$$Nest$fgetmUnrestrictedKeepClearRects(Landroid/view/View$ListenerInfo;)Ljava/util/List;
-HSPLandroid/view/View$ListenerInfo;->-$$Nest$fputmHandwritingArea(Landroid/view/View$ListenerInfo;Landroid/graphics/Rect;)V
-HSPLandroid/view/View$ListenerInfo;->-$$Nest$fputmPositionChangedUpdate(Landroid/view/View$ListenerInfo;Ljava/lang/Runnable;)V
-HSPLandroid/view/View$ListenerInfo;-><init>()V
-HSPLandroid/view/View$MeasureSpec;->getMode(I)I
-HSPLandroid/view/View$MeasureSpec;->getSize(I)I
-HSPLandroid/view/View$MeasureSpec;->makeMeasureSpec(II)I
-HSPLandroid/view/View$MeasureSpec;->makeSafeMeasureSpec(II)I
-HSPLandroid/view/View$PerformClick;->run()V
-HSPLandroid/view/View$ScrollabilityCache;-><init>(Landroid/view/ViewConfiguration;Landroid/view/View;)V
-HSPLandroid/view/View$ScrollabilityCache;->run()V+]Landroid/graphics/Interpolator;Landroid/graphics/Interpolator;]Landroid/view/View;missing_types
-HSPLandroid/view/View$TintInfo;-><init>()V
-HSPLandroid/view/View$TransformationInfo;-><init>()V
-HSPLandroid/view/View$UnsetPressedState;->run()V
-HSPLandroid/view/View$VisibilityChangeForAutofillHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/view/View;-><init>(Landroid/content/Context;)V+]Landroid/view/View;missing_types]Ljava/lang/Object;missing_types]Landroid/content/Context;missing_types]Landroid/view/ViewConfiguration;Landroid/view/ViewConfiguration;]Ljava/lang/Class;Ljava/lang/Class;
-HSPLandroid/view/View;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/view/View;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/view/View;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V+]Landroid/view/View;missing_types]Landroid/content/Context;missing_types]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;
-HSPLandroid/view/View;->addFocusables(Ljava/util/ArrayList;I)V
-HSPLandroid/view/View;->addFocusables(Ljava/util/ArrayList;II)V
-HSPLandroid/view/View;->addFrameMetricsListener(Landroid/view/Window;Landroid/view/Window$OnFrameMetricsAvailableListener;Landroid/os/Handler;)V
-HSPLandroid/view/View;->addOnAttachStateChangeListener(Landroid/view/View$OnAttachStateChangeListener;)V
-HSPLandroid/view/View;->addOnLayoutChangeListener(Landroid/view/View$OnLayoutChangeListener;)V
-HSPLandroid/view/View;->animate()Landroid/view/ViewPropertyAnimator;
-HSPLandroid/view/View;->announceForAccessibility(Ljava/lang/CharSequence;)V
-HSPLandroid/view/View;->appendId(Ljava/lang/StringBuilder;)V
-HSPLandroid/view/View;->applyBackgroundTint()V
-HSPLandroid/view/View;->applyForegroundTint()V
-HSPLandroid/view/View;->applyInsets(Landroid/graphics/Rect;)V
-HSPLandroid/view/View;->applyLegacyAnimation(Landroid/view/ViewGroup;JLandroid/view/animation/Animation;Z)Z
-HSPLandroid/view/View;->areDrawablesResolved()Z
-HSPLandroid/view/View;->assignParent(Landroid/view/ViewParent;)V
-HSPLandroid/view/View;->awakenScrollBars()Z
-HSPLandroid/view/View;->awakenScrollBars(IZ)Z+]Landroid/os/Handler;Landroid/view/ViewRootImpl$ViewRootHandler;]Landroid/view/View;Landroid/widget/ImageView;,Landroid/widget/TextView;,Landroid/widget/LinearLayout;
-HSPLandroid/view/View;->bringToFront()V
-HSPLandroid/view/View;->buildDrawingCache(Z)V
-HSPLandroid/view/View;->buildDrawingCacheImpl(Z)V
-HSPLandroid/view/View;->buildLayer()V
-HSPLandroid/view/View;->calculateAccessibilityDataSensitive()V
-HSPLandroid/view/View;->calculateIsImportantForContentCapture()Z
-HSPLandroid/view/View;->canHaveDisplayList()Z
-HSPLandroid/view/View;->canNotifyAutofillEnterExitEvent()Z
-HSPLandroid/view/View;->canReceivePointerEvents()Z
-HSPLandroid/view/View;->canResolveLayoutDirection()Z+]Landroid/view/View;missing_types]Landroid/view/ViewParent;missing_types
-HSPLandroid/view/View;->canResolveTextDirection()Z+]Landroid/view/View;missing_types]Landroid/view/ViewParent;missing_types
-HSPLandroid/view/View;->canScrollHorizontally(I)Z
-HSPLandroid/view/View;->canScrollVertically(I)Z
-HSPLandroid/view/View;->canTakeFocus()Z
-HSPLandroid/view/View;->cancel(Landroid/view/View$SendAccessibilityEventThrottle;)V
-HSPLandroid/view/View;->cancelLongPress()V
-HSPLandroid/view/View;->cancelPendingInputEvents()V
-HSPLandroid/view/View;->checkForLongClick(JFFI)V
-HSPLandroid/view/View;->checkInputConnectionProxy(Landroid/view/View;)Z
-HSPLandroid/view/View;->cleanupDraw()V
-HSPLandroid/view/View;->clearAccessibilityFocus()V
-HSPLandroid/view/View;->clearAccessibilityFocusNoCallbacks(I)V
-HSPLandroid/view/View;->clearAccessibilityThrottles()V
-HSPLandroid/view/View;->clearAnimation()V
-HSPLandroid/view/View;->clearFocus()V
-HSPLandroid/view/View;->clearFocusInternal(Landroid/view/View;ZZ)V
-HSPLandroid/view/View;->clearParentsWantFocus()V
-HSPLandroid/view/View;->clearTranslationState()V
-HSPLandroid/view/View;->clearViewTranslationResponse()V
-HSPLandroid/view/View;->collectPreferKeepClearRects()Ljava/util/List;
-HSPLandroid/view/View;->collectUnrestrictedPreferKeepClearRects()Ljava/util/List;
-HSPLandroid/view/View;->combineMeasuredStates(II)I
-HSPLandroid/view/View;->combineVisibility(II)I
-HSPLandroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
-HSPLandroid/view/View;->computeHorizontalScrollExtent()I
-HSPLandroid/view/View;->computeHorizontalScrollOffset()I
-HSPLandroid/view/View;->computeHorizontalScrollRange()I
-HSPLandroid/view/View;->computeOpaqueFlags()V
-HSPLandroid/view/View;->computeScroll()V
-HSPLandroid/view/View;->computeSystemWindowInsets(Landroid/view/WindowInsets;Landroid/graphics/Rect;)Landroid/view/WindowInsets;
-HSPLandroid/view/View;->computeVerticalScrollExtent()I+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->computeVerticalScrollOffset()I
-HSPLandroid/view/View;->computeVerticalScrollRange()I+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->damageInParent()V
-HSPLandroid/view/View;->destroyDrawingCache()V
-HSPLandroid/view/View;->destroyHardwareResources()V
-HSPLandroid/view/View;->dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
-HSPLandroid/view/View;->dispatchAttachedToWindow(Landroid/view/View$AttachInfo;I)V+]Landroid/view/ViewTreeObserver;Landroid/view/ViewTreeObserver;]Landroid/view/View;missing_types]Landroid/view/HandlerActionQueue;Landroid/view/HandlerActionQueue;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;
-HSPLandroid/view/View;->dispatchCancelPendingInputEvents()V
-HSPLandroid/view/View;->dispatchCollectViewAttributes(Landroid/view/View$AttachInfo;I)V+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->dispatchConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/view/View;->dispatchDetachedFromWindow()V+]Landroid/view/View;missing_types]Ljava/util/List;Ljava/util/Collections$EmptyList;]Landroid/view/ImeFocusController;Landroid/view/ImeFocusController;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/View;->dispatchDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/view/View;->dispatchDrawableHotspotChanged(FF)V
-HSPLandroid/view/View;->dispatchFinishTemporaryDetach()V
-HSPLandroid/view/View;->dispatchInitialProvideContentCaptureStructure()V
-HSPLandroid/view/View;->dispatchKeyEvent(Landroid/view/KeyEvent;)Z
-HSPLandroid/view/View;->dispatchKeyEventPreIme(Landroid/view/KeyEvent;)Z
-HSPLandroid/view/View;->dispatchNestedFling(FFZ)Z
-HSPLandroid/view/View;->dispatchNestedPreFling(FF)Z
-HSPLandroid/view/View;->dispatchNestedPreScroll(II[I[I)Z
-HSPLandroid/view/View;->dispatchNestedScroll(IIII[I)Z
-HSPLandroid/view/View;->dispatchPointerEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/view/View;->dispatchProvideAutofillStructure(Landroid/view/ViewStructure;I)V
-HSPLandroid/view/View;->dispatchProvideContentCaptureStructure()V
-HSPLandroid/view/View;->dispatchProvideStructure(Landroid/view/ViewStructure;II)V
-HSPLandroid/view/View;->dispatchRestoreInstanceState(Landroid/util/SparseArray;)V
-HSPLandroid/view/View;->dispatchSaveInstanceState(Landroid/util/SparseArray;)V
-HSPLandroid/view/View;->dispatchScreenStateChanged(I)V
-HSPLandroid/view/View;->dispatchSetActivated(Z)V
-HSPLandroid/view/View;->dispatchSetPressed(Z)V
-HSPLandroid/view/View;->dispatchSetSelected(Z)V
-HSPLandroid/view/View;->dispatchStartTemporaryDetach()V
-HSPLandroid/view/View;->dispatchSystemUiVisibilityChanged(I)V
-HSPLandroid/view/View;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/view/View;->dispatchVisibilityAggregated(Z)Z+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->dispatchVisibilityChanged(Landroid/view/View;I)V
-HSPLandroid/view/View;->dispatchWindowFocusChanged(Z)V
-HSPLandroid/view/View;->dispatchWindowInsetsAnimationEnd(Landroid/view/WindowInsetsAnimation;)V
-HSPLandroid/view/View;->dispatchWindowSystemUiVisiblityChanged(I)V
-HSPLandroid/view/View;->dispatchWindowVisibilityChanged(I)V
-HSPLandroid/view/View;->draw(Landroid/graphics/Canvas;)V+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->draw(Landroid/graphics/Canvas;Landroid/view/ViewGroup;J)Z+]Landroid/view/View;missing_types]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;]Landroid/view/ViewGroup;Landroid/widget/FrameLayout;]Landroid/view/animation/Transformation;Landroid/view/animation/Transformation;]Landroid/view/animation/Animation;Landroid/view/animation/TranslateAnimation;,Landroid/view/animation/AlphaAnimation;
-HSPLandroid/view/View;->drawAutofilledHighlight(Landroid/graphics/Canvas;)V+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->drawBackground(Landroid/graphics/Canvas;)V+]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;
-HSPLandroid/view/View;->drawDefaultFocusHighlight(Landroid/graphics/Canvas;)V
-HSPLandroid/view/View;->drawableHotspotChanged(FF)V
-HSPLandroid/view/View;->drawableStateChanged()V+]Landroid/animation/StateListAnimator;Landroid/animation/StateListAnimator;]Landroid/view/View;missing_types]Landroid/graphics/drawable/Drawable;Landroid/widget/ScrollBarDrawable;,Landroid/graphics/drawable/RippleDrawable;,Landroid/graphics/drawable/InsetDrawable;,Landroid/graphics/drawable/StateListDrawable;,Landroid/graphics/drawable/ColorDrawable;
-HSPLandroid/view/View;->drawsWithRenderNode(Landroid/graphics/Canvas;)Z+]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;
-HSPLandroid/view/View;->ensureTransformationInfo()V
-HSPLandroid/view/View;->findAccessibilityFocusHost(Z)Landroid/view/View;
-HSPLandroid/view/View;->findFocus()Landroid/view/View;
-HSPLandroid/view/View;->findFrameMetricsObserver(Landroid/view/Window$OnFrameMetricsAvailableListener;)Landroid/view/FrameMetricsObserver;
-HSPLandroid/view/View;->findKeyboardNavigationCluster()Landroid/view/View;
-HSPLandroid/view/View;->findOnBackInvokedDispatcher()Landroid/window/OnBackInvokedDispatcher;
-HSPLandroid/view/View;->findUserSetNextFocus(Landroid/view/View;I)Landroid/view/View;
-HSPLandroid/view/View;->findViewByAutofillIdTraversal(I)Landroid/view/View;
-HSPLandroid/view/View;->findViewById(I)Landroid/view/View;
-HSPLandroid/view/View;->findViewTraversal(I)Landroid/view/View;
-HSPLandroid/view/View;->findViewWithTag(Ljava/lang/Object;)Landroid/view/View;
-HSPLandroid/view/View;->findViewWithTagTraversal(Ljava/lang/Object;)Landroid/view/View;
-HSPLandroid/view/View;->fitSystemWindows(Landroid/graphics/Rect;)Z
-HSPLandroid/view/View;->fitSystemWindowsInt(Landroid/graphics/Rect;)Z
-HSPLandroid/view/View;->focusSearch(I)Landroid/view/View;
-HSPLandroid/view/View;->forceLayout()V
-HSPLandroid/view/View;->gatherTransparentRegion(Landroid/graphics/Region;)Z
-HSPLandroid/view/View;->generateViewId()I
-HSPLandroid/view/View;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLandroid/view/View;->getAccessibilityDelegate()Landroid/view/View$AccessibilityDelegate;
-HSPLandroid/view/View;->getAccessibilityLiveRegion()I
-HSPLandroid/view/View;->getAccessibilityNodeProvider()Landroid/view/accessibility/AccessibilityNodeProvider;
-HSPLandroid/view/View;->getAccessibilityViewId()I
-HSPLandroid/view/View;->getAlpha()F
-HSPLandroid/view/View;->getAndCacheContentCaptureSession()Landroid/view/contentcapture/ContentCaptureSession;
-HSPLandroid/view/View;->getAnimation()Landroid/view/animation/Animation;
-HSPLandroid/view/View;->getApplicationWindowToken()Landroid/os/IBinder;
-HSPLandroid/view/View;->getAutofillHints()[Ljava/lang/String;
-HSPLandroid/view/View;->getAutofillId()Landroid/view/autofill/AutofillId;
-HSPLandroid/view/View;->getAutofillType()I
-HSPLandroid/view/View;->getAutofillViewId()I
-HSPLandroid/view/View;->getBackground()Landroid/graphics/drawable/Drawable;
-HSPLandroid/view/View;->getBaseline()I
-HSPLandroid/view/View;->getBottom()I
-HSPLandroid/view/View;->getBoundsOnScreen(Landroid/graphics/Rect;)V
-HSPLandroid/view/View;->getBoundsOnScreen(Landroid/graphics/Rect;Z)V
-HSPLandroid/view/View;->getClipBounds()Landroid/graphics/Rect;
-HSPLandroid/view/View;->getClipToOutline()Z
-HSPLandroid/view/View;->getContentCaptureSession()Landroid/view/contentcapture/ContentCaptureSession;
-HSPLandroid/view/View;->getContentDescription()Ljava/lang/CharSequence;
-HSPLandroid/view/View;->getContext()Landroid/content/Context;
-HSPLandroid/view/View;->getDefaultSize(II)I
-HSPLandroid/view/View;->getDisplay()Landroid/view/Display;
-HSPLandroid/view/View;->getDrawableRenderNode(Landroid/graphics/drawable/Drawable;Landroid/graphics/RenderNode;)Landroid/graphics/RenderNode;+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/drawable/Drawable;missing_types]Ljava/lang/Object;missing_types]Ljava/lang/Class;Ljava/lang/Class;
-HSPLandroid/view/View;->getDrawableState()[I+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->getDrawingCache(Z)Landroid/graphics/Bitmap;
-HSPLandroid/view/View;->getDrawingRect(Landroid/graphics/Rect;)V
-HSPLandroid/view/View;->getDrawingTime()J
-HSPLandroid/view/View;->getElevation()F
-HSPLandroid/view/View;->getFilterTouchesWhenObscured()Z
-HSPLandroid/view/View;->getFinalAlpha()F
-HSPLandroid/view/View;->getFitsSystemWindows()Z
-HSPLandroid/view/View;->getFocusable()I
-HSPLandroid/view/View;->getFocusableAttribute(Landroid/content/res/TypedArray;)I
-HSPLandroid/view/View;->getFocusedRect(Landroid/graphics/Rect;)V
-HSPLandroid/view/View;->getForeground()Landroid/graphics/drawable/Drawable;
-HSPLandroid/view/View;->getForegroundGravity()I
-HSPLandroid/view/View;->getGlobalVisibleRect(Landroid/graphics/Rect;)Z
-HSPLandroid/view/View;->getGlobalVisibleRect(Landroid/graphics/Rect;Landroid/graphics/Point;)Z
-HSPLandroid/view/View;->getHandler()Landroid/os/Handler;
-HSPLandroid/view/View;->getHasOverlappingRendering()Z+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->getHeight()I
-HSPLandroid/view/View;->getHitRect(Landroid/graphics/Rect;)V
-HSPLandroid/view/View;->getHorizontalFadingEdgeLength()I
-HSPLandroid/view/View;->getHorizontalScrollBarBounds(Landroid/graphics/Rect;Landroid/graphics/Rect;)V
-HSPLandroid/view/View;->getHorizontalScrollbarHeight()I
-HSPLandroid/view/View;->getId()I
-HSPLandroid/view/View;->getImportantForAccessibility()I
-HSPLandroid/view/View;->getImportantForAutofill()I
-HSPLandroid/view/View;->getImportantForContentCapture()I
-HSPLandroid/view/View;->getInverseMatrix()Landroid/graphics/Matrix;
-HSPLandroid/view/View;->getKeyDispatcherState()Landroid/view/KeyEvent$DispatcherState;
-HSPLandroid/view/View;->getLayerType()I
-HSPLandroid/view/View;->getLayoutDirection()I+]Landroid/view/View;missing_types]Landroid/content/Context;missing_types
-HSPLandroid/view/View;->getLayoutParams()Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/view/View;->getLeft()I
-HSPLandroid/view/View;->getListenerInfo()Landroid/view/View$ListenerInfo;
-HSPLandroid/view/View;->getLocalVisibleRect(Landroid/graphics/Rect;)Z
-HSPLandroid/view/View;->getLocationInSurface([I)V
-HSPLandroid/view/View;->getLocationInWindow([I)V+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->getLocationOnScreen()[I
-HSPLandroid/view/View;->getLocationOnScreen([I)V+]Landroid/view/View;missing_types]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;
-HSPLandroid/view/View;->getMatrix()Landroid/graphics/Matrix;+]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/view/View;->getMeasuredHeight()I
-HSPLandroid/view/View;->getMeasuredState()I
-HSPLandroid/view/View;->getMeasuredWidth()I
-HSPLandroid/view/View;->getMeasuredWidthAndState()I
-HSPLandroid/view/View;->getMinimumHeight()I
-HSPLandroid/view/View;->getMinimumWidth()I
-HSPLandroid/view/View;->getNotifiedContentCaptureAppeared()Z
-HSPLandroid/view/View;->getOutlineProvider()Landroid/view/ViewOutlineProvider;
-HSPLandroid/view/View;->getOverScrollMode()I
-HSPLandroid/view/View;->getPaddingBottom()I
-HSPLandroid/view/View;->getPaddingEnd()I
-HSPLandroid/view/View;->getPaddingLeft()I
-HSPLandroid/view/View;->getPaddingRight()I
-HSPLandroid/view/View;->getPaddingStart()I
-HSPLandroid/view/View;->getPaddingTop()I
-HSPLandroid/view/View;->getParent()Landroid/view/ViewParent;
-HSPLandroid/view/View;->getPivotX()F
-HSPLandroid/view/View;->getPivotY()F
-HSPLandroid/view/View;->getProjectionReceiver()Landroid/view/View;
-HSPLandroid/view/View;->getRawLayoutDirection()I
-HSPLandroid/view/View;->getRawTextAlignment()I
-HSPLandroid/view/View;->getRawTextDirection()I
-HSPLandroid/view/View;->getReceiveContentMimeTypes()[Ljava/lang/String;
-HSPLandroid/view/View;->getResources()Landroid/content/res/Resources;
-HSPLandroid/view/View;->getRight()I
-HSPLandroid/view/View;->getRootView()Landroid/view/View;
-HSPLandroid/view/View;->getRootWindowInsets()Landroid/view/WindowInsets;
-HSPLandroid/view/View;->getRotation()F
-HSPLandroid/view/View;->getRotationX()F
-HSPLandroid/view/View;->getRotationY()F
-HSPLandroid/view/View;->getRunQueue()Landroid/view/HandlerActionQueue;
-HSPLandroid/view/View;->getScaleX()F+]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/view/View;->getScaleY()F+]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/view/View;->getScrollX()I
-HSPLandroid/view/View;->getScrollY()I
-HSPLandroid/view/View;->getSolidColor()I
-HSPLandroid/view/View;->getStateListAnimator()Landroid/animation/StateListAnimator;
-HSPLandroid/view/View;->getStraightVerticalScrollBarBounds(Landroid/graphics/Rect;Landroid/graphics/Rect;)V+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->getSuggestedMinimumHeight()I+]Landroid/graphics/drawable/Drawable;missing_types
-HSPLandroid/view/View;->getSuggestedMinimumWidth()I+]Landroid/graphics/drawable/Drawable;missing_types
-HSPLandroid/view/View;->getSystemGestureExclusionRects()Ljava/util/List;
-HSPLandroid/view/View;->getSystemUiVisibility()I
-HSPLandroid/view/View;->getTag()Ljava/lang/Object;
-HSPLandroid/view/View;->getTag(I)Ljava/lang/Object;
-HSPLandroid/view/View;->getTextAlignment()I
-HSPLandroid/view/View;->getTextDirection()I
-HSPLandroid/view/View;->getThreadedRenderer()Landroid/view/ThreadedRenderer;
-HSPLandroid/view/View;->getTop()I
-HSPLandroid/view/View;->getTransitionAlpha()F
-HSPLandroid/view/View;->getTransitionName()Ljava/lang/String;
-HSPLandroid/view/View;->getTranslationX()F
-HSPLandroid/view/View;->getTranslationY()F+]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/view/View;->getTranslationZ()F
-HSPLandroid/view/View;->getVerticalFadingEdgeLength()I
-HSPLandroid/view/View;->getVerticalScrollbarWidth()I+]Landroid/widget/ScrollBarDrawable;Landroid/widget/ScrollBarDrawable;
-HSPLandroid/view/View;->getViewRootImpl()Landroid/view/ViewRootImpl;
-HSPLandroid/view/View;->getViewTranslationCallback()Landroid/view/translation/ViewTranslationCallback;
-HSPLandroid/view/View;->getViewTreeObserver()Landroid/view/ViewTreeObserver;
-HSPLandroid/view/View;->getVisibility()I
-HSPLandroid/view/View;->getWidth()I
-HSPLandroid/view/View;->getWindowAttachCount()I
-HSPLandroid/view/View;->getWindowId()Landroid/view/WindowId;
-HSPLandroid/view/View;->getWindowInsetsController()Landroid/view/WindowInsetsController;+]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;
-HSPLandroid/view/View;->getWindowSystemUiVisibility()I
-HSPLandroid/view/View;->getWindowToken()Landroid/os/IBinder;
-HSPLandroid/view/View;->getWindowVisibility()I
-HSPLandroid/view/View;->getWindowVisibleDisplayFrame(Landroid/graphics/Rect;)V
-HSPLandroid/view/View;->getX()F
-HSPLandroid/view/View;->getY()F
-HSPLandroid/view/View;->getZ()F
-HSPLandroid/view/View;->handleFocusGainInternal(ILandroid/graphics/Rect;)V
-HSPLandroid/view/View;->handleScrollBarDragging(Landroid/view/MotionEvent;)Z
-HSPLandroid/view/View;->hasAncestorThatBlocksDescendantFocus()Z
-HSPLandroid/view/View;->hasDefaultFocus()Z
-HSPLandroid/view/View;->hasExplicitFocusable()Z
-HSPLandroid/view/View;->hasFocus()Z
-HSPLandroid/view/View;->hasFocusable()Z
-HSPLandroid/view/View;->hasFocusable(ZZ)Z
-HSPLandroid/view/View;->hasIdentityMatrix()Z+]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/view/View;->hasImeFocus()Z
-HSPLandroid/view/View;->hasListenersForAccessibility()Z
-HSPLandroid/view/View;->hasNestedScrollingParent()Z
-HSPLandroid/view/View;->hasOnClickListeners()Z
-HSPLandroid/view/View;->hasOverlappingRendering()Z
-HSPLandroid/view/View;->hasRtlSupport()Z
-HSPLandroid/view/View;->hasSize()Z
-HSPLandroid/view/View;->hasTransientState()Z
-HSPLandroid/view/View;->hasTranslationTransientState()Z
-HSPLandroid/view/View;->hasUnhandledKeyListener()Z
-HSPLandroid/view/View;->hasWindowFocus()Z
-HSPLandroid/view/View;->hasWindowInsetsAnimationCallback()Z
-HSPLandroid/view/View;->hideAutofillHighlight()Z
-HSPLandroid/view/View;->hideTooltip()V
-HSPLandroid/view/View;->includeForAccessibility()Z
-HSPLandroid/view/View;->includeForAccessibility(Z)Z
-HSPLandroid/view/View;->inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;
-HSPLandroid/view/View;->initScrollCache()V
-HSPLandroid/view/View;->initialAwakenScrollBars()Z+]Landroid/view/View;Landroid/widget/ScrollView;
-HSPLandroid/view/View;->initializeFadingEdgeInternal(Landroid/content/res/TypedArray;)V
-HSPLandroid/view/View;->initializeScrollIndicatorsInternal()V
-HSPLandroid/view/View;->initializeScrollbarsInternal(Landroid/content/res/TypedArray;)V
-HSPLandroid/view/View;->internalSetPadding(IIII)V
-HSPLandroid/view/View;->invalidate()V+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->invalidate(IIII)V+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->invalidate(Landroid/graphics/Rect;)V+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->invalidate(Z)V+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V+]Landroid/view/View;missing_types]Landroid/graphics/drawable/Drawable;missing_types
-HSPLandroid/view/View;->invalidateInternal(IIIIZZ)V+]Landroid/view/View;megamorphic_types]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewParent;missing_types]Landroid/graphics/drawable/Drawable;missing_types
-HSPLandroid/view/View;->invalidateOutline()V
-HSPLandroid/view/View;->invalidateParentCaches()V
-HSPLandroid/view/View;->invalidateParentIfNeeded()V
-HSPLandroid/view/View;->invalidateParentIfNeededAndWasQuickRejected()V
-HSPLandroid/view/View;->invalidateViewProperty(ZZ)V
-HSPLandroid/view/View;->isAccessibilityFocused()Z
-HSPLandroid/view/View;->isAccessibilityFocusedViewOrHost()Z
-HSPLandroid/view/View;->isAccessibilityPane()Z
-HSPLandroid/view/View;->isActionableForAccessibility()Z
-HSPLandroid/view/View;->isActivated()Z
-HSPLandroid/view/View;->isAggregatedVisible()Z
-HSPLandroid/view/View;->isAttachedToWindow()Z
-HSPLandroid/view/View;->isAutoHandwritingEnabled()Z
-HSPLandroid/view/View;->isAutofillable()Z+]Landroid/view/View;missing_types]Landroid/view/autofill/AutofillManager;Landroid/view/autofill/AutofillManager;
-HSPLandroid/view/View;->isAutofilled()Z
-HSPLandroid/view/View;->isClickable()Z
-HSPLandroid/view/View;->isContextClickable()Z
-HSPLandroid/view/View;->isCredential()Z
-HSPLandroid/view/View;->isDefaultFocusHighlightNeeded(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)Z
-HSPLandroid/view/View;->isEnabled()Z
-HSPLandroid/view/View;->isFocusable()Z
-HSPLandroid/view/View;->isFocusableInTouchMode()Z
-HSPLandroid/view/View;->isFocused()Z
-HSPLandroid/view/View;->isFocusedByDefault()Z
-HSPLandroid/view/View;->isForegroundInsidePadding()Z
-HSPLandroid/view/View;->isFrameworkOptionalFitsSystemWindows()Z
-HSPLandroid/view/View;->isHapticFeedbackEnabled()Z
-HSPLandroid/view/View;->isHardwareAccelerated()Z
-HSPLandroid/view/View;->isHorizontalFadingEdgeEnabled()Z
-HSPLandroid/view/View;->isHorizontalScrollBarEnabled()Z
-HSPLandroid/view/View;->isImportantForAccessibility()Z
-HSPLandroid/view/View;->isImportantForAutofill()Z+]Landroid/view/View;missing_types]Landroid/view/ViewParent;missing_types
-HSPLandroid/view/View;->isImportantForContentCapture()Z
-HSPLandroid/view/View;->isInEditMode()Z
-HSPLandroid/view/View;->isInLayout()Z
-HSPLandroid/view/View;->isInScrollingContainer()Z
-HSPLandroid/view/View;->isInTouchMode()Z
-HSPLandroid/view/View;->isKeyboardNavigationCluster()Z
-HSPLandroid/view/View;->isLaidOut()Z
-HSPLandroid/view/View;->isLayoutDirectionInherited()Z
-HSPLandroid/view/View;->isLayoutDirectionResolved()Z
-HSPLandroid/view/View;->isLayoutModeOptical(Ljava/lang/Object;)Z+]Landroid/view/ViewGroup;missing_types
-HSPLandroid/view/View;->isLayoutRequested()Z
-HSPLandroid/view/View;->isLayoutRtl()Z
-HSPLandroid/view/View;->isLayoutValid()Z+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->isLongClickable()Z
-HSPLandroid/view/View;->isNestedScrollingEnabled()Z
-HSPLandroid/view/View;->isOpaque()Z
-HSPLandroid/view/View;->isPaddingResolved()Z
-HSPLandroid/view/View;->isPressed()Z
-HSPLandroid/view/View;->isProjectionReceiver()Z
-HSPLandroid/view/View;->isRootNamespace()Z
-HSPLandroid/view/View;->isRtlCompatibilityMode()Z
-HSPLandroid/view/View;->isSelected()Z
-HSPLandroid/view/View;->isShowingLayoutBounds()Z
-HSPLandroid/view/View;->isShown()Z
-HSPLandroid/view/View;->isSoundEffectsEnabled()Z
-HSPLandroid/view/View;->isTemporarilyDetached()Z
-HSPLandroid/view/View;->isTextAlignmentInherited()Z
-HSPLandroid/view/View;->isTextAlignmentResolved()Z
-HSPLandroid/view/View;->isTextDirectionInherited()Z
-HSPLandroid/view/View;->isTextDirectionResolved()Z
-HSPLandroid/view/View;->isVerticalFadingEdgeEnabled()Z
-HSPLandroid/view/View;->isVerticalScrollBarEnabled()Z
-HSPLandroid/view/View;->isVerticalScrollBarHidden()Z
-HSPLandroid/view/View;->isViewIdGenerated(I)Z
-HSPLandroid/view/View;->isVisibleToUser()Z
-HSPLandroid/view/View;->isVisibleToUser(Landroid/graphics/Rect;)Z
-HSPLandroid/view/View;->jumpDrawablesToCurrentState()V
-HSPLandroid/view/View;->layout(IIII)V+]Landroid/view/View;missing_types]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/View;->makeFrameworkOptionalFitsSystemWindows()V
-HSPLandroid/view/View;->makeOptionalFitsSystemWindows()V
-HSPLandroid/view/View;->mapRectFromViewToScreenCoords(Landroid/graphics/RectF;Z)V
-HSPLandroid/view/View;->mapRectFromViewToWindowCoords(Landroid/graphics/RectF;Z)V
-HSPLandroid/view/View;->measure(II)V+]Landroid/view/View;megamorphic_types]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;
-HSPLandroid/view/View;->mergeDrawableStates([I[I)[I
-HSPLandroid/view/View;->needGlobalAttributesUpdate(Z)V
-HSPLandroid/view/View;->needRtlPropertiesResolution()Z
-HSPLandroid/view/View;->notifyAppearedOrDisappearedForContentCaptureIfNeeded(Z)V
-HSPLandroid/view/View;->notifyAutofillManagerOnClick()V
-HSPLandroid/view/View;->notifyEnterOrExitForAutoFillIfNeeded(Z)V
-HSPLandroid/view/View;->notifyGlobalFocusCleared(Landroid/view/View;)V
-HSPLandroid/view/View;->notifySubtreeAccessibilityStateChangedByParentIfNeeded()V
-HSPLandroid/view/View;->notifySubtreeAccessibilityStateChangedIfNeeded()V
-HSPLandroid/view/View;->notifyViewAccessibilityStateChangedIfNeeded(I)V
-HSPLandroid/view/View;->offsetLeftAndRight(I)V
-HSPLandroid/view/View;->offsetTopAndBottom(I)V
-HSPLandroid/view/View;->onAnimationEnd()V
-HSPLandroid/view/View;->onAnimationStart()V
-HSPLandroid/view/View;->onApplyFrameworkOptionalFitSystemWindows(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
-HSPLandroid/view/View;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
-HSPLandroid/view/View;->onAttachedToWindow()V+]Landroid/view/accessibility/AccessibilityNodeIdManager;Landroid/view/accessibility/AccessibilityNodeIdManager;]Landroid/view/View;missing_types
-HSPLandroid/view/View;->onCancelPendingInputEvents()V
-HSPLandroid/view/View;->onCheckIsTextEditor()Z
-HSPLandroid/view/View;->onCloseSystemDialogs(Ljava/lang/String;)V
-HSPLandroid/view/View;->onConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/view/View;->onCreateDrawableState(I)[I+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection;
-HSPLandroid/view/View;->onDetachedFromWindow()V
-HSPLandroid/view/View;->onDetachedFromWindowInternal()V+]Landroid/view/accessibility/AccessibilityNodeIdManager;Landroid/view/accessibility/AccessibilityNodeIdManager;]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/view/View;->onDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/view/View;->onDrawForeground(Landroid/graphics/Canvas;)V+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->onDrawHorizontalScrollBar(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIII)V
-HSPLandroid/view/View;->onDrawScrollBars(Landroid/graphics/Canvas;)V+]Landroid/graphics/Interpolator;Landroid/graphics/Interpolator;]Landroid/view/View;missing_types]Landroid/widget/ScrollBarDrawable;Landroid/widget/ScrollBarDrawable;
-HSPLandroid/view/View;->onDrawScrollIndicators(Landroid/graphics/Canvas;)V
-HSPLandroid/view/View;->onDrawVerticalScrollBar(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIII)V+]Landroid/graphics/drawable/Drawable;Landroid/widget/ScrollBarDrawable;
-HSPLandroid/view/View;->onFilterTouchEventForSecurity(Landroid/view/MotionEvent;)Z
-HSPLandroid/view/View;->onFinishInflate()V
-HSPLandroid/view/View;->onFinishTemporaryDetach()V
-HSPLandroid/view/View;->onFocusChanged(ZILandroid/graphics/Rect;)V
-HSPLandroid/view/View;->onFocusLost()V
-HSPLandroid/view/View;->onKeyDown(ILandroid/view/KeyEvent;)Z
-HSPLandroid/view/View;->onKeyPreIme(ILandroid/view/KeyEvent;)Z
-HSPLandroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z
-HSPLandroid/view/View;->onLayout(ZIIII)V
-HSPLandroid/view/View;->onMeasure(II)V+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->onProvideAutofillStructure(Landroid/view/ViewStructure;I)V
-HSPLandroid/view/View;->onProvideAutofillVirtualStructure(Landroid/view/ViewStructure;I)V
-HSPLandroid/view/View;->onProvideContentCaptureStructure(Landroid/view/ViewStructure;I)V
-HSPLandroid/view/View;->onProvideStructure(Landroid/view/ViewStructure;II)V
-HSPLandroid/view/View;->onResolveDrawables(I)V
-HSPLandroid/view/View;->onRestoreInstanceState(Landroid/os/Parcelable;)V
-HSPLandroid/view/View;->onRtlPropertiesChanged(I)V
-HSPLandroid/view/View;->onSaveInstanceState()Landroid/os/Parcelable;
-HSPLandroid/view/View;->onScreenStateChanged(I)V
-HSPLandroid/view/View;->onScrollChanged(IIII)V
-HSPLandroid/view/View;->onSetAlpha(I)Z
-HSPLandroid/view/View;->onSizeChanged(IIII)V
-HSPLandroid/view/View;->onStartTemporaryDetach()V
-HSPLandroid/view/View;->onTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/view/View;->onVisibilityAggregated(Z)V+]Landroid/view/View;megamorphic_types]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Landroid/graphics/drawable/Drawable;missing_types
-HSPLandroid/view/View;->onVisibilityChanged(Landroid/view/View;I)V
-HSPLandroid/view/View;->onWindowFocusChanged(Z)V
-HSPLandroid/view/View;->onWindowSystemUiVisibilityChanged(I)V
-HSPLandroid/view/View;->onWindowVisibilityChanged(I)V
-HSPLandroid/view/View;->overScrollBy(IIIIIIIIZ)Z
-HSPLandroid/view/View;->performButtonActionOnTouchDown(Landroid/view/MotionEvent;)Z
-HSPLandroid/view/View;->performClick()Z
-HSPLandroid/view/View;->performCollectViewAttributes(Landroid/view/View$AttachInfo;I)V
-HSPLandroid/view/View;->performHapticFeedback(I)Z
-HSPLandroid/view/View;->performHapticFeedback(II)Z
-HSPLandroid/view/View;->performLongClick()Z
-HSPLandroid/view/View;->performLongClick(FF)Z
-HSPLandroid/view/View;->performLongClickInternal(FF)Z
-HSPLandroid/view/View;->playSoundEffect(I)V
-HSPLandroid/view/View;->pointInView(FF)Z
-HSPLandroid/view/View;->pointInView(FFF)Z
-HSPLandroid/view/View;->post(Ljava/lang/Runnable;)Z
-HSPLandroid/view/View;->postDelayed(Ljava/lang/Runnable;J)Z
-HSPLandroid/view/View;->postInvalidate()V
-HSPLandroid/view/View;->postInvalidateDelayed(J)V
-HSPLandroid/view/View;->postInvalidateOnAnimation()V+]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;
-HSPLandroid/view/View;->postOnAnimation(Ljava/lang/Runnable;)V
-HSPLandroid/view/View;->postOnAnimationDelayed(Ljava/lang/Runnable;J)V
-HSPLandroid/view/View;->postSendViewScrolledAccessibilityEventCallback(II)V
-HSPLandroid/view/View;->postUpdate(Ljava/lang/Runnable;)V
-HSPLandroid/view/View;->rebuildOutline()V+]Landroid/view/ViewOutlineProvider;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;]Landroid/graphics/Outline;Landroid/graphics/Outline;
-HSPLandroid/view/View;->recomputePadding()V
-HSPLandroid/view/View;->refreshDrawableState()V
-HSPLandroid/view/View;->registerPendingFrameMetricsObservers()V
-HSPLandroid/view/View;->removeCallbacks(Ljava/lang/Runnable;)Z
-HSPLandroid/view/View;->removeFrameMetricsListener(Landroid/view/Window$OnFrameMetricsAvailableListener;)V
-HSPLandroid/view/View;->removeLongPressCallback()V
-HSPLandroid/view/View;->removeOnAttachStateChangeListener(Landroid/view/View$OnAttachStateChangeListener;)V
-HSPLandroid/view/View;->removeOnLayoutChangeListener(Landroid/view/View$OnLayoutChangeListener;)V
-HSPLandroid/view/View;->removePerformClickCallback()V
-HSPLandroid/view/View;->removeTapCallback()V
-HSPLandroid/view/View;->removeUnsetPressCallback()V
-HSPLandroid/view/View;->requestApplyInsets()V
-HSPLandroid/view/View;->requestFitSystemWindows()V
-HSPLandroid/view/View;->requestFocus()Z
-HSPLandroid/view/View;->requestFocus(I)Z
-HSPLandroid/view/View;->requestFocus(ILandroid/graphics/Rect;)Z
-HSPLandroid/view/View;->requestFocusNoSearch(ILandroid/graphics/Rect;)Z
-HSPLandroid/view/View;->requestLayout()V+]Landroid/view/View;missing_types]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;]Landroid/view/ViewParent;missing_types
-HSPLandroid/view/View;->requestRectangleOnScreen(Landroid/graphics/Rect;)Z
-HSPLandroid/view/View;->requestRectangleOnScreen(Landroid/graphics/Rect;Z)Z
-HSPLandroid/view/View;->requireViewById(I)Landroid/view/View;
-HSPLandroid/view/View;->resetDisplayList()V
-HSPLandroid/view/View;->resetPressedState()V
-HSPLandroid/view/View;->resetResolvedDrawables()V
-HSPLandroid/view/View;->resetResolvedDrawablesInternal()V
-HSPLandroid/view/View;->resetResolvedLayoutDirection()V
-HSPLandroid/view/View;->resetResolvedPadding()V
-HSPLandroid/view/View;->resetResolvedPaddingInternal()V
-HSPLandroid/view/View;->resetResolvedTextAlignment()V
-HSPLandroid/view/View;->resetResolvedTextDirection()V
-HSPLandroid/view/View;->resetRtlProperties()V
-HSPLandroid/view/View;->resetSubtreeAccessibilityStateChanged()V
-HSPLandroid/view/View;->resolveDrawables()V
-HSPLandroid/view/View;->resolveLayoutDirection()Z
-HSPLandroid/view/View;->resolveLayoutParams()V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup$LayoutParams;missing_types
-HSPLandroid/view/View;->resolvePadding()V+]Landroid/view/View;missing_types]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/InsetDrawable;,Landroid/graphics/drawable/RippleDrawable;,Landroid/graphics/drawable/ColorDrawable;
-HSPLandroid/view/View;->resolveRtlPropertiesIfNeeded()Z+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->resolveSize(II)I
-HSPLandroid/view/View;->resolveSizeAndState(III)I
-HSPLandroid/view/View;->resolveTextAlignment()Z
-HSPLandroid/view/View;->resolveTextDirection()Z
-HSPLandroid/view/View;->restoreHierarchyState(Landroid/util/SparseArray;)V
-HSPLandroid/view/View;->retrieveExplicitStyle(Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;)V
-HSPLandroid/view/View;->rootViewRequestFocus()Z
-HSPLandroid/view/View;->sanitizeFloatPropertyValue(FLjava/lang/String;)F
-HSPLandroid/view/View;->sanitizeFloatPropertyValue(FLjava/lang/String;FF)F
-HSPLandroid/view/View;->saveAttributeDataForStyleable(Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V
-HSPLandroid/view/View;->saveHierarchyState(Landroid/util/SparseArray;)V
-HSPLandroid/view/View;->scheduleDrawable(Landroid/graphics/drawable/Drawable;Ljava/lang/Runnable;J)V
-HSPLandroid/view/View;->scrollBy(II)V
-HSPLandroid/view/View;->scrollTo(II)V
-HSPLandroid/view/View;->sendAccessibilityEvent(I)V
-HSPLandroid/view/View;->sendAccessibilityEventInternal(I)V
-HSPLandroid/view/View;->setAccessibilityDelegate(Landroid/view/View$AccessibilityDelegate;)V
-HSPLandroid/view/View;->setAccessibilityHeading(Z)V
-HSPLandroid/view/View;->setAccessibilityLiveRegion(I)V
-HSPLandroid/view/View;->setAccessibilityPaneTitle(Ljava/lang/CharSequence;)V
-HSPLandroid/view/View;->setAccessibilityTraversalAfter(I)V
-HSPLandroid/view/View;->setAccessibilityTraversalBefore(I)V
-HSPLandroid/view/View;->setActivated(Z)V
-HSPLandroid/view/View;->setAlpha(F)V
-HSPLandroid/view/View;->setAlphaInternal(F)V
-HSPLandroid/view/View;->setAlphaNoInvalidation(F)Z
-HSPLandroid/view/View;->setAnimation(Landroid/view/animation/Animation;)V
-HSPLandroid/view/View;->setAutoHandwritingEnabled(Z)V
-HSPLandroid/view/View;->setAutofilled(ZZ)V
-HSPLandroid/view/View;->setBackground(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/view/View;->setBackgroundBounds()V+]Landroid/graphics/drawable/Drawable;missing_types
-HSPLandroid/view/View;->setBackgroundColor(I)V
-HSPLandroid/view/View;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V+]Landroid/view/View;missing_types]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable;,Landroid/graphics/drawable/RippleDrawable;,Landroid/graphics/drawable/ColorDrawable;
-HSPLandroid/view/View;->setBackgroundRenderNodeProperties(Landroid/graphics/RenderNode;)V+]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/view/View;->setBackgroundResource(I)V
-HSPLandroid/view/View;->setBackgroundTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/view/View;->setBottom(I)V
-HSPLandroid/view/View;->setClickable(Z)V
-HSPLandroid/view/View;->setClipBounds(Landroid/graphics/Rect;)V
-HSPLandroid/view/View;->setClipToOutline(Z)V
-HSPLandroid/view/View;->setContentDescription(Ljava/lang/CharSequence;)V
-HSPLandroid/view/View;->setDefaultFocusHighlightEnabled(Z)V
-HSPLandroid/view/View;->setDetached(Z)V
-HSPLandroid/view/View;->setDisplayListProperties(Landroid/graphics/RenderNode;)V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/view/View;->setDrawingCacheEnabled(Z)V
-HSPLandroid/view/View;->setElevation(F)V
-HSPLandroid/view/View;->setEnabled(Z)V
-HSPLandroid/view/View;->setFitsSystemWindows(Z)V
-HSPLandroid/view/View;->setFlags(II)V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types]Landroid/view/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager;]Landroid/view/ViewParent;missing_types
-HSPLandroid/view/View;->setFocusable(I)V
-HSPLandroid/view/View;->setFocusable(Z)V
-HSPLandroid/view/View;->setFocusableInTouchMode(Z)V
-HSPLandroid/view/View;->setForeground(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/view/View;->setForegroundGravity(I)V
-HSPLandroid/view/View;->setFrame(IIII)Z+]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/view/View;->setHandwritingArea(Landroid/graphics/Rect;)V
-HSPLandroid/view/View;->setHapticFeedbackEnabled(Z)V
-HSPLandroid/view/View;->setHasTransientState(Z)V
-HSPLandroid/view/View;->setHorizontalFadingEdgeEnabled(Z)V
-HSPLandroid/view/View;->setHorizontalScrollBarEnabled(Z)V
-HSPLandroid/view/View;->setId(I)V
-HSPLandroid/view/View;->setImportantForAccessibility(I)V
-HSPLandroid/view/View;->setImportantForAutofill(I)V
-HSPLandroid/view/View;->setImportantForContentCapture(I)V
-HSPLandroid/view/View;->setIsRootNamespace(Z)V
-HSPLandroid/view/View;->setKeepScreenOn(Z)V
-HSPLandroid/view/View;->setKeyboardNavigationCluster(Z)V
-HSPLandroid/view/View;->setKeyedTag(ILjava/lang/Object;)V
-HSPLandroid/view/View;->setLayerPaint(Landroid/graphics/Paint;)V
-HSPLandroid/view/View;->setLayerType(ILandroid/graphics/Paint;)V
-HSPLandroid/view/View;->setLayoutDirection(I)V
-HSPLandroid/view/View;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;Lcom/android/internal/policy/DecorView;
-HSPLandroid/view/View;->setLeft(I)V
-HSPLandroid/view/View;->setLeftTopRightBottom(IIII)V
-HSPLandroid/view/View;->setLongClickable(Z)V
-HSPLandroid/view/View;->setMeasuredDimension(II)V
-HSPLandroid/view/View;->setMeasuredDimensionRaw(II)V
-HSPLandroid/view/View;->setMinimumHeight(I)V
-HSPLandroid/view/View;->setMinimumWidth(I)V
-HSPLandroid/view/View;->setNotifiedContentCaptureAppeared()V
-HSPLandroid/view/View;->setOnApplyWindowInsetsListener(Landroid/view/View$OnApplyWindowInsetsListener;)V
-HSPLandroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
-HSPLandroid/view/View;->setOnCreateContextMenuListener(Landroid/view/View$OnCreateContextMenuListener;)V
-HSPLandroid/view/View;->setOnDragListener(Landroid/view/View$OnDragListener;)V
-HSPLandroid/view/View;->setOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V
-HSPLandroid/view/View;->setOnHoverListener(Landroid/view/View$OnHoverListener;)V
-HSPLandroid/view/View;->setOnKeyListener(Landroid/view/View$OnKeyListener;)V
-HSPLandroid/view/View;->setOnLongClickListener(Landroid/view/View$OnLongClickListener;)V
-HSPLandroid/view/View;->setOnScrollChangeListener(Landroid/view/View$OnScrollChangeListener;)V
-HSPLandroid/view/View;->setOnSystemUiVisibilityChangeListener(Landroid/view/View$OnSystemUiVisibilityChangeListener;)V
-HSPLandroid/view/View;->setOnTouchListener(Landroid/view/View$OnTouchListener;)V
-HSPLandroid/view/View;->setOutlineAmbientShadowColor(I)V
-HSPLandroid/view/View;->setOutlineProvider(Landroid/view/ViewOutlineProvider;)V
-HSPLandroid/view/View;->setOutlineProviderFromAttribute(I)V
-HSPLandroid/view/View;->setOutlineSpotShadowColor(I)V
-HSPLandroid/view/View;->setOverScrollMode(I)V
-HSPLandroid/view/View;->setPadding(IIII)V
-HSPLandroid/view/View;->setPaddingRelative(IIII)V
-HSPLandroid/view/View;->setPivotX(F)V
-HSPLandroid/view/View;->setPivotY(F)V
-HSPLandroid/view/View;->setPointerIcon(Landroid/view/PointerIcon;)V
-HSPLandroid/view/View;->setPressed(Z)V
-HSPLandroid/view/View;->setRenderEffect(Landroid/graphics/RenderEffect;)V
-HSPLandroid/view/View;->setRight(I)V
-HSPLandroid/view/View;->setRotation(F)V
-HSPLandroid/view/View;->setRotationX(F)V
-HSPLandroid/view/View;->setRotationY(F)V
-HSPLandroid/view/View;->setSaveEnabled(Z)V
-HSPLandroid/view/View;->setSaveFromParentEnabled(Z)V
-HSPLandroid/view/View;->setScaleX(F)V+]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/view/View;->setScaleY(F)V+]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/view/View;->setScrollContainer(Z)V
-HSPLandroid/view/View;->setScrollIndicators(II)V
-HSPLandroid/view/View;->setScrollX(I)V
-HSPLandroid/view/View;->setScrollY(I)V
-HSPLandroid/view/View;->setSelected(Z)V
-HSPLandroid/view/View;->setStateDescription(Ljava/lang/CharSequence;)V
-HSPLandroid/view/View;->setStateListAnimator(Landroid/animation/StateListAnimator;)V
-HSPLandroid/view/View;->setSystemGestureExclusionRects(Ljava/util/List;)V
-HSPLandroid/view/View;->setSystemUiVisibility(I)V
-HSPLandroid/view/View;->setTag(ILjava/lang/Object;)V
-HSPLandroid/view/View;->setTag(Ljava/lang/Object;)V
-HSPLandroid/view/View;->setTagInternal(ILjava/lang/Object;)V
-HSPLandroid/view/View;->setTextAlignment(I)V
-HSPLandroid/view/View;->setTextDirection(I)V
-HSPLandroid/view/View;->setTooltipText(Ljava/lang/CharSequence;)V
-HSPLandroid/view/View;->setTop(I)V
-HSPLandroid/view/View;->setTouchDelegate(Landroid/view/TouchDelegate;)V
-HSPLandroid/view/View;->setTransitionAlpha(F)V
-HSPLandroid/view/View;->setTransitionName(Ljava/lang/String;)V
-HSPLandroid/view/View;->setTransitionVisibility(I)V
-HSPLandroid/view/View;->setTranslationX(F)V
-HSPLandroid/view/View;->setTranslationY(F)V
-HSPLandroid/view/View;->setTranslationZ(F)V+]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/view/View;->setVerticalScrollBarEnabled(Z)V
-HSPLandroid/view/View;->setVisibility(I)V
-HSPLandroid/view/View;->setWillNotDraw(Z)V
-HSPLandroid/view/View;->setX(F)V
-HSPLandroid/view/View;->setY(F)V
-HSPLandroid/view/View;->shouldDrawRoundScrollbar()Z+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;
-HSPLandroid/view/View;->sizeChange(IIII)V
-HSPLandroid/view/View;->skipInvalidate()Z+]Landroid/view/ViewGroup;missing_types
-HSPLandroid/view/View;->startAnimation(Landroid/view/animation/Animation;)V
-HSPLandroid/view/View;->startNestedScroll(I)Z
-HSPLandroid/view/View;->stopNestedScroll()V
-HSPLandroid/view/View;->switchDefaultFocusHighlight()V
-HSPLandroid/view/View;->toString()Ljava/lang/String;
-HSPLandroid/view/View;->transformFromViewToWindowSpace([I)V+]Landroid/view/View;missing_types
-HSPLandroid/view/View;->unFocus(Landroid/view/View;)V
-HSPLandroid/view/View;->unscheduleDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/view/View;->unscheduleDrawable(Landroid/graphics/drawable/Drawable;Ljava/lang/Runnable;)V
-HSPLandroid/view/View;->updateDisplayListIfDirty()Landroid/graphics/RenderNode;+]Landroid/view/View;megamorphic_types]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/view/View;->updateFocusedInCluster(Landroid/view/View;I)V
-HSPLandroid/view/View;->updateHandwritingArea()V
-HSPLandroid/view/View;->updateKeepClearRects()V
-HSPLandroid/view/View;->updateLocalSystemUiVisibility(II)Z
-HSPLandroid/view/View;->updatePflags3AndNotifyA11yIfChanged(IZ)V
-HSPLandroid/view/View;->updatePositionUpdateListener()V
-HSPLandroid/view/View;->updatePreferKeepClearForFocus()V
-HSPLandroid/view/View;->updateSystemGestureExclusionRects()V
-HSPLandroid/view/View;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z
-HSPLandroid/view/View;->willNotDraw()Z
-HSPLandroid/view/ViewAnimationHostBridge;-><init>(Landroid/view/View;)V
-HSPLandroid/view/ViewAnimationHostBridge;->isAttached()Z
-HSPLandroid/view/ViewAnimationHostBridge;->registerAnimatingRenderNode(Landroid/graphics/RenderNode;)V
-HSPLandroid/view/ViewAnimationHostBridge;->registerVectorDrawableAnimator(Landroid/view/NativeVectorDrawableAnimator;)V
-HSPLandroid/view/ViewConfiguration;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/ViewConfiguration;->get(Landroid/content/Context;)Landroid/view/ViewConfiguration;
-HSPLandroid/view/ViewConfiguration;->getDoubleTapTimeout()I
-HSPLandroid/view/ViewConfiguration;->getLongPressTimeout()I
-HSPLandroid/view/ViewConfiguration;->getPressedStateDuration()I
-HSPLandroid/view/ViewConfiguration;->getScaledAmbiguousGestureMultiplier()F
-HSPLandroid/view/ViewConfiguration;->getScaledDoubleTapSlop()I
-HSPLandroid/view/ViewConfiguration;->getScaledDoubleTapTouchSlop()I
-HSPLandroid/view/ViewConfiguration;->getScaledFadingEdgeLength()I
-HSPLandroid/view/ViewConfiguration;->getScaledHandwritingSlop()I
-HSPLandroid/view/ViewConfiguration;->getScaledHorizontalScrollFactor()F
-HSPLandroid/view/ViewConfiguration;->getScaledHoverSlop()I
-HSPLandroid/view/ViewConfiguration;->getScaledMaximumDrawingCacheSize()I
-HSPLandroid/view/ViewConfiguration;->getScaledMaximumFlingVelocity()I
-HSPLandroid/view/ViewConfiguration;->getScaledMinScrollbarTouchTarget()I
-HSPLandroid/view/ViewConfiguration;->getScaledMinimumFlingVelocity()I
-HSPLandroid/view/ViewConfiguration;->getScaledMinimumScalingSpan()I
-HSPLandroid/view/ViewConfiguration;->getScaledOverflingDistance()I
-HSPLandroid/view/ViewConfiguration;->getScaledOverscrollDistance()I
-HSPLandroid/view/ViewConfiguration;->getScaledPagingTouchSlop()I
-HSPLandroid/view/ViewConfiguration;->getScaledScrollBarSize()I
-HSPLandroid/view/ViewConfiguration;->getScaledTouchSlop()I
-HSPLandroid/view/ViewConfiguration;->getScaledVerticalScrollFactor()F
-HSPLandroid/view/ViewConfiguration;->getScaledWindowTouchSlop()I
-HSPLandroid/view/ViewConfiguration;->getScrollBarFadeDuration()I
-HSPLandroid/view/ViewConfiguration;->getScrollDefaultDelay()I
-HSPLandroid/view/ViewConfiguration;->getScrollFriction()F
-HSPLandroid/view/ViewConfiguration;->getTapTimeout()I
-HSPLandroid/view/ViewConfiguration;->isFadingMarqueeEnabled()Z
-HSPLandroid/view/ViewConfiguration;->isPreferKeepClearForFocusEnabled()Z
-HSPLandroid/view/ViewDebug;->getViewInstanceCount()J
-HSPLandroid/view/ViewDebug;->getViewRootImplCount()J
-HSPLandroid/view/ViewFrameInfo;-><init>()V
-HSPLandroid/view/ViewFrameInfo;->markDrawStart()V
-HSPLandroid/view/ViewFrameInfo;->populateFrameInfo(Landroid/graphics/FrameInfo;)V
-HSPLandroid/view/ViewFrameInfo;->reset()V
-HSPLandroid/view/ViewFrameInfo;->setInputEvent(I)V
-HSPLandroid/view/ViewGroup$4;-><init>(Landroid/view/ViewGroup;)V
-HSPLandroid/view/ViewGroup$4;->endTransition(Landroid/animation/LayoutTransition;Landroid/view/ViewGroup;Landroid/view/View;I)V
-HSPLandroid/view/ViewGroup$4;->startTransition(Landroid/animation/LayoutTransition;Landroid/view/ViewGroup;Landroid/view/View;I)V
-HSPLandroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;-><init>()V
-HSPLandroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;->obtain()Landroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;
-HSPLandroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;->recycle()V
-HSPLandroid/view/ViewGroup$LayoutParams;-><init>()V
-HSPLandroid/view/ViewGroup$LayoutParams;-><init>(II)V
-HSPLandroid/view/ViewGroup$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/view/ViewGroup$LayoutParams;-><init>(Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/view/ViewGroup$LayoutParams;->resolveLayoutDirection(I)V
-HSPLandroid/view/ViewGroup$LayoutParams;->setBaseAttributes(Landroid/content/res/TypedArray;II)V
-HSPLandroid/view/ViewGroup$MarginLayoutParams;-><init>(II)V
-HSPLandroid/view/ViewGroup$MarginLayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V+]Landroid/view/ViewGroup$MarginLayoutParams;missing_types]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;
-HSPLandroid/view/ViewGroup$MarginLayoutParams;-><init>(Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/view/ViewGroup$MarginLayoutParams;-><init>(Landroid/view/ViewGroup$MarginLayoutParams;)V
-HSPLandroid/view/ViewGroup$MarginLayoutParams;->doResolveMargins()V
-HSPLandroid/view/ViewGroup$MarginLayoutParams;->getLayoutDirection()I
-HSPLandroid/view/ViewGroup$MarginLayoutParams;->getMarginEnd()I
-HSPLandroid/view/ViewGroup$MarginLayoutParams;->getMarginStart()I
-HSPLandroid/view/ViewGroup$MarginLayoutParams;->isMarginRelative()Z
-HSPLandroid/view/ViewGroup$MarginLayoutParams;->resolveLayoutDirection(I)V+]Landroid/view/ViewGroup$MarginLayoutParams;missing_types
-HSPLandroid/view/ViewGroup$MarginLayoutParams;->setLayoutDirection(I)V
-HSPLandroid/view/ViewGroup$MarginLayoutParams;->setMarginEnd(I)V
-HSPLandroid/view/ViewGroup$MarginLayoutParams;->setMarginStart(I)V
-HSPLandroid/view/ViewGroup$MarginLayoutParams;->setMargins(IIII)V
-HSPLandroid/view/ViewGroup$TouchTarget;-><init>()V
-HSPLandroid/view/ViewGroup$TouchTarget;->obtain(Landroid/view/View;I)Landroid/view/ViewGroup$TouchTarget;
-HSPLandroid/view/ViewGroup$TouchTarget;->recycle()V
-HSPLandroid/view/ViewGroup;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/ViewGroup;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/view/ViewGroup;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/view/ViewGroup;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/view/ViewGroup;->addFocusables(Ljava/util/ArrayList;II)V
-HSPLandroid/view/ViewGroup;->addInArray(Landroid/view/View;I)V
-HSPLandroid/view/ViewGroup;->addTouchTarget(Landroid/view/View;I)Landroid/view/ViewGroup$TouchTarget;
-HSPLandroid/view/ViewGroup;->addView(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->addView(Landroid/view/View;I)V
-HSPLandroid/view/ViewGroup;->addView(Landroid/view/View;II)V
-HSPLandroid/view/ViewGroup;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/view/ViewGroup;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/view/ViewGroup;->addViewInLayout(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)Z
-HSPLandroid/view/ViewGroup;->addViewInLayout(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;Z)Z
-HSPLandroid/view/ViewGroup;->addViewInner(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;Z)V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types
-HSPLandroid/view/ViewGroup;->attachViewToParent(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/view/ViewGroup;->bringChildToFront(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->buildOrderedChildList()Ljava/util/ArrayList;
-HSPLandroid/view/ViewGroup;->buildTouchDispatchChildList()Ljava/util/ArrayList;
-HSPLandroid/view/ViewGroup;->cancelAndClearTouchTargets(Landroid/view/MotionEvent;)V
-HSPLandroid/view/ViewGroup;->cancelHoverTarget(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->cancelTouchTarget(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
-HSPLandroid/view/ViewGroup;->childDrawableStateChanged(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->childHasTransientStateChanged(Landroid/view/View;Z)V
-HSPLandroid/view/ViewGroup;->cleanupLayoutState(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->clearCachedLayoutMode()V
-HSPLandroid/view/ViewGroup;->clearChildFocus(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->clearDisappearingChildren()V
-HSPLandroid/view/ViewGroup;->clearFocus()V
-HSPLandroid/view/ViewGroup;->clearFocusedInCluster()V
-HSPLandroid/view/ViewGroup;->clearTouchTargets()V
-HSPLandroid/view/ViewGroup;->destroyHardwareResources()V
-HSPLandroid/view/ViewGroup;->detachAllViewsFromParent()V
-HSPLandroid/view/ViewGroup;->detachViewFromParent(I)V
-HSPLandroid/view/ViewGroup;->dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
-HSPLandroid/view/ViewGroup;->dispatchAttachedToWindow(Landroid/view/View$AttachInfo;I)V
-HSPLandroid/view/ViewGroup;->dispatchCancelPendingInputEvents()V
-HSPLandroid/view/ViewGroup;->dispatchCollectViewAttributes(Landroid/view/View$AttachInfo;I)V+]Landroid/view/View;missing_types
-HSPLandroid/view/ViewGroup;->dispatchConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/view/ViewGroup;->dispatchDetachedFromWindow()V
-HSPLandroid/view/ViewGroup;->dispatchDraw(Landroid/graphics/Canvas;)V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;
-HSPLandroid/view/ViewGroup;->dispatchDrawableHotspotChanged(FF)V
-HSPLandroid/view/ViewGroup;->dispatchFinishTemporaryDetach()V
-HSPLandroid/view/ViewGroup;->dispatchFreezeSelfOnly(Landroid/util/SparseArray;)V
-HSPLandroid/view/ViewGroup;->dispatchGetDisplayList()V+]Landroid/view/View;missing_types]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ViewGroup;->dispatchKeyEvent(Landroid/view/KeyEvent;)Z
-HSPLandroid/view/ViewGroup;->dispatchKeyEventPreIme(Landroid/view/KeyEvent;)Z
-HSPLandroid/view/ViewGroup;->dispatchProvideAutofillStructure(Landroid/view/ViewStructure;I)V
-HSPLandroid/view/ViewGroup;->dispatchProvideContentCaptureStructure()V
-HSPLandroid/view/ViewGroup;->dispatchRestoreInstanceState(Landroid/util/SparseArray;)V
-HSPLandroid/view/ViewGroup;->dispatchSaveInstanceState(Landroid/util/SparseArray;)V
-HSPLandroid/view/ViewGroup;->dispatchScreenStateChanged(I)V
-HSPLandroid/view/ViewGroup;->dispatchSetActivated(Z)V
-HSPLandroid/view/ViewGroup;->dispatchSetPressed(Z)V
-HSPLandroid/view/ViewGroup;->dispatchSetSelected(Z)V
-HSPLandroid/view/ViewGroup;->dispatchStartTemporaryDetach()V
-HSPLandroid/view/ViewGroup;->dispatchSystemUiVisibilityChanged(I)V
-HSPLandroid/view/ViewGroup;->dispatchThawSelfOnly(Landroid/util/SparseArray;)V
-HSPLandroid/view/ViewGroup;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z+]Landroid/view/ViewGroup$TouchTarget;Landroid/view/ViewGroup$TouchTarget;]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/view/MotionEvent;Landroid/view/MotionEvent;
-HSPLandroid/view/ViewGroup;->dispatchTransformedTouchEvent(Landroid/view/MotionEvent;ZLandroid/view/View;I)Z+]Landroid/view/View;missing_types]Landroid/view/MotionEvent;Landroid/view/MotionEvent;
-HSPLandroid/view/ViewGroup;->dispatchUnhandledKeyEvent(Landroid/view/KeyEvent;)Landroid/view/View;
-HSPLandroid/view/ViewGroup;->dispatchViewAdded(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->dispatchViewRemoved(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->dispatchVisibilityAggregated(Z)Z+]Landroid/view/View;missing_types
-HSPLandroid/view/ViewGroup;->dispatchVisibilityChanged(Landroid/view/View;I)V
-HSPLandroid/view/ViewGroup;->dispatchWindowFocusChanged(Z)V
-HSPLandroid/view/ViewGroup;->dispatchWindowInsetsAnimationEnd(Landroid/view/WindowInsetsAnimation;)V
-HSPLandroid/view/ViewGroup;->dispatchWindowSystemUiVisiblityChanged(I)V
-HSPLandroid/view/ViewGroup;->dispatchWindowVisibilityChanged(I)V
-HSPLandroid/view/ViewGroup;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z+]Landroid/view/View;missing_types
-HSPLandroid/view/ViewGroup;->drawableStateChanged()V
-HSPLandroid/view/ViewGroup;->endViewTransition(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->exitHoverTargets()V
-HSPLandroid/view/ViewGroup;->exitTooltipHoverTargets()V
-HSPLandroid/view/ViewGroup;->findFocus()Landroid/view/View;
-HSPLandroid/view/ViewGroup;->findOnBackInvokedDispatcherForChild(Landroid/view/View;Landroid/view/View;)Landroid/window/OnBackInvokedDispatcher;
-HSPLandroid/view/ViewGroup;->findViewByAutofillIdTraversal(I)Landroid/view/View;
-HSPLandroid/view/ViewGroup;->findViewByPredicateTraversal(Ljava/util/function/Predicate;Landroid/view/View;)Landroid/view/View;
-HSPLandroid/view/ViewGroup;->findViewTraversal(I)Landroid/view/View;
-HSPLandroid/view/ViewGroup;->findViewWithTagTraversal(Ljava/lang/Object;)Landroid/view/View;
-HSPLandroid/view/ViewGroup;->finishAnimatingView(Landroid/view/View;Landroid/view/animation/Animation;)V
-HSPLandroid/view/ViewGroup;->focusSearch(Landroid/view/View;I)Landroid/view/View;
-HSPLandroid/view/ViewGroup;->focusableViewAvailable(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->gatherTransparentRegion(Landroid/graphics/Region;)Z
-HSPLandroid/view/ViewGroup;->generateDefaultLayoutParams()Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/view/ViewGroup;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/view/ViewGroup;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLandroid/view/ViewGroup;->getAndVerifyPreorderedIndex(IIZ)I
-HSPLandroid/view/ViewGroup;->getAndVerifyPreorderedView(Ljava/util/ArrayList;[Landroid/view/View;I)Landroid/view/View;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ViewGroup;->getChildAt(I)Landroid/view/View;
-HSPLandroid/view/ViewGroup;->getChildCount()I
-HSPLandroid/view/ViewGroup;->getChildMeasureSpec(III)I
-HSPLandroid/view/ViewGroup;->getChildTransformation()Landroid/view/animation/Transformation;
-HSPLandroid/view/ViewGroup;->getChildVisibleRect(Landroid/view/View;Landroid/graphics/Rect;Landroid/graphics/Point;)Z
-HSPLandroid/view/ViewGroup;->getChildVisibleRect(Landroid/view/View;Landroid/graphics/Rect;Landroid/graphics/Point;Z)Z+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewParent;Landroid/view/ViewRootImpl;
-HSPLandroid/view/ViewGroup;->getChildrenForAutofill(I)Landroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;
-HSPLandroid/view/ViewGroup;->getChildrenForContentCapture()Landroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;
-HSPLandroid/view/ViewGroup;->getClipChildren()Z
-HSPLandroid/view/ViewGroup;->getClipToPadding()Z
-HSPLandroid/view/ViewGroup;->getDescendantFocusability()I
-HSPLandroid/view/ViewGroup;->getFocusedChild()Landroid/view/View;
-HSPLandroid/view/ViewGroup;->getLayoutMode()I
-HSPLandroid/view/ViewGroup;->getLayoutTransition()Landroid/animation/LayoutTransition;
-HSPLandroid/view/ViewGroup;->getNestedScrollAxes()I
-HSPLandroid/view/ViewGroup;->getOverlay()Landroid/view/ViewGroupOverlay;
-HSPLandroid/view/ViewGroup;->getScrollIndicatorBounds(Landroid/graphics/Rect;)V
-HSPLandroid/view/ViewGroup;->getTempLocationF()[F
-HSPLandroid/view/ViewGroup;->getTouchTarget(Landroid/view/View;)Landroid/view/ViewGroup$TouchTarget;
-HSPLandroid/view/ViewGroup;->getTouchscreenBlocksFocus()Z
-HSPLandroid/view/ViewGroup;->handleFocusGainInternal(ILandroid/graphics/Rect;)V
-HSPLandroid/view/ViewGroup;->hasBooleanFlag(I)Z
-HSPLandroid/view/ViewGroup;->hasChildWithZ()Z
-HSPLandroid/view/ViewGroup;->hasDefaultFocus()Z
-HSPLandroid/view/ViewGroup;->hasFocus()Z
-HSPLandroid/view/ViewGroup;->hasFocusable(ZZ)Z
-HSPLandroid/view/ViewGroup;->hasFocusableChild(Z)Z
-HSPLandroid/view/ViewGroup;->hasTransientState()Z
-HSPLandroid/view/ViewGroup;->hasUnhandledKeyListener()Z
-HSPLandroid/view/ViewGroup;->hasWindowInsetsAnimationCallback()Z
-HSPLandroid/view/ViewGroup;->indexOfChild(Landroid/view/View;)I
-HSPLandroid/view/ViewGroup;->initFromAttributes(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/view/ViewGroup;->initViewGroup()V
-HSPLandroid/view/ViewGroup;->internalSetPadding(IIII)V
-HSPLandroid/view/ViewGroup;->invalidateChild(Landroid/view/View;Landroid/graphics/Rect;)V+]Landroid/view/ViewGroup;missing_types
-HSPLandroid/view/ViewGroup;->invalidateChildInParent([ILandroid/graphics/Rect;)Landroid/view/ViewParent;
-HSPLandroid/view/ViewGroup;->isChildrenDrawingOrderEnabled()Z
-HSPLandroid/view/ViewGroup;->isLayoutModeOptical()Z
-HSPLandroid/view/ViewGroup;->isLayoutSuppressed()Z
-HSPLandroid/view/ViewGroup;->isTransformedTouchPointInView(FFLandroid/view/View;Landroid/graphics/PointF;)Z
-HSPLandroid/view/ViewGroup;->isViewTransitioning(Landroid/view/View;)Z
-HSPLandroid/view/ViewGroup;->jumpDrawablesToCurrentState()V
-HSPLandroid/view/ViewGroup;->layout(IIII)V
-HSPLandroid/view/ViewGroup;->makeFrameworkOptionalFitsSystemWindows()V
-HSPLandroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V
-HSPLandroid/view/ViewGroup;->measureChild(Landroid/view/View;II)V
-HSPLandroid/view/ViewGroup;->measureChildWithMargins(Landroid/view/View;IIII)V+]Landroid/view/View;missing_types
-HSPLandroid/view/ViewGroup;->measureChildren(II)V
-HSPLandroid/view/ViewGroup;->newDispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
-HSPLandroid/view/ViewGroup;->notifySubtreeAccessibilityStateChangedIfNeeded()V
-HSPLandroid/view/ViewGroup;->offsetDescendantRectToMyCoords(Landroid/view/View;Landroid/graphics/Rect;)V
-HSPLandroid/view/ViewGroup;->offsetRectBetweenParentAndChild(Landroid/view/View;Landroid/graphics/Rect;ZZ)V
-HSPLandroid/view/ViewGroup;->onAttachedToWindow()V
-HSPLandroid/view/ViewGroup;->onChildVisibilityChanged(Landroid/view/View;II)V
-HSPLandroid/view/ViewGroup;->onCreateDrawableState(I)[I
-HSPLandroid/view/ViewGroup;->onDescendantInvalidated(Landroid/view/View;Landroid/view/View;)V+]Landroid/view/ViewParent;missing_types
-HSPLandroid/view/ViewGroup;->onDescendantUnbufferedRequested()V
-HSPLandroid/view/ViewGroup;->onDetachedFromWindow()V
-HSPLandroid/view/ViewGroup;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z+]Landroid/view/MotionEvent;Landroid/view/MotionEvent;
-HSPLandroid/view/ViewGroup;->onRequestFocusInDescendants(ILandroid/graphics/Rect;)Z
-HSPLandroid/view/ViewGroup;->onSetLayoutParams(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/view/ViewGroup;->onStartNestedScroll(Landroid/view/View;Landroid/view/View;I)Z
-HSPLandroid/view/ViewGroup;->onViewAdded(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->onViewRemoved(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->populateChildrenForAutofill(Ljava/util/ArrayList;I)V
-HSPLandroid/view/ViewGroup;->populateChildrenForContentCapture(Ljava/util/ArrayList;)V
-HSPLandroid/view/ViewGroup;->recomputeViewAttributes(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->recreateChildDisplayList(Landroid/view/View;)V+]Landroid/view/View;missing_types
-HSPLandroid/view/ViewGroup;->removeAllViews()V
-HSPLandroid/view/ViewGroup;->removeAllViewsInLayout()V
-HSPLandroid/view/ViewGroup;->removeDetachedView(Landroid/view/View;Z)V
-HSPLandroid/view/ViewGroup;->removeFromArray(I)V
-HSPLandroid/view/ViewGroup;->removeFromArray(II)V
-HSPLandroid/view/ViewGroup;->removePointersFromTouchTargets(I)V
-HSPLandroid/view/ViewGroup;->removeView(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->removeViewAt(I)V
-HSPLandroid/view/ViewGroup;->removeViewInLayout(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->removeViewInternal(ILandroid/view/View;)V
-HSPLandroid/view/ViewGroup;->removeViewInternal(Landroid/view/View;)Z
-HSPLandroid/view/ViewGroup;->requestChildFocus(Landroid/view/View;Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->requestChildRectangleOnScreen(Landroid/view/View;Landroid/graphics/Rect;Z)Z
-HSPLandroid/view/ViewGroup;->requestDisallowInterceptTouchEvent(Z)V+]Landroid/view/ViewParent;missing_types
-HSPLandroid/view/ViewGroup;->requestFocus(ILandroid/graphics/Rect;)Z
-HSPLandroid/view/ViewGroup;->requestTransitionStart(Landroid/animation/LayoutTransition;)V
-HSPLandroid/view/ViewGroup;->requestTransparentRegion(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->resetCancelNextUpFlag(Landroid/view/View;)Z
-HSPLandroid/view/ViewGroup;->resetResolvedDrawables()V
-HSPLandroid/view/ViewGroup;->resetResolvedLayoutDirection()V
-HSPLandroid/view/ViewGroup;->resetResolvedPadding()V
-HSPLandroid/view/ViewGroup;->resetResolvedTextAlignment()V
-HSPLandroid/view/ViewGroup;->resetResolvedTextDirection()V
-HSPLandroid/view/ViewGroup;->resetSubtreeAccessibilityStateChanged()V
-HSPLandroid/view/ViewGroup;->resetTouchState()V
-HSPLandroid/view/ViewGroup;->resolveDrawables()V
-HSPLandroid/view/ViewGroup;->resolveLayoutDirection()Z
-HSPLandroid/view/ViewGroup;->resolveLayoutParams()V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types
-HSPLandroid/view/ViewGroup;->resolvePadding()V
-HSPLandroid/view/ViewGroup;->resolveRtlPropertiesIfNeeded()Z+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types
-HSPLandroid/view/ViewGroup;->resolveTextAlignment()Z
-HSPLandroid/view/ViewGroup;->resolveTextDirection()Z
-HSPLandroid/view/ViewGroup;->restoreDefaultFocus()Z
-HSPLandroid/view/ViewGroup;->setAddStatesFromChildren(Z)V
-HSPLandroid/view/ViewGroup;->setAlwaysDrawnWithCacheEnabled(Z)V
-HSPLandroid/view/ViewGroup;->setBooleanFlag(IZ)V
-HSPLandroid/view/ViewGroup;->setChildrenDrawingCacheEnabled(Z)V
-HSPLandroid/view/ViewGroup;->setChildrenDrawingOrderEnabled(Z)V
-HSPLandroid/view/ViewGroup;->setClipChildren(Z)V
-HSPLandroid/view/ViewGroup;->setClipToPadding(Z)V
-HSPLandroid/view/ViewGroup;->setDescendantFocusability(I)V
-HSPLandroid/view/ViewGroup;->setLayoutTransition(Landroid/animation/LayoutTransition;)V
-HSPLandroid/view/ViewGroup;->setMotionEventSplittingEnabled(Z)V
-HSPLandroid/view/ViewGroup;->setOnHierarchyChangeListener(Landroid/view/ViewGroup$OnHierarchyChangeListener;)V
-HSPLandroid/view/ViewGroup;->setTouchscreenBlocksFocus(Z)V
-HSPLandroid/view/ViewGroup;->shouldBlockFocusForTouchscreen()Z
-HSPLandroid/view/ViewGroup;->shouldDelayChildPressedState()Z
-HSPLandroid/view/ViewGroup;->startViewTransition(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->suppressLayout(Z)V
-HSPLandroid/view/ViewGroup;->touchAccessibilityNodeProviderIfNeeded(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->transformPointToViewLocal([FLandroid/view/View;)V
-HSPLandroid/view/ViewGroup;->unFocus(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->updateLocalSystemUiVisibility(II)Z
-HSPLandroid/view/ViewGroupOverlay;->add(Landroid/view/View;)V
-HSPLandroid/view/ViewGroupOverlay;->remove(Landroid/view/View;)V
-HSPLandroid/view/ViewOutlineProvider$1;->getOutline(Landroid/view/View;Landroid/graphics/Outline;)V+]Landroid/graphics/Outline;Landroid/graphics/Outline;]Landroid/graphics/drawable/Drawable;missing_types]Landroid/view/View;missing_types
-HSPLandroid/view/ViewOutlineProvider$2;->getOutline(Landroid/view/View;Landroid/graphics/Outline;)V
-HSPLandroid/view/ViewOutlineProvider;-><init>()V
-HSPLandroid/view/ViewOverlay$OverlayViewGroup;-><init>(Landroid/content/Context;Landroid/view/View;)V
-HSPLandroid/view/ViewOverlay$OverlayViewGroup;->add(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/view/ViewOverlay$OverlayViewGroup;->add(Landroid/view/View;)V
-HSPLandroid/view/ViewOverlay$OverlayViewGroup;->dispatchDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/view/ViewOverlay$OverlayViewGroup;->invalidate(IIII)V
-HSPLandroid/view/ViewOverlay$OverlayViewGroup;->invalidate(Landroid/graphics/Rect;)V
-HSPLandroid/view/ViewOverlay$OverlayViewGroup;->invalidate(Z)V
-HSPLandroid/view/ViewOverlay$OverlayViewGroup;->invalidateParentIfNeeded()V
-HSPLandroid/view/ViewOverlay$OverlayViewGroup;->isEmpty()Z
-HSPLandroid/view/ViewOverlay$OverlayViewGroup;->onDescendantInvalidated(Landroid/view/View;Landroid/view/View;)V
-HSPLandroid/view/ViewOverlay$OverlayViewGroup;->remove(Landroid/view/View;)V
-HSPLandroid/view/ViewOverlay;-><init>(Landroid/content/Context;Landroid/view/View;)V
-HSPLandroid/view/ViewOverlay;->add(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/view/ViewOverlay;->getOverlayView()Landroid/view/ViewGroup;
-HSPLandroid/view/ViewOverlay;->isEmpty()Z
-HSPLandroid/view/ViewPropertyAnimator$1;-><init>(Landroid/view/ViewPropertyAnimator;)V
-HSPLandroid/view/ViewPropertyAnimator$1;->run()V
-HSPLandroid/view/ViewPropertyAnimator$2;->run()V
-HSPLandroid/view/ViewPropertyAnimator$3;->run()V
-HSPLandroid/view/ViewPropertyAnimator$AnimatorEventListener;-><init>(Landroid/view/ViewPropertyAnimator;)V
-HSPLandroid/view/ViewPropertyAnimator$AnimatorEventListener;->onAnimationCancel(Landroid/animation/Animator;)V
-HSPLandroid/view/ViewPropertyAnimator$AnimatorEventListener;->onAnimationEnd(Landroid/animation/Animator;)V
-HSPLandroid/view/ViewPropertyAnimator$AnimatorEventListener;->onAnimationStart(Landroid/animation/Animator;)V
-HSPLandroid/view/ViewPropertyAnimator$AnimatorEventListener;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/view/View;Landroid/widget/LinearLayout;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;
-HSPLandroid/view/ViewPropertyAnimator$NameValuesHolder;-><init>(IFF)V
-HSPLandroid/view/ViewPropertyAnimator$PropertyBundle;-><init>(ILjava/util/ArrayList;)V
-HSPLandroid/view/ViewPropertyAnimator$PropertyBundle;->cancel(I)Z
-HSPLandroid/view/ViewPropertyAnimator;-><init>(Landroid/view/View;)V
-HSPLandroid/view/ViewPropertyAnimator;->alpha(F)Landroid/view/ViewPropertyAnimator;
-HSPLandroid/view/ViewPropertyAnimator;->animateProperty(IF)V
-HSPLandroid/view/ViewPropertyAnimator;->animatePropertyBy(IFF)V
-HSPLandroid/view/ViewPropertyAnimator;->cancel()V
-HSPLandroid/view/ViewPropertyAnimator;->getValue(I)F
-HSPLandroid/view/ViewPropertyAnimator;->scaleX(F)Landroid/view/ViewPropertyAnimator;
-HSPLandroid/view/ViewPropertyAnimator;->scaleY(F)Landroid/view/ViewPropertyAnimator;
-HSPLandroid/view/ViewPropertyAnimator;->setDuration(J)Landroid/view/ViewPropertyAnimator;
-HSPLandroid/view/ViewPropertyAnimator;->setInterpolator(Landroid/animation/TimeInterpolator;)Landroid/view/ViewPropertyAnimator;
-HSPLandroid/view/ViewPropertyAnimator;->setListener(Landroid/animation/Animator$AnimatorListener;)Landroid/view/ViewPropertyAnimator;
-HSPLandroid/view/ViewPropertyAnimator;->setStartDelay(J)Landroid/view/ViewPropertyAnimator;
-HSPLandroid/view/ViewPropertyAnimator;->setValue(IF)V
-HSPLandroid/view/ViewPropertyAnimator;->start()V
-HSPLandroid/view/ViewPropertyAnimator;->startAnimation()V
-HSPLandroid/view/ViewPropertyAnimator;->translationX(F)Landroid/view/ViewPropertyAnimator;
-HSPLandroid/view/ViewPropertyAnimator;->translationY(F)Landroid/view/ViewPropertyAnimator;
-HSPLandroid/view/ViewPropertyAnimator;->withEndAction(Ljava/lang/Runnable;)Landroid/view/ViewPropertyAnimator;
-HSPLandroid/view/ViewPropertyAnimator;->withLayer()Landroid/view/ViewPropertyAnimator;
-HSPLandroid/view/ViewPropertyAnimator;->withStartAction(Ljava/lang/Runnable;)Landroid/view/ViewPropertyAnimator;
-HSPLandroid/view/ViewRootImpl$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/view/ViewRootImpl$$ExternalSyntheticLambda17;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$$ExternalSyntheticLambda3;->run()V
-HSPLandroid/view/ViewRootImpl$AccessibilityInteractionConnectionManager;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$AccessibilityInteractionConnectionManager;->ensureNoConnection()V
-HSPLandroid/view/ViewRootImpl$AsyncInputStage;-><init>(Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl$InputStage;Ljava/lang/String;)V
-HSPLandroid/view/ViewRootImpl$AsyncInputStage;->apply(Landroid/view/ViewRootImpl$QueuedInputEvent;I)V
-HSPLandroid/view/ViewRootImpl$AsyncInputStage;->defer(Landroid/view/ViewRootImpl$QueuedInputEvent;)V
-HSPLandroid/view/ViewRootImpl$AsyncInputStage;->dequeue(Landroid/view/ViewRootImpl$QueuedInputEvent;Landroid/view/ViewRootImpl$QueuedInputEvent;)V
-HSPLandroid/view/ViewRootImpl$AsyncInputStage;->forward(Landroid/view/ViewRootImpl$QueuedInputEvent;)V
-HSPLandroid/view/ViewRootImpl$ConsumeBatchedInputImmediatelyRunnable;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$ConsumeBatchedInputRunnable;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$ConsumeBatchedInputRunnable;->run()V
-HSPLandroid/view/ViewRootImpl$EarlyPostImeInputStage;-><init>(Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl$InputStage;)V
-HSPLandroid/view/ViewRootImpl$EarlyPostImeInputStage;->onProcess(Landroid/view/ViewRootImpl$QueuedInputEvent;)I
-HSPLandroid/view/ViewRootImpl$EarlyPostImeInputStage;->processKeyEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;)I
-HSPLandroid/view/ViewRootImpl$EarlyPostImeInputStage;->processMotionEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;)I
-HSPLandroid/view/ViewRootImpl$EarlyPostImeInputStage;->processPointerEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;)I
-HSPLandroid/view/ViewRootImpl$HighContrastTextManager;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$ImeInputStage;-><init>(Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl$InputStage;Ljava/lang/String;)V
-HSPLandroid/view/ViewRootImpl$ImeInputStage;->onFinishedInputEvent(Ljava/lang/Object;Z)V
-HSPLandroid/view/ViewRootImpl$ImeInputStage;->onProcess(Landroid/view/ViewRootImpl$QueuedInputEvent;)I
-HSPLandroid/view/ViewRootImpl$InputMetricsListener;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$InputMetricsListener;->onFrameMetricsAvailable(I)V+]Landroid/view/ViewRootImpl$WindowInputEventReceiver;Landroid/view/ViewRootImpl$WindowInputEventReceiver;
-HSPLandroid/view/ViewRootImpl$InputStage;-><init>(Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl$InputStage;)V
-HSPLandroid/view/ViewRootImpl$InputStage;->apply(Landroid/view/ViewRootImpl$QueuedInputEvent;I)V
-HSPLandroid/view/ViewRootImpl$InputStage;->deliver(Landroid/view/ViewRootImpl$QueuedInputEvent;)V
-HSPLandroid/view/ViewRootImpl$InputStage;->finish(Landroid/view/ViewRootImpl$QueuedInputEvent;Z)V
-HSPLandroid/view/ViewRootImpl$InputStage;->forward(Landroid/view/ViewRootImpl$QueuedInputEvent;)V
-HSPLandroid/view/ViewRootImpl$InputStage;->onDeliverToNext(Landroid/view/ViewRootImpl$QueuedInputEvent;)V
-HSPLandroid/view/ViewRootImpl$InputStage;->onDetachedFromWindow()V
-HSPLandroid/view/ViewRootImpl$InputStage;->onWindowFocusChanged(Z)V
-HSPLandroid/view/ViewRootImpl$InputStage;->shouldDropInputEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;)Z
-HSPLandroid/view/ViewRootImpl$InputStage;->traceEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;J)V
-HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->addView(Landroid/view/View;)V+]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->postIfNeededLocked()V+]Landroid/view/Choreographer;Landroid/view/Choreographer;
-HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->removeView(Landroid/view/View;)V
-HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->run()V+]Landroid/view/View;missing_types]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ViewRootImpl$NativePostImeInputStage;-><init>(Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl$InputStage;Ljava/lang/String;)V
-HSPLandroid/view/ViewRootImpl$NativePostImeInputStage;->onProcess(Landroid/view/ViewRootImpl$QueuedInputEvent;)I
-HSPLandroid/view/ViewRootImpl$NativePreImeInputStage;-><init>(Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl$InputStage;Ljava/lang/String;)V
-HSPLandroid/view/ViewRootImpl$NativePreImeInputStage;->onProcess(Landroid/view/ViewRootImpl$QueuedInputEvent;)I
-HSPLandroid/view/ViewRootImpl$QueuedInputEvent;-><init>()V
-HSPLandroid/view/ViewRootImpl$QueuedInputEvent;->shouldSendToSynthesizer()Z
-HSPLandroid/view/ViewRootImpl$QueuedInputEvent;->shouldSkipIme()Z
-HSPLandroid/view/ViewRootImpl$SyntheticInputStage;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$SyntheticInputStage;->onDeliverToNext(Landroid/view/ViewRootImpl$QueuedInputEvent;)V
-HSPLandroid/view/ViewRootImpl$SyntheticInputStage;->onDetachedFromWindow()V
-HSPLandroid/view/ViewRootImpl$SyntheticInputStage;->onProcess(Landroid/view/ViewRootImpl$QueuedInputEvent;)I
-HSPLandroid/view/ViewRootImpl$SyntheticInputStage;->onWindowFocusChanged(Z)V
-HSPLandroid/view/ViewRootImpl$SyntheticJoystickHandler$JoystickAxesState;-><init>(Landroid/view/ViewRootImpl$SyntheticJoystickHandler;)V
-HSPLandroid/view/ViewRootImpl$SyntheticJoystickHandler$JoystickAxesState;->resetState()V
-HSPLandroid/view/ViewRootImpl$SyntheticJoystickHandler;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$SyntheticJoystickHandler;->cancel()V
-HSPLandroid/view/ViewRootImpl$SyntheticKeyboardHandler;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$SyntheticTouchNavigationHandler$1;-><init>(Landroid/view/ViewRootImpl$SyntheticTouchNavigationHandler;)V
-HSPLandroid/view/ViewRootImpl$SyntheticTouchNavigationHandler;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$SyntheticTrackballHandler;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$SystemUiVisibilityInfo;-><init>()V
-HSPLandroid/view/ViewRootImpl$TrackballAxis;-><init>()V
-HSPLandroid/view/ViewRootImpl$TraversalRunnable;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$TraversalRunnable;->run()V+]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;
-HSPLandroid/view/ViewRootImpl$UnhandledKeyManager;-><init>()V
-HSPLandroid/view/ViewRootImpl$UnhandledKeyManager;-><init>(Landroid/view/ViewRootImpl$UnhandledKeyManager-IA;)V
-HSPLandroid/view/ViewRootImpl$UnhandledKeyManager;->dispatch(Landroid/view/View;Landroid/view/KeyEvent;)Z
-HSPLandroid/view/ViewRootImpl$UnhandledKeyManager;->preDispatch(Landroid/view/KeyEvent;)V
-HSPLandroid/view/ViewRootImpl$UnhandledKeyManager;->preViewDispatch(Landroid/view/KeyEvent;)Z
-HSPLandroid/view/ViewRootImpl$ViewPostImeInputStage;-><init>(Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl$InputStage;)V
-HSPLandroid/view/ViewRootImpl$ViewPostImeInputStage;->maybeUpdatePointerIcon(Landroid/view/MotionEvent;)V
-HSPLandroid/view/ViewRootImpl$ViewPostImeInputStage;->onDeliverToNext(Landroid/view/ViewRootImpl$QueuedInputEvent;)V
-HSPLandroid/view/ViewRootImpl$ViewPostImeInputStage;->onProcess(Landroid/view/ViewRootImpl$QueuedInputEvent;)I
-HSPLandroid/view/ViewRootImpl$ViewPostImeInputStage;->processKeyEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;)I
-HSPLandroid/view/ViewRootImpl$ViewPostImeInputStage;->processPointerEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;)I
-HSPLandroid/view/ViewRootImpl$ViewPreImeInputStage;-><init>(Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl$InputStage;)V
-HSPLandroid/view/ViewRootImpl$ViewPreImeInputStage;->onProcess(Landroid/view/ViewRootImpl$QueuedInputEvent;)I
-HSPLandroid/view/ViewRootImpl$ViewRootHandler;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$ViewRootHandler;->getMessageName(Landroid/os/Message;)Ljava/lang/String;
-HSPLandroid/view/ViewRootImpl$ViewRootHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/view/ViewRootImpl$ViewRootHandler;->handleMessageImpl(Landroid/os/Message;)V
-HSPLandroid/view/ViewRootImpl$ViewRootHandler;->sendMessageAtTime(Landroid/os/Message;J)Z
-HSPLandroid/view/ViewRootImpl$W;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$W;->closeSystemDialogs(Ljava/lang/String;)V
-HSPLandroid/view/ViewRootImpl$W;->dispatchAppVisibility(Z)V
-HSPLandroid/view/ViewRootImpl$W;->dispatchWindowShown()V
-HSPLandroid/view/ViewRootImpl$W;->insetsControlChanged(Landroid/view/InsetsState;[Landroid/view/InsetsSourceControl;)V
-HSPLandroid/view/ViewRootImpl$W;->moved(II)V
-HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;-><init>(Landroid/view/ViewRootImpl;Landroid/view/InputChannel;Landroid/os/Looper;)V
-HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->dispose()V
-HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->onBatchedInputEventPending(I)V
-HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->onFocusEvent(Z)V
-HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->onInputEvent(Landroid/view/InputEvent;)V
-HSPLandroid/view/ViewRootImpl;->-$$Nest$fgetmBlastBufferQueue(Landroid/view/ViewRootImpl;)Landroid/graphics/BLASTBufferQueue;
-HSPLandroid/view/ViewRootImpl;->-$$Nest$fputmProfileRendering(Landroid/view/ViewRootImpl;Z)V
-HSPLandroid/view/ViewRootImpl;->-$$Nest$mdispatchInsetsControlChanged(Landroid/view/ViewRootImpl;Landroid/view/InsetsState;[Landroid/view/InsetsSourceControl;)V
-HSPLandroid/view/ViewRootImpl;->-$$Nest$mprofileRendering(Landroid/view/ViewRootImpl;Z)V
-HSPLandroid/view/ViewRootImpl;-><init>(Landroid/content/Context;Landroid/view/Display;)V
-HSPLandroid/view/ViewRootImpl;-><init>(Landroid/content/Context;Landroid/view/Display;Landroid/view/IWindowSession;Landroid/view/WindowLayout;)V
-HSPLandroid/view/ViewRootImpl;->addConfigCallback(Landroid/view/ViewRootImpl$ConfigChangedCallback;)V
-HSPLandroid/view/ViewRootImpl;->addFrameCommitCallbackIfNeeded()V+]Landroid/view/ViewTreeObserver;Landroid/view/ViewTreeObserver;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;
-HSPLandroid/view/ViewRootImpl;->addSurfaceChangedCallback(Landroid/view/ViewRootImpl$SurfaceChangedCallback;)V
-HSPLandroid/view/ViewRootImpl;->addWindowCallbacks(Landroid/view/WindowCallbacks;)V
-HSPLandroid/view/ViewRootImpl;->adjustLayoutParamsForCompatibility(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/view/ViewRootImpl;->applyKeepScreenOnFlag(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/view/ViewRootImpl;->applyTransactionOnDraw(Landroid/view/SurfaceControl$Transaction;)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;
-HSPLandroid/view/ViewRootImpl;->canResolveTextDirection()Z
-HSPLandroid/view/ViewRootImpl;->cancelInvalidate(Landroid/view/View;)V
-HSPLandroid/view/ViewRootImpl;->checkForLeavingTouchModeAndConsume(Landroid/view/KeyEvent;)Z
-HSPLandroid/view/ViewRootImpl;->checkThread()V
-HSPLandroid/view/ViewRootImpl;->childDrawableStateChanged(Landroid/view/View;)V
-HSPLandroid/view/ViewRootImpl;->childHasTransientStateChanged(Landroid/view/View;Z)V
-HSPLandroid/view/ViewRootImpl;->clearChildFocus(Landroid/view/View;)V
-HSPLandroid/view/ViewRootImpl;->clearLowProfileModeIfNeeded(IZ)V
-HSPLandroid/view/ViewRootImpl;->collectViewAttributes()Z+]Landroid/view/View;Lcom/android/internal/policy/DecorView;
-HSPLandroid/view/ViewRootImpl;->controlInsetsForCompatibility(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/view/ViewRootImpl;->createSyncIfNeeded()V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Landroid/window/SurfaceSyncGroup;Landroid/window/SurfaceSyncGroup;
-HSPLandroid/view/ViewRootImpl;->deliverInputEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;)V
-HSPLandroid/view/ViewRootImpl;->destroyHardwareRenderer()V
-HSPLandroid/view/ViewRootImpl;->destroyHardwareResources()V
-HSPLandroid/view/ViewRootImpl;->destroySurface()V
-HSPLandroid/view/ViewRootImpl;->die(Z)Z
-HSPLandroid/view/ViewRootImpl;->dipToPx(I)I
-HSPLandroid/view/ViewRootImpl;->dispatchAppVisibility(Z)V
-HSPLandroid/view/ViewRootImpl;->dispatchApplyInsets(Landroid/view/View;)V
-HSPLandroid/view/ViewRootImpl;->dispatchCheckFocus()V
-HSPLandroid/view/ViewRootImpl;->dispatchDetachedFromWindow()V
-HSPLandroid/view/ViewRootImpl;->dispatchDispatchSystemUiVisibilityChanged()V
-HSPLandroid/view/ViewRootImpl;->dispatchFocusEvent(ZZ)V
-HSPLandroid/view/ViewRootImpl;->dispatchInsetsControlChanged(Landroid/view/InsetsState;[Landroid/view/InsetsSourceControl;)V
-HSPLandroid/view/ViewRootImpl;->dispatchInvalidateDelayed(Landroid/view/View;J)V
-HSPLandroid/view/ViewRootImpl;->dispatchInvalidateOnAnimation(Landroid/view/View;)V+]Landroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;Landroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;
-HSPLandroid/view/ViewRootImpl;->dispatchMoved(II)V
-HSPLandroid/view/ViewRootImpl;->doConsumeBatchedInput(J)Z
-HSPLandroid/view/ViewRootImpl;->doDie()V
-HSPLandroid/view/ViewRootImpl;->doProcessInputEvents()V
-HSPLandroid/view/ViewRootImpl;->doTraversal()V+]Landroid/os/Looper;Landroid/os/Looper;]Landroid/view/ViewRootImpl$ViewRootHandler;Landroid/view/ViewRootImpl$ViewRootHandler;]Landroid/os/MessageQueue;Landroid/os/MessageQueue;
-HSPLandroid/view/ViewRootImpl;->draw(ZLandroid/window/SurfaceSyncGroup;Z)Z+]Landroid/view/Surface;Landroid/view/Surface;]Landroid/view/ViewTreeObserver;Landroid/view/ViewTreeObserver;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/HdrRenderState;Landroid/view/HdrRenderState;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Landroid/view/Choreographer;Landroid/view/Choreographer;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/view/ViewRootImpl;->drawAccessibilityFocusedDrawableIfNeeded(Landroid/graphics/Canvas;)V
-HSPLandroid/view/ViewRootImpl;->drawSoftware(Landroid/view/Surface;Landroid/view/View$AttachInfo;IIZLandroid/graphics/Rect;Landroid/graphics/Rect;)Z
-HSPLandroid/view/ViewRootImpl;->enableHardwareAcceleration(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/view/ViewRootImpl;->endDragResizing()V
-HSPLandroid/view/ViewRootImpl;->enqueueInputEvent(Landroid/view/InputEvent;)V
-HSPLandroid/view/ViewRootImpl;->enqueueInputEvent(Landroid/view/InputEvent;Landroid/view/InputEventReceiver;IZ)V
-HSPLandroid/view/ViewRootImpl;->ensureTouchMode(Z)Z
-HSPLandroid/view/ViewRootImpl;->ensureTouchModeLocally(Z)Z
-HSPLandroid/view/ViewRootImpl;->enterTouchMode()Z
-HSPLandroid/view/ViewRootImpl;->findOnBackInvokedDispatcherForChild(Landroid/view/View;Landroid/view/View;)Landroid/window/OnBackInvokedDispatcher;
-HSPLandroid/view/ViewRootImpl;->finishInputEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;)V
-HSPLandroid/view/ViewRootImpl;->fireAccessibilityFocusEventIfHasFocusedNode()V
-HSPLandroid/view/ViewRootImpl;->focusableViewAvailable(Landroid/view/View;)V
-HSPLandroid/view/ViewRootImpl;->forceLayout(Landroid/view/View;)V
-HSPLandroid/view/ViewRootImpl;->getAccessibilityFocusedHost()Landroid/view/View;
-HSPLandroid/view/ViewRootImpl;->getAccessibilityFocusedRect(Landroid/graphics/Rect;)Z
-HSPLandroid/view/ViewRootImpl;->getAudioManager()Landroid/media/AudioManager;
-HSPLandroid/view/ViewRootImpl;->getAutofillManager()Landroid/view/autofill/AutofillManager;
-HSPLandroid/view/ViewRootImpl;->getBufferTransformHint()I
-HSPLandroid/view/ViewRootImpl;->getChildVisibleRect(Landroid/view/View;Landroid/graphics/Rect;Landroid/graphics/Point;)Z
-HSPLandroid/view/ViewRootImpl;->getCompatWindowConfiguration()Landroid/app/WindowConfiguration;
-HSPLandroid/view/ViewRootImpl;->getConfiguration()Landroid/content/res/Configuration;+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/Context;Lcom/android/internal/policy/DecorContext;
-HSPLandroid/view/ViewRootImpl;->getDisplayId()I
-HSPLandroid/view/ViewRootImpl;->getHandwritingInitiator()Landroid/view/HandwritingInitiator;
-HSPLandroid/view/ViewRootImpl;->getHostVisibility()I+]Landroid/view/View;Lcom/android/internal/policy/DecorView;
-HSPLandroid/view/ViewRootImpl;->getImeFocusController()Landroid/view/ImeFocusController;
-HSPLandroid/view/ViewRootImpl;->getImpliedSystemUiVisibility(Landroid/view/WindowManager$LayoutParams;)I
-HSPLandroid/view/ViewRootImpl;->getInsetsController()Landroid/view/InsetsController;
-HSPLandroid/view/ViewRootImpl;->getNightMode()I
-HSPLandroid/view/ViewRootImpl;->getOnBackInvokedDispatcher()Landroid/window/WindowOnBackInvokedDispatcher;
-HSPLandroid/view/ViewRootImpl;->getOrCreateSurfaceSyncGroup()Landroid/window/SurfaceSyncGroup;
-HSPLandroid/view/ViewRootImpl;->getParent()Landroid/view/ViewParent;
-HSPLandroid/view/ViewRootImpl;->getRootMeasureSpec(III)I
-HSPLandroid/view/ViewRootImpl;->getRunQueue()Landroid/view/HandlerActionQueue;+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal;
-HSPLandroid/view/ViewRootImpl;->getSurfaceControl()Landroid/view/SurfaceControl;
-HSPLandroid/view/ViewRootImpl;->getSurfaceSequenceId()I
-HSPLandroid/view/ViewRootImpl;->getTextDirection()I
-HSPLandroid/view/ViewRootImpl;->getTitle()Ljava/lang/CharSequence;
-HSPLandroid/view/ViewRootImpl;->getUpdatedFrameInfo()Landroid/graphics/FrameInfo;+]Landroid/view/InputEventAssigner;Landroid/view/InputEventAssigner;]Landroid/view/ViewFrameInfo;Landroid/view/ViewFrameInfo;
-HSPLandroid/view/ViewRootImpl;->getValidLayoutRequesters(Ljava/util/ArrayList;Z)Ljava/util/ArrayList;
-HSPLandroid/view/ViewRootImpl;->getView()Landroid/view/View;
-HSPLandroid/view/ViewRootImpl;->getViewBoundsSandboxingEnabled()Z
-HSPLandroid/view/ViewRootImpl;->getWindowBoundsInsetSystemBars()Landroid/graphics/Rect;
-HSPLandroid/view/ViewRootImpl;->getWindowFlags()I
-HSPLandroid/view/ViewRootImpl;->getWindowInsets(Z)Landroid/view/WindowInsets;
-HSPLandroid/view/ViewRootImpl;->getWindowVisibleDisplayFrame(Landroid/graphics/Rect;)V
-HSPLandroid/view/ViewRootImpl;->handleAppVisibility(Z)V
-HSPLandroid/view/ViewRootImpl;->handleContentCaptureFlush()V
-HSPLandroid/view/ViewRootImpl;->handleDispatchSystemUiVisibilityChanged()V
-HSPLandroid/view/ViewRootImpl;->handleWindowFocusChanged()V
-HSPLandroid/view/ViewRootImpl;->invalidate()V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;
-HSPLandroid/view/ViewRootImpl;->invalidateChild(Landroid/view/View;Landroid/graphics/Rect;)V
-HSPLandroid/view/ViewRootImpl;->invalidateChildInParent([ILandroid/graphics/Rect;)Landroid/view/ViewParent;
-HSPLandroid/view/ViewRootImpl;->invalidateRectOnScreen(Landroid/graphics/Rect;)V
-HSPLandroid/view/ViewRootImpl;->isAccessibilityFocusDirty()Z+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable;
-HSPLandroid/view/ViewRootImpl;->isContentCaptureEnabled()Z
-HSPLandroid/view/ViewRootImpl;->isContentCaptureReallyEnabled()Z
-HSPLandroid/view/ViewRootImpl;->isHardwareEnabled()Z+]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;
-HSPLandroid/view/ViewRootImpl;->isInLayout()Z
-HSPLandroid/view/ViewRootImpl;->isInTouchMode()Z
-HSPLandroid/view/ViewRootImpl;->isInWMSRequestedSync()Z
-HSPLandroid/view/ViewRootImpl;->isLayoutRequested()Z
-HSPLandroid/view/ViewRootImpl;->isNavigationKey(Landroid/view/KeyEvent;)Z
-HSPLandroid/view/ViewRootImpl;->isTextDirectionResolved()Z
-HSPLandroid/view/ViewRootImpl;->keepClearRectsChanged(Z)V
-HSPLandroid/view/ViewRootImpl;->lambda$createSyncIfNeeded$4(ILandroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/view/ViewRootImpl;->lambda$getOrCreateSurfaceSyncGroup$14()V
-HSPLandroid/view/ViewRootImpl;->lambda$new$0(Landroid/view/View;)Ljava/util/List;
-HSPLandroid/view/ViewRootImpl;->lambda$new$1(Landroid/view/View;)Ljava/util/List;
-HSPLandroid/view/ViewRootImpl;->lambda$new$2(Landroid/view/View;)Ljava/util/List;
-HSPLandroid/view/ViewRootImpl;->loadSystemProperties()V
-HSPLandroid/view/ViewRootImpl;->maybeFireAccessibilityWindowStateChangedEvent()V
-HSPLandroid/view/ViewRootImpl;->maybeHandleWindowMove(Landroid/graphics/Rect;)V
-HSPLandroid/view/ViewRootImpl;->maybeUpdateTooltip(Landroid/view/MotionEvent;)V
-HSPLandroid/view/ViewRootImpl;->measureHierarchy(Landroid/view/View;Landroid/view/WindowManager$LayoutParams;Landroid/content/res/Resources;IIZ)Z+]Landroid/view/View;Lcom/android/internal/policy/DecorView;
-HSPLandroid/view/ViewRootImpl;->mergeWithNextTransaction(Landroid/view/SurfaceControl$Transaction;J)V+]Landroid/graphics/BLASTBufferQueue;Landroid/graphics/BLASTBufferQueue;
-HSPLandroid/view/ViewRootImpl;->notifyContentCaptureEvents()V
-HSPLandroid/view/ViewRootImpl;->notifyDrawStarted(Z)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ViewRootImpl;->notifyInsetsChanged()V
-HSPLandroid/view/ViewRootImpl;->notifyRendererOfFramePending()V+]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;
-HSPLandroid/view/ViewRootImpl;->notifySurfaceCreated(Landroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/view/ViewRootImpl;->notifySurfaceDestroyed()V
-HSPLandroid/view/ViewRootImpl;->obtainQueuedInputEvent(Landroid/view/InputEvent;Landroid/view/InputEventReceiver;I)Landroid/view/ViewRootImpl$QueuedInputEvent;
-HSPLandroid/view/ViewRootImpl;->onDescendantInvalidated(Landroid/view/View;Landroid/view/View;)V+]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;
-HSPLandroid/view/ViewRootImpl;->onDescendantUnbufferedRequested()V
-HSPLandroid/view/ViewRootImpl;->onMovedToDisplay(ILandroid/content/res/Configuration;)V
-HSPLandroid/view/ViewRootImpl;->onPostDraw(Landroid/graphics/RecordingCanvas;)V
-HSPLandroid/view/ViewRootImpl;->onPreDraw(Landroid/graphics/RecordingCanvas;)V
-HSPLandroid/view/ViewRootImpl;->onStartNestedScroll(Landroid/view/View;Landroid/view/View;I)Z
-HSPLandroid/view/ViewRootImpl;->performContentCaptureInitialReport()V
-HSPLandroid/view/ViewRootImpl;->performDraw(Landroid/window/SurfaceSyncGroup;)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;
-HSPLandroid/view/ViewRootImpl;->performLayout(Landroid/view/WindowManager$LayoutParams;II)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/view/View;Lcom/android/internal/policy/DecorView;]Landroid/view/HandlerActionQueue;Landroid/view/HandlerActionQueue;]Landroid/content/Context;Lcom/android/internal/policy/DecorContext;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ViewRootImpl;->performMeasure(II)V+]Landroid/view/View;Lcom/android/internal/policy/DecorView;
-HSPLandroid/view/ViewRootImpl;->performTraversals()V+]Landroid/view/ViewTreeObserver;Landroid/view/ViewTreeObserver;]Landroid/view/View;missing_types]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/view/HandlerActionQueue;Landroid/view/HandlerActionQueue;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/view/Surface;Landroid/view/Surface;]Landroid/util/MergedConfiguration;Landroid/util/MergedConfiguration;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ImeFocusController;Landroid/view/ImeFocusController;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/view/ContextThemeWrapper;,Lcom/android/internal/policy/DecorContext;]Lcom/android/internal/view/RootViewSurfaceTaker;Lcom/android/internal/policy/DecorView;]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/window/SurfaceSyncGroup;Landroid/window/SurfaceSyncGroup;]Landroid/window/WindowOnBackInvokedDispatcher;Landroid/window/WindowOnBackInvokedDispatcher;
-HSPLandroid/view/ViewRootImpl;->playSoundEffect(I)V
-HSPLandroid/view/ViewRootImpl;->pokeDrawLockIfNeeded()V
-HSPLandroid/view/ViewRootImpl;->prepareSurfaces()V+]Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;
-HSPLandroid/view/ViewRootImpl;->profileRendering(Z)V
-HSPLandroid/view/ViewRootImpl;->recomputeViewAttributes(Landroid/view/View;)V
-HSPLandroid/view/ViewRootImpl;->recycleQueuedInputEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;)V
-HSPLandroid/view/ViewRootImpl;->registerAnimatingRenderNode(Landroid/graphics/RenderNode;)V
-HSPLandroid/view/ViewRootImpl;->registerBackCallbackOnWindow()V
-HSPLandroid/view/ViewRootImpl;->registerCallbackForPendingTransactions()V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;
-HSPLandroid/view/ViewRootImpl;->registerCallbacksForSync(ZLandroid/window/SurfaceSyncGroup;)V
-HSPLandroid/view/ViewRootImpl;->registerCompatOnBackInvokedCallback()V
-HSPLandroid/view/ViewRootImpl;->registerListeners()V
-HSPLandroid/view/ViewRootImpl;->registerRtFrameCallback(Landroid/graphics/HardwareRenderer$FrameDrawingCallback;)V+]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;
-HSPLandroid/view/ViewRootImpl;->relayoutWindow(Landroid/view/WindowManager$LayoutParams;IZ)I+]Landroid/view/IWindowSession;Landroid/view/IWindowSession$Stub$Proxy;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;]Landroid/view/HdrRenderState;Landroid/view/HdrRenderState;]Landroid/view/InsetsController;Landroid/view/InsetsController;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/view/WindowLayout;Landroid/view/WindowLayout;]Landroid/util/MergedConfiguration;Landroid/util/MergedConfiguration;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/view/Display;Landroid/view/Display;
-HSPLandroid/view/ViewRootImpl;->removeSendWindowContentChangedCallback()V
-HSPLandroid/view/ViewRootImpl;->removeSurfaceChangedCallback(Landroid/view/ViewRootImpl$SurfaceChangedCallback;)V
-HSPLandroid/view/ViewRootImpl;->removeWindowCallbacks(Landroid/view/WindowCallbacks;)V
-HSPLandroid/view/ViewRootImpl;->reportDrawFinished(Landroid/view/SurfaceControl$Transaction;I)V
-HSPLandroid/view/ViewRootImpl;->reportNextDraw(Ljava/lang/String;)V
-HSPLandroid/view/ViewRootImpl;->requestChildFocus(Landroid/view/View;Landroid/view/View;)V
-HSPLandroid/view/ViewRootImpl;->requestChildRectangleOnScreen(Landroid/view/View;Landroid/graphics/Rect;Z)Z
-HSPLandroid/view/ViewRootImpl;->requestDisallowInterceptTouchEvent(Z)V
-HSPLandroid/view/ViewRootImpl;->requestFitSystemWindows()V
-HSPLandroid/view/ViewRootImpl;->requestLayout()V+]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;
-HSPLandroid/view/ViewRootImpl;->requestLayoutDuringLayout(Landroid/view/View;)Z
-HSPLandroid/view/ViewRootImpl;->requestTransparentRegion(Landroid/view/View;)V
-HSPLandroid/view/ViewRootImpl;->scheduleConsumeBatchedInput()V
-HSPLandroid/view/ViewRootImpl;->scheduleTraversals()V+]Landroid/os/Looper;Landroid/os/Looper;]Landroid/view/ViewRootImpl$ViewRootHandler;Landroid/view/ViewRootImpl$ViewRootHandler;]Landroid/os/MessageQueue;Landroid/os/MessageQueue;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Landroid/view/Choreographer;Landroid/view/Choreographer;
-HSPLandroid/view/ViewRootImpl;->scrollToRectOrFocus(Landroid/graphics/Rect;Z)Z
-HSPLandroid/view/ViewRootImpl;->sendBackKeyEvent(I)V
-HSPLandroid/view/ViewRootImpl;->setAccessibilityFocus(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;)V
-HSPLandroid/view/ViewRootImpl;->setAccessibilityWindowAttributesIfNeeded()V
-HSPLandroid/view/ViewRootImpl;->setActivityConfigCallback(Landroid/view/ViewRootImpl$ActivityConfigCallback;)V
-HSPLandroid/view/ViewRootImpl;->setBoundsLayerCrop(Landroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/view/ViewRootImpl;->setFrame(Landroid/graphics/Rect;Z)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/InsetsController;Landroid/view/InsetsController;
-HSPLandroid/view/ViewRootImpl;->setLayoutParams(Landroid/view/WindowManager$LayoutParams;Z)V+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;
-HSPLandroid/view/ViewRootImpl;->setOnContentApplyWindowInsetsListener(Landroid/view/Window$OnContentApplyWindowInsetsListener;)V
-HSPLandroid/view/ViewRootImpl;->setTag()V
-HSPLandroid/view/ViewRootImpl;->setView(Landroid/view/View;Landroid/view/WindowManager$LayoutParams;Landroid/view/View;I)V+]Landroid/view/IWindowSession;Landroid/view/IWindowSession$Stub$Proxy;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/view/View;Lcom/android/internal/policy/DecorView;]Landroid/content/res/CompatibilityInfo;Landroid/content/res/CompatibilityInfo$1;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/view/InsetsSourceControl$Array;Landroid/view/InsetsSourceControl$Array;]Landroid/view/InsetsController;Landroid/view/InsetsController;]Landroid/view/PendingInsetsController;Landroid/view/PendingInsetsController;]Lcom/android/internal/view/RootViewSurfaceTaker;Lcom/android/internal/policy/DecorView;]Landroid/view/FallbackEventHandler;Lcom/android/internal/policy/PhoneFallbackEventHandler;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/view/WindowLayout;Landroid/view/WindowLayout;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Landroid/view/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager;]Landroid/view/DisplayAdjustments;Landroid/view/DisplayAdjustments;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/view/Display;Landroid/view/Display;
-HSPLandroid/view/ViewRootImpl;->setWindowStopped(Z)V
-HSPLandroid/view/ViewRootImpl;->shouldDispatchCutout()Z
-HSPLandroid/view/ViewRootImpl;->shouldOptimizeMeasure(Landroid/view/WindowManager$LayoutParams;)Z
-HSPLandroid/view/ViewRootImpl;->shouldSetFrameRate()Z+]Landroid/view/Surface;Landroid/view/Surface;
-HSPLandroid/view/ViewRootImpl;->shouldSetFrameRateCategory()Z+]Landroid/view/Surface;Landroid/view/Surface;
-HSPLandroid/view/ViewRootImpl;->shouldUseDisplaySize(Landroid/view/WindowManager$LayoutParams;)Z
-HSPLandroid/view/ViewRootImpl;->systemGestureExclusionChanged()V
-HSPLandroid/view/ViewRootImpl;->unscheduleConsumeBatchedInput()V
-HSPLandroid/view/ViewRootImpl;->unscheduleTraversals()V
-HSPLandroid/view/ViewRootImpl;->updateBlastSurfaceIfNeeded()V+]Landroid/graphics/BLASTBufferQueue;Landroid/graphics/BLASTBufferQueue;]Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;
-HSPLandroid/view/ViewRootImpl;->updateBoundsLayer(Landroid/view/SurfaceControl$Transaction;)Z
-HSPLandroid/view/ViewRootImpl;->updateCaptionInsets()Z
-HSPLandroid/view/ViewRootImpl;->updateCompatSysUiVisibility(III)V
-HSPLandroid/view/ViewRootImpl;->updateCompatSystemUiVisibilityInfo(IIII)V
-HSPLandroid/view/ViewRootImpl;->updateConfiguration(I)V
-HSPLandroid/view/ViewRootImpl;->updateContentDrawBounds()Z+]Landroid/view/WindowCallbacks;Lcom/android/internal/policy/DecorView;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ViewRootImpl;->updateForceDarkMode()V
-HSPLandroid/view/ViewRootImpl;->updateInternalDisplay(ILandroid/content/res/Resources;)V
-HSPLandroid/view/ViewRootImpl;->updateKeepClearForAccessibilityFocusRect()V
-HSPLandroid/view/ViewRootImpl;->updateKeepClearRectsForView(Landroid/view/View;)V
-HSPLandroid/view/ViewRootImpl;->updateOpacity(Landroid/view/WindowManager$LayoutParams;ZZ)V
-HSPLandroid/view/ViewRootImpl;->updateSyncInProgressCount(Landroid/window/SurfaceSyncGroup;)V
-HSPLandroid/view/ViewRootImpl;->updateSystemGestureExclusionRectsForView(Landroid/view/View;)V
-HSPLandroid/view/ViewRootImpl;->windowFocusChanged(Z)V
-HSPLandroid/view/ViewRootInsetsControllerHost;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootInsetsControllerHost;->dipToPx(I)I
-HSPLandroid/view/ViewRootInsetsControllerHost;->dispatchWindowInsetsAnimationEnd(Landroid/view/WindowInsetsAnimation;)V
-HSPLandroid/view/ViewRootInsetsControllerHost;->getHandler()Landroid/os/Handler;
-HSPLandroid/view/ViewRootInsetsControllerHost;->getInputMethodManager()Landroid/view/inputmethod/InputMethodManager;
-HSPLandroid/view/ViewRootInsetsControllerHost;->getSystemBarsAppearance()I
-HSPLandroid/view/ViewRootInsetsControllerHost;->getSystemBarsBehavior()I
-HSPLandroid/view/ViewRootInsetsControllerHost;->getTranslator()Landroid/content/res/CompatibilityInfo$Translator;
-HSPLandroid/view/ViewRootInsetsControllerHost;->getWindowToken()Landroid/os/IBinder;
-HSPLandroid/view/ViewRootInsetsControllerHost;->hasAnimationCallbacks()Z
-HSPLandroid/view/ViewRootInsetsControllerHost;->isSystemBarsAppearanceControlled()Z
-HSPLandroid/view/ViewRootInsetsControllerHost;->notifyInsetsChanged()V
-HSPLandroid/view/ViewRootInsetsControllerHost;->updateCompatSysUiVisibility(III)V
-HSPLandroid/view/ViewRootRectTracker$ViewInfo;-><init>(Landroid/view/ViewRootRectTracker;Landroid/view/View;)V
-HSPLandroid/view/ViewRootRectTracker$ViewInfo;->getView()Landroid/view/View;
-HSPLandroid/view/ViewRootRectTracker$ViewInfo;->update()I
-HSPLandroid/view/ViewRootRectTracker;->-$$Nest$mgetTrackedRectsForView(Landroid/view/ViewRootRectTracker;Landroid/view/View;)Ljava/util/List;
-HSPLandroid/view/ViewRootRectTracker;-><init>(Ljava/util/function/Function;)V
-HSPLandroid/view/ViewRootRectTracker;->computeChangedRects()Ljava/util/List;
-HSPLandroid/view/ViewRootRectTracker;->computeChanges()Z
-HSPLandroid/view/ViewRootRectTracker;->getTrackedRectsForView(Landroid/view/View;)Ljava/util/List;
-HSPLandroid/view/ViewRootRectTracker;->updateRectsForView(Landroid/view/View;)V
-HSPLandroid/view/ViewStructure;-><init>()V
-HSPLandroid/view/ViewStructure;->setImportantForAutofill(I)V
-HSPLandroid/view/ViewStub;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/view/ViewStub;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/view/ViewStub;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/view/ViewStub;->inflate()Landroid/view/View;
-HSPLandroid/view/ViewStub;->setLayoutInflater(Landroid/view/LayoutInflater;)V
-HSPLandroid/view/ViewStub;->setLayoutResource(I)V
-HSPLandroid/view/ViewStub;->setOnInflateListener(Landroid/view/ViewStub$OnInflateListener;)V
-HSPLandroid/view/ViewStub;->setVisibility(I)V
-HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray$Access;-><init>()V
-HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray$Access;->get(I)Ljava/lang/Object;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray$Access;->size()I
-HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;-><init>()V
-HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->add(Ljava/lang/Object;)V
-HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->addAll(Landroid/view/ViewTreeObserver$CopyOnWriteArray;)V
-HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->end()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->getArray()Ljava/util/ArrayList;
-HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->remove(Ljava/lang/Object;)V
-HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->size()I+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->start()Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/ViewTreeObserver$InternalInsetsInfo;-><init>()V
-HSPLandroid/view/ViewTreeObserver$InternalInsetsInfo;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/ViewTreeObserver$InternalInsetsInfo;->isEmpty()Z
-HSPLandroid/view/ViewTreeObserver$InternalInsetsInfo;->reset()V
-HSPLandroid/view/ViewTreeObserver$InternalInsetsInfo;->set(Landroid/view/ViewTreeObserver$InternalInsetsInfo;)V
-HSPLandroid/view/ViewTreeObserver$InternalInsetsInfo;->setTouchableInsets(I)V
-HSPLandroid/view/ViewTreeObserver;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/ViewTreeObserver;->addOnComputeInternalInsetsListener(Landroid/view/ViewTreeObserver$OnComputeInternalInsetsListener;)V
-HSPLandroid/view/ViewTreeObserver;->addOnDrawListener(Landroid/view/ViewTreeObserver$OnDrawListener;)V
-HSPLandroid/view/ViewTreeObserver;->addOnGlobalLayoutListener(Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V
-HSPLandroid/view/ViewTreeObserver;->addOnPreDrawListener(Landroid/view/ViewTreeObserver$OnPreDrawListener;)V
-HSPLandroid/view/ViewTreeObserver;->addOnScrollChangedListener(Landroid/view/ViewTreeObserver$OnScrollChangedListener;)V
-HSPLandroid/view/ViewTreeObserver;->captureFrameCommitCallbacks()Ljava/util/ArrayList;
-HSPLandroid/view/ViewTreeObserver;->checkIsAlive()V
-HSPLandroid/view/ViewTreeObserver;->dispatchOnComputeInternalInsets(Landroid/view/ViewTreeObserver$InternalInsetsInfo;)V
-HSPLandroid/view/ViewTreeObserver;->dispatchOnDraw()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/view/ViewTreeObserver$OnDrawListener;Landroid/widget/Editor$2;
-HSPLandroid/view/ViewTreeObserver;->dispatchOnEnterAnimationComplete()V
-HSPLandroid/view/ViewTreeObserver;->dispatchOnGlobalLayout()V+]Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;]Landroid/view/ViewTreeObserver$CopyOnWriteArray;Landroid/view/ViewTreeObserver$CopyOnWriteArray;
-HSPLandroid/view/ViewTreeObserver;->dispatchOnPreDraw()Z+]Landroid/view/ViewTreeObserver$OnPreDrawListener;missing_types]Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;]Landroid/view/ViewTreeObserver$CopyOnWriteArray;Landroid/view/ViewTreeObserver$CopyOnWriteArray;
-HSPLandroid/view/ViewTreeObserver;->dispatchOnScrollChanged()V
-HSPLandroid/view/ViewTreeObserver;->dispatchOnSystemGestureExclusionRectsChanged(Ljava/util/List;)V
-HSPLandroid/view/ViewTreeObserver;->dispatchOnTouchModeChanged(Z)V
-HSPLandroid/view/ViewTreeObserver;->dispatchOnWindowAttachedChange(Z)V
-HSPLandroid/view/ViewTreeObserver;->dispatchOnWindowFocusChange(Z)V
-HSPLandroid/view/ViewTreeObserver;->dispatchOnWindowShown()V
-HSPLandroid/view/ViewTreeObserver;->dispatchOnWindowVisibilityChange(I)V
-HSPLandroid/view/ViewTreeObserver;->hasComputeInternalInsetsListeners()Z
-HSPLandroid/view/ViewTreeObserver;->isAlive()Z
-HSPLandroid/view/ViewTreeObserver;->kill()V
-HSPLandroid/view/ViewTreeObserver;->merge(Landroid/view/ViewTreeObserver;)V
-HSPLandroid/view/ViewTreeObserver;->removeGlobalOnLayoutListener(Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V
-HSPLandroid/view/ViewTreeObserver;->removeOnComputeInternalInsetsListener(Landroid/view/ViewTreeObserver$OnComputeInternalInsetsListener;)V
-HSPLandroid/view/ViewTreeObserver;->removeOnDrawListener(Landroid/view/ViewTreeObserver$OnDrawListener;)V
-HSPLandroid/view/ViewTreeObserver;->removeOnGlobalLayoutListener(Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V
-HSPLandroid/view/ViewTreeObserver;->removeOnPreDrawListener(Landroid/view/ViewTreeObserver$OnPreDrawListener;)V
-HSPLandroid/view/ViewTreeObserver;->removeOnScrollChangedListener(Landroid/view/ViewTreeObserver$OnScrollChangedListener;)V
-HSPLandroid/view/Window;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/Window;->addFlags(I)V
-HSPLandroid/view/Window;->addOnFrameMetricsAvailableListener(Landroid/view/Window$OnFrameMetricsAvailableListener;Landroid/os/Handler;)V
-HSPLandroid/view/Window;->adjustLayoutParamsForSubWindow(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/view/Window;->clearFlags(I)V
-HSPLandroid/view/Window;->dispatchWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/view/Window;->findViewById(I)Landroid/view/View;
-HSPLandroid/view/Window;->getAttributes()Landroid/view/WindowManager$LayoutParams;
-HSPLandroid/view/Window;->getCallback()Landroid/view/Window$Callback;
-HSPLandroid/view/Window;->getColorMode()I
-HSPLandroid/view/Window;->getContainer()Landroid/view/Window;
-HSPLandroid/view/Window;->getContext()Landroid/content/Context;
-HSPLandroid/view/Window;->getDefaultFeatures(Landroid/content/Context;)I
-HSPLandroid/view/Window;->getFeatures()I
-HSPLandroid/view/Window;->getForcedWindowFlags()I
-HSPLandroid/view/Window;->getLocalFeatures()I
-HSPLandroid/view/Window;->getWindowControllerCallback()Landroid/view/Window$WindowControllerCallback;
-HSPLandroid/view/Window;->getWindowManager()Landroid/view/WindowManager;
-HSPLandroid/view/Window;->getWindowStyle()Landroid/content/res/TypedArray;
-HSPLandroid/view/Window;->hasFeature(I)Z
-HSPLandroid/view/Window;->hasSoftInputMode()Z
-HSPLandroid/view/Window;->haveDimAmount()Z
-HSPLandroid/view/Window;->isDestroyed()Z
-HSPLandroid/view/Window;->isOutOfBounds(Landroid/content/Context;Landroid/view/MotionEvent;)Z
-HSPLandroid/view/Window;->isOverlayWithDecorCaptionEnabled()Z
-HSPLandroid/view/Window;->isWideColorGamut()Z
-HSPLandroid/view/Window;->makeActive()V
-HSPLandroid/view/Window;->onDrawLegacyNavigationBarBackgroundChanged(Z)Z
-HSPLandroid/view/Window;->removeOnFrameMetricsAvailableListener(Landroid/view/Window$OnFrameMetricsAvailableListener;)V
-HSPLandroid/view/Window;->requestFeature(I)Z
-HSPLandroid/view/Window;->setAttributes(Landroid/view/WindowManager$LayoutParams;)V+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/view/Window;Lcom/android/internal/policy/PhoneWindow;
-HSPLandroid/view/Window;->setBackgroundBlurRadius(I)V
-HSPLandroid/view/Window;->setCallback(Landroid/view/Window$Callback;)V
-HSPLandroid/view/Window;->setCloseOnTouchOutside(Z)V
-HSPLandroid/view/Window;->setCloseOnTouchOutsideIfNotSet(Z)V
-HSPLandroid/view/Window;->setColorMode(I)V
-HSPLandroid/view/Window;->setDefaultWindowFormat(I)V
-HSPLandroid/view/Window;->setFlags(II)V
-HSPLandroid/view/Window;->setGravity(I)V
-HSPLandroid/view/Window;->setLayout(II)V
-HSPLandroid/view/Window;->setOnWindowDismissedCallback(Landroid/view/Window$OnWindowDismissedCallback;)V
-HSPLandroid/view/Window;->setPreferMinimalPostProcessing(Z)V
-HSPLandroid/view/Window;->setSoftInputMode(I)V
-HSPLandroid/view/Window;->setType(I)V
-HSPLandroid/view/Window;->setWindowAnimations(I)V
-HSPLandroid/view/Window;->setWindowControllerCallback(Landroid/view/Window$WindowControllerCallback;)V
-HSPLandroid/view/Window;->setWindowManager(Landroid/view/WindowManager;Landroid/os/IBinder;Ljava/lang/String;Z)V
-HSPLandroid/view/Window;->shouldCloseOnTouch(Landroid/content/Context;Landroid/view/MotionEvent;)Z
-HSPLandroid/view/WindowInsets$Builder;-><init>()V
-HSPLandroid/view/WindowInsets$Builder;-><init>(Landroid/view/WindowInsets;)V
-HSPLandroid/view/WindowInsets$Builder;->build()Landroid/view/WindowInsets;
-HSPLandroid/view/WindowInsets$Builder;->setSystemWindowInsets(Landroid/graphics/Insets;)Landroid/view/WindowInsets$Builder;
-HSPLandroid/view/WindowInsets$Side;->all()I
-HSPLandroid/view/WindowInsets$Type;->all()I
-HSPLandroid/view/WindowInsets$Type;->captionBar()I
-HSPLandroid/view/WindowInsets$Type;->defaultVisible()I
-HSPLandroid/view/WindowInsets$Type;->displayCutout()I
-HSPLandroid/view/WindowInsets$Type;->hasCompatSystemBars(I)Z
-HSPLandroid/view/WindowInsets$Type;->ime()I
-HSPLandroid/view/WindowInsets$Type;->indexOf(I)I
-HSPLandroid/view/WindowInsets$Type;->navigationBars()I
-HSPLandroid/view/WindowInsets$Type;->statusBars()I
-HSPLandroid/view/WindowInsets$Type;->systemBars()I
-HSPLandroid/view/WindowInsets$Type;->systemGestures()I
-HSPLandroid/view/WindowInsets$Type;->toString(I)Ljava/lang/String;
-HSPLandroid/view/WindowInsets;-><init>([Landroid/graphics/Insets;[Landroid/graphics/Insets;[ZZIILandroid/view/DisplayCutout;Landroid/view/RoundedCorners;Landroid/view/PrivacyIndicatorBounds;Landroid/view/DisplayShape;IZ[[Landroid/graphics/Rect;[[Landroid/graphics/Rect;II)V+]Landroid/view/DisplayCutout;Landroid/view/DisplayCutout;][Landroid/graphics/Insets;[Landroid/graphics/Insets;][[Landroid/graphics/Rect;[[Landroid/graphics/Rect;
-HSPLandroid/view/WindowInsets;->assignCompatInsets([Landroid/graphics/Insets;Landroid/graphics/Rect;)V
-HSPLandroid/view/WindowInsets;->consumeDisplayCutout()Landroid/view/WindowInsets;
-HSPLandroid/view/WindowInsets;->consumeStableInsets()Landroid/view/WindowInsets;
-HSPLandroid/view/WindowInsets;->consumeSystemWindowInsets()Landroid/view/WindowInsets;
-HSPLandroid/view/WindowInsets;->displayCutoutCopyConstructorArgument(Landroid/view/WindowInsets;)Landroid/view/DisplayCutout;
-HSPLandroid/view/WindowInsets;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/WindowInsets;->getDisplayCutout()Landroid/view/DisplayCutout;
-HSPLandroid/view/WindowInsets;->getInsets(I)Landroid/graphics/Insets;
-HSPLandroid/view/WindowInsets;->getInsets([Landroid/graphics/Insets;I)Landroid/graphics/Insets;
-HSPLandroid/view/WindowInsets;->getInsetsIgnoringVisibility(I)Landroid/graphics/Insets;
-HSPLandroid/view/WindowInsets;->getMandatorySystemGestureInsets()Landroid/graphics/Insets;
-HSPLandroid/view/WindowInsets;->getStableInsetBottom()I
-HSPLandroid/view/WindowInsets;->getStableInsetLeft()I
-HSPLandroid/view/WindowInsets;->getStableInsetRight()I
-HSPLandroid/view/WindowInsets;->getStableInsetTop()I
-HSPLandroid/view/WindowInsets;->getStableInsets()Landroid/graphics/Insets;
-HSPLandroid/view/WindowInsets;->getSystemGestureInsets()Landroid/graphics/Insets;
-HSPLandroid/view/WindowInsets;->getSystemWindowInsetBottom()I
-HSPLandroid/view/WindowInsets;->getSystemWindowInsetLeft()I
-HSPLandroid/view/WindowInsets;->getSystemWindowInsetRight()I
-HSPLandroid/view/WindowInsets;->getSystemWindowInsetTop()I
-HSPLandroid/view/WindowInsets;->getSystemWindowInsets()Landroid/graphics/Insets;
-HSPLandroid/view/WindowInsets;->getSystemWindowInsetsAsRect()Landroid/graphics/Rect;
-HSPLandroid/view/WindowInsets;->inset(IIII)Landroid/view/WindowInsets;
-HSPLandroid/view/WindowInsets;->inset(Landroid/graphics/Insets;)Landroid/view/WindowInsets;
-HSPLandroid/view/WindowInsets;->insetInsets(Landroid/graphics/Insets;IIII)Landroid/graphics/Insets;
-HSPLandroid/view/WindowInsets;->insetInsets([Landroid/graphics/Insets;IIII)[Landroid/graphics/Insets;
-HSPLandroid/view/WindowInsets;->insetUnchecked(IIII)Landroid/view/WindowInsets;
-HSPLandroid/view/WindowInsets;->isConsumed()Z
-HSPLandroid/view/WindowInsets;->isRound()Z
-HSPLandroid/view/WindowInsets;->replaceSystemWindowInsets(IIII)Landroid/view/WindowInsets;
-HSPLandroid/view/WindowInsetsAnimation$Bounds;-><init>(Landroid/graphics/Insets;Landroid/graphics/Insets;)V
-HSPLandroid/view/WindowInsetsAnimation$Callback;-><init>(I)V
-HSPLandroid/view/WindowInsetsAnimation;-><init>(ILandroid/view/animation/Interpolator;J)V
-HSPLandroid/view/WindowInsetsAnimation;->getTypeMask()I
-HSPLandroid/view/WindowInsetsAnimation;->setAlpha(F)V
-HSPLandroid/view/WindowLayout;-><clinit>()V
-HSPLandroid/view/WindowLayout;-><init>()V
-HSPLandroid/view/WindowLayout;->computeFrames(Landroid/view/WindowManager$LayoutParams;Landroid/view/InsetsState;Landroid/graphics/Rect;Landroid/graphics/Rect;IIIIFLandroid/window/ClientWindowFrames;)V+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/view/DisplayCutout;Landroid/view/DisplayCutout;]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HSPLandroid/view/WindowLayout;->computeSurfaceSize(Landroid/view/WindowManager$LayoutParams;Landroid/graphics/Rect;IILandroid/graphics/Rect;ZLandroid/graphics/Point;)V+]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HSPLandroid/view/WindowLeaked;-><init>(Ljava/lang/String;)V
-HSPLandroid/view/WindowManager$LayoutParams$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/WindowManager$LayoutParams;
-HSPLandroid/view/WindowManager$LayoutParams$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/WindowManager$LayoutParams;-><init>()V
-HSPLandroid/view/WindowManager$LayoutParams;-><init>(IIIII)V
-HSPLandroid/view/WindowManager$LayoutParams;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/WindowManager$LayoutParams;->copyFrom(Landroid/view/WindowManager$LayoutParams;)I+]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HSPLandroid/view/WindowManager$LayoutParams;->forRotation(I)Landroid/view/WindowManager$LayoutParams;
-HSPLandroid/view/WindowManager$LayoutParams;->getColorMode()I
-HSPLandroid/view/WindowManager$LayoutParams;->getFitInsetsSides()I
-HSPLandroid/view/WindowManager$LayoutParams;->getFitInsetsTypes()I
-HSPLandroid/view/WindowManager$LayoutParams;->getTitle()Ljava/lang/CharSequence;
-HSPLandroid/view/WindowManager$LayoutParams;->isFitInsetsIgnoringVisibility()Z
-HSPLandroid/view/WindowManager$LayoutParams;->isFullscreen()Z
-HSPLandroid/view/WindowManager$LayoutParams;->mayUseInputMethod(I)Z
-HSPLandroid/view/WindowManager$LayoutParams;->setColorMode(I)V
-HSPLandroid/view/WindowManager$LayoutParams;->setFitInsetsIgnoringVisibility(Z)V
-HSPLandroid/view/WindowManager$LayoutParams;->setFitInsetsSides(I)V
-HSPLandroid/view/WindowManager$LayoutParams;->setFitInsetsTypes(I)V
-HSPLandroid/view/WindowManager$LayoutParams;->setSurfaceInsets(Landroid/view/View;ZZ)V
-HSPLandroid/view/WindowManager$LayoutParams;->setTitle(Ljava/lang/CharSequence;)V
-HSPLandroid/view/WindowManager$LayoutParams;->writeToParcel(Landroid/os/Parcel;I)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/view/WindowManager;->hasWindowExtensionsEnabled()Z
-HSPLandroid/view/WindowManagerGlobal$1;-><init>()V
-HSPLandroid/view/WindowManagerGlobal$2;-><init>(Landroid/view/WindowManagerGlobal;)V
-HSPLandroid/view/WindowManagerGlobal$TrustedPresentationListener;-><clinit>()V
-HSPLandroid/view/WindowManagerGlobal$TrustedPresentationListener;-><init>(Landroid/view/WindowManagerGlobal;)V
-HSPLandroid/view/WindowManagerGlobal$TrustedPresentationListener;-><init>(Landroid/view/WindowManagerGlobal;Landroid/view/WindowManagerGlobal$TrustedPresentationListener-IA;)V
-HSPLandroid/view/WindowManagerGlobal;-><init>()V
-HSPLandroid/view/WindowManagerGlobal;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;Landroid/view/Display;Landroid/view/Window;I)V
-HSPLandroid/view/WindowManagerGlobal;->closeAll(Landroid/os/IBinder;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/view/WindowManagerGlobal;->closeAllExceptView(Landroid/os/IBinder;Landroid/view/View;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/view/WindowManagerGlobal;->doRemoveView(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/WindowManagerGlobal;->dumpGfxInfo(Ljava/io/FileDescriptor;[Ljava/lang/String;)V
-HSPLandroid/view/WindowManagerGlobal;->findViewLocked(Landroid/view/View;Z)I+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/WindowManagerGlobal;->getInstance()Landroid/view/WindowManagerGlobal;
-HSPLandroid/view/WindowManagerGlobal;->getRootViews(Landroid/os/IBinder;)Ljava/util/ArrayList;
-HSPLandroid/view/WindowManagerGlobal;->getWindowManagerService()Landroid/view/IWindowManager;
-HSPLandroid/view/WindowManagerGlobal;->getWindowSession()Landroid/view/IWindowSession;
-HSPLandroid/view/WindowManagerGlobal;->getWindowView(Landroid/os/IBinder;)Landroid/view/View;
-HSPLandroid/view/WindowManagerGlobal;->initialize()V
-HSPLandroid/view/WindowManagerGlobal;->peekWindowSession()Landroid/view/IWindowSession;
-HSPLandroid/view/WindowManagerGlobal;->removeView(Landroid/view/View;Z)V
-HSPLandroid/view/WindowManagerGlobal;->removeViewLocked(IZ)V
-HSPLandroid/view/WindowManagerGlobal;->setStoppedState(Landroid/os/IBinder;Z)V
-HSPLandroid/view/WindowManagerGlobal;->trimMemory(I)V
-HSPLandroid/view/WindowManagerGlobal;->updateViewLayout(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V+]Landroid/view/View;Lcom/android/internal/policy/DecorView;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/view/WindowManagerImpl;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/WindowManagerImpl;-><init>(Landroid/content/Context;Landroid/view/Window;Landroid/os/IBinder;)V
-HSPLandroid/view/WindowManagerImpl;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/view/WindowManagerImpl;->applyTokens(Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/view/WindowManagerImpl;->assertWindowContextTypeMatches(I)V
-HSPLandroid/view/WindowManagerImpl;->createLocalWindowManager(Landroid/view/Window;)Landroid/view/WindowManagerImpl;
-HSPLandroid/view/WindowManagerImpl;->createWindowContextWindowManager(Landroid/content/Context;)Landroid/view/WindowManager;
-HSPLandroid/view/WindowManagerImpl;->getCurrentWindowMetrics()Landroid/view/WindowMetrics;
-HSPLandroid/view/WindowManagerImpl;->getDefaultDisplay()Landroid/view/Display;
-HSPLandroid/view/WindowManagerImpl;->getMaximumWindowMetrics()Landroid/view/WindowMetrics;
-HSPLandroid/view/WindowManagerImpl;->removeView(Landroid/view/View;)V
-HSPLandroid/view/WindowManagerImpl;->removeViewImmediate(Landroid/view/View;)V
-HSPLandroid/view/WindowManagerImpl;->updateViewLayout(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V+]Landroid/view/WindowManagerGlobal;Landroid/view/WindowManagerGlobal;
-HSPLandroid/view/WindowMetrics;-><init>(Landroid/graphics/Rect;Landroid/view/WindowInsets;)V
-HSPLandroid/view/WindowMetrics;-><init>(Landroid/graphics/Rect;Ljava/util/function/Supplier;F)V
-HSPLandroid/view/WindowMetrics;->getBounds()Landroid/graphics/Rect;
-HSPLandroid/view/WindowMetrics;->getWindowInsets()Landroid/view/WindowInsets;
-HSPLandroid/view/accessibility/AccessibilityInteractionClient;->hasAnyDirectConnection()Z
-HSPLandroid/view/accessibility/AccessibilityManager$1;-><init>(Landroid/view/accessibility/AccessibilityManager;)V
-HSPLandroid/view/accessibility/AccessibilityManager$1;->notifyServicesStateChanged(J)V
-HSPLandroid/view/accessibility/AccessibilityManager$1;->setFocusAppearance(II)V
-HSPLandroid/view/accessibility/AccessibilityManager$1;->setState(I)V
-HSPLandroid/view/accessibility/AccessibilityManager$MyCallback;-><init>(Landroid/view/accessibility/AccessibilityManager;)V
-HSPLandroid/view/accessibility/AccessibilityManager$MyCallback;-><init>(Landroid/view/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager$MyCallback-IA;)V
-HSPLandroid/view/accessibility/AccessibilityManager$MyCallback;->handleMessage(Landroid/os/Message;)Z
-HSPLandroid/view/accessibility/AccessibilityManager;-><init>(Landroid/content/Context;Landroid/view/accessibility/IAccessibilityManager;I)V
-HSPLandroid/view/accessibility/AccessibilityManager;->addAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;)Z
-HSPLandroid/view/accessibility/AccessibilityManager;->addAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;Landroid/os/Handler;)V
-HSPLandroid/view/accessibility/AccessibilityManager;->addHighTextContrastStateChangeListener(Landroid/view/accessibility/AccessibilityManager$HighTextContrastChangeListener;Landroid/os/Handler;)V
-HSPLandroid/view/accessibility/AccessibilityManager;->addTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;)Z
-HSPLandroid/view/accessibility/AccessibilityManager;->addTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;Landroid/os/Handler;)V
-HSPLandroid/view/accessibility/AccessibilityManager;->getEnabledAccessibilityServiceList(I)Ljava/util/List;
-HSPLandroid/view/accessibility/AccessibilityManager;->getInstalledAccessibilityServiceList()Ljava/util/List;
-HSPLandroid/view/accessibility/AccessibilityManager;->getInstance(Landroid/content/Context;)Landroid/view/accessibility/AccessibilityManager;
-HSPLandroid/view/accessibility/AccessibilityManager;->getRecommendedTimeoutMillis(II)I
-HSPLandroid/view/accessibility/AccessibilityManager;->getServiceLocked()Landroid/view/accessibility/IAccessibilityManager;
-HSPLandroid/view/accessibility/AccessibilityManager;->hasAnyDirectConnection()Z
-HSPLandroid/view/accessibility/AccessibilityManager;->initialFocusAppearanceLocked(Landroid/content/res/Resources;)V
-HSPLandroid/view/accessibility/AccessibilityManager;->isEnabled()Z+]Landroid/view/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager;
-HSPLandroid/view/accessibility/AccessibilityManager;->isHighTextContrastEnabled()Z
-HSPLandroid/view/accessibility/AccessibilityManager;->isTouchExplorationEnabled()Z
-HSPLandroid/view/accessibility/AccessibilityManager;->notifyAccessibilityStateChanged()V
-HSPLandroid/view/accessibility/AccessibilityManager;->registerSystemAction(Landroid/app/RemoteAction;I)V
-HSPLandroid/view/accessibility/AccessibilityManager;->removeAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;)Z
-HSPLandroid/view/accessibility/AccessibilityManager;->removeHighTextContrastStateChangeListener(Landroid/view/accessibility/AccessibilityManager$HighTextContrastChangeListener;)V
-HSPLandroid/view/accessibility/AccessibilityManager;->removeTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;)Z
-HSPLandroid/view/accessibility/AccessibilityManager;->setStateLocked(I)V
-HSPLandroid/view/accessibility/AccessibilityManager;->tryConnectToServiceLocked(Landroid/view/accessibility/IAccessibilityManager;)V
-HSPLandroid/view/accessibility/AccessibilityManager;->unregisterSystemAction(I)V
-HSPLandroid/view/accessibility/AccessibilityManager;->updateAccessibilityTracingState(I)V
-HSPLandroid/view/accessibility/AccessibilityManager;->updateFocusAppearanceLocked(II)V
-HSPLandroid/view/accessibility/AccessibilityManager;->updateUiTimeout(J)V
-HSPLandroid/view/accessibility/AccessibilityNodeIdManager;-><init>()V
-HSPLandroid/view/accessibility/AccessibilityNodeIdManager;->getInstance()Landroid/view/accessibility/AccessibilityNodeIdManager;
-HSPLandroid/view/accessibility/AccessibilityNodeIdManager;->registerViewWithId(Landroid/view/View;I)V
-HSPLandroid/view/accessibility/AccessibilityNodeIdManager;->unregisterViewWithId(I)V
-HSPLandroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;-><init>(ILjava/lang/CharSequence;)V
-HSPLandroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;->getId()I
-HSPLandroid/view/accessibility/AccessibilityNodeProvider;-><init>()V
-HSPLandroid/view/accessibility/CaptioningManager$CaptionStyle;->getTypeface()Landroid/graphics/Typeface;
-HSPLandroid/view/accessibility/CaptioningManager$CaptionStyle;->hasBackgroundColor()Z
-HSPLandroid/view/accessibility/CaptioningManager$CaptionStyle;->hasEdgeColor()Z
-HSPLandroid/view/accessibility/CaptioningManager$CaptionStyle;->hasEdgeType()Z
-HSPLandroid/view/accessibility/CaptioningManager$CaptionStyle;->hasForegroundColor()Z
-HSPLandroid/view/accessibility/CaptioningManager$CaptionStyle;->hasWindowColor()Z
-HSPLandroid/view/accessibility/CaptioningManager$CaptioningChangeListener;-><init>()V
-HSPLandroid/view/accessibility/CaptioningManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/accessibility/CaptioningManager;->addCaptioningChangeListener(Landroid/view/accessibility/CaptioningManager$CaptioningChangeListener;)V
-HSPLandroid/view/accessibility/CaptioningManager;->getFontScale()F
-HSPLandroid/view/accessibility/CaptioningManager;->getLocale()Ljava/util/Locale;
-HSPLandroid/view/accessibility/CaptioningManager;->getRawUserStyle()I
-HSPLandroid/view/accessibility/CaptioningManager;->getUserStyle()Landroid/view/accessibility/CaptioningManager$CaptionStyle;
-HSPLandroid/view/accessibility/CaptioningManager;->isEnabled()Z
-HSPLandroid/view/accessibility/CaptioningManager;->registerObserver(Ljava/lang/String;)V
-HSPLandroid/view/accessibility/CaptioningManager;->removeCaptioningChangeListener(Landroid/view/accessibility/CaptioningManager$CaptioningChangeListener;)V
-HSPLandroid/view/accessibility/IAccessibilityInteractionConnection$Stub;-><init>()V
-HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->addClient(Landroid/view/accessibility/IAccessibilityManagerClient;I)J
-HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->getEnabledAccessibilityServiceList(II)Ljava/util/List;
-HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->getFocusColor()I
-HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->getFocusStrokeWidth()I
-HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->getRecommendedTimeoutMillis()J
-HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->registerSystemAction(Landroid/app/RemoteAction;I)V
-HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->unregisterSystemAction(I)V
-HSPLandroid/view/accessibility/IAccessibilityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/accessibility/IAccessibilityManager;
-HSPLandroid/view/accessibility/IAccessibilityManagerClient$Stub;-><init>()V
-HSPLandroid/view/accessibility/IAccessibilityManagerClient$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/accessibility/IAccessibilityManagerClient$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
-HSPLandroid/view/accessibility/IAccessibilityManagerClient$Stub;->getMaxTransactionId()I
-HSPLandroid/view/accessibility/IAccessibilityManagerClient$Stub;->getTransactionName(I)Ljava/lang/String;
-HSPLandroid/view/accessibility/IAccessibilityManagerClient$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/view/accessibility/WeakSparseArray$WeakReferenceWithId;-><init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;I)V
-HSPLandroid/view/accessibility/WeakSparseArray;-><init>()V
-HSPLandroid/view/accessibility/WeakSparseArray;->append(ILjava/lang/Object;)V
-HSPLandroid/view/accessibility/WeakSparseArray;->remove(I)V
-HSPLandroid/view/accessibility/WeakSparseArray;->removeUnreachableValues()V
-HSPLandroid/view/animation/AccelerateDecelerateInterpolator;-><init>()V
-HSPLandroid/view/animation/AccelerateDecelerateInterpolator;->createNativeInterpolator()J
-HSPLandroid/view/animation/AccelerateDecelerateInterpolator;->getInterpolation(F)F
-HSPLandroid/view/animation/AccelerateInterpolator;-><init>()V
-HSPLandroid/view/animation/AccelerateInterpolator;-><init>(F)V
-HSPLandroid/view/animation/AccelerateInterpolator;-><init>(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;)V
-HSPLandroid/view/animation/AccelerateInterpolator;->getInterpolation(F)F
-HSPLandroid/view/animation/AlphaAnimation;-><init>(FF)V
-HSPLandroid/view/animation/AlphaAnimation;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/view/animation/AlphaAnimation;->applyTransformation(FLandroid/view/animation/Transformation;)V
-HSPLandroid/view/animation/AlphaAnimation;->hasAlpha()Z
-HSPLandroid/view/animation/AlphaAnimation;->willChangeBounds()Z
-HSPLandroid/view/animation/AlphaAnimation;->willChangeTransformationMatrix()Z
-HSPLandroid/view/animation/Animation$1;->run()V
-HSPLandroid/view/animation/Animation$3;->run()V
-HSPLandroid/view/animation/Animation$Description;-><init>()V
-HSPLandroid/view/animation/Animation$Description;->parseValue(Landroid/util/TypedValue;Landroid/content/Context;)Landroid/view/animation/Animation$Description;
-HSPLandroid/view/animation/Animation;-><init>()V
-HSPLandroid/view/animation/Animation;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/view/animation/Animation;->cancel()V
-HSPLandroid/view/animation/Animation;->detach()V
-HSPLandroid/view/animation/Animation;->dispatchAnimationEnd()V
-HSPLandroid/view/animation/Animation;->dispatchAnimationStart()V
-HSPLandroid/view/animation/Animation;->ensureInterpolator()V
-HSPLandroid/view/animation/Animation;->finalize()V
-HSPLandroid/view/animation/Animation;->getDuration()J
-HSPLandroid/view/animation/Animation;->getFillAfter()Z
-HSPLandroid/view/animation/Animation;->getInvalidateRegion(IIIILandroid/graphics/RectF;Landroid/view/animation/Transformation;)V
-HSPLandroid/view/animation/Animation;->getScaleFactor()F
-HSPLandroid/view/animation/Animation;->getStartOffset()J
-HSPLandroid/view/animation/Animation;->getTransformation(JLandroid/view/animation/Transformation;)Z
-HSPLandroid/view/animation/Animation;->getTransformation(JLandroid/view/animation/Transformation;F)Z
-HSPLandroid/view/animation/Animation;->getTransformationAt(FLandroid/view/animation/Transformation;)V
-HSPLandroid/view/animation/Animation;->hasAlpha()Z
-HSPLandroid/view/animation/Animation;->hasEnded()Z
-HSPLandroid/view/animation/Animation;->hasStarted()Z
-HSPLandroid/view/animation/Animation;->initialize(IIII)V
-HSPLandroid/view/animation/Animation;->initializeInvalidateRegion(IIII)V
-HSPLandroid/view/animation/Animation;->isFillEnabled()Z
-HSPLandroid/view/animation/Animation;->isInitialized()Z
-HSPLandroid/view/animation/Animation;->reset()V
-HSPLandroid/view/animation/Animation;->resolveSize(IFII)F
-HSPLandroid/view/animation/Animation;->setAnimationListener(Landroid/view/animation/Animation$AnimationListener;)V
-HSPLandroid/view/animation/Animation;->setBackdropColor(I)V
-HSPLandroid/view/animation/Animation;->setBackgroundColor(I)V
-HSPLandroid/view/animation/Animation;->setDetachWallpaper(Z)V
-HSPLandroid/view/animation/Animation;->setDuration(J)V
-HSPLandroid/view/animation/Animation;->setFillAfter(Z)V
-HSPLandroid/view/animation/Animation;->setFillBefore(Z)V
-HSPLandroid/view/animation/Animation;->setFillEnabled(Z)V
-HSPLandroid/view/animation/Animation;->setHasRoundedCorners(Z)V
-HSPLandroid/view/animation/Animation;->setInterpolator(Landroid/content/Context;I)V
-HSPLandroid/view/animation/Animation;->setInterpolator(Landroid/view/animation/Interpolator;)V
-HSPLandroid/view/animation/Animation;->setListenerHandler(Landroid/os/Handler;)V
-HSPLandroid/view/animation/Animation;->setRepeatCount(I)V
-HSPLandroid/view/animation/Animation;->setRepeatMode(I)V
-HSPLandroid/view/animation/Animation;->setShowBackdrop(Z)V
-HSPLandroid/view/animation/Animation;->setShowWallpaper(Z)V
-HSPLandroid/view/animation/Animation;->setStartOffset(J)V
-HSPLandroid/view/animation/Animation;->setStartTime(J)V
-HSPLandroid/view/animation/Animation;->setZAdjustment(I)V
-HSPLandroid/view/animation/Animation;->willChangeBounds()Z
-HSPLandroid/view/animation/Animation;->willChangeTransformationMatrix()Z
-HSPLandroid/view/animation/AnimationSet;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/view/animation/AnimationSet;-><init>(Z)V
-HSPLandroid/view/animation/AnimationSet;->addAnimation(Landroid/view/animation/Animation;)V
-HSPLandroid/view/animation/AnimationSet;->getDuration()J
-HSPLandroid/view/animation/AnimationSet;->getTransformation(JLandroid/view/animation/Transformation;)Z
-HSPLandroid/view/animation/AnimationSet;->hasAlpha()Z
-HSPLandroid/view/animation/AnimationSet;->init()V
-HSPLandroid/view/animation/AnimationSet;->initialize(IIII)V
-HSPLandroid/view/animation/AnimationSet;->initializeInvalidateRegion(IIII)V
-HSPLandroid/view/animation/AnimationSet;->reset()V
-HSPLandroid/view/animation/AnimationSet;->restoreChildrenStartOffset()V
-HSPLandroid/view/animation/AnimationSet;->setDuration(J)V
-HSPLandroid/view/animation/AnimationSet;->setFillAfter(Z)V
-HSPLandroid/view/animation/AnimationSet;->setFillBefore(Z)V
-HSPLandroid/view/animation/AnimationSet;->setFlag(IZ)V
-HSPLandroid/view/animation/AnimationSet;->setRepeatMode(I)V
-HSPLandroid/view/animation/AnimationSet;->setStartOffset(J)V
-HSPLandroid/view/animation/AnimationSet;->setStartTime(J)V
-HSPLandroid/view/animation/AnimationSet;->willChangeBounds()Z
-HSPLandroid/view/animation/AnimationSet;->willChangeTransformationMatrix()Z
-HSPLandroid/view/animation/AnimationUtils$1;->initialValue()Landroid/view/animation/AnimationUtils$AnimationState;
-HSPLandroid/view/animation/AnimationUtils$1;->initialValue()Ljava/lang/Object;
-HSPLandroid/view/animation/AnimationUtils$AnimationState;-><init>()V
-HSPLandroid/view/animation/AnimationUtils$AnimationState;-><init>(Landroid/view/animation/AnimationUtils$AnimationState-IA;)V
-HSPLandroid/view/animation/AnimationUtils;->createAnimationFromXml(Landroid/content/Context;Lorg/xmlpull/v1/XmlPullParser;)Landroid/view/animation/Animation;
-HSPLandroid/view/animation/AnimationUtils;->createAnimationFromXml(Landroid/content/Context;Lorg/xmlpull/v1/XmlPullParser;Landroid/view/animation/AnimationSet;Landroid/util/AttributeSet;)Landroid/view/animation/Animation;
-HSPLandroid/view/animation/AnimationUtils;->createInterpolatorFromXml(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Lorg/xmlpull/v1/XmlPullParser;)Landroid/view/animation/Interpolator;
-HSPLandroid/view/animation/AnimationUtils;->currentAnimationTimeMillis()J
-HSPLandroid/view/animation/AnimationUtils;->loadAnimation(Landroid/content/Context;I)Landroid/view/animation/Animation;
-HSPLandroid/view/animation/AnimationUtils;->loadInterpolator(Landroid/content/Context;I)Landroid/view/animation/Interpolator;
-HSPLandroid/view/animation/AnimationUtils;->loadInterpolator(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;I)Landroid/view/animation/Interpolator;
-HSPLandroid/view/animation/AnimationUtils;->lockAnimationClock(J)V
-HSPLandroid/view/animation/AnimationUtils;->lockAnimationClock(JJ)V+]Ljava/lang/ThreadLocal;Landroid/view/animation/AnimationUtils$1;
-HSPLandroid/view/animation/AnimationUtils;->unlockAnimationClock()V+]Ljava/lang/ThreadLocal;Landroid/view/animation/AnimationUtils$1;
-HSPLandroid/view/animation/BaseInterpolator;-><init>()V
-HSPLandroid/view/animation/BaseInterpolator;->getChangingConfiguration()I
-HSPLandroid/view/animation/BaseInterpolator;->setChangingConfiguration(I)V
-HSPLandroid/view/animation/DecelerateInterpolator;-><init>()V
-HSPLandroid/view/animation/DecelerateInterpolator;-><init>(F)V
-HSPLandroid/view/animation/DecelerateInterpolator;-><init>(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;)V
-HSPLandroid/view/animation/DecelerateInterpolator;->getInterpolation(F)F
-HSPLandroid/view/animation/LinearInterpolator;-><init>()V
-HSPLandroid/view/animation/LinearInterpolator;->createNativeInterpolator()J
-HSPLandroid/view/animation/LinearInterpolator;->getInterpolation(F)F
-HSPLandroid/view/animation/OvershootInterpolator;-><init>()V
-HSPLandroid/view/animation/OvershootInterpolator;-><init>(F)V
-HSPLandroid/view/animation/OvershootInterpolator;->getInterpolation(F)F
-HSPLandroid/view/animation/PathInterpolator;-><init>(FFFF)V
-HSPLandroid/view/animation/PathInterpolator;-><init>(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;)V
-HSPLandroid/view/animation/PathInterpolator;->createNativeInterpolator()J
-HSPLandroid/view/animation/PathInterpolator;->getInterpolation(F)F
-HSPLandroid/view/animation/PathInterpolator;->initCubic(FFFF)V
-HSPLandroid/view/animation/PathInterpolator;->initPath(Landroid/graphics/Path;)V+]Landroid/graphics/Path;Landroid/graphics/Path;
-HSPLandroid/view/animation/PathInterpolator;->parseInterpolatorFromTypeArray(Landroid/content/res/TypedArray;)V
-HSPLandroid/view/animation/ScaleAnimation;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/view/animation/ScaleAnimation;->applyTransformation(FLandroid/view/animation/Transformation;)V
-HSPLandroid/view/animation/ScaleAnimation;->initialize(IIII)V
-HSPLandroid/view/animation/ScaleAnimation;->initializePivotPoint()V
-HSPLandroid/view/animation/ScaleAnimation;->resolveScale(FIIII)F
-HSPLandroid/view/animation/Transformation;-><init>()V
-HSPLandroid/view/animation/Transformation;->clear()V
-HSPLandroid/view/animation/Transformation;->compose(Landroid/view/animation/Transformation;)V
-HSPLandroid/view/animation/Transformation;->getAlpha()F
-HSPLandroid/view/animation/Transformation;->getInsets()Landroid/graphics/Insets;
-HSPLandroid/view/animation/Transformation;->getMatrix()Landroid/graphics/Matrix;
-HSPLandroid/view/animation/Transformation;->getTransformationType()I
-HSPLandroid/view/animation/Transformation;->set(Landroid/view/animation/Transformation;)V
-HSPLandroid/view/animation/Transformation;->setAlpha(F)V
-HSPLandroid/view/animation/Transformation;->setInsets(Landroid/graphics/Insets;)V
-HSPLandroid/view/animation/TranslateAnimation;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/view/animation/TranslateAnimation;->applyTransformation(FLandroid/view/animation/Transformation;)V
-HSPLandroid/view/animation/TranslateAnimation;->initialize(IIII)V
-HSPLandroid/view/autofill/AutofillClientController;-><clinit>()V
-HSPLandroid/view/autofill/AutofillClientController;-><init>(Landroid/app/Activity;)V
-HSPLandroid/view/autofill/AutofillClientController;->autofillClientGetActivityToken()Landroid/os/IBinder;
-HSPLandroid/view/autofill/AutofillClientController;->autofillClientGetComponentName()Landroid/content/ComponentName;
-HSPLandroid/view/autofill/AutofillClientController;->autofillClientIsFillUiShowing()Z
-HSPLandroid/view/autofill/AutofillClientController;->autofillClientRequestHideFillUi()Z
-HSPLandroid/view/autofill/AutofillClientController;->autofillClientResetableStateAvailable()V
-HSPLandroid/view/autofill/AutofillClientController;->autofillClientRunOnUiThread(Ljava/lang/Runnable;)V
-HSPLandroid/view/autofill/AutofillClientController;->enableAutofillCompatibilityIfNeeded()V
-HSPLandroid/view/autofill/AutofillClientController;->getAutofillManager()Landroid/view/autofill/AutofillManager;
-HSPLandroid/view/autofill/AutofillClientController;->getNextAutofillId()I
-HSPLandroid/view/autofill/AutofillClientController;->isDisablingEnterExitEventForAutofill()Z
-HSPLandroid/view/autofill/AutofillClientController;->onActivityAttached(Landroid/app/Application;)V
-HSPLandroid/view/autofill/AutofillClientController;->onActivityCreated(Landroid/os/Bundle;)V
-HSPLandroid/view/autofill/AutofillClientController;->onActivityDestroyed()V
-HSPLandroid/view/autofill/AutofillClientController;->onActivityFinish(Landroid/content/Intent;)V
-HSPLandroid/view/autofill/AutofillClientController;->onActivityPaused()V
-HSPLandroid/view/autofill/AutofillClientController;->onActivityPerformResume(Z)V
-HSPLandroid/view/autofill/AutofillClientController;->onActivityResumed()V
-HSPLandroid/view/autofill/AutofillClientController;->onActivityStarted()V
-HSPLandroid/view/autofill/AutofillClientController;->onActivityStopped(Landroid/content/Intent;Z)V
-HSPLandroid/view/autofill/AutofillClientController;->onSaveInstanceState(Landroid/os/Bundle;)V
-HSPLandroid/view/autofill/AutofillClientController;->onStartActivity(Landroid/content/Intent;Landroid/content/Intent;)V
-HSPLandroid/view/autofill/AutofillFeatureFlags$$ExternalSyntheticLambda0;-><init>()V
-HSPLandroid/view/autofill/AutofillFeatureFlags$$ExternalSyntheticLambda1;-><init>()V
-HSPLandroid/view/autofill/AutofillFeatureFlags$$ExternalSyntheticLambda1;->test(Ljava/lang/Object;)Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->getDenylistStringFromFlag()Ljava/lang/String;
-HSPLandroid/view/autofill/AutofillFeatureFlags;->getFillDialogEnabledHints()[Ljava/lang/String;
-HSPLandroid/view/autofill/AutofillFeatureFlags;->getNonAutofillableImeActionIdSetFromFlag()Ljava/util/Set;
-HSPLandroid/view/autofill/AutofillFeatureFlags;->isFillDialogEnabled()Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->isTriggerFillRequestOnUnimportantViewEnabled()Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->lambda$getFillDialogEnabledHints$1(Ljava/lang/String;)Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->shouldIncludeAllChildrenViewInAssistStructure()Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->shouldIncludeAllViewsAutofillTypeNotNoneInAssistStructrue()Z
-HSPLandroid/view/autofill/AutofillId$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/autofill/AutofillId;
-HSPLandroid/view/autofill/AutofillId$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/autofill/AutofillId;-><init>(I)V
-HSPLandroid/view/autofill/AutofillId;-><init>(IIJI)V
-HSPLandroid/view/autofill/AutofillId;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/autofill/AutofillId;->getViewId()I
-HSPLandroid/view/autofill/AutofillId;->hasSession()Z
-HSPLandroid/view/autofill/AutofillId;->hashCode()I
-HSPLandroid/view/autofill/AutofillId;->isVirtualInt()Z
-HSPLandroid/view/autofill/AutofillId;->isVirtualLong()Z
-HSPLandroid/view/autofill/AutofillId;->resetSessionId()V
-HSPLandroid/view/autofill/AutofillId;->toString()Ljava/lang/String;
-HSPLandroid/view/autofill/AutofillId;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/autofill/AutofillManager$AugmentedAutofillManagerClient;-><init>(Landroid/view/autofill/AutofillManager;)V
-HSPLandroid/view/autofill/AutofillManager$AugmentedAutofillManagerClient;->getView(Landroid/view/autofill/AutofillManager;Landroid/view/autofill/AutofillId;)Landroid/view/View;
-HSPLandroid/view/autofill/AutofillManager$AugmentedAutofillManagerClient;->getViewCoordinates(Landroid/view/autofill/AutofillId;)Landroid/graphics/Rect;
-HSPLandroid/view/autofill/AutofillManager$AugmentedAutofillManagerClient;->getViewNodeParcelable(Landroid/view/autofill/AutofillId;)Landroid/app/assist/AssistStructure$ViewNodeParcelable;
-HSPLandroid/view/autofill/AutofillManager$AutofillCallback;-><init>()V
-HSPLandroid/view/autofill/AutofillManager$AutofillManagerClient;->getAugmentedAutofillClient(Lcom/android/internal/os/IResultReceiver;)V
-HSPLandroid/view/autofill/AutofillManager$AutofillManagerClient;->lambda$setState$0(Landroid/view/autofill/AutofillManager;I)V
-HSPLandroid/view/autofill/AutofillManager$AutofillManagerClient;->setState(I)V
-HSPLandroid/view/autofill/AutofillManager;->-$$Nest$mpost(Landroid/view/autofill/AutofillManager;Ljava/lang/Runnable;)V
-HSPLandroid/view/autofill/AutofillManager;-><init>(Landroid/content/Context;Landroid/view/autofill/IAutoFillManager;)V
-HSPLandroid/view/autofill/AutofillManager;->cancelLocked()V
-HSPLandroid/view/autofill/AutofillManager;->cancelSessionLocked()V
-HSPLandroid/view/autofill/AutofillManager;->getAugmentedAutofillClient(Lcom/android/internal/os/IResultReceiver;)V
-HSPLandroid/view/autofill/AutofillManager;->getAutofillServiceComponentName()Landroid/content/ComponentName;
-HSPLandroid/view/autofill/AutofillManager;->getClient()Landroid/view/autofill/AutofillManager$AutofillClient;
-HSPLandroid/view/autofill/AutofillManager;->hasAutofillFeature()Z
-HSPLandroid/view/autofill/AutofillManager;->hasFillDialogUiFeature()Z
-HSPLandroid/view/autofill/AutofillManager;->isActiveLocked()Z
-HSPLandroid/view/autofill/AutofillManager;->isDisabledByServiceLocked()Z
-HSPLandroid/view/autofill/AutofillManager;->isEnabled()Z
-HSPLandroid/view/autofill/AutofillManager;->notifyValueChanged(Landroid/view/View;)V
-HSPLandroid/view/autofill/AutofillManager;->notifyViewEntered(Landroid/view/View;I)V
-HSPLandroid/view/autofill/AutofillManager;->notifyViewEnteredForAugmentedAutofill(Landroid/view/View;)V
-HSPLandroid/view/autofill/AutofillManager;->notifyViewEnteredForFillDialog(Landroid/view/View;)V
-HSPLandroid/view/autofill/AutofillManager;->notifyViewExited(Landroid/view/View;)V
-HSPLandroid/view/autofill/AutofillManager;->notifyViewExitedLocked(Landroid/view/View;)V
-HSPLandroid/view/autofill/AutofillManager;->notifyViewVisibilityChangedInternal(Landroid/view/View;IZZ)V
-HSPLandroid/view/autofill/AutofillManager;->onActivityFinishing()V
-HSPLandroid/view/autofill/AutofillManager;->onInvisibleForAutofill(Z)V
-HSPLandroid/view/autofill/AutofillManager;->onSaveInstanceState(Landroid/os/Bundle;)V
-HSPLandroid/view/autofill/AutofillManager;->post(Ljava/lang/Runnable;)V
-HSPLandroid/view/autofill/AutofillManager;->registerCallback(Landroid/view/autofill/AutofillManager$AutofillCallback;)V
-HSPLandroid/view/autofill/AutofillManager;->requestHideFillUi()V
-HSPLandroid/view/autofill/AutofillManager;->requestHideFillUi(Landroid/view/autofill/AutofillId;Z)V
-HSPLandroid/view/autofill/AutofillManager;->resetSessionLocked(Z)V
-HSPLandroid/view/autofill/AutofillManager;->setSessionFinished(ILjava/util/List;)V
-HSPLandroid/view/autofill/AutofillManager;->setState(I)V
-HSPLandroid/view/autofill/AutofillManager;->shouldIgnoreViewEnteredLocked(Landroid/view/autofill/AutofillId;I)Z
-HSPLandroid/view/autofill/AutofillManager;->startAutofillIfNeededLocked(Landroid/view/View;)Z
-HSPLandroid/view/autofill/AutofillManager;->startSessionLocked(Landroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;I)V
-HSPLandroid/view/autofill/AutofillManager;->tryAddServiceClientIfNeededLocked()Z
-HSPLandroid/view/autofill/AutofillManager;->updateSessionLocked(Landroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;II)V
-HSPLandroid/view/autofill/AutofillValue$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/autofill/AutofillValue;
-HSPLandroid/view/autofill/AutofillValue$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/autofill/AutofillValue;-><init>(ILjava/lang/Object;)V
-HSPLandroid/view/autofill/AutofillValue;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/autofill/AutofillValue;->forText(Ljava/lang/CharSequence;)Landroid/view/autofill/AutofillValue;
-HSPLandroid/view/autofill/AutofillValue;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/autofill/IAugmentedAutofillManagerClient$Stub;-><init>()V
-HSPLandroid/view/autofill/IAugmentedAutofillManagerClient$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/autofill/IAugmentedAutofillManagerClient$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->addClient(Landroid/view/autofill/IAutoFillManagerClient;Landroid/content/ComponentName;ILcom/android/internal/os/IResultReceiver;)V
-HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->cancelSession(II)V
-HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->getAutofillServiceComponentName(Lcom/android/internal/os/IResultReceiver;)V
-HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->removeClient(Landroid/view/autofill/IAutoFillManagerClient;I)V
-HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->setHasCallback(IIZ)V
-HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->startSession(Landroid/os/IBinder;Landroid/os/IBinder;Landroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;IZILandroid/content/ComponentName;ZLcom/android/internal/os/IResultReceiver;)V
-HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->updateSession(ILandroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;III)V
-HSPLandroid/view/autofill/IAutoFillManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/autofill/IAutoFillManager;
-HSPLandroid/view/autofill/IAutoFillManagerClient$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/autofill/IAutoFillManagerClient$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/view/contentcapture/ContentCaptureEvent;-><init>(II)V
-HSPLandroid/view/contentcapture/ContentCaptureEvent;-><init>(IIJ)V
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->addAutofillId(Landroid/view/autofill/AutofillId;)Landroid/view/contentcapture/ContentCaptureEvent;
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->getId()Landroid/view/autofill/AutofillId;
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->getIds()Ljava/util/List;
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->getSessionId()I
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->getText()Ljava/lang/CharSequence;
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->getType()I
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->mergeEvent(Landroid/view/contentcapture/ContentCaptureEvent;)V
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->setAutofillId(Landroid/view/autofill/AutofillId;)Landroid/view/contentcapture/ContentCaptureEvent;
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->setBounds(Landroid/graphics/Rect;)Landroid/view/contentcapture/ContentCaptureEvent;
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->setComposingIndex(II)Landroid/view/contentcapture/ContentCaptureEvent;
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->setInsets(Landroid/graphics/Insets;)Landroid/view/contentcapture/ContentCaptureEvent;
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->setSelectionIndex(II)Landroid/view/contentcapture/ContentCaptureEvent;
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->setText(Ljava/lang/CharSequence;)Landroid/view/contentcapture/ContentCaptureEvent;
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->setViewNode(Landroid/view/contentcapture/ViewNode;)Landroid/view/contentcapture/ContentCaptureEvent;
-HSPLandroid/view/contentcapture/ContentCaptureEvent;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/contentcapture/ContentCaptureHelper;->getLoggingLevelAsString(I)Ljava/lang/String;
-HSPLandroid/view/contentcapture/ContentCaptureHelper;->setLoggingLevel(I)V
-HSPLandroid/view/contentcapture/ContentCaptureManager$LocalDataShareAdapterResourceManager;-><init>()V
-HSPLandroid/view/contentcapture/ContentCaptureManager$StrippedContext;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/contentcapture/ContentCaptureManager;-><init>(Landroid/content/Context;Landroid/view/contentcapture/IContentCaptureManager;Landroid/content/ContentCaptureOptions;)V
-HSPLandroid/view/contentcapture/ContentCaptureManager;->isContentCaptureEnabled()Z
-HSPLandroid/view/contentcapture/ContentCaptureManager;->onActivityCreated(Landroid/os/IBinder;Landroid/os/IBinder;Landroid/content/ComponentName;)V
-HSPLandroid/view/contentcapture/ContentCaptureManager;->setFlushViewTreeAppearingEventDisabled(Z)V
-HSPLandroid/view/contentcapture/ContentCaptureManager;->updateWindowAttributes(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/view/contentcapture/ContentCaptureSession;-><init>()V
-HSPLandroid/view/contentcapture/ContentCaptureSession;-><init>(I)V
-HSPLandroid/view/contentcapture/ContentCaptureSession;->destroy()V
-HSPLandroid/view/contentcapture/ContentCaptureSession;->getFlushReasonAsString(I)Ljava/lang/String;
-HSPLandroid/view/contentcapture/ContentCaptureSession;->getId()I
-HSPLandroid/view/contentcapture/ContentCaptureSession;->getRandomSessionId()I
-HSPLandroid/view/contentcapture/ContentCaptureSession;->getStateAsString(I)Ljava/lang/String;
-HSPLandroid/view/contentcapture/ContentCaptureSession;->isContentCaptureEnabled()Z
-HSPLandroid/view/contentcapture/ContentCaptureSession;->newViewStructure(Landroid/view/View;)Landroid/view/ViewStructure;
-HSPLandroid/view/contentcapture/ContentCaptureSession;->notifyViewAppeared(Landroid/view/ViewStructure;)V
-HSPLandroid/view/contentcapture/ContentCaptureSession;->notifyViewTextChanged(Landroid/view/autofill/AutofillId;Ljava/lang/CharSequence;)V
-HSPLandroid/view/contentcapture/IContentCaptureDirectManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/view/contentcapture/IContentCaptureDirectManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/contentcapture/IContentCaptureDirectManager$Stub$Proxy;->sendEvents(Landroid/content/pm/ParceledListSlice;ILandroid/content/ContentCaptureOptions;)V
-HSPLandroid/view/contentcapture/IContentCaptureDirectManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/contentcapture/IContentCaptureDirectManager;
-HSPLandroid/view/contentcapture/IContentCaptureManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/view/contentcapture/IContentCaptureManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/contentcapture/IContentCaptureManager$Stub$Proxy;->finishSession(I)V
-HSPLandroid/view/contentcapture/IContentCaptureManager$Stub$Proxy;->registerContentCaptureOptionsCallback(Ljava/lang/String;Landroid/view/contentcapture/IContentCaptureOptionsCallback;)V
-HSPLandroid/view/contentcapture/IContentCaptureManager$Stub$Proxy;->startSession(Landroid/os/IBinder;Landroid/os/IBinder;Landroid/content/ComponentName;IILcom/android/internal/os/IResultReceiver;)V
-HSPLandroid/view/contentcapture/IContentCaptureManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/contentcapture/IContentCaptureManager;
-HSPLandroid/view/contentcapture/IContentCaptureOptionsCallback$Stub;-><init>()V
-HSPLandroid/view/contentcapture/IContentCaptureOptionsCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/contentcapture/IContentCaptureOptionsCallback$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
-HSPLandroid/view/contentcapture/IContentCaptureOptionsCallback$Stub;->getMaxTransactionId()I
-HSPLandroid/view/contentcapture/IContentCaptureOptionsCallback$Stub;->getTransactionName(I)Ljava/lang/String;
-HSPLandroid/view/contentcapture/IContentCaptureOptionsCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda10;->run()V
-HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda11;->run()V
-HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda12;->run()V
-HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda1;->run()V
-HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda2;->run()V
-HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda3;->run()V
-HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda4;->run()V
-HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda8;->run()V
-HSPLandroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver$$ExternalSyntheticLambda1;->run()V
-HSPLandroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver;-><init>(Landroid/view/contentcapture/MainContentCaptureSession;)V
-HSPLandroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver;->lambda$send$1(Landroid/view/contentcapture/MainContentCaptureSession;ILandroid/os/IBinder;)V
-HSPLandroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver;->send(ILandroid/os/Bundle;)V
-HSPLandroid/view/contentcapture/MainContentCaptureSession;-><init>(Landroid/view/contentcapture/ContentCaptureManager$StrippedContext;Landroid/view/contentcapture/ContentCaptureManager;Landroid/os/Handler;Landroid/view/contentcapture/IContentCaptureManager;)V
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->clearEvents()Landroid/content/pm/ParceledListSlice;
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->destroySession()V
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->flush(I)V
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->flushIfNeeded(I)V
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->getActivityName()Ljava/lang/String;
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->getDebugState()Ljava/lang/String;
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->getDebugState(I)Ljava/lang/String;
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->hasStarted()Z
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->isContentCaptureEnabled()Z
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->isDisabled()Z
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->notifyWindowBoundsChanged(ILandroid/graphics/Rect;)V
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->onDestroy()V
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->onSessionStarted(ILandroid/os/IBinder;)V
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->scheduleFlush(IZ)V
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->sendEvent(Landroid/view/contentcapture/ContentCaptureEvent;)V
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->sendEvent(Landroid/view/contentcapture/ContentCaptureEvent;Z)V
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->start(Landroid/os/IBinder;Landroid/os/IBinder;Landroid/content/ComponentName;I)V
-HSPLandroid/view/contentcapture/ViewNode$ViewNodeText;-><init>()V
-HSPLandroid/view/contentcapture/ViewNode$ViewNodeText;->isSimple()Z
-HSPLandroid/view/contentcapture/ViewNode$ViewNodeText;->writeToParcel(Landroid/os/Parcel;Z)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;-><init>(Landroid/view/View;)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->getNodeText()Landroid/view/contentcapture/ViewNode$ViewNodeText;
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setAutofillHints([Ljava/lang/String;)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setAutofillType(I)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setAutofillValue(Landroid/view/autofill/AutofillValue;)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setCheckable(Z)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setClassName(Ljava/lang/String;)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setClickable(Z)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setContentDescription(Ljava/lang/CharSequence;)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setDimens(IIIIII)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setEnabled(Z)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setFocusable(Z)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setFocused(Z)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setHint(Ljava/lang/CharSequence;)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setHintIdEntry(Ljava/lang/String;)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setId(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setInputType(I)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setLongClickable(Z)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setMaxTextEms(I)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setMaxTextLength(I)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setMinTextEms(I)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setOpaque(Z)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setReceiveContentMimeTypes([Ljava/lang/String;)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setSelected(Z)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setText(Ljava/lang/CharSequence;II)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setTextIdEntry(Ljava/lang/String;)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setTextLines([I[I)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setTextStyle(FIII)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setVisibility(I)V
-HSPLandroid/view/contentcapture/ViewNode;->-$$Nest$fputmReceiveContentMimeTypes(Landroid/view/contentcapture/ViewNode;[Ljava/lang/String;)V
-HSPLandroid/view/contentcapture/ViewNode;-><init>()V
-HSPLandroid/view/contentcapture/ViewNode;->writeSelfToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/contentcapture/ViewNode;->writeToParcel(Landroid/os/Parcel;Landroid/view/contentcapture/ViewNode;I)V
-HSPLandroid/view/inputmethod/BaseInputConnection;-><init>(Landroid/view/View;Z)V
-HSPLandroid/view/inputmethod/BaseInputConnection;-><init>(Landroid/view/inputmethod/InputMethodManager;Z)V
-HSPLandroid/view/inputmethod/BaseInputConnection;->beginBatchEdit()Z
-HSPLandroid/view/inputmethod/BaseInputConnection;->closeConnection()V
-HSPLandroid/view/inputmethod/BaseInputConnection;->commitText(Ljava/lang/CharSequence;I)Z
-HSPLandroid/view/inputmethod/BaseInputConnection;->deleteSurroundingText(II)Z
-HSPLandroid/view/inputmethod/BaseInputConnection;->endBatchEdit()Z
-HSPLandroid/view/inputmethod/BaseInputConnection;->endComposingRegionEditInternal()V
-HSPLandroid/view/inputmethod/BaseInputConnection;->ensureDefaultComposingSpans()V
-HSPLandroid/view/inputmethod/BaseInputConnection;->finishComposingText()Z
-HSPLandroid/view/inputmethod/BaseInputConnection;->getEditable()Landroid/text/Editable;
-HSPLandroid/view/inputmethod/BaseInputConnection;->getHandler()Landroid/os/Handler;
-HSPLandroid/view/inputmethod/BaseInputConnection;->getSelectedText(I)Ljava/lang/CharSequence;
-HSPLandroid/view/inputmethod/BaseInputConnection;->getTextAfterCursor(II)Ljava/lang/CharSequence;
-HSPLandroid/view/inputmethod/BaseInputConnection;->getTextBeforeCursor(II)Ljava/lang/CharSequence;
-HSPLandroid/view/inputmethod/BaseInputConnection;->removeComposingSpans(Landroid/text/Spannable;)V
-HSPLandroid/view/inputmethod/BaseInputConnection;->replaceText(Ljava/lang/CharSequence;IZ)V
-HSPLandroid/view/inputmethod/BaseInputConnection;->reportFullscreenMode(Z)Z
-HSPLandroid/view/inputmethod/BaseInputConnection;->sendCurrentText()V
-HSPLandroid/view/inputmethod/BaseInputConnection;->sendKeyEvent(Landroid/view/KeyEvent;)Z
-HSPLandroid/view/inputmethod/BaseInputConnection;->setComposingRegion(II)Z
-HSPLandroid/view/inputmethod/BaseInputConnection;->setComposingSpans(Landroid/text/Spannable;II)V
-HSPLandroid/view/inputmethod/BaseInputConnection;->setComposingText(Ljava/lang/CharSequence;I)Z
-HSPLandroid/view/inputmethod/CursorAnchorInfo$Builder;-><init>()V
-HSPLandroid/view/inputmethod/EditorInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/inputmethod/EditorInfo;
-HSPLandroid/view/inputmethod/EditorInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/inputmethod/EditorInfo;-><init>()V
-HSPLandroid/view/inputmethod/EditorInfo;->createCopyInternal()Landroid/view/inputmethod/EditorInfo;
-HSPLandroid/view/inputmethod/EditorInfo;->setInitialSurroundingSubText(Ljava/lang/CharSequence;I)V
-HSPLandroid/view/inputmethod/EditorInfo;->setInitialSurroundingText(Ljava/lang/CharSequence;)V
-HSPLandroid/view/inputmethod/EditorInfo;->setInitialToolType(I)V
-HSPLandroid/view/inputmethod/EditorInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/inputmethod/ExtractedTextRequest;-><init>()V
-HSPLandroid/view/inputmethod/IInputMethodManagerGlobalInvoker;-><clinit>()V
-HSPLandroid/view/inputmethod/IInputMethodManagerGlobalInvoker;->addClient(Lcom/android/internal/inputmethod/IInputMethodClient;Lcom/android/internal/inputmethod/IRemoteInputConnection;I)V
-HSPLandroid/view/inputmethod/IInputMethodManagerGlobalInvoker;->getImeTrackerService()Lcom/android/internal/inputmethod/IImeTracker;
-HSPLandroid/view/inputmethod/IInputMethodManagerGlobalInvoker;->getService()Lcom/android/internal/view/IInputMethodManager;
-HSPLandroid/view/inputmethod/IInputMethodManagerGlobalInvoker;->isAvailable()Z
-HSPLandroid/view/inputmethod/IInputMethodManagerGlobalInvoker;->isImeTraceEnabled()Z
-HSPLandroid/view/inputmethod/IInputMethodManagerGlobalInvoker;->removeImeSurfaceFromWindowAsync(Landroid/os/IBinder;)V
-HSPLandroid/view/inputmethod/IInputMethodManagerGlobalInvoker;->reportPerceptibleAsync(Landroid/os/IBinder;Z)V
-HSPLandroid/view/inputmethod/IInputMethodManagerGlobalInvoker;->startInputOrWindowGainedFocus(ILcom/android/internal/inputmethod/IInputMethodClient;Landroid/os/IBinder;IIILandroid/view/inputmethod/EditorInfo;Lcom/android/internal/inputmethod/IRemoteInputConnection;Lcom/android/internal/inputmethod/IRemoteAccessibilityInputConnection;IILandroid/window/ImeOnBackInvokedDispatcher;)Lcom/android/internal/inputmethod/InputBindResult;
-HSPLandroid/view/inputmethod/IInputMethodSessionInvoker;-><clinit>()V
-HSPLandroid/view/inputmethod/IInputMethodSessionInvoker;-><init>(Lcom/android/internal/inputmethod/IInputMethodSession;Landroid/os/Handler;)V
-HSPLandroid/view/inputmethod/IInputMethodSessionInvoker;->createOrNull(Lcom/android/internal/inputmethod/IInputMethodSession;)Landroid/view/inputmethod/IInputMethodSessionInvoker;
-HSPLandroid/view/inputmethod/IInputMethodSessionInvoker;->finishInput()V
-HSPLandroid/view/inputmethod/IInputMethodSessionInvoker;->finishInputInternal()V
-HSPLandroid/view/inputmethod/IInputMethodSessionInvoker;->updateSelection(IIIIII)V
-HSPLandroid/view/inputmethod/IInputMethodSessionInvoker;->updateSelectionInternal(IIIIII)V
-HSPLandroid/view/inputmethod/ImeTracker$1$$ExternalSyntheticLambda0;-><init>(Landroid/view/inputmethod/ImeTracker$1;)V
-HSPLandroid/view/inputmethod/ImeTracker$1;-><init>()V
-HSPLandroid/view/inputmethod/ImeTracker$1;->onProgress(Landroid/view/inputmethod/ImeTracker$Token;I)V
-HSPLandroid/view/inputmethod/ImeTracker$Debug$$ExternalSyntheticLambda0;-><init>(Ljava/lang/String;)V
-HSPLandroid/view/inputmethod/ImeTracker$Debug$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z
-HSPLandroid/view/inputmethod/ImeTracker$Debug$$ExternalSyntheticLambda1;-><init>()V
-HSPLandroid/view/inputmethod/ImeTracker$Debug$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/view/inputmethod/ImeTracker$Debug$$ExternalSyntheticLambda2;-><init>()V
-HSPLandroid/view/inputmethod/ImeTracker$Debug$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/view/inputmethod/ImeTracker$Debug;-><clinit>()V
-HSPLandroid/view/inputmethod/ImeTracker$Debug;->getFieldMapping(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/Map;
-HSPLandroid/view/inputmethod/ImeTracker$Debug;->getFieldValue(Ljava/lang/reflect/Field;)I
-HSPLandroid/view/inputmethod/ImeTracker$Debug;->lambda$getFieldMapping$0(Ljava/lang/String;Ljava/lang/reflect/Field;)Z
-HSPLandroid/view/inputmethod/ImeTracker$Debug;->originToString(I)Ljava/lang/String;
-HSPLandroid/view/inputmethod/ImeTracker$Debug;->phaseToString(I)Ljava/lang/String;
-HSPLandroid/view/inputmethod/ImeTracker$Token$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/inputmethod/ImeTracker$Token;
-HSPLandroid/view/inputmethod/ImeTracker$Token$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/inputmethod/ImeTracker$Token;->-$$Nest$fgetmTag(Landroid/view/inputmethod/ImeTracker$Token;)Ljava/lang/String;
-HSPLandroid/view/inputmethod/ImeTracker$Token;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/inputmethod/ImeTracker$Token;-><init>(Landroid/os/Parcel;Landroid/view/inputmethod/ImeTracker$Token-IA;)V
-HSPLandroid/view/inputmethod/ImeTracker$Token;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/inputmethod/ImeTracker;-><clinit>()V
-HSPLandroid/view/inputmethod/ImeTracker;->forLogging()Landroid/view/inputmethod/ImeTracker;
-HSPLandroid/view/inputmethod/InlineSuggestionsRequest$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/inputmethod/InlineSuggestionsRequest;
-HSPLandroid/view/inputmethod/InlineSuggestionsRequest$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/inputmethod/InlineSuggestionsRequest;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/inputmethod/InlineSuggestionsRequest;->onConstructed()V
-HSPLandroid/view/inputmethod/InlineSuggestionsRequest;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/inputmethod/InputConnectionWrapper;-><init>(Landroid/view/inputmethod/InputConnection;Z)V
-HSPLandroid/view/inputmethod/InputConnectionWrapper;->beginBatchEdit()Z
-HSPLandroid/view/inputmethod/InputConnectionWrapper;->closeConnection()V
-HSPLandroid/view/inputmethod/InputConnectionWrapper;->commitText(Ljava/lang/CharSequence;I)Z
-HSPLandroid/view/inputmethod/InputConnectionWrapper;->deleteSurroundingText(II)Z
-HSPLandroid/view/inputmethod/InputConnectionWrapper;->endBatchEdit()Z
-HSPLandroid/view/inputmethod/InputConnectionWrapper;->finishComposingText()Z
-HSPLandroid/view/inputmethod/InputConnectionWrapper;->getHandler()Landroid/os/Handler;
-HSPLandroid/view/inputmethod/InputConnectionWrapper;->getSelectedText(I)Ljava/lang/CharSequence;
-HSPLandroid/view/inputmethod/InputConnectionWrapper;->getTextAfterCursor(II)Ljava/lang/CharSequence;
-HSPLandroid/view/inputmethod/InputConnectionWrapper;->getTextBeforeCursor(II)Ljava/lang/CharSequence;
-HSPLandroid/view/inputmethod/InputConnectionWrapper;->reportFullscreenMode(Z)Z
-HSPLandroid/view/inputmethod/InputConnectionWrapper;->setComposingRegion(II)Z
-HSPLandroid/view/inputmethod/InputConnectionWrapper;->setComposingText(Ljava/lang/CharSequence;I)Z
-HSPLandroid/view/inputmethod/InputMethodInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/inputmethod/InputMethodInfo;
-HSPLandroid/view/inputmethod/InputMethodInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/inputmethod/InputMethodInfo;-><init>(Landroid/content/Context;Landroid/content/pm/ResolveInfo;Ljava/util/List;)V
-HSPLandroid/view/inputmethod/InputMethodInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/inputmethod/InputMethodInfo;->getId()Ljava/lang/String;
-HSPLandroid/view/inputmethod/InputMethodInfo;->getPackageName()Ljava/lang/String;
-HSPLandroid/view/inputmethod/InputMethodInfo;->getServiceInfo()Landroid/content/pm/ServiceInfo;
-HSPLandroid/view/inputmethod/InputMethodInfo;->getSubtypeAt(I)Landroid/view/inputmethod/InputMethodSubtype;
-HSPLandroid/view/inputmethod/InputMethodManager$1;->getReceivingDispatcher()Landroid/window/WindowOnBackInvokedDispatcher;
-HSPLandroid/view/inputmethod/InputMethodManager$2;-><init>(Landroid/view/inputmethod/InputMethodManager;)V
-HSPLandroid/view/inputmethod/InputMethodManager$2;->onBindMethod(Lcom/android/internal/inputmethod/InputBindResult;)V
-HSPLandroid/view/inputmethod/InputMethodManager$2;->onUnbindMethod(II)V
-HSPLandroid/view/inputmethod/InputMethodManager$2;->reportFullscreenMode(Z)V
-HSPLandroid/view/inputmethod/InputMethodManager$2;->setActive(ZZ)V
-HSPLandroid/view/inputmethod/InputMethodManager$BindState;-><init>(Lcom/android/internal/inputmethod/InputBindResult;)V
-HSPLandroid/view/inputmethod/InputMethodManager$DelegateImpl;-><init>(Landroid/view/inputmethod/InputMethodManager;)V
-HSPLandroid/view/inputmethod/InputMethodManager$DelegateImpl;->onPostWindowGainedFocus(Landroid/view/View;Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/view/inputmethod/InputMethodManager$DelegateImpl;->onPreWindowGainedFocus(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/inputmethod/InputMethodManager$DelegateImpl;->onScheduledCheckFocus(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/inputmethod/InputMethodManager$DelegateImpl;->onViewDetachedFromWindow(Landroid/view/View;Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/inputmethod/InputMethodManager$DelegateImpl;->onWindowDismissed(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/inputmethod/InputMethodManager$DelegateImpl;->setCurrentRootViewLocked(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/inputmethod/InputMethodManager$H$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/view/inputmethod/InputMethodManager$H;-><init>(Landroid/view/inputmethod/InputMethodManager;Landroid/os/Looper;)V
-HSPLandroid/view/inputmethod/InputMethodManager$H;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/view/inputmethod/InputMethodManager$ImeInputEventSender;->onInputEventFinished(IZ)V
-HSPLandroid/view/inputmethod/InputMethodManager$PendingEvent;->run()V
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$fgetmFullscreenMode(Landroid/view/inputmethod/InputMethodManager;)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$fgetmImeDispatcher(Landroid/view/inputmethod/InputMethodManager;)Landroid/window/ImeOnBackInvokedDispatcher;
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$fgetmImeInsetsConsumer(Landroid/view/inputmethod/InputMethodManager;)Landroid/view/ImeInsetsSourceConsumer;
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$fgetmNextServedView(Landroid/view/inputmethod/InputMethodManager;)Landroid/view/View;
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$fgetmRestartOnNextWindowFocus(Landroid/view/inputmethod/InputMethodManager;)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$fgetmServedView(Landroid/view/inputmethod/InputMethodManager;)Landroid/view/View;
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$fputmActive(Landroid/view/inputmethod/InputMethodManager;Z)V
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$fputmFullscreenMode(Landroid/view/inputmethod/InputMethodManager;Z)V
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$fputmRestartOnNextWindowFocus(Landroid/view/inputmethod/InputMethodManager;Z)V
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$mcheckFocusInternalLocked(Landroid/view/inputmethod/InputMethodManager;ZLandroid/view/ViewRootImpl;)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$mforAccessibilitySessionsLocked(Landroid/view/inputmethod/InputMethodManager;Ljava/util/function/Consumer;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$mgetServedViewLocked(Landroid/view/inputmethod/InputMethodManager;)Landroid/view/View;
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$mgetStartInputFlags(Landroid/view/inputmethod/InputMethodManager;Landroid/view/View;I)I
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$monViewFocusChangedInternal(Landroid/view/inputmethod/InputMethodManager;Landroid/view/View;Z)V
-HSPLandroid/view/inputmethod/InputMethodManager;->-$$Nest$mstartInputOnWindowFocusGainInternal(Landroid/view/inputmethod/InputMethodManager;ILandroid/view/View;III)Z
-HSPLandroid/view/inputmethod/InputMethodManager;-><init>(Lcom/android/internal/view/IInputMethodManager;ILandroid/os/Looper;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->areSameInputChannel(Landroid/view/InputChannel;Landroid/view/InputChannel;)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->canStartInput(Landroid/view/View;)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->checkFocus()V
-HSPLandroid/view/inputmethod/InputMethodManager;->checkFocusInternalLocked(ZLandroid/view/ViewRootImpl;)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->clearConnectionLocked()V
-HSPLandroid/view/inputmethod/InputMethodManager;->closeCurrentInput()V
-HSPLandroid/view/inputmethod/InputMethodManager;->createInputConnection(Landroid/view/View;)Landroid/util/Pair;
-HSPLandroid/view/inputmethod/InputMethodManager;->createInstance(ILandroid/os/Looper;)Landroid/view/inputmethod/InputMethodManager;
-HSPLandroid/view/inputmethod/InputMethodManager;->createRealInstance(ILandroid/os/Looper;)Landroid/view/inputmethod/InputMethodManager;
-HSPLandroid/view/inputmethod/InputMethodManager;->dispatchInputEvent(Landroid/view/InputEvent;Ljava/lang/Object;Landroid/view/inputmethod/InputMethodManager$FinishedInputEventCallback;Landroid/os/Handler;)I
-HSPLandroid/view/inputmethod/InputMethodManager;->dispatchKeyEventFromInputMethod(Landroid/view/View;Landroid/view/KeyEvent;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->ensureDefaultInstanceForDefaultDisplayIfNecessary()V
-HSPLandroid/view/inputmethod/InputMethodManager;->finishInputLocked()V
-HSPLandroid/view/inputmethod/InputMethodManager;->finishedInputEvent(IZZ)V
-HSPLandroid/view/inputmethod/InputMethodManager;->flushPendingEventsLocked()V
-HSPLandroid/view/inputmethod/InputMethodManager;->forAccessibilitySessionsLocked(Ljava/util/function/Consumer;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->forContext(Landroid/content/Context;)Landroid/view/inputmethod/InputMethodManager;
-HSPLandroid/view/inputmethod/InputMethodManager;->forContextInternal(ILandroid/os/Looper;)Landroid/view/inputmethod/InputMethodManager;
-HSPLandroid/view/inputmethod/InputMethodManager;->getDelegate()Landroid/view/inputmethod/InputMethodManager$DelegateImpl;
-HSPLandroid/view/inputmethod/InputMethodManager;->getEnabledInputMethodList()Ljava/util/List;
-HSPLandroid/view/inputmethod/InputMethodManager;->getEnabledInputMethodSubtypeList(Landroid/view/inputmethod/InputMethodInfo;Z)Ljava/util/List;
-HSPLandroid/view/inputmethod/InputMethodManager;->getFallbackInputMethodManagerIfNecessary(Landroid/view/View;)Landroid/view/inputmethod/InputMethodManager;
-HSPLandroid/view/inputmethod/InputMethodManager;->getServedViewLocked()Landroid/view/View;
-HSPLandroid/view/inputmethod/InputMethodManager;->getStartInputFlags(Landroid/view/View;I)I
-HSPLandroid/view/inputmethod/InputMethodManager;->hasServedByInputMethodLocked(Landroid/view/View;)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->hideSoftInputFromWindow(Landroid/os/IBinder;I)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->hideSoftInputFromWindow(Landroid/os/IBinder;ILandroid/os/ResultReceiver;)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->hideSoftInputFromWindow(Landroid/os/IBinder;ILandroid/os/ResultReceiver;I)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->invalidateInput(Landroid/view/View;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->isActive()Z
-HSPLandroid/view/inputmethod/InputMethodManager;->isActive(Landroid/view/View;)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->isCursorAnchorInfoEnabled()Z
-HSPLandroid/view/inputmethod/InputMethodManager;->isFullscreenMode()Z
-HSPLandroid/view/inputmethod/InputMethodManager;->isImeSessionAvailableLocked()Z
-HSPLandroid/view/inputmethod/InputMethodManager;->isInEditMode()Z
-HSPLandroid/view/inputmethod/InputMethodManager;->isInEditModeInternal()Z
-HSPLandroid/view/inputmethod/InputMethodManager;->isInputMethodSuppressingSpellChecker()Z
-HSPLandroid/view/inputmethod/InputMethodManager;->isSwitchingBetweenEquivalentNonEditableViews(Landroid/view/inputmethod/ViewFocusParameterInfo;IIII)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->onViewFocusChangedInternal(Landroid/view/View;Z)V
-HSPLandroid/view/inputmethod/InputMethodManager;->registerImeConsumer(Landroid/view/ImeInsetsSourceConsumer;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->removeImeSurface(Landroid/os/IBinder;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->reportInputConnectionOpened(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroid/os/Handler;Landroid/view/View;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->reportPerceptible(Landroid/os/IBinder;Z)V
-HSPLandroid/view/inputmethod/InputMethodManager;->restartInput(Landroid/view/View;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->sendInputEventOnMainLooperLocked(Landroid/view/inputmethod/InputMethodManager$PendingEvent;)I
-HSPLandroid/view/inputmethod/InputMethodManager;->showSoftInput(Landroid/view/View;I)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->showSoftInput(Landroid/view/View;ILandroid/os/ResultReceiver;)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->startInputInner(ILandroid/os/IBinder;III)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->startInputOnWindowFocusGainInternal(ILandroid/view/View;III)Z
-HSPLandroid/view/inputmethod/InputMethodManager;->unregisterImeConsumer(Landroid/view/ImeInsetsSourceConsumer;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->updateInputChannelLocked(Landroid/view/InputChannel;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->updateSelection(Landroid/view/View;IIII)V
-HSPLandroid/view/inputmethod/InputMethodManager;->viewClicked(Landroid/view/View;)V
-HSPLandroid/view/inputmethod/InputMethodManagerGlobal;->isImeTraceAvailable()Z
-HSPLandroid/view/inputmethod/InputMethodManagerGlobal;->isImeTraceEnabled()Z
-HSPLandroid/view/inputmethod/InputMethodSubtype$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/inputmethod/InputMethodSubtype;
-HSPLandroid/view/inputmethod/InputMethodSubtype$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/inputmethod/InputMethodSubtype;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/inputmethod/InputMethodSubtype;->getLocale()Ljava/lang/String;
-HSPLandroid/view/inputmethod/InputMethodSubtype;->getMode()Ljava/lang/String;
-HSPLandroid/view/inputmethod/InputMethodSubtype;->hashCode()I
-HSPLandroid/view/inputmethod/InputMethodSubtypeArray;->get(I)Landroid/view/inputmethod/InputMethodSubtype;
-HSPLandroid/view/inputmethod/RemoteInputConnectionImpl$1;-><init>(Landroid/view/inputmethod/RemoteInputConnectionImpl;)V
-HSPLandroid/view/inputmethod/RemoteInputConnectionImpl;-><init>(Landroid/os/Looper;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/InputMethodManager;Landroid/view/View;)V
-HSPLandroid/view/inputmethod/RemoteInputConnectionImpl;->dispatch(Ljava/lang/Runnable;)V
-HSPLandroid/view/inputmethod/RemoteInputConnectionImpl;->dispatchWithTracing(Ljava/lang/String;Ljava/lang/Runnable;)V
-HSPLandroid/view/inputmethod/RemoteInputConnectionImpl;->finishComposingTextFromImm()V
-HSPLandroid/view/inputmethod/RemoteInputConnectionImpl;->getInputConnection()Landroid/view/inputmethod/InputConnection;
-HSPLandroid/view/inputmethod/RemoteInputConnectionImpl;->isFinished()Z
-HSPLandroid/view/inputmethod/SurroundingText$1;-><init>()V
-HSPLandroid/view/inputmethod/SurroundingText;-><clinit>()V
-HSPLandroid/view/inputmethod/SurroundingText;-><init>(Ljava/lang/CharSequence;III)V
-HSPLandroid/view/inputmethod/SurroundingText;->copyWithParcelableSpans(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLandroid/view/inputmethod/SurroundingText;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/inputmethod/ViewFocusParameterInfo;-><init>(Landroid/view/inputmethod/EditorInfo;IIII)V
-HSPLandroid/view/inputmethod/ViewFocusParameterInfo;->sameAs(Landroid/view/inputmethod/EditorInfo;IIII)Z
-HSPLandroid/view/textclassifier/ConversationAction$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/ConversationAction;
-HSPLandroid/view/textclassifier/ConversationAction$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/ConversationAction;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/textclassifier/ConversationAction;->getAction()Landroid/app/RemoteAction;
-HSPLandroid/view/textclassifier/ConversationAction;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/textclassifier/ConversationActions$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/ConversationActions;
-HSPLandroid/view/textclassifier/ConversationActions$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/ConversationActions$Message$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/ConversationActions$Message;
-HSPLandroid/view/textclassifier/ConversationActions$Message$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/ConversationActions$Message;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/textclassifier/ConversationActions$Message;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/textclassifier/ConversationActions$Request$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/ConversationActions$Request;
-HSPLandroid/view/textclassifier/ConversationActions$Request$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/ConversationActions$Request;-><init>(Ljava/util/List;Landroid/view/textclassifier/TextClassifier$EntityConfig;ILjava/util/List;Landroid/os/Bundle;)V
-HSPLandroid/view/textclassifier/ConversationActions$Request;->readFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/ConversationActions$Request;
-HSPLandroid/view/textclassifier/ConversationActions$Request;->setSystemTextClassifierMetadata(Landroid/view/textclassifier/SystemTextClassifierMetadata;)V
-HSPLandroid/view/textclassifier/ConversationActions;-><init>(Ljava/util/List;Ljava/lang/String;)V
-HSPLandroid/view/textclassifier/ConversationActions;->getConversationActions()Ljava/util/List;
-HSPLandroid/view/textclassifier/ConversationActions;->getId()Ljava/lang/String;
-HSPLandroid/view/textclassifier/ConversationActions;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/textclassifier/EntityConfidence$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/EntityConfidence;
-HSPLandroid/view/textclassifier/EntityConfidence$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/EntityConfidence;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/textclassifier/EntityConfidence;->getEntities()Ljava/util/List;
-HSPLandroid/view/textclassifier/EntityConfidence;->resetSortedEntitiesFromMap()V
-HSPLandroid/view/textclassifier/SelectionEvent;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/textclassifier/SystemTextClassifier$BlockingCallback;-><init>(Ljava/lang/String;Landroid/view/textclassifier/TextClassificationConstants;)V
-HSPLandroid/view/textclassifier/SystemTextClassifier$BlockingCallback;->get()Landroid/os/Parcelable;
-HSPLandroid/view/textclassifier/SystemTextClassifier$BlockingCallback;->onSuccess(Landroid/os/Bundle;)V
-HSPLandroid/view/textclassifier/SystemTextClassifier$ResponseReceiver;-><init>(Ljava/lang/String;Landroid/view/textclassifier/TextClassificationConstants;)V
-HSPLandroid/view/textclassifier/SystemTextClassifier$ResponseReceiver;->get()Ljava/lang/Object;
-HSPLandroid/view/textclassifier/SystemTextClassifier$ResponseReceiver;->onSuccess(Ljava/lang/Object;)V
-HSPLandroid/view/textclassifier/SystemTextClassifier;-><init>(Landroid/content/Context;Landroid/view/textclassifier/TextClassificationConstants;Z)V
-HSPLandroid/view/textclassifier/SystemTextClassifier;->initializeRemoteSession(Landroid/view/textclassifier/TextClassificationContext;Landroid/view/textclassifier/TextClassificationSessionId;)V
-HSPLandroid/view/textclassifier/SystemTextClassifierMetadata$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/SystemTextClassifierMetadata;
-HSPLandroid/view/textclassifier/SystemTextClassifierMetadata$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/SystemTextClassifierMetadata;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/textclassifier/TextClassification$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/TextClassification;
-HSPLandroid/view/textclassifier/TextClassification$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/TextClassification$Request;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/textclassifier/TextClassification;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/textclassifier/TextClassificationConstants;-><init>()V
-HSPLandroid/view/textclassifier/TextClassificationConstants;->getSystemTextClassifierApiTimeoutInSecond()J
-HSPLandroid/view/textclassifier/TextClassificationConstants;->isSmartSelectionAnimationEnabled()Z
-HSPLandroid/view/textclassifier/TextClassificationContext$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/TextClassificationContext;
-HSPLandroid/view/textclassifier/TextClassificationContext$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/TextClassificationContext$Builder;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/view/textclassifier/TextClassificationContext$Builder;->build()Landroid/view/textclassifier/TextClassificationContext;
-HSPLandroid/view/textclassifier/TextClassificationContext;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/view/textclassifier/TextClassificationContext;->getPackageName()Ljava/lang/String;
-HSPLandroid/view/textclassifier/TextClassificationContext;->getWidgetType()Ljava/lang/String;
-HSPLandroid/view/textclassifier/TextClassificationContext;->setSystemTextClassifierMetadata(Landroid/view/textclassifier/SystemTextClassifierMetadata;)V
-HSPLandroid/view/textclassifier/TextClassificationManager$$ExternalSyntheticLambda0;-><init>(Landroid/view/textclassifier/TextClassificationManager;)V
-HSPLandroid/view/textclassifier/TextClassificationManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/textclassifier/TextClassificationManager;->createTextClassificationSession(Landroid/view/textclassifier/TextClassificationContext;)Landroid/view/textclassifier/TextClassifier;
-HSPLandroid/view/textclassifier/TextClassificationManager;->getSettings()Landroid/view/textclassifier/TextClassificationConstants;
-HSPLandroid/view/textclassifier/TextClassificationManager;->getSettings(Landroid/content/Context;)Landroid/view/textclassifier/TextClassificationConstants;
-HSPLandroid/view/textclassifier/TextClassificationManager;->getSystemTextClassifier(I)Landroid/view/textclassifier/TextClassifier;
-HSPLandroid/view/textclassifier/TextClassificationManager;->getTextClassifier()Landroid/view/textclassifier/TextClassifier;
-HSPLandroid/view/textclassifier/TextClassificationSession;-><init>(Landroid/view/textclassifier/TextClassificationContext;Landroid/view/textclassifier/TextClassifier;)V
-HSPLandroid/view/textclassifier/TextClassificationSession;->checkDestroyedAndRun(Ljava/util/function/Supplier;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/TextClassificationSession;->isDestroyed()Z
-HSPLandroid/view/textclassifier/TextClassificationSessionId$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/TextClassificationSessionId;
-HSPLandroid/view/textclassifier/TextClassificationSessionId$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/TextClassificationSessionId;-><init>(Ljava/lang/String;Landroid/os/IBinder;)V
-HSPLandroid/view/textclassifier/TextClassifier$EntityConfig$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/TextClassifier$EntityConfig;
-HSPLandroid/view/textclassifier/TextClassifier$EntityConfig$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/TextClassifier$EntityConfig;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/textclassifier/TextClassifier$Utils;->checkMainThread()V
-HSPLandroid/view/textclassifier/TextClassifierEvent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/TextClassifierEvent;
-HSPLandroid/view/textclassifier/TextClassifierEvent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/TextClassifierEvent;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/textclassifier/TextClassifierEvent;->getEventContext()Landroid/view/textclassifier/TextClassificationContext;
-HSPLandroid/view/textclassifier/TextClassifierEvent;->getParcelToken()I
-HSPLandroid/view/textclassifier/TextClassifierEvent;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/textclassifier/TextLinks$Request;-><init>(Ljava/lang/CharSequence;Landroid/os/LocaleList;Landroid/view/textclassifier/TextClassifier$EntityConfig;ZLjava/time/ZonedDateTime;Landroid/os/Bundle;)V
-HSPLandroid/view/textclassifier/TextLinks$Request;->getText()Ljava/lang/CharSequence;
-HSPLandroid/view/textclassifier/TextLinks$Request;->setSystemTextClassifierMetadata(Landroid/view/textclassifier/SystemTextClassifierMetadata;)V
-HSPLandroid/view/textclassifier/TextLinks$Request;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/textclassifier/TextLinks;->getLinks()Ljava/util/Collection;
-HSPLandroid/view/textservice/SentenceSuggestionsInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textservice/SentenceSuggestionsInfo;
-HSPLandroid/view/textservice/SentenceSuggestionsInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textservice/SentenceSuggestionsInfo$1;->newArray(I)[Landroid/view/textservice/SentenceSuggestionsInfo;
-HSPLandroid/view/textservice/SentenceSuggestionsInfo$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/view/textservice/SentenceSuggestionsInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/textservice/SpellCheckerInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textservice/SpellCheckerInfo;
-HSPLandroid/view/textservice/SpellCheckerInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textservice/SpellCheckerInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/textservice/SpellCheckerInfo;->getId()Ljava/lang/String;
-HSPLandroid/view/textservice/SpellCheckerInfo;->getSubtypeAt(I)Landroid/view/textservice/SpellCheckerSubtype;
-HSPLandroid/view/textservice/SpellCheckerInfo;->getSubtypeCount()I
-HSPLandroid/view/textservice/SpellCheckerSession$InternalListener;->onServiceConnected(Lcom/android/internal/textservice/ISpellCheckerSession;)V
-HSPLandroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListenerImpl;->onGetSentenceSuggestions([Landroid/view/textservice/SentenceSuggestionsInfo;)V
-HSPLandroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListenerImpl;->onServiceConnected(Lcom/android/internal/textservice/ISpellCheckerSession;)V
-HSPLandroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListenerImpl;->processCloseLocked()V
-HSPLandroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListenerImpl;->processOrEnqueueTask(Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListenerImpl$SpellCheckerParams;)V
-HSPLandroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListenerImpl;->processTask(Lcom/android/internal/textservice/ISpellCheckerSession;Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListenerImpl$SpellCheckerParams;Z)V
-HSPLandroid/view/textservice/SpellCheckerSession;->close()V
-HSPLandroid/view/textservice/SpellCheckerSession;->finalize()V
-HSPLandroid/view/textservice/SpellCheckerSession;->getSentenceSuggestions([Landroid/view/textservice/TextInfo;I)V
-HSPLandroid/view/textservice/SpellCheckerSession;->getSpellCheckerSessionListener()Lcom/android/internal/textservice/ISpellCheckerSessionListener;
-HSPLandroid/view/textservice/SpellCheckerSession;->getTextServicesSessionListener()Lcom/android/internal/textservice/ITextServicesSessionListener;
-HSPLandroid/view/textservice/SpellCheckerSubtype$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textservice/SpellCheckerSubtype;
-HSPLandroid/view/textservice/SpellCheckerSubtype$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textservice/SpellCheckerSubtype;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/textservice/SpellCheckerSubtype;->getLocale()Ljava/lang/String;
-HSPLandroid/view/textservice/SuggestionsInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textservice/SuggestionsInfo;
-HSPLandroid/view/textservice/SuggestionsInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textservice/SuggestionsInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/textservice/TextInfo;-><init>(Ljava/lang/CharSequence;IIII)V
-HSPLandroid/view/textservice/TextServicesManager;->createInstance(Landroid/content/Context;)Landroid/view/textservice/TextServicesManager;
-HSPLandroid/view/textservice/TextServicesManager;->finishSpellCheckerService(Lcom/android/internal/textservice/ISpellCheckerSessionListener;)V
-HSPLandroid/view/textservice/TextServicesManager;->getCurrentSpellCheckerSubtype(Z)Landroid/view/textservice/SpellCheckerSubtype;
-HSPLandroid/view/textservice/TextServicesManager;->isSpellCheckerEnabled()Z
-HSPLandroid/view/textservice/TextServicesManager;->newSpellCheckerSession(Landroid/os/Bundle;Ljava/util/Locale;Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListener;Z)Landroid/view/textservice/SpellCheckerSession;
-HSPLandroid/view/textservice/TextServicesManager;->parseLanguageFromLocaleString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/webkit/ConsoleMessage;->message()Ljava/lang/String;
-HSPLandroid/webkit/CookieManager;-><init>()V
-HSPLandroid/webkit/CookieManager;->getInstance()Landroid/webkit/CookieManager;
-HSPLandroid/webkit/CookieSyncManager;->setGetInstanceIsAllowed()V
-HSPLandroid/webkit/GeolocationPermissions;-><init>()V
-HSPLandroid/webkit/IWebViewUpdateService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/webkit/IWebViewUpdateService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/webkit/IWebViewUpdateService$Stub$Proxy;->getCurrentWebViewPackage()Landroid/content/pm/PackageInfo;
-HSPLandroid/webkit/IWebViewUpdateService$Stub$Proxy;->isMultiProcessEnabled()Z
-HSPLandroid/webkit/IWebViewUpdateService$Stub$Proxy;->waitForAndGetProvider()Landroid/webkit/WebViewProviderResponse;
-HSPLandroid/webkit/IWebViewUpdateService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/webkit/IWebViewUpdateService;
-HSPLandroid/webkit/MimeTypeMap;->getMimeTypeFromExtension(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/webkit/MimeTypeMap;->getSingleton()Landroid/webkit/MimeTypeMap;
-HSPLandroid/webkit/URLUtil;->isFileUrl(Ljava/lang/String;)Z
-HSPLandroid/webkit/URLUtil;->isHttpUrl(Ljava/lang/String;)Z
-HSPLandroid/webkit/URLUtil;->isHttpsUrl(Ljava/lang/String;)Z
-HSPLandroid/webkit/URLUtil;->isValidUrl(Ljava/lang/String;)Z
-HSPLandroid/webkit/WebChromeClient;-><init>()V
-HSPLandroid/webkit/WebChromeClient;->getVisitedHistory(Landroid/webkit/ValueCallback;)V
-HSPLandroid/webkit/WebChromeClient;->onProgressChanged(Landroid/webkit/WebView;I)V
-HSPLandroid/webkit/WebChromeClient;->onReceivedIcon(Landroid/webkit/WebView;Landroid/graphics/Bitmap;)V
-HSPLandroid/webkit/WebChromeClient;->onReceivedTitle(Landroid/webkit/WebView;Ljava/lang/String;)V
-HSPLandroid/webkit/WebSettings;-><init>()V
-HSPLandroid/webkit/WebSettings;->getDefaultUserAgent(Landroid/content/Context;)Ljava/lang/String;
-HSPLandroid/webkit/WebStorage;-><init>()V
-HSPLandroid/webkit/WebView$HitTestResult;-><init>()V
-HSPLandroid/webkit/WebView$PrivateAccess;->overScrollBy(IIIIIIIIZ)V
-HSPLandroid/webkit/WebView$PrivateAccess;->setMeasuredDimension(II)V
-HSPLandroid/webkit/WebView$PrivateAccess;->super_getScrollBarStyle()I
-HSPLandroid/webkit/WebView$PrivateAccess;->super_scrollTo(II)V
-HSPLandroid/webkit/WebView$PrivateAccess;->super_setFrame(IIII)Z
-HSPLandroid/webkit/WebView$PrivateAccess;->super_setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/webkit/WebView;-><init>(Landroid/content/Context;)V
-HSPLandroid/webkit/WebView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/webkit/WebView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/webkit/WebView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;IILjava/util/Map;Z)V
-HSPLandroid/webkit/WebView;->addJavascriptInterface(Ljava/lang/Object;Ljava/lang/String;)V
-HSPLandroid/webkit/WebView;->checkThread()V
-HSPLandroid/webkit/WebView;->computeHorizontalScrollOffset()I
-HSPLandroid/webkit/WebView;->computeHorizontalScrollRange()I
-HSPLandroid/webkit/WebView;->computeScroll()V
-HSPLandroid/webkit/WebView;->computeVerticalScrollExtent()I
-HSPLandroid/webkit/WebView;->computeVerticalScrollOffset()I
-HSPLandroid/webkit/WebView;->computeVerticalScrollRange()I
-HSPLandroid/webkit/WebView;->destroy()V
-HSPLandroid/webkit/WebView;->dispatchDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/webkit/WebView;->ensureProviderCreated()V
-HSPLandroid/webkit/WebView;->evaluateJavascript(Ljava/lang/String;Landroid/webkit/ValueCallback;)V
-HSPLandroid/webkit/WebView;->getCurrentWebViewPackage()Landroid/content/pm/PackageInfo;
-HSPLandroid/webkit/WebView;->getFavicon()Landroid/graphics/Bitmap;
-HSPLandroid/webkit/WebView;->getHandler()Landroid/os/Handler;
-HSPLandroid/webkit/WebView;->getSettings()Landroid/webkit/WebSettings;
-HSPLandroid/webkit/WebView;->loadDataWithBaseURL(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/webkit/WebView;->loadUrl(Ljava/lang/String;)V
-HSPLandroid/webkit/WebView;->onAttachedToWindow()V
-HSPLandroid/webkit/WebView;->onDetachedFromWindowInternal()V
-HSPLandroid/webkit/WebView;->onDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/webkit/WebView;->onMeasure(II)V
-HSPLandroid/webkit/WebView;->onOverScrolled(IIZZ)V
-HSPLandroid/webkit/WebView;->onSizeChanged(IIII)V
-HSPLandroid/webkit/WebView;->onTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/webkit/WebView;->onVisibilityChanged(Landroid/view/View;I)V
-HSPLandroid/webkit/WebView;->onWindowFocusChanged(Z)V
-HSPLandroid/webkit/WebView;->onWindowVisibilityChanged(I)V
-HSPLandroid/webkit/WebView;->setBackgroundColor(I)V
-HSPLandroid/webkit/WebView;->setDataDirectorySuffix(Ljava/lang/String;)V
-HSPLandroid/webkit/WebView;->setFrame(IIII)Z
-HSPLandroid/webkit/WebView;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/webkit/WebView;->setOverScrollMode(I)V
-HSPLandroid/webkit/WebView;->setWebChromeClient(Landroid/webkit/WebChromeClient;)V
-HSPLandroid/webkit/WebView;->setWebViewClient(Landroid/webkit/WebViewClient;)V
-HSPLandroid/webkit/WebViewClient;-><init>()V
-HSPLandroid/webkit/WebViewClient;->doUpdateVisitedHistory(Landroid/webkit/WebView;Ljava/lang/String;Z)V
-HSPLandroid/webkit/WebViewClient;->onLoadResource(Landroid/webkit/WebView;Ljava/lang/String;)V
-HSPLandroid/webkit/WebViewClient;->onPageCommitVisible(Landroid/webkit/WebView;Ljava/lang/String;)V
-HSPLandroid/webkit/WebViewClient;->onPageFinished(Landroid/webkit/WebView;Ljava/lang/String;)V
-HSPLandroid/webkit/WebViewClient;->onPageStarted(Landroid/webkit/WebView;Ljava/lang/String;Landroid/graphics/Bitmap;)V
-HSPLandroid/webkit/WebViewClient;->onScaleChanged(Landroid/webkit/WebView;FF)V
-HSPLandroid/webkit/WebViewClient;->shouldInterceptRequest(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;)Landroid/webkit/WebResourceResponse;
-HSPLandroid/webkit/WebViewClient;->shouldInterceptRequest(Landroid/webkit/WebView;Ljava/lang/String;)Landroid/webkit/WebResourceResponse;
-HSPLandroid/webkit/WebViewDelegate;->addWebViewAssetPath(Landroid/content/Context;)V
-HSPLandroid/webkit/WebViewDelegate;->drawWebViewFunctor(Landroid/graphics/Canvas;I)V
-HSPLandroid/webkit/WebViewDelegate;->getApplication()Landroid/app/Application;
-HSPLandroid/webkit/WebViewDelegate;->getDataDirectorySuffix()Ljava/lang/String;
-HSPLandroid/webkit/WebViewDelegate;->getPackageId(Landroid/content/res/Resources;Ljava/lang/String;)I
-HSPLandroid/webkit/WebViewDelegate;->getStartupTimestamps()Landroid/webkit/WebViewFactory$StartupTimestamps;
-HSPLandroid/webkit/WebViewDelegate;->isMultiProcessEnabled()Z
-HSPLandroid/webkit/WebViewFactory$StartupTimestamps;->getWebViewLoadStart()J
-HSPLandroid/webkit/WebViewFactory;->getDataDirectorySuffix()Ljava/lang/String;
-HSPLandroid/webkit/WebViewFactory;->getLoadedPackageInfo()Landroid/content/pm/PackageInfo;
-HSPLandroid/webkit/WebViewFactory;->getProvider()Landroid/webkit/WebViewFactoryProvider;
-HSPLandroid/webkit/WebViewFactory;->getProviderClass()Ljava/lang/Class;
-HSPLandroid/webkit/WebViewFactory;->getStartupTimestamps()Landroid/webkit/WebViewFactory$StartupTimestamps;
-HSPLandroid/webkit/WebViewFactory;->getUpdateService()Landroid/webkit/IWebViewUpdateService;
-HSPLandroid/webkit/WebViewFactory;->getUpdateServiceUnchecked()Landroid/webkit/IWebViewUpdateService;
-HSPLandroid/webkit/WebViewFactory;->getWebViewContextAndSetProvider()Landroid/content/Context;
-HSPLandroid/webkit/WebViewFactory;->getWebViewLibrary(Landroid/content/pm/ApplicationInfo;)Ljava/lang/String;
-HSPLandroid/webkit/WebViewFactory;->isWebViewSupported()Z
-HSPLandroid/webkit/WebViewFactory;->prepareWebViewInZygote()V
-HSPLandroid/webkit/WebViewFactory;->setDataDirectorySuffix(Ljava/lang/String;)V
-HSPLandroid/webkit/WebViewFactory;->signaturesEquals([Landroid/content/pm/Signature;[Landroid/content/pm/Signature;)Z
-HSPLandroid/webkit/WebViewFactory;->verifyPackageInfo(Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageInfo;)V
-HSPLandroid/webkit/WebViewLibraryLoader;->loadNativeLibrary(Ljava/lang/ClassLoader;Ljava/lang/String;)I
-HSPLandroid/webkit/WebViewLibraryLoader;->reserveAddressSpaceInZygote()V
-HSPLandroid/webkit/WebViewProviderResponse$1;->createFromParcel(Landroid/os/Parcel;)Landroid/webkit/WebViewProviderResponse;
-HSPLandroid/webkit/WebViewProviderResponse$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/widget/AbsListView$3;->run()V
-HSPLandroid/widget/AbsListView$AdapterDataSetObserver;->onChanged()V
-HSPLandroid/widget/AbsListView$DeviceConfigChangeListener;-><init>()V
-HSPLandroid/widget/AbsListView$DeviceConfigChangeListener;-><init>(Landroid/widget/AbsListView$DeviceConfigChangeListener-IA;)V
-HSPLandroid/widget/AbsListView$PerformClick;->run()V
-HSPLandroid/widget/AbsListView$RecycleBin;->addScrapView(Landroid/view/View;I)V
-HSPLandroid/widget/AbsListView$RecycleBin;->clear()V
-HSPLandroid/widget/AbsListView$RecycleBin;->clearTransientStateViews()V
-HSPLandroid/widget/AbsListView$RecycleBin;->fillActiveViews(II)V
-HSPLandroid/widget/AbsListView$RecycleBin;->getActiveView(I)Landroid/view/View;
-HSPLandroid/widget/AbsListView$RecycleBin;->getScrapView(I)Landroid/view/View;
-HSPLandroid/widget/AbsListView$RecycleBin;->getTransientStateView(I)Landroid/view/View;
-HSPLandroid/widget/AbsListView$RecycleBin;->markChildrenDirty()V
-HSPLandroid/widget/AbsListView$RecycleBin;->pruneScrapViews()V
-HSPLandroid/widget/AbsListView$RecycleBin;->removeSkippedScrap()V
-HSPLandroid/widget/AbsListView$RecycleBin;->retrieveFromScrap(Ljava/util/ArrayList;I)Landroid/view/View;
-HSPLandroid/widget/AbsListView$RecycleBin;->scrapActiveViews()V
-HSPLandroid/widget/AbsListView$RecycleBin;->setViewTypeCount(I)V
-HSPLandroid/widget/AbsListView$RecycleBin;->shouldRecycleViewType(I)Z
-HSPLandroid/widget/AbsListView$SavedState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/AbsListView$WindowRunnnable;->rememberWindowAttachCount()V
-HSPLandroid/widget/AbsListView$WindowRunnnable;->sameWindow()Z
-HSPLandroid/widget/AbsListView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/AbsListView;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
-HSPLandroid/widget/AbsListView;->clearChoices()V
-HSPLandroid/widget/AbsListView;->computeVerticalScrollExtent()I
-HSPLandroid/widget/AbsListView;->computeVerticalScrollOffset()I
-HSPLandroid/widget/AbsListView;->computeVerticalScrollRange()I
-HSPLandroid/widget/AbsListView;->dispatchDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/AbsListView;->dispatchSetPressed(Z)V
-HSPLandroid/widget/AbsListView;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/AbsListView;->drawableStateChanged()V
-HSPLandroid/widget/AbsListView;->generateDefaultLayoutParams()Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/widget/AbsListView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/widget/AbsListView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/AbsListView$LayoutParams;
-HSPLandroid/widget/AbsListView;->getDrawableStateForSelector()[I
-HSPLandroid/widget/AbsListView;->getVerticalScrollbarWidth()I
-HSPLandroid/widget/AbsListView;->handleBoundsChange()V
-HSPLandroid/widget/AbsListView;->handleDataChanged()V
-HSPLandroid/widget/AbsListView;->handleScrollBarDragging(Landroid/view/MotionEvent;)Z
-HSPLandroid/widget/AbsListView;->hideSelector()V
-HSPLandroid/widget/AbsListView;->initAbsListView()V
-HSPLandroid/widget/AbsListView;->internalSetPadding(IIII)V
-HSPLandroid/widget/AbsListView;->invokeOnItemScrollListener()V
-HSPLandroid/widget/AbsListView;->isFastScrollEnabled()Z
-HSPLandroid/widget/AbsListView;->isInFilterMode()Z
-HSPLandroid/widget/AbsListView;->isVerticalScrollBarHidden()Z
-HSPLandroid/widget/AbsListView;->jumpDrawablesToCurrentState()V
-HSPLandroid/widget/AbsListView;->obtainView(I[Z)Landroid/view/View;
-HSPLandroid/widget/AbsListView;->onAttachedToWindow()V
-HSPLandroid/widget/AbsListView;->onCancelPendingInputEvents()V
-HSPLandroid/widget/AbsListView;->onDetachedFromWindow()V
-HSPLandroid/widget/AbsListView;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/widget/AbsListView;->onLayout(ZIIII)V
-HSPLandroid/widget/AbsListView;->onMeasure(II)V
-HSPLandroid/widget/AbsListView;->onRtlPropertiesChanged(I)V
-HSPLandroid/widget/AbsListView;->onSaveInstanceState()Landroid/os/Parcelable;
-HSPLandroid/widget/AbsListView;->onTouchDown(Landroid/view/MotionEvent;)V
-HSPLandroid/widget/AbsListView;->onTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/widget/AbsListView;->onTouchModeChanged(Z)V
-HSPLandroid/widget/AbsListView;->onTouchMove(Landroid/view/MotionEvent;Landroid/view/MotionEvent;)V
-HSPLandroid/widget/AbsListView;->onTouchUp(Landroid/view/MotionEvent;)V
-HSPLandroid/widget/AbsListView;->onWindowFocusChanged(Z)V
-HSPLandroid/widget/AbsListView;->performItemClick(Landroid/view/View;IJ)Z
-HSPLandroid/widget/AbsListView;->pointToPosition(II)I
-HSPLandroid/widget/AbsListView;->positionSelector(ILandroid/view/View;)V
-HSPLandroid/widget/AbsListView;->positionSelector(ILandroid/view/View;ZFF)V
-HSPLandroid/widget/AbsListView;->reportScrollStateChange(I)V
-HSPLandroid/widget/AbsListView;->requestLayout()V
-HSPLandroid/widget/AbsListView;->resetList()V
-HSPLandroid/widget/AbsListView;->setChoiceMode(I)V
-HSPLandroid/widget/AbsListView;->setFastScrollAlwaysVisible(Z)V
-HSPLandroid/widget/AbsListView;->setFastScrollEnabled(Z)V
-HSPLandroid/widget/AbsListView;->setFastScrollStyle(I)V
-HSPLandroid/widget/AbsListView;->setFrame(IIII)Z
-HSPLandroid/widget/AbsListView;->setItemViewLayoutParams(Landroid/view/View;I)V
-HSPLandroid/widget/AbsListView;->setOnScrollListener(Landroid/widget/AbsListView$OnScrollListener;)V
-HSPLandroid/widget/AbsListView;->setScrollingCacheEnabled(Z)V
-HSPLandroid/widget/AbsListView;->setSelectionFromTop(II)V
-HSPLandroid/widget/AbsListView;->setSelector(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/AbsListView;->setSmoothScrollbarEnabled(Z)V
-HSPLandroid/widget/AbsListView;->setStackFromBottom(Z)V
-HSPLandroid/widget/AbsListView;->setTextFilterEnabled(Z)V
-HSPLandroid/widget/AbsListView;->setTranscriptMode(I)V
-HSPLandroid/widget/AbsListView;->setVisibleRangeHint(II)V
-HSPLandroid/widget/AbsListView;->setupDeviceConfigProperties()V
-HSPLandroid/widget/AbsListView;->shouldShowSelector()Z
-HSPLandroid/widget/AbsListView;->startScrollIfNeeded(IILandroid/view/MotionEvent;)Z
-HSPLandroid/widget/AbsListView;->touchModeDrawsInPressedState()Z
-HSPLandroid/widget/AbsListView;->updateScrollIndicators()V
-HSPLandroid/widget/AbsListView;->updateSelectorState()V
-HSPLandroid/widget/AbsListView;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z
-HSPLandroid/widget/AbsSeekBar;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/AbsSeekBar;->applyThumbTint()V
-HSPLandroid/widget/AbsSeekBar;->applyTickMarkTint()V
-HSPLandroid/widget/AbsSeekBar;->drawThumb(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/AbsSeekBar;->drawTickMarks(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/AbsSeekBar;->drawTrack(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/AbsSeekBar;->drawableStateChanged()V
-HSPLandroid/widget/AbsSeekBar;->getThumbOffset()I
-HSPLandroid/widget/AbsSeekBar;->growRectTo(Landroid/graphics/Rect;I)V
-HSPLandroid/widget/AbsSeekBar;->jumpDrawablesToCurrentState()V
-HSPLandroid/widget/AbsSeekBar;->onDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/AbsSeekBar;->onMeasure(II)V
-HSPLandroid/widget/AbsSeekBar;->onResolveDrawables(I)V
-HSPLandroid/widget/AbsSeekBar;->onRtlPropertiesChanged(I)V
-HSPLandroid/widget/AbsSeekBar;->onSizeChanged(IIII)V
-HSPLandroid/widget/AbsSeekBar;->onVisualProgressChanged(IF)V
-HSPLandroid/widget/AbsSeekBar;->setKeyProgressIncrement(I)V
-HSPLandroid/widget/AbsSeekBar;->setMax(I)V
-HSPLandroid/widget/AbsSeekBar;->setMin(I)V
-HSPLandroid/widget/AbsSeekBar;->setThumb(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/AbsSeekBar;->setThumbOffset(I)V
-HSPLandroid/widget/AbsSeekBar;->setThumbPos(ILandroid/graphics/drawable/Drawable;FI)V
-HSPLandroid/widget/AbsSeekBar;->setTickMark(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/AbsSeekBar;->updateGestureExclusionRects()V
-HSPLandroid/widget/AbsSeekBar;->updateThumbAndTrackPos(II)V
-HSPLandroid/widget/AbsSeekBar;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z
-HSPLandroid/widget/AbsSpinner;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/AbsSpinner;->getAdapter()Landroid/widget/Adapter;
-HSPLandroid/widget/AbsSpinner;->getAdapter()Landroid/widget/SpinnerAdapter;
-HSPLandroid/widget/AbsSpinner;->getAutofillType()I
-HSPLandroid/widget/AbsSpinner;->requestLayout()V
-HSPLandroid/widget/AbsoluteLayout;->onLayout(ZIIII)V
-HSPLandroid/widget/AbsoluteLayout;->onMeasure(II)V
-HSPLandroid/widget/ActionMenuView;-><init>(Landroid/content/Context;)V
-HSPLandroid/widget/ActionMenuView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/ActionMenuView;->onMeasure(II)V
-HSPLandroid/widget/ActionMenuView;->peekMenu()Lcom/android/internal/view/menu/MenuBuilder;
-HSPLandroid/widget/AdapterView$AdapterDataSetObserver;-><init>(Landroid/widget/AdapterView;)V
-HSPLandroid/widget/AdapterView$AdapterDataSetObserver;->onChanged()V
-HSPLandroid/widget/AdapterView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/AdapterView;->checkFocus()V
-HSPLandroid/widget/AdapterView;->checkSelectionChanged()V
-HSPLandroid/widget/AdapterView;->dispatchSaveInstanceState(Landroid/util/SparseArray;)V
-HSPLandroid/widget/AdapterView;->getCount()I
-HSPLandroid/widget/AdapterView;->getItemIdAtPosition(I)J
-HSPLandroid/widget/AdapterView;->getSelectedItemId()J
-HSPLandroid/widget/AdapterView;->isInFilterMode()Z
-HSPLandroid/widget/AdapterView;->onProvideStructure(Landroid/view/ViewStructure;II)V
-HSPLandroid/widget/AdapterView;->rememberSyncState()V
-HSPLandroid/widget/AdapterView;->setEmptyView(Landroid/view/View;)V
-HSPLandroid/widget/AdapterView;->setFocusable(I)V
-HSPLandroid/widget/AdapterView;->setFocusableInTouchMode(Z)V
-HSPLandroid/widget/AdapterView;->setNextSelectedPositionInt(I)V
-HSPLandroid/widget/AdapterView;->setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V
-HSPLandroid/widget/AdapterView;->setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)V
-HSPLandroid/widget/AdapterView;->setSelectedPositionInt(I)V
-HSPLandroid/widget/AdapterView;->updateEmptyStatus(Z)V
-HSPLandroid/widget/ArrayAdapter;-><init>(Landroid/content/Context;I)V
-HSPLandroid/widget/ArrayAdapter;-><init>(Landroid/content/Context;IILjava/util/List;)V
-HSPLandroid/widget/ArrayAdapter;-><init>(Landroid/content/Context;IILjava/util/List;Z)V
-HSPLandroid/widget/ArrayAdapter;->clear()V
-HSPLandroid/widget/ArrayAdapter;->getCount()I
-HSPLandroid/widget/ArrayAdapter;->getItem(I)Ljava/lang/Object;
-HSPLandroid/widget/ArrayAdapter;->getItemId(I)J
-HSPLandroid/widget/ArrayAdapter;->notifyDataSetChanged()V
-HSPLandroid/widget/AutoCompleteTextView$DropDownItemClickListener;-><init>(Landroid/widget/AutoCompleteTextView;)V
-HSPLandroid/widget/AutoCompleteTextView$MyWatcher;-><init>(Landroid/widget/AutoCompleteTextView;)V
-HSPLandroid/widget/AutoCompleteTextView$PassThroughClickListener;-><init>(Landroid/widget/AutoCompleteTextView;)V
-HSPLandroid/widget/AutoCompleteTextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/AutoCompleteTextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;IILandroid/content/res/Resources$Theme;)V
-HSPLandroid/widget/AutoCompleteTextView;->setCompletionHint(Ljava/lang/CharSequence;)V
-HSPLandroid/widget/BaseAdapter;-><init>()V
-HSPLandroid/widget/BaseAdapter;->areAllItemsEnabled()Z
-HSPLandroid/widget/BaseAdapter;->getItemViewType(I)I
-HSPLandroid/widget/BaseAdapter;->getViewTypeCount()I
-HSPLandroid/widget/BaseAdapter;->hasStableIds()Z
-HSPLandroid/widget/BaseAdapter;->isEmpty()Z
-HSPLandroid/widget/BaseAdapter;->isEnabled(I)Z
-HSPLandroid/widget/BaseAdapter;->notifyDataSetChanged()V
-HSPLandroid/widget/BaseAdapter;->registerDataSetObserver(Landroid/database/DataSetObserver;)V
-HSPLandroid/widget/BaseAdapter;->unregisterDataSetObserver(Landroid/database/DataSetObserver;)V
-HSPLandroid/widget/Button;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/Button;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/Button;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/Button;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLandroid/widget/CheckBox;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/CompoundButton$SavedState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/CompoundButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/CompoundButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/CompoundButton;->applyButtonTint()V
-HSPLandroid/widget/CompoundButton;->drawableHotspotChanged(FF)V
-HSPLandroid/widget/CompoundButton;->drawableStateChanged()V
-HSPLandroid/widget/CompoundButton;->getAutofillType()I
-HSPLandroid/widget/CompoundButton;->getAutofillValue()Landroid/view/autofill/AutofillValue;
-HSPLandroid/widget/CompoundButton;->getButtonDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/CompoundButton;->getButtonStateDescription()Ljava/lang/CharSequence;
-HSPLandroid/widget/CompoundButton;->getCompoundPaddingLeft()I
-HSPLandroid/widget/CompoundButton;->getCompoundPaddingRight()I
-HSPLandroid/widget/CompoundButton;->getHorizontalOffsetForDrawables()I
-HSPLandroid/widget/CompoundButton;->isChecked()Z
-HSPLandroid/widget/CompoundButton;->jumpDrawablesToCurrentState()V
-HSPLandroid/widget/CompoundButton;->onCreateDrawableState(I)[I
-HSPLandroid/widget/CompoundButton;->onDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/CompoundButton;->onProvideStructure(Landroid/view/ViewStructure;II)V
-HSPLandroid/widget/CompoundButton;->onResolveDrawables(I)V
-HSPLandroid/widget/CompoundButton;->onSaveInstanceState()Landroid/os/Parcelable;
-HSPLandroid/widget/CompoundButton;->setButtonDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/CompoundButton;->setChecked(Z)V
-HSPLandroid/widget/CompoundButton;->setDefaultStateDescription()V
-HSPLandroid/widget/CompoundButton;->setOnCheckedChangeListener(Landroid/widget/CompoundButton$OnCheckedChangeListener;)V
-HSPLandroid/widget/CompoundButton;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z
-HSPLandroid/widget/EdgeEffect;-><init>(Landroid/content/Context;)V
-HSPLandroid/widget/EdgeEffect;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/EdgeEffect;->calculateDistanceFromGlowValues(FF)F
-HSPLandroid/widget/EdgeEffect;->dampStretchVector(F)F
-HSPLandroid/widget/EdgeEffect;->draw(Landroid/graphics/Canvas;)Z+]Landroid/graphics/Matrix;Landroid/graphics/Matrix;]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/widget/EdgeEffect;->finish()V
-HSPLandroid/widget/EdgeEffect;->getCurrentEdgeEffectBehavior()I
-HSPLandroid/widget/EdgeEffect;->getDistance()F
-HSPLandroid/widget/EdgeEffect;->isAtEquilibrium()Z
-HSPLandroid/widget/EdgeEffect;->isFinished()Z
-HSPLandroid/widget/EdgeEffect;->onAbsorb(I)V
-HSPLandroid/widget/EdgeEffect;->onPull(FF)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HSPLandroid/widget/EdgeEffect;->onPullDistance(FF)F
-HSPLandroid/widget/EdgeEffect;->onRelease()V
-HSPLandroid/widget/EdgeEffect;->setSize(II)V
-HSPLandroid/widget/EdgeEffect;->update()V
-HSPLandroid/widget/EdgeEffect;->updateSpring()V
-HSPLandroid/widget/EditText;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/EditText;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/EditText;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/EditText;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLandroid/widget/EditText;->getDefaultEditable()Z
-HSPLandroid/widget/EditText;->getDefaultMovementMethod()Landroid/text/method/MovementMethod;
-HSPLandroid/widget/EditText;->getFreezesText()Z
-HSPLandroid/widget/EditText;->getText()Landroid/text/Editable;
-HSPLandroid/widget/EditText;->getText()Ljava/lang/CharSequence;
-HSPLandroid/widget/EditText;->setEllipsize(Landroid/text/TextUtils$TruncateAt;)V
-HSPLandroid/widget/EditText;->setSelection(I)V
-HSPLandroid/widget/EditText;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V
-HSPLandroid/widget/EditText;->supportsAutoSizeText()Z
-HSPLandroid/widget/Editor$$ExternalSyntheticLambda2;-><init>(Landroid/widget/Editor;)V
-HSPLandroid/widget/Editor$2;->onDraw()V
-HSPLandroid/widget/Editor$AccessibilitySmartActions;-><init>(Landroid/widget/TextView;)V
-HSPLandroid/widget/Editor$AccessibilitySmartActions;-><init>(Landroid/widget/TextView;Landroid/widget/Editor$AccessibilitySmartActions-IA;)V
-HSPLandroid/widget/Editor$Blink;->cancel()V
-HSPLandroid/widget/Editor$Blink;->run()V
-HSPLandroid/widget/Editor$Blink;->uncancel()V
-HSPLandroid/widget/Editor$CursorAnchorInfoNotifier;->updatePosition(IIZZ)V+]Landroid/view/inputmethod/InputMethodManager;Landroid/view/inputmethod/InputMethodManager;
-HSPLandroid/widget/Editor$EditOperation;-><init>(Landroid/widget/Editor;Ljava/lang/String;ILjava/lang/String;Z)V
-HSPLandroid/widget/Editor$EditOperation;->commit()V
-HSPLandroid/widget/Editor$EditOperation;->forceMergeWith(Landroid/widget/Editor$EditOperation;)V
-HSPLandroid/widget/Editor$EditOperation;->mergeDeleteWith(Landroid/widget/Editor$EditOperation;)Z
-HSPLandroid/widget/Editor$EditOperation;->mergeInsertWith(Landroid/widget/Editor$EditOperation;)Z
-HSPLandroid/widget/Editor$EditOperation;->mergeReplaceWith(Landroid/widget/Editor$EditOperation;)Z
-HSPLandroid/widget/Editor$EditOperation;->mergeWith(Landroid/widget/Editor$EditOperation;)Z
-HSPLandroid/widget/Editor$EditOperation;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/Editor$HandleView;-><init>(Landroid/widget/Editor;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;I)V
-HSPLandroid/widget/Editor$HandleView;->getHorizontal(Landroid/text/Layout;I)F
-HSPLandroid/widget/Editor$HandleView;->hide()V
-HSPLandroid/widget/Editor$HandleView;->invalidate()V
-HSPLandroid/widget/Editor$HandleView;->isAtRtlRun(Landroid/text/Layout;I)Z
-HSPLandroid/widget/Editor$HandleView;->isDragging()Z
-HSPLandroid/widget/Editor$HandleView;->onDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/Editor$HandleView;->onSizeChanged(IIII)V
-HSPLandroid/widget/Editor$HandleView;->positionAtCursorOffset(IZZ)V
-HSPLandroid/widget/Editor$HandleView;->setDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/Editor$HandleView;->shouldShow()Z
-HSPLandroid/widget/Editor$HandleView;->updateDrawable(Z)V
-HSPLandroid/widget/Editor$HandleView;->updatePosition(IIZZ)V
-HSPLandroid/widget/Editor$InsertionHandleView;-><init>(Landroid/widget/Editor;Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/Editor$InsertionHandleView;->dismiss()V
-HSPLandroid/widget/Editor$InsertionHandleView;->getCurrentCursorOffset()I
-HSPLandroid/widget/Editor$InsertionHandleView;->getCursorHorizontalPosition(Landroid/text/Layout;I)I
-HSPLandroid/widget/Editor$InsertionHandleView;->getCursorOffset()I
-HSPLandroid/widget/Editor$InsertionHandleView;->getHorizontalGravity(Z)I
-HSPLandroid/widget/Editor$InsertionHandleView;->getHotspotX(Landroid/graphics/drawable/Drawable;Z)I
-HSPLandroid/widget/Editor$InsertionHandleView;->isShowing()Z
-HSPLandroid/widget/Editor$InsertionHandleView;->onDetached()V
-HSPLandroid/widget/Editor$InsertionHandleView;->onMeasure(II)V
-HSPLandroid/widget/Editor$InsertionHandleView;->show()V
-HSPLandroid/widget/Editor$InsertionHandleView;->updateDrawable(Z)V
-HSPLandroid/widget/Editor$InsertionHandleView;->updateSelection(I)V
-HSPLandroid/widget/Editor$InsertionPointCursorController;->getHandle()Landroid/widget/Editor$InsertionHandleView;
-HSPLandroid/widget/Editor$InsertionPointCursorController;->hide()V
-HSPLandroid/widget/Editor$InsertionPointCursorController;->invalidateHandle()V
-HSPLandroid/widget/Editor$InsertionPointCursorController;->isActive()Z
-HSPLandroid/widget/Editor$InsertionPointCursorController;->isCursorBeingModified()Z
-HSPLandroid/widget/Editor$InsertionPointCursorController;->onDetached()V
-HSPLandroid/widget/Editor$InsertionPointCursorController;->onTouchEvent(Landroid/view/MotionEvent;)V
-HSPLandroid/widget/Editor$InsertionPointCursorController;->show()V
-HSPLandroid/widget/Editor$PositionListener;->addSubscriber(Landroid/widget/Editor$TextViewPositionListener;Z)V
-HSPLandroid/widget/Editor$PositionListener;->onPreDraw()Z+]Landroid/widget/Editor$TextViewPositionListener;Landroid/widget/Editor$CursorAnchorInfoNotifier;,Landroid/widget/Editor$InsertionHandleView;
-HSPLandroid/widget/Editor$PositionListener;->onScrollChanged()V
-HSPLandroid/widget/Editor$PositionListener;->removeSubscriber(Landroid/widget/Editor$TextViewPositionListener;)V
-HSPLandroid/widget/Editor$PositionListener;->updatePosition()V+]Landroid/widget/TextView;Landroid/widget/EditText;
-HSPLandroid/widget/Editor$ProcessTextIntentActionsHandler;-><init>(Landroid/widget/Editor;)V
-HSPLandroid/widget/Editor$SelectionModifierCursorController;->getMinTouchOffset()I
-HSPLandroid/widget/Editor$SelectionModifierCursorController;->hide()V
-HSPLandroid/widget/Editor$SelectionModifierCursorController;->invalidateHandles()V
-HSPLandroid/widget/Editor$SelectionModifierCursorController;->isCursorBeingModified()Z
-HSPLandroid/widget/Editor$SelectionModifierCursorController;->isDragAcceleratorActive()Z
-HSPLandroid/widget/Editor$SelectionModifierCursorController;->isSelectionStartDragged()Z
-HSPLandroid/widget/Editor$SelectionModifierCursorController;->onDetached()V
-HSPLandroid/widget/Editor$SelectionModifierCursorController;->onTouchEvent(Landroid/view/MotionEvent;)V+]Landroid/widget/EditorTouchState;Landroid/widget/EditorTouchState;]Landroid/view/ViewConfiguration;Landroid/view/ViewConfiguration;]Landroid/widget/Editor$SelectionModifierCursorController;Landroid/widget/Editor$SelectionModifierCursorController;]Landroid/view/MotionEvent;Landroid/view/MotionEvent;
-HSPLandroid/widget/Editor$SelectionModifierCursorController;->resetDragAcceleratorState()V
-HSPLandroid/widget/Editor$SelectionModifierCursorController;->resetTouchOffsets()V
-HSPLandroid/widget/Editor$SelectionModifierCursorController;->updateSelection(Landroid/view/MotionEvent;)V
-HSPLandroid/widget/Editor$SpanController;->hide()V
-HSPLandroid/widget/Editor$SpanController;->onSpanAdded(Landroid/text/Spannable;Ljava/lang/Object;II)V
-HSPLandroid/widget/Editor$SpanController;->onSpanChanged(Landroid/text/Spannable;Ljava/lang/Object;IIII)V
-HSPLandroid/widget/Editor$SpanController;->onSpanRemoved(Landroid/text/Spannable;Ljava/lang/Object;II)V
-HSPLandroid/widget/Editor$TextRenderNode;->needsRecord()Z+]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
-HSPLandroid/widget/Editor$UndoInputFilter;->beginBatchEdit()V
-HSPLandroid/widget/Editor$UndoInputFilter;->canUndoEdit(Ljava/lang/CharSequence;IILandroid/text/Spanned;II)Z
-HSPLandroid/widget/Editor$UndoInputFilter;->endBatchEdit()V
-HSPLandroid/widget/Editor$UndoInputFilter;->filter(Ljava/lang/CharSequence;IILandroid/text/Spanned;II)Ljava/lang/CharSequence;
-HSPLandroid/widget/Editor$UndoInputFilter;->handleEdit(Ljava/lang/CharSequence;IILandroid/text/Spanned;IIZ)V
-HSPLandroid/widget/Editor$UndoInputFilter;->recordEdit(Landroid/widget/Editor$EditOperation;I)V
-HSPLandroid/widget/Editor$UndoInputFilter;->restoreInstanceState(Landroid/os/Parcel;)V
-HSPLandroid/widget/Editor$UndoInputFilter;->saveInstanceState(Landroid/os/Parcel;)V
-HSPLandroid/widget/Editor;->-$$Nest$fgetmTextView(Landroid/widget/Editor;)Landroid/widget/TextView;
-HSPLandroid/widget/Editor;->-$$Nest$mgetInputMethodManager(Landroid/widget/Editor;)Landroid/view/inputmethod/InputMethodManager;
-HSPLandroid/widget/Editor;-><init>(Landroid/widget/TextView;)V
-HSPLandroid/widget/Editor;->addSpanWatchers(Landroid/text/Spannable;)V
-HSPLandroid/widget/Editor;->adjustInputType(ZZZZ)V
-HSPLandroid/widget/Editor;->beforeSetText()V
-HSPLandroid/widget/Editor;->beginBatchEdit()V
-HSPLandroid/widget/Editor;->clampHorizontalPosition(Landroid/graphics/drawable/Drawable;F)I
-HSPLandroid/widget/Editor;->createInputContentTypeIfNeeded()V
-HSPLandroid/widget/Editor;->createInputMethodStateIfNeeded()V
-HSPLandroid/widget/Editor;->discardTextDisplayLists()V
-HSPLandroid/widget/Editor;->downgradeEasyCorrectionSpans()V
-HSPLandroid/widget/Editor;->drawHardwareAcceleratedInner(Landroid/graphics/Canvas;Landroid/text/Layout;Landroid/graphics/Path;Landroid/graphics/Paint;I[I[IIII)I+]Landroid/widget/Editor$TextRenderNode;Landroid/widget/Editor$TextRenderNode;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/text/Layout;Landroid/text/DynamicLayout;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;
-HSPLandroid/widget/Editor;->endBatchEdit()V
-HSPLandroid/widget/Editor;->ensureEndedBatchEdit()V
-HSPLandroid/widget/Editor;->ensureNoSelectionIfNonSelectable()V
-HSPLandroid/widget/Editor;->extractedTextModeWillBeStarted()Z
-HSPLandroid/widget/Editor;->finishBatchEdit(Landroid/widget/Editor$InputMethodState;)V
-HSPLandroid/widget/Editor;->forgetUndoRedo()V
-HSPLandroid/widget/Editor;->getAvailableDisplayListIndex([III)I
-HSPLandroid/widget/Editor;->getDefaultOnReceiveContentListener()Landroid/widget/TextViewOnReceiveContentListener;
-HSPLandroid/widget/Editor;->getInputMethodManager()Landroid/view/inputmethod/InputMethodManager;
-HSPLandroid/widget/Editor;->getInsertionController()Landroid/widget/Editor$InsertionPointCursorController;
-HSPLandroid/widget/Editor;->getLastTapPosition()I
-HSPLandroid/widget/Editor;->getPositionListener()Landroid/widget/Editor$PositionListener;
-HSPLandroid/widget/Editor;->getSelectionActionModeHelper()Landroid/widget/SelectionActionModeHelper;
-HSPLandroid/widget/Editor;->getSelectionController()Landroid/widget/Editor$SelectionModifierCursorController;
-HSPLandroid/widget/Editor;->getTextActionMode()Landroid/view/ActionMode;
-HSPLandroid/widget/Editor;->getTextView()Landroid/widget/TextView;
-HSPLandroid/widget/Editor;->hasInsertionController()Z
-HSPLandroid/widget/Editor;->hasSelectionController()Z
-HSPLandroid/widget/Editor;->hideCursorAndSpanControllers()V
-HSPLandroid/widget/Editor;->hideInsertionPointCursorController()V
-HSPLandroid/widget/Editor;->invalidateHandlesAndActionMode()V
-HSPLandroid/widget/Editor;->invalidateTextDisplayList()V
-HSPLandroid/widget/Editor;->invalidateTextDisplayList(Landroid/text/Layout;II)V
-HSPLandroid/widget/Editor;->isCursorInsideEasyCorrectionSpan()Z
-HSPLandroid/widget/Editor;->loadCursorDrawable()V
-HSPLandroid/widget/Editor;->loadHandleDrawables(Z)V
-HSPLandroid/widget/Editor;->makeBlink()V
-HSPLandroid/widget/Editor;->maybeFireScheduledRestartInputForSetText()V
-HSPLandroid/widget/Editor;->onAttachedToWindow()V
-HSPLandroid/widget/Editor;->onDetachedFromWindow()V
-HSPLandroid/widget/Editor;->onDraw(Landroid/graphics/Canvas;Landroid/text/Layout;Ljava/util/List;Ljava/util/List;Landroid/graphics/Path;Landroid/graphics/Paint;I)V
-HSPLandroid/widget/Editor;->onFocusChanged(ZI)V
-HSPLandroid/widget/Editor;->onLocaleChanged()V
-HSPLandroid/widget/Editor;->onScreenStateChanged(I)V
-HSPLandroid/widget/Editor;->onScrollChanged()V
-HSPLandroid/widget/Editor;->onTouchEvent(Landroid/view/MotionEvent;)V+]Landroid/widget/Editor;Landroid/widget/Editor;]Landroid/widget/EditorTouchState;Landroid/widget/EditorTouchState;]Landroid/widget/Editor$SelectionModifierCursorController;Landroid/widget/Editor$SelectionModifierCursorController;]Landroid/view/MotionEvent;Landroid/view/MotionEvent;
-HSPLandroid/widget/Editor;->onTouchUpEvent(Landroid/view/MotionEvent;)V
-HSPLandroid/widget/Editor;->onWindowFocusChanged(Z)V
-HSPLandroid/widget/Editor;->prepareCursorControllers()V+]Landroid/view/View;Lcom/android/internal/policy/DecorView;]Landroid/widget/Editor;Landroid/widget/Editor;
-HSPLandroid/widget/Editor;->refreshTextActionMode()V
-HSPLandroid/widget/Editor;->reportExtractedText()Z
-HSPLandroid/widget/Editor;->restoreInstanceState(Landroid/os/ParcelableParcel;)V
-HSPLandroid/widget/Editor;->resumeBlink()V
-HSPLandroid/widget/Editor;->saveInstanceState()Landroid/os/ParcelableParcel;
-HSPLandroid/widget/Editor;->scheduleRestartInputForSetText()V
-HSPLandroid/widget/Editor;->sendOnTextChanged(III)V
-HSPLandroid/widget/Editor;->sendUpdateSelection()V
-HSPLandroid/widget/Editor;->setFrame()V
-HSPLandroid/widget/Editor;->setTransformationMethod(Landroid/text/method/TransformationMethod;)V
-HSPLandroid/widget/Editor;->shouldBlink()Z
-HSPLandroid/widget/Editor;->shouldFilterOutTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/widget/Editor;->shouldRenderCursor()Z
-HSPLandroid/widget/Editor;->stopTextActionMode()V
-HSPLandroid/widget/Editor;->unregisterOnBackInvokedCallback()V
-HSPLandroid/widget/Editor;->updateCursorPosition()V
-HSPLandroid/widget/Editor;->updateCursorPosition(IIF)V
-HSPLandroid/widget/Editor;->updateFloatingToolbarVisibility(Landroid/view/MotionEvent;)V
-HSPLandroid/widget/Editor;->updateSpellCheckSpans(IIZ)V
-HSPLandroid/widget/EditorTouchState;->getLastDownX()F
-HSPLandroid/widget/EditorTouchState;->getLastDownY()F
-HSPLandroid/widget/EditorTouchState;->isMovedEnoughForDrag()Z
-HSPLandroid/widget/EditorTouchState;->isMultiTap()Z
-HSPLandroid/widget/EditorTouchState;->isMultiTapInSameArea()Z
-HSPLandroid/widget/EditorTouchState;->update(Landroid/view/MotionEvent;Landroid/view/ViewConfiguration;)V+]Landroid/view/ViewConfiguration;Landroid/view/ViewConfiguration;]Landroid/view/MotionEvent;Landroid/view/MotionEvent;
-HSPLandroid/widget/Filter;-><init>()V
-HSPLandroid/widget/ForwardingListener;-><init>(Landroid/view/View;)V
-HSPLandroid/widget/ForwardingListener;->onViewAttachedToWindow(Landroid/view/View;)V
-HSPLandroid/widget/ForwardingListener;->onViewDetachedFromWindow(Landroid/view/View;)V
-HSPLandroid/widget/FrameLayout$LayoutParams;-><init>(II)V
-HSPLandroid/widget/FrameLayout$LayoutParams;-><init>(III)V
-HSPLandroid/widget/FrameLayout$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/FrameLayout$LayoutParams;-><init>(Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/widget/FrameLayout;-><init>(Landroid/content/Context;)V
-HSPLandroid/widget/FrameLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/FrameLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/FrameLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/FrameLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
-HSPLandroid/widget/FrameLayout;->generateDefaultLayoutParams()Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/widget/FrameLayout;->generateDefaultLayoutParams()Landroid/widget/FrameLayout$LayoutParams;
-HSPLandroid/widget/FrameLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/widget/FrameLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/FrameLayout$LayoutParams;
-HSPLandroid/widget/FrameLayout;->generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/widget/FrameLayout;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLandroid/widget/FrameLayout;->getPaddingBottomWithForeground()I+]Landroid/widget/FrameLayout;missing_types
-HSPLandroid/widget/FrameLayout;->getPaddingLeftWithForeground()I+]Landroid/widget/FrameLayout;missing_types
-HSPLandroid/widget/FrameLayout;->getPaddingRightWithForeground()I+]Landroid/widget/FrameLayout;missing_types
-HSPLandroid/widget/FrameLayout;->getPaddingTopWithForeground()I+]Landroid/widget/FrameLayout;missing_types
-HSPLandroid/widget/FrameLayout;->layoutChildren(IIIIZ)V+]Landroid/view/View;missing_types]Landroid/widget/FrameLayout;missing_types
-HSPLandroid/widget/FrameLayout;->onLayout(ZIIII)V+]Landroid/widget/FrameLayout;missing_types
-HSPLandroid/widget/FrameLayout;->onMeasure(II)V+]Landroid/widget/FrameLayout;missing_types]Landroid/view/View;missing_types]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/widget/FrameLayout;->setForegroundGravity(I)V
-HSPLandroid/widget/FrameLayout;->setMeasureAllChildren(Z)V
-HSPLandroid/widget/FrameLayout;->shouldDelayChildPressedState()Z
-HSPLandroid/widget/GridLayout$7$1;->getOffset(Landroid/widget/GridLayout;Landroid/view/View;Landroid/widget/GridLayout$Alignment;IZ)I
-HSPLandroid/widget/GridLayout$7$1;->include(II)V
-HSPLandroid/widget/GridLayout$7$1;->reset()V
-HSPLandroid/widget/GridLayout$7$1;->size(Z)I
-HSPLandroid/widget/GridLayout$7;->getAlignmentValue(Landroid/view/View;II)I
-HSPLandroid/widget/GridLayout$7;->getGravityOffset(Landroid/view/View;I)I
-HSPLandroid/widget/GridLayout$Alignment;->getSizeInCell(Landroid/view/View;II)I
-HSPLandroid/widget/GridLayout$Assoc;->pack()Landroid/widget/GridLayout$PackedMap;
-HSPLandroid/widget/GridLayout$Axis$1;-><init>(Landroid/widget/GridLayout$Axis;[Landroid/widget/GridLayout$Arc;)V
-HSPLandroid/widget/GridLayout$Axis$1;->walk(I)V
-HSPLandroid/widget/GridLayout$Axis;-><init>(Landroid/widget/GridLayout;Z)V
-HSPLandroid/widget/GridLayout$Axis;->calculateMaxIndex()I
-HSPLandroid/widget/GridLayout$Axis;->computeGroupBounds()V
-HSPLandroid/widget/GridLayout$Axis;->computeHasWeights()Z
-HSPLandroid/widget/GridLayout$Axis;->computeLinks(Landroid/widget/GridLayout$PackedMap;Z)V
-HSPLandroid/widget/GridLayout$Axis;->computeLocations([I)V
-HSPLandroid/widget/GridLayout$Axis;->createArcs()[Landroid/widget/GridLayout$Arc;
-HSPLandroid/widget/GridLayout$Axis;->createGroupBounds()Landroid/widget/GridLayout$PackedMap;
-HSPLandroid/widget/GridLayout$Axis;->createLinks(Z)Landroid/widget/GridLayout$PackedMap;
-HSPLandroid/widget/GridLayout$Axis;->getGroupBounds()Landroid/widget/GridLayout$PackedMap;
-HSPLandroid/widget/GridLayout$Axis;->getLocations()[I
-HSPLandroid/widget/GridLayout$Axis;->getMeasure(I)I
-HSPLandroid/widget/GridLayout$Axis;->groupArcsByFirstVertex([Landroid/widget/GridLayout$Arc;)[[Landroid/widget/GridLayout$Arc;
-HSPLandroid/widget/GridLayout$Axis;->include(Ljava/util/List;Landroid/widget/GridLayout$Interval;Landroid/widget/GridLayout$MutableInt;Z)V
-HSPLandroid/widget/GridLayout$Axis;->layout(I)V
-HSPLandroid/widget/GridLayout$Axis;->setCount(I)V
-HSPLandroid/widget/GridLayout$Axis;->solve([Landroid/widget/GridLayout$Arc;[IZ)Z
-HSPLandroid/widget/GridLayout$Bounds;->getOffset(Landroid/widget/GridLayout;Landroid/view/View;Landroid/widget/GridLayout$Alignment;IZ)I
-HSPLandroid/widget/GridLayout$Bounds;->include(II)V
-HSPLandroid/widget/GridLayout$Bounds;->reset()V
-HSPLandroid/widget/GridLayout$Bounds;->size(Z)I
-HSPLandroid/widget/GridLayout$Interval;->equals(Ljava/lang/Object;)Z
-HSPLandroid/widget/GridLayout$LayoutParams;->hashCode()I
-HSPLandroid/widget/GridLayout$PackedMap;->compact([Ljava/lang/Object;[I)[Ljava/lang/Object;
-HSPLandroid/widget/GridLayout$PackedMap;->createIndex([Ljava/lang/Object;)[I
-HSPLandroid/widget/GridLayout$PackedMap;->getValue(I)Ljava/lang/Object;
-HSPLandroid/widget/GridLayout$Spec;->hashCode()I
-HSPLandroid/widget/GridLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/GridLayout;->computeLayoutParamsHashCode()I
-HSPLandroid/widget/GridLayout;->consistencyCheck()V
-HSPLandroid/widget/GridLayout;->getDefaultMargin(Landroid/view/View;Landroid/widget/GridLayout$LayoutParams;ZZ)I
-HSPLandroid/widget/GridLayout;->getLayoutParams(Landroid/view/View;)Landroid/widget/GridLayout$LayoutParams;
-HSPLandroid/widget/GridLayout;->getMargin(Landroid/view/View;ZZ)I
-HSPLandroid/widget/GridLayout;->getMargin1(Landroid/view/View;ZZ)I
-HSPLandroid/widget/GridLayout;->getMeasurement(Landroid/view/View;Z)I
-HSPLandroid/widget/GridLayout;->measureChildrenWithMargins(IIZ)V
-HSPLandroid/widget/GridLayout;->onLayout(ZIIII)V
-HSPLandroid/widget/GridLayout;->onMeasure(II)V
-HSPLandroid/widget/GridLayout;->requestLayout()V
-HSPLandroid/widget/GridLayout;->setAlignmentMode(I)V
-HSPLandroid/widget/GridLayout;->setColumnCount(I)V
-HSPLandroid/widget/GridLayout;->setColumnOrderPreserved(Z)V
-HSPLandroid/widget/GridLayout;->setOrientation(I)V
-HSPLandroid/widget/GridLayout;->setRowCount(I)V
-HSPLandroid/widget/GridLayout;->setRowOrderPreserved(Z)V
-HSPLandroid/widget/GridLayout;->setUseDefaultMargins(Z)V
-HSPLandroid/widget/GridLayout;->validateLayoutParams()V
-HSPLandroid/widget/HorizontalScrollView$SavedState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/widget/HorizontalScrollView$SavedState;
-HSPLandroid/widget/HorizontalScrollView$SavedState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/widget/HorizontalScrollView$SavedState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/HorizontalScrollView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/HorizontalScrollView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/HorizontalScrollView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/HorizontalScrollView;->addView(Landroid/view/View;)V
-HSPLandroid/widget/HorizontalScrollView;->addView(Landroid/view/View;I)V
-HSPLandroid/widget/HorizontalScrollView;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/widget/HorizontalScrollView;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/widget/HorizontalScrollView;->computeScroll()V
-HSPLandroid/widget/HorizontalScrollView;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/HorizontalScrollView;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLandroid/widget/HorizontalScrollView;->getScrollRange()I
-HSPLandroid/widget/HorizontalScrollView;->inChild(II)Z
-HSPLandroid/widget/HorizontalScrollView;->initScrollView()V
-HSPLandroid/widget/HorizontalScrollView;->measureChildWithMargins(Landroid/view/View;IIII)V
-HSPLandroid/widget/HorizontalScrollView;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/widget/HorizontalScrollView;->onLayout(ZIIII)V
-HSPLandroid/widget/HorizontalScrollView;->onMeasure(II)V
-HSPLandroid/widget/HorizontalScrollView;->onRestoreInstanceState(Landroid/os/Parcelable;)V
-HSPLandroid/widget/HorizontalScrollView;->onSaveInstanceState()Landroid/os/Parcelable;
-HSPLandroid/widget/HorizontalScrollView;->onSizeChanged(IIII)V
-HSPLandroid/widget/HorizontalScrollView;->requestLayout()V
-HSPLandroid/widget/HorizontalScrollView;->scrollTo(II)V
-HSPLandroid/widget/HorizontalScrollView;->setFillViewport(Z)V
-HSPLandroid/widget/HorizontalScrollView;->shouldDelayChildPressedState()Z
-HSPLandroid/widget/ImageButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/ImageButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/ImageButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/ImageButton;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLandroid/widget/ImageButton;->onSetAlpha(I)Z
-HSPLandroid/widget/ImageView$ScaleType;->values()[Landroid/widget/ImageView$ScaleType;
-HSPLandroid/widget/ImageView;-><init>(Landroid/content/Context;)V
-HSPLandroid/widget/ImageView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/ImageView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/ImageView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V+]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;
-HSPLandroid/widget/ImageView;->applyAlpha()V
-HSPLandroid/widget/ImageView;->applyColorFilter()V
-HSPLandroid/widget/ImageView;->applyImageTint()V
-HSPLandroid/widget/ImageView;->applyXfermode()V
-HSPLandroid/widget/ImageView;->clearColorFilter()V
-HSPLandroid/widget/ImageView;->configureBounds()V
-HSPLandroid/widget/ImageView;->drawableHotspotChanged(FF)V
-HSPLandroid/widget/ImageView;->drawableStateChanged()V
-HSPLandroid/widget/ImageView;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLandroid/widget/ImageView;->getBaseline()I
-HSPLandroid/widget/ImageView;->getDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/ImageView;->getImageMatrix()Landroid/graphics/Matrix;
-HSPLandroid/widget/ImageView;->getScaleType()Landroid/widget/ImageView$ScaleType;
-HSPLandroid/widget/ImageView;->hasOverlappingRendering()Z
-HSPLandroid/widget/ImageView;->initImageView()V
-HSPLandroid/widget/ImageView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ImageView;->isFilledByImage()Z
-HSPLandroid/widget/ImageView;->isOpaque()Z
-HSPLandroid/widget/ImageView;->jumpDrawablesToCurrentState()V
-HSPLandroid/widget/ImageView;->onAttachedToWindow()V
-HSPLandroid/widget/ImageView;->onCreateDrawableState(I)[I
-HSPLandroid/widget/ImageView;->onDetachedFromWindow()V
-HSPLandroid/widget/ImageView;->onDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/ImageView;->onMeasure(II)V
-HSPLandroid/widget/ImageView;->onRtlPropertiesChanged(I)V
-HSPLandroid/widget/ImageView;->onVisibilityAggregated(Z)V
-HSPLandroid/widget/ImageView;->resizeFromDrawable()V
-HSPLandroid/widget/ImageView;->resolveAdjustedSize(III)I
-HSPLandroid/widget/ImageView;->resolveUri()V
-HSPLandroid/widget/ImageView;->scaleTypeToScaleToFit(Landroid/widget/ImageView$ScaleType;)Landroid/graphics/Matrix$ScaleToFit;
-HSPLandroid/widget/ImageView;->setAdjustViewBounds(Z)V
-HSPLandroid/widget/ImageView;->setAlpha(I)V
-HSPLandroid/widget/ImageView;->setColorFilter(I)V
-HSPLandroid/widget/ImageView;->setColorFilter(ILandroid/graphics/PorterDuff$Mode;)V
-HSPLandroid/widget/ImageView;->setColorFilter(Landroid/graphics/ColorFilter;)V
-HSPLandroid/widget/ImageView;->setCropToPadding(Z)V
-HSPLandroid/widget/ImageView;->setFrame(IIII)Z
-HSPLandroid/widget/ImageView;->setImageAlpha(I)V
-HSPLandroid/widget/ImageView;->setImageBitmap(Landroid/graphics/Bitmap;)V
-HSPLandroid/widget/ImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ImageView;->setImageMatrix(Landroid/graphics/Matrix;)V+]Landroid/graphics/Matrix;Landroid/graphics/Matrix;
-HSPLandroid/widget/ImageView;->setImageResource(I)V
-HSPLandroid/widget/ImageView;->setImageTintBlendMode(Landroid/graphics/BlendMode;)V
-HSPLandroid/widget/ImageView;->setImageTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/widget/ImageView;->setMaxHeight(I)V
-HSPLandroid/widget/ImageView;->setMaxWidth(I)V
-HSPLandroid/widget/ImageView;->setScaleType(Landroid/widget/ImageView$ScaleType;)V
-HSPLandroid/widget/ImageView;->setSelected(Z)V
-HSPLandroid/widget/ImageView;->setVisibility(I)V
-HSPLandroid/widget/ImageView;->updateDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ImageView;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z
-HSPLandroid/widget/LinearLayout$LayoutParams;-><init>(II)V
-HSPLandroid/widget/LinearLayout$LayoutParams;-><init>(IIF)V
-HSPLandroid/widget/LinearLayout$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/LinearLayout$LayoutParams;-><init>(Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/widget/LinearLayout;-><init>(Landroid/content/Context;)V
-HSPLandroid/widget/LinearLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/LinearLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/LinearLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V+]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Landroid/widget/LinearLayout;Landroid/widget/LinearLayout;
-HSPLandroid/widget/LinearLayout;->allViewsAreGoneBefore(I)Z
-HSPLandroid/widget/LinearLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
-HSPLandroid/widget/LinearLayout;->forceUniformHeight(II)V
-HSPLandroid/widget/LinearLayout;->forceUniformWidth(II)V
-HSPLandroid/widget/LinearLayout;->generateDefaultLayoutParams()Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/widget/LinearLayout;->generateDefaultLayoutParams()Landroid/widget/LinearLayout$LayoutParams;
-HSPLandroid/widget/LinearLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/widget/LinearLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/LinearLayout$LayoutParams;
-HSPLandroid/widget/LinearLayout;->generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/widget/LinearLayout;->generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/widget/LinearLayout$LayoutParams;
-HSPLandroid/widget/LinearLayout;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLandroid/widget/LinearLayout;->getBaseline()I
-HSPLandroid/widget/LinearLayout;->getChildrenSkipCount(Landroid/view/View;I)I
-HSPLandroid/widget/LinearLayout;->getDividerDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/LinearLayout;->getGravity()I
-HSPLandroid/widget/LinearLayout;->getLocationOffset(Landroid/view/View;)I
-HSPLandroid/widget/LinearLayout;->getNextLocationOffset(Landroid/view/View;)I
-HSPLandroid/widget/LinearLayout;->getOrientation()I
-HSPLandroid/widget/LinearLayout;->getVirtualChildAt(I)Landroid/view/View;+]Landroid/widget/LinearLayout;missing_types
-HSPLandroid/widget/LinearLayout;->getVirtualChildCount()I+]Landroid/widget/LinearLayout;missing_types
-HSPLandroid/widget/LinearLayout;->hasDividerBeforeChildAt(I)Z
-HSPLandroid/widget/LinearLayout;->layoutHorizontal(IIII)V
-HSPLandroid/widget/LinearLayout;->layoutVertical(IIII)V+]Landroid/view/View;missing_types]Landroid/widget/LinearLayout;missing_types
-HSPLandroid/widget/LinearLayout;->measureChildBeforeLayout(Landroid/view/View;IIIII)V+]Landroid/widget/LinearLayout;missing_types
-HSPLandroid/widget/LinearLayout;->measureHorizontal(II)V+]Landroid/view/View;missing_types]Landroid/widget/LinearLayout;Landroid/widget/LinearLayout;
-HSPLandroid/widget/LinearLayout;->measureVertical(II)V+]Landroid/view/View;megamorphic_types]Landroid/widget/LinearLayout;missing_types
-HSPLandroid/widget/LinearLayout;->onDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/LinearLayout;->onLayout(ZIIII)V+]Landroid/widget/LinearLayout;missing_types
-HSPLandroid/widget/LinearLayout;->onMeasure(II)V+]Landroid/widget/LinearLayout;missing_types
-HSPLandroid/widget/LinearLayout;->onRtlPropertiesChanged(I)V
-HSPLandroid/widget/LinearLayout;->setBaselineAligned(Z)V
-HSPLandroid/widget/LinearLayout;->setChildFrame(Landroid/view/View;IIII)V+]Landroid/view/View;missing_types
-HSPLandroid/widget/LinearLayout;->setDividerDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/LinearLayout;->setGravity(I)V
-HSPLandroid/widget/LinearLayout;->setOrientation(I)V
-HSPLandroid/widget/LinearLayout;->shouldDelayChildPressedState()Z
-HSPLandroid/widget/ListPopupWindow;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/ListPopupWindow;->isShowing()Z
-HSPLandroid/widget/ListPopupWindow;->setAdapter(Landroid/widget/ListAdapter;)V
-HSPLandroid/widget/ListPopupWindow;->setAnchorView(Landroid/view/View;)V
-HSPLandroid/widget/ListPopupWindow;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ListPopupWindow;->setHeight(I)V
-HSPLandroid/widget/ListPopupWindow;->setListSelector(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ListPopupWindow;->setModal(Z)V
-HSPLandroid/widget/ListPopupWindow;->setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V
-HSPLandroid/widget/ListPopupWindow;->setPromptPosition(I)V
-HSPLandroid/widget/ListPopupWindow;->setPromptView(Landroid/view/View;)V
-HSPLandroid/widget/ListPopupWindow;->setSoftInputMode(I)V
-HSPLandroid/widget/ListPopupWindow;->setWidth(I)V
-HSPLandroid/widget/ListView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/ListView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/ListView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/ListView;->adjustViewsUpOrDown()V
-HSPLandroid/widget/ListView;->clearRecycledState(Ljava/util/ArrayList;)V
-HSPLandroid/widget/ListView;->correctTooHigh(I)V
-HSPLandroid/widget/ListView;->dispatchDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/ListView;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z
-HSPLandroid/widget/ListView;->fillDown(II)Landroid/view/View;
-HSPLandroid/widget/ListView;->fillFromTop(I)Landroid/view/View;
-HSPLandroid/widget/ListView;->fillSpecific(II)Landroid/view/View;
-HSPLandroid/widget/ListView;->fillUp(II)Landroid/view/View;
-HSPLandroid/widget/ListView;->findMotionRow(I)I
-HSPLandroid/widget/ListView;->findViewInHeadersOrFooters(Ljava/util/ArrayList;I)Landroid/view/View;
-HSPLandroid/widget/ListView;->findViewTraversal(I)Landroid/view/View;
-HSPLandroid/widget/ListView;->getAdapter()Landroid/widget/Adapter;
-HSPLandroid/widget/ListView;->getAdapter()Landroid/widget/ListAdapter;
-HSPLandroid/widget/ListView;->getHeaderViewsCount()I
-HSPLandroid/widget/ListView;->isOpaque()Z
-HSPLandroid/widget/ListView;->layoutChildren()V
-HSPLandroid/widget/ListView;->lookForSelectablePosition(IZ)I
-HSPLandroid/widget/ListView;->makeAndAddView(IIZIZ)Landroid/view/View;
-HSPLandroid/widget/ListView;->measureHeightOfChildren(IIIII)I
-HSPLandroid/widget/ListView;->measureScrapChild(Landroid/view/View;III)V
-HSPLandroid/widget/ListView;->onDetachedFromWindow()V
-HSPLandroid/widget/ListView;->onFinishInflate()V
-HSPLandroid/widget/ListView;->onMeasure(II)V
-HSPLandroid/widget/ListView;->onSizeChanged(IIII)V
-HSPLandroid/widget/ListView;->recycleOnMeasure()Z
-HSPLandroid/widget/ListView;->removeUnusedFixedViews(Ljava/util/List;)V
-HSPLandroid/widget/ListView;->resetList()V
-HSPLandroid/widget/ListView;->setAdapter(Landroid/widget/ListAdapter;)V
-HSPLandroid/widget/ListView;->setCacheColorHint(I)V
-HSPLandroid/widget/ListView;->setDivider(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ListView;->setSelection(I)V
-HSPLandroid/widget/ListView;->setupChild(Landroid/view/View;IIZIZZ)V
-HSPLandroid/widget/OverScroller$SplineOverScroller;-><init>(Landroid/content/Context;)V+]Landroid/content/res/Resources;Landroid/content/res/Resources;
-HSPLandroid/widget/OverScroller$SplineOverScroller;->adjustDuration(III)V
-HSPLandroid/widget/OverScroller$SplineOverScroller;->continueWhenFinished()Z
-HSPLandroid/widget/OverScroller$SplineOverScroller;->finish()V
-HSPLandroid/widget/OverScroller$SplineOverScroller;->fling(IIIII)V
-HSPLandroid/widget/OverScroller$SplineOverScroller;->getSplineDeceleration(I)D
-HSPLandroid/widget/OverScroller$SplineOverScroller;->getSplineFlingDistance(I)D
-HSPLandroid/widget/OverScroller$SplineOverScroller;->onEdgeReached()V
-HSPLandroid/widget/OverScroller$SplineOverScroller;->springback(III)Z
-HSPLandroid/widget/OverScroller$SplineOverScroller;->startScroll(III)V
-HSPLandroid/widget/OverScroller$SplineOverScroller;->startSpringback(III)V
-HSPLandroid/widget/OverScroller$SplineOverScroller;->update()Z
-HSPLandroid/widget/OverScroller$SplineOverScroller;->updateScroll(F)V
-HSPLandroid/widget/OverScroller;-><init>(Landroid/content/Context;)V
-HSPLandroid/widget/OverScroller;-><init>(Landroid/content/Context;Landroid/view/animation/Interpolator;)V
-HSPLandroid/widget/OverScroller;-><init>(Landroid/content/Context;Landroid/view/animation/Interpolator;Z)V
-HSPLandroid/widget/OverScroller;->abortAnimation()V
-HSPLandroid/widget/OverScroller;->computeScrollOffset()Z
-HSPLandroid/widget/OverScroller;->fling(IIIIIIII)V
-HSPLandroid/widget/OverScroller;->fling(IIIIIIIIII)V+]Landroid/widget/OverScroller;Landroid/widget/OverScroller;]Landroid/widget/OverScroller$SplineOverScroller;Landroid/widget/OverScroller$SplineOverScroller;
-HSPLandroid/widget/OverScroller;->forceFinished(Z)V
-HSPLandroid/widget/OverScroller;->getCurrVelocity()F
-HSPLandroid/widget/OverScroller;->getCurrX()I
-HSPLandroid/widget/OverScroller;->getCurrY()I
-HSPLandroid/widget/OverScroller;->getFinalX()I
-HSPLandroid/widget/OverScroller;->getFinalY()I
-HSPLandroid/widget/OverScroller;->isFinished()Z
-HSPLandroid/widget/OverScroller;->springBack(IIIIII)Z
-HSPLandroid/widget/OverScroller;->startScroll(IIIII)V
-HSPLandroid/widget/PopupWindow$PopupBackgroundView;->onCreateDrawableState(I)[I
-HSPLandroid/widget/PopupWindow$PopupDecorView;->cancelTransitions()V
-HSPLandroid/widget/PopupWindow$PopupDecorView;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/widget/PopupWindow$PopupDecorView;->onAttachedToWindow()V
-HSPLandroid/widget/PopupWindow$PopupDecorView;->onDetachedFromWindow()V
-HSPLandroid/widget/PopupWindow;->-$$Nest$munregisterBackCallback(Landroid/widget/PopupWindow;Landroid/window/OnBackInvokedDispatcher;)V
-HSPLandroid/widget/PopupWindow;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/PopupWindow;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/PopupWindow;-><init>(Landroid/view/View;II)V
-HSPLandroid/widget/PopupWindow;-><init>(Landroid/view/View;IIZ)V
-HSPLandroid/widget/PopupWindow;->attachToAnchor(Landroid/view/View;III)V
-HSPLandroid/widget/PopupWindow;->computeFlags(I)I
-HSPLandroid/widget/PopupWindow;->createBackgroundView(Landroid/view/View;)Landroid/widget/PopupWindow$PopupBackgroundView;
-HSPLandroid/widget/PopupWindow;->createDecorView(Landroid/view/View;)Landroid/widget/PopupWindow$PopupDecorView;
-HSPLandroid/widget/PopupWindow;->createPopupLayoutParams(Landroid/os/IBinder;)Landroid/view/WindowManager$LayoutParams;
-HSPLandroid/widget/PopupWindow;->detachFromAnchor()V
-HSPLandroid/widget/PopupWindow;->dismiss()V
-HSPLandroid/widget/PopupWindow;->findDropDownPosition(Landroid/view/View;Landroid/view/WindowManager$LayoutParams;IIIIIZ)Z
-HSPLandroid/widget/PopupWindow;->getAnchor()Landroid/view/View;
-HSPLandroid/widget/PopupWindow;->getAppRootView(Landroid/view/View;)Landroid/view/View;
-HSPLandroid/widget/PopupWindow;->getBackground()Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/PopupWindow;->getContentView()Landroid/view/View;
-HSPLandroid/widget/PopupWindow;->getDecorViewLayoutParams()Landroid/view/WindowManager$LayoutParams;
-HSPLandroid/widget/PopupWindow;->getHeight()I
-HSPLandroid/widget/PopupWindow;->getTransition(I)Landroid/transition/Transition;
-HSPLandroid/widget/PopupWindow;->getWidth()I
-HSPLandroid/widget/PopupWindow;->hasContentView()Z
-HSPLandroid/widget/PopupWindow;->invokePopup(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/widget/PopupWindow;->isShowing()Z
-HSPLandroid/widget/PopupWindow;->isSplitTouchEnabled()Z
-HSPLandroid/widget/PopupWindow;->preparePopup(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/widget/PopupWindow;->setAttachedInDecor(Z)V
-HSPLandroid/widget/PopupWindow;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/PopupWindow;->setContentView(Landroid/view/View;)V
-HSPLandroid/widget/PopupWindow;->setEnterTransition(Landroid/transition/Transition;)V
-HSPLandroid/widget/PopupWindow;->setExitTransition(Landroid/transition/Transition;)V
-HSPLandroid/widget/PopupWindow;->setFocusable(Z)V
-HSPLandroid/widget/PopupWindow;->setHeight(I)V
-HSPLandroid/widget/PopupWindow;->setInputMethodMode(I)V
-HSPLandroid/widget/PopupWindow;->setOnDismissListener(Landroid/widget/PopupWindow$OnDismissListener;)V
-HSPLandroid/widget/PopupWindow;->setOutsideTouchable(Z)V
-HSPLandroid/widget/PopupWindow;->setSoftInputMode(I)V
-HSPLandroid/widget/PopupWindow;->setTouchInterceptor(Landroid/view/View$OnTouchListener;)V
-HSPLandroid/widget/PopupWindow;->setWidth(I)V
-HSPLandroid/widget/PopupWindow;->setWindowLayoutType(I)V
-HSPLandroid/widget/PopupWindow;->showAsDropDown(Landroid/view/View;III)V
-HSPLandroid/widget/PopupWindow;->showAtLocation(Landroid/os/IBinder;III)V
-HSPLandroid/widget/PopupWindow;->showAtLocation(Landroid/view/View;III)V
-HSPLandroid/widget/PopupWindow;->tryFitHorizontal(Landroid/view/WindowManager$LayoutParams;IIIIIIIZ)Z
-HSPLandroid/widget/PopupWindow;->tryFitVertical(Landroid/view/WindowManager$LayoutParams;IIIIIIIZ)Z
-HSPLandroid/widget/PopupWindow;->unregisterBackCallback(Landroid/window/OnBackInvokedDispatcher;)V
-HSPLandroid/widget/PopupWindow;->update(IIII)V
-HSPLandroid/widget/PopupWindow;->update(IIIIZ)V
-HSPLandroid/widget/PopupWindow;->update(Landroid/view/View;Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/widget/PopupWindow;->updateAboveAnchor(Z)V
-HSPLandroid/widget/ProgressBar$2;-><init>(Landroid/widget/ProgressBar;Ljava/lang/String;)V
-HSPLandroid/widget/ProgressBar$SavedState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/widget/ProgressBar$SavedState;
-HSPLandroid/widget/ProgressBar$SavedState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/widget/ProgressBar$SavedState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/ProgressBar;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/ProgressBar;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/ProgressBar;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/ProgressBar;->applyIndeterminateTint()V
-HSPLandroid/widget/ProgressBar;->applyPrimaryProgressTint()V
-HSPLandroid/widget/ProgressBar;->applyProgressBackgroundTint()V
-HSPLandroid/widget/ProgressBar;->applyProgressTints()V
-HSPLandroid/widget/ProgressBar;->doRefreshProgress(IIZZZ)V
-HSPLandroid/widget/ProgressBar;->drawTrack(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/ProgressBar;->drawableHotspotChanged(FF)V
-HSPLandroid/widget/ProgressBar;->drawableStateChanged()V
-HSPLandroid/widget/ProgressBar;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLandroid/widget/ProgressBar;->getCurrentDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/ProgressBar;->getIndeterminateDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/ProgressBar;->getMax()I
-HSPLandroid/widget/ProgressBar;->getMin()I
-HSPLandroid/widget/ProgressBar;->getProgress()I
-HSPLandroid/widget/ProgressBar;->getProgressDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/ProgressBar;->initProgressBar()V
-HSPLandroid/widget/ProgressBar;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V+]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/AnimatedStateListDrawable;,Landroid/graphics/drawable/GradientDrawable;,Landroid/graphics/drawable/LayerDrawable;,Landroid/graphics/drawable/RippleDrawable;
-HSPLandroid/widget/ProgressBar;->isIndeterminate()Z
-HSPLandroid/widget/ProgressBar;->jumpDrawablesToCurrentState()V
-HSPLandroid/widget/ProgressBar;->needsTileify(Landroid/graphics/drawable/Drawable;)Z
-HSPLandroid/widget/ProgressBar;->onAttachedToWindow()V
-HSPLandroid/widget/ProgressBar;->onDetachedFromWindow()V
-HSPLandroid/widget/ProgressBar;->onDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/ProgressBar;->onMeasure(II)V
-HSPLandroid/widget/ProgressBar;->onProgressRefresh(FZI)V
-HSPLandroid/widget/ProgressBar;->onResolveDrawables(I)V
-HSPLandroid/widget/ProgressBar;->onRestoreInstanceState(Landroid/os/Parcelable;)V
-HSPLandroid/widget/ProgressBar;->onSaveInstanceState()Landroid/os/Parcelable;
-HSPLandroid/widget/ProgressBar;->onSizeChanged(IIII)V
-HSPLandroid/widget/ProgressBar;->onVisibilityAggregated(Z)V
-HSPLandroid/widget/ProgressBar;->onVisualProgressChanged(IF)V
-HSPLandroid/widget/ProgressBar;->postInvalidate()V
-HSPLandroid/widget/ProgressBar;->refreshProgress(IIZZ)V
-HSPLandroid/widget/ProgressBar;->setIndeterminate(Z)V
-HSPLandroid/widget/ProgressBar;->setIndeterminateDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ProgressBar;->setInterpolator(Landroid/content/Context;I)V
-HSPLandroid/widget/ProgressBar;->setInterpolator(Landroid/view/animation/Interpolator;)V
-HSPLandroid/widget/ProgressBar;->setMax(I)V
-HSPLandroid/widget/ProgressBar;->setMin(I)V
-HSPLandroid/widget/ProgressBar;->setProgress(I)V
-HSPLandroid/widget/ProgressBar;->setProgressDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ProgressBar;->setProgressInternal(IZZ)Z
-HSPLandroid/widget/ProgressBar;->setSecondaryProgress(I)V
-HSPLandroid/widget/ProgressBar;->setVisualProgress(IF)V
-HSPLandroid/widget/ProgressBar;->startAnimation()V
-HSPLandroid/widget/ProgressBar;->stopAnimation()V
-HSPLandroid/widget/ProgressBar;->swapCurrentDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ProgressBar;->updateDrawableBounds(II)V
-HSPLandroid/widget/ProgressBar;->updateDrawableState()V
-HSPLandroid/widget/ProgressBar;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z
-HSPLandroid/widget/RelativeLayout$DependencyGraph$Node;-><init>()V
-HSPLandroid/widget/RelativeLayout$DependencyGraph$Node;->acquire(Landroid/view/View;)Landroid/widget/RelativeLayout$DependencyGraph$Node;
-HSPLandroid/widget/RelativeLayout$DependencyGraph$Node;->release()V
-HSPLandroid/widget/RelativeLayout$DependencyGraph;-><init>()V
-HSPLandroid/widget/RelativeLayout$DependencyGraph;->add(Landroid/view/View;)V
-HSPLandroid/widget/RelativeLayout$DependencyGraph;->clear()V
-HSPLandroid/widget/RelativeLayout$DependencyGraph;->findRoots([I)Ljava/util/ArrayDeque;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLandroid/widget/RelativeLayout$DependencyGraph;->getSortedViews([Landroid/view/View;[I)V
-HSPLandroid/widget/RelativeLayout$LayoutParams;->-$$Nest$fgetmBottom(Landroid/widget/RelativeLayout$LayoutParams;)I
-HSPLandroid/widget/RelativeLayout$LayoutParams;->-$$Nest$fgetmLeft(Landroid/widget/RelativeLayout$LayoutParams;)I
-HSPLandroid/widget/RelativeLayout$LayoutParams;->-$$Nest$fgetmRight(Landroid/widget/RelativeLayout$LayoutParams;)I
-HSPLandroid/widget/RelativeLayout$LayoutParams;->-$$Nest$fgetmTop(Landroid/widget/RelativeLayout$LayoutParams;)I
-HSPLandroid/widget/RelativeLayout$LayoutParams;->-$$Nest$fputmBottom(Landroid/widget/RelativeLayout$LayoutParams;I)V
-HSPLandroid/widget/RelativeLayout$LayoutParams;->-$$Nest$fputmTop(Landroid/widget/RelativeLayout$LayoutParams;I)V
-HSPLandroid/widget/RelativeLayout$LayoutParams;-><init>(II)V
-HSPLandroid/widget/RelativeLayout$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;
-HSPLandroid/widget/RelativeLayout$LayoutParams;->addRule(I)V
-HSPLandroid/widget/RelativeLayout$LayoutParams;->addRule(II)V
-HSPLandroid/widget/RelativeLayout$LayoutParams;->getRules()[I
-HSPLandroid/widget/RelativeLayout$LayoutParams;->getRules(I)[I
-HSPLandroid/widget/RelativeLayout$LayoutParams;->hasRelativeRules()Z
-HSPLandroid/widget/RelativeLayout$LayoutParams;->removeRule(I)V
-HSPLandroid/widget/RelativeLayout$LayoutParams;->resolveLayoutDirection(I)V
-HSPLandroid/widget/RelativeLayout$LayoutParams;->resolveRules(I)V
-HSPLandroid/widget/RelativeLayout$LayoutParams;->shouldResolveLayoutDirection(I)Z
-HSPLandroid/widget/RelativeLayout;-><init>(Landroid/content/Context;)V
-HSPLandroid/widget/RelativeLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/RelativeLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/RelativeLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/RelativeLayout;->applyHorizontalSizeRules(Landroid/widget/RelativeLayout$LayoutParams;I[I)V
-HSPLandroid/widget/RelativeLayout;->applyVerticalSizeRules(Landroid/widget/RelativeLayout$LayoutParams;II)V+]Landroid/widget/RelativeLayout$LayoutParams;Landroid/widget/RelativeLayout$LayoutParams;
-HSPLandroid/widget/RelativeLayout;->centerHorizontal(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;I)V
-HSPLandroid/widget/RelativeLayout;->centerVertical(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;I)V
-HSPLandroid/widget/RelativeLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
-HSPLandroid/widget/RelativeLayout;->compareLayoutPosition(Landroid/widget/RelativeLayout$LayoutParams;Landroid/widget/RelativeLayout$LayoutParams;)I
-HSPLandroid/widget/RelativeLayout;->generateDefaultLayoutParams()Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/widget/RelativeLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/widget/RelativeLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/RelativeLayout$LayoutParams;
-HSPLandroid/widget/RelativeLayout;->generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/view/ViewGroup$LayoutParams;
-HSPLandroid/widget/RelativeLayout;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLandroid/widget/RelativeLayout;->getBaseline()I
-HSPLandroid/widget/RelativeLayout;->getChildMeasureSpec(IIIIIIII)I
-HSPLandroid/widget/RelativeLayout;->getRelatedView([II)Landroid/view/View;
-HSPLandroid/widget/RelativeLayout;->getRelatedViewBaselineOffset([I)I
-HSPLandroid/widget/RelativeLayout;->getRelatedViewParams([II)Landroid/widget/RelativeLayout$LayoutParams;
-HSPLandroid/widget/RelativeLayout;->initFromAttributes(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/RelativeLayout;->measureChild(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;II)V
-HSPLandroid/widget/RelativeLayout;->measureChildHorizontal(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;II)V
-HSPLandroid/widget/RelativeLayout;->onLayout(ZIIII)V
-HSPLandroid/widget/RelativeLayout;->onMeasure(II)V+]Landroid/widget/RelativeLayout;Landroid/widget/RelativeLayout;]Landroid/view/View;Landroid/widget/TextView;]Landroid/widget/RelativeLayout$LayoutParams;Landroid/widget/RelativeLayout$LayoutParams;
-HSPLandroid/widget/RelativeLayout;->positionAtEdge(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;I)V
-HSPLandroid/widget/RelativeLayout;->positionChildHorizontal(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;IZ)Z
-HSPLandroid/widget/RelativeLayout;->positionChildVertical(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;IZ)Z
-HSPLandroid/widget/RelativeLayout;->queryCompatibilityModes(Landroid/content/Context;)V
-HSPLandroid/widget/RelativeLayout;->requestLayout()V
-HSPLandroid/widget/RelativeLayout;->shouldDelayChildPressedState()Z
-HSPLandroid/widget/RelativeLayout;->sortChildren()V+]Landroid/widget/RelativeLayout;Landroid/widget/RelativeLayout;]Landroid/widget/RelativeLayout$DependencyGraph;Landroid/widget/RelativeLayout$DependencyGraph;
-HSPLandroid/widget/RemoteViews$2;->createFromParcel(Landroid/os/Parcel;)Landroid/widget/RemoteViews;
-HSPLandroid/widget/RemoteViews$2;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/widget/RemoteViews$Action;-><init>()V
-HSPLandroid/widget/RemoteViews$Action;-><init>(Landroid/widget/RemoteViews$Action-IA;)V
-HSPLandroid/widget/RemoteViews$Action;->setHierarchyRootData(Landroid/widget/RemoteViews$HierarchyRootData;)V
-HSPLandroid/widget/RemoteViews$ApplicationInfoCache$$ExternalSyntheticLambda0;-><init>(Landroid/content/pm/ApplicationInfo;)V
-HSPLandroid/widget/RemoteViews$ApplicationInfoCache$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/widget/RemoteViews$ApplicationInfoCache;-><init>()V
-HSPLandroid/widget/RemoteViews$ApplicationInfoCache;->getOrPut(Landroid/content/pm/ApplicationInfo;)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/widget/RemoteViews$ApplicationInfoCache;->lambda$getOrPut$0(Landroid/content/pm/ApplicationInfo;Landroid/util/Pair;)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/widget/RemoteViews$ApplicationInfoCache;->put(Landroid/content/pm/ApplicationInfo;)V
-HSPLandroid/widget/RemoteViews$BitmapCache;-><init>()V
-HSPLandroid/widget/RemoteViews$BitmapCache;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/widget/RemoteViews$BitmapCache;->getBitmapForId(I)Landroid/graphics/Bitmap;
-HSPLandroid/widget/RemoteViews$BitmapCache;->getBitmapId(Landroid/graphics/Bitmap;)I
-HSPLandroid/widget/RemoteViews$BitmapCache;->writeBitmapsToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/RemoteViews$BitmapReflectionAction;-><init>(Landroid/widget/RemoteViews;Landroid/os/Parcel;)V
-HSPLandroid/widget/RemoteViews$BitmapReflectionAction;->getActionTag()I
-HSPLandroid/widget/RemoteViews$BitmapReflectionAction;->setHierarchyRootData(Landroid/widget/RemoteViews$HierarchyRootData;)V
-HSPLandroid/widget/RemoteViews$BitmapReflectionAction;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/RemoteViews$MethodKey;->equals(Ljava/lang/Object;)Z
-HSPLandroid/widget/RemoteViews$MethodKey;->hashCode()I
-HSPLandroid/widget/RemoteViews$MethodKey;->set(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;)V
-HSPLandroid/widget/RemoteViews$ReflectionAction;->getActionTag()I
-HSPLandroid/widget/RemoteViews$ReflectionAction;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/RemoteViews$RemoteResponse;-><init>()V
-HSPLandroid/widget/RemoteViews$RemoteResponse;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/widget/RemoteViews$RemoteResponse;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/RemoteViews$RemoteViewsContextWrapper;->getResources()Landroid/content/res/Resources;
-HSPLandroid/widget/RemoteViews$RemoteViewsContextWrapper;->getTheme()Landroid/content/res/Resources$Theme;
-HSPLandroid/widget/RemoteViews$SetOnClickResponse;->getActionTag()I
-HSPLandroid/widget/RemoteViews$SetOnClickResponse;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/RemoteViews$TextViewSizeAction;->getActionTag()I
-HSPLandroid/widget/RemoteViews$TextViewSizeAction;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/RemoteViews;->-$$Nest$smgetPackageUserKey(Landroid/content/pm/ApplicationInfo;)Landroid/util/Pair;
-HSPLandroid/widget/RemoteViews;-><init>(Landroid/content/pm/ApplicationInfo;I)V
-HSPLandroid/widget/RemoteViews;-><init>(Landroid/os/Parcel;Landroid/widget/RemoteViews$HierarchyRootData;Landroid/content/pm/ApplicationInfo;I)V
-HSPLandroid/widget/RemoteViews;-><init>(Ljava/lang/String;I)V
-HSPLandroid/widget/RemoteViews;->addAction(Landroid/widget/RemoteViews$Action;)V
-HSPLandroid/widget/RemoteViews;->apply(Landroid/content/Context;Landroid/view/ViewGroup;)Landroid/view/View;
-HSPLandroid/widget/RemoteViews;->configureAsChild(Landroid/widget/RemoteViews$HierarchyRootData;)V
-HSPLandroid/widget/RemoteViews;->configureDescendantsAsChildren()V
-HSPLandroid/widget/RemoteViews;->getActionFromParcel(Landroid/os/Parcel;I)Landroid/widget/RemoteViews$Action;
-HSPLandroid/widget/RemoteViews;->getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;
-HSPLandroid/widget/RemoteViews;->getHierarchyRootData()Landroid/widget/RemoteViews$HierarchyRootData;
-HSPLandroid/widget/RemoteViews;->getLayoutId()I
-HSPLandroid/widget/RemoteViews;->getMethod(Landroid/view/View;Ljava/lang/String;Ljava/lang/Class;Z)Ljava/lang/invoke/MethodHandle;
-HSPLandroid/widget/RemoteViews;->getPackage()Ljava/lang/String;
-HSPLandroid/widget/RemoteViews;->getPackageUserKey(Landroid/content/pm/ApplicationInfo;)Landroid/util/Pair;
-HSPLandroid/widget/RemoteViews;->getRemoteViewsToApply(Landroid/content/Context;)Landroid/widget/RemoteViews;
-HSPLandroid/widget/RemoteViews;->hasFlags(I)Z
-HSPLandroid/widget/RemoteViews;->hasLandscapeAndPortraitLayouts()Z
-HSPLandroid/widget/RemoteViews;->hasSizedRemoteViews()Z
-HSPLandroid/widget/RemoteViews;->readActionsFromParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/RemoteViews;->setBitmap(ILjava/lang/String;Landroid/graphics/Bitmap;)V
-HSPLandroid/widget/RemoteViews;->setBoolean(ILjava/lang/String;Z)V
-HSPLandroid/widget/RemoteViews;->setCharSequence(ILjava/lang/String;Ljava/lang/CharSequence;)V
-HSPLandroid/widget/RemoteViews;->setContentDescription(ILjava/lang/CharSequence;)V
-HSPLandroid/widget/RemoteViews;->setImageViewBitmap(ILandroid/graphics/Bitmap;)V
-HSPLandroid/widget/RemoteViews;->setInt(ILjava/lang/String;I)V
-HSPLandroid/widget/RemoteViews;->setOnClickPendingIntent(ILandroid/app/PendingIntent;)V
-HSPLandroid/widget/RemoteViews;->setOnClickResponse(ILandroid/widget/RemoteViews$RemoteResponse;)V
-HSPLandroid/widget/RemoteViews;->setTextColor(II)V
-HSPLandroid/widget/RemoteViews;->setTextViewText(ILjava/lang/CharSequence;)V
-HSPLandroid/widget/RemoteViews;->setViewPadding(IIIII)V
-HSPLandroid/widget/RemoteViews;->setViewVisibility(II)V
-HSPLandroid/widget/RemoteViews;->shouldUseStaticFilter()Z
-HSPLandroid/widget/RemoteViews;->writeActionsToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/RemoteViews;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/RtlSpacingHelper;->getEnd()I
-HSPLandroid/widget/RtlSpacingHelper;->getStart()I
-HSPLandroid/widget/RtlSpacingHelper;->setAbsolute(II)V
-HSPLandroid/widget/RtlSpacingHelper;->setDirection(Z)V
-HSPLandroid/widget/RtlSpacingHelper;->setRelative(II)V
-HSPLandroid/widget/ScrollBarDrawable;-><init>()V
-HSPLandroid/widget/ScrollBarDrawable;->draw(Landroid/graphics/Canvas;)V+]Landroid/widget/ScrollBarDrawable;Landroid/widget/ScrollBarDrawable;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HSPLandroid/widget/ScrollBarDrawable;->drawThumb(Landroid/graphics/Canvas;Landroid/graphics/Rect;IIZ)V
-HSPLandroid/widget/ScrollBarDrawable;->getSize(Z)I+]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable;
-HSPLandroid/widget/ScrollBarDrawable;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V+]Landroid/widget/ScrollBarDrawable;Landroid/widget/ScrollBarDrawable;
-HSPLandroid/widget/ScrollBarDrawable;->isStateful()Z+]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable;
-HSPLandroid/widget/ScrollBarDrawable;->mutate()Landroid/widget/ScrollBarDrawable;+]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable;
-HSPLandroid/widget/ScrollBarDrawable;->onBoundsChange(Landroid/graphics/Rect;)V
-HSPLandroid/widget/ScrollBarDrawable;->onStateChange([I)Z
-HSPLandroid/widget/ScrollBarDrawable;->propagateCurrentState(Landroid/graphics/drawable/Drawable;)V+]Landroid/widget/ScrollBarDrawable;Landroid/widget/ScrollBarDrawable;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable;
-HSPLandroid/widget/ScrollBarDrawable;->setAlpha(I)V+]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable;
-HSPLandroid/widget/ScrollBarDrawable;->setAlwaysDrawVerticalTrack(Z)V
-HSPLandroid/widget/ScrollBarDrawable;->setHorizontalThumbDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ScrollBarDrawable;->setHorizontalTrackDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ScrollBarDrawable;->setParameters(IIIZ)V
-HSPLandroid/widget/ScrollBarDrawable;->setVerticalThumbDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ScrollBarDrawable;->setVerticalTrackDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ScrollView$SavedState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/ScrollView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/ScrollView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/ScrollView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/ScrollView;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/widget/ScrollView;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/widget/ScrollView;->computeScroll()V
-HSPLandroid/widget/ScrollView;->computeVerticalScrollOffset()I
-HSPLandroid/widget/ScrollView;->computeVerticalScrollRange()I
-HSPLandroid/widget/ScrollView;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/ScrollView;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLandroid/widget/ScrollView;->initScrollView()V
-HSPLandroid/widget/ScrollView;->measureChildWithMargins(Landroid/view/View;IIII)V
-HSPLandroid/widget/ScrollView;->onDetachedFromWindow()V
-HSPLandroid/widget/ScrollView;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/widget/ScrollView;->onLayout(ZIIII)V
-HSPLandroid/widget/ScrollView;->onMeasure(II)V
-HSPLandroid/widget/ScrollView;->onSaveInstanceState()Landroid/os/Parcelable;
-HSPLandroid/widget/ScrollView;->onSizeChanged(IIII)V
-HSPLandroid/widget/ScrollView;->requestLayout()V
-HSPLandroid/widget/ScrollView;->scrollTo(II)V
-HSPLandroid/widget/ScrollView;->setFillViewport(Z)V
-HSPLandroid/widget/ScrollView;->shouldDelayChildPressedState()Z
-HSPLandroid/widget/ScrollView;->shouldDisplayEdgeEffects()Z
-HSPLandroid/widget/Scroller$ViscousFluidInterpolator;-><init>()V
-HSPLandroid/widget/Scroller$ViscousFluidInterpolator;->getInterpolation(F)F
-HSPLandroid/widget/Scroller$ViscousFluidInterpolator;->viscousFluid(F)F
-HSPLandroid/widget/Scroller;-><init>(Landroid/content/Context;Landroid/view/animation/Interpolator;)V
-HSPLandroid/widget/Scroller;-><init>(Landroid/content/Context;Landroid/view/animation/Interpolator;Z)V
-HSPLandroid/widget/Scroller;->abortAnimation()V
-HSPLandroid/widget/Scroller;->computeDeceleration(F)F
-HSPLandroid/widget/Scroller;->computeScrollOffset()Z
-HSPLandroid/widget/Scroller;->getCurrX()I
-HSPLandroid/widget/Scroller;->getCurrY()I
-HSPLandroid/widget/Scroller;->isFinished()Z
-HSPLandroid/widget/Scroller;->startScroll(IIIII)V
-HSPLandroid/widget/SeekBar;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/SeekBar;->onProgressRefresh(FZI)V
-HSPLandroid/widget/SeekBar;->setOnSeekBarChangeListener(Landroid/widget/SeekBar$OnSeekBarChangeListener;)V
-HSPLandroid/widget/SelectionActionModeHelper$SelectionTracker;->isSelectionStarted()Z
-HSPLandroid/widget/SelectionActionModeHelper$SelectionTracker;->onTextChanged(IILandroid/view/textclassifier/TextClassification;)V
-HSPLandroid/widget/SelectionActionModeHelper$SelectionTracker;->resetSelection(ILandroid/widget/Editor;)Z
-HSPLandroid/widget/SelectionActionModeHelper$TextClassificationHelper;->init(Ljava/util/function/Supplier;Ljava/lang/CharSequence;IILandroid/os/LocaleList;)V
-HSPLandroid/widget/SelectionActionModeHelper;-><init>(Landroid/widget/Editor;)V
-HSPLandroid/widget/SelectionActionModeHelper;->getText(Landroid/widget/TextView;)Ljava/lang/CharSequence;
-HSPLandroid/widget/SelectionActionModeHelper;->getTextClassificationSettings()Landroid/view/textclassifier/TextClassificationConstants;
-HSPLandroid/widget/SelectionActionModeHelper;->onTextChanged(II)V
-HSPLandroid/widget/SelectionActionModeHelper;->sortSelectionIndices(II)[I
-HSPLandroid/widget/SmartSelectSprite;-><init>(Landroid/content/Context;ILjava/lang/Runnable;)V
-HSPLandroid/widget/Space;-><init>(Landroid/content/Context;)V
-HSPLandroid/widget/Space;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/Space;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/Space;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/Space;->draw(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/Space;->getDefaultSize2(II)I
-HSPLandroid/widget/Space;->onMeasure(II)V
-HSPLandroid/widget/SpellChecker$1;->run()V
-HSPLandroid/widget/SpellChecker$SpellParser;->isFinished()Z
-HSPLandroid/widget/SpellChecker$SpellParser;->parse()V
-HSPLandroid/widget/SpellChecker$SpellParser;->stop()V
-HSPLandroid/widget/SpellChecker;-><init>(Landroid/widget/TextView;)V
-HSPLandroid/widget/SpellChecker;->closeSession()V
-HSPLandroid/widget/SpellChecker;->isSessionActive()Z
-HSPLandroid/widget/SpellChecker;->nextSpellCheckSpanIndex()I
-HSPLandroid/widget/SpellChecker;->onGetSentenceSuggestions([Landroid/view/textservice/SentenceSuggestionsInfo;)V
-HSPLandroid/widget/SpellChecker;->onGetSuggestionsInternal(Landroid/view/textservice/SuggestionsInfo;II)Landroid/text/style/SpellCheckSpan;
-HSPLandroid/widget/SpellChecker;->onSpellCheckSpanRemoved(Landroid/text/style/SpellCheckSpan;)V
-HSPLandroid/widget/SpellChecker;->resetSession()V
-HSPLandroid/widget/SpellChecker;->setLocale(Ljava/util/Locale;)V
-HSPLandroid/widget/SpellChecker;->spellCheck()V
-HSPLandroid/widget/SpellChecker;->spellCheck(II)V
-HSPLandroid/widget/SpellChecker;->spellCheck(IIZ)V
-HSPLandroid/widget/Spinner;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/Spinner;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;IIILandroid/content/res/Resources$Theme;)V
-HSPLandroid/widget/Spinner;->onDetachedFromWindow()V
-HSPLandroid/widget/Switch;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/Switch;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/Switch;->drawableStateChanged()V
-HSPLandroid/widget/Switch;->getButtonStateDescription()Ljava/lang/CharSequence;
-HSPLandroid/widget/Switch;->jumpDrawablesToCurrentState()V
-HSPLandroid/widget/Switch;->onCreateDrawableState(I)[I
-HSPLandroid/widget/Switch;->setChecked(Z)V
-HSPLandroid/widget/Switch;->setSwitchTextAppearance(Landroid/content/Context;I)V
-HSPLandroid/widget/Switch;->setSwitchTypeface(Landroid/graphics/Typeface;)V
-HSPLandroid/widget/Switch;->setSwitchTypeface(Landroid/graphics/Typeface;I)V
-HSPLandroid/widget/Switch;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z
-HSPLandroid/widget/TextView$3;->run()V
-HSPLandroid/widget/TextView$ChangeWatcher;-><init>(Landroid/widget/TextView;)V
-HSPLandroid/widget/TextView$ChangeWatcher;->afterTextChanged(Landroid/text/Editable;)V
-HSPLandroid/widget/TextView$ChangeWatcher;->beforeTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroid/widget/TextView$ChangeWatcher;->onSpanAdded(Landroid/text/Spannable;Ljava/lang/Object;II)V
-HSPLandroid/widget/TextView$ChangeWatcher;->onSpanChanged(Landroid/text/Spannable;Ljava/lang/Object;IIII)V
-HSPLandroid/widget/TextView$ChangeWatcher;->onSpanRemoved(Landroid/text/Spannable;Ljava/lang/Object;II)V
-HSPLandroid/widget/TextView$ChangeWatcher;->onTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroid/widget/TextView$Drawables;-><init>(Landroid/content/Context;)V
-HSPLandroid/widget/TextView$Drawables;->applyErrorDrawableIfNeeded(I)V
-HSPLandroid/widget/TextView$Drawables;->hasMetadata()Z
-HSPLandroid/widget/TextView$Drawables;->resolveWithLayoutDirection(I)Z
-HSPLandroid/widget/TextView$SavedState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/widget/TextView$SavedState;
-HSPLandroid/widget/TextView$SavedState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/widget/TextView$SavedState;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/widget/TextView$SavedState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/TextView$TextAppearanceAttributes;-><init>()V
-HSPLandroid/widget/TextView$TextAppearanceAttributes;-><init>(Landroid/widget/TextView$TextAppearanceAttributes-IA;)V
-HSPLandroid/widget/TextView;-><init>(Landroid/content/Context;)V
-HSPLandroid/widget/TextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/TextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/TextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V+]Landroid/graphics/Paint;Landroid/graphics/Paint;]Landroid/content/res/Resources$Theme;Landroid/content/res/Resources$Theme;]Landroid/widget/Editor;Landroid/widget/Editor;]Landroid/view/ViewConfiguration;Landroid/view/ViewConfiguration;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Landroid/content/Context;missing_types]Landroid/widget/TextView;missing_types
-HSPLandroid/widget/TextView;->addSearchHighlightPaths()V
-HSPLandroid/widget/TextView;->addTextChangedListener(Landroid/text/TextWatcher;)V
-HSPLandroid/widget/TextView;->applyCompoundDrawableTint()V
-HSPLandroid/widget/TextView;->applySingleLine(ZZZZ)V
-HSPLandroid/widget/TextView;->applyTextAppearance(Landroid/widget/TextView$TextAppearanceAttributes;)V
-HSPLandroid/widget/TextView;->assumeLayout()V
-HSPLandroid/widget/TextView;->autoSizeText()V
-HSPLandroid/widget/TextView;->beginBatchEdit()V
-HSPLandroid/widget/TextView;->bringPointIntoView(I)Z
-HSPLandroid/widget/TextView;->bringPointIntoView(IZ)Z
-HSPLandroid/widget/TextView;->bringTextIntoView()Z
-HSPLandroid/widget/TextView;->canMarquee()Z
-HSPLandroid/widget/TextView;->cancelLongPress()V
-HSPLandroid/widget/TextView;->checkForRelayout()V
-HSPLandroid/widget/TextView;->checkForResize()V
-HSPLandroid/widget/TextView;->cleanupAutoSizePresetSizes([I)[I
-HSPLandroid/widget/TextView;->compressText(F)Z
-HSPLandroid/widget/TextView;->computeHorizontalScrollRange()I
-HSPLandroid/widget/TextView;->computeScroll()V
-HSPLandroid/widget/TextView;->computeVerticalScrollExtent()I+]Landroid/widget/TextView;missing_types
-HSPLandroid/widget/TextView;->computeVerticalScrollRange()I+]Landroid/text/Layout;Landroid/text/DynamicLayout;,Landroid/text/BoringLayout;
-HSPLandroid/widget/TextView;->convertToLocalHorizontalCoordinate(F)F
-HSPLandroid/widget/TextView;->createEditorIfNeeded()V
-HSPLandroid/widget/TextView;->didTouchFocusSelect()Z
-HSPLandroid/widget/TextView;->doKeyDown(ILandroid/view/KeyEvent;Landroid/view/KeyEvent;)I
-HSPLandroid/widget/TextView;->drawableHotspotChanged(FF)V
-HSPLandroid/widget/TextView;->drawableStateChanged()V
-HSPLandroid/widget/TextView;->endBatchEdit()V
-HSPLandroid/widget/TextView;->findLargestTextSizeWhichFits(Landroid/graphics/RectF;)I
-HSPLandroid/widget/TextView;->fixFocusableAndClickableSettings()V
-HSPLandroid/widget/TextView;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLandroid/widget/TextView;->getAutoSizeStepGranularity()I
-HSPLandroid/widget/TextView;->getAutofillHints()[Ljava/lang/String;
-HSPLandroid/widget/TextView;->getAutofillType()I
-HSPLandroid/widget/TextView;->getAutofillValue()Landroid/view/autofill/AutofillValue;
-HSPLandroid/widget/TextView;->getBaseline()I
-HSPLandroid/widget/TextView;->getBaselineOffset()I
-HSPLandroid/widget/TextView;->getBottomVerticalOffset(Z)I
-HSPLandroid/widget/TextView;->getBoxHeight(Landroid/text/Layout;)I+]Landroid/widget/TextView;Landroid/widget/EditText;,Landroid/widget/Button;
-HSPLandroid/widget/TextView;->getBreakStrategy()I
-HSPLandroid/widget/TextView;->getCompoundDrawablePadding()I
-HSPLandroid/widget/TextView;->getCompoundDrawables()[Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/TextView;->getCompoundDrawablesRelative()[Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/TextView;->getCompoundPaddingBottom()I
-HSPLandroid/widget/TextView;->getCompoundPaddingLeft()I
-HSPLandroid/widget/TextView;->getCompoundPaddingRight()I
-HSPLandroid/widget/TextView;->getCompoundPaddingTop()I
-HSPLandroid/widget/TextView;->getCurrentTextColor()I
-HSPLandroid/widget/TextView;->getDefaultEditable()Z
-HSPLandroid/widget/TextView;->getDefaultMovementMethod()Landroid/text/method/MovementMethod;
-HSPLandroid/widget/TextView;->getDesiredHeight()I
-HSPLandroid/widget/TextView;->getDesiredHeight(Landroid/text/Layout;Z)I+]Landroid/text/Layout;Landroid/text/BoringLayout;]Landroid/widget/TextView;Landroid/widget/TextView;
-HSPLandroid/widget/TextView;->getEditableText()Landroid/text/Editable;
-HSPLandroid/widget/TextView;->getEllipsize()Landroid/text/TextUtils$TruncateAt;
-HSPLandroid/widget/TextView;->getError()Ljava/lang/CharSequence;
-HSPLandroid/widget/TextView;->getExtendedPaddingBottom()I+]Landroid/text/Layout;Landroid/text/StaticLayout;]Landroid/widget/TextView;Landroid/widget/TextView;
-HSPLandroid/widget/TextView;->getExtendedPaddingTop()I+]Landroid/text/Layout;Landroid/text/BoringLayout;,Landroid/text/StaticLayout;,Landroid/text/DynamicLayout;]Landroid/widget/TextView;Landroid/widget/TextView;,Landroid/widget/CheckBox;,Landroid/widget/EditText;,Landroid/widget/Button;
-HSPLandroid/widget/TextView;->getFilters()[Landroid/text/InputFilter;
-HSPLandroid/widget/TextView;->getFocusedRect(Landroid/graphics/Rect;)V
-HSPLandroid/widget/TextView;->getFreezesText()Z
-HSPLandroid/widget/TextView;->getGravity()I
-HSPLandroid/widget/TextView;->getHint()Ljava/lang/CharSequence;
-HSPLandroid/widget/TextView;->getHorizontalOffsetForDrawables()I
-HSPLandroid/widget/TextView;->getHorizontallyScrolling()Z
-HSPLandroid/widget/TextView;->getHyphenationFrequency()I
-HSPLandroid/widget/TextView;->getIncludeFontPadding()Z
-HSPLandroid/widget/TextView;->getInputMethodManager()Landroid/view/inputmethod/InputMethodManager;
-HSPLandroid/widget/TextView;->getInputType()I
-HSPLandroid/widget/TextView;->getInterestingRect(Landroid/graphics/Rect;I)V
-HSPLandroid/widget/TextView;->getJustificationMode()I
-HSPLandroid/widget/TextView;->getKeyListener()Landroid/text/method/KeyListener;
-HSPLandroid/widget/TextView;->getLayout()Landroid/text/Layout;
-HSPLandroid/widget/TextView;->getLayoutAlignment()Landroid/text/Layout$Alignment;
-HSPLandroid/widget/TextView;->getLineAtCoordinate(F)I
-HSPLandroid/widget/TextView;->getLineAtCoordinateUnclamped(F)I
-HSPLandroid/widget/TextView;->getLineCount()I
-HSPLandroid/widget/TextView;->getLineHeight()I
-HSPLandroid/widget/TextView;->getLineSpacingExtra()F
-HSPLandroid/widget/TextView;->getLineSpacingMultiplier()F
-HSPLandroid/widget/TextView;->getMaxEms()I
-HSPLandroid/widget/TextView;->getMaxLines()I
-HSPLandroid/widget/TextView;->getMinEms()I
-HSPLandroid/widget/TextView;->getMinWidth()I
-HSPLandroid/widget/TextView;->getOffsetAtCoordinate(IF)I
-HSPLandroid/widget/TextView;->getOffsetForPosition(FF)I
-HSPLandroid/widget/TextView;->getPaint()Landroid/text/TextPaint;
-HSPLandroid/widget/TextView;->getSelectionEnd()I
-HSPLandroid/widget/TextView;->getSelectionEndTransformed()I
-HSPLandroid/widget/TextView;->getSelectionStart()I+]Landroid/widget/TextView;missing_types
-HSPLandroid/widget/TextView;->getSelectionStartTransformed()I
-HSPLandroid/widget/TextView;->getServiceManagerForUser(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;
-HSPLandroid/widget/TextView;->getSpellCheckerLocale()Ljava/util/Locale;
-HSPLandroid/widget/TextView;->getText()Ljava/lang/CharSequence;
-HSPLandroid/widget/TextView;->getTextColors()Landroid/content/res/ColorStateList;
-HSPLandroid/widget/TextView;->getTextCursorDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/TextView;->getTextDirectionHeuristic()Landroid/text/TextDirectionHeuristic;
-HSPLandroid/widget/TextView;->getTextLocale()Ljava/util/Locale;
-HSPLandroid/widget/TextView;->getTextLocales()Landroid/os/LocaleList;
-HSPLandroid/widget/TextView;->getTextSelectHandle()Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/TextView;->getTextSelectHandleLeft()Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/TextView;->getTextSelectHandleRight()Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/TextView;->getTextSize()F
-HSPLandroid/widget/TextView;->getTotalPaddingBottom()I
-HSPLandroid/widget/TextView;->getTotalPaddingLeft()I
-HSPLandroid/widget/TextView;->getTotalPaddingRight()I
-HSPLandroid/widget/TextView;->getTotalPaddingTop()I
-HSPLandroid/widget/TextView;->getTransformationMethod()Landroid/text/method/TransformationMethod;
-HSPLandroid/widget/TextView;->getTypeface()Landroid/graphics/Typeface;
-HSPLandroid/widget/TextView;->getTypefaceStyle()I
-HSPLandroid/widget/TextView;->getUpdatedHighlightPath()Landroid/graphics/Path;
-HSPLandroid/widget/TextView;->getVerticalOffset(Z)I
-HSPLandroid/widget/TextView;->handleBackInTextActionModeIfNeeded(Landroid/view/KeyEvent;)Z
-HSPLandroid/widget/TextView;->handleTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroid/widget/TextView;->hasGesturePreviewHighlight()Z
-HSPLandroid/widget/TextView;->hasOverlappingRendering()Z
-HSPLandroid/widget/TextView;->hasPasswordTransformationMethod()Z
-HSPLandroid/widget/TextView;->hasSelection()Z
-HSPLandroid/widget/TextView;->hideErrorIfUnchanged()V
-HSPLandroid/widget/TextView;->invalidateCursor()V
-HSPLandroid/widget/TextView;->invalidateCursorPath()V
-HSPLandroid/widget/TextView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V+]Landroid/widget/TextView;Landroid/widget/CheckBox;,Landroid/widget/EditText;,Landroid/widget/Button;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/AnimatedStateListDrawable;,Landroid/graphics/drawable/InsetDrawable;,Landroid/graphics/drawable/RippleDrawable;,Landroid/graphics/drawable/LayerDrawable;,Landroid/graphics/drawable/VectorDrawable;
-HSPLandroid/widget/TextView;->invalidateRegion(IIZ)V
-HSPLandroid/widget/TextView;->isAnyPasswordInputType()Z
-HSPLandroid/widget/TextView;->isAutoSizeEnabled()Z
-HSPLandroid/widget/TextView;->isAutofillable()Z
-HSPLandroid/widget/TextView;->isFallbackLineSpacingForStaticLayout()Z
-HSPLandroid/widget/TextView;->isFromPrimePointer(Landroid/view/MotionEvent;Z)Z+]Landroid/view/MotionEvent;Landroid/view/MotionEvent;
-HSPLandroid/widget/TextView;->isInBatchEditMode()Z
-HSPLandroid/widget/TextView;->isInExtractedMode()Z
-HSPLandroid/widget/TextView;->isInputMethodTarget()Z
-HSPLandroid/widget/TextView;->isMarqueeFadeEnabled()Z
-HSPLandroid/widget/TextView;->isMultilineInputType(I)Z
-HSPLandroid/widget/TextView;->isPasswordInputType(I)Z
-HSPLandroid/widget/TextView;->isPositionVisible(FF)Z+]Landroid/view/View;missing_types]Landroid/graphics/Matrix;Landroid/graphics/Matrix;
-HSPLandroid/widget/TextView;->isShowingHint()Z
-HSPLandroid/widget/TextView;->isSuggestionsEnabled()Z
-HSPLandroid/widget/TextView;->isTextAutofillable()Z
-HSPLandroid/widget/TextView;->isTextEditable()Z
-HSPLandroid/widget/TextView;->isTextSelectable()Z
-HSPLandroid/widget/TextView;->isVisibleToAccessibility()Z
-HSPLandroid/widget/TextView;->jumpDrawablesToCurrentState()V
-HSPLandroid/widget/TextView;->length()I
-HSPLandroid/widget/TextView;->makeNewLayout(IILandroid/text/BoringLayout$Metrics;Landroid/text/BoringLayout$Metrics;IZ)V+]Landroid/text/BoringLayout;Landroid/text/BoringLayout;]Landroid/text/Layout;Landroid/text/DynamicLayout;,Landroid/text/BoringLayout;]Landroid/widget/Editor;Landroid/widget/Editor;]Landroid/widget/TextView;Landroid/widget/CheckBox;,Landroid/widget/EditText;,Landroid/widget/TextView;,Landroid/widget/Button;
-HSPLandroid/widget/TextView;->makeSingleLayout(ILandroid/text/BoringLayout$Metrics;ILandroid/text/Layout$Alignment;ZLandroid/text/TextUtils$TruncateAt;Z)Landroid/text/Layout;+]Landroid/text/DynamicLayout$Builder;Landroid/text/DynamicLayout$Builder;]Landroid/text/BoringLayout;Landroid/text/BoringLayout;]Landroid/widget/TextView;Landroid/widget/CheckBox;,Landroid/widget/EditText;,Landroid/widget/TextView;]Ljava/lang/CharSequence;Ljava/lang/String;]Landroid/text/StaticLayout$Builder;Landroid/text/StaticLayout$Builder;
-HSPLandroid/widget/TextView;->maybeUpdateHighlightPaths()V
-HSPLandroid/widget/TextView;->notifyContentCaptureTextChanged()V
-HSPLandroid/widget/TextView;->notifyListeningManagersAfterTextChanged()V
-HSPLandroid/widget/TextView;->nullLayouts()V
-HSPLandroid/widget/TextView;->onAttachedToWindow()V
-HSPLandroid/widget/TextView;->onBeginBatchEdit()V
-HSPLandroid/widget/TextView;->onCheckIsTextEditor()Z
-HSPLandroid/widget/TextView;->onConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/widget/TextView;->onCreateDrawableState(I)[I
-HSPLandroid/widget/TextView;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection;
-HSPLandroid/widget/TextView;->onDetachedFromWindowInternal()V
-HSPLandroid/widget/TextView;->onDraw(Landroid/graphics/Canvas;)V+]Landroid/text/Layout;Landroid/text/BoringLayout;,Landroid/text/StaticLayout;,Landroid/text/DynamicLayout;]Landroid/widget/TextView;missing_types]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;]Landroid/widget/Editor;Landroid/widget/Editor;]Ljava/lang/CharSequence;Landroid/text/SpannableStringBuilder;
-HSPLandroid/widget/TextView;->onEditorAction(I)V
-HSPLandroid/widget/TextView;->onEndBatchEdit()V
-HSPLandroid/widget/TextView;->onFocusChanged(ZILandroid/graphics/Rect;)V
-HSPLandroid/widget/TextView;->onInputConnectionClosedInternal()V
-HSPLandroid/widget/TextView;->onInputConnectionOpenedInternal(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroid/os/Handler;)V
-HSPLandroid/widget/TextView;->onKeyDown(ILandroid/view/KeyEvent;)Z
-HSPLandroid/widget/TextView;->onKeyPreIme(ILandroid/view/KeyEvent;)Z
-HSPLandroid/widget/TextView;->onKeyUp(ILandroid/view/KeyEvent;)Z
-HSPLandroid/widget/TextView;->onLayout(ZIIII)V
-HSPLandroid/widget/TextView;->onLocaleChanged()V
-HSPLandroid/widget/TextView;->onMeasure(II)V+]Landroid/text/Layout;Landroid/text/DynamicLayout;,Landroid/text/BoringLayout;,Landroid/text/StaticLayout;]Landroid/widget/TextView;Landroid/widget/CheckBox;,Landroid/widget/EditText;,Landroid/widget/TextView;,Landroid/widget/Button;
-HSPLandroid/widget/TextView;->onPreDraw()Z
-HSPLandroid/widget/TextView;->onProvideStructure(Landroid/view/ViewStructure;II)V
-HSPLandroid/widget/TextView;->onResolveDrawables(I)V
-HSPLandroid/widget/TextView;->onRestoreInstanceState(Landroid/os/Parcelable;)V
-HSPLandroid/widget/TextView;->onRtlPropertiesChanged(I)V
-HSPLandroid/widget/TextView;->onSaveInstanceState()Landroid/os/Parcelable;
-HSPLandroid/widget/TextView;->onScreenStateChanged(I)V
-HSPLandroid/widget/TextView;->onScrollChanged(IIII)V
-HSPLandroid/widget/TextView;->onSelectionChanged(II)V
-HSPLandroid/widget/TextView;->onTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroid/widget/TextView;->onTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/widget/TextView;->onVisibilityAggregated(Z)V
-HSPLandroid/widget/TextView;->onVisibilityChanged(Landroid/view/View;I)V
-HSPLandroid/widget/TextView;->onWindowFocusChanged(Z)V
-HSPLandroid/widget/TextView;->originalToTransformed(II)I
-HSPLandroid/widget/TextView;->preloadFontCache()V
-HSPLandroid/widget/TextView;->readTextAppearance(Landroid/content/Context;Landroid/content/res/TypedArray;Landroid/widget/TextView$TextAppearanceAttributes;Z)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/TypedValue;Landroid/util/TypedValue;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Landroid/content/Context;missing_types
-HSPLandroid/widget/TextView;->registerForPreDraw()V
-HSPLandroid/widget/TextView;->removeAdjacentSuggestionSpans(I)V
-HSPLandroid/widget/TextView;->removeIntersectingNonAdjacentSpans(IILjava/lang/Class;)V
-HSPLandroid/widget/TextView;->removeMisspelledSpans(Landroid/text/Spannable;)V
-HSPLandroid/widget/TextView;->removeSuggestionSpans(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLandroid/widget/TextView;->removeTextChangedListener(Landroid/text/TextWatcher;)V
-HSPLandroid/widget/TextView;->resetErrorChangedFlag()V
-HSPLandroid/widget/TextView;->resetResolvedDrawables()V
-HSPLandroid/widget/TextView;->resolveStyleAndSetTypeface(Landroid/graphics/Typeface;II)V
-HSPLandroid/widget/TextView;->restartMarqueeIfNeeded()V
-HSPLandroid/widget/TextView;->sendAccessibilityEventInternal(I)V
-HSPLandroid/widget/TextView;->sendAfterTextChanged(Landroid/text/Editable;)V
-HSPLandroid/widget/TextView;->sendBeforeTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroid/widget/TextView;->sendOnTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroid/widget/TextView;->setAllCaps(Z)V
-HSPLandroid/widget/TextView;->setAutoSizeTextTypeUniformWithPresetSizes([II)V
-HSPLandroid/widget/TextView;->setBreakStrategy(I)V
-HSPLandroid/widget/TextView;->setCompoundDrawablePadding(I)V
-HSPLandroid/widget/TextView;->setCompoundDrawableTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/widget/TextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/TextView;->setCompoundDrawablesRelative(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/TextView;->setCompoundDrawablesRelativeWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/TextView;->setCompoundDrawablesWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/TextView;->setCursorVisible(Z)V
-HSPLandroid/widget/TextView;->setEditableFactory(Landroid/text/Editable$Factory;)V
-HSPLandroid/widget/TextView;->setEllipsize(Landroid/text/TextUtils$TruncateAt;)V
-HSPLandroid/widget/TextView;->setEnabled(Z)V
-HSPLandroid/widget/TextView;->setFilters(Landroid/text/Editable;[Landroid/text/InputFilter;)V
-HSPLandroid/widget/TextView;->setFilters([Landroid/text/InputFilter;)V
-HSPLandroid/widget/TextView;->setFontFeatureSettings(Ljava/lang/String;)V
-HSPLandroid/widget/TextView;->setFrame(IIII)Z
-HSPLandroid/widget/TextView;->setGravity(I)V
-HSPLandroid/widget/TextView;->setHeight(I)V
-HSPLandroid/widget/TextView;->setHighlightColor(I)V
-HSPLandroid/widget/TextView;->setHint(I)V
-HSPLandroid/widget/TextView;->setHint(Ljava/lang/CharSequence;)V
-HSPLandroid/widget/TextView;->setHintInternal(Ljava/lang/CharSequence;)V
-HSPLandroid/widget/TextView;->setHintTextColor(I)V
-HSPLandroid/widget/TextView;->setHintTextColor(Landroid/content/res/ColorStateList;)V
-HSPLandroid/widget/TextView;->setHorizontallyScrolling(Z)V
-HSPLandroid/widget/TextView;->setImeConsumesInput(Z)V
-HSPLandroid/widget/TextView;->setImeOptions(I)V
-HSPLandroid/widget/TextView;->setIncludeFontPadding(Z)V
-HSPLandroid/widget/TextView;->setInputType(I)V
-HSPLandroid/widget/TextView;->setInputType(IZ)V
-HSPLandroid/widget/TextView;->setInputTypeFromEditor()V
-HSPLandroid/widget/TextView;->setInputTypeSingleLine(Z)V
-HSPLandroid/widget/TextView;->setKeyListener(Landroid/text/method/KeyListener;)V
-HSPLandroid/widget/TextView;->setKeyListenerOnly(Landroid/text/method/KeyListener;)V
-HSPLandroid/widget/TextView;->setLetterSpacing(F)V
-HSPLandroid/widget/TextView;->setLineHeight(I)V
-HSPLandroid/widget/TextView;->setLineSpacing(FF)V
-HSPLandroid/widget/TextView;->setLines(I)V
-HSPLandroid/widget/TextView;->setLinkTextColor(Landroid/content/res/ColorStateList;)V
-HSPLandroid/widget/TextView;->setMarqueeRepeatLimit(I)V
-HSPLandroid/widget/TextView;->setMaxLines(I)V
-HSPLandroid/widget/TextView;->setMaxWidth(I)V
-HSPLandroid/widget/TextView;->setMinHeight(I)V
-HSPLandroid/widget/TextView;->setMinLines(I)V
-HSPLandroid/widget/TextView;->setMinWidth(I)V
-HSPLandroid/widget/TextView;->setMovementMethod(Landroid/text/method/MovementMethod;)V
-HSPLandroid/widget/TextView;->setOnEditorActionListener(Landroid/widget/TextView$OnEditorActionListener;)V
-HSPLandroid/widget/TextView;->setPadding(IIII)V
-HSPLandroid/widget/TextView;->setPaddingRelative(IIII)V
-HSPLandroid/widget/TextView;->setPrivateImeOptions(Ljava/lang/String;)V
-HSPLandroid/widget/TextView;->setRawInputType(I)V
-HSPLandroid/widget/TextView;->setRawTextSize(FZ)V
-HSPLandroid/widget/TextView;->setRelativeDrawablesIfNeeded(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/TextView;->setSelected(Z)V
-HSPLandroid/widget/TextView;->setShadowLayer(FFFI)V
-HSPLandroid/widget/TextView;->setSingleLine()V
-HSPLandroid/widget/TextView;->setSingleLine(Z)V
-HSPLandroid/widget/TextView;->setText(I)V
-HSPLandroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
-HSPLandroid/widget/TextView;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V
-HSPLandroid/widget/TextView;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;ZI)V+]Landroid/text/Editable$Factory;Landroid/text/Editable$Factory;]Landroid/text/method/MovementMethod;Landroid/text/method/ArrowKeyMovementMethod;,Landroid/text/method/ScrollingMovementMethod;]Landroid/text/method/TransformationMethod;Landroid/text/method/SingleLineTransformationMethod;]Landroid/widget/Editor;Landroid/widget/Editor;]Landroid/text/InputFilter;Landroid/text/InputFilter$LengthFilter;]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/text/Spanned;Landroid/text/SpannableString;]Landroid/text/Spannable$Factory;Landroid/text/Spannable$Factory;]Ljava/lang/CharSequence;Ljava/lang/String;,Landroid/text/SpannableStringBuilder;,Landroid/text/SpannableString;]Landroid/view/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager;]Landroid/text/Spannable;Landroid/text/SpannableStringBuilder;,Landroid/text/SpannableString;
-HSPLandroid/widget/TextView;->setTextAppearance(I)V
-HSPLandroid/widget/TextView;->setTextAppearance(Landroid/content/Context;I)V
-HSPLandroid/widget/TextView;->setTextColor(I)V
-HSPLandroid/widget/TextView;->setTextColor(Landroid/content/res/ColorStateList;)V
-HSPLandroid/widget/TextView;->setTextInternal(Ljava/lang/CharSequence;)V
-HSPLandroid/widget/TextView;->setTextIsSelectable(Z)V
-HSPLandroid/widget/TextView;->setTextSize(F)V
-HSPLandroid/widget/TextView;->setTextSize(IF)V
-HSPLandroid/widget/TextView;->setTextSizeInternal(IFZ)V
-HSPLandroid/widget/TextView;->setTransformationMethod(Landroid/text/method/TransformationMethod;)V
-HSPLandroid/widget/TextView;->setTransformationMethodInternal(Landroid/text/method/TransformationMethod;Z)V
-HSPLandroid/widget/TextView;->setTypeface(Landroid/graphics/Typeface;)V
-HSPLandroid/widget/TextView;->setTypeface(Landroid/graphics/Typeface;I)V
-HSPLandroid/widget/TextView;->setTypefaceFromAttrs(Landroid/graphics/Typeface;Ljava/lang/String;III)V
-HSPLandroid/widget/TextView;->setupAutoSizeText()Z
-HSPLandroid/widget/TextView;->setupAutoSizeUniformPresetSizesConfiguration()Z
-HSPLandroid/widget/TextView;->shouldAdvanceFocusOnEnter()Z
-HSPLandroid/widget/TextView;->spanChange(Landroid/text/Spanned;Ljava/lang/Object;IIII)V
-HSPLandroid/widget/TextView;->startMarquee()V
-HSPLandroid/widget/TextView;->startStopMarquee(Z)V
-HSPLandroid/widget/TextView;->stopMarquee()V
-HSPLandroid/widget/TextView;->stopTextActionMode()V
-HSPLandroid/widget/TextView;->suggestedSizeFitsInSpace(ILandroid/graphics/RectF;)Z
-HSPLandroid/widget/TextView;->supportsAutoSizeText()Z
-HSPLandroid/widget/TextView;->textCanBeSelected()Z
-HSPLandroid/widget/TextView;->unregisterForPreDraw()V
-HSPLandroid/widget/TextView;->updateAfterEdit()V
-HSPLandroid/widget/TextView;->updateCursorVisibleInternal()V
-HSPLandroid/widget/TextView;->updateTextColors()V
-HSPLandroid/widget/TextView;->useDynamicLayout()Z
-HSPLandroid/widget/TextView;->validateAndSetAutoSizeTextTypeUniformConfiguration(FFF)V
-HSPLandroid/widget/TextView;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z
-HSPLandroid/widget/TextView;->viewClicked(Landroid/view/inputmethod/InputMethodManager;)V
-HSPLandroid/widget/TextView;->viewportToContentHorizontalOffset()I
-HSPLandroid/widget/TextView;->viewportToContentVerticalOffset()I
-HSPLandroid/widget/TextViewOnReceiveContentListener;-><init>()V
-HSPLandroid/widget/TextViewOnReceiveContentListener;->clearInputConnectionInfo()V
-HSPLandroid/widget/TextViewOnReceiveContentListener;->getFallbackMimeTypesForAutofill(Landroid/widget/TextView;)[Ljava/lang/String;
-HSPLandroid/widget/TextViewOnReceiveContentListener;->isUsageOfImeCommitContentEnabled(Landroid/view/View;)Z
-HSPLandroid/widget/TextViewOnReceiveContentListener;->setInputConnectionInfo(Landroid/widget/TextView;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V
-HSPLandroid/widget/Toast$CallbackBinder;->getCallbacks()Ljava/util/List;
-HSPLandroid/widget/Toast$CallbackBinder;->onToastHidden()V
-HSPLandroid/widget/Toast$CallbackBinder;->onToastShown()V
-HSPLandroid/widget/Toast$TN;-><init>(Landroid/content/Context;Ljava/lang/String;Landroid/os/Binder;Ljava/util/List;Landroid/os/Looper;)V
-HSPLandroid/widget/Toast;-><init>(Landroid/content/Context;Landroid/os/Looper;)V
-HSPLandroid/widget/Toast;->makeText(Landroid/content/Context;Landroid/os/Looper;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
-HSPLandroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
-HSPLandroid/widget/Toast;->show()V
-HSPLandroid/widget/ToastPresenter;-><init>(Landroid/content/Context;Landroid/view/accessibility/IAccessibilityManager;Landroid/app/INotificationManager;Ljava/lang/String;)V
-HSPLandroid/widget/ToastPresenter;->adjustLayoutParams(Landroid/view/WindowManager$LayoutParams;Landroid/os/IBinder;IIIIFFZ)V
-HSPLandroid/widget/ToastPresenter;->createLayoutParams()Landroid/view/WindowManager$LayoutParams;
-HSPLandroid/widget/ToastPresenter;->hide(Landroid/app/ITransientNotificationCallback;)V
-HSPLandroid/widget/ToastPresenter;->show(Landroid/view/View;Landroid/os/IBinder;Landroid/os/IBinder;IIIIFFLandroid/app/ITransientNotificationCallback;Z)V
-HSPLandroid/widget/ToastPresenter;->trySendAccessibilityEvent(Landroid/view/View;Ljava/lang/String;)V
-HSPLandroid/widget/Toolbar;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/Toolbar;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/Toolbar;->addSystemView(Landroid/view/View;Z)V
-HSPLandroid/widget/Toolbar;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
-HSPLandroid/widget/Toolbar;->ensureNavButtonView()V
-HSPLandroid/widget/Toolbar;->generateDefaultLayoutParams()Landroid/widget/Toolbar$LayoutParams;
-HSPLandroid/widget/Toolbar;->getContentInsetEnd()I
-HSPLandroid/widget/Toolbar;->getContentInsetStart()I
-HSPLandroid/widget/Toolbar;->getCurrentContentInsetEnd()I
-HSPLandroid/widget/Toolbar;->getCurrentContentInsetStart()I
-HSPLandroid/widget/Toolbar;->getNavigationIcon()Landroid/graphics/drawable/Drawable;
-HSPLandroid/widget/Toolbar;->measureChildCollapseMargins(Landroid/view/View;IIII[I)I
-HSPLandroid/widget/Toolbar;->measureChildConstrained(Landroid/view/View;IIIII)V
-HSPLandroid/widget/Toolbar;->onAttachedToWindow()V
-HSPLandroid/widget/Toolbar;->onMeasure(II)V
-HSPLandroid/widget/Toolbar;->onRtlPropertiesChanged(I)V
-HSPLandroid/widget/Toolbar;->setNavigationContentDescription(Ljava/lang/CharSequence;)V
-HSPLandroid/widget/Toolbar;->setNavigationIcon(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/Toolbar;->setNavigationOnClickListener(Landroid/view/View$OnClickListener;)V
-HSPLandroid/widget/Toolbar;->setPopupTheme(I)V
-HSPLandroid/widget/Toolbar;->setTitle(Ljava/lang/CharSequence;)V
-HSPLandroid/widget/Toolbar;->shouldCollapse()Z
-HSPLandroid/widget/ViewAnimator;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/ViewAnimator;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/widget/ViewAnimator;->initViewAnimator(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/ViewAnimator;->setAnimateFirstView(Z)V
-HSPLandroid/widget/ViewAnimator;->setDisplayedChild(I)V
-HSPLandroid/widget/ViewAnimator;->showOnly(I)V
-HSPLandroid/widget/ViewAnimator;->showOnly(IZ)V
-HSPLandroid/widget/ViewSwitcher;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/widget/inline/InlinePresentationSpec$1;-><init>()V
-HSPLandroid/widget/inline/InlinePresentationSpec$1;->createFromParcel(Landroid/os/Parcel;)Landroid/widget/inline/InlinePresentationSpec;
-HSPLandroid/widget/inline/InlinePresentationSpec$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/widget/inline/InlinePresentationSpec;-><clinit>()V
-HSPLandroid/widget/inline/InlinePresentationSpec;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/widget/inline/InlinePresentationSpec;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/window/BackProgressAnimator;-><init>()V+]Lcom/android/internal/dynamicanimation/animation/SpringAnimation;Lcom/android/internal/dynamicanimation/animation/SpringAnimation;]Lcom/android/internal/dynamicanimation/animation/SpringForce;Lcom/android/internal/dynamicanimation/animation/SpringForce;
-HSPLandroid/window/ClientWindowFrames$1;-><init>()V
-HSPLandroid/window/ClientWindowFrames$1;->createFromParcel(Landroid/os/Parcel;)Landroid/window/ClientWindowFrames;
-HSPLandroid/window/ClientWindowFrames$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/window/ClientWindowFrames;-><clinit>()V
-HSPLandroid/window/ClientWindowFrames;-><init>()V
-HSPLandroid/window/ClientWindowFrames;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/window/ClientWindowFrames;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/window/ConfigurationHelper;->freeTextLayoutCachesIfNeeded(I)V
-HSPLandroid/window/ConfigurationHelper;->isDifferentDisplay(II)Z
-HSPLandroid/window/ConfigurationHelper;->isDisplayRotationChanged(Landroid/content/res/Configuration;Landroid/content/res/Configuration;)Z
-HSPLandroid/window/ConfigurationHelper;->shouldUpdateResources(Landroid/os/IBinder;Landroid/content/res/Configuration;Landroid/content/res/Configuration;Landroid/content/res/Configuration;ZLjava/lang/Boolean;)Z
-HSPLandroid/window/ConfigurationHelper;->shouldUpdateWindowMetricsBounds(Landroid/content/res/Configuration;Landroid/content/res/Configuration;)Z
-HSPLandroid/window/IOnBackInvokedCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/window/IOnBackInvokedCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/window/IOnBackInvokedCallback$Stub;-><init>()V
-HSPLandroid/window/IOnBackInvokedCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/window/IOnBackInvokedCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/window/IOnBackInvokedCallback;
-HSPLandroid/window/IOnBackInvokedCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/window/IRemoteTransition$Stub;->asInterface(Landroid/os/IBinder;)Landroid/window/IRemoteTransition;
-HSPLandroid/window/ISurfaceSyncGroup$Stub;-><init>()V
-HSPLandroid/window/ISurfaceSyncGroup$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/window/ITransactionReadyCallback$Stub;-><init>()V
-HSPLandroid/window/ITrustedPresentationListener$Stub;-><init>()V
-HSPLandroid/window/IWindowContainerToken$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/window/IWindowContainerToken$Stub;->asInterface(Landroid/os/IBinder;)Landroid/window/IWindowContainerToken;
-HSPLandroid/window/ImeOnBackInvokedDispatcher$1;-><init>(Landroid/window/ImeOnBackInvokedDispatcher;Landroid/os/Handler;)V
-HSPLandroid/window/ImeOnBackInvokedDispatcher$1;->onReceiveResult(ILandroid/os/Bundle;)V
-HSPLandroid/window/ImeOnBackInvokedDispatcher$ImeOnBackInvokedCallback;->-$$Nest$mgetId(Landroid/window/ImeOnBackInvokedDispatcher$ImeOnBackInvokedCallback;)I
-HSPLandroid/window/ImeOnBackInvokedDispatcher$ImeOnBackInvokedCallback;-><init>(Landroid/window/IOnBackInvokedCallback;II)V
-HSPLandroid/window/ImeOnBackInvokedDispatcher$ImeOnBackInvokedCallback;->getId()I
-HSPLandroid/window/ImeOnBackInvokedDispatcher;->clear()V
-HSPLandroid/window/ImeOnBackInvokedDispatcher;->switchRootView(Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;)V
-HSPLandroid/window/ImeOnBackInvokedDispatcher;->unregisterReceivedCallback(ILandroid/window/OnBackInvokedDispatcher;)V
-HSPLandroid/window/ImeOnBackInvokedDispatcher;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/window/OnBackInvokedCallbackInfo$1;-><init>()V
-HSPLandroid/window/OnBackInvokedCallbackInfo;-><clinit>()V
-HSPLandroid/window/OnBackInvokedCallbackInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/window/ProxyOnBackInvokedDispatcher$$ExternalSyntheticLambda0;-><init>(Landroid/window/OnBackInvokedCallback;)V
-HSPLandroid/window/ProxyOnBackInvokedDispatcher;->clearCallbacksOnDispatcher()V
-HSPLandroid/window/ProxyOnBackInvokedDispatcher;->registerOnBackInvokedCallback(ILandroid/window/OnBackInvokedCallback;)V
-HSPLandroid/window/ProxyOnBackInvokedDispatcher;->setActualDispatcher(Landroid/window/OnBackInvokedDispatcher;)V
-HSPLandroid/window/ProxyOnBackInvokedDispatcher;->transferCallbacksToDispatcher()V
-HSPLandroid/window/ProxyOnBackInvokedDispatcher;->unregisterOnBackInvokedCallback(Landroid/window/OnBackInvokedCallback;)V
-HSPLandroid/window/SizeConfigurationBuckets$1;-><init>()V
-HSPLandroid/window/SizeConfigurationBuckets;-><clinit>()V
-HSPLandroid/window/SizeConfigurationBuckets;-><init>([Landroid/content/res/Configuration;)V
-HSPLandroid/window/SizeConfigurationBuckets;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V
-HSPLandroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda3;->accept(Ljava/lang/Object;)V
-HSPLandroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda5;->accept(Ljava/lang/Object;)V
-HSPLandroid/window/SurfaceSyncGroup$2;-><init>(Landroid/window/SurfaceSyncGroup;Z)V
-HSPLandroid/window/SurfaceSyncGroup$2;->onTransactionReady(Landroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/window/SurfaceSyncGroup$ISurfaceSyncGroupImpl;->getSurfaceSyncGroup()Landroid/window/SurfaceSyncGroup;
-HSPLandroid/window/SurfaceSyncGroup;->-$$Nest$fgetmLock(Landroid/window/SurfaceSyncGroup;)Ljava/lang/Object;
-HSPLandroid/window/SurfaceSyncGroup;->-$$Nest$fgetmPendingSyncs(Landroid/window/SurfaceSyncGroup;)Landroid/util/ArraySet;
-HSPLandroid/window/SurfaceSyncGroup;->-$$Nest$fgetmTransaction(Landroid/window/SurfaceSyncGroup;)Landroid/view/SurfaceControl$Transaction;
-HSPLandroid/window/SurfaceSyncGroup;->-$$Nest$mcheckIfSyncIsComplete(Landroid/window/SurfaceSyncGroup;)V
-HSPLandroid/window/SurfaceSyncGroup;-><clinit>()V
-HSPLandroid/window/SurfaceSyncGroup;-><init>(Ljava/lang/String;)V
-HSPLandroid/window/SurfaceSyncGroup;-><init>(Ljava/lang/String;Ljava/util/function/Consumer;)V
-HSPLandroid/window/SurfaceSyncGroup;->add(Landroid/window/ISurfaceSyncGroup;ZLjava/lang/Runnable;)Z
-HSPLandroid/window/SurfaceSyncGroup;->addLocalSync(Landroid/window/ISurfaceSyncGroup;Z)Z
-HSPLandroid/window/SurfaceSyncGroup;->addSyncCompleteCallback(Ljava/util/concurrent/Executor;Ljava/lang/Runnable;)V
-HSPLandroid/window/SurfaceSyncGroup;->addTimeout()V
-HSPLandroid/window/SurfaceSyncGroup;->checkIfSyncIsComplete()V
-HSPLandroid/window/SurfaceSyncGroup;->createTransactionReadyCallback(Z)Landroid/window/ITransactionReadyCallback;
-HSPLandroid/window/SurfaceSyncGroup;->getSurfaceSyncGroup(Landroid/window/ISurfaceSyncGroup;)Landroid/window/SurfaceSyncGroup;
-HSPLandroid/window/SurfaceSyncGroup;->invokeSyncCompleteCallbacks()V
-HSPLandroid/window/SurfaceSyncGroup;->isLocalBinder(Landroid/os/IBinder;)Z
-HSPLandroid/window/SurfaceSyncGroup;->lambda$invokeSyncCompleteCallbacks$2(Landroid/util/Pair;)V
-HSPLandroid/window/SurfaceSyncGroup;->lambda$new$0(Landroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/window/SurfaceSyncGroup;->lambda$new$1(Ljava/util/function/Consumer;Landroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/window/SurfaceSyncGroup;->lambda$setTransactionCallbackFromParent$5(Landroid/window/ITransactionReadyCallback;Ljava/util/function/Consumer;Landroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/window/SurfaceSyncGroup;->markSyncReady()V
-HSPLandroid/window/SurfaceSyncGroup;->setTransactionCallbackFromParent(Landroid/window/ISurfaceSyncGroup;Landroid/window/ITransactionReadyCallback;)V
-HSPLandroid/window/TaskAppearedInfo;-><init>(Landroid/app/ActivityManager$RunningTaskInfo;Landroid/view/SurfaceControl;)V
-HSPLandroid/window/TaskSnapshot;->getAppearance()I
-HSPLandroid/window/TaskSnapshot;->getColorSpace()Landroid/graphics/ColorSpace;
-HSPLandroid/window/TaskSnapshot;->getContentInsets()Landroid/graphics/Rect;
-HSPLandroid/window/TaskSnapshot;->getHardwareBuffer()Landroid/hardware/HardwareBuffer;
-HSPLandroid/window/TaskSnapshot;->getId()J
-HSPLandroid/window/TaskSnapshot;->getOrientation()I
-HSPLandroid/window/TaskSnapshot;->getRotation()I
-HSPLandroid/window/TaskSnapshot;->getTaskSize()Landroid/graphics/Point;
-HSPLandroid/window/TaskSnapshot;->getWindowingMode()I
-HSPLandroid/window/TaskSnapshot;->isRealSnapshot()Z
-HSPLandroid/window/TaskSnapshot;->isTranslucent()Z
-HSPLandroid/window/WindowContainerToken$1;->createFromParcel(Landroid/os/Parcel;)Landroid/window/WindowContainerToken;
-HSPLandroid/window/WindowContainerToken$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/window/WindowContainerToken;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/window/WindowContainerToken;->asBinder()Landroid/os/IBinder;
-HSPLandroid/window/WindowContext;-><init>(Landroid/content/Context;ILandroid/os/Bundle;)V
-HSPLandroid/window/WindowContext;->attachToDisplayArea()V
-HSPLandroid/window/WindowContext;->dispatchConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/window/WindowContext;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroid/window/WindowContext;->registerComponentCallbacks(Landroid/content/ComponentCallbacks;)V
-HSPLandroid/window/WindowContextController;-><init>(Landroid/window/WindowTokenClient;)V
-HSPLandroid/window/WindowContextController;->attachToDisplayArea(IILandroid/os/Bundle;)V
-HSPLandroid/window/WindowMetricsController$$ExternalSyntheticLambda0;-><init>(Landroid/window/WindowMetricsController;Landroid/os/IBinder;Landroid/graphics/Rect;ZI)V
-HSPLandroid/window/WindowMetricsController$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
-HSPLandroid/window/WindowMetricsController;-><init>(Landroid/content/Context;)V
-HSPLandroid/window/WindowMetricsController;->getWindowInsetsFromServerForDisplay(ILandroid/os/IBinder;Landroid/graphics/Rect;ZI)Landroid/view/WindowInsets;
-HSPLandroid/window/WindowMetricsController;->getWindowMetricsInternal(Z)Landroid/view/WindowMetrics;
-HSPLandroid/window/WindowMetricsController;->lambda$getWindowMetricsInternal$0(Landroid/os/IBinder;Landroid/graphics/Rect;ZI)Landroid/view/WindowInsets;
-HSPLandroid/window/WindowOnBackInvokedDispatcher$Checker;->-$$Nest$mgetContext(Landroid/window/WindowOnBackInvokedDispatcher$Checker;)Landroid/content/Context;
-HSPLandroid/window/WindowOnBackInvokedDispatcher$Checker;-><init>(Landroid/content/Context;)V
-HSPLandroid/window/WindowOnBackInvokedDispatcher$Checker;->checkApplicationCallbackRegistration(ILandroid/window/OnBackInvokedCallback;)Z
-HSPLandroid/window/WindowOnBackInvokedDispatcher$Checker;->getContext()Landroid/content/Context;
-HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda0;-><init>(Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper;)V
-HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda0;->run()V
-HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda2;->run()V
-HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda3;->run()V
-HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$CallbackRef;-><init>(Landroid/window/OnBackInvokedCallback;Z)V
-HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper;->getBackAnimationCallback()Landroid/window/OnBackAnimationCallback;
-HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper;->onBackCancelled()V
-HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper;->onBackInvoked()V
-HSPLandroid/window/WindowOnBackInvokedDispatcher;-><clinit>()V
-HSPLandroid/window/WindowOnBackInvokedDispatcher;-><init>(Landroid/content/Context;)V
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->attachToWindow(Landroid/view/IWindowSession;Landroid/view/IWindow;)V
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->clear()V
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->detachFromWindow()V
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->getTopCallback()Landroid/window/OnBackInvokedCallback;
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->hasImeOnBackInvokedDispatcher()Z
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->isOnBackInvokedCallbackEnabled()Z
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->isOnBackInvokedCallbackEnabled(Landroid/content/Context;)Z
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->registerOnBackInvokedCallback(ILandroid/window/OnBackInvokedCallback;)V
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->registerOnBackInvokedCallbackUnchecked(Landroid/window/OnBackInvokedCallback;I)V
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->setTopOnBackInvokedCallback(Landroid/window/OnBackInvokedCallback;)V
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->unregisterOnBackInvokedCallback(Landroid/window/OnBackInvokedCallback;)V
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->updateContext(Landroid/content/Context;)V
-HSPLandroid/window/WindowOrganizer;-><init>()V
-HSPLandroid/window/WindowTokenClient;-><clinit>()V
-HSPLandroid/window/WindowTokenClient;-><init>()V
-HSPLandroid/window/WindowTokenClient;->attachContext(Landroid/content/Context;)V
-HSPLandroid/window/WindowTokenClient;->onConfigurationChanged(Landroid/content/res/Configuration;I)V
-HSPLandroid/window/WindowTokenClient;->onConfigurationChanged(Landroid/content/res/Configuration;IZ)V
-HSPLcom/android/i18n/phonenumbers/CountryCodeToRegionCodeMap;->getCountryCodeToRegionCodeMap()Ljava/util/Map;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->buildNationalNumberForParsing(Ljava/lang/String;Ljava/lang/StringBuilder;)V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->checkRegionForParsing(Ljava/lang/CharSequence;Ljava/lang/String;)Z
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->chooseFormattingPatternForNumber(Ljava/util/List;Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->createInstance(Lcom/android/i18n/phonenumbers/MetadataLoader;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->extractCountryCode(Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;)I
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->extractPossibleNumber(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->format(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;)Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->format(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->formatInOriginalFormat(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->formatNsn(Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/CharSequence;)Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->formatNsnUsingPattern(Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/CharSequence;)Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getCountryCodeForValidRegion(Ljava/lang/String;)I
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getInstance()Lcom/android/i18n/phonenumbers/PhoneNumberUtil;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getMetadataForRegion(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getMetadataForRegionOrCallingCode(ILjava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getNationalSignificantNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getNumberDescByType(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getNumberTypeHelper(Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;+]Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;]Lcom/android/i18n/phonenumbers/PhoneNumberUtil;Lcom/android/i18n/phonenumbers/PhoneNumberUtil;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForCountryCode(I)Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumberFromRegionList(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/util/List;)Ljava/lang/String;+]Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/i18n/phonenumbers/PhoneNumberUtil;Lcom/android/i18n/phonenumbers/PhoneNumberUtil;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->hasFormattingPatternForNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Z
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isNumberMatchingDesc(Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Z+]Ljava/lang/String;Ljava/lang/String;]Lcom/android/i18n/phonenumbers/internal/MatcherApi;Lcom/android/i18n/phonenumbers/internal/RegexBasedMatcher;]Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;]Ljava/util/List;Ljava/util/ArrayList;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isValidNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Z
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isValidNumberForRegion(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/lang/String;)Z
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isValidRegionCode(Ljava/lang/String;)Z
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isViablePhoneNumber(Ljava/lang/CharSequence;)Z
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->maybeAppendFormattedExtension(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->maybeExtractCountryCode(Ljava/lang/CharSequence;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Ljava/lang/StringBuilder;ZLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)I
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->maybeStripExtension(Ljava/lang/StringBuilder;)Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->maybeStripInternationalPrefixAndNormalize(Ljava/lang/StringBuilder;Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->maybeStripNationalPrefixAndCarrierCode(Ljava/lang/StringBuilder;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Ljava/lang/StringBuilder;)Z
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->normalize(Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->normalizeDiallableCharsOnly(Ljava/lang/CharSequence;)Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->normalizeDigits(Ljava/lang/CharSequence;Z)Ljava/lang/StringBuilder;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->normalizeDigitsOnly(Ljava/lang/CharSequence;)Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->normalizeHelper(Ljava/lang/CharSequence;Ljava/util/Map;Z)Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->parse(Ljava/lang/CharSequence;Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->parse(Ljava/lang/CharSequence;Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->parseAndKeepRawInput(Ljava/lang/CharSequence;Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->parseAndKeepRawInput(Ljava/lang/CharSequence;Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->parseHelper(Ljava/lang/CharSequence;Ljava/lang/String;ZZLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->parsePrefixAsIdd(Ljava/util/regex/Pattern;Ljava/lang/StringBuilder;)Z
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->prefixNumberWithCountryCallingCode(ILcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->setInstance(Lcom/android/i18n/phonenumbers/PhoneNumberUtil;)V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->setItalianLeadingZerosForPhoneNumber(Ljava/lang/CharSequence;Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->testNumberLength(Ljava/lang/CharSequence;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil$ValidationResult;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->testNumberLength(Ljava/lang/CharSequence;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil$ValidationResult;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;-><init>()V
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->getFormat()Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->getLeadingDigitsPattern(I)Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->getLeadingDigitsPatternCount()I
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->getNationalPrefixFormattingRule()Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->getPattern()Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->readExternal(Ljava/io/ObjectInput;)V
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->setFormat(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->setNationalPrefixFormattingRule(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->setNationalPrefixOptionalWhenFormatting(Z)Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->setPattern(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;-><init>()V
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getCountryCode()I
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getFixedLine()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getGeneralDesc()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getInternationalPrefix()Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getIntlNumberFormatList()Ljava/util/List;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getLeadingDigits()Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getMobile()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getNationalPrefixForParsing()Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getNationalPrefixTransformRule()Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getNumberFormatList()Ljava/util/List;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPager()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPersonalNumber()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPremiumRate()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getSameMobileAndFixedLinePattern()Z
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getSharedCost()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getTollFree()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getUan()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getVoicemail()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getVoip()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->hasLeadingDigits()Z
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->readExternal(Ljava/io/ObjectInput;)V
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setCountryCode(I)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setFixedLine(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setGeneralDesc(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setId(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setInternationalPrefix(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setLeadingDigits(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setMainCountryForCode(Z)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setMobile(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setMobileNumberPortableRegion(Z)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefix(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefixForParsing(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefixTransformRule(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNoInternationalDialling(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setPager(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setPersonalNumber(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setPreferredExtnPrefix(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setPremiumRate(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setSameMobileAndFixedLinePattern(Z)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setSharedCost(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setTollFree(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setUan(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setVoicemail(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setVoip(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadataCollection;-><init>()V
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadataCollection;->getMetadataList()Ljava/util/List;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadataCollection;->readExternal(Ljava/io/ObjectInput;)V
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;-><init>()V
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->getNationalNumberPattern()Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->getPossibleLengthList()Ljava/util/List;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->getPossibleLengthLocalOnlyList()Ljava/util/List;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->readExternal(Ljava/io/ObjectInput;)V
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->setExampleNumber(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->setNationalNumberPattern(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;-><init>()V
-HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->getCountryCode()I
-HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->getCountryCodeSource()Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;
-HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->getNationalNumber()J
-HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->getRawInput()Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->hasCountryCodeSource()Z
-HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->hasExtension()Z
-HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->hasRawInput()Z
-HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->isItalianLeadingZero()Z
-HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->setCountryCode(I)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
-HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->setCountryCodeSource(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
-HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->setNationalNumber(J)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
-HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->setRawInput(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
-HSPLcom/android/i18n/phonenumbers/internal/RegexBasedMatcher;->match(Ljava/lang/CharSequence;Ljava/util/regex/Pattern;Z)Z+]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;]Ljava/util/regex/Pattern;Ljava/util/regex/Pattern;
-HSPLcom/android/i18n/phonenumbers/internal/RegexBasedMatcher;->matchNationalNumber(Ljava/lang/CharSequence;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;Z)Z+]Ljava/lang/String;Ljava/lang/String;]Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;]Lcom/android/i18n/phonenumbers/internal/RegexCache;Lcom/android/i18n/phonenumbers/internal/RegexCache;
-HSPLcom/android/i18n/phonenumbers/internal/RegexCache$LRUCache$1;->removeEldestEntry(Ljava/util/Map$Entry;)Z
-HSPLcom/android/i18n/phonenumbers/internal/RegexCache$LRUCache;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/i18n/phonenumbers/internal/RegexCache$LRUCache;->put(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLcom/android/i18n/phonenumbers/internal/RegexCache;-><init>(I)V
-HSPLcom/android/i18n/phonenumbers/internal/RegexCache;->getPatternForRegex(Ljava/lang/String;)Ljava/util/regex/Pattern;
-HSPLcom/android/i18n/system/AppSpecializationHooks;->handleCompatChangesBeforeBindingApplication()V
-HSPLcom/android/i18n/system/ZygoteHooks;->handleCompatChangesBeforeBindingApplication()V
-HSPLcom/android/i18n/system/ZygoteHooks;->onEndPreload()V
-HSPLcom/android/i18n/timezone/WallTime;->checked32BitAdd(JI)I
-HSPLcom/android/i18n/timezone/WallTime;->copyFieldsFromCalendar()V
-HSPLcom/android/i18n/timezone/WallTime;->getGmtOffset()I
-HSPLcom/android/i18n/timezone/WallTime;->getHour()I
-HSPLcom/android/i18n/timezone/WallTime;->getIsDst()I
-HSPLcom/android/i18n/timezone/WallTime;->getMinute()I
-HSPLcom/android/i18n/timezone/WallTime;->getMonth()I
-HSPLcom/android/i18n/timezone/WallTime;->getMonthDay()I
-HSPLcom/android/i18n/timezone/WallTime;->getSecond()I
-HSPLcom/android/i18n/timezone/WallTime;->getWeekDay()I
-HSPLcom/android/i18n/timezone/WallTime;->getYear()I
-HSPLcom/android/i18n/timezone/WallTime;->getYearDay()I
-HSPLcom/android/i18n/timezone/WallTime;->localtime(ILcom/android/i18n/timezone/ZoneInfoData;)V
-HSPLcom/android/i18n/timezone/WallTime;->setGmtOffset(I)V
-HSPLcom/android/i18n/timezone/WallTime;->setHour(I)V
-HSPLcom/android/i18n/timezone/WallTime;->setIsDst(I)V
-HSPLcom/android/i18n/timezone/WallTime;->setMinute(I)V
-HSPLcom/android/i18n/timezone/WallTime;->setMonth(I)V
-HSPLcom/android/i18n/timezone/WallTime;->setMonthDay(I)V
-HSPLcom/android/i18n/timezone/WallTime;->setSecond(I)V
-HSPLcom/android/i18n/timezone/WallTime;->setWeekDay(I)V
-HSPLcom/android/i18n/timezone/WallTime;->setYear(I)V
-HSPLcom/android/i18n/timezone/WallTime;->setYearDay(I)V
-HSPLcom/android/i18n/timezone/ZoneInfoData;-><init>(Lcom/android/i18n/timezone/ZoneInfoData;)V
-HSPLcom/android/i18n/timezone/ZoneInfoData;-><init>(Lcom/android/i18n/timezone/ZoneInfoData;I)V
-HSPLcom/android/i18n/timezone/ZoneInfoData;-><init>(Ljava/lang/String;[J[B[I[B)V
-HSPLcom/android/i18n/timezone/ZoneInfoData;->checkTzifVersionAcceptable(Ljava/lang/String;B)V
-HSPLcom/android/i18n/timezone/ZoneInfoData;->findOffsetIndexForTimeInMilliseconds(J)I
-HSPLcom/android/i18n/timezone/ZoneInfoData;->findOffsetIndexForTimeInSeconds(J)I
-HSPLcom/android/i18n/timezone/ZoneInfoData;->findTransitionIndex(J)I
-HSPLcom/android/i18n/timezone/ZoneInfoData;->getID()Ljava/lang/String;
-HSPLcom/android/i18n/timezone/ZoneInfoData;->getLatestDstSavingsMillis(J)Ljava/lang/Integer;
-HSPLcom/android/i18n/timezone/ZoneInfoData;->getOffset(J)I
-HSPLcom/android/i18n/timezone/ZoneInfoData;->getOffsetsByUtcTime(J[I)I+]Lcom/android/i18n/timezone/ZoneInfoData;Lcom/android/i18n/timezone/ZoneInfoData;
-HSPLcom/android/i18n/timezone/ZoneInfoData;->getRawOffset()I
-HSPLcom/android/i18n/timezone/ZoneInfoData;->getTransitions()[J
-HSPLcom/android/i18n/timezone/ZoneInfoData;->hashCode()I
-HSPLcom/android/i18n/timezone/ZoneInfoData;->isInDaylightTime(J)Z
-HSPLcom/android/i18n/timezone/ZoneInfoData;->read64BitData(Ljava/lang/String;Lcom/android/i18n/timezone/internal/BufferIterator;)Lcom/android/i18n/timezone/ZoneInfoData;
-HSPLcom/android/i18n/timezone/ZoneInfoData;->readTimeZone(Ljava/lang/String;Lcom/android/i18n/timezone/internal/BufferIterator;)Lcom/android/i18n/timezone/ZoneInfoData;
-HSPLcom/android/i18n/timezone/ZoneInfoData;->roundDownMillisToSeconds(J)J
-HSPLcom/android/i18n/timezone/ZoneInfoData;->roundUpMillisToSeconds(J)J
-HSPLcom/android/i18n/timezone/ZoneInfoData;->skipOver32BitData(Ljava/lang/String;Lcom/android/i18n/timezone/internal/BufferIterator;)V
-HSPLcom/android/i18n/timezone/ZoneInfoDb$1;->create(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/i18n/timezone/ZoneInfoDb$1;->create(Ljava/lang/String;)Lcom/android/i18n/timezone/ZoneInfoData;
-HSPLcom/android/i18n/timezone/ZoneInfoDb;->checkNotClosed()V
-HSPLcom/android/i18n/timezone/ZoneInfoDb;->close()V
-HSPLcom/android/i18n/timezone/ZoneInfoDb;->finalize()V
-HSPLcom/android/i18n/timezone/ZoneInfoDb;->getAvailableIDs()[Ljava/lang/String;
-HSPLcom/android/i18n/timezone/ZoneInfoDb;->getBufferIterator(Ljava/lang/String;)Lcom/android/i18n/timezone/internal/BufferIterator;
-HSPLcom/android/i18n/timezone/ZoneInfoDb;->getInstance()Lcom/android/i18n/timezone/ZoneInfoDb;
-HSPLcom/android/i18n/timezone/ZoneInfoDb;->makeZoneInfoData(Ljava/lang/String;)Lcom/android/i18n/timezone/ZoneInfoData;
-HSPLcom/android/i18n/timezone/ZoneInfoDb;->makeZoneInfoDataUncached(Ljava/lang/String;)Lcom/android/i18n/timezone/ZoneInfoData;
-HSPLcom/android/i18n/timezone/internal/BasicLruCache$CacheMap;->removeEldestEntry(Ljava/util/Map$Entry;)Z
-HSPLcom/android/i18n/timezone/internal/BasicLruCache;->evictAll()V
-HSPLcom/android/i18n/timezone/internal/BasicLruCache;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/i18n/timezone/internal/BufferIterator;-><init>()V
-HSPLcom/android/i18n/timezone/internal/Memory;->peekInt(JZ)I
-HSPLcom/android/i18n/timezone/internal/MemoryMappedFile;->bigEndianIterator()Lcom/android/i18n/timezone/internal/BufferIterator;
-HSPLcom/android/i18n/timezone/internal/MemoryMappedFile;->checkNotClosed()V
-HSPLcom/android/i18n/timezone/internal/NioBufferIterator;-><init>(Lcom/android/i18n/timezone/internal/MemoryMappedFile;JIZ)V
-HSPLcom/android/i18n/timezone/internal/NioBufferIterator;->checkArrayBounds(III)V
-HSPLcom/android/i18n/timezone/internal/NioBufferIterator;->checkReadBounds(III)V
-HSPLcom/android/i18n/timezone/internal/NioBufferIterator;->readByte()B
-HSPLcom/android/i18n/timezone/internal/NioBufferIterator;->readByteArray([BII)V
-HSPLcom/android/i18n/timezone/internal/NioBufferIterator;->readInt()I
-HSPLcom/android/i18n/timezone/internal/NioBufferIterator;->readLongArray([JII)V
-HSPLcom/android/i18n/timezone/internal/NioBufferIterator;->skip(I)V
-HSPLcom/android/icu/charset/CharsetDecoderICU;-><init>(Ljava/nio/charset/Charset;FJ)V
-HSPLcom/android/icu/charset/CharsetDecoderICU;->decodeLoop(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
-HSPLcom/android/icu/charset/CharsetDecoderICU;->getArray(Ljava/nio/ByteBuffer;)I+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
-HSPLcom/android/icu/charset/CharsetDecoderICU;->getArray(Ljava/nio/CharBuffer;)I+]Ljava/nio/CharBuffer;Ljava/nio/HeapCharBuffer;
-HSPLcom/android/icu/charset/CharsetDecoderICU;->implFlush(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;+]Lcom/android/icu/charset/CharsetDecoderICU;Lcom/android/icu/charset/CharsetDecoderICU;
-HSPLcom/android/icu/charset/CharsetDecoderICU;->implOnMalformedInput(Ljava/nio/charset/CodingErrorAction;)V
-HSPLcom/android/icu/charset/CharsetDecoderICU;->implOnUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)V
-HSPLcom/android/icu/charset/CharsetDecoderICU;->implReplaceWith(Ljava/lang/String;)V
-HSPLcom/android/icu/charset/CharsetDecoderICU;->implReset()V
-HSPLcom/android/icu/charset/CharsetDecoderICU;->newInstance(Ljava/nio/charset/Charset;Ljava/lang/String;)Lcom/android/icu/charset/CharsetDecoderICU;
-HSPLcom/android/icu/charset/CharsetDecoderICU;->setPosition(Ljava/nio/ByteBuffer;)V
-HSPLcom/android/icu/charset/CharsetDecoderICU;->setPosition(Ljava/nio/CharBuffer;)V
-HSPLcom/android/icu/charset/CharsetDecoderICU;->updateCallback()V
-HSPLcom/android/icu/charset/CharsetEncoderICU;-><init>(Ljava/nio/charset/Charset;FF[BJ)V
-HSPLcom/android/icu/charset/CharsetEncoderICU;->encodeLoop(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;+]Ljava/nio/CharBuffer;Ljava/nio/HeapCharBuffer;
-HSPLcom/android/icu/charset/CharsetEncoderICU;->getArray(Ljava/nio/ByteBuffer;)I+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
-HSPLcom/android/icu/charset/CharsetEncoderICU;->getArray(Ljava/nio/CharBuffer;)I+]Ljava/nio/CharBuffer;Ljava/nio/HeapCharBuffer;
-HSPLcom/android/icu/charset/CharsetEncoderICU;->implFlush(Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;
-HSPLcom/android/icu/charset/CharsetEncoderICU;->implOnMalformedInput(Ljava/nio/charset/CodingErrorAction;)V
-HSPLcom/android/icu/charset/CharsetEncoderICU;->implOnUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)V
-HSPLcom/android/icu/charset/CharsetEncoderICU;->implReset()V
-HSPLcom/android/icu/charset/CharsetEncoderICU;->makeReplacement(Ljava/lang/String;J)[B
-HSPLcom/android/icu/charset/CharsetEncoderICU;->newInstance(Ljava/nio/charset/Charset;Ljava/lang/String;)Lcom/android/icu/charset/CharsetEncoderICU;
-HSPLcom/android/icu/charset/CharsetEncoderICU;->setPosition(Ljava/nio/ByteBuffer;)V+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
-HSPLcom/android/icu/charset/CharsetEncoderICU;->setPosition(Ljava/nio/CharBuffer;)V
-HSPLcom/android/icu/charset/CharsetEncoderICU;->updateCallback()V
-HSPLcom/android/icu/charset/CharsetFactory;->create(Ljava/lang/String;)Ljava/nio/charset/Charset;
-HSPLcom/android/icu/charset/CharsetICU;-><init>(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
-HSPLcom/android/icu/charset/CharsetICU;->newDecoder()Ljava/nio/charset/CharsetDecoder;
-HSPLcom/android/icu/charset/CharsetICU;->newEncoder()Ljava/nio/charset/CharsetEncoder;
-HSPLcom/android/icu/charset/NativeConverter;->U_FAILURE(I)Z
-HSPLcom/android/icu/charset/NativeConverter;->registerConverter(Ljava/lang/Object;J)V
-HSPLcom/android/icu/charset/NativeConverter;->setCallbackDecode(JLjava/nio/charset/CharsetDecoder;)V
-HSPLcom/android/icu/charset/NativeConverter;->setCallbackEncode(JLjava/nio/charset/CharsetEncoder;)V
-HSPLcom/android/icu/charset/NativeConverter;->translateCodingErrorAction(Ljava/nio/charset/CodingErrorAction;)I
-HSPLcom/android/icu/text/CompatibleDecimalFormatFactory;->create(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;)Landroid/icu/text/DecimalFormat;
-HSPLcom/android/icu/text/ExtendedDecimalFormatSymbols;-><init>(Landroid/icu/util/ULocale;Landroid/icu/text/NumberingSystem;)V
-HSPLcom/android/icu/text/ExtendedDecimalFormatSymbols;->getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/NumberingSystem;)Lcom/android/icu/text/ExtendedDecimalFormatSymbols;
-HSPLcom/android/icu/text/ExtendedDecimalFormatSymbols;->getLocalizedPatternSeparator()Ljava/lang/String;
-HSPLcom/android/icu/text/ExtendedIDNA;->convertIDNToASCII(Ljava/lang/String;I)Ljava/lang/StringBuffer;
-HSPLcom/android/icu/text/ExtendedTimeZoneNames;-><clinit>()V
-HSPLcom/android/icu/text/ExtendedTimeZoneNames;-><init>(Landroid/icu/util/ULocale;)V
-HSPLcom/android/icu/text/ExtendedTimeZoneNames;->getInstance(Landroid/icu/util/ULocale;)Lcom/android/icu/text/ExtendedTimeZoneNames;
-HSPLcom/android/icu/text/ExtendedTimeZoneNames;->getTimeZoneNames()Landroid/icu/text/TimeZoneNames;
-HSPLcom/android/icu/util/CaseMapperNative;->toLowerCase(Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;
-HSPLcom/android/icu/util/ExtendedCalendar;-><init>(Landroid/icu/util/ULocale;)V
-HSPLcom/android/icu/util/ExtendedCalendar;->getDateTimePattern(II)Ljava/lang/String;
-HSPLcom/android/icu/util/ExtendedCalendar;->getInstance(Landroid/icu/util/ULocale;)Lcom/android/icu/util/ExtendedCalendar;
-HSPLcom/android/icu/util/ExtendedTimeZone;-><init>(Ljava/lang/String;)V
-HSPLcom/android/icu/util/ExtendedTimeZone;->clearDefaultTimeZone()V
-HSPLcom/android/icu/util/ExtendedTimeZone;->createZoneOffsetTransitionRule(Landroid/icu/util/AnnualTimeZoneRule;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)Ljava/time/zone/ZoneOffsetTransitionRule;
-HSPLcom/android/icu/util/ExtendedTimeZone;->createZoneRules()Ljava/time/zone/ZoneRules;
-HSPLcom/android/icu/util/ExtendedTimeZone;->dayOfWeek(Landroid/icu/util/DateTimeRule;)Ljava/time/DayOfWeek;
-HSPLcom/android/icu/util/ExtendedTimeZone;->fullOffset(Landroid/icu/util/TimeZoneRule;)Ljava/time/ZoneOffset;
-HSPLcom/android/icu/util/ExtendedTimeZone;->getInstance(Ljava/lang/String;)Lcom/android/icu/util/ExtendedTimeZone;
-HSPLcom/android/icu/util/ExtendedTimeZone;->localDateTime(JLjava/time/ZoneOffset;)Ljava/time/LocalDateTime;
-HSPLcom/android/icu/util/ExtendedTimeZone;->standardOffset(Landroid/icu/util/TimeZoneRule;)Ljava/time/ZoneOffset;
-HSPLcom/android/icu/util/ExtendedTimeZone;->timeDefinition(Landroid/icu/util/AnnualTimeZoneRule;)Ljava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;
-HSPLcom/android/icu/util/ExtendedTimeZone;->toOffset(I)Ljava/time/ZoneOffset;
-HSPLcom/android/icu/util/ExtendedTimeZone;->utcStartTime(JLandroid/icu/util/TimeArrayTimeZoneRule;)J
-HSPLcom/android/icu/util/LocaleNative;->getDisplayCountry(Ljava/util/Locale;Ljava/util/Locale;)Ljava/lang/String;
-HSPLcom/android/icu/util/LocaleNative;->getDisplayLanguage(Ljava/util/Locale;Ljava/util/Locale;)Ljava/lang/String;
-HSPLcom/android/icu/util/LocaleNative;->setDefault(Ljava/lang/String;)V
-HSPLcom/android/icu/util/regex/MatcherNative;-><init>(Lcom/android/icu/util/regex/PatternNative;)V+]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry;]Lcom/android/icu/util/regex/PatternNative;Lcom/android/icu/util/regex/PatternNative;
-HSPLcom/android/icu/util/regex/MatcherNative;->create(Lcom/android/icu/util/regex/PatternNative;)Lcom/android/icu/util/regex/MatcherNative;
-HSPLcom/android/icu/util/regex/MatcherNative;->find(I[I)Z
-HSPLcom/android/icu/util/regex/MatcherNative;->findNext([I)Z
-HSPLcom/android/icu/util/regex/MatcherNative;->groupCount()I
-HSPLcom/android/icu/util/regex/MatcherNative;->hitEnd()Z
-HSPLcom/android/icu/util/regex/MatcherNative;->lookingAt([I)Z
-HSPLcom/android/icu/util/regex/MatcherNative;->matches([I)Z
-HSPLcom/android/icu/util/regex/MatcherNative;->requireEnd()Z
-HSPLcom/android/icu/util/regex/MatcherNative;->setInput(Ljava/lang/String;II)V
-HSPLcom/android/icu/util/regex/MatcherNative;->useAnchoringBounds(Z)V
-HSPLcom/android/icu/util/regex/MatcherNative;->useTransparentBounds(Z)V
-HSPLcom/android/icu/util/regex/PatternNative;-><init>(Ljava/lang/String;I)V+]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry;
-HSPLcom/android/icu/util/regex/PatternNative;->create(Ljava/lang/String;I)Lcom/android/icu/util/regex/PatternNative;
-HSPLcom/android/icu/util/regex/PatternNative;->openMatcher()J
-HSPLcom/android/internal/app/AlertController;-><init>(Landroid/content/Context;Landroid/content/DialogInterface;Landroid/view/Window;)V
-HSPLcom/android/internal/app/AlertController;->create(Landroid/content/Context;Landroid/content/DialogInterface;Landroid/view/Window;)Lcom/android/internal/app/AlertController;
-HSPLcom/android/internal/app/AlertController;->installContent()V
-HSPLcom/android/internal/app/AlertController;->resolvePanel(Landroid/view/View;Landroid/view/View;)Landroid/view/ViewGroup;
-HSPLcom/android/internal/app/AlertController;->setBackground(Landroid/content/res/TypedArray;Landroid/view/View;Landroid/view/View;Landroid/view/View;Landroid/view/View;ZZZ)V
-HSPLcom/android/internal/app/AlertController;->setupButtons(Landroid/view/ViewGroup;)V
-HSPLcom/android/internal/app/AlertController;->setupContent(Landroid/view/ViewGroup;)V
-HSPLcom/android/internal/app/AlertController;->setupCustomContent(Landroid/view/ViewGroup;)V
-HSPLcom/android/internal/app/AlertController;->setupTitle(Landroid/view/ViewGroup;)V
-HSPLcom/android/internal/app/AlertController;->setupView()V
-HSPLcom/android/internal/app/AssistUtils;-><init>(Landroid/content/Context;)V
-HSPLcom/android/internal/app/AssistUtils;->getAssistComponentForUser(I)Landroid/content/ComponentName;
-HSPLcom/android/internal/app/IAppOpsActiveCallback$Stub;-><init>()V
-HSPLcom/android/internal/app/IAppOpsActiveCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/app/IAppOpsAsyncNotedCallback$Stub;-><init>()V
-HSPLcom/android/internal/app/IAppOpsAsyncNotedCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/app/IAppOpsAsyncNotedCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/internal/app/IAppOpsCallback$Stub;-><init>()V
-HSPLcom/android/internal/app/IAppOpsCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->checkOperation(IILjava/lang/String;)I
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->checkPackage(ILjava/lang/String;)I
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->extractAsyncOps(Ljava/lang/String;)Ljava/util/List;
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->getPackagesForOps([I)Ljava/util/List;
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->noteOperation(IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Z)Landroid/app/SyncNotedAppOp;
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->reportRuntimeAppOpAccessMessageAndGetConfig(Ljava/lang/String;Landroid/app/SyncNotedAppOp;Ljava/lang/String;)Lcom/android/internal/app/MessageSamplingConfig;
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->shouldCollectNotes(I)Z
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->startWatchingActive([ILcom/android/internal/app/IAppOpsActiveCallback;)V
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->startWatchingAsyncNoted(Ljava/lang/String;Lcom/android/internal/app/IAppOpsAsyncNotedCallback;)V
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->startWatchingModeWithFlags(ILjava/lang/String;ILcom/android/internal/app/IAppOpsCallback;)V
-HSPLcom/android/internal/app/IAppOpsService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IAppOpsService;
-HSPLcom/android/internal/app/IBatteryStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/app/IBatteryStats$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/app/IBatteryStats$Stub$Proxy;->isCharging()Z
-HSPLcom/android/internal/app/IBatteryStats$Stub$Proxy;->takeUidSnapshot(I)Landroid/os/health/HealthStatsParceler;
-HSPLcom/android/internal/app/IBatteryStats$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IBatteryStats;
-HSPLcom/android/internal/app/IVoiceInteractionManagerService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/app/IVoiceInteractionManagerService$Stub$Proxy;->notifyActivityEventChanged(Landroid/os/IBinder;I)V
-HSPLcom/android/internal/app/IVoiceInteractionManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IVoiceInteractionManagerService;
-HSPLcom/android/internal/app/IVoiceInteractor$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IVoiceInteractor;
-HSPLcom/android/internal/app/MessageSamplingConfig$1;->createFromParcel(Landroid/os/Parcel;)Lcom/android/internal/app/MessageSamplingConfig;
-HSPLcom/android/internal/app/MessageSamplingConfig$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLcom/android/internal/app/MessageSamplingConfig;-><init>(Landroid/os/Parcel;)V
-HSPLcom/android/internal/app/MessageSamplingConfig;->getAcceptableLeftDistance()I
-HSPLcom/android/internal/app/MessageSamplingConfig;->getExpirationTimeSinceBootMillis()J
-HSPLcom/android/internal/app/MessageSamplingConfig;->getSampledOpCode()I
-HSPLcom/android/internal/app/ProcessMap;->get(Ljava/lang/String;I)Ljava/lang/Object;
-HSPLcom/android/internal/app/procstats/AssociationState$SourceState;->getAssociationState()Lcom/android/internal/app/procstats/AssociationState;
-HSPLcom/android/internal/app/procstats/AssociationState$SourceState;->startActive(J)V
-HSPLcom/android/internal/app/procstats/AssociationState$SourceState;->trackProcState(IIJ)V
-HSPLcom/android/internal/app/procstats/AssociationState;->getProcess()Lcom/android/internal/app/procstats/ProcessState;
-HSPLcom/android/internal/app/procstats/ProcessState;->getCombinedState()I
-HSPLcom/android/internal/app/procstats/ProcessStats;->splitAndParseNumbers(Ljava/lang/String;)[I
-HSPLcom/android/internal/app/procstats/ProcessStats;->updateTrackingAssociationsLocked(IJ)V
-HSPLcom/android/internal/app/procstats/SparseMappingTable$Table;->assertConsistency()V
-HSPLcom/android/internal/appwidget/IAppWidgetService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/appwidget/IAppWidgetService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/appwidget/IAppWidgetService$Stub$Proxy;->getAppWidgetIds(Landroid/content/ComponentName;)[I
-HSPLcom/android/internal/appwidget/IAppWidgetService$Stub$Proxy;->getInstalledProvidersForProfile(IILjava/lang/String;)Landroid/content/pm/ParceledListSlice;
-HSPLcom/android/internal/appwidget/IAppWidgetService$Stub$Proxy;->notifyProviderInheritance([Landroid/content/ComponentName;)V
-HSPLcom/android/internal/appwidget/IAppWidgetService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/appwidget/IAppWidgetService;
-HSPLcom/android/internal/colorextraction/ColorExtractor$GradientColors;->getMainColor()I
-HSPLcom/android/internal/colorextraction/ColorExtractor$GradientColors;->supportsDarkText()Z
-HSPLcom/android/internal/compat/ChangeReporter$ChangeReport;-><init>(JI)V
-HSPLcom/android/internal/compat/ChangeReporter$ChangeReport;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Lcom/android/internal/compat/ChangeReporter$ChangeReport;
-HSPLcom/android/internal/compat/ChangeReporter$ChangeReport;->hashCode()I
-HSPLcom/android/internal/compat/ChangeReporter;-><init>(I)V
-HSPLcom/android/internal/compat/ChangeReporter;->debugLog(IJI)V
-HSPLcom/android/internal/compat/ChangeReporter;->isAlreadyReported(ILcom/android/internal/compat/ChangeReporter$ChangeReport;)Z+]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Set;Ljava/util/HashSet;
-HSPLcom/android/internal/compat/ChangeReporter;->markAsReported(ILcom/android/internal/compat/ChangeReporter$ChangeReport;)V+]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Set;Ljava/util/HashSet;
-HSPLcom/android/internal/compat/ChangeReporter;->reportChange(IJI)V+]Lcom/android/internal/compat/ChangeReporter;Lcom/android/internal/compat/ChangeReporter;
-HSPLcom/android/internal/compat/ChangeReporter;->shouldWriteToDebug(IJI)Z
-HSPLcom/android/internal/compat/ChangeReporter;->shouldWriteToStatsLog(IJI)Z
-HSPLcom/android/internal/compat/ChangeReporter;->stateToString(I)Ljava/lang/String;
-HSPLcom/android/internal/compat/IPlatformCompat$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/compat/IPlatformCompat;
-HSPLcom/android/internal/content/PackageMonitor;-><init>()V
-HSPLcom/android/internal/content/ReferrerIntent$1;->createFromParcel(Landroid/os/Parcel;)Lcom/android/internal/content/ReferrerIntent;
-HSPLcom/android/internal/content/ReferrerIntent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLcom/android/internal/display/BrightnessSynchronizer;-><clinit>()V
-HSPLcom/android/internal/display/BrightnessSynchronizer;->floatEquals(FF)Z
-HSPLcom/android/internal/dynamicanimation/animation/DynamicAnimation;-><init>(Ljava/lang/Object;Landroid/util/FloatProperty;)V
-HSPLcom/android/internal/dynamicanimation/animation/SpringForce;-><init>()V
-HSPLcom/android/internal/graphics/ColorUtils;->HSLToColor([F)I
-HSPLcom/android/internal/graphics/ColorUtils;->RGBToHSL(III[F)V
-HSPLcom/android/internal/graphics/ColorUtils;->colorToHSL(I[F)V
-HSPLcom/android/internal/graphics/SfVsyncFrameCallbackProvider;-><init>()V
-HSPLcom/android/internal/graphics/SfVsyncFrameCallbackProvider;->getFrameTime()J
-HSPLcom/android/internal/graphics/SfVsyncFrameCallbackProvider;->postFrameCallback(Landroid/view/Choreographer$FrameCallback;)V
-HSPLcom/android/internal/graphics/cam/Cam;-><init>(FFFFFFFFF)V
-HSPLcom/android/internal/graphics/cam/Cam;->fromInt(I)Lcom/android/internal/graphics/cam/Cam;
-HSPLcom/android/internal/graphics/cam/Cam;->fromIntInFrame(ILcom/android/internal/graphics/cam/Frame;)Lcom/android/internal/graphics/cam/Cam;
-HSPLcom/android/internal/graphics/cam/Cam;->getChroma()F
-HSPLcom/android/internal/graphics/cam/Cam;->getHue()F
-HSPLcom/android/internal/graphics/cam/CamUtils;-><clinit>()V
-HSPLcom/android/internal/graphics/cam/CamUtils;->linearized(I)F
-HSPLcom/android/internal/graphics/cam/CamUtils;->xyzFromInt(I)[F
-HSPLcom/android/internal/graphics/cam/Frame;-><clinit>()V
-HSPLcom/android/internal/graphics/cam/Frame;-><init>(FFFFFF[FFFF)V
-HSPLcom/android/internal/graphics/cam/Frame;->getAw()F
-HSPLcom/android/internal/graphics/cam/Frame;->getC()F
-HSPLcom/android/internal/graphics/cam/Frame;->getFl()F
-HSPLcom/android/internal/graphics/cam/Frame;->getFlRoot()F
-HSPLcom/android/internal/graphics/cam/Frame;->getN()F
-HSPLcom/android/internal/graphics/cam/Frame;->getNbb()F
-HSPLcom/android/internal/graphics/cam/Frame;->getNc()F
-HSPLcom/android/internal/graphics/cam/Frame;->getNcb()F
-HSPLcom/android/internal/graphics/cam/Frame;->getRgbD()[F
-HSPLcom/android/internal/graphics/cam/Frame;->getZ()F
-HSPLcom/android/internal/graphics/cam/Frame;->make([FFFFZ)Lcom/android/internal/graphics/cam/Frame;
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;-><init>(Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable;Landroid/content/res/Resources;)V
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;->addDrawable(Landroid/graphics/drawable/Drawable;)I
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;->canApplyTheme()Z
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;->getCurrentDrawableIndexBasedOnScale()I
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;->mutate()V
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable;-><init>()V
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable;-><init>(Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;Landroid/content/res/Resources;)V
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable;-><init>(Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;Landroid/content/res/Resources;Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable-IA;)V
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable;->clearMutated()V
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable;->inflateChildElements(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable;->mutate()Landroid/graphics/drawable/Drawable;
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable;->onStateChange([I)Z
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable;->setConstantState(Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;)V
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable;->start()V
-HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable;->stop()V
-HSPLcom/android/internal/graphics/drawable/BackgroundBlurDrawable$Aggregator;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLcom/android/internal/graphics/drawable/BackgroundBlurDrawable$Aggregator;->hasRegions()Z
-HSPLcom/android/internal/graphics/drawable/BackgroundBlurDrawable$Aggregator;->hasUpdates()Z
-HSPLcom/android/internal/infra/AndroidFuture$1;->complete(Lcom/android/internal/infra/AndroidFuture;)V
-HSPLcom/android/internal/infra/AndroidFuture$2;->createFromParcel(Landroid/os/Parcel;)Lcom/android/internal/infra/AndroidFuture;
-HSPLcom/android/internal/infra/AndroidFuture$2;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLcom/android/internal/infra/AndroidFuture;-><init>()V
-HSPLcom/android/internal/infra/AndroidFuture;-><init>(Landroid/os/Parcel;)V
-HSPLcom/android/internal/infra/AndroidFuture;->cancelTimeout()Lcom/android/internal/infra/AndroidFuture;
-HSPLcom/android/internal/infra/AndroidFuture;->complete(Ljava/lang/Object;)Z
-HSPLcom/android/internal/infra/AndroidFuture;->getMainHandler()Landroid/os/Handler;
-HSPLcom/android/internal/infra/AndroidFuture;->onCompleted(Ljava/lang/Object;Ljava/lang/Throwable;)V
-HSPLcom/android/internal/infra/AndroidFuture;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLcom/android/internal/infra/IAndroidFuture$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/infra/IAndroidFuture$Stub$Proxy;->complete(Lcom/android/internal/infra/AndroidFuture;)V
-HSPLcom/android/internal/infra/IAndroidFuture$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/internal/inputmethod/EditableInputConnection;-><init>(Landroid/widget/TextView;)V
-HSPLcom/android/internal/inputmethod/EditableInputConnection;->beginBatchEdit()Z
-HSPLcom/android/internal/inputmethod/EditableInputConnection;->closeConnection()V
-HSPLcom/android/internal/inputmethod/EditableInputConnection;->commitText(Ljava/lang/CharSequence;I)Z
-HSPLcom/android/internal/inputmethod/EditableInputConnection;->endBatchEdit()Z
-HSPLcom/android/internal/inputmethod/EditableInputConnection;->endComposingRegionEditInternal()V
-HSPLcom/android/internal/inputmethod/EditableInputConnection;->getEditable()Landroid/text/Editable;
-HSPLcom/android/internal/inputmethod/EditableInputConnection;->setImeConsumesInput(Z)Z
-HSPLcom/android/internal/inputmethod/IImeTracker$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/inputmethod/IImeTracker$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/inputmethod/IImeTracker$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/inputmethod/IImeTracker;
-HSPLcom/android/internal/inputmethod/IInputMethodClient$Stub;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/inputmethod/IInputMethodClient$Stub;->getMaxTransactionId()I
-HSPLcom/android/internal/inputmethod/IInputMethodClient$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/internal/inputmethod/IInputMethodSession$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/inputmethod/IInputMethodSession$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/inputmethod/IInputMethodSession$Stub$Proxy;->finishInput()V
-HSPLcom/android/internal/inputmethod/IInputMethodSession$Stub$Proxy;->updateSelection(IIIIII)V
-HSPLcom/android/internal/inputmethod/IInputMethodSession$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/inputmethod/IInputMethodSession;
-HSPLcom/android/internal/inputmethod/IRemoteAccessibilityInputConnection$Stub;-><init>()V
-HSPLcom/android/internal/inputmethod/IRemoteAccessibilityInputConnection$Stub;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/inputmethod/IRemoteInputConnection$Stub;-><init>()V
-HSPLcom/android/internal/inputmethod/IRemoteInputConnection$Stub;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/inputmethod/IRemoteInputConnection$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/internal/inputmethod/ImeTracing;-><clinit>()V
-HSPLcom/android/internal/inputmethod/ImeTracing;-><init>()V
-HSPLcom/android/internal/inputmethod/ImeTracing;->getInstance()Lcom/android/internal/inputmethod/ImeTracing;
-HSPLcom/android/internal/inputmethod/ImeTracing;->isEnabled()Z
-HSPLcom/android/internal/inputmethod/ImeTracing;->isSystemProcess()Z
-HSPLcom/android/internal/inputmethod/ImeTracingClientImpl;-><init>()V
-HSPLcom/android/internal/inputmethod/ImeTracingClientImpl;->triggerClientDump(Ljava/lang/String;Landroid/view/inputmethod/InputMethodManager;[B)V
-HSPLcom/android/internal/inputmethod/InputBindResult$1;-><init>()V
-HSPLcom/android/internal/inputmethod/InputBindResult$1;->createFromParcel(Landroid/os/Parcel;)Lcom/android/internal/inputmethod/InputBindResult;
-HSPLcom/android/internal/inputmethod/InputBindResult$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLcom/android/internal/inputmethod/InputBindResult;-><clinit>()V
-HSPLcom/android/internal/inputmethod/InputBindResult;-><init>(Landroid/os/Parcel;)V
-HSPLcom/android/internal/inputmethod/InputBindResult;-><init>(Landroid/os/Parcel;Lcom/android/internal/inputmethod/InputBindResult-IA;)V
-HSPLcom/android/internal/inputmethod/InputBindResult;->error(I)Lcom/android/internal/inputmethod/InputBindResult;
-HSPLcom/android/internal/inputmethod/InputConnectionCommandHeader$1;-><init>()V
-HSPLcom/android/internal/inputmethod/InputConnectionCommandHeader$1;->createFromParcel(Landroid/os/Parcel;)Lcom/android/internal/inputmethod/InputConnectionCommandHeader;
-HSPLcom/android/internal/inputmethod/InputConnectionCommandHeader$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLcom/android/internal/inputmethod/InputConnectionCommandHeader;-><clinit>()V
-HSPLcom/android/internal/inputmethod/InputConnectionCommandHeader;-><init>(I)V
-HSPLcom/android/internal/inputmethod/InputMethodDebug;->softInputDisplayReasonToString(I)Ljava/lang/String;
-HSPLcom/android/internal/inputmethod/SubtypeLocaleUtils;->constructLocaleFromString(Ljava/lang/String;)Ljava/util/Locale;
-HSPLcom/android/internal/jank/FrameTracker$FrameMetricsWrapper;-><init>()V
-HSPLcom/android/internal/jank/FrameTracker$FrameMetricsWrapper;->getMetric(I)J
-HSPLcom/android/internal/jank/FrameTracker$FrameMetricsWrapper;->getTiming()[J
-HSPLcom/android/internal/jank/FrameTracker$ThreadedRendererWrapper;-><init>(Landroid/view/ThreadedRenderer;)V
-HSPLcom/android/internal/jank/FrameTracker$ThreadedRendererWrapper;->addObserver(Landroid/graphics/HardwareRendererObserver;)V
-HSPLcom/android/internal/jank/FrameTracker$ThreadedRendererWrapper;->removeObserver(Landroid/graphics/HardwareRendererObserver;)V
-HSPLcom/android/internal/jank/FrameTracker;->begin()V
-HSPLcom/android/internal/jank/FrameTracker;->onFrameMetricsAvailable(I)V
-HSPLcom/android/internal/jank/InteractionJankMonitor$InstanceHolder;-><clinit>()V
-HSPLcom/android/internal/jank/InteractionJankMonitor;->-$$Nest$sfgetDEFAULT_WORKER_NAME()Ljava/lang/String;
-HSPLcom/android/internal/jank/InteractionJankMonitor;-><clinit>()V
-HSPLcom/android/internal/jank/InteractionJankMonitor;-><init>(Landroid/os/HandlerThread;)V
-HSPLcom/android/internal/jank/InteractionJankMonitor;->cancel(I)Z
-HSPLcom/android/internal/jank/InteractionJankMonitor;->end(I)Z
-HSPLcom/android/internal/jank/InteractionJankMonitor;->getInstance()Lcom/android/internal/jank/InteractionJankMonitor;
-HSPLcom/android/internal/jank/InteractionJankMonitor;->postEventLogToWorkerThread(Lcom/android/internal/jank/InteractionJankMonitor$TimeFunction;)V
-HSPLcom/android/internal/listeners/ListenerExecutor$$ExternalSyntheticLambda0;-><init>(Ljava/lang/Object;Ljava/util/function/Supplier;Lcom/android/internal/listeners/ListenerExecutor$ListenerOperation;Lcom/android/internal/listeners/ListenerExecutor$FailureCallback;)V
-HSPLcom/android/internal/listeners/ListenerExecutor$$ExternalSyntheticLambda0;->run()V
-HSPLcom/android/internal/listeners/ListenerExecutor$ListenerOperation;->onComplete(Z)V
-HSPLcom/android/internal/listeners/ListenerExecutor$ListenerOperation;->onPostExecute(Z)V
-HSPLcom/android/internal/listeners/ListenerExecutor$ListenerOperation;->onPreExecute()V
-HSPLcom/android/internal/listeners/ListenerExecutor;->executeSafely(Ljava/util/concurrent/Executor;Ljava/util/function/Supplier;Lcom/android/internal/listeners/ListenerExecutor$ListenerOperation;)V
-HSPLcom/android/internal/listeners/ListenerExecutor;->executeSafely(Ljava/util/concurrent/Executor;Ljava/util/function/Supplier;Lcom/android/internal/listeners/ListenerExecutor$ListenerOperation;Lcom/android/internal/listeners/ListenerExecutor$FailureCallback;)V
-HSPLcom/android/internal/listeners/ListenerExecutor;->lambda$executeSafely$0(Ljava/lang/Object;Ljava/util/function/Supplier;Lcom/android/internal/listeners/ListenerExecutor$ListenerOperation;Lcom/android/internal/listeners/ListenerExecutor$FailureCallback;)V
-HSPLcom/android/internal/logging/AndroidConfig;-><init>()V
-HSPLcom/android/internal/logging/AndroidHandler$1;->format(Ljava/util/logging/LogRecord;)Ljava/lang/String;
-HSPLcom/android/internal/logging/AndroidHandler;-><init>()V
-HSPLcom/android/internal/logging/AndroidHandler;->getAndroidLevel(Ljava/util/logging/Level;)I
-HSPLcom/android/internal/logging/AndroidHandler;->loggerNameToTag(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/logging/AndroidHandler;->publish(Ljava/util/logging/LogRecord;)V
-HSPLcom/android/internal/logging/EventLogTags;->writeSysuiMultiAction([Ljava/lang/Object;)V
-HSPLcom/android/internal/logging/InstanceId$1;->createFromParcel(Landroid/os/Parcel;)Lcom/android/internal/logging/InstanceId;
-HSPLcom/android/internal/logging/InstanceId$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLcom/android/internal/logging/InstanceId;-><init>(I)V
-HSPLcom/android/internal/logging/InstanceId;->getId()I
-HSPLcom/android/internal/logging/InstanceIdSequence;-><init>(I)V
-HSPLcom/android/internal/logging/InstanceIdSequence;->newInstanceId()Lcom/android/internal/logging/InstanceId;
-HSPLcom/android/internal/logging/InstanceIdSequence;->newInstanceIdInternal(I)Lcom/android/internal/logging/InstanceId;
-HSPLcom/android/internal/logging/MetricsLogger;-><init>()V
-HSPLcom/android/internal/logging/MetricsLogger;->action(II)V
-HSPLcom/android/internal/logging/MetricsLogger;->action(Landroid/content/Context;II)V
-HSPLcom/android/internal/logging/MetricsLogger;->action(Landroid/metrics/LogMaker;)V
-HSPLcom/android/internal/logging/MetricsLogger;->count(Landroid/content/Context;Ljava/lang/String;I)V
-HSPLcom/android/internal/logging/MetricsLogger;->count(Ljava/lang/String;I)V
-HSPLcom/android/internal/logging/MetricsLogger;->getLogger()Lcom/android/internal/logging/MetricsLogger;
-HSPLcom/android/internal/logging/MetricsLogger;->hidden(I)V
-HSPLcom/android/internal/logging/MetricsLogger;->histogram(Ljava/lang/String;I)V
-HSPLcom/android/internal/logging/MetricsLogger;->saveLog(Landroid/metrics/LogMaker;)V
-HSPLcom/android/internal/logging/MetricsLogger;->visible(I)V
-HSPLcom/android/internal/logging/MetricsLogger;->write(Landroid/metrics/LogMaker;)V
-HSPLcom/android/internal/logging/UiEventLoggerImpl;-><init>()V
-HSPLcom/android/internal/logging/UiEventLoggerImpl;->log(Lcom/android/internal/logging/UiEventLogger$UiEventEnum;)V
-HSPLcom/android/internal/logging/UiEventLoggerImpl;->log(Lcom/android/internal/logging/UiEventLogger$UiEventEnum;ILjava/lang/String;)V
-HSPLcom/android/internal/logging/UiEventLoggerImpl;->logWithInstanceId(Lcom/android/internal/logging/UiEventLogger$UiEventEnum;ILjava/lang/String;Lcom/android/internal/logging/InstanceId;)V
-HSPLcom/android/internal/net/NetworkUtilsInternal;-><clinit>()V
-HSPLcom/android/internal/os/AndroidPrintStream;-><init>(ILjava/lang/String;)V
-HSPLcom/android/internal/os/AndroidPrintStream;->log(Ljava/lang/String;)V
-HSPLcom/android/internal/os/BackgroundThread;-><init>()V
-HSPLcom/android/internal/os/BackgroundThread;->ensureThreadLocked()V
-HSPLcom/android/internal/os/BackgroundThread;->getExecutor()Ljava/util/concurrent/Executor;
-HSPLcom/android/internal/os/BackgroundThread;->getHandler()Landroid/os/Handler;
-HSPLcom/android/internal/os/BinderCallsStats$SettingsObserver;-><init>(Landroid/content/Context;Lcom/android/internal/os/BinderCallsStats;)V
-HSPLcom/android/internal/os/BinderCallsStats$SettingsObserver;->configureLatencyObserver(Landroid/util/KeyValueListParser;Lcom/android/internal/os/BinderLatencyObserver;)V
-HSPLcom/android/internal/os/BinderCallsStats$SettingsObserver;->onChange()V
-HSPLcom/android/internal/os/BinderCallsStats;->callEnded(Lcom/android/internal/os/BinderInternal$CallSession;III)V
-HSPLcom/android/internal/os/BinderCallsStats;->callStarted(Landroid/os/Binder;II)Lcom/android/internal/os/BinderInternal$CallSession;
-HSPLcom/android/internal/os/BinderCallsStats;->canCollect()Z
-HSPLcom/android/internal/os/BinderCallsStats;->getElapsedRealtimeMicro()J
-HSPLcom/android/internal/os/BinderCallsStats;->getNativeTid()I
-HSPLcom/android/internal/os/BinderCallsStats;->noteBinderThreadNativeIds()V
-HSPLcom/android/internal/os/BinderCallsStats;->noteNativeThreadId()V
-HSPLcom/android/internal/os/BinderCallsStats;->processCallEnded(Lcom/android/internal/os/BinderInternal$CallSession;III)V
-HSPLcom/android/internal/os/BinderCallsStats;->shouldRecordDetailedData()Z
-HSPLcom/android/internal/os/BinderDeathDispatcher;->linkToDeath(Landroid/os/IInterface;Landroid/os/IBinder$DeathRecipient;)I
-HSPLcom/android/internal/os/BinderInternal$GcWatcher;-><init>()V
-HSPLcom/android/internal/os/BinderInternal$GcWatcher;->finalize()V
-HSPLcom/android/internal/os/BinderInternal;->addGcWatcher(Ljava/lang/Runnable;)V
-HSPLcom/android/internal/os/BinderInternal;->forceBinderGc()V
-HSPLcom/android/internal/os/BinderInternal;->forceGc(Ljava/lang/String;)V
-HSPLcom/android/internal/os/BinderLatencyBuckets;-><init>(IIF)V
-HSPLcom/android/internal/os/BinderLatencyBuckets;->sampleToBucket(I)I
-HSPLcom/android/internal/os/BinderLatencyObserver$1;-><init>(Lcom/android/internal/os/BinderLatencyObserver;)V
-HSPLcom/android/internal/os/BinderLatencyObserver$Injector;-><init>()V
-HSPLcom/android/internal/os/BinderLatencyObserver$Injector;->getHandler()Landroid/os/Handler;
-HSPLcom/android/internal/os/BinderLatencyObserver$Injector;->getRandomGenerator()Ljava/util/Random;
-HSPLcom/android/internal/os/BinderLatencyObserver$LatencyDims;-><init>(Ljava/lang/Class;I)V
-HSPLcom/android/internal/os/BinderLatencyObserver$LatencyDims;->create(Ljava/lang/Class;I)Lcom/android/internal/os/BinderLatencyObserver$LatencyDims;
-HSPLcom/android/internal/os/BinderLatencyObserver$LatencyDims;->equals(Ljava/lang/Object;)Z
-HSPLcom/android/internal/os/BinderLatencyObserver$LatencyDims;->getBinderClass()Ljava/lang/Class;
-HSPLcom/android/internal/os/BinderLatencyObserver$LatencyDims;->getTransactionCode()I
-HSPLcom/android/internal/os/BinderLatencyObserver$LatencyDims;->hashCode()I
-HSPLcom/android/internal/os/BinderLatencyObserver;-><init>(Lcom/android/internal/os/BinderLatencyObserver$Injector;I)V
-HSPLcom/android/internal/os/BinderLatencyObserver;->callEnded(Lcom/android/internal/os/BinderInternal$CallSession;)V
-HSPLcom/android/internal/os/BinderLatencyObserver;->getElapsedRealtimeMicro()J
-HSPLcom/android/internal/os/BinderLatencyObserver;->noteLatencyDelayed()V
-HSPLcom/android/internal/os/BinderLatencyObserver;->reset()V
-HSPLcom/android/internal/os/BinderLatencyObserver;->setHistogramBucketsParams(IIF)V
-HSPLcom/android/internal/os/BinderLatencyObserver;->setPushInterval(I)V
-HSPLcom/android/internal/os/BinderLatencyObserver;->setSamplingInterval(I)V
-HSPLcom/android/internal/os/BinderLatencyObserver;->setShardingModulo(I)V
-HSPLcom/android/internal/os/BinderLatencyObserver;->shouldCollect(Lcom/android/internal/os/BinderLatencyObserver$LatencyDims;)Z
-HSPLcom/android/internal/os/BinderLatencyObserver;->shouldKeepSample()Z
-HSPLcom/android/internal/os/CachedDeviceState$Readonly;->isCharging()Z
-HSPLcom/android/internal/os/ClassLoaderFactory;->createClassLoader(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)Ljava/lang/ClassLoader;
-HSPLcom/android/internal/os/ClassLoaderFactory;->createClassLoader(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;IZLjava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;)Ljava/lang/ClassLoader;
-HSPLcom/android/internal/os/ClassLoaderFactory;->isPathClassLoaderName(Ljava/lang/String;)Z
-HSPLcom/android/internal/os/HandlerCaller$MyHandler;-><init>(Lcom/android/internal/os/HandlerCaller;Landroid/os/Looper;Z)V
-HSPLcom/android/internal/os/HandlerCaller$MyHandler;->handleMessage(Landroid/os/Message;)V
-HSPLcom/android/internal/os/HandlerCaller;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/internal/os/HandlerCaller$Callback;Z)V
-HSPLcom/android/internal/os/HandlerCaller;->obtainMessage(I)Landroid/os/Message;
-HSPLcom/android/internal/os/HandlerCaller;->obtainMessageI(II)Landroid/os/Message;
-HSPLcom/android/internal/os/HandlerCaller;->obtainMessageIO(IILjava/lang/Object;)Landroid/os/Message;
-HSPLcom/android/internal/os/HandlerCaller;->obtainMessageIOO(IILjava/lang/Object;Ljava/lang/Object;)Landroid/os/Message;
-HSPLcom/android/internal/os/HandlerCaller;->obtainMessageO(ILjava/lang/Object;)Landroid/os/Message;
-HSPLcom/android/internal/os/HandlerCaller;->obtainMessageOO(ILjava/lang/Object;Ljava/lang/Object;)Landroid/os/Message;
-HSPLcom/android/internal/os/IDropBoxManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/os/IDropBoxManagerService;
-HSPLcom/android/internal/os/IResultReceiver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/os/IResultReceiver$Stub$Proxy;->send(ILandroid/os/Bundle;)V
-HSPLcom/android/internal/os/IResultReceiver$Stub;-><init>()V
-HSPLcom/android/internal/os/IResultReceiver$Stub;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/os/IResultReceiver$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/os/IResultReceiver;
-HSPLcom/android/internal/os/IResultReceiver$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
-HSPLcom/android/internal/os/IResultReceiver$Stub;->getMaxTransactionId()I
-HSPLcom/android/internal/os/IResultReceiver$Stub;->getTransactionName(I)Ljava/lang/String;
-HSPLcom/android/internal/os/IResultReceiver$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;->nextLine()Ljava/nio/CharBuffer;
-HSPLcom/android/internal/os/KernelCpuProcStringReader;->asLongs(Ljava/nio/CharBuffer;[J)I
-HSPLcom/android/internal/os/KernelCpuProcStringReader;->isNumber(C)Z
-HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->copyToCurTimes()V
-HSPLcom/android/internal/os/LoggingPrintStream$1;-><init>()V
-HSPLcom/android/internal/os/LoggingPrintStream;-><init>()V
-HSPLcom/android/internal/os/LoggingPrintStream;->flush(Z)V
-HSPLcom/android/internal/os/LoggingPrintStream;->println(Ljava/lang/Object;)V
-HSPLcom/android/internal/os/LoggingPrintStream;->println(Ljava/lang/String;)V
-HSPLcom/android/internal/os/LooperStats;->deviceStateAllowsCollection()Z
-HSPLcom/android/internal/os/LooperStats;->messageDispatchStarting()Ljava/lang/Object;
-HSPLcom/android/internal/os/LooperStats;->messageDispatched(Ljava/lang/Object;Landroid/os/Message;)V
-HSPLcom/android/internal/os/ProcStatsUtil;->readTerminatedProcFile(Ljava/lang/String;B)Ljava/lang/String;
-HSPLcom/android/internal/os/ProcTimeInStateReader;->initializeTimeInStateFormat(Ljava/nio/file/Path;)V
-HSPLcom/android/internal/os/ProcessCpuTracker$Stats;-><init>(IIZ)V
-HSPLcom/android/internal/os/ProcessCpuTracker$Stats;->getUid(Ljava/lang/String;)I
-HSPLcom/android/internal/os/ProcessCpuTracker;->collectStats(Ljava/lang/String;IZ[ILjava/util/ArrayList;)[I
-HSPLcom/android/internal/os/ProcessCpuTracker;->getName(Lcom/android/internal/os/ProcessCpuTracker$Stats;Ljava/lang/String;)V
-HSPLcom/android/internal/os/ProcessCpuTracker;->onMeasureProcessName(Ljava/lang/String;)I
-HSPLcom/android/internal/os/RuntimeInit$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
-HSPLcom/android/internal/os/RuntimeInit$$ExternalSyntheticLambda1;-><init>()V
-HSPLcom/android/internal/os/RuntimeInit$$ExternalSyntheticLambda1;->get()Ljava/lang/Object;
-HSPLcom/android/internal/os/RuntimeInit$Arguments;-><init>([Ljava/lang/String;)V
-HSPLcom/android/internal/os/RuntimeInit$Arguments;->parseArgs([Ljava/lang/String;)V
-HSPLcom/android/internal/os/RuntimeInit$KillApplicationHandler;-><init>(Lcom/android/internal/os/RuntimeInit$LoggingHandler;)V
-HSPLcom/android/internal/os/RuntimeInit$LoggingHandler;-><init>()V
-HSPLcom/android/internal/os/RuntimeInit$LoggingHandler;-><init>(Lcom/android/internal/os/RuntimeInit$LoggingHandler-IA;)V
-HSPLcom/android/internal/os/RuntimeInit$MethodAndArgsCaller;-><init>(Ljava/lang/reflect/Method;[Ljava/lang/String;)V
-HSPLcom/android/internal/os/RuntimeInit$MethodAndArgsCaller;->run()V
-HSPLcom/android/internal/os/RuntimeInit;->applicationInit(I[J[Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Runnable;
-HSPLcom/android/internal/os/RuntimeInit;->commonInit()V
-HSPLcom/android/internal/os/RuntimeInit;->findStaticMain(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Runnable;
-HSPLcom/android/internal/os/RuntimeInit;->getApplicationObject()Landroid/os/IBinder;
-HSPLcom/android/internal/os/RuntimeInit;->getDefaultUserAgent()Ljava/lang/String;
-HSPLcom/android/internal/os/RuntimeInit;->lambda$commonInit$0()Ljava/lang/String;
-HSPLcom/android/internal/os/RuntimeInit;->redirectLogStreams()V
-HSPLcom/android/internal/os/RuntimeInit;->setApplicationObject(Landroid/os/IBinder;)V
-HSPLcom/android/internal/os/RuntimeInit;->wtf(Ljava/lang/String;Ljava/lang/Throwable;Z)V
-HSPLcom/android/internal/os/SafeZipPathValidatorCallback;-><init>()V
-HSPLcom/android/internal/os/SafeZipPathValidatorCallback;->onZipEntryAccess(Ljava/lang/String;)V
-HSPLcom/android/internal/os/SomeArgs;-><init>()V
-HSPLcom/android/internal/os/SomeArgs;->clear()V
-HSPLcom/android/internal/os/SomeArgs;->obtain()Lcom/android/internal/os/SomeArgs;
-HSPLcom/android/internal/os/SomeArgs;->recycle()V
-HSPLcom/android/internal/os/StatsdHiddenApiUsageLogger;->getInstance()Lcom/android/internal/os/StatsdHiddenApiUsageLogger;
-HSPLcom/android/internal/os/StatsdHiddenApiUsageLogger;->hiddenApiUsed(ILjava/lang/String;Ljava/lang/String;IZ)V
-HSPLcom/android/internal/os/StatsdHiddenApiUsageLogger;->newLogUsage(Ljava/lang/String;IZ)V
-HSPLcom/android/internal/os/StatsdHiddenApiUsageLogger;->setHiddenApiAccessLogSampleRates(II)V
-HSPLcom/android/internal/os/Zygote;->applyDebuggerSystemProperty(Lcom/android/internal/os/ZygoteArguments;)V
-HSPLcom/android/internal/os/Zygote;->applyInvokeWithSecurityPolicy(Lcom/android/internal/os/ZygoteArguments;Landroid/net/Credentials;)V
-HSPLcom/android/internal/os/Zygote;->applyInvokeWithSystemProperty(Lcom/android/internal/os/ZygoteArguments;)V
-HSPLcom/android/internal/os/Zygote;->applyUidSecurityPolicy(Lcom/android/internal/os/ZygoteArguments;Landroid/net/Credentials;)V
-HSPLcom/android/internal/os/Zygote;->callPostForkChildHooks(IZZLjava/lang/String;)V
-HSPLcom/android/internal/os/Zygote;->containsInetGid([I)Z
-HSPLcom/android/internal/os/Zygote;->createManagedSocketFromInitSocket(Ljava/lang/String;)Landroid/net/LocalServerSocket;
-HSPLcom/android/internal/os/Zygote;->forkAndSpecialize(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;[Ljava/lang/String;ZZZ)I
-HSPLcom/android/internal/os/Zygote;->forkSystemServer(II[II[[IJJ)I
-HSPLcom/android/internal/os/Zygote;->getConfigurationProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/os/Zygote;->getUsapPoolEventFD()Ljava/io/FileDescriptor;
-HSPLcom/android/internal/os/Zygote;->getWrapProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/os/Zygote;->initNativeState(Z)V
-HSPLcom/android/internal/os/Zygote;->minChildUid(Landroid/net/Credentials;)I
-HSPLcom/android/internal/os/Zygote;->setAppProcessName(Lcom/android/internal/os/ZygoteArguments;Ljava/lang/String;)V
-HSPLcom/android/internal/os/ZygoteArguments;-><init>(Lcom/android/internal/os/ZygoteCommandBuffer;I)V
-HSPLcom/android/internal/os/ZygoteArguments;->getAssignmentList(Ljava/lang/String;)[Ljava/lang/String;
-HSPLcom/android/internal/os/ZygoteArguments;->getAssignmentValue(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/os/ZygoteArguments;->getInstance(Lcom/android/internal/os/ZygoteCommandBuffer;)Lcom/android/internal/os/ZygoteArguments;
-HSPLcom/android/internal/os/ZygoteArguments;->parseArgs(Lcom/android/internal/os/ZygoteCommandBuffer;I)V
-HSPLcom/android/internal/os/ZygoteCommandBuffer;-><init>(Landroid/net/LocalSocket;)V
-HSPLcom/android/internal/os/ZygoteCommandBuffer;-><init>([Ljava/lang/String;)V
-HSPLcom/android/internal/os/ZygoteCommandBuffer;->close()V
-HSPLcom/android/internal/os/ZygoteCommandBuffer;->getCount()I
-HSPLcom/android/internal/os/ZygoteCommandBuffer;->nextArg()Ljava/lang/String;
-HSPLcom/android/internal/os/ZygoteCommandBuffer;->setCommand([Ljava/lang/String;)V
-HSPLcom/android/internal/os/ZygoteConfig;->getDeviceConfig(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/os/ZygoteConfig;->getInt(Ljava/lang/String;I)I
-HSPLcom/android/internal/os/ZygoteConnection$$ExternalSyntheticLambda0;-><init>(II)V
-HSPLcom/android/internal/os/ZygoteConnection$$ExternalSyntheticLambda0;->run()V
-HSPLcom/android/internal/os/ZygoteConnection$$ExternalSyntheticLambda1;->run()V
-HSPLcom/android/internal/os/ZygoteConnection;-><init>(Landroid/net/LocalSocket;Ljava/lang/String;)V
-HSPLcom/android/internal/os/ZygoteConnection;->canPreloadApp()Z
-HSPLcom/android/internal/os/ZygoteConnection;->closeSocket()V
-HSPLcom/android/internal/os/ZygoteConnection;->getFileDescriptor()Ljava/io/FileDescriptor;
-HSPLcom/android/internal/os/ZygoteConnection;->handleAbiListQuery()V
-HSPLcom/android/internal/os/ZygoteConnection;->handleApiDenylistExemptions(Lcom/android/internal/os/ZygoteServer;[Ljava/lang/String;)Ljava/lang/Runnable;
-HSPLcom/android/internal/os/ZygoteConnection;->handleBootCompleted()V
-HSPLcom/android/internal/os/ZygoteConnection;->handleChildProc(Lcom/android/internal/os/ZygoteArguments;Ljava/io/FileDescriptor;Z)Ljava/lang/Runnable;
-HSPLcom/android/internal/os/ZygoteConnection;->handleHiddenApiAccessLogSampleRate(Lcom/android/internal/os/ZygoteServer;II)Ljava/lang/Runnable;
-HSPLcom/android/internal/os/ZygoteConnection;->handleParentProc(ILjava/io/FileDescriptor;)V
-HSPLcom/android/internal/os/ZygoteConnection;->isClosedByPeer()Z
-HSPLcom/android/internal/os/ZygoteConnection;->lambda$handleApiDenylistExemptions$0([Ljava/lang/String;)V
-HSPLcom/android/internal/os/ZygoteConnection;->lambda$handleHiddenApiAccessLogSampleRate$1(II)V
-HSPLcom/android/internal/os/ZygoteConnection;->processCommand(Lcom/android/internal/os/ZygoteServer;Z)Ljava/lang/Runnable;
-HSPLcom/android/internal/os/ZygoteConnection;->setChildPgid(I)V
-HSPLcom/android/internal/os/ZygoteConnection;->stateChangeWithUsapPoolReset(Lcom/android/internal/os/ZygoteServer;Ljava/lang/Runnable;)Ljava/lang/Runnable;
-HSPLcom/android/internal/os/ZygoteInit;->cacheNonBootClasspathClassLoaders()V
-HSPLcom/android/internal/os/ZygoteInit;->endPreload()V
-HSPLcom/android/internal/os/ZygoteInit;->forkSystemServer(Ljava/lang/String;Ljava/lang/String;Lcom/android/internal/os/ZygoteServer;)Ljava/lang/Runnable;
-HSPLcom/android/internal/os/ZygoteInit;->gcAndFinalize()V
-HSPLcom/android/internal/os/ZygoteInit;->isExperimentEnabled(Ljava/lang/String;)Z
-HSPLcom/android/internal/os/ZygoteInit;->main([Ljava/lang/String;)V
-HSPLcom/android/internal/os/ZygoteInit;->maybePreloadGraphicsDriver()V
-HSPLcom/android/internal/os/ZygoteInit;->posixCapabilitiesAsBits([I)J
-HSPLcom/android/internal/os/ZygoteInit;->preload(Landroid/util/TimingsTraceLog;)V
-HSPLcom/android/internal/os/ZygoteInit;->preloadClasses()V
-HSPLcom/android/internal/os/ZygoteInit;->preloadSharedLibraries()V
-HSPLcom/android/internal/os/ZygoteInit;->preloadTextResources()V
-HSPLcom/android/internal/os/ZygoteInit;->setApiDenylistExemptions([Ljava/lang/String;)V
-HSPLcom/android/internal/os/ZygoteInit;->setHiddenApiAccessLogSampleRate(I)V
-HSPLcom/android/internal/os/ZygoteInit;->setHiddenApiUsageLogger(Ldalvik/system/VMRuntime$HiddenApiUsageLogger;)V
-HSPLcom/android/internal/os/ZygoteInit;->shouldProfileSystemServer()Z
-HSPLcom/android/internal/os/ZygoteInit;->warmUpJcaProviders()V
-HSPLcom/android/internal/os/ZygoteInit;->zygoteInit(I[J[Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Runnable;
-HSPLcom/android/internal/os/ZygoteServer;-><init>(Z)V
-HSPLcom/android/internal/os/ZygoteServer;->acceptCommandPeer(Ljava/lang/String;)Lcom/android/internal/os/ZygoteConnection;
-HSPLcom/android/internal/os/ZygoteServer;->closeServerSocket()V
-HSPLcom/android/internal/os/ZygoteServer;->createNewConnection(Landroid/net/LocalSocket;Ljava/lang/String;)Lcom/android/internal/os/ZygoteConnection;
-HSPLcom/android/internal/os/ZygoteServer;->fetchUsapPoolPolicyProps()V
-HSPLcom/android/internal/os/ZygoteServer;->fetchUsapPoolPolicyPropsWithMinInterval()V
-HSPLcom/android/internal/os/ZygoteServer;->getZygoteSocketFileDescriptor()Ljava/io/FileDescriptor;
-HSPLcom/android/internal/os/ZygoteServer;->isUsapPoolEnabled()Z
-HSPLcom/android/internal/os/ZygoteServer;->runSelectLoop(Ljava/lang/String;)Ljava/lang/Runnable;
-HSPLcom/android/internal/os/ZygoteServer;->setForkChild()V
-HSPLcom/android/internal/policy/DecorContext;-><init>(Landroid/content/Context;Lcom/android/internal/policy/PhoneWindow;)V
-HSPLcom/android/internal/policy/DecorContext;->getAutofillOptions()Landroid/content/AutofillOptions;
-HSPLcom/android/internal/policy/DecorContext;->getContentCaptureOptions()Landroid/content/ContentCaptureOptions;
-HSPLcom/android/internal/policy/DecorContext;->getResources()Landroid/content/res/Resources;+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;
-HSPLcom/android/internal/policy/DecorContext;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
-HSPLcom/android/internal/policy/DecorContext;->isUiContext()Z
-HSPLcom/android/internal/policy/DecorContext;->setPhoneWindow(Lcom/android/internal/policy/PhoneWindow;)V
-HSPLcom/android/internal/policy/DecorView$$ExternalSyntheticLambda0;-><init>(Lcom/android/internal/policy/DecorView;)V
-HSPLcom/android/internal/policy/DecorView$2;->getPadding(Landroid/graphics/Rect;)Z
-HSPLcom/android/internal/policy/DecorView$3;-><init>(Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView$ColorViewState;)V
-HSPLcom/android/internal/policy/DecorView$3;->run()V
-HSPLcom/android/internal/policy/DecorView$ColorViewAttributes;->isPresent(ZIZ)Z
-HSPLcom/android/internal/policy/DecorView$ColorViewAttributes;->isVisible(ZIIZ)Z
-HSPLcom/android/internal/policy/DecorView$ColorViewState;-><init>(Lcom/android/internal/policy/DecorView$ColorViewAttributes;)V
-HSPLcom/android/internal/policy/DecorView;-><init>(Landroid/content/Context;ILcom/android/internal/policy/PhoneWindow;Landroid/view/WindowManager$LayoutParams;)V
-HSPLcom/android/internal/policy/DecorView;->calculateNavigationBarColor(I)I+]Lcom/android/internal/policy/PhoneWindow;Lcom/android/internal/policy/PhoneWindow;
-HSPLcom/android/internal/policy/DecorView;->calculateStatusBarColor(I)I+]Lcom/android/internal/policy/PhoneWindow;Lcom/android/internal/policy/PhoneWindow;
-HSPLcom/android/internal/policy/DecorView;->createDecorCaptionView(Landroid/view/LayoutInflater;)Lcom/android/internal/widget/DecorCaptionView;
-HSPLcom/android/internal/policy/DecorView;->dispatchKeyEvent(Landroid/view/KeyEvent;)Z
-HSPLcom/android/internal/policy/DecorView;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLcom/android/internal/policy/DecorView;->draw(Landroid/graphics/Canvas;)V
-HSPLcom/android/internal/policy/DecorView;->drawLegacyNavigationBarBackground(Landroid/graphics/RecordingCanvas;)V
-HSPLcom/android/internal/policy/DecorView;->drawableChanged()V
-HSPLcom/android/internal/policy/DecorView;->enableCaption(Z)V
-HSPLcom/android/internal/policy/DecorView;->enforceNonTranslucentBackground(Landroid/graphics/drawable/Drawable;Z)Landroid/graphics/drawable/Drawable;
-HSPLcom/android/internal/policy/DecorView;->finishChanging()V
-HSPLcom/android/internal/policy/DecorView;->gatherTransparentRegion(Landroid/graphics/Region;)Z
-HSPLcom/android/internal/policy/DecorView;->gatherTransparentRegion(Lcom/android/internal/policy/DecorView$ColorViewState;Landroid/graphics/Region;)Z
-HSPLcom/android/internal/policy/DecorView;->getAccessibilityViewId()I
-HSPLcom/android/internal/policy/DecorView;->getBackground()Landroid/graphics/drawable/Drawable;
-HSPLcom/android/internal/policy/DecorView;->getCaptionHeight()I
-HSPLcom/android/internal/policy/DecorView;->getCaptionInsetsHeight()I
-HSPLcom/android/internal/policy/DecorView;->getNavBarSize(III)I
-HSPLcom/android/internal/policy/DecorView;->getResources()Landroid/content/res/Resources;+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;]Landroid/content/Context;Landroid/view/ContextThemeWrapper;,Lcom/android/internal/policy/DecorContext;
-HSPLcom/android/internal/policy/DecorView;->getTitleSuffix(Landroid/view/WindowManager$LayoutParams;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Ljava/lang/CharSequence;Ljava/lang/String;
-HSPLcom/android/internal/policy/DecorView;->getWindowInsetsController()Landroid/view/WindowInsetsController;+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;
-HSPLcom/android/internal/policy/DecorView;->initializeElevation()V
-HSPLcom/android/internal/policy/DecorView;->isNavBarToLeftEdge(II)Z
-HSPLcom/android/internal/policy/DecorView;->isNavBarToRightEdge(II)Z
-HSPLcom/android/internal/policy/DecorView;->isResizing()Z
-HSPLcom/android/internal/policy/DecorView;->isShowingCaption()Z
-HSPLcom/android/internal/policy/DecorView;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
-HSPLcom/android/internal/policy/DecorView;->onAttachedToWindow()V
-HSPLcom/android/internal/policy/DecorView;->onCloseSystemDialogs(Ljava/lang/String;)V
-HSPLcom/android/internal/policy/DecorView;->onConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLcom/android/internal/policy/DecorView;->onContentDrawn(IIII)Z
-HSPLcom/android/internal/policy/DecorView;->onDetachedFromWindow()V
-HSPLcom/android/internal/policy/DecorView;->onDraw(Landroid/graphics/Canvas;)V+]Lcom/android/internal/widget/BackgroundFallback;Lcom/android/internal/widget/BackgroundFallback;
-HSPLcom/android/internal/policy/DecorView;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLcom/android/internal/policy/DecorView;->onLayout(ZIIII)V
-HSPLcom/android/internal/policy/DecorView;->onMeasure(II)V+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;]Landroid/content/Context;Landroid/view/ContextThemeWrapper;,Lcom/android/internal/policy/DecorContext;]Landroid/content/res/Resources;Landroid/content/res/Resources;
-HSPLcom/android/internal/policy/DecorView;->onPostDraw(Landroid/graphics/RecordingCanvas;)V
-HSPLcom/android/internal/policy/DecorView;->onResourcesLoaded(Landroid/view/LayoutInflater;I)V
-HSPLcom/android/internal/policy/DecorView;->onRootViewScrollYChanged(I)V
-HSPLcom/android/internal/policy/DecorView;->onSystemBarAppearanceChanged(I)V
-HSPLcom/android/internal/policy/DecorView;->onTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLcom/android/internal/policy/DecorView;->onWindowFocusChanged(Z)V
-HSPLcom/android/internal/policy/DecorView;->onWindowSystemUiVisibilityChanged(I)V
-HSPLcom/android/internal/policy/DecorView;->providePendingInsetsController()Landroid/view/PendingInsetsController;
-HSPLcom/android/internal/policy/DecorView;->releaseThreadedRenderer()V
-HSPLcom/android/internal/policy/DecorView;->removeBackgroundBlurDrawable()V
-HSPLcom/android/internal/policy/DecorView;->sendAccessibilityEvent(I)V
-HSPLcom/android/internal/policy/DecorView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLcom/android/internal/policy/DecorView;->setBackgroundFallback(Landroid/graphics/drawable/Drawable;)V
-HSPLcom/android/internal/policy/DecorView;->setColor(Landroid/view/View;IIZZ)V
-HSPLcom/android/internal/policy/DecorView;->setFrame(IIII)Z+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/ColorDrawable;
-HSPLcom/android/internal/policy/DecorView;->setWindow(Lcom/android/internal/policy/PhoneWindow;)V
-HSPLcom/android/internal/policy/DecorView;->setWindowBackground(Landroid/graphics/drawable/Drawable;)V
-HSPLcom/android/internal/policy/DecorView;->setWindowFrame(Landroid/graphics/drawable/Drawable;)V
-HSPLcom/android/internal/policy/DecorView;->startChanging()V
-HSPLcom/android/internal/policy/DecorView;->superDispatchKeyEvent(Landroid/view/KeyEvent;)Z
-HSPLcom/android/internal/policy/DecorView;->superDispatchTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLcom/android/internal/policy/DecorView;->updateBackgroundBlurRadius()V
-HSPLcom/android/internal/policy/DecorView;->updateBackgroundDrawable()V+]Landroid/graphics/Insets;Landroid/graphics/Insets;
-HSPLcom/android/internal/policy/DecorView;->updateColorViewInt(Lcom/android/internal/policy/DecorView$ColorViewState;IIIZZIZZI)V+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;]Lcom/android/internal/policy/PhoneWindow;Lcom/android/internal/policy/PhoneWindow;]Landroid/view/View;Landroid/view/View;]Landroid/view/ViewPropertyAnimator;Landroid/view/ViewPropertyAnimator;]Lcom/android/internal/policy/DecorView$ColorViewAttributes;Lcom/android/internal/policy/DecorView$ColorViewAttributes;
-HSPLcom/android/internal/policy/DecorView;->updateColorViewTranslations()V
-HSPLcom/android/internal/policy/DecorView;->updateColorViews(Landroid/view/WindowInsets;Z)Landroid/view/WindowInsets;+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;]Lcom/android/internal/policy/PhoneWindow;Lcom/android/internal/policy/PhoneWindow;]Landroid/view/ViewGroup;Landroid/widget/LinearLayout;]Landroid/view/WindowInsetsController;Landroid/view/InsetsController;,Landroid/view/PendingInsetsController;]Landroid/view/WindowInsets;Landroid/view/WindowInsets;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLcom/android/internal/policy/DecorView;->updateDecorCaptionStatus(Landroid/content/res/Configuration;)V
-HSPLcom/android/internal/policy/DecorView;->updateElevation()V+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLcom/android/internal/policy/DecorView;->updateLogTag(Landroid/view/WindowManager$LayoutParams;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLcom/android/internal/policy/DecorView;->updateStatusGuard(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
-HSPLcom/android/internal/policy/DecorView;->willYouTakeTheInputQueue()Landroid/view/InputQueue$Callback;
-HSPLcom/android/internal/policy/DecorView;->willYouTakeTheSurface()Landroid/view/SurfaceHolder$Callback2;
-HSPLcom/android/internal/policy/GestureNavigationSettingsObserver$1;-><init>(Lcom/android/internal/policy/GestureNavigationSettingsObserver;)V
-HSPLcom/android/internal/policy/GestureNavigationSettingsObserver;-><init>(Landroid/os/Handler;Landroid/content/Context;Ljava/lang/Runnable;)V
-HSPLcom/android/internal/policy/GestureNavigationSettingsObserver;->areNavigationButtonForcedVisible()Z
-HSPLcom/android/internal/policy/GestureNavigationSettingsObserver;->getLeftSensitivity(Landroid/content/res/Resources;)I
-HSPLcom/android/internal/policy/GestureNavigationSettingsObserver;->getRightSensitivity(Landroid/content/res/Resources;)I
-HSPLcom/android/internal/policy/IKeyguardLockedStateListener$Stub;-><init>()V
-HSPLcom/android/internal/policy/PhoneFallbackEventHandler;-><init>(Landroid/content/Context;)V
-HSPLcom/android/internal/policy/PhoneFallbackEventHandler;->dispatchKeyEvent(Landroid/view/KeyEvent;)Z
-HSPLcom/android/internal/policy/PhoneFallbackEventHandler;->getAudioManager()Landroid/media/AudioManager;
-HSPLcom/android/internal/policy/PhoneFallbackEventHandler;->onKeyDown(ILandroid/view/KeyEvent;)Z
-HSPLcom/android/internal/policy/PhoneFallbackEventHandler;->onKeyUp(ILandroid/view/KeyEvent;)Z
-HSPLcom/android/internal/policy/PhoneFallbackEventHandler;->preDispatchKeyEvent(Landroid/view/KeyEvent;)V
-HSPLcom/android/internal/policy/PhoneFallbackEventHandler;->setView(Landroid/view/View;)V
-HSPLcom/android/internal/policy/PhoneLayoutInflater;-><init>(Landroid/content/Context;)V
-HSPLcom/android/internal/policy/PhoneLayoutInflater;-><init>(Landroid/view/LayoutInflater;Landroid/content/Context;)V
-HSPLcom/android/internal/policy/PhoneLayoutInflater;->cloneInContext(Landroid/content/Context;)Landroid/view/LayoutInflater;
-HSPLcom/android/internal/policy/PhoneLayoutInflater;->onCreateView(Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLcom/android/internal/policy/PhoneWindow$1;-><init>(Lcom/android/internal/policy/PhoneWindow;)V
-HSPLcom/android/internal/policy/PhoneWindow$1;->run()V
-HSPLcom/android/internal/policy/PhoneWindow$PanelFeatureState$SavedState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLcom/android/internal/policy/PhoneWindow$PanelFeatureState;-><init>(I)V
-HSPLcom/android/internal/policy/PhoneWindow$PanelFeatureState;->onSaveInstanceState()Landroid/os/Parcelable;
-HSPLcom/android/internal/policy/PhoneWindow$PhoneWindowMenuCallback;-><init>(Lcom/android/internal/policy/PhoneWindow;)V
-HSPLcom/android/internal/policy/PhoneWindow;-><init>(Landroid/content/Context;)V
-HSPLcom/android/internal/policy/PhoneWindow;-><init>(Landroid/content/Context;Landroid/view/Window;Landroid/view/ViewRootImpl$ActivityConfigCallback;)V
-HSPLcom/android/internal/policy/PhoneWindow;->alwaysReadCloseOnTouchAttr()V
-HSPLcom/android/internal/policy/PhoneWindow;->applyDecorFitsSystemWindows()V
-HSPLcom/android/internal/policy/PhoneWindow;->closeAllPanels()V
-HSPLcom/android/internal/policy/PhoneWindow;->closeContextMenu()V
-HSPLcom/android/internal/policy/PhoneWindow;->closePanel(Lcom/android/internal/policy/PhoneWindow$PanelFeatureState;Z)V
-HSPLcom/android/internal/policy/PhoneWindow;->dispatchWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;
-HSPLcom/android/internal/policy/PhoneWindow;->doInvalidatePanelMenu(I)V
-HSPLcom/android/internal/policy/PhoneWindow;->generateDecor(I)Lcom/android/internal/policy/DecorView;
-HSPLcom/android/internal/policy/PhoneWindow;->generateLayout(Lcom/android/internal/policy/DecorView;)Landroid/view/ViewGroup;
-HSPLcom/android/internal/policy/PhoneWindow;->getCurrentFocus()Landroid/view/View;
-HSPLcom/android/internal/policy/PhoneWindow;->getDecorView()Landroid/view/View;
-HSPLcom/android/internal/policy/PhoneWindow;->getLayoutInflater()Landroid/view/LayoutInflater;
-HSPLcom/android/internal/policy/PhoneWindow;->getNavigationBarColor()I
-HSPLcom/android/internal/policy/PhoneWindow;->getOnBackInvokedDispatcher()Landroid/window/OnBackInvokedDispatcher;
-HSPLcom/android/internal/policy/PhoneWindow;->getPanelState(IZ)Lcom/android/internal/policy/PhoneWindow$PanelFeatureState;
-HSPLcom/android/internal/policy/PhoneWindow;->getPanelState(IZLcom/android/internal/policy/PhoneWindow$PanelFeatureState;)Lcom/android/internal/policy/PhoneWindow$PanelFeatureState;
-HSPLcom/android/internal/policy/PhoneWindow;->getTransition(Landroid/transition/Transition;Landroid/transition/Transition;I)Landroid/transition/Transition;
-HSPLcom/android/internal/policy/PhoneWindow;->getViewRootImplOrNull()Landroid/view/ViewRootImpl;
-HSPLcom/android/internal/policy/PhoneWindow;->getVolumeControlStream()I
-HSPLcom/android/internal/policy/PhoneWindow;->installDecor()V
-HSPLcom/android/internal/policy/PhoneWindow;->invalidatePanelMenu(I)V
-HSPLcom/android/internal/policy/PhoneWindow;->isFloating()Z
-HSPLcom/android/internal/policy/PhoneWindow;->isShowingWallpaper()Z
-HSPLcom/android/internal/policy/PhoneWindow;->isTranslucent()Z
-HSPLcom/android/internal/policy/PhoneWindow;->lambda$static$0(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/util/Pair;
-HSPLcom/android/internal/policy/PhoneWindow;->onActive()V
-HSPLcom/android/internal/policy/PhoneWindow;->onConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLcom/android/internal/policy/PhoneWindow;->onDestroy()V
-HSPLcom/android/internal/policy/PhoneWindow;->onKeyDown(IILandroid/view/KeyEvent;)Z
-HSPLcom/android/internal/policy/PhoneWindow;->onKeyUp(IILandroid/view/KeyEvent;)Z
-HSPLcom/android/internal/policy/PhoneWindow;->onViewRootImplSet(Landroid/view/ViewRootImpl;)V
-HSPLcom/android/internal/policy/PhoneWindow;->openPanelsAfterRestore()V
-HSPLcom/android/internal/policy/PhoneWindow;->peekDecorView()Landroid/view/View;
-HSPLcom/android/internal/policy/PhoneWindow;->requestFeature(I)Z
-HSPLcom/android/internal/policy/PhoneWindow;->restoreHierarchyState(Landroid/os/Bundle;)V
-HSPLcom/android/internal/policy/PhoneWindow;->saveHierarchyState()Landroid/os/Bundle;
-HSPLcom/android/internal/policy/PhoneWindow;->setAttributes(Landroid/view/WindowManager$LayoutParams;)V+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;
-HSPLcom/android/internal/policy/PhoneWindow;->setBackgroundBlurRadius(I)V
-HSPLcom/android/internal/policy/PhoneWindow;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLcom/android/internal/policy/PhoneWindow;->setContentView(I)V
-HSPLcom/android/internal/policy/PhoneWindow;->setContentView(Landroid/view/View;)V
-HSPLcom/android/internal/policy/PhoneWindow;->setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
-HSPLcom/android/internal/policy/PhoneWindow;->setDecorFitsSystemWindows(Z)V
-HSPLcom/android/internal/policy/PhoneWindow;->setDefaultWindowFormat(I)V
-HSPLcom/android/internal/policy/PhoneWindow;->setNavigationBarColor(I)V
-HSPLcom/android/internal/policy/PhoneWindow;->setNavigationBarContrastEnforced(Z)V
-HSPLcom/android/internal/policy/PhoneWindow;->setNavigationBarDividerColor(I)V
-HSPLcom/android/internal/policy/PhoneWindow;->setStatusBarColor(I)V
-HSPLcom/android/internal/policy/PhoneWindow;->setTheme(I)V
-HSPLcom/android/internal/policy/PhoneWindow;->setTitle(Ljava/lang/CharSequence;)V
-HSPLcom/android/internal/policy/PhoneWindow;->setTitle(Ljava/lang/CharSequence;Z)V
-HSPLcom/android/internal/policy/PhoneWindow;->setTitleColor(I)V
-HSPLcom/android/internal/policy/PhoneWindow;->setVolumeControlStream(I)V
-HSPLcom/android/internal/policy/PhoneWindow;->superDispatchKeyEvent(Landroid/view/KeyEvent;)Z
-HSPLcom/android/internal/policy/PhoneWindow;->superDispatchTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLcom/android/internal/policy/ScreenDecorationsUtils;->supportsRoundedCornersOnWindows(Landroid/content/res/Resources;)Z
-HSPLcom/android/internal/statusbar/IStatusBarService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/statusbar/IStatusBarService;
-HSPLcom/android/internal/statusbar/NotificationVisibility;->recycle()V
-HSPLcom/android/internal/telecom/ClientTransactionalServiceRepository;-><clinit>()V
-HSPLcom/android/internal/telecom/ClientTransactionalServiceRepository;-><init>()V
-HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;->getCallState()I
-HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;->getCallStateUsingPackage(Ljava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;->getCurrentTtyMode(Ljava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;->isInCall(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLcom/android/internal/telecom/ITelecomService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telecom/ITelecomService;
-HSPLcom/android/internal/telecom/IVideoProvider$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telecom/IVideoProvider;
-HSPLcom/android/internal/telephony/CarrierAppUtils$AssociatedAppInfo;-><init>(Landroid/content/pm/ApplicationInfo;I)V
-HSPLcom/android/internal/telephony/CarrierAppUtils;->disableCarrierAppsUntilPrivileged(Ljava/lang/String;Landroid/telephony/TelephonyManager;Landroid/content/ContentResolver;ILjava/util/Set;Ljava/util/Map;Landroid/content/Context;)V
-HSPLcom/android/internal/telephony/CarrierAppUtils;->getApplicationInfoIfSystemApp(ILjava/lang/String;Landroid/content/Context;)Landroid/content/pm/ApplicationInfo;
-HSPLcom/android/internal/telephony/CarrierAppUtils;->getContentResolverForUser(Landroid/content/Context;I)Landroid/content/ContentResolver;
-HSPLcom/android/internal/telephony/CarrierAppUtils;->getDefaultCarrierAppCandidatesHelper(ILjava/util/Set;Landroid/content/Context;)Ljava/util/List;
-HSPLcom/android/internal/telephony/CarrierAppUtils;->getDefaultCarrierAssociatedAppsHelper(ILjava/util/Map;Landroid/content/Context;)Ljava/util/Map;
-HSPLcom/android/internal/telephony/CarrierAppUtils;->isUpdatedSystemApp(Landroid/content/pm/ApplicationInfo;)Z
-HSPLcom/android/internal/telephony/CellBroadcastUtils;->getDefaultCellBroadcastReceiverPackageName(Landroid/content/Context;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/ICarrierConfigLoader$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/telephony/ICarrierConfigLoader$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/telephony/ICarrierConfigLoader$Stub$Proxy;->getConfigForSubIdWithFeature(ILjava/lang/String;Ljava/lang/String;)Landroid/os/PersistableBundle;
-HSPLcom/android/internal/telephony/ICarrierConfigLoader$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ICarrierConfigLoader;
-HSPLcom/android/internal/telephony/IOnSubscriptionsChangedListener$Stub;-><init>()V
-HSPLcom/android/internal/telephony/IOnSubscriptionsChangedListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/telephony/IOnSubscriptionsChangedListener$Stub;->getMaxTransactionId()I
-HSPLcom/android/internal/telephony/IOnSubscriptionsChangedListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/internal/telephony/IPhoneStateListener$Stub;-><init>()V
-HSPLcom/android/internal/telephony/IPhoneStateListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/telephony/IPhoneStateListener$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
-HSPLcom/android/internal/telephony/IPhoneStateListener$Stub;->getMaxTransactionId()I
-HSPLcom/android/internal/telephony/IPhoneStateListener$Stub;->getTransactionName(I)Ljava/lang/String;
-HSPLcom/android/internal/telephony/IPhoneStateListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;->getGroupIdLevel1ForSubscriber(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;->getIccSerialNumberForSubscriber(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;->getLine1NumberForSubscriber(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;->getSubscriberIdForSubscriber(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IPhoneSubInfo;
-HSPLcom/android/internal/telephony/ISms$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getActiveDataSubscriptionId()I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getActiveSubIdList(Z)[I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getActiveSubInfoCountMax()I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getActiveSubscriptionInfo(ILjava/lang/String;Ljava/lang/String;)Landroid/telephony/SubscriptionInfo;
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getActiveSubscriptionInfoForSimSlotIndex(ILjava/lang/String;Ljava/lang/String;)Landroid/telephony/SubscriptionInfo;
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getAvailableSubscriptionInfoList(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getDefaultDataSubId()I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getDefaultSmsSubId()I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getDefaultSubId()I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getDefaultSubIdAsUser(I)I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getDefaultVoiceSubId()I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getPhoneId(I)I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getSlotIndex(I)I
-HSPLcom/android/internal/telephony/ISub$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ISub;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->checkCarrierPrivilegesForPackageAnyPhone(Ljava/lang/String;)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getActivePhoneTypeForSlot(I)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getCardIdForDefaultEuicc(ILjava/lang/String;)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getCarrierPrivilegeStatus(I)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getDataNetworkTypeForSubscriber(ILjava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getDeviceIdWithFeature(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getImeiForSlot(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getLine1NumberForDisplay(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getMeidForSlot(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getNetworkCountryIsoForPhone(I)Ljava/lang/String;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getNetworkTypeForSubscriber(ILjava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getSignalStrength(I)Landroid/telephony/SignalStrength;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getSimStateForSlotIndex(I)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getSubscriptionCarrierId(I)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getSubscriptionSpecificCarrierId(I)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getVoiceNetworkTypeForSubscriber(ILjava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->isDataEnabledForReason(II)Z
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->isEmergencyNumber(Ljava/lang/String;Z)Z
-HSPLcom/android/internal/telephony/ITelephony$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephony;
-HSPLcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;->addOnSubscriptionsChangedListener(Ljava/lang/String;Ljava/lang/String;Lcom/android/internal/telephony/IOnSubscriptionsChangedListener;)V
-HSPLcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;->listenWithEventList(ZZILjava/lang/String;Ljava/lang/String;Lcom/android/internal/telephony/IPhoneStateListener;[IZ)V
-HSPLcom/android/internal/telephony/ITelephonyRegistry$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephonyRegistry;
-HSPLcom/android/internal/telephony/SmsApplication$SmsApplicationData;->-$$Nest$fgetmSmsReceiverClass(Lcom/android/internal/telephony/SmsApplication$SmsApplicationData;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/SmsApplication$SmsApplicationData;-><init>(Ljava/lang/String;I)V
-HSPLcom/android/internal/telephony/SmsApplication$SmsApplicationData;->isComplete()Z
-HSPLcom/android/internal/telephony/SmsApplication;->getApplication(Landroid/content/Context;ZI)Lcom/android/internal/telephony/SmsApplication$SmsApplicationData;
-HSPLcom/android/internal/telephony/SmsApplication;->getApplicationCollectionInternal(Landroid/content/Context;I)Ljava/util/Collection;
-HSPLcom/android/internal/telephony/SmsApplication;->getApplicationForPackage(Ljava/util/Collection;Ljava/lang/String;)Lcom/android/internal/telephony/SmsApplication$SmsApplicationData;
-HSPLcom/android/internal/telephony/SmsApplication;->getDefaultSmsApplication(Landroid/content/Context;Z)Landroid/content/ComponentName;
-HSPLcom/android/internal/telephony/SmsApplication;->getDefaultSmsApplicationAsUser(Landroid/content/Context;ZLandroid/os/UserHandle;)Landroid/content/ComponentName;
-HSPLcom/android/internal/telephony/SmsApplication;->getDefaultSmsPackage(Landroid/content/Context;I)Ljava/lang/String;
-HSPLcom/android/internal/telephony/SmsApplication;->tryFixExclusiveSmsAppops(Landroid/content/Context;Lcom/android/internal/telephony/SmsApplication$SmsApplicationData;Z)Z
-HSPLcom/android/internal/telephony/TelephonyPermissions;->checkCallingOrSelfReadDeviceIdentifiers(Landroid/content/Context;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
-HSPLcom/android/internal/telephony/TelephonyPermissions;->checkCallingOrSelfReadPhoneState(Landroid/content/Context;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
-HSPLcom/android/internal/telephony/TelephonyPermissions;->checkCallingOrSelfUseIccAuthWithDeviceIdentifier(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
-HSPLcom/android/internal/telephony/TelephonyPermissions;->checkCarrierPrivilegeForSubId(Landroid/content/Context;I)Z
-HSPLcom/android/internal/telephony/TelephonyPermissions;->checkReadPhoneState(Landroid/content/Context;IIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
-HSPLcom/android/internal/telephony/TelephonyPermissions;->getCarrierPrivilegeStatus(Landroid/content/Context;II)I
-HSPLcom/android/internal/telephony/TelephonyPermissions;->reportAccessDeniedToReadIdentifiers(Landroid/content/Context;IIILjava/lang/String;Ljava/lang/String;)Z
-HSPLcom/android/internal/telephony/uicc/IccUtils;->bytesToHexString([B)Ljava/lang/String;
-HSPLcom/android/internal/telephony/util/HandlerExecutor;-><init>(Landroid/os/Handler;)V
-HSPLcom/android/internal/telephony/util/HandlerExecutor;->execute(Ljava/lang/Runnable;)V
-HSPLcom/android/internal/textservice/ISpellCheckerSession$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/textservice/ISpellCheckerSession$Stub$Proxy;->onClose()V
-HSPLcom/android/internal/textservice/ISpellCheckerSession$Stub$Proxy;->onGetSentenceSuggestionsMultiple([Landroid/view/textservice/TextInfo;I)V
-HSPLcom/android/internal/textservice/ISpellCheckerSessionListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/textservice/ISpellCheckerSessionListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/internal/textservice/ITextServicesManager$Stub$Proxy;->finishSpellCheckerService(ILcom/android/internal/textservice/ISpellCheckerSessionListener;)V
-HSPLcom/android/internal/textservice/ITextServicesManager$Stub$Proxy;->getCurrentSpellChecker(ILjava/lang/String;)Landroid/view/textservice/SpellCheckerInfo;
-HSPLcom/android/internal/textservice/ITextServicesManager$Stub$Proxy;->getCurrentSpellCheckerSubtype(IZ)Landroid/view/textservice/SpellCheckerSubtype;
-HSPLcom/android/internal/textservice/ITextServicesManager$Stub$Proxy;->getSpellCheckerService(ILjava/lang/String;Ljava/lang/String;Lcom/android/internal/textservice/ITextServicesSessionListener;Lcom/android/internal/textservice/ISpellCheckerSessionListener;Landroid/os/Bundle;I)V
-HSPLcom/android/internal/textservice/ITextServicesManager$Stub$Proxy;->isSpellCheckerEnabled(I)Z
-HSPLcom/android/internal/textservice/ITextServicesSessionListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/textservice/ITextServicesSessionListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/internal/transition/EpicenterTranslateClipReveal;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLcom/android/internal/util/AnnotationValidations;->validate(Ljava/lang/Class;Landroid/annotation/IntRange;ILjava/lang/String;J)V
-HSPLcom/android/internal/util/AnnotationValidations;->validate(Ljava/lang/Class;Landroid/annotation/IntRange;ILjava/lang/String;JLjava/lang/String;J)V
-HSPLcom/android/internal/util/AnnotationValidations;->validate(Ljava/lang/Class;Landroid/annotation/IntRange;JLjava/lang/String;J)V
-HSPLcom/android/internal/util/AnnotationValidations;->validate(Ljava/lang/Class;Landroid/annotation/NonNull;Ljava/lang/Object;)V
-HSPLcom/android/internal/util/AnnotationValidations;->validate(Ljava/lang/Class;Ljava/lang/annotation/Annotation;I)V
-HSPLcom/android/internal/util/AnnotationValidations;->validate(Ljava/lang/Class;Ljava/lang/annotation/Annotation;J)V
-HSPLcom/android/internal/util/AnnotationValidations;->validate(Ljava/lang/Class;Ljava/lang/annotation/Annotation;Ljava/lang/Object;)V
-HSPLcom/android/internal/util/AnnotationValidations;->validate(Ljava/lang/Class;Ljava/lang/annotation/Annotation;Ljava/lang/Object;[Ljava/lang/Object;)V
-HSPLcom/android/internal/util/ArrayUtils;->appendElement(Ljava/lang/Class;[Ljava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLcom/android/internal/util/ArrayUtils;->appendElement(Ljava/lang/Class;[Ljava/lang/Object;Ljava/lang/Object;Z)[Ljava/lang/Object;
-HSPLcom/android/internal/util/ArrayUtils;->appendInt([IIZ)[I
-HSPLcom/android/internal/util/ArrayUtils;->checkBounds(II)V
-HSPLcom/android/internal/util/ArrayUtils;->cloneOrNull([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLcom/android/internal/util/ArrayUtils;->contains(Ljava/util/Collection;Ljava/lang/Object;)Z
-HSPLcom/android/internal/util/ArrayUtils;->contains([II)Z
-HSPLcom/android/internal/util/ArrayUtils;->contains([Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLcom/android/internal/util/ArrayUtils;->containsAll([Ljava/lang/Object;[Ljava/lang/Object;)Z
-HSPLcom/android/internal/util/ArrayUtils;->containsAny([Ljava/lang/Object;[Ljava/lang/Object;)Z
-HSPLcom/android/internal/util/ArrayUtils;->convertToIntArray(Ljava/util/List;)[I
-HSPLcom/android/internal/util/ArrayUtils;->deepToString(Ljava/lang/Object;)Ljava/lang/String;
-HSPLcom/android/internal/util/ArrayUtils;->defeatNullable([Ljava/io/File;)[Ljava/io/File;
-HSPLcom/android/internal/util/ArrayUtils;->defeatNullable([Ljava/lang/String;)[Ljava/lang/String;
-HSPLcom/android/internal/util/ArrayUtils;->emptyArray(Ljava/lang/Class;)[Ljava/lang/Object;+]Ljava/lang/Object;Ljava/lang/Class;]Ljava/lang/Class;Ljava/lang/Class;
-HSPLcom/android/internal/util/ArrayUtils;->emptyIfNull([Ljava/lang/Object;Ljava/lang/Class;)[Ljava/lang/Object;
-HSPLcom/android/internal/util/ArrayUtils;->filter([Ljava/lang/Object;Ljava/util/function/IntFunction;Ljava/util/function/Predicate;)[Ljava/lang/Object;
-HSPLcom/android/internal/util/ArrayUtils;->getOrNull([Ljava/lang/Object;I)Ljava/lang/Object;
-HSPLcom/android/internal/util/ArrayUtils;->indexOf([Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLcom/android/internal/util/ArrayUtils;->isEmpty(Ljava/util/Collection;)Z
-HSPLcom/android/internal/util/ArrayUtils;->isEmpty([I)Z
-HSPLcom/android/internal/util/ArrayUtils;->isEmpty([Ljava/lang/Object;)Z
-HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedArray(Ljava/lang/Class;I)[Ljava/lang/Object;+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;
-HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedBooleanArray(I)[Z
-HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedByteArray(I)[B
-HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedCharArray(I)[C+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;
-HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedFloatArray(I)[F
-HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedIntArray(I)[I+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;
-HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedLongArray(I)[J
-HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedObjectArray(I)[Ljava/lang/Object;+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;
-HSPLcom/android/internal/util/ArrayUtils;->remove(Ljava/util/ArrayList;Ljava/lang/Object;)Ljava/util/ArrayList;
-HSPLcom/android/internal/util/ArrayUtils;->removeElement(Ljava/lang/Class;[Ljava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLcom/android/internal/util/ArrayUtils;->size([Ljava/lang/Object;)I
-HSPLcom/android/internal/util/ArrayUtils;->throwsIfOutOfBounds(III)V
-HSPLcom/android/internal/util/ArrayUtils;->unstableRemoveIf(Ljava/util/ArrayList;Ljava/util/function/Predicate;)I
-HSPLcom/android/internal/util/AsyncChannel;-><init>()V
-HSPLcom/android/internal/util/AsyncChannel;->connected(Landroid/content/Context;Landroid/os/Handler;Landroid/os/Messenger;)V
-HSPLcom/android/internal/util/AsyncChannel;->sendMessage(Landroid/os/Message;)V
-HSPLcom/android/internal/util/BitUtils;->packBits([I)J
-HSPLcom/android/internal/util/BitUtils;->unpackBits(J)[I
-HSPLcom/android/internal/util/CollectionUtils;->add(Ljava/util/List;Ljava/lang/Object;)Ljava/util/List;
-HSPLcom/android/internal/util/CollectionUtils;->emptyIfNull(Ljava/util/Set;)Ljava/util/Set;
-HSPLcom/android/internal/util/CollectionUtils;->firstOrNull(Ljava/util/List;)Ljava/lang/Object;
-HSPLcom/android/internal/util/CollectionUtils;->isEmpty(Ljava/util/Collection;)Z
-HSPLcom/android/internal/util/CollectionUtils;->size(Ljava/util/Collection;)I
-HSPLcom/android/internal/util/CollectionUtils;->size(Ljava/util/Map;)I
-HSPLcom/android/internal/util/ConcurrentUtils$DirectExecutor;->execute(Ljava/lang/Runnable;)V
-HSPLcom/android/internal/util/ExponentiallyBucketedHistogram;-><init>(I)V
-HSPLcom/android/internal/util/ExponentiallyBucketedHistogram;->add(I)V
-HSPLcom/android/internal/util/ExponentiallyBucketedHistogram;->log(Ljava/lang/String;Ljava/lang/CharSequence;)V
-HSPLcom/android/internal/util/FastMath;->round(F)I
-HSPLcom/android/internal/util/FastPrintWriter$DummyWriter;-><init>()V
-HSPLcom/android/internal/util/FastPrintWriter$DummyWriter;-><init>(Lcom/android/internal/util/FastPrintWriter$DummyWriter-IA;)V
-HSPLcom/android/internal/util/FastPrintWriter;-><init>(Ljava/io/OutputStream;)V
-HSPLcom/android/internal/util/FastPrintWriter;-><init>(Ljava/io/OutputStream;ZI)V
-HSPLcom/android/internal/util/FastPrintWriter;-><init>(Ljava/io/Writer;ZI)V
-HSPLcom/android/internal/util/FastPrintWriter;->appendLocked(C)V
-HSPLcom/android/internal/util/FastPrintWriter;->appendLocked(Ljava/lang/String;II)V
-HSPLcom/android/internal/util/FastPrintWriter;->appendLocked([CII)V
-HSPLcom/android/internal/util/FastPrintWriter;->close()V
-HSPLcom/android/internal/util/FastPrintWriter;->flush()V
-HSPLcom/android/internal/util/FastPrintWriter;->flushBytesLocked()V
-HSPLcom/android/internal/util/FastPrintWriter;->flushLocked()V
-HSPLcom/android/internal/util/FastPrintWriter;->initDefaultEncoder()V
-HSPLcom/android/internal/util/FastPrintWriter;->print(C)V
-HSPLcom/android/internal/util/FastPrintWriter;->print(I)V
-HSPLcom/android/internal/util/FastPrintWriter;->print(J)V
-HSPLcom/android/internal/util/FastPrintWriter;->print(Ljava/lang/String;)V
-HSPLcom/android/internal/util/FastPrintWriter;->println()V
-HSPLcom/android/internal/util/FastPrintWriter;->write(I)V
-HSPLcom/android/internal/util/FastPrintWriter;->write(Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String;
-HSPLcom/android/internal/util/FastPrintWriter;->write([CII)V
-HSPLcom/android/internal/util/FastXmlSerializer;-><init>()V
-HSPLcom/android/internal/util/FastXmlSerializer;-><init>(I)V
-HSPLcom/android/internal/util/FastXmlSerializer;->append(C)V
-HSPLcom/android/internal/util/FastXmlSerializer;->append(Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String;
-HSPLcom/android/internal/util/FastXmlSerializer;->append(Ljava/lang/String;II)V+]Ljava/lang/String;Ljava/lang/String;]Lcom/android/internal/util/FastXmlSerializer;Lcom/android/internal/util/FastXmlSerializer;
-HSPLcom/android/internal/util/FastXmlSerializer;->appendIndent(I)V+]Ljava/lang/String;Ljava/lang/String;
-HSPLcom/android/internal/util/FastXmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/internal/util/FastXmlSerializer;->endDocument()V
-HSPLcom/android/internal/util/FastXmlSerializer;->endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/internal/util/FastXmlSerializer;->escapeAndAppendString(Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String;
-HSPLcom/android/internal/util/FastXmlSerializer;->flush()V
-HSPLcom/android/internal/util/FastXmlSerializer;->flushBytes()V
-HSPLcom/android/internal/util/FastXmlSerializer;->setFeature(Ljava/lang/String;Z)V
-HSPLcom/android/internal/util/FastXmlSerializer;->setOutput(Ljava/io/OutputStream;Ljava/lang/String;)V
-HSPLcom/android/internal/util/FastXmlSerializer;->startDocument(Ljava/lang/String;Ljava/lang/Boolean;)V
-HSPLcom/android/internal/util/FastXmlSerializer;->startTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/internal/util/FastXmlSerializer;->text(Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/internal/util/FrameworkStatsLog;->write(III)V
-HSPLcom/android/internal/util/FrameworkStatsLog;->write(IIII)V
-HSPLcom/android/internal/util/FrameworkStatsLog;->write(IIILjava/lang/String;I)V
-HSPLcom/android/internal/util/FrameworkStatsLog;->write(IIJII)V
-HSPLcom/android/internal/util/FrameworkStatsLog;->write(IILjava/lang/String;IZ)V
-HSPLcom/android/internal/util/FrameworkStatsLog;->write(ILjava/lang/String;I)V
-HSPLcom/android/internal/util/FrameworkStatsLog;->write(ILjava/lang/String;IIF)V
-HSPLcom/android/internal/util/GrowingArrayUtils;->append([III)[I
-HSPLcom/android/internal/util/GrowingArrayUtils;->append([JIJ)[J
-HSPLcom/android/internal/util/GrowingArrayUtils;->append([Ljava/lang/Object;ILjava/lang/Object;)[Ljava/lang/Object;+]Ljava/lang/Object;missing_types]Ljava/lang/Class;Ljava/lang/Class;
-HSPLcom/android/internal/util/GrowingArrayUtils;->append([ZIZ)[Z
-HSPLcom/android/internal/util/GrowingArrayUtils;->growSize(I)I
-HSPLcom/android/internal/util/GrowingArrayUtils;->insert([IIII)[I
-HSPLcom/android/internal/util/GrowingArrayUtils;->insert([JIIJ)[J
-HSPLcom/android/internal/util/GrowingArrayUtils;->insert([Ljava/lang/Object;IILjava/lang/Object;)[Ljava/lang/Object;+]Ljava/lang/Object;[Ljava/lang/Object;]Ljava/lang/Class;Ljava/lang/Class;
-HSPLcom/android/internal/util/GrowingArrayUtils;->insert([ZIIZ)[Z
-HSPLcom/android/internal/util/IndentingPrintWriter;->decreaseIndent()Lcom/android/internal/util/IndentingPrintWriter;
-HSPLcom/android/internal/util/IndentingPrintWriter;->increaseIndent()Lcom/android/internal/util/IndentingPrintWriter;
-HSPLcom/android/internal/util/IndentingPrintWriter;->printPair(Ljava/lang/String;Ljava/lang/Object;)Lcom/android/internal/util/IndentingPrintWriter;
-HSPLcom/android/internal/util/IntPair;->first(J)I
-HSPLcom/android/internal/util/IntPair;->of(II)J
-HSPLcom/android/internal/util/IntPair;->second(J)I
-HSPLcom/android/internal/util/LatencyTracker$$ExternalSyntheticLambda0;-><init>(Lcom/android/internal/util/LatencyTracker;I)V
-HSPLcom/android/internal/util/LatencyTracker$Session;-><init>(ILjava/lang/String;)V
-HSPLcom/android/internal/util/LatencyTracker$Session;->begin(Ljava/lang/Runnable;)V
-HSPLcom/android/internal/util/LatencyTracker$Session;->traceName()Ljava/lang/String;
-HSPLcom/android/internal/util/LatencyTracker;->-$$Nest$smgetTraceNameOfAction(ILjava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/util/LatencyTracker;-><init>()V
-HSPLcom/android/internal/util/LatencyTracker;->getInstance(Landroid/content/Context;)Lcom/android/internal/util/LatencyTracker;
-HSPLcom/android/internal/util/LatencyTracker;->getNameOfAction(I)Ljava/lang/String;
-HSPLcom/android/internal/util/LatencyTracker;->getTraceNameOfAction(ILjava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/util/LatencyTracker;->isEnabled()Z
-HSPLcom/android/internal/util/LatencyTracker;->logAction(II)V
-HSPLcom/android/internal/util/LatencyTracker;->onActionEnd(I)V
-HSPLcom/android/internal/util/LatencyTracker;->onActionStart(ILjava/lang/String;)V
-HSPLcom/android/internal/util/LatencyTracker;->updateProperties(Landroid/provider/DeviceConfig$Properties;)V
-HSPLcom/android/internal/util/LineBreakBufferedWriter;-><init>(Ljava/io/Writer;I)V
-HSPLcom/android/internal/util/LineBreakBufferedWriter;-><init>(Ljava/io/Writer;II)V
-HSPLcom/android/internal/util/LineBreakBufferedWriter;->ensureCapacity(I)V
-HSPLcom/android/internal/util/LineBreakBufferedWriter;->flush()V
-HSPLcom/android/internal/util/LineBreakBufferedWriter;->println()V
-HSPLcom/android/internal/util/LineBreakBufferedWriter;->write(Ljava/lang/String;II)V+]Ljava/lang/String;Ljava/lang/String;
-HSPLcom/android/internal/util/LineBreakBufferedWriter;->writeBuffer(I)V
-HSPLcom/android/internal/util/MemInfoReader;-><init>()V
-HSPLcom/android/internal/util/MemInfoReader;->getTotalSize()J
-HSPLcom/android/internal/util/MemInfoReader;->readMemInfo()V
-HSPLcom/android/internal/util/MessageUtils;->findMessageNames([Ljava/lang/Class;[Ljava/lang/String;)Landroid/util/SparseArray;
-HSPLcom/android/internal/util/NotificationMessagingUtil;->isImportantMessaging(Landroid/service/notification/StatusBarNotification;I)Z
-HSPLcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;-><init>()V
-HSPLcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;->parcel(Ljava/lang/Boolean;Landroid/os/Parcel;I)V
-HSPLcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;->unparcel(Landroid/os/Parcel;)Ljava/lang/Boolean;
-HSPLcom/android/internal/util/Parcelling$BuiltIn$ForInternedString;-><init>()V
-HSPLcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringArray;-><init>()V
-HSPLcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringList;-><init>()V
-HSPLcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringValueMap;-><init>()V
-HSPLcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;-><init>()V
-HSPLcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;->parcel(Ljava/util/Set;Landroid/os/Parcel;I)V
-HSPLcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;->unparcel(Landroid/os/Parcel;)Ljava/util/Set;
-HSPLcom/android/internal/util/Parcelling$Cache;->get(Ljava/lang/Class;)Lcom/android/internal/util/Parcelling;
-HSPLcom/android/internal/util/Parcelling$Cache;->getOrCreate(Ljava/lang/Class;)Lcom/android/internal/util/Parcelling;
-HSPLcom/android/internal/util/Parcelling$Cache;->put(Lcom/android/internal/util/Parcelling;)Lcom/android/internal/util/Parcelling;
-HSPLcom/android/internal/util/Preconditions;->checkArgument(Z)V
-HSPLcom/android/internal/util/Preconditions;->checkArgument(ZLjava/lang/Object;)V
-HSPLcom/android/internal/util/Preconditions;->checkArgument(ZLjava/lang/String;[Ljava/lang/Object;)V
-HSPLcom/android/internal/util/Preconditions;->checkArgumentInRange(FFFLjava/lang/String;)F
-HSPLcom/android/internal/util/Preconditions;->checkArgumentInRange(IIILjava/lang/String;)I
-HSPLcom/android/internal/util/Preconditions;->checkArgumentInRange(JJJLjava/lang/String;)J
-HSPLcom/android/internal/util/Preconditions;->checkArgumentNonnegative(I)I
-HSPLcom/android/internal/util/Preconditions;->checkArgumentNonnegative(ILjava/lang/String;)I
-HSPLcom/android/internal/util/Preconditions;->checkArgumentNonnegative(J)J
-HSPLcom/android/internal/util/Preconditions;->checkArgumentNonnegative(JLjava/lang/String;)J
-HSPLcom/android/internal/util/Preconditions;->checkArgumentPositive(ILjava/lang/String;)I
-HSPLcom/android/internal/util/Preconditions;->checkArrayElementsNotNull([Ljava/lang/Object;Ljava/lang/String;)[Ljava/lang/Object;
-HSPLcom/android/internal/util/Preconditions;->checkCollectionElementsNotNull(Ljava/util/Collection;Ljava/lang/String;)Ljava/util/Collection;
-HSPLcom/android/internal/util/Preconditions;->checkFlagsArgument(II)I
-HSPLcom/android/internal/util/Preconditions;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/internal/util/Preconditions;->checkNotNull(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/internal/util/Preconditions;->checkState(Z)V
-HSPLcom/android/internal/util/Preconditions;->checkState(ZLjava/lang/String;)V
-HSPLcom/android/internal/util/Preconditions;->checkStringNotEmpty(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLcom/android/internal/util/Preconditions;->checkStringNotEmpty(Ljava/lang/CharSequence;Ljava/lang/Object;)Ljava/lang/CharSequence;
-HSPLcom/android/internal/util/ProcFileReader;->finishLine()V
-HSPLcom/android/internal/util/ScreenshotHelper;-><init>(Landroid/content/Context;)V
-HSPLcom/android/internal/util/StatLogger;->getTime()J
-HSPLcom/android/internal/util/StatLogger;->logDurationStat(IJ)J
-HSPLcom/android/internal/util/State;-><init>()V
-HSPLcom/android/internal/util/State;->enter()V
-HSPLcom/android/internal/util/StateMachine$LogRecords;->add(Lcom/android/internal/util/StateMachine;Landroid/os/Message;Ljava/lang/String;Lcom/android/internal/util/IState;Lcom/android/internal/util/IState;Lcom/android/internal/util/IState;)V
-HSPLcom/android/internal/util/StateMachine$LogRecords;->logOnlyTransitions()Z
-HSPLcom/android/internal/util/StateMachine$SmHandler;-><init>(Landroid/os/Looper;Lcom/android/internal/util/StateMachine;)V
-HSPLcom/android/internal/util/StateMachine$SmHandler;->addState(Lcom/android/internal/util/State;Lcom/android/internal/util/State;)Lcom/android/internal/util/StateMachine$SmHandler$StateInfo;
-HSPLcom/android/internal/util/StateMachine$SmHandler;->completeConstruction()V
-HSPLcom/android/internal/util/StateMachine$SmHandler;->handleMessage(Landroid/os/Message;)V
-HSPLcom/android/internal/util/StateMachine$SmHandler;->invokeEnterMethods(I)V
-HSPLcom/android/internal/util/StateMachine$SmHandler;->moveTempStateStackToStateStack()I
-HSPLcom/android/internal/util/StateMachine$SmHandler;->performTransitions(Lcom/android/internal/util/State;Landroid/os/Message;)V
-HSPLcom/android/internal/util/StateMachine$SmHandler;->processMsg(Landroid/os/Message;)Lcom/android/internal/util/State;
-HSPLcom/android/internal/util/StateMachine$SmHandler;->setInitialState(Lcom/android/internal/util/State;)V
-HSPLcom/android/internal/util/StateMachine$SmHandler;->setupInitialStateStack()V
-HSPLcom/android/internal/util/StateMachine;->addState(Lcom/android/internal/util/State;)V
-HSPLcom/android/internal/util/StateMachine;->getLogRecString(Landroid/os/Message;)Ljava/lang/String;
-HSPLcom/android/internal/util/StateMachine;->initStateMachine(Ljava/lang/String;Landroid/os/Looper;)V
-HSPLcom/android/internal/util/StateMachine;->recordLogRec(Landroid/os/Message;)Z
-HSPLcom/android/internal/util/StateMachine;->setInitialState(Lcom/android/internal/util/State;)V
-HSPLcom/android/internal/util/StateMachine;->start()V
-HSPLcom/android/internal/util/StringPool;-><init>()V
-HSPLcom/android/internal/util/StringPool;->get([CII)Ljava/lang/String;
-HSPLcom/android/internal/util/SyncResultReceiver;-><init>(I)V
-HSPLcom/android/internal/util/SyncResultReceiver;->getIntResult()I
-HSPLcom/android/internal/util/SyncResultReceiver;->getParcelableResult()Landroid/os/Parcelable;
-HSPLcom/android/internal/util/SyncResultReceiver;->send(ILandroid/os/Bundle;)V
-HSPLcom/android/internal/util/SyncResultReceiver;->waitResult()V
-HSPLcom/android/internal/util/TraceBuffer$ProtoOutputStreamProvider;-><init>()V
-HSPLcom/android/internal/util/TraceBuffer;-><init>(ILcom/android/internal/util/TraceBuffer$ProtoProvider;Ljava/util/function/Consumer;)V
-HSPLcom/android/internal/util/TraceBuffer;->resetBuffer()V
-HSPLcom/android/internal/util/VirtualRefBasePtr;-><init>(J)V
-HSPLcom/android/internal/util/VirtualRefBasePtr;->finalize()V
-HSPLcom/android/internal/util/VirtualRefBasePtr;->get()J
-HSPLcom/android/internal/util/VirtualRefBasePtr;->release()V
-HSPLcom/android/internal/util/XmlPullParserWrapper;-><init>(Lorg/xmlpull/v1/XmlPullParser;)V
-HSPLcom/android/internal/util/XmlPullParserWrapper;->getAttributeCount()I
-HSPLcom/android/internal/util/XmlPullParserWrapper;->getAttributeName(I)Ljava/lang/String;
-HSPLcom/android/internal/util/XmlPullParserWrapper;->getAttributeValue(I)Ljava/lang/String;
-HSPLcom/android/internal/util/XmlPullParserWrapper;->getAttributeValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/util/XmlPullParserWrapper;->getEventType()I
-HSPLcom/android/internal/util/XmlPullParserWrapper;->getName()Ljava/lang/String;
-HSPLcom/android/internal/util/XmlPullParserWrapper;->getText()Ljava/lang/String;
-HSPLcom/android/internal/util/XmlPullParserWrapper;->next()I
-HSPLcom/android/internal/util/XmlPullParserWrapper;->setInput(Ljava/io/InputStream;Ljava/lang/String;)V
-HSPLcom/android/internal/util/XmlSerializerWrapper;-><init>(Lorg/xmlpull/v1/XmlSerializer;)V
-HSPLcom/android/internal/util/XmlSerializerWrapper;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/internal/util/XmlSerializerWrapper;->endDocument()V
-HSPLcom/android/internal/util/XmlSerializerWrapper;->endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/internal/util/XmlSerializerWrapper;->setFeature(Ljava/lang/String;Z)V
-HSPLcom/android/internal/util/XmlSerializerWrapper;->setOutput(Ljava/io/OutputStream;Ljava/lang/String;)V
-HSPLcom/android/internal/util/XmlSerializerWrapper;->startDocument(Ljava/lang/String;Ljava/lang/Boolean;)V
-HSPLcom/android/internal/util/XmlSerializerWrapper;->startTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/internal/util/XmlSerializerWrapper;->text(Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;-><init>(Lorg/xmlpull/v1/XmlPullParser;)V
-HSPLcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;->getAttributeBoolean(I)Z
-HSPLcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;->getAttributeFloat(I)F
-HSPLcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;->getAttributeInt(I)I
-HSPLcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;->getAttributeLong(I)J
-HSPLcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;-><init>(Lorg/xmlpull/v1/XmlSerializer;)V
-HSPLcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;->attributeBoolean(Ljava/lang/String;Ljava/lang/String;Z)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;->attributeFloat(Ljava/lang/String;Ljava/lang/String;F)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;->attributeInt(Ljava/lang/String;Ljava/lang/String;I)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;->attributeLong(Ljava/lang/String;Ljava/lang/String;J)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/internal/util/XmlUtils;->beginDocument(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)V
-HSPLcom/android/internal/util/XmlUtils;->makeTyped(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/modules/utils/TypedXmlPullParser;
-HSPLcom/android/internal/util/XmlUtils;->makeTyped(Lorg/xmlpull/v1/XmlSerializer;)Lcom/android/modules/utils/TypedXmlSerializer;
-HSPLcom/android/internal/util/XmlUtils;->nextElement(Lorg/xmlpull/v1/XmlPullParser;)V
-HSPLcom/android/internal/util/XmlUtils;->nextElementWithin(Lorg/xmlpull/v1/XmlPullParser;I)Z
-HSPLcom/android/internal/util/XmlUtils;->readBooleanAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Z)Z
-HSPLcom/android/internal/util/XmlUtils;->readIntAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)I
-HSPLcom/android/internal/util/XmlUtils;->readLongAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)J
-HSPLcom/android/internal/util/XmlUtils;->readLongAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;J)J
-HSPLcom/android/internal/util/XmlUtils;->readMapXml(Ljava/io/InputStream;)Ljava/util/HashMap;
-HSPLcom/android/internal/util/XmlUtils;->readStringAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/util/XmlUtils;->readThisMapXml(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;[Ljava/lang/String;Lcom/android/internal/util/XmlUtils$ReadMapCallback;)Ljava/util/HashMap;+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;
-HSPLcom/android/internal/util/XmlUtils;->readThisPrimitiveValueXml(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;)Ljava/lang/Object;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;
-HSPLcom/android/internal/util/XmlUtils;->readThisSetXml(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;[Ljava/lang/String;Lcom/android/internal/util/XmlUtils$ReadMapCallback;Z)Ljava/util/HashSet;
-HSPLcom/android/internal/util/XmlUtils;->readThisValueXml(Lcom/android/modules/utils/TypedXmlPullParser;[Ljava/lang/String;Lcom/android/internal/util/XmlUtils$ReadMapCallback;Z)Ljava/lang/Object;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/internal/util/XmlUtils$ReadMapCallback;Landroid/os/PersistableBundle$MyReadMapCallback;
-HSPLcom/android/internal/util/XmlUtils;->readValueXml(Lcom/android/modules/utils/TypedXmlPullParser;[Ljava/lang/String;)Ljava/lang/Object;
-HSPLcom/android/internal/util/XmlUtils;->skipCurrentTag(Lorg/xmlpull/v1/XmlPullParser;)V
-HSPLcom/android/internal/util/XmlUtils;->writeMapXml(Ljava/util/Map;Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$WriteMapCallback;)V
-HSPLcom/android/internal/util/XmlUtils;->writeMapXml(Ljava/util/Map;Ljava/io/OutputStream;)V
-HSPLcom/android/internal/util/XmlUtils;->writeMapXml(Ljava/util/Map;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlSerializer;)V
-HSPLcom/android/internal/util/XmlUtils;->writeMapXml(Ljava/util/Map;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$WriteMapCallback;)V
-HSPLcom/android/internal/util/XmlUtils;->writeSetXml(Ljava/util/Set;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlSerializer;)V
-HSPLcom/android/internal/util/XmlUtils;->writeValueXml(Ljava/lang/Object;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlSerializer;)V
-HSPLcom/android/internal/util/XmlUtils;->writeValueXml(Ljava/lang/Object;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$WriteMapCallback;)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/lang/Float;Ljava/lang/Float;
-HSPLcom/android/internal/util/function/pooled/OmniFunction;->run()V
-HSPLcom/android/internal/util/function/pooled/PooledLambda;->obtainMessage(Lcom/android/internal/util/function/HexConsumer;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Landroid/os/Message;
-HSPLcom/android/internal/util/function/pooled/PooledLambda;->obtainMessage(Lcom/android/internal/util/function/QuadConsumer;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Landroid/os/Message;
-HSPLcom/android/internal/util/function/pooled/PooledLambda;->obtainMessage(Lcom/android/internal/util/function/QuintConsumer;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Landroid/os/Message;
-HSPLcom/android/internal/util/function/pooled/PooledLambda;->obtainMessage(Lcom/android/internal/util/function/TriConsumer;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Landroid/os/Message;
-HSPLcom/android/internal/util/function/pooled/PooledLambda;->obtainMessage(Ljava/util/function/BiConsumer;Ljava/lang/Object;Ljava/lang/Object;)Landroid/os/Message;
-HSPLcom/android/internal/util/function/pooled/PooledLambda;->obtainMessage(Ljava/util/function/Consumer;Ljava/lang/Object;)Landroid/os/Message;
-HSPLcom/android/internal/util/function/pooled/PooledLambda;->obtainRunnable(Lcom/android/internal/util/function/TriConsumer;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/android/internal/util/function/pooled/PooledRunnable;
-HSPLcom/android/internal/util/function/pooled/PooledLambda;->obtainRunnable(Ljava/util/function/BiConsumer;Ljava/lang/Object;Ljava/lang/Object;)Lcom/android/internal/util/function/pooled/PooledRunnable;
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl$LambdaType;->decodeArgCount(I)I
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl$LambdaType;->decodeReturnType(I)I
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl$LambdaType;->encode(II)I
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->-$$Nest$smunmask(II)I
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->acquire(Lcom/android/internal/util/function/pooled/PooledLambdaImpl$Pool;)Lcom/android/internal/util/function/pooled/PooledLambdaImpl;
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->acquire(Lcom/android/internal/util/function/pooled/PooledLambdaImpl$Pool;Ljava/lang/Object;IIILjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/android/internal/util/function/pooled/PooledLambda;
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->checkNotRecycled()V
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->doInvoke()Ljava/lang/Object;
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->doRecycle()V
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->fillInArg(Ljava/lang/Object;)Z
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->getFlags(I)I
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->isInvocationArgAtIndex(I)Z
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->isRecycleOnUse()Z
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->isRecycled()Z
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->mask(II)I
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->popArg(I)Ljava/lang/Object;
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->recycleOnUse()Lcom/android/internal/util/function/pooled/OmniFunction;
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->recycleOnUse()Lcom/android/internal/util/function/pooled/PooledRunnable;
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->setFlags(II)V
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->setIfInBounds([Ljava/lang/Object;ILjava/lang/Object;)V
-HSPLcom/android/internal/util/function/pooled/PooledLambdaImpl;->unmask(II)I
-HSPLcom/android/internal/view/AppearanceRegion;->equals(Ljava/lang/Object;)Z
-HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->addClient(Lcom/android/internal/inputmethod/IInputMethodClient;Lcom/android/internal/inputmethod/IRemoteInputConnection;I)V
-HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->getEnabledInputMethodList(I)Ljava/util/List;
-HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->getImeTrackerService()Lcom/android/internal/inputmethod/IImeTracker;
-HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->isImeTraceEnabled()Z
-HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->removeImeSurfaceFromWindowAsync(Landroid/os/IBinder;)V
-HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->reportPerceptibleAsync(Landroid/os/IBinder;Z)V
-HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->startInputOrWindowGainedFocus(ILcom/android/internal/inputmethod/IInputMethodClient;Landroid/os/IBinder;IIILandroid/view/inputmethod/EditorInfo;Lcom/android/internal/inputmethod/IRemoteInputConnection;Lcom/android/internal/inputmethod/IRemoteAccessibilityInputConnection;IILandroid/window/ImeOnBackInvokedDispatcher;)Lcom/android/internal/inputmethod/InputBindResult;
-HSPLcom/android/internal/view/IInputMethodManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/view/IInputMethodManager;
-HSPLcom/android/internal/view/RotationPolicy;->isRotationLockToggleVisible(Landroid/content/Context;)Z
-HSPLcom/android/internal/view/RotationPolicy;->isRotationSupported(Landroid/content/Context;)Z
-HSPLcom/android/internal/view/SurfaceCallbackHelper$1;-><init>(Lcom/android/internal/view/SurfaceCallbackHelper;)V
-HSPLcom/android/internal/view/SurfaceCallbackHelper$1;->run()V
-HSPLcom/android/internal/view/SurfaceCallbackHelper;-><init>(Ljava/lang/Runnable;)V
-HSPLcom/android/internal/view/SurfaceCallbackHelper;->dispatchSurfaceRedrawNeededAsync(Landroid/view/SurfaceHolder;[Landroid/view/SurfaceHolder$Callback;)V
-HSPLcom/android/internal/view/menu/MenuBuilder;-><init>(Landroid/content/Context;)V
-HSPLcom/android/internal/view/menu/MenuBuilder;->add(IIILjava/lang/CharSequence;)Landroid/view/MenuItem;
-HSPLcom/android/internal/view/menu/MenuBuilder;->addInternal(IIILjava/lang/CharSequence;)Landroid/view/MenuItem;
-HSPLcom/android/internal/view/menu/MenuBuilder;->close(Z)V
-HSPLcom/android/internal/view/menu/MenuBuilder;->dispatchPresenterUpdate(Z)V
-HSPLcom/android/internal/view/menu/MenuBuilder;->findItem(I)Landroid/view/MenuItem;
-HSPLcom/android/internal/view/menu/MenuBuilder;->getVisibleItems()Ljava/util/ArrayList;
-HSPLcom/android/internal/view/menu/MenuBuilder;->hasVisibleItems()Z
-HSPLcom/android/internal/view/menu/MenuBuilder;->onItemActionRequestChanged(Lcom/android/internal/view/menu/MenuItemImpl;)V
-HSPLcom/android/internal/view/menu/MenuBuilder;->onItemsChanged(Z)V
-HSPLcom/android/internal/view/menu/MenuBuilder;->setCallback(Lcom/android/internal/view/menu/MenuBuilder$Callback;)V
-HSPLcom/android/internal/view/menu/MenuBuilder;->size()I
-HSPLcom/android/internal/view/menu/MenuItemImpl;-><init>(Lcom/android/internal/view/menu/MenuBuilder;IIIILjava/lang/CharSequence;I)V
-HSPLcom/android/internal/view/menu/MenuItemImpl;->getContentDescription()Ljava/lang/CharSequence;
-HSPLcom/android/internal/view/menu/MenuItemImpl;->getIcon()Landroid/graphics/drawable/Drawable;
-HSPLcom/android/internal/view/menu/MenuItemImpl;->getItemId()I
-HSPLcom/android/internal/view/menu/MenuItemImpl;->getTitle()Ljava/lang/CharSequence;
-HSPLcom/android/internal/view/menu/MenuItemImpl;->hasSubMenu()Z
-HSPLcom/android/internal/view/menu/MenuItemImpl;->isEnabled()Z
-HSPLcom/android/internal/view/menu/MenuItemImpl;->isVisible()Z
-HSPLcom/android/internal/view/menu/MenuItemImpl;->requiresActionButton()Z
-HSPLcom/android/internal/view/menu/MenuItemImpl;->setCheckable(Z)Landroid/view/MenuItem;
-HSPLcom/android/internal/view/menu/MenuItemImpl;->setChecked(Z)Landroid/view/MenuItem;
-HSPLcom/android/internal/view/menu/MenuItemImpl;->setShowAsAction(I)V
-HSPLcom/android/internal/view/menu/MenuItemImpl;->setVisible(Z)Landroid/view/MenuItem;
-HSPLcom/android/internal/widget/AlertDialogLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLcom/android/internal/widget/AlertDialogLayout;->forceUniformWidth(II)V
-HSPLcom/android/internal/widget/AlertDialogLayout;->onLayout(ZIIII)V
-HSPLcom/android/internal/widget/AlertDialogLayout;->onMeasure(II)V
-HSPLcom/android/internal/widget/AlertDialogLayout;->setChildFrame(Landroid/view/View;IIII)V
-HSPLcom/android/internal/widget/AlertDialogLayout;->tryOnMeasure(II)Z
-HSPLcom/android/internal/widget/BackgroundFallback;-><init>()V
-HSPLcom/android/internal/widget/BackgroundFallback;->draw(Landroid/view/ViewGroup;Landroid/view/ViewGroup;Landroid/graphics/Canvas;Landroid/view/View;Landroid/view/View;Landroid/view/View;)V+]Lcom/android/internal/widget/BackgroundFallback;Lcom/android/internal/widget/BackgroundFallback;
-HSPLcom/android/internal/widget/BackgroundFallback;->hasFallback()Z
-HSPLcom/android/internal/widget/BackgroundFallback;->setDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLcom/android/internal/widget/ButtonBarLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLcom/android/internal/widget/DialogTitle;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->getBoolean(Ljava/lang/String;ZI)Z
-HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->getCredentialType(I)I
-HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->getString(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
-HSPLcom/android/internal/widget/ILockSettings$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/widget/ILockSettings;
-HSPLcom/android/internal/widget/LockPatternUtils$1;-><init>(Lcom/android/internal/widget/LockPatternUtils;)V
-HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker$1;->onIsNonStrongBiometricAllowedChanged(ZI)V
-HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker$1;->onStrongAuthRequiredChanged(II)V
-HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker$H;->handleMessage(Landroid/os/Message;)V
-HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->getStrongAuthForUser(I)I
-HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->handleIsNonStrongBiometricAllowedChanged(ZI)V
-HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->handleStrongAuthRequiredChanged(II)V
-HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->isNonStrongBiometricAllowedAfterIdleTimeout(I)Z
-HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->onIsNonStrongBiometricAllowedChanged(I)V
-HSPLcom/android/internal/widget/LockPatternUtils;-><init>(Landroid/content/Context;)V
-HSPLcom/android/internal/widget/LockPatternUtils;-><init>(Landroid/content/Context;Lcom/android/internal/widget/ILockSettings;)V+]Landroid/content/Context;Landroid/app/ContextImpl;,Landroid/app/ReceiverRestrictedContext;
-HSPLcom/android/internal/widget/LockPatternUtils;->credentialTypeToPasswordQuality(I)I
-HSPLcom/android/internal/widget/LockPatternUtils;->getBoolean(Ljava/lang/String;ZI)Z
-HSPLcom/android/internal/widget/LockPatternUtils;->getCredentialTypeForUser(I)I
-HSPLcom/android/internal/widget/LockPatternUtils;->getDevicePolicyManager()Landroid/app/admin/DevicePolicyManager;
-HSPLcom/android/internal/widget/LockPatternUtils;->getEnabledTrustAgents(I)Ljava/util/List;
-HSPLcom/android/internal/widget/LockPatternUtils;->getKeyguardStoredPasswordQuality(I)I
-HSPLcom/android/internal/widget/LockPatternUtils;->getLockSettings()Lcom/android/internal/widget/ILockSettings;
-HSPLcom/android/internal/widget/LockPatternUtils;->getPowerButtonInstantlyLocks(I)Z
-HSPLcom/android/internal/widget/LockPatternUtils;->getString(Ljava/lang/String;I)Ljava/lang/String;
-HSPLcom/android/internal/widget/LockPatternUtils;->hasSeparateChallenge(I)Z
-HSPLcom/android/internal/widget/LockPatternUtils;->isManagedProfile(I)Z
-HSPLcom/android/internal/widget/LockPatternUtils;->isOwnerInfoEnabled(I)Z
-HSPLcom/android/internal/widget/LockPatternUtils;->isSecure(I)Z
-HSPLcom/android/internal/widget/LockPatternUtils;->isSeparateProfileChallengeEnabled(I)Z
-HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeBoolean(Ljava/lang/String;Ljava/lang/String;)Z+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;
-HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeFloat(Ljava/lang/String;Ljava/lang/String;)F
-HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeIndex(Ljava/lang/String;Ljava/lang/String;)I+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;
-HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeIndexOrThrow(Ljava/lang/String;Ljava/lang/String;)I+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;
-HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeInt(Ljava/lang/String;Ljava/lang/String;)I+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;
-HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeLong(Ljava/lang/String;Ljava/lang/String;)J+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;
-HSPLcom/android/net/module/util/LinkPropertiesUtils;->isIdenticalAddresses(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)Z
-HSPLcom/android/net/module/util/LinkPropertiesUtils;->isIdenticalDnses(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)Z
-HSPLcom/android/net/module/util/LinkPropertiesUtils;->isIdenticalHttpProxy(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)Z
-HSPLcom/android/net/module/util/LinkPropertiesUtils;->isIdenticalInterfaceName(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)Z
-HSPLcom/android/net/module/util/LinkPropertiesUtils;->isIdenticalRoutes(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)Z
-HSPLcom/android/net/module/util/MacAddressUtils;->isMacAddress([B)Z
-HSPLcom/android/net/module/util/MacAddressUtils;->longAddrFromByteAddr([B)J
-HSPLcom/android/net/module/util/NetUtils;->maskRawAddress([BI)V
-HSPLcom/android/net/module/util/NetworkCapabilitiesUtils;-><clinit>()V
-HSPLcom/android/okhttp/Address;-><init>(Ljava/lang/String;ILcom/android/okhttp/Dns;Ljavax/net/SocketFactory;Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/HostnameVerifier;Lcom/android/okhttp/CertificatePinner;Lcom/android/okhttp/Authenticator;Ljava/net/Proxy;Ljava/util/List;Ljava/util/List;Ljava/net/ProxySelector;)V
-HSPLcom/android/okhttp/Address;->equals(Ljava/lang/Object;)Z
-HSPLcom/android/okhttp/Address;->getCertificatePinner()Lcom/android/okhttp/CertificatePinner;
-HSPLcom/android/okhttp/Address;->getConnectionSpecs()Ljava/util/List;
-HSPLcom/android/okhttp/Address;->getDns()Lcom/android/okhttp/Dns;
-HSPLcom/android/okhttp/Address;->getHostnameVerifier()Ljavax/net/ssl/HostnameVerifier;
-HSPLcom/android/okhttp/Address;->getProtocols()Ljava/util/List;
-HSPLcom/android/okhttp/Address;->getProxy()Ljava/net/Proxy;
-HSPLcom/android/okhttp/Address;->getProxySelector()Ljava/net/ProxySelector;
-HSPLcom/android/okhttp/Address;->getSocketFactory()Ljavax/net/SocketFactory;
-HSPLcom/android/okhttp/Address;->getSslSocketFactory()Ljavax/net/ssl/SSLSocketFactory;
-HSPLcom/android/okhttp/Address;->getUriHost()Ljava/lang/String;
-HSPLcom/android/okhttp/Address;->getUriPort()I
-HSPLcom/android/okhttp/Address;->hashCode()I
-HSPLcom/android/okhttp/Address;->url()Lcom/android/okhttp/HttpUrl;
-HSPLcom/android/okhttp/CacheControl;-><init>(ZZIIZZZIIZZLjava/lang/String;)V
-HSPLcom/android/okhttp/CacheControl;->onlyIfCached()Z
-HSPLcom/android/okhttp/CacheControl;->parse(Lcom/android/okhttp/Headers;)Lcom/android/okhttp/CacheControl;
-HSPLcom/android/okhttp/ConfigAwareConnectionPool$1;-><init>(Lcom/android/okhttp/ConfigAwareConnectionPool;)V
-HSPLcom/android/okhttp/ConfigAwareConnectionPool$1;->onNetworkConfigurationChanged()V
-HSPLcom/android/okhttp/ConfigAwareConnectionPool;->access$002(Lcom/android/okhttp/ConfigAwareConnectionPool;Lcom/android/okhttp/ConnectionPool;)Lcom/android/okhttp/ConnectionPool;
-HSPLcom/android/okhttp/ConfigAwareConnectionPool;->get()Lcom/android/okhttp/ConnectionPool;
-HSPLcom/android/okhttp/ConfigAwareConnectionPool;->getInstance()Lcom/android/okhttp/ConfigAwareConnectionPool;
-HSPLcom/android/okhttp/ConnectionPool$1;-><init>(Lcom/android/okhttp/ConnectionPool;)V
-HSPLcom/android/okhttp/ConnectionPool$1;->run()V
-HSPLcom/android/okhttp/ConnectionPool;-><init>(IJ)V
-HSPLcom/android/okhttp/ConnectionPool;-><init>(IJLjava/util/concurrent/TimeUnit;)V
-HSPLcom/android/okhttp/ConnectionPool;->cleanup(J)J
-HSPLcom/android/okhttp/ConnectionPool;->connectionBecameIdle(Lcom/android/okhttp/internal/io/RealConnection;)Z
-HSPLcom/android/okhttp/ConnectionPool;->get(Lcom/android/okhttp/Address;Lcom/android/okhttp/internal/http/StreamAllocation;)Lcom/android/okhttp/internal/io/RealConnection;
-HSPLcom/android/okhttp/ConnectionPool;->pruneAndGetAllocationCount(Lcom/android/okhttp/internal/io/RealConnection;J)I
-HSPLcom/android/okhttp/ConnectionPool;->put(Lcom/android/okhttp/internal/io/RealConnection;)V
-HSPLcom/android/okhttp/ConnectionSpec$Builder;-><init>(Lcom/android/okhttp/ConnectionSpec;)V
-HSPLcom/android/okhttp/ConnectionSpec$Builder;->access$000(Lcom/android/okhttp/ConnectionSpec$Builder;)Z
-HSPLcom/android/okhttp/ConnectionSpec$Builder;->access$100(Lcom/android/okhttp/ConnectionSpec$Builder;)[Ljava/lang/String;
-HSPLcom/android/okhttp/ConnectionSpec$Builder;->access$200(Lcom/android/okhttp/ConnectionSpec$Builder;)[Ljava/lang/String;
-HSPLcom/android/okhttp/ConnectionSpec$Builder;->access$300(Lcom/android/okhttp/ConnectionSpec$Builder;)Z
-HSPLcom/android/okhttp/ConnectionSpec$Builder;->build()Lcom/android/okhttp/ConnectionSpec;
-HSPLcom/android/okhttp/ConnectionSpec$Builder;->cipherSuites([Ljava/lang/String;)Lcom/android/okhttp/ConnectionSpec$Builder;
-HSPLcom/android/okhttp/ConnectionSpec$Builder;->tlsVersions([Ljava/lang/String;)Lcom/android/okhttp/ConnectionSpec$Builder;
-HSPLcom/android/okhttp/ConnectionSpec;-><init>(Lcom/android/okhttp/ConnectionSpec$Builder;)V
-HSPLcom/android/okhttp/ConnectionSpec;-><init>(Lcom/android/okhttp/ConnectionSpec$Builder;Lcom/android/okhttp/ConnectionSpec$1;)V
-HSPLcom/android/okhttp/ConnectionSpec;->access$400(Lcom/android/okhttp/ConnectionSpec;)Z
-HSPLcom/android/okhttp/ConnectionSpec;->access$500(Lcom/android/okhttp/ConnectionSpec;)[Ljava/lang/String;
-HSPLcom/android/okhttp/ConnectionSpec;->access$600(Lcom/android/okhttp/ConnectionSpec;)[Ljava/lang/String;
-HSPLcom/android/okhttp/ConnectionSpec;->access$700(Lcom/android/okhttp/ConnectionSpec;)Z
-HSPLcom/android/okhttp/ConnectionSpec;->apply(Ljavax/net/ssl/SSLSocket;Z)V
-HSPLcom/android/okhttp/ConnectionSpec;->equals(Ljava/lang/Object;)Z
-HSPLcom/android/okhttp/ConnectionSpec;->hashCode()I
-HSPLcom/android/okhttp/ConnectionSpec;->isCompatible(Ljavax/net/ssl/SSLSocket;)Z
-HSPLcom/android/okhttp/ConnectionSpec;->supportedSpec(Ljavax/net/ssl/SSLSocket;Z)Lcom/android/okhttp/ConnectionSpec;
-HSPLcom/android/okhttp/ConnectionSpec;->supportsTlsExtensions()Z
-HSPLcom/android/okhttp/Dispatcher;-><init>()V
-HSPLcom/android/okhttp/Dns$1;->lookup(Ljava/lang/String;)Ljava/util/List;
-HSPLcom/android/okhttp/Handshake;-><init>(Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V
-HSPLcom/android/okhttp/Handshake;->get(Ljavax/net/ssl/SSLSession;)Lcom/android/okhttp/Handshake;
-HSPLcom/android/okhttp/Headers$Builder;-><init>()V
-HSPLcom/android/okhttp/Headers$Builder;->access$000(Lcom/android/okhttp/Headers$Builder;)Ljava/util/List;
-HSPLcom/android/okhttp/Headers$Builder;->add(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Headers$Builder;
-HSPLcom/android/okhttp/Headers$Builder;->addLenient(Ljava/lang/String;)Lcom/android/okhttp/Headers$Builder;
-HSPLcom/android/okhttp/Headers$Builder;->addLenient(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Headers$Builder;
-HSPLcom/android/okhttp/Headers$Builder;->build()Lcom/android/okhttp/Headers;
-HSPLcom/android/okhttp/Headers$Builder;->checkNameAndValue(Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/okhttp/Headers$Builder;->get(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/Headers$Builder;->removeAll(Ljava/lang/String;)Lcom/android/okhttp/Headers$Builder;
-HSPLcom/android/okhttp/Headers$Builder;->set(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Headers$Builder;
-HSPLcom/android/okhttp/Headers;-><init>(Lcom/android/okhttp/Headers$Builder;)V
-HSPLcom/android/okhttp/Headers;-><init>(Lcom/android/okhttp/Headers$Builder;Lcom/android/okhttp/Headers$1;)V
-HSPLcom/android/okhttp/Headers;->get(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/Headers;->get([Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/Headers;->name(I)Ljava/lang/String;
-HSPLcom/android/okhttp/Headers;->newBuilder()Lcom/android/okhttp/Headers$Builder;
-HSPLcom/android/okhttp/Headers;->size()I
-HSPLcom/android/okhttp/Headers;->value(I)Ljava/lang/String;
-HSPLcom/android/okhttp/HttpHandler$CleartextURLFilter;->checkURLPermitted(Ljava/net/URL;)V
-HSPLcom/android/okhttp/HttpHandler;-><init>()V
-HSPLcom/android/okhttp/HttpHandler;->createHttpOkUrlFactory(Ljava/net/Proxy;)Lcom/android/okhttp/OkUrlFactory;
-HSPLcom/android/okhttp/HttpHandler;->newOkUrlFactory(Ljava/net/Proxy;)Lcom/android/okhttp/OkUrlFactory;
-HSPLcom/android/okhttp/HttpHandler;->openConnection(Ljava/net/URL;)Ljava/net/URLConnection;
-HSPLcom/android/okhttp/HttpUrl$Builder;-><init>()V
-HSPLcom/android/okhttp/HttpUrl$Builder;->build()Lcom/android/okhttp/HttpUrl;
-HSPLcom/android/okhttp/HttpUrl$Builder;->canonicalizeHost(Ljava/lang/String;II)Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl$Builder;->containsInvalidHostnameAsciiCodes(Ljava/lang/String;)Z
-HSPLcom/android/okhttp/HttpUrl$Builder;->domainToAscii(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl$Builder;->effectivePort()I
-HSPLcom/android/okhttp/HttpUrl$Builder;->encodedQuery(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-HSPLcom/android/okhttp/HttpUrl$Builder;->host(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-HSPLcom/android/okhttp/HttpUrl$Builder;->isDot(Ljava/lang/String;)Z
-HSPLcom/android/okhttp/HttpUrl$Builder;->isDotDot(Ljava/lang/String;)Z
-HSPLcom/android/okhttp/HttpUrl$Builder;->parse(Lcom/android/okhttp/HttpUrl;Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
-HSPLcom/android/okhttp/HttpUrl$Builder;->parsePort(Ljava/lang/String;II)I
-HSPLcom/android/okhttp/HttpUrl$Builder;->port(I)Lcom/android/okhttp/HttpUrl$Builder;
-HSPLcom/android/okhttp/HttpUrl$Builder;->portColonOffset(Ljava/lang/String;II)I
-HSPLcom/android/okhttp/HttpUrl$Builder;->push(Ljava/lang/String;IIZZ)V
-HSPLcom/android/okhttp/HttpUrl$Builder;->reencodeForUri()Lcom/android/okhttp/HttpUrl$Builder;
-HSPLcom/android/okhttp/HttpUrl$Builder;->resolvePath(Ljava/lang/String;II)V
-HSPLcom/android/okhttp/HttpUrl$Builder;->scheme(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-HSPLcom/android/okhttp/HttpUrl$Builder;->schemeDelimiterOffset(Ljava/lang/String;II)I
-HSPLcom/android/okhttp/HttpUrl$Builder;->skipLeadingAsciiWhitespace(Ljava/lang/String;II)I
-HSPLcom/android/okhttp/HttpUrl$Builder;->skipTrailingAsciiWhitespace(Ljava/lang/String;II)I
-HSPLcom/android/okhttp/HttpUrl$Builder;->slashCount(Ljava/lang/String;II)I
-HSPLcom/android/okhttp/HttpUrl$Builder;->toString()Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl;-><init>(Lcom/android/okhttp/HttpUrl$Builder;)V
-HSPLcom/android/okhttp/HttpUrl;-><init>(Lcom/android/okhttp/HttpUrl$Builder;Lcom/android/okhttp/HttpUrl$1;)V
-HSPLcom/android/okhttp/HttpUrl;->access$200(Ljava/lang/String;IILjava/lang/String;)I
-HSPLcom/android/okhttp/HttpUrl;->canonicalize(Ljava/lang/String;IILjava/lang/String;ZZZZ)Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl;->canonicalize(Ljava/lang/String;Ljava/lang/String;ZZZZ)Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl;->decodeHexDigit(C)I
-HSPLcom/android/okhttp/HttpUrl;->defaultPort(Ljava/lang/String;)I
-HSPLcom/android/okhttp/HttpUrl;->delimiterOffset(Ljava/lang/String;IILjava/lang/String;)I
-HSPLcom/android/okhttp/HttpUrl;->encodedFragment()Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl;->encodedPassword()Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl;->encodedPath()Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl;->encodedPathSegments()Ljava/util/List;
-HSPLcom/android/okhttp/HttpUrl;->encodedQuery()Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl;->encodedUsername()Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl;->equals(Ljava/lang/Object;)Z
-HSPLcom/android/okhttp/HttpUrl;->getChecked(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl;
-HSPLcom/android/okhttp/HttpUrl;->hashCode()I
-HSPLcom/android/okhttp/HttpUrl;->host()Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl;->isHttps()Z
-HSPLcom/android/okhttp/HttpUrl;->namesAndValuesToQueryString(Ljava/lang/StringBuilder;Ljava/util/List;)V
-HSPLcom/android/okhttp/HttpUrl;->newBuilder()Lcom/android/okhttp/HttpUrl$Builder;
-HSPLcom/android/okhttp/HttpUrl;->pathSegmentsToString(Ljava/lang/StringBuilder;Ljava/util/List;)V
-HSPLcom/android/okhttp/HttpUrl;->percentDecode(Lcom/android/okhttp/okio/Buffer;Ljava/lang/String;IIZ)V
-HSPLcom/android/okhttp/HttpUrl;->percentDecode(Ljava/lang/String;IIZ)Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl;->percentDecode(Ljava/lang/String;Z)Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl;->percentDecode(Ljava/util/List;Z)Ljava/util/List;
-HSPLcom/android/okhttp/HttpUrl;->port()I
-HSPLcom/android/okhttp/HttpUrl;->queryStringToNamesAndValues(Ljava/lang/String;)Ljava/util/List;
-HSPLcom/android/okhttp/HttpUrl;->scheme()Ljava/lang/String;
-HSPLcom/android/okhttp/HttpUrl;->uri()Ljava/net/URI;
-HSPLcom/android/okhttp/HttpUrl;->url()Ljava/net/URL;
-HSPLcom/android/okhttp/HttpsHandler;-><init>()V
-HSPLcom/android/okhttp/HttpsHandler;->createHttpsOkUrlFactory(Ljava/net/Proxy;)Lcom/android/okhttp/OkUrlFactory;
-HSPLcom/android/okhttp/HttpsHandler;->newOkUrlFactory(Ljava/net/Proxy;)Lcom/android/okhttp/OkUrlFactory;
-HSPLcom/android/okhttp/OkHttpClient$1;->addLenient(Lcom/android/okhttp/Headers$Builder;Ljava/lang/String;)V
-HSPLcom/android/okhttp/OkHttpClient$1;->apply(Lcom/android/okhttp/ConnectionSpec;Ljavax/net/ssl/SSLSocket;Z)V
-HSPLcom/android/okhttp/OkHttpClient$1;->connectionBecameIdle(Lcom/android/okhttp/ConnectionPool;Lcom/android/okhttp/internal/io/RealConnection;)Z
-HSPLcom/android/okhttp/OkHttpClient$1;->get(Lcom/android/okhttp/ConnectionPool;Lcom/android/okhttp/Address;Lcom/android/okhttp/internal/http/StreamAllocation;)Lcom/android/okhttp/internal/io/RealConnection;
-HSPLcom/android/okhttp/OkHttpClient$1;->getHttpUrlChecked(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl;
-HSPLcom/android/okhttp/OkHttpClient$1;->internalCache(Lcom/android/okhttp/OkHttpClient;)Lcom/android/okhttp/internal/InternalCache;
-HSPLcom/android/okhttp/OkHttpClient$1;->put(Lcom/android/okhttp/ConnectionPool;Lcom/android/okhttp/internal/io/RealConnection;)V
-HSPLcom/android/okhttp/OkHttpClient$1;->routeDatabase(Lcom/android/okhttp/ConnectionPool;)Lcom/android/okhttp/internal/RouteDatabase;
-HSPLcom/android/okhttp/OkHttpClient;-><init>()V
-HSPLcom/android/okhttp/OkHttpClient;-><init>(Lcom/android/okhttp/OkHttpClient;)V
-HSPLcom/android/okhttp/OkHttpClient;->copyWithDefaults()Lcom/android/okhttp/OkHttpClient;
-HSPLcom/android/okhttp/OkHttpClient;->getAuthenticator()Lcom/android/okhttp/Authenticator;
-HSPLcom/android/okhttp/OkHttpClient;->getCertificatePinner()Lcom/android/okhttp/CertificatePinner;
-HSPLcom/android/okhttp/OkHttpClient;->getConnectTimeout()I
-HSPLcom/android/okhttp/OkHttpClient;->getConnectionPool()Lcom/android/okhttp/ConnectionPool;
-HSPLcom/android/okhttp/OkHttpClient;->getConnectionSpecs()Ljava/util/List;
-HSPLcom/android/okhttp/OkHttpClient;->getCookieHandler()Ljava/net/CookieHandler;
-HSPLcom/android/okhttp/OkHttpClient;->getDefaultSSLSocketFactory()Ljavax/net/ssl/SSLSocketFactory;
-HSPLcom/android/okhttp/OkHttpClient;->getDns()Lcom/android/okhttp/Dns;
-HSPLcom/android/okhttp/OkHttpClient;->getFollowRedirects()Z
-HSPLcom/android/okhttp/OkHttpClient;->getHostnameVerifier()Ljavax/net/ssl/HostnameVerifier;
-HSPLcom/android/okhttp/OkHttpClient;->getProtocols()Ljava/util/List;
-HSPLcom/android/okhttp/OkHttpClient;->getProxy()Ljava/net/Proxy;
-HSPLcom/android/okhttp/OkHttpClient;->getProxySelector()Ljava/net/ProxySelector;
-HSPLcom/android/okhttp/OkHttpClient;->getReadTimeout()I
-HSPLcom/android/okhttp/OkHttpClient;->getRetryOnConnectionFailure()Z
-HSPLcom/android/okhttp/OkHttpClient;->getSocketFactory()Ljavax/net/SocketFactory;
-HSPLcom/android/okhttp/OkHttpClient;->getSslSocketFactory()Ljavax/net/ssl/SSLSocketFactory;
-HSPLcom/android/okhttp/OkHttpClient;->getWriteTimeout()I
-HSPLcom/android/okhttp/OkHttpClient;->internalCache()Lcom/android/okhttp/internal/InternalCache;
-HSPLcom/android/okhttp/OkHttpClient;->setCertificatePinner(Lcom/android/okhttp/CertificatePinner;)Lcom/android/okhttp/OkHttpClient;
-HSPLcom/android/okhttp/OkHttpClient;->setConnectTimeout(JLjava/util/concurrent/TimeUnit;)V
-HSPLcom/android/okhttp/OkHttpClient;->setConnectionPool(Lcom/android/okhttp/ConnectionPool;)Lcom/android/okhttp/OkHttpClient;
-HSPLcom/android/okhttp/OkHttpClient;->setConnectionSpecs(Ljava/util/List;)Lcom/android/okhttp/OkHttpClient;
-HSPLcom/android/okhttp/OkHttpClient;->setDns(Lcom/android/okhttp/Dns;)Lcom/android/okhttp/OkHttpClient;
-HSPLcom/android/okhttp/OkHttpClient;->setFollowRedirects(Z)V
-HSPLcom/android/okhttp/OkHttpClient;->setFollowSslRedirects(Z)Lcom/android/okhttp/OkHttpClient;
-HSPLcom/android/okhttp/OkHttpClient;->setHostnameVerifier(Ljavax/net/ssl/HostnameVerifier;)Lcom/android/okhttp/OkHttpClient;
-HSPLcom/android/okhttp/OkHttpClient;->setProtocols(Ljava/util/List;)Lcom/android/okhttp/OkHttpClient;
-HSPLcom/android/okhttp/OkHttpClient;->setProxy(Ljava/net/Proxy;)Lcom/android/okhttp/OkHttpClient;
-HSPLcom/android/okhttp/OkHttpClient;->setReadTimeout(JLjava/util/concurrent/TimeUnit;)V
-HSPLcom/android/okhttp/OkHttpClient;->setSocketFactory(Ljavax/net/SocketFactory;)Lcom/android/okhttp/OkHttpClient;
-HSPLcom/android/okhttp/OkHttpClient;->setSslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;)Lcom/android/okhttp/OkHttpClient;
-HSPLcom/android/okhttp/OkHttpClient;->setWriteTimeout(JLjava/util/concurrent/TimeUnit;)V
-HSPLcom/android/okhttp/OkUrlFactories;->open(Lcom/android/okhttp/OkUrlFactory;Ljava/net/URL;Ljava/net/Proxy;)Ljava/net/HttpURLConnection;
-HSPLcom/android/okhttp/OkUrlFactories;->setUrlFilter(Lcom/android/okhttp/OkUrlFactory;Lcom/android/okhttp/internal/URLFilter;)V
-HSPLcom/android/okhttp/OkUrlFactory;-><init>(Lcom/android/okhttp/OkHttpClient;)V
-HSPLcom/android/okhttp/OkUrlFactory;->client()Lcom/android/okhttp/OkHttpClient;
-HSPLcom/android/okhttp/OkUrlFactory;->open(Ljava/net/URL;)Ljava/net/HttpURLConnection;
-HSPLcom/android/okhttp/OkUrlFactory;->open(Ljava/net/URL;Ljava/net/Proxy;)Ljava/net/HttpURLConnection;
-HSPLcom/android/okhttp/OkUrlFactory;->setUrlFilter(Lcom/android/okhttp/internal/URLFilter;)V
-HSPLcom/android/okhttp/Protocol;->get(Ljava/lang/String;)Lcom/android/okhttp/Protocol;
-HSPLcom/android/okhttp/Protocol;->toString()Ljava/lang/String;
-HSPLcom/android/okhttp/Request$Builder;-><init>()V
-HSPLcom/android/okhttp/Request$Builder;-><init>(Lcom/android/okhttp/Request;)V
-HSPLcom/android/okhttp/Request$Builder;-><init>(Lcom/android/okhttp/Request;Lcom/android/okhttp/Request$1;)V
-HSPLcom/android/okhttp/Request$Builder;->access$000(Lcom/android/okhttp/Request$Builder;)Lcom/android/okhttp/HttpUrl;
-HSPLcom/android/okhttp/Request$Builder;->access$100(Lcom/android/okhttp/Request$Builder;)Ljava/lang/String;
-HSPLcom/android/okhttp/Request$Builder;->access$200(Lcom/android/okhttp/Request$Builder;)Lcom/android/okhttp/Headers$Builder;
-HSPLcom/android/okhttp/Request$Builder;->access$300(Lcom/android/okhttp/Request$Builder;)Lcom/android/okhttp/RequestBody;
-HSPLcom/android/okhttp/Request$Builder;->access$400(Lcom/android/okhttp/Request$Builder;)Ljava/lang/Object;
-HSPLcom/android/okhttp/Request$Builder;->addHeader(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Request$Builder;
-HSPLcom/android/okhttp/Request$Builder;->build()Lcom/android/okhttp/Request;
-HSPLcom/android/okhttp/Request$Builder;->header(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Request$Builder;
-HSPLcom/android/okhttp/Request$Builder;->method(Ljava/lang/String;Lcom/android/okhttp/RequestBody;)Lcom/android/okhttp/Request$Builder;
-HSPLcom/android/okhttp/Request$Builder;->url(Lcom/android/okhttp/HttpUrl;)Lcom/android/okhttp/Request$Builder;
-HSPLcom/android/okhttp/Request;-><init>(Lcom/android/okhttp/Request$Builder;)V
-HSPLcom/android/okhttp/Request;-><init>(Lcom/android/okhttp/Request$Builder;Lcom/android/okhttp/Request$1;)V
-HSPLcom/android/okhttp/Request;->access$1000(Lcom/android/okhttp/Request;)Lcom/android/okhttp/Headers;
-HSPLcom/android/okhttp/Request;->access$600(Lcom/android/okhttp/Request;)Lcom/android/okhttp/HttpUrl;
-HSPLcom/android/okhttp/Request;->access$700(Lcom/android/okhttp/Request;)Ljava/lang/String;
-HSPLcom/android/okhttp/Request;->access$800(Lcom/android/okhttp/Request;)Lcom/android/okhttp/RequestBody;
-HSPLcom/android/okhttp/Request;->access$900(Lcom/android/okhttp/Request;)Ljava/lang/Object;
-HSPLcom/android/okhttp/Request;->cacheControl()Lcom/android/okhttp/CacheControl;
-HSPLcom/android/okhttp/Request;->header(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/Request;->headers()Lcom/android/okhttp/Headers;
-HSPLcom/android/okhttp/Request;->httpUrl()Lcom/android/okhttp/HttpUrl;
-HSPLcom/android/okhttp/Request;->isHttps()Z
-HSPLcom/android/okhttp/Request;->method()Ljava/lang/String;
-HSPLcom/android/okhttp/Request;->newBuilder()Lcom/android/okhttp/Request$Builder;
-HSPLcom/android/okhttp/Request;->url()Ljava/net/URL;
-HSPLcom/android/okhttp/Response$Builder;-><init>()V
-HSPLcom/android/okhttp/Response$Builder;-><init>(Lcom/android/okhttp/Response;)V
-HSPLcom/android/okhttp/Response$Builder;-><init>(Lcom/android/okhttp/Response;Lcom/android/okhttp/Response$1;)V
-HSPLcom/android/okhttp/Response$Builder;->access$000(Lcom/android/okhttp/Response$Builder;)Lcom/android/okhttp/Request;
-HSPLcom/android/okhttp/Response$Builder;->access$100(Lcom/android/okhttp/Response$Builder;)Lcom/android/okhttp/Protocol;
-HSPLcom/android/okhttp/Response$Builder;->access$200(Lcom/android/okhttp/Response$Builder;)I
-HSPLcom/android/okhttp/Response$Builder;->access$300(Lcom/android/okhttp/Response$Builder;)Ljava/lang/String;
-HSPLcom/android/okhttp/Response$Builder;->access$400(Lcom/android/okhttp/Response$Builder;)Lcom/android/okhttp/Handshake;
-HSPLcom/android/okhttp/Response$Builder;->access$500(Lcom/android/okhttp/Response$Builder;)Lcom/android/okhttp/Headers$Builder;
-HSPLcom/android/okhttp/Response$Builder;->access$600(Lcom/android/okhttp/Response$Builder;)Lcom/android/okhttp/ResponseBody;
-HSPLcom/android/okhttp/Response$Builder;->access$700(Lcom/android/okhttp/Response$Builder;)Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/Response$Builder;->access$800(Lcom/android/okhttp/Response$Builder;)Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/Response$Builder;->access$900(Lcom/android/okhttp/Response$Builder;)Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/Response$Builder;->body(Lcom/android/okhttp/ResponseBody;)Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/Response$Builder;->build()Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/Response$Builder;->cacheResponse(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/Response$Builder;->checkSupportResponse(Ljava/lang/String;Lcom/android/okhttp/Response;)V
-HSPLcom/android/okhttp/Response$Builder;->code(I)Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/Response$Builder;->handshake(Lcom/android/okhttp/Handshake;)Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/Response$Builder;->header(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/Response$Builder;->headers(Lcom/android/okhttp/Headers;)Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/Response$Builder;->message(Ljava/lang/String;)Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/Response$Builder;->networkResponse(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/Response$Builder;->priorResponse(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/Response$Builder;->protocol(Lcom/android/okhttp/Protocol;)Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/Response$Builder;->request(Lcom/android/okhttp/Request;)Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/Response;-><init>(Lcom/android/okhttp/Response$Builder;)V
-HSPLcom/android/okhttp/Response;-><init>(Lcom/android/okhttp/Response$Builder;Lcom/android/okhttp/Response$1;)V
-HSPLcom/android/okhttp/Response;->access$1100(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Request;
-HSPLcom/android/okhttp/Response;->access$1200(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Protocol;
-HSPLcom/android/okhttp/Response;->access$1300(Lcom/android/okhttp/Response;)I
-HSPLcom/android/okhttp/Response;->access$1400(Lcom/android/okhttp/Response;)Ljava/lang/String;
-HSPLcom/android/okhttp/Response;->access$1500(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Handshake;
-HSPLcom/android/okhttp/Response;->access$1600(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Headers;
-HSPLcom/android/okhttp/Response;->access$1700(Lcom/android/okhttp/Response;)Lcom/android/okhttp/ResponseBody;
-HSPLcom/android/okhttp/Response;->access$1800(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/Response;->access$1900(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/Response;->access$2000(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/Response;->body()Lcom/android/okhttp/ResponseBody;
-HSPLcom/android/okhttp/Response;->cacheResponse()Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/Response;->code()I
-HSPLcom/android/okhttp/Response;->header(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/Response;->header(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/Response;->headers()Lcom/android/okhttp/Headers;
-HSPLcom/android/okhttp/Response;->message()Ljava/lang/String;
-HSPLcom/android/okhttp/Response;->networkResponse()Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/Response;->newBuilder()Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/Response;->protocol()Lcom/android/okhttp/Protocol;
-HSPLcom/android/okhttp/Response;->request()Lcom/android/okhttp/Request;
-HSPLcom/android/okhttp/ResponseBody;-><init>()V
-HSPLcom/android/okhttp/ResponseBody;->byteStream()Ljava/io/InputStream;
-HSPLcom/android/okhttp/Route;-><init>(Lcom/android/okhttp/Address;Ljava/net/Proxy;Ljava/net/InetSocketAddress;)V
-HSPLcom/android/okhttp/Route;->equals(Ljava/lang/Object;)Z
-HSPLcom/android/okhttp/Route;->getAddress()Lcom/android/okhttp/Address;
-HSPLcom/android/okhttp/Route;->getProxy()Ljava/net/Proxy;
-HSPLcom/android/okhttp/Route;->getSocketAddress()Ljava/net/InetSocketAddress;
-HSPLcom/android/okhttp/Route;->hashCode()I
-HSPLcom/android/okhttp/Route;->requiresTunnel()Z
-HSPLcom/android/okhttp/internal/ConnectionSpecSelector;-><init>(Ljava/util/List;)V
-HSPLcom/android/okhttp/internal/ConnectionSpecSelector;->configureSecureSocket(Ljavax/net/ssl/SSLSocket;)Lcom/android/okhttp/ConnectionSpec;
-HSPLcom/android/okhttp/internal/ConnectionSpecSelector;->connectionFailed(Ljava/io/IOException;)Z
-HSPLcom/android/okhttp/internal/ConnectionSpecSelector;->isFallbackPossible(Ljavax/net/ssl/SSLSocket;)Z
-HSPLcom/android/okhttp/internal/OptionalMethod;->getMethod(Ljava/lang/Class;)Ljava/lang/reflect/Method;
-HSPLcom/android/okhttp/internal/OptionalMethod;->getPublicMethod(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
-HSPLcom/android/okhttp/internal/OptionalMethod;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/okhttp/internal/OptionalMethod;->invokeOptional(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/okhttp/internal/OptionalMethod;->invokeOptionalWithoutCheckedException(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/okhttp/internal/OptionalMethod;->invokeWithoutCheckedException(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/okhttp/internal/OptionalMethod;->isSupported(Ljava/lang/Object;)Z
-HSPLcom/android/okhttp/internal/Platform;->afterHandshake(Ljavax/net/ssl/SSLSocket;)V
-HSPLcom/android/okhttp/internal/Platform;->concatLengthPrefixed(Ljava/util/List;)[B
-HSPLcom/android/okhttp/internal/Platform;->configureTlsExtensions(Ljavax/net/ssl/SSLSocket;Ljava/lang/String;Ljava/util/List;)V
-HSPLcom/android/okhttp/internal/Platform;->connectSocket(Ljava/net/Socket;Ljava/net/InetSocketAddress;I)V
-HSPLcom/android/okhttp/internal/Platform;->get()Lcom/android/okhttp/internal/Platform;
-HSPLcom/android/okhttp/internal/Platform;->getProtocolIds(Ljava/util/List;)[Ljava/lang/String;
-HSPLcom/android/okhttp/internal/Platform;->getSelectedProtocol(Ljavax/net/ssl/SSLSocket;)Ljava/lang/String;
-HSPLcom/android/okhttp/internal/Platform;->isPlatformSocket(Ljavax/net/ssl/SSLSocket;)Z
-HSPLcom/android/okhttp/internal/RouteDatabase;-><init>()V
-HSPLcom/android/okhttp/internal/RouteDatabase;->connected(Lcom/android/okhttp/Route;)V
-HSPLcom/android/okhttp/internal/RouteDatabase;->failed(Lcom/android/okhttp/Route;)V
-HSPLcom/android/okhttp/internal/RouteDatabase;->shouldPostpone(Lcom/android/okhttp/Route;)Z
-HSPLcom/android/okhttp/internal/Util$1;-><init>(Ljava/lang/String;Z)V
-HSPLcom/android/okhttp/internal/Util$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;
-HSPLcom/android/okhttp/internal/Util;->checkOffsetAndCount(JJJ)V
-HSPLcom/android/okhttp/internal/Util;->closeQuietly(Ljava/io/Closeable;)V
-HSPLcom/android/okhttp/internal/Util;->closeQuietly(Ljava/net/Socket;)V
-HSPLcom/android/okhttp/internal/Util;->discard(Lcom/android/okhttp/okio/Source;ILjava/util/concurrent/TimeUnit;)Z
-HSPLcom/android/okhttp/internal/Util;->equal(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLcom/android/okhttp/internal/Util;->hostHeader(Lcom/android/okhttp/HttpUrl;Z)Ljava/lang/String;
-HSPLcom/android/okhttp/internal/Util;->immutableList(Ljava/util/List;)Ljava/util/List;
-HSPLcom/android/okhttp/internal/Util;->immutableList([Ljava/lang/Object;)Ljava/util/List;
-HSPLcom/android/okhttp/internal/Util;->skipAll(Lcom/android/okhttp/okio/Source;ILjava/util/concurrent/TimeUnit;)Z
-HSPLcom/android/okhttp/internal/Util;->threadFactory(Ljava/lang/String;Z)Ljava/util/concurrent/ThreadFactory;
-HSPLcom/android/okhttp/internal/Util;->toHumanReadableAscii(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/internal/http/CacheStrategy$Factory;-><init>(JLcom/android/okhttp/Request;Lcom/android/okhttp/Response;)V
-HSPLcom/android/okhttp/internal/http/CacheStrategy$Factory;->get()Lcom/android/okhttp/internal/http/CacheStrategy;
-HSPLcom/android/okhttp/internal/http/CacheStrategy$Factory;->getCandidate()Lcom/android/okhttp/internal/http/CacheStrategy;
-HSPLcom/android/okhttp/internal/http/CacheStrategy;-><init>(Lcom/android/okhttp/Request;Lcom/android/okhttp/Response;)V
-HSPLcom/android/okhttp/internal/http/CacheStrategy;-><init>(Lcom/android/okhttp/Request;Lcom/android/okhttp/Response;Lcom/android/okhttp/internal/http/CacheStrategy$1;)V
-HSPLcom/android/okhttp/internal/http/HeaderParser;->skipUntil(Ljava/lang/String;ILjava/lang/String;)I
-HSPLcom/android/okhttp/internal/http/HeaderParser;->skipWhitespace(Ljava/lang/String;I)I
-HSPLcom/android/okhttp/internal/http/Http1xStream$AbstractSource;-><init>(Lcom/android/okhttp/internal/http/Http1xStream;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream$AbstractSource;-><init>(Lcom/android/okhttp/internal/http/Http1xStream;Lcom/android/okhttp/internal/http/Http1xStream$1;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream$AbstractSource;->endOfInput()V
-HSPLcom/android/okhttp/internal/http/Http1xStream$AbstractSource;->timeout()Lcom/android/okhttp/okio/Timeout;
-HSPLcom/android/okhttp/internal/http/Http1xStream$AbstractSource;->unexpectedEndOfInput()V
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSink;-><init>(Lcom/android/okhttp/internal/http/Http1xStream;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSink;-><init>(Lcom/android/okhttp/internal/http/Http1xStream;Lcom/android/okhttp/internal/http/Http1xStream$1;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSink;->close()V
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSink;->flush()V
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSink;->write(Lcom/android/okhttp/okio/Buffer;J)V
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSource;-><init>(Lcom/android/okhttp/internal/http/Http1xStream;Lcom/android/okhttp/internal/http/HttpEngine;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSource;->close()V
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSource;->read(Lcom/android/okhttp/okio/Buffer;J)J
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSource;->readChunkSize()V
-HSPLcom/android/okhttp/internal/http/Http1xStream$FixedLengthSink;-><init>(Lcom/android/okhttp/internal/http/Http1xStream;J)V
-HSPLcom/android/okhttp/internal/http/Http1xStream$FixedLengthSink;-><init>(Lcom/android/okhttp/internal/http/Http1xStream;JLcom/android/okhttp/internal/http/Http1xStream$1;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream$FixedLengthSink;->close()V
-HSPLcom/android/okhttp/internal/http/Http1xStream$FixedLengthSink;->flush()V
-HSPLcom/android/okhttp/internal/http/Http1xStream$FixedLengthSink;->write(Lcom/android/okhttp/okio/Buffer;J)V
-HSPLcom/android/okhttp/internal/http/Http1xStream$FixedLengthSource;-><init>(Lcom/android/okhttp/internal/http/Http1xStream;J)V
-HSPLcom/android/okhttp/internal/http/Http1xStream$FixedLengthSource;->close()V
-HSPLcom/android/okhttp/internal/http/Http1xStream$FixedLengthSource;->read(Lcom/android/okhttp/okio/Buffer;J)J
-HSPLcom/android/okhttp/internal/http/Http1xStream;-><init>(Lcom/android/okhttp/internal/http/StreamAllocation;Lcom/android/okhttp/okio/BufferedSource;Lcom/android/okhttp/okio/BufferedSink;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream;->access$300(Lcom/android/okhttp/internal/http/Http1xStream;)Lcom/android/okhttp/okio/BufferedSink;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->access$400(Lcom/android/okhttp/internal/http/Http1xStream;Lcom/android/okhttp/okio/ForwardingTimeout;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream;->access$500(Lcom/android/okhttp/internal/http/Http1xStream;)I
-HSPLcom/android/okhttp/internal/http/Http1xStream;->access$502(Lcom/android/okhttp/internal/http/Http1xStream;I)I
-HSPLcom/android/okhttp/internal/http/Http1xStream;->access$600(Lcom/android/okhttp/internal/http/Http1xStream;)Lcom/android/okhttp/okio/BufferedSource;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->access$700(Lcom/android/okhttp/internal/http/Http1xStream;)Lcom/android/okhttp/internal/http/StreamAllocation;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->cancel()V
-HSPLcom/android/okhttp/internal/http/Http1xStream;->createRequestBody(Lcom/android/okhttp/Request;J)Lcom/android/okhttp/okio/Sink;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->detachTimeout(Lcom/android/okhttp/okio/ForwardingTimeout;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream;->finishRequest()V
-HSPLcom/android/okhttp/internal/http/Http1xStream;->getTransferStream(Lcom/android/okhttp/Response;)Lcom/android/okhttp/okio/Source;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->newChunkedSink()Lcom/android/okhttp/okio/Sink;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->newChunkedSource(Lcom/android/okhttp/internal/http/HttpEngine;)Lcom/android/okhttp/okio/Source;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->newFixedLengthSink(J)Lcom/android/okhttp/okio/Sink;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->newFixedLengthSource(J)Lcom/android/okhttp/okio/Source;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->openResponseBody(Lcom/android/okhttp/Response;)Lcom/android/okhttp/ResponseBody;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->readHeaders()Lcom/android/okhttp/Headers;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->readResponse()Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->readResponseHeaders()Lcom/android/okhttp/Response$Builder;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->setHttpEngine(Lcom/android/okhttp/internal/http/HttpEngine;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream;->writeRequest(Lcom/android/okhttp/Headers;Ljava/lang/String;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream;->writeRequestBody(Lcom/android/okhttp/internal/http/RetryableSink;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream;->writeRequestHeaders(Lcom/android/okhttp/Request;)V
-HSPLcom/android/okhttp/internal/http/HttpEngine;-><init>(Lcom/android/okhttp/OkHttpClient;Lcom/android/okhttp/Request;ZZZLcom/android/okhttp/internal/http/StreamAllocation;Lcom/android/okhttp/internal/http/RetryableSink;Lcom/android/okhttp/Response;)V
-HSPLcom/android/okhttp/internal/http/HttpEngine;->cacheWritingResponse(Lcom/android/okhttp/internal/http/CacheRequest;Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->cancel()V
-HSPLcom/android/okhttp/internal/http/HttpEngine;->close()Lcom/android/okhttp/internal/http/StreamAllocation;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->connect()Lcom/android/okhttp/internal/http/HttpStream;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->createAddress(Lcom/android/okhttp/OkHttpClient;Lcom/android/okhttp/Request;)Lcom/android/okhttp/Address;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->followUpRequest()Lcom/android/okhttp/Request;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->getBufferedRequestBody()Lcom/android/okhttp/okio/BufferedSink;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->getConnection()Lcom/android/okhttp/Connection;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->getRequest()Lcom/android/okhttp/Request;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->getRequestBody()Lcom/android/okhttp/okio/Sink;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->getResponse()Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->hasBody(Lcom/android/okhttp/Response;)Z
-HSPLcom/android/okhttp/internal/http/HttpEngine;->hasResponse()Z
-HSPLcom/android/okhttp/internal/http/HttpEngine;->maybeCache()V
-HSPLcom/android/okhttp/internal/http/HttpEngine;->networkRequest(Lcom/android/okhttp/Request;)Lcom/android/okhttp/Request;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->permitsRequestBody(Lcom/android/okhttp/Request;)Z
-HSPLcom/android/okhttp/internal/http/HttpEngine;->readNetworkResponse()Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->readResponse()V
-HSPLcom/android/okhttp/internal/http/HttpEngine;->receiveHeaders(Lcom/android/okhttp/Headers;)V
-HSPLcom/android/okhttp/internal/http/HttpEngine;->recover(Lcom/android/okhttp/internal/http/RouteException;)Lcom/android/okhttp/internal/http/HttpEngine;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->recover(Ljava/io/IOException;)Lcom/android/okhttp/internal/http/HttpEngine;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->recover(Ljava/io/IOException;Lcom/android/okhttp/okio/Sink;)Lcom/android/okhttp/internal/http/HttpEngine;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->releaseStreamAllocation()V
-HSPLcom/android/okhttp/internal/http/HttpEngine;->sendRequest()V
-HSPLcom/android/okhttp/internal/http/HttpEngine;->stripBody(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->unzip(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->writingRequestHeaders()V
-HSPLcom/android/okhttp/internal/http/HttpMethod;->permitsRequestBody(Ljava/lang/String;)Z
-HSPLcom/android/okhttp/internal/http/HttpMethod;->requiresRequestBody(Ljava/lang/String;)Z
-HSPLcom/android/okhttp/internal/http/OkHeaders$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLcom/android/okhttp/internal/http/OkHeaders$1;->compare(Ljava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/okhttp/internal/http/OkHeaders;->contentLength(Lcom/android/okhttp/Headers;)J
-HSPLcom/android/okhttp/internal/http/OkHeaders;->contentLength(Lcom/android/okhttp/Request;)J
-HSPLcom/android/okhttp/internal/http/OkHeaders;->contentLength(Lcom/android/okhttp/Response;)J
-HSPLcom/android/okhttp/internal/http/OkHeaders;->stringToLong(Ljava/lang/String;)J
-HSPLcom/android/okhttp/internal/http/OkHeaders;->toMultimap(Lcom/android/okhttp/Headers;Ljava/lang/String;)Ljava/util/Map;
-HSPLcom/android/okhttp/internal/http/RealResponseBody;-><init>(Lcom/android/okhttp/Headers;Lcom/android/okhttp/okio/BufferedSource;)V
-HSPLcom/android/okhttp/internal/http/RealResponseBody;->source()Lcom/android/okhttp/okio/BufferedSource;
-HSPLcom/android/okhttp/internal/http/RequestLine;->get(Lcom/android/okhttp/Request;Ljava/net/Proxy$Type;)Ljava/lang/String;
-HSPLcom/android/okhttp/internal/http/RequestLine;->includeAuthorityInRequestLine(Lcom/android/okhttp/Request;Ljava/net/Proxy$Type;)Z
-HSPLcom/android/okhttp/internal/http/RequestLine;->requestPath(Lcom/android/okhttp/HttpUrl;)Ljava/lang/String;
-HSPLcom/android/okhttp/internal/http/RetryableSink;-><init>()V
-HSPLcom/android/okhttp/internal/http/RetryableSink;-><init>(I)V
-HSPLcom/android/okhttp/internal/http/RetryableSink;->close()V
-HSPLcom/android/okhttp/internal/http/RetryableSink;->contentLength()J
-HSPLcom/android/okhttp/internal/http/RetryableSink;->flush()V
-HSPLcom/android/okhttp/internal/http/RetryableSink;->write(Lcom/android/okhttp/okio/Buffer;J)V
-HSPLcom/android/okhttp/internal/http/RetryableSink;->writeToSocket(Lcom/android/okhttp/okio/Sink;)V
-HSPLcom/android/okhttp/internal/http/RouteException;-><init>(Ljava/io/IOException;)V
-HSPLcom/android/okhttp/internal/http/RouteException;->getLastConnectException()Ljava/io/IOException;
-HSPLcom/android/okhttp/internal/http/RouteSelector;-><init>(Lcom/android/okhttp/Address;Lcom/android/okhttp/internal/RouteDatabase;)V
-HSPLcom/android/okhttp/internal/http/RouteSelector;->connectFailed(Lcom/android/okhttp/Route;Ljava/io/IOException;)V
-HSPLcom/android/okhttp/internal/http/RouteSelector;->hasNext()Z
-HSPLcom/android/okhttp/internal/http/RouteSelector;->hasNextInetSocketAddress()Z
-HSPLcom/android/okhttp/internal/http/RouteSelector;->hasNextPostponed()Z
-HSPLcom/android/okhttp/internal/http/RouteSelector;->hasNextProxy()Z
-HSPLcom/android/okhttp/internal/http/RouteSelector;->next()Lcom/android/okhttp/Route;
-HSPLcom/android/okhttp/internal/http/RouteSelector;->nextInetSocketAddress()Ljava/net/InetSocketAddress;
-HSPLcom/android/okhttp/internal/http/RouteSelector;->nextPostponed()Lcom/android/okhttp/Route;
-HSPLcom/android/okhttp/internal/http/RouteSelector;->nextProxy()Ljava/net/Proxy;
-HSPLcom/android/okhttp/internal/http/RouteSelector;->resetNextInetSocketAddress(Ljava/net/Proxy;)V
-HSPLcom/android/okhttp/internal/http/RouteSelector;->resetNextProxy(Lcom/android/okhttp/HttpUrl;Ljava/net/Proxy;)V
-HSPLcom/android/okhttp/internal/http/StatusLine;-><init>(Lcom/android/okhttp/Protocol;ILjava/lang/String;)V
-HSPLcom/android/okhttp/internal/http/StatusLine;->get(Lcom/android/okhttp/Response;)Lcom/android/okhttp/internal/http/StatusLine;
-HSPLcom/android/okhttp/internal/http/StatusLine;->parse(Ljava/lang/String;)Lcom/android/okhttp/internal/http/StatusLine;
-HSPLcom/android/okhttp/internal/http/StatusLine;->toString()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/http/StreamAllocation;-><init>(Lcom/android/okhttp/ConnectionPool;Lcom/android/okhttp/Address;)V
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->acquire(Lcom/android/okhttp/internal/io/RealConnection;)V
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->cancel()V
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->connection()Lcom/android/okhttp/internal/io/RealConnection;
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->connectionFailed()V
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->connectionFailed(Ljava/io/IOException;)V
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->deallocate(ZZZ)V
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->findConnection(IIIZ)Lcom/android/okhttp/internal/io/RealConnection;
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->findHealthyConnection(IIIZZ)Lcom/android/okhttp/internal/io/RealConnection;
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->isRecoverable(Lcom/android/okhttp/internal/http/RouteException;)Z
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->isRecoverable(Ljava/io/IOException;)Z
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->newStream(IIIZZ)Lcom/android/okhttp/internal/http/HttpStream;
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->noNewStreams()V
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->recover(Lcom/android/okhttp/internal/http/RouteException;)Z
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->recover(Ljava/io/IOException;Lcom/android/okhttp/okio/Sink;)Z
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->release()V
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->release(Lcom/android/okhttp/internal/io/RealConnection;)V
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->routeDatabase()Lcom/android/okhttp/internal/RouteDatabase;
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->streamFinished(Lcom/android/okhttp/internal/http/HttpStream;)V
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->toString()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;-><init>(Ljava/net/HttpURLConnection;)V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->addRequestProperty(Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->connect()V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->disconnect()V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getContentEncoding()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getContentLength()I
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getContentType()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getErrorStream()Ljava/io/InputStream;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getHeaderField(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getHeaderFields()Ljava/util/Map;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getInputStream()Ljava/io/InputStream;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getOutputStream()Ljava/io/OutputStream;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getRequestMethod()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getRequestProperties()Ljava/util/Map;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getRequestProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getResponseCode()I
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getResponseMessage()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getURL()Ljava/net/URL;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setChunkedStreamingMode(I)V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setConnectTimeout(I)V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setDefaultUseCaches(Z)V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setDoInput(Z)V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setDoOutput(Z)V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setFixedLengthStreamingMode(I)V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setInstanceFollowRedirects(Z)V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setReadTimeout(I)V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setRequestMethod(Ljava/lang/String;)V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setRequestProperty(Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setUseCaches(Z)V
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;-><init>(Ljava/net/URL;Lcom/android/okhttp/OkHttpClient;)V
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;-><init>(Ljava/net/URL;Lcom/android/okhttp/OkHttpClient;Lcom/android/okhttp/internal/URLFilter;)V
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->addRequestProperty(Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->connect()V
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->defaultUserAgent()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->disconnect()V
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->execute(Z)Z
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getErrorStream()Ljava/io/InputStream;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getHeaderField(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getHeaderFields()Ljava/util/Map;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getHeaders()Lcom/android/okhttp/Headers;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getInputStream()Ljava/io/InputStream;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getOutputStream()Ljava/io/OutputStream;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getRequestProperties()Ljava/util/Map;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getRequestProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getResponse()Lcom/android/okhttp/internal/http/HttpEngine;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getResponseCode()I
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getResponseMessage()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->initHttpEngine()V
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->newHttpEngine(Ljava/lang/String;Lcom/android/okhttp/internal/http/StreamAllocation;Lcom/android/okhttp/internal/http/RetryableSink;Lcom/android/okhttp/Response;)Lcom/android/okhttp/internal/http/HttpEngine;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->responseSourceHeader(Lcom/android/okhttp/Response;)Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->setConnectTimeout(I)V
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->setFixedLengthStreamingMode(I)V
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->setFixedLengthStreamingMode(J)V
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->setInstanceFollowRedirects(Z)V
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->setReadTimeout(I)V
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->setRequestMethod(Ljava/lang/String;)V
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->setRequestProperty(Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;-><init>(Lcom/android/okhttp/internal/huc/HttpURLConnectionImpl;)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;-><init>(Ljava/net/URL;Lcom/android/okhttp/OkHttpClient;Lcom/android/okhttp/internal/URLFilter;)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->addRequestProperty(Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->connect()V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->disconnect()V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getContentEncoding()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getContentLength()I
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getContentType()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getErrorStream()Ljava/io/InputStream;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getHeaderField(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getHeaderFields()Ljava/util/Map;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getInputStream()Ljava/io/InputStream;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getOutputStream()Ljava/io/OutputStream;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getRequestMethod()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getRequestProperties()Ljava/util/Map;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getRequestProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getResponseCode()I
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getResponseMessage()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getURL()Ljava/net/URL;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setChunkedStreamingMode(I)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setConnectTimeout(I)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setDefaultUseCaches(Z)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setDoInput(Z)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setDoOutput(Z)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setFixedLengthStreamingMode(I)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setInstanceFollowRedirects(Z)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setReadTimeout(I)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setRequestMethod(Ljava/lang/String;)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setRequestProperty(Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setSSLSocketFactory(Ljavax/net/ssl/SSLSocketFactory;)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setUseCaches(Z)V
-HSPLcom/android/okhttp/internal/io/RealConnection;-><init>(Lcom/android/okhttp/Route;)V
-HSPLcom/android/okhttp/internal/io/RealConnection;->allocationLimit()I
-HSPLcom/android/okhttp/internal/io/RealConnection;->cancel()V
-HSPLcom/android/okhttp/internal/io/RealConnection;->connect(IIILjava/util/List;Z)V
-HSPLcom/android/okhttp/internal/io/RealConnection;->connectSocket(IIILcom/android/okhttp/internal/ConnectionSpecSelector;)V
-HSPLcom/android/okhttp/internal/io/RealConnection;->connectTls(IILcom/android/okhttp/internal/ConnectionSpecSelector;)V
-HSPLcom/android/okhttp/internal/io/RealConnection;->getHandshake()Lcom/android/okhttp/Handshake;
-HSPLcom/android/okhttp/internal/io/RealConnection;->getRoute()Lcom/android/okhttp/Route;
-HSPLcom/android/okhttp/internal/io/RealConnection;->getSocket()Ljava/net/Socket;
-HSPLcom/android/okhttp/internal/io/RealConnection;->isHealthy(Z)Z
-HSPLcom/android/okhttp/internal/tls/OkHostnameVerifier;->getSubjectAltNames(Ljava/security/cert/X509Certificate;I)Ljava/util/List;
-HSPLcom/android/okhttp/internal/tls/OkHostnameVerifier;->isPrintableAscii(Ljava/lang/String;)Z
-HSPLcom/android/okhttp/internal/tls/OkHostnameVerifier;->verify(Ljava/lang/String;Ljava/security/cert/X509Certificate;)Z
-HSPLcom/android/okhttp/internal/tls/OkHostnameVerifier;->verify(Ljava/lang/String;Ljavax/net/ssl/SSLSession;)Z
-HSPLcom/android/okhttp/internal/tls/OkHostnameVerifier;->verifyAsIpAddress(Ljava/lang/String;)Z
-HSPLcom/android/okhttp/internal/tls/OkHostnameVerifier;->verifyHostName(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLcom/android/okhttp/internal/tls/OkHostnameVerifier;->verifyHostName(Ljava/lang/String;Ljava/security/cert/X509Certificate;)Z
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory$DnsAdapter;-><init>(Lcom/android/okhttp/internalandroidapi/Dns;)V
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory$DnsAdapter;->hashCode()I
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory$DnsAdapter;->lookup(Ljava/lang/String;)Ljava/util/List;
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;-><init>()V
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;->internalOpenConnection(Ljava/net/URL;Ljavax/net/SocketFactory;Ljava/net/Proxy;)Ljava/net/URLConnection;
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;->openConnection(Ljava/net/URL;Ljavax/net/SocketFactory;Ljava/net/Proxy;)Ljava/net/URLConnection;
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;->setDns(Lcom/android/okhttp/internalandroidapi/Dns;)V
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;->setNewConnectionPool(IJLjava/util/concurrent/TimeUnit;)V
-HSPLcom/android/okhttp/okio/AsyncTimeout$1;-><init>(Lcom/android/okhttp/okio/AsyncTimeout;Lcom/android/okhttp/okio/Sink;)V
-HSPLcom/android/okhttp/okio/AsyncTimeout$1;->flush()V
-HSPLcom/android/okhttp/okio/AsyncTimeout$1;->timeout()Lcom/android/okhttp/okio/Timeout;
-HSPLcom/android/okhttp/okio/AsyncTimeout$1;->write(Lcom/android/okhttp/okio/Buffer;J)V
-HSPLcom/android/okhttp/okio/AsyncTimeout$2;-><init>(Lcom/android/okhttp/okio/AsyncTimeout;Lcom/android/okhttp/okio/Source;)V
-HSPLcom/android/okhttp/okio/AsyncTimeout$2;->read(Lcom/android/okhttp/okio/Buffer;J)J
-HSPLcom/android/okhttp/okio/AsyncTimeout$2;->timeout()Lcom/android/okhttp/okio/Timeout;
-HSPLcom/android/okhttp/okio/AsyncTimeout$Watchdog;-><init>()V
-HSPLcom/android/okhttp/okio/AsyncTimeout$Watchdog;->run()V
-HSPLcom/android/okhttp/okio/AsyncTimeout;-><init>()V
-HSPLcom/android/okhttp/okio/AsyncTimeout;->access$000()Lcom/android/okhttp/okio/AsyncTimeout;
-HSPLcom/android/okhttp/okio/AsyncTimeout;->awaitTimeout()Lcom/android/okhttp/okio/AsyncTimeout;
-HSPLcom/android/okhttp/okio/AsyncTimeout;->cancelScheduledTimeout(Lcom/android/okhttp/okio/AsyncTimeout;)Z
-HSPLcom/android/okhttp/okio/AsyncTimeout;->enter()V
-HSPLcom/android/okhttp/okio/AsyncTimeout;->exit()Z
-HSPLcom/android/okhttp/okio/AsyncTimeout;->exit(Ljava/io/IOException;)Ljava/io/IOException;
-HSPLcom/android/okhttp/okio/AsyncTimeout;->exit(Z)V
-HSPLcom/android/okhttp/okio/AsyncTimeout;->remainingNanos(J)J
-HSPLcom/android/okhttp/okio/AsyncTimeout;->scheduleTimeout(Lcom/android/okhttp/okio/AsyncTimeout;JZ)V
-HSPLcom/android/okhttp/okio/AsyncTimeout;->sink(Lcom/android/okhttp/okio/Sink;)Lcom/android/okhttp/okio/Sink;
-HSPLcom/android/okhttp/okio/AsyncTimeout;->source(Lcom/android/okhttp/okio/Source;)Lcom/android/okhttp/okio/Source;
-HSPLcom/android/okhttp/okio/Buffer;-><init>()V
-HSPLcom/android/okhttp/okio/Buffer;->clear()V
-HSPLcom/android/okhttp/okio/Buffer;->completeSegmentByteCount()J
-HSPLcom/android/okhttp/okio/Buffer;->copyTo(Lcom/android/okhttp/okio/Buffer;JJ)Lcom/android/okhttp/okio/Buffer;
-HSPLcom/android/okhttp/okio/Buffer;->exhausted()Z
-HSPLcom/android/okhttp/okio/Buffer;->getByte(J)B
-HSPLcom/android/okhttp/okio/Buffer;->indexOf(BJ)J
-HSPLcom/android/okhttp/okio/Buffer;->read(Lcom/android/okhttp/okio/Buffer;J)J
-HSPLcom/android/okhttp/okio/Buffer;->read([BII)I
-HSPLcom/android/okhttp/okio/Buffer;->readByte()B
-HSPLcom/android/okhttp/okio/Buffer;->readByteArray()[B
-HSPLcom/android/okhttp/okio/Buffer;->readByteArray(J)[B
-HSPLcom/android/okhttp/okio/Buffer;->readByteString()Lcom/android/okhttp/okio/ByteString;
-HSPLcom/android/okhttp/okio/Buffer;->readFully([B)V
-HSPLcom/android/okhttp/okio/Buffer;->readHexadecimalUnsignedLong()J
-HSPLcom/android/okhttp/okio/Buffer;->readInt()I
-HSPLcom/android/okhttp/okio/Buffer;->readIntLe()I
-HSPLcom/android/okhttp/okio/Buffer;->readShort()S
-HSPLcom/android/okhttp/okio/Buffer;->readString(JLjava/nio/charset/Charset;)Ljava/lang/String;
-HSPLcom/android/okhttp/okio/Buffer;->readUtf8()Ljava/lang/String;
-HSPLcom/android/okhttp/okio/Buffer;->readUtf8(J)Ljava/lang/String;
-HSPLcom/android/okhttp/okio/Buffer;->readUtf8Line(J)Ljava/lang/String;
-HSPLcom/android/okhttp/okio/Buffer;->size()J
-HSPLcom/android/okhttp/okio/Buffer;->skip(J)V
-HSPLcom/android/okhttp/okio/Buffer;->writableSegment(I)Lcom/android/okhttp/okio/Segment;
-HSPLcom/android/okhttp/okio/Buffer;->write(Lcom/android/okhttp/okio/Buffer;J)V
-HSPLcom/android/okhttp/okio/Buffer;->write([BII)Lcom/android/okhttp/okio/Buffer;
-HSPLcom/android/okhttp/okio/Buffer;->writeByte(I)Lcom/android/okhttp/okio/Buffer;
-HSPLcom/android/okhttp/okio/Buffer;->writeHexadecimalUnsignedLong(J)Lcom/android/okhttp/okio/Buffer;
-HSPLcom/android/okhttp/okio/Buffer;->writeUtf8(Ljava/lang/String;)Lcom/android/okhttp/okio/Buffer;
-HSPLcom/android/okhttp/okio/Buffer;->writeUtf8(Ljava/lang/String;II)Lcom/android/okhttp/okio/Buffer;
-HSPLcom/android/okhttp/okio/Buffer;->writeUtf8CodePoint(I)Lcom/android/okhttp/okio/Buffer;
-HSPLcom/android/okhttp/okio/ByteString;-><init>([B)V
-HSPLcom/android/okhttp/okio/ByteString;->hex()Ljava/lang/String;
-HSPLcom/android/okhttp/okio/ForwardingTimeout;-><init>(Lcom/android/okhttp/okio/Timeout;)V
-HSPLcom/android/okhttp/okio/ForwardingTimeout;->clearDeadline()Lcom/android/okhttp/okio/Timeout;
-HSPLcom/android/okhttp/okio/ForwardingTimeout;->deadlineNanoTime(J)Lcom/android/okhttp/okio/Timeout;
-HSPLcom/android/okhttp/okio/ForwardingTimeout;->delegate()Lcom/android/okhttp/okio/Timeout;
-HSPLcom/android/okhttp/okio/ForwardingTimeout;->hasDeadline()Z
-HSPLcom/android/okhttp/okio/ForwardingTimeout;->setDelegate(Lcom/android/okhttp/okio/Timeout;)Lcom/android/okhttp/okio/ForwardingTimeout;
-HSPLcom/android/okhttp/okio/GzipSource;-><init>(Lcom/android/okhttp/okio/Source;)V
-HSPLcom/android/okhttp/okio/GzipSource;->checkEqual(Ljava/lang/String;II)V
-HSPLcom/android/okhttp/okio/GzipSource;->close()V
-HSPLcom/android/okhttp/okio/GzipSource;->consumeHeader()V
-HSPLcom/android/okhttp/okio/GzipSource;->consumeTrailer()V
-HSPLcom/android/okhttp/okio/GzipSource;->read(Lcom/android/okhttp/okio/Buffer;J)J
-HSPLcom/android/okhttp/okio/GzipSource;->updateCrc(Lcom/android/okhttp/okio/Buffer;JJ)V
-HSPLcom/android/okhttp/okio/InflaterSource;-><init>(Lcom/android/okhttp/okio/BufferedSource;Ljava/util/zip/Inflater;)V
-HSPLcom/android/okhttp/okio/InflaterSource;->close()V
-HSPLcom/android/okhttp/okio/InflaterSource;->read(Lcom/android/okhttp/okio/Buffer;J)J
-HSPLcom/android/okhttp/okio/InflaterSource;->refill()Z
-HSPLcom/android/okhttp/okio/InflaterSource;->releaseInflatedBytes()V
-HSPLcom/android/okhttp/okio/Okio$1;-><init>(Lcom/android/okhttp/okio/Timeout;Ljava/io/OutputStream;)V
-HSPLcom/android/okhttp/okio/Okio$1;->flush()V
-HSPLcom/android/okhttp/okio/Okio$1;->write(Lcom/android/okhttp/okio/Buffer;J)V
-HSPLcom/android/okhttp/okio/Okio$2;-><init>(Lcom/android/okhttp/okio/Timeout;Ljava/io/InputStream;)V
-HSPLcom/android/okhttp/okio/Okio$2;->read(Lcom/android/okhttp/okio/Buffer;J)J
-HSPLcom/android/okhttp/okio/Okio$3;-><init>(Ljava/net/Socket;)V
-HSPLcom/android/okhttp/okio/Okio$3;->newTimeoutException(Ljava/io/IOException;)Ljava/io/IOException;
-HSPLcom/android/okhttp/okio/Okio$3;->timedOut()V
-HSPLcom/android/okhttp/okio/Okio;->buffer(Lcom/android/okhttp/okio/Sink;)Lcom/android/okhttp/okio/BufferedSink;
-HSPLcom/android/okhttp/okio/Okio;->buffer(Lcom/android/okhttp/okio/Source;)Lcom/android/okhttp/okio/BufferedSource;
-HSPLcom/android/okhttp/okio/Okio;->sink(Ljava/io/OutputStream;Lcom/android/okhttp/okio/Timeout;)Lcom/android/okhttp/okio/Sink;
-HSPLcom/android/okhttp/okio/Okio;->sink(Ljava/net/Socket;)Lcom/android/okhttp/okio/Sink;
-HSPLcom/android/okhttp/okio/Okio;->source(Ljava/io/InputStream;Lcom/android/okhttp/okio/Timeout;)Lcom/android/okhttp/okio/Source;
-HSPLcom/android/okhttp/okio/Okio;->source(Ljava/net/Socket;)Lcom/android/okhttp/okio/Source;
-HSPLcom/android/okhttp/okio/Okio;->timeout(Ljava/net/Socket;)Lcom/android/okhttp/okio/AsyncTimeout;
-HSPLcom/android/okhttp/okio/RealBufferedSink$1;-><init>(Lcom/android/okhttp/okio/RealBufferedSink;)V
-HSPLcom/android/okhttp/okio/RealBufferedSink$1;->close()V
-HSPLcom/android/okhttp/okio/RealBufferedSink$1;->flush()V
-HSPLcom/android/okhttp/okio/RealBufferedSink$1;->write([BII)V
-HSPLcom/android/okhttp/okio/RealBufferedSink;-><init>(Lcom/android/okhttp/okio/Sink;)V
-HSPLcom/android/okhttp/okio/RealBufferedSink;-><init>(Lcom/android/okhttp/okio/Sink;Lcom/android/okhttp/okio/Buffer;)V
-HSPLcom/android/okhttp/okio/RealBufferedSink;->access$000(Lcom/android/okhttp/okio/RealBufferedSink;)Z
-HSPLcom/android/okhttp/okio/RealBufferedSink;->buffer()Lcom/android/okhttp/okio/Buffer;
-HSPLcom/android/okhttp/okio/RealBufferedSink;->close()V
-HSPLcom/android/okhttp/okio/RealBufferedSink;->emit()Lcom/android/okhttp/okio/BufferedSink;
-HSPLcom/android/okhttp/okio/RealBufferedSink;->emitCompleteSegments()Lcom/android/okhttp/okio/BufferedSink;
-HSPLcom/android/okhttp/okio/RealBufferedSink;->flush()V
-HSPLcom/android/okhttp/okio/RealBufferedSink;->outputStream()Ljava/io/OutputStream;
-HSPLcom/android/okhttp/okio/RealBufferedSink;->timeout()Lcom/android/okhttp/okio/Timeout;
-HSPLcom/android/okhttp/okio/RealBufferedSink;->write(Lcom/android/okhttp/okio/Buffer;J)V
-HSPLcom/android/okhttp/okio/RealBufferedSink;->writeHexadecimalUnsignedLong(J)Lcom/android/okhttp/okio/BufferedSink;
-HSPLcom/android/okhttp/okio/RealBufferedSink;->writeUtf8(Ljava/lang/String;)Lcom/android/okhttp/okio/BufferedSink;
-HSPLcom/android/okhttp/okio/RealBufferedSource$1;-><init>(Lcom/android/okhttp/okio/RealBufferedSource;)V
-HSPLcom/android/okhttp/okio/RealBufferedSource$1;->available()I
-HSPLcom/android/okhttp/okio/RealBufferedSource$1;->close()V
-HSPLcom/android/okhttp/okio/RealBufferedSource$1;->read()I
-HSPLcom/android/okhttp/okio/RealBufferedSource$1;->read([BII)I
-HSPLcom/android/okhttp/okio/RealBufferedSource;-><init>(Lcom/android/okhttp/okio/Source;)V
-HSPLcom/android/okhttp/okio/RealBufferedSource;-><init>(Lcom/android/okhttp/okio/Source;Lcom/android/okhttp/okio/Buffer;)V
-HSPLcom/android/okhttp/okio/RealBufferedSource;->access$000(Lcom/android/okhttp/okio/RealBufferedSource;)Z
-HSPLcom/android/okhttp/okio/RealBufferedSource;->buffer()Lcom/android/okhttp/okio/Buffer;
-HSPLcom/android/okhttp/okio/RealBufferedSource;->close()V
-HSPLcom/android/okhttp/okio/RealBufferedSource;->exhausted()Z
-HSPLcom/android/okhttp/okio/RealBufferedSource;->indexOf(B)J
-HSPLcom/android/okhttp/okio/RealBufferedSource;->indexOf(BJ)J
-HSPLcom/android/okhttp/okio/RealBufferedSource;->inputStream()Ljava/io/InputStream;
-HSPLcom/android/okhttp/okio/RealBufferedSource;->read(Lcom/android/okhttp/okio/Buffer;J)J
-HSPLcom/android/okhttp/okio/RealBufferedSource;->readHexadecimalUnsignedLong()J
-HSPLcom/android/okhttp/okio/RealBufferedSource;->readIntLe()I
-HSPLcom/android/okhttp/okio/RealBufferedSource;->readShort()S
-HSPLcom/android/okhttp/okio/RealBufferedSource;->readUtf8LineStrict()Ljava/lang/String;
-HSPLcom/android/okhttp/okio/RealBufferedSource;->request(J)Z
-HSPLcom/android/okhttp/okio/RealBufferedSource;->require(J)V
-HSPLcom/android/okhttp/okio/RealBufferedSource;->skip(J)V
-HSPLcom/android/okhttp/okio/RealBufferedSource;->timeout()Lcom/android/okhttp/okio/Timeout;
-HSPLcom/android/okhttp/okio/Segment;-><init>()V
-HSPLcom/android/okhttp/okio/Segment;-><init>(Lcom/android/okhttp/okio/Segment;)V
-HSPLcom/android/okhttp/okio/Segment;-><init>([BII)V
-HSPLcom/android/okhttp/okio/Segment;->compact()V
-HSPLcom/android/okhttp/okio/Segment;->pop()Lcom/android/okhttp/okio/Segment;
-HSPLcom/android/okhttp/okio/Segment;->push(Lcom/android/okhttp/okio/Segment;)Lcom/android/okhttp/okio/Segment;
-HSPLcom/android/okhttp/okio/Segment;->split(I)Lcom/android/okhttp/okio/Segment;
-HSPLcom/android/okhttp/okio/Segment;->writeTo(Lcom/android/okhttp/okio/Segment;I)V
-HSPLcom/android/okhttp/okio/SegmentPool;->recycle(Lcom/android/okhttp/okio/Segment;)V
-HSPLcom/android/okhttp/okio/SegmentPool;->take()Lcom/android/okhttp/okio/Segment;
-HSPLcom/android/okhttp/okio/Timeout;-><init>()V
-HSPLcom/android/okhttp/okio/Timeout;->clearDeadline()Lcom/android/okhttp/okio/Timeout;
-HSPLcom/android/okhttp/okio/Timeout;->clearTimeout()Lcom/android/okhttp/okio/Timeout;
-HSPLcom/android/okhttp/okio/Timeout;->deadlineNanoTime()J
-HSPLcom/android/okhttp/okio/Timeout;->deadlineNanoTime(J)Lcom/android/okhttp/okio/Timeout;
-HSPLcom/android/okhttp/okio/Timeout;->hasDeadline()Z
-HSPLcom/android/okhttp/okio/Timeout;->throwIfReached()V
-HSPLcom/android/okhttp/okio/Timeout;->timeout(JLjava/util/concurrent/TimeUnit;)Lcom/android/okhttp/okio/Timeout;
-HSPLcom/android/okhttp/okio/Timeout;->timeoutNanos()J
-HSPLcom/android/okhttp/okio/Util;->checkOffsetAndCount(JJJ)V
-HSPLcom/android/okhttp/okio/Util;->reverseBytesInt(I)I
-HSPLcom/android/org/bouncycastle/asn1/ASN1BitString;-><init>([BI)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1EncodableVector;-><init>()V
-HSPLcom/android/org/bouncycastle/asn1/ASN1EncodableVector;-><init>(I)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1EncodableVector;->add(Lcom/android/org/bouncycastle/asn1/ASN1Encodable;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1EncodableVector;->get(I)Lcom/android/org/bouncycastle/asn1/ASN1Encodable;
-HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;-><init>(Ljava/io/InputStream;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;-><init>(Ljava/io/InputStream;IZ)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;-><init>([B)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->buildObject(III)Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->createPrimitiveDERObject(ILcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;[[B)Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->getBuffer(Lcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;[[B)[B
-HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->readLength(Ljava/io/InputStream;IZ)I
-HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->readObject()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->readVector(Lcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;)Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;-><init>(Ljava/math/BigInteger;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;Z)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->encodedLength()I
-HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/ASN1Integer;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->getValue()Ljava/math/BigInteger;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->isMalformed([B)Z
-HSPLcom/android/org/bouncycastle/asn1/ASN1Object;->getEncoded()[B
-HSPLcom/android/org/bouncycastle/asn1/ASN1Object;->getEncoded(Ljava/lang/String;)[B
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier$OidHandle;-><init>([B)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier$OidHandle;->equals(Ljava/lang/Object;)Z
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier$OidHandle;->hashCode()I
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;-><init>([B)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->asn1Equals(Lcom/android/org/bouncycastle/asn1/ASN1Primitive;)Z
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->doOutput(Ljava/io/ByteArrayOutputStream;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;Z)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->encodedLength()I
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->getBody()[B
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->hashCode()I
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->toString()Ljava/lang/String;
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->writeField(Ljava/io/ByteArrayOutputStream;J)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;-><init>(Ljava/io/OutputStream;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->write(I)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->write([BII)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->writeEncoded(ZI[B)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->writeLength(I)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->writeObject(Lcom/android/org/bouncycastle/asn1/ASN1Encodable;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Primitive;->equals(Lcom/android/org/bouncycastle/asn1/ASN1Primitive;)Z
-HSPLcom/android/org/bouncycastle/asn1/ASN1Primitive;->fromByteArray([B)Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Primitive;->toASN1Primitive()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Primitive;->toDERObject()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence$1;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1Sequence;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence$1;->nextElement()Ljava/lang/Object;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;-><init>()V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/ASN1Sequence;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;->getObjectAt(I)Lcom/android/org/bouncycastle/asn1/ASN1Encodable;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;->getObjects()Ljava/util/Enumeration;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;->size()I
-HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;->toDERObject()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;-><init>()V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;Z)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/ASN1Set;
-HSPLcom/android/org/bouncycastle/asn1/DERBitString;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/DERBitString;
-HSPLcom/android/org/bouncycastle/asn1/DERNull;->encodedLength()I
-HSPLcom/android/org/bouncycastle/asn1/DEROutputStream;->getDERSubStream()Lcom/android/org/bouncycastle/asn1/DEROutputStream;
-HSPLcom/android/org/bouncycastle/asn1/DERSequence;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;Z)V
-HSPLcom/android/org/bouncycastle/asn1/DERSequence;->encodedLength()I
-HSPLcom/android/org/bouncycastle/asn1/DERSequence;->getBodyLength()I
-HSPLcom/android/org/bouncycastle/asn1/DERSequence;->toDERObject()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/DLFactory;-><clinit>()V
-HSPLcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;->read()I
-HSPLcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;->read([BII)I
-HSPLcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;->toByteArray()[B
-HSPLcom/android/org/bouncycastle/asn1/StreamUtil;->calculateBodyLength(I)I
-HSPLcom/android/org/bouncycastle/asn1/StreamUtil;->findLimit(Ljava/io/InputStream;)I
-HSPLcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;
-HSPLcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;->toASN1Primitive()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;
-HSPLcom/android/org/bouncycastle/crypto/BufferedBlockCipher;->reset()V
-HSPLcom/android/org/bouncycastle/crypto/CryptoServicesRegistrar;->getSecureRandom()Ljava/security/SecureRandom;
-HSPLcom/android/org/bouncycastle/crypto/PBEParametersGenerator;->PKCS12PasswordToBytes([C)[B
-HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$SHA1;-><init>()V
-HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;-><init>(Ljava/lang/String;I)V
-HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->doFinal([BI)I
-HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->getByteLength()I
-HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->getDigestSize()I
-HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->reset()V
-HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->update([BII)V
-HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;-><init>()V
-HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->getAlgorithmName()Ljava/lang/String;
-HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->getBlockSize()I
-HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->init(ZLcom/android/org/bouncycastle/crypto/CipherParameters;)V
-HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->packBlock([BI)V
-HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->reset()V
-HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->shift(II)I
-HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->subWord(I)I
-HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->unpackBlock([BI)V
-HSPLcom/android/org/bouncycastle/crypto/engines/DESEngine;-><clinit>()V
-HSPLcom/android/org/bouncycastle/crypto/engines/DESEngine;-><init>()V
-HSPLcom/android/org/bouncycastle/crypto/engines/DESEngine;->generateWorkingKey(Z[B)[I
-HSPLcom/android/org/bouncycastle/crypto/generators/PKCS12ParametersGenerator;->generateDerivedKey(II)[B
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;-><clinit>()V
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->getMacSize()I
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->init(Lcom/android/org/bouncycastle/crypto/CipherParameters;)V
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->update([BII)V
-HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;-><init>(Lcom/android/org/bouncycastle/crypto/BlockCipher;)V
-HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;->getBlockSize()I
-HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;->init(ZLcom/android/org/bouncycastle/crypto/CipherParameters;)V
-HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;->reset()V
-HSPLcom/android/org/bouncycastle/crypto/paddings/PKCS7Padding;->init(Ljava/security/SecureRandom;)V
-HSPLcom/android/org/bouncycastle/crypto/paddings/PKCS7Padding;->padCount([B)I
-HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;-><init>(Lcom/android/org/bouncycastle/crypto/BlockCipher;Lcom/android/org/bouncycastle/crypto/paddings/BlockCipherPadding;)V
-HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;->doFinal([BI)I
-HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;->getOutputSize(I)I
-HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;->getUpdateOutputSize(I)I
-HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;->init(ZLcom/android/org/bouncycastle/crypto/CipherParameters;)V
-HSPLcom/android/org/bouncycastle/crypto/params/AsymmetricKeyParameter;-><init>(Z)V
-HSPLcom/android/org/bouncycastle/crypto/params/DSAKeyParameters;-><init>(ZLcom/android/org/bouncycastle/crypto/params/DSAParameters;)V
-HSPLcom/android/org/bouncycastle/crypto/params/DSAParameters;-><init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V
-HSPLcom/android/org/bouncycastle/crypto/params/DSAPublicKeyParameters;-><init>(Ljava/math/BigInteger;Lcom/android/org/bouncycastle/crypto/params/DSAParameters;)V
-HSPLcom/android/org/bouncycastle/crypto/params/KeyParameter;-><init>([B)V
-HSPLcom/android/org/bouncycastle/crypto/params/ParametersWithIV;-><init>(Lcom/android/org/bouncycastle/crypto/CipherParameters;[BII)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/DSA$Mappings;->configure(Lcom/android/org/bouncycastle/jcajce/provider/config/ConfigurableProvider;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;->getParams()Ljava/security/interfaces/DSAParams;
-HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;->getY()Ljava/math/BigInteger;
-HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;->hashCode()I
-HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;->readObject(Ljava/io/ObjectInputStream;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/DSAUtil;->toDSAParameters(Ljava/security/interfaces/DSAParams;)Lcom/android/org/bouncycastle/crypto/params/DSAParameters;
-HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$Std;-><init>()V
-HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$StoreEntry;-><init>(Lcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;Ljava/lang/String;Ljava/security/cert/Certificate;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;-><init>(I)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineAliases()Ljava/util/Enumeration;
-HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineGetCertificate(Ljava/lang/String;)Ljava/security/cert/Certificate;
-HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineLoad(Ljava/io/InputStream;[C)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineSetCertificateEntry(Ljava/lang/String;Ljava/security/cert/Certificate;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineSize()I
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/AES$ECB;-><init>()V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/PBES2AlgorithmParameters$Mappings;->configure(Lcom/android/org/bouncycastle/jcajce/provider/config/ConfigurableProvider;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BCPBEKey;-><init>(Ljava/lang/String;Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;IIIILjavax/crypto/spec/PBEKeySpec;Lcom/android/org/bouncycastle/crypto/CipherParameters;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BCPBEKey;->getEncoded()[B
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BCPBEKey;->isDestroyed()Z
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;-><init>(Lcom/android/org/bouncycastle/crypto/BlockCipher;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;->doFinal([BI)I
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;->getOutputSize(I)I
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;->init(ZLcom/android/org/bouncycastle/crypto/CipherParameters;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;->engineDoFinal([BII)[B
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;->engineGetOutputSize(I)I
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;->engineInit(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseWrapCipher;-><init>()V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/PBE$Util;->convertPassword(ILjavax/crypto/spec/PBEKeySpec;)[B
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/PBE$Util;->makePBEGenerator(II)Lcom/android/org/bouncycastle/crypto/PBEParametersGenerator;
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/PBE$Util;->makePBEMacParameters(Ljavax/crypto/spec/PBEKeySpec;III)Lcom/android/org/bouncycastle/crypto/CipherParameters;
-HSPLcom/android/org/bouncycastle/jcajce/util/BCJcaJceHelper;-><init>()V
-HSPLcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider;->addAlgorithm(Ljava/lang/String;Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;Ljava/lang/String;)V
-HSPLcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider;->addAlgorithm(Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider;->addAttributes(Ljava/lang/String;Ljava/util/Map;)V
-HSPLcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider;->loadAlgorithms([Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/org/bouncycastle/jce/provider/CertStoreCollectionSpi;-><init>(Ljava/security/cert/CertStoreParameters;)V
-HSPLcom/android/org/bouncycastle/util/Arrays;->areEqual([B[B)Z
-HSPLcom/android/org/bouncycastle/util/Arrays;->clone([B)[B
-HSPLcom/android/org/bouncycastle/util/Arrays;->constantTimeAreEqual([B[B)Z
-HSPLcom/android/org/bouncycastle/util/Arrays;->fill([BB)V
-HSPLcom/android/org/bouncycastle/util/Arrays;->hashCode([B)I
-HSPLcom/android/org/bouncycastle/util/BigIntegers;-><clinit>()V
-HSPLcom/android/org/bouncycastle/util/Integers;->valueOf(I)Ljava/lang/Integer;
-HSPLcom/android/org/bouncycastle/util/Pack;->littleEndianToInt([BI)I
-HSPLcom/android/org/bouncycastle/util/Properties$1;->run()Ljava/lang/Object;
-HSPLcom/android/org/bouncycastle/util/Properties;->isOverrideSet(Ljava/lang/String;)Z
-HSPLcom/android/org/bouncycastle/util/Strings;->toUpperCase(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;-><init>()V
-HSPLcom/android/org/kxml2/io/KXmlParser;->adjustNsp()Z
-HSPLcom/android/org/kxml2/io/KXmlParser;->close()V
-HSPLcom/android/org/kxml2/io/KXmlParser;->ensureCapacity([Ljava/lang/String;I)[Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;->fillBuffer(I)Z
-HSPLcom/android/org/kxml2/io/KXmlParser;->getAttributeCount()I
-HSPLcom/android/org/kxml2/io/KXmlParser;->getAttributeName(I)Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;->getAttributeValue(I)Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;->getAttributeValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;->getColumnNumber()I
-HSPLcom/android/org/kxml2/io/KXmlParser;->getDepth()I
-HSPLcom/android/org/kxml2/io/KXmlParser;->getEventType()I
-HSPLcom/android/org/kxml2/io/KXmlParser;->getLineNumber()I
-HSPLcom/android/org/kxml2/io/KXmlParser;->getName()Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;->getNamespace()Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;->getNamespace(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;->getNamespaceCount(I)I
-HSPLcom/android/org/kxml2/io/KXmlParser;->getText()Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;->keepNamespaceAttributes()V
-HSPLcom/android/org/kxml2/io/KXmlParser;->next()I
-HSPLcom/android/org/kxml2/io/KXmlParser;->next(Z)I
-HSPLcom/android/org/kxml2/io/KXmlParser;->nextTag()I
-HSPLcom/android/org/kxml2/io/KXmlParser;->nextToken()I
-HSPLcom/android/org/kxml2/io/KXmlParser;->parseStartTag(ZZ)V
-HSPLcom/android/org/kxml2/io/KXmlParser;->peekCharacter()I
-HSPLcom/android/org/kxml2/io/KXmlParser;->peekType(Z)I
-HSPLcom/android/org/kxml2/io/KXmlParser;->read(C)V
-HSPLcom/android/org/kxml2/io/KXmlParser;->read([C)V
-HSPLcom/android/org/kxml2/io/KXmlParser;->readComment(Z)Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;->readEndTag()V
-HSPLcom/android/org/kxml2/io/KXmlParser;->readEntity(Ljava/lang/StringBuilder;ZZLcom/android/org/kxml2/io/KXmlParser$ValueContext;)V
-HSPLcom/android/org/kxml2/io/KXmlParser;->readName()Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;->readUntil([CZ)Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;->readValue(CZZLcom/android/org/kxml2/io/KXmlParser$ValueContext;)Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;->readXmlDeclaration()V
-HSPLcom/android/org/kxml2/io/KXmlParser;->require(ILjava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/org/kxml2/io/KXmlParser;->setFeature(Ljava/lang/String;Z)V
-HSPLcom/android/org/kxml2/io/KXmlParser;->setInput(Ljava/io/InputStream;Ljava/lang/String;)V
-HSPLcom/android/org/kxml2/io/KXmlParser;->setInput(Ljava/io/Reader;)V
-HSPLcom/android/org/kxml2/io/KXmlParser;->skip()V
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->append(C)V
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->append(Ljava/lang/String;)V
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->append(Ljava/lang/String;II)V
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->check(Z)V
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->endDocument()V
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->flush()V
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->flushBuffer()V
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->setOutput(Ljava/io/OutputStream;Ljava/lang/String;)V
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->setOutput(Ljava/io/Writer;)V
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->startDocument(Ljava/lang/String;Ljava/lang/Boolean;)V
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->startTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
-HSPLcom/android/org/kxml2/io/KXmlSerializer;->writeEscaped(Ljava/lang/String;I)V
-HSPLcom/android/server/LocalServices;->getService(Ljava/lang/Class;)Ljava/lang/Object;
-HSPLcom/android/telephony/Rlog;->d(Ljava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/telephony/Rlog;->e(Ljava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/telephony/Rlog;->log(ILjava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/telephony/Rlog;->pii(ZLjava/lang/Object;)Ljava/lang/String;
-HSPLcom/android/telephony/Rlog;->w(Ljava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/text/flags/FeatureFlagsImpl;-><init>()V
-HSPLcom/android/text/flags/Flags;-><clinit>()V
-HSPLcom/android/window/flags/FeatureFlagsImpl;-><init>()V
-HSPLcom/android/window/flags/FeatureFlagsImpl;->bundleClientTransactionFlag()Z
-HSPLcom/android/window/flags/Flags;-><clinit>()V
-HSPLcom/android/window/flags/Flags;->bundleClientTransactionFlag()Z+]Lcom/android/window/flags/FeatureFlags;Lcom/android/window/flags/FeatureFlagsImpl;
-HSPLcom/google/android/collect/Lists;->newArrayList()Ljava/util/ArrayList;
-HSPLcom/google/android/collect/Lists;->newArrayList([Ljava/lang/Object;)Ljava/util/ArrayList;
-HSPLcom/google/android/collect/Maps;->newHashMap()Ljava/util/HashMap;
-HSPLcom/google/android/collect/Sets;->newHashSet()Ljava/util/HashSet;
-HSPLcom/google/android/collect/Sets;->newHashSet([Ljava/lang/Object;)Ljava/util/HashSet;
-HSPLcom/google/android/gles_jni/EGLConfigImpl;-><init>(J)V
-HSPLcom/google/android/gles_jni/EGLContextImpl;->equals(Ljava/lang/Object;)Z
-HSPLcom/google/android/gles_jni/EGLDisplayImpl;->equals(Ljava/lang/Object;)Z
-HSPLcom/google/android/gles_jni/EGLImpl;->eglCreateContext(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljavax/microedition/khronos/egl/EGLContext;[I)Ljavax/microedition/khronos/egl/EGLContext;
-HSPLcom/google/android/gles_jni/EGLImpl;->eglCreatePbufferSurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;[I)Ljavax/microedition/khronos/egl/EGLSurface;
-HSPLcom/google/android/gles_jni/EGLImpl;->eglGetCurrentContext()Ljavax/microedition/khronos/egl/EGLContext;
-HSPLcom/google/android/gles_jni/EGLImpl;->eglGetDisplay(Ljava/lang/Object;)Ljavax/microedition/khronos/egl/EGLDisplay;
-HSPLcom/google/android/gles_jni/EGLSurfaceImpl;-><init>(J)V
-HSPLdalvik/system/AppSpecializationHooks;->handleCompatChangesBeforeBindingApplication()V
-HSPLdalvik/system/BaseDexClassLoader;-><init>(Ljava/lang/String;Ljava/io/File;Ljava/lang/String;Ljava/lang/ClassLoader;)V
-HSPLdalvik/system/BaseDexClassLoader;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;[Ljava/lang/ClassLoader;)V
-HSPLdalvik/system/BaseDexClassLoader;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;[Ljava/lang/ClassLoader;[Ljava/lang/ClassLoader;)V
-HSPLdalvik/system/BaseDexClassLoader;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;[Ljava/lang/ClassLoader;[Ljava/lang/ClassLoader;Z)V
-HSPLdalvik/system/BaseDexClassLoader;->addNativePath(Ljava/util/Collection;)V
-HSPLdalvik/system/BaseDexClassLoader;->findClass(Ljava/lang/String;)Ljava/lang/Class;
-HSPLdalvik/system/BaseDexClassLoader;->findLibrary(Ljava/lang/String;)Ljava/lang/String;
-HSPLdalvik/system/BaseDexClassLoader;->findResource(Ljava/lang/String;)Ljava/net/URL;
-HSPLdalvik/system/BaseDexClassLoader;->findResources(Ljava/lang/String;)Ljava/util/Enumeration;
-HSPLdalvik/system/BaseDexClassLoader;->getLdLibraryPath()Ljava/lang/String;
-HSPLdalvik/system/BaseDexClassLoader;->getPackage(Ljava/lang/String;)Ljava/lang/Package;
-HSPLdalvik/system/BaseDexClassLoader;->reportClassLoaderChain()V
-HSPLdalvik/system/BaseDexClassLoader;->setReporter(Ldalvik/system/BaseDexClassLoader$Reporter;)V
-HSPLdalvik/system/BaseDexClassLoader;->toString()Ljava/lang/String;
-HSPLdalvik/system/BlockGuard$1;->onExplicitGc()V
-HSPLdalvik/system/BlockGuard$1;->onNetwork()V
-HSPLdalvik/system/BlockGuard$1;->onReadFromDisk()V
-HSPLdalvik/system/BlockGuard$1;->onUnbufferedIO()V
-HSPLdalvik/system/BlockGuard$1;->onWriteToDisk()V
-HSPLdalvik/system/BlockGuard$2;->onPathAccess(Ljava/lang/String;)V
-HSPLdalvik/system/BlockGuard$3;->initialValue()Ldalvik/system/BlockGuard$Policy;
-HSPLdalvik/system/BlockGuard$3;->initialValue()Ljava/lang/Object;
-HSPLdalvik/system/BlockGuard;->getThreadPolicy()Ldalvik/system/BlockGuard$Policy;
-HSPLdalvik/system/BlockGuard;->getVmPolicy()Ldalvik/system/BlockGuard$VmPolicy;
-HSPLdalvik/system/BlockGuard;->setThreadPolicy(Ldalvik/system/BlockGuard$Policy;)V
-HSPLdalvik/system/BlockGuard;->setVmPolicy(Ldalvik/system/BlockGuard$VmPolicy;)V
-HSPLdalvik/system/CloseGuard;-><init>()V
-HSPLdalvik/system/CloseGuard;->close()V
-HSPLdalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard;
-HSPLdalvik/system/CloseGuard;->getReporter()Ldalvik/system/CloseGuard$Reporter;
-HSPLdalvik/system/CloseGuard;->open(Ljava/lang/String;)V
-HSPLdalvik/system/CloseGuard;->openWithCallSite(Ljava/lang/String;Ljava/lang/String;)V
-HSPLdalvik/system/CloseGuard;->setEnabled(Z)V
-HSPLdalvik/system/CloseGuard;->setReporter(Ldalvik/system/CloseGuard$Reporter;)V
-HSPLdalvik/system/CloseGuard;->warnIfOpen()V
-HSPLdalvik/system/DelegateLastClassLoader;-><init>(Ljava/lang/String;Ljava/lang/ClassLoader;)V
-HSPLdalvik/system/DelegateLastClassLoader;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Z)V
-HSPLdalvik/system/DelegateLastClassLoader;->loadClass(Ljava/lang/String;Z)Ljava/lang/Class;
-HSPLdalvik/system/DexClassLoader;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V
-HSPLdalvik/system/DexFile;-><init>(Ljava/io/File;Ljava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)V
-HSPLdalvik/system/DexFile;-><init>(Ljava/lang/String;Ljava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)V
-HSPLdalvik/system/DexFile;->defineClass(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/Object;Ldalvik/system/DexFile;Ljava/util/List;)Ljava/lang/Class;
-HSPLdalvik/system/DexFile;->finalize()V
-HSPLdalvik/system/DexFile;->isBackedByOatFile()Z
-HSPLdalvik/system/DexFile;->loadClassBinaryName(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/List;)Ljava/lang/Class;
-HSPLdalvik/system/DexFile;->openDexFile(Ljava/lang/String;Ljava/lang/String;ILjava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)Ljava/lang/Object;
-HSPLdalvik/system/DexFile;->verifyInBackground(Ljava/lang/ClassLoader;)V
-HSPLdalvik/system/DexPathList$Element;->-$$Nest$fgetdexFile(Ldalvik/system/DexPathList$Element;)Ldalvik/system/DexFile;
-HSPLdalvik/system/DexPathList$Element;-><init>(Ldalvik/system/DexFile;Ljava/io/File;)V
-HSPLdalvik/system/DexPathList$Element;-><init>(Ljava/io/File;)V
-HSPLdalvik/system/DexPathList$Element;->findClass(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/List;)Ljava/lang/Class;
-HSPLdalvik/system/DexPathList$Element;->findResource(Ljava/lang/String;)Ljava/net/URL;
-HSPLdalvik/system/DexPathList$Element;->maybeInit()V
-HSPLdalvik/system/DexPathList$Element;->toString()Ljava/lang/String;
-HSPLdalvik/system/DexPathList$NativeLibraryElement;-><init>(Ljava/io/File;)V
-HSPLdalvik/system/DexPathList$NativeLibraryElement;-><init>(Ljava/io/File;Ljava/lang/String;)V
-HSPLdalvik/system/DexPathList$NativeLibraryElement;->equals(Ljava/lang/Object;)Z
-HSPLdalvik/system/DexPathList$NativeLibraryElement;->findNativeLibrary(Ljava/lang/String;)Ljava/lang/String;
-HSPLdalvik/system/DexPathList$NativeLibraryElement;->maybeInit()V
-HSPLdalvik/system/DexPathList;-><init>(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Z)V
-HSPLdalvik/system/DexPathList;->addNativePath(Ljava/util/Collection;)V
-HSPLdalvik/system/DexPathList;->findClass(Ljava/lang/String;Ljava/util/List;)Ljava/lang/Class;
-HSPLdalvik/system/DexPathList;->findLibrary(Ljava/lang/String;)Ljava/lang/String;
-HSPLdalvik/system/DexPathList;->findResource(Ljava/lang/String;)Ljava/net/URL;
-HSPLdalvik/system/DexPathList;->findResources(Ljava/lang/String;)Ljava/util/Enumeration;
-HSPLdalvik/system/DexPathList;->getAllNativeLibraryDirectories()Ljava/util/List;
-HSPLdalvik/system/DexPathList;->getNativeLibraryDirectories()Ljava/util/List;
-HSPLdalvik/system/DexPathList;->loadDexFile(Ljava/io/File;Ljava/io/File;Ljava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)Ldalvik/system/DexFile;
-HSPLdalvik/system/DexPathList;->makeDexElements(Ljava/util/List;Ljava/io/File;Ljava/util/List;Ljava/lang/ClassLoader;Z)[Ldalvik/system/DexPathList$Element;
-HSPLdalvik/system/DexPathList;->makePathElements(Ljava/util/List;)[Ldalvik/system/DexPathList$NativeLibraryElement;
-HSPLdalvik/system/DexPathList;->maybeRunBackgroundVerification(Ljava/lang/ClassLoader;)V
-HSPLdalvik/system/DexPathList;->splitDexPath(Ljava/lang/String;)Ljava/util/List;
-HSPLdalvik/system/DexPathList;->splitPaths(Ljava/lang/String;Z)Ljava/util/List;
-HSPLdalvik/system/DexPathList;->toString()Ljava/lang/String;
-HSPLdalvik/system/PathClassLoader;-><init>(Ljava/lang/String;Ljava/lang/ClassLoader;)V
-HSPLdalvik/system/PathClassLoader;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V
-HSPLdalvik/system/PathClassLoader;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;[Ljava/lang/ClassLoader;)V
-HSPLdalvik/system/PathClassLoader;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;[Ljava/lang/ClassLoader;[Ljava/lang/ClassLoader;)V
-HSPLdalvik/system/RuntimeHooks;->getTimeZoneIdSupplier()Ljava/util/function/Supplier;
-HSPLdalvik/system/RuntimeHooks;->setTimeZoneIdSupplier(Ljava/util/function/Supplier;)V
-HSPLdalvik/system/RuntimeHooks;->setUncaughtExceptionPreHandler(Ljava/lang/Thread$UncaughtExceptionHandler;)V
-HSPLdalvik/system/SocketTagger;-><init>()V
-HSPLdalvik/system/SocketTagger;->get()Ldalvik/system/SocketTagger;
-HSPLdalvik/system/SocketTagger;->set(Ldalvik/system/SocketTagger;)V
-HSPLdalvik/system/SocketTagger;->tag(Ljava/net/Socket;)V
-HSPLdalvik/system/SocketTagger;->untag(Ljava/net/Socket;)V
-HSPLdalvik/system/VMRuntime$SdkVersionContainer;->-$$Nest$sfgetsdkVersion()I
-HSPLdalvik/system/VMRuntime;->getInstructionSet(Ljava/lang/String;)Ljava/lang/String;
-HSPLdalvik/system/VMRuntime;->getRuntime()Ldalvik/system/VMRuntime;
-HSPLdalvik/system/VMRuntime;->getSdkVersion()I
-HSPLdalvik/system/VMRuntime;->getTargetSdkVersion()I
-HSPLdalvik/system/VMRuntime;->hiddenApiUsed(ILjava/lang/String;Ljava/lang/String;IZ)V
-HSPLdalvik/system/VMRuntime;->notifyNativeAllocation()V
-HSPLdalvik/system/VMRuntime;->registerNativeAllocation(I)V
-HSPLdalvik/system/VMRuntime;->registerNativeFree(I)V
-HSPLdalvik/system/VMRuntime;->runFinalization(J)V
-HSPLdalvik/system/VMRuntime;->runFinalizationSync()V
-HSPLdalvik/system/VMRuntime;->setDisabledCompatChanges([J)V
-HSPLdalvik/system/VMRuntime;->setHiddenApiUsageLogger(Ldalvik/system/VMRuntime$HiddenApiUsageLogger;)V
-HSPLdalvik/system/VMRuntime;->setNonSdkApiUsageConsumer(Ljava/util/function/Consumer;)V
-HSPLdalvik/system/VMRuntime;->setTargetSdkVersion(I)V
-HSPLdalvik/system/ZipPathValidator$Callback;->onZipEntryAccess(Ljava/lang/String;)V
-HSPLdalvik/system/ZipPathValidator;->clearCallback()V
-HSPLdalvik/system/ZipPathValidator;->getInstance()Ldalvik/system/ZipPathValidator$Callback;
-HSPLdalvik/system/ZipPathValidator;->isClear()Z
-HSPLdalvik/system/ZipPathValidator;->setCallback(Ldalvik/system/ZipPathValidator$Callback;)V
-HSPLdalvik/system/ZygoteHooks;->cleanLocaleCaches()V
-HSPLdalvik/system/ZygoteHooks;->gcAndFinalize()V
-HSPLdalvik/system/ZygoteHooks;->isIndefiniteThreadSuspensionSafe()Z
-HSPLdalvik/system/ZygoteHooks;->onEndPreload()V
-HSPLdalvik/system/ZygoteHooks;->postForkChild(IZZLjava/lang/String;)V
-HSPLdalvik/system/ZygoteHooks;->postForkCommon()V
-HSPLdalvik/system/ZygoteHooks;->preFork()V
-HSPLjava/io/Bits;->getBoolean([BI)Z
-HSPLjava/io/Bits;->getDouble([BI)D
-HSPLjava/io/Bits;->getFloat([BI)F
-HSPLjava/io/Bits;->getInt([BI)I
-HSPLjava/io/Bits;->getLong([BI)J
-HSPLjava/io/Bits;->getShort([BI)S
-HSPLjava/io/Bits;->putBoolean([BIZ)V
-HSPLjava/io/Bits;->putDouble([BID)V
-HSPLjava/io/Bits;->putFloat([BIF)V
-HSPLjava/io/Bits;->putInt([BII)V
-HSPLjava/io/Bits;->putLong([BIJ)V
-HSPLjava/io/Bits;->putShort([BIS)V
-HSPLjava/io/BufferedInputStream;-><init>(Ljava/io/InputStream;)V
-HSPLjava/io/BufferedInputStream;-><init>(Ljava/io/InputStream;I)V
-HSPLjava/io/BufferedInputStream;->available()I
-HSPLjava/io/BufferedInputStream;->close()V
-HSPLjava/io/BufferedInputStream;->fill()V
-HSPLjava/io/BufferedInputStream;->getBufIfOpen()[B
-HSPLjava/io/BufferedInputStream;->getInIfOpen()Ljava/io/InputStream;
-HSPLjava/io/BufferedInputStream;->mark(I)V
-HSPLjava/io/BufferedInputStream;->markSupported()Z
-HSPLjava/io/BufferedInputStream;->read()I
-HSPLjava/io/BufferedInputStream;->read([BII)I
-HSPLjava/io/BufferedInputStream;->read1([BII)I
-HSPLjava/io/BufferedInputStream;->reset()V
-HSPLjava/io/BufferedInputStream;->skip(J)J
-HSPLjava/io/BufferedOutputStream;-><init>(Ljava/io/OutputStream;)V
-HSPLjava/io/BufferedOutputStream;-><init>(Ljava/io/OutputStream;I)V
-HSPLjava/io/BufferedOutputStream;->flush()V
-HSPLjava/io/BufferedOutputStream;->flushBuffer()V
-HSPLjava/io/BufferedOutputStream;->write(I)V
-HSPLjava/io/BufferedOutputStream;->write([BII)V
-HSPLjava/io/BufferedReader;-><init>(Ljava/io/Reader;)V
-HSPLjava/io/BufferedReader;-><init>(Ljava/io/Reader;I)V
-HSPLjava/io/BufferedReader;->close()V
-HSPLjava/io/BufferedReader;->ensureOpen()V
-HSPLjava/io/BufferedReader;->fill()V
-HSPLjava/io/BufferedReader;->read()I
-HSPLjava/io/BufferedReader;->read([CII)I
-HSPLjava/io/BufferedReader;->read1([CII)I
-HSPLjava/io/BufferedReader;->readLine()Ljava/lang/String;
-HSPLjava/io/BufferedReader;->readLine(Z)Ljava/lang/String;
-HSPLjava/io/BufferedWriter;-><init>(Ljava/io/Writer;)V
-HSPLjava/io/BufferedWriter;-><init>(Ljava/io/Writer;I)V
-HSPLjava/io/BufferedWriter;->close()V
-HSPLjava/io/BufferedWriter;->ensureOpen()V
-HSPLjava/io/BufferedWriter;->flush()V
-HSPLjava/io/BufferedWriter;->flushBuffer()V
-HSPLjava/io/BufferedWriter;->min(II)I
-HSPLjava/io/BufferedWriter;->newLine()V
-HSPLjava/io/BufferedWriter;->write(I)V
-HSPLjava/io/BufferedWriter;->write(Ljava/lang/String;II)V
-HSPLjava/io/BufferedWriter;->write([CII)V
-HSPLjava/io/ByteArrayInputStream;-><init>([B)V
-HSPLjava/io/ByteArrayInputStream;-><init>([BII)V
-HSPLjava/io/ByteArrayInputStream;->available()I
-HSPLjava/io/ByteArrayInputStream;->close()V
-HSPLjava/io/ByteArrayInputStream;->mark(I)V
-HSPLjava/io/ByteArrayInputStream;->markSupported()Z
-HSPLjava/io/ByteArrayInputStream;->read()I
-HSPLjava/io/ByteArrayInputStream;->read([BII)I
-HSPLjava/io/ByteArrayInputStream;->reset()V
-HSPLjava/io/ByteArrayInputStream;->skip(J)J
-HSPLjava/io/ByteArrayOutputStream;-><init>()V
-HSPLjava/io/ByteArrayOutputStream;-><init>(I)V
-HSPLjava/io/ByteArrayOutputStream;->close()V
-HSPLjava/io/ByteArrayOutputStream;->ensureCapacity(I)V
-HSPLjava/io/ByteArrayOutputStream;->grow(I)V
-HSPLjava/io/ByteArrayOutputStream;->reset()V
-HSPLjava/io/ByteArrayOutputStream;->size()I
-HSPLjava/io/ByteArrayOutputStream;->toByteArray()[B
-HSPLjava/io/ByteArrayOutputStream;->toString()Ljava/lang/String;
-HSPLjava/io/ByteArrayOutputStream;->toString(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/io/ByteArrayOutputStream;->write(I)V
-HSPLjava/io/ByteArrayOutputStream;->write([BII)V
-HSPLjava/io/ByteArrayOutputStream;->writeTo(Ljava/io/OutputStream;)V
-HSPLjava/io/CharArrayWriter;-><init>()V
-HSPLjava/io/CharArrayWriter;-><init>(I)V
-HSPLjava/io/CharArrayWriter;->flush()V
-HSPLjava/io/CharArrayWriter;->reset()V
-HSPLjava/io/CharArrayWriter;->toCharArray()[C
-HSPLjava/io/CharArrayWriter;->toString()Ljava/lang/String;
-HSPLjava/io/CharArrayWriter;->write(I)V
-HSPLjava/io/CharArrayWriter;->write([CII)V
-HSPLjava/io/DataInputStream;-><init>(Ljava/io/InputStream;)V
-HSPLjava/io/DataInputStream;->read([B)I
-HSPLjava/io/DataInputStream;->read([BII)I
-HSPLjava/io/DataInputStream;->readBoolean()Z
-HSPLjava/io/DataInputStream;->readByte()B
-HSPLjava/io/DataInputStream;->readFully([B)V
-HSPLjava/io/DataInputStream;->readFully([BII)V
-HSPLjava/io/DataInputStream;->readInt()I
-HSPLjava/io/DataInputStream;->readLong()J
-HSPLjava/io/DataInputStream;->readShort()S
-HSPLjava/io/DataInputStream;->readUTF()Ljava/lang/String;
-HSPLjava/io/DataInputStream;->readUTF(Ljava/io/DataInput;)Ljava/lang/String;
-HSPLjava/io/DataInputStream;->readUnsignedByte()I
-HSPLjava/io/DataInputStream;->readUnsignedShort()I
-HSPLjava/io/DataInputStream;->skipBytes(I)I
-HSPLjava/io/DataOutputStream;-><init>(Ljava/io/OutputStream;)V
-HSPLjava/io/DataOutputStream;->flush()V
-HSPLjava/io/DataOutputStream;->incCount(I)V
-HSPLjava/io/DataOutputStream;->write(I)V
-HSPLjava/io/DataOutputStream;->write([BII)V
-HSPLjava/io/DataOutputStream;->writeBoolean(Z)V
-HSPLjava/io/DataOutputStream;->writeByte(I)V
-HSPLjava/io/DataOutputStream;->writeInt(I)V
-HSPLjava/io/DataOutputStream;->writeLong(J)V
-HSPLjava/io/DataOutputStream;->writeShort(I)V
-HSPLjava/io/DataOutputStream;->writeUTF(Ljava/lang/String;)V
-HSPLjava/io/DataOutputStream;->writeUTF(Ljava/lang/String;Ljava/io/DataOutput;)I
-HSPLjava/io/EOFException;-><init>()V
-HSPLjava/io/EOFException;-><init>(Ljava/lang/String;)V
-HSPLjava/io/ExpiringCache;->clear()V
-HSPLjava/io/File$TempDirectory;->generateFile(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)Ljava/io/File;
-HSPLjava/io/File;-><init>(Ljava/io/File;Ljava/lang/String;)V
-HSPLjava/io/File;-><init>(Ljava/lang/String;)V
-HSPLjava/io/File;-><init>(Ljava/lang/String;I)V
-HSPLjava/io/File;-><init>(Ljava/lang/String;Ljava/io/File;)V
-HSPLjava/io/File;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/io/File;->canExecute()Z
-HSPLjava/io/File;->canRead()Z
-HSPLjava/io/File;->canWrite()Z
-HSPLjava/io/File;->compareTo(Ljava/io/File;)I
-HSPLjava/io/File;->compareTo(Ljava/lang/Object;)I
-HSPLjava/io/File;->createNewFile()Z
-HSPLjava/io/File;->createTempFile(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)Ljava/io/File;
-HSPLjava/io/File;->delete()Z
-HSPLjava/io/File;->equals(Ljava/lang/Object;)Z
-HSPLjava/io/File;->exists()Z
-HSPLjava/io/File;->getAbsoluteFile()Ljava/io/File;
-HSPLjava/io/File;->getAbsolutePath()Ljava/lang/String;
-HSPLjava/io/File;->getCanonicalFile()Ljava/io/File;
-HSPLjava/io/File;->getCanonicalPath()Ljava/lang/String;
-HSPLjava/io/File;->getFreeSpace()J
-HSPLjava/io/File;->getName()Ljava/lang/String;
-HSPLjava/io/File;->getParent()Ljava/lang/String;
-HSPLjava/io/File;->getParentFile()Ljava/io/File;
-HSPLjava/io/File;->getPath()Ljava/lang/String;
-HSPLjava/io/File;->getPrefixLength()I
-HSPLjava/io/File;->getTotalSpace()J
-HSPLjava/io/File;->getUsableSpace()J
-HSPLjava/io/File;->hashCode()I
-HSPLjava/io/File;->isAbsolute()Z
-HSPLjava/io/File;->isDirectory()Z
-HSPLjava/io/File;->isFile()Z
-HSPLjava/io/File;->isInvalid()Z
-HSPLjava/io/File;->lastModified()J
-HSPLjava/io/File;->length()J
-HSPLjava/io/File;->list()[Ljava/lang/String;
-HSPLjava/io/File;->list(Ljava/io/FilenameFilter;)[Ljava/lang/String;
-HSPLjava/io/File;->listFiles()[Ljava/io/File;
-HSPLjava/io/File;->listFiles(Ljava/io/FileFilter;)[Ljava/io/File;
-HSPLjava/io/File;->listFiles(Ljava/io/FilenameFilter;)[Ljava/io/File;
-HSPLjava/io/File;->mkdir()Z
-HSPLjava/io/File;->mkdirs()Z
-HSPLjava/io/File;->renameTo(Ljava/io/File;)Z
-HSPLjava/io/File;->setExecutable(Z)Z
-HSPLjava/io/File;->setExecutable(ZZ)Z
-HSPLjava/io/File;->setLastModified(J)Z
-HSPLjava/io/File;->setReadable(Z)Z
-HSPLjava/io/File;->setReadable(ZZ)Z
-HSPLjava/io/File;->setWritable(Z)Z
-HSPLjava/io/File;->setWritable(ZZ)Z
-HSPLjava/io/File;->slashify(Ljava/lang/String;Z)Ljava/lang/String;
-HSPLjava/io/File;->toPath()Ljava/nio/file/Path;
-HSPLjava/io/File;->toString()Ljava/lang/String;
-HSPLjava/io/File;->toURI()Ljava/net/URI;
-HSPLjava/io/FileDescriptor$1;->set(Ljava/io/FileDescriptor;I)V
-HSPLjava/io/FileDescriptor;-><init>()V
-HSPLjava/io/FileDescriptor;->cloneForFork()V
-HSPLjava/io/FileDescriptor;->getInt$()I
-HSPLjava/io/FileDescriptor;->getOwnerId$()J
-HSPLjava/io/FileDescriptor;->isSocket$()Z
-HSPLjava/io/FileDescriptor;->release$()Ljava/io/FileDescriptor;
-HSPLjava/io/FileDescriptor;->setInt$(I)V
-HSPLjava/io/FileDescriptor;->setOwnerId$(J)V
-HSPLjava/io/FileDescriptor;->valid()Z
-HSPLjava/io/FileInputStream;-><init>(Ljava/io/File;)V
-HSPLjava/io/FileInputStream;-><init>(Ljava/io/FileDescriptor;)V
-HSPLjava/io/FileInputStream;-><init>(Ljava/io/FileDescriptor;Z)V
-HSPLjava/io/FileInputStream;-><init>(Ljava/lang/String;)V
-HSPLjava/io/FileInputStream;->available()I
-HSPLjava/io/FileInputStream;->close()V
-HSPLjava/io/FileInputStream;->finalize()V
-HSPLjava/io/FileInputStream;->getChannel()Ljava/nio/channels/FileChannel;
-HSPLjava/io/FileInputStream;->getFD()Ljava/io/FileDescriptor;
-HSPLjava/io/FileInputStream;->read()I
-HSPLjava/io/FileInputStream;->read([B)I
-HSPLjava/io/FileInputStream;->read([BII)I
-HSPLjava/io/FileInputStream;->skip(J)J
-HSPLjava/io/FileNotFoundException;-><init>(Ljava/lang/String;)V
-HSPLjava/io/FileOutputStream;-><init>(Ljava/io/File;)V
-HSPLjava/io/FileOutputStream;-><init>(Ljava/io/File;Z)V
-HSPLjava/io/FileOutputStream;-><init>(Ljava/io/FileDescriptor;)V
-HSPLjava/io/FileOutputStream;-><init>(Ljava/io/FileDescriptor;Z)V
-HSPLjava/io/FileOutputStream;-><init>(Ljava/lang/String;)V
-HSPLjava/io/FileOutputStream;-><init>(Ljava/lang/String;Z)V
-HSPLjava/io/FileOutputStream;->close()V
-HSPLjava/io/FileOutputStream;->finalize()V
-HSPLjava/io/FileOutputStream;->getChannel()Ljava/nio/channels/FileChannel;
-HSPLjava/io/FileOutputStream;->getFD()Ljava/io/FileDescriptor;
-HSPLjava/io/FileOutputStream;->write(I)V
-HSPLjava/io/FileOutputStream;->write([B)V
-HSPLjava/io/FileOutputStream;->write([BII)V
-HSPLjava/io/FileReader;-><init>(Ljava/io/File;)V
-HSPLjava/io/FileReader;-><init>(Ljava/lang/String;)V
-HSPLjava/io/FileWriter;-><init>(Ljava/io/File;)V
-HSPLjava/io/FileWriter;-><init>(Ljava/io/File;Z)V
-HSPLjava/io/FilterInputStream;-><init>(Ljava/io/InputStream;)V
-HSPLjava/io/FilterInputStream;->available()I
-HSPLjava/io/FilterInputStream;->close()V
-HSPLjava/io/FilterInputStream;->mark(I)V
-HSPLjava/io/FilterInputStream;->markSupported()Z
-HSPLjava/io/FilterInputStream;->read()I
-HSPLjava/io/FilterInputStream;->read([B)I
-HSPLjava/io/FilterInputStream;->read([BII)I
-HSPLjava/io/FilterInputStream;->reset()V
-HSPLjava/io/FilterInputStream;->skip(J)J
-HSPLjava/io/FilterOutputStream;-><init>(Ljava/io/OutputStream;)V
-HSPLjava/io/FilterOutputStream;->close()V
-HSPLjava/io/FilterOutputStream;->flush()V
-HSPLjava/io/FilterOutputStream;->write([B)V
-HSPLjava/io/FilterReader;-><init>(Ljava/io/Reader;)V
-HSPLjava/io/FilterReader;->read()I
-HSPLjava/io/IOException;-><init>()V
-HSPLjava/io/IOException;-><init>(Ljava/lang/String;)V
-HSPLjava/io/IOException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/io/IOException;-><init>(Ljava/lang/Throwable;)V
-HSPLjava/io/InputStream;-><init>()V
-HSPLjava/io/InputStream;->available()I
-HSPLjava/io/InputStream;->close()V
-HSPLjava/io/InputStream;->markSupported()Z
-HSPLjava/io/InputStream;->read([B)I
-HSPLjava/io/InputStream;->read([BII)I
-HSPLjava/io/InputStreamReader;-><init>(Ljava/io/InputStream;)V
-HSPLjava/io/InputStreamReader;-><init>(Ljava/io/InputStream;Ljava/lang/String;)V
-HSPLjava/io/InputStreamReader;-><init>(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V
-HSPLjava/io/InputStreamReader;-><init>(Ljava/io/InputStream;Ljava/nio/charset/CharsetDecoder;)V
-HSPLjava/io/InputStreamReader;->close()V
-HSPLjava/io/InputStreamReader;->read()I
-HSPLjava/io/InputStreamReader;->read([CII)I
-HSPLjava/io/InputStreamReader;->ready()Z
-HSPLjava/io/InterruptedIOException;-><init>()V
-HSPLjava/io/InterruptedIOException;-><init>(Ljava/lang/String;)V
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;-><init>(Ljava/io/ObjectInputStream;Ljava/io/InputStream;)V
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->close()V
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->currentBlockRemaining()I
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->getBlockDataMode()Z
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->peek()I
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->peekByte()B
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->read()I
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->read([BII)I
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->read([BIIZ)I
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readBlockHeader(Z)I
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readBoolean()Z
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readByte()B
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readFloat()F
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readFully([BIIZ)V
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readInt()I
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readLong()J
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readShort()S
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readUTF()Ljava/lang/String;
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readUTFBody(J)Ljava/lang/String;
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readUTFChar(Ljava/lang/StringBuilder;J)I
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readUTFSpan(Ljava/lang/StringBuilder;J)J
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readUnsignedShort()I
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->refill()V
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->setBlockDataMode(Z)Z
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->skipBlockData()V
-HSPLjava/io/ObjectInputStream$GetField;-><init>()V
-HSPLjava/io/ObjectInputStream$GetFieldImpl;-><init>(Ljava/io/ObjectInputStream;Ljava/io/ObjectStreamClass;)V
-HSPLjava/io/ObjectInputStream$GetFieldImpl;->get(Ljava/lang/String;D)D
-HSPLjava/io/ObjectInputStream$GetFieldImpl;->get(Ljava/lang/String;I)I
-HSPLjava/io/ObjectInputStream$GetFieldImpl;->get(Ljava/lang/String;J)J
-HSPLjava/io/ObjectInputStream$GetFieldImpl;->get(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/io/ObjectInputStream$GetFieldImpl;->get(Ljava/lang/String;Z)Z
-HSPLjava/io/ObjectInputStream$GetFieldImpl;->getFieldOffset(Ljava/lang/String;Ljava/lang/Class;)I
-HSPLjava/io/ObjectInputStream$GetFieldImpl;->readFields()V
-HSPLjava/io/ObjectInputStream$HandleTable$HandleList;-><init>()V
-HSPLjava/io/ObjectInputStream$HandleTable$HandleList;->add(I)V
-HSPLjava/io/ObjectInputStream$HandleTable;-><init>(I)V
-HSPLjava/io/ObjectInputStream$HandleTable;->assign(Ljava/lang/Object;)I
-HSPLjava/io/ObjectInputStream$HandleTable;->clear()V
-HSPLjava/io/ObjectInputStream$HandleTable;->finish(I)V
-HSPLjava/io/ObjectInputStream$HandleTable;->grow()V
-HSPLjava/io/ObjectInputStream$HandleTable;->lookupException(I)Ljava/lang/ClassNotFoundException;
-HSPLjava/io/ObjectInputStream$HandleTable;->lookupObject(I)Ljava/lang/Object;
-HSPLjava/io/ObjectInputStream$HandleTable;->markDependency(II)V
-HSPLjava/io/ObjectInputStream$HandleTable;->setObject(ILjava/lang/Object;)V
-HSPLjava/io/ObjectInputStream$HandleTable;->size()I
-HSPLjava/io/ObjectInputStream$PeekInputStream;-><init>(Ljava/io/InputStream;)V
-HSPLjava/io/ObjectInputStream$PeekInputStream;->close()V
-HSPLjava/io/ObjectInputStream$PeekInputStream;->peek()I
-HSPLjava/io/ObjectInputStream$PeekInputStream;->read()I
-HSPLjava/io/ObjectInputStream$PeekInputStream;->read([BII)I
-HSPLjava/io/ObjectInputStream$PeekInputStream;->readFully([BII)V
-HSPLjava/io/ObjectInputStream$ValidationList;-><init>()V
-HSPLjava/io/ObjectInputStream$ValidationList;->clear()V
-HSPLjava/io/ObjectInputStream$ValidationList;->doCallbacks()V
-HSPLjava/io/ObjectInputStream;-><init>(Ljava/io/InputStream;)V
-HSPLjava/io/ObjectInputStream;->checkResolve(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/io/ObjectInputStream;->clear()V
-HSPLjava/io/ObjectInputStream;->close()V
-HSPLjava/io/ObjectInputStream;->defaultReadFields(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V
-HSPLjava/io/ObjectInputStream;->defaultReadObject()V
-HSPLjava/io/ObjectInputStream;->isCustomSubclass()Z
-HSPLjava/io/ObjectInputStream;->latestUserDefinedLoader()Ljava/lang/ClassLoader;
-HSPLjava/io/ObjectInputStream;->readArray(Z)Ljava/lang/Object;
-HSPLjava/io/ObjectInputStream;->readBoolean()Z
-HSPLjava/io/ObjectInputStream;->readByte()B
-HSPLjava/io/ObjectInputStream;->readClassDesc(Z)Ljava/io/ObjectStreamClass;
-HSPLjava/io/ObjectInputStream;->readClassDescriptor()Ljava/io/ObjectStreamClass;
-HSPLjava/io/ObjectInputStream;->readEnum(Z)Ljava/lang/Enum;
-HSPLjava/io/ObjectInputStream;->readFields()Ljava/io/ObjectInputStream$GetField;
-HSPLjava/io/ObjectInputStream;->readFloat()F
-HSPLjava/io/ObjectInputStream;->readHandle(Z)Ljava/lang/Object;
-HSPLjava/io/ObjectInputStream;->readInt()I
-HSPLjava/io/ObjectInputStream;->readLong()J
-HSPLjava/io/ObjectInputStream;->readNonProxyDesc(Z)Ljava/io/ObjectStreamClass;
-HSPLjava/io/ObjectInputStream;->readNull()Ljava/lang/Object;
-HSPLjava/io/ObjectInputStream;->readObject()Ljava/lang/Object;
-HSPLjava/io/ObjectInputStream;->readObject0(Z)Ljava/lang/Object;
-HSPLjava/io/ObjectInputStream;->readOrdinaryObject(Z)Ljava/lang/Object;
-HSPLjava/io/ObjectInputStream;->readSerialData(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V
-HSPLjava/io/ObjectInputStream;->readShort()S
-HSPLjava/io/ObjectInputStream;->readStreamHeader()V
-HSPLjava/io/ObjectInputStream;->readString(Z)Ljava/lang/String;
-HSPLjava/io/ObjectInputStream;->readTypeString()Ljava/lang/String;
-HSPLjava/io/ObjectInputStream;->readUTF()Ljava/lang/String;
-HSPLjava/io/ObjectInputStream;->resolveClass(Ljava/io/ObjectStreamClass;)Ljava/lang/Class;
-HSPLjava/io/ObjectInputStream;->skipCustomData()V
-HSPLjava/io/ObjectInputStream;->verifySubclass()V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;-><init>(Ljava/io/OutputStream;)V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->close()V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->drain()V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->flush()V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->getUTFLength(Ljava/lang/String;)J
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->setBlockDataMode(Z)Z
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->warnIfClosed()V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->write([BIIZ)V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeBlockHeader(I)V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeByte(I)V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeBytes(Ljava/lang/String;)V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeFloat(F)V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeInt(I)V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeLong(J)V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeShort(I)V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeUTF(Ljava/lang/String;)V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeUTF(Ljava/lang/String;J)V
-HSPLjava/io/ObjectOutputStream$HandleTable;-><init>(IF)V
-HSPLjava/io/ObjectOutputStream$HandleTable;->assign(Ljava/lang/Object;)I
-HSPLjava/io/ObjectOutputStream$HandleTable;->clear()V
-HSPLjava/io/ObjectOutputStream$HandleTable;->growEntries()V
-HSPLjava/io/ObjectOutputStream$HandleTable;->growSpine()V
-HSPLjava/io/ObjectOutputStream$HandleTable;->hash(Ljava/lang/Object;)I
-HSPLjava/io/ObjectOutputStream$HandleTable;->insert(Ljava/lang/Object;I)V
-HSPLjava/io/ObjectOutputStream$HandleTable;->lookup(Ljava/lang/Object;)I
-HSPLjava/io/ObjectOutputStream$PutField;-><init>()V
-HSPLjava/io/ObjectOutputStream$PutFieldImpl;-><init>(Ljava/io/ObjectOutputStream;Ljava/io/ObjectStreamClass;)V
-HSPLjava/io/ObjectOutputStream$PutFieldImpl;->getFieldOffset(Ljava/lang/String;Ljava/lang/Class;)I
-HSPLjava/io/ObjectOutputStream$PutFieldImpl;->put(Ljava/lang/String;D)V
-HSPLjava/io/ObjectOutputStream$PutFieldImpl;->put(Ljava/lang/String;I)V
-HSPLjava/io/ObjectOutputStream$PutFieldImpl;->put(Ljava/lang/String;J)V
-HSPLjava/io/ObjectOutputStream$PutFieldImpl;->put(Ljava/lang/String;Ljava/lang/Object;)V
-HSPLjava/io/ObjectOutputStream$PutFieldImpl;->put(Ljava/lang/String;Z)V
-HSPLjava/io/ObjectOutputStream$PutFieldImpl;->writeFields()V
-HSPLjava/io/ObjectOutputStream$ReplaceTable;-><init>(IF)V
-HSPLjava/io/ObjectOutputStream$ReplaceTable;->assign(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLjava/io/ObjectOutputStream$ReplaceTable;->lookup(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/io/ObjectOutputStream;-><init>(Ljava/io/OutputStream;)V
-HSPLjava/io/ObjectOutputStream;->annotateClass(Ljava/lang/Class;)V
-HSPLjava/io/ObjectOutputStream;->close()V
-HSPLjava/io/ObjectOutputStream;->defaultWriteFields(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V
-HSPLjava/io/ObjectOutputStream;->defaultWriteObject()V
-HSPLjava/io/ObjectOutputStream;->flush()V
-HSPLjava/io/ObjectOutputStream;->isCustomSubclass()Z
-HSPLjava/io/ObjectOutputStream;->putFields()Ljava/io/ObjectOutputStream$PutField;
-HSPLjava/io/ObjectOutputStream;->verifySubclass()V
-HSPLjava/io/ObjectOutputStream;->writeArray(Ljava/lang/Object;Ljava/io/ObjectStreamClass;Z)V
-HSPLjava/io/ObjectOutputStream;->writeByte(I)V
-HSPLjava/io/ObjectOutputStream;->writeClassDesc(Ljava/io/ObjectStreamClass;Z)V
-HSPLjava/io/ObjectOutputStream;->writeClassDescriptor(Ljava/io/ObjectStreamClass;)V
-HSPLjava/io/ObjectOutputStream;->writeEnum(Ljava/lang/Enum;Ljava/io/ObjectStreamClass;Z)V
-HSPLjava/io/ObjectOutputStream;->writeFields()V
-HSPLjava/io/ObjectOutputStream;->writeFloat(F)V
-HSPLjava/io/ObjectOutputStream;->writeHandle(I)V
-HSPLjava/io/ObjectOutputStream;->writeInt(I)V
-HSPLjava/io/ObjectOutputStream;->writeLong(J)V
-HSPLjava/io/ObjectOutputStream;->writeNonProxyDesc(Ljava/io/ObjectStreamClass;Z)V
-HSPLjava/io/ObjectOutputStream;->writeNull()V
-HSPLjava/io/ObjectOutputStream;->writeObject(Ljava/lang/Object;)V
-HSPLjava/io/ObjectOutputStream;->writeObject0(Ljava/lang/Object;Z)V
-HSPLjava/io/ObjectOutputStream;->writeOrdinaryObject(Ljava/lang/Object;Ljava/io/ObjectStreamClass;Z)V
-HSPLjava/io/ObjectOutputStream;->writeSerialData(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V
-HSPLjava/io/ObjectOutputStream;->writeShort(I)V
-HSPLjava/io/ObjectOutputStream;->writeStreamHeader()V
-HSPLjava/io/ObjectOutputStream;->writeString(Ljava/lang/String;Z)V
-HSPLjava/io/ObjectOutputStream;->writeTypeString(Ljava/lang/String;)V
-HSPLjava/io/ObjectOutputStream;->writeUTF(Ljava/lang/String;)V
-HSPLjava/io/ObjectStreamClass$1;-><init>(Ljava/io/ObjectStreamClass;)V
-HSPLjava/io/ObjectStreamClass$1;->run()Ljava/lang/Long;
-HSPLjava/io/ObjectStreamClass$1;->run()Ljava/lang/Object;
-HSPLjava/io/ObjectStreamClass$2;-><init>(Ljava/io/ObjectStreamClass;Ljava/lang/Class;)V
-HSPLjava/io/ObjectStreamClass$2;->run()Ljava/lang/Object;
-HSPLjava/io/ObjectStreamClass$2;->run()Ljava/lang/Void;
-HSPLjava/io/ObjectStreamClass$3;-><init>()V
-HSPLjava/io/ObjectStreamClass$3;->compare(Ljava/io/ObjectStreamClass$MemberSignature;Ljava/io/ObjectStreamClass$MemberSignature;)I
-HSPLjava/io/ObjectStreamClass$3;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/io/ObjectStreamClass$4;-><init>()V
-HSPLjava/io/ObjectStreamClass$4;->compare(Ljava/io/ObjectStreamClass$MemberSignature;Ljava/io/ObjectStreamClass$MemberSignature;)I
-HSPLjava/io/ObjectStreamClass$4;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/io/ObjectStreamClass$5;-><init>()V
-HSPLjava/io/ObjectStreamClass$5;->compare(Ljava/io/ObjectStreamClass$MemberSignature;Ljava/io/ObjectStreamClass$MemberSignature;)I
-HSPLjava/io/ObjectStreamClass$5;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/io/ObjectStreamClass$Caches;->-$$Nest$sfgetlocalDescsQueue()Ljava/lang/ref/ReferenceQueue;
-HSPLjava/io/ObjectStreamClass$Caches;->-$$Nest$sfgetreflectorsQueue()Ljava/lang/ref/ReferenceQueue;
-HSPLjava/io/ObjectStreamClass$ClassDataSlot;-><init>(Ljava/io/ObjectStreamClass;Z)V
-HSPLjava/io/ObjectStreamClass$EntryFuture;-><init>()V
-HSPLjava/io/ObjectStreamClass$EntryFuture;-><init>(Ljava/io/ObjectStreamClass$EntryFuture-IA;)V
-HSPLjava/io/ObjectStreamClass$EntryFuture;->get()Ljava/lang/Object;
-HSPLjava/io/ObjectStreamClass$EntryFuture;->getOwner()Ljava/lang/Thread;
-HSPLjava/io/ObjectStreamClass$EntryFuture;->set(Ljava/lang/Object;)Z
-HSPLjava/io/ObjectStreamClass$ExceptionInfo;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/io/ObjectStreamClass$FieldReflector;-><init>([Ljava/io/ObjectStreamField;)V
-HSPLjava/io/ObjectStreamClass$FieldReflector;->getFields()[Ljava/io/ObjectStreamField;
-HSPLjava/io/ObjectStreamClass$FieldReflector;->getObjFieldValues(Ljava/lang/Object;[Ljava/lang/Object;)V
-HSPLjava/io/ObjectStreamClass$FieldReflector;->getPrimFieldValues(Ljava/lang/Object;[B)V
-HSPLjava/io/ObjectStreamClass$FieldReflector;->setObjFieldValues(Ljava/lang/Object;[Ljava/lang/Object;)V
-HSPLjava/io/ObjectStreamClass$FieldReflector;->setPrimFieldValues(Ljava/lang/Object;[B)V
-HSPLjava/io/ObjectStreamClass$FieldReflectorKey;-><init>(Ljava/lang/Class;[Ljava/io/ObjectStreamField;Ljava/lang/ref/ReferenceQueue;)V
-HSPLjava/io/ObjectStreamClass$FieldReflectorKey;->equals(Ljava/lang/Object;)Z
-HSPLjava/io/ObjectStreamClass$FieldReflectorKey;->hashCode()I
-HSPLjava/io/ObjectStreamClass$MemberSignature;-><init>(Ljava/lang/reflect/Constructor;)V
-HSPLjava/io/ObjectStreamClass$MemberSignature;-><init>(Ljava/lang/reflect/Field;)V
-HSPLjava/io/ObjectStreamClass$MemberSignature;-><init>(Ljava/lang/reflect/Method;)V
-HSPLjava/io/ObjectStreamClass$WeakClassKey;-><init>(Ljava/lang/Class;Ljava/lang/ref/ReferenceQueue;)V
-HSPLjava/io/ObjectStreamClass$WeakClassKey;->equals(Ljava/lang/Object;)Z
-HSPLjava/io/ObjectStreamClass$WeakClassKey;->hashCode()I
-HSPLjava/io/ObjectStreamClass;->-$$Nest$fgetexternalizable(Ljava/io/ObjectStreamClass;)Z
-HSPLjava/io/ObjectStreamClass;->-$$Nest$fgetisEnum(Ljava/io/ObjectStreamClass;)Z
-HSPLjava/io/ObjectStreamClass;->-$$Nest$fgetwriteObjectMethod(Ljava/io/ObjectStreamClass;)Ljava/lang/reflect/Method;
-HSPLjava/io/ObjectStreamClass;->-$$Nest$fputcons(Ljava/io/ObjectStreamClass;Ljava/lang/reflect/Constructor;)V
-HSPLjava/io/ObjectStreamClass;->-$$Nest$fputfields(Ljava/io/ObjectStreamClass;[Ljava/io/ObjectStreamField;)V
-HSPLjava/io/ObjectStreamClass;->-$$Nest$fputhasWriteObjectData(Ljava/io/ObjectStreamClass;Z)V
-HSPLjava/io/ObjectStreamClass;->-$$Nest$fputreadObjectMethod(Ljava/io/ObjectStreamClass;Ljava/lang/reflect/Method;)V
-HSPLjava/io/ObjectStreamClass;->-$$Nest$fputreadObjectNoDataMethod(Ljava/io/ObjectStreamClass;Ljava/lang/reflect/Method;)V
-HSPLjava/io/ObjectStreamClass;->-$$Nest$fputreadResolveMethod(Ljava/io/ObjectStreamClass;Ljava/lang/reflect/Method;)V
-HSPLjava/io/ObjectStreamClass;->-$$Nest$fputsuid(Ljava/io/ObjectStreamClass;Ljava/lang/Long;)V
-HSPLjava/io/ObjectStreamClass;->-$$Nest$fputwriteObjectMethod(Ljava/io/ObjectStreamClass;Ljava/lang/reflect/Method;)V
-HSPLjava/io/ObjectStreamClass;->-$$Nest$fputwriteReplaceMethod(Ljava/io/ObjectStreamClass;Ljava/lang/reflect/Method;)V
-HSPLjava/io/ObjectStreamClass;->-$$Nest$mcomputeFieldOffsets(Ljava/io/ObjectStreamClass;)V
-HSPLjava/io/ObjectStreamClass;->-$$Nest$smgetDeclaredSUID(Ljava/lang/Class;)Ljava/lang/Long;
-HSPLjava/io/ObjectStreamClass;->-$$Nest$smgetInheritableMethod(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Method;
-HSPLjava/io/ObjectStreamClass;->-$$Nest$smgetPrivateMethod(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Method;
-HSPLjava/io/ObjectStreamClass;->-$$Nest$smgetSerialFields(Ljava/lang/Class;)[Ljava/io/ObjectStreamField;
-HSPLjava/io/ObjectStreamClass;->-$$Nest$smgetSerializableConstructor(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
-HSPLjava/io/ObjectStreamClass;-><init>()V
-HSPLjava/io/ObjectStreamClass;-><init>(Ljava/lang/Class;)V
-HSPLjava/io/ObjectStreamClass;->checkDefaultSerialize()V
-HSPLjava/io/ObjectStreamClass;->checkDeserialize()V
-HSPLjava/io/ObjectStreamClass;->checkSerialize()V
-HSPLjava/io/ObjectStreamClass;->classNamesEqual(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLjava/io/ObjectStreamClass;->computeDefaultSUID(Ljava/lang/Class;)J
-HSPLjava/io/ObjectStreamClass;->computeFieldOffsets()V
-HSPLjava/io/ObjectStreamClass;->forClass()Ljava/lang/Class;
-HSPLjava/io/ObjectStreamClass;->getClassDataLayout()[Ljava/io/ObjectStreamClass$ClassDataSlot;
-HSPLjava/io/ObjectStreamClass;->getClassDataLayout0()[Ljava/io/ObjectStreamClass$ClassDataSlot;
-HSPLjava/io/ObjectStreamClass;->getClassSignature(Ljava/lang/Class;)Ljava/lang/String;
-HSPLjava/io/ObjectStreamClass;->getDeclaredSUID(Ljava/lang/Class;)Ljava/lang/Long;
-HSPLjava/io/ObjectStreamClass;->getDeclaredSerialFields(Ljava/lang/Class;)[Ljava/io/ObjectStreamField;
-HSPLjava/io/ObjectStreamClass;->getDefaultSerialFields(Ljava/lang/Class;)[Ljava/io/ObjectStreamField;
-HSPLjava/io/ObjectStreamClass;->getField(Ljava/lang/String;Ljava/lang/Class;)Ljava/io/ObjectStreamField;
-HSPLjava/io/ObjectStreamClass;->getFields(Z)[Ljava/io/ObjectStreamField;
-HSPLjava/io/ObjectStreamClass;->getInheritableMethod(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Method;
-HSPLjava/io/ObjectStreamClass;->getMethodSignature([Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/String;
-HSPLjava/io/ObjectStreamClass;->getName()Ljava/lang/String;
-HSPLjava/io/ObjectStreamClass;->getNumObjFields()I
-HSPLjava/io/ObjectStreamClass;->getObjFieldValues(Ljava/lang/Object;[Ljava/lang/Object;)V
-HSPLjava/io/ObjectStreamClass;->getPackageName(Ljava/lang/Class;)Ljava/lang/String;
-HSPLjava/io/ObjectStreamClass;->getPrimDataSize()I
-HSPLjava/io/ObjectStreamClass;->getPrimFieldValues(Ljava/lang/Object;[B)V
-HSPLjava/io/ObjectStreamClass;->getPrivateMethod(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Method;
-HSPLjava/io/ObjectStreamClass;->getReflector([Ljava/io/ObjectStreamField;Ljava/io/ObjectStreamClass;)Ljava/io/ObjectStreamClass$FieldReflector;
-HSPLjava/io/ObjectStreamClass;->getResolveException()Ljava/lang/ClassNotFoundException;
-HSPLjava/io/ObjectStreamClass;->getSerialFields(Ljava/lang/Class;)[Ljava/io/ObjectStreamField;
-HSPLjava/io/ObjectStreamClass;->getSerialVersionUID()J
-HSPLjava/io/ObjectStreamClass;->getSerializableConstructor(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
-HSPLjava/io/ObjectStreamClass;->getSuperDesc()Ljava/io/ObjectStreamClass;
-HSPLjava/io/ObjectStreamClass;->getVariantFor(Ljava/lang/Class;)Ljava/io/ObjectStreamClass;
-HSPLjava/io/ObjectStreamClass;->hasReadObjectMethod()Z
-HSPLjava/io/ObjectStreamClass;->hasReadResolveMethod()Z
-HSPLjava/io/ObjectStreamClass;->hasWriteObjectData()Z
-HSPLjava/io/ObjectStreamClass;->hasWriteObjectMethod()Z
-HSPLjava/io/ObjectStreamClass;->hasWriteReplaceMethod()Z
-HSPLjava/io/ObjectStreamClass;->initNonProxy(Ljava/io/ObjectStreamClass;Ljava/lang/Class;Ljava/lang/ClassNotFoundException;Ljava/io/ObjectStreamClass;)V
-HSPLjava/io/ObjectStreamClass;->invokeReadObject(Ljava/lang/Object;Ljava/io/ObjectInputStream;)V
-HSPLjava/io/ObjectStreamClass;->invokeReadResolve(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/io/ObjectStreamClass;->invokeWriteObject(Ljava/lang/Object;Ljava/io/ObjectOutputStream;)V
-HSPLjava/io/ObjectStreamClass;->invokeWriteReplace(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/io/ObjectStreamClass;->isEnum()Z
-HSPLjava/io/ObjectStreamClass;->isExternalizable()Z
-HSPLjava/io/ObjectStreamClass;->isInstantiable()Z
-HSPLjava/io/ObjectStreamClass;->isProxy()Z
-HSPLjava/io/ObjectStreamClass;->isRecord()Z
-HSPLjava/io/ObjectStreamClass;->lookup(Ljava/lang/Class;Z)Ljava/io/ObjectStreamClass;
-HSPLjava/io/ObjectStreamClass;->matchFields([Ljava/io/ObjectStreamField;Ljava/io/ObjectStreamClass;)[Ljava/io/ObjectStreamField;
-HSPLjava/io/ObjectStreamClass;->newInstance()Ljava/lang/Object;
-HSPLjava/io/ObjectStreamClass;->packageEquals(Ljava/lang/Class;Ljava/lang/Class;)Z
-HSPLjava/io/ObjectStreamClass;->processQueue(Ljava/lang/ref/ReferenceQueue;Ljava/util/concurrent/ConcurrentMap;)V
-HSPLjava/io/ObjectStreamClass;->readNonProxy(Ljava/io/ObjectInputStream;)V
-HSPLjava/io/ObjectStreamClass;->requireInitialized()V
-HSPLjava/io/ObjectStreamClass;->setObjFieldValues(Ljava/lang/Object;[Ljava/lang/Object;)V
-HSPLjava/io/ObjectStreamClass;->setPrimFieldValues(Ljava/lang/Object;[B)V
-HSPLjava/io/ObjectStreamClass;->writeNonProxy(Ljava/io/ObjectOutputStream;)V
-HSPLjava/io/ObjectStreamField;-><init>(Ljava/lang/String;Ljava/lang/Class;)V
-HSPLjava/io/ObjectStreamField;-><init>(Ljava/lang/String;Ljava/lang/Class;Z)V
-HSPLjava/io/ObjectStreamField;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLjava/io/ObjectStreamField;-><init>(Ljava/lang/reflect/Field;ZZ)V
-HSPLjava/io/ObjectStreamField;->appendClassSignature(Ljava/lang/StringBuilder;Ljava/lang/Class;)Ljava/lang/StringBuilder;
-HSPLjava/io/ObjectStreamField;->compareTo(Ljava/lang/Object;)I
-HSPLjava/io/ObjectStreamField;->getClassSignature(Ljava/lang/Class;)Ljava/lang/String;
-HSPLjava/io/ObjectStreamField;->getField()Ljava/lang/reflect/Field;
-HSPLjava/io/ObjectStreamField;->getName()Ljava/lang/String;
-HSPLjava/io/ObjectStreamField;->getOffset()I
-HSPLjava/io/ObjectStreamField;->getPrimitiveSignature(Ljava/lang/Class;)Ljava/lang/String;
-HSPLjava/io/ObjectStreamField;->getSignature()Ljava/lang/String;
-HSPLjava/io/ObjectStreamField;->getType()Ljava/lang/Class;
-HSPLjava/io/ObjectStreamField;->getTypeCode()C
-HSPLjava/io/ObjectStreamField;->getTypeString()Ljava/lang/String;
-HSPLjava/io/ObjectStreamField;->isPrimitive()Z
-HSPLjava/io/ObjectStreamField;->isUnshared()Z
-HSPLjava/io/ObjectStreamField;->setOffset(I)V
-HSPLjava/io/OutputStream;-><init>()V
-HSPLjava/io/OutputStream;->close()V
-HSPLjava/io/OutputStream;->flush()V
-HSPLjava/io/OutputStream;->write([B)V
-HSPLjava/io/OutputStreamWriter;-><init>(Ljava/io/OutputStream;)V
-HSPLjava/io/OutputStreamWriter;-><init>(Ljava/io/OutputStream;Ljava/lang/String;)V
-HSPLjava/io/OutputStreamWriter;-><init>(Ljava/io/OutputStream;Ljava/nio/charset/Charset;)V
-HSPLjava/io/OutputStreamWriter;->close()V
-HSPLjava/io/OutputStreamWriter;->flush()V
-HSPLjava/io/OutputStreamWriter;->write(I)V
-HSPLjava/io/OutputStreamWriter;->write(Ljava/lang/String;II)V
-HSPLjava/io/OutputStreamWriter;->write([CII)V
-HSPLjava/io/PrintStream;-><init>(Ljava/io/OutputStream;)V
-HSPLjava/io/PrintStream;-><init>(Ljava/io/OutputStream;Z)V
-HSPLjava/io/PrintStream;-><init>(ZLjava/io/OutputStream;)V
-HSPLjava/io/PrintStream;->close()V
-HSPLjava/io/PrintStream;->ensureOpen()V
-HSPLjava/io/PrintStream;->flush()V
-HSPLjava/io/PrintStream;->requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
-HSPLjava/io/PrintWriter;-><init>(Ljava/io/OutputStream;)V
-HSPLjava/io/PrintWriter;-><init>(Ljava/io/OutputStream;Z)V
-HSPLjava/io/PrintWriter;-><init>(Ljava/io/Writer;)V
-HSPLjava/io/PrintWriter;-><init>(Ljava/io/Writer;Z)V
-HSPLjava/io/PrintWriter;->append(C)Ljava/io/PrintWriter;
-HSPLjava/io/PrintWriter;->append(Ljava/lang/CharSequence;)Ljava/io/PrintWriter;
-HSPLjava/io/PrintWriter;->append(Ljava/lang/CharSequence;)Ljava/lang/Appendable;
-HSPLjava/io/PrintWriter;->close()V
-HSPLjava/io/PrintWriter;->ensureOpen()V
-HSPLjava/io/PrintWriter;->flush()V
-HSPLjava/io/PrintWriter;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;
-HSPLjava/io/PrintWriter;->newLine()V
-HSPLjava/io/PrintWriter;->print(C)V
-HSPLjava/io/PrintWriter;->print(I)V
-HSPLjava/io/PrintWriter;->print(J)V
-HSPLjava/io/PrintWriter;->print(Ljava/lang/String;)V
-HSPLjava/io/PrintWriter;->print(Z)V
-HSPLjava/io/PrintWriter;->printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;
-HSPLjava/io/PrintWriter;->println()V
-HSPLjava/io/PrintWriter;->println(I)V
-HSPLjava/io/PrintWriter;->println(Ljava/lang/Object;)V
-HSPLjava/io/PrintWriter;->println(Ljava/lang/String;)V
-HSPLjava/io/PrintWriter;->write(I)V
-HSPLjava/io/PrintWriter;->write(Ljava/lang/String;)V
-HSPLjava/io/PrintWriter;->write(Ljava/lang/String;II)V
-HSPLjava/io/PrintWriter;->write([CII)V
-HSPLjava/io/PushbackInputStream;-><init>(Ljava/io/InputStream;I)V
-HSPLjava/io/PushbackInputStream;->close()V
-HSPLjava/io/PushbackInputStream;->ensureOpen()V
-HSPLjava/io/PushbackInputStream;->markSupported()Z
-HSPLjava/io/PushbackInputStream;->read()I
-HSPLjava/io/PushbackInputStream;->read([BII)I
-HSPLjava/io/PushbackInputStream;->unread([BII)V
-HSPLjava/io/PushbackReader;-><init>(Ljava/io/Reader;I)V
-HSPLjava/io/PushbackReader;->ensureOpen()V
-HSPLjava/io/PushbackReader;->read()I
-HSPLjava/io/PushbackReader;->unread(I)V
-HSPLjava/io/RandomAccessFile;-><init>(Ljava/io/File;Ljava/lang/String;)V
-HSPLjava/io/RandomAccessFile;-><init>(Ljava/io/File;Ljava/lang/String;Z)V
-HSPLjava/io/RandomAccessFile;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/io/RandomAccessFile;->close()V
-HSPLjava/io/RandomAccessFile;->finalize()V
-HSPLjava/io/RandomAccessFile;->getChannel()Ljava/nio/channels/FileChannel;
-HSPLjava/io/RandomAccessFile;->getFD()Ljava/io/FileDescriptor;
-HSPLjava/io/RandomAccessFile;->getFilePointer()J
-HSPLjava/io/RandomAccessFile;->length()J
-HSPLjava/io/RandomAccessFile;->maybeSync()V
-HSPLjava/io/RandomAccessFile;->read()I
-HSPLjava/io/RandomAccessFile;->read([B)I
-HSPLjava/io/RandomAccessFile;->read([BII)I
-HSPLjava/io/RandomAccessFile;->readByte()B
-HSPLjava/io/RandomAccessFile;->readBytes([BII)I
-HSPLjava/io/RandomAccessFile;->readFully([B)V
-HSPLjava/io/RandomAccessFile;->readFully([BII)V
-HSPLjava/io/RandomAccessFile;->readInt()I
-HSPLjava/io/RandomAccessFile;->readLine()Ljava/lang/String;
-HSPLjava/io/RandomAccessFile;->seek(J)V
-HSPLjava/io/RandomAccessFile;->setLength(J)V
-HSPLjava/io/RandomAccessFile;->write(I)V
-HSPLjava/io/RandomAccessFile;->write([B)V
-HSPLjava/io/RandomAccessFile;->write([BII)V
-HSPLjava/io/RandomAccessFile;->writeBytes([BII)V
-HSPLjava/io/RandomAccessFile;->writeInt(I)V
-HSPLjava/io/RandomAccessFile;->writeUTF(Ljava/lang/String;)V
-HSPLjava/io/Reader;-><init>()V
-HSPLjava/io/Reader;-><init>(Ljava/lang/Object;)V
-HSPLjava/io/Reader;->read(Ljava/nio/CharBuffer;)I
-HSPLjava/io/Reader;->read([C)I
-HSPLjava/io/SequenceInputStream;-><init>(Ljava/io/InputStream;Ljava/io/InputStream;)V
-HSPLjava/io/SequenceInputStream;->close()V
-HSPLjava/io/SequenceInputStream;->nextStream()V
-HSPLjava/io/SequenceInputStream;->read()I
-HSPLjava/io/SequenceInputStream;->read([BII)I
-HSPLjava/io/SerialCallbackContext;-><init>(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V
-HSPLjava/io/SerialCallbackContext;->check()V
-HSPLjava/io/SerialCallbackContext;->checkAndSetUsed()V
-HSPLjava/io/SerialCallbackContext;->getDesc()Ljava/io/ObjectStreamClass;
-HSPLjava/io/SerialCallbackContext;->getObj()Ljava/lang/Object;
-HSPLjava/io/SerialCallbackContext;->setUsed()V
-HSPLjava/io/StringReader;-><init>(Ljava/lang/String;)V
-HSPLjava/io/StringReader;->close()V
-HSPLjava/io/StringReader;->ensureOpen()V
-HSPLjava/io/StringReader;->read()I
-HSPLjava/io/StringReader;->read([CII)I
-HSPLjava/io/StringWriter;-><init>()V
-HSPLjava/io/StringWriter;-><init>(I)V
-HSPLjava/io/StringWriter;->append(C)Ljava/io/StringWriter;
-HSPLjava/io/StringWriter;->append(C)Ljava/io/Writer;
-HSPLjava/io/StringWriter;->append(Ljava/lang/CharSequence;)Ljava/io/StringWriter;
-HSPLjava/io/StringWriter;->append(Ljava/lang/CharSequence;)Ljava/io/Writer;
-HSPLjava/io/StringWriter;->close()V
-HSPLjava/io/StringWriter;->flush()V
-HSPLjava/io/StringWriter;->getBuffer()Ljava/lang/StringBuffer;
-HSPLjava/io/StringWriter;->toString()Ljava/lang/String;
-HSPLjava/io/StringWriter;->write(I)V
-HSPLjava/io/StringWriter;->write(Ljava/lang/String;)V
-HSPLjava/io/StringWriter;->write(Ljava/lang/String;II)V
-HSPLjava/io/StringWriter;->write([CII)V
-HSPLjava/io/UnixFileSystem;->canonicalize(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/io/UnixFileSystem;->checkAccess(Ljava/io/File;I)Z
-HSPLjava/io/UnixFileSystem;->compare(Ljava/io/File;Ljava/io/File;)I
-HSPLjava/io/UnixFileSystem;->createDirectory(Ljava/io/File;)Z
-HSPLjava/io/UnixFileSystem;->createFileExclusively(Ljava/lang/String;)Z
-HSPLjava/io/UnixFileSystem;->delete(Ljava/io/File;)Z
-HSPLjava/io/UnixFileSystem;->getBooleanAttributes(Ljava/io/File;)I
-HSPLjava/io/UnixFileSystem;->getDefaultParent()Ljava/lang/String;
-HSPLjava/io/UnixFileSystem;->getLastModifiedTime(Ljava/io/File;)J
-HSPLjava/io/UnixFileSystem;->getLength(Ljava/io/File;)J
-HSPLjava/io/UnixFileSystem;->getSpace(Ljava/io/File;I)J
-HSPLjava/io/UnixFileSystem;->hashCode(Ljava/io/File;)I
-HSPLjava/io/UnixFileSystem;->isAbsolute(Ljava/io/File;)Z
-HSPLjava/io/UnixFileSystem;->list(Ljava/io/File;)[Ljava/lang/String;
-HSPLjava/io/UnixFileSystem;->normalize(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/io/UnixFileSystem;->prefixLength(Ljava/lang/String;)I
-HSPLjava/io/UnixFileSystem;->rename(Ljava/io/File;Ljava/io/File;)Z
-HSPLjava/io/UnixFileSystem;->resolve(Ljava/io/File;)Ljava/lang/String;
-HSPLjava/io/UnixFileSystem;->resolve(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/io/UnixFileSystem;->setLastModifiedTime(Ljava/io/File;J)Z
-HSPLjava/io/UnixFileSystem;->setPermission(Ljava/io/File;IZZ)Z
-HSPLjava/io/Writer;-><init>()V
-HSPLjava/io/Writer;-><init>(Ljava/lang/Object;)V
-HSPLjava/io/Writer;->append(C)Ljava/io/Writer;
-HSPLjava/io/Writer;->append(Ljava/lang/CharSequence;)Ljava/io/Writer;
-HSPLjava/io/Writer;->write(Ljava/lang/String;)V
-HSPLjava/lang/AbstractStringBuilder;-><init>(I)V
-HSPLjava/lang/AbstractStringBuilder;->append(C)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->append(D)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->append(F)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->append(I)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->append(J)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/AbstractStringBuilder;)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/CharSequence;)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/CharSequence;II)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/StringBuffer;)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->append(Z)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->append([CII)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->appendChars(Ljava/lang/CharSequence;II)V
-HSPLjava/lang/AbstractStringBuilder;->appendChars([CII)V
-HSPLjava/lang/AbstractStringBuilder;->appendCodePoint(I)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->appendNull()Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->charAt(I)C
-HSPLjava/lang/AbstractStringBuilder;->checkRange(III)V
-HSPLjava/lang/AbstractStringBuilder;->checkRangeSIOOBE(III)V
-HSPLjava/lang/AbstractStringBuilder;->codePointAt(I)I
-HSPLjava/lang/AbstractStringBuilder;->delete(II)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->deleteCharAt(I)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->ensureCapacity(I)V
-HSPLjava/lang/AbstractStringBuilder;->ensureCapacityInternal(I)V
-HSPLjava/lang/AbstractStringBuilder;->getBytes([BIB)V
-HSPLjava/lang/AbstractStringBuilder;->getChars(II[CI)V
-HSPLjava/lang/AbstractStringBuilder;->getCoder()B
-HSPLjava/lang/AbstractStringBuilder;->indexOf(Ljava/lang/String;)I
-HSPLjava/lang/AbstractStringBuilder;->indexOf(Ljava/lang/String;I)I
-HSPLjava/lang/AbstractStringBuilder;->inflate()V
-HSPLjava/lang/AbstractStringBuilder;->insert(IC)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->insert(II)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->insert(ILjava/lang/String;)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->isLatin1()Z
-HSPLjava/lang/AbstractStringBuilder;->lastIndexOf(Ljava/lang/String;I)I
-HSPLjava/lang/AbstractStringBuilder;->length()I
-HSPLjava/lang/AbstractStringBuilder;->newCapacity(I)I
-HSPLjava/lang/AbstractStringBuilder;->putStringAt(ILjava/lang/String;)V
-HSPLjava/lang/AbstractStringBuilder;->replace(IILjava/lang/String;)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->reverse()Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->setCharAt(IC)V
-HSPLjava/lang/AbstractStringBuilder;->setLength(I)V
-HSPLjava/lang/AbstractStringBuilder;->shift(II)V
-HSPLjava/lang/AbstractStringBuilder;->subSequence(II)Ljava/lang/CharSequence;
-HSPLjava/lang/AbstractStringBuilder;->substring(I)Ljava/lang/String;
-HSPLjava/lang/AbstractStringBuilder;->substring(II)Ljava/lang/String;
-HSPLjava/lang/ArrayIndexOutOfBoundsException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/Boolean;-><init>(Z)V
-HSPLjava/lang/Boolean;->booleanValue()Z
-HSPLjava/lang/Boolean;->compare(ZZ)I
-HSPLjava/lang/Boolean;->compareTo(Ljava/lang/Boolean;)I
-HSPLjava/lang/Boolean;->compareTo(Ljava/lang/Object;)I
-HSPLjava/lang/Boolean;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/Boolean;->getBoolean(Ljava/lang/String;)Z
-HSPLjava/lang/Boolean;->hashCode()I
-HSPLjava/lang/Boolean;->hashCode(Z)I
-HSPLjava/lang/Boolean;->parseBoolean(Ljava/lang/String;)Z
-HSPLjava/lang/Boolean;->toString()Ljava/lang/String;
-HSPLjava/lang/Boolean;->toString(Z)Ljava/lang/String;
-HSPLjava/lang/Boolean;->valueOf(Ljava/lang/String;)Ljava/lang/Boolean;
-HSPLjava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
-HSPLjava/lang/BootClassLoader;->findClass(Ljava/lang/String;)Ljava/lang/Class;
-HSPLjava/lang/BootClassLoader;->findResource(Ljava/lang/String;)Ljava/net/URL;
-HSPLjava/lang/BootClassLoader;->findResources(Ljava/lang/String;)Ljava/util/Enumeration;
-HSPLjava/lang/BootClassLoader;->getInstance()Ljava/lang/BootClassLoader;
-HSPLjava/lang/BootClassLoader;->getResource(Ljava/lang/String;)Ljava/net/URL;
-HSPLjava/lang/BootClassLoader;->getResources(Ljava/lang/String;)Ljava/util/Enumeration;
-HSPLjava/lang/BootClassLoader;->loadClass(Ljava/lang/String;Z)Ljava/lang/Class;
-HSPLjava/lang/Byte;-><init>(B)V
-HSPLjava/lang/Byte;->byteValue()B
-HSPLjava/lang/Byte;->compare(BB)I
-HSPLjava/lang/Byte;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/Byte;->hashCode()I
-HSPLjava/lang/Byte;->hashCode(B)I
-HSPLjava/lang/Byte;->parseByte(Ljava/lang/String;I)B
-HSPLjava/lang/Byte;->toString()Ljava/lang/String;
-HSPLjava/lang/Byte;->toString(B)Ljava/lang/String;
-HSPLjava/lang/Byte;->toUnsignedInt(B)I
-HSPLjava/lang/Byte;->valueOf(B)Ljava/lang/Byte;
-HSPLjava/lang/CaseMapper;->toLowerCase(Ljava/util/Locale;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/lang/CaseMapper;->toUpperCase(Ljava/util/Locale;Ljava/lang/String;I)Ljava/lang/String;
-HSPLjava/lang/CaseMapper;->upperIndex(I)I
-HSPLjava/lang/Character$Subset;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/Character$Subset;->hashCode()I
-HSPLjava/lang/Character$UnicodeBlock;->of(I)Ljava/lang/Character$UnicodeBlock;
-HSPLjava/lang/Character;-><init>(C)V
-HSPLjava/lang/Character;->charCount(I)I
-HSPLjava/lang/Character;->charValue()C
-HSPLjava/lang/Character;->codePointAt(Ljava/lang/CharSequence;I)I
-HSPLjava/lang/Character;->codePointAtImpl([CII)I
-HSPLjava/lang/Character;->codePointBefore(Ljava/lang/CharSequence;I)I
-HSPLjava/lang/Character;->codePointCount(Ljava/lang/CharSequence;II)I
-HSPLjava/lang/Character;->digit(CI)I
-HSPLjava/lang/Character;->digit(II)I
-HSPLjava/lang/Character;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/Character;->forDigit(II)C
-HSPLjava/lang/Character;->getDirectionality(C)B
-HSPLjava/lang/Character;->getDirectionality(I)B
-HSPLjava/lang/Character;->getNumericValue(C)I
-HSPLjava/lang/Character;->getNumericValue(I)I
-HSPLjava/lang/Character;->getType(I)I
-HSPLjava/lang/Character;->hashCode()I
-HSPLjava/lang/Character;->hashCode(C)I
-HSPLjava/lang/Character;->highSurrogate(I)C
-HSPLjava/lang/Character;->isBmpCodePoint(I)Z
-HSPLjava/lang/Character;->isDigit(C)Z
-HSPLjava/lang/Character;->isDigit(I)Z
-HSPLjava/lang/Character;->isHighSurrogate(C)Z
-HSPLjava/lang/Character;->isISOControl(I)Z
-HSPLjava/lang/Character;->isJavaIdentifierPart(C)Z
-HSPLjava/lang/Character;->isJavaIdentifierPart(I)Z
-HSPLjava/lang/Character;->isJavaIdentifierStart(I)Z
-HSPLjava/lang/Character;->isLetter(C)Z
-HSPLjava/lang/Character;->isLetter(I)Z
-HSPLjava/lang/Character;->isLetterOrDigit(C)Z
-HSPLjava/lang/Character;->isLetterOrDigit(I)Z
-HSPLjava/lang/Character;->isLowSurrogate(C)Z
-HSPLjava/lang/Character;->isLowerCase(C)Z
-HSPLjava/lang/Character;->isLowerCase(I)Z
-HSPLjava/lang/Character;->isSpaceChar(C)Z
-HSPLjava/lang/Character;->isSpaceChar(I)Z
-HSPLjava/lang/Character;->isSupplementaryCodePoint(I)Z
-HSPLjava/lang/Character;->isSurrogate(C)Z
-HSPLjava/lang/Character;->isSurrogatePair(CC)Z
-HSPLjava/lang/Character;->isUpperCase(C)Z
-HSPLjava/lang/Character;->isUpperCase(I)Z
-HSPLjava/lang/Character;->isValidCodePoint(I)Z
-HSPLjava/lang/Character;->isWhitespace(C)Z
-HSPLjava/lang/Character;->isWhitespace(I)Z
-HSPLjava/lang/Character;->lowSurrogate(I)C
-HSPLjava/lang/Character;->toChars(I)[C
-HSPLjava/lang/Character;->toChars(I[CI)I
-HSPLjava/lang/Character;->toCodePoint(CC)I
-HSPLjava/lang/Character;->toLowerCase(C)C
-HSPLjava/lang/Character;->toLowerCase(I)I
-HSPLjava/lang/Character;->toString()Ljava/lang/String;
-HSPLjava/lang/Character;->toString(C)Ljava/lang/String;
-HSPLjava/lang/Character;->toSurrogates(I[CI)V
-HSPLjava/lang/Character;->toUpperCase(C)C
-HSPLjava/lang/Character;->toUpperCase(I)I
-HSPLjava/lang/Character;->valueOf(C)Ljava/lang/Character;
-HSPLjava/lang/Class;->asSubclass(Ljava/lang/Class;)Ljava/lang/Class;
-HSPLjava/lang/Class;->cast(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/lang/Class;->classNameImpliesTopLevel()Z
-HSPLjava/lang/Class;->desiredAssertionStatus()Z
-HSPLjava/lang/Class;->findInterfaceMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
-HSPLjava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
-HSPLjava/lang/Class;->forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
-HSPLjava/lang/Class;->getAccessFlags()I
-HSPLjava/lang/Class;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
-HSPLjava/lang/Class;->getCanonicalName()Ljava/lang/String;
-HSPLjava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;
-HSPLjava/lang/Class;->getComponentType()Ljava/lang/Class;
-HSPLjava/lang/Class;->getConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
-HSPLjava/lang/Class;->getConstructor0([Ljava/lang/Class;I)Ljava/lang/reflect/Constructor;
-HSPLjava/lang/Class;->getConstructors()[Ljava/lang/reflect/Constructor;
-HSPLjava/lang/Class;->getDeclaredConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
-HSPLjava/lang/Class;->getDeclaredConstructors()[Ljava/lang/reflect/Constructor;
-HSPLjava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
-HSPLjava/lang/Class;->getDeclaredMethods()[Ljava/lang/reflect/Method;
-HSPLjava/lang/Class;->getEnclosingConstructor()Ljava/lang/reflect/Constructor;
-HSPLjava/lang/Class;->getEnclosingMethod()Ljava/lang/reflect/Method;
-HSPLjava/lang/Class;->getEnumConstants()[Ljava/lang/Object;
-HSPLjava/lang/Class;->getEnumConstantsShared()[Ljava/lang/Object;
-HSPLjava/lang/Class;->getField(Ljava/lang/String;)Ljava/lang/reflect/Field;
-HSPLjava/lang/Class;->getFields()[Ljava/lang/reflect/Field;
-HSPLjava/lang/Class;->getGenericInterfaces()[Ljava/lang/reflect/Type;
-HSPLjava/lang/Class;->getGenericSuperclass()Ljava/lang/reflect/Type;
-HSPLjava/lang/Class;->getInterfaces()[Ljava/lang/Class;
-HSPLjava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
-HSPLjava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;Z)Ljava/lang/reflect/Method;
-HSPLjava/lang/Class;->getMethods()[Ljava/lang/reflect/Method;
-HSPLjava/lang/Class;->getModifiers()I
-HSPLjava/lang/Class;->getName()Ljava/lang/String;
-HSPLjava/lang/Class;->getPackage()Ljava/lang/Package;
-HSPLjava/lang/Class;->getPackageName()Ljava/lang/String;
-HSPLjava/lang/Class;->getProtectionDomain()Ljava/security/ProtectionDomain;
-HSPLjava/lang/Class;->getPublicFieldsRecursive(Ljava/util/List;)V
-HSPLjava/lang/Class;->getPublicMethodRecursive(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
-HSPLjava/lang/Class;->getPublicMethodsInternal(Ljava/util/List;)V
-HSPLjava/lang/Class;->getResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;
-HSPLjava/lang/Class;->getSignatureAttribute()Ljava/lang/String;
-HSPLjava/lang/Class;->getSimpleName()Ljava/lang/String;
-HSPLjava/lang/Class;->getSuperclass()Ljava/lang/Class;
-HSPLjava/lang/Class;->getTypeName()Ljava/lang/String;
-HSPLjava/lang/Class;->getTypeParameters()[Ljava/lang/reflect/TypeVariable;
-HSPLjava/lang/Class;->isAnnotation()Z
-HSPLjava/lang/Class;->isAnnotationPresent(Ljava/lang/Class;)Z
-HSPLjava/lang/Class;->isArray()Z
-HSPLjava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z
-HSPLjava/lang/Class;->isEnum()Z
-HSPLjava/lang/Class;->isInstance(Ljava/lang/Object;)Z
-HSPLjava/lang/Class;->isInterface()Z
-HSPLjava/lang/Class;->isLocalClass()Z
-HSPLjava/lang/Class;->isLocalOrAnonymousClass()Z
-HSPLjava/lang/Class;->isMemberClass()Z
-HSPLjava/lang/Class;->isPrimitive()Z
-HSPLjava/lang/Class;->isProxy()Z
-HSPLjava/lang/Class;->resolveName(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/lang/Class;->toString()Ljava/lang/String;
-HSPLjava/lang/ClassCastException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/ClassLoader;-><init>()V
-HSPLjava/lang/ClassLoader;-><init>(Ljava/lang/ClassLoader;)V
-HSPLjava/lang/ClassLoader;-><init>(Ljava/lang/Void;Ljava/lang/String;Ljava/lang/ClassLoader;)V
-HSPLjava/lang/ClassLoader;->checkCreateClassLoader()Ljava/lang/Void;
-HSPLjava/lang/ClassLoader;->checkCreateClassLoader(Ljava/lang/String;)Ljava/lang/Void;
-HSPLjava/lang/ClassLoader;->definePackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;)Ljava/lang/Package;
-HSPLjava/lang/ClassLoader;->findLoadedClass(Ljava/lang/String;)Ljava/lang/Class;
-HSPLjava/lang/ClassLoader;->getClassLoader(Ljava/lang/Class;)Ljava/lang/ClassLoader;
-HSPLjava/lang/ClassLoader;->getPackage(Ljava/lang/String;)Ljava/lang/Package;
-HSPLjava/lang/ClassLoader;->getParent()Ljava/lang/ClassLoader;
-HSPLjava/lang/ClassLoader;->getResource(Ljava/lang/String;)Ljava/net/URL;
-HSPLjava/lang/ClassLoader;->getResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;
-HSPLjava/lang/ClassLoader;->getResources(Ljava/lang/String;)Ljava/util/Enumeration;
-HSPLjava/lang/ClassLoader;->getSystemClassLoader()Ljava/lang/ClassLoader;
-HSPLjava/lang/ClassLoader;->loadClass(Ljava/lang/String;)Ljava/lang/Class;
-HSPLjava/lang/ClassLoader;->loadClass(Ljava/lang/String;Z)Ljava/lang/Class;
-HSPLjava/lang/ClassNotFoundException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/ClassNotFoundException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/lang/Daemons$Daemon;->interrupt(Ljava/lang/Thread;)V
-HSPLjava/lang/Daemons$Daemon;->isRunning()Z
-HSPLjava/lang/Daemons$Daemon;->run()V
-HSPLjava/lang/Daemons$Daemon;->start()V
-HSPLjava/lang/Daemons$Daemon;->startInternal()V
-HSPLjava/lang/Daemons$Daemon;->stop()V
-HSPLjava/lang/Daemons$FinalizerDaemon;->-$$Nest$fgetprogressCounter(Ljava/lang/Daemons$FinalizerDaemon;)Ljava/util/concurrent/atomic/AtomicInteger;
-HSPLjava/lang/Daemons$FinalizerDaemon;->-$$Nest$sfgetINSTANCE()Ljava/lang/Daemons$FinalizerDaemon;
-HSPLjava/lang/Daemons$FinalizerDaemon;->doFinalize(Ljava/lang/ref/FinalizerReference;)V
-HSPLjava/lang/Daemons$FinalizerDaemon;->processReference(Ljava/lang/Object;)V
-HSPLjava/lang/Daemons$FinalizerDaemon;->runInternal()V
-HSPLjava/lang/Daemons$FinalizerWatchdogDaemon;->-$$Nest$mmonitoringNeeded(Ljava/lang/Daemons$FinalizerWatchdogDaemon;I)V
-HSPLjava/lang/Daemons$FinalizerWatchdogDaemon;->-$$Nest$mmonitoringNotNeeded(Ljava/lang/Daemons$FinalizerWatchdogDaemon;I)V
-HSPLjava/lang/Daemons$FinalizerWatchdogDaemon;->-$$Nest$sfgetINSTANCE()Ljava/lang/Daemons$FinalizerWatchdogDaemon;
-HSPLjava/lang/Daemons$FinalizerWatchdogDaemon;->isActive(I)Z
-HSPLjava/lang/Daemons$FinalizerWatchdogDaemon;->monitoringNeeded(I)V
-HSPLjava/lang/Daemons$FinalizerWatchdogDaemon;->monitoringNotNeeded(I)V
-HSPLjava/lang/Daemons$FinalizerWatchdogDaemon;->resetTimeouts()V
-HSPLjava/lang/Daemons$FinalizerWatchdogDaemon;->runInternal()V
-HSPLjava/lang/Daemons$FinalizerWatchdogDaemon;->sleepForNanos(J)Z
-HSPLjava/lang/Daemons$FinalizerWatchdogDaemon;->sleepUntilNeeded()Z
-HSPLjava/lang/Daemons$FinalizerWatchdogDaemon;->waitForProgress()Ljava/util/concurrent/TimeoutException;
-HSPLjava/lang/Daemons$HeapTaskDaemon;->interrupt(Ljava/lang/Thread;)V
-HSPLjava/lang/Daemons$HeapTaskDaemon;->runInternal()V
-HSPLjava/lang/Daemons$ReferenceQueueDaemon;->-$$Nest$fgetprogressCounter(Ljava/lang/Daemons$ReferenceQueueDaemon;)Ljava/util/concurrent/atomic/AtomicInteger;
-HSPLjava/lang/Daemons$ReferenceQueueDaemon;->-$$Nest$sfgetINSTANCE()Ljava/lang/Daemons$ReferenceQueueDaemon;
-HSPLjava/lang/Daemons$ReferenceQueueDaemon;->runInternal()V
-HSPLjava/lang/Daemons;->-$$Nest$sfgetpostZygoteFork()Z
-HSPLjava/lang/Daemons;->-$$Nest$sfgetzygoteStartLatch()Ljava/util/concurrent/CountDownLatch;
-HSPLjava/lang/Daemons;->start()V
-HSPLjava/lang/Daemons;->startPostZygoteFork()V
-HSPLjava/lang/Daemons;->stop()V
-HSPLjava/lang/Double;-><init>(D)V
-HSPLjava/lang/Double;->compare(DD)I
-HSPLjava/lang/Double;->compareTo(Ljava/lang/Double;)I
-HSPLjava/lang/Double;->compareTo(Ljava/lang/Object;)I
-HSPLjava/lang/Double;->doubleToLongBits(D)J
-HSPLjava/lang/Double;->doubleValue()D
-HSPLjava/lang/Double;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/Double;->floatValue()F
-HSPLjava/lang/Double;->hashCode()I
-HSPLjava/lang/Double;->hashCode(D)I
-HSPLjava/lang/Double;->intValue()I
-HSPLjava/lang/Double;->isInfinite(D)Z
-HSPLjava/lang/Double;->isNaN()Z
-HSPLjava/lang/Double;->isNaN(D)Z
-HSPLjava/lang/Double;->longValue()J
-HSPLjava/lang/Double;->parseDouble(Ljava/lang/String;)D
-HSPLjava/lang/Double;->toString()Ljava/lang/String;
-HSPLjava/lang/Double;->toString(D)Ljava/lang/String;
-HSPLjava/lang/Double;->valueOf(D)Ljava/lang/Double;
-HSPLjava/lang/Double;->valueOf(Ljava/lang/String;)Ljava/lang/Double;
-HSPLjava/lang/Enum$1;->create(Ljava/lang/Class;)[Ljava/lang/Object;
-HSPLjava/lang/Enum$1;->create(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/lang/Enum;->-$$Nest$smenumValues(Ljava/lang/Class;)[Ljava/lang/Object;
-HSPLjava/lang/Enum;-><init>(Ljava/lang/String;I)V
-HSPLjava/lang/Enum;->compareTo(Ljava/lang/Enum;)I
-HSPLjava/lang/Enum;->compareTo(Ljava/lang/Object;)I
-HSPLjava/lang/Enum;->enumValues(Ljava/lang/Class;)[Ljava/lang/Object;
-HSPLjava/lang/Enum;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/Enum;->getDeclaringClass()Ljava/lang/Class;
-HSPLjava/lang/Enum;->getSharedConstants(Ljava/lang/Class;)[Ljava/lang/Enum;
-HSPLjava/lang/Enum;->hashCode()I
-HSPLjava/lang/Enum;->name()Ljava/lang/String;
-HSPLjava/lang/Enum;->ordinal()I
-HSPLjava/lang/Enum;->toString()Ljava/lang/String;
-HSPLjava/lang/Enum;->valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
-HSPLjava/lang/Error;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/Exception;-><init>()V
-HSPLjava/lang/Exception;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/Exception;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/lang/Exception;-><init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V
-HSPLjava/lang/Exception;-><init>(Ljava/lang/Throwable;)V
-HSPLjava/lang/Float;-><init>(F)V
-HSPLjava/lang/Float;->compare(FF)I
-HSPLjava/lang/Float;->compareTo(Ljava/lang/Float;)I
-HSPLjava/lang/Float;->compareTo(Ljava/lang/Object;)I
-HSPLjava/lang/Float;->doubleValue()D
-HSPLjava/lang/Float;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/Float;->floatToIntBits(F)I
-HSPLjava/lang/Float;->floatValue()F
-HSPLjava/lang/Float;->hashCode()I
-HSPLjava/lang/Float;->hashCode(F)I
-HSPLjava/lang/Float;->intValue()I
-HSPLjava/lang/Float;->isFinite(F)Z
-HSPLjava/lang/Float;->isInfinite(F)Z
-HSPLjava/lang/Float;->isNaN(F)Z
-HSPLjava/lang/Float;->parseFloat(Ljava/lang/String;)F
-HSPLjava/lang/Float;->toString()Ljava/lang/String;
-HSPLjava/lang/Float;->toString(F)Ljava/lang/String;
-HSPLjava/lang/Float;->valueOf(F)Ljava/lang/Float;
-HSPLjava/lang/Float;->valueOf(Ljava/lang/String;)Ljava/lang/Float;
-HSPLjava/lang/IllegalAccessException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/IllegalArgumentException;-><init>()V
-HSPLjava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/lang/IllegalStateException;-><init>()V
-HSPLjava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/IllegalStateException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/lang/IncompatibleClassChangeError;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/IndexOutOfBoundsException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/InheritableThreadLocal;->childValue(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/lang/InheritableThreadLocal;->createMap(Ljava/lang/Thread;Ljava/lang/Object;)V
-HSPLjava/lang/InheritableThreadLocal;->getMap(Ljava/lang/Thread;)Ljava/lang/ThreadLocal$ThreadLocalMap;
-HSPLjava/lang/InstantiationException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/Integer;-><init>(I)V
-HSPLjava/lang/Integer;->bitCount(I)I
-HSPLjava/lang/Integer;->byteValue()B
-HSPLjava/lang/Integer;->compare(II)I
-HSPLjava/lang/Integer;->compareTo(Ljava/lang/Integer;)I
-HSPLjava/lang/Integer;->compareTo(Ljava/lang/Object;)I
-HSPLjava/lang/Integer;->decode(Ljava/lang/String;)Ljava/lang/Integer;
-HSPLjava/lang/Integer;->divideUnsigned(II)I
-HSPLjava/lang/Integer;->doubleValue()D
-HSPLjava/lang/Integer;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/Integer;->floatValue()F
-HSPLjava/lang/Integer;->formatUnsignedInt(II[BII)V
-HSPLjava/lang/Integer;->getChars(II[B)I
-HSPLjava/lang/Integer;->getChars(II[C)I
-HSPLjava/lang/Integer;->getInteger(Ljava/lang/String;)Ljava/lang/Integer;
-HSPLjava/lang/Integer;->getInteger(Ljava/lang/String;I)Ljava/lang/Integer;
-HSPLjava/lang/Integer;->getInteger(Ljava/lang/String;Ljava/lang/Integer;)Ljava/lang/Integer;
-HSPLjava/lang/Integer;->hashCode()I
-HSPLjava/lang/Integer;->hashCode(I)I
-HSPLjava/lang/Integer;->highestOneBit(I)I
-HSPLjava/lang/Integer;->intValue()I
-HSPLjava/lang/Integer;->longValue()J
-HSPLjava/lang/Integer;->lowestOneBit(I)I
-HSPLjava/lang/Integer;->max(II)I
-HSPLjava/lang/Integer;->min(II)I
-HSPLjava/lang/Integer;->numberOfLeadingZeros(I)I
-HSPLjava/lang/Integer;->numberOfTrailingZeros(I)I
-HSPLjava/lang/Integer;->parseInt(Ljava/lang/String;)I
-HSPLjava/lang/Integer;->parseInt(Ljava/lang/String;I)I
-HSPLjava/lang/Integer;->reverse(I)I
-HSPLjava/lang/Integer;->reverseBytes(I)I
-HSPLjava/lang/Integer;->rotateLeft(II)I
-HSPLjava/lang/Integer;->rotateRight(II)I
-HSPLjava/lang/Integer;->shortValue()S
-HSPLjava/lang/Integer;->signum(I)I
-HSPLjava/lang/Integer;->stringSize(I)I
-HSPLjava/lang/Integer;->sum(II)I
-HSPLjava/lang/Integer;->toBinaryString(I)Ljava/lang/String;
-HSPLjava/lang/Integer;->toHexString(I)Ljava/lang/String;
-HSPLjava/lang/Integer;->toString()Ljava/lang/String;
-HSPLjava/lang/Integer;->toString(I)Ljava/lang/String;
-HSPLjava/lang/Integer;->toString(II)Ljava/lang/String;
-HSPLjava/lang/Integer;->toUnsignedLong(I)J
-HSPLjava/lang/Integer;->toUnsignedString0(II)Ljava/lang/String;
-HSPLjava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
-HSPLjava/lang/Integer;->valueOf(Ljava/lang/String;)Ljava/lang/Integer;
-HSPLjava/lang/Integer;->valueOf(Ljava/lang/String;I)Ljava/lang/Integer;
-HSPLjava/lang/InterruptedException;-><init>()V
-HSPLjava/lang/Iterable;->forEach(Ljava/util/function/Consumer;)V+]Ljava/lang/Iterable;megamorphic_types]Ljava/util/Iterator;megamorphic_types]Ljava/util/function/Consumer;missing_types
-HSPLjava/lang/LinkageError;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/Long;-><init>(J)V
-HSPLjava/lang/Long;->bitCount(J)I
-HSPLjava/lang/Long;->compare(JJ)I
-HSPLjava/lang/Long;->compareTo(Ljava/lang/Long;)I
-HSPLjava/lang/Long;->compareTo(Ljava/lang/Object;)I
-HSPLjava/lang/Long;->compareUnsigned(JJ)I
-HSPLjava/lang/Long;->decode(Ljava/lang/String;)Ljava/lang/Long;
-HSPLjava/lang/Long;->divideUnsigned(JJ)J
-HSPLjava/lang/Long;->doubleValue()D
-HSPLjava/lang/Long;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/Long;->formatUnsignedLong0(JI[BII)V
-HSPLjava/lang/Long;->getChars(JI[B)I
-HSPLjava/lang/Long;->getChars(JI[C)I
-HSPLjava/lang/Long;->getLong(Ljava/lang/String;J)Ljava/lang/Long;
-HSPLjava/lang/Long;->getLong(Ljava/lang/String;Ljava/lang/Long;)Ljava/lang/Long;
-HSPLjava/lang/Long;->hashCode()I
-HSPLjava/lang/Long;->hashCode(J)I
-HSPLjava/lang/Long;->highestOneBit(J)J
-HSPLjava/lang/Long;->intValue()I
-HSPLjava/lang/Long;->longValue()J
-HSPLjava/lang/Long;->lowestOneBit(J)J
-HSPLjava/lang/Long;->numberOfLeadingZeros(J)I
-HSPLjava/lang/Long;->numberOfTrailingZeros(J)I
-HSPLjava/lang/Long;->parseLong(Ljava/lang/CharSequence;III)J
-HSPLjava/lang/Long;->parseLong(Ljava/lang/String;)J
-HSPLjava/lang/Long;->parseLong(Ljava/lang/String;I)J
-HSPLjava/lang/Long;->reverse(J)J
-HSPLjava/lang/Long;->reverseBytes(J)J
-HSPLjava/lang/Long;->rotateLeft(JI)J
-HSPLjava/lang/Long;->rotateRight(JI)J
-HSPLjava/lang/Long;->signum(J)I
-HSPLjava/lang/Long;->stringSize(J)I
-HSPLjava/lang/Long;->sum(JJ)J
-HSPLjava/lang/Long;->toHexString(J)Ljava/lang/String;
-HSPLjava/lang/Long;->toString()Ljava/lang/String;
-HSPLjava/lang/Long;->toString(J)Ljava/lang/String;
-HSPLjava/lang/Long;->toString(JI)Ljava/lang/String;
-HSPLjava/lang/Long;->toUnsignedString0(JI)Ljava/lang/String;
-HSPLjava/lang/Long;->valueOf(J)Ljava/lang/Long;
-HSPLjava/lang/Long;->valueOf(Ljava/lang/String;)Ljava/lang/Long;
-HSPLjava/lang/Long;->valueOf(Ljava/lang/String;I)Ljava/lang/Long;
-HSPLjava/lang/Math;->abs(D)D
-HSPLjava/lang/Math;->abs(F)F
-HSPLjava/lang/Math;->abs(I)I
-HSPLjava/lang/Math;->abs(J)J
-HSPLjava/lang/Math;->addExact(JJ)J
-HSPLjava/lang/Math;->copySign(DD)D
-HSPLjava/lang/Math;->copySign(FF)F
-HSPLjava/lang/Math;->floorDiv(II)I
-HSPLjava/lang/Math;->floorDiv(JI)J
-HSPLjava/lang/Math;->floorDiv(JJ)J
-HSPLjava/lang/Math;->floorMod(II)I
-HSPLjava/lang/Math;->floorMod(JI)I
-HSPLjava/lang/Math;->floorMod(JJ)J
-HSPLjava/lang/Math;->fma(DDD)D
-HSPLjava/lang/Math;->fma(FFF)F
-HSPLjava/lang/Math;->getExponent(D)I
-HSPLjava/lang/Math;->getExponent(F)I
-HSPLjava/lang/Math;->max(DD)D
-HSPLjava/lang/Math;->max(FF)F
-HSPLjava/lang/Math;->max(II)I
-HSPLjava/lang/Math;->max(JJ)J
-HSPLjava/lang/Math;->min(DD)D
-HSPLjava/lang/Math;->min(FF)F
-HSPLjava/lang/Math;->min(II)I
-HSPLjava/lang/Math;->min(JJ)J
-HSPLjava/lang/Math;->multiplyExact(II)I
-HSPLjava/lang/Math;->multiplyExact(JI)J
-HSPLjava/lang/Math;->multiplyExact(JJ)J
-HSPLjava/lang/Math;->multiplyHigh(JJ)J
-HSPLjava/lang/Math;->nextAfter(DD)D
-HSPLjava/lang/Math;->powerOfTwoD(I)D
-HSPLjava/lang/Math;->powerOfTwoF(I)F
-HSPLjava/lang/Math;->random()D
-HSPLjava/lang/Math;->randomLongInternal()J
-HSPLjava/lang/Math;->round(D)J
-HSPLjava/lang/Math;->round(F)I
-HSPLjava/lang/Math;->scalb(FI)F
-HSPLjava/lang/Math;->setRandomSeedInternal(J)V
-HSPLjava/lang/Math;->signum(F)F
-HSPLjava/lang/Math;->subtractExact(JJ)J
-HSPLjava/lang/Math;->toDegrees(D)D
-HSPLjava/lang/Math;->toIntExact(J)I
-HSPLjava/lang/Math;->toRadians(D)D
-HSPLjava/lang/Math;->ulp(F)F
-HSPLjava/lang/NoClassDefFoundError;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/NoSuchFieldException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/NoSuchMethodError;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/NoSuchMethodException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/NullPointerException;-><init>()V
-HSPLjava/lang/NullPointerException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/Number;-><init>()V
-HSPLjava/lang/NumberFormatException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/NumberFormatException;->forInputString(Ljava/lang/String;I)Ljava/lang/NumberFormatException;
-HSPLjava/lang/Object;-><init>()V
-HSPLjava/lang/Object;->clone()Ljava/lang/Object;
-HSPLjava/lang/Object;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/Object;->finalize()V
-HSPLjava/lang/Object;->getClass()Ljava/lang/Class;
-HSPLjava/lang/Object;->hashCode()I
-HSPLjava/lang/Object;->identityHashCode(Ljava/lang/Object;)I
-HSPLjava/lang/Object;->toString()Ljava/lang/String;
-HSPLjava/lang/Object;->wait()V
-HSPLjava/lang/Object;->wait(J)V
-HSPLjava/lang/Package;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;Ljava/lang/ClassLoader;)V
-HSPLjava/lang/Package;->getName()Ljava/lang/String;
-HSPLjava/lang/Process;-><init>()V
-HSPLjava/lang/ProcessBuilder$NullInputStream;->available()I
-HSPLjava/lang/ProcessBuilder$NullInputStream;->read()I
-HSPLjava/lang/ProcessBuilder;-><init>([Ljava/lang/String;)V
-HSPLjava/lang/ProcessBuilder;->directory(Ljava/io/File;)Ljava/lang/ProcessBuilder;
-HSPLjava/lang/ProcessBuilder;->environment([Ljava/lang/String;)Ljava/lang/ProcessBuilder;
-HSPLjava/lang/ProcessBuilder;->start()Ljava/lang/Process;
-HSPLjava/lang/ProcessEnvironment;->toEnvironmentBlock(Ljava/util/Map;[I)[B
-HSPLjava/lang/ProcessImpl;->start([Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;[Ljava/lang/ProcessBuilder$Redirect;Z)Ljava/lang/Process;
-HSPLjava/lang/ProcessImpl;->toCString(Ljava/lang/String;)[B
-HSPLjava/lang/ReflectiveOperationException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/ReflectiveOperationException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/lang/ReflectiveOperationException;-><init>(Ljava/lang/Throwable;)V
-HSPLjava/lang/Runtime;->addShutdownHook(Ljava/lang/Thread;)V
-HSPLjava/lang/Runtime;->availableProcessors()I
-HSPLjava/lang/Runtime;->exec(Ljava/lang/String;)Ljava/lang/Process;
-HSPLjava/lang/Runtime;->exec(Ljava/lang/String;[Ljava/lang/String;Ljava/io/File;)Ljava/lang/Process;
-HSPLjava/lang/Runtime;->exec([Ljava/lang/String;)Ljava/lang/Process;
-HSPLjava/lang/Runtime;->exec([Ljava/lang/String;[Ljava/lang/String;Ljava/io/File;)Ljava/lang/Process;
-HSPLjava/lang/Runtime;->gc()V
-HSPLjava/lang/Runtime;->getLibPaths()[Ljava/lang/String;
-HSPLjava/lang/Runtime;->getRuntime()Ljava/lang/Runtime;
-HSPLjava/lang/Runtime;->load0(Ljava/lang/Class;Ljava/lang/String;)V
-HSPLjava/lang/Runtime;->loadLibrary0(Ljava/lang/Class;Ljava/lang/String;)V
-HSPLjava/lang/Runtime;->loadLibrary0(Ljava/lang/ClassLoader;Ljava/lang/Class;Ljava/lang/String;)V
-HSPLjava/lang/Runtime;->nativeLoad(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/String;
-HSPLjava/lang/Runtime;->runFinalization()V
-HSPLjava/lang/RuntimeException;-><init>()V
-HSPLjava/lang/RuntimeException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/RuntimeException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V
-HSPLjava/lang/SecurityException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/Short;-><init>(S)V
-HSPLjava/lang/Short;->hashCode()I
-HSPLjava/lang/Short;->hashCode(S)I
-HSPLjava/lang/Short;->parseShort(Ljava/lang/String;I)S
-HSPLjava/lang/Short;->reverseBytes(S)S
-HSPLjava/lang/Short;->shortValue()S
-HSPLjava/lang/Short;->toUnsignedInt(S)I
-HSPLjava/lang/Short;->valueOf(Ljava/lang/String;)Ljava/lang/Short;
-HSPLjava/lang/Short;->valueOf(Ljava/lang/String;I)Ljava/lang/Short;
-HSPLjava/lang/Short;->valueOf(S)Ljava/lang/Short;
-HSPLjava/lang/StackTraceElement;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
-HSPLjava/lang/StackTraceElement;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/StackTraceElement;->getClassName()Ljava/lang/String;
-HSPLjava/lang/StackTraceElement;->getFileName()Ljava/lang/String;
-HSPLjava/lang/StackTraceElement;->getLineNumber()I
-HSPLjava/lang/StackTraceElement;->getMethodName()Ljava/lang/String;
-HSPLjava/lang/StackTraceElement;->hashCode()I
-HSPLjava/lang/StackTraceElement;->isNativeMethod()Z
-HSPLjava/lang/StackTraceElement;->toString()Ljava/lang/String;
-HSPLjava/lang/String$CaseInsensitiveComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/lang/String$CaseInsensitiveComparator;->compare(Ljava/lang/String;Ljava/lang/String;)I
-HSPLjava/lang/String;->checkBoundsBeginEnd(III)V
-HSPLjava/lang/String;->checkBoundsOffCount(III)V
-HSPLjava/lang/String;->checkIndex(II)V
-HSPLjava/lang/String;->checkOffset(II)V
-HSPLjava/lang/String;->codePointAt(I)I
-HSPLjava/lang/String;->codePointCount(II)I
-HSPLjava/lang/String;->coder()B
-HSPLjava/lang/String;->compareTo(Ljava/lang/Object;)I
-HSPLjava/lang/String;->compareToIgnoreCase(Ljava/lang/String;)I
-HSPLjava/lang/String;->contains(Ljava/lang/CharSequence;)Z
-HSPLjava/lang/String;->contentEquals(Ljava/lang/CharSequence;)Z
-HSPLjava/lang/String;->copyValueOf([C)Ljava/lang/String;
-HSPLjava/lang/String;->endsWith(Ljava/lang/String;)Z
-HSPLjava/lang/String;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z
-HSPLjava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
-HSPLjava/lang/String;->format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
-HSPLjava/lang/String;->getBytes()[B
-HSPLjava/lang/String;->getBytes(Ljava/lang/String;)[B
-HSPLjava/lang/String;->getBytes(Ljava/nio/charset/Charset;)[B
-HSPLjava/lang/String;->getBytes([BIB)V
-HSPLjava/lang/String;->getChars(II[CI)V
-HSPLjava/lang/String;->getChars([CI)V
-HSPLjava/lang/String;->hashCode()I
-HSPLjava/lang/String;->indexOf(I)I
-HSPLjava/lang/String;->indexOf(II)I
-HSPLjava/lang/String;->indexOf(Ljava/lang/String;)I
-HSPLjava/lang/String;->indexOf(Ljava/lang/String;I)I
-HSPLjava/lang/String;->indexOf(Ljava/lang/String;Ljava/lang/String;I)I
-HSPLjava/lang/String;->indexOf([BBILjava/lang/String;I)I
-HSPLjava/lang/String;->isEmpty()Z
-HSPLjava/lang/String;->join(Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String;
-HSPLjava/lang/String;->join(Ljava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/String;
-HSPLjava/lang/String;->lastIndexOf(I)I
-HSPLjava/lang/String;->lastIndexOf(II)I
-HSPLjava/lang/String;->lastIndexOf(Ljava/lang/String;)I
-HSPLjava/lang/String;->lastIndexOf(Ljava/lang/String;I)I
-HSPLjava/lang/String;->lastIndexOf(Ljava/lang/String;Ljava/lang/String;I)I
-HSPLjava/lang/String;->lastIndexOf([BBILjava/lang/String;I)I
-HSPLjava/lang/String;->lastIndexOf([CII[CIII)I
-HSPLjava/lang/String;->length()I
-HSPLjava/lang/String;->matches(Ljava/lang/String;)Z
-HSPLjava/lang/String;->regionMatches(ILjava/lang/String;II)Z
-HSPLjava/lang/String;->regionMatches(ZILjava/lang/String;II)Z
-HSPLjava/lang/String;->replace(CC)Ljava/lang/String;
-HSPLjava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;
-HSPLjava/lang/String;->replaceAll(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/lang/String;->replaceFirst(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/lang/String;->split(Ljava/lang/String;)[Ljava/lang/String;
-HSPLjava/lang/String;->split(Ljava/lang/String;I)[Ljava/lang/String;
-HSPLjava/lang/String;->startsWith(Ljava/lang/String;)Z
-HSPLjava/lang/String;->startsWith(Ljava/lang/String;I)Z
-HSPLjava/lang/String;->subSequence(II)Ljava/lang/CharSequence;
-HSPLjava/lang/String;->substring(I)Ljava/lang/String;
-HSPLjava/lang/String;->substring(II)Ljava/lang/String;
-HSPLjava/lang/String;->toLowerCase()Ljava/lang/String;
-HSPLjava/lang/String;->toLowerCase(Ljava/util/Locale;)Ljava/lang/String;
-HSPLjava/lang/String;->toString()Ljava/lang/String;
-HSPLjava/lang/String;->toUpperCase()Ljava/lang/String;
-HSPLjava/lang/String;->toUpperCase(Ljava/util/Locale;)Ljava/lang/String;
-HSPLjava/lang/String;->trim()Ljava/lang/String;
-HSPLjava/lang/String;->valueOf(C)Ljava/lang/String;
-HSPLjava/lang/String;->valueOf(D)Ljava/lang/String;
-HSPLjava/lang/String;->valueOf(F)Ljava/lang/String;
-HSPLjava/lang/String;->valueOf(I)Ljava/lang/String;
-HSPLjava/lang/String;->valueOf(J)Ljava/lang/String;
-HSPLjava/lang/String;->valueOf(Ljava/lang/Object;)Ljava/lang/String;
-HSPLjava/lang/String;->valueOf(Z)Ljava/lang/String;
-HSPLjava/lang/String;->valueOf([C)Ljava/lang/String;
-HSPLjava/lang/StringBuffer;-><init>()V
-HSPLjava/lang/StringBuffer;-><init>(I)V
-HSPLjava/lang/StringBuffer;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/StringBuffer;->append(C)Ljava/lang/StringBuffer;
-HSPLjava/lang/StringBuffer;->append(I)Ljava/lang/StringBuffer;
-HSPLjava/lang/StringBuffer;->append(J)Ljava/lang/StringBuffer;
-HSPLjava/lang/StringBuffer;->append(Ljava/lang/AbstractStringBuilder;)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/StringBuffer;->append(Ljava/lang/AbstractStringBuilder;)Ljava/lang/StringBuffer;
-HSPLjava/lang/StringBuffer;->append(Ljava/lang/CharSequence;)Ljava/lang/Appendable;
-HSPLjava/lang/StringBuffer;->append(Ljava/lang/CharSequence;)Ljava/lang/StringBuffer;
-HSPLjava/lang/StringBuffer;->append(Ljava/lang/CharSequence;II)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/StringBuffer;->append(Ljava/lang/CharSequence;II)Ljava/lang/StringBuffer;
-HSPLjava/lang/StringBuffer;->append(Ljava/lang/Object;)Ljava/lang/StringBuffer;
-HSPLjava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;
-HSPLjava/lang/StringBuffer;->append(Ljava/lang/StringBuffer;)Ljava/lang/StringBuffer;
-HSPLjava/lang/StringBuffer;->append(Z)Ljava/lang/StringBuffer;
-HSPLjava/lang/StringBuffer;->append([CII)Ljava/lang/StringBuffer;
-HSPLjava/lang/StringBuffer;->charAt(I)C
-HSPLjava/lang/StringBuffer;->codePointAt(I)I
-HSPLjava/lang/StringBuffer;->getBytes([BIB)V
-HSPLjava/lang/StringBuffer;->getChars(II[CI)V
-HSPLjava/lang/StringBuffer;->length()I
-HSPLjava/lang/StringBuffer;->setLength(I)V
-HSPLjava/lang/StringBuffer;->toString()Ljava/lang/String;
-HSPLjava/lang/StringBuilder;-><init>()V
-HSPLjava/lang/StringBuilder;-><init>(I)V
-HSPLjava/lang/StringBuilder;-><init>(Ljava/lang/CharSequence;)V
-HSPLjava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/StringBuilder;->append(C)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/StringBuilder;->append(C)Ljava/lang/Appendable;
-HSPLjava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->append(D)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->append(F)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->append(J)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->append(Ljava/lang/CharSequence;)Ljava/lang/Appendable;
-HSPLjava/lang/StringBuilder;->append(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->append(Ljava/lang/CharSequence;II)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/StringBuilder;->append(Ljava/lang/CharSequence;II)Ljava/lang/Appendable;
-HSPLjava/lang/StringBuilder;->append(Ljava/lang/CharSequence;II)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->append([C)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->append([CII)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->appendCodePoint(I)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->charAt(I)C
-HSPLjava/lang/StringBuilder;->delete(II)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->deleteCharAt(I)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->ensureCapacity(I)V
-HSPLjava/lang/StringBuilder;->getChars(II[CI)V
-HSPLjava/lang/StringBuilder;->indexOf(Ljava/lang/String;)I
-HSPLjava/lang/StringBuilder;->indexOf(Ljava/lang/String;I)I
-HSPLjava/lang/StringBuilder;->insert(IC)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->insert(II)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->insert(ILjava/lang/String;)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/StringBuilder;->insert(ILjava/lang/String;)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->lastIndexOf(Ljava/lang/String;I)I
-HSPLjava/lang/StringBuilder;->length()I
-HSPLjava/lang/StringBuilder;->replace(IILjava/lang/String;)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->reverse()Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->setCharAt(IC)V
-HSPLjava/lang/StringBuilder;->setLength(I)V
-HSPLjava/lang/StringBuilder;->subSequence(II)Ljava/lang/CharSequence;
-HSPLjava/lang/StringBuilder;->substring(I)Ljava/lang/String;
-HSPLjava/lang/StringBuilder;->substring(II)Ljava/lang/String;
-HSPLjava/lang/StringBuilder;->toString()Ljava/lang/String;
-HSPLjava/lang/StringFactory;->newEmptyString()Ljava/lang/String;
-HSPLjava/lang/StringFactory;->newStringFromBytes([B)Ljava/lang/String;
-HSPLjava/lang/StringFactory;->newStringFromBytes([BI)Ljava/lang/String;
-HSPLjava/lang/StringFactory;->newStringFromBytes([BII)Ljava/lang/String;
-HSPLjava/lang/StringFactory;->newStringFromBytes([BIILjava/lang/String;)Ljava/lang/String;
-HSPLjava/lang/StringFactory;->newStringFromBytes([BIILjava/nio/charset/Charset;)Ljava/lang/String;
-HSPLjava/lang/StringFactory;->newStringFromBytes([BLjava/lang/String;)Ljava/lang/String;
-HSPLjava/lang/StringFactory;->newStringFromBytes([BLjava/nio/charset/Charset;)Ljava/lang/String;
-HSPLjava/lang/StringFactory;->newStringFromChars([C)Ljava/lang/String;
-HSPLjava/lang/StringFactory;->newStringFromChars([CII)Ljava/lang/String;
-HSPLjava/lang/StringLatin1;->canEncode(I)Z
-HSPLjava/lang/StringLatin1;->indexOf([BILjava/lang/String;II)I
-HSPLjava/lang/StringLatin1;->inflate([BI[BII)V
-HSPLjava/lang/StringLatin1;->lastIndexOf([BILjava/lang/String;II)I
-HSPLjava/lang/StringLatin1;->newString([BII)Ljava/lang/String;
-HSPLjava/lang/StringUTF16;->checkBoundsBeginEnd(II[B)V
-HSPLjava/lang/StringUTF16;->checkBoundsOffCount(II[B)V
-HSPLjava/lang/StringUTF16;->checkIndex(I[B)V
-HSPLjava/lang/StringUTF16;->getChar([BI)C
-HSPLjava/lang/StringUTF16;->getChars(II[B)I
-HSPLjava/lang/StringUTF16;->getChars([BII[CI)V
-HSPLjava/lang/StringUTF16;->inflate([BI[BII)V
-HSPLjava/lang/StringUTF16;->length([B)I
-HSPLjava/lang/StringUTF16;->newBytesFor(I)[B
-HSPLjava/lang/StringUTF16;->newString([BII)Ljava/lang/String;
-HSPLjava/lang/StringUTF16;->putChar([BII)V
-HSPLjava/lang/StringUTF16;->putCharSB([BII)V
-HSPLjava/lang/System$PropertiesWithNonOverrideableDefaults;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/lang/System$PropertiesWithNonOverrideableDefaults;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/lang/System;->arraycopy([BI[BII)V
-HSPLjava/lang/System;->arraycopy([CI[CII)V
-HSPLjava/lang/System;->arraycopy([DI[DII)V
-HSPLjava/lang/System;->arraycopy([FI[FII)V
-HSPLjava/lang/System;->arraycopy([II[III)V
-HSPLjava/lang/System;->arraycopy([JI[JII)V
-HSPLjava/lang/System;->arraycopy([ZI[ZII)V
-HSPLjava/lang/System;->checkKey(Ljava/lang/String;)V
-HSPLjava/lang/System;->clearProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/lang/System;->gc()V
-HSPLjava/lang/System;->getProperties()Ljava/util/Properties;
-HSPLjava/lang/System;->getProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/lang/System;->getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/lang/System;->getSecurityManager()Ljava/lang/SecurityManager;
-HSPLjava/lang/System;->getenv(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/lang/System;->identityHashCode(Ljava/lang/Object;)I
-HSPLjava/lang/System;->lineSeparator()Ljava/lang/String;
-HSPLjava/lang/System;->load(Ljava/lang/String;)V
-HSPLjava/lang/System;->loadLibrary(Ljava/lang/String;)V
-HSPLjava/lang/System;->logE(Ljava/lang/String;)V
-HSPLjava/lang/System;->logW(Ljava/lang/String;)V
-HSPLjava/lang/System;->runFinalization()V
-HSPLjava/lang/System;->setErr(Ljava/io/PrintStream;)V
-HSPLjava/lang/System;->setOut(Ljava/io/PrintStream;)V
-HSPLjava/lang/System;->setProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/lang/Thread$State;->values()[Ljava/lang/Thread$State;
-HSPLjava/lang/Thread;-><init>()V
-HSPLjava/lang/Thread;-><init>(Ljava/lang/Runnable;)V
-HSPLjava/lang/Thread;-><init>(Ljava/lang/Runnable;Ljava/lang/String;)V
-HSPLjava/lang/Thread;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/Thread;-><init>(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;Ljava/lang/String;)V
-HSPLjava/lang/Thread;-><init>(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;Ljava/lang/String;J)V
-HSPLjava/lang/Thread;-><init>(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;Ljava/lang/String;JLjava/security/AccessControlContext;Z)V
-HSPLjava/lang/Thread;-><init>(Ljava/lang/ThreadGroup;Ljava/lang/String;)V
-HSPLjava/lang/Thread;-><init>(Ljava/lang/ThreadGroup;Ljava/lang/String;IZ)V
-HSPLjava/lang/Thread;->activeCount()I
-HSPLjava/lang/Thread;->blockedOn(Lsun/nio/ch/Interruptible;)V
-HSPLjava/lang/Thread;->checkAccess()V
-HSPLjava/lang/Thread;->getContextClassLoader()Ljava/lang/ClassLoader;
-HSPLjava/lang/Thread;->getDefaultUncaughtExceptionHandler()Ljava/lang/Thread$UncaughtExceptionHandler;
-HSPLjava/lang/Thread;->getId()J
-HSPLjava/lang/Thread;->getName()Ljava/lang/String;
-HSPLjava/lang/Thread;->getPriority()I
-HSPLjava/lang/Thread;->getStackTrace()[Ljava/lang/StackTraceElement;
-HSPLjava/lang/Thread;->getState()Ljava/lang/Thread$State;
-HSPLjava/lang/Thread;->getThreadGroup()Ljava/lang/ThreadGroup;
-HSPLjava/lang/Thread;->getUncaughtExceptionHandler()Ljava/lang/Thread$UncaughtExceptionHandler;
-HSPLjava/lang/Thread;->init2(Ljava/lang/Thread;Z)V
-HSPLjava/lang/Thread;->interrupt()V
-HSPLjava/lang/Thread;->isAlive()Z
-HSPLjava/lang/Thread;->isDaemon()Z
-HSPLjava/lang/Thread;->join()V
-HSPLjava/lang/Thread;->join(J)V
-HSPLjava/lang/Thread;->nextThreadID()J
-HSPLjava/lang/Thread;->nextThreadNum()I
-HSPLjava/lang/Thread;->onSpinWait()V
-HSPLjava/lang/Thread;->run()V
-HSPLjava/lang/Thread;->setContextClassLoader(Ljava/lang/ClassLoader;)V
-HSPLjava/lang/Thread;->setDaemon(Z)V
-HSPLjava/lang/Thread;->setDefaultUncaughtExceptionHandler(Ljava/lang/Thread$UncaughtExceptionHandler;)V
-HSPLjava/lang/Thread;->setName(Ljava/lang/String;)V
-HSPLjava/lang/Thread;->setPriority(I)V
-HSPLjava/lang/Thread;->setSystemDaemon(Z)V
-HSPLjava/lang/Thread;->setUncaughtExceptionHandler(Ljava/lang/Thread$UncaughtExceptionHandler;)V
-HSPLjava/lang/Thread;->setUncaughtExceptionPreHandler(Ljava/lang/Thread$UncaughtExceptionHandler;)V
-HSPLjava/lang/Thread;->sleep(J)V
-HSPLjava/lang/Thread;->sleep(JI)V
-HSPLjava/lang/Thread;->start()V
-HSPLjava/lang/Thread;->toString()Ljava/lang/String;
-HSPLjava/lang/ThreadGroup;-><init>(Ljava/lang/ThreadGroup;Ljava/lang/String;)V
-HSPLjava/lang/ThreadGroup;-><init>(Ljava/lang/Void;Ljava/lang/ThreadGroup;Ljava/lang/String;)V
-HSPLjava/lang/ThreadGroup;->activeCount()I
-HSPLjava/lang/ThreadGroup;->activeGroupCount()I
-HSPLjava/lang/ThreadGroup;->add(Ljava/lang/Thread;)V
-HSPLjava/lang/ThreadGroup;->add(Ljava/lang/ThreadGroup;)V
-HSPLjava/lang/ThreadGroup;->addUnstarted()V
-HSPLjava/lang/ThreadGroup;->checkAccess()V
-HSPLjava/lang/ThreadGroup;->checkParentAccess(Ljava/lang/ThreadGroup;)Ljava/lang/Void;
-HSPLjava/lang/ThreadGroup;->enumerate([Ljava/lang/Thread;)I
-HSPLjava/lang/ThreadGroup;->enumerate([Ljava/lang/Thread;IZ)I
-HSPLjava/lang/ThreadGroup;->enumerate([Ljava/lang/ThreadGroup;)I
-HSPLjava/lang/ThreadGroup;->enumerate([Ljava/lang/ThreadGroup;IZ)I
-HSPLjava/lang/ThreadGroup;->getMaxPriority()I
-HSPLjava/lang/ThreadGroup;->getName()Ljava/lang/String;
-HSPLjava/lang/ThreadGroup;->remove(Ljava/lang/Thread;)V
-HSPLjava/lang/ThreadGroup;->threadTerminated(Ljava/lang/Thread;)V
-HSPLjava/lang/ThreadLocal$SuppliedThreadLocal;-><init>(Ljava/util/function/Supplier;)V
-HSPLjava/lang/ThreadLocal$SuppliedThreadLocal;->initialValue()Ljava/lang/Object;
-HSPLjava/lang/ThreadLocal$ThreadLocalMap$Entry;-><init>(Ljava/lang/ThreadLocal;Ljava/lang/Object;)V
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->-$$Nest$mgetEntry(Ljava/lang/ThreadLocal$ThreadLocalMap;Ljava/lang/ThreadLocal;)Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->-$$Nest$mremove(Ljava/lang/ThreadLocal$ThreadLocalMap;Ljava/lang/ThreadLocal;)V
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->-$$Nest$mset(Ljava/lang/ThreadLocal$ThreadLocalMap;Ljava/lang/ThreadLocal;Ljava/lang/Object;)V
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;-><init>(Ljava/lang/ThreadLocal$ThreadLocalMap;)V
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;-><init>(Ljava/lang/ThreadLocal;Ljava/lang/Object;)V
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->cleanSomeSlots(II)Z
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->expungeStaleEntries()V
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->expungeStaleEntry(I)I
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->getEntry(Ljava/lang/ThreadLocal;)Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->getEntryAfterMiss(Ljava/lang/ThreadLocal;ILjava/lang/ThreadLocal$ThreadLocalMap$Entry;)Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->nextIndex(II)I
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->prevIndex(II)I
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->rehash()V
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->remove(Ljava/lang/ThreadLocal;)V
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->replaceStaleEntry(Ljava/lang/ThreadLocal;Ljava/lang/Object;I)V
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->resize()V
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->set(Ljava/lang/ThreadLocal;Ljava/lang/Object;)V
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->setThreshold(I)V
-HSPLjava/lang/ThreadLocal;->-$$Nest$fgetthreadLocalHashCode(Ljava/lang/ThreadLocal;)I
-HSPLjava/lang/ThreadLocal;-><init>()V
-HSPLjava/lang/ThreadLocal;->createInheritedMap(Ljava/lang/ThreadLocal$ThreadLocalMap;)Ljava/lang/ThreadLocal$ThreadLocalMap;
-HSPLjava/lang/ThreadLocal;->createMap(Ljava/lang/Thread;Ljava/lang/Object;)V
-HSPLjava/lang/ThreadLocal;->get()Ljava/lang/Object;
-HSPLjava/lang/ThreadLocal;->getMap(Ljava/lang/Thread;)Ljava/lang/ThreadLocal$ThreadLocalMap;
-HSPLjava/lang/ThreadLocal;->initialValue()Ljava/lang/Object;
-HSPLjava/lang/ThreadLocal;->nextHashCode()I
-HSPLjava/lang/ThreadLocal;->remove()V
-HSPLjava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
-HSPLjava/lang/ThreadLocal;->setInitialValue()Ljava/lang/Object;
-HSPLjava/lang/ThreadLocal;->withInitial(Ljava/util/function/Supplier;)Ljava/lang/ThreadLocal;
-HSPLjava/lang/Throwable$PrintStreamOrWriter;-><init>()V
-HSPLjava/lang/Throwable$PrintStreamOrWriter;-><init>(Ljava/lang/Throwable$PrintStreamOrWriter-IA;)V
-HSPLjava/lang/Throwable$WrappedPrintStream;-><init>(Ljava/io/PrintStream;)V
-HSPLjava/lang/Throwable$WrappedPrintStream;->lock()Ljava/lang/Object;
-HSPLjava/lang/Throwable$WrappedPrintStream;->println(Ljava/lang/Object;)V
-HSPLjava/lang/Throwable$WrappedPrintWriter;-><init>(Ljava/io/PrintWriter;)V
-HSPLjava/lang/Throwable$WrappedPrintWriter;->lock()Ljava/lang/Object;
-HSPLjava/lang/Throwable$WrappedPrintWriter;->println(Ljava/lang/Object;)V
-HSPLjava/lang/Throwable;-><init>()V
-HSPLjava/lang/Throwable;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/Throwable;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/lang/Throwable;-><init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V
-HSPLjava/lang/Throwable;-><init>(Ljava/lang/Throwable;)V
-HSPLjava/lang/Throwable;->addSuppressed(Ljava/lang/Throwable;)V
-HSPLjava/lang/Throwable;->fillInStackTrace()Ljava/lang/Throwable;
-HSPLjava/lang/Throwable;->getCause()Ljava/lang/Throwable;
-HSPLjava/lang/Throwable;->getLocalizedMessage()Ljava/lang/String;
-HSPLjava/lang/Throwable;->getMessage()Ljava/lang/String;
-HSPLjava/lang/Throwable;->getOurStackTrace()[Ljava/lang/StackTraceElement;
-HSPLjava/lang/Throwable;->getStackTrace()[Ljava/lang/StackTraceElement;
-HSPLjava/lang/Throwable;->getSuppressed()[Ljava/lang/Throwable;
-HSPLjava/lang/Throwable;->initCause(Ljava/lang/Throwable;)Ljava/lang/Throwable;
-HSPLjava/lang/Throwable;->printEnclosedStackTrace(Ljava/lang/Throwable$PrintStreamOrWriter;[Ljava/lang/StackTraceElement;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V
-HSPLjava/lang/Throwable;->printStackTrace()V
-HSPLjava/lang/Throwable;->printStackTrace(Ljava/io/PrintStream;)V
-HSPLjava/lang/Throwable;->printStackTrace(Ljava/io/PrintWriter;)V
-HSPLjava/lang/Throwable;->printStackTrace(Ljava/lang/Throwable$PrintStreamOrWriter;)V
-HSPLjava/lang/Throwable;->readObject(Ljava/io/ObjectInputStream;)V
-HSPLjava/lang/Throwable;->setStackTrace([Ljava/lang/StackTraceElement;)V
-HSPLjava/lang/Throwable;->toString()Ljava/lang/String;
-HSPLjava/lang/Throwable;->writeObject(Ljava/io/ObjectOutputStream;)V
-HSPLjava/lang/UNIXProcess$2;-><init>(Ljava/lang/UNIXProcess;[I)V
-HSPLjava/lang/UNIXProcess$2;->run()Ljava/lang/Object;
-HSPLjava/lang/UNIXProcess$2;->run()Ljava/lang/Void;
-HSPLjava/lang/UNIXProcess$3;-><init>(Ljava/lang/UNIXProcess;)V
-HSPLjava/lang/UNIXProcess$3;->run()V
-HSPLjava/lang/UNIXProcess$ProcessPipeInputStream;-><init>(I)V
-HSPLjava/lang/UNIXProcess$ProcessPipeInputStream;->drainInputStream(Ljava/io/InputStream;)[B
-HSPLjava/lang/UNIXProcess$ProcessPipeInputStream;->processExited()V
-HSPLjava/lang/UNIXProcess$ProcessPipeOutputStream;-><init>(I)V
-HSPLjava/lang/UNIXProcess$ProcessPipeOutputStream;->processExited()V
-HSPLjava/lang/UNIXProcess$ProcessReaperThreadFactory;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;
-HSPLjava/lang/UNIXProcess;-><init>([B[BI[BI[B[IZ)V
-HSPLjava/lang/UNIXProcess;->destroy()V
-HSPLjava/lang/UNIXProcess;->exitValue()I
-HSPLjava/lang/UNIXProcess;->getErrorStream()Ljava/io/InputStream;
-HSPLjava/lang/UNIXProcess;->getInputStream()Ljava/io/InputStream;
-HSPLjava/lang/UNIXProcess;->initStreams([I)V
-HSPLjava/lang/UNIXProcess;->newFileDescriptor(I)Ljava/io/FileDescriptor;
-HSPLjava/lang/UNIXProcess;->processExited(I)V
-HSPLjava/lang/UNIXProcess;->waitFor()I
-HSPLjava/lang/UnsatisfiedLinkError;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/UnsupportedOperationException;-><init>()V
-HSPLjava/lang/UnsupportedOperationException;-><init>(Ljava/lang/String;)V
-HPLjava/lang/VMClassLoader;->createBootClassPathUrlHandlers()[Llibcore/io/ClassPathURLStreamHandler;
-HSPLjava/lang/VMClassLoader;->getResource(Ljava/lang/String;)Ljava/net/URL;
-HSPLjava/lang/VMClassLoader;->getResources(Ljava/lang/String;)Ljava/util/List;
-HSPLjava/lang/invoke/FieldVarHandle;-><init>(Ljava/lang/reflect/Field;Ljava/lang/Class;)V
-HSPLjava/lang/invoke/FieldVarHandle;->create(Ljava/lang/reflect/Field;)Ljava/lang/invoke/FieldVarHandle;
-HSPLjava/lang/invoke/MethodHandle;-><init>(JILjava/lang/invoke/MethodType;)V
-HSPLjava/lang/invoke/MethodHandleImpl;-><init>(JILjava/lang/invoke/MethodType;)V
-HSPLjava/lang/invoke/MethodHandles$Lookup;-><init>(Ljava/lang/Class;)V
-HSPLjava/lang/invoke/MethodHandles$Lookup;-><init>(Ljava/lang/Class;I)V
-HSPLjava/lang/invoke/MethodHandles$Lookup;->checkAccess(Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/String;)V
-HSPLjava/lang/invoke/MethodHandles$Lookup;->checkUnprivilegedlookupClass(Ljava/lang/Class;I)V
-HSPLjava/lang/invoke/MethodHandles$Lookup;->commonFieldChecks(Ljava/lang/reflect/Field;Ljava/lang/Class;Ljava/lang/Class;ZZ)V
-HSPLjava/lang/invoke/MethodHandles$Lookup;->createMethodHandle(Ljava/lang/reflect/Method;ILjava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
-HSPLjava/lang/invoke/MethodHandles$Lookup;->findFieldOfType(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/reflect/Field;
-HSPLjava/lang/invoke/MethodHandles$Lookup;->findVarHandle(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/VarHandle;
-HSPLjava/lang/invoke/MethodHandles$Lookup;->unreflect(Ljava/lang/reflect/Method;)Ljava/lang/invoke/MethodHandle;
-HSPLjava/lang/invoke/MethodHandles;->lookup()Ljava/lang/invoke/MethodHandles$Lookup;
-HSPLjava/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry;-><init>(Ljava/lang/Object;)V
-HSPLjava/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry;-><init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-HSPLjava/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry;->hashCode()I
-HSPLjava/lang/invoke/MethodType$ConcurrentWeakInternSet;->add(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/lang/invoke/MethodType$ConcurrentWeakInternSet;->expungeStaleElements()V
-HSPLjava/lang/invoke/MethodType$ConcurrentWeakInternSet;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/lang/invoke/MethodType;-><init>(Ljava/lang/Class;[Ljava/lang/Class;Z)V
-HSPLjava/lang/invoke/MethodType;-><init>([Ljava/lang/Class;Ljava/lang/Class;)V
-HSPLjava/lang/invoke/MethodType;->checkPtype(Ljava/lang/Class;)V
-HSPLjava/lang/invoke/MethodType;->checkPtypes([Ljava/lang/Class;)I
-HSPLjava/lang/invoke/MethodType;->checkRtype(Ljava/lang/Class;)V
-HSPLjava/lang/invoke/MethodType;->checkSlotCount(I)V
-HSPLjava/lang/invoke/MethodType;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/invoke/MethodType;->equals(Ljava/lang/invoke/MethodType;)Z
-HSPLjava/lang/invoke/MethodType;->form()Ljava/lang/invoke/MethodTypeForm;
-HSPLjava/lang/invoke/MethodType;->genericMethodType(I)Ljava/lang/invoke/MethodType;
-HSPLjava/lang/invoke/MethodType;->genericMethodType(IZ)Ljava/lang/invoke/MethodType;
-HSPLjava/lang/invoke/MethodType;->hashCode()I
-HSPLjava/lang/invoke/MethodType;->insertParameterTypes(I[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;
-HSPLjava/lang/invoke/MethodType;->makeImpl(Ljava/lang/Class;[Ljava/lang/Class;Z)Ljava/lang/invoke/MethodType;
-HSPLjava/lang/invoke/MethodType;->methodType(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;
-HSPLjava/lang/invoke/MethodType;->parameterSlotCount()I
-HSPLjava/lang/invoke/MethodType;->ptypes()[Ljava/lang/Class;
-HSPLjava/lang/invoke/MethodType;->returnType()Ljava/lang/Class;
-HSPLjava/lang/invoke/MethodTypeForm;-><init>(Ljava/lang/invoke/MethodType;)V
-HSPLjava/lang/invoke/MethodTypeForm;->canonicalize(Ljava/lang/Class;I)Ljava/lang/Class;
-HSPLjava/lang/invoke/MethodTypeForm;->canonicalize(Ljava/lang/invoke/MethodType;II)Ljava/lang/invoke/MethodType;
-HSPLjava/lang/invoke/MethodTypeForm;->canonicalizeAll([Ljava/lang/Class;I)[Ljava/lang/Class;
-HSPLjava/lang/invoke/MethodTypeForm;->findForm(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodTypeForm;
-HSPLjava/lang/invoke/MethodTypeForm;->pack(IIII)J
-HSPLjava/lang/invoke/MethodTypeForm;->parameterSlotCount()I
-HSPLjava/lang/invoke/MethodTypeForm;->unpack(JI)C
-HSPLjava/lang/invoke/VarHandle;-><init>(Ljava/lang/Class;ZLjava/lang/Class;)V
-HSPLjava/lang/invoke/VarHandle;->acquireFence()V
-HSPLjava/lang/invoke/VarHandle;->alignedAccessModesBitMask(Ljava/lang/Class;Z)I
-HSPLjava/lang/invoke/VarHandle;->fullFence()V
-HSPLjava/lang/invoke/VarHandle;->loadLoadFence()V
-HSPLjava/lang/invoke/VarHandle;->releaseFence()V
-HSPLjava/lang/invoke/VarHandle;->storeStoreFence()V
-HSPLjava/lang/ref/Cleaner$1;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/lang/ref/Cleaner$1;->apply(Ljava/lang/ref/Cleaner;)Ljdk/internal/ref/CleanerImpl;
-HSPLjava/lang/ref/Cleaner;->register(Ljava/lang/Object;Ljava/lang/Runnable;)Ljava/lang/ref/Cleaner$Cleanable;
-HSPLjava/lang/ref/FinalizerReference$Sentinel;-><init>()V
-HSPLjava/lang/ref/FinalizerReference$Sentinel;-><init>(Ljava/lang/ref/FinalizerReference$Sentinel-IA;)V
-HSPLjava/lang/ref/FinalizerReference$Sentinel;->awaitFinalization(J)V
-HSPLjava/lang/ref/FinalizerReference$Sentinel;->finalize()V
-HSPLjava/lang/ref/FinalizerReference;-><init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-HSPLjava/lang/ref/FinalizerReference;->add(Ljava/lang/Object;)V
-HSPLjava/lang/ref/FinalizerReference;->clear()V
-HSPLjava/lang/ref/FinalizerReference;->enqueueSentinelReference(Ljava/lang/ref/FinalizerReference$Sentinel;)Z
-HSPLjava/lang/ref/FinalizerReference;->finalizeAllEnqueued(J)V
-HSPLjava/lang/ref/FinalizerReference;->get()Ljava/lang/Object;
-HSPLjava/lang/ref/FinalizerReference;->remove(Ljava/lang/ref/FinalizerReference;)V
-HSPLjava/lang/ref/PhantomReference;-><init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-HSPLjava/lang/ref/Reference$SinkHolder;->-$$Nest$sfgetfinalize_count()I
-HSPLjava/lang/ref/Reference;-><init>(Ljava/lang/Object;)V
-HSPLjava/lang/ref/Reference;-><init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-HSPLjava/lang/ref/Reference;->clear()V
-HSPLjava/lang/ref/Reference;->get()Ljava/lang/Object;
-HSPLjava/lang/ref/Reference;->reachabilityFence(Ljava/lang/Object;)V
-HSPLjava/lang/ref/Reference;->refersTo(Ljava/lang/Object;)Z
-HSPLjava/lang/ref/ReferenceQueue;-><init>()V
-HSPLjava/lang/ref/ReferenceQueue;->add(Ljava/lang/ref/Reference;)V
-HSPLjava/lang/ref/ReferenceQueue;->enqueueLocked(Ljava/lang/ref/Reference;)Z
-HSPLjava/lang/ref/ReferenceQueue;->enqueuePending(Ljava/lang/ref/Reference;Ljava/util/concurrent/atomic/AtomicInteger;)V
-HSPLjava/lang/ref/ReferenceQueue;->poll()Ljava/lang/ref/Reference;
-HSPLjava/lang/ref/ReferenceQueue;->reallyPollLocked()Ljava/lang/ref/Reference;
-HSPLjava/lang/ref/ReferenceQueue;->remove()Ljava/lang/ref/Reference;
-HSPLjava/lang/ref/ReferenceQueue;->remove(J)Ljava/lang/ref/Reference;
-HSPLjava/lang/ref/SoftReference;-><init>(Ljava/lang/Object;)V
-HSPLjava/lang/ref/SoftReference;-><init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-HSPLjava/lang/ref/SoftReference;->get()Ljava/lang/Object;
-HSPLjava/lang/ref/WeakReference;-><init>(Ljava/lang/Object;)V
-HSPLjava/lang/ref/WeakReference;-><init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-HSPLjava/lang/reflect/AccessibleObject;-><init>()V
-HSPLjava/lang/reflect/AccessibleObject;->getAnnotations()[Ljava/lang/annotation/Annotation;
-HSPLjava/lang/reflect/AccessibleObject;->isAccessible()Z
-HSPLjava/lang/reflect/AccessibleObject;->setAccessible(Z)V
-HSPLjava/lang/reflect/AccessibleObject;->setAccessible0(Ljava/lang/reflect/AccessibleObject;Z)V
-HSPLjava/lang/reflect/Array;->get(Ljava/lang/Object;I)Ljava/lang/Object;
-HSPLjava/lang/reflect/Array;->getLength(Ljava/lang/Object;)I
-HSPLjava/lang/reflect/Array;->newArray(Ljava/lang/Class;I)Ljava/lang/Object;
-HSPLjava/lang/reflect/Array;->newInstance(Ljava/lang/Class;I)Ljava/lang/Object;
-HSPLjava/lang/reflect/Array;->newInstance(Ljava/lang/Class;[I)Ljava/lang/Object;
-HSPLjava/lang/reflect/Array;->set(Ljava/lang/Object;ILjava/lang/Object;)V
-HSPLjava/lang/reflect/Array;->setInt(Ljava/lang/Object;II)V
-HSPLjava/lang/reflect/Constructor;-><init>(Ljava/lang/Class;Ljava/lang/Class;)V
-HSPLjava/lang/reflect/Constructor;->getDeclaredAnnotations()[Ljava/lang/annotation/Annotation;
-HSPLjava/lang/reflect/Constructor;->getDeclaringClass()Ljava/lang/Class;
-HSPLjava/lang/reflect/Constructor;->getGenericParameterTypes()[Ljava/lang/reflect/Type;
-HSPLjava/lang/reflect/Constructor;->getModifiers()I
-HSPLjava/lang/reflect/Constructor;->getName()Ljava/lang/String;
-HSPLjava/lang/reflect/Constructor;->getParameterAnnotations()[[Ljava/lang/annotation/Annotation;
-HSPLjava/lang/reflect/Constructor;->getParameterTypes()[Ljava/lang/Class;
-HSPLjava/lang/reflect/Constructor;->newInstance([Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/lang/reflect/Constructor;->serializationCopy(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
-HSPLjava/lang/reflect/Executable$GenericInfo;-><init>(Llibcore/reflect/ListOfTypes;Llibcore/reflect/ListOfTypes;Ljava/lang/reflect/Type;[Ljava/lang/reflect/TypeVariable;)V
-HSPLjava/lang/reflect/Executable;-><init>()V
-HSPLjava/lang/reflect/Executable;->equalNameAndParametersInternal(Ljava/lang/reflect/Method;)Z
-HSPLjava/lang/reflect/Executable;->equalParamTypes([Ljava/lang/Class;[Ljava/lang/Class;)Z
-HSPLjava/lang/reflect/Executable;->fixMethodFlags(I)I
-HSPLjava/lang/reflect/Executable;->getAccessFlags()I
-HSPLjava/lang/reflect/Executable;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
-HSPLjava/lang/reflect/Executable;->getArtMethod()J
-HSPLjava/lang/reflect/Executable;->getDeclaredAnnotations()[Ljava/lang/annotation/Annotation;
-HSPLjava/lang/reflect/Executable;->getDeclaringClassInternal()Ljava/lang/Class;
-HSPLjava/lang/reflect/Executable;->getGenericParameterTypes()[Ljava/lang/reflect/Type;
-HSPLjava/lang/reflect/Executable;->getMethodOrConstructorGenericInfoInternal()Ljava/lang/reflect/Executable$GenericInfo;
-HSPLjava/lang/reflect/Executable;->getModifiersInternal()I
-HSPLjava/lang/reflect/Executable;->getParameterAnnotationsInternal()[[Ljava/lang/annotation/Annotation;
-HSPLjava/lang/reflect/Executable;->getSignatureAttribute()Ljava/lang/String;
-HSPLjava/lang/reflect/Executable;->isAnnotationPresent(Ljava/lang/Class;)Z
-HSPLjava/lang/reflect/Executable;->isBridgeMethodInternal()Z
-HSPLjava/lang/reflect/Executable;->isDefaultMethodInternal()Z
-HSPLjava/lang/reflect/Executable;->isSynthetic()Z
-HSPLjava/lang/reflect/Executable;->isVarArgs()Z
-HSPLjava/lang/reflect/Executable;->printModifiersIfNonzero(Ljava/lang/StringBuilder;IZ)V
-HSPLjava/lang/reflect/Executable;->separateWithCommas([Ljava/lang/Class;Ljava/lang/StringBuilder;)V
-HSPLjava/lang/reflect/Executable;->sharedToString(IZ[Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/String;
-HSPLjava/lang/reflect/Field;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
-HSPLjava/lang/reflect/Field;->getDeclaringClass()Ljava/lang/Class;
-HSPLjava/lang/reflect/Field;->getGenericType()Ljava/lang/reflect/Type;
-HSPLjava/lang/reflect/Field;->getModifiers()I
-HSPLjava/lang/reflect/Field;->getName()Ljava/lang/String;
-HSPLjava/lang/reflect/Field;->getOffset()I
-HSPLjava/lang/reflect/Field;->getSignatureAttribute()Ljava/lang/String;
-HSPLjava/lang/reflect/Field;->getType()Ljava/lang/Class;
-HSPLjava/lang/reflect/Field;->hashCode()I
-HSPLjava/lang/reflect/Field;->isAnnotationPresent(Ljava/lang/Class;)Z
-HSPLjava/lang/reflect/Field;->isEnumConstant()Z
-HSPLjava/lang/reflect/Field;->isSynthetic()Z
-HSPLjava/lang/reflect/InvocationTargetException;-><init>(Ljava/lang/Throwable;)V
-HSPLjava/lang/reflect/InvocationTargetException;->getCause()Ljava/lang/Throwable;
-HSPLjava/lang/reflect/Method$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/lang/reflect/Method$1;->compare(Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)I
-HSPLjava/lang/reflect/Method;->equalNameAndParameters(Ljava/lang/reflect/Method;)Z
-HSPLjava/lang/reflect/Method;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/reflect/Method;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
-HSPLjava/lang/reflect/Method;->getDeclaredAnnotations()[Ljava/lang/annotation/Annotation;
-HSPLjava/lang/reflect/Method;->getDeclaringClass()Ljava/lang/Class;
-HSPLjava/lang/reflect/Method;->getGenericParameterTypes()[Ljava/lang/reflect/Type;
-HSPLjava/lang/reflect/Method;->getGenericReturnType()Ljava/lang/reflect/Type;
-HSPLjava/lang/reflect/Method;->getModifiers()I
-HSPLjava/lang/reflect/Method;->getName()Ljava/lang/String;
-HSPLjava/lang/reflect/Method;->getParameterAnnotations()[[Ljava/lang/annotation/Annotation;
-HSPLjava/lang/reflect/Method;->getParameterTypes()[Ljava/lang/Class;
-HSPLjava/lang/reflect/Method;->getReturnType()Ljava/lang/Class;
-HSPLjava/lang/reflect/Method;->hashCode()I
-HSPLjava/lang/reflect/Method;->isBridge()Z
-HSPLjava/lang/reflect/Method;->isDefault()Z
-HSPLjava/lang/reflect/Method;->isSynthetic()Z
-HSPLjava/lang/reflect/Method;->isVarArgs()Z
-HSPLjava/lang/reflect/Method;->specificToStringHeader(Ljava/lang/StringBuilder;)V
-HSPLjava/lang/reflect/Method;->toString()Ljava/lang/String;
-HSPLjava/lang/reflect/Modifier;->isAbstract(I)Z
-HSPLjava/lang/reflect/Modifier;->isFinal(I)Z
-HSPLjava/lang/reflect/Modifier;->isInterface(I)Z
-HSPLjava/lang/reflect/Modifier;->isPrivate(I)Z
-HSPLjava/lang/reflect/Modifier;->isProtected(I)Z
-HSPLjava/lang/reflect/Modifier;->isPublic(I)Z
-HSPLjava/lang/reflect/Modifier;->isStatic(I)Z
-HSPLjava/lang/reflect/Modifier;->isSynthetic(I)Z
-HSPLjava/lang/reflect/Modifier;->isTransient(I)Z
-HSPLjava/lang/reflect/Modifier;->isVolatile(I)Z
-HSPLjava/lang/reflect/Modifier;->methodModifiers()I
-HSPLjava/lang/reflect/Modifier;->toString(I)Ljava/lang/String;
-HSPLjava/lang/reflect/Proxy$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/lang/reflect/Proxy$1;->compare(Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)I
-HSPLjava/lang/reflect/Proxy$Key1;-><init>(Ljava/lang/Class;)V
-HSPLjava/lang/reflect/Proxy$Key1;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/reflect/Proxy$Key1;->hashCode()I
-HSPLjava/lang/reflect/Proxy$KeyFactory;->apply(Ljava/lang/ClassLoader;[Ljava/lang/Class;)Ljava/lang/Object;
-HSPLjava/lang/reflect/Proxy$KeyFactory;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/lang/reflect/Proxy$ProxyClassFactory;->apply(Ljava/lang/ClassLoader;[Ljava/lang/Class;)Ljava/lang/Class;
-HSPLjava/lang/reflect/Proxy$ProxyClassFactory;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/lang/reflect/Proxy;->-$$Nest$sfgetORDER_BY_SIGNATURE_AND_SUBTYPE()Ljava/util/Comparator;
-HSPLjava/lang/reflect/Proxy;->-$$Nest$smdeduplicateAndGetExceptions(Ljava/util/List;)Ljava/util/List;
-HSPLjava/lang/reflect/Proxy;->-$$Nest$smgenerateProxy(Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/ClassLoader;[Ljava/lang/reflect/Method;[[Ljava/lang/Class;)Ljava/lang/Class;
-HSPLjava/lang/reflect/Proxy;->-$$Nest$smgetMethods([Ljava/lang/Class;)Ljava/util/List;
-HSPLjava/lang/reflect/Proxy;->-$$Nest$smvalidateReturnTypes(Ljava/util/List;)V
-HSPLjava/lang/reflect/Proxy;->deduplicateAndGetExceptions(Ljava/util/List;)Ljava/util/List;
-HSPLjava/lang/reflect/Proxy;->getMethods([Ljava/lang/Class;)Ljava/util/List;
-HSPLjava/lang/reflect/Proxy;->getMethodsRecursive([Ljava/lang/Class;Ljava/util/List;)V
-HSPLjava/lang/reflect/Proxy;->getProxyClass0(Ljava/lang/ClassLoader;[Ljava/lang/Class;)Ljava/lang/Class;
-HSPLjava/lang/reflect/Proxy;->intersectExceptions([Ljava/lang/Class;[Ljava/lang/Class;)[Ljava/lang/Class;
-HSPLjava/lang/reflect/Proxy;->invoke(Ljava/lang/reflect/Proxy;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/lang/reflect/Proxy;->isProxyClass(Ljava/lang/Class;)Z
-HSPLjava/lang/reflect/Proxy;->newProxyInstance(Ljava/lang/ClassLoader;[Ljava/lang/Class;Ljava/lang/reflect/InvocationHandler;)Ljava/lang/Object;
-HSPLjava/lang/reflect/Proxy;->validateReturnTypes(Ljava/util/List;)V
-HSPLjava/lang/reflect/WeakCache$CacheKey;-><init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-HSPLjava/lang/reflect/WeakCache$CacheKey;->equals(Ljava/lang/Object;)Z
-HSPLjava/lang/reflect/WeakCache$CacheKey;->hashCode()I
-HSPLjava/lang/reflect/WeakCache$CacheKey;->valueOf(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)Ljava/lang/Object;
-HSPLjava/lang/reflect/WeakCache$CacheValue;-><init>(Ljava/lang/Object;)V
-HSPLjava/lang/reflect/WeakCache$CacheValue;->hashCode()I
-HSPLjava/lang/reflect/WeakCache$Factory;-><init>(Ljava/lang/reflect/WeakCache;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/util/concurrent/ConcurrentMap;)V
-HSPLjava/lang/reflect/WeakCache$Factory;->get()Ljava/lang/Object;
-HSPLjava/lang/reflect/WeakCache;->-$$Nest$fgetreverseMap(Ljava/lang/reflect/WeakCache;)Ljava/util/concurrent/ConcurrentMap;
-HSPLjava/lang/reflect/WeakCache;->-$$Nest$fgetvalueFactory(Ljava/lang/reflect/WeakCache;)Ljava/util/function/BiFunction;
-HSPLjava/lang/reflect/WeakCache;->expungeStaleEntries()V
-HSPLjava/lang/reflect/WeakCache;->get(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/math/BigDecimal;-><init>(I)V
-HSPLjava/math/BigDecimal;-><init>(J)V
-HSPLjava/math/BigDecimal;-><init>(Ljava/lang/String;)V
-HSPLjava/math/BigDecimal;-><init>(Ljava/math/BigInteger;)V
-HSPLjava/math/BigDecimal;-><init>(Ljava/math/BigInteger;JII)V
-HSPLjava/math/BigDecimal;-><init>([CII)V
-HSPLjava/math/BigDecimal;-><init>([CIILjava/math/MathContext;)V
-HSPLjava/math/BigDecimal;->add(JIJI)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->add(JJ)J
-HSPLjava/math/BigDecimal;->add(JJI)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->add(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->checkScale(J)I
-HSPLjava/math/BigDecimal;->checkScale(JJ)I
-HSPLjava/math/BigDecimal;->commonNeedIncrement(IIIZ)Z
-HSPLjava/math/BigDecimal;->compactValFor(Ljava/math/BigInteger;)J
-HSPLjava/math/BigDecimal;->compareTo(Ljava/math/BigDecimal;)I
-HSPLjava/math/BigDecimal;->createAndStripZerosToMatchScale(JIJ)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->divide(JIJIII)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->divide(Ljava/math/BigDecimal;II)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->divide(Ljava/math/BigDecimal;ILjava/math/RoundingMode;)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->divide(Ljava/math/BigDecimal;Ljava/math/RoundingMode;)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->divideAndRound(JJIII)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->getValueString(ILjava/lang/String;I)Ljava/lang/String;
-HSPLjava/math/BigDecimal;->inflated()Ljava/math/BigInteger;
-HSPLjava/math/BigDecimal;->layoutChars(Z)Ljava/lang/String;
-HSPLjava/math/BigDecimal;->longCompareMagnitude(JJ)I
-HSPLjava/math/BigDecimal;->longMultiplyPowerTen(JI)J
-HSPLjava/math/BigDecimal;->longValueExact()J
-HSPLjava/math/BigDecimal;->movePointLeft(I)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->movePointRight(I)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->multiply(JJ)J
-HSPLjava/math/BigDecimal;->multiply(JJI)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->multiply(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->needIncrement(JIIJJ)Z
-HSPLjava/math/BigDecimal;->scale()I
-HSPLjava/math/BigDecimal;->scaleByPowerOfTen(I)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->setScale(II)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->setScale(ILjava/math/RoundingMode;)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->signum()I
-HSPLjava/math/BigDecimal;->stripTrailingZeros()Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->subtract(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->toBigInteger()Ljava/math/BigInteger;
-HSPLjava/math/BigDecimal;->toBigIntegerExact()Ljava/math/BigInteger;
-HSPLjava/math/BigDecimal;->toPlainString()Ljava/lang/String;
-HSPLjava/math/BigDecimal;->toString()Ljava/lang/String;
-HSPLjava/math/BigDecimal;->valueOf(J)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->valueOf(JI)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->zeroValueOf(I)Ljava/math/BigDecimal;
-HSPLjava/math/BigInteger$UnsafeHolder;-><clinit>()V
-HSPLjava/math/BigInteger;-><init>(I[B)V
-HSPLjava/math/BigInteger;-><init>(I[BII)V
-HSPLjava/math/BigInteger;-><init>(I[I)V
-HSPLjava/math/BigInteger;-><init>(J)V
-HSPLjava/math/BigInteger;-><init>(Ljava/lang/String;)V
-HSPLjava/math/BigInteger;-><init>(Ljava/lang/String;I)V
-HSPLjava/math/BigInteger;-><init>([B)V
-HSPLjava/math/BigInteger;-><init>([BII)V
-HSPLjava/math/BigInteger;-><init>([II)V
-HSPLjava/math/BigInteger;->abs()Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->add(Ljava/math/BigInteger;)Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->add([I[I)[I
-HSPLjava/math/BigInteger;->bigEndInts2NewBN([IZ)J
-HSPLjava/math/BigInteger;->bitLength()I
-HSPLjava/math/BigInteger;->bitLengthForInt(I)I
-HSPLjava/math/BigInteger;->bn2BigEndInts(J)[I
-HSPLjava/math/BigInteger;->compareMagnitude(Ljava/math/BigInteger;)I
-HSPLjava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I
-HSPLjava/math/BigInteger;->destructiveMulAdd([III)V
-HSPLjava/math/BigInteger;->divideAndRemainder(Ljava/math/BigInteger;)[Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->divideAndRemainderKnuth(Ljava/math/BigInteger;)[Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->equals(Ljava/lang/Object;)Z
-HSPLjava/math/BigInteger;->firstNonzeroIntNum()I
-HSPLjava/math/BigInteger;->getInt(I)I
-HSPLjava/math/BigInteger;->getLowestSetBit()I
-HSPLjava/math/BigInteger;->hashCode()I
-HSPLjava/math/BigInteger;->implMultiplyToLen([II[II[I)[I
-HSPLjava/math/BigInteger;->intValue()I
-HSPLjava/math/BigInteger;->longValue()J
-HSPLjava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->multiply(Ljava/math/BigInteger;Z)Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->multiplyByInt([III)Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->multiplyToLen([II[II[I)[I
-HSPLjava/math/BigInteger;->padWithZeros(Ljava/lang/StringBuilder;I)V
-HSPLjava/math/BigInteger;->pow(I)Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->readObject(Ljava/io/ObjectInputStream;)V
-HSPLjava/math/BigInteger;->remainder(Ljava/math/BigInteger;)Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->remainderKnuth(Ljava/math/BigInteger;)Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->reverse([I)[I
-HSPLjava/math/BigInteger;->shiftLeft(I)Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->shiftLeft([II)[I
-HSPLjava/math/BigInteger;->shiftRight(I)Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->shiftRightImpl(I)Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->signInt()I
-HSPLjava/math/BigInteger;->signum()I
-HSPLjava/math/BigInteger;->smallToString(ILjava/lang/StringBuilder;I)V
-HSPLjava/math/BigInteger;->stripLeadingZeroBytes([BII)[I
-HSPLjava/math/BigInteger;->stripLeadingZeroInts([I)[I
-HSPLjava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;
-HSPLjava/math/BigInteger;->subtract([I[I)[I
-HSPLjava/math/BigInteger;->testBit(I)Z
-HSPLjava/math/BigInteger;->toByteArray()[B
-HSPLjava/math/BigInteger;->toString()Ljava/lang/String;
-HSPLjava/math/BigInteger;->toString(I)Ljava/lang/String;
-HSPLjava/math/BigInteger;->toString(Ljava/math/BigInteger;Ljava/lang/StringBuilder;II)V
-HSPLjava/math/BigInteger;->trustedStripLeadingZeroInts([I)[I
-HSPLjava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
-HSPLjava/math/MathContext;->equals(Ljava/lang/Object;)Z
-HSPLjava/math/MathContext;->getPrecision()I
-HSPLjava/math/MathContext;->getRoundingMode()Ljava/math/RoundingMode;
-HSPLjava/math/MutableBigInteger;-><clinit>()V
-HSPLjava/math/MutableBigInteger;-><init>()V
-HSPLjava/math/MutableBigInteger;-><init>(I)V
-HSPLjava/math/MutableBigInteger;-><init>(Ljava/math/MutableBigInteger;)V
-HSPLjava/math/MutableBigInteger;-><init>([I)V
-HSPLjava/math/MutableBigInteger;->clear()V
-HSPLjava/math/MutableBigInteger;->compare(Ljava/math/MutableBigInteger;)I
-HSPLjava/math/MutableBigInteger;->copyAndShift([III[III)V
-HSPLjava/math/MutableBigInteger;->divWord(JI)J
-HSPLjava/math/MutableBigInteger;->divide(Ljava/math/MutableBigInteger;Ljava/math/MutableBigInteger;)Ljava/math/MutableBigInteger;
-HSPLjava/math/MutableBigInteger;->divide(Ljava/math/MutableBigInteger;Ljava/math/MutableBigInteger;Z)Ljava/math/MutableBigInteger;
-HSPLjava/math/MutableBigInteger;->divideKnuth(Ljava/math/MutableBigInteger;Ljava/math/MutableBigInteger;)Ljava/math/MutableBigInteger;
-HSPLjava/math/MutableBigInteger;->divideKnuth(Ljava/math/MutableBigInteger;Ljava/math/MutableBigInteger;Z)Ljava/math/MutableBigInteger;
-HSPLjava/math/MutableBigInteger;->divideMagnitude(Ljava/math/MutableBigInteger;Ljava/math/MutableBigInteger;Z)Ljava/math/MutableBigInteger;
-HSPLjava/math/MutableBigInteger;->divideOneWord(ILjava/math/MutableBigInteger;)I
-HSPLjava/math/MutableBigInteger;->getLowestSetBit()I
-HSPLjava/math/MutableBigInteger;->getMagnitudeArray()[I
-HSPLjava/math/MutableBigInteger;->mulsub([I[IIII)I
-HSPLjava/math/MutableBigInteger;->normalize()V
-HSPLjava/math/MutableBigInteger;->primitiveLeftShift(I)V
-HSPLjava/math/MutableBigInteger;->rightShift(I)V
-HSPLjava/math/MutableBigInteger;->toBigInteger(I)Ljava/math/BigInteger;
-HSPLjava/math/MutableBigInteger;->unsignedLongCompare(JJ)Z
-HSPLjava/math/RoundingMode;->valueOf(I)Ljava/math/RoundingMode;
-HSPLjava/math/RoundingMode;->values()[Ljava/math/RoundingMode;
-HSPLjava/net/AbstractPlainDatagramSocketImpl;-><init>()V
-HSPLjava/net/AbstractPlainDatagramSocketImpl;->bind(ILjava/net/InetAddress;)V
-HSPLjava/net/AbstractPlainDatagramSocketImpl;->close()V
-HSPLjava/net/AbstractPlainDatagramSocketImpl;->create()V
-HSPLjava/net/AbstractPlainDatagramSocketImpl;->finalize()V
-HSPLjava/net/AbstractPlainDatagramSocketImpl;->isClosed()Z
-HSPLjava/net/AbstractPlainDatagramSocketImpl;->receive(Ljava/net/DatagramPacket;)V
-HSPLjava/net/AbstractPlainDatagramSocketImpl;->setOption(ILjava/lang/Object;)V
-HSPLjava/net/AbstractPlainSocketImpl;-><init>()V
-HSPLjava/net/AbstractPlainSocketImpl;->accept(Ljava/net/SocketImpl;)V
-HSPLjava/net/AbstractPlainSocketImpl;->acquireFD()Ljava/io/FileDescriptor;
-HSPLjava/net/AbstractPlainSocketImpl;->bind(Ljava/net/InetAddress;I)V
-HSPLjava/net/AbstractPlainSocketImpl;->close()V
-HSPLjava/net/AbstractPlainSocketImpl;->connect(Ljava/net/SocketAddress;I)V
-HSPLjava/net/AbstractPlainSocketImpl;->connectToAddress(Ljava/net/InetAddress;II)V
-HSPLjava/net/AbstractPlainSocketImpl;->create(Z)V
-HSPLjava/net/AbstractPlainSocketImpl;->doConnect(Ljava/net/InetAddress;II)V
-HSPLjava/net/AbstractPlainSocketImpl;->finalize()V
-HSPLjava/net/AbstractPlainSocketImpl;->getInputStream()Ljava/io/InputStream;
-HSPLjava/net/AbstractPlainSocketImpl;->getOption(I)Ljava/lang/Object;
-HSPLjava/net/AbstractPlainSocketImpl;->getOutputStream()Ljava/io/OutputStream;
-HSPLjava/net/AbstractPlainSocketImpl;->getTimeout()I
-HSPLjava/net/AbstractPlainSocketImpl;->isClosedOrPending()Z
-HSPLjava/net/AbstractPlainSocketImpl;->isConnectionReset()Z
-HSPLjava/net/AbstractPlainSocketImpl;->isConnectionResetPending()Z
-HSPLjava/net/AbstractPlainSocketImpl;->listen(I)V
-HSPLjava/net/AbstractPlainSocketImpl;->releaseFD()V
-HSPLjava/net/AbstractPlainSocketImpl;->setOption(ILjava/lang/Object;)V
-HSPLjava/net/AbstractPlainSocketImpl;->socketClose()V
-HSPLjava/net/AbstractPlainSocketImpl;->socketPreClose()V
-HSPLjava/net/AddressCache$AddressCacheEntry;-><init>(Ljava/lang/Object;)V
-HSPLjava/net/AddressCache$AddressCacheKey;-><init>(Ljava/lang/String;I)V
-HSPLjava/net/AddressCache$AddressCacheKey;->equals(Ljava/lang/Object;)Z
-HSPLjava/net/AddressCache$AddressCacheKey;->hashCode()I
-HSPLjava/net/AddressCache;->clear()V
-HSPLjava/net/AddressCache;->get(Ljava/lang/String;I)Ljava/lang/Object;
-HSPLjava/net/AddressCache;->put(Ljava/lang/String;I[Ljava/net/InetAddress;)V
-HSPLjava/net/AddressCache;->putUnknownHost(Ljava/lang/String;ILjava/lang/String;)V
-HSPLjava/net/ConnectException;-><init>(Ljava/lang/String;)V
-HSPLjava/net/ConnectException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/net/CookieHandler;-><init>()V
-HSPLjava/net/CookieHandler;->getDefault()Ljava/net/CookieHandler;
-HSPLjava/net/CookieManager$CookiePathComparator;-><init>()V
-HSPLjava/net/CookieManager;-><init>()V
-HSPLjava/net/CookieManager;-><init>(Ljava/net/CookieStore;Ljava/net/CookiePolicy;)V
-HSPLjava/net/CookieManager;->get(Ljava/net/URI;Ljava/util/Map;)Ljava/util/Map;
-HSPLjava/net/CookieManager;->getCookieStore()Ljava/net/CookieStore;
-HSPLjava/net/CookieManager;->normalizePath(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/net/CookieManager;->pathMatches(Ljava/net/URI;Ljava/net/HttpCookie;)Z
-HSPLjava/net/CookieManager;->put(Ljava/net/URI;Ljava/util/Map;)V
-HSPLjava/net/CookieManager;->shouldAcceptInternal(Ljava/net/URI;Ljava/net/HttpCookie;)Z
-HSPLjava/net/CookieManager;->sortByPath(Ljava/util/List;)Ljava/util/List;
-HSPLjava/net/CookiePolicy$3;->shouldAccept(Ljava/net/URI;Ljava/net/HttpCookie;)Z
-HSPLjava/net/DatagramPacket;-><init>([BI)V
-HSPLjava/net/DatagramPacket;-><init>([BII)V
-HSPLjava/net/DatagramPacket;-><init>([BIILjava/net/InetAddress;I)V
-HSPLjava/net/DatagramPacket;-><init>([BILjava/net/InetAddress;I)V
-HSPLjava/net/DatagramPacket;->getAddress()Ljava/net/InetAddress;
-HSPLjava/net/DatagramPacket;->getData()[B
-HSPLjava/net/DatagramPacket;->getLength()I
-HSPLjava/net/DatagramPacket;->getOffset()I
-HSPLjava/net/DatagramPacket;->getPort()I
-HSPLjava/net/DatagramPacket;->setAddress(Ljava/net/InetAddress;)V
-HSPLjava/net/DatagramPacket;->setData([BII)V
-HSPLjava/net/DatagramPacket;->setPort(I)V
-HSPLjava/net/DatagramPacket;->setReceivedLength(I)V
-HSPLjava/net/DatagramSocket$1;-><init>(Ljava/net/DatagramSocket;)V
-HSPLjava/net/DatagramSocket$1;->run()Ljava/lang/Object;
-HSPLjava/net/DatagramSocket$1;->run()Ljava/lang/Void;
-HSPLjava/net/DatagramSocket;-><init>()V
-HSPLjava/net/DatagramSocket;-><init>(Ljava/net/SocketAddress;)V
-HSPLjava/net/DatagramSocket;->bind(Ljava/net/SocketAddress;)V
-HSPLjava/net/DatagramSocket;->checkAddress(Ljava/net/InetAddress;Ljava/lang/String;)V
-HSPLjava/net/DatagramSocket;->checkOldImpl()V
-HSPLjava/net/DatagramSocket;->close()V
-HSPLjava/net/DatagramSocket;->createImpl()V
-HSPLjava/net/DatagramSocket;->getImpl()Ljava/net/DatagramSocketImpl;
-HSPLjava/net/DatagramSocket;->isBound()Z
-HSPLjava/net/DatagramSocket;->isClosed()Z
-HSPLjava/net/DatagramSocket;->receive(Ljava/net/DatagramPacket;)V
-HSPLjava/net/DatagramSocket;->send(Ljava/net/DatagramPacket;)V
-HSPLjava/net/DatagramSocket;->setReuseAddress(Z)V
-HSPLjava/net/DatagramSocket;->setSoTimeout(I)V
-HSPLjava/net/DatagramSocketImpl;-><init>()V
-HSPLjava/net/DatagramSocketImpl;->setDatagramSocket(Ljava/net/DatagramSocket;)V
-HSPLjava/net/DefaultDatagramSocketImplFactory;->createDatagramSocketImpl(Z)Ljava/net/DatagramSocketImpl;
-HSPLjava/net/HttpCookie$11;->assign(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/HttpCookie$4;->assign(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/HttpCookie$6;->assign(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/HttpCookie$8;->assign(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/HttpCookie$9;->assign(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/HttpCookie;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/HttpCookie;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/HttpCookie;->assignAttribute(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/HttpCookie;->domainMatches(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLjava/net/HttpCookie;->equals(Ljava/lang/Object;)Z
-HSPLjava/net/HttpCookie;->equalsIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLjava/net/HttpCookie;->getDomain()Ljava/lang/String;
-HSPLjava/net/HttpCookie;->getMaxAge()J
-HSPLjava/net/HttpCookie;->getName()Ljava/lang/String;
-HSPLjava/net/HttpCookie;->getPath()Ljava/lang/String;
-HSPLjava/net/HttpCookie;->getPortlist()Ljava/lang/String;
-HSPLjava/net/HttpCookie;->getValue()Ljava/lang/String;
-HSPLjava/net/HttpCookie;->getVersion()I
-HSPLjava/net/HttpCookie;->guessCookieVersion(Ljava/lang/String;)I
-HSPLjava/net/HttpCookie;->hasExpired()Z
-HSPLjava/net/HttpCookie;->isFullyQualifiedDomainName(Ljava/lang/String;I)Z
-HSPLjava/net/HttpCookie;->isToken(Ljava/lang/String;)Z
-HSPLjava/net/HttpCookie;->parse(Ljava/lang/String;)Ljava/util/List;
-HSPLjava/net/HttpCookie;->parse(Ljava/lang/String;Z)Ljava/util/List;
-HSPLjava/net/HttpCookie;->parseInternal(Ljava/lang/String;Z)Ljava/net/HttpCookie;
-HSPLjava/net/HttpCookie;->setDomain(Ljava/lang/String;)V
-HSPLjava/net/HttpCookie;->setHttpOnly(Z)V
-HSPLjava/net/HttpCookie;->setMaxAge(J)V
-HSPLjava/net/HttpCookie;->setPath(Ljava/lang/String;)V
-HSPLjava/net/HttpCookie;->setSecure(Z)V
-HSPLjava/net/HttpCookie;->setVersion(I)V
-HSPLjava/net/HttpCookie;->startsWithIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLjava/net/HttpCookie;->stripOffSurroundingQuote(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/net/HttpCookie;->toNetscapeHeaderString()Ljava/lang/String;
-HSPLjava/net/HttpCookie;->toString()Ljava/lang/String;
-HSPLjava/net/HttpURLConnection;-><init>(Ljava/net/URL;)V
-HSPLjava/net/HttpURLConnection;->getFollowRedirects()Z
-HSPLjava/net/HttpURLConnection;->getRequestMethod()Ljava/lang/String;
-HSPLjava/net/HttpURLConnection;->setChunkedStreamingMode(I)V
-HSPLjava/net/HttpURLConnection;->setInstanceFollowRedirects(Z)V
-HSPLjava/net/HttpURLConnection;->setRequestMethod(Ljava/lang/String;)V
-HSPLjava/net/IDN;->toASCII(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/net/IDN;->toASCII(Ljava/lang/String;I)Ljava/lang/String;
-HSPLjava/net/InMemoryCookieStore;-><init>()V
-HSPLjava/net/InMemoryCookieStore;-><init>(I)V
-HSPLjava/net/InMemoryCookieStore;->add(Ljava/net/URI;Ljava/net/HttpCookie;)V
-HSPLjava/net/InMemoryCookieStore;->addIndex(Ljava/util/Map;Ljava/lang/Object;Ljava/net/HttpCookie;)V
-HSPLjava/net/InMemoryCookieStore;->get(Ljava/net/URI;)Ljava/util/List;
-HSPLjava/net/InMemoryCookieStore;->getEffectiveURI(Ljava/net/URI;)Ljava/net/URI;
-HSPLjava/net/InMemoryCookieStore;->getInternal1(Ljava/util/List;Ljava/util/Map;Ljava/lang/String;)V
-HSPLjava/net/InMemoryCookieStore;->getInternal2(Ljava/util/List;Ljava/util/Map;Ljava/lang/Comparable;)V
-HSPLjava/net/InMemoryCookieStore;->netscapeDomainMatches(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLjava/net/Inet4Address;-><init>()V
-HSPLjava/net/Inet4Address;-><init>(Ljava/lang/String;[B)V
-HSPLjava/net/Inet4Address;->equals(Ljava/lang/Object;)Z
-HSPLjava/net/Inet4Address;->getAddress()[B
-HSPLjava/net/Inet4Address;->getHostAddress()Ljava/lang/String;
-HSPLjava/net/Inet4Address;->hashCode()I
-HSPLjava/net/Inet4Address;->isAnyLocalAddress()Z
-HSPLjava/net/Inet4Address;->isLinkLocalAddress()Z
-HSPLjava/net/Inet4Address;->isLoopbackAddress()Z
-HSPLjava/net/Inet4Address;->isMulticastAddress()Z
-HSPLjava/net/Inet4Address;->numericToTextFormat([B)Ljava/lang/String;
-HSPLjava/net/Inet6Address$Inet6AddressHolder;-><init>(Ljava/net/Inet6Address;)V
-HSPLjava/net/Inet6Address$Inet6AddressHolder;-><init>(Ljava/net/Inet6Address;Ljava/net/Inet6Address$Inet6AddressHolder-IA;)V
-HSPLjava/net/Inet6Address$Inet6AddressHolder;->equals(Ljava/lang/Object;)Z
-HSPLjava/net/Inet6Address$Inet6AddressHolder;->hashCode()I
-HSPLjava/net/Inet6Address$Inet6AddressHolder;->init([BI)V
-HSPLjava/net/Inet6Address$Inet6AddressHolder;->isAnyLocalAddress()Z
-HSPLjava/net/Inet6Address$Inet6AddressHolder;->isLinkLocalAddress()Z
-HSPLjava/net/Inet6Address$Inet6AddressHolder;->isLoopbackAddress()Z
-HSPLjava/net/Inet6Address$Inet6AddressHolder;->isMulticastAddress()Z
-HSPLjava/net/Inet6Address$Inet6AddressHolder;->setAddr([B)V
-HSPLjava/net/Inet6Address;-><init>(Ljava/lang/String;[BI)V
-HSPLjava/net/Inet6Address;->equals(Ljava/lang/Object;)Z
-HSPLjava/net/Inet6Address;->getAddress()[B
-HSPLjava/net/Inet6Address;->getByAddress(Ljava/lang/String;[BI)Ljava/net/Inet6Address;
-HSPLjava/net/Inet6Address;->getHostAddress()Ljava/lang/String;
-HSPLjava/net/Inet6Address;->getScopeId()I
-HSPLjava/net/Inet6Address;->hashCode()I
-HSPLjava/net/Inet6Address;->isAnyLocalAddress()Z
-HSPLjava/net/Inet6Address;->isLinkLocalAddress()Z
-HSPLjava/net/Inet6Address;->isLoopbackAddress()Z
-HSPLjava/net/Inet6Address;->isMulticastAddress()Z
-HSPLjava/net/Inet6AddressImpl;->clearAddressCache()V
-HSPLjava/net/Inet6AddressImpl;->lookupAllHostAddr(Ljava/lang/String;I)[Ljava/net/InetAddress;
-HSPLjava/net/Inet6AddressImpl;->lookupHostByName(Ljava/lang/String;I)[Ljava/net/InetAddress;
-HSPLjava/net/InetAddress$InetAddressHolder;-><init>()V
-HSPLjava/net/InetAddress$InetAddressHolder;->getAddress()I
-HSPLjava/net/InetAddress$InetAddressHolder;->getHostName()Ljava/lang/String;
-HSPLjava/net/InetAddress$InetAddressHolder;->init(Ljava/lang/String;I)V
-HSPLjava/net/InetAddress;-><init>()V
-HSPLjava/net/InetAddress;->clearDnsCache()V
-HSPLjava/net/InetAddress;->getAllByName(Ljava/lang/String;)[Ljava/net/InetAddress;
-HSPLjava/net/InetAddress;->getAllByNameOnNet(Ljava/lang/String;I)[Ljava/net/InetAddress;
-HSPLjava/net/InetAddress;->getByAddress(Ljava/lang/String;[B)Ljava/net/InetAddress;
-HSPLjava/net/InetAddress;->getByAddress(Ljava/lang/String;[BI)Ljava/net/InetAddress;
-HSPLjava/net/InetAddress;->getByAddress([B)Ljava/net/InetAddress;
-HSPLjava/net/InetAddress;->getByName(Ljava/lang/String;)Ljava/net/InetAddress;
-HSPLjava/net/InetAddress;->getHostName()Ljava/lang/String;
-HSPLjava/net/InetAddress;->holder()Ljava/net/InetAddress$InetAddressHolder;
-HSPLjava/net/InetAddress;->toString()Ljava/lang/String;
-HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;-><init>(Ljava/lang/String;Ljava/net/InetAddress;I)V
-HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->equals(Ljava/lang/Object;)Z
-HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->getAddress()Ljava/net/InetAddress;
-HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->getHostName()Ljava/lang/String;
-HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->getHostString()Ljava/lang/String;
-HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->getPort()I
-HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->hashCode()I
-HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->isUnresolved()Z
-HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->toString()Ljava/lang/String;
-HSPLjava/net/InetSocketAddress;-><init>()V
-HSPLjava/net/InetSocketAddress;-><init>(I)V
-HSPLjava/net/InetSocketAddress;-><init>(ILjava/lang/String;)V
-HSPLjava/net/InetSocketAddress;-><init>(Ljava/lang/String;I)V
-HSPLjava/net/InetSocketAddress;-><init>(Ljava/net/InetAddress;I)V
-HSPLjava/net/InetSocketAddress;->checkHost(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/net/InetSocketAddress;->checkPort(I)I
-HSPLjava/net/InetSocketAddress;->createUnresolved(Ljava/lang/String;I)Ljava/net/InetSocketAddress;
-HSPLjava/net/InetSocketAddress;->equals(Ljava/lang/Object;)Z
-HSPLjava/net/InetSocketAddress;->getAddress()Ljava/net/InetAddress;
-HSPLjava/net/InetSocketAddress;->getHostName()Ljava/lang/String;
-HSPLjava/net/InetSocketAddress;->getHostString()Ljava/lang/String;
-HSPLjava/net/InetSocketAddress;->getPort()I
-HSPLjava/net/InetSocketAddress;->hashCode()I
-HSPLjava/net/InetSocketAddress;->isUnresolved()Z
-HSPLjava/net/InetSocketAddress;->toString()Ljava/lang/String;
-HSPLjava/net/InterfaceAddress;-><init>(Ljava/net/InetAddress;Ljava/net/Inet4Address;Ljava/net/InetAddress;)V
-HSPLjava/net/InterfaceAddress;->countPrefixLength(Ljava/net/InetAddress;)S
-HSPLjava/net/JarURLConnection;-><init>(Ljava/net/URL;)V
-HSPLjava/net/JarURLConnection;->getEntryName()Ljava/lang/String;
-HSPLjava/net/JarURLConnection;->parseSpecs(Ljava/net/URL;)V
-HSPLjava/net/MulticastSocket;-><init>(Ljava/net/SocketAddress;)V
-HSPLjava/net/NetworkInterface$1checkedAddresses;-><init>(Ljava/net/NetworkInterface;)V
-HSPLjava/net/NetworkInterface$1checkedAddresses;->hasMoreElements()Z
-HSPLjava/net/NetworkInterface$1checkedAddresses;->nextElement()Ljava/lang/Object;
-HSPLjava/net/NetworkInterface$1checkedAddresses;->nextElement()Ljava/net/InetAddress;
-HSPLjava/net/NetworkInterface;-><init>(Ljava/lang/String;I[Ljava/net/InetAddress;)V
-HSPLjava/net/NetworkInterface;->getAll()[Ljava/net/NetworkInterface;
-HSPLjava/net/NetworkInterface;->getByName(Ljava/lang/String;)Ljava/net/NetworkInterface;
-HSPLjava/net/NetworkInterface;->getFlags()I
-HSPLjava/net/NetworkInterface;->getHardwareAddress()[B
-HSPLjava/net/NetworkInterface;->getIndex()I
-HSPLjava/net/NetworkInterface;->getInetAddresses()Ljava/util/Enumeration;
-HSPLjava/net/NetworkInterface;->getName()Ljava/lang/String;
-HSPLjava/net/NetworkInterface;->getNetworkInterfaces()Ljava/util/Enumeration;
-HSPLjava/net/NetworkInterface;->isLoopback()Z
-HSPLjava/net/NetworkInterface;->isUp()Z
-HSPLjava/net/Parts;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/Parts;->getPath()Ljava/lang/String;
-HSPLjava/net/Parts;->getQuery()Ljava/lang/String;
-HSPLjava/net/Parts;->getRef()Ljava/lang/String;
-HSPLjava/net/PlainDatagramSocketImpl;-><init>()V
-HSPLjava/net/PlainDatagramSocketImpl;->bind0(ILjava/net/InetAddress;)V
-HSPLjava/net/PlainDatagramSocketImpl;->datagramSocketClose()V
-HSPLjava/net/PlainDatagramSocketImpl;->datagramSocketCreate()V
-HSPLjava/net/PlainDatagramSocketImpl;->doRecv(Ljava/net/DatagramPacket;I)V
-HSPLjava/net/PlainDatagramSocketImpl;->receive0(Ljava/net/DatagramPacket;)V
-HSPLjava/net/PlainDatagramSocketImpl;->send(Ljava/net/DatagramPacket;)V
-HSPLjava/net/PlainDatagramSocketImpl;->socketSetOption(ILjava/lang/Object;)V
-HSPLjava/net/PlainDatagramSocketImpl;->socketSetOption0(ILjava/lang/Object;)V
-HSPLjava/net/PlainSocketImpl;-><init>()V
-HSPLjava/net/PlainSocketImpl;->getMarkerFD()Ljava/io/FileDescriptor;
-HSPLjava/net/PlainSocketImpl;->socketAccept(Ljava/net/SocketImpl;)V
-HSPLjava/net/PlainSocketImpl;->socketBind(Ljava/net/InetAddress;I)V
-HSPLjava/net/PlainSocketImpl;->socketClose0(Z)V
-HSPLjava/net/PlainSocketImpl;->socketConnect(Ljava/net/InetAddress;II)V
-HSPLjava/net/PlainSocketImpl;->socketCreate(Z)V
-HSPLjava/net/PlainSocketImpl;->socketGetOption(I)Ljava/lang/Object;
-HSPLjava/net/PlainSocketImpl;->socketListen(I)V
-HSPLjava/net/PlainSocketImpl;->socketSetOption(ILjava/lang/Object;)V
-HSPLjava/net/PlainSocketImpl;->socketSetOption0(ILjava/lang/Object;)V
-HSPLjava/net/Proxy$Type;->values()[Ljava/net/Proxy$Type;
-HSPLjava/net/Proxy;->address()Ljava/net/SocketAddress;
-HSPLjava/net/Proxy;->equals(Ljava/lang/Object;)Z
-HSPLjava/net/Proxy;->hashCode()I
-HSPLjava/net/Proxy;->type()Ljava/net/Proxy$Type;
-HSPLjava/net/ProxySelector;->getDefault()Ljava/net/ProxySelector;
-HSPLjava/net/ProxySelector;->setDefault(Ljava/net/ProxySelector;)V
-HSPLjava/net/ResponseCache;->getDefault()Ljava/net/ResponseCache;
-HSPLjava/net/ServerSocket;-><init>()V
-HSPLjava/net/ServerSocket;->accept()Ljava/net/Socket;
-HSPLjava/net/ServerSocket;->bind(Ljava/net/SocketAddress;)V
-HSPLjava/net/ServerSocket;->bind(Ljava/net/SocketAddress;I)V
-HSPLjava/net/ServerSocket;->createImpl()V
-HSPLjava/net/ServerSocket;->getImpl()Ljava/net/SocketImpl;
-HSPLjava/net/ServerSocket;->implAccept(Ljava/net/Socket;)V
-HSPLjava/net/ServerSocket;->isBound()Z
-HSPLjava/net/ServerSocket;->isClosed()Z
-HSPLjava/net/ServerSocket;->setBound()V
-HSPLjava/net/ServerSocket;->setCreated()V
-HSPLjava/net/ServerSocket;->setImpl()V
-HSPLjava/net/Socket$1;-><init>(Ljava/net/Socket;)V
-HSPLjava/net/Socket$1;->run()Ljava/lang/Boolean;
-HSPLjava/net/Socket$1;->run()Ljava/lang/Object;
-HSPLjava/net/Socket$2;-><init>(Ljava/net/Socket;)V
-HSPLjava/net/Socket$2;->run()Ljava/io/InputStream;
-HSPLjava/net/Socket$2;->run()Ljava/lang/Object;
-HSPLjava/net/Socket$3;-><init>(Ljava/net/Socket;)V
-HSPLjava/net/Socket$3;->run()Ljava/io/OutputStream;
-HSPLjava/net/Socket$3;->run()Ljava/lang/Object;
-HSPLjava/net/Socket;-><init>()V
-HSPLjava/net/Socket;-><init>(Ljava/net/InetAddress;I)V
-HSPLjava/net/Socket;-><init>(Ljava/net/SocketImpl;)V
-HSPLjava/net/Socket;-><init>([Ljava/net/InetAddress;ILjava/net/SocketAddress;Z)V
-HSPLjava/net/Socket;->checkAddress(Ljava/net/InetAddress;Ljava/lang/String;)V
-HSPLjava/net/Socket;->checkOldImpl()V
-HSPLjava/net/Socket;->close()V
-HSPLjava/net/Socket;->connect(Ljava/net/SocketAddress;)V
-HSPLjava/net/Socket;->connect(Ljava/net/SocketAddress;I)V
-HSPLjava/net/Socket;->createImpl(Z)V
-HSPLjava/net/Socket;->getFileDescriptor$()Ljava/io/FileDescriptor;
-HSPLjava/net/Socket;->getImpl()Ljava/net/SocketImpl;
-HSPLjava/net/Socket;->getInetAddress()Ljava/net/InetAddress;
-HSPLjava/net/Socket;->getInputStream()Ljava/io/InputStream;
-HSPLjava/net/Socket;->getLocalAddress()Ljava/net/InetAddress;
-HSPLjava/net/Socket;->getLocalPort()I
-HSPLjava/net/Socket;->getLocalSocketAddress()Ljava/net/SocketAddress;
-HSPLjava/net/Socket;->getOutputStream()Ljava/io/OutputStream;
-HSPLjava/net/Socket;->getPort()I
-HSPLjava/net/Socket;->getRemoteSocketAddress()Ljava/net/SocketAddress;
-HSPLjava/net/Socket;->getReuseAddress()Z
-HSPLjava/net/Socket;->getSoTimeout()I
-HSPLjava/net/Socket;->isBound()Z
-HSPLjava/net/Socket;->isClosed()Z
-HSPLjava/net/Socket;->isConnected()Z
-HSPLjava/net/Socket;->isInputShutdown()Z
-HSPLjava/net/Socket;->isOutputShutdown()Z
-HSPLjava/net/Socket;->nonNullAddress(Ljava/net/InetAddress;)[Ljava/net/InetAddress;
-HSPLjava/net/Socket;->setBound()V
-HSPLjava/net/Socket;->setConnected()V
-HSPLjava/net/Socket;->setCreated()V
-HSPLjava/net/Socket;->setImpl()V
-HSPLjava/net/Socket;->setSoTimeout(I)V
-HSPLjava/net/Socket;->setTcpNoDelay(Z)V
-HSPLjava/net/SocketAddress;-><init>()V
-HSPLjava/net/SocketException;-><init>(Ljava/lang/String;)V
-HSPLjava/net/SocketException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/net/SocketImpl;-><init>()V
-HSPLjava/net/SocketImpl;->getFileDescriptor()Ljava/io/FileDescriptor;
-HSPLjava/net/SocketImpl;->getInetAddress()Ljava/net/InetAddress;
-HSPLjava/net/SocketImpl;->getLocalPort()I
-HSPLjava/net/SocketImpl;->getPort()I
-HSPLjava/net/SocketImpl;->getSocket()Ljava/net/Socket;
-HSPLjava/net/SocketImpl;->setServerSocket(Ljava/net/ServerSocket;)V
-HSPLjava/net/SocketImpl;->setSocket(Ljava/net/Socket;)V
-HSPLjava/net/SocketInputStream;-><init>(Ljava/net/AbstractPlainSocketImpl;)V
-HSPLjava/net/SocketInputStream;->finalize()V
-HSPLjava/net/SocketInputStream;->read([BII)I
-HSPLjava/net/SocketInputStream;->read([BIII)I
-HSPLjava/net/SocketInputStream;->socketRead(Ljava/io/FileDescriptor;[BIII)I
-HSPLjava/net/SocketOutputStream;-><init>(Ljava/net/AbstractPlainSocketImpl;)V
-HSPLjava/net/SocketOutputStream;->finalize()V
-HSPLjava/net/SocketOutputStream;->socketWrite([BII)V
-HSPLjava/net/SocketOutputStream;->write([BII)V
-HSPLjava/net/SocketTimeoutException;-><init>(Ljava/lang/String;)V
-HSPLjava/net/SocksSocketImpl;-><init>()V
-HSPLjava/net/SocksSocketImpl;->close()V
-HSPLjava/net/SocksSocketImpl;->connect(Ljava/net/SocketAddress;I)V
-HSPLjava/net/SocksSocketImpl;->getInetAddress()Ljava/net/InetAddress;
-HSPLjava/net/SocksSocketImpl;->getLocalPort()I
-HSPLjava/net/SocksSocketImpl;->getPort()I
-HSPLjava/net/SocksSocketImpl;->remainingMillis(J)I
-HSPLjava/net/URI$Parser;-><init>(Ljava/net/URI;Ljava/lang/String;)V
-HSPLjava/net/URI$Parser;->at(IIC)Z
-HSPLjava/net/URI$Parser;->charAt(I)C
-HSPLjava/net/URI$Parser;->checkChar(IJJLjava/lang/String;)V
-HSPLjava/net/URI$Parser;->checkChars(IIJJLjava/lang/String;)V
-HSPLjava/net/URI$Parser;->parse(Z)V
-HSPLjava/net/URI$Parser;->parseAuthority(II)I
-HSPLjava/net/URI$Parser;->parseHierarchical(II)I
-HSPLjava/net/URI$Parser;->parseHostname(II)I
-HSPLjava/net/URI$Parser;->parseIPv4Address(II)I
-HSPLjava/net/URI$Parser;->parseServer(II)I
-HSPLjava/net/URI$Parser;->scan(IIC)I
-HSPLjava/net/URI$Parser;->scan(IIJJ)I
-HSPLjava/net/URI$Parser;->scan(IILjava/lang/String;Ljava/lang/String;)I
-HSPLjava/net/URI$Parser;->scanByte(II)I
-HSPLjava/net/URI$Parser;->scanEscape(IIC)I
-HSPLjava/net/URI$Parser;->scanIPv4Address(IIZ)I
-HSPLjava/net/URI$Parser;->substring(II)Ljava/lang/String;
-HSPLjava/net/URI;->-$$Nest$fputpath(Ljava/net/URI;Ljava/lang/String;)V
-HSPLjava/net/URI;->-$$Nest$fputscheme(Ljava/net/URI;Ljava/lang/String;)V
-HSPLjava/net/URI;->-$$Nest$fputschemeSpecificPart(Ljava/net/URI;Ljava/lang/String;)V
-HSPLjava/net/URI;->-$$Nest$fputstring(Ljava/net/URI;Ljava/lang/String;)V
-HSPLjava/net/URI;->-$$Nest$sfgetH_ALPHA()J
-HSPLjava/net/URI;->-$$Nest$sfgetH_PATH()J
-HSPLjava/net/URI;->-$$Nest$sfgetH_SCHEME()J
-HSPLjava/net/URI;->-$$Nest$sfgetL_PATH()J
-HSPLjava/net/URI;->-$$Nest$sfgetL_SCHEME()J
-HSPLjava/net/URI;->-$$Nest$smmatch(CJJ)Z
-HSPLjava/net/URI;-><init>(Ljava/lang/String;)V
-HSPLjava/net/URI;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/URI;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/URI;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/URI;->appendAuthority(Ljava/lang/StringBuffer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
-HSPLjava/net/URI;->appendEscape(Ljava/lang/StringBuffer;B)V
-HSPLjava/net/URI;->appendFragment(Ljava/lang/StringBuffer;Ljava/lang/String;)V
-HSPLjava/net/URI;->appendSchemeSpecificPart(Ljava/lang/StringBuffer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/URI;->checkPath(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/URI;->compare(Ljava/lang/String;Ljava/lang/String;)I
-HSPLjava/net/URI;->compareIgnoringCase(Ljava/lang/String;Ljava/lang/String;)I
-HSPLjava/net/URI;->compareTo(Ljava/lang/Object;)I
-HSPLjava/net/URI;->compareTo(Ljava/net/URI;)I
-HSPLjava/net/URI;->create(Ljava/lang/String;)Ljava/net/URI;
-HSPLjava/net/URI;->decode(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/net/URI;->defineString()V
-HSPLjava/net/URI;->encode(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/net/URI;->equal(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLjava/net/URI;->equalIgnoringCase(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLjava/net/URI;->equals(Ljava/lang/Object;)Z
-HSPLjava/net/URI;->getAuthority()Ljava/lang/String;
-HSPLjava/net/URI;->getFragment()Ljava/lang/String;
-HSPLjava/net/URI;->getHost()Ljava/lang/String;
-HSPLjava/net/URI;->getPath()Ljava/lang/String;
-HSPLjava/net/URI;->getPort()I
-HSPLjava/net/URI;->getQuery()Ljava/lang/String;
-HSPLjava/net/URI;->getRawFragment()Ljava/lang/String;
-HSPLjava/net/URI;->getRawPath()Ljava/lang/String;
-HSPLjava/net/URI;->getRawQuery()Ljava/lang/String;
-HSPLjava/net/URI;->getScheme()Ljava/lang/String;
-HSPLjava/net/URI;->getUserInfo()Ljava/lang/String;
-HSPLjava/net/URI;->hash(ILjava/lang/String;)I
-HSPLjava/net/URI;->hashCode()I
-HSPLjava/net/URI;->hashIgnoringCase(ILjava/lang/String;)I
-HSPLjava/net/URI;->isAbsolute()Z
-HSPLjava/net/URI;->isOpaque()Z
-HSPLjava/net/URI;->match(CJJ)Z
-HSPLjava/net/URI;->quote(Ljava/lang/String;JJ)Ljava/lang/String;
-HSPLjava/net/URI;->toASCIIString()Ljava/lang/String;
-HSPLjava/net/URI;->toLower(C)I
-HSPLjava/net/URI;->toString()Ljava/lang/String;
-HSPLjava/net/URI;->toString(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/net/URI;->toURL()Ljava/net/URL;
-HSPLjava/net/URL;-><init>(Ljava/lang/String;)V
-HSPLjava/net/URL;-><init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)V
-HSPLjava/net/URL;-><init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/net/URLStreamHandler;)V
-HSPLjava/net/URL;-><init>(Ljava/net/URL;Ljava/lang/String;)V
-HSPLjava/net/URL;-><init>(Ljava/net/URL;Ljava/lang/String;Ljava/net/URLStreamHandler;)V
-HSPLjava/net/URL;->createBuiltinHandler(Ljava/lang/String;)Ljava/net/URLStreamHandler;
-HSPLjava/net/URL;->getAuthority()Ljava/lang/String;
-HSPLjava/net/URL;->getFile()Ljava/lang/String;
-HSPLjava/net/URL;->getHost()Ljava/lang/String;
-HSPLjava/net/URL;->getPath()Ljava/lang/String;
-HSPLjava/net/URL;->getPort()I
-HSPLjava/net/URL;->getProtocol()Ljava/lang/String;
-HSPLjava/net/URL;->getQuery()Ljava/lang/String;
-HSPLjava/net/URL;->getRef()Ljava/lang/String;
-HSPLjava/net/URL;->getURLStreamHandler(Ljava/lang/String;)Ljava/net/URLStreamHandler;
-HSPLjava/net/URL;->getUserInfo()Ljava/lang/String;
-HSPLjava/net/URL;->isValidProtocol(Ljava/lang/String;)Z
-HSPLjava/net/URL;->openConnection()Ljava/net/URLConnection;
-HSPLjava/net/URL;->openStream()Ljava/io/InputStream;
-HSPLjava/net/URL;->set(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/URL;->toExternalForm()Ljava/lang/String;
-HSPLjava/net/URL;->toString()Ljava/lang/String;
-HSPLjava/net/URLConnection;-><init>(Ljava/net/URL;)V
-HSPLjava/net/URLConnection;->getContentEncoding()Ljava/lang/String;
-HSPLjava/net/URLConnection;->getContentLength()I
-HSPLjava/net/URLConnection;->getContentLengthLong()J
-HSPLjava/net/URLConnection;->getContentType()Ljava/lang/String;
-HSPLjava/net/URLConnection;->getHeaderFieldInt(Ljava/lang/String;I)I
-HSPLjava/net/URLConnection;->getHeaderFieldLong(Ljava/lang/String;J)J
-HSPLjava/net/URLConnection;->getReadTimeout()I
-HSPLjava/net/URLConnection;->getURL()Ljava/net/URL;
-HSPLjava/net/URLConnection;->getUseCaches()Z
-HSPLjava/net/URLConnection;->setDefaultUseCaches(Z)V
-HSPLjava/net/URLConnection;->setDoInput(Z)V
-HSPLjava/net/URLConnection;->setDoOutput(Z)V
-HSPLjava/net/URLConnection;->setReadTimeout(I)V
-HSPLjava/net/URLConnection;->setUseCaches(Z)V
-HSPLjava/net/URLDecoder;->decode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/net/URLDecoder;->decode(Ljava/lang/String;Ljava/nio/charset/Charset;)Ljava/lang/String;
-HSPLjava/net/URLDecoder;->isValidHexChar(C)Z
-HSPLjava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/nio/charset/Charset;)Ljava/lang/String;
-HSPLjava/net/URLStreamHandler;-><init>()V
-HSPLjava/net/URLStreamHandler;->parseURL(Ljava/net/URL;Ljava/lang/String;II)V
-HSPLjava/net/URLStreamHandler;->setURL(Ljava/net/URL;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/URLStreamHandler;->toExternalForm(Ljava/net/URL;)Ljava/lang/String;
-HSPLjava/net/UnknownHostException;-><init>(Ljava/lang/String;)V
-HSPLjava/nio/Bits;->char0(C)B
-HSPLjava/nio/Bits;->char1(C)B
-HSPLjava/nio/Bits;->getFloat(Ljava/nio/ByteBuffer;IZ)F
-HSPLjava/nio/Bits;->getFloatL(Ljava/nio/ByteBuffer;I)F
-HSPLjava/nio/Bits;->getInt(Ljava/nio/ByteBuffer;IZ)I
-HSPLjava/nio/Bits;->getIntB(Ljava/nio/ByteBuffer;I)I
-HSPLjava/nio/Bits;->getIntL(Ljava/nio/ByteBuffer;I)I
-HSPLjava/nio/Bits;->getLong(Ljava/nio/ByteBuffer;IZ)J
-HSPLjava/nio/Bits;->getLongB(Ljava/nio/ByteBuffer;I)J
-HSPLjava/nio/Bits;->getLongL(Ljava/nio/ByteBuffer;I)J
-HSPLjava/nio/Bits;->getShort(Ljava/nio/ByteBuffer;IZ)S
-HSPLjava/nio/Bits;->getShortB(Ljava/nio/ByteBuffer;I)S
-HSPLjava/nio/Bits;->getShortL(Ljava/nio/ByteBuffer;I)S
-HSPLjava/nio/Bits;->int0(I)B
-HSPLjava/nio/Bits;->int1(I)B
-HSPLjava/nio/Bits;->int2(I)B
-HSPLjava/nio/Bits;->int3(I)B
-HSPLjava/nio/Bits;->long0(J)B
-HSPLjava/nio/Bits;->long1(J)B
-HSPLjava/nio/Bits;->long2(J)B
-HSPLjava/nio/Bits;->long3(J)B
-HSPLjava/nio/Bits;->long4(J)B
-HSPLjava/nio/Bits;->long5(J)B
-HSPLjava/nio/Bits;->long6(J)B
-HSPLjava/nio/Bits;->long7(J)B
-HSPLjava/nio/Bits;->makeInt(BBBB)I
-HSPLjava/nio/Bits;->makeLong(BBBBBBBB)J
-HSPLjava/nio/Bits;->makeShort(BB)S
-HSPLjava/nio/Bits;->pageSize()I
-HSPLjava/nio/Bits;->putChar(Ljava/nio/ByteBuffer;ICZ)V
-HSPLjava/nio/Bits;->putCharB(Ljava/nio/ByteBuffer;IC)V
-HSPLjava/nio/Bits;->putCharL(Ljava/nio/ByteBuffer;IC)V
-HSPLjava/nio/Bits;->putFloat(Ljava/nio/ByteBuffer;IFZ)V
-HSPLjava/nio/Bits;->putInt(Ljava/nio/ByteBuffer;IIZ)V
-HSPLjava/nio/Bits;->putIntB(Ljava/nio/ByteBuffer;II)V
-HSPLjava/nio/Bits;->putIntL(Ljava/nio/ByteBuffer;II)V
-HSPLjava/nio/Bits;->putLong(Ljava/nio/ByteBuffer;IJZ)V
-HSPLjava/nio/Bits;->putLongB(Ljava/nio/ByteBuffer;IJ)V
-HSPLjava/nio/Bits;->putLongL(Ljava/nio/ByteBuffer;IJ)V
-HSPLjava/nio/Bits;->putShort(Ljava/nio/ByteBuffer;ISZ)V
-HSPLjava/nio/Bits;->putShortB(Ljava/nio/ByteBuffer;IS)V
-HSPLjava/nio/Bits;->putShortL(Ljava/nio/ByteBuffer;IS)V
-HSPLjava/nio/Bits;->short0(S)B
-HSPLjava/nio/Bits;->short1(S)B
-HSPLjava/nio/Buffer;-><init>(IIIII)V
-HSPLjava/nio/Buffer;->capacity()I
-HSPLjava/nio/Buffer;->checkBounds(III)V
-HSPLjava/nio/Buffer;->checkIndex(I)I
-HSPLjava/nio/Buffer;->checkIndex(II)I
-HSPLjava/nio/Buffer;->checkScope()V
-HSPLjava/nio/Buffer;->clear()Ljava/nio/Buffer;
-HSPLjava/nio/Buffer;->discardMark()V
-HSPLjava/nio/Buffer;->flip()Ljava/nio/Buffer;
-HSPLjava/nio/Buffer;->hasRemaining()Z
-HSPLjava/nio/Buffer;->limit()I
-HSPLjava/nio/Buffer;->limit(I)Ljava/nio/Buffer;
-HSPLjava/nio/Buffer;->mark()Ljava/nio/Buffer;
-HSPLjava/nio/Buffer;->markValue()I
-HSPLjava/nio/Buffer;->nextGetIndex()I
-HSPLjava/nio/Buffer;->nextGetIndex(I)I
-HSPLjava/nio/Buffer;->nextPutIndex()I
-HSPLjava/nio/Buffer;->nextPutIndex(I)I
-HSPLjava/nio/Buffer;->position()I
-HSPLjava/nio/Buffer;->position(I)Ljava/nio/Buffer;
-HSPLjava/nio/Buffer;->remaining()I
-HSPLjava/nio/Buffer;->reset()Ljava/nio/Buffer;
-HSPLjava/nio/Buffer;->rewind()Ljava/nio/Buffer;
-HSPLjava/nio/ByteBuffer;-><init>(IIII)V
-HSPLjava/nio/ByteBuffer;-><init>(IIII[BI)V
-HSPLjava/nio/ByteBuffer;->allocate(I)Ljava/nio/ByteBuffer;
-HSPLjava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
-HSPLjava/nio/ByteBuffer;->array()Ljava/lang/Object;
-HSPLjava/nio/ByteBuffer;->array()[B
-HSPLjava/nio/ByteBuffer;->arrayOffset()I
-HSPLjava/nio/ByteBuffer;->clear()Ljava/nio/Buffer;
-HSPLjava/nio/ByteBuffer;->compare(BB)I
-HSPLjava/nio/ByteBuffer;->compareTo(Ljava/lang/Object;)I
-HSPLjava/nio/ByteBuffer;->compareTo(Ljava/nio/ByteBuffer;)I
-HSPLjava/nio/ByteBuffer;->equals(Ljava/lang/Object;)Z
-HSPLjava/nio/ByteBuffer;->flip()Ljava/nio/Buffer;
-HSPLjava/nio/ByteBuffer;->get([B)Ljava/nio/ByteBuffer;
-HSPLjava/nio/ByteBuffer;->hasArray()Z
-HSPLjava/nio/ByteBuffer;->hashCode()I
-HSPLjava/nio/ByteBuffer;->limit(I)Ljava/nio/Buffer;
-HSPLjava/nio/ByteBuffer;->mark()Ljava/nio/Buffer;
-HSPLjava/nio/ByteBuffer;->order()Ljava/nio/ByteOrder;
-HSPLjava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
-HSPLjava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;
-HSPLjava/nio/ByteBuffer;->put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
-HSPLjava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
-HSPLjava/nio/ByteBuffer;->putBuffer(ILjava/nio/ByteBuffer;II)V+]Ljava/nio/ByteBuffer;Ljava/nio/DirectByteBuffer;,Ljava/nio/HeapByteBuffer;
-HSPLjava/nio/ByteBuffer;->reset()Ljava/nio/Buffer;
-HSPLjava/nio/ByteBuffer;->rewind()Ljava/nio/Buffer;
-HSPLjava/nio/ByteBuffer;->wrap([B)Ljava/nio/ByteBuffer;
-HSPLjava/nio/ByteBuffer;->wrap([BII)Ljava/nio/ByteBuffer;
-HSPLjava/nio/ByteBufferAsCharBuffer;-><init>(Ljava/nio/ByteBuffer;IIIIILjava/nio/ByteOrder;)V
-HSPLjava/nio/ByteBufferAsCharBuffer;->duplicate()Ljava/nio/CharBuffer;
-HSPLjava/nio/ByteBufferAsCharBuffer;->get(I)C
-HSPLjava/nio/ByteBufferAsCharBuffer;->get([CII)Ljava/nio/CharBuffer;
-HSPLjava/nio/ByteBufferAsCharBuffer;->isDirect()Z
-HSPLjava/nio/ByteBufferAsCharBuffer;->ix(I)I
-HSPLjava/nio/ByteBufferAsCharBuffer;->subSequence(II)Ljava/lang/CharSequence;
-HSPLjava/nio/ByteBufferAsCharBuffer;->subSequence(II)Ljava/nio/CharBuffer;
-HSPLjava/nio/ByteBufferAsCharBuffer;->toString(II)Ljava/lang/String;
-HSPLjava/nio/ByteBufferAsFloatBuffer;-><init>(Ljava/nio/ByteBuffer;IIIIILjava/nio/ByteOrder;)V
-HSPLjava/nio/ByteBufferAsFloatBuffer;->ix(I)I
-HSPLjava/nio/ByteBufferAsFloatBuffer;->put(IF)Ljava/nio/FloatBuffer;
-HSPLjava/nio/ByteBufferAsFloatBuffer;->put([FII)Ljava/nio/FloatBuffer;
-HSPLjava/nio/ByteBufferAsIntBuffer;-><init>(Ljava/nio/ByteBuffer;IIIIILjava/nio/ByteOrder;)V
-HSPLjava/nio/ByteBufferAsIntBuffer;->get([III)Ljava/nio/IntBuffer;
-HSPLjava/nio/ByteBufferAsIntBuffer;->ix(I)I
-HSPLjava/nio/ByteBufferAsIntBuffer;->put(I)Ljava/nio/IntBuffer;
-HSPLjava/nio/ByteBufferAsIntBuffer;->put(II)Ljava/nio/IntBuffer;
-HSPLjava/nio/ByteBufferAsIntBuffer;->put([III)Ljava/nio/IntBuffer;
-HSPLjava/nio/ByteBufferAsLongBuffer;-><init>(Ljava/nio/ByteBuffer;IIIIILjava/nio/ByteOrder;)V
-HSPLjava/nio/ByteBufferAsLongBuffer;->get([JII)Ljava/nio/LongBuffer;
-HSPLjava/nio/ByteBufferAsLongBuffer;->ix(I)I
-HSPLjava/nio/ByteBufferAsShortBuffer;-><init>(Ljava/nio/ByteBuffer;IIIIILjava/nio/ByteOrder;)V
-HSPLjava/nio/ByteBufferAsShortBuffer;->get([SII)Ljava/nio/ShortBuffer;
-HSPLjava/nio/ByteBufferAsShortBuffer;->ix(I)I
-HSPLjava/nio/ByteBufferAsShortBuffer;->put([SII)Ljava/nio/ShortBuffer;
-HSPLjava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;
-HSPLjava/nio/CharBuffer;-><init>(IIII)V
-HSPLjava/nio/CharBuffer;-><init>(IIII[CI)V
-HSPLjava/nio/CharBuffer;->allocate(I)Ljava/nio/CharBuffer;
-HSPLjava/nio/CharBuffer;->array()[C
-HSPLjava/nio/CharBuffer;->arrayOffset()I
-HSPLjava/nio/CharBuffer;->charAt(I)C
-HSPLjava/nio/CharBuffer;->clear()Ljava/nio/Buffer;
-HSPLjava/nio/CharBuffer;->flip()Ljava/nio/Buffer;
-HSPLjava/nio/CharBuffer;->get([C)Ljava/nio/CharBuffer;
-HSPLjava/nio/CharBuffer;->get([CII)Ljava/nio/CharBuffer;
-HSPLjava/nio/CharBuffer;->hasArray()Z
-HSPLjava/nio/CharBuffer;->length()I
-HSPLjava/nio/CharBuffer;->limit(I)Ljava/nio/Buffer;
-HSPLjava/nio/CharBuffer;->position(I)Ljava/nio/Buffer;
-HSPLjava/nio/CharBuffer;->toString()Ljava/lang/String;
-HSPLjava/nio/CharBuffer;->wrap(Ljava/lang/CharSequence;)Ljava/nio/CharBuffer;
-HSPLjava/nio/CharBuffer;->wrap(Ljava/lang/CharSequence;II)Ljava/nio/CharBuffer;
-HSPLjava/nio/CharBuffer;->wrap([C)Ljava/nio/CharBuffer;
-HSPLjava/nio/CharBuffer;->wrap([CII)Ljava/nio/CharBuffer;
-HSPLjava/nio/DirectByteBuffer$MemoryRef;-><init>(I)V
-HSPLjava/nio/DirectByteBuffer$MemoryRef;-><init>(JLjava/lang/Object;)V
-HSPLjava/nio/DirectByteBuffer$MemoryRef;->free()V
-HSPLjava/nio/DirectByteBuffer;-><init>(IJLjava/io/FileDescriptor;Ljava/lang/Runnable;Z)V
-HSPLjava/nio/DirectByteBuffer;-><init>(ILjava/nio/DirectByteBuffer$MemoryRef;)V
-HSPLjava/nio/DirectByteBuffer;-><init>(JI)V
-HSPLjava/nio/DirectByteBuffer;-><init>(Ljava/nio/DirectByteBuffer$MemoryRef;IIIIIZ)V
-HSPLjava/nio/DirectByteBuffer;->address()J
-HSPLjava/nio/DirectByteBuffer;->asCharBuffer()Ljava/nio/CharBuffer;
-HSPLjava/nio/DirectByteBuffer;->asFloatBuffer()Ljava/nio/FloatBuffer;
-HSPLjava/nio/DirectByteBuffer;->asIntBuffer()Ljava/nio/IntBuffer;
-HSPLjava/nio/DirectByteBuffer;->asReadOnlyBuffer()Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->asShortBuffer()Ljava/nio/ShortBuffer;
-HSPLjava/nio/DirectByteBuffer;->cleaner()Lsun/misc/Cleaner;
-HSPLjava/nio/DirectByteBuffer;->duplicate()Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->duplicate()Ljava/nio/MappedByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->get()B
-HSPLjava/nio/DirectByteBuffer;->get(I)B
-HSPLjava/nio/DirectByteBuffer;->get(J)B
-HSPLjava/nio/DirectByteBuffer;->get([BII)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->getChar()C
-HSPLjava/nio/DirectByteBuffer;->getChar(I)C
-HSPLjava/nio/DirectByteBuffer;->getCharUnchecked(I)C
-HSPLjava/nio/DirectByteBuffer;->getInt()I
-HSPLjava/nio/DirectByteBuffer;->getInt(I)I
-HSPLjava/nio/DirectByteBuffer;->getInt(J)I
-HSPLjava/nio/DirectByteBuffer;->getLong(I)J
-HSPLjava/nio/DirectByteBuffer;->getLong(J)J
-HSPLjava/nio/DirectByteBuffer;->getShort()S
-HSPLjava/nio/DirectByteBuffer;->getShort(I)S
-HSPLjava/nio/DirectByteBuffer;->getShort(J)S
-HSPLjava/nio/DirectByteBuffer;->getUnchecked(I[CII)V
-HSPLjava/nio/DirectByteBuffer;->getUnchecked(I[III)V
-HSPLjava/nio/DirectByteBuffer;->getUnchecked(I[SII)V
-HSPLjava/nio/DirectByteBuffer;->isDirect()Z
-HSPLjava/nio/DirectByteBuffer;->isReadOnly()Z
-HSPLjava/nio/DirectByteBuffer;->ix(I)J
-HSPLjava/nio/DirectByteBuffer;->put(B)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->put(IB)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->put(JB)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->put([BII)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->putDouble(JD)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->putFloat(JF)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->putFloatUnchecked(IF)V
-HSPLjava/nio/DirectByteBuffer;->putInt(I)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->putInt(II)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->putInt(JI)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->putLong(IJ)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->putLong(J)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->putLong(JJ)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->putUnchecked(I[FII)V
-HSPLjava/nio/DirectByteBuffer;->setAccessible(Z)V
-HSPLjava/nio/DirectByteBuffer;->slice()Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->slice()Ljava/nio/MappedByteBuffer;
-HSPLjava/nio/FloatBuffer;-><init>(IIII)V
-HSPLjava/nio/FloatBuffer;-><init>(IIII[FI)V
-HSPLjava/nio/FloatBuffer;->limit(I)Ljava/nio/Buffer;
-HSPLjava/nio/FloatBuffer;->position(I)Ljava/nio/Buffer;
-HSPLjava/nio/FloatBuffer;->put([F)Ljava/nio/FloatBuffer;
-HSPLjava/nio/HeapByteBuffer;-><init>(II)V
-HSPLjava/nio/HeapByteBuffer;-><init>(IIZ)V
-HSPLjava/nio/HeapByteBuffer;-><init>([BII)V
-HSPLjava/nio/HeapByteBuffer;-><init>([BIIIIIZ)V
-HSPLjava/nio/HeapByteBuffer;-><init>([BIIZ)V
-HSPLjava/nio/HeapByteBuffer;->_get(I)B
-HSPLjava/nio/HeapByteBuffer;->_put(IB)V
-HSPLjava/nio/HeapByteBuffer;->asIntBuffer()Ljava/nio/IntBuffer;
-HSPLjava/nio/HeapByteBuffer;->asLongBuffer()Ljava/nio/LongBuffer;
-HSPLjava/nio/HeapByteBuffer;->asReadOnlyBuffer()Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->asShortBuffer()Ljava/nio/ShortBuffer;
-HSPLjava/nio/HeapByteBuffer;->compact()Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->duplicate()Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->get()B
-HSPLjava/nio/HeapByteBuffer;->get(I)B
-HSPLjava/nio/HeapByteBuffer;->get([BII)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->getFloat()F
-HSPLjava/nio/HeapByteBuffer;->getFloat(I)F
-HSPLjava/nio/HeapByteBuffer;->getInt()I
-HSPLjava/nio/HeapByteBuffer;->getInt(I)I
-HSPLjava/nio/HeapByteBuffer;->getLong()J
-HSPLjava/nio/HeapByteBuffer;->getLong(I)J
-HSPLjava/nio/HeapByteBuffer;->getShort()S
-HSPLjava/nio/HeapByteBuffer;->getShort(I)S
-HSPLjava/nio/HeapByteBuffer;->getUnchecked(I[III)V
-HSPLjava/nio/HeapByteBuffer;->getUnchecked(I[SII)V
-HSPLjava/nio/HeapByteBuffer;->isDirect()Z
-HSPLjava/nio/HeapByteBuffer;->isReadOnly()Z
-HSPLjava/nio/HeapByteBuffer;->ix(I)I
-HSPLjava/nio/HeapByteBuffer;->put(B)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->put(IB)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->put([BII)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->putChar(C)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->putFloat(F)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->putInt(I)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->putInt(II)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->putLong(IJ)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->putLong(J)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->putShort(IS)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->putShort(S)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->slice()Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->throwIfReadOnly()V
-HSPLjava/nio/HeapCharBuffer;-><init>(II)V
-HSPLjava/nio/HeapCharBuffer;-><init>(IIZ)V
-HSPLjava/nio/HeapCharBuffer;-><init>([CII)V
-HSPLjava/nio/HeapCharBuffer;-><init>([CIIIIIZ)V
-HSPLjava/nio/HeapCharBuffer;-><init>([CIIZ)V
-HSPLjava/nio/HeapCharBuffer;->get(I)C
-HSPLjava/nio/HeapCharBuffer;->ix(I)I
-HSPLjava/nio/HeapCharBuffer;->put(Ljava/nio/CharBuffer;)Ljava/nio/CharBuffer;
-HSPLjava/nio/HeapCharBuffer;->put([CII)Ljava/nio/CharBuffer;
-HSPLjava/nio/HeapCharBuffer;->slice()Ljava/nio/CharBuffer;
-HSPLjava/nio/HeapCharBuffer;->throwIfReadOnly()V
-HSPLjava/nio/HeapCharBuffer;->toString(II)Ljava/lang/String;
-HSPLjava/nio/IntBuffer;-><init>(IIII)V
-HSPLjava/nio/IntBuffer;-><init>(IIII[II)V
-HSPLjava/nio/IntBuffer;->allocate(I)Ljava/nio/IntBuffer;
-HSPLjava/nio/IntBuffer;->array()Ljava/lang/Object;
-HSPLjava/nio/IntBuffer;->array()[I
-HSPLjava/nio/IntBuffer;->arrayOffset()I
-HSPLjava/nio/IntBuffer;->get([I)Ljava/nio/IntBuffer;
-HSPLjava/nio/IntBuffer;->hasArray()Z
-HSPLjava/nio/IntBuffer;->limit(I)Ljava/nio/Buffer;
-HSPLjava/nio/IntBuffer;->position(I)Ljava/nio/Buffer;
-HSPLjava/nio/LongBuffer;-><init>(IIII)V
-HSPLjava/nio/LongBuffer;-><init>(IIII[JI)V
-HSPLjava/nio/LongBuffer;->get([J)Ljava/nio/LongBuffer;
-HSPLjava/nio/LongBuffer;->limit(I)Ljava/nio/Buffer;
-HSPLjava/nio/LongBuffer;->position(I)Ljava/nio/Buffer;
-HSPLjava/nio/MappedByteBuffer;-><init>(IIII)V
-HSPLjava/nio/MappedByteBuffer;-><init>(IIIILjava/io/FileDescriptor;Z)V
-HSPLjava/nio/MappedByteBuffer;-><init>(IIII[BI)V
-HSPLjava/nio/MappedByteBuffer;->checkMapped()V
-HSPLjava/nio/MappedByteBuffer;->clear()Ljava/nio/Buffer;
-HSPLjava/nio/MappedByteBuffer;->flip()Ljava/nio/Buffer;
-HSPLjava/nio/MappedByteBuffer;->limit(I)Ljava/nio/Buffer;
-HSPLjava/nio/MappedByteBuffer;->load()Ljava/nio/MappedByteBuffer;
-HSPLjava/nio/MappedByteBuffer;->mappingAddress(J)J
-HSPLjava/nio/MappedByteBuffer;->mappingLength(J)J
-HSPLjava/nio/MappedByteBuffer;->mappingOffset()J
-HSPLjava/nio/MappedByteBuffer;->position(I)Ljava/nio/Buffer;
-HSPLjava/nio/MappedByteBuffer;->rewind()Ljava/nio/Buffer;
-HSPLjava/nio/NIOAccess;->getBaseArray(Ljava/nio/Buffer;)Ljava/lang/Object;
-HSPLjava/nio/NIOAccess;->getBaseArrayOffset(Ljava/nio/Buffer;)I
-HSPLjava/nio/NioUtils;->freeDirectBuffer(Ljava/nio/ByteBuffer;)V
-HSPLjava/nio/ShortBuffer;-><init>(IIII)V
-HSPLjava/nio/ShortBuffer;-><init>(IIII[SI)V
-HSPLjava/nio/ShortBuffer;->get([S)Ljava/nio/ShortBuffer;
-HSPLjava/nio/ShortBuffer;->limit(I)Ljava/nio/Buffer;
-HSPLjava/nio/ShortBuffer;->position(I)Ljava/nio/Buffer;
-HSPLjava/nio/StringCharBuffer;-><init>(Ljava/lang/CharSequence;II)V
-HSPLjava/nio/StringCharBuffer;->get()C
-HSPLjava/nio/channels/Channels$1;-><init>(Ljava/nio/channels/WritableByteChannel;)V
-HSPLjava/nio/channels/Channels$1;->write([BII)V
-HSPLjava/nio/channels/Channels$WritableByteChannelImpl;-><init>(Ljava/io/OutputStream;)V
-HSPLjava/nio/channels/Channels$WritableByteChannelImpl;->write(Ljava/nio/ByteBuffer;)I
-HSPLjava/nio/channels/Channels;->newChannel(Ljava/io/OutputStream;)Ljava/nio/channels/WritableByteChannel;
-HSPLjava/nio/channels/Channels;->newInputStream(Ljava/nio/channels/ReadableByteChannel;)Ljava/io/InputStream;
-HSPLjava/nio/channels/Channels;->newOutputStream(Ljava/nio/channels/WritableByteChannel;)Ljava/io/OutputStream;
-HSPLjava/nio/channels/Channels;->writeFully(Ljava/nio/channels/WritableByteChannel;Ljava/nio/ByteBuffer;)V
-HSPLjava/nio/channels/Channels;->writeFullyImpl(Ljava/nio/channels/WritableByteChannel;Ljava/nio/ByteBuffer;)V
-HSPLjava/nio/channels/FileChannel;-><init>()V
-HSPLjava/nio/channels/FileChannel;->lock()Ljava/nio/channels/FileLock;
-HSPLjava/nio/channels/FileChannel;->open(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/FileChannel;
-HSPLjava/nio/channels/FileChannel;->open(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/nio/channels/FileChannel;
-HSPLjava/nio/channels/FileChannel;->tryLock()Ljava/nio/channels/FileLock;
-HSPLjava/nio/channels/FileLock;-><init>(Ljava/nio/channels/FileChannel;JJZ)V
-HSPLjava/nio/channels/FileLock;->acquiredBy()Ljava/nio/channels/Channel;
-HSPLjava/nio/channels/FileLock;->position()J
-HSPLjava/nio/channels/FileLock;->size()J
-HSPLjava/nio/channels/SelectableChannel;-><init>()V
-HSPLjava/nio/channels/SelectableChannel;->register(Ljava/nio/channels/Selector;I)Ljava/nio/channels/SelectionKey;
-HSPLjava/nio/channels/SelectionKey;-><init>()V
-HSPLjava/nio/channels/SelectionKey;->attach(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/nio/channels/Selector;-><init>()V
-HSPLjava/nio/channels/Selector;->open()Ljava/nio/channels/Selector;
-HSPLjava/nio/channels/SocketChannel;-><init>(Ljava/nio/channels/spi/SelectorProvider;)V
-HSPLjava/nio/channels/SocketChannel;->open()Ljava/nio/channels/SocketChannel;
-HSPLjava/nio/channels/SocketChannel;->validOps()I
-HSPLjava/nio/channels/spi/AbstractInterruptibleChannel$1;-><init>(Ljava/nio/channels/spi/AbstractInterruptibleChannel;)V
-HSPLjava/nio/channels/spi/AbstractInterruptibleChannel;-><init>()V
-HSPLjava/nio/channels/spi/AbstractInterruptibleChannel;->begin()V
-HSPLjava/nio/channels/spi/AbstractInterruptibleChannel;->blockedOn(Lsun/nio/ch/Interruptible;)V
-HSPLjava/nio/channels/spi/AbstractInterruptibleChannel;->close()V
-HSPLjava/nio/channels/spi/AbstractInterruptibleChannel;->end(Z)V
-HSPLjava/nio/channels/spi/AbstractInterruptibleChannel;->isOpen()Z
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;-><init>(Ljava/nio/channels/spi/SelectorProvider;)V
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->addKey(Ljava/nio/channels/SelectionKey;)V
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->blockingLock()Ljava/lang/Object;
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->configureBlocking(Z)Ljava/nio/channels/SelectableChannel;
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->findKey(Ljava/nio/channels/Selector;)Ljava/nio/channels/SelectionKey;
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->implCloseChannel()V
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->isBlocking()Z
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->isRegistered()Z
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->register(Ljava/nio/channels/Selector;ILjava/lang/Object;)Ljava/nio/channels/SelectionKey;
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->removeKey(Ljava/nio/channels/SelectionKey;)V
-HSPLjava/nio/channels/spi/AbstractSelectionKey;-><init>()V
-HSPLjava/nio/channels/spi/AbstractSelectionKey;->invalidate()V
-HSPLjava/nio/channels/spi/AbstractSelectionKey;->isValid()Z
-HSPLjava/nio/channels/spi/AbstractSelector$1;-><init>(Ljava/nio/channels/spi/AbstractSelector;)V
-HSPLjava/nio/channels/spi/AbstractSelector;-><init>(Ljava/nio/channels/spi/SelectorProvider;)V
-HSPLjava/nio/channels/spi/AbstractSelector;->begin()V
-HSPLjava/nio/channels/spi/AbstractSelector;->cancelledKeys()Ljava/util/Set;
-HSPLjava/nio/channels/spi/AbstractSelector;->close()V
-HSPLjava/nio/channels/spi/AbstractSelector;->deregister(Ljava/nio/channels/spi/AbstractSelectionKey;)V
-HSPLjava/nio/channels/spi/AbstractSelector;->end()V
-HSPLjava/nio/channels/spi/AbstractSelector;->isOpen()Z
-HSPLjava/nio/channels/spi/SelectorProvider$1;-><init>()V
-HSPLjava/nio/channels/spi/SelectorProvider$1;->run()Ljava/lang/Object;
-HSPLjava/nio/channels/spi/SelectorProvider$1;->run()Ljava/nio/channels/spi/SelectorProvider;
-HSPLjava/nio/channels/spi/SelectorProvider;-><init>()V
-HSPLjava/nio/channels/spi/SelectorProvider;->loadProviderAsService()Z
-HSPLjava/nio/channels/spi/SelectorProvider;->loadProviderFromProperty()Z
-HSPLjava/nio/channels/spi/SelectorProvider;->provider()Ljava/nio/channels/spi/SelectorProvider;
-HSPLjava/nio/charset/Charset;-><init>(Ljava/lang/String;[Ljava/lang/String;)V
-HSPLjava/nio/charset/Charset;->aliases()Ljava/util/Set;
-HSPLjava/nio/charset/Charset;->cache(Ljava/lang/String;Ljava/nio/charset/Charset;)V
-HSPLjava/nio/charset/Charset;->checkName(Ljava/lang/String;)V
-HSPLjava/nio/charset/Charset;->decode(Ljava/nio/ByteBuffer;)Ljava/nio/CharBuffer;
-HSPLjava/nio/charset/Charset;->defaultCharset()Ljava/nio/charset/Charset;
-HSPLjava/nio/charset/Charset;->displayName()Ljava/lang/String;
-HSPLjava/nio/charset/Charset;->encode(Ljava/lang/String;)Ljava/nio/ByteBuffer;
-HSPLjava/nio/charset/Charset;->encode(Ljava/nio/CharBuffer;)Ljava/nio/ByteBuffer;
-HSPLjava/nio/charset/Charset;->equals(Ljava/lang/Object;)Z
-HSPLjava/nio/charset/Charset;->forName(Ljava/lang/String;)Ljava/nio/charset/Charset;
-HSPLjava/nio/charset/Charset;->forNameUEE(Ljava/lang/String;)Ljava/nio/charset/Charset;
-HSPLjava/nio/charset/Charset;->isSupported(Ljava/lang/String;)Z
-HSPLjava/nio/charset/Charset;->lookup(Ljava/lang/String;)Ljava/nio/charset/Charset;
-HSPLjava/nio/charset/Charset;->lookup2(Ljava/lang/String;)Ljava/nio/charset/Charset;
-HSPLjava/nio/charset/Charset;->name()Ljava/lang/String;
-HSPLjava/nio/charset/CharsetDecoder;-><init>(Ljava/nio/charset/Charset;FF)V
-HSPLjava/nio/charset/CharsetDecoder;-><init>(Ljava/nio/charset/Charset;FFLjava/lang/String;)V
-HSPLjava/nio/charset/CharsetDecoder;->averageCharsPerByte()F
-HSPLjava/nio/charset/CharsetDecoder;->charset()Ljava/nio/charset/Charset;
-HSPLjava/nio/charset/CharsetDecoder;->decode(Ljava/nio/ByteBuffer;)Ljava/nio/CharBuffer;
-HSPLjava/nio/charset/CharsetDecoder;->decode(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;Z)Ljava/nio/charset/CoderResult;
-HSPLjava/nio/charset/CharsetDecoder;->flush(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;
-HSPLjava/nio/charset/CharsetDecoder;->implFlush(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;
-HSPLjava/nio/charset/CharsetDecoder;->implOnMalformedInput(Ljava/nio/charset/CodingErrorAction;)V
-HSPLjava/nio/charset/CharsetDecoder;->implOnUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)V
-HSPLjava/nio/charset/CharsetDecoder;->implReset()V
-HSPLjava/nio/charset/CharsetDecoder;->malformedInputAction()Ljava/nio/charset/CodingErrorAction;
-HSPLjava/nio/charset/CharsetDecoder;->maxCharsPerByte()F
-HSPLjava/nio/charset/CharsetDecoder;->onMalformedInput(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetDecoder;
-HSPLjava/nio/charset/CharsetDecoder;->onUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetDecoder;
-HSPLjava/nio/charset/CharsetDecoder;->replaceWith(Ljava/lang/String;)Ljava/nio/charset/CharsetDecoder;
-HSPLjava/nio/charset/CharsetDecoder;->replacement()Ljava/lang/String;
-HSPLjava/nio/charset/CharsetDecoder;->reset()Ljava/nio/charset/CharsetDecoder;
-HSPLjava/nio/charset/CharsetDecoder;->unmappableCharacterAction()Ljava/nio/charset/CodingErrorAction;
-HSPLjava/nio/charset/CharsetEncoder;-><init>(Ljava/nio/charset/Charset;FF)V
-HSPLjava/nio/charset/CharsetEncoder;-><init>(Ljava/nio/charset/Charset;FF[B)V
-HSPLjava/nio/charset/CharsetEncoder;-><init>(Ljava/nio/charset/Charset;FF[BZ)V
-HSPLjava/nio/charset/CharsetEncoder;->averageBytesPerChar()F
-HSPLjava/nio/charset/CharsetEncoder;->canEncode(Ljava/lang/CharSequence;)Z
-HSPLjava/nio/charset/CharsetEncoder;->canEncode(Ljava/nio/CharBuffer;)Z
-HSPLjava/nio/charset/CharsetEncoder;->charset()Ljava/nio/charset/Charset;
-HSPLjava/nio/charset/CharsetEncoder;->encode(Ljava/nio/CharBuffer;)Ljava/nio/ByteBuffer;
-HSPLjava/nio/charset/CharsetEncoder;->encode(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;Z)Ljava/nio/charset/CoderResult;
-HSPLjava/nio/charset/CharsetEncoder;->flush(Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;
-HSPLjava/nio/charset/CharsetEncoder;->implFlush(Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;
-HSPLjava/nio/charset/CharsetEncoder;->implOnMalformedInput(Ljava/nio/charset/CodingErrorAction;)V
-HSPLjava/nio/charset/CharsetEncoder;->implOnUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)V
-HSPLjava/nio/charset/CharsetEncoder;->implReplaceWith([B)V
-HSPLjava/nio/charset/CharsetEncoder;->malformedInputAction()Ljava/nio/charset/CodingErrorAction;
-HSPLjava/nio/charset/CharsetEncoder;->maxBytesPerChar()F
-HSPLjava/nio/charset/CharsetEncoder;->onMalformedInput(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetEncoder;
-HSPLjava/nio/charset/CharsetEncoder;->onUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetEncoder;
-HSPLjava/nio/charset/CharsetEncoder;->replaceWith([B)Ljava/nio/charset/CharsetEncoder;
-HSPLjava/nio/charset/CharsetEncoder;->replacement()[B
-HSPLjava/nio/charset/CharsetEncoder;->reset()Ljava/nio/charset/CharsetEncoder;
-HSPLjava/nio/charset/CharsetEncoder;->unmappableCharacterAction()Ljava/nio/charset/CodingErrorAction;
-HSPLjava/nio/charset/CoderResult;->isError()Z
-HSPLjava/nio/charset/CoderResult;->isOverflow()Z
-HSPLjava/nio/charset/CoderResult;->isUnderflow()Z
-HSPLjava/nio/file/AccessMode;->values()[Ljava/nio/file/AccessMode;
-HSPLjava/nio/file/FileAlreadyExistsException;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/nio/file/FileSystemException;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/nio/file/FileSystems;->getDefault()Ljava/nio/file/FileSystem;
-HSPLjava/nio/file/Files$AcceptAllFilter;->accept(Ljava/lang/Object;)Z
-HSPLjava/nio/file/Files$AcceptAllFilter;->accept(Ljava/nio/file/Path;)Z
-HSPLjava/nio/file/Files;->exists(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z
-HSPLjava/nio/file/Files;->followLinks([Ljava/nio/file/LinkOption;)Z
-HSPLjava/nio/file/Files;->isAccessible(Ljava/nio/file/Path;[Ljava/nio/file/AccessMode;)Z
-HSPLjava/nio/file/Files;->isRegularFile(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z
-HSPLjava/nio/file/Files;->isWritable(Ljava/nio/file/Path;)Z
-HSPLjava/nio/file/Files;->newBufferedReader(Ljava/nio/file/Path;Ljava/nio/charset/Charset;)Ljava/io/BufferedReader;
-HSPLjava/nio/file/Files;->newByteChannel(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/SeekableByteChannel;
-HSPLjava/nio/file/Files;->newByteChannel(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/nio/channels/SeekableByteChannel;
-HSPLjava/nio/file/Files;->newDirectoryStream(Ljava/nio/file/Path;)Ljava/nio/file/DirectoryStream;
-HSPLjava/nio/file/Files;->newInputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/InputStream;
-HSPLjava/nio/file/Files;->provider(Ljava/nio/file/Path;)Ljava/nio/file/spi/FileSystemProvider;
-HSPLjava/nio/file/Files;->read(Ljava/io/InputStream;I)[B
-HSPLjava/nio/file/Files;->readAllBytes(Ljava/nio/file/Path;)[B
-HSPLjava/nio/file/Files;->readAttributes(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/BasicFileAttributes;
-HSPLjava/nio/file/NoSuchFileException;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/nio/file/Paths;->get(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;
-HSPLjava/nio/file/StandardOpenOption;->values()[Ljava/nio/file/StandardOpenOption;
-HSPLjava/nio/file/attribute/FileTime;-><init>(JLjava/util/concurrent/TimeUnit;Ljava/time/Instant;)V
-HSPLjava/nio/file/attribute/FileTime;->append(Ljava/lang/StringBuilder;II)Ljava/lang/StringBuilder;
-HSPLjava/nio/file/attribute/FileTime;->compareTo(Ljava/nio/file/attribute/FileTime;)I
-HSPLjava/nio/file/attribute/FileTime;->equals(Ljava/lang/Object;)Z
-HSPLjava/nio/file/attribute/FileTime;->from(JLjava/util/concurrent/TimeUnit;)Ljava/nio/file/attribute/FileTime;
-HSPLjava/nio/file/attribute/FileTime;->toMillis()J
-HSPLjava/nio/file/attribute/FileTime;->toString()Ljava/lang/String;
-HSPLjava/nio/file/spi/FileSystemProvider;->newInputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/InputStream;
-HSPLjava/security/AccessControlContext;-><init>([Ljava/security/ProtectionDomain;)V
-HSPLjava/security/AccessController;->doPrivileged(Ljava/security/PrivilegedAction;)Ljava/lang/Object;
-HSPLjava/security/AccessController;->doPrivileged(Ljava/security/PrivilegedExceptionAction;)Ljava/lang/Object;
-HSPLjava/security/AccessController;->getContext()Ljava/security/AccessControlContext;
-HSPLjava/security/AlgorithmParameters;->getInstance(Ljava/lang/String;)Ljava/security/AlgorithmParameters;
-HSPLjava/security/AlgorithmParametersSpi;-><init>()V
-HSPLjava/security/CodeSigner;-><init>(Ljava/security/cert/CertPath;Ljava/security/Timestamp;)V
-HSPLjava/security/CodeSigner;->getSignerCertPath()Ljava/security/cert/CertPath;
-HSPLjava/security/DigestInputStream;-><init>(Ljava/io/InputStream;Ljava/security/MessageDigest;)V
-HSPLjava/security/DigestInputStream;->read([BII)I
-HSPLjava/security/DigestInputStream;->setMessageDigest(Ljava/security/MessageDigest;)V
-HSPLjava/security/GeneralSecurityException;-><init>(Ljava/lang/String;)V
-HSPLjava/security/KeyFactory;-><init>(Ljava/lang/String;)V
-HSPLjava/security/KeyFactory;-><init>(Ljava/security/KeyFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V
-HSPLjava/security/KeyFactory;->generatePrivate(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;
-HSPLjava/security/KeyFactory;->generatePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;
-HSPLjava/security/KeyFactory;->getInstance(Ljava/lang/String;)Ljava/security/KeyFactory;
-HSPLjava/security/KeyFactory;->nextSpi(Ljava/security/KeyFactorySpi;)Ljava/security/KeyFactorySpi;
-HSPLjava/security/KeyFactorySpi;-><init>()V
-HSPLjava/security/KeyPair;-><init>(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V
-HSPLjava/security/KeyPair;->getPrivate()Ljava/security/PrivateKey;
-HSPLjava/security/KeyPair;->getPublic()Ljava/security/PublicKey;
-HSPLjava/security/KeyPairGenerator;-><init>(Ljava/lang/String;)V
-HSPLjava/security/KeyPairGenerator;->getInstance(Lsun/security/jca/GetInstance$Instance;Ljava/lang/String;)Ljava/security/KeyPairGenerator;
-HSPLjava/security/KeyPairGeneratorSpi;-><init>()V
-HSPLjava/security/KeyStore$1;-><init>()V
-HSPLjava/security/KeyStore$1;->run()Ljava/lang/Object;
-HSPLjava/security/KeyStore$1;->run()Ljava/lang/String;
-HSPLjava/security/KeyStore$SecretKeyEntry;-><init>(Ljavax/crypto/SecretKey;)V
-HSPLjava/security/KeyStore$SecretKeyEntry;->getSecretKey()Ljavax/crypto/SecretKey;
-HSPLjava/security/KeyStore;-><init>(Ljava/security/KeyStoreSpi;Ljava/security/Provider;Ljava/lang/String;)V
-HSPLjava/security/KeyStore;->aliases()Ljava/util/Enumeration;
-HSPLjava/security/KeyStore;->containsAlias(Ljava/lang/String;)Z
-HSPLjava/security/KeyStore;->getCertificate(Ljava/lang/String;)Ljava/security/cert/Certificate;
-HSPLjava/security/KeyStore;->getDefaultType()Ljava/lang/String;
-HSPLjava/security/KeyStore;->getEntry(Ljava/lang/String;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Entry;
-HSPLjava/security/KeyStore;->getInstance(Ljava/lang/String;)Ljava/security/KeyStore;
-HSPLjava/security/KeyStore;->getKey(Ljava/lang/String;[C)Ljava/security/Key;
-HSPLjava/security/KeyStore;->getType()Ljava/lang/String;
-HSPLjava/security/KeyStore;->load(Ljava/io/InputStream;[C)V
-HSPLjava/security/KeyStore;->load(Ljava/security/KeyStore$LoadStoreParameter;)V
-HSPLjava/security/KeyStore;->setCertificateEntry(Ljava/lang/String;Ljava/security/cert/Certificate;)V
-HSPLjava/security/KeyStore;->size()I
-HSPLjava/security/KeyStoreSpi;-><init>()V
-HSPLjava/security/KeyStoreSpi;->engineGetEntry(Ljava/lang/String;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Entry;
-HSPLjava/security/KeyStoreSpi;->engineLoad(Ljava/io/InputStream;Ljava/security/KeyStore$LoadStoreParameter;)V
-HSPLjava/security/KeyStoreSpi;->engineLoad(Ljava/security/KeyStore$LoadStoreParameter;)V
-HSPLjava/security/MessageDigest$Delegate;-><init>(Ljava/security/MessageDigestSpi;Ljava/lang/String;)V
-HSPLjava/security/MessageDigest$Delegate;->clone()Ljava/lang/Object;
-HSPLjava/security/MessageDigest$Delegate;->engineDigest()[B
-HSPLjava/security/MessageDigest$Delegate;->engineDigest([BII)I
-HSPLjava/security/MessageDigest$Delegate;->engineGetDigestLength()I
-HSPLjava/security/MessageDigest$Delegate;->engineReset()V
-HSPLjava/security/MessageDigest$Delegate;->engineUpdate(B)V
-HSPLjava/security/MessageDigest$Delegate;->engineUpdate(Ljava/nio/ByteBuffer;)V
-HSPLjava/security/MessageDigest$Delegate;->engineUpdate([BII)V
-HSPLjava/security/MessageDigest;-><init>(Ljava/lang/String;)V
-HSPLjava/security/MessageDigest;->digest()[B
-HSPLjava/security/MessageDigest;->digest([B)[B
-HSPLjava/security/MessageDigest;->digest([BII)I
-HSPLjava/security/MessageDigest;->getDigestLength()I
-HSPLjava/security/MessageDigest;->getInstance(Ljava/lang/String;)Ljava/security/MessageDigest;
-HSPLjava/security/MessageDigest;->getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/MessageDigest;
-HSPLjava/security/MessageDigest;->getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/MessageDigest;
-HSPLjava/security/MessageDigest;->isEqual([B[B)Z
-HSPLjava/security/MessageDigest;->reset()V
-HSPLjava/security/MessageDigest;->update(B)V
-HSPLjava/security/MessageDigest;->update(Ljava/nio/ByteBuffer;)V
-HSPLjava/security/MessageDigest;->update([B)V
-HSPLjava/security/MessageDigest;->update([BII)V
-HSPLjava/security/MessageDigestSpi;-><init>()V
-HSPLjava/security/MessageDigestSpi;->engineDigest([BII)I
-HSPLjava/security/MessageDigestSpi;->engineUpdate(Ljava/nio/ByteBuffer;)V
-HSPLjava/security/NoSuchAlgorithmException;-><init>(Ljava/lang/String;)V
-HSPLjava/security/Provider$EngineDescription;->getConstructorParameterClass()Ljava/lang/Class;
-HSPLjava/security/Provider$Service;->-$$Nest$fputalgorithm(Ljava/security/Provider$Service;Ljava/lang/String;)V
-HSPLjava/security/Provider$Service;->-$$Nest$fputclassName(Ljava/security/Provider$Service;Ljava/lang/String;)V
-HSPLjava/security/Provider$Service;->-$$Nest$fputtype(Ljava/security/Provider$Service;Ljava/lang/String;)V
-HSPLjava/security/Provider$Service;->-$$Nest$maddAlias(Ljava/security/Provider$Service;Ljava/lang/String;)V
-HSPLjava/security/Provider$Service;->-$$Nest$misValid(Ljava/security/Provider$Service;)Z
-HSPLjava/security/Provider$Service;-><init>(Ljava/security/Provider;)V
-HSPLjava/security/Provider$Service;-><init>(Ljava/security/Provider;Ljava/security/Provider$Service-IA;)V
-HSPLjava/security/Provider$Service;->addAlias(Ljava/lang/String;)V
-HSPLjava/security/Provider$Service;->addAttribute(Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/security/Provider$Service;->getAlgorithm()Ljava/lang/String;
-HSPLjava/security/Provider$Service;->getAttribute(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/security/Provider$Service;->getClassName()Ljava/lang/String;
-HSPLjava/security/Provider$Service;->getDefaultConstructor()Ljava/lang/reflect/Constructor;
-HSPLjava/security/Provider$Service;->getImplClass()Ljava/lang/Class;
-HSPLjava/security/Provider$Service;->getKeyClass(Ljava/lang/String;)Ljava/lang/Class;
-HSPLjava/security/Provider$Service;->getProvider()Ljava/security/Provider;
-HSPLjava/security/Provider$Service;->getType()Ljava/lang/String;
-HSPLjava/security/Provider$Service;->hasKeyAttributes()Z
-HSPLjava/security/Provider$Service;->isValid()Z
-HSPLjava/security/Provider$Service;->newInstance(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/security/Provider$Service;->newInstanceOf()Ljava/lang/Object;
-HSPLjava/security/Provider$Service;->newInstanceUtil(Ljava/lang/Class;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/security/Provider$Service;->supportsKeyClass(Ljava/security/Key;)Z
-HSPLjava/security/Provider$Service;->supportsKeyFormat(Ljava/security/Key;)Z
-HSPLjava/security/Provider$Service;->supportsParameter(Ljava/lang/Object;)Z
-HSPLjava/security/Provider$ServiceKey;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLjava/security/Provider$ServiceKey;-><init>(Ljava/lang/String;Ljava/lang/String;ZLjava/security/Provider$ServiceKey-IA;)V
-HSPLjava/security/Provider$ServiceKey;->equals(Ljava/lang/Object;)Z
-HSPLjava/security/Provider$ServiceKey;->hashCode()I
-HSPLjava/security/Provider$ServiceKey;->matches(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLjava/security/Provider$UString;-><init>(Ljava/lang/String;)V
-HSPLjava/security/Provider$UString;->equals(Ljava/lang/Object;)Z
-HSPLjava/security/Provider$UString;->hashCode()I
-HSPLjava/security/Provider;->-$$Nest$sfgetEMPTY()[Ljava/lang/Object;
-HSPLjava/security/Provider;->-$$Nest$sfgetknownEngines()Ljava/util/Map;
-HSPLjava/security/Provider;-><init>(Ljava/lang/String;DLjava/lang/String;)V
-HSPLjava/security/Provider;->check(Ljava/lang/String;)V
-HSPLjava/security/Provider;->checkInitialized()V
-HSPLjava/security/Provider;->checkLegacy(Ljava/lang/Object;)Z
-HSPLjava/security/Provider;->ensureLegacyParsed()V
-HSPLjava/security/Provider;->getEngineName(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/security/Provider;->getName()Ljava/lang/String;
-HSPLjava/security/Provider;->getProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/security/Provider;->getService(Ljava/lang/String;Ljava/lang/String;)Ljava/security/Provider$Service;
-HSPLjava/security/Provider;->getServices()Ljava/util/Set;
-HSPLjava/security/Provider;->getTypeAndAlgorithm(Ljava/lang/String;)[Ljava/lang/String;
-HSPLjava/security/Provider;->implPut(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/security/Provider;->parseLegacyPut(Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/security/Provider;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/security/Provider;->putId()V
-HSPLjava/security/Provider;->removeInvalidServices(Ljava/util/Map;)V
-HSPLjava/security/Provider;->warmUpServiceProvision()V
-HSPLjava/security/SecureRandom;-><init>()V
-HSPLjava/security/SecureRandom;-><init>(Ljava/security/SecureRandomSpi;Ljava/security/Provider;Ljava/lang/String;)V
-HSPLjava/security/SecureRandom;->getDefaultPRNG(Z[B)V
-HSPLjava/security/SecureRandom;->getInstance(Ljava/lang/String;)Ljava/security/SecureRandom;
-HSPLjava/security/SecureRandom;->getPrngAlgorithm()Ljava/lang/String;
-HSPLjava/security/SecureRandom;->getProvider()Ljava/security/Provider;
-HSPLjava/security/SecureRandom;->getThreadSafe()Z
-HSPLjava/security/SecureRandom;->next(I)I
-HSPLjava/security/SecureRandom;->nextBytes([B)V
-HSPLjava/security/SecureRandom;->setSeed(J)V
-HSPLjava/security/SecureRandomSpi;-><init>()V
-HSPLjava/security/Security;->addProvider(Ljava/security/Provider;)I
-HSPLjava/security/Security;->getImpl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/Object;
-HSPLjava/security/Security;->getImpl(Ljava/lang/String;Ljava/lang/String;Ljava/security/Provider;)[Ljava/lang/Object;
-HSPLjava/security/Security;->getProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/security/Security;->getProvider(Ljava/lang/String;)Ljava/security/Provider;
-HSPLjava/security/Security;->getProviders()[Ljava/security/Provider;
-HSPLjava/security/Security;->getSpiClass(Ljava/lang/String;)Ljava/lang/Class;
-HSPLjava/security/Security;->getVersion()I
-HSPLjava/security/Security;->increaseVersion()V
-HSPLjava/security/Security;->insertProviderAt(Ljava/security/Provider;I)I
-HSPLjava/security/Security;->invalidateSMCache(Ljava/lang/String;)V
-HSPLjava/security/Security;->setProperty(Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/security/Signature$Delegate;-><init>(Ljava/lang/String;)V
-HSPLjava/security/Signature$Delegate;->chooseFirstProvider()V
-HSPLjava/security/Signature$Delegate;->chooseProvider(ILjava/security/Key;Ljava/security/SecureRandom;)V
-HSPLjava/security/Signature$Delegate;->engineInitSign(Ljava/security/PrivateKey;)V
-HSPLjava/security/Signature$Delegate;->engineInitVerify(Ljava/security/PublicKey;)V
-HSPLjava/security/Signature$Delegate;->engineSign()[B
-HSPLjava/security/Signature$Delegate;->engineUpdate(Ljava/nio/ByteBuffer;)V
-HSPLjava/security/Signature$Delegate;->engineUpdate([BII)V
-HSPLjava/security/Signature$Delegate;->engineVerify([B)Z
-HSPLjava/security/Signature$Delegate;->init(Ljava/security/SignatureSpi;ILjava/security/Key;Ljava/security/SecureRandom;)V
-HSPLjava/security/Signature$Delegate;->newInstance(Ljava/security/Provider$Service;)Ljava/security/SignatureSpi;
-HSPLjava/security/Signature;-><init>(Ljava/lang/String;)V
-HSPLjava/security/Signature;->getInstance(Ljava/lang/String;)Ljava/security/Signature;
-HSPLjava/security/Signature;->initSign(Ljava/security/PrivateKey;)V
-HSPLjava/security/Signature;->initVerify(Ljava/security/PublicKey;)V
-HSPLjava/security/Signature;->isSpi(Ljava/security/Provider$Service;)Z
-HSPLjava/security/Signature;->sign()[B
-HSPLjava/security/Signature;->update(Ljava/nio/ByteBuffer;)V
-HSPLjava/security/Signature;->update([B)V
-HSPLjava/security/Signature;->update([BII)V
-HSPLjava/security/Signature;->verify([B)Z
-HSPLjava/security/SignatureSpi;-><init>()V
-HSPLjava/security/SignatureSpi;->engineUpdate(Ljava/nio/ByteBuffer;)V
-HSPLjava/security/cert/CertPath;-><init>(Ljava/lang/String;)V
-HSPLjava/security/cert/CertPath;->getType()Ljava/lang/String;
-HSPLjava/security/cert/CertPathValidator;-><init>(Ljava/security/cert/CertPathValidatorSpi;Ljava/security/Provider;Ljava/lang/String;)V
-HSPLjava/security/cert/CertPathValidator;->getInstance(Ljava/lang/String;)Ljava/security/cert/CertPathValidator;
-HSPLjava/security/cert/CertPathValidator;->getRevocationChecker()Ljava/security/cert/CertPathChecker;
-HSPLjava/security/cert/CertPathValidator;->validate(Ljava/security/cert/CertPath;Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathValidatorResult;
-HSPLjava/security/cert/CertPathValidatorSpi;-><init>()V
-HSPLjava/security/cert/CertStore;-><init>(Ljava/security/cert/CertStoreSpi;Ljava/security/Provider;Ljava/lang/String;Ljava/security/cert/CertStoreParameters;)V
-HSPLjava/security/cert/CertStore;->getInstance(Ljava/lang/String;Ljava/security/cert/CertStoreParameters;)Ljava/security/cert/CertStore;
-HSPLjava/security/cert/CertStoreSpi;-><init>(Ljava/security/cert/CertStoreParameters;)V
-HSPLjava/security/cert/Certificate;-><init>(Ljava/lang/String;)V
-HSPLjava/security/cert/Certificate;->equals(Ljava/lang/Object;)Z
-HSPLjava/security/cert/Certificate;->getType()Ljava/lang/String;
-HSPLjava/security/cert/Certificate;->hashCode()I
-HSPLjava/security/cert/CertificateFactory;-><init>(Ljava/security/cert/CertificateFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V
-HSPLjava/security/cert/CertificateFactory;->generateCertPath(Ljava/util/List;)Ljava/security/cert/CertPath;
-HSPLjava/security/cert/CertificateFactory;->generateCertificate(Ljava/io/InputStream;)Ljava/security/cert/Certificate;
-HSPLjava/security/cert/CertificateFactory;->generateCertificates(Ljava/io/InputStream;)Ljava/util/Collection;
-HSPLjava/security/cert/CertificateFactory;->getInstance(Ljava/lang/String;)Ljava/security/cert/CertificateFactory;
-HSPLjava/security/cert/CertificateFactorySpi;-><init>()V
-HSPLjava/security/cert/CollectionCertStoreParameters;-><init>(Ljava/util/Collection;)V
-HSPLjava/security/cert/CollectionCertStoreParameters;->clone()Ljava/lang/Object;
-HSPLjava/security/cert/PKIXCertPathChecker;-><init>()V
-HSPLjava/security/cert/PKIXCertPathChecker;->clone()Ljava/lang/Object;
-HSPLjava/security/cert/PKIXCertPathValidatorResult;-><init>(Ljava/security/cert/TrustAnchor;Ljava/security/cert/PolicyNode;Ljava/security/PublicKey;)V
-HSPLjava/security/cert/PKIXParameters;-><init>(Ljava/util/Set;)V
-HSPLjava/security/cert/PKIXParameters;->addCertPathChecker(Ljava/security/cert/PKIXCertPathChecker;)V
-HSPLjava/security/cert/PKIXParameters;->getCertPathCheckers()Ljava/util/List;
-HSPLjava/security/cert/PKIXParameters;->getCertStores()Ljava/util/List;
-HSPLjava/security/cert/PKIXParameters;->getDate()Ljava/util/Date;
-HSPLjava/security/cert/PKIXParameters;->getInitialPolicies()Ljava/util/Set;
-HSPLjava/security/cert/PKIXParameters;->getPolicyQualifiersRejected()Z
-HSPLjava/security/cert/PKIXParameters;->getSigProvider()Ljava/lang/String;
-HSPLjava/security/cert/PKIXParameters;->getTargetCertConstraints()Ljava/security/cert/CertSelector;
-HSPLjava/security/cert/PKIXParameters;->getTrustAnchors()Ljava/util/Set;
-HSPLjava/security/cert/PKIXParameters;->isAnyPolicyInhibited()Z
-HSPLjava/security/cert/PKIXParameters;->isExplicitPolicyRequired()Z
-HSPLjava/security/cert/PKIXParameters;->isPolicyMappingInhibited()Z
-HSPLjava/security/cert/PKIXParameters;->isRevocationEnabled()Z
-HSPLjava/security/cert/PKIXParameters;->setCertPathCheckers(Ljava/util/List;)V
-HSPLjava/security/cert/PKIXParameters;->setRevocationEnabled(Z)V
-HSPLjava/security/cert/PKIXParameters;->setTrustAnchors(Ljava/util/Set;)V
-HSPLjava/security/cert/PKIXRevocationChecker;-><init>()V
-HSPLjava/security/cert/PKIXRevocationChecker;->clone()Ljava/security/cert/PKIXRevocationChecker;
-HSPLjava/security/cert/PKIXRevocationChecker;->getOcspExtensions()Ljava/util/List;
-HSPLjava/security/cert/PKIXRevocationChecker;->getOcspResponder()Ljava/net/URI;
-HSPLjava/security/cert/PKIXRevocationChecker;->getOcspResponderCert()Ljava/security/cert/X509Certificate;
-HSPLjava/security/cert/PKIXRevocationChecker;->getOcspResponses()Ljava/util/Map;
-HSPLjava/security/cert/PKIXRevocationChecker;->getOptions()Ljava/util/Set;
-HSPLjava/security/cert/PKIXRevocationChecker;->setOcspResponses(Ljava/util/Map;)V
-HSPLjava/security/cert/PKIXRevocationChecker;->setOptions(Ljava/util/Set;)V
-HSPLjava/security/cert/PolicyQualifierInfo;-><init>([B)V
-HSPLjava/security/cert/TrustAnchor;-><init>(Ljava/security/cert/X509Certificate;[B)V
-HSPLjava/security/cert/TrustAnchor;->getNameConstraints()[B
-HSPLjava/security/cert/TrustAnchor;->getTrustedCert()Ljava/security/cert/X509Certificate;
-HSPLjava/security/cert/TrustAnchor;->setNameConstraints([B)V
-HSPLjava/security/cert/X509CertSelector;-><init>()V
-HSPLjava/security/cert/X509CertSelector;->match(Ljava/security/cert/Certificate;)Z
-HSPLjava/security/cert/X509CertSelector;->matchAuthorityKeyID(Ljava/security/cert/X509Certificate;)Z
-HSPLjava/security/cert/X509CertSelector;->matchBasicConstraints(Ljava/security/cert/X509Certificate;)Z
-HSPLjava/security/cert/X509CertSelector;->matchExtendedKeyUsage(Ljava/security/cert/X509Certificate;)Z
-HSPLjava/security/cert/X509CertSelector;->matchKeyUsage(Ljava/security/cert/X509Certificate;)Z
-HSPLjava/security/cert/X509CertSelector;->matchNameConstraints(Ljava/security/cert/X509Certificate;)Z
-HSPLjava/security/cert/X509CertSelector;->matchPathToNames(Ljava/security/cert/X509Certificate;)Z
-HSPLjava/security/cert/X509CertSelector;->matchPolicy(Ljava/security/cert/X509Certificate;)Z
-HSPLjava/security/cert/X509CertSelector;->matchPrivateKeyValid(Ljava/security/cert/X509Certificate;)Z
-HSPLjava/security/cert/X509CertSelector;->matchSubjectAlternativeNames(Ljava/security/cert/X509Certificate;)Z
-HSPLjava/security/cert/X509CertSelector;->matchSubjectKeyID(Ljava/security/cert/X509Certificate;)Z
-HSPLjava/security/cert/X509CertSelector;->matchSubjectPublicKeyAlgID(Ljava/security/cert/X509Certificate;)Z
-HSPLjava/security/cert/X509CertSelector;->setSubject(Ljavax/security/auth/x500/X500Principal;)V
-HSPLjava/security/cert/X509Certificate;-><init>()V
-HSPLjava/security/spec/DSAParameterSpec;-><init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V
-HSPLjava/security/spec/DSAParameterSpec;->getG()Ljava/math/BigInteger;
-HSPLjava/security/spec/DSAParameterSpec;->getP()Ljava/math/BigInteger;
-HSPLjava/security/spec/DSAParameterSpec;->getQ()Ljava/math/BigInteger;
-HSPLjava/security/spec/ECFieldFp;-><init>(Ljava/math/BigInteger;)V
-HSPLjava/security/spec/ECFieldFp;->getFieldSize()I
-HSPLjava/security/spec/ECFieldFp;->getP()Ljava/math/BigInteger;
-HSPLjava/security/spec/ECParameterSpec;-><init>(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V
-HSPLjava/security/spec/ECParameterSpec;->getCurve()Ljava/security/spec/EllipticCurve;
-HSPLjava/security/spec/ECParameterSpec;->getOrder()Ljava/math/BigInteger;
-HSPLjava/security/spec/ECParameterSpec;->setCurveName(Ljava/lang/String;)V
-HSPLjava/security/spec/ECPoint;-><init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V
-HSPLjava/security/spec/ECPoint;->getAffineX()Ljava/math/BigInteger;
-HSPLjava/security/spec/ECPoint;->getAffineY()Ljava/math/BigInteger;
-HSPLjava/security/spec/EllipticCurve;-><init>(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V
-HSPLjava/security/spec/EllipticCurve;-><init>(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;[B)V
-HSPLjava/security/spec/EllipticCurve;->checkValidity(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/lang/String;)V
-HSPLjava/security/spec/EllipticCurve;->getField()Ljava/security/spec/ECField;
-HSPLjava/security/spec/EncodedKeySpec;-><init>([B)V
-HSPLjava/security/spec/EncodedKeySpec;->getEncoded()[B
-HSPLjava/security/spec/PKCS8EncodedKeySpec;-><init>([B)V
-HSPLjava/security/spec/PKCS8EncodedKeySpec;->getEncoded()[B
-HSPLjava/security/spec/X509EncodedKeySpec;-><init>([B)V
-HSPLjava/security/spec/X509EncodedKeySpec;->getEncoded()[B
-HSPLjava/text/AttributedCharacterIterator$Attribute;->equals(Ljava/lang/Object;)Z
-HSPLjava/text/BreakIterator;-><init>()V
-HSPLjava/text/BreakIterator;->getWordInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;
-HSPLjava/text/CalendarBuilder;-><init>()V
-HSPLjava/text/CalendarBuilder;->establish(Ljava/util/Calendar;)Ljava/util/Calendar;
-HSPLjava/text/CalendarBuilder;->isSet(I)Z
-HSPLjava/text/CalendarBuilder;->set(II)Ljava/text/CalendarBuilder;
-HSPLjava/text/CollationKey;-><init>(Ljava/lang/String;)V
-HSPLjava/text/Collator;-><init>()V
-HSPLjava/text/Collator;-><init>(Landroid/icu/text/Collator;)V
-HSPLjava/text/Collator;->decompositionMode_Java_ICU(I)I
-HSPLjava/text/Collator;->getInstance()Ljava/text/Collator;
-HSPLjava/text/Collator;->getInstance(Ljava/util/Locale;)Ljava/text/Collator;
-HSPLjava/text/Collator;->setDecomposition(I)V
-HSPLjava/text/Collator;->setStrength(I)V
-HSPLjava/text/DateFormat;-><init>()V
-HSPLjava/text/DateFormat;->format(Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-HSPLjava/text/DateFormat;->format(Ljava/util/Date;)Ljava/lang/String;
-HSPLjava/text/DateFormat;->get(IIILjava/util/Locale;)Ljava/text/DateFormat;
-HSPLjava/text/DateFormat;->getDateInstance(ILjava/util/Locale;)Ljava/text/DateFormat;
-HSPLjava/text/DateFormat;->getDateTimeInstance()Ljava/text/DateFormat;
-HSPLjava/text/DateFormat;->getDateTimeInstance(II)Ljava/text/DateFormat;
-HSPLjava/text/DateFormat;->getDateTimeInstance(IILjava/util/Locale;)Ljava/text/DateFormat;
-HSPLjava/text/DateFormat;->getTimeInstance(ILjava/util/Locale;)Ljava/text/DateFormat;
-HSPLjava/text/DateFormat;->getTimeZone()Ljava/util/TimeZone;
-HSPLjava/text/DateFormat;->parse(Ljava/lang/String;)Ljava/util/Date;
-HSPLjava/text/DateFormat;->set24HourTimePref(Ljava/lang/Boolean;)V
-HSPLjava/text/DateFormat;->setCalendar(Ljava/util/Calendar;)V
-HSPLjava/text/DateFormat;->setLenient(Z)V
-HSPLjava/text/DateFormat;->setTimeZone(Ljava/util/TimeZone;)V
-HSPLjava/text/DateFormatSymbols;-><init>(Ljava/util/Locale;)V
-HSPLjava/text/DateFormatSymbols;->clone()Ljava/lang/Object;
-HSPLjava/text/DateFormatSymbols;->copyMembers(Ljava/text/DateFormatSymbols;Ljava/text/DateFormatSymbols;)V
-HSPLjava/text/DateFormatSymbols;->getAmPmStrings()[Ljava/lang/String;
-HSPLjava/text/DateFormatSymbols;->getCachedInstance(Ljava/util/Locale;)Ljava/text/DateFormatSymbols;
-HSPLjava/text/DateFormatSymbols;->getInstance(Ljava/util/Locale;)Ljava/text/DateFormatSymbols;
-HSPLjava/text/DateFormatSymbols;->getInstanceRef(Ljava/util/Locale;)Ljava/text/DateFormatSymbols;
-HSPLjava/text/DateFormatSymbols;->getMonths()[Ljava/lang/String;
-HSPLjava/text/DateFormatSymbols;->getShortMonths()[Ljava/lang/String;
-HSPLjava/text/DateFormatSymbols;->getShortWeekdays()[Ljava/lang/String;
-HSPLjava/text/DateFormatSymbols;->getWeekdays()[Ljava/lang/String;
-HSPLjava/text/DateFormatSymbols;->initializeData(Ljava/util/Locale;)V
-HSPLjava/text/DateFormatSymbols;->initializeSupplementaryData(Llibcore/icu/LocaleData;)V
-HSPLjava/text/DecimalFormat;-><init>(Ljava/lang/String;)V
-HSPLjava/text/DecimalFormat;-><init>(Ljava/lang/String;Ljava/text/DecimalFormatSymbols;)V
-HSPLjava/text/DecimalFormat;->clone()Ljava/lang/Object;
-HSPLjava/text/DecimalFormat;->equals(Ljava/lang/Object;)Z
-HSPLjava/text/DecimalFormat;->format(DLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-HSPLjava/text/DecimalFormat;->format(JLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-HSPLjava/text/DecimalFormat;->format(Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-HSPLjava/text/DecimalFormat;->getDecimalFormatSymbols()Ljava/text/DecimalFormatSymbols;
-HSPLjava/text/DecimalFormat;->getIcuFieldPosition(Ljava/text/FieldPosition;)Ljava/text/FieldPosition;
-HSPLjava/text/DecimalFormat;->getMaximumFractionDigits()I
-HSPLjava/text/DecimalFormat;->getMaximumIntegerDigits()I
-HSPLjava/text/DecimalFormat;->getMinimumFractionDigits()I
-HSPLjava/text/DecimalFormat;->getMinimumIntegerDigits()I
-HSPLjava/text/DecimalFormat;->getNegativePrefix()Ljava/lang/String;
-HSPLjava/text/DecimalFormat;->getNegativeSuffix()Ljava/lang/String;
-HSPLjava/text/DecimalFormat;->getPositivePrefix()Ljava/lang/String;
-HSPLjava/text/DecimalFormat;->getPositiveSuffix()Ljava/lang/String;
-HSPLjava/text/DecimalFormat;->initPattern(Ljava/lang/String;)V
-HSPLjava/text/DecimalFormat;->isParseBigDecimal()Z
-HSPLjava/text/DecimalFormat;->isParseIntegerOnly()Z
-HSPLjava/text/DecimalFormat;->parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Number;
-HSPLjava/text/DecimalFormat;->setDecimalSeparatorAlwaysShown(Z)V
-HSPLjava/text/DecimalFormat;->setGroupingUsed(Z)V
-HSPLjava/text/DecimalFormat;->setMaximumFractionDigits(I)V
-HSPLjava/text/DecimalFormat;->setMaximumIntegerDigits(I)V
-HSPLjava/text/DecimalFormat;->setMinimumFractionDigits(I)V
-HSPLjava/text/DecimalFormat;->setMinimumIntegerDigits(I)V
-HSPLjava/text/DecimalFormat;->setParseIntegerOnly(Z)V
-HSPLjava/text/DecimalFormat;->toPattern()Ljava/lang/String;
-HSPLjava/text/DecimalFormat;->updateFieldsFromIcu()V
-HSPLjava/text/DecimalFormatSymbols;-><init>(Ljava/util/Locale;)V
-HSPLjava/text/DecimalFormatSymbols;->clone()Ljava/lang/Object;
-HSPLjava/text/DecimalFormatSymbols;->findNonFormatChar(Ljava/lang/String;C)C
-HSPLjava/text/DecimalFormatSymbols;->fromIcuInstance(Landroid/icu/text/DecimalFormatSymbols;)Ljava/text/DecimalFormatSymbols;
-HSPLjava/text/DecimalFormatSymbols;->getCurrency()Ljava/util/Currency;
-HSPLjava/text/DecimalFormatSymbols;->getDecimalSeparator()C
-HSPLjava/text/DecimalFormatSymbols;->getGroupingSeparator()C
-HSPLjava/text/DecimalFormatSymbols;->getIcuDecimalFormatSymbols()Landroid/icu/text/DecimalFormatSymbols;
-HSPLjava/text/DecimalFormatSymbols;->getInfinity()Ljava/lang/String;
-HSPLjava/text/DecimalFormatSymbols;->getInstance(Ljava/util/Locale;)Ljava/text/DecimalFormatSymbols;
-HSPLjava/text/DecimalFormatSymbols;->getNaN()Ljava/lang/String;
-HSPLjava/text/DecimalFormatSymbols;->getZeroDigit()C
-HSPLjava/text/DecimalFormatSymbols;->initialize(Ljava/util/Locale;)V
-HSPLjava/text/DecimalFormatSymbols;->initializeCurrency(Ljava/util/Locale;)V
-HSPLjava/text/DecimalFormatSymbols;->maybeStripMarkers(Ljava/lang/String;C)C
-HSPLjava/text/DecimalFormatSymbols;->setCurrency(Ljava/util/Currency;)V
-HSPLjava/text/DecimalFormatSymbols;->setCurrencySymbol(Ljava/lang/String;)V
-HSPLjava/text/DecimalFormatSymbols;->setDecimalSeparator(C)V
-HSPLjava/text/DecimalFormatSymbols;->setDigit(C)V
-HSPLjava/text/DecimalFormatSymbols;->setExponentSeparator(Ljava/lang/String;)V
-HSPLjava/text/DecimalFormatSymbols;->setGroupingSeparator(C)V
-HSPLjava/text/DecimalFormatSymbols;->setInfinity(Ljava/lang/String;)V
-HSPLjava/text/DecimalFormatSymbols;->setInternationalCurrencySymbol(Ljava/lang/String;)V
-HSPLjava/text/DecimalFormatSymbols;->setMinusSign(C)V
-HSPLjava/text/DecimalFormatSymbols;->setMonetaryDecimalSeparator(C)V
-HSPLjava/text/DecimalFormatSymbols;->setMonetaryGroupingSeparator(C)V
-HSPLjava/text/DecimalFormatSymbols;->setNaN(Ljava/lang/String;)V
-HSPLjava/text/DecimalFormatSymbols;->setPatternSeparator(C)V
-HSPLjava/text/DecimalFormatSymbols;->setPerMill(C)V
-HSPLjava/text/DecimalFormatSymbols;->setPercent(C)V
-HSPLjava/text/DecimalFormatSymbols;->setZeroDigit(C)V
-HSPLjava/text/DontCareFieldPosition$1;->formatted(ILjava/text/Format$Field;Ljava/lang/Object;IILjava/lang/StringBuffer;)V
-HSPLjava/text/DontCareFieldPosition;->getFieldDelegate()Ljava/text/Format$FieldDelegate;
-HSPLjava/text/FieldPosition$Delegate;-><init>(Ljava/text/FieldPosition;)V
-HSPLjava/text/FieldPosition$Delegate;->formatted(ILjava/text/Format$Field;Ljava/lang/Object;IILjava/lang/StringBuffer;)V
-HSPLjava/text/FieldPosition;-><init>(I)V
-HSPLjava/text/FieldPosition;->getBeginIndex()I
-HSPLjava/text/FieldPosition;->getEndIndex()I
-HSPLjava/text/FieldPosition;->getField()I
-HSPLjava/text/FieldPosition;->getFieldAttribute()Ljava/text/Format$Field;
-HSPLjava/text/FieldPosition;->getFieldDelegate()Ljava/text/Format$FieldDelegate;
-HSPLjava/text/FieldPosition;->matchesField(Ljava/text/Format$Field;I)Z
-HSPLjava/text/FieldPosition;->setBeginIndex(I)V
-HSPLjava/text/FieldPosition;->setEndIndex(I)V
-HSPLjava/text/Format;-><init>()V
-HSPLjava/text/Format;->clone()Ljava/lang/Object;
-HSPLjava/text/Format;->format(Ljava/lang/Object;)Ljava/lang/String;
-HSPLjava/text/IcuIteratorWrapper;-><init>(Landroid/icu/text/BreakIterator;)V
-HSPLjava/text/IcuIteratorWrapper;->checkOffset(ILjava/text/CharacterIterator;)V
-HSPLjava/text/IcuIteratorWrapper;->following(I)I
-HSPLjava/text/IcuIteratorWrapper;->getText()Ljava/text/CharacterIterator;
-HSPLjava/text/IcuIteratorWrapper;->isBoundary(I)Z
-HSPLjava/text/IcuIteratorWrapper;->next()I
-HSPLjava/text/IcuIteratorWrapper;->preceding(I)I
-HSPLjava/text/IcuIteratorWrapper;->setText(Ljava/lang/String;)V
-HSPLjava/text/MessageFormat;-><init>(Ljava/lang/String;)V
-HSPLjava/text/MessageFormat;->applyPattern(Ljava/lang/String;)V
-HSPLjava/text/MessageFormat;->format(Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-HSPLjava/text/MessageFormat;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
-HSPLjava/text/MessageFormat;->makeFormat(II[Ljava/lang/StringBuilder;)V
-HSPLjava/text/MessageFormat;->subformat([Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;Ljava/util/List;)Ljava/lang/StringBuffer;
-HSPLjava/text/Normalizer$Form$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
-HSPLjava/text/Normalizer$Form$$ExternalSyntheticLambda2;->get()Ljava/lang/Object;
-HSPLjava/text/Normalizer$Form$$ExternalSyntheticLambda3;->get()Ljava/lang/Object;
-HSPLjava/text/Normalizer;->normalize(Ljava/lang/CharSequence;Ljava/text/Normalizer$Form;)Ljava/lang/String;
-HSPLjava/text/NumberFormat;-><init>()V
-HSPLjava/text/NumberFormat;->clone()Ljava/lang/Object;
-HSPLjava/text/NumberFormat;->format(D)Ljava/lang/String;
-HSPLjava/text/NumberFormat;->format(J)Ljava/lang/String;
-HSPLjava/text/NumberFormat;->getInstance()Ljava/text/NumberFormat;
-HSPLjava/text/NumberFormat;->getInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;
-HSPLjava/text/NumberFormat;->getInstance(Ljava/util/Locale;Ljava/text/NumberFormat$Style;I)Ljava/text/NumberFormat;
-HSPLjava/text/NumberFormat;->getIntegerInstance()Ljava/text/NumberFormat;
-HSPLjava/text/NumberFormat;->getIntegerInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;
-HSPLjava/text/NumberFormat;->getNumberInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;
-HSPLjava/text/NumberFormat;->getPercentInstance()Ljava/text/NumberFormat;
-HSPLjava/text/NumberFormat;->setMaximumFractionDigits(I)V
-HSPLjava/text/NumberFormat;->setMaximumIntegerDigits(I)V
-HSPLjava/text/NumberFormat;->setMinimumFractionDigits(I)V
-HSPLjava/text/NumberFormat;->setMinimumIntegerDigits(I)V
-HSPLjava/text/NumberFormat;->setParseIntegerOnly(Z)V
-HSPLjava/text/ParseException;-><init>(Ljava/lang/String;I)V
-HSPLjava/text/ParsePosition;-><init>(I)V
-HSPLjava/text/ParsePosition;->getErrorIndex()I
-HSPLjava/text/ParsePosition;->getIndex()I
-HSPLjava/text/ParsePosition;->setIndex(I)V
-HSPLjava/text/RuleBasedCollator;-><init>(Landroid/icu/text/RuleBasedCollator;)V
-HSPLjava/text/RuleBasedCollator;-><init>(Ljava/lang/String;)V
-HSPLjava/text/RuleBasedCollator;->collAsICU()Landroid/icu/text/RuleBasedCollator;
-HSPLjava/text/RuleBasedCollator;->compare(Ljava/lang/String;Ljava/lang/String;)I
-HSPLjava/text/RuleBasedCollator;->getCollationKey(Ljava/lang/String;)Ljava/text/CollationKey;
-HSPLjava/text/RuleBasedCollator;->getRules()Ljava/lang/String;
-HSPLjava/text/SimpleDateFormat;-><init>()V
-HSPLjava/text/SimpleDateFormat;-><init>(IILjava/util/Locale;)V
-HSPLjava/text/SimpleDateFormat;-><init>(Ljava/lang/String;)V
-HSPLjava/text/SimpleDateFormat;-><init>(Ljava/lang/String;Ljava/util/Locale;)V
-HSPLjava/text/SimpleDateFormat;->checkNegativeNumberExpression()V
-HSPLjava/text/SimpleDateFormat;->compile(Ljava/lang/String;)[C
-HSPLjava/text/SimpleDateFormat;->encode(IILjava/lang/StringBuilder;)V
-HSPLjava/text/SimpleDateFormat;->format(Ljava/util/Date;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-HSPLjava/text/SimpleDateFormat;->format(Ljava/util/Date;Ljava/lang/StringBuffer;Ljava/text/Format$FieldDelegate;)Ljava/lang/StringBuffer;
-HSPLjava/text/SimpleDateFormat;->formatMonth(IIILjava/lang/StringBuffer;ZZII)Ljava/lang/String;
-HSPLjava/text/SimpleDateFormat;->formatWeekday(IIZZ)Ljava/lang/String;
-HSPLjava/text/SimpleDateFormat;->getDateTimeFormat(IILjava/util/Locale;)Ljava/lang/String;
-HSPLjava/text/SimpleDateFormat;->getExtendedTimeZoneNames()Lcom/android/icu/text/ExtendedTimeZoneNames;
-HSPLjava/text/SimpleDateFormat;->getTimeZoneNames()Landroid/icu/text/TimeZoneNames;
-HSPLjava/text/SimpleDateFormat;->initialize(Ljava/util/Locale;)V
-HSPLjava/text/SimpleDateFormat;->initializeCalendar(Ljava/util/Locale;)V
-HSPLjava/text/SimpleDateFormat;->initializeDefaultCentury()V
-HSPLjava/text/SimpleDateFormat;->isDigit(C)Z
-HSPLjava/text/SimpleDateFormat;->matchString(Ljava/lang/String;II[Ljava/lang/String;Ljava/text/CalendarBuilder;)I
-HSPLjava/text/SimpleDateFormat;->parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/util/Date;
-HSPLjava/text/SimpleDateFormat;->parseAmbiguousDatesAsAfter(Ljava/util/Date;)V
-HSPLjava/text/SimpleDateFormat;->parseInternal(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/util/Date;
-HSPLjava/text/SimpleDateFormat;->parseMonth(Ljava/lang/String;IIIILjava/text/ParsePosition;ZZLjava/text/CalendarBuilder;)I
-HSPLjava/text/SimpleDateFormat;->parseWeekday(Ljava/lang/String;IIZZLjava/text/CalendarBuilder;)I
-HSPLjava/text/SimpleDateFormat;->shouldObeyCount(II)Z
-HSPLjava/text/SimpleDateFormat;->subFormat(IILjava/text/Format$FieldDelegate;Ljava/lang/StringBuffer;Z)V
-HSPLjava/text/SimpleDateFormat;->subParse(Ljava/lang/String;IIIZ[ZLjava/text/ParsePosition;ZLjava/text/CalendarBuilder;)I
-HSPLjava/text/SimpleDateFormat;->subParseNumericZone(Ljava/lang/String;IIIZLjava/text/CalendarBuilder;)I
-HSPLjava/text/SimpleDateFormat;->toPattern()Ljava/lang/String;
-HSPLjava/text/SimpleDateFormat;->useDateFormatSymbols()Z
-HSPLjava/text/SimpleDateFormat;->zeroPaddingNumber(IIILjava/lang/StringBuffer;)V
-HSPLjava/text/StringCharacterIterator;-><init>(Ljava/lang/String;)V
-HSPLjava/text/StringCharacterIterator;-><init>(Ljava/lang/String;I)V
-HSPLjava/text/StringCharacterIterator;-><init>(Ljava/lang/String;III)V
-HSPLjava/text/StringCharacterIterator;->clone()Ljava/lang/Object;
-HSPLjava/text/StringCharacterIterator;->current()C
-HSPLjava/text/StringCharacterIterator;->first()C
-HSPLjava/text/StringCharacterIterator;->getBeginIndex()I
-HSPLjava/text/StringCharacterIterator;->getEndIndex()I
-HSPLjava/text/StringCharacterIterator;->getIndex()I
-HSPLjava/text/StringCharacterIterator;->next()C
-HSPLjava/text/StringCharacterIterator;->previous()C
-HSPLjava/text/StringCharacterIterator;->setIndex(I)C
-HSPLjava/time/Clock$SystemClock;-><init>(Ljava/time/ZoneId;)V
-HSPLjava/time/Clock$SystemClock;->getZone()Ljava/time/ZoneId;
-HSPLjava/time/Clock$SystemClock;->instant()Ljava/time/Instant;
-HSPLjava/time/Clock$SystemClock;->millis()J
-HSPLjava/time/Clock;-><init>()V
-HSPLjava/time/Clock;->currentInstant()Ljava/time/Instant;
-HSPLjava/time/Clock;->systemDefaultZone()Ljava/time/Clock;
-HSPLjava/time/Clock;->systemUTC()Ljava/time/Clock;
-HSPLjava/time/DayOfWeek;->getValue()I
-HSPLjava/time/DayOfWeek;->of(I)Ljava/time/DayOfWeek;
-HSPLjava/time/DayOfWeek;->plus(J)Ljava/time/DayOfWeek;
-HSPLjava/time/Duration;-><init>(JI)V
-HSPLjava/time/Duration;->between(Ljava/time/temporal/Temporal;Ljava/time/temporal/Temporal;)Ljava/time/Duration;
-HSPLjava/time/Duration;->compareTo(Ljava/time/Duration;)I
-HSPLjava/time/Duration;->create(JI)Ljava/time/Duration;
-HSPLjava/time/Duration;->getSeconds()J
-HSPLjava/time/Duration;->isNegative()Z
-HSPLjava/time/Duration;->ofDays(J)Ljava/time/Duration;
-HSPLjava/time/Duration;->ofHours(J)Ljava/time/Duration;
-HSPLjava/time/Duration;->ofMillis(J)Ljava/time/Duration;
-HSPLjava/time/Duration;->ofMinutes(J)Ljava/time/Duration;
-HSPLjava/time/Duration;->ofNanos(J)Ljava/time/Duration;
-HSPLjava/time/Duration;->ofSeconds(J)Ljava/time/Duration;
-HSPLjava/time/Duration;->ofSeconds(JJ)Ljava/time/Duration;
-HSPLjava/time/Duration;->toMillis()J
-HSPLjava/time/Duration;->toNanos()J
-HSPLjava/time/Instant;-><init>(JI)V
-HSPLjava/time/Instant;->atOffset(Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;
-HSPLjava/time/Instant;->atZone(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;
-HSPLjava/time/Instant;->compareTo(Ljava/time/Instant;)I
-HSPLjava/time/Instant;->create(JI)Ljava/time/Instant;
-HSPLjava/time/Instant;->from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/Instant;
-HSPLjava/time/Instant;->getEpochSecond()J
-HSPLjava/time/Instant;->getLong(Ljava/time/temporal/TemporalField;)J
-HSPLjava/time/Instant;->getNano()I
-HSPLjava/time/Instant;->isAfter(Ljava/time/Instant;)Z
-HSPLjava/time/Instant;->isSupported(Ljava/time/temporal/TemporalField;)Z
-HSPLjava/time/Instant;->minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Instant;
-HSPLjava/time/Instant;->minusMillis(J)Ljava/time/Instant;
-HSPLjava/time/Instant;->nanosUntil(Ljava/time/Instant;)J
-HSPLjava/time/Instant;->now()Ljava/time/Instant;
-HSPLjava/time/Instant;->ofEpochMilli(J)Ljava/time/Instant;
-HSPLjava/time/Instant;->ofEpochSecond(JJ)Ljava/time/Instant;
-HSPLjava/time/Instant;->plus(JJ)Ljava/time/Instant;
-HSPLjava/time/Instant;->plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Instant;
-HSPLjava/time/Instant;->plusMillis(J)Ljava/time/Instant;
-HSPLjava/time/Instant;->plusSeconds(J)Ljava/time/Instant;
-HSPLjava/time/Instant;->toEpochMilli()J
-HSPLjava/time/Instant;->toString()Ljava/lang/String;
-HSPLjava/time/Instant;->until(Ljava/time/temporal/Temporal;Ljava/time/temporal/TemporalUnit;)J
-HSPLjava/time/LocalDate;-><init>(III)V
-HSPLjava/time/LocalDate;->atTime(Ljava/time/LocalTime;)Ljava/time/LocalDateTime;
-HSPLjava/time/LocalDate;->atTime(Ljava/time/LocalTime;)Ljava/time/chrono/ChronoLocalDateTime;
-HSPLjava/time/LocalDate;->compareTo0(Ljava/time/LocalDate;)I
-HSPLjava/time/LocalDate;->create(III)Ljava/time/LocalDate;
-HSPLjava/time/LocalDate;->get(Ljava/time/temporal/TemporalField;)I
-HSPLjava/time/LocalDate;->get0(Ljava/time/temporal/TemporalField;)I
-HSPLjava/time/LocalDate;->getChronology()Ljava/time/chrono/Chronology;
-HSPLjava/time/LocalDate;->getChronology()Ljava/time/chrono/IsoChronology;
-HSPLjava/time/LocalDate;->getDayOfMonth()I
-HSPLjava/time/LocalDate;->getDayOfWeek()Ljava/time/DayOfWeek;
-HSPLjava/time/LocalDate;->getLong(Ljava/time/temporal/TemporalField;)J
-HSPLjava/time/LocalDate;->getMonthValue()I
-HSPLjava/time/LocalDate;->getYear()I
-HSPLjava/time/LocalDate;->isLeapYear()Z
-HSPLjava/time/LocalDate;->isSupported(Ljava/time/temporal/TemporalField;)Z
-HSPLjava/time/LocalDate;->lengthOfMonth()I
-HSPLjava/time/LocalDate;->minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalDate;
-HSPLjava/time/LocalDate;->minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/temporal/Temporal;
-HSPLjava/time/LocalDate;->of(III)Ljava/time/LocalDate;
-HSPLjava/time/LocalDate;->of(ILjava/time/Month;I)Ljava/time/LocalDate;
-HSPLjava/time/LocalDate;->ofEpochDay(J)Ljava/time/LocalDate;
-HSPLjava/time/LocalDate;->plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalDate;
-HSPLjava/time/LocalDate;->plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/temporal/Temporal;
-HSPLjava/time/LocalDate;->plusDays(J)Ljava/time/LocalDate;
-HSPLjava/time/LocalDate;->toEpochDay()J
-HSPLjava/time/LocalDate;->toString()Ljava/lang/String;
-HSPLjava/time/LocalDate;->with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/LocalDate;
-HSPLjava/time/LocalDateTime;-><init>(Ljava/time/LocalDate;Ljava/time/LocalTime;)V
-HSPLjava/time/LocalDateTime;->atOffset(Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;
-HSPLjava/time/LocalDateTime;->atZone(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;
-HSPLjava/time/LocalDateTime;->atZone(Ljava/time/ZoneId;)Ljava/time/chrono/ChronoZonedDateTime;
-HSPLjava/time/LocalDateTime;->compareTo0(Ljava/time/LocalDateTime;)I
-HSPLjava/time/LocalDateTime;->format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;
-HSPLjava/time/LocalDateTime;->getDayOfMonth()I
-HSPLjava/time/LocalDateTime;->getHour()I
-HSPLjava/time/LocalDateTime;->getLong(Ljava/time/temporal/TemporalField;)J
-HSPLjava/time/LocalDateTime;->getMinute()I
-HSPLjava/time/LocalDateTime;->getMonthValue()I
-HSPLjava/time/LocalDateTime;->getNano()I
-HSPLjava/time/LocalDateTime;->getSecond()I
-HSPLjava/time/LocalDateTime;->getYear()I
-HSPLjava/time/LocalDateTime;->isAfter(Ljava/time/chrono/ChronoLocalDateTime;)Z
-HSPLjava/time/LocalDateTime;->isBefore(Ljava/time/chrono/ChronoLocalDateTime;)Z
-HSPLjava/time/LocalDateTime;->isSupported(Ljava/time/temporal/TemporalField;)Z
-HSPLjava/time/LocalDateTime;->now()Ljava/time/LocalDateTime;
-HSPLjava/time/LocalDateTime;->now(Ljava/time/Clock;)Ljava/time/LocalDateTime;
-HSPLjava/time/LocalDateTime;->of(Ljava/time/LocalDate;Ljava/time/LocalTime;)Ljava/time/LocalDateTime;
-HSPLjava/time/LocalDateTime;->ofEpochSecond(JILjava/time/ZoneOffset;)Ljava/time/LocalDateTime;
-HSPLjava/time/LocalDateTime;->ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/LocalDateTime;
-HSPLjava/time/LocalDateTime;->plusSeconds(J)Ljava/time/LocalDateTime;
-HSPLjava/time/LocalDateTime;->plusWithOverflow(Ljava/time/LocalDate;JJJJI)Ljava/time/LocalDateTime;
-HSPLjava/time/LocalDateTime;->query(Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;
-HSPLjava/time/LocalDateTime;->toLocalDate()Ljava/time/LocalDate;
-HSPLjava/time/LocalDateTime;->toLocalDate()Ljava/time/chrono/ChronoLocalDate;
-HSPLjava/time/LocalDateTime;->toLocalTime()Ljava/time/LocalTime;
-HSPLjava/time/LocalDateTime;->toString()Ljava/lang/String;
-HSPLjava/time/LocalDateTime;->with(Ljava/time/LocalDate;Ljava/time/LocalTime;)Ljava/time/LocalDateTime;
-HSPLjava/time/LocalTime$1;-><clinit>()V
-HSPLjava/time/LocalTime;-><init>(IIII)V
-HSPLjava/time/LocalTime;->create(IIII)Ljava/time/LocalTime;
-HSPLjava/time/LocalTime;->get0(Ljava/time/temporal/TemporalField;)I
-HSPLjava/time/LocalTime;->getHour()I
-HSPLjava/time/LocalTime;->getLong(Ljava/time/temporal/TemporalField;)J
-HSPLjava/time/LocalTime;->getMinute()I
-HSPLjava/time/LocalTime;->getNano()I
-HSPLjava/time/LocalTime;->getSecond()I
-HSPLjava/time/LocalTime;->isSupported(Ljava/time/temporal/TemporalField;)Z
-HSPLjava/time/LocalTime;->of(IIII)Ljava/time/LocalTime;
-HSPLjava/time/LocalTime;->ofNanoOfDay(J)Ljava/time/LocalTime;
-HSPLjava/time/LocalTime;->ofSecondOfDay(J)Ljava/time/LocalTime;
-HSPLjava/time/LocalTime;->toNanoOfDay()J
-HSPLjava/time/LocalTime;->toSecondOfDay()I
-HSPLjava/time/LocalTime;->toString()Ljava/lang/String;
-HSPLjava/time/Month;->getValue()I
-HSPLjava/time/Month;->length(Z)I
-HSPLjava/time/Month;->maxLength()I
-HSPLjava/time/Month;->of(I)Ljava/time/Month;
-HSPLjava/time/Month;->plus(J)Ljava/time/Month;
-HSPLjava/time/Month;->values()[Ljava/time/Month;
-HSPLjava/time/OffsetDateTime;-><clinit>()V
-HSPLjava/time/OffsetDateTime;-><init>(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;)V
-HSPLjava/time/OffsetDateTime;->getYear()I
-HSPLjava/time/OffsetDateTime;->of(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;
-HSPLjava/time/OffsetDateTime;->ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/OffsetDateTime;
-HSPLjava/time/OffsetDateTime;->toLocalDateTime()Ljava/time/LocalDateTime;
-HSPLjava/time/Period;->isZero()Z
-HSPLjava/time/ZoneId;-><init>()V
-HSPLjava/time/ZoneId;->equals(Ljava/lang/Object;)Z
-HSPLjava/time/ZoneId;->from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/ZoneId;
-HSPLjava/time/ZoneId;->of(Ljava/lang/String;)Ljava/time/ZoneId;
-HSPLjava/time/ZoneId;->of(Ljava/lang/String;Ljava/util/Map;)Ljava/time/ZoneId;
-HSPLjava/time/ZoneId;->of(Ljava/lang/String;Z)Ljava/time/ZoneId;
-HSPLjava/time/ZoneId;->systemDefault()Ljava/time/ZoneId;
-HSPLjava/time/ZoneId;->toString()Ljava/lang/String;
-HSPLjava/time/ZoneOffset;-><init>(I)V
-HSPLjava/time/ZoneOffset;->buildId(I)Ljava/lang/String;
-HSPLjava/time/ZoneOffset;->equals(Ljava/lang/Object;)Z
-HSPLjava/time/ZoneOffset;->getId()Ljava/lang/String;
-HSPLjava/time/ZoneOffset;->getRules()Ljava/time/zone/ZoneRules;
-HSPLjava/time/ZoneOffset;->getTotalSeconds()I
-HSPLjava/time/ZoneOffset;->ofTotalSeconds(I)Ljava/time/ZoneOffset;
-HSPLjava/time/ZoneRegion;-><init>(Ljava/lang/String;Ljava/time/zone/ZoneRules;)V
-HSPLjava/time/ZoneRegion;->checkName(Ljava/lang/String;)V
-HSPLjava/time/ZoneRegion;->getId()Ljava/lang/String;
-HSPLjava/time/ZoneRegion;->getRules()Ljava/time/zone/ZoneRules;
-HSPLjava/time/ZoneRegion;->ofId(Ljava/lang/String;Z)Ljava/time/ZoneRegion;
-HSPLjava/time/ZonedDateTime$1;-><clinit>()V
-HSPLjava/time/ZonedDateTime;-><init>(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneId;)V
-HSPLjava/time/ZonedDateTime;->create(JILjava/time/ZoneId;)Ljava/time/ZonedDateTime;
-HSPLjava/time/ZonedDateTime;->from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/ZonedDateTime;
-HSPLjava/time/ZonedDateTime;->getLong(Ljava/time/temporal/TemporalField;)J
-HSPLjava/time/ZonedDateTime;->getOffset()Ljava/time/ZoneOffset;
-HSPLjava/time/ZonedDateTime;->getZone()Ljava/time/ZoneId;
-HSPLjava/time/ZonedDateTime;->now(Ljava/time/Clock;)Ljava/time/ZonedDateTime;
-HSPLjava/time/ZonedDateTime;->of(Ljava/time/LocalDateTime;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;
-HSPLjava/time/ZonedDateTime;->ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;
-HSPLjava/time/ZonedDateTime;->ofLocal(Ljava/time/LocalDateTime;Ljava/time/ZoneId;Ljava/time/ZoneOffset;)Ljava/time/ZonedDateTime;
-HSPLjava/time/ZonedDateTime;->query(Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;
-HSPLjava/time/ZonedDateTime;->toLocalDate()Ljava/time/LocalDate;
-HSPLjava/time/ZonedDateTime;->toLocalDate()Ljava/time/chrono/ChronoLocalDate;
-HSPLjava/time/ZonedDateTime;->toLocalTime()Ljava/time/LocalTime;
-HSPLjava/time/chrono/AbstractChronology;->equals(Ljava/lang/Object;)Z
-HSPLjava/time/chrono/AbstractChronology;->resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-HSPLjava/time/chrono/ChronoLocalDate;->isSupported(Ljava/time/temporal/TemporalField;)Z
-HSPLjava/time/chrono/ChronoLocalDateTime;->getChronology()Ljava/time/chrono/Chronology;
-HSPLjava/time/chrono/ChronoLocalDateTime;->query(Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;
-HSPLjava/time/chrono/ChronoLocalDateTime;->toEpochSecond(Ljava/time/ZoneOffset;)J+]Ljava/time/chrono/ChronoLocalDateTime;Ljava/time/LocalDateTime;]Ljava/time/chrono/ChronoLocalDate;Ljava/time/LocalDate;
-HSPLjava/time/chrono/ChronoZonedDateTime;->getChronology()Ljava/time/chrono/Chronology;+]Ljava/time/chrono/ChronoZonedDateTime;Ljava/time/ZonedDateTime;]Ljava/time/chrono/ChronoLocalDate;Ljava/time/LocalDate;
-HSPLjava/time/chrono/ChronoZonedDateTime;->query(Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;
-HSPLjava/time/chrono/ChronoZonedDateTime;->toEpochSecond()J+]Ljava/time/chrono/ChronoZonedDateTime;Ljava/time/ZonedDateTime;]Ljava/time/chrono/ChronoLocalDate;Ljava/time/LocalDate;
-HSPLjava/time/chrono/ChronoZonedDateTime;->toInstant()Ljava/time/Instant;+]Ljava/time/chrono/ChronoZonedDateTime;Ljava/time/ZonedDateTime;
-HSPLjava/time/chrono/IsoChronology;->isLeapYear(J)Z
-HSPLjava/time/chrono/IsoChronology;->resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/LocalDate;
-HSPLjava/time/chrono/IsoChronology;->resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-HSPLjava/time/chrono/IsoChronology;->resolveProlepticMonth(Ljava/util/Map;Ljava/time/format/ResolverStyle;)V
-HSPLjava/time/chrono/IsoChronology;->resolveYMD(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/LocalDate;
-HSPLjava/time/chrono/IsoChronology;->resolveYMD(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-HSPLjava/time/chrono/IsoChronology;->resolveYearOfEra(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/LocalDate;
-HSPLjava/time/chrono/IsoChronology;->resolveYearOfEra(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-HSPLjava/time/format/DateTimeFormatter;-><init>(Ljava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;Ljava/util/Locale;Ljava/time/format/DecimalStyle;Ljava/time/format/ResolverStyle;Ljava/util/Set;Ljava/time/chrono/Chronology;Ljava/time/ZoneId;)V
-HSPLjava/time/format/DateTimeFormatter;->format(Ljava/time/temporal/TemporalAccessor;)Ljava/lang/String;
-HSPLjava/time/format/DateTimeFormatter;->formatTo(Ljava/time/temporal/TemporalAccessor;Ljava/lang/Appendable;)V
-HSPLjava/time/format/DateTimeFormatter;->getChronology()Ljava/time/chrono/Chronology;
-HSPLjava/time/format/DateTimeFormatter;->getDecimalStyle()Ljava/time/format/DecimalStyle;
-HSPLjava/time/format/DateTimeFormatter;->getZone()Ljava/time/ZoneId;
-HSPLjava/time/format/DateTimeFormatter;->parse(Ljava/lang/CharSequence;Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;
-HSPLjava/time/format/DateTimeFormatter;->parseResolved0(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Ljava/time/temporal/TemporalAccessor;
-HSPLjava/time/format/DateTimeFormatter;->parseUnresolved0(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Ljava/time/format/DateTimeParseContext;
-HSPLjava/time/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;-><init>(C)V
-HSPLjava/time/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-HSPLjava/time/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-HSPLjava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;-><init>(Ljava/util/List;Z)V
-HSPLjava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;-><init>([Ljava/time/format/DateTimeFormatterBuilder$DateTimePrinterParser;Z)V
-HSPLjava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-HSPLjava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-HSPLjava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;-><init>(Ljava/time/temporal/TemporalField;IIZ)V
-HSPLjava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;->convertFromFraction(Ljava/math/BigDecimal;)J
-HSPLjava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;->convertToFraction(J)Ljava/math/BigDecimal;
-HSPLjava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-HSPLjava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-HSPLjava/time/format/DateTimeFormatterBuilder$InstantPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-HSPLjava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;-><init>(Ljava/time/temporal/TemporalField;IILjava/time/format/SignStyle;)V
-HSPLjava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-HSPLjava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->getValue(Ljava/time/format/DateTimePrintContext;J)J
-HSPLjava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-HSPLjava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->setValue(Ljava/time/format/DateTimeParseContext;JII)I
-HSPLjava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-HSPLjava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-HSPLjava/time/format/DateTimeFormatterBuilder$SettingsParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-HSPLjava/time/format/DateTimeFormatterBuilder$SettingsParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-HSPLjava/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-HSPLjava/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;->getTree(Ljava/time/format/DateTimeParseContext;)Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;
-HSPLjava/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-HSPLjava/time/format/DateTimeFormatterBuilder;-><init>()V
-HSPLjava/time/format/DateTimeFormatterBuilder;->appendFraction(Ljava/time/temporal/TemporalField;IIZ)Ljava/time/format/DateTimeFormatterBuilder;
-HSPLjava/time/format/DateTimeFormatterBuilder;->appendInternal(Ljava/time/format/DateTimeFormatterBuilder$DateTimePrinterParser;)I
-HSPLjava/time/format/DateTimeFormatterBuilder;->appendLiteral(C)Ljava/time/format/DateTimeFormatterBuilder;
-HSPLjava/time/format/DateTimeFormatterBuilder;->appendValue(Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;)Ljava/time/format/DateTimeFormatterBuilder;
-HSPLjava/time/format/DateTimeFormatterBuilder;->appendValue(Ljava/time/temporal/TemporalField;I)Ljava/time/format/DateTimeFormatterBuilder;
-HSPLjava/time/format/DateTimeFormatterBuilder;->optionalEnd()Ljava/time/format/DateTimeFormatterBuilder;
-HSPLjava/time/format/DateTimeFormatterBuilder;->toFormatter()Ljava/time/format/DateTimeFormatter;
-HSPLjava/time/format/DateTimeFormatterBuilder;->toFormatter(Ljava/util/Locale;)Ljava/time/format/DateTimeFormatter;
-HSPLjava/time/format/DateTimeFormatterBuilder;->toFormatter(Ljava/util/Locale;Ljava/time/format/ResolverStyle;Ljava/time/chrono/Chronology;)Ljava/time/format/DateTimeFormatter;
-HSPLjava/time/format/DateTimeParseContext;-><init>(Ljava/time/format/DateTimeFormatter;)V
-HSPLjava/time/format/DateTimeParseContext;->charEquals(CC)Z
-HSPLjava/time/format/DateTimeParseContext;->currentParsed()Ljava/time/format/Parsed;
-HSPLjava/time/format/DateTimeParseContext;->endOptional(Z)V
-HSPLjava/time/format/DateTimeParseContext;->getDecimalStyle()Ljava/time/format/DecimalStyle;
-HSPLjava/time/format/DateTimeParseContext;->getEffectiveChronology()Ljava/time/chrono/Chronology;
-HSPLjava/time/format/DateTimeParseContext;->isCaseSensitive()Z
-HSPLjava/time/format/DateTimeParseContext;->isStrict()Z
-HSPLjava/time/format/DateTimeParseContext;->setCaseSensitive(Z)V
-HSPLjava/time/format/DateTimeParseContext;->setParsed(Ljava/time/ZoneId;)V
-HSPLjava/time/format/DateTimeParseContext;->setParsedField(Ljava/time/temporal/TemporalField;JII)I
-HSPLjava/time/format/DateTimeParseContext;->startOptional()V
-HSPLjava/time/format/DateTimeParseContext;->subSequenceEquals(Ljava/lang/CharSequence;ILjava/lang/CharSequence;II)Z
-HSPLjava/time/format/DateTimeParseContext;->toResolved(Ljava/time/format/ResolverStyle;Ljava/util/Set;)Ljava/time/temporal/TemporalAccessor;
-HSPLjava/time/format/DateTimePrintContext;-><init>(Ljava/time/temporal/TemporalAccessor;Ljava/time/format/DateTimeFormatter;)V
-HSPLjava/time/format/DateTimePrintContext;->adjust(Ljava/time/temporal/TemporalAccessor;Ljava/time/format/DateTimeFormatter;)Ljava/time/temporal/TemporalAccessor;
-HSPLjava/time/format/DateTimePrintContext;->getDecimalStyle()Ljava/time/format/DecimalStyle;
-HSPLjava/time/format/DateTimePrintContext;->getValue(Ljava/time/temporal/TemporalField;)Ljava/lang/Long;
-HSPLjava/time/format/DateTimeTextProvider$LocaleStore;-><init>(Ljava/util/Map;)V
-HSPLjava/time/format/DecimalStyle;->convertNumberToI18N(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/time/format/DecimalStyle;->convertToDigit(C)I
-HSPLjava/time/format/DecimalStyle;->getDecimalSeparator()C
-HSPLjava/time/format/DecimalStyle;->getNegativeSign()C
-HSPLjava/time/format/DecimalStyle;->getPositiveSign()C
-HSPLjava/time/format/DecimalStyle;->getZeroDigit()C
-HSPLjava/time/format/Parsed;-><init>()V
-HSPLjava/time/format/Parsed;->copy()Ljava/time/format/Parsed;
-HSPLjava/time/format/Parsed;->crossCheck()V
-HSPLjava/time/format/Parsed;->crossCheck(Ljava/time/temporal/TemporalAccessor;)V
-HSPLjava/time/format/Parsed;->getLong(Ljava/time/temporal/TemporalField;)J
-HSPLjava/time/format/Parsed;->isSupported(Ljava/time/temporal/TemporalField;)Z
-HSPLjava/time/format/Parsed;->query(Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;
-HSPLjava/time/format/Parsed;->resolve(Ljava/time/format/ResolverStyle;Ljava/util/Set;)Ljava/time/temporal/TemporalAccessor;
-HSPLjava/time/format/Parsed;->resolveDateFields()V
-HSPLjava/time/format/Parsed;->resolveFields()V
-HSPLjava/time/format/Parsed;->resolveFractional()V
-HSPLjava/time/format/Parsed;->resolveInstant()V
-HSPLjava/time/format/Parsed;->resolveInstantFields()V
-HSPLjava/time/format/Parsed;->resolvePeriod()V
-HSPLjava/time/format/Parsed;->resolveTime(JJJJ)V
-HSPLjava/time/format/Parsed;->resolveTimeFields()V
-HSPLjava/time/format/Parsed;->resolveTimeLenient()V
-HSPLjava/time/format/Parsed;->updateCheckConflict(Ljava/time/LocalTime;Ljava/time/Period;)V
-HSPLjava/time/format/Parsed;->updateCheckConflict(Ljava/time/chrono/ChronoLocalDate;)V
-HSPLjava/time/format/SignStyle;->values()[Ljava/time/format/SignStyle;
-HSPLjava/time/temporal/ChronoField;->checkValidIntValue(J)I
-HSPLjava/time/temporal/ChronoField;->checkValidValue(J)J
-HSPLjava/time/temporal/ChronoField;->isDateBased()Z
-HSPLjava/time/temporal/ChronoField;->isTimeBased()Z
-HSPLjava/time/temporal/ChronoField;->range()Ljava/time/temporal/ValueRange;
-HSPLjava/time/temporal/ChronoField;->values()[Ljava/time/temporal/ChronoField;
-HSPLjava/time/temporal/ChronoUnit;->getDuration()Ljava/time/Duration;
-HSPLjava/time/temporal/ChronoUnit;->values()[Ljava/time/temporal/ChronoUnit;
-HSPLjava/time/temporal/TemporalAccessor;->get(Ljava/time/temporal/TemporalField;)I+]Ljava/time/temporal/TemporalAccessor;Ljava/time/format/Parsed;
-HSPLjava/time/temporal/TemporalAccessor;->range(Ljava/time/temporal/TemporalField;)Ljava/time/temporal/ValueRange;+]Ljava/time/temporal/TemporalAccessor;Ljava/time/format/Parsed;
-HSPLjava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda11;-><init>(I)V
-HSPLjava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda11;->adjustInto(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;
-HSPLjava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda1;->adjustInto(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;
-HSPLjava/time/temporal/TemporalAdjusters;->lambda$nextOrSame$10(ILjava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;
-HSPLjava/time/temporal/TemporalAdjusters;->lambda$previousOrSame$12(ILjava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;
-HSPLjava/time/temporal/TemporalAdjusters;->nextOrSame(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;
-HSPLjava/time/temporal/TemporalAdjusters;->previousOrSame(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;
-HSPLjava/time/temporal/TemporalField;->resolve(Ljava/util/Map;Ljava/time/temporal/TemporalAccessor;Ljava/time/format/ResolverStyle;)Ljava/time/temporal/TemporalAccessor;
-HSPLjava/time/temporal/TemporalQueries;->chronology()Ljava/time/temporal/TemporalQuery;
-HSPLjava/time/temporal/TemporalQueries;->localDate()Ljava/time/temporal/TemporalQuery;
-HSPLjava/time/temporal/TemporalQueries;->localTime()Ljava/time/temporal/TemporalQuery;
-HSPLjava/time/temporal/TemporalQueries;->offset()Ljava/time/temporal/TemporalQuery;
-HSPLjava/time/temporal/TemporalQueries;->precision()Ljava/time/temporal/TemporalQuery;
-HSPLjava/time/temporal/TemporalQueries;->zone()Ljava/time/temporal/TemporalQuery;
-HSPLjava/time/temporal/TemporalQueries;->zoneId()Ljava/time/temporal/TemporalQuery;
-HSPLjava/time/temporal/ValueRange;->checkValidIntValue(JLjava/time/temporal/TemporalField;)I
-HSPLjava/time/temporal/ValueRange;->checkValidValue(JLjava/time/temporal/TemporalField;)J
-HSPLjava/time/temporal/ValueRange;->getMaximum()J
-HSPLjava/time/temporal/ValueRange;->getMinimum()J
-HSPLjava/time/temporal/ValueRange;->isFixed()Z
-HSPLjava/time/temporal/ValueRange;->isIntValue()Z
-HSPLjava/time/temporal/ValueRange;->isValidIntValue(J)Z
-HSPLjava/time/temporal/ValueRange;->isValidValue(J)Z
-HSPLjava/time/zone/IcuZoneRulesProvider$ZoneRulesCache;->create(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/time/zone/IcuZoneRulesProvider$ZoneRulesCache;->create(Ljava/lang/String;)Ljava/time/zone/ZoneRules;
-HSPLjava/time/zone/IcuZoneRulesProvider;->generateZoneRules(Ljava/lang/String;)Ljava/time/zone/ZoneRules;
-HSPLjava/time/zone/IcuZoneRulesProvider;->provideRules(Ljava/lang/String;Z)Ljava/time/zone/ZoneRules;
-HSPLjava/time/zone/ZoneOffsetTransition;-><init>(JLjava/time/ZoneOffset;Ljava/time/ZoneOffset;)V
-HSPLjava/time/zone/ZoneOffsetTransition;-><init>(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)V
-HSPLjava/time/zone/ZoneOffsetTransition;->getDateTimeAfter()Ljava/time/LocalDateTime;
-HSPLjava/time/zone/ZoneOffsetTransition;->getDateTimeBefore()Ljava/time/LocalDateTime;
-HSPLjava/time/zone/ZoneOffsetTransition;->getDurationSeconds()I
-HSPLjava/time/zone/ZoneOffsetTransition;->getOffsetAfter()Ljava/time/ZoneOffset;
-HSPLjava/time/zone/ZoneOffsetTransition;->getOffsetBefore()Ljava/time/ZoneOffset;
-HSPLjava/time/zone/ZoneOffsetTransition;->isGap()Z
-HSPLjava/time/zone/ZoneOffsetTransition;->of(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)Ljava/time/zone/ZoneOffsetTransition;
-HSPLjava/time/zone/ZoneOffsetTransition;->toEpochSecond()J
-HSPLjava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;->createDateTime(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)Ljava/time/LocalDateTime;
-HSPLjava/time/zone/ZoneOffsetTransitionRule;-><init>(Ljava/time/Month;ILjava/time/DayOfWeek;Ljava/time/LocalTime;ZLjava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)V
-HSPLjava/time/zone/ZoneOffsetTransitionRule;->createTransition(I)Ljava/time/zone/ZoneOffsetTransition;
-HSPLjava/time/zone/ZoneOffsetTransitionRule;->getOffsetAfter()Ljava/time/ZoneOffset;
-HSPLjava/time/zone/ZoneOffsetTransitionRule;->of(Ljava/time/Month;ILjava/time/DayOfWeek;Ljava/time/LocalTime;ZLjava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)Ljava/time/zone/ZoneOffsetTransitionRule;
-HSPLjava/time/zone/ZoneRules;-><init>(Ljava/time/ZoneOffset;)V
-HSPLjava/time/zone/ZoneRules;-><init>(Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V
-HSPLjava/time/zone/ZoneRules;->findOffsetInfo(Ljava/time/LocalDateTime;Ljava/time/zone/ZoneOffsetTransition;)Ljava/lang/Object;
-HSPLjava/time/zone/ZoneRules;->findTransitionArray(I)[Ljava/time/zone/ZoneOffsetTransition;
-HSPLjava/time/zone/ZoneRules;->findYear(JLjava/time/ZoneOffset;)I
-HSPLjava/time/zone/ZoneRules;->getOffset(Ljava/time/Instant;)Ljava/time/ZoneOffset;
-HSPLjava/time/zone/ZoneRules;->getOffsetInfo(Ljava/time/LocalDateTime;)Ljava/lang/Object;
-HSPLjava/time/zone/ZoneRules;->getValidOffsets(Ljava/time/LocalDateTime;)Ljava/util/List;
-HSPLjava/time/zone/ZoneRules;->of(Ljava/time/ZoneOffset;)Ljava/time/zone/ZoneRules;
-HSPLjava/time/zone/ZoneRules;->of(Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;Ljava/util/List;Ljava/util/List;Ljava/util/List;)Ljava/time/zone/ZoneRules;
-HSPLjava/time/zone/ZoneRulesProvider;->getAvailableZoneIds()Ljava/util/Set;
-HSPLjava/time/zone/ZoneRulesProvider;->getProvider(Ljava/lang/String;)Ljava/time/zone/ZoneRulesProvider;
-HSPLjava/time/zone/ZoneRulesProvider;->getRules(Ljava/lang/String;Z)Ljava/time/zone/ZoneRules;
-HSPLjava/util/AbstractCollection;-><init>()V
-HSPLjava/util/AbstractCollection;->addAll(Ljava/util/Collection;)Z
-HSPLjava/util/AbstractCollection;->clear()V
-HSPLjava/util/AbstractCollection;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/AbstractCollection;->containsAll(Ljava/util/Collection;)Z
-HSPLjava/util/AbstractCollection;->isEmpty()Z
-HSPLjava/util/AbstractCollection;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/AbstractCollection;->removeAll(Ljava/util/Collection;)Z
-HSPLjava/util/AbstractCollection;->retainAll(Ljava/util/Collection;)Z
-HSPLjava/util/AbstractCollection;->toArray()[Ljava/lang/Object;
-HSPLjava/util/AbstractCollection;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/AbstractCollection;->toString()Ljava/lang/String;
-HSPLjava/util/AbstractList$Itr;-><init>(Ljava/util/AbstractList;)V
-HSPLjava/util/AbstractList$Itr;-><init>(Ljava/util/AbstractList;Ljava/util/AbstractList$Itr-IA;)V
-HSPLjava/util/AbstractList$Itr;->checkForComodification()V
-HSPLjava/util/AbstractList$Itr;->hasNext()Z
-HSPLjava/util/AbstractList$Itr;->next()Ljava/lang/Object;
-HSPLjava/util/AbstractList$ListItr;-><init>(Ljava/util/AbstractList;I)V
-HSPLjava/util/AbstractList$ListItr;->hasPrevious()Z
-HSPLjava/util/AbstractList$ListItr;->nextIndex()I
-HSPLjava/util/AbstractList$ListItr;->previous()Ljava/lang/Object;
-HSPLjava/util/AbstractList$ListItr;->previousIndex()I
-HSPLjava/util/AbstractList$RandomAccessSpliterator;-><init>(Ljava/util/List;)V
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->characteristics()I
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->checkAbstractListModCount(Ljava/util/AbstractList;I)V
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->estimateSize()J
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->get(Ljava/util/List;I)Ljava/lang/Object;
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->getFence()I
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-HSPLjava/util/AbstractList$RandomAccessSubList;-><init>(Ljava/util/AbstractList;II)V
-HSPLjava/util/AbstractList$SubList$1;-><init>(Ljava/util/AbstractList$SubList;I)V
-HSPLjava/util/AbstractList$SubList$1;->hasNext()Z
-HSPLjava/util/AbstractList$SubList$1;->next()Ljava/lang/Object;
-HSPLjava/util/AbstractList$SubList$1;->nextIndex()I
-HSPLjava/util/AbstractList$SubList;-><init>(Ljava/util/AbstractList;II)V
-HSPLjava/util/AbstractList$SubList;->checkForComodification()V
-HSPLjava/util/AbstractList$SubList;->get(I)Ljava/lang/Object;
-HSPLjava/util/AbstractList$SubList;->iterator()Ljava/util/Iterator;
-HSPLjava/util/AbstractList$SubList;->listIterator(I)Ljava/util/ListIterator;
-HSPLjava/util/AbstractList$SubList;->rangeCheckForAdd(I)V
-HSPLjava/util/AbstractList$SubList;->size()I
-HSPLjava/util/AbstractList;-><init>()V
-HSPLjava/util/AbstractList;->add(Ljava/lang/Object;)Z
-HSPLjava/util/AbstractList;->clear()V
-HSPLjava/util/AbstractList;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/AbstractList;->hashCode()I
-HSPLjava/util/AbstractList;->indexOf(Ljava/lang/Object;)I
-HSPLjava/util/AbstractList;->iterator()Ljava/util/Iterator;
-HSPLjava/util/AbstractList;->listIterator()Ljava/util/ListIterator;
-HSPLjava/util/AbstractList;->listIterator(I)Ljava/util/ListIterator;
-HSPLjava/util/AbstractList;->rangeCheckForAdd(I)V
-HSPLjava/util/AbstractList;->subList(II)Ljava/util/List;
-HSPLjava/util/AbstractList;->subListRangeCheck(III)V
-HSPLjava/util/AbstractMap$2$1;-><init>(Ljava/util/AbstractMap$2;)V
-HSPLjava/util/AbstractMap$2$1;->hasNext()Z
-HSPLjava/util/AbstractMap$2$1;->next()Ljava/lang/Object;
-HSPLjava/util/AbstractMap$2;-><init>(Ljava/util/AbstractMap;)V
-HSPLjava/util/AbstractMap$2;->iterator()Ljava/util/Iterator;
-HSPLjava/util/AbstractMap$SimpleEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLjava/util/AbstractMap$SimpleEntry;->getKey()Ljava/lang/Object;
-HSPLjava/util/AbstractMap$SimpleEntry;->getValue()Ljava/lang/Object;
-HSPLjava/util/AbstractMap$SimpleImmutableEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLjava/util/AbstractMap$SimpleImmutableEntry;-><init>(Ljava/util/Map$Entry;)V
-HSPLjava/util/AbstractMap$SimpleImmutableEntry;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/AbstractMap$SimpleImmutableEntry;->getKey()Ljava/lang/Object;
-HSPLjava/util/AbstractMap$SimpleImmutableEntry;->getValue()Ljava/lang/Object;
-HSPLjava/util/AbstractMap$SimpleImmutableEntry;->hashCode()I
-HSPLjava/util/AbstractMap;-><init>()V
-HSPLjava/util/AbstractMap;->clear()V
-HSPLjava/util/AbstractMap;->clone()Ljava/lang/Object;
-HSPLjava/util/AbstractMap;->eq(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/AbstractMap;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/AbstractMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/AbstractMap;->hashCode()I
-HSPLjava/util/AbstractMap;->isEmpty()Z
-HSPLjava/util/AbstractMap;->putAll(Ljava/util/Map;)V
-HSPLjava/util/AbstractMap;->size()I
-HSPLjava/util/AbstractMap;->toString()Ljava/lang/String;
-HSPLjava/util/AbstractMap;->values()Ljava/util/Collection;
-HSPLjava/util/AbstractQueue;-><init>()V
-HSPLjava/util/AbstractQueue;->add(Ljava/lang/Object;)Z
-HSPLjava/util/AbstractQueue;->addAll(Ljava/util/Collection;)Z
-HSPLjava/util/AbstractQueue;->clear()V
-HSPLjava/util/AbstractQueue;->remove()Ljava/lang/Object;
-HSPLjava/util/AbstractSequentialList;-><init>()V
-HSPLjava/util/AbstractSequentialList;->iterator()Ljava/util/Iterator;
-HSPLjava/util/AbstractSet;-><init>()V
-HSPLjava/util/AbstractSet;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/AbstractSet;->hashCode()I
-HSPLjava/util/AbstractSet;->removeAll(Ljava/util/Collection;)Z
-HSPLjava/util/ArrayDeque$$ExternalSyntheticLambda1;-><init>(Ljava/util/ArrayDeque;)V
-HSPLjava/util/ArrayDeque$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V
-HSPLjava/util/ArrayDeque$DeqIterator;-><init>(Ljava/util/ArrayDeque;)V
-HSPLjava/util/ArrayDeque$DeqIterator;->hasNext()Z
-HSPLjava/util/ArrayDeque$DeqIterator;->next()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque$DeqIterator;->postDelete(Z)V
-HSPLjava/util/ArrayDeque$DeqIterator;->remove()V
-HSPLjava/util/ArrayDeque$DescendingIterator;-><init>(Ljava/util/ArrayDeque;)V
-HSPLjava/util/ArrayDeque$DescendingIterator;->next()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;-><init>()V
-HSPLjava/util/ArrayDeque;-><init>(I)V
-HSPLjava/util/ArrayDeque;-><init>(Ljava/util/Collection;)V
-HSPLjava/util/ArrayDeque;->add(Ljava/lang/Object;)Z
-HSPLjava/util/ArrayDeque;->addAll(Ljava/util/Collection;)Z
-HSPLjava/util/ArrayDeque;->addFirst(Ljava/lang/Object;)V
-HSPLjava/util/ArrayDeque;->addLast(Ljava/lang/Object;)V
-HSPLjava/util/ArrayDeque;->checkInvariants()V
-HSPLjava/util/ArrayDeque;->circularClear([Ljava/lang/Object;II)V
-HSPLjava/util/ArrayDeque;->clear()V
-HSPLjava/util/ArrayDeque;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/ArrayDeque;->copyElements(Ljava/util/Collection;)V
-HSPLjava/util/ArrayDeque;->dec(II)I
-HSPLjava/util/ArrayDeque;->delete(I)Z
-HSPLjava/util/ArrayDeque;->descendingIterator()Ljava/util/Iterator;
-HSPLjava/util/ArrayDeque;->elementAt([Ljava/lang/Object;I)Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->forEach(Ljava/util/function/Consumer;)V
-HSPLjava/util/ArrayDeque;->getFirst()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->getLast()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->grow(I)V
-HSPLjava/util/ArrayDeque;->inc(II)I
-HSPLjava/util/ArrayDeque;->isEmpty()Z
-HSPLjava/util/ArrayDeque;->iterator()Ljava/util/Iterator;
-HSPLjava/util/ArrayDeque;->offer(Ljava/lang/Object;)Z
-HSPLjava/util/ArrayDeque;->offerLast(Ljava/lang/Object;)Z
-HSPLjava/util/ArrayDeque;->peek()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->peekFirst()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->peekLast()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->poll()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->pollFirst()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->pollLast()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->pop()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->push(Ljava/lang/Object;)V
-HSPLjava/util/ArrayDeque;->remove()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/ArrayDeque;->removeFirst()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->removeFirstOccurrence(Ljava/lang/Object;)Z
-HSPLjava/util/ArrayDeque;->removeLast()Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->size()I
-HSPLjava/util/ArrayDeque;->sub(III)I
-HSPLjava/util/ArrayDeque;->toArray()[Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->toArray(Ljava/lang/Class;)[Ljava/lang/Object;
-HSPLjava/util/ArrayDeque;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/ArrayList$ArrayListSpliterator;-><init>(Ljava/util/ArrayList;III)V
-HSPLjava/util/ArrayList$ArrayListSpliterator;->characteristics()I
-HSPLjava/util/ArrayList$ArrayListSpliterator;->estimateSize()J
-HSPLjava/util/ArrayList$ArrayListSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-HSPLjava/util/ArrayList$ArrayListSpliterator;->getFence()I
-HSPLjava/util/ArrayList$ArrayListSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-HSPLjava/util/ArrayList$Itr;-><init>(Ljava/util/ArrayList;)V
-HSPLjava/util/ArrayList$Itr;->checkForComodification()V
-HSPLjava/util/ArrayList$Itr;->hasNext()Z
-HSPLjava/util/ArrayList$Itr;->next()Ljava/lang/Object;
-HSPLjava/util/ArrayList$Itr;->remove()V
-HSPLjava/util/ArrayList$ListItr;-><init>(Ljava/util/ArrayList;I)V
-HSPLjava/util/ArrayList$ListItr;->hasPrevious()Z
-HSPLjava/util/ArrayList$ListItr;->nextIndex()I
-HSPLjava/util/ArrayList$ListItr;->previous()Ljava/lang/Object;
-HSPLjava/util/ArrayList$ListItr;->set(Ljava/lang/Object;)V
-HSPLjava/util/ArrayList$SubList$1;-><init>(Ljava/util/ArrayList$SubList;I)V
-HSPLjava/util/ArrayList$SubList$1;->checkForComodification()V
-HSPLjava/util/ArrayList$SubList$1;->hasNext()Z
-HSPLjava/util/ArrayList$SubList$1;->next()Ljava/lang/Object;
-HSPLjava/util/ArrayList$SubList;->-$$Nest$fgetoffset(Ljava/util/ArrayList$SubList;)I
-HSPLjava/util/ArrayList$SubList;->-$$Nest$fgetroot(Ljava/util/ArrayList$SubList;)Ljava/util/ArrayList;
-HSPLjava/util/ArrayList$SubList;->-$$Nest$fgetsize(Ljava/util/ArrayList$SubList;)I
-HSPLjava/util/ArrayList$SubList;-><init>(Ljava/util/ArrayList;II)V
-HSPLjava/util/ArrayList$SubList;->checkForComodification()V
-HSPLjava/util/ArrayList$SubList;->get(I)Ljava/lang/Object;
-HSPLjava/util/ArrayList$SubList;->iterator()Ljava/util/Iterator;
-HSPLjava/util/ArrayList$SubList;->listIterator(I)Ljava/util/ListIterator;
-HSPLjava/util/ArrayList$SubList;->rangeCheckForAdd(I)V
-HSPLjava/util/ArrayList$SubList;->removeRange(II)V
-HSPLjava/util/ArrayList$SubList;->size()I
-HSPLjava/util/ArrayList$SubList;->subList(II)Ljava/util/List;
-HSPLjava/util/ArrayList$SubList;->toArray()[Ljava/lang/Object;
-HSPLjava/util/ArrayList$SubList;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/ArrayList;->-$$Nest$fgetsize(Ljava/util/ArrayList;)I
-HSPLjava/util/ArrayList;-><init>()V
-HSPLjava/util/ArrayList;-><init>(I)V
-HSPLjava/util/ArrayList;-><init>(Ljava/util/Collection;)V
-HSPLjava/util/ArrayList;->add(ILjava/lang/Object;)V
-HSPLjava/util/ArrayList;->add(Ljava/lang/Object;)Z
-HSPLjava/util/ArrayList;->add(Ljava/lang/Object;[Ljava/lang/Object;I)V
-HSPLjava/util/ArrayList;->addAll(ILjava/util/Collection;)Z
-HSPLjava/util/ArrayList;->addAll(Ljava/util/Collection;)Z
-HSPLjava/util/ArrayList;->batchRemove(Ljava/util/Collection;ZII)Z
-HSPLjava/util/ArrayList;->checkForComodification(I)V
-HSPLjava/util/ArrayList;->clear()V
-HSPLjava/util/ArrayList;->clone()Ljava/lang/Object;
-HSPLjava/util/ArrayList;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/ArrayList;->elementAt([Ljava/lang/Object;I)Ljava/lang/Object;
-HSPLjava/util/ArrayList;->elementData(I)Ljava/lang/Object;
-HSPLjava/util/ArrayList;->ensureCapacity(I)V
-HSPLjava/util/ArrayList;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/ArrayList;->equalsArrayList(Ljava/util/ArrayList;)Z
-HSPLjava/util/ArrayList;->equalsRange(Ljava/util/List;II)Z
-HSPLjava/util/ArrayList;->fastRemove([Ljava/lang/Object;I)V
-HSPLjava/util/ArrayList;->forEach(Ljava/util/function/Consumer;)V
-HSPLjava/util/ArrayList;->get(I)Ljava/lang/Object;
-HSPLjava/util/ArrayList;->grow()[Ljava/lang/Object;
-HSPLjava/util/ArrayList;->grow(I)[Ljava/lang/Object;
-HSPLjava/util/ArrayList;->hashCode()I
-HSPLjava/util/ArrayList;->hashCodeRange(II)I
-HSPLjava/util/ArrayList;->indexOf(Ljava/lang/Object;)I
-HSPLjava/util/ArrayList;->indexOfRange(Ljava/lang/Object;II)I
-HSPLjava/util/ArrayList;->isEmpty()Z
-HSPLjava/util/ArrayList;->iterator()Ljava/util/Iterator;
-HSPLjava/util/ArrayList;->lastIndexOf(Ljava/lang/Object;)I
-HSPLjava/util/ArrayList;->listIterator()Ljava/util/ListIterator;
-HSPLjava/util/ArrayList;->listIterator(I)Ljava/util/ListIterator;
-HSPLjava/util/ArrayList;->rangeCheckForAdd(I)V
-HSPLjava/util/ArrayList;->readObject(Ljava/io/ObjectInputStream;)V
-HSPLjava/util/ArrayList;->remove(I)Ljava/lang/Object;
-HSPLjava/util/ArrayList;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/ArrayList;->removeAll(Ljava/util/Collection;)Z
-HSPLjava/util/ArrayList;->removeIf(Ljava/util/function/Predicate;)Z
-HSPLjava/util/ArrayList;->removeIf(Ljava/util/function/Predicate;II)Z
-HSPLjava/util/ArrayList;->removeRange(II)V
-HSPLjava/util/ArrayList;->retainAll(Ljava/util/Collection;)Z
-HSPLjava/util/ArrayList;->set(ILjava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/ArrayList;->shiftTailOverGap([Ljava/lang/Object;II)V
-HSPLjava/util/ArrayList;->size()I
-HSPLjava/util/ArrayList;->sort(Ljava/util/Comparator;)V
-HSPLjava/util/ArrayList;->spliterator()Ljava/util/Spliterator;
-HSPLjava/util/ArrayList;->subList(II)Ljava/util/List;
-HSPLjava/util/ArrayList;->toArray()[Ljava/lang/Object;
-HSPLjava/util/ArrayList;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/ArrayList;->trimToSize()V
-HSPLjava/util/ArrayList;->writeObject(Ljava/io/ObjectOutputStream;)V
-HSPLjava/util/Arrays$ArrayItr;-><init>([Ljava/lang/Object;)V
-HSPLjava/util/Arrays$ArrayItr;->hasNext()Z
-HSPLjava/util/Arrays$ArrayItr;->next()Ljava/lang/Object;
-HSPLjava/util/Arrays$ArrayList;-><init>([Ljava/lang/Object;)V
-HSPLjava/util/Arrays$ArrayList;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/Arrays$ArrayList;->forEach(Ljava/util/function/Consumer;)V
-HSPLjava/util/Arrays$ArrayList;->get(I)Ljava/lang/Object;
-HSPLjava/util/Arrays$ArrayList;->indexOf(Ljava/lang/Object;)I
-HSPLjava/util/Arrays$ArrayList;->iterator()Ljava/util/Iterator;
-HSPLjava/util/Arrays$ArrayList;->set(ILjava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Arrays$ArrayList;->size()I
-HSPLjava/util/Arrays$ArrayList;->sort(Ljava/util/Comparator;)V
-HSPLjava/util/Arrays$ArrayList;->spliterator()Ljava/util/Spliterator;
-HSPLjava/util/Arrays$ArrayList;->toArray()[Ljava/lang/Object;
-HSPLjava/util/Arrays$ArrayList;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/Arrays$ArrayList;->toArrayPreserveComponentType()[Ljava/lang/Object;+][Ljava/lang/Object;missing_types
-HSPLjava/util/Arrays;->asList([Ljava/lang/Object;)Ljava/util/List;
-HSPLjava/util/Arrays;->binarySearch([CC)I
-HSPLjava/util/Arrays;->binarySearch([II)I
-HSPLjava/util/Arrays;->binarySearch([IIII)I
-HSPLjava/util/Arrays;->binarySearch([JIIJ)I
-HSPLjava/util/Arrays;->binarySearch([JJ)I
-HSPLjava/util/Arrays;->binarySearch([Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/util/Arrays;->binarySearch([Ljava/lang/Object;Ljava/lang/Object;Ljava/util/Comparator;)I
-HSPLjava/util/Arrays;->binarySearch0([CIIC)I
-HSPLjava/util/Arrays;->binarySearch0([IIII)I
-HSPLjava/util/Arrays;->binarySearch0([JIIJ)I
-HSPLjava/util/Arrays;->binarySearch0([Ljava/lang/Object;IILjava/lang/Object;)I
-HSPLjava/util/Arrays;->binarySearch0([Ljava/lang/Object;IILjava/lang/Object;Ljava/util/Comparator;)I
-HSPLjava/util/Arrays;->copyOf([BI)[B
-HSPLjava/util/Arrays;->copyOf([CI)[C
-HSPLjava/util/Arrays;->copyOf([DI)[D
-HSPLjava/util/Arrays;->copyOf([FI)[F
-HSPLjava/util/Arrays;->copyOf([II)[I
-HSPLjava/util/Arrays;->copyOf([JI)[J
-HSPLjava/util/Arrays;->copyOf([Ljava/lang/Object;I)[Ljava/lang/Object;
-HSPLjava/util/Arrays;->copyOf([Ljava/lang/Object;ILjava/lang/Class;)[Ljava/lang/Object;
-HSPLjava/util/Arrays;->copyOf([ZI)[Z
-HSPLjava/util/Arrays;->copyOfRange([BII)[B
-HSPLjava/util/Arrays;->copyOfRange([CII)[C
-HSPLjava/util/Arrays;->copyOfRange([III)[I
-HSPLjava/util/Arrays;->copyOfRange([JII)[J
-HSPLjava/util/Arrays;->copyOfRange([Ljava/lang/Object;II)[Ljava/lang/Object;
-HSPLjava/util/Arrays;->copyOfRange([Ljava/lang/Object;IILjava/lang/Class;)[Ljava/lang/Object;
-HSPLjava/util/Arrays;->deepEquals([Ljava/lang/Object;[Ljava/lang/Object;)Z
-HSPLjava/util/Arrays;->deepEquals0(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/Arrays;->deepHashCode([Ljava/lang/Object;)I
-HSPLjava/util/Arrays;->deepToString([Ljava/lang/Object;)Ljava/lang/String;
-HSPLjava/util/Arrays;->deepToString([Ljava/lang/Object;Ljava/lang/StringBuilder;Ljava/util/Set;)V
-HSPLjava/util/Arrays;->equals([B[B)Z
-HSPLjava/util/Arrays;->equals([F[F)Z
-HSPLjava/util/Arrays;->equals([I[I)Z
-HSPLjava/util/Arrays;->equals([J[J)Z
-HSPLjava/util/Arrays;->equals([Ljava/lang/Object;[Ljava/lang/Object;)Z
-HSPLjava/util/Arrays;->fill([BB)V
-HSPLjava/util/Arrays;->fill([BIIB)V
-HSPLjava/util/Arrays;->fill([CC)V
-HSPLjava/util/Arrays;->fill([CIIC)V
-HSPLjava/util/Arrays;->fill([DD)V
-HSPLjava/util/Arrays;->fill([FF)V
-HSPLjava/util/Arrays;->fill([II)V
-HSPLjava/util/Arrays;->fill([IIII)V
-HSPLjava/util/Arrays;->fill([JIIJ)V
-HSPLjava/util/Arrays;->fill([JJ)V
-HSPLjava/util/Arrays;->fill([Ljava/lang/Object;IILjava/lang/Object;)V
-HSPLjava/util/Arrays;->fill([Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLjava/util/Arrays;->fill([SS)V
-HSPLjava/util/Arrays;->fill([ZZ)V
-HSPLjava/util/Arrays;->hashCode([B)I
-HSPLjava/util/Arrays;->hashCode([F)I
-HSPLjava/util/Arrays;->hashCode([I)I
-HSPLjava/util/Arrays;->hashCode([J)I
-HSPLjava/util/Arrays;->hashCode([Ljava/lang/Object;)I
-HSPLjava/util/Arrays;->rangeCheck(III)V
-HSPLjava/util/Arrays;->sort([C)V
-HSPLjava/util/Arrays;->sort([F)V
-HSPLjava/util/Arrays;->sort([I)V
-HSPLjava/util/Arrays;->sort([III)V
-HSPLjava/util/Arrays;->sort([J)V
-HSPLjava/util/Arrays;->sort([Ljava/lang/Object;)V
-HSPLjava/util/Arrays;->sort([Ljava/lang/Object;II)V
-HSPLjava/util/Arrays;->sort([Ljava/lang/Object;IILjava/util/Comparator;)V
-HSPLjava/util/Arrays;->sort([Ljava/lang/Object;Ljava/util/Comparator;)V
-HSPLjava/util/Arrays;->spliterator([III)Ljava/util/Spliterator$OfInt;
-HSPLjava/util/Arrays;->spliterator([Ljava/lang/Object;II)Ljava/util/Spliterator;
-HSPLjava/util/Arrays;->stream([I)Ljava/util/stream/IntStream;
-HSPLjava/util/Arrays;->stream([III)Ljava/util/stream/IntStream;
-HSPLjava/util/Arrays;->stream([Ljava/lang/Object;)Ljava/util/stream/Stream;
-HSPLjava/util/Arrays;->stream([Ljava/lang/Object;II)Ljava/util/stream/Stream;
-HSPLjava/util/Arrays;->toString([B)Ljava/lang/String;
-HSPLjava/util/Arrays;->toString([F)Ljava/lang/String;
-HSPLjava/util/Arrays;->toString([I)Ljava/lang/String;
-HSPLjava/util/Arrays;->toString([J)Ljava/lang/String;
-HSPLjava/util/Arrays;->toString([Ljava/lang/Object;)Ljava/lang/String;
-HSPLjava/util/Base64$Decoder;->decode(Ljava/lang/String;)[B
-HSPLjava/util/Base64$Decoder;->decode([B)[B
-HSPLjava/util/Base64$Decoder;->decode0([BII[B)I
-HSPLjava/util/Base64;->getDecoder()Ljava/util/Base64$Decoder;
-HSPLjava/util/Base64;->getEncoder()Ljava/util/Base64$Encoder;
-HSPLjava/util/Base64;->getMimeDecoder()Ljava/util/Base64$Decoder;
-HSPLjava/util/BitSet;-><init>()V
-HSPLjava/util/BitSet;-><init>(I)V
-HSPLjava/util/BitSet;-><init>([J)V
-HSPLjava/util/BitSet;->andNot(Ljava/util/BitSet;)V
-HSPLjava/util/BitSet;->cardinality()I
-HSPLjava/util/BitSet;->checkInvariants()V
-HSPLjava/util/BitSet;->checkRange(II)V
-HSPLjava/util/BitSet;->clear()V
-HSPLjava/util/BitSet;->clear(I)V
-HSPLjava/util/BitSet;->clone()Ljava/lang/Object;
-HSPLjava/util/BitSet;->ensureCapacity(I)V
-HSPLjava/util/BitSet;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/BitSet;->expandTo(I)V
-HSPLjava/util/BitSet;->flip(II)V
-HSPLjava/util/BitSet;->get(I)Z
-HSPLjava/util/BitSet;->initWords(I)V
-HSPLjava/util/BitSet;->isEmpty()Z
-HSPLjava/util/BitSet;->length()I
-HSPLjava/util/BitSet;->nextClearBit(I)I
-HSPLjava/util/BitSet;->nextSetBit(I)I
-HSPLjava/util/BitSet;->or(Ljava/util/BitSet;)V
-HSPLjava/util/BitSet;->recalculateWordsInUse()V
-HSPLjava/util/BitSet;->set(I)V
-HSPLjava/util/BitSet;->set(II)V
-HSPLjava/util/BitSet;->set(IIZ)V
-HSPLjava/util/BitSet;->set(IZ)V
-HSPLjava/util/BitSet;->size()I
-HSPLjava/util/BitSet;->toString()Ljava/lang/String;
-HSPLjava/util/BitSet;->trimToSize()V
-HSPLjava/util/BitSet;->valueOf(Ljava/nio/ByteBuffer;)Ljava/util/BitSet;
-HSPLjava/util/BitSet;->valueOf([J)Ljava/util/BitSet;
-HSPLjava/util/BitSet;->wordIndex(I)I
-HSPLjava/util/Calendar;-><init>()V
-HSPLjava/util/Calendar;-><init>(Ljava/util/TimeZone;Ljava/util/Locale;)V
-HSPLjava/util/Calendar;->aggregateStamp(II)I
-HSPLjava/util/Calendar;->before(Ljava/lang/Object;)Z
-HSPLjava/util/Calendar;->clear()V
-HSPLjava/util/Calendar;->clone()Ljava/lang/Object;
-HSPLjava/util/Calendar;->compareTo(J)I
-HSPLjava/util/Calendar;->compareTo(Ljava/util/Calendar;)I
-HSPLjava/util/Calendar;->complete()V
-HSPLjava/util/Calendar;->createCalendar(Ljava/util/TimeZone;Ljava/util/Locale;)Ljava/util/Calendar;
-HSPLjava/util/Calendar;->defaultTimeZone(Ljava/util/Locale;)Ljava/util/TimeZone;
-HSPLjava/util/Calendar;->get(I)I
-HSPLjava/util/Calendar;->getFirstDayOfWeek()I
-HSPLjava/util/Calendar;->getInstance()Ljava/util/Calendar;
-HSPLjava/util/Calendar;->getInstance(Ljava/util/Locale;)Ljava/util/Calendar;
-HSPLjava/util/Calendar;->getInstance(Ljava/util/TimeZone;)Ljava/util/Calendar;
-HSPLjava/util/Calendar;->getInstance(Ljava/util/TimeZone;Ljava/util/Locale;)Ljava/util/Calendar;
-HSPLjava/util/Calendar;->getMillisOf(Ljava/util/Calendar;)J
-HSPLjava/util/Calendar;->getMinimalDaysInFirstWeek()I
-HSPLjava/util/Calendar;->getSetStateFields()I
-HSPLjava/util/Calendar;->getTime()Ljava/util/Date;
-HSPLjava/util/Calendar;->getTimeInMillis()J
-HSPLjava/util/Calendar;->getTimeZone()Ljava/util/TimeZone;
-HSPLjava/util/Calendar;->getZone()Ljava/util/TimeZone;
-HSPLjava/util/Calendar;->internalGet(I)I
-HSPLjava/util/Calendar;->internalSet(II)V
-HSPLjava/util/Calendar;->isExternallySet(I)Z
-HSPLjava/util/Calendar;->isFieldSet(II)Z
-HSPLjava/util/Calendar;->isFullyNormalized()Z
-HSPLjava/util/Calendar;->isLenient()Z
-HSPLjava/util/Calendar;->isPartiallyNormalized()Z
-HSPLjava/util/Calendar;->isSet(I)Z
-HSPLjava/util/Calendar;->selectFields()I
-HSPLjava/util/Calendar;->set(II)V
-HSPLjava/util/Calendar;->set(III)V
-HSPLjava/util/Calendar;->set(IIIIII)V
-HSPLjava/util/Calendar;->setFieldsComputed(I)V
-HSPLjava/util/Calendar;->setFieldsNormalized(I)V
-HSPLjava/util/Calendar;->setLenient(Z)V
-HSPLjava/util/Calendar;->setTime(Ljava/util/Date;)V
-HSPLjava/util/Calendar;->setTimeInMillis(J)V
-HSPLjava/util/Calendar;->setTimeZone(Ljava/util/TimeZone;)V
-HSPLjava/util/Calendar;->setWeekCountData(Ljava/util/Locale;)V
-HSPLjava/util/Calendar;->setZoneShared(Z)V
-HSPLjava/util/Calendar;->updateTime()V
-HSPLjava/util/Collection;->removeIf(Ljava/util/function/Predicate;)Z+]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;,Landroid/util/MapCollections$EntrySet;,Ljava/util/LinkedHashMap$LinkedEntrySet;,Ljava/util/LinkedList;,Landroid/util/MapCollections$KeySet;,Ljava/util/HashSet;,Ljava/util/LinkedHashMap$LinkedValues;,Ljava/util/LinkedHashSet;,Ljava/util/HashMap$EntrySet;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Landroid/util/MapCollections$MapIterator;,Ljava/util/LinkedList$ListItr;,Ljava/util/LinkedHashMap$LinkedEntryIterator;,Ljava/util/HashMap$KeyIterator;,Ljava/util/LinkedHashMap$LinkedValueIterator;,Ljava/util/LinkedHashMap$LinkedKeyIterator;,Ljava/util/HashMap$EntryIterator;
-HSPLjava/util/Collection;->spliterator()Ljava/util/Spliterator;
-HSPLjava/util/Collection;->stream()Ljava/util/stream/Stream;+]Ljava/util/Collection;megamorphic_types
-HSPLjava/util/Collections$1;-><init>(Ljava/lang/Object;)V
-HSPLjava/util/Collections$1;->hasNext()Z
-HSPLjava/util/Collections$1;->next()Ljava/lang/Object;
-HSPLjava/util/Collections$3;-><init>(Ljava/util/Collection;)V
-HSPLjava/util/Collections$3;->hasMoreElements()Z
-HSPLjava/util/Collections$3;->nextElement()Ljava/lang/Object;
-HSPLjava/util/Collections$CopiesList;-><init>(ILjava/lang/Object;)V
-HSPLjava/util/Collections$CopiesList;->get(I)Ljava/lang/Object;
-HSPLjava/util/Collections$CopiesList;->size()I
-HSPLjava/util/Collections$CopiesList;->toArray()[Ljava/lang/Object;
-HSPLjava/util/Collections$EmptyEnumeration;->hasMoreElements()Z
-HSPLjava/util/Collections$EmptyIterator;->hasNext()Z
-HSPLjava/util/Collections$EmptyList;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$EmptyList;->containsAll(Ljava/util/Collection;)Z
-HSPLjava/util/Collections$EmptyList;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$EmptyList;->isEmpty()Z
-HSPLjava/util/Collections$EmptyList;->iterator()Ljava/util/Iterator;
-HSPLjava/util/Collections$EmptyList;->listIterator()Ljava/util/ListIterator;
-HSPLjava/util/Collections$EmptyList;->readResolve()Ljava/lang/Object;
-HSPLjava/util/Collections$EmptyList;->size()I
-HSPLjava/util/Collections$EmptyList;->sort(Ljava/util/Comparator;)V
-HSPLjava/util/Collections$EmptyList;->spliterator()Ljava/util/Spliterator;
-HSPLjava/util/Collections$EmptyList;->toArray()[Ljava/lang/Object;
-HSPLjava/util/Collections$EmptyList;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/Collections$EmptyMap;->containsKey(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$EmptyMap;->entrySet()Ljava/util/Set;
-HSPLjava/util/Collections$EmptyMap;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$EmptyMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Collections$EmptyMap;->isEmpty()Z
-HSPLjava/util/Collections$EmptyMap;->keySet()Ljava/util/Set;
-HSPLjava/util/Collections$EmptyMap;->size()I
-HSPLjava/util/Collections$EmptyMap;->values()Ljava/util/Collection;
-HSPLjava/util/Collections$EmptySet;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$EmptySet;->containsAll(Ljava/util/Collection;)Z
-HSPLjava/util/Collections$EmptySet;->isEmpty()Z
-HSPLjava/util/Collections$EmptySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/Collections$EmptySet;->size()I
-HSPLjava/util/Collections$EmptySet;->toArray()[Ljava/lang/Object;
-HSPLjava/util/Collections$EmptySet;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/Collections$ReverseComparator2;-><init>(Ljava/util/Comparator;)V
-HSPLjava/util/Collections$ReverseComparator2;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/util/Collections$ReverseComparator;->compare(Ljava/lang/Comparable;Ljava/lang/Comparable;)I
-HSPLjava/util/Collections$ReverseComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/util/Collections$SetFromMap;-><init>(Ljava/util/Map;)V
-HSPLjava/util/Collections$SetFromMap;->add(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$SetFromMap;->clear()V
-HSPLjava/util/Collections$SetFromMap;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$SetFromMap;->forEach(Ljava/util/function/Consumer;)V
-HSPLjava/util/Collections$SetFromMap;->isEmpty()Z
-HSPLjava/util/Collections$SetFromMap;->iterator()Ljava/util/Iterator;
-HSPLjava/util/Collections$SetFromMap;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$SetFromMap;->size()I
-HSPLjava/util/Collections$SetFromMap;->toArray()[Ljava/lang/Object;
-HSPLjava/util/Collections$SetFromMap;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/Collections$SingletonList;-><init>(Ljava/lang/Object;)V
-HSPLjava/util/Collections$SingletonList;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$SingletonList;->get(I)Ljava/lang/Object;
-HSPLjava/util/Collections$SingletonList;->hashCode()I
-HSPLjava/util/Collections$SingletonList;->iterator()Ljava/util/Iterator;
-HSPLjava/util/Collections$SingletonList;->size()I
-HSPLjava/util/Collections$SingletonMap;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLjava/util/Collections$SingletonMap;->containsKey(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$SingletonMap;->entrySet()Ljava/util/Set;
-HSPLjava/util/Collections$SingletonMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Collections$SingletonMap;->isEmpty()Z
-HSPLjava/util/Collections$SingletonMap;->keySet()Ljava/util/Set;
-HSPLjava/util/Collections$SingletonMap;->size()I
-HSPLjava/util/Collections$SingletonMap;->values()Ljava/util/Collection;
-HSPLjava/util/Collections$SingletonSet;-><init>(Ljava/lang/Object;)V
-HSPLjava/util/Collections$SingletonSet;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$SingletonSet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/Collections$SingletonSet;->size()I
-HSPLjava/util/Collections$SynchronizedCollection;-><init>(Ljava/util/Collection;)V
-HSPLjava/util/Collections$SynchronizedCollection;-><init>(Ljava/util/Collection;Ljava/lang/Object;)V
-HSPLjava/util/Collections$SynchronizedCollection;->add(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$SynchronizedCollection;->addAll(Ljava/util/Collection;)Z
-HSPLjava/util/Collections$SynchronizedCollection;->clear()V
-HSPLjava/util/Collections$SynchronizedCollection;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$SynchronizedCollection;->forEach(Ljava/util/function/Consumer;)V
-HSPLjava/util/Collections$SynchronizedCollection;->isEmpty()Z
-HSPLjava/util/Collections$SynchronizedCollection;->iterator()Ljava/util/Iterator;
-HSPLjava/util/Collections$SynchronizedCollection;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$SynchronizedCollection;->size()I
-HSPLjava/util/Collections$SynchronizedCollection;->toArray()[Ljava/lang/Object;
-HSPLjava/util/Collections$SynchronizedCollection;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/Collections$SynchronizedCollection;->toString()Ljava/lang/String;
-HSPLjava/util/Collections$SynchronizedList;-><init>(Ljava/util/List;)V
-HSPLjava/util/Collections$SynchronizedList;->get(I)Ljava/lang/Object;
-HSPLjava/util/Collections$SynchronizedMap;-><init>(Ljava/util/Map;)V
-HSPLjava/util/Collections$SynchronizedMap;->clear()V
-HSPLjava/util/Collections$SynchronizedMap;->containsKey(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$SynchronizedMap;->entrySet()Ljava/util/Set;
-HSPLjava/util/Collections$SynchronizedMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Collections$SynchronizedMap;->getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Collections$SynchronizedMap;->isEmpty()Z
-HSPLjava/util/Collections$SynchronizedMap;->keySet()Ljava/util/Set;
-HSPLjava/util/Collections$SynchronizedMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Collections$SynchronizedMap;->putAll(Ljava/util/Map;)V
-HSPLjava/util/Collections$SynchronizedMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Collections$SynchronizedMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Collections$SynchronizedMap;->size()I
-HSPLjava/util/Collections$SynchronizedMap;->values()Ljava/util/Collection;
-HSPLjava/util/Collections$SynchronizedRandomAccessList;-><init>(Ljava/util/List;)V
-HSPLjava/util/Collections$SynchronizedSet;-><init>(Ljava/util/Set;)V
-HSPLjava/util/Collections$SynchronizedSet;-><init>(Ljava/util/Set;Ljava/lang/Object;)V
-HSPLjava/util/Collections$SynchronizedSet;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$UnmodifiableCollection$1;-><init>(Ljava/util/Collections$UnmodifiableCollection;)V
-HSPLjava/util/Collections$UnmodifiableCollection$1;->hasNext()Z
-HSPLjava/util/Collections$UnmodifiableCollection$1;->next()Ljava/lang/Object;
-HSPLjava/util/Collections$UnmodifiableCollection;-><init>(Ljava/util/Collection;)V
-HSPLjava/util/Collections$UnmodifiableCollection;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$UnmodifiableCollection;->containsAll(Ljava/util/Collection;)Z
-HSPLjava/util/Collections$UnmodifiableCollection;->forEach(Ljava/util/function/Consumer;)V
-HSPLjava/util/Collections$UnmodifiableCollection;->isEmpty()Z
-HSPLjava/util/Collections$UnmodifiableCollection;->iterator()Ljava/util/Iterator;
-HSPLjava/util/Collections$UnmodifiableCollection;->size()I
-HSPLjava/util/Collections$UnmodifiableCollection;->stream()Ljava/util/stream/Stream;
-HSPLjava/util/Collections$UnmodifiableCollection;->toArray()[Ljava/lang/Object;
-HSPLjava/util/Collections$UnmodifiableCollection;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/Collections$UnmodifiableCollection;->toString()Ljava/lang/String;
-HSPLjava/util/Collections$UnmodifiableList$1;-><init>(Ljava/util/Collections$UnmodifiableList;I)V
-HSPLjava/util/Collections$UnmodifiableList$1;->hasNext()Z
-HSPLjava/util/Collections$UnmodifiableList$1;->next()Ljava/lang/Object;
-HSPLjava/util/Collections$UnmodifiableList$1;->nextIndex()I
-HSPLjava/util/Collections$UnmodifiableList;-><init>(Ljava/util/List;)V
-HSPLjava/util/Collections$UnmodifiableList;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$UnmodifiableList;->get(I)Ljava/lang/Object;
-HSPLjava/util/Collections$UnmodifiableList;->hashCode()I
-HSPLjava/util/Collections$UnmodifiableList;->indexOf(Ljava/lang/Object;)I
-HSPLjava/util/Collections$UnmodifiableList;->listIterator()Ljava/util/ListIterator;
-HSPLjava/util/Collections$UnmodifiableList;->listIterator(I)Ljava/util/ListIterator;
-HSPLjava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1;-><init>(Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet;)V
-HSPLjava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1;->hasNext()Z
-HSPLjava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1;->next()Ljava/lang/Object;
-HSPLjava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1;->next()Ljava/util/Map$Entry;
-HSPLjava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry;-><init>(Ljava/util/Map$Entry;)V
-HSPLjava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry;->getKey()Ljava/lang/Object;
-HSPLjava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry;->getValue()Ljava/lang/Object;
-HSPLjava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet;-><init>(Ljava/util/Set;)V
-HSPLjava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/Collections$UnmodifiableMap;-><init>(Ljava/util/Map;)V
-HSPLjava/util/Collections$UnmodifiableMap;->containsKey(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$UnmodifiableMap;->entrySet()Ljava/util/Set;
-HSPLjava/util/Collections$UnmodifiableMap;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$UnmodifiableMap;->forEach(Ljava/util/function/BiConsumer;)V
-HSPLjava/util/Collections$UnmodifiableMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Collections$UnmodifiableMap;->hashCode()I
-HSPLjava/util/Collections$UnmodifiableMap;->isEmpty()Z
-HSPLjava/util/Collections$UnmodifiableMap;->keySet()Ljava/util/Set;
-HSPLjava/util/Collections$UnmodifiableMap;->size()I
-HSPLjava/util/Collections$UnmodifiableMap;->toString()Ljava/lang/String;
-HSPLjava/util/Collections$UnmodifiableMap;->values()Ljava/util/Collection;
-HSPLjava/util/Collections$UnmodifiableRandomAccessList;-><init>(Ljava/util/List;)V
-HSPLjava/util/Collections$UnmodifiableRandomAccessList;->subList(II)Ljava/util/List;
-HSPLjava/util/Collections$UnmodifiableSet;-><init>(Ljava/util/Set;)V
-HSPLjava/util/Collections$UnmodifiableSet;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/Collections$UnmodifiableSortedMap;-><init>(Ljava/util/SortedMap;)V
-HSPLjava/util/Collections$UnmodifiableSortedSet;-><init>(Ljava/util/SortedSet;)V
-HSPLjava/util/Collections;->addAll(Ljava/util/Collection;[Ljava/lang/Object;)Z
-HSPLjava/util/Collections;->binarySearch(Ljava/util/List;Ljava/lang/Object;)I
-HSPLjava/util/Collections;->binarySearch(Ljava/util/List;Ljava/lang/Object;Ljava/util/Comparator;)I
-HSPLjava/util/Collections;->disjoint(Ljava/util/Collection;Ljava/util/Collection;)Z
-HSPLjava/util/Collections;->emptyEnumeration()Ljava/util/Enumeration;
-HSPLjava/util/Collections;->emptyIterator()Ljava/util/Iterator;
-HSPLjava/util/Collections;->emptyList()Ljava/util/List;
-HSPLjava/util/Collections;->emptyListIterator()Ljava/util/ListIterator;
-HSPLjava/util/Collections;->emptyMap()Ljava/util/Map;
-HSPLjava/util/Collections;->emptySet()Ljava/util/Set;
-HSPLjava/util/Collections;->enumeration(Ljava/util/Collection;)Ljava/util/Enumeration;
-HSPLjava/util/Collections;->eq(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/Collections;->indexedBinarySearch(Ljava/util/List;Ljava/lang/Object;)I
-HSPLjava/util/Collections;->indexedBinarySearch(Ljava/util/List;Ljava/lang/Object;Ljava/util/Comparator;)I
-HSPLjava/util/Collections;->list(Ljava/util/Enumeration;)Ljava/util/ArrayList;
-HSPLjava/util/Collections;->max(Ljava/util/Collection;)Ljava/lang/Object;
-HSPLjava/util/Collections;->max(Ljava/util/Collection;Ljava/util/Comparator;)Ljava/lang/Object;
-HSPLjava/util/Collections;->min(Ljava/util/Collection;Ljava/util/Comparator;)Ljava/lang/Object;
-HSPLjava/util/Collections;->nCopies(ILjava/lang/Object;)Ljava/util/List;
-HSPLjava/util/Collections;->newSetFromMap(Ljava/util/Map;)Ljava/util/Set;
-HSPLjava/util/Collections;->reverse(Ljava/util/List;)V
-HSPLjava/util/Collections;->reverseOrder()Ljava/util/Comparator;
-HSPLjava/util/Collections;->reverseOrder(Ljava/util/Comparator;)Ljava/util/Comparator;
-HSPLjava/util/Collections;->rotate(Ljava/util/List;I)V
-HSPLjava/util/Collections;->rotate1(Ljava/util/List;I)V
-HSPLjava/util/Collections;->shuffle(Ljava/util/List;)V
-HSPLjava/util/Collections;->shuffle(Ljava/util/List;Ljava/util/Random;)V
-HSPLjava/util/Collections;->shuffle(Ljava/util/List;Ljava/util/random/RandomGenerator;)V+]Ljava/util/random/RandomGenerator;Ljava/util/Random;]Ljava/util/List;missing_types
-HSPLjava/util/Collections;->singleton(Ljava/lang/Object;)Ljava/util/Set;
-HSPLjava/util/Collections;->singletonIterator(Ljava/lang/Object;)Ljava/util/Iterator;
-HSPLjava/util/Collections;->singletonList(Ljava/lang/Object;)Ljava/util/List;
-HSPLjava/util/Collections;->singletonMap(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
-HSPLjava/util/Collections;->sort(Ljava/util/List;)V
-HSPLjava/util/Collections;->sort(Ljava/util/List;Ljava/util/Comparator;)V
-HSPLjava/util/Collections;->swap(Ljava/util/List;II)V
-HSPLjava/util/Collections;->synchronizedCollection(Ljava/util/Collection;)Ljava/util/Collection;
-HSPLjava/util/Collections;->synchronizedCollection(Ljava/util/Collection;Ljava/lang/Object;)Ljava/util/Collection;
-HSPLjava/util/Collections;->synchronizedList(Ljava/util/List;)Ljava/util/List;
-HSPLjava/util/Collections;->synchronizedMap(Ljava/util/Map;)Ljava/util/Map;
-HSPLjava/util/Collections;->synchronizedSet(Ljava/util/Set;)Ljava/util/Set;
-HSPLjava/util/Collections;->synchronizedSet(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/Set;
-HSPLjava/util/Collections;->unmodifiableCollection(Ljava/util/Collection;)Ljava/util/Collection;
-HSPLjava/util/Collections;->unmodifiableList(Ljava/util/List;)Ljava/util/List;
-HSPLjava/util/Collections;->unmodifiableMap(Ljava/util/Map;)Ljava/util/Map;
-HSPLjava/util/Collections;->unmodifiableSet(Ljava/util/Set;)Ljava/util/Set;
-HSPLjava/util/Collections;->unmodifiableSortedMap(Ljava/util/SortedMap;)Ljava/util/SortedMap;
-HSPLjava/util/Collections;->unmodifiableSortedSet(Ljava/util/SortedSet;)Ljava/util/SortedSet;
-HSPLjava/util/ComparableTimSort;-><init>([Ljava/lang/Object;[Ljava/lang/Object;II)V
-HSPLjava/util/ComparableTimSort;->binarySort([Ljava/lang/Object;III)V
-HSPLjava/util/ComparableTimSort;->countRunAndMakeAscending([Ljava/lang/Object;II)I
-HSPLjava/util/ComparableTimSort;->ensureCapacity(I)[Ljava/lang/Object;
-HSPLjava/util/ComparableTimSort;->gallopLeft(Ljava/lang/Comparable;[Ljava/lang/Object;III)I
-HSPLjava/util/ComparableTimSort;->gallopRight(Ljava/lang/Comparable;[Ljava/lang/Object;III)I
-HSPLjava/util/ComparableTimSort;->mergeAt(I)V
-HSPLjava/util/ComparableTimSort;->mergeCollapse()V
-HSPLjava/util/ComparableTimSort;->mergeForceCollapse()V
-HSPLjava/util/ComparableTimSort;->mergeHi(IIII)V
-HSPLjava/util/ComparableTimSort;->mergeLo(IIII)V
-HSPLjava/util/ComparableTimSort;->minRunLength(I)I
-HSPLjava/util/ComparableTimSort;->pushRun(II)V
-HSPLjava/util/ComparableTimSort;->reverseRange([Ljava/lang/Object;II)V
-HSPLjava/util/ComparableTimSort;->sort([Ljava/lang/Object;II[Ljava/lang/Object;II)V
-HSPLjava/util/Comparator$$ExternalSyntheticLambda1;-><init>(Ljava/util/Comparator;Ljava/util/Comparator;)V
-HSPLjava/util/Comparator$$ExternalSyntheticLambda1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/util/Comparator$$ExternalSyntheticLambda3;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/util/Comparator$$ExternalSyntheticLambda4;-><init>(Ljava/util/function/ToLongFunction;)V
-HSPLjava/util/Comparator$$ExternalSyntheticLambda5;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/util/Comparator;->comparing(Ljava/util/function/Function;)Ljava/util/Comparator;
-HSPLjava/util/Comparator;->comparingInt(Ljava/util/function/ToIntFunction;)Ljava/util/Comparator;
-HSPLjava/util/Comparator;->comparingLong(Ljava/util/function/ToLongFunction;)Ljava/util/Comparator;
-HSPLjava/util/Comparator;->lambda$comparing$77a9974f$1(Ljava/util/function/Function;Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/util/Comparator;->lambda$comparingInt$7b0bb60$1(Ljava/util/function/ToIntFunction;Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/util/Comparator;->naturalOrder()Ljava/util/Comparator;
-HSPLjava/util/Comparator;->nullsFirst(Ljava/util/Comparator;)Ljava/util/Comparator;
-HSPLjava/util/Comparator;->reversed()Ljava/util/Comparator;
-HSPLjava/util/Comparator;->thenComparing(Ljava/util/Comparator;)Ljava/util/Comparator;
-HSPLjava/util/Comparator;->thenComparing(Ljava/util/function/Function;)Ljava/util/Comparator;+]Ljava/util/Comparator;Ljava/util/Comparator$$ExternalSyntheticLambda3;
-HSPLjava/util/Comparators$NaturalOrderComparator;->compare(Ljava/lang/Comparable;Ljava/lang/Comparable;)I
-HSPLjava/util/Comparators$NaturalOrderComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/util/Comparators$NullComparator;-><init>(ZLjava/util/Comparator;)V
-HSPLjava/util/Comparators$NullComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/util/Currency;-><init>(Landroid/icu/util/Currency;)V
-HSPLjava/util/Currency;->getCurrencyCode()Ljava/lang/String;
-HSPLjava/util/Currency;->getInstance(Ljava/lang/String;)Ljava/util/Currency;
-HSPLjava/util/Currency;->getInstance(Ljava/util/Locale;)Ljava/util/Currency;
-HSPLjava/util/Currency;->getSymbol(Ljava/util/Locale;)Ljava/lang/String;
-HSPLjava/util/Date;-><init>()V
-HSPLjava/util/Date;-><init>(J)V
-HSPLjava/util/Date;->after(Ljava/util/Date;)Z
-HSPLjava/util/Date;->before(Ljava/util/Date;)Z
-HSPLjava/util/Date;->clone()Ljava/lang/Object;
-HSPLjava/util/Date;->compareTo(Ljava/util/Date;)I
-HSPLjava/util/Date;->convertToAbbr(Ljava/lang/StringBuilder;Ljava/lang/String;)Ljava/lang/StringBuilder;
-HSPLjava/util/Date;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/Date;->getCalendarSystem(J)Lsun/util/calendar/BaseCalendar;
-HSPLjava/util/Date;->getDate()I
-HSPLjava/util/Date;->getHours()I
-HSPLjava/util/Date;->getMillisOf(Ljava/util/Date;)J
-HSPLjava/util/Date;->getMinutes()I
-HSPLjava/util/Date;->getMonth()I
-HSPLjava/util/Date;->getSeconds()I
-HSPLjava/util/Date;->getTime()J
-HSPLjava/util/Date;->getTimeImpl()J
-HSPLjava/util/Date;->getYear()I
-HSPLjava/util/Date;->normalize()Lsun/util/calendar/BaseCalendar$Date;
-HSPLjava/util/Date;->setTime(J)V
-HSPLjava/util/Date;->toInstant()Ljava/time/Instant;
-HSPLjava/util/Date;->toString()Ljava/lang/String;
-HSPLjava/util/Dictionary;-><init>()V
-HSPLjava/util/DualPivotQuicksort;->insertionSort([CII)V
-HSPLjava/util/DualPivotQuicksort;->insertionSort([FII)V
-HSPLjava/util/DualPivotQuicksort;->insertionSort([III)V
-HSPLjava/util/DualPivotQuicksort;->insertionSort([JII)V
-HSPLjava/util/DualPivotQuicksort;->sort(Ljava/util/DualPivotQuicksort$Sorter;[FIII)V
-HSPLjava/util/DualPivotQuicksort;->sort(Ljava/util/DualPivotQuicksort$Sorter;[IIII)V
-HSPLjava/util/DualPivotQuicksort;->sort(Ljava/util/DualPivotQuicksort$Sorter;[JIII)V
-HSPLjava/util/DualPivotQuicksort;->sort([CIII)V
-HSPLjava/util/DualPivotQuicksort;->sort([FIII)V
-HSPLjava/util/DualPivotQuicksort;->sort([IIII)V
-HSPLjava/util/DualPivotQuicksort;->sort([JIII)V
-HSPLjava/util/DualPivotQuicksort;->tryMergeRuns(Ljava/util/DualPivotQuicksort$Sorter;[III)Z
-HSPLjava/util/DualPivotQuicksort;->tryMergeRuns(Ljava/util/DualPivotQuicksort$Sorter;[JII)Z
-HSPLjava/util/EnumMap$EntryIterator$Entry;-><init>(Ljava/util/EnumMap$EntryIterator;I)V
-HSPLjava/util/EnumMap$EntryIterator$Entry;->checkIndexForEntryUse()V
-HSPLjava/util/EnumMap$EntryIterator$Entry;->getKey()Ljava/lang/Enum;
-HSPLjava/util/EnumMap$EntryIterator$Entry;->getKey()Ljava/lang/Object;
-HSPLjava/util/EnumMap$EntryIterator$Entry;->getValue()Ljava/lang/Object;
-HSPLjava/util/EnumMap$EntryIterator;-><init>(Ljava/util/EnumMap;)V
-HSPLjava/util/EnumMap$EntryIterator;->next()Ljava/lang/Object;
-HSPLjava/util/EnumMap$EntryIterator;->next()Ljava/util/Map$Entry;
-HSPLjava/util/EnumMap$EntrySet;-><init>(Ljava/util/EnumMap;)V
-HSPLjava/util/EnumMap$EntrySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/EnumMap$EntrySet;->size()I
-HSPLjava/util/EnumMap$EnumMapIterator;-><init>(Ljava/util/EnumMap;)V
-HSPLjava/util/EnumMap$EnumMapIterator;->hasNext()Z
-HSPLjava/util/EnumMap$KeyIterator;-><init>(Ljava/util/EnumMap;)V
-HSPLjava/util/EnumMap$KeyIterator;->next()Ljava/lang/Enum;
-HSPLjava/util/EnumMap$KeyIterator;->next()Ljava/lang/Object;
-HSPLjava/util/EnumMap$KeySet;-><init>(Ljava/util/EnumMap;)V
-HSPLjava/util/EnumMap$KeySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/EnumMap$KeySet;->size()I
-HSPLjava/util/EnumMap$ValueIterator;-><init>(Ljava/util/EnumMap;)V
-HSPLjava/util/EnumMap$ValueIterator;->next()Ljava/lang/Object;
-HSPLjava/util/EnumMap$Values;-><init>(Ljava/util/EnumMap;)V
-HSPLjava/util/EnumMap$Values;->iterator()Ljava/util/Iterator;
-HSPLjava/util/EnumMap$Values;->size()I
-HSPLjava/util/EnumMap;->-$$Nest$fgetsize(Ljava/util/EnumMap;)I
-HSPLjava/util/EnumMap;-><init>(Ljava/lang/Class;)V
-HSPLjava/util/EnumMap;-><init>(Ljava/util/Map;)V
-HSPLjava/util/EnumMap;->clear()V
-HSPLjava/util/EnumMap;->containsKey(Ljava/lang/Object;)Z
-HSPLjava/util/EnumMap;->entrySet()Ljava/util/Set;
-HSPLjava/util/EnumMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/EnumMap;->getKeyUniverse(Ljava/lang/Class;)[Ljava/lang/Enum;
-HSPLjava/util/EnumMap;->isValidKey(Ljava/lang/Object;)Z
-HSPLjava/util/EnumMap;->keySet()Ljava/util/Set;
-HSPLjava/util/EnumMap;->maskNull(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/EnumMap;->put(Ljava/lang/Enum;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/EnumMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/EnumMap;->putAll(Ljava/util/Map;)V
-HSPLjava/util/EnumMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/EnumMap;->size()I
-HSPLjava/util/EnumMap;->typeCheck(Ljava/lang/Enum;)V
-HSPLjava/util/EnumMap;->unmaskNull(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/EnumMap;->values()Ljava/util/Collection;
-HSPLjava/util/EnumSet;-><init>(Ljava/lang/Class;[Ljava/lang/Enum;)V
-HSPLjava/util/EnumSet;->allOf(Ljava/lang/Class;)Ljava/util/EnumSet;
-HSPLjava/util/EnumSet;->clone()Ljava/util/EnumSet;
-HSPLjava/util/EnumSet;->complementOf(Ljava/util/EnumSet;)Ljava/util/EnumSet;
-HSPLjava/util/EnumSet;->copyOf(Ljava/util/Collection;)Ljava/util/EnumSet;
-HSPLjava/util/EnumSet;->copyOf(Ljava/util/EnumSet;)Ljava/util/EnumSet;
-HSPLjava/util/EnumSet;->getUniverse(Ljava/lang/Class;)[Ljava/lang/Enum;
-HSPLjava/util/EnumSet;->noneOf(Ljava/lang/Class;)Ljava/util/EnumSet;
-HSPLjava/util/EnumSet;->of(Ljava/lang/Enum;)Ljava/util/EnumSet;
-HSPLjava/util/EnumSet;->of(Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;
-HSPLjava/util/EnumSet;->of(Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;
-HSPLjava/util/EnumSet;->of(Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;
-HSPLjava/util/EnumSet;->of(Ljava/lang/Enum;[Ljava/lang/Enum;)Ljava/util/EnumSet;
-HSPLjava/util/EnumSet;->typeCheck(Ljava/lang/Enum;)V
-HSPLjava/util/Formatter$Conversion;->isCharacter(C)Z
-HSPLjava/util/Formatter$Conversion;->isFloat(C)Z
-HSPLjava/util/Formatter$Conversion;->isGeneral(C)Z
-HSPLjava/util/Formatter$Conversion;->isInteger(C)Z
-HSPLjava/util/Formatter$Conversion;->isText(C)Z
-HSPLjava/util/Formatter$Conversion;->isValid(C)Z
-HSPLjava/util/Formatter$DateTime;->isValid(C)Z
-HSPLjava/util/Formatter$FixedString;-><init>(Ljava/util/Formatter;Ljava/lang/String;II)V
-HSPLjava/util/Formatter$FixedString;->index()I
-HSPLjava/util/Formatter$FixedString;->print(Ljava/lang/Object;Ljava/util/Locale;)V
-HSPLjava/util/Formatter$Flags;->-$$Nest$madd(Ljava/util/Formatter$Flags;Ljava/util/Formatter$Flags;)Ljava/util/Formatter$Flags;
-HSPLjava/util/Formatter$Flags;-><init>(I)V
-HSPLjava/util/Formatter$Flags;->add(Ljava/util/Formatter$Flags;)Ljava/util/Formatter$Flags;
-HSPLjava/util/Formatter$Flags;->contains(Ljava/util/Formatter$Flags;)Z
-HSPLjava/util/Formatter$Flags;->parse(C)Ljava/util/Formatter$Flags;
-HSPLjava/util/Formatter$Flags;->parse(Ljava/lang/String;II)Ljava/util/Formatter$Flags;
-HSPLjava/util/Formatter$Flags;->valueOf()I
-HSPLjava/util/Formatter$FormatSpecifier;-><init>(Ljava/util/Formatter;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/util/Formatter$FormatSpecifier;->addZeros(Ljava/lang/StringBuilder;I)V
-HSPLjava/util/Formatter$FormatSpecifier;->adjustWidth(ILjava/util/Formatter$Flags;Z)I
-HSPLjava/util/Formatter$FormatSpecifier;->appendJustified(Ljava/lang/Appendable;Ljava/lang/CharSequence;)V+]Ljava/util/Formatter$Flags;Ljava/util/Formatter$Flags;]Ljava/lang/CharSequence;Ljava/lang/String;,Ljava/lang/StringBuilder;]Ljava/lang/Appendable;megamorphic_types
-HSPLjava/util/Formatter$FormatSpecifier;->checkBadFlags([Ljava/util/Formatter$Flags;)V
-HSPLjava/util/Formatter$FormatSpecifier;->checkCharacter()V
-HSPLjava/util/Formatter$FormatSpecifier;->checkDateTime()V
-HSPLjava/util/Formatter$FormatSpecifier;->checkFloat()V
-HSPLjava/util/Formatter$FormatSpecifier;->checkGeneral()V
-HSPLjava/util/Formatter$FormatSpecifier;->checkInteger()V
-HSPLjava/util/Formatter$FormatSpecifier;->checkNumeric()V
-HSPLjava/util/Formatter$FormatSpecifier;->checkText()V
-HSPLjava/util/Formatter$FormatSpecifier;->conversion(C)V
-HSPLjava/util/Formatter$FormatSpecifier;->getZero(Ljava/util/Locale;)C
-HSPLjava/util/Formatter$FormatSpecifier;->index()I
-HSPLjava/util/Formatter$FormatSpecifier;->index(Ljava/lang/String;)V
-HSPLjava/util/Formatter$FormatSpecifier;->leadingSign(Ljava/lang/StringBuilder;Z)Ljava/lang/StringBuilder;
-HSPLjava/util/Formatter$FormatSpecifier;->localizedMagnitude(Ljava/lang/StringBuilder;JLjava/util/Formatter$Flags;ILjava/util/Locale;)Ljava/lang/StringBuilder;
-HSPLjava/util/Formatter$FormatSpecifier;->localizedMagnitude(Ljava/lang/StringBuilder;Ljava/lang/CharSequence;ILjava/util/Formatter$Flags;ILjava/util/Locale;)Ljava/lang/StringBuilder;
-HSPLjava/util/Formatter$FormatSpecifier;->precision(Ljava/lang/String;)V
-HSPLjava/util/Formatter$FormatSpecifier;->print(BLjava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->print(DLjava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->print(FLjava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->print(ILjava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->print(JLjava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->print(Ljava/lang/Object;Ljava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->print(Ljava/lang/String;Ljava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->print(Ljava/lang/StringBuilder;DLjava/util/Locale;Ljava/util/Formatter$Flags;CIZ)V
-HSPLjava/util/Formatter$FormatSpecifier;->print(Ljava/lang/StringBuilder;Ljava/util/Calendar;CLjava/util/Locale;)Ljava/lang/Appendable;
-HSPLjava/util/Formatter$FormatSpecifier;->print(Ljava/math/BigInteger;Ljava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->print(Ljava/util/Calendar;CLjava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->printBoolean(Ljava/lang/Object;Ljava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->printCharacter(Ljava/lang/Object;Ljava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->printDateTime(Ljava/lang/Object;Ljava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->printFloat(Ljava/lang/Object;Ljava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->printInteger(Ljava/lang/Object;Ljava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->printString(Ljava/lang/Object;Ljava/util/Locale;)V
-HSPLjava/util/Formatter$FormatSpecifier;->trailingSign(Ljava/lang/StringBuilder;Z)Ljava/lang/StringBuilder;
-HSPLjava/util/Formatter$FormatSpecifier;->trailingZeros(Ljava/lang/StringBuilder;I)V
-HSPLjava/util/Formatter$FormatSpecifier;->width(Ljava/lang/String;)V
-HSPLjava/util/Formatter$FormatSpecifierParser;-><init>(Ljava/util/Formatter;Ljava/lang/String;I)V
-HSPLjava/util/Formatter$FormatSpecifierParser;->advance()C
-HSPLjava/util/Formatter$FormatSpecifierParser;->back(I)V
-HSPLjava/util/Formatter$FormatSpecifierParser;->getEndIdx()I
-HSPLjava/util/Formatter$FormatSpecifierParser;->getFormatSpecifier()Ljava/util/Formatter$FormatSpecifier;
-HSPLjava/util/Formatter$FormatSpecifierParser;->isEnd()Z
-HSPLjava/util/Formatter$FormatSpecifierParser;->nextInt()Ljava/lang/String;
-HSPLjava/util/Formatter$FormatSpecifierParser;->nextIsInt()Z
-HSPLjava/util/Formatter$FormatSpecifierParser;->peek()C
-HSPLjava/util/Formatter;->-$$Nest$fgeta(Ljava/util/Formatter;)Ljava/lang/Appendable;
-HSPLjava/util/Formatter;->-$$Nest$smisStrictValidationEnabled()Z
-HSPLjava/util/Formatter;-><init>()V
-HSPLjava/util/Formatter;-><init>(Ljava/lang/Appendable;)V
-HSPLjava/util/Formatter;-><init>(Ljava/lang/Appendable;Ljava/util/Locale;)V
-HSPLjava/util/Formatter;-><init>(Ljava/util/Locale;)V
-HSPLjava/util/Formatter;-><init>(Ljava/util/Locale;Ljava/lang/Appendable;)V
-HSPLjava/util/Formatter;->close()V
-HSPLjava/util/Formatter;->ensureOpen()V
-HSPLjava/util/Formatter;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/util/Formatter;
-HSPLjava/util/Formatter;->format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/util/Formatter;
-HSPLjava/util/Formatter;->isStrictValidationEnabled()Z
-HSPLjava/util/Formatter;->locale()Ljava/util/Locale;
-HSPLjava/util/Formatter;->nonNullAppendable(Ljava/lang/Appendable;)Ljava/lang/Appendable;
-HSPLjava/util/Formatter;->out()Ljava/lang/Appendable;
-HSPLjava/util/Formatter;->parse(Ljava/lang/String;)Ljava/util/List;
-HSPLjava/util/Formatter;->toString()Ljava/lang/String;
-HSPLjava/util/Formatter;->zero()C+]Llibcore/icu/DecimalFormatData;Llibcore/icu/DecimalFormatData;
-HSPLjava/util/GregorianCalendar;-><init>()V
-HSPLjava/util/GregorianCalendar;-><init>(IIIIII)V
-HSPLjava/util/GregorianCalendar;-><init>(IIIIIII)V
-HSPLjava/util/GregorianCalendar;-><init>(Ljava/util/TimeZone;)V
-HSPLjava/util/GregorianCalendar;-><init>(Ljava/util/TimeZone;Ljava/util/Locale;)V
-HSPLjava/util/GregorianCalendar;->add(II)V
-HSPLjava/util/GregorianCalendar;->adjustDstOffsetForInvalidWallClock(JLjava/util/TimeZone;I)I
-HSPLjava/util/GregorianCalendar;->adjustForZoneAndDaylightSavingsTime(IJLjava/util/TimeZone;)J
-HSPLjava/util/GregorianCalendar;->clone()Ljava/lang/Object;
-HSPLjava/util/GregorianCalendar;->computeFields()V
-HSPLjava/util/GregorianCalendar;->computeFields(II)I
-HSPLjava/util/GregorianCalendar;->computeTime()V
-HSPLjava/util/GregorianCalendar;->getActualMaximum(I)I
-HSPLjava/util/GregorianCalendar;->getCalendarDate(J)Lsun/util/calendar/BaseCalendar$Date;
-HSPLjava/util/GregorianCalendar;->getCurrentFixedDate()J
-HSPLjava/util/GregorianCalendar;->getFixedDate(Lsun/util/calendar/BaseCalendar;II)J
-HSPLjava/util/GregorianCalendar;->getGregorianCutoverDate()Lsun/util/calendar/BaseCalendar$Date;
-HSPLjava/util/GregorianCalendar;->getJulianCalendarSystem()Lsun/util/calendar/BaseCalendar;
-HSPLjava/util/GregorianCalendar;->getLeastMaximum(I)I
-HSPLjava/util/GregorianCalendar;->getMaximum(I)I
-HSPLjava/util/GregorianCalendar;->getMinimum(I)I
-HSPLjava/util/GregorianCalendar;->getNormalizedCalendar()Ljava/util/GregorianCalendar;
-HSPLjava/util/GregorianCalendar;->getTimeZone()Ljava/util/TimeZone;
-HSPLjava/util/GregorianCalendar;->getWeekNumber(JJ)I
-HSPLjava/util/GregorianCalendar;->internalGetEra()I
-HSPLjava/util/GregorianCalendar;->isCutoverYear(I)Z
-HSPLjava/util/GregorianCalendar;->isLeapYear(I)Z
-HSPLjava/util/GregorianCalendar;->monthLength(I)I
-HSPLjava/util/GregorianCalendar;->monthLength(II)I
-HSPLjava/util/GregorianCalendar;->pinDayOfMonth()V
-HSPLjava/util/GregorianCalendar;->setGregorianChange(J)V
-HSPLjava/util/GregorianCalendar;->setGregorianChange(Ljava/util/Date;)V
-HSPLjava/util/GregorianCalendar;->setTimeZone(Ljava/util/TimeZone;)V
-HSPLjava/util/HashMap$EntryIterator;-><init>(Ljava/util/HashMap;)V
-HSPLjava/util/HashMap$EntryIterator;->next()Ljava/lang/Object;
-HSPLjava/util/HashMap$EntryIterator;->next()Ljava/util/Map$Entry;
-HSPLjava/util/HashMap$EntrySet;-><init>(Ljava/util/HashMap;)V
-HSPLjava/util/HashMap$EntrySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/HashMap$EntrySet;->size()I
-HSPLjava/util/HashMap$EntrySet;->spliterator()Ljava/util/Spliterator;
-HSPLjava/util/HashMap$EntrySpliterator;-><init>(Ljava/util/HashMap;IIII)V
-HSPLjava/util/HashMap$EntrySpliterator;->characteristics()I
-HSPLjava/util/HashMap$HashIterator;-><init>(Ljava/util/HashMap;)V
-HSPLjava/util/HashMap$HashIterator;->hasNext()Z
-HSPLjava/util/HashMap$HashIterator;->nextNode()Ljava/util/HashMap$Node;
-HSPLjava/util/HashMap$HashIterator;->remove()V
-HSPLjava/util/HashMap$HashMapSpliterator;-><init>(Ljava/util/HashMap;IIII)V
-HSPLjava/util/HashMap$HashMapSpliterator;->estimateSize()J
-HSPLjava/util/HashMap$HashMapSpliterator;->getFence()I
-HSPLjava/util/HashMap$KeyIterator;-><init>(Ljava/util/HashMap;)V
-HSPLjava/util/HashMap$KeyIterator;->next()Ljava/lang/Object;
-HSPLjava/util/HashMap$KeySet;-><init>(Ljava/util/HashMap;)V
-HSPLjava/util/HashMap$KeySet;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/HashMap$KeySet;->forEach(Ljava/util/function/Consumer;)V
-HSPLjava/util/HashMap$KeySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/HashMap$KeySet;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/HashMap$KeySet;->size()I
-HSPLjava/util/HashMap$KeySet;->toArray()[Ljava/lang/Object;
-HSPLjava/util/HashMap$KeySet;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/HashMap$KeySpliterator;-><init>(Ljava/util/HashMap;IIII)V
-HSPLjava/util/HashMap$KeySpliterator;->characteristics()I
-HSPLjava/util/HashMap$KeySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-HSPLjava/util/HashMap$KeySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-HSPLjava/util/HashMap$Node;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)V
-HSPLjava/util/HashMap$Node;->getKey()Ljava/lang/Object;
-HSPLjava/util/HashMap$Node;->getValue()Ljava/lang/Object;
-HSPLjava/util/HashMap$Node;->hashCode()I
-HSPLjava/util/HashMap$Node;->setValue(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/HashMap$TreeNode;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)V
-HSPLjava/util/HashMap$TreeNode;->balanceInsertion(Ljava/util/HashMap$TreeNode;Ljava/util/HashMap$TreeNode;)Ljava/util/HashMap$TreeNode;
-HSPLjava/util/HashMap$TreeNode;->find(ILjava/lang/Object;Ljava/lang/Class;)Ljava/util/HashMap$TreeNode;
-HSPLjava/util/HashMap$TreeNode;->getTreeNode(ILjava/lang/Object;)Ljava/util/HashMap$TreeNode;
-HSPLjava/util/HashMap$TreeNode;->moveRootToFront([Ljava/util/HashMap$Node;Ljava/util/HashMap$TreeNode;)V
-HSPLjava/util/HashMap$TreeNode;->putTreeVal(Ljava/util/HashMap;[Ljava/util/HashMap$Node;ILjava/lang/Object;Ljava/lang/Object;)Ljava/util/HashMap$TreeNode;
-HSPLjava/util/HashMap$TreeNode;->rotateLeft(Ljava/util/HashMap$TreeNode;Ljava/util/HashMap$TreeNode;)Ljava/util/HashMap$TreeNode;
-HSPLjava/util/HashMap$TreeNode;->rotateRight(Ljava/util/HashMap$TreeNode;Ljava/util/HashMap$TreeNode;)Ljava/util/HashMap$TreeNode;
-HSPLjava/util/HashMap$TreeNode;->split(Ljava/util/HashMap;[Ljava/util/HashMap$Node;II)V
-HSPLjava/util/HashMap$TreeNode;->treeify([Ljava/util/HashMap$Node;)V
-HSPLjava/util/HashMap$TreeNode;->untreeify(Ljava/util/HashMap;)Ljava/util/HashMap$Node;
-HSPLjava/util/HashMap$ValueIterator;-><init>(Ljava/util/HashMap;)V
-HSPLjava/util/HashMap$ValueIterator;->next()Ljava/lang/Object;
-HSPLjava/util/HashMap$ValueSpliterator;-><init>(Ljava/util/HashMap;IIII)V
-HSPLjava/util/HashMap$ValueSpliterator;->characteristics()I
-HSPLjava/util/HashMap$ValueSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-HSPLjava/util/HashMap$ValueSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-HSPLjava/util/HashMap$Values;-><init>(Ljava/util/HashMap;)V
-HSPLjava/util/HashMap$Values;->forEach(Ljava/util/function/Consumer;)V
-HSPLjava/util/HashMap$Values;->iterator()Ljava/util/Iterator;
-HSPLjava/util/HashMap$Values;->size()I
-HSPLjava/util/HashMap$Values;->spliterator()Ljava/util/Spliterator;
-HSPLjava/util/HashMap$Values;->toArray()[Ljava/lang/Object;
-HSPLjava/util/HashMap$Values;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/HashMap;-><init>()V
-HSPLjava/util/HashMap;-><init>(I)V
-HSPLjava/util/HashMap;-><init>(IF)V
-HSPLjava/util/HashMap;-><init>(Ljava/util/Map;)V
-HSPLjava/util/HashMap;->afterNodeAccess(Ljava/util/HashMap$Node;)V
-HSPLjava/util/HashMap;->afterNodeInsertion(Z)V
-HSPLjava/util/HashMap;->afterNodeRemoval(Ljava/util/HashMap$Node;)V
-HSPLjava/util/HashMap;->calculateHashMapCapacity(I)I
-HSPLjava/util/HashMap;->capacity()I
-HSPLjava/util/HashMap;->clear()V
-HSPLjava/util/HashMap;->clone()Ljava/lang/Object;
-HSPLjava/util/HashMap;->computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;
-HSPLjava/util/HashMap;->containsKey(Ljava/lang/Object;)Z
-HSPLjava/util/HashMap;->containsValue(Ljava/lang/Object;)Z
-HSPLjava/util/HashMap;->entrySet()Ljava/util/Set;
-HSPLjava/util/HashMap;->forEach(Ljava/util/function/BiConsumer;)V
-HSPLjava/util/HashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/HashMap;->getNode(Ljava/lang/Object;)Ljava/util/HashMap$Node;
-HSPLjava/util/HashMap;->getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/HashMap;->hash(Ljava/lang/Object;)I
-HSPLjava/util/HashMap;->internalWriteEntries(Ljava/io/ObjectOutputStream;)V
-HSPLjava/util/HashMap;->isEmpty()Z
-HSPLjava/util/HashMap;->keySet()Ljava/util/Set;
-HSPLjava/util/HashMap;->keysToArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/HashMap;->loadFactor()F
-HSPLjava/util/HashMap;->merge(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;
-HSPLjava/util/HashMap;->newHashMap(I)Ljava/util/HashMap;
-HSPLjava/util/HashMap;->newNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$Node;
-HSPLjava/util/HashMap;->newTreeNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$TreeNode;
-HSPLjava/util/HashMap;->prepareArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/HashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/HashMap;->putAll(Ljava/util/Map;)V
-HSPLjava/util/HashMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/HashMap;->putMapEntries(Ljava/util/Map;Z)V
-HSPLjava/util/HashMap;->putVal(ILjava/lang/Object;Ljava/lang/Object;ZZ)Ljava/lang/Object;
-HSPLjava/util/HashMap;->readObject(Ljava/io/ObjectInputStream;)V
-HSPLjava/util/HashMap;->reinitialize()V
-HSPLjava/util/HashMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/HashMap;->removeNode(ILjava/lang/Object;Ljava/lang/Object;ZZ)Ljava/util/HashMap$Node;
-HSPLjava/util/HashMap;->replacementNode(Ljava/util/HashMap$Node;Ljava/util/HashMap$Node;)Ljava/util/HashMap$Node;
-HSPLjava/util/HashMap;->replacementTreeNode(Ljava/util/HashMap$Node;Ljava/util/HashMap$Node;)Ljava/util/HashMap$TreeNode;
-HSPLjava/util/HashMap;->resize()[Ljava/util/HashMap$Node;
-HSPLjava/util/HashMap;->size()I
-HSPLjava/util/HashMap;->tableSizeFor(I)I
-HSPLjava/util/HashMap;->treeifyBin([Ljava/util/HashMap$Node;I)V
-HSPLjava/util/HashMap;->values()Ljava/util/Collection;
-HSPLjava/util/HashMap;->valuesToArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/HashMap;->writeObject(Ljava/io/ObjectOutputStream;)V
-HSPLjava/util/HashSet;-><init>()V
-HSPLjava/util/HashSet;-><init>(I)V
-HSPLjava/util/HashSet;-><init>(IF)V
-HSPLjava/util/HashSet;-><init>(IFZ)V
-HSPLjava/util/HashSet;-><init>(Ljava/util/Collection;)V
-HSPLjava/util/HashSet;->add(Ljava/lang/Object;)Z
-HSPLjava/util/HashSet;->clear()V
-HSPLjava/util/HashSet;->clone()Ljava/lang/Object;
-HSPLjava/util/HashSet;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/HashSet;->isEmpty()Z
-HSPLjava/util/HashSet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/HashSet;->readObject(Ljava/io/ObjectInputStream;)V
-HSPLjava/util/HashSet;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/HashSet;->size()I
-HSPLjava/util/HashSet;->spliterator()Ljava/util/Spliterator;
-HSPLjava/util/HashSet;->toArray()[Ljava/lang/Object;+]Ljava/util/HashMap;Ljava/util/HashMap;,Ljava/util/LinkedHashMap;
-HSPLjava/util/HashSet;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;+]Ljava/util/HashMap;Ljava/util/HashMap;,Ljava/util/LinkedHashMap;
-HSPLjava/util/HashSet;->writeObject(Ljava/io/ObjectOutputStream;)V
-HSPLjava/util/Hashtable$EntrySet;-><init>(Ljava/util/Hashtable;)V
-HSPLjava/util/Hashtable$EntrySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/Hashtable$Enumerator;-><init>(Ljava/util/Hashtable;IZ)V
-HSPLjava/util/Hashtable$Enumerator;->hasMoreElements()Z
-HSPLjava/util/Hashtable$Enumerator;->hasNext()Z
-HSPLjava/util/Hashtable$Enumerator;->next()Ljava/lang/Object;
-HSPLjava/util/Hashtable$Enumerator;->nextElement()Ljava/lang/Object;
-HSPLjava/util/Hashtable$HashtableEntry;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/Hashtable$HashtableEntry;)V
-HSPLjava/util/Hashtable$HashtableEntry;->clone()Ljava/lang/Object;
-HSPLjava/util/Hashtable$HashtableEntry;->getKey()Ljava/lang/Object;
-HSPLjava/util/Hashtable$HashtableEntry;->getValue()Ljava/lang/Object;
-HSPLjava/util/Hashtable$KeySet;-><init>(Ljava/util/Hashtable;)V
-HSPLjava/util/Hashtable$KeySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/Hashtable$KeySet;->size()I
-HSPLjava/util/Hashtable$ValueCollection;-><init>(Ljava/util/Hashtable;)V
-HSPLjava/util/Hashtable$ValueCollection;->iterator()Ljava/util/Iterator;
-HSPLjava/util/Hashtable$ValueCollection;->size()I
-HSPLjava/util/Hashtable;->-$$Nest$fgetmodCount(Ljava/util/Hashtable;)I
-HSPLjava/util/Hashtable;->-$$Nest$fgettable(Ljava/util/Hashtable;)[Ljava/util/Hashtable$HashtableEntry;
-HSPLjava/util/Hashtable;-><init>()V
-HSPLjava/util/Hashtable;-><init>(I)V
-HSPLjava/util/Hashtable;-><init>(IF)V
-HSPLjava/util/Hashtable;->addEntry(ILjava/lang/Object;Ljava/lang/Object;I)V
-HSPLjava/util/Hashtable;->clear()V
-HSPLjava/util/Hashtable;->clone()Ljava/lang/Object;
-HSPLjava/util/Hashtable;->containsKey(Ljava/lang/Object;)Z
-HSPLjava/util/Hashtable;->entrySet()Ljava/util/Set;
-HSPLjava/util/Hashtable;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Hashtable;->getEnumeration(I)Ljava/util/Enumeration;
-HSPLjava/util/Hashtable;->getIterator(I)Ljava/util/Iterator;
-HSPLjava/util/Hashtable;->isEmpty()Z
-HSPLjava/util/Hashtable;->keySet()Ljava/util/Set;
-HSPLjava/util/Hashtable;->keys()Ljava/util/Enumeration;
-HSPLjava/util/Hashtable;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Hashtable;->rehash()V
-HSPLjava/util/Hashtable;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Hashtable;->remove(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/Hashtable;->size()I
-HSPLjava/util/Hashtable;->values()Ljava/util/Collection;
-HSPLjava/util/IdentityHashMap$EntryIterator$Entry;-><init>(Ljava/util/IdentityHashMap$EntryIterator;I)V
-HSPLjava/util/IdentityHashMap$EntryIterator$Entry;->checkIndexForEntryUse()V
-HSPLjava/util/IdentityHashMap$EntryIterator$Entry;->getKey()Ljava/lang/Object;
-HSPLjava/util/IdentityHashMap$EntryIterator$Entry;->getValue()Ljava/lang/Object;
-HSPLjava/util/IdentityHashMap$EntryIterator;-><init>(Ljava/util/IdentityHashMap;)V
-HSPLjava/util/IdentityHashMap$EntryIterator;->next()Ljava/lang/Object;
-HSPLjava/util/IdentityHashMap$EntryIterator;->next()Ljava/util/Map$Entry;
-HSPLjava/util/IdentityHashMap$EntrySet;-><init>(Ljava/util/IdentityHashMap;)V
-HSPLjava/util/IdentityHashMap$EntrySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/IdentityHashMap$EntrySet;->size()I
-HSPLjava/util/IdentityHashMap$IdentityHashMapIterator;-><init>(Ljava/util/IdentityHashMap;)V
-HSPLjava/util/IdentityHashMap$IdentityHashMapIterator;->hasNext()Z
-HSPLjava/util/IdentityHashMap$IdentityHashMapIterator;->nextIndex()I
-HSPLjava/util/IdentityHashMap$KeyIterator;-><init>(Ljava/util/IdentityHashMap;)V
-HSPLjava/util/IdentityHashMap$KeyIterator;->next()Ljava/lang/Object;
-HSPLjava/util/IdentityHashMap$KeySet;-><init>(Ljava/util/IdentityHashMap;)V
-HSPLjava/util/IdentityHashMap$KeySet;-><init>(Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap$KeySet-IA;)V
-HSPLjava/util/IdentityHashMap$KeySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/IdentityHashMap$KeySet;->size()I
-HSPLjava/util/IdentityHashMap$ValueIterator;-><init>(Ljava/util/IdentityHashMap;)V
-HSPLjava/util/IdentityHashMap$ValueIterator;->next()Ljava/lang/Object;
-HSPLjava/util/IdentityHashMap$Values;-><init>(Ljava/util/IdentityHashMap;)V
-HSPLjava/util/IdentityHashMap$Values;->iterator()Ljava/util/Iterator;
-HSPLjava/util/IdentityHashMap;-><init>()V
-HSPLjava/util/IdentityHashMap;-><init>(I)V
-HSPLjava/util/IdentityHashMap;->capacity(I)I
-HSPLjava/util/IdentityHashMap;->clear()V
-HSPLjava/util/IdentityHashMap;->closeDeletion(I)V
-HSPLjava/util/IdentityHashMap;->containsKey(Ljava/lang/Object;)Z
-HSPLjava/util/IdentityHashMap;->entrySet()Ljava/util/Set;
-HSPLjava/util/IdentityHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/IdentityHashMap;->hash(Ljava/lang/Object;I)I
-HSPLjava/util/IdentityHashMap;->init(I)V
-HSPLjava/util/IdentityHashMap;->isEmpty()Z
-HSPLjava/util/IdentityHashMap;->keySet()Ljava/util/Set;
-HSPLjava/util/IdentityHashMap;->maskNull(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/IdentityHashMap;->nextKeyIndex(II)I
-HSPLjava/util/IdentityHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/IdentityHashMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/IdentityHashMap;->resize(I)Z
-HSPLjava/util/IdentityHashMap;->size()I
-HSPLjava/util/IdentityHashMap;->unmaskNull(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/IdentityHashMap;->values()Ljava/util/Collection;
-HSPLjava/util/ImmutableCollections$AbstractImmutableCollection;-><init>()V
-HSPLjava/util/ImmutableCollections$AbstractImmutableList;-><init>()V
-HSPLjava/util/ImmutableCollections$AbstractImmutableList;->iterator()Ljava/util/Iterator;
-HSPLjava/util/ImmutableCollections$AbstractImmutableMap;-><init>()V
-HSPLjava/util/ImmutableCollections$AbstractImmutableSet;-><init>()V
-HSPLjava/util/ImmutableCollections$Access$1;-><init>()V
-HSPLjava/util/ImmutableCollections$Access$1;->listFromTrustedArray([Ljava/lang/Object;)Ljava/util/List;
-HSPLjava/util/ImmutableCollections$Access;-><clinit>()V
-HSPLjava/util/ImmutableCollections$List12;-><init>(Ljava/lang/Object;)V
-HSPLjava/util/ImmutableCollections$List12;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLjava/util/ImmutableCollections$List12;->get(I)Ljava/lang/Object;
-HSPLjava/util/ImmutableCollections$List12;->size()I
-HSPLjava/util/ImmutableCollections$ListItr;-><init>(Ljava/util/List;I)V
-HSPLjava/util/ImmutableCollections$ListItr;->hasNext()Z
-HSPLjava/util/ImmutableCollections$ListItr;->next()Ljava/lang/Object;
-HSPLjava/util/ImmutableCollections$ListN;-><init>([Ljava/lang/Object;Z)V
-HSPLjava/util/ImmutableCollections$ListN;-><init>([Ljava/lang/Object;ZLjava/util/ImmutableCollections$ListN-IA;)V
-HSPLjava/util/ImmutableCollections$ListN;->get(I)Ljava/lang/Object;
-HSPLjava/util/ImmutableCollections$ListN;->size()I
-HSPLjava/util/ImmutableCollections$Map1;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLjava/util/ImmutableCollections$Map1;->entrySet()Ljava/util/Set;
-HSPLjava/util/ImmutableCollections$MapN;-><init>([Ljava/lang/Object;)V
-HSPLjava/util/ImmutableCollections$MapN;->containsKey(Ljava/lang/Object;)Z
-HSPLjava/util/ImmutableCollections$MapN;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/ImmutableCollections$MapN;->probe(Ljava/lang/Object;)I
-HSPLjava/util/ImmutableCollections$SetN;-><init>([Ljava/lang/Object;)V
-HSPLjava/util/ImmutableCollections$SetN;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/ImmutableCollections$SetN;->probe(Ljava/lang/Object;)I
-HSPLjava/util/ImmutableCollections;-><clinit>()V
-HSPLjava/util/ImmutableCollections;->listCopy(Ljava/util/Collection;)Ljava/util/List;
-HSPLjava/util/ImmutableCollections;->listFromTrustedArray([Ljava/lang/Object;)Ljava/util/List;
-HSPLjava/util/Iterator;->forEachRemaining(Ljava/util/function/Consumer;)V+]Ljava/util/function/Consumer;megamorphic_types]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/AbstractMap$2$1;,Ljava/util/AbstractList$Itr;,Ljava/util/LinkedHashMap$LinkedValueIterator;
-HSPLjava/util/JumboEnumSet$EnumSetIterator;-><init>(Ljava/util/JumboEnumSet;)V
-HSPLjava/util/JumboEnumSet$EnumSetIterator;->hasNext()Z
-HSPLjava/util/JumboEnumSet$EnumSetIterator;->next()Ljava/lang/Enum;
-HSPLjava/util/JumboEnumSet$EnumSetIterator;->next()Ljava/lang/Object;
-HSPLjava/util/JumboEnumSet;-><init>(Ljava/lang/Class;[Ljava/lang/Enum;)V
-HSPLjava/util/JumboEnumSet;->add(Ljava/lang/Enum;)Z
-HSPLjava/util/JumboEnumSet;->add(Ljava/lang/Object;)Z
-HSPLjava/util/JumboEnumSet;->addAll()V
-HSPLjava/util/JumboEnumSet;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/JumboEnumSet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/JumboEnumSet;->size()I
-HSPLjava/util/KeyValueHolder;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLjava/util/KeyValueHolder;->getKey()Ljava/lang/Object;
-HSPLjava/util/KeyValueHolder;->getValue()Ljava/lang/Object;
-HSPLjava/util/LinkedHashMap$Entry;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)V
-HSPLjava/util/LinkedHashMap$LinkedEntryIterator;-><init>(Ljava/util/LinkedHashMap;Z)V
-HSPLjava/util/LinkedHashMap$LinkedEntryIterator;->next()Ljava/lang/Object;
-HSPLjava/util/LinkedHashMap$LinkedEntryIterator;->next()Ljava/util/Map$Entry;
-HSPLjava/util/LinkedHashMap$LinkedEntrySet;-><init>(Ljava/util/LinkedHashMap;Z)V
-HSPLjava/util/LinkedHashMap$LinkedEntrySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/LinkedHashMap$LinkedEntrySet;->size()I
-HSPLjava/util/LinkedHashMap$LinkedHashIterator;-><init>(Ljava/util/LinkedHashMap;Z)V
-HSPLjava/util/LinkedHashMap$LinkedHashIterator;->hasNext()Z
-HSPLjava/util/LinkedHashMap$LinkedHashIterator;->nextNode()Ljava/util/LinkedHashMap$Entry;
-HSPLjava/util/LinkedHashMap$LinkedHashIterator;->remove()V
-HSPLjava/util/LinkedHashMap$LinkedKeyIterator;->next()Ljava/lang/Object;
-HSPLjava/util/LinkedHashMap$LinkedKeySet;-><init>(Ljava/util/LinkedHashMap;Z)V
-HSPLjava/util/LinkedHashMap$LinkedKeySet;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/LinkedHashMap$LinkedKeySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/LinkedHashMap$LinkedKeySet;->size()I
-HSPLjava/util/LinkedHashMap$LinkedKeySet;->toArray()[Ljava/lang/Object;
-HSPLjava/util/LinkedHashMap$LinkedValueIterator;-><init>(Ljava/util/LinkedHashMap;Z)V
-HSPLjava/util/LinkedHashMap$LinkedValueIterator;->next()Ljava/lang/Object;
-HSPLjava/util/LinkedHashMap$LinkedValues;-><init>(Ljava/util/LinkedHashMap;Z)V
-HSPLjava/util/LinkedHashMap$LinkedValues;->iterator()Ljava/util/Iterator;
-HSPLjava/util/LinkedHashMap$LinkedValues;->size()I
-HSPLjava/util/LinkedHashMap$LinkedValues;->toArray()[Ljava/lang/Object;
-HSPLjava/util/LinkedHashMap;-><init>()V
-HSPLjava/util/LinkedHashMap;-><init>(I)V
-HSPLjava/util/LinkedHashMap;-><init>(IF)V
-HSPLjava/util/LinkedHashMap;-><init>(IFZ)V
-HSPLjava/util/LinkedHashMap;-><init>(Ljava/util/Map;)V
-HSPLjava/util/LinkedHashMap;->afterNodeAccess(Ljava/util/HashMap$Node;)V
-HSPLjava/util/LinkedHashMap;->afterNodeInsertion(Z)V
-HSPLjava/util/LinkedHashMap;->afterNodeRemoval(Ljava/util/HashMap$Node;)V
-HSPLjava/util/LinkedHashMap;->clear()V
-HSPLjava/util/LinkedHashMap;->eldest()Ljava/util/Map$Entry;
-HSPLjava/util/LinkedHashMap;->entrySet()Ljava/util/Set;
-HSPLjava/util/LinkedHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/LinkedHashMap;->keySet()Ljava/util/Set;
-HSPLjava/util/LinkedHashMap;->keysToArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/LinkedHashMap;->keysToArray([Ljava/lang/Object;Z)[Ljava/lang/Object;
-HSPLjava/util/LinkedHashMap;->linkNodeAtEnd(Ljava/util/LinkedHashMap$Entry;)V
-HSPLjava/util/LinkedHashMap;->newNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$Node;
-HSPLjava/util/LinkedHashMap;->newTreeNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$TreeNode;
-HSPLjava/util/LinkedHashMap;->reinitialize()V
-HSPLjava/util/LinkedHashMap;->removeEldestEntry(Ljava/util/Map$Entry;)Z
-HSPLjava/util/LinkedHashMap;->replacementTreeNode(Ljava/util/HashMap$Node;Ljava/util/HashMap$Node;)Ljava/util/HashMap$TreeNode;
-HSPLjava/util/LinkedHashMap;->sequencedEntrySet()Ljava/util/SequencedSet;
-HSPLjava/util/LinkedHashMap;->sequencedKeySet()Ljava/util/SequencedSet;
-HSPLjava/util/LinkedHashMap;->sequencedValues()Ljava/util/SequencedCollection;
-HSPLjava/util/LinkedHashMap;->values()Ljava/util/Collection;
-HSPLjava/util/LinkedHashMap;->valuesToArray([Ljava/lang/Object;Z)[Ljava/lang/Object;
-HSPLjava/util/LinkedHashSet;-><init>()V
-HSPLjava/util/LinkedHashSet;-><init>(I)V
-HSPLjava/util/LinkedHashSet;-><init>(Ljava/util/Collection;)V
-HSPLjava/util/LinkedList$ListItr;-><init>(Ljava/util/LinkedList;I)V
-HSPLjava/util/LinkedList$ListItr;->add(Ljava/lang/Object;)V
-HSPLjava/util/LinkedList$ListItr;->checkForComodification()V
-HSPLjava/util/LinkedList$ListItr;->hasNext()Z
-HSPLjava/util/LinkedList$ListItr;->hasPrevious()Z
-HSPLjava/util/LinkedList$ListItr;->next()Ljava/lang/Object;
-HSPLjava/util/LinkedList$ListItr;->previous()Ljava/lang/Object;
-HSPLjava/util/LinkedList$ListItr;->remove()V
-HSPLjava/util/LinkedList$ListItr;->set(Ljava/lang/Object;)V
-HSPLjava/util/LinkedList$Node;-><init>(Ljava/util/LinkedList$Node;Ljava/lang/Object;Ljava/util/LinkedList$Node;)V
-HSPLjava/util/LinkedList;-><init>()V
-HSPLjava/util/LinkedList;-><init>(Ljava/util/Collection;)V
-HSPLjava/util/LinkedList;->add(ILjava/lang/Object;)V
-HSPLjava/util/LinkedList;->add(Ljava/lang/Object;)Z
-HSPLjava/util/LinkedList;->addAll(ILjava/util/Collection;)Z
-HSPLjava/util/LinkedList;->addAll(Ljava/util/Collection;)Z
-HSPLjava/util/LinkedList;->addFirst(Ljava/lang/Object;)V
-HSPLjava/util/LinkedList;->addLast(Ljava/lang/Object;)V
-HSPLjava/util/LinkedList;->checkElementIndex(I)V
-HSPLjava/util/LinkedList;->checkPositionIndex(I)V
-HSPLjava/util/LinkedList;->clear()V
-HSPLjava/util/LinkedList;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/LinkedList;->descendingIterator()Ljava/util/Iterator;
-HSPLjava/util/LinkedList;->get(I)Ljava/lang/Object;
-HSPLjava/util/LinkedList;->getFirst()Ljava/lang/Object;
-HSPLjava/util/LinkedList;->getLast()Ljava/lang/Object;
-HSPLjava/util/LinkedList;->indexOf(Ljava/lang/Object;)I
-HSPLjava/util/LinkedList;->isElementIndex(I)Z
-HSPLjava/util/LinkedList;->isPositionIndex(I)Z
-HSPLjava/util/LinkedList;->linkBefore(Ljava/lang/Object;Ljava/util/LinkedList$Node;)V
-HSPLjava/util/LinkedList;->linkFirst(Ljava/lang/Object;)V
-HSPLjava/util/LinkedList;->linkLast(Ljava/lang/Object;)V
-HSPLjava/util/LinkedList;->listIterator(I)Ljava/util/ListIterator;
-HSPLjava/util/LinkedList;->node(I)Ljava/util/LinkedList$Node;
-HSPLjava/util/LinkedList;->offer(Ljava/lang/Object;)Z
-HSPLjava/util/LinkedList;->peek()Ljava/lang/Object;
-HSPLjava/util/LinkedList;->peekFirst()Ljava/lang/Object;
-HSPLjava/util/LinkedList;->peekLast()Ljava/lang/Object;
-HSPLjava/util/LinkedList;->poll()Ljava/lang/Object;
-HSPLjava/util/LinkedList;->pollFirst()Ljava/lang/Object;
-HSPLjava/util/LinkedList;->pollLast()Ljava/lang/Object;
-HSPLjava/util/LinkedList;->pop()Ljava/lang/Object;
-HSPLjava/util/LinkedList;->push(Ljava/lang/Object;)V
-HSPLjava/util/LinkedList;->remove()Ljava/lang/Object;
-HSPLjava/util/LinkedList;->remove(I)Ljava/lang/Object;
-HSPLjava/util/LinkedList;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/LinkedList;->removeFirst()Ljava/lang/Object;
-HSPLjava/util/LinkedList;->removeLast()Ljava/lang/Object;
-HSPLjava/util/LinkedList;->set(ILjava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/LinkedList;->size()I
-HSPLjava/util/LinkedList;->toArray()[Ljava/lang/Object;
-HSPLjava/util/LinkedList;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/LinkedList;->unlink(Ljava/util/LinkedList$Node;)Ljava/lang/Object;
-HSPLjava/util/LinkedList;->unlinkFirst(Ljava/util/LinkedList$Node;)Ljava/lang/Object;
-HSPLjava/util/LinkedList;->unlinkLast(Ljava/util/LinkedList$Node;)Ljava/lang/Object;
-HSPLjava/util/List;->copyOf(Ljava/util/Collection;)Ljava/util/List;
-HSPLjava/util/List;->of()Ljava/util/List;
-HSPLjava/util/List;->of(Ljava/lang/Object;)Ljava/util/List;
-HSPLjava/util/List;->of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
-HSPLjava/util/List;->of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
-HSPLjava/util/List;->of([Ljava/lang/Object;)Ljava/util/List;
-HSPLjava/util/List;->sort(Ljava/util/Comparator;)V+]Ljava/util/ListIterator;Ljava/util/ArrayList$SubList$1;,Ljava/util/LinkedList$ListItr;]Ljava/util/List;Ljava/util/ArrayList$SubList;,Ljava/util/LinkedList;
-HSPLjava/util/List;->spliterator()Ljava/util/Spliterator;
-HSPLjava/util/Locale$Builder;-><init>()V
-HSPLjava/util/Locale$Builder;->build()Ljava/util/Locale;
-HSPLjava/util/Locale$Builder;->setLanguage(Ljava/lang/String;)Ljava/util/Locale$Builder;
-HSPLjava/util/Locale$Builder;->setRegion(Ljava/lang/String;)Ljava/util/Locale$Builder;
-HSPLjava/util/Locale$Builder;->setScript(Ljava/lang/String;)Ljava/util/Locale$Builder;
-HSPLjava/util/Locale$Builder;->setVariant(Ljava/lang/String;)Ljava/util/Locale$Builder;
-HSPLjava/util/Locale$Cache;->-$$Nest$sfgetLOCALECACHE()Ljava/util/Locale$Cache;
-HSPLjava/util/Locale$Cache;->createObject(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Locale$Cache;->createObject(Ljava/lang/Object;)Ljava/util/Locale;
-HSPLjava/util/Locale$LocaleKey;->-$$Nest$fgetbase(Ljava/util/Locale$LocaleKey;)Lsun/util/locale/BaseLocale;
-HSPLjava/util/Locale$LocaleKey;->-$$Nest$fgetexts(Ljava/util/Locale$LocaleKey;)Lsun/util/locale/LocaleExtensions;
-HSPLjava/util/Locale$LocaleKey;-><init>(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;)V
-HSPLjava/util/Locale$LocaleKey;-><init>(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;Ljava/util/Locale$LocaleKey-IA;)V
-HSPLjava/util/Locale$LocaleKey;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/Locale$LocaleKey;->hashCode()I
-HSPLjava/util/Locale;-><init>(Ljava/lang/String;)V
-HSPLjava/util/Locale;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/util/Locale;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/util/Locale;-><init>(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;)V
-HSPLjava/util/Locale;-><init>(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;Ljava/util/Locale-IA;)V
-HSPLjava/util/Locale;->cleanCache()V
-HSPLjava/util/Locale;->clone()Ljava/lang/Object;
-HSPLjava/util/Locale;->convertOldISOCodes(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/Locale;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/Locale;->forLanguageTag(Ljava/lang/String;)Ljava/util/Locale;
-HSPLjava/util/Locale;->getAvailableLocales()[Ljava/util/Locale;
-HSPLjava/util/Locale;->getBaseLocale()Lsun/util/locale/BaseLocale;
-HSPLjava/util/Locale;->getCompatibilityExtensions(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lsun/util/locale/LocaleExtensions;
-HSPLjava/util/Locale;->getCountry()Ljava/lang/String;
-HSPLjava/util/Locale;->getDefault()Ljava/util/Locale;
-HSPLjava/util/Locale;->getDefault(Ljava/util/Locale$Category;)Ljava/util/Locale;
-HSPLjava/util/Locale;->getDisplayCountry(Ljava/util/Locale;)Ljava/lang/String;
-HSPLjava/util/Locale;->getDisplayLanguage()Ljava/lang/String;
-HSPLjava/util/Locale;->getDisplayLanguage(Ljava/util/Locale;)Ljava/lang/String;
-HSPLjava/util/Locale;->getExtensionKeys()Ljava/util/Set;
-HSPLjava/util/Locale;->getISO3Country()Ljava/lang/String;
-HSPLjava/util/Locale;->getISO3Language()Ljava/lang/String;
-HSPLjava/util/Locale;->getISOLanguages()[Ljava/lang/String;
-HSPLjava/util/Locale;->getInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lsun/util/locale/LocaleExtensions;)Ljava/util/Locale;
-HSPLjava/util/Locale;->getInstance(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;)Ljava/util/Locale;
-HSPLjava/util/Locale;->getLanguage()Ljava/lang/String;
-HSPLjava/util/Locale;->getScript()Ljava/lang/String;
-HSPLjava/util/Locale;->getUnicodeLocaleType(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/Locale;->getVariant()Ljava/lang/String;
-HSPLjava/util/Locale;->hasExtensions()Z
-HSPLjava/util/Locale;->hashCode()I
-HSPLjava/util/Locale;->isUnicodeExtensionKey(Ljava/lang/String;)Z
-HSPLjava/util/Locale;->isValidBcp47Alpha(Ljava/lang/String;II)Z
-HSPLjava/util/Locale;->normalizeAndValidateLanguage(Ljava/lang/String;Z)Ljava/lang/String;
-HSPLjava/util/Locale;->normalizeAndValidateRegion(Ljava/lang/String;Z)Ljava/lang/String;
-HSPLjava/util/Locale;->readObject(Ljava/io/ObjectInputStream;)V
-HSPLjava/util/Locale;->readResolve()Ljava/lang/Object;
-HSPLjava/util/Locale;->setDefault(Ljava/util/Locale$Category;Ljava/util/Locale;)V
-HSPLjava/util/Locale;->setDefault(Ljava/util/Locale;)V
-HSPLjava/util/Locale;->toLanguageTag()Ljava/lang/String;
-HSPLjava/util/Locale;->toString()Ljava/lang/String;
-HSPLjava/util/Locale;->writeObject(Ljava/io/ObjectOutputStream;)V
-HSPLjava/util/Map;->computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;+]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/function/Function;missing_types
-HSPLjava/util/Map;->entry(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map$Entry;
-HSPLjava/util/Map;->forEach(Ljava/util/function/BiConsumer;)V+]Ljava/util/Map$Entry;Ljava/util/KeyValueHolder;]Ljava/util/Map;Ljava/util/ImmutableCollections$MapN;]Ljava/util/Iterator;Ljava/util/ImmutableCollections$MapN$MapNIterator;]Ljava/util/Set;Ljava/util/ImmutableCollections$MapN$1;
-HSPLjava/util/Map;->getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/util/Map;Landroid/util/ArrayMap;
-HSPLjava/util/Map;->of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
-HSPLjava/util/Map;->ofEntries([Ljava/util/Map$Entry;)Ljava/util/Map;
-HSPLjava/util/MissingResourceException;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/util/NoSuchElementException;-><init>()V
-HSPLjava/util/NoSuchElementException;-><init>(Ljava/lang/String;)V
-HSPLjava/util/Objects;->checkFromIndexSize(III)I
-HSPLjava/util/Objects;->checkFromToIndex(III)I
-HSPLjava/util/Objects;->checkIndex(II)I
-HSPLjava/util/Objects;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/Objects;->hash([Ljava/lang/Object;)I
-HSPLjava/util/Objects;->hashCode(Ljava/lang/Object;)I
-HSPLjava/util/Objects;->nonNull(Ljava/lang/Object;)Z
-HSPLjava/util/Objects;->requireNonNull(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Objects;->requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
-HSPLjava/util/Objects;->requireNonNullElse(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Objects;->toString(Ljava/lang/Object;)Ljava/lang/String;
-HSPLjava/util/Objects;->toString(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/Observable;-><init>()V
-HSPLjava/util/Observable;->addObserver(Ljava/util/Observer;)V
-HSPLjava/util/Observable;->clearChanged()V
-HSPLjava/util/Observable;->deleteObserver(Ljava/util/Observer;)V
-HSPLjava/util/Observable;->hasChanged()Z
-HSPLjava/util/Observable;->notifyObservers()V
-HSPLjava/util/Observable;->notifyObservers(Ljava/lang/Object;)V
-HSPLjava/util/Observable;->setChanged()V
-HSPLjava/util/Optional;-><init>(Ljava/lang/Object;)V
-HSPLjava/util/Optional;->empty()Ljava/util/Optional;
-HSPLjava/util/Optional;->flatMap(Ljava/util/function/Function;)Ljava/util/Optional;
-HSPLjava/util/Optional;->get()Ljava/lang/Object;
-HSPLjava/util/Optional;->ifPresent(Ljava/util/function/Consumer;)V
-HSPLjava/util/Optional;->isPresent()Z
-HSPLjava/util/Optional;->map(Ljava/util/function/Function;)Ljava/util/Optional;
-HSPLjava/util/Optional;->of(Ljava/lang/Object;)Ljava/util/Optional;
-HSPLjava/util/Optional;->ofNullable(Ljava/lang/Object;)Ljava/util/Optional;
-HSPLjava/util/Optional;->orElse(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Optional;->orElseGet(Ljava/util/function/Supplier;)Ljava/lang/Object;
-HSPLjava/util/OptionalDouble;-><clinit>()V
-HSPLjava/util/OptionalDouble;-><init>()V
-HSPLjava/util/OptionalDouble;-><init>(D)V
-HSPLjava/util/OptionalDouble;->of(D)Ljava/util/OptionalDouble;
-HSPLjava/util/OptionalDouble;->orElseGet(Ljava/util/function/DoubleSupplier;)D
-HSPLjava/util/OptionalInt;-><init>(I)V
-HSPLjava/util/OptionalInt;->empty()Ljava/util/OptionalInt;
-HSPLjava/util/OptionalInt;->isPresent()Z
-HSPLjava/util/OptionalInt;->of(I)Ljava/util/OptionalInt;
-HSPLjava/util/PriorityQueue$Itr;-><init>(Ljava/util/PriorityQueue;)V
-HSPLjava/util/PriorityQueue$Itr;->hasNext()Z
-HSPLjava/util/PriorityQueue$Itr;->next()Ljava/lang/Object;
-HSPLjava/util/PriorityQueue$Itr;->remove()V
-HSPLjava/util/PriorityQueue;-><init>()V
-HSPLjava/util/PriorityQueue;-><init>(ILjava/util/Comparator;)V
-HSPLjava/util/PriorityQueue;-><init>(Ljava/util/Comparator;)V
-HSPLjava/util/PriorityQueue;-><init>(Ljava/util/PriorityQueue;)V
-HSPLjava/util/PriorityQueue;->add(Ljava/lang/Object;)Z
-HSPLjava/util/PriorityQueue;->clear()V
-HSPLjava/util/PriorityQueue;->comparator()Ljava/util/Comparator;
-HSPLjava/util/PriorityQueue;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/PriorityQueue;->grow(I)V
-HSPLjava/util/PriorityQueue;->indexOf(Ljava/lang/Object;)I
-HSPLjava/util/PriorityQueue;->initFromPriorityQueue(Ljava/util/PriorityQueue;)V
-HSPLjava/util/PriorityQueue;->iterator()Ljava/util/Iterator;
-HSPLjava/util/PriorityQueue;->offer(Ljava/lang/Object;)Z
-HSPLjava/util/PriorityQueue;->peek()Ljava/lang/Object;
-HSPLjava/util/PriorityQueue;->poll()Ljava/lang/Object;
-HSPLjava/util/PriorityQueue;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/PriorityQueue;->removeAt(I)Ljava/lang/Object;
-HSPLjava/util/PriorityQueue;->siftDown(ILjava/lang/Object;)V
-HSPLjava/util/PriorityQueue;->siftDownComparable(ILjava/lang/Object;[Ljava/lang/Object;I)V
-HSPLjava/util/PriorityQueue;->siftDownUsingComparator(ILjava/lang/Object;[Ljava/lang/Object;ILjava/util/Comparator;)V
-HSPLjava/util/PriorityQueue;->siftUp(ILjava/lang/Object;)V
-HSPLjava/util/PriorityQueue;->size()I
-HSPLjava/util/PriorityQueue;->toArray()[Ljava/lang/Object;
-HSPLjava/util/PriorityQueue;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/Properties$LineReader;->readLine()I
-HSPLjava/util/Properties;-><init>()V
-HSPLjava/util/Properties;-><init>(Ljava/util/Properties;)V
-HSPLjava/util/Properties;-><init>(Ljava/util/Properties;I)V
-HSPLjava/util/Properties;->containsKey(Ljava/lang/Object;)Z
-HSPLjava/util/Properties;->getProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/Properties;->getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/Properties;->load(Ljava/io/InputStream;)V
-HSPLjava/util/Properties;->load(Ljava/io/Reader;)V
-HSPLjava/util/Properties;->load0(Ljava/util/Properties$LineReader;)V
-HSPLjava/util/Properties;->loadConvert([CIILjava/lang/StringBuilder;)Ljava/lang/String;
-HSPLjava/util/Properties;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/Properties;->saveConvert(Ljava/lang/String;ZZ)Ljava/lang/String;
-HSPLjava/util/Properties;->setProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;
-HSPLjava/util/Properties;->store(Ljava/io/OutputStream;Ljava/lang/String;)V
-HSPLjava/util/Properties;->store0(Ljava/io/BufferedWriter;Ljava/lang/String;Z)V
-HSPLjava/util/Properties;->writeComments(Ljava/io/BufferedWriter;Ljava/lang/String;)V
-HSPLjava/util/PropertyResourceBundle;-><init>(Ljava/io/Reader;)V
-HSPLjava/util/Random;-><init>()V
-HSPLjava/util/Random;-><init>(J)V
-HSPLjava/util/Random;->initialScramble(J)J
-HSPLjava/util/Random;->next(I)I
-HSPLjava/util/Random;->nextBoolean()Z
-HSPLjava/util/Random;->nextBytes([B)V
-HSPLjava/util/Random;->nextDouble()D
-HSPLjava/util/Random;->nextFloat()F
-HSPLjava/util/Random;->nextGaussian()D
-HSPLjava/util/Random;->nextInt()I
-HSPLjava/util/Random;->nextInt(I)I
-HSPLjava/util/Random;->nextLong()J
-HSPLjava/util/Random;->readObject(Ljava/io/ObjectInputStream;)V
-HSPLjava/util/Random;->resetSeed(J)V
-HSPLjava/util/Random;->seedUniquifier()J
-HSPLjava/util/Random;->setSeed(J)V
-HSPLjava/util/Random;->writeObject(Ljava/io/ObjectOutputStream;)V
-HSPLjava/util/RegularEnumSet$EnumSetIterator;-><init>(Ljava/util/RegularEnumSet;)V
-HSPLjava/util/RegularEnumSet$EnumSetIterator;->hasNext()Z
-HSPLjava/util/RegularEnumSet$EnumSetIterator;->next()Ljava/lang/Enum;
-HSPLjava/util/RegularEnumSet$EnumSetIterator;->next()Ljava/lang/Object;
-HSPLjava/util/RegularEnumSet;-><init>(Ljava/lang/Class;[Ljava/lang/Enum;)V
-HSPLjava/util/RegularEnumSet;->add(Ljava/lang/Enum;)Z
-HSPLjava/util/RegularEnumSet;->add(Ljava/lang/Object;)Z
-HSPLjava/util/RegularEnumSet;->addAll()V
-HSPLjava/util/RegularEnumSet;->addAll(Ljava/util/Collection;)Z
-HSPLjava/util/RegularEnumSet;->clear()V
-HSPLjava/util/RegularEnumSet;->complement()V
-HSPLjava/util/RegularEnumSet;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/RegularEnumSet;->containsAll(Ljava/util/Collection;)Z
-HSPLjava/util/RegularEnumSet;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/RegularEnumSet;->isEmpty()Z
-HSPLjava/util/RegularEnumSet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/RegularEnumSet;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/RegularEnumSet;->size()I
-HSPLjava/util/ResourceBundle$BundleReference;-><init>(Ljava/util/ResourceBundle;Ljava/lang/ref/ReferenceQueue;Ljava/util/ResourceBundle$CacheKey;)V
-HSPLjava/util/ResourceBundle$BundleReference;->getCacheKey()Ljava/util/ResourceBundle$CacheKey;
-HSPLjava/util/ResourceBundle$CacheKey;-><init>(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/ClassLoader;)V
-HSPLjava/util/ResourceBundle$CacheKey;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/ResourceBundle$CacheKey;->getCause()Ljava/lang/Throwable;
-HSPLjava/util/ResourceBundle$CacheKey;->getLoader()Ljava/lang/ClassLoader;
-HSPLjava/util/ResourceBundle$CacheKey;->getLocale()Ljava/util/Locale;
-HSPLjava/util/ResourceBundle$CacheKey;->getName()Ljava/lang/String;
-HSPLjava/util/ResourceBundle$CacheKey;->hashCode()I
-HSPLjava/util/ResourceBundle$CacheKey;->setFormat(Ljava/lang/String;)V
-HSPLjava/util/ResourceBundle$CacheKey;->setLocale(Ljava/util/Locale;)Ljava/util/ResourceBundle$CacheKey;
-HSPLjava/util/ResourceBundle$Control$1;->run()Ljava/io/InputStream;
-HSPLjava/util/ResourceBundle$Control$1;->run()Ljava/lang/Object;
-HSPLjava/util/ResourceBundle$Control$CandidateListCache;->createObject(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/ResourceBundle$Control$CandidateListCache;->createObject(Lsun/util/locale/BaseLocale;)Ljava/util/List;
-HSPLjava/util/ResourceBundle$Control$CandidateListCache;->getDefaultList(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
-HSPLjava/util/ResourceBundle$Control;->getCandidateLocales(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/List;
-HSPLjava/util/ResourceBundle$Control;->getFallbackLocale(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/Locale;
-HSPLjava/util/ResourceBundle$Control;->getFormats(Ljava/lang/String;)Ljava/util/List;
-HSPLjava/util/ResourceBundle$Control;->getTimeToLive(Ljava/lang/String;Ljava/util/Locale;)J
-HSPLjava/util/ResourceBundle$Control;->newBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/String;Ljava/lang/ClassLoader;Z)Ljava/util/ResourceBundle;
-HSPLjava/util/ResourceBundle$Control;->toBundleName(Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;
-HSPLjava/util/ResourceBundle$Control;->toResourceName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/ResourceBundle$Control;->toResourceName0(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/ResourceBundle;-><init>()V
-HSPLjava/util/ResourceBundle;->findBundle(Ljava/util/ResourceBundle$CacheKey;Ljava/util/List;Ljava/util/List;ILjava/util/ResourceBundle$Control;Ljava/util/ResourceBundle;)Ljava/util/ResourceBundle;
-HSPLjava/util/ResourceBundle;->findBundleInCache(Ljava/util/ResourceBundle$CacheKey;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;
-HSPLjava/util/ResourceBundle;->getBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/ClassLoader;)Ljava/util/ResourceBundle;
-HSPLjava/util/ResourceBundle;->getBundleImpl(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/ClassLoader;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;
-HSPLjava/util/ResourceBundle;->getDefaultControl(Ljava/lang/String;)Ljava/util/ResourceBundle$Control;
-HSPLjava/util/ResourceBundle;->getObject(Ljava/lang/String;)Ljava/lang/Object;
-HSPLjava/util/ResourceBundle;->getString(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/ResourceBundle;->isValidBundle(Ljava/util/ResourceBundle;)Z
-HSPLjava/util/ResourceBundle;->loadBundle(Ljava/util/ResourceBundle$CacheKey;Ljava/util/List;Ljava/util/ResourceBundle$Control;Z)Ljava/util/ResourceBundle;
-HSPLjava/util/ResourceBundle;->putBundleInCache(Ljava/util/ResourceBundle$CacheKey;Ljava/util/ResourceBundle;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;
-HSPLjava/util/ResourceBundle;->setExpirationTime(Ljava/util/ResourceBundle$CacheKey;Ljava/util/ResourceBundle$Control;)V
-HSPLjava/util/ResourceBundle;->setParent(Ljava/util/ResourceBundle;)V
-HSPLjava/util/Scanner;-><init>(Ljava/io/InputStream;)V
-HSPLjava/util/Scanner;-><init>(Ljava/io/InputStream;Ljava/lang/String;)V
-HSPLjava/util/Scanner;-><init>(Ljava/lang/Readable;Ljava/util/regex/Pattern;)V
-HSPLjava/util/Scanner;-><init>(Ljava/lang/String;)V
-HSPLjava/util/Scanner;->clearCaches()V
-HSPLjava/util/Scanner;->close()V
-HSPLjava/util/Scanner;->ensureOpen()V
-HSPLjava/util/Scanner;->getCompleteTokenInBuffer(Ljava/util/regex/Pattern;)Ljava/lang/String;
-HSPLjava/util/Scanner;->hasNext()Z
-HSPLjava/util/Scanner;->hasTokenInBuffer()Z
-HSPLjava/util/Scanner;->makeReadable(Ljava/io/InputStream;Ljava/nio/charset/Charset;)Ljava/lang/Readable;
-HSPLjava/util/Scanner;->makeSpace()Z
-HSPLjava/util/Scanner;->next()Ljava/lang/String;
-HSPLjava/util/Scanner;->readInput()V
-HSPLjava/util/Scanner;->revertState(Z)Z
-HSPLjava/util/Scanner;->saveState()V
-HSPLjava/util/Scanner;->toCharset(Ljava/lang/String;)Ljava/nio/charset/Charset;
-HSPLjava/util/Scanner;->translateSavedIndexes(I)V
-HSPLjava/util/Scanner;->useDelimiter(Ljava/lang/String;)Ljava/util/Scanner;
-HSPLjava/util/Scanner;->useLocale(Ljava/util/Locale;)Ljava/util/Scanner;
-HSPLjava/util/ServiceLoader;->iterator()Ljava/util/Iterator;
-HSPLjava/util/ServiceLoader;->load(Ljava/lang/Class;Ljava/lang/ClassLoader;)Ljava/util/ServiceLoader;
-HSPLjava/util/ServiceLoader;->reload()V
-HSPLjava/util/Set;->of(Ljava/lang/Object;)Ljava/util/Set;
-HSPLjava/util/Set;->of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;
-HSPLjava/util/Set;->of([Ljava/lang/Object;)Ljava/util/Set;
-HSPLjava/util/Set;->spliterator()Ljava/util/Spliterator;
-HSPLjava/util/SimpleTimeZone;-><init>(ILjava/lang/String;)V
-HSPLjava/util/SimpleTimeZone;->clone()Ljava/lang/Object;
-HSPLjava/util/SimpleTimeZone;->getOffset(J)I
-HSPLjava/util/SimpleTimeZone;->getOffsets(J[I)I
-HSPLjava/util/SimpleTimeZone;->getRawOffset()I
-HSPLjava/util/SimpleTimeZone;->hasSameRules(Ljava/util/TimeZone;)Z
-HSPLjava/util/Spliterator$OfInt;->forEachRemaining(Ljava/util/function/Consumer;)V+]Ljava/util/Spliterator$OfInt;Ljava/util/Spliterators$IntArraySpliterator;,Ljava/util/Spliterators$EmptySpliterator$OfInt;,Ljava/util/stream/Streams$RangeIntSpliterator;,Ljava/lang/StringUTF16$CodePointsSpliteratorForString;
-HSPLjava/util/Spliterator;->getExactSizeIfKnown()J+]Ljava/util/Spliterator;megamorphic_types
-HSPLjava/util/Spliterators$ArraySpliterator;-><init>([Ljava/lang/Object;I)V
-HSPLjava/util/Spliterators$ArraySpliterator;-><init>([Ljava/lang/Object;III)V
-HSPLjava/util/Spliterators$ArraySpliterator;->characteristics()I
-HSPLjava/util/Spliterators$ArraySpliterator;->estimateSize()J
-HSPLjava/util/Spliterators$ArraySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-HSPLjava/util/Spliterators$ArraySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-HSPLjava/util/Spliterators$EmptySpliterator$OfInt;->forEachRemaining(Ljava/util/function/IntConsumer;)V
-HSPLjava/util/Spliterators$EmptySpliterator$OfRef;->forEachRemaining(Ljava/util/function/Consumer;)V
-HSPLjava/util/Spliterators$EmptySpliterator$OfRef;->tryAdvance(Ljava/util/function/Consumer;)Z
-HSPLjava/util/Spliterators$EmptySpliterator;->characteristics()I
-HSPLjava/util/Spliterators$EmptySpliterator;->estimateSize()J
-HSPLjava/util/Spliterators$EmptySpliterator;->forEachRemaining(Ljava/lang/Object;)V
-HSPLjava/util/Spliterators$EmptySpliterator;->tryAdvance(Ljava/lang/Object;)Z
-HSPLjava/util/Spliterators$IntArraySpliterator;-><init>([IIII)V
-HSPLjava/util/Spliterators$IntArraySpliterator;->characteristics()I
-HSPLjava/util/Spliterators$IntArraySpliterator;->estimateSize()J
-HSPLjava/util/Spliterators$IntArraySpliterator;->forEachRemaining(Ljava/util/function/IntConsumer;)V
-HSPLjava/util/Spliterators$IntArraySpliterator;->tryAdvance(Ljava/util/function/IntConsumer;)Z
-HSPLjava/util/Spliterators$IteratorSpliterator;-><init>(Ljava/util/Collection;I)V
-HSPLjava/util/Spliterators$IteratorSpliterator;->characteristics()I
-HSPLjava/util/Spliterators$IteratorSpliterator;->estimateSize()J
-HSPLjava/util/Spliterators$IteratorSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-HSPLjava/util/Spliterators$IteratorSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-HSPLjava/util/Spliterators;->checkFromToBounds(III)V
-HSPLjava/util/Spliterators;->emptyIntSpliterator()Ljava/util/Spliterator$OfInt;
-HSPLjava/util/Spliterators;->emptySpliterator()Ljava/util/Spliterator;
-HSPLjava/util/Spliterators;->spliterator(Ljava/util/Collection;I)Ljava/util/Spliterator;
-HSPLjava/util/Spliterators;->spliterator([IIII)Ljava/util/Spliterator$OfInt;
-HSPLjava/util/Spliterators;->spliterator([Ljava/lang/Object;I)Ljava/util/Spliterator;
-HSPLjava/util/Spliterators;->spliterator([Ljava/lang/Object;III)Ljava/util/Spliterator;
-HSPLjava/util/Stack;-><init>()V
-HSPLjava/util/Stack;->empty()Z
-HSPLjava/util/Stack;->peek()Ljava/lang/Object;
-HSPLjava/util/Stack;->pop()Ljava/lang/Object;
-HSPLjava/util/Stack;->push(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/StringJoiner;-><init>(Ljava/lang/CharSequence;)V
-HSPLjava/util/StringJoiner;-><init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V
-HSPLjava/util/StringJoiner;->add(Ljava/lang/CharSequence;)Ljava/util/StringJoiner;
-HSPLjava/util/StringJoiner;->compactElts()V
-HSPLjava/util/StringJoiner;->getChars(Ljava/lang/String;[CI)I
-HSPLjava/util/StringJoiner;->toString()Ljava/lang/String;
-HSPLjava/util/StringTokenizer;-><init>(Ljava/lang/String;)V
-HSPLjava/util/StringTokenizer;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/util/StringTokenizer;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLjava/util/StringTokenizer;->countTokens()I
-HSPLjava/util/StringTokenizer;->hasMoreElements()Z
-HSPLjava/util/StringTokenizer;->hasMoreTokens()Z
-HSPLjava/util/StringTokenizer;->nextToken()Ljava/lang/String;
-HSPLjava/util/StringTokenizer;->scanToken(I)I
-HSPLjava/util/StringTokenizer;->setMaxDelimCodePoint()V
-HSPLjava/util/StringTokenizer;->skipDelimiters(I)I
-HSPLjava/util/TaskQueue;-><init>()V
-HSPLjava/util/TaskQueue;->add(Ljava/util/TimerTask;)V
-HSPLjava/util/TaskQueue;->clear()V
-HSPLjava/util/TaskQueue;->fixDown(I)V
-HSPLjava/util/TaskQueue;->fixUp(I)V
-HSPLjava/util/TaskQueue;->getMin()Ljava/util/TimerTask;
-HSPLjava/util/TaskQueue;->isEmpty()Z
-HSPLjava/util/TaskQueue;->removeMin()V
-HSPLjava/util/TaskQueue;->rescheduleMin(J)V
-HSPLjava/util/TimSort;-><init>([Ljava/lang/Object;Ljava/util/Comparator;[Ljava/lang/Object;II)V
-HSPLjava/util/TimSort;->binarySort([Ljava/lang/Object;IIILjava/util/Comparator;)V
-HSPLjava/util/TimSort;->countRunAndMakeAscending([Ljava/lang/Object;IILjava/util/Comparator;)I
-HSPLjava/util/TimSort;->ensureCapacity(I)[Ljava/lang/Object;
-HSPLjava/util/TimSort;->gallopLeft(Ljava/lang/Object;[Ljava/lang/Object;IIILjava/util/Comparator;)I
-HSPLjava/util/TimSort;->gallopRight(Ljava/lang/Object;[Ljava/lang/Object;IIILjava/util/Comparator;)I
-HSPLjava/util/TimSort;->mergeAt(I)V
-HSPLjava/util/TimSort;->mergeCollapse()V
-HSPLjava/util/TimSort;->mergeForceCollapse()V
-HSPLjava/util/TimSort;->mergeHi(IIII)V
-HSPLjava/util/TimSort;->mergeLo(IIII)V
-HSPLjava/util/TimSort;->minRunLength(I)I
-HSPLjava/util/TimSort;->pushRun(II)V
-HSPLjava/util/TimSort;->reverseRange([Ljava/lang/Object;II)V
-HSPLjava/util/TimSort;->sort([Ljava/lang/Object;IILjava/util/Comparator;[Ljava/lang/Object;II)V
-HSPLjava/util/TimeZone;-><init>()V
-HSPLjava/util/TimeZone;->appendNumber(Ljava/lang/StringBuilder;II)V
-HSPLjava/util/TimeZone;->clone()Ljava/lang/Object;
-HSPLjava/util/TimeZone;->createGmtOffsetString(ZZI)Ljava/lang/String;
-HSPLjava/util/TimeZone;->getAvailableIDs()[Ljava/lang/String;
-HSPLjava/util/TimeZone;->getDefault()Ljava/util/TimeZone;
-HSPLjava/util/TimeZone;->getDefaultRef()Ljava/util/TimeZone;
-HSPLjava/util/TimeZone;->getDisplayName(ZI)Ljava/lang/String;
-HSPLjava/util/TimeZone;->getDisplayName(ZILjava/util/Locale;)Ljava/lang/String;
-HSPLjava/util/TimeZone;->getID()Ljava/lang/String;
-HSPLjava/util/TimeZone;->getTimeZone(Ljava/lang/String;)Ljava/util/TimeZone;
-HSPLjava/util/TimeZone;->setDefault(Ljava/util/TimeZone;)V
-HSPLjava/util/TimeZone;->setID(Ljava/lang/String;)V
-HSPLjava/util/TimeZone;->toZoneId()Ljava/time/ZoneId;
-HSPLjava/util/Timer;-><init>()V
-HSPLjava/util/Timer;-><init>(Ljava/lang/String;)V
-HSPLjava/util/Timer;-><init>(Ljava/lang/String;Z)V
-HSPLjava/util/Timer;->cancel()V
-HSPLjava/util/Timer;->sched(Ljava/util/TimerTask;JJ)V
-HSPLjava/util/Timer;->schedule(Ljava/util/TimerTask;J)V
-HSPLjava/util/Timer;->schedule(Ljava/util/TimerTask;JJ)V
-HSPLjava/util/Timer;->scheduleAtFixedRate(Ljava/util/TimerTask;JJ)V
-HSPLjava/util/Timer;->serialNumber()I
-HSPLjava/util/TimerTask;-><init>()V
-HSPLjava/util/TimerTask;->cancel()Z
-HSPLjava/util/TimerThread;-><init>(Ljava/util/TaskQueue;)V
-HSPLjava/util/TimerThread;->mainLoop()V
-HSPLjava/util/TimerThread;->run()V
-HSPLjava/util/TreeMap$AscendingSubMap$AscendingEntrySetView;-><init>(Ljava/util/TreeMap$AscendingSubMap;)V
-HSPLjava/util/TreeMap$AscendingSubMap$AscendingEntrySetView;->iterator()Ljava/util/Iterator;
-HSPLjava/util/TreeMap$AscendingSubMap;-><init>(Ljava/util/TreeMap;ZLjava/lang/Object;ZZLjava/lang/Object;Z)V
-HSPLjava/util/TreeMap$AscendingSubMap;->entrySet()Ljava/util/Set;
-HSPLjava/util/TreeMap$AscendingSubMap;->keyIterator()Ljava/util/Iterator;
-HSPLjava/util/TreeMap$DescendingSubMap;-><init>(Ljava/util/TreeMap;ZLjava/lang/Object;ZZLjava/lang/Object;Z)V
-HSPLjava/util/TreeMap$DescendingSubMap;->keyIterator()Ljava/util/Iterator;
-HSPLjava/util/TreeMap$DescendingSubMap;->subLowest()Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap$EntryIterator;-><init>(Ljava/util/TreeMap;Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap$EntryIterator;->next()Ljava/lang/Object;
-HSPLjava/util/TreeMap$EntryIterator;->next()Ljava/util/Map$Entry;
-HSPLjava/util/TreeMap$EntrySet;-><init>(Ljava/util/TreeMap;)V
-HSPLjava/util/TreeMap$EntrySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/TreeMap$EntrySet;->size()I
-HSPLjava/util/TreeMap$KeyIterator;-><init>(Ljava/util/TreeMap;Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap$KeyIterator;->next()Ljava/lang/Object;
-HSPLjava/util/TreeMap$KeySet;-><init>(Ljava/util/NavigableMap;)V
-HSPLjava/util/TreeMap$KeySet;->isEmpty()Z
-HSPLjava/util/TreeMap$KeySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/TreeMap$KeySet;->size()I
-HSPLjava/util/TreeMap$NavigableSubMap$DescendingSubMapKeyIterator;-><init>(Ljava/util/TreeMap$NavigableSubMap;Ljava/util/TreeMap$TreeMapEntry;Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap$NavigableSubMap$DescendingSubMapKeyIterator;->next()Ljava/lang/Object;
-HSPLjava/util/TreeMap$NavigableSubMap$EntrySetView;-><init>(Ljava/util/TreeMap$NavigableSubMap;)V
-HSPLjava/util/TreeMap$NavigableSubMap$EntrySetView;->isEmpty()Z
-HSPLjava/util/TreeMap$NavigableSubMap$EntrySetView;->size()I
-HSPLjava/util/TreeMap$NavigableSubMap$SubMapEntryIterator;-><init>(Ljava/util/TreeMap$NavigableSubMap;Ljava/util/TreeMap$TreeMapEntry;Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap$NavigableSubMap$SubMapEntryIterator;->next()Ljava/lang/Object;
-HSPLjava/util/TreeMap$NavigableSubMap$SubMapEntryIterator;->next()Ljava/util/Map$Entry;
-HSPLjava/util/TreeMap$NavigableSubMap$SubMapEntryIterator;->remove()V
-HSPLjava/util/TreeMap$NavigableSubMap$SubMapIterator;-><init>(Ljava/util/TreeMap$NavigableSubMap;Ljava/util/TreeMap$TreeMapEntry;Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap$NavigableSubMap$SubMapIterator;->hasNext()Z
-HSPLjava/util/TreeMap$NavigableSubMap$SubMapIterator;->nextEntry()Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap$NavigableSubMap$SubMapIterator;->prevEntry()Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap$NavigableSubMap$SubMapIterator;->removeAscending()V
-HSPLjava/util/TreeMap$NavigableSubMap$SubMapKeyIterator;-><init>(Ljava/util/TreeMap$NavigableSubMap;Ljava/util/TreeMap$TreeMapEntry;Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap$NavigableSubMap$SubMapKeyIterator;->next()Ljava/lang/Object;
-HSPLjava/util/TreeMap$NavigableSubMap;-><init>(Ljava/util/TreeMap;ZLjava/lang/Object;ZZLjava/lang/Object;Z)V
-HSPLjava/util/TreeMap$NavigableSubMap;->absHighFence()Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap$NavigableSubMap;->absHighest()Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap$NavigableSubMap;->absLowFence()Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap$NavigableSubMap;->absLowest()Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap$NavigableSubMap;->firstKey()Ljava/lang/Object;
-HSPLjava/util/TreeMap$NavigableSubMap;->inRange(Ljava/lang/Object;)Z
-HSPLjava/util/TreeMap$NavigableSubMap;->isEmpty()Z
-HSPLjava/util/TreeMap$NavigableSubMap;->navigableKeySet()Ljava/util/NavigableSet;
-HSPLjava/util/TreeMap$NavigableSubMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/TreeMap$NavigableSubMap;->size()I
-HSPLjava/util/TreeMap$NavigableSubMap;->tooHigh(Ljava/lang/Object;)Z
-HSPLjava/util/TreeMap$NavigableSubMap;->tooLow(Ljava/lang/Object;)Z
-HSPLjava/util/TreeMap$PrivateEntryIterator;-><init>(Ljava/util/TreeMap;Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap$PrivateEntryIterator;->hasNext()Z
-HSPLjava/util/TreeMap$PrivateEntryIterator;->nextEntry()Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap$PrivateEntryIterator;->remove()V
-HSPLjava/util/TreeMap$TreeMapEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap$TreeMapEntry;->getKey()Ljava/lang/Object;
-HSPLjava/util/TreeMap$TreeMapEntry;->getValue()Ljava/lang/Object;
-HSPLjava/util/TreeMap$TreeMapEntry;->setValue(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/TreeMap$ValueIterator;-><init>(Ljava/util/TreeMap;Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap$ValueIterator;->next()Ljava/lang/Object;
-HSPLjava/util/TreeMap$Values;-><init>(Ljava/util/TreeMap;)V
-HSPLjava/util/TreeMap$Values;->iterator()Ljava/util/Iterator;
-HSPLjava/util/TreeMap$Values;->size()I
-HSPLjava/util/TreeMap;->-$$Nest$fgetmodCount(Ljava/util/TreeMap;)I
-HSPLjava/util/TreeMap;-><init>()V
-HSPLjava/util/TreeMap;-><init>(Ljava/util/Comparator;)V
-HSPLjava/util/TreeMap;-><init>(Ljava/util/Map;)V
-HSPLjava/util/TreeMap;->addAllForTreeSet(Ljava/util/SortedSet;Ljava/lang/Object;)V
-HSPLjava/util/TreeMap;->addEntry(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/TreeMap$TreeMapEntry;Z)V
-HSPLjava/util/TreeMap;->addEntryToEmptyMap(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLjava/util/TreeMap;->buildFromSorted(IIIILjava/util/Iterator;Ljava/io/ObjectInputStream;Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->buildFromSorted(ILjava/util/Iterator;Ljava/io/ObjectInputStream;Ljava/lang/Object;)V
-HSPLjava/util/TreeMap;->ceilingEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;
-HSPLjava/util/TreeMap;->ceilingKey(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/TreeMap;->clear()V
-HSPLjava/util/TreeMap;->clone()Ljava/lang/Object;
-HSPLjava/util/TreeMap;->colorOf(Ljava/util/TreeMap$TreeMapEntry;)Z
-HSPLjava/util/TreeMap;->comparator()Ljava/util/Comparator;
-HSPLjava/util/TreeMap;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/util/TreeMap;->computeRedLevel(I)I
-HSPLjava/util/TreeMap;->containsKey(Ljava/lang/Object;)Z
-HSPLjava/util/TreeMap;->deleteEntry(Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap;->descendingKeySet()Ljava/util/NavigableSet;
-HSPLjava/util/TreeMap;->descendingMap()Ljava/util/NavigableMap;
-HSPLjava/util/TreeMap;->entrySet()Ljava/util/Set;
-HSPLjava/util/TreeMap;->exportEntry(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/Map$Entry;
-HSPLjava/util/TreeMap;->firstKey()Ljava/lang/Object;
-HSPLjava/util/TreeMap;->fixAfterDeletion(Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap;->fixAfterInsertion(Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap;->floorEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;
-HSPLjava/util/TreeMap;->floorKey(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/TreeMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/TreeMap;->getCeilingEntry(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->getEntry(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->getEntryUsingComparator(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->getFirstEntry()Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->getFloorEntry(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->getHigherEntry(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->getLastEntry()Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->getLowerEntry(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->headMap(Ljava/lang/Object;Z)Ljava/util/NavigableMap;
-HSPLjava/util/TreeMap;->key(Ljava/util/TreeMap$TreeMapEntry;)Ljava/lang/Object;
-HSPLjava/util/TreeMap;->keyIterator()Ljava/util/Iterator;
-HSPLjava/util/TreeMap;->keyOrNull(Ljava/util/TreeMap$TreeMapEntry;)Ljava/lang/Object;
-HSPLjava/util/TreeMap;->keySet()Ljava/util/Set;
-HSPLjava/util/TreeMap;->lastKey()Ljava/lang/Object;
-HSPLjava/util/TreeMap;->leftOf(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->lowerEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;
-HSPLjava/util/TreeMap;->navigableKeySet()Ljava/util/NavigableSet;
-HSPLjava/util/TreeMap;->parentOf(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->pollFirstEntry()Ljava/util/Map$Entry;
-HSPLjava/util/TreeMap;->predecessor(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/TreeMap;->put(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;
-HSPLjava/util/TreeMap;->putAll(Ljava/util/Map;)V
-HSPLjava/util/TreeMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/TreeMap;->rightOf(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->rotateLeft(Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap;->rotateRight(Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap;->setColor(Ljava/util/TreeMap$TreeMapEntry;Z)V
-HSPLjava/util/TreeMap;->size()I
-HSPLjava/util/TreeMap;->subMap(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/SortedMap;
-HSPLjava/util/TreeMap;->subMap(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/NavigableMap;
-HSPLjava/util/TreeMap;->successor(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap;->tailMap(Ljava/lang/Object;Z)Ljava/util/NavigableMap;
-HSPLjava/util/TreeMap;->values()Ljava/util/Collection;
-HSPLjava/util/TreeSet;-><init>()V
-HSPLjava/util/TreeSet;-><init>(Ljava/util/Collection;)V
-HSPLjava/util/TreeSet;-><init>(Ljava/util/Comparator;)V
-HSPLjava/util/TreeSet;-><init>(Ljava/util/NavigableMap;)V
-HSPLjava/util/TreeSet;-><init>(Ljava/util/SortedSet;)V
-HSPLjava/util/TreeSet;->add(Ljava/lang/Object;)Z
-HSPLjava/util/TreeSet;->addAll(Ljava/util/Collection;)Z
-HSPLjava/util/TreeSet;->ceiling(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/TreeSet;->clear()V
-HSPLjava/util/TreeSet;->comparator()Ljava/util/Comparator;
-HSPLjava/util/TreeSet;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/TreeSet;->descendingSet()Ljava/util/NavigableSet;
-HSPLjava/util/TreeSet;->first()Ljava/lang/Object;
-HSPLjava/util/TreeSet;->floor(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/TreeSet;->isEmpty()Z
-HSPLjava/util/TreeSet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/TreeSet;->last()Ljava/lang/Object;
-HSPLjava/util/TreeSet;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/TreeSet;->size()I
-HSPLjava/util/TreeSet;->subSet(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/NavigableSet;
-HSPLjava/util/TreeSet;->tailSet(Ljava/lang/Object;Z)Ljava/util/NavigableSet;
-HSPLjava/util/UUID;-><init>(JJ)V
-HSPLjava/util/UUID;-><init>([B)V
-HSPLjava/util/UUID;->digits(JI)Ljava/lang/String;
-HSPLjava/util/UUID;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/UUID;->fromString(Ljava/lang/String;)Ljava/util/UUID;
-HSPLjava/util/UUID;->fromStringCurrentJava(Ljava/lang/String;)Ljava/util/UUID;
-HSPLjava/util/UUID;->fromStringJava8(Ljava/lang/String;)Ljava/util/UUID;
-HSPLjava/util/UUID;->getLeastSignificantBits()J
-HSPLjava/util/UUID;->getMostSignificantBits()J
-HSPLjava/util/UUID;->hashCode()I
-HSPLjava/util/UUID;->nameUUIDFromBytes([B)Ljava/util/UUID;
-HSPLjava/util/UUID;->parse4Nibbles(Ljava/lang/String;I)J
-HSPLjava/util/UUID;->randomUUID()Ljava/util/UUID;
-HSPLjava/util/UUID;->toString()Ljava/lang/String;
-HSPLjava/util/Vector$1;-><init>(Ljava/util/Vector;)V
-HSPLjava/util/Vector$1;->hasMoreElements()Z
-HSPLjava/util/Vector$1;->nextElement()Ljava/lang/Object;
-HSPLjava/util/Vector$Itr;-><init>(Ljava/util/Vector;)V
-HSPLjava/util/Vector$Itr;->checkForComodification()V
-HSPLjava/util/Vector$Itr;->hasNext()Z
-HSPLjava/util/Vector$Itr;->next()Ljava/lang/Object;
-HSPLjava/util/Vector;-><init>()V
-HSPLjava/util/Vector;-><init>(I)V
-HSPLjava/util/Vector;-><init>(II)V
-HSPLjava/util/Vector;->add(Ljava/lang/Object;)Z
-HSPLjava/util/Vector;->add(Ljava/lang/Object;[Ljava/lang/Object;I)V
-HSPLjava/util/Vector;->addElement(Ljava/lang/Object;)V
-HSPLjava/util/Vector;->clear()V
-HSPLjava/util/Vector;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/Vector;->copyInto([Ljava/lang/Object;)V
-HSPLjava/util/Vector;->elementAt(I)Ljava/lang/Object;
-HSPLjava/util/Vector;->elementData(I)Ljava/lang/Object;
-HSPLjava/util/Vector;->elements()Ljava/util/Enumeration;
-HSPLjava/util/Vector;->get(I)Ljava/lang/Object;
-HSPLjava/util/Vector;->indexOf(Ljava/lang/Object;)I
-HSPLjava/util/Vector;->indexOf(Ljava/lang/Object;I)I
-HSPLjava/util/Vector;->isEmpty()Z
-HSPLjava/util/Vector;->iterator()Ljava/util/Iterator;
-HSPLjava/util/Vector;->removeAllElements()V
-HSPLjava/util/Vector;->removeElement(Ljava/lang/Object;)Z
-HSPLjava/util/Vector;->removeElementAt(I)V
-HSPLjava/util/Vector;->size()I
-HSPLjava/util/Vector;->sort(Ljava/util/Comparator;)V
-HSPLjava/util/Vector;->toArray()[Ljava/lang/Object;
-HSPLjava/util/Vector;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/WeakHashMap$Entry;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;ILjava/util/WeakHashMap$Entry;)V
-HSPLjava/util/WeakHashMap$Entry;->getKey()Ljava/lang/Object;
-HSPLjava/util/WeakHashMap$Entry;->getValue()Ljava/lang/Object;
-HSPLjava/util/WeakHashMap$EntryIterator;-><init>(Ljava/util/WeakHashMap;)V
-HSPLjava/util/WeakHashMap$EntryIterator;->next()Ljava/lang/Object;
-HSPLjava/util/WeakHashMap$EntryIterator;->next()Ljava/util/Map$Entry;
-HSPLjava/util/WeakHashMap$EntrySet;-><init>(Ljava/util/WeakHashMap;)V
-HSPLjava/util/WeakHashMap$EntrySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/WeakHashMap$HashIterator;-><init>(Ljava/util/WeakHashMap;)V
-HSPLjava/util/WeakHashMap$HashIterator;->hasNext()Z
-HSPLjava/util/WeakHashMap$HashIterator;->nextEntry()Ljava/util/WeakHashMap$Entry;
-HSPLjava/util/WeakHashMap$KeyIterator;-><init>(Ljava/util/WeakHashMap;)V
-HSPLjava/util/WeakHashMap$KeyIterator;-><init>(Ljava/util/WeakHashMap;Ljava/util/WeakHashMap$KeyIterator-IA;)V
-HSPLjava/util/WeakHashMap$KeyIterator;->next()Ljava/lang/Object;
-HSPLjava/util/WeakHashMap$KeySet;-><init>(Ljava/util/WeakHashMap;)V
-HSPLjava/util/WeakHashMap$KeySet;-><init>(Ljava/util/WeakHashMap;Ljava/util/WeakHashMap$KeySet-IA;)V
-HSPLjava/util/WeakHashMap$KeySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/WeakHashMap$KeySet;->size()I
-HSPLjava/util/WeakHashMap$ValueIterator;-><init>(Ljava/util/WeakHashMap;)V
-HSPLjava/util/WeakHashMap$ValueIterator;->next()Ljava/lang/Object;
-HSPLjava/util/WeakHashMap$Values;-><init>(Ljava/util/WeakHashMap;)V
-HSPLjava/util/WeakHashMap$Values;->iterator()Ljava/util/Iterator;
-HSPLjava/util/WeakHashMap;-><init>()V
-HSPLjava/util/WeakHashMap;-><init>(I)V
-HSPLjava/util/WeakHashMap;-><init>(IF)V
-HSPLjava/util/WeakHashMap;->clear()V
-HSPLjava/util/WeakHashMap;->containsKey(Ljava/lang/Object;)Z
-HSPLjava/util/WeakHashMap;->entrySet()Ljava/util/Set;
-HSPLjava/util/WeakHashMap;->expungeStaleEntries()V
-HSPLjava/util/WeakHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/WeakHashMap;->getEntry(Ljava/lang/Object;)Ljava/util/WeakHashMap$Entry;
-HSPLjava/util/WeakHashMap;->getTable()[Ljava/util/WeakHashMap$Entry;
-HSPLjava/util/WeakHashMap;->hash(Ljava/lang/Object;)I
-HSPLjava/util/WeakHashMap;->indexFor(II)I
-HSPLjava/util/WeakHashMap;->isEmpty()Z
-HSPLjava/util/WeakHashMap;->keySet()Ljava/util/Set;
-HSPLjava/util/WeakHashMap;->maskNull(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/WeakHashMap;->matchesKey(Ljava/util/WeakHashMap$Entry;Ljava/lang/Object;)Z
-HSPLjava/util/WeakHashMap;->newTable(I)[Ljava/util/WeakHashMap$Entry;
-HSPLjava/util/WeakHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/WeakHashMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/WeakHashMap;->resize(I)V
-HSPLjava/util/WeakHashMap;->size()I
-HSPLjava/util/WeakHashMap;->transfer([Ljava/util/WeakHashMap$Entry;[Ljava/util/WeakHashMap$Entry;)V
-HSPLjava/util/WeakHashMap;->unmaskNull(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/WeakHashMap;->values()Ljava/util/Collection;
-HSPLjava/util/concurrent/AbstractExecutorService;-><init>()V
-HSPLjava/util/concurrent/AbstractExecutorService;->invokeAll(Ljava/util/Collection;JLjava/util/concurrent/TimeUnit;)Ljava/util/List;
-HSPLjava/util/concurrent/AbstractExecutorService;->newTaskFor(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/RunnableFuture;
-HSPLjava/util/concurrent/AbstractExecutorService;->newTaskFor(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/RunnableFuture;
-HSPLjava/util/concurrent/AbstractExecutorService;->submit(Ljava/lang/Runnable;)Ljava/util/concurrent/Future;
-HSPLjava/util/concurrent/AbstractExecutorService;->submit(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Future;
-HSPLjava/util/concurrent/AbstractExecutorService;->submit(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future;
-HSPLjava/util/concurrent/ArrayBlockingQueue;-><init>(I)V
-HSPLjava/util/concurrent/ArrayBlockingQueue;-><init>(IZ)V
-HSPLjava/util/concurrent/ArrayBlockingQueue;->add(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ArrayBlockingQueue;->dequeue()Ljava/lang/Object;
-HSPLjava/util/concurrent/ArrayBlockingQueue;->drainTo(Ljava/util/Collection;)I
-HSPLjava/util/concurrent/ArrayBlockingQueue;->drainTo(Ljava/util/Collection;I)I
-HSPLjava/util/concurrent/ArrayBlockingQueue;->enqueue(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/ArrayBlockingQueue;->itemAt(I)Ljava/lang/Object;
-HSPLjava/util/concurrent/ArrayBlockingQueue;->offer(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ArrayBlockingQueue;->peek()Ljava/lang/Object;
-HSPLjava/util/concurrent/ArrayBlockingQueue;->poll()Ljava/lang/Object;
-HSPLjava/util/concurrent/ArrayBlockingQueue;->poll(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ArrayBlockingQueue;->put(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/ArrayBlockingQueue;->size()I
-HSPLjava/util/concurrent/ArrayBlockingQueue;->take()Ljava/lang/Object;
-HSPLjava/util/concurrent/CancellationException;-><init>()V
-HSPLjava/util/concurrent/CancellationException;-><init>(Ljava/lang/String;)V
-HSPLjava/util/concurrent/CompletableFuture$AsyncRun;-><init>(Ljava/util/concurrent/CompletableFuture;Ljava/lang/Runnable;)V
-HSPLjava/util/concurrent/CompletableFuture$AsyncRun;->run()V
-HSPLjava/util/concurrent/CompletableFuture$AsyncSupply;-><init>(Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Supplier;)V
-HSPLjava/util/concurrent/CompletableFuture$AsyncSupply;->run()V
-HSPLjava/util/concurrent/CompletableFuture$Completion;-><init>()V
-HSPLjava/util/concurrent/CompletableFuture$Signaller;-><init>(ZJJ)V
-HSPLjava/util/concurrent/CompletableFuture$Signaller;->block()Z
-HSPLjava/util/concurrent/CompletableFuture$Signaller;->isReleasable()Z
-HSPLjava/util/concurrent/CompletableFuture$Signaller;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-HSPLjava/util/concurrent/CompletableFuture;-><init>()V
-HSPLjava/util/concurrent/CompletableFuture;->asyncRunStage(Ljava/util/concurrent/Executor;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;
-HSPLjava/util/concurrent/CompletableFuture;->asyncSupplyStage(Ljava/util/concurrent/Executor;Ljava/util/function/Supplier;)Ljava/util/concurrent/CompletableFuture;
-HSPLjava/util/concurrent/CompletableFuture;->complete(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CompletableFuture;->completeNull()Z
-HSPLjava/util/concurrent/CompletableFuture;->completeValue(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CompletableFuture;->get()Ljava/lang/Object;
-HSPLjava/util/concurrent/CompletableFuture;->get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
-HSPLjava/util/concurrent/CompletableFuture;->internalComplete(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CompletableFuture;->isDone()Z
-HSPLjava/util/concurrent/CompletableFuture;->join()Ljava/lang/Object;
-HSPLjava/util/concurrent/CompletableFuture;->postComplete()V
-HSPLjava/util/concurrent/CompletableFuture;->reportGet(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/CompletableFuture;->reportJoin(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/CompletableFuture;->runAsync(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;
-HSPLjava/util/concurrent/CompletableFuture;->screenExecutor(Ljava/util/concurrent/Executor;)Ljava/util/concurrent/Executor;
-HSPLjava/util/concurrent/CompletableFuture;->supplyAsync(Ljava/util/function/Supplier;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;
-HSPLjava/util/concurrent/CompletableFuture;->timedGet(J)Ljava/lang/Object;
-HSPLjava/util/concurrent/CompletableFuture;->tryPushStack(Ljava/util/concurrent/CompletableFuture$Completion;)Z
-HSPLjava/util/concurrent/CompletableFuture;->waitingGet(Z)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap$BaseIterator;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;IIILjava/util/concurrent/ConcurrentHashMap;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$BaseIterator;->hasNext()Z
-HSPLjava/util/concurrent/ConcurrentHashMap$BaseIterator;->remove()V
-HSPLjava/util/concurrent/ConcurrentHashMap$CollectionView;-><init>(Ljava/util/concurrent/ConcurrentHashMap;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$CollectionView;->size()I
-HSPLjava/util/concurrent/ConcurrentHashMap$CollectionView;->toArray()[Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap$CounterCell;-><init>(J)V
-HSPLjava/util/concurrent/ConcurrentHashMap$EntryIterator;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;IIILjava/util/concurrent/ConcurrentHashMap;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$EntryIterator;->next()Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap$EntryIterator;->next()Ljava/util/Map$Entry;
-HSPLjava/util/concurrent/ConcurrentHashMap$EntrySetView;-><init>(Ljava/util/concurrent/ConcurrentHashMap;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$EntrySetView;->iterator()Ljava/util/Iterator;
-HSPLjava/util/concurrent/ConcurrentHashMap$ForwardingNode;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$ForwardingNode;->find(ILjava/lang/Object;)Ljava/util/concurrent/ConcurrentHashMap$Node;
-HSPLjava/util/concurrent/ConcurrentHashMap$KeyIterator;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;IIILjava/util/concurrent/ConcurrentHashMap;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$KeyIterator;->next()Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap$KeySetView;-><init>(Ljava/util/concurrent/ConcurrentHashMap;Ljava/lang/Object;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$KeySetView;->iterator()Ljava/util/Iterator;
-HSPLjava/util/concurrent/ConcurrentHashMap$KeySetView;->spliterator()Ljava/util/Spliterator;
-HSPLjava/util/concurrent/ConcurrentHashMap$MapEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/concurrent/ConcurrentHashMap;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$MapEntry;->getKey()Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap$MapEntry;->getValue()Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap$Node;-><init>(ILjava/lang/Object;Ljava/lang/Object;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$Node;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/concurrent/ConcurrentHashMap$Node;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$ReservationNode;-><init>()V
-HSPLjava/util/concurrent/ConcurrentHashMap$Traverser;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;III)V
-HSPLjava/util/concurrent/ConcurrentHashMap$Traverser;->advance()Ljava/util/concurrent/ConcurrentHashMap$Node;
-HSPLjava/util/concurrent/ConcurrentHashMap$TreeBin;->find(ILjava/lang/Object;)Ljava/util/concurrent/ConcurrentHashMap$Node;
-HSPLjava/util/concurrent/ConcurrentHashMap$TreeNode;->findTreeNode(ILjava/lang/Object;Ljava/lang/Class;)Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-HSPLjava/util/concurrent/ConcurrentHashMap$ValueIterator;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;IIILjava/util/concurrent/ConcurrentHashMap;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$ValueIterator;->next()Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap$ValuesView;-><init>(Ljava/util/concurrent/ConcurrentHashMap;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$ValuesView;->iterator()Ljava/util/Iterator;
-HSPLjava/util/concurrent/ConcurrentHashMap;-><init>()V
-HSPLjava/util/concurrent/ConcurrentHashMap;-><init>(I)V
-HSPLjava/util/concurrent/ConcurrentHashMap;-><init>(IFI)V
-HSPLjava/util/concurrent/ConcurrentHashMap;-><init>(Ljava/util/Map;)V
-HSPLjava/util/concurrent/ConcurrentHashMap;->addCount(JI)V
-HSPLjava/util/concurrent/ConcurrentHashMap;->casTabAt([Ljava/util/concurrent/ConcurrentHashMap$Node;ILjava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$Node;)Z
-HSPLjava/util/concurrent/ConcurrentHashMap;->clear()V
-HSPLjava/util/concurrent/ConcurrentHashMap;->computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap;->containsKey(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentHashMap;->entrySet()Ljava/util/Set;
-HSPLjava/util/concurrent/ConcurrentHashMap;->forEach(Ljava/util/function/BiConsumer;)V
-HSPLjava/util/concurrent/ConcurrentHashMap;->fullAddCount(JZ)V
-HSPLjava/util/concurrent/ConcurrentHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap;->getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap;->helpTransfer([Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$Node;)[Ljava/util/concurrent/ConcurrentHashMap$Node;
-HSPLjava/util/concurrent/ConcurrentHashMap;->initTable()[Ljava/util/concurrent/ConcurrentHashMap$Node;
-HSPLjava/util/concurrent/ConcurrentHashMap;->isEmpty()Z
-HSPLjava/util/concurrent/ConcurrentHashMap;->keySet()Ljava/util/Set;
-HSPLjava/util/concurrent/ConcurrentHashMap;->mappingCount()J
-HSPLjava/util/concurrent/ConcurrentHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap;->putAll(Ljava/util/Map;)V
-HSPLjava/util/concurrent/ConcurrentHashMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap;->putVal(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap;->remove(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentHashMap;->replace(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentHashMap;->replaceNode(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap;->resizeStamp(I)I
-HSPLjava/util/concurrent/ConcurrentHashMap;->setTabAt([Ljava/util/concurrent/ConcurrentHashMap$Node;ILjava/util/concurrent/ConcurrentHashMap$Node;)V
-HSPLjava/util/concurrent/ConcurrentHashMap;->size()I
-HSPLjava/util/concurrent/ConcurrentHashMap;->spread(I)I
-HSPLjava/util/concurrent/ConcurrentHashMap;->sumCount()J
-HSPLjava/util/concurrent/ConcurrentHashMap;->tabAt([Ljava/util/concurrent/ConcurrentHashMap$Node;I)Ljava/util/concurrent/ConcurrentHashMap$Node;
-HSPLjava/util/concurrent/ConcurrentHashMap;->tableSizeFor(I)I
-HSPLjava/util/concurrent/ConcurrentHashMap;->transfer([Ljava/util/concurrent/ConcurrentHashMap$Node;[Ljava/util/concurrent/ConcurrentHashMap$Node;)V
-HSPLjava/util/concurrent/ConcurrentHashMap;->treeifyBin([Ljava/util/concurrent/ConcurrentHashMap$Node;I)V
-HSPLjava/util/concurrent/ConcurrentHashMap;->tryPresize(I)V
-HSPLjava/util/concurrent/ConcurrentHashMap;->values()Ljava/util/Collection;
-HSPLjava/util/concurrent/ConcurrentLinkedDeque$Node;-><init>()V
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;-><init>()V
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->add(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->first()Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->isEmpty()Z
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->linkLast(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->nextTerminator()Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->offerLast(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->peekFirst()Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->poll()Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->pollFirst()Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->prevTerminator()Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->size()I
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->skipDeletedPredecessors(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->skipDeletedSuccessors(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->succ(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->unlink(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->unlinkLast(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->updateHead()V
-HSPLjava/util/concurrent/ConcurrentLinkedDeque;->updateTail()V
-HSPLjava/util/concurrent/ConcurrentLinkedQueue$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentLinkedQueue$Itr;-><init>(Ljava/util/concurrent/ConcurrentLinkedQueue;)V
-HSPLjava/util/concurrent/ConcurrentLinkedQueue$Itr;->hasNext()Z
-HSPLjava/util/concurrent/ConcurrentLinkedQueue$Itr;->next()Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentLinkedQueue$Node;-><init>()V
-HSPLjava/util/concurrent/ConcurrentLinkedQueue$Node;-><init>(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/ConcurrentLinkedQueue$Node;->casItem(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;-><init>()V
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->add(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->bulkRemove(Ljava/util/function/Predicate;)Z
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->clear()V
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->first()Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->isEmpty()Z
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->iterator()Ljava/util/Iterator;
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->lambda$clear$2(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->offer(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->peek()Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->poll()Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->size()I
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->succ(Ljava/util/concurrent/ConcurrentLinkedQueue$Node;)Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->toArray()[Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->toArrayInternal([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->updateHead(Ljava/util/concurrent/ConcurrentLinkedQueue$Node;Ljava/util/concurrent/ConcurrentLinkedQueue$Node;)V
-HSPLjava/util/concurrent/ConcurrentSkipListMap$Index;-><init>(Ljava/util/concurrent/ConcurrentSkipListMap$Node;Ljava/util/concurrent/ConcurrentSkipListMap$Index;Ljava/util/concurrent/ConcurrentSkipListMap$Index;)V
-HSPLjava/util/concurrent/ConcurrentSkipListMap$Iter;-><init>(Ljava/util/concurrent/ConcurrentSkipListMap;)V
-HSPLjava/util/concurrent/ConcurrentSkipListMap$Iter;->hasNext()Z
-HSPLjava/util/concurrent/ConcurrentSkipListMap$Node;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/concurrent/ConcurrentSkipListMap$Node;)V
-HSPLjava/util/concurrent/ConcurrentSkipListMap;-><init>()V
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->addIndices(Ljava/util/concurrent/ConcurrentSkipListMap$Index;ILjava/util/concurrent/ConcurrentSkipListMap$Index;Ljava/util/Comparator;)Z
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->cpr(Ljava/util/Comparator;Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->doGet(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->doPut(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->doRemove(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->findFirst()Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->findPredecessor(Ljava/lang/Object;Ljava/util/Comparator;)Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->tryReduceLevel()V
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->unlinkNode(Ljava/util/concurrent/ConcurrentSkipListMap$Node;Ljava/util/concurrent/ConcurrentSkipListMap$Node;)V
-HSPLjava/util/concurrent/ConcurrentSkipListSet;-><init>()V
-HSPLjava/util/concurrent/ConcurrentSkipListSet;->add(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList$$ExternalSyntheticLambda2;-><init>(Ljava/util/Collection;)V
-HSPLjava/util/concurrent/CopyOnWriteArrayList$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList$COWIterator;-><init>([Ljava/lang/Object;I)V
-HSPLjava/util/concurrent/CopyOnWriteArrayList$COWIterator;->hasNext()Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList$COWIterator;->next()Ljava/lang/Object;
-HSPLjava/util/concurrent/CopyOnWriteArrayList;-><init>()V
-HSPLjava/util/concurrent/CopyOnWriteArrayList;-><init>(Ljava/util/Collection;)V
-HSPLjava/util/concurrent/CopyOnWriteArrayList;-><init>([Ljava/lang/Object;)V
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->add(ILjava/lang/Object;)V
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->add(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->addAll(Ljava/util/Collection;)Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->addAllAbsent(Ljava/util/Collection;)I
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->addIfAbsent(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->addIfAbsent(Ljava/lang/Object;[Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->bulkRemove(Ljava/util/function/Predicate;)Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->bulkRemove(Ljava/util/function/Predicate;II)Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->clear()V
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->elementAt([Ljava/lang/Object;I)Ljava/lang/Object;
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->get(I)Ljava/lang/Object;
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->getArray()[Ljava/lang/Object;
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->indexOf(Ljava/lang/Object;)I
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->indexOfRange(Ljava/lang/Object;[Ljava/lang/Object;II)I
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->isEmpty()Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->iterator()Ljava/util/Iterator;
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->lambda$removeAll$0(Ljava/util/Collection;Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->remove(I)Ljava/lang/Object;
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->remove(Ljava/lang/Object;[Ljava/lang/Object;I)Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->removeAll(Ljava/util/Collection;)Z
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->setArray([Ljava/lang/Object;)V
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->size()I
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->toArray()[Ljava/lang/Object;
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
-HSPLjava/util/concurrent/CopyOnWriteArrayList;->toString()Ljava/lang/String;
-HSPLjava/util/concurrent/CopyOnWriteArraySet;-><init>()V
-HSPLjava/util/concurrent/CopyOnWriteArraySet;-><init>(Ljava/util/Collection;)V
-HSPLjava/util/concurrent/CopyOnWriteArraySet;->add(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CopyOnWriteArraySet;->addAll(Ljava/util/Collection;)Z
-HSPLjava/util/concurrent/CopyOnWriteArraySet;->clear()V
-HSPLjava/util/concurrent/CopyOnWriteArraySet;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CopyOnWriteArraySet;->isEmpty()Z
-HSPLjava/util/concurrent/CopyOnWriteArraySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/concurrent/CopyOnWriteArraySet;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CopyOnWriteArraySet;->size()I
-HSPLjava/util/concurrent/CountDownLatch$Sync;-><init>(I)V
-HSPLjava/util/concurrent/CountDownLatch$Sync;->getCount()I
-HSPLjava/util/concurrent/CountDownLatch$Sync;->tryAcquireShared(I)I
-HSPLjava/util/concurrent/CountDownLatch$Sync;->tryReleaseShared(I)Z
-HSPLjava/util/concurrent/CountDownLatch;-><init>(I)V
-HSPLjava/util/concurrent/CountDownLatch;->await()V
-HSPLjava/util/concurrent/CountDownLatch;->await(JLjava/util/concurrent/TimeUnit;)Z
-HSPLjava/util/concurrent/CountDownLatch;->countDown()V
-HSPLjava/util/concurrent/CountDownLatch;->getCount()J
-HSPLjava/util/concurrent/DelayQueue;-><init>()V
-HSPLjava/util/concurrent/DelayQueue;->add(Ljava/util/concurrent/Delayed;)Z
-HSPLjava/util/concurrent/DelayQueue;->offer(Ljava/util/concurrent/Delayed;)Z
-HSPLjava/util/concurrent/ExecutionException;-><init>(Ljava/lang/Throwable;)V
-HSPLjava/util/concurrent/Executors$DefaultThreadFactory;-><init>()V
-HSPLjava/util/concurrent/Executors$DefaultThreadFactory;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;
-HSPLjava/util/concurrent/Executors$DelegatedExecutorService;-><init>(Ljava/util/concurrent/ExecutorService;)V
-HSPLjava/util/concurrent/Executors$DelegatedExecutorService;->awaitTermination(JLjava/util/concurrent/TimeUnit;)Z
-HSPLjava/util/concurrent/Executors$DelegatedExecutorService;->execute(Ljava/lang/Runnable;)V
-HSPLjava/util/concurrent/Executors$DelegatedExecutorService;->isShutdown()Z
-HSPLjava/util/concurrent/Executors$DelegatedExecutorService;->shutdown()V
-HSPLjava/util/concurrent/Executors$DelegatedExecutorService;->shutdownNow()Ljava/util/List;
-HSPLjava/util/concurrent/Executors$DelegatedExecutorService;->submit(Ljava/lang/Runnable;)Ljava/util/concurrent/Future;
-HSPLjava/util/concurrent/Executors$DelegatedExecutorService;->submit(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future;
-HSPLjava/util/concurrent/Executors$DelegatedScheduledExecutorService;-><init>(Ljava/util/concurrent/ScheduledExecutorService;)V
-HSPLjava/util/concurrent/Executors$DelegatedScheduledExecutorService;->schedule(Ljava/lang/Runnable;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;
-HSPLjava/util/concurrent/Executors$DelegatedScheduledExecutorService;->schedule(Ljava/util/concurrent/Callable;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;
-HSPLjava/util/concurrent/Executors$DelegatedScheduledExecutorService;->scheduleAtFixedRate(Ljava/lang/Runnable;JJLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;
-HSPLjava/util/concurrent/Executors$DelegatedScheduledExecutorService;->scheduleWithFixedDelay(Ljava/lang/Runnable;JJLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;
-HSPLjava/util/concurrent/Executors$FinalizableDelegatedExecutorService;-><init>(Ljava/util/concurrent/ExecutorService;)V
-HSPLjava/util/concurrent/Executors$FinalizableDelegatedExecutorService;->finalize()V
-HSPLjava/util/concurrent/Executors$RunnableAdapter;-><init>(Ljava/lang/Runnable;Ljava/lang/Object;)V
-HSPLjava/util/concurrent/Executors$RunnableAdapter;->call()Ljava/lang/Object;
-HSPLjava/util/concurrent/Executors;->callable(Ljava/lang/Runnable;)Ljava/util/concurrent/Callable;
-HSPLjava/util/concurrent/Executors;->callable(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Callable;
-HSPLjava/util/concurrent/Executors;->defaultThreadFactory()Ljava/util/concurrent/ThreadFactory;
-HSPLjava/util/concurrent/Executors;->newCachedThreadPool()Ljava/util/concurrent/ExecutorService;
-HSPLjava/util/concurrent/Executors;->newCachedThreadPool(Ljava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ExecutorService;
-HSPLjava/util/concurrent/Executors;->newFixedThreadPool(I)Ljava/util/concurrent/ExecutorService;
-HSPLjava/util/concurrent/Executors;->newFixedThreadPool(ILjava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ExecutorService;
-HSPLjava/util/concurrent/Executors;->newScheduledThreadPool(I)Ljava/util/concurrent/ScheduledExecutorService;
-HSPLjava/util/concurrent/Executors;->newScheduledThreadPool(ILjava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ScheduledExecutorService;
-HSPLjava/util/concurrent/Executors;->newSingleThreadExecutor()Ljava/util/concurrent/ExecutorService;
-HSPLjava/util/concurrent/Executors;->newSingleThreadExecutor(Ljava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ExecutorService;
-HSPLjava/util/concurrent/Executors;->newSingleThreadScheduledExecutor()Ljava/util/concurrent/ScheduledExecutorService;
-HSPLjava/util/concurrent/Executors;->newSingleThreadScheduledExecutor(Ljava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ScheduledExecutorService;
-HSPLjava/util/concurrent/Executors;->unconfigurableExecutorService(Ljava/util/concurrent/ExecutorService;)Ljava/util/concurrent/ExecutorService;
-HSPLjava/util/concurrent/Executors;->unconfigurableScheduledExecutorService(Ljava/util/concurrent/ScheduledExecutorService;)Ljava/util/concurrent/ScheduledExecutorService;
-HSPLjava/util/concurrent/ForkJoinPool;->managedBlock(Ljava/util/concurrent/ForkJoinPool$ManagedBlocker;)V
-HSPLjava/util/concurrent/ForkJoinPool;->unmanagedBlock(Ljava/util/concurrent/ForkJoinPool$ManagedBlocker;)V
-HSPLjava/util/concurrent/ForkJoinTask;-><init>()V
-HSPLjava/util/concurrent/FutureTask$WaitNode;-><init>()V
-HSPLjava/util/concurrent/FutureTask;-><init>(Ljava/lang/Runnable;Ljava/lang/Object;)V
-HSPLjava/util/concurrent/FutureTask;-><init>(Ljava/util/concurrent/Callable;)V
-HSPLjava/util/concurrent/FutureTask;->awaitDone(ZJ)I
-HSPLjava/util/concurrent/FutureTask;->cancel(Z)Z
-HSPLjava/util/concurrent/FutureTask;->done()V
-HSPLjava/util/concurrent/FutureTask;->finishCompletion()V
-HSPLjava/util/concurrent/FutureTask;->get()Ljava/lang/Object;
-HSPLjava/util/concurrent/FutureTask;->get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
-HSPLjava/util/concurrent/FutureTask;->handlePossibleCancellationInterrupt(I)V
-HSPLjava/util/concurrent/FutureTask;->isCancelled()Z
-HSPLjava/util/concurrent/FutureTask;->isDone()Z
-HSPLjava/util/concurrent/FutureTask;->removeWaiter(Ljava/util/concurrent/FutureTask$WaitNode;)V
-HSPLjava/util/concurrent/FutureTask;->report(I)Ljava/lang/Object;
-HSPLjava/util/concurrent/FutureTask;->run()V
-HSPLjava/util/concurrent/FutureTask;->runAndReset()Z
-HSPLjava/util/concurrent/FutureTask;->set(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/FutureTask;->setException(Ljava/lang/Throwable;)V
-HSPLjava/util/concurrent/LinkedBlockingDeque$Node;-><init>(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/LinkedBlockingDeque;-><init>()V
-HSPLjava/util/concurrent/LinkedBlockingDeque;-><init>(I)V
-HSPLjava/util/concurrent/LinkedBlockingDeque;->add(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/LinkedBlockingDeque;->addFirst(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/LinkedBlockingDeque;->addLast(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/LinkedBlockingDeque;->iterator()Ljava/util/Iterator;
-HSPLjava/util/concurrent/LinkedBlockingDeque;->linkFirst(Ljava/util/concurrent/LinkedBlockingDeque$Node;)Z
-HSPLjava/util/concurrent/LinkedBlockingDeque;->linkLast(Ljava/util/concurrent/LinkedBlockingDeque$Node;)Z
-HSPLjava/util/concurrent/LinkedBlockingDeque;->offer(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/LinkedBlockingDeque;->offerFirst(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/LinkedBlockingDeque;->offerLast(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/LinkedBlockingDeque;->peekFirst()Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingDeque;->poll()Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingDeque;->poll(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingDeque;->pollFirst()Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingDeque;->pollFirst(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingDeque;->size()I
-HSPLjava/util/concurrent/LinkedBlockingDeque;->take()Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingDeque;->takeFirst()Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingDeque;->unlinkFirst()Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingQueue$Node;-><init>(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/LinkedBlockingQueue;-><init>()V
-HSPLjava/util/concurrent/LinkedBlockingQueue;-><init>(I)V
-HSPLjava/util/concurrent/LinkedBlockingQueue;->clear()V
-HSPLjava/util/concurrent/LinkedBlockingQueue;->dequeue()Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingQueue;->drainTo(Ljava/util/Collection;)I
-HSPLjava/util/concurrent/LinkedBlockingQueue;->drainTo(Ljava/util/Collection;I)I
-HSPLjava/util/concurrent/LinkedBlockingQueue;->enqueue(Ljava/util/concurrent/LinkedBlockingQueue$Node;)V
-HSPLjava/util/concurrent/LinkedBlockingQueue;->fullyLock()V
-HSPLjava/util/concurrent/LinkedBlockingQueue;->fullyUnlock()V
-HSPLjava/util/concurrent/LinkedBlockingQueue;->offer(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/LinkedBlockingQueue;->poll()Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingQueue;->poll(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingQueue;->put(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/LinkedBlockingQueue;->signalNotEmpty()V
-HSPLjava/util/concurrent/LinkedBlockingQueue;->signalNotFull()V
-HSPLjava/util/concurrent/LinkedBlockingQueue;->size()I
-HSPLjava/util/concurrent/LinkedBlockingQueue;->take()Ljava/lang/Object;
-HSPLjava/util/concurrent/PriorityBlockingQueue;-><init>()V
-HSPLjava/util/concurrent/PriorityBlockingQueue;-><init>(ILjava/util/Comparator;)V
-HSPLjava/util/concurrent/PriorityBlockingQueue;->add(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/PriorityBlockingQueue;->dequeue()Ljava/lang/Object;
-HSPLjava/util/concurrent/PriorityBlockingQueue;->indexOf(Ljava/lang/Object;)I
-HSPLjava/util/concurrent/PriorityBlockingQueue;->offer(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/PriorityBlockingQueue;->peek()Ljava/lang/Object;
-HSPLjava/util/concurrent/PriorityBlockingQueue;->poll()Ljava/lang/Object;
-HSPLjava/util/concurrent/PriorityBlockingQueue;->put(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/PriorityBlockingQueue;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/PriorityBlockingQueue;->removeAt(I)V
-HSPLjava/util/concurrent/PriorityBlockingQueue;->siftDownComparable(ILjava/lang/Object;[Ljava/lang/Object;I)V
-HSPLjava/util/concurrent/PriorityBlockingQueue;->siftDownUsingComparator(ILjava/lang/Object;[Ljava/lang/Object;ILjava/util/Comparator;)V
-HSPLjava/util/concurrent/PriorityBlockingQueue;->siftUpComparable(ILjava/lang/Object;[Ljava/lang/Object;)V
-HSPLjava/util/concurrent/PriorityBlockingQueue;->siftUpUsingComparator(ILjava/lang/Object;[Ljava/lang/Object;Ljava/util/Comparator;)V
-HSPLjava/util/concurrent/PriorityBlockingQueue;->size()I
-HSPLjava/util/concurrent/PriorityBlockingQueue;->take()Ljava/lang/Object;
-HSPLjava/util/concurrent/PriorityBlockingQueue;->tryGrow([Ljava/lang/Object;I)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr;-><init>(Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;[Ljava/util/concurrent/RunnableScheduledFuture;)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr;->hasNext()Z
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr;->next()Ljava/lang/Object;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr;->next()Ljava/lang/Runnable;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr;->remove()V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;-><init>()V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->add(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->add(Ljava/lang/Runnable;)Z
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->drainTo(Ljava/util/Collection;)I
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->drainTo(Ljava/util/Collection;I)I
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->finishPoll(Ljava/util/concurrent/RunnableScheduledFuture;)Ljava/util/concurrent/RunnableScheduledFuture;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->grow()V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->indexOf(Ljava/lang/Object;)I
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->isEmpty()Z
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->iterator()Ljava/util/Iterator;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->offer(Ljava/lang/Runnable;)Z
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->poll(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->poll(JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/RunnableScheduledFuture;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->setIndex(Ljava/util/concurrent/RunnableScheduledFuture;I)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->siftDown(ILjava/util/concurrent/RunnableScheduledFuture;)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->siftUp(ILjava/util/concurrent/RunnableScheduledFuture;)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->size()I
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->take()Ljava/lang/Object;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->take()Ljava/util/concurrent/RunnableScheduledFuture;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->toArray()[Ljava/lang/Object;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;-><init>(Ljava/util/concurrent/ScheduledThreadPoolExecutor;Ljava/lang/Runnable;Ljava/lang/Object;JJ)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;-><init>(Ljava/util/concurrent/ScheduledThreadPoolExecutor;Ljava/lang/Runnable;Ljava/lang/Object;JJJ)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;-><init>(Ljava/util/concurrent/ScheduledThreadPoolExecutor;Ljava/util/concurrent/Callable;JJ)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->cancel(Z)Z
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->compareTo(Ljava/lang/Object;)I
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->compareTo(Ljava/util/concurrent/Delayed;)I
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->getDelay(Ljava/util/concurrent/TimeUnit;)J
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->isPeriodic()Z
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->run()V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->setNextRunTime()V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;-><init>(I)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;-><init>(ILjava/util/concurrent/ThreadFactory;)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;-><init>(ILjava/util/concurrent/ThreadFactory;Ljava/util/concurrent/RejectedExecutionHandler;)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->canRunInCurrentRunState(Ljava/util/concurrent/RunnableScheduledFuture;)Z
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->decorateTask(Ljava/lang/Runnable;Ljava/util/concurrent/RunnableScheduledFuture;)Ljava/util/concurrent/RunnableScheduledFuture;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->decorateTask(Ljava/util/concurrent/Callable;Ljava/util/concurrent/RunnableScheduledFuture;)Ljava/util/concurrent/RunnableScheduledFuture;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->delayedExecute(Ljava/util/concurrent/RunnableScheduledFuture;)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->execute(Ljava/lang/Runnable;)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->getContinueExistingPeriodicTasksAfterShutdownPolicy()Z
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->getExecuteExistingDelayedTasksAfterShutdownPolicy()Z
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->onShutdown()V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->reExecutePeriodic(Ljava/util/concurrent/RunnableScheduledFuture;)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->schedule(Ljava/lang/Runnable;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->schedule(Ljava/util/concurrent/Callable;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->scheduleAtFixedRate(Ljava/lang/Runnable;JJLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->scheduleWithFixedDelay(Ljava/lang/Runnable;JJLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->setRemoveOnCancelPolicy(Z)V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->shutdown()V
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->shutdownNow()Ljava/util/List;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->submit(Ljava/lang/Runnable;)Ljava/util/concurrent/Future;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->submit(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future;
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->triggerTime(J)J
-HSPLjava/util/concurrent/ScheduledThreadPoolExecutor;->triggerTime(JLjava/util/concurrent/TimeUnit;)J
-HSPLjava/util/concurrent/Semaphore$FairSync;-><init>(I)V
-HSPLjava/util/concurrent/Semaphore$FairSync;->tryAcquireShared(I)I
-HSPLjava/util/concurrent/Semaphore$NonfairSync;-><init>(I)V
-HSPLjava/util/concurrent/Semaphore$NonfairSync;->tryAcquireShared(I)I
-HSPLjava/util/concurrent/Semaphore$Sync;-><init>(I)V
-HSPLjava/util/concurrent/Semaphore$Sync;->getPermits()I
-HSPLjava/util/concurrent/Semaphore$Sync;->nonfairTryAcquireShared(I)I
-HSPLjava/util/concurrent/Semaphore$Sync;->tryReleaseShared(I)Z
-HSPLjava/util/concurrent/Semaphore;-><init>(I)V
-HSPLjava/util/concurrent/Semaphore;-><init>(IZ)V
-HSPLjava/util/concurrent/Semaphore;->acquire()V
-HSPLjava/util/concurrent/Semaphore;->acquireUninterruptibly()V
-HSPLjava/util/concurrent/Semaphore;->availablePermits()I
-HSPLjava/util/concurrent/Semaphore;->release()V
-HSPLjava/util/concurrent/Semaphore;->release(I)V
-HSPLjava/util/concurrent/Semaphore;->tryAcquire()Z
-HSPLjava/util/concurrent/Semaphore;->tryAcquire(IJLjava/util/concurrent/TimeUnit;)Z
-HSPLjava/util/concurrent/Semaphore;->tryAcquire(JLjava/util/concurrent/TimeUnit;)Z
-HSPLjava/util/concurrent/SynchronousQueue$TransferStack$SNode;-><init>(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/SynchronousQueue$TransferStack$SNode;->block()Z
-HSPLjava/util/concurrent/SynchronousQueue$TransferStack$SNode;->casNext(Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;)Z
-HSPLjava/util/concurrent/SynchronousQueue$TransferStack$SNode;->forgetWaiter()V
-HSPLjava/util/concurrent/SynchronousQueue$TransferStack$SNode;->isCancelled()Z
-HSPLjava/util/concurrent/SynchronousQueue$TransferStack$SNode;->isReleasable()Z
-HSPLjava/util/concurrent/SynchronousQueue$TransferStack$SNode;->tryMatch(Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;)Z
-HSPLjava/util/concurrent/SynchronousQueue$TransferStack;-><init>()V
-HSPLjava/util/concurrent/SynchronousQueue$TransferStack;->casHead(Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;)Z
-HSPLjava/util/concurrent/SynchronousQueue$TransferStack;->clean(Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;)V
-HSPLjava/util/concurrent/SynchronousQueue$TransferStack;->isFulfilling(I)Z
-HSPLjava/util/concurrent/SynchronousQueue$TransferStack;->snode(Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;Ljava/lang/Object;Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;I)Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;
-HSPLjava/util/concurrent/SynchronousQueue$TransferStack;->transfer(Ljava/lang/Object;ZJ)Ljava/lang/Object;
-HSPLjava/util/concurrent/SynchronousQueue$Transferer;-><init>()V
-HSPLjava/util/concurrent/SynchronousQueue;-><init>()V
-HSPLjava/util/concurrent/SynchronousQueue;-><init>(Z)V
-HSPLjava/util/concurrent/SynchronousQueue;->isEmpty()Z
-HSPLjava/util/concurrent/SynchronousQueue;->offer(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/SynchronousQueue;->poll(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
-HSPLjava/util/concurrent/SynchronousQueue;->size()I
-HSPLjava/util/concurrent/SynchronousQueue;->take()Ljava/lang/Object;
-HSPLjava/util/concurrent/ThreadLocalRandom;-><clinit>()V
-HSPLjava/util/concurrent/ThreadLocalRandom;-><init>()V
-HSPLjava/util/concurrent/ThreadLocalRandom;->current()Ljava/util/concurrent/ThreadLocalRandom;
-HSPLjava/util/concurrent/ThreadLocalRandom;->getProbe()I
-HSPLjava/util/concurrent/ThreadLocalRandom;->localInit()V
-HSPLjava/util/concurrent/ThreadLocalRandom;->mix32(J)I
-HSPLjava/util/concurrent/ThreadLocalRandom;->nextInt()I
-HSPLjava/util/concurrent/ThreadLocalRandom;->nextSecondarySeed()I
-HSPLjava/util/concurrent/ThreadLocalRandom;->nextSeed()J
-HSPLjava/util/concurrent/ThreadLocalRandom;->setSeed(J)V
-HSPLjava/util/concurrent/ThreadPoolExecutor$DiscardPolicy;-><init>()V
-HSPLjava/util/concurrent/ThreadPoolExecutor$Worker;-><init>(Ljava/util/concurrent/ThreadPoolExecutor;Ljava/lang/Runnable;)V
-HSPLjava/util/concurrent/ThreadPoolExecutor$Worker;->interruptIfStarted()V
-HSPLjava/util/concurrent/ThreadPoolExecutor$Worker;->isHeldExclusively()Z
-HSPLjava/util/concurrent/ThreadPoolExecutor$Worker;->isLocked()Z
-HSPLjava/util/concurrent/ThreadPoolExecutor$Worker;->lock()V
-HSPLjava/util/concurrent/ThreadPoolExecutor$Worker;->run()V
-HSPLjava/util/concurrent/ThreadPoolExecutor$Worker;->tryAcquire(I)Z
-HSPLjava/util/concurrent/ThreadPoolExecutor$Worker;->tryLock()Z
-HSPLjava/util/concurrent/ThreadPoolExecutor$Worker;->tryRelease(I)Z
-HSPLjava/util/concurrent/ThreadPoolExecutor$Worker;->unlock()V
-HSPLjava/util/concurrent/ThreadPoolExecutor;-><init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;-><init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/RejectedExecutionHandler;)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;-><init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/ThreadFactory;)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;-><init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/ThreadFactory;Ljava/util/concurrent/RejectedExecutionHandler;)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->addWorker(Ljava/lang/Runnable;Z)Z
-HSPLjava/util/concurrent/ThreadPoolExecutor;->advanceRunState(I)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->afterExecute(Ljava/lang/Runnable;Ljava/lang/Throwable;)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->allowCoreThreadTimeOut(Z)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->awaitTermination(JLjava/util/concurrent/TimeUnit;)Z
-HSPLjava/util/concurrent/ThreadPoolExecutor;->beforeExecute(Ljava/lang/Thread;Ljava/lang/Runnable;)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->checkShutdownAccess()V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->compareAndDecrementWorkerCount(I)Z
-HSPLjava/util/concurrent/ThreadPoolExecutor;->compareAndIncrementWorkerCount(I)Z
-HSPLjava/util/concurrent/ThreadPoolExecutor;->ctlOf(II)I
-HSPLjava/util/concurrent/ThreadPoolExecutor;->decrementWorkerCount()V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->drainQueue()Ljava/util/List;
-HSPLjava/util/concurrent/ThreadPoolExecutor;->ensurePrestart()V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->execute(Ljava/lang/Runnable;)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->finalize()V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->getCorePoolSize()I
-HSPLjava/util/concurrent/ThreadPoolExecutor;->getMaximumPoolSize()I
-HSPLjava/util/concurrent/ThreadPoolExecutor;->getQueue()Ljava/util/concurrent/BlockingQueue;
-HSPLjava/util/concurrent/ThreadPoolExecutor;->getRejectedExecutionHandler()Ljava/util/concurrent/RejectedExecutionHandler;
-HSPLjava/util/concurrent/ThreadPoolExecutor;->getTask()Ljava/lang/Runnable;
-HSPLjava/util/concurrent/ThreadPoolExecutor;->getThreadFactory()Ljava/util/concurrent/ThreadFactory;
-HSPLjava/util/concurrent/ThreadPoolExecutor;->interruptIdleWorkers()V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->interruptIdleWorkers(Z)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->interruptWorkers()V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->isRunning(I)Z
-HSPLjava/util/concurrent/ThreadPoolExecutor;->isShutdown()Z
-HSPLjava/util/concurrent/ThreadPoolExecutor;->isTerminated()Z
-HSPLjava/util/concurrent/ThreadPoolExecutor;->onShutdown()V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->prestartAllCoreThreads()I
-HSPLjava/util/concurrent/ThreadPoolExecutor;->prestartCoreThread()Z
-HSPLjava/util/concurrent/ThreadPoolExecutor;->processWorkerExit(Ljava/util/concurrent/ThreadPoolExecutor$Worker;Z)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->purge()V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->remove(Ljava/lang/Runnable;)Z
-HSPLjava/util/concurrent/ThreadPoolExecutor;->runStateAtLeast(II)Z
-HSPLjava/util/concurrent/ThreadPoolExecutor;->runStateLessThan(II)Z
-HSPLjava/util/concurrent/ThreadPoolExecutor;->runStateOf(I)I
-HSPLjava/util/concurrent/ThreadPoolExecutor;->runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->setCorePoolSize(I)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->setKeepAliveTime(JLjava/util/concurrent/TimeUnit;)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->setMaximumPoolSize(I)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->setRejectedExecutionHandler(Ljava/util/concurrent/RejectedExecutionHandler;)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->setThreadFactory(Ljava/util/concurrent/ThreadFactory;)V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->shutdown()V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->shutdownNow()Ljava/util/List;
-HSPLjava/util/concurrent/ThreadPoolExecutor;->terminated()V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->toString()Ljava/lang/String;
-HSPLjava/util/concurrent/ThreadPoolExecutor;->tryTerminate()V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->workerCountOf(I)I
-HSPLjava/util/concurrent/TimeUnit;->convert(JLjava/util/concurrent/TimeUnit;)J
-HSPLjava/util/concurrent/TimeUnit;->cvt(JJJ)J
-HSPLjava/util/concurrent/TimeUnit;->sleep(J)V
-HSPLjava/util/concurrent/TimeUnit;->toDays(J)J
-HSPLjava/util/concurrent/TimeUnit;->toHours(J)J
-HSPLjava/util/concurrent/TimeUnit;->toMicros(J)J
-HSPLjava/util/concurrent/TimeUnit;->toMillis(J)J
-HSPLjava/util/concurrent/TimeUnit;->toMinutes(J)J
-HSPLjava/util/concurrent/TimeUnit;->toNanos(J)J
-HSPLjava/util/concurrent/TimeUnit;->toSeconds(J)J
-HSPLjava/util/concurrent/TimeUnit;->values()[Ljava/util/concurrent/TimeUnit;
-HSPLjava/util/concurrent/TimeoutException;-><init>()V
-HSPLjava/util/concurrent/TimeoutException;-><init>(Ljava/lang/String;)V
-HSPLjava/util/concurrent/atomic/AtomicBoolean;-><init>()V
-HSPLjava/util/concurrent/atomic/AtomicBoolean;-><init>(Z)V
-HSPLjava/util/concurrent/atomic/AtomicBoolean;->compareAndSet(ZZ)Z
-HSPLjava/util/concurrent/atomic/AtomicBoolean;->get()Z
-HSPLjava/util/concurrent/atomic/AtomicBoolean;->getAndSet(Z)Z
-HSPLjava/util/concurrent/atomic/AtomicBoolean;->lazySet(Z)V
-HSPLjava/util/concurrent/atomic/AtomicBoolean;->set(Z)V
-HSPLjava/util/concurrent/atomic/AtomicBoolean;->toString()Ljava/lang/String;
-HSPLjava/util/concurrent/atomic/AtomicInteger;-><init>()V
-HSPLjava/util/concurrent/atomic/AtomicInteger;-><init>(I)V
-HSPLjava/util/concurrent/atomic/AtomicInteger;->addAndGet(I)I
-HSPLjava/util/concurrent/atomic/AtomicInteger;->compareAndSet(II)Z
-HSPLjava/util/concurrent/atomic/AtomicInteger;->decrementAndGet()I
-HSPLjava/util/concurrent/atomic/AtomicInteger;->get()I
-HSPLjava/util/concurrent/atomic/AtomicInteger;->getAndAdd(I)I
-HSPLjava/util/concurrent/atomic/AtomicInteger;->getAndDecrement()I
-HSPLjava/util/concurrent/atomic/AtomicInteger;->getAndIncrement()I
-HSPLjava/util/concurrent/atomic/AtomicInteger;->getAndSet(I)I
-HSPLjava/util/concurrent/atomic/AtomicInteger;->incrementAndGet()I
-HSPLjava/util/concurrent/atomic/AtomicInteger;->intValue()I
-HSPLjava/util/concurrent/atomic/AtomicInteger;->lazySet(I)V
-HSPLjava/util/concurrent/atomic/AtomicInteger;->set(I)V
-HSPLjava/util/concurrent/atomic/AtomicInteger;->weakCompareAndSetVolatile(II)Z
-HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;-><init>(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)V
-HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->accessCheck(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->compareAndSet(Ljava/lang/Object;II)Z
-HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->decrementAndGet(Ljava/lang/Object;)I
-HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->getAndAdd(Ljava/lang/Object;I)I
-HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->getAndIncrement(Ljava/lang/Object;)I
-HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->incrementAndGet(Ljava/lang/Object;)I
-HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->set(Ljava/lang/Object;I)V
-HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater;-><init>()V
-HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater;->newUpdater(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater;
-HSPLjava/util/concurrent/atomic/AtomicLong;-><init>()V
-HSPLjava/util/concurrent/atomic/AtomicLong;-><init>(J)V
-HSPLjava/util/concurrent/atomic/AtomicLong;->addAndGet(J)J
-HSPLjava/util/concurrent/atomic/AtomicLong;->compareAndSet(JJ)Z
-HSPLjava/util/concurrent/atomic/AtomicLong;->decrementAndGet()J
-HSPLjava/util/concurrent/atomic/AtomicLong;->get()J
-HSPLjava/util/concurrent/atomic/AtomicLong;->getAndAdd(J)J
-HSPLjava/util/concurrent/atomic/AtomicLong;->getAndIncrement()J
-HSPLjava/util/concurrent/atomic/AtomicLong;->getAndSet(J)J
-HSPLjava/util/concurrent/atomic/AtomicLong;->incrementAndGet()J
-HSPLjava/util/concurrent/atomic/AtomicLong;->lazySet(J)V
-HSPLjava/util/concurrent/atomic/AtomicLong;->set(J)V
-HSPLjava/util/concurrent/atomic/AtomicLong;->toString()Ljava/lang/String;
-HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;-><init>(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)V
-HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->accessCheck(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->addAndGet(Ljava/lang/Object;J)J
-HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->compareAndSet(Ljava/lang/Object;JJ)Z
-HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->getAndAdd(Ljava/lang/Object;J)J
-HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->getAndIncrement(Ljava/lang/Object;)J
-HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->incrementAndGet(Ljava/lang/Object;)J
-HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater;-><init>()V
-HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater;->newUpdater(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicLongFieldUpdater;
-HSPLjava/util/concurrent/atomic/AtomicReference;-><init>()V
-HSPLjava/util/concurrent/atomic/AtomicReference;-><init>(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/atomic/AtomicReference;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/atomic/AtomicReference;->get()Ljava/lang/Object;
-HSPLjava/util/concurrent/atomic/AtomicReference;->getAndSet(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/atomic/AtomicReference;->lazySet(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/atomic/AtomicReference;->set(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/atomic/AtomicReference;->toString()Ljava/lang/String;
-HSPLjava/util/concurrent/atomic/AtomicReference;->updateAndGet(Ljava/util/function/UnaryOperator;)Ljava/lang/Object;
-HSPLjava/util/concurrent/atomic/AtomicReference;->weakCompareAndSetVolatile(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/atomic/AtomicReferenceArray;-><init>(I)V
-HSPLjava/util/concurrent/atomic/AtomicReferenceArray;->compareAndSet(ILjava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/atomic/AtomicReferenceArray;->get(I)Ljava/lang/Object;
-HSPLjava/util/concurrent/atomic/AtomicReferenceArray;->getAcquire(I)Ljava/lang/Object;
-HSPLjava/util/concurrent/atomic/AtomicReferenceArray;->getAndSet(ILjava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/atomic/AtomicReferenceArray;->lazySet(ILjava/lang/Object;)V
-HSPLjava/util/concurrent/atomic/AtomicReferenceArray;->length()I
-HSPLjava/util/concurrent/atomic/AtomicReferenceArray;->set(ILjava/lang/Object;)V
-HSPLjava/util/concurrent/atomic/AtomicReferenceArray;->setRelease(ILjava/lang/Object;)V
-HSPLjava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;-><init>(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)V
-HSPLjava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->accessCheck(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->getAndSet(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->lazySet(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLjava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->valueCheck(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/atomic/AtomicReferenceFieldUpdater;-><init>()V
-HSPLjava/util/concurrent/atomic/AtomicReferenceFieldUpdater;->newUpdater(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;
-HSPLjava/util/concurrent/atomic/LongAdder;-><init>()V
-HSPLjava/util/concurrent/atomic/LongAdder;->add(J)V
-HSPLjava/util/concurrent/atomic/Striped64$Cell;-><clinit>()V
-HSPLjava/util/concurrent/atomic/Striped64$Cell;-><init>(J)V
-HSPLjava/util/concurrent/atomic/Striped64$Cell;->cas(JJ)Z
-HSPLjava/util/concurrent/atomic/Striped64;-><init>()V
-HSPLjava/util/concurrent/atomic/Striped64;->casBase(JJ)Z
-HSPLjava/util/concurrent/atomic/Striped64;->casCellsBusy()Z
-HSPLjava/util/concurrent/atomic/Striped64;->getProbe()I
-HSPLjava/util/concurrent/locks/AbstractOwnableSynchronizer;-><init>()V
-HSPLjava/util/concurrent/locks/AbstractOwnableSynchronizer;->getExclusiveOwnerThread()Ljava/lang/Thread;
-HSPLjava/util/concurrent/locks/AbstractOwnableSynchronizer;->setExclusiveOwnerThread(Ljava/lang/Thread;)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;-><init>()V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;->block()Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;->isReleasable()Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;-><init>(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->await()V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->awaitNanos(J)J
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->canReacquire(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;)Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->doSignal(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;Z)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->enableWait(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;)I
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->hasWaiters()Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->isOwnedBy(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;)Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->signal()V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->signalAll()V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->unlinkCancelledWaiters(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ExclusiveNode;-><init>()V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;-><init>()V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->clearStatus()V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->getAndUnsetStatus(I)I
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->setPrevRelaxed(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->setStatusRelaxed(I)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$SharedNode;-><init>()V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->-$$Nest$sfgetU()Ljdk/internal/misc/Unsafe;
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;-><init>()V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->acquire(I)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->acquire(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;IZZZJ)I
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->acquireInterruptibly(I)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->acquireShared(I)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->acquireSharedInterruptibly(I)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->apparentlyFirstQueuedIsExclusive()Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->casTail(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->cleanQueue()V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->compareAndSetState(II)Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->enqueue(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->getFirstQueuedThread()Ljava/lang/Thread;
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->getState()I
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->hasQueuedPredecessors()Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->hasQueuedThreads()Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->hasWaiters(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->isEnqueued(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->owns(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->release(I)Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->releaseShared(I)Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->setState(I)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->signalNext(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->signalNextIfShared(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->tryAcquireNanos(IJ)Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->tryAcquireSharedNanos(IJ)Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->tryInitializeHead()V
-HSPLjava/util/concurrent/locks/LockSupport;->park()V
-HSPLjava/util/concurrent/locks/LockSupport;->park(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/locks/LockSupport;->parkNanos(J)V
-HSPLjava/util/concurrent/locks/LockSupport;->parkNanos(Ljava/lang/Object;J)V
-HSPLjava/util/concurrent/locks/LockSupport;->setBlocker(Ljava/lang/Thread;Ljava/lang/Object;)V
-HSPLjava/util/concurrent/locks/LockSupport;->setCurrentBlocker(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/locks/LockSupport;->unpark(Ljava/lang/Thread;)V
-HSPLjava/util/concurrent/locks/ReentrantLock$FairSync;-><init>()V
-HSPLjava/util/concurrent/locks/ReentrantLock$FairSync;->initialTryLock()Z
-HSPLjava/util/concurrent/locks/ReentrantLock$FairSync;->tryAcquire(I)Z
-HSPLjava/util/concurrent/locks/ReentrantLock$NonfairSync;-><init>()V
-HSPLjava/util/concurrent/locks/ReentrantLock$NonfairSync;->initialTryLock()Z
-HSPLjava/util/concurrent/locks/ReentrantLock$NonfairSync;->tryAcquire(I)Z
-HSPLjava/util/concurrent/locks/ReentrantLock$Sync;-><init>()V
-HSPLjava/util/concurrent/locks/ReentrantLock$Sync;->isHeldExclusively()Z
-HSPLjava/util/concurrent/locks/ReentrantLock$Sync;->lock()V
-HSPLjava/util/concurrent/locks/ReentrantLock$Sync;->lockInterruptibly()V
-HSPLjava/util/concurrent/locks/ReentrantLock$Sync;->newCondition()Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;
-HSPLjava/util/concurrent/locks/ReentrantLock$Sync;->tryLock()Z
-HSPLjava/util/concurrent/locks/ReentrantLock$Sync;->tryRelease(I)Z
-HSPLjava/util/concurrent/locks/ReentrantLock;-><init>()V
-HSPLjava/util/concurrent/locks/ReentrantLock;-><init>(Z)V
-HSPLjava/util/concurrent/locks/ReentrantLock;->hasWaiters(Ljava/util/concurrent/locks/Condition;)Z
-HSPLjava/util/concurrent/locks/ReentrantLock;->isHeldByCurrentThread()Z
-HSPLjava/util/concurrent/locks/ReentrantLock;->lock()V
-HSPLjava/util/concurrent/locks/ReentrantLock;->lockInterruptibly()V
-HSPLjava/util/concurrent/locks/ReentrantLock;->newCondition()Ljava/util/concurrent/locks/Condition;
-HSPLjava/util/concurrent/locks/ReentrantLock;->tryLock()Z
-HSPLjava/util/concurrent/locks/ReentrantLock;->tryLock(JLjava/util/concurrent/TimeUnit;)Z
-HSPLjava/util/concurrent/locks/ReentrantLock;->unlock()V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$FairSync;-><init>()V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$FairSync;->readerShouldBlock()Z
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$FairSync;->writerShouldBlock()Z
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;-><init>()V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;->readerShouldBlock()Z
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;->writerShouldBlock()Z
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;-><init>(Ljava/util/concurrent/locks/ReentrantReadWriteLock;)V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;->lock()V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;->unlock()V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync$HoldCounter;-><init>()V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter;-><init>()V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter;->initialValue()Ljava/lang/Object;
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter;->initialValue()Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync$HoldCounter;
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync;-><init>()V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->exclusiveCount(I)I
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->fullTryAcquireShared(Ljava/lang/Thread;)I
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->getReadHoldCount()I
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->getReadLockCount()I
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->isHeldExclusively()Z
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->sharedCount(I)I
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->tryAcquire(I)Z
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->tryAcquireShared(I)I
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->tryRelease(I)Z
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->tryReleaseShared(I)Z
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;-><init>(Ljava/util/concurrent/locks/ReentrantReadWriteLock;)V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;->lock()V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;->unlock()V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock;-><init>()V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock;-><init>(Z)V
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock;->getReadHoldCount()I
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock;->readLock()Ljava/util/concurrent/locks/Lock;
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock;->readLock()Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock;->writeLock()Ljava/util/concurrent/locks/Lock;
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock;->writeLock()Ljava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;
-HSPLjava/util/function/BinaryOperator$$ExternalSyntheticLambda0;-><init>(Ljava/util/Comparator;)V
-HSPLjava/util/function/BinaryOperator;->maxBy(Ljava/util/Comparator;)Ljava/util/function/BinaryOperator;
-HSPLjava/util/function/DoubleUnaryOperator$$ExternalSyntheticLambda1;->applyAsDouble(D)D
-HSPLjava/util/function/DoubleUnaryOperator;->andThen(Ljava/util/function/DoubleUnaryOperator;)Ljava/util/function/DoubleUnaryOperator;
-HSPLjava/util/function/Function$$ExternalSyntheticLambda0;-><init>()V
-HSPLjava/util/function/Function$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/function/Function$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/function/Function$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/function/Function;->identity()Ljava/util/function/Function;
-HSPLjava/util/function/Function;->lambda$identity$2(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/jar/Attributes$Name;-><init>(Ljava/lang/String;)V
-HSPLjava/util/jar/Attributes$Name;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/jar/Attributes$Name;->hash(Ljava/lang/String;)I
-HSPLjava/util/jar/Attributes$Name;->hashCode()I
-HSPLjava/util/jar/Attributes$Name;->toString()Ljava/lang/String;
-HSPLjava/util/jar/Attributes;-><init>()V
-HSPLjava/util/jar/Attributes;-><init>(I)V
-HSPLjava/util/jar/Attributes;->entrySet()Ljava/util/Set;
-HSPLjava/util/jar/Attributes;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/jar/Attributes;->getValue(Ljava/util/jar/Attributes$Name;)Ljava/lang/String;
-HSPLjava/util/jar/Attributes;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/jar/Attributes;->putValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/jar/Attributes;->read(Ljava/util/jar/Manifest$FastInputStream;[B)V
-HSPLjava/util/jar/Attributes;->read(Ljava/util/jar/Manifest$FastInputStream;[BLjava/lang/String;I)I
-HSPLjava/util/jar/Attributes;->size()I
-HSPLjava/util/jar/JarEntry;-><init>(Ljava/lang/String;)V
-HSPLjava/util/jar/JarEntry;-><init>(Ljava/util/zip/ZipEntry;)V
-HSPLjava/util/jar/JarFile$JarFileEntry;-><init>(Ljava/util/jar/JarFile;Ljava/lang/String;)V
-HSPLjava/util/jar/JarFile$JarFileEntry;-><init>(Ljava/util/jar/JarFile;Ljava/util/zip/ZipEntry;)V
-HSPLjava/util/jar/JarFile;-><init>(Ljava/io/File;ZI)V
-HSPLjava/util/jar/JarFile;-><init>(Ljava/io/File;ZZI)V
-HSPLjava/util/jar/JarFile;-><init>(Ljava/lang/String;)V
-HSPLjava/util/jar/JarFile;-><init>(Ljava/lang/String;ZZ)V
-HSPLjava/util/jar/JarFile;->entryFor(Ljava/lang/String;)Ljava/util/jar/JarEntry;
-HSPLjava/util/jar/JarFile;->getBytes(Ljava/util/zip/ZipEntry;)[B
-HSPLjava/util/jar/JarFile;->getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;
-HSPLjava/util/jar/JarFile;->getInputStream(Ljava/util/zip/ZipEntry;)Ljava/io/InputStream;
-HSPLjava/util/jar/JarFile;->getJarEntry(Ljava/lang/String;)Ljava/util/jar/JarEntry;
-HSPLjava/util/jar/JarFile;->getManEntry()Ljava/util/jar/JarEntry;
-HSPLjava/util/jar/JarFile;->getManifest()Ljava/util/jar/Manifest;
-HSPLjava/util/jar/JarFile;->getManifestFromReference()Ljava/util/jar/Manifest;
-HSPLjava/util/jar/JarFile;->initializeVerifier()V
-HSPLjava/util/jar/JarFile;->maybeInstantiateVerifier()V
-HSPLjava/util/jar/JarVerifier$3;-><init>(Ljava/util/jar/JarVerifier;)V
-HSPLjava/util/jar/JarVerifier$VerifierStream;-><init>(Ljava/util/jar/Manifest;Ljava/util/jar/JarEntry;Ljava/io/InputStream;Ljava/util/jar/JarVerifier;)V
-HSPLjava/util/jar/JarVerifier$VerifierStream;->available()I
-HSPLjava/util/jar/JarVerifier$VerifierStream;->close()V
-HSPLjava/util/jar/JarVerifier$VerifierStream;->read()I
-HSPLjava/util/jar/JarVerifier$VerifierStream;->read([BII)I
-HSPLjava/util/jar/JarVerifier;->beginEntry(Ljava/util/jar/JarEntry;Lsun/security/util/ManifestEntryVerifier;)V
-HSPLjava/util/jar/JarVerifier;->doneWithMeta()V
-HSPLjava/util/jar/JarVerifier;->mapSignersToCertArray([Ljava/security/CodeSigner;)[Ljava/security/cert/Certificate;
-HSPLjava/util/jar/JarVerifier;->nothingToVerify()Z
-HSPLjava/util/jar/JarVerifier;->processEntry(Lsun/security/util/ManifestEntryVerifier;)V
-HSPLjava/util/jar/JarVerifier;->update(ILsun/security/util/ManifestEntryVerifier;)V
-HSPLjava/util/jar/JarVerifier;->update(I[BIILsun/security/util/ManifestEntryVerifier;)V
-HSPLjava/util/jar/Manifest$FastInputStream;-><init>(Ljava/io/InputStream;)V
-HSPLjava/util/jar/Manifest$FastInputStream;-><init>(Ljava/io/InputStream;I)V
-HSPLjava/util/jar/Manifest$FastInputStream;->fill()V
-HSPLjava/util/jar/Manifest$FastInputStream;->peek()B
-HSPLjava/util/jar/Manifest$FastInputStream;->readLine([B)I
-HSPLjava/util/jar/Manifest$FastInputStream;->readLine([BII)I
-HSPLjava/util/jar/Manifest;-><init>()V
-HSPLjava/util/jar/Manifest;-><init>(Ljava/io/InputStream;)V
-HSPLjava/util/jar/Manifest;->getAttributes(Ljava/lang/String;)Ljava/util/jar/Attributes;
-HSPLjava/util/jar/Manifest;->getEntries()Ljava/util/Map;
-HSPLjava/util/jar/Manifest;->getMainAttributes()Ljava/util/jar/Attributes;
-HSPLjava/util/jar/Manifest;->parseName([BI)Ljava/lang/String;
-HSPLjava/util/jar/Manifest;->read(Ljava/io/InputStream;)V
-HSPLjava/util/jar/Manifest;->toLower(I)I
-HSPLjava/util/logging/ConsoleHandler;->close()V
-HSPLjava/util/logging/ErrorManager;-><init>()V
-HSPLjava/util/logging/FileHandler$1;-><init>(Ljava/util/logging/FileHandler;)V
-HSPLjava/util/logging/FileHandler$1;->run()Ljava/lang/Object;
-HSPLjava/util/logging/FileHandler$InitializationErrorManager;-><init>()V
-HSPLjava/util/logging/FileHandler$InitializationErrorManager;-><init>(Ljava/util/logging/FileHandler$InitializationErrorManager-IA;)V
-HSPLjava/util/logging/FileHandler$MeteredStream;-><init>(Ljava/util/logging/FileHandler;Ljava/io/OutputStream;I)V
-HSPLjava/util/logging/FileHandler$MeteredStream;->close()V
-HSPLjava/util/logging/FileHandler$MeteredStream;->flush()V
-HSPLjava/util/logging/FileHandler$MeteredStream;->write([BII)V
-HSPLjava/util/logging/FileHandler;->-$$Nest$mrotate(Ljava/util/logging/FileHandler;)V
-HSPLjava/util/logging/FileHandler;-><clinit>()V
-HSPLjava/util/logging/FileHandler;-><init>(Ljava/lang/String;IIZ)V
-HSPLjava/util/logging/FileHandler;->configure()V
-HSPLjava/util/logging/FileHandler;->generate(Ljava/lang/String;II)Ljava/io/File;
-HSPLjava/util/logging/FileHandler;->isParentWritable(Ljava/nio/file/Path;)Z
-HSPLjava/util/logging/FileHandler;->open(Ljava/io/File;Z)V
-HSPLjava/util/logging/FileHandler;->openFiles()V
-HSPLjava/util/logging/FileHandler;->publish(Ljava/util/logging/LogRecord;)V
-HSPLjava/util/logging/FileHandler;->rotate()V
-HSPLjava/util/logging/Formatter;-><init>()V
-HSPLjava/util/logging/Formatter;->getHead(Ljava/util/logging/Handler;)Ljava/lang/String;
-HSPLjava/util/logging/Formatter;->getTail(Ljava/util/logging/Handler;)Ljava/lang/String;
-HSPLjava/util/logging/Handler;-><init>()V
-HSPLjava/util/logging/Handler;->checkPermission()V
-HSPLjava/util/logging/Handler;->getEncoding()Ljava/lang/String;
-HSPLjava/util/logging/Handler;->getFilter()Ljava/util/logging/Filter;
-HSPLjava/util/logging/Handler;->getFormatter()Ljava/util/logging/Formatter;
-HSPLjava/util/logging/Handler;->getLevel()Ljava/util/logging/Level;
-HSPLjava/util/logging/Handler;->isLoggable(Ljava/util/logging/LogRecord;)Z
-HSPLjava/util/logging/Handler;->setEncoding(Ljava/lang/String;)V
-HSPLjava/util/logging/Handler;->setErrorManager(Ljava/util/logging/ErrorManager;)V
-HSPLjava/util/logging/Handler;->setFilter(Ljava/util/logging/Filter;)V
-HSPLjava/util/logging/Handler;->setFormatter(Ljava/util/logging/Formatter;)V
-HSPLjava/util/logging/Handler;->setLevel(Ljava/util/logging/Level;)V
-HSPLjava/util/logging/Level;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/logging/Level;->intValue()I
-HSPLjava/util/logging/LogManager$5;-><init>(Ljava/util/logging/LogManager;Ljava/lang/String;Ljava/util/logging/Logger;)V
-HSPLjava/util/logging/LogManager$5;->run()Ljava/lang/Object;
-HSPLjava/util/logging/LogManager$LogNode;-><init>(Ljava/util/logging/LogManager$LogNode;Ljava/util/logging/LogManager$LoggerContext;)V
-HSPLjava/util/logging/LogManager$LogNode;->walkAndSetParent(Ljava/util/logging/Logger;)V
-HSPLjava/util/logging/LogManager$LoggerContext$1;-><init>(Ljava/util/logging/LogManager$LoggerContext;Ljava/util/logging/Logger;Ljava/util/logging/LogManager;Ljava/lang/String;)V
-HSPLjava/util/logging/LogManager$LoggerContext$1;->run()Ljava/lang/Object;
-HSPLjava/util/logging/LogManager$LoggerContext$1;->run()Ljava/lang/Void;
-HSPLjava/util/logging/LogManager$LoggerContext;->addLocalLogger(Ljava/util/logging/Logger;)Z
-HSPLjava/util/logging/LogManager$LoggerContext;->addLocalLogger(Ljava/util/logging/Logger;Z)Z
-HSPLjava/util/logging/LogManager$LoggerContext;->ensureAllDefaultLoggers(Ljava/util/logging/Logger;)V
-HSPLjava/util/logging/LogManager$LoggerContext;->ensureDefaultLogger(Ljava/util/logging/Logger;)V
-HSPLjava/util/logging/LogManager$LoggerContext;->ensureInitialized()V
-HSPLjava/util/logging/LogManager$LoggerContext;->findLogger(Ljava/lang/String;)Ljava/util/logging/Logger;
-HSPLjava/util/logging/LogManager$LoggerContext;->getGlobalLogger()Ljava/util/logging/Logger;
-HSPLjava/util/logging/LogManager$LoggerContext;->getLoggerNames()Ljava/util/Enumeration;
-HSPLjava/util/logging/LogManager$LoggerContext;->getNode(Ljava/lang/String;)Ljava/util/logging/LogManager$LogNode;
-HSPLjava/util/logging/LogManager$LoggerContext;->getOwner()Ljava/util/logging/LogManager;
-HSPLjava/util/logging/LogManager$LoggerContext;->getRootLogger()Ljava/util/logging/Logger;
-HSPLjava/util/logging/LogManager$LoggerContext;->processParentHandlers(Ljava/util/logging/Logger;Ljava/lang/String;)V
-HSPLjava/util/logging/LogManager$LoggerContext;->removeLoggerRef(Ljava/lang/String;Ljava/util/logging/LogManager$LoggerWeakRef;)V
-HSPLjava/util/logging/LogManager$LoggerContext;->requiresDefaultLoggers()Z
-HSPLjava/util/logging/LogManager$LoggerWeakRef;-><init>(Ljava/util/logging/LogManager;Ljava/util/logging/Logger;)V
-HSPLjava/util/logging/LogManager$LoggerWeakRef;->dispose()V
-HSPLjava/util/logging/LogManager$LoggerWeakRef;->setNode(Ljava/util/logging/LogManager$LogNode;)V
-HSPLjava/util/logging/LogManager$LoggerWeakRef;->setParentRef(Ljava/lang/ref/WeakReference;)V
-HSPLjava/util/logging/LogManager$RootLogger;->accessCheckedHandlers()[Ljava/util/logging/Handler;
-HSPLjava/util/logging/LogManager$RootLogger;->addHandler(Ljava/util/logging/Handler;)V
-HSPLjava/util/logging/LogManager$RootLogger;->removeHandler(Ljava/util/logging/Handler;)V
-HSPLjava/util/logging/LogManager$SystemLoggerContext;->demandLogger(Ljava/lang/String;Ljava/lang/String;)Ljava/util/logging/Logger;
-HSPLjava/util/logging/LogManager;->-$$Nest$fgetloggerRefQueue(Ljava/util/logging/LogManager;)Ljava/lang/ref/ReferenceQueue;
-HSPLjava/util/logging/LogManager;->-$$Nest$fgetrootLogger(Ljava/util/logging/LogManager;)Ljava/util/logging/Logger;
-HSPLjava/util/logging/LogManager;->-$$Nest$minitializeGlobalHandlers(Ljava/util/logging/LogManager;)V
-HSPLjava/util/logging/LogManager;->-$$Nest$mparseClassNames(Ljava/util/logging/LogManager;Ljava/lang/String;)[Ljava/lang/String;
-HSPLjava/util/logging/LogManager;->-$$Nest$sfgetmanager()Ljava/util/logging/LogManager;
-HSPLjava/util/logging/LogManager;->-$$Nest$smdoSetParent(Ljava/util/logging/Logger;Ljava/util/logging/Logger;)V
-HSPLjava/util/logging/LogManager;->addLogger(Ljava/util/logging/Logger;)Z
-HSPLjava/util/logging/LogManager;->checkPermission()V
-HSPLjava/util/logging/LogManager;->contexts()Ljava/util/List;
-HSPLjava/util/logging/LogManager;->demandLogger(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;)Ljava/util/logging/Logger;
-HSPLjava/util/logging/LogManager;->demandSystemLogger(Ljava/lang/String;Ljava/lang/String;)Ljava/util/logging/Logger;
-HSPLjava/util/logging/LogManager;->doSetParent(Ljava/util/logging/Logger;Ljava/util/logging/Logger;)V
-HSPLjava/util/logging/LogManager;->drainLoggerRefQueueBounded()V
-HSPLjava/util/logging/LogManager;->ensureLogManagerInitialized()V
-HSPLjava/util/logging/LogManager;->getBooleanProperty(Ljava/lang/String;Z)Z
-HSPLjava/util/logging/LogManager;->getFilterProperty(Ljava/lang/String;Ljava/util/logging/Filter;)Ljava/util/logging/Filter;
-HSPLjava/util/logging/LogManager;->getFormatterProperty(Ljava/lang/String;Ljava/util/logging/Formatter;)Ljava/util/logging/Formatter;
-HSPLjava/util/logging/LogManager;->getIntProperty(Ljava/lang/String;I)I
-HSPLjava/util/logging/LogManager;->getLevelProperty(Ljava/lang/String;Ljava/util/logging/Level;)Ljava/util/logging/Level;
-HSPLjava/util/logging/LogManager;->getLogManager()Ljava/util/logging/LogManager;
-HSPLjava/util/logging/LogManager;->getLogger(Ljava/lang/String;)Ljava/util/logging/Logger;
-HSPLjava/util/logging/LogManager;->getProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/logging/LogManager;->getStringProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/logging/LogManager;->getSystemContext()Ljava/util/logging/LogManager$LoggerContext;
-HSPLjava/util/logging/LogManager;->getUserContext()Ljava/util/logging/LogManager$LoggerContext;
-HSPLjava/util/logging/LogManager;->initializeGlobalHandlers()V
-HSPLjava/util/logging/LogManager;->loadLoggerHandlers(Ljava/util/logging/Logger;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/util/logging/LogManager;->parseClassNames(Ljava/lang/String;)[Ljava/lang/String;
-HSPLjava/util/logging/LogManager;->reset()V
-HSPLjava/util/logging/LogManager;->resetLogger(Ljava/util/logging/Logger;)V
-HSPLjava/util/logging/LogRecord;-><init>(Ljava/util/logging/Level;Ljava/lang/String;)V
-HSPLjava/util/logging/LogRecord;->defaultThreadID()I
-HSPLjava/util/logging/LogRecord;->getLevel()Ljava/util/logging/Level;
-HSPLjava/util/logging/LogRecord;->getLoggerName()Ljava/lang/String;
-HSPLjava/util/logging/LogRecord;->getMessage()Ljava/lang/String;
-HSPLjava/util/logging/LogRecord;->getThrown()Ljava/lang/Throwable;
-HSPLjava/util/logging/LogRecord;->setLoggerName(Ljava/lang/String;)V
-HSPLjava/util/logging/LogRecord;->setParameters([Ljava/lang/Object;)V
-HSPLjava/util/logging/LogRecord;->setSourceClassName(Ljava/lang/String;)V
-HSPLjava/util/logging/LogRecord;->setSourceMethodName(Ljava/lang/String;)V
-HSPLjava/util/logging/LogRecord;->setThrown(Ljava/lang/Throwable;)V
-HSPLjava/util/logging/Logger$1;-><init>(Ljava/util/Locale;)V
-HSPLjava/util/logging/Logger$1;->run()Ljava/lang/Object;
-HSPLjava/util/logging/Logger$1;->run()Ljava/util/ResourceBundle;
-HSPLjava/util/logging/Logger$LoggerBundle;->get(Ljava/lang/String;Ljava/util/ResourceBundle;)Ljava/util/logging/Logger$LoggerBundle;
-HSPLjava/util/logging/Logger$LoggerBundle;->isSystemBundle()Z
-HSPLjava/util/logging/Logger;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;Ljava/util/logging/LogManager;Z)V
-HSPLjava/util/logging/Logger;->accessCheckedHandlers()[Ljava/util/logging/Handler;
-HSPLjava/util/logging/Logger;->addHandler(Ljava/util/logging/Handler;)V
-HSPLjava/util/logging/Logger;->checkPermission()V
-HSPLjava/util/logging/Logger;->demandLogger(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;)Ljava/util/logging/Logger;
-HSPLjava/util/logging/Logger;->doLog(Ljava/util/logging/LogRecord;)V
-HSPLjava/util/logging/Logger;->doSetParent(Ljava/util/logging/Logger;)V
-HSPLjava/util/logging/Logger;->findResourceBundle(Ljava/lang/String;Z)Ljava/util/ResourceBundle;
-HSPLjava/util/logging/Logger;->findSystemResourceBundle(Ljava/util/Locale;)Ljava/util/ResourceBundle;
-HSPLjava/util/logging/Logger;->getCallersClassLoader()Ljava/lang/ClassLoader;
-HSPLjava/util/logging/Logger;->getEffectiveLoggerBundle()Ljava/util/logging/Logger$LoggerBundle;
-HSPLjava/util/logging/Logger;->getHandlers()[Ljava/util/logging/Handler;
-HSPLjava/util/logging/Logger;->getLogger(Ljava/lang/String;)Ljava/util/logging/Logger;
-HSPLjava/util/logging/Logger;->getName()Ljava/lang/String;
-HSPLjava/util/logging/Logger;->getParent()Ljava/util/logging/Logger;
-HSPLjava/util/logging/Logger;->getPlatformLogger(Ljava/lang/String;)Ljava/util/logging/Logger;
-HSPLjava/util/logging/Logger;->getResourceBundle()Ljava/util/ResourceBundle;
-HSPLjava/util/logging/Logger;->getResourceBundleName()Ljava/lang/String;
-HSPLjava/util/logging/Logger;->getUseParentHandlers()Z
-HSPLjava/util/logging/Logger;->info(Ljava/lang/String;)V
-HSPLjava/util/logging/Logger;->isLoggable(Ljava/util/logging/Level;)Z
-HSPLjava/util/logging/Logger;->log(Ljava/util/logging/Level;Ljava/lang/String;)V
-HSPLjava/util/logging/Logger;->log(Ljava/util/logging/LogRecord;)V
-HSPLjava/util/logging/Logger;->logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/util/logging/Logger;->logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V
-HSPLjava/util/logging/Logger;->logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/util/logging/Logger;->removeChildLogger(Ljava/util/logging/LogManager$LoggerWeakRef;)V
-HSPLjava/util/logging/Logger;->removeHandler(Ljava/util/logging/Handler;)V
-HSPLjava/util/logging/Logger;->setCallersClassLoaderRef(Ljava/lang/Class;)V
-HSPLjava/util/logging/Logger;->setLevel(Ljava/util/logging/Level;)V
-HSPLjava/util/logging/Logger;->setLogManager(Ljava/util/logging/LogManager;)V
-HSPLjava/util/logging/Logger;->setParent(Ljava/util/logging/Logger;)V
-HSPLjava/util/logging/Logger;->setUseParentHandlers(Z)V
-HSPLjava/util/logging/Logger;->setupResourceInfo(Ljava/lang/String;Ljava/lang/Class;)V
-HSPLjava/util/logging/Logger;->updateEffectiveLevel()V
-HSPLjava/util/logging/LoggingProxyImpl;->getLogger(Ljava/lang/String;)Ljava/lang/Object;
-HSPLjava/util/logging/LoggingProxyImpl;->getProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/logging/SimpleFormatter;-><clinit>()V
-HSPLjava/util/logging/SimpleFormatter;-><init>()V
-HSPLjava/util/logging/StreamHandler;-><init>()V
-HSPLjava/util/logging/StreamHandler;->close()V
-HSPLjava/util/logging/StreamHandler;->configure()V
-HSPLjava/util/logging/StreamHandler;->flush()V
-HSPLjava/util/logging/StreamHandler;->flushAndClose()V
-HSPLjava/util/logging/StreamHandler;->isLoggable(Ljava/util/logging/LogRecord;)Z
-HSPLjava/util/logging/StreamHandler;->publish(Ljava/util/logging/LogRecord;)V
-HSPLjava/util/logging/StreamHandler;->setEncoding(Ljava/lang/String;)V
-HSPLjava/util/logging/StreamHandler;->setOutputStream(Ljava/io/OutputStream;)V
-HSPLjava/util/logging/XMLFormatter;-><init>()V
-HSPLjava/util/regex/Matcher;-><init>(Ljava/util/regex/Pattern;Ljava/lang/CharSequence;)V
-HSPLjava/util/regex/Matcher;->appendEvaluated(Ljava/lang/StringBuilder;Ljava/lang/String;)V
-HSPLjava/util/regex/Matcher;->appendExpandedReplacement(Ljava/lang/String;Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;
-HSPLjava/util/regex/Matcher;->appendReplacement(Ljava/lang/StringBuffer;Ljava/lang/String;)Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Matcher;->appendReplacement(Ljava/lang/StringBuilder;Ljava/lang/String;)Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Matcher;->appendReplacementInternal(Ljava/lang/StringBuilder;Ljava/lang/String;)V
-HSPLjava/util/regex/Matcher;->appendTail(Ljava/lang/StringBuffer;)Ljava/lang/StringBuffer;
-HSPLjava/util/regex/Matcher;->appendTail(Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;
-HSPLjava/util/regex/Matcher;->end()I
-HSPLjava/util/regex/Matcher;->end(I)I
-HSPLjava/util/regex/Matcher;->ensureMatch()V
-HSPLjava/util/regex/Matcher;->find()Z
-HSPLjava/util/regex/Matcher;->find(I)Z
-HSPLjava/util/regex/Matcher;->getSubSequence(II)Ljava/lang/CharSequence;
-HSPLjava/util/regex/Matcher;->getTextLength()I
-HSPLjava/util/regex/Matcher;->group()Ljava/lang/String;
-HSPLjava/util/regex/Matcher;->group(I)Ljava/lang/String;
-HSPLjava/util/regex/Matcher;->groupCount()I
-HSPLjava/util/regex/Matcher;->hitEnd()Z
-HSPLjava/util/regex/Matcher;->lookingAt()Z
-HSPLjava/util/regex/Matcher;->matches()Z
-HSPLjava/util/regex/Matcher;->pattern()Ljava/util/regex/Pattern;
-HSPLjava/util/regex/Matcher;->region(II)Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Matcher;->replaceAll(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/regex/Matcher;->replaceFirst(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/regex/Matcher;->reset()Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Matcher;->reset(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Matcher;->reset(Ljava/lang/CharSequence;II)Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Matcher;->resetForInput()V
-HSPLjava/util/regex/Matcher;->start()I
-HSPLjava/util/regex/Matcher;->start(I)I
-HSPLjava/util/regex/Matcher;->useAnchoringBounds(Z)Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Matcher;->usePattern(Ljava/util/regex/Pattern;)Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Matcher;->useTransparentBounds(Z)Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Pattern;-><init>(Ljava/lang/String;I)V
-HSPLjava/util/regex/Pattern;->compile()V
-HSPLjava/util/regex/Pattern;->compile(Ljava/lang/String;)Ljava/util/regex/Pattern;
-HSPLjava/util/regex/Pattern;->compile(Ljava/lang/String;I)Ljava/util/regex/Pattern;
-HSPLjava/util/regex/Pattern;->fastSplit(Ljava/lang/String;Ljava/lang/String;I)[Ljava/lang/String;
-HSPLjava/util/regex/Pattern;->matcher(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Pattern;->matches(Ljava/lang/String;Ljava/lang/CharSequence;)Z
-HSPLjava/util/regex/Pattern;->pattern()Ljava/lang/String;
-HSPLjava/util/regex/Pattern;->quote(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/regex/Pattern;->split(Ljava/lang/CharSequence;)[Ljava/lang/String;
-HSPLjava/util/regex/Pattern;->split(Ljava/lang/CharSequence;I)[Ljava/lang/String;
-HSPLjava/util/regex/Pattern;->toString()Ljava/lang/String;
-HSPLjava/util/stream/AbstractPipeline;-><init>(Ljava/util/Spliterator;IZ)V
-HSPLjava/util/stream/AbstractPipeline;-><init>(Ljava/util/stream/AbstractPipeline;I)V
-HSPLjava/util/stream/AbstractPipeline;->close()V
-HSPLjava/util/stream/AbstractPipeline;->copyInto(Ljava/util/stream/Sink;Ljava/util/Spliterator;)V
-HSPLjava/util/stream/AbstractPipeline;->evaluate(Ljava/util/Spliterator;ZLjava/util/function/IntFunction;)Ljava/util/stream/Node;
-HSPLjava/util/stream/AbstractPipeline;->evaluate(Ljava/util/stream/TerminalOp;)Ljava/lang/Object;
-HSPLjava/util/stream/AbstractPipeline;->evaluateToArrayNode(Ljava/util/function/IntFunction;)Ljava/util/stream/Node;
-HSPLjava/util/stream/AbstractPipeline;->exactOutputSizeIfKnown(Ljava/util/Spliterator;)J
-HSPLjava/util/stream/AbstractPipeline;->getStreamAndOpFlags()I
-HSPLjava/util/stream/AbstractPipeline;->isParallel()Z
-HSPLjava/util/stream/AbstractPipeline;->onClose(Ljava/lang/Runnable;)Ljava/util/stream/BaseStream;
-HSPLjava/util/stream/AbstractPipeline;->sequential()Ljava/util/stream/BaseStream;
-HSPLjava/util/stream/AbstractPipeline;->sourceSpliterator(I)Ljava/util/Spliterator;
-HSPLjava/util/stream/AbstractPipeline;->sourceStageSpliterator()Ljava/util/Spliterator;
-HSPLjava/util/stream/AbstractPipeline;->spliterator()Ljava/util/Spliterator;
-HSPLjava/util/stream/AbstractPipeline;->wrapAndCopyInto(Ljava/util/stream/Sink;Ljava/util/Spliterator;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/AbstractPipeline;->wrapSink(Ljava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/AbstractSpinedBuffer;-><init>()V
-HSPLjava/util/stream/AbstractSpinedBuffer;->count()J
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda0;-><init>()V
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda20;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda25;-><init>()V
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda25;->get()Ljava/lang/Object;
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda26;-><init>()V
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda26;->accept(Ljava/lang/Object;Ljava/lang/Object;)V+]Ljava/util/List;Ljava/util/ArrayList;
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda27;-><init>()V
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda28;-><init>()V
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda28;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda42;-><init>()V
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda65;->get()Ljava/lang/Object;
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda72;->get()Ljava/lang/Object;
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda74;-><init>()V
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda75;-><init>()V
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda75;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda76;-><init>()V
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda87;-><init>()V
-HSPLjava/util/stream/Collectors$CollectorImpl;-><init>(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;Ljava/util/Set;)V
-HSPLjava/util/stream/Collectors$CollectorImpl;-><init>(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;Ljava/util/function/Function;Ljava/util/Set;)V
-HSPLjava/util/stream/Collectors$CollectorImpl;->accumulator()Ljava/util/function/BiConsumer;
-HSPLjava/util/stream/Collectors$CollectorImpl;->characteristics()Ljava/util/Set;
-HSPLjava/util/stream/Collectors$CollectorImpl;->combiner()Ljava/util/function/BinaryOperator;
-HSPLjava/util/stream/Collectors$CollectorImpl;->finisher()Ljava/util/function/Function;
-HSPLjava/util/stream/Collectors$CollectorImpl;->supplier()Ljava/util/function/Supplier;
-HSPLjava/util/stream/Collectors;->-$$Nest$smcastingIdentity()Ljava/util/function/Function;
-HSPLjava/util/stream/Collectors;->castingIdentity()Ljava/util/function/Function;
-HSPLjava/util/stream/Collectors;->groupingBy(Ljava/util/function/Function;)Ljava/util/stream/Collector;
-HSPLjava/util/stream/Collectors;->groupingBy(Ljava/util/function/Function;Ljava/util/function/Supplier;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;
-HSPLjava/util/stream/Collectors;->groupingBy(Ljava/util/function/Function;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;
-HSPLjava/util/stream/Collectors;->joining(Ljava/lang/CharSequence;)Ljava/util/stream/Collector;
-HSPLjava/util/stream/Collectors;->joining(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/util/stream/Collector;
-HSPLjava/util/stream/Collectors;->lambda$joining$11(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/util/StringJoiner;
-HSPLjava/util/stream/Collectors;->lambda$toUnmodifiableList$6(Ljava/util/ArrayList;)Ljava/util/List;+]Ljdk/internal/access/JavaUtilCollectionAccess;Ljava/util/ImmutableCollections$Access$1;
-HSPLjava/util/stream/Collectors;->lambda$uniqKeysMapAccumulator$1(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/util/Map;Ljava/lang/Object;)V
-HSPLjava/util/stream/Collectors;->mapMerger(Ljava/util/function/BinaryOperator;)Ljava/util/function/BinaryOperator;
-HSPLjava/util/stream/Collectors;->toCollection(Ljava/util/function/Supplier;)Ljava/util/stream/Collector;
-HSPLjava/util/stream/Collectors;->toList()Ljava/util/stream/Collector;
-HSPLjava/util/stream/Collectors;->toMap(Ljava/util/function/Function;Ljava/util/function/Function;)Ljava/util/stream/Collector;
-HSPLjava/util/stream/Collectors;->toMap(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/util/function/BinaryOperator;Ljava/util/function/Supplier;)Ljava/util/stream/Collector;
-HSPLjava/util/stream/Collectors;->toSet()Ljava/util/stream/Collector;
-HSPLjava/util/stream/Collectors;->toUnmodifiableList()Ljava/util/stream/Collector;
-HSPLjava/util/stream/DistinctOps$1$2;-><init>(Ljava/util/stream/DistinctOps$1;Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/DistinctOps$1$2;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/DistinctOps$1$2;->begin(J)V
-HSPLjava/util/stream/DistinctOps$1$2;->end()V
-HSPLjava/util/stream/DistinctOps$1;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-HSPLjava/util/stream/DistinctOps$1;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/DistinctOps;->makeRef(Ljava/util/stream/AbstractPipeline;)Ljava/util/stream/ReferencePipeline;
-HSPLjava/util/stream/DoublePipeline$StatelessOp;-><clinit>()V
-HSPLjava/util/stream/DoublePipeline$StatelessOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-HSPLjava/util/stream/DoublePipeline$StatelessOp;->opIsStateful()Z
-HSPLjava/util/stream/DoublePipeline;-><init>(Ljava/util/stream/AbstractPipeline;I)V
-HSPLjava/util/stream/DoublePipeline;->max()Ljava/util/OptionalDouble;
-HSPLjava/util/stream/DoublePipeline;->reduce(Ljava/util/function/DoubleBinaryOperator;)Ljava/util/OptionalDouble;
-HSPLjava/util/stream/FindOps$FindOp;-><init>(ZLjava/util/stream/StreamShape;Ljava/lang/Object;Ljava/util/function/Predicate;Ljava/util/function/Supplier;)V
-HSPLjava/util/stream/FindOps$FindOp;->evaluateSequential(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;)Ljava/lang/Object;
-HSPLjava/util/stream/FindOps$FindOp;->getOpFlags()I
-HSPLjava/util/stream/FindOps$FindSink$OfRef;-><init>()V
-HSPLjava/util/stream/FindOps$FindSink$OfRef;->get()Ljava/lang/Object;
-HSPLjava/util/stream/FindOps$FindSink$OfRef;->get()Ljava/util/Optional;
-HSPLjava/util/stream/FindOps$FindSink;-><init>()V
-HSPLjava/util/stream/FindOps$FindSink;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/FindOps$FindSink;->cancellationRequested()Z
-HSPLjava/util/stream/FindOps;->makeRef(Z)Ljava/util/stream/TerminalOp;
-HSPLjava/util/stream/ForEachOps$ForEachOp$OfRef;-><init>(Ljava/util/function/Consumer;Z)V
-HSPLjava/util/stream/ForEachOps$ForEachOp$OfRef;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/ForEachOps$ForEachOp;-><init>(Z)V
-HSPLjava/util/stream/ForEachOps$ForEachOp;->evaluateSequential(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;)Ljava/lang/Object;
-HSPLjava/util/stream/ForEachOps$ForEachOp;->evaluateSequential(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;)Ljava/lang/Void;
-HSPLjava/util/stream/ForEachOps$ForEachOp;->get()Ljava/lang/Void;
-HSPLjava/util/stream/ForEachOps$ForEachOp;->getOpFlags()I
-HSPLjava/util/stream/ForEachOps;->makeRef(Ljava/util/function/Consumer;Z)Ljava/util/stream/TerminalOp;
-HSPLjava/util/stream/IntPipeline$$ExternalSyntheticLambda12;->apply(I)Ljava/lang/Object;
-HSPLjava/util/stream/IntPipeline$$ExternalSyntheticLambda7;-><init>()V
-HSPLjava/util/stream/IntPipeline$$ExternalSyntheticLambda8;-><init>()V
-HSPLjava/util/stream/IntPipeline$1$1;-><init>(Ljava/util/stream/IntPipeline$1;Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/IntPipeline$1$1;->accept(I)V+]Ljava/util/function/IntFunction;megamorphic_types]Ljava/util/stream/Sink;megamorphic_types
-HSPLjava/util/stream/IntPipeline$1;-><init>(Ljava/util/stream/IntPipeline;Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;ILjava/util/function/IntFunction;)V
-HSPLjava/util/stream/IntPipeline$1;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/IntPipeline$4$1;-><init>(Ljava/util/stream/IntPipeline$4;Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/IntPipeline$4$1;->accept(I)V
-HSPLjava/util/stream/IntPipeline$4;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/IntPipeline$9;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/IntPipeline$Head;-><init>(Ljava/util/Spliterator;IZ)V
-HSPLjava/util/stream/IntPipeline$Head;->forEach(Ljava/util/function/IntConsumer;)V
-HSPLjava/util/stream/IntPipeline$StatelessOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-HSPLjava/util/stream/IntPipeline$StatelessOp;->opIsStateful()Z
-HSPLjava/util/stream/IntPipeline;->-$$Nest$smadapt(Ljava/util/Spliterator;)Ljava/util/Spliterator$OfInt;
-HSPLjava/util/stream/IntPipeline;-><init>(Ljava/util/Spliterator;IZ)V
-HSPLjava/util/stream/IntPipeline;-><init>(Ljava/util/stream/AbstractPipeline;I)V
-HSPLjava/util/stream/IntPipeline;->adapt(Ljava/util/Spliterator;)Ljava/util/Spliterator$OfInt;
-HSPLjava/util/stream/IntPipeline;->adapt(Ljava/util/stream/Sink;)Ljava/util/function/IntConsumer;
-HSPLjava/util/stream/IntPipeline;->allMatch(Ljava/util/function/IntPredicate;)Z
-HSPLjava/util/stream/IntPipeline;->boxed()Ljava/util/stream/Stream;
-HSPLjava/util/stream/IntPipeline;->distinct()Ljava/util/stream/IntStream;
-HSPLjava/util/stream/IntPipeline;->filter(Ljava/util/function/IntPredicate;)Ljava/util/stream/IntStream;
-HSPLjava/util/stream/IntPipeline;->makeNodeBuilder(JLjava/util/function/IntFunction;)Ljava/util/stream/Node$Builder;
-HSPLjava/util/stream/IntPipeline;->mapToObj(Ljava/util/function/IntFunction;)Ljava/util/stream/Stream;
-HSPLjava/util/stream/IntPipeline;->mapToObj(Ljava/util/function/IntFunction;I)Ljava/util/stream/Stream;
-HSPLjava/util/stream/IntPipeline;->reduce(ILjava/util/function/IntBinaryOperator;)I
-HSPLjava/util/stream/IntPipeline;->sum()I
-HSPLjava/util/stream/IntPipeline;->toArray()[I
-HSPLjava/util/stream/IntStream;->empty()Ljava/util/stream/IntStream;
-HSPLjava/util/stream/IntStream;->of([I)Ljava/util/stream/IntStream;
-HSPLjava/util/stream/IntStream;->range(II)Ljava/util/stream/IntStream;
-HSPLjava/util/stream/IntStream;->rangeClosed(II)Ljava/util/stream/IntStream;
-HSPLjava/util/stream/LongPipeline$$ExternalSyntheticLambda4;-><init>()V
-HSPLjava/util/stream/LongPipeline$StatelessOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-HSPLjava/util/stream/LongPipeline$StatelessOp;->opIsStateful()Z
-HSPLjava/util/stream/LongPipeline;-><init>(Ljava/util/stream/AbstractPipeline;I)V
-HSPLjava/util/stream/LongPipeline;->reduce(JLjava/util/function/LongBinaryOperator;)J
-HSPLjava/util/stream/LongPipeline;->sum()J
-HSPLjava/util/stream/MatchOps$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
-HSPLjava/util/stream/MatchOps$$ExternalSyntheticLambda1;->get()Ljava/lang/Object;
-HSPLjava/util/stream/MatchOps$$ExternalSyntheticLambda3;->get()Ljava/lang/Object;
-HSPLjava/util/stream/MatchOps$1MatchSink;-><init>(Ljava/util/stream/MatchOps$MatchKind;Ljava/util/function/Predicate;)V
-HSPLjava/util/stream/MatchOps$1MatchSink;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/MatchOps$2MatchSink;-><init>(Ljava/util/stream/MatchOps$MatchKind;Ljava/util/function/IntPredicate;)V
-HSPLjava/util/stream/MatchOps$2MatchSink;->accept(I)V
-HSPLjava/util/stream/MatchOps$BooleanTerminalSink;-><init>(Ljava/util/stream/MatchOps$MatchKind;)V
-HSPLjava/util/stream/MatchOps$BooleanTerminalSink;->cancellationRequested()Z
-HSPLjava/util/stream/MatchOps$BooleanTerminalSink;->getAndClearState()Z
-HSPLjava/util/stream/MatchOps$MatchKind;->-$$Nest$fgetshortCircuitResult(Ljava/util/stream/MatchOps$MatchKind;)Z
-HSPLjava/util/stream/MatchOps$MatchKind;->-$$Nest$fgetstopOnPredicateMatches(Ljava/util/stream/MatchOps$MatchKind;)Z
-HSPLjava/util/stream/MatchOps$MatchOp;-><init>(Ljava/util/stream/StreamShape;Ljava/util/stream/MatchOps$MatchKind;Ljava/util/function/Supplier;)V
-HSPLjava/util/stream/MatchOps$MatchOp;->evaluateSequential(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;)Ljava/lang/Boolean;
-HSPLjava/util/stream/MatchOps$MatchOp;->evaluateSequential(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;)Ljava/lang/Object;
-HSPLjava/util/stream/MatchOps$MatchOp;->getOpFlags()I
-HSPLjava/util/stream/MatchOps;->lambda$makeInt$1(Ljava/util/stream/MatchOps$MatchKind;Ljava/util/function/IntPredicate;)Ljava/util/stream/MatchOps$BooleanTerminalSink;
-HSPLjava/util/stream/MatchOps;->lambda$makeRef$0(Ljava/util/stream/MatchOps$MatchKind;Ljava/util/function/Predicate;)Ljava/util/stream/MatchOps$BooleanTerminalSink;
-HSPLjava/util/stream/MatchOps;->makeInt(Ljava/util/function/IntPredicate;Ljava/util/stream/MatchOps$MatchKind;)Ljava/util/stream/TerminalOp;
-HSPLjava/util/stream/MatchOps;->makeRef(Ljava/util/function/Predicate;Ljava/util/stream/MatchOps$MatchKind;)Ljava/util/stream/TerminalOp;
-HSPLjava/util/stream/Node;->getChildCount()I
-HSPLjava/util/stream/Nodes$ArrayNode;-><init>(JLjava/util/function/IntFunction;)V
-HSPLjava/util/stream/Nodes$ArrayNode;->asArray(Ljava/util/function/IntFunction;)[Ljava/lang/Object;
-HSPLjava/util/stream/Nodes$FixedNodeBuilder;-><init>(JLjava/util/function/IntFunction;)V
-HSPLjava/util/stream/Nodes$FixedNodeBuilder;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/Nodes$FixedNodeBuilder;->begin(J)V
-HSPLjava/util/stream/Nodes$FixedNodeBuilder;->build()Ljava/util/stream/Node;
-HSPLjava/util/stream/Nodes$FixedNodeBuilder;->end()V
-HSPLjava/util/stream/Nodes$IntArrayNode;-><init>(J)V
-HSPLjava/util/stream/Nodes$IntArrayNode;->asPrimitiveArray()Ljava/lang/Object;
-HSPLjava/util/stream/Nodes$IntArrayNode;->asPrimitiveArray()[I
-HSPLjava/util/stream/Nodes$IntFixedNodeBuilder;-><init>(J)V
-HSPLjava/util/stream/Nodes$IntFixedNodeBuilder;->accept(I)V
-HSPLjava/util/stream/Nodes$IntFixedNodeBuilder;->begin(J)V
-HSPLjava/util/stream/Nodes$IntFixedNodeBuilder;->build()Ljava/util/stream/Node$OfInt;
-HSPLjava/util/stream/Nodes$IntFixedNodeBuilder;->build()Ljava/util/stream/Node;
-HSPLjava/util/stream/Nodes$IntFixedNodeBuilder;->end()V
-HSPLjava/util/stream/Nodes$SpinedNodeBuilder;-><clinit>()V
-HSPLjava/util/stream/Nodes$SpinedNodeBuilder;-><init>()V
-HSPLjava/util/stream/Nodes$SpinedNodeBuilder;->asArray(Ljava/util/function/IntFunction;)[Ljava/lang/Object;
-HSPLjava/util/stream/Nodes$SpinedNodeBuilder;->begin(J)V
-HSPLjava/util/stream/Nodes$SpinedNodeBuilder;->build()Ljava/util/stream/Node;
-HSPLjava/util/stream/Nodes$SpinedNodeBuilder;->copyInto([Ljava/lang/Object;I)V
-HSPLjava/util/stream/Nodes$SpinedNodeBuilder;->end()V
-HSPLjava/util/stream/Nodes;->builder()Ljava/util/stream/Node$Builder;
-HSPLjava/util/stream/Nodes;->builder(JLjava/util/function/IntFunction;)Ljava/util/stream/Node$Builder;
-HSPLjava/util/stream/Nodes;->flatten(Ljava/util/stream/Node;Ljava/util/function/IntFunction;)Ljava/util/stream/Node;
-HSPLjava/util/stream/Nodes;->flattenInt(Ljava/util/stream/Node$OfInt;)Ljava/util/stream/Node$OfInt;
-HSPLjava/util/stream/Nodes;->intBuilder(J)Ljava/util/stream/Node$Builder$OfInt;
-HSPLjava/util/stream/PipelineHelper;-><init>()V
-HSPLjava/util/stream/ReduceOps$12;->makeSink()Ljava/util/stream/ReduceOps$AccumulatingSink;
-HSPLjava/util/stream/ReduceOps$12ReducingSink;-><init>(Ljava/util/function/DoubleBinaryOperator;)V
-HSPLjava/util/stream/ReduceOps$12ReducingSink;->accept(D)V
-HSPLjava/util/stream/ReduceOps$12ReducingSink;->begin(J)V
-HSPLjava/util/stream/ReduceOps$12ReducingSink;->get()Ljava/lang/Object;
-HSPLjava/util/stream/ReduceOps$12ReducingSink;->get()Ljava/util/OptionalDouble;
-HSPLjava/util/stream/ReduceOps$2;-><init>(Ljava/util/stream/StreamShape;Ljava/util/function/BinaryOperator;)V
-HSPLjava/util/stream/ReduceOps$2;->makeSink()Ljava/util/stream/ReduceOps$2ReducingSink;
-HSPLjava/util/stream/ReduceOps$2;->makeSink()Ljava/util/stream/ReduceOps$AccumulatingSink;
-HSPLjava/util/stream/ReduceOps$2ReducingSink;-><init>(Ljava/util/function/BinaryOperator;)V
-HSPLjava/util/stream/ReduceOps$2ReducingSink;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/ReduceOps$2ReducingSink;->begin(J)V
-HSPLjava/util/stream/ReduceOps$2ReducingSink;->get()Ljava/lang/Object;
-HSPLjava/util/stream/ReduceOps$2ReducingSink;->get()Ljava/util/Optional;
-HSPLjava/util/stream/ReduceOps$3;-><init>(Ljava/util/stream/StreamShape;Ljava/util/function/BinaryOperator;Ljava/util/function/BiConsumer;Ljava/util/function/Supplier;Ljava/util/stream/Collector;)V
-HSPLjava/util/stream/ReduceOps$3;->getOpFlags()I
-HSPLjava/util/stream/ReduceOps$3;->makeSink()Ljava/util/stream/ReduceOps$3ReducingSink;
-HSPLjava/util/stream/ReduceOps$3;->makeSink()Ljava/util/stream/ReduceOps$AccumulatingSink;
-HSPLjava/util/stream/ReduceOps$3ReducingSink;-><init>(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;)V
-HSPLjava/util/stream/ReduceOps$3ReducingSink;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/ReduceOps$3ReducingSink;->begin(J)V
-HSPLjava/util/stream/ReduceOps$5;->makeSink()Ljava/util/stream/ReduceOps$AccumulatingSink;
-HSPLjava/util/stream/ReduceOps$5ReducingSink;-><init>(ILjava/util/function/IntBinaryOperator;)V
-HSPLjava/util/stream/ReduceOps$5ReducingSink;->accept(I)V
-HSPLjava/util/stream/ReduceOps$5ReducingSink;->begin(J)V
-HSPLjava/util/stream/ReduceOps$5ReducingSink;->get()Ljava/lang/Integer;
-HSPLjava/util/stream/ReduceOps$5ReducingSink;->get()Ljava/lang/Object;
-HSPLjava/util/stream/ReduceOps$8;->makeSink()Ljava/util/stream/ReduceOps$AccumulatingSink;
-HSPLjava/util/stream/ReduceOps$8ReducingSink;-><init>(JLjava/util/function/LongBinaryOperator;)V
-HSPLjava/util/stream/ReduceOps$8ReducingSink;->accept(J)V
-HSPLjava/util/stream/ReduceOps$8ReducingSink;->begin(J)V
-HSPLjava/util/stream/ReduceOps$8ReducingSink;->get()Ljava/lang/Long;
-HSPLjava/util/stream/ReduceOps$8ReducingSink;->get()Ljava/lang/Object;
-HSPLjava/util/stream/ReduceOps$Box;-><init>()V
-HSPLjava/util/stream/ReduceOps$Box;->get()Ljava/lang/Object;
-HSPLjava/util/stream/ReduceOps$ReduceOp;-><init>(Ljava/util/stream/StreamShape;)V
-HSPLjava/util/stream/ReduceOps$ReduceOp;->evaluateSequential(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;)Ljava/lang/Object;
-HSPLjava/util/stream/ReduceOps;->makeDouble(Ljava/util/function/DoubleBinaryOperator;)Ljava/util/stream/TerminalOp;
-HSPLjava/util/stream/ReduceOps;->makeInt(ILjava/util/function/IntBinaryOperator;)Ljava/util/stream/TerminalOp;
-HSPLjava/util/stream/ReduceOps;->makeLong(JLjava/util/function/LongBinaryOperator;)Ljava/util/stream/TerminalOp;
-HSPLjava/util/stream/ReduceOps;->makeRef(Ljava/util/function/BinaryOperator;)Ljava/util/stream/TerminalOp;
-HSPLjava/util/stream/ReduceOps;->makeRef(Ljava/util/stream/Collector;)Ljava/util/stream/TerminalOp;
-HSPLjava/util/stream/ReferencePipeline$15$1;-><init>(Ljava/util/stream/ReferencePipeline$15;Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/ReferencePipeline$15$1;->accept(Ljava/lang/Object;)V+]Ljava/util/stream/Sink;Ljava/util/stream/ReduceOps$3ReducingSink;]Ljava/util/function/Consumer;Landroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda2;
-HSPLjava/util/stream/ReferencePipeline$15;-><init>(Ljava/util/stream/ReferencePipeline;Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;ILjava/util/function/Consumer;)V
-HSPLjava/util/stream/ReferencePipeline$15;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/ReferencePipeline$2$1;-><init>(Ljava/util/stream/ReferencePipeline$2;Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/ReferencePipeline$2$1;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/ReferencePipeline$2$1;->begin(J)V
-HSPLjava/util/stream/ReferencePipeline$2;-><init>(Ljava/util/stream/ReferencePipeline;Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;ILjava/util/function/Predicate;)V
-HSPLjava/util/stream/ReferencePipeline$2;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/ReferencePipeline$3$1;-><init>(Ljava/util/stream/ReferencePipeline$3;Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/ReferencePipeline$3$1;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/ReferencePipeline$3;-><init>(Ljava/util/stream/ReferencePipeline;Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;ILjava/util/function/Function;)V
-HSPLjava/util/stream/ReferencePipeline$3;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/ReferencePipeline$4$1;-><init>(Ljava/util/stream/ReferencePipeline$4;Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/ReferencePipeline$4$1;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/ReferencePipeline$4;-><init>(Ljava/util/stream/ReferencePipeline;Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;ILjava/util/function/ToIntFunction;)V
-HSPLjava/util/stream/ReferencePipeline$4;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/ReferencePipeline$5$1;-><init>(Ljava/util/stream/ReferencePipeline$5;Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/ReferencePipeline$5$1;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/ReferencePipeline$5;-><init>(Ljava/util/stream/ReferencePipeline;Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;ILjava/util/function/ToLongFunction;)V
-HSPLjava/util/stream/ReferencePipeline$5;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/ReferencePipeline$6$1;-><init>(Ljava/util/stream/ReferencePipeline$6;Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/ReferencePipeline$6$1;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/ReferencePipeline$6;-><init>(Ljava/util/stream/ReferencePipeline;Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;ILjava/util/function/ToDoubleFunction;)V
-HSPLjava/util/stream/ReferencePipeline$6;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/ReferencePipeline$7$1;-><init>(Ljava/util/stream/ReferencePipeline$7;Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/ReferencePipeline$7$1;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/ReferencePipeline$7$1;->begin(J)V
-HSPLjava/util/stream/ReferencePipeline$7;-><init>(Ljava/util/stream/ReferencePipeline;Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;ILjava/util/function/Function;)V
-HSPLjava/util/stream/ReferencePipeline$7;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/ReferencePipeline$Head;-><init>(Ljava/util/Spliterator;IZ)V
-HSPLjava/util/stream/ReferencePipeline$Head;->forEach(Ljava/util/function/Consumer;)V
-HSPLjava/util/stream/ReferencePipeline$StatefulOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-HSPLjava/util/stream/ReferencePipeline$StatefulOp;->opIsStateful()Z
-HSPLjava/util/stream/ReferencePipeline$StatelessOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-HSPLjava/util/stream/ReferencePipeline$StatelessOp;->opIsStateful()Z
-HSPLjava/util/stream/ReferencePipeline;-><init>(Ljava/util/Spliterator;IZ)V
-HSPLjava/util/stream/ReferencePipeline;-><init>(Ljava/util/stream/AbstractPipeline;I)V
-HSPLjava/util/stream/ReferencePipeline;->allMatch(Ljava/util/function/Predicate;)Z
-HSPLjava/util/stream/ReferencePipeline;->anyMatch(Ljava/util/function/Predicate;)Z
-HSPLjava/util/stream/ReferencePipeline;->collect(Ljava/util/stream/Collector;)Ljava/lang/Object;
-HSPLjava/util/stream/ReferencePipeline;->count()J
-HSPLjava/util/stream/ReferencePipeline;->distinct()Ljava/util/stream/Stream;
-HSPLjava/util/stream/ReferencePipeline;->filter(Ljava/util/function/Predicate;)Ljava/util/stream/Stream;
-HSPLjava/util/stream/ReferencePipeline;->findAny()Ljava/util/Optional;
-HSPLjava/util/stream/ReferencePipeline;->findFirst()Ljava/util/Optional;
-HSPLjava/util/stream/ReferencePipeline;->flatMap(Ljava/util/function/Function;)Ljava/util/stream/Stream;
-HSPLjava/util/stream/ReferencePipeline;->forEach(Ljava/util/function/Consumer;)V
-HSPLjava/util/stream/ReferencePipeline;->forEachWithCancel(Ljava/util/Spliterator;Ljava/util/stream/Sink;)Z
-HSPLjava/util/stream/ReferencePipeline;->makeNodeBuilder(JLjava/util/function/IntFunction;)Ljava/util/stream/Node$Builder;
-HSPLjava/util/stream/ReferencePipeline;->map(Ljava/util/function/Function;)Ljava/util/stream/Stream;
-HSPLjava/util/stream/ReferencePipeline;->mapToDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/stream/DoubleStream;
-HSPLjava/util/stream/ReferencePipeline;->mapToInt(Ljava/util/function/ToIntFunction;)Ljava/util/stream/IntStream;
-HSPLjava/util/stream/ReferencePipeline;->mapToLong(Ljava/util/function/ToLongFunction;)Ljava/util/stream/LongStream;
-HSPLjava/util/stream/ReferencePipeline;->max(Ljava/util/Comparator;)Ljava/util/Optional;
-HSPLjava/util/stream/ReferencePipeline;->noneMatch(Ljava/util/function/Predicate;)Z
-HSPLjava/util/stream/ReferencePipeline;->peek(Ljava/util/function/Consumer;)Ljava/util/stream/Stream;
-HSPLjava/util/stream/ReferencePipeline;->reduce(Ljava/util/function/BinaryOperator;)Ljava/util/Optional;
-HSPLjava/util/stream/ReferencePipeline;->sorted()Ljava/util/stream/Stream;
-HSPLjava/util/stream/ReferencePipeline;->sorted(Ljava/util/Comparator;)Ljava/util/stream/Stream;
-HSPLjava/util/stream/ReferencePipeline;->toArray(Ljava/util/function/IntFunction;)[Ljava/lang/Object;
-HSPLjava/util/stream/ReferencePipeline;->wrap(Ljava/util/stream/PipelineHelper;Ljava/util/function/Supplier;Z)Ljava/util/Spliterator;
-HSPLjava/util/stream/Sink$ChainedInt;-><init>(Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/Sink$ChainedInt;->begin(J)V
-HSPLjava/util/stream/Sink$ChainedInt;->end()V
-HSPLjava/util/stream/Sink$ChainedReference;-><init>(Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/Sink$ChainedReference;->begin(J)V
-HSPLjava/util/stream/Sink$ChainedReference;->cancellationRequested()Z
-HSPLjava/util/stream/Sink$ChainedReference;->end()V
-HSPLjava/util/stream/Sink;->begin(J)V
-HSPLjava/util/stream/Sink;->end()V
-HSPLjava/util/stream/SortedOps$AbstractRefSortingSink;-><init>(Ljava/util/stream/Sink;Ljava/util/Comparator;)V
-HSPLjava/util/stream/SortedOps$OfRef;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/Comparator;)V
-HSPLjava/util/stream/SortedOps$OfRef;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/SortedOps$RefSortingSink$$ExternalSyntheticLambda0;-><init>(Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/SortedOps$RefSortingSink$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/SortedOps$RefSortingSink;-><init>(Ljava/util/stream/Sink;Ljava/util/Comparator;)V
-HSPLjava/util/stream/SortedOps$RefSortingSink;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/SortedOps$RefSortingSink;->begin(J)V
-HSPLjava/util/stream/SortedOps$RefSortingSink;->end()V
-HSPLjava/util/stream/SortedOps$SizedRefSortingSink;-><init>(Ljava/util/stream/Sink;Ljava/util/Comparator;)V
-HSPLjava/util/stream/SortedOps$SizedRefSortingSink;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/SortedOps$SizedRefSortingSink;->begin(J)V
-HSPLjava/util/stream/SortedOps$SizedRefSortingSink;->end()V
-HSPLjava/util/stream/SortedOps;->makeRef(Ljava/util/stream/AbstractPipeline;Ljava/util/Comparator;)Ljava/util/stream/Stream;
-HSPLjava/util/stream/SpinedBuffer;-><init>()V
-HSPLjava/util/stream/SpinedBuffer;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/SpinedBuffer;->asArray(Ljava/util/function/IntFunction;)[Ljava/lang/Object;
-HSPLjava/util/stream/SpinedBuffer;->capacity()J
-HSPLjava/util/stream/SpinedBuffer;->clear()V
-HSPLjava/util/stream/SpinedBuffer;->copyInto([Ljava/lang/Object;I)V
-HSPLjava/util/stream/SpinedBuffer;->count()J
-HSPLjava/util/stream/SpinedBuffer;->ensureCapacity(J)V
-HSPLjava/util/stream/Stream;->builder()Ljava/util/stream/Stream$Builder;
-HSPLjava/util/stream/Stream;->concat(Ljava/util/stream/Stream;Ljava/util/stream/Stream;)Ljava/util/stream/Stream;
-HSPLjava/util/stream/Stream;->of([Ljava/lang/Object;)Ljava/util/stream/Stream;
-HSPLjava/util/stream/StreamOpFlag;->combineOpFlags(II)I
-HSPLjava/util/stream/StreamOpFlag;->fromCharacteristics(Ljava/util/Spliterator;)I
-HSPLjava/util/stream/StreamOpFlag;->getMask(I)I
-HSPLjava/util/stream/StreamOpFlag;->isKnown(I)Z
-HSPLjava/util/stream/StreamSupport;->intStream(Ljava/util/Spliterator$OfInt;Z)Ljava/util/stream/IntStream;
-HSPLjava/util/stream/StreamSupport;->stream(Ljava/util/Spliterator;Z)Ljava/util/stream/Stream;
-HSPLjava/util/stream/Streams$2;-><init>(Ljava/util/stream/BaseStream;Ljava/util/stream/BaseStream;)V
-HSPLjava/util/stream/Streams$ConcatSpliterator$OfRef;-><init>(Ljava/util/Spliterator;Ljava/util/Spliterator;)V
-HSPLjava/util/stream/Streams$ConcatSpliterator;-><init>(Ljava/util/Spliterator;Ljava/util/Spliterator;)V
-HSPLjava/util/stream/Streams$ConcatSpliterator;->characteristics()I
-HSPLjava/util/stream/Streams$RangeIntSpliterator;-><init>(III)V
-HSPLjava/util/stream/Streams$RangeIntSpliterator;-><init>(IIZ)V
-HSPLjava/util/stream/Streams$RangeIntSpliterator;->characteristics()I
-HSPLjava/util/stream/Streams$RangeIntSpliterator;->estimateSize()J
-HSPLjava/util/stream/Streams$RangeIntSpliterator;->forEachRemaining(Ljava/util/function/IntConsumer;)V
-HSPLjava/util/stream/Streams$RangeIntSpliterator;->getComparator()Ljava/util/Comparator;
-HSPLjava/util/stream/Streams;->composedClose(Ljava/util/stream/BaseStream;Ljava/util/stream/BaseStream;)Ljava/lang/Runnable;
-HSPLjava/util/stream/TerminalOp;->getOpFlags()I
-HSPLjava/util/zip/Adler32;-><init>()V
-HSPLjava/util/zip/Adler32;->getValue()J
-HSPLjava/util/zip/Adler32;->update([B)V
-HSPLjava/util/zip/Adler32;->update([BII)V
-HSPLjava/util/zip/CRC32;-><init>()V
-HSPLjava/util/zip/CRC32;->getValue()J
-HSPLjava/util/zip/CRC32;->reset()V
-HSPLjava/util/zip/CRC32;->update(I)V
-HSPLjava/util/zip/CRC32;->update([B)V
-HSPLjava/util/zip/CRC32;->update([BII)V
-HSPLjava/util/zip/CRC32;->updateByteBuffer(IJII)I
-HSPLjava/util/zip/CRC32;->updateBytes(I[BII)I
-HSPLjava/util/zip/CheckedInputStream;-><init>(Ljava/io/InputStream;Ljava/util/zip/Checksum;)V
-HSPLjava/util/zip/CheckedInputStream;->read()I
-HSPLjava/util/zip/CheckedInputStream;->read([BII)I
-HSPLjava/util/zip/Deflater$DeflaterZStreamRef;-><init>(Ljava/util/zip/Deflater;J)V
-HSPLjava/util/zip/Deflater$DeflaterZStreamRef;-><init>(Ljava/util/zip/Deflater;JLjava/util/zip/Deflater$DeflaterZStreamRef-IA;)V
-HSPLjava/util/zip/Deflater$DeflaterZStreamRef;->address()J
-HSPLjava/util/zip/Deflater$DeflaterZStreamRef;->clean()V+]Ljava/lang/ref/Cleaner$Cleanable;Ljdk/internal/ref/CleanerImpl$PhantomCleanableRef;
-HSPLjava/util/zip/Deflater$DeflaterZStreamRef;->run()V
-HSPLjava/util/zip/Deflater;->-$$Nest$smend(J)V
-HSPLjava/util/zip/Deflater;-><init>()V
-HSPLjava/util/zip/Deflater;-><init>(IZ)V
-HSPLjava/util/zip/Deflater;->deflate([BII)I
-HSPLjava/util/zip/Deflater;->deflate([BIII)I
-HSPLjava/util/zip/Deflater;->end()V
-HSPLjava/util/zip/Deflater;->ensureOpen()V
-HSPLjava/util/zip/Deflater;->finish()V
-HSPLjava/util/zip/Deflater;->finished()Z
-HSPLjava/util/zip/Deflater;->getBytesRead()J
-HSPLjava/util/zip/Deflater;->getTotalIn()I
-HSPLjava/util/zip/Deflater;->needsInput()Z
-HSPLjava/util/zip/Deflater;->reset()V
-HSPLjava/util/zip/Deflater;->setInput([BII)V
-HSPLjava/util/zip/Deflater;->setLevel(I)V
-HSPLjava/util/zip/DeflaterOutputStream;-><init>(Ljava/io/OutputStream;)V
-HSPLjava/util/zip/DeflaterOutputStream;-><init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;)V
-HSPLjava/util/zip/DeflaterOutputStream;-><init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;IZ)V
-HSPLjava/util/zip/DeflaterOutputStream;-><init>(Ljava/io/OutputStream;Z)V
-HSPLjava/util/zip/DeflaterOutputStream;->close()V
-HSPLjava/util/zip/DeflaterOutputStream;->deflate()V
-HSPLjava/util/zip/DeflaterOutputStream;->finish()V
-HSPLjava/util/zip/DeflaterOutputStream;->flush()V
-HSPLjava/util/zip/DeflaterOutputStream;->write([BII)V
-HSPLjava/util/zip/GZIPInputStream$1;-><init>(Ljava/util/zip/GZIPInputStream;Ljava/io/InputStream;)V
-HSPLjava/util/zip/GZIPInputStream;-><init>(Ljava/io/InputStream;)V
-HSPLjava/util/zip/GZIPInputStream;-><init>(Ljava/io/InputStream;I)V
-HSPLjava/util/zip/GZIPInputStream;->close()V
-HSPLjava/util/zip/GZIPInputStream;->ensureOpen()V
-HSPLjava/util/zip/GZIPInputStream;->read([BII)I
-HSPLjava/util/zip/GZIPInputStream;->readHeader(Ljava/io/InputStream;)I
-HSPLjava/util/zip/GZIPInputStream;->readTrailer()Z
-HSPLjava/util/zip/GZIPInputStream;->readUByte(Ljava/io/InputStream;)I
-HSPLjava/util/zip/GZIPInputStream;->readUInt(Ljava/io/InputStream;)J
-HSPLjava/util/zip/GZIPInputStream;->readUShort(Ljava/io/InputStream;)I
-HSPLjava/util/zip/GZIPInputStream;->skipBytes(Ljava/io/InputStream;I)V
-HSPLjava/util/zip/GZIPOutputStream;-><init>(Ljava/io/OutputStream;)V
-HSPLjava/util/zip/GZIPOutputStream;-><init>(Ljava/io/OutputStream;IZ)V
-HSPLjava/util/zip/GZIPOutputStream;->finish()V
-HSPLjava/util/zip/GZIPOutputStream;->write([BII)V
-HSPLjava/util/zip/GZIPOutputStream;->writeHeader()V
-HSPLjava/util/zip/GZIPOutputStream;->writeInt(I[BI)V
-HSPLjava/util/zip/GZIPOutputStream;->writeShort(I[BI)V
-HSPLjava/util/zip/GZIPOutputStream;->writeTrailer([BI)V
-HSPLjava/util/zip/Inflater$InflaterZStreamRef;->address()J
-HSPLjava/util/zip/Inflater$InflaterZStreamRef;->clean()V+]Ljava/lang/ref/Cleaner$Cleanable;Ljdk/internal/ref/CleanerImpl$PhantomCleanableRef;
-HSPLjava/util/zip/Inflater$InflaterZStreamRef;->run()V
-HSPLjava/util/zip/Inflater;->-$$Nest$smend(J)V
-HSPLjava/util/zip/Inflater;-><init>()V
-HSPLjava/util/zip/Inflater;-><init>(Z)V
-HSPLjava/util/zip/Inflater;->end()V
-HSPLjava/util/zip/Inflater;->ensureOpen()V
-HSPLjava/util/zip/Inflater;->finished()Z
-HSPLjava/util/zip/Inflater;->getBytesRead()J
-HSPLjava/util/zip/Inflater;->getBytesWritten()J
-HSPLjava/util/zip/Inflater;->getRemaining()I
-HSPLjava/util/zip/Inflater;->getTotalOut()I
-HSPLjava/util/zip/Inflater;->inflate([BII)I
-HSPLjava/util/zip/Inflater;->needsDictionary()Z
-HSPLjava/util/zip/Inflater;->needsInput()Z
-HSPLjava/util/zip/Inflater;->reset()V
-HSPLjava/util/zip/Inflater;->setInput([BII)V
-HSPLjava/util/zip/InflaterInputStream;-><init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;)V
-HSPLjava/util/zip/InflaterInputStream;-><init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;I)V
-HSPLjava/util/zip/InflaterInputStream;-><init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;IZ)V
-HSPLjava/util/zip/InflaterInputStream;->available()I
-HSPLjava/util/zip/InflaterInputStream;->close()V
-HSPLjava/util/zip/InflaterInputStream;->ensureOpen()V
-HSPLjava/util/zip/InflaterInputStream;->fill()V
-HSPLjava/util/zip/InflaterInputStream;->read()I
-HSPLjava/util/zip/InflaterInputStream;->read([BII)I
-HSPLjava/util/zip/ZipCoder$UTF8ZipCoder;->checkedHash([BII)I
-HSPLjava/util/zip/ZipCoder$UTF8ZipCoder;->hasTrailingSlash([BI)Z
-HSPLjava/util/zip/ZipCoder$UTF8ZipCoder;->isUTF8()Z
-HSPLjava/util/zip/ZipCoder$UTF8ZipCoder;->toString([BII)Ljava/lang/String;
-HSPLjava/util/zip/ZipCoder;-><init>(Ljava/nio/charset/Charset;)V
-HSPLjava/util/zip/ZipCoder;->decoder()Ljava/nio/charset/CharsetDecoder;
-HSPLjava/util/zip/ZipCoder;->encoder()Ljava/nio/charset/CharsetEncoder;
-HSPLjava/util/zip/ZipCoder;->get(Ljava/nio/charset/Charset;)Ljava/util/zip/ZipCoder;
-HSPLjava/util/zip/ZipCoder;->getBytes(Ljava/lang/String;)[B
-HSPLjava/util/zip/ZipCoder;->isUTF8()Z
-HSPLjava/util/zip/ZipCoder;->toString([BI)Ljava/lang/String;
-HSPLjava/util/zip/ZipEntry;-><init>()V
-HSPLjava/util/zip/ZipEntry;-><init>(Ljava/lang/String;)V
-HSPLjava/util/zip/ZipEntry;-><init>(Ljava/util/zip/ZipEntry;)V
-HSPLjava/util/zip/ZipEntry;->getCompressedSize()J
-HSPLjava/util/zip/ZipEntry;->getCrc()J
-HSPLjava/util/zip/ZipEntry;->getMethod()I
-HSPLjava/util/zip/ZipEntry;->getName()Ljava/lang/String;
-HSPLjava/util/zip/ZipEntry;->getSize()J
-HSPLjava/util/zip/ZipEntry;->isDirectory()Z
-HSPLjava/util/zip/ZipEntry;->setExtra0([BZZ)V
-HSPLjava/util/zip/ZipFile$CleanableResource;-><init>(Ljava/util/zip/ZipFile;Ljava/util/zip/ZipCoder;Ljava/io/File;IZ)V
-HSPLjava/util/zip/ZipFile$CleanableResource;->clean()V+]Ljava/lang/ref/Cleaner$Cleanable;Ljdk/internal/ref/CleanerImpl$PhantomCleanableRef;
-HSPLjava/util/zip/ZipFile$CleanableResource;->getInflater()Ljava/util/zip/Inflater;+]Ljava/util/Deque;Ljava/util/ArrayDeque;
-HSPLjava/util/zip/ZipFile$CleanableResource;->releaseInflater(Ljava/util/zip/Inflater;)V+]Ljava/util/Deque;Ljava/util/ArrayDeque;]Ljava/util/zip/Inflater;Ljava/util/zip/Inflater;
-HSPLjava/util/zip/ZipFile$CleanableResource;->run()V+]Ljava/util/Deque;Ljava/util/ArrayDeque;]Ljava/util/Set;Ljava/util/Collections$SetFromMap;]Ljava/util/zip/Inflater;Ljava/util/zip/Inflater;
-HSPLjava/util/zip/ZipFile$InflaterCleanupAction;->run()V+]Ljava/util/zip/ZipFile$CleanableResource;Ljava/util/zip/ZipFile$CleanableResource;
-HSPLjava/util/zip/ZipFile$Source$End;-><init>()V
-HSPLjava/util/zip/ZipFile$Source$End;-><init>(Ljava/util/zip/ZipFile$Source$End-IA;)V
-HSPLjava/util/zip/ZipFile$Source$Key;-><init>(Ljava/io/File;Ljava/nio/file/attribute/BasicFileAttributes;Ljava/util/zip/ZipCoder;Z)V
-HSPLjava/util/zip/ZipFile$Source$Key;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Lsun/nio/fs/UnixFileKey;]Ljava/nio/file/attribute/BasicFileAttributes;Lsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;
-HSPLjava/util/zip/ZipFile$Source$Key;->hashCode()I
-HSPLjava/util/zip/ZipFile$Source;->-$$Nest$fgetlocpos(Ljava/util/zip/ZipFile$Source;)J
-HSPLjava/util/zip/ZipFile$Source;->-$$Nest$mgetEntryPos(Ljava/util/zip/ZipFile$Source;Ljava/lang/String;Z)I
-HSPLjava/util/zip/ZipFile$Source;->-$$Nest$mreadAt(Ljava/util/zip/ZipFile$Source;[BIIJ)I
-HSPLjava/util/zip/ZipFile$Source;->-$$Nest$mreadFullyAt(Ljava/util/zip/ZipFile$Source;[BIIJ)I
-HSPLjava/util/zip/ZipFile$Source;-><init>(Ljava/util/zip/ZipFile$Source$Key;ZLjava/util/zip/ZipCoder;)V
-HSPLjava/util/zip/ZipFile$Source;->checkAndAddEntry(II)I
-HSPLjava/util/zip/ZipFile$Source;->close()V+]Ljava/io/RandomAccessFile;Ljava/io/RandomAccessFile;
-HSPLjava/util/zip/ZipFile$Source;->findEND()Ljava/util/zip/ZipFile$Source$End;
-HSPLjava/util/zip/ZipFile$Source;->get(Ljava/io/File;ZLjava/util/zip/ZipCoder;Z)Ljava/util/zip/ZipFile$Source;
-HSPLjava/util/zip/ZipFile$Source;->getEntryPos(Ljava/lang/String;Z)I
-HSPLjava/util/zip/ZipFile$Source;->getMetaVersion(II)I
-HSPLjava/util/zip/ZipFile$Source;->initCEN(I)V
-HSPLjava/util/zip/ZipFile$Source;->isManifestName(II)Z
-HSPLjava/util/zip/ZipFile$Source;->isMetaName([BII)Z
-HSPLjava/util/zip/ZipFile$Source;->isSignatureRelated(II)Z
-HSPLjava/util/zip/ZipFile$Source;->nextEntryPos(III)I
-HSPLjava/util/zip/ZipFile$Source;->readAt([BIIJ)I+]Ljava/io/RandomAccessFile;Ljava/io/RandomAccessFile;
-HSPLjava/util/zip/ZipFile$Source;->readFullyAt([BIIJ)I
-HSPLjava/util/zip/ZipFile$Source;->release(Ljava/util/zip/ZipFile$Source;)V+]Ljava/util/HashMap;Ljava/util/HashMap;
-HSPLjava/util/zip/ZipFile$Source;->zipCoderForPos(I)Ljava/util/zip/ZipCoder;
-HSPLjava/util/zip/ZipFile$ZipEntryIterator;->hasMoreElements()Z
-HSPLjava/util/zip/ZipFile$ZipEntryIterator;->hasNext()Z
-HSPLjava/util/zip/ZipFile$ZipEntryIterator;->next()Ljava/util/zip/ZipEntry;
-HSPLjava/util/zip/ZipFile$ZipEntryIterator;->nextElement()Ljava/lang/Object;
-HSPLjava/util/zip/ZipFile$ZipEntryIterator;->nextElement()Ljava/util/zip/ZipEntry;
-HSPLjava/util/zip/ZipFile$ZipFileInflaterInputStream;->available()I
-HSPLjava/util/zip/ZipFile$ZipFileInflaterInputStream;->close()V
-HSPLjava/util/zip/ZipFile$ZipFileInflaterInputStream;->fill()V
-HSPLjava/util/zip/ZipFile$ZipFileInputStream;-><init>(Ljava/util/zip/ZipFile;[BI)V
-HSPLjava/util/zip/ZipFile$ZipFileInputStream;->available()I
-HSPLjava/util/zip/ZipFile$ZipFileInputStream;->close()V
-HSPLjava/util/zip/ZipFile$ZipFileInputStream;->initDataOffset()J
-HSPLjava/util/zip/ZipFile$ZipFileInputStream;->read()I
-HSPLjava/util/zip/ZipFile$ZipFileInputStream;->read([BII)I
-HSPLjava/util/zip/ZipFile$ZipFileInputStream;->size()J
-HSPLjava/util/zip/ZipFile;->-$$Nest$fgetres(Ljava/util/zip/ZipFile;)Ljava/util/zip/ZipFile$CleanableResource;
-HSPLjava/util/zip/ZipFile;->-$$Nest$mensureOpen(Ljava/util/zip/ZipFile;)V
-HSPLjava/util/zip/ZipFile;-><init>(Ljava/io/File;)V
-HSPLjava/util/zip/ZipFile;-><init>(Ljava/io/File;I)V
-HSPLjava/util/zip/ZipFile;-><init>(Ljava/io/File;ILjava/nio/charset/Charset;)V
-HSPLjava/util/zip/ZipFile;-><init>(Ljava/io/File;ILjava/nio/charset/Charset;Z)V
-HSPLjava/util/zip/ZipFile;-><init>(Ljava/io/File;IZ)V
-HSPLjava/util/zip/ZipFile;-><init>(Ljava/lang/String;)V
-HSPLjava/util/zip/ZipFile;->close()V
-HSPLjava/util/zip/ZipFile;->ensureOpen()V
-HSPLjava/util/zip/ZipFile;->ensureOpenOrZipException()V
-HSPLjava/util/zip/ZipFile;->entries()Ljava/util/Enumeration;
-HSPLjava/util/zip/ZipFile;->getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;
-HSPLjava/util/zip/ZipFile;->getInputStream(Ljava/util/zip/ZipEntry;)Ljava/io/InputStream;
-HSPLjava/util/zip/ZipFile;->getZipEntry(Ljava/lang/String;I)Ljava/util/zip/ZipEntry;
-HSPLjava/util/zip/ZipInputStream;-><init>(Ljava/io/InputStream;)V
-HSPLjava/util/zip/ZipInputStream;-><init>(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V
-HSPLjava/util/zip/ZipInputStream;->close()V
-HSPLjava/util/zip/ZipInputStream;->closeEntry()V
-HSPLjava/util/zip/ZipInputStream;->createZipEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;
-HSPLjava/util/zip/ZipInputStream;->ensureOpen()V
-HSPLjava/util/zip/ZipInputStream;->getNextEntry()Ljava/util/zip/ZipEntry;
-HSPLjava/util/zip/ZipInputStream;->read([BII)I
-HSPLjava/util/zip/ZipInputStream;->readEnd(Ljava/util/zip/ZipEntry;)V
-HSPLjava/util/zip/ZipInputStream;->readFully([BII)V
-HSPLjava/util/zip/ZipInputStream;->readLOC()Ljava/util/zip/ZipEntry;
-HSPLjava/util/zip/ZipUtils;->CENFLG([BI)I
-HSPLjava/util/zip/ZipUtils;->CENLEN([BI)J
-HSPLjava/util/zip/ZipUtils;->CENOFF([BI)J
-HSPLjava/util/zip/ZipUtils;->CENSIZ([BI)J
-HSPLjava/util/zip/ZipUtils;->ENDCOM([B)I
-HSPLjava/util/zip/ZipUtils;->ENDOFF([B)J
-HSPLjava/util/zip/ZipUtils;->ENDSIZ([B)J
-HSPLjava/util/zip/ZipUtils;->ENDTOT([B)I
-HSPLjava/util/zip/ZipUtils;->GETSIG([B)J
-HSPLjava/util/zip/ZipUtils;->LG([BI)J
-HSPLjava/util/zip/ZipUtils;->LOCEXT([B)I
-HSPLjava/util/zip/ZipUtils;->LOCNAM([B)I
-HSPLjava/util/zip/ZipUtils;->LOCSIG([B)J
-HSPLjava/util/zip/ZipUtils;->SH([BI)I
-HSPLjava/util/zip/ZipUtils;->get16([BI)I
-HSPLjava/util/zip/ZipUtils;->get32([BI)J
-HSPLjava/util/zip/ZipUtils;->unixTimeToFileTime(J)Ljava/nio/file/attribute/FileTime;
-HSPLjavax/crypto/Cipher$CipherSpiAndProvider;-><init>(Ljavax/crypto/CipherSpi;Ljava/security/Provider;)V
-HSPLjavax/crypto/Cipher$InitParams;-><init>(Ljavax/crypto/Cipher$InitType;ILjava/security/Key;Ljava/security/SecureRandom;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/AlgorithmParameters;)V
-HSPLjavax/crypto/Cipher$SpiAndProviderUpdater;-><init>(Ljavax/crypto/Cipher;Ljava/security/Provider;Ljavax/crypto/CipherSpi;)V
-HSPLjavax/crypto/Cipher$SpiAndProviderUpdater;->setCipherSpiImplAndProvider(Ljavax/crypto/CipherSpi;Ljava/security/Provider;)V
-HSPLjavax/crypto/Cipher$SpiAndProviderUpdater;->updateAndGetSpiAndProvider(Ljavax/crypto/Cipher$InitParams;Ljavax/crypto/CipherSpi;Ljava/security/Provider;)Ljavax/crypto/Cipher$CipherSpiAndProvider;
-HSPLjavax/crypto/Cipher$Transform;-><init>(Ljava/lang/String;Ljavax/crypto/Cipher$NeedToSet;)V
-HSPLjavax/crypto/Cipher;-><init>(Ljavax/crypto/CipherSpi;Ljava/security/Provider;Ljava/lang/String;[Ljava/lang/String;)V
-HSPLjavax/crypto/Cipher;->checkCipherState()V
-HSPLjavax/crypto/Cipher;->checkOpmode(I)V
-HSPLjavax/crypto/Cipher;->chooseProvider(Ljavax/crypto/Cipher$InitType;ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/AlgorithmParameters;Ljava/security/SecureRandom;)V
-HSPLjavax/crypto/Cipher;->createCipher(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/Cipher;
-HSPLjavax/crypto/Cipher;->doFinal()[B
-HSPLjavax/crypto/Cipher;->doFinal(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I
-HSPLjavax/crypto/Cipher;->doFinal([B)[B
-HSPLjavax/crypto/Cipher;->doFinal([BI)I
-HSPLjavax/crypto/Cipher;->doFinal([BII)[B
-HSPLjavax/crypto/Cipher;->doFinal([BII[BI)I
-HSPLjavax/crypto/Cipher;->getBlockSize()I
-HSPLjavax/crypto/Cipher;->getIV()[B
-HSPLjavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;
-HSPLjavax/crypto/Cipher;->getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/Cipher;
-HSPLjavax/crypto/Cipher;->getOutputSize(I)I
-HSPLjavax/crypto/Cipher;->init(ILjava/security/Key;)V
-HSPLjavax/crypto/Cipher;->init(ILjava/security/Key;Ljava/security/SecureRandom;)V
-HSPLjavax/crypto/Cipher;->init(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V
-HSPLjavax/crypto/Cipher;->init(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V
-HSPLjavax/crypto/Cipher;->matchAttribute(Ljava/security/Provider$Service;Ljava/lang/String;Ljava/lang/String;)Z
-HSPLjavax/crypto/Cipher;->tokenizeTransformation(Ljava/lang/String;)[Ljava/lang/String;
-HSPLjavax/crypto/Cipher;->tryCombinations(Ljavax/crypto/Cipher$InitParams;Ljava/security/Provider;[Ljava/lang/String;)Ljavax/crypto/Cipher$CipherSpiAndProvider;
-HSPLjavax/crypto/Cipher;->tryTransformWithProvider(Ljavax/crypto/Cipher$InitParams;[Ljava/lang/String;Ljavax/crypto/Cipher$NeedToSet;Ljava/security/Provider$Service;)Ljavax/crypto/Cipher$CipherSpiAndProvider;
-HSPLjavax/crypto/Cipher;->unwrap([BLjava/lang/String;I)Ljava/security/Key;
-HSPLjavax/crypto/Cipher;->update([BII[BI)I
-HSPLjavax/crypto/Cipher;->updateAAD([B)V
-HSPLjavax/crypto/Cipher;->updateAAD([BII)V
-HSPLjavax/crypto/Cipher;->updateProviderIfNeeded()V
-HSPLjavax/crypto/CipherSpi;-><init>()V
-HSPLjavax/crypto/CipherSpi;->bufferCrypt(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;Z)I
-HSPLjavax/crypto/CipherSpi;->engineDoFinal(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I
-HSPLjavax/crypto/JarVerifier;-><init>(Ljava/net/URL;Z)V
-HSPLjavax/crypto/JarVerifier;->verify()V
-HSPLjavax/crypto/JceSecurity$1;-><init>(Ljava/lang/Class;)V
-HSPLjavax/crypto/JceSecurity$1;->run()Ljava/lang/Object;
-HSPLjavax/crypto/JceSecurity$1;->run()Ljava/net/URL;
-HSPLjavax/crypto/JceSecurity;->canUseProvider(Ljava/security/Provider;)Z
-HSPLjavax/crypto/JceSecurity;->getCodeBase(Ljava/lang/Class;)Ljava/net/URL;
-HSPLjavax/crypto/JceSecurity;->getInstance(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)Lsun/security/jca/GetInstance$Instance;
-HSPLjavax/crypto/JceSecurity;->getInstance(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;Ljava/security/Provider;)Lsun/security/jca/GetInstance$Instance;
-HSPLjavax/crypto/JceSecurity;->getVerificationResult(Ljava/security/Provider;)Ljava/lang/Exception;
-HSPLjavax/crypto/JceSecurity;->verifyProviderJar(Ljava/net/URL;)V
-HSPLjavax/crypto/KeyGenerator;-><init>(Ljava/lang/String;)V
-HSPLjavax/crypto/KeyGenerator;->generateKey()Ljavax/crypto/SecretKey;
-HSPLjavax/crypto/KeyGenerator;->getInstance(Ljava/lang/String;)Ljavax/crypto/KeyGenerator;
-HSPLjavax/crypto/KeyGenerator;->init(ILjava/security/SecureRandom;)V
-HSPLjavax/crypto/KeyGenerator;->nextSpi(Ljavax/crypto/KeyGeneratorSpi;Z)Ljavax/crypto/KeyGeneratorSpi;
-HSPLjavax/crypto/KeyGeneratorSpi;-><init>()V
-HSPLjavax/crypto/Mac;-><init>(Ljava/lang/String;)V
-HSPLjavax/crypto/Mac;-><init>(Ljavax/crypto/MacSpi;Ljava/security/Provider;Ljava/lang/String;)V
-HSPLjavax/crypto/Mac;->chooseFirstProvider()V
-HSPLjavax/crypto/Mac;->chooseProvider(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V
-HSPLjavax/crypto/Mac;->doFinal()[B
-HSPLjavax/crypto/Mac;->doFinal([B)[B
-HSPLjavax/crypto/Mac;->doFinal([BI)V
-HSPLjavax/crypto/Mac;->getAlgorithm()Ljava/lang/String;
-HSPLjavax/crypto/Mac;->getInstance(Ljava/lang/String;)Ljavax/crypto/Mac;
-HSPLjavax/crypto/Mac;->getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/Mac;
-HSPLjavax/crypto/Mac;->getMacLength()I
-HSPLjavax/crypto/Mac;->init(Ljava/security/Key;)V
-HSPLjavax/crypto/Mac;->update(B)V
-HSPLjavax/crypto/Mac;->update([B)V
-HSPLjavax/crypto/Mac;->update([BII)V
-HSPLjavax/crypto/MacSpi;-><init>()V
-HSPLjavax/crypto/SecretKeyFactory;-><init>(Ljava/lang/String;)V
-HSPLjavax/crypto/SecretKeyFactory;->generateSecret(Ljava/security/spec/KeySpec;)Ljavax/crypto/SecretKey;
-HSPLjavax/crypto/SecretKeyFactory;->getInstance(Ljava/lang/String;)Ljavax/crypto/SecretKeyFactory;
-HSPLjavax/crypto/SecretKeyFactory;->nextSpi(Ljavax/crypto/SecretKeyFactorySpi;)Ljavax/crypto/SecretKeyFactorySpi;
-HSPLjavax/crypto/SecretKeyFactorySpi;-><init>()V
-HSPLjavax/crypto/spec/GCMParameterSpec;-><init>(I[B)V
-HSPLjavax/crypto/spec/GCMParameterSpec;-><init>(I[BII)V
-HSPLjavax/crypto/spec/GCMParameterSpec;->getIV()[B
-HSPLjavax/crypto/spec/GCMParameterSpec;->getTLen()I
-HSPLjavax/crypto/spec/GCMParameterSpec;->init(I[BII)V
-HSPLjavax/crypto/spec/IvParameterSpec;-><init>([B)V
-HSPLjavax/crypto/spec/IvParameterSpec;-><init>([BII)V
-HSPLjavax/crypto/spec/IvParameterSpec;->getIV()[B
-HSPLjavax/crypto/spec/PBEKeySpec;-><init>([C[BII)V
-HSPLjavax/crypto/spec/PBEKeySpec;->getIterationCount()I
-HSPLjavax/crypto/spec/PBEKeySpec;->getKeyLength()I
-HSPLjavax/crypto/spec/PBEKeySpec;->getPassword()[C
-HSPLjavax/crypto/spec/PBEKeySpec;->getSalt()[B
-HSPLjavax/crypto/spec/SecretKeySpec;-><init>([BLjava/lang/String;)V
-HSPLjavax/crypto/spec/SecretKeySpec;->getAlgorithm()Ljava/lang/String;
-HSPLjavax/crypto/spec/SecretKeySpec;->getEncoded()[B
-HSPLjavax/crypto/spec/SecretKeySpec;->getFormat()Ljava/lang/String;
-HSPLjavax/microedition/khronos/egl/EGLContext;->getEGL()Ljavax/microedition/khronos/egl/EGL;
-HSPLjavax/microedition/khronos/egl/EGLSurface;-><init>()V
-HSPLjavax/net/DefaultSocketFactory;-><init>()V
-HSPLjavax/net/DefaultSocketFactory;->createSocket()Ljava/net/Socket;
-HSPLjavax/net/DefaultSocketFactory;->createSocket(Ljava/net/InetAddress;I)Ljava/net/Socket;
-HSPLjavax/net/ServerSocketFactory;-><init>()V
-HSPLjavax/net/SocketFactory;-><init>()V
-HSPLjavax/net/SocketFactory;->getDefault()Ljavax/net/SocketFactory;
-HSPLjavax/net/ssl/ExtendedSSLSession;-><init>()V
-HSPLjavax/net/ssl/HttpsURLConnection$NoPreloadHolder;-><clinit>()V
-HSPLjavax/net/ssl/HttpsURLConnection;-><init>(Ljava/net/URL;)V
-HSPLjavax/net/ssl/HttpsURLConnection;->getDefaultHostnameVerifier()Ljavax/net/ssl/HostnameVerifier;
-HSPLjavax/net/ssl/HttpsURLConnection;->getDefaultSSLSocketFactory()Ljavax/net/ssl/SSLSocketFactory;
-HSPLjavax/net/ssl/HttpsURLConnection;->setDefaultHostnameVerifier(Ljavax/net/ssl/HostnameVerifier;)V
-HSPLjavax/net/ssl/HttpsURLConnection;->setDefaultSSLSocketFactory(Ljavax/net/ssl/SSLSocketFactory;)V
-HSPLjavax/net/ssl/KeyManagerFactory$1;-><init>()V
-HSPLjavax/net/ssl/KeyManagerFactory$1;->run()Ljava/lang/Object;
-HSPLjavax/net/ssl/KeyManagerFactory$1;->run()Ljava/lang/String;
-HSPLjavax/net/ssl/KeyManagerFactory;-><init>(Ljavax/net/ssl/KeyManagerFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V
-HSPLjavax/net/ssl/KeyManagerFactory;->getDefaultAlgorithm()Ljava/lang/String;
-HSPLjavax/net/ssl/KeyManagerFactory;->getInstance(Ljava/lang/String;)Ljavax/net/ssl/KeyManagerFactory;
-HSPLjavax/net/ssl/KeyManagerFactory;->getKeyManagers()[Ljavax/net/ssl/KeyManager;
-HSPLjavax/net/ssl/KeyManagerFactory;->init(Ljava/security/KeyStore;[C)V
-HSPLjavax/net/ssl/KeyManagerFactorySpi;-><init>()V
-HSPLjavax/net/ssl/SNIHostName;-><init>(Ljava/lang/String;)V
-HSPLjavax/net/ssl/SNIHostName;->checkHostName()V
-HSPLjavax/net/ssl/SNIHostName;->getAsciiName()Ljava/lang/String;
-HSPLjavax/net/ssl/SNIServerName;-><init>(I[B)V
-HSPLjavax/net/ssl/SNIServerName;->getType()I
-HSPLjavax/net/ssl/SSLContext;-><init>(Ljavax/net/ssl/SSLContextSpi;Ljava/security/Provider;Ljava/lang/String;)V
-HSPLjavax/net/ssl/SSLContext;->getClientSessionContext()Ljavax/net/ssl/SSLSessionContext;
-HSPLjavax/net/ssl/SSLContext;->getDefault()Ljavax/net/ssl/SSLContext;
-HSPLjavax/net/ssl/SSLContext;->getInstance(Ljava/lang/String;)Ljavax/net/ssl/SSLContext;
-HSPLjavax/net/ssl/SSLContext;->getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/net/ssl/SSLContext;
-HSPLjavax/net/ssl/SSLContext;->getServerSocketFactory()Ljavax/net/ssl/SSLServerSocketFactory;
-HSPLjavax/net/ssl/SSLContext;->getSocketFactory()Ljavax/net/ssl/SSLSocketFactory;
-HSPLjavax/net/ssl/SSLContext;->init([Ljavax/net/ssl/KeyManager;[Ljavax/net/ssl/TrustManager;Ljava/security/SecureRandom;)V
-HSPLjavax/net/ssl/SSLContext;->setDefault(Ljavax/net/ssl/SSLContext;)V
-HSPLjavax/net/ssl/SSLContextSpi;-><init>()V
-HSPLjavax/net/ssl/SSLEngine;-><init>()V
-HSPLjavax/net/ssl/SSLEngine;->getSSLParameters()Ljavax/net/ssl/SSLParameters;
-HSPLjavax/net/ssl/SSLEngine;->setSSLParameters(Ljavax/net/ssl/SSLParameters;)V
-HSPLjavax/net/ssl/SSLEngine;->wrap([Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;
-HSPLjavax/net/ssl/SSLEngineResult$HandshakeStatus;->values()[Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
-HSPLjavax/net/ssl/SSLEngineResult$Status;->values()[Ljavax/net/ssl/SSLEngineResult$Status;
-HSPLjavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
-HSPLjavax/net/ssl/SSLEngineResult;->bytesConsumed()I
-HSPLjavax/net/ssl/SSLEngineResult;->bytesProduced()I
-HSPLjavax/net/ssl/SSLEngineResult;->getHandshakeStatus()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
-HSPLjavax/net/ssl/SSLEngineResult;->getStatus()Ljavax/net/ssl/SSLEngineResult$Status;
-HSPLjavax/net/ssl/SSLException;-><init>(Ljava/lang/String;)V
-HSPLjavax/net/ssl/SSLParameters;-><init>()V
-HSPLjavax/net/ssl/SSLParameters;->clone([Ljava/lang/String;)[Ljava/lang/String;
-HSPLjavax/net/ssl/SSLParameters;->getApplicationProtocols()[Ljava/lang/String;
-HSPLjavax/net/ssl/SSLParameters;->getCipherSuites()[Ljava/lang/String;
-HSPLjavax/net/ssl/SSLParameters;->getEndpointIdentificationAlgorithm()Ljava/lang/String;
-HSPLjavax/net/ssl/SSLParameters;->getNeedClientAuth()Z
-HSPLjavax/net/ssl/SSLParameters;->getProtocols()[Ljava/lang/String;
-HSPLjavax/net/ssl/SSLParameters;->getServerNames()Ljava/util/List;
-HSPLjavax/net/ssl/SSLParameters;->getUseCipherSuitesOrder()Z
-HSPLjavax/net/ssl/SSLParameters;->getWantClientAuth()Z
-HSPLjavax/net/ssl/SSLParameters;->setApplicationProtocols([Ljava/lang/String;)V
-HSPLjavax/net/ssl/SSLParameters;->setCipherSuites([Ljava/lang/String;)V
-HSPLjavax/net/ssl/SSLParameters;->setEndpointIdentificationAlgorithm(Ljava/lang/String;)V
-HSPLjavax/net/ssl/SSLParameters;->setProtocols([Ljava/lang/String;)V
-HSPLjavax/net/ssl/SSLParameters;->setServerNames(Ljava/util/List;)V
-HSPLjavax/net/ssl/SSLParameters;->setUseCipherSuitesOrder(Z)V
-HSPLjavax/net/ssl/SSLServerSocketFactory;-><init>()V
-HSPLjavax/net/ssl/SSLServerSocketFactory;->getDefault()Ljavax/net/ServerSocketFactory;
-HSPLjavax/net/ssl/SSLServerSocketFactory;->log(Ljava/lang/String;)V
-HSPLjavax/net/ssl/SSLSocket;-><init>()V
-HSPLjavax/net/ssl/SSLSocket;->getSSLParameters()Ljavax/net/ssl/SSLParameters;
-HSPLjavax/net/ssl/SSLSocket;->setSSLParameters(Ljavax/net/ssl/SSLParameters;)V
-HSPLjavax/net/ssl/SSLSocketFactory$1;-><init>(Ljava/lang/String;)V
-HSPLjavax/net/ssl/SSLSocketFactory$1;->run()Ljava/lang/Object;
-HSPLjavax/net/ssl/SSLSocketFactory$1;->run()Ljava/lang/String;
-HSPLjavax/net/ssl/SSLSocketFactory;-><init>()V
-HSPLjavax/net/ssl/SSLSocketFactory;->getDefault()Ljavax/net/SocketFactory;
-HSPLjavax/net/ssl/SSLSocketFactory;->getSecurityProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLjavax/net/ssl/SSLSocketFactory;->log(Ljava/lang/String;)V
-HSPLjavax/net/ssl/TrustManagerFactory$1;-><init>()V
-HSPLjavax/net/ssl/TrustManagerFactory$1;->run()Ljava/lang/Object;
-HSPLjavax/net/ssl/TrustManagerFactory$1;->run()Ljava/lang/String;
-HSPLjavax/net/ssl/TrustManagerFactory;-><init>(Ljavax/net/ssl/TrustManagerFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V
-HSPLjavax/net/ssl/TrustManagerFactory;->getDefaultAlgorithm()Ljava/lang/String;
-HSPLjavax/net/ssl/TrustManagerFactory;->getInstance(Ljava/lang/String;)Ljavax/net/ssl/TrustManagerFactory;
-HSPLjavax/net/ssl/TrustManagerFactory;->getTrustManagers()[Ljavax/net/ssl/TrustManager;
-HSPLjavax/net/ssl/TrustManagerFactory;->init(Ljava/security/KeyStore;)V
-HSPLjavax/net/ssl/TrustManagerFactorySpi;-><init>()V
-HSPLjavax/net/ssl/X509ExtendedKeyManager;-><init>()V
-HSPLjavax/net/ssl/X509ExtendedTrustManager;-><init>()V
-HSPLjavax/security/auth/x500/X500Principal;-><init>(Ljava/lang/String;)V
-HSPLjavax/security/auth/x500/X500Principal;-><init>(Ljava/lang/String;Ljava/util/Map;)V
-HSPLjavax/security/auth/x500/X500Principal;-><init>(Lsun/security/x509/X500Name;)V
-HSPLjavax/security/auth/x500/X500Principal;-><init>([B)V
-HSPLjavax/security/auth/x500/X500Principal;->equals(Ljava/lang/Object;)Z
-HSPLjavax/security/auth/x500/X500Principal;->getEncoded()[B
-HSPLjavax/security/auth/x500/X500Principal;->getName()Ljava/lang/String;
-HSPLjavax/security/auth/x500/X500Principal;->getName(Ljava/lang/String;)Ljava/lang/String;
-HSPLjavax/security/auth/x500/X500Principal;->hashCode()I
-HSPLjavax/xml/parsers/DocumentBuilder;-><init>()V
-HSPLjavax/xml/parsers/DocumentBuilder;->parse(Ljava/io/InputStream;)Lorg/w3c/dom/Document;
-HSPLjavax/xml/parsers/DocumentBuilderFactory;-><init>()V
-HSPLjavax/xml/parsers/DocumentBuilderFactory;->isCoalescing()Z
-HSPLjavax/xml/parsers/DocumentBuilderFactory;->isIgnoringComments()Z
-HSPLjavax/xml/parsers/DocumentBuilderFactory;->isIgnoringElementContentWhitespace()Z
-HSPLjavax/xml/parsers/DocumentBuilderFactory;->isNamespaceAware()Z
-HSPLjavax/xml/parsers/DocumentBuilderFactory;->isValidating()Z
-HSPLjavax/xml/parsers/DocumentBuilderFactory;->newInstance()Ljavax/xml/parsers/DocumentBuilderFactory;
-HSPLjavax/xml/parsers/SAXParserFactory;-><init>()V
-HSPLjavax/xml/parsers/SAXParserFactory;->newInstance()Ljavax/xml/parsers/SAXParserFactory;
-HSPLjdk/internal/access/SharedSecrets;->getJavaUtilCollectionAccess()Ljdk/internal/access/JavaUtilCollectionAccess;
-HSPLjdk/internal/access/SharedSecrets;->setJavaUtilCollectionAccess(Ljdk/internal/access/JavaUtilCollectionAccess;)V
-HSPLjdk/internal/math/FDBigInteger;-><init>(J[CII)V
-HSPLjdk/internal/math/FDBigInteger;-><init>([II)V
-HSPLjdk/internal/math/FDBigInteger;->add(Ljdk/internal/math/FDBigInteger;)Ljdk/internal/math/FDBigInteger;
-HSPLjdk/internal/math/FDBigInteger;->addAndCmp(Ljdk/internal/math/FDBigInteger;Ljdk/internal/math/FDBigInteger;)I
-HSPLjdk/internal/math/FDBigInteger;->big5pow(I)Ljdk/internal/math/FDBigInteger;
-HSPLjdk/internal/math/FDBigInteger;->checkZeroTail([II)I
-HSPLjdk/internal/math/FDBigInteger;->cmp(Ljdk/internal/math/FDBigInteger;)I
-HSPLjdk/internal/math/FDBigInteger;->cmpPow52(II)I
-HSPLjdk/internal/math/FDBigInteger;->getNormalizationBias()I
-HSPLjdk/internal/math/FDBigInteger;->leftInplaceSub(Ljdk/internal/math/FDBigInteger;)Ljdk/internal/math/FDBigInteger;
-HSPLjdk/internal/math/FDBigInteger;->leftShift(I)Ljdk/internal/math/FDBigInteger;
-HSPLjdk/internal/math/FDBigInteger;->leftShift([II[IIII)V
-HSPLjdk/internal/math/FDBigInteger;->makeImmutable()V
-HSPLjdk/internal/math/FDBigInteger;->mult([IIII[I)V
-HSPLjdk/internal/math/FDBigInteger;->mult([III[I)V
-HSPLjdk/internal/math/FDBigInteger;->multAddMe(II)V
-HSPLjdk/internal/math/FDBigInteger;->multAndCarryBy10([II[I)I
-HSPLjdk/internal/math/FDBigInteger;->multBy10()Ljdk/internal/math/FDBigInteger;
-HSPLjdk/internal/math/FDBigInteger;->multByPow52(II)Ljdk/internal/math/FDBigInteger;
-HSPLjdk/internal/math/FDBigInteger;->multDiffMe(JLjdk/internal/math/FDBigInteger;)J
-HSPLjdk/internal/math/FDBigInteger;->quoRemIteration(Ljdk/internal/math/FDBigInteger;)I
-HSPLjdk/internal/math/FDBigInteger;->rightInplaceSub(Ljdk/internal/math/FDBigInteger;)Ljdk/internal/math/FDBigInteger;
-HSPLjdk/internal/math/FDBigInteger;->size()I
-HSPLjdk/internal/math/FDBigInteger;->trimLeadingZeros()V
-HSPLjdk/internal/math/FDBigInteger;->valueOfMulPow52(JII)Ljdk/internal/math/FDBigInteger;
-HSPLjdk/internal/math/FDBigInteger;->valueOfPow2(I)Ljdk/internal/math/FDBigInteger;
-HSPLjdk/internal/math/FDBigInteger;->valueOfPow52(II)Ljdk/internal/math/FDBigInteger;
-HSPLjdk/internal/math/FloatingDecimal$1;->initialValue()Ljava/lang/Object;
-HSPLjdk/internal/math/FloatingDecimal$1;->initialValue()Ljdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;
-HSPLjdk/internal/math/FloatingDecimal$ASCIIToBinaryBuffer;-><init>(ZI[CI)V
-HSPLjdk/internal/math/FloatingDecimal$ASCIIToBinaryBuffer;->doubleValue()D
-HSPLjdk/internal/math/FloatingDecimal$ASCIIToBinaryBuffer;->floatValue()F
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->-$$Nest$mdtoa(Ljdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;IJIZ)V
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->-$$Nest$msetSign(Ljdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;Z)V
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;-><init>()V
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->appendTo(Ljava/lang/Appendable;)V
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->developLongDigits(IJI)V
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->dtoa(IJIZ)V
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->estimateDecExp(JI)I
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->getChars([C)I
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->getDecimalExponent()I
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->getDigits([C)I
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->isExceptional()Z
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->isNegative()Z
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->roundup()V
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->setSign(Z)V
-HSPLjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;->toJavaFormatString()Ljava/lang/String;
-HSPLjdk/internal/math/FloatingDecimal$PreparedASCIIToBinaryBuffer;->doubleValue()D
-HSPLjdk/internal/math/FloatingDecimal$PreparedASCIIToBinaryBuffer;->floatValue()F
-HSPLjdk/internal/math/FloatingDecimal;->appendTo(FLjava/lang/Appendable;)V
-HSPLjdk/internal/math/FloatingDecimal;->getBinaryToASCIIBuffer()Ljdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;
-HSPLjdk/internal/math/FloatingDecimal;->getBinaryToASCIIConverter(D)Ljdk/internal/math/FloatingDecimal$BinaryToASCIIConverter;
-HSPLjdk/internal/math/FloatingDecimal;->getBinaryToASCIIConverter(DZ)Ljdk/internal/math/FloatingDecimal$BinaryToASCIIConverter;
-HSPLjdk/internal/math/FloatingDecimal;->getBinaryToASCIIConverter(F)Ljdk/internal/math/FloatingDecimal$BinaryToASCIIConverter;
-HSPLjdk/internal/math/FloatingDecimal;->parseDouble(Ljava/lang/String;)D
-HSPLjdk/internal/math/FloatingDecimal;->parseFloat(Ljava/lang/String;)F
-HSPLjdk/internal/math/FloatingDecimal;->readJavaFormatString(Ljava/lang/String;)Ljdk/internal/math/FloatingDecimal$ASCIIToBinaryConverter;
-HSPLjdk/internal/math/FloatingDecimal;->toJavaFormatString(D)Ljava/lang/String;
-HSPLjdk/internal/math/FloatingDecimal;->toJavaFormatString(F)Ljava/lang/String;
-HSPLjdk/internal/math/FormattedFloatingDecimal$1;-><init>()V
-HSPLjdk/internal/math/FormattedFloatingDecimal$1;->initialValue()Ljava/lang/Object;
-HSPLjdk/internal/math/FormattedFloatingDecimal$Form;-><clinit>()V
-HSPLjdk/internal/math/FormattedFloatingDecimal$Form;-><init>(Ljava/lang/String;I)V
-HSPLjdk/internal/math/FormattedFloatingDecimal$Form;->values()[Ljdk/internal/math/FormattedFloatingDecimal$Form;
-HSPLjdk/internal/math/FormattedFloatingDecimal;-><clinit>()V
-HSPLjdk/internal/math/FormattedFloatingDecimal;-><init>(ILjdk/internal/math/FormattedFloatingDecimal$Form;Ljdk/internal/math/FloatingDecimal$BinaryToASCIIConverter;)V
-HSPLjdk/internal/math/FormattedFloatingDecimal;->applyPrecision(I[CII)I
-HSPLjdk/internal/math/FormattedFloatingDecimal;->create(ZI)[C
-HSPLjdk/internal/math/FormattedFloatingDecimal;->fillDecimal(I[CIIZ)V
-HSPLjdk/internal/math/FormattedFloatingDecimal;->getBuffer()[C
-HSPLjdk/internal/math/FormattedFloatingDecimal;->getExponent()[C
-HSPLjdk/internal/math/FormattedFloatingDecimal;->getExponentRounded()I
-HSPLjdk/internal/math/FormattedFloatingDecimal;->getMantissa()[C
-HSPLjdk/internal/math/FormattedFloatingDecimal;->valueOf(DILjdk/internal/math/FormattedFloatingDecimal$Form;)Ljdk/internal/math/FormattedFloatingDecimal;
-HSPLjdk/internal/misc/Unsafe;->compareAndSetObject(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z
-HSPLjdk/internal/misc/Unsafe;->getAndAddInt(Ljava/lang/Object;JI)I
-HSPLjdk/internal/misc/Unsafe;->getAndAddLong(Ljava/lang/Object;JJ)J
-HSPLjdk/internal/misc/Unsafe;->getAndBitwiseAndInt(Ljava/lang/Object;JI)I
-HSPLjdk/internal/misc/Unsafe;->getAndSetInt(Ljava/lang/Object;JI)I
-HSPLjdk/internal/misc/Unsafe;->getAndSetLong(Ljava/lang/Object;JJ)J
-HSPLjdk/internal/misc/Unsafe;->getAndSetObject(Ljava/lang/Object;JLjava/lang/Object;)Ljava/lang/Object;
-HSPLjdk/internal/misc/Unsafe;->getAndSetReference(Ljava/lang/Object;JLjava/lang/Object;)Ljava/lang/Object;
-HSPLjdk/internal/misc/Unsafe;->getIntAcquire(Ljava/lang/Object;J)I
-HSPLjdk/internal/misc/Unsafe;->getIntUnaligned(Ljava/lang/Object;J)I
-HSPLjdk/internal/misc/Unsafe;->getLongAcquire(Ljava/lang/Object;J)J
-HSPLjdk/internal/misc/Unsafe;->getLongUnaligned(Ljava/lang/Object;J)J
-HSPLjdk/internal/misc/Unsafe;->getObject(Ljava/lang/Object;J)Ljava/lang/Object;
-HSPLjdk/internal/misc/Unsafe;->getObjectAcquire(Ljava/lang/Object;J)Ljava/lang/Object;
-HSPLjdk/internal/misc/Unsafe;->getObjectVolatile(Ljava/lang/Object;J)Ljava/lang/Object;
-HSPLjdk/internal/misc/Unsafe;->getReferenceAcquire(Ljava/lang/Object;J)Ljava/lang/Object;
-HSPLjdk/internal/misc/Unsafe;->getUnsafe()Ljdk/internal/misc/Unsafe;
-HSPLjdk/internal/misc/Unsafe;->makeLong(II)J
-HSPLjdk/internal/misc/Unsafe;->objectFieldOffset(Ljava/lang/Class;Ljava/lang/String;)J
-HSPLjdk/internal/misc/Unsafe;->objectFieldOffset(Ljava/lang/reflect/Field;)J
-HSPLjdk/internal/misc/Unsafe;->pickPos(II)I
-HSPLjdk/internal/misc/Unsafe;->putIntOpaque(Ljava/lang/Object;JI)V
-HSPLjdk/internal/misc/Unsafe;->putIntRelease(Ljava/lang/Object;JI)V
-HSPLjdk/internal/misc/Unsafe;->putLongRelease(Ljava/lang/Object;JJ)V
-HSPLjdk/internal/misc/Unsafe;->putObject(Ljava/lang/Object;JLjava/lang/Object;)V
-HSPLjdk/internal/misc/Unsafe;->putObjectRelease(Ljava/lang/Object;JLjava/lang/Object;)V
-HSPLjdk/internal/misc/Unsafe;->putObjectVolatile(Ljava/lang/Object;JLjava/lang/Object;)V
-HSPLjdk/internal/misc/Unsafe;->putReferenceOpaque(Ljava/lang/Object;JLjava/lang/Object;)V
-HSPLjdk/internal/misc/Unsafe;->putReferenceRelease(Ljava/lang/Object;JLjava/lang/Object;)V
-HSPLjdk/internal/misc/Unsafe;->toUnsignedLong(I)J
-HSPLjdk/internal/misc/Unsafe;->weakCompareAndSetInt(Ljava/lang/Object;JII)Z
-HSPLjdk/internal/misc/Unsafe;->weakCompareAndSetReference(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z
-HSPLjdk/internal/misc/VM;->getSavedProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLjdk/internal/ref/CleanerFactory;->cleaner()Ljava/lang/ref/Cleaner;
-HSPLjdk/internal/ref/CleanerImpl$PhantomCleanableRef;-><init>(Ljava/lang/Object;Ljava/lang/ref/Cleaner;Ljava/lang/Runnable;)V
-HSPLjdk/internal/ref/CleanerImpl$PhantomCleanableRef;->performCleanup()V+]Ljava/lang/Runnable;megamorphic_types
-HSPLjdk/internal/ref/CleanerImpl;->getCleanerImpl(Ljava/lang/ref/Cleaner;)Ljdk/internal/ref/CleanerImpl;
-HSPLjdk/internal/ref/PhantomCleanable;-><init>(Ljava/lang/Object;Ljava/lang/ref/Cleaner;)V
-HSPLjdk/internal/ref/PhantomCleanable;->clean()V+]Ljdk/internal/ref/PhantomCleanable;Ljdk/internal/ref/CleanerImpl$PhantomCleanableRef;
-HSPLjdk/internal/ref/PhantomCleanable;->insert()V
-HSPLjdk/internal/ref/PhantomCleanable;->remove()Z
-HSPLjdk/internal/reflect/Reflection;->getCallerClass()Ljava/lang/Class;
-HSPLjdk/internal/util/ArraysSupport;->mismatch([B[BI)I
-HSPLjdk/internal/util/ArraysSupport;->mismatch([FI[FII)I
-HSPLjdk/internal/util/ArraysSupport;->mismatch([I[II)I
-HSPLjdk/internal/util/ArraysSupport;->mismatch([J[JI)I
-HSPLjdk/internal/util/ArraysSupport;->mismatch([Z[ZI)I
-HSPLjdk/internal/util/ArraysSupport;->newLength(III)I
-HSPLjdk/internal/util/ArraysSupport;->vectorizedMismatch(Ljava/lang/Object;JLjava/lang/Object;JII)I
-HSPLjdk/internal/util/Preconditions;->checkFromIndexSize(IIILjava/util/function/BiFunction;)I
-HSPLjdk/internal/util/Preconditions;->checkIndex(IILjava/util/function/BiFunction;)I
-HSPLjdk/internal/util/random/RandomSupport;-><clinit>()V
-HSPLjdk/internal/util/random/RandomSupport;->mixMurmur64(J)J
-HSPLjdk/internal/util/random/RandomSupport;->secureRandomSeedRequested()Z
-HSPLlibcore/content/type/MimeMap$Builder$Element;-><init>(Ljava/lang/String;Z)V
-HSPLlibcore/content/type/MimeMap$Builder$Element;->ofExtensionSpec(Ljava/lang/String;)Llibcore/content/type/MimeMap$Builder$Element;
-HSPLlibcore/content/type/MimeMap$Builder$Element;->ofMimeSpec(Ljava/lang/String;)Llibcore/content/type/MimeMap$Builder$Element;
-HSPLlibcore/content/type/MimeMap$Builder;->addMimeMapping(Ljava/lang/String;Ljava/util/List;)Llibcore/content/type/MimeMap$Builder;
-HSPLlibcore/content/type/MimeMap$Builder;->maybePut(Ljava/util/Map;Llibcore/content/type/MimeMap$Builder$Element;Ljava/lang/String;)Ljava/lang/String;
-HSPLlibcore/content/type/MimeMap$MemoizingSupplier;->get()Ljava/lang/Object;
-HSPLlibcore/content/type/MimeMap;-><init>(Ljava/util/Map;Ljava/util/Map;)V
-HSPLlibcore/content/type/MimeMap;->checkValidExtension(Ljava/lang/String;)V
-HSPLlibcore/content/type/MimeMap;->checkValidMimeType(Ljava/lang/String;)V
-HSPLlibcore/content/type/MimeMap;->getDefault()Llibcore/content/type/MimeMap;
-HSPLlibcore/content/type/MimeMap;->guessMimeTypeFromExtension(Ljava/lang/String;)Ljava/lang/String;
-HSPLlibcore/content/type/MimeMap;->isValidMimeTypeOrExtension(Ljava/lang/String;)Z
-HSPLlibcore/content/type/MimeMap;->toLowerCase(Ljava/lang/String;)Ljava/lang/String;
-HSPLlibcore/icu/CollationKeyICU;-><init>(Ljava/lang/String;Landroid/icu/text/CollationKey;)V
-HSPLlibcore/icu/CollationKeyICU;->toByteArray()[B
-HSPLlibcore/icu/DecimalFormatData;-><init>(Ljava/util/Locale;)V
-HSPLlibcore/icu/DecimalFormatData;->getCurrencyPattern()Ljava/lang/String;
-HSPLlibcore/icu/DecimalFormatData;->getDecimalSeparator()C
-HSPLlibcore/icu/DecimalFormatData;->getExponentSeparator()Ljava/lang/String;
-HSPLlibcore/icu/DecimalFormatData;->getGroupingSeparator()C
-HSPLlibcore/icu/DecimalFormatData;->getInfinity()Ljava/lang/String;
-HSPLlibcore/icu/DecimalFormatData;->getInstance(Ljava/util/Locale;)Llibcore/icu/DecimalFormatData;
-HSPLlibcore/icu/DecimalFormatData;->getMinusSign()Ljava/lang/String;
-HSPLlibcore/icu/DecimalFormatData;->getMonetaryDecimalSeparator()Ljava/lang/String;
-HSPLlibcore/icu/DecimalFormatData;->getMonetaryGroupSeparator()Ljava/lang/String;
-HSPLlibcore/icu/DecimalFormatData;->getNaN()Ljava/lang/String;
-HSPLlibcore/icu/DecimalFormatData;->getNumberPattern()Ljava/lang/String;
-HSPLlibcore/icu/DecimalFormatData;->getPatternSeparator()C
-HSPLlibcore/icu/DecimalFormatData;->getPerMill()Ljava/lang/String;
-HSPLlibcore/icu/DecimalFormatData;->getPercent()Ljava/lang/String;
-HSPLlibcore/icu/DecimalFormatData;->getPercentPattern()Ljava/lang/String;
-HSPLlibcore/icu/DecimalFormatData;->getZeroDigit()C
-HSPLlibcore/icu/DecimalFormatData;->loadPatternSeparator(Ljava/util/Locale;)C
-HSPLlibcore/icu/ICU;->getAvailableLocales()[Ljava/util/Locale;
-HSPLlibcore/icu/ICU;->getBestDateTimePattern(Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;
-HSPLlibcore/icu/ICU;->getCurrencyCode(Ljava/lang/String;)Ljava/lang/String;
-HSPLlibcore/icu/ICU;->getExtendedCalendar(Ljava/util/Locale;Ljava/lang/String;)Lcom/android/icu/util/ExtendedCalendar;
-HSPLlibcore/icu/ICU;->getISOLanguages()[Ljava/lang/String;
-HSPLlibcore/icu/ICU;->isIsoCountry(Ljava/lang/String;)Z
-HSPLlibcore/icu/ICU;->localeFromIcuLocaleId(Ljava/lang/String;)Ljava/util/Locale;
-HSPLlibcore/icu/ICU;->localesFromStrings([Ljava/lang/String;)[Ljava/util/Locale;
-HSPLlibcore/icu/ICU;->parseLangScriptRegionAndVariants(Ljava/lang/String;[Ljava/lang/String;)V
-HSPLlibcore/icu/ICU;->setDefaultLocale(Ljava/lang/String;)V
-HSPLlibcore/icu/ICU;->transformIcuDateTimePattern(Ljava/lang/String;)Ljava/lang/String;
-HSPLlibcore/icu/ICU;->transformIcuDateTimePattern_forJavaText(Ljava/lang/String;)Ljava/lang/String;
-HSPLlibcore/icu/LocaleData;->get(Ljava/util/Locale;)Llibcore/icu/LocaleData;
-HSPLlibcore/icu/LocaleData;->getCompatibleLocaleForBug159514442(Ljava/util/Locale;)Ljava/util/Locale;
-HSPLlibcore/icu/LocaleData;->initLocaleData(Ljava/util/Locale;)Llibcore/icu/LocaleData;
-HSPLlibcore/icu/LocaleData;->initializeCalendarData(Ljava/util/Locale;)V
-HSPLlibcore/icu/LocaleData;->initializeDateFormatData(Ljava/util/Locale;)V
-HSPLlibcore/icu/LocaleData;->mapInvalidAndNullLocales(Ljava/util/Locale;)Ljava/util/Locale;
-HSPLlibcore/icu/SimpleDateFormatData;->getDateFormat(I)Ljava/lang/String;
-HSPLlibcore/icu/SimpleDateFormatData;->getInstance(Ljava/util/Locale;)Llibcore/icu/SimpleDateFormatData;
-HSPLlibcore/icu/SimpleDateFormatData;->getTimeFormat(I)Ljava/lang/String;
-HSPLlibcore/internal/StringPool;-><init>()V
-HSPLlibcore/internal/StringPool;->contentEquals(Ljava/lang/String;[CII)Z
-HSPLlibcore/internal/StringPool;->get([CII)Ljava/lang/String;
-HSPLlibcore/io/BlockGuardOs;->accept(Ljava/io/FileDescriptor;Ljava/net/SocketAddress;)Ljava/io/FileDescriptor;
-HSPLlibcore/io/BlockGuardOs;->access(Ljava/lang/String;I)Z
-HSPLlibcore/io/BlockGuardOs;->android_getaddrinfo(Ljava/lang/String;Landroid/system/StructAddrinfo;I)[Ljava/net/InetAddress;
-HSPLlibcore/io/BlockGuardOs;->chmod(Ljava/lang/String;I)V
-HSPLlibcore/io/BlockGuardOs;->close(Ljava/io/FileDescriptor;)V
-HSPLlibcore/io/BlockGuardOs;->connect(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V
-HSPLlibcore/io/BlockGuardOs;->fdatasync(Ljava/io/FileDescriptor;)V
-HSPLlibcore/io/BlockGuardOs;->fstat(Ljava/io/FileDescriptor;)Landroid/system/StructStat;
-HSPLlibcore/io/BlockGuardOs;->ftruncate(Ljava/io/FileDescriptor;J)V
-HSPLlibcore/io/BlockGuardOs;->getxattr(Ljava/lang/String;Ljava/lang/String;)[B
-HSPLlibcore/io/BlockGuardOs;->isInetDomain(I)Z
-HSPLlibcore/io/BlockGuardOs;->isInetSocket(Ljava/io/FileDescriptor;)Z
-HSPLlibcore/io/BlockGuardOs;->isLingerSocket(Ljava/io/FileDescriptor;)Z
-HSPLlibcore/io/BlockGuardOs;->isNonBlockingFile(Ljava/io/FileDescriptor;)Z
-HSPLlibcore/io/BlockGuardOs;->isUdpSocket(Ljava/io/FileDescriptor;)Z
-HSPLlibcore/io/BlockGuardOs;->isUnixDomain(I)Z
-HSPLlibcore/io/BlockGuardOs;->isUnixSocket(Ljava/io/FileDescriptor;)Z
-HSPLlibcore/io/BlockGuardOs;->lseek(Ljava/io/FileDescriptor;JI)J
-HSPLlibcore/io/BlockGuardOs;->lstat(Ljava/lang/String;)Landroid/system/StructStat;
-HSPLlibcore/io/BlockGuardOs;->mkdir(Ljava/lang/String;I)V
-HSPLlibcore/io/BlockGuardOs;->open(Ljava/lang/String;II)Ljava/io/FileDescriptor;
-HSPLlibcore/io/BlockGuardOs;->poll([Landroid/system/StructPollfd;I)I
-HSPLlibcore/io/BlockGuardOs;->posix_fallocate(Ljava/io/FileDescriptor;JJ)V
-HSPLlibcore/io/BlockGuardOs;->pread(Ljava/io/FileDescriptor;[BIIJ)I
-HSPLlibcore/io/BlockGuardOs;->read(Ljava/io/FileDescriptor;[BII)I
-HSPLlibcore/io/BlockGuardOs;->readlink(Ljava/lang/String;)Ljava/lang/String;
-HSPLlibcore/io/BlockGuardOs;->recvfrom(Ljava/io/FileDescriptor;[BIIILjava/net/InetSocketAddress;)I
-HSPLlibcore/io/BlockGuardOs;->remove(Ljava/lang/String;)V
-HSPLlibcore/io/BlockGuardOs;->rename(Ljava/lang/String;Ljava/lang/String;)V
-HSPLlibcore/io/BlockGuardOs;->sendto(Ljava/io/FileDescriptor;[BIIILjava/net/InetAddress;I)I
-HSPLlibcore/io/BlockGuardOs;->socket(III)Ljava/io/FileDescriptor;
-HSPLlibcore/io/BlockGuardOs;->socketpair(IIILjava/io/FileDescriptor;Ljava/io/FileDescriptor;)V
-HSPLlibcore/io/BlockGuardOs;->stat(Ljava/lang/String;)Landroid/system/StructStat;
-HSPLlibcore/io/BlockGuardOs;->statvfs(Ljava/lang/String;)Landroid/system/StructStatVfs;
-HSPLlibcore/io/BlockGuardOs;->tagSocket(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;
-HSPLlibcore/io/BlockGuardOs;->write(Ljava/io/FileDescriptor;[BII)I
-HSPLlibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection$1;-><init>(Llibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection;Ljava/io/InputStream;)V
-HSPLlibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection$1;->close()V
-HSPLlibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection;-><init>(Llibcore/io/ClassPathURLStreamHandler;Ljava/net/URL;)V
-HSPLlibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection;->connect()V
-HSPLlibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection;->getInputStream()Ljava/io/InputStream;
-HSPLlibcore/io/ClassPathURLStreamHandler;-><init>(Ljava/lang/String;)V
-HSPLlibcore/io/ClassPathURLStreamHandler;-><init>(Ljava/lang/String;Z)V
-HSPLlibcore/io/ClassPathURLStreamHandler;->getEntryUrlOrNull(Ljava/lang/String;)Ljava/net/URL;
-HSPLlibcore/io/ClassPathURLStreamHandler;->isEntryStored(Ljava/lang/String;)Z
-HSPLlibcore/io/ClassPathURLStreamHandler;->openConnection(Ljava/net/URL;)Ljava/net/URLConnection;
-HSPLlibcore/io/ForwardingOs;-><init>(Llibcore/io/Os;)V
-HSPLlibcore/io/ForwardingOs;->accept(Ljava/io/FileDescriptor;Ljava/net/SocketAddress;)Ljava/io/FileDescriptor;
-HSPLlibcore/io/ForwardingOs;->access(Ljava/lang/String;I)Z
-HSPLlibcore/io/ForwardingOs;->android_fdsan_exchange_owner_tag(Ljava/io/FileDescriptor;JJ)V
-HSPLlibcore/io/ForwardingOs;->android_getaddrinfo(Ljava/lang/String;Landroid/system/StructAddrinfo;I)[Ljava/net/InetAddress;
-HSPLlibcore/io/ForwardingOs;->bind(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V
-HSPLlibcore/io/ForwardingOs;->bind(Ljava/io/FileDescriptor;Ljava/net/SocketAddress;)V
-HSPLlibcore/io/ForwardingOs;->capget(Landroid/system/StructCapUserHeader;)[Landroid/system/StructCapUserData;
-HSPLlibcore/io/ForwardingOs;->chmod(Ljava/lang/String;I)V
-HSPLlibcore/io/ForwardingOs;->close(Ljava/io/FileDescriptor;)V
-HSPLlibcore/io/ForwardingOs;->connect(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V
-HSPLlibcore/io/ForwardingOs;->dup2(Ljava/io/FileDescriptor;I)Ljava/io/FileDescriptor;
-HSPLlibcore/io/ForwardingOs;->fcntlInt(Ljava/io/FileDescriptor;II)I
-HSPLlibcore/io/ForwardingOs;->fcntlVoid(Ljava/io/FileDescriptor;I)I
-HSPLlibcore/io/ForwardingOs;->fdatasync(Ljava/io/FileDescriptor;)V
-HSPLlibcore/io/ForwardingOs;->fstat(Ljava/io/FileDescriptor;)Landroid/system/StructStat;
-HSPLlibcore/io/ForwardingOs;->ftruncate(Ljava/io/FileDescriptor;J)V
-HSPLlibcore/io/ForwardingOs;->gai_strerror(I)Ljava/lang/String;
-HSPLlibcore/io/ForwardingOs;->getenv(Ljava/lang/String;)Ljava/lang/String;
-HSPLlibcore/io/ForwardingOs;->getifaddrs()[Landroid/system/StructIfaddrs;
-HSPLlibcore/io/ForwardingOs;->getnameinfo(Ljava/net/InetAddress;I)Ljava/lang/String;
-HSPLlibcore/io/ForwardingOs;->getpeername(Ljava/io/FileDescriptor;)Ljava/net/SocketAddress;
-HSPLlibcore/io/ForwardingOs;->getpgid(I)I
-HSPLlibcore/io/ForwardingOs;->getpid()I
-HSPLlibcore/io/ForwardingOs;->getsockname(Ljava/io/FileDescriptor;)Ljava/net/SocketAddress;
-HSPLlibcore/io/ForwardingOs;->getsockoptInt(Ljava/io/FileDescriptor;II)I
-HSPLlibcore/io/ForwardingOs;->getsockoptLinger(Ljava/io/FileDescriptor;II)Landroid/system/StructLinger;
-HSPLlibcore/io/ForwardingOs;->gettid()I
-HSPLlibcore/io/ForwardingOs;->getuid()I
-HSPLlibcore/io/ForwardingOs;->getxattr(Ljava/lang/String;Ljava/lang/String;)[B
-HSPLlibcore/io/ForwardingOs;->if_nametoindex(Ljava/lang/String;)I
-HSPLlibcore/io/ForwardingOs;->ioctlInt(Ljava/io/FileDescriptor;I)I
-HSPLlibcore/io/ForwardingOs;->listen(Ljava/io/FileDescriptor;I)V
-HSPLlibcore/io/ForwardingOs;->lseek(Ljava/io/FileDescriptor;JI)J
-HSPLlibcore/io/ForwardingOs;->lstat(Ljava/lang/String;)Landroid/system/StructStat;
-HSPLlibcore/io/ForwardingOs;->mkdir(Ljava/lang/String;I)V
-HSPLlibcore/io/ForwardingOs;->mmap(JJIILjava/io/FileDescriptor;J)J
-HSPLlibcore/io/ForwardingOs;->open(Ljava/lang/String;II)Ljava/io/FileDescriptor;
-HSPLlibcore/io/ForwardingOs;->pipe2(I)[Ljava/io/FileDescriptor;
-HSPLlibcore/io/ForwardingOs;->poll([Landroid/system/StructPollfd;I)I
-HSPLlibcore/io/ForwardingOs;->posix_fallocate(Ljava/io/FileDescriptor;JJ)V
-HSPLlibcore/io/ForwardingOs;->pread(Ljava/io/FileDescriptor;[BIIJ)I
-HSPLlibcore/io/ForwardingOs;->read(Ljava/io/FileDescriptor;[BII)I
-HSPLlibcore/io/ForwardingOs;->readlink(Ljava/lang/String;)Ljava/lang/String;
-HSPLlibcore/io/ForwardingOs;->recvfrom(Ljava/io/FileDescriptor;[BIIILjava/net/InetSocketAddress;)I
-HSPLlibcore/io/ForwardingOs;->remove(Ljava/lang/String;)V
-HSPLlibcore/io/ForwardingOs;->rename(Ljava/lang/String;Ljava/lang/String;)V
-HSPLlibcore/io/ForwardingOs;->sendto(Ljava/io/FileDescriptor;[BIIILjava/net/InetAddress;I)I
-HSPLlibcore/io/ForwardingOs;->setenv(Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLlibcore/io/ForwardingOs;->setpgid(II)V
-HSPLlibcore/io/ForwardingOs;->setregid(II)V
-HSPLlibcore/io/ForwardingOs;->setreuid(II)V
-HSPLlibcore/io/ForwardingOs;->setsockoptInt(Ljava/io/FileDescriptor;III)V
-HSPLlibcore/io/ForwardingOs;->setsockoptTimeval(Ljava/io/FileDescriptor;IILandroid/system/StructTimeval;)V
-HSPLlibcore/io/ForwardingOs;->shutdown(Ljava/io/FileDescriptor;I)V
-HSPLlibcore/io/ForwardingOs;->socket(III)Ljava/io/FileDescriptor;
-HSPLlibcore/io/ForwardingOs;->socketpair(IIILjava/io/FileDescriptor;Ljava/io/FileDescriptor;)V
-HSPLlibcore/io/ForwardingOs;->stat(Ljava/lang/String;)Landroid/system/StructStat;
-HSPLlibcore/io/ForwardingOs;->statvfs(Ljava/lang/String;)Landroid/system/StructStatVfs;
-HSPLlibcore/io/ForwardingOs;->strerror(I)Ljava/lang/String;
-HSPLlibcore/io/ForwardingOs;->sysconf(I)J
-HSPLlibcore/io/ForwardingOs;->write(Ljava/io/FileDescriptor;[BII)I
-HSPLlibcore/io/IoBridge;->bind(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V
-HSPLlibcore/io/IoBridge;->booleanFromInt(I)Z
-HSPLlibcore/io/IoBridge;->booleanToInt(Z)I
-HSPLlibcore/io/IoBridge;->closeAndSignalBlockedThreads(Ljava/io/FileDescriptor;)V
-HSPLlibcore/io/IoBridge;->connect(Ljava/io/FileDescriptor;Ljava/net/InetAddress;II)V
-HSPLlibcore/io/IoBridge;->connectErrno(Ljava/io/FileDescriptor;Ljava/net/InetAddress;II)V
-HSPLlibcore/io/IoBridge;->createMessageForException(Ljava/io/FileDescriptor;Ljava/net/InetAddress;IILjava/lang/Exception;)Ljava/lang/String;
-HSPLlibcore/io/IoBridge;->getLocalInetSocketAddress(Ljava/io/FileDescriptor;)Ljava/net/InetSocketAddress;
-HSPLlibcore/io/IoBridge;->getSocketOption(Ljava/io/FileDescriptor;I)Ljava/lang/Object;
-HSPLlibcore/io/IoBridge;->getSocketOptionErrno(Ljava/io/FileDescriptor;I)Ljava/lang/Object;
-HSPLlibcore/io/IoBridge;->isConnected(Ljava/io/FileDescriptor;Ljava/net/InetAddress;III)Z
-HSPLlibcore/io/IoBridge;->open(Ljava/lang/String;I)Ljava/io/FileDescriptor;
-HSPLlibcore/io/IoBridge;->poll(Ljava/io/FileDescriptor;II)V
-HSPLlibcore/io/IoBridge;->postRecvfrom(ZLjava/net/DatagramPacket;Ljava/net/InetSocketAddress;I)I
-HSPLlibcore/io/IoBridge;->read(Ljava/io/FileDescriptor;[BII)I
-HSPLlibcore/io/IoBridge;->recvfrom(ZLjava/io/FileDescriptor;[BIIILjava/net/DatagramPacket;Z)I
-HSPLlibcore/io/IoBridge;->sendto(Ljava/io/FileDescriptor;[BIIILjava/net/InetAddress;I)I
-HSPLlibcore/io/IoBridge;->setSocketOption(Ljava/io/FileDescriptor;ILjava/lang/Object;)V
-HSPLlibcore/io/IoBridge;->setSocketOptionErrno(Ljava/io/FileDescriptor;ILjava/lang/Object;)V
-HSPLlibcore/io/IoBridge;->socket(III)Ljava/io/FileDescriptor;
-HSPLlibcore/io/IoBridge;->write(Ljava/io/FileDescriptor;[BII)V
-HSPLlibcore/io/IoTracker;-><init>()V
-HSPLlibcore/io/IoTracker;->reset()V
-HSPLlibcore/io/IoTracker;->trackIo(I)V
-HSPLlibcore/io/IoTracker;->trackIo(ILlibcore/io/IoTracker$Mode;)V
-HSPLlibcore/io/IoUtils;->acquireRawFd(Ljava/io/FileDescriptor;)I
-HSPLlibcore/io/IoUtils;->canOpenReadOnly(Ljava/lang/String;)Z
-HSPLlibcore/io/IoUtils;->close(Ljava/io/FileDescriptor;)V
-HSPLlibcore/io/IoUtils;->closeQuietly(Ljava/io/FileDescriptor;)V
-HSPLlibcore/io/IoUtils;->closeQuietly(Ljava/lang/AutoCloseable;)V
-HSPLlibcore/io/IoUtils;->generateFdOwnerId(Ljava/lang/Object;)J
-HSPLlibcore/io/IoUtils;->isParcelFileDescriptor(Ljava/lang/Object;)Z
-HSPLlibcore/io/IoUtils;->setBlocking(Ljava/io/FileDescriptor;Z)V
-HSPLlibcore/io/IoUtils;->setFdOwner(Ljava/io/FileDescriptor;Ljava/lang/Object;)V
-HSPLlibcore/io/Libcore;->compareAndSetOs(Llibcore/io/Os;Llibcore/io/Os;)Z
-HSPLlibcore/io/Libcore;->getOs()Llibcore/io/Os;
-HSPLlibcore/io/Linux;->pread(Ljava/io/FileDescriptor;[BIIJ)I
-HSPLlibcore/io/Linux;->read(Ljava/io/FileDescriptor;[BII)I
-HSPLlibcore/io/Linux;->recvfrom(Ljava/io/FileDescriptor;[BIIILjava/net/InetSocketAddress;)I
-HSPLlibcore/io/Linux;->sendto(Ljava/io/FileDescriptor;[BIIILjava/net/InetAddress;I)I
-HSPLlibcore/io/Linux;->write(Ljava/io/FileDescriptor;[BII)I
-HSPLlibcore/io/Memory;->peekInt(JZ)I
-HSPLlibcore/io/Memory;->peekInt([BILjava/nio/ByteOrder;)I
-HSPLlibcore/io/Memory;->peekLong(JZ)J
-HSPLlibcore/io/Memory;->peekShort(JZ)S
-HSPLlibcore/io/Memory;->peekShort([BILjava/nio/ByteOrder;)S
-HSPLlibcore/io/Memory;->pokeInt(JIZ)V
-HSPLlibcore/io/Memory;->pokeInt([BIILjava/nio/ByteOrder;)V
-HSPLlibcore/io/Memory;->pokeLong(JJZ)V
-HSPLlibcore/io/Memory;->pokeShort(JSZ)V
-HSPLlibcore/io/Os;->compareAndSetDefault(Llibcore/io/Os;Llibcore/io/Os;)Z
-HSPLlibcore/io/Os;->getDefault()Llibcore/io/Os;
-HSPLlibcore/net/InetAddressUtils;->parseNumericAddress(Ljava/lang/String;)Ljava/net/InetAddress;
-HSPLlibcore/net/InetAddressUtils;->parseNumericAddressNoThrow(Ljava/lang/String;)Ljava/net/InetAddress;
-HSPLlibcore/net/InetAddressUtils;->parseNumericAddressNoThrowStripOptionalBrackets(Ljava/lang/String;)Ljava/net/InetAddress;
-HSPLlibcore/net/NetworkSecurityPolicy;-><init>()V
-HSPLlibcore/net/NetworkSecurityPolicy;->getInstance()Llibcore/net/NetworkSecurityPolicy;
-HSPLlibcore/net/NetworkSecurityPolicy;->setInstance(Llibcore/net/NetworkSecurityPolicy;)V
-HSPLlibcore/net/event/NetworkEventDispatcher;->addListener(Llibcore/net/event/NetworkEventListener;)V
-HSPLlibcore/net/event/NetworkEventDispatcher;->dispatchNetworkConfigurationChange()V
-HSPLlibcore/net/event/NetworkEventDispatcher;->getInstance()Llibcore/net/event/NetworkEventDispatcher;
-HSPLlibcore/net/event/NetworkEventListener;-><init>()V
-HSPLlibcore/net/http/HttpDate$1;->initialValue()Ljava/lang/Object;
-HSPLlibcore/net/http/HttpDate$1;->initialValue()Ljava/text/DateFormat;
-HSPLlibcore/net/http/HttpDate;->parse(Ljava/lang/String;)Ljava/util/Date;
-HSPLlibcore/net/http/HttpURLConnectionFactory;-><init>()V
-HSPLlibcore/net/http/HttpURLConnectionFactory;->createInstance()Llibcore/net/http/HttpURLConnectionFactory;
-HSPLlibcore/net/http/HttpURLConnectionFactory;->openConnection(Ljava/net/URL;Ljavax/net/SocketFactory;Ljava/net/Proxy;)Ljava/net/URLConnection;
-HSPLlibcore/net/http/HttpURLConnectionFactory;->setDns(Llibcore/net/http/Dns;)V
-HSPLlibcore/net/http/HttpURLConnectionFactory;->setNewConnectionPool(IJLjava/util/concurrent/TimeUnit;)V
-HSPLlibcore/reflect/AnnotationFactory;-><init>(Ljava/lang/Class;[Llibcore/reflect/AnnotationMember;)V
-HSPLlibcore/reflect/AnnotationFactory;->createAnnotation(Ljava/lang/Class;[Llibcore/reflect/AnnotationMember;)Ljava/lang/annotation/Annotation;
-HSPLlibcore/reflect/AnnotationFactory;->getElementsDescription(Ljava/lang/Class;)[Llibcore/reflect/AnnotationMember;
-HSPLlibcore/reflect/AnnotationFactory;->invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;
-HSPLlibcore/reflect/AnnotationMember;-><init>(Ljava/lang/String;Ljava/lang/Object;)V
-HSPLlibcore/reflect/AnnotationMember;-><init>(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/reflect/Method;)V
-HSPLlibcore/reflect/AnnotationMember;->copyValue()Ljava/lang/Object;
-HSPLlibcore/reflect/AnnotationMember;->setDefinition(Llibcore/reflect/AnnotationMember;)Llibcore/reflect/AnnotationMember;
-HSPLlibcore/reflect/AnnotationMember;->validateValue()Ljava/lang/Object;
-HSPLlibcore/reflect/GenericArrayTypeImpl;->getGenericComponentType()Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/GenericSignatureParser;-><init>(Ljava/lang/ClassLoader;)V
-HSPLlibcore/reflect/GenericSignatureParser;->expect(C)V
-HSPLlibcore/reflect/GenericSignatureParser;->isStopSymbol(C)Z
-HSPLlibcore/reflect/GenericSignatureParser;->parseClassSignature()V
-HSPLlibcore/reflect/GenericSignatureParser;->parseClassTypeSignature()Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/GenericSignatureParser;->parseFieldTypeSignature()Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/GenericSignatureParser;->parseForClass(Ljava/lang/reflect/GenericDeclaration;Ljava/lang/String;)V
-HSPLlibcore/reflect/GenericSignatureParser;->parseForConstructor(Ljava/lang/reflect/GenericDeclaration;Ljava/lang/String;[Ljava/lang/Class;)V
-HSPLlibcore/reflect/GenericSignatureParser;->parseForField(Ljava/lang/reflect/GenericDeclaration;Ljava/lang/String;)V
-HSPLlibcore/reflect/GenericSignatureParser;->parseForMethod(Ljava/lang/reflect/GenericDeclaration;Ljava/lang/String;[Ljava/lang/Class;)V
-HSPLlibcore/reflect/GenericSignatureParser;->parseFormalTypeParameter()Llibcore/reflect/TypeVariableImpl;
-HSPLlibcore/reflect/GenericSignatureParser;->parseMethodTypeSignature([Ljava/lang/Class;)V
-HSPLlibcore/reflect/GenericSignatureParser;->parseOptFormalTypeParameters()V
-HSPLlibcore/reflect/GenericSignatureParser;->parseOptTypeArguments()Llibcore/reflect/ListOfTypes;
-HSPLlibcore/reflect/GenericSignatureParser;->parseReturnType()Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/GenericSignatureParser;->parseTypeArgument()Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/GenericSignatureParser;->parseTypeSignature()Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/GenericSignatureParser;->parseTypeVariableSignature()Llibcore/reflect/TypeVariableImpl;
-HSPLlibcore/reflect/GenericSignatureParser;->scanIdentifier()V
-HSPLlibcore/reflect/GenericSignatureParser;->scanSymbol()V
-HSPLlibcore/reflect/GenericSignatureParser;->setInput(Ljava/lang/reflect/GenericDeclaration;Ljava/lang/String;)V
-HSPLlibcore/reflect/ListOfTypes;-><init>(I)V
-HSPLlibcore/reflect/ListOfTypes;-><init>([Ljava/lang/reflect/Type;)V
-HSPLlibcore/reflect/ListOfTypes;->add(Ljava/lang/reflect/Type;)V
-HSPLlibcore/reflect/ListOfTypes;->getResolvedTypes()[Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/ListOfTypes;->length()I
-HSPLlibcore/reflect/ListOfTypes;->resolveTypes(Ljava/util/List;)[Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/ListOfVariables;-><init>()V
-HSPLlibcore/reflect/ListOfVariables;->add(Ljava/lang/reflect/TypeVariable;)V
-HSPLlibcore/reflect/ListOfVariables;->getArray()[Ljava/lang/reflect/TypeVariable;
-HSPLlibcore/reflect/ParameterizedTypeImpl;-><init>(Llibcore/reflect/ParameterizedTypeImpl;Ljava/lang/String;Llibcore/reflect/ListOfTypes;Ljava/lang/ClassLoader;)V
-HSPLlibcore/reflect/ParameterizedTypeImpl;->equals(Ljava/lang/Object;)Z
-HSPLlibcore/reflect/ParameterizedTypeImpl;->getActualTypeArguments()[Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/ParameterizedTypeImpl;->getOwnerType()Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/ParameterizedTypeImpl;->getRawType()Ljava/lang/Class;
-HSPLlibcore/reflect/ParameterizedTypeImpl;->getRawType()Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/ParameterizedTypeImpl;->getResolvedType()Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/TypeVariableImpl;-><init>(Ljava/lang/reflect/GenericDeclaration;Ljava/lang/String;)V
-HSPLlibcore/reflect/TypeVariableImpl;-><init>(Ljava/lang/reflect/GenericDeclaration;Ljava/lang/String;Llibcore/reflect/ListOfTypes;)V
-HSPLlibcore/reflect/TypeVariableImpl;->equals(Ljava/lang/Object;)Z
-HSPLlibcore/reflect/TypeVariableImpl;->findFormalVar(Ljava/lang/reflect/GenericDeclaration;Ljava/lang/String;)Ljava/lang/reflect/TypeVariable;
-HSPLlibcore/reflect/TypeVariableImpl;->getBounds()[Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/TypeVariableImpl;->getGenericDeclaration()Ljava/lang/reflect/GenericDeclaration;
-HSPLlibcore/reflect/TypeVariableImpl;->getName()Ljava/lang/String;
-HSPLlibcore/reflect/TypeVariableImpl;->hashCode()I
-HSPLlibcore/reflect/TypeVariableImpl;->resolve()V
-HSPLlibcore/reflect/Types;->getType(Ljava/lang/reflect/Type;)Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/Types;->getTypeArray(Llibcore/reflect/ListOfTypes;Z)[Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/WildcardTypeImpl;-><init>(Llibcore/reflect/ListOfTypes;Llibcore/reflect/ListOfTypes;)V
-HSPLlibcore/reflect/WildcardTypeImpl;->getLowerBounds()[Ljava/lang/reflect/Type;
-HSPLlibcore/reflect/WildcardTypeImpl;->getUpperBounds()[Ljava/lang/reflect/Type;
-HSPLlibcore/util/ArrayUtils;->throwsIfOutOfBounds(III)V
-HSPLlibcore/util/BasicLruCache;->create(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLlibcore/util/BasicLruCache;->entryEvicted(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLlibcore/util/BasicLruCache;->evictAll()V
-HSPLlibcore/util/BasicLruCache;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLlibcore/util/BasicLruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLlibcore/util/BasicLruCache;->trimToSize(I)V
-HSPLlibcore/util/CollectionUtils;->removeDuplicates(Ljava/util/List;Ljava/util/Comparator;)V
-HSPLlibcore/util/FP16;->ceil(S)S
-HSPLlibcore/util/FP16;->compare(SS)I
-HSPLlibcore/util/FP16;->floor(S)S
-HSPLlibcore/util/FP16;->greater(SS)Z
-HSPLlibcore/util/FP16;->greaterEquals(SS)Z
-HSPLlibcore/util/FP16;->less(SS)Z
-HSPLlibcore/util/FP16;->lessEquals(SS)Z
-HSPLlibcore/util/FP16;->max(SS)S
-HSPLlibcore/util/FP16;->min(SS)S
-HSPLlibcore/util/FP16;->rint(S)S
-HSPLlibcore/util/FP16;->toFloat(S)F
-HSPLlibcore/util/FP16;->toHalf(F)S
-HSPLlibcore/util/NativeAllocationRegistry$CleanerRunner;-><init>(Lsun/misc/Cleaner;)V
-HSPLlibcore/util/NativeAllocationRegistry$CleanerRunner;->run()V
-HSPLlibcore/util/NativeAllocationRegistry$CleanerThunk;-><init>(Llibcore/util/NativeAllocationRegistry;)V
-HSPLlibcore/util/NativeAllocationRegistry$CleanerThunk;->run()V
-HSPLlibcore/util/NativeAllocationRegistry$CleanerThunk;->setNativePtr(J)V
-HSPLlibcore/util/NativeAllocationRegistry;->-$$Nest$fgetfreeFunction(Llibcore/util/NativeAllocationRegistry;)J
-HSPLlibcore/util/NativeAllocationRegistry;->-$$Nest$fgetsize(Llibcore/util/NativeAllocationRegistry;)J
-HSPLlibcore/util/NativeAllocationRegistry;->-$$Nest$smregisterNativeFree(J)V
-HSPLlibcore/util/NativeAllocationRegistry;-><init>(Ljava/lang/ClassLoader;JJZ)V
-HSPLlibcore/util/NativeAllocationRegistry;->createMalloced(Ljava/lang/ClassLoader;J)Llibcore/util/NativeAllocationRegistry;
-HSPLlibcore/util/NativeAllocationRegistry;->createMalloced(Ljava/lang/ClassLoader;JJ)Llibcore/util/NativeAllocationRegistry;
-HSPLlibcore/util/NativeAllocationRegistry;->createNonmalloced(Ljava/lang/ClassLoader;JJ)Llibcore/util/NativeAllocationRegistry;
-HSPLlibcore/util/NativeAllocationRegistry;->registerNativeAllocation(J)V
-HSPLlibcore/util/NativeAllocationRegistry;->registerNativeAllocation(Ljava/lang/Object;J)Ljava/lang/Runnable;
-HSPLlibcore/util/NativeAllocationRegistry;->registerNativeFree(J)V
-HSPLlibcore/util/SneakyThrow;->sneakyThrow(Ljava/lang/Throwable;)V
-HSPLlibcore/util/SneakyThrow;->sneakyThrow_(Ljava/lang/Throwable;)V
-HSPLlibcore/util/XmlObjectFactory;->newXmlPullParser()Lorg/xmlpull/v1/XmlPullParser;
-HSPLlibcore/util/ZoneInfo;-><init>(Lcom/android/i18n/timezone/ZoneInfoData;IZ)V
-HSPLlibcore/util/ZoneInfo;->clone()Ljava/lang/Object;
-HSPLlibcore/util/ZoneInfo;->createZoneInfo(Lcom/android/i18n/timezone/ZoneInfoData;)Llibcore/util/ZoneInfo;
-HSPLlibcore/util/ZoneInfo;->createZoneInfo(Lcom/android/i18n/timezone/ZoneInfoData;J)Llibcore/util/ZoneInfo;
-HSPLlibcore/util/ZoneInfo;->getDSTSavings()I
-HSPLlibcore/util/ZoneInfo;->getOffset(J)I
-HSPLlibcore/util/ZoneInfo;->getOffsetsByUtcTime(J[I)I
-HSPLlibcore/util/ZoneInfo;->getRawOffset()I
-HSPLlibcore/util/ZoneInfo;->hasSameRules(Ljava/util/TimeZone;)Z
-HSPLlibcore/util/ZoneInfo;->hashCode()I
-HSPLlibcore/util/ZoneInfo;->inDaylightTime(Ljava/util/Date;)Z
-HSPLorg/apache/harmony/dalvik/ddmc/Chunk;-><init>(ILjava/nio/ByteBuffer;)V
-HSPLorg/apache/harmony/dalvik/ddmc/Chunk;-><init>(I[BII)V
-HSPLorg/apache/harmony/dalvik/ddmc/ChunkHandler;->type(Ljava/lang/String;)I
-HSPLorg/apache/harmony/dalvik/ddmc/DdmServer;->broadcast(I)V
-HSPLorg/apache/harmony/dalvik/ddmc/DdmServer;->dispatch(I[BII)Lorg/apache/harmony/dalvik/ddmc/Chunk;
-HSPLorg/apache/harmony/dalvik/ddmc/DdmServer;->sendChunk(Lorg/apache/harmony/dalvik/ddmc/Chunk;)V
-HSPLorg/apache/harmony/xml/ExpatAttributes;-><init>()V
-HSPLorg/apache/harmony/xml/ExpatParser$CurrentAttributes;-><init>(Lorg/apache/harmony/xml/ExpatParser;)V
-HSPLorg/apache/harmony/xml/ExpatParser$CurrentAttributes;-><init>(Lorg/apache/harmony/xml/ExpatParser;Lorg/apache/harmony/xml/ExpatParser$CurrentAttributes-IA;)V
-HSPLorg/apache/harmony/xml/ExpatParser$ExpatLocator;-><init>(Lorg/apache/harmony/xml/ExpatParser;)V
-HSPLorg/apache/harmony/xml/ExpatParser$ExpatLocator;-><init>(Lorg/apache/harmony/xml/ExpatParser;Lorg/apache/harmony/xml/ExpatParser$ExpatLocator-IA;)V
-HSPLorg/apache/harmony/xml/ExpatParser;-><init>(Ljava/lang/String;Lorg/apache/harmony/xml/ExpatReader;ZLjava/lang/String;Ljava/lang/String;)V
-HSPLorg/apache/harmony/xml/ExpatParser;->endDocument()V
-HSPLorg/apache/harmony/xml/ExpatParser;->endElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/apache/harmony/xml/ExpatParser;->finalize()V
-HSPLorg/apache/harmony/xml/ExpatParser;->finish()V
-HSPLorg/apache/harmony/xml/ExpatParser;->startDocument()V
-HSPLorg/apache/harmony/xml/ExpatParser;->startElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JI)V
-HSPLorg/apache/harmony/xml/ExpatReader;-><init>()V
-HSPLorg/apache/harmony/xml/ExpatReader;->parse(Lorg/xml/sax/InputSource;)V
-HSPLorg/apache/harmony/xml/ExpatReader;->setContentHandler(Lorg/xml/sax/ContentHandler;)V
-HSPLorg/apache/harmony/xml/dom/AttrImpl;->getNodeType()S
-HSPLorg/apache/harmony/xml/dom/AttrImpl;->getOwnerElement()Lorg/w3c/dom/Element;
-HSPLorg/apache/harmony/xml/dom/AttrImpl;->setValue(Ljava/lang/String;)V
-HSPLorg/apache/harmony/xml/dom/CharacterDataImpl;-><init>(Lorg/apache/harmony/xml/dom/DocumentImpl;Ljava/lang/String;)V
-HSPLorg/apache/harmony/xml/dom/CharacterDataImpl;->getData()Ljava/lang/String;
-HSPLorg/apache/harmony/xml/dom/CharacterDataImpl;->getNodeValue()Ljava/lang/String;
-HSPLorg/apache/harmony/xml/dom/CharacterDataImpl;->setData(Ljava/lang/String;)V
-HSPLorg/apache/harmony/xml/dom/DOMImplementationImpl;-><init>()V
-HSPLorg/apache/harmony/xml/dom/DOMImplementationImpl;->getInstance()Lorg/apache/harmony/xml/dom/DOMImplementationImpl;
-HSPLorg/apache/harmony/xml/dom/DocumentImpl;-><init>(Lorg/apache/harmony/xml/dom/DOMImplementationImpl;Ljava/lang/String;Ljava/lang/String;Lorg/w3c/dom/DocumentType;Ljava/lang/String;)V
-HSPLorg/apache/harmony/xml/dom/DocumentImpl;->createElement(Ljava/lang/String;)Lorg/apache/harmony/xml/dom/ElementImpl;
-HSPLorg/apache/harmony/xml/dom/DocumentImpl;->getDocumentElement()Lorg/w3c/dom/Element;
-HSPLorg/apache/harmony/xml/dom/DocumentImpl;->insertChildAt(Lorg/w3c/dom/Node;I)Lorg/w3c/dom/Node;
-HSPLorg/apache/harmony/xml/dom/DocumentImpl;->isXMLIdentifier(Ljava/lang/String;)Z
-HSPLorg/apache/harmony/xml/dom/DocumentImpl;->isXMLIdentifierPart(C)Z
-HSPLorg/apache/harmony/xml/dom/DocumentImpl;->isXMLIdentifierStart(C)Z
-HSPLorg/apache/harmony/xml/dom/DocumentImpl;->setDocumentURI(Ljava/lang/String;)V
-HSPLorg/apache/harmony/xml/dom/ElementImpl;-><init>(Lorg/apache/harmony/xml/dom/DocumentImpl;Ljava/lang/String;)V
-HSPLorg/apache/harmony/xml/dom/ElementImpl;->getNodeName()Ljava/lang/String;
-HSPLorg/apache/harmony/xml/dom/ElementImpl;->getNodeType()S
-HSPLorg/apache/harmony/xml/dom/ElementImpl;->getTagName()Ljava/lang/String;
-HSPLorg/apache/harmony/xml/dom/InnerNodeImpl;-><init>(Lorg/apache/harmony/xml/dom/DocumentImpl;)V
-HSPLorg/apache/harmony/xml/dom/InnerNodeImpl;->appendChild(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;
-HSPLorg/apache/harmony/xml/dom/InnerNodeImpl;->getChildNodes()Lorg/w3c/dom/NodeList;
-HSPLorg/apache/harmony/xml/dom/InnerNodeImpl;->getFirstChild()Lorg/w3c/dom/Node;
-HSPLorg/apache/harmony/xml/dom/InnerNodeImpl;->getLastChild()Lorg/w3c/dom/Node;
-HSPLorg/apache/harmony/xml/dom/InnerNodeImpl;->getTextContent()Ljava/lang/String;
-HSPLorg/apache/harmony/xml/dom/InnerNodeImpl;->hasTextContent(Lorg/w3c/dom/Node;)Z
-HSPLorg/apache/harmony/xml/dom/InnerNodeImpl;->insertChildAt(Lorg/w3c/dom/Node;I)Lorg/w3c/dom/Node;
-HSPLorg/apache/harmony/xml/dom/InnerNodeImpl;->isParentOf(Lorg/w3c/dom/Node;)Z
-HSPLorg/apache/harmony/xml/dom/InnerNodeImpl;->refreshIndices(I)V
-HSPLorg/apache/harmony/xml/dom/LeafNodeImpl;-><init>(Lorg/apache/harmony/xml/dom/DocumentImpl;)V
-HSPLorg/apache/harmony/xml/dom/LeafNodeImpl;->getNextSibling()Lorg/w3c/dom/Node;
-HSPLorg/apache/harmony/xml/dom/LeafNodeImpl;->isParentOf(Lorg/w3c/dom/Node;)Z
-HSPLorg/apache/harmony/xml/dom/NodeImpl;-><init>(Lorg/apache/harmony/xml/dom/DocumentImpl;)V
-HSPLorg/apache/harmony/xml/dom/NodeImpl;->getTextContent()Ljava/lang/String;
-HSPLorg/apache/harmony/xml/dom/NodeImpl;->setName(Lorg/apache/harmony/xml/dom/NodeImpl;Ljava/lang/String;)V
-HSPLorg/apache/harmony/xml/dom/NodeListImpl;-><init>()V
-HSPLorg/apache/harmony/xml/dom/NodeListImpl;->add(Lorg/apache/harmony/xml/dom/NodeImpl;)V
-HSPLorg/apache/harmony/xml/dom/NodeListImpl;->getLength()I
-HSPLorg/apache/harmony/xml/dom/NodeListImpl;->item(I)Lorg/w3c/dom/Node;
-HSPLorg/apache/harmony/xml/dom/TextImpl;-><init>(Lorg/apache/harmony/xml/dom/DocumentImpl;Ljava/lang/String;)V
-HSPLorg/apache/harmony/xml/dom/TextImpl;->getNodeType()S
-HSPLorg/apache/harmony/xml/parsers/DocumentBuilderFactoryImpl;-><init>()V
-HSPLorg/apache/harmony/xml/parsers/DocumentBuilderFactoryImpl;->newDocumentBuilder()Ljavax/xml/parsers/DocumentBuilder;
-HSPLorg/apache/harmony/xml/parsers/DocumentBuilderImpl;-><clinit>()V
-HSPLorg/apache/harmony/xml/parsers/DocumentBuilderImpl;-><init>()V
-HSPLorg/apache/harmony/xml/parsers/DocumentBuilderImpl;->appendText(Lorg/apache/harmony/xml/dom/DocumentImpl;Lorg/w3c/dom/Node;ILjava/lang/String;)V
-HSPLorg/apache/harmony/xml/parsers/DocumentBuilderImpl;->parse(Lcom/android/org/kxml2/io/KXmlParser;Lorg/apache/harmony/xml/dom/DocumentImpl;Lorg/w3c/dom/Node;I)V
-HSPLorg/apache/harmony/xml/parsers/DocumentBuilderImpl;->parse(Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;
-HSPLorg/apache/harmony/xml/parsers/DocumentBuilderImpl;->setCoalescing(Z)V
-HSPLorg/apache/harmony/xml/parsers/DocumentBuilderImpl;->setIgnoreComments(Z)V
-HSPLorg/apache/harmony/xml/parsers/DocumentBuilderImpl;->setIgnoreElementContentWhitespace(Z)V
-HSPLorg/apache/harmony/xml/parsers/DocumentBuilderImpl;->setNamespaceAware(Z)V
-HSPLorg/apache/harmony/xml/parsers/SAXParserFactoryImpl;-><init>()V
-HSPLorg/apache/http/conn/ssl/SSLSocketFactory;-><init>(Ljavax/net/ssl/SSLSocketFactory;)V
-HSPLorg/apache/http/params/HttpConnectionParams;->setConnectionTimeout(Lorg/apache/http/params/HttpParams;I)V
-HSPLorg/apache/http/params/HttpConnectionParams;->setSoTimeout(Lorg/apache/http/params/HttpParams;I)V
-HSPLorg/apache/http/params/HttpConnectionParams;->setSocketBufferSize(Lorg/apache/http/params/HttpParams;I)V
-HSPLorg/apache/http/params/HttpConnectionParams;->setStaleCheckingEnabled(Lorg/apache/http/params/HttpParams;Z)V
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;-><init>(Lorg/xml/sax/Attributes;)V
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->addAttribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->clear()V
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->ensureCapacity(I)V
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->getIndex(Ljava/lang/String;)I
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->getLength()I
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->getLocalName(I)Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->getQName(I)Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->getType(I)Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->getURI(I)Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->getValue(I)Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->getValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->removeAttribute(I)V
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->setAttributes(Lorg/xml/sax/Attributes;)V
-HSPLorg/ccil/cowan/tagsoup/Element;-><init>(Lorg/ccil/cowan/tagsoup/ElementType;Z)V
-HSPLorg/ccil/cowan/tagsoup/Element;->atts()Lorg/ccil/cowan/tagsoup/AttributesImpl;
-HSPLorg/ccil/cowan/tagsoup/Element;->canContain(Lorg/ccil/cowan/tagsoup/Element;)Z
-HSPLorg/ccil/cowan/tagsoup/Element;->clean()V
-HSPLorg/ccil/cowan/tagsoup/Element;->flags()I
-HSPLorg/ccil/cowan/tagsoup/Element;->isPreclosed()Z
-HSPLorg/ccil/cowan/tagsoup/Element;->localName()Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/Element;->model()I
-HSPLorg/ccil/cowan/tagsoup/Element;->name()Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/Element;->namespace()Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/Element;->next()Lorg/ccil/cowan/tagsoup/Element;
-HSPLorg/ccil/cowan/tagsoup/Element;->parent()Lorg/ccil/cowan/tagsoup/ElementType;
-HSPLorg/ccil/cowan/tagsoup/Element;->setAttribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/ccil/cowan/tagsoup/Element;->setNext(Lorg/ccil/cowan/tagsoup/Element;)V
-HSPLorg/ccil/cowan/tagsoup/ElementType;->atts()Lorg/ccil/cowan/tagsoup/AttributesImpl;
-HSPLorg/ccil/cowan/tagsoup/ElementType;->canContain(Lorg/ccil/cowan/tagsoup/ElementType;)Z
-HSPLorg/ccil/cowan/tagsoup/ElementType;->flags()I
-HSPLorg/ccil/cowan/tagsoup/ElementType;->localName()Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/ElementType;->localName(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/ElementType;->model()I
-HSPLorg/ccil/cowan/tagsoup/ElementType;->name()Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/ElementType;->namespace()Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/ElementType;->namespace(Ljava/lang/String;Z)Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/ElementType;->parent()Lorg/ccil/cowan/tagsoup/ElementType;
-HSPLorg/ccil/cowan/tagsoup/ElementType;->setAttribute(Lorg/ccil/cowan/tagsoup/AttributesImpl;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/ccil/cowan/tagsoup/HTMLScanner;-><init>()V
-HSPLorg/ccil/cowan/tagsoup/HTMLScanner;->mark()V
-HSPLorg/ccil/cowan/tagsoup/HTMLScanner;->resetDocumentLocator(Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/ccil/cowan/tagsoup/HTMLScanner;->save(ILorg/ccil/cowan/tagsoup/ScanHandler;)V
-HSPLorg/ccil/cowan/tagsoup/HTMLScanner;->scan(Ljava/io/Reader;Lorg/ccil/cowan/tagsoup/ScanHandler;)V
-HSPLorg/ccil/cowan/tagsoup/HTMLScanner;->unread(Ljava/io/PushbackReader;I)V
-HSPLorg/ccil/cowan/tagsoup/Parser$1;-><init>(Lorg/ccil/cowan/tagsoup/Parser;)V
-HSPLorg/ccil/cowan/tagsoup/Parser;-><init>()V
-HSPLorg/ccil/cowan/tagsoup/Parser;->aname([CII)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->aval([CII)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->entity([CII)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->eof([CII)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->etag([CII)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->etag_basic([CII)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->etag_cdata([CII)Z
-HSPLorg/ccil/cowan/tagsoup/Parser;->expandEntities(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/Parser;->foreign(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLorg/ccil/cowan/tagsoup/Parser;->getEntity()I
-HSPLorg/ccil/cowan/tagsoup/Parser;->getReader(Lorg/xml/sax/InputSource;)Ljava/io/Reader;
-HSPLorg/ccil/cowan/tagsoup/Parser;->gi([CII)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->lookupEntity([CII)I
-HSPLorg/ccil/cowan/tagsoup/Parser;->makeName([CII)Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/Parser;->parse(Lorg/xml/sax/InputSource;)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->pcdata([CII)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->pop()V
-HSPLorg/ccil/cowan/tagsoup/Parser;->prefixOf(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/Parser;->push(Lorg/ccil/cowan/tagsoup/Element;)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->rectify(Lorg/ccil/cowan/tagsoup/Element;)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->restart(Lorg/ccil/cowan/tagsoup/Element;)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->setContentHandler(Lorg/xml/sax/ContentHandler;)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->setProperty(Ljava/lang/String;Ljava/lang/Object;)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->setup()V
-HSPLorg/ccil/cowan/tagsoup/Parser;->stagc([CII)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->truthValue(Z)Ljava/lang/Boolean;
-HSPLorg/ccil/cowan/tagsoup/Schema;->getElementType(Ljava/lang/String;)Lorg/ccil/cowan/tagsoup/ElementType;
-HSPLorg/ccil/cowan/tagsoup/Schema;->getEntity(Ljava/lang/String;)I
-HSPLorg/ccil/cowan/tagsoup/Schema;->getPrefix()Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/Schema;->getURI()Ljava/lang/String;
-HSPLorg/json/JSON;->checkDouble(D)D
-HSPLorg/json/JSON;->toBoolean(Ljava/lang/Object;)Ljava/lang/Boolean;
-HSPLorg/json/JSON;->toDouble(Ljava/lang/Object;)Ljava/lang/Double;
-HSPLorg/json/JSON;->toInteger(Ljava/lang/Object;)Ljava/lang/Integer;
-HSPLorg/json/JSON;->toLong(Ljava/lang/Object;)Ljava/lang/Long;
-HSPLorg/json/JSON;->toString(Ljava/lang/Object;)Ljava/lang/String;
-HSPLorg/json/JSON;->typeMismatch(Ljava/lang/Object;Ljava/lang/String;)Lorg/json/JSONException;
-HSPLorg/json/JSONArray;-><init>()V
-HSPLorg/json/JSONArray;-><init>(Ljava/lang/String;)V
-HSPLorg/json/JSONArray;-><init>(Ljava/util/Collection;)V
-HSPLorg/json/JSONArray;-><init>(Lorg/json/JSONTokener;)V
-HSPLorg/json/JSONArray;->get(I)Ljava/lang/Object;
-HSPLorg/json/JSONArray;->getInt(I)I
-HSPLorg/json/JSONArray;->getJSONArray(I)Lorg/json/JSONArray;
-HSPLorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject;
-HSPLorg/json/JSONArray;->getString(I)Ljava/lang/String;
-HSPLorg/json/JSONArray;->length()I
-HSPLorg/json/JSONArray;->opt(I)Ljava/lang/Object;
-HSPLorg/json/JSONArray;->optJSONObject(I)Lorg/json/JSONObject;
-HSPLorg/json/JSONArray;->optString(I)Ljava/lang/String;
-HSPLorg/json/JSONArray;->optString(ILjava/lang/String;)Ljava/lang/String;
-HSPLorg/json/JSONArray;->put(I)Lorg/json/JSONArray;
-HSPLorg/json/JSONArray;->put(J)Lorg/json/JSONArray;
-HSPLorg/json/JSONArray;->put(Ljava/lang/Object;)Lorg/json/JSONArray;
-HSPLorg/json/JSONArray;->toString()Ljava/lang/String;
-HSPLorg/json/JSONArray;->writeTo(Lorg/json/JSONStringer;)V
-HSPLorg/json/JSONException;-><init>(Ljava/lang/String;)V
-HSPLorg/json/JSONObject$1;->toString()Ljava/lang/String;
-HSPLorg/json/JSONObject;-><init>()V
-HSPLorg/json/JSONObject;-><init>(Ljava/lang/String;)V
-HSPLorg/json/JSONObject;-><init>(Ljava/util/Map;)V
-HSPLorg/json/JSONObject;-><init>(Lorg/json/JSONTokener;)V
-HSPLorg/json/JSONObject;->checkName(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/json/JSONObject;->get(Ljava/lang/String;)Ljava/lang/Object;
-HSPLorg/json/JSONObject;->getBoolean(Ljava/lang/String;)Z
-HSPLorg/json/JSONObject;->getDouble(Ljava/lang/String;)D
-HSPLorg/json/JSONObject;->getInt(Ljava/lang/String;)I
-HSPLorg/json/JSONObject;->getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;
-HSPLorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject;
-HSPLorg/json/JSONObject;->getLong(Ljava/lang/String;)J
-HSPLorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/json/JSONObject;->has(Ljava/lang/String;)Z
-HSPLorg/json/JSONObject;->isNull(Ljava/lang/String;)Z
-HSPLorg/json/JSONObject;->keys()Ljava/util/Iterator;
-HSPLorg/json/JSONObject;->length()I
-HSPLorg/json/JSONObject;->numberToString(Ljava/lang/Number;)Ljava/lang/String;
-HSPLorg/json/JSONObject;->opt(Ljava/lang/String;)Ljava/lang/Object;
-HSPLorg/json/JSONObject;->optBoolean(Ljava/lang/String;)Z
-HSPLorg/json/JSONObject;->optBoolean(Ljava/lang/String;Z)Z
-HSPLorg/json/JSONObject;->optDouble(Ljava/lang/String;D)D
-HSPLorg/json/JSONObject;->optInt(Ljava/lang/String;)I
-HSPLorg/json/JSONObject;->optInt(Ljava/lang/String;I)I
-HSPLorg/json/JSONObject;->optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;
-HSPLorg/json/JSONObject;->optJSONObject(Ljava/lang/String;)Lorg/json/JSONObject;
-HSPLorg/json/JSONObject;->optLong(Ljava/lang/String;)J
-HSPLorg/json/JSONObject;->optLong(Ljava/lang/String;J)J
-HSPLorg/json/JSONObject;->optString(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/json/JSONObject;->put(Ljava/lang/String;D)Lorg/json/JSONObject;
-HSPLorg/json/JSONObject;->put(Ljava/lang/String;I)Lorg/json/JSONObject;
-HSPLorg/json/JSONObject;->put(Ljava/lang/String;J)Lorg/json/JSONObject;
-HSPLorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
-HSPLorg/json/JSONObject;->put(Ljava/lang/String;Z)Lorg/json/JSONObject;
-HSPLorg/json/JSONObject;->putOpt(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
-HSPLorg/json/JSONObject;->remove(Ljava/lang/String;)Ljava/lang/Object;
-HSPLorg/json/JSONObject;->toString()Ljava/lang/String;
-HSPLorg/json/JSONObject;->toString(I)Ljava/lang/String;
-HSPLorg/json/JSONObject;->wrap(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLorg/json/JSONObject;->writeTo(Lorg/json/JSONStringer;)V
-HSPLorg/json/JSONStringer;-><init>()V
-HSPLorg/json/JSONStringer;-><init>(I)V
-HSPLorg/json/JSONStringer;->array()Lorg/json/JSONStringer;
-HSPLorg/json/JSONStringer;->beforeKey()V
-HSPLorg/json/JSONStringer;->beforeValue()V
-HSPLorg/json/JSONStringer;->close(Lorg/json/JSONStringer$Scope;Lorg/json/JSONStringer$Scope;Ljava/lang/String;)Lorg/json/JSONStringer;
-HSPLorg/json/JSONStringer;->endArray()Lorg/json/JSONStringer;
-HSPLorg/json/JSONStringer;->endObject()Lorg/json/JSONStringer;
-HSPLorg/json/JSONStringer;->key(Ljava/lang/String;)Lorg/json/JSONStringer;
-HSPLorg/json/JSONStringer;->newline()V
-HSPLorg/json/JSONStringer;->object()Lorg/json/JSONStringer;
-HSPLorg/json/JSONStringer;->open(Lorg/json/JSONStringer$Scope;Ljava/lang/String;)Lorg/json/JSONStringer;
-HSPLorg/json/JSONStringer;->peek()Lorg/json/JSONStringer$Scope;
-HSPLorg/json/JSONStringer;->replaceTop(Lorg/json/JSONStringer$Scope;)V
-HSPLorg/json/JSONStringer;->string(Ljava/lang/String;)V
-HSPLorg/json/JSONStringer;->toString()Ljava/lang/String;
-HSPLorg/json/JSONStringer;->value(Ljava/lang/Object;)Lorg/json/JSONStringer;
-HSPLorg/json/JSONTokener;-><init>(Ljava/lang/String;)V
-HSPLorg/json/JSONTokener;->nextCleanInternal()I
-HSPLorg/json/JSONTokener;->nextString(C)Ljava/lang/String;
-HSPLorg/json/JSONTokener;->nextToInternal(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/json/JSONTokener;->nextValue()Ljava/lang/Object;
-HSPLorg/json/JSONTokener;->readArray()Lorg/json/JSONArray;
-HSPLorg/json/JSONTokener;->readEscapeCharacter()C
-HSPLorg/json/JSONTokener;->readLiteral()Ljava/lang/Object;
-HSPLorg/json/JSONTokener;->readObject()Lorg/json/JSONObject;
-HSPLorg/json/JSONTokener;->syntaxError(Ljava/lang/String;)Lorg/json/JSONException;
-HSPLorg/json/JSONTokener;->toString()Ljava/lang/String;
-HSPLorg/xml/sax/InputSource;-><init>(Ljava/io/InputStream;)V
-HSPLorg/xml/sax/InputSource;-><init>(Ljava/io/Reader;)V
-HSPLorg/xml/sax/InputSource;->getByteStream()Ljava/io/InputStream;
-HSPLorg/xml/sax/InputSource;->getCharacterStream()Ljava/io/Reader;
-HSPLorg/xml/sax/InputSource;->getEncoding()Ljava/lang/String;
-HSPLorg/xml/sax/InputSource;->getPublicId()Ljava/lang/String;
-HSPLorg/xml/sax/InputSource;->getSystemId()Ljava/lang/String;
-HSPLorg/xml/sax/InputSource;->setByteStream(Ljava/io/InputStream;)V
-HSPLorg/xml/sax/InputSource;->setCharacterStream(Ljava/io/Reader;)V
-HSPLorg/xml/sax/helpers/DefaultHandler;-><init>()V
-HSPLorg/xml/sax/helpers/DefaultHandler;->setDocumentLocator(Lorg/xml/sax/Locator;)V
-HSPLorg/xmlpull/v1/XmlPullParserFactory;-><init>()V
-HSPLorg/xmlpull/v1/XmlPullParserFactory;->getParserInstance()Lorg/xmlpull/v1/XmlPullParser;
-HSPLorg/xmlpull/v1/XmlPullParserFactory;->newInstance()Lorg/xmlpull/v1/XmlPullParserFactory;
-HSPLorg/xmlpull/v1/XmlPullParserFactory;->newPullParser()Lorg/xmlpull/v1/XmlPullParser;
-HSPLorg/xmlpull/v1/XmlPullParserFactory;->setNamespaceAware(Z)V
-HSPLsun/invoke/util/VerifyAccess;->isClassAccessible(Ljava/lang/Class;Ljava/lang/Class;I)Z
-HSPLsun/invoke/util/VerifyAccess;->isMemberAccessible(Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Class;I)Z
-HSPLsun/invoke/util/VerifyAccess;->isSamePackage(Ljava/lang/Class;Ljava/lang/Class;)Z
-HSPLsun/invoke/util/Wrapper;->findPrimitiveType(Ljava/lang/Class;)Lsun/invoke/util/Wrapper;
-HSPLsun/invoke/util/Wrapper;->forPrimitiveType(Ljava/lang/Class;)Lsun/invoke/util/Wrapper;
-HSPLsun/invoke/util/Wrapper;->hashPrim(Ljava/lang/Class;)I
-HSPLsun/invoke/util/Wrapper;->isDoubleWord()Z
-HSPLsun/invoke/util/Wrapper;->isIntegral()Z
-HSPLsun/invoke/util/Wrapper;->isNumeric()Z
-HSPLsun/invoke/util/Wrapper;->isSingleWord()Z
-HSPLsun/invoke/util/Wrapper;->isSubwordOrInt()Z
-HSPLsun/misc/ASCIICaseInsensitiveComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLsun/misc/ASCIICaseInsensitiveComparator;->compare(Ljava/lang/String;Ljava/lang/String;)I
-HSPLsun/misc/ASCIICaseInsensitiveComparator;->isUpper(I)Z
-HSPLsun/misc/ASCIICaseInsensitiveComparator;->lowerCaseHashCode(Ljava/lang/String;)I
-HSPLsun/misc/ASCIICaseInsensitiveComparator;->toLower(I)I
-HSPLsun/misc/Cleaner;-><init>(Ljava/lang/Object;Ljava/lang/Runnable;)V
-HSPLsun/misc/Cleaner;->add(Lsun/misc/Cleaner;)Lsun/misc/Cleaner;
-HSPLsun/misc/Cleaner;->checkCleanerQueueEmpty()V
-HSPLsun/misc/Cleaner;->clean()V
-HSPLsun/misc/Cleaner;->create(Ljava/lang/Object;Ljava/lang/Runnable;)Lsun/misc/Cleaner;
-HSPLsun/misc/Cleaner;->isCleanerQueue(Ljava/lang/ref/ReferenceQueue;)Z
-HSPLsun/misc/Cleaner;->remove(Lsun/misc/Cleaner;)Z
-HSPLsun/misc/CompoundEnumeration;-><init>([Ljava/util/Enumeration;)V
-HSPLsun/misc/CompoundEnumeration;->hasMoreElements()Z
-HSPLsun/misc/CompoundEnumeration;->next()Z
-HSPLsun/misc/CompoundEnumeration;->nextElement()Ljava/lang/Object;
-HSPLsun/misc/IOUtils;->readFully(Ljava/io/InputStream;IZ)[B
-HSPLsun/misc/LRUCache;-><init>(I)V
-HSPLsun/misc/LRUCache;->forName(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLsun/misc/LRUCache;->moveToFront([Ljava/lang/Object;I)V
-HSPLsun/misc/Unsafe;->arrayBaseOffset(Ljava/lang/Class;)I
-HSPLsun/misc/Unsafe;->arrayIndexScale(Ljava/lang/Class;)I
-HSPLsun/misc/Unsafe;->getAndAddInt(Ljava/lang/Object;JI)I
-HSPLsun/misc/Unsafe;->getAndAddLong(Ljava/lang/Object;JJ)J
-HSPLsun/misc/Unsafe;->getAndSetInt(Ljava/lang/Object;JI)I
-HSPLsun/misc/Unsafe;->getAndSetLong(Ljava/lang/Object;JJ)J
-HSPLsun/misc/Unsafe;->getAndSetObject(Ljava/lang/Object;JLjava/lang/Object;)Ljava/lang/Object;
-HSPLsun/misc/Unsafe;->getUnsafe()Lsun/misc/Unsafe;
-HSPLsun/misc/Unsafe;->objectFieldOffset(Ljava/lang/reflect/Field;)J
-HSPLsun/misc/VM;->isBooted()Z
-HSPLsun/net/NetHooks;->beforeTcpBind(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V
-HSPLsun/net/NetHooks;->beforeTcpConnect(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V
-HSPLsun/net/NetProperties;->get(Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/net/ResourceManager;->beforeUdpCreate()V
-HSPLsun/net/spi/DefaultProxySelector$1;-><init>(Lsun/net/spi/DefaultProxySelector;Ljava/lang/String;Lsun/net/spi/DefaultProxySelector$NonProxyInfo;Ljava/lang/String;)V
-HSPLsun/net/spi/DefaultProxySelector$1;->run()Ljava/lang/Object;
-HSPLsun/net/spi/DefaultProxySelector$1;->run()Ljava/net/Proxy;
-HSPLsun/net/spi/DefaultProxySelector;->select(Ljava/net/URI;)Ljava/util/List;
-HSPLsun/net/util/IPAddressUtil;->convertFromIPv4MappedAddress([B)[B
-HSPLsun/net/util/IPAddressUtil;->isIPv4MappedAddress([B)Z
-HSPLsun/net/www/ParseUtil;->decode(Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/net/www/ParseUtil;->encodePath(Ljava/lang/String;Z)Ljava/lang/String;
-HSPLsun/net/www/protocol/file/Handler;->parseURL(Ljava/net/URL;Ljava/lang/String;II)V
-HSPLsun/net/www/protocol/jar/Handler;-><init>()V
-HSPLsun/nio/ch/AbstractPollArrayWrapper;-><init>()V
-HSPLsun/nio/ch/AbstractPollArrayWrapper;->getReventOps(I)I
-HSPLsun/nio/ch/AbstractPollArrayWrapper;->putDescriptor(II)V
-HSPLsun/nio/ch/AbstractPollArrayWrapper;->putEventOps(II)V
-HSPLsun/nio/ch/AbstractPollArrayWrapper;->putReventOps(II)V
-HSPLsun/nio/ch/AbstractPollSelectorImpl;-><init>(Ljava/nio/channels/spi/SelectorProvider;II)V
-HSPLsun/nio/ch/AbstractPollSelectorImpl;->implClose()V
-HSPLsun/nio/ch/AbstractPollSelectorImpl;->implRegister(Lsun/nio/ch/SelectionKeyImpl;)V
-HSPLsun/nio/ch/AbstractPollSelectorImpl;->putEventOps(Lsun/nio/ch/SelectionKeyImpl;I)V
-HSPLsun/nio/ch/AbstractPollSelectorImpl;->updateSelectedKeys()I
-HSPLsun/nio/ch/AllocatedNativeObject;-><init>(IZ)V
-HSPLsun/nio/ch/AllocatedNativeObject;->free()V
-HSPLsun/nio/ch/ChannelInputStream;-><init>(Ljava/nio/channels/ReadableByteChannel;)V
-HSPLsun/nio/ch/ChannelInputStream;->available()I
-HSPLsun/nio/ch/ChannelInputStream;->close()V
-HSPLsun/nio/ch/ChannelInputStream;->read()I
-HSPLsun/nio/ch/ChannelInputStream;->read(Ljava/nio/ByteBuffer;)I
-HSPLsun/nio/ch/ChannelInputStream;->read(Ljava/nio/channels/ReadableByteChannel;Ljava/nio/ByteBuffer;Z)I
-HSPLsun/nio/ch/ChannelInputStream;->read([BII)I
-HSPLsun/nio/ch/DefaultSelectorProvider;->create()Ljava/nio/channels/spi/SelectorProvider;
-HSPLsun/nio/ch/FileChannelImpl$Unmapper;-><init>(JJILjava/io/FileDescriptor;)V
-HSPLsun/nio/ch/FileChannelImpl$Unmapper;-><init>(JJILjava/io/FileDescriptor;Lsun/nio/ch/FileChannelImpl$Unmapper-IA;)V
-HSPLsun/nio/ch/FileChannelImpl$Unmapper;->run()V
-HSPLsun/nio/ch/FileChannelImpl;-><init>(Ljava/io/FileDescriptor;Ljava/lang/String;ZZLjava/lang/Object;)V
-HSPLsun/nio/ch/FileChannelImpl;->ensureOpen()V
-HSPLsun/nio/ch/FileChannelImpl;->fileLockTable()Lsun/nio/ch/FileLockTable;
-HSPLsun/nio/ch/FileChannelImpl;->finalize()V
-HSPLsun/nio/ch/FileChannelImpl;->force(Z)V
-HSPLsun/nio/ch/FileChannelImpl;->implCloseChannel()V
-HSPLsun/nio/ch/FileChannelImpl;->isSharedFileLockTable()Z
-HSPLsun/nio/ch/FileChannelImpl;->lock(JJZ)Ljava/nio/channels/FileLock;
-HSPLsun/nio/ch/FileChannelImpl;->map(Ljava/nio/channels/FileChannel$MapMode;JJ)Ljava/nio/MappedByteBuffer;
-HSPLsun/nio/ch/FileChannelImpl;->open(Ljava/io/FileDescriptor;Ljava/lang/String;ZZLjava/lang/Object;)Ljava/nio/channels/FileChannel;
-HSPLsun/nio/ch/FileChannelImpl;->position()J
-HSPLsun/nio/ch/FileChannelImpl;->position(J)Ljava/nio/channels/FileChannel;
-HSPLsun/nio/ch/FileChannelImpl;->read(Ljava/nio/ByteBuffer;)I
-HSPLsun/nio/ch/FileChannelImpl;->release(Lsun/nio/ch/FileLockImpl;)V
-HSPLsun/nio/ch/FileChannelImpl;->size()J
-HSPLsun/nio/ch/FileChannelImpl;->tryLock(JJZ)Ljava/nio/channels/FileLock;
-HSPLsun/nio/ch/FileChannelImpl;->write(Ljava/nio/ByteBuffer;)I
-HSPLsun/nio/ch/FileDescriptorHolderSocketImpl;-><init>(Ljava/io/FileDescriptor;)V
-HSPLsun/nio/ch/FileDispatcher;-><init>()V
-HSPLsun/nio/ch/FileDispatcherImpl;-><init>()V
-HSPLsun/nio/ch/FileDispatcherImpl;->close(Ljava/io/FileDescriptor;)V
-HSPLsun/nio/ch/FileDispatcherImpl;->duplicateForMapping(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;
-HSPLsun/nio/ch/FileDispatcherImpl;->force(Ljava/io/FileDescriptor;Z)I
-HSPLsun/nio/ch/FileDispatcherImpl;->lock(Ljava/io/FileDescriptor;ZJJZ)I
-HSPLsun/nio/ch/FileDispatcherImpl;->read(Ljava/io/FileDescriptor;JI)I
-HSPLsun/nio/ch/FileDispatcherImpl;->release(Ljava/io/FileDescriptor;JJ)V
-HSPLsun/nio/ch/FileDispatcherImpl;->size(Ljava/io/FileDescriptor;)J
-HSPLsun/nio/ch/FileDispatcherImpl;->truncate(Ljava/io/FileDescriptor;J)I
-HSPLsun/nio/ch/FileDispatcherImpl;->write(Ljava/io/FileDescriptor;JI)I
-HSPLsun/nio/ch/FileKey;-><init>()V
-HSPLsun/nio/ch/FileKey;->create(Ljava/io/FileDescriptor;)Lsun/nio/ch/FileKey;
-HSPLsun/nio/ch/FileKey;->hashCode()I
-HSPLsun/nio/ch/FileLockImpl;-><init>(Ljava/nio/channels/FileChannel;JJZ)V
-HSPLsun/nio/ch/FileLockImpl;->invalidate()V
-HSPLsun/nio/ch/FileLockImpl;->isValid()Z
-HSPLsun/nio/ch/FileLockImpl;->release()V
-HSPLsun/nio/ch/FileLockTable;-><init>()V
-HSPLsun/nio/ch/FileLockTable;->newSharedFileLockTable(Ljava/nio/channels/Channel;Ljava/io/FileDescriptor;)Lsun/nio/ch/FileLockTable;
-HSPLsun/nio/ch/IOStatus;->checkAll(J)Z
-HSPLsun/nio/ch/IOStatus;->normalize(I)I
-HSPLsun/nio/ch/IOStatus;->normalize(J)J
-HSPLsun/nio/ch/IOUtil;->newFD(I)Ljava/io/FileDescriptor;
-HSPLsun/nio/ch/IOUtil;->read(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;JLsun/nio/ch/NativeDispatcher;)I
-HSPLsun/nio/ch/IOUtil;->readIntoNativeBuffer(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;JLsun/nio/ch/NativeDispatcher;)I
-HSPLsun/nio/ch/IOUtil;->write(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;JLsun/nio/ch/NativeDispatcher;)I
-HSPLsun/nio/ch/IOUtil;->writeFromNativeBuffer(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;JLsun/nio/ch/NativeDispatcher;)I
-HSPLsun/nio/ch/NativeDispatcher;-><init>()V
-HSPLsun/nio/ch/NativeDispatcher;->needsPositionLock()Z
-HSPLsun/nio/ch/NativeObject;-><init>(IZ)V
-HSPLsun/nio/ch/NativeObject;->address()J
-HSPLsun/nio/ch/NativeObject;->getShort(I)S
-HSPLsun/nio/ch/NativeObject;->putInt(II)V
-HSPLsun/nio/ch/NativeObject;->putShort(IS)V
-HSPLsun/nio/ch/NativeThreadSet;-><init>(I)V
-HSPLsun/nio/ch/NativeThreadSet;->add()I
-HSPLsun/nio/ch/NativeThreadSet;->remove(I)V
-HSPLsun/nio/ch/NativeThreadSet;->signalAndWait()V
-HSPLsun/nio/ch/Net;->checkAddress(Ljava/net/SocketAddress;)Ljava/net/InetSocketAddress;
-HSPLsun/nio/ch/Net;->connect(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)I
-HSPLsun/nio/ch/Net;->connect(Ljava/net/ProtocolFamily;Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)I
-HSPLsun/nio/ch/Net;->isIPv6Available()Z
-HSPLsun/nio/ch/Net;->localAddress(Ljava/io/FileDescriptor;)Ljava/net/InetSocketAddress;
-HSPLsun/nio/ch/Net;->socket(Ljava/net/ProtocolFamily;Z)Ljava/io/FileDescriptor;
-HSPLsun/nio/ch/Net;->socket(Z)Ljava/io/FileDescriptor;
-HSPLsun/nio/ch/PollArrayWrapper;-><init>(I)V
-HSPLsun/nio/ch/PollArrayWrapper;->addEntry(Lsun/nio/ch/SelChImpl;)V
-HSPLsun/nio/ch/PollArrayWrapper;->free()V
-HSPLsun/nio/ch/PollArrayWrapper;->initInterrupt(II)V
-HSPLsun/nio/ch/PollArrayWrapper;->interrupt()V
-HSPLsun/nio/ch/PollArrayWrapper;->poll(IIJ)I
-HSPLsun/nio/ch/PollArrayWrapper;->release(I)V
-HSPLsun/nio/ch/PollSelectorImpl;-><init>(Ljava/nio/channels/spi/SelectorProvider;)V
-HSPLsun/nio/ch/PollSelectorImpl;->doSelect(J)I
-HSPLsun/nio/ch/PollSelectorImpl;->implCloseInterrupt()V
-HSPLsun/nio/ch/PollSelectorImpl;->wakeup()Ljava/nio/channels/Selector;
-HSPLsun/nio/ch/PollSelectorProvider;-><init>()V
-HSPLsun/nio/ch/PollSelectorProvider;->openSelector()Ljava/nio/channels/spi/AbstractSelector;
-HSPLsun/nio/ch/SelectionKeyImpl;-><init>(Lsun/nio/ch/SelChImpl;Lsun/nio/ch/SelectorImpl;)V
-HSPLsun/nio/ch/SelectionKeyImpl;->channel()Ljava/nio/channels/SelectableChannel;
-HSPLsun/nio/ch/SelectionKeyImpl;->ensureValid()V
-HSPLsun/nio/ch/SelectionKeyImpl;->getIndex()I
-HSPLsun/nio/ch/SelectionKeyImpl;->interestOps(I)Ljava/nio/channels/SelectionKey;
-HSPLsun/nio/ch/SelectionKeyImpl;->nioInterestOps()I
-HSPLsun/nio/ch/SelectionKeyImpl;->nioInterestOps(I)Ljava/nio/channels/SelectionKey;
-HSPLsun/nio/ch/SelectionKeyImpl;->nioReadyOps()I
-HSPLsun/nio/ch/SelectionKeyImpl;->nioReadyOps(I)V
-HSPLsun/nio/ch/SelectionKeyImpl;->setIndex(I)V
-HSPLsun/nio/ch/SelectorImpl;-><init>(Ljava/nio/channels/spi/SelectorProvider;)V
-HSPLsun/nio/ch/SelectorImpl;->implCloseSelector()V
-HSPLsun/nio/ch/SelectorImpl;->lockAndDoSelect(J)I
-HSPLsun/nio/ch/SelectorImpl;->processDeregisterQueue()V
-HSPLsun/nio/ch/SelectorImpl;->register(Ljava/nio/channels/spi/AbstractSelectableChannel;ILjava/lang/Object;)Ljava/nio/channels/SelectionKey;
-HSPLsun/nio/ch/SelectorImpl;->select(J)I
-HSPLsun/nio/ch/SelectorProviderImpl;-><init>()V
-HSPLsun/nio/ch/SelectorProviderImpl;->openSocketChannel()Ljava/nio/channels/SocketChannel;
-HSPLsun/nio/ch/SharedFileLockTable$FileLockReference;-><init>(Ljava/nio/channels/FileLock;Ljava/lang/ref/ReferenceQueue;Lsun/nio/ch/FileKey;)V
-HSPLsun/nio/ch/SharedFileLockTable$FileLockReference;->fileKey()Lsun/nio/ch/FileKey;
-HSPLsun/nio/ch/SharedFileLockTable;-><init>(Ljava/nio/channels/Channel;Ljava/io/FileDescriptor;)V
-HSPLsun/nio/ch/SharedFileLockTable;->add(Ljava/nio/channels/FileLock;)V
-HSPLsun/nio/ch/SharedFileLockTable;->checkList(Ljava/util/List;JJ)V
-HSPLsun/nio/ch/SharedFileLockTable;->remove(Ljava/nio/channels/FileLock;)V
-HSPLsun/nio/ch/SharedFileLockTable;->removeAll()Ljava/util/List;
-HSPLsun/nio/ch/SharedFileLockTable;->removeKeyIfEmpty(Lsun/nio/ch/FileKey;Ljava/util/List;)V
-HSPLsun/nio/ch/SharedFileLockTable;->removeStaleEntries()V
-HSPLsun/nio/ch/SocketAdaptor;-><init>(Lsun/nio/ch/SocketChannelImpl;)V
-HSPLsun/nio/ch/SocketAdaptor;->create(Lsun/nio/ch/SocketChannelImpl;)Ljava/net/Socket;
-HSPLsun/nio/ch/SocketAdaptor;->getInetAddress()Ljava/net/InetAddress;
-HSPLsun/nio/ch/SocketAdaptor;->isClosed()Z
-HSPLsun/nio/ch/SocketAdaptor;->isConnected()Z
-HSPLsun/nio/ch/SocketChannelImpl;-><init>(Ljava/nio/channels/spi/SelectorProvider;)V
-HSPLsun/nio/ch/SocketChannelImpl;->connect(Ljava/net/SocketAddress;)Z
-HSPLsun/nio/ch/SocketChannelImpl;->ensureOpenAndUnconnected()V
-HSPLsun/nio/ch/SocketChannelImpl;->finishConnect()Z
-HSPLsun/nio/ch/SocketChannelImpl;->getFD()Ljava/io/FileDescriptor;
-HSPLsun/nio/ch/SocketChannelImpl;->implCloseSelectableChannel()V
-HSPLsun/nio/ch/SocketChannelImpl;->implConfigureBlocking(Z)V
-HSPLsun/nio/ch/SocketChannelImpl;->isConnected()Z
-HSPLsun/nio/ch/SocketChannelImpl;->kill()V
-HSPLsun/nio/ch/SocketChannelImpl;->readerCleanup()V
-HSPLsun/nio/ch/SocketChannelImpl;->remoteAddress()Ljava/net/SocketAddress;
-HSPLsun/nio/ch/SocketChannelImpl;->socket()Ljava/net/Socket;
-HSPLsun/nio/ch/SocketChannelImpl;->translateAndSetInterestOps(ILsun/nio/ch/SelectionKeyImpl;)V
-HSPLsun/nio/ch/SocketChannelImpl;->translateAndSetReadyOps(ILsun/nio/ch/SelectionKeyImpl;)Z
-HSPLsun/nio/ch/SocketChannelImpl;->translateReadyOps(IILsun/nio/ch/SelectionKeyImpl;)Z
-HSPLsun/nio/ch/SocketDispatcher;->close(Ljava/io/FileDescriptor;)V
-HSPLsun/nio/ch/SocketDispatcher;->preClose(Ljava/io/FileDescriptor;)V
-HSPLsun/nio/ch/Util$1;->initialValue()Ljava/lang/Object;
-HSPLsun/nio/ch/Util$1;->initialValue()Lsun/nio/ch/Util$BufferCache;
-HSPLsun/nio/ch/Util$3;-><init>(Ljava/util/Set;)V
-HSPLsun/nio/ch/Util$BufferCache;-><init>()V
-HSPLsun/nio/ch/Util$BufferCache;->get(I)Ljava/nio/ByteBuffer;
-HSPLsun/nio/ch/Util$BufferCache;->isEmpty()Z
-HSPLsun/nio/ch/Util$BufferCache;->next(I)I
-HSPLsun/nio/ch/Util$BufferCache;->offerFirst(Ljava/nio/ByteBuffer;)Z
-HSPLsun/nio/ch/Util$BufferCache;->removeFirst()Ljava/nio/ByteBuffer;
-HSPLsun/nio/ch/Util;->atBugLevel(Ljava/lang/String;)Z
-HSPLsun/nio/ch/Util;->free(Ljava/nio/ByteBuffer;)V
-HSPLsun/nio/ch/Util;->getTemporaryDirectBuffer(I)Ljava/nio/ByteBuffer;
-HSPLsun/nio/ch/Util;->isBufferTooLarge(I)Z
-HSPLsun/nio/ch/Util;->isBufferTooLarge(Ljava/nio/ByteBuffer;)Z
-HSPLsun/nio/ch/Util;->offerFirstTemporaryDirectBuffer(Ljava/nio/ByteBuffer;)V
-HSPLsun/nio/ch/Util;->ungrowableSet(Ljava/util/Set;)Ljava/util/Set;
-HSPLsun/nio/cs/StreamDecoder;-><init>(Ljava/io/InputStream;Ljava/lang/Object;Ljava/nio/charset/Charset;)V
-HSPLsun/nio/cs/StreamDecoder;-><init>(Ljava/io/InputStream;Ljava/lang/Object;Ljava/nio/charset/CharsetDecoder;)V
-HSPLsun/nio/cs/StreamDecoder;->close()V
-HSPLsun/nio/cs/StreamDecoder;->ensureOpen()V
-HSPLsun/nio/cs/StreamDecoder;->forInputStreamReader(Ljava/io/InputStream;Ljava/lang/Object;Ljava/lang/String;)Lsun/nio/cs/StreamDecoder;
-HSPLsun/nio/cs/StreamDecoder;->forInputStreamReader(Ljava/io/InputStream;Ljava/lang/Object;Ljava/nio/charset/Charset;)Lsun/nio/cs/StreamDecoder;
-HSPLsun/nio/cs/StreamDecoder;->forInputStreamReader(Ljava/io/InputStream;Ljava/lang/Object;Ljava/nio/charset/CharsetDecoder;)Lsun/nio/cs/StreamDecoder;
-HSPLsun/nio/cs/StreamDecoder;->implClose()V
-HSPLsun/nio/cs/StreamDecoder;->implRead([CII)I
-HSPLsun/nio/cs/StreamDecoder;->implReady()Z
-HSPLsun/nio/cs/StreamDecoder;->inReady()Z
-HSPLsun/nio/cs/StreamDecoder;->read()I
-HSPLsun/nio/cs/StreamDecoder;->read([CII)I
-HSPLsun/nio/cs/StreamDecoder;->read0()I
-HSPLsun/nio/cs/StreamDecoder;->readBytes()I
-HSPLsun/nio/cs/StreamDecoder;->ready()Z
-HSPLsun/nio/cs/StreamEncoder;-><init>(Ljava/io/OutputStream;Ljava/lang/Object;Ljava/nio/charset/Charset;)V
-HSPLsun/nio/cs/StreamEncoder;-><init>(Ljava/io/OutputStream;Ljava/lang/Object;Ljava/nio/charset/CharsetEncoder;)V
-HSPLsun/nio/cs/StreamEncoder;->close()V
-HSPLsun/nio/cs/StreamEncoder;->ensureOpen()V
-HSPLsun/nio/cs/StreamEncoder;->flush()V
-HSPLsun/nio/cs/StreamEncoder;->flushLeftoverChar(Ljava/nio/CharBuffer;Z)V
-HSPLsun/nio/cs/StreamEncoder;->forOutputStreamWriter(Ljava/io/OutputStream;Ljava/lang/Object;Ljava/lang/String;)Lsun/nio/cs/StreamEncoder;
-HSPLsun/nio/cs/StreamEncoder;->forOutputStreamWriter(Ljava/io/OutputStream;Ljava/lang/Object;Ljava/nio/charset/Charset;)Lsun/nio/cs/StreamEncoder;
-HSPLsun/nio/cs/StreamEncoder;->implClose()V
-HSPLsun/nio/cs/StreamEncoder;->implFlush()V
-HSPLsun/nio/cs/StreamEncoder;->implFlushBuffer()V
-HSPLsun/nio/cs/StreamEncoder;->implWrite(Ljava/nio/CharBuffer;)V+]Ljava/nio/charset/CoderResult;Ljava/nio/charset/CoderResult;
-HSPLsun/nio/cs/StreamEncoder;->implWrite([CII)V
-HSPLsun/nio/cs/StreamEncoder;->write(I)V
-HSPLsun/nio/cs/StreamEncoder;->write(Ljava/lang/String;II)V
-HSPLsun/nio/cs/StreamEncoder;->write([CII)V
-HSPLsun/nio/cs/StreamEncoder;->writeBytes()V
-HSPLsun/nio/cs/ThreadLocalCoders$1;->create(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLsun/nio/cs/ThreadLocalCoders$1;->hasName(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLsun/nio/cs/ThreadLocalCoders$2;->create(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLsun/nio/cs/ThreadLocalCoders$2;->hasName(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLsun/nio/cs/ThreadLocalCoders$Cache;->forName(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLsun/nio/cs/ThreadLocalCoders$Cache;->moveToFront([Ljava/lang/Object;I)V
-HSPLsun/nio/cs/ThreadLocalCoders;->decoderFor(Ljava/lang/Object;)Ljava/nio/charset/CharsetDecoder;
-HSPLsun/nio/cs/ThreadLocalCoders;->encoderFor(Ljava/lang/Object;)Ljava/nio/charset/CharsetEncoder;
-HSPLsun/nio/fs/AbstractBasicFileAttributeView;-><init>()V
-HSPLsun/nio/fs/AbstractPath;-><init>()V
-HSPLsun/nio/fs/AbstractPath;->resolve(Ljava/lang/String;)Ljava/nio/file/Path;
-HSPLsun/nio/fs/AbstractPath;->toFile()Ljava/io/File;
-HSPLsun/nio/fs/LinuxFileSystemProvider;->getFileAttributeView(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileAttributeView;
-HSPLsun/nio/fs/LinuxFileSystemProvider;->readAttributes(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/BasicFileAttributes;
-HSPLsun/nio/fs/NativeBuffer$Deallocator;-><init>(J)V
-HSPLsun/nio/fs/NativeBuffer$Deallocator;->run()V
-HSPLsun/nio/fs/NativeBuffer;-><init>(I)V
-HSPLsun/nio/fs/NativeBuffer;->address()J
-HSPLsun/nio/fs/NativeBuffer;->owner()Ljava/lang/Object;
-HSPLsun/nio/fs/NativeBuffer;->release()V
-HSPLsun/nio/fs/NativeBuffer;->setOwner(Ljava/lang/Object;)V
-HSPLsun/nio/fs/NativeBuffer;->size()I
-HSPLsun/nio/fs/NativeBuffers;->allocNativeBuffer(I)Lsun/nio/fs/NativeBuffer;
-HSPLsun/nio/fs/NativeBuffers;->copyCStringToNativeBuffer([BLsun/nio/fs/NativeBuffer;)V
-HSPLsun/nio/fs/NativeBuffers;->getNativeBufferFromCache(I)Lsun/nio/fs/NativeBuffer;
-HSPLsun/nio/fs/NativeBuffers;->releaseNativeBuffer(Lsun/nio/fs/NativeBuffer;)V
-HSPLsun/nio/fs/UnixChannelFactory$1;-><clinit>()V
-HSPLsun/nio/fs/UnixChannelFactory$Flags;-><init>()V
-HSPLsun/nio/fs/UnixChannelFactory$Flags;->toFlags(Ljava/util/Set;)Lsun/nio/fs/UnixChannelFactory$Flags;
-HSPLsun/nio/fs/UnixChannelFactory;->newFileChannel(ILsun/nio/fs/UnixPath;Ljava/lang/String;Ljava/util/Set;I)Ljava/nio/channels/FileChannel;
-HSPLsun/nio/fs/UnixChannelFactory;->newFileChannel(Lsun/nio/fs/UnixPath;Ljava/util/Set;I)Ljava/nio/channels/FileChannel;
-HSPLsun/nio/fs/UnixChannelFactory;->open(ILsun/nio/fs/UnixPath;Ljava/lang/String;Lsun/nio/fs/UnixChannelFactory$Flags;I)Ljava/io/FileDescriptor;
-HSPLsun/nio/fs/UnixDirectoryStream$UnixDirectoryIterator;-><clinit>()V
-HSPLsun/nio/fs/UnixDirectoryStream$UnixDirectoryIterator;-><init>(Lsun/nio/fs/UnixDirectoryStream;Ljava/nio/file/DirectoryStream;)V
-HSPLsun/nio/fs/UnixDirectoryStream$UnixDirectoryIterator;->hasNext()Z
-HSPLsun/nio/fs/UnixDirectoryStream$UnixDirectoryIterator;->isSelfOrParent([B)Z
-HSPLsun/nio/fs/UnixDirectoryStream$UnixDirectoryIterator;->next()Ljava/lang/Object;
-HSPLsun/nio/fs/UnixDirectoryStream$UnixDirectoryIterator;->next()Ljava/nio/file/Path;
-HSPLsun/nio/fs/UnixDirectoryStream$UnixDirectoryIterator;->readNextEntry()Ljava/nio/file/Path;
-HSPLsun/nio/fs/UnixDirectoryStream;->-$$Nest$fgetdp(Lsun/nio/fs/UnixDirectoryStream;)J
-HSPLsun/nio/fs/UnixDirectoryStream;-><init>(Lsun/nio/fs/UnixPath;JLjava/nio/file/DirectoryStream$Filter;)V
-HSPLsun/nio/fs/UnixDirectoryStream;->close()V
-HSPLsun/nio/fs/UnixDirectoryStream;->closeImpl()Z
-HSPLsun/nio/fs/UnixDirectoryStream;->finalize()V
-HSPLsun/nio/fs/UnixDirectoryStream;->isOpen()Z
-HSPLsun/nio/fs/UnixDirectoryStream;->iterator(Ljava/nio/file/DirectoryStream;)Ljava/util/Iterator;
-HSPLsun/nio/fs/UnixDirectoryStream;->readLock()Ljava/util/concurrent/locks/Lock;
-HSPLsun/nio/fs/UnixDirectoryStream;->writeLock()Ljava/util/concurrent/locks/Lock;
-HSPLsun/nio/fs/UnixException;-><init>(I)V
-HSPLsun/nio/fs/UnixException;->errno()I
-HSPLsun/nio/fs/UnixException;->fillInStackTrace()Ljava/lang/Throwable;
-HSPLsun/nio/fs/UnixException;->rethrowAsIOException(Lsun/nio/fs/UnixPath;)V
-HSPLsun/nio/fs/UnixException;->rethrowAsIOException(Lsun/nio/fs/UnixPath;Lsun/nio/fs/UnixPath;)V
-HSPLsun/nio/fs/UnixException;->translateToIOException(Ljava/lang/String;Ljava/lang/String;)Ljava/io/IOException;
-HSPLsun/nio/fs/UnixFileAttributeViews$Basic;-><init>(Lsun/nio/fs/UnixPath;Z)V
-HSPLsun/nio/fs/UnixFileAttributeViews$Basic;->readAttributes()Ljava/nio/file/attribute/BasicFileAttributes;
-HSPLsun/nio/fs/UnixFileAttributeViews;->createBasicView(Lsun/nio/fs/UnixPath;Z)Lsun/nio/fs/UnixFileAttributeViews$Basic;
-HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;-><init>(Lsun/nio/fs/UnixFileAttributes;)V
-HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->creationTime()Ljava/nio/file/attribute/FileTime;
-HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->fileKey()Ljava/lang/Object;+]Lsun/nio/fs/UnixFileAttributes;Lsun/nio/fs/UnixFileAttributes;
-HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->isDirectory()Z
-HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->isRegularFile()Z
-HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->isSymbolicLink()Z
-HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->lastAccessTime()Ljava/nio/file/attribute/FileTime;
-HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->lastModifiedTime()Ljava/nio/file/attribute/FileTime;
-HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->size()J
-HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->wrap(Lsun/nio/fs/UnixFileAttributes;)Lsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;
-HSPLsun/nio/fs/UnixFileAttributes;-><init>()V
-HSPLsun/nio/fs/UnixFileAttributes;->asBasicFileAttributes()Ljava/nio/file/attribute/BasicFileAttributes;
-HSPLsun/nio/fs/UnixFileAttributes;->creationTime()Ljava/nio/file/attribute/FileTime;
-HSPLsun/nio/fs/UnixFileAttributes;->fileKey()Lsun/nio/fs/UnixFileKey;
-HSPLsun/nio/fs/UnixFileAttributes;->get(Lsun/nio/fs/UnixPath;Z)Lsun/nio/fs/UnixFileAttributes;
-HSPLsun/nio/fs/UnixFileAttributes;->isDirectory()Z
-HSPLsun/nio/fs/UnixFileAttributes;->isRegularFile()Z
-HSPLsun/nio/fs/UnixFileAttributes;->isSymbolicLink()Z
-HSPLsun/nio/fs/UnixFileAttributes;->lastAccessTime()Ljava/nio/file/attribute/FileTime;
-HSPLsun/nio/fs/UnixFileAttributes;->lastModifiedTime()Ljava/nio/file/attribute/FileTime;
-HSPLsun/nio/fs/UnixFileAttributes;->size()J
-HSPLsun/nio/fs/UnixFileAttributes;->toFileTime(JJ)Ljava/nio/file/attribute/FileTime;
-HSPLsun/nio/fs/UnixFileKey;-><init>(JJ)V
-HSPLsun/nio/fs/UnixFileKey;->equals(Ljava/lang/Object;)Z
-HSPLsun/nio/fs/UnixFileModeAttribute;->toUnixMode(I[Ljava/nio/file/attribute/FileAttribute;)I
-HSPLsun/nio/fs/UnixFileSystem;->getPath(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;
-HSPLsun/nio/fs/UnixFileSystem;->needToResolveAgainstDefaultDirectory()Z
-HSPLsun/nio/fs/UnixFileSystem;->normalizeJavaPath(Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/nio/fs/UnixFileSystem;->normalizeNativePath([C)[C
-HSPLsun/nio/fs/UnixFileSystem;->provider()Ljava/nio/file/spi/FileSystemProvider;
-HSPLsun/nio/fs/UnixFileSystemProvider$3;-><clinit>()V
-HSPLsun/nio/fs/UnixFileSystemProvider;->checkAccess(Ljava/nio/file/Path;[Ljava/nio/file/AccessMode;)V
-HSPLsun/nio/fs/UnixFileSystemProvider;->checkPath(Ljava/nio/file/Path;)Lsun/nio/fs/UnixPath;
-HSPLsun/nio/fs/UnixFileSystemProvider;->getFileAttributeView(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileAttributeView;
-HSPLsun/nio/fs/UnixFileSystemProvider;->newByteChannel(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/SeekableByteChannel;
-HSPLsun/nio/fs/UnixFileSystemProvider;->newDirectoryStream(Ljava/nio/file/Path;Ljava/nio/file/DirectoryStream$Filter;)Ljava/nio/file/DirectoryStream;
-HSPLsun/nio/fs/UnixFileSystemProvider;->newFileChannel(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/FileChannel;
-HSPLsun/nio/fs/UnixFileSystemProvider;->readAttributes(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/BasicFileAttributes;
-HSPLsun/nio/fs/UnixNativeDispatcher;->access(Lsun/nio/fs/UnixPath;I)V
-HSPLsun/nio/fs/UnixNativeDispatcher;->copyToNativeBuffer(Lsun/nio/fs/UnixPath;)Lsun/nio/fs/NativeBuffer;
-HSPLsun/nio/fs/UnixNativeDispatcher;->lstat(Lsun/nio/fs/UnixPath;Lsun/nio/fs/UnixFileAttributes;)V
-HSPLsun/nio/fs/UnixNativeDispatcher;->open(Lsun/nio/fs/UnixPath;II)I
-HSPLsun/nio/fs/UnixNativeDispatcher;->openatSupported()Z
-HSPLsun/nio/fs/UnixNativeDispatcher;->stat(Lsun/nio/fs/UnixPath;Lsun/nio/fs/UnixFileAttributes;)V
-HSPLsun/nio/fs/UnixPath;-><init>(Lsun/nio/fs/UnixFileSystem;Ljava/lang/String;)V
-HSPLsun/nio/fs/UnixPath;-><init>(Lsun/nio/fs/UnixFileSystem;[B)V
-HSPLsun/nio/fs/UnixPath;->asByteArray()[B
-HSPLsun/nio/fs/UnixPath;->checkNotNul(Ljava/lang/String;C)V
-HSPLsun/nio/fs/UnixPath;->checkRead()V
-HSPLsun/nio/fs/UnixPath;->checkWrite()V
-HSPLsun/nio/fs/UnixPath;->encode(Lsun/nio/fs/UnixFileSystem;Ljava/lang/String;)[B
-HSPLsun/nio/fs/UnixPath;->getByteArrayForSysCalls()[B
-HSPLsun/nio/fs/UnixPath;->getFileSystem()Ljava/nio/file/FileSystem;
-HSPLsun/nio/fs/UnixPath;->getFileSystem()Lsun/nio/fs/UnixFileSystem;
-HSPLsun/nio/fs/UnixPath;->getParent()Ljava/nio/file/Path;
-HSPLsun/nio/fs/UnixPath;->getParent()Lsun/nio/fs/UnixPath;
-HSPLsun/nio/fs/UnixPath;->getPathForExceptionMessage()Ljava/lang/String;
-HSPLsun/nio/fs/UnixPath;->initOffsets()V
-HSPLsun/nio/fs/UnixPath;->isEmpty()Z
-HSPLsun/nio/fs/UnixPath;->normalize(Ljava/lang/String;II)Ljava/lang/String;
-HSPLsun/nio/fs/UnixPath;->normalizeAndCheck(Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/nio/fs/UnixPath;->resolve(Ljava/nio/file/Path;)Ljava/nio/file/Path;
-HSPLsun/nio/fs/UnixPath;->resolve(Ljava/nio/file/Path;)Lsun/nio/fs/UnixPath;
-HSPLsun/nio/fs/UnixPath;->resolve([B)Lsun/nio/fs/UnixPath;
-HSPLsun/nio/fs/UnixPath;->resolve([B[B)[B
-HSPLsun/nio/fs/UnixPath;->toString()Ljava/lang/String;
-HSPLsun/nio/fs/UnixPath;->toUnixPath(Ljava/nio/file/Path;)Lsun/nio/fs/UnixPath;
-HSPLsun/nio/fs/UnixSecureDirectoryStream;-><init>(Lsun/nio/fs/UnixPath;JILjava/nio/file/DirectoryStream$Filter;)V
-HSPLsun/nio/fs/UnixSecureDirectoryStream;->close()V
-HSPLsun/nio/fs/UnixSecureDirectoryStream;->finalize()V
-HSPLsun/nio/fs/UnixSecureDirectoryStream;->iterator()Ljava/util/Iterator;
-HSPLsun/nio/fs/Util;->followLinks([Ljava/nio/file/LinkOption;)Z
-HSPLsun/nio/fs/Util;->jnuEncoding()Ljava/nio/charset/Charset;
-HSPLsun/nio/fs/Util;->toString([B)Ljava/lang/String;
-HSPLsun/reflect/Reflection;->ensureMemberAccess(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Object;I)V
-HSPLsun/reflect/Reflection;->getCallerClass()Ljava/lang/Class;
-HSPLsun/reflect/Reflection;->isSameClassPackage(Ljava/lang/Class;Ljava/lang/Class;)Z
-HSPLsun/reflect/Reflection;->isSameClassPackage(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/String;)Z
-HSPLsun/reflect/Reflection;->verifyMemberAccess(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Object;I)Z
-HSPLsun/reflect/misc/ReflectUtil;->ensureMemberAccess(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Object;I)V
-HSPLsun/security/action/GetPropertyAction;-><init>(Ljava/lang/String;)V
-HSPLsun/security/action/GetPropertyAction;->run()Ljava/lang/Object;
-HSPLsun/security/action/GetPropertyAction;->run()Ljava/lang/String;
-HSPLsun/security/jca/GetInstance$Instance;-><init>(Ljava/security/Provider;Ljava/lang/Object;)V
-HSPLsun/security/jca/GetInstance$Instance;-><init>(Ljava/security/Provider;Ljava/lang/Object;Lsun/security/jca/GetInstance$Instance-IA;)V
-HSPLsun/security/jca/GetInstance$Instance;->toArray()[Ljava/lang/Object;
-HSPLsun/security/jca/GetInstance;->checkSuperClass(Ljava/security/Provider$Service;Ljava/lang/Class;Ljava/lang/Class;)V
-HSPLsun/security/jca/GetInstance;->getInstance(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;)Lsun/security/jca/GetInstance$Instance;
-HSPLsun/security/jca/GetInstance;->getInstance(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Object;)Lsun/security/jca/GetInstance$Instance;
-HSPLsun/security/jca/GetInstance;->getInstance(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)Lsun/security/jca/GetInstance$Instance;
-HSPLsun/security/jca/GetInstance;->getInstance(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;Ljava/security/Provider;)Lsun/security/jca/GetInstance$Instance;
-HSPLsun/security/jca/GetInstance;->getInstance(Ljava/security/Provider$Service;Ljava/lang/Class;)Lsun/security/jca/GetInstance$Instance;
-HSPLsun/security/jca/GetInstance;->getInstance(Ljava/security/Provider$Service;Ljava/lang/Class;Ljava/lang/Object;)Lsun/security/jca/GetInstance$Instance;
-HSPLsun/security/jca/GetInstance;->getService(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/security/Provider$Service;
-HSPLsun/security/jca/GetInstance;->getService(Ljava/lang/String;Ljava/lang/String;Ljava/security/Provider;)Ljava/security/Provider$Service;
-HSPLsun/security/jca/GetInstance;->getServices(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
-HSPLsun/security/jca/JCAUtil;->getSecureRandom()Ljava/security/SecureRandom;
-HSPLsun/security/jca/ProviderConfig;-><init>(Ljava/lang/String;)V
-HSPLsun/security/jca/ProviderConfig;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLsun/security/jca/ProviderConfig;-><init>(Ljava/security/Provider;)V
-HSPLsun/security/jca/ProviderConfig;->equals(Ljava/lang/Object;)Z
-HSPLsun/security/jca/ProviderConfig;->expand(Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/security/jca/ProviderConfig;->getProvider()Ljava/security/Provider;
-HSPLsun/security/jca/ProviderList$3;-><init>(Lsun/security/jca/ProviderList;)V
-HSPLsun/security/jca/ProviderList$3;->get(I)Ljava/lang/Object;
-HSPLsun/security/jca/ProviderList$3;->get(I)Ljava/security/Provider;
-HSPLsun/security/jca/ProviderList$3;->size()I
-HSPLsun/security/jca/ProviderList$ServiceList$1;-><init>(Lsun/security/jca/ProviderList$ServiceList;)V
-HSPLsun/security/jca/ProviderList$ServiceList$1;->hasNext()Z
-HSPLsun/security/jca/ProviderList$ServiceList$1;->next()Ljava/lang/Object;
-HSPLsun/security/jca/ProviderList$ServiceList$1;->next()Ljava/security/Provider$Service;
-HSPLsun/security/jca/ProviderList$ServiceList;->-$$Nest$mtryGet(Lsun/security/jca/ProviderList$ServiceList;I)Ljava/security/Provider$Service;
-HSPLsun/security/jca/ProviderList$ServiceList;-><init>(Lsun/security/jca/ProviderList;Ljava/lang/String;Ljava/lang/String;)V
-HSPLsun/security/jca/ProviderList$ServiceList;->addService(Ljava/security/Provider$Service;)V
-HSPLsun/security/jca/ProviderList$ServiceList;->iterator()Ljava/util/Iterator;
-HSPLsun/security/jca/ProviderList$ServiceList;->tryGet(I)Ljava/security/Provider$Service;
-HSPLsun/security/jca/ProviderList;->-$$Nest$fgetconfigs(Lsun/security/jca/ProviderList;)[Lsun/security/jca/ProviderConfig;
-HSPLsun/security/jca/ProviderList;-><init>([Lsun/security/jca/ProviderConfig;Z)V
-HSPLsun/security/jca/ProviderList;->getIndex(Ljava/lang/String;)I
-HSPLsun/security/jca/ProviderList;->getJarList([Ljava/lang/String;)Lsun/security/jca/ProviderList;
-HSPLsun/security/jca/ProviderList;->getProvider(I)Ljava/security/Provider;
-HSPLsun/security/jca/ProviderList;->getProvider(Ljava/lang/String;)Ljava/security/Provider;
-HSPLsun/security/jca/ProviderList;->getProviderConfig(Ljava/lang/String;)Lsun/security/jca/ProviderConfig;
-HSPLsun/security/jca/ProviderList;->getService(Ljava/lang/String;Ljava/lang/String;)Ljava/security/Provider$Service;
-HSPLsun/security/jca/ProviderList;->getServices(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
-HSPLsun/security/jca/ProviderList;->insertAt(Lsun/security/jca/ProviderList;Ljava/security/Provider;I)Lsun/security/jca/ProviderList;
-HSPLsun/security/jca/ProviderList;->loadAll()I
-HSPLsun/security/jca/ProviderList;->providers()Ljava/util/List;
-HSPLsun/security/jca/ProviderList;->removeInvalid()Lsun/security/jca/ProviderList;
-HSPLsun/security/jca/ProviderList;->toArray()[Ljava/security/Provider;
-HSPLsun/security/jca/Providers;->beginThreadProviderList(Lsun/security/jca/ProviderList;)Lsun/security/jca/ProviderList;
-HSPLsun/security/jca/Providers;->checkBouncyCastleDeprecation(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLsun/security/jca/Providers;->checkBouncyCastleDeprecation(Ljava/security/Provider;Ljava/lang/String;Ljava/lang/String;)V
-HSPLsun/security/jca/Providers;->endThreadProviderList(Lsun/security/jca/ProviderList;)V
-HSPLsun/security/jca/Providers;->getFullProviderList()Lsun/security/jca/ProviderList;
-HSPLsun/security/jca/Providers;->getProviderList()Lsun/security/jca/ProviderList;
-HSPLsun/security/jca/Providers;->getSystemProviderList()Lsun/security/jca/ProviderList;
-HSPLsun/security/jca/Providers;->getThreadProviderList()Lsun/security/jca/ProviderList;
-HSPLsun/security/jca/Providers;->setProviderList(Lsun/security/jca/ProviderList;)V
-HSPLsun/security/jca/Providers;->setSystemProviderList(Lsun/security/jca/ProviderList;)V
-HSPLsun/security/jca/Providers;->startJarVerification()Ljava/lang/Object;
-HSPLsun/security/jca/Providers;->stopJarVerification(Ljava/lang/Object;)V
-HSPLsun/security/pkcs/ContentInfo;-><init>(Lsun/security/util/DerInputStream;)V
-HSPLsun/security/pkcs/ContentInfo;-><init>(Lsun/security/util/DerInputStream;Z)V
-HSPLsun/security/pkcs/ContentInfo;->getContent()Lsun/security/util/DerValue;
-HSPLsun/security/pkcs/ContentInfo;->getData()[B
-HSPLsun/security/pkcs/PKCS7$VerbatimX509Certificate;-><init>(Ljava/security/cert/X509Certificate;[B)V
-HSPLsun/security/pkcs/PKCS7$WrappedX509Certificate;-><init>(Ljava/security/cert/X509Certificate;)V
-HSPLsun/security/pkcs/PKCS7$WrappedX509Certificate;->getIssuerDN()Ljava/security/Principal;
-HSPLsun/security/pkcs/PKCS7$WrappedX509Certificate;->getKeyUsage()[Z
-HSPLsun/security/pkcs/PKCS7$WrappedX509Certificate;->getPublicKey()Ljava/security/PublicKey;
-HSPLsun/security/pkcs/PKCS7$WrappedX509Certificate;->getSerialNumber()Ljava/math/BigInteger;
-HSPLsun/security/pkcs/PKCS7$WrappedX509Certificate;->getSubjectDN()Ljava/security/Principal;
-HSPLsun/security/pkcs/PKCS7$WrappedX509Certificate;->getTBSCertificate()[B
-HSPLsun/security/pkcs/PKCS7$WrappedX509Certificate;->hasUnsupportedCriticalExtension()Z
-HSPLsun/security/pkcs/PKCS7;-><init>([B)V
-HSPLsun/security/pkcs/PKCS7;->getCertificate(Ljava/math/BigInteger;Lsun/security/x509/X500Name;)Ljava/security/cert/X509Certificate;
-HSPLsun/security/pkcs/PKCS7;->getCertificates()[Ljava/security/cert/X509Certificate;
-HSPLsun/security/pkcs/PKCS7;->getContentInfo()Lsun/security/pkcs/ContentInfo;
-HSPLsun/security/pkcs/PKCS7;->parse(Lsun/security/util/DerInputStream;)V
-HSPLsun/security/pkcs/PKCS7;->parse(Lsun/security/util/DerInputStream;Z)V
-HSPLsun/security/pkcs/PKCS7;->parseSignedData(Lsun/security/util/DerValue;)V
-HSPLsun/security/pkcs/PKCS7;->populateCertIssuerNames()V
-HSPLsun/security/pkcs/PKCS7;->verify(Lsun/security/pkcs/SignerInfo;[B)Lsun/security/pkcs/SignerInfo;
-HSPLsun/security/pkcs/PKCS7;->verify([B)[Lsun/security/pkcs/SignerInfo;
-HSPLsun/security/pkcs/SignerInfo;-><init>(Lsun/security/util/DerInputStream;)V
-HSPLsun/security/pkcs/SignerInfo;-><init>(Lsun/security/util/DerInputStream;Z)V
-HSPLsun/security/pkcs/SignerInfo;->getCertificate(Lsun/security/pkcs/PKCS7;)Ljava/security/cert/X509Certificate;
-HSPLsun/security/pkcs/SignerInfo;->getCertificateChain(Lsun/security/pkcs/PKCS7;)Ljava/util/ArrayList;
-HSPLsun/security/pkcs/SignerInfo;->getDigestAlgorithmId()Lsun/security/x509/AlgorithmId;
-HSPLsun/security/pkcs/SignerInfo;->getDigestEncryptionAlgorithmId()Lsun/security/x509/AlgorithmId;
-HSPLsun/security/pkcs/SignerInfo;->getTimestamp()Ljava/security/Timestamp;
-HSPLsun/security/pkcs/SignerInfo;->getTsToken()Lsun/security/pkcs/PKCS7;
-HSPLsun/security/pkcs/SignerInfo;->verify(Lsun/security/pkcs/PKCS7;Ljava/io/InputStream;)Lsun/security/pkcs/SignerInfo;
-HSPLsun/security/pkcs/SignerInfo;->verify(Lsun/security/pkcs/PKCS7;[B)Lsun/security/pkcs/SignerInfo;
-HSPLsun/security/provider/X509Factory;->addToCache(Lsun/security/util/Cache;[BLjava/lang/Object;)V
-HSPLsun/security/provider/X509Factory;->getFromCache(Lsun/security/util/Cache;[B)Ljava/lang/Object;
-HSPLsun/security/provider/X509Factory;->intern(Ljava/security/cert/X509Certificate;)Lsun/security/x509/X509CertImpl;
-HSPLsun/security/provider/certpath/AdaptableX509CertSelector;-><init>()V
-HSPLsun/security/provider/certpath/AdaptableX509CertSelector;->match(Ljava/security/cert/Certificate;)Z
-HSPLsun/security/provider/certpath/AdaptableX509CertSelector;->matchSubjectKeyID(Ljava/security/cert/X509Certificate;)Z
-HSPLsun/security/provider/certpath/AdaptableX509CertSelector;->setSkiAndSerialNumber(Lsun/security/x509/AuthorityKeyIdentifierExtension;)V
-HSPLsun/security/provider/certpath/AlgorithmChecker;-><init>(Ljava/security/cert/TrustAnchor;)V
-HSPLsun/security/provider/certpath/AlgorithmChecker;-><init>(Ljava/security/cert/TrustAnchor;Ljava/security/AlgorithmConstraints;)V
-HSPLsun/security/provider/certpath/AlgorithmChecker;->check(Ljava/security/PublicKey;Lsun/security/x509/AlgorithmId;)V
-HSPLsun/security/provider/certpath/AlgorithmChecker;->check(Ljava/security/cert/Certificate;Ljava/util/Collection;)V
-HSPLsun/security/provider/certpath/AlgorithmChecker;->checkFingerprint(Ljava/security/cert/X509Certificate;)Z
-HSPLsun/security/provider/certpath/AlgorithmChecker;->init(Z)V
-HSPLsun/security/provider/certpath/BasicChecker;-><init>(Ljava/security/cert/TrustAnchor;Ljava/util/Date;Ljava/lang/String;Z)V
-HSPLsun/security/provider/certpath/BasicChecker;->check(Ljava/security/cert/Certificate;Ljava/util/Collection;)V
-HSPLsun/security/provider/certpath/BasicChecker;->getPublicKey()Ljava/security/PublicKey;
-HSPLsun/security/provider/certpath/BasicChecker;->init(Z)V
-HSPLsun/security/provider/certpath/BasicChecker;->updateState(Ljava/security/cert/X509Certificate;)V
-HSPLsun/security/provider/certpath/BasicChecker;->verifyNameChaining(Ljava/security/cert/X509Certificate;)V
-HSPLsun/security/provider/certpath/BasicChecker;->verifySignature(Ljava/security/cert/X509Certificate;)V
-HSPLsun/security/provider/certpath/BasicChecker;->verifyTimestamp(Ljava/security/cert/X509Certificate;)V
-HSPLsun/security/provider/certpath/CertId;-><init>(Ljava/security/cert/X509Certificate;Lsun/security/x509/SerialNumber;)V
-HSPLsun/security/provider/certpath/CertId;-><init>(Ljavax/security/auth/x500/X500Principal;Ljava/security/PublicKey;Lsun/security/x509/SerialNumber;)V
-HSPLsun/security/provider/certpath/CertId;-><init>(Lsun/security/util/DerInputStream;)V
-HSPLsun/security/provider/certpath/CertId;->equals(Ljava/lang/Object;)Z
-HSPLsun/security/provider/certpath/CertId;->getHashAlgorithm()Lsun/security/x509/AlgorithmId;
-HSPLsun/security/provider/certpath/CertId;->getIssuerKeyHash()[B
-HSPLsun/security/provider/certpath/CertId;->getIssuerNameHash()[B
-HSPLsun/security/provider/certpath/CertId;->getSerialNumber()Ljava/math/BigInteger;
-HSPLsun/security/provider/certpath/CertId;->hashCode()I
-HSPLsun/security/provider/certpath/ConstraintsChecker;-><init>(I)V
-HSPLsun/security/provider/certpath/ConstraintsChecker;->check(Ljava/security/cert/Certificate;Ljava/util/Collection;)V
-HSPLsun/security/provider/certpath/ConstraintsChecker;->checkBasicConstraints(Ljava/security/cert/X509Certificate;)V
-HSPLsun/security/provider/certpath/ConstraintsChecker;->init(Z)V
-HSPLsun/security/provider/certpath/ConstraintsChecker;->mergeNameConstraints(Ljava/security/cert/X509Certificate;Lsun/security/x509/NameConstraintsExtension;)Lsun/security/x509/NameConstraintsExtension;
-HSPLsun/security/provider/certpath/ConstraintsChecker;->verifyNameConstraints(Ljava/security/cert/X509Certificate;)V
-HSPLsun/security/provider/certpath/KeyChecker;-><init>(ILjava/security/cert/CertSelector;)V
-HSPLsun/security/provider/certpath/KeyChecker;->check(Ljava/security/cert/Certificate;Ljava/util/Collection;)V
-HSPLsun/security/provider/certpath/KeyChecker;->init(Z)V
-HSPLsun/security/provider/certpath/KeyChecker;->verifyCAKeyUsage(Ljava/security/cert/X509Certificate;)V
-HSPLsun/security/provider/certpath/OCSPResponse$SingleResponse;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/provider/certpath/OCSPResponse$SingleResponse;->getCertId()Lsun/security/provider/certpath/CertId;
-HSPLsun/security/provider/certpath/OCSPResponse$SingleResponse;->getCertStatus()Lsun/security/provider/certpath/OCSP$RevocationStatus$CertStatus;
-HSPLsun/security/provider/certpath/OCSPResponse;-><init>([B)V
-HSPLsun/security/provider/certpath/OCSPResponse;->getSingleResponse(Lsun/security/provider/certpath/CertId;)Lsun/security/provider/certpath/OCSPResponse$SingleResponse;
-HSPLsun/security/provider/certpath/OCSPResponse;->verify(Ljava/util/List;Ljava/security/cert/X509Certificate;Ljava/security/cert/X509Certificate;Ljava/util/Date;[B)V
-HSPLsun/security/provider/certpath/OCSPResponse;->verifySignature(Ljava/security/cert/X509Certificate;)Z
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;-><init>(Ljava/security/cert/CertPath;Ljava/security/cert/PKIXParameters;)V
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;-><init>(Ljava/security/cert/PKIXParameters;)V
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->anyPolicyInhibited()Z
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->certPath()Ljava/security/cert/CertPath;
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->certPathCheckers()Ljava/util/List;
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->certStores()Ljava/util/List;
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->certificates()Ljava/util/List;
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->date()Ljava/util/Date;
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->explicitPolicyRequired()Z
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->initialPolicies()Ljava/util/Set;
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->policyMappingInhibited()Z
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->policyQualifiersRejected()Z
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->revocationEnabled()Z
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->sigProvider()Ljava/lang/String;
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->targetCertConstraints()Ljava/security/cert/CertSelector;
-HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->trustAnchors()Ljava/util/Set;
-HSPLsun/security/provider/certpath/PKIX;->checkParams(Ljava/security/cert/CertPath;Ljava/security/cert/CertPathParameters;)Lsun/security/provider/certpath/PKIX$ValidatorParams;
-HSPLsun/security/provider/certpath/PKIX;->isDSAPublicKeyWithoutParams(Ljava/security/PublicKey;)Z
-HSPLsun/security/provider/certpath/PKIXCertPathValidator;-><init>()V
-HSPLsun/security/provider/certpath/PKIXCertPathValidator;->engineGetRevocationChecker()Ljava/security/cert/CertPathChecker;
-HSPLsun/security/provider/certpath/PKIXCertPathValidator;->engineValidate(Ljava/security/cert/CertPath;Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathValidatorResult;
-HSPLsun/security/provider/certpath/PKIXCertPathValidator;->validate(Ljava/security/cert/TrustAnchor;Lsun/security/provider/certpath/PKIX$ValidatorParams;)Ljava/security/cert/PKIXCertPathValidatorResult;
-HSPLsun/security/provider/certpath/PKIXCertPathValidator;->validate(Lsun/security/provider/certpath/PKIX$ValidatorParams;)Ljava/security/cert/PKIXCertPathValidatorResult;
-HSPLsun/security/provider/certpath/PKIXMasterCertPathValidator;->validate(Ljava/security/cert/CertPath;Ljava/util/List;Ljava/util/List;)V
-HSPLsun/security/provider/certpath/PolicyChecker;-><init>(Ljava/util/Set;IZZZZLsun/security/provider/certpath/PolicyNodeImpl;)V
-HSPLsun/security/provider/certpath/PolicyChecker;->check(Ljava/security/cert/Certificate;Ljava/util/Collection;)V
-HSPLsun/security/provider/certpath/PolicyChecker;->checkPolicy(Ljava/security/cert/X509Certificate;)V
-HSPLsun/security/provider/certpath/PolicyChecker;->getPolicyTree()Ljava/security/cert/PolicyNode;
-HSPLsun/security/provider/certpath/PolicyChecker;->init(Z)V
-HSPLsun/security/provider/certpath/PolicyChecker;->mergeExplicitPolicy(ILsun/security/x509/X509CertImpl;Z)I
-HSPLsun/security/provider/certpath/PolicyChecker;->mergeInhibitAnyPolicy(ILsun/security/x509/X509CertImpl;)I
-HSPLsun/security/provider/certpath/PolicyChecker;->mergePolicyMapping(ILsun/security/x509/X509CertImpl;)I
-HSPLsun/security/provider/certpath/PolicyChecker;->processParents(IZZLsun/security/provider/certpath/PolicyNodeImpl;Ljava/lang/String;Ljava/util/Set;Z)Z
-HSPLsun/security/provider/certpath/PolicyChecker;->processPolicies(ILjava/util/Set;IIIZLsun/security/provider/certpath/PolicyNodeImpl;Lsun/security/x509/X509CertImpl;Z)Lsun/security/provider/certpath/PolicyNodeImpl;
-HSPLsun/security/provider/certpath/PolicyChecker;->processPolicyMappings(Lsun/security/x509/X509CertImpl;IILsun/security/provider/certpath/PolicyNodeImpl;ZLjava/util/Set;)Lsun/security/provider/certpath/PolicyNodeImpl;
-HSPLsun/security/provider/certpath/PolicyNodeImpl;-><init>(Lsun/security/provider/certpath/PolicyNodeImpl;Ljava/lang/String;Ljava/util/Set;ZLjava/util/Set;Z)V
-HSPLsun/security/provider/certpath/PolicyNodeImpl;-><init>(Lsun/security/provider/certpath/PolicyNodeImpl;Lsun/security/provider/certpath/PolicyNodeImpl;)V
-HSPLsun/security/provider/certpath/PolicyNodeImpl;->addChild(Lsun/security/provider/certpath/PolicyNodeImpl;)V
-HSPLsun/security/provider/certpath/PolicyNodeImpl;->copyTree()Lsun/security/provider/certpath/PolicyNodeImpl;
-HSPLsun/security/provider/certpath/PolicyNodeImpl;->copyTree(Lsun/security/provider/certpath/PolicyNodeImpl;)Lsun/security/provider/certpath/PolicyNodeImpl;
-HSPLsun/security/provider/certpath/PolicyNodeImpl;->getChildren()Ljava/util/Iterator;
-HSPLsun/security/provider/certpath/PolicyNodeImpl;->getDepth()I
-HSPLsun/security/provider/certpath/PolicyNodeImpl;->getExpectedPolicies()Ljava/util/Set;
-HSPLsun/security/provider/certpath/PolicyNodeImpl;->getPolicyNodes(I)Ljava/util/Set;
-HSPLsun/security/provider/certpath/PolicyNodeImpl;->getPolicyNodes(ILjava/util/Set;)V
-HSPLsun/security/provider/certpath/PolicyNodeImpl;->getPolicyNodesExpected(ILjava/lang/String;Z)Ljava/util/Set;
-HSPLsun/security/provider/certpath/PolicyNodeImpl;->getPolicyNodesExpectedHelper(ILjava/lang/String;Z)Ljava/util/Set;
-HSPLsun/security/provider/certpath/PolicyNodeImpl;->getValidPolicy()Ljava/lang/String;
-HSPLsun/security/provider/certpath/PolicyNodeImpl;->prune(I)V
-HSPLsun/security/provider/certpath/PolicyNodeImpl;->setImmutable()V
-HSPLsun/security/provider/certpath/RevocationChecker$1;-><init>()V
-HSPLsun/security/provider/certpath/RevocationChecker$1;->run()Ljava/lang/Object;
-HSPLsun/security/provider/certpath/RevocationChecker$1;->run()Lsun/security/provider/certpath/RevocationChecker$RevocationProperties;
-HSPLsun/security/provider/certpath/RevocationChecker$RevocationProperties;-><init>()V
-HSPLsun/security/provider/certpath/RevocationChecker;-><init>()V
-HSPLsun/security/provider/certpath/RevocationChecker;->certCanSignCrl(Ljava/security/cert/X509Certificate;)Z
-HSPLsun/security/provider/certpath/RevocationChecker;->check(Ljava/security/cert/Certificate;Ljava/util/Collection;)V
-HSPLsun/security/provider/certpath/RevocationChecker;->check(Ljava/security/cert/X509Certificate;Ljava/util/Collection;Ljava/security/PublicKey;Z)V
-HSPLsun/security/provider/certpath/RevocationChecker;->checkOCSP(Ljava/security/cert/X509Certificate;Ljava/util/Collection;)V
-HSPLsun/security/provider/certpath/RevocationChecker;->clone()Ljava/lang/Object;
-HSPLsun/security/provider/certpath/RevocationChecker;->clone()Lsun/security/provider/certpath/RevocationChecker;
-HSPLsun/security/provider/certpath/RevocationChecker;->getResponderCert(Lsun/security/provider/certpath/RevocationChecker$RevocationProperties;Ljava/util/Set;Ljava/util/List;)Ljava/security/cert/X509Certificate;
-HSPLsun/security/provider/certpath/RevocationChecker;->getRevocationProperties()Lsun/security/provider/certpath/RevocationChecker$RevocationProperties;
-HSPLsun/security/provider/certpath/RevocationChecker;->init(Ljava/security/cert/TrustAnchor;Lsun/security/provider/certpath/PKIX$ValidatorParams;)V
-HSPLsun/security/provider/certpath/RevocationChecker;->init(Z)V
-HSPLsun/security/provider/certpath/RevocationChecker;->toURI(Ljava/lang/String;)Ljava/net/URI;
-HSPLsun/security/provider/certpath/RevocationChecker;->updateState(Ljava/security/cert/X509Certificate;)V
-HSPLsun/security/util/AbstractAlgorithmConstraints;->checkAlgorithm([Ljava/lang/String;Ljava/lang/String;Lsun/security/util/AlgorithmDecomposer;)Z
-HSPLsun/security/util/AlgorithmDecomposer;->decompose(Ljava/lang/String;)Ljava/util/Set;
-HSPLsun/security/util/AlgorithmDecomposer;->decomposeImpl(Ljava/lang/String;)Ljava/util/Set;
-HSPLsun/security/util/AlgorithmDecomposer;->decomposeOneHash(Ljava/lang/String;)Ljava/util/Set;
-HSPLsun/security/util/AlgorithmDecomposer;->hasLoop(Ljava/util/Set;Ljava/lang/String;Ljava/lang/String;)V
-HSPLsun/security/util/BitArray;-><init>(I[B)V
-HSPLsun/security/util/BitArray;-><init>(I[BI)V
-HSPLsun/security/util/BitArray;->get(I)Z
-HSPLsun/security/util/BitArray;->length()I
-HSPLsun/security/util/BitArray;->position(I)I
-HSPLsun/security/util/BitArray;->subscript(I)I
-HSPLsun/security/util/BitArray;->toBooleanArray()[Z
-HSPLsun/security/util/BitArray;->toByteArray()[B
-HSPLsun/security/util/Cache$EqualByteArray;-><init>([B)V
-HSPLsun/security/util/Cache$EqualByteArray;->equals(Ljava/lang/Object;)Z
-HSPLsun/security/util/Cache$EqualByteArray;->hashCode()I
-HSPLsun/security/util/CertConstraintParameters;-><init>(Ljava/security/cert/X509Certificate;Z)V
-HSPLsun/security/util/CertConstraintParameters;->getCertificate()Ljava/security/cert/X509Certificate;
-HSPLsun/security/util/DerIndefLenConverter;->isIndefinite(I)Z
-HSPLsun/security/util/DerIndefLenConverter;->isLongForm(I)Z
-HSPLsun/security/util/DerInputBuffer;-><init>([B)V
-HSPLsun/security/util/DerInputBuffer;-><init>([BII)V
-HSPLsun/security/util/DerInputBuffer;->dup()Lsun/security/util/DerInputBuffer;
-HSPLsun/security/util/DerInputBuffer;->getBigInteger(IZ)Ljava/math/BigInteger;
-HSPLsun/security/util/DerInputBuffer;->getBitString()[B
-HSPLsun/security/util/DerInputBuffer;->getBitString(I)[B
-HSPLsun/security/util/DerInputBuffer;->getGeneralizedTime(I)Ljava/util/Date;
-HSPLsun/security/util/DerInputBuffer;->getInteger(I)I
-HSPLsun/security/util/DerInputBuffer;->getPos()I
-HSPLsun/security/util/DerInputBuffer;->getSlice(II)[B
-HSPLsun/security/util/DerInputBuffer;->getTime(IZ)Ljava/util/Date;
-HSPLsun/security/util/DerInputBuffer;->getUTCTime(I)Ljava/util/Date;
-HSPLsun/security/util/DerInputBuffer;->getUnalignedBitString()Lsun/security/util/BitArray;
-HSPLsun/security/util/DerInputBuffer;->peek()I
-HSPLsun/security/util/DerInputBuffer;->toByteArray()[B
-HSPLsun/security/util/DerInputBuffer;->truncate(I)V
-HSPLsun/security/util/DerInputStream;-><init>(Lsun/security/util/DerInputBuffer;)V
-HSPLsun/security/util/DerInputStream;-><init>([B)V
-HSPLsun/security/util/DerInputStream;->available()I
-HSPLsun/security/util/DerInputStream;->getBigInteger()Ljava/math/BigInteger;
-HSPLsun/security/util/DerInputStream;->getByte()I
-HSPLsun/security/util/DerInputStream;->getBytes([B)V
-HSPLsun/security/util/DerInputStream;->getDerValue()Lsun/security/util/DerValue;
-HSPLsun/security/util/DerInputStream;->getEnumerated()I
-HSPLsun/security/util/DerInputStream;->getGeneralizedTime()Ljava/util/Date;
-HSPLsun/security/util/DerInputStream;->getLength()I
-HSPLsun/security/util/DerInputStream;->getLength(ILjava/io/InputStream;)I
-HSPLsun/security/util/DerInputStream;->getLength(Ljava/io/InputStream;)I
-HSPLsun/security/util/DerInputStream;->getOID()Lsun/security/util/ObjectIdentifier;
-HSPLsun/security/util/DerInputStream;->getOctetString()[B
-HSPLsun/security/util/DerInputStream;->getSequence(I)[Lsun/security/util/DerValue;
-HSPLsun/security/util/DerInputStream;->getSequence(IZ)[Lsun/security/util/DerValue;
-HSPLsun/security/util/DerInputStream;->getSet(I)[Lsun/security/util/DerValue;
-HSPLsun/security/util/DerInputStream;->getSet(IZ)[Lsun/security/util/DerValue;
-HSPLsun/security/util/DerInputStream;->getSet(IZZ)[Lsun/security/util/DerValue;
-HSPLsun/security/util/DerInputStream;->getUTCTime()Ljava/util/Date;
-HSPLsun/security/util/DerInputStream;->getUnalignedBitString()Lsun/security/util/BitArray;
-HSPLsun/security/util/DerInputStream;->init([BIIZ)V
-HSPLsun/security/util/DerInputStream;->mark(I)V
-HSPLsun/security/util/DerInputStream;->peekByte()I
-HSPLsun/security/util/DerInputStream;->readVector(I)[Lsun/security/util/DerValue;
-HSPLsun/security/util/DerInputStream;->readVector(IZ)[Lsun/security/util/DerValue;
-HSPLsun/security/util/DerInputStream;->reset()V
-HSPLsun/security/util/DerInputStream;->subStream(IZ)Lsun/security/util/DerInputStream;
-HSPLsun/security/util/DerInputStream;->toByteArray()[B
-HSPLsun/security/util/DerOutputStream;-><init>()V
-HSPLsun/security/util/DerOutputStream;->putDerValue(Lsun/security/util/DerValue;)V
-HSPLsun/security/util/DerOutputStream;->putLength(I)V
-HSPLsun/security/util/DerOutputStream;->putNull()V
-HSPLsun/security/util/DerOutputStream;->putOID(Lsun/security/util/ObjectIdentifier;)V
-HSPLsun/security/util/DerOutputStream;->putOctetString([B)V
-HSPLsun/security/util/DerOutputStream;->putOrderedSet(B[Lsun/security/util/DerEncoder;Ljava/util/Comparator;)V
-HSPLsun/security/util/DerOutputStream;->putOrderedSetOf(B[Lsun/security/util/DerEncoder;)V
-HSPLsun/security/util/DerOutputStream;->putUnalignedBitString(Lsun/security/util/BitArray;)V
-HSPLsun/security/util/DerOutputStream;->write(BLsun/security/util/DerOutputStream;)V
-HSPLsun/security/util/DerOutputStream;->write(B[B)V
-HSPLsun/security/util/DerValue;-><init>(B[B)V
-HSPLsun/security/util/DerValue;-><init>(Ljava/io/InputStream;)V
-HSPLsun/security/util/DerValue;-><init>(Ljava/lang/String;)V
-HSPLsun/security/util/DerValue;-><init>(Lsun/security/util/DerInputBuffer;Z)V
-HSPLsun/security/util/DerValue;-><init>([B)V
-HSPLsun/security/util/DerValue;->encode(Lsun/security/util/DerOutputStream;)V
-HSPLsun/security/util/DerValue;->getBigInteger()Ljava/math/BigInteger;
-HSPLsun/security/util/DerValue;->getBitString()[B
-HSPLsun/security/util/DerValue;->getBoolean()Z
-HSPLsun/security/util/DerValue;->getData()Lsun/security/util/DerInputStream;
-HSPLsun/security/util/DerValue;->getDataBytes()[B
-HSPLsun/security/util/DerValue;->getIA5String()Ljava/lang/String;
-HSPLsun/security/util/DerValue;->getInteger()I
-HSPLsun/security/util/DerValue;->getOID()Lsun/security/util/ObjectIdentifier;
-HSPLsun/security/util/DerValue;->getOctetString()[B
-HSPLsun/security/util/DerValue;->getOriginalEncodedForm()[B
-HSPLsun/security/util/DerValue;->getTag()B
-HSPLsun/security/util/DerValue;->getUnalignedBitString()Lsun/security/util/BitArray;
-HSPLsun/security/util/DerValue;->init(BLjava/lang/String;)Lsun/security/util/DerInputStream;
-HSPLsun/security/util/DerValue;->init(ZLjava/io/InputStream;)Lsun/security/util/DerInputStream;
-HSPLsun/security/util/DerValue;->isConstructed()Z
-HSPLsun/security/util/DerValue;->isContextSpecific()Z
-HSPLsun/security/util/DerValue;->isContextSpecific(B)Z
-HSPLsun/security/util/DerValue;->isPrintableStringChar(C)Z
-HSPLsun/security/util/DerValue;->length()I
-HSPLsun/security/util/DerValue;->resetTag(B)V
-HSPLsun/security/util/DerValue;->toByteArray()[B
-HSPLsun/security/util/DerValue;->toDerInputStream()Lsun/security/util/DerInputStream;
-HPLsun/security/util/DisabledAlgorithmConstraints$Constraints;-><init>([Ljava/lang/String;)V
-HSPLsun/security/util/DisabledAlgorithmConstraints$Constraints;->getConstraints(Ljava/lang/String;)Ljava/util/Set;
-HSPLsun/security/util/DisabledAlgorithmConstraints$Constraints;->permits(Ljava/security/Key;)Z
-HSPLsun/security/util/DisabledAlgorithmConstraints$Constraints;->permits(Lsun/security/util/CertConstraintParameters;)V
-HSPLsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint;->permits(Ljava/security/Key;)Z
-HSPLsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint;->permits(Lsun/security/util/CertConstraintParameters;)V
-HSPLsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint;->permitsImpl(Ljava/security/Key;)Z
-HSPLsun/security/util/DisabledAlgorithmConstraints;->checkConstraints(Ljava/util/Set;Ljava/lang/String;Ljava/security/Key;Ljava/security/AlgorithmParameters;)Z
-HSPLsun/security/util/DisabledAlgorithmConstraints;->checkConstraints(Ljava/util/Set;Lsun/security/util/CertConstraintParameters;)V
-HSPLsun/security/util/DisabledAlgorithmConstraints;->permits(Ljava/util/Set;Ljava/lang/String;Ljava/security/AlgorithmParameters;)Z
-HSPLsun/security/util/DisabledAlgorithmConstraints;->permits(Ljava/util/Set;Ljava/lang/String;Ljava/security/Key;Ljava/security/AlgorithmParameters;)Z
-HSPLsun/security/util/DisabledAlgorithmConstraints;->permits(Ljava/util/Set;Ljava/security/Key;)Z
-HSPLsun/security/util/DisabledAlgorithmConstraints;->permits(Ljava/util/Set;Lsun/security/util/CertConstraintParameters;)V
-HSPLsun/security/util/KeyUtil;->getKeySize(Ljava/security/Key;)I
-HSPLsun/security/util/ManifestDigester$Entry;-><init>(III[B)V
-HSPLsun/security/util/ManifestDigester$Position;-><init>()V
-HSPLsun/security/util/ManifestDigester;-><init>([B)V
-HSPLsun/security/util/ManifestDigester;->findSection(ILsun/security/util/ManifestDigester$Position;)Z
-HSPLsun/security/util/ManifestDigester;->isNameAttr([BI)Z
-HSPLsun/security/util/ManifestDigester;->manifestDigest(Ljava/security/MessageDigest;)[B
-HSPLsun/security/util/ManifestEntryVerifier;-><init>(Ljava/util/jar/Manifest;)V
-HSPLsun/security/util/ManifestEntryVerifier;->getEntry()Ljava/util/jar/JarEntry;
-HSPLsun/security/util/ManifestEntryVerifier;->setEntry(Ljava/lang/String;Ljava/util/jar/JarEntry;)V
-HSPLsun/security/util/ManifestEntryVerifier;->update(B)V
-HSPLsun/security/util/ManifestEntryVerifier;->update([BII)V
-HSPLsun/security/util/ManifestEntryVerifier;->verify(Ljava/util/Hashtable;Ljava/util/Hashtable;)[Ljava/security/CodeSigner;
-HSPLsun/security/util/MemoryCache$SoftCacheEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;JLjava/lang/ref/ReferenceQueue;)V
-HSPLsun/security/util/MemoryCache$SoftCacheEntry;->getValue()Ljava/lang/Object;
-HSPLsun/security/util/MemoryCache$SoftCacheEntry;->isValid(J)Z
-HSPLsun/security/util/MemoryCache;->emptyQueue()V
-HSPLsun/security/util/MemoryCache;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLsun/security/util/MemoryCache;->newEntry(Ljava/lang/Object;Ljava/lang/Object;JLjava/lang/ref/ReferenceQueue;)Lsun/security/util/MemoryCache$CacheEntry;
-HSPLsun/security/util/MemoryCache;->put(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLsun/security/util/ObjectIdentifier;-><init>(Lsun/security/util/DerInputBuffer;)V
-HSPLsun/security/util/ObjectIdentifier;-><init>(Lsun/security/util/DerInputStream;)V
-HSPLsun/security/util/ObjectIdentifier;->check([B)V
-HSPLsun/security/util/ObjectIdentifier;->encode(Lsun/security/util/DerOutputStream;)V
-HSPLsun/security/util/ObjectIdentifier;->equals(Ljava/lang/Object;)Z
-HSPLsun/security/util/ObjectIdentifier;->hashCode()I
-HSPLsun/security/util/ObjectIdentifier;->toString()Ljava/lang/String;
-HSPLsun/security/util/SignatureFileVerifier;-><init>(Ljava/util/ArrayList;Lsun/security/util/ManifestDigester;Ljava/lang/String;[B)V
-HSPLsun/security/util/SignatureFileVerifier;->getDigest(Ljava/lang/String;)Ljava/security/MessageDigest;
-HSPLsun/security/util/SignatureFileVerifier;->getSigners([Lsun/security/pkcs/SignerInfo;Lsun/security/pkcs/PKCS7;)[Ljava/security/CodeSigner;
-HSPLsun/security/util/SignatureFileVerifier;->isBlockOrSF(Ljava/lang/String;)Z
-HSPLsun/security/util/SignatureFileVerifier;->matches([Ljava/security/CodeSigner;[Ljava/security/CodeSigner;[Ljava/security/CodeSigner;)Z
-HSPLsun/security/util/SignatureFileVerifier;->needSignatureFileBytes()Z
-HSPLsun/security/util/SignatureFileVerifier;->process(Ljava/util/Hashtable;Ljava/util/List;)V
-HSPLsun/security/util/SignatureFileVerifier;->processImpl(Ljava/util/Hashtable;Ljava/util/List;)V
-HSPLsun/security/util/SignatureFileVerifier;->setSignatureFile([B)V
-HSPLsun/security/util/SignatureFileVerifier;->updateSigners([Ljava/security/CodeSigner;Ljava/util/Hashtable;Ljava/lang/String;)V
-HSPLsun/security/util/SignatureFileVerifier;->verifyManifestHash(Ljava/util/jar/Manifest;Lsun/security/util/ManifestDigester;Ljava/util/List;)Z
-HSPLsun/security/x509/AVA;-><init>(Ljava/io/Reader;ILjava/util/Map;)V
-HSPLsun/security/x509/AVA;-><init>(Ljava/io/Reader;Ljava/util/Map;)V
-HSPLsun/security/x509/AVA;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/AVA;->derEncode(Ljava/io/OutputStream;)V
-HSPLsun/security/x509/AVA;->isDerString(Lsun/security/util/DerValue;Z)Z
-HSPLsun/security/x509/AVA;->isTerminator(II)Z
-HSPLsun/security/x509/AVA;->parseString(Ljava/io/Reader;IILjava/lang/StringBuilder;)Lsun/security/util/DerValue;
-HSPLsun/security/x509/AVA;->readChar(Ljava/io/Reader;Ljava/lang/String;)I
-HSPLsun/security/x509/AVA;->toKeyword(ILjava/util/Map;)Ljava/lang/String;
-HSPLsun/security/x509/AVA;->toRFC2253CanonicalString()Ljava/lang/String;
-HSPLsun/security/x509/AVA;->toRFC2253String(Ljava/util/Map;)Ljava/lang/String;
-HSPLsun/security/x509/AVAKeyword;->getKeyword(Lsun/security/util/ObjectIdentifier;ILjava/util/Map;)Ljava/lang/String;
-HSPLsun/security/x509/AVAKeyword;->getOID(Ljava/lang/String;ILjava/util/Map;)Lsun/security/util/ObjectIdentifier;
-HSPLsun/security/x509/AVAKeyword;->isCompliant(I)Z
-HSPLsun/security/x509/AccessDescription;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/AlgorithmId;-><init>(Lsun/security/util/ObjectIdentifier;Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/AlgorithmId;->decodeParams()V
-HSPLsun/security/x509/AlgorithmId;->derEncode(Ljava/io/OutputStream;)V
-HSPLsun/security/x509/AlgorithmId;->encode(Lsun/security/util/DerOutputStream;)V
-HSPLsun/security/x509/AlgorithmId;->equals(Lsun/security/x509/AlgorithmId;)Z
-HSPLsun/security/x509/AlgorithmId;->getEncAlgFromSigAlg(Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/security/x509/AlgorithmId;->getName()Ljava/lang/String;
-HSPLsun/security/x509/AlgorithmId;->getParameters()Ljava/security/AlgorithmParameters;
-HSPLsun/security/x509/AlgorithmId;->hashCode()I
-HSPLsun/security/x509/AlgorithmId;->makeSigAlg(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/security/x509/AlgorithmId;->paramsToString()Ljava/lang/String;
-HSPLsun/security/x509/AlgorithmId;->parse(Lsun/security/util/DerValue;)Lsun/security/x509/AlgorithmId;
-HSPLsun/security/x509/AuthorityInfoAccessExtension;-><init>(Ljava/lang/Boolean;Ljava/lang/Object;)V
-HSPLsun/security/x509/AuthorityInfoAccessExtension;->getName()Ljava/lang/String;
-HSPLsun/security/x509/AuthorityKeyIdentifierExtension;-><init>(Ljava/lang/Boolean;Ljava/lang/Object;)V
-HSPLsun/security/x509/AuthorityKeyIdentifierExtension;->get(Ljava/lang/String;)Ljava/lang/Object;
-HSPLsun/security/x509/AuthorityKeyIdentifierExtension;->getEncodedKeyIdentifier()[B
-HSPLsun/security/x509/AuthorityKeyIdentifierExtension;->getName()Ljava/lang/String;
-HSPLsun/security/x509/BasicConstraintsExtension;-><init>(Ljava/lang/Boolean;Ljava/lang/Object;)V
-HSPLsun/security/x509/BasicConstraintsExtension;->getName()Ljava/lang/String;
-HSPLsun/security/x509/CRLDistributionPointsExtension;-><init>(Ljava/lang/Boolean;Ljava/lang/Object;)V
-HSPLsun/security/x509/CRLDistributionPointsExtension;-><init>(Lsun/security/util/ObjectIdentifier;Ljava/lang/Boolean;Ljava/lang/Object;Ljava/lang/String;)V
-HSPLsun/security/x509/CRLDistributionPointsExtension;->getName()Ljava/lang/String;
-HSPLsun/security/x509/CertificateAlgorithmId;-><init>(Lsun/security/util/DerInputStream;)V
-HSPLsun/security/x509/CertificateAlgorithmId;->get(Ljava/lang/String;)Lsun/security/x509/AlgorithmId;
-HSPLsun/security/x509/CertificateExtensions;-><init>(Lsun/security/util/DerInputStream;)V
-HSPLsun/security/x509/CertificateExtensions;->get(Ljava/lang/String;)Lsun/security/x509/Extension;
-HSPLsun/security/x509/CertificateExtensions;->getAllExtensions()Ljava/util/Collection;
-HSPLsun/security/x509/CertificateExtensions;->getExtension(Ljava/lang/String;)Lsun/security/x509/Extension;
-HSPLsun/security/x509/CertificateExtensions;->init(Lsun/security/util/DerInputStream;)V
-HSPLsun/security/x509/CertificateExtensions;->parseExtension(Lsun/security/x509/Extension;)V
-HSPLsun/security/x509/CertificatePoliciesExtension;-><init>(Ljava/lang/Boolean;Ljava/lang/Object;)V
-HSPLsun/security/x509/CertificatePoliciesExtension;->get(Ljava/lang/String;)Ljava/util/List;
-HSPLsun/security/x509/CertificatePoliciesExtension;->getName()Ljava/lang/String;
-HSPLsun/security/x509/CertificatePolicyId;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/CertificatePolicyId;->getIdentifier()Lsun/security/util/ObjectIdentifier;
-HSPLsun/security/x509/CertificateSerialNumber;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/CertificateSerialNumber;->get(Ljava/lang/String;)Lsun/security/x509/SerialNumber;
-HSPLsun/security/x509/CertificateValidity;-><init>(Lsun/security/util/DerInputStream;)V
-HSPLsun/security/x509/CertificateValidity;->construct(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/CertificateValidity;->valid(Ljava/util/Date;)V
-HSPLsun/security/x509/CertificateVersion;-><init>()V
-HSPLsun/security/x509/CertificateVersion;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/CertificateVersion;->compare(I)I
-HSPLsun/security/x509/CertificateVersion;->construct(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/CertificateX509Key;-><init>(Lsun/security/util/DerInputStream;)V
-HSPLsun/security/x509/CertificateX509Key;->get(Ljava/lang/String;)Ljava/security/PublicKey;
-HSPLsun/security/x509/DNSName;-><init>(Ljava/lang/String;)V
-HSPLsun/security/x509/DNSName;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/DistributionPoint;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/ExtendedKeyUsageExtension;-><init>(Ljava/lang/Boolean;Ljava/lang/Object;)V
-HSPLsun/security/x509/ExtendedKeyUsageExtension;->getExtendedKeyUsage()Ljava/util/List;
-HSPLsun/security/x509/ExtendedKeyUsageExtension;->getName()Ljava/lang/String;
-HSPLsun/security/x509/Extension;-><init>()V
-HSPLsun/security/x509/Extension;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/Extension;->getExtensionId()Lsun/security/util/ObjectIdentifier;
-HSPLsun/security/x509/Extension;->getExtensionValue()[B
-HSPLsun/security/x509/Extension;->isCritical()Z
-HSPLsun/security/x509/GeneralName;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/GeneralName;-><init>(Lsun/security/util/DerValue;Z)V
-HSPLsun/security/x509/GeneralNames;-><init>()V
-HSPLsun/security/x509/GeneralNames;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/GeneralNames;->add(Lsun/security/x509/GeneralName;)Lsun/security/x509/GeneralNames;
-HSPLsun/security/x509/KeyIdentifier;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/KeyIdentifier;-><init>([B)V
-HSPLsun/security/x509/KeyIdentifier;->encode(Lsun/security/util/DerOutputStream;)V
-HSPLsun/security/x509/KeyIdentifier;->equals(Ljava/lang/Object;)Z
-HSPLsun/security/x509/KeyUsageExtension;-><init>(Ljava/lang/Boolean;Ljava/lang/Object;)V
-HSPLsun/security/x509/KeyUsageExtension;->getBits()[Z
-HSPLsun/security/x509/KeyUsageExtension;->getName()Ljava/lang/String;
-HSPLsun/security/x509/OCSPNoCheckExtension;-><init>(Ljava/lang/Boolean;Ljava/lang/Object;)V
-HSPLsun/security/x509/OCSPNoCheckExtension;->getName()Ljava/lang/String;
-HSPLsun/security/x509/OIDMap$OIDInfo;->getClazz()Ljava/lang/Class;
-HSPLsun/security/x509/OIDMap;->getClass(Lsun/security/util/ObjectIdentifier;)Ljava/lang/Class;
-HSPLsun/security/x509/OIDMap;->getName(Lsun/security/util/ObjectIdentifier;)Ljava/lang/String;
-HSPLsun/security/x509/PolicyInformation;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/PolicyInformation;->getPolicyIdentifier()Lsun/security/x509/CertificatePolicyId;
-HSPLsun/security/x509/PolicyInformation;->getPolicyQualifiers()Ljava/util/Set;
-HSPLsun/security/x509/RDN;-><init>(Ljava/lang/String;Ljava/util/Map;)V
-HSPLsun/security/x509/RDN;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/RDN;->encode(Lsun/security/util/DerOutputStream;)V
-HSPLsun/security/x509/RDN;->toRFC2253String(Ljava/util/Map;)Ljava/lang/String;
-HSPLsun/security/x509/RDN;->toRFC2253String(Z)Ljava/lang/String;
-HSPLsun/security/x509/RDN;->toRFC2253StringInternal(ZLjava/util/Map;)Ljava/lang/String;
-HSPLsun/security/x509/SerialNumber;-><init>(Lsun/security/util/DerInputStream;)V
-HSPLsun/security/x509/SerialNumber;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/SerialNumber;->construct(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/SerialNumber;->getNumber()Ljava/math/BigInteger;
-HSPLsun/security/x509/SubjectAlternativeNameExtension;-><init>(Ljava/lang/Boolean;Ljava/lang/Object;)V
-HSPLsun/security/x509/SubjectAlternativeNameExtension;->getName()Ljava/lang/String;
-HSPLsun/security/x509/SubjectKeyIdentifierExtension;-><init>(Ljava/lang/Boolean;Ljava/lang/Object;)V
-HSPLsun/security/x509/SubjectKeyIdentifierExtension;->get(Ljava/lang/String;)Lsun/security/x509/KeyIdentifier;
-HSPLsun/security/x509/SubjectKeyIdentifierExtension;->getName()Ljava/lang/String;
-HSPLsun/security/x509/URIName;-><init>(Ljava/lang/String;)V
-HSPLsun/security/x509/URIName;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/X500Name;-><init>(Ljava/lang/String;Ljava/util/Map;)V
-HSPLsun/security/x509/X500Name;-><init>(Lsun/security/util/DerInputStream;)V
-HSPLsun/security/x509/X500Name;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/X500Name;-><init>([B)V
-HSPLsun/security/x509/X500Name;->asX500Name(Ljavax/security/auth/x500/X500Principal;)Lsun/security/x509/X500Name;
-HSPLsun/security/x509/X500Name;->asX500Principal()Ljavax/security/auth/x500/X500Principal;
-HSPLsun/security/x509/X500Name;->checkNoNewLinesNorTabsAtBeginningOfDN(Ljava/lang/String;)V
-HSPLsun/security/x509/X500Name;->countQuotes(Ljava/lang/String;II)I
-HSPLsun/security/x509/X500Name;->equals(Ljava/lang/Object;)Z
-HSPLsun/security/x509/X500Name;->escaped(IILjava/lang/String;)Z
-HSPLsun/security/x509/X500Name;->generateRFC2253DN(Ljava/util/Map;)Ljava/lang/String;
-HSPLsun/security/x509/X500Name;->getEncoded()[B
-HSPLsun/security/x509/X500Name;->getEncodedInternal()[B
-HSPLsun/security/x509/X500Name;->getRFC2253CanonicalName()Ljava/lang/String;
-HSPLsun/security/x509/X500Name;->getRFC2253Name()Ljava/lang/String;
-HSPLsun/security/x509/X500Name;->getRFC2253Name(Ljava/util/Map;)Ljava/lang/String;
-HSPLsun/security/x509/X500Name;->hashCode()I
-HSPLsun/security/x509/X500Name;->intern(Lsun/security/util/ObjectIdentifier;)Lsun/security/util/ObjectIdentifier;
-HSPLsun/security/x509/X500Name;->isEmpty()Z
-HSPLsun/security/x509/X500Name;->parseDER(Lsun/security/util/DerInputStream;)V
-HSPLsun/security/x509/X500Name;->parseDN(Ljava/lang/String;Ljava/util/Map;)V
-HSPLsun/security/x509/X509AttributeName;-><init>(Ljava/lang/String;)V
-HSPLsun/security/x509/X509AttributeName;->getPrefix()Ljava/lang/String;
-HSPLsun/security/x509/X509AttributeName;->getSuffix()Ljava/lang/String;
-HSPLsun/security/x509/X509CertImpl;-><init>([B)V
-HSPLsun/security/x509/X509CertImpl;->checkValidity(Ljava/util/Date;)V
-HSPLsun/security/x509/X509CertImpl;->get(Ljava/lang/String;)Ljava/lang/Object;
-HSPLsun/security/x509/X509CertImpl;->getAuthorityKeyIdentifierExtension()Lsun/security/x509/AuthorityKeyIdentifierExtension;
-HSPLsun/security/x509/X509CertImpl;->getCertificatePoliciesExtension()Lsun/security/x509/CertificatePoliciesExtension;
-HSPLsun/security/x509/X509CertImpl;->getEncodedInternal()[B
-HSPLsun/security/x509/X509CertImpl;->getEncodedInternal(Ljava/security/cert/Certificate;)[B
-HSPLsun/security/x509/X509CertImpl;->getExtendedKeyUsage()Ljava/util/List;
-HSPLsun/security/x509/X509CertImpl;->getExtendedKeyUsageExtension()Lsun/security/x509/ExtendedKeyUsageExtension;
-HSPLsun/security/x509/X509CertImpl;->getExtension(Lsun/security/util/ObjectIdentifier;)Lsun/security/x509/Extension;
-HSPLsun/security/x509/X509CertImpl;->getIssuerX500Principal()Ljavax/security/auth/x500/X500Principal;
-HSPLsun/security/x509/X509CertImpl;->getKeyUsage()[Z
-HSPLsun/security/x509/X509CertImpl;->getNameConstraintsExtension()Lsun/security/x509/NameConstraintsExtension;
-HSPLsun/security/x509/X509CertImpl;->getPolicyConstraintsExtension()Lsun/security/x509/PolicyConstraintsExtension;
-HSPLsun/security/x509/X509CertImpl;->getPolicyMappingsExtension()Lsun/security/x509/PolicyMappingsExtension;
-HSPLsun/security/x509/X509CertImpl;->getPublicKey()Ljava/security/PublicKey;
-HSPLsun/security/x509/X509CertImpl;->getSerialNumberObject()Lsun/security/x509/SerialNumber;
-HSPLsun/security/x509/X509CertImpl;->getSigAlgName()Ljava/lang/String;
-HSPLsun/security/x509/X509CertImpl;->getSubjectKeyId()Lsun/security/x509/KeyIdentifier;
-HSPLsun/security/x509/X509CertImpl;->getSubjectKeyIdentifierExtension()Lsun/security/x509/SubjectKeyIdentifierExtension;
-HSPLsun/security/x509/X509CertImpl;->getSubjectX500Principal()Ljavax/security/auth/x500/X500Principal;
-HSPLsun/security/x509/X509CertImpl;->isSelfIssued(Ljava/security/cert/X509Certificate;)Z
-HSPLsun/security/x509/X509CertImpl;->parse(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/X509CertImpl;->parse(Lsun/security/util/DerValue;[B)V
-HSPLsun/security/x509/X509CertImpl;->toImpl(Ljava/security/cert/X509Certificate;)Lsun/security/x509/X509CertImpl;
-HSPLsun/security/x509/X509CertImpl;->verify(Ljava/security/PublicKey;)V
-HSPLsun/security/x509/X509CertImpl;->verify(Ljava/security/PublicKey;Ljava/lang/String;)V
-HSPLsun/security/x509/X509CertInfo;-><init>(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/X509CertInfo;-><init>([B)V
-HSPLsun/security/x509/X509CertInfo;->attributeMap(Ljava/lang/String;)I
-HSPLsun/security/x509/X509CertInfo;->get(Ljava/lang/String;)Ljava/lang/Object;
-HSPLsun/security/x509/X509CertInfo;->getEncodedInfo()[B
-HSPLsun/security/x509/X509CertInfo;->getX500Name(Ljava/lang/String;Z)Ljava/lang/Object;
-HSPLsun/security/x509/X509CertInfo;->parse(Lsun/security/util/DerValue;)V
-HSPLsun/security/x509/X509CertInfo;->verifyCert(Lsun/security/x509/X500Name;Lsun/security/x509/CertificateExtensions;)V
-HSPLsun/security/x509/X509Key;->buildX509Key(Lsun/security/x509/AlgorithmId;Lsun/security/util/BitArray;)Ljava/security/PublicKey;
-HSPLsun/security/x509/X509Key;->encode(Lsun/security/util/DerOutputStream;Lsun/security/x509/AlgorithmId;Lsun/security/util/BitArray;)V
-HSPLsun/security/x509/X509Key;->parse(Lsun/security/util/DerValue;)Ljava/security/PublicKey;
-HSPLsun/util/calendar/AbstractCalendar;-><init>()V
-HSPLsun/util/calendar/AbstractCalendar;->getCalendarDate(JLsun/util/calendar/CalendarDate;)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/AbstractCalendar;->getDayOfWeekDateOnOrBefore(JI)J
-HSPLsun/util/calendar/AbstractCalendar;->getEras()[Lsun/util/calendar/Era;
-HSPLsun/util/calendar/AbstractCalendar;->getTime(Lsun/util/calendar/CalendarDate;)J
-HSPLsun/util/calendar/AbstractCalendar;->getTimeOfDay(Lsun/util/calendar/CalendarDate;)J
-HSPLsun/util/calendar/AbstractCalendar;->getTimeOfDayValue(Lsun/util/calendar/CalendarDate;)J
-HSPLsun/util/calendar/AbstractCalendar;->setEras([Lsun/util/calendar/Era;)V
-HSPLsun/util/calendar/AbstractCalendar;->setTimeOfDay(Lsun/util/calendar/CalendarDate;I)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/BaseCalendar$Date;-><init>(Ljava/util/TimeZone;)V
-HSPLsun/util/calendar/BaseCalendar$Date;->getCachedJan1()J
-HSPLsun/util/calendar/BaseCalendar$Date;->getCachedYear()I
-HSPLsun/util/calendar/BaseCalendar$Date;->hit(I)Z
-HSPLsun/util/calendar/BaseCalendar$Date;->hit(J)Z
-HSPLsun/util/calendar/BaseCalendar$Date;->setCache(IJI)V
-HSPLsun/util/calendar/BaseCalendar;-><init>()V
-HSPLsun/util/calendar/BaseCalendar;->getCalendarDateFromFixedDate(Lsun/util/calendar/CalendarDate;J)V
-HSPLsun/util/calendar/BaseCalendar;->getDayOfWeekFromFixedDate(J)I
-HSPLsun/util/calendar/BaseCalendar;->getDayOfYear(III)J
-HSPLsun/util/calendar/BaseCalendar;->getFixedDate(IIILsun/util/calendar/BaseCalendar$Date;)J
-HSPLsun/util/calendar/BaseCalendar;->getFixedDate(Lsun/util/calendar/CalendarDate;)J
-HSPLsun/util/calendar/BaseCalendar;->getGregorianYearFromFixedDate(J)I
-HSPLsun/util/calendar/BaseCalendar;->isLeapYear(I)Z
-HSPLsun/util/calendar/BaseCalendar;->isLeapYear(Lsun/util/calendar/CalendarDate;)Z
-HSPLsun/util/calendar/BaseCalendar;->normalizeMonth(Lsun/util/calendar/CalendarDate;)V
-HSPLsun/util/calendar/CalendarDate;-><init>(Ljava/util/TimeZone;)V
-HSPLsun/util/calendar/CalendarDate;->clone()Ljava/lang/Object;
-HSPLsun/util/calendar/CalendarDate;->getDayOfMonth()I
-HSPLsun/util/calendar/CalendarDate;->getDayOfWeek()I
-HSPLsun/util/calendar/CalendarDate;->getEra()Lsun/util/calendar/Era;
-HSPLsun/util/calendar/CalendarDate;->getHours()I
-HSPLsun/util/calendar/CalendarDate;->getMillis()I
-HSPLsun/util/calendar/CalendarDate;->getMinutes()I
-HSPLsun/util/calendar/CalendarDate;->getMonth()I
-HSPLsun/util/calendar/CalendarDate;->getSeconds()I
-HSPLsun/util/calendar/CalendarDate;->getTimeOfDay()J
-HSPLsun/util/calendar/CalendarDate;->getYear()I
-HSPLsun/util/calendar/CalendarDate;->getZone()Ljava/util/TimeZone;
-HSPLsun/util/calendar/CalendarDate;->isDaylightTime()Z
-HSPLsun/util/calendar/CalendarDate;->isLeapYear()Z
-HSPLsun/util/calendar/CalendarDate;->isNormalized()Z
-HSPLsun/util/calendar/CalendarDate;->isStandardTime()Z
-HSPLsun/util/calendar/CalendarDate;->setDate(III)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/CalendarDate;->setDayOfMonth(I)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/CalendarDate;->setDayOfWeek(I)V
-HSPLsun/util/calendar/CalendarDate;->setDaylightSaving(I)V
-HSPLsun/util/calendar/CalendarDate;->setEra(Lsun/util/calendar/Era;)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/CalendarDate;->setHours(I)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/CalendarDate;->setLeapYear(Z)V
-HSPLsun/util/calendar/CalendarDate;->setMillis(I)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/CalendarDate;->setMinutes(I)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/CalendarDate;->setMonth(I)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/CalendarDate;->setNormalized(Z)V
-HSPLsun/util/calendar/CalendarDate;->setSeconds(I)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/CalendarDate;->setTimeOfDay(IIII)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/CalendarDate;->setTimeOfDay(J)V
-HSPLsun/util/calendar/CalendarDate;->setYear(I)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/CalendarDate;->setZone(Ljava/util/TimeZone;)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/CalendarDate;->setZoneOffset(I)V
-HSPLsun/util/calendar/CalendarSystem;-><init>()V
-HSPLsun/util/calendar/CalendarSystem;->forName(Ljava/lang/String;)Lsun/util/calendar/CalendarSystem;
-HSPLsun/util/calendar/CalendarSystem;->getGregorianCalendar()Lsun/util/calendar/Gregorian;
-HSPLsun/util/calendar/CalendarUtils;->floorDivide(II)I
-HSPLsun/util/calendar/CalendarUtils;->floorDivide(JJ)J
-HSPLsun/util/calendar/CalendarUtils;->isGregorianLeapYear(I)Z
-HSPLsun/util/calendar/CalendarUtils;->isJulianLeapYear(I)Z
-HSPLsun/util/calendar/CalendarUtils;->mod(II)I
-HSPLsun/util/calendar/CalendarUtils;->mod(JJ)J
-HSPLsun/util/calendar/CalendarUtils;->sprintf0d(Ljava/lang/StringBuilder;II)Ljava/lang/StringBuilder;
-HSPLsun/util/calendar/Gregorian$Date;-><init>(Ljava/util/TimeZone;)V
-HSPLsun/util/calendar/Gregorian$Date;->getNormalizedYear()I
-HSPLsun/util/calendar/Gregorian$Date;->setNormalizedYear(I)V
-HSPLsun/util/calendar/Gregorian;->getCalendarDate(JLjava/util/TimeZone;)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/Gregorian;->getCalendarDate(JLjava/util/TimeZone;)Lsun/util/calendar/Gregorian$Date;
-HSPLsun/util/calendar/Gregorian;->getCalendarDate(JLsun/util/calendar/CalendarDate;)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/Gregorian;->getCalendarDate(JLsun/util/calendar/CalendarDate;)Lsun/util/calendar/Gregorian$Date;
-HSPLsun/util/calendar/Gregorian;->newCalendarDate(Ljava/util/TimeZone;)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/Gregorian;->newCalendarDate(Ljava/util/TimeZone;)Lsun/util/calendar/Gregorian$Date;
-HSPLsun/util/calendar/JulianCalendar$Date;-><init>(Ljava/util/TimeZone;)V
-HSPLsun/util/calendar/JulianCalendar$Date;->getNormalizedYear()I
-HSPLsun/util/calendar/JulianCalendar$Date;->setKnownEra(Lsun/util/calendar/Era;)V
-HSPLsun/util/calendar/JulianCalendar$Date;->setNormalizedYear(I)V
-HSPLsun/util/calendar/JulianCalendar;-><init>()V
-HSPLsun/util/calendar/JulianCalendar;->getCalendarDateFromFixedDate(Lsun/util/calendar/CalendarDate;J)V
-HSPLsun/util/calendar/JulianCalendar;->getFixedDate(IIILsun/util/calendar/BaseCalendar$Date;)J
-HSPLsun/util/calendar/JulianCalendar;->isLeapYear(I)Z
-HSPLsun/util/calendar/JulianCalendar;->newCalendarDate(Ljava/util/TimeZone;)Lsun/util/calendar/CalendarDate;
-HSPLsun/util/calendar/JulianCalendar;->newCalendarDate(Ljava/util/TimeZone;)Lsun/util/calendar/JulianCalendar$Date;
-HSPLsun/util/locale/BaseLocale$Cache;->-$$Nest$sfgetCACHE()Lsun/util/locale/BaseLocale$Cache;
-HSPLsun/util/locale/BaseLocale$Cache;->createObject(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLsun/util/locale/BaseLocale$Cache;->createObject(Lsun/util/locale/BaseLocale$Key;)Lsun/util/locale/BaseLocale;
-HSPLsun/util/locale/BaseLocale$Cache;->normalizeKey(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLsun/util/locale/BaseLocale$Cache;->normalizeKey(Lsun/util/locale/BaseLocale$Key;)Lsun/util/locale/BaseLocale$Key;
-HSPLsun/util/locale/BaseLocale$Key;->-$$Nest$mgetBaseLocale(Lsun/util/locale/BaseLocale$Key;)Lsun/util/locale/BaseLocale;
-HSPLsun/util/locale/BaseLocale$Key;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLsun/util/locale/BaseLocale$Key;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLsun/util/locale/BaseLocale$Key-IA;)V
-HSPLsun/util/locale/BaseLocale$Key;->equals(Ljava/lang/Object;)Z
-HSPLsun/util/locale/BaseLocale$Key;->getBaseLocale()Lsun/util/locale/BaseLocale;
-HSPLsun/util/locale/BaseLocale$Key;->hashCode()I
-HSPLsun/util/locale/BaseLocale$Key;->hashCode(Lsun/util/locale/BaseLocale;)I
-HSPLsun/util/locale/BaseLocale$Key;->normalize(Lsun/util/locale/BaseLocale$Key;)Lsun/util/locale/BaseLocale$Key;
-HSPLsun/util/locale/BaseLocale;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLsun/util/locale/BaseLocale;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLsun/util/locale/BaseLocale-IA;)V
-HSPLsun/util/locale/BaseLocale;->cleanCache()V
-HSPLsun/util/locale/BaseLocale;->convertOldISOCodes(Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/util/locale/BaseLocale;->equals(Ljava/lang/Object;)Z
-HSPLsun/util/locale/BaseLocale;->getInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lsun/util/locale/BaseLocale;
-HSPLsun/util/locale/BaseLocale;->getLanguage()Ljava/lang/String;
-HSPLsun/util/locale/BaseLocale;->getRegion()Ljava/lang/String;
-HSPLsun/util/locale/BaseLocale;->getScript()Ljava/lang/String;
-HSPLsun/util/locale/BaseLocale;->getVariant()Ljava/lang/String;
-HSPLsun/util/locale/BaseLocale;->hashCode()I
-HSPLsun/util/locale/InternalLocaleBuilder;-><init>()V
-HSPLsun/util/locale/InternalLocaleBuilder;->checkVariants(Ljava/lang/String;Ljava/lang/String;)I
-HSPLsun/util/locale/InternalLocaleBuilder;->clear()Lsun/util/locale/InternalLocaleBuilder;
-HSPLsun/util/locale/InternalLocaleBuilder;->clearExtensions()Lsun/util/locale/InternalLocaleBuilder;
-HSPLsun/util/locale/InternalLocaleBuilder;->getBaseLocale()Lsun/util/locale/BaseLocale;
-HSPLsun/util/locale/InternalLocaleBuilder;->getLocaleExtensions()Lsun/util/locale/LocaleExtensions;
-HSPLsun/util/locale/InternalLocaleBuilder;->setExtensions(Ljava/util/List;Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
-HSPLsun/util/locale/InternalLocaleBuilder;->setLanguage(Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
-HSPLsun/util/locale/InternalLocaleBuilder;->setLanguageTag(Lsun/util/locale/LanguageTag;)Lsun/util/locale/InternalLocaleBuilder;
-HSPLsun/util/locale/InternalLocaleBuilder;->setRegion(Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
-HSPLsun/util/locale/InternalLocaleBuilder;->setScript(Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
-HSPLsun/util/locale/InternalLocaleBuilder;->setVariant(Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
-HSPLsun/util/locale/LanguageTag;-><init>()V
-HSPLsun/util/locale/LanguageTag;->canonicalizeLanguage(Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/util/locale/LanguageTag;->canonicalizeRegion(Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/util/locale/LanguageTag;->canonicalizeScript(Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/util/locale/LanguageTag;->getExtensions()Ljava/util/List;
-HSPLsun/util/locale/LanguageTag;->getExtlangs()Ljava/util/List;
-HSPLsun/util/locale/LanguageTag;->getLanguage()Ljava/lang/String;
-HSPLsun/util/locale/LanguageTag;->getPrivateuse()Ljava/lang/String;
-HSPLsun/util/locale/LanguageTag;->getRegion()Ljava/lang/String;
-HSPLsun/util/locale/LanguageTag;->getScript()Ljava/lang/String;
-HSPLsun/util/locale/LanguageTag;->getVariants()Ljava/util/List;
-HSPLsun/util/locale/LanguageTag;->isExtlang(Ljava/lang/String;)Z
-HSPLsun/util/locale/LanguageTag;->isLanguage(Ljava/lang/String;)Z
-HSPLsun/util/locale/LanguageTag;->isRegion(Ljava/lang/String;)Z
-HSPLsun/util/locale/LanguageTag;->isScript(Ljava/lang/String;)Z
-HSPLsun/util/locale/LanguageTag;->isVariant(Ljava/lang/String;)Z
-HSPLsun/util/locale/LanguageTag;->parse(Ljava/lang/String;Lsun/util/locale/ParseStatus;)Lsun/util/locale/LanguageTag;
-HSPLsun/util/locale/LanguageTag;->parseExtensions(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-HSPLsun/util/locale/LanguageTag;->parseExtlangs(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-HSPLsun/util/locale/LanguageTag;->parseLanguage(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-HSPLsun/util/locale/LanguageTag;->parseLocale(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;)Lsun/util/locale/LanguageTag;
-HSPLsun/util/locale/LanguageTag;->parsePrivateuse(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-HSPLsun/util/locale/LanguageTag;->parseRegion(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-HSPLsun/util/locale/LanguageTag;->parseScript(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-HSPLsun/util/locale/LanguageTag;->parseVariants(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-HSPLsun/util/locale/LocaleObjectCache$CacheEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-HSPLsun/util/locale/LocaleObjectCache$CacheEntry;->getKey()Ljava/lang/Object;
-HSPLsun/util/locale/LocaleObjectCache;->cleanStaleEntries()V
-HSPLsun/util/locale/LocaleObjectCache;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLsun/util/locale/LocaleObjectCache;->normalizeKey(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLsun/util/locale/LocaleUtils;->caseIgnoreMatch(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLsun/util/locale/LocaleUtils;->isAlpha(C)Z
-HSPLsun/util/locale/LocaleUtils;->isAlphaNumeric(C)Z
-HSPLsun/util/locale/LocaleUtils;->isAlphaNumericString(Ljava/lang/String;)Z
-HSPLsun/util/locale/LocaleUtils;->isAlphaString(Ljava/lang/String;)Z
-HSPLsun/util/locale/LocaleUtils;->isEmpty(Ljava/lang/String;)Z
-HSPLsun/util/locale/LocaleUtils;->isEmpty(Ljava/util/List;)Z
-HSPLsun/util/locale/LocaleUtils;->isEmpty(Ljava/util/Map;)Z
-HSPLsun/util/locale/LocaleUtils;->isEmpty(Ljava/util/Set;)Z
-HSPLsun/util/locale/LocaleUtils;->isLower(C)Z
-HSPLsun/util/locale/LocaleUtils;->isNumeric(C)Z
-HSPLsun/util/locale/LocaleUtils;->isNumericString(Ljava/lang/String;)Z
-HSPLsun/util/locale/LocaleUtils;->isUpper(C)Z
-HSPLsun/util/locale/LocaleUtils;->toLower(C)C
-HSPLsun/util/locale/LocaleUtils;->toLowerString(Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/util/locale/LocaleUtils;->toTitleString(Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/util/locale/LocaleUtils;->toUpperString(Ljava/lang/String;)Ljava/lang/String;
-HSPLsun/util/locale/ParseStatus;-><init>()V
-HSPLsun/util/locale/ParseStatus;->isError()Z
-HSPLsun/util/locale/ParseStatus;->reset()V
-HSPLsun/util/locale/StringTokenIterator;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLsun/util/locale/StringTokenIterator;->current()Ljava/lang/String;
-HSPLsun/util/locale/StringTokenIterator;->currentEnd()I
-HSPLsun/util/locale/StringTokenIterator;->hasNext()Z
-HSPLsun/util/locale/StringTokenIterator;->isDone()Z
-HSPLsun/util/locale/StringTokenIterator;->next()Ljava/lang/String;
-HSPLsun/util/locale/StringTokenIterator;->nextDelimiter(I)I
-HSPLsun/util/locale/StringTokenIterator;->setStart(I)Lsun/util/locale/StringTokenIterator;
-HSPLsun/util/locale/provider/CalendarDataUtility;->retrieveFirstDayOfWeek(Ljava/util/Locale;I)I
-HSPLsun/util/logging/LoggingSupport$2;-><init>()V
-HSPLsun/util/logging/LoggingSupport$2;->run()Ljava/lang/Object;
-HSPLsun/util/logging/LoggingSupport$2;->run()Ljava/lang/String;
-HSPLsun/util/logging/LoggingSupport;->getSimpleFormat()Ljava/lang/String;
-HSPLsun/util/logging/LoggingSupport;->getSimpleFormat(Z)Ljava/lang/String;
-HSPLsun/util/logging/PlatformLogger$JavaLoggerProxy;-><init>(Ljava/lang/String;)V
-HSPLsun/util/logging/PlatformLogger$JavaLoggerProxy;-><init>(Ljava/lang/String;Lsun/util/logging/PlatformLogger$Level;)V
-HSPLsun/util/logging/PlatformLogger$LoggerProxy;-><init>(Ljava/lang/String;)V
-HSPLsun/util/logging/PlatformLogger;-><init>(Ljava/lang/String;)V
-HSPLsun/util/logging/PlatformLogger;->getLogger(Ljava/lang/String;)Lsun/util/logging/PlatformLogger;
-Landroid/R$attr;
-Landroid/R$id;
-Landroid/R$styleable;
-Landroid/accessibilityservice/AccessibilityServiceInfo$1;
-Landroid/accessibilityservice/AccessibilityServiceInfo$DynamicPropertyDefaults;
-Landroid/accessibilityservice/AccessibilityServiceInfo;
-Landroid/accessibilityservice/AccessibilityShortcutInfo;
-Landroid/accessibilityservice/GestureDescription$MotionEventGenerator;
-Landroid/accessibilityservice/IAccessibilityServiceClient$Stub$Proxy;
-Landroid/accessibilityservice/IAccessibilityServiceClient$Stub;
-Landroid/accessibilityservice/IAccessibilityServiceClient;
-Landroid/accessibilityservice/IAccessibilityServiceConnection$Default;
-Landroid/accessibilityservice/IAccessibilityServiceConnection;
-Landroid/accounts/AbstractAccountAuthenticator$Transport;
-Landroid/accounts/AbstractAccountAuthenticator;
-Landroid/accounts/Account$1;
-Landroid/accounts/Account;
-Landroid/accounts/AccountAndUser;
-Landroid/accounts/AccountAuthenticatorResponse$1;
-Landroid/accounts/AccountAuthenticatorResponse;
-Landroid/accounts/AccountManager$10;
-Landroid/accounts/AccountManager$11;
-Landroid/accounts/AccountManager$15;
-Landroid/accounts/AccountManager$16;
-Landroid/accounts/AccountManager$17;
-Landroid/accounts/AccountManager$18;
-Landroid/accounts/AccountManager$1;
-Landroid/accounts/AccountManager$20;
-Landroid/accounts/AccountManager$2;
-Landroid/accounts/AccountManager$3;
-Landroid/accounts/AccountManager$4;
-Landroid/accounts/AccountManager$5;
-Landroid/accounts/AccountManager$8;
-Landroid/accounts/AccountManager$AccountKeyData;
-Landroid/accounts/AccountManager$AmsTask$1;
-Landroid/accounts/AccountManager$AmsTask$Response-IA;
-Landroid/accounts/AccountManager$AmsTask$Response;
-Landroid/accounts/AccountManager$AmsTask;
-Landroid/accounts/AccountManager$BaseFutureTask$1;
-Landroid/accounts/AccountManager$BaseFutureTask$Response;
-Landroid/accounts/AccountManager$BaseFutureTask;
-Landroid/accounts/AccountManager$Future2Task$1;
-Landroid/accounts/AccountManager$Future2Task;
-Landroid/accounts/AccountManager;
-Landroid/accounts/AccountManagerCallback;
-Landroid/accounts/AccountManagerFuture;
-Landroid/accounts/AccountManagerInternal$OnAppPermissionChangeListener;
-Landroid/accounts/AccountManagerInternal;
-Landroid/accounts/AccountsException;
-Landroid/accounts/AuthenticatorDescription$1;
-Landroid/accounts/AuthenticatorDescription-IA;
-Landroid/accounts/AuthenticatorDescription;
-Landroid/accounts/AuthenticatorException;
-Landroid/accounts/IAccountAuthenticator$Stub$Proxy;
-Landroid/accounts/IAccountAuthenticator$Stub;
-Landroid/accounts/IAccountAuthenticator;
-Landroid/accounts/IAccountAuthenticatorResponse$Stub$Proxy;
-Landroid/accounts/IAccountAuthenticatorResponse$Stub;
-Landroid/accounts/IAccountAuthenticatorResponse;
-Landroid/accounts/IAccountManager$Stub$Proxy;
-Landroid/accounts/IAccountManager$Stub;
-Landroid/accounts/IAccountManager;
-Landroid/accounts/IAccountManagerResponse$Stub$Proxy;
-Landroid/accounts/IAccountManagerResponse$Stub;
-Landroid/accounts/IAccountManagerResponse;
-Landroid/accounts/NetworkErrorException;
-Landroid/accounts/OnAccountsUpdateListener;
-Landroid/accounts/OperationCanceledException;
-Landroid/animation/AnimationHandler$$ExternalSyntheticLambda0;
-Landroid/animation/AnimationHandler$1;
-Landroid/animation/AnimationHandler$2;
-Landroid/animation/AnimationHandler$AnimationFrameCallback;
-Landroid/animation/AnimationHandler$AnimationFrameCallbackProvider;
-Landroid/animation/AnimationHandler$MyFrameCallbackProvider-IA;
-Landroid/animation/AnimationHandler$MyFrameCallbackProvider;
-Landroid/animation/AnimationHandler;
-Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda0;
-Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda1;
-Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda2;
-Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda3;
-Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda4;
-Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda5;
-Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda6;
-Landroid/animation/Animator$AnimatorCaller;
-Landroid/animation/Animator$AnimatorConstantState;
-Landroid/animation/Animator$AnimatorListener;
-Landroid/animation/Animator$AnimatorPauseListener;
-Landroid/animation/Animator;
-Landroid/animation/AnimatorInflater$PathDataEvaluator-IA;
-Landroid/animation/AnimatorInflater$PathDataEvaluator;
-Landroid/animation/AnimatorInflater;
-Landroid/animation/AnimatorListenerAdapter;
-Landroid/animation/AnimatorSet$$ExternalSyntheticLambda0;
-Landroid/animation/AnimatorSet$$ExternalSyntheticLambda2;
-Landroid/animation/AnimatorSet$1;
-Landroid/animation/AnimatorSet$2;
-Landroid/animation/AnimatorSet$3;
-Landroid/animation/AnimatorSet$AnimationEvent;
-Landroid/animation/AnimatorSet$Builder;
-Landroid/animation/AnimatorSet$Node;
-Landroid/animation/AnimatorSet$SeekState-IA;
-Landroid/animation/AnimatorSet$SeekState;
-Landroid/animation/AnimatorSet;
-Landroid/animation/ArgbEvaluator;
-Landroid/animation/BidirectionalTypeConverter;
-Landroid/animation/FloatEvaluator;
-Landroid/animation/FloatKeyframeSet;
-Landroid/animation/IntEvaluator;
-Landroid/animation/IntKeyframeSet;
-Landroid/animation/Keyframe$FloatKeyframe;
-Landroid/animation/Keyframe$IntKeyframe;
-Landroid/animation/Keyframe$ObjectKeyframe;
-Landroid/animation/Keyframe;
-Landroid/animation/KeyframeSet;
-Landroid/animation/Keyframes$FloatKeyframes;
-Landroid/animation/Keyframes$IntKeyframes;
-Landroid/animation/Keyframes;
-Landroid/animation/LayoutTransition$1;
-Landroid/animation/LayoutTransition$2;
-Landroid/animation/LayoutTransition$3;
-Landroid/animation/LayoutTransition$4;
-Landroid/animation/LayoutTransition$5;
-Landroid/animation/LayoutTransition$CleanupCallback;
-Landroid/animation/LayoutTransition$TransitionListener;
-Landroid/animation/LayoutTransition;
-Landroid/animation/ObjectAnimator;
-Landroid/animation/PathKeyframes$1;
-Landroid/animation/PathKeyframes$2;
-Landroid/animation/PathKeyframes$3;
-Landroid/animation/PathKeyframes$4;
-Landroid/animation/PathKeyframes$FloatKeyframesBase;
-Landroid/animation/PathKeyframes$IntKeyframesBase;
-Landroid/animation/PathKeyframes$SimpleKeyframes-IA;
-Landroid/animation/PathKeyframes$SimpleKeyframes;
-Landroid/animation/PathKeyframes;
-Landroid/animation/PropertyValuesHolder$1;
-Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;
-Landroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;
-Landroid/animation/PropertyValuesHolder$PropertyValues$DataSource;
-Landroid/animation/PropertyValuesHolder$PropertyValues;
-Landroid/animation/PropertyValuesHolder-IA;
-Landroid/animation/PropertyValuesHolder;
-Landroid/animation/RectEvaluator;
-Landroid/animation/RevealAnimator;
-Landroid/animation/StateListAnimator$1;
-Landroid/animation/StateListAnimator$StateListAnimatorConstantState;
-Landroid/animation/StateListAnimator$Tuple-IA;
-Landroid/animation/StateListAnimator$Tuple;
-Landroid/animation/StateListAnimator;
-Landroid/animation/TimeAnimator$TimeListener;
-Landroid/animation/TimeAnimator;
-Landroid/animation/TimeInterpolator;
-Landroid/animation/TypeConverter;
-Landroid/animation/TypeEvaluator;
-Landroid/animation/ValueAnimator$AnimatorUpdateListener;
-Landroid/animation/ValueAnimator$DurationScaleChangeListener;
-Landroid/animation/ValueAnimator;
-Landroid/annotation/ColorInt;
-Landroid/annotation/CurrentTimeMillisLong;
-Landroid/annotation/FloatRange;
-Landroid/annotation/IdRes;
-Landroid/annotation/IntRange;
-Landroid/annotation/NonNull;
-Landroid/annotation/RequiresPermission;
-Landroid/annotation/Size;
-Landroid/annotation/StringRes;
-Landroid/annotation/SystemApi;
-Landroid/apex/ApexInfo$1;
-Landroid/apex/ApexInfo;
-Landroid/apex/ApexSessionInfo$1;
-Landroid/apex/ApexSessionInfo;
-Landroid/apex/IApexService$Stub$Proxy;
-Landroid/apex/IApexService$Stub;
-Landroid/apex/IApexService;
-Landroid/app/ActionBar$LayoutParams;
-Landroid/app/ActionBar;
-Landroid/app/Activity$$ExternalSyntheticLambda0;
-Landroid/app/Activity$1;
-Landroid/app/Activity$HostCallbacks;
-Landroid/app/Activity$ManagedCursor;
-Landroid/app/Activity$ManagedDialog-IA;
-Landroid/app/Activity$ManagedDialog;
-Landroid/app/Activity$NonConfigurationInstances;
-Landroid/app/Activity$RequestFinishCallback;
-Landroid/app/Activity$TranslucentConversionListener;
-Landroid/app/Activity;
-Landroid/app/ActivityClient$1;
-Landroid/app/ActivityClient$ActivityClientControllerSingleton-IA;
-Landroid/app/ActivityClient$ActivityClientControllerSingleton;
-Landroid/app/ActivityClient-IA;
-Landroid/app/ActivityClient;
-Landroid/app/ActivityManager$1;
-Landroid/app/ActivityManager$2;
-Landroid/app/ActivityManager$3;
-Landroid/app/ActivityManager$AppTask;
-Landroid/app/ActivityManager$MemoryInfo$1;
-Landroid/app/ActivityManager$MemoryInfo;
-Landroid/app/ActivityManager$MyUidObserver;
-Landroid/app/ActivityManager$OnUidImportanceListener;
-Landroid/app/ActivityManager$PendingIntentInfo$1;
-Landroid/app/ActivityManager$PendingIntentInfo;
-Landroid/app/ActivityManager$ProcessErrorStateInfo$1;
-Landroid/app/ActivityManager$ProcessErrorStateInfo;
-Landroid/app/ActivityManager$RecentTaskInfo$1;
-Landroid/app/ActivityManager$RecentTaskInfo$PersistedTaskSnapshotData;
-Landroid/app/ActivityManager$RecentTaskInfo-IA;
-Landroid/app/ActivityManager$RecentTaskInfo;
-Landroid/app/ActivityManager$RunningAppProcessInfo$1;
-Landroid/app/ActivityManager$RunningAppProcessInfo-IA;
-Landroid/app/ActivityManager$RunningAppProcessInfo;
-Landroid/app/ActivityManager$RunningServiceInfo$1;
-Landroid/app/ActivityManager$RunningServiceInfo-IA;
-Landroid/app/ActivityManager$RunningServiceInfo;
-Landroid/app/ActivityManager$RunningTaskInfo$1;
-Landroid/app/ActivityManager$RunningTaskInfo-IA;
-Landroid/app/ActivityManager$RunningTaskInfo;
-Landroid/app/ActivityManager$TaskDescription$1;
-Landroid/app/ActivityManager$TaskDescription-IA;
-Landroid/app/ActivityManager$TaskDescription;
-Landroid/app/ActivityManager;
-Landroid/app/ActivityManagerInternal;
-Landroid/app/ActivityOptions$1;
-Landroid/app/ActivityOptions$2;
-Landroid/app/ActivityOptions$OnAnimationStartedListener;
-Landroid/app/ActivityOptions$SceneTransitionInfo;
-Landroid/app/ActivityOptions$SourceInfo$1;
-Landroid/app/ActivityOptions$SourceInfo;
-Landroid/app/ActivityOptions;
-Landroid/app/ActivityTaskManager$1;
-Landroid/app/ActivityTaskManager$2;
-Landroid/app/ActivityTaskManager$RootTaskInfo$1;
-Landroid/app/ActivityTaskManager$RootTaskInfo;
-Landroid/app/ActivityTaskManager-IA;
-Landroid/app/ActivityTaskManager;
-Landroid/app/ActivityThread$$ExternalSyntheticLambda0;
-Landroid/app/ActivityThread$$ExternalSyntheticLambda1;
-Landroid/app/ActivityThread$$ExternalSyntheticLambda2;
-Landroid/app/ActivityThread$$ExternalSyntheticLambda3;
-Landroid/app/ActivityThread$$ExternalSyntheticLambda4;
-Landroid/app/ActivityThread$$ExternalSyntheticLambda5;
-Landroid/app/ActivityThread$1$$ExternalSyntheticLambda0;
-Landroid/app/ActivityThread$1;
-Landroid/app/ActivityThread$2;
-Landroid/app/ActivityThread$3;
-Landroid/app/ActivityThread$4;
-Landroid/app/ActivityThread$ActivityClientRecord$1;
-Landroid/app/ActivityThread$ActivityClientRecord;
-Landroid/app/ActivityThread$AppBindData;
-Landroid/app/ActivityThread$ApplicationThread$$ExternalSyntheticLambda2;
-Landroid/app/ActivityThread$ApplicationThread$1;
-Landroid/app/ActivityThread$ApplicationThread-IA;
-Landroid/app/ActivityThread$BindServiceData;
-Landroid/app/ActivityThread$ContextCleanupInfo;
-Landroid/app/ActivityThread$CreateBackupAgentData;
-Landroid/app/ActivityThread$CreateServiceData;
-Landroid/app/ActivityThread$DumpComponentInfo;
-Landroid/app/ActivityThread$DumpHeapData;
-Landroid/app/ActivityThread$DumpResourcesData;
-Landroid/app/ActivityThread$GcIdler;
-Landroid/app/ActivityThread$H;
-Landroid/app/ActivityThread$Idler-IA;
-Landroid/app/ActivityThread$Idler;
-Landroid/app/ActivityThread$Profiler;
-Landroid/app/ActivityThread$ProviderClientRecord;
-Landroid/app/ActivityThread$ProviderKey;
-Landroid/app/ActivityThread$ProviderRefCount;
-Landroid/app/ActivityThread$PurgeIdler;
-Landroid/app/ActivityThread$ReceiverData;
-Landroid/app/ActivityThread$RequestAssistContextExtras;
-Landroid/app/ActivityThread$SafeCancellationTransport;
-Landroid/app/ActivityThread$ServiceArgsData;
-Landroid/app/ActivityThread$UpdateCompatibilityData;
-Landroid/app/ActivityThread;
-Landroid/app/ActivityThreadInternal;
-Landroid/app/ActivityTransitionCoordinator;
-Landroid/app/ActivityTransitionState$$ExternalSyntheticLambda0;
-Landroid/app/ActivityTransitionState$1;
-Landroid/app/ActivityTransitionState;
-Landroid/app/AlarmManager$AlarmClockInfo$1;
-Landroid/app/AlarmManager$AlarmClockInfo;
-Landroid/app/AlarmManager$OnAlarmListener;
-Landroid/app/AlarmManager;
-Landroid/app/AlertDialog$Builder;
-Landroid/app/AlertDialog;
-Landroid/app/AppCompatCallbacks;
-Landroid/app/AppCompatTaskInfo;
-Landroid/app/AppComponentFactory;
-Landroid/app/AppDetailsActivity;
-Landroid/app/AppGlobals;
-Landroid/app/AppOpInfo$Builder;
-Landroid/app/AppOpInfo;
-Landroid/app/AppOpsManager$$ExternalSyntheticLambda2;
-Landroid/app/AppOpsManager$$ExternalSyntheticLambda3;
-Landroid/app/AppOpsManager$$ExternalSyntheticLambda4;
-Landroid/app/AppOpsManager$$ExternalSyntheticLambda5;
-Landroid/app/AppOpsManager$$ExternalSyntheticLambda6;
-Landroid/app/AppOpsManager$1;
-Landroid/app/AppOpsManager$2;
-Landroid/app/AppOpsManager$3;
-Landroid/app/AppOpsManager$4;
-Landroid/app/AppOpsManager$AppOpsCollector;
-Landroid/app/AppOpsManager$AttributedHistoricalOps$1;
-Landroid/app/AppOpsManager$AttributedHistoricalOps;
-Landroid/app/AppOpsManager$AttributedOpEntry$1;
-Landroid/app/AppOpsManager$AttributedOpEntry$LongSparseArrayParceling;
-Landroid/app/AppOpsManager$AttributedOpEntry;
-Landroid/app/AppOpsManager$HistoricalOp$1;
-Landroid/app/AppOpsManager$HistoricalOp;
-Landroid/app/AppOpsManager$HistoricalOps$1;
-Landroid/app/AppOpsManager$HistoricalOps;
-Landroid/app/AppOpsManager$HistoricalOpsRequest$Builder;
-Landroid/app/AppOpsManager$HistoricalOpsRequest;
-Landroid/app/AppOpsManager$HistoricalPackageOps$1;
-Landroid/app/AppOpsManager$HistoricalPackageOps;
-Landroid/app/AppOpsManager$HistoricalUidOps$1;
-Landroid/app/AppOpsManager$HistoricalUidOps;
-Landroid/app/AppOpsManager$Mode;
-Landroid/app/AppOpsManager$NoteOpEvent$1;
-Landroid/app/AppOpsManager$NoteOpEvent;
-Landroid/app/AppOpsManager$OnOpActiveChangedInternalListener;
-Landroid/app/AppOpsManager$OnOpActiveChangedListener;
-Landroid/app/AppOpsManager$OnOpChangedInternalListener;
-Landroid/app/AppOpsManager$OnOpChangedListener;
-Landroid/app/AppOpsManager$OnOpNotedCallback$1$$ExternalSyntheticLambda0;
-Landroid/app/AppOpsManager$OnOpNotedCallback$1;
-Landroid/app/AppOpsManager$OnOpNotedCallback;
-Landroid/app/AppOpsManager$OnOpNotedInternalListener;
-Landroid/app/AppOpsManager$OnOpNotedListener;
-Landroid/app/AppOpsManager$OnOpStartedListener;
-Landroid/app/AppOpsManager$OpEntry$1;
-Landroid/app/AppOpsManager$OpEntry;
-Landroid/app/AppOpsManager$OpEventProxyInfo$1;
-Landroid/app/AppOpsManager$OpEventProxyInfo;
-Landroid/app/AppOpsManager$PackageOps$1;
-Landroid/app/AppOpsManager$PackageOps;
-Landroid/app/AppOpsManager$PausedNotedAppOpsCollection;
-Landroid/app/AppOpsManager$RestrictionBypass;
-Landroid/app/AppOpsManager$SamplingStrategy;
-Landroid/app/AppOpsManager;
-Landroid/app/AppOpsManagerInternal;
-Landroid/app/Application$ActivityLifecycleCallbacks;
-Landroid/app/Application$OnProvideAssistDataListener;
-Landroid/app/Application;
-Landroid/app/ApplicationErrorReport$1;
-Landroid/app/ApplicationErrorReport$AnrInfo;
-Landroid/app/ApplicationErrorReport$BatteryInfo;
-Landroid/app/ApplicationErrorReport$CrashInfo;
-Landroid/app/ApplicationErrorReport$ParcelableCrashInfo$1;
-Landroid/app/ApplicationErrorReport$ParcelableCrashInfo;
-Landroid/app/ApplicationErrorReport$RunningServiceInfo;
-Landroid/app/ApplicationErrorReport;
-Landroid/app/ApplicationExitInfo$1;
-Landroid/app/ApplicationExitInfo-IA;
-Landroid/app/ApplicationExitInfo;
-Landroid/app/ApplicationLoaders$CachedClassLoader-IA;
-Landroid/app/ApplicationLoaders$CachedClassLoader;
-Landroid/app/ApplicationLoaders;
-Landroid/app/ApplicationPackageManager$$ExternalSyntheticLambda1;
-Landroid/app/ApplicationPackageManager$$ExternalSyntheticLambda2;
-Landroid/app/ApplicationPackageManager$1;
-Landroid/app/ApplicationPackageManager$2;
-Landroid/app/ApplicationPackageManager$3;
-Landroid/app/ApplicationPackageManager$GetPackagesForUidResult;
-Landroid/app/ApplicationPackageManager$HasSystemFeatureQuery;
-Landroid/app/ApplicationPackageManager$MoveCallbackDelegate;
-Landroid/app/ApplicationPackageManager$ResourceName;
-Landroid/app/AsyncNotedAppOp$1;
-Landroid/app/AsyncNotedAppOp;
-Landroid/app/AutomaticZenRule$1;
-Landroid/app/AutomaticZenRule;
-Landroid/app/BackStackRecord$Op;
-Landroid/app/BackStackRecord;
-Landroid/app/BackStackState$1;
-Landroid/app/BackStackState;
-Landroid/app/BackgroundServiceStartNotAllowedException$1;
-Landroid/app/BackgroundServiceStartNotAllowedException;
-Landroid/app/BroadcastOptions;
-Landroid/app/ClientTransactionHandler;
-Landroid/app/ComponentCaller;
-Landroid/app/ComponentOptions;
-Landroid/app/ConfigurationChangedListenerController;
-Landroid/app/ConfigurationController;
-Landroid/app/ContentProviderHolder$1;
-Landroid/app/ContentProviderHolder-IA;
-Landroid/app/ContentProviderHolder;
-Landroid/app/ContextImpl$1;
-Landroid/app/ContextImpl$ApplicationContentResolver;
-Landroid/app/DexLoadReporter;
-Landroid/app/Dialog$$ExternalSyntheticLambda0;
-Landroid/app/Dialog$$ExternalSyntheticLambda1;
-Landroid/app/Dialog$$ExternalSyntheticLambda2;
-Landroid/app/Dialog$ListenersHandler;
-Landroid/app/Dialog;
-Landroid/app/DialogFragment;
-Landroid/app/DirectAction$1;
-Landroid/app/DirectAction;
-Landroid/app/DisabledWallpaperManager;
-Landroid/app/DownloadManager$CursorTranslator;
-Landroid/app/DownloadManager$Query;
-Landroid/app/DownloadManager$Request;
-Landroid/app/DownloadManager;
-Landroid/app/DreamManager;
-Landroid/app/EnterTransitionCoordinator;
-Landroid/app/EventLogTags;
-Landroid/app/ExitTransitionCoordinator$ActivityExitTransitionCallbacks;
-Landroid/app/ExitTransitionCoordinator$ExitTransitionCallbacks;
-Landroid/app/ExitTransitionCoordinator;
-Landroid/app/FeatureFlags;
-Landroid/app/FeatureFlagsImpl;
-Landroid/app/Flags;
-Landroid/app/ForegroundServiceStartNotAllowedException$1;
-Landroid/app/ForegroundServiceStartNotAllowedException;
-Landroid/app/ForegroundServiceTypePolicy$ForegroundServiceTypePolicyInfo;
-Landroid/app/Fragment$1;
-Landroid/app/Fragment$AnimationInfo;
-Landroid/app/Fragment$InstantiationException;
-Landroid/app/Fragment$OnStartEnterTransitionListener;
-Landroid/app/Fragment;
-Landroid/app/FragmentContainer;
-Landroid/app/FragmentController;
-Landroid/app/FragmentHostCallback;
-Landroid/app/FragmentManager$BackStackEntry;
-Landroid/app/FragmentManager$FragmentLifecycleCallbacks;
-Landroid/app/FragmentManager$OnBackStackChangedListener;
-Landroid/app/FragmentManager;
-Landroid/app/FragmentManagerImpl$1;
-Landroid/app/FragmentManagerImpl$2;
-Landroid/app/FragmentManagerImpl$AnimateOnHWLayerIfNeededListener;
-Landroid/app/FragmentManagerImpl$OpGenerator;
-Landroid/app/FragmentManagerImpl$StartEnterTransitionListener;
-Landroid/app/FragmentManagerImpl;
-Landroid/app/FragmentManagerNonConfig;
-Landroid/app/FragmentManagerState$1;
-Landroid/app/FragmentManagerState;
-Landroid/app/FragmentState$1;
-Landroid/app/FragmentState;
-Landroid/app/FragmentTransaction;
-Landroid/app/FragmentTransition$2;
-Landroid/app/FragmentTransition$5;
-Landroid/app/FragmentTransition$FragmentContainerTransition;
-Landroid/app/FragmentTransition;
-Landroid/app/GameManager;
-Landroid/app/GrammaticalInflectionManager;
-Landroid/app/IActivityClientController$Stub$Proxy;
-Landroid/app/IActivityClientController$Stub;
-Landroid/app/IActivityClientController;
-Landroid/app/IActivityController$Stub$Proxy;
-Landroid/app/IActivityController$Stub;
-Landroid/app/IActivityController;
-Landroid/app/IActivityManager$Stub$Proxy;
-Landroid/app/IActivityManager$Stub;
-Landroid/app/IActivityManager;
-Landroid/app/IActivityTaskManager$Stub$Proxy;
-Landroid/app/IActivityTaskManager$Stub;
-Landroid/app/IActivityTaskManager;
-Landroid/app/IAlarmCompleteListener$Stub$Proxy;
-Landroid/app/IAlarmCompleteListener$Stub;
-Landroid/app/IAlarmCompleteListener;
-Landroid/app/IAlarmListener$Stub;
-Landroid/app/IAlarmListener;
-Landroid/app/IAlarmManager$Stub$Proxy;
-Landroid/app/IAlarmManager$Stub;
-Landroid/app/IAlarmManager;
-Landroid/app/IAppTask$Stub$Proxy;
-Landroid/app/IAppTask$Stub;
-Landroid/app/IAppTask;
-Landroid/app/IAppTraceRetriever$Stub$Proxy;
-Landroid/app/IAppTraceRetriever$Stub;
-Landroid/app/IAppTraceRetriever;
-Landroid/app/IApplicationStartInfoCompleteListener$Stub$Proxy;
-Landroid/app/IApplicationStartInfoCompleteListener$Stub;
-Landroid/app/IApplicationStartInfoCompleteListener;
-Landroid/app/IApplicationThread$Stub;
-Landroid/app/IApplicationThread;
-Landroid/app/IAssistDataReceiver$Stub$Proxy;
-Landroid/app/IAssistDataReceiver$Stub;
-Landroid/app/IAssistDataReceiver;
-Landroid/app/IBackupAgent$Stub$Proxy;
-Landroid/app/IBackupAgent$Stub;
-Landroid/app/IBackupAgent;
-Landroid/app/ICompatCameraControlCallback;
-Landroid/app/IForegroundServiceObserver$Stub$Proxy;
-Landroid/app/IForegroundServiceObserver$Stub;
-Landroid/app/IForegroundServiceObserver;
-Landroid/app/IGameManagerService$Stub$Proxy;
-Landroid/app/IGameManagerService$Stub;
-Landroid/app/IGameManagerService;
-Landroid/app/IInstantAppResolver$Stub$Proxy;
-Landroid/app/IInstantAppResolver$Stub;
-Landroid/app/IInstantAppResolver;
-Landroid/app/IInstrumentationWatcher$Stub$Proxy;
-Landroid/app/IInstrumentationWatcher$Stub;
-Landroid/app/IInstrumentationWatcher;
-Landroid/app/ILocalWallpaperColorConsumer$Stub;
-Landroid/app/ILocalWallpaperColorConsumer;
-Landroid/app/ILocaleManager$Stub$Proxy;
-Landroid/app/ILocaleManager$Stub;
-Landroid/app/ILocaleManager;
-Landroid/app/INotificationManager$Stub$Proxy;
-Landroid/app/INotificationManager$Stub;
-Landroid/app/INotificationManager;
-Landroid/app/IOnProjectionStateChangedListener$Stub;
-Landroid/app/IOnProjectionStateChangedListener;
-Landroid/app/IParcelFileDescriptorRetriever$Stub$Proxy;
-Landroid/app/IParcelFileDescriptorRetriever$Stub;
-Landroid/app/IParcelFileDescriptorRetriever;
-Landroid/app/IProcessObserver$Stub$Proxy;
-Landroid/app/IProcessObserver$Stub;
-Landroid/app/IProcessObserver;
-Landroid/app/IRequestFinishCallback$Stub$Proxy;
-Landroid/app/IRequestFinishCallback$Stub;
-Landroid/app/IRequestFinishCallback;
-Landroid/app/IScreenCaptureObserver;
-Landroid/app/ISearchManager$Stub$Proxy;
-Landroid/app/ISearchManager$Stub;
-Landroid/app/ISearchManager;
-Landroid/app/IServiceConnection$Stub;
-Landroid/app/IServiceConnection;
-Landroid/app/IStopUserCallback$Stub$Proxy;
-Landroid/app/IStopUserCallback$Stub;
-Landroid/app/IStopUserCallback;
-Landroid/app/ITaskStackListener$Stub$Proxy;
-Landroid/app/ITaskStackListener$Stub;
-Landroid/app/ITaskStackListener;
-Landroid/app/ITransientNotification$Stub$Proxy;
-Landroid/app/ITransientNotification$Stub;
-Landroid/app/ITransientNotification;
-Landroid/app/ITransientNotificationCallback$Stub$Proxy;
-Landroid/app/ITransientNotificationCallback$Stub;
-Landroid/app/ITransientNotificationCallback;
-Landroid/app/IUiAutomationConnection$Stub$Proxy;
-Landroid/app/IUiAutomationConnection$Stub;
-Landroid/app/IUiAutomationConnection;
-Landroid/app/IUiModeManager$Stub$Proxy;
-Landroid/app/IUiModeManager$Stub;
-Landroid/app/IUiModeManager;
-Landroid/app/IUiModeManagerCallback$Stub;
-Landroid/app/IUiModeManagerCallback;
-Landroid/app/IUidFrozenStateChangedCallback$Stub$Proxy;
-Landroid/app/IUidFrozenStateChangedCallback$Stub;
-Landroid/app/IUidFrozenStateChangedCallback;
-Landroid/app/IUidObserver$Stub;
-Landroid/app/IUidObserver;
-Landroid/app/IUnsafeIntentStrictModeCallback$Stub;
-Landroid/app/IUnsafeIntentStrictModeCallback;
-Landroid/app/IUriGrantsManager$Stub$Proxy;
-Landroid/app/IUriGrantsManager$Stub;
-Landroid/app/IUriGrantsManager;
-Landroid/app/IUserSwitchObserver$Stub$Proxy;
-Landroid/app/IUserSwitchObserver$Stub;
-Landroid/app/IUserSwitchObserver;
-Landroid/app/IWallpaperManager$Stub$Proxy;
-Landroid/app/IWallpaperManager$Stub;
-Landroid/app/IWallpaperManager;
-Landroid/app/IWallpaperManagerCallback$Stub$Proxy;
-Landroid/app/IWallpaperManagerCallback$Stub;
-Landroid/app/IWallpaperManagerCallback;
-Landroid/app/InstantAppResolverService$1;
-Landroid/app/InstantAppResolverService$InstantAppResolutionCallback;
-Landroid/app/InstantAppResolverService$ServiceHandler;
-Landroid/app/InstantAppResolverService;
-Landroid/app/Instrumentation$ActivityGoing;
-Landroid/app/Instrumentation$ActivityMonitor;
-Landroid/app/Instrumentation$ActivityResult;
-Landroid/app/Instrumentation$ActivityWaiter;
-Landroid/app/Instrumentation;
-Landroid/app/IntentReceiverLeaked;
-Landroid/app/IntentService$ServiceHandler;
-Landroid/app/IntentService;
-Landroid/app/KeyguardManager$1;
-Landroid/app/KeyguardManager$KeyguardDismissCallback;
-Landroid/app/KeyguardManager;
-Landroid/app/ListActivity;
-Landroid/app/LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0;
-Landroid/app/LoadedApk$ReceiverDispatcher$Args;
-Landroid/app/LoadedApk$ReceiverDispatcher;
-Landroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo-IA;
-Landroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo;
-Landroid/app/LoadedApk$ServiceDispatcher$DeathMonitor;
-Landroid/app/LoadedApk$ServiceDispatcher$RunConnection;
-Landroid/app/LoadedApk$ServiceDispatcher;
-Landroid/app/LoadedApk$SplitDependencyLoaderImpl;
-Landroid/app/LoadedApk$WarningContextClassLoader-IA;
-Landroid/app/LoadedApk$WarningContextClassLoader;
-Landroid/app/LoadedApk;
-Landroid/app/LoaderManager$LoaderCallbacks;
-Landroid/app/LoaderManager;
-Landroid/app/LoaderManagerImpl$LoaderInfo;
-Landroid/app/LoaderManagerImpl;
-Landroid/app/LocaleConfig$1;
-Landroid/app/LocaleConfig;
-Landroid/app/LocaleManager;
-Landroid/app/NativeActivity;
-Landroid/app/Notification$$ExternalSyntheticLambda0;
-Landroid/app/Notification$1;
-Landroid/app/Notification$Action$1;
-Landroid/app/Notification$Action$Builder;
-Landroid/app/Notification$Action-IA;
-Landroid/app/Notification$Action;
-Landroid/app/Notification$BigPictureStyle;
-Landroid/app/Notification$BigTextStyle;
-Landroid/app/Notification$BubbleMetadata$1;
-Landroid/app/Notification$BubbleMetadata$Builder;
-Landroid/app/Notification$BubbleMetadata-IA;
-Landroid/app/Notification$BubbleMetadata;
-Landroid/app/Notification$Builder;
-Landroid/app/Notification$BuilderRemoteViews;
-Landroid/app/Notification$CallStyle;
-Landroid/app/Notification$Colors;
-Landroid/app/Notification$DecoratedCustomViewStyle;
-Landroid/app/Notification$DecoratedMediaCustomViewStyle;
-Landroid/app/Notification$Extender;
-Landroid/app/Notification$InboxStyle;
-Landroid/app/Notification$MediaStyle;
-Landroid/app/Notification$MessagingStyle$Message;
-Landroid/app/Notification$MessagingStyle;
-Landroid/app/Notification$StandardTemplateParams-IA;
-Landroid/app/Notification$StandardTemplateParams;
-Landroid/app/Notification$Style;
-Landroid/app/Notification$TemplateBindResult$MarginSet;
-Landroid/app/Notification$TemplateBindResult;
-Landroid/app/Notification$TvExtender;
-Landroid/app/Notification;
-Landroid/app/NotificationChannel$1;
-Landroid/app/NotificationChannel;
-Landroid/app/NotificationChannelGroup$1;
-Landroid/app/NotificationChannelGroup;
-Landroid/app/NotificationHistory$1;
-Landroid/app/NotificationHistory$HistoricalNotification$Builder;
-Landroid/app/NotificationHistory$HistoricalNotification;
-Landroid/app/NotificationHistory;
-Landroid/app/NotificationManager$Policy$1;
-Landroid/app/NotificationManager$Policy;
-Landroid/app/NotificationManager;
-Landroid/app/OnActivityPausedListener;
-Landroid/app/PackageInstallObserver$1;
-Landroid/app/PackageInstallObserver;
-Landroid/app/PendingIntent$$ExternalSyntheticLambda0;
-Landroid/app/PendingIntent$$ExternalSyntheticLambda1;
-Landroid/app/PendingIntent$$ExternalSyntheticLambda2;
-Landroid/app/PendingIntent$$ExternalSyntheticLambda3;
-Landroid/app/PendingIntent$1;
-Landroid/app/PendingIntent$CancelListener;
-Landroid/app/PendingIntent$CanceledException;
-Landroid/app/PendingIntent$FinishedDispatcher;
-Landroid/app/PendingIntent$OnFinished;
-Landroid/app/PendingIntent$OnMarshaledListener;
-Landroid/app/PendingIntent;
-Landroid/app/Person$1;
-Landroid/app/Person$Builder-IA;
-Landroid/app/Person$Builder;
-Landroid/app/Person-IA;
-Landroid/app/Person;
-Landroid/app/PictureInPictureParams$1;
-Landroid/app/PictureInPictureParams$Builder;
-Landroid/app/PictureInPictureParams;
-Landroid/app/PictureInPictureUiState$1;
-Landroid/app/PictureInPictureUiState;
-Landroid/app/Presentation;
-Landroid/app/ProcessMemoryState$1;
-Landroid/app/ProcessMemoryState;
-Landroid/app/ProfilerInfo$1;
-Landroid/app/ProfilerInfo;
-Landroid/app/ProgressDialog$1;
-Landroid/app/ProgressDialog;
-Landroid/app/PropertyInvalidatedCache$1;
-Landroid/app/PropertyInvalidatedCache$AutoCorker$1;
-Landroid/app/PropertyInvalidatedCache$AutoCorker;
-Landroid/app/PropertyInvalidatedCache$DefaultComputer;
-Landroid/app/PropertyInvalidatedCache$NoPreloadHolder;
-Landroid/app/PropertyInvalidatedCache$QueryHandler;
-Landroid/app/PropertyInvalidatedCache;
-Landroid/app/QueuedWork$QueuedWorkHandler;
-Landroid/app/QueuedWork;
-Landroid/app/ReceiverInfo$1;
-Landroid/app/ReceiverInfo;
-Landroid/app/ReceiverRestrictedContext;
-Landroid/app/RemoteAction$1;
-Landroid/app/RemoteAction;
-Landroid/app/RemoteInput$1;
-Landroid/app/RemoteInput$Builder;
-Landroid/app/RemoteInput-IA;
-Landroid/app/RemoteInput;
-Landroid/app/RemoteInputHistoryItem$1;
-Landroid/app/RemoteInputHistoryItem;
-Landroid/app/RemoteServiceException;
-Landroid/app/ResourcesManager$$ExternalSyntheticLambda0;
-Landroid/app/ResourcesManager$$ExternalSyntheticLambda1;
-Landroid/app/ResourcesManager$ActivityResource-IA;
-Landroid/app/ResourcesManager$ActivityResource;
-Landroid/app/ResourcesManager$ActivityResources-IA;
-Landroid/app/ResourcesManager$ActivityResources;
-Landroid/app/ResourcesManager$ApkAssetsSupplier;
-Landroid/app/ResourcesManager$ApkKey;
-Landroid/app/ResourcesManager$UpdateHandler-IA;
-Landroid/app/ResourcesManager$UpdateHandler;
-Landroid/app/ResourcesManager;
-Landroid/app/ResultInfo$1;
-Landroid/app/ResultInfo;
-Landroid/app/RuntimeAppOpAccessMessage$1;
-Landroid/app/RuntimeAppOpAccessMessage;
-Landroid/app/SearchDialog;
-Landroid/app/SearchManager$OnCancelListener;
-Landroid/app/SearchManager$OnDismissListener;
-Landroid/app/SearchManager;
-Landroid/app/SearchableInfo$1;
-Landroid/app/SearchableInfo$ActionKeyInfo$1;
-Landroid/app/SearchableInfo$ActionKeyInfo;
-Landroid/app/SearchableInfo;
-Landroid/app/Service;
-Landroid/app/ServiceConnectionLeaked;
-Landroid/app/ServiceStartArgs$1;
-Landroid/app/ServiceStartArgs;
-Landroid/app/ServiceStartNotAllowedException;
-Landroid/app/SharedElementCallback$1;
-Landroid/app/SharedElementCallback;
-Landroid/app/SharedPreferencesImpl$$ExternalSyntheticLambda0;
-Landroid/app/SharedPreferencesImpl$1;
-Landroid/app/SharedPreferencesImpl$EditorImpl$$ExternalSyntheticLambda0;
-Landroid/app/SharedPreferencesImpl$EditorImpl$1;
-Landroid/app/SharedPreferencesImpl$EditorImpl$2;
-Landroid/app/SharedPreferencesImpl$EditorImpl;
-Landroid/app/SharedPreferencesImpl$MemoryCommitResult-IA;
-Landroid/app/SharedPreferencesImpl$MemoryCommitResult;
-Landroid/app/SharedPreferencesImpl$SharedPreferencesThreadFactory;
-Landroid/app/SharedPreferencesImpl;
-Landroid/app/StackTrace;
-Landroid/app/StatusBarManager;
-Landroid/app/SyncNotedAppOp$1;
-Landroid/app/SyncNotedAppOp;
-Landroid/app/SynchronousUserSwitchObserver;
-Landroid/app/SystemServiceRegistry$100;
-Landroid/app/SystemServiceRegistry$101;
-Landroid/app/SystemServiceRegistry$102;
-Landroid/app/SystemServiceRegistry$103;
-Landroid/app/SystemServiceRegistry$104;
-Landroid/app/SystemServiceRegistry$105;
-Landroid/app/SystemServiceRegistry$106;
-Landroid/app/SystemServiceRegistry$107;
-Landroid/app/SystemServiceRegistry$108;
-Landroid/app/SystemServiceRegistry$109;
-Landroid/app/SystemServiceRegistry$10;
-Landroid/app/SystemServiceRegistry$110;
-Landroid/app/SystemServiceRegistry$111;
-Landroid/app/SystemServiceRegistry$112;
-Landroid/app/SystemServiceRegistry$113;
-Landroid/app/SystemServiceRegistry$114;
-Landroid/app/SystemServiceRegistry$115;
-Landroid/app/SystemServiceRegistry$116;
-Landroid/app/SystemServiceRegistry$117;
-Landroid/app/SystemServiceRegistry$118;
-Landroid/app/SystemServiceRegistry$119;
-Landroid/app/SystemServiceRegistry$11;
-Landroid/app/SystemServiceRegistry$120;
-Landroid/app/SystemServiceRegistry$121;
-Landroid/app/SystemServiceRegistry$122;
-Landroid/app/SystemServiceRegistry$123;
-Landroid/app/SystemServiceRegistry$124;
-Landroid/app/SystemServiceRegistry$125;
-Landroid/app/SystemServiceRegistry$126;
-Landroid/app/SystemServiceRegistry$127;
-Landroid/app/SystemServiceRegistry$128;
-Landroid/app/SystemServiceRegistry$129;
-Landroid/app/SystemServiceRegistry$12;
-Landroid/app/SystemServiceRegistry$130;
-Landroid/app/SystemServiceRegistry$131;
-Landroid/app/SystemServiceRegistry$132;
-Landroid/app/SystemServiceRegistry$133;
-Landroid/app/SystemServiceRegistry$134;
-Landroid/app/SystemServiceRegistry$135;
-Landroid/app/SystemServiceRegistry$136;
-Landroid/app/SystemServiceRegistry$137;
-Landroid/app/SystemServiceRegistry$138;
-Landroid/app/SystemServiceRegistry$139;
-Landroid/app/SystemServiceRegistry$13;
-Landroid/app/SystemServiceRegistry$140;
-Landroid/app/SystemServiceRegistry$143;
-Landroid/app/SystemServiceRegistry$144;
-Landroid/app/SystemServiceRegistry$14;
-Landroid/app/SystemServiceRegistry$15;
-Landroid/app/SystemServiceRegistry$16;
-Landroid/app/SystemServiceRegistry$17;
-Landroid/app/SystemServiceRegistry$18;
-Landroid/app/SystemServiceRegistry$19;
-Landroid/app/SystemServiceRegistry$1;
-Landroid/app/SystemServiceRegistry$20;
-Landroid/app/SystemServiceRegistry$21;
-Landroid/app/SystemServiceRegistry$22;
-Landroid/app/SystemServiceRegistry$23;
-Landroid/app/SystemServiceRegistry$24;
-Landroid/app/SystemServiceRegistry$25;
-Landroid/app/SystemServiceRegistry$26;
-Landroid/app/SystemServiceRegistry$27;
-Landroid/app/SystemServiceRegistry$28;
-Landroid/app/SystemServiceRegistry$29;
-Landroid/app/SystemServiceRegistry$2;
-Landroid/app/SystemServiceRegistry$30;
-Landroid/app/SystemServiceRegistry$31;
-Landroid/app/SystemServiceRegistry$32;
-Landroid/app/SystemServiceRegistry$33;
-Landroid/app/SystemServiceRegistry$34;
-Landroid/app/SystemServiceRegistry$35;
-Landroid/app/SystemServiceRegistry$36;
-Landroid/app/SystemServiceRegistry$37;
-Landroid/app/SystemServiceRegistry$38;
-Landroid/app/SystemServiceRegistry$39;
-Landroid/app/SystemServiceRegistry$3;
-Landroid/app/SystemServiceRegistry$40;
-Landroid/app/SystemServiceRegistry$41;
-Landroid/app/SystemServiceRegistry$42;
-Landroid/app/SystemServiceRegistry$43;
-Landroid/app/SystemServiceRegistry$44;
-Landroid/app/SystemServiceRegistry$45;
-Landroid/app/SystemServiceRegistry$46;
-Landroid/app/SystemServiceRegistry$47;
-Landroid/app/SystemServiceRegistry$48;
-Landroid/app/SystemServiceRegistry$49;
-Landroid/app/SystemServiceRegistry$4;
-Landroid/app/SystemServiceRegistry$50;
-Landroid/app/SystemServiceRegistry$51;
-Landroid/app/SystemServiceRegistry$52;
-Landroid/app/SystemServiceRegistry$53;
-Landroid/app/SystemServiceRegistry$54;
-Landroid/app/SystemServiceRegistry$55;
-Landroid/app/SystemServiceRegistry$56;
-Landroid/app/SystemServiceRegistry$57;
-Landroid/app/SystemServiceRegistry$58;
-Landroid/app/SystemServiceRegistry$59;
-Landroid/app/SystemServiceRegistry$5;
-Landroid/app/SystemServiceRegistry$60;
-Landroid/app/SystemServiceRegistry$61;
-Landroid/app/SystemServiceRegistry$62;
-Landroid/app/SystemServiceRegistry$63;
-Landroid/app/SystemServiceRegistry$64;
-Landroid/app/SystemServiceRegistry$65;
-Landroid/app/SystemServiceRegistry$66;
-Landroid/app/SystemServiceRegistry$67;
-Landroid/app/SystemServiceRegistry$68;
-Landroid/app/SystemServiceRegistry$69;
-Landroid/app/SystemServiceRegistry$6;
-Landroid/app/SystemServiceRegistry$70;
-Landroid/app/SystemServiceRegistry$71;
-Landroid/app/SystemServiceRegistry$72;
-Landroid/app/SystemServiceRegistry$73;
-Landroid/app/SystemServiceRegistry$74;
-Landroid/app/SystemServiceRegistry$75;
-Landroid/app/SystemServiceRegistry$76;
-Landroid/app/SystemServiceRegistry$77;
-Landroid/app/SystemServiceRegistry$78;
-Landroid/app/SystemServiceRegistry$79;
-Landroid/app/SystemServiceRegistry$7;
-Landroid/app/SystemServiceRegistry$80;
-Landroid/app/SystemServiceRegistry$81;
-Landroid/app/SystemServiceRegistry$82;
-Landroid/app/SystemServiceRegistry$83;
-Landroid/app/SystemServiceRegistry$84;
-Landroid/app/SystemServiceRegistry$85;
-Landroid/app/SystemServiceRegistry$86;
-Landroid/app/SystemServiceRegistry$87;
-Landroid/app/SystemServiceRegistry$88;
-Landroid/app/SystemServiceRegistry$89;
-Landroid/app/SystemServiceRegistry$8;
-Landroid/app/SystemServiceRegistry$90;
-Landroid/app/SystemServiceRegistry$91;
-Landroid/app/SystemServiceRegistry$92;
-Landroid/app/SystemServiceRegistry$93;
-Landroid/app/SystemServiceRegistry$94;
-Landroid/app/SystemServiceRegistry$95;
-Landroid/app/SystemServiceRegistry$96;
-Landroid/app/SystemServiceRegistry$97;
-Landroid/app/SystemServiceRegistry$98;
-Landroid/app/SystemServiceRegistry$99;
-Landroid/app/SystemServiceRegistry$9;
-Landroid/app/SystemServiceRegistry$CachedServiceFetcher;
-Landroid/app/SystemServiceRegistry$ContextAwareServiceProducerWithBinder;
-Landroid/app/SystemServiceRegistry$ContextAwareServiceProducerWithoutBinder;
-Landroid/app/SystemServiceRegistry$ServiceFetcher;
-Landroid/app/SystemServiceRegistry$StaticServiceFetcher;
-Landroid/app/SystemServiceRegistry$StaticServiceProducerWithBinder;
-Landroid/app/SystemServiceRegistry$StaticServiceProducerWithoutBinder;
-Landroid/app/SystemServiceRegistry;
-Landroid/app/TaskInfo;
-Landroid/app/TaskStackListener;
-Landroid/app/UiModeManager$1;
-Landroid/app/UiModeManager$Globals;
-Landroid/app/UiModeManager$InnerListener;
-Landroid/app/UiModeManager$OnProjectionStateChangedListener;
-Landroid/app/UiModeManager$OnProjectionStateChangedListenerResourceManager-IA;
-Landroid/app/UiModeManager$OnProjectionStateChangedListenerResourceManager;
-Landroid/app/UiModeManager;
-Landroid/app/UidObserver;
-Landroid/app/UriGrantsManager$1;
-Landroid/app/UriGrantsManager;
-Landroid/app/UserSwitchObserver;
-Landroid/app/VoiceInteractor$Request;
-Landroid/app/VoiceInteractor;
-Landroid/app/Vr2dDisplayProperties$1;
-Landroid/app/Vr2dDisplayProperties;
-Landroid/app/VrManager;
-Landroid/app/WaitResult$1;
-Landroid/app/WaitResult;
-Landroid/app/WallpaperColors$1;
-Landroid/app/WallpaperColors;
-Landroid/app/WallpaperInfo$1;
-Landroid/app/WallpaperInfo;
-Landroid/app/WallpaperManager$CachedWallpaper;
-Landroid/app/WallpaperManager$ColorManagementProxy;
-Landroid/app/WallpaperManager$Globals$$ExternalSyntheticLambda1;
-Landroid/app/WallpaperManager$Globals$1;
-Landroid/app/WallpaperManager$Globals;
-Landroid/app/WallpaperManager$OnColorsChangedListener;
-Landroid/app/WallpaperManager;
-Landroid/app/WindowConfiguration$1;
-Landroid/app/WindowConfiguration-IA;
-Landroid/app/WindowConfiguration;
-Landroid/app/admin/DeviceAdminInfo$1;
-Landroid/app/admin/DeviceAdminInfo$PolicyInfo;
-Landroid/app/admin/DeviceAdminInfo;
-Landroid/app/admin/DevicePolicyCache$EmptyDevicePolicyCache;
-Landroid/app/admin/DevicePolicyCache;
-Landroid/app/admin/DevicePolicyEventLogger;
-Landroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda10;
-Landroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda11;
-Landroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda2;
-Landroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda3;
-Landroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda4;
-Landroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda5;
-Landroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda6;
-Landroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda7;
-Landroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda8;
-Landroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda9;
-Landroid/app/admin/DevicePolicyManager$1;
-Landroid/app/admin/DevicePolicyManager$2;
-Landroid/app/admin/DevicePolicyManager$InstallSystemUpdateCallback;
-Landroid/app/admin/DevicePolicyManager$OnClearApplicationUserDataListener;
-Landroid/app/admin/DevicePolicyManager;
-Landroid/app/admin/DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener;
-Landroid/app/admin/DevicePolicyManagerInternal;
-Landroid/app/admin/DevicePolicyResourcesManager;
-Landroid/app/admin/DeviceStateCache;
-Landroid/app/admin/FactoryResetProtectionPolicy$1;
-Landroid/app/admin/FactoryResetProtectionPolicy;
-Landroid/app/admin/IAuditLogEventsCallback$Stub;
-Landroid/app/admin/IAuditLogEventsCallback;
-Landroid/app/admin/IDeviceAdminService$Stub$Proxy;
-Landroid/app/admin/IDeviceAdminService$Stub;
-Landroid/app/admin/IDeviceAdminService;
-Landroid/app/admin/IDevicePolicyManager$Stub$Proxy;
-Landroid/app/admin/IDevicePolicyManager$Stub;
-Landroid/app/admin/IDevicePolicyManager;
-Landroid/app/admin/IKeyguardCallback$Stub;
-Landroid/app/admin/IKeyguardCallback;
-Landroid/app/admin/NetworkEvent$1;
-Landroid/app/admin/NetworkEvent;
-Landroid/app/admin/ParcelableResource$1;
-Landroid/app/admin/ParcelableResource;
-Landroid/app/admin/PasswordMetrics$1;
-Landroid/app/admin/PasswordMetrics$ComplexityBucket$1;
-Landroid/app/admin/PasswordMetrics$ComplexityBucket$2;
-Landroid/app/admin/PasswordMetrics$ComplexityBucket$3;
-Landroid/app/admin/PasswordMetrics$ComplexityBucket$4;
-Landroid/app/admin/PasswordMetrics$ComplexityBucket;
-Landroid/app/admin/PasswordMetrics;
-Landroid/app/admin/PasswordPolicy;
-Landroid/app/admin/SecurityLog$SecurityEvent$1;
-Landroid/app/admin/SecurityLog$SecurityEvent;
-Landroid/app/admin/SecurityLog;
-Landroid/app/admin/StartInstallingUpdateCallback$Stub$Proxy;
-Landroid/app/admin/StartInstallingUpdateCallback$Stub;
-Landroid/app/admin/StartInstallingUpdateCallback;
-Landroid/app/admin/SystemUpdateInfo$1;
-Landroid/app/admin/SystemUpdateInfo;
-Landroid/app/admin/SystemUpdatePolicy$1;
-Landroid/app/admin/SystemUpdatePolicy;
-Landroid/app/admin/WifiSsidPolicy$1;
-Landroid/app/admin/WifiSsidPolicy;
-Landroid/app/ambientcontext/AmbientContextManager;
-Landroid/app/ambientcontext/IAmbientContextManager$Stub$Proxy;
-Landroid/app/ambientcontext/IAmbientContextManager$Stub;
-Landroid/app/ambientcontext/IAmbientContextManager;
-Landroid/app/assist/ActivityId$1;
-Landroid/app/assist/ActivityId;
-Landroid/app/assist/AssistContent$1;
-Landroid/app/assist/AssistContent;
-Landroid/app/assist/AssistStructure$1;
-Landroid/app/assist/AssistStructure$AutofillOverlay;
-Landroid/app/assist/AssistStructure$HtmlInfoNode$1;
-Landroid/app/assist/AssistStructure$HtmlInfoNode;
-Landroid/app/assist/AssistStructure$HtmlInfoNodeBuilder;
-Landroid/app/assist/AssistStructure$ParcelTransferReader;
-Landroid/app/assist/AssistStructure$ParcelTransferWriter;
-Landroid/app/assist/AssistStructure$SendChannel;
-Landroid/app/assist/AssistStructure$ViewNode;
-Landroid/app/assist/AssistStructure$ViewNodeBuilder;
-Landroid/app/assist/AssistStructure$ViewNodeParcelable$1;
-Landroid/app/assist/AssistStructure$ViewNodeParcelable;
-Landroid/app/assist/AssistStructure$ViewNodeText;
-Landroid/app/assist/AssistStructure$ViewStackEntry;
-Landroid/app/assist/AssistStructure$WindowNode;
-Landroid/app/assist/AssistStructure;
-Landroid/app/backup/BackupAgent$BackupServiceBinder-IA;
-Landroid/app/backup/BackupAgent$BackupServiceBinder;
-Landroid/app/backup/BackupAgent$SharedPrefsSynchronizer;
-Landroid/app/backup/BackupAgent;
-Landroid/app/backup/BackupAgentHelper;
-Landroid/app/backup/BackupDataInput$EntityHeader;
-Landroid/app/backup/BackupDataInput;
-Landroid/app/backup/BackupDataOutput;
-Landroid/app/backup/BackupHelper;
-Landroid/app/backup/BackupHelperDispatcher$Header-IA;
-Landroid/app/backup/BackupHelperDispatcher$Header;
-Landroid/app/backup/BackupHelperDispatcher;
-Landroid/app/backup/BackupHelperWithLogger;
-Landroid/app/backup/BackupManager$BackupObserverWrapper$1;
-Landroid/app/backup/BackupManager$BackupObserverWrapper;
-Landroid/app/backup/BackupManager;
-Landroid/app/backup/BackupManagerMonitor;
-Landroid/app/backup/BackupObserver;
-Landroid/app/backup/BackupProgress$1;
-Landroid/app/backup/BackupProgress;
-Landroid/app/backup/BackupRestoreEventLogger;
-Landroid/app/backup/BackupTransport$TransportImpl;
-Landroid/app/backup/BackupTransport;
-Landroid/app/backup/BlobBackupHelper;
-Landroid/app/backup/FileBackupHelper;
-Landroid/app/backup/FileBackupHelperBase;
-Landroid/app/backup/FullBackup;
-Landroid/app/backup/FullBackupDataOutput;
-Landroid/app/backup/IBackupCallback$Stub$Proxy;
-Landroid/app/backup/IBackupCallback$Stub;
-Landroid/app/backup/IBackupCallback;
-Landroid/app/backup/IBackupManager$Stub$Proxy;
-Landroid/app/backup/IBackupManager$Stub;
-Landroid/app/backup/IBackupManager;
-Landroid/app/backup/IBackupManagerMonitor$Stub$Proxy;
-Landroid/app/backup/IBackupManagerMonitor$Stub;
-Landroid/app/backup/IBackupManagerMonitor;
-Landroid/app/backup/IBackupObserver$Stub$Proxy;
-Landroid/app/backup/IBackupObserver$Stub;
-Landroid/app/backup/IBackupObserver;
-Landroid/app/backup/IFullBackupRestoreObserver$Stub$Proxy;
-Landroid/app/backup/IFullBackupRestoreObserver$Stub;
-Landroid/app/backup/IFullBackupRestoreObserver;
-Landroid/app/backup/IRestoreSession;
-Landroid/app/backup/ISelectBackupTransportCallback$Stub$Proxy;
-Landroid/app/backup/ISelectBackupTransportCallback$Stub;
-Landroid/app/backup/ISelectBackupTransportCallback;
-Landroid/app/backup/RestoreDescription$1;
-Landroid/app/backup/RestoreDescription;
-Landroid/app/backup/SharedPreferencesBackupHelper;
-Landroid/app/blob/BlobHandle$1;
-Landroid/app/blob/BlobHandle;
-Landroid/app/blob/BlobStoreManager;
-Landroid/app/blob/BlobStoreManagerFrameworkInitializer$$ExternalSyntheticLambda0;
-Landroid/app/blob/BlobStoreManagerFrameworkInitializer;
-Landroid/app/blob/IBlobStoreManager$Stub$Proxy;
-Landroid/app/blob/IBlobStoreManager$Stub;
-Landroid/app/blob/IBlobStoreManager;
-Landroid/app/blob/IBlobStoreSession;
-Landroid/app/blob/LeaseInfo$1;
-Landroid/app/blob/LeaseInfo;
-Landroid/app/cloudsearch/CloudSearchManager;
-Landroid/app/compat/ChangeIdStateCache;
-Landroid/app/compat/ChangeIdStateQuery;
-Landroid/app/compat/CompatChanges;
-Landroid/app/contentsuggestions/ClassificationsRequest$1;
-Landroid/app/contentsuggestions/ClassificationsRequest;
-Landroid/app/contentsuggestions/ContentSelection$1;
-Landroid/app/contentsuggestions/ContentSelection;
-Landroid/app/contentsuggestions/ContentSuggestionsManager$SelectionsCallback;
-Landroid/app/contentsuggestions/ContentSuggestionsManager$SelectionsCallbackWrapper;
-Landroid/app/contentsuggestions/ContentSuggestionsManager;
-Landroid/app/contentsuggestions/IClassificationsCallback$Stub$Proxy;
-Landroid/app/contentsuggestions/IClassificationsCallback$Stub;
-Landroid/app/contentsuggestions/IClassificationsCallback;
-Landroid/app/contentsuggestions/IContentSuggestionsManager$Stub$Proxy;
-Landroid/app/contentsuggestions/IContentSuggestionsManager$Stub;
-Landroid/app/contentsuggestions/IContentSuggestionsManager;
-Landroid/app/contentsuggestions/ISelectionsCallback$Stub$Proxy;
-Landroid/app/contentsuggestions/ISelectionsCallback$Stub;
-Landroid/app/contentsuggestions/ISelectionsCallback;
-Landroid/app/contentsuggestions/SelectionsRequest$1;
-Landroid/app/contentsuggestions/SelectionsRequest$Builder;
-Landroid/app/contentsuggestions/SelectionsRequest-IA;
-Landroid/app/contentsuggestions/SelectionsRequest;
-Landroid/app/job/IJobCallback$Stub$Proxy;
-Landroid/app/job/IJobCallback$Stub;
-Landroid/app/job/IJobCallback;
-Landroid/app/job/IJobScheduler$Stub$Proxy;
-Landroid/app/job/IJobScheduler$Stub;
-Landroid/app/job/IJobScheduler;
-Landroid/app/job/IJobService$Stub$Proxy;
-Landroid/app/job/IJobService$Stub;
-Landroid/app/job/IJobService;
-Landroid/app/job/IUserVisibleJobObserver;
-Landroid/app/job/JobInfo$1;
-Landroid/app/job/JobInfo$Builder;
-Landroid/app/job/JobInfo$TriggerContentUri$1;
-Landroid/app/job/JobInfo$TriggerContentUri-IA;
-Landroid/app/job/JobInfo$TriggerContentUri;
-Landroid/app/job/JobInfo-IA;
-Landroid/app/job/JobInfo;
-Landroid/app/job/JobParameters$1;
-Landroid/app/job/JobParameters-IA;
-Landroid/app/job/JobParameters;
-Landroid/app/job/JobScheduler;
-Landroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda0;
-Landroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda1;
-Landroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda2;
-Landroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda3;
-Landroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda4;
-Landroid/app/job/JobSchedulerFrameworkInitializer;
-Landroid/app/job/JobService$1;
-Landroid/app/job/JobService;
-Landroid/app/job/JobServiceEngine$JobHandler;
-Landroid/app/job/JobServiceEngine$JobInterface;
-Landroid/app/job/JobServiceEngine;
-Landroid/app/job/JobWorkItem$1;
-Landroid/app/job/JobWorkItem;
-Landroid/app/people/IPeopleManager$Stub$Proxy;
-Landroid/app/people/IPeopleManager$Stub;
-Landroid/app/people/IPeopleManager;
-Landroid/app/people/PeopleManager;
-Landroid/app/prediction/AppPredictionContext$1;
-Landroid/app/prediction/AppPredictionContext-IA;
-Landroid/app/prediction/AppPredictionContext;
-Landroid/app/prediction/AppPredictionManager;
-Landroid/app/prediction/AppPredictionSessionId$1;
-Landroid/app/prediction/AppPredictionSessionId-IA;
-Landroid/app/prediction/AppPredictionSessionId;
-Landroid/app/prediction/AppPredictor$CallbackWrapper;
-Landroid/app/prediction/AppPredictor;
-Landroid/app/prediction/AppTarget$1;
-Landroid/app/prediction/AppTarget$Builder;
-Landroid/app/prediction/AppTarget-IA;
-Landroid/app/prediction/AppTarget;
-Landroid/app/prediction/AppTargetEvent$1;
-Landroid/app/prediction/AppTargetEvent-IA;
-Landroid/app/prediction/AppTargetEvent;
-Landroid/app/prediction/AppTargetId$1;
-Landroid/app/prediction/AppTargetId-IA;
-Landroid/app/prediction/AppTargetId;
-Landroid/app/prediction/IPredictionCallback$Stub$Proxy;
-Landroid/app/prediction/IPredictionCallback$Stub;
-Landroid/app/prediction/IPredictionCallback;
-Landroid/app/prediction/IPredictionManager$Stub$Proxy;
-Landroid/app/prediction/IPredictionManager$Stub;
-Landroid/app/prediction/IPredictionManager;
-Landroid/app/search/SearchUiManager;
-Landroid/app/servertransaction/ActivityConfigurationChangeItem$1;
-Landroid/app/servertransaction/ActivityConfigurationChangeItem-IA;
-Landroid/app/servertransaction/ActivityConfigurationChangeItem;
-Landroid/app/servertransaction/ActivityLifecycleItem;
-Landroid/app/servertransaction/ActivityRelaunchItem$1;
-Landroid/app/servertransaction/ActivityRelaunchItem;
-Landroid/app/servertransaction/ActivityResultItem$1;
-Landroid/app/servertransaction/ActivityResultItem-IA;
-Landroid/app/servertransaction/ActivityResultItem;
-Landroid/app/servertransaction/ActivityTransactionItem;
-Landroid/app/servertransaction/BaseClientRequest;
-Landroid/app/servertransaction/ClientTransaction$1;
-Landroid/app/servertransaction/ClientTransaction-IA;
-Landroid/app/servertransaction/ClientTransaction;
-Landroid/app/servertransaction/ClientTransactionItem;
-Landroid/app/servertransaction/ClientTransactionListenerController;
-Landroid/app/servertransaction/ConfigurationChangeItem$1;
-Landroid/app/servertransaction/ConfigurationChangeItem-IA;
-Landroid/app/servertransaction/ConfigurationChangeItem;
-Landroid/app/servertransaction/DestroyActivityItem$1;
-Landroid/app/servertransaction/DestroyActivityItem-IA;
-Landroid/app/servertransaction/DestroyActivityItem;
-Landroid/app/servertransaction/LaunchActivityItem$1;
-Landroid/app/servertransaction/LaunchActivityItem-IA;
-Landroid/app/servertransaction/LaunchActivityItem;
-Landroid/app/servertransaction/NewIntentItem$1;
-Landroid/app/servertransaction/NewIntentItem-IA;
-Landroid/app/servertransaction/NewIntentItem;
-Landroid/app/servertransaction/ObjectPool;
-Landroid/app/servertransaction/ObjectPoolItem;
-Landroid/app/servertransaction/PauseActivityItem$1;
-Landroid/app/servertransaction/PauseActivityItem-IA;
-Landroid/app/servertransaction/PauseActivityItem;
-Landroid/app/servertransaction/PendingTransactionActions$StopInfo;
-Landroid/app/servertransaction/PendingTransactionActions;
-Landroid/app/servertransaction/ResumeActivityItem$1;
-Landroid/app/servertransaction/ResumeActivityItem-IA;
-Landroid/app/servertransaction/ResumeActivityItem;
-Landroid/app/servertransaction/StartActivityItem$1;
-Landroid/app/servertransaction/StartActivityItem-IA;
-Landroid/app/servertransaction/StartActivityItem;
-Landroid/app/servertransaction/StopActivityItem$1;
-Landroid/app/servertransaction/StopActivityItem-IA;
-Landroid/app/servertransaction/StopActivityItem;
-Landroid/app/servertransaction/TopResumedActivityChangeItem$1;
-Landroid/app/servertransaction/TopResumedActivityChangeItem-IA;
-Landroid/app/servertransaction/TopResumedActivityChangeItem;
-Landroid/app/servertransaction/TransactionExecutor;
-Landroid/app/servertransaction/TransactionExecutorHelper;
-Landroid/app/servertransaction/WindowStateResizeItem$ResizeListener;
-Landroid/app/slice/ISliceManager$Stub$Proxy;
-Landroid/app/slice/ISliceManager$Stub;
-Landroid/app/slice/ISliceManager;
-Landroid/app/slice/Slice$1;
-Landroid/app/slice/Slice$Builder;
-Landroid/app/slice/Slice;
-Landroid/app/slice/SliceItem$1;
-Landroid/app/slice/SliceItem;
-Landroid/app/slice/SliceManager;
-Landroid/app/slice/SliceProvider$$ExternalSyntheticLambda0;
-Landroid/app/slice/SliceProvider;
-Landroid/app/slice/SliceSpec$1;
-Landroid/app/slice/SliceSpec;
-Landroid/app/smartspace/ISmartspaceCallback$Stub;
-Landroid/app/smartspace/ISmartspaceCallback;
-Landroid/app/smartspace/ISmartspaceManager$Stub$Proxy;
-Landroid/app/smartspace/ISmartspaceManager$Stub;
-Landroid/app/smartspace/ISmartspaceManager;
-Landroid/app/smartspace/SmartspaceAction$1;
-Landroid/app/smartspace/SmartspaceAction$Builder;
-Landroid/app/smartspace/SmartspaceAction;
-Landroid/app/smartspace/SmartspaceConfig$1;
-Landroid/app/smartspace/SmartspaceConfig$Builder;
-Landroid/app/smartspace/SmartspaceConfig;
-Landroid/app/smartspace/SmartspaceManager;
-Landroid/app/smartspace/SmartspaceSession$$ExternalSyntheticLambda0;
-Landroid/app/smartspace/SmartspaceSession$CallbackWrapper$$ExternalSyntheticLambda0;
-Landroid/app/smartspace/SmartspaceSession$CallbackWrapper;
-Landroid/app/smartspace/SmartspaceSession$OnTargetsAvailableListener;
-Landroid/app/smartspace/SmartspaceSession$Token;
-Landroid/app/smartspace/SmartspaceSession;
-Landroid/app/smartspace/SmartspaceSessionId$1;
-Landroid/app/smartspace/SmartspaceSessionId;
-Landroid/app/smartspace/SmartspaceTarget$1;
-Landroid/app/smartspace/SmartspaceTarget$Builder;
-Landroid/app/smartspace/SmartspaceTarget;
-Landroid/app/smartspace/SmartspaceTargetEvent$1;
-Landroid/app/smartspace/SmartspaceTargetEvent$Builder;
-Landroid/app/smartspace/SmartspaceTargetEvent;
-Landroid/app/smartspace/uitemplatedata/BaseTemplateData$1;
-Landroid/app/smartspace/uitemplatedata/BaseTemplateData$SubItemInfo$1;
-Landroid/app/smartspace/uitemplatedata/BaseTemplateData$SubItemInfo;
-Landroid/app/smartspace/uitemplatedata/BaseTemplateData$SubItemLoggingInfo$1;
-Landroid/app/smartspace/uitemplatedata/BaseTemplateData$SubItemLoggingInfo;
-Landroid/app/smartspace/uitemplatedata/BaseTemplateData;
-Landroid/app/smartspace/uitemplatedata/Icon$1;
-Landroid/app/smartspace/uitemplatedata/Icon;
-Landroid/app/smartspace/uitemplatedata/TapAction$1;
-Landroid/app/smartspace/uitemplatedata/TapAction;
-Landroid/app/smartspace/uitemplatedata/Text$1;
-Landroid/app/smartspace/uitemplatedata/Text;
-Landroid/app/tare/EconomyManager;
-Landroid/app/time/ITimeZoneDetectorListener$Stub$Proxy;
-Landroid/app/time/ITimeZoneDetectorListener$Stub;
-Landroid/app/time/ITimeZoneDetectorListener;
-Landroid/app/time/TimeManager;
-Landroid/app/time/TimeZoneCapabilities$1;
-Landroid/app/time/TimeZoneCapabilities$Builder;
-Landroid/app/time/TimeZoneCapabilities-IA;
-Landroid/app/time/TimeZoneCapabilities;
-Landroid/app/time/TimeZoneCapabilitiesAndConfig$1;
-Landroid/app/time/TimeZoneCapabilitiesAndConfig;
-Landroid/app/time/TimeZoneConfiguration$1;
-Landroid/app/time/TimeZoneConfiguration$Builder;
-Landroid/app/time/TimeZoneConfiguration-IA;
-Landroid/app/time/TimeZoneConfiguration;
-Landroid/app/timedetector/ITimeDetectorService$Stub$Proxy;
-Landroid/app/timedetector/ITimeDetectorService$Stub;
-Landroid/app/timedetector/ITimeDetectorService;
-Landroid/app/timedetector/ManualTimeSuggestion$1;
-Landroid/app/timedetector/ManualTimeSuggestion;
-Landroid/app/timedetector/TelephonyTimeSuggestion$1;
-Landroid/app/timedetector/TelephonyTimeSuggestion$Builder;
-Landroid/app/timedetector/TelephonyTimeSuggestion;
-Landroid/app/timedetector/TimeDetector;
-Landroid/app/timedetector/TimeDetectorImpl;
-Landroid/app/timezonedetector/ITimeZoneDetectorService$Stub$Proxy;
-Landroid/app/timezonedetector/ITimeZoneDetectorService$Stub;
-Landroid/app/timezonedetector/ITimeZoneDetectorService;
-Landroid/app/timezonedetector/ManualTimeZoneSuggestion$1;
-Landroid/app/timezonedetector/ManualTimeZoneSuggestion;
-Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$1;
-Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;
-Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion-IA;
-Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion;
-Landroid/app/timezonedetector/TimeZoneDetector;
-Landroid/app/trust/IStrongAuthTracker$Stub$Proxy;
-Landroid/app/trust/IStrongAuthTracker$Stub;
-Landroid/app/trust/IStrongAuthTracker;
-Landroid/app/trust/ITrustListener$Stub$Proxy;
-Landroid/app/trust/ITrustListener$Stub;
-Landroid/app/trust/ITrustListener;
-Landroid/app/trust/ITrustManager$Stub$Proxy;
-Landroid/app/trust/ITrustManager$Stub;
-Landroid/app/trust/ITrustManager;
-Landroid/app/trust/TrustManager$1;
-Landroid/app/trust/TrustManager$2;
-Landroid/app/trust/TrustManager$TrustListener;
-Landroid/app/trust/TrustManager;
-Landroid/app/usage/AppStandbyInfo$1;
-Landroid/app/usage/AppStandbyInfo-IA;
-Landroid/app/usage/AppStandbyInfo;
-Landroid/app/usage/CacheQuotaHint$1;
-Landroid/app/usage/CacheQuotaHint$Builder;
-Landroid/app/usage/CacheQuotaHint;
-Landroid/app/usage/CacheQuotaService$CacheQuotaServiceWrapper;
-Landroid/app/usage/CacheQuotaService$ServiceHandler;
-Landroid/app/usage/CacheQuotaService;
-Landroid/app/usage/ConfigurationStats$1;
-Landroid/app/usage/ConfigurationStats;
-Landroid/app/usage/EventList;
-Landroid/app/usage/ExternalStorageStats$1;
-Landroid/app/usage/ExternalStorageStats;
-Landroid/app/usage/Flags;
-Landroid/app/usage/ICacheQuotaService$Stub$Proxy;
-Landroid/app/usage/ICacheQuotaService$Stub;
-Landroid/app/usage/ICacheQuotaService;
-Landroid/app/usage/IStorageStatsManager$Stub$Proxy;
-Landroid/app/usage/IStorageStatsManager$Stub;
-Landroid/app/usage/IStorageStatsManager;
-Landroid/app/usage/IUsageStatsManager$Stub$Proxy;
-Landroid/app/usage/IUsageStatsManager$Stub;
-Landroid/app/usage/IUsageStatsManager;
-Landroid/app/usage/StorageStats$1;
-Landroid/app/usage/StorageStats;
-Landroid/app/usage/StorageStatsManager;
-Landroid/app/usage/UsageEvents$1;
-Landroid/app/usage/UsageEvents$Event$UserInteractionEventExtrasToken;
-Landroid/app/usage/UsageEvents$Event;
-Landroid/app/usage/UsageEvents;
-Landroid/app/usage/UsageStats$1;
-Landroid/app/usage/UsageStats;
-Landroid/app/usage/UsageStatsManager;
-Landroid/app/wallpapereffectsgeneration/WallpaperEffectsGenerationManager;
-Landroid/app/wearable/WearableSensingManager;
-Landroid/apphibernation/AppHibernationManager;
-Landroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda0;
-Landroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda10;
-Landroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda1;
-Landroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda2;
-Landroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda3;
-Landroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda4;
-Landroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda5;
-Landroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda6;
-Landroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda7;
-Landroid/appwidget/AppWidgetManager;
-Landroid/appwidget/AppWidgetManagerInternal;
-Landroid/appwidget/AppWidgetProvider;
-Landroid/appwidget/AppWidgetProviderInfo$1;
-Landroid/appwidget/AppWidgetProviderInfo;
-Landroid/appwidget/PendingHostUpdate$1;
-Landroid/appwidget/PendingHostUpdate;
-Landroid/appwidget/flags/Flags;
-Landroid/attention/AttentionManagerInternal$AttentionCallbackInternal;
-Landroid/attention/AttentionManagerInternal;
-Landroid/audio/policy/configuration/V7_0/AudioUsage;
-Landroid/companion/AssociationInfo$1;
-Landroid/companion/AssociationInfo;
-Landroid/companion/AssociationRequest$1;
-Landroid/companion/AssociationRequest;
-Landroid/companion/CompanionDeviceManager;
-Landroid/companion/ICompanionDeviceManager$Stub$Proxy;
-Landroid/companion/ICompanionDeviceManager$Stub;
-Landroid/companion/ICompanionDeviceManager;
-Landroid/companion/virtual/IVirtualDevice$Stub$Proxy;
-Landroid/companion/virtual/IVirtualDevice$Stub;
-Landroid/companion/virtual/IVirtualDevice;
-Landroid/companion/virtual/IVirtualDeviceManager$Stub$Proxy;
-Landroid/companion/virtual/IVirtualDeviceManager$Stub;
-Landroid/companion/virtual/IVirtualDeviceManager;
-Landroid/companion/virtual/VirtualDeviceManager;
-Landroid/companion/virtual/flags/FeatureFlags;
-Landroid/companion/virtual/flags/FeatureFlagsImpl;
-Landroid/companion/virtual/flags/Flags;
-Landroid/compat/Compatibility$1;
-Landroid/compat/Compatibility$BehaviorChangeDelegate;
-Landroid/compat/Compatibility$ChangeConfig;
-Landroid/compat/Compatibility;
-Landroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl-IA;
-Landroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;
-Landroid/content/AbstractThreadedSyncAdapter$SyncThread-IA;
-Landroid/content/AbstractThreadedSyncAdapter$SyncThread;
-Landroid/content/AbstractThreadedSyncAdapter;
-Landroid/content/ActivityNotFoundException;
-Landroid/content/ApexEnvironment;
-Landroid/content/AsyncQueryHandler$WorkerArgs;
-Landroid/content/AsyncQueryHandler$WorkerHandler;
-Landroid/content/AsyncQueryHandler;
-Landroid/content/AsyncTaskLoader$LoadTask;
-Landroid/content/AsyncTaskLoader;
-Landroid/content/Attributable;
-Landroid/content/AttributionSource$1;
-Landroid/content/AttributionSource$Builder;
-Landroid/content/AttributionSource$ScopedParcelState;
-Landroid/content/AttributionSource;
-Landroid/content/AttributionSourceState$1;
-Landroid/content/AttributionSourceState;
-Landroid/content/AutofillOptions$1;
-Landroid/content/AutofillOptions;
-Landroid/content/BroadcastReceiver$PendingResult$1;
-Landroid/content/BroadcastReceiver$PendingResult;
-Landroid/content/BroadcastReceiver;
-Landroid/content/ClipData$1;
-Landroid/content/ClipData$Item-IA;
-Landroid/content/ClipData$Item;
-Landroid/content/ClipData;
-Landroid/content/ClipDescription$1;
-Landroid/content/ClipDescription;
-Landroid/content/ClipboardManager$1;
-Landroid/content/ClipboardManager$OnPrimaryClipChangedListener;
-Landroid/content/ClipboardManager;
-Landroid/content/ComponentCallbacks2;
-Landroid/content/ComponentCallbacks;
-Landroid/content/ComponentCallbacksController$$ExternalSyntheticLambda0;
-Landroid/content/ComponentCallbacksController$$ExternalSyntheticLambda1;
-Landroid/content/ComponentCallbacksController$$ExternalSyntheticLambda2;
-Landroid/content/ComponentCallbacksController;
-Landroid/content/ComponentName$1;
-Landroid/content/ComponentName$WithComponentName;
-Landroid/content/ComponentName;
-Landroid/content/ContentCaptureOptions$1;
-Landroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda0;
-Landroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda1;
-Landroid/content/ContentCaptureOptions$ContentProtectionOptions;
-Landroid/content/ContentCaptureOptions;
-Landroid/content/ContentInterface;
-Landroid/content/ContentProvider$1;
-Landroid/content/ContentProvider$CallingIdentity;
-Landroid/content/ContentProvider$PipeDataWriter;
-Landroid/content/ContentProvider$Transport;
-Landroid/content/ContentProvider;
-Landroid/content/ContentProviderClient$CursorWrapperInner;
-Landroid/content/ContentProviderClient$NotRespondingRunnable-IA;
-Landroid/content/ContentProviderClient$NotRespondingRunnable;
-Landroid/content/ContentProviderClient;
-Landroid/content/ContentProviderNative;
-Landroid/content/ContentProviderOperation$1;
-Landroid/content/ContentProviderOperation$BackReference$1;
-Landroid/content/ContentProviderOperation$BackReference;
-Landroid/content/ContentProviderOperation$Builder-IA;
-Landroid/content/ContentProviderOperation$Builder;
-Landroid/content/ContentProviderOperation-IA;
-Landroid/content/ContentProviderOperation;
-Landroid/content/ContentProviderProxy;
-Landroid/content/ContentProviderResult$1;
-Landroid/content/ContentProviderResult;
-Landroid/content/ContentResolver$1;
-Landroid/content/ContentResolver$2;
-Landroid/content/ContentResolver$CursorWrapperInner;
-Landroid/content/ContentResolver$OpenResourceIdResult;
-Landroid/content/ContentResolver$ParcelFileDescriptorInner;
-Landroid/content/ContentResolver$ResultListener-IA;
-Landroid/content/ContentResolver$ResultListener;
-Landroid/content/ContentResolver$StringResultListener-IA;
-Landroid/content/ContentResolver$StringResultListener;
-Landroid/content/ContentResolver$UriResultListener;
-Landroid/content/ContentResolver;
-Landroid/content/ContentUris;
-Landroid/content/ContentValues$1;
-Landroid/content/ContentValues-IA;
-Landroid/content/ContentValues;
-Landroid/content/Context;
-Landroid/content/ContextParams$Builder;
-Landroid/content/ContextParams-IA;
-Landroid/content/ContextParams;
-Landroid/content/ContextWrapper;
-Landroid/content/CursorLoader;
-Landroid/content/DialogInterface$OnCancelListener;
-Landroid/content/DialogInterface$OnClickListener;
-Landroid/content/DialogInterface$OnDismissListener;
-Landroid/content/DialogInterface$OnKeyListener;
-Landroid/content/DialogInterface$OnShowListener;
-Landroid/content/DialogInterface;
-Landroid/content/IClipboard$Stub$Proxy;
-Landroid/content/IClipboard$Stub;
-Landroid/content/IClipboard;
-Landroid/content/IContentProvider;
-Landroid/content/IContentService$Stub$Proxy;
-Landroid/content/IContentService$Stub;
-Landroid/content/IContentService;
-Landroid/content/IIntentReceiver$Stub;
-Landroid/content/IIntentReceiver;
-Landroid/content/IIntentSender$Stub$Proxy;
-Landroid/content/IIntentSender$Stub;
-Landroid/content/IIntentSender;
-Landroid/content/IOnPrimaryClipChangedListener$Stub$Proxy;
-Landroid/content/IOnPrimaryClipChangedListener$Stub;
-Landroid/content/IOnPrimaryClipChangedListener;
-Landroid/content/IRestrictionsManager$Stub$Proxy;
-Landroid/content/IRestrictionsManager$Stub;
-Landroid/content/IRestrictionsManager;
-Landroid/content/ISyncAdapter$Stub$Proxy;
-Landroid/content/ISyncAdapter$Stub;
-Landroid/content/ISyncAdapter;
-Landroid/content/ISyncAdapterUnsyncableAccountCallback$Stub$Proxy;
-Landroid/content/ISyncAdapterUnsyncableAccountCallback$Stub;
-Landroid/content/ISyncAdapterUnsyncableAccountCallback;
-Landroid/content/ISyncContext$Stub$Proxy;
-Landroid/content/ISyncContext$Stub;
-Landroid/content/ISyncContext;
-Landroid/content/ISyncStatusObserver$Stub$Proxy;
-Landroid/content/ISyncStatusObserver$Stub;
-Landroid/content/ISyncStatusObserver;
-Landroid/content/Intent$1;
-Landroid/content/Intent$CommandOptionHandler;
-Landroid/content/Intent$FilterComparison;
-Landroid/content/Intent;
-Landroid/content/IntentFilter$$ExternalSyntheticLambda0;
-Landroid/content/IntentFilter$$ExternalSyntheticLambda2;
-Landroid/content/IntentFilter$1;
-Landroid/content/IntentFilter$AuthorityEntry;
-Landroid/content/IntentFilter$MalformedMimeTypeException;
-Landroid/content/IntentFilter;
-Landroid/content/IntentSender$1;
-Landroid/content/IntentSender$FinishedDispatcher;
-Landroid/content/IntentSender$OnFinished;
-Landroid/content/IntentSender$SendIntentException;
-Landroid/content/IntentSender;
-Landroid/content/Loader$ForceLoadContentObserver;
-Landroid/content/Loader$OnLoadCanceledListener;
-Landroid/content/Loader$OnLoadCompleteListener;
-Landroid/content/Loader;
-Landroid/content/LocusId$1;
-Landroid/content/LocusId;
-Landroid/content/LoggingContentInterface;
-Landroid/content/MutableContextWrapper;
-Landroid/content/OperationApplicationException;
-Landroid/content/PeriodicSync$1;
-Landroid/content/PeriodicSync-IA;
-Landroid/content/PeriodicSync;
-Landroid/content/PermissionChecker;
-Landroid/content/ReceiverCallNotAllowedException;
-Landroid/content/RestrictionEntry$1;
-Landroid/content/RestrictionEntry;
-Landroid/content/RestrictionsManager;
-Landroid/content/SearchRecentSuggestionsProvider$DatabaseHelper;
-Landroid/content/SearchRecentSuggestionsProvider;
-Landroid/content/ServiceConnection;
-Landroid/content/SharedPreferences$Editor;
-Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;
-Landroid/content/SharedPreferences;
-Landroid/content/SyncAdapterType$1;
-Landroid/content/SyncAdapterType;
-Landroid/content/SyncAdaptersCache$MySerializer;
-Landroid/content/SyncAdaptersCache;
-Landroid/content/SyncContext;
-Landroid/content/SyncInfo$1;
-Landroid/content/SyncInfo;
-Landroid/content/SyncRequest$1;
-Landroid/content/SyncRequest$Builder;
-Landroid/content/SyncRequest;
-Landroid/content/SyncResult$1;
-Landroid/content/SyncResult;
-Landroid/content/SyncStats$1;
-Landroid/content/SyncStats;
-Landroid/content/SyncStatusInfo$1;
-Landroid/content/SyncStatusInfo$Stats;
-Landroid/content/SyncStatusInfo;
-Landroid/content/SyncStatusObserver;
-Landroid/content/UndoManager$UndoState;
-Landroid/content/UndoManager;
-Landroid/content/UndoOperation;
-Landroid/content/UndoOwner;
-Landroid/content/UriMatcher;
-Landroid/content/UriPermission$1;
-Landroid/content/UriPermission;
-Landroid/content/UriRelativeFilterGroup;
-Landroid/content/integrity/AppIntegrityManager;
-Landroid/content/integrity/AtomicFormula$StringAtomicFormula$1;
-Landroid/content/integrity/AtomicFormula$StringAtomicFormula;
-Landroid/content/integrity/AtomicFormula;
-Landroid/content/integrity/CompoundFormula$1;
-Landroid/content/integrity/CompoundFormula;
-Landroid/content/integrity/IAppIntegrityManager$Stub;
-Landroid/content/integrity/IAppIntegrityManager;
-Landroid/content/integrity/InstallerAllowedByManifestFormula$1;
-Landroid/content/integrity/InstallerAllowedByManifestFormula;
-Landroid/content/integrity/IntegrityFormula;
-Landroid/content/integrity/IntegrityUtils;
-Landroid/content/integrity/Rule$1;
-Landroid/content/integrity/Rule;
-Landroid/content/om/CriticalOverlayInfo;
-Landroid/content/om/IOverlayManager$Stub$Proxy;
-Landroid/content/om/IOverlayManager$Stub;
-Landroid/content/om/IOverlayManager;
-Landroid/content/om/OverlayIdentifier$1;
-Landroid/content/om/OverlayIdentifier;
-Landroid/content/om/OverlayInfo$1;
-Landroid/content/om/OverlayInfo;
-Landroid/content/om/OverlayManager;
-Landroid/content/om/OverlayableInfo;
-Landroid/content/pm/ActivityInfo$1;
-Landroid/content/pm/ActivityInfo$WindowLayout;
-Landroid/content/pm/ActivityInfo-IA;
-Landroid/content/pm/ActivityInfo;
-Landroid/content/pm/ActivityPresentationInfo;
-Landroid/content/pm/AndroidTestBaseUpdater;
-Landroid/content/pm/ApkChecksum$1;
-Landroid/content/pm/ApkChecksum;
-Landroid/content/pm/ApplicationInfo$1$$ExternalSyntheticLambda0;
-Landroid/content/pm/ApplicationInfo$1;
-Landroid/content/pm/ApplicationInfo-IA;
-Landroid/content/pm/ApplicationInfo;
-Landroid/content/pm/ArchivedPackageParcel;
-Landroid/content/pm/Attribution$1;
-Landroid/content/pm/Attribution;
-Landroid/content/pm/AuxiliaryResolveInfo$AuxiliaryFilter;
-Landroid/content/pm/AuxiliaryResolveInfo;
-Landroid/content/pm/BaseParceledListSlice$1;
-Landroid/content/pm/BaseParceledListSlice;
-Landroid/content/pm/ChangedPackages$1;
-Landroid/content/pm/ChangedPackages;
-Landroid/content/pm/Checksum$1;
-Landroid/content/pm/Checksum$Type;
-Landroid/content/pm/Checksum;
-Landroid/content/pm/ComponentInfo;
-Landroid/content/pm/ConfigurationInfo$1;
-Landroid/content/pm/ConfigurationInfo-IA;
-Landroid/content/pm/ConfigurationInfo;
-Landroid/content/pm/CrossProfileApps;
-Landroid/content/pm/CrossProfileAppsInternal;
-Landroid/content/pm/DataLoaderManager;
-Landroid/content/pm/DataLoaderParams;
-Landroid/content/pm/DataLoaderParamsParcel$1;
-Landroid/content/pm/DataLoaderParamsParcel;
-Landroid/content/pm/FallbackCategoryProvider;
-Landroid/content/pm/FeatureFlags;
-Landroid/content/pm/FeatureFlagsImpl;
-Landroid/content/pm/FeatureGroupInfo$1;
-Landroid/content/pm/FeatureGroupInfo;
-Landroid/content/pm/FeatureInfo$1;
-Landroid/content/pm/FeatureInfo-IA;
-Landroid/content/pm/FeatureInfo;
-Landroid/content/pm/FileSystemControlParcel$1;
-Landroid/content/pm/FileSystemControlParcel;
-Landroid/content/pm/Flags;
-Landroid/content/pm/ICrossProfileApps$Stub$Proxy;
-Landroid/content/pm/ICrossProfileApps$Stub;
-Landroid/content/pm/ICrossProfileApps;
-Landroid/content/pm/IDataLoader;
-Landroid/content/pm/IDataLoaderManager$Stub$Proxy;
-Landroid/content/pm/IDataLoaderManager$Stub;
-Landroid/content/pm/IDataLoaderManager;
-Landroid/content/pm/IDataLoaderStatusListener$Stub$Proxy;
-Landroid/content/pm/IDataLoaderStatusListener$Stub;
-Landroid/content/pm/IDataLoaderStatusListener;
-Landroid/content/pm/IDexModuleRegisterCallback$Stub$Proxy;
-Landroid/content/pm/IDexModuleRegisterCallback$Stub;
-Landroid/content/pm/IDexModuleRegisterCallback;
-Landroid/content/pm/ILauncherApps$Stub$Proxy;
-Landroid/content/pm/ILauncherApps$Stub;
-Landroid/content/pm/ILauncherApps;
-Landroid/content/pm/IOnAppsChangedListener$Stub$Proxy;
-Landroid/content/pm/IOnAppsChangedListener$Stub;
-Landroid/content/pm/IOnAppsChangedListener;
-Landroid/content/pm/IOnChecksumsReadyListener$Stub$Proxy;
-Landroid/content/pm/IOnChecksumsReadyListener$Stub;
-Landroid/content/pm/IOnChecksumsReadyListener;
-Landroid/content/pm/IOtaDexopt$Stub;
-Landroid/content/pm/IOtaDexopt;
-Landroid/content/pm/IPackageDataObserver$Stub$Proxy;
-Landroid/content/pm/IPackageDataObserver$Stub;
-Landroid/content/pm/IPackageDataObserver;
-Landroid/content/pm/IPackageDeleteObserver$Stub$Proxy;
-Landroid/content/pm/IPackageDeleteObserver$Stub;
-Landroid/content/pm/IPackageDeleteObserver2$Stub$Proxy;
-Landroid/content/pm/IPackageDeleteObserver2$Stub;
-Landroid/content/pm/IPackageDeleteObserver2;
-Landroid/content/pm/IPackageDeleteObserver;
-Landroid/content/pm/IPackageInstallObserver2$Stub;
-Landroid/content/pm/IPackageInstallObserver2;
-Landroid/content/pm/IPackageInstaller$Stub$Proxy;
-Landroid/content/pm/IPackageInstaller$Stub;
-Landroid/content/pm/IPackageInstaller;
-Landroid/content/pm/IPackageInstallerCallback$Stub$Proxy;
-Landroid/content/pm/IPackageInstallerCallback$Stub;
-Landroid/content/pm/IPackageInstallerCallback;
-Landroid/content/pm/IPackageInstallerSession$Stub$Proxy;
-Landroid/content/pm/IPackageInstallerSession$Stub;
-Landroid/content/pm/IPackageInstallerSession;
-Landroid/content/pm/IPackageManager$Stub$$ExternalSyntheticLambda0;
-Landroid/content/pm/IPackageManager$Stub$$ExternalSyntheticLambda1;
-Landroid/content/pm/IPackageManager$Stub$Proxy$$ExternalSyntheticLambda0;
-Landroid/content/pm/IPackageManager$Stub$Proxy$$ExternalSyntheticLambda1;
-Landroid/content/pm/IPackageManager$Stub$Proxy;
-Landroid/content/pm/IPackageManager$Stub;
-Landroid/content/pm/IPackageManager;
-Landroid/content/pm/IPackageManagerNative$Stub;
-Landroid/content/pm/IPackageManagerNative;
-Landroid/content/pm/IPackageMoveObserver$Stub$Proxy;
-Landroid/content/pm/IPackageMoveObserver$Stub;
-Landroid/content/pm/IPackageMoveObserver;
-Landroid/content/pm/IPackageStatsObserver$Stub$Proxy;
-Landroid/content/pm/IPackageStatsObserver$Stub;
-Landroid/content/pm/IPackageStatsObserver;
-Landroid/content/pm/IShortcutChangeCallback$Stub$Proxy;
-Landroid/content/pm/IShortcutChangeCallback$Stub;
-Landroid/content/pm/IShortcutChangeCallback;
-Landroid/content/pm/IShortcutService$Stub$Proxy;
-Landroid/content/pm/IShortcutService$Stub;
-Landroid/content/pm/IShortcutService;
-Landroid/content/pm/IncrementalStatesInfo$1;
-Landroid/content/pm/IncrementalStatesInfo;
-Landroid/content/pm/InstallSourceInfo$1;
-Landroid/content/pm/InstallSourceInfo;
-Landroid/content/pm/InstantAppIntentFilter$1;
-Landroid/content/pm/InstantAppIntentFilter;
-Landroid/content/pm/InstantAppRequest;
-Landroid/content/pm/InstantAppRequestInfo$1;
-Landroid/content/pm/InstantAppRequestInfo;
-Landroid/content/pm/InstantAppResolveInfo$1;
-Landroid/content/pm/InstantAppResolveInfo$InstantAppDigest$1;
-Landroid/content/pm/InstantAppResolveInfo$InstantAppDigest;
-Landroid/content/pm/InstantAppResolveInfo;
-Landroid/content/pm/InstrumentationInfo$1;
-Landroid/content/pm/InstrumentationInfo;
-Landroid/content/pm/IntentFilterVerificationInfo$1;
-Landroid/content/pm/IntentFilterVerificationInfo;
-Landroid/content/pm/KeySet$1;
-Landroid/content/pm/KeySet;
-Landroid/content/pm/LauncherActivityInfo;
-Landroid/content/pm/LauncherActivityInfoInternal$1;
-Landroid/content/pm/LauncherActivityInfoInternal;
-Landroid/content/pm/LauncherApps$1;
-Landroid/content/pm/LauncherApps$AppUsageLimit$1;
-Landroid/content/pm/LauncherApps$AppUsageLimit;
-Landroid/content/pm/LauncherApps$Callback;
-Landroid/content/pm/LauncherApps$CallbackMessageHandler$CallbackInfo-IA;
-Landroid/content/pm/LauncherApps$CallbackMessageHandler$CallbackInfo;
-Landroid/content/pm/LauncherApps$CallbackMessageHandler;
-Landroid/content/pm/LauncherApps$ShortcutQuery$QueryFlags;
-Landroid/content/pm/LauncherApps$ShortcutQuery;
-Landroid/content/pm/LauncherApps;
-Landroid/content/pm/ModuleInfo$1;
-Landroid/content/pm/ModuleInfo-IA;
-Landroid/content/pm/ModuleInfo;
-Landroid/content/pm/PackageInfo$1;
-Landroid/content/pm/PackageInfo-IA;
-Landroid/content/pm/PackageInfo;
-Landroid/content/pm/PackageInfoLite$1;
-Landroid/content/pm/PackageInfoLite;
-Landroid/content/pm/PackageInstaller$Session;
-Landroid/content/pm/PackageInstaller$SessionCallback;
-Landroid/content/pm/PackageInstaller$SessionCallbackDelegate$$ExternalSyntheticLambda0;
-Landroid/content/pm/PackageInstaller$SessionCallbackDelegate$$ExternalSyntheticLambda1;
-Landroid/content/pm/PackageInstaller$SessionCallbackDelegate$$ExternalSyntheticLambda2;
-Landroid/content/pm/PackageInstaller$SessionCallbackDelegate$$ExternalSyntheticLambda3;
-Landroid/content/pm/PackageInstaller$SessionCallbackDelegate$$ExternalSyntheticLambda4;
-Landroid/content/pm/PackageInstaller$SessionCallbackDelegate;
-Landroid/content/pm/PackageInstaller$SessionInfo$1;
-Landroid/content/pm/PackageInstaller$SessionInfo;
-Landroid/content/pm/PackageInstaller$SessionParams$1;
-Landroid/content/pm/PackageInstaller$SessionParams;
-Landroid/content/pm/PackageInstaller;
-Landroid/content/pm/PackageItemInfo;
-Landroid/content/pm/PackageManager$1;
-Landroid/content/pm/PackageManager$2;
-Landroid/content/pm/PackageManager$3;
-Landroid/content/pm/PackageManager$ApplicationInfoFlags;
-Landroid/content/pm/PackageManager$ApplicationInfoQuery;
-Landroid/content/pm/PackageManager$ComponentEnabledSetting$1;
-Landroid/content/pm/PackageManager$ComponentEnabledSetting;
-Landroid/content/pm/PackageManager$ComponentInfoFlags;
-Landroid/content/pm/PackageManager$Flags;
-Landroid/content/pm/PackageManager$MoveCallback;
-Landroid/content/pm/PackageManager$NameNotFoundException;
-Landroid/content/pm/PackageManager$OnChecksumsReadyListener;
-Landroid/content/pm/PackageManager$OnPermissionsChangedListener;
-Landroid/content/pm/PackageManager$PackageInfoFlags;
-Landroid/content/pm/PackageManager$PackageInfoQuery;
-Landroid/content/pm/PackageManager$Property$1;
-Landroid/content/pm/PackageManager$Property;
-Landroid/content/pm/PackageManager$ResolveInfoFlags;
-Landroid/content/pm/PackageManager;
-Landroid/content/pm/PackageParser$Activity$1;
-Landroid/content/pm/PackageParser$Activity-IA;
-Landroid/content/pm/PackageParser$Activity;
-Landroid/content/pm/PackageParser$ActivityIntentInfo;
-Landroid/content/pm/PackageParser$ApkLite;
-Landroid/content/pm/PackageParser$CachedComponentArgs;
-Landroid/content/pm/PackageParser$Callback;
-Landroid/content/pm/PackageParser$CallbackImpl;
-Landroid/content/pm/PackageParser$Component;
-Landroid/content/pm/PackageParser$DefaultSplitAssetLoader;
-Landroid/content/pm/PackageParser$Instrumentation$1;
-Landroid/content/pm/PackageParser$Instrumentation;
-Landroid/content/pm/PackageParser$IntentInfo;
-Landroid/content/pm/PackageParser$NewPermissionInfo;
-Landroid/content/pm/PackageParser$Package$1;
-Landroid/content/pm/PackageParser$Package;
-Landroid/content/pm/PackageParser$PackageLite;
-Landroid/content/pm/PackageParser$PackageParserException;
-Landroid/content/pm/PackageParser$ParseComponentArgs;
-Landroid/content/pm/PackageParser$ParsePackageItemArgs;
-Landroid/content/pm/PackageParser$Permission$1;
-Landroid/content/pm/PackageParser$Permission-IA;
-Landroid/content/pm/PackageParser$Permission;
-Landroid/content/pm/PackageParser$PermissionGroup$1;
-Landroid/content/pm/PackageParser$PermissionGroup;
-Landroid/content/pm/PackageParser$Provider$1;
-Landroid/content/pm/PackageParser$Provider-IA;
-Landroid/content/pm/PackageParser$Provider;
-Landroid/content/pm/PackageParser$ProviderIntentInfo;
-Landroid/content/pm/PackageParser$Service$1;
-Landroid/content/pm/PackageParser$Service-IA;
-Landroid/content/pm/PackageParser$Service;
-Landroid/content/pm/PackageParser$ServiceIntentInfo;
-Landroid/content/pm/PackageParser$SigningDetails$1;
-Landroid/content/pm/PackageParser$SigningDetails$Builder;
-Landroid/content/pm/PackageParser$SigningDetails;
-Landroid/content/pm/PackageParser$SplitAssetLoader;
-Landroid/content/pm/PackageParser$SplitDependencyLoader$IllegalDependencyException;
-Landroid/content/pm/PackageParser$SplitNameComparator;
-Landroid/content/pm/PackageParser;
-Landroid/content/pm/PackageParserCacheHelper$ReadHelper;
-Landroid/content/pm/PackageParserCacheHelper$WriteHelper;
-Landroid/content/pm/PackagePartitions$DeferredCanonicalFile;
-Landroid/content/pm/PackagePartitions$SystemPartition;
-Landroid/content/pm/PackagePartitions;
-Landroid/content/pm/PackageStats$1;
-Landroid/content/pm/PackageStats;
-Landroid/content/pm/ParceledListSlice$1;
-Landroid/content/pm/ParceledListSlice-IA;
-Landroid/content/pm/ParceledListSlice;
-Landroid/content/pm/PathPermission$1;
-Landroid/content/pm/PathPermission;
-Landroid/content/pm/PermissionGroupInfo$1;
-Landroid/content/pm/PermissionGroupInfo;
-Landroid/content/pm/PermissionInfo$1;
-Landroid/content/pm/PermissionInfo-IA;
-Landroid/content/pm/PermissionInfo;
-Landroid/content/pm/ProviderInfo$1;
-Landroid/content/pm/ProviderInfo-IA;
-Landroid/content/pm/ProviderInfo;
-Landroid/content/pm/ProviderInfoList$1;
-Landroid/content/pm/ProviderInfoList-IA;
-Landroid/content/pm/ProviderInfoList;
-Landroid/content/pm/RegisteredServicesCache$1;
-Landroid/content/pm/RegisteredServicesCache$2;
-Landroid/content/pm/RegisteredServicesCache$3;
-Landroid/content/pm/RegisteredServicesCache$ServiceInfo;
-Landroid/content/pm/RegisteredServicesCache$UserServices;
-Landroid/content/pm/RegisteredServicesCache;
-Landroid/content/pm/RegisteredServicesCacheListener;
-Landroid/content/pm/ResolveInfo$1;
-Landroid/content/pm/ResolveInfo-IA;
-Landroid/content/pm/ResolveInfo;
-Landroid/content/pm/ServiceInfo$1;
-Landroid/content/pm/ServiceInfo-IA;
-Landroid/content/pm/ServiceInfo;
-Landroid/content/pm/SharedLibraryInfo$1;
-Landroid/content/pm/SharedLibraryInfo-IA;
-Landroid/content/pm/SharedLibraryInfo;
-Landroid/content/pm/ShortcutInfo$$ExternalSyntheticLambda0;
-Landroid/content/pm/ShortcutInfo$$ExternalSyntheticLambda1;
-Landroid/content/pm/ShortcutInfo$1;
-Landroid/content/pm/ShortcutInfo$Builder;
-Landroid/content/pm/ShortcutInfo-IA;
-Landroid/content/pm/ShortcutInfo;
-Landroid/content/pm/ShortcutManager$ShareShortcutInfo$1;
-Landroid/content/pm/ShortcutManager$ShareShortcutInfo;
-Landroid/content/pm/ShortcutManager;
-Landroid/content/pm/ShortcutQueryWrapper$1;
-Landroid/content/pm/ShortcutQueryWrapper;
-Landroid/content/pm/ShortcutServiceInternal$ShortcutChangeListener;
-Landroid/content/pm/ShortcutServiceInternal;
-Landroid/content/pm/Signature$1;
-Landroid/content/pm/Signature-IA;
-Landroid/content/pm/Signature;
-Landroid/content/pm/SigningDetails$1;
-Landroid/content/pm/SigningDetails;
-Landroid/content/pm/SigningInfo$1;
-Landroid/content/pm/SigningInfo-IA;
-Landroid/content/pm/SigningInfo;
-Landroid/content/pm/StringParceledListSlice$1;
-Landroid/content/pm/StringParceledListSlice-IA;
-Landroid/content/pm/StringParceledListSlice;
-Landroid/content/pm/SuspendDialogInfo$1;
-Landroid/content/pm/SuspendDialogInfo$Builder;
-Landroid/content/pm/SuspendDialogInfo;
-Landroid/content/pm/UserInfo$1;
-Landroid/content/pm/UserInfo-IA;
-Landroid/content/pm/UserInfo;
-Landroid/content/pm/UserPackage;
-Landroid/content/pm/UserProperties$1;
-Landroid/content/pm/UserProperties;
-Landroid/content/pm/VerifierDeviceIdentity$1;
-Landroid/content/pm/VerifierDeviceIdentity;
-Landroid/content/pm/VerifierInfo$1;
-Landroid/content/pm/VerifierInfo;
-Landroid/content/pm/VersionedPackage$1;
-Landroid/content/pm/VersionedPackage-IA;
-Landroid/content/pm/VersionedPackage;
-Landroid/content/pm/XmlSerializerAndParser;
-Landroid/content/pm/dex/ArtManager$SnapshotRuntimeProfileCallbackDelegate;
-Landroid/content/pm/dex/ArtManager;
-Landroid/content/pm/dex/ArtManagerInternal;
-Landroid/content/pm/dex/DexMetadataHelper;
-Landroid/content/pm/dex/IArtManager$Stub$Proxy;
-Landroid/content/pm/dex/IArtManager$Stub;
-Landroid/content/pm/dex/IArtManager;
-Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback$Stub$Proxy;
-Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback$Stub;
-Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback;
-Landroid/content/pm/dex/PackageOptimizationInfo;
-Landroid/content/pm/overlay/OverlayPaths;
-Landroid/content/pm/parsing/ApkLite;
-Landroid/content/pm/parsing/ApkLiteParseUtils$SplitNameComparator;
-Landroid/content/pm/parsing/ApkLiteParseUtils;
-Landroid/content/pm/parsing/FrameworkParsingPackageUtils;
-Landroid/content/pm/parsing/PackageLite;
-Landroid/content/pm/parsing/result/ParseInput$Callback;
-Landroid/content/pm/parsing/result/ParseInput;
-Landroid/content/pm/parsing/result/ParseResult;
-Landroid/content/pm/parsing/result/ParseTypeImpl$$ExternalSyntheticLambda0;
-Landroid/content/pm/parsing/result/ParseTypeImpl$$ExternalSyntheticLambda1;
-Landroid/content/pm/parsing/result/ParseTypeImpl;
-Landroid/content/pm/permission/SplitPermissionInfoParcelable$1;
-Landroid/content/pm/permission/SplitPermissionInfoParcelable;
-Landroid/content/pm/pkg/FrameworkPackageUserState;
-Landroid/content/pm/pkg/FrameworkPackageUserStateDefault;
-Landroid/content/pm/split/SplitDependencyLoader$IllegalDependencyException;
-Landroid/content/pm/split/SplitDependencyLoader;
-Landroid/content/pm/verify/domain/DomainSet$1;
-Landroid/content/pm/verify/domain/DomainSet;
-Landroid/content/pm/verify/domain/DomainVerificationInfo$1;
-Landroid/content/pm/verify/domain/DomainVerificationInfo;
-Landroid/content/pm/verify/domain/DomainVerificationManager;
-Landroid/content/pm/verify/domain/DomainVerificationUserState$1;
-Landroid/content/pm/verify/domain/DomainVerificationUserState;
-Landroid/content/pm/verify/domain/DomainVerificationUtils;
-Landroid/content/pm/verify/domain/IDomainVerificationManager$Stub;
-Landroid/content/pm/verify/domain/IDomainVerificationManager;
-Landroid/content/res/ApkAssets;
-Landroid/content/res/AssetFileDescriptor$1;
-Landroid/content/res/AssetFileDescriptor$AutoCloseInputStream;
-Landroid/content/res/AssetFileDescriptor;
-Landroid/content/res/AssetManager$AssetInputStream-IA;
-Landroid/content/res/AssetManager$AssetInputStream;
-Landroid/content/res/AssetManager$Builder;
-Landroid/content/res/AssetManager-IA;
-Landroid/content/res/AssetManager;
-Landroid/content/res/ColorStateList$1;
-Landroid/content/res/ColorStateList$ColorStateListFactory;
-Landroid/content/res/ColorStateList;
-Landroid/content/res/CompatResources;
-Landroid/content/res/CompatibilityInfo$1;
-Landroid/content/res/CompatibilityInfo$2;
-Landroid/content/res/CompatibilityInfo$Translator;
-Landroid/content/res/CompatibilityInfo-IA;
-Landroid/content/res/CompatibilityInfo;
-Landroid/content/res/ComplexColor;
-Landroid/content/res/Configuration$1;
-Landroid/content/res/Configuration-IA;
-Landroid/content/res/Configuration;
-Landroid/content/res/ConfigurationBoundResourceCache;
-Landroid/content/res/ConstantState;
-Landroid/content/res/DrawableCache;
-Landroid/content/res/FeatureFlags;
-Landroid/content/res/FeatureFlagsImpl;
-Landroid/content/res/Flags;
-Landroid/content/res/FontResourcesParser$FamilyResourceEntry;
-Landroid/content/res/FontResourcesParser$FontFamilyFilesResourceEntry;
-Landroid/content/res/FontResourcesParser$FontFileResourceEntry;
-Landroid/content/res/FontResourcesParser$ProviderResourceEntry;
-Landroid/content/res/FontResourcesParser;
-Landroid/content/res/FontScaleConverter;
-Landroid/content/res/FontScaleConverterFactory;
-Landroid/content/res/FontScaleConverterImpl;
-Landroid/content/res/GradientColor$GradientColorFactory;
-Landroid/content/res/GradientColor;
-Landroid/content/res/ObbInfo$1;
-Landroid/content/res/ObbInfo;
-Landroid/content/res/ObbScanner;
-Landroid/content/res/ResourceId;
-Landroid/content/res/ResourceTimer$Config;
-Landroid/content/res/ResourceTimer$Timer;
-Landroid/content/res/ResourceTimer;
-Landroid/content/res/Resources$$ExternalSyntheticLambda0;
-Landroid/content/res/Resources$$ExternalSyntheticLambda1;
-Landroid/content/res/Resources$AssetManagerUpdateHandler;
-Landroid/content/res/Resources$NotFoundException;
-Landroid/content/res/Resources$Theme-IA;
-Landroid/content/res/Resources$Theme;
-Landroid/content/res/Resources$ThemeKey;
-Landroid/content/res/Resources$UpdateCallbacks;
-Landroid/content/res/Resources;
-Landroid/content/res/ResourcesImpl$$ExternalSyntheticLambda0;
-Landroid/content/res/ResourcesImpl$$ExternalSyntheticLambda1;
-Landroid/content/res/ResourcesImpl$$ExternalSyntheticLambda2;
-Landroid/content/res/ResourcesImpl$LookupStack-IA;
-Landroid/content/res/ResourcesImpl$LookupStack;
-Landroid/content/res/ResourcesImpl$ThemeImpl;
-Landroid/content/res/ResourcesImpl;
-Landroid/content/res/ResourcesKey;
-Landroid/content/res/StringBlock$Height;
-Landroid/content/res/StringBlock$StyleIDs;
-Landroid/content/res/StringBlock;
-Landroid/content/res/ThemedResourceCache;
-Landroid/content/res/TypedArray;
-Landroid/content/res/Validator;
-Landroid/content/res/XmlBlock;
-Landroid/content/res/XmlResourceParser;
-Landroid/content/res/loader/AssetsProvider;
-Landroid/content/res/loader/ResourcesLoader$UpdateCallbacks;
-Landroid/content/res/loader/ResourcesLoader;
-Landroid/content/res/loader/ResourcesProvider;
-Landroid/content/rollback/IRollbackManager$Stub$Proxy;
-Landroid/content/rollback/IRollbackManager$Stub;
-Landroid/content/rollback/IRollbackManager;
-Landroid/content/rollback/PackageRollbackInfo$1;
-Landroid/content/rollback/PackageRollbackInfo;
-Landroid/content/rollback/RollbackInfo$1;
-Landroid/content/rollback/RollbackInfo;
-Landroid/content/rollback/RollbackManager;
-Landroid/content/rollback/RollbackManagerFrameworkInitializer$$ExternalSyntheticLambda0;
-Landroid/content/rollback/RollbackManagerFrameworkInitializer;
-Landroid/content/type/DefaultMimeMapFactory$$ExternalSyntheticLambda0;
-Landroid/content/type/DefaultMimeMapFactory;
-Landroid/credentials/CredentialManager;
-Landroid/credentials/GetCredentialResponse;
-Landroid/database/AbstractCursor$SelfContentObserver;
-Landroid/database/AbstractCursor;
-Landroid/database/AbstractWindowedCursor;
-Landroid/database/BulkCursorDescriptor$1;
-Landroid/database/BulkCursorDescriptor;
-Landroid/database/BulkCursorNative;
-Landroid/database/BulkCursorProxy;
-Landroid/database/BulkCursorToCursorAdaptor;
-Landroid/database/CharArrayBuffer;
-Landroid/database/ContentObservable;
-Landroid/database/ContentObserver$$ExternalSyntheticLambda0;
-Landroid/database/ContentObserver$$ExternalSyntheticLambda1;
-Landroid/database/ContentObserver;
-Landroid/database/CrossProcessCursor;
-Landroid/database/CrossProcessCursorWrapper;
-Landroid/database/Cursor;
-Landroid/database/CursorIndexOutOfBoundsException;
-Landroid/database/CursorToBulkCursorAdaptor$ContentObserverProxy;
-Landroid/database/CursorToBulkCursorAdaptor;
-Landroid/database/CursorWindow$1;
-Landroid/database/CursorWindow-IA;
-Landroid/database/CursorWindow;
-Landroid/database/CursorWrapper;
-Landroid/database/DataSetObservable;
-Landroid/database/DataSetObserver;
-Landroid/database/DatabaseErrorHandler;
-Landroid/database/DatabaseUtils$InsertHelper;
-Landroid/database/DatabaseUtils;
-Landroid/database/DefaultDatabaseErrorHandler;
-Landroid/database/IBulkCursor;
-Landroid/database/IContentObserver$Stub;
-Landroid/database/IContentObserver;
-Landroid/database/MatrixCursor$RowBuilder;
-Landroid/database/MatrixCursor;
-Landroid/database/MergeCursor$1;
-Landroid/database/MergeCursor;
-Landroid/database/Observable;
-Landroid/database/SQLException;
-Landroid/database/StaleDataException;
-Landroid/database/sqlite/DatabaseObjectNotClosedException;
-Landroid/database/sqlite/FeatureFlags;
-Landroid/database/sqlite/FeatureFlagsImpl;
-Landroid/database/sqlite/Flags;
-Landroid/database/sqlite/SQLiteAbortException;
-Landroid/database/sqlite/SQLiteAccessPermException;
-Landroid/database/sqlite/SQLiteBindOrColumnIndexOutOfRangeException;
-Landroid/database/sqlite/SQLiteBlobTooBigException;
-Landroid/database/sqlite/SQLiteCantOpenDatabaseException;
-Landroid/database/sqlite/SQLiteClosable;
-Landroid/database/sqlite/SQLiteCompatibilityWalFlags;
-Landroid/database/sqlite/SQLiteConnection$Operation-IA;
-Landroid/database/sqlite/SQLiteConnection$Operation;
-Landroid/database/sqlite/SQLiteConnection$OperationLog;
-Landroid/database/sqlite/SQLiteConnection$PreparedStatement;
-Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;
-Landroid/database/sqlite/SQLiteConnection;
-Landroid/database/sqlite/SQLiteConnectionPool$1;
-Landroid/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;
-Landroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter-IA;
-Landroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;
-Landroid/database/sqlite/SQLiteConnectionPool$IdleConnectionHandler;
-Landroid/database/sqlite/SQLiteConnectionPool;
-Landroid/database/sqlite/SQLiteConstraintException;
-Landroid/database/sqlite/SQLiteCursor;
-Landroid/database/sqlite/SQLiteCursorDriver;
-Landroid/database/sqlite/SQLiteCustomFunction;
-Landroid/database/sqlite/SQLiteDatabase$$ExternalSyntheticLambda0;
-Landroid/database/sqlite/SQLiteDatabase$$ExternalSyntheticLambda1;
-Landroid/database/sqlite/SQLiteDatabase$$ExternalSyntheticLambda2;
-Landroid/database/sqlite/SQLiteDatabase$$ExternalSyntheticLambda3;
-Landroid/database/sqlite/SQLiteDatabase$1;
-Landroid/database/sqlite/SQLiteDatabase$CursorFactory;
-Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;
-Landroid/database/sqlite/SQLiteDatabase$OpenParams-IA;
-Landroid/database/sqlite/SQLiteDatabase$OpenParams;
-Landroid/database/sqlite/SQLiteDatabase;
-Landroid/database/sqlite/SQLiteDatabaseConfiguration;
-Landroid/database/sqlite/SQLiteDatabaseCorruptException;
-Landroid/database/sqlite/SQLiteDatabaseLockedException;
-Landroid/database/sqlite/SQLiteDatatypeMismatchException;
-Landroid/database/sqlite/SQLiteDebug$DbStats;
-Landroid/database/sqlite/SQLiteDebug$NoPreloadHolder;
-Landroid/database/sqlite/SQLiteDebug$PagerStats;
-Landroid/database/sqlite/SQLiteDebug;
-Landroid/database/sqlite/SQLiteDirectCursorDriver;
-Landroid/database/sqlite/SQLiteDiskIOException;
-Landroid/database/sqlite/SQLiteDoneException;
-Landroid/database/sqlite/SQLiteException;
-Landroid/database/sqlite/SQLiteFullException;
-Landroid/database/sqlite/SQLiteGlobal;
-Landroid/database/sqlite/SQLiteMisuseException;
-Landroid/database/sqlite/SQLiteOpenHelper;
-Landroid/database/sqlite/SQLiteOutOfMemoryException;
-Landroid/database/sqlite/SQLiteProgram;
-Landroid/database/sqlite/SQLiteQuery;
-Landroid/database/sqlite/SQLiteQueryBuilder;
-Landroid/database/sqlite/SQLiteRawStatement;
-Landroid/database/sqlite/SQLiteReadOnlyDatabaseException;
-Landroid/database/sqlite/SQLiteSession$Transaction-IA;
-Landroid/database/sqlite/SQLiteSession$Transaction;
-Landroid/database/sqlite/SQLiteSession;
-Landroid/database/sqlite/SQLiteStatement;
-Landroid/database/sqlite/SQLiteStatementInfo;
-Landroid/database/sqlite/SQLiteTableLockedException;
-Landroid/database/sqlite/SQLiteTokenizer;
-Landroid/database/sqlite/SQLiteTransactionListener;
-Landroid/database/sqlite/SqliteWrapper;
-Landroid/ddm/DdmHandle;
-Landroid/ddm/DdmHandleAppName$Names-IA;
-Landroid/ddm/DdmHandleAppName$Names;
-Landroid/ddm/DdmHandleAppName;
-Landroid/ddm/DdmHandleExit;
-Landroid/ddm/DdmHandleHeap;
-Landroid/ddm/DdmHandleHello;
-Landroid/ddm/DdmHandleNativeHeap;
-Landroid/ddm/DdmHandleProfiling;
-Landroid/ddm/DdmHandleViewDebug;
-Landroid/ddm/DdmRegister;
-Landroid/debug/AdbManager;
-Landroid/debug/AdbManagerInternal;
-Landroid/debug/IAdbManager$Stub$Proxy;
-Landroid/debug/IAdbManager$Stub;
-Landroid/debug/IAdbManager;
-Landroid/debug/IAdbTransport$Stub;
-Landroid/debug/IAdbTransport;
-Landroid/graphics/BLASTBufferQueue$TransactionHangCallback;
-Landroid/graphics/BLASTBufferQueue;
-Landroid/graphics/BaseCanvas;
-Landroid/graphics/BaseRecordingCanvas;
-Landroid/graphics/Bitmap$1;
-Landroid/graphics/Bitmap$CompressFormat;
-Landroid/graphics/Bitmap$Config;
-Landroid/graphics/Bitmap;
-Landroid/graphics/BitmapFactory$Options;
-Landroid/graphics/BitmapFactory;
-Landroid/graphics/BitmapRegionDecoder;
-Landroid/graphics/BitmapShader;
-Landroid/graphics/BlendMode;
-Landroid/graphics/BlendModeColorFilter;
-Landroid/graphics/BlurMaskFilter$Blur;
-Landroid/graphics/BlurMaskFilter;
-Landroid/graphics/Camera;
-Landroid/graphics/Canvas$EdgeType;
-Landroid/graphics/Canvas$NoImagePreloadHolder;
-Landroid/graphics/Canvas;
-Landroid/graphics/CanvasProperty;
-Landroid/graphics/Color;
-Landroid/graphics/ColorFilter$NoImagePreloadHolder;
-Landroid/graphics/ColorFilter;
-Landroid/graphics/ColorMatrix;
-Landroid/graphics/ColorMatrixColorFilter;
-Landroid/graphics/ColorSpace$$ExternalSyntheticLambda0;
-Landroid/graphics/ColorSpace$$ExternalSyntheticLambda1;
-Landroid/graphics/ColorSpace$$ExternalSyntheticLambda2;
-Landroid/graphics/ColorSpace$$ExternalSyntheticLambda3;
-Landroid/graphics/ColorSpace$$ExternalSyntheticLambda4;
-Landroid/graphics/ColorSpace$$ExternalSyntheticLambda5;
-Landroid/graphics/ColorSpace$Adaptation;
-Landroid/graphics/ColorSpace$Connector;
-Landroid/graphics/ColorSpace$Lab;
-Landroid/graphics/ColorSpace$Model;
-Landroid/graphics/ColorSpace$Named;
-Landroid/graphics/ColorSpace$RenderIntent;
-Landroid/graphics/ColorSpace$Rgb$$ExternalSyntheticLambda0;
-Landroid/graphics/ColorSpace$Rgb$$ExternalSyntheticLambda1;
-Landroid/graphics/ColorSpace$Rgb$$ExternalSyntheticLambda2;
-Landroid/graphics/ColorSpace$Rgb$$ExternalSyntheticLambda3;
-Landroid/graphics/ColorSpace$Rgb$$ExternalSyntheticLambda4;
-Landroid/graphics/ColorSpace$Rgb$$ExternalSyntheticLambda5;
-Landroid/graphics/ColorSpace$Rgb$$ExternalSyntheticLambda6;
-Landroid/graphics/ColorSpace$Rgb$$ExternalSyntheticLambda9;
-Landroid/graphics/ColorSpace$Rgb$NoImagePreloadHolder;
-Landroid/graphics/ColorSpace$Rgb$TransferParameters;
-Landroid/graphics/ColorSpace$Rgb-IA;
-Landroid/graphics/ColorSpace$Rgb;
-Landroid/graphics/ColorSpace$Xyz;
-Landroid/graphics/ColorSpace;
-Landroid/graphics/Compatibility;
-Landroid/graphics/ComposePathEffect;
-Landroid/graphics/ComposeShader;
-Landroid/graphics/CornerPathEffect;
-Landroid/graphics/DashPathEffect;
-Landroid/graphics/DiscretePathEffect;
-Landroid/graphics/DrawFilter;
-Landroid/graphics/EmbossMaskFilter;
-Landroid/graphics/FontFamily;
-Landroid/graphics/FontListParser;
-Landroid/graphics/FrameInfo;
-Landroid/graphics/Gainmap$1;
-Landroid/graphics/Gainmap;
-Landroid/graphics/GraphicBuffer$1;
-Landroid/graphics/GraphicBuffer;
-Landroid/graphics/GraphicsProtos;
-Landroid/graphics/GraphicsStatsService$1;
-Landroid/graphics/GraphicsStatsService$ActiveBuffer;
-Landroid/graphics/GraphicsStatsService$BufferInfo;
-Landroid/graphics/GraphicsStatsService$HistoricalBuffer;
-Landroid/graphics/GraphicsStatsService;
-Landroid/graphics/HardwareBufferRenderer;
-Landroid/graphics/HardwareRenderer$ASurfaceTransactionCallback;
-Landroid/graphics/HardwareRenderer$CopyRequest;
-Landroid/graphics/HardwareRenderer$DestroyContextRunnable;
-Landroid/graphics/HardwareRenderer$FrameCommitCallback;
-Landroid/graphics/HardwareRenderer$FrameCompleteCallback;
-Landroid/graphics/HardwareRenderer$FrameDrawingCallback;
-Landroid/graphics/HardwareRenderer$FrameRenderRequest-IA;
-Landroid/graphics/HardwareRenderer$FrameRenderRequest;
-Landroid/graphics/HardwareRenderer$PrepareSurfaceControlForWebviewCallback;
-Landroid/graphics/HardwareRenderer$ProcessInitializer$1;
-Landroid/graphics/HardwareRenderer$ProcessInitializer;
-Landroid/graphics/HardwareRenderer;
-Landroid/graphics/HardwareRendererObserver$$ExternalSyntheticLambda0;
-Landroid/graphics/HardwareRendererObserver$OnFrameMetricsAvailableListener;
-Landroid/graphics/HardwareRendererObserver;
-Landroid/graphics/ImageDecoder$AssetInputStreamSource;
-Landroid/graphics/ImageDecoder$ByteArraySource;
-Landroid/graphics/ImageDecoder$DecodeException;
-Landroid/graphics/ImageDecoder$ImageDecoderSourceTrace;
-Landroid/graphics/ImageDecoder$ImageInfo-IA;
-Landroid/graphics/ImageDecoder$ImageInfo;
-Landroid/graphics/ImageDecoder$InputStreamSource;
-Landroid/graphics/ImageDecoder$OnHeaderDecodedListener;
-Landroid/graphics/ImageDecoder$Source-IA;
-Landroid/graphics/ImageDecoder$Source;
-Landroid/graphics/ImageDecoder;
-Landroid/graphics/ImageFormat;
-Landroid/graphics/Insets$1;
-Landroid/graphics/Insets-IA;
-Landroid/graphics/Insets;
-Landroid/graphics/Interpolator$Result;
-Landroid/graphics/Interpolator;
-Landroid/graphics/LeakyTypefaceStorage;
-Landroid/graphics/LightingColorFilter;
-Landroid/graphics/LinearGradient;
-Landroid/graphics/MaskFilter;
-Landroid/graphics/Matrix$1;
-Landroid/graphics/Matrix$NoImagePreloadHolder;
-Landroid/graphics/Matrix$ScaleToFit;
-Landroid/graphics/Matrix;
-Landroid/graphics/Mesh;
-Landroid/graphics/MeshSpecification$Attribute;
-Landroid/graphics/MeshSpecification$Varying;
-Landroid/graphics/MeshSpecification;
-Landroid/graphics/Movie;
-Landroid/graphics/NinePatch$InsetStruct;
-Landroid/graphics/NinePatch;
-Landroid/graphics/Outline;
-Landroid/graphics/Paint$Align;
-Landroid/graphics/Paint$Cap;
-Landroid/graphics/Paint$FontMetrics;
-Landroid/graphics/Paint$FontMetricsInt;
-Landroid/graphics/Paint$Join;
-Landroid/graphics/Paint$NoImagePreloadHolder;
-Landroid/graphics/Paint$RunInfo;
-Landroid/graphics/Paint$Style;
-Landroid/graphics/Paint;
-Landroid/graphics/PaintFlagsDrawFilter;
-Landroid/graphics/Path$Direction;
-Landroid/graphics/Path$FillType;
-Landroid/graphics/Path$Op;
-Landroid/graphics/Path;
-Landroid/graphics/PathDashPathEffect;
-Landroid/graphics/PathEffect;
-Landroid/graphics/PathIterator;
-Landroid/graphics/PathMeasure;
-Landroid/graphics/Picture$PictureCanvas;
-Landroid/graphics/Picture;
-Landroid/graphics/PixelFormat;
-Landroid/graphics/Point$1;
-Landroid/graphics/Point;
-Landroid/graphics/PointF$1;
-Landroid/graphics/PointF;
-Landroid/graphics/PorterDuff$Mode;
-Landroid/graphics/PorterDuff;
-Landroid/graphics/PorterDuffColorFilter;
-Landroid/graphics/PorterDuffXfermode;
-Landroid/graphics/PostProcessor;
-Landroid/graphics/RadialGradient;
-Landroid/graphics/RecordingCanvas;
-Landroid/graphics/Rect$1;
-Landroid/graphics/Rect$UnflattenHelper;
-Landroid/graphics/Rect;
-Landroid/graphics/RectF$1;
-Landroid/graphics/RectF;
-Landroid/graphics/Region$1;
-Landroid/graphics/Region$Op;
-Landroid/graphics/Region;
-Landroid/graphics/RegionIterator;
-Landroid/graphics/RenderEffect$RenderEffectHolder;
-Landroid/graphics/RenderEffect;
-Landroid/graphics/RenderNode$AnimationHost;
-Landroid/graphics/RenderNode$CompositePositionUpdateListener;
-Landroid/graphics/RenderNode$NoImagePreloadHolder;
-Landroid/graphics/RenderNode$PositionUpdateListener;
-Landroid/graphics/RenderNode;
-Landroid/graphics/RuntimeShader$NoImagePreloadHolder;
-Landroid/graphics/RuntimeShader;
-Landroid/graphics/Shader$NoImagePreloadHolder;
-Landroid/graphics/Shader$TileMode;
-Landroid/graphics/Shader;
-Landroid/graphics/SumPathEffect;
-Landroid/graphics/SurfaceTexture$1;
-Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;
-Landroid/graphics/SurfaceTexture$OnSetFrameRateListener;
-Landroid/graphics/SurfaceTexture;
-Landroid/graphics/SweepGradient;
-Landroid/graphics/TableMaskFilter;
-Landroid/graphics/TemporaryBuffer;
-Landroid/graphics/TextureLayer;
-Landroid/graphics/Typeface$Builder;
-Landroid/graphics/Typeface$CustomFallbackBuilder;
-Landroid/graphics/Typeface-IA;
-Landroid/graphics/Typeface;
-Landroid/graphics/Xfermode;
-Landroid/graphics/YuvImage;
-Landroid/graphics/animation/FallbackLUTInterpolator;
-Landroid/graphics/animation/HasNativeInterpolator;
-Landroid/graphics/animation/NativeInterpolator;
-Landroid/graphics/animation/NativeInterpolatorFactory;
-Landroid/graphics/animation/RenderNodeAnimator$$ExternalSyntheticLambda0;
-Landroid/graphics/animation/RenderNodeAnimator$DelayedAnimationHelper;
-Landroid/graphics/animation/RenderNodeAnimator$ViewListener;
-Landroid/graphics/animation/RenderNodeAnimator;
-Landroid/graphics/drawable/AdaptiveIconDrawable$ChildDrawable;
-Landroid/graphics/drawable/AdaptiveIconDrawable$LayerState;
-Landroid/graphics/drawable/AdaptiveIconDrawable;
-Landroid/graphics/drawable/Animatable2$AnimationCallback;
-Landroid/graphics/drawable/Animatable2;
-Landroid/graphics/drawable/Animatable;
-Landroid/graphics/drawable/AnimatedImageDrawable$State;
-Landroid/graphics/drawable/AnimatedImageDrawable;
-Landroid/graphics/drawable/AnimatedRotateDrawable$1;
-Landroid/graphics/drawable/AnimatedRotateDrawable$AnimatedRotateState;
-Landroid/graphics/drawable/AnimatedRotateDrawable;
-Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatableTransition;
-Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;
-Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedVectorDrawableTransition;
-Landroid/graphics/drawable/AnimatedStateListDrawable$AnimationDrawableTransition;
-Landroid/graphics/drawable/AnimatedStateListDrawable$FrameInterpolator;
-Landroid/graphics/drawable/AnimatedStateListDrawable$Transition-IA;
-Landroid/graphics/drawable/AnimatedStateListDrawable$Transition;
-Landroid/graphics/drawable/AnimatedStateListDrawable-IA;
-Landroid/graphics/drawable/AnimatedStateListDrawable;
-Landroid/graphics/drawable/AnimatedVectorDrawable$1;
-Landroid/graphics/drawable/AnimatedVectorDrawable$2;
-Landroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState$PendingAnimator;
-Landroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;
-Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimator;
-Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT$$ExternalSyntheticLambda0;
-Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;
-Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorUI;
-Landroid/graphics/drawable/AnimatedVectorDrawable-IA;
-Landroid/graphics/drawable/AnimatedVectorDrawable;
-Landroid/graphics/drawable/AnimationDrawable$AnimationState;
-Landroid/graphics/drawable/AnimationDrawable-IA;
-Landroid/graphics/drawable/AnimationDrawable;
-Landroid/graphics/drawable/BitmapDrawable$$ExternalSyntheticLambda1;
-Landroid/graphics/drawable/BitmapDrawable$$ExternalSyntheticLambda2;
-Landroid/graphics/drawable/BitmapDrawable$BitmapState;
-Landroid/graphics/drawable/BitmapDrawable-IA;
-Landroid/graphics/drawable/BitmapDrawable;
-Landroid/graphics/drawable/ClipDrawable$ClipState;
-Landroid/graphics/drawable/ClipDrawable-IA;
-Landroid/graphics/drawable/ClipDrawable;
-Landroid/graphics/drawable/ColorDrawable$ColorState;
-Landroid/graphics/drawable/ColorDrawable-IA;
-Landroid/graphics/drawable/ColorDrawable;
-Landroid/graphics/drawable/ColorStateListDrawable$ColorStateListDrawableState;
-Landroid/graphics/drawable/ColorStateListDrawable;
-Landroid/graphics/drawable/Drawable$Callback;
-Landroid/graphics/drawable/Drawable$ConstantState;
-Landroid/graphics/drawable/Drawable;
-Landroid/graphics/drawable/DrawableContainer$1;
-Landroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback-IA;
-Landroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;
-Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;
-Landroid/graphics/drawable/DrawableContainer;
-Landroid/graphics/drawable/DrawableInflater;
-Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;
-Landroid/graphics/drawable/DrawableWrapper;
-Landroid/graphics/drawable/GradientDrawable$GradientState;
-Landroid/graphics/drawable/GradientDrawable$Orientation;
-Landroid/graphics/drawable/GradientDrawable-IA;
-Landroid/graphics/drawable/GradientDrawable;
-Landroid/graphics/drawable/Icon$1;
-Landroid/graphics/drawable/Icon$LoadDrawableTask;
-Landroid/graphics/drawable/Icon-IA;
-Landroid/graphics/drawable/Icon;
-Landroid/graphics/drawable/InsetDrawable$InsetState;
-Landroid/graphics/drawable/InsetDrawable$InsetValue;
-Landroid/graphics/drawable/InsetDrawable-IA;
-Landroid/graphics/drawable/InsetDrawable;
-Landroid/graphics/drawable/LayerDrawable$ChildDrawable;
-Landroid/graphics/drawable/LayerDrawable$LayerState;
-Landroid/graphics/drawable/LayerDrawable;
-Landroid/graphics/drawable/LevelListDrawable$LevelListState;
-Landroid/graphics/drawable/LevelListDrawable;
-Landroid/graphics/drawable/NinePatchDrawable$$ExternalSyntheticLambda0;
-Landroid/graphics/drawable/NinePatchDrawable$NinePatchState;
-Landroid/graphics/drawable/NinePatchDrawable-IA;
-Landroid/graphics/drawable/NinePatchDrawable;
-Landroid/graphics/drawable/PaintDrawable;
-Landroid/graphics/drawable/PictureDrawable;
-Landroid/graphics/drawable/RippleAnimationSession$2;
-Landroid/graphics/drawable/RippleAnimationSession$3;
-Landroid/graphics/drawable/RippleAnimationSession$AnimationProperties;
-Landroid/graphics/drawable/RippleAnimationSession$AnimatorListener;
-Landroid/graphics/drawable/RippleAnimationSession;
-Landroid/graphics/drawable/RippleBackground$1;
-Landroid/graphics/drawable/RippleBackground$BackgroundProperty;
-Landroid/graphics/drawable/RippleBackground;
-Landroid/graphics/drawable/RippleComponent;
-Landroid/graphics/drawable/RippleDrawable$$ExternalSyntheticLambda0;
-Landroid/graphics/drawable/RippleDrawable$$ExternalSyntheticLambda1;
-Landroid/graphics/drawable/RippleDrawable$$ExternalSyntheticLambda2;
-Landroid/graphics/drawable/RippleDrawable$RippleState;
-Landroid/graphics/drawable/RippleDrawable-IA;
-Landroid/graphics/drawable/RippleDrawable;
-Landroid/graphics/drawable/RippleForeground$1;
-Landroid/graphics/drawable/RippleForeground$2;
-Landroid/graphics/drawable/RippleForeground$3;
-Landroid/graphics/drawable/RippleForeground$4;
-Landroid/graphics/drawable/RippleForeground;
-Landroid/graphics/drawable/RippleShader;
-Landroid/graphics/drawable/RotateDrawable$RotateState;
-Landroid/graphics/drawable/RotateDrawable-IA;
-Landroid/graphics/drawable/RotateDrawable;
-Landroid/graphics/drawable/ScaleDrawable$ScaleState;
-Landroid/graphics/drawable/ScaleDrawable-IA;
-Landroid/graphics/drawable/ScaleDrawable;
-Landroid/graphics/drawable/ShapeDrawable$ShaderFactory;
-Landroid/graphics/drawable/ShapeDrawable$ShapeState;
-Landroid/graphics/drawable/ShapeDrawable;
-Landroid/graphics/drawable/StateListDrawable$StateListState;
-Landroid/graphics/drawable/StateListDrawable-IA;
-Landroid/graphics/drawable/StateListDrawable;
-Landroid/graphics/drawable/TransitionDrawable$TransitionState;
-Landroid/graphics/drawable/TransitionDrawable;
-Landroid/graphics/drawable/VectorDrawable$VClipPath;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$1;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$2;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$3;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$4;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$5;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$6;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$7;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$8;
-Landroid/graphics/drawable/VectorDrawable$VFullPath;
-Landroid/graphics/drawable/VectorDrawable$VGroup$1;
-Landroid/graphics/drawable/VectorDrawable$VGroup$2;
-Landroid/graphics/drawable/VectorDrawable$VGroup$3;
-Landroid/graphics/drawable/VectorDrawable$VGroup$4;
-Landroid/graphics/drawable/VectorDrawable$VGroup$5;
-Landroid/graphics/drawable/VectorDrawable$VGroup$6;
-Landroid/graphics/drawable/VectorDrawable$VGroup$7;
-Landroid/graphics/drawable/VectorDrawable$VGroup;
-Landroid/graphics/drawable/VectorDrawable$VObject;
-Landroid/graphics/drawable/VectorDrawable$VPath$1;
-Landroid/graphics/drawable/VectorDrawable$VPath;
-Landroid/graphics/drawable/VectorDrawable$VectorDrawableState$1;
-Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;
-Landroid/graphics/drawable/VectorDrawable-IA;
-Landroid/graphics/drawable/VectorDrawable;
-Landroid/graphics/drawable/shapes/OvalShape;
-Landroid/graphics/drawable/shapes/PathShape;
-Landroid/graphics/drawable/shapes/RectShape;
-Landroid/graphics/drawable/shapes/RoundRectShape;
-Landroid/graphics/drawable/shapes/Shape;
-Landroid/graphics/fonts/Font$Builder;
-Landroid/graphics/fonts/Font;
-Landroid/graphics/fonts/FontCustomizationParser$Result;
-Landroid/graphics/fonts/FontCustomizationParser;
-Landroid/graphics/fonts/FontFamily$Builder;
-Landroid/graphics/fonts/FontFamily;
-Landroid/graphics/fonts/FontFileUtil;
-Landroid/graphics/fonts/FontManager;
-Landroid/graphics/fonts/FontStyle;
-Landroid/graphics/fonts/FontVariationAxis;
-Landroid/graphics/fonts/SystemFonts;
-Landroid/graphics/pdf/PdfDocument;
-Landroid/graphics/pdf/PdfEditor;
-Landroid/graphics/text/GraphemeBreak;
-Landroid/graphics/text/LineBreakConfig$1;
-Landroid/graphics/text/LineBreakConfig$Builder;
-Landroid/graphics/text/LineBreakConfig;
-Landroid/graphics/text/LineBreaker$Builder;
-Landroid/graphics/text/LineBreaker$ParagraphConstraints;
-Landroid/graphics/text/LineBreaker$Result-IA;
-Landroid/graphics/text/LineBreaker$Result;
-Landroid/graphics/text/LineBreaker-IA;
-Landroid/graphics/text/LineBreaker;
-Landroid/graphics/text/MeasuredText$Builder;
-Landroid/graphics/text/MeasuredText-IA;
-Landroid/graphics/text/MeasuredText;
-Landroid/graphics/text/PositionedGlyphs;
-Landroid/graphics/text/TextRunShaper;
-Landroid/gsi/AvbPublicKey$1;
-Landroid/gsi/AvbPublicKey;
-Landroid/gsi/GsiProgress$1;
-Landroid/gsi/GsiProgress;
-Landroid/gsi/IGsiService$Stub$Proxy;
-Landroid/gsi/IGsiService$Stub;
-Landroid/gsi/IGsiService;
-Landroid/gui/StalledTransactionInfo$1;
-Landroid/gui/StalledTransactionInfo;
-Landroid/hardware/Camera$CameraInfo;
-Landroid/hardware/Camera$Face;
-Landroid/hardware/Camera;
-Landroid/hardware/CameraSessionStats$1;
-Landroid/hardware/CameraSessionStats;
-Landroid/hardware/CameraStatus$1;
-Landroid/hardware/CameraStatus;
-Landroid/hardware/ConsumerIrManager;
-Landroid/hardware/GeomagneticField$LegendreTable;
-Landroid/hardware/GeomagneticField;
-Landroid/hardware/HardwareBuffer$1;
-Landroid/hardware/HardwareBuffer-IA;
-Landroid/hardware/HardwareBuffer;
-Landroid/hardware/ICameraService$Stub$Proxy;
-Landroid/hardware/ICameraService$Stub;
-Landroid/hardware/ICameraService;
-Landroid/hardware/ICameraServiceListener$Stub;
-Landroid/hardware/ICameraServiceListener;
-Landroid/hardware/ICameraServiceProxy$Stub;
-Landroid/hardware/ICameraServiceProxy;
-Landroid/hardware/IConsumerIrService$Stub;
-Landroid/hardware/IConsumerIrService;
-Landroid/hardware/ISensorPrivacyListener$Stub$Proxy;
-Landroid/hardware/ISensorPrivacyListener$Stub;
-Landroid/hardware/ISensorPrivacyListener;
-Landroid/hardware/ISensorPrivacyManager$Stub$Proxy;
-Landroid/hardware/ISensorPrivacyManager$Stub;
-Landroid/hardware/ISensorPrivacyManager;
-Landroid/hardware/ISerialManager$Stub;
-Landroid/hardware/ISerialManager;
-Landroid/hardware/OverlayProperties$1;
-Landroid/hardware/OverlayProperties-IA;
-Landroid/hardware/OverlayProperties;
-Landroid/hardware/Sensor;
-Landroid/hardware/SensorAdditionalInfo;
-Landroid/hardware/SensorDirectChannel;
-Landroid/hardware/SensorEvent;
-Landroid/hardware/SensorEventCallback;
-Landroid/hardware/SensorEventListener2;
-Landroid/hardware/SensorEventListener;
-Landroid/hardware/SensorListener;
-Landroid/hardware/SensorManager$DynamicSensorCallback;
-Landroid/hardware/SensorManager;
-Landroid/hardware/SensorPrivacyManager$1;
-Landroid/hardware/SensorPrivacyManager$2;
-Landroid/hardware/SensorPrivacyManager$OnSensorPrivacyChangedListener$SensorPrivacyChangedParams;
-Landroid/hardware/SensorPrivacyManager$OnSensorPrivacyChangedListener;
-Landroid/hardware/SensorPrivacyManager;
-Landroid/hardware/SerialManager;
-Landroid/hardware/SerialPort;
-Landroid/hardware/SyncFence$1;
-Landroid/hardware/SyncFence;
-Landroid/hardware/SystemSensorManager$BaseEventQueue;
-Landroid/hardware/SystemSensorManager$SensorEventQueue;
-Landroid/hardware/SystemSensorManager$TriggerEventQueue;
-Landroid/hardware/SystemSensorManager;
-Landroid/hardware/TriggerEvent;
-Landroid/hardware/TriggerEventListener;
-Landroid/hardware/biometrics/BiometricAuthenticator$AuthenticationCallback;
-Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;
-Landroid/hardware/biometrics/BiometricAuthenticator;
-Landroid/hardware/biometrics/BiometricFaceConstants;
-Landroid/hardware/biometrics/BiometricFingerprintConstants;
-Landroid/hardware/biometrics/BiometricManager;
-Landroid/hardware/biometrics/BiometricSourceType$1;
-Landroid/hardware/biometrics/BiometricSourceType;
-Landroid/hardware/biometrics/ComponentInfoInternal$1;
-Landroid/hardware/biometrics/ComponentInfoInternal;
-Landroid/hardware/biometrics/CryptoObject;
-Landroid/hardware/biometrics/IAuthService$Stub$Proxy;
-Landroid/hardware/biometrics/IAuthService$Stub;
-Landroid/hardware/biometrics/IAuthService;
-Landroid/hardware/biometrics/IBiometricAuthenticator$Stub$Proxy;
-Landroid/hardware/biometrics/IBiometricAuthenticator$Stub;
-Landroid/hardware/biometrics/IBiometricAuthenticator;
-Landroid/hardware/biometrics/IBiometricContextListener$Stub;
-Landroid/hardware/biometrics/IBiometricContextListener;
-Landroid/hardware/biometrics/IBiometricEnabledOnKeyguardCallback$Stub$Proxy;
-Landroid/hardware/biometrics/IBiometricEnabledOnKeyguardCallback$Stub;
-Landroid/hardware/biometrics/IBiometricEnabledOnKeyguardCallback;
-Landroid/hardware/biometrics/IBiometricSensorReceiver$Stub;
-Landroid/hardware/biometrics/IBiometricSensorReceiver;
-Landroid/hardware/biometrics/IBiometricService$Stub$Proxy;
-Landroid/hardware/biometrics/IBiometricService$Stub;
-Landroid/hardware/biometrics/IBiometricService;
-Landroid/hardware/biometrics/IBiometricServiceLockoutResetCallback$Stub$Proxy;
-Landroid/hardware/biometrics/IBiometricServiceLockoutResetCallback$Stub;
-Landroid/hardware/biometrics/IBiometricServiceLockoutResetCallback;
-Landroid/hardware/biometrics/IBiometricServiceReceiver$Stub$Proxy;
-Landroid/hardware/biometrics/IBiometricServiceReceiver$Stub;
-Landroid/hardware/biometrics/IBiometricServiceReceiver;
-Landroid/hardware/biometrics/IBiometricStateListener;
-Landroid/hardware/biometrics/IBiometricSysuiReceiver$Stub$Proxy;
-Landroid/hardware/biometrics/IBiometricSysuiReceiver$Stub;
-Landroid/hardware/biometrics/IBiometricSysuiReceiver;
-Landroid/hardware/biometrics/IInvalidationCallback$Stub;
-Landroid/hardware/biometrics/IInvalidationCallback;
-Landroid/hardware/biometrics/ITestSession;
-Landroid/hardware/biometrics/PromptInfo$1;
-Landroid/hardware/biometrics/PromptInfo;
-Landroid/hardware/biometrics/SensorLocationInternal$1;
-Landroid/hardware/biometrics/SensorLocationInternal;
-Landroid/hardware/biometrics/SensorPropertiesInternal$1;
-Landroid/hardware/biometrics/SensorPropertiesInternal;
-Landroid/hardware/biometrics/common/AuthenticateReason$Fingerprint;
-Landroid/hardware/camera2/CameraAccessException;
-Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;
-Landroid/hardware/camera2/CameraCaptureSession$StateCallback;
-Landroid/hardware/camera2/CameraCharacteristics$1;
-Landroid/hardware/camera2/CameraCharacteristics$2;
-Landroid/hardware/camera2/CameraCharacteristics$3;
-Landroid/hardware/camera2/CameraCharacteristics$4;
-Landroid/hardware/camera2/CameraCharacteristics$5;
-Landroid/hardware/camera2/CameraCharacteristics$6;
-Landroid/hardware/camera2/CameraCharacteristics$7;
-Landroid/hardware/camera2/CameraCharacteristics$8;
-Landroid/hardware/camera2/CameraCharacteristics$9;
-Landroid/hardware/camera2/CameraCharacteristics$Key;
-Landroid/hardware/camera2/CameraCharacteristics;
-Landroid/hardware/camera2/CameraDevice$StateCallback;
-Landroid/hardware/camera2/CameraDevice;
-Landroid/hardware/camera2/CameraManager$AvailabilityCallback;
-Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$$ExternalSyntheticLambda2;
-Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$1;
-Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$3;
-Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$4;
-Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$5;
-Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$6;
-Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$7;
-Landroid/hardware/camera2/CameraManager$CameraManagerGlobal;
-Landroid/hardware/camera2/CameraManager$DeviceStateListener;
-Landroid/hardware/camera2/CameraManager$FoldStateListener$$ExternalSyntheticLambda0;
-Landroid/hardware/camera2/CameraManager$FoldStateListener;
-Landroid/hardware/camera2/CameraManager$TorchCallback;
-Landroid/hardware/camera2/CameraManager;
-Landroid/hardware/camera2/CameraMetadata;
-Landroid/hardware/camera2/CameraOfflineSession$CameraOfflineSessionCallback;
-Landroid/hardware/camera2/CaptureRequest$1;
-Landroid/hardware/camera2/CaptureRequest$2;
-Landroid/hardware/camera2/CaptureRequest$3;
-Landroid/hardware/camera2/CaptureRequest$Key;
-Landroid/hardware/camera2/CaptureRequest;
-Landroid/hardware/camera2/CaptureResult$1;
-Landroid/hardware/camera2/CaptureResult$2;
-Landroid/hardware/camera2/CaptureResult$3;
-Landroid/hardware/camera2/CaptureResult$4;
-Landroid/hardware/camera2/CaptureResult$Key;
-Landroid/hardware/camera2/CaptureResult;
-Landroid/hardware/camera2/DngCreator;
-Landroid/hardware/camera2/TotalCaptureResult;
-Landroid/hardware/camera2/extension/ICaptureProcessorImpl;
-Landroid/hardware/camera2/impl/CameraDeviceImpl$CameraHandlerExecutor;
-Landroid/hardware/camera2/impl/CameraDeviceImpl;
-Landroid/hardware/camera2/impl/CameraExtensionJpegProcessor;
-Landroid/hardware/camera2/impl/CameraMetadataNative$10;
-Landroid/hardware/camera2/impl/CameraMetadataNative$11;
-Landroid/hardware/camera2/impl/CameraMetadataNative$12;
-Landroid/hardware/camera2/impl/CameraMetadataNative$13;
-Landroid/hardware/camera2/impl/CameraMetadataNative$14;
-Landroid/hardware/camera2/impl/CameraMetadataNative$15;
-Landroid/hardware/camera2/impl/CameraMetadataNative$16;
-Landroid/hardware/camera2/impl/CameraMetadataNative$17;
-Landroid/hardware/camera2/impl/CameraMetadataNative$18;
-Landroid/hardware/camera2/impl/CameraMetadataNative$19;
-Landroid/hardware/camera2/impl/CameraMetadataNative$1;
-Landroid/hardware/camera2/impl/CameraMetadataNative$20;
-Landroid/hardware/camera2/impl/CameraMetadataNative$21;
-Landroid/hardware/camera2/impl/CameraMetadataNative$22;
-Landroid/hardware/camera2/impl/CameraMetadataNative$23;
-Landroid/hardware/camera2/impl/CameraMetadataNative$24;
-Landroid/hardware/camera2/impl/CameraMetadataNative$25;
-Landroid/hardware/camera2/impl/CameraMetadataNative$26;
-Landroid/hardware/camera2/impl/CameraMetadataNative$27;
-Landroid/hardware/camera2/impl/CameraMetadataNative$28;
-Landroid/hardware/camera2/impl/CameraMetadataNative$29;
-Landroid/hardware/camera2/impl/CameraMetadataNative$2;
-Landroid/hardware/camera2/impl/CameraMetadataNative$30;
-Landroid/hardware/camera2/impl/CameraMetadataNative$31;
-Landroid/hardware/camera2/impl/CameraMetadataNative$32;
-Landroid/hardware/camera2/impl/CameraMetadataNative$33;
-Landroid/hardware/camera2/impl/CameraMetadataNative$34;
-Landroid/hardware/camera2/impl/CameraMetadataNative$35;
-Landroid/hardware/camera2/impl/CameraMetadataNative$36;
-Landroid/hardware/camera2/impl/CameraMetadataNative$37;
-Landroid/hardware/camera2/impl/CameraMetadataNative$38;
-Landroid/hardware/camera2/impl/CameraMetadataNative$39;
-Landroid/hardware/camera2/impl/CameraMetadataNative$3;
-Landroid/hardware/camera2/impl/CameraMetadataNative$4;
-Landroid/hardware/camera2/impl/CameraMetadataNative$5;
-Landroid/hardware/camera2/impl/CameraMetadataNative$6;
-Landroid/hardware/camera2/impl/CameraMetadataNative$7;
-Landroid/hardware/camera2/impl/CameraMetadataNative$8;
-Landroid/hardware/camera2/impl/CameraMetadataNative$9;
-Landroid/hardware/camera2/impl/CameraMetadataNative$Key;
-Landroid/hardware/camera2/impl/CameraMetadataNative;
-Landroid/hardware/camera2/impl/GetCommand;
-Landroid/hardware/camera2/impl/SetCommand;
-Landroid/hardware/camera2/marshal/MarshalHelpers;
-Landroid/hardware/camera2/marshal/MarshalQueryable;
-Landroid/hardware/camera2/marshal/MarshalRegistry$MarshalToken;
-Landroid/hardware/camera2/marshal/MarshalRegistry;
-Landroid/hardware/camera2/marshal/Marshaler;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableArray$MarshalerArray;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableArray$PrimitiveArrayFiller$5;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableArray$PrimitiveArrayFiller;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableArray;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableBlackLevelPattern;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableBoolean$MarshalerBoolean;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableBoolean;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableColorSpaceTransform;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableEnum;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableHighSpeedVideoConfiguration$MarshalerHighSpeedVideoConfiguration;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableHighSpeedVideoConfiguration;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableMeteringRectangle;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableNativeByteToInteger$MarshalerNativeByteToInteger;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableNativeByteToInteger;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryablePair;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableParcelable;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryablePrimitive$MarshalerPrimitive;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryablePrimitive;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableRange$MarshalerRange;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableRange;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableRecommendedStreamConfiguration;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableRect$MarshalerRect;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableRect;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableReprocessFormatsMap$MarshalerReprocessFormatsMap;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableReprocessFormatsMap;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableRggbChannelVector;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableSize$MarshalerSize;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableSize;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableSizeF;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableStreamConfiguration$MarshalerStreamConfiguration;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableStreamConfiguration;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableStreamConfigurationDuration$MarshalerStreamConfigurationDuration;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableStreamConfigurationDuration;
-Landroid/hardware/camera2/marshal/impl/MarshalQueryableString;
-Landroid/hardware/camera2/params/BlackLevelPattern;
-Landroid/hardware/camera2/params/Capability;
-Landroid/hardware/camera2/params/ColorSpaceProfiles;
-Landroid/hardware/camera2/params/ColorSpaceTransform;
-Landroid/hardware/camera2/params/DeviceStateSensorOrientationMap;
-Landroid/hardware/camera2/params/DynamicRangeProfiles;
-Landroid/hardware/camera2/params/Face;
-Landroid/hardware/camera2/params/HighSpeedVideoConfiguration;
-Landroid/hardware/camera2/params/LensIntrinsicsSample;
-Landroid/hardware/camera2/params/LensShadingMap;
-Landroid/hardware/camera2/params/MandatoryStreamCombination$ReprocessType;
-Landroid/hardware/camera2/params/MandatoryStreamCombination$SizeThreshold;
-Landroid/hardware/camera2/params/MandatoryStreamCombination$StreamCombinationTemplate;
-Landroid/hardware/camera2/params/MandatoryStreamCombination$StreamTemplate;
-Landroid/hardware/camera2/params/MandatoryStreamCombination;
-Landroid/hardware/camera2/params/MeteringRectangle;
-Landroid/hardware/camera2/params/MultiResolutionStreamConfigurationMap;
-Landroid/hardware/camera2/params/OisSample;
-Landroid/hardware/camera2/params/RecommendedStreamConfiguration;
-Landroid/hardware/camera2/params/ReprocessFormatsMap;
-Landroid/hardware/camera2/params/RggbChannelVector;
-Landroid/hardware/camera2/params/StreamConfiguration;
-Landroid/hardware/camera2/params/StreamConfigurationDuration;
-Landroid/hardware/camera2/params/StreamConfigurationMap;
-Landroid/hardware/camera2/params/TonemapCurve;
-Landroid/hardware/camera2/utils/ArrayUtils;
-Landroid/hardware/camera2/utils/ConcurrentCameraIdCombination$1;
-Landroid/hardware/camera2/utils/ConcurrentCameraIdCombination-IA;
-Landroid/hardware/camera2/utils/ConcurrentCameraIdCombination;
-Landroid/hardware/camera2/utils/ExceptionUtils;
-Landroid/hardware/camera2/utils/HashCodeHelpers;
-Landroid/hardware/camera2/utils/SurfaceUtils;
-Landroid/hardware/camera2/utils/TypeReference$SpecializedBaseTypeReference;
-Landroid/hardware/camera2/utils/TypeReference$SpecializedTypeReference;
-Landroid/hardware/camera2/utils/TypeReference-IA;
-Landroid/hardware/camera2/utils/TypeReference;
-Landroid/hardware/common/fmq/SynchronizedReadWrite;
-Landroid/hardware/common/fmq/UnsynchronizedWrite;
-Landroid/hardware/contexthub/V1_0/ContextHub;
-Landroid/hardware/contexthub/V1_0/ContextHubMsg;
-Landroid/hardware/contexthub/V1_0/HubAppInfo;
-Landroid/hardware/contexthub/V1_0/IContexthub$Proxy;
-Landroid/hardware/contexthub/V1_0/IContexthub;
-Landroid/hardware/contexthub/V1_0/IContexthubCallback$Stub;
-Landroid/hardware/contexthub/V1_0/IContexthubCallback;
-Landroid/hardware/contexthub/V1_0/MemRange;
-Landroid/hardware/contexthub/V1_0/NanoAppBinary;
-Landroid/hardware/contexthub/V1_0/PhysicalSensor;
-Landroid/hardware/contexthub/V1_1/Setting;
-Landroid/hardware/devicestate/DeviceState;
-Landroid/hardware/devicestate/DeviceStateInfo$1;
-Landroid/hardware/devicestate/DeviceStateInfo;
-Landroid/hardware/devicestate/DeviceStateManager$DeviceStateCallback;
-Landroid/hardware/devicestate/DeviceStateManager$FoldStateListener;
-Landroid/hardware/devicestate/DeviceStateManager;
-Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda0;
-Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda1;
-Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda2;
-Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper;
-Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback-IA;
-Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback;
-Landroid/hardware/devicestate/DeviceStateManagerGlobal;
-Landroid/hardware/devicestate/IDeviceStateManager$Stub$Proxy;
-Landroid/hardware/devicestate/IDeviceStateManager$Stub;
-Landroid/hardware/devicestate/IDeviceStateManager;
-Landroid/hardware/devicestate/IDeviceStateManagerCallback$Stub;
-Landroid/hardware/devicestate/IDeviceStateManagerCallback;
-Landroid/hardware/display/AmbientBrightnessDayStats$1;
-Landroid/hardware/display/AmbientBrightnessDayStats;
-Landroid/hardware/display/AmbientDisplayConfiguration;
-Landroid/hardware/display/BrightnessChangeEvent$1;
-Landroid/hardware/display/BrightnessChangeEvent$Builder;
-Landroid/hardware/display/BrightnessChangeEvent;
-Landroid/hardware/display/BrightnessConfiguration$1;
-Landroid/hardware/display/BrightnessConfiguration$Builder;
-Landroid/hardware/display/BrightnessConfiguration;
-Landroid/hardware/display/BrightnessCorrection$1;
-Landroid/hardware/display/BrightnessCorrection$BrightnessCorrectionImplementation;
-Landroid/hardware/display/BrightnessCorrection$ScaleAndTranslateLog;
-Landroid/hardware/display/BrightnessCorrection;
-Landroid/hardware/display/BrightnessInfo$1;
-Landroid/hardware/display/BrightnessInfo;
-Landroid/hardware/display/ColorDisplayManager$ColorDisplayManagerInternal;
-Landroid/hardware/display/ColorDisplayManager;
-Landroid/hardware/display/Curve$1;
-Landroid/hardware/display/Curve;
-Landroid/hardware/display/DeviceProductInfo$1;
-Landroid/hardware/display/DeviceProductInfo$ManufactureDate$1;
-Landroid/hardware/display/DeviceProductInfo$ManufactureDate;
-Landroid/hardware/display/DeviceProductInfo-IA;
-Landroid/hardware/display/DeviceProductInfo;
-Landroid/hardware/display/DisplayManager$$ExternalSyntheticLambda0;
-Landroid/hardware/display/DisplayManager$$ExternalSyntheticLambda1;
-Landroid/hardware/display/DisplayManager$$ExternalSyntheticLambda2;
-Landroid/hardware/display/DisplayManager$DisplayListener;
-Landroid/hardware/display/DisplayManager$WeakDisplayCache-IA;
-Landroid/hardware/display/DisplayManager$WeakDisplayCache;
-Landroid/hardware/display/DisplayManager;
-Landroid/hardware/display/DisplayManagerGlobal$1;
-Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate$$ExternalSyntheticLambda0;
-Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;
-Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback-IA;
-Landroid/hardware/display/DisplayManagerGlobal;
-Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;
-Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;
-Landroid/hardware/display/DisplayManagerInternal;
-Landroid/hardware/display/DisplayViewport;
-Landroid/hardware/display/DisplayedContentSample;
-Landroid/hardware/display/DisplayedContentSamplingAttributes;
-Landroid/hardware/display/HdrConversionMode$1;
-Landroid/hardware/display/HdrConversionMode;
-Landroid/hardware/display/IColorDisplayManager$Stub$Proxy;
-Landroid/hardware/display/IColorDisplayManager$Stub;
-Landroid/hardware/display/IColorDisplayManager;
-Landroid/hardware/display/IDisplayManager$Stub$Proxy;
-Landroid/hardware/display/IDisplayManager$Stub;
-Landroid/hardware/display/IDisplayManager;
-Landroid/hardware/display/IDisplayManagerCallback$Stub;
-Landroid/hardware/display/IDisplayManagerCallback;
-Landroid/hardware/display/IVirtualDisplayCallback$Stub$Proxy;
-Landroid/hardware/display/IVirtualDisplayCallback$Stub;
-Landroid/hardware/display/IVirtualDisplayCallback;
-Landroid/hardware/display/NightDisplayListener$1;
-Landroid/hardware/display/NightDisplayListener$Callback;
-Landroid/hardware/display/NightDisplayListener;
-Landroid/hardware/display/Time$1;
-Landroid/hardware/display/Time;
-Landroid/hardware/display/VirtualDisplayConfig$1;
-Landroid/hardware/display/VirtualDisplayConfig;
-Landroid/hardware/display/WifiDisplay$1;
-Landroid/hardware/display/WifiDisplay;
-Landroid/hardware/display/WifiDisplaySessionInfo$1;
-Landroid/hardware/display/WifiDisplaySessionInfo;
-Landroid/hardware/display/WifiDisplayStatus$1;
-Landroid/hardware/display/WifiDisplayStatus;
-Landroid/hardware/face/Face$1;
-Landroid/hardware/face/Face;
-Landroid/hardware/face/FaceManager$1;
-Landroid/hardware/face/FaceManager$AuthenticationCallback;
-Landroid/hardware/face/FaceManager$AuthenticationResult;
-Landroid/hardware/face/FaceManager$EnrollmentCallback;
-Landroid/hardware/face/FaceManager$FaceDetectionCallback;
-Landroid/hardware/face/FaceManager$GenerateChallengeCallback;
-Landroid/hardware/face/FaceManager$GetFeatureCallback;
-Landroid/hardware/face/FaceManager$LockoutResetCallback;
-Landroid/hardware/face/FaceManager$OnAuthenticationCancelListener;
-Landroid/hardware/face/FaceManager$RemovalCallback;
-Landroid/hardware/face/FaceManager$SetFeatureCallback;
-Landroid/hardware/face/FaceManager;
-Landroid/hardware/face/FaceSensorPropertiesInternal$1;
-Landroid/hardware/face/FaceSensorPropertiesInternal;
-Landroid/hardware/face/IFaceAuthenticatorsRegisteredCallback$Stub;
-Landroid/hardware/face/IFaceAuthenticatorsRegisteredCallback;
-Landroid/hardware/face/IFaceService$Stub$Proxy;
-Landroid/hardware/face/IFaceService$Stub;
-Landroid/hardware/face/IFaceService;
-Landroid/hardware/face/IFaceServiceReceiver$Stub$Proxy;
-Landroid/hardware/face/IFaceServiceReceiver$Stub;
-Landroid/hardware/face/IFaceServiceReceiver;
-Landroid/hardware/fingerprint/Fingerprint$1;
-Landroid/hardware/fingerprint/Fingerprint;
-Landroid/hardware/fingerprint/FingerprintManager$1;
-Landroid/hardware/fingerprint/FingerprintManager$2;
-Landroid/hardware/fingerprint/FingerprintManager$3;
-Landroid/hardware/fingerprint/FingerprintManager$AuthenticationCallback;
-Landroid/hardware/fingerprint/FingerprintManager$AuthenticationResult;
-Landroid/hardware/fingerprint/FingerprintManager$LockoutResetCallback;
-Landroid/hardware/fingerprint/FingerprintManager$MyHandler-IA;
-Landroid/hardware/fingerprint/FingerprintManager$MyHandler;
-Landroid/hardware/fingerprint/FingerprintManager;
-Landroid/hardware/fingerprint/FingerprintSensorPropertiesInternal$1;
-Landroid/hardware/fingerprint/FingerprintSensorPropertiesInternal;
-Landroid/hardware/fingerprint/IFingerprintAuthenticatorsRegisteredCallback$Stub;
-Landroid/hardware/fingerprint/IFingerprintAuthenticatorsRegisteredCallback;
-Landroid/hardware/fingerprint/IFingerprintClientActiveCallback$Stub$Proxy;
-Landroid/hardware/fingerprint/IFingerprintClientActiveCallback$Stub;
-Landroid/hardware/fingerprint/IFingerprintClientActiveCallback;
-Landroid/hardware/fingerprint/IFingerprintService$Stub$Proxy;
-Landroid/hardware/fingerprint/IFingerprintService$Stub;
-Landroid/hardware/fingerprint/IFingerprintService;
-Landroid/hardware/fingerprint/IFingerprintServiceReceiver$Stub$Proxy;
-Landroid/hardware/fingerprint/IFingerprintServiceReceiver$Stub;
-Landroid/hardware/fingerprint/IFingerprintServiceReceiver;
-Landroid/hardware/fingerprint/IUdfpsOverlayController;
-Landroid/hardware/fingerprint/IUdfpsRefreshRateRequestCallback$Stub;
-Landroid/hardware/fingerprint/IUdfpsRefreshRateRequestCallback;
-Landroid/hardware/graphics/common/DisplayDecorationSupport$1;
-Landroid/hardware/graphics/common/DisplayDecorationSupport;
-Landroid/hardware/hdmi/HdmiControlManager;
-Landroid/hardware/hdmi/HdmiPlaybackClient$DisplayStatusCallback;
-Landroid/hardware/hdmi/HdmiRecordSources$OwnSource;
-Landroid/hardware/hdmi/HdmiRecordSources$RecordSource;
-Landroid/hardware/input/HostUsiVersion$1;
-Landroid/hardware/input/HostUsiVersion;
-Landroid/hardware/input/IInputDevicesChangedListener$Stub$Proxy;
-Landroid/hardware/input/IInputDevicesChangedListener$Stub;
-Landroid/hardware/input/IInputDevicesChangedListener;
-Landroid/hardware/input/IInputManager$Stub$Proxy;
-Landroid/hardware/input/IInputManager$Stub;
-Landroid/hardware/input/IInputManager;
-Landroid/hardware/input/IInputSensorEventListener$Stub;
-Landroid/hardware/input/IInputSensorEventListener;
-Landroid/hardware/input/ITabletModeChangedListener$Stub$Proxy;
-Landroid/hardware/input/ITabletModeChangedListener$Stub;
-Landroid/hardware/input/ITabletModeChangedListener;
-Landroid/hardware/input/InputDeviceIdentifier$1;
-Landroid/hardware/input/InputDeviceIdentifier;
-Landroid/hardware/input/InputManager$InputDeviceListener;
-Landroid/hardware/input/InputManager;
-Landroid/hardware/input/InputManagerGlobal$InputDeviceListenerDelegate;
-Landroid/hardware/input/InputManagerGlobal$InputDevicesChangedListener-IA;
-Landroid/hardware/input/InputManagerGlobal$InputDevicesChangedListener;
-Landroid/hardware/input/InputManagerGlobal$OnTabletModeChangedListenerDelegate;
-Landroid/hardware/input/InputManagerGlobal;
-Landroid/hardware/input/InputSettings;
-Landroid/hardware/input/KeyboardLayout$1;
-Landroid/hardware/input/KeyboardLayout;
-Landroid/hardware/input/TouchCalibration$1;
-Landroid/hardware/input/TouchCalibration;
-Landroid/hardware/iris/IrisManager;
-Landroid/hardware/lights/ILightsManager$Stub;
-Landroid/hardware/lights/ILightsManager;
-Landroid/hardware/lights/LightsManager;
-Landroid/hardware/location/ActivityRecognitionHardware;
-Landroid/hardware/location/ContextHubClient;
-Landroid/hardware/location/ContextHubClientCallback;
-Landroid/hardware/location/ContextHubInfo$1;
-Landroid/hardware/location/ContextHubInfo-IA;
-Landroid/hardware/location/ContextHubInfo;
-Landroid/hardware/location/ContextHubManager$1;
-Landroid/hardware/location/ContextHubManager$2;
-Landroid/hardware/location/ContextHubManager$3;
-Landroid/hardware/location/ContextHubManager$Callback;
-Landroid/hardware/location/ContextHubManager$ICallback;
-Landroid/hardware/location/ContextHubManager;
-Landroid/hardware/location/ContextHubMessage$1;
-Landroid/hardware/location/ContextHubMessage;
-Landroid/hardware/location/ContextHubTransaction$$ExternalSyntheticLambda0;
-Landroid/hardware/location/ContextHubTransaction$$ExternalSyntheticLambda1;
-Landroid/hardware/location/ContextHubTransaction$OnCompleteListener;
-Landroid/hardware/location/ContextHubTransaction$Response;
-Landroid/hardware/location/ContextHubTransaction;
-Landroid/hardware/location/GeofenceHardware$GeofenceHardwareMonitorCallbackWrapper;
-Landroid/hardware/location/GeofenceHardware;
-Landroid/hardware/location/GeofenceHardwareCallback;
-Landroid/hardware/location/GeofenceHardwareImpl$1;
-Landroid/hardware/location/GeofenceHardwareImpl$2;
-Landroid/hardware/location/GeofenceHardwareImpl$3;
-Landroid/hardware/location/GeofenceHardwareImpl$GeofenceTransition;
-Landroid/hardware/location/GeofenceHardwareImpl$Reaper;
-Landroid/hardware/location/GeofenceHardwareImpl;
-Landroid/hardware/location/GeofenceHardwareMonitorCallback;
-Landroid/hardware/location/GeofenceHardwareMonitorEvent$1;
-Landroid/hardware/location/GeofenceHardwareMonitorEvent;
-Landroid/hardware/location/GeofenceHardwareRequest;
-Landroid/hardware/location/GeofenceHardwareRequestParcelable$1;
-Landroid/hardware/location/GeofenceHardwareRequestParcelable;
-Landroid/hardware/location/GeofenceHardwareService$1;
-Landroid/hardware/location/GeofenceHardwareService;
-Landroid/hardware/location/IActivityRecognitionHardware$Stub$Proxy;
-Landroid/hardware/location/IActivityRecognitionHardware$Stub;
-Landroid/hardware/location/IActivityRecognitionHardware;
-Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub$Proxy;
-Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub;
-Landroid/hardware/location/IActivityRecognitionHardwareClient;
-Landroid/hardware/location/IContextHubCallback$Stub$Proxy;
-Landroid/hardware/location/IContextHubCallback$Stub;
-Landroid/hardware/location/IContextHubCallback;
-Landroid/hardware/location/IContextHubClient$Stub$Proxy;
-Landroid/hardware/location/IContextHubClient$Stub;
-Landroid/hardware/location/IContextHubClient;
-Landroid/hardware/location/IContextHubClientCallback$Stub$Proxy;
-Landroid/hardware/location/IContextHubClientCallback$Stub;
-Landroid/hardware/location/IContextHubClientCallback;
-Landroid/hardware/location/IContextHubService$Stub$Proxy;
-Landroid/hardware/location/IContextHubService$Stub;
-Landroid/hardware/location/IContextHubService;
-Landroid/hardware/location/IContextHubTransactionCallback$Stub$Proxy;
-Landroid/hardware/location/IContextHubTransactionCallback$Stub;
-Landroid/hardware/location/IContextHubTransactionCallback;
-Landroid/hardware/location/IGeofenceHardware$Stub$Proxy;
-Landroid/hardware/location/IGeofenceHardware$Stub;
-Landroid/hardware/location/IGeofenceHardware;
-Landroid/hardware/location/IGeofenceHardwareCallback$Stub$Proxy;
-Landroid/hardware/location/IGeofenceHardwareCallback$Stub;
-Landroid/hardware/location/IGeofenceHardwareCallback;
-Landroid/hardware/location/IGeofenceHardwareMonitorCallback$Stub$Proxy;
-Landroid/hardware/location/IGeofenceHardwareMonitorCallback$Stub;
-Landroid/hardware/location/IGeofenceHardwareMonitorCallback;
-Landroid/hardware/location/MemoryRegion$1;
-Landroid/hardware/location/MemoryRegion;
-Landroid/hardware/location/NanoApp$1;
-Landroid/hardware/location/NanoApp;
-Landroid/hardware/location/NanoAppBinary$1;
-Landroid/hardware/location/NanoAppBinary;
-Landroid/hardware/location/NanoAppFilter$1;
-Landroid/hardware/location/NanoAppFilter;
-Landroid/hardware/location/NanoAppInstanceInfo$1;
-Landroid/hardware/location/NanoAppInstanceInfo;
-Landroid/hardware/location/NanoAppMessage$1;
-Landroid/hardware/location/NanoAppMessage-IA;
-Landroid/hardware/location/NanoAppMessage;
-Landroid/hardware/location/NanoAppRpcService$1;
-Landroid/hardware/location/NanoAppRpcService;
-Landroid/hardware/location/NanoAppState$1;
-Landroid/hardware/location/NanoAppState-IA;
-Landroid/hardware/location/NanoAppState;
-Landroid/hardware/power/SessionMode;
-Landroid/hardware/radio/ITuner$Stub;
-Landroid/hardware/radio/ITuner;
-Landroid/hardware/radio/ITunerCallback;
-Landroid/hardware/radio/ProgramSelector$1;
-Landroid/hardware/radio/ProgramSelector$Identifier$1;
-Landroid/hardware/radio/ProgramSelector$Identifier;
-Landroid/hardware/radio/ProgramSelector;
-Landroid/hardware/radio/RadioManager$AmBandConfig$1;
-Landroid/hardware/radio/RadioManager$AmBandConfig;
-Landroid/hardware/radio/RadioManager$AmBandDescriptor$1;
-Landroid/hardware/radio/RadioManager$AmBandDescriptor;
-Landroid/hardware/radio/RadioManager$BandConfig$1;
-Landroid/hardware/radio/RadioManager$BandConfig;
-Landroid/hardware/radio/RadioManager$BandDescriptor$1;
-Landroid/hardware/radio/RadioManager$BandDescriptor;
-Landroid/hardware/radio/RadioManager$FmBandConfig$1;
-Landroid/hardware/radio/RadioManager$FmBandConfig;
-Landroid/hardware/radio/RadioManager$FmBandDescriptor$1;
-Landroid/hardware/radio/RadioManager$FmBandDescriptor;
-Landroid/hardware/radio/RadioManager$ModuleProperties$1;
-Landroid/hardware/radio/RadioManager$ModuleProperties;
-Landroid/hardware/radio/RadioManager$ProgramInfo$1;
-Landroid/hardware/radio/RadioManager$ProgramInfo;
-Landroid/hardware/radio/RadioManager;
-Landroid/hardware/radio/RadioMetadata$1;
-Landroid/hardware/radio/RadioMetadata;
-Landroid/hardware/radio/V1_0/ActivityStatsInfo;
-Landroid/hardware/radio/V1_0/AppStatus;
-Landroid/hardware/radio/V1_0/Call;
-Landroid/hardware/radio/V1_0/CallForwardInfo;
-Landroid/hardware/radio/V1_0/CardState;
-Landroid/hardware/radio/V1_0/CardStatus;
-Landroid/hardware/radio/V1_0/Carrier;
-Landroid/hardware/radio/V1_0/CarrierRestrictions;
-Landroid/hardware/radio/V1_0/CdmaBroadcastSmsConfigInfo;
-Landroid/hardware/radio/V1_0/CdmaCallWaiting;
-Landroid/hardware/radio/V1_0/CdmaDisplayInfoRecord;
-Landroid/hardware/radio/V1_0/CdmaInformationRecord;
-Landroid/hardware/radio/V1_0/CdmaInformationRecords;
-Landroid/hardware/radio/V1_0/CdmaLineControlInfoRecord;
-Landroid/hardware/radio/V1_0/CdmaNumberInfoRecord;
-Landroid/hardware/radio/V1_0/CdmaRedirectingNumberInfoRecord;
-Landroid/hardware/radio/V1_0/CdmaSignalInfoRecord;
-Landroid/hardware/radio/V1_0/CdmaSignalStrength;
-Landroid/hardware/radio/V1_0/CdmaSmsAck;
-Landroid/hardware/radio/V1_0/CdmaSmsAddress;
-Landroid/hardware/radio/V1_0/CdmaSmsMessage;
-Landroid/hardware/radio/V1_0/CdmaSmsSubaddress;
-Landroid/hardware/radio/V1_0/CdmaSmsWriteArgs;
-Landroid/hardware/radio/V1_0/CdmaT53AudioControlInfoRecord;
-Landroid/hardware/radio/V1_0/CdmaT53ClirInfoRecord;
-Landroid/hardware/radio/V1_0/CellIdentity;
-Landroid/hardware/radio/V1_0/CellIdentityCdma;
-Landroid/hardware/radio/V1_0/CellIdentityGsm;
-Landroid/hardware/radio/V1_0/CellIdentityLte;
-Landroid/hardware/radio/V1_0/CellIdentityTdscdma;
-Landroid/hardware/radio/V1_0/CellIdentityWcdma;
-Landroid/hardware/radio/V1_0/CellInfo;
-Landroid/hardware/radio/V1_0/CellInfoCdma;
-Landroid/hardware/radio/V1_0/CellInfoGsm;
-Landroid/hardware/radio/V1_0/CellInfoLte;
-Landroid/hardware/radio/V1_0/CellInfoTdscdma;
-Landroid/hardware/radio/V1_0/CellInfoType;
-Landroid/hardware/radio/V1_0/CellInfoWcdma;
-Landroid/hardware/radio/V1_0/CfData;
-Landroid/hardware/radio/V1_0/DataCallFailCause;
-Landroid/hardware/radio/V1_0/DataProfileInfo;
-Landroid/hardware/radio/V1_0/DataRegStateResult;
-Landroid/hardware/radio/V1_0/Dial;
-Landroid/hardware/radio/V1_0/EvdoSignalStrength;
-Landroid/hardware/radio/V1_0/GsmBroadcastSmsConfigInfo;
-Landroid/hardware/radio/V1_0/GsmSignalStrength;
-Landroid/hardware/radio/V1_0/GsmSmsMessage;
-Landroid/hardware/radio/V1_0/HardwareConfig;
-Landroid/hardware/radio/V1_0/HardwareConfigModem;
-Landroid/hardware/radio/V1_0/HardwareConfigSim;
-Landroid/hardware/radio/V1_0/IRadio;
-Landroid/hardware/radio/V1_0/IRadioIndication;
-Landroid/hardware/radio/V1_0/IRadioResponse;
-Landroid/hardware/radio/V1_0/IccIo;
-Landroid/hardware/radio/V1_0/IccIoResult;
-Landroid/hardware/radio/V1_0/ImsSmsMessage;
-Landroid/hardware/radio/V1_0/LastCallFailCauseInfo;
-Landroid/hardware/radio/V1_0/LceDataInfo;
-Landroid/hardware/radio/V1_0/LceStatusInfo;
-Landroid/hardware/radio/V1_0/LteSignalStrength;
-Landroid/hardware/radio/V1_0/NeighboringCell;
-Landroid/hardware/radio/V1_0/NvWriteItem;
-Landroid/hardware/radio/V1_0/OperatorInfo;
-Landroid/hardware/radio/V1_0/PcoDataInfo;
-Landroid/hardware/radio/V1_0/RadioCapability;
-Landroid/hardware/radio/V1_0/RadioResponseInfo;
-Landroid/hardware/radio/V1_0/RegState;
-Landroid/hardware/radio/V1_0/SelectUiccSub;
-Landroid/hardware/radio/V1_0/SendSmsResult;
-Landroid/hardware/radio/V1_0/SetupDataCallResult;
-Landroid/hardware/radio/V1_0/SignalStrength;
-Landroid/hardware/radio/V1_0/SimApdu;
-Landroid/hardware/radio/V1_0/SimRefreshResult;
-Landroid/hardware/radio/V1_0/SmsWriteArgs;
-Landroid/hardware/radio/V1_0/SsInfoData;
-Landroid/hardware/radio/V1_0/StkCcUnsolSsResult;
-Landroid/hardware/radio/V1_0/SuppSvcNotification;
-Landroid/hardware/radio/V1_0/TdScdmaSignalStrength;
-Landroid/hardware/radio/V1_0/UusInfo;
-Landroid/hardware/radio/V1_0/VoiceRegStateResult;
-Landroid/hardware/radio/V1_0/WcdmaSignalStrength;
-Landroid/hardware/radio/V1_1/IRadio$Proxy;
-Landroid/hardware/radio/V1_1/IRadio;
-Landroid/hardware/radio/V1_1/IRadioIndication;
-Landroid/hardware/radio/V1_1/IRadioResponse;
-Landroid/hardware/radio/V1_1/ImsiEncryptionInfo;
-Landroid/hardware/radio/V1_1/KeepaliveRequest;
-Landroid/hardware/radio/V1_1/KeepaliveStatus;
-Landroid/hardware/radio/V1_1/NetworkScanRequest;
-Landroid/hardware/radio/V1_1/NetworkScanResult;
-Landroid/hardware/radio/V1_1/RadioAccessSpecifier;
-Landroid/hardware/radio/V1_2/Call;
-Landroid/hardware/radio/V1_2/CardStatus;
-Landroid/hardware/radio/V1_2/CellIdentity;
-Landroid/hardware/radio/V1_2/CellIdentityCdma;
-Landroid/hardware/radio/V1_2/CellIdentityGsm;
-Landroid/hardware/radio/V1_2/CellIdentityLte;
-Landroid/hardware/radio/V1_2/CellIdentityOperatorNames;
-Landroid/hardware/radio/V1_2/CellIdentityTdscdma;
-Landroid/hardware/radio/V1_2/CellIdentityWcdma;
-Landroid/hardware/radio/V1_2/CellInfo;
-Landroid/hardware/radio/V1_2/CellInfoCdma;
-Landroid/hardware/radio/V1_2/CellInfoGsm;
-Landroid/hardware/radio/V1_2/CellInfoLte;
-Landroid/hardware/radio/V1_2/CellInfoTdscdma;
-Landroid/hardware/radio/V1_2/CellInfoWcdma;
-Landroid/hardware/radio/V1_2/DataRegStateResult;
-Landroid/hardware/radio/V1_2/IRadio;
-Landroid/hardware/radio/V1_2/IRadioIndication;
-Landroid/hardware/radio/V1_2/IRadioResponse;
-Landroid/hardware/radio/V1_2/LinkCapacityEstimate;
-Landroid/hardware/radio/V1_2/NetworkScanRequest;
-Landroid/hardware/radio/V1_2/NetworkScanResult;
-Landroid/hardware/radio/V1_2/PhysicalChannelConfig;
-Landroid/hardware/radio/V1_2/SignalStrength;
-Landroid/hardware/radio/V1_2/TdscdmaSignalStrength;
-Landroid/hardware/radio/V1_2/VoiceRegStateResult;
-Landroid/hardware/radio/V1_2/WcdmaSignalStrength;
-Landroid/hardware/radio/V1_3/IRadio$Proxy;
-Landroid/hardware/radio/V1_3/IRadio;
-Landroid/hardware/radio/V1_3/IRadioIndication;
-Landroid/hardware/radio/V1_3/IRadioResponse;
-Landroid/hardware/radio/V1_4/CardStatus;
-Landroid/hardware/radio/V1_4/CarrierRestrictionsWithPriority;
-Landroid/hardware/radio/V1_4/CellConfigLte;
-Landroid/hardware/radio/V1_4/CellIdentityNr;
-Landroid/hardware/radio/V1_4/CellInfo$Info;
-Landroid/hardware/radio/V1_4/CellInfo;
-Landroid/hardware/radio/V1_4/CellInfoLte;
-Landroid/hardware/radio/V1_4/CellInfoNr;
-Landroid/hardware/radio/V1_4/DataProfileInfo;
-Landroid/hardware/radio/V1_4/DataRegStateResult$VopsInfo$hidl_discriminator;
-Landroid/hardware/radio/V1_4/DataRegStateResult$VopsInfo;
-Landroid/hardware/radio/V1_4/DataRegStateResult;
-Landroid/hardware/radio/V1_4/EmergencyNumber;
-Landroid/hardware/radio/V1_4/IRadio$Proxy;
-Landroid/hardware/radio/V1_4/IRadio;
-Landroid/hardware/radio/V1_4/IRadioIndication$Stub;
-Landroid/hardware/radio/V1_4/IRadioIndication;
-Landroid/hardware/radio/V1_4/IRadioResponse$Stub;
-Landroid/hardware/radio/V1_4/IRadioResponse;
-Landroid/hardware/radio/V1_4/LteVopsInfo;
-Landroid/hardware/radio/V1_4/NetworkScanResult;
-Landroid/hardware/radio/V1_4/NrIndicators;
-Landroid/hardware/radio/V1_4/NrSignalStrength;
-Landroid/hardware/radio/V1_4/PhysicalChannelConfig;
-Landroid/hardware/radio/V1_4/RadioFrequencyInfo;
-Landroid/hardware/radio/V1_4/SetupDataCallResult;
-Landroid/hardware/radio/V1_4/SignalStrength;
-Landroid/hardware/radio/V1_5/AppStatus;
-Landroid/hardware/radio/V1_5/CardStatus;
-Landroid/hardware/radio/V1_5/CellIdentity;
-Landroid/hardware/radio/V1_5/CellIdentityGsm;
-Landroid/hardware/radio/V1_5/CellIdentityLte;
-Landroid/hardware/radio/V1_5/CellIdentityNr;
-Landroid/hardware/radio/V1_5/CellIdentityTdscdma;
-Landroid/hardware/radio/V1_5/CellIdentityWcdma;
-Landroid/hardware/radio/V1_5/CellInfo;
-Landroid/hardware/radio/V1_5/ClosedSubscriberGroupInfo;
-Landroid/hardware/radio/V1_5/DataProfileInfo;
-Landroid/hardware/radio/V1_5/IRadio;
-Landroid/hardware/radio/V1_5/IRadioIndication$Stub;
-Landroid/hardware/radio/V1_5/IRadioIndication;
-Landroid/hardware/radio/V1_5/IRadioResponse$Stub;
-Landroid/hardware/radio/V1_5/IRadioResponse;
-Landroid/hardware/radio/V1_5/LinkAddress;
-Landroid/hardware/radio/V1_5/NetworkScanRequest;
-Landroid/hardware/radio/V1_5/NetworkScanResult;
-Landroid/hardware/radio/V1_5/OptionalCsgInfo;
-Landroid/hardware/radio/V1_5/RadioAccessSpecifier$Bands;
-Landroid/hardware/radio/V1_5/RadioAccessSpecifier;
-Landroid/hardware/radio/V1_5/RegStateResult$AccessTechnologySpecificInfo$Cdma2000RegistrationInfo;
-Landroid/hardware/radio/V1_5/RegStateResult$AccessTechnologySpecificInfo$EutranRegistrationInfo;
-Landroid/hardware/radio/V1_5/RegStateResult$AccessTechnologySpecificInfo;
-Landroid/hardware/radio/V1_5/RegStateResult;
-Landroid/hardware/radio/V1_5/SetupDataCallResult;
-Landroid/hardware/radio/V1_5/SignalThresholdInfo;
-Landroid/hardware/radio/V1_6/Call;
-Landroid/hardware/radio/V1_6/CellInfo;
-Landroid/hardware/radio/V1_6/IRadio;
-Landroid/hardware/radio/V1_6/IRadioIndication$Stub;
-Landroid/hardware/radio/V1_6/IRadioIndication;
-Landroid/hardware/radio/V1_6/IRadioResponse$Stub;
-Landroid/hardware/radio/V1_6/IRadioResponse;
-Landroid/hardware/radio/V1_6/ImsiEncryptionInfo;
-Landroid/hardware/radio/V1_6/LinkCapacityEstimate;
-Landroid/hardware/radio/V1_6/NetworkScanResult;
-Landroid/hardware/radio/V1_6/NrVopsInfo;
-Landroid/hardware/radio/V1_6/OptionalDnn;
-Landroid/hardware/radio/V1_6/OptionalOsAppId;
-Landroid/hardware/radio/V1_6/OptionalSliceInfo;
-Landroid/hardware/radio/V1_6/OptionalTrafficDescriptor;
-Landroid/hardware/radio/V1_6/OsAppId;
-Landroid/hardware/radio/V1_6/PhonebookCapacity;
-Landroid/hardware/radio/V1_6/PhonebookRecordInfo;
-Landroid/hardware/radio/V1_6/PhysicalChannelConfig$Band;
-Landroid/hardware/radio/V1_6/PhysicalChannelConfig;
-Landroid/hardware/radio/V1_6/Qos;
-Landroid/hardware/radio/V1_6/QosSession;
-Landroid/hardware/radio/V1_6/RadioResponseInfo;
-Landroid/hardware/radio/V1_6/RegStateResult$AccessTechnologySpecificInfo;
-Landroid/hardware/radio/V1_6/RegStateResult;
-Landroid/hardware/radio/V1_6/SetupDataCallResult;
-Landroid/hardware/radio/V1_6/SignalStrength;
-Landroid/hardware/radio/V1_6/SliceInfo;
-Landroid/hardware/radio/V1_6/SlicingConfig;
-Landroid/hardware/radio/V1_6/TrafficDescriptor;
-Landroid/hardware/radio/config/V1_0/IRadioConfig;
-Landroid/hardware/radio/config/V1_0/IRadioConfigIndication;
-Landroid/hardware/radio/config/V1_0/IRadioConfigResponse;
-Landroid/hardware/radio/config/V1_0/SimSlotStatus;
-Landroid/hardware/radio/config/V1_0/SlotState;
-Landroid/hardware/radio/config/V1_1/IRadioConfig$Proxy;
-Landroid/hardware/radio/config/V1_1/IRadioConfig;
-Landroid/hardware/radio/config/V1_1/IRadioConfigResponse;
-Landroid/hardware/radio/config/V1_1/ModemInfo;
-Landroid/hardware/radio/config/V1_1/ModemsConfig;
-Landroid/hardware/radio/config/V1_1/PhoneCapability;
-Landroid/hardware/radio/config/V1_2/IRadioConfigIndication$Stub;
-Landroid/hardware/radio/config/V1_2/IRadioConfigIndication;
-Landroid/hardware/radio/config/V1_2/IRadioConfigResponse;
-Landroid/hardware/radio/config/V1_2/SimSlotStatus;
-Landroid/hardware/radio/config/V1_3/IRadioConfig$Proxy;
-Landroid/hardware/radio/config/V1_3/IRadioConfig;
-Landroid/hardware/radio/config/V1_3/IRadioConfigResponse$Stub;
-Landroid/hardware/radio/config/V1_3/IRadioConfigResponse;
-Landroid/hardware/security/keymint/KeyParameter$1;
-Landroid/hardware/security/keymint/KeyParameter;
-Landroid/hardware/security/keymint/KeyParameterValue$1;
-Landroid/hardware/security/keymint/KeyParameterValue-IA;
-Landroid/hardware/security/keymint/KeyParameterValue;
-Landroid/hardware/sidekick/SidekickInternal;
-Landroid/hardware/soundtrigger/ConversionUtil;
-Landroid/hardware/soundtrigger/IRecognitionStatusCallback$Stub$Proxy;
-Landroid/hardware/soundtrigger/IRecognitionStatusCallback$Stub;
-Landroid/hardware/soundtrigger/IRecognitionStatusCallback;
-Landroid/hardware/soundtrigger/KeyphraseEnrollmentInfo;
-Landroid/hardware/soundtrigger/KeyphraseMetadata$1;
-Landroid/hardware/soundtrigger/KeyphraseMetadata;
-Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel$1;
-Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;
-Landroid/hardware/soundtrigger/SoundTrigger$GenericRecognitionEvent$1;
-Landroid/hardware/soundtrigger/SoundTrigger$GenericRecognitionEvent;
-Landroid/hardware/soundtrigger/SoundTrigger$GenericSoundModel$1;
-Landroid/hardware/soundtrigger/SoundTrigger$GenericSoundModel;
-Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase$1;
-Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;
-Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionEvent$1;
-Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionEvent;
-Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra$1;
-Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;
-Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel$1;
-Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;
-Landroid/hardware/soundtrigger/SoundTrigger$ModelParamRange$1;
-Landroid/hardware/soundtrigger/SoundTrigger$ModelParamRange;
-Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties$1;
-Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;
-Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig$1;
-Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;
-Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent$1;
-Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent;
-Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;
-Landroid/hardware/soundtrigger/SoundTrigger$StatusListener;
-Landroid/hardware/soundtrigger/SoundTrigger;
-Landroid/hardware/soundtrigger/SoundTriggerModule$EventHandlerDelegate$1;
-Landroid/hardware/soundtrigger/SoundTriggerModule$EventHandlerDelegate;
-Landroid/hardware/soundtrigger/SoundTriggerModule;
-Landroid/hardware/thermal/V1_0/CoolingType;
-Landroid/hardware/thermal/V1_0/IThermal;
-Landroid/hardware/thermal/V1_0/ThermalStatus;
-Landroid/hardware/thermal/V2_0/CoolingDevice;
-Landroid/hardware/thermal/V2_0/IThermal$Proxy;
-Landroid/hardware/thermal/V2_0/IThermal$getCurrentCoolingDevicesCallback;
-Landroid/hardware/thermal/V2_0/IThermal$getCurrentTemperaturesCallback;
-Landroid/hardware/thermal/V2_0/IThermal$getTemperatureThresholdsCallback;
-Landroid/hardware/thermal/V2_0/IThermal;
-Landroid/hardware/thermal/V2_0/IThermalChangedCallback$Stub;
-Landroid/hardware/thermal/V2_0/IThermalChangedCallback;
-Landroid/hardware/thermal/V2_0/Temperature;
-Landroid/hardware/thermal/V2_0/TemperatureThreshold;
-Landroid/hardware/usb/AccessoryFilter;
-Landroid/hardware/usb/DeviceFilter;
-Landroid/hardware/usb/IUsbManager$Stub$Proxy;
-Landroid/hardware/usb/IUsbManager$Stub;
-Landroid/hardware/usb/IUsbManager;
-Landroid/hardware/usb/IUsbSerialReader$Stub;
-Landroid/hardware/usb/IUsbSerialReader;
-Landroid/hardware/usb/ParcelableUsbPort$1;
-Landroid/hardware/usb/ParcelableUsbPort;
-Landroid/hardware/usb/UsbAccessory$2;
-Landroid/hardware/usb/UsbAccessory;
-Landroid/hardware/usb/UsbConfiguration$1;
-Landroid/hardware/usb/UsbConfiguration;
-Landroid/hardware/usb/UsbDevice$1;
-Landroid/hardware/usb/UsbDevice$Builder;
-Landroid/hardware/usb/UsbDevice;
-Landroid/hardware/usb/UsbDeviceConnection;
-Landroid/hardware/usb/UsbInterface$1;
-Landroid/hardware/usb/UsbInterface;
-Landroid/hardware/usb/UsbManager;
-Landroid/hardware/usb/UsbPort;
-Landroid/hardware/usb/UsbPortStatus$1;
-Landroid/hardware/usb/UsbPortStatus;
-Landroid/hardware/usb/UsbRequest;
-Landroid/hardware/usb/gadget/V1_0/IUsbGadget$Proxy;
-Landroid/hardware/usb/gadget/V1_0/IUsbGadget;
-Landroid/hardware/usb/gadget/V1_0/IUsbGadgetCallback$Stub;
-Landroid/hardware/usb/gadget/V1_0/IUsbGadgetCallback;
-Landroid/icu/impl/Assert;
-Landroid/icu/impl/BMPSet;
-Landroid/icu/impl/CSCharacterIterator;
-Landroid/icu/impl/CacheBase;
-Landroid/icu/impl/CacheValue$NullValue;
-Landroid/icu/impl/CacheValue$SoftValue;
-Landroid/icu/impl/CacheValue$Strength;
-Landroid/icu/impl/CacheValue$StrongValue;
-Landroid/icu/impl/CacheValue;
-Landroid/icu/impl/CalType;
-Landroid/icu/impl/CalendarAstronomer$1;
-Landroid/icu/impl/CalendarAstronomer$2;
-Landroid/icu/impl/CalendarAstronomer$3;
-Landroid/icu/impl/CalendarAstronomer$4;
-Landroid/icu/impl/CalendarAstronomer$AngleFunc;
-Landroid/icu/impl/CalendarAstronomer$CoordFunc;
-Landroid/icu/impl/CalendarAstronomer$Ecliptic;
-Landroid/icu/impl/CalendarAstronomer$Equatorial;
-Landroid/icu/impl/CalendarAstronomer$Horizon;
-Landroid/icu/impl/CalendarAstronomer$MoonAge;
-Landroid/icu/impl/CalendarAstronomer$SolarLongitude;
-Landroid/icu/impl/CalendarAstronomer;
-Landroid/icu/impl/CalendarCache;
-Landroid/icu/impl/CalendarUtil$CalendarPreferences;
-Landroid/icu/impl/CalendarUtil;
-Landroid/icu/impl/CaseMapImpl$GreekUpper;
-Landroid/icu/impl/CaseMapImpl$StringContextIterator;
-Landroid/icu/impl/CaseMapImpl$WholeStringBreakIterator;
-Landroid/icu/impl/CaseMapImpl;
-Landroid/icu/impl/CharTrie;
-Landroid/icu/impl/CharacterIteration;
-Landroid/icu/impl/CharacterIteratorWrapper;
-Landroid/icu/impl/CharacterPropertiesImpl;
-Landroid/icu/impl/ClassLoaderUtil$1;
-Landroid/icu/impl/ClassLoaderUtil$BootstrapClassLoader;
-Landroid/icu/impl/ClassLoaderUtil;
-Landroid/icu/impl/CollectionSet;
-Landroid/icu/impl/CurrencyData$1;
-Landroid/icu/impl/CurrencyData$CurrencyDisplayInfo;
-Landroid/icu/impl/CurrencyData$CurrencyDisplayInfoProvider;
-Landroid/icu/impl/CurrencyData$CurrencyFormatInfo;
-Landroid/icu/impl/CurrencyData$CurrencySpacingInfo$SpacingPattern;
-Landroid/icu/impl/CurrencyData$CurrencySpacingInfo$SpacingType;
-Landroid/icu/impl/CurrencyData$CurrencySpacingInfo;
-Landroid/icu/impl/CurrencyData$DefaultInfo;
-Landroid/icu/impl/CurrencyData;
-Landroid/icu/impl/DateNumberFormat;
-Landroid/icu/impl/DayPeriodRules$CutoffType;
-Landroid/icu/impl/DayPeriodRules$DayPeriod;
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesCountSink;
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesData;
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;
-Landroid/icu/impl/DayPeriodRules-IA;
-Landroid/icu/impl/DayPeriodRules;
-Landroid/icu/impl/DontCareFieldPosition;
-Landroid/icu/impl/EmojiProps;
-Landroid/icu/impl/EraRules;
-Landroid/icu/impl/FormattedStringBuilder$FieldWrapper;
-Landroid/icu/impl/FormattedStringBuilder;
-Landroid/icu/impl/FormattedValueFieldPositionIteratorImpl$FieldWithValue;
-Landroid/icu/impl/FormattedValueFieldPositionIteratorImpl;
-Landroid/icu/impl/FormattedValueStringBuilderImpl$NullField;
-Landroid/icu/impl/FormattedValueStringBuilderImpl$SpanFieldPlaceholder;
-Landroid/icu/impl/FormattedValueStringBuilderImpl;
-Landroid/icu/impl/Grego;
-Landroid/icu/impl/ICUBinary$Authenticate;
-Landroid/icu/impl/ICUBinary$DatPackageReader$IsAcceptable;
-Landroid/icu/impl/ICUBinary$DatPackageReader;
-Landroid/icu/impl/ICUBinary$DataFile;
-Landroid/icu/impl/ICUBinary$PackageDataFile;
-Landroid/icu/impl/ICUBinary$SingleDataFile;
-Landroid/icu/impl/ICUBinary;
-Landroid/icu/impl/ICUCache;
-Landroid/icu/impl/ICUConfig$1;
-Landroid/icu/impl/ICUConfig;
-Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$CurrencySink$EntrypointTable;
-Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$CurrencySink;
-Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$FormattingData;
-Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$ParsingData;
-Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$VariantSymbol;
-Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo;
-Landroid/icu/impl/ICUCurrencyDisplayInfoProvider;
-Landroid/icu/impl/ICUCurrencyMetaInfo$Collector;
-Landroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector-IA;
-Landroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector;
-Landroid/icu/impl/ICUCurrencyMetaInfo$InfoCollector;
-Landroid/icu/impl/ICUCurrencyMetaInfo$RegionCollector;
-Landroid/icu/impl/ICUCurrencyMetaInfo$UniqueList;
-Landroid/icu/impl/ICUCurrencyMetaInfo;
-Landroid/icu/impl/ICUData$1;
-Landroid/icu/impl/ICUData$2;
-Landroid/icu/impl/ICUData$3;
-Landroid/icu/impl/ICUData;
-Landroid/icu/impl/ICUDataVersion;
-Landroid/icu/impl/ICUDebug;
-Landroid/icu/impl/ICULangDataTables;
-Landroid/icu/impl/ICULocaleService$ICUResourceBundleFactory;
-Landroid/icu/impl/ICULocaleService$LocaleKey;
-Landroid/icu/impl/ICULocaleService$LocaleKeyFactory;
-Landroid/icu/impl/ICULocaleService$SimpleLocaleKeyFactory;
-Landroid/icu/impl/ICULocaleService;
-Landroid/icu/impl/ICUNotifier$NotifyThread;
-Landroid/icu/impl/ICUNotifier;
-Landroid/icu/impl/ICURWLock$Stats;
-Landroid/icu/impl/ICURWLock;
-Landroid/icu/impl/ICURegionDataTables;
-Landroid/icu/impl/ICUResourceBundle$1;
-Landroid/icu/impl/ICUResourceBundle$1AllChildrenSink;
-Landroid/icu/impl/ICUResourceBundle$2$1;
-Landroid/icu/impl/ICUResourceBundle$2;
-Landroid/icu/impl/ICUResourceBundle$3;
-Landroid/icu/impl/ICUResourceBundle$4;
-Landroid/icu/impl/ICUResourceBundle$5;
-Landroid/icu/impl/ICUResourceBundle$AvailEntry;
-Landroid/icu/impl/ICUResourceBundle$AvailableLocalesSink;
-Landroid/icu/impl/ICUResourceBundle$Loader-IA;
-Landroid/icu/impl/ICUResourceBundle$Loader;
-Landroid/icu/impl/ICUResourceBundle$OpenType;
-Landroid/icu/impl/ICUResourceBundle$WholeBundle;
-Landroid/icu/impl/ICUResourceBundle;
-Landroid/icu/impl/ICUResourceBundleImpl$ResourceArray;
-Landroid/icu/impl/ICUResourceBundleImpl$ResourceBinary;
-Landroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;
-Landroid/icu/impl/ICUResourceBundleImpl$ResourceInt;
-Landroid/icu/impl/ICUResourceBundleImpl$ResourceIntVector;
-Landroid/icu/impl/ICUResourceBundleImpl$ResourceString;
-Landroid/icu/impl/ICUResourceBundleImpl$ResourceTable;
-Landroid/icu/impl/ICUResourceBundleImpl;
-Landroid/icu/impl/ICUResourceBundleReader$Array16;
-Landroid/icu/impl/ICUResourceBundleReader$Array32;
-Landroid/icu/impl/ICUResourceBundleReader$Array;
-Landroid/icu/impl/ICUResourceBundleReader$Container;
-Landroid/icu/impl/ICUResourceBundleReader$IsAcceptable;
-Landroid/icu/impl/ICUResourceBundleReader$ReaderCache;
-Landroid/icu/impl/ICUResourceBundleReader$ReaderCacheKey;
-Landroid/icu/impl/ICUResourceBundleReader$ReaderValue;
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;
-Landroid/icu/impl/ICUResourceBundleReader$Table1632;
-Landroid/icu/impl/ICUResourceBundleReader$Table16;
-Landroid/icu/impl/ICUResourceBundleReader$Table32;
-Landroid/icu/impl/ICUResourceBundleReader$Table;
-Landroid/icu/impl/ICUResourceBundleReader-IA;
-Landroid/icu/impl/ICUResourceBundleReader;
-Landroid/icu/impl/ICUResourceTableAccess;
-Landroid/icu/impl/ICUService$CacheEntry;
-Landroid/icu/impl/ICUService$Factory;
-Landroid/icu/impl/ICUService$Key;
-Landroid/icu/impl/ICUService$LocaleRef;
-Landroid/icu/impl/ICUService$ServiceListener;
-Landroid/icu/impl/ICUService$SimpleFactory;
-Landroid/icu/impl/ICUService;
-Landroid/icu/impl/IDNA2003;
-Landroid/icu/impl/IllegalIcuArgumentException;
-Landroid/icu/impl/IntTrie;
-Landroid/icu/impl/IntTrieBuilder;
-Landroid/icu/impl/InvalidFormatException;
-Landroid/icu/impl/IterableComparator;
-Landroid/icu/impl/JavaTimeZone;
-Landroid/icu/impl/LocaleDisplayNamesImpl$1;
-Landroid/icu/impl/LocaleDisplayNamesImpl$Cache;
-Landroid/icu/impl/LocaleDisplayNamesImpl$CapitalizationContextSink;
-Landroid/icu/impl/LocaleDisplayNamesImpl$CapitalizationContextUsage;
-Landroid/icu/impl/LocaleDisplayNamesImpl$DataTable;
-Landroid/icu/impl/LocaleDisplayNamesImpl$DataTableType;
-Landroid/icu/impl/LocaleDisplayNamesImpl$DataTables$1;
-Landroid/icu/impl/LocaleDisplayNamesImpl$DataTables;
-Landroid/icu/impl/LocaleDisplayNamesImpl$ICUDataTable;
-Landroid/icu/impl/LocaleDisplayNamesImpl$ICUDataTables;
-Landroid/icu/impl/LocaleDisplayNamesImpl$LangDataTables;
-Landroid/icu/impl/LocaleDisplayNamesImpl$RegionDataTables;
-Landroid/icu/impl/LocaleDisplayNamesImpl;
-Landroid/icu/impl/LocaleFallbackData;
-Landroid/icu/impl/LocaleIDParser$1;
-Landroid/icu/impl/LocaleIDParser;
-Landroid/icu/impl/LocaleIDs;
-Landroid/icu/impl/LocaleUtility;
-Landroid/icu/impl/Norm2AllModes$1;
-Landroid/icu/impl/Norm2AllModes$ComposeNormalizer2;
-Landroid/icu/impl/Norm2AllModes$DecomposeNormalizer2;
-Landroid/icu/impl/Norm2AllModes$FCDNormalizer2;
-Landroid/icu/impl/Norm2AllModes$NFCSingleton;
-Landroid/icu/impl/Norm2AllModes$NFKCSingleton;
-Landroid/icu/impl/Norm2AllModes$NFKC_CFSingleton;
-Landroid/icu/impl/Norm2AllModes$NoopNormalizer2;
-Landroid/icu/impl/Norm2AllModes$Norm2AllModesSingleton;
-Landroid/icu/impl/Norm2AllModes$Normalizer2WithImpl;
-Landroid/icu/impl/Norm2AllModes;
-Landroid/icu/impl/Normalizer2Impl$1;
-Landroid/icu/impl/Normalizer2Impl$Hangul;
-Landroid/icu/impl/Normalizer2Impl$IsAcceptable;
-Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;
-Landroid/icu/impl/Normalizer2Impl$UTF16Plus;
-Landroid/icu/impl/Normalizer2Impl;
-Landroid/icu/impl/OlsonTimeZone;
-Landroid/icu/impl/PVecToTrieCompactHandler;
-Landroid/icu/impl/Pair;
-Landroid/icu/impl/PatternProps;
-Landroid/icu/impl/PatternTokenizer;
-Landroid/icu/impl/PluralRulesLoader;
-Landroid/icu/impl/PropsVectors$1;
-Landroid/icu/impl/PropsVectors$CompactHandler;
-Landroid/icu/impl/PropsVectors$DefaultGetFoldedValue;
-Landroid/icu/impl/PropsVectors$DefaultGetFoldingOffset;
-Landroid/icu/impl/PropsVectors;
-Landroid/icu/impl/Punycode;
-Landroid/icu/impl/RBBIDataWrapper$IsAcceptable;
-Landroid/icu/impl/RBBIDataWrapper$RBBIDataHeader;
-Landroid/icu/impl/RBBIDataWrapper$RBBIStateTable;
-Landroid/icu/impl/RBBIDataWrapper;
-Landroid/icu/impl/Relation$SimpleEntry;
-Landroid/icu/impl/Relation;
-Landroid/icu/impl/RelativeDateFormat$RelDateFmtDataSink;
-Landroid/icu/impl/RelativeDateFormat$URelativeString;
-Landroid/icu/impl/RelativeDateFormat;
-Landroid/icu/impl/ReplaceableUCharacterIterator;
-Landroid/icu/impl/ResourceBundleWrapper$1;
-Landroid/icu/impl/ResourceBundleWrapper$2$1;
-Landroid/icu/impl/ResourceBundleWrapper$2;
-Landroid/icu/impl/ResourceBundleWrapper$Loader;
-Landroid/icu/impl/ResourceBundleWrapper;
-Landroid/icu/impl/Row$R2;
-Landroid/icu/impl/Row$R3;
-Landroid/icu/impl/Row$R4;
-Landroid/icu/impl/Row$R5;
-Landroid/icu/impl/Row;
-Landroid/icu/impl/RuleCharacterIterator$Position;
-Landroid/icu/impl/RuleCharacterIterator;
-Landroid/icu/impl/SimpleCache;
-Landroid/icu/impl/SimpleFilteredSentenceBreakIterator$Builder;
-Landroid/icu/impl/SimpleFilteredSentenceBreakIterator;
-Landroid/icu/impl/SimpleFormatterImpl$IterInternal;
-Landroid/icu/impl/SimpleFormatterImpl;
-Landroid/icu/impl/SoftCache;
-Landroid/icu/impl/SortedSetRelation;
-Landroid/icu/impl/StandardPlural;
-Landroid/icu/impl/StaticUnicodeSets$Key;
-Landroid/icu/impl/StaticUnicodeSets$ParseDataSink;
-Landroid/icu/impl/StaticUnicodeSets;
-Landroid/icu/impl/StringPrepDataReader;
-Landroid/icu/impl/StringRange$1;
-Landroid/icu/impl/StringRange$Adder;
-Landroid/icu/impl/StringRange$Range;
-Landroid/icu/impl/StringRange$Ranges;
-Landroid/icu/impl/StringRange;
-Landroid/icu/impl/StringSegment;
-Landroid/icu/impl/TZDBTimeZoneNames$1;
-Landroid/icu/impl/TZDBTimeZoneNames$TZDBNameInfo;
-Landroid/icu/impl/TZDBTimeZoneNames$TZDBNameSearchHandler;
-Landroid/icu/impl/TZDBTimeZoneNames$TZDBNames;
-Landroid/icu/impl/TZDBTimeZoneNames;
-Landroid/icu/impl/TextTrieMap$CharIterator;
-Landroid/icu/impl/TextTrieMap$LongestMatchHandler;
-Landroid/icu/impl/TextTrieMap$Node-IA;
-Landroid/icu/impl/TextTrieMap$Node;
-Landroid/icu/impl/TextTrieMap$Output;
-Landroid/icu/impl/TextTrieMap$ResultHandler;
-Landroid/icu/impl/TextTrieMap;
-Landroid/icu/impl/TimeZoneAdapter;
-Landroid/icu/impl/TimeZoneGenericNames$1;
-Landroid/icu/impl/TimeZoneGenericNames$Cache;
-Landroid/icu/impl/TimeZoneGenericNames$GenericMatchInfo;
-Landroid/icu/impl/TimeZoneGenericNames$GenericNameSearchHandler;
-Landroid/icu/impl/TimeZoneGenericNames$GenericNameType;
-Landroid/icu/impl/TimeZoneGenericNames$NameInfo;
-Landroid/icu/impl/TimeZoneGenericNames$Pattern;
-Landroid/icu/impl/TimeZoneGenericNames;
-Landroid/icu/impl/TimeZoneNamesFactoryImpl;
-Landroid/icu/impl/TimeZoneNamesImpl$1;
-Landroid/icu/impl/TimeZoneNamesImpl$MZ2TZsCache;
-Landroid/icu/impl/TimeZoneNamesImpl$MZMapEntry;
-Landroid/icu/impl/TimeZoneNamesImpl$NameInfo;
-Landroid/icu/impl/TimeZoneNamesImpl$NameSearchHandler;
-Landroid/icu/impl/TimeZoneNamesImpl$TZ2MZsCache;
-Landroid/icu/impl/TimeZoneNamesImpl$ZNames$NameTypeIndex;
-Landroid/icu/impl/TimeZoneNamesImpl$ZNames;
-Landroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader-IA;
-Landroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;
-Landroid/icu/impl/TimeZoneNamesImpl$ZoneStringsLoader;
-Landroid/icu/impl/TimeZoneNamesImpl;
-Landroid/icu/impl/Trie$DataManipulate;
-Landroid/icu/impl/Trie$DefaultGetFoldingOffset;
-Landroid/icu/impl/Trie2$1;
-Landroid/icu/impl/Trie2$CharSequenceIterator;
-Landroid/icu/impl/Trie2$CharSequenceValues;
-Landroid/icu/impl/Trie2$Range;
-Landroid/icu/impl/Trie2$Trie2Iterator;
-Landroid/icu/impl/Trie2$UTrie2Header;
-Landroid/icu/impl/Trie2$ValueMapper;
-Landroid/icu/impl/Trie2$ValueWidth;
-Landroid/icu/impl/Trie2;
-Landroid/icu/impl/Trie2Writable$1;
-Landroid/icu/impl/Trie2Writable;
-Landroid/icu/impl/Trie2_16;
-Landroid/icu/impl/Trie2_32;
-Landroid/icu/impl/Trie;
-Landroid/icu/impl/TrieBuilder$DataManipulate;
-Landroid/icu/impl/TrieBuilder;
-Landroid/icu/impl/TrieIterator;
-Landroid/icu/impl/UBiDiProps$IsAcceptable;
-Landroid/icu/impl/UBiDiProps;
-Landroid/icu/impl/UCaseProps$ContextIterator;
-Landroid/icu/impl/UCaseProps$IsAcceptable;
-Landroid/icu/impl/UCaseProps$LatinCase;
-Landroid/icu/impl/UCaseProps;
-Landroid/icu/impl/UCharArrayIterator;
-Landroid/icu/impl/UCharacterIteratorWrapper;
-Landroid/icu/impl/UCharacterName$AlgorithmName;
-Landroid/icu/impl/UCharacterName;
-Landroid/icu/impl/UCharacterNameChoice;
-Landroid/icu/impl/UCharacterNameReader;
-Landroid/icu/impl/UCharacterProperty$10;
-Landroid/icu/impl/UCharacterProperty$11;
-Landroid/icu/impl/UCharacterProperty$12;
-Landroid/icu/impl/UCharacterProperty$13;
-Landroid/icu/impl/UCharacterProperty$14;
-Landroid/icu/impl/UCharacterProperty$15;
-Landroid/icu/impl/UCharacterProperty$16;
-Landroid/icu/impl/UCharacterProperty$17;
-Landroid/icu/impl/UCharacterProperty$18;
-Landroid/icu/impl/UCharacterProperty$19;
-Landroid/icu/impl/UCharacterProperty$1;
-Landroid/icu/impl/UCharacterProperty$20;
-Landroid/icu/impl/UCharacterProperty$21;
-Landroid/icu/impl/UCharacterProperty$22;
-Landroid/icu/impl/UCharacterProperty$23;
-Landroid/icu/impl/UCharacterProperty$24;
-Landroid/icu/impl/UCharacterProperty$25;
-Landroid/icu/impl/UCharacterProperty$26;
-Landroid/icu/impl/UCharacterProperty$27;
-Landroid/icu/impl/UCharacterProperty$2;
-Landroid/icu/impl/UCharacterProperty$3;
-Landroid/icu/impl/UCharacterProperty$4;
-Landroid/icu/impl/UCharacterProperty$5;
-Landroid/icu/impl/UCharacterProperty$6;
-Landroid/icu/impl/UCharacterProperty$7;
-Landroid/icu/impl/UCharacterProperty$8;
-Landroid/icu/impl/UCharacterProperty$9;
-Landroid/icu/impl/UCharacterProperty$BiDiIntProperty;
-Landroid/icu/impl/UCharacterProperty$BinaryProperty;
-Landroid/icu/impl/UCharacterProperty$CaseBinaryProperty;
-Landroid/icu/impl/UCharacterProperty$CombiningClassIntProperty;
-Landroid/icu/impl/UCharacterProperty$EmojiBinaryProperty;
-Landroid/icu/impl/UCharacterProperty$IntProperty;
-Landroid/icu/impl/UCharacterProperty$IsAcceptable;
-Landroid/icu/impl/UCharacterProperty$LayoutProps$IsAcceptable;
-Landroid/icu/impl/UCharacterProperty$LayoutProps;
-Landroid/icu/impl/UCharacterProperty$NormInertBinaryProperty;
-Landroid/icu/impl/UCharacterProperty$NormQuickCheckIntProperty;
-Landroid/icu/impl/UCharacterProperty;
-Landroid/icu/impl/UCharacterUtility;
-Landroid/icu/impl/UPropertyAliases$IsAcceptable;
-Landroid/icu/impl/UPropertyAliases;
-Landroid/icu/impl/URLHandler$FileURLHandler;
-Landroid/icu/impl/URLHandler$JarURLHandler;
-Landroid/icu/impl/URLHandler$URLVisitor;
-Landroid/icu/impl/URLHandler;
-Landroid/icu/impl/UResource$Array;
-Landroid/icu/impl/UResource$Key;
-Landroid/icu/impl/UResource$Sink;
-Landroid/icu/impl/UResource$Table;
-Landroid/icu/impl/UResource$Value;
-Landroid/icu/impl/UResource;
-Landroid/icu/impl/USerializedSet;
-Landroid/icu/impl/UTS46;
-Landroid/icu/impl/UnicodeRegex$1;
-Landroid/icu/impl/UnicodeRegex;
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;
-Landroid/icu/impl/UnicodeSetStringSpan;
-Landroid/icu/impl/Utility;
-Landroid/icu/impl/UtilityExtensions;
-Landroid/icu/impl/ValidIdentifiers$Datasubtype;
-Landroid/icu/impl/ValidIdentifiers$Datatype;
-Landroid/icu/impl/ValidIdentifiers$ValidityData;
-Landroid/icu/impl/ValidIdentifiers$ValiditySet;
-Landroid/icu/impl/ValidIdentifiers;
-Landroid/icu/impl/ZoneMeta$1;
-Landroid/icu/impl/ZoneMeta$CustomTimeZoneCache;
-Landroid/icu/impl/ZoneMeta$SystemTimeZoneCache;
-Landroid/icu/impl/ZoneMeta;
-Landroid/icu/impl/breakiter/DictionaryBreakEngine$DequeI;
-Landroid/icu/impl/breakiter/DictionaryBreakEngine;
-Landroid/icu/impl/breakiter/LanguageBreakEngine;
-Landroid/icu/impl/breakiter/UnhandledBreakEngine;
-Landroid/icu/impl/coll/BOCSU;
-Landroid/icu/impl/coll/Collation;
-Landroid/icu/impl/coll/CollationBuilder$1;
-Landroid/icu/impl/coll/CollationBuilder$BundleImporter;
-Landroid/icu/impl/coll/CollationBuilder$CEFinalizer;
-Landroid/icu/impl/coll/CollationBuilder;
-Landroid/icu/impl/coll/CollationCompare;
-Landroid/icu/impl/coll/CollationData;
-Landroid/icu/impl/coll/CollationDataBuilder$CEModifier;
-Landroid/icu/impl/coll/CollationDataBuilder$ConditionalCE32;
-Landroid/icu/impl/coll/CollationDataBuilder$CopyHelper;
-Landroid/icu/impl/coll/CollationDataBuilder$DataBuilderCollationIterator;
-Landroid/icu/impl/coll/CollationDataBuilder;
-Landroid/icu/impl/coll/CollationDataReader$IsAcceptable;
-Landroid/icu/impl/coll/CollationDataReader;
-Landroid/icu/impl/coll/CollationFCD;
-Landroid/icu/impl/coll/CollationFastLatin;
-Landroid/icu/impl/coll/CollationFastLatinBuilder;
-Landroid/icu/impl/coll/CollationIterator$CEBuffer;
-Landroid/icu/impl/coll/CollationIterator$SkippedState;
-Landroid/icu/impl/coll/CollationIterator;
-Landroid/icu/impl/coll/CollationKeys$LevelCallback;
-Landroid/icu/impl/coll/CollationKeys$SortKeyByteSink;
-Landroid/icu/impl/coll/CollationKeys$SortKeyLevel;
-Landroid/icu/impl/coll/CollationKeys;
-Landroid/icu/impl/coll/CollationLoader$ASCII;
-Landroid/icu/impl/coll/CollationLoader;
-Landroid/icu/impl/coll/CollationRoot;
-Landroid/icu/impl/coll/CollationRootElements;
-Landroid/icu/impl/coll/CollationRuleParser$Importer;
-Landroid/icu/impl/coll/CollationRuleParser$Position;
-Landroid/icu/impl/coll/CollationRuleParser$Sink;
-Landroid/icu/impl/coll/CollationRuleParser;
-Landroid/icu/impl/coll/CollationSettings;
-Landroid/icu/impl/coll/CollationTailoring;
-Landroid/icu/impl/coll/CollationWeights$WeightRange;
-Landroid/icu/impl/coll/CollationWeights;
-Landroid/icu/impl/coll/ContractionsAndExpansions$CESink;
-Landroid/icu/impl/coll/ContractionsAndExpansions;
-Landroid/icu/impl/coll/FCDIterCollationIterator$State;
-Landroid/icu/impl/coll/FCDIterCollationIterator;
-Landroid/icu/impl/coll/FCDUTF16CollationIterator;
-Landroid/icu/impl/coll/IterCollationIterator;
-Landroid/icu/impl/coll/SharedObject$Reference;
-Landroid/icu/impl/coll/SharedObject;
-Landroid/icu/impl/coll/TailoredSet;
-Landroid/icu/impl/coll/UTF16CollationIterator;
-Landroid/icu/impl/coll/UVector32;
-Landroid/icu/impl/coll/UVector64;
-Landroid/icu/impl/data/HolidayBundle;
-Landroid/icu/impl/data/HolidayBundle_da;
-Landroid/icu/impl/data/HolidayBundle_da_DK;
-Landroid/icu/impl/data/HolidayBundle_de;
-Landroid/icu/impl/data/HolidayBundle_de_AT;
-Landroid/icu/impl/data/HolidayBundle_de_DE;
-Landroid/icu/impl/data/HolidayBundle_el;
-Landroid/icu/impl/data/HolidayBundle_el_GR;
-Landroid/icu/impl/data/HolidayBundle_en;
-Landroid/icu/impl/data/HolidayBundle_en_CA;
-Landroid/icu/impl/data/HolidayBundle_en_GB;
-Landroid/icu/impl/data/HolidayBundle_en_US;
-Landroid/icu/impl/data/HolidayBundle_es;
-Landroid/icu/impl/data/HolidayBundle_es_MX;
-Landroid/icu/impl/data/HolidayBundle_fr;
-Landroid/icu/impl/data/HolidayBundle_fr_CA;
-Landroid/icu/impl/data/HolidayBundle_fr_FR;
-Landroid/icu/impl/data/HolidayBundle_it;
-Landroid/icu/impl/data/HolidayBundle_it_IT;
-Landroid/icu/impl/data/HolidayBundle_iw;
-Landroid/icu/impl/data/HolidayBundle_iw_IL;
-Landroid/icu/impl/data/HolidayBundle_ja_JP;
-Landroid/icu/impl/data/ResourceReader;
-Landroid/icu/impl/data/TokenIterator;
-Landroid/icu/impl/duration/BasicDurationFormat;
-Landroid/icu/impl/duration/BasicDurationFormatter;
-Landroid/icu/impl/duration/BasicDurationFormatterFactory;
-Landroid/icu/impl/duration/BasicPeriodBuilderFactory$Settings;
-Landroid/icu/impl/duration/BasicPeriodBuilderFactory;
-Landroid/icu/impl/duration/BasicPeriodFormatter;
-Landroid/icu/impl/duration/BasicPeriodFormatterFactory$Customizations;
-Landroid/icu/impl/duration/BasicPeriodFormatterFactory;
-Landroid/icu/impl/duration/BasicPeriodFormatterService;
-Landroid/icu/impl/duration/DateFormatter;
-Landroid/icu/impl/duration/DurationFormatter;
-Landroid/icu/impl/duration/DurationFormatterFactory;
-Landroid/icu/impl/duration/FixedUnitBuilder;
-Landroid/icu/impl/duration/MultiUnitBuilder;
-Landroid/icu/impl/duration/OneOrTwoUnitBuilder;
-Landroid/icu/impl/duration/Period;
-Landroid/icu/impl/duration/PeriodBuilder;
-Landroid/icu/impl/duration/PeriodBuilderFactory;
-Landroid/icu/impl/duration/PeriodBuilderImpl;
-Landroid/icu/impl/duration/PeriodFormatter;
-Landroid/icu/impl/duration/PeriodFormatterFactory;
-Landroid/icu/impl/duration/PeriodFormatterService;
-Landroid/icu/impl/duration/SingleUnitBuilder;
-Landroid/icu/impl/duration/TimeUnit;
-Landroid/icu/impl/duration/TimeUnitConstants;
-Landroid/icu/impl/duration/impl/DataRecord$ECountVariant;
-Landroid/icu/impl/duration/impl/DataRecord$EDecimalHandling;
-Landroid/icu/impl/duration/impl/DataRecord$EFractionHandling;
-Landroid/icu/impl/duration/impl/DataRecord$EGender;
-Landroid/icu/impl/duration/impl/DataRecord$EHalfPlacement;
-Landroid/icu/impl/duration/impl/DataRecord$EHalfSupport;
-Landroid/icu/impl/duration/impl/DataRecord$EMilliSupport;
-Landroid/icu/impl/duration/impl/DataRecord$ENumberSystem;
-Landroid/icu/impl/duration/impl/DataRecord$EPluralization;
-Landroid/icu/impl/duration/impl/DataRecord$ESeparatorVariant;
-Landroid/icu/impl/duration/impl/DataRecord$ETimeDirection;
-Landroid/icu/impl/duration/impl/DataRecord$ETimeLimit;
-Landroid/icu/impl/duration/impl/DataRecord$EUnitVariant;
-Landroid/icu/impl/duration/impl/DataRecord$EZeroHandling;
-Landroid/icu/impl/duration/impl/DataRecord$ScopeData;
-Landroid/icu/impl/duration/impl/DataRecord;
-Landroid/icu/impl/duration/impl/PeriodFormatterData;
-Landroid/icu/impl/duration/impl/PeriodFormatterDataService;
-Landroid/icu/impl/duration/impl/RecordReader;
-Landroid/icu/impl/duration/impl/RecordWriter;
-Landroid/icu/impl/duration/impl/ResourceBasedPeriodFormatterDataService;
-Landroid/icu/impl/duration/impl/Utils$ChineseDigits;
-Landroid/icu/impl/duration/impl/Utils;
-Landroid/icu/impl/duration/impl/XMLRecordReader;
-Landroid/icu/impl/duration/impl/XMLRecordWriter;
-Landroid/icu/impl/locale/AsciiUtil$CaseInsensitiveKey;
-Landroid/icu/impl/locale/AsciiUtil;
-Landroid/icu/impl/locale/BaseLocale$Cache;
-Landroid/icu/impl/locale/BaseLocale$Key;
-Landroid/icu/impl/locale/BaseLocale-IA;
-Landroid/icu/impl/locale/BaseLocale;
-Landroid/icu/impl/locale/Extension;
-Landroid/icu/impl/locale/InternalLocaleBuilder$CaseInsensitiveChar;
-Landroid/icu/impl/locale/InternalLocaleBuilder$CaseInsensitiveString;
-Landroid/icu/impl/locale/InternalLocaleBuilder;
-Landroid/icu/impl/locale/KeyTypeData$CodepointsTypeHandler;
-Landroid/icu/impl/locale/KeyTypeData$KeyData;
-Landroid/icu/impl/locale/KeyTypeData$KeyInfoType;
-Landroid/icu/impl/locale/KeyTypeData$PrivateUseKeyValueTypeHandler;
-Landroid/icu/impl/locale/KeyTypeData$ReorderCodeTypeHandler;
-Landroid/icu/impl/locale/KeyTypeData$RgKeyValueTypeHandler;
-Landroid/icu/impl/locale/KeyTypeData$ScriptCodeTypeHandler;
-Landroid/icu/impl/locale/KeyTypeData$SpecialType;
-Landroid/icu/impl/locale/KeyTypeData$SpecialTypeHandler;
-Landroid/icu/impl/locale/KeyTypeData$SubdivisionKeyValueTypeHandler;
-Landroid/icu/impl/locale/KeyTypeData$Type;
-Landroid/icu/impl/locale/KeyTypeData$TypeInfoType;
-Landroid/icu/impl/locale/KeyTypeData$ValueType;
-Landroid/icu/impl/locale/KeyTypeData;
-Landroid/icu/impl/locale/LSR;
-Landroid/icu/impl/locale/LanguageTag;
-Landroid/icu/impl/locale/LocaleDistance$Data;
-Landroid/icu/impl/locale/LocaleDistance;
-Landroid/icu/impl/locale/LocaleExtensions;
-Landroid/icu/impl/locale/LocaleObjectCache$CacheEntry;
-Landroid/icu/impl/locale/LocaleObjectCache;
-Landroid/icu/impl/locale/LocaleSyntaxException;
-Landroid/icu/impl/locale/LocaleValidityChecker$1;
-Landroid/icu/impl/locale/LocaleValidityChecker$SpecialCase;
-Landroid/icu/impl/locale/LocaleValidityChecker$Where;
-Landroid/icu/impl/locale/LocaleValidityChecker;
-Landroid/icu/impl/locale/ParseStatus;
-Landroid/icu/impl/locale/StringTokenIterator;
-Landroid/icu/impl/locale/UnicodeLocaleExtension;
-Landroid/icu/impl/locale/XCldrStub$CollectionUtilities;
-Landroid/icu/impl/locale/XCldrStub$FileUtilities;
-Landroid/icu/impl/locale/XCldrStub$HashMultimap;
-Landroid/icu/impl/locale/XCldrStub$ImmutableMap;
-Landroid/icu/impl/locale/XCldrStub$ImmutableMultimap;
-Landroid/icu/impl/locale/XCldrStub$ImmutableSet;
-Landroid/icu/impl/locale/XCldrStub$Joiner;
-Landroid/icu/impl/locale/XCldrStub$LinkedHashMultimap;
-Landroid/icu/impl/locale/XCldrStub$Multimap;
-Landroid/icu/impl/locale/XCldrStub$MultimapIterator;
-Landroid/icu/impl/locale/XCldrStub$Multimaps;
-Landroid/icu/impl/locale/XCldrStub$Predicate;
-Landroid/icu/impl/locale/XCldrStub$RegexUtilities;
-Landroid/icu/impl/locale/XCldrStub$ReusableEntry;
-Landroid/icu/impl/locale/XCldrStub$Splitter;
-Landroid/icu/impl/locale/XCldrStub$TreeMultimap;
-Landroid/icu/impl/locale/XCldrStub;
-Landroid/icu/impl/locale/XLikelySubtags$1;
-Landroid/icu/impl/locale/XLikelySubtags$Data;
-Landroid/icu/impl/locale/XLikelySubtags;
-Landroid/icu/impl/number/AdoptingModifierStore$1;
-Landroid/icu/impl/number/AdoptingModifierStore;
-Landroid/icu/impl/number/AffixPatternProvider$Flags;
-Landroid/icu/impl/number/AffixPatternProvider;
-Landroid/icu/impl/number/AffixUtils$SymbolProvider;
-Landroid/icu/impl/number/AffixUtils$TokenConsumer;
-Landroid/icu/impl/number/AffixUtils;
-Landroid/icu/impl/number/CompactData$CompactDataSink;
-Landroid/icu/impl/number/CompactData$CompactType;
-Landroid/icu/impl/number/CompactData;
-Landroid/icu/impl/number/ConstantAffixModifier;
-Landroid/icu/impl/number/ConstantMultiFieldModifier;
-Landroid/icu/impl/number/CurrencyPluralInfoAffixProvider;
-Landroid/icu/impl/number/CurrencySpacingEnabledModifier;
-Landroid/icu/impl/number/CustomSymbolCurrency;
-Landroid/icu/impl/number/DecimalFormatProperties$ParseMode;
-Landroid/icu/impl/number/DecimalFormatProperties;
-Landroid/icu/impl/number/DecimalQuantity;
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD$1;
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;
-Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-Landroid/icu/impl/number/Grouper$1;
-Landroid/icu/impl/number/Grouper;
-Landroid/icu/impl/number/LocalizedNumberFormatterAsFormat$Proxy;
-Landroid/icu/impl/number/LocalizedNumberFormatterAsFormat;
-Landroid/icu/impl/number/LongNameHandler$AliasSink;
-Landroid/icu/impl/number/LongNameHandler$PluralTableSink;
-Landroid/icu/impl/number/LongNameHandler;
-Landroid/icu/impl/number/LongNameMultiplexer$ParentlessMicroPropsGenerator;
-Landroid/icu/impl/number/LongNameMultiplexer;
-Landroid/icu/impl/number/MacroProps;
-Landroid/icu/impl/number/MicroProps;
-Landroid/icu/impl/number/MicroPropsGenerator;
-Landroid/icu/impl/number/MicroPropsMutator;
-Landroid/icu/impl/number/MixedUnitLongNameHandler;
-Landroid/icu/impl/number/Modifier$Parameters;
-Landroid/icu/impl/number/Modifier$Signum;
-Landroid/icu/impl/number/Modifier;
-Landroid/icu/impl/number/ModifierStore;
-Landroid/icu/impl/number/MultiplierFormatHandler;
-Landroid/icu/impl/number/MultiplierProducer;
-Landroid/icu/impl/number/MutablePatternModifier$1;
-Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;
-Landroid/icu/impl/number/MutablePatternModifier;
-Landroid/icu/impl/number/Padder$PadPosition;
-Landroid/icu/impl/number/Padder;
-Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo-IA;
-Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;
-Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;
-Landroid/icu/impl/number/PatternStringParser$ParserState;
-Landroid/icu/impl/number/PatternStringParser;
-Landroid/icu/impl/number/PatternStringUtils$1;
-Landroid/icu/impl/number/PatternStringUtils$PatternSignType;
-Landroid/icu/impl/number/PatternStringUtils;
-Landroid/icu/impl/number/Properties;
-Landroid/icu/impl/number/PropertiesAffixPatternProvider;
-Landroid/icu/impl/number/RoundingUtils;
-Landroid/icu/impl/number/SimpleModifier;
-Landroid/icu/impl/number/UnitConversionHandler;
-Landroid/icu/impl/number/UsagePrefsHandler;
-Landroid/icu/impl/number/parse/AffixMatcher$1;
-Landroid/icu/impl/number/parse/AffixMatcher;
-Landroid/icu/impl/number/parse/AffixPatternMatcher;
-Landroid/icu/impl/number/parse/AffixTokenMatcherFactory;
-Landroid/icu/impl/number/parse/CodePointMatcher;
-Landroid/icu/impl/number/parse/CombinedCurrencyMatcher;
-Landroid/icu/impl/number/parse/DecimalMatcher;
-Landroid/icu/impl/number/parse/IgnorablesMatcher;
-Landroid/icu/impl/number/parse/InfinityMatcher;
-Landroid/icu/impl/number/parse/MinusSignMatcher;
-Landroid/icu/impl/number/parse/MultiplierParseHandler;
-Landroid/icu/impl/number/parse/NanMatcher;
-Landroid/icu/impl/number/parse/NumberParseMatcher$Flexible;
-Landroid/icu/impl/number/parse/NumberParseMatcher;
-Landroid/icu/impl/number/parse/NumberParserImpl;
-Landroid/icu/impl/number/parse/PaddingMatcher;
-Landroid/icu/impl/number/parse/ParsedNumber$1;
-Landroid/icu/impl/number/parse/ParsedNumber;
-Landroid/icu/impl/number/parse/ParsingUtils;
-Landroid/icu/impl/number/parse/PercentMatcher;
-Landroid/icu/impl/number/parse/PermilleMatcher;
-Landroid/icu/impl/number/parse/PlusSignMatcher;
-Landroid/icu/impl/number/parse/RequireAffixValidator;
-Landroid/icu/impl/number/parse/RequireCurrencyValidator;
-Landroid/icu/impl/number/parse/RequireDecimalSeparatorValidator;
-Landroid/icu/impl/number/parse/RequireNumberValidator;
-Landroid/icu/impl/number/parse/ScientificMatcher;
-Landroid/icu/impl/number/parse/SeriesMatcher;
-Landroid/icu/impl/number/parse/SymbolMatcher;
-Landroid/icu/impl/number/parse/ValidationMatcher;
-Landroid/icu/impl/number/range/PrefixInfixSuffixLengthHelper;
-Landroid/icu/impl/number/range/RangeMacroProps;
-Landroid/icu/impl/number/range/StandardPluralRanges$PluralRangeSetsDataSink;
-Landroid/icu/impl/number/range/StandardPluralRanges$PluralRangesDataSink;
-Landroid/icu/impl/number/range/StandardPluralRanges;
-Landroid/icu/impl/text/RbnfScannerProviderImpl$RbnfLenientScannerImpl;
-Landroid/icu/impl/text/RbnfScannerProviderImpl;
-Landroid/icu/impl/units/ComplexUnitsConverter;
-Landroid/icu/impl/units/ConversionRates$ConversionRateInfo;
-Landroid/icu/impl/units/ConversionRates$ConversionRatesSink;
-Landroid/icu/impl/units/ConversionRates;
-Landroid/icu/impl/units/MeasureUnitImpl$CompoundPart;
-Landroid/icu/impl/units/MeasureUnitImpl$InitialCompoundPart;
-Landroid/icu/impl/units/MeasureUnitImpl$MeasureUnitImplComparator;
-Landroid/icu/impl/units/MeasureUnitImpl$PowerPart;
-Landroid/icu/impl/units/MeasureUnitImpl$SingleUnitComparator;
-Landroid/icu/impl/units/MeasureUnitImpl$UnitsParser$Token$Type;
-Landroid/icu/impl/units/MeasureUnitImpl$UnitsParser$Token;
-Landroid/icu/impl/units/MeasureUnitImpl$UnitsParser;
-Landroid/icu/impl/units/MeasureUnitImpl;
-Landroid/icu/impl/units/SingleUnitImpl;
-Landroid/icu/impl/units/UnitPreferences$UnitPreference;
-Landroid/icu/impl/units/UnitPreferences$UnitPreferencesSink;
-Landroid/icu/impl/units/UnitPreferences;
-Landroid/icu/impl/units/UnitsData$Categories;
-Landroid/icu/impl/units/UnitsData$CategoriesSink;
-Landroid/icu/impl/units/UnitsData$Constants;
-Landroid/icu/impl/units/UnitsData$SimpleUnitIdentifiersSink;
-Landroid/icu/impl/units/UnitsData;
-Landroid/icu/impl/units/UnitsRouter$ConverterPreference;
-Landroid/icu/impl/units/UnitsRouter$RouteResult;
-Landroid/icu/impl/units/UnitsRouter;
-Landroid/icu/lang/CharSequences;
-Landroid/icu/lang/CharacterProperties;
-Landroid/icu/lang/UCharacter$BidiPairedBracketType;
-Landroid/icu/lang/UCharacter$DecompositionType;
-Landroid/icu/lang/UCharacter$DummyValueIterator;
-Landroid/icu/lang/UCharacter$EastAsianWidth;
-Landroid/icu/lang/UCharacter$GraphemeClusterBreak;
-Landroid/icu/lang/UCharacter$HangulSyllableType;
-Landroid/icu/lang/UCharacter$IndicPositionalCategory;
-Landroid/icu/lang/UCharacter$IndicSyllabicCategory;
-Landroid/icu/lang/UCharacter$JoiningGroup;
-Landroid/icu/lang/UCharacter$JoiningType;
-Landroid/icu/lang/UCharacter$LineBreak;
-Landroid/icu/lang/UCharacter$NumericType;
-Landroid/icu/lang/UCharacter$SentenceBreak;
-Landroid/icu/lang/UCharacter$UCharacterTypeIterator$MaskType;
-Landroid/icu/lang/UCharacter$UCharacterTypeIterator;
-Landroid/icu/lang/UCharacter$UnicodeBlock;
-Landroid/icu/lang/UCharacter$VerticalOrientation;
-Landroid/icu/lang/UCharacter$WordBreak;
-Landroid/icu/lang/UCharacter;
-Landroid/icu/lang/UCharacterCategory;
-Landroid/icu/lang/UCharacterDirection;
-Landroid/icu/lang/UCharacterEnums$ECharacterCategory;
-Landroid/icu/lang/UCharacterEnums$ECharacterDirection;
-Landroid/icu/lang/UCharacterEnums;
-Landroid/icu/lang/UCharacterNameIterator;
-Landroid/icu/lang/UProperty$NameChoice;
-Landroid/icu/lang/UProperty;
-Landroid/icu/lang/UScript$ScriptMetadata;
-Landroid/icu/lang/UScript$ScriptUsage;
-Landroid/icu/lang/UScript;
-Landroid/icu/lang/UScriptRun$ParenStackEntry;
-Landroid/icu/lang/UScriptRun;
-Landroid/icu/math/BigDecimal;
-Landroid/icu/math/MathContext;
-Landroid/icu/number/CompactNotation$CompactHandler;
-Landroid/icu/number/CompactNotation;
-Landroid/icu/number/CurrencyPrecision;
-Landroid/icu/number/FormattedNumber;
-Landroid/icu/number/FormattedNumberRange;
-Landroid/icu/number/FractionPrecision;
-Landroid/icu/number/IntegerWidth;
-Landroid/icu/number/LocalizedNumberFormatter;
-Landroid/icu/number/LocalizedNumberRangeFormatter;
-Landroid/icu/number/Notation;
-Landroid/icu/number/NumberFormatter$DecimalSeparatorDisplay;
-Landroid/icu/number/NumberFormatter$GroupingStrategy;
-Landroid/icu/number/NumberFormatter$RoundingPriority;
-Landroid/icu/number/NumberFormatter$SignDisplay;
-Landroid/icu/number/NumberFormatter$TrailingZeroDisplay;
-Landroid/icu/number/NumberFormatter$UnitWidth;
-Landroid/icu/number/NumberFormatter;
-Landroid/icu/number/NumberFormatterImpl;
-Landroid/icu/number/NumberFormatterSettings;
-Landroid/icu/number/NumberPropertyMapper;
-Landroid/icu/number/NumberRangeFormatter$RangeCollapse;
-Landroid/icu/number/NumberRangeFormatter$RangeIdentityFallback;
-Landroid/icu/number/NumberRangeFormatter$RangeIdentityResult;
-Landroid/icu/number/NumberRangeFormatter;
-Landroid/icu/number/NumberRangeFormatterImpl$1;
-Landroid/icu/number/NumberRangeFormatterImpl$NumberRangeDataSink;
-Landroid/icu/number/NumberRangeFormatterImpl;
-Landroid/icu/number/NumberRangeFormatterSettings;
-Landroid/icu/number/NumberSkeletonImpl$1;
-Landroid/icu/number/NumberSkeletonImpl$2;
-Landroid/icu/number/NumberSkeletonImpl$BlueprintHelpers;
-Landroid/icu/number/NumberSkeletonImpl$EnumToStemString;
-Landroid/icu/number/NumberSkeletonImpl$GeneratorHelpers;
-Landroid/icu/number/NumberSkeletonImpl$ParseState;
-Landroid/icu/number/NumberSkeletonImpl$StemEnum;
-Landroid/icu/number/NumberSkeletonImpl$StemToObject;
-Landroid/icu/number/NumberSkeletonImpl;
-Landroid/icu/number/Precision$BogusRounder;
-Landroid/icu/number/Precision$CurrencyRounderImpl;
-Landroid/icu/number/Precision$FracSigRounderImpl;
-Landroid/icu/number/Precision$FractionRounderImpl;
-Landroid/icu/number/Precision$IncrementFiveRounderImpl;
-Landroid/icu/number/Precision$IncrementOneRounderImpl;
-Landroid/icu/number/Precision$IncrementRounderImpl;
-Landroid/icu/number/Precision$InfiniteRounderImpl;
-Landroid/icu/number/Precision$SignificantRounderImpl;
-Landroid/icu/number/Precision;
-Landroid/icu/number/Scale;
-Landroid/icu/number/ScientificNotation$ScientificHandler;
-Landroid/icu/number/ScientificNotation$ScientificModifier;
-Landroid/icu/number/ScientificNotation;
-Landroid/icu/number/SimpleNotation;
-Landroid/icu/number/SkeletonSyntaxException;
-Landroid/icu/number/UnlocalizedNumberFormatter;
-Landroid/icu/number/UnlocalizedNumberRangeFormatter;
-Landroid/icu/platform/AndroidDataFiles;
-Landroid/icu/text/AbsoluteValueSubstitution;
-Landroid/icu/text/AlphabeticIndex$1;
-Landroid/icu/text/AlphabeticIndex$Bucket$LabelType;
-Landroid/icu/text/AlphabeticIndex$Bucket;
-Landroid/icu/text/AlphabeticIndex$BucketList;
-Landroid/icu/text/AlphabeticIndex$ImmutableIndex;
-Landroid/icu/text/AlphabeticIndex$Record;
-Landroid/icu/text/AlphabeticIndex;
-Landroid/icu/text/AnyTransliterator$ScriptRunIterator;
-Landroid/icu/text/AnyTransliterator;
-Landroid/icu/text/ArabicShaping;
-Landroid/icu/text/ArabicShapingException;
-Landroid/icu/text/Bidi$BracketData;
-Landroid/icu/text/Bidi$ImpTabPair;
-Landroid/icu/text/Bidi$InsertPoints;
-Landroid/icu/text/Bidi$IsoRun;
-Landroid/icu/text/Bidi$Isolate;
-Landroid/icu/text/Bidi$LevState;
-Landroid/icu/text/Bidi$Opening;
-Landroid/icu/text/Bidi$Point;
-Landroid/icu/text/Bidi;
-Landroid/icu/text/BidiClassifier;
-Landroid/icu/text/BidiLine;
-Landroid/icu/text/BidiRun;
-Landroid/icu/text/BidiTransform$Mirroring;
-Landroid/icu/text/BidiTransform$Order;
-Landroid/icu/text/BidiTransform$ReorderingScheme$10;
-Landroid/icu/text/BidiTransform$ReorderingScheme$11;
-Landroid/icu/text/BidiTransform$ReorderingScheme$12;
-Landroid/icu/text/BidiTransform$ReorderingScheme$13;
-Landroid/icu/text/BidiTransform$ReorderingScheme$14;
-Landroid/icu/text/BidiTransform$ReorderingScheme$15;
-Landroid/icu/text/BidiTransform$ReorderingScheme$16;
-Landroid/icu/text/BidiTransform$ReorderingScheme$1;
-Landroid/icu/text/BidiTransform$ReorderingScheme$2;
-Landroid/icu/text/BidiTransform$ReorderingScheme$3;
-Landroid/icu/text/BidiTransform$ReorderingScheme$4;
-Landroid/icu/text/BidiTransform$ReorderingScheme$5;
-Landroid/icu/text/BidiTransform$ReorderingScheme$6;
-Landroid/icu/text/BidiTransform$ReorderingScheme$7;
-Landroid/icu/text/BidiTransform$ReorderingScheme$8;
-Landroid/icu/text/BidiTransform$ReorderingScheme$9;
-Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform;
-Landroid/icu/text/BidiWriter;
-Landroid/icu/text/BreakIterator$BreakIteratorCache;
-Landroid/icu/text/BreakIterator$BreakIteratorServiceShim;
-Landroid/icu/text/BreakIterator;
-Landroid/icu/text/BreakIteratorFactory$BFService$1RBBreakIteratorFactory;
-Landroid/icu/text/BreakIteratorFactory$BFService;
-Landroid/icu/text/BreakIteratorFactory;
-Landroid/icu/text/BreakTransliterator$ReplaceableCharacterIterator;
-Landroid/icu/text/BreakTransliterator;
-Landroid/icu/text/CanonicalIterator;
-Landroid/icu/text/CaseFoldTransliterator$1;
-Landroid/icu/text/CaseFoldTransliterator$2;
-Landroid/icu/text/CaseFoldTransliterator;
-Landroid/icu/text/CaseMap$Fold;
-Landroid/icu/text/CaseMap$Lower;
-Landroid/icu/text/CaseMap$Title;
-Landroid/icu/text/CaseMap$Upper;
-Landroid/icu/text/CaseMap;
-Landroid/icu/text/CharsetDetector$CSRecognizerInfo;
-Landroid/icu/text/CharsetDetector;
-Landroid/icu/text/CharsetMatch;
-Landroid/icu/text/CharsetRecog_2022$CharsetRecog_2022CN;
-Landroid/icu/text/CharsetRecog_2022$CharsetRecog_2022JP;
-Landroid/icu/text/CharsetRecog_2022$CharsetRecog_2022KR;
-Landroid/icu/text/CharsetRecog_2022;
-Landroid/icu/text/CharsetRecog_UTF8;
-Landroid/icu/text/CharsetRecog_Unicode$CharsetRecog_UTF_16_BE;
-Landroid/icu/text/CharsetRecog_Unicode$CharsetRecog_UTF_16_LE;
-Landroid/icu/text/CharsetRecog_Unicode$CharsetRecog_UTF_32;
-Landroid/icu/text/CharsetRecog_Unicode$CharsetRecog_UTF_32_BE;
-Landroid/icu/text/CharsetRecog_Unicode$CharsetRecog_UTF_32_LE;
-Landroid/icu/text/CharsetRecog_Unicode;
-Landroid/icu/text/CharsetRecog_mbcs$CharsetRecog_big5;
-Landroid/icu/text/CharsetRecog_mbcs$CharsetRecog_euc$CharsetRecog_euc_jp;
-Landroid/icu/text/CharsetRecog_mbcs$CharsetRecog_euc$CharsetRecog_euc_kr;
-Landroid/icu/text/CharsetRecog_mbcs$CharsetRecog_euc;
-Landroid/icu/text/CharsetRecog_mbcs$CharsetRecog_gb_18030;
-Landroid/icu/text/CharsetRecog_mbcs$CharsetRecog_sjis;
-Landroid/icu/text/CharsetRecog_mbcs$iteratedChar;
-Landroid/icu/text/CharsetRecog_mbcs;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_8859_1;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_8859_2;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_8859_5;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_8859_5_ru;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_8859_6;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_8859_6_ar;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_8859_7;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_8859_7_el;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_8859_8;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_8859_8_I_he;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_8859_8_he;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_8859_9;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_8859_9_tr;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_IBM420_ar;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_IBM420_ar_ltr;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_IBM420_ar_rtl;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_IBM424_he;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_IBM424_he_ltr;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_IBM424_he_rtl;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_KOI8_R;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_windows_1251;
-Landroid/icu/text/CharsetRecog_sbcs$CharsetRecog_windows_1256;
-Landroid/icu/text/CharsetRecog_sbcs$NGramParser;
-Landroid/icu/text/CharsetRecog_sbcs$NGramParser_IBM420;
-Landroid/icu/text/CharsetRecog_sbcs$NGramsPlusLang;
-Landroid/icu/text/CharsetRecog_sbcs;
-Landroid/icu/text/CharsetRecognizer;
-Landroid/icu/text/ChineseDateFormat$Field;
-Landroid/icu/text/ChineseDateFormat;
-Landroid/icu/text/ChineseDateFormatSymbols;
-Landroid/icu/text/CollationElementIterator$MaxExpSink;
-Landroid/icu/text/CollationElementIterator;
-Landroid/icu/text/CollationKey$BoundMode;
-Landroid/icu/text/CollationKey;
-Landroid/icu/text/Collator$ASCII;
-Landroid/icu/text/Collator$CollatorFactory;
-Landroid/icu/text/Collator$KeywordsSink;
-Landroid/icu/text/Collator$ReorderCodes;
-Landroid/icu/text/Collator$ServiceShim;
-Landroid/icu/text/Collator;
-Landroid/icu/text/CollatorServiceShim$1CFactory;
-Landroid/icu/text/CollatorServiceShim$CService$1CollatorFactory;
-Landroid/icu/text/CollatorServiceShim$CService;
-Landroid/icu/text/CollatorServiceShim;
-Landroid/icu/text/CompactDecimalFormat$CompactStyle;
-Landroid/icu/text/CompactDecimalFormat;
-Landroid/icu/text/ComposedCharIter;
-Landroid/icu/text/CompoundTransliterator;
-Landroid/icu/text/ConstrainedFieldPosition$ConstraintType;
-Landroid/icu/text/ConstrainedFieldPosition;
-Landroid/icu/text/CurrencyDisplayNames;
-Landroid/icu/text/CurrencyFormat;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyDigits;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyInfo;
-Landroid/icu/text/CurrencyMetaInfo;
-Landroid/icu/text/CurrencyPluralInfo;
-Landroid/icu/text/DateFormat$BooleanAttribute;
-Landroid/icu/text/DateFormat$Field;
-Landroid/icu/text/DateFormat$HourCycle;
-Landroid/icu/text/DateFormat;
-Landroid/icu/text/DateFormatSymbols$1;
-Landroid/icu/text/DateFormatSymbols$AospExtendedDateFormatSymbols-IA;
-Landroid/icu/text/DateFormatSymbols$AospExtendedDateFormatSymbols;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols-IA;
-Landroid/icu/text/DateFormatSymbols;
-Landroid/icu/text/DateIntervalFormat$BestMatchInfo;
-Landroid/icu/text/DateIntervalFormat$FormatOutput;
-Landroid/icu/text/DateIntervalFormat$FormattedDateInterval;
-Landroid/icu/text/DateIntervalFormat$SkeletonAndItsBestMatch;
-Landroid/icu/text/DateIntervalFormat$SpanField;
-Landroid/icu/text/DateIntervalFormat;
-Landroid/icu/text/DateIntervalInfo$DateIntervalSink;
-Landroid/icu/text/DateIntervalInfo$PatternInfo;
-Landroid/icu/text/DateIntervalInfo;
-Landroid/icu/text/DateTimePatternGenerator$AppendItemFormatsSink-IA;
-Landroid/icu/text/DateTimePatternGenerator$AppendItemFormatsSink;
-Landroid/icu/text/DateTimePatternGenerator$AppendItemNamesSink-IA;
-Landroid/icu/text/DateTimePatternGenerator$AppendItemNamesSink;
-Landroid/icu/text/DateTimePatternGenerator$AvailableFormatsSink;
-Landroid/icu/text/DateTimePatternGenerator$DTPGflags;
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher-IA;
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;
-Landroid/icu/text/DateTimePatternGenerator$DayPeriodAllowedHoursSink;
-Landroid/icu/text/DateTimePatternGenerator$DisplayWidth;
-Landroid/icu/text/DateTimePatternGenerator$DistanceInfo-IA;
-Landroid/icu/text/DateTimePatternGenerator$DistanceInfo;
-Landroid/icu/text/DateTimePatternGenerator$FormatParser;
-Landroid/icu/text/DateTimePatternGenerator$PatternInfo;
-Landroid/icu/text/DateTimePatternGenerator$PatternWithMatcher;
-Landroid/icu/text/DateTimePatternGenerator$PatternWithSkeletonFlag;
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields-IA;
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;
-Landroid/icu/text/DateTimePatternGenerator$VariableField;
-Landroid/icu/text/DateTimePatternGenerator;
-Landroid/icu/text/DecimalFormat$PropertySetter;
-Landroid/icu/text/DecimalFormat;
-Landroid/icu/text/DecimalFormatSymbols$1;
-Landroid/icu/text/DecimalFormatSymbols$CacheData;
-Landroid/icu/text/DecimalFormatSymbols$DecFmtDataSink;
-Landroid/icu/text/DecimalFormatSymbols;
-Landroid/icu/text/DisplayContext$Type;
-Landroid/icu/text/DisplayContext;
-Landroid/icu/text/DurationFormat;
-Landroid/icu/text/Edits$Iterator-IA;
-Landroid/icu/text/Edits$Iterator;
-Landroid/icu/text/Edits;
-Landroid/icu/text/EscapeTransliterator$1;
-Landroid/icu/text/EscapeTransliterator$2;
-Landroid/icu/text/EscapeTransliterator$3;
-Landroid/icu/text/EscapeTransliterator$4;
-Landroid/icu/text/EscapeTransliterator$5;
-Landroid/icu/text/EscapeTransliterator$6;
-Landroid/icu/text/EscapeTransliterator$7;
-Landroid/icu/text/EscapeTransliterator$8;
-Landroid/icu/text/EscapeTransliterator;
-Landroid/icu/text/FilteredBreakIteratorBuilder;
-Landroid/icu/text/FilteredNormalizer2;
-Landroid/icu/text/FormattedValue;
-Landroid/icu/text/FractionalPartSubstitution;
-Landroid/icu/text/FunctionReplacer;
-Landroid/icu/text/IDNA$Error;
-Landroid/icu/text/IDNA$Info;
-Landroid/icu/text/IDNA;
-Landroid/icu/text/IntegralPartSubstitution;
-Landroid/icu/text/ListFormatter$Cache;
-Landroid/icu/text/ListFormatter$ContextualHandler;
-Landroid/icu/text/ListFormatter$Field;
-Landroid/icu/text/ListFormatter$FormattedList;
-Landroid/icu/text/ListFormatter$FormattedListBuilder;
-Landroid/icu/text/ListFormatter$PatternHandler;
-Landroid/icu/text/ListFormatter$SpanField;
-Landroid/icu/text/ListFormatter$StaticHandler;
-Landroid/icu/text/ListFormatter$Type;
-Landroid/icu/text/ListFormatter$Width;
-Landroid/icu/text/ListFormatter;
-Landroid/icu/text/LocaleDisplayNames$DialectHandling;
-Landroid/icu/text/LocaleDisplayNames$LastResortLocaleDisplayNames;
-Landroid/icu/text/LocaleDisplayNames$UiListItem$UiListItemComparator;
-Landroid/icu/text/LocaleDisplayNames$UiListItem;
-Landroid/icu/text/LocaleDisplayNames;
-Landroid/icu/text/LowercaseTransliterator$1;
-Landroid/icu/text/LowercaseTransliterator$2;
-Landroid/icu/text/LowercaseTransliterator;
-Landroid/icu/text/MeasureFormat$FormatWidth;
-Landroid/icu/text/MeasureFormat$MeasureProxy;
-Landroid/icu/text/MeasureFormat$NumberFormatterCacheEntry;
-Landroid/icu/text/MeasureFormat$NumericFormatters;
-Landroid/icu/text/MeasureFormat;
-Landroid/icu/text/MessageFormat$AppendableWrapper;
-Landroid/icu/text/MessageFormat$AttributeAndPosition;
-Landroid/icu/text/MessageFormat$Field;
-Landroid/icu/text/MessageFormat$PluralSelectorContext;
-Landroid/icu/text/MessageFormat$PluralSelectorProvider;
-Landroid/icu/text/MessageFormat;
-Landroid/icu/text/MessagePattern$ApostropheMode;
-Landroid/icu/text/MessagePattern$ArgType;
-Landroid/icu/text/MessagePattern$Part$Type;
-Landroid/icu/text/MessagePattern$Part;
-Landroid/icu/text/MessagePattern;
-Landroid/icu/text/MessagePatternUtil$1;
-Landroid/icu/text/MessagePatternUtil$ArgNode;
-Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;
-Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;
-Landroid/icu/text/MessagePatternUtil$MessageContentsNode;
-Landroid/icu/text/MessagePatternUtil$MessageNode;
-Landroid/icu/text/MessagePatternUtil$Node;
-Landroid/icu/text/MessagePatternUtil$TextNode;
-Landroid/icu/text/MessagePatternUtil$VariantNode;
-Landroid/icu/text/MessagePatternUtil;
-Landroid/icu/text/ModulusSubstitution;
-Landroid/icu/text/MultiplierSubstitution;
-Landroid/icu/text/NFRule;
-Landroid/icu/text/NFRuleSet;
-Landroid/icu/text/NFSubstitution;
-Landroid/icu/text/NameUnicodeTransliterator$1;
-Landroid/icu/text/NameUnicodeTransliterator;
-Landroid/icu/text/NormalizationTransliterator$1;
-Landroid/icu/text/NormalizationTransliterator$2;
-Landroid/icu/text/NormalizationTransliterator$3;
-Landroid/icu/text/NormalizationTransliterator$4;
-Landroid/icu/text/NormalizationTransliterator$5;
-Landroid/icu/text/NormalizationTransliterator$6;
-Landroid/icu/text/NormalizationTransliterator$NormalizingTransform;
-Landroid/icu/text/NormalizationTransliterator;
-Landroid/icu/text/Normalizer$CharsAppendable;
-Landroid/icu/text/Normalizer$CmpEquivLevel;
-Landroid/icu/text/Normalizer$FCD32ModeImpl;
-Landroid/icu/text/Normalizer$FCDMode;
-Landroid/icu/text/Normalizer$FCDModeImpl;
-Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer$ModeImpl;
-Landroid/icu/text/Normalizer$NFC32ModeImpl;
-Landroid/icu/text/Normalizer$NFCMode;
-Landroid/icu/text/Normalizer$NFCModeImpl;
-Landroid/icu/text/Normalizer$NFD32ModeImpl;
-Landroid/icu/text/Normalizer$NFDMode;
-Landroid/icu/text/Normalizer$NFDModeImpl;
-Landroid/icu/text/Normalizer$NFKC32ModeImpl;
-Landroid/icu/text/Normalizer$NFKCMode;
-Landroid/icu/text/Normalizer$NFKCModeImpl;
-Landroid/icu/text/Normalizer$NFKD32ModeImpl;
-Landroid/icu/text/Normalizer$NFKDMode;
-Landroid/icu/text/Normalizer$NFKDModeImpl;
-Landroid/icu/text/Normalizer$NONEMode;
-Landroid/icu/text/Normalizer$QuickCheckResult;
-Landroid/icu/text/Normalizer$Unicode32;
-Landroid/icu/text/Normalizer2$Mode;
-Landroid/icu/text/Normalizer2;
-Landroid/icu/text/Normalizer;
-Landroid/icu/text/NullTransliterator;
-Landroid/icu/text/NumberFormat$Field;
-Landroid/icu/text/NumberFormat$NumberFormatFactory;
-Landroid/icu/text/NumberFormat$NumberFormatShim;
-Landroid/icu/text/NumberFormat$SimpleNumberFormatFactory;
-Landroid/icu/text/NumberFormat;
-Landroid/icu/text/NumberFormatServiceShim$NFFactory;
-Landroid/icu/text/NumberFormatServiceShim$NFService$1RBNumberFormatFactory;
-Landroid/icu/text/NumberFormatServiceShim$NFService;
-Landroid/icu/text/NumberFormatServiceShim;
-Landroid/icu/text/NumberingSystem$1;
-Landroid/icu/text/NumberingSystem$2;
-Landroid/icu/text/NumberingSystem$LocaleLookupData;
-Landroid/icu/text/NumberingSystem;
-Landroid/icu/text/NumeratorSubstitution;
-Landroid/icu/text/PluralFormat$PluralSelector;
-Landroid/icu/text/PluralFormat$PluralSelectorAdapter;
-Landroid/icu/text/PluralFormat;
-Landroid/icu/text/PluralRules$1;
-Landroid/icu/text/PluralRules$AndConstraint;
-Landroid/icu/text/PluralRules$BinaryConstraint;
-Landroid/icu/text/PluralRules$Constraint;
-Landroid/icu/text/PluralRules$DecimalQuantitySamples;
-Landroid/icu/text/PluralRules$DecimalQuantitySamplesRange;
-Landroid/icu/text/PluralRules$Factory;
-Landroid/icu/text/PluralRules$FixedDecimal;
-Landroid/icu/text/PluralRules$IFixedDecimal;
-Landroid/icu/text/PluralRules$KeywordStatus;
-Landroid/icu/text/PluralRules$Operand;
-Landroid/icu/text/PluralRules$OrConstraint;
-Landroid/icu/text/PluralRules$PluralType;
-Landroid/icu/text/PluralRules$RangeConstraint;
-Landroid/icu/text/PluralRules$Rule;
-Landroid/icu/text/PluralRules$RuleList-IA;
-Landroid/icu/text/PluralRules$RuleList;
-Landroid/icu/text/PluralRules$SampleType;
-Landroid/icu/text/PluralRules$SimpleTokenizer;
-Landroid/icu/text/PluralRules;
-Landroid/icu/text/PluralRulesSerialProxy;
-Landroid/icu/text/Quantifier;
-Landroid/icu/text/QuantityFormatter;
-Landroid/icu/text/RBBINode;
-Landroid/icu/text/RBBIRuleBuilder$IntPair;
-Landroid/icu/text/RBBIRuleBuilder;
-Landroid/icu/text/RBBIRuleParseTable$RBBIRuleTableElement;
-Landroid/icu/text/RBBIRuleParseTable;
-Landroid/icu/text/RBBIRuleScanner$RBBIRuleChar;
-Landroid/icu/text/RBBIRuleScanner$RBBISetTableEl;
-Landroid/icu/text/RBBIRuleScanner;
-Landroid/icu/text/RBBISetBuilder$RangeDescriptor;
-Landroid/icu/text/RBBISetBuilder;
-Landroid/icu/text/RBBISymbolTable$RBBISymbolTableEntry;
-Landroid/icu/text/RBBISymbolTable;
-Landroid/icu/text/RBBITableBuilder$RBBIStateDescriptor;
-Landroid/icu/text/RBBITableBuilder;
-Landroid/icu/text/RBNFChinesePostProcessor;
-Landroid/icu/text/RBNFPostProcessor;
-Landroid/icu/text/RawCollationKey;
-Landroid/icu/text/RbnfLenientScanner;
-Landroid/icu/text/RbnfLenientScannerProvider;
-Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$Cache$1;
-Landroid/icu/text/RelativeDateTimeFormatter$Cache;
-Landroid/icu/text/RelativeDateTimeFormatter$Direction;
-Landroid/icu/text/RelativeDateTimeFormatter$Field;
-Landroid/icu/text/RelativeDateTimeFormatter$FormattedRelativeDateTime;
-Landroid/icu/text/RelativeDateTimeFormatter$Loader;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;
-Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeFormatterData;
-Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$Style;
-Landroid/icu/text/RelativeDateTimeFormatter;
-Landroid/icu/text/RemoveTransliterator$1;
-Landroid/icu/text/RemoveTransliterator;
-Landroid/icu/text/Replaceable;
-Landroid/icu/text/ReplaceableContextIterator;
-Landroid/icu/text/ReplaceableString;
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;
-Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;
-Landroid/icu/text/RuleBasedBreakIterator;
-Landroid/icu/text/RuleBasedCollator$CollationBuffer-IA;
-Landroid/icu/text/RuleBasedCollator$CollationBuffer;
-Landroid/icu/text/RuleBasedCollator$CollationKeyByteSink;
-Landroid/icu/text/RuleBasedCollator$FCDUTF16NFDIterator;
-Landroid/icu/text/RuleBasedCollator$NFDIterator;
-Landroid/icu/text/RuleBasedCollator$UTF16NFDIterator;
-Landroid/icu/text/RuleBasedCollator;
-Landroid/icu/text/RuleBasedNumberFormat;
-Landroid/icu/text/RuleBasedTransliterator$Data;
-Landroid/icu/text/RuleBasedTransliterator;
-Landroid/icu/text/SCSU;
-Landroid/icu/text/SameValueSubstitution;
-Landroid/icu/text/ScientificNumberFormatter$MarkupStyle;
-Landroid/icu/text/ScientificNumberFormatter$Style;
-Landroid/icu/text/ScientificNumberFormatter$SuperscriptStyle;
-Landroid/icu/text/ScientificNumberFormatter;
-Landroid/icu/text/SearchIterator$ElementComparisonType;
-Landroid/icu/text/SearchIterator$Search;
-Landroid/icu/text/SearchIterator;
-Landroid/icu/text/SelectFormat;
-Landroid/icu/text/SimpleDateFormat$1;
-Landroid/icu/text/SimpleDateFormat$ContextValue;
-Landroid/icu/text/SimpleDateFormat$PatternItem;
-Landroid/icu/text/SimpleDateFormat;
-Landroid/icu/text/SimpleFormatter;
-Landroid/icu/text/SourceTargetUtility;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUString;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringComparator;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringPool;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder;
-Landroid/icu/text/SpoofChecker$Builder;
-Landroid/icu/text/SpoofChecker$CheckResult;
-Landroid/icu/text/SpoofChecker$ConfusableDataUtils;
-Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker$ScriptSet;
-Landroid/icu/text/SpoofChecker$SpoofData$DefaultData;
-Landroid/icu/text/SpoofChecker$SpoofData$IsAcceptable;
-Landroid/icu/text/SpoofChecker$SpoofData;
-Landroid/icu/text/SpoofChecker;
-Landroid/icu/text/StringCharacterIterator;
-Landroid/icu/text/StringMatcher;
-Landroid/icu/text/StringPrep$Values;
-Landroid/icu/text/StringPrep;
-Landroid/icu/text/StringPrepParseException;
-Landroid/icu/text/StringReplacer;
-Landroid/icu/text/StringSearch$CEBuffer;
-Landroid/icu/text/StringSearch$CEI;
-Landroid/icu/text/StringSearch$CollationPCE$PCEBuffer;
-Landroid/icu/text/StringSearch$CollationPCE$PCEI;
-Landroid/icu/text/StringSearch$CollationPCE$RCEBuffer;
-Landroid/icu/text/StringSearch$CollationPCE$RCEI;
-Landroid/icu/text/StringSearch$CollationPCE$Range;
-Landroid/icu/text/StringSearch$CollationPCE;
-Landroid/icu/text/StringSearch$Match;
-Landroid/icu/text/StringSearch$Pattern;
-Landroid/icu/text/StringSearch;
-Landroid/icu/text/StringTransform;
-Landroid/icu/text/SymbolTable;
-Landroid/icu/text/TimeUnitFormat$TimeUnitFormatSetupSink;
-Landroid/icu/text/TimeUnitFormat;
-Landroid/icu/text/TimeZoneFormat$1;
-Landroid/icu/text/TimeZoneFormat$GMTOffsetField;
-Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;
-Landroid/icu/text/TimeZoneFormat$OffsetFields;
-Landroid/icu/text/TimeZoneFormat$ParseOption;
-Landroid/icu/text/TimeZoneFormat$Style;
-Landroid/icu/text/TimeZoneFormat$TimeType;
-Landroid/icu/text/TimeZoneFormat$TimeZoneFormatCache;
-Landroid/icu/text/TimeZoneFormat;
-Landroid/icu/text/TimeZoneNames$Cache;
-Landroid/icu/text/TimeZoneNames$DefaultTimeZoneNames$FactoryImpl;
-Landroid/icu/text/TimeZoneNames$DefaultTimeZoneNames;
-Landroid/icu/text/TimeZoneNames$Factory;
-Landroid/icu/text/TimeZoneNames$MatchInfo;
-Landroid/icu/text/TimeZoneNames$NameType;
-Landroid/icu/text/TimeZoneNames;
-Landroid/icu/text/TitlecaseTransliterator$1;
-Landroid/icu/text/TitlecaseTransliterator$2;
-Landroid/icu/text/TitlecaseTransliterator;
-Landroid/icu/text/Transform;
-Landroid/icu/text/TransliterationRule;
-Landroid/icu/text/TransliterationRuleSet;
-Landroid/icu/text/Transliterator$Factory;
-Landroid/icu/text/Transliterator$Position;
-Landroid/icu/text/Transliterator;
-Landroid/icu/text/TransliteratorIDParser$SingleID;
-Landroid/icu/text/TransliteratorIDParser$Specs;
-Landroid/icu/text/TransliteratorIDParser;
-Landroid/icu/text/TransliteratorParser$ParseData;
-Landroid/icu/text/TransliteratorParser$RuleArray;
-Landroid/icu/text/TransliteratorParser$RuleBody;
-Landroid/icu/text/TransliteratorParser$RuleHalf;
-Landroid/icu/text/TransliteratorParser;
-Landroid/icu/text/TransliteratorRegistry$AliasEntry;
-Landroid/icu/text/TransliteratorRegistry$CompoundRBTEntry;
-Landroid/icu/text/TransliteratorRegistry$IDEnumeration;
-Landroid/icu/text/TransliteratorRegistry$LocaleEntry;
-Landroid/icu/text/TransliteratorRegistry$ResourceEntry;
-Landroid/icu/text/TransliteratorRegistry$Spec;
-Landroid/icu/text/TransliteratorRegistry;
-Landroid/icu/text/UCharacterIterator;
-Landroid/icu/text/UFieldPosition;
-Landroid/icu/text/UFormat$SpanField;
-Landroid/icu/text/UFormat;
-Landroid/icu/text/UForwardCharacterIterator;
-Landroid/icu/text/UTF16$StringComparator;
-Landroid/icu/text/UTF16;
-Landroid/icu/text/UnescapeTransliterator$1;
-Landroid/icu/text/UnescapeTransliterator$2;
-Landroid/icu/text/UnescapeTransliterator$3;
-Landroid/icu/text/UnescapeTransliterator$4;
-Landroid/icu/text/UnescapeTransliterator$5;
-Landroid/icu/text/UnescapeTransliterator$6;
-Landroid/icu/text/UnescapeTransliterator$7;
-Landroid/icu/text/UnescapeTransliterator;
-Landroid/icu/text/UnicodeCompressor;
-Landroid/icu/text/UnicodeDecompressor;
-Landroid/icu/text/UnicodeFilter;
-Landroid/icu/text/UnicodeMatcher;
-Landroid/icu/text/UnicodeNameTransliterator$1;
-Landroid/icu/text/UnicodeNameTransliterator;
-Landroid/icu/text/UnicodeReplacer;
-Landroid/icu/text/UnicodeSet$ComparisonStyle;
-Landroid/icu/text/UnicodeSet$EntryRange;
-Landroid/icu/text/UnicodeSet$EntryRangeIterable;
-Landroid/icu/text/UnicodeSet$EntryRangeIterator;
-Landroid/icu/text/UnicodeSet$Filter;
-Landroid/icu/text/UnicodeSet$GeneralCategoryMaskFilter;
-Landroid/icu/text/UnicodeSet$IntPropertyFilter;
-Landroid/icu/text/UnicodeSet$NumericValueFilter;
-Landroid/icu/text/UnicodeSet$ScriptExtensionsFilter;
-Landroid/icu/text/UnicodeSet$SpanCondition;
-Landroid/icu/text/UnicodeSet$UnicodeSetIterator2;
-Landroid/icu/text/UnicodeSet$VersionFilter;
-Landroid/icu/text/UnicodeSet$XSymbolTable;
-Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSetIterator;
-Landroid/icu/text/UnicodeSetSpanner$CountMethod;
-Landroid/icu/text/UnicodeSetSpanner$TrimOption;
-Landroid/icu/text/UnicodeSetSpanner;
-Landroid/icu/text/UppercaseTransliterator$1;
-Landroid/icu/text/UppercaseTransliterator$2;
-Landroid/icu/text/UppercaseTransliterator;
-Landroid/icu/util/AnnualTimeZoneRule;
-Landroid/icu/util/BasicTimeZone$LocalOption;
-Landroid/icu/util/BasicTimeZone;
-Landroid/icu/util/BuddhistCalendar;
-Landroid/icu/util/ByteArrayWrapper;
-Landroid/icu/util/BytesTrie$Entry;
-Landroid/icu/util/BytesTrie$Iterator;
-Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrie$State;
-Landroid/icu/util/BytesTrie;
-Landroid/icu/util/BytesTrieBuilder$BytesAsCharSequence;
-Landroid/icu/util/BytesTrieBuilder;
-Landroid/icu/util/CECalendar;
-Landroid/icu/util/Calendar$1;
-Landroid/icu/util/Calendar$FormatConfiguration-IA;
-Landroid/icu/util/Calendar$FormatConfiguration;
-Landroid/icu/util/Calendar$PatternData;
-Landroid/icu/util/Calendar$WeekData;
-Landroid/icu/util/Calendar$WeekDataCache;
-Landroid/icu/util/Calendar;
-Landroid/icu/util/CaseInsensitiveString;
-Landroid/icu/util/CharsTrie$Entry;
-Landroid/icu/util/CharsTrie$Iterator;
-Landroid/icu/util/CharsTrie$State;
-Landroid/icu/util/CharsTrie;
-Landroid/icu/util/CharsTrieBuilder;
-Landroid/icu/util/ChineseCalendar;
-Landroid/icu/util/CodePointMap$Range;
-Landroid/icu/util/CodePointMap$RangeIterator;
-Landroid/icu/util/CodePointMap$RangeOption;
-Landroid/icu/util/CodePointMap$StringIterator;
-Landroid/icu/util/CodePointMap$ValueFilter;
-Landroid/icu/util/CodePointMap;
-Landroid/icu/util/CodePointTrie$Data-IA;
-Landroid/icu/util/CodePointTrie$Data16;
-Landroid/icu/util/CodePointTrie$Data32;
-Landroid/icu/util/CodePointTrie$Data8;
-Landroid/icu/util/CodePointTrie$Data;
-Landroid/icu/util/CodePointTrie$Fast$FastStringIterator;
-Landroid/icu/util/CodePointTrie$Fast-IA;
-Landroid/icu/util/CodePointTrie$Fast16;
-Landroid/icu/util/CodePointTrie$Fast32;
-Landroid/icu/util/CodePointTrie$Fast8;
-Landroid/icu/util/CodePointTrie$Fast;
-Landroid/icu/util/CodePointTrie$Small$SmallStringIterator;
-Landroid/icu/util/CodePointTrie$Small-IA;
-Landroid/icu/util/CodePointTrie$Small16;
-Landroid/icu/util/CodePointTrie$Small32;
-Landroid/icu/util/CodePointTrie$Small8;
-Landroid/icu/util/CodePointTrie$Small;
-Landroid/icu/util/CodePointTrie$Type;
-Landroid/icu/util/CodePointTrie$ValueWidth;
-Landroid/icu/util/CodePointTrie-IA;
-Landroid/icu/util/CodePointTrie;
-Landroid/icu/util/CompactByteArray;
-Landroid/icu/util/CompactCharArray;
-Landroid/icu/util/CopticCalendar;
-Landroid/icu/util/Currency$1;
-Landroid/icu/util/Currency$CurrencyNameResultHandler;
-Landroid/icu/util/Currency$CurrencyStringInfo;
-Landroid/icu/util/Currency$CurrencyUsage;
-Landroid/icu/util/Currency$ServiceShim;
-Landroid/icu/util/Currency;
-Landroid/icu/util/CurrencyAmount;
-Landroid/icu/util/CurrencyServiceShim$CFService$1CurrencyFactory;
-Landroid/icu/util/CurrencyServiceShim$CFService;
-Landroid/icu/util/CurrencyServiceShim;
-Landroid/icu/util/DangiCalendar;
-Landroid/icu/util/DateInterval;
-Landroid/icu/util/DateRule;
-Landroid/icu/util/DateTimeRule;
-Landroid/icu/util/EasterHoliday;
-Landroid/icu/util/EasterRule;
-Landroid/icu/util/EthiopicCalendar;
-Landroid/icu/util/Freezable;
-Landroid/icu/util/GenderInfo$Cache;
-Landroid/icu/util/GenderInfo$Gender;
-Landroid/icu/util/GenderInfo$ListGenderStyle;
-Landroid/icu/util/GenderInfo;
-Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GregorianCalendar;
-Landroid/icu/util/HebrewCalendar;
-Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/Holiday;
-Landroid/icu/util/ICUCloneNotSupportedException;
-Landroid/icu/util/ICUException;
-Landroid/icu/util/ICUInputTooLongException;
-Landroid/icu/util/ICUUncheckedIOException;
-Landroid/icu/util/IllformedLocaleException;
-Landroid/icu/util/IndianCalendar;
-Landroid/icu/util/InitialTimeZoneRule;
-Landroid/icu/util/IslamicCalendar$CalculationType;
-Landroid/icu/util/IslamicCalendar;
-Landroid/icu/util/JapaneseCalendar;
-Landroid/icu/util/LocaleData$MeasurementSystem;
-Landroid/icu/util/LocaleData$PaperSize;
-Landroid/icu/util/LocaleData;
-Landroid/icu/util/LocaleMatcher$Builder;
-Landroid/icu/util/LocaleMatcher$Demotion;
-Landroid/icu/util/LocaleMatcher$Direction;
-Landroid/icu/util/LocaleMatcher$FavorSubtag;
-Landroid/icu/util/LocaleMatcher$LocaleLsrIterator;
-Landroid/icu/util/LocaleMatcher$LsrIterator;
-Landroid/icu/util/LocaleMatcher$Result;
-Landroid/icu/util/LocaleMatcher$ULocaleLsrIterator;
-Landroid/icu/util/LocaleMatcher;
-Landroid/icu/util/LocalePriorityList$1;
-Landroid/icu/util/LocalePriorityList$Builder;
-Landroid/icu/util/LocalePriorityList;
-Landroid/icu/util/Measure;
-Landroid/icu/util/MeasureUnit$1;
-Landroid/icu/util/MeasureUnit$2;
-Landroid/icu/util/MeasureUnit$3;
-Landroid/icu/util/MeasureUnit$Complexity;
-Landroid/icu/util/MeasureUnit$CurrencyNumericCodeSink;
-Landroid/icu/util/MeasureUnit$Factory;
-Landroid/icu/util/MeasureUnit$MeasurePrefix;
-Landroid/icu/util/MeasureUnit$MeasureUnitProxy;
-Landroid/icu/util/MeasureUnit$MeasureUnitSink;
-Landroid/icu/util/MeasureUnit;
-Landroid/icu/util/MutableCodePointTrie$1;
-Landroid/icu/util/MutableCodePointTrie$AllSameBlocks;
-Landroid/icu/util/MutableCodePointTrie$MixedBlocks-IA;
-Landroid/icu/util/MutableCodePointTrie$MixedBlocks;
-Landroid/icu/util/MutableCodePointTrie;
-Landroid/icu/util/NoUnit;
-Landroid/icu/util/Output;
-Landroid/icu/util/OutputInt;
-Landroid/icu/util/PersianCalendar;
-Landroid/icu/util/Range;
-Landroid/icu/util/RangeDateRule;
-Landroid/icu/util/RangeValueIterator$Element;
-Landroid/icu/util/RangeValueIterator;
-Landroid/icu/util/Region$RegionType;
-Landroid/icu/util/Region;
-Landroid/icu/util/RuleBasedTimeZone;
-Landroid/icu/util/STZInfo;
-Landroid/icu/util/SimpleDateRule;
-Landroid/icu/util/SimpleHoliday;
-Landroid/icu/util/SimpleTimeZone;
-Landroid/icu/util/StringTokenizer;
-Landroid/icu/util/StringTrieBuilder$BranchHeadNode;
-Landroid/icu/util/StringTrieBuilder$BranchNode;
-Landroid/icu/util/StringTrieBuilder$DynamicBranchNode;
-Landroid/icu/util/StringTrieBuilder$IntermediateValueNode;
-Landroid/icu/util/StringTrieBuilder$LinearMatchNode;
-Landroid/icu/util/StringTrieBuilder$ListBranchNode;
-Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$Option;
-Landroid/icu/util/StringTrieBuilder$SplitBranchNode;
-Landroid/icu/util/StringTrieBuilder$State;
-Landroid/icu/util/StringTrieBuilder$ValueNode;
-Landroid/icu/util/StringTrieBuilder;
-Landroid/icu/util/TaiwanCalendar;
-Landroid/icu/util/TimeArrayTimeZoneRule;
-Landroid/icu/util/TimeUnit;
-Landroid/icu/util/TimeUnitAmount;
-Landroid/icu/util/TimeZone$ConstantZone;
-Landroid/icu/util/TimeZone$SystemTimeZoneType;
-Landroid/icu/util/TimeZone;
-Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/TimeZoneTransition;
-Landroid/icu/util/ULocale$1;
-Landroid/icu/util/ULocale$2;
-Landroid/icu/util/ULocale$AliasReplacer;
-Landroid/icu/util/ULocale$AvailableType;
-Landroid/icu/util/ULocale$Builder;
-Landroid/icu/util/ULocale$Category;
-Landroid/icu/util/ULocale$JDKLocaleHelper;
-Landroid/icu/util/ULocale$Minimize;
-Landroid/icu/util/ULocale$Type;
-Landroid/icu/util/ULocale-IA;
-Landroid/icu/util/ULocale;
-Landroid/icu/util/UResourceBundle$RootType;
-Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundleIterator;
-Landroid/icu/util/UResourceTypeMismatchException;
-Landroid/icu/util/UniversalTimeScale$TimeScaleData;
-Landroid/icu/util/UniversalTimeScale;
-Landroid/icu/util/VTimeZone;
-Landroid/icu/util/ValueIterator$Element;
-Landroid/icu/util/ValueIterator;
-Landroid/icu/util/VersionInfo;
-Landroid/inputmethodservice/AbstractInputMethodService$AbstractInputMethodImpl;
-Landroid/inputmethodservice/AbstractInputMethodService$AbstractInputMethodSessionImpl;
-Landroid/inputmethodservice/AbstractInputMethodService;
-Landroid/inputmethodservice/ExtractEditText;
-Landroid/inputmethodservice/IInputMethodSessionWrapper$ImeInputEventReceiver;
-Landroid/inputmethodservice/IInputMethodSessionWrapper;
-Landroid/inputmethodservice/IInputMethodWrapper$InputMethodSessionCallbackWrapper;
-Landroid/inputmethodservice/IInputMethodWrapper;
-Landroid/inputmethodservice/InputMethodService$InputMethodImpl;
-Landroid/inputmethodservice/InputMethodService$InputMethodSessionImpl;
-Landroid/inputmethodservice/InputMethodService$Insets;
-Landroid/inputmethodservice/InputMethodService$SettingsObserver;
-Landroid/inputmethodservice/InputMethodService;
-Landroid/inputmethodservice/SoftInputWindow;
-Landroid/internal/hidl/base/V1_0/DebugInfo;
-Landroid/internal/hidl/base/V1_0/IBase;
-Landroid/internal/hidl/manager/V1_0/IServiceManager;
-Landroid/internal/hidl/manager/V1_1/IServiceManager;
-Landroid/internal/hidl/manager/V1_2/IServiceManager$Stub;
-Landroid/internal/hidl/manager/V1_2/IServiceManager;
-Landroid/internal/hidl/safe_union/V1_0/Monostate;
-Landroid/internal/modules/utils/build/SdkLevel;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda0;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda10;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda11;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda12;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda13;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda14;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda1;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda2;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda3;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda4;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda5;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda6;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda7;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda8;
-Landroid/internal/telephony/sysprop/TelephonyProperties$$ExternalSyntheticLambda9;
-Landroid/internal/telephony/sysprop/TelephonyProperties;
-Landroid/location/Geofence$1;
-Landroid/location/Geofence;
-Landroid/location/IFusedGeofenceHardware$Stub$Proxy;
-Landroid/location/IFusedGeofenceHardware$Stub;
-Landroid/location/IFusedGeofenceHardware;
-Landroid/location/IGpsGeofenceHardware$Stub$Proxy;
-Landroid/location/IGpsGeofenceHardware$Stub;
-Landroid/location/IGpsGeofenceHardware;
-Landroid/location/Location$$ExternalSyntheticLambda0;
-Landroid/location/Location$1;
-Landroid/location/Location$BearingDistanceCache-IA;
-Landroid/location/Location$BearingDistanceCache;
-Landroid/location/Location;
-Landroid/location/LocationTime$1;
-Landroid/location/LocationTime;
-Landroid/media/AudioAttributes$1;
-Landroid/media/AudioAttributes$Builder;
-Landroid/media/AudioAttributes-IA;
-Landroid/media/AudioAttributes;
-Landroid/media/AudioDescriptor$1;
-Landroid/media/AudioDescriptor;
-Landroid/media/AudioDeviceAttributes$1;
-Landroid/media/AudioDeviceAttributes;
-Landroid/media/AudioDeviceCallback;
-Landroid/media/AudioDeviceInfo;
-Landroid/media/AudioDevicePort;
-Landroid/media/AudioDevicePortConfig;
-Landroid/media/AudioDeviceVolumeManager;
-Landroid/media/AudioFocusInfo$1;
-Landroid/media/AudioFocusInfo;
-Landroid/media/AudioFocusRequest$Builder;
-Landroid/media/AudioFocusRequest-IA;
-Landroid/media/AudioFocusRequest;
-Landroid/media/AudioFormat$1;
-Landroid/media/AudioFormat$Builder;
-Landroid/media/AudioFormat-IA;
-Landroid/media/AudioFormat;
-Landroid/media/AudioGain;
-Landroid/media/AudioGainConfig;
-Landroid/media/AudioHandle;
-Landroid/media/AudioManager$1;
-Landroid/media/AudioManager$2;
-Landroid/media/AudioManager$3;
-Landroid/media/AudioManager$4;
-Landroid/media/AudioManager$AudioPlaybackCallback;
-Landroid/media/AudioManager$AudioPlaybackCallbackInfo;
-Landroid/media/AudioManager$AudioRecordingCallback;
-Landroid/media/AudioManager$AudioRecordingCallbackInfo;
-Landroid/media/AudioManager$BlockingFocusResultReceiver;
-Landroid/media/AudioManager$DevRoleListeners-IA;
-Landroid/media/AudioManager$DevRoleListeners;
-Landroid/media/AudioManager$FocusRequestInfo;
-Landroid/media/AudioManager$NativeEventHandlerDelegate$1;
-Landroid/media/AudioManager$NativeEventHandlerDelegate;
-Landroid/media/AudioManager$OnAmPortUpdateListener-IA;
-Landroid/media/AudioManager$OnAmPortUpdateListener;
-Landroid/media/AudioManager$OnAudioFocusChangeListener;
-Landroid/media/AudioManager$OnAudioPortUpdateListener;
-Landroid/media/AudioManager$OnModeChangedListener;
-Landroid/media/AudioManager$PlaybackConfigChangeCallbackData;
-Landroid/media/AudioManager$RecordConfigChangeCallbackData;
-Landroid/media/AudioManager$SafeWaitObject-IA;
-Landroid/media/AudioManager$SafeWaitObject;
-Landroid/media/AudioManager$ServiceEventHandlerDelegate$1;
-Landroid/media/AudioManager$ServiceEventHandlerDelegate;
-Landroid/media/AudioManager;
-Landroid/media/AudioManagerInternal$RingerModeDelegate;
-Landroid/media/AudioManagerInternal;
-Landroid/media/AudioMetadata$2;
-Landroid/media/AudioMetadata$3;
-Landroid/media/AudioMetadata$4;
-Landroid/media/AudioMetadata$5;
-Landroid/media/AudioMetadata$6;
-Landroid/media/AudioMetadata$BaseMap;
-Landroid/media/AudioMetadata$BaseMapPackage;
-Landroid/media/AudioMetadata$DataPackage;
-Landroid/media/AudioMetadata$ObjectPackage;
-Landroid/media/AudioMetadata;
-Landroid/media/AudioMetadataMap;
-Landroid/media/AudioMetadataReadMap;
-Landroid/media/AudioMixCallbackFlag;
-Landroid/media/AudioMixPort;
-Landroid/media/AudioMixPortConfig;
-Landroid/media/AudioMixerAttributes$1;
-Landroid/media/AudioMixerAttributes;
-Landroid/media/AudioPatch;
-Landroid/media/AudioPlaybackConfiguration$1;
-Landroid/media/AudioPlaybackConfiguration$IPlayerShell;
-Landroid/media/AudioPlaybackConfiguration$PlayerDeathMonitor;
-Landroid/media/AudioPlaybackConfiguration;
-Landroid/media/AudioPort$$ExternalSyntheticLambda0;
-Landroid/media/AudioPort;
-Landroid/media/AudioPortConfig;
-Landroid/media/AudioPortEventHandler$1;
-Landroid/media/AudioPortEventHandler;
-Landroid/media/AudioPresentation$1;
-Landroid/media/AudioPresentation;
-Landroid/media/AudioProfile$1;
-Landroid/media/AudioProfile;
-Landroid/media/AudioRecord$NativeEventHandler;
-Landroid/media/AudioRecord$OnRecordPositionUpdateListener;
-Landroid/media/AudioRecord;
-Landroid/media/AudioRecordRoutingProxy;
-Landroid/media/AudioRecordingConfiguration$1;
-Landroid/media/AudioRecordingConfiguration;
-Landroid/media/AudioRecordingMonitor;
-Landroid/media/AudioRecordingMonitorClient;
-Landroid/media/AudioRecordingMonitorImpl$1;
-Landroid/media/AudioRecordingMonitorImpl;
-Landroid/media/AudioRoutesInfo$1;
-Landroid/media/AudioRoutesInfo;
-Landroid/media/AudioRouting;
-Landroid/media/AudioSystem$AudioRecordingCallback;
-Landroid/media/AudioSystem$DynamicPolicyCallback;
-Landroid/media/AudioSystem$ErrorCallback;
-Landroid/media/AudioSystem;
-Landroid/media/AudioTimestamp$1;
-Landroid/media/AudioTimestamp;
-Landroid/media/AudioTrack$1;
-Landroid/media/AudioTrack$NativePositionEventHandlerDelegate;
-Landroid/media/AudioTrack$TunerConfiguration;
-Landroid/media/AudioTrack;
-Landroid/media/AudioTrackRoutingProxy;
-Landroid/media/CallbackUtil$DispatcherStub;
-Landroid/media/CallbackUtil$LazyListenerManager$$ExternalSyntheticLambda0;
-Landroid/media/CallbackUtil$LazyListenerManager;
-Landroid/media/CallbackUtil$ListenerInfo;
-Landroid/media/CallbackUtil;
-Landroid/media/CamcorderProfile;
-Landroid/media/CameraProfile;
-Landroid/media/DecoderCapabilities;
-Landroid/media/DeniedByServerException;
-Landroid/media/DrmInitData$SchemeInitData;
-Landroid/media/DrmInitData;
-Landroid/media/EncoderCapabilities;
-Landroid/media/ExifInterface$ByteOrderedDataInputStream;
-Landroid/media/ExifInterface$ByteOrderedDataOutputStream;
-Landroid/media/ExifInterface$ExifAttribute;
-Landroid/media/ExifInterface$ExifTag;
-Landroid/media/ExifInterface$Rational;
-Landroid/media/ExifInterface;
-Landroid/media/ExifInterfaceUtils;
-Landroid/media/ExternalRingtonesCursorWrapper;
-Landroid/media/IAudioFocusDispatcher$Stub$Proxy;
-Landroid/media/IAudioFocusDispatcher$Stub;
-Landroid/media/IAudioFocusDispatcher;
-Landroid/media/IAudioModeDispatcher;
-Landroid/media/IAudioRoutesObserver$Stub$Proxy;
-Landroid/media/IAudioRoutesObserver$Stub;
-Landroid/media/IAudioRoutesObserver;
-Landroid/media/IAudioServerStateDispatcher$Stub$Proxy;
-Landroid/media/IAudioServerStateDispatcher$Stub;
-Landroid/media/IAudioServerStateDispatcher;
-Landroid/media/IAudioService$Stub$Proxy;
-Landroid/media/IAudioService$Stub;
-Landroid/media/IAudioService;
-Landroid/media/ICapturePresetDevicesRoleDispatcher$Stub$Proxy;
-Landroid/media/ICapturePresetDevicesRoleDispatcher$Stub;
-Landroid/media/ICapturePresetDevicesRoleDispatcher;
-Landroid/media/ICommunicationDeviceDispatcher$Stub;
-Landroid/media/ICommunicationDeviceDispatcher;
-Landroid/media/IMediaHTTPConnection$Stub;
-Landroid/media/IMediaHTTPConnection;
-Landroid/media/IMediaHTTPService$Stub;
-Landroid/media/IMediaHTTPService;
-Landroid/media/IMediaResourceMonitor$Stub;
-Landroid/media/IMediaResourceMonitor;
-Landroid/media/IMediaRoute2ProviderService$Stub$Proxy;
-Landroid/media/IMediaRoute2ProviderService$Stub;
-Landroid/media/IMediaRoute2ProviderService;
-Landroid/media/IMediaRoute2ProviderServiceCallback$Stub;
-Landroid/media/IMediaRoute2ProviderServiceCallback;
-Landroid/media/IMediaRouter2$Stub$Proxy;
-Landroid/media/IMediaRouter2$Stub;
-Landroid/media/IMediaRouter2;
-Landroid/media/IMediaRouter2Manager$Stub$Proxy;
-Landroid/media/IMediaRouter2Manager$Stub;
-Landroid/media/IMediaRouter2Manager;
-Landroid/media/IMediaRouterClient$Stub$Proxy;
-Landroid/media/IMediaRouterClient$Stub;
-Landroid/media/IMediaRouterClient;
-Landroid/media/IMediaRouterService$Stub$Proxy;
-Landroid/media/IMediaRouterService$Stub;
-Landroid/media/IMediaRouterService;
-Landroid/media/INearbyMediaDevicesProvider;
-Landroid/media/IPlaybackConfigDispatcher$Stub$Proxy;
-Landroid/media/IPlaybackConfigDispatcher$Stub;
-Landroid/media/IPlaybackConfigDispatcher;
-Landroid/media/IPlayer$Stub$Proxy;
-Landroid/media/IPlayer$Stub;
-Landroid/media/IPlayer;
-Landroid/media/IRecordingConfigDispatcher$Stub$Proxy;
-Landroid/media/IRecordingConfigDispatcher$Stub;
-Landroid/media/IRecordingConfigDispatcher;
-Landroid/media/IRemoteSessionCallback$Stub;
-Landroid/media/IRemoteSessionCallback;
-Landroid/media/IRemoteVolumeObserver$Stub;
-Landroid/media/IRemoteVolumeObserver;
-Landroid/media/IRingtonePlayer$Stub$Proxy;
-Landroid/media/IRingtonePlayer$Stub;
-Landroid/media/IRingtonePlayer;
-Landroid/media/IStrategyPreferredDevicesDispatcher$Stub$Proxy;
-Landroid/media/IStrategyPreferredDevicesDispatcher$Stub;
-Landroid/media/IStrategyPreferredDevicesDispatcher;
-Landroid/media/IVolumeController$Stub$Proxy;
-Landroid/media/IVolumeController$Stub;
-Landroid/media/IVolumeController;
-Landroid/media/Image$Plane;
-Landroid/media/Image;
-Landroid/media/ImageReader$ImagePlane;
-Landroid/media/ImageReader$ListenerHandler;
-Landroid/media/ImageReader$OnImageAvailableListener;
-Landroid/media/ImageReader$SurfaceImage$SurfacePlane;
-Landroid/media/ImageReader$SurfaceImage;
-Landroid/media/ImageReader;
-Landroid/media/ImageUtils;
-Landroid/media/ImageWriter$WriterSurfaceImage$SurfacePlane;
-Landroid/media/ImageWriter$WriterSurfaceImage;
-Landroid/media/ImageWriter;
-Landroid/media/JetPlayer;
-Landroid/media/MediaCodec$BufferInfo;
-Landroid/media/MediaCodec$BufferMap$CodecBuffer-IA;
-Landroid/media/MediaCodec$BufferMap$CodecBuffer;
-Landroid/media/MediaCodec$BufferMap-IA;
-Landroid/media/MediaCodec$BufferMap;
-Landroid/media/MediaCodec$Callback;
-Landroid/media/MediaCodec$CodecException;
-Landroid/media/MediaCodec$CryptoException;
-Landroid/media/MediaCodec$CryptoInfo$Pattern;
-Landroid/media/MediaCodec$CryptoInfo;
-Landroid/media/MediaCodec$EventHandler;
-Landroid/media/MediaCodec$IncompatibleWithBlockModelException;
-Landroid/media/MediaCodec$InvalidBufferFlagsException;
-Landroid/media/MediaCodec$LinearBlock;
-Landroid/media/MediaCodec$OnFrameRenderedListener;
-Landroid/media/MediaCodec$OutputFrame;
-Landroid/media/MediaCodec$ParameterDescriptor;
-Landroid/media/MediaCodec$PersistentSurface;
-Landroid/media/MediaCodec$QueueRequest;
-Landroid/media/MediaCodec;
-Landroid/media/MediaCodecInfo$AudioCapabilities;
-Landroid/media/MediaCodecInfo$CodecCapabilities$FeatureList;
-Landroid/media/MediaCodecInfo$CodecCapabilities;
-Landroid/media/MediaCodecInfo$CodecProfileLevel;
-Landroid/media/MediaCodecInfo$EncoderCapabilities;
-Landroid/media/MediaCodecInfo$Feature;
-Landroid/media/MediaCodecInfo$LazyHolder;
-Landroid/media/MediaCodecInfo$VideoCapabilities$$ExternalSyntheticLambda0;
-Landroid/media/MediaCodecInfo$VideoCapabilities$PerformancePoint;
-Landroid/media/MediaCodecInfo$VideoCapabilities;
-Landroid/media/MediaCodecInfo;
-Landroid/media/MediaCodecList;
-Landroid/media/MediaCrypto;
-Landroid/media/MediaCryptoException;
-Landroid/media/MediaDataSource;
-Landroid/media/MediaDescrambler;
-Landroid/media/MediaDescription$1;
-Landroid/media/MediaDescription$Builder;
-Landroid/media/MediaDescription-IA;
-Landroid/media/MediaDescription;
-Landroid/media/MediaDrm$Certificate;
-Landroid/media/MediaDrm$CryptoSession;
-Landroid/media/MediaDrm$KeyRequest;
-Landroid/media/MediaDrm$KeyStatus;
-Landroid/media/MediaDrm$ListenerWithExecutor;
-Landroid/media/MediaDrm$LogMessage;
-Landroid/media/MediaDrm$MediaDrmStateException;
-Landroid/media/MediaDrm$OnEventListener;
-Landroid/media/MediaDrm$ProvisionRequest;
-Landroid/media/MediaDrm$SessionException;
-Landroid/media/MediaDrm;
-Landroid/media/MediaDrmException;
-Landroid/media/MediaDrmThrowable;
-Landroid/media/MediaExtractor;
-Landroid/media/MediaFile;
-Landroid/media/MediaFormat;
-Landroid/media/MediaFrameworkPlatformInitializer$$ExternalSyntheticLambda0;
-Landroid/media/MediaFrameworkPlatformInitializer;
-Landroid/media/MediaHTTPConnection;
-Landroid/media/MediaHTTPService;
-Landroid/media/MediaMetadata$1;
-Landroid/media/MediaMetadata$Builder;
-Landroid/media/MediaMetadata-IA;
-Landroid/media/MediaMetadata;
-Landroid/media/MediaMetadataRetriever$BitmapParams;
-Landroid/media/MediaMetadataRetriever;
-Landroid/media/MediaMetrics$1;
-Landroid/media/MediaMetrics$Item;
-Landroid/media/MediaMetrics$Key;
-Landroid/media/MediaMetrics$Property;
-Landroid/media/MediaMetrics;
-Landroid/media/MediaMuxer;
-Landroid/media/MediaPlayer$1;
-Landroid/media/MediaPlayer$2$1;
-Landroid/media/MediaPlayer$2;
-Landroid/media/MediaPlayer$3;
-Landroid/media/MediaPlayer$6;
-Landroid/media/MediaPlayer$7;
-Landroid/media/MediaPlayer$DrmInfo-IA;
-Landroid/media/MediaPlayer$DrmInfo;
-Landroid/media/MediaPlayer$EventHandler$$ExternalSyntheticLambda0;
-Landroid/media/MediaPlayer$EventHandler$1;
-Landroid/media/MediaPlayer$EventHandler$2;
-Landroid/media/MediaPlayer$EventHandler;
-Landroid/media/MediaPlayer$OnBufferingUpdateListener;
-Landroid/media/MediaPlayer$OnCompletionListener;
-Landroid/media/MediaPlayer$OnDrmConfigHelper;
-Landroid/media/MediaPlayer$OnDrmInfoHandlerDelegate;
-Landroid/media/MediaPlayer$OnDrmPreparedHandlerDelegate;
-Landroid/media/MediaPlayer$OnErrorListener;
-Landroid/media/MediaPlayer$OnInfoListener;
-Landroid/media/MediaPlayer$OnMediaTimeDiscontinuityListener;
-Landroid/media/MediaPlayer$OnPreparedListener;
-Landroid/media/MediaPlayer$OnRtpRxNoticeListener;
-Landroid/media/MediaPlayer$OnSeekCompleteListener;
-Landroid/media/MediaPlayer$OnSubtitleDataListener;
-Landroid/media/MediaPlayer$OnTimedMetaDataAvailableListener;
-Landroid/media/MediaPlayer$OnTimedTextListener;
-Landroid/media/MediaPlayer$OnVideoSizeChangedListener;
-Landroid/media/MediaPlayer$ProvisioningThread;
-Landroid/media/MediaPlayer$TimeProvider$EventHandler;
-Landroid/media/MediaPlayer$TimeProvider;
-Landroid/media/MediaPlayer$TrackInfo$1;
-Landroid/media/MediaPlayer$TrackInfo;
-Landroid/media/MediaPlayer;
-Landroid/media/MediaRecorder;
-Landroid/media/MediaRoute2Info$1;
-Landroid/media/MediaRoute2Info$Builder;
-Landroid/media/MediaRoute2Info;
-Landroid/media/MediaRoute2ProviderInfo$1;
-Landroid/media/MediaRoute2ProviderInfo$Builder;
-Landroid/media/MediaRoute2ProviderInfo;
-Landroid/media/MediaRouter$Callback;
-Landroid/media/MediaRouter$CallbackInfo;
-Landroid/media/MediaRouter$RouteCategory;
-Landroid/media/MediaRouter$RouteGroup;
-Landroid/media/MediaRouter$RouteInfo$1;
-Landroid/media/MediaRouter$RouteInfo;
-Landroid/media/MediaRouter$SimpleCallback;
-Landroid/media/MediaRouter$Static$1$1;
-Landroid/media/MediaRouter$Static$1;
-Landroid/media/MediaRouter$Static$Client$$ExternalSyntheticLambda0;
-Landroid/media/MediaRouter$Static$Client$$ExternalSyntheticLambda1;
-Landroid/media/MediaRouter$Static$Client$1;
-Landroid/media/MediaRouter$Static$Client;
-Landroid/media/MediaRouter$Static;
-Landroid/media/MediaRouter$UserRouteInfo$SessionVolumeProvider;
-Landroid/media/MediaRouter$UserRouteInfo;
-Landroid/media/MediaRouter$VolumeCallback;
-Landroid/media/MediaRouter$VolumeCallbackInfo;
-Landroid/media/MediaRouter$VolumeChangeReceiver;
-Landroid/media/MediaRouter$WifiDisplayStatusChangedReceiver;
-Landroid/media/MediaRouter2$$ExternalSyntheticLambda7;
-Landroid/media/MediaRouter2$$ExternalSyntheticLambda8;
-Landroid/media/MediaRouter2Manager$Callback;
-Landroid/media/MediaRouter2Manager$CallbackRecord;
-Landroid/media/MediaRouter2Manager$Client$$ExternalSyntheticLambda5;
-Landroid/media/MediaRouter2Manager$Client;
-Landroid/media/MediaRouter2Manager$TransferRequest;
-Landroid/media/MediaRouter2Manager;
-Landroid/media/MediaRouter2Utils;
-Landroid/media/MediaRouter;
-Landroid/media/MediaRouterClientState$1;
-Landroid/media/MediaRouterClientState$RouteInfo$1;
-Landroid/media/MediaRouterClientState$RouteInfo;
-Landroid/media/MediaRouterClientState;
-Landroid/media/MediaScanner;
-Landroid/media/MediaScannerConnection$MediaScannerConnectionClient;
-Landroid/media/MediaScannerConnection$OnScanCompletedListener;
-Landroid/media/MediaServiceManager$ServiceRegisterer;
-Landroid/media/MediaServiceManager;
-Landroid/media/MediaSync;
-Landroid/media/MediaTimeProvider$OnMediaTimeListener;
-Landroid/media/MediaTimeProvider;
-Landroid/media/MediaTimestamp;
-Landroid/media/MicrophoneDirection;
-Landroid/media/MicrophoneInfo$Coordinate3F;
-Landroid/media/MicrophoneInfo;
-Landroid/media/NativeRoutingEventHandlerDelegate;
-Landroid/media/NotProvisionedException;
-Landroid/media/PlaybackParams$1;
-Landroid/media/PlaybackParams;
-Landroid/media/PlayerBase$IPlayerWrapper;
-Landroid/media/PlayerBase$PlayerIdCard$1;
-Landroid/media/PlayerBase$PlayerIdCard;
-Landroid/media/PlayerBase;
-Landroid/media/PublicFormatUtils;
-Landroid/media/Rating$1;
-Landroid/media/Rating;
-Landroid/media/RemoteControlClient;
-Landroid/media/RemoteDisplay;
-Landroid/media/ResampleInputStream;
-Landroid/media/ResourceBusyException;
-Landroid/media/Ringtone;
-Landroid/media/RingtoneManager;
-Landroid/media/RouteDiscoveryPreference$1;
-Landroid/media/RouteDiscoveryPreference$Builder$$ExternalSyntheticLambda0;
-Landroid/media/RouteDiscoveryPreference$Builder;
-Landroid/media/RouteDiscoveryPreference;
-Landroid/media/RouteListingPreference$1;
-Landroid/media/RouteListingPreference;
-Landroid/media/RoutingSessionInfo$1;
-Landroid/media/RoutingSessionInfo$Builder;
-Landroid/media/RoutingSessionInfo;
-Landroid/media/SoundPool$Builder;
-Landroid/media/SoundPool$EventHandler;
-Landroid/media/SoundPool$OnLoadCompleteListener;
-Landroid/media/SoundPool-IA;
-Landroid/media/SoundPool;
-Landroid/media/Spatializer;
-Landroid/media/SubtitleController$1;
-Landroid/media/SubtitleController$2;
-Landroid/media/SubtitleController$Anchor;
-Landroid/media/SubtitleController$Listener;
-Landroid/media/SubtitleController;
-Landroid/media/SubtitleData;
-Landroid/media/SubtitleTrack$RenderingWidget;
-Landroid/media/SubtitleTrack;
-Landroid/media/SyncParams;
-Landroid/media/ThumbnailUtils$Resizer;
-Landroid/media/ThumbnailUtils$SizedThumbnailBitmap;
-Landroid/media/ThumbnailUtils;
-Landroid/media/TimedMetaData;
-Landroid/media/TimedText;
-Landroid/media/ToneGenerator;
-Landroid/media/UnsupportedSchemeException;
-Landroid/media/Utils$1;
-Landroid/media/Utils$2;
-Landroid/media/Utils$ListenerList;
-Landroid/media/Utils;
-Landroid/media/VolumeAutomation;
-Landroid/media/VolumePolicy$1;
-Landroid/media/VolumePolicy;
-Landroid/media/VolumeProvider$Callback;
-Landroid/media/VolumeProvider;
-Landroid/media/VolumeShaper$Configuration$1;
-Landroid/media/VolumeShaper$Configuration$Builder;
-Landroid/media/VolumeShaper$Configuration;
-Landroid/media/VolumeShaper$Operation$1;
-Landroid/media/VolumeShaper$Operation$Builder;
-Landroid/media/VolumeShaper$Operation;
-Landroid/media/VolumeShaper$State$1;
-Landroid/media/VolumeShaper$State;
-Landroid/media/VolumeShaper;
-Landroid/media/audio/Flags;
-Landroid/media/audio/common/AidlConversion;
-Landroid/media/audio/common/HeadTracking$SensorData$Tag;
-Landroid/media/audiofx/AudioEffect$Descriptor;
-Landroid/media/audiofx/AudioEffect;
-Landroid/media/audiofx/DefaultEffect;
-Landroid/media/audiofx/SourceDefaultEffect;
-Landroid/media/audiofx/StreamDefaultEffect;
-Landroid/media/audiofx/Visualizer$MeasurementPeakRms;
-Landroid/media/audiofx/Visualizer;
-Landroid/media/audiopolicy/AudioMix$1;
-Landroid/media/audiopolicy/AudioMix$Builder;
-Landroid/media/audiopolicy/AudioMix;
-Landroid/media/audiopolicy/AudioMixingRule$1;
-Landroid/media/audiopolicy/AudioMixingRule$AudioMixMatchCriterion$1;
-Landroid/media/audiopolicy/AudioMixingRule$AudioMixMatchCriterion;
-Landroid/media/audiopolicy/AudioMixingRule$Builder;
-Landroid/media/audiopolicy/AudioMixingRule;
-Landroid/media/audiopolicy/AudioPolicy$1;
-Landroid/media/audiopolicy/AudioPolicy$AudioPolicyStatusListener;
-Landroid/media/audiopolicy/AudioPolicy$EventHandler;
-Landroid/media/audiopolicy/AudioPolicy;
-Landroid/media/audiopolicy/AudioPolicyConfig$1;
-Landroid/media/audiopolicy/AudioPolicyConfig;
-Landroid/media/audiopolicy/AudioProductStrategy$1;
-Landroid/media/audiopolicy/AudioProductStrategy$AudioAttributesGroup$1;
-Landroid/media/audiopolicy/AudioProductStrategy$AudioAttributesGroup;
-Landroid/media/audiopolicy/AudioProductStrategy;
-Landroid/media/audiopolicy/AudioVolumeGroup$1;
-Landroid/media/audiopolicy/AudioVolumeGroup;
-Landroid/media/audiopolicy/AudioVolumeGroupChangeHandler;
-Landroid/media/audiopolicy/IAudioPolicyCallback$Stub$Proxy;
-Landroid/media/audiopolicy/IAudioPolicyCallback$Stub;
-Landroid/media/audiopolicy/IAudioPolicyCallback;
-Landroid/media/browse/MediaBrowser$1;
-Landroid/media/browse/MediaBrowser$2;
-Landroid/media/browse/MediaBrowser$6;
-Landroid/media/browse/MediaBrowser$7;
-Landroid/media/browse/MediaBrowser$8;
-Landroid/media/browse/MediaBrowser$ConnectionCallback;
-Landroid/media/browse/MediaBrowser$MediaItem$1;
-Landroid/media/browse/MediaBrowser$MediaItem;
-Landroid/media/browse/MediaBrowser$MediaServiceConnection$1;
-Landroid/media/browse/MediaBrowser$MediaServiceConnection-IA;
-Landroid/media/browse/MediaBrowser$MediaServiceConnection;
-Landroid/media/browse/MediaBrowser$ServiceCallbacks;
-Landroid/media/browse/MediaBrowser$Subscription;
-Landroid/media/browse/MediaBrowser$SubscriptionCallback;
-Landroid/media/browse/MediaBrowser;
-Landroid/media/browse/MediaBrowserUtils;
-Landroid/media/metrics/Event;
-Landroid/media/metrics/IMediaMetricsManager$Stub$Proxy;
-Landroid/media/metrics/IMediaMetricsManager$Stub;
-Landroid/media/metrics/IMediaMetricsManager;
-Landroid/media/metrics/LogSessionId;
-Landroid/media/metrics/MediaMetricsManager;
-Landroid/media/metrics/NetworkEvent$1;
-Landroid/media/metrics/NetworkEvent;
-Landroid/media/metrics/PlaybackSession;
-Landroid/media/midi/IMidiDeviceListener$Stub$Proxy;
-Landroid/media/midi/IMidiDeviceListener$Stub;
-Landroid/media/midi/IMidiDeviceListener;
-Landroid/media/midi/IMidiDeviceOpenCallback$Stub$Proxy;
-Landroid/media/midi/IMidiDeviceOpenCallback$Stub;
-Landroid/media/midi/IMidiDeviceOpenCallback;
-Landroid/media/midi/IMidiDeviceServer$Stub$Proxy;
-Landroid/media/midi/IMidiDeviceServer$Stub;
-Landroid/media/midi/IMidiDeviceServer;
-Landroid/media/midi/IMidiManager$Stub;
-Landroid/media/midi/IMidiManager;
-Landroid/media/midi/MidiDevice;
-Landroid/media/midi/MidiDeviceInfo$1;
-Landroid/media/midi/MidiDeviceInfo;
-Landroid/media/midi/MidiDeviceStatus$1;
-Landroid/media/midi/MidiDeviceStatus;
-Landroid/media/midi/MidiManager;
-Landroid/media/musicrecognition/IMusicRecognitionManager$Stub;
-Landroid/media/musicrecognition/IMusicRecognitionManager;
-Landroid/media/musicrecognition/IMusicRecognitionServiceCallback$Stub;
-Landroid/media/musicrecognition/IMusicRecognitionServiceCallback;
-Landroid/media/musicrecognition/MusicRecognitionManager;
-Landroid/media/permission/ClearCallingIdentityContext;
-Landroid/media/permission/CompositeSafeCloseable;
-Landroid/media/permission/Identity$1;
-Landroid/media/permission/Identity;
-Landroid/media/permission/IdentityContext;
-Landroid/media/permission/PermissionUtil;
-Landroid/media/permission/SafeCloseable;
-Landroid/media/projection/IMediaProjection$Stub$Proxy;
-Landroid/media/projection/IMediaProjection$Stub;
-Landroid/media/projection/IMediaProjection;
-Landroid/media/projection/IMediaProjectionManager$Stub$Proxy;
-Landroid/media/projection/IMediaProjectionManager$Stub;
-Landroid/media/projection/IMediaProjectionManager;
-Landroid/media/projection/IMediaProjectionWatcherCallback$Stub$Proxy;
-Landroid/media/projection/IMediaProjectionWatcherCallback$Stub;
-Landroid/media/projection/IMediaProjectionWatcherCallback;
-Landroid/media/projection/MediaProjection;
-Landroid/media/projection/MediaProjectionInfo$1;
-Landroid/media/projection/MediaProjectionInfo;
-Landroid/media/projection/MediaProjectionManager$Callback;
-Landroid/media/projection/MediaProjectionManager$CallbackDelegate;
-Landroid/media/projection/MediaProjectionManager;
-Landroid/media/session/IActiveSessionsListener$Stub$Proxy;
-Landroid/media/session/IActiveSessionsListener$Stub;
-Landroid/media/session/IActiveSessionsListener;
-Landroid/media/session/IOnMediaKeyEventDispatchedListener$Stub$Proxy;
-Landroid/media/session/IOnMediaKeyEventDispatchedListener$Stub;
-Landroid/media/session/IOnMediaKeyEventDispatchedListener;
-Landroid/media/session/IOnMediaKeyEventSessionChangedListener$Stub$Proxy;
-Landroid/media/session/IOnMediaKeyEventSessionChangedListener$Stub;
-Landroid/media/session/IOnMediaKeyEventSessionChangedListener;
-Landroid/media/session/IOnMediaKeyListener$Stub$Proxy;
-Landroid/media/session/IOnMediaKeyListener$Stub;
-Landroid/media/session/IOnMediaKeyListener;
-Landroid/media/session/IOnVolumeKeyLongPressListener$Stub$Proxy;
-Landroid/media/session/IOnVolumeKeyLongPressListener$Stub;
-Landroid/media/session/IOnVolumeKeyLongPressListener;
-Landroid/media/session/ISession$Stub$Proxy;
-Landroid/media/session/ISession$Stub;
-Landroid/media/session/ISession2TokensListener$Stub$Proxy;
-Landroid/media/session/ISession2TokensListener$Stub;
-Landroid/media/session/ISession2TokensListener;
-Landroid/media/session/ISession;
-Landroid/media/session/ISessionCallback$Stub$Proxy;
-Landroid/media/session/ISessionCallback$Stub;
-Landroid/media/session/ISessionCallback;
-Landroid/media/session/ISessionController$Stub$Proxy;
-Landroid/media/session/ISessionController$Stub;
-Landroid/media/session/ISessionController;
-Landroid/media/session/ISessionControllerCallback$Stub$Proxy;
-Landroid/media/session/ISessionControllerCallback$Stub;
-Landroid/media/session/ISessionControllerCallback;
-Landroid/media/session/ISessionManager$Stub$Proxy;
-Landroid/media/session/ISessionManager$Stub;
-Landroid/media/session/ISessionManager;
-Landroid/media/session/MediaController$Callback;
-Landroid/media/session/MediaController$CallbackStub;
-Landroid/media/session/MediaController$MessageHandler;
-Landroid/media/session/MediaController$PlaybackInfo$1;
-Landroid/media/session/MediaController$PlaybackInfo;
-Landroid/media/session/MediaController$TransportControls-IA;
-Landroid/media/session/MediaController$TransportControls;
-Landroid/media/session/MediaController;
-Landroid/media/session/MediaSession$Callback;
-Landroid/media/session/MediaSession$CallbackMessageHandler;
-Landroid/media/session/MediaSession$CallbackStub;
-Landroid/media/session/MediaSession$QueueItem$1;
-Landroid/media/session/MediaSession$QueueItem;
-Landroid/media/session/MediaSession$Token$1;
-Landroid/media/session/MediaSession$Token;
-Landroid/media/session/MediaSession;
-Landroid/media/session/MediaSessionLegacyHelper;
-Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener;
-Landroid/media/session/MediaSessionManager$OnMediaKeyEventDispatchedListener;
-Landroid/media/session/MediaSessionManager$OnMediaKeyEventDispatchedListenerStub-IA;
-Landroid/media/session/MediaSessionManager$OnMediaKeyEventDispatchedListenerStub;
-Landroid/media/session/MediaSessionManager$OnMediaKeyEventSessionChangedListener;
-Landroid/media/session/MediaSessionManager$OnMediaKeyEventSessionChangedListenerStub-IA;
-Landroid/media/session/MediaSessionManager$OnMediaKeyEventSessionChangedListenerStub;
-Landroid/media/session/MediaSessionManager$OnMediaKeyListener;
-Landroid/media/session/MediaSessionManager$OnMediaKeyListenerImpl;
-Landroid/media/session/MediaSessionManager$OnSession2TokensChangedListener;
-Landroid/media/session/MediaSessionManager$OnVolumeKeyLongPressListener;
-Landroid/media/session/MediaSessionManager$OnVolumeKeyLongPressListenerImpl;
-Landroid/media/session/MediaSessionManager$RemoteSessionCallbackStub-IA;
-Landroid/media/session/MediaSessionManager$RemoteSessionCallbackStub;
-Landroid/media/session/MediaSessionManager$RemoteUserInfo;
-Landroid/media/session/MediaSessionManager$Session2TokensChangedWrapper;
-Landroid/media/session/MediaSessionManager$SessionsChangedWrapper$1$$ExternalSyntheticLambda0;
-Landroid/media/session/MediaSessionManager$SessionsChangedWrapper$1;
-Landroid/media/session/MediaSessionManager$SessionsChangedWrapper;
-Landroid/media/session/MediaSessionManager;
-Landroid/media/session/ParcelableListBinder;
-Landroid/media/session/PlaybackState$1;
-Landroid/media/session/PlaybackState$Builder;
-Landroid/media/session/PlaybackState$CustomAction$1;
-Landroid/media/session/PlaybackState$CustomAction-IA;
-Landroid/media/session/PlaybackState$CustomAction;
-Landroid/media/session/PlaybackState-IA;
-Landroid/media/session/PlaybackState;
-Landroid/media/soundtrigger/ISoundTriggerDetectionServiceClient$Stub;
-Landroid/media/soundtrigger/ISoundTriggerDetectionServiceClient;
-Landroid/media/soundtrigger/SoundTriggerManager;
-Landroid/media/soundtrigger_middleware/ISoundTriggerCallback$Stub$Proxy;
-Landroid/media/soundtrigger_middleware/ISoundTriggerCallback$Stub;
-Landroid/media/soundtrigger_middleware/ISoundTriggerCallback;
-Landroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService$Stub$Proxy;
-Landroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService$Stub;
-Landroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService;
-Landroid/media/soundtrigger_middleware/ISoundTriggerModule$Stub;
-Landroid/media/soundtrigger_middleware/ISoundTriggerModule;
-Landroid/media/soundtrigger_middleware/SoundTriggerModuleDescriptor$1;
-Landroid/media/soundtrigger_middleware/SoundTriggerModuleDescriptor;
-Landroid/media/tv/TvInputHardwareInfo$Builder;
-Landroid/media/tv/TvInputManager;
-Landroid/media/tv/TvStreamConfig$1;
-Landroid/media/tv/TvStreamConfig$Builder;
-Landroid/media/tv/TvStreamConfig;
-Landroid/media/tv/ad/TvAdManager;
-Landroid/media/tv/interactive/TvInteractiveAppManager;
-Landroid/media/tv/tuner/filter/FilterEvent;
-Landroid/media/tv/tuner/filter/RestartEvent;
-Landroid/media/tv/tunerresourcemanager/TunerResourceManager;
-Landroid/metrics/LogMaker;
-Landroid/metrics/MetricsReader$Event;
-Landroid/metrics/MetricsReader$LogReader;
-Landroid/metrics/MetricsReader;
-Landroid/mtp/MtpDatabase$1;
-Landroid/mtp/MtpDatabase$2;
-Landroid/mtp/MtpDatabase;
-Landroid/mtp/MtpDevice;
-Landroid/mtp/MtpDeviceInfo;
-Landroid/mtp/MtpEvent;
-Landroid/mtp/MtpObjectInfo;
-Landroid/mtp/MtpPropertyGroup;
-Landroid/mtp/MtpPropertyList;
-Landroid/mtp/MtpServer;
-Landroid/mtp/MtpStorage;
-Landroid/mtp/MtpStorageInfo;
-Landroid/mtp/MtpStorageManager$MtpNotifier;
-Landroid/mtp/MtpStorageManager$MtpObject;
-Landroid/mtp/MtpStorageManager;
-Landroid/multiuser/FeatureFlags;
-Landroid/multiuser/FeatureFlagsImpl;
-Landroid/multiuser/Flags;
-Landroid/net/ConnectivityMetricsEvent$1;
-Landroid/net/ConnectivityMetricsEvent;
-Landroid/net/Credentials;
-Landroid/net/EventLogTags;
-Landroid/net/IIpConnectivityMetrics$Stub$Proxy;
-Landroid/net/IIpConnectivityMetrics$Stub;
-Landroid/net/IIpConnectivityMetrics;
-Landroid/net/INetdEventCallback$Stub$Proxy;
-Landroid/net/INetdEventCallback$Stub;
-Landroid/net/INetdEventCallback;
-Landroid/net/INetworkManagementEventObserver$Stub$Proxy;
-Landroid/net/INetworkManagementEventObserver$Stub;
-Landroid/net/INetworkManagementEventObserver;
-Landroid/net/INetworkPolicyListener$Stub;
-Landroid/net/INetworkPolicyListener;
-Landroid/net/INetworkPolicyManager$Stub$Proxy;
-Landroid/net/INetworkPolicyManager$Stub;
-Landroid/net/INetworkPolicyManager;
-Landroid/net/INetworkRecommendationProvider$Stub$Proxy;
-Landroid/net/INetworkRecommendationProvider$Stub;
-Landroid/net/INetworkRecommendationProvider;
-Landroid/net/INetworkScoreCache$Stub$Proxy;
-Landroid/net/INetworkScoreCache$Stub;
-Landroid/net/INetworkScoreCache;
-Landroid/net/INetworkScoreService$Stub$Proxy;
-Landroid/net/INetworkScoreService$Stub;
-Landroid/net/INetworkScoreService;
-Landroid/net/IVpnManager$Stub$Proxy;
-Landroid/net/IVpnManager$Stub;
-Landroid/net/IVpnManager;
-Landroid/net/InterfaceConfiguration$1;
-Landroid/net/InterfaceConfiguration;
-Landroid/net/LocalServerSocket;
-Landroid/net/LocalSocket;
-Landroid/net/LocalSocketAddress$Namespace;
-Landroid/net/LocalSocketAddress;
-Landroid/net/LocalSocketImpl$SocketInputStream;
-Landroid/net/LocalSocketImpl;
-Landroid/net/MatchAllNetworkSpecifier$1;
-Landroid/net/MatchAllNetworkSpecifier;
-Landroid/net/NetworkKey$1;
-Landroid/net/NetworkKey-IA;
-Landroid/net/NetworkKey;
-Landroid/net/NetworkPolicy$1;
-Landroid/net/NetworkPolicy;
-Landroid/net/NetworkPolicyManager$1;
-Landroid/net/NetworkPolicyManager$Listener;
-Landroid/net/NetworkPolicyManager$SubscriptionCallback;
-Landroid/net/NetworkPolicyManager$SubscriptionCallbackProxy;
-Landroid/net/NetworkPolicyManager;
-Landroid/net/NetworkQuotaInfo$1;
-Landroid/net/NetworkQuotaInfo;
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper$1;
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper;
-Landroid/net/NetworkRecommendationProvider;
-Landroid/net/NetworkScoreManager$NetworkScoreCallback;
-Landroid/net/NetworkScoreManager$NetworkScoreCallbackProxy;
-Landroid/net/NetworkScoreManager;
-Landroid/net/NetworkScorerAppData$1;
-Landroid/net/NetworkScorerAppData;
-Landroid/net/NetworkSpecifier;
-Landroid/net/NetworkStack;
-Landroid/net/NetworkWatchlistManager;
-Landroid/net/PacProxyManager;
-Landroid/net/PacProxySelector;
-Landroid/net/PrivateDnsConnectivityChecker;
-Landroid/net/Proxy;
-Landroid/net/RssiCurve$1;
-Landroid/net/RssiCurve;
-Landroid/net/SSLCertificateSocketFactory$1;
-Landroid/net/SSLCertificateSocketFactory;
-Landroid/net/SSLSessionCache;
-Landroid/net/ScoredNetwork$1;
-Landroid/net/ScoredNetwork;
-Landroid/net/SntpClient$InvalidServerReplyException;
-Landroid/net/SntpClient;
-Landroid/net/StringNetworkSpecifier$1;
-Landroid/net/StringNetworkSpecifier;
-Landroid/net/TelephonyNetworkSpecifier$1;
-Landroid/net/TelephonyNetworkSpecifier$Builder;
-Landroid/net/TelephonyNetworkSpecifier;
-Landroid/net/Uri$1;
-Landroid/net/Uri$AbstractHierarchicalUri-IA;
-Landroid/net/Uri$AbstractHierarchicalUri;
-Landroid/net/Uri$AbstractPart;
-Landroid/net/Uri$Builder;
-Landroid/net/Uri$HierarchicalUri-IA;
-Landroid/net/Uri$NotCachedHolder;
-Landroid/net/Uri$OpaqueUri-IA;
-Landroid/net/Uri$Part$EmptyPart;
-Landroid/net/Uri$Part;
-Landroid/net/Uri$PathPart;
-Landroid/net/Uri$PathSegmentsBuilder;
-Landroid/net/Uri$StringUri-IA;
-Landroid/net/Uri-IA;
-Landroid/net/Uri;
-Landroid/net/UriCodec;
-Landroid/net/VpnManager;
-Landroid/net/WebAddress;
-Landroid/net/WifiKey$1;
-Landroid/net/WifiKey-IA;
-Landroid/net/WifiKey;
-Landroid/net/http/HttpResponseCache;
-Landroid/net/http/SslCertificate;
-Landroid/net/http/X509TrustManagerExtensions;
-Landroid/net/metrics/ApfProgramEvent$1;
-Landroid/net/metrics/ApfProgramEvent$Decoder;
-Landroid/net/metrics/ApfProgramEvent;
-Landroid/net/metrics/ApfStats$1;
-Landroid/net/metrics/ApfStats;
-Landroid/net/metrics/ConnectStats;
-Landroid/net/metrics/DefaultNetworkEvent;
-Landroid/net/metrics/DhcpClientEvent$1;
-Landroid/net/metrics/DhcpClientEvent;
-Landroid/net/metrics/DhcpErrorEvent$1;
-Landroid/net/metrics/DhcpErrorEvent$Decoder;
-Landroid/net/metrics/DhcpErrorEvent;
-Landroid/net/metrics/DnsEvent;
-Landroid/net/metrics/IpConnectivityLog$Event;
-Landroid/net/metrics/IpConnectivityLog;
-Landroid/net/metrics/IpManagerEvent$1;
-Landroid/net/metrics/IpManagerEvent$Decoder;
-Landroid/net/metrics/IpManagerEvent;
-Landroid/net/metrics/IpReachabilityEvent$1;
-Landroid/net/metrics/IpReachabilityEvent$Decoder;
-Landroid/net/metrics/IpReachabilityEvent;
-Landroid/net/metrics/NetworkEvent$1;
-Landroid/net/metrics/NetworkEvent$Decoder;
-Landroid/net/metrics/NetworkEvent;
-Landroid/net/metrics/NetworkMetrics$Metrics;
-Landroid/net/metrics/NetworkMetrics$Summary;
-Landroid/net/metrics/NetworkMetrics;
-Landroid/net/metrics/RaEvent$1;
-Landroid/net/metrics/RaEvent;
-Landroid/net/metrics/ValidationProbeEvent$1;
-Landroid/net/metrics/ValidationProbeEvent$Decoder;
-Landroid/net/metrics/ValidationProbeEvent;
-Landroid/net/metrics/WakeupEvent;
-Landroid/net/metrics/WakeupStats;
-Landroid/net/rtp/AudioCodec;
-Landroid/net/rtp/AudioGroup;
-Landroid/net/rtp/AudioStream;
-Landroid/net/rtp/RtpStream;
-Landroid/net/sip/ISipService$Default;
-Landroid/net/sip/ISipService$Stub$Proxy;
-Landroid/net/sip/ISipService$Stub;
-Landroid/net/sip/ISipService;
-Landroid/net/sip/ISipSession$Default;
-Landroid/net/sip/ISipSession$Stub$Proxy;
-Landroid/net/sip/ISipSession$Stub;
-Landroid/net/sip/ISipSession;
-Landroid/net/sip/ISipSessionListener$Default;
-Landroid/net/sip/ISipSessionListener$Stub$Proxy;
-Landroid/net/sip/ISipSessionListener$Stub;
-Landroid/net/sip/ISipSessionListener;
-Landroid/net/sip/SimpleSessionDescription$Fields;
-Landroid/net/sip/SimpleSessionDescription$Media;
-Landroid/net/sip/SimpleSessionDescription;
-Landroid/net/sip/SipAudioCall$1;
-Landroid/net/sip/SipAudioCall$Listener;
-Landroid/net/sip/SipAudioCall;
-Landroid/net/sip/SipErrorCode;
-Landroid/net/sip/SipException;
-Landroid/net/sip/SipManager$ListenerRelay;
-Landroid/net/sip/SipManager;
-Landroid/net/sip/SipProfile$1;
-Landroid/net/sip/SipProfile$Builder;
-Landroid/net/sip/SipProfile;
-Landroid/net/sip/SipRegistrationListener;
-Landroid/net/sip/SipSession$1;
-Landroid/net/sip/SipSession$Listener;
-Landroid/net/sip/SipSession$State;
-Landroid/net/sip/SipSession;
-Landroid/net/sip/SipSessionAdapter;
-Landroid/net/util/SocketUtils;
-Landroid/net/vcn/VcnManager$VcnNetworkPolicyChangeListener;
-Landroid/net/vcn/VcnManager$VcnUnderlyingNetworkPolicyListener;
-Landroid/net/vcn/VcnManager;
-Landroid/net/vcn/VcnNetworkPolicyResult$1;
-Landroid/net/vcn/VcnNetworkPolicyResult;
-Landroid/net/vcn/VcnTransportInfo$1;
-Landroid/net/vcn/VcnTransportInfo-IA;
-Landroid/net/vcn/VcnTransportInfo;
-Landroid/net/vcn/VcnUnderlyingNetworkPolicy$1;
-Landroid/net/vcn/VcnUnderlyingNetworkPolicy;
-Landroid/net/wifi/SoftApConfToXmlMigrationUtil;
-Landroid/net/wifi/WifiMigration$1;
-Landroid/net/wifi/WifiMigration;
-Landroid/net/wifi/WifiNetworkScoreCache$CacheListener$1;
-Landroid/net/wifi/WifiNetworkScoreCache$CacheListener;
-Landroid/net/wifi/WifiNetworkScoreCache;
-Landroid/net/wifi/nl80211/ChannelSettings$1;
-Landroid/net/wifi/nl80211/ChannelSettings;
-Landroid/net/wifi/nl80211/DeviceWiphyCapabilities$1;
-Landroid/net/wifi/nl80211/DeviceWiphyCapabilities;
-Landroid/net/wifi/nl80211/HiddenNetwork$1;
-Landroid/net/wifi/nl80211/HiddenNetwork;
-Landroid/net/wifi/nl80211/IClientInterface$Stub$Proxy;
-Landroid/net/wifi/nl80211/IClientInterface$Stub;
-Landroid/net/wifi/nl80211/IClientInterface;
-Landroid/net/wifi/nl80211/IPnoScanEvent$Stub;
-Landroid/net/wifi/nl80211/IPnoScanEvent;
-Landroid/net/wifi/nl80211/IScanEvent$Stub;
-Landroid/net/wifi/nl80211/IScanEvent;
-Landroid/net/wifi/nl80211/IWifiScannerImpl$Stub$Proxy;
-Landroid/net/wifi/nl80211/IWifiScannerImpl$Stub;
-Landroid/net/wifi/nl80211/IWifiScannerImpl;
-Landroid/net/wifi/nl80211/IWificond$Stub$Proxy;
-Landroid/net/wifi/nl80211/IWificond$Stub;
-Landroid/net/wifi/nl80211/IWificond;
-Landroid/net/wifi/nl80211/NativeScanResult$1;
-Landroid/net/wifi/nl80211/NativeScanResult;
-Landroid/net/wifi/nl80211/RadioChainInfo$1;
-Landroid/net/wifi/nl80211/RadioChainInfo;
-Landroid/net/wifi/nl80211/SingleScanSettings$1;
-Landroid/net/wifi/nl80211/SingleScanSettings;
-Landroid/net/wifi/nl80211/WifiNl80211Manager$PnoScanEventHandler;
-Landroid/net/wifi/nl80211/WifiNl80211Manager$ScanEventCallback;
-Landroid/net/wifi/nl80211/WifiNl80211Manager$ScanEventHandler;
-Landroid/net/wifi/nl80211/WifiNl80211Manager$SignalPollResult;
-Landroid/net/wifi/nl80211/WifiNl80211Manager;
-Landroid/net/wifi/sharedconnectivity/app/SharedConnectivityManager;
-Landroid/nfc/NfcFrameworkInitializer$$ExternalSyntheticLambda0;
-Landroid/nfc/NfcFrameworkInitializer;
-Landroid/nfc/NfcManager;
-Landroid/nfc/NfcServiceManager$ServiceRegisterer;
-Landroid/nfc/NfcServiceManager;
-Landroid/nfc/cardemulation/AidGroup$1;
-Landroid/nfc/cardemulation/AidGroup;
-Landroid/nfc/cardemulation/ApduServiceInfo$1;
-Landroid/nfc/cardemulation/ApduServiceInfo;
-Landroid/opengl/EGL14;
-Landroid/opengl/EGL15;
-Landroid/opengl/EGLConfig;
-Landroid/opengl/EGLContext;
-Landroid/opengl/EGLDisplay;
-Landroid/opengl/EGLExt;
-Landroid/opengl/EGLImage;
-Landroid/opengl/EGLLogWrapper;
-Landroid/opengl/EGLObjectHandle;
-Landroid/opengl/EGLSurface;
-Landroid/opengl/EGLSync;
-Landroid/opengl/ETC1;
-Landroid/opengl/GLES10;
-Landroid/opengl/GLES10Ext;
-Landroid/opengl/GLES11;
-Landroid/opengl/GLES11Ext;
-Landroid/opengl/GLES20;
-Landroid/opengl/GLES30;
-Landroid/opengl/GLES31;
-Landroid/opengl/GLES31Ext;
-Landroid/opengl/GLES32;
-Landroid/opengl/GLException;
-Landroid/opengl/GLSurfaceView$BaseConfigChooser;
-Landroid/opengl/GLSurfaceView$ComponentSizeChooser;
-Landroid/opengl/GLSurfaceView$DefaultContextFactory;
-Landroid/opengl/GLSurfaceView$DefaultWindowSurfaceFactory;
-Landroid/opengl/GLSurfaceView$EGLConfigChooser;
-Landroid/opengl/GLSurfaceView$EGLContextFactory;
-Landroid/opengl/GLSurfaceView$EGLWindowSurfaceFactory;
-Landroid/opengl/GLSurfaceView$EglHelper;
-Landroid/opengl/GLSurfaceView$GLThread;
-Landroid/opengl/GLSurfaceView$GLThreadManager;
-Landroid/opengl/GLSurfaceView$Renderer;
-Landroid/opengl/GLSurfaceView$SimpleEGLConfigChooser;
-Landroid/opengl/GLSurfaceView;
-Landroid/opengl/GLUtils;
-Landroid/opengl/Matrix$1;
-Landroid/opengl/Matrix;
-Landroid/opengl/Visibility;
-Landroid/os/AppZygote;
-Landroid/os/AsyncResult;
-Landroid/os/AsyncTask$1;
-Landroid/os/AsyncTask$2;
-Landroid/os/AsyncTask$3;
-Landroid/os/AsyncTask$4;
-Landroid/os/AsyncTask$AsyncTaskResult;
-Landroid/os/AsyncTask$InternalHandler;
-Landroid/os/AsyncTask$SerialExecutor$1;
-Landroid/os/AsyncTask$SerialExecutor;
-Landroid/os/AsyncTask$Status;
-Landroid/os/AsyncTask$WorkerRunnable-IA;
-Landroid/os/AsyncTask$WorkerRunnable;
-Landroid/os/AsyncTask;
-Landroid/os/BadParcelableException;
-Landroid/os/BadTypeParcelableException;
-Landroid/os/BaseBundle$NoImagePreloadHolder;
-Landroid/os/BaseBundle;
-Landroid/os/BatteryConsumer$Dimensions;
-Landroid/os/BatteryConsumer$Key;
-Landroid/os/BatteryConsumer;
-Landroid/os/BatteryManager;
-Landroid/os/BatteryManagerInternal;
-Landroid/os/BatteryProperty$1;
-Landroid/os/BatteryProperty;
-Landroid/os/BatterySaverPolicyConfig$1;
-Landroid/os/BatterySaverPolicyConfig;
-Landroid/os/BatteryStats$$ExternalSyntheticLambda0;
-Landroid/os/BatteryStats$$ExternalSyntheticLambda1;
-Landroid/os/BatteryStats$1;
-Landroid/os/BatteryStats$BitDescription;
-Landroid/os/BatteryStats$ControllerActivityCounter;
-Landroid/os/BatteryStats$Counter;
-Landroid/os/BatteryStats$DailyItem;
-Landroid/os/BatteryStats$HistoryEventTracker;
-Landroid/os/BatteryStats$HistoryItem;
-Landroid/os/BatteryStats$HistoryPrinter;
-Landroid/os/BatteryStats$HistoryStepDetails;
-Landroid/os/BatteryStats$HistoryTag;
-Landroid/os/BatteryStats$IntToString;
-Landroid/os/BatteryStats$LevelStepTracker;
-Landroid/os/BatteryStats$LongCounter;
-Landroid/os/BatteryStats$LongCounterArray;
-Landroid/os/BatteryStats$PackageChange;
-Landroid/os/BatteryStats$Timer;
-Landroid/os/BatteryStats$TimerEntry;
-Landroid/os/BatteryStats$Uid$Pid;
-Landroid/os/BatteryStats$Uid$Pkg$Serv;
-Landroid/os/BatteryStats$Uid$Pkg;
-Landroid/os/BatteryStats$Uid$Proc$ExcessivePower;
-Landroid/os/BatteryStats$Uid$Proc;
-Landroid/os/BatteryStats$Uid$Sensor;
-Landroid/os/BatteryStats$Uid$Wakelock;
-Landroid/os/BatteryStats$Uid;
-Landroid/os/BatteryStats;
-Landroid/os/BatteryStatsManager;
-Landroid/os/BatteryUsageStats$1;
-Landroid/os/BatteryUsageStats;
-Landroid/os/BatteryUsageStatsQuery$1;
-Landroid/os/BatteryUsageStatsQuery$Builder;
-Landroid/os/BatteryUsageStatsQuery;
-Landroid/os/BestClock;
-Landroid/os/Binder$$ExternalSyntheticLambda0;
-Landroid/os/Binder$$ExternalSyntheticLambda1;
-Landroid/os/Binder$NoImagePreloadHolder;
-Landroid/os/Binder$PropagateWorkSourceTransactListener;
-Landroid/os/Binder$ProxyTransactListener;
-Landroid/os/Binder;
-Landroid/os/BinderProxy$BinderProxyMapSizeException;
-Landroid/os/BinderProxy$NoImagePreloadHolder;
-Landroid/os/BinderProxy$ProxyMap;
-Landroid/os/BluetoothServiceManager$ServiceRegisterer;
-Landroid/os/BluetoothServiceManager;
-Landroid/os/BugreportManager;
-Landroid/os/Build$$ExternalSyntheticLambda0;
-Landroid/os/Build$VERSION;
-Landroid/os/Build;
-Landroid/os/Bundle$1;
-Landroid/os/Bundle;
-Landroid/os/CancellationSignal$OnCancelListener;
-Landroid/os/CancellationSignal$Transport-IA;
-Landroid/os/CancellationSignal$Transport;
-Landroid/os/CancellationSignal;
-Landroid/os/CarrierAssociatedAppEntry$1;
-Landroid/os/CarrierAssociatedAppEntry;
-Landroid/os/ChildZygoteProcess;
-Landroid/os/CombinedVibration$1;
-Landroid/os/CombinedVibration$Mono$1;
-Landroid/os/CombinedVibration$Mono;
-Landroid/os/CombinedVibration;
-Landroid/os/ConditionVariable;
-Landroid/os/CoolingDevice$1;
-Landroid/os/CoolingDevice;
-Landroid/os/CountDownTimer$1;
-Landroid/os/CountDownTimer;
-Landroid/os/CpuUsageInfo$1;
-Landroid/os/CpuUsageInfo;
-Landroid/os/CreateAppDataArgs$1;
-Landroid/os/CreateAppDataArgs;
-Landroid/os/CreateAppDataResult$1;
-Landroid/os/CreateAppDataResult;
-Landroid/os/DdmSyncStageUpdater;
-Landroid/os/DdmSyncState$Stage;
-Landroid/os/DdmSyncState;
-Landroid/os/DeadObjectException;
-Landroid/os/DeadSystemException;
-Landroid/os/Debug$MemoryInfo$1;
-Landroid/os/Debug$MemoryInfo-IA;
-Landroid/os/Debug$MemoryInfo;
-Landroid/os/Debug;
-Landroid/os/DeviceIdleManager;
-Landroid/os/DropBoxManager$Entry$1;
-Landroid/os/DropBoxManager$Entry;
-Landroid/os/DropBoxManager;
-Landroid/os/Environment$UserEnvironment;
-Landroid/os/Environment;
-Landroid/os/EventLogTags;
-Landroid/os/ExternalVibration$1;
-Landroid/os/ExternalVibration;
-Landroid/os/FabricatedOverlayInfo$1;
-Landroid/os/FabricatedOverlayInfo;
-Landroid/os/FabricatedOverlayInternal$1;
-Landroid/os/FabricatedOverlayInternal;
-Landroid/os/FabricatedOverlayInternalEntry$1;
-Landroid/os/FabricatedOverlayInternalEntry;
-Landroid/os/FactoryTest;
-Landroid/os/FileBridge$FileBridgeOutputStream;
-Landroid/os/FileBridge;
-Landroid/os/FileObserver$ObserverThread;
-Landroid/os/FileObserver;
-Landroid/os/FileUtils$$ExternalSyntheticLambda0;
-Landroid/os/FileUtils$$ExternalSyntheticLambda1;
-Landroid/os/FileUtils$$ExternalSyntheticLambda2;
-Landroid/os/FileUtils$$ExternalSyntheticLambda3;
-Landroid/os/FileUtils$$ExternalSyntheticLambda4;
-Landroid/os/FileUtils$$ExternalSyntheticLambda5;
-Landroid/os/FileUtils$1;
-Landroid/os/FileUtils$ProgressListener;
-Landroid/os/FileUtils;
-Landroid/os/GraphicsEnvironment$1;
-Landroid/os/GraphicsEnvironment;
-Landroid/os/Handler$BlockingRunnable;
-Landroid/os/Handler$Callback;
-Landroid/os/Handler$MessengerImpl-IA;
-Landroid/os/Handler$MessengerImpl;
-Landroid/os/Handler;
-Landroid/os/HandlerExecutor;
-Landroid/os/HandlerThread;
-Landroid/os/HardwarePropertiesManager;
-Landroid/os/HidlMemory;
-Landroid/os/HidlMemoryUtil;
-Landroid/os/HidlSupport$Mutable;
-Landroid/os/HidlSupport;
-Landroid/os/HwBinder;
-Landroid/os/HwBlob;
-Landroid/os/HwNoService;
-Landroid/os/HwParcel;
-Landroid/os/HwRemoteBinder;
-Landroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;
-Landroid/os/IBatteryPropertiesRegistrar$Stub;
-Landroid/os/IBatteryPropertiesRegistrar;
-Landroid/os/IBinder$DeathRecipient;
-Landroid/os/IBinder;
-Landroid/os/IBinderCallback;
-Landroid/os/ICancellationSignal$Stub$Proxy;
-Landroid/os/ICancellationSignal$Stub;
-Landroid/os/ICancellationSignal;
-Landroid/os/IDeviceIdentifiersPolicyService$Stub$Proxy;
-Landroid/os/IDeviceIdentifiersPolicyService$Stub;
-Landroid/os/IDeviceIdentifiersPolicyService;
-Landroid/os/IDeviceIdleController$Stub$Proxy;
-Landroid/os/IDeviceIdleController$Stub;
-Landroid/os/IDeviceIdleController;
-Landroid/os/IDumpstate$Stub$Proxy;
-Landroid/os/IDumpstate$Stub;
-Landroid/os/IDumpstate;
-Landroid/os/IDumpstateListener$Stub$Proxy;
-Landroid/os/IDumpstateListener$Stub;
-Landroid/os/IDumpstateListener;
-Landroid/os/IExternalVibratorService$Stub;
-Landroid/os/IExternalVibratorService;
-Landroid/os/IHardwarePropertiesManager$Stub$Proxy;
-Landroid/os/IHardwarePropertiesManager$Stub;
-Landroid/os/IHardwarePropertiesManager;
-Landroid/os/IHintManager$Stub$Proxy;
-Landroid/os/IHintManager$Stub;
-Landroid/os/IHintManager;
-Landroid/os/IHintSession$Stub$Proxy;
-Landroid/os/IHintSession$Stub;
-Landroid/os/IHintSession;
-Landroid/os/IHwBinder$DeathRecipient;
-Landroid/os/IHwBinder;
-Landroid/os/IHwInterface;
-Landroid/os/IIncidentAuthListener$Stub$Proxy;
-Landroid/os/IIncidentAuthListener$Stub;
-Landroid/os/IIncidentAuthListener;
-Landroid/os/IIncidentCompanion$Stub$Proxy;
-Landroid/os/IIncidentCompanion$Stub;
-Landroid/os/IIncidentCompanion;
-Landroid/os/IIncidentManager$Stub$Proxy;
-Landroid/os/IIncidentManager$Stub;
-Landroid/os/IIncidentManager;
-Landroid/os/IInstalld$Stub$Proxy;
-Landroid/os/IInstalld$Stub;
-Landroid/os/IInstalld;
-Landroid/os/IInterface;
-Landroid/os/IMessenger$Stub$Proxy;
-Landroid/os/IMessenger$Stub;
-Landroid/os/IMessenger;
-Landroid/os/INetworkManagementService$Stub$Proxy;
-Landroid/os/INetworkManagementService$Stub;
-Landroid/os/INetworkManagementService;
-Landroid/os/IPermissionController$Stub;
-Landroid/os/IPermissionController;
-Landroid/os/IPowerManager$LowPowerStandbyPolicy$1;
-Landroid/os/IPowerManager$LowPowerStandbyPolicy;
-Landroid/os/IPowerManager$LowPowerStandbyPortDescription$1;
-Landroid/os/IPowerManager$LowPowerStandbyPortDescription;
-Landroid/os/IPowerManager$Stub$Proxy;
-Landroid/os/IPowerManager$Stub;
-Landroid/os/IPowerManager;
-Landroid/os/IProcessInfoService$Stub;
-Landroid/os/IProcessInfoService;
-Landroid/os/IProgressListener$Stub$Proxy;
-Landroid/os/IProgressListener$Stub;
-Landroid/os/IProgressListener;
-Landroid/os/IRecoverySystem$Stub;
-Landroid/os/IRecoverySystem;
-Landroid/os/IRecoverySystemProgressListener$Stub$Proxy;
-Landroid/os/IRecoverySystemProgressListener$Stub;
-Landroid/os/IRecoverySystemProgressListener;
-Landroid/os/IRemoteCallback$Stub$Proxy;
-Landroid/os/IRemoteCallback$Stub;
-Landroid/os/IRemoteCallback;
-Landroid/os/ISchedulingPolicyService$Stub;
-Landroid/os/ISchedulingPolicyService;
-Landroid/os/IServiceManager$Stub$Proxy;
-Landroid/os/IServiceManager$Stub;
-Landroid/os/IServiceManager;
-Landroid/os/IStoraged$Stub$Proxy;
-Landroid/os/IStoraged$Stub;
-Landroid/os/IStoraged;
-Landroid/os/ISystemConfig$Stub$Proxy;
-Landroid/os/ISystemConfig$Stub;
-Landroid/os/ISystemConfig;
-Landroid/os/ISystemUpdateManager$Stub$Proxy;
-Landroid/os/ISystemUpdateManager$Stub;
-Landroid/os/ISystemUpdateManager;
-Landroid/os/IThermalEventListener$Stub$Proxy;
-Landroid/os/IThermalEventListener$Stub;
-Landroid/os/IThermalEventListener;
-Landroid/os/IThermalService$Stub$Proxy;
-Landroid/os/IThermalService$Stub;
-Landroid/os/IThermalService;
-Landroid/os/IThermalStatusListener$Stub$Proxy;
-Landroid/os/IThermalStatusListener$Stub;
-Landroid/os/IThermalStatusListener;
-Landroid/os/IUpdateEngine$Stub$Proxy;
-Landroid/os/IUpdateEngine$Stub;
-Landroid/os/IUpdateEngine;
-Landroid/os/IUpdateEngineCallback$Stub;
-Landroid/os/IUpdateEngineCallback;
-Landroid/os/IUpdateLock$Stub;
-Landroid/os/IUpdateLock;
-Landroid/os/IUserManager$Stub$Proxy;
-Landroid/os/IUserManager$Stub;
-Landroid/os/IUserManager;
-Landroid/os/IUserRestrictionsListener$Stub$Proxy;
-Landroid/os/IUserRestrictionsListener$Stub;
-Landroid/os/IUserRestrictionsListener;
-Landroid/os/IVibratorManagerService$Stub$Proxy;
-Landroid/os/IVibratorManagerService$Stub;
-Landroid/os/IVibratorManagerService;
-Landroid/os/IVibratorStateListener$Stub$Proxy;
-Landroid/os/IVibratorStateListener$Stub;
-Landroid/os/IVibratorStateListener;
-Landroid/os/IVold$Stub$Proxy;
-Landroid/os/IVold$Stub;
-Landroid/os/IVold;
-Landroid/os/IVoldListener$Stub;
-Landroid/os/IVoldListener;
-Landroid/os/IVoldMountCallback$Stub;
-Landroid/os/IVoldMountCallback;
-Landroid/os/IVoldTaskListener$Stub$Proxy;
-Landroid/os/IVoldTaskListener$Stub;
-Landroid/os/IVoldTaskListener;
-Landroid/os/IWakeLockCallback$Stub$Proxy;
-Landroid/os/IWakeLockCallback$Stub;
-Landroid/os/IWakeLockCallback;
-Landroid/os/IncidentManager$IncidentReport$1;
-Landroid/os/IncidentManager$IncidentReport;
-Landroid/os/IncidentManager;
-Landroid/os/IpcDataCache$Config;
-Landroid/os/IpcDataCache$QueryHandler;
-Landroid/os/IpcDataCache$RemoteCall;
-Landroid/os/IpcDataCache$SystemServerCallHandler;
-Landroid/os/IpcDataCache;
-Landroid/os/LimitExceededException;
-Landroid/os/LocaleList$1;
-Landroid/os/LocaleList;
-Landroid/os/Looper$Observer;
-Landroid/os/Looper;
-Landroid/os/MemoryFile;
-Landroid/os/Message$1;
-Landroid/os/Message;
-Landroid/os/MessageQueue$FileDescriptorRecord;
-Landroid/os/MessageQueue$IdleHandler;
-Landroid/os/MessageQueue$OnFileDescriptorEventListener;
-Landroid/os/MessageQueue;
-Landroid/os/Messenger$1;
-Landroid/os/Messenger;
-Landroid/os/NativeHandle;
-Landroid/os/NetworkOnMainThreadException;
-Landroid/os/NullVibrator;
-Landroid/os/OperationCanceledException;
-Landroid/os/OutcomeReceiver;
-Landroid/os/PackageTagsList$1;
-Landroid/os/PackageTagsList;
-Landroid/os/Parcel$1;
-Landroid/os/Parcel$LazyValue;
-Landroid/os/Parcel$ReadWriteHelper;
-Landroid/os/Parcel$SquashReadHelper;
-Landroid/os/Parcel;
-Landroid/os/ParcelDuration$1;
-Landroid/os/ParcelDuration;
-Landroid/os/ParcelFileDescriptor$1;
-Landroid/os/ParcelFileDescriptor$2;
-Landroid/os/ParcelFileDescriptor$AutoCloseInputStream;
-Landroid/os/ParcelFileDescriptor$AutoCloseOutputStream;
-Landroid/os/ParcelFileDescriptor$OnCloseListener;
-Landroid/os/ParcelFileDescriptor$Status;
-Landroid/os/ParcelFileDescriptor;
-Landroid/os/ParcelFormatException;
-Landroid/os/ParcelUuid$1;
-Landroid/os/ParcelUuid;
-Landroid/os/Parcelable$ClassLoaderCreator;
-Landroid/os/Parcelable$Creator;
-Landroid/os/Parcelable;
-Landroid/os/ParcelableException$1;
-Landroid/os/ParcelableException;
-Landroid/os/ParcelableParcel$1;
-Landroid/os/ParcelableParcel;
-Landroid/os/PatternMatcher$1;
-Landroid/os/PatternMatcher;
-Landroid/os/PerformanceHintManager$Session;
-Landroid/os/PerformanceHintManager;
-Landroid/os/PermissionEnforcer;
-Landroid/os/PersistableBundle$1;
-Landroid/os/PersistableBundle$MyReadMapCallback;
-Landroid/os/PersistableBundle;
-Landroid/os/PooledStringReader;
-Landroid/os/PooledStringWriter;
-Landroid/os/PowerExemptionManager;
-Landroid/os/PowerManager$1;
-Landroid/os/PowerManager$2;
-Landroid/os/PowerManager$3$$ExternalSyntheticLambda0;
-Landroid/os/PowerManager$3;
-Landroid/os/PowerManager$OnThermalStatusChangedListener;
-Landroid/os/PowerManager$WakeData;
-Landroid/os/PowerManager$WakeLock$$ExternalSyntheticLambda0;
-Landroid/os/PowerManager$WakeLock;
-Landroid/os/PowerManager;
-Landroid/os/PowerManagerInternal$1;
-Landroid/os/PowerManagerInternal$LowPowerModeListener;
-Landroid/os/PowerManagerInternal;
-Landroid/os/PowerSaveState$1;
-Landroid/os/PowerSaveState$Builder;
-Landroid/os/PowerSaveState;
-Landroid/os/PowerWhitelistManager;
-Landroid/os/Process$ProcessStartResult;
-Landroid/os/Process;
-Landroid/os/ProfilingServiceManager;
-Landroid/os/ProxyFileDescriptorCallback;
-Landroid/os/RecoverySystem$1;
-Landroid/os/RecoverySystem$2;
-Landroid/os/RecoverySystem$3;
-Landroid/os/RecoverySystem$4;
-Landroid/os/RecoverySystem$5;
-Landroid/os/RecoverySystem$ProgressListener;
-Landroid/os/RecoverySystem;
-Landroid/os/Registrant;
-Landroid/os/RegistrantList;
-Landroid/os/RemoteCallback$1;
-Landroid/os/RemoteCallback$2;
-Landroid/os/RemoteCallback$3;
-Landroid/os/RemoteCallback$OnResultListener;
-Landroid/os/RemoteCallback;
-Landroid/os/RemoteCallbackList$Callback;
-Landroid/os/RemoteCallbackList;
-Landroid/os/RemoteException;
-Landroid/os/ResultReceiver$1;
-Landroid/os/ResultReceiver$MyResultReceiver;
-Landroid/os/ResultReceiver$MyRunnable;
-Landroid/os/ResultReceiver;
-Landroid/os/SELinux;
-Landroid/os/SecurityStateManager;
-Landroid/os/ServiceManager$ServiceNotFoundException;
-Landroid/os/ServiceManager;
-Landroid/os/ServiceManagerNative;
-Landroid/os/ServiceManagerProxy;
-Landroid/os/ServiceSpecificException;
-Landroid/os/SharedMemory$1;
-Landroid/os/SharedMemory$Closer-IA;
-Landroid/os/SharedMemory$Closer;
-Landroid/os/SharedMemory$MemoryRegistration-IA;
-Landroid/os/SharedMemory$MemoryRegistration;
-Landroid/os/SharedMemory$Unmapper-IA;
-Landroid/os/SharedMemory$Unmapper;
-Landroid/os/SharedMemory-IA;
-Landroid/os/SharedMemory;
-Landroid/os/ShellCallback$1;
-Landroid/os/ShellCallback;
-Landroid/os/ShellCommand;
-Landroid/os/SimpleClock;
-Landroid/os/StatFs;
-Landroid/os/StatsServiceManager$ServiceRegisterer;
-Landroid/os/StatsServiceManager;
-Landroid/os/StrictMode$$ExternalSyntheticLambda0;
-Landroid/os/StrictMode$$ExternalSyntheticLambda1;
-Landroid/os/StrictMode$$ExternalSyntheticLambda2;
-Landroid/os/StrictMode$$ExternalSyntheticLambda3;
-Landroid/os/StrictMode$1;
-Landroid/os/StrictMode$2;
-Landroid/os/StrictMode$3;
-Landroid/os/StrictMode$4;
-Landroid/os/StrictMode$5;
-Landroid/os/StrictMode$6;
-Landroid/os/StrictMode$7;
-Landroid/os/StrictMode$8;
-Landroid/os/StrictMode$9;
-Landroid/os/StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda0;
-Landroid/os/StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda1;
-Landroid/os/StrictMode$AndroidBlockGuardPolicy;
-Landroid/os/StrictMode$AndroidCloseGuardReporter-IA;
-Landroid/os/StrictMode$AndroidCloseGuardReporter;
-Landroid/os/StrictMode$InstanceTracker;
-Landroid/os/StrictMode$OnThreadViolationListener;
-Landroid/os/StrictMode$OnVmViolationListener;
-Landroid/os/StrictMode$Span;
-Landroid/os/StrictMode$ThreadPolicy$Builder;
-Landroid/os/StrictMode$ThreadPolicy-IA;
-Landroid/os/StrictMode$ThreadPolicy;
-Landroid/os/StrictMode$ThreadSpanState-IA;
-Landroid/os/StrictMode$ThreadSpanState;
-Landroid/os/StrictMode$UnsafeIntentStrictModeCallback-IA;
-Landroid/os/StrictMode$UnsafeIntentStrictModeCallback;
-Landroid/os/StrictMode$ViolationInfo$1;
-Landroid/os/StrictMode$ViolationInfo;
-Landroid/os/StrictMode$ViolationLogger;
-Landroid/os/StrictMode$VmPolicy$Builder;
-Landroid/os/StrictMode$VmPolicy-IA;
-Landroid/os/StrictMode$VmPolicy;
-Landroid/os/StrictMode;
-Landroid/os/SynchronousResultReceiver$Result;
-Landroid/os/SynchronousResultReceiver;
-Landroid/os/SystemClock$2;
-Landroid/os/SystemClock$3;
-Landroid/os/SystemClock;
-Landroid/os/SystemConfigManager;
-Landroid/os/SystemProperties$Handle-IA;
-Landroid/os/SystemProperties$Handle;
-Landroid/os/SystemProperties;
-Landroid/os/SystemService$1;
-Landroid/os/SystemService$State;
-Landroid/os/SystemService;
-Landroid/os/SystemUpdateManager;
-Landroid/os/SystemVibrator;
-Landroid/os/SystemVibratorManager$SingleVibrator;
-Landroid/os/SystemVibratorManager;
-Landroid/os/TelephonyServiceManager$ServiceRegisterer;
-Landroid/os/TelephonyServiceManager;
-Landroid/os/Temperature$1;
-Landroid/os/Temperature;
-Landroid/os/ThreadLocalWorkSource$$ExternalSyntheticLambda0;
-Landroid/os/ThreadLocalWorkSource;
-Landroid/os/TimestampedValue$1;
-Landroid/os/TimestampedValue;
-Landroid/os/TokenWatcher$1;
-Landroid/os/TokenWatcher$Death;
-Landroid/os/TokenWatcher;
-Landroid/os/Trace;
-Landroid/os/TraceNameSupplier;
-Landroid/os/TransactionTooLargeException;
-Landroid/os/TransactionTracker;
-Landroid/os/UEventObserver$UEvent;
-Landroid/os/UEventObserver$UEventThread;
-Landroid/os/UEventObserver;
-Landroid/os/UidBatteryConsumer;
-Landroid/os/UpdateEngine$1$1;
-Landroid/os/UpdateEngine$1;
-Landroid/os/UpdateEngine;
-Landroid/os/UpdateEngineCallback;
-Landroid/os/UpdateLock;
-Landroid/os/UserHandle$1;
-Landroid/os/UserHandle;
-Landroid/os/UserManager$1;
-Landroid/os/UserManager$2;
-Landroid/os/UserManager$3;
-Landroid/os/UserManager$4;
-Landroid/os/UserManager$EnforcingUser$1;
-Landroid/os/UserManager$EnforcingUser;
-Landroid/os/UserManager$UserOperationException;
-Landroid/os/UserManager;
-Landroid/os/VibrationAttributes$1;
-Landroid/os/VibrationAttributes$Builder;
-Landroid/os/VibrationAttributes-IA;
-Landroid/os/VibrationAttributes;
-Landroid/os/VibrationEffect$1;
-Landroid/os/VibrationEffect$Composed$1;
-Landroid/os/VibrationEffect$Composed;
-Landroid/os/VibrationEffect$Composition;
-Landroid/os/VibrationEffect;
-Landroid/os/Vibrator;
-Landroid/os/VibratorInfo$1;
-Landroid/os/VibratorInfo$FrequencyProfile$1;
-Landroid/os/VibratorInfo$FrequencyProfile;
-Landroid/os/VibratorInfo;
-Landroid/os/VibratorManager;
-Landroid/os/VintfObject;
-Landroid/os/VintfRuntimeInfo;
-Landroid/os/WorkSource$1;
-Landroid/os/WorkSource$WorkChain$1;
-Landroid/os/WorkSource$WorkChain;
-Landroid/os/WorkSource;
-Landroid/os/ZygoteProcess$ZygoteState;
-Landroid/os/ZygoteProcess;
-Landroid/os/ZygoteStartFailedEx;
-Landroid/os/connectivity/CellularBatteryStats$1;
-Landroid/os/connectivity/CellularBatteryStats;
-Landroid/os/connectivity/GpsBatteryStats$1;
-Landroid/os/connectivity/GpsBatteryStats;
-Landroid/os/connectivity/WifiActivityEnergyInfo$1;
-Landroid/os/connectivity/WifiActivityEnergyInfo;
-Landroid/os/connectivity/WifiBatteryStats$1;
-Landroid/os/connectivity/WifiBatteryStats;
-Landroid/os/health/HealthKeys$Constant;
-Landroid/os/health/HealthKeys$Constants;
-Landroid/os/health/HealthKeys$SortedIntArray;
-Landroid/os/health/HealthStats;
-Landroid/os/health/HealthStatsParceler$1;
-Landroid/os/health/HealthStatsParceler;
-Landroid/os/health/HealthStatsWriter;
-Landroid/os/health/PackageHealthStats;
-Landroid/os/health/PidHealthStats;
-Landroid/os/health/ProcessHealthStats;
-Landroid/os/health/ServiceHealthStats;
-Landroid/os/health/SystemHealthManager$$ExternalSyntheticLambda1;
-Landroid/os/health/SystemHealthManager;
-Landroid/os/health/TimerStat$1;
-Landroid/os/health/TimerStat;
-Landroid/os/health/UidHealthStats;
-Landroid/os/image/DynamicSystemClient;
-Landroid/os/image/DynamicSystemManager;
-Landroid/os/image/IDynamicSystemService$Stub;
-Landroid/os/image/IDynamicSystemService;
-Landroid/os/incremental/IncrementalManager;
-Landroid/os/incremental/V4Signature$HashingInfo;
-Landroid/os/incremental/V4Signature$SigningInfo;
-Landroid/os/incremental/V4Signature;
-Landroid/os/storage/DiskInfo$1;
-Landroid/os/storage/DiskInfo;
-Landroid/os/storage/IObbActionListener$Stub$Proxy;
-Landroid/os/storage/IObbActionListener$Stub;
-Landroid/os/storage/IObbActionListener;
-Landroid/os/storage/IStorageEventListener$Stub$Proxy;
-Landroid/os/storage/IStorageEventListener$Stub;
-Landroid/os/storage/IStorageEventListener;
-Landroid/os/storage/IStorageManager$Stub$Proxy;
-Landroid/os/storage/IStorageManager$Stub;
-Landroid/os/storage/IStorageManager;
-Landroid/os/storage/IStorageShutdownObserver$Stub$Proxy;
-Landroid/os/storage/IStorageShutdownObserver$Stub;
-Landroid/os/storage/IStorageShutdownObserver;
-Landroid/os/storage/OnObbStateChangeListener;
-Landroid/os/storage/StorageEventListener;
-Landroid/os/storage/StorageManager$1;
-Landroid/os/storage/StorageManager$ObbActionListener-IA;
-Landroid/os/storage/StorageManager$ObbActionListener;
-Landroid/os/storage/StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda2;
-Landroid/os/storage/StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda3;
-Landroid/os/storage/StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda4;
-Landroid/os/storage/StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda5;
-Landroid/os/storage/StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda6;
-Landroid/os/storage/StorageManager$StorageEventListenerDelegate;
-Landroid/os/storage/StorageManager$StorageVolumeCallback;
-Landroid/os/storage/StorageManager;
-Landroid/os/storage/StorageManagerInternal;
-Landroid/os/storage/StorageVolume$1;
-Landroid/os/storage/StorageVolume-IA;
-Landroid/os/storage/StorageVolume;
-Landroid/os/storage/VolumeInfo$1;
-Landroid/os/storage/VolumeInfo$2;
-Landroid/os/storage/VolumeInfo;
-Landroid/os/storage/VolumeRecord$1;
-Landroid/os/storage/VolumeRecord;
-Landroid/os/strictmode/ContentUriWithoutPermissionViolation;
-Landroid/os/strictmode/CredentialProtectedWhileLockedViolation;
-Landroid/os/strictmode/CustomViolation;
-Landroid/os/strictmode/DiskReadViolation;
-Landroid/os/strictmode/DiskWriteViolation;
-Landroid/os/strictmode/ExplicitGcViolation;
-Landroid/os/strictmode/ImplicitDirectBootViolation;
-Landroid/os/strictmode/IncorrectContextUseViolation;
-Landroid/os/strictmode/InstanceCountViolation;
-Landroid/os/strictmode/IntentReceiverLeakedViolation;
-Landroid/os/strictmode/LeakedClosableViolation;
-Landroid/os/strictmode/NetworkViolation;
-Landroid/os/strictmode/ResourceMismatchViolation;
-Landroid/os/strictmode/ServiceConnectionLeakedViolation;
-Landroid/os/strictmode/SqliteObjectLeakedViolation;
-Landroid/os/strictmode/UnbufferedIoViolation;
-Landroid/os/strictmode/UnsafeIntentLaunchViolation;
-Landroid/os/strictmode/UntaggedSocketViolation;
-Landroid/os/strictmode/Violation;
-Landroid/os/strictmode/WebViewMethodCalledOnWrongThreadViolation;
-Landroid/os/vibrator/Flags;
-Landroid/os/vibrator/PrebakedSegment$1;
-Landroid/os/vibrator/PrebakedSegment;
-Landroid/os/vibrator/PrimitiveSegment$1;
-Landroid/os/vibrator/PrimitiveSegment;
-Landroid/os/vibrator/StepSegment$1;
-Landroid/os/vibrator/StepSegment;
-Landroid/os/vibrator/VibrationEffectSegment$1;
-Landroid/os/vibrator/VibrationEffectSegment;
-Landroid/ota/nano/OtaPackageMetadata$ApexInfo;
-Landroid/ota/nano/OtaPackageMetadata$ApexMetadata;
-Landroid/ota/nano/OtaPackageMetadata$DeviceState;
-Landroid/ota/nano/OtaPackageMetadata$PartitionState;
-Landroid/permission/ILegacyPermissionManager$Stub$Proxy;
-Landroid/permission/ILegacyPermissionManager$Stub;
-Landroid/permission/ILegacyPermissionManager;
-Landroid/permission/IOnPermissionsChangeListener$Stub;
-Landroid/permission/IOnPermissionsChangeListener;
-Landroid/permission/IPermissionChecker$Stub$Proxy;
-Landroid/permission/IPermissionChecker$Stub;
-Landroid/permission/IPermissionChecker;
-Landroid/permission/IPermissionController$Stub$Proxy;
-Landroid/permission/IPermissionController$Stub;
-Landroid/permission/IPermissionController;
-Landroid/permission/IPermissionManager$Stub$Proxy;
-Landroid/permission/IPermissionManager$Stub;
-Landroid/permission/IPermissionManager;
-Landroid/permission/LegacyPermissionManager;
-Landroid/permission/PermissionCheckerManager;
-Landroid/permission/PermissionControllerManager$1;
-Landroid/permission/PermissionControllerManager;
-Landroid/permission/PermissionManager$1;
-Landroid/permission/PermissionManager$2;
-Landroid/permission/PermissionManager$PackageNamePermissionQuery;
-Landroid/permission/PermissionManager$PermissionQuery;
-Landroid/permission/PermissionManager$SplitPermissionInfo-IA;
-Landroid/permission/PermissionManager$SplitPermissionInfo;
-Landroid/permission/PermissionManager;
-Landroid/permission/PermissionManagerInternal;
-Landroid/permission/flags/FeatureFlags;
-Landroid/permission/flags/FeatureFlagsImpl;
-Landroid/permission/flags/Flags;
-Landroid/preference/DialogPreference;
-Landroid/preference/GenericInflater$Parent;
-Landroid/preference/GenericInflater;
-Landroid/preference/ListPreference;
-Landroid/preference/Preference$OnPreferenceChangeListener;
-Landroid/preference/Preference;
-Landroid/preference/PreferenceActivity;
-Landroid/preference/PreferenceFragment$OnPreferenceStartFragmentCallback;
-Landroid/preference/PreferenceFragment;
-Landroid/preference/PreferenceGroup;
-Landroid/preference/PreferenceInflater;
-Landroid/preference/PreferenceManager$OnActivityDestroyListener;
-Landroid/preference/PreferenceManager$OnPreferenceTreeClickListener;
-Landroid/preference/PreferenceManager;
-Landroid/preference/PreferenceScreen;
-Landroid/preference/TwoStatePreference;
-Landroid/print/IPrintDocumentAdapter$Stub$Proxy;
-Landroid/print/IPrintDocumentAdapter$Stub;
-Landroid/print/IPrintDocumentAdapter;
-Landroid/print/IPrintJobStateChangeListener$Stub$Proxy;
-Landroid/print/IPrintJobStateChangeListener$Stub;
-Landroid/print/IPrintJobStateChangeListener;
-Landroid/print/IPrintManager$Stub$Proxy;
-Landroid/print/IPrintManager$Stub;
-Landroid/print/IPrintManager;
-Landroid/print/IPrintServicesChangeListener$Stub$Proxy;
-Landroid/print/IPrintServicesChangeListener$Stub;
-Landroid/print/IPrintServicesChangeListener;
-Landroid/print/IPrintSpooler$Stub$Proxy;
-Landroid/print/IPrintSpooler$Stub;
-Landroid/print/IPrintSpooler;
-Landroid/print/IPrintSpoolerCallbacks$Stub;
-Landroid/print/IPrintSpoolerCallbacks;
-Landroid/print/IPrintSpoolerClient$Stub;
-Landroid/print/IPrintSpoolerClient;
-Landroid/print/IPrinterDiscoveryObserver$Stub$Proxy;
-Landroid/print/IPrinterDiscoveryObserver$Stub;
-Landroid/print/IPrinterDiscoveryObserver;
-Landroid/print/PrintAttributes$1;
-Landroid/print/PrintAttributes;
-Landroid/print/PrintDocumentAdapter;
-Landroid/print/PrintJobId$1;
-Landroid/print/PrintJobId;
-Landroid/print/PrintJobInfo$1;
-Landroid/print/PrintJobInfo;
-Landroid/print/PrintManager$1;
-Landroid/print/PrintManager;
-Landroid/print/PrinterId$1;
-Landroid/print/PrinterId;
-Landroid/printservice/IPrintServiceClient$Stub;
-Landroid/printservice/IPrintServiceClient;
-Landroid/printservice/PrintServiceInfo$1;
-Landroid/printservice/PrintServiceInfo;
-Landroid/printservice/recommendation/IRecommendationsChangeListener$Stub$Proxy;
-Landroid/printservice/recommendation/IRecommendationsChangeListener$Stub;
-Landroid/printservice/recommendation/IRecommendationsChangeListener;
-Landroid/privacy/DifferentialPrivacyConfig;
-Landroid/privacy/DifferentialPrivacyEncoder;
-Landroid/privacy/internal/longitudinalreporting/LongitudinalReportingConfig;
-Landroid/privacy/internal/longitudinalreporting/LongitudinalReportingEncoder;
-Landroid/privacy/internal/rappor/RapporConfig;
-Landroid/privacy/internal/rappor/RapporEncoder;
-Landroid/provider/BaseColumns;
-Landroid/provider/BlockedNumberContract$BlockedNumbers;
-Landroid/provider/BlockedNumberContract$SystemContract;
-Landroid/provider/BlockedNumberContract;
-Landroid/provider/CalendarContract$Attendees;
-Landroid/provider/CalendarContract$AttendeesColumns;
-Landroid/provider/CalendarContract$CalendarColumns;
-Landroid/provider/CalendarContract$CalendarSyncColumns;
-Landroid/provider/CalendarContract$Calendars;
-Landroid/provider/CalendarContract$Events;
-Landroid/provider/CalendarContract$EventsColumns;
-Landroid/provider/CalendarContract$Instances;
-Landroid/provider/CalendarContract$SyncColumns;
-Landroid/provider/CalendarContract;
-Landroid/provider/CallLog$CallComposerLoggingException;
-Landroid/provider/CallLog$Calls;
-Landroid/provider/CallLog;
-Landroid/provider/ContactsContract$BaseSyncColumns;
-Landroid/provider/ContactsContract$CommonDataKinds$BaseTypes;
-Landroid/provider/ContactsContract$CommonDataKinds$Callable;
-Landroid/provider/ContactsContract$CommonDataKinds$CommonColumns;
-Landroid/provider/ContactsContract$CommonDataKinds$Email;
-Landroid/provider/ContactsContract$CommonDataKinds$Event;
-Landroid/provider/ContactsContract$CommonDataKinds$Im;
-Landroid/provider/ContactsContract$CommonDataKinds$Phone;
-Landroid/provider/ContactsContract$CommonDataKinds$Relation;
-Landroid/provider/ContactsContract$CommonDataKinds$StructuredPostal;
-Landroid/provider/ContactsContract$ContactCounts;
-Landroid/provider/ContactsContract$ContactNameColumns;
-Landroid/provider/ContactsContract$ContactOptionsColumns;
-Landroid/provider/ContactsContract$ContactStatusColumns;
-Landroid/provider/ContactsContract$Contacts;
-Landroid/provider/ContactsContract$ContactsColumns;
-Landroid/provider/ContactsContract$Data;
-Landroid/provider/ContactsContract$DataColumns;
-Landroid/provider/ContactsContract$DataColumnsWithJoins;
-Landroid/provider/ContactsContract$DataUsageFeedback;
-Landroid/provider/ContactsContract$DataUsageStatColumns;
-Landroid/provider/ContactsContract$DeletedContacts;
-Landroid/provider/ContactsContract$DeletedContactsColumns;
-Landroid/provider/ContactsContract$Directory;
-Landroid/provider/ContactsContract$DisplayPhoto;
-Landroid/provider/ContactsContract$Groups;
-Landroid/provider/ContactsContract$GroupsColumns;
-Landroid/provider/ContactsContract$MetadataSync;
-Landroid/provider/ContactsContract$MetadataSyncColumns;
-Landroid/provider/ContactsContract$PhoneLookup;
-Landroid/provider/ContactsContract$PhoneLookupColumns;
-Landroid/provider/ContactsContract$Profile;
-Landroid/provider/ContactsContract$ProviderStatus;
-Landroid/provider/ContactsContract$RawContacts;
-Landroid/provider/ContactsContract$RawContactsColumns;
-Landroid/provider/ContactsContract$RawContactsEntity;
-Landroid/provider/ContactsContract$Settings;
-Landroid/provider/ContactsContract$SettingsColumns;
-Landroid/provider/ContactsContract$StatusColumns;
-Landroid/provider/ContactsContract$SyncColumns;
-Landroid/provider/ContactsContract$SyncState;
-Landroid/provider/ContactsContract;
-Landroid/provider/DeviceConfigInitializer;
-Landroid/provider/DeviceConfigServiceManager$ServiceRegisterer;
-Landroid/provider/DeviceConfigServiceManager;
-Landroid/provider/DocumentsContract$Path$1;
-Landroid/provider/DocumentsContract$Path;
-Landroid/provider/DocumentsContract;
-Landroid/provider/DocumentsProvider;
-Landroid/provider/Downloads$Impl;
-Landroid/provider/Downloads;
-Landroid/provider/E2eeContactKeysManager;
-Landroid/provider/FontRequest;
-Landroid/provider/FontsContract$$ExternalSyntheticLambda0;
-Landroid/provider/FontsContract$$ExternalSyntheticLambda12;
-Landroid/provider/FontsContract$$ExternalSyntheticLambda13;
-Landroid/provider/FontsContract$$ExternalSyntheticLambda1;
-Landroid/provider/FontsContract$1;
-Landroid/provider/FontsContract$FontFamilyResult;
-Landroid/provider/FontsContract$FontInfo;
-Landroid/provider/FontsContract;
-Landroid/provider/OpenableColumns;
-Landroid/provider/SearchIndexableData;
-Landroid/provider/SearchIndexableResource;
-Landroid/provider/SearchIndexablesContract;
-Landroid/provider/SearchIndexablesProvider;
-Landroid/provider/SearchRecentSuggestions;
-Landroid/provider/Settings$Config;
-Landroid/provider/Settings$ContentProviderHolder;
-Landroid/provider/Settings$GenerationTracker;
-Landroid/provider/Settings$Global;
-Landroid/provider/Settings$NameValueCache$$ExternalSyntheticLambda0;
-Landroid/provider/Settings$NameValueCache;
-Landroid/provider/Settings$NameValueTable;
-Landroid/provider/Settings$Readable;
-Landroid/provider/Settings$Secure;
-Landroid/provider/Settings$SettingNotFoundException;
-Landroid/provider/Settings$System;
-Landroid/provider/Settings;
-Landroid/provider/SyncStateContract$Columns;
-Landroid/provider/Telephony$BaseMmsColumns;
-Landroid/provider/Telephony$CarrierColumns;
-Landroid/provider/Telephony$CarrierId$All;
-Landroid/provider/Telephony$CarrierId;
-Landroid/provider/Telephony$Carriers;
-Landroid/provider/Telephony$Mms$Inbox;
-Landroid/provider/Telephony$Mms$Sent;
-Landroid/provider/Telephony$Mms;
-Landroid/provider/Telephony$MmsSms;
-Landroid/provider/Telephony$ServiceStateTable;
-Landroid/provider/Telephony$SimInfo;
-Landroid/provider/Telephony$Sms$Intents;
-Landroid/provider/Telephony$Sms$Sent;
-Landroid/provider/Telephony$Sms;
-Landroid/provider/Telephony$TextBasedSmsColumns;
-Landroid/provider/Telephony$Threads;
-Landroid/provider/Telephony$ThreadsColumns;
-Landroid/provider/UserDictionary$Words;
-Landroid/provider/VoicemailContract$Status;
-Landroid/provider/VoicemailContract$Voicemails;
-Landroid/renderscript/Allocation;
-Landroid/renderscript/BaseObj;
-Landroid/renderscript/Element$DataKind;
-Landroid/renderscript/Element$DataType;
-Landroid/renderscript/Element;
-Landroid/renderscript/RSDriverException;
-Landroid/renderscript/RSIllegalArgumentException;
-Landroid/renderscript/RSInvalidStateException;
-Landroid/renderscript/RSRuntimeException;
-Landroid/renderscript/RenderScript$ContextType;
-Landroid/renderscript/RenderScript$MessageThread;
-Landroid/renderscript/RenderScript$RSErrorHandler;
-Landroid/renderscript/RenderScript$RSMessageHandler;
-Landroid/renderscript/RenderScript;
-Landroid/renderscript/RenderScriptCacheDir;
-Landroid/renderscript/Script;
-Landroid/renderscript/ScriptIntrinsic;
-Landroid/renderscript/ScriptIntrinsicBlur;
-Landroid/se/omapi/SeFrameworkInitializer;
-Landroid/se/omapi/SeServiceManager;
-Landroid/security/AttestedKeyPair;
-Landroid/security/CheckedRemoteRequest;
-Landroid/security/Credentials;
-Landroid/security/FeatureFlags;
-Landroid/security/FeatureFlagsImpl;
-Landroid/security/FileIntegrityManager;
-Landroid/security/Flags;
-Landroid/security/GateKeeper;
-Landroid/security/IFileIntegrityService$Stub;
-Landroid/security/IFileIntegrityService;
-Landroid/security/IKeyChainAliasCallback$Stub;
-Landroid/security/IKeyChainAliasCallback;
-Landroid/security/IKeyChainService$Stub$Proxy;
-Landroid/security/IKeyChainService$Stub;
-Landroid/security/IKeyChainService;
-Landroid/security/KeyChain$1;
-Landroid/security/KeyChain$AliasResponse;
-Landroid/security/KeyChain$KeyChainConnection;
-Landroid/security/KeyChain;
-Landroid/security/KeyChainAliasCallback;
-Landroid/security/KeyChainException;
-Landroid/security/KeyPairGeneratorSpec;
-Landroid/security/KeyStore2$$ExternalSyntheticLambda0;
-Landroid/security/KeyStore2$$ExternalSyntheticLambda1;
-Landroid/security/KeyStore2$$ExternalSyntheticLambda3;
-Landroid/security/KeyStore2$$ExternalSyntheticLambda4;
-Landroid/security/KeyStore2$$ExternalSyntheticLambda8;
-Landroid/security/KeyStore2$CheckedRemoteRequest;
-Landroid/security/KeyStore2;
-Landroid/security/KeyStore;
-Landroid/security/KeyStoreException$PublicErrorInformation;
-Landroid/security/KeyStoreException;
-Landroid/security/KeyStoreOperation$$ExternalSyntheticLambda0;
-Landroid/security/KeyStoreOperation$$ExternalSyntheticLambda1;
-Landroid/security/KeyStoreOperation$$ExternalSyntheticLambda2;
-Landroid/security/KeyStoreOperation$$ExternalSyntheticLambda3;
-Landroid/security/KeyStoreOperation;
-Landroid/security/KeyStoreSecurityLevel$$ExternalSyntheticLambda1;
-Landroid/security/KeyStoreSecurityLevel;
-Landroid/security/NetworkSecurityPolicy;
-Landroid/security/Scrypt;
-Landroid/security/attestationverification/AttestationVerificationManager;
-Landroid/security/keymaster/ExportResult$1;
-Landroid/security/keymaster/ExportResult;
-Landroid/security/keymaster/KeyCharacteristics$1;
-Landroid/security/keymaster/KeyCharacteristics;
-Landroid/security/keymaster/KeymasterArgument$1;
-Landroid/security/keymaster/KeymasterArgument;
-Landroid/security/keymaster/KeymasterArguments$1;
-Landroid/security/keymaster/KeymasterArguments-IA;
-Landroid/security/keymaster/KeymasterArguments;
-Landroid/security/keymaster/KeymasterBlob$1;
-Landroid/security/keymaster/KeymasterBlob;
-Landroid/security/keymaster/KeymasterBlobArgument;
-Landroid/security/keymaster/KeymasterBooleanArgument;
-Landroid/security/keymaster/KeymasterCertificateChain$1;
-Landroid/security/keymaster/KeymasterCertificateChain;
-Landroid/security/keymaster/KeymasterDateArgument;
-Landroid/security/keymaster/KeymasterDefs;
-Landroid/security/keymaster/KeymasterIntArgument;
-Landroid/security/keymaster/KeymasterLongArgument;
-Landroid/security/keymaster/OperationResult$1;
-Landroid/security/keymaster/OperationResult;
-Landroid/security/keystore/AndroidKeyStoreProvider;
-Landroid/security/keystore/ArrayUtils;
-Landroid/security/keystore/AttestationUtils;
-Landroid/security/keystore/BackendBusyException;
-Landroid/security/keystore/DelegatingX509Certificate;
-Landroid/security/keystore/DeviceIdAttestationException;
-Landroid/security/keystore/KeyAttestationException;
-Landroid/security/keystore/KeyExpiredException;
-Landroid/security/keystore/KeyGenParameterSpec$Builder;
-Landroid/security/keystore/KeyGenParameterSpec;
-Landroid/security/keystore/KeyInfo;
-Landroid/security/keystore/KeyNotYetValidException;
-Landroid/security/keystore/KeyPermanentlyInvalidatedException;
-Landroid/security/keystore/KeyProperties$BlockMode;
-Landroid/security/keystore/KeyProperties$Digest;
-Landroid/security/keystore/KeyProperties$EncryptionPadding;
-Landroid/security/keystore/KeyProperties$KeyAlgorithm;
-Landroid/security/keystore/KeyProperties$Origin;
-Landroid/security/keystore/KeyProperties$Purpose;
-Landroid/security/keystore/KeyProperties$SignaturePadding;
-Landroid/security/keystore/KeyProperties;
-Landroid/security/keystore/KeyProtection$Builder;
-Landroid/security/keystore/KeyProtection;
-Landroid/security/keystore/KeyStoreConnectException;
-Landroid/security/keystore/KeyStoreCryptoOperation;
-Landroid/security/keystore/KeystoreResponse$1;
-Landroid/security/keystore/KeystoreResponse;
-Landroid/security/keystore/ParcelableKeyGenParameterSpec$1;
-Landroid/security/keystore/ParcelableKeyGenParameterSpec;
-Landroid/security/keystore/SecureKeyImportUnavailableException;
-Landroid/security/keystore/StrongBoxUnavailableException;
-Landroid/security/keystore/UserAuthArgs;
-Landroid/security/keystore/UserNotAuthenticatedException;
-Landroid/security/keystore/Utils;
-Landroid/security/keystore/WrappedKeyEntry;
-Landroid/security/keystore/recovery/InternalRecoveryServiceException;
-Landroid/security/keystore/recovery/KeyChainProtectionParams$1;
-Landroid/security/keystore/recovery/KeyChainProtectionParams$Builder;
-Landroid/security/keystore/recovery/KeyChainProtectionParams;
-Landroid/security/keystore/recovery/KeyChainSnapshot$1;
-Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
-Landroid/security/keystore/recovery/KeyChainSnapshot;
-Landroid/security/keystore/recovery/KeyDerivationParams$1;
-Landroid/security/keystore/recovery/KeyDerivationParams;
-Landroid/security/keystore/recovery/LockScreenRequiredException;
-Landroid/security/keystore/recovery/RecoveryCertPath$1;
-Landroid/security/keystore/recovery/RecoveryCertPath;
-Landroid/security/keystore/recovery/RecoveryController;
-Landroid/security/keystore/recovery/TrustedRootCertificates;
-Landroid/security/keystore/recovery/WrappedApplicationKey$1;
-Landroid/security/keystore/recovery/WrappedApplicationKey$Builder;
-Landroid/security/keystore/recovery/WrappedApplicationKey;
-Landroid/security/keystore/recovery/X509CertificateParsingUtils;
-Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream-IA;
-Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream;
-Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer-IA;
-Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer;
-Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM$NoPadding;
-Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM;
-Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi;
-Landroid/security/keystore2/AndroidKeyStoreBCWorkaroundProvider;
-Landroid/security/keystore2/AndroidKeyStoreCipherSpiBase;
-Landroid/security/keystore2/AndroidKeyStoreECDSASignatureSpi$SHA256;
-Landroid/security/keystore2/AndroidKeyStoreECDSASignatureSpi;
-Landroid/security/keystore2/AndroidKeyStoreECPrivateKey;
-Landroid/security/keystore2/AndroidKeyStoreECPublicKey;
-Landroid/security/keystore2/AndroidKeyStoreKey;
-Landroid/security/keystore2/AndroidKeyStoreKeyFactorySpi;
-Landroid/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi$$ExternalSyntheticLambda2;
-Landroid/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi$$ExternalSyntheticLambda3;
-Landroid/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi$$ExternalSyntheticLambda4;
-Landroid/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi$$ExternalSyntheticLambda5;
-Landroid/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi$$ExternalSyntheticLambda6;
-Landroid/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi$EC;
-Landroid/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi;
-Landroid/security/keystore2/AndroidKeyStoreLoadStoreParameter;
-Landroid/security/keystore2/AndroidKeyStorePrivateKey;
-Landroid/security/keystore2/AndroidKeyStoreProvider;
-Landroid/security/keystore2/AndroidKeyStorePublicKey;
-Landroid/security/keystore2/AndroidKeyStoreRSAPrivateKey;
-Landroid/security/keystore2/AndroidKeyStoreRSAPublicKey;
-Landroid/security/keystore2/AndroidKeyStoreSecretKey;
-Landroid/security/keystore2/AndroidKeyStoreSignatureSpiBase;
-Landroid/security/keystore2/AndroidKeyStoreSpi;
-Landroid/security/keystore2/KeyStore2ParameterUtils;
-Landroid/security/keystore2/KeyStoreCryptoOperationChunkedStreamer$MainDataStream;
-Landroid/security/keystore2/KeyStoreCryptoOperationChunkedStreamer$Stream;
-Landroid/security/keystore2/KeyStoreCryptoOperationChunkedStreamer;
-Landroid/security/keystore2/KeyStoreCryptoOperationStreamer;
-Landroid/security/keystore2/KeyStoreCryptoOperationUtils;
-Landroid/security/keystore2/KeymasterUtils;
-Landroid/security/net/config/ApplicationConfig;
-Landroid/security/net/config/CertificateSource;
-Landroid/security/net/config/CertificatesEntryRef;
-Landroid/security/net/config/ConfigNetworkSecurityPolicy;
-Landroid/security/net/config/ConfigSource;
-Landroid/security/net/config/DirectoryCertificateSource$1;
-Landroid/security/net/config/DirectoryCertificateSource$3;
-Landroid/security/net/config/DirectoryCertificateSource$CertSelector;
-Landroid/security/net/config/DirectoryCertificateSource;
-Landroid/security/net/config/Domain;
-Landroid/security/net/config/KeyStoreCertificateSource;
-Landroid/security/net/config/KeyStoreConfigSource;
-Landroid/security/net/config/ManifestConfigSource$DefaultConfigSource;
-Landroid/security/net/config/ManifestConfigSource;
-Landroid/security/net/config/NetworkSecurityConfig$1;
-Landroid/security/net/config/NetworkSecurityConfig$Builder;
-Landroid/security/net/config/NetworkSecurityConfig-IA;
-Landroid/security/net/config/NetworkSecurityConfig;
-Landroid/security/net/config/NetworkSecurityConfigProvider;
-Landroid/security/net/config/NetworkSecurityTrustManager;
-Landroid/security/net/config/Pin;
-Landroid/security/net/config/PinSet;
-Landroid/security/net/config/ResourceCertificateSource;
-Landroid/security/net/config/RootTrustManager;
-Landroid/security/net/config/RootTrustManagerFactorySpi;
-Landroid/security/net/config/SystemCertificateSource$NoPreloadHolder;
-Landroid/security/net/config/SystemCertificateSource-IA;
-Landroid/security/net/config/SystemCertificateSource;
-Landroid/security/net/config/TrustAnchor;
-Landroid/security/net/config/TrustedCertificateStoreAdapter;
-Landroid/security/net/config/UserCertificateSource$NoPreloadHolder;
-Landroid/security/net/config/UserCertificateSource-IA;
-Landroid/security/net/config/UserCertificateSource;
-Landroid/security/net/config/WfaCertificateSource$NoPreloadHolder;
-Landroid/security/net/config/WfaCertificateSource;
-Landroid/security/net/config/XmlConfigSource$ParserException;
-Landroid/security/net/config/XmlConfigSource;
-Landroid/server/FeatureFlags;
-Landroid/server/FeatureFlagsImpl;
-Landroid/server/Flags;
-Landroid/service/appprediction/IPredictionService$Stub$Proxy;
-Landroid/service/appprediction/IPredictionService$Stub;
-Landroid/service/appprediction/IPredictionService;
-Landroid/service/autofill/AutofillServiceInfo;
-Landroid/service/autofill/Dataset$1;
-Landroid/service/autofill/Dataset;
-Landroid/service/autofill/FieldClassificationUserData;
-Landroid/service/autofill/FillContext$1;
-Landroid/service/autofill/FillContext;
-Landroid/service/autofill/FillEventHistory$1;
-Landroid/service/autofill/FillEventHistory;
-Landroid/service/autofill/FillRequest$1;
-Landroid/service/autofill/FillRequest;
-Landroid/service/autofill/FillResponse$1;
-Landroid/service/autofill/FillResponse;
-Landroid/service/autofill/Flags;
-Landroid/service/autofill/IAutoFillService$Stub$Proxy;
-Landroid/service/autofill/IAutoFillService$Stub;
-Landroid/service/autofill/IAutoFillService;
-Landroid/service/autofill/IFillCallback$Stub$Proxy;
-Landroid/service/autofill/IFillCallback$Stub;
-Landroid/service/autofill/IFillCallback;
-Landroid/service/autofill/IInlineSuggestionRenderService$Stub$Proxy;
-Landroid/service/autofill/IInlineSuggestionRenderService$Stub;
-Landroid/service/autofill/IInlineSuggestionRenderService;
-Landroid/service/autofill/ISaveCallback$Stub;
-Landroid/service/autofill/ISaveCallback;
-Landroid/service/autofill/SaveRequest$1;
-Landroid/service/autofill/SaveRequest;
-Landroid/service/autofill/UserData$1;
-Landroid/service/autofill/UserData$Builder;
-Landroid/service/autofill/UserData;
-Landroid/service/autofill/augmented/Helper;
-Landroid/service/autofill/augmented/IAugmentedAutofillService$Stub$Proxy;
-Landroid/service/autofill/augmented/IAugmentedAutofillService$Stub;
-Landroid/service/autofill/augmented/IAugmentedAutofillService;
-Landroid/service/autofill/augmented/IFillCallback$Stub$Proxy;
-Landroid/service/autofill/augmented/IFillCallback$Stub;
-Landroid/service/autofill/augmented/IFillCallback;
-Landroid/service/carrier/CarrierIdentifier$1;
-Landroid/service/carrier/CarrierIdentifier;
-Landroid/service/carrier/CarrierMessagingServiceWrapper$CarrierMessagingCallback;
-Landroid/service/carrier/CarrierMessagingServiceWrapper;
-Landroid/service/carrier/ICarrierService$Stub$Proxy;
-Landroid/service/carrier/ICarrierService$Stub;
-Landroid/service/carrier/ICarrierService;
-Landroid/service/carrier/MessagePdu$1;
-Landroid/service/carrier/MessagePdu;
-Landroid/service/contentcapture/ActivityEvent$1;
-Landroid/service/contentcapture/ActivityEvent;
-Landroid/service/contentcapture/ContentCaptureService;
-Landroid/service/contentcapture/ContentCaptureServiceInfo;
-Landroid/service/contentcapture/FlushMetrics$1;
-Landroid/service/contentcapture/FlushMetrics;
-Landroid/service/contentcapture/IContentCaptureService$Stub$Proxy;
-Landroid/service/contentcapture/IContentCaptureService$Stub;
-Landroid/service/contentcapture/IContentCaptureService;
-Landroid/service/contentcapture/IContentCaptureServiceCallback$Stub$Proxy;
-Landroid/service/contentcapture/IContentCaptureServiceCallback$Stub;
-Landroid/service/contentcapture/IContentCaptureServiceCallback;
-Landroid/service/contentcapture/IDataShareCallback$Stub;
-Landroid/service/contentcapture/IDataShareCallback;
-Landroid/service/contentcapture/SnapshotData$1;
-Landroid/service/contentcapture/SnapshotData;
-Landroid/service/contentsuggestions/IContentSuggestionsService$Stub$Proxy;
-Landroid/service/contentsuggestions/IContentSuggestionsService$Stub;
-Landroid/service/contentsuggestions/IContentSuggestionsService;
-Landroid/service/dataloader/DataLoaderService;
-Landroid/service/dreams/DreamActivity;
-Landroid/service/dreams/DreamManagerInternal;
-Landroid/service/dreams/DreamService$DreamServiceWrapper;
-Landroid/service/dreams/DreamService;
-Landroid/service/dreams/IDreamManager$Stub$Proxy;
-Landroid/service/dreams/IDreamManager$Stub;
-Landroid/service/dreams/IDreamManager;
-Landroid/service/dreams/IDreamService$Stub$Proxy;
-Landroid/service/dreams/IDreamService$Stub;
-Landroid/service/dreams/IDreamService;
-Landroid/service/euicc/DownloadSubscriptionResult$1;
-Landroid/service/euicc/DownloadSubscriptionResult;
-Landroid/service/euicc/EuiccProfileInfo$1;
-Landroid/service/euicc/EuiccProfileInfo$Builder;
-Landroid/service/euicc/EuiccProfileInfo;
-Landroid/service/euicc/GetDefaultDownloadableSubscriptionListResult$1;
-Landroid/service/euicc/GetDefaultDownloadableSubscriptionListResult;
-Landroid/service/euicc/GetDownloadableSubscriptionMetadataResult$1;
-Landroid/service/euicc/GetDownloadableSubscriptionMetadataResult;
-Landroid/service/euicc/GetEuiccProfileInfoListResult$1;
-Landroid/service/euicc/GetEuiccProfileInfoListResult;
-Landroid/service/euicc/IDeleteSubscriptionCallback$Stub;
-Landroid/service/euicc/IDeleteSubscriptionCallback;
-Landroid/service/euicc/IDownloadSubscriptionCallback$Stub;
-Landroid/service/euicc/IDownloadSubscriptionCallback;
-Landroid/service/euicc/IEraseSubscriptionsCallback$Stub;
-Landroid/service/euicc/IEraseSubscriptionsCallback;
-Landroid/service/euicc/IEuiccService$Stub$Proxy;
-Landroid/service/euicc/IEuiccService$Stub;
-Landroid/service/euicc/IEuiccService;
-Landroid/service/euicc/IEuiccServiceDumpResultCallback$Stub;
-Landroid/service/euicc/IEuiccServiceDumpResultCallback;
-Landroid/service/euicc/IGetAvailableMemoryInBytesCallback$Stub;
-Landroid/service/euicc/IGetAvailableMemoryInBytesCallback;
-Landroid/service/euicc/IGetDefaultDownloadableSubscriptionListCallback$Stub;
-Landroid/service/euicc/IGetDefaultDownloadableSubscriptionListCallback;
-Landroid/service/euicc/IGetDownloadableSubscriptionMetadataCallback$Stub;
-Landroid/service/euicc/IGetDownloadableSubscriptionMetadataCallback;
-Landroid/service/euicc/IGetEidCallback$Stub;
-Landroid/service/euicc/IGetEidCallback;
-Landroid/service/euicc/IGetEuiccInfoCallback$Stub;
-Landroid/service/euicc/IGetEuiccInfoCallback;
-Landroid/service/euicc/IGetEuiccProfileInfoListCallback$Stub$Proxy;
-Landroid/service/euicc/IGetEuiccProfileInfoListCallback$Stub;
-Landroid/service/euicc/IGetEuiccProfileInfoListCallback;
-Landroid/service/euicc/IGetOtaStatusCallback$Stub;
-Landroid/service/euicc/IGetOtaStatusCallback;
-Landroid/service/euicc/IOtaStatusChangedCallback$Stub;
-Landroid/service/euicc/IOtaStatusChangedCallback;
-Landroid/service/euicc/IRetainSubscriptionsForFactoryResetCallback$Stub;
-Landroid/service/euicc/IRetainSubscriptionsForFactoryResetCallback;
-Landroid/service/euicc/ISwitchToSubscriptionCallback$Stub;
-Landroid/service/euicc/ISwitchToSubscriptionCallback;
-Landroid/service/euicc/IUpdateSubscriptionNicknameCallback$Stub;
-Landroid/service/euicc/IUpdateSubscriptionNicknameCallback;
-Landroid/service/games/GameSession$ScreenshotCallback;
-Landroid/service/gatekeeper/GateKeeperResponse$1;
-Landroid/service/gatekeeper/GateKeeperResponse;
-Landroid/service/gatekeeper/IGateKeeperService$Stub$Proxy;
-Landroid/service/gatekeeper/IGateKeeperService$Stub;
-Landroid/service/gatekeeper/IGateKeeperService;
-Landroid/service/media/IMediaBrowserService$Stub$Proxy;
-Landroid/service/media/IMediaBrowserService$Stub;
-Landroid/service/media/IMediaBrowserService;
-Landroid/service/media/IMediaBrowserServiceCallbacks$Stub$Proxy;
-Landroid/service/media/IMediaBrowserServiceCallbacks$Stub;
-Landroid/service/media/IMediaBrowserServiceCallbacks;
-Landroid/service/media/MediaBrowserService$$ExternalSyntheticLambda0;
-Landroid/service/media/MediaBrowserService$BrowserRoot;
-Landroid/service/media/MediaBrowserService$ConnectionRecord;
-Landroid/service/media/MediaBrowserService$Result;
-Landroid/service/media/MediaBrowserService$ServiceBinder$$ExternalSyntheticLambda1;
-Landroid/service/media/MediaBrowserService$ServiceBinder-IA;
-Landroid/service/media/MediaBrowserService$ServiceBinder;
-Landroid/service/media/MediaBrowserService$ServiceState;
-Landroid/service/media/MediaBrowserService;
-Landroid/service/notification/Adjustment$1;
-Landroid/service/notification/Adjustment;
-Landroid/service/notification/Condition$1;
-Landroid/service/notification/Condition;
-Landroid/service/notification/ConditionProviderService$H-IA;
-Landroid/service/notification/ConditionProviderService$H;
-Landroid/service/notification/ConditionProviderService$Provider-IA;
-Landroid/service/notification/ConditionProviderService;
-Landroid/service/notification/IConditionProvider$Stub;
-Landroid/service/notification/IConditionProvider;
-Landroid/service/notification/INotificationListener$Stub;
-Landroid/service/notification/INotificationListener;
-Landroid/service/notification/IStatusBarNotificationHolder$Stub$Proxy;
-Landroid/service/notification/IStatusBarNotificationHolder$Stub;
-Landroid/service/notification/IStatusBarNotificationHolder;
-Landroid/service/notification/NotificationAssistantService$MyHandler;
-Landroid/service/notification/NotificationAssistantService$NotificationAssistantServiceWrapper;
-Landroid/service/notification/NotificationAssistantService;
-Landroid/service/notification/NotificationListenerFilter$1;
-Landroid/service/notification/NotificationListenerFilter;
-Landroid/service/notification/NotificationListenerService$MyHandler;
-Landroid/service/notification/NotificationListenerService$Ranking;
-Landroid/service/notification/NotificationListenerService$RankingMap$1;
-Landroid/service/notification/NotificationListenerService$RankingMap-IA;
-Landroid/service/notification/NotificationListenerService$RankingMap;
-Landroid/service/notification/NotificationListenerService;
-Landroid/service/notification/NotificationRankingUpdate$1;
-Landroid/service/notification/NotificationRankingUpdate;
-Landroid/service/notification/NotificationStats$1;
-Landroid/service/notification/NotificationStats;
-Landroid/service/notification/NotifyingApp$1;
-Landroid/service/notification/ScheduleCalendar;
-Landroid/service/notification/SnoozeCriterion$1;
-Landroid/service/notification/SnoozeCriterion;
-Landroid/service/notification/StatusBarNotification$1;
-Landroid/service/notification/StatusBarNotification;
-Landroid/service/notification/ZenDeviceEffects;
-Landroid/service/notification/ZenModeConfig$1;
-Landroid/service/notification/ZenModeConfig$EventInfo;
-Landroid/service/notification/ZenModeConfig$ScheduleInfo;
-Landroid/service/notification/ZenModeConfig$ZenRule$1;
-Landroid/service/notification/ZenModeConfig$ZenRule;
-Landroid/service/notification/ZenModeConfig;
-Landroid/service/notification/ZenPolicy$1;
-Landroid/service/notification/ZenPolicy$Builder;
-Landroid/service/notification/ZenPolicy;
-Landroid/service/oemlock/IOemLockService$Stub$Proxy;
-Landroid/service/oemlock/IOemLockService$Stub;
-Landroid/service/oemlock/IOemLockService;
-Landroid/service/oemlock/OemLockManager;
-Landroid/service/persistentdata/IPersistentDataBlockService$Stub$Proxy;
-Landroid/service/persistentdata/IPersistentDataBlockService$Stub;
-Landroid/service/persistentdata/IPersistentDataBlockService;
-Landroid/service/persistentdata/PersistentDataBlockManager;
-Landroid/service/quickaccesswallet/GetWalletCardsRequest$1;
-Landroid/service/quickaccesswallet/GetWalletCardsRequest;
-Landroid/service/quickaccesswallet/QuickAccessWalletClient;
-Landroid/service/quickaccesswallet/QuickAccessWalletClientImpl;
-Landroid/service/quickaccesswallet/QuickAccessWalletServiceInfo$ServiceMetadata;
-Landroid/service/quickaccesswallet/QuickAccessWalletServiceInfo$TileServiceMetadata;
-Landroid/service/quickaccesswallet/QuickAccessWalletServiceInfo;
-Landroid/service/quicksettings/IQSService$Stub$Proxy;
-Landroid/service/quicksettings/IQSService$Stub;
-Landroid/service/quicksettings/IQSService;
-Landroid/service/quicksettings/IQSTileService$Stub;
-Landroid/service/quicksettings/IQSTileService;
-Landroid/service/quicksettings/Tile$1;
-Landroid/service/quicksettings/Tile;
-Landroid/service/quicksettings/TileService$2;
-Landroid/service/quicksettings/TileService$H;
-Landroid/service/quicksettings/TileService;
-Landroid/service/storage/IExternalStorageService$Stub$Proxy;
-Landroid/service/storage/IExternalStorageService$Stub;
-Landroid/service/storage/IExternalStorageService;
-Landroid/service/textclassifier/ITextClassifierCallback$Stub$Proxy;
-Landroid/service/textclassifier/ITextClassifierCallback$Stub;
-Landroid/service/textclassifier/ITextClassifierCallback;
-Landroid/service/textclassifier/ITextClassifierService$Stub$Proxy;
-Landroid/service/textclassifier/ITextClassifierService$Stub;
-Landroid/service/textclassifier/ITextClassifierService;
-Landroid/service/textclassifier/TextClassifierService$1;
-Landroid/service/textclassifier/TextClassifierService;
-Landroid/service/timezone/TimeZoneProviderStatus$1;
-Landroid/service/timezone/TimeZoneProviderStatus;
-Landroid/service/trust/ITrustAgentService$Stub$Proxy;
-Landroid/service/trust/ITrustAgentService$Stub;
-Landroid/service/trust/ITrustAgentService;
-Landroid/service/trust/ITrustAgentServiceCallback$Stub$Proxy;
-Landroid/service/trust/ITrustAgentServiceCallback$Stub;
-Landroid/service/trust/ITrustAgentServiceCallback;
-Landroid/service/trust/TrustAgentService$1;
-Landroid/service/trust/TrustAgentService$ConfigurationData;
-Landroid/service/trust/TrustAgentService$TrustAgentServiceWrapper;
-Landroid/service/trust/TrustAgentService;
-Landroid/service/voice/IVoiceInteractionService$Stub$Proxy;
-Landroid/service/voice/IVoiceInteractionService$Stub;
-Landroid/service/voice/IVoiceInteractionService;
-Landroid/service/voice/IVoiceInteractionSession$Stub$Proxy;
-Landroid/service/voice/IVoiceInteractionSession$Stub;
-Landroid/service/voice/IVoiceInteractionSession;
-Landroid/service/voice/IVoiceInteractionSessionService$Stub$Proxy;
-Landroid/service/voice/IVoiceInteractionSessionService$Stub;
-Landroid/service/voice/IVoiceInteractionSessionService;
-Landroid/service/voice/VoiceInteractionManagerInternal;
-Landroid/service/voice/VoiceInteractionServiceInfo;
-Landroid/service/vr/IPersistentVrStateCallbacks$Stub$Proxy;
-Landroid/service/vr/IPersistentVrStateCallbacks$Stub;
-Landroid/service/vr/IPersistentVrStateCallbacks;
-Landroid/service/vr/IVrManager$Stub$Proxy;
-Landroid/service/vr/IVrManager$Stub;
-Landroid/service/vr/IVrManager;
-Landroid/service/vr/IVrStateCallbacks$Stub$Proxy;
-Landroid/service/vr/IVrStateCallbacks$Stub;
-Landroid/service/vr/IVrStateCallbacks;
-Landroid/service/wallpaper/EngineWindowPage;
-Landroid/service/wallpaper/IWallpaperConnection$Stub$Proxy;
-Landroid/service/wallpaper/IWallpaperConnection$Stub;
-Landroid/service/wallpaper/IWallpaperConnection;
-Landroid/service/wallpaper/IWallpaperEngine$Stub$Proxy;
-Landroid/service/wallpaper/IWallpaperEngine$Stub;
-Landroid/service/wallpaper/IWallpaperEngine;
-Landroid/service/wallpaper/IWallpaperService$Stub$Proxy;
-Landroid/service/wallpaper/IWallpaperService$Stub;
-Landroid/service/wallpaper/IWallpaperService;
-Landroid/service/wallpaper/WallpaperService$Engine$$ExternalSyntheticLambda1;
-Landroid/service/wallpaper/WallpaperService$Engine$$ExternalSyntheticLambda2;
-Landroid/service/wallpaper/WallpaperService$Engine$1;
-Landroid/service/wallpaper/WallpaperService$Engine$2;
-Landroid/service/wallpaper/WallpaperService$Engine$3;
-Landroid/service/wallpaper/WallpaperService$Engine$4;
-Landroid/service/wallpaper/WallpaperService$Engine$WallpaperInputEventReceiver;
-Landroid/service/wallpaper/WallpaperService$Engine;
-Landroid/service/wallpaper/WallpaperService$IWallpaperEngineWrapper;
-Landroid/service/wallpaper/WallpaperService$IWallpaperServiceWrapper;
-Landroid/service/wallpaper/WallpaperService$WallpaperCommand;
-Landroid/service/wallpaper/WallpaperService;
-Landroid/service/watchdog/ExplicitHealthCheckService$PackageConfig$1;
-Landroid/service/watchdog/ExplicitHealthCheckService$PackageConfig;
-Landroid/service/watchdog/IExplicitHealthCheckService$Stub$Proxy;
-Landroid/service/watchdog/IExplicitHealthCheckService$Stub;
-Landroid/service/watchdog/IExplicitHealthCheckService;
-Landroid/speech/RecognitionListener;
-Landroid/speech/SpeechRecognizer;
-Landroid/speech/tts/ITextToSpeechCallback$Stub;
-Landroid/speech/tts/ITextToSpeechCallback;
-Landroid/speech/tts/ITextToSpeechService$Stub$Proxy;
-Landroid/speech/tts/ITextToSpeechService$Stub;
-Landroid/speech/tts/ITextToSpeechService;
-Landroid/speech/tts/TextToSpeech$$ExternalSyntheticLambda13;
-Landroid/speech/tts/TextToSpeech$$ExternalSyntheticLambda17;
-Landroid/speech/tts/TextToSpeech$$ExternalSyntheticLambda1;
-Landroid/speech/tts/TextToSpeech$Action;
-Landroid/speech/tts/TextToSpeech$Connection$1;
-Landroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask-IA;
-Landroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;
-Landroid/speech/tts/TextToSpeech$Connection-IA;
-Landroid/speech/tts/TextToSpeech$Connection;
-Landroid/speech/tts/TextToSpeech$DirectConnection-IA;
-Landroid/speech/tts/TextToSpeech$DirectConnection;
-Landroid/speech/tts/TextToSpeech$EngineInfo;
-Landroid/speech/tts/TextToSpeech$OnInitListener;
-Landroid/speech/tts/TextToSpeech$SystemConnection-IA;
-Landroid/speech/tts/TextToSpeech$SystemConnection;
-Landroid/speech/tts/TextToSpeech;
-Landroid/speech/tts/TtsEngines$EngineInfoComparator;
-Landroid/speech/tts/TtsEngines;
-Landroid/speech/tts/UtteranceProgressListener;
-Landroid/stats/devicepolicy/nano/StringList;
-Landroid/sysprop/AdbProperties;
-Landroid/sysprop/ContactsProperties;
-Landroid/sysprop/CryptoProperties$state_values;
-Landroid/sysprop/CryptoProperties$type_values;
-Landroid/sysprop/CryptoProperties;
-Landroid/sysprop/DeviceProperties;
-Landroid/sysprop/DisplayProperties;
-Landroid/sysprop/HdmiProperties;
-Landroid/sysprop/InitProperties;
-Landroid/sysprop/InputProperties;
-Landroid/sysprop/MediaProperties;
-Landroid/sysprop/PowerProperties;
-Landroid/sysprop/SocProperties;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda0;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda10;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda11;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda13;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda14;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda1;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda2;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda3;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda4;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda5;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda6;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda7;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda8;
-Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda9;
-Landroid/sysprop/TelephonyProperties;
-Landroid/sysprop/VndkProperties;
-Landroid/system/ErrnoException;
-Landroid/system/GaiException;
-Landroid/system/Int32Ref;
-Landroid/system/Int64Ref;
-Landroid/system/NetlinkSocketAddress;
-Landroid/system/Os;
-Landroid/system/OsConstants;
-Landroid/system/PacketSocketAddress;
-Landroid/system/StructAddrinfo;
-Landroid/system/StructCapUserData;
-Landroid/system/StructCapUserHeader;
-Landroid/system/StructCmsghdr;
-Landroid/system/StructGroupReq;
-Landroid/system/StructIfaddrs;
-Landroid/system/StructLinger;
-Landroid/system/StructMsghdr;
-Landroid/system/StructPasswd;
-Landroid/system/StructPollfd;
-Landroid/system/StructRlimit;
-Landroid/system/StructStat;
-Landroid/system/StructStatVfs;
-Landroid/system/StructTimespec;
-Landroid/system/StructTimeval;
-Landroid/system/StructUcred;
-Landroid/system/StructUtsname;
-Landroid/system/UnixSocketAddress;
-Landroid/system/VmSocketAddress;
-Landroid/system/keystore2/Authorization$1;
-Landroid/system/keystore2/Authorization;
-Landroid/system/keystore2/CreateOperationResponse$1;
-Landroid/system/keystore2/CreateOperationResponse;
-Landroid/system/keystore2/IKeystoreOperation$Stub$Proxy;
-Landroid/system/keystore2/IKeystoreOperation$Stub;
-Landroid/system/keystore2/IKeystoreOperation;
-Landroid/system/keystore2/IKeystoreSecurityLevel$Stub$Proxy;
-Landroid/system/keystore2/IKeystoreSecurityLevel$Stub;
-Landroid/system/keystore2/IKeystoreSecurityLevel;
-Landroid/system/keystore2/IKeystoreService$Stub$Proxy;
-Landroid/system/keystore2/IKeystoreService$Stub;
-Landroid/system/keystore2/IKeystoreService;
-Landroid/system/keystore2/KeyDescriptor$1;
-Landroid/system/keystore2/KeyDescriptor;
-Landroid/system/keystore2/KeyEntryResponse$1;
-Landroid/system/keystore2/KeyEntryResponse;
-Landroid/system/keystore2/KeyMetadata$1;
-Landroid/system/keystore2/KeyMetadata;
-Landroid/system/keystore2/KeyParameters$1;
-Landroid/system/keystore2/KeyParameters;
-Landroid/system/keystore2/OperationChallenge$1;
-Landroid/system/keystore2/OperationChallenge;
-Landroid/system/suspend/internal/ISuspendControlServiceInternal$Stub$Proxy;
-Landroid/system/suspend/internal/ISuspendControlServiceInternal$Stub;
-Landroid/system/suspend/internal/ISuspendControlServiceInternal;
-Landroid/system/suspend/internal/WakeLockInfo$1;
-Landroid/system/suspend/internal/WakeLockInfo;
-Landroid/telecom/AudioState$1;
-Landroid/telecom/AudioState;
-Landroid/telecom/Call$Callback;
-Landroid/telecom/CallAudioState$$ExternalSyntheticLambda0;
-Landroid/telecom/CallAudioState$1;
-Landroid/telecom/CallAudioState;
-Landroid/telecom/CallerInfo;
-Landroid/telecom/CallerInfoAsyncQuery;
-Landroid/telecom/Conference$Listener;
-Landroid/telecom/Conference;
-Landroid/telecom/Conferenceable;
-Landroid/telecom/Connection$FailureSignalingConnection;
-Landroid/telecom/Connection$Listener;
-Landroid/telecom/Connection$RttTextStream;
-Landroid/telecom/Connection$VideoProvider;
-Landroid/telecom/Connection;
-Landroid/telecom/ConnectionRequest$1;
-Landroid/telecom/ConnectionRequest$Builder;
-Landroid/telecom/ConnectionRequest;
-Landroid/telecom/ConnectionService$1;
-Landroid/telecom/ConnectionService$2;
-Landroid/telecom/ConnectionService$3;
-Landroid/telecom/ConnectionService$4;
-Landroid/telecom/ConnectionService$5;
-Landroid/telecom/ConnectionService;
-Landroid/telecom/ConnectionServiceAdapter;
-Landroid/telecom/DefaultDialerManager;
-Landroid/telecom/DisconnectCause$1;
-Landroid/telecom/DisconnectCause;
-Landroid/telecom/GatewayInfo$1;
-Landroid/telecom/GatewayInfo;
-Landroid/telecom/InCallService;
-Landroid/telecom/Log;
-Landroid/telecom/Logging/EventManager$Event;
-Landroid/telecom/Logging/EventManager$EventListener;
-Landroid/telecom/Logging/EventManager$EventRecord;
-Landroid/telecom/Logging/EventManager$Loggable;
-Landroid/telecom/Logging/EventManager$TimedEventPair;
-Landroid/telecom/Logging/EventManager;
-Landroid/telecom/Logging/Runnable$1;
-Landroid/telecom/Logging/Runnable;
-Landroid/telecom/Logging/Session$Info$1;
-Landroid/telecom/Logging/Session$Info;
-Landroid/telecom/Logging/Session;
-Landroid/telecom/Logging/SessionManager$$ExternalSyntheticLambda0;
-Landroid/telecom/Logging/SessionManager$$ExternalSyntheticLambda1;
-Landroid/telecom/Logging/SessionManager$$ExternalSyntheticLambda2;
-Landroid/telecom/Logging/SessionManager$ICurrentThreadId;
-Landroid/telecom/Logging/SessionManager$ISessionCleanupTimeoutMs;
-Landroid/telecom/Logging/SessionManager$ISessionIdQueryHandler;
-Landroid/telecom/Logging/SessionManager$ISessionListener;
-Landroid/telecom/Logging/SessionManager;
-Landroid/telecom/ParcelableCall$1;
-Landroid/telecom/ParcelableCall$ParcelableCallBuilder;
-Landroid/telecom/ParcelableCall;
-Landroid/telecom/ParcelableConference$1;
-Landroid/telecom/ParcelableConference;
-Landroid/telecom/ParcelableConnection$1;
-Landroid/telecom/ParcelableConnection;
-Landroid/telecom/ParcelableRttCall$1;
-Landroid/telecom/ParcelableRttCall;
-Landroid/telecom/PhoneAccount$1;
-Landroid/telecom/PhoneAccount$Builder;
-Landroid/telecom/PhoneAccount-IA;
-Landroid/telecom/PhoneAccount;
-Landroid/telecom/PhoneAccountHandle$1;
-Landroid/telecom/PhoneAccountHandle-IA;
-Landroid/telecom/PhoneAccountHandle;
-Landroid/telecom/RemoteConnectionManager;
-Landroid/telecom/StatusHints$1;
-Landroid/telecom/StatusHints;
-Landroid/telecom/TelecomAnalytics$1;
-Landroid/telecom/TelecomAnalytics$SessionTiming$1;
-Landroid/telecom/TelecomAnalytics;
-Landroid/telecom/TelecomManager$DeathRecipient;
-Landroid/telecom/TelecomManager;
-Landroid/telecom/TimedEvent;
-Landroid/telecom/VideoProfile$1;
-Landroid/telecom/VideoProfile$CameraCapabilities$1;
-Landroid/telecom/VideoProfile$CameraCapabilities;
-Landroid/telecom/VideoProfile;
-Landroid/telephony/AccessNetworkConstants$AccessNetworkType;
-Landroid/telephony/AccessNetworkConstants$TransportType;
-Landroid/telephony/AccessNetworkConstants;
-Landroid/telephony/AccessNetworkUtils;
-Landroid/telephony/ActivityStatsTechSpecificInfo$$ExternalSyntheticLambda0;
-Landroid/telephony/ActivityStatsTechSpecificInfo$$ExternalSyntheticLambda1;
-Landroid/telephony/ActivityStatsTechSpecificInfo$1;
-Landroid/telephony/ActivityStatsTechSpecificInfo;
-Landroid/telephony/AnomalyReporter;
-Landroid/telephony/AvailableNetworkInfo$1;
-Landroid/telephony/AvailableNetworkInfo;
-Landroid/telephony/BarringInfo$1;
-Landroid/telephony/BarringInfo$BarringServiceInfo$1;
-Landroid/telephony/BarringInfo$BarringServiceInfo;
-Landroid/telephony/BarringInfo;
-Landroid/telephony/BinderCacheManager$$ExternalSyntheticLambda0;
-Landroid/telephony/BinderCacheManager$BinderDeathTracker;
-Landroid/telephony/BinderCacheManager$BinderInterfaceFactory;
-Landroid/telephony/BinderCacheManager;
-Landroid/telephony/CallAttributes$1;
-Landroid/telephony/CallAttributes;
-Landroid/telephony/CallForwardingInfo$1;
-Landroid/telephony/CallForwardingInfo;
-Landroid/telephony/CallQuality$1;
-Landroid/telephony/CallQuality;
-Landroid/telephony/CallState$1;
-Landroid/telephony/CallState;
-Landroid/telephony/CarrierConfigManager$Apn;
-Landroid/telephony/CarrierConfigManager$Bsf;
-Landroid/telephony/CarrierConfigManager$CarrierConfigChangeListener;
-Landroid/telephony/CarrierConfigManager$Gps;
-Landroid/telephony/CarrierConfigManager$Ims;
-Landroid/telephony/CarrierConfigManager$ImsEmergency;
-Landroid/telephony/CarrierConfigManager$ImsRtt;
-Landroid/telephony/CarrierConfigManager$ImsServiceEntitlement;
-Landroid/telephony/CarrierConfigManager$ImsSms;
-Landroid/telephony/CarrierConfigManager$ImsSs;
-Landroid/telephony/CarrierConfigManager$ImsVoice;
-Landroid/telephony/CarrierConfigManager$ImsVt;
-Landroid/telephony/CarrierConfigManager$ImsWfc;
-Landroid/telephony/CarrierConfigManager$Iwlan;
-Landroid/telephony/CarrierConfigManager$OpportunisticNetwork;
-Landroid/telephony/CarrierConfigManager$Wifi;
-Landroid/telephony/CarrierConfigManager;
-Landroid/telephony/CarrierRestrictionRules$1;
-Landroid/telephony/CarrierRestrictionRules$Builder;
-Landroid/telephony/CarrierRestrictionRules;
-Landroid/telephony/CellConfigLte$1;
-Landroid/telephony/CellConfigLte-IA;
-Landroid/telephony/CellConfigLte;
-Landroid/telephony/CellIdentity$1;
-Landroid/telephony/CellIdentity;
-Landroid/telephony/CellIdentityCdma$1;
-Landroid/telephony/CellIdentityCdma;
-Landroid/telephony/CellIdentityGsm$1;
-Landroid/telephony/CellIdentityGsm;
-Landroid/telephony/CellIdentityLte$1;
-Landroid/telephony/CellIdentityLte;
-Landroid/telephony/CellIdentityNr$1;
-Landroid/telephony/CellIdentityNr;
-Landroid/telephony/CellIdentityTdscdma$1;
-Landroid/telephony/CellIdentityTdscdma;
-Landroid/telephony/CellIdentityWcdma$1;
-Landroid/telephony/CellIdentityWcdma;
-Landroid/telephony/CellInfo$1;
-Landroid/telephony/CellInfo;
-Landroid/telephony/CellInfoCdma$1;
-Landroid/telephony/CellInfoCdma;
-Landroid/telephony/CellInfoGsm$1;
-Landroid/telephony/CellInfoGsm;
-Landroid/telephony/CellInfoLte$1;
-Landroid/telephony/CellInfoLte;
-Landroid/telephony/CellInfoNr$1;
-Landroid/telephony/CellInfoNr;
-Landroid/telephony/CellInfoTdscdma$1;
-Landroid/telephony/CellInfoTdscdma;
-Landroid/telephony/CellInfoWcdma$1;
-Landroid/telephony/CellInfoWcdma;
-Landroid/telephony/CellLocation;
-Landroid/telephony/CellSignalStrength;
-Landroid/telephony/CellSignalStrengthCdma$1;
-Landroid/telephony/CellSignalStrengthCdma-IA;
-Landroid/telephony/CellSignalStrengthCdma;
-Landroid/telephony/CellSignalStrengthGsm$1;
-Landroid/telephony/CellSignalStrengthGsm-IA;
-Landroid/telephony/CellSignalStrengthGsm;
-Landroid/telephony/CellSignalStrengthLte$1;
-Landroid/telephony/CellSignalStrengthLte-IA;
-Landroid/telephony/CellSignalStrengthLte;
-Landroid/telephony/CellSignalStrengthNr$1;
-Landroid/telephony/CellSignalStrengthNr-IA;
-Landroid/telephony/CellSignalStrengthNr;
-Landroid/telephony/CellSignalStrengthTdscdma$1;
-Landroid/telephony/CellSignalStrengthTdscdma-IA;
-Landroid/telephony/CellSignalStrengthTdscdma;
-Landroid/telephony/CellSignalStrengthWcdma$1;
-Landroid/telephony/CellSignalStrengthWcdma-IA;
-Landroid/telephony/CellSignalStrengthWcdma;
-Landroid/telephony/ClientRequestStats$1;
-Landroid/telephony/ClientRequestStats;
-Landroid/telephony/ClosedSubscriberGroupInfo$1;
-Landroid/telephony/ClosedSubscriberGroupInfo;
-Landroid/telephony/DataConnectionRealTimeInfo$1;
-Landroid/telephony/DataConnectionRealTimeInfo;
-Landroid/telephony/DataFailCause;
-Landroid/telephony/DataSpecificRegistrationInfo$1;
-Landroid/telephony/DataSpecificRegistrationInfo-IA;
-Landroid/telephony/DataSpecificRegistrationInfo;
-Landroid/telephony/DisconnectCause;
-Landroid/telephony/IBootstrapAuthenticationCallback$Stub;
-Landroid/telephony/IBootstrapAuthenticationCallback;
-Landroid/telephony/ICellBroadcastService$Stub;
-Landroid/telephony/ICellBroadcastService;
-Landroid/telephony/ICellInfoCallback$Stub$Proxy;
-Landroid/telephony/ICellInfoCallback$Stub;
-Landroid/telephony/ICellInfoCallback;
-Landroid/telephony/INetworkService$Stub$Proxy;
-Landroid/telephony/INetworkService$Stub;
-Landroid/telephony/INetworkService;
-Landroid/telephony/INetworkServiceCallback$Stub$Proxy;
-Landroid/telephony/INetworkServiceCallback$Stub;
-Landroid/telephony/INetworkServiceCallback;
-Landroid/telephony/IccOpenLogicalChannelResponse$1;
-Landroid/telephony/IccOpenLogicalChannelResponse;
-Landroid/telephony/ImsiEncryptionInfo$1;
-Landroid/telephony/ImsiEncryptionInfo;
-Landroid/telephony/JapanesePhoneNumberFormatter;
-Landroid/telephony/LinkCapacityEstimate$1;
-Landroid/telephony/LinkCapacityEstimate;
-Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;
-Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery-IA;
-Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery;
-Landroid/telephony/LocationAccessPolicy$LocationPermissionResult;
-Landroid/telephony/LocationAccessPolicy;
-Landroid/telephony/LteVopsSupportInfo$1;
-Landroid/telephony/LteVopsSupportInfo-IA;
-Landroid/telephony/LteVopsSupportInfo;
-Landroid/telephony/MmsManager;
-Landroid/telephony/ModemActivityInfo$1;
-Landroid/telephony/ModemActivityInfo;
-Landroid/telephony/ModemInfo$1;
-Landroid/telephony/ModemInfo;
-Landroid/telephony/NeighboringCellInfo$1;
-Landroid/telephony/NeighboringCellInfo;
-Landroid/telephony/NetworkRegistrationInfo$$ExternalSyntheticLambda0;
-Landroid/telephony/NetworkRegistrationInfo$1;
-Landroid/telephony/NetworkRegistrationInfo$Builder;
-Landroid/telephony/NetworkRegistrationInfo-IA;
-Landroid/telephony/NetworkRegistrationInfo;
-Landroid/telephony/NetworkScan;
-Landroid/telephony/NetworkScanRequest$1;
-Landroid/telephony/NetworkScanRequest;
-Landroid/telephony/NetworkService$INetworkServiceWrapper;
-Landroid/telephony/NetworkService$NetworkServiceHandler;
-Landroid/telephony/NetworkService$NetworkServiceProvider;
-Landroid/telephony/NetworkService;
-Landroid/telephony/NetworkServiceCallback;
-Landroid/telephony/NrVopsSupportInfo$1;
-Landroid/telephony/NrVopsSupportInfo;
-Landroid/telephony/NumberVerificationCallback;
-Landroid/telephony/PcoData$1;
-Landroid/telephony/PcoData;
-Landroid/telephony/PhoneCapability$1;
-Landroid/telephony/PhoneCapability;
-Landroid/telephony/PhoneNumberRange$1;
-Landroid/telephony/PhoneNumberRange;
-Landroid/telephony/PhoneNumberUtils$CountryCallingCodeAndNewIndex;
-Landroid/telephony/PhoneNumberUtils;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda0;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda10;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda13;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda15;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda19;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda1;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda20;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda21;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda23;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda24;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda27;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda28;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda2;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda31;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda32;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda34;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda37;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda38;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda39;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda3;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda41;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda42;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda47;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda51;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda52;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda53;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda55;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda56;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda57;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda58;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda59;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda5;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda62;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda6;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda9;
-Landroid/telephony/PhoneStateListener;
-Landroid/telephony/PhysicalChannelConfig$1;
-Landroid/telephony/PhysicalChannelConfig$Builder;
-Landroid/telephony/PhysicalChannelConfig;
-Landroid/telephony/PinResult$1;
-Landroid/telephony/PinResult;
-Landroid/telephony/PreciseCallState$1;
-Landroid/telephony/PreciseCallState;
-Landroid/telephony/PreciseDataConnectionState$1;
-Landroid/telephony/PreciseDataConnectionState$Builder;
-Landroid/telephony/PreciseDataConnectionState;
-Landroid/telephony/RadioAccessFamily$1;
-Landroid/telephony/RadioAccessFamily;
-Landroid/telephony/RadioAccessSpecifier$1;
-Landroid/telephony/RadioAccessSpecifier;
-Landroid/telephony/Rlog;
-Landroid/telephony/ServiceState$$ExternalSyntheticLambda0;
-Landroid/telephony/ServiceState$1;
-Landroid/telephony/ServiceState;
-Landroid/telephony/SignalStrength$1;
-Landroid/telephony/SignalStrength;
-Landroid/telephony/SignalStrengthUpdateRequest$1;
-Landroid/telephony/SignalStrengthUpdateRequest;
-Landroid/telephony/SignalThresholdInfo$1;
-Landroid/telephony/SignalThresholdInfo$Builder;
-Landroid/telephony/SignalThresholdInfo;
-Landroid/telephony/SmsCbCmasInfo$1;
-Landroid/telephony/SmsCbCmasInfo;
-Landroid/telephony/SmsCbEtwsInfo$1;
-Landroid/telephony/SmsCbEtwsInfo;
-Landroid/telephony/SmsCbLocation$1;
-Landroid/telephony/SmsCbLocation;
-Landroid/telephony/SmsCbMessage$1;
-Landroid/telephony/SmsCbMessage;
-Landroid/telephony/SmsManager$1;
-Landroid/telephony/SmsManager$2;
-Landroid/telephony/SmsManager$3;
-Landroid/telephony/SmsManager$4;
-Landroid/telephony/SmsManager$5;
-Landroid/telephony/SmsManager$6;
-Landroid/telephony/SmsManager$FinancialSmsCallback;
-Landroid/telephony/SmsManager$SubscriptionResolverResult;
-Landroid/telephony/SmsManager;
-Landroid/telephony/SmsMessage$1;
-Landroid/telephony/SmsMessage$MessageClass;
-Landroid/telephony/SmsMessage$NoEmsSupportConfig;
-Landroid/telephony/SmsMessage;
-Landroid/telephony/SubscriptionInfo$1;
-Landroid/telephony/SubscriptionInfo$Builder;
-Landroid/telephony/SubscriptionInfo-IA;
-Landroid/telephony/SubscriptionInfo;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda0;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda10;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda11;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda12;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda13;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda14;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda15;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda16;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda17;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda18;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda2;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda3;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda4;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda5;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda6;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda7;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda8;
-Landroid/telephony/SubscriptionManager$$ExternalSyntheticLambda9;
-Landroid/telephony/SubscriptionManager$1;
-Landroid/telephony/SubscriptionManager$CallISubMethodHelper;
-Landroid/telephony/SubscriptionManager$IntegerPropertyInvalidatedCache;
-Landroid/telephony/SubscriptionManager$OnOpportunisticSubscriptionsChangedListener;
-Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;
-Landroid/telephony/SubscriptionManager$VoidPropertyInvalidatedCache;
-Landroid/telephony/SubscriptionManager;
-Landroid/telephony/SubscriptionPlan$1;
-Landroid/telephony/SubscriptionPlan;
-Landroid/telephony/TelephonyCallback$ActiveDataSubscriptionIdListener;
-Landroid/telephony/TelephonyCallback$AllowedNetworkTypesListener;
-Landroid/telephony/TelephonyCallback$BarringInfoListener;
-Landroid/telephony/TelephonyCallback$CallAttributesListener;
-Landroid/telephony/TelephonyCallback$CallDisconnectCauseListener;
-Landroid/telephony/TelephonyCallback$CallForwardingIndicatorListener;
-Landroid/telephony/TelephonyCallback$CallStateListener;
-Landroid/telephony/TelephonyCallback$CarrierNetworkListener;
-Landroid/telephony/TelephonyCallback$CellInfoListener;
-Landroid/telephony/TelephonyCallback$CellLocationListener;
-Landroid/telephony/TelephonyCallback$DataActivationStateListener;
-Landroid/telephony/TelephonyCallback$DataActivityListener;
-Landroid/telephony/TelephonyCallback$DataConnectionStateListener;
-Landroid/telephony/TelephonyCallback$DataEnabledListener;
-Landroid/telephony/TelephonyCallback$DisplayInfoListener;
-Landroid/telephony/TelephonyCallback$EmergencyCallbackModeListener;
-Landroid/telephony/TelephonyCallback$EmergencyNumberListListener;
-Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda26;
-Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda35;
-Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda36;
-Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda39;
-Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda47;
-Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda52;
-Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda63;
-Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda65;
-Landroid/telephony/TelephonyCallback$ImsCallDisconnectCauseListener;
-Landroid/telephony/TelephonyCallback$LinkCapacityEstimateChangedListener;
-Landroid/telephony/TelephonyCallback$MediaQualityStatusChangedListener;
-Landroid/telephony/TelephonyCallback$MessageWaitingIndicatorListener;
-Landroid/telephony/TelephonyCallback$OutgoingEmergencyCallListener;
-Landroid/telephony/TelephonyCallback$OutgoingEmergencySmsListener;
-Landroid/telephony/TelephonyCallback$PhoneCapabilityListener;
-Landroid/telephony/TelephonyCallback$PhysicalChannelConfigListener;
-Landroid/telephony/TelephonyCallback$PreciseCallStateListener;
-Landroid/telephony/TelephonyCallback$PreciseDataConnectionStateListener;
-Landroid/telephony/TelephonyCallback$RadioPowerStateListener;
-Landroid/telephony/TelephonyCallback$RegistrationFailedListener;
-Landroid/telephony/TelephonyCallback$ServiceStateListener;
-Landroid/telephony/TelephonyCallback$SignalStrengthsListener;
-Landroid/telephony/TelephonyCallback$SimultaneousCellularCallingSupportListener;
-Landroid/telephony/TelephonyCallback$SrvccStateListener;
-Landroid/telephony/TelephonyCallback$UserMobileDataStateListener;
-Landroid/telephony/TelephonyCallback$VoiceActivationStateListener;
-Landroid/telephony/TelephonyCallback;
-Landroid/telephony/TelephonyDisplayInfo$1;
-Landroid/telephony/TelephonyDisplayInfo;
-Landroid/telephony/TelephonyFrameworkInitializer$$ExternalSyntheticLambda0;
-Landroid/telephony/TelephonyFrameworkInitializer$$ExternalSyntheticLambda1;
-Landroid/telephony/TelephonyFrameworkInitializer$$ExternalSyntheticLambda2;
-Landroid/telephony/TelephonyFrameworkInitializer$$ExternalSyntheticLambda3;
-Landroid/telephony/TelephonyFrameworkInitializer$$ExternalSyntheticLambda4;
-Landroid/telephony/TelephonyFrameworkInitializer$$ExternalSyntheticLambda5;
-Landroid/telephony/TelephonyFrameworkInitializer$$ExternalSyntheticLambda6;
-Landroid/telephony/TelephonyFrameworkInitializer$$ExternalSyntheticLambda7;
-Landroid/telephony/TelephonyFrameworkInitializer;
-Landroid/telephony/TelephonyHistogram$1;
-Landroid/telephony/TelephonyHistogram;
-Landroid/telephony/TelephonyLocalConnection;
-Landroid/telephony/TelephonyManager$12;
-Landroid/telephony/TelephonyManager$13;
-Landroid/telephony/TelephonyManager$15;
-Landroid/telephony/TelephonyManager$17;
-Landroid/telephony/TelephonyManager$18;
-Landroid/telephony/TelephonyManager$19;
-Landroid/telephony/TelephonyManager$1;
-Landroid/telephony/TelephonyManager$20;
-Landroid/telephony/TelephonyManager$21;
-Landroid/telephony/TelephonyManager$2;
-Landroid/telephony/TelephonyManager$3;
-Landroid/telephony/TelephonyManager$4;
-Landroid/telephony/TelephonyManager$5;
-Landroid/telephony/TelephonyManager$6;
-Landroid/telephony/TelephonyManager$7;
-Landroid/telephony/TelephonyManager$8;
-Landroid/telephony/TelephonyManager$CarrierPrivilegesCallback;
-Landroid/telephony/TelephonyManager$CellInfoCallback;
-Landroid/telephony/TelephonyManager$DeathRecipient;
-Landroid/telephony/TelephonyManager$ModemActivityInfoException;
-Landroid/telephony/TelephonyManager$MultiSimVariants;
-Landroid/telephony/TelephonyManager$UssdResponseCallback;
-Landroid/telephony/TelephonyManager;
-Landroid/telephony/TelephonyRegistryManager$$ExternalSyntheticLambda0;
-Landroid/telephony/TelephonyRegistryManager$$ExternalSyntheticLambda1;
-Landroid/telephony/TelephonyRegistryManager$$ExternalSyntheticLambda2;
-Landroid/telephony/TelephonyRegistryManager$1$$ExternalSyntheticLambda0;
-Landroid/telephony/TelephonyRegistryManager$1;
-Landroid/telephony/TelephonyRegistryManager$2;
-Landroid/telephony/TelephonyRegistryManager$3;
-Landroid/telephony/TelephonyRegistryManager$CarrierPrivilegesCallbackWrapper$$ExternalSyntheticLambda0;
-Landroid/telephony/TelephonyRegistryManager$CarrierPrivilegesCallbackWrapper$$ExternalSyntheticLambda1;
-Landroid/telephony/TelephonyRegistryManager$CarrierPrivilegesCallbackWrapper$$ExternalSyntheticLambda2;
-Landroid/telephony/TelephonyRegistryManager$CarrierPrivilegesCallbackWrapper$$ExternalSyntheticLambda3;
-Landroid/telephony/TelephonyRegistryManager$CarrierPrivilegesCallbackWrapper$$ExternalSyntheticLambda4;
-Landroid/telephony/TelephonyRegistryManager$CarrierPrivilegesCallbackWrapper;
-Landroid/telephony/TelephonyRegistryManager;
-Landroid/telephony/TelephonyScanManager$NetworkScanCallback;
-Landroid/telephony/TelephonyScanManager;
-Landroid/telephony/UiccAccessRule$1;
-Landroid/telephony/UiccAccessRule;
-Landroid/telephony/UiccCardInfo$1;
-Landroid/telephony/UiccCardInfo;
-Landroid/telephony/UiccSlotInfo$1;
-Landroid/telephony/UiccSlotInfo;
-Landroid/telephony/UssdResponse$1;
-Landroid/telephony/UssdResponse;
-Landroid/telephony/VisualVoicemailSms$1;
-Landroid/telephony/VisualVoicemailSms$Builder;
-Landroid/telephony/VisualVoicemailSms;
-Landroid/telephony/VisualVoicemailSmsFilterSettings$1;
-Landroid/telephony/VisualVoicemailSmsFilterSettings$Builder;
-Landroid/telephony/VisualVoicemailSmsFilterSettings;
-Landroid/telephony/VoiceSpecificRegistrationInfo$1;
-Landroid/telephony/VoiceSpecificRegistrationInfo-IA;
-Landroid/telephony/VoiceSpecificRegistrationInfo;
-Landroid/telephony/VopsSupportInfo$1;
-Landroid/telephony/VopsSupportInfo;
-Landroid/telephony/cdma/CdmaCellLocation;
-Landroid/telephony/data/ApnSetting$1;
-Landroid/telephony/data/ApnSetting$Builder;
-Landroid/telephony/data/ApnSetting-IA;
-Landroid/telephony/data/ApnSetting;
-Landroid/telephony/data/DataCallResponse$1;
-Landroid/telephony/data/DataCallResponse$Builder;
-Landroid/telephony/data/DataCallResponse;
-Landroid/telephony/data/DataProfile$1;
-Landroid/telephony/data/DataProfile$Builder;
-Landroid/telephony/data/DataProfile;
-Landroid/telephony/data/DataService$DataCallListChangedIndication;
-Landroid/telephony/data/DataService$DataServiceHandler;
-Landroid/telephony/data/DataService$DataServiceProvider;
-Landroid/telephony/data/DataService$DeactivateDataCallRequest;
-Landroid/telephony/data/DataService$IDataServiceWrapper;
-Landroid/telephony/data/DataService$SetDataProfileRequest;
-Landroid/telephony/data/DataService$SetInitialAttachApnRequest;
-Landroid/telephony/data/DataService$SetupDataCallRequest;
-Landroid/telephony/data/DataService;
-Landroid/telephony/data/DataServiceCallback;
-Landroid/telephony/data/EpsBearerQosSessionAttributes$1;
-Landroid/telephony/data/EpsBearerQosSessionAttributes;
-Landroid/telephony/data/EpsQos$1;
-Landroid/telephony/data/EpsQos;
-Landroid/telephony/data/IDataService$Stub$Proxy;
-Landroid/telephony/data/IDataService$Stub;
-Landroid/telephony/data/IDataService;
-Landroid/telephony/data/IDataServiceCallback$Stub$Proxy;
-Landroid/telephony/data/IDataServiceCallback$Stub;
-Landroid/telephony/data/IDataServiceCallback;
-Landroid/telephony/data/IQualifiedNetworksService$Stub$Proxy;
-Landroid/telephony/data/IQualifiedNetworksService$Stub;
-Landroid/telephony/data/IQualifiedNetworksService;
-Landroid/telephony/data/IQualifiedNetworksServiceCallback$Stub$Proxy;
-Landroid/telephony/data/IQualifiedNetworksServiceCallback$Stub;
-Landroid/telephony/data/IQualifiedNetworksServiceCallback;
-Landroid/telephony/data/NetworkSliceInfo$1;
-Landroid/telephony/data/NetworkSliceInfo$Builder;
-Landroid/telephony/data/NetworkSliceInfo;
-Landroid/telephony/data/NetworkSlicingConfig$1;
-Landroid/telephony/data/NetworkSlicingConfig;
-Landroid/telephony/data/NrQos$1;
-Landroid/telephony/data/NrQos;
-Landroid/telephony/data/NrQosSessionAttributes$1;
-Landroid/telephony/data/NrQosSessionAttributes;
-Landroid/telephony/data/Qos$QosBandwidth$1;
-Landroid/telephony/data/Qos$QosBandwidth;
-Landroid/telephony/data/Qos;
-Landroid/telephony/data/QosBearerFilter$1;
-Landroid/telephony/data/QosBearerFilter$PortRange$1;
-Landroid/telephony/data/QosBearerFilter$PortRange;
-Landroid/telephony/data/QosBearerFilter;
-Landroid/telephony/data/QosBearerSession$1;
-Landroid/telephony/data/QosBearerSession;
-Landroid/telephony/data/ThrottleStatus$1;
-Landroid/telephony/data/ThrottleStatus$Builder;
-Landroid/telephony/data/ThrottleStatus;
-Landroid/telephony/data/TrafficDescriptor$1;
-Landroid/telephony/data/TrafficDescriptor$Builder;
-Landroid/telephony/data/TrafficDescriptor;
-Landroid/telephony/emergency/EmergencyNumber$1;
-Landroid/telephony/emergency/EmergencyNumber;
-Landroid/telephony/euicc/DownloadableSubscription$1;
-Landroid/telephony/euicc/DownloadableSubscription;
-Landroid/telephony/euicc/EuiccCardManager$10;
-Landroid/telephony/euicc/EuiccCardManager$11;
-Landroid/telephony/euicc/EuiccCardManager$12;
-Landroid/telephony/euicc/EuiccCardManager$13;
-Landroid/telephony/euicc/EuiccCardManager$14;
-Landroid/telephony/euicc/EuiccCardManager$15;
-Landroid/telephony/euicc/EuiccCardManager$16;
-Landroid/telephony/euicc/EuiccCardManager$17;
-Landroid/telephony/euicc/EuiccCardManager$18;
-Landroid/telephony/euicc/EuiccCardManager$19;
-Landroid/telephony/euicc/EuiccCardManager$1;
-Landroid/telephony/euicc/EuiccCardManager$20;
-Landroid/telephony/euicc/EuiccCardManager$21;
-Landroid/telephony/euicc/EuiccCardManager$22;
-Landroid/telephony/euicc/EuiccCardManager$2;
-Landroid/telephony/euicc/EuiccCardManager$3;
-Landroid/telephony/euicc/EuiccCardManager$4;
-Landroid/telephony/euicc/EuiccCardManager$5;
-Landroid/telephony/euicc/EuiccCardManager$6;
-Landroid/telephony/euicc/EuiccCardManager$7;
-Landroid/telephony/euicc/EuiccCardManager$8;
-Landroid/telephony/euicc/EuiccCardManager$9;
-Landroid/telephony/euicc/EuiccCardManager$ResultCallback;
-Landroid/telephony/euicc/EuiccCardManager;
-Landroid/telephony/euicc/EuiccInfo$1;
-Landroid/telephony/euicc/EuiccInfo;
-Landroid/telephony/euicc/EuiccManager;
-Landroid/telephony/euicc/EuiccNotification$1;
-Landroid/telephony/euicc/EuiccNotification;
-Landroid/telephony/euicc/EuiccRulesAuthTable$1;
-Landroid/telephony/euicc/EuiccRulesAuthTable$Builder;
-Landroid/telephony/euicc/EuiccRulesAuthTable;
-Landroid/telephony/gba/GbaAuthRequest$1;
-Landroid/telephony/gba/GbaAuthRequest;
-Landroid/telephony/gba/IGbaService$Stub;
-Landroid/telephony/gba/IGbaService;
-Landroid/telephony/gba/UaSecurityProtocolIdentifier$1;
-Landroid/telephony/gba/UaSecurityProtocolIdentifier;
-Landroid/telephony/gsm/GsmCellLocation;
-Landroid/telephony/gsm/SmsManager;
-Landroid/telephony/gsm/SmsMessage$MessageClass;
-Landroid/telephony/gsm/SmsMessage$SubmitPdu;
-Landroid/telephony/gsm/SmsMessage;
-Landroid/telephony/ims/AudioCodecAttributes$1;
-Landroid/telephony/ims/AudioCodecAttributes;
-Landroid/telephony/ims/ImsCallForwardInfo$1;
-Landroid/telephony/ims/ImsCallForwardInfo;
-Landroid/telephony/ims/ImsCallProfile$1;
-Landroid/telephony/ims/ImsCallProfile;
-Landroid/telephony/ims/ImsCallSession$Listener;
-Landroid/telephony/ims/ImsCallSession;
-Landroid/telephony/ims/ImsConferenceState$1;
-Landroid/telephony/ims/ImsConferenceState;
-Landroid/telephony/ims/ImsException;
-Landroid/telephony/ims/ImsExternalCallState$1;
-Landroid/telephony/ims/ImsExternalCallState;
-Landroid/telephony/ims/ImsManager$$ExternalSyntheticLambda0;
-Landroid/telephony/ims/ImsManager$$ExternalSyntheticLambda1;
-Landroid/telephony/ims/ImsManager;
-Landroid/telephony/ims/ImsMmTelManager$$ExternalSyntheticLambda0;
-Landroid/telephony/ims/ImsMmTelManager$$ExternalSyntheticLambda1;
-Landroid/telephony/ims/ImsMmTelManager$$ExternalSyntheticLambda3;
-Landroid/telephony/ims/ImsMmTelManager$1;
-Landroid/telephony/ims/ImsMmTelManager$2;
-Landroid/telephony/ims/ImsMmTelManager$3;
-Landroid/telephony/ims/ImsMmTelManager$4;
-Landroid/telephony/ims/ImsMmTelManager$CapabilityCallback$CapabilityBinder;
-Landroid/telephony/ims/ImsMmTelManager$CapabilityCallback;
-Landroid/telephony/ims/ImsMmTelManager$RegistrationCallback;
-Landroid/telephony/ims/ImsMmTelManager;
-Landroid/telephony/ims/ImsRcsManager;
-Landroid/telephony/ims/ImsReasonInfo$1;
-Landroid/telephony/ims/ImsReasonInfo-IA;
-Landroid/telephony/ims/ImsReasonInfo;
-Landroid/telephony/ims/ImsRegistrationAttributes$1;
-Landroid/telephony/ims/ImsRegistrationAttributes;
-Landroid/telephony/ims/ImsService$1;
-Landroid/telephony/ims/ImsService$Listener;
-Landroid/telephony/ims/ImsService;
-Landroid/telephony/ims/ImsSsData$1;
-Landroid/telephony/ims/ImsSsData;
-Landroid/telephony/ims/ImsSsInfo$1;
-Landroid/telephony/ims/ImsSsInfo$Builder;
-Landroid/telephony/ims/ImsSsInfo;
-Landroid/telephony/ims/ImsStreamMediaProfile$1;
-Landroid/telephony/ims/ImsStreamMediaProfile;
-Landroid/telephony/ims/ImsSuppServiceNotification$1;
-Landroid/telephony/ims/ImsSuppServiceNotification;
-Landroid/telephony/ims/ImsUtListener;
-Landroid/telephony/ims/MediaQualityStatus$1;
-Landroid/telephony/ims/MediaQualityStatus;
-Landroid/telephony/ims/ProvisioningManager$Callback$CallbackBinder;
-Landroid/telephony/ims/ProvisioningManager$Callback;
-Landroid/telephony/ims/ProvisioningManager;
-Landroid/telephony/ims/RcsContactPresenceTuple$1;
-Landroid/telephony/ims/RcsContactPresenceTuple$Builder;
-Landroid/telephony/ims/RcsContactPresenceTuple$ServiceCapabilities$1;
-Landroid/telephony/ims/RcsContactPresenceTuple$ServiceCapabilities$Builder;
-Landroid/telephony/ims/RcsContactPresenceTuple$ServiceCapabilities;
-Landroid/telephony/ims/RcsContactPresenceTuple;
-Landroid/telephony/ims/RcsContactTerminatedReason$1;
-Landroid/telephony/ims/RcsContactTerminatedReason;
-Landroid/telephony/ims/RcsContactUceCapability$1;
-Landroid/telephony/ims/RcsContactUceCapability$OptionsBuilder;
-Landroid/telephony/ims/RcsContactUceCapability$PresenceBuilder;
-Landroid/telephony/ims/RcsContactUceCapability;
-Landroid/telephony/ims/RcsUceAdapter;
-Landroid/telephony/ims/RegistrationManager$RegistrationCallback$RegistrationBinder$$ExternalSyntheticLambda1;
-Landroid/telephony/ims/RegistrationManager$RegistrationCallback$RegistrationBinder$$ExternalSyntheticLambda3;
-Landroid/telephony/ims/RegistrationManager$RegistrationCallback$RegistrationBinder;
-Landroid/telephony/ims/RegistrationManager$RegistrationCallback;
-Landroid/telephony/ims/RegistrationManager;
-Landroid/telephony/ims/RtpHeaderExtension$1;
-Landroid/telephony/ims/RtpHeaderExtension;
-Landroid/telephony/ims/RtpHeaderExtensionType$1;
-Landroid/telephony/ims/RtpHeaderExtensionType;
-Landroid/telephony/ims/aidl/ICapabilityExchangeEventListener$Stub;
-Landroid/telephony/ims/aidl/ICapabilityExchangeEventListener;
-Landroid/telephony/ims/aidl/IImsCapabilityCallback$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsCapabilityCallback$Stub;
-Landroid/telephony/ims/aidl/IImsCapabilityCallback;
-Landroid/telephony/ims/aidl/IImsConfig$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsConfig$Stub;
-Landroid/telephony/ims/aidl/IImsConfig;
-Landroid/telephony/ims/aidl/IImsConfigCallback$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsConfigCallback$Stub;
-Landroid/telephony/ims/aidl/IImsConfigCallback;
-Landroid/telephony/ims/aidl/IImsMmTelFeature$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsMmTelFeature$Stub;
-Landroid/telephony/ims/aidl/IImsMmTelFeature;
-Landroid/telephony/ims/aidl/IImsMmTelListener$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsMmTelListener$Stub;
-Landroid/telephony/ims/aidl/IImsMmTelListener;
-Landroid/telephony/ims/aidl/IImsRcsController$Stub;
-Landroid/telephony/ims/aidl/IImsRcsController;
-Landroid/telephony/ims/aidl/IImsRcsFeature$Stub;
-Landroid/telephony/ims/aidl/IImsRcsFeature;
-Landroid/telephony/ims/aidl/IImsRegistration$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsRegistration$Stub;
-Landroid/telephony/ims/aidl/IImsRegistration;
-Landroid/telephony/ims/aidl/IImsRegistrationCallback$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsRegistrationCallback$Stub;
-Landroid/telephony/ims/aidl/IImsRegistrationCallback;
-Landroid/telephony/ims/aidl/IImsServiceController$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsServiceController$Stub;
-Landroid/telephony/ims/aidl/IImsServiceController;
-Landroid/telephony/ims/aidl/IImsServiceControllerListener$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsServiceControllerListener$Stub;
-Landroid/telephony/ims/aidl/IImsServiceControllerListener;
-Landroid/telephony/ims/aidl/IImsSmsListener$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsSmsListener$Stub;
-Landroid/telephony/ims/aidl/IImsSmsListener;
-Landroid/telephony/ims/aidl/IOptionsRequestCallback;
-Landroid/telephony/ims/aidl/IOptionsResponseCallback$Stub;
-Landroid/telephony/ims/aidl/IOptionsResponseCallback;
-Landroid/telephony/ims/aidl/IPublishResponseCallback$Stub;
-Landroid/telephony/ims/aidl/IPublishResponseCallback;
-Landroid/telephony/ims/aidl/IRcsConfigCallback;
-Landroid/telephony/ims/aidl/IRcsUceControllerCallback;
-Landroid/telephony/ims/aidl/IRcsUcePublishStateCallback;
-Landroid/telephony/ims/aidl/ISipTransport;
-Landroid/telephony/ims/aidl/ISubscribeResponseCallback$Stub;
-Landroid/telephony/ims/aidl/ISubscribeResponseCallback;
-Landroid/telephony/ims/feature/CapabilityChangeRequest$1;
-Landroid/telephony/ims/feature/CapabilityChangeRequest$CapabilityPair;
-Landroid/telephony/ims/feature/CapabilityChangeRequest;
-Landroid/telephony/ims/feature/ImsFeature$Capabilities;
-Landroid/telephony/ims/feature/ImsFeature$CapabilityCallbackProxy;
-Landroid/telephony/ims/feature/ImsFeature;
-Landroid/telephony/ims/feature/MmTelFeature$1;
-Landroid/telephony/ims/feature/MmTelFeature$Listener;
-Landroid/telephony/ims/feature/MmTelFeature$MmTelCapabilities;
-Landroid/telephony/ims/feature/MmTelFeature;
-Landroid/telephony/ims/feature/RcsFeature$RcsImsCapabilities;
-Landroid/telephony/ims/feature/RcsFeature;
-Landroid/telephony/ims/stub/ImsCallSessionImplBase;
-Landroid/telephony/ims/stub/ImsConfigImplBase$ImsConfigStub;
-Landroid/telephony/ims/stub/ImsConfigImplBase;
-Landroid/telephony/ims/stub/ImsEcbmImplBase$1;
-Landroid/telephony/ims/stub/ImsEcbmImplBase;
-Landroid/telephony/ims/stub/ImsFeatureConfiguration$1;
-Landroid/telephony/ims/stub/ImsFeatureConfiguration$FeatureSlotPair;
-Landroid/telephony/ims/stub/ImsFeatureConfiguration;
-Landroid/telephony/ims/stub/ImsMultiEndpointImplBase$1;
-Landroid/telephony/ims/stub/ImsMultiEndpointImplBase;
-Landroid/telephony/ims/stub/ImsRegistrationImplBase$1;
-Landroid/telephony/ims/stub/ImsRegistrationImplBase;
-Landroid/telephony/ims/stub/ImsSmsImplBase;
-Landroid/telephony/ims/stub/ImsUtImplBase$1;
-Landroid/telephony/ims/stub/ImsUtImplBase;
-Landroid/telephony/satellite/SatelliteManager;
-Landroid/text/AndroidBidi;
-Landroid/text/AndroidCharacter;
-Landroid/text/Annotation;
-Landroid/text/AutoGrowArray$ByteArray;
-Landroid/text/AutoGrowArray$FloatArray;
-Landroid/text/AutoGrowArray$IntArray;
-Landroid/text/AutoGrowArray;
-Landroid/text/BidiFormatter$DirectionalityEstimator;
-Landroid/text/BidiFormatter;
-Landroid/text/BoringLayout$Metrics;
-Landroid/text/BoringLayout;
-Landroid/text/CharSequenceCharacterIterator;
-Landroid/text/ClientFlags;
-Landroid/text/ClipboardManager;
-Landroid/text/DynamicLayout$Builder;
-Landroid/text/DynamicLayout$ChangeWatcher;
-Landroid/text/DynamicLayout-IA;
-Landroid/text/DynamicLayout;
-Landroid/text/Editable$Factory;
-Landroid/text/Editable;
-Landroid/text/Emoji;
-Landroid/text/FontConfig$1;
-Landroid/text/FontConfig$Alias$1;
-Landroid/text/FontConfig$Alias;
-Landroid/text/FontConfig$Font$1;
-Landroid/text/FontConfig$Font;
-Landroid/text/FontConfig$FontFamily$1;
-Landroid/text/FontConfig$FontFamily;
-Landroid/text/FontConfig$NamedFamilyList$1;
-Landroid/text/FontConfig$NamedFamilyList;
-Landroid/text/FontConfig;
-Landroid/text/GetChars;
-Landroid/text/GraphicsOperations;
-Landroid/text/Highlights;
-Landroid/text/Html$HtmlParser;
-Landroid/text/Html$ImageGetter;
-Landroid/text/Html$TagHandler;
-Landroid/text/Html;
-Landroid/text/HtmlToSpannedConverter$Alignment;
-Landroid/text/HtmlToSpannedConverter$Background;
-Landroid/text/HtmlToSpannedConverter$Big-IA;
-Landroid/text/HtmlToSpannedConverter$Big;
-Landroid/text/HtmlToSpannedConverter$Blockquote-IA;
-Landroid/text/HtmlToSpannedConverter$Blockquote;
-Landroid/text/HtmlToSpannedConverter$Bold-IA;
-Landroid/text/HtmlToSpannedConverter$Bold;
-Landroid/text/HtmlToSpannedConverter$Bullet-IA;
-Landroid/text/HtmlToSpannedConverter$Bullet;
-Landroid/text/HtmlToSpannedConverter$Font;
-Landroid/text/HtmlToSpannedConverter$Foreground;
-Landroid/text/HtmlToSpannedConverter$Heading;
-Landroid/text/HtmlToSpannedConverter$Href;
-Landroid/text/HtmlToSpannedConverter$Italic-IA;
-Landroid/text/HtmlToSpannedConverter$Italic;
-Landroid/text/HtmlToSpannedConverter$Monospace-IA;
-Landroid/text/HtmlToSpannedConverter$Monospace;
-Landroid/text/HtmlToSpannedConverter$Newline;
-Landroid/text/HtmlToSpannedConverter$Small-IA;
-Landroid/text/HtmlToSpannedConverter$Small;
-Landroid/text/HtmlToSpannedConverter$Strikethrough-IA;
-Landroid/text/HtmlToSpannedConverter$Strikethrough;
-Landroid/text/HtmlToSpannedConverter$Sub-IA;
-Landroid/text/HtmlToSpannedConverter$Sub;
-Landroid/text/HtmlToSpannedConverter$Super-IA;
-Landroid/text/HtmlToSpannedConverter$Super;
-Landroid/text/HtmlToSpannedConverter$Underline-IA;
-Landroid/text/HtmlToSpannedConverter$Underline;
-Landroid/text/HtmlToSpannedConverter;
-Landroid/text/Hyphenator;
-Landroid/text/InputFilter$LengthFilter;
-Landroid/text/InputFilter;
-Landroid/text/InputType;
-Landroid/text/Layout$$ExternalSyntheticLambda0;
-Landroid/text/Layout$$ExternalSyntheticLambda1;
-Landroid/text/Layout$$ExternalSyntheticLambda2;
-Landroid/text/Layout$$ExternalSyntheticLambda3;
-Landroid/text/Layout$Alignment;
-Landroid/text/Layout$Directions;
-Landroid/text/Layout$Ellipsizer;
-Landroid/text/Layout$HorizontalMeasurementProvider;
-Landroid/text/Layout$SelectionRectangleConsumer;
-Landroid/text/Layout$SpannedEllipsizer;
-Landroid/text/Layout$TabStops;
-Landroid/text/Layout$TextInclusionStrategy;
-Landroid/text/Layout;
-Landroid/text/MeasuredParagraph;
-Landroid/text/NoCopySpan$Concrete;
-Landroid/text/NoCopySpan;
-Landroid/text/PackedIntVector;
-Landroid/text/PackedObjectVector;
-Landroid/text/ParcelableSpan;
-Landroid/text/PrecomputedText$ParagraphInfo;
-Landroid/text/PrecomputedText$Params$Builder;
-Landroid/text/PrecomputedText$Params;
-Landroid/text/PrecomputedText;
-Landroid/text/Selection$END;
-Landroid/text/Selection$MEMORY;
-Landroid/text/Selection$MemoryTextWatcher;
-Landroid/text/Selection$PositionIterator;
-Landroid/text/Selection$START;
-Landroid/text/Selection;
-Landroid/text/SpanSet;
-Landroid/text/SpanWatcher;
-Landroid/text/Spannable$Factory;
-Landroid/text/Spannable;
-Landroid/text/SpannableString;
-Landroid/text/SpannableStringBuilder;
-Landroid/text/SpannableStringInternal;
-Landroid/text/Spanned;
-Landroid/text/SpannedString;
-Landroid/text/StaticLayout$Builder;
-Landroid/text/StaticLayout$LineBreaks;
-Landroid/text/StaticLayout-IA;
-Landroid/text/StaticLayout;
-Landroid/text/TextDirectionHeuristic;
-Landroid/text/TextDirectionHeuristics$AnyStrong;
-Landroid/text/TextDirectionHeuristics$FirstStrong;
-Landroid/text/TextDirectionHeuristics$TextDirectionAlgorithm;
-Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicImpl;
-Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicInternal;
-Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicLocale;
-Landroid/text/TextDirectionHeuristics;
-Landroid/text/TextFlags;
-Landroid/text/TextLine$DecorationInfo-IA;
-Landroid/text/TextLine$DecorationInfo;
-Landroid/text/TextLine;
-Landroid/text/TextPaint;
-Landroid/text/TextShaper$GlyphsConsumer;
-Landroid/text/TextUtils$1;
-Landroid/text/TextUtils$EllipsizeCallback;
-Landroid/text/TextUtils$SimpleStringSplitter;
-Landroid/text/TextUtils$StringSplitter;
-Landroid/text/TextUtils$StringWithRemovedChars;
-Landroid/text/TextUtils$TruncateAt;
-Landroid/text/TextUtils;
-Landroid/text/TextWatcher;
-Landroid/text/format/DateFormat;
-Landroid/text/format/DateIntervalFormat;
-Landroid/text/format/DateTimeFormat$FormatterCache;
-Landroid/text/format/DateTimeFormat;
-Landroid/text/format/DateUtils;
-Landroid/text/format/DateUtilsBridge;
-Landroid/text/format/Formatter$BytesResult;
-Landroid/text/format/Formatter$RoundedBytesResult;
-Landroid/text/format/Formatter;
-Landroid/text/format/RelativeDateTimeFormatter$FormatterCache;
-Landroid/text/format/RelativeDateTimeFormatter;
-Landroid/text/format/Time$TimeCalculator;
-Landroid/text/format/Time;
-Landroid/text/format/TimeFormatter;
-Landroid/text/format/TimeMigrationUtils;
-Landroid/text/method/AllCapsTransformationMethod;
-Landroid/text/method/ArrowKeyMovementMethod;
-Landroid/text/method/BaseKeyListener$1;
-Landroid/text/method/BaseKeyListener;
-Landroid/text/method/BaseMovementMethod;
-Landroid/text/method/DateKeyListener;
-Landroid/text/method/DateTimeKeyListener;
-Landroid/text/method/DialerKeyListener;
-Landroid/text/method/DigitsKeyListener;
-Landroid/text/method/KeyListener;
-Landroid/text/method/LinkMovementMethod;
-Landroid/text/method/MetaKeyKeyListener;
-Landroid/text/method/MovementMethod;
-Landroid/text/method/MultiTapKeyListener;
-Landroid/text/method/NumberKeyListener;
-Landroid/text/method/OffsetMapping$TextUpdate;
-Landroid/text/method/OffsetMapping;
-Landroid/text/method/PasswordTransformationMethod;
-Landroid/text/method/QwertyKeyListener$Replaced;
-Landroid/text/method/QwertyKeyListener;
-Landroid/text/method/ReplacementTransformationMethod$ReplacementCharSequence;
-Landroid/text/method/ReplacementTransformationMethod$SpannedReplacementCharSequence;
-Landroid/text/method/ReplacementTransformationMethod;
-Landroid/text/method/ScrollingMovementMethod;
-Landroid/text/method/SingleLineTransformationMethod;
-Landroid/text/method/TextKeyListener$Capitalize;
-Landroid/text/method/TextKeyListener$NullKeyListener;
-Landroid/text/method/TextKeyListener$SettingsObserver;
-Landroid/text/method/TextKeyListener;
-Landroid/text/method/TimeKeyListener;
-Landroid/text/method/Touch$DragState;
-Landroid/text/method/Touch;
-Landroid/text/method/TransformationMethod2;
-Landroid/text/method/TransformationMethod;
-Landroid/text/method/WordIterator;
-Landroid/text/style/AbsoluteSizeSpan;
-Landroid/text/style/AccessibilityClickableSpan$1;
-Landroid/text/style/AccessibilityClickableSpan;
-Landroid/text/style/AccessibilityReplacementSpan$1;
-Landroid/text/style/AccessibilityReplacementSpan;
-Landroid/text/style/AccessibilityURLSpan;
-Landroid/text/style/AlignmentSpan$Standard;
-Landroid/text/style/AlignmentSpan;
-Landroid/text/style/BackgroundColorSpan;
-Landroid/text/style/BulletSpan;
-Landroid/text/style/CharacterStyle$Passthrough;
-Landroid/text/style/CharacterStyle;
-Landroid/text/style/ClickableSpan;
-Landroid/text/style/DrawableMarginSpan;
-Landroid/text/style/DynamicDrawableSpan;
-Landroid/text/style/EasyEditSpan;
-Landroid/text/style/ForegroundColorSpan;
-Landroid/text/style/ImageSpan;
-Landroid/text/style/LeadingMarginSpan$LeadingMarginSpan2;
-Landroid/text/style/LeadingMarginSpan$Standard;
-Landroid/text/style/LeadingMarginSpan;
-Landroid/text/style/LineBackgroundSpan$Standard;
-Landroid/text/style/LineBackgroundSpan;
-Landroid/text/style/LineBreakConfigSpan;
-Landroid/text/style/LineHeightSpan$Standard;
-Landroid/text/style/LineHeightSpan$WithDensity;
-Landroid/text/style/LineHeightSpan;
-Landroid/text/style/LocaleSpan;
-Landroid/text/style/MetricAffectingSpan$Passthrough;
-Landroid/text/style/MetricAffectingSpan;
-Landroid/text/style/ParagraphStyle;
-Landroid/text/style/QuoteSpan;
-Landroid/text/style/RelativeSizeSpan;
-Landroid/text/style/ReplacementSpan;
-Landroid/text/style/ScaleXSpan;
-Landroid/text/style/SpellCheckSpan;
-Landroid/text/style/StrikethroughSpan;
-Landroid/text/style/StyleSpan;
-Landroid/text/style/SubscriptSpan;
-Landroid/text/style/SuggestionRangeSpan$1;
-Landroid/text/style/SuggestionRangeSpan;
-Landroid/text/style/SuggestionSpan$1;
-Landroid/text/style/SuggestionSpan;
-Landroid/text/style/SuperscriptSpan;
-Landroid/text/style/TabStopSpan;
-Landroid/text/style/TextAppearanceSpan;
-Landroid/text/style/TtsSpan$Builder;
-Landroid/text/style/TtsSpan$MeasureBuilder;
-Landroid/text/style/TtsSpan$SemioticClassBuilder;
-Landroid/text/style/TtsSpan$TelephoneBuilder;
-Landroid/text/style/TtsSpan$VerbatimBuilder;
-Landroid/text/style/TtsSpan;
-Landroid/text/style/TypefaceSpan;
-Landroid/text/style/URLSpan;
-Landroid/text/style/UnderlineSpan;
-Landroid/text/style/UpdateAppearance;
-Landroid/text/style/UpdateLayout;
-Landroid/text/style/WrapTogetherSpan;
-Landroid/text/util/LinkSpec;
-Landroid/text/util/Linkify$$ExternalSyntheticLambda0;
-Landroid/text/util/Linkify$1;
-Landroid/text/util/Linkify$2;
-Landroid/text/util/Linkify$3;
-Landroid/text/util/Linkify$4;
-Landroid/text/util/Linkify$MatchFilter;
-Landroid/text/util/Linkify$TransformFilter;
-Landroid/text/util/Linkify;
-Landroid/text/util/Rfc822Token;
-Landroid/text/util/Rfc822Tokenizer;
-Landroid/timezone/CountryTimeZones$OffsetResult;
-Landroid/timezone/CountryTimeZones$TimeZoneMapping;
-Landroid/timezone/CountryTimeZones;
-Landroid/timezone/TelephonyLookup;
-Landroid/timezone/TelephonyNetwork;
-Landroid/timezone/TelephonyNetworkFinder;
-Landroid/timezone/TimeZoneFinder;
-Landroid/tracing/perfetto/CreateIncrementalStateArgs;
-Landroid/tracing/perfetto/CreateTlsStateArgs;
-Landroid/tracing/perfetto/DataSource;
-Landroid/tracing/perfetto/FlushCallbackArguments;
-Landroid/tracing/perfetto/Producer;
-Landroid/tracing/perfetto/StartCallbackArguments;
-Landroid/tracing/perfetto/StopCallbackArguments;
-Landroid/tracing/perfetto/TracingContext;
-Landroid/transition/ArcMotion;
-Landroid/transition/AutoTransition;
-Landroid/transition/ChangeBounds$10;
-Landroid/transition/ChangeBounds$1;
-Landroid/transition/ChangeBounds$2;
-Landroid/transition/ChangeBounds$3;
-Landroid/transition/ChangeBounds$4;
-Landroid/transition/ChangeBounds$5;
-Landroid/transition/ChangeBounds$6;
-Landroid/transition/ChangeBounds$7;
-Landroid/transition/ChangeBounds$8;
-Landroid/transition/ChangeBounds$9;
-Landroid/transition/ChangeBounds$ViewBounds;
-Landroid/transition/ChangeBounds;
-Landroid/transition/ChangeClipBounds;
-Landroid/transition/ChangeImageTransform$1;
-Landroid/transition/ChangeImageTransform$2;
-Landroid/transition/ChangeImageTransform;
-Landroid/transition/ChangeScroll;
-Landroid/transition/ChangeTransform$1;
-Landroid/transition/ChangeTransform$2;
-Landroid/transition/ChangeTransform;
-Landroid/transition/CircularPropagation;
-Landroid/transition/Explode;
-Landroid/transition/Fade$1;
-Landroid/transition/Fade$FadeAnimatorListener;
-Landroid/transition/Fade;
-Landroid/transition/PathMotion;
-Landroid/transition/PatternPathMotion;
-Landroid/transition/Recolor;
-Landroid/transition/Scene;
-Landroid/transition/Slide$1;
-Landroid/transition/Slide$2;
-Landroid/transition/Slide$3;
-Landroid/transition/Slide$4;
-Landroid/transition/Slide$5;
-Landroid/transition/Slide$6;
-Landroid/transition/Slide$CalculateSlide;
-Landroid/transition/Slide$CalculateSlideHorizontal;
-Landroid/transition/Slide$CalculateSlideVertical;
-Landroid/transition/Slide;
-Landroid/transition/Transition$1;
-Landroid/transition/Transition$2;
-Landroid/transition/Transition$3;
-Landroid/transition/Transition$AnimationInfo;
-Landroid/transition/Transition$EpicenterCallback;
-Landroid/transition/Transition$TransitionListener;
-Landroid/transition/Transition;
-Landroid/transition/TransitionInflater;
-Landroid/transition/TransitionListenerAdapter;
-Landroid/transition/TransitionManager$MultiListener$1;
-Landroid/transition/TransitionManager$MultiListener;
-Landroid/transition/TransitionManager;
-Landroid/transition/TransitionPropagation;
-Landroid/transition/TransitionSet$1;
-Landroid/transition/TransitionSet$TransitionSetListener;
-Landroid/transition/TransitionSet;
-Landroid/transition/TransitionUtils;
-Landroid/transition/TransitionValues;
-Landroid/transition/TransitionValuesMaps;
-Landroid/transition/Visibility$1;
-Landroid/transition/Visibility$DisappearListener;
-Landroid/transition/Visibility$VisibilityInfo-IA;
-Landroid/transition/Visibility$VisibilityInfo;
-Landroid/transition/Visibility;
-Landroid/transition/VisibilityPropagation;
-Landroid/transparency/BinaryTransparencyManager;
-Landroid/updatabledriver/UpdatableDriverProto$1;
-Landroid/updatabledriver/UpdatableDriverProto$Denylist;
-Landroid/updatabledriver/UpdatableDriverProto$DenylistOrBuilder;
-Landroid/updatabledriver/UpdatableDriverProto$Denylists$Builder;
-Landroid/updatabledriver/UpdatableDriverProto$Denylists;
-Landroid/updatabledriver/UpdatableDriverProto$DenylistsOrBuilder;
-Landroid/util/AndroidException;
-Landroid/util/AndroidRuntimeException;
-Landroid/util/ArrayMap$1;
-Landroid/util/ArraySet$1;
-Landroid/util/ArraySet;
-Landroid/util/AtomicFile;
-Landroid/util/AttributeSet;
-Landroid/util/BackupUtils$BadVersionException;
-Landroid/util/BackupUtils;
-Landroid/util/Base64$Coder;
-Landroid/util/Base64$Decoder;
-Landroid/util/Base64$Encoder;
-Landroid/util/Base64;
-Landroid/util/Base64OutputStream;
-Landroid/util/CharsetUtils;
-Landroid/util/CloseGuard;
-Landroid/util/ContainerHelpers;
-Landroid/util/DataUnit$1;
-Landroid/util/DataUnit$2;
-Landroid/util/DataUnit$3;
-Landroid/util/DataUnit$4;
-Landroid/util/DataUnit$5;
-Landroid/util/DataUnit$6;
-Landroid/util/DataUnit$7;
-Landroid/util/DataUnit$8;
-Landroid/util/DataUnit;
-Landroid/util/DebugUtils;
-Landroid/util/DisplayMetrics;
-Landroid/util/DisplayUtils;
-Landroid/util/Dumpable;
-Landroid/util/EmptyArray;
-Landroid/util/EventLog$Event;
-Landroid/util/EventLog;
-Landroid/util/ExceptionUtils;
-Landroid/util/FastImmutableArraySet$FastIterator;
-Landroid/util/FastImmutableArraySet;
-Landroid/util/FeatureFlagUtils;
-Landroid/util/FloatProperty;
-Landroid/util/Half;
-Landroid/util/IconDrawableFactory;
-Landroid/util/IndentingPrintWriter;
-Landroid/util/IntArray;
-Landroid/util/IntProperty;
-Landroid/util/JsonReader$1;
-Landroid/util/JsonReader;
-Landroid/util/JsonScope;
-Landroid/util/JsonToken;
-Landroid/util/JsonWriter$1;
-Landroid/util/JsonWriter;
-Landroid/util/KeyValueListParser$IntValue;
-Landroid/util/KeyValueListParser;
-Landroid/util/KeyValueSettingObserver$SettingObserver;
-Landroid/util/KeyValueSettingObserver;
-Landroid/util/LauncherIcons;
-Landroid/util/LocalLog$ReadOnlyLocalLog;
-Landroid/util/LocalLog;
-Landroid/util/Log$1;
-Landroid/util/Log$ImmediateLogWriter;
-Landroid/util/Log$PreloadHolder;
-Landroid/util/Log$TerribleFailure;
-Landroid/util/Log$TerribleFailureHandler;
-Landroid/util/Log;
-Landroid/util/LogPrinter;
-Landroid/util/LogWriter;
-Landroid/util/LongArray;
-Landroid/util/LongArrayQueue;
-Landroid/util/LongSparseArray$StringParcelling;
-Landroid/util/LongSparseArray;
-Landroid/util/LongSparseLongArray$Parcelling;
-Landroid/util/LongSparseLongArray;
-Landroid/util/LruCache;
-Landroid/util/MalformedJsonException;
-Landroid/util/MapCollections;
-Landroid/util/MathUtils;
-Landroid/util/MemoryIntArray$1;
-Landroid/util/MemoryIntArray-IA;
-Landroid/util/MemoryIntArray;
-Landroid/util/MergedConfiguration$1;
-Landroid/util/MergedConfiguration-IA;
-Landroid/util/MergedConfiguration;
-Landroid/util/MutableBoolean;
-Landroid/util/MutableInt;
-Landroid/util/MutableLong;
-Landroid/util/NtpTrustedTime$TimeResult;
-Landroid/util/NtpTrustedTime;
-Landroid/util/PackageUtils;
-Landroid/util/Pair;
-Landroid/util/PathParser$PathData;
-Landroid/util/PathParser;
-Landroid/util/Patterns;
-Landroid/util/Pools$Pool;
-Landroid/util/Pools$SimplePool;
-Landroid/util/Pools$SynchronizedPool;
-Landroid/util/PrefixPrinter;
-Landroid/util/PrintWriterPrinter;
-Landroid/util/Printer;
-Landroid/util/Property;
-Landroid/util/Range;
-Landroid/util/Rational;
-Landroid/util/RecurrenceRule$1;
-Landroid/util/RecurrenceRule$NonrecurringIterator;
-Landroid/util/RecurrenceRule$RecurringIterator;
-Landroid/util/RecurrenceRule;
-Landroid/util/ReflectiveProperty;
-Landroid/util/RotationUtils;
-Landroid/util/Singleton;
-Landroid/util/Size;
-Landroid/util/SizeF$1;
-Landroid/util/SizeF;
-Landroid/util/Slog;
-Landroid/util/SparseArray;
-Landroid/util/SparseArrayMap;
-Landroid/util/SparseBooleanArray;
-Landroid/util/SparseDoubleArray;
-Landroid/util/SparseIntArray;
-Landroid/util/SparseLongArray;
-Landroid/util/SparseSetArray;
-Landroid/util/Spline$LinearSpline;
-Landroid/util/Spline$MonotoneCubicSpline;
-Landroid/util/Spline;
-Landroid/util/StateSet;
-Landroid/util/StringBuilderPrinter;
-Landroid/util/SuperNotCalledException;
-Landroid/util/SystemConfigFileCommitEventLogger;
-Landroid/util/TimeFormatException;
-Landroid/util/TimeUtils;
-Landroid/util/TimedRemoteCaller;
-Landroid/util/TimingLogger;
-Landroid/util/TimingsTraceLog;
-Landroid/util/TrustedTime;
-Landroid/util/TypedValue;
-Landroid/util/UtilConfig;
-Landroid/util/Xml$Encoding;
-Landroid/util/Xml;
-Landroid/util/XmlPullAttributes;
-Landroid/util/apk/ApkSignatureSchemeV2Verifier$VerifiedSigner;
-Landroid/util/apk/ApkSignatureSchemeV2Verifier;
-Landroid/util/apk/ApkSignatureSchemeV3Verifier$PlatformNotSupportedException;
-Landroid/util/apk/ApkSignatureSchemeV3Verifier$VerifiedSigner;
-Landroid/util/apk/ApkSignatureSchemeV3Verifier;
-Landroid/util/apk/ApkSignatureSchemeV4Verifier$VerifiedSigner;
-Landroid/util/apk/ApkSignatureSchemeV4Verifier;
-Landroid/util/apk/ApkSignatureVerifier$SigningDetailsWithDigests;
-Landroid/util/apk/ApkSignatureVerifier;
-Landroid/util/apk/ApkSigningBlockUtils$1;
-Landroid/util/apk/ApkSigningBlockUtils$MultipleDigestDataDigester;
-Landroid/util/apk/ApkSigningBlockUtils$VerifiedProofOfRotation;
-Landroid/util/apk/ApkSigningBlockUtils;
-Landroid/util/apk/ByteBufferDataSource;
-Landroid/util/apk/ByteBufferFactory;
-Landroid/util/apk/DataDigester;
-Landroid/util/apk/DataSource;
-Landroid/util/apk/MemoryMappedFileDataSource;
-Landroid/util/apk/SignatureInfo;
-Landroid/util/apk/SignatureNotFoundException;
-Landroid/util/apk/VerbatimX509Certificate;
-Landroid/util/apk/VerityBuilder$BufferedDigester;
-Landroid/util/apk/VerityBuilder$VerityResult;
-Landroid/util/apk/VerityBuilder;
-Landroid/util/apk/WrappedX509Certificate;
-Landroid/util/apk/ZipUtils;
-Landroid/util/jar/StrictJarFile$EntryIterator;
-Landroid/util/jar/StrictJarFile$FDStream;
-Landroid/util/jar/StrictJarFile$JarFileInputStream;
-Landroid/util/jar/StrictJarFile$ZipInflaterInputStream;
-Landroid/util/jar/StrictJarFile;
-Landroid/util/jar/StrictJarManifest$Chunk;
-Landroid/util/jar/StrictJarManifest;
-Landroid/util/jar/StrictJarManifestReader;
-Landroid/util/jar/StrictJarVerifier$VerifierEntry;
-Landroid/util/jar/StrictJarVerifier;
-Landroid/util/proto/EncodedBuffer;
-Landroid/util/proto/ProtoInputStream;
-Landroid/util/proto/ProtoOutputStream;
-Landroid/util/proto/ProtoParseException;
-Landroid/util/proto/ProtoStream;
-Landroid/util/proto/ProtoUtils;
-Landroid/util/proto/WireTypeMismatchException;
-Landroid/view/AbsSavedState$1;
-Landroid/view/AbsSavedState$2;
-Landroid/view/AbsSavedState;
-Landroid/view/AccessibilityInteractionController$AccessibilityNodePrefetcher;
-Landroid/view/AccessibilityInteractionController$MessageHolder;
-Landroid/view/AccessibilityInteractionController$PrivateHandler;
-Landroid/view/AccessibilityInteractionController;
-Landroid/view/AccessibilityIterators$AbstractTextSegmentIterator;
-Landroid/view/AccessibilityIterators$CharacterTextSegmentIterator;
-Landroid/view/AccessibilityIterators$ParagraphTextSegmentIterator;
-Landroid/view/AccessibilityIterators$TextSegmentIterator;
-Landroid/view/AccessibilityIterators$WordTextSegmentIterator;
-Landroid/view/ActionMode$Callback2;
-Landroid/view/ActionMode$Callback;
-Landroid/view/ActionMode;
-Landroid/view/ActionProvider$SubUiVisibilityListener;
-Landroid/view/ActionProvider;
-Landroid/view/AppTransitionAnimationSpec$1;
-Landroid/view/AppTransitionAnimationSpec;
-Landroid/view/AttachedSurfaceControl$OnBufferTransformHintChangedListener;
-Landroid/view/AttachedSurfaceControl;
-Landroid/view/BatchedInputEventReceiver$1;
-Landroid/view/BatchedInputEventReceiver$BatchedInputRunnable;
-Landroid/view/BatchedInputEventReceiver;
-Landroid/view/Choreographer$1;
-Landroid/view/Choreographer$2;
-Landroid/view/Choreographer$3;
-Landroid/view/Choreographer$4;
-Landroid/view/Choreographer$CallbackQueue-IA;
-Landroid/view/Choreographer$CallbackQueue;
-Landroid/view/Choreographer$CallbackRecord-IA;
-Landroid/view/Choreographer$CallbackRecord;
-Landroid/view/Choreographer$FrameCallback;
-Landroid/view/Choreographer$FrameData;
-Landroid/view/Choreographer$FrameDisplayEventReceiver;
-Landroid/view/Choreographer$FrameHandler;
-Landroid/view/Choreographer$FrameTimeline;
-Landroid/view/Choreographer$VsyncCallback;
-Landroid/view/Choreographer-IA;
-Landroid/view/Choreographer;
-Landroid/view/CompositionSamplingListener;
-Landroid/view/ContextMenu$ContextMenuInfo;
-Landroid/view/ContextMenu;
-Landroid/view/ContextThemeWrapper;
-Landroid/view/CrossWindowBlurListeners$BlurEnabledListenerInternal;
-Landroid/view/CrossWindowBlurListeners;
-Landroid/view/CutoutSpecification$Parser;
-Landroid/view/CutoutSpecification;
-Landroid/view/Display$HdrCapabilities$1;
-Landroid/view/Display$HdrCapabilities-IA;
-Landroid/view/Display$HdrCapabilities;
-Landroid/view/Display$HdrSdrRatioListenerWrapper;
-Landroid/view/Display$Mode$1;
-Landroid/view/Display$Mode-IA;
-Landroid/view/Display$Mode;
-Landroid/view/Display;
-Landroid/view/DisplayAddress$Network$1;
-Landroid/view/DisplayAddress$Network;
-Landroid/view/DisplayAddress$Physical$1;
-Landroid/view/DisplayAddress$Physical-IA;
-Landroid/view/DisplayAddress$Physical;
-Landroid/view/DisplayAddress;
-Landroid/view/DisplayAdjustments;
-Landroid/view/DisplayCutout$Bounds-IA;
-Landroid/view/DisplayCutout$Bounds;
-Landroid/view/DisplayCutout$CutoutPathParserInfo;
-Landroid/view/DisplayCutout$ParcelableWrapper$1;
-Landroid/view/DisplayCutout$ParcelableWrapper;
-Landroid/view/DisplayCutout-IA;
-Landroid/view/DisplayCutout;
-Landroid/view/DisplayEventReceiver$FrameRateOverride;
-Landroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;
-Landroid/view/DisplayEventReceiver$VsyncEventData;
-Landroid/view/DisplayEventReceiver;
-Landroid/view/DisplayInfo$1;
-Landroid/view/DisplayInfo-IA;
-Landroid/view/DisplayInfo;
-Landroid/view/DisplayShape$1;
-Landroid/view/DisplayShape-IA;
-Landroid/view/DisplayShape;
-Landroid/view/DragEvent$1;
-Landroid/view/DragEvent;
-Landroid/view/FallbackEventHandler;
-Landroid/view/FocusFinder$$ExternalSyntheticLambda0;
-Landroid/view/FocusFinder$$ExternalSyntheticLambda1;
-Landroid/view/FocusFinder$1;
-Landroid/view/FocusFinder$FocusSorter$$ExternalSyntheticLambda0;
-Landroid/view/FocusFinder$FocusSorter$$ExternalSyntheticLambda1;
-Landroid/view/FocusFinder$FocusSorter;
-Landroid/view/FocusFinder$UserSpecifiedFocusComparator$NextFocusGetter;
-Landroid/view/FocusFinder$UserSpecifiedFocusComparator;
-Landroid/view/FocusFinder-IA;
-Landroid/view/FocusFinder;
-Landroid/view/FrameMetrics;
-Landroid/view/FrameMetricsObserver;
-Landroid/view/FrameStats;
-Landroid/view/GestureDetector$GestureHandler;
-Landroid/view/GestureDetector$OnContextClickListener;
-Landroid/view/GestureDetector$OnDoubleTapListener;
-Landroid/view/GestureDetector$OnGestureListener;
-Landroid/view/GestureDetector$SimpleOnGestureListener;
-Landroid/view/GestureDetector;
-Landroid/view/GhostView;
-Landroid/view/Gravity;
-Landroid/view/HandlerActionQueue$HandlerAction;
-Landroid/view/HandlerActionQueue;
-Landroid/view/HandwritingInitiator$HandwritableViewInfo;
-Landroid/view/HandwritingInitiator$HandwritingAreaTracker;
-Landroid/view/HandwritingInitiator$State-IA;
-Landroid/view/HandwritingInitiator$State;
-Landroid/view/HandwritingInitiator;
-Landroid/view/HapticScrollFeedbackProvider;
-Landroid/view/HdrRenderState;
-Landroid/view/IAppTransitionAnimationSpecsFuture$Stub$Proxy;
-Landroid/view/IAppTransitionAnimationSpecsFuture$Stub;
-Landroid/view/IAppTransitionAnimationSpecsFuture;
-Landroid/view/ICrossWindowBlurEnabledListener$Stub;
-Landroid/view/ICrossWindowBlurEnabledListener;
-Landroid/view/IDisplayChangeWindowController$Stub;
-Landroid/view/IDisplayChangeWindowController;
-Landroid/view/IDisplayFoldListener$Stub$Proxy;
-Landroid/view/IDisplayFoldListener$Stub;
-Landroid/view/IDisplayFoldListener;
-Landroid/view/IDisplayWindowInsetsController$Stub$Proxy;
-Landroid/view/IDisplayWindowInsetsController$Stub;
-Landroid/view/IDisplayWindowInsetsController;
-Landroid/view/IDisplayWindowListener$Stub$Proxy;
-Landroid/view/IDisplayWindowListener$Stub;
-Landroid/view/IDisplayWindowListener;
-Landroid/view/IDockedStackListener$Stub$Proxy;
-Landroid/view/IDockedStackListener$Stub;
-Landroid/view/IDockedStackListener;
-Landroid/view/IGraphicsStats$Stub$Proxy;
-Landroid/view/IGraphicsStats$Stub;
-Landroid/view/IGraphicsStats;
-Landroid/view/IGraphicsStatsCallback$Stub$Proxy;
-Landroid/view/IGraphicsStatsCallback$Stub;
-Landroid/view/IGraphicsStatsCallback;
-Landroid/view/IInputMonitorHost$Stub$Proxy;
-Landroid/view/IInputMonitorHost$Stub;
-Landroid/view/IInputMonitorHost;
-Landroid/view/IOnKeyguardExitResult$Stub$Proxy;
-Landroid/view/IOnKeyguardExitResult$Stub;
-Landroid/view/IOnKeyguardExitResult;
-Landroid/view/IPinnedTaskListener$Stub;
-Landroid/view/IPinnedTaskListener;
-Landroid/view/IRecentsAnimationController$Stub$Proxy;
-Landroid/view/IRecentsAnimationController$Stub;
-Landroid/view/IRecentsAnimationController;
-Landroid/view/IRecentsAnimationRunner$Stub$Proxy;
-Landroid/view/IRecentsAnimationRunner$Stub;
-Landroid/view/IRecentsAnimationRunner;
-Landroid/view/IRemoteAnimationFinishedCallback$Stub$Proxy;
-Landroid/view/IRemoteAnimationFinishedCallback$Stub;
-Landroid/view/IRemoteAnimationFinishedCallback;
-Landroid/view/IRemoteAnimationRunner$Stub$Proxy;
-Landroid/view/IRemoteAnimationRunner$Stub;
-Landroid/view/IRemoteAnimationRunner;
-Landroid/view/IRotationWatcher$Stub$Proxy;
-Landroid/view/IRotationWatcher$Stub;
-Landroid/view/IRotationWatcher;
-Landroid/view/IScrollCaptureCallbacks$Stub$Proxy;
-Landroid/view/IScrollCaptureCallbacks$Stub;
-Landroid/view/IScrollCaptureCallbacks;
-Landroid/view/IScrollCaptureResponseListener$Stub$Proxy;
-Landroid/view/IScrollCaptureResponseListener$Stub;
-Landroid/view/IScrollCaptureResponseListener;
-Landroid/view/ISensitiveContentProtectionManager$Stub;
-Landroid/view/ISensitiveContentProtectionManager;
-Landroid/view/ISurfaceControlViewHost;
-Landroid/view/ISurfaceControlViewHostParent$Stub;
-Landroid/view/ISurfaceControlViewHostParent;
-Landroid/view/ISystemGestureExclusionListener$Stub;
-Landroid/view/ISystemGestureExclusionListener;
-Landroid/view/IWallpaperVisibilityListener$Stub$Proxy;
-Landroid/view/IWallpaperVisibilityListener$Stub;
-Landroid/view/IWallpaperVisibilityListener;
-Landroid/view/IWindow$Stub;
-Landroid/view/IWindow;
-Landroid/view/IWindowFocusObserver$Stub;
-Landroid/view/IWindowFocusObserver;
-Landroid/view/IWindowId$Stub$Proxy;
-Landroid/view/IWindowId$Stub;
-Landroid/view/IWindowId;
-Landroid/view/IWindowManager$Stub$Proxy;
-Landroid/view/IWindowManager$Stub;
-Landroid/view/IWindowManager;
-Landroid/view/IWindowSession$Stub$Proxy;
-Landroid/view/IWindowSession$Stub;
-Landroid/view/IWindowSession;
-Landroid/view/IWindowSessionCallback$Stub$Proxy;
-Landroid/view/IWindowSessionCallback$Stub;
-Landroid/view/IWindowSessionCallback;
-Landroid/view/ImeFocusController$InputMethodManagerDelegate;
-Landroid/view/ImeFocusController;
-Landroid/view/ImeInsetsSourceConsumer;
-Landroid/view/InflateException;
-Landroid/view/InputApplicationHandle;
-Landroid/view/InputChannel$1;
-Landroid/view/InputChannel;
-Landroid/view/InputDevice$1;
-Landroid/view/InputDevice$MotionRange-IA;
-Landroid/view/InputDevice$MotionRange;
-Landroid/view/InputDevice$ViewBehavior;
-Landroid/view/InputDevice-IA;
-Landroid/view/InputDevice;
-Landroid/view/InputEvent$1;
-Landroid/view/InputEvent;
-Landroid/view/InputEventAssigner;
-Landroid/view/InputEventCompatProcessor;
-Landroid/view/InputEventConsistencyVerifier;
-Landroid/view/InputEventReceiver;
-Landroid/view/InputEventSender$1;
-Landroid/view/InputEventSender;
-Landroid/view/InputMonitor$1;
-Landroid/view/InputMonitor;
-Landroid/view/InputQueue$Callback;
-Landroid/view/InputQueue$FinishedInputEventCallback;
-Landroid/view/InputQueue;
-Landroid/view/InputWindowHandle;
-Landroid/view/InsetsAnimationControlCallbacks;
-Landroid/view/InsetsAnimationControlImpl$$ExternalSyntheticLambda0;
-Landroid/view/InsetsAnimationControlImpl;
-Landroid/view/InsetsAnimationControlRunner;
-Landroid/view/InsetsAnimationThread;
-Landroid/view/InsetsAnimationThreadControlRunner$$ExternalSyntheticLambda0;
-Landroid/view/InsetsAnimationThreadControlRunner$$ExternalSyntheticLambda1;
-Landroid/view/InsetsAnimationThreadControlRunner$1$$ExternalSyntheticLambda0;
-Landroid/view/InsetsAnimationThreadControlRunner$1$$ExternalSyntheticLambda1;
-Landroid/view/InsetsAnimationThreadControlRunner$1;
-Landroid/view/InsetsAnimationThreadControlRunner;
-Landroid/view/InsetsController$$ExternalSyntheticLambda0;
-Landroid/view/InsetsController$$ExternalSyntheticLambda10;
-Landroid/view/InsetsController$$ExternalSyntheticLambda11;
-Landroid/view/InsetsController$$ExternalSyntheticLambda12;
-Landroid/view/InsetsController$$ExternalSyntheticLambda1;
-Landroid/view/InsetsController$$ExternalSyntheticLambda2;
-Landroid/view/InsetsController$$ExternalSyntheticLambda3;
-Landroid/view/InsetsController$$ExternalSyntheticLambda4;
-Landroid/view/InsetsController$$ExternalSyntheticLambda5;
-Landroid/view/InsetsController$$ExternalSyntheticLambda6;
-Landroid/view/InsetsController$$ExternalSyntheticLambda7;
-Landroid/view/InsetsController$$ExternalSyntheticLambda8;
-Landroid/view/InsetsController$$ExternalSyntheticLambda9;
-Landroid/view/InsetsController$1;
-Landroid/view/InsetsController$2;
-Landroid/view/InsetsController$3;
-Landroid/view/InsetsController$Host;
-Landroid/view/InsetsController$InternalAnimationControlListener$$ExternalSyntheticLambda0;
-Landroid/view/InsetsController$InternalAnimationControlListener$$ExternalSyntheticLambda1;
-Landroid/view/InsetsController$InternalAnimationControlListener$$ExternalSyntheticLambda2;
-Landroid/view/InsetsController$InternalAnimationControlListener$$ExternalSyntheticLambda3;
-Landroid/view/InsetsController$InternalAnimationControlListener$$ExternalSyntheticLambda4;
-Landroid/view/InsetsController$InternalAnimationControlListener$1;
-Landroid/view/InsetsController$InternalAnimationControlListener$2;
-Landroid/view/InsetsController$InternalAnimationControlListener;
-Landroid/view/InsetsController$PendingControlRequest;
-Landroid/view/InsetsController$RunningAnimation;
-Landroid/view/InsetsController;
-Landroid/view/InsetsFlags;
-Landroid/view/InsetsFrameProvider$1;
-Landroid/view/InsetsFrameProvider;
-Landroid/view/InsetsResizeAnimationRunner;
-Landroid/view/InsetsSource$1;
-Landroid/view/InsetsSource;
-Landroid/view/InsetsSourceConsumer;
-Landroid/view/InsetsSourceControl$1;
-Landroid/view/InsetsSourceControl$Array$1;
-Landroid/view/InsetsSourceControl$Array;
-Landroid/view/InsetsSourceControl;
-Landroid/view/InsetsState$1;
-Landroid/view/InsetsState$OnTraverseCallbacks;
-Landroid/view/InsetsState;
-Landroid/view/InternalInsetsAnimationController;
-Landroid/view/KeyCharacterMap$1;
-Landroid/view/KeyCharacterMap$FallbackAction;
-Landroid/view/KeyCharacterMap$UnavailableException;
-Landroid/view/KeyCharacterMap-IA;
-Landroid/view/KeyCharacterMap;
-Landroid/view/KeyEvent$1;
-Landroid/view/KeyEvent$Callback;
-Landroid/view/KeyEvent$DispatcherState;
-Landroid/view/KeyEvent;
-Landroid/view/LayoutInflater$BlinkLayout$1;
-Landroid/view/LayoutInflater$BlinkLayout;
-Landroid/view/LayoutInflater$Factory2;
-Landroid/view/LayoutInflater$Factory;
-Landroid/view/LayoutInflater$FactoryMerger;
-Landroid/view/LayoutInflater$Filter;
-Landroid/view/LayoutInflater;
-Landroid/view/MagnificationSpec$1;
-Landroid/view/MagnificationSpec;
-Landroid/view/Menu;
-Landroid/view/MenuInflater$InflatedOnMenuItemClickListener;
-Landroid/view/MenuInflater$MenuState;
-Landroid/view/MenuInflater;
-Landroid/view/MenuItem$OnActionExpandListener;
-Landroid/view/MenuItem$OnMenuItemClickListener;
-Landroid/view/MenuItem;
-Landroid/view/MotionEvent$1;
-Landroid/view/MotionEvent$PointerCoords;
-Landroid/view/MotionEvent$PointerProperties;
-Landroid/view/MotionEvent;
-Landroid/view/MotionPredictor;
-Landroid/view/NativeVectorDrawableAnimator;
-Landroid/view/NotificationHeaderView$1;
-Landroid/view/NotificationHeaderView$HeaderTouchListener;
-Landroid/view/NotificationHeaderView;
-Landroid/view/NotificationTopLineView;
-Landroid/view/OnReceiveContentListener;
-Landroid/view/OrientationEventListener$SensorEventListenerImpl;
-Landroid/view/OrientationEventListener;
-Landroid/view/OrientationListener;
-Landroid/view/PendingInsetsController$PendingRequest;
-Landroid/view/PendingInsetsController;
-Landroid/view/PixelCopy$1;
-Landroid/view/PixelCopy$OnPixelCopyFinishedListener;
-Landroid/view/PixelCopy;
-Landroid/view/PointerIcon$1;
-Landroid/view/PointerIcon;
-Landroid/view/PrivacyIndicatorBounds$1;
-Landroid/view/PrivacyIndicatorBounds;
-Landroid/view/RemotableViewMethod;
-Landroid/view/RemoteAccessibilityController$RemoteAccessibilityEmbeddedConnection;
-Landroid/view/RemoteAccessibilityController;
-Landroid/view/RemoteAnimationAdapter$1;
-Landroid/view/RemoteAnimationAdapter;
-Landroid/view/RemoteAnimationDefinition$1;
-Landroid/view/RemoteAnimationDefinition$RemoteAnimationAdapterEntry$1;
-Landroid/view/RemoteAnimationDefinition$RemoteAnimationAdapterEntry;
-Landroid/view/RemoteAnimationDefinition;
-Landroid/view/RemoteAnimationTarget$1;
-Landroid/view/RemoteAnimationTarget;
-Landroid/view/RenderNodeAnimator;
-Landroid/view/RoundScrollbarRenderer;
-Landroid/view/RoundedCorner$1;
-Landroid/view/RoundedCorner;
-Landroid/view/RoundedCorners$1;
-Landroid/view/RoundedCorners;
-Landroid/view/ScaleGestureDetector$1;
-Landroid/view/ScaleGestureDetector$OnScaleGestureListener;
-Landroid/view/ScaleGestureDetector$SimpleOnScaleGestureListener;
-Landroid/view/ScaleGestureDetector;
-Landroid/view/ScrollCaptureSearchResults;
-Landroid/view/ScrollFeedbackProvider;
-Landroid/view/SearchEvent;
-Landroid/view/SoundEffectConstants;
-Landroid/view/SubMenu;
-Landroid/view/Surface$1;
-Landroid/view/Surface$CompatibleCanvas-IA;
-Landroid/view/Surface$CompatibleCanvas;
-Landroid/view/Surface$HwuiContext;
-Landroid/view/Surface$OutOfResourcesException;
-Landroid/view/Surface;
-Landroid/view/SurfaceControl$1;
-Landroid/view/SurfaceControl$Builder;
-Landroid/view/SurfaceControl$CieXyz;
-Landroid/view/SurfaceControl$DesiredDisplayModeSpecs;
-Landroid/view/SurfaceControl$DisplayMode;
-Landroid/view/SurfaceControl$DisplayPrimaries;
-Landroid/view/SurfaceControl$DynamicDisplayInfo;
-Landroid/view/SurfaceControl$JankData;
-Landroid/view/SurfaceControl$OnJankDataListener;
-Landroid/view/SurfaceControl$OnReparentListener;
-Landroid/view/SurfaceControl$RefreshRateRange$1;
-Landroid/view/SurfaceControl$RefreshRateRange;
-Landroid/view/SurfaceControl$RefreshRateRanges;
-Landroid/view/SurfaceControl$StaticDisplayInfo;
-Landroid/view/SurfaceControl$Transaction$1;
-Landroid/view/SurfaceControl$Transaction$2;
-Landroid/view/SurfaceControl$Transaction;
-Landroid/view/SurfaceControl$TransactionCommittedListener;
-Landroid/view/SurfaceControl$TransactionStats;
-Landroid/view/SurfaceControl$TrustedPresentationCallback;
-Landroid/view/SurfaceControl$TrustedPresentationThresholds;
-Landroid/view/SurfaceControl-IA;
-Landroid/view/SurfaceControl;
-Landroid/view/SurfaceControlHdrLayerInfoListener;
-Landroid/view/SurfaceControlRegistry$DefaultReporter-IA;
-Landroid/view/SurfaceControlRegistry$DefaultReporter;
-Landroid/view/SurfaceControlRegistry$NoOpRegistry-IA;
-Landroid/view/SurfaceControlRegistry$NoOpRegistry;
-Landroid/view/SurfaceControlRegistry$Reporter;
-Landroid/view/SurfaceControlRegistry-IA;
-Landroid/view/SurfaceControlRegistry;
-Landroid/view/SurfaceControlViewHost$SurfacePackage$1;
-Landroid/view/SurfaceControlViewHost$SurfacePackage;
-Landroid/view/SurfaceHolder$Callback2;
-Landroid/view/SurfaceHolder$Callback;
-Landroid/view/SurfaceHolder;
-Landroid/view/SurfaceSession;
-Landroid/view/SurfaceView$$ExternalSyntheticLambda0;
-Landroid/view/SurfaceView$$ExternalSyntheticLambda1;
-Landroid/view/SurfaceView$$ExternalSyntheticLambda2;
-Landroid/view/SurfaceView$$ExternalSyntheticLambda3;
-Landroid/view/SurfaceView$$ExternalSyntheticLambda4;
-Landroid/view/SurfaceView$$ExternalSyntheticLambda5;
-Landroid/view/SurfaceView$1;
-Landroid/view/SurfaceView$2;
-Landroid/view/SurfaceView$SurfaceViewPositionUpdateListener;
-Landroid/view/SurfaceView$SyncBufferTransactionCallback-IA;
-Landroid/view/SurfaceView$SyncBufferTransactionCallback;
-Landroid/view/SurfaceView;
-Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;
-Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams-IA;
-Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;
-Landroid/view/SyncRtSurfaceTransactionApplier;
-Landroid/view/TextureView$$ExternalSyntheticLambda0;
-Landroid/view/TextureView$$ExternalSyntheticLambda1;
-Landroid/view/TextureView$SurfaceTextureListener;
-Landroid/view/TextureView;
-Landroid/view/ThreadedRenderer$1$$ExternalSyntheticLambda0;
-Landroid/view/ThreadedRenderer$1;
-Landroid/view/ThreadedRenderer$DrawCallbacks;
-Landroid/view/ThreadedRenderer$WebViewOverlayProvider-IA;
-Landroid/view/ThreadedRenderer$WebViewOverlayProvider;
-Landroid/view/ThreadedRenderer;
-Landroid/view/TouchDelegate;
-Landroid/view/TunnelModeEnabledListener;
-Landroid/view/VelocityTracker;
-Landroid/view/VerifiedInputEvent$1;
-Landroid/view/VerifiedInputEvent;
-Landroid/view/VerifiedKeyEvent$1;
-Landroid/view/VerifiedKeyEvent;
-Landroid/view/VerifiedMotionEvent$1;
-Landroid/view/VerifiedMotionEvent;
-Landroid/view/View$$ExternalSyntheticLambda0;
-Landroid/view/View$$ExternalSyntheticLambda10;
-Landroid/view/View$$ExternalSyntheticLambda11;
-Landroid/view/View$$ExternalSyntheticLambda12;
-Landroid/view/View$$ExternalSyntheticLambda13;
-Landroid/view/View$$ExternalSyntheticLambda1;
-Landroid/view/View$$ExternalSyntheticLambda2;
-Landroid/view/View$$ExternalSyntheticLambda3;
-Landroid/view/View$$ExternalSyntheticLambda4;
-Landroid/view/View$$ExternalSyntheticLambda5;
-Landroid/view/View$$ExternalSyntheticLambda7;
-Landroid/view/View$$ExternalSyntheticLambda8;
-Landroid/view/View$$ExternalSyntheticLambda9;
-Landroid/view/View$10;
-Landroid/view/View$11;
-Landroid/view/View$12;
-Landroid/view/View$13;
-Landroid/view/View$1;
-Landroid/view/View$2;
-Landroid/view/View$3;
-Landroid/view/View$4;
-Landroid/view/View$5;
-Landroid/view/View$6;
-Landroid/view/View$7;
-Landroid/view/View$8;
-Landroid/view/View$9;
-Landroid/view/View$AccessibilityDelegate;
-Landroid/view/View$AttachInfo$Callbacks;
-Landroid/view/View$AttachInfo$InvalidateInfo;
-Landroid/view/View$AttachInfo;
-Landroid/view/View$BaseSavedState$1;
-Landroid/view/View$BaseSavedState;
-Landroid/view/View$CheckForLongPress-IA;
-Landroid/view/View$CheckForLongPress;
-Landroid/view/View$CheckForTap-IA;
-Landroid/view/View$CheckForTap;
-Landroid/view/View$DeclaredOnClickListener;
-Landroid/view/View$DragShadowBuilder;
-Landroid/view/View$ForegroundInfo-IA;
-Landroid/view/View$ForegroundInfo;
-Landroid/view/View$ListenerInfo;
-Landroid/view/View$MatchIdPredicate;
-Landroid/view/View$MatchLabelForPredicate;
-Landroid/view/View$MeasureSpec;
-Landroid/view/View$OnApplyWindowInsetsListener;
-Landroid/view/View$OnAttachStateChangeListener;
-Landroid/view/View$OnClickListener;
-Landroid/view/View$OnCreateContextMenuListener;
-Landroid/view/View$OnDragListener;
-Landroid/view/View$OnFocusChangeListener;
-Landroid/view/View$OnGenericMotionListener;
-Landroid/view/View$OnHoverListener;
-Landroid/view/View$OnKeyListener;
-Landroid/view/View$OnLayoutChangeListener;
-Landroid/view/View$OnLongClickListener;
-Landroid/view/View$OnScrollChangeListener;
-Landroid/view/View$OnSystemUiVisibilityChangeListener;
-Landroid/view/View$OnTouchListener;
-Landroid/view/View$PerformClick-IA;
-Landroid/view/View$PerformClick;
-Landroid/view/View$ScrollabilityCache;
-Landroid/view/View$SendAccessibilityEventThrottle;
-Landroid/view/View$SendViewScrolledAccessibilityEvent;
-Landroid/view/View$TintInfo;
-Landroid/view/View$TooltipInfo-IA;
-Landroid/view/View$TooltipInfo;
-Landroid/view/View$TransformationInfo;
-Landroid/view/View$UnsetPressedState-IA;
-Landroid/view/View$UnsetPressedState;
-Landroid/view/View$VisibilityChangeForAutofillHandler-IA;
-Landroid/view/View$VisibilityChangeForAutofillHandler;
-Landroid/view/View;
-Landroid/view/ViewAnimationHostBridge;
-Landroid/view/ViewAnimationUtils;
-Landroid/view/ViewConfiguration;
-Landroid/view/ViewCredentialHandler;
-Landroid/view/ViewDebug$ExportedProperty;
-Landroid/view/ViewDebug$FlagToString;
-Landroid/view/ViewDebug$HierarchyHandler;
-Landroid/view/ViewDebug$IntToString;
-Landroid/view/ViewDebug$ViewMethodInvocationSerializationException;
-Landroid/view/ViewDebug;
-Landroid/view/ViewFrameInfo;
-Landroid/view/ViewGroup$1;
-Landroid/view/ViewGroup$2;
-Landroid/view/ViewGroup$4;
-Landroid/view/ViewGroup$ChildListForAccessibility;
-Landroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;
-Landroid/view/ViewGroup$HoverTarget;
-Landroid/view/ViewGroup$LayoutParams;
-Landroid/view/ViewGroup$MarginLayoutParams;
-Landroid/view/ViewGroup$OnHierarchyChangeListener;
-Landroid/view/ViewGroup$TouchTarget;
-Landroid/view/ViewGroup$ViewLocationHolder;
-Landroid/view/ViewGroup;
-Landroid/view/ViewGroupOverlay;
-Landroid/view/ViewHierarchyEncoder;
-Landroid/view/ViewManager;
-Landroid/view/ViewOutlineProvider$1;
-Landroid/view/ViewOutlineProvider$2;
-Landroid/view/ViewOutlineProvider$3;
-Landroid/view/ViewOutlineProvider;
-Landroid/view/ViewOverlay$OverlayViewGroup;
-Landroid/view/ViewOverlay;
-Landroid/view/ViewParent;
-Landroid/view/ViewPropertyAnimator$1;
-Landroid/view/ViewPropertyAnimator$2;
-Landroid/view/ViewPropertyAnimator$3;
-Landroid/view/ViewPropertyAnimator$AnimatorEventListener-IA;
-Landroid/view/ViewPropertyAnimator$AnimatorEventListener;
-Landroid/view/ViewPropertyAnimator$NameValuesHolder;
-Landroid/view/ViewPropertyAnimator$PropertyBundle;
-Landroid/view/ViewPropertyAnimator;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda0;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda10;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda11;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda12;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda13;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda14;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda15;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda16;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda17;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda18;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda1;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda2;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda3;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda4;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda5;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda6;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda7;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda8;
-Landroid/view/ViewRootImpl$$ExternalSyntheticLambda9;
-Landroid/view/ViewRootImpl$1;
-Landroid/view/ViewRootImpl$2;
-Landroid/view/ViewRootImpl$3;
-Landroid/view/ViewRootImpl$4;
-Landroid/view/ViewRootImpl$5;
-Landroid/view/ViewRootImpl$6;
-Landroid/view/ViewRootImpl$7;
-Landroid/view/ViewRootImpl$8;
-Landroid/view/ViewRootImpl$9;
-Landroid/view/ViewRootImpl$AccessibilityInteractionConnection;
-Landroid/view/ViewRootImpl$AccessibilityInteractionConnectionManager;
-Landroid/view/ViewRootImpl$ActivityConfigCallback;
-Landroid/view/ViewRootImpl$AsyncInputStage;
-Landroid/view/ViewRootImpl$CalledFromWrongThreadException;
-Landroid/view/ViewRootImpl$ConfigChangedCallback;
-Landroid/view/ViewRootImpl$ConsumeBatchedInputImmediatelyRunnable;
-Landroid/view/ViewRootImpl$ConsumeBatchedInputRunnable;
-Landroid/view/ViewRootImpl$EarlyPostImeInputStage;
-Landroid/view/ViewRootImpl$GfxInfo;
-Landroid/view/ViewRootImpl$HighContrastTextManager;
-Landroid/view/ViewRootImpl$ImeInputStage;
-Landroid/view/ViewRootImpl$InputMetricsListener;
-Landroid/view/ViewRootImpl$InputStage;
-Landroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;
-Landroid/view/ViewRootImpl$NativePostImeInputStage;
-Landroid/view/ViewRootImpl$NativePreImeInputStage;
-Landroid/view/ViewRootImpl$QueuedInputEvent-IA;
-Landroid/view/ViewRootImpl$QueuedInputEvent;
-Landroid/view/ViewRootImpl$SendWindowContentChangedAccessibilityEvent;
-Landroid/view/ViewRootImpl$SurfaceChangedCallback;
-Landroid/view/ViewRootImpl$SyntheticInputStage;
-Landroid/view/ViewRootImpl$SyntheticJoystickHandler$JoystickAxesState;
-Landroid/view/ViewRootImpl$SyntheticJoystickHandler;
-Landroid/view/ViewRootImpl$SyntheticKeyboardHandler;
-Landroid/view/ViewRootImpl$SyntheticTouchNavigationHandler$1;
-Landroid/view/ViewRootImpl$SyntheticTouchNavigationHandler;
-Landroid/view/ViewRootImpl$SyntheticTrackballHandler;
-Landroid/view/ViewRootImpl$SystemUiVisibilityInfo;
-Landroid/view/ViewRootImpl$TakenSurfaceHolder;
-Landroid/view/ViewRootImpl$TrackballAxis;
-Landroid/view/ViewRootImpl$TraversalRunnable;
-Landroid/view/ViewRootImpl$UnhandledKeyManager-IA;
-Landroid/view/ViewRootImpl$UnhandledKeyManager;
-Landroid/view/ViewRootImpl$ViewPostImeInputStage;
-Landroid/view/ViewRootImpl$ViewPreImeInputStage;
-Landroid/view/ViewRootImpl$ViewRootHandler;
-Landroid/view/ViewRootImpl$W;
-Landroid/view/ViewRootImpl$WindowInputEventReceiver;
-Landroid/view/ViewRootImpl;
-Landroid/view/ViewRootInsetsControllerHost;
-Landroid/view/ViewRootRectTracker$ViewInfo;
-Landroid/view/ViewRootRectTracker;
-Landroid/view/ViewStructure$HtmlInfo$Builder;
-Landroid/view/ViewStructure$HtmlInfo;
-Landroid/view/ViewStructure;
-Landroid/view/ViewStub$OnInflateListener;
-Landroid/view/ViewStub$ViewReplaceRunnable;
-Landroid/view/ViewStub;
-Landroid/view/ViewTraversalTracingStrings;
-Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;
-Landroid/view/ViewTreeObserver$CopyOnWriteArray;
-Landroid/view/ViewTreeObserver$InternalInsetsInfo;
-Landroid/view/ViewTreeObserver$OnComputeInternalInsetsListener;
-Landroid/view/ViewTreeObserver$OnDrawListener;
-Landroid/view/ViewTreeObserver$OnEnterAnimationCompleteListener;
-Landroid/view/ViewTreeObserver$OnGlobalFocusChangeListener;
-Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;
-Landroid/view/ViewTreeObserver$OnPreDrawListener;
-Landroid/view/ViewTreeObserver$OnScrollChangedListener;
-Landroid/view/ViewTreeObserver$OnTouchModeChangeListener;
-Landroid/view/ViewTreeObserver$OnWindowAttachListener;
-Landroid/view/ViewTreeObserver$OnWindowFocusChangeListener;
-Landroid/view/ViewTreeObserver$OnWindowShownListener;
-Landroid/view/ViewTreeObserver$OnWindowVisibilityChangeListener;
-Landroid/view/ViewTreeObserver;
-Landroid/view/Window$Callback;
-Landroid/view/Window$DecorCallback;
-Landroid/view/Window$OnContentApplyWindowInsetsListener;
-Landroid/view/Window$OnFrameMetricsAvailableListener;
-Landroid/view/Window$OnWindowDismissedCallback;
-Landroid/view/Window$OnWindowSwipeDismissedCallback;
-Landroid/view/Window$WindowControllerCallback;
-Landroid/view/Window;
-Landroid/view/WindowAnimationFrameStats$1;
-Landroid/view/WindowAnimationFrameStats;
-Landroid/view/WindowCallbacks;
-Landroid/view/WindowContentFrameStats$1;
-Landroid/view/WindowContentFrameStats;
-Landroid/view/WindowId$1;
-Landroid/view/WindowId;
-Landroid/view/WindowInsets$Builder;
-Landroid/view/WindowInsets$Side;
-Landroid/view/WindowInsets$Type;
-Landroid/view/WindowInsets;
-Landroid/view/WindowInsetsAnimation$Bounds;
-Landroid/view/WindowInsetsAnimation$Callback;
-Landroid/view/WindowInsetsAnimation;
-Landroid/view/WindowInsetsAnimationControlListener;
-Landroid/view/WindowInsetsAnimationController;
-Landroid/view/WindowInsetsController$OnControllableInsetsChangedListener;
-Landroid/view/WindowInsetsController;
-Landroid/view/WindowLayout;
-Landroid/view/WindowLeaked;
-Landroid/view/WindowManager$BadTokenException;
-Landroid/view/WindowManager$InvalidDisplayException;
-Landroid/view/WindowManager$LayoutParams$1;
-Landroid/view/WindowManager$LayoutParams;
-Landroid/view/WindowManager;
-Landroid/view/WindowManagerGlobal$$ExternalSyntheticLambda0;
-Landroid/view/WindowManagerGlobal$1;
-Landroid/view/WindowManagerGlobal$2;
-Landroid/view/WindowManagerGlobal$TrustedPresentationListener;
-Landroid/view/WindowManagerGlobal;
-Landroid/view/WindowManagerImpl;
-Landroid/view/WindowManagerPolicyConstants$PointerEventListener;
-Landroid/view/WindowManagerPolicyConstants;
-Landroid/view/WindowMetrics;
-Landroid/view/WindowlessWindowLayout;
-Landroid/view/WindowlessWindowManager;
-Landroid/view/accessibility/AccessibilityCache$AccessibilityNodeRefresher;
-Landroid/view/accessibility/AccessibilityCache;
-Landroid/view/accessibility/AccessibilityEvent$1;
-Landroid/view/accessibility/AccessibilityEvent;
-Landroid/view/accessibility/AccessibilityEventSource;
-Landroid/view/accessibility/AccessibilityInteractionClient;
-Landroid/view/accessibility/AccessibilityManager$$ExternalSyntheticLambda0;
-Landroid/view/accessibility/AccessibilityManager$$ExternalSyntheticLambda1;
-Landroid/view/accessibility/AccessibilityManager$$ExternalSyntheticLambda3;
-Landroid/view/accessibility/AccessibilityManager$1$$ExternalSyntheticLambda0;
-Landroid/view/accessibility/AccessibilityManager$1;
-Landroid/view/accessibility/AccessibilityManager$AccessibilityPolicy;
-Landroid/view/accessibility/AccessibilityManager$AccessibilityServicesStateChangeListener;
-Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;
-Landroid/view/accessibility/AccessibilityManager$HighTextContrastChangeListener;
-Landroid/view/accessibility/AccessibilityManager$MyCallback-IA;
-Landroid/view/accessibility/AccessibilityManager$MyCallback;
-Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;
-Landroid/view/accessibility/AccessibilityManager;
-Landroid/view/accessibility/AccessibilityNodeIdManager;
-Landroid/view/accessibility/AccessibilityNodeInfo$1;
-Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction$1;
-Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;
-Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;
-Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;
-Landroid/view/accessibility/AccessibilityNodeInfo$ExtraRenderingInfo;
-Landroid/view/accessibility/AccessibilityNodeInfo$RangeInfo;
-Landroid/view/accessibility/AccessibilityNodeInfo$TouchDelegateInfo$1;
-Landroid/view/accessibility/AccessibilityNodeInfo$TouchDelegateInfo;
-Landroid/view/accessibility/AccessibilityNodeInfo;
-Landroid/view/accessibility/AccessibilityNodeProvider;
-Landroid/view/accessibility/AccessibilityRecord;
-Landroid/view/accessibility/AccessibilityRequestPreparer;
-Landroid/view/accessibility/AccessibilityWindowAttributes$1;
-Landroid/view/accessibility/AccessibilityWindowAttributes;
-Landroid/view/accessibility/CaptioningManager$1;
-Landroid/view/accessibility/CaptioningManager$CaptionStyle;
-Landroid/view/accessibility/CaptioningManager$CaptioningChangeListener;
-Landroid/view/accessibility/CaptioningManager$MyContentObserver;
-Landroid/view/accessibility/CaptioningManager;
-Landroid/view/accessibility/DirectAccessibilityConnection;
-Landroid/view/accessibility/Flags;
-Landroid/view/accessibility/IAccessibilityEmbeddedConnection;
-Landroid/view/accessibility/IAccessibilityInteractionConnection$Stub$Proxy;
-Landroid/view/accessibility/IAccessibilityInteractionConnection$Stub;
-Landroid/view/accessibility/IAccessibilityInteractionConnection;
-Landroid/view/accessibility/IAccessibilityInteractionConnectionCallback$Stub$Proxy;
-Landroid/view/accessibility/IAccessibilityInteractionConnectionCallback$Stub;
-Landroid/view/accessibility/IAccessibilityInteractionConnectionCallback;
-Landroid/view/accessibility/IAccessibilityManager$Stub$Proxy;
-Landroid/view/accessibility/IAccessibilityManager$Stub;
-Landroid/view/accessibility/IAccessibilityManager;
-Landroid/view/accessibility/IAccessibilityManagerClient$Stub$Proxy;
-Landroid/view/accessibility/IAccessibilityManagerClient$Stub;
-Landroid/view/accessibility/IAccessibilityManagerClient;
-Landroid/view/accessibility/WeakSparseArray$WeakReferenceWithId;
-Landroid/view/accessibility/WeakSparseArray;
-Landroid/view/animation/AccelerateDecelerateInterpolator;
-Landroid/view/animation/AccelerateInterpolator;
-Landroid/view/animation/AlphaAnimation;
-Landroid/view/animation/Animation$1;
-Landroid/view/animation/Animation$2;
-Landroid/view/animation/Animation$3;
-Landroid/view/animation/Animation$AnimationListener;
-Landroid/view/animation/Animation$Description;
-Landroid/view/animation/Animation$NoImagePreloadHolder;
-Landroid/view/animation/Animation;
-Landroid/view/animation/AnimationSet;
-Landroid/view/animation/AnimationUtils$1;
-Landroid/view/animation/AnimationUtils$AnimationState-IA;
-Landroid/view/animation/AnimationUtils$AnimationState;
-Landroid/view/animation/AnimationUtils;
-Landroid/view/animation/AnticipateInterpolator;
-Landroid/view/animation/AnticipateOvershootInterpolator;
-Landroid/view/animation/BaseInterpolator;
-Landroid/view/animation/BounceInterpolator;
-Landroid/view/animation/ClipRectAnimation;
-Landroid/view/animation/CycleInterpolator;
-Landroid/view/animation/DecelerateInterpolator;
-Landroid/view/animation/ExtendAnimation;
-Landroid/view/animation/GridLayoutAnimationController;
-Landroid/view/animation/Interpolator;
-Landroid/view/animation/LayoutAnimationController;
-Landroid/view/animation/LinearInterpolator;
-Landroid/view/animation/OvershootInterpolator;
-Landroid/view/animation/PathInterpolator;
-Landroid/view/animation/RotateAnimation;
-Landroid/view/animation/ScaleAnimation;
-Landroid/view/animation/Transformation;
-Landroid/view/animation/TranslateAnimation;
-Landroid/view/autofill/AutofillClientController;
-Landroid/view/autofill/AutofillFeatureFlags$$ExternalSyntheticLambda0;
-Landroid/view/autofill/AutofillFeatureFlags$$ExternalSyntheticLambda1;
-Landroid/view/autofill/AutofillFeatureFlags;
-Landroid/view/autofill/AutofillId$1;
-Landroid/view/autofill/AutofillId-IA;
-Landroid/view/autofill/AutofillId;
-Landroid/view/autofill/AutofillManager$$ExternalSyntheticLambda0;
-Landroid/view/autofill/AutofillManager$$ExternalSyntheticLambda1;
-Landroid/view/autofill/AutofillManager$$ExternalSyntheticLambda2;
-Landroid/view/autofill/AutofillManager$$ExternalSyntheticLambda3;
-Landroid/view/autofill/AutofillManager$$ExternalSyntheticLambda4;
-Landroid/view/autofill/AutofillManager$AugmentedAutofillManagerClient-IA;
-Landroid/view/autofill/AutofillManager$AugmentedAutofillManagerClient;
-Landroid/view/autofill/AutofillManager$AutofillCallback;
-Landroid/view/autofill/AutofillManager$AutofillClient;
-Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda10;
-Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda11;
-Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda13;
-Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda14;
-Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda16;
-Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda18;
-Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda8;
-Landroid/view/autofill/AutofillManager$AutofillManagerClient-IA;
-Landroid/view/autofill/AutofillManager$AutofillManagerClient;
-Landroid/view/autofill/AutofillManager$CompatibilityBridge;
-Landroid/view/autofill/AutofillManager$TrackedViews;
-Landroid/view/autofill/AutofillManager;
-Landroid/view/autofill/AutofillManagerInternal;
-Landroid/view/autofill/AutofillPopupWindow;
-Landroid/view/autofill/AutofillValue$1;
-Landroid/view/autofill/AutofillValue-IA;
-Landroid/view/autofill/AutofillValue;
-Landroid/view/autofill/Helper;
-Landroid/view/autofill/IAugmentedAutofillManagerClient$Stub;
-Landroid/view/autofill/IAugmentedAutofillManagerClient;
-Landroid/view/autofill/IAutoFillManager$Stub$Proxy;
-Landroid/view/autofill/IAutoFillManager$Stub;
-Landroid/view/autofill/IAutoFillManager;
-Landroid/view/autofill/IAutoFillManagerClient$Stub$Proxy;
-Landroid/view/autofill/IAutoFillManagerClient$Stub;
-Landroid/view/autofill/IAutoFillManagerClient;
-Landroid/view/autofill/IAutofillWindowPresenter$Stub$Proxy;
-Landroid/view/autofill/IAutofillWindowPresenter$Stub;
-Landroid/view/autofill/IAutofillWindowPresenter;
-Landroid/view/autofill/ParcelableMap$1;
-Landroid/view/autofill/ParcelableMap;
-Landroid/view/contentcapture/ContentCaptureCondition$1;
-Landroid/view/contentcapture/ContentCaptureCondition;
-Landroid/view/contentcapture/ContentCaptureContext$1;
-Landroid/view/contentcapture/ContentCaptureContext$Builder;
-Landroid/view/contentcapture/ContentCaptureContext;
-Landroid/view/contentcapture/ContentCaptureEvent$1;
-Landroid/view/contentcapture/ContentCaptureEvent;
-Landroid/view/contentcapture/ContentCaptureHelper;
-Landroid/view/contentcapture/ContentCaptureManager$ContentCaptureClient;
-Landroid/view/contentcapture/ContentCaptureManager$LocalDataShareAdapterResourceManager-IA;
-Landroid/view/contentcapture/ContentCaptureManager$LocalDataShareAdapterResourceManager;
-Landroid/view/contentcapture/ContentCaptureManager$StrippedContext;
-Landroid/view/contentcapture/ContentCaptureManager;
-Landroid/view/contentcapture/ContentCaptureSession;
-Landroid/view/contentcapture/ContentCaptureSessionId$1;
-Landroid/view/contentcapture/ContentCaptureSessionId;
-Landroid/view/contentcapture/DataRemovalRequest$1;
-Landroid/view/contentcapture/DataRemovalRequest$LocusIdRequest;
-Landroid/view/contentcapture/DataRemovalRequest;
-Landroid/view/contentcapture/DataShareRequest$1;
-Landroid/view/contentcapture/DataShareRequest;
-Landroid/view/contentcapture/IContentCaptureDirectManager$Stub$Proxy;
-Landroid/view/contentcapture/IContentCaptureDirectManager$Stub;
-Landroid/view/contentcapture/IContentCaptureDirectManager;
-Landroid/view/contentcapture/IContentCaptureManager$Stub$Proxy;
-Landroid/view/contentcapture/IContentCaptureManager$Stub;
-Landroid/view/contentcapture/IContentCaptureManager;
-Landroid/view/contentcapture/IContentCaptureOptionsCallback$Stub;
-Landroid/view/contentcapture/IContentCaptureOptionsCallback;
-Landroid/view/contentcapture/IDataShareWriteAdapter$Stub$Proxy;
-Landroid/view/contentcapture/IDataShareWriteAdapter$Stub;
-Landroid/view/contentcapture/IDataShareWriteAdapter;
-Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda0;
-Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda10;
-Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda11;
-Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda12;
-Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda13;
-Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda1;
-Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda2;
-Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda3;
-Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda4;
-Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda5;
-Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda6;
-Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda8;
-Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda9;
-Landroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver$$ExternalSyntheticLambda0;
-Landroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver$$ExternalSyntheticLambda1;
-Landroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver;
-Landroid/view/contentcapture/MainContentCaptureSession;
-Landroid/view/contentcapture/ViewNode$ViewNodeText;
-Landroid/view/contentcapture/ViewNode$ViewStructureImpl;
-Landroid/view/contentcapture/ViewNode;
-Landroid/view/contentprotection/ContentProtectionEventProcessor;
-Landroid/view/displayhash/DisplayHash$1;
-Landroid/view/displayhash/DisplayHash;
-Landroid/view/displayhash/DisplayHashManager;
-Landroid/view/displayhash/DisplayHashResultCallback;
-Landroid/view/flags/FeatureFlags;
-Landroid/view/flags/FeatureFlagsImpl;
-Landroid/view/flags/Flags;
-Landroid/view/inputmethod/BaseInputConnection;
-Landroid/view/inputmethod/CancellableHandwritingGesture;
-Landroid/view/inputmethod/CompletionInfo$1;
-Landroid/view/inputmethod/CompletionInfo;
-Landroid/view/inputmethod/ComposingText;
-Landroid/view/inputmethod/CorrectionInfo$1;
-Landroid/view/inputmethod/CorrectionInfo;
-Landroid/view/inputmethod/CursorAnchorInfo$1;
-Landroid/view/inputmethod/CursorAnchorInfo$Builder;
-Landroid/view/inputmethod/CursorAnchorInfo;
-Landroid/view/inputmethod/DeleteGesture$1;
-Landroid/view/inputmethod/DeleteGesture;
-Landroid/view/inputmethod/DeleteRangeGesture$1;
-Landroid/view/inputmethod/DeleteRangeGesture;
-Landroid/view/inputmethod/DumpableInputConnection;
-Landroid/view/inputmethod/EditorBoundsInfo$1;
-Landroid/view/inputmethod/EditorBoundsInfo$Builder;
-Landroid/view/inputmethod/EditorBoundsInfo;
-Landroid/view/inputmethod/EditorInfo$1;
-Landroid/view/inputmethod/EditorInfo;
-Landroid/view/inputmethod/ExtractedText$1;
-Landroid/view/inputmethod/ExtractedText;
-Landroid/view/inputmethod/ExtractedTextRequest$1;
-Landroid/view/inputmethod/ExtractedTextRequest;
-Landroid/view/inputmethod/Flags;
-Landroid/view/inputmethod/HandwritingGesture;
-Landroid/view/inputmethod/IAccessibilityInputMethodSessionInvoker$$ExternalSyntheticLambda0;
-Landroid/view/inputmethod/IAccessibilityInputMethodSessionInvoker$$ExternalSyntheticLambda1;
-Landroid/view/inputmethod/IAccessibilityInputMethodSessionInvoker;
-Landroid/view/inputmethod/IInputMethodManagerGlobalInvoker;
-Landroid/view/inputmethod/IInputMethodSessionInvoker$$ExternalSyntheticLambda0;
-Landroid/view/inputmethod/IInputMethodSessionInvoker$$ExternalSyntheticLambda3;
-Landroid/view/inputmethod/IInputMethodSessionInvoker$$ExternalSyntheticLambda4;
-Landroid/view/inputmethod/IInputMethodSessionInvoker$$ExternalSyntheticLambda5;
-Landroid/view/inputmethod/IInputMethodSessionInvoker$$ExternalSyntheticLambda6;
-Landroid/view/inputmethod/IInputMethodSessionInvoker$$ExternalSyntheticLambda8;
-Landroid/view/inputmethod/IInputMethodSessionInvoker;
-Landroid/view/inputmethod/ImeTracker$1$$ExternalSyntheticLambda0;
-Landroid/view/inputmethod/ImeTracker$1;
-Landroid/view/inputmethod/ImeTracker$Debug$$ExternalSyntheticLambda0;
-Landroid/view/inputmethod/ImeTracker$Debug$$ExternalSyntheticLambda1;
-Landroid/view/inputmethod/ImeTracker$Debug$$ExternalSyntheticLambda2;
-Landroid/view/inputmethod/ImeTracker$Debug;
-Landroid/view/inputmethod/ImeTracker$ImeJankTracker-IA;
-Landroid/view/inputmethod/ImeTracker$ImeJankTracker;
-Landroid/view/inputmethod/ImeTracker$ImeLatencyTracker-IA;
-Landroid/view/inputmethod/ImeTracker$ImeLatencyTracker;
-Landroid/view/inputmethod/ImeTracker$InputMethodJankContext;
-Landroid/view/inputmethod/ImeTracker$InputMethodLatencyContext;
-Landroid/view/inputmethod/ImeTracker$Token$1;
-Landroid/view/inputmethod/ImeTracker$Token-IA;
-Landroid/view/inputmethod/ImeTracker$Token;
-Landroid/view/inputmethod/ImeTracker;
-Landroid/view/inputmethod/InlineSuggestionsRequest$1;
-Landroid/view/inputmethod/InlineSuggestionsRequest;
-Landroid/view/inputmethod/InlineSuggestionsResponse$1;
-Landroid/view/inputmethod/InlineSuggestionsResponse;
-Landroid/view/inputmethod/InputBinding$1;
-Landroid/view/inputmethod/InputBinding;
-Landroid/view/inputmethod/InputConnection;
-Landroid/view/inputmethod/InputConnectionWrapper;
-Landroid/view/inputmethod/InputContentInfo$1;
-Landroid/view/inputmethod/InputContentInfo;
-Landroid/view/inputmethod/InputMethod$SessionCallback;
-Landroid/view/inputmethod/InputMethod;
-Landroid/view/inputmethod/InputMethodInfo$1;
-Landroid/view/inputmethod/InputMethodInfo;
-Landroid/view/inputmethod/InputMethodManager$$ExternalSyntheticLambda0;
-Landroid/view/inputmethod/InputMethodManager$$ExternalSyntheticLambda1;
-Landroid/view/inputmethod/InputMethodManager$$ExternalSyntheticLambda2;
-Landroid/view/inputmethod/InputMethodManager$$ExternalSyntheticLambda3;
-Landroid/view/inputmethod/InputMethodManager$$ExternalSyntheticLambda4;
-Landroid/view/inputmethod/InputMethodManager$$ExternalSyntheticLambda5;
-Landroid/view/inputmethod/InputMethodManager$1;
-Landroid/view/inputmethod/InputMethodManager$2;
-Landroid/view/inputmethod/InputMethodManager$6;
-Landroid/view/inputmethod/InputMethodManager$BindState;
-Landroid/view/inputmethod/InputMethodManager$DelegateImpl-IA;
-Landroid/view/inputmethod/InputMethodManager$DelegateImpl;
-Landroid/view/inputmethod/InputMethodManager$FinishedInputEventCallback;
-Landroid/view/inputmethod/InputMethodManager$H$$ExternalSyntheticLambda0;
-Landroid/view/inputmethod/InputMethodManager$H$$ExternalSyntheticLambda1;
-Landroid/view/inputmethod/InputMethodManager$H;
-Landroid/view/inputmethod/InputMethodManager$ImeInputEventSender;
-Landroid/view/inputmethod/InputMethodManager$PendingEvent-IA;
-Landroid/view/inputmethod/InputMethodManager$PendingEvent;
-Landroid/view/inputmethod/InputMethodManager$ReportInputConnectionOpenedRunner;
-Landroid/view/inputmethod/InputMethodManager;
-Landroid/view/inputmethod/InputMethodManagerGlobal;
-Landroid/view/inputmethod/InputMethodSession$EventCallback;
-Landroid/view/inputmethod/InputMethodSession;
-Landroid/view/inputmethod/InputMethodSubtype$1;
-Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;
-Landroid/view/inputmethod/InputMethodSubtype;
-Landroid/view/inputmethod/InputMethodSubtypeArray;
-Landroid/view/inputmethod/InsertGesture$1;
-Landroid/view/inputmethod/InsertGesture;
-Landroid/view/inputmethod/InsertModeGesture$1;
-Landroid/view/inputmethod/InsertModeGesture;
-Landroid/view/inputmethod/JoinOrSplitGesture$1;
-Landroid/view/inputmethod/JoinOrSplitGesture;
-Landroid/view/inputmethod/ParcelableHandwritingGesture$1;
-Landroid/view/inputmethod/ParcelableHandwritingGesture;
-Landroid/view/inputmethod/PreviewableHandwritingGesture;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda11;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda12;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda16;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda1;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda24;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda25;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda27;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda28;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda36;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda37;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda39;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda40;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda42;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda50;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$$ExternalSyntheticLambda8;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$1;
-Landroid/view/inputmethod/RemoteInputConnectionImpl$KnownAlwaysTrueEndBatchEditCache;
-Landroid/view/inputmethod/RemoteInputConnectionImpl;
-Landroid/view/inputmethod/RemoveSpaceGesture$1;
-Landroid/view/inputmethod/RemoveSpaceGesture;
-Landroid/view/inputmethod/SelectGesture$1;
-Landroid/view/inputmethod/SelectGesture;
-Landroid/view/inputmethod/SelectRangeGesture$1;
-Landroid/view/inputmethod/SelectRangeGesture;
-Landroid/view/inputmethod/SparseRectFArray$1;
-Landroid/view/inputmethod/SparseRectFArray$SparseRectFArrayBuilder;
-Landroid/view/inputmethod/SparseRectFArray;
-Landroid/view/inputmethod/SurroundingText$1;
-Landroid/view/inputmethod/SurroundingText;
-Landroid/view/inputmethod/TextAppearanceInfo$1;
-Landroid/view/inputmethod/TextAppearanceInfo$Builder;
-Landroid/view/inputmethod/TextAppearanceInfo;
-Landroid/view/inputmethod/TextAttribute$1;
-Landroid/view/inputmethod/TextAttribute;
-Landroid/view/inputmethod/TextSnapshot;
-Landroid/view/inputmethod/ViewFocusParameterInfo;
-Landroid/view/textclassifier/ConversationAction$1;
-Landroid/view/textclassifier/ConversationAction$Builder;
-Landroid/view/textclassifier/ConversationAction-IA;
-Landroid/view/textclassifier/ConversationAction;
-Landroid/view/textclassifier/ConversationActions$1;
-Landroid/view/textclassifier/ConversationActions$Message$1;
-Landroid/view/textclassifier/ConversationActions$Message$Builder;
-Landroid/view/textclassifier/ConversationActions$Message-IA;
-Landroid/view/textclassifier/ConversationActions$Message;
-Landroid/view/textclassifier/ConversationActions$Request$1;
-Landroid/view/textclassifier/ConversationActions$Request$Builder;
-Landroid/view/textclassifier/ConversationActions$Request;
-Landroid/view/textclassifier/ConversationActions-IA;
-Landroid/view/textclassifier/ConversationActions;
-Landroid/view/textclassifier/EntityConfidence$$ExternalSyntheticLambda0;
-Landroid/view/textclassifier/EntityConfidence$1;
-Landroid/view/textclassifier/EntityConfidence-IA;
-Landroid/view/textclassifier/EntityConfidence;
-Landroid/view/textclassifier/ExtrasUtils;
-Landroid/view/textclassifier/Log;
-Landroid/view/textclassifier/SelectionEvent$1;
-Landroid/view/textclassifier/SelectionEvent;
-Landroid/view/textclassifier/SelectionSessionLogger$SignatureParser;
-Landroid/view/textclassifier/SelectionSessionLogger;
-Landroid/view/textclassifier/SystemTextClassifier$BlockingCallback;
-Landroid/view/textclassifier/SystemTextClassifier$ResponseReceiver-IA;
-Landroid/view/textclassifier/SystemTextClassifier$ResponseReceiver;
-Landroid/view/textclassifier/SystemTextClassifier;
-Landroid/view/textclassifier/SystemTextClassifierMetadata$1;
-Landroid/view/textclassifier/SystemTextClassifierMetadata;
-Landroid/view/textclassifier/TextClassification$$ExternalSyntheticLambda0;
-Landroid/view/textclassifier/TextClassification$1;
-Landroid/view/textclassifier/TextClassification$Builder;
-Landroid/view/textclassifier/TextClassification$Request$1;
-Landroid/view/textclassifier/TextClassification$Request$Builder;
-Landroid/view/textclassifier/TextClassification$Request;
-Landroid/view/textclassifier/TextClassification-IA;
-Landroid/view/textclassifier/TextClassification;
-Landroid/view/textclassifier/TextClassificationConstants;
-Landroid/view/textclassifier/TextClassificationContext$1;
-Landroid/view/textclassifier/TextClassificationContext$Builder;
-Landroid/view/textclassifier/TextClassificationContext-IA;
-Landroid/view/textclassifier/TextClassificationContext;
-Landroid/view/textclassifier/TextClassificationManager$$ExternalSyntheticLambda0;
-Landroid/view/textclassifier/TextClassificationManager;
-Landroid/view/textclassifier/TextClassificationSession$CleanerRunnable;
-Landroid/view/textclassifier/TextClassificationSession$SelectionEventHelper;
-Landroid/view/textclassifier/TextClassificationSession;
-Landroid/view/textclassifier/TextClassificationSessionFactory;
-Landroid/view/textclassifier/TextClassificationSessionId$1;
-Landroid/view/textclassifier/TextClassificationSessionId;
-Landroid/view/textclassifier/TextClassifier$1;
-Landroid/view/textclassifier/TextClassifier$EntityConfig$1;
-Landroid/view/textclassifier/TextClassifier$EntityConfig$Builder;
-Landroid/view/textclassifier/TextClassifier$EntityConfig-IA;
-Landroid/view/textclassifier/TextClassifier$EntityConfig;
-Landroid/view/textclassifier/TextClassifier$Utils;
-Landroid/view/textclassifier/TextClassifier;
-Landroid/view/textclassifier/TextClassifierEvent$1;
-Landroid/view/textclassifier/TextClassifierEvent$Builder;
-Landroid/view/textclassifier/TextClassifierEvent$ConversationActionsEvent$1;
-Landroid/view/textclassifier/TextClassifierEvent$ConversationActionsEvent-IA;
-Landroid/view/textclassifier/TextClassifierEvent$ConversationActionsEvent;
-Landroid/view/textclassifier/TextClassifierEvent$LanguageDetectionEvent$1;
-Landroid/view/textclassifier/TextClassifierEvent$LanguageDetectionEvent-IA;
-Landroid/view/textclassifier/TextClassifierEvent$LanguageDetectionEvent;
-Landroid/view/textclassifier/TextClassifierEvent$TextLinkifyEvent$1;
-Landroid/view/textclassifier/TextClassifierEvent$TextLinkifyEvent-IA;
-Landroid/view/textclassifier/TextClassifierEvent$TextLinkifyEvent;
-Landroid/view/textclassifier/TextClassifierEvent$TextSelectionEvent$1;
-Landroid/view/textclassifier/TextClassifierEvent$TextSelectionEvent-IA;
-Landroid/view/textclassifier/TextClassifierEvent$TextSelectionEvent;
-Landroid/view/textclassifier/TextClassifierEvent-IA;
-Landroid/view/textclassifier/TextClassifierEvent;
-Landroid/view/textclassifier/TextLanguage$1;
-Landroid/view/textclassifier/TextLanguage$Builder;
-Landroid/view/textclassifier/TextLanguage$Request$1;
-Landroid/view/textclassifier/TextLanguage$Request$Builder;
-Landroid/view/textclassifier/TextLanguage$Request;
-Landroid/view/textclassifier/TextLanguage;
-Landroid/view/textclassifier/TextLinks$1;
-Landroid/view/textclassifier/TextLinks$Builder;
-Landroid/view/textclassifier/TextLinks$Request$1;
-Landroid/view/textclassifier/TextLinks$Request;
-Landroid/view/textclassifier/TextLinks$TextLink$1;
-Landroid/view/textclassifier/TextLinks$TextLink;
-Landroid/view/textclassifier/TextLinks$TextLinkSpan;
-Landroid/view/textclassifier/TextLinks;
-Landroid/view/textclassifier/TextSelection$1;
-Landroid/view/textclassifier/TextSelection$Request$1;
-Landroid/view/textclassifier/TextSelection$Request$Builder;
-Landroid/view/textclassifier/TextSelection$Request;
-Landroid/view/textclassifier/TextSelection;
-Landroid/view/textservice/SentenceSuggestionsInfo$1;
-Landroid/view/textservice/SentenceSuggestionsInfo;
-Landroid/view/textservice/SpellCheckerInfo$1;
-Landroid/view/textservice/SpellCheckerInfo;
-Landroid/view/textservice/SpellCheckerSession$InternalListener;
-Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListener;
-Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListenerImpl$1;
-Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListenerImpl$SpellCheckerParams;
-Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListenerImpl;
-Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionParams$Builder;
-Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionParams-IA;
-Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionParams;
-Landroid/view/textservice/SpellCheckerSession;
-Landroid/view/textservice/SpellCheckerSubtype$1;
-Landroid/view/textservice/SpellCheckerSubtype;
-Landroid/view/textservice/SuggestionsInfo$1;
-Landroid/view/textservice/SuggestionsInfo;
-Landroid/view/textservice/TextInfo$1;
-Landroid/view/textservice/TextInfo;
-Landroid/view/textservice/TextServicesManager;
-Landroid/view/translation/TranslationCapability$1;
-Landroid/view/translation/TranslationCapability;
-Landroid/view/translation/TranslationManager;
-Landroid/view/translation/TranslationSpec$1;
-Landroid/view/translation/TranslationSpec;
-Landroid/view/translation/Translator$ServiceBinderReceiver$TimeoutException;
-Landroid/view/translation/UiTranslationController;
-Landroid/view/translation/UiTranslationManager;
-Landroid/view/translation/UiTranslationSpec$1;
-Landroid/view/translation/UiTranslationSpec;
-Landroid/view/translation/ViewTranslationCallback;
-Landroid/view/translation/ViewTranslationResponse$1;
-Landroid/view/translation/ViewTranslationResponse;
-Landroid/webkit/ConsoleMessage$MessageLevel;
-Landroid/webkit/ConsoleMessage;
-Landroid/webkit/CookieManager;
-Landroid/webkit/CookieSyncManager;
-Landroid/webkit/DownloadListener;
-Landroid/webkit/FeatureFlags;
-Landroid/webkit/FeatureFlagsImpl;
-Landroid/webkit/FindAddress$ZipRange;
-Landroid/webkit/FindAddress;
-Landroid/webkit/Flags;
-Landroid/webkit/GeolocationPermissions$Callback;
-Landroid/webkit/GeolocationPermissions;
-Landroid/webkit/HttpAuthHandler;
-Landroid/webkit/IWebViewUpdateService$Stub$Proxy;
-Landroid/webkit/IWebViewUpdateService$Stub;
-Landroid/webkit/IWebViewUpdateService;
-Landroid/webkit/JavascriptInterface;
-Landroid/webkit/MimeTypeMap;
-Landroid/webkit/PacProcessor;
-Landroid/webkit/PermissionRequest;
-Landroid/webkit/RenderProcessGoneDetail;
-Landroid/webkit/ServiceWorkerClient;
-Landroid/webkit/ServiceWorkerController;
-Landroid/webkit/ServiceWorkerWebSettings;
-Landroid/webkit/TokenBindingService;
-Landroid/webkit/TracingController;
-Landroid/webkit/URLUtil;
-Landroid/webkit/UserPackage;
-Landroid/webkit/ValueCallback;
-Landroid/webkit/WebBackForwardList;
-Landroid/webkit/WebChromeClient$CustomViewCallback;
-Landroid/webkit/WebChromeClient;
-Landroid/webkit/WebIconDatabase;
-Landroid/webkit/WebMessage;
-Landroid/webkit/WebMessagePort;
-Landroid/webkit/WebResourceError;
-Landroid/webkit/WebResourceRequest;
-Landroid/webkit/WebResourceResponse;
-Landroid/webkit/WebSettings$LayoutAlgorithm;
-Landroid/webkit/WebSettings$PluginState;
-Landroid/webkit/WebSettings$RenderPriority;
-Landroid/webkit/WebSettings$ZoomDensity;
-Landroid/webkit/WebSettings;
-Landroid/webkit/WebStorage;
-Landroid/webkit/WebSyncManager;
-Landroid/webkit/WebView$FindListener;
-Landroid/webkit/WebView$HitTestResult;
-Landroid/webkit/WebView$PictureListener;
-Landroid/webkit/WebView$PrivateAccess;
-Landroid/webkit/WebView$VisualStateCallback;
-Landroid/webkit/WebView;
-Landroid/webkit/WebViewClient;
-Landroid/webkit/WebViewDatabase;
-Landroid/webkit/WebViewDelegate$1;
-Landroid/webkit/WebViewDelegate$OnTraceEnabledChangeListener;
-Landroid/webkit/WebViewDelegate;
-Landroid/webkit/WebViewFactory$MissingWebViewPackageException;
-Landroid/webkit/WebViewFactory$StartupTimestamps;
-Landroid/webkit/WebViewFactory;
-Landroid/webkit/WebViewFactoryProvider$Statics;
-Landroid/webkit/WebViewFactoryProvider;
-Landroid/webkit/WebViewLibraryLoader$1;
-Landroid/webkit/WebViewLibraryLoader$RelroFileCreator;
-Landroid/webkit/WebViewLibraryLoader;
-Landroid/webkit/WebViewProvider$ScrollDelegate;
-Landroid/webkit/WebViewProvider$ViewDelegate;
-Landroid/webkit/WebViewProvider;
-Landroid/webkit/WebViewProviderInfo$1;
-Landroid/webkit/WebViewProviderInfo;
-Landroid/webkit/WebViewProviderResponse$1;
-Landroid/webkit/WebViewProviderResponse-IA;
-Landroid/webkit/WebViewProviderResponse;
-Landroid/webkit/WebViewRenderProcess;
-Landroid/webkit/WebViewRenderProcessClient;
-Landroid/webkit/WebViewUpdateManager;
-Landroid/webkit/WebViewUpdateService;
-Landroid/webkit/WebViewZygote;
-Landroid/widget/AbsListView$1;
-Landroid/widget/AbsListView$2;
-Landroid/widget/AbsListView$3;
-Landroid/widget/AbsListView$4;
-Landroid/widget/AbsListView$AbsPositionScroller;
-Landroid/widget/AbsListView$AdapterDataSetObserver;
-Landroid/widget/AbsListView$CheckForKeyLongPress-IA;
-Landroid/widget/AbsListView$CheckForKeyLongPress;
-Landroid/widget/AbsListView$CheckForLongPress;
-Landroid/widget/AbsListView$CheckForTap-IA;
-Landroid/widget/AbsListView$CheckForTap;
-Landroid/widget/AbsListView$DeviceConfigChangeListener-IA;
-Landroid/widget/AbsListView$DeviceConfigChangeListener;
-Landroid/widget/AbsListView$FlingRunnable$1;
-Landroid/widget/AbsListView$FlingRunnable;
-Landroid/widget/AbsListView$InputConnectionWrapper;
-Landroid/widget/AbsListView$LayoutParams;
-Landroid/widget/AbsListView$ListItemAccessibilityDelegate;
-Landroid/widget/AbsListView$MultiChoiceModeListener;
-Landroid/widget/AbsListView$MultiChoiceModeWrapper;
-Landroid/widget/AbsListView$OnScrollListener;
-Landroid/widget/AbsListView$PerformClick-IA;
-Landroid/widget/AbsListView$PerformClick;
-Landroid/widget/AbsListView$PositionScroller;
-Landroid/widget/AbsListView$RecycleBin;
-Landroid/widget/AbsListView$RecyclerListener;
-Landroid/widget/AbsListView$SavedState$1;
-Landroid/widget/AbsListView$SavedState;
-Landroid/widget/AbsListView$SelectionBoundsAdjuster;
-Landroid/widget/AbsListView$WindowRunnnable-IA;
-Landroid/widget/AbsListView$WindowRunnnable;
-Landroid/widget/AbsListView;
-Landroid/widget/AbsSeekBar;
-Landroid/widget/AbsSpinner$RecycleBin;
-Landroid/widget/AbsSpinner$SavedState$1;
-Landroid/widget/AbsSpinner$SavedState;
-Landroid/widget/AbsSpinner;
-Landroid/widget/AbsoluteLayout$LayoutParams;
-Landroid/widget/AbsoluteLayout;
-Landroid/widget/ActionMenuPresenter$1;
-Landroid/widget/ActionMenuPresenter$2;
-Landroid/widget/ActionMenuPresenter$ActionButtonSubmenu;
-Landroid/widget/ActionMenuPresenter$ActionMenuPopupCallback;
-Landroid/widget/ActionMenuPresenter$OpenOverflowRunnable;
-Landroid/widget/ActionMenuPresenter$OverflowMenuButton$1;
-Landroid/widget/ActionMenuPresenter$OverflowMenuButton;
-Landroid/widget/ActionMenuPresenter$OverflowPopup;
-Landroid/widget/ActionMenuPresenter$PopupPresenterCallback;
-Landroid/widget/ActionMenuPresenter;
-Landroid/widget/ActionMenuView$ActionMenuChildView;
-Landroid/widget/ActionMenuView$ActionMenuPresenterCallback;
-Landroid/widget/ActionMenuView$LayoutParams;
-Landroid/widget/ActionMenuView$MenuBuilderCallback;
-Landroid/widget/ActionMenuView$OnMenuItemClickListener;
-Landroid/widget/ActionMenuView;
-Landroid/widget/Adapter;
-Landroid/widget/AdapterView$AdapterContextMenuInfo;
-Landroid/widget/AdapterView$AdapterDataSetObserver;
-Landroid/widget/AdapterView$OnItemClickListener;
-Landroid/widget/AdapterView$OnItemLongClickListener;
-Landroid/widget/AdapterView$OnItemSelectedListener;
-Landroid/widget/AdapterView$SelectionNotifier;
-Landroid/widget/AdapterView;
-Landroid/widget/ArrayAdapter;
-Landroid/widget/AutoCompleteTextView$$ExternalSyntheticLambda0;
-Landroid/widget/AutoCompleteTextView$$ExternalSyntheticLambda1;
-Landroid/widget/AutoCompleteTextView$DropDownItemClickListener-IA;
-Landroid/widget/AutoCompleteTextView$DropDownItemClickListener;
-Landroid/widget/AutoCompleteTextView$MyWatcher-IA;
-Landroid/widget/AutoCompleteTextView$MyWatcher;
-Landroid/widget/AutoCompleteTextView$PassThroughClickListener-IA;
-Landroid/widget/AutoCompleteTextView$PassThroughClickListener;
-Landroid/widget/AutoCompleteTextView$Validator;
-Landroid/widget/AutoCompleteTextView;
-Landroid/widget/BaseAdapter;
-Landroid/widget/Button;
-Landroid/widget/CheckBox;
-Landroid/widget/Checkable;
-Landroid/widget/CheckedTextView;
-Landroid/widget/Chronometer$1;
-Landroid/widget/Chronometer$OnChronometerTickListener;
-Landroid/widget/Chronometer;
-Landroid/widget/CompoundButton$OnCheckedChangeListener;
-Landroid/widget/CompoundButton$SavedState$1;
-Landroid/widget/CompoundButton$SavedState;
-Landroid/widget/CompoundButton;
-Landroid/widget/DateTimeView$ReceiverInfo$1;
-Landroid/widget/DateTimeView$ReceiverInfo$2;
-Landroid/widget/DateTimeView$ReceiverInfo;
-Landroid/widget/DateTimeView;
-Landroid/widget/DropDownListView;
-Landroid/widget/EdgeEffect;
-Landroid/widget/EditText;
-Landroid/widget/Editor$$ExternalSyntheticLambda0;
-Landroid/widget/Editor$$ExternalSyntheticLambda1;
-Landroid/widget/Editor$$ExternalSyntheticLambda2;
-Landroid/widget/Editor$1;
-Landroid/widget/Editor$2;
-Landroid/widget/Editor$3;
-Landroid/widget/Editor$5;
-Landroid/widget/Editor$AccessibilitySmartActions-IA;
-Landroid/widget/Editor$AccessibilitySmartActions;
-Landroid/widget/Editor$Blink-IA;
-Landroid/widget/Editor$Blink;
-Landroid/widget/Editor$CorrectionHighlighter;
-Landroid/widget/Editor$CursorAnchorInfoNotifier-IA;
-Landroid/widget/Editor$CursorAnchorInfoNotifier;
-Landroid/widget/Editor$CursorController;
-Landroid/widget/Editor$EasyEditDeleteListener;
-Landroid/widget/Editor$EasyEditPopupWindow-IA;
-Landroid/widget/Editor$EasyEditPopupWindow;
-Landroid/widget/Editor$EditOperation$1;
-Landroid/widget/Editor$EditOperation;
-Landroid/widget/Editor$ErrorPopup;
-Landroid/widget/Editor$HandleView-IA;
-Landroid/widget/Editor$HandleView;
-Landroid/widget/Editor$InputContentType;
-Landroid/widget/Editor$InputMethodState;
-Landroid/widget/Editor$InsertModeController;
-Landroid/widget/Editor$InsertionHandleView$1;
-Landroid/widget/Editor$InsertionHandleView;
-Landroid/widget/Editor$InsertionPointCursorController$1;
-Landroid/widget/Editor$InsertionPointCursorController;
-Landroid/widget/Editor$MagnifierMotionAnimator;
-Landroid/widget/Editor$PinnedPopupWindow;
-Landroid/widget/Editor$PositionListener-IA;
-Landroid/widget/Editor$PositionListener;
-Landroid/widget/Editor$ProcessTextIntentActionsHandler-IA;
-Landroid/widget/Editor$ProcessTextIntentActionsHandler;
-Landroid/widget/Editor$SelectionHandleView;
-Landroid/widget/Editor$SelectionModifierCursorController;
-Landroid/widget/Editor$SpanController$1;
-Landroid/widget/Editor$SpanController$2;
-Landroid/widget/Editor$SpanController-IA;
-Landroid/widget/Editor$SpanController;
-Landroid/widget/Editor$SuggestionHelper$SuggestionSpanComparator-IA;
-Landroid/widget/Editor$SuggestionHelper$SuggestionSpanComparator;
-Landroid/widget/Editor$SuggestionHelper-IA;
-Landroid/widget/Editor$SuggestionHelper;
-Landroid/widget/Editor$SuggestionsPopupWindow;
-Landroid/widget/Editor$TextRenderNode;
-Landroid/widget/Editor$TextViewPositionListener;
-Landroid/widget/Editor$UndoInputFilter;
-Landroid/widget/Editor;
-Landroid/widget/EditorTouchState;
-Landroid/widget/FastScroller$1;
-Landroid/widget/FastScroller$2;
-Landroid/widget/FastScroller$3;
-Landroid/widget/FastScroller$4;
-Landroid/widget/FastScroller$5;
-Landroid/widget/FastScroller$6;
-Landroid/widget/FastScroller;
-Landroid/widget/Filter$Delayer;
-Landroid/widget/Filter$FilterListener;
-Landroid/widget/Filter$FilterResults;
-Landroid/widget/Filter$RequestArguments;
-Landroid/widget/Filter$RequestHandler;
-Landroid/widget/Filter$ResultsHandler-IA;
-Landroid/widget/Filter$ResultsHandler;
-Landroid/widget/Filter;
-Landroid/widget/Filterable;
-Landroid/widget/ForwardingListener;
-Landroid/widget/FrameLayout$LayoutParams;
-Landroid/widget/FrameLayout;
-Landroid/widget/GridLayout$1;
-Landroid/widget/GridLayout$2;
-Landroid/widget/GridLayout$3;
-Landroid/widget/GridLayout$4;
-Landroid/widget/GridLayout$5;
-Landroid/widget/GridLayout$6;
-Landroid/widget/GridLayout$7$1;
-Landroid/widget/GridLayout$7;
-Landroid/widget/GridLayout$8;
-Landroid/widget/GridLayout$Alignment;
-Landroid/widget/GridLayout$Arc;
-Landroid/widget/GridLayout$Assoc;
-Landroid/widget/GridLayout$Axis$1;
-Landroid/widget/GridLayout$Axis-IA;
-Landroid/widget/GridLayout$Axis;
-Landroid/widget/GridLayout$Bounds;
-Landroid/widget/GridLayout$Interval;
-Landroid/widget/GridLayout$LayoutParams;
-Landroid/widget/GridLayout$MutableInt;
-Landroid/widget/GridLayout$PackedMap-IA;
-Landroid/widget/GridLayout$PackedMap;
-Landroid/widget/GridLayout$Spec;
-Landroid/widget/GridLayout;
-Landroid/widget/HeaderViewListAdapter;
-Landroid/widget/HorizontalScrollView$SavedState$1;
-Landroid/widget/HorizontalScrollView$SavedState;
-Landroid/widget/HorizontalScrollView;
-Landroid/widget/ImageButton;
-Landroid/widget/ImageView$ImageDrawableCallback;
-Landroid/widget/ImageView$ScaleType;
-Landroid/widget/ImageView;
-Landroid/widget/LinearLayout$LayoutParams;
-Landroid/widget/LinearLayout;
-Landroid/widget/ListAdapter;
-Landroid/widget/ListPopupWindow$ListSelectorHider-IA;
-Landroid/widget/ListPopupWindow$ListSelectorHider;
-Landroid/widget/ListPopupWindow$PopupDataSetObserver-IA;
-Landroid/widget/ListPopupWindow$PopupDataSetObserver;
-Landroid/widget/ListPopupWindow$PopupScrollListener-IA;
-Landroid/widget/ListPopupWindow$PopupScrollListener;
-Landroid/widget/ListPopupWindow$PopupTouchInterceptor-IA;
-Landroid/widget/ListPopupWindow$PopupTouchInterceptor;
-Landroid/widget/ListPopupWindow$ResizePopupRunnable-IA;
-Landroid/widget/ListPopupWindow$ResizePopupRunnable;
-Landroid/widget/ListPopupWindow;
-Landroid/widget/ListView$ArrowScrollFocusResult-IA;
-Landroid/widget/ListView$ArrowScrollFocusResult;
-Landroid/widget/ListView$FixedViewInfo;
-Landroid/widget/ListView$FocusSelector-IA;
-Landroid/widget/ListView$FocusSelector;
-Landroid/widget/ListView;
-Landroid/widget/Magnifier$Builder;
-Landroid/widget/Magnifier$InternalPopupWindow;
-Landroid/widget/Magnifier;
-Landroid/widget/MediaController$MediaPlayerControl;
-Landroid/widget/MultiAutoCompleteTextView$Tokenizer;
-Landroid/widget/MultiAutoCompleteTextView;
-Landroid/widget/OverScroller$SplineOverScroller;
-Landroid/widget/OverScroller;
-Landroid/widget/PopupMenu$1;
-Landroid/widget/PopupMenu$2;
-Landroid/widget/PopupMenu$OnMenuItemClickListener;
-Landroid/widget/PopupMenu;
-Landroid/widget/PopupWindow$$ExternalSyntheticLambda0;
-Landroid/widget/PopupWindow$$ExternalSyntheticLambda1;
-Landroid/widget/PopupWindow$1;
-Landroid/widget/PopupWindow$2;
-Landroid/widget/PopupWindow$3;
-Landroid/widget/PopupWindow$OnDismissListener;
-Landroid/widget/PopupWindow$PopupBackgroundView;
-Landroid/widget/PopupWindow$PopupDecorView$$ExternalSyntheticLambda0;
-Landroid/widget/PopupWindow$PopupDecorView$$ExternalSyntheticLambda1;
-Landroid/widget/PopupWindow$PopupDecorView$1$1;
-Landroid/widget/PopupWindow$PopupDecorView$1;
-Landroid/widget/PopupWindow$PopupDecorView$2;
-Landroid/widget/PopupWindow$PopupDecorView$3;
-Landroid/widget/PopupWindow$PopupDecorView$4;
-Landroid/widget/PopupWindow$PopupDecorView;
-Landroid/widget/PopupWindow;
-Landroid/widget/ProgressBar$1;
-Landroid/widget/ProgressBar$2;
-Landroid/widget/ProgressBar$ProgressTintInfo-IA;
-Landroid/widget/ProgressBar$ProgressTintInfo;
-Landroid/widget/ProgressBar$RefreshData;
-Landroid/widget/ProgressBar$RefreshProgressRunnable-IA;
-Landroid/widget/ProgressBar$RefreshProgressRunnable;
-Landroid/widget/ProgressBar$SavedState$1;
-Landroid/widget/ProgressBar$SavedState-IA;
-Landroid/widget/ProgressBar$SavedState;
-Landroid/widget/ProgressBar;
-Landroid/widget/QuickContactBadge;
-Landroid/widget/RadioButton;
-Landroid/widget/RadioGroup$OnCheckedChangeListener;
-Landroid/widget/RadioGroup;
-Landroid/widget/RatingBar;
-Landroid/widget/RelativeLayout$DependencyGraph$Node;
-Landroid/widget/RelativeLayout$DependencyGraph-IA;
-Landroid/widget/RelativeLayout$DependencyGraph;
-Landroid/widget/RelativeLayout$LayoutParams;
-Landroid/widget/RelativeLayout$TopToBottomLeftToRightComparator;
-Landroid/widget/RelativeLayout;
-Landroid/widget/RemoteViews$$ExternalSyntheticLambda0;
-Landroid/widget/RemoteViews$$ExternalSyntheticLambda1;
-Landroid/widget/RemoteViews$$ExternalSyntheticLambda2;
-Landroid/widget/RemoteViews$1;
-Landroid/widget/RemoteViews$2;
-Landroid/widget/RemoteViews$Action-IA;
-Landroid/widget/RemoteViews$Action;
-Landroid/widget/RemoteViews$ActionException;
-Landroid/widget/RemoteViews$ApplicationInfoCache$$ExternalSyntheticLambda0;
-Landroid/widget/RemoteViews$ApplicationInfoCache;
-Landroid/widget/RemoteViews$AsyncApplyTask;
-Landroid/widget/RemoteViews$AttributeReflectionAction;
-Landroid/widget/RemoteViews$BaseReflectionAction;
-Landroid/widget/RemoteViews$BitmapCache;
-Landroid/widget/RemoteViews$BitmapReflectionAction;
-Landroid/widget/RemoteViews$ComplexUnitDimensionReflectionAction;
-Landroid/widget/RemoteViews$HierarchyRootData;
-Landroid/widget/RemoteViews$InteractionHandler;
-Landroid/widget/RemoteViews$LayoutParamAction;
-Landroid/widget/RemoteViews$MethodArgs;
-Landroid/widget/RemoteViews$MethodKey;
-Landroid/widget/RemoteViews$NightModeReflectionAction;
-Landroid/widget/RemoteViews$OnViewAppliedListener;
-Landroid/widget/RemoteViews$ReflectionAction;
-Landroid/widget/RemoteViews$RemoteCollectionCache;
-Landroid/widget/RemoteViews$RemoteCollectionItems$1;
-Landroid/widget/RemoteViews$RemoteCollectionItems;
-Landroid/widget/RemoteViews$RemoteResponse;
-Landroid/widget/RemoteViews$RemoteView;
-Landroid/widget/RemoteViews$RemoteViewsContextWrapper;
-Landroid/widget/RemoteViews$RemoveFromParentAction;
-Landroid/widget/RemoteViews$ResourceReflectionAction;
-Landroid/widget/RemoteViews$RunnableAction;
-Landroid/widget/RemoteViews$RuntimeAction;
-Landroid/widget/RemoteViews$SetCompoundButtonCheckedAction;
-Landroid/widget/RemoteViews$SetDrawInstructionAction;
-Landroid/widget/RemoteViews$SetDrawableTint;
-Landroid/widget/RemoteViews$SetEmptyView;
-Landroid/widget/RemoteViews$SetIntTagAction;
-Landroid/widget/RemoteViews$SetOnCheckedChangeResponse;
-Landroid/widget/RemoteViews$SetOnClickResponse;
-Landroid/widget/RemoteViews$SetOnStylusHandwritingResponse;
-Landroid/widget/RemoteViews$SetPendingIntentTemplate;
-Landroid/widget/RemoteViews$SetRadioGroupCheckedAction;
-Landroid/widget/RemoteViews$SetRemoteCollectionItemListAdapterAction;
-Landroid/widget/RemoteViews$SetRemoteInputsAction;
-Landroid/widget/RemoteViews$SetRemoteViewsAdapterIntent;
-Landroid/widget/RemoteViews$SetRippleDrawableColor;
-Landroid/widget/RemoteViews$SetViewOutlinePreferredRadiusAction;
-Landroid/widget/RemoteViews$TextViewDrawableAction;
-Landroid/widget/RemoteViews$TextViewSizeAction;
-Landroid/widget/RemoteViews$ViewContentNavigation;
-Landroid/widget/RemoteViews$ViewGroupActionAdd$1;
-Landroid/widget/RemoteViews$ViewGroupActionAdd;
-Landroid/widget/RemoteViews$ViewGroupActionRemove$1;
-Landroid/widget/RemoteViews$ViewGroupActionRemove;
-Landroid/widget/RemoteViews$ViewPaddingAction;
-Landroid/widget/RemoteViews$ViewTree;
-Landroid/widget/RemoteViews;
-Landroid/widget/RemoteViewsAdapter$AsyncRemoteAdapterAction;
-Landroid/widget/RemoteViewsAdapter$RemoteAdapterConnectionCallback;
-Landroid/widget/RemoteViewsAdapter;
-Landroid/widget/RemoteViewsService$RemoteViewsFactory;
-Landroid/widget/RemoteViewsService;
-Landroid/widget/RtlSpacingHelper;
-Landroid/widget/ScrollBarDrawable;
-Landroid/widget/ScrollView$SavedState$1;
-Landroid/widget/ScrollView$SavedState;
-Landroid/widget/ScrollView;
-Landroid/widget/Scroller$ViscousFluidInterpolator;
-Landroid/widget/Scroller;
-Landroid/widget/SectionIndexer;
-Landroid/widget/SeekBar$OnSeekBarChangeListener;
-Landroid/widget/SeekBar;
-Landroid/widget/SelectionActionModeHelper$$ExternalSyntheticLambda10;
-Landroid/widget/SelectionActionModeHelper$$ExternalSyntheticLambda11;
-Landroid/widget/SelectionActionModeHelper$$ExternalSyntheticLambda12;
-Landroid/widget/SelectionActionModeHelper$$ExternalSyntheticLambda2;
-Landroid/widget/SelectionActionModeHelper$$ExternalSyntheticLambda3;
-Landroid/widget/SelectionActionModeHelper$$ExternalSyntheticLambda8;
-Landroid/widget/SelectionActionModeHelper$SelectionMetricsLogger;
-Landroid/widget/SelectionActionModeHelper$SelectionTracker$LogAbandonRunnable-IA;
-Landroid/widget/SelectionActionModeHelper$SelectionTracker$LogAbandonRunnable;
-Landroid/widget/SelectionActionModeHelper$SelectionTracker;
-Landroid/widget/SelectionActionModeHelper$TextClassificationHelper;
-Landroid/widget/SelectionActionModeHelper;
-Landroid/widget/SmartSelectSprite$$ExternalSyntheticLambda0;
-Landroid/widget/SmartSelectSprite$$ExternalSyntheticLambda1;
-Landroid/widget/SmartSelectSprite$$ExternalSyntheticLambda2;
-Landroid/widget/SmartSelectSprite$RectangleList;
-Landroid/widget/SmartSelectSprite;
-Landroid/widget/Space;
-Landroid/widget/SpellChecker$1;
-Landroid/widget/SpellChecker$RemoveReason;
-Landroid/widget/SpellChecker$SentenceIteratorWrapper;
-Landroid/widget/SpellChecker$SpellParser-IA;
-Landroid/widget/SpellChecker$SpellParser;
-Landroid/widget/SpellChecker;
-Landroid/widget/Spinner$1;
-Landroid/widget/Spinner$DialogPopup-IA;
-Landroid/widget/Spinner$DialogPopup;
-Landroid/widget/Spinner$DropDownAdapter;
-Landroid/widget/Spinner$DropdownPopup$1;
-Landroid/widget/Spinner$DropdownPopup;
-Landroid/widget/Spinner$SavedState$1;
-Landroid/widget/Spinner$SavedState;
-Landroid/widget/Spinner$SpinnerPopup;
-Landroid/widget/Spinner;
-Landroid/widget/SpinnerAdapter;
-Landroid/widget/Switch$1;
-Landroid/widget/Switch;
-Landroid/widget/TableLayout$PassThroughHierarchyChangeListener;
-Landroid/widget/TableLayout;
-Landroid/widget/TableRow$ChildrenTracker;
-Landroid/widget/TableRow;
-Landroid/widget/TextClock$1;
-Landroid/widget/TextClock$2;
-Landroid/widget/TextClock$FormatChangeObserver;
-Landroid/widget/TextClock;
-Landroid/widget/TextView$$ExternalSyntheticLambda0;
-Landroid/widget/TextView$$ExternalSyntheticLambda2;
-Landroid/widget/TextView$$ExternalSyntheticLambda3;
-Landroid/widget/TextView$$ExternalSyntheticLambda4;
-Landroid/widget/TextView$$ExternalSyntheticLambda5;
-Landroid/widget/TextView$$ExternalSyntheticLambda6;
-Landroid/widget/TextView$$ExternalSyntheticLambda7;
-Landroid/widget/TextView$1;
-Landroid/widget/TextView$2;
-Landroid/widget/TextView$3;
-Landroid/widget/TextView$4;
-Landroid/widget/TextView$BufferType;
-Landroid/widget/TextView$ChangeWatcher-IA;
-Landroid/widget/TextView$ChangeWatcher;
-Landroid/widget/TextView$CharWrapper;
-Landroid/widget/TextView$Drawables;
-Landroid/widget/TextView$Marquee$1;
-Landroid/widget/TextView$Marquee$2;
-Landroid/widget/TextView$Marquee$3;
-Landroid/widget/TextView$Marquee;
-Landroid/widget/TextView$OnEditorActionListener;
-Landroid/widget/TextView$SavedState$1;
-Landroid/widget/TextView$SavedState-IA;
-Landroid/widget/TextView$SavedState;
-Landroid/widget/TextView$TextAppearanceAttributes-IA;
-Landroid/widget/TextView$TextAppearanceAttributes;
-Landroid/widget/TextView;
-Landroid/widget/TextViewOnReceiveContentListener$InputConnectionInfo-IA;
-Landroid/widget/TextViewOnReceiveContentListener$InputConnectionInfo;
-Landroid/widget/TextViewOnReceiveContentListener;
-Landroid/widget/TextViewTranslationCallback;
-Landroid/widget/ThemedSpinnerAdapter;
-Landroid/widget/Toast$Callback;
-Landroid/widget/Toast$CallbackBinder$$ExternalSyntheticLambda0;
-Landroid/widget/Toast$CallbackBinder$$ExternalSyntheticLambda1;
-Landroid/widget/Toast$CallbackBinder-IA;
-Landroid/widget/Toast$CallbackBinder;
-Landroid/widget/Toast$TN$1;
-Landroid/widget/Toast$TN;
-Landroid/widget/Toast;
-Landroid/widget/ToastPresenter;
-Landroid/widget/ToggleButton;
-Landroid/widget/Toolbar$1;
-Landroid/widget/Toolbar$2;
-Landroid/widget/Toolbar$ExpandedActionViewMenuPresenter;
-Landroid/widget/Toolbar$LayoutParams;
-Landroid/widget/Toolbar$OnMenuItemClickListener;
-Landroid/widget/Toolbar$SavedState$1;
-Landroid/widget/Toolbar$SavedState;
-Landroid/widget/Toolbar;
-Landroid/widget/ViewAnimator;
-Landroid/widget/ViewFlipper$1;
-Landroid/widget/ViewFlipper;
-Landroid/widget/ViewSwitcher;
-Landroid/widget/WrapperListAdapter;
-Landroid/widget/inline/InlinePresentationSpec$1;
-Landroid/widget/inline/InlinePresentationSpec$BaseBuilder;
-Landroid/widget/inline/InlinePresentationSpec$Builder;
-Landroid/widget/inline/InlinePresentationSpec;
-Landroid/window/ActivityWindowInfo;
-Landroid/window/BackAnimationAdapter$1;
-Landroid/window/BackAnimationAdapter;
-Landroid/window/BackEvent;
-Landroid/window/BackMotionEvent$1;
-Landroid/window/BackMotionEvent;
-Landroid/window/BackNavigationInfo$1;
-Landroid/window/BackNavigationInfo;
-Landroid/window/BackProgressAnimator$1;
-Landroid/window/BackProgressAnimator$ProgressCallback;
-Landroid/window/BackProgressAnimator;
-Landroid/window/ClientWindowFrames$1;
-Landroid/window/ClientWindowFrames-IA;
-Landroid/window/ClientWindowFrames;
-Landroid/window/CompatOnBackInvokedCallback;
-Landroid/window/ConfigurationHelper;
-Landroid/window/DisplayAreaAppearedInfo$1;
-Landroid/window/DisplayAreaAppearedInfo;
-Landroid/window/DisplayAreaInfo$1;
-Landroid/window/DisplayAreaInfo;
-Landroid/window/DisplayAreaOrganizer$1;
-Landroid/window/DisplayAreaOrganizer;
-Landroid/window/IDisplayAreaOrganizer$Stub$Proxy;
-Landroid/window/IDisplayAreaOrganizer$Stub;
-Landroid/window/IDisplayAreaOrganizer;
-Landroid/window/IDisplayAreaOrganizerController$Stub$Proxy;
-Landroid/window/IDisplayAreaOrganizerController$Stub;
-Landroid/window/IDisplayAreaOrganizerController;
-Landroid/window/IOnBackInvokedCallback$Stub$Proxy;
-Landroid/window/IOnBackInvokedCallback$Stub;
-Landroid/window/IOnBackInvokedCallback;
-Landroid/window/IRemoteTransition$Stub$Proxy;
-Landroid/window/IRemoteTransition$Stub;
-Landroid/window/IRemoteTransition;
-Landroid/window/IRemoteTransitionFinishedCallback;
-Landroid/window/ISurfaceSyncGroup$Stub;
-Landroid/window/ISurfaceSyncGroup;
-Landroid/window/ISurfaceSyncGroupCompletedListener$Stub;
-Landroid/window/ISurfaceSyncGroupCompletedListener;
-Landroid/window/ITaskFragmentOrganizer$Stub$Proxy;
-Landroid/window/ITaskFragmentOrganizer$Stub;
-Landroid/window/ITaskFragmentOrganizer;
-Landroid/window/ITaskFragmentOrganizerController$Stub;
-Landroid/window/ITaskFragmentOrganizerController;
-Landroid/window/ITaskOrganizer$Stub$Proxy;
-Landroid/window/ITaskOrganizer$Stub;
-Landroid/window/ITaskOrganizer;
-Landroid/window/ITaskOrganizerController$Stub$Proxy;
-Landroid/window/ITaskOrganizerController$Stub;
-Landroid/window/ITaskOrganizerController;
-Landroid/window/ITransactionReadyCallback$Stub;
-Landroid/window/ITransactionReadyCallback;
-Landroid/window/ITransitionMetricsReporter;
-Landroid/window/ITransitionPlayer$Stub;
-Landroid/window/ITransitionPlayer;
-Landroid/window/ITrustedPresentationListener$Stub;
-Landroid/window/ITrustedPresentationListener;
-Landroid/window/IWindowContainerToken$Stub$Proxy;
-Landroid/window/IWindowContainerToken$Stub;
-Landroid/window/IWindowContainerToken;
-Landroid/window/IWindowContainerTransactionCallback$Stub;
-Landroid/window/IWindowContainerTransactionCallback;
-Landroid/window/IWindowOrganizerController$Stub$Proxy;
-Landroid/window/IWindowOrganizerController$Stub;
-Landroid/window/IWindowOrganizerController;
-Landroid/window/ImeOnBackInvokedDispatcher$$ExternalSyntheticLambda0;
-Landroid/window/ImeOnBackInvokedDispatcher$1;
-Landroid/window/ImeOnBackInvokedDispatcher$2;
-Landroid/window/ImeOnBackInvokedDispatcher$ImeOnBackInvokedCallback;
-Landroid/window/ImeOnBackInvokedDispatcher;
-Landroid/window/OnBackAnimationCallback;
-Landroid/window/OnBackInvokedCallback;
-Landroid/window/OnBackInvokedCallbackInfo$1;
-Landroid/window/OnBackInvokedCallbackInfo;
-Landroid/window/OnBackInvokedDispatcher;
-Landroid/window/ProxyOnBackInvokedDispatcher$$ExternalSyntheticLambda0;
-Landroid/window/ProxyOnBackInvokedDispatcher;
-Landroid/window/RemoteTransition$1;
-Landroid/window/RemoteTransition;
-Landroid/window/ScreenCapture$CaptureArgs$1;
-Landroid/window/ScreenCapture$CaptureArgs$Builder;
-Landroid/window/ScreenCapture$CaptureArgs;
-Landroid/window/ScreenCapture$DisplayCaptureArgs;
-Landroid/window/ScreenCapture$LayerCaptureArgs$Builder;
-Landroid/window/ScreenCapture$LayerCaptureArgs;
-Landroid/window/ScreenCapture$ScreenCaptureListener$1;
-Landroid/window/ScreenCapture$ScreenCaptureListener;
-Landroid/window/ScreenCapture$ScreenshotHardwareBuffer;
-Landroid/window/ScreenCapture;
-Landroid/window/SizeConfigurationBuckets$1;
-Landroid/window/SizeConfigurationBuckets;
-Landroid/window/SplashScreen$SplashScreenManagerGlobal$1;
-Landroid/window/SplashScreen$SplashScreenManagerGlobal;
-Landroid/window/SplashScreenView$SplashScreenViewParcelable$1;
-Landroid/window/SplashScreenView$SplashScreenViewParcelable;
-Landroid/window/SplashScreenView;
-Landroid/window/StartingWindowInfo$1;
-Landroid/window/StartingWindowInfo;
-Landroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda0;
-Landroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda1;
-Landroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda2;
-Landroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda3;
-Landroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda4;
-Landroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda5;
-Landroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda6;
-Landroid/window/SurfaceSyncGroup$1;
-Landroid/window/SurfaceSyncGroup$2;
-Landroid/window/SurfaceSyncGroup$ISurfaceSyncGroupImpl-IA;
-Landroid/window/SurfaceSyncGroup$ISurfaceSyncGroupImpl;
-Landroid/window/SurfaceSyncGroup$SurfaceViewFrameCallback;
-Landroid/window/SurfaceSyncGroup;
-Landroid/window/TaskAppearedInfo$1;
-Landroid/window/TaskAppearedInfo;
-Landroid/window/TaskFpsCallback;
-Landroid/window/TaskFragmentOperation$1;
-Landroid/window/TaskFragmentOperation;
-Landroid/window/TaskFragmentOrganizer$1;
-Landroid/window/TaskFragmentOrganizer;
-Landroid/window/TaskFragmentOrganizerToken$1;
-Landroid/window/TaskFragmentOrganizerToken;
-Landroid/window/TaskFragmentTransaction;
-Landroid/window/TaskOrganizer$1;
-Landroid/window/TaskOrganizer;
-Landroid/window/TaskSnapshot$1;
-Landroid/window/TaskSnapshot;
-Landroid/window/TransitionFilter$1;
-Landroid/window/TransitionFilter$Requirement$1;
-Landroid/window/TransitionFilter$Requirement;
-Landroid/window/TransitionFilter;
-Landroid/window/TransitionInfo$1;
-Landroid/window/TransitionInfo;
-Landroid/window/WindowContainerToken$1;
-Landroid/window/WindowContainerToken-IA;
-Landroid/window/WindowContainerToken;
-Landroid/window/WindowContainerTransaction$1;
-Landroid/window/WindowContainerTransaction$Change$1;
-Landroid/window/WindowContainerTransaction$Change;
-Landroid/window/WindowContainerTransaction$HierarchyOp$1;
-Landroid/window/WindowContainerTransaction$HierarchyOp$Builder;
-Landroid/window/WindowContainerTransaction$HierarchyOp;
-Landroid/window/WindowContainerTransaction;
-Landroid/window/WindowContext;
-Landroid/window/WindowContextController;
-Landroid/window/WindowInfosListener$DisplayInfo;
-Landroid/window/WindowInfosListener;
-Landroid/window/WindowMetricsController$$ExternalSyntheticLambda0;
-Landroid/window/WindowMetricsController;
-Landroid/window/WindowOnBackInvokedDispatcher$$ExternalSyntheticLambda0;
-Landroid/window/WindowOnBackInvokedDispatcher$Checker;
-Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda0;
-Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda1;
-Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda2;
-Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda3;
-Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda4;
-Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda5;
-Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$CallbackRef;
-Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper;
-Landroid/window/WindowOnBackInvokedDispatcher;
-Landroid/window/WindowOrganizer$1;
-Landroid/window/WindowOrganizer;
-Landroid/window/WindowProvider;
-Landroid/window/WindowProviderService;
-Landroid/window/WindowTokenClient;
-Landroid/window/WindowTokenClientController;
-Lcom/android/apex/ApexInfo;
-Lcom/android/apex/ApexInfoList;
-Lcom/android/apex/XmlParser;
-Lcom/android/cellbroadcastservice/CellBroadcastStatsLog;
-Lcom/android/framework/protobuf/AbstractMessageLite$Builder;
-Lcom/android/framework/protobuf/AbstractMessageLite;
-Lcom/android/framework/protobuf/AbstractParser;
-Lcom/android/framework/protobuf/AbstractProtobufList;
-Lcom/android/framework/protobuf/Android;
-Lcom/android/framework/protobuf/ArrayDecoders$Registers;
-Lcom/android/framework/protobuf/ArrayDecoders;
-Lcom/android/framework/protobuf/CodedInputStream$ArrayDecoder;
-Lcom/android/framework/protobuf/CodedInputStream;
-Lcom/android/framework/protobuf/ExtensionRegistryFactory;
-Lcom/android/framework/protobuf/ExtensionRegistryLite;
-Lcom/android/framework/protobuf/ExtensionSchema;
-Lcom/android/framework/protobuf/ExtensionSchemaLite;
-Lcom/android/framework/protobuf/ExtensionSchemas;
-Lcom/android/framework/protobuf/GeneratedMessageInfoFactory;
-Lcom/android/framework/protobuf/GeneratedMessageLite$Builder;
-Lcom/android/framework/protobuf/GeneratedMessageLite$DefaultInstanceBasedParser;
-Lcom/android/framework/protobuf/GeneratedMessageLite$ExtendableMessage;
-Lcom/android/framework/protobuf/GeneratedMessageLite$ExtendableMessageOrBuilder;
-Lcom/android/framework/protobuf/GeneratedMessageLite$MethodToInvoke;
-Lcom/android/framework/protobuf/GeneratedMessageLite$SerializedForm;
-Lcom/android/framework/protobuf/GeneratedMessageLite;
-Lcom/android/framework/protobuf/Internal$EnumVerifier;
-Lcom/android/framework/protobuf/Internal$ProtobufList;
-Lcom/android/framework/protobuf/Internal;
-Lcom/android/framework/protobuf/InvalidProtocolBufferException$InvalidWireTypeException;
-Lcom/android/framework/protobuf/InvalidProtocolBufferException;
-Lcom/android/framework/protobuf/ListFieldSchema$ListFieldSchemaFull;
-Lcom/android/framework/protobuf/ListFieldSchema$ListFieldSchemaLite;
-Lcom/android/framework/protobuf/ListFieldSchema;
-Lcom/android/framework/protobuf/ManifestSchemaFactory$1;
-Lcom/android/framework/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory;
-Lcom/android/framework/protobuf/ManifestSchemaFactory;
-Lcom/android/framework/protobuf/MapFieldSchema;
-Lcom/android/framework/protobuf/MapFieldSchemaLite;
-Lcom/android/framework/protobuf/MapFieldSchemas;
-Lcom/android/framework/protobuf/MessageInfo;
-Lcom/android/framework/protobuf/MessageInfoFactory;
-Lcom/android/framework/protobuf/MessageLite$Builder;
-Lcom/android/framework/protobuf/MessageLite;
-Lcom/android/framework/protobuf/MessageLiteOrBuilder;
-Lcom/android/framework/protobuf/MessageSchema;
-Lcom/android/framework/protobuf/MessageSetSchema;
-Lcom/android/framework/protobuf/NewInstanceSchema;
-Lcom/android/framework/protobuf/NewInstanceSchemaLite;
-Lcom/android/framework/protobuf/NewInstanceSchemas;
-Lcom/android/framework/protobuf/Parser;
-Lcom/android/framework/protobuf/ProtoSyntax;
-Lcom/android/framework/protobuf/Protobuf;
-Lcom/android/framework/protobuf/ProtobufArrayList;
-Lcom/android/framework/protobuf/RawMessageInfo;
-Lcom/android/framework/protobuf/Schema;
-Lcom/android/framework/protobuf/SchemaFactory;
-Lcom/android/framework/protobuf/SchemaUtil;
-Lcom/android/framework/protobuf/StructuralMessageInfo;
-Lcom/android/framework/protobuf/UninitializedMessageException;
-Lcom/android/framework/protobuf/UnknownFieldSchema;
-Lcom/android/framework/protobuf/UnknownFieldSetLite;
-Lcom/android/framework/protobuf/UnknownFieldSetLiteSchema;
-Lcom/android/framework/protobuf/UnsafeUtil$1;
-Lcom/android/framework/protobuf/UnsafeUtil$Android64MemoryAccessor;
-Lcom/android/framework/protobuf/UnsafeUtil$JvmMemoryAccessor;
-Lcom/android/framework/protobuf/UnsafeUtil$MemoryAccessor;
-Lcom/android/framework/protobuf/UnsafeUtil;
-Lcom/android/framework/protobuf/nano/CodedInputByteBufferNano;
-Lcom/android/framework/protobuf/nano/CodedOutputByteBufferNano$OutOfSpaceException;
-Lcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;
-Lcom/android/framework/protobuf/nano/InternalNano;
-Lcom/android/framework/protobuf/nano/InvalidProtocolBufferNanoException;
-Lcom/android/framework/protobuf/nano/MessageNano;
-Lcom/android/framework/protobuf/nano/WireFormatNano;
-Lcom/android/graphics/hwui/flags/Flags;
-Lcom/android/i18n/phonenumbers/AlternateFormatsCountryCodeSet;
-Lcom/android/i18n/phonenumbers/AsYouTypeFormatter;
-Lcom/android/i18n/phonenumbers/CountryCodeToRegionCodeMap;
-Lcom/android/i18n/phonenumbers/MetadataLoader;
-Lcom/android/i18n/phonenumbers/MissingMetadataException;
-Lcom/android/i18n/phonenumbers/NumberParseException$ErrorType;
-Lcom/android/i18n/phonenumbers/NumberParseException;
-Lcom/android/i18n/phonenumbers/PhoneNumberMatch;
-Lcom/android/i18n/phonenumbers/PhoneNumberMatcher$NumberGroupingChecker;
-Lcom/android/i18n/phonenumbers/PhoneNumberMatcher$State;
-Lcom/android/i18n/phonenumbers/PhoneNumberMatcher;
-Lcom/android/i18n/phonenumbers/PhoneNumberToTimeZonesMapper$LazyHolder;
-Lcom/android/i18n/phonenumbers/PhoneNumberToTimeZonesMapper;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$1;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$2;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$Leniency$1;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$Leniency$2;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$Leniency$3$1;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$Leniency$3;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$Leniency$4$1;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$Leniency$4;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$Leniency;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$MatchType;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$ValidationResult;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil;
-Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat$Builder;
-Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;
-Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata$Builder;
-Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadataCollection$Builder;
-Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadataCollection;
-Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc$Builder;
-Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-Lcom/android/i18n/phonenumbers/Phonemetadata;
-Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;
-Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
-Lcom/android/i18n/phonenumbers/Phonenumber;
-Lcom/android/i18n/phonenumbers/ShortNumberInfo$ShortNumberCost;
-Lcom/android/i18n/phonenumbers/ShortNumberInfo;
-Lcom/android/i18n/phonenumbers/ShortNumbersRegionCodeSet;
-Lcom/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder;
-Lcom/android/i18n/phonenumbers/internal/MatcherApi;
-Lcom/android/i18n/phonenumbers/internal/RegexBasedMatcher;
-Lcom/android/i18n/phonenumbers/internal/RegexCache$LRUCache$1;
-Lcom/android/i18n/phonenumbers/internal/RegexCache$LRUCache;
-Lcom/android/i18n/phonenumbers/internal/RegexCache;
-Lcom/android/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider;
-Lcom/android/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader;
-Lcom/android/i18n/phonenumbers/metadata/init/MetadataParser;
-Lcom/android/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard;
-Lcom/android/i18n/phonenumbers/metadata/source/CompositeMetadataContainer;
-Lcom/android/i18n/phonenumbers/metadata/source/FormattingMetadataSource;
-Lcom/android/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl;
-Lcom/android/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer$1;
-Lcom/android/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer$2;
-Lcom/android/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer$KeyProvider;
-Lcom/android/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer;
-Lcom/android/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard;
-Lcom/android/i18n/phonenumbers/metadata/source/MetadataContainer;
-Lcom/android/i18n/phonenumbers/metadata/source/MetadataSource;
-Lcom/android/i18n/phonenumbers/metadata/source/MetadataSourceImpl;
-Lcom/android/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider;
-Lcom/android/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource;
-Lcom/android/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider;
-Lcom/android/i18n/phonenumbers/metadata/source/RegionMetadataSource;
-Lcom/android/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl;
-Lcom/android/i18n/phonenumbers/prefixmapper/DefaultMapStorage;
-Lcom/android/i18n/phonenumbers/prefixmapper/FlyweightMapStorage;
-Lcom/android/i18n/phonenumbers/prefixmapper/MappingFileProvider;
-Lcom/android/i18n/phonenumbers/prefixmapper/PhonePrefixMap;
-Lcom/android/i18n/phonenumbers/prefixmapper/PhonePrefixMapStorageStrategy;
-Lcom/android/i18n/phonenumbers/prefixmapper/PrefixFileReader;
-Lcom/android/i18n/phonenumbers/prefixmapper/PrefixTimeZonesMap;
-Lcom/android/i18n/system/AppSpecializationHooks;
-Lcom/android/i18n/system/ZygoteHooks;
-Lcom/android/i18n/timezone/CountryTimeZones$OffsetResult;
-Lcom/android/i18n/timezone/CountryTimeZones$TimeZoneMapping;
-Lcom/android/i18n/timezone/CountryTimeZones;
-Lcom/android/i18n/timezone/CountryZonesFinder;
-Lcom/android/i18n/timezone/DebugInfo$DebugEntry;
-Lcom/android/i18n/timezone/DebugInfo;
-Lcom/android/i18n/timezone/I18nModuleDebug;
-Lcom/android/i18n/timezone/TelephonyLookup$TelephonyNetworkProcessor;
-Lcom/android/i18n/timezone/TelephonyLookup$TelephonyNetworkValidator;
-Lcom/android/i18n/timezone/TelephonyLookup$TelephonyNetworksExtractor;
-Lcom/android/i18n/timezone/TelephonyLookup;
-Lcom/android/i18n/timezone/TelephonyNetwork$MccMnc;
-Lcom/android/i18n/timezone/TelephonyNetwork;
-Lcom/android/i18n/timezone/TelephonyNetworkFinder;
-Lcom/android/i18n/timezone/TimeZoneDataFiles;
-Lcom/android/i18n/timezone/TimeZoneFinder$CountryZonesLookupExtractor;
-Lcom/android/i18n/timezone/TimeZoneFinder$IanaVersionExtractor;
-Lcom/android/i18n/timezone/TimeZoneFinder$SelectiveCountryTimeZonesExtractor;
-Lcom/android/i18n/timezone/TimeZoneFinder$TimeZonesProcessor;
-Lcom/android/i18n/timezone/TimeZoneFinder$TimeZonesValidator;
-Lcom/android/i18n/timezone/TimeZoneFinder;
-Lcom/android/i18n/timezone/TzDataSetVersion$TzDataSetException;
-Lcom/android/i18n/timezone/TzDataSetVersion;
-Lcom/android/i18n/timezone/WallTime$CheckedArithmeticException;
-Lcom/android/i18n/timezone/WallTime$OffsetInterval;
-Lcom/android/i18n/timezone/WallTime;
-Lcom/android/i18n/timezone/XmlUtils$ReaderSupplier$$ExternalSyntheticLambda0;
-Lcom/android/i18n/timezone/XmlUtils$ReaderSupplier$$ExternalSyntheticLambda1;
-Lcom/android/i18n/timezone/XmlUtils$ReaderSupplier;
-Lcom/android/i18n/timezone/XmlUtils;
-Lcom/android/i18n/timezone/ZoneInfoData;
-Lcom/android/i18n/timezone/ZoneInfoDb$1;
-Lcom/android/i18n/timezone/ZoneInfoDb;
-Lcom/android/i18n/timezone/internal/BasicLruCache$CacheMap;
-Lcom/android/i18n/timezone/internal/BasicLruCache;
-Lcom/android/i18n/timezone/internal/BufferIterator;
-Lcom/android/i18n/timezone/internal/ByteBufferIterator;
-Lcom/android/i18n/timezone/internal/Memory;
-Lcom/android/i18n/timezone/internal/MemoryMappedFile;
-Lcom/android/i18n/timezone/internal/NioBufferIterator;
-Lcom/android/i18n/util/Log;
-Lcom/android/icu/charset/CharsetEncoderICU;
-Lcom/android/icu/charset/CharsetFactory;
-Lcom/android/icu/charset/NativeConverter;
-Lcom/android/icu/text/CompatibleDecimalFormatFactory;
-Lcom/android/icu/text/DateSorterBridge;
-Lcom/android/icu/text/ExtendedDateFormatSymbols;
-Lcom/android/icu/text/ExtendedDecimalFormatSymbols;
-Lcom/android/icu/text/ExtendedIDNA;
-Lcom/android/icu/text/ExtendedTimeZoneNames$Match;
-Lcom/android/icu/text/ExtendedTimeZoneNames;
-Lcom/android/icu/text/TimeZoneNamesNative;
-Lcom/android/icu/util/CaseMapperNative;
-Lcom/android/icu/util/ExtendedCalendar;
-Lcom/android/icu/util/ExtendedTimeZone;
-Lcom/android/icu/util/Icu4cMetadata;
-Lcom/android/icu/util/LocaleNative;
-Lcom/android/icu/util/regex/MatcherNative;
-Lcom/android/icu/util/regex/PatternNative;
-Lcom/android/ims/FeatureConnection$$ExternalSyntheticLambda0;
-Lcom/android/ims/FeatureConnection$$ExternalSyntheticLambda1;
-Lcom/android/ims/FeatureConnection;
-Lcom/android/ims/FeatureConnector$$ExternalSyntheticLambda0;
-Lcom/android/ims/FeatureConnector$1$$ExternalSyntheticLambda0;
-Lcom/android/ims/FeatureConnector$1$$ExternalSyntheticLambda1;
-Lcom/android/ims/FeatureConnector$1;
-Lcom/android/ims/FeatureConnector$Listener;
-Lcom/android/ims/FeatureConnector$ManagerFactory;
-Lcom/android/ims/FeatureConnector$UnavailableReason;
-Lcom/android/ims/FeatureConnector;
-Lcom/android/ims/FeatureUpdates;
-Lcom/android/ims/ImsCall$ImsCallSessionListenerProxy;
-Lcom/android/ims/ImsCall$Listener;
-Lcom/android/ims/ImsCall;
-Lcom/android/ims/ImsCallbackAdapterManager;
-Lcom/android/ims/ImsConfig;
-Lcom/android/ims/ImsConfigListener$Stub$Proxy;
-Lcom/android/ims/ImsConfigListener$Stub;
-Lcom/android/ims/ImsConfigListener;
-Lcom/android/ims/ImsConnectionStateListener;
-Lcom/android/ims/ImsEcbm$ImsEcbmListenerProxy;
-Lcom/android/ims/ImsEcbm;
-Lcom/android/ims/ImsEcbmStateListener;
-Lcom/android/ims/ImsException;
-Lcom/android/ims/ImsExternalCallStateListener;
-Lcom/android/ims/ImsFeatureBinderRepository$$ExternalSyntheticLambda0;
-Lcom/android/ims/ImsFeatureBinderRepository$ListenerContainer$$ExternalSyntheticLambda0;
-Lcom/android/ims/ImsFeatureBinderRepository$ListenerContainer$$ExternalSyntheticLambda1;
-Lcom/android/ims/ImsFeatureBinderRepository$ListenerContainer$$ExternalSyntheticLambda2;
-Lcom/android/ims/ImsFeatureBinderRepository$ListenerContainer$$ExternalSyntheticLambda3;
-Lcom/android/ims/ImsFeatureBinderRepository$ListenerContainer;
-Lcom/android/ims/ImsFeatureBinderRepository$UpdateMapper$$ExternalSyntheticLambda0;
-Lcom/android/ims/ImsFeatureBinderRepository$UpdateMapper$$ExternalSyntheticLambda1;
-Lcom/android/ims/ImsFeatureBinderRepository$UpdateMapper$$ExternalSyntheticLambda2;
-Lcom/android/ims/ImsFeatureBinderRepository$UpdateMapper$$ExternalSyntheticLambda3;
-Lcom/android/ims/ImsFeatureBinderRepository$UpdateMapper$$ExternalSyntheticLambda4;
-Lcom/android/ims/ImsFeatureBinderRepository$UpdateMapper$$ExternalSyntheticLambda5;
-Lcom/android/ims/ImsFeatureBinderRepository$UpdateMapper;
-Lcom/android/ims/ImsFeatureBinderRepository;
-Lcom/android/ims/ImsFeatureContainer$1;
-Lcom/android/ims/ImsFeatureContainer;
-Lcom/android/ims/ImsManager$$ExternalSyntheticLambda0;
-Lcom/android/ims/ImsManager$$ExternalSyntheticLambda10;
-Lcom/android/ims/ImsManager$$ExternalSyntheticLambda11;
-Lcom/android/ims/ImsManager$$ExternalSyntheticLambda12;
-Lcom/android/ims/ImsManager$$ExternalSyntheticLambda1;
-Lcom/android/ims/ImsManager$$ExternalSyntheticLambda2;
-Lcom/android/ims/ImsManager$$ExternalSyntheticLambda3;
-Lcom/android/ims/ImsManager$$ExternalSyntheticLambda4;
-Lcom/android/ims/ImsManager$$ExternalSyntheticLambda5;
-Lcom/android/ims/ImsManager$$ExternalSyntheticLambda6;
-Lcom/android/ims/ImsManager$$ExternalSyntheticLambda7;
-Lcom/android/ims/ImsManager$$ExternalSyntheticLambda8;
-Lcom/android/ims/ImsManager$$ExternalSyntheticLambda9;
-Lcom/android/ims/ImsManager$1;
-Lcom/android/ims/ImsManager$2;
-Lcom/android/ims/ImsManager$DefaultSettingsProxy;
-Lcom/android/ims/ImsManager$DefaultSubscriptionManagerProxy;
-Lcom/android/ims/ImsManager$ImsStatsCallback;
-Lcom/android/ims/ImsManager$InstanceManager$$ExternalSyntheticLambda0;
-Lcom/android/ims/ImsManager$InstanceManager;
-Lcom/android/ims/ImsManager$LazyExecutor;
-Lcom/android/ims/ImsManager$MmTelFeatureConnectionFactory;
-Lcom/android/ims/ImsManager$SettingsProxy;
-Lcom/android/ims/ImsManager$SubscriptionManagerProxy;
-Lcom/android/ims/ImsManager;
-Lcom/android/ims/ImsMultiEndpoint$ImsExternalCallStateListenerProxy;
-Lcom/android/ims/ImsMultiEndpoint;
-Lcom/android/ims/ImsServiceClass;
-Lcom/android/ims/ImsUt$IImsUtListenerProxy;
-Lcom/android/ims/ImsUt;
-Lcom/android/ims/ImsUtInterface;
-Lcom/android/ims/MmTelFeatureConnection$BinderAccessState;
-Lcom/android/ims/MmTelFeatureConnection$CapabilityCallbackManager;
-Lcom/android/ims/MmTelFeatureConnection$ImsRegistrationCallbackAdapter;
-Lcom/android/ims/MmTelFeatureConnection$ProvisioningCallbackManager;
-Lcom/android/ims/MmTelFeatureConnection;
-Lcom/android/ims/Preconditions;
-Lcom/android/ims/RcsFeatureConnection$AvailabilityCallbackManager;
-Lcom/android/ims/RcsFeatureConnection$RegistrationCallbackManager;
-Lcom/android/ims/RcsFeatureConnection;
-Lcom/android/ims/RcsFeatureManager$$ExternalSyntheticLambda0;
-Lcom/android/ims/RcsFeatureManager$$ExternalSyntheticLambda1;
-Lcom/android/ims/RcsFeatureManager$$ExternalSyntheticLambda2;
-Lcom/android/ims/RcsFeatureManager$1$$ExternalSyntheticLambda0;
-Lcom/android/ims/RcsFeatureManager$1$$ExternalSyntheticLambda1;
-Lcom/android/ims/RcsFeatureManager$1$$ExternalSyntheticLambda2;
-Lcom/android/ims/RcsFeatureManager$1;
-Lcom/android/ims/RcsFeatureManager$2;
-Lcom/android/ims/RcsFeatureManager$CapabilityExchangeEventCallback;
-Lcom/android/ims/RcsFeatureManager;
-Lcom/android/ims/RcsPresenceInfo$1;
-Lcom/android/ims/RcsPresenceInfo$ServiceInfoKey;
-Lcom/android/ims/RcsPresenceInfo$ServiceState;
-Lcom/android/ims/RcsPresenceInfo$ServiceType;
-Lcom/android/ims/RcsPresenceInfo$VolteStatus;
-Lcom/android/ims/RcsPresenceInfo;
-Lcom/android/ims/Registrant;
-Lcom/android/ims/RegistrantList;
-Lcom/android/ims/ResultCode;
-Lcom/android/ims/SomeArgs;
-Lcom/android/ims/internal/ConferenceParticipant$1;
-Lcom/android/ims/internal/ConferenceParticipant;
-Lcom/android/ims/internal/ContactNumberUtils;
-Lcom/android/ims/internal/ICall;
-Lcom/android/ims/internal/IImsCallSession$Stub;
-Lcom/android/ims/internal/IImsCallSession;
-Lcom/android/ims/internal/IImsConfig;
-Lcom/android/ims/internal/IImsEcbm$Stub$Proxy;
-Lcom/android/ims/internal/IImsEcbm$Stub;
-Lcom/android/ims/internal/IImsEcbm;
-Lcom/android/ims/internal/IImsEcbmListener$Stub$Proxy;
-Lcom/android/ims/internal/IImsEcbmListener$Stub;
-Lcom/android/ims/internal/IImsEcbmListener;
-Lcom/android/ims/internal/IImsExternalCallStateListener$Stub$Proxy;
-Lcom/android/ims/internal/IImsExternalCallStateListener$Stub;
-Lcom/android/ims/internal/IImsExternalCallStateListener;
-Lcom/android/ims/internal/IImsFeatureStatusCallback$Stub$Proxy;
-Lcom/android/ims/internal/IImsFeatureStatusCallback$Stub;
-Lcom/android/ims/internal/IImsFeatureStatusCallback;
-Lcom/android/ims/internal/IImsMMTelFeature$Stub;
-Lcom/android/ims/internal/IImsMMTelFeature;
-Lcom/android/ims/internal/IImsMultiEndpoint$Stub$Proxy;
-Lcom/android/ims/internal/IImsMultiEndpoint$Stub;
-Lcom/android/ims/internal/IImsMultiEndpoint;
-Lcom/android/ims/internal/IImsRegistrationListener$Stub;
-Lcom/android/ims/internal/IImsRegistrationListener;
-Lcom/android/ims/internal/IImsServiceController$Stub;
-Lcom/android/ims/internal/IImsServiceController;
-Lcom/android/ims/internal/IImsServiceFeatureCallback$Stub$Proxy;
-Lcom/android/ims/internal/IImsServiceFeatureCallback$Stub;
-Lcom/android/ims/internal/IImsServiceFeatureCallback;
-Lcom/android/ims/internal/IImsStreamMediaSession;
-Lcom/android/ims/internal/IImsUt$Stub$Proxy;
-Lcom/android/ims/internal/IImsUt$Stub;
-Lcom/android/ims/internal/IImsUt;
-Lcom/android/ims/internal/IImsUtListener$Stub$Proxy;
-Lcom/android/ims/internal/IImsUtListener$Stub;
-Lcom/android/ims/internal/IImsUtListener;
-Lcom/android/ims/internal/IImsVideoCallCallback$Stub;
-Lcom/android/ims/internal/IImsVideoCallCallback;
-Lcom/android/ims/internal/IImsVideoCallProvider;
-Lcom/android/ims/internal/ImsStreamMediaSession$Listener;
-Lcom/android/ims/internal/ImsStreamMediaSession;
-Lcom/android/ims/internal/ImsVideoCallProviderWrapper$1;
-Lcom/android/ims/internal/ImsVideoCallProviderWrapper$2;
-Lcom/android/ims/internal/ImsVideoCallProviderWrapper$ImsVideoCallCallback;
-Lcom/android/ims/internal/ImsVideoCallProviderWrapper$ImsVideoProviderWrapperCallback;
-Lcom/android/ims/internal/ImsVideoCallProviderWrapper;
-Lcom/android/ims/internal/Logger;
-Lcom/android/ims/internal/VideoPauseTracker$$ExternalSyntheticLambda0;
-Lcom/android/ims/internal/VideoPauseTracker;
-Lcom/android/ims/internal/uce/UceServiceBase$UceServiceBinder;
-Lcom/android/ims/internal/uce/UceServiceBase;
-Lcom/android/ims/internal/uce/common/CapInfo$1;
-Lcom/android/ims/internal/uce/common/CapInfo;
-Lcom/android/ims/internal/uce/common/StatusCode$1;
-Lcom/android/ims/internal/uce/common/UceLong$1;
-Lcom/android/ims/internal/uce/common/UceLong;
-Lcom/android/ims/internal/uce/options/IOptionsListener$Stub$Proxy;
-Lcom/android/ims/internal/uce/options/IOptionsListener$Stub;
-Lcom/android/ims/internal/uce/options/IOptionsListener;
-Lcom/android/ims/internal/uce/options/IOptionsService;
-Lcom/android/ims/internal/uce/presence/IPresenceListener$Stub$Proxy;
-Lcom/android/ims/internal/uce/presence/IPresenceListener$Stub;
-Lcom/android/ims/internal/uce/presence/IPresenceListener;
-Lcom/android/ims/internal/uce/presence/IPresenceService$Stub;
-Lcom/android/ims/internal/uce/presence/IPresenceService;
-Lcom/android/ims/internal/uce/presence/PresCapInfo$1;
-Lcom/android/ims/internal/uce/presence/PresCmdId$1;
-Lcom/android/ims/internal/uce/presence/PresCmdStatus$1;
-Lcom/android/ims/internal/uce/presence/PresPublishTriggerType$1;
-Lcom/android/ims/internal/uce/presence/PresSipResponse$1;
-Lcom/android/ims/internal/uce/uceservice/IUceListener$Stub$Proxy;
-Lcom/android/ims/internal/uce/uceservice/IUceListener$Stub;
-Lcom/android/ims/internal/uce/uceservice/IUceListener;
-Lcom/android/ims/internal/uce/uceservice/IUceService$Stub;
-Lcom/android/ims/internal/uce/uceservice/IUceService;
-Lcom/android/ims/rcs/uce/ControllerBase;
-Lcom/android/ims/rcs/uce/UceController$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/UceController$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/UceController$$ExternalSyntheticLambda2;
-Lcom/android/ims/rcs/uce/UceController$$ExternalSyntheticLambda3;
-Lcom/android/ims/rcs/uce/UceController$1;
-Lcom/android/ims/rcs/uce/UceController$2;
-Lcom/android/ims/rcs/uce/UceController$3;
-Lcom/android/ims/rcs/uce/UceController$CachedCapabilityEvent$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/UceController$CachedCapabilityEvent;
-Lcom/android/ims/rcs/uce/UceController$ControllerFactory;
-Lcom/android/ims/rcs/uce/UceController$RcsConnectedState;
-Lcom/android/ims/rcs/uce/UceController$RequestManagerFactory;
-Lcom/android/ims/rcs/uce/UceController$UceControllerCallback;
-Lcom/android/ims/rcs/uce/UceController;
-Lcom/android/ims/rcs/uce/UceDeviceState$DeviceStateResult;
-Lcom/android/ims/rcs/uce/UceDeviceState$DeviceStateType;
-Lcom/android/ims/rcs/uce/UceDeviceState;
-Lcom/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater$1;
-Lcom/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater$CapabilityExpiredListener;
-Lcom/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater$ContactChangedListener;
-Lcom/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater$EabSettingsListener;
-Lcom/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater$SyncContactRunnable;
-Lcom/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater$retryRunnable;
-Lcom/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater;
-Lcom/android/ims/rcs/uce/eab/EabCapabilityResult$QueryResult;
-Lcom/android/ims/rcs/uce/eab/EabCapabilityResult;
-Lcom/android/ims/rcs/uce/eab/EabContactSyncController$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/eab/EabContactSyncController;
-Lcom/android/ims/rcs/uce/eab/EabController;
-Lcom/android/ims/rcs/uce/eab/EabControllerImpl$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/eab/EabControllerImpl$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/eab/EabControllerImpl$$ExternalSyntheticLambda2;
-Lcom/android/ims/rcs/uce/eab/EabControllerImpl$ExpirationTimeFactory;
-Lcom/android/ims/rcs/uce/eab/EabControllerImpl;
-Lcom/android/ims/rcs/uce/eab/EabProvider$ContactColumns;
-Lcom/android/ims/rcs/uce/eab/EabProvider$EabCommonColumns;
-Lcom/android/ims/rcs/uce/eab/EabProvider$EabDatabaseHelper;
-Lcom/android/ims/rcs/uce/eab/EabProvider$OptionsColumns;
-Lcom/android/ims/rcs/uce/eab/EabProvider$PresenceTupleColumns;
-Lcom/android/ims/rcs/uce/eab/EabProvider;
-Lcom/android/ims/rcs/uce/eab/EabUtil;
-Lcom/android/ims/rcs/uce/eab/RcsUceCapabilityBuilderWrapper;
-Lcom/android/ims/rcs/uce/options/OptionsController;
-Lcom/android/ims/rcs/uce/options/OptionsControllerImpl;
-Lcom/android/ims/rcs/uce/presence/pidfparser/ElementBase;
-Lcom/android/ims/rcs/uce/presence/pidfparser/PidfParser$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/presence/pidfparser/PidfParser$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/presence/pidfparser/PidfParser$TimestampProxy;
-Lcom/android/ims/rcs/uce/presence/pidfparser/PidfParser;
-Lcom/android/ims/rcs/uce/presence/pidfparser/PidfParserConstant;
-Lcom/android/ims/rcs/uce/presence/pidfparser/PidfParserUtils$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/presence/pidfparser/PidfParserUtils;
-Lcom/android/ims/rcs/uce/presence/pidfparser/capabilities/Audio;
-Lcom/android/ims/rcs/uce/presence/pidfparser/capabilities/CapsConstant;
-Lcom/android/ims/rcs/uce/presence/pidfparser/capabilities/Duplex$DuplexType;
-Lcom/android/ims/rcs/uce/presence/pidfparser/capabilities/Duplex;
-Lcom/android/ims/rcs/uce/presence/pidfparser/capabilities/ServiceCaps;
-Lcom/android/ims/rcs/uce/presence/pidfparser/capabilities/Video;
-Lcom/android/ims/rcs/uce/presence/pidfparser/omapres/Description;
-Lcom/android/ims/rcs/uce/presence/pidfparser/omapres/OmaPresConstant;
-Lcom/android/ims/rcs/uce/presence/pidfparser/omapres/ServiceDescription;
-Lcom/android/ims/rcs/uce/presence/pidfparser/omapres/ServiceId;
-Lcom/android/ims/rcs/uce/presence/pidfparser/omapres/Version;
-Lcom/android/ims/rcs/uce/presence/pidfparser/pidf/Basic$BasicValue;
-Lcom/android/ims/rcs/uce/presence/pidfparser/pidf/Basic;
-Lcom/android/ims/rcs/uce/presence/pidfparser/pidf/Contact;
-Lcom/android/ims/rcs/uce/presence/pidfparser/pidf/Note;
-Lcom/android/ims/rcs/uce/presence/pidfparser/pidf/PidfConstant;
-Lcom/android/ims/rcs/uce/presence/pidfparser/pidf/Presence;
-Lcom/android/ims/rcs/uce/presence/pidfparser/pidf/Status;
-Lcom/android/ims/rcs/uce/presence/pidfparser/pidf/Timestamp;
-Lcom/android/ims/rcs/uce/presence/pidfparser/pidf/Tuple;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$$ExternalSyntheticLambda2;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$1;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$2;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$3;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$4;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$5;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$6;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$7;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$DeviceCapabilityHandler;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$ImsMmTelManagerFactory;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$ImsRcsManagerFactory;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener$ProvisioningManagerFactory;
-Lcom/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener;
-Lcom/android/ims/rcs/uce/presence/publish/PublishController$PublishControllerCallback;
-Lcom/android/ims/rcs/uce/presence/publish/PublishController$PublishTriggerType;
-Lcom/android/ims/rcs/uce/presence/publish/PublishController;
-Lcom/android/ims/rcs/uce/presence/publish/PublishControllerImpl$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/presence/publish/PublishControllerImpl$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/presence/publish/PublishControllerImpl$$ExternalSyntheticLambda2;
-Lcom/android/ims/rcs/uce/presence/publish/PublishControllerImpl$1;
-Lcom/android/ims/rcs/uce/presence/publish/PublishControllerImpl$2;
-Lcom/android/ims/rcs/uce/presence/publish/PublishControllerImpl$DeviceCapListenerFactory;
-Lcom/android/ims/rcs/uce/presence/publish/PublishControllerImpl$PublishHandler;
-Lcom/android/ims/rcs/uce/presence/publish/PublishControllerImpl$PublishProcessorFactory;
-Lcom/android/ims/rcs/uce/presence/publish/PublishControllerImpl;
-Lcom/android/ims/rcs/uce/presence/publish/PublishProcessor$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/presence/publish/PublishProcessor;
-Lcom/android/ims/rcs/uce/presence/publish/PublishProcessorState$PendingRequest;
-Lcom/android/ims/rcs/uce/presence/publish/PublishProcessorState$PublishThrottle;
-Lcom/android/ims/rcs/uce/presence/publish/PublishProcessorState;
-Lcom/android/ims/rcs/uce/presence/publish/PublishRequestResponse$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/presence/publish/PublishRequestResponse$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/presence/publish/PublishRequestResponse$$ExternalSyntheticLambda2;
-Lcom/android/ims/rcs/uce/presence/publish/PublishRequestResponse$1;
-Lcom/android/ims/rcs/uce/presence/publish/PublishRequestResponse;
-Lcom/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker$$ExternalSyntheticLambda2;
-Lcom/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker$$ExternalSyntheticLambda3;
-Lcom/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker$$ExternalSyntheticLambda4;
-Lcom/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker;
-Lcom/android/ims/rcs/uce/presence/publish/PublishUtils;
-Lcom/android/ims/rcs/uce/presence/publish/ServiceDescription;
-Lcom/android/ims/rcs/uce/presence/subscribe/SubscribeController;
-Lcom/android/ims/rcs/uce/presence/subscribe/SubscribeControllerImpl;
-Lcom/android/ims/rcs/uce/request/CapabilityRequest$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/request/CapabilityRequest$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/request/CapabilityRequest$$ExternalSyntheticLambda2;
-Lcom/android/ims/rcs/uce/request/CapabilityRequest$$ExternalSyntheticLambda3;
-Lcom/android/ims/rcs/uce/request/CapabilityRequest$$ExternalSyntheticLambda4;
-Lcom/android/ims/rcs/uce/request/CapabilityRequest$$ExternalSyntheticLambda5;
-Lcom/android/ims/rcs/uce/request/CapabilityRequest;
-Lcom/android/ims/rcs/uce/request/CapabilityRequestResponse$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/request/CapabilityRequestResponse$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/request/CapabilityRequestResponse$$ExternalSyntheticLambda2;
-Lcom/android/ims/rcs/uce/request/CapabilityRequestResponse$$ExternalSyntheticLambda3;
-Lcom/android/ims/rcs/uce/request/CapabilityRequestResponse$$ExternalSyntheticLambda4;
-Lcom/android/ims/rcs/uce/request/CapabilityRequestResponse$$ExternalSyntheticLambda5;
-Lcom/android/ims/rcs/uce/request/CapabilityRequestResponse$$ExternalSyntheticLambda6;
-Lcom/android/ims/rcs/uce/request/CapabilityRequestResponse$$ExternalSyntheticLambda7;
-Lcom/android/ims/rcs/uce/request/CapabilityRequestResponse$$ExternalSyntheticLambda8;
-Lcom/android/ims/rcs/uce/request/CapabilityRequestResponse$$ExternalSyntheticLambda9;
-Lcom/android/ims/rcs/uce/request/CapabilityRequestResponse;
-Lcom/android/ims/rcs/uce/request/OptionsRequest$1;
-Lcom/android/ims/rcs/uce/request/OptionsRequest;
-Lcom/android/ims/rcs/uce/request/OptionsRequestCoordinator$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/request/OptionsRequestCoordinator$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/request/OptionsRequestCoordinator$$ExternalSyntheticLambda2;
-Lcom/android/ims/rcs/uce/request/OptionsRequestCoordinator$$ExternalSyntheticLambda3;
-Lcom/android/ims/rcs/uce/request/OptionsRequestCoordinator$$ExternalSyntheticLambda4;
-Lcom/android/ims/rcs/uce/request/OptionsRequestCoordinator$Builder;
-Lcom/android/ims/rcs/uce/request/OptionsRequestCoordinator$RequestResultCreator;
-Lcom/android/ims/rcs/uce/request/OptionsRequestCoordinator;
-Lcom/android/ims/rcs/uce/request/RemoteOptionsCoordinator$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/request/RemoteOptionsCoordinator$Builder;
-Lcom/android/ims/rcs/uce/request/RemoteOptionsCoordinator$RequestResultCreator;
-Lcom/android/ims/rcs/uce/request/RemoteOptionsCoordinator;
-Lcom/android/ims/rcs/uce/request/RemoteOptionsRequest$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/request/RemoteOptionsRequest$RemoteOptResponse;
-Lcom/android/ims/rcs/uce/request/RemoteOptionsRequest;
-Lcom/android/ims/rcs/uce/request/SubscribeRequest$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/request/SubscribeRequest$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/request/SubscribeRequest$1;
-Lcom/android/ims/rcs/uce/request/SubscribeRequest;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator$$ExternalSyntheticLambda10;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator$$ExternalSyntheticLambda2;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator$$ExternalSyntheticLambda3;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator$$ExternalSyntheticLambda4;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator$$ExternalSyntheticLambda5;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator$$ExternalSyntheticLambda6;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator$$ExternalSyntheticLambda7;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator$$ExternalSyntheticLambda8;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator$$ExternalSyntheticLambda9;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator$Builder;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator$RequestResultCreator;
-Lcom/android/ims/rcs/uce/request/SubscribeRequestCoordinator;
-Lcom/android/ims/rcs/uce/request/SubscriptionTerminatedHelper$TerminatedResult;
-Lcom/android/ims/rcs/uce/request/SubscriptionTerminatedHelper;
-Lcom/android/ims/rcs/uce/request/UceRequest$UceRequestType;
-Lcom/android/ims/rcs/uce/request/UceRequest;
-Lcom/android/ims/rcs/uce/request/UceRequestCoordinator$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/request/UceRequestCoordinator$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/request/UceRequestCoordinator$$ExternalSyntheticLambda2;
-Lcom/android/ims/rcs/uce/request/UceRequestCoordinator$$ExternalSyntheticLambda3;
-Lcom/android/ims/rcs/uce/request/UceRequestCoordinator$$ExternalSyntheticLambda4;
-Lcom/android/ims/rcs/uce/request/UceRequestCoordinator$RequestResult;
-Lcom/android/ims/rcs/uce/request/UceRequestCoordinator$UceRequestUpdate;
-Lcom/android/ims/rcs/uce/request/UceRequestCoordinator;
-Lcom/android/ims/rcs/uce/request/UceRequestDispatcher$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/request/UceRequestDispatcher$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/request/UceRequestDispatcher$Request;
-Lcom/android/ims/rcs/uce/request/UceRequestDispatcher;
-Lcom/android/ims/rcs/uce/request/UceRequestManager$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/request/UceRequestManager$$ExternalSyntheticLambda1;
-Lcom/android/ims/rcs/uce/request/UceRequestManager$$ExternalSyntheticLambda2;
-Lcom/android/ims/rcs/uce/request/UceRequestManager$1;
-Lcom/android/ims/rcs/uce/request/UceRequestManager$2;
-Lcom/android/ims/rcs/uce/request/UceRequestManager$RequestManagerCallback;
-Lcom/android/ims/rcs/uce/request/UceRequestManager$UceRequestHandler;
-Lcom/android/ims/rcs/uce/request/UceRequestManager$UceUtilsProxy;
-Lcom/android/ims/rcs/uce/request/UceRequestManager;
-Lcom/android/ims/rcs/uce/request/UceRequestRepository$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/request/UceRequestRepository;
-Lcom/android/ims/rcs/uce/util/FeatureTags$$ExternalSyntheticLambda0;
-Lcom/android/ims/rcs/uce/util/FeatureTags;
-Lcom/android/ims/rcs/uce/util/NetworkSipCode;
-Lcom/android/ims/rcs/uce/util/UceUtils;
-Lcom/android/input/flags/Flags;
-Lcom/android/internal/R$attr;
-Lcom/android/internal/R$dimen;
-Lcom/android/internal/R$id;
-Lcom/android/internal/R$string;
-Lcom/android/internal/R$styleable;
-Lcom/android/internal/accessibility/AccessibilityShortcutController$1;
-Lcom/android/internal/accessibility/AccessibilityShortcutController$FrameworkFeatureInfo;
-Lcom/android/internal/accessibility/AccessibilityShortcutController$FrameworkObjectProvider;
-Lcom/android/internal/accessibility/AccessibilityShortcutController$ToggleableFrameworkFeatureInfo;
-Lcom/android/internal/accessibility/AccessibilityShortcutController;
-Lcom/android/internal/accessibility/util/AccessibilityUtils;
-Lcom/android/internal/alsa/AlsaCardsParser$AlsaCardRecord;
-Lcom/android/internal/alsa/AlsaCardsParser;
-Lcom/android/internal/alsa/LineTokenizer;
-Lcom/android/internal/app/AlertActivity;
-Lcom/android/internal/app/AlertController$1;
-Lcom/android/internal/app/AlertController$AlertParams;
-Lcom/android/internal/app/AlertController$ButtonHandler;
-Lcom/android/internal/app/AlertController$RecycleListView;
-Lcom/android/internal/app/AlertController;
-Lcom/android/internal/app/AssistUtils;
-Lcom/android/internal/app/IAppOpsActiveCallback$Stub$Proxy;
-Lcom/android/internal/app/IAppOpsActiveCallback$Stub;
-Lcom/android/internal/app/IAppOpsActiveCallback;
-Lcom/android/internal/app/IAppOpsAsyncNotedCallback$Stub;
-Lcom/android/internal/app/IAppOpsAsyncNotedCallback;
-Lcom/android/internal/app/IAppOpsCallback$Stub$Proxy;
-Lcom/android/internal/app/IAppOpsCallback$Stub;
-Lcom/android/internal/app/IAppOpsCallback;
-Lcom/android/internal/app/IAppOpsNotedCallback$Stub;
-Lcom/android/internal/app/IAppOpsNotedCallback;
-Lcom/android/internal/app/IAppOpsService$Stub$Proxy;
-Lcom/android/internal/app/IAppOpsService$Stub;
-Lcom/android/internal/app/IAppOpsService;
-Lcom/android/internal/app/IAppOpsStartedCallback$Stub$Proxy;
-Lcom/android/internal/app/IAppOpsStartedCallback$Stub;
-Lcom/android/internal/app/IAppOpsStartedCallback;
-Lcom/android/internal/app/IBatteryStats$Stub$Proxy;
-Lcom/android/internal/app/IBatteryStats$Stub;
-Lcom/android/internal/app/IBatteryStats;
-Lcom/android/internal/app/ISoundTriggerService$Stub;
-Lcom/android/internal/app/ISoundTriggerService;
-Lcom/android/internal/app/ISoundTriggerSession$Stub;
-Lcom/android/internal/app/ISoundTriggerSession;
-Lcom/android/internal/app/IVoiceActionCheckCallback$Stub$Proxy;
-Lcom/android/internal/app/IVoiceActionCheckCallback$Stub;
-Lcom/android/internal/app/IVoiceActionCheckCallback;
-Lcom/android/internal/app/IVoiceInteractionManagerService$Stub$Proxy;
-Lcom/android/internal/app/IVoiceInteractionManagerService$Stub;
-Lcom/android/internal/app/IVoiceInteractionManagerService;
-Lcom/android/internal/app/IVoiceInteractionSessionListener$Stub$Proxy;
-Lcom/android/internal/app/IVoiceInteractionSessionListener$Stub;
-Lcom/android/internal/app/IVoiceInteractionSessionListener;
-Lcom/android/internal/app/IVoiceInteractionSessionShowCallback$Stub$Proxy;
-Lcom/android/internal/app/IVoiceInteractionSessionShowCallback$Stub;
-Lcom/android/internal/app/IVoiceInteractionSessionShowCallback;
-Lcom/android/internal/app/IVoiceInteractionSoundTriggerSession$Stub;
-Lcom/android/internal/app/IVoiceInteractionSoundTriggerSession;
-Lcom/android/internal/app/IVoiceInteractor$Stub$Proxy;
-Lcom/android/internal/app/IVoiceInteractor$Stub;
-Lcom/android/internal/app/IVoiceInteractor;
-Lcom/android/internal/app/IntentForwarderActivity;
-Lcom/android/internal/app/MessageSamplingConfig$1;
-Lcom/android/internal/app/MessageSamplingConfig;
-Lcom/android/internal/app/MicroAlertController;
-Lcom/android/internal/app/ProcessMap;
-Lcom/android/internal/app/ResolverActivity$ActionTitle;
-Lcom/android/internal/app/ResolverActivity;
-Lcom/android/internal/app/ResolverListAdapter$ResolverListCommunicator;
-Lcom/android/internal/app/ToolbarActionBar;
-Lcom/android/internal/app/WindowDecorActionBar$1;
-Lcom/android/internal/app/WindowDecorActionBar$2;
-Lcom/android/internal/app/WindowDecorActionBar$3;
-Lcom/android/internal/app/WindowDecorActionBar;
-Lcom/android/internal/app/procstats/AssociationState$$ExternalSyntheticLambda0;
-Lcom/android/internal/app/procstats/AssociationState$SourceDumpContainer;
-Lcom/android/internal/app/procstats/AssociationState$SourceKey;
-Lcom/android/internal/app/procstats/AssociationState$SourceState;
-Lcom/android/internal/app/procstats/AssociationState;
-Lcom/android/internal/app/procstats/DumpUtils;
-Lcom/android/internal/app/procstats/DurationsTable;
-Lcom/android/internal/app/procstats/IProcessStats$Stub$Proxy;
-Lcom/android/internal/app/procstats/IProcessStats$Stub;
-Lcom/android/internal/app/procstats/IProcessStats;
-Lcom/android/internal/app/procstats/ProcessState$1;
-Lcom/android/internal/app/procstats/ProcessState$PssAggr;
-Lcom/android/internal/app/procstats/ProcessState;
-Lcom/android/internal/app/procstats/ProcessStats$$ExternalSyntheticLambda0;
-Lcom/android/internal/app/procstats/ProcessStats$$ExternalSyntheticLambda1;
-Lcom/android/internal/app/procstats/ProcessStats$$ExternalSyntheticLambda2;
-Lcom/android/internal/app/procstats/ProcessStats$1;
-Lcom/android/internal/app/procstats/ProcessStats$AssociationDumpContainer;
-Lcom/android/internal/app/procstats/ProcessStats$PackageState;
-Lcom/android/internal/app/procstats/ProcessStats$ProcessDataCollection;
-Lcom/android/internal/app/procstats/ProcessStats$ProcessStateHolder;
-Lcom/android/internal/app/procstats/ProcessStats$TotalMemoryUseCollection;
-Lcom/android/internal/app/procstats/ProcessStats;
-Lcom/android/internal/app/procstats/PssTable;
-Lcom/android/internal/app/procstats/ServiceState;
-Lcom/android/internal/app/procstats/SparseMappingTable$Table;
-Lcom/android/internal/app/procstats/SparseMappingTable;
-Lcom/android/internal/app/procstats/SysMemUsageTable;
-Lcom/android/internal/app/procstats/UidState;
-Lcom/android/internal/appwidget/IAppWidgetHost$Stub$Proxy;
-Lcom/android/internal/appwidget/IAppWidgetHost$Stub;
-Lcom/android/internal/appwidget/IAppWidgetHost;
-Lcom/android/internal/appwidget/IAppWidgetService$Stub$Proxy;
-Lcom/android/internal/appwidget/IAppWidgetService$Stub;
-Lcom/android/internal/appwidget/IAppWidgetService;
-Lcom/android/internal/backup/IBackupTransport$Stub$Proxy;
-Lcom/android/internal/backup/IBackupTransport$Stub;
-Lcom/android/internal/backup/IBackupTransport;
-Lcom/android/internal/colorextraction/ColorExtractor$GradientColors;
-Lcom/android/internal/colorextraction/ColorExtractor$LoadWallpaperColors;
-Lcom/android/internal/colorextraction/ColorExtractor$OnColorsChangedListener;
-Lcom/android/internal/colorextraction/ColorExtractor;
-Lcom/android/internal/colorextraction/types/ExtractionType;
-Lcom/android/internal/colorextraction/types/Tonal$ConfigParser;
-Lcom/android/internal/colorextraction/types/Tonal$TonalPalette;
-Lcom/android/internal/colorextraction/types/Tonal;
-Lcom/android/internal/compat/AndroidBuildClassifier;
-Lcom/android/internal/compat/ChangeReporter$ChangeReport;
-Lcom/android/internal/compat/ChangeReporter;
-Lcom/android/internal/compat/CompatibilityChangeConfig$1;
-Lcom/android/internal/compat/CompatibilityChangeConfig;
-Lcom/android/internal/compat/CompatibilityChangeInfo$1;
-Lcom/android/internal/compat/CompatibilityChangeInfo;
-Lcom/android/internal/compat/IOverrideValidator$Stub;
-Lcom/android/internal/compat/IOverrideValidator;
-Lcom/android/internal/compat/IPlatformCompat$Stub$Proxy;
-Lcom/android/internal/compat/IPlatformCompat$Stub;
-Lcom/android/internal/compat/IPlatformCompat;
-Lcom/android/internal/compat/IPlatformCompatNative$Stub;
-Lcom/android/internal/compat/IPlatformCompatNative;
-Lcom/android/internal/config/appcloning/AppCloningDeviceConfigHelper$$ExternalSyntheticLambda0;
-Lcom/android/internal/config/appcloning/AppCloningDeviceConfigHelper;
-Lcom/android/internal/config/sysui/SystemUiSystemPropertiesFlags$DebugResolver;
-Lcom/android/internal/config/sysui/SystemUiSystemPropertiesFlags$Flag;
-Lcom/android/internal/config/sysui/SystemUiSystemPropertiesFlags$FlagResolver;
-Lcom/android/internal/config/sysui/SystemUiSystemPropertiesFlags$NotificationFlags;
-Lcom/android/internal/config/sysui/SystemUiSystemPropertiesFlags;
-Lcom/android/internal/content/F2fsUtils;
-Lcom/android/internal/content/NativeLibraryHelper$Handle;
-Lcom/android/internal/content/NativeLibraryHelper;
-Lcom/android/internal/content/PackageMonitor;
-Lcom/android/internal/content/ReferrerIntent$1;
-Lcom/android/internal/content/ReferrerIntent;
-Lcom/android/internal/content/om/OverlayConfig$$ExternalSyntheticLambda0;
-Lcom/android/internal/content/om/OverlayConfig$$ExternalSyntheticLambda2;
-Lcom/android/internal/content/om/OverlayConfig$$ExternalSyntheticLambda3;
-Lcom/android/internal/content/om/OverlayConfig$$ExternalSyntheticLambda4;
-Lcom/android/internal/content/om/OverlayConfig$$ExternalSyntheticLambda5;
-Lcom/android/internal/content/om/OverlayConfig$$ExternalSyntheticLambda7;
-Lcom/android/internal/content/om/OverlayConfig$Configuration;
-Lcom/android/internal/content/om/OverlayConfig$IdmapInvocation;
-Lcom/android/internal/content/om/OverlayConfig$PackageProvider;
-Lcom/android/internal/content/om/OverlayConfig;
-Lcom/android/internal/content/om/OverlayConfigParser$OverlayPartition;
-Lcom/android/internal/content/om/OverlayConfigParser$ParsedConfigFile;
-Lcom/android/internal/content/om/OverlayConfigParser$ParsedConfiguration;
-Lcom/android/internal/content/om/OverlayConfigParser$ParsingContext;
-Lcom/android/internal/content/om/OverlayConfigParser;
-Lcom/android/internal/content/om/OverlayManagerImpl;
-Lcom/android/internal/content/om/OverlayScanner$ParsedOverlayInfo;
-Lcom/android/internal/content/om/OverlayScanner;
-Lcom/android/internal/database/SortCursor;
-Lcom/android/internal/display/BrightnessSynchronizer;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$10;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$11;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$12;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$13;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$14;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$1;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$2;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$3;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$4;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$5;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$6;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$7;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$8;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$9;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$MassState;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$ViewProperty;
-Lcom/android/internal/dynamicanimation/animation/DynamicAnimation;
-Lcom/android/internal/dynamicanimation/animation/Force;
-Lcom/android/internal/dynamicanimation/animation/SpringAnimation;
-Lcom/android/internal/dynamicanimation/animation/SpringForce;
-Lcom/android/internal/graphics/ColorUtils$ContrastCalculator;
-Lcom/android/internal/graphics/ColorUtils;
-Lcom/android/internal/graphics/SfVsyncFrameCallbackProvider;
-Lcom/android/internal/graphics/cam/Cam;
-Lcom/android/internal/graphics/cam/CamUtils;
-Lcom/android/internal/graphics/cam/Frame;
-Lcom/android/internal/graphics/cam/HctSolver;
-Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;
-Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable-IA;
-Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable;
-Lcom/android/internal/graphics/drawable/BackgroundBlurDrawable$Aggregator;
-Lcom/android/internal/graphics/drawable/BackgroundBlurDrawable$BlurRegion;
-Lcom/android/internal/graphics/drawable/BackgroundBlurDrawable-IA;
-Lcom/android/internal/graphics/drawable/BackgroundBlurDrawable;
-Lcom/android/internal/hidden_from_bootclasspath/android/service/notification/Flags;
-Lcom/android/internal/infra/AbstractMultiplePendingRequestsRemoteService;
-Lcom/android/internal/infra/AbstractRemoteService$AsyncRequest;
-Lcom/android/internal/infra/AbstractRemoteService$BasePendingRequest;
-Lcom/android/internal/infra/AbstractRemoteService$MyAsyncPendingRequest;
-Lcom/android/internal/infra/AbstractRemoteService$PendingRequest;
-Lcom/android/internal/infra/AbstractRemoteService$RemoteServiceConnection;
-Lcom/android/internal/infra/AbstractRemoteService$VultureCallback;
-Lcom/android/internal/infra/AbstractRemoteService;
-Lcom/android/internal/infra/AbstractSinglePendingRequestRemoteService;
-Lcom/android/internal/infra/AndroidFuture$$ExternalSyntheticLambda1;
-Lcom/android/internal/infra/AndroidFuture$$ExternalSyntheticLambda3;
-Lcom/android/internal/infra/AndroidFuture$1;
-Lcom/android/internal/infra/AndroidFuture$2;
-Lcom/android/internal/infra/AndroidFuture;
-Lcom/android/internal/infra/GlobalWhitelistState;
-Lcom/android/internal/infra/IAndroidFuture$Stub$Proxy;
-Lcom/android/internal/infra/IAndroidFuture$Stub;
-Lcom/android/internal/infra/IAndroidFuture;
-Lcom/android/internal/infra/PerUser;
-Lcom/android/internal/infra/RemoteStream$1;
-Lcom/android/internal/infra/RemoteStream;
-Lcom/android/internal/infra/ServiceConnector$Impl$CompletionAwareJob;
-Lcom/android/internal/infra/ServiceConnector$Impl;
-Lcom/android/internal/infra/ServiceConnector$Job;
-Lcom/android/internal/infra/ServiceConnector$VoidJob;
-Lcom/android/internal/infra/ServiceConnector;
-Lcom/android/internal/infra/WhitelistHelper;
-Lcom/android/internal/inputmethod/EditableInputConnection;
-Lcom/android/internal/inputmethod/IAccessibilityInputMethodSession$Stub$Proxy;
-Lcom/android/internal/inputmethod/IAccessibilityInputMethodSession$Stub;
-Lcom/android/internal/inputmethod/IAccessibilityInputMethodSession;
-Lcom/android/internal/inputmethod/IImeTracker$Stub$Proxy;
-Lcom/android/internal/inputmethod/IImeTracker$Stub;
-Lcom/android/internal/inputmethod/IImeTracker;
-Lcom/android/internal/inputmethod/IInputContentUriToken;
-Lcom/android/internal/inputmethod/IInputMethod$Stub;
-Lcom/android/internal/inputmethod/IInputMethod;
-Lcom/android/internal/inputmethod/IInputMethodClient$Stub;
-Lcom/android/internal/inputmethod/IInputMethodClient;
-Lcom/android/internal/inputmethod/IInputMethodPrivilegedOperations$Stub$Proxy;
-Lcom/android/internal/inputmethod/IInputMethodPrivilegedOperations$Stub;
-Lcom/android/internal/inputmethod/IInputMethodPrivilegedOperations;
-Lcom/android/internal/inputmethod/IInputMethodSession$Stub$Proxy;
-Lcom/android/internal/inputmethod/IInputMethodSession$Stub;
-Lcom/android/internal/inputmethod/IInputMethodSession;
-Lcom/android/internal/inputmethod/IRemoteAccessibilityInputConnection$Stub;
-Lcom/android/internal/inputmethod/IRemoteAccessibilityInputConnection;
-Lcom/android/internal/inputmethod/IRemoteInputConnection$Stub$Proxy;
-Lcom/android/internal/inputmethod/IRemoteInputConnection$Stub;
-Lcom/android/internal/inputmethod/IRemoteInputConnection;
-Lcom/android/internal/inputmethod/ImeTracing;
-Lcom/android/internal/inputmethod/ImeTracingClientImpl;
-Lcom/android/internal/inputmethod/ImeTracingServerImpl;
-Lcom/android/internal/inputmethod/InputBindResult$1;
-Lcom/android/internal/inputmethod/InputBindResult-IA;
-Lcom/android/internal/inputmethod/InputBindResult;
-Lcom/android/internal/inputmethod/InputConnectionCommandHeader$1;
-Lcom/android/internal/inputmethod/InputConnectionCommandHeader;
-Lcom/android/internal/inputmethod/InputMethodDebug;
-Lcom/android/internal/inputmethod/InputMethodPrivilegedOperations$OpsHolder;
-Lcom/android/internal/inputmethod/InputMethodPrivilegedOperations;
-Lcom/android/internal/inputmethod/InputMethodPrivilegedOperationsRegistry;
-Lcom/android/internal/inputmethod/SubtypeLocaleUtils;
-Lcom/android/internal/jank/Cuj;
-Lcom/android/internal/jank/DisplayResolutionTracker$1;
-Lcom/android/internal/jank/DisplayResolutionTracker$DisplayInterface$1;
-Lcom/android/internal/jank/DisplayResolutionTracker$DisplayInterface;
-Lcom/android/internal/jank/DisplayResolutionTracker;
-Lcom/android/internal/jank/EventLogTags;
-Lcom/android/internal/jank/FrameTracker$$ExternalSyntheticLambda0;
-Lcom/android/internal/jank/FrameTracker$$ExternalSyntheticLambda1;
-Lcom/android/internal/jank/FrameTracker$$ExternalSyntheticLambda2;
-Lcom/android/internal/jank/FrameTracker$ChoreographerWrapper;
-Lcom/android/internal/jank/FrameTracker$FrameMetricsWrapper;
-Lcom/android/internal/jank/FrameTracker$FrameTrackerListener;
-Lcom/android/internal/jank/FrameTracker$JankInfo;
-Lcom/android/internal/jank/FrameTracker$SurfaceControlWrapper;
-Lcom/android/internal/jank/FrameTracker$ThreadedRendererWrapper;
-Lcom/android/internal/jank/FrameTracker;
-Lcom/android/internal/jank/InteractionJankMonitor$$ExternalSyntheticLambda0;
-Lcom/android/internal/jank/InteractionJankMonitor$$ExternalSyntheticLambda10;
-Lcom/android/internal/jank/InteractionJankMonitor$$ExternalSyntheticLambda1;
-Lcom/android/internal/jank/InteractionJankMonitor$$ExternalSyntheticLambda2;
-Lcom/android/internal/jank/InteractionJankMonitor$$ExternalSyntheticLambda3;
-Lcom/android/internal/jank/InteractionJankMonitor$$ExternalSyntheticLambda5;
-Lcom/android/internal/jank/InteractionJankMonitor$$ExternalSyntheticLambda6;
-Lcom/android/internal/jank/InteractionJankMonitor$$ExternalSyntheticLambda7;
-Lcom/android/internal/jank/InteractionJankMonitor$$ExternalSyntheticLambda8;
-Lcom/android/internal/jank/InteractionJankMonitor$$ExternalSyntheticLambda9;
-Lcom/android/internal/jank/InteractionJankMonitor$Configuration;
-Lcom/android/internal/jank/InteractionJankMonitor$InstanceHolder;
-Lcom/android/internal/jank/InteractionJankMonitor$RunningTracker;
-Lcom/android/internal/jank/InteractionJankMonitor$TimeFunction;
-Lcom/android/internal/jank/InteractionJankMonitor$TrackerResult-IA;
-Lcom/android/internal/jank/InteractionJankMonitor$TrackerResult;
-Lcom/android/internal/jank/InteractionJankMonitor;
-Lcom/android/internal/listeners/ListenerExecutor$$ExternalSyntheticLambda0;
-Lcom/android/internal/listeners/ListenerExecutor$FailureCallback;
-Lcom/android/internal/listeners/ListenerExecutor$ListenerOperation;
-Lcom/android/internal/listeners/ListenerExecutor;
-Lcom/android/internal/listeners/ListenerTransport;
-Lcom/android/internal/listeners/ListenerTransportManager;
-Lcom/android/internal/location/altitude/nano/MapParamsProto;
-Lcom/android/internal/location/altitude/nano/S2TileProto;
-Lcom/android/internal/location/nano/GnssLogsProto$GnssLog;
-Lcom/android/internal/location/nano/GnssLogsProto$PowerMetrics;
-Lcom/android/internal/logging/AndroidConfig;
-Lcom/android/internal/logging/AndroidHandler$1;
-Lcom/android/internal/logging/AndroidHandler;
-Lcom/android/internal/logging/EventLogTags;
-Lcom/android/internal/logging/InstanceId$1;
-Lcom/android/internal/logging/InstanceId-IA;
-Lcom/android/internal/logging/InstanceId;
-Lcom/android/internal/logging/InstanceIdSequence;
-Lcom/android/internal/logging/MetricsLogger;
-Lcom/android/internal/logging/UiEventLogger$UiEventEnum;
-Lcom/android/internal/logging/UiEventLogger;
-Lcom/android/internal/logging/UiEventLoggerImpl;
-Lcom/android/internal/net/INetworkWatchlistManager$Stub$Proxy;
-Lcom/android/internal/net/INetworkWatchlistManager$Stub;
-Lcom/android/internal/net/INetworkWatchlistManager;
-Lcom/android/internal/net/LegacyVpnInfo$1;
-Lcom/android/internal/net/LegacyVpnInfo;
-Lcom/android/internal/net/NetworkUtilsInternal;
-Lcom/android/internal/net/VpnConfig$1;
-Lcom/android/internal/net/VpnConfig;
-Lcom/android/internal/net/VpnProfile$1;
-Lcom/android/internal/net/VpnProfile;
-Lcom/android/internal/notification/SystemNotificationChannels;
-Lcom/android/internal/org/bouncycastle/cert/AttributeCertificateHolder;
-Lcom/android/internal/org/bouncycastle/cms/CMSException;
-Lcom/android/internal/org/bouncycastle/jcajce/util/BCJcaJceHelper;
-Lcom/android/internal/org/bouncycastle/jcajce/util/JcaJceHelper;
-Lcom/android/internal/org/bouncycastle/jcajce/util/ProviderJcaJceHelper;
-Lcom/android/internal/org/bouncycastle/operator/OperatorCreationException;
-Lcom/android/internal/org/bouncycastle/operator/OperatorException;
-Lcom/android/internal/org/bouncycastle/util/Selector;
-Lcom/android/internal/os/AndroidPrintStream;
-Lcom/android/internal/os/AppFuseMount$1;
-Lcom/android/internal/os/AppFuseMount;
-Lcom/android/internal/os/AppIdToPackageMap;
-Lcom/android/internal/os/AtomicDirectory;
-Lcom/android/internal/os/BackgroundThread;
-Lcom/android/internal/os/BatteryStatsHistory$HistoryStepDetailsCalculator;
-Lcom/android/internal/os/BatteryStatsHistory$TraceDelegate;
-Lcom/android/internal/os/BatteryStatsHistory$VarintParceler;
-Lcom/android/internal/os/BatteryStatsHistory;
-Lcom/android/internal/os/BinderCallHeavyHitterWatcher$BinderCallHeavyHitterListener;
-Lcom/android/internal/os/BinderCallHeavyHitterWatcher$HeavyHitterContainer;
-Lcom/android/internal/os/BinderCallHeavyHitterWatcher;
-Lcom/android/internal/os/BinderCallsStats$1;
-Lcom/android/internal/os/BinderCallsStats$CallStat;
-Lcom/android/internal/os/BinderCallsStats$CallStatKey;
-Lcom/android/internal/os/BinderCallsStats$ExportedCallStat;
-Lcom/android/internal/os/BinderCallsStats$Injector;
-Lcom/android/internal/os/BinderCallsStats$OverflowBinder;
-Lcom/android/internal/os/BinderCallsStats$SettingsObserver;
-Lcom/android/internal/os/BinderCallsStats$UidEntry;
-Lcom/android/internal/os/BinderCallsStats;
-Lcom/android/internal/os/BinderDeathDispatcher$RecipientsInfo-IA;
-Lcom/android/internal/os/BinderDeathDispatcher$RecipientsInfo;
-Lcom/android/internal/os/BinderDeathDispatcher;
-Lcom/android/internal/os/BinderInternal$BinderProxyLimitListener;
-Lcom/android/internal/os/BinderInternal$BinderProxyLimitListenerDelegate;
-Lcom/android/internal/os/BinderInternal$CallSession;
-Lcom/android/internal/os/BinderInternal$CallStatsObserver;
-Lcom/android/internal/os/BinderInternal$GcWatcher;
-Lcom/android/internal/os/BinderInternal$Observer;
-Lcom/android/internal/os/BinderInternal$WorkSourceProvider;
-Lcom/android/internal/os/BinderInternal;
-Lcom/android/internal/os/BinderLatencyBuckets;
-Lcom/android/internal/os/BinderLatencyObserver$1;
-Lcom/android/internal/os/BinderLatencyObserver$Injector;
-Lcom/android/internal/os/BinderLatencyObserver$LatencyDims;
-Lcom/android/internal/os/BinderLatencyObserver;
-Lcom/android/internal/os/BinderTransactionNameResolver;
-Lcom/android/internal/os/ByteTransferPipe;
-Lcom/android/internal/os/CachedDeviceState$Readonly;
-Lcom/android/internal/os/CachedDeviceState$TimeInStateStopwatch;
-Lcom/android/internal/os/CachedDeviceState;
-Lcom/android/internal/os/ClassLoaderFactory;
-Lcom/android/internal/os/Clock;
-Lcom/android/internal/os/FuseAppLoop$1;
-Lcom/android/internal/os/FuseAppLoop;
-Lcom/android/internal/os/FuseUnavailableMountException;
-Lcom/android/internal/os/HandlerCaller$Callback;
-Lcom/android/internal/os/HandlerCaller$MyHandler;
-Lcom/android/internal/os/HandlerCaller;
-Lcom/android/internal/os/IDropBoxManagerService$Stub$Proxy;
-Lcom/android/internal/os/IDropBoxManagerService$Stub;
-Lcom/android/internal/os/IDropBoxManagerService;
-Lcom/android/internal/os/IResultReceiver$Stub$Proxy;
-Lcom/android/internal/os/IResultReceiver$Stub;
-Lcom/android/internal/os/IResultReceiver;
-Lcom/android/internal/os/IShellCallback$Stub$Proxy;
-Lcom/android/internal/os/IShellCallback$Stub;
-Lcom/android/internal/os/IShellCallback;
-Lcom/android/internal/os/KernelAllocationStats$ProcessDmabuf;
-Lcom/android/internal/os/KernelAllocationStats$ProcessGpuMem;
-Lcom/android/internal/os/KernelAllocationStats;
-Lcom/android/internal/os/KernelCpuBpfTracking;
-Lcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;
-Lcom/android/internal/os/KernelCpuProcStringReader;
-Lcom/android/internal/os/KernelCpuSpeedReader;
-Lcom/android/internal/os/KernelCpuThreadReader$FrequencyBucketCreator;
-Lcom/android/internal/os/KernelCpuThreadReader$Injector;
-Lcom/android/internal/os/KernelCpuThreadReader$ProcessCpuUsage;
-Lcom/android/internal/os/KernelCpuThreadReader$ThreadCpuUsage;
-Lcom/android/internal/os/KernelCpuThreadReader;
-Lcom/android/internal/os/KernelCpuThreadReaderDiff$ThreadKey;
-Lcom/android/internal/os/KernelCpuThreadReaderDiff;
-Lcom/android/internal/os/KernelCpuThreadReaderSettingsObserver$UidPredicate;
-Lcom/android/internal/os/KernelCpuThreadReaderSettingsObserver;
-Lcom/android/internal/os/KernelCpuTotalBpfMapReader;
-Lcom/android/internal/os/KernelCpuUidBpfMapReader$BpfMapIterator;
-Lcom/android/internal/os/KernelCpuUidBpfMapReader$KernelCpuUidActiveTimeBpfMapReader;
-Lcom/android/internal/os/KernelCpuUidBpfMapReader$KernelCpuUidClusterTimeBpfMapReader;
-Lcom/android/internal/os/KernelCpuUidBpfMapReader$KernelCpuUidFreqTimeBpfMapReader;
-Lcom/android/internal/os/KernelCpuUidBpfMapReader;
-Lcom/android/internal/os/KernelCpuUidTimeReader$Callback;
-Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidActiveTimeReader;
-Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidClusterTimeReader;
-Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;
-Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidUserSysTimeReader;
-Lcom/android/internal/os/KernelCpuUidTimeReader;
-Lcom/android/internal/os/KernelMemoryBandwidthStats;
-Lcom/android/internal/os/KernelSingleProcessCpuThreadReader$CpuTimeInStateReader;
-Lcom/android/internal/os/KernelSingleProcessCpuThreadReader$ProcessCpuUsage;
-Lcom/android/internal/os/KernelSingleProcessCpuThreadReader;
-Lcom/android/internal/os/KernelSingleUidTimeReader$Injector;
-Lcom/android/internal/os/KernelSingleUidTimeReader;
-Lcom/android/internal/os/LoggingPrintStream$1;
-Lcom/android/internal/os/LoggingPrintStream;
-Lcom/android/internal/os/LongArrayMultiStateCounter$1;
-Lcom/android/internal/os/LongArrayMultiStateCounter$LongArrayContainer;
-Lcom/android/internal/os/LongArrayMultiStateCounter;
-Lcom/android/internal/os/LongMultiStateCounter$1;
-Lcom/android/internal/os/LongMultiStateCounter;
-Lcom/android/internal/os/LooperStats$DispatchSession-IA;
-Lcom/android/internal/os/LooperStats$DispatchSession;
-Lcom/android/internal/os/LooperStats$Entry;
-Lcom/android/internal/os/LooperStats$ExportedEntry;
-Lcom/android/internal/os/LooperStats;
-Lcom/android/internal/os/PowerProfile$CpuClusterKey;
-Lcom/android/internal/os/PowerProfile;
-Lcom/android/internal/os/ProcStatsUtil;
-Lcom/android/internal/os/ProcTimeInStateReader;
-Lcom/android/internal/os/ProcessCpuTracker$1;
-Lcom/android/internal/os/ProcessCpuTracker$FilterStats;
-Lcom/android/internal/os/ProcessCpuTracker$Stats;
-Lcom/android/internal/os/ProcessCpuTracker;
-Lcom/android/internal/os/RailStats;
-Lcom/android/internal/os/RoSystemProperties;
-Lcom/android/internal/os/RpmStats$PowerStateElement;
-Lcom/android/internal/os/RpmStats$PowerStatePlatformSleepState;
-Lcom/android/internal/os/RpmStats$PowerStateSubsystem;
-Lcom/android/internal/os/RpmStats;
-Lcom/android/internal/os/RuntimeInit$$ExternalSyntheticLambda0;
-Lcom/android/internal/os/RuntimeInit$$ExternalSyntheticLambda1;
-Lcom/android/internal/os/RuntimeInit$ApplicationWtfHandler;
-Lcom/android/internal/os/RuntimeInit$Arguments;
-Lcom/android/internal/os/RuntimeInit$KillApplicationHandler;
-Lcom/android/internal/os/RuntimeInit$LoggingHandler-IA;
-Lcom/android/internal/os/RuntimeInit$LoggingHandler;
-Lcom/android/internal/os/RuntimeInit$MethodAndArgsCaller;
-Lcom/android/internal/os/RuntimeInit;
-Lcom/android/internal/os/SafeZipPathValidatorCallback;
-Lcom/android/internal/os/SomeArgs;
-Lcom/android/internal/os/StatsdHiddenApiUsageLogger;
-Lcom/android/internal/os/StoragedUidIoStatsReader$Callback;
-Lcom/android/internal/os/StoragedUidIoStatsReader;
-Lcom/android/internal/os/TransferPipe;
-Lcom/android/internal/os/WrapperInit;
-Lcom/android/internal/os/Zygote;
-Lcom/android/internal/os/ZygoteArguments;
-Lcom/android/internal/os/ZygoteCommandBuffer;
-Lcom/android/internal/os/ZygoteConfig;
-Lcom/android/internal/os/ZygoteConnection$$ExternalSyntheticLambda0;
-Lcom/android/internal/os/ZygoteConnection$$ExternalSyntheticLambda1;
-Lcom/android/internal/os/ZygoteConnection;
-Lcom/android/internal/os/ZygoteInit;
-Lcom/android/internal/os/ZygoteSecurityException;
-Lcom/android/internal/os/ZygoteServer$$ExternalSyntheticLambda0;
-Lcom/android/internal/os/ZygoteServer$UsapPoolRefillAction;
-Lcom/android/internal/os/ZygoteServer;
-Lcom/android/internal/os/logging/MetricsLoggerWrapper;
-Lcom/android/internal/pm/parsing/PackageParser2$Callback;
-Lcom/android/internal/pm/parsing/PackageParserException;
-Lcom/android/internal/pm/pkg/component/flags/Flags;
-Lcom/android/internal/pm/pkg/parsing/ParsingPackageUtils$Callback;
-Lcom/android/internal/policy/AttributeCache;
-Lcom/android/internal/policy/BackdropFrameRenderer;
-Lcom/android/internal/policy/DecorContext;
-Lcom/android/internal/policy/DecorView$$ExternalSyntheticLambda0;
-Lcom/android/internal/policy/DecorView$$ExternalSyntheticLambda1;
-Lcom/android/internal/policy/DecorView$1;
-Lcom/android/internal/policy/DecorView$2;
-Lcom/android/internal/policy/DecorView$3;
-Lcom/android/internal/policy/DecorView$6;
-Lcom/android/internal/policy/DecorView$ActionModeCallback2Wrapper$1;
-Lcom/android/internal/policy/DecorView$ActionModeCallback2Wrapper;
-Lcom/android/internal/policy/DecorView$ColorViewAttributes;
-Lcom/android/internal/policy/DecorView$ColorViewState;
-Lcom/android/internal/policy/DecorView;
-Lcom/android/internal/policy/GestureNavigationSettingsObserver$$ExternalSyntheticLambda0;
-Lcom/android/internal/policy/GestureNavigationSettingsObserver$1;
-Lcom/android/internal/policy/GestureNavigationSettingsObserver;
-Lcom/android/internal/policy/IKeyguardDismissCallback$Stub$Proxy;
-Lcom/android/internal/policy/IKeyguardDismissCallback$Stub;
-Lcom/android/internal/policy/IKeyguardDismissCallback;
-Lcom/android/internal/policy/IKeyguardDrawnCallback$Stub$Proxy;
-Lcom/android/internal/policy/IKeyguardDrawnCallback$Stub;
-Lcom/android/internal/policy/IKeyguardDrawnCallback;
-Lcom/android/internal/policy/IKeyguardExitCallback$Stub$Proxy;
-Lcom/android/internal/policy/IKeyguardExitCallback$Stub;
-Lcom/android/internal/policy/IKeyguardExitCallback;
-Lcom/android/internal/policy/IKeyguardLockedStateListener$Stub;
-Lcom/android/internal/policy/IKeyguardLockedStateListener;
-Lcom/android/internal/policy/IKeyguardService$Stub$Proxy;
-Lcom/android/internal/policy/IKeyguardService$Stub;
-Lcom/android/internal/policy/IKeyguardService;
-Lcom/android/internal/policy/IKeyguardStateCallback$Stub$Proxy;
-Lcom/android/internal/policy/IKeyguardStateCallback$Stub;
-Lcom/android/internal/policy/IKeyguardStateCallback;
-Lcom/android/internal/policy/IShortcutService$Stub$Proxy;
-Lcom/android/internal/policy/IShortcutService$Stub;
-Lcom/android/internal/policy/IShortcutService;
-Lcom/android/internal/policy/KeyInterceptionInfo;
-Lcom/android/internal/policy/LogDecelerateInterpolator;
-Lcom/android/internal/policy/PhoneFallbackEventHandler;
-Lcom/android/internal/policy/PhoneLayoutInflater;
-Lcom/android/internal/policy/PhoneWindow$$ExternalSyntheticLambda0;
-Lcom/android/internal/policy/PhoneWindow$$ExternalSyntheticLambda1;
-Lcom/android/internal/policy/PhoneWindow$1;
-Lcom/android/internal/policy/PhoneWindow$ActionMenuPresenterCallback;
-Lcom/android/internal/policy/PhoneWindow$PanelFeatureState$SavedState$1;
-Lcom/android/internal/policy/PhoneWindow$PanelFeatureState$SavedState-IA;
-Lcom/android/internal/policy/PhoneWindow$PanelFeatureState$SavedState;
-Lcom/android/internal/policy/PhoneWindow$PanelFeatureState;
-Lcom/android/internal/policy/PhoneWindow$PhoneWindowMenuCallback;
-Lcom/android/internal/policy/PhoneWindow$RotationWatcher$1;
-Lcom/android/internal/policy/PhoneWindow$RotationWatcher;
-Lcom/android/internal/policy/PhoneWindow;
-Lcom/android/internal/policy/ScreenDecorationsUtils;
-Lcom/android/internal/policy/SystemBarUtils;
-Lcom/android/internal/policy/TransitionAnimation$$ExternalSyntheticLambda0;
-Lcom/android/internal/policy/TransitionAnimation$$ExternalSyntheticLambda1;
-Lcom/android/internal/policy/TransitionAnimation;
-Lcom/android/internal/policy/WearGestureInterceptionDetector;
-Lcom/android/internal/power/ModemPowerProfile;
-Lcom/android/internal/protolog/ProtoLogGroup;
-Lcom/android/internal/protolog/ProtoLogImpl;
-Lcom/android/internal/protolog/ProtoLogViewerConfigReader;
-Lcom/android/internal/protolog/common/BitmaskConversionException;
-Lcom/android/internal/protolog/common/IProtoLogGroup;
-Lcom/android/internal/protolog/common/LogDataType;
-Lcom/android/internal/security/VerityUtils;
-Lcom/android/internal/statusbar/IAddTileResultCallback;
-Lcom/android/internal/statusbar/IStatusBar$Stub$Proxy;
-Lcom/android/internal/statusbar/IStatusBar$Stub;
-Lcom/android/internal/statusbar/IStatusBar;
-Lcom/android/internal/statusbar/IStatusBarService$Stub$Proxy;
-Lcom/android/internal/statusbar/IStatusBarService$Stub;
-Lcom/android/internal/statusbar/IStatusBarService;
-Lcom/android/internal/statusbar/IUndoMediaTransferCallback;
-Lcom/android/internal/statusbar/LetterboxDetails$1;
-Lcom/android/internal/statusbar/LetterboxDetails;
-Lcom/android/internal/statusbar/NotificationVisibility$1;
-Lcom/android/internal/statusbar/NotificationVisibility$NotificationLocation;
-Lcom/android/internal/statusbar/NotificationVisibility;
-Lcom/android/internal/statusbar/RegisterStatusBarResult$1;
-Lcom/android/internal/statusbar/RegisterStatusBarResult;
-Lcom/android/internal/statusbar/StatusBarIcon$1;
-Lcom/android/internal/statusbar/StatusBarIcon;
-Lcom/android/internal/telecom/ClientTransactionalServiceRepository;
-Lcom/android/internal/telecom/IConnectionService$Stub$Proxy;
-Lcom/android/internal/telecom/IConnectionService$Stub;
-Lcom/android/internal/telecom/IConnectionService;
-Lcom/android/internal/telecom/IConnectionServiceAdapter$Stub;
-Lcom/android/internal/telecom/IConnectionServiceAdapter;
-Lcom/android/internal/telecom/IDeviceIdleControllerAdapter$Stub;
-Lcom/android/internal/telecom/IDeviceIdleControllerAdapter;
-Lcom/android/internal/telecom/IInCallAdapter$Stub;
-Lcom/android/internal/telecom/IInCallAdapter;
-Lcom/android/internal/telecom/IInCallService$Stub$Proxy;
-Lcom/android/internal/telecom/IInCallService$Stub;
-Lcom/android/internal/telecom/IInCallService;
-Lcom/android/internal/telecom/IInternalServiceRetriever$Stub;
-Lcom/android/internal/telecom/IInternalServiceRetriever;
-Lcom/android/internal/telecom/ITelecomLoader$Stub$Proxy;
-Lcom/android/internal/telecom/ITelecomLoader$Stub;
-Lcom/android/internal/telecom/ITelecomLoader;
-Lcom/android/internal/telecom/ITelecomService$Stub$Proxy;
-Lcom/android/internal/telecom/ITelecomService$Stub;
-Lcom/android/internal/telecom/ITelecomService;
-Lcom/android/internal/telecom/IVideoCallback;
-Lcom/android/internal/telecom/IVideoProvider$Stub$Proxy;
-Lcom/android/internal/telecom/IVideoProvider$Stub;
-Lcom/android/internal/telecom/IVideoProvider;
-Lcom/android/internal/telecom/RemoteServiceCallback$Stub$Proxy;
-Lcom/android/internal/telecom/RemoteServiceCallback$Stub;
-Lcom/android/internal/telecom/RemoteServiceCallback;
-Lcom/android/internal/telephony/ATParseEx;
-Lcom/android/internal/telephony/ATResponseParser;
-Lcom/android/internal/telephony/AndroidUtilIndentingPrintWriter;
-Lcom/android/internal/telephony/AppSmsManager$AppRequestInfo;
-Lcom/android/internal/telephony/AppSmsManager;
-Lcom/android/internal/telephony/AsyncChannel$1ConnectAsync;
-Lcom/android/internal/telephony/AsyncChannel$AsyncChannelConnection;
-Lcom/android/internal/telephony/AsyncChannel$DeathMonitor;
-Lcom/android/internal/telephony/AsyncChannel$SyncMessenger$SyncHandler;
-Lcom/android/internal/telephony/AsyncChannel$SyncMessenger;
-Lcom/android/internal/telephony/AsyncChannel;
-Lcom/android/internal/telephony/AsyncEmergencyContactNotifier;
-Lcom/android/internal/telephony/AsyncService$AsyncServiceInfo;
-Lcom/android/internal/telephony/AsyncService;
-Lcom/android/internal/telephony/BaseCommands;
-Lcom/android/internal/telephony/BiMap;
-Lcom/android/internal/telephony/BitwiseInputStream$AccessException;
-Lcom/android/internal/telephony/BitwiseInputStream;
-Lcom/android/internal/telephony/BlockChecker;
-Lcom/android/internal/telephony/BtSmsInterfaceManager$MapMessageSender;
-Lcom/android/internal/telephony/BtSmsInterfaceManager;
-Lcom/android/internal/telephony/Call$1;
-Lcom/android/internal/telephony/Call$SrvccState;
-Lcom/android/internal/telephony/Call$State;
-Lcom/android/internal/telephony/Call;
-Lcom/android/internal/telephony/CallFailCause;
-Lcom/android/internal/telephony/CallForwardInfo;
-Lcom/android/internal/telephony/CallManager$CallManagerHandler;
-Lcom/android/internal/telephony/CallManager;
-Lcom/android/internal/telephony/CallStateException;
-Lcom/android/internal/telephony/CallTracker;
-Lcom/android/internal/telephony/CarrierActionAgent$1;
-Lcom/android/internal/telephony/CarrierActionAgent;
-Lcom/android/internal/telephony/CarrierAppUtils$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/CarrierAppUtils$AssociatedAppInfo;
-Lcom/android/internal/telephony/CarrierAppUtils;
-Lcom/android/internal/telephony/CarrierInfoManager;
-Lcom/android/internal/telephony/CarrierKeyDownloadManager$1;
-Lcom/android/internal/telephony/CarrierKeyDownloadManager$2;
-Lcom/android/internal/telephony/CarrierKeyDownloadManager;
-Lcom/android/internal/telephony/CarrierPrivilegesTracker$1;
-Lcom/android/internal/telephony/CarrierPrivilegesTracker;
-Lcom/android/internal/telephony/CarrierResolver$1;
-Lcom/android/internal/telephony/CarrierResolver$2;
-Lcom/android/internal/telephony/CarrierResolver$3;
-Lcom/android/internal/telephony/CarrierResolver$CarrierMatchingRule;
-Lcom/android/internal/telephony/CarrierResolver;
-Lcom/android/internal/telephony/CarrierServiceBindHelper$1;
-Lcom/android/internal/telephony/CarrierServiceBindHelper$2;
-Lcom/android/internal/telephony/CarrierServiceBindHelper$AppBinding$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/CarrierServiceBindHelper$AppBinding;
-Lcom/android/internal/telephony/CarrierServiceBindHelper$CarrierServiceConnection;
-Lcom/android/internal/telephony/CarrierServiceBindHelper$CarrierServicePackageMonitor;
-Lcom/android/internal/telephony/CarrierServiceBindHelper;
-Lcom/android/internal/telephony/CarrierServiceStateTracker$1;
-Lcom/android/internal/telephony/CarrierServiceStateTracker$AllowedNetworkTypesListener;
-Lcom/android/internal/telephony/CarrierServiceStateTracker$EmergencyNetworkNotification;
-Lcom/android/internal/telephony/CarrierServiceStateTracker$NotificationType;
-Lcom/android/internal/telephony/CarrierServiceStateTracker$PrefNetworkNotification;
-Lcom/android/internal/telephony/CarrierServiceStateTracker;
-Lcom/android/internal/telephony/CarrierServicesSmsFilter$CallbackTimeoutHandler$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/CarrierServicesSmsFilter$CallbackTimeoutHandler;
-Lcom/android/internal/telephony/CarrierServicesSmsFilter$CarrierServicesSmsFilterCallbackInterface;
-Lcom/android/internal/telephony/CarrierServicesSmsFilter$CarrierSmsFilter$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/CarrierServicesSmsFilter$CarrierSmsFilter$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/CarrierServicesSmsFilter$CarrierSmsFilter$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/CarrierServicesSmsFilter$CarrierSmsFilter;
-Lcom/android/internal/telephony/CarrierServicesSmsFilter$CarrierSmsFilterCallback;
-Lcom/android/internal/telephony/CarrierServicesSmsFilter$FilterAggregator;
-Lcom/android/internal/telephony/CarrierServicesSmsFilter;
-Lcom/android/internal/telephony/CarrierSignalAgent$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/CarrierSignalAgent$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/CarrierSignalAgent$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/CarrierSignalAgent$1;
-Lcom/android/internal/telephony/CarrierSignalAgent;
-Lcom/android/internal/telephony/CarrierSmsUtils;
-Lcom/android/internal/telephony/CellBroadcastServiceManager$1;
-Lcom/android/internal/telephony/CellBroadcastServiceManager$CellBroadcastServiceConnection;
-Lcom/android/internal/telephony/CellBroadcastServiceManager;
-Lcom/android/internal/telephony/CellBroadcastUtils;
-Lcom/android/internal/telephony/CellNetworkScanResult$1;
-Lcom/android/internal/telephony/CellNetworkScanResult;
-Lcom/android/internal/telephony/CellularNetworkService$CellularNetworkServiceProvider$1;
-Lcom/android/internal/telephony/CellularNetworkService$CellularNetworkServiceProvider;
-Lcom/android/internal/telephony/CellularNetworkService;
-Lcom/android/internal/telephony/ClientWakelockAccountant;
-Lcom/android/internal/telephony/ClientWakelockTracker;
-Lcom/android/internal/telephony/CommandException$Error;
-Lcom/android/internal/telephony/CommandException;
-Lcom/android/internal/telephony/CommandsInterface;
-Lcom/android/internal/telephony/Connection$Capability;
-Lcom/android/internal/telephony/Connection$Listener;
-Lcom/android/internal/telephony/Connection$ListenerBase;
-Lcom/android/internal/telephony/Connection$PostDialListener;
-Lcom/android/internal/telephony/Connection$PostDialState;
-Lcom/android/internal/telephony/Connection;
-Lcom/android/internal/telephony/DctConstants$Activity;
-Lcom/android/internal/telephony/DctConstants$State;
-Lcom/android/internal/telephony/DebugService;
-Lcom/android/internal/telephony/DefaultPhoneNotifier$1;
-Lcom/android/internal/telephony/DefaultPhoneNotifier;
-Lcom/android/internal/telephony/DeviceStateMonitor$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/DeviceStateMonitor$1;
-Lcom/android/internal/telephony/DeviceStateMonitor$2;
-Lcom/android/internal/telephony/DeviceStateMonitor$3;
-Lcom/android/internal/telephony/DeviceStateMonitor;
-Lcom/android/internal/telephony/DisplayInfoController;
-Lcom/android/internal/telephony/DriverCall$State;
-Lcom/android/internal/telephony/DriverCall;
-Lcom/android/internal/telephony/EncodeException;
-Lcom/android/internal/telephony/EventLogTags;
-Lcom/android/internal/telephony/ExponentialBackoff$1;
-Lcom/android/internal/telephony/ExponentialBackoff$HandlerAdapter;
-Lcom/android/internal/telephony/ExponentialBackoff;
-Lcom/android/internal/telephony/FastXmlSerializer;
-Lcom/android/internal/telephony/GbaManager$1;
-Lcom/android/internal/telephony/GbaManager$GbaDeathRecipient;
-Lcom/android/internal/telephony/GbaManager$GbaManagerHandler;
-Lcom/android/internal/telephony/GbaManager$GbaServiceConnection;
-Lcom/android/internal/telephony/GbaManager;
-Lcom/android/internal/telephony/GlobalSettingsHelper;
-Lcom/android/internal/telephony/GsmAlphabet$TextEncodingDetails;
-Lcom/android/internal/telephony/GsmAlphabet;
-Lcom/android/internal/telephony/GsmCdmaCall;
-Lcom/android/internal/telephony/GsmCdmaCallTracker$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/GsmCdmaCallTracker$1;
-Lcom/android/internal/telephony/GsmCdmaCallTracker$2;
-Lcom/android/internal/telephony/GsmCdmaCallTracker$3;
-Lcom/android/internal/telephony/GsmCdmaCallTracker;
-Lcom/android/internal/telephony/GsmCdmaConnection$1;
-Lcom/android/internal/telephony/GsmCdmaConnection$MyHandler;
-Lcom/android/internal/telephony/GsmCdmaConnection;
-Lcom/android/internal/telephony/GsmCdmaPhone$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/GsmCdmaPhone$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/GsmCdmaPhone$1;
-Lcom/android/internal/telephony/GsmCdmaPhone$2;
-Lcom/android/internal/telephony/GsmCdmaPhone$3;
-Lcom/android/internal/telephony/GsmCdmaPhone$Cfu;
-Lcom/android/internal/telephony/GsmCdmaPhone$ImsManagerFactory;
-Lcom/android/internal/telephony/GsmCdmaPhone;
-Lcom/android/internal/telephony/HalVersion;
-Lcom/android/internal/telephony/HardwareConfig;
-Lcom/android/internal/telephony/HbpcdLookup$MccIdd;
-Lcom/android/internal/telephony/HbpcdLookup$MccLookup;
-Lcom/android/internal/telephony/HbpcdUtils;
-Lcom/android/internal/telephony/HexDump;
-Lcom/android/internal/telephony/IBooleanConsumer$Stub$Proxy;
-Lcom/android/internal/telephony/IBooleanConsumer$Stub;
-Lcom/android/internal/telephony/IBooleanConsumer;
-Lcom/android/internal/telephony/ICallForwardingInfoCallback$Stub;
-Lcom/android/internal/telephony/ICallForwardingInfoCallback;
-Lcom/android/internal/telephony/ICarrierConfigChangeListener$Stub;
-Lcom/android/internal/telephony/ICarrierConfigChangeListener;
-Lcom/android/internal/telephony/ICarrierConfigLoader$Stub$Proxy;
-Lcom/android/internal/telephony/ICarrierConfigLoader$Stub;
-Lcom/android/internal/telephony/ICarrierConfigLoader;
-Lcom/android/internal/telephony/ICarrierPrivilegesCallback$Stub;
-Lcom/android/internal/telephony/ICarrierPrivilegesCallback;
-Lcom/android/internal/telephony/IIccPhoneBook$Default;
-Lcom/android/internal/telephony/IIccPhoneBook$Stub$Proxy;
-Lcom/android/internal/telephony/IIccPhoneBook$Stub;
-Lcom/android/internal/telephony/IIccPhoneBook;
-Lcom/android/internal/telephony/IIntegerConsumer$Stub$Proxy;
-Lcom/android/internal/telephony/IIntegerConsumer$Stub;
-Lcom/android/internal/telephony/IIntegerConsumer;
-Lcom/android/internal/telephony/IMms$Stub$Proxy;
-Lcom/android/internal/telephony/IMms$Stub;
-Lcom/android/internal/telephony/IMms;
-Lcom/android/internal/telephony/INumberVerificationCallback$Stub$Proxy;
-Lcom/android/internal/telephony/INumberVerificationCallback$Stub;
-Lcom/android/internal/telephony/INumberVerificationCallback;
-Lcom/android/internal/telephony/IOnSubscriptionsChangedListener$Stub$Proxy;
-Lcom/android/internal/telephony/IOnSubscriptionsChangedListener$Stub;
-Lcom/android/internal/telephony/IOnSubscriptionsChangedListener;
-Lcom/android/internal/telephony/IOns$Stub$Proxy;
-Lcom/android/internal/telephony/IOns$Stub;
-Lcom/android/internal/telephony/IOns;
-Lcom/android/internal/telephony/IPhoneStateListener$Stub;
-Lcom/android/internal/telephony/IPhoneStateListener;
-Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;
-Lcom/android/internal/telephony/IPhoneSubInfo$Stub;
-Lcom/android/internal/telephony/IPhoneSubInfo;
-Lcom/android/internal/telephony/ISetOpportunisticDataCallback$Stub$Proxy;
-Lcom/android/internal/telephony/ISetOpportunisticDataCallback$Stub;
-Lcom/android/internal/telephony/ISetOpportunisticDataCallback;
-Lcom/android/internal/telephony/ISms$Stub$Proxy;
-Lcom/android/internal/telephony/ISms$Stub;
-Lcom/android/internal/telephony/ISms;
-Lcom/android/internal/telephony/ISmsImplBase;
-Lcom/android/internal/telephony/IState;
-Lcom/android/internal/telephony/ISub$Stub$Proxy;
-Lcom/android/internal/telephony/ISub$Stub;
-Lcom/android/internal/telephony/ISub;
-Lcom/android/internal/telephony/ITelephony$Stub$Proxy;
-Lcom/android/internal/telephony/ITelephony$Stub;
-Lcom/android/internal/telephony/ITelephony;
-Lcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;
-Lcom/android/internal/telephony/ITelephonyRegistry$Stub;
-Lcom/android/internal/telephony/ITelephonyRegistry;
-Lcom/android/internal/telephony/IUpdateAvailableNetworksCallback$Stub;
-Lcom/android/internal/telephony/IUpdateAvailableNetworksCallback;
-Lcom/android/internal/telephony/IWapPushManager$Stub;
-Lcom/android/internal/telephony/IWapPushManager;
-Lcom/android/internal/telephony/IccCard;
-Lcom/android/internal/telephony/IccCardConstants$State;
-Lcom/android/internal/telephony/IccPhoneBookInterfaceManager$1;
-Lcom/android/internal/telephony/IccPhoneBookInterfaceManager$Request;
-Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;
-Lcom/android/internal/telephony/IccProvider;
-Lcom/android/internal/telephony/IccSmsInterfaceManager$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/IccSmsInterfaceManager$1;
-Lcom/android/internal/telephony/IccSmsInterfaceManager$CdmaBroadcastRangeManager;
-Lcom/android/internal/telephony/IccSmsInterfaceManager$CellBroadcastRangeManager;
-Lcom/android/internal/telephony/IccSmsInterfaceManager$Request;
-Lcom/android/internal/telephony/IccSmsInterfaceManager;
-Lcom/android/internal/telephony/ImsSmsDispatcher$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/ImsSmsDispatcher$1;
-Lcom/android/internal/telephony/ImsSmsDispatcher$2;
-Lcom/android/internal/telephony/ImsSmsDispatcher$3;
-Lcom/android/internal/telephony/ImsSmsDispatcher$4$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/ImsSmsDispatcher$4;
-Lcom/android/internal/telephony/ImsSmsDispatcher$5;
-Lcom/android/internal/telephony/ImsSmsDispatcher$FeatureConnectorFactory;
-Lcom/android/internal/telephony/ImsSmsDispatcher;
-Lcom/android/internal/telephony/InboundSmsHandler$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/InboundSmsHandler$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/InboundSmsHandler$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/InboundSmsHandler$CarrierServicesSmsFilterCallback;
-Lcom/android/internal/telephony/InboundSmsHandler$CbTestBroadcastReceiver;
-Lcom/android/internal/telephony/InboundSmsHandler$DefaultState;
-Lcom/android/internal/telephony/InboundSmsHandler$DeliveringState;
-Lcom/android/internal/telephony/InboundSmsHandler$IdleState;
-Lcom/android/internal/telephony/InboundSmsHandler$NewMessageNotificationActionReceiver;
-Lcom/android/internal/telephony/InboundSmsHandler$SmsBroadcastReceiver;
-Lcom/android/internal/telephony/InboundSmsHandler$SmsFilter;
-Lcom/android/internal/telephony/InboundSmsHandler$StartupState;
-Lcom/android/internal/telephony/InboundSmsHandler$WaitingState;
-Lcom/android/internal/telephony/InboundSmsHandler;
-Lcom/android/internal/telephony/InboundSmsTracker;
-Lcom/android/internal/telephony/IndentingPrintWriter;
-Lcom/android/internal/telephony/IntRangeManager$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/IntRangeManager$ClientRange;
-Lcom/android/internal/telephony/IntRangeManager$IntRange;
-Lcom/android/internal/telephony/IntRangeManager;
-Lcom/android/internal/telephony/IntentBroadcaster$1;
-Lcom/android/internal/telephony/IntentBroadcaster;
-Lcom/android/internal/telephony/LastCallFailCause;
-Lcom/android/internal/telephony/LocalLog$ReadOnlyLocalLog;
-Lcom/android/internal/telephony/LocalLog;
-Lcom/android/internal/telephony/LocaleTracker$1;
-Lcom/android/internal/telephony/LocaleTracker;
-Lcom/android/internal/telephony/MccTable$MccEntry;
-Lcom/android/internal/telephony/MccTable$MccMnc;
-Lcom/android/internal/telephony/MccTable;
-Lcom/android/internal/telephony/MissedIncomingCallSmsFilter;
-Lcom/android/internal/telephony/MmiCode$State;
-Lcom/android/internal/telephony/MmiCode;
-Lcom/android/internal/telephony/MultiSimSettingController$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/MultiSimSettingController$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/MultiSimSettingController$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/MultiSimSettingController$$ExternalSyntheticLambda3;
-Lcom/android/internal/telephony/MultiSimSettingController$$ExternalSyntheticLambda4;
-Lcom/android/internal/telephony/MultiSimSettingController$SimCombinationWarningParams;
-Lcom/android/internal/telephony/MultiSimSettingController$UpdateDefaultAction;
-Lcom/android/internal/telephony/MultiSimSettingController;
-Lcom/android/internal/telephony/NetworkFactory;
-Lcom/android/internal/telephony/NetworkFactoryImpl$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/NetworkFactoryImpl$1;
-Lcom/android/internal/telephony/NetworkFactoryImpl$2;
-Lcom/android/internal/telephony/NetworkFactoryImpl$NetworkRequestInfo;
-Lcom/android/internal/telephony/NetworkFactoryImpl;
-Lcom/android/internal/telephony/NetworkFactoryLegacyImpl$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/NetworkFactoryLegacyImpl$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/NetworkFactoryLegacyImpl$1;
-Lcom/android/internal/telephony/NetworkFactoryLegacyImpl$NetworkRequestInfo;
-Lcom/android/internal/telephony/NetworkFactoryLegacyImpl;
-Lcom/android/internal/telephony/NetworkFactoryShim;
-Lcom/android/internal/telephony/NetworkRegistrationManager$NetworkRegStateCallback;
-Lcom/android/internal/telephony/NetworkRegistrationManager$NetworkServiceConnection;
-Lcom/android/internal/telephony/NetworkRegistrationManager$RegManagerDeathRecipient;
-Lcom/android/internal/telephony/NetworkRegistrationManager;
-Lcom/android/internal/telephony/NetworkScanRequestTracker$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/NetworkScanRequestTracker$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/NetworkScanRequestTracker$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/NetworkScanRequestTracker$$ExternalSyntheticLambda3;
-Lcom/android/internal/telephony/NetworkScanRequestTracker$1;
-Lcom/android/internal/telephony/NetworkScanRequestTracker$2;
-Lcom/android/internal/telephony/NetworkScanRequestTracker$NetworkScanRequestInfo;
-Lcom/android/internal/telephony/NetworkScanRequestTracker$NetworkScanRequestScheduler;
-Lcom/android/internal/telephony/NetworkScanRequestTracker;
-Lcom/android/internal/telephony/NetworkScanResult$1;
-Lcom/android/internal/telephony/NetworkScanResult;
-Lcom/android/internal/telephony/NetworkTypeController$1;
-Lcom/android/internal/telephony/NetworkTypeController$DefaultState;
-Lcom/android/internal/telephony/NetworkTypeController$IdleState;
-Lcom/android/internal/telephony/NetworkTypeController$LegacyState;
-Lcom/android/internal/telephony/NetworkTypeController$LteConnectedState;
-Lcom/android/internal/telephony/NetworkTypeController$NrConnectedState;
-Lcom/android/internal/telephony/NetworkTypeController$OverrideTimerRule;
-Lcom/android/internal/telephony/NetworkTypeController;
-Lcom/android/internal/telephony/NitzData;
-Lcom/android/internal/telephony/NitzStateMachine$DeviceState;
-Lcom/android/internal/telephony/NitzStateMachine$DeviceStateImpl;
-Lcom/android/internal/telephony/NitzStateMachine;
-Lcom/android/internal/telephony/OperatorInfo$1;
-Lcom/android/internal/telephony/OperatorInfo$State;
-Lcom/android/internal/telephony/OperatorInfo;
-Lcom/android/internal/telephony/PackageBasedTokenUtil;
-Lcom/android/internal/telephony/PackageChangeReceiver;
-Lcom/android/internal/telephony/Phone$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/Phone$NetworkSelectMessage;
-Lcom/android/internal/telephony/Phone$SilentRedialParam;
-Lcom/android/internal/telephony/Phone;
-Lcom/android/internal/telephony/PhoneConfigurationManager$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/PhoneConfigurationManager$1;
-Lcom/android/internal/telephony/PhoneConfigurationManager$ConfigManagerHandler;
-Lcom/android/internal/telephony/PhoneConfigurationManager$MockableInterface;
-Lcom/android/internal/telephony/PhoneConfigurationManager;
-Lcom/android/internal/telephony/PhoneConstantConversions$1;
-Lcom/android/internal/telephony/PhoneConstantConversions;
-Lcom/android/internal/telephony/PhoneConstants$DataState;
-Lcom/android/internal/telephony/PhoneConstants$State;
-Lcom/android/internal/telephony/PhoneFactory;
-Lcom/android/internal/telephony/PhoneInternalInterface$DataActivityState;
-Lcom/android/internal/telephony/PhoneInternalInterface$DialArgs$Builder;
-Lcom/android/internal/telephony/PhoneInternalInterface$DialArgs;
-Lcom/android/internal/telephony/PhoneInternalInterface$SuppService;
-Lcom/android/internal/telephony/PhoneInternalInterface;
-Lcom/android/internal/telephony/PhoneNotifier;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda10;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda11;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda12;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda13;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda14;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda15;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda16;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda17;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda18;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda19;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda20;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda21;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda22;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda23;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda24;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda25;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda26;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda27;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda3;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda4;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda5;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda6;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda7;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda8;
-Lcom/android/internal/telephony/PhoneSubInfoController$$ExternalSyntheticLambda9;
-Lcom/android/internal/telephony/PhoneSubInfoController$CallPhoneMethodHelper;
-Lcom/android/internal/telephony/PhoneSubInfoController$PermissionCheckHelper;
-Lcom/android/internal/telephony/PhoneSubInfoController;
-Lcom/android/internal/telephony/ProxyController$1;
-Lcom/android/internal/telephony/ProxyController;
-Lcom/android/internal/telephony/RIL$RadioProxyDeathRecipient;
-Lcom/android/internal/telephony/RIL$RilHandler;
-Lcom/android/internal/telephony/RIL;
-Lcom/android/internal/telephony/RILConstants$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/RILConstants$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/RILConstants;
-Lcom/android/internal/telephony/RILRequest$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/RILRequest;
-Lcom/android/internal/telephony/RadioBugDetector;
-Lcom/android/internal/telephony/RadioCapability;
-Lcom/android/internal/telephony/RadioConfig$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/RadioConfig;
-Lcom/android/internal/telephony/RadioIndication$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/RadioIndication$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/RadioIndication;
-Lcom/android/internal/telephony/RadioInterfaceCapabilityController;
-Lcom/android/internal/telephony/RadioNVItems;
-Lcom/android/internal/telephony/RadioResponse$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/RadioResponse$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/RadioResponse$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/RadioResponse;
-Lcom/android/internal/telephony/RatRatcheter;
-Lcom/android/internal/telephony/Registrant;
-Lcom/android/internal/telephony/RegistrantList;
-Lcom/android/internal/telephony/RegistrationFailedEvent;
-Lcom/android/internal/telephony/RestrictedState;
-Lcom/android/internal/telephony/RilWakelockInfo;
-Lcom/android/internal/telephony/SMSDispatcher$1;
-Lcom/android/internal/telephony/SMSDispatcher$ConfirmDialogListener;
-Lcom/android/internal/telephony/SMSDispatcher$DataSmsSender$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/SMSDispatcher$DataSmsSender;
-Lcom/android/internal/telephony/SMSDispatcher$MultipartSmsSender$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/SMSDispatcher$MultipartSmsSender;
-Lcom/android/internal/telephony/SMSDispatcher$SettingsObserver;
-Lcom/android/internal/telephony/SMSDispatcher$SmsSender$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/SMSDispatcher$SmsSender$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/SMSDispatcher$SmsSender;
-Lcom/android/internal/telephony/SMSDispatcher$SmsSenderCallback;
-Lcom/android/internal/telephony/SMSDispatcher$SmsTracker;
-Lcom/android/internal/telephony/SMSDispatcher$TextSmsSender$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/SMSDispatcher$TextSmsSender;
-Lcom/android/internal/telephony/SMSDispatcher;
-Lcom/android/internal/telephony/ServiceStateTracker$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/ServiceStateTracker$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/ServiceStateTracker$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/ServiceStateTracker$$ExternalSyntheticLambda3;
-Lcom/android/internal/telephony/ServiceStateTracker$$ExternalSyntheticLambda4;
-Lcom/android/internal/telephony/ServiceStateTracker$$ExternalSyntheticLambda5;
-Lcom/android/internal/telephony/ServiceStateTracker$1;
-Lcom/android/internal/telephony/ServiceStateTracker$SstSubscriptionsChangedListener;
-Lcom/android/internal/telephony/ServiceStateTracker;
-Lcom/android/internal/telephony/SettingsObserver;
-Lcom/android/internal/telephony/SimActivationTracker$1;
-Lcom/android/internal/telephony/SimActivationTracker;
-Lcom/android/internal/telephony/SlidingWindowEventCounter;
-Lcom/android/internal/telephony/Sms7BitEncodingTranslator;
-Lcom/android/internal/telephony/SmsAddress;
-Lcom/android/internal/telephony/SmsApplication$SmsApplicationData;
-Lcom/android/internal/telephony/SmsApplication$SmsPackageMonitor;
-Lcom/android/internal/telephony/SmsApplication$SmsRoleListener;
-Lcom/android/internal/telephony/SmsApplication;
-Lcom/android/internal/telephony/SmsBroadcastUndelivered$1;
-Lcom/android/internal/telephony/SmsBroadcastUndelivered$ScanRawTableThread;
-Lcom/android/internal/telephony/SmsBroadcastUndelivered$SmsReferenceKey;
-Lcom/android/internal/telephony/SmsBroadcastUndelivered;
-Lcom/android/internal/telephony/SmsConstants$MessageClass;
-Lcom/android/internal/telephony/SmsController;
-Lcom/android/internal/telephony/SmsDispatchersController$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/SmsDispatchersController$1;
-Lcom/android/internal/telephony/SmsDispatchersController$DomainSelectionResolverProxy;
-Lcom/android/internal/telephony/SmsDispatchersController$SmsInjectionCallback;
-Lcom/android/internal/telephony/SmsDispatchersController;
-Lcom/android/internal/telephony/SmsHeader$ConcatRef;
-Lcom/android/internal/telephony/SmsHeader$MiscElt;
-Lcom/android/internal/telephony/SmsHeader$PortAddrs;
-Lcom/android/internal/telephony/SmsHeader$SpecialSmsMsg;
-Lcom/android/internal/telephony/SmsHeader;
-Lcom/android/internal/telephony/SmsMessageBase$SubmitPduBase;
-Lcom/android/internal/telephony/SmsMessageBase;
-Lcom/android/internal/telephony/SmsNumberUtils$NumberEntry;
-Lcom/android/internal/telephony/SmsNumberUtils;
-Lcom/android/internal/telephony/SmsPermissions;
-Lcom/android/internal/telephony/SmsRawData$1;
-Lcom/android/internal/telephony/SmsRawData;
-Lcom/android/internal/telephony/SmsResponse;
-Lcom/android/internal/telephony/SmsStorageMonitor$1;
-Lcom/android/internal/telephony/SmsStorageMonitor;
-Lcom/android/internal/telephony/SmsUsageMonitor$1;
-Lcom/android/internal/telephony/SmsUsageMonitor$SettingsObserver;
-Lcom/android/internal/telephony/SmsUsageMonitor$SettingsObserverHandler;
-Lcom/android/internal/telephony/SmsUsageMonitor$ShortCodePatternMatcher;
-Lcom/android/internal/telephony/SmsUsageMonitor;
-Lcom/android/internal/telephony/SomeArgs;
-Lcom/android/internal/telephony/State;
-Lcom/android/internal/telephony/StateMachine$LogRec;
-Lcom/android/internal/telephony/StateMachine$LogRecords;
-Lcom/android/internal/telephony/StateMachine$SmHandler$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/StateMachine$SmHandler$HaltingState;
-Lcom/android/internal/telephony/StateMachine$SmHandler$QuittingState;
-Lcom/android/internal/telephony/StateMachine$SmHandler$StateInfo;
-Lcom/android/internal/telephony/StateMachine$SmHandler;
-Lcom/android/internal/telephony/StateMachine;
-Lcom/android/internal/telephony/TelephonyCapabilities;
-Lcom/android/internal/telephony/TelephonyCommonStatsLog;
-Lcom/android/internal/telephony/TelephonyComponentFactory$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/TelephonyComponentFactory$InjectedComponents$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/TelephonyComponentFactory$InjectedComponents$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/TelephonyComponentFactory$InjectedComponents$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/TelephonyComponentFactory$InjectedComponents$$ExternalSyntheticLambda3;
-Lcom/android/internal/telephony/TelephonyComponentFactory$InjectedComponents$$ExternalSyntheticLambda4;
-Lcom/android/internal/telephony/TelephonyComponentFactory$InjectedComponents;
-Lcom/android/internal/telephony/TelephonyComponentFactory;
-Lcom/android/internal/telephony/TelephonyDevController;
-Lcom/android/internal/telephony/TelephonyFacade;
-Lcom/android/internal/telephony/TelephonyPermissions;
-Lcom/android/internal/telephony/TelephonyStatsLog;
-Lcom/android/internal/telephony/TelephonyTester$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/TelephonyTester$1;
-Lcom/android/internal/telephony/TelephonyTester;
-Lcom/android/internal/telephony/TimeUtils;
-Lcom/android/internal/telephony/UUSInfo;
-Lcom/android/internal/telephony/UiccPhoneBookController;
-Lcom/android/internal/telephony/UserIcons;
-Lcom/android/internal/telephony/VisualVoicemailSmsFilter$1;
-Lcom/android/internal/telephony/VisualVoicemailSmsFilter$FullMessage;
-Lcom/android/internal/telephony/VisualVoicemailSmsFilter$PhoneAccountHandleConverter;
-Lcom/android/internal/telephony/VisualVoicemailSmsFilter;
-Lcom/android/internal/telephony/VisualVoicemailSmsParser$WrappedMessageData;
-Lcom/android/internal/telephony/VisualVoicemailSmsParser;
-Lcom/android/internal/telephony/WakeLockStateMachine$1;
-Lcom/android/internal/telephony/WakeLockStateMachine$DefaultState;
-Lcom/android/internal/telephony/WakeLockStateMachine$IdleState;
-Lcom/android/internal/telephony/WakeLockStateMachine$WaitingState;
-Lcom/android/internal/telephony/WakeLockStateMachine;
-Lcom/android/internal/telephony/WapPushManagerParams;
-Lcom/android/internal/telephony/WapPushOverSms$DecodedResult;
-Lcom/android/internal/telephony/WapPushOverSms;
-Lcom/android/internal/telephony/WspTypeDecoder;
-Lcom/android/internal/telephony/build/SdkLevel;
-Lcom/android/internal/telephony/cat/AppInterface$CommandType;
-Lcom/android/internal/telephony/cat/AppInterface;
-Lcom/android/internal/telephony/cat/BIPClientParams;
-Lcom/android/internal/telephony/cat/BerTlv;
-Lcom/android/internal/telephony/cat/CallSetupParams;
-Lcom/android/internal/telephony/cat/CatCmdMessage$1;
-Lcom/android/internal/telephony/cat/CatCmdMessage$2;
-Lcom/android/internal/telephony/cat/CatCmdMessage$BrowserSettings;
-Lcom/android/internal/telephony/cat/CatCmdMessage$BrowserTerminationCauses;
-Lcom/android/internal/telephony/cat/CatCmdMessage$CallSettings;
-Lcom/android/internal/telephony/cat/CatCmdMessage$SetupEventListConstants;
-Lcom/android/internal/telephony/cat/CatCmdMessage$SetupEventListSettings;
-Lcom/android/internal/telephony/cat/CatCmdMessage;
-Lcom/android/internal/telephony/cat/CatException;
-Lcom/android/internal/telephony/cat/CatLog;
-Lcom/android/internal/telephony/cat/CatResponseMessage;
-Lcom/android/internal/telephony/cat/CatService$1;
-Lcom/android/internal/telephony/cat/CatService;
-Lcom/android/internal/telephony/cat/CommandDetails$1;
-Lcom/android/internal/telephony/cat/CommandDetails;
-Lcom/android/internal/telephony/cat/CommandParams;
-Lcom/android/internal/telephony/cat/CommandParamsFactory$1;
-Lcom/android/internal/telephony/cat/CommandParamsFactory;
-Lcom/android/internal/telephony/cat/ComprehensionTlv;
-Lcom/android/internal/telephony/cat/ComprehensionTlvTag;
-Lcom/android/internal/telephony/cat/DTTZResponseData;
-Lcom/android/internal/telephony/cat/DeviceIdentities;
-Lcom/android/internal/telephony/cat/DisplayTextParams;
-Lcom/android/internal/telephony/cat/Duration$1;
-Lcom/android/internal/telephony/cat/Duration$TimeUnit;
-Lcom/android/internal/telephony/cat/Duration;
-Lcom/android/internal/telephony/cat/FontSize;
-Lcom/android/internal/telephony/cat/GetInkeyInputResponseData;
-Lcom/android/internal/telephony/cat/GetInputParams;
-Lcom/android/internal/telephony/cat/IconId;
-Lcom/android/internal/telephony/cat/IconLoader;
-Lcom/android/internal/telephony/cat/ImageDescriptor;
-Lcom/android/internal/telephony/cat/Input$1;
-Lcom/android/internal/telephony/cat/Input;
-Lcom/android/internal/telephony/cat/Item$1;
-Lcom/android/internal/telephony/cat/Item;
-Lcom/android/internal/telephony/cat/ItemsIconId;
-Lcom/android/internal/telephony/cat/LanguageParams;
-Lcom/android/internal/telephony/cat/LanguageResponseData;
-Lcom/android/internal/telephony/cat/LaunchBrowserMode;
-Lcom/android/internal/telephony/cat/LaunchBrowserParams;
-Lcom/android/internal/telephony/cat/Menu$1;
-Lcom/android/internal/telephony/cat/Menu;
-Lcom/android/internal/telephony/cat/PlayToneParams;
-Lcom/android/internal/telephony/cat/PresentationType;
-Lcom/android/internal/telephony/cat/ResponseData;
-Lcom/android/internal/telephony/cat/ResultCode;
-Lcom/android/internal/telephony/cat/ResultException$1;
-Lcom/android/internal/telephony/cat/ResultException;
-Lcom/android/internal/telephony/cat/RilMessage;
-Lcom/android/internal/telephony/cat/RilMessageDecoder$StateCmdParamsReady;
-Lcom/android/internal/telephony/cat/RilMessageDecoder$StateStart;
-Lcom/android/internal/telephony/cat/RilMessageDecoder;
-Lcom/android/internal/telephony/cat/SelectItemParams;
-Lcom/android/internal/telephony/cat/SelectItemResponseData;
-Lcom/android/internal/telephony/cat/SetEventListParams;
-Lcom/android/internal/telephony/cat/TextAlignment;
-Lcom/android/internal/telephony/cat/TextAttribute;
-Lcom/android/internal/telephony/cat/TextColor;
-Lcom/android/internal/telephony/cat/TextMessage$1;
-Lcom/android/internal/telephony/cat/TextMessage;
-Lcom/android/internal/telephony/cat/Tone$1;
-Lcom/android/internal/telephony/cat/Tone;
-Lcom/android/internal/telephony/cat/ToneSettings$1;
-Lcom/android/internal/telephony/cat/ToneSettings;
-Lcom/android/internal/telephony/cat/ValueObject;
-Lcom/android/internal/telephony/cat/ValueParser;
-Lcom/android/internal/telephony/cdma/CdmaCallWaitingNotification;
-Lcom/android/internal/telephony/cdma/CdmaInboundSmsHandler$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/cdma/CdmaInboundSmsHandler$CdmaCbTestBroadcastReceiver;
-Lcom/android/internal/telephony/cdma/CdmaInboundSmsHandler$CdmaScpTestBroadcastReceiver;
-Lcom/android/internal/telephony/cdma/CdmaInboundSmsHandler;
-Lcom/android/internal/telephony/cdma/CdmaInformationRecords$CdmaDisplayInfoRec;
-Lcom/android/internal/telephony/cdma/CdmaInformationRecords$CdmaLineControlInfoRec;
-Lcom/android/internal/telephony/cdma/CdmaInformationRecords$CdmaNumberInfoRec;
-Lcom/android/internal/telephony/cdma/CdmaInformationRecords$CdmaRedirectingNumberInfoRec;
-Lcom/android/internal/telephony/cdma/CdmaInformationRecords$CdmaSignalInfoRec;
-Lcom/android/internal/telephony/cdma/CdmaInformationRecords$CdmaT53AudioControlInfoRec;
-Lcom/android/internal/telephony/cdma/CdmaInformationRecords$CdmaT53ClirInfoRec;
-Lcom/android/internal/telephony/cdma/CdmaInformationRecords;
-Lcom/android/internal/telephony/cdma/CdmaMmiCode;
-Lcom/android/internal/telephony/cdma/CdmaSMSDispatcher;
-Lcom/android/internal/telephony/cdma/CdmaSmsBroadcastConfigInfo;
-Lcom/android/internal/telephony/cdma/CdmaSubscriptionSourceManager;
-Lcom/android/internal/telephony/cdma/EriInfo;
-Lcom/android/internal/telephony/cdma/EriManager$EriDisplayInformation;
-Lcom/android/internal/telephony/cdma/EriManager$EriFile;
-Lcom/android/internal/telephony/cdma/EriManager;
-Lcom/android/internal/telephony/cdma/SignalToneUtil;
-Lcom/android/internal/telephony/cdma/SmsMessage$SubmitPdu;
-Lcom/android/internal/telephony/cdma/SmsMessage;
-Lcom/android/internal/telephony/cdma/sms/BearerData$CodingException;
-Lcom/android/internal/telephony/cdma/sms/BearerData$TimeStamp;
-Lcom/android/internal/telephony/cdma/sms/BearerData;
-Lcom/android/internal/telephony/cdma/sms/CdmaSmsAddress;
-Lcom/android/internal/telephony/cdma/sms/CdmaSmsSubaddress;
-Lcom/android/internal/telephony/cdma/sms/SmsEnvelope;
-Lcom/android/internal/telephony/cdma/sms/UserData;
-Lcom/android/internal/telephony/cdnr/BrandOverrideEfData;
-Lcom/android/internal/telephony/cdnr/CarrierConfigEfData;
-Lcom/android/internal/telephony/cdnr/CarrierDisplayNameData$1;
-Lcom/android/internal/telephony/cdnr/CarrierDisplayNameData$Builder;
-Lcom/android/internal/telephony/cdnr/CarrierDisplayNameData;
-Lcom/android/internal/telephony/cdnr/CarrierDisplayNameResolver$CarrierDisplayNameConditionRule;
-Lcom/android/internal/telephony/cdnr/CarrierDisplayNameResolver$WfcCarrierNameFormatter;
-Lcom/android/internal/telephony/cdnr/CarrierDisplayNameResolver;
-Lcom/android/internal/telephony/cdnr/EfData;
-Lcom/android/internal/telephony/cdnr/EriEfData;
-Lcom/android/internal/telephony/cdnr/RuimEfData;
-Lcom/android/internal/telephony/cdnr/UsimEfData;
-Lcom/android/internal/telephony/d2d/Communicator$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/d2d/Communicator$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/d2d/Communicator$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/d2d/Communicator$$ExternalSyntheticLambda3;
-Lcom/android/internal/telephony/d2d/Communicator$$ExternalSyntheticLambda4;
-Lcom/android/internal/telephony/d2d/Communicator$Callback;
-Lcom/android/internal/telephony/d2d/Communicator$Message;
-Lcom/android/internal/telephony/d2d/Communicator;
-Lcom/android/internal/telephony/d2d/DtmfAdapter;
-Lcom/android/internal/telephony/d2d/DtmfTransport$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/d2d/DtmfTransport$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/d2d/DtmfTransport$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/d2d/DtmfTransport;
-Lcom/android/internal/telephony/d2d/MessageTypeAndValueHelper;
-Lcom/android/internal/telephony/d2d/RtpAdapter$Callback;
-Lcom/android/internal/telephony/d2d/RtpAdapter;
-Lcom/android/internal/telephony/d2d/RtpTransport$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/d2d/RtpTransport$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/d2d/RtpTransport$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/d2d/RtpTransport$$ExternalSyntheticLambda3;
-Lcom/android/internal/telephony/d2d/RtpTransport$$ExternalSyntheticLambda4;
-Lcom/android/internal/telephony/d2d/RtpTransport$$ExternalSyntheticLambda5;
-Lcom/android/internal/telephony/d2d/RtpTransport$$ExternalSyntheticLambda6;
-Lcom/android/internal/telephony/d2d/RtpTransport$$ExternalSyntheticLambda7;
-Lcom/android/internal/telephony/d2d/RtpTransport$$ExternalSyntheticLambda8;
-Lcom/android/internal/telephony/d2d/RtpTransport;
-Lcom/android/internal/telephony/d2d/Timeouts$Adapter;
-Lcom/android/internal/telephony/d2d/Timeouts;
-Lcom/android/internal/telephony/d2d/TransportProtocol$Callback;
-Lcom/android/internal/telephony/d2d/TransportProtocol;
-Lcom/android/internal/telephony/data/DataCallback;
-Lcom/android/internal/telephony/data/DataNetworkController$DataNetworkControllerCallback;
-Lcom/android/internal/telephony/data/DataSettingsManager$DataSettingsManagerCallback;
-Lcom/android/internal/telephony/data/TelephonyNetworkFactory;
-Lcom/android/internal/telephony/emergency/EmergencyNumberTracker$1;
-Lcom/android/internal/telephony/emergency/EmergencyNumberTracker;
-Lcom/android/internal/telephony/euicc/EuiccCardController$10;
-Lcom/android/internal/telephony/euicc/EuiccCardController$11;
-Lcom/android/internal/telephony/euicc/EuiccCardController$12;
-Lcom/android/internal/telephony/euicc/EuiccCardController$13;
-Lcom/android/internal/telephony/euicc/EuiccCardController$14;
-Lcom/android/internal/telephony/euicc/EuiccCardController$15;
-Lcom/android/internal/telephony/euicc/EuiccCardController$16;
-Lcom/android/internal/telephony/euicc/EuiccCardController$17;
-Lcom/android/internal/telephony/euicc/EuiccCardController$18;
-Lcom/android/internal/telephony/euicc/EuiccCardController$19;
-Lcom/android/internal/telephony/euicc/EuiccCardController$1;
-Lcom/android/internal/telephony/euicc/EuiccCardController$20;
-Lcom/android/internal/telephony/euicc/EuiccCardController$21;
-Lcom/android/internal/telephony/euicc/EuiccCardController$22;
-Lcom/android/internal/telephony/euicc/EuiccCardController$2;
-Lcom/android/internal/telephony/euicc/EuiccCardController$3;
-Lcom/android/internal/telephony/euicc/EuiccCardController$4;
-Lcom/android/internal/telephony/euicc/EuiccCardController$5;
-Lcom/android/internal/telephony/euicc/EuiccCardController$6;
-Lcom/android/internal/telephony/euicc/EuiccCardController$7;
-Lcom/android/internal/telephony/euicc/EuiccCardController$8;
-Lcom/android/internal/telephony/euicc/EuiccCardController$9;
-Lcom/android/internal/telephony/euicc/EuiccCardController$SimSlotStatusChangedBroadcastReceiver;
-Lcom/android/internal/telephony/euicc/EuiccCardController;
-Lcom/android/internal/telephony/euicc/EuiccConnector$1;
-Lcom/android/internal/telephony/euicc/EuiccConnector$AvailableState;
-Lcom/android/internal/telephony/euicc/EuiccConnector$BaseEuiccCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$BindingState;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$1$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$10$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$10;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$11$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$11;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$12$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$12;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$13$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$13;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$14$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$14;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$15$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$15;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$1;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$2$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$2;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$3$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$3;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$4$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$4;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$5$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$5;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$6$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$6;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$7$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$7;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$8$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$8;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$9$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$9;
-Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState;
-Lcom/android/internal/telephony/euicc/EuiccConnector$DeleteCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$DeleteRequest;
-Lcom/android/internal/telephony/euicc/EuiccConnector$DisconnectedState;
-Lcom/android/internal/telephony/euicc/EuiccConnector$DownloadCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$DownloadRequest;
-Lcom/android/internal/telephony/euicc/EuiccConnector$DumpEuiccServiceCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$EraseCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$EuiccPackageMonitor;
-Lcom/android/internal/telephony/euicc/EuiccConnector$GetAvailableMemoryInBytesCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$GetDefaultListCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$GetDefaultListRequest;
-Lcom/android/internal/telephony/euicc/EuiccConnector$GetEidCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$GetEuiccInfoCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$GetEuiccProfileInfoListCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$GetMetadataCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$GetMetadataRequest;
-Lcom/android/internal/telephony/euicc/EuiccConnector$GetOtaStatusCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$OtaStatusChangedCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$RetainSubscriptionsCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$SwitchCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$SwitchRequest;
-Lcom/android/internal/telephony/euicc/EuiccConnector$UnavailableState;
-Lcom/android/internal/telephony/euicc/EuiccConnector$UpdateNicknameCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccConnector$UpdateNicknameRequest;
-Lcom/android/internal/telephony/euicc/EuiccConnector;
-Lcom/android/internal/telephony/euicc/EuiccController$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/euicc/EuiccController$10;
-Lcom/android/internal/telephony/euicc/EuiccController$11;
-Lcom/android/internal/telephony/euicc/EuiccController$12;
-Lcom/android/internal/telephony/euicc/EuiccController$13;
-Lcom/android/internal/telephony/euicc/EuiccController$1;
-Lcom/android/internal/telephony/euicc/EuiccController$2;
-Lcom/android/internal/telephony/euicc/EuiccController$3;
-Lcom/android/internal/telephony/euicc/EuiccController$4;
-Lcom/android/internal/telephony/euicc/EuiccController$5;
-Lcom/android/internal/telephony/euicc/EuiccController$6;
-Lcom/android/internal/telephony/euicc/EuiccController$7;
-Lcom/android/internal/telephony/euicc/EuiccController$8;
-Lcom/android/internal/telephony/euicc/EuiccController$9;
-Lcom/android/internal/telephony/euicc/EuiccController$DownloadSubscriptionGetMetadataCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccController$GetDefaultListCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccController$GetMetadataCommandCallback;
-Lcom/android/internal/telephony/euicc/EuiccController;
-Lcom/android/internal/telephony/euicc/EuiccOperation$1;
-Lcom/android/internal/telephony/euicc/EuiccOperation$Action;
-Lcom/android/internal/telephony/euicc/EuiccOperation;
-Lcom/android/internal/telephony/euicc/IAuthenticateServerCallback$Stub;
-Lcom/android/internal/telephony/euicc/IAuthenticateServerCallback;
-Lcom/android/internal/telephony/euicc/ICancelSessionCallback$Stub;
-Lcom/android/internal/telephony/euicc/ICancelSessionCallback;
-Lcom/android/internal/telephony/euicc/IDeleteProfileCallback$Stub;
-Lcom/android/internal/telephony/euicc/IDeleteProfileCallback;
-Lcom/android/internal/telephony/euicc/IDisableProfileCallback$Stub;
-Lcom/android/internal/telephony/euicc/IDisableProfileCallback;
-Lcom/android/internal/telephony/euicc/IEuiccCardController$Stub$Proxy;
-Lcom/android/internal/telephony/euicc/IEuiccCardController$Stub;
-Lcom/android/internal/telephony/euicc/IEuiccCardController;
-Lcom/android/internal/telephony/euicc/IEuiccController$Stub$Proxy;
-Lcom/android/internal/telephony/euicc/IEuiccController$Stub;
-Lcom/android/internal/telephony/euicc/IEuiccController;
-Lcom/android/internal/telephony/euicc/IGetAllProfilesCallback$Stub;
-Lcom/android/internal/telephony/euicc/IGetAllProfilesCallback;
-Lcom/android/internal/telephony/euicc/IGetDefaultSmdpAddressCallback$Stub;
-Lcom/android/internal/telephony/euicc/IGetDefaultSmdpAddressCallback;
-Lcom/android/internal/telephony/euicc/IGetEuiccChallengeCallback$Stub;
-Lcom/android/internal/telephony/euicc/IGetEuiccChallengeCallback;
-Lcom/android/internal/telephony/euicc/IGetEuiccInfo1Callback$Stub;
-Lcom/android/internal/telephony/euicc/IGetEuiccInfo1Callback;
-Lcom/android/internal/telephony/euicc/IGetEuiccInfo2Callback$Stub;
-Lcom/android/internal/telephony/euicc/IGetEuiccInfo2Callback;
-Lcom/android/internal/telephony/euicc/IGetProfileCallback$Stub;
-Lcom/android/internal/telephony/euicc/IGetProfileCallback;
-Lcom/android/internal/telephony/euicc/IGetRulesAuthTableCallback$Stub;
-Lcom/android/internal/telephony/euicc/IGetRulesAuthTableCallback;
-Lcom/android/internal/telephony/euicc/IGetSmdsAddressCallback$Stub;
-Lcom/android/internal/telephony/euicc/IGetSmdsAddressCallback;
-Lcom/android/internal/telephony/euicc/IListNotificationsCallback$Stub;
-Lcom/android/internal/telephony/euicc/IListNotificationsCallback;
-Lcom/android/internal/telephony/euicc/ILoadBoundProfilePackageCallback$Stub;
-Lcom/android/internal/telephony/euicc/ILoadBoundProfilePackageCallback;
-Lcom/android/internal/telephony/euicc/IPrepareDownloadCallback$Stub;
-Lcom/android/internal/telephony/euicc/IPrepareDownloadCallback;
-Lcom/android/internal/telephony/euicc/IRemoveNotificationFromListCallback$Stub;
-Lcom/android/internal/telephony/euicc/IRemoveNotificationFromListCallback;
-Lcom/android/internal/telephony/euicc/IResetMemoryCallback$Stub;
-Lcom/android/internal/telephony/euicc/IResetMemoryCallback;
-Lcom/android/internal/telephony/euicc/IRetrieveNotificationCallback$Stub;
-Lcom/android/internal/telephony/euicc/IRetrieveNotificationCallback;
-Lcom/android/internal/telephony/euicc/IRetrieveNotificationListCallback$Stub;
-Lcom/android/internal/telephony/euicc/IRetrieveNotificationListCallback;
-Lcom/android/internal/telephony/euicc/ISetDefaultSmdpAddressCallback$Stub;
-Lcom/android/internal/telephony/euicc/ISetDefaultSmdpAddressCallback;
-Lcom/android/internal/telephony/euicc/ISetNicknameCallback$Stub;
-Lcom/android/internal/telephony/euicc/ISetNicknameCallback;
-Lcom/android/internal/telephony/euicc/ISwitchToProfileCallback$Stub;
-Lcom/android/internal/telephony/euicc/ISwitchToProfileCallback;
-Lcom/android/internal/telephony/flags/FeatureFlags;
-Lcom/android/internal/telephony/flags/FeatureFlagsImpl;
-Lcom/android/internal/telephony/flags/Flags;
-Lcom/android/internal/telephony/gsm/GsmInboundSmsHandler$GsmCbTestBroadcastReceiver;
-Lcom/android/internal/telephony/gsm/GsmInboundSmsHandler;
-Lcom/android/internal/telephony/gsm/GsmMmiCode$1;
-Lcom/android/internal/telephony/gsm/GsmMmiCode;
-Lcom/android/internal/telephony/gsm/GsmSMSDispatcher;
-Lcom/android/internal/telephony/gsm/GsmSmsAddress;
-Lcom/android/internal/telephony/gsm/SimTlv;
-Lcom/android/internal/telephony/gsm/SmsBroadcastConfigInfo;
-Lcom/android/internal/telephony/gsm/SmsMessage$PduParser;
-Lcom/android/internal/telephony/gsm/SmsMessage$SubmitPdu;
-Lcom/android/internal/telephony/gsm/SmsMessage;
-Lcom/android/internal/telephony/gsm/SsData$RequestType;
-Lcom/android/internal/telephony/gsm/SsData$ServiceType;
-Lcom/android/internal/telephony/gsm/SsData$TeleserviceType;
-Lcom/android/internal/telephony/gsm/SsData;
-Lcom/android/internal/telephony/gsm/SuppServiceNotification;
-Lcom/android/internal/telephony/gsm/UsimDataDownloadHandler;
-Lcom/android/internal/telephony/gsm/UsimPhoneBookManager$File;
-Lcom/android/internal/telephony/gsm/UsimPhoneBookManager$PbrRecord;
-Lcom/android/internal/telephony/gsm/UsimPhoneBookManager;
-Lcom/android/internal/telephony/ims/ImsConfigCompatAdapter;
-Lcom/android/internal/telephony/ims/ImsRegistrationCompatAdapter$1;
-Lcom/android/internal/telephony/ims/ImsRegistrationCompatAdapter;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda10;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda11;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda12;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda13;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda3;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda4;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda5;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda6;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda7;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda8;
-Lcom/android/internal/telephony/ims/ImsResolver$$ExternalSyntheticLambda9;
-Lcom/android/internal/telephony/ims/ImsResolver$1;
-Lcom/android/internal/telephony/ims/ImsResolver$2;
-Lcom/android/internal/telephony/ims/ImsResolver$3;
-Lcom/android/internal/telephony/ims/ImsResolver$4;
-Lcom/android/internal/telephony/ims/ImsResolver$5;
-Lcom/android/internal/telephony/ims/ImsResolver$6;
-Lcom/android/internal/telephony/ims/ImsResolver$7;
-Lcom/android/internal/telephony/ims/ImsResolver$8;
-Lcom/android/internal/telephony/ims/ImsResolver$ImsDynamicQueryManagerFactory;
-Lcom/android/internal/telephony/ims/ImsResolver$ImsServiceControllerFactory;
-Lcom/android/internal/telephony/ims/ImsResolver$ImsServiceInfo;
-Lcom/android/internal/telephony/ims/ImsResolver$OverrideConfig;
-Lcom/android/internal/telephony/ims/ImsResolver$SubscriptionManagerProxy;
-Lcom/android/internal/telephony/ims/ImsResolver$TelephonyManagerProxy;
-Lcom/android/internal/telephony/ims/ImsResolver;
-Lcom/android/internal/telephony/ims/ImsServiceController$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/ims/ImsServiceController$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/ims/ImsServiceController$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/ims/ImsServiceController$$ExternalSyntheticLambda3;
-Lcom/android/internal/telephony/ims/ImsServiceController$$ExternalSyntheticLambda4;
-Lcom/android/internal/telephony/ims/ImsServiceController$1;
-Lcom/android/internal/telephony/ims/ImsServiceController$2;
-Lcom/android/internal/telephony/ims/ImsServiceController$3;
-Lcom/android/internal/telephony/ims/ImsServiceController$ImsFeatureStatusCallback$1;
-Lcom/android/internal/telephony/ims/ImsServiceController$ImsFeatureStatusCallback;
-Lcom/android/internal/telephony/ims/ImsServiceController$ImsServiceConnection;
-Lcom/android/internal/telephony/ims/ImsServiceController$ImsServiceControllerCallbacks;
-Lcom/android/internal/telephony/ims/ImsServiceController$RebindRetry;
-Lcom/android/internal/telephony/ims/ImsServiceController;
-Lcom/android/internal/telephony/ims/ImsServiceControllerCompat;
-Lcom/android/internal/telephony/ims/ImsServiceFeatureQueryManager$ImsServiceFeatureQuery;
-Lcom/android/internal/telephony/ims/ImsServiceFeatureQueryManager$Listener;
-Lcom/android/internal/telephony/ims/ImsServiceFeatureQueryManager;
-Lcom/android/internal/telephony/ims/MmTelFeatureCompatAdapter$1;
-Lcom/android/internal/telephony/ims/MmTelFeatureCompatAdapter$2;
-Lcom/android/internal/telephony/ims/MmTelFeatureCompatAdapter$3;
-Lcom/android/internal/telephony/ims/MmTelFeatureCompatAdapter$4;
-Lcom/android/internal/telephony/ims/MmTelFeatureCompatAdapter$5;
-Lcom/android/internal/telephony/ims/MmTelFeatureCompatAdapter$ConfigListener;
-Lcom/android/internal/telephony/ims/MmTelFeatureCompatAdapter$ImsRegistrationListenerBase;
-Lcom/android/internal/telephony/ims/MmTelFeatureCompatAdapter;
-Lcom/android/internal/telephony/ims/MmTelInterfaceAdapter;
-Lcom/android/internal/telephony/imsphone/ImsExternalCall;
-Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker$1;
-Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker$2;
-Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker$ExternalCallStateListener;
-Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker$ExternalConnectionListener;
-Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker$ImsCallNotify;
-Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker;
-Lcom/android/internal/telephony/imsphone/ImsExternalConnection$Listener;
-Lcom/android/internal/telephony/imsphone/ImsExternalConnection;
-Lcom/android/internal/telephony/imsphone/ImsPhone$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/imsphone/ImsPhone$1;
-Lcom/android/internal/telephony/imsphone/ImsPhone$2;
-Lcom/android/internal/telephony/imsphone/ImsPhone$3;
-Lcom/android/internal/telephony/imsphone/ImsPhone$4;
-Lcom/android/internal/telephony/imsphone/ImsPhone$ImsDialArgs$Builder;
-Lcom/android/internal/telephony/imsphone/ImsPhone$ImsDialArgs;
-Lcom/android/internal/telephony/imsphone/ImsPhone$ImsManagerFactory;
-Lcom/android/internal/telephony/imsphone/ImsPhone$SS;
-Lcom/android/internal/telephony/imsphone/ImsPhone;
-Lcom/android/internal/telephony/imsphone/ImsPhoneBase;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCall;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$$ExternalSyntheticLambda3;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$10;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$11;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$12;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$1;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$2;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$3;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$4;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$5;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$6;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$7;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$8;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$9;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$CacheEntry;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$Config;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$ConnectorFactory;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$HoldSwapState;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$MmTelFeatureListener;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$PhoneStateListener;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$SharedPreferenceProxy;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$VtDataUsageProvider;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker;
-Lcom/android/internal/telephony/imsphone/ImsPhoneCommandInterface;
-Lcom/android/internal/telephony/imsphone/ImsPhoneConnection$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/imsphone/ImsPhoneConnection$MyHandler;
-Lcom/android/internal/telephony/imsphone/ImsPhoneConnection;
-Lcom/android/internal/telephony/imsphone/ImsPhoneFactory;
-Lcom/android/internal/telephony/imsphone/ImsPhoneMmiCode;
-Lcom/android/internal/telephony/imsphone/ImsPullCall;
-Lcom/android/internal/telephony/imsphone/ImsRcsStatusListener;
-Lcom/android/internal/telephony/imsphone/ImsRegistrationCallbackHelper$1;
-Lcom/android/internal/telephony/imsphone/ImsRegistrationCallbackHelper$ImsRegistrationUpdate;
-Lcom/android/internal/telephony/imsphone/ImsRegistrationCallbackHelper;
-Lcom/android/internal/telephony/imsphone/ImsRttTextHandler$InCallReaderThread;
-Lcom/android/internal/telephony/imsphone/ImsRttTextHandler$NetworkWriter;
-Lcom/android/internal/telephony/imsphone/ImsRttTextHandler;
-Lcom/android/internal/telephony/metrics/AirplaneModeStats;
-Lcom/android/internal/telephony/metrics/CallQualityMetrics$TimestampedQualitySnapshot;
-Lcom/android/internal/telephony/metrics/CallQualityMetrics;
-Lcom/android/internal/telephony/metrics/CallSessionEventBuilder;
-Lcom/android/internal/telephony/metrics/CarrierIdMatchStats;
-Lcom/android/internal/telephony/metrics/DataCallSessionStats;
-Lcom/android/internal/telephony/metrics/DataStallRecoveryStats$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/metrics/DataStallRecoveryStats$1;
-Lcom/android/internal/telephony/metrics/DataStallRecoveryStats$2;
-Lcom/android/internal/telephony/metrics/DataStallRecoveryStats;
-Lcom/android/internal/telephony/metrics/ImsStats;
-Lcom/android/internal/telephony/metrics/InProgressCallSession;
-Lcom/android/internal/telephony/metrics/InProgressSmsSession;
-Lcom/android/internal/telephony/metrics/MetricsCollector$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/metrics/MetricsCollector$$ExternalSyntheticLambda10;
-Lcom/android/internal/telephony/metrics/MetricsCollector$$ExternalSyntheticLambda11;
-Lcom/android/internal/telephony/metrics/MetricsCollector$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/metrics/MetricsCollector$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/metrics/MetricsCollector$$ExternalSyntheticLambda3;
-Lcom/android/internal/telephony/metrics/MetricsCollector$$ExternalSyntheticLambda4;
-Lcom/android/internal/telephony/metrics/MetricsCollector$$ExternalSyntheticLambda5;
-Lcom/android/internal/telephony/metrics/MetricsCollector$$ExternalSyntheticLambda6;
-Lcom/android/internal/telephony/metrics/MetricsCollector$$ExternalSyntheticLambda7;
-Lcom/android/internal/telephony/metrics/MetricsCollector$$ExternalSyntheticLambda8;
-Lcom/android/internal/telephony/metrics/MetricsCollector$$ExternalSyntheticLambda9;
-Lcom/android/internal/telephony/metrics/MetricsCollector;
-Lcom/android/internal/telephony/metrics/ModemPowerMetrics$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/metrics/ModemPowerMetrics;
-Lcom/android/internal/telephony/metrics/ModemRestartStats;
-Lcom/android/internal/telephony/metrics/PersistAtomsStorage$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/metrics/PersistAtomsStorage$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/metrics/PersistAtomsStorage$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/metrics/PersistAtomsStorage$$ExternalSyntheticLambda3;
-Lcom/android/internal/telephony/metrics/PersistAtomsStorage$$ExternalSyntheticLambda4;
-Lcom/android/internal/telephony/metrics/PersistAtomsStorage$$ExternalSyntheticLambda5;
-Lcom/android/internal/telephony/metrics/PersistAtomsStorage$$ExternalSyntheticLambda6;
-Lcom/android/internal/telephony/metrics/PersistAtomsStorage$$ExternalSyntheticLambda7;
-Lcom/android/internal/telephony/metrics/PersistAtomsStorage$1;
-Lcom/android/internal/telephony/metrics/PersistAtomsStorage;
-Lcom/android/internal/telephony/metrics/ServiceStateStats$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/metrics/ServiceStateStats$TimestampedServiceState;
-Lcom/android/internal/telephony/metrics/ServiceStateStats;
-Lcom/android/internal/telephony/metrics/SimSlotState;
-Lcom/android/internal/telephony/metrics/SmsSessionEventBuilder;
-Lcom/android/internal/telephony/metrics/SmsStats;
-Lcom/android/internal/telephony/metrics/TelephonyEventBuilder;
-Lcom/android/internal/telephony/metrics/TelephonyMetrics$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/metrics/TelephonyMetrics$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/metrics/TelephonyMetrics$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/metrics/TelephonyMetrics$1;
-Lcom/android/internal/telephony/metrics/TelephonyMetrics$BwEstimationStats;
-Lcom/android/internal/telephony/metrics/TelephonyMetrics;
-Lcom/android/internal/telephony/metrics/VoiceCallRatTracker$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/metrics/VoiceCallRatTracker$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/metrics/VoiceCallRatTracker$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/metrics/VoiceCallRatTracker$$ExternalSyntheticLambda3;
-Lcom/android/internal/telephony/metrics/VoiceCallRatTracker$$ExternalSyntheticLambda4;
-Lcom/android/internal/telephony/metrics/VoiceCallRatTracker$$ExternalSyntheticLambda5;
-Lcom/android/internal/telephony/metrics/VoiceCallRatTracker$Key;
-Lcom/android/internal/telephony/metrics/VoiceCallRatTracker$Value;
-Lcom/android/internal/telephony/metrics/VoiceCallRatTracker;
-Lcom/android/internal/telephony/metrics/VoiceCallSessionStats$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/metrics/VoiceCallSessionStats$1;
-Lcom/android/internal/telephony/metrics/VoiceCallSessionStats;
-Lcom/android/internal/telephony/nano/CarrierIdProto$CarrierAttribute;
-Lcom/android/internal/telephony/nano/CarrierIdProto$CarrierId;
-Lcom/android/internal/telephony/nano/CarrierIdProto$CarrierList;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$CarrierIdMismatch;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$CellularDataServiceSwitch;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$CellularServiceState;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$DataCallSession;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$EmergencyNumbersInfo;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$GbaEvent;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsDedicatedBearerEvent;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsDedicatedBearerListenerEvent;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationFeatureTagStats;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationServiceDescStats;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationStats;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationTermination;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$IncomingSms;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$NetworkRequests;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$NetworkRequestsV2;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$OutgoingShortCodeSms;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$OutgoingSms;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$PersistAtoms;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$PresenceNotifyEvent;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$RcsAcsProvisioningStats;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$RcsClientProvisioningStats;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteController;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteIncomingDatagram;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteOutgoingDatagram;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteProvision;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteSession;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteSosMessageRecommender;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$SipDelegateStats;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$SipMessageResponse;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$SipTransportFeatureTagStats;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$SipTransportSession;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$UceEventStats;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$UnmeteredNetworks;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$VoiceCallRatUsage;
-Lcom/android/internal/telephony/nano/PersistAtomsProto$VoiceCallSession;
-Lcom/android/internal/telephony/nano/StoredPinProto$EncryptedPin;
-Lcom/android/internal/telephony/nano/StoredPinProto$StoredPin$PinStatus;
-Lcom/android/internal/telephony/nano/StoredPinProto$StoredPin;
-Lcom/android/internal/telephony/nano/TelephonyProto$ActiveSubscriptionInfo;
-Lcom/android/internal/telephony/nano/TelephonyProto$BandwidthEstimatorStats$PerLevel;
-Lcom/android/internal/telephony/nano/TelephonyProto$BandwidthEstimatorStats$PerRat;
-Lcom/android/internal/telephony/nano/TelephonyProto$BandwidthEstimatorStats;
-Lcom/android/internal/telephony/nano/TelephonyProto$EmergencyNumberInfo;
-Lcom/android/internal/telephony/nano/TelephonyProto$ImsCapabilities;
-Lcom/android/internal/telephony/nano/TelephonyProto$ImsConnectionState$State;
-Lcom/android/internal/telephony/nano/TelephonyProto$ImsConnectionState;
-Lcom/android/internal/telephony/nano/TelephonyProto$ImsReasonInfo;
-Lcom/android/internal/telephony/nano/TelephonyProto$ImsServiceErrno;
-Lcom/android/internal/telephony/nano/TelephonyProto$ModemPowerStats;
-Lcom/android/internal/telephony/nano/TelephonyProto$NrMode;
-Lcom/android/internal/telephony/nano/TelephonyProto$PdpType;
-Lcom/android/internal/telephony/nano/TelephonyProto$RadioAccessTechnology;
-Lcom/android/internal/telephony/nano/TelephonyProto$RilDataCall$State;
-Lcom/android/internal/telephony/nano/TelephonyProto$RilDataCall;
-Lcom/android/internal/telephony/nano/TelephonyProto$RilErrno;
-Lcom/android/internal/telephony/nano/TelephonyProto$SimState;
-Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession$Event$CBMessage;
-Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession$Event$CBMessageType;
-Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession$Event$CBPriority;
-Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession$Event$Format;
-Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession$Event$IncompleteSms;
-Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession$Event$SmsType;
-Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession$Event$Tech;
-Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession$Event$Type;
-Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession$Event;
-Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$AudioCodec;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$CallQuality$CallQualityLevel;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$CallQuality;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$CallQualitySummary;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$CallState;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$ImsCommand;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$PhoneState;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$RilCall$Type;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$RilCall;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$RilRequest;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$RilSrvccState;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$SignalStrength;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$Type;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$ApnType;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$CarrierIdMatching;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$CarrierIdMatchingResult;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$CarrierKeyChange$KeyType;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$CarrierKeyChange;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$DataSwitch$Reason;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$DataSwitch;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$EventState;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$ModemRestart;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$NetworkCapabilitiesInfo;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$NetworkValidationState;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$OnDemandDataSwitch;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$RilDeactivateDataCall$DeactivateReason;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$RilDeactivateDataCall;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$RilSetupDataCall$RilDataProfile;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$RilSetupDataCall;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$RilSetupDataCallResponse$RilDataCallFailCause;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$RilSetupDataCallResponse;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$Type;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyHistogram;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyLog;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyServiceState$Domain;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyServiceState$FrequencyRange;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyServiceState$NetworkRegistrationInfo;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyServiceState$NrState;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyServiceState$RoamingType;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyServiceState$TelephonyOperator;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyServiceState$Transport;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyServiceState;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonySettings$RilNetworkMode;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonySettings$WiFiCallingMode;
-Lcom/android/internal/telephony/nano/TelephonyProto$TelephonySettings;
-Lcom/android/internal/telephony/nano/TelephonyProto$Time;
-Lcom/android/internal/telephony/nano/TelephonyProto$TimeInterval;
-Lcom/android/internal/telephony/nitz/NitzSignalInputFilterPredicateFactory$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/nitz/NitzSignalInputFilterPredicateFactory$$ExternalSyntheticLambda1;
-Lcom/android/internal/telephony/nitz/NitzSignalInputFilterPredicateFactory$$ExternalSyntheticLambda2;
-Lcom/android/internal/telephony/nitz/NitzSignalInputFilterPredicateFactory$1;
-Lcom/android/internal/telephony/nitz/NitzSignalInputFilterPredicateFactory$NitzSignalInputFilterPredicateImpl;
-Lcom/android/internal/telephony/nitz/NitzSignalInputFilterPredicateFactory$TrivalentPredicate;
-Lcom/android/internal/telephony/nitz/NitzSignalInputFilterPredicateFactory;
-Lcom/android/internal/telephony/nitz/NitzStateMachineImpl$NitzSignalInputFilterPredicate;
-Lcom/android/internal/telephony/nitz/NitzStateMachineImpl$TimeZoneSuggester;
-Lcom/android/internal/telephony/nitz/NitzStateMachineImpl;
-Lcom/android/internal/telephony/nitz/TimeServiceHelper;
-Lcom/android/internal/telephony/nitz/TimeServiceHelperImpl;
-Lcom/android/internal/telephony/nitz/TimeZoneLookupHelper$CountryResult;
-Lcom/android/internal/telephony/nitz/TimeZoneLookupHelper;
-Lcom/android/internal/telephony/nitz/TimeZoneSuggesterImpl;
-Lcom/android/internal/telephony/phonenumbers/AlternateFormatsCountryCodeSet;
-Lcom/android/internal/telephony/phonenumbers/AsYouTypeFormatter;
-Lcom/android/internal/telephony/phonenumbers/CountryCodeToRegionCodeMap;
-Lcom/android/internal/telephony/phonenumbers/MetadataLoader;
-Lcom/android/internal/telephony/phonenumbers/NumberParseException$ErrorType;
-Lcom/android/internal/telephony/phonenumbers/NumberParseException;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberMatch;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberMatcher$NumberGroupingChecker;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberMatcher$State;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberMatcher;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberToCarrierMapper;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$1;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$2;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$Leniency$1;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$Leniency$2;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$Leniency$3$1;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$Leniency$3;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$Leniency$4$1;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$Leniency$4;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$Leniency;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$MatchType;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$PhoneNumberType;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$ValidationResult;
-Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil;
-Lcom/android/internal/telephony/phonenumbers/Phonemetadata$NumberFormat$Builder;
-Lcom/android/internal/telephony/phonenumbers/Phonemetadata$NumberFormat;
-Lcom/android/internal/telephony/phonenumbers/Phonemetadata$PhoneMetadata$Builder;
-Lcom/android/internal/telephony/phonenumbers/Phonemetadata$PhoneMetadata;
-Lcom/android/internal/telephony/phonenumbers/Phonemetadata$PhoneMetadataCollection$Builder;
-Lcom/android/internal/telephony/phonenumbers/Phonemetadata$PhoneMetadataCollection;
-Lcom/android/internal/telephony/phonenumbers/Phonemetadata$PhoneNumberDesc$Builder;
-Lcom/android/internal/telephony/phonenumbers/Phonemetadata$PhoneNumberDesc;
-Lcom/android/internal/telephony/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;
-Lcom/android/internal/telephony/phonenumbers/Phonenumber$PhoneNumber;
-Lcom/android/internal/telephony/phonenumbers/ShortNumberInfo$ShortNumberCost;
-Lcom/android/internal/telephony/phonenumbers/ShortNumberInfo;
-Lcom/android/internal/telephony/phonenumbers/ShortNumbersRegionCodeSet;
-Lcom/android/internal/telephony/phonenumbers/internal/MatcherApi;
-Lcom/android/internal/telephony/phonenumbers/internal/RegexBasedMatcher;
-Lcom/android/internal/telephony/phonenumbers/internal/RegexCache$LRUCache$1;
-Lcom/android/internal/telephony/phonenumbers/internal/RegexCache$LRUCache;
-Lcom/android/internal/telephony/phonenumbers/internal/RegexCache;
-Lcom/android/internal/telephony/phonenumbers/metadata/DefaultMetadataDependenciesProvider;
-Lcom/android/internal/telephony/phonenumbers/metadata/init/ClassPathResourceMetadataLoader;
-Lcom/android/internal/telephony/phonenumbers/metadata/init/MetadataParser;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/CompositeMetadataContainer;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/FormattingMetadataSource;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/FormattingMetadataSourceImpl;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/MapBackedMetadataContainer$1;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/MapBackedMetadataContainer$2;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/MapBackedMetadataContainer$KeyProvider;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/MapBackedMetadataContainer;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/MetadataBootstrappingGuard;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/MetadataContainer;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/MetadataSource;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/MetadataSourceImpl;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/MultiFileModeFileNameProvider;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/PhoneMetadataFileNameProvider;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/RegionMetadataSource;
-Lcom/android/internal/telephony/phonenumbers/metadata/source/RegionMetadataSourceImpl;
-Lcom/android/internal/telephony/phonenumbers/prefixmapper/DefaultMapStorage;
-Lcom/android/internal/telephony/phonenumbers/prefixmapper/FlyweightMapStorage;
-Lcom/android/internal/telephony/phonenumbers/prefixmapper/MappingFileProvider;
-Lcom/android/internal/telephony/phonenumbers/prefixmapper/PhonePrefixMap;
-Lcom/android/internal/telephony/phonenumbers/prefixmapper/PhonePrefixMapStorageStrategy;
-Lcom/android/internal/telephony/phonenumbers/prefixmapper/PrefixFileReader;
-Lcom/android/internal/telephony/phonenumbers/prefixmapper/PrefixTimeZonesMap;
-Lcom/android/internal/telephony/protobuf/nano/CodedInputByteBufferNano;
-Lcom/android/internal/telephony/protobuf/nano/CodedOutputByteBufferNano$OutOfSpaceException;
-Lcom/android/internal/telephony/protobuf/nano/CodedOutputByteBufferNano;
-Lcom/android/internal/telephony/protobuf/nano/ExtendableMessageNano;
-Lcom/android/internal/telephony/protobuf/nano/Extension$1;
-Lcom/android/internal/telephony/protobuf/nano/Extension$PrimitiveExtension;
-Lcom/android/internal/telephony/protobuf/nano/Extension;
-Lcom/android/internal/telephony/protobuf/nano/FieldArray;
-Lcom/android/internal/telephony/protobuf/nano/FieldData;
-Lcom/android/internal/telephony/protobuf/nano/InternalNano;
-Lcom/android/internal/telephony/protobuf/nano/InvalidProtocolBufferNanoException;
-Lcom/android/internal/telephony/protobuf/nano/MapFactories$1;
-Lcom/android/internal/telephony/protobuf/nano/MapFactories$DefaultMapFactory;
-Lcom/android/internal/telephony/protobuf/nano/MapFactories$MapFactory;
-Lcom/android/internal/telephony/protobuf/nano/MapFactories;
-Lcom/android/internal/telephony/protobuf/nano/MessageNano;
-Lcom/android/internal/telephony/protobuf/nano/MessageNanoPrinter;
-Lcom/android/internal/telephony/protobuf/nano/UnknownFieldData;
-Lcom/android/internal/telephony/protobuf/nano/WireFormatNano;
-Lcom/android/internal/telephony/protobuf/nano/android/ParcelableExtendableMessageNano;
-Lcom/android/internal/telephony/protobuf/nano/android/ParcelableMessageNano;
-Lcom/android/internal/telephony/protobuf/nano/android/ParcelableMessageNanoCreator;
-Lcom/android/internal/telephony/satellite/PointingAppController;
-Lcom/android/internal/telephony/satellite/SatelliteModemInterface;
-Lcom/android/internal/telephony/satellite/SatelliteSessionController;
-Lcom/android/internal/telephony/satellite/nano/SatelliteConfigData$CarrierSupportedSatelliteServicesProto;
-Lcom/android/internal/telephony/satellite/nano/SatelliteConfigData$SatelliteConfigProto;
-Lcom/android/internal/telephony/satellite/nano/SatelliteConfigData$SatelliteProviderCapabilityProto;
-Lcom/android/internal/telephony/satellite/nano/SatelliteConfigData$SatelliteRegionProto;
-Lcom/android/internal/telephony/satellite/nano/SatelliteConfigData$TelephonyConfigProto;
-Lcom/android/internal/telephony/security/NullCipherNotifier;
-Lcom/android/internal/telephony/subscription/SubscriptionManagerService$SubscriptionManagerServiceCallback;
-Lcom/android/internal/telephony/test/SimulatedRadioControl;
-Lcom/android/internal/telephony/test/TestConferenceEventPackageParser;
-Lcom/android/internal/telephony/uicc/AdnCapacity$1;
-Lcom/android/internal/telephony/uicc/AdnCapacity;
-Lcom/android/internal/telephony/uicc/AdnRecord$1;
-Lcom/android/internal/telephony/uicc/AdnRecord;
-Lcom/android/internal/telephony/uicc/AdnRecordCache;
-Lcom/android/internal/telephony/uicc/AdnRecordLoader;
-Lcom/android/internal/telephony/uicc/AnswerToReset$HistoricalBytes;
-Lcom/android/internal/telephony/uicc/AnswerToReset$InterfaceByte;
-Lcom/android/internal/telephony/uicc/AnswerToReset;
-Lcom/android/internal/telephony/uicc/CarrierAppInstallReceiver;
-Lcom/android/internal/telephony/uicc/CarrierTestOverride;
-Lcom/android/internal/telephony/uicc/CsimFileHandler;
-Lcom/android/internal/telephony/uicc/IccCardApplicationStatus$AppState;
-Lcom/android/internal/telephony/uicc/IccCardApplicationStatus$AppType;
-Lcom/android/internal/telephony/uicc/IccCardApplicationStatus$PersoSubState;
-Lcom/android/internal/telephony/uicc/IccCardApplicationStatus;
-Lcom/android/internal/telephony/uicc/IccCardStatus$CardState;
-Lcom/android/internal/telephony/uicc/IccCardStatus$PinState;
-Lcom/android/internal/telephony/uicc/IccCardStatus;
-Lcom/android/internal/telephony/uicc/IccConstants;
-Lcom/android/internal/telephony/uicc/IccException;
-Lcom/android/internal/telephony/uicc/IccFileHandler$LoadLinearFixedContext;
-Lcom/android/internal/telephony/uicc/IccFileHandler;
-Lcom/android/internal/telephony/uicc/IccFileNotFound;
-Lcom/android/internal/telephony/uicc/IccFileTypeMismatch;
-Lcom/android/internal/telephony/uicc/IccIoResult;
-Lcom/android/internal/telephony/uicc/IccRecords$AuthAsyncResponse;
-Lcom/android/internal/telephony/uicc/IccRecords$IccRecordLoaded;
-Lcom/android/internal/telephony/uicc/IccRecords$OperatorPlmnInfo;
-Lcom/android/internal/telephony/uicc/IccRecords$PlmnNetworkName;
-Lcom/android/internal/telephony/uicc/IccRecords;
-Lcom/android/internal/telephony/uicc/IccRefreshResponse;
-Lcom/android/internal/telephony/uicc/IccServiceTable;
-Lcom/android/internal/telephony/uicc/IccSlotStatus;
-Lcom/android/internal/telephony/uicc/IccUtils;
-Lcom/android/internal/telephony/uicc/IccVmFixedException;
-Lcom/android/internal/telephony/uicc/IccVmNotSupportedException;
-Lcom/android/internal/telephony/uicc/InstallCarrierAppTrampolineActivity;
-Lcom/android/internal/telephony/uicc/InstallCarrierAppUtils;
-Lcom/android/internal/telephony/uicc/IsimFileHandler;
-Lcom/android/internal/telephony/uicc/IsimRecords;
-Lcom/android/internal/telephony/uicc/IsimUiccRecords$EfIsimDomainLoaded;
-Lcom/android/internal/telephony/uicc/IsimUiccRecords$EfIsimImpiLoaded;
-Lcom/android/internal/telephony/uicc/IsimUiccRecords$EfIsimImpuLoaded;
-Lcom/android/internal/telephony/uicc/IsimUiccRecords$EfIsimIstLoaded;
-Lcom/android/internal/telephony/uicc/IsimUiccRecords$EfIsimPcscfLoaded;
-Lcom/android/internal/telephony/uicc/IsimUiccRecords;
-Lcom/android/internal/telephony/uicc/PinStorage$1;
-Lcom/android/internal/telephony/uicc/PinStorage;
-Lcom/android/internal/telephony/uicc/PlmnActRecord$1;
-Lcom/android/internal/telephony/uicc/PlmnActRecord;
-Lcom/android/internal/telephony/uicc/ReceivedPhonebookRecords;
-Lcom/android/internal/telephony/uicc/RuimFileHandler;
-Lcom/android/internal/telephony/uicc/RuimRecords$EfCsimCdmaHomeLoaded;
-Lcom/android/internal/telephony/uicc/RuimRecords$EfCsimEprlLoaded;
-Lcom/android/internal/telephony/uicc/RuimRecords$EfCsimImsimLoaded;
-Lcom/android/internal/telephony/uicc/RuimRecords$EfCsimLiLoaded;
-Lcom/android/internal/telephony/uicc/RuimRecords$EfCsimMdnLoaded;
-Lcom/android/internal/telephony/uicc/RuimRecords$EfCsimMipUppLoaded;
-Lcom/android/internal/telephony/uicc/RuimRecords$EfCsimSpnLoaded;
-Lcom/android/internal/telephony/uicc/RuimRecords$EfPlLoaded;
-Lcom/android/internal/telephony/uicc/RuimRecords;
-Lcom/android/internal/telephony/uicc/SIMFileHandler;
-Lcom/android/internal/telephony/uicc/SIMRecords$EfPlLoaded;
-Lcom/android/internal/telephony/uicc/SIMRecords$EfUsimLiLoaded;
-Lcom/android/internal/telephony/uicc/SIMRecords$GetSpnFsmState;
-Lcom/android/internal/telephony/uicc/SIMRecords;
-Lcom/android/internal/telephony/uicc/ShowInstallAppNotificationReceiver;
-Lcom/android/internal/telephony/uicc/SimPhonebookRecord$Builder;
-Lcom/android/internal/telephony/uicc/SimPhonebookRecord;
-Lcom/android/internal/telephony/uicc/SimPhonebookRecordCache$$ExternalSyntheticLambda0;
-Lcom/android/internal/telephony/uicc/SimPhonebookRecordCache$UpdateRequest;
-Lcom/android/internal/telephony/uicc/SimPhonebookRecordCache;
-Lcom/android/internal/telephony/uicc/UiccCard;
-Lcom/android/internal/telephony/uicc/UiccCardApplication$1;
-Lcom/android/internal/telephony/uicc/UiccCardApplication$2;
-Lcom/android/internal/telephony/uicc/UiccCardApplication;
-Lcom/android/internal/telephony/uicc/UiccCarrierPrivilegeRules$1;
-Lcom/android/internal/telephony/uicc/UiccCarrierPrivilegeRules$TLV;
-Lcom/android/internal/telephony/uicc/UiccCarrierPrivilegeRules;
-Lcom/android/internal/telephony/uicc/UiccController$1;
-Lcom/android/internal/telephony/uicc/UiccController;
-Lcom/android/internal/telephony/uicc/UiccPkcs15$FileHandler;
-Lcom/android/internal/telephony/uicc/UiccPkcs15$Pkcs15Selector;
-Lcom/android/internal/telephony/uicc/UiccPkcs15;
-Lcom/android/internal/telephony/uicc/UiccProfile$1;
-Lcom/android/internal/telephony/uicc/UiccProfile$2;
-Lcom/android/internal/telephony/uicc/UiccProfile$3;
-Lcom/android/internal/telephony/uicc/UiccProfile$4;
-Lcom/android/internal/telephony/uicc/UiccProfile$5;
-Lcom/android/internal/telephony/uicc/UiccProfile;
-Lcom/android/internal/telephony/uicc/UiccSlot$1;
-Lcom/android/internal/telephony/uicc/UiccSlot;
-Lcom/android/internal/telephony/uicc/UiccStateChangedLauncher;
-Lcom/android/internal/telephony/uicc/UsimFileHandler;
-Lcom/android/internal/telephony/uicc/UsimServiceTable$UsimService;
-Lcom/android/internal/telephony/uicc/UsimServiceTable;
-Lcom/android/internal/telephony/uicc/VoiceMailConstants;
-Lcom/android/internal/telephony/uicc/asn1/Asn1Decoder;
-Lcom/android/internal/telephony/uicc/asn1/Asn1Node$Builder;
-Lcom/android/internal/telephony/uicc/asn1/Asn1Node;
-Lcom/android/internal/telephony/uicc/asn1/InvalidAsn1DataException;
-Lcom/android/internal/telephony/uicc/asn1/TagNotFoundException;
-Lcom/android/internal/telephony/uicc/euicc/EuiccCard$1;
-Lcom/android/internal/telephony/uicc/euicc/EuiccCard;
-Lcom/android/internal/telephony/uicc/euicc/EuiccCardErrorException;
-Lcom/android/internal/telephony/uicc/euicc/EuiccCardException;
-Lcom/android/internal/telephony/uicc/euicc/EuiccSpecVersion;
-Lcom/android/internal/telephony/uicc/euicc/Tags;
-Lcom/android/internal/telephony/uicc/euicc/apdu/ApduCommand;
-Lcom/android/internal/telephony/uicc/euicc/apdu/ApduException;
-Lcom/android/internal/telephony/uicc/euicc/apdu/ApduSender$1;
-Lcom/android/internal/telephony/uicc/euicc/apdu/ApduSender$2$1;
-Lcom/android/internal/telephony/uicc/euicc/apdu/ApduSender$2;
-Lcom/android/internal/telephony/uicc/euicc/apdu/ApduSender$3;
-Lcom/android/internal/telephony/uicc/euicc/apdu/ApduSender$4;
-Lcom/android/internal/telephony/uicc/euicc/apdu/ApduSender;
-Lcom/android/internal/telephony/uicc/euicc/apdu/ApduSenderResultCallback;
-Lcom/android/internal/telephony/uicc/euicc/apdu/CloseLogicalChannelInvocation;
-Lcom/android/internal/telephony/uicc/euicc/apdu/OpenLogicalChannelInvocation;
-Lcom/android/internal/telephony/uicc/euicc/apdu/RequestBuilder;
-Lcom/android/internal/telephony/uicc/euicc/apdu/RequestProvider;
-Lcom/android/internal/telephony/uicc/euicc/apdu/TransmitApduLogicalChannelInvocation;
-Lcom/android/internal/telephony/uicc/euicc/async/AsyncMessageInvocation;
-Lcom/android/internal/telephony/uicc/euicc/async/AsyncResultCallback;
-Lcom/android/internal/telephony/uicc/euicc/async/AsyncResultHelper$1;
-Lcom/android/internal/telephony/uicc/euicc/async/AsyncResultHelper$2;
-Lcom/android/internal/telephony/uicc/euicc/async/AsyncResultHelper;
-Lcom/android/internal/telephony/util/ArrayUtils;
-Lcom/android/internal/telephony/util/BitUtils;
-Lcom/android/internal/telephony/util/CollectionUtils;
-Lcom/android/internal/telephony/util/ConnectivityUtils;
-Lcom/android/internal/telephony/util/DnsPacket$DnsHeader;
-Lcom/android/internal/telephony/util/DnsPacket$DnsRecord;
-Lcom/android/internal/telephony/util/DnsPacket$ParseException;
-Lcom/android/internal/telephony/util/DnsPacket;
-Lcom/android/internal/telephony/util/DnsSdTxtRecord$1;
-Lcom/android/internal/telephony/util/DnsSdTxtRecord;
-Lcom/android/internal/telephony/util/HandlerExecutor;
-Lcom/android/internal/telephony/util/Inet4AddressUtils;
-Lcom/android/internal/telephony/util/InetAddressUtils;
-Lcom/android/internal/telephony/util/IpRange;
-Lcom/android/internal/telephony/util/IpUtils;
-Lcom/android/internal/telephony/util/LinkPropertiesUtils$CompareOrUpdateResult;
-Lcom/android/internal/telephony/util/LinkPropertiesUtils$CompareResult;
-Lcom/android/internal/telephony/util/LinkPropertiesUtils;
-Lcom/android/internal/telephony/util/LocaleUtils;
-Lcom/android/internal/telephony/util/LocationPermissionChecker;
-Lcom/android/internal/telephony/util/MacAddressUtils;
-Lcom/android/internal/telephony/util/NetUtils;
-Lcom/android/internal/telephony/util/NetworkCapabilitiesUtils;
-Lcom/android/internal/telephony/util/NetworkIdentityUtils;
-Lcom/android/internal/telephony/util/NetworkStackConstants;
-Lcom/android/internal/telephony/util/NotificationChannelController$1;
-Lcom/android/internal/telephony/util/NotificationChannelController;
-Lcom/android/internal/telephony/util/PermissionUtils;
-Lcom/android/internal/telephony/util/ProxyUtils;
-Lcom/android/internal/telephony/util/RemoteCallbackListExt;
-Lcom/android/internal/telephony/util/SMSDispatcherUtil;
-Lcom/android/internal/telephony/util/TelephonyUtils;
-Lcom/android/internal/telephony/util/VoicemailNotificationSettingsUtil;
-Lcom/android/internal/telephony/util/XmlUtils;
-Lcom/android/internal/textservice/ISpellCheckerService$Stub$Proxy;
-Lcom/android/internal/textservice/ISpellCheckerService$Stub;
-Lcom/android/internal/textservice/ISpellCheckerService;
-Lcom/android/internal/textservice/ISpellCheckerServiceCallback$Stub$Proxy;
-Lcom/android/internal/textservice/ISpellCheckerServiceCallback$Stub;
-Lcom/android/internal/textservice/ISpellCheckerServiceCallback;
-Lcom/android/internal/textservice/ISpellCheckerSession$Stub$Proxy;
-Lcom/android/internal/textservice/ISpellCheckerSession$Stub;
-Lcom/android/internal/textservice/ISpellCheckerSession;
-Lcom/android/internal/textservice/ISpellCheckerSessionListener$Stub$Proxy;
-Lcom/android/internal/textservice/ISpellCheckerSessionListener$Stub;
-Lcom/android/internal/textservice/ISpellCheckerSessionListener;
-Lcom/android/internal/textservice/ITextServicesManager$Stub$Proxy;
-Lcom/android/internal/textservice/ITextServicesManager$Stub;
-Lcom/android/internal/textservice/ITextServicesManager;
-Lcom/android/internal/textservice/ITextServicesSessionListener$Stub$Proxy;
-Lcom/android/internal/textservice/ITextServicesSessionListener$Stub;
-Lcom/android/internal/textservice/ITextServicesSessionListener;
-Lcom/android/internal/transition/EpicenterTranslateClipReveal$1;
-Lcom/android/internal/transition/EpicenterTranslateClipReveal$State;
-Lcom/android/internal/transition/EpicenterTranslateClipReveal$StateEvaluator;
-Lcom/android/internal/transition/EpicenterTranslateClipReveal$StateProperty;
-Lcom/android/internal/transition/EpicenterTranslateClipReveal;
-Lcom/android/internal/transition/TransitionConstants;
-Lcom/android/internal/usb/DumpUtils;
-Lcom/android/internal/util/AnnotationValidations;
-Lcom/android/internal/util/ArrayUtils;
-Lcom/android/internal/util/AsyncChannel$AsyncChannelConnection;
-Lcom/android/internal/util/AsyncChannel$DeathMonitor;
-Lcom/android/internal/util/AsyncChannel$SyncMessenger$SyncHandler;
-Lcom/android/internal/util/AsyncChannel$SyncMessenger;
-Lcom/android/internal/util/AsyncChannel;
-Lcom/android/internal/util/BitUtils;
-Lcom/android/internal/util/BitwiseInputStream$AccessException;
-Lcom/android/internal/util/BitwiseOutputStream$AccessException;
-Lcom/android/internal/util/CollectionUtils;
-Lcom/android/internal/util/ConcurrentUtils$1$1;
-Lcom/android/internal/util/ConcurrentUtils$1;
-Lcom/android/internal/util/ConcurrentUtils$DirectExecutor;
-Lcom/android/internal/util/ConcurrentUtils;
-Lcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;
-Lcom/android/internal/util/ContrastColorUtil;
-Lcom/android/internal/util/DumpUtils$1;
-Lcom/android/internal/util/DumpUtils$Dump;
-Lcom/android/internal/util/DumpUtils;
-Lcom/android/internal/util/EmergencyAffordanceManager;
-Lcom/android/internal/util/ExponentiallyBucketedHistogram;
-Lcom/android/internal/util/FastMath;
-Lcom/android/internal/util/FastPrintWriter$DummyWriter-IA;
-Lcom/android/internal/util/FastPrintWriter$DummyWriter;
-Lcom/android/internal/util/FastPrintWriter;
-Lcom/android/internal/util/FastXmlSerializer;
-Lcom/android/internal/util/FileRotator$FileInfo;
-Lcom/android/internal/util/FileRotator$Reader;
-Lcom/android/internal/util/FileRotator$Rewriter;
-Lcom/android/internal/util/FileRotator$Writer;
-Lcom/android/internal/util/FileRotator;
-Lcom/android/internal/util/FrameworkStatsLog;
-Lcom/android/internal/util/FunctionalUtils$RemoteExceptionIgnoringConsumer;
-Lcom/android/internal/util/FunctionalUtils$ThrowingBiFunction;
-Lcom/android/internal/util/FunctionalUtils$ThrowingConsumer;
-Lcom/android/internal/util/FunctionalUtils$ThrowingFunction;
-Lcom/android/internal/util/FunctionalUtils$ThrowingRunnable;
-Lcom/android/internal/util/FunctionalUtils$ThrowingSupplier;
-Lcom/android/internal/util/FunctionalUtils;
-Lcom/android/internal/util/GrowingArrayUtils;
-Lcom/android/internal/util/HeavyHitterSketch$HeavyHitterSketchImpl;
-Lcom/android/internal/util/HeavyHitterSketch;
-Lcom/android/internal/util/HexDump;
-Lcom/android/internal/util/IState;
-Lcom/android/internal/util/ImageUtils;
-Lcom/android/internal/util/IndentingPrintWriter;
-Lcom/android/internal/util/IntPair;
-Lcom/android/internal/util/JournaledFile;
-Lcom/android/internal/util/LatencyTracker$$ExternalSyntheticLambda0;
-Lcom/android/internal/util/LatencyTracker$$ExternalSyntheticLambda1;
-Lcom/android/internal/util/LatencyTracker$$ExternalSyntheticLambda2;
-Lcom/android/internal/util/LatencyTracker$Action;
-Lcom/android/internal/util/LatencyTracker$ActionProperties;
-Lcom/android/internal/util/LatencyTracker$FrameworkStatsLogEvent-IA;
-Lcom/android/internal/util/LatencyTracker$FrameworkStatsLogEvent;
-Lcom/android/internal/util/LatencyTracker$SLatencyTrackerHolder;
-Lcom/android/internal/util/LatencyTracker$Session$$ExternalSyntheticLambda0;
-Lcom/android/internal/util/LatencyTracker$Session;
-Lcom/android/internal/util/LatencyTracker;
-Lcom/android/internal/util/LineBreakBufferedWriter;
-Lcom/android/internal/util/LocalLog;
-Lcom/android/internal/util/MemInfoReader;
-Lcom/android/internal/util/MessageUtils$DuplicateConstantError;
-Lcom/android/internal/util/MessageUtils;
-Lcom/android/internal/util/NotificationMessagingUtil$1;
-Lcom/android/internal/util/NotificationMessagingUtil;
-Lcom/android/internal/util/ObjectUtils;
-Lcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;
-Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedString;
-Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringArray;
-Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringList;
-Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringSet;
-Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringValueMap;
-Lcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;
-Lcom/android/internal/util/Parcelling$BuiltIn$ForUUID;
-Lcom/android/internal/util/Parcelling$Cache;
-Lcom/android/internal/util/Parcelling;
-Lcom/android/internal/util/ParseUtils;
-Lcom/android/internal/util/PerfettoTrigger;
-Lcom/android/internal/util/Preconditions;
-Lcom/android/internal/util/ProcFileReader;
-Lcom/android/internal/util/ProgressReporter;
-Lcom/android/internal/util/ProviderAccessStats$PerThreadData;
-Lcom/android/internal/util/ProviderAccessStats;
-Lcom/android/internal/util/RingBuffer$$ExternalSyntheticLambda0;
-Lcom/android/internal/util/RingBuffer$$ExternalSyntheticLambda1;
-Lcom/android/internal/util/RingBuffer;
-Lcom/android/internal/util/RingBufferIndices;
-Lcom/android/internal/util/ScreenshotHelper$1;
-Lcom/android/internal/util/ScreenshotHelper$2;
-Lcom/android/internal/util/ScreenshotHelper;
-Lcom/android/internal/util/StatLogger;
-Lcom/android/internal/util/State;
-Lcom/android/internal/util/StateMachine$LogRec;
-Lcom/android/internal/util/StateMachine$LogRecords-IA;
-Lcom/android/internal/util/StateMachine$LogRecords;
-Lcom/android/internal/util/StateMachine$SmHandler$HaltingState-IA;
-Lcom/android/internal/util/StateMachine$SmHandler$HaltingState;
-Lcom/android/internal/util/StateMachine$SmHandler$QuittingState-IA;
-Lcom/android/internal/util/StateMachine$SmHandler$QuittingState;
-Lcom/android/internal/util/StateMachine$SmHandler$StateInfo;
-Lcom/android/internal/util/StateMachine$SmHandler-IA;
-Lcom/android/internal/util/StateMachine$SmHandler;
-Lcom/android/internal/util/StateMachine;
-Lcom/android/internal/util/StringPool;
-Lcom/android/internal/util/SyncResultReceiver$TimeoutException;
-Lcom/android/internal/util/SyncResultReceiver;
-Lcom/android/internal/util/ToBooleanFunction;
-Lcom/android/internal/util/TokenBucket;
-Lcom/android/internal/util/TraceBuffer$ProtoOutputStreamProvider-IA;
-Lcom/android/internal/util/TraceBuffer$ProtoOutputStreamProvider;
-Lcom/android/internal/util/TraceBuffer$ProtoProvider;
-Lcom/android/internal/util/TraceBuffer;
-Lcom/android/internal/util/UserIcons;
-Lcom/android/internal/util/VirtualRefBasePtr;
-Lcom/android/internal/util/WakeupMessage;
-Lcom/android/internal/util/XmlPullParserWrapper;
-Lcom/android/internal/util/XmlSerializerWrapper;
-Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;
-Lcom/android/internal/util/XmlUtils$ReadMapCallback;
-Lcom/android/internal/util/XmlUtils$WriteMapCallback;
-Lcom/android/internal/util/XmlUtils;
-Lcom/android/internal/util/dump/DualDumpOutputStream$DumpField;
-Lcom/android/internal/util/dump/DualDumpOutputStream$DumpObject;
-Lcom/android/internal/util/dump/DualDumpOutputStream$Dumpable;
-Lcom/android/internal/util/dump/DualDumpOutputStream;
-Lcom/android/internal/util/dump/DumpUtils;
-Lcom/android/internal/util/function/DecConsumer;
-Lcom/android/internal/util/function/DecFunction;
-Lcom/android/internal/util/function/DecPredicate;
-Lcom/android/internal/util/function/DodecConsumer;
-Lcom/android/internal/util/function/DodecFunction;
-Lcom/android/internal/util/function/DodecPredicate;
-Lcom/android/internal/util/function/HeptConsumer;
-Lcom/android/internal/util/function/HeptFunction;
-Lcom/android/internal/util/function/HeptPredicate;
-Lcom/android/internal/util/function/HexConsumer;
-Lcom/android/internal/util/function/HexFunction;
-Lcom/android/internal/util/function/HexPredicate;
-Lcom/android/internal/util/function/LongObjPredicate;
-Lcom/android/internal/util/function/NonaConsumer;
-Lcom/android/internal/util/function/NonaFunction;
-Lcom/android/internal/util/function/NonaPredicate;
-Lcom/android/internal/util/function/OctConsumer;
-Lcom/android/internal/util/function/OctFunction;
-Lcom/android/internal/util/function/OctPredicate;
-Lcom/android/internal/util/function/QuadConsumer;
-Lcom/android/internal/util/function/QuadFunction;
-Lcom/android/internal/util/function/QuadPredicate;
-Lcom/android/internal/util/function/QuintConsumer;
-Lcom/android/internal/util/function/QuintFunction;
-Lcom/android/internal/util/function/QuintPredicate;
-Lcom/android/internal/util/function/TriConsumer;
-Lcom/android/internal/util/function/TriFunction;
-Lcom/android/internal/util/function/TriPredicate;
-Lcom/android/internal/util/function/UndecConsumer;
-Lcom/android/internal/util/function/UndecFunction;
-Lcom/android/internal/util/function/UndecPredicate;
-Lcom/android/internal/util/function/pooled/ArgumentPlaceholder;
-Lcom/android/internal/util/function/pooled/OmniFunction;
-Lcom/android/internal/util/function/pooled/PooledLambda;
-Lcom/android/internal/util/function/pooled/PooledLambdaImpl$LambdaType$ReturnType;
-Lcom/android/internal/util/function/pooled/PooledLambdaImpl$LambdaType;
-Lcom/android/internal/util/function/pooled/PooledLambdaImpl$Pool;
-Lcom/android/internal/util/function/pooled/PooledPredicate;
-Lcom/android/internal/util/function/pooled/PooledRunnable;
-Lcom/android/internal/util/function/pooled/PooledSupplier$OfDouble;
-Lcom/android/internal/util/function/pooled/PooledSupplier$OfInt;
-Lcom/android/internal/util/function/pooled/PooledSupplier$OfLong;
-Lcom/android/internal/util/function/pooled/PooledSupplier;
-Lcom/android/internal/view/ActionBarPolicy;
-Lcom/android/internal/view/AppearanceRegion$1;
-Lcom/android/internal/view/AppearanceRegion;
-Lcom/android/internal/view/BaseIWindow;
-Lcom/android/internal/view/BaseSurfaceHolder;
-Lcom/android/internal/view/FloatingActionMode$1;
-Lcom/android/internal/view/FloatingActionMode$2;
-Lcom/android/internal/view/FloatingActionMode$3;
-Lcom/android/internal/view/FloatingActionMode$FloatingToolbarVisibilityHelper;
-Lcom/android/internal/view/FloatingActionMode;
-Lcom/android/internal/view/IInputMethodManager$Stub$Proxy;
-Lcom/android/internal/view/IInputMethodManager$Stub;
-Lcom/android/internal/view/IInputMethodManager;
-Lcom/android/internal/view/OneShotPreDrawListener;
-Lcom/android/internal/view/RootViewSurfaceTaker;
-Lcom/android/internal/view/RotationPolicy$1;
-Lcom/android/internal/view/RotationPolicy$RotationPolicyListener$1;
-Lcom/android/internal/view/RotationPolicy$RotationPolicyListener;
-Lcom/android/internal/view/RotationPolicy;
-Lcom/android/internal/view/SurfaceCallbackHelper$1;
-Lcom/android/internal/view/SurfaceCallbackHelper;
-Lcom/android/internal/view/TooltipPopup;
-Lcom/android/internal/view/WindowManagerPolicyThread;
-Lcom/android/internal/view/menu/ActionMenuItem;
-Lcom/android/internal/view/menu/ActionMenuItemView$ActionMenuItemForwardingListener;
-Lcom/android/internal/view/menu/ActionMenuItemView$PopupCallback;
-Lcom/android/internal/view/menu/ActionMenuItemView;
-Lcom/android/internal/view/menu/BaseMenuPresenter;
-Lcom/android/internal/view/menu/ContextMenuBuilder;
-Lcom/android/internal/view/menu/IconMenuPresenter;
-Lcom/android/internal/view/menu/ListMenuPresenter;
-Lcom/android/internal/view/menu/MenuBuilder$Callback;
-Lcom/android/internal/view/menu/MenuBuilder$ItemInvoker;
-Lcom/android/internal/view/menu/MenuBuilder;
-Lcom/android/internal/view/menu/MenuHelper;
-Lcom/android/internal/view/menu/MenuItemImpl;
-Lcom/android/internal/view/menu/MenuPopupHelper$1;
-Lcom/android/internal/view/menu/MenuPopupHelper;
-Lcom/android/internal/view/menu/MenuPresenter$Callback;
-Lcom/android/internal/view/menu/MenuPresenter;
-Lcom/android/internal/view/menu/MenuView$ItemView;
-Lcom/android/internal/view/menu/MenuView;
-Lcom/android/internal/view/menu/ShowableListMenu;
-Lcom/android/internal/view/menu/SubMenuBuilder;
-Lcom/android/internal/widget/AbsActionBarView$VisibilityAnimListener;
-Lcom/android/internal/widget/AbsActionBarView;
-Lcom/android/internal/widget/ActionBarContainer$ActionBarBackgroundDrawable;
-Lcom/android/internal/widget/ActionBarContainer;
-Lcom/android/internal/widget/ActionBarContextView;
-Lcom/android/internal/widget/ActionBarOverlayLayout$1;
-Lcom/android/internal/widget/ActionBarOverlayLayout$2;
-Lcom/android/internal/widget/ActionBarOverlayLayout$3;
-Lcom/android/internal/widget/ActionBarOverlayLayout$4;
-Lcom/android/internal/widget/ActionBarOverlayLayout$5;
-Lcom/android/internal/widget/ActionBarOverlayLayout$ActionBarVisibilityCallback;
-Lcom/android/internal/widget/ActionBarOverlayLayout$LayoutParams;
-Lcom/android/internal/widget/ActionBarOverlayLayout;
-Lcom/android/internal/widget/AlertDialogLayout;
-Lcom/android/internal/widget/AutoScrollHelper$AbsListViewAutoScroller;
-Lcom/android/internal/widget/AutoScrollHelper;
-Lcom/android/internal/widget/BackgroundFallback;
-Lcom/android/internal/widget/ButtonBarLayout;
-Lcom/android/internal/widget/CachingIconView;
-Lcom/android/internal/widget/ConversationLayout$1;
-Lcom/android/internal/widget/ConversationLayout$TouchDelegateComposite;
-Lcom/android/internal/widget/ConversationLayout;
-Lcom/android/internal/widget/DecorCaptionView;
-Lcom/android/internal/widget/DecorContentParent;
-Lcom/android/internal/widget/DecorToolbar;
-Lcom/android/internal/widget/DialogTitle;
-Lcom/android/internal/widget/ExploreByTouchHelper;
-Lcom/android/internal/widget/ICheckCredentialProgressCallback$Stub$Proxy;
-Lcom/android/internal/widget/ICheckCredentialProgressCallback$Stub;
-Lcom/android/internal/widget/ICheckCredentialProgressCallback;
-Lcom/android/internal/widget/ILockSettings$Stub$Proxy;
-Lcom/android/internal/widget/ILockSettings$Stub;
-Lcom/android/internal/widget/ILockSettings;
-Lcom/android/internal/widget/IMessagingLayout;
-Lcom/android/internal/widget/ImageFloatingTextView;
-Lcom/android/internal/widget/ImageMessageConsumer;
-Lcom/android/internal/widget/ImageResolver;
-Lcom/android/internal/widget/LockPatternChecker$2;
-Lcom/android/internal/widget/LockPatternChecker$OnCheckCallback;
-Lcom/android/internal/widget/LockPatternChecker;
-Lcom/android/internal/widget/LockPatternUtils$1;
-Lcom/android/internal/widget/LockPatternUtils$CheckCredentialProgressCallback;
-Lcom/android/internal/widget/LockPatternUtils$RequestThrottledException;
-Lcom/android/internal/widget/LockPatternUtils$StrongAuthTracker$1;
-Lcom/android/internal/widget/LockPatternUtils$StrongAuthTracker$H;
-Lcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;
-Lcom/android/internal/widget/LockPatternUtils$WrappedCallback;
-Lcom/android/internal/widget/LockPatternUtils;
-Lcom/android/internal/widget/LockPatternView$Cell;
-Lcom/android/internal/widget/LockSettingsInternal;
-Lcom/android/internal/widget/LockscreenCredential$1;
-Lcom/android/internal/widget/LockscreenCredential;
-Lcom/android/internal/widget/MessagingGroup$1;
-Lcom/android/internal/widget/MessagingGroup;
-Lcom/android/internal/widget/MessagingImageMessage;
-Lcom/android/internal/widget/MessagingLayout;
-Lcom/android/internal/widget/MessagingLinearLayout$LayoutParams;
-Lcom/android/internal/widget/MessagingLinearLayout$MessagingChild;
-Lcom/android/internal/widget/MessagingLinearLayout;
-Lcom/android/internal/widget/MessagingMessage;
-Lcom/android/internal/widget/MessagingMessageState;
-Lcom/android/internal/widget/MessagingPool;
-Lcom/android/internal/widget/MessagingPropertyAnimator$$ExternalSyntheticLambda0;
-Lcom/android/internal/widget/MessagingPropertyAnimator$1;
-Lcom/android/internal/widget/MessagingPropertyAnimator$2;
-Lcom/android/internal/widget/MessagingPropertyAnimator;
-Lcom/android/internal/widget/MessagingTextMessage;
-Lcom/android/internal/widget/NotificationActionListLayout$$ExternalSyntheticLambda0;
-Lcom/android/internal/widget/NotificationActionListLayout;
-Lcom/android/internal/widget/NotificationExpandButton;
-Lcom/android/internal/widget/NotificationOptimizedLinearLayout;
-Lcom/android/internal/widget/ObservableTextView;
-Lcom/android/internal/widget/PasswordValidationError;
-Lcom/android/internal/widget/RemeasuringLinearLayout;
-Lcom/android/internal/widget/ScrollBarUtils;
-Lcom/android/internal/widget/ScrollingTabContainerView;
-Lcom/android/internal/widget/ToolbarWidgetWrapper$1;
-Lcom/android/internal/widget/ToolbarWidgetWrapper;
-Lcom/android/internal/widget/VerifyCredentialResponse$1;
-Lcom/android/internal/widget/VerifyCredentialResponse$Builder;
-Lcom/android/internal/widget/VerifyCredentialResponse;
-Lcom/android/internal/widget/ViewClippingUtil$ClippingParameters;
-Lcom/android/internal/widget/ViewClippingUtil;
-Lcom/android/internal/widget/floatingtoolbar/FloatingToolbar$$ExternalSyntheticLambda0;
-Lcom/android/internal/widget/floatingtoolbar/FloatingToolbar$$ExternalSyntheticLambda1;
-Lcom/android/internal/widget/floatingtoolbar/FloatingToolbar;
-Lcom/android/internal/widget/floatingtoolbar/FloatingToolbarPopup;
-Lcom/android/media/flags/Flags;
-Lcom/android/modules/expresslog/Counter;
-Lcom/android/modules/expresslog/MetricIds;
-Lcom/android/modules/expresslog/StatsExpressLog;
-Lcom/android/modules/utils/BasicShellCommandHandler;
-Lcom/android/modules/utils/TypedXmlPullParser;
-Lcom/android/modules/utils/TypedXmlSerializer;
-Lcom/android/net/module/util/BitUtils;
-Lcom/android/net/module/util/Inet4AddressUtils;
-Lcom/android/net/module/util/InetAddressUtils;
-Lcom/android/net/module/util/IpRange;
-Lcom/android/net/module/util/LinkPropertiesUtils$CompareOrUpdateResult;
-Lcom/android/net/module/util/LinkPropertiesUtils$CompareResult;
-Lcom/android/net/module/util/LinkPropertiesUtils;
-Lcom/android/net/module/util/MacAddressUtils;
-Lcom/android/net/module/util/NetUtils;
-Lcom/android/net/module/util/NetworkCapabilitiesUtils;
-Lcom/android/net/module/util/NetworkIdentityUtils;
-Lcom/android/net/module/util/NetworkStackConstants;
-Lcom/android/net/module/util/ProxyUtils;
-Lcom/android/okhttp/Address;
-Lcom/android/okhttp/AndroidInternal;
-Lcom/android/okhttp/AndroidShimResponseCache;
-Lcom/android/okhttp/Authenticator;
-Lcom/android/okhttp/Cache$1;
-Lcom/android/okhttp/Cache$CacheResponseBody$1;
-Lcom/android/okhttp/Cache$CacheResponseBody;
-Lcom/android/okhttp/Cache$Entry;
-Lcom/android/okhttp/Cache;
-Lcom/android/okhttp/CacheControl$Builder;
-Lcom/android/okhttp/CacheControl;
-Lcom/android/okhttp/CertificatePinner$Builder;
-Lcom/android/okhttp/CertificatePinner;
-Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/ConfigAwareConnectionPool$1;
-Lcom/android/okhttp/ConfigAwareConnectionPool;
-Lcom/android/okhttp/Connection;
-Lcom/android/okhttp/ConnectionPool$1;
-Lcom/android/okhttp/ConnectionPool;
-Lcom/android/okhttp/ConnectionSpec$1;
-Lcom/android/okhttp/ConnectionSpec$Builder;
-Lcom/android/okhttp/ConnectionSpec;
-Lcom/android/okhttp/ConnectionSpecs;
-Lcom/android/okhttp/Dispatcher;
-Lcom/android/okhttp/Dns$1;
-Lcom/android/okhttp/Dns;
-Lcom/android/okhttp/Handshake;
-Lcom/android/okhttp/Headers$1;
-Lcom/android/okhttp/Headers$Builder;
-Lcom/android/okhttp/Headers;
-Lcom/android/okhttp/HttpHandler$CleartextURLFilter;
-Lcom/android/okhttp/HttpHandler;
-Lcom/android/okhttp/HttpUrl$1;
-Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
-Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl;
-Lcom/android/okhttp/Interceptor$Chain;
-Lcom/android/okhttp/MediaType;
-Lcom/android/okhttp/OkCacheContainer;
-Lcom/android/okhttp/OkHttpClient$1;
-Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkUrlFactories;
-Lcom/android/okhttp/OkUrlFactory;
-Lcom/android/okhttp/Protocol;
-Lcom/android/okhttp/Request$1;
-Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request;
-Lcom/android/okhttp/RequestBody$2;
-Lcom/android/okhttp/RequestBody;
-Lcom/android/okhttp/Response$1;
-Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response;
-Lcom/android/okhttp/ResponseBody;
-Lcom/android/okhttp/Route;
-Lcom/android/okhttp/TlsVersion;
-Lcom/android/okhttp/internal/ConnectionSpecSelector;
-Lcom/android/okhttp/internal/DiskLruCache$1;
-Lcom/android/okhttp/internal/DiskLruCache$4;
-Lcom/android/okhttp/internal/DiskLruCache$Editor;
-Lcom/android/okhttp/internal/DiskLruCache$Entry;
-Lcom/android/okhttp/internal/DiskLruCache;
-Lcom/android/okhttp/internal/FaultHidingSink;
-Lcom/android/okhttp/internal/Internal;
-Lcom/android/okhttp/internal/InternalCache;
-Lcom/android/okhttp/internal/NamedRunnable;
-Lcom/android/okhttp/internal/OptionalMethod;
-Lcom/android/okhttp/internal/Platform;
-Lcom/android/okhttp/internal/RouteDatabase;
-Lcom/android/okhttp/internal/URLFilter;
-Lcom/android/okhttp/internal/Util$1;
-Lcom/android/okhttp/internal/Util;
-Lcom/android/okhttp/internal/Version;
-Lcom/android/okhttp/internal/framed/FrameWriter;
-Lcom/android/okhttp/internal/framed/FramedConnection$1;
-Lcom/android/okhttp/internal/framed/FramedConnection$Builder;
-Lcom/android/okhttp/internal/framed/FramedConnection$Listener$1;
-Lcom/android/okhttp/internal/framed/FramedConnection$Listener;
-Lcom/android/okhttp/internal/framed/FramedConnection;
-Lcom/android/okhttp/internal/framed/Header;
-Lcom/android/okhttp/internal/framed/PushObserver$1;
-Lcom/android/okhttp/internal/framed/PushObserver;
-Lcom/android/okhttp/internal/framed/Settings;
-Lcom/android/okhttp/internal/http/AuthenticatorAdapter;
-Lcom/android/okhttp/internal/http/CacheRequest;
-Lcom/android/okhttp/internal/http/CacheStrategy$1;
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;
-Lcom/android/okhttp/internal/http/CacheStrategy;
-Lcom/android/okhttp/internal/http/HeaderParser;
-Lcom/android/okhttp/internal/http/Http1xStream$1;
-Lcom/android/okhttp/internal/http/Http1xStream$AbstractSource;
-Lcom/android/okhttp/internal/http/Http1xStream$ChunkedSink;
-Lcom/android/okhttp/internal/http/Http1xStream$ChunkedSource;
-Lcom/android/okhttp/internal/http/Http1xStream$FixedLengthSink;
-Lcom/android/okhttp/internal/http/Http1xStream$FixedLengthSource;
-Lcom/android/okhttp/internal/http/Http1xStream;
-Lcom/android/okhttp/internal/http/Http2xStream;
-Lcom/android/okhttp/internal/http/HttpDate$1;
-Lcom/android/okhttp/internal/http/HttpDate;
-Lcom/android/okhttp/internal/http/HttpEngine$1;
-Lcom/android/okhttp/internal/http/HttpEngine$2;
-Lcom/android/okhttp/internal/http/HttpEngine$NetworkInterceptorChain;
-Lcom/android/okhttp/internal/http/HttpEngine;
-Lcom/android/okhttp/internal/http/HttpMethod;
-Lcom/android/okhttp/internal/http/HttpStream;
-Lcom/android/okhttp/internal/http/OkHeaders$1;
-Lcom/android/okhttp/internal/http/OkHeaders;
-Lcom/android/okhttp/internal/http/RealResponseBody;
-Lcom/android/okhttp/internal/http/RequestException;
-Lcom/android/okhttp/internal/http/RequestLine;
-Lcom/android/okhttp/internal/http/RetryableSink;
-Lcom/android/okhttp/internal/http/RouteException;
-Lcom/android/okhttp/internal/http/RouteSelector;
-Lcom/android/okhttp/internal/http/StatusLine;
-Lcom/android/okhttp/internal/http/StreamAllocation;
-Lcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;
-Lcom/android/okhttp/internal/huc/HttpURLConnectionImpl;
-Lcom/android/okhttp/internal/io/FileSystem$1;
-Lcom/android/okhttp/internal/io/FileSystem;
-Lcom/android/okhttp/internal/io/RealConnection;
-Lcom/android/okhttp/internal/tls/CertificateChainCleaner;
-Lcom/android/okhttp/internal/tls/OkHostnameVerifier;
-Lcom/android/okhttp/internal/tls/RealTrustRootIndex;
-Lcom/android/okhttp/internal/tls/TrustRootIndex;
-Lcom/android/okhttp/internalandroidapi/AndroidResponseCacheAdapter;
-Lcom/android/okhttp/internalandroidapi/Dns;
-Lcom/android/okhttp/internalandroidapi/HasCacheHolder$CacheHolder;
-Lcom/android/okhttp/internalandroidapi/HasCacheHolder;
-Lcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory$DnsAdapter;
-Lcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;
-Lcom/android/okhttp/okio/AsyncTimeout$1;
-Lcom/android/okhttp/okio/AsyncTimeout$2;
-Lcom/android/okhttp/okio/AsyncTimeout$Watchdog;
-Lcom/android/okhttp/okio/AsyncTimeout;
-Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSource;
-Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ForwardingSink;
-Lcom/android/okhttp/okio/ForwardingSource;
-Lcom/android/okhttp/okio/ForwardingTimeout;
-Lcom/android/okhttp/okio/GzipSource;
-Lcom/android/okhttp/okio/InflaterSource;
-Lcom/android/okhttp/okio/Okio$1;
-Lcom/android/okhttp/okio/Okio$2;
-Lcom/android/okhttp/okio/Okio$3;
-Lcom/android/okhttp/okio/Okio;
-Lcom/android/okhttp/okio/RealBufferedSink$1;
-Lcom/android/okhttp/okio/RealBufferedSink;
-Lcom/android/okhttp/okio/RealBufferedSource;
-Lcom/android/okhttp/okio/Segment;
-Lcom/android/okhttp/okio/SegmentPool;
-Lcom/android/okhttp/okio/Sink;
-Lcom/android/okhttp/okio/Source;
-Lcom/android/okhttp/okio/Timeout$1;
-Lcom/android/okhttp/okio/Timeout;
-Lcom/android/okhttp/okio/Util;
-Lcom/android/org/bouncycastle/asn1/ASN1ApplicationSpecific;
-Lcom/android/org/bouncycastle/asn1/ASN1BitString;
-Lcom/android/org/bouncycastle/asn1/ASN1Boolean;
-Lcom/android/org/bouncycastle/asn1/ASN1Choice;
-Lcom/android/org/bouncycastle/asn1/ASN1Encodable;
-Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;
-Lcom/android/org/bouncycastle/asn1/ASN1Enumerated;
-Lcom/android/org/bouncycastle/asn1/ASN1Exception;
-Lcom/android/org/bouncycastle/asn1/ASN1External;
-Lcom/android/org/bouncycastle/asn1/ASN1GeneralizedTime;
-Lcom/android/org/bouncycastle/asn1/ASN1InputStream;
-Lcom/android/org/bouncycastle/asn1/ASN1Integer;
-Lcom/android/org/bouncycastle/asn1/ASN1Object;
-Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier$OidHandle;
-Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;
-Lcom/android/org/bouncycastle/asn1/ASN1OctetString;
-Lcom/android/org/bouncycastle/asn1/ASN1OctetStringParser;
-Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;
-Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-Lcom/android/org/bouncycastle/asn1/ASN1Sequence$1;
-Lcom/android/org/bouncycastle/asn1/ASN1Sequence;
-Lcom/android/org/bouncycastle/asn1/ASN1SequenceParser;
-Lcom/android/org/bouncycastle/asn1/ASN1Set$1;
-Lcom/android/org/bouncycastle/asn1/ASN1Set;
-Lcom/android/org/bouncycastle/asn1/ASN1SetParser;
-Lcom/android/org/bouncycastle/asn1/ASN1StreamParser;
-Lcom/android/org/bouncycastle/asn1/ASN1String;
-Lcom/android/org/bouncycastle/asn1/ASN1TaggedObject;
-Lcom/android/org/bouncycastle/asn1/ASN1UTCTime;
-Lcom/android/org/bouncycastle/asn1/BERApplicationSpecific;
-Lcom/android/org/bouncycastle/asn1/BERApplicationSpecificParser;
-Lcom/android/org/bouncycastle/asn1/BEROctetString;
-Lcom/android/org/bouncycastle/asn1/BEROctetStringParser;
-Lcom/android/org/bouncycastle/asn1/BERSequence;
-Lcom/android/org/bouncycastle/asn1/BERSequenceParser;
-Lcom/android/org/bouncycastle/asn1/BERSet;
-Lcom/android/org/bouncycastle/asn1/BERSetParser;
-Lcom/android/org/bouncycastle/asn1/BERTaggedObjectParser;
-Lcom/android/org/bouncycastle/asn1/ConstructedOctetStream;
-Lcom/android/org/bouncycastle/asn1/DERBMPString;
-Lcom/android/org/bouncycastle/asn1/DERBitString;
-Lcom/android/org/bouncycastle/asn1/DERExternalParser;
-Lcom/android/org/bouncycastle/asn1/DERGeneralString;
-Lcom/android/org/bouncycastle/asn1/DERGraphicString;
-Lcom/android/org/bouncycastle/asn1/DERIA5String;
-Lcom/android/org/bouncycastle/asn1/DERNull;
-Lcom/android/org/bouncycastle/asn1/DERNumericString;
-Lcom/android/org/bouncycastle/asn1/DEROctetString;
-Lcom/android/org/bouncycastle/asn1/DEROutputStream;
-Lcom/android/org/bouncycastle/asn1/DERPrintableString;
-Lcom/android/org/bouncycastle/asn1/DERSequence;
-Lcom/android/org/bouncycastle/asn1/DERSet;
-Lcom/android/org/bouncycastle/asn1/DERT61String;
-Lcom/android/org/bouncycastle/asn1/DERTaggedObject;
-Lcom/android/org/bouncycastle/asn1/DERUTF8String;
-Lcom/android/org/bouncycastle/asn1/DERUniversalString;
-Lcom/android/org/bouncycastle/asn1/DERVideotexString;
-Lcom/android/org/bouncycastle/asn1/DERVisibleString;
-Lcom/android/org/bouncycastle/asn1/DLApplicationSpecific;
-Lcom/android/org/bouncycastle/asn1/DLBitString;
-Lcom/android/org/bouncycastle/asn1/DLExternal;
-Lcom/android/org/bouncycastle/asn1/DLFactory;
-Lcom/android/org/bouncycastle/asn1/DLSequence;
-Lcom/android/org/bouncycastle/asn1/DLSet;
-Lcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;
-Lcom/android/org/bouncycastle/asn1/InMemoryRepresentable;
-Lcom/android/org/bouncycastle/asn1/IndefiniteLengthInputStream;
-Lcom/android/org/bouncycastle/asn1/LazyEncodedSequence;
-Lcom/android/org/bouncycastle/asn1/LimitedInputStream;
-Lcom/android/org/bouncycastle/asn1/StreamUtil;
-Lcom/android/org/bouncycastle/asn1/bc/BCObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/misc/MiscObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/nist/NISTObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/oiw/OIWObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/pkcs/PKCSObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/x500/X500Name;
-Lcom/android/org/bouncycastle/asn1/x500/style/AbstractX500NameStyle;
-Lcom/android/org/bouncycastle/asn1/x500/style/BCStyle;
-Lcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;
-Lcom/android/org/bouncycastle/asn1/x509/Certificate;
-Lcom/android/org/bouncycastle/asn1/x509/DSAParameter;
-Lcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;
-Lcom/android/org/bouncycastle/asn1/x509/Time;
-Lcom/android/org/bouncycastle/asn1/x509/X509Name;
-Lcom/android/org/bouncycastle/asn1/x509/X509ObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/x9/X9ECParameters;
-Lcom/android/org/bouncycastle/asn1/x9/X9ObjectIdentifiers;
-Lcom/android/org/bouncycastle/crypto/BlockCipher;
-Lcom/android/org/bouncycastle/crypto/BufferedBlockCipher;
-Lcom/android/org/bouncycastle/crypto/CipherParameters;
-Lcom/android/org/bouncycastle/crypto/CryptoException;
-Lcom/android/org/bouncycastle/crypto/CryptoServicesPermission;
-Lcom/android/org/bouncycastle/crypto/CryptoServicesRegistrar$Property;
-Lcom/android/org/bouncycastle/crypto/CryptoServicesRegistrar;
-Lcom/android/org/bouncycastle/crypto/DataLengthException;
-Lcom/android/org/bouncycastle/crypto/Digest;
-Lcom/android/org/bouncycastle/crypto/ExtendedDigest;
-Lcom/android/org/bouncycastle/crypto/InvalidCipherTextException;
-Lcom/android/org/bouncycastle/crypto/Mac;
-Lcom/android/org/bouncycastle/crypto/OutputLengthException;
-Lcom/android/org/bouncycastle/crypto/PBEParametersGenerator;
-Lcom/android/org/bouncycastle/crypto/RuntimeCryptoException;
-Lcom/android/org/bouncycastle/crypto/Wrapper;
-Lcom/android/org/bouncycastle/crypto/digests/AndroidDigestFactory;
-Lcom/android/org/bouncycastle/crypto/digests/AndroidDigestFactoryBouncyCastle;
-Lcom/android/org/bouncycastle/crypto/digests/AndroidDigestFactoryOpenSSL;
-Lcom/android/org/bouncycastle/crypto/digests/EncodableDigest;
-Lcom/android/org/bouncycastle/crypto/digests/GeneralDigest;
-Lcom/android/org/bouncycastle/crypto/digests/LongDigest;
-Lcom/android/org/bouncycastle/crypto/digests/MD5Digest;
-Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$MD5;
-Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$SHA1;
-Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$SHA224;
-Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$SHA256;
-Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$SHA384;
-Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$SHA512;
-Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;
-Lcom/android/org/bouncycastle/crypto/digests/SHA1Digest;
-Lcom/android/org/bouncycastle/crypto/digests/SHA224Digest;
-Lcom/android/org/bouncycastle/crypto/digests/SHA256Digest;
-Lcom/android/org/bouncycastle/crypto/digests/SHA384Digest;
-Lcom/android/org/bouncycastle/crypto/digests/SHA512Digest;
-Lcom/android/org/bouncycastle/crypto/engines/AESEngine;
-Lcom/android/org/bouncycastle/crypto/engines/DESEngine;
-Lcom/android/org/bouncycastle/crypto/generators/OpenSSLPBEParametersGenerator;
-Lcom/android/org/bouncycastle/crypto/generators/PKCS12ParametersGenerator;
-Lcom/android/org/bouncycastle/crypto/generators/PKCS5S1ParametersGenerator;
-Lcom/android/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator;
-Lcom/android/org/bouncycastle/crypto/io/MacInputStream;
-Lcom/android/org/bouncycastle/crypto/macs/HMac;
-Lcom/android/org/bouncycastle/crypto/modes/AEADBlockCipher;
-Lcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;
-Lcom/android/org/bouncycastle/crypto/paddings/BlockCipherPadding;
-Lcom/android/org/bouncycastle/crypto/paddings/PKCS7Padding;
-Lcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;
-Lcom/android/org/bouncycastle/crypto/params/AEADParameters;
-Lcom/android/org/bouncycastle/crypto/params/AsymmetricKeyParameter;
-Lcom/android/org/bouncycastle/crypto/params/DHParameters;
-Lcom/android/org/bouncycastle/crypto/params/DHValidationParameters;
-Lcom/android/org/bouncycastle/crypto/params/DSAKeyParameters;
-Lcom/android/org/bouncycastle/crypto/params/DSAParameters;
-Lcom/android/org/bouncycastle/crypto/params/DSAPublicKeyParameters;
-Lcom/android/org/bouncycastle/crypto/params/DSAValidationParameters;
-Lcom/android/org/bouncycastle/crypto/params/KeyParameter;
-Lcom/android/org/bouncycastle/crypto/params/ParametersWithIV;
-Lcom/android/org/bouncycastle/crypto/params/ParametersWithRandom;
-Lcom/android/org/bouncycastle/jcajce/PKCS12Key;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/DH$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/DH;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/DSA$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/RSA$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/RSA;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/dh/KeyFactorySpi;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/DSAUtil;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/KeyFactorySpi;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/rsa/CipherSpi$NoPadding;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/rsa/KeyFactorySpi;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/rsa/RSAUtil;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/util/BaseCipherSpi;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/util/BaseKeyFactorySpi;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/util/KeyUtil;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/x509/CertificateFactory;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/x509/PEMUtil$Boundaries;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/x509/PEMUtil;
-Lcom/android/org/bouncycastle/jcajce/provider/config/ConfigurableProvider;
-Lcom/android/org/bouncycastle/jcajce/provider/config/ProviderConfiguration;
-Lcom/android/org/bouncycastle/jcajce/provider/config/ProviderConfigurationPermission;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/DigestAlgorithmProvider;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA1$Mappings$$ExternalSyntheticOutline0;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA1$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA1;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA224$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA224;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA256$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA256;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA384$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA384;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA512$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA512;
-Lcom/android/org/bouncycastle/jcajce/provider/keystore/BC$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/keystore/PKCS12$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$Std;
-Lcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$StoreEntry;
-Lcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/AES$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/AES;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/ARC4$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/ARC4;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/Blowfish$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/Blowfish;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/DES$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/DES;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/DESede$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/DESede;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2$BasePBKDF2;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2$BasePBKDF2WithHmacSHA1;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2$PBKDF2WithHmacSHA1UTF8;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPKCS12$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPKCS12;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBES2AlgorithmParameters$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBES2AlgorithmParameters;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/RC2$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/RC2;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/SymmetricAlgorithmProvider;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/Twofish$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/Twofish;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BCPBEKey;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$AEADGenericBlockCipher;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$GenericBlockCipher;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseSecretKeyFactory;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseWrapCipher$ErasableOutputStream;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseWrapCipher$InvalidKeyOrParametersException;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseWrapCipher;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/ClassUtil$1;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/ClassUtil;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/GcmSpecUtil$2;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/GcmSpecUtil;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/PBE$Util;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/PBE;
-Lcom/android/org/bouncycastle/jcajce/provider/util/AlgorithmProvider;
-Lcom/android/org/bouncycastle/jcajce/provider/util/AsymmetricAlgorithmProvider;
-Lcom/android/org/bouncycastle/jcajce/provider/util/AsymmetricKeyInfoConverter;
-Lcom/android/org/bouncycastle/jcajce/provider/util/DigestFactory;
-Lcom/android/org/bouncycastle/jcajce/spec/PBKDF2KeySpec;
-Lcom/android/org/bouncycastle/jcajce/util/BCJcaJceHelper;
-Lcom/android/org/bouncycastle/jcajce/util/DefaultJcaJceHelper;
-Lcom/android/org/bouncycastle/jcajce/util/JcaJceHelper;
-Lcom/android/org/bouncycastle/jce/X509Principal;
-Lcom/android/org/bouncycastle/jce/interfaces/PKCS12BagAttributeCarrier;
-Lcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider$1;
-Lcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider$PrivateProvider;
-Lcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider;
-Lcom/android/org/bouncycastle/jce/provider/BouncyCastleProviderConfiguration;
-Lcom/android/org/bouncycastle/jce/provider/CertStoreCollectionSpi;
-Lcom/android/org/bouncycastle/jce/provider/X509CRLObject;
-Lcom/android/org/bouncycastle/util/Arrays;
-Lcom/android/org/bouncycastle/util/BigIntegers;
-Lcom/android/org/bouncycastle/util/Integers;
-Lcom/android/org/bouncycastle/util/Memoable;
-Lcom/android/org/bouncycastle/util/Pack;
-Lcom/android/org/bouncycastle/util/Properties$1;
-Lcom/android/org/bouncycastle/util/Properties;
-Lcom/android/org/bouncycastle/util/Strings$1;
-Lcom/android/org/bouncycastle/util/Strings;
-Lcom/android/org/bouncycastle/util/encoders/Hex;
-Lcom/android/org/bouncycastle/util/encoders/HexEncoder;
-Lcom/android/org/bouncycastle/util/io/Streams;
-Lcom/android/org/kxml2/io/KXmlParser$ContentSource;
-Lcom/android/org/kxml2/io/KXmlParser$ValueContext;
-Lcom/android/phone/ecc/nano/CodedInputByteBufferNano;
-Lcom/android/phone/ecc/nano/CodedOutputByteBufferNano$OutOfSpaceException;
-Lcom/android/phone/ecc/nano/CodedOutputByteBufferNano;
-Lcom/android/phone/ecc/nano/ExtendableMessageNano;
-Lcom/android/phone/ecc/nano/FieldArray;
-Lcom/android/phone/ecc/nano/FieldData;
-Lcom/android/phone/ecc/nano/InternalNano;
-Lcom/android/phone/ecc/nano/InvalidProtocolBufferNanoException;
-Lcom/android/phone/ecc/nano/MessageNano;
-Lcom/android/phone/ecc/nano/MessageNanoPrinter;
-Lcom/android/phone/ecc/nano/ProtobufEccData$AllInfo;
-Lcom/android/phone/ecc/nano/ProtobufEccData$CountryInfo;
-Lcom/android/phone/ecc/nano/ProtobufEccData$EccInfo;
-Lcom/android/phone/ecc/nano/UnknownFieldData;
-Lcom/android/phone/ecc/nano/WireFormatNano;
-Lcom/android/sdksandbox/flags/Flags;
-Lcom/android/server/AppWidgetBackupBridge;
-Lcom/android/server/LocalServices;
-Lcom/android/server/WidgetBackupProvider;
-Lcom/android/server/am/nano/Capabilities;
-Lcom/android/server/am/nano/Capability;
-Lcom/android/server/backup/AccountManagerBackupHelper;
-Lcom/android/server/backup/AccountSyncSettingsBackupHelper;
-Lcom/android/server/backup/NotificationBackupHelper;
-Lcom/android/server/backup/PermissionBackupHelper;
-Lcom/android/server/backup/PreferredActivityBackupHelper;
-Lcom/android/server/backup/ShortcutBackupHelper;
-Lcom/android/server/backup/SliceBackupHelper;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$ApfProgramEvent;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$ApfStatistics;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$ConnectStatistics;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$DHCPEvent;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$DNSLatencies;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$DNSLookupBatch;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$DefaultNetworkEvent;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityLog;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpProvisioningEvent;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpReachabilityEvent;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$NetworkEvent;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$NetworkId;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$NetworkStats;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$Pair;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$RaEvent;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$ValidationProbeEvent;
-Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$WakeupStats;
-Lcom/android/server/criticalevents/nano/CriticalEventLogProto;
-Lcom/android/server/criticalevents/nano/CriticalEventLogStorageProto;
-Lcom/android/server/criticalevents/nano/CriticalEventProto$AppNotResponding;
-Lcom/android/server/criticalevents/nano/CriticalEventProto$HalfWatchdog;
-Lcom/android/server/criticalevents/nano/CriticalEventProto$InstallPackages;
-Lcom/android/server/criticalevents/nano/CriticalEventProto$JavaCrash;
-Lcom/android/server/criticalevents/nano/CriticalEventProto$NativeCrash;
-Lcom/android/server/criticalevents/nano/CriticalEventProto$SystemServerStarted;
-Lcom/android/server/criticalevents/nano/CriticalEventProto$Watchdog;
-Lcom/android/server/job/JobSchedulerInternal$JobStorePersistStats;
-Lcom/android/server/net/BaseNetdEventCallback;
-Lcom/android/server/net/BaseNetworkObserver;
-Lcom/android/server/sip/SipHelper;
-Lcom/android/server/sip/SipService$ConnectivityReceiver$1;
-Lcom/android/server/sip/SipService$ConnectivityReceiver;
-Lcom/android/server/sip/SipService$MyExecutor;
-Lcom/android/server/sip/SipService$SipAutoReg;
-Lcom/android/server/sip/SipService$SipKeepAliveProcessCallback;
-Lcom/android/server/sip/SipService$SipSessionGroupExt;
-Lcom/android/server/sip/SipService;
-Lcom/android/server/sip/SipSessionGroup$KeepAliveProcessCallback;
-Lcom/android/server/sip/SipSessionGroup$KeepAliveProcessCallbackProxy$1;
-Lcom/android/server/sip/SipSessionGroup$KeepAliveProcessCallbackProxy$2;
-Lcom/android/server/sip/SipSessionGroup$KeepAliveProcessCallbackProxy;
-Lcom/android/server/sip/SipSessionGroup$MakeCallCommand;
-Lcom/android/server/sip/SipSessionGroup$RegisterCommand;
-Lcom/android/server/sip/SipSessionGroup$SipSessionCallReceiverImpl;
-Lcom/android/server/sip/SipSessionGroup$SipSessionImpl$1;
-Lcom/android/server/sip/SipSessionGroup$SipSessionImpl$2$1;
-Lcom/android/server/sip/SipSessionGroup$SipSessionImpl$2;
-Lcom/android/server/sip/SipSessionGroup$SipSessionImpl$SessionTimer$1;
-Lcom/android/server/sip/SipSessionGroup$SipSessionImpl$SessionTimer;
-Lcom/android/server/sip/SipSessionGroup$SipSessionImpl$SipKeepAlive;
-Lcom/android/server/sip/SipSessionGroup$SipSessionImpl;
-Lcom/android/server/sip/SipSessionGroup;
-Lcom/android/server/sip/SipSessionListenerProxy$10;
-Lcom/android/server/sip/SipSessionListenerProxy$11;
-Lcom/android/server/sip/SipSessionListenerProxy$12;
-Lcom/android/server/sip/SipSessionListenerProxy$13;
-Lcom/android/server/sip/SipSessionListenerProxy$1;
-Lcom/android/server/sip/SipSessionListenerProxy$2;
-Lcom/android/server/sip/SipSessionListenerProxy$3;
-Lcom/android/server/sip/SipSessionListenerProxy$4;
-Lcom/android/server/sip/SipSessionListenerProxy$5;
-Lcom/android/server/sip/SipSessionListenerProxy$6;
-Lcom/android/server/sip/SipSessionListenerProxy$7;
-Lcom/android/server/sip/SipSessionListenerProxy$8;
-Lcom/android/server/sip/SipSessionListenerProxy$9;
-Lcom/android/server/sip/SipSessionListenerProxy;
-Lcom/android/server/sip/SipWakeLock;
-Lcom/android/server/sip/SipWakeupTimer$MyEvent;
-Lcom/android/server/sip/SipWakeupTimer$MyEventComparator;
-Lcom/android/server/sip/SipWakeupTimer;
-Lcom/android/server/usage/AppStandbyInternal$AppIdleStateChangeListener;
-Lcom/android/server/usage/AppStandbyInternal;
-Lcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;
-Lcom/android/service/ims/RcsSettingUtils$$ExternalSyntheticLambda0;
-Lcom/android/service/ims/RcsSettingUtils;
-Lcom/android/service/ims/Task;
-Lcom/android/service/ims/TaskManager$MessageData;
-Lcom/android/service/ims/TaskManager$MessageHandler;
-Lcom/android/service/ims/TaskManager;
-Lcom/android/service/ims/presence/ContactCapabilityResponse;
-Lcom/android/service/ims/presence/PresenceAvailabilityTask;
-Lcom/android/service/ims/presence/PresenceBase$PresencePublishState;
-Lcom/android/service/ims/presence/PresenceBase;
-Lcom/android/service/ims/presence/PresenceCapabilityTask;
-Lcom/android/service/ims/presence/PresencePublication$$ExternalSyntheticLambda0;
-Lcom/android/service/ims/presence/PresencePublication$1;
-Lcom/android/service/ims/presence/PresencePublication$PublishRequest;
-Lcom/android/service/ims/presence/PresencePublication$PublishType;
-Lcom/android/service/ims/presence/PresencePublication$StackPublishTriggerType;
-Lcom/android/service/ims/presence/PresencePublication;
-Lcom/android/service/ims/presence/PresencePublishTask;
-Lcom/android/service/ims/presence/PresencePublisher;
-Lcom/android/service/ims/presence/PresenceSubscriber;
-Lcom/android/service/ims/presence/PresenceTask;
-Lcom/android/service/ims/presence/PresenceUtils;
-Lcom/android/service/ims/presence/SubscribePublisher;
-Lcom/android/service/nano/StringListParamProto;
-Lcom/android/telephony/Rlog;
-Lcom/android/text/flags/FeatureFlags;
-Lcom/android/text/flags/FeatureFlagsImpl;
-Lcom/android/text/flags/Flags;
-Lcom/android/window/flags/FeatureFlags;
-Lcom/android/window/flags/FeatureFlagsImpl;
-Lcom/android/window/flags/Flags;
-Lcom/google/android/collect/Lists;
-Lcom/google/android/collect/Maps;
-Lcom/google/android/collect/Sets;
-Lcom/google/android/gles_jni/EGLConfigImpl;
-Lcom/google/android/gles_jni/EGLContextImpl;
-Lcom/google/android/gles_jni/EGLDisplayImpl;
-Lcom/google/android/gles_jni/EGLImpl;
-Lcom/google/android/gles_jni/EGLSurfaceImpl;
-Lcom/google/android/gles_jni/GLImpl;
-Lcom/google/android/mms/InvalidHeaderValueException;
-Lcom/google/android/mms/MmsException;
-Lcom/google/android/mms/pdu/EncodedStringValue;
-Lcom/google/android/mms/pdu/GenericPdu;
-Lcom/google/android/mms/pdu/NotificationInd;
-Lcom/google/android/mms/pdu/PduParser;
-Lcom/google/android/rappor/Encoder;
-Lcom/google/android/rappor/HmacDrbg;
-Lcom/sun/security/cert/internal/x509/X509V1CertImpl;
-Ldalvik/annotation/optimization/CriticalNative;
-Ldalvik/annotation/optimization/FastNative;
-Ldalvik/annotation/optimization/NeverCompile;
-Ldalvik/annotation/optimization/NeverInline;
-Ldalvik/system/AppSpecializationHooks;
-Ldalvik/system/BaseDexClassLoader$Reporter;
-Ldalvik/system/BaseDexClassLoader;
-Ldalvik/system/BlockGuard$2;
-Ldalvik/system/BlockGuard$BlockGuardPolicyException;
-Ldalvik/system/BlockGuard$Policy;
-Ldalvik/system/BlockGuard$VmPolicy;
-Ldalvik/system/BlockGuard;
-Ldalvik/system/ClassExt;
-Ldalvik/system/CloseGuard$DefaultReporter;
-Ldalvik/system/CloseGuard$Reporter;
-Ldalvik/system/CloseGuard$Tracker;
-Ldalvik/system/CloseGuard;
-Ldalvik/system/DelegateLastClassLoader;
-Ldalvik/system/DexClassLoader;
-Ldalvik/system/DexFile$DFEnum;
-Ldalvik/system/DexFile$OptimizationInfo-IA;
-Ldalvik/system/DexFile$OptimizationInfo;
-Ldalvik/system/DexFile;
-Ldalvik/system/DexPathList$$ExternalSyntheticLambda0;
-Ldalvik/system/DexPathList$Element;
-Ldalvik/system/DexPathList$NativeLibraryElement;
-Ldalvik/system/DexPathList;
-Ldalvik/system/EmulatedStackFrame$Range;
-Ldalvik/system/EmulatedStackFrame;
-Ldalvik/system/InMemoryDexClassLoader;
-Ldalvik/system/PathClassLoader;
-Ldalvik/system/RuntimeHooks;
-Ldalvik/system/SocketTagger$1;
-Ldalvik/system/SocketTagger;
-Ldalvik/system/VMDebug;
-Ldalvik/system/VMRuntime$HiddenApiUsageLogger;
-Ldalvik/system/VMRuntime$SdkVersionContainer;
-Ldalvik/system/VMRuntime;
-Ldalvik/system/VMStack;
-Ldalvik/system/ZipPathValidator$1;
-Ldalvik/system/ZipPathValidator$Callback;
-Ldalvik/system/ZipPathValidator;
-Ldalvik/system/ZygoteHooks;
-Lgov/nist/core/Debug;
-Lgov/nist/core/DuplicateNameValueList;
-Lgov/nist/core/GenericObject;
-Lgov/nist/core/GenericObjectList;
-Lgov/nist/core/Host;
-Lgov/nist/core/HostNameParser;
-Lgov/nist/core/HostPort;
-Lgov/nist/core/InternalErrorHandler;
-Lgov/nist/core/LexerCore;
-Lgov/nist/core/LogLevels;
-Lgov/nist/core/LogWriter;
-Lgov/nist/core/Match;
-Lgov/nist/core/MultiValueMap;
-Lgov/nist/core/MultiValueMapImpl;
-Lgov/nist/core/NameValue;
-Lgov/nist/core/NameValueList;
-Lgov/nist/core/PackageNames;
-Lgov/nist/core/ParserCore;
-Lgov/nist/core/Separators;
-Lgov/nist/core/ServerLogger;
-Lgov/nist/core/StackLogger;
-Lgov/nist/core/StringTokenizer;
-Lgov/nist/core/ThreadAuditor$ThreadHandle;
-Lgov/nist/core/ThreadAuditor;
-Lgov/nist/core/Token;
-Lgov/nist/core/net/AddressResolver;
-Lgov/nist/core/net/DefaultNetworkLayer;
-Lgov/nist/core/net/NetworkLayer;
-Lgov/nist/core/net/SslNetworkLayer;
-Lgov/nist/javax/sip/ClientTransactionExt;
-Lgov/nist/javax/sip/DefaultAddressResolver;
-Lgov/nist/javax/sip/DialogExt;
-Lgov/nist/javax/sip/DialogFilter;
-Lgov/nist/javax/sip/DialogTimeoutEvent$Reason;
-Lgov/nist/javax/sip/DialogTimeoutEvent;
-Lgov/nist/javax/sip/EventScanner;
-Lgov/nist/javax/sip/EventWrapper;
-Lgov/nist/javax/sip/ListeningPointExt;
-Lgov/nist/javax/sip/ListeningPointImpl;
-Lgov/nist/javax/sip/LogRecord;
-Lgov/nist/javax/sip/LogRecordFactory;
-Lgov/nist/javax/sip/NistSipMessageFactoryImpl;
-Lgov/nist/javax/sip/ResponseEventExt;
-Lgov/nist/javax/sip/SIPConstants;
-Lgov/nist/javax/sip/ServerTransactionExt;
-Lgov/nist/javax/sip/SipListenerExt;
-Lgov/nist/javax/sip/SipProviderExt;
-Lgov/nist/javax/sip/SipProviderImpl;
-Lgov/nist/javax/sip/SipStackExt;
-Lgov/nist/javax/sip/SipStackImpl;
-Lgov/nist/javax/sip/TransactionExt;
-Lgov/nist/javax/sip/Utils;
-Lgov/nist/javax/sip/UtilsExt;
-Lgov/nist/javax/sip/address/AddressFactoryImpl;
-Lgov/nist/javax/sip/address/AddressImpl;
-Lgov/nist/javax/sip/address/Authority;
-Lgov/nist/javax/sip/address/GenericURI;
-Lgov/nist/javax/sip/address/NetObject;
-Lgov/nist/javax/sip/address/NetObjectList;
-Lgov/nist/javax/sip/address/ParameterNames;
-Lgov/nist/javax/sip/address/RFC2396UrlDecoder;
-Lgov/nist/javax/sip/address/RouterExt;
-Lgov/nist/javax/sip/address/SipURIExt;
-Lgov/nist/javax/sip/address/SipUri;
-Lgov/nist/javax/sip/address/TelURLImpl;
-Lgov/nist/javax/sip/address/TelephoneNumber;
-Lgov/nist/javax/sip/address/UserInfo;
-Lgov/nist/javax/sip/clientauthutils/AccountManager;
-Lgov/nist/javax/sip/clientauthutils/AuthenticationHelper;
-Lgov/nist/javax/sip/clientauthutils/AuthenticationHelperImpl;
-Lgov/nist/javax/sip/clientauthutils/CredentialsCache$TimeoutTask;
-Lgov/nist/javax/sip/clientauthutils/CredentialsCache;
-Lgov/nist/javax/sip/clientauthutils/MessageDigestAlgorithm;
-Lgov/nist/javax/sip/clientauthutils/SecureAccountManager;
-Lgov/nist/javax/sip/clientauthutils/UserCredentialHash;
-Lgov/nist/javax/sip/clientauthutils/UserCredentials;
-Lgov/nist/javax/sip/header/Accept;
-Lgov/nist/javax/sip/header/AcceptEncoding;
-Lgov/nist/javax/sip/header/AcceptEncodingList;
-Lgov/nist/javax/sip/header/AcceptLanguage;
-Lgov/nist/javax/sip/header/AcceptLanguageList;
-Lgov/nist/javax/sip/header/AcceptList;
-Lgov/nist/javax/sip/header/AddressParameters;
-Lgov/nist/javax/sip/header/AddressParametersHeader;
-Lgov/nist/javax/sip/header/AlertInfo;
-Lgov/nist/javax/sip/header/AlertInfoList;
-Lgov/nist/javax/sip/header/Allow;
-Lgov/nist/javax/sip/header/AllowEvents;
-Lgov/nist/javax/sip/header/AllowEventsList;
-Lgov/nist/javax/sip/header/AllowList;
-Lgov/nist/javax/sip/header/AuthenticationHeader;
-Lgov/nist/javax/sip/header/AuthenticationInfo;
-Lgov/nist/javax/sip/header/AuthenticationInfoList;
-Lgov/nist/javax/sip/header/Authorization;
-Lgov/nist/javax/sip/header/AuthorizationList;
-Lgov/nist/javax/sip/header/CSeq;
-Lgov/nist/javax/sip/header/CallID;
-Lgov/nist/javax/sip/header/CallIdentifier;
-Lgov/nist/javax/sip/header/CallInfo;
-Lgov/nist/javax/sip/header/CallInfoList;
-Lgov/nist/javax/sip/header/Challenge;
-Lgov/nist/javax/sip/header/Contact;
-Lgov/nist/javax/sip/header/ContactList;
-Lgov/nist/javax/sip/header/ContentDisposition;
-Lgov/nist/javax/sip/header/ContentEncoding;
-Lgov/nist/javax/sip/header/ContentEncodingList;
-Lgov/nist/javax/sip/header/ContentLanguage;
-Lgov/nist/javax/sip/header/ContentLanguageList;
-Lgov/nist/javax/sip/header/ContentLength;
-Lgov/nist/javax/sip/header/ContentType;
-Lgov/nist/javax/sip/header/Credentials;
-Lgov/nist/javax/sip/header/ErrorInfo;
-Lgov/nist/javax/sip/header/ErrorInfoList;
-Lgov/nist/javax/sip/header/Event;
-Lgov/nist/javax/sip/header/Expires;
-Lgov/nist/javax/sip/header/ExtensionHeaderImpl;
-Lgov/nist/javax/sip/header/ExtensionHeaderList;
-Lgov/nist/javax/sip/header/From;
-Lgov/nist/javax/sip/header/HeaderExt;
-Lgov/nist/javax/sip/header/HeaderFactoryExt;
-Lgov/nist/javax/sip/header/HeaderFactoryImpl;
-Lgov/nist/javax/sip/header/InReplyTo;
-Lgov/nist/javax/sip/header/InReplyToList;
-Lgov/nist/javax/sip/header/Indentation;
-Lgov/nist/javax/sip/header/MaxForwards;
-Lgov/nist/javax/sip/header/MediaRange;
-Lgov/nist/javax/sip/header/MimeVersion;
-Lgov/nist/javax/sip/header/MinExpires;
-Lgov/nist/javax/sip/header/NameMap;
-Lgov/nist/javax/sip/header/Organization;
-Lgov/nist/javax/sip/header/ParameterNames;
-Lgov/nist/javax/sip/header/ParametersHeader;
-Lgov/nist/javax/sip/header/Priority;
-Lgov/nist/javax/sip/header/Protocol;
-Lgov/nist/javax/sip/header/ProxyAuthenticate;
-Lgov/nist/javax/sip/header/ProxyAuthenticateList;
-Lgov/nist/javax/sip/header/ProxyAuthorization;
-Lgov/nist/javax/sip/header/ProxyAuthorizationList;
-Lgov/nist/javax/sip/header/ProxyRequire;
-Lgov/nist/javax/sip/header/ProxyRequireList;
-Lgov/nist/javax/sip/header/RAck;
-Lgov/nist/javax/sip/header/RSeq;
-Lgov/nist/javax/sip/header/Reason;
-Lgov/nist/javax/sip/header/ReasonList;
-Lgov/nist/javax/sip/header/RecordRoute;
-Lgov/nist/javax/sip/header/RecordRouteList;
-Lgov/nist/javax/sip/header/ReferTo;
-Lgov/nist/javax/sip/header/ReplyTo;
-Lgov/nist/javax/sip/header/RequestLine;
-Lgov/nist/javax/sip/header/Require;
-Lgov/nist/javax/sip/header/RequireList;
-Lgov/nist/javax/sip/header/RetryAfter;
-Lgov/nist/javax/sip/header/Route;
-Lgov/nist/javax/sip/header/RouteList;
-Lgov/nist/javax/sip/header/SIPDate;
-Lgov/nist/javax/sip/header/SIPDateHeader;
-Lgov/nist/javax/sip/header/SIPETag;
-Lgov/nist/javax/sip/header/SIPHeader;
-Lgov/nist/javax/sip/header/SIPHeaderList;
-Lgov/nist/javax/sip/header/SIPHeaderNames;
-Lgov/nist/javax/sip/header/SIPHeaderNamesCache;
-Lgov/nist/javax/sip/header/SIPIfMatch;
-Lgov/nist/javax/sip/header/SIPObject;
-Lgov/nist/javax/sip/header/SIPObjectList;
-Lgov/nist/javax/sip/header/Server;
-Lgov/nist/javax/sip/header/SipRequestLine;
-Lgov/nist/javax/sip/header/SipStatusLine;
-Lgov/nist/javax/sip/header/StatusLine;
-Lgov/nist/javax/sip/header/Subject;
-Lgov/nist/javax/sip/header/SubscriptionState;
-Lgov/nist/javax/sip/header/Supported;
-Lgov/nist/javax/sip/header/SupportedList;
-Lgov/nist/javax/sip/header/TimeStamp;
-Lgov/nist/javax/sip/header/To;
-Lgov/nist/javax/sip/header/Unsupported;
-Lgov/nist/javax/sip/header/UnsupportedList;
-Lgov/nist/javax/sip/header/UserAgent;
-Lgov/nist/javax/sip/header/Via;
-Lgov/nist/javax/sip/header/ViaHeaderExt;
-Lgov/nist/javax/sip/header/ViaList;
-Lgov/nist/javax/sip/header/WWWAuthenticate;
-Lgov/nist/javax/sip/header/WWWAuthenticateList;
-Lgov/nist/javax/sip/header/Warning;
-Lgov/nist/javax/sip/header/WarningList;
-Lgov/nist/javax/sip/header/extensions/Join;
-Lgov/nist/javax/sip/header/extensions/JoinHeader;
-Lgov/nist/javax/sip/header/extensions/MinSE;
-Lgov/nist/javax/sip/header/extensions/MinSEHeader;
-Lgov/nist/javax/sip/header/extensions/References;
-Lgov/nist/javax/sip/header/extensions/ReferencesHeader;
-Lgov/nist/javax/sip/header/extensions/ReferredBy;
-Lgov/nist/javax/sip/header/extensions/ReferredByHeader;
-Lgov/nist/javax/sip/header/extensions/Replaces;
-Lgov/nist/javax/sip/header/extensions/ReplacesHeader;
-Lgov/nist/javax/sip/header/extensions/SessionExpires;
-Lgov/nist/javax/sip/header/extensions/SessionExpiresHeader;
-Lgov/nist/javax/sip/header/ims/AddressHeaderIms;
-Lgov/nist/javax/sip/header/ims/AuthorizationHeaderIms;
-Lgov/nist/javax/sip/header/ims/PAccessNetworkInfo;
-Lgov/nist/javax/sip/header/ims/PAccessNetworkInfoHeader;
-Lgov/nist/javax/sip/header/ims/PAssertedIdentity;
-Lgov/nist/javax/sip/header/ims/PAssertedIdentityHeader;
-Lgov/nist/javax/sip/header/ims/PAssertedIdentityList;
-Lgov/nist/javax/sip/header/ims/PAssertedService;
-Lgov/nist/javax/sip/header/ims/PAssertedServiceHeader;
-Lgov/nist/javax/sip/header/ims/PAssociatedURI;
-Lgov/nist/javax/sip/header/ims/PAssociatedURIHeader;
-Lgov/nist/javax/sip/header/ims/PAssociatedURIList;
-Lgov/nist/javax/sip/header/ims/PCalledPartyID;
-Lgov/nist/javax/sip/header/ims/PCalledPartyIDHeader;
-Lgov/nist/javax/sip/header/ims/PChargingFunctionAddresses;
-Lgov/nist/javax/sip/header/ims/PChargingFunctionAddressesHeader;
-Lgov/nist/javax/sip/header/ims/PChargingVector;
-Lgov/nist/javax/sip/header/ims/PChargingVectorHeader;
-Lgov/nist/javax/sip/header/ims/PMediaAuthorization;
-Lgov/nist/javax/sip/header/ims/PMediaAuthorizationHeader;
-Lgov/nist/javax/sip/header/ims/PMediaAuthorizationList;
-Lgov/nist/javax/sip/header/ims/PPreferredIdentity;
-Lgov/nist/javax/sip/header/ims/PPreferredIdentityHeader;
-Lgov/nist/javax/sip/header/ims/PPreferredService;
-Lgov/nist/javax/sip/header/ims/PPreferredServiceHeader;
-Lgov/nist/javax/sip/header/ims/PProfileKey;
-Lgov/nist/javax/sip/header/ims/PProfileKeyHeader;
-Lgov/nist/javax/sip/header/ims/PServedUser;
-Lgov/nist/javax/sip/header/ims/PServedUserHeader;
-Lgov/nist/javax/sip/header/ims/PUserDatabase;
-Lgov/nist/javax/sip/header/ims/PUserDatabaseHeader;
-Lgov/nist/javax/sip/header/ims/PVisitedNetworkID;
-Lgov/nist/javax/sip/header/ims/PVisitedNetworkIDHeader;
-Lgov/nist/javax/sip/header/ims/PVisitedNetworkIDList;
-Lgov/nist/javax/sip/header/ims/ParameterNamesIms;
-Lgov/nist/javax/sip/header/ims/Path;
-Lgov/nist/javax/sip/header/ims/PathHeader;
-Lgov/nist/javax/sip/header/ims/PathList;
-Lgov/nist/javax/sip/header/ims/Privacy;
-Lgov/nist/javax/sip/header/ims/PrivacyHeader;
-Lgov/nist/javax/sip/header/ims/PrivacyList;
-Lgov/nist/javax/sip/header/ims/SIPHeaderNamesIms;
-Lgov/nist/javax/sip/header/ims/SecurityAgree;
-Lgov/nist/javax/sip/header/ims/SecurityAgreeHeader;
-Lgov/nist/javax/sip/header/ims/SecurityClient;
-Lgov/nist/javax/sip/header/ims/SecurityClientHeader;
-Lgov/nist/javax/sip/header/ims/SecurityClientList;
-Lgov/nist/javax/sip/header/ims/SecurityServer;
-Lgov/nist/javax/sip/header/ims/SecurityServerHeader;
-Lgov/nist/javax/sip/header/ims/SecurityServerList;
-Lgov/nist/javax/sip/header/ims/SecurityVerify;
-Lgov/nist/javax/sip/header/ims/SecurityVerifyHeader;
-Lgov/nist/javax/sip/header/ims/SecurityVerifyList;
-Lgov/nist/javax/sip/header/ims/ServiceRoute;
-Lgov/nist/javax/sip/header/ims/ServiceRouteHeader;
-Lgov/nist/javax/sip/header/ims/ServiceRouteList;
-Lgov/nist/javax/sip/header/ims/WWWAuthenticateHeaderIms;
-Lgov/nist/javax/sip/message/Content;
-Lgov/nist/javax/sip/message/ContentImpl;
-Lgov/nist/javax/sip/message/HeaderIterator;
-Lgov/nist/javax/sip/message/ListMap;
-Lgov/nist/javax/sip/message/MessageExt;
-Lgov/nist/javax/sip/message/MessageFactoryExt;
-Lgov/nist/javax/sip/message/MessageFactoryImpl$1;
-Lgov/nist/javax/sip/message/MessageFactoryImpl;
-Lgov/nist/javax/sip/message/MessageObject;
-Lgov/nist/javax/sip/message/MultipartMimeContent;
-Lgov/nist/javax/sip/message/MultipartMimeContentImpl;
-Lgov/nist/javax/sip/message/RequestExt;
-Lgov/nist/javax/sip/message/ResponseExt;
-Lgov/nist/javax/sip/message/SIPDuplicateHeaderException;
-Lgov/nist/javax/sip/message/SIPMessage;
-Lgov/nist/javax/sip/message/SIPRequest;
-Lgov/nist/javax/sip/message/SIPResponse;
-Lgov/nist/javax/sip/parser/AcceptEncodingParser;
-Lgov/nist/javax/sip/parser/AcceptLanguageParser;
-Lgov/nist/javax/sip/parser/AcceptParser;
-Lgov/nist/javax/sip/parser/AddressParametersParser;
-Lgov/nist/javax/sip/parser/AddressParser;
-Lgov/nist/javax/sip/parser/AlertInfoParser;
-Lgov/nist/javax/sip/parser/AllowEventsParser;
-Lgov/nist/javax/sip/parser/AllowParser;
-Lgov/nist/javax/sip/parser/AuthenticationInfoParser;
-Lgov/nist/javax/sip/parser/AuthorizationParser;
-Lgov/nist/javax/sip/parser/CSeqParser;
-Lgov/nist/javax/sip/parser/CallIDParser;
-Lgov/nist/javax/sip/parser/CallInfoParser;
-Lgov/nist/javax/sip/parser/ChallengeParser;
-Lgov/nist/javax/sip/parser/ContactParser;
-Lgov/nist/javax/sip/parser/ContentDispositionParser;
-Lgov/nist/javax/sip/parser/ContentEncodingParser;
-Lgov/nist/javax/sip/parser/ContentLanguageParser;
-Lgov/nist/javax/sip/parser/ContentLengthParser;
-Lgov/nist/javax/sip/parser/ContentTypeParser;
-Lgov/nist/javax/sip/parser/DateParser;
-Lgov/nist/javax/sip/parser/ErrorInfoParser;
-Lgov/nist/javax/sip/parser/EventParser;
-Lgov/nist/javax/sip/parser/ExpiresParser;
-Lgov/nist/javax/sip/parser/FromParser;
-Lgov/nist/javax/sip/parser/HeaderParser;
-Lgov/nist/javax/sip/parser/InReplyToParser;
-Lgov/nist/javax/sip/parser/Lexer;
-Lgov/nist/javax/sip/parser/MaxForwardsParser;
-Lgov/nist/javax/sip/parser/MimeVersionParser;
-Lgov/nist/javax/sip/parser/MinExpiresParser;
-Lgov/nist/javax/sip/parser/OrganizationParser;
-Lgov/nist/javax/sip/parser/ParametersParser;
-Lgov/nist/javax/sip/parser/ParseExceptionListener;
-Lgov/nist/javax/sip/parser/Parser;
-Lgov/nist/javax/sip/parser/ParserFactory;
-Lgov/nist/javax/sip/parser/Pipeline$Buffer;
-Lgov/nist/javax/sip/parser/Pipeline$MyTimer;
-Lgov/nist/javax/sip/parser/Pipeline;
-Lgov/nist/javax/sip/parser/PipelinedMsgParser;
-Lgov/nist/javax/sip/parser/PriorityParser;
-Lgov/nist/javax/sip/parser/ProxyAuthenticateParser;
-Lgov/nist/javax/sip/parser/ProxyAuthorizationParser;
-Lgov/nist/javax/sip/parser/ProxyRequireParser;
-Lgov/nist/javax/sip/parser/RAckParser;
-Lgov/nist/javax/sip/parser/RSeqParser;
-Lgov/nist/javax/sip/parser/ReasonParser;
-Lgov/nist/javax/sip/parser/RecordRouteParser;
-Lgov/nist/javax/sip/parser/ReferToParser;
-Lgov/nist/javax/sip/parser/ReplyToParser;
-Lgov/nist/javax/sip/parser/RequestLineParser;
-Lgov/nist/javax/sip/parser/RequireParser;
-Lgov/nist/javax/sip/parser/RetryAfterParser;
-Lgov/nist/javax/sip/parser/RouteParser;
-Lgov/nist/javax/sip/parser/SIPETagParser;
-Lgov/nist/javax/sip/parser/SIPIfMatchParser;
-Lgov/nist/javax/sip/parser/SIPMessageListener;
-Lgov/nist/javax/sip/parser/ServerParser;
-Lgov/nist/javax/sip/parser/StatusLineParser;
-Lgov/nist/javax/sip/parser/StringMsgParser$1ParserThread;
-Lgov/nist/javax/sip/parser/StringMsgParser;
-Lgov/nist/javax/sip/parser/SubjectParser;
-Lgov/nist/javax/sip/parser/SubscriptionStateParser;
-Lgov/nist/javax/sip/parser/SupportedParser;
-Lgov/nist/javax/sip/parser/TimeStampParser;
-Lgov/nist/javax/sip/parser/ToParser;
-Lgov/nist/javax/sip/parser/TokenNames;
-Lgov/nist/javax/sip/parser/TokenTypes;
-Lgov/nist/javax/sip/parser/URLParser;
-Lgov/nist/javax/sip/parser/UnsupportedParser;
-Lgov/nist/javax/sip/parser/UserAgentParser;
-Lgov/nist/javax/sip/parser/ViaParser;
-Lgov/nist/javax/sip/parser/WWWAuthenticateParser;
-Lgov/nist/javax/sip/parser/WarningParser;
-Lgov/nist/javax/sip/parser/extensions/JoinParser;
-Lgov/nist/javax/sip/parser/extensions/MinSEParser;
-Lgov/nist/javax/sip/parser/extensions/ReferencesParser;
-Lgov/nist/javax/sip/parser/extensions/ReferredByParser;
-Lgov/nist/javax/sip/parser/extensions/ReplacesParser;
-Lgov/nist/javax/sip/parser/extensions/SessionExpiresParser;
-Lgov/nist/javax/sip/parser/ims/AddressHeaderParser;
-Lgov/nist/javax/sip/parser/ims/PAccessNetworkInfoParser;
-Lgov/nist/javax/sip/parser/ims/PAssertedIdentityParser;
-Lgov/nist/javax/sip/parser/ims/PAssertedServiceParser;
-Lgov/nist/javax/sip/parser/ims/PAssociatedURIParser;
-Lgov/nist/javax/sip/parser/ims/PCalledPartyIDParser;
-Lgov/nist/javax/sip/parser/ims/PChargingFunctionAddressesParser;
-Lgov/nist/javax/sip/parser/ims/PChargingVectorParser;
-Lgov/nist/javax/sip/parser/ims/PMediaAuthorizationParser;
-Lgov/nist/javax/sip/parser/ims/PPreferredIdentityParser;
-Lgov/nist/javax/sip/parser/ims/PPreferredServiceParser;
-Lgov/nist/javax/sip/parser/ims/PProfileKeyParser;
-Lgov/nist/javax/sip/parser/ims/PServedUserParser;
-Lgov/nist/javax/sip/parser/ims/PUserDatabaseParser;
-Lgov/nist/javax/sip/parser/ims/PVisitedNetworkIDParser;
-Lgov/nist/javax/sip/parser/ims/PathParser;
-Lgov/nist/javax/sip/parser/ims/PrivacyParser;
-Lgov/nist/javax/sip/parser/ims/SecurityAgreeParser;
-Lgov/nist/javax/sip/parser/ims/SecurityClientParser;
-Lgov/nist/javax/sip/parser/ims/SecurityServerParser;
-Lgov/nist/javax/sip/parser/ims/SecurityVerifyParser;
-Lgov/nist/javax/sip/parser/ims/ServiceRouteParser;
-Lgov/nist/javax/sip/parser/ims/TokenNamesIms;
-Lgov/nist/javax/sip/stack/DefaultMessageLogFactory;
-Lgov/nist/javax/sip/stack/DefaultRouter;
-Lgov/nist/javax/sip/stack/HandshakeCompletedListenerImpl;
-Lgov/nist/javax/sip/stack/HopImpl;
-Lgov/nist/javax/sip/stack/IOHandler;
-Lgov/nist/javax/sip/stack/MessageChannel;
-Lgov/nist/javax/sip/stack/MessageLog;
-Lgov/nist/javax/sip/stack/MessageProcessor;
-Lgov/nist/javax/sip/stack/RawMessageChannel;
-Lgov/nist/javax/sip/stack/SIPClientTransaction$TransactionTimer;
-Lgov/nist/javax/sip/stack/SIPClientTransaction;
-Lgov/nist/javax/sip/stack/SIPDialog$DialogDeleteIfNoAckSentTask;
-Lgov/nist/javax/sip/stack/SIPDialog$DialogDeleteTask;
-Lgov/nist/javax/sip/stack/SIPDialog$DialogTimerTask;
-Lgov/nist/javax/sip/stack/SIPDialog$LingerTimer;
-Lgov/nist/javax/sip/stack/SIPDialog$ReInviteSender;
-Lgov/nist/javax/sip/stack/SIPDialog;
-Lgov/nist/javax/sip/stack/SIPDialogErrorEvent;
-Lgov/nist/javax/sip/stack/SIPDialogEventListener;
-Lgov/nist/javax/sip/stack/SIPServerTransaction$ListenerExecutionMaxTimer;
-Lgov/nist/javax/sip/stack/SIPServerTransaction$ProvisionalResponseTask;
-Lgov/nist/javax/sip/stack/SIPServerTransaction$RetransmissionAlertTimerTask;
-Lgov/nist/javax/sip/stack/SIPServerTransaction$SendTrying;
-Lgov/nist/javax/sip/stack/SIPServerTransaction$TransactionTimer;
-Lgov/nist/javax/sip/stack/SIPServerTransaction;
-Lgov/nist/javax/sip/stack/SIPStackTimerTask;
-Lgov/nist/javax/sip/stack/SIPTransaction$LingerTimer;
-Lgov/nist/javax/sip/stack/SIPTransaction;
-Lgov/nist/javax/sip/stack/SIPTransactionErrorEvent;
-Lgov/nist/javax/sip/stack/SIPTransactionEventListener;
-Lgov/nist/javax/sip/stack/SIPTransactionStack$PingTimer;
-Lgov/nist/javax/sip/stack/SIPTransactionStack$RemoveForkedTransactionTimerTask;
-Lgov/nist/javax/sip/stack/SIPTransactionStack;
-Lgov/nist/javax/sip/stack/ServerLog;
-Lgov/nist/javax/sip/stack/ServerRequestInterface;
-Lgov/nist/javax/sip/stack/ServerResponseInterface;
-Lgov/nist/javax/sip/stack/StackMessageFactory;
-Lgov/nist/javax/sip/stack/TCPMessageChannel$1;
-Lgov/nist/javax/sip/stack/TCPMessageChannel;
-Lgov/nist/javax/sip/stack/TCPMessageProcessor;
-Lgov/nist/javax/sip/stack/TLSMessageChannel;
-Lgov/nist/javax/sip/stack/TLSMessageProcessor;
-Lgov/nist/javax/sip/stack/UDPMessageChannel$PingBackTimerTask;
-Lgov/nist/javax/sip/stack/UDPMessageChannel;
-Lgov/nist/javax/sip/stack/UDPMessageProcessor;
-Ljava/awt/font/NumericShaper;
-Ljava/awt/font/TextAttribute;
-Ljava/io/Bits;
-Ljava/io/BufferedInputStream;
-Ljava/io/BufferedReader;
-Ljava/io/BufferedWriter;
-Ljava/io/ByteArrayInputStream;
-Ljava/io/ByteArrayOutputStream;
-Ljava/io/CharArrayReader;
-Ljava/io/CharArrayWriter;
-Ljava/io/CharConversionException;
-Ljava/io/Closeable;
-Ljava/io/Console;
-Ljava/io/DataInput;
-Ljava/io/DataInputStream;
-Ljava/io/DataOutput;
-Ljava/io/DataOutputStream;
-Ljava/io/DefaultFileSystem;
-Ljava/io/EOFException;
-Ljava/io/ExpiringCache$1;
-Ljava/io/ExpiringCache;
-Ljava/io/Externalizable;
-Ljava/io/File$PathStatus;
-Ljava/io/File$TempDirectory;
-Ljava/io/File;
-Ljava/io/FileDescriptor$1;
-Ljava/io/FileDescriptor;
-Ljava/io/FileFilter;
-Ljava/io/FileInputStream$UseManualSkipException;
-Ljava/io/FileInputStream;
-Ljava/io/FileNotFoundException;
-Ljava/io/FileOutputStream;
-Ljava/io/FileReader;
-Ljava/io/FileSystem;
-Ljava/io/FileWriter;
-Ljava/io/FilenameFilter;
-Ljava/io/FilterInputStream;
-Ljava/io/FilterOutputStream;
-Ljava/io/FilterReader;
-Ljava/io/Flushable;
-Ljava/io/IOException;
-Ljava/io/InputStream;
-Ljava/io/InputStreamReader;
-Ljava/io/InterruptedIOException;
-Ljava/io/InvalidClassException;
-Ljava/io/InvalidObjectException;
-Ljava/io/LineNumberReader;
-Ljava/io/NotActiveException;
-Ljava/io/NotSerializableException;
-Ljava/io/ObjectInput;
-Ljava/io/ObjectInputStream$$ExternalSyntheticLambda0;
-Ljava/io/ObjectInputStream$1;
-Ljava/io/ObjectInputStream$BlockDataInputStream;
-Ljava/io/ObjectInputStream$Caches;
-Ljava/io/ObjectInputStream$GetField;
-Ljava/io/ObjectInputStream$GetFieldImpl;
-Ljava/io/ObjectInputStream$HandleTable$HandleList;
-Ljava/io/ObjectInputStream$HandleTable;
-Ljava/io/ObjectInputStream$PeekInputStream;
-Ljava/io/ObjectInputStream$ValidationList$1;
-Ljava/io/ObjectInputStream$ValidationList$Callback;
-Ljava/io/ObjectInputStream$ValidationList;
-Ljava/io/ObjectInputStream;
-Ljava/io/ObjectOutput;
-Ljava/io/ObjectOutputStream$1;
-Ljava/io/ObjectOutputStream$Caches;
-Ljava/io/ObjectOutputStream$DebugTraceInfoStack;
-Ljava/io/ObjectOutputStream$HandleTable;
-Ljava/io/ObjectOutputStream$PutField;
-Ljava/io/ObjectOutputStream$PutFieldImpl;
-Ljava/io/ObjectOutputStream$ReplaceTable;
-Ljava/io/ObjectStreamClass$$ExternalSyntheticLambda0;
-Ljava/io/ObjectStreamClass$$ExternalSyntheticLambda1;
-Ljava/io/ObjectStreamClass$$ExternalSyntheticLambda2;
-Ljava/io/ObjectStreamClass$$ExternalSyntheticLambda3;
-Ljava/io/ObjectStreamClass$1;
-Ljava/io/ObjectStreamClass$2;
-Ljava/io/ObjectStreamClass$3;
-Ljava/io/ObjectStreamClass$4;
-Ljava/io/ObjectStreamClass$5;
-Ljava/io/ObjectStreamClass$Caches;
-Ljava/io/ObjectStreamClass$ClassDataSlot;
-Ljava/io/ObjectStreamClass$DefaultSUIDCompatibilityListener;
-Ljava/io/ObjectStreamClass$DeserializationConstructorsCache;
-Ljava/io/ObjectStreamClass$EntryFuture$1;
-Ljava/io/ObjectStreamClass$EntryFuture-IA;
-Ljava/io/ObjectStreamClass$EntryFuture;
-Ljava/io/ObjectStreamClass$ExceptionInfo;
-Ljava/io/ObjectStreamClass$FieldReflector;
-Ljava/io/ObjectStreamClass$FieldReflectorKey;
-Ljava/io/ObjectStreamClass$MemberSignature;
-Ljava/io/ObjectStreamClass$WeakClassKey;
-Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectStreamConstants;
-Ljava/io/ObjectStreamException;
-Ljava/io/ObjectStreamField;
-Ljava/io/OptionalDataException;
-Ljava/io/OutputStream;
-Ljava/io/OutputStreamWriter;
-Ljava/io/PipedInputStream;
-Ljava/io/PipedOutputStream;
-Ljava/io/PrintStream;
-Ljava/io/PrintWriter;
-Ljava/io/PushbackInputStream;
-Ljava/io/PushbackReader;
-Ljava/io/RandomAccessFile;
-Ljava/io/Reader;
-Ljava/io/SequenceInputStream;
-Ljava/io/SerialCallbackContext;
-Ljava/io/Serializable;
-Ljava/io/SerializablePermission;
-Ljava/io/StreamCorruptedException;
-Ljava/io/StringBufferInputStream;
-Ljava/io/StringReader;
-Ljava/io/StringWriter;
-Ljava/io/SyncFailedException;
-Ljava/io/UTFDataFormatException;
-Ljava/io/UncheckedIOException;
-Ljava/io/UnsupportedEncodingException;
-Ljava/io/WriteAbortedException;
-Ljava/io/Writer;
-Ljava/lang/AbstractMethodError;
-Ljava/lang/AbstractStringBuilder$$ExternalSyntheticLambda0;
-Ljava/lang/AbstractStringBuilder$$ExternalSyntheticLambda1;
-Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AndroidHardcodedSystemProperties;
-Ljava/lang/Appendable;
-Ljava/lang/ArithmeticException;
-Ljava/lang/ArrayIndexOutOfBoundsException;
-Ljava/lang/ArrayStoreException;
-Ljava/lang/AssertionError;
-Ljava/lang/AutoCloseable;
-Ljava/lang/Boolean;
-Ljava/lang/BootClassLoader;
-Ljava/lang/Byte$ByteCache;
-Ljava/lang/Byte;
-Ljava/lang/CaseMapper$1;
-Ljava/lang/CaseMapper;
-Ljava/lang/CharSequence$$ExternalSyntheticLambda0;
-Ljava/lang/CharSequence$$ExternalSyntheticLambda1;
-Ljava/lang/CharSequence$1CharIterator;
-Ljava/lang/CharSequence$1CodePointIterator;
-Ljava/lang/CharSequence;
-Ljava/lang/Character$CharacterCache;
-Ljava/lang/Character$Subset;
-Ljava/lang/Character$UnicodeBlock;
-Ljava/lang/Character;
-Ljava/lang/Class$$ExternalSyntheticLambda0;
-Ljava/lang/Class$$ExternalSyntheticLambda1;
-Ljava/lang/Class$Caches;
-Ljava/lang/Class;
-Ljava/lang/ClassCastException;
-Ljava/lang/ClassFormatError;
-Ljava/lang/ClassLoader$$ExternalSyntheticLambda0;
-Ljava/lang/ClassLoader$$ExternalSyntheticLambda1;
-Ljava/lang/ClassLoader$$ExternalSyntheticLambda2;
-Ljava/lang/ClassLoader$SystemClassLoader;
-Ljava/lang/ClassLoader;
-Ljava/lang/ClassNotFoundException;
-Ljava/lang/ClassValue$Entry;
-Ljava/lang/ClassValue;
-Ljava/lang/CloneNotSupportedException;
-Ljava/lang/Cloneable;
-Ljava/lang/Comparable;
-Ljava/lang/CompoundEnumeration;
-Ljava/lang/Daemons$Daemon;
-Ljava/lang/Daemons$FinalizerDaemon;
-Ljava/lang/Daemons$FinalizerWatchdogDaemon;
-Ljava/lang/Daemons$HeapTaskDaemon;
-Ljava/lang/Daemons$ReferenceQueueDaemon;
-Ljava/lang/Daemons;
-Ljava/lang/Deprecated;
-Ljava/lang/DexCache;
-Ljava/lang/Double;
-Ljava/lang/Enum$$ExternalSyntheticLambda0;
-Ljava/lang/Enum$1;
-Ljava/lang/Enum$EnumDesc;
-Ljava/lang/Enum;
-Ljava/lang/EnumConstantNotPresentException;
-Ljava/lang/Error;
-Ljava/lang/Exception;
-Ljava/lang/ExceptionInInitializerError;
-Ljava/lang/Float;
-Ljava/lang/IllegalAccessError;
-Ljava/lang/IllegalAccessException;
-Ljava/lang/IllegalArgumentException;
-Ljava/lang/IllegalMonitorStateException;
-Ljava/lang/IllegalStateException;
-Ljava/lang/IllegalThreadStateException;
-Ljava/lang/IncompatibleClassChangeError;
-Ljava/lang/IndexOutOfBoundsException;
-Ljava/lang/InheritableThreadLocal;
-Ljava/lang/InstantiationError;
-Ljava/lang/InstantiationException;
-Ljava/lang/Integer$IntegerCache;
-Ljava/lang/Integer;
-Ljava/lang/InternalError;
-Ljava/lang/InterruptedException;
-Ljava/lang/Iterable;
-Ljava/lang/LinkageError;
-Ljava/lang/Long$LongCache;
-Ljava/lang/Long;
-Ljava/lang/Math$RandomNumberGeneratorHolder;
-Ljava/lang/Math;
-Ljava/lang/NegativeArraySizeException;
-Ljava/lang/NoClassDefFoundError;
-Ljava/lang/NoSuchFieldError;
-Ljava/lang/NoSuchFieldException;
-Ljava/lang/NoSuchMethodError;
-Ljava/lang/NoSuchMethodException;
-Ljava/lang/NullPointerException;
-Ljava/lang/Number;
-Ljava/lang/NumberFormatException;
-Ljava/lang/Object;
-Ljava/lang/OutOfMemoryError;
-Ljava/lang/Package;
-Ljava/lang/Process;
-Ljava/lang/ProcessBuilder$NullInputStream;
-Ljava/lang/ProcessBuilder$NullOutputStream;
-Ljava/lang/ProcessBuilder$Redirect$1;
-Ljava/lang/ProcessBuilder$Redirect$2;
-Ljava/lang/ProcessBuilder$Redirect;
-Ljava/lang/ProcessBuilder;
-Ljava/lang/ProcessEnvironment$ExternalData;
-Ljava/lang/ProcessEnvironment$StringEnvironment;
-Ljava/lang/ProcessEnvironment$Value;
-Ljava/lang/ProcessEnvironment$Variable;
-Ljava/lang/ProcessEnvironment;
-Ljava/lang/ProcessImpl;
-Ljava/lang/Readable;
-Ljava/lang/Record;
-Ljava/lang/ReflectiveOperationException;
-Ljava/lang/Runnable;
-Ljava/lang/Runtime;
-Ljava/lang/RuntimeException;
-Ljava/lang/RuntimePermission;
-Ljava/lang/SecurityException;
-Ljava/lang/SecurityManager;
-Ljava/lang/Short$ShortCache;
-Ljava/lang/Short;
-Ljava/lang/StackFrameInfo;
-Ljava/lang/StackOverflowError;
-Ljava/lang/StackStreamFactory$AbstractStackWalker;
-Ljava/lang/StackStreamFactory;
-Ljava/lang/StackTraceElement;
-Ljava/lang/StackWalker$Option;
-Ljava/lang/StackWalker$StackFrame;
-Ljava/lang/StackWalker;
-Ljava/lang/StrictMath;
-Ljava/lang/String$$ExternalSyntheticLambda0;
-Ljava/lang/String$$ExternalSyntheticLambda1;
-Ljava/lang/String$$ExternalSyntheticLambda2;
-Ljava/lang/String$$ExternalSyntheticLambda3;
-Ljava/lang/String$CaseInsensitiveComparator-IA;
-Ljava/lang/String;
-Ljava/lang/StringBuffer;
-Ljava/lang/StringBuilder;
-Ljava/lang/StringFactory;
-Ljava/lang/StringIndexOutOfBoundsException;
-Ljava/lang/StringLatin1$CharsSpliterator;
-Ljava/lang/StringLatin1$LinesSpliterator;
-Ljava/lang/StringLatin1;
-Ljava/lang/StringUTF16$CharsSpliterator;
-Ljava/lang/StringUTF16$CharsSpliteratorForString;
-Ljava/lang/StringUTF16$CodePointsSpliterator;
-Ljava/lang/StringUTF16$CodePointsSpliteratorForString;
-Ljava/lang/StringUTF16;
-Ljava/lang/System$PropertiesWithNonOverrideableDefaults;
-Ljava/lang/System;
-Ljava/lang/Thread$1;
-Ljava/lang/Thread$Caches;
-Ljava/lang/Thread$State;
-Ljava/lang/Thread$UncaughtExceptionHandler;
-Ljava/lang/Thread$WeakClassKey;
-Ljava/lang/Thread;
-Ljava/lang/ThreadDeath;
-Ljava/lang/ThreadGroup;
-Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
-Ljava/lang/ThreadLocal$ThreadLocalMap-IA;
-Ljava/lang/ThreadLocal$ThreadLocalMap;
-Ljava/lang/Throwable$PrintStreamOrWriter-IA;
-Ljava/lang/Throwable$PrintStreamOrWriter;
-Ljava/lang/Throwable$SentinelHolder;
-Ljava/lang/Throwable$WrappedPrintStream;
-Ljava/lang/Throwable$WrappedPrintWriter;
-Ljava/lang/Throwable;
-Ljava/lang/TypeNotPresentException;
-Ljava/lang/UNIXProcess$1;
-Ljava/lang/UNIXProcess$2;
-Ljava/lang/UNIXProcess$3;
-Ljava/lang/UNIXProcess$ProcessPipeInputStream;
-Ljava/lang/UNIXProcess$ProcessPipeOutputStream;
-Ljava/lang/UNIXProcess$ProcessReaperThreadFactory$1;
-Ljava/lang/UNIXProcess$ProcessReaperThreadFactory;
-Ljava/lang/UNIXProcess;
-Ljava/lang/UnsatisfiedLinkError;
-Ljava/lang/UnsupportedClassVersionError;
-Ljava/lang/UnsupportedOperationException;
-Ljava/lang/VMClassLoader;
-Ljava/lang/VerifyError;
-Ljava/lang/VirtualMachineError;
-Ljava/lang/Void;
-Ljava/lang/annotation/Annotation;
-Ljava/lang/annotation/AnnotationTypeMismatchException;
-Ljava/lang/annotation/Documented;
-Ljava/lang/annotation/IncompleteAnnotationException;
-Ljava/lang/annotation/Inherited;
-Ljava/lang/annotation/Retention;
-Ljava/lang/annotation/Target;
-Ljava/lang/constant/ClassDesc;
-Ljava/lang/constant/Constable;
-Ljava/lang/constant/ConstantDesc;
-Ljava/lang/constant/ConstantDescs;
-Ljava/lang/constant/ConstantUtils;
-Ljava/lang/constant/DirectMethodHandleDesc$Kind;
-Ljava/lang/constant/DirectMethodHandleDesc;
-Ljava/lang/constant/DirectMethodHandleDescImpl$1;
-Ljava/lang/constant/DirectMethodHandleDescImpl;
-Ljava/lang/constant/DynamicConstantDesc$AnonymousDynamicConstantDesc;
-Ljava/lang/constant/DynamicConstantDesc;
-Ljava/lang/constant/MethodHandleDesc$1;
-Ljava/lang/constant/MethodHandleDesc;
-Ljava/lang/constant/MethodTypeDesc;
-Ljava/lang/constant/MethodTypeDescImpl;
-Ljava/lang/constant/PrimitiveClassDescImpl;
-Ljava/lang/constant/ReferenceClassDescImpl;
-Ljava/lang/invoke/ArrayElementVarHandle;
-Ljava/lang/invoke/ByteArrayViewVarHandle;
-Ljava/lang/invoke/ByteBufferViewVarHandle;
-Ljava/lang/invoke/CallSite;
-Ljava/lang/invoke/ConstantCallSite;
-Ljava/lang/invoke/FieldVarHandle;
-Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandleImpl$HandleInfo;
-Ljava/lang/invoke/MethodHandleImpl;
-Ljava/lang/invoke/MethodHandleInfo;
-Ljava/lang/invoke/MethodHandleStatics;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda0;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda10;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda11;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda12;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda13;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda14;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda15;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda16;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda17;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda18;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda19;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda1;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda20;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda21;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda22;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda23;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda24;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda25;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda2;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda3;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda4;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda5;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda6;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda7;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda8;
-Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda9;
-Ljava/lang/invoke/MethodHandles$Lookup;
-Ljava/lang/invoke/MethodHandles;
-Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry;
-Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet;
-Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodTypeForm;
-Ljava/lang/invoke/SerializedLambda;
-Ljava/lang/invoke/StaticFieldVarHandle;
-Ljava/lang/invoke/Transformers$AlwaysThrow;
-Ljava/lang/invoke/Transformers$ArrayConstructor;
-Ljava/lang/invoke/Transformers$ArrayLength;
-Ljava/lang/invoke/Transformers$AsTypeAdapter;
-Ljava/lang/invoke/Transformers$BindTo;
-Ljava/lang/invoke/Transformers$CatchException;
-Ljava/lang/invoke/Transformers$CollectArguments;
-Ljava/lang/invoke/Transformers$Collector;
-Ljava/lang/invoke/Transformers$Construct;
-Ljava/lang/invoke/Transformers$DropArguments;
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;
-Ljava/lang/invoke/Transformers$FilterArguments;
-Ljava/lang/invoke/Transformers$FilterReturnValue;
-Ljava/lang/invoke/Transformers$FoldArguments;
-Ljava/lang/invoke/Transformers$GuardWithTest;
-Ljava/lang/invoke/Transformers$InsertArguments;
-Ljava/lang/invoke/Transformers$Invoker;
-Ljava/lang/invoke/Transformers$Loop;
-Ljava/lang/invoke/Transformers$PermuteArguments;
-Ljava/lang/invoke/Transformers$ReferenceArrayElementGetter;
-Ljava/lang/invoke/Transformers$ReferenceArrayElementSetter;
-Ljava/lang/invoke/Transformers$ReferenceIdentity;
-Ljava/lang/invoke/Transformers$Spreader;
-Ljava/lang/invoke/Transformers$TableSwitch;
-Ljava/lang/invoke/Transformers$Transformer;
-Ljava/lang/invoke/Transformers$TryFinally;
-Ljava/lang/invoke/Transformers$VarargsCollector;
-Ljava/lang/invoke/Transformers$ZeroValue;
-Ljava/lang/invoke/TypeDescriptor$OfField;
-Ljava/lang/invoke/TypeDescriptor$OfMethod;
-Ljava/lang/invoke/TypeDescriptor;
-Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessType;
-Ljava/lang/invoke/VarHandle$VarHandleDesc$Kind;
-Ljava/lang/invoke/VarHandle;
-Ljava/lang/invoke/WrongMethodTypeException;
-Ljava/lang/ref/Cleaner$1;
-Ljava/lang/ref/Cleaner$Cleanable;
-Ljava/lang/ref/Cleaner;
-Ljava/lang/ref/FinalizerReference$Sentinel-IA;
-Ljava/lang/ref/FinalizerReference$Sentinel;
-Ljava/lang/ref/FinalizerReference;
-Ljava/lang/ref/PhantomReference;
-Ljava/lang/ref/Reference$SinkHolder$1;
-Ljava/lang/ref/Reference$SinkHolder;
-Ljava/lang/ref/Reference;
-Ljava/lang/ref/ReferenceQueue;
-Ljava/lang/ref/SoftReference;
-Ljava/lang/ref/WeakReference;
-Ljava/lang/reflect/AccessibleObject;
-Ljava/lang/reflect/AnnotatedElement;
-Ljava/lang/reflect/Array;
-Ljava/lang/reflect/Constructor;
-Ljava/lang/reflect/Executable$GenericInfo;
-Ljava/lang/reflect/Executable;
-Ljava/lang/reflect/Field;
-Ljava/lang/reflect/GenericArrayType;
-Ljava/lang/reflect/GenericDeclaration;
-Ljava/lang/reflect/GenericSignatureFormatError;
-Ljava/lang/reflect/InvocationHandler;
-Ljava/lang/reflect/InvocationTargetException;
-Ljava/lang/reflect/MalformedParametersException;
-Ljava/lang/reflect/Member;
-Ljava/lang/reflect/Method$1;
-Ljava/lang/reflect/Method;
-Ljava/lang/reflect/Modifier;
-Ljava/lang/reflect/Parameter;
-Ljava/lang/reflect/ParameterizedType;
-Ljava/lang/reflect/Proxy$1;
-Ljava/lang/reflect/Proxy$Key1;
-Ljava/lang/reflect/Proxy$Key2;
-Ljava/lang/reflect/Proxy$KeyFactory-IA;
-Ljava/lang/reflect/Proxy$KeyFactory;
-Ljava/lang/reflect/Proxy$KeyX;
-Ljava/lang/reflect/Proxy$ProxyClassFactory-IA;
-Ljava/lang/reflect/Proxy$ProxyClassFactory;
-Ljava/lang/reflect/Proxy;
-Ljava/lang/reflect/RecordComponent;
-Ljava/lang/reflect/ReflectPermission;
-Ljava/lang/reflect/Type;
-Ljava/lang/reflect/TypeVariable;
-Ljava/lang/reflect/UndeclaredThrowableException;
-Ljava/lang/reflect/WeakCache$CacheKey;
-Ljava/lang/reflect/WeakCache$CacheValue;
-Ljava/lang/reflect/WeakCache$Factory;
-Ljava/lang/reflect/WeakCache$LookupValue;
-Ljava/lang/reflect/WeakCache$Value;
-Ljava/lang/reflect/WeakCache;
-Ljava/lang/reflect/WildcardType;
-Ljava/math/BigDecimal$1;
-Ljava/math/BigDecimal$LongOverflow;
-Ljava/math/BigDecimal$StringBuilderHelper;
-Ljava/math/BigDecimal;
-Ljava/math/BigInteger$UnsafeHolder;
-Ljava/math/BigInteger;
-Ljava/math/MathContext;
-Ljava/math/MutableBigInteger;
-Ljava/math/RoundingMode;
-Ljava/net/AbstractPlainDatagramSocketImpl;
-Ljava/net/AbstractPlainSocketImpl;
-Ljava/net/AddressCache$AddressCacheEntry;
-Ljava/net/AddressCache$AddressCacheKey;
-Ljava/net/AddressCache;
-Ljava/net/Authenticator$RequestorType;
-Ljava/net/Authenticator;
-Ljava/net/BindException;
-Ljava/net/ConnectException;
-Ljava/net/CookieHandler;
-Ljava/net/CookieManager$CookiePathComparator;
-Ljava/net/CookieManager;
-Ljava/net/CookiePolicy$1;
-Ljava/net/CookiePolicy$2;
-Ljava/net/CookiePolicy$3;
-Ljava/net/CookiePolicy;
-Ljava/net/CookieStore;
-Ljava/net/DatagramPacket;
-Ljava/net/DatagramSocket$1;
-Ljava/net/DatagramSocket;
-Ljava/net/DatagramSocketImpl;
-Ljava/net/DatagramSocketImplFactory;
-Ljava/net/DefaultDatagramSocketImplFactory;
-Ljava/net/DefaultInterface;
-Ljava/net/HttpCookie$10;
-Ljava/net/HttpCookie$11;
-Ljava/net/HttpCookie$1;
-Ljava/net/HttpCookie$2;
-Ljava/net/HttpCookie$3;
-Ljava/net/HttpCookie$4;
-Ljava/net/HttpCookie$5;
-Ljava/net/HttpCookie$6;
-Ljava/net/HttpCookie$7;
-Ljava/net/HttpCookie$8;
-Ljava/net/HttpCookie$9;
-Ljava/net/HttpCookie$CookieAttributeAssignor;
-Ljava/net/HttpCookie;
-Ljava/net/HttpRetryException;
-Ljava/net/HttpURLConnection;
-Ljava/net/IDN;
-Ljava/net/InMemoryCookieStore;
-Ljava/net/Inet4Address;
-Ljava/net/Inet6Address$Inet6AddressHolder-IA;
-Ljava/net/Inet6Address$Inet6AddressHolder;
-Ljava/net/Inet6Address;
-Ljava/net/InetAddress$1;
-Ljava/net/InetAddress;
-Ljava/net/InetAddressImpl;
-Ljava/net/InetSocketAddress$InetSocketAddressHolder-IA;
-Ljava/net/InetSocketAddress$InetSocketAddressHolder;
-Ljava/net/InetSocketAddress;
-Ljava/net/InterfaceAddress;
-Ljava/net/JarURLConnection;
-Ljava/net/MalformedURLException;
-Ljava/net/MulticastSocket;
-Ljava/net/NetPermission;
-Ljava/net/NetworkInterface$1checkedAddresses;
-Ljava/net/NetworkInterface;
-Ljava/net/NoRouteToHostException;
-Ljava/net/Parts;
-Ljava/net/PasswordAuthentication;
-Ljava/net/PlainDatagramSocketImpl;
-Ljava/net/PlainSocketImpl;
-Ljava/net/PortUnreachableException;
-Ljava/net/ProtocolException;
-Ljava/net/ProtocolFamily;
-Ljava/net/Proxy$Type;
-Ljava/net/Proxy;
-Ljava/net/ProxySelector;
-Ljava/net/ResponseCache;
-Ljava/net/ServerSocket$1;
-Ljava/net/ServerSocket;
-Ljava/net/Socket$1;
-Ljava/net/Socket$2;
-Ljava/net/Socket$3;
-Ljava/net/Socket;
-Ljava/net/SocketAddress;
-Ljava/net/SocketException;
-Ljava/net/SocketImpl;
-Ljava/net/SocketImplFactory;
-Ljava/net/SocketOption;
-Ljava/net/SocketOptions;
-Ljava/net/SocketPermission;
-Ljava/net/SocketTimeoutException;
-Ljava/net/SocksConsts;
-Ljava/net/SocksSocketImpl;
-Ljava/net/StandardProtocolFamily;
-Ljava/net/StandardSocketOptions$StdSocketOption;
-Ljava/net/StandardSocketOptions;
-Ljava/net/URI$Parser;
-Ljava/net/URI;
-Ljava/net/URISyntaxException;
-Ljava/net/URL;
-Ljava/net/URLConnection;
-Ljava/net/URLDecoder;
-Ljava/net/URLEncoder;
-Ljava/net/URLStreamHandler;
-Ljava/net/URLStreamHandlerFactory;
-Ljava/net/UnknownHostException;
-Ljava/net/UnknownServiceException;
-Ljava/nio/Bits;
-Ljava/nio/Buffer;
-Ljava/nio/BufferMismatch;
-Ljava/nio/BufferOverflowException;
-Ljava/nio/BufferUnderflowException;
-Ljava/nio/ByteBuffer;
-Ljava/nio/ByteBufferAsCharBuffer;
-Ljava/nio/ByteBufferAsDoubleBuffer;
-Ljava/nio/ByteBufferAsLongBuffer;
-Ljava/nio/ByteBufferAsShortBuffer;
-Ljava/nio/ByteOrder;
-Ljava/nio/CharBuffer;
-Ljava/nio/DirectByteBuffer$MemoryRef;
-Ljava/nio/DoubleBuffer;
-Ljava/nio/FloatBuffer;
-Ljava/nio/HeapIntBuffer;
-Ljava/nio/IntBuffer;
-Ljava/nio/InvalidMarkException;
-Ljava/nio/LongBuffer;
-Ljava/nio/MappedByteBuffer;
-Ljava/nio/NIOAccess;
-Ljava/nio/NioUtils;
-Ljava/nio/ReadOnlyBufferException;
-Ljava/nio/ShortBuffer;
-Ljava/nio/StringCharBuffer;
-Ljava/nio/channels/AlreadyConnectedException;
-Ljava/nio/channels/AsynchronousChannel;
-Ljava/nio/channels/AsynchronousCloseException;
-Ljava/nio/channels/AsynchronousFileChannel;
-Ljava/nio/channels/ByteChannel;
-Ljava/nio/channels/CancelledKeyException;
-Ljava/nio/channels/Channel;
-Ljava/nio/channels/Channels$1;
-Ljava/nio/channels/Channels$WritableByteChannelImpl;
-Ljava/nio/channels/Channels;
-Ljava/nio/channels/ClosedByInterruptException;
-Ljava/nio/channels/ClosedChannelException;
-Ljava/nio/channels/ClosedSelectorException;
-Ljava/nio/channels/ConnectionPendingException;
-Ljava/nio/channels/DatagramChannel;
-Ljava/nio/channels/FileChannel$MapMode;
-Ljava/nio/channels/FileChannel;
-Ljava/nio/channels/FileLock;
-Ljava/nio/channels/FileLockInterruptionException;
-Ljava/nio/channels/GatheringByteChannel;
-Ljava/nio/channels/IllegalBlockingModeException;
-Ljava/nio/channels/IllegalSelectorException;
-Ljava/nio/channels/InterruptibleChannel;
-Ljava/nio/channels/MulticastChannel;
-Ljava/nio/channels/NetworkChannel;
-Ljava/nio/channels/NoConnectionPendingException;
-Ljava/nio/channels/NonReadableChannelException;
-Ljava/nio/channels/NonWritableChannelException;
-Ljava/nio/channels/OverlappingFileLockException;
-Ljava/nio/channels/ReadableByteChannel;
-Ljava/nio/channels/ScatteringByteChannel;
-Ljava/nio/channels/SeekableByteChannel;
-Ljava/nio/channels/SelectableChannel;
-Ljava/nio/channels/SelectionKey;
-Ljava/nio/channels/Selector;
-Ljava/nio/channels/ServerSocketChannel;
-Ljava/nio/channels/SocketChannel;
-Ljava/nio/channels/UnresolvedAddressException;
-Ljava/nio/channels/UnsupportedAddressTypeException;
-Ljava/nio/channels/WritableByteChannel;
-Ljava/nio/channels/spi/AbstractInterruptibleChannel$1;
-Ljava/nio/channels/spi/AbstractInterruptibleChannel;
-Ljava/nio/channels/spi/AbstractSelectableChannel;
-Ljava/nio/channels/spi/AbstractSelectionKey;
-Ljava/nio/channels/spi/AbstractSelector$1;
-Ljava/nio/channels/spi/AbstractSelector;
-Ljava/nio/channels/spi/AsynchronousChannelProvider;
-Ljava/nio/channels/spi/SelectorProvider$1;
-Ljava/nio/channels/spi/SelectorProvider;
-Ljava/nio/charset/CharacterCodingException;
-Ljava/nio/charset/Charset;
-Ljava/nio/charset/CharsetDecoder;
-Ljava/nio/charset/CharsetEncoder;
-Ljava/nio/charset/CoderMalfunctionError;
-Ljava/nio/charset/CoderResult$Cache;
-Ljava/nio/charset/CoderResult;
-Ljava/nio/charset/CodingErrorAction;
-Ljava/nio/charset/IllegalCharsetNameException;
-Ljava/nio/charset/StandardCharsets;
-Ljava/nio/charset/UnsupportedCharsetException;
-Ljava/nio/charset/spi/CharsetProvider;
-Ljava/nio/file/AccessDeniedException;
-Ljava/nio/file/AccessMode;
-Ljava/nio/file/CopyMoveHelper;
-Ljava/nio/file/CopyOption;
-Ljava/nio/file/DirectoryIteratorException;
-Ljava/nio/file/DirectoryStream$Filter;
-Ljava/nio/file/DirectoryStream;
-Ljava/nio/file/FileAlreadyExistsException;
-Ljava/nio/file/FileSystem;
-Ljava/nio/file/FileSystemException;
-Ljava/nio/file/FileSystems$DefaultFileSystemHolder$1;
-Ljava/nio/file/FileSystems$DefaultFileSystemHolder;
-Ljava/nio/file/FileSystems;
-Ljava/nio/file/FileVisitResult;
-Ljava/nio/file/FileVisitor;
-Ljava/nio/file/Files$AcceptAllFilter;
-Ljava/nio/file/Files;
-Ljava/nio/file/InvalidPathException;
-Ljava/nio/file/LinkOption;
-Ljava/nio/file/NoSuchFileException;
-Ljava/nio/file/NotDirectoryException;
-Ljava/nio/file/OpenOption;
-Ljava/nio/file/Path;
-Ljava/nio/file/Paths;
-Ljava/nio/file/ProviderMismatchException;
-Ljava/nio/file/SecureDirectoryStream;
-Ljava/nio/file/SimpleFileVisitor;
-Ljava/nio/file/StandardCopyOption;
-Ljava/nio/file/StandardOpenOption;
-Ljava/nio/file/Watchable;
-Ljava/nio/file/attribute/AttributeView;
-Ljava/nio/file/attribute/BasicFileAttributeView;
-Ljava/nio/file/attribute/BasicFileAttributes;
-Ljava/nio/file/attribute/FileAttribute;
-Ljava/nio/file/attribute/FileAttributeView;
-Ljava/nio/file/attribute/FileOwnerAttributeView;
-Ljava/nio/file/attribute/FileTime;
-Ljava/nio/file/attribute/PosixFileAttributeView;
-Ljava/nio/file/attribute/PosixFileAttributes;
-Ljava/nio/file/spi/FileSystemProvider;
-Ljava/security/AccessControlContext;
-Ljava/security/AccessControlException;
-Ljava/security/AccessController;
-Ljava/security/AlgorithmConstraints;
-Ljava/security/AlgorithmParameters;
-Ljava/security/AlgorithmParametersSpi;
-Ljava/security/AllPermission;
-Ljava/security/BasicPermission;
-Ljava/security/CodeSigner;
-Ljava/security/CodeSource;
-Ljava/security/CryptoPrimitive;
-Ljava/security/DigestException;
-Ljava/security/DigestInputStream;
-Ljava/security/GeneralSecurityException;
-Ljava/security/Guard;
-Ljava/security/InvalidAlgorithmParameterException;
-Ljava/security/InvalidKeyException;
-Ljava/security/InvalidParameterException;
-Ljava/security/Key;
-Ljava/security/KeyException;
-Ljava/security/KeyFactory;
-Ljava/security/KeyFactorySpi;
-Ljava/security/KeyManagementException;
-Ljava/security/KeyPair;
-Ljava/security/KeyPairGenerator$Delegate;
-Ljava/security/KeyPairGenerator;
-Ljava/security/KeyPairGeneratorSpi;
-Ljava/security/KeyStore$1;
-Ljava/security/KeyStore$CallbackHandlerProtection;
-Ljava/security/KeyStore$Entry;
-Ljava/security/KeyStore$LoadStoreParameter;
-Ljava/security/KeyStore$PasswordProtection;
-Ljava/security/KeyStore$PrivateKeyEntry;
-Ljava/security/KeyStore$ProtectionParameter;
-Ljava/security/KeyStore$SecretKeyEntry;
-Ljava/security/KeyStore$SimpleLoadStoreParameter;
-Ljava/security/KeyStore$TrustedCertificateEntry;
-Ljava/security/KeyStore;
-Ljava/security/KeyStoreException;
-Ljava/security/KeyStoreSpi;
-Ljava/security/MessageDigest;
-Ljava/security/MessageDigestSpi;
-Ljava/security/NoSuchAlgorithmException;
-Ljava/security/NoSuchProviderException;
-Ljava/security/Permission;
-Ljava/security/PermissionCollection;
-Ljava/security/Permissions;
-Ljava/security/Principal;
-Ljava/security/PrivateKey;
-Ljava/security/PrivilegedAction;
-Ljava/security/PrivilegedActionException;
-Ljava/security/PrivilegedExceptionAction;
-Ljava/security/ProtectionDomain;
-Ljava/security/Provider$EngineDescription;
-Ljava/security/Provider$Service-IA;
-Ljava/security/Provider$Service;
-Ljava/security/Provider$ServiceKey-IA;
-Ljava/security/Provider$ServiceKey;
-Ljava/security/Provider$UString;
-Ljava/security/Provider;
-Ljava/security/ProviderException;
-Ljava/security/PublicKey;
-Ljava/security/SecureRandom;
-Ljava/security/SecureRandomParameters;
-Ljava/security/SecureRandomSpi;
-Ljava/security/Security$1;
-Ljava/security/Security;
-Ljava/security/SecurityPermission;
-Ljava/security/Signature$CipherAdapter;
-Ljava/security/Signature;
-Ljava/security/SignatureException;
-Ljava/security/SignatureSpi;
-Ljava/security/Timestamp;
-Ljava/security/UnrecoverableEntryException;
-Ljava/security/UnrecoverableKeyException;
-Ljava/security/cert/CRL;
-Ljava/security/cert/CRLException;
-Ljava/security/cert/CRLReason;
-Ljava/security/cert/CertPath;
-Ljava/security/cert/CertPathBuilderException;
-Ljava/security/cert/CertPathChecker;
-Ljava/security/cert/CertPathHelperImpl;
-Ljava/security/cert/CertPathParameters;
-Ljava/security/cert/CertPathValidator;
-Ljava/security/cert/CertPathValidatorException$BasicReason;
-Ljava/security/cert/CertPathValidatorException$Reason;
-Ljava/security/cert/CertPathValidatorException;
-Ljava/security/cert/CertPathValidatorResult;
-Ljava/security/cert/CertPathValidatorSpi;
-Ljava/security/cert/CertSelector;
-Ljava/security/cert/CertStore;
-Ljava/security/cert/CertStoreException;
-Ljava/security/cert/CertStoreParameters;
-Ljava/security/cert/CertStoreSpi;
-Ljava/security/cert/Certificate;
-Ljava/security/cert/CertificateEncodingException;
-Ljava/security/cert/CertificateException;
-Ljava/security/cert/CertificateExpiredException;
-Ljava/security/cert/CertificateFactory;
-Ljava/security/cert/CertificateFactorySpi;
-Ljava/security/cert/CertificateNotYetValidException;
-Ljava/security/cert/CertificateParsingException;
-Ljava/security/cert/CertificateRevokedException;
-Ljava/security/cert/CollectionCertStoreParameters;
-Ljava/security/cert/Extension;
-Ljava/security/cert/PKIXCertPathChecker;
-Ljava/security/cert/PKIXCertPathValidatorResult;
-Ljava/security/cert/PKIXParameters;
-Ljava/security/cert/PKIXReason;
-Ljava/security/cert/PKIXRevocationChecker$Option;
-Ljava/security/cert/PKIXRevocationChecker;
-Ljava/security/cert/PolicyNode;
-Ljava/security/cert/PolicyQualifierInfo;
-Ljava/security/cert/TrustAnchor;
-Ljava/security/cert/X509CRL;
-Ljava/security/cert/X509CRLEntry;
-Ljava/security/cert/X509CertSelector;
-Ljava/security/cert/X509Certificate;
-Ljava/security/cert/X509Extension;
-Ljava/security/interfaces/DSAKey;
-Ljava/security/interfaces/DSAParams;
-Ljava/security/interfaces/DSAPublicKey;
-Ljava/security/interfaces/ECKey;
-Ljava/security/interfaces/ECPrivateKey;
-Ljava/security/interfaces/ECPublicKey;
-Ljava/security/interfaces/RSAKey;
-Ljava/security/interfaces/RSAPrivateCrtKey;
-Ljava/security/interfaces/RSAPrivateKey;
-Ljava/security/interfaces/RSAPublicKey;
-Ljava/security/spec/AlgorithmParameterSpec;
-Ljava/security/spec/DSAParameterSpec;
-Ljava/security/spec/DSAPublicKeySpec;
-Ljava/security/spec/ECField;
-Ljava/security/spec/ECFieldF2m;
-Ljava/security/spec/ECFieldFp;
-Ljava/security/spec/ECGenParameterSpec;
-Ljava/security/spec/ECParameterSpec;
-Ljava/security/spec/ECPoint;
-Ljava/security/spec/ECPrivateKeySpec;
-Ljava/security/spec/ECPublicKeySpec;
-Ljava/security/spec/EllipticCurve;
-Ljava/security/spec/EncodedKeySpec;
-Ljava/security/spec/InvalidKeySpecException;
-Ljava/security/spec/InvalidParameterSpecException;
-Ljava/security/spec/KeySpec;
-Ljava/security/spec/MGF1ParameterSpec;
-Ljava/security/spec/NamedParameterSpec;
-Ljava/security/spec/PKCS8EncodedKeySpec;
-Ljava/security/spec/PSSParameterSpec;
-Ljava/security/spec/RSAKeyGenParameterSpec;
-Ljava/security/spec/RSAPrivateCrtKeySpec;
-Ljava/security/spec/RSAPrivateKeySpec;
-Ljava/security/spec/RSAPublicKeySpec;
-Ljava/security/spec/X509EncodedKeySpec;
-Ljava/sql/Date;
-Ljava/sql/SQLException;
-Ljava/sql/Time;
-Ljava/sql/Timestamp;
-Ljava/text/AttributedCharacterIterator$Attribute;
-Ljava/text/AttributedCharacterIterator;
-Ljava/text/AttributedString;
-Ljava/text/Bidi;
-Ljava/text/BreakIterator;
-Ljava/text/CalendarBuilder;
-Ljava/text/CharacterIterator;
-Ljava/text/CharacterIteratorFieldDelegate;
-Ljava/text/ChoiceFormat;
-Ljava/text/CollationElementIterator;
-Ljava/text/CollationKey;
-Ljava/text/Collator;
-Ljava/text/DateFormat$Field;
-Ljava/text/DateFormat;
-Ljava/text/DateFormatSymbols;
-Ljava/text/DecimalFormat$1;
-Ljava/text/DecimalFormat;
-Ljava/text/DecimalFormatSymbols;
-Ljava/text/DontCareFieldPosition$1;
-Ljava/text/DontCareFieldPosition;
-Ljava/text/FieldPosition$Delegate-IA;
-Ljava/text/FieldPosition$Delegate;
-Ljava/text/FieldPosition;
-Ljava/text/Format$Field;
-Ljava/text/Format$FieldDelegate;
-Ljava/text/Format;
-Ljava/text/IcuIteratorWrapper;
-Ljava/text/MessageFormat$Field;
-Ljava/text/MessageFormat;
-Ljava/text/Normalizer$Form$$ExternalSyntheticLambda0;
-Ljava/text/Normalizer$Form$$ExternalSyntheticLambda1;
-Ljava/text/Normalizer$Form$$ExternalSyntheticLambda2;
-Ljava/text/Normalizer$Form$$ExternalSyntheticLambda3;
-Ljava/text/Normalizer$Form;
-Ljava/text/Normalizer;
-Ljava/text/NumberFormat$Field;
-Ljava/text/NumberFormat$Style;
-Ljava/text/NumberFormat;
-Ljava/text/ParseException;
-Ljava/text/ParsePosition;
-Ljava/text/RuleBasedCollator;
-Ljava/text/SimpleDateFormat;
-Ljava/text/StringCharacterIterator;
-Ljava/time/Clock;
-Ljava/time/DateTimeException;
-Ljava/time/DayOfWeek;
-Ljava/time/Duration;
-Ljava/time/Instant$1;
-Ljava/time/Instant;
-Ljava/time/InstantSource;
-Ljava/time/LocalDate$1;
-Ljava/time/LocalDate;
-Ljava/time/LocalDateTime;
-Ljava/time/LocalTime$1;
-Ljava/time/LocalTime;
-Ljava/time/Month;
-Ljava/time/OffsetDateTime;
-Ljava/time/Period;
-Ljava/time/Year;
-Ljava/time/ZoneId;
-Ljava/time/ZoneOffset;
-Ljava/time/ZonedDateTime$$ExternalSyntheticLambda0;
-Ljava/time/ZonedDateTime$1;
-Ljava/time/ZonedDateTime;
-Ljava/time/chrono/AbstractChronology;
-Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/ChronoLocalDateTime;
-Ljava/time/chrono/ChronoPeriod;
-Ljava/time/chrono/ChronoZonedDateTime;
-Ljava/time/chrono/Chronology;
-Ljava/time/chrono/IsoChronology;
-Ljava/time/format/DateTimeFormatter$$ExternalSyntheticLambda0;
-Ljava/time/format/DateTimeFormatter$$ExternalSyntheticLambda1;
-Ljava/time/format/DateTimeFormatter;
-Ljava/time/format/DateTimeFormatterBuilder$$ExternalSyntheticLambda0;
-Ljava/time/format/DateTimeFormatterBuilder$1;
-Ljava/time/format/DateTimeFormatterBuilder$2;
-Ljava/time/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$DateTimePrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$DayPeriod$$ExternalSyntheticLambda0;
-Ljava/time/format/DateTimeFormatterBuilder$DayPeriod;
-Ljava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$InstantPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$PadPrinterParserDecorator;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$CI-IA;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$CI;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree-IA;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;
-Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;
-Ljava/time/format/DateTimeFormatterBuilder$StringLiteralPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$TextPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder;
-Ljava/time/format/DateTimeParseContext;
-Ljava/time/format/DateTimeParseException;
-Ljava/time/format/DateTimePrintContext$1;
-Ljava/time/format/DateTimePrintContext;
-Ljava/time/format/DateTimeTextProvider$1;
-Ljava/time/format/DateTimeTextProvider$LocaleStore;
-Ljava/time/format/DateTimeTextProvider;
-Ljava/time/format/DecimalStyle;
-Ljava/time/format/Parsed;
-Ljava/time/format/ResolverStyle;
-Ljava/time/format/SignStyle;
-Ljava/time/format/TextStyle;
-Ljava/time/temporal/ChronoField;
-Ljava/time/temporal/ChronoUnit;
-Ljava/time/temporal/IsoFields$Field$1;
-Ljava/time/temporal/IsoFields$Field$2;
-Ljava/time/temporal/IsoFields$Field$3;
-Ljava/time/temporal/IsoFields$Field$4;
-Ljava/time/temporal/IsoFields$Field;
-Ljava/time/temporal/IsoFields$Unit;
-Ljava/time/temporal/IsoFields;
-Ljava/time/temporal/JulianFields$Field;
-Ljava/time/temporal/JulianFields;
-Ljava/time/temporal/Temporal;
-Ljava/time/temporal/TemporalAccessor;
-Ljava/time/temporal/TemporalAdjuster;
-Ljava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda11;
-Ljava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda1;
-Ljava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda3;
-Ljava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda6;
-Ljava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda8;
-Ljava/time/temporal/TemporalAdjusters;
-Ljava/time/temporal/TemporalAmount;
-Ljava/time/temporal/TemporalField;
-Ljava/time/temporal/TemporalQueries$1;
-Ljava/time/temporal/TemporalQueries$2;
-Ljava/time/temporal/TemporalQueries$3;
-Ljava/time/temporal/TemporalQueries$4;
-Ljava/time/temporal/TemporalQueries$5;
-Ljava/time/temporal/TemporalQueries$6;
-Ljava/time/temporal/TemporalQueries$7;
-Ljava/time/temporal/TemporalQueries;
-Ljava/time/temporal/TemporalQuery;
-Ljava/time/temporal/TemporalUnit;
-Ljava/time/temporal/UnsupportedTemporalTypeException;
-Ljava/time/temporal/ValueRange;
-Ljava/time/zone/IcuZoneRulesProvider$ZoneRulesCache;
-Ljava/time/zone/IcuZoneRulesProvider;
-Ljava/time/zone/ZoneOffsetTransition;
-Ljava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;
-Ljava/time/zone/ZoneOffsetTransitionRule;
-Ljava/time/zone/ZoneRules;
-Ljava/time/zone/ZoneRulesException;
-Ljava/time/zone/ZoneRulesProvider;
-Ljava/util/AbstractCollection;
-Ljava/util/AbstractList$Itr-IA;
-Ljava/util/AbstractList$ListItr;
-Ljava/util/AbstractList$RandomAccessSpliterator;
-Ljava/util/AbstractList$RandomAccessSubList;
-Ljava/util/AbstractList$SubList$1;
-Ljava/util/AbstractList$SubList;
-Ljava/util/AbstractList;
-Ljava/util/AbstractMap$1;
-Ljava/util/AbstractMap$2$1;
-Ljava/util/AbstractMap$SimpleEntry;
-Ljava/util/AbstractMap$SimpleImmutableEntry;
-Ljava/util/AbstractMap$ViewCollection;
-Ljava/util/AbstractMap;
-Ljava/util/AbstractQueue;
-Ljava/util/AbstractSequentialList;
-Ljava/util/AbstractSet;
-Ljava/util/ArrayDeque$$ExternalSyntheticLambda1;
-Ljava/util/ArrayDeque;
-Ljava/util/ArrayList$ArrayListSpliterator;
-Ljava/util/ArrayList$ListItr;
-Ljava/util/ArrayList$SubList$2;
-Ljava/util/ArrayList;
-Ljava/util/ArrayPrefixHelpers$CumulateTask;
-Ljava/util/ArrayPrefixHelpers$DoubleCumulateTask;
-Ljava/util/ArrayPrefixHelpers$IntCumulateTask;
-Ljava/util/ArrayPrefixHelpers$LongCumulateTask;
-Ljava/util/Arrays$$ExternalSyntheticLambda0;
-Ljava/util/Arrays$$ExternalSyntheticLambda1;
-Ljava/util/Arrays$$ExternalSyntheticLambda2;
-Ljava/util/Arrays$$ExternalSyntheticLambda3;
-Ljava/util/Arrays$NaturalOrder;
-Ljava/util/Arrays;
-Ljava/util/ArraysParallelSortHelpers$FJObject$Sorter;
-Ljava/util/Base64$Decoder;
-Ljava/util/Base64$Encoder;
-Ljava/util/Base64;
-Ljava/util/BitSet;
-Ljava/util/Calendar$$ExternalSyntheticLambda0;
-Ljava/util/Calendar$Builder;
-Ljava/util/Calendar;
-Ljava/util/Collection;
-Ljava/util/Collections$2;
-Ljava/util/Collections$3;
-Ljava/util/Collections$AsLIFOQueue;
-Ljava/util/Collections$CheckedCollection;
-Ljava/util/Collections$CheckedList;
-Ljava/util/Collections$CheckedMap;
-Ljava/util/Collections$CheckedNavigableMap;
-Ljava/util/Collections$CheckedNavigableSet;
-Ljava/util/Collections$CheckedQueue;
-Ljava/util/Collections$CheckedRandomAccessList;
-Ljava/util/Collections$CheckedSet;
-Ljava/util/Collections$CheckedSortedMap;
-Ljava/util/Collections$CheckedSortedSet;
-Ljava/util/Collections$CopiesList;
-Ljava/util/Collections$EmptyEnumeration;
-Ljava/util/Collections$EmptyList-IA;
-Ljava/util/Collections$EmptyListIterator;
-Ljava/util/Collections$EmptyMap-IA;
-Ljava/util/Collections$EmptySet-IA;
-Ljava/util/Collections$ReverseComparator2;
-Ljava/util/Collections$ReverseComparator;
-Ljava/util/Collections$SequencedSetFromMap;
-Ljava/util/Collections$SynchronizedList;
-Ljava/util/Collections$SynchronizedNavigableMap;
-Ljava/util/Collections$SynchronizedNavigableSet;
-Ljava/util/Collections$SynchronizedSet;
-Ljava/util/Collections$SynchronizedSortedMap;
-Ljava/util/Collections$SynchronizedSortedSet;
-Ljava/util/Collections$UnmodifiableList$1;
-Ljava/util/Collections$UnmodifiableList;
-Ljava/util/Collections$UnmodifiableNavigableMap$EmptyNavigableMap;
-Ljava/util/Collections$UnmodifiableNavigableMap;
-Ljava/util/Collections$UnmodifiableNavigableSet$EmptyNavigableSet;
-Ljava/util/Collections$UnmodifiableNavigableSet;
-Ljava/util/Collections$UnmodifiableSequencedCollection;
-Ljava/util/Collections$UnmodifiableSequencedMap;
-Ljava/util/Collections$UnmodifiableSequencedSet;
-Ljava/util/Collections$UnmodifiableSortedMap;
-Ljava/util/Collections;
-Ljava/util/ComparableTimSort;
-Ljava/util/Comparator$$ExternalSyntheticLambda1;
-Ljava/util/Comparator$$ExternalSyntheticLambda2;
-Ljava/util/Comparator$$ExternalSyntheticLambda3;
-Ljava/util/Comparator$$ExternalSyntheticLambda4;
-Ljava/util/Comparator$$ExternalSyntheticLambda5;
-Ljava/util/Comparator;
-Ljava/util/Comparators$NaturalOrderComparator;
-Ljava/util/Comparators$NullComparator;
-Ljava/util/ConcurrentModificationException;
-Ljava/util/Currency;
-Ljava/util/Date;
-Ljava/util/Deque;
-Ljava/util/Dictionary;
-Ljava/util/DoubleSummaryStatistics;
-Ljava/util/DualPivotQuicksort$Sorter-IA;
-Ljava/util/DualPivotQuicksort$Sorter;
-Ljava/util/DualPivotQuicksort;
-Ljava/util/DuplicateFormatFlagsException;
-Ljava/util/EmptyStackException;
-Ljava/util/EnumMap$1;
-Ljava/util/EnumMap$EntryIterator$Entry-IA;
-Ljava/util/EnumMap$EntryIterator$Entry;
-Ljava/util/EnumMap$EntryIterator-IA;
-Ljava/util/EnumMap$EntryIterator;
-Ljava/util/EnumMap$EntrySet-IA;
-Ljava/util/EnumMap$EntrySet;
-Ljava/util/EnumMap$EnumMapIterator-IA;
-Ljava/util/EnumMap$EnumMapIterator;
-Ljava/util/EnumMap$KeyIterator-IA;
-Ljava/util/EnumMap$KeyIterator;
-Ljava/util/EnumMap$KeySet-IA;
-Ljava/util/EnumMap$KeySet;
-Ljava/util/EnumMap$ValueIterator-IA;
-Ljava/util/EnumMap$ValueIterator;
-Ljava/util/EnumMap$Values-IA;
-Ljava/util/EnumMap$Values;
-Ljava/util/EnumMap;
-Ljava/util/EnumSet$SerializationProxy;
-Ljava/util/EnumSet;
-Ljava/util/Enumeration;
-Ljava/util/EventListener;
-Ljava/util/EventObject;
-Ljava/util/FormatFlagsConversionMismatchException;
-Ljava/util/Formattable;
-Ljava/util/Formatter$Conversion;
-Ljava/util/Formatter$DateTime;
-Ljava/util/Formatter$FixedString;
-Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$FormatSpecifier;
-Ljava/util/Formatter$FormatSpecifierParser;
-Ljava/util/Formatter$FormatString;
-Ljava/util/Formatter;
-Ljava/util/FormatterClosedException;
-Ljava/util/HashMap$EntrySpliterator;
-Ljava/util/HashMap$HashIterator;
-Ljava/util/HashMap$HashMapSpliterator;
-Ljava/util/HashMap$KeySpliterator;
-Ljava/util/HashMap$UnsafeHolder;
-Ljava/util/HashMap$ValueSpliterator;
-Ljava/util/HashMap;
-Ljava/util/HashSet;
-Ljava/util/Hashtable$EntrySet-IA;
-Ljava/util/Hashtable$EntrySet;
-Ljava/util/Hashtable$HashtableEntry;
-Ljava/util/Hashtable$KeySet-IA;
-Ljava/util/Hashtable$KeySet;
-Ljava/util/Hashtable$ValueCollection-IA;
-Ljava/util/Hashtable$ValueCollection;
-Ljava/util/Hashtable;
-Ljava/util/HexFormat;
-Ljava/util/IdentityHashMap$EntryIterator$Entry-IA;
-Ljava/util/IdentityHashMap$EntryIterator$Entry;
-Ljava/util/IdentityHashMap$EntryIterator-IA;
-Ljava/util/IdentityHashMap$EntryIterator;
-Ljava/util/IdentityHashMap$EntrySet-IA;
-Ljava/util/IdentityHashMap$EntrySet;
-Ljava/util/IdentityHashMap$IdentityHashMapIterator-IA;
-Ljava/util/IdentityHashMap$IdentityHashMapIterator;
-Ljava/util/IdentityHashMap$KeyIterator-IA;
-Ljava/util/IdentityHashMap$KeyIterator;
-Ljava/util/IdentityHashMap$KeySet-IA;
-Ljava/util/IdentityHashMap$KeySet;
-Ljava/util/IdentityHashMap$ValueIterator-IA;
-Ljava/util/IdentityHashMap$ValueIterator;
-Ljava/util/IdentityHashMap$Values-IA;
-Ljava/util/IdentityHashMap$Values;
-Ljava/util/IdentityHashMap;
-Ljava/util/IllegalFormatCodePointException;
-Ljava/util/IllegalFormatConversionException;
-Ljava/util/IllegalFormatException;
-Ljava/util/IllegalFormatFlagsException;
-Ljava/util/IllegalFormatPrecisionException;
-Ljava/util/IllegalFormatWidthException;
-Ljava/util/IllformedLocaleException;
-Ljava/util/ImmutableCollections$AbstractImmutableCollection;
-Ljava/util/ImmutableCollections$AbstractImmutableList;
-Ljava/util/ImmutableCollections$AbstractImmutableMap;
-Ljava/util/ImmutableCollections$AbstractImmutableSet;
-Ljava/util/ImmutableCollections$Access$1;
-Ljava/util/ImmutableCollections$Access;
-Ljava/util/ImmutableCollections$ListN-IA;
-Ljava/util/ImmutableCollections$MapN$1;
-Ljava/util/ImmutableCollections$MapN$MapNIterator;
-Ljava/util/ImmutableCollections$SubList;
-Ljava/util/ImmutableCollections;
-Ljava/util/InputMismatchException;
-Ljava/util/Iterator;
-Ljava/util/JumboEnumSet$EnumSetIterator;
-Ljava/util/JumboEnumSet;
-Ljava/util/KeyValueHolder;
-Ljava/util/LinkedHashMap$LinkedHashIterator;
-Ljava/util/LinkedHashMap$ReversedLinkedHashMapView;
-Ljava/util/LinkedHashMap;
-Ljava/util/LinkedHashSet;
-Ljava/util/LinkedList$DescendingIterator-IA;
-Ljava/util/LinkedList$Node;
-Ljava/util/LinkedList;
-Ljava/util/List;
-Ljava/util/ListIterator;
-Ljava/util/ListResourceBundle;
-Ljava/util/Locale$Builder;
-Ljava/util/Locale$Cache;
-Ljava/util/Locale$Category;
-Ljava/util/Locale$FilteringMode;
-Ljava/util/Locale$IsoCountryCode$1;
-Ljava/util/Locale$IsoCountryCode$2;
-Ljava/util/Locale$IsoCountryCode$3;
-Ljava/util/Locale$IsoCountryCode;
-Ljava/util/Locale$LanguageRange;
-Ljava/util/Locale$LocaleKey-IA;
-Ljava/util/Locale$LocaleKey;
-Ljava/util/Locale$NoImagePreloadHolder;
-Ljava/util/Locale-IA;
-Ljava/util/Locale;
-Ljava/util/LongSummaryStatistics;
-Ljava/util/Map$Entry;
-Ljava/util/Map;
-Ljava/util/MissingFormatArgumentException;
-Ljava/util/MissingFormatWidthException;
-Ljava/util/MissingResourceException;
-Ljava/util/NavigableMap;
-Ljava/util/NavigableSet;
-Ljava/util/NoSuchElementException;
-Ljava/util/Objects;
-Ljava/util/Observable;
-Ljava/util/Observer;
-Ljava/util/Optional;
-Ljava/util/OptionalDouble;
-Ljava/util/OptionalInt;
-Ljava/util/PrimitiveIterator$OfInt$$ExternalSyntheticLambda0;
-Ljava/util/PrimitiveIterator$OfInt;
-Ljava/util/PrimitiveIterator;
-Ljava/util/PriorityQueue;
-Ljava/util/Properties$EntrySet;
-Ljava/util/Properties$LineReader;
-Ljava/util/Properties;
-Ljava/util/PropertyPermission;
-Ljava/util/PropertyResourceBundle;
-Ljava/util/Queue;
-Ljava/util/Random;
-Ljava/util/RandomAccess;
-Ljava/util/RegularEnumSet$EnumSetIterator;
-Ljava/util/RegularEnumSet;
-Ljava/util/ResourceBundle$1;
-Ljava/util/ResourceBundle$BundleReference;
-Ljava/util/ResourceBundle$CacheKey;
-Ljava/util/ResourceBundle$CacheKeyReference;
-Ljava/util/ResourceBundle$Control$$ExternalSyntheticLambda0;
-Ljava/util/ResourceBundle$Control$1;
-Ljava/util/ResourceBundle$Control$CandidateListCache;
-Ljava/util/ResourceBundle$Control;
-Ljava/util/ResourceBundle$KeyElementReference;
-Ljava/util/ResourceBundle$RBClassLoader$1;
-Ljava/util/ResourceBundle$RBClassLoader;
-Ljava/util/ResourceBundle$SingleFormatControl;
-Ljava/util/ResourceBundle;
-Ljava/util/ReverseOrderListView;
-Ljava/util/Scanner$PatternLRUCache;
-Ljava/util/Scanner;
-Ljava/util/SequencedCollection;
-Ljava/util/SequencedMap$1SeqEntrySet;
-Ljava/util/SequencedMap$1SeqKeySet;
-Ljava/util/SequencedMap$1SeqValues;
-Ljava/util/SequencedMap;
-Ljava/util/SequencedSet;
-Ljava/util/ServiceConfigurationError;
-Ljava/util/ServiceLoader$1;
-Ljava/util/ServiceLoader$2;
-Ljava/util/ServiceLoader$LazyClassPathLookupIterator;
-Ljava/util/ServiceLoader;
-Ljava/util/Set;
-Ljava/util/SimpleTimeZone$Cache;
-Ljava/util/SimpleTimeZone;
-Ljava/util/SortedMap;
-Ljava/util/SortedSet;
-Ljava/util/Spliterator$OfDouble;
-Ljava/util/Spliterator$OfInt;
-Ljava/util/Spliterator$OfLong;
-Ljava/util/Spliterator$OfPrimitive;
-Ljava/util/Spliterator;
-Ljava/util/Spliterators$ArraySpliterator;
-Ljava/util/Spliterators$EmptySpliterator$OfDouble;
-Ljava/util/Spliterators$EmptySpliterator$OfInt;
-Ljava/util/Spliterators$EmptySpliterator$OfLong;
-Ljava/util/Spliterators$EmptySpliterator$OfRef;
-Ljava/util/Spliterators$EmptySpliterator;
-Ljava/util/Spliterators$IntArraySpliterator;
-Ljava/util/Spliterators$IteratorSpliterator;
-Ljava/util/Spliterators;
-Ljava/util/Stack;
-Ljava/util/StringJoiner;
-Ljava/util/StringTokenizer;
-Ljava/util/TaskQueue;
-Ljava/util/TimSort;
-Ljava/util/TimeZone;
-Ljava/util/Timer$ThreadReaper;
-Ljava/util/Timer;
-Ljava/util/TimerTask;
-Ljava/util/TimerThread;
-Ljava/util/TooManyListenersException;
-Ljava/util/TreeMap$AscendingSubMap$AscendingEntrySetView;
-Ljava/util/TreeMap$AscendingSubMap;
-Ljava/util/TreeMap$DescendingSubMap;
-Ljava/util/TreeMap$NavigableSubMap$DescendingSubMapKeyIterator;
-Ljava/util/TreeMap$NavigableSubMap$EntrySetView;
-Ljava/util/TreeMap$NavigableSubMap$SubMapEntryIterator;
-Ljava/util/TreeMap$NavigableSubMap$SubMapIterator;
-Ljava/util/TreeMap$NavigableSubMap;
-Ljava/util/TreeMap$PrivateEntryIterator;
-Ljava/util/TreeMap$ValueIterator;
-Ljava/util/TreeMap$Values;
-Ljava/util/TreeMap;
-Ljava/util/TreeSet;
-Ljava/util/Tripwire$$ExternalSyntheticLambda0;
-Ljava/util/Tripwire;
-Ljava/util/UUID$Holder;
-Ljava/util/UUID;
-Ljava/util/UnknownFormatConversionException;
-Ljava/util/UnknownFormatFlagsException;
-Ljava/util/Vector$1;
-Ljava/util/Vector$Itr-IA;
-Ljava/util/Vector$Itr;
-Ljava/util/Vector;
-Ljava/util/WeakHashMap$Entry;
-Ljava/util/WeakHashMap$EntryIterator-IA;
-Ljava/util/WeakHashMap$EntryIterator;
-Ljava/util/WeakHashMap$EntrySet-IA;
-Ljava/util/WeakHashMap$EntrySet;
-Ljava/util/WeakHashMap$HashIterator;
-Ljava/util/WeakHashMap$KeyIterator-IA;
-Ljava/util/WeakHashMap$KeySet-IA;
-Ljava/util/WeakHashMap$ValueIterator-IA;
-Ljava/util/WeakHashMap$ValueIterator;
-Ljava/util/WeakHashMap$Values-IA;
-Ljava/util/WeakHashMap$Values;
-Ljava/util/WeakHashMap;
-Ljava/util/concurrent/AbstractExecutorService;
-Ljava/util/concurrent/ArrayBlockingQueue$Itrs;
-Ljava/util/concurrent/ArrayBlockingQueue;
-Ljava/util/concurrent/BlockingDeque;
-Ljava/util/concurrent/BlockingQueue;
-Ljava/util/concurrent/Callable;
-Ljava/util/concurrent/CancellationException;
-Ljava/util/concurrent/CompletableFuture$AltResult;
-Ljava/util/concurrent/CompletableFuture$AsyncRun;
-Ljava/util/concurrent/CompletableFuture$AsyncSupply;
-Ljava/util/concurrent/CompletableFuture$AsynchronousCompletionTask;
-Ljava/util/concurrent/CompletableFuture$Completion;
-Ljava/util/concurrent/CompletableFuture$Signaller;
-Ljava/util/concurrent/CompletableFuture$UniCompletion;
-Ljava/util/concurrent/CompletableFuture$UniWhenComplete;
-Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletionException;
-Ljava/util/concurrent/CompletionStage;
-Ljava/util/concurrent/ConcurrentHashMap$BaseIterator;
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;
-Ljava/util/concurrent/ConcurrentHashMap$CollectionView;
-Ljava/util/concurrent/ConcurrentHashMap$CounterCell;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachEntryTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachKeyTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachMappingTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedEntryTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedKeyTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedMappingTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedValueTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachValueTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForwardingNode;
-Ljava/util/concurrent/ConcurrentHashMap$KeyIterator;
-Ljava/util/concurrent/ConcurrentHashMap$KeySetView;
-Ljava/util/concurrent/ConcurrentHashMap$KeySpliterator;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceEntriesTask;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceKeysTask;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceValuesTask;
-Ljava/util/concurrent/ConcurrentHashMap$ReservationNode;
-Ljava/util/concurrent/ConcurrentHashMap$SearchEntriesTask;
-Ljava/util/concurrent/ConcurrentHashMap$SearchKeysTask;
-Ljava/util/concurrent/ConcurrentHashMap$SearchMappingsTask;
-Ljava/util/concurrent/ConcurrentHashMap$SearchValuesTask;
-Ljava/util/concurrent/ConcurrentHashMap$Segment;
-Ljava/util/concurrent/ConcurrentHashMap$TableStack;
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;
-Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap;
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque;
-Ljava/util/concurrent/ConcurrentLinkedQueue$$ExternalSyntheticLambda0;
-Ljava/util/concurrent/ConcurrentLinkedQueue$$ExternalSyntheticLambda2;
-Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
-Ljava/util/concurrent/ConcurrentLinkedQueue;
-Ljava/util/concurrent/ConcurrentMap$$ExternalSyntheticLambda0;
-Ljava/util/concurrent/ConcurrentMap;
-Ljava/util/concurrent/ConcurrentNavigableMap;
-Ljava/util/concurrent/ConcurrentSkipListMap$Index;
-Ljava/util/concurrent/ConcurrentSkipListMap$Iter;
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap$ValueIterator;
-Ljava/util/concurrent/ConcurrentSkipListMap$Values;
-Ljava/util/concurrent/ConcurrentSkipListMap;
-Ljava/util/concurrent/ConcurrentSkipListSet;
-Ljava/util/concurrent/CopyOnWriteArrayList$$ExternalSyntheticLambda2;
-Ljava/util/concurrent/CopyOnWriteArraySet;
-Ljava/util/concurrent/CountDownLatch$Sync;
-Ljava/util/concurrent/CountDownLatch;
-Ljava/util/concurrent/CountedCompleter;
-Ljava/util/concurrent/DelayQueue;
-Ljava/util/concurrent/Delayed;
-Ljava/util/concurrent/ExecutionException;
-Ljava/util/concurrent/Executor;
-Ljava/util/concurrent/ExecutorService;
-Ljava/util/concurrent/Executors$DefaultThreadFactory;
-Ljava/util/concurrent/Executors$DelegatedExecutorService;
-Ljava/util/concurrent/Executors$RunnableAdapter;
-Ljava/util/concurrent/Executors;
-Ljava/util/concurrent/ForkJoinPool$1;
-Ljava/util/concurrent/ForkJoinPool$DefaultCommonPoolForkJoinWorkerThreadFactory;
-Ljava/util/concurrent/ForkJoinPool$DefaultForkJoinWorkerThreadFactory;
-Ljava/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory;
-Ljava/util/concurrent/ForkJoinPool$ManagedBlocker;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;
-Ljava/util/concurrent/ForkJoinPool;
-Ljava/util/concurrent/ForkJoinTask$Aux;
-Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinWorkerThread;
-Ljava/util/concurrent/Future;
-Ljava/util/concurrent/FutureTask$WaitNode;
-Ljava/util/concurrent/FutureTask;
-Ljava/util/concurrent/LinkedBlockingDeque$AbstractItr;
-Ljava/util/concurrent/LinkedBlockingDeque$Itr;
-Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque;
-Ljava/util/concurrent/LinkedBlockingQueue$Itr;
-Ljava/util/concurrent/LinkedBlockingQueue$Node;
-Ljava/util/concurrent/LinkedBlockingQueue;
-Ljava/util/concurrent/Phaser;
-Ljava/util/concurrent/PriorityBlockingQueue;
-Ljava/util/concurrent/RejectedExecutionException;
-Ljava/util/concurrent/RejectedExecutionHandler;
-Ljava/util/concurrent/RunnableFuture;
-Ljava/util/concurrent/RunnableScheduledFuture;
-Ljava/util/concurrent/ScheduledExecutorService;
-Ljava/util/concurrent/ScheduledFuture;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;
-Ljava/util/concurrent/Semaphore$FairSync;
-Ljava/util/concurrent/Semaphore$NonfairSync;
-Ljava/util/concurrent/Semaphore$Sync;
-Ljava/util/concurrent/Semaphore;
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;
-Ljava/util/concurrent/SynchronousQueue$TransferStack;
-Ljava/util/concurrent/SynchronousQueue$Transferer;
-Ljava/util/concurrent/SynchronousQueue;
-Ljava/util/concurrent/ThreadFactory;
-Ljava/util/concurrent/ThreadLocalRandom;
-Ljava/util/concurrent/ThreadPoolExecutor$AbortPolicy;
-Ljava/util/concurrent/ThreadPoolExecutor$DiscardPolicy;
-Ljava/util/concurrent/TimeUnit$1;
-Ljava/util/concurrent/TimeUnit;
-Ljava/util/concurrent/TimeoutException;
-Ljava/util/concurrent/atomic/AtomicBoolean;
-Ljava/util/concurrent/atomic/AtomicInteger;
-Ljava/util/concurrent/atomic/AtomicIntegerArray;
-Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;
-Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater;
-Ljava/util/concurrent/atomic/AtomicLong;
-Ljava/util/concurrent/atomic/AtomicLongArray;
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$LockedUpdater;
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater;
-Ljava/util/concurrent/atomic/AtomicReference;
-Ljava/util/concurrent/atomic/AtomicReferenceArray;
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;
-Ljava/util/concurrent/atomic/LongAdder;
-Ljava/util/concurrent/atomic/Striped64$1;
-Ljava/util/concurrent/atomic/Striped64$Cell;
-Ljava/util/concurrent/atomic/Striped64;
-Ljava/util/concurrent/locks/AbstractOwnableSynchronizer;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ExclusiveNode;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$SharedNode;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;
-Ljava/util/concurrent/locks/Condition;
-Ljava/util/concurrent/locks/Lock;
-Ljava/util/concurrent/locks/LockSupport;
-Ljava/util/concurrent/locks/ReadWriteLock;
-Ljava/util/concurrent/locks/ReentrantLock$FairSync;
-Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;
-Ljava/util/concurrent/locks/ReentrantLock$Sync;
-Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$FairSync;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync$HoldCounter;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock;
-Ljava/util/function/BiConsumer;
-Ljava/util/function/BiFunction$$ExternalSyntheticLambda0;
-Ljava/util/function/BiFunction;
-Ljava/util/function/BiPredicate;
-Ljava/util/function/BinaryOperator$$ExternalSyntheticLambda0;
-Ljava/util/function/BinaryOperator;
-Ljava/util/function/BooleanSupplier;
-Ljava/util/function/Consumer$$ExternalSyntheticLambda0;
-Ljava/util/function/Consumer;
-Ljava/util/function/DoubleBinaryOperator;
-Ljava/util/function/DoubleConsumer;
-Ljava/util/function/DoubleSupplier;
-Ljava/util/function/DoubleUnaryOperator$$ExternalSyntheticLambda0;
-Ljava/util/function/DoubleUnaryOperator$$ExternalSyntheticLambda1;
-Ljava/util/function/DoubleUnaryOperator;
-Ljava/util/function/Function$$ExternalSyntheticLambda0;
-Ljava/util/function/Function$$ExternalSyntheticLambda1;
-Ljava/util/function/Function$$ExternalSyntheticLambda2;
-Ljava/util/function/Function;
-Ljava/util/function/IntBinaryOperator;
-Ljava/util/function/IntConsumer;
-Ljava/util/function/IntFunction;
-Ljava/util/function/IntPredicate;
-Ljava/util/function/IntSupplier;
-Ljava/util/function/IntToDoubleFunction;
-Ljava/util/function/IntToLongFunction;
-Ljava/util/function/IntUnaryOperator;
-Ljava/util/function/LongBinaryOperator;
-Ljava/util/function/LongConsumer;
-Ljava/util/function/LongFunction;
-Ljava/util/function/LongPredicate;
-Ljava/util/function/LongSupplier;
-Ljava/util/function/LongUnaryOperator;
-Ljava/util/function/ObjDoubleConsumer;
-Ljava/util/function/ObjIntConsumer;
-Ljava/util/function/ObjLongConsumer;
-Ljava/util/function/Predicate;
-Ljava/util/function/Supplier;
-Ljava/util/function/ToDoubleBiFunction;
-Ljava/util/function/ToDoubleFunction;
-Ljava/util/function/ToIntBiFunction;
-Ljava/util/function/ToIntFunction;
-Ljava/util/function/ToLongBiFunction;
-Ljava/util/function/ToLongFunction;
-Ljava/util/function/UnaryOperator;
-Ljava/util/jar/Attributes$Name;
-Ljava/util/jar/Attributes;
-Ljava/util/jar/JarEntry;
-Ljava/util/jar/JarException;
-Ljava/util/jar/JarFile$JarEntryIterator;
-Ljava/util/jar/JarFile$JarFileEntry;
-Ljava/util/jar/JarFile;
-Ljava/util/jar/JarVerifier$3;
-Ljava/util/jar/JarVerifier$VerifierStream;
-Ljava/util/jar/JarVerifier;
-Ljava/util/jar/Manifest$FastInputStream;
-Ljava/util/jar/Manifest;
-Ljava/util/logging/ConsoleHandler;
-Ljava/util/logging/ErrorManager;
-Ljava/util/logging/FileHandler$1;
-Ljava/util/logging/FileHandler$InitializationErrorManager-IA;
-Ljava/util/logging/FileHandler$InitializationErrorManager;
-Ljava/util/logging/FileHandler$MeteredStream;
-Ljava/util/logging/FileHandler;
-Ljava/util/logging/Filter;
-Ljava/util/logging/Formatter;
-Ljava/util/logging/Handler;
-Ljava/util/logging/Level$KnownLevel;
-Ljava/util/logging/Level;
-Ljava/util/logging/LogManager$1;
-Ljava/util/logging/LogManager$2;
-Ljava/util/logging/LogManager$3;
-Ljava/util/logging/LogManager$4;
-Ljava/util/logging/LogManager$5;
-Ljava/util/logging/LogManager$6;
-Ljava/util/logging/LogManager$7;
-Ljava/util/logging/LogManager$Cleaner;
-Ljava/util/logging/LogManager$LogNode;
-Ljava/util/logging/LogManager$LoggerContext$1;
-Ljava/util/logging/LogManager$LoggerContext;
-Ljava/util/logging/LogManager$LoggerWeakRef;
-Ljava/util/logging/LogManager$RootLogger;
-Ljava/util/logging/LogManager$SystemLoggerContext;
-Ljava/util/logging/LogManager;
-Ljava/util/logging/LogRecord;
-Ljava/util/logging/Logger$1;
-Ljava/util/logging/Logger$LoggerBundle;
-Ljava/util/logging/Logger$SystemLoggerHelper$1;
-Ljava/util/logging/Logger$SystemLoggerHelper;
-Ljava/util/logging/Logger;
-Ljava/util/logging/LoggingPermission;
-Ljava/util/logging/LoggingProxyImpl;
-Ljava/util/logging/SimpleFormatter;
-Ljava/util/logging/StreamHandler;
-Ljava/util/logging/XMLFormatter;
-Ljava/util/prefs/AbstractPreferences;
-Ljava/util/prefs/BackingStoreException;
-Ljava/util/prefs/FileSystemPreferences$3;
-Ljava/util/prefs/FileSystemPreferences;
-Ljava/util/prefs/FileSystemPreferencesFactory;
-Ljava/util/prefs/Preferences;
-Ljava/util/prefs/PreferencesFactory;
-Ljava/util/random/RandomGenerator;
-Ljava/util/regex/ASCII;
-Ljava/util/regex/MatchResult;
-Ljava/util/regex/Matcher;
-Ljava/util/regex/Pattern;
-Ljava/util/regex/PatternSyntaxException;
-Ljava/util/stream/AbstractPipeline$$ExternalSyntheticLambda0;
-Ljava/util/stream/AbstractPipeline$$ExternalSyntheticLambda2;
-Ljava/util/stream/AbstractPipeline;
-Ljava/util/stream/AbstractSpinedBuffer;
-Ljava/util/stream/BaseStream;
-Ljava/util/stream/Collector$Characteristics;
-Ljava/util/stream/Collector;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda0;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda13;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda15;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda1;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda20;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda21;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda22;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda23;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda24;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda25;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda26;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda27;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda28;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda30;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda34;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda37;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda39;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda41;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda42;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda45;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda47;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda48;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda49;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda4;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda50;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda51;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda52;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda53;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda54;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda56;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda57;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda63;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda64;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda65;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda66;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda68;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda69;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda72;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda73;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda74;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda75;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda76;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda77;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda79;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda80;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda82;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda87;
-Ljava/util/stream/Collectors$$ExternalSyntheticLambda94;
-Ljava/util/stream/Collectors$CollectorImpl;
-Ljava/util/stream/Collectors;
-Ljava/util/stream/DistinctOps$1$1;
-Ljava/util/stream/DistinctOps$1$2;
-Ljava/util/stream/DistinctOps;
-Ljava/util/stream/DoublePipeline$$ExternalSyntheticLambda0;
-Ljava/util/stream/DoublePipeline$$ExternalSyntheticLambda4;
-Ljava/util/stream/DoublePipeline$$ExternalSyntheticLambda5;
-Ljava/util/stream/DoublePipeline$$ExternalSyntheticLambda7;
-Ljava/util/stream/DoublePipeline$$ExternalSyntheticLambda9;
-Ljava/util/stream/DoublePipeline$StatelessOp;
-Ljava/util/stream/DoublePipeline;
-Ljava/util/stream/DoubleStream;
-Ljava/util/stream/FindOps$FindOp;
-Ljava/util/stream/FindOps$FindSink$OfInt$$ExternalSyntheticLambda0;
-Ljava/util/stream/FindOps$FindSink$OfInt$$ExternalSyntheticLambda1;
-Ljava/util/stream/FindOps$FindSink$OfInt;
-Ljava/util/stream/FindOps$FindSink$OfRef$$ExternalSyntheticLambda0;
-Ljava/util/stream/FindOps$FindSink$OfRef$$ExternalSyntheticLambda1;
-Ljava/util/stream/FindOps$FindSink$OfRef;
-Ljava/util/stream/FindOps$FindSink;
-Ljava/util/stream/FindOps;
-Ljava/util/stream/ForEachOps$ForEachOp$OfInt;
-Ljava/util/stream/ForEachOps$ForEachOp$OfRef;
-Ljava/util/stream/ForEachOps$ForEachOp;
-Ljava/util/stream/ForEachOps;
-Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda0;
-Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda10;
-Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda11;
-Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda12;
-Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda1;
-Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda5;
-Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda7;
-Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda8;
-Ljava/util/stream/IntPipeline$1$1;
-Ljava/util/stream/IntPipeline$4$1;
-Ljava/util/stream/IntPipeline$9;
-Ljava/util/stream/IntPipeline$StatelessOp;
-Ljava/util/stream/IntPipeline;
-Ljava/util/stream/IntStream;
-Ljava/util/stream/LongPipeline$$ExternalSyntheticLambda2;
-Ljava/util/stream/LongPipeline$$ExternalSyntheticLambda3;
-Ljava/util/stream/LongPipeline$$ExternalSyntheticLambda4;
-Ljava/util/stream/LongPipeline$$ExternalSyntheticLambda7;
-Ljava/util/stream/LongPipeline$$ExternalSyntheticLambda9;
-Ljava/util/stream/LongPipeline$StatelessOp;
-Ljava/util/stream/LongPipeline;
-Ljava/util/stream/LongStream;
-Ljava/util/stream/MatchOps$$ExternalSyntheticLambda0;
-Ljava/util/stream/MatchOps$$ExternalSyntheticLambda1;
-Ljava/util/stream/MatchOps$$ExternalSyntheticLambda3;
-Ljava/util/stream/MatchOps$1MatchSink;
-Ljava/util/stream/MatchOps$2MatchSink;
-Ljava/util/stream/MatchOps$3MatchSink;
-Ljava/util/stream/MatchOps$BooleanTerminalSink;
-Ljava/util/stream/MatchOps$MatchKind;
-Ljava/util/stream/MatchOps$MatchOp;
-Ljava/util/stream/MatchOps;
-Ljava/util/stream/Node$Builder$OfInt;
-Ljava/util/stream/Node$Builder;
-Ljava/util/stream/Node$OfDouble;
-Ljava/util/stream/Node$OfInt;
-Ljava/util/stream/Node$OfLong;
-Ljava/util/stream/Node$OfPrimitive;
-Ljava/util/stream/Node;
-Ljava/util/stream/Nodes$ArrayNode;
-Ljava/util/stream/Nodes$EmptyNode$OfDouble;
-Ljava/util/stream/Nodes$EmptyNode$OfInt;
-Ljava/util/stream/Nodes$EmptyNode$OfLong;
-Ljava/util/stream/Nodes$EmptyNode$OfRef;
-Ljava/util/stream/Nodes$EmptyNode;
-Ljava/util/stream/Nodes$FixedNodeBuilder;
-Ljava/util/stream/Nodes$IntArrayNode;
-Ljava/util/stream/Nodes$IntFixedNodeBuilder;
-Ljava/util/stream/Nodes$IntSpinedNodeBuilder;
-Ljava/util/stream/Nodes$SpinedNodeBuilder;
-Ljava/util/stream/Nodes$ToArrayTask$OfInt-IA;
-Ljava/util/stream/Nodes$ToArrayTask$OfInt;
-Ljava/util/stream/Nodes$ToArrayTask$OfPrimitive-IA;
-Ljava/util/stream/Nodes$ToArrayTask$OfPrimitive;
-Ljava/util/stream/Nodes$ToArrayTask$OfRef-IA;
-Ljava/util/stream/Nodes$ToArrayTask$OfRef;
-Ljava/util/stream/Nodes$ToArrayTask;
-Ljava/util/stream/Nodes;
-Ljava/util/stream/PipelineHelper;
-Ljava/util/stream/ReduceOps$10;
-Ljava/util/stream/ReduceOps$12;
-Ljava/util/stream/ReduceOps$12ReducingSink;
-Ljava/util/stream/ReduceOps$15;
-Ljava/util/stream/ReduceOps$1;
-Ljava/util/stream/ReduceOps$1ReducingSink;
-Ljava/util/stream/ReduceOps$2;
-Ljava/util/stream/ReduceOps$2ReducingSink;
-Ljava/util/stream/ReduceOps$3;
-Ljava/util/stream/ReduceOps$3ReducingSink;
-Ljava/util/stream/ReduceOps$5;
-Ljava/util/stream/ReduceOps$5ReducingSink;
-Ljava/util/stream/ReduceOps$6;
-Ljava/util/stream/ReduceOps$8;
-Ljava/util/stream/ReduceOps$8ReducingSink;
-Ljava/util/stream/ReduceOps$AccumulatingSink;
-Ljava/util/stream/ReduceOps$Box;
-Ljava/util/stream/ReduceOps$ReduceOp;
-Ljava/util/stream/ReduceOps;
-Ljava/util/stream/ReferencePipeline$$ExternalSyntheticLambda0;
-Ljava/util/stream/ReferencePipeline$$ExternalSyntheticLambda1;
-Ljava/util/stream/ReferencePipeline$15$1;
-Ljava/util/stream/ReferencePipeline$2$1;
-Ljava/util/stream/ReferencePipeline$3$1;
-Ljava/util/stream/ReferencePipeline$4$1;
-Ljava/util/stream/ReferencePipeline$5$1;
-Ljava/util/stream/ReferencePipeline$5;
-Ljava/util/stream/ReferencePipeline$6$1;
-Ljava/util/stream/ReferencePipeline$6;
-Ljava/util/stream/ReferencePipeline$7$1;
-Ljava/util/stream/ReferencePipeline$7;
-Ljava/util/stream/ReferencePipeline$StatefulOp;
-Ljava/util/stream/ReferencePipeline$StatelessOp;
-Ljava/util/stream/ReferencePipeline;
-Ljava/util/stream/Sink$ChainedInt;
-Ljava/util/stream/Sink$ChainedReference;
-Ljava/util/stream/Sink$OfDouble;
-Ljava/util/stream/Sink$OfInt;
-Ljava/util/stream/Sink$OfLong;
-Ljava/util/stream/Sink;
-Ljava/util/stream/SliceOps$1$1;
-Ljava/util/stream/SliceOps$1;
-Ljava/util/stream/SliceOps;
-Ljava/util/stream/SortedOps$AbstractRefSortingSink;
-Ljava/util/stream/SortedOps$RefSortingSink$$ExternalSyntheticLambda0;
-Ljava/util/stream/SortedOps$RefSortingSink;
-Ljava/util/stream/SortedOps$SizedRefSortingSink;
-Ljava/util/stream/SortedOps;
-Ljava/util/stream/SpinedBuffer$OfInt;
-Ljava/util/stream/SpinedBuffer$OfPrimitive;
-Ljava/util/stream/SpinedBuffer;
-Ljava/util/stream/Stream$Builder;
-Ljava/util/stream/Stream;
-Ljava/util/stream/StreamOpFlag$MaskBuilder;
-Ljava/util/stream/StreamOpFlag$Type;
-Ljava/util/stream/StreamOpFlag;
-Ljava/util/stream/StreamShape;
-Ljava/util/stream/StreamSpliterators$AbstractWrappingSpliterator;
-Ljava/util/stream/StreamSpliterators$InfiniteSupplyingSpliterator$OfRef;
-Ljava/util/stream/StreamSpliterators$InfiniteSupplyingSpliterator;
-Ljava/util/stream/StreamSpliterators$WrappingSpliterator;
-Ljava/util/stream/StreamSupport;
-Ljava/util/stream/Streams$1;
-Ljava/util/stream/Streams$2;
-Ljava/util/stream/Streams$AbstractStreamBuilderImpl-IA;
-Ljava/util/stream/Streams$AbstractStreamBuilderImpl;
-Ljava/util/stream/Streams$ConcatSpliterator$OfRef;
-Ljava/util/stream/Streams$ConcatSpliterator;
-Ljava/util/stream/Streams$RangeIntSpliterator;
-Ljava/util/stream/Streams$StreamBuilderImpl;
-Ljava/util/stream/Streams;
-Ljava/util/stream/TerminalOp;
-Ljava/util/stream/TerminalSink;
-Ljava/util/stream/Tripwire$$ExternalSyntheticLambda0;
-Ljava/util/stream/Tripwire;
-Ljava/util/zip/Adler32;
-Ljava/util/zip/CRC32;
-Ljava/util/zip/CheckedInputStream;
-Ljava/util/zip/Checksum$1;
-Ljava/util/zip/Checksum;
-Ljava/util/zip/DataFormatException;
-Ljava/util/zip/Deflater$DeflaterZStreamRef;
-Ljava/util/zip/Deflater;
-Ljava/util/zip/DeflaterOutputStream;
-Ljava/util/zip/GZIPInputStream$1;
-Ljava/util/zip/GZIPOutputStream;
-Ljava/util/zip/Inflater$InflaterZStreamRef-IA;
-Ljava/util/zip/Inflater$InflaterZStreamRef;
-Ljava/util/zip/Inflater;
-Ljava/util/zip/InflaterInputStream;
-Ljava/util/zip/ZipCoder$UTF8ZipCoder;
-Ljava/util/zip/ZipCoder;
-Ljava/util/zip/ZipConstants;
-Ljava/util/zip/ZipEntry;
-Ljava/util/zip/ZipError;
-Ljava/util/zip/ZipException;
-Ljava/util/zip/ZipFile$CleanableResource;
-Ljava/util/zip/ZipFile$InflaterCleanupAction;
-Ljava/util/zip/ZipFile$Source$End-IA;
-Ljava/util/zip/ZipFile$Source$End;
-Ljava/util/zip/ZipFile$Source$Key;
-Ljava/util/zip/ZipFile$Source;
-Ljava/util/zip/ZipFile$ZipEntryIterator;
-Ljava/util/zip/ZipFile$ZipFileInflaterInputStream;
-Ljava/util/zip/ZipFile$ZipFileInputStream;
-Ljava/util/zip/ZipFile;
-Ljava/util/zip/ZipInputStream;
-Ljava/util/zip/ZipOutputStream;
-Ljava/util/zip/ZipUtils;
-Ljavax/crypto/AEADBadTagException;
-Ljavax/crypto/BadPaddingException;
-Ljavax/crypto/Cipher$CipherSpiAndProvider;
-Ljavax/crypto/Cipher$InitParams;
-Ljavax/crypto/Cipher$InitType;
-Ljavax/crypto/Cipher$NeedToSet;
-Ljavax/crypto/Cipher$SpiAndProviderUpdater;
-Ljavax/crypto/Cipher$Transform;
-Ljavax/crypto/Cipher;
-Ljavax/crypto/CipherInputStream;
-Ljavax/crypto/CipherOutputStream;
-Ljavax/crypto/CipherSpi;
-Ljavax/crypto/CryptoPermissions;
-Ljavax/crypto/IllegalBlockSizeException;
-Ljavax/crypto/JarVerifier$1;
-Ljavax/crypto/JarVerifier;
-Ljavax/crypto/JceSecurity$1;
-Ljavax/crypto/JceSecurity;
-Ljavax/crypto/KeyAgreement;
-Ljavax/crypto/KeyAgreementSpi;
-Ljavax/crypto/KeyGenerator;
-Ljavax/crypto/KeyGeneratorSpi;
-Ljavax/crypto/Mac;
-Ljavax/crypto/MacSpi;
-Ljavax/crypto/NoSuchPaddingException;
-Ljavax/crypto/NullCipher;
-Ljavax/crypto/SecretKey;
-Ljavax/crypto/SecretKeyFactory;
-Ljavax/crypto/SecretKeyFactorySpi;
-Ljavax/crypto/ShortBufferException;
-Ljavax/crypto/interfaces/DHKey;
-Ljavax/crypto/interfaces/DHPrivateKey;
-Ljavax/crypto/interfaces/DHPublicKey;
-Ljavax/crypto/interfaces/PBEKey;
-Ljavax/crypto/spec/DESKeySpec;
-Ljavax/crypto/spec/DESedeKeySpec;
-Ljavax/crypto/spec/DHParameterSpec;
-Ljavax/crypto/spec/DHPrivateKeySpec;
-Ljavax/crypto/spec/DHPublicKeySpec;
-Ljavax/crypto/spec/GCMParameterSpec;
-Ljavax/crypto/spec/IvParameterSpec;
-Ljavax/crypto/spec/OAEPParameterSpec;
-Ljavax/crypto/spec/PBEKeySpec;
-Ljavax/crypto/spec/PBEParameterSpec;
-Ljavax/crypto/spec/PSource$PSpecified;
-Ljavax/crypto/spec/PSource;
-Ljavax/crypto/spec/SecretKeySpec;
-Ljavax/microedition/khronos/egl/EGL10;
-Ljavax/microedition/khronos/egl/EGL11;
-Ljavax/microedition/khronos/egl/EGL;
-Ljavax/microedition/khronos/egl/EGLConfig;
-Ljavax/microedition/khronos/egl/EGLContext;
-Ljavax/microedition/khronos/egl/EGLDisplay;
-Ljavax/microedition/khronos/egl/EGLSurface;
-Ljavax/microedition/khronos/opengles/GL10;
-Ljavax/microedition/khronos/opengles/GL10Ext;
-Ljavax/microedition/khronos/opengles/GL11;
-Ljavax/microedition/khronos/opengles/GL11Ext;
-Ljavax/microedition/khronos/opengles/GL11ExtensionPack;
-Ljavax/microedition/khronos/opengles/GL;
-Ljavax/net/DefaultSocketFactory;
-Ljavax/net/ServerSocketFactory;
-Ljavax/net/SocketFactory;
-Ljavax/net/ssl/DefaultSSLServerSocketFactory;
-Ljavax/net/ssl/DefaultSSLSocketFactory;
-Ljavax/net/ssl/ExtendedSSLSession;
-Ljavax/net/ssl/HandshakeCompletedEvent;
-Ljavax/net/ssl/HandshakeCompletedListener;
-Ljavax/net/ssl/HostnameVerifier;
-Ljavax/net/ssl/HttpsURLConnection$NoPreloadHolder;
-Ljavax/net/ssl/HttpsURLConnection;
-Ljavax/net/ssl/KeyManager;
-Ljavax/net/ssl/KeyManagerFactory$1;
-Ljavax/net/ssl/KeyManagerFactory;
-Ljavax/net/ssl/KeyManagerFactorySpi;
-Ljavax/net/ssl/ManagerFactoryParameters;
-Ljavax/net/ssl/SNIHostName;
-Ljavax/net/ssl/SNIMatcher;
-Ljavax/net/ssl/SNIServerName;
-Ljavax/net/ssl/SSLContext;
-Ljavax/net/ssl/SSLContextSpi;
-Ljavax/net/ssl/SSLEngine;
-Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
-Ljavax/net/ssl/SSLEngineResult$Status;
-Ljavax/net/ssl/SSLEngineResult;
-Ljavax/net/ssl/SSLException;
-Ljavax/net/ssl/SSLHandshakeException;
-Ljavax/net/ssl/SSLParameters;
-Ljavax/net/ssl/SSLPeerUnverifiedException;
-Ljavax/net/ssl/SSLPermission;
-Ljavax/net/ssl/SSLProtocolException;
-Ljavax/net/ssl/SSLServerSocket;
-Ljavax/net/ssl/SSLServerSocketFactory;
-Ljavax/net/ssl/SSLSession;
-Ljavax/net/ssl/SSLSessionBindingEvent;
-Ljavax/net/ssl/SSLSessionBindingListener;
-Ljavax/net/ssl/SSLSessionContext;
-Ljavax/net/ssl/SSLSocket;
-Ljavax/net/ssl/SSLSocketFactory$1;
-Ljavax/net/ssl/SSLSocketFactory;
-Ljavax/net/ssl/StandardConstants;
-Ljavax/net/ssl/TrustManager;
-Ljavax/net/ssl/TrustManagerFactory$1;
-Ljavax/net/ssl/TrustManagerFactory;
-Ljavax/net/ssl/TrustManagerFactorySpi;
-Ljavax/net/ssl/X509ExtendedKeyManager;
-Ljavax/net/ssl/X509ExtendedTrustManager;
-Ljavax/net/ssl/X509KeyManager;
-Ljavax/net/ssl/X509TrustManager;
-Ljavax/security/auth/Destroyable;
-Ljavax/security/auth/callback/Callback;
-Ljavax/security/auth/callback/CallbackHandler;
-Ljavax/security/auth/callback/PasswordCallback;
-Ljavax/security/auth/callback/UnsupportedCallbackException;
-Ljavax/security/auth/x500/X500Principal;
-Ljavax/security/cert/Certificate;
-Ljavax/security/cert/CertificateEncodingException;
-Ljavax/security/cert/CertificateException;
-Ljavax/security/cert/X509Certificate$1;
-Ljavax/security/cert/X509Certificate;
-Ljavax/sip/ClientTransaction;
-Ljavax/sip/Dialog;
-Ljavax/sip/DialogDoesNotExistException;
-Ljavax/sip/DialogState;
-Ljavax/sip/DialogTerminatedEvent;
-Ljavax/sip/IOExceptionEvent;
-Ljavax/sip/InvalidArgumentException;
-Ljavax/sip/ListeningPoint;
-Ljavax/sip/ObjectInUseException;
-Ljavax/sip/PeerUnavailableException;
-Ljavax/sip/ProviderDoesNotExistException;
-Ljavax/sip/RequestEvent;
-Ljavax/sip/ResponseEvent;
-Ljavax/sip/ServerTransaction;
-Ljavax/sip/SipException;
-Ljavax/sip/SipFactory;
-Ljavax/sip/SipListener;
-Ljavax/sip/SipProvider;
-Ljavax/sip/SipStack;
-Ljavax/sip/Timeout;
-Ljavax/sip/TimeoutEvent;
-Ljavax/sip/Transaction;
-Ljavax/sip/TransactionAlreadyExistsException;
-Ljavax/sip/TransactionDoesNotExistException;
-Ljavax/sip/TransactionState;
-Ljavax/sip/TransactionTerminatedEvent;
-Ljavax/sip/TransactionUnavailableException;
-Ljavax/sip/TransportNotSupportedException;
-Ljavax/sip/address/Address;
-Ljavax/sip/address/AddressFactory;
-Ljavax/sip/address/Hop;
-Ljavax/sip/address/Router;
-Ljavax/sip/address/SipURI;
-Ljavax/sip/address/TelURL;
-Ljavax/sip/address/URI;
-Ljavax/sip/header/AcceptEncodingHeader;
-Ljavax/sip/header/AcceptHeader;
-Ljavax/sip/header/AcceptLanguageHeader;
-Ljavax/sip/header/AlertInfoHeader;
-Ljavax/sip/header/AllowEventsHeader;
-Ljavax/sip/header/AllowHeader;
-Ljavax/sip/header/AuthenticationInfoHeader;
-Ljavax/sip/header/AuthorizationHeader;
-Ljavax/sip/header/CSeqHeader;
-Ljavax/sip/header/CallIdHeader;
-Ljavax/sip/header/CallInfoHeader;
-Ljavax/sip/header/ContactHeader;
-Ljavax/sip/header/ContentDispositionHeader;
-Ljavax/sip/header/ContentEncodingHeader;
-Ljavax/sip/header/ContentLanguageHeader;
-Ljavax/sip/header/ContentLengthHeader;
-Ljavax/sip/header/ContentTypeHeader;
-Ljavax/sip/header/DateHeader;
-Ljavax/sip/header/Encoding;
-Ljavax/sip/header/ErrorInfoHeader;
-Ljavax/sip/header/EventHeader;
-Ljavax/sip/header/ExpiresHeader;
-Ljavax/sip/header/ExtensionHeader;
-Ljavax/sip/header/FromHeader;
-Ljavax/sip/header/Header;
-Ljavax/sip/header/HeaderAddress;
-Ljavax/sip/header/HeaderFactory;
-Ljavax/sip/header/InReplyToHeader;
-Ljavax/sip/header/MaxForwardsHeader;
-Ljavax/sip/header/MediaType;
-Ljavax/sip/header/MimeVersionHeader;
-Ljavax/sip/header/MinExpiresHeader;
-Ljavax/sip/header/OptionTag;
-Ljavax/sip/header/OrganizationHeader;
-Ljavax/sip/header/Parameters;
-Ljavax/sip/header/PriorityHeader;
-Ljavax/sip/header/ProxyAuthenticateHeader;
-Ljavax/sip/header/ProxyAuthorizationHeader;
-Ljavax/sip/header/ProxyRequireHeader;
-Ljavax/sip/header/RAckHeader;
-Ljavax/sip/header/RSeqHeader;
-Ljavax/sip/header/ReasonHeader;
-Ljavax/sip/header/RecordRouteHeader;
-Ljavax/sip/header/ReferToHeader;
-Ljavax/sip/header/ReplyToHeader;
-Ljavax/sip/header/RequireHeader;
-Ljavax/sip/header/RetryAfterHeader;
-Ljavax/sip/header/RouteHeader;
-Ljavax/sip/header/SIPETagHeader;
-Ljavax/sip/header/SIPIfMatchHeader;
-Ljavax/sip/header/ServerHeader;
-Ljavax/sip/header/SubjectHeader;
-Ljavax/sip/header/SubscriptionStateHeader;
-Ljavax/sip/header/SupportedHeader;
-Ljavax/sip/header/TimeStampHeader;
-Ljavax/sip/header/ToHeader;
-Ljavax/sip/header/TooManyHopsException;
-Ljavax/sip/header/UnsupportedHeader;
-Ljavax/sip/header/UserAgentHeader;
-Ljavax/sip/header/ViaHeader;
-Ljavax/sip/header/WWWAuthenticateHeader;
-Ljavax/sip/header/WarningHeader;
-Ljavax/sip/message/Message;
-Ljavax/sip/message/MessageFactory;
-Ljavax/sip/message/Request;
-Ljavax/sip/message/Response;
-Ljavax/xml/datatype/DatatypeConfigurationException;
-Ljavax/xml/datatype/DatatypeConstants$Field;
-Ljavax/xml/datatype/DatatypeConstants;
-Ljavax/xml/datatype/Duration;
-Ljavax/xml/namespace/QName;
-Ljavax/xml/parsers/DocumentBuilder;
-Ljavax/xml/parsers/DocumentBuilderFactory;
-Ljavax/xml/parsers/ParserConfigurationException;
-Ljavax/xml/parsers/SAXParser;
-Ljavax/xml/parsers/SAXParserFactory;
-Ljdk/internal/access/JavaIOFileDescriptorAccess;
-Ljdk/internal/access/JavaObjectInputStreamAccess;
-Ljdk/internal/access/JavaUtilCollectionAccess;
-Ljdk/internal/access/SharedSecrets;
-Ljdk/internal/math/FDBigInteger;
-Ljdk/internal/math/FloatingDecimal$1;
-Ljdk/internal/math/FloatingDecimal$ASCIIToBinaryConverter;
-Ljdk/internal/math/FloatingDecimal$BinaryToASCIIConverter;
-Ljdk/internal/math/FloatingDecimal$ExceptionalBinaryToASCIIBuffer;
-Ljdk/internal/math/FloatingDecimal$HexFloatPattern;
-Ljdk/internal/math/FloatingDecimal;
-Ljdk/internal/math/FormattedFloatingDecimal$1;
-Ljdk/internal/math/FormattedFloatingDecimal$Form;
-Ljdk/internal/math/FormattedFloatingDecimal;
-Ljdk/internal/misc/TerminatingThreadLocal$1;
-Ljdk/internal/misc/TerminatingThreadLocal;
-Ljdk/internal/misc/Unsafe;
-Ljdk/internal/misc/UnsafeConstants;
-Ljdk/internal/misc/VM;
-Ljdk/internal/ref/CleanerFactory;
-Ljdk/internal/ref/CleanerImpl$PhantomCleanableRef;
-Ljdk/internal/ref/CleanerImpl;
-Ljdk/internal/ref/PhantomCleanable;
-Ljdk/internal/reflect/Reflection;
-Ljdk/internal/util/ArraysSupport;
-Ljdk/internal/util/NullableKeyValueHolder;
-Ljdk/internal/util/Preconditions;
-Ljdk/internal/util/StaticProperty;
-Ljdk/internal/util/random/RandomSupport;
-Llibcore/content/type/MimeMap$$ExternalSyntheticLambda0;
-Llibcore/content/type/MimeMap$Builder$Element;
-Llibcore/content/type/MimeMap$Builder;
-Llibcore/content/type/MimeMap$MemoizingSupplier;
-Llibcore/content/type/MimeMap-IA;
-Llibcore/content/type/MimeMap;
-Llibcore/icu/CollationKeyICU;
-Llibcore/icu/DateIntervalFormat;
-Llibcore/icu/DecimalFormatData;
-Llibcore/icu/ICU;
-Llibcore/icu/LocaleData;
-Llibcore/icu/SimpleDateFormatData;
-Llibcore/icu/TimeZoneNames$1;
-Llibcore/icu/TimeZoneNames$ZoneStringsCache;
-Llibcore/icu/TimeZoneNames;
-Llibcore/internal/StringPool;
-Llibcore/io/AsynchronousCloseMonitor;
-Llibcore/io/BufferIterator;
-Llibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection$1;
-Llibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection;
-Llibcore/io/ClassPathURLStreamHandler;
-Llibcore/io/ForwardingOs;
-Llibcore/io/IoBridge;
-Llibcore/io/IoTracker$Mode;
-Llibcore/io/IoTracker;
-Llibcore/io/IoUtils$FileReader;
-Llibcore/io/IoUtils;
-Llibcore/io/Libcore;
-Llibcore/io/Linux;
-Llibcore/io/Memory;
-Llibcore/io/MemoryMappedFile;
-Llibcore/io/NioBufferIterator;
-Llibcore/io/Os;
-Llibcore/io/Streams;
-Llibcore/math/NativeBN;
-Llibcore/net/InetAddressUtils;
-Llibcore/net/NetworkSecurityPolicy$DefaultNetworkSecurityPolicy;
-Llibcore/net/NetworkSecurityPolicy;
-Llibcore/net/event/NetworkEventDispatcher;
-Llibcore/net/event/NetworkEventListener;
-Llibcore/net/http/Dns;
-Llibcore/net/http/HttpDate$1;
-Llibcore/net/http/HttpDate;
-Llibcore/net/http/HttpURLConnectionFactory;
-Llibcore/reflect/AnnotatedElements;
-Llibcore/reflect/AnnotationFactory;
-Llibcore/reflect/AnnotationMember$DefaultValues;
-Llibcore/reflect/AnnotationMember;
-Llibcore/reflect/GenericArrayTypeImpl;
-Llibcore/reflect/GenericSignatureParser;
-Llibcore/reflect/ListOfTypes;
-Llibcore/reflect/ListOfVariables;
-Llibcore/reflect/ParameterizedTypeImpl;
-Llibcore/reflect/RecordComponents;
-Llibcore/reflect/TypeVariableImpl;
-Llibcore/reflect/Types;
-Llibcore/reflect/WildcardTypeImpl;
-Llibcore/util/ArrayUtils;
-Llibcore/util/BasicLruCache;
-Llibcore/util/CharsetUtils;
-Llibcore/util/CollectionUtils;
-Llibcore/util/EmptyArray;
-Llibcore/util/FP16;
-Llibcore/util/HexEncoding;
-Llibcore/util/NativeAllocationRegistry$CleanerRunner;
-Llibcore/util/NativeAllocationRegistry$CleanerThunk;
-Llibcore/util/Objects;
-Llibcore/util/SneakyThrow;
-Llibcore/util/XmlObjectFactory;
-Lorg/apache/harmony/dalvik/ddmc/Chunk;
-Lorg/apache/harmony/dalvik/ddmc/ChunkHandler;
-Lorg/apache/harmony/dalvik/ddmc/DdmServer;
-Lorg/apache/harmony/dalvik/ddmc/DdmVmInternal;
-Lorg/apache/harmony/xml/ExpatAttributes;
-Lorg/apache/harmony/xml/ExpatException;
-Lorg/apache/harmony/xml/ExpatParser$CurrentAttributes-IA;
-Lorg/apache/harmony/xml/ExpatParser$CurrentAttributes;
-Lorg/apache/harmony/xml/ExpatParser$ExpatLocator-IA;
-Lorg/apache/harmony/xml/ExpatParser$ExpatLocator;
-Lorg/apache/harmony/xml/ExpatParser$ParseException;
-Lorg/apache/harmony/xml/ExpatParser;
-Lorg/apache/harmony/xml/ExpatReader;
-Lorg/apache/harmony/xml/dom/AttrImpl;
-Lorg/apache/harmony/xml/dom/CDATASectionImpl;
-Lorg/apache/harmony/xml/dom/CharacterDataImpl;
-Lorg/apache/harmony/xml/dom/CommentImpl;
-Lorg/apache/harmony/xml/dom/DOMImplementationImpl;
-Lorg/apache/harmony/xml/dom/DocumentTypeImpl;
-Lorg/apache/harmony/xml/dom/EntityReferenceImpl;
-Lorg/apache/harmony/xml/dom/InnerNodeImpl;
-Lorg/apache/harmony/xml/dom/LeafNodeImpl;
-Lorg/apache/harmony/xml/dom/NodeImpl$1;
-Lorg/apache/harmony/xml/dom/NodeImpl;
-Lorg/apache/harmony/xml/dom/NodeListImpl;
-Lorg/apache/harmony/xml/dom/ProcessingInstructionImpl;
-Lorg/apache/harmony/xml/parsers/DocumentBuilderFactoryImpl;
-Lorg/apache/harmony/xml/parsers/DocumentBuilderImpl;
-Lorg/apache/harmony/xml/parsers/SAXParserFactoryImpl;
-Lorg/apache/harmony/xml/parsers/SAXParserImpl;
-Lorg/apache/http/conn/ConnectTimeoutException;
-Lorg/apache/http/conn/scheme/HostNameResolver;
-Lorg/apache/http/conn/scheme/LayeredSocketFactory;
-Lorg/apache/http/conn/scheme/SocketFactory;
-Lorg/apache/http/conn/ssl/AbstractVerifier;
-Lorg/apache/http/conn/ssl/AllowAllHostnameVerifier;
-Lorg/apache/http/conn/ssl/AndroidDistinguishedNameParser;
-Lorg/apache/http/conn/ssl/BrowserCompatHostnameVerifier;
-Lorg/apache/http/conn/ssl/SSLSocketFactory$NoPreloadHolder;
-Lorg/apache/http/conn/ssl/SSLSocketFactory;
-Lorg/apache/http/conn/ssl/StrictHostnameVerifier;
-Lorg/apache/http/conn/ssl/X509HostnameVerifier;
-Lorg/apache/http/params/CoreConnectionPNames;
-Lorg/apache/http/params/HttpConnectionParams;
-Lorg/apache/http/params/HttpParams;
-Lorg/ccil/cowan/tagsoup/AutoDetector;
-Lorg/ccil/cowan/tagsoup/CommandLine;
-Lorg/ccil/cowan/tagsoup/Element;
-Lorg/ccil/cowan/tagsoup/ElementType;
-Lorg/ccil/cowan/tagsoup/HTMLModels;
-Lorg/ccil/cowan/tagsoup/HTMLScanner;
-Lorg/ccil/cowan/tagsoup/HTMLSchema;
-Lorg/ccil/cowan/tagsoup/PYXScanner;
-Lorg/ccil/cowan/tagsoup/PYXWriter;
-Lorg/ccil/cowan/tagsoup/Parser$1;
-Lorg/ccil/cowan/tagsoup/Parser;
-Lorg/ccil/cowan/tagsoup/ScanHandler;
-Lorg/ccil/cowan/tagsoup/Scanner;
-Lorg/ccil/cowan/tagsoup/Schema;
-Lorg/ccil/cowan/tagsoup/XMLWriter;
-Lorg/ccil/cowan/tagsoup/jaxp/JAXPTest;
-Lorg/ccil/cowan/tagsoup/jaxp/SAX1ParserAdapter$AttributesWrapper;
-Lorg/ccil/cowan/tagsoup/jaxp/SAX1ParserAdapter$DocHandlerWrapper;
-Lorg/ccil/cowan/tagsoup/jaxp/SAX1ParserAdapter;
-Lorg/ccil/cowan/tagsoup/jaxp/SAXFactoryImpl;
-Lorg/ccil/cowan/tagsoup/jaxp/SAXParserImpl;
-Lorg/json/JSON;
-Lorg/json/JSONArray;
-Lorg/json/JSONException;
-Lorg/json/JSONObject$1;
-Lorg/json/JSONObject;
-Lorg/json/JSONStringer$Scope;
-Lorg/json/JSONStringer;
-Lorg/json/JSONTokener;
-Lorg/w3c/dom/Attr;
-Lorg/w3c/dom/CDATASection;
-Lorg/w3c/dom/CharacterData;
-Lorg/w3c/dom/Comment;
-Lorg/w3c/dom/DOMException;
-Lorg/w3c/dom/DOMImplementation;
-Lorg/w3c/dom/Document;
-Lorg/w3c/dom/DocumentFragment;
-Lorg/w3c/dom/DocumentType;
-Lorg/w3c/dom/Element;
-Lorg/w3c/dom/EntityReference;
-Lorg/w3c/dom/Node;
-Lorg/w3c/dom/NodeList;
-Lorg/w3c/dom/ProcessingInstruction;
-Lorg/w3c/dom/Text;
-Lorg/w3c/dom/TypeInfo;
-Lorg/xml/sax/AttributeList;
-Lorg/xml/sax/Attributes;
-Lorg/xml/sax/ContentHandler;
-Lorg/xml/sax/DTDHandler;
-Lorg/xml/sax/DocumentHandler;
-Lorg/xml/sax/EntityResolver;
-Lorg/xml/sax/ErrorHandler;
-Lorg/xml/sax/InputSource;
-Lorg/xml/sax/Locator;
-Lorg/xml/sax/Parser;
-Lorg/xml/sax/SAXException;
-Lorg/xml/sax/SAXNotRecognizedException;
-Lorg/xml/sax/SAXNotSupportedException;
-Lorg/xml/sax/SAXParseException;
-Lorg/xml/sax/XMLFilter;
-Lorg/xml/sax/XMLReader;
-Lorg/xml/sax/ext/DeclHandler;
-Lorg/xml/sax/ext/DefaultHandler2;
-Lorg/xml/sax/ext/EntityResolver2;
-Lorg/xml/sax/ext/LexicalHandler;
-Lorg/xml/sax/helpers/AttributesImpl;
-Lorg/xml/sax/helpers/DefaultHandler;
-Lorg/xml/sax/helpers/LocatorImpl;
-Lorg/xml/sax/helpers/NamespaceSupport;
-Lorg/xml/sax/helpers/XMLFilterImpl;
-Lorg/xmlpull/v1/XmlPullParser;
-Lorg/xmlpull/v1/XmlPullParserException;
-Lorg/xmlpull/v1/XmlPullParserFactory;
-Lorg/xmlpull/v1/XmlSerializer;
-Lsun/invoke/util/BytecodeDescriptor;
-Lsun/invoke/util/VerifyAccess;
-Lsun/invoke/util/Wrapper$Format;
-Lsun/invoke/util/Wrapper;
-Lsun/misc/ASCIICaseInsensitiveComparator;
-Lsun/misc/CharacterEncoder;
-Lsun/misc/Cleaner$1;
-Lsun/misc/Cleaner;
-Lsun/misc/CompoundEnumeration;
-Lsun/misc/HexDumpEncoder;
-Lsun/misc/IOUtils;
-Lsun/misc/LRUCache;
-Lsun/misc/Unsafe;
-Lsun/misc/VM;
-Lsun/misc/Version;
-Lsun/net/ConnectionResetException;
-Lsun/net/NetHooks;
-Lsun/net/NetProperties$1;
-Lsun/net/NetProperties;
-Lsun/net/ResourceManager;
-Lsun/net/SocksProxy;
-Lsun/net/spi/DefaultProxySelector$1;
-Lsun/net/spi/DefaultProxySelector$NonProxyInfo;
-Lsun/net/spi/DefaultProxySelector;
-Lsun/net/spi/nameservice/NameService;
-Lsun/net/util/IPAddressUtil;
-Lsun/net/www/ParseUtil;
-Lsun/net/www/protocol/file/Handler;
-Lsun/net/www/protocol/ftp/Handler;
-Lsun/net/www/protocol/jar/Handler;
-Lsun/nio/ch/AbstractPollArrayWrapper;
-Lsun/nio/ch/AbstractPollSelectorImpl;
-Lsun/nio/ch/AllocatedNativeObject;
-Lsun/nio/ch/AsynchronousFileChannelImpl;
-Lsun/nio/ch/ChannelInputStream;
-Lsun/nio/ch/DatagramChannelImpl;
-Lsun/nio/ch/DatagramDispatcher;
-Lsun/nio/ch/DefaultSelectorProvider;
-Lsun/nio/ch/DirectBuffer;
-Lsun/nio/ch/FileChannelImpl$SimpleFileLockTable;
-Lsun/nio/ch/FileChannelImpl$Unmapper-IA;
-Lsun/nio/ch/FileChannelImpl$Unmapper;
-Lsun/nio/ch/FileDescriptorHolderSocketImpl;
-Lsun/nio/ch/FileDispatcher;
-Lsun/nio/ch/FileDispatcherImpl;
-Lsun/nio/ch/FileKey;
-Lsun/nio/ch/FileLockImpl;
-Lsun/nio/ch/FileLockTable;
-Lsun/nio/ch/IOStatus;
-Lsun/nio/ch/IOUtil;
-Lsun/nio/ch/Interruptible;
-Lsun/nio/ch/LinuxAsynchronousChannelProvider;
-Lsun/nio/ch/NativeDispatcher;
-Lsun/nio/ch/NativeObject;
-Lsun/nio/ch/NativeThread;
-Lsun/nio/ch/NativeThreadSet;
-Lsun/nio/ch/Net$1;
-Lsun/nio/ch/Net$3;
-Lsun/nio/ch/Net;
-Lsun/nio/ch/PollArrayWrapper;
-Lsun/nio/ch/PollSelectorImpl;
-Lsun/nio/ch/PollSelectorProvider;
-Lsun/nio/ch/SelChImpl;
-Lsun/nio/ch/SelectionKeyImpl;
-Lsun/nio/ch/SelectorImpl;
-Lsun/nio/ch/SelectorProviderImpl;
-Lsun/nio/ch/ServerSocketChannelImpl;
-Lsun/nio/ch/SharedFileLockTable$FileLockReference;
-Lsun/nio/ch/SharedFileLockTable;
-Lsun/nio/ch/SocketAdaptor$1;
-Lsun/nio/ch/SocketAdaptor$2;
-Lsun/nio/ch/SocketAdaptor$SocketInputStream;
-Lsun/nio/ch/SocketAdaptor;
-Lsun/nio/ch/SocketChannelImpl;
-Lsun/nio/ch/SocketDispatcher;
-Lsun/nio/ch/Util$1;
-Lsun/nio/ch/Util$2;
-Lsun/nio/ch/Util$3;
-Lsun/nio/ch/Util$BufferCache;
-Lsun/nio/ch/Util;
-Lsun/nio/cs/ArrayDecoder;
-Lsun/nio/cs/ArrayEncoder;
-Lsun/nio/cs/StreamDecoder;
-Lsun/nio/cs/StreamEncoder;
-Lsun/nio/cs/ThreadLocalCoders$1;
-Lsun/nio/cs/ThreadLocalCoders$2;
-Lsun/nio/cs/ThreadLocalCoders$Cache;
-Lsun/nio/cs/ThreadLocalCoders;
-Lsun/nio/fs/AbstractBasicFileAttributeView;
-Lsun/nio/fs/AbstractFileSystemProvider;
-Lsun/nio/fs/AbstractPath;
-Lsun/nio/fs/DefaultFileSystemProvider;
-Lsun/nio/fs/DynamicFileAttributeView;
-Lsun/nio/fs/FileOwnerAttributeViewImpl;
-Lsun/nio/fs/LinuxFileSystemProvider;
-Lsun/nio/fs/NativeBuffer$Deallocator;
-Lsun/nio/fs/NativeBuffer;
-Lsun/nio/fs/NativeBuffers;
-Lsun/nio/fs/UnixChannelFactory$1;
-Lsun/nio/fs/UnixChannelFactory$Flags;
-Lsun/nio/fs/UnixChannelFactory;
-Lsun/nio/fs/UnixConstants;
-Lsun/nio/fs/UnixDirectoryStream$UnixDirectoryIterator;
-Lsun/nio/fs/UnixDirectoryStream;
-Lsun/nio/fs/UnixException;
-Lsun/nio/fs/UnixFileAttributeViews$Basic;
-Lsun/nio/fs/UnixFileAttributeViews$Posix;
-Lsun/nio/fs/UnixFileAttributeViews;
-Lsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;
-Lsun/nio/fs/UnixFileAttributes;
-Lsun/nio/fs/UnixFileKey;
-Lsun/nio/fs/UnixFileModeAttribute;
-Lsun/nio/fs/UnixFileStoreAttributes;
-Lsun/nio/fs/UnixFileSystem;
-Lsun/nio/fs/UnixFileSystemProvider$3;
-Lsun/nio/fs/UnixFileSystemProvider;
-Lsun/nio/fs/UnixMountEntry;
-Lsun/nio/fs/UnixNativeDispatcher;
-Lsun/nio/fs/UnixSecureDirectoryStream;
-Lsun/nio/fs/Util;
-Lsun/reflect/Reflection;
-Lsun/reflect/misc/ReflectUtil;
-Lsun/security/action/GetBooleanAction;
-Lsun/security/action/GetIntegerAction;
-Lsun/security/action/GetPropertyAction;
-Lsun/security/jca/GetInstance$Instance-IA;
-Lsun/security/jca/GetInstance$Instance;
-Lsun/security/jca/GetInstance;
-Lsun/security/jca/JCAUtil$CachedSecureRandomHolder;
-Lsun/security/jca/JCAUtil;
-Lsun/security/jca/ProviderConfig$1;
-Lsun/security/jca/ProviderConfig$2;
-Lsun/security/jca/ProviderConfig$3;
-Lsun/security/jca/ProviderConfig;
-Lsun/security/jca/ProviderList$1;
-Lsun/security/jca/ProviderList$2;
-Lsun/security/jca/ProviderList$3;
-Lsun/security/jca/ProviderList$ServiceList$1;
-Lsun/security/jca/ProviderList$ServiceList;
-Lsun/security/jca/ProviderList;
-Lsun/security/jca/Providers;
-Lsun/security/jca/ServiceId;
-Lsun/security/pkcs/ContentInfo;
-Lsun/security/pkcs/ESSCertId;
-Lsun/security/pkcs/PKCS7$VerbatimX509Certificate;
-Lsun/security/pkcs/PKCS7$WrappedX509Certificate;
-Lsun/security/pkcs/PKCS7;
-Lsun/security/pkcs/PKCS9Attribute;
-Lsun/security/pkcs/PKCS9Attributes;
-Lsun/security/pkcs/ParsingException;
-Lsun/security/pkcs/SignerInfo;
-Lsun/security/provider/CertPathProvider;
-Lsun/security/provider/X509Factory;
-Lsun/security/provider/certpath/AdaptableX509CertSelector;
-Lsun/security/provider/certpath/AlgorithmChecker;
-Lsun/security/provider/certpath/BasicChecker;
-Lsun/security/provider/certpath/CertId;
-Lsun/security/provider/certpath/CertPathHelper;
-Lsun/security/provider/certpath/ConstraintsChecker;
-Lsun/security/provider/certpath/KeyChecker;
-Lsun/security/provider/certpath/OCSP$RevocationStatus$CertStatus;
-Lsun/security/provider/certpath/OCSP$RevocationStatus;
-Lsun/security/provider/certpath/OCSP;
-Lsun/security/provider/certpath/OCSPResponse$ResponseStatus;
-Lsun/security/provider/certpath/OCSPResponse$SingleResponse-IA;
-Lsun/security/provider/certpath/OCSPResponse$SingleResponse;
-Lsun/security/provider/certpath/OCSPResponse;
-Lsun/security/provider/certpath/PKIX$ValidatorParams;
-Lsun/security/provider/certpath/PKIX;
-Lsun/security/provider/certpath/PKIXCertPathValidator;
-Lsun/security/provider/certpath/PKIXMasterCertPathValidator;
-Lsun/security/provider/certpath/PolicyChecker;
-Lsun/security/provider/certpath/PolicyNodeImpl;
-Lsun/security/provider/certpath/RevocationChecker$1;
-Lsun/security/provider/certpath/RevocationChecker$2;
-Lsun/security/provider/certpath/RevocationChecker$Mode;
-Lsun/security/provider/certpath/RevocationChecker$RevocationProperties-IA;
-Lsun/security/provider/certpath/RevocationChecker$RevocationProperties;
-Lsun/security/provider/certpath/RevocationChecker;
-Lsun/security/timestamp/TimestampToken;
-Lsun/security/util/AbstractAlgorithmConstraints$1;
-Lsun/security/util/AbstractAlgorithmConstraints;
-Lsun/security/util/AlgorithmDecomposer;
-Lsun/security/util/AnchorCertificates$1;
-Lsun/security/util/AnchorCertificates;
-Lsun/security/util/BitArray;
-Lsun/security/util/ByteArrayLexOrder;
-Lsun/security/util/ByteArrayTagOrder;
-Lsun/security/util/Cache$EqualByteArray;
-Lsun/security/util/Cache;
-Lsun/security/util/CertConstraintParameters;
-Lsun/security/util/Debug;
-Lsun/security/util/DerEncoder;
-Lsun/security/util/DerIndefLenConverter;
-Lsun/security/util/DerInputBuffer;
-Lsun/security/util/DerInputStream;
-Lsun/security/util/DerOutputStream;
-Lsun/security/util/DerValue;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraints;
-Lsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint;
-Lsun/security/util/DisabledAlgorithmConstraints$jdkCAConstraint;
-Lsun/security/util/DisabledAlgorithmConstraints;
-Lsun/security/util/FilePaths;
-Lsun/security/util/KeyUtil;
-Lsun/security/util/Length;
-Lsun/security/util/ManifestDigester$Entry;
-Lsun/security/util/ManifestDigester$Position;
-Lsun/security/util/ManifestDigester;
-Lsun/security/util/ManifestEntryVerifier$SunProviderHolder;
-Lsun/security/util/ManifestEntryVerifier;
-Lsun/security/util/MemoryCache$CacheEntry;
-Lsun/security/util/MemoryCache$HardCacheEntry;
-Lsun/security/util/MemoryCache$SoftCacheEntry;
-Lsun/security/util/MemoryCache;
-Lsun/security/util/ObjectIdentifier;
-Lsun/security/util/PropertyExpander;
-Lsun/security/util/Resources;
-Lsun/security/util/ResourcesMgr$1;
-Lsun/security/util/ResourcesMgr;
-Lsun/security/util/SecurityConstants;
-Lsun/security/util/SignatureFileVerifier;
-Lsun/security/x509/AVA;
-Lsun/security/x509/AVAComparator;
-Lsun/security/x509/AVAKeyword;
-Lsun/security/x509/AccessDescription;
-Lsun/security/x509/AlgorithmId;
-Lsun/security/x509/AuthorityInfoAccessExtension;
-Lsun/security/x509/AuthorityKeyIdentifierExtension;
-Lsun/security/x509/BasicConstraintsExtension;
-Lsun/security/x509/CRLDistributionPointsExtension;
-Lsun/security/x509/CRLNumberExtension;
-Lsun/security/x509/CRLReasonCodeExtension;
-Lsun/security/x509/CertAttrSet;
-Lsun/security/x509/CertificateAlgorithmId;
-Lsun/security/x509/CertificateExtensions;
-Lsun/security/x509/CertificateIssuerExtension;
-Lsun/security/x509/CertificatePoliciesExtension;
-Lsun/security/x509/CertificatePolicyId;
-Lsun/security/x509/CertificatePolicyMap;
-Lsun/security/x509/CertificatePolicySet;
-Lsun/security/x509/CertificateSerialNumber;
-Lsun/security/x509/CertificateValidity;
-Lsun/security/x509/CertificateVersion;
-Lsun/security/x509/CertificateX509Key;
-Lsun/security/x509/DNSName;
-Lsun/security/x509/DeltaCRLIndicatorExtension;
-Lsun/security/x509/DistributionPoint;
-Lsun/security/x509/EDIPartyName;
-Lsun/security/x509/ExtendedKeyUsageExtension;
-Lsun/security/x509/Extension;
-Lsun/security/x509/FreshestCRLExtension;
-Lsun/security/x509/GeneralName;
-Lsun/security/x509/GeneralNameInterface;
-Lsun/security/x509/GeneralNames;
-Lsun/security/x509/IPAddressName;
-Lsun/security/x509/InhibitAnyPolicyExtension;
-Lsun/security/x509/IssuerAlternativeNameExtension;
-Lsun/security/x509/IssuingDistributionPointExtension;
-Lsun/security/x509/KeyIdentifier;
-Lsun/security/x509/KeyUsageExtension;
-Lsun/security/x509/NameConstraintsExtension;
-Lsun/security/x509/NetscapeCertTypeExtension$MapEntry;
-Lsun/security/x509/NetscapeCertTypeExtension;
-Lsun/security/x509/OCSPNoCheckExtension;
-Lsun/security/x509/OIDMap$OIDInfo;
-Lsun/security/x509/OIDMap;
-Lsun/security/x509/OIDName;
-Lsun/security/x509/OtherName;
-Lsun/security/x509/PKIXExtensions;
-Lsun/security/x509/PolicyConstraintsExtension;
-Lsun/security/x509/PolicyInformation;
-Lsun/security/x509/PolicyMappingsExtension;
-Lsun/security/x509/PrivateKeyUsageExtension;
-Lsun/security/x509/RDN;
-Lsun/security/x509/RFC822Name;
-Lsun/security/x509/SerialNumber;
-Lsun/security/x509/SubjectAlternativeNameExtension;
-Lsun/security/x509/SubjectInfoAccessExtension;
-Lsun/security/x509/SubjectKeyIdentifierExtension;
-Lsun/security/x509/URIName;
-Lsun/security/x509/UniqueIdentity;
-Lsun/security/x509/UnparseableExtension;
-Lsun/security/x509/X500Name$1;
-Lsun/security/x509/X500Name;
-Lsun/security/x509/X509AttributeName;
-Lsun/security/x509/X509CRLImpl;
-Lsun/security/x509/X509CertImpl;
-Lsun/security/x509/X509CertInfo;
-Lsun/security/x509/X509Key;
-Lsun/util/calendar/AbstractCalendar;
-Lsun/util/calendar/BaseCalendar$Date;
-Lsun/util/calendar/BaseCalendar;
-Lsun/util/calendar/CalendarDate;
-Lsun/util/calendar/CalendarSystem$GregorianHolder;
-Lsun/util/calendar/CalendarSystem;
-Lsun/util/calendar/CalendarUtils;
-Lsun/util/calendar/Era;
-Lsun/util/calendar/Gregorian$Date;
-Lsun/util/calendar/Gregorian;
-Lsun/util/calendar/ImmutableGregorianDate;
-Lsun/util/calendar/JulianCalendar$Date;
-Lsun/util/calendar/JulianCalendar;
-Lsun/util/calendar/LocalGregorianCalendar;
-Lsun/util/locale/BaseLocale$Cache;
-Lsun/util/locale/BaseLocale$Key-IA;
-Lsun/util/locale/BaseLocale$Key;
-Lsun/util/locale/BaseLocale-IA;
-Lsun/util/locale/BaseLocale;
-Lsun/util/locale/Extension;
-Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar-IA;
-Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar;
-Lsun/util/locale/InternalLocaleBuilder;
-Lsun/util/locale/LanguageTag;
-Lsun/util/locale/LocaleExtensions;
-Lsun/util/locale/LocaleMatcher;
-Lsun/util/locale/LocaleObjectCache$CacheEntry;
-Lsun/util/locale/LocaleObjectCache;
-Lsun/util/locale/LocaleSyntaxException;
-Lsun/util/locale/LocaleUtils;
-Lsun/util/locale/ParseStatus;
-Lsun/util/locale/StringTokenIterator;
-Lsun/util/locale/UnicodeLocaleExtension;
-Lsun/util/locale/provider/CalendarDataUtility;
-Lsun/util/logging/LoggingProxy;
-Lsun/util/logging/LoggingSupport$1;
-Lsun/util/logging/LoggingSupport$2;
-Lsun/util/logging/LoggingSupport;
-Lsun/util/logging/PlatformLogger$1;
-Lsun/util/logging/PlatformLogger$DefaultLoggerProxy;
-Lsun/util/logging/PlatformLogger$JavaLoggerProxy;
-Lsun/util/logging/PlatformLogger$Level;
-Lsun/util/logging/PlatformLogger$LoggerProxy;
-Lsun/util/logging/PlatformLogger;
-[B
-[C
-[D
-[F
-[I
-[J
-[Landroid/accounts/Account;
-[Landroid/accounts/AuthenticatorDescription;
-[Landroid/animation/Animator;
-[Landroid/animation/Keyframe$FloatKeyframe;
-[Landroid/animation/Keyframe$IntKeyframe;
-[Landroid/animation/Keyframe$ObjectKeyframe;
-[Landroid/animation/Keyframe;
-[Landroid/animation/PropertyValuesHolder;
-[Landroid/app/AppOpInfo;
-[Landroid/app/BackStackState;
-[Landroid/app/FragmentState;
-[Landroid/app/LoaderManagerImpl;
-[Landroid/app/Notification$Action;
-[Landroid/app/NotificationChannel;
-[Landroid/app/NotificationChannelGroup;
-[Landroid/app/Person;
-[Landroid/app/RemoteInput;
-[Landroid/app/RemoteInputHistoryItem;
-[Landroid/app/VoiceInteractor$Request;
-[Landroid/app/admin/PasswordMetrics$ComplexityBucket;
-[Landroid/app/assist/AssistStructure$ViewNode;
-[Landroid/app/job/JobInfo$TriggerContentUri;
-[Landroid/app/slice/SliceItem;
-[Landroid/app/slice/SliceSpec;
-[Landroid/audio/policy/configuration/V7_0/AudioUsage;
-[Landroid/content/AttributionSourceState;
-[Landroid/content/ComponentCallbacks;
-[Landroid/content/ComponentName;
-[Landroid/content/ContentProviderResult;
-[Landroid/content/ContentValues;
-[Landroid/content/Intent;
-[Landroid/content/IntentFilter;
-[Landroid/content/SyncAdapterType;
-[Landroid/content/UndoOwner;
-[Landroid/content/pm/ActivityInfo;
-[Landroid/content/pm/Attribution;
-[Landroid/content/pm/ConfigurationInfo;
-[Landroid/content/pm/FeatureGroupInfo;
-[Landroid/content/pm/FeatureInfo;
-[Landroid/content/pm/InstrumentationInfo;
-[Landroid/content/pm/PackageParser$NewPermissionInfo;
-[Landroid/content/pm/PackagePartitions$SystemPartition;
-[Landroid/content/pm/PathPermission;
-[Landroid/content/pm/PermissionInfo;
-[Landroid/content/pm/ProviderInfo;
-[Landroid/content/pm/ServiceInfo;
-[Landroid/content/pm/SharedLibraryInfo;
-[Landroid/content/pm/Signature;
-[Landroid/content/pm/VerifierInfo;
-[Landroid/content/res/ApkAssets;
-[Landroid/content/res/ColorStateList;
-[Landroid/content/res/Configuration;
-[Landroid/content/res/FontResourcesParser$FontFileResourceEntry;
-[Landroid/content/res/XmlBlock;
-[Landroid/content/res/loader/ResourcesLoader;
-[Landroid/content/res/loader/ResourcesProvider;
-[Landroid/database/Cursor;
-[Landroid/database/CursorWindow;
-[Landroid/database/sqlite/SQLiteConnection$Operation;
-[Landroid/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;
-[Landroid/graphics/Bitmap$CompressFormat;
-[Landroid/graphics/Bitmap$Config;
-[Landroid/graphics/Bitmap;
-[Landroid/graphics/BlendMode;
-[Landroid/graphics/BlurMaskFilter$Blur;
-[Landroid/graphics/Canvas$EdgeType;
-[Landroid/graphics/ColorSpace$Adaptation;
-[Landroid/graphics/ColorSpace$Model;
-[Landroid/graphics/ColorSpace$Named;
-[Landroid/graphics/ColorSpace$RenderIntent;
-[Landroid/graphics/ColorSpace;
-[Landroid/graphics/Insets;
-[Landroid/graphics/Interpolator$Result;
-[Landroid/graphics/Matrix$ScaleToFit;
-[Landroid/graphics/Matrix;
-[Landroid/graphics/Paint$Align;
-[Landroid/graphics/Paint$Cap;
-[Landroid/graphics/Paint$Join;
-[Landroid/graphics/Paint$Style;
-[Landroid/graphics/Path$Direction;
-[Landroid/graphics/Path$FillType;
-[Landroid/graphics/Path$Op;
-[Landroid/graphics/Point;
-[Landroid/graphics/PointF;
-[Landroid/graphics/PorterDuff$Mode;
-[Landroid/graphics/Rect;
-[Landroid/graphics/Region$Op;
-[Landroid/graphics/RenderNode$PositionUpdateListener;
-[Landroid/graphics/Shader$TileMode;
-[Landroid/graphics/Typeface;
-[Landroid/graphics/drawable/AdaptiveIconDrawable$ChildDrawable;
-[Landroid/graphics/drawable/Drawable;
-[Landroid/graphics/drawable/GradientDrawable$Orientation;
-[Landroid/graphics/drawable/LayerDrawable$ChildDrawable;
-[Landroid/graphics/drawable/RippleForeground;
-[Landroid/graphics/fonts/FontVariationAxis;
-[Landroid/hardware/CameraStatus;
-[Landroid/hardware/biometrics/BiometricSourceType;
-[Landroid/hardware/camera2/params/Capability;
-[Landroid/hardware/camera2/params/Face;
-[Landroid/hardware/camera2/params/HighSpeedVideoConfiguration;
-[Landroid/hardware/camera2/params/LensIntrinsicsSample;
-[Landroid/hardware/camera2/params/MandatoryStreamCombination$ReprocessType;
-[Landroid/hardware/camera2/params/MandatoryStreamCombination$SizeThreshold;
-[Landroid/hardware/camera2/params/MandatoryStreamCombination$StreamCombinationTemplate;
-[Landroid/hardware/camera2/params/MandatoryStreamCombination$StreamTemplate;
-[Landroid/hardware/camera2/params/MandatoryStreamCombination;
-[Landroid/hardware/camera2/params/MeteringRectangle;
-[Landroid/hardware/camera2/params/OisSample;
-[Landroid/hardware/camera2/params/RecommendedStreamConfiguration;
-[Landroid/hardware/camera2/params/StreamConfiguration;
-[Landroid/hardware/camera2/params/StreamConfigurationDuration;
-[Landroid/hardware/camera2/utils/ConcurrentCameraIdCombination;
-[Landroid/hardware/display/WifiDisplay;
-[Landroid/hardware/location/MemoryRegion;
-[Landroid/hardware/location/NanoAppRpcService;
-[Landroid/hardware/security/keymint/KeyParameter;
-[Landroid/icu/impl/CacheValue$Strength;
-[Landroid/icu/impl/CacheValue;
-[Landroid/icu/impl/CalType;
-[Landroid/icu/impl/CurrencyData$CurrencySpacingInfo$SpacingPattern;
-[Landroid/icu/impl/CurrencyData$CurrencySpacingInfo$SpacingType;
-[Landroid/icu/impl/DayPeriodRules$CutoffType;
-[Landroid/icu/impl/DayPeriodRules$DayPeriod;
-[Landroid/icu/impl/DayPeriodRules;
-[Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$CurrencySink$EntrypointTable;
-[Landroid/icu/impl/ICUResourceBundle$OpenType;
-[Landroid/icu/impl/LocaleDisplayNamesImpl$CapitalizationContextUsage;
-[Landroid/icu/impl/LocaleDisplayNamesImpl$DataTableType;
-[Landroid/icu/impl/StandardPlural;
-[Landroid/icu/impl/StaticUnicodeSets$Key;
-[Landroid/icu/impl/TimeZoneGenericNames$GenericNameType;
-[Landroid/icu/impl/TimeZoneGenericNames$Pattern;
-[Landroid/icu/impl/TimeZoneNamesImpl$ZNames$NameTypeIndex;
-[Landroid/icu/impl/Trie2$ValueWidth;
-[Landroid/icu/impl/UCharacterName$AlgorithmName;
-[Landroid/icu/impl/UCharacterProperty$BinaryProperty;
-[Landroid/icu/impl/UCharacterProperty$IntProperty;
-[Landroid/icu/impl/ValidIdentifiers$Datasubtype;
-[Landroid/icu/impl/ValidIdentifiers$Datatype;
-[Landroid/icu/impl/coll/CollationRuleParser$Position;
-[Landroid/icu/impl/coll/FCDIterCollationIterator$State;
-[Landroid/icu/impl/duration/TimeUnit;
-[Landroid/icu/impl/locale/KeyTypeData$KeyInfoType;
-[Landroid/icu/impl/locale/KeyTypeData$SpecialType;
-[Landroid/icu/impl/locale/KeyTypeData$TypeInfoType;
-[Landroid/icu/impl/locale/KeyTypeData$ValueType;
-[Landroid/icu/impl/locale/LSR;
-[Landroid/icu/impl/locale/LocaleValidityChecker$SpecialCase;
-[Landroid/icu/impl/number/CompactData$CompactType;
-[Landroid/icu/impl/number/DecimalFormatProperties$ParseMode;
-[Landroid/icu/impl/number/Modifier$Signum;
-[Landroid/icu/impl/number/Modifier;
-[Landroid/icu/impl/number/Padder$PadPosition;
-[Landroid/icu/impl/number/PatternStringUtils$PatternSignType;
-[Landroid/icu/impl/units/MeasureUnitImpl$CompoundPart;
-[Landroid/icu/impl/units/MeasureUnitImpl$InitialCompoundPart;
-[Landroid/icu/impl/units/MeasureUnitImpl$PowerPart;
-[Landroid/icu/impl/units/MeasureUnitImpl$UnitsParser$Token$Type;
-[Landroid/icu/lang/UCharacter$UnicodeBlock;
-[Landroid/icu/lang/UScript$ScriptUsage;
-[Landroid/icu/lang/UScriptRun$ParenStackEntry;
-[Landroid/icu/number/NumberFormatter$DecimalSeparatorDisplay;
-[Landroid/icu/number/NumberFormatter$GroupingStrategy;
-[Landroid/icu/number/NumberFormatter$RoundingPriority;
-[Landroid/icu/number/NumberFormatter$SignDisplay;
-[Landroid/icu/number/NumberFormatter$TrailingZeroDisplay;
-[Landroid/icu/number/NumberFormatter$UnitWidth;
-[Landroid/icu/number/NumberRangeFormatter$RangeCollapse;
-[Landroid/icu/number/NumberRangeFormatter$RangeIdentityFallback;
-[Landroid/icu/number/NumberRangeFormatter$RangeIdentityResult;
-[Landroid/icu/number/NumberSkeletonImpl$ParseState;
-[Landroid/icu/number/NumberSkeletonImpl$StemEnum;
-[Landroid/icu/text/AlphabeticIndex$Bucket$LabelType;
-[Landroid/icu/text/Bidi$IsoRun;
-[Landroid/icu/text/Bidi$Isolate;
-[Landroid/icu/text/Bidi$Opening;
-[Landroid/icu/text/Bidi$Point;
-[Landroid/icu/text/BidiRun;
-[Landroid/icu/text/BidiTransform$Mirroring;
-[Landroid/icu/text/BidiTransform$Order;
-[Landroid/icu/text/BidiTransform$ReorderingScheme;
-[Landroid/icu/text/CharsetRecog_sbcs$NGramsPlusLang;
-[Landroid/icu/text/CompactDecimalFormat$CompactStyle;
-[Landroid/icu/text/ConstrainedFieldPosition$ConstraintType;
-[Landroid/icu/text/DateFormat$BooleanAttribute;
-[Landroid/icu/text/DateFormat$Field;
-[Landroid/icu/text/DateFormat$HourCycle;
-[Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;
-[Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-[Landroid/icu/text/DateTimePatternGenerator$DTPGflags;
-[Landroid/icu/text/DateTimePatternGenerator$DisplayWidth;
-[Landroid/icu/text/DisplayContext$Type;
-[Landroid/icu/text/DisplayContext;
-[Landroid/icu/text/IDNA$Error;
-[Landroid/icu/text/ListFormatter$Type;
-[Landroid/icu/text/ListFormatter$Width;
-[Landroid/icu/text/LocaleDisplayNames$DialectHandling;
-[Landroid/icu/text/MeasureFormat$FormatWidth;
-[Landroid/icu/text/MessagePattern$ApostropheMode;
-[Landroid/icu/text/MessagePattern$ArgType;
-[Landroid/icu/text/MessagePattern$Part$Type;
-[Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;
-[Landroid/icu/text/Normalizer2$Mode;
-[Landroid/icu/text/PluralRules$KeywordStatus;
-[Landroid/icu/text/PluralRules$Operand;
-[Landroid/icu/text/PluralRules$PluralType;
-[Landroid/icu/text/PluralRules$SampleType;
-[Landroid/icu/text/RBBIRuleParseTable$RBBIRuleTableElement;
-[Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;
-[Landroid/icu/text/RelativeDateTimeFormatter$Direction;
-[Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-[Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeUnit;
-[Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;
-[Landroid/icu/text/RelativeDateTimeFormatter$Style;
-[Landroid/icu/text/SearchIterator$ElementComparisonType;
-[Landroid/icu/text/SimpleDateFormat$ContextValue;
-[Landroid/icu/text/SpoofChecker$RestrictionLevel;
-[Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;
-[Landroid/icu/text/TimeZoneFormat$OffsetFields;
-[Landroid/icu/text/TimeZoneFormat$ParseOption;
-[Landroid/icu/text/TimeZoneFormat$Style;
-[Landroid/icu/text/TimeZoneFormat$TimeType;
-[Landroid/icu/text/TimeZoneNames$NameType;
-[Landroid/icu/text/UnicodeSet$ComparisonStyle;
-[Landroid/icu/text/UnicodeSet$SpanCondition;
-[Landroid/icu/text/UnicodeSet;
-[Landroid/icu/text/UnicodeSetSpanner$CountMethod;
-[Landroid/icu/text/UnicodeSetSpanner$TrimOption;
-[Landroid/icu/util/BasicTimeZone$LocalOption;
-[Landroid/icu/util/BytesTrie$Result;
-[Landroid/icu/util/CodePointMap$RangeOption;
-[Landroid/icu/util/CodePointMap;
-[Landroid/icu/util/CodePointTrie$Type;
-[Landroid/icu/util/CodePointTrie$ValueWidth;
-[Landroid/icu/util/Currency$CurrencyUsage;
-[Landroid/icu/util/GenderInfo$Gender;
-[Landroid/icu/util/GenderInfo$ListGenderStyle;
-[Landroid/icu/util/Holiday;
-[Landroid/icu/util/IslamicCalendar$CalculationType;
-[Landroid/icu/util/LocaleMatcher$Demotion;
-[Landroid/icu/util/LocaleMatcher$Direction;
-[Landroid/icu/util/LocaleMatcher$FavorSubtag;
-[Landroid/icu/util/Measure;
-[Landroid/icu/util/MeasureUnit$Complexity;
-[Landroid/icu/util/MeasureUnit$MeasurePrefix;
-[Landroid/icu/util/Region$RegionType;
-[Landroid/icu/util/StringTrieBuilder$Node;
-[Landroid/icu/util/StringTrieBuilder$Option;
-[Landroid/icu/util/StringTrieBuilder$State;
-[Landroid/icu/util/TimeArrayTimeZoneRule;
-[Landroid/icu/util/TimeZone$SystemTimeZoneType;
-[Landroid/icu/util/TimeZoneRule;
-[Landroid/icu/util/ULocale$AvailableType;
-[Landroid/icu/util/ULocale$Category;
-[Landroid/icu/util/ULocale$Minimize;
-[Landroid/icu/util/ULocale;
-[Landroid/icu/util/UResourceBundle$RootType;
-[Landroid/icu/util/UniversalTimeScale$TimeScaleData;
-[Landroid/media/AudioAttributes;
-[Landroid/media/AudioDeviceInfo;
-[Landroid/media/AudioGain;
-[Landroid/media/AudioPatch;
-[Landroid/media/AudioPort;
-[Landroid/media/AudioPortConfig;
-[Landroid/media/DrmInitData$SchemeInitData;
-[Landroid/media/ExifInterface$ExifTag;
-[Landroid/media/ImageReader$SurfaceImage$SurfacePlane;
-[Landroid/media/ImageWriter$WriterSurfaceImage$SurfacePlane;
-[Landroid/media/MediaCodecInfo$CodecCapabilities;
-[Landroid/media/MediaCodecInfo$CodecProfileLevel;
-[Landroid/media/MediaCodecInfo$Feature;
-[Landroid/media/MediaCodecInfo;
-[Landroid/media/MediaPlayer$TrackInfo;
-[Landroid/media/MediaTimeProvider$OnMediaTimeListener;
-[Landroid/media/audiopolicy/AudioProductStrategy$AudioAttributesGroup;
-[Landroid/net/LocalSocketAddress$Namespace;
-[Landroid/net/NetworkKey;
-[Landroid/net/Uri;
-[Landroid/net/rtp/AudioCodec;
-[Landroid/os/AsyncTask$Status;
-[Landroid/os/BatteryConsumer$Key;
-[Landroid/os/BatteryStats$BitDescription;
-[Landroid/os/BatteryStats$IntToString;
-[Landroid/os/BatteryStats$LongCounter;
-[Landroid/os/Bundle;
-[Landroid/os/DdmSyncState$Stage;
-[Landroid/os/Debug$MemoryInfo;
-[Landroid/os/IBinder;
-[Landroid/os/MessageQueue$IdleHandler;
-[Landroid/os/ParcelFileDescriptor;
-[Landroid/os/ParcelUuid;
-[Landroid/os/Parcelable;
-[Landroid/os/PatternMatcher;
-[Landroid/os/PersistableBundle;
-[Landroid/os/SystemService$State;
-[Landroid/os/Temperature;
-[Landroid/os/UserHandle;
-[Landroid/os/VibratorInfo;
-[Landroid/os/health/HealthKeys$SortedIntArray;
-[Landroid/os/storage/DiskInfo;
-[Landroid/os/storage/StorageVolume;
-[Landroid/os/storage/VolumeInfo;
-[Landroid/os/storage/VolumeRecord;
-[Landroid/os/vibrator/VibrationEffectSegment;
-[Landroid/provider/FontsContract$FontInfo;
-[Landroid/renderscript/Element$DataKind;
-[Landroid/renderscript/Element$DataType;
-[Landroid/renderscript/RenderScript$ContextType;
-[Landroid/service/notification/NotificationListenerService$Ranking;
-[Landroid/service/notification/StatusBarNotification;
-[Landroid/service/notification/ZenModeConfig$ZenRule;
-[Landroid/service/wallpaper/EngineWindowPage;
-[Landroid/sysprop/CryptoProperties$state_values;
-[Landroid/sysprop/CryptoProperties$type_values;
-[Landroid/system/StructCapUserData;
-[Landroid/system/StructIfaddrs;
-[Landroid/system/StructPollfd;
-[Landroid/system/keystore2/Authorization;
-[Landroid/system/suspend/internal/WakeLockInfo;
-[Landroid/telephony/ActivityStatsTechSpecificInfo;
-[Landroid/telephony/LocationAccessPolicy$LocationPermissionResult;
-[Landroid/telephony/SmsMessage$MessageClass;
-[Landroid/telephony/SubscriptionPlan;
-[Landroid/telephony/TelephonyManager$MultiSimVariants;
-[Landroid/telephony/UiccAccessRule;
-[Landroid/telephony/gsm/SmsMessage$MessageClass;
-[Landroid/text/DynamicLayout$ChangeWatcher;
-[Landroid/text/InputFilter;
-[Landroid/text/Layout$Alignment;
-[Landroid/text/Layout$Directions;
-[Landroid/text/PrecomputedText$ParagraphInfo;
-[Landroid/text/Selection$MemoryTextWatcher;
-[Landroid/text/SpanWatcher;
-[Landroid/text/TextLine;
-[Landroid/text/TextUtils$TruncateAt;
-[Landroid/text/TextWatcher;
-[Landroid/text/method/MultiTapKeyListener;
-[Landroid/text/method/QwertyKeyListener$Replaced;
-[Landroid/text/method/QwertyKeyListener;
-[Landroid/text/method/TextKeyListener$Capitalize;
-[Landroid/text/method/TextKeyListener;
-[Landroid/text/method/Touch$DragState;
-[Landroid/text/style/AlignmentSpan;
-[Landroid/text/style/CharacterStyle;
-[Landroid/text/style/ClickableSpan;
-[Landroid/text/style/LeadingMarginSpan;
-[Landroid/text/style/LineBackgroundSpan;
-[Landroid/text/style/LineBreakConfigSpan;
-[Landroid/text/style/LineHeightSpan;
-[Landroid/text/style/MetricAffectingSpan;
-[Landroid/text/style/ParagraphStyle;
-[Landroid/text/style/ReplacementSpan;
-[Landroid/text/style/SpellCheckSpan;
-[Landroid/text/style/SuggestionSpan;
-[Landroid/text/style/TabStopSpan;
-[Landroid/text/style/URLSpan;
-[Landroid/util/ArrayMap;
-[Landroid/util/DataUnit;
-[Landroid/util/JsonScope;
-[Landroid/util/JsonToken;
-[Landroid/util/LongSparseArray;
-[Landroid/util/Pair;
-[Landroid/util/Range;
-[Landroid/util/Rational;
-[Landroid/util/Size;
-[Landroid/util/SparseIntArray;
-[Landroid/util/Xml$Encoding;
-[Landroid/util/apk/DataSource;
-[Landroid/view/AppTransitionAnimationSpec;
-[Landroid/view/Choreographer$CallbackQueue;
-[Landroid/view/Choreographer$FrameTimeline;
-[Landroid/view/Display$Mode;
-[Landroid/view/Display;
-[Landroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;
-[Landroid/view/HandlerActionQueue$HandlerAction;
-[Landroid/view/InsetsFrameProvider;
-[Landroid/view/InsetsSource;
-[Landroid/view/InsetsSourceControl;
-[Landroid/view/MenuItem;
-[Landroid/view/MotionEvent$PointerCoords;
-[Landroid/view/MotionEvent$PointerProperties;
-[Landroid/view/RemoteAnimationTarget;
-[Landroid/view/RoundedCorner;
-[Landroid/view/SurfaceControl$DisplayMode;
-[Landroid/view/SurfaceHolder$Callback;
-[Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;
-[Landroid/view/View$AttachInfo$InvalidateInfo;
-[Landroid/view/View;
-[Landroid/view/WindowManager$LayoutParams;
-[Landroid/view/accessibility/CaptioningManager$CaptionStyle;
-[Landroid/view/autofill/AutofillId;
-[Landroid/view/inputmethod/CompletionInfo;
-[Landroid/view/inputmethod/InputMethodSubtype;
-[Landroid/view/textservice/SentenceSuggestionsInfo;
-[Landroid/view/textservice/SuggestionsInfo;
-[Landroid/view/textservice/TextInfo;
-[Landroid/webkit/ConsoleMessage$MessageLevel;
-[Landroid/webkit/FindAddress$ZipRange;
-[Landroid/webkit/WebMessagePort;
-[Landroid/webkit/WebSettings$LayoutAlgorithm;
-[Landroid/webkit/WebSettings$PluginState;
-[Landroid/webkit/WebSettings$RenderPriority;
-[Landroid/webkit/WebSettings$ZoomDensity;
-[Landroid/widget/Editor$TextRenderNode;
-[Landroid/widget/Editor$TextViewPositionListener;
-[Landroid/widget/GridLayout$Arc;
-[Landroid/widget/GridLayout$Bounds;
-[Landroid/widget/GridLayout$Interval;
-[Landroid/widget/GridLayout$MutableInt;
-[Landroid/widget/GridLayout$Spec;
-[Landroid/widget/ImageView$ScaleType;
-[Landroid/widget/SpellChecker$RemoveReason;
-[Landroid/widget/SpellChecker$SpellParser;
-[Landroid/widget/TextView$BufferType;
-[Landroid/widget/TextView$ChangeWatcher;
-[Landroid/window/TransitionFilter$Requirement;
-[Lcom/android/framework/protobuf/GeneratedMessageLite$MethodToInvoke;
-[Lcom/android/framework/protobuf/MessageInfoFactory;
-[Lcom/android/framework/protobuf/ProtoSyntax;
-[Lcom/android/i18n/phonenumbers/NumberParseException$ErrorType;
-[Lcom/android/i18n/phonenumbers/PhoneNumberMatcher$State;
-[Lcom/android/i18n/phonenumbers/PhoneNumberUtil$Leniency;
-[Lcom/android/i18n/phonenumbers/PhoneNumberUtil$MatchType;
-[Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;
-[Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;
-[Lcom/android/i18n/phonenumbers/PhoneNumberUtil$ValidationResult;
-[Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;
-[Lcom/android/i18n/phonenumbers/ShortNumberInfo$ShortNumberCost;
-[Lcom/android/internal/app/ResolverActivity$ActionTitle;
-[Lcom/android/internal/graphics/drawable/BackgroundBlurDrawable$BlurRegion;
-[Lcom/android/internal/os/PowerProfile$CpuClusterKey;
-[Lcom/android/internal/os/ZygoteServer$UsapPoolRefillAction;
-[Lcom/android/internal/policy/PhoneWindow$PanelFeatureState;
-[Lcom/android/internal/protolog/ProtoLogGroup;
-[Lcom/android/internal/statusbar/LetterboxDetails;
-[Lcom/android/internal/statusbar/NotificationVisibility$NotificationLocation;
-[Lcom/android/internal/telephony/Call$SrvccState;
-[Lcom/android/internal/telephony/Call$State;
-[Lcom/android/internal/telephony/CommandException$Error;
-[Lcom/android/internal/telephony/Connection$PostDialState;
-[Lcom/android/internal/telephony/DctConstants$Activity;
-[Lcom/android/internal/telephony/DctConstants$State;
-[Lcom/android/internal/telephony/DriverCall$State;
-[Lcom/android/internal/telephony/IccCardConstants$State;
-[Lcom/android/internal/telephony/MmiCode$State;
-[Lcom/android/internal/telephony/OperatorInfo$State;
-[Lcom/android/internal/telephony/Phone;
-[Lcom/android/internal/telephony/PhoneConstants$DataState;
-[Lcom/android/internal/telephony/PhoneConstants$State;
-[Lcom/android/internal/telephony/PhoneInternalInterface$DataActivityState;
-[Lcom/android/internal/telephony/PhoneInternalInterface$SuppService;
-[Lcom/android/internal/telephony/SmsConstants$MessageClass;
-[Lcom/android/internal/telephony/cat/AppInterface$CommandType;
-[Lcom/android/internal/telephony/cat/ComprehensionTlvTag;
-[Lcom/android/internal/telephony/cat/Duration$TimeUnit;
-[Lcom/android/internal/telephony/cat/FontSize;
-[Lcom/android/internal/telephony/cat/LaunchBrowserMode;
-[Lcom/android/internal/telephony/cat/PresentationType;
-[Lcom/android/internal/telephony/cat/ResultCode;
-[Lcom/android/internal/telephony/cat/TextAlignment;
-[Lcom/android/internal/telephony/cat/TextColor;
-[Lcom/android/internal/telephony/cat/Tone;
-[Lcom/android/internal/telephony/gsm/SsData$RequestType;
-[Lcom/android/internal/telephony/gsm/SsData$ServiceType;
-[Lcom/android/internal/telephony/gsm/SsData$TeleserviceType;
-[Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$HoldSwapState;
-[Lcom/android/internal/telephony/nano/PersistAtomsProto$CellularDataServiceSwitch;
-[Lcom/android/internal/telephony/nano/PersistAtomsProto$CellularServiceState;
-[Lcom/android/internal/telephony/nano/PersistAtomsProto$DataCallSession;
-[Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationStats;
-[Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationTermination;
-[Lcom/android/internal/telephony/nano/PersistAtomsProto$IncomingSms;
-[Lcom/android/internal/telephony/nano/PersistAtomsProto$NetworkRequests;
-[Lcom/android/internal/telephony/nano/PersistAtomsProto$OutgoingSms;
-[Lcom/android/internal/telephony/nano/PersistAtomsProto$VoiceCallRatUsage;
-[Lcom/android/internal/telephony/nano/PersistAtomsProto$VoiceCallSession;
-[Lcom/android/internal/telephony/phonenumbers/NumberParseException$ErrorType;
-[Lcom/android/internal/telephony/phonenumbers/PhoneNumberMatcher$State;
-[Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$Leniency;
-[Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$MatchType;
-[Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;
-[Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$PhoneNumberType;
-[Lcom/android/internal/telephony/phonenumbers/PhoneNumberUtil$ValidationResult;
-[Lcom/android/internal/telephony/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;
-[Lcom/android/internal/telephony/phonenumbers/ShortNumberInfo$ShortNumberCost;
-[Lcom/android/internal/telephony/uicc/IccCardApplicationStatus$AppState;
-[Lcom/android/internal/telephony/uicc/IccCardApplicationStatus$AppType;
-[Lcom/android/internal/telephony/uicc/IccCardApplicationStatus$PersoSubState;
-[Lcom/android/internal/telephony/uicc/IccCardStatus$CardState;
-[Lcom/android/internal/telephony/uicc/IccCardStatus$PinState;
-[Lcom/android/internal/telephony/uicc/SIMRecords$GetSpnFsmState;
-[Lcom/android/internal/telephony/uicc/UsimServiceTable$UsimService;
-[Lcom/android/internal/util/StateMachine$SmHandler$StateInfo;
-[Lcom/android/internal/view/AppearanceRegion;
-[Lcom/android/okhttp/CipherSuite;
-[Lcom/android/okhttp/ConnectionSpec;
-[Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
-[Lcom/android/okhttp/Protocol;
-[Lcom/android/okhttp/TlsVersion;
-[Lcom/android/okhttp/okio/ByteString;
-[Lcom/android/org/bouncycastle/asn1/ASN1Encodable;
-[Lcom/android/org/bouncycastle/asn1/ASN1Enumerated;
-[Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;
-[Lcom/android/org/bouncycastle/asn1/ASN1OctetString;
-[Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-[Lcom/android/org/bouncycastle/crypto/params/DHParameters;
-[Lcom/android/org/bouncycastle/crypto/params/DSAParameters;
-[Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/x509/PEMUtil$Boundaries;
-[Lcom/android/org/kxml2/io/KXmlParser$ValueContext;
-[Ldalvik/system/DexPathList$Element;
-[Ldalvik/system/DexPathList$NativeLibraryElement;
-[Lgov/nist/javax/sip/DialogTimeoutEvent$Reason;
-[Ljava/io/File$PathStatus;
-[Ljava/io/File;
-[Ljava/io/ObjectInputStream$HandleTable$HandleList;
-[Ljava/io/ObjectStreamClass$ClassDataSlot;
-[Ljava/io/ObjectStreamClass$MemberSignature;
-[Ljava/io/ObjectStreamField;
-[Ljava/lang/Byte;
-[Ljava/lang/CharSequence;
-[Ljava/lang/Character$UnicodeBlock;
-[Ljava/lang/Character;
-[Ljava/lang/Class;
-[Ljava/lang/ClassValue$Entry;
-[Ljava/lang/Comparable;
-[Ljava/lang/Daemons$Daemon;
-[Ljava/lang/Double;
-[Ljava/lang/Enum;
-[Ljava/lang/Integer;
-[Ljava/lang/Long;
-[Ljava/lang/Number;
-[Ljava/lang/Object;
-[Ljava/lang/Package;
-[Ljava/lang/ProcessBuilder$Redirect;
-[Ljava/lang/Runnable;
-[Ljava/lang/Short;
-[Ljava/lang/StackTraceElement;
-[Ljava/lang/StackWalker$Option;
-[Ljava/lang/String;
-[Ljava/lang/StringBuilder;
-[Ljava/lang/Thread$State;
-[Ljava/lang/Thread;
-[Ljava/lang/ThreadGroup;
-[Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
-[Ljava/lang/Throwable;
-[Ljava/lang/annotation/Annotation;
-[Ljava/lang/constant/ClassDesc;
-[Ljava/lang/constant/Constable;
-[Ljava/lang/constant/ConstantDesc;
-[Ljava/lang/constant/DirectMethodHandleDesc$Kind;
-[Ljava/lang/invoke/MethodHandle;
-[Ljava/lang/invoke/MethodType;
-[Ljava/lang/invoke/TypeDescriptor$OfField;
-[Ljava/lang/invoke/VarHandle$AccessMode;
-[Ljava/lang/invoke/VarHandle$AccessType;
-[Ljava/lang/invoke/VarHandle$VarHandleDesc$Kind;
-[Ljava/lang/ref/WeakReference;
-[Ljava/lang/reflect/AccessibleObject;
-[Ljava/lang/reflect/Constructor;
-[Ljava/lang/reflect/Field;
-[Ljava/lang/reflect/Method;
-[Ljava/lang/reflect/Parameter;
-[Ljava/lang/reflect/RecordComponent;
-[Ljava/lang/reflect/Type;
-[Ljava/lang/reflect/TypeVariable;
-[Ljava/math/BigDecimal;
-[Ljava/math/BigInteger;
-[Ljava/math/RoundingMode;
-[Ljava/net/Authenticator$RequestorType;
-[Ljava/net/InetAddress;
-[Ljava/net/InterfaceAddress;
-[Ljava/net/NetworkInterface;
-[Ljava/net/Proxy$Type;
-[Ljava/net/StandardProtocolFamily;
-[Ljava/nio/ByteBuffer;
-[Ljava/nio/channels/SelectionKey;
-[Ljava/nio/charset/CoderResult;
-[Ljava/nio/file/AccessMode;
-[Ljava/nio/file/CopyOption;
-[Ljava/nio/file/FileVisitResult;
-[Ljava/nio/file/LinkOption;
-[Ljava/nio/file/OpenOption;
-[Ljava/nio/file/StandardCopyOption;
-[Ljava/nio/file/StandardOpenOption;
-[Ljava/nio/file/attribute/FileAttribute;
-[Ljava/security/CodeSigner;
-[Ljava/security/CryptoPrimitive;
-[Ljava/security/Permission;
-[Ljava/security/Principal;
-[Ljava/security/ProtectionDomain;
-[Ljava/security/Provider;
-[Ljava/security/cert/CRLReason;
-[Ljava/security/cert/CertPathValidatorException$BasicReason;
-[Ljava/security/cert/Certificate;
-[Ljava/security/cert/PKIXReason;
-[Ljava/security/cert/PKIXRevocationChecker$Option;
-[Ljava/security/cert/X509CRL;
-[Ljava/security/cert/X509Certificate;
-[Ljava/text/DateFormat$Field;
-[Ljava/text/Format;
-[Ljava/text/Normalizer$Form;
-[Ljava/text/NumberFormat$Style;
-[Ljava/time/DayOfWeek;
-[Ljava/time/LocalDateTime;
-[Ljava/time/LocalTime;
-[Ljava/time/Month;
-[Ljava/time/ZoneOffset;
-[Ljava/time/format/DateTimeFormatterBuilder$DateTimePrinterParser;
-[Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;
-[Ljava/time/format/ResolverStyle;
-[Ljava/time/format/SignStyle;
-[Ljava/time/format/TextStyle;
-[Ljava/time/temporal/ChronoField;
-[Ljava/time/temporal/ChronoUnit;
-[Ljava/time/temporal/IsoFields$Field;
-[Ljava/time/temporal/IsoFields$Unit;
-[Ljava/time/temporal/JulianFields$Field;
-[Ljava/time/temporal/TemporalUnit;
-[Ljava/time/zone/ZoneOffsetTransition;
-[Ljava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;
-[Ljava/time/zone/ZoneOffsetTransitionRule;
-[Ljava/util/Comparators$NaturalOrderComparator;
-[Ljava/util/Enumeration;
-[Ljava/util/Formatter$Flags;
-[Ljava/util/HashMap$Node;
-[Ljava/util/Hashtable$HashtableEntry;
-[Ljava/util/List;
-[Ljava/util/Locale$Category;
-[Ljava/util/Locale$FilteringMode;
-[Ljava/util/Locale$IsoCountryCode;
-[Ljava/util/Locale;
-[Ljava/util/Map$Entry;
-[Ljava/util/TimerTask;
-[Ljava/util/WeakHashMap$Entry;
-[Ljava/util/concurrent/ConcurrentHashMap$CounterCell;
-[Ljava/util/concurrent/ConcurrentHashMap$Node;
-[Ljava/util/concurrent/ConcurrentHashMap$Segment;
-[Ljava/util/concurrent/ForkJoinPool$WorkQueue;
-[Ljava/util/concurrent/ForkJoinTask;
-[Ljava/util/concurrent/RunnableScheduledFuture;
-[Ljava/util/concurrent/TimeUnit;
-[Ljava/util/concurrent/atomic/Striped64$Cell;
-[Ljava/util/logging/Handler;
-[Ljava/util/prefs/AbstractPreferences;
-[Ljava/util/regex/Pattern;
-[Ljava/util/stream/Collector$Characteristics;
-[Ljava/util/stream/MatchOps$MatchKind;
-[Ljava/util/stream/StreamOpFlag$Type;
-[Ljava/util/stream/StreamOpFlag;
-[Ljava/util/stream/StreamShape;
-[Ljavax/crypto/Cipher$InitType;
-[Ljavax/crypto/Cipher$NeedToSet;
-[Ljavax/microedition/khronos/egl/EGLConfig;
-[Ljavax/net/ssl/KeyManager;
-[Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
-[Ljavax/net/ssl/SSLEngineResult$Status;
-[Ljavax/net/ssl/TrustManager;
-[Ljavax/security/auth/callback/Callback;
-[Ljavax/security/cert/X509Certificate;
-[Ljavax/sip/DialogState;
-[Ljavax/sip/Timeout;
-[Ljavax/sip/TransactionState;
-[Ljdk/internal/math/FDBigInteger;
-[Ljdk/internal/math/FormattedFloatingDecimal$Form;
-[Llibcore/io/ClassPathURLStreamHandler;
-[Llibcore/io/IoTracker$Mode;
-[Llibcore/reflect/AnnotationMember$DefaultValues;
-[Llibcore/reflect/AnnotationMember;
-[Lorg/json/JSONStringer$Scope;
-[Lsun/invoke/util/Wrapper;
-[Lsun/nio/ch/SelectionKeyImpl;
-[Lsun/nio/fs/NativeBuffer;
-[Lsun/security/jca/ProviderConfig;
-[Lsun/security/jca/ServiceId;
-[Lsun/security/pkcs/SignerInfo;
-[Lsun/security/provider/certpath/OCSP$RevocationStatus$CertStatus;
-[Lsun/security/provider/certpath/OCSPResponse$ResponseStatus;
-[Lsun/security/provider/certpath/RevocationChecker$Mode;
-[Lsun/security/util/DerEncoder;
-[Lsun/security/util/DerOutputStream;
-[Lsun/security/util/DerValue;
-[Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;
-[Lsun/security/util/ObjectIdentifier;
-[Lsun/security/x509/AVA;
-[Lsun/security/x509/AlgorithmId;
-[Lsun/security/x509/NetscapeCertTypeExtension$MapEntry;
-[Lsun/security/x509/RDN;
-[Lsun/util/calendar/Era;
-[Lsun/util/locale/BaseLocale;
-[Lsun/util/logging/PlatformLogger$Level;
-[S
-[Z
-[[B
-[[D
-[[I
-[[J
-[[Landroid/graphics/Rect;
-[[Landroid/media/ExifInterface$ExifTag;
-[[Landroid/widget/GridLayout$Arc;
-[[Lcom/android/internal/widget/LockPatternView$Cell;
-[[Ljava/lang/Byte;
-[[Ljava/lang/Class;
-[[Ljava/lang/Object;
-[[Ljava/lang/String;
-[[Ljava/lang/annotation/Annotation;
-[[Ljava/lang/invoke/MethodHandle;
-[[Ljava/math/BigInteger;
-[[Z
diff --git a/core/api/current.txt b/core/api/current.txt
index 8eb8811..565254f 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -4919,6 +4919,7 @@
     method public int getPendingIntentBackgroundActivityStartMode();
     method public int getPendingIntentCreatorBackgroundActivityStartMode();
     method public int getSplashScreenStyle();
+    method @FlaggedApi("com.android.window.flags.touch_pass_through_opt_in") public boolean isAllowPassThroughOnTouchOutside();
     method @Deprecated public boolean isPendingIntentBackgroundActivityLaunchAllowed();
     method public boolean isShareIdentityEnabled();
     method public static android.app.ActivityOptions makeBasic();
@@ -4932,6 +4933,7 @@
     method public static android.app.ActivityOptions makeTaskLaunchBehind();
     method public static android.app.ActivityOptions makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
     method public void requestUsageTimeReport(android.app.PendingIntent);
+    method @FlaggedApi("com.android.window.flags.touch_pass_through_opt_in") public void setAllowPassThroughOnTouchOutside(boolean);
     method public android.app.ActivityOptions setAppVerificationBundle(android.os.Bundle);
     method public android.app.ActivityOptions setLaunchBounds(@Nullable android.graphics.Rect);
     method public android.app.ActivityOptions setLaunchDisplayId(int);
@@ -4945,8 +4947,10 @@
     method public void update(android.app.ActivityOptions);
     field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
     field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
-    field public static final int MODE_BACKGROUND_ACTIVITY_START_ALLOWED = 1; // 0x1
-    field public static final int MODE_BACKGROUND_ACTIVITY_START_DENIED = 2; // 0x2
+    field @Deprecated @FlaggedApi("com.android.window.flags.bal_additional_start_modes") public static final int MODE_BACKGROUND_ACTIVITY_START_ALLOWED = 1; // 0x1
+    field @FlaggedApi("com.android.window.flags.bal_additional_start_modes") public static final int MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS = 3; // 0x3
+    field @FlaggedApi("com.android.window.flags.bal_additional_start_modes") public static final int MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE = 4; // 0x4
+    field @FlaggedApi("com.android.window.flags.bal_additional_start_modes") public static final int MODE_BACKGROUND_ACTIVITY_START_DENIED = 2; // 0x2
     field public static final int MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED = 0; // 0x0
   }
 
@@ -6854,6 +6858,47 @@
     method public android.app.Notification.MessagingStyle.Message setData(String, android.net.Uri);
   }
 
+  @FlaggedApi("android.app.api_rich_ongoing") public static class Notification.ProgressStyle extends android.app.Notification.Style {
+    ctor public Notification.ProgressStyle();
+    method @NonNull public android.app.Notification.ProgressStyle addProgressPoint(@NonNull android.app.Notification.ProgressStyle.Point);
+    method @NonNull public android.app.Notification.ProgressStyle addProgressSegment(@NonNull android.app.Notification.ProgressStyle.Segment);
+    method public int getProgress();
+    method @Nullable public android.graphics.drawable.Icon getProgressEndIcon();
+    method public int getProgressMax();
+    method @NonNull public java.util.List<android.app.Notification.ProgressStyle.Point> getProgressPoints();
+    method @NonNull public java.util.List<android.app.Notification.ProgressStyle.Segment> getProgressSegments();
+    method @Nullable public android.graphics.drawable.Icon getProgressStartIcon();
+    method @Nullable public android.graphics.drawable.Icon getProgressTrackerIcon();
+    method public boolean isProgressIndeterminate();
+    method public boolean isStyledByProgress();
+    method @NonNull public android.app.Notification.ProgressStyle setProgress(int);
+    method @NonNull public android.app.Notification.ProgressStyle setProgressEndIcon(@Nullable android.graphics.drawable.Icon);
+    method @NonNull public android.app.Notification.ProgressStyle setProgressIndeterminate(boolean);
+    method @NonNull public android.app.Notification.ProgressStyle setProgressPoints(@NonNull java.util.List<android.app.Notification.ProgressStyle.Point>);
+    method @NonNull public android.app.Notification.ProgressStyle setProgressSegments(@NonNull java.util.List<android.app.Notification.ProgressStyle.Segment>);
+    method @NonNull public android.app.Notification.ProgressStyle setProgressStartIcon(@Nullable android.graphics.drawable.Icon);
+    method @NonNull public android.app.Notification.ProgressStyle setProgressTrackerIcon(@Nullable android.graphics.drawable.Icon);
+    method @NonNull public android.app.Notification.ProgressStyle setStyledByProgress(boolean);
+  }
+
+  public static final class Notification.ProgressStyle.Point {
+    ctor public Notification.ProgressStyle.Point(int);
+    method @ColorInt public int getColor();
+    method public int getId();
+    method public int getPosition();
+    method @NonNull public android.app.Notification.ProgressStyle.Point setColor(@ColorInt int);
+    method @NonNull public android.app.Notification.ProgressStyle.Point setId(int);
+  }
+
+  public static final class Notification.ProgressStyle.Segment {
+    ctor public Notification.ProgressStyle.Segment(int);
+    method @ColorInt public int getColor();
+    method public int getId();
+    method public int getLength();
+    method @NonNull public android.app.Notification.ProgressStyle.Segment setColor(@ColorInt int);
+    method @NonNull public android.app.Notification.ProgressStyle.Segment setId(int);
+  }
+
   public abstract static class Notification.Style {
     ctor @Deprecated public Notification.Style();
     method public android.app.Notification build();
@@ -8630,6 +8675,8 @@
     field public static final int TAG_MAX_SCREEN_LOCK_TIMEOUT_SET = 210019; // 0x33463
     field public static final int TAG_MEDIA_MOUNT = 210013; // 0x3345d
     field public static final int TAG_MEDIA_UNMOUNT = 210014; // 0x3345e
+    field @FlaggedApi("android.nfc.nfc_state_change_security_log_event_enabled") public static final int TAG_NFC_DISABLED = 210046; // 0x3347e
+    field @FlaggedApi("android.nfc.nfc_state_change_security_log_event_enabled") public static final int TAG_NFC_ENABLED = 210045; // 0x3347d
     field public static final int TAG_OS_SHUTDOWN = 210010; // 0x3345a
     field public static final int TAG_OS_STARTUP = 210009; // 0x33459
     field public static final int TAG_PACKAGE_INSTALLED = 210041; // 0x33479
@@ -8732,13 +8779,20 @@
 package android.app.appfunctions {
 
   @FlaggedApi("android.app.appfunctions.flags.enable_app_function_manager") public final class AppFunctionManager {
-    method @RequiresPermission(anyOf={"android.permission.EXECUTE_APP_FUNCTIONS_TRUSTED", "android.permission.EXECUTE_APP_FUNCTIONS"}, conditional=true) public void executeAppFunction(@NonNull android.app.appfunctions.ExecuteAppFunctionRequest, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.appfunctions.ExecuteAppFunctionResponse>);
+    method @Deprecated @RequiresPermission(anyOf={"android.permission.EXECUTE_APP_FUNCTIONS_TRUSTED", "android.permission.EXECUTE_APP_FUNCTIONS"}, conditional=true) public void executeAppFunction(@NonNull android.app.appfunctions.ExecuteAppFunctionRequest, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.appfunctions.ExecuteAppFunctionResponse>);
+    method @RequiresPermission(anyOf={"android.permission.EXECUTE_APP_FUNCTIONS_TRUSTED", "android.permission.EXECUTE_APP_FUNCTIONS"}, conditional=true) public void executeAppFunction(@NonNull android.app.appfunctions.ExecuteAppFunctionRequest, @NonNull java.util.concurrent.Executor, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<android.app.appfunctions.ExecuteAppFunctionResponse>);
+    method public void isAppFunctionEnabled(@NonNull String, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Boolean,java.lang.Exception>);
+    method public void setAppFunctionEnabled(@NonNull String, int, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,java.lang.Exception>);
+    field public static final int APP_FUNCTION_STATE_DEFAULT = 0; // 0x0
+    field public static final int APP_FUNCTION_STATE_DISABLED = 2; // 0x2
+    field public static final int APP_FUNCTION_STATE_ENABLED = 1; // 0x1
   }
 
   @FlaggedApi("android.app.appfunctions.flags.enable_app_function_manager") public abstract class AppFunctionService extends android.app.Service {
     ctor public AppFunctionService();
     method @NonNull public final android.os.IBinder onBind(@Nullable android.content.Intent);
-    method @MainThread public abstract void onExecuteFunction(@NonNull android.app.appfunctions.ExecuteAppFunctionRequest, @NonNull java.util.function.Consumer<android.app.appfunctions.ExecuteAppFunctionResponse>);
+    method @Deprecated @MainThread public void onExecuteFunction(@NonNull android.app.appfunctions.ExecuteAppFunctionRequest, @NonNull java.util.function.Consumer<android.app.appfunctions.ExecuteAppFunctionResponse>);
+    method @MainThread public void onExecuteFunction(@NonNull android.app.appfunctions.ExecuteAppFunctionRequest, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<android.app.appfunctions.ExecuteAppFunctionResponse>);
     field @NonNull public static final String SERVICE_INTERFACE = "android.app.appfunctions.AppFunctionService";
   }
 
@@ -8772,11 +8826,12 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.app.appfunctions.ExecuteAppFunctionResponse> CREATOR;
     field public static final String PROPERTY_RETURN_VALUE = "returnValue";
     field public static final int RESULT_APP_UNKNOWN_ERROR = 2; // 0x2
+    field public static final int RESULT_CANCELLED = 6; // 0x6
     field public static final int RESULT_DENIED = 1; // 0x1
+    field public static final int RESULT_DISABLED = 5; // 0x5
     field public static final int RESULT_INTERNAL_ERROR = 3; // 0x3
     field public static final int RESULT_INVALID_ARGUMENT = 4; // 0x4
     field public static final int RESULT_OK = 0; // 0x0
-    field public static final int RESULT_TIMED_OUT = 5; // 0x5
   }
 
 }
@@ -11429,8 +11484,8 @@
     field @FlaggedApi("android.service.chooser.chooser_payload_toggling") public static final String EXTRA_CHOOSER_FOCUSED_ITEM_POSITION = "android.intent.extra.CHOOSER_FOCUSED_ITEM_POSITION";
     field public static final String EXTRA_CHOOSER_MODIFY_SHARE_ACTION = "android.intent.extra.CHOOSER_MODIFY_SHARE_ACTION";
     field public static final String EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER = "android.intent.extra.CHOOSER_REFINEMENT_INTENT_SENDER";
-    field @FlaggedApi("android.service.chooser.enable_chooser_result") public static final String EXTRA_CHOOSER_RESULT = "android.intent.extra.CHOOSER_RESULT";
-    field @FlaggedApi("android.service.chooser.enable_chooser_result") public static final String EXTRA_CHOOSER_RESULT_INTENT_SENDER = "android.intent.extra.CHOOSER_RESULT_INTENT_SENDER";
+    field public static final String EXTRA_CHOOSER_RESULT = "android.intent.extra.CHOOSER_RESULT";
+    field public static final String EXTRA_CHOOSER_RESULT_INTENT_SENDER = "android.intent.extra.CHOOSER_RESULT_INTENT_SENDER";
     field public static final String EXTRA_CHOOSER_TARGETS = "android.intent.extra.CHOOSER_TARGETS";
     field public static final String EXTRA_CHOSEN_COMPONENT = "android.intent.extra.CHOSEN_COMPONENT";
     field public static final String EXTRA_CHOSEN_COMPONENT_INTENT_SENDER = "android.intent.extra.CHOSEN_COMPONENT_INTENT_SENDER";
@@ -12062,6 +12117,7 @@
     method @NonNull public void setResourceValue(@NonNull String, int, @NonNull String, @Nullable String);
     method @NonNull public void setResourceValue(@NonNull String, @NonNull android.os.ParcelFileDescriptor, @Nullable String);
     method @FlaggedApi("android.content.res.asset_file_descriptor_frro") @NonNull public void setResourceValue(@NonNull String, @NonNull android.content.res.AssetFileDescriptor, @Nullable String);
+    method @FlaggedApi("android.content.res.dimension_frro") public void setResourceValue(@NonNull String, float, int, @Nullable String);
     method public void setTargetOverlayable(@Nullable String);
   }
 
@@ -21359,6 +21415,7 @@
     field public static final int ENCODING_AAC_XHE = 16; // 0x10
     field public static final int ENCODING_AC3 = 5; // 0x5
     field public static final int ENCODING_AC4 = 17; // 0x11
+    field @FlaggedApi("android.media.audio.dolby_ac4_level4_encoding_api") public static final int ENCODING_AC4_L4 = 32; // 0x20
     field public static final int ENCODING_DEFAULT = 1; // 0x1
     field public static final int ENCODING_DOLBY_MAT = 19; // 0x13
     field public static final int ENCODING_DOLBY_TRUEHD = 14; // 0xe
@@ -26862,7 +26919,6 @@
     field public static final int STATE_FAST_FORWARDING = 4; // 0x4
     field public static final int STATE_NONE = 0; // 0x0
     field public static final int STATE_PAUSED = 2; // 0x2
-    field @FlaggedApi("com.android.media.flags.enable_notifying_activity_manager_with_media_session_status_change") public static final int STATE_PLAYBACK_SUPPRESSED = 12; // 0xc
     field public static final int STATE_PLAYING = 3; // 0x3
     field public static final int STATE_REWINDING = 5; // 0x5
     field public static final int STATE_SKIPPING_TO_NEXT = 10; // 0xa
@@ -32769,7 +32825,7 @@
     field @NonNull public static final String RELEASE_OR_PREVIEW_DISPLAY;
     field @Deprecated public static final String SDK;
     field public static final int SDK_INT;
-    field @FlaggedApi("android.sdk.major_minor_versioning_scheme") public static final int SDK_MINOR_INT;
+    field @FlaggedApi("android.sdk.major_minor_versioning_scheme") public static final int SDK_INT_FULL;
     field public static final String SECURITY_PATCH;
   }
 
@@ -32813,6 +32869,9 @@
     field public static final int VANILLA_ICE_CREAM = 35; // 0x23
   }
 
+  @FlaggedApi("android.sdk.major_minor_versioning_scheme") public static class Build.VERSION_CODES_FULL {
+  }
+
   public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable {
     ctor public Bundle();
     ctor public Bundle(ClassLoader);
@@ -36937,7 +36996,7 @@
   }
 
   @FlaggedApi("android.provider.new_default_account_api_enabled") public static final class ContactsContract.RawContacts.DefaultAccount {
-    ctor public ContactsContract.RawContacts.DefaultAccount();
+    method @FlaggedApi("android.provider.new_default_account_api_enabled") @NonNull public static android.provider.ContactsContract.RawContacts.DefaultAccount.DefaultAccountAndState getDefaultAccountForNewContacts(@NonNull android.content.ContentResolver);
   }
 
   @FlaggedApi("android.provider.new_default_account_api_enabled") public static final class ContactsContract.RawContacts.DefaultAccount.DefaultAccountAndState {
@@ -37377,6 +37436,7 @@
     field public static final String ACTION_APPLICATION_SETTINGS = "android.settings.APPLICATION_SETTINGS";
     field public static final String ACTION_APP_LOCALE_SETTINGS = "android.settings.APP_LOCALE_SETTINGS";
     field public static final String ACTION_APP_NOTIFICATION_BUBBLE_SETTINGS = "android.settings.APP_NOTIFICATION_BUBBLE_SETTINGS";
+    field @FlaggedApi("android.app.api_rich_ongoing") public static final String ACTION_APP_NOTIFICATION_PROMOTION_SETTINGS = "android.settings.APP_NOTIFICATION_PROMOTION_SETTINGS";
     field public static final String ACTION_APP_NOTIFICATION_SETTINGS = "android.settings.APP_NOTIFICATION_SETTINGS";
     field public static final String ACTION_APP_OPEN_BY_DEFAULT_SETTINGS = "android.settings.APP_OPEN_BY_DEFAULT_SETTINGS";
     field public static final String ACTION_APP_SEARCH_SETTINGS = "android.settings.APP_SEARCH_SETTINGS";
@@ -40601,7 +40661,7 @@
     method @NonNull public android.service.chooser.ChooserAction build();
   }
 
-  @FlaggedApi("android.service.chooser.enable_chooser_result") public final class ChooserResult implements android.os.Parcelable {
+  public final class ChooserResult implements android.os.Parcelable {
     method public int describeContents();
     method @Nullable public android.content.ComponentName getSelectedComponent();
     method public int getType();
@@ -46655,6 +46715,8 @@
     field public static final int TYPE_IMS = 64; // 0x40
     field public static final int TYPE_MCX = 1024; // 0x400
     field public static final int TYPE_MMS = 2; // 0x2
+    field @FlaggedApi("com.android.internal.telephony.flags.oem_paid_private") public static final int TYPE_OEM_PAID = 65536; // 0x10000
+    field @FlaggedApi("com.android.internal.telephony.flags.oem_paid_private") public static final int TYPE_OEM_PRIVATE = 131072; // 0x20000
     field @FlaggedApi("com.android.internal.telephony.flags.carrier_enabled_satellite_flag") public static final int TYPE_RCS = 32768; // 0x8000
     field public static final int TYPE_SUPL = 4; // 0x4
     field public static final int TYPE_VSIM = 4096; // 0x1000
@@ -49178,6 +49240,7 @@
     field public static final String ARG_PROTOCOL = "android.arg.protocol";
     field public static final String ARG_QUANTITY = "android.arg.quantity";
     field public static final String ARG_QUERY_STRING = "android.arg.query_string";
+    field @FlaggedApi("com.android.text.flags.tts_span_duration") public static final String ARG_SECONDS = "android.arg.seconds";
     field public static final String ARG_TEXT = "android.arg.text";
     field public static final String ARG_UNIT = "android.arg.unit";
     field public static final String ARG_USERNAME = "android.arg.username";
@@ -49214,6 +49277,7 @@
     field public static final String TYPE_DATE = "android.type.date";
     field public static final String TYPE_DECIMAL = "android.type.decimal";
     field public static final String TYPE_DIGITS = "android.type.digits";
+    field @FlaggedApi("com.android.text.flags.tts_span_duration") public static final String TYPE_DURATION = "android.type.duration";
     field public static final String TYPE_ELECTRONIC = "android.type.electronic";
     field public static final String TYPE_FRACTION = "android.type.fraction";
     field public static final String TYPE_MEASURE = "android.type.measure";
@@ -49273,6 +49337,13 @@
     method public android.text.style.TtsSpan.DigitsBuilder setDigits(String);
   }
 
+  @FlaggedApi("com.android.text.flags.tts_span_duration") public static class TtsSpan.DurationBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.DurationBuilder> {
+    ctor @FlaggedApi("com.android.text.flags.tts_span_duration") public TtsSpan.DurationBuilder();
+    method @FlaggedApi("com.android.text.flags.tts_span_duration") @NonNull public android.text.style.TtsSpan.DurationBuilder setHours(int);
+    method @FlaggedApi("com.android.text.flags.tts_span_duration") @NonNull public android.text.style.TtsSpan.DurationBuilder setMinutes(int);
+    method @FlaggedApi("com.android.text.flags.tts_span_duration") @NonNull public android.text.style.TtsSpan.DurationBuilder setSeconds(int);
+  }
+
   public static class TtsSpan.ElectronicBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.ElectronicBuilder> {
     ctor public TtsSpan.ElectronicBuilder();
     method public android.text.style.TtsSpan.ElectronicBuilder setDomain(String);
@@ -49355,6 +49426,7 @@
     ctor public TtsSpan.TimeBuilder(int, int);
     method public android.text.style.TtsSpan.TimeBuilder setHours(int);
     method public android.text.style.TtsSpan.TimeBuilder setMinutes(int);
+    method @FlaggedApi("com.android.text.flags.tts_span_duration") @NonNull public android.text.style.TtsSpan.TimeBuilder setSeconds(int);
   }
 
   public static class TtsSpan.VerbatimBuilder extends android.text.style.TtsSpan.SemioticClassBuilder<android.text.style.TtsSpan.VerbatimBuilder> {
@@ -54902,6 +54974,7 @@
     method public boolean addAccessibilityStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
     method public void addAccessibilityStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener, @Nullable android.os.Handler);
     method public void addAudioDescriptionRequestedChangeListener(@NonNull java.util.concurrent.Executor, @NonNull android.view.accessibility.AccessibilityManager.AudioDescriptionRequestedChangeListener);
+    method @FlaggedApi("com.android.graphics.hwui.flags.high_contrast_text_small_text_rect") public void addHighContrastTextStateChangeListener(@NonNull java.util.concurrent.Executor, @NonNull android.view.accessibility.AccessibilityManager.HighContrastTextStateChangeListener);
     method public boolean addTouchExplorationStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
     method public void addTouchExplorationStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener, @Nullable android.os.Handler);
     method @ColorInt public int getAccessibilityFocusColor();
@@ -54914,12 +54987,14 @@
     method public static boolean isAccessibilityButtonSupported();
     method public boolean isAudioDescriptionRequested();
     method public boolean isEnabled();
+    method @FlaggedApi("com.android.graphics.hwui.flags.high_contrast_text_small_text_rect") public boolean isHighContrastTextEnabled();
     method public boolean isRequestFromAccessibilityTool();
     method public boolean isTouchExplorationEnabled();
     method public void removeAccessibilityRequestPreparer(android.view.accessibility.AccessibilityRequestPreparer);
     method public boolean removeAccessibilityServicesStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener);
     method public boolean removeAccessibilityStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
     method public boolean removeAudioDescriptionRequestedChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AudioDescriptionRequestedChangeListener);
+    method @FlaggedApi("com.android.graphics.hwui.flags.high_contrast_text_small_text_rect") public void removeHighContrastTextStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.HighContrastTextStateChangeListener);
     method public boolean removeTouchExplorationStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
     method public void sendAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
     field public static final int FLAG_CONTENT_CONTROLS = 4; // 0x4
@@ -54939,6 +55014,10 @@
     method public void onAudioDescriptionRequestedChanged(boolean);
   }
 
+  @FlaggedApi("com.android.graphics.hwui.flags.high_contrast_text_small_text_rect") public static interface AccessibilityManager.HighContrastTextStateChangeListener {
+    method public void onHighContrastTextStateChanged(boolean);
+  }
+
   public static interface AccessibilityManager.TouchExplorationStateChangeListener {
     method public void onTouchExplorationStateChanged(boolean);
   }
@@ -61591,6 +61670,7 @@
     method public void unregisterOnBackInvokedCallback(@NonNull android.window.OnBackInvokedCallback);
     field public static final int PRIORITY_DEFAULT = 0; // 0x0
     field public static final int PRIORITY_OVERLAY = 1000000; // 0xf4240
+    field @FlaggedApi("com.android.window.flags.predictive_back_priority_system_navigation_observer") public static final int PRIORITY_SYSTEM_NAVIGATION_OBSERVER = -2; // 0xfffffffe
   }
 
   public interface SplashScreen {
diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt
index 8447a7f..287e787 100644
--- a/core/api/module-lib-current.txt
+++ b/core/api/module-lib-current.txt
@@ -604,6 +604,7 @@
 
   public class TelephonyManager {
     method @NonNull public static int[] getAllNetworkTypes();
+    method @FlaggedApi("android.os.mainline_vcn_platform_api") @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.Set<java.lang.String> getPackagesWithCarrierPrivileges();
   }
 
 }
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 569776e..8edfc21 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -91,6 +91,7 @@
     field public static final String BIND_TRANSLATION_SERVICE = "android.permission.BIND_TRANSLATION_SERVICE";
     field public static final String BIND_TRUST_AGENT = "android.permission.BIND_TRUST_AGENT";
     field public static final String BIND_TV_REMOTE_SERVICE = "android.permission.BIND_TV_REMOTE_SERVICE";
+    field @FlaggedApi("android.content.pm.verification_service") public static final String BIND_VERIFICATION_AGENT = "android.permission.BIND_VERIFICATION_AGENT";
     field public static final String BIND_VISUAL_QUERY_DETECTION_SERVICE = "android.permission.BIND_VISUAL_QUERY_DETECTION_SERVICE";
     field public static final String BIND_WALLPAPER_EFFECTS_GENERATION_SERVICE = "android.permission.BIND_WALLPAPER_EFFECTS_GENERATION_SERVICE";
     field public static final String BIND_WEARABLE_SENSING_SERVICE = "android.permission.BIND_WEARABLE_SENSING_SERVICE";
@@ -412,6 +413,7 @@
     field @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence") public static final String USE_ON_DEVICE_INTELLIGENCE = "android.permission.USE_ON_DEVICE_INTELLIGENCE";
     field public static final String USE_RESERVED_DISK = "android.permission.USE_RESERVED_DISK";
     field public static final String UWB_PRIVILEGED = "android.permission.UWB_PRIVILEGED";
+    field @FlaggedApi("android.content.pm.verification_service") public static final String VERIFICATION_AGENT = "android.permission.VERIFICATION_AGENT";
     field @FlaggedApi("android.os.vibrator.vendor_vibration_effects") public static final String VIBRATE_VENDOR_EFFECTS = "android.permission.VIBRATE_VENDOR_EFFECTS";
     field public static final String WHITELIST_AUTO_REVOKE_PERMISSIONS = "android.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS";
     field public static final String WHITELIST_RESTRICTED_PERMISSIONS = "android.permission.WHITELIST_RESTRICTED_PERMISSIONS";
@@ -442,6 +444,7 @@
 
   public static final class R.attr {
     field public static final int allowClearUserDataOnFailedRestore = 16844288; // 0x1010600
+    field @FlaggedApi("android.permission.flags.replace_body_sensor_permission_enabled") public static final int backgroundPermission;
     field @FlaggedApi("android.content.res.manifest_flagging") public static final int featureFlag = 16844428; // 0x101068c
     field public static final int gameSessionService = 16844373; // 0x1010655
     field public static final int hotwordDetectionService = 16844326; // 0x1010626
@@ -691,6 +694,7 @@
     field public static final String OPSTR_PROJECT_MEDIA = "android:project_media";
     field @FlaggedApi("android.view.contentprotection.flags.rapid_clear_notifications_by_listener_app_op_enabled") public static final String OPSTR_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER = "android:rapid_clear_notifications_by_listener";
     field public static final String OPSTR_READ_CLIPBOARD = "android:read_clipboard";
+    field @FlaggedApi("android.permission.flags.replace_body_sensor_permission_enabled") public static final String OPSTR_READ_HEART_RATE = "android:read_heart_rate";
     field public static final String OPSTR_READ_ICC_SMS = "android:read_icc_sms";
     field public static final String OPSTR_READ_MEDIA_AUDIO = "android:read_media_audio";
     field public static final String OPSTR_READ_MEDIA_IMAGES = "android:read_media_images";
@@ -3492,8 +3496,8 @@
     method @NonNull public android.content.Context createContext();
     method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.companion.virtual.audio.VirtualAudioDevice createVirtualAudioDevice(@NonNull android.hardware.display.VirtualDisplay, @Nullable java.util.concurrent.Executor, @Nullable android.companion.virtual.audio.VirtualAudioDevice.AudioConfigurationChangeCallback);
     method @FlaggedApi("android.companion.virtual.flags.virtual_camera") @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.companion.virtual.camera.VirtualCamera createVirtualCamera(@NonNull android.companion.virtual.camera.VirtualCameraConfig);
-    method @Deprecated @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(@IntRange(from=1) int, @IntRange(from=1) int, @IntRange(from=1) int, @Nullable android.view.Surface, int, @Nullable java.util.concurrent.Executor, @Nullable android.hardware.display.VirtualDisplay.Callback);
-    method @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull android.hardware.display.VirtualDisplayConfig, @Nullable java.util.concurrent.Executor, @Nullable android.hardware.display.VirtualDisplay.Callback);
+    method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.display.VirtualDisplay createVirtualDisplay(@IntRange(from=1) int, @IntRange(from=1) int, @IntRange(from=1) int, @Nullable android.view.Surface, int, @Nullable java.util.concurrent.Executor, @Nullable android.hardware.display.VirtualDisplay.Callback);
+    method @Nullable @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull android.hardware.display.VirtualDisplayConfig, @Nullable java.util.concurrent.Executor, @Nullable android.hardware.display.VirtualDisplay.Callback);
     method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualDpad createVirtualDpad(@NonNull android.hardware.input.VirtualDpadConfig);
     method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualKeyboard createVirtualKeyboard(@NonNull android.hardware.input.VirtualKeyboardConfig);
     method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualKeyboard createVirtualKeyboard(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int);
@@ -3506,8 +3510,9 @@
     method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualTouchscreen createVirtualTouchscreen(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int);
     method public int getDeviceId();
     method @FlaggedApi("android.companion.virtual.flags.vdm_public_apis") @Nullable public String getPersistentDeviceId();
-    method @NonNull public java.util.List<android.companion.virtual.sensor.VirtualSensor> getVirtualSensorList();
-    method public void launchPendingIntent(int, @NonNull android.app.PendingIntent, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.IntConsumer);
+    method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public java.util.List<android.companion.virtual.sensor.VirtualSensor> getVirtualSensorList();
+    method @FlaggedApi("android.companion.virtualdevice.flags.device_aware_display_power") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void goToSleep();
+    method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void launchPendingIntent(int, @NonNull android.app.PendingIntent, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.IntConsumer);
     method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void registerIntentInterceptor(@NonNull android.content.IntentFilter, @NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.VirtualDeviceManager.IntentInterceptorCallback);
     method public void removeActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener);
     method @FlaggedApi("android.companion.virtual.flags.dynamic_policy") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void removeActivityPolicyExemption(@NonNull android.content.ComponentName);
@@ -3518,6 +3523,7 @@
     method @FlaggedApi("android.companion.virtual.flags.vdm_custom_ime") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void setDisplayImePolicy(int, int);
     method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void setShowPointerIcon(boolean);
     method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void unregisterIntentInterceptor(@NonNull android.companion.virtual.VirtualDeviceManager.IntentInterceptorCallback);
+    method @FlaggedApi("android.companion.virtualdevice.flags.device_aware_display_power") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void wakeUp();
   }
 
   public final class VirtualDeviceParams implements android.os.Parcelable {
@@ -4302,6 +4308,7 @@
     method @Deprecated @RequiresPermission(android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT) public abstract void verifyIntentFilter(int, int, @NonNull java.util.List<java.lang.String>);
     field public static final String ACTION_REQUEST_PERMISSIONS = "android.content.pm.action.REQUEST_PERMISSIONS";
     field public static final String ACTION_REQUEST_PERMISSIONS_FOR_OTHER = "android.content.pm.action.REQUEST_PERMISSIONS_FOR_OTHER";
+    field @FlaggedApi("android.content.pm.verification_service") public static final String ACTION_VERIFY_PACKAGE = "android.content.pm.action.VERIFY_PACKAGE";
     field @FlaggedApi("android.content.pm.asl_in_apk_app_metadata_source") public static final int APP_METADATA_SOURCE_APK = 1; // 0x1
     field @FlaggedApi("android.content.pm.asl_in_apk_app_metadata_source") public static final int APP_METADATA_SOURCE_INSTALLER = 2; // 0x2
     field @FlaggedApi("android.content.pm.asl_in_apk_app_metadata_source") public static final int APP_METADATA_SOURCE_SYSTEM_IMAGE = 3; // 0x3
@@ -4615,6 +4622,61 @@
 
 }
 
+package android.content.pm.verify.pkg {
+
+  @FlaggedApi("android.content.pm.verification_service") public final class VerificationSession implements android.os.Parcelable {
+    method public int describeContents();
+    method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public long extendTimeRemaining(long);
+    method @NonNull public java.util.List<android.content.pm.SharedLibraryInfo> getDeclaredLibraries();
+    method @NonNull public android.os.PersistableBundle getExtensionParams();
+    method public int getId();
+    method public int getInstallSessionId();
+    method @NonNull public String getPackageName();
+    method @NonNull public android.content.pm.SigningInfo getSigningInfo();
+    method @NonNull public android.net.Uri getStagedPackageUri();
+    method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public long getTimeoutTime();
+    method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationComplete(@NonNull android.content.pm.verify.pkg.VerificationStatus);
+    method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationComplete(@NonNull android.content.pm.verify.pkg.VerificationStatus, @NonNull android.os.PersistableBundle);
+    method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationIncomplete(int);
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.verify.pkg.VerificationSession> CREATOR;
+    field public static final int VERIFICATION_INCOMPLETE_NETWORK_LIMITED = 2; // 0x2
+    field public static final int VERIFICATION_INCOMPLETE_NETWORK_UNAVAILABLE = 1; // 0x1
+    field public static final int VERIFICATION_INCOMPLETE_UNKNOWN = 0; // 0x0
+  }
+
+  @FlaggedApi("android.content.pm.verification_service") public final class VerificationStatus implements android.os.Parcelable {
+    method public int describeContents();
+    method public int getAslStatus();
+    method @NonNull public String getFailureMessage();
+    method public boolean isVerified();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.verify.pkg.VerificationStatus> CREATOR;
+    field public static final int VERIFIER_STATUS_ASL_BAD = 2; // 0x2
+    field public static final int VERIFIER_STATUS_ASL_GOOD = 1; // 0x1
+    field public static final int VERIFIER_STATUS_ASL_UNDEFINED = 0; // 0x0
+  }
+
+  public static final class VerificationStatus.Builder {
+    ctor public VerificationStatus.Builder();
+    method @NonNull public android.content.pm.verify.pkg.VerificationStatus build();
+    method @NonNull public android.content.pm.verify.pkg.VerificationStatus.Builder setAslStatus(int);
+    method @NonNull public android.content.pm.verify.pkg.VerificationStatus.Builder setFailureMessage(@NonNull String);
+    method @NonNull public android.content.pm.verify.pkg.VerificationStatus.Builder setVerified(boolean);
+  }
+
+  @FlaggedApi("android.content.pm.verification_service") public abstract class VerifierService extends android.app.Service {
+    ctor public VerifierService();
+    method @Nullable public android.os.IBinder onBind(@Nullable android.content.Intent);
+    method public abstract void onPackageNameAvailable(@NonNull String);
+    method public abstract void onVerificationCancelled(@NonNull String);
+    method public abstract void onVerificationRequired(@NonNull android.content.pm.verify.pkg.VerificationSession);
+    method public abstract void onVerificationRetry(@NonNull android.content.pm.verify.pkg.VerificationSession);
+    method public abstract void onVerificationTimeout(int);
+  }
+
+}
+
 package android.content.rollback {
 
   public final class PackageRollbackInfo implements android.os.Parcelable {
@@ -6822,6 +6884,27 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.ModuleProperties> CREATOR;
   }
 
+  @FlaggedApi("android.media.soundtrigger.manager_api") public static final class SoundTrigger.RecognitionConfig implements android.os.Parcelable {
+    method public int describeContents();
+    method public int getAudioCapabilities();
+    method @NonNull public byte[] getData();
+    method @NonNull public java.util.List<android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra> getKeyphrases();
+    method public boolean isAllowMultipleTriggers();
+    method public boolean isCaptureRequested();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.RecognitionConfig> CREATOR;
+  }
+
+  public static final class SoundTrigger.RecognitionConfig.Builder {
+    ctor public SoundTrigger.RecognitionConfig.Builder();
+    method @NonNull public android.hardware.soundtrigger.SoundTrigger.RecognitionConfig build();
+    method @NonNull public android.hardware.soundtrigger.SoundTrigger.RecognitionConfig.Builder setAllowMultipleTriggers(boolean);
+    method @NonNull public android.hardware.soundtrigger.SoundTrigger.RecognitionConfig.Builder setAudioCapabilities(int);
+    method @NonNull public android.hardware.soundtrigger.SoundTrigger.RecognitionConfig.Builder setCaptureRequested(boolean);
+    method @NonNull public android.hardware.soundtrigger.SoundTrigger.RecognitionConfig.Builder setData(@Nullable byte[]);
+    method @NonNull public android.hardware.soundtrigger.SoundTrigger.RecognitionConfig.Builder setKeyphrases(@NonNull java.util.Collection<android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra>);
+  }
+
   public static class SoundTrigger.RecognitionEvent {
     method @Nullable public android.media.AudioFormat getCaptureFormat();
     method public int getCaptureSession();
@@ -7772,10 +7855,16 @@
     method @Deprecated @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public void deleteModel(java.util.UUID);
     method public int getDetectionServiceOperationsTimeout();
     method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public android.media.soundtrigger.SoundTriggerManager.Model getModel(java.util.UUID);
+    method @FlaggedApi("android.media.soundtrigger.manager_api") @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public int getModelState(@NonNull java.util.UUID);
     method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public android.hardware.soundtrigger.SoundTrigger.ModuleProperties getModuleProperties();
     method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public int getParameter(@NonNull java.util.UUID, int);
+    method @FlaggedApi("android.media.soundtrigger.manager_api") @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public boolean isRecognitionActive(@NonNull java.util.UUID);
+    method @FlaggedApi("android.media.soundtrigger.manager_api") @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public int loadSoundModel(@NonNull android.hardware.soundtrigger.SoundTrigger.SoundModel);
     method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public android.hardware.soundtrigger.SoundTrigger.ModelParamRange queryParameter(@Nullable java.util.UUID, int);
     method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public int setParameter(@Nullable java.util.UUID, int, int);
+    method @FlaggedApi("android.media.soundtrigger.manager_api") @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public int startRecognition(@NonNull java.util.UUID, @Nullable android.os.Bundle, @NonNull android.content.ComponentName, @NonNull android.hardware.soundtrigger.SoundTrigger.RecognitionConfig);
+    method @FlaggedApi("android.media.soundtrigger.manager_api") @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public int stopRecognition(@NonNull java.util.UUID);
+    method @FlaggedApi("android.media.soundtrigger.manager_api") @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public int unloadSoundModel(@NonNull java.util.UUID);
     method @Deprecated @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public void updateModel(android.media.soundtrigger.SoundTriggerManager.Model);
   }
 
@@ -8454,11 +8543,14 @@
     method public long getAudioHandle();
     method @NonNull public java.util.List<android.media.AudioPresentation> getAudioPresentations();
     method public long getAvDataId();
+    method @FlaggedApi("android.media.tv.flags.tuner_w_apis") public int getDataGroupId();
     method public long getDataLength();
     method public long getDts();
     method @Nullable public android.media.tv.tuner.filter.AudioDescriptor getExtraMetaData();
+    method @FlaggedApi("android.media.tv.flags.tuner_w_apis") @IntRange(from=0) public int getIndexInDataGroup();
     method @Nullable public android.media.MediaCodec.LinearBlock getLinearBlock();
     method @IntRange(from=0) public int getMpuSequenceNumber();
+    method @FlaggedApi("android.media.tv.flags.tuner_w_apis") @IntRange(from=0) public int getNumDataPieces();
     method public long getOffset();
     method public long getPts();
     method public int getScIndexMask();
@@ -11864,6 +11956,15 @@
     field @Deprecated public static final String STATE = "state";
   }
 
+  @FlaggedApi("android.provider.new_default_account_api_enabled") public static final class ContactsContract.RawContacts.DefaultAccount {
+    method @FlaggedApi("android.provider.new_default_account_api_enabled") @NonNull @RequiresPermission(android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS) public static java.util.List<android.accounts.Account> getEligibleCloudAccounts(@NonNull android.content.ContentResolver);
+    method @FlaggedApi("android.provider.new_default_account_api_enabled") @RequiresPermission(allOf={android.Manifest.permission.READ_CONTACTS, android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS}) public static int getNumberOfMovableLocalContacts(@NonNull android.content.ContentResolver);
+    method @FlaggedApi("android.provider.new_default_account_api_enabled") @RequiresPermission(allOf={android.Manifest.permission.READ_CONTACTS, android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS}) public static int getNumberOfMovableSimContacts(@NonNull android.content.ContentResolver);
+    method @FlaggedApi("android.provider.new_default_account_api_enabled") @RequiresPermission(allOf={android.Manifest.permission.WRITE_CONTACTS, android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS}) public static void moveLocalContactsToCloudDefaultAccount(@NonNull android.content.ContentResolver);
+    method @FlaggedApi("android.provider.new_default_account_api_enabled") @RequiresPermission(allOf={android.Manifest.permission.WRITE_CONTACTS, android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS}) public static void moveSimContactsToCloudDefaultAccount(@NonNull android.content.ContentResolver);
+    method @FlaggedApi("android.provider.new_default_account_api_enabled") @RequiresPermission(android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS) public static void setDefaultAccountForNewContacts(@NonNull android.content.ContentResolver, @NonNull android.provider.ContactsContract.RawContacts.DefaultAccount.DefaultAccountAndState);
+  }
+
   public static final class ContactsContract.Settings implements android.provider.ContactsContract.SettingsColumns {
     method @RequiresPermission(android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS) public static void setDefaultAccount(@NonNull android.content.ContentResolver, @Nullable android.accounts.Account);
   }
@@ -13018,6 +13119,7 @@
     method public void onPanelHidden();
     method public void onPanelRevealed(int);
     method public void onSuggestedReplySent(@NonNull String, @NonNull CharSequence, int);
+    method @FlaggedApi("android.service.notification.notification_classification") public final void setAdjustmentTypeSupportedState(@NonNull String, boolean);
     method public final void unsnoozeNotification(@NonNull String);
     field public static final String ACTION_NOTIFICATION_ASSISTANT_DETAIL_SETTINGS = "android.service.notification.action.NOTIFICATION_ASSISTANT_DETAIL_SETTINGS";
     field @FlaggedApi("android.service.notification.notification_classification") public static final String ACTION_NOTIFICATION_ASSISTANT_FEEDBACK_SETTINGS = "android.service.notification.action.NOTIFICATION_ASSISTANT_FEEDBACK_SETTINGS";
@@ -15861,6 +15963,8 @@
     field public static final String TYPE_IMS_STRING = "ims";
     field public static final String TYPE_MCX_STRING = "mcx";
     field public static final String TYPE_MMS_STRING = "mms";
+    field @FlaggedApi("com.android.internal.telephony.flags.oem_paid_private") public static final String TYPE_OEM_PAID_STRING = "oem_paid";
+    field @FlaggedApi("com.android.internal.telephony.flags.oem_paid_private") public static final String TYPE_OEM_PRIVATE_STRING = "oem_private";
     field @FlaggedApi("com.android.internal.telephony.flags.carrier_enabled_satellite_flag") public static final String TYPE_RCS_STRING = "rcs";
     field public static final String TYPE_SUPL_STRING = "supl";
     field public static final String TYPE_VSIM_STRING = "vsim";
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 659222d..76e9ca0 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -396,6 +396,7 @@
     method public void cleanUpCallersAfter(long);
     method @FlaggedApi("android.app.modes_api") @NonNull public android.service.notification.ZenPolicy getDefaultZenPolicy();
     method public android.content.ComponentName getEffectsSuppressor();
+    method @FlaggedApi("android.service.notification.notification_classification") @NonNull public java.util.Set<java.lang.String> getUnsupportedAdjustmentTypes();
     method public boolean isNotificationPolicyAccessGrantedForPackage(@NonNull String);
     method @FlaggedApi("android.app.modes_api") public boolean removeAutomaticZenRule(@NonNull String, boolean);
     method @FlaggedApi("android.app.api_rich_ongoing") public void setCanPostPromotedNotifications(@NonNull String, int, boolean);
@@ -1614,15 +1615,15 @@
   public final class CameraManager {
     method @NonNull public android.hardware.camera2.CameraCharacteristics getCameraCharacteristics(@NonNull String, boolean) throws android.hardware.camera2.CameraAccessException;
     method public String[] getCameraIdListNoLazy() throws android.hardware.camera2.CameraAccessException;
-    method @FlaggedApi("com.android.window.flags.camera_compat_for_freeform") public static int getRotationOverrideInternal(@Nullable android.content.Context, @Nullable android.content.pm.PackageManager, @Nullable String);
+    method @FlaggedApi("com.android.window.flags.enable_camera_compat_for_desktop_windowing") public static int getRotationOverrideInternal(@Nullable android.content.Context, @Nullable android.content.pm.PackageManager, @Nullable String);
     method @RequiresPermission(android.Manifest.permission.CAMERA) public void openCamera(@NonNull String, boolean, @Nullable android.os.Handler, @NonNull android.hardware.camera2.CameraDevice.StateCallback) throws android.hardware.camera2.CameraAccessException;
     method @RequiresPermission(allOf={android.Manifest.permission.SYSTEM_CAMERA, android.Manifest.permission.CAMERA}) public void openCamera(@NonNull String, int, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraDevice.StateCallback) throws android.hardware.camera2.CameraAccessException;
     method public static boolean shouldOverrideToPortrait(@Nullable android.content.pm.PackageManager, @Nullable String);
     field public static final String LANDSCAPE_TO_PORTRAIT_PROP = "camera.enable_landscape_to_portrait";
     field public static final long OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT = 250678880L; // 0xef10e60L
-    field @FlaggedApi("com.android.window.flags.camera_compat_for_freeform") public static final int ROTATION_OVERRIDE_NONE = 0; // 0x0
-    field @FlaggedApi("com.android.window.flags.camera_compat_for_freeform") public static final int ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT = 1; // 0x1
-    field @FlaggedApi("com.android.window.flags.camera_compat_for_freeform") public static final int ROTATION_OVERRIDE_ROTATION_ONLY = 2; // 0x2
+    field @FlaggedApi("com.android.window.flags.enable_camera_compat_for_desktop_windowing") public static final int ROTATION_OVERRIDE_NONE = 0; // 0x0
+    field @FlaggedApi("com.android.window.flags.enable_camera_compat_for_desktop_windowing") public static final int ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT = 1; // 0x1
+    field @FlaggedApi("com.android.window.flags.enable_camera_compat_for_desktop_windowing") public static final int ROTATION_OVERRIDE_ROTATION_ONLY = 2; // 0x2
   }
 
   public abstract static class CameraManager.AvailabilityCallback {
@@ -1886,17 +1887,9 @@
     ctor public SoundTrigger.ModuleProperties(int, @NonNull String, @NonNull String, @NonNull String, int, @NonNull String, int, int, int, int, boolean, int, boolean, int, boolean, int);
   }
 
-  public static final class SoundTrigger.RecognitionConfig implements android.os.Parcelable {
-    ctor public SoundTrigger.RecognitionConfig(boolean, boolean, @Nullable android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra[], @Nullable byte[], int);
+  @FlaggedApi("android.media.soundtrigger.manager_api") public static final class SoundTrigger.RecognitionConfig implements android.os.Parcelable {
+    ctor @Deprecated public SoundTrigger.RecognitionConfig(boolean, boolean, @Nullable android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra[], @Nullable byte[], int);
     ctor public SoundTrigger.RecognitionConfig(boolean, boolean, @Nullable android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra[], @Nullable byte[]);
-    method public int describeContents();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.RecognitionConfig> CREATOR;
-    field public final boolean allowMultipleTriggers;
-    field public final int audioCapabilities;
-    field public final boolean captureRequested;
-    field @NonNull public final byte[] data;
-    field @NonNull public final android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra[] keyphrases;
   }
 
   public static class SoundTrigger.RecognitionEvent {
@@ -2217,7 +2210,7 @@
   public class SoundTriggerInstrumentation.RecognitionSession {
     method public void clearRecognitionCallback();
     method public int getAudioSession();
-    method @NonNull public android.hardware.soundtrigger.SoundTrigger.RecognitionConfig getRecognitionConfig();
+    method @FlaggedApi("android.media.soundtrigger.manager_api") @NonNull public android.hardware.soundtrigger.SoundTrigger.RecognitionConfig getRecognitionConfig();
     method public void setRecognitionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.soundtrigger.SoundTriggerInstrumentation.RecognitionCallback);
     method public void triggerAbortRecognition();
     method public void triggerRecognitionEvent(@NonNull byte[], @Nullable java.util.List<android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra>);
@@ -2228,7 +2221,6 @@
     method @NonNull public android.media.soundtrigger.SoundTriggerManager createManagerForModule(@NonNull android.hardware.soundtrigger.SoundTrigger.ModuleProperties);
     method @NonNull public android.media.soundtrigger.SoundTriggerManager createManagerForTestModule();
     method @NonNull public static java.util.List<android.hardware.soundtrigger.SoundTrigger.ModuleProperties> listModuleProperties();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public int loadSoundModel(@NonNull android.hardware.soundtrigger.SoundTrigger.SoundModel);
   }
 
   public static class SoundTriggerManager.Model {
@@ -2611,7 +2603,7 @@
 
   public abstract class Vibrator {
     method public int getDefaultVibrationIntensity(int);
-    method @Nullable public android.os.vibrator.VibratorFrequencyProfile getFrequencyProfile();
+    method @Nullable public android.os.vibrator.VibratorFrequencyProfileLegacy getFrequencyProfileLegacy();
     method public boolean hasFrequencyControl();
     field public static final int VIBRATION_INTENSITY_HIGH = 3; // 0x3
     field public static final int VIBRATION_INTENSITY_LOW = 1; // 0x1
@@ -2801,7 +2793,7 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.os.vibrator.VibrationEffectSegment> CREATOR;
   }
 
-  public final class VibratorFrequencyProfile {
+  public final class VibratorFrequencyProfileLegacy {
     method public float getMaxAmplitudeMeasurementInterval();
     method @FloatRange(from=0, to=1) @NonNull public float[] getMaxAmplitudeMeasurements();
     method public float getMaxFrequency();
@@ -3132,7 +3124,7 @@
 
 package android.service.chooser {
 
-  @FlaggedApi("android.service.chooser.enable_chooser_result") public final class ChooserResult implements android.os.Parcelable {
+  public final class ChooserResult implements android.os.Parcelable {
     ctor public ChooserResult(int, @Nullable android.content.ComponentName, boolean);
   }
 
diff --git a/core/java/Android.bp b/core/java/Android.bp
index 92bca3c..1265de1 100644
--- a/core/java/Android.bp
+++ b/core/java/Android.bp
@@ -21,14 +21,52 @@
         "**/*.aidl",
         ":framework-nfc-non-updatable-sources",
         ":messagequeue-gen",
+        ":ranging_stack_mock_initializer",
     ],
     // Exactly one MessageQueue.java will be added to srcs by messagequeue-gen
     exclude_srcs: [
         "android/os/*MessageQueue/**/*.java",
+        "android/ranging/**/*.java",
     ],
     visibility: ["//frameworks/base"],
 }
 
+//Mock to allow service registry for ranging stack.
+//TODO(b/331206299): Remove this after RELEASE_RANGING_STACK is ramped up to next.
+soong_config_module_type {
+    name: "ranging_stack_framework_mock_init",
+    module_type: "genrule",
+    config_namespace: "bootclasspath",
+    bool_variables: [
+        "release_ranging_stack",
+    ],
+    properties: [
+        "srcs",
+        "cmd",
+        "out",
+    ],
+}
+
+// The actual RangingFrameworkInitializer is present in packages/modules/Uwb/ranging/framework.
+// Mock RangingFrameworkInitializer does nothing and allows to successfully build
+// SystemServiceRegistry after registering for system service in SystemServiceRegistry both with
+// and without build flag RELEASE_RANGING_STACK enabled.
+ranging_stack_framework_mock_init {
+    name: "ranging_stack_mock_initializer",
+    soong_config_variables: {
+        release_ranging_stack: {
+            cmd: "touch $(out)",
+            // Adding an empty file as out is mandatory.
+            out: ["android/ranging/empty_ranging_fw.txt"],
+            conditions_default: {
+                srcs: ["android/ranging/mock/RangingFrameworkInitializer.java"],
+                cmd: "mkdir -p android/ranging/; cp $(in) $(out);",
+                out: ["android/ranging/RangingFrameworkInitializer.java"],
+            },
+        },
+    },
+}
+
 // Add selected MessageQueue.java implementation to srcs
 soong_config_module_type {
     name: "release_package_messagequeue_implementation_srcs",
@@ -609,7 +647,6 @@
 
 java_library {
     name: "protolog-lib",
-    platform_apis: true,
     srcs: [
         "com/android/internal/protolog/ProtoLogImpl.java",
         "com/android/internal/protolog/ProtoLogViewerConfigReader.java",
@@ -622,7 +659,7 @@
 java_library {
     name: "protolog-groups",
     srcs: [
-        "com/android/internal/protolog/ProtoLogGroup.java",
+        "com/android/internal/protolog/WmProtoLogGroups.java",
         ":protolog-common-src",
     ],
 }
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index d318812..3bd121a 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -1323,4 +1323,12 @@
      */
     public abstract void killApplicationSync(String pkgName, int appId, int userId,
             String reason, int exitInfoReason);
+
+    /**
+     * Add a creator token for all embedded intents (stored as extra) of the given intent.
+     *
+     * @param intent The given intent
+     * @hide
+     */
+    public abstract void addCreatorToken(Intent intent);
 }
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 91aa225..6ab39b0 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -26,6 +26,7 @@
 import static android.view.Display.INVALID_DISPLAY;
 import static android.window.DisplayAreaOrganizer.FEATURE_UNDEFINED;
 
+import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -67,6 +68,8 @@
 import android.window.SplashScreen;
 import android.window.WindowContainerToken;
 
+import com.android.window.flags.Flags;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
@@ -108,35 +111,64 @@
             MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS,
             MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE})
     public @interface BackgroundActivityStartMode {}
+
     /**
-     * No explicit value chosen. The system will decide whether to grant privileges.
+     * The system determines whether to grant background activity start privileges. This is the
+     * default behavior if no explicit mode is specified.
      */
     public static final int MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED = 0;
     /**
-     * Allow the {@link PendingIntent} to use the background activity start privileges.
+     * Grants the {@link PendingIntent} background activity start privileges.
+     *
+     * This behaves the same as {@link #MODE_BACKGROUND_ACTIVITY_START_ALLOWED_ALWAYS}, except it
+     * does not grant background activity launch permissions based on the privileged permission
+     * <code>START_ACTIVITIES_FROM_BACKGROUND</code>.
+     *
+     * @deprecated Use {@link #MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE} to allow starts
+     * only when the app is visible or {@link #MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS} to
+     * allow starts at any time (see <a
+     * href="https://developer.android.com/guide/components/activities/background-starts">
+     * Restrictions on starting activities from the background</a>).
      */
+    @Deprecated
+    @FlaggedApi(Flags.FLAG_BAL_ADDITIONAL_START_MODES)
     public static final int MODE_BACKGROUND_ACTIVITY_START_ALLOWED = 1;
     /**
-     * Deny the {@link PendingIntent} to use the background activity start privileges.
+     * Denies the {@link PendingIntent} any background activity start privileges.
      */
+    @FlaggedApi(Flags.FLAG_BAL_ADDITIONAL_START_MODES)
     public static final int MODE_BACKGROUND_ACTIVITY_START_DENIED = 2;
     /**
-     * Allow the {@link PendingIntent} to use ALL background activity start privileges, including
-     * special permissions that will allow starts at any time.
+     * Grants the {@link PendingIntent} all background activity start privileges, including
+     * those normally reserved for privileged contexts (e.g., companion apps or those with the
+     * {@code START_ACTIVITIES_FROM_BACKGROUND} permission).
      *
-     * @hide
+     * <p><b>Caution:</b> This mode should be used sparingly. Most apps should use
+     * {@link #MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE} instead, relying on notifications
+     * or foreground services for background interactions to minimize user disruption. However,
+     * this mode  is necessary for specific use cases, such as companion apps responding to
+     * prompts from a connected device.
+     *
+     * <p>For more information on background activity start restrictions, see:
+     * <a href="https://developer.android.com/guide/components/activities/background-starts">
+     * Restrictions on starting activities from  the background</a>
      */
+    @FlaggedApi(Flags.FLAG_BAL_ADDITIONAL_START_MODES)
     public static final int MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS = 3;
     /**
-     * Allow the {@link PendingIntent} to use background activity start privileges based on
-     * visibility of the app.
+     * Grants the {@link PendingIntent} background activity start privileges only when the app
+     * has a visible window (i.e., is visible to the user). This is the recommended mode for most
+     * apps to minimize disruption to the user experience.
      *
-     * @hide
+     * <p>For more information on background activity start restrictions, see:
+     * <a href="https://developer.android.com/guide/components/activities/background-starts">
+     * Restrictions on starting activities from the background</a>
      */
+    @FlaggedApi(Flags.FLAG_BAL_ADDITIONAL_START_MODES)
     public static final int MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE = 4;
     /**
-     * Special behavior for compatibility.
-     * Similar to {@link #MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED}
+     * Provides compatibility with previous Android versions regarding background activity starts.
+     * Similar to {@link #MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED}.
      *
      * @hide
      */
@@ -453,6 +485,10 @@
     private static final String KEY_PENDING_INTENT_CREATOR_BACKGROUND_ACTIVITY_START_MODE =
             "android.activity.pendingIntentCreatorBackgroundActivityStartMode";
 
+    /** See {@link #setAllowPassThroughOnTouchOutside(boolean)}. */
+    private static final String KEY_ALLOW_PASS_THROUGH_ON_TOUCH_OUTSIDE =
+            "android.activity.allowPassThroughOnTouchOutside";
+
     /**
      * @see #setLaunchCookie
      * @hide
@@ -554,6 +590,7 @@
     private int mPendingIntentCreatorBackgroundActivityStartMode =
             MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED;
     private boolean mDisableStartingWindow;
+    private boolean mAllowPassThroughOnTouchOutside;
 
     /**
      * Create an ActivityOptions specifying a custom animation to run when
@@ -1416,6 +1453,7 @@
                 KEY_PENDING_INTENT_CREATOR_BACKGROUND_ACTIVITY_START_MODE,
                 MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED);
         mDisableStartingWindow = opts.getBoolean(KEY_DISABLE_STARTING_WINDOW);
+        mAllowPassThroughOnTouchOutside = opts.getBoolean(KEY_ALLOW_PASS_THROUGH_ON_TOUCH_OUTSIDE);
         mAnimationAbortListener = IRemoteCallback.Stub.asInterface(
                 opts.getBinder(KEY_ANIM_ABORT_LISTENER));
     }
@@ -1839,6 +1877,39 @@
                 && mLaunchIntoPipParams.isLaunchIntoPip();
     }
 
+    /**
+     * Returns whether the source activity allows the overlaying activities from the to-be-launched
+     * app to pass through touch events to it when touches fall outside the content window.
+     *
+     * @see #setAllowPassThroughOnTouchOutside(boolean)
+     */
+    @FlaggedApi(com.android.window.flags.Flags.FLAG_TOUCH_PASS_THROUGH_OPT_IN)
+    public boolean isAllowPassThroughOnTouchOutside() {
+        return mAllowPassThroughOnTouchOutside;
+    }
+
+    /**
+     * Sets whether the source activity allows the overlaying activities from the to-be-launched
+     * app to pass through touch events to it when touches fall outside the content window.
+     *
+     * <p> By default, touches that fall on a translucent non-touchable area of an overlaying
+     * activity window are blocked from passing through to the activity below (source activity),
+     * unless the overlaying activity is from the same UID as the source activity. The source
+     * activity may use this method to opt in and allow the overlaying activities from the
+     * to-be-launched app to pass through touches to itself. The source activity needs to ensure
+     * that it trusts the overlaying activity and its content is not vulnerable to UI redressing
+     * attacks. The flag is ignored if the context calling
+     * {@link Context#startActivity(Intent, Bundle)} is not an activity.
+     *
+     * <p> For backward compatibility, apps with target SDK 35 and below may still receive
+     * pass-through touches without opt-in if the cross-uid activity is launched by the source
+     * activity.
+     */
+    @FlaggedApi(com.android.window.flags.Flags.FLAG_TOUCH_PASS_THROUGH_OPT_IN)
+    public void setAllowPassThroughOnTouchOutside(boolean allowed) {
+        mAllowPassThroughOnTouchOutside = allowed;
+    }
+
     /** @hide */
     public int getLaunchActivityType() {
         return mLaunchActivityType;
@@ -2520,6 +2591,10 @@
         if (mDisableStartingWindow) {
             b.putBoolean(KEY_DISABLE_STARTING_WINDOW, mDisableStartingWindow);
         }
+        if (mAllowPassThroughOnTouchOutside) {
+            b.putBoolean(KEY_ALLOW_PASS_THROUGH_ON_TOUCH_OUTSIDE,
+                    mAllowPassThroughOnTouchOutside);
+        }
         b.putBinder(KEY_ANIM_ABORT_LISTENER,
                 mAnimationAbortListener != null ? mAnimationAbortListener.asBinder() : null);
         return b;
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 5b556cc..0c02ba4 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -1960,8 +1960,12 @@
 
         @Override
         public void dumpCacheInfo(ParcelFileDescriptor pfd, String[] args) {
-            PropertyInvalidatedCache.dumpCacheInfo(pfd, args);
-            IoUtils.closeQuietly(pfd);
+            try {
+                PropertyInvalidatedCache.dumpCacheInfo(pfd, args);
+                BroadcastStickyCache.dump(pfd);
+            } finally {
+                IoUtils.closeQuietly(pfd);
+            }
         }
 
         private File getDatabasesDir(Context context) {
@@ -6281,7 +6285,7 @@
         }
 
         r.activity.mConfigChangeFlags |= configChanges;
-        r.mPreserveWindow = tmp.mPreserveWindow;
+        r.mPreserveWindow = r.activity.mWindowAdded && tmp.mPreserveWindow;
 
         r.activity.mChangingConfigurations = true;
 
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index f27dc32..0472ff8 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -54,6 +54,7 @@
 import android.content.pm.ParceledListSlice;
 import android.database.DatabaseUtils;
 import android.health.connect.HealthConnectManager;
+import android.health.connect.HealthPermissions;
 import android.media.AudioAttributes.AttributeUsage;
 import android.media.MediaRouter2;
 import android.os.Binder;
@@ -1607,9 +1608,12 @@
     public static final int OP_RECEIVE_SENSITIVE_NOTIFICATIONS =
             AppProtoEnums.APP_OP_RECEIVE_SENSITIVE_NOTIFICATIONS;
 
+    /** @hide Access to read heart rate sensor. */
+    public static final int OP_READ_HEART_RATE = AppProtoEnums.APP_OP_READ_HEART_RATE;
+
     /** @hide */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final int _NUM_OP = 149;
+    public static final int _NUM_OP = 150;
 
     /**
      * All app ops represented as strings.
@@ -1762,6 +1766,7 @@
             OPSTR_UNARCHIVAL_CONFIRMATION,
             OPSTR_EMERGENCY_LOCATION,
             OPSTR_RECEIVE_SENSITIVE_NOTIFICATIONS,
+            OPSTR_READ_HEART_RATE,
     })
     public @interface AppOpString {}
 
@@ -2499,6 +2504,11 @@
     public static final String OPSTR_RECEIVE_SENSITIVE_NOTIFICATIONS =
             "android:receive_sensitive_notifications";
 
+    /** @hide Access to read heart rate sensor. */
+    @SystemApi
+    @FlaggedApi(Flags.FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED)
+    public static final String OPSTR_READ_HEART_RATE = "android:read_heart_rate";
+
     /** {@link #sAppOpsToNote} not initialized yet for this op */
     private static final byte SHOULD_COLLECT_NOTE_OP_NOT_INITIALIZED = 0;
     /** Should not collect noting of this app-op in {@link #sAppOpsToNote} */
@@ -2572,6 +2582,8 @@
             OP_NEARBY_WIFI_DEVICES,
             // Notifications
             OP_POST_NOTIFICATION,
+            // Health
+            Flags.replaceBodySensorPermissionEnabled() ? OP_READ_HEART_RATE : OP_NONE,
     };
 
     /**
@@ -2612,6 +2624,7 @@
             OP_READ_SYSTEM_GRAMMATICAL_GENDER,
     };
 
+    @SuppressWarnings("FlaggedApi")
     static final AppOpInfo[] sAppOpInfos = new AppOpInfo[]{
         new AppOpInfo.Builder(OP_COARSE_LOCATION, OPSTR_COARSE_LOCATION, "COARSE_LOCATION")
             .setPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)
@@ -3079,6 +3092,10 @@
         new AppOpInfo.Builder(OP_RECEIVE_SENSITIVE_NOTIFICATIONS,
                 OPSTR_RECEIVE_SENSITIVE_NOTIFICATIONS, "RECEIVE_SENSITIVE_NOTIFICATIONS")
                 .setDefaultMode(MODE_IGNORED).build(),
+        new AppOpInfo.Builder(OP_READ_HEART_RATE, OPSTR_READ_HEART_RATE, "READ_HEART_RATE")
+            .setPermission(Flags.replaceBodySensorPermissionEnabled() ?
+                HealthPermissions.READ_HEART_RATE : null)
+            .setDefaultMode(AppOpsManager.MODE_ALLOWED).build(),
     };
 
     // The number of longs needed to form a full bitmask of app ops
@@ -3132,6 +3149,10 @@
             }
         }
         for (int op : RUNTIME_PERMISSION_OPS) {
+            if (op == OP_NONE) {
+                // Skip ops with a disabled feature flag.
+                continue;
+            }
             if (sAppOpInfos[op].permission != null) {
                 sPermToOp.put(sAppOpInfos[op].permission, op);
             }
@@ -10153,6 +10174,9 @@
         }
 
         p.writeInt(Parcel.EX_HAS_NOTED_APPOPS_REPLY_HEADER);
+        final int sizePosition = p.dataPosition();
+        // Write size placeholder. With this size we can easily skip it in native.
+        p.writeInt(0);
 
         int numAttributionWithNotesAppOps = notedAppOps.size();
         p.writeInt(numAttributionWithNotesAppOps);
@@ -10169,6 +10193,12 @@
                 }
             }
         }
+
+        final int payloadPosition = p.dataPosition();
+        p.setDataPosition(sizePosition);
+        // Total header size including 4 bytes size itself.
+        p.writeInt(payloadPosition - sizePosition);
+        p.setDataPosition(payloadPosition);
     }
 
     /**
@@ -10182,6 +10212,8 @@
      * @hide
      */
     public static void readAndLogNotedAppops(@NonNull Parcel p) {
+        // Skip size.
+        p.readInt();
         int numAttributionsWithNotedAppOps = p.readInt();
 
         for (int i = 0; i < numAttributionsWithNotedAppOps; i++) {
diff --git a/core/java/android/app/ApplicationStartInfo.java b/core/java/android/app/ApplicationStartInfo.java
index edcdb6c..f34341f 100644
--- a/core/java/android/app/ApplicationStartInfo.java
+++ b/core/java/android/app/ApplicationStartInfo.java
@@ -34,6 +34,7 @@
 import android.util.proto.ProtoOutputStream;
 import android.util.proto.WireTypeMismatchException;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.XmlUtils;
 import com.android.modules.utils.TypedXmlPullParser;
 import com.android.modules.utils.TypedXmlSerializer;
@@ -777,7 +778,9 @@
         mStartComponent = other.mStartComponent;
     }
 
-    private ApplicationStartInfo(@NonNull Parcel in) {
+    /** @hide */
+    @VisibleForTesting
+    public ApplicationStartInfo(@NonNull Parcel in) {
         mStartupState = in.readInt();
         mPid = in.readInt();
         mRealUid = in.readInt();
@@ -1061,12 +1064,21 @@
         if (other == null || !(other instanceof ApplicationStartInfo)) {
             return false;
         }
+
         final ApplicationStartInfo o = (ApplicationStartInfo) other;
-        return mPid == o.mPid && mRealUid == o.mRealUid && mPackageUid == o.mPackageUid
-                && mDefiningUid == o.mDefiningUid && mReason == o.mReason
-                && mStartupState == o.mStartupState && mStartType == o.mStartType
-                && mLaunchMode == o.mLaunchMode && TextUtils.equals(mProcessName, o.mProcessName)
-                && timestampsEquals(o) && mWasForceStopped == o.mWasForceStopped
+
+        return mPid == o.mPid
+                && mRealUid == o.mRealUid
+                && mPackageUid == o.mPackageUid
+                && mDefiningUid == o.mDefiningUid
+                && mReason == o.mReason
+                && mStartupState == o.mStartupState
+                && mStartType == o.mStartType
+                && mLaunchMode == o.mLaunchMode
+                && TextUtils.equals(mPackageName, o.mPackageName)
+                && TextUtils.equals(mProcessName, o.mProcessName)
+                && timestampsEquals(o)
+                && mWasForceStopped == o.mWasForceStopped
                 && mMonoticCreationTimeMs == o.mMonoticCreationTimeMs
                 && mStartComponent == o.mStartComponent;
     }
@@ -1074,7 +1086,7 @@
     @Override
     public int hashCode() {
         return Objects.hash(mPid, mRealUid, mPackageUid, mDefiningUid, mReason, mStartupState,
-                mStartType, mLaunchMode, mProcessName, mStartupTimestampsNs,
+                mStartType, mLaunchMode, mPackageName, mProcessName, mStartupTimestampsNs,
                 mMonoticCreationTimeMs, mStartComponent);
     }
 
diff --git a/core/java/android/app/BroadcastStickyCache.java b/core/java/android/app/BroadcastStickyCache.java
index d6f061b..ea81731 100644
--- a/core/java/android/app/BroadcastStickyCache.java
+++ b/core/java/android/app/BroadcastStickyCache.java
@@ -27,16 +27,21 @@
 import android.net.nsd.NsdManager;
 import android.net.wifi.WifiManager;
 import android.net.wifi.p2p.WifiP2pManager;
+import android.os.ParcelFileDescriptor;
 import android.os.SystemProperties;
 import android.os.UpdateLock;
 import android.telephony.TelephonyManager;
 import android.util.ArrayMap;
+import android.util.IndentingPrintWriter;
 import android.view.WindowManagerPolicyConstants;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.FastPrintWriter;
 
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 
 /** @hide */
@@ -214,6 +219,41 @@
         }
     }
 
+    public static void dump(@NonNull ParcelFileDescriptor pfd) {
+        if (!Flags.useStickyBcastCache()) {
+            return;
+        }
+        final PrintWriter pw = new FastPrintWriter(new FileOutputStream(pfd.getFileDescriptor()));
+        synchronized (sCachedStickyBroadcasts) {
+            dumpLocked(pw);
+        }
+        pw.flush();
+    }
+
+    @GuardedBy("sCachedStickyBroadcasts")
+    private static void dumpLocked(@NonNull PrintWriter pw) {
+        final IndentingPrintWriter ipw = new IndentingPrintWriter(
+                pw, "  " /* singleIndent */, "  " /* prefix */);
+        ipw.println("Cached sticky broadcasts:");
+        ipw.increaseIndent();
+        final int count = sCachedStickyBroadcasts.size();
+        if (count == 0) {
+            ipw.println("<empty>");
+        } else {
+            for (int i = 0; i < count; ++i) {
+                final CachedStickyBroadcast cachedStickyBroadcast = sCachedStickyBroadcasts.get(i);
+                ipw.print("Entry #"); ipw.print(i); ipw.println(":");
+                ipw.increaseIndent();
+                ipw.print("filter="); ipw.println(cachedStickyBroadcast.filter.toLongString());
+                ipw.print("intent="); ipw.println(cachedStickyBroadcast.intent);
+                ipw.print("version="); ipw.println(cachedStickyBroadcast.version);
+                ipw.print("handle="); ipw.println(cachedStickyBroadcast.propertyHandle);
+                ipw.decreaseIndent();
+            }
+        }
+        ipw.decreaseIndent();
+    }
+
     private static final class CachedStickyBroadcast {
         @NonNull public final IntentFilter filter;
         @Nullable public Intent intent;
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java
index b781ce5..f21c3e8 100644
--- a/core/java/android/app/DownloadManager.java
+++ b/core/java/android/app/DownloadManager.java
@@ -493,6 +493,9 @@
          * {@link Environment#getExternalStoragePublicDirectory(String)} with
          * {@link Environment#DIRECTORY_DOWNLOADS}).
          *
+         * All non-visible downloads that are not modified in the last 7 days will be deleted during
+         * idle runs.
+         *
          * @param uri a file {@link Uri} indicating the destination for the downloaded file.
          * @return this object
          */
@@ -796,7 +799,9 @@
          * public Downloads directory (as returned by
          * {@link Environment#getExternalStoragePublicDirectory(String)} with
          * {@link Environment#DIRECTORY_DOWNLOADS}) will be visible in system's Downloads UI
-         * and the rest will not be visible.
+         * and the rest will not be visible. All non-visible downloads that are not modified
+         * in the last 7 days will be deleted during idle runs.
+         *
          * (e.g. {@link Context#getExternalFilesDir(String)}) will not be visible.
          */
         @Deprecated
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 237780f..3b2aab4 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -160,8 +160,8 @@
     void requestBindProvider(in ComponentName component);
     void requestUnbindProvider(in IConditionProvider token);
 
-    void setNotificationsShownFromListener(in INotificationListener token, in String[] keys);
 
+    void setNotificationsShownFromListener(in INotificationListener token, in String[] keys);
     ParceledListSlice getActiveNotificationsFromListener(in INotificationListener token, in String[] keys, int trim);
     ParceledListSlice getSnoozedNotificationsFromListener(in INotificationListener token, int trim);
     void clearRequestedListenerHints(in INotificationListener token);
@@ -258,7 +258,10 @@
     @EnforcePermission(allOf={"INTERACT_ACROSS_USERS", "ACCESS_NOTIFICATIONS"})
     void unregisterCallNotificationEventListener(String packageName, in UserHandle userHandle, in ICallNotificationEventCallback listener);
 
-    void setCanBePromoted(String pkg, int uid, boolean promote);
+    void setCanBePromoted(String pkg, int uid, boolean promote, boolean fromUser);
     boolean appCanBePromoted(String pkg, int uid);
     boolean canBePromoted(String pkg);
+
+    void setAdjustmentTypeSupportedState(in INotificationListener token, String key, boolean supported);
+    List<String> getUnsupportedAdjustmentTypes();
 }
diff --git a/core/java/android/app/IUserSwitchObserver.aidl b/core/java/android/app/IUserSwitchObserver.aidl
index cfdb426..1ff7a17 100644
--- a/core/java/android/app/IUserSwitchObserver.aidl
+++ b/core/java/android/app/IUserSwitchObserver.aidl
@@ -19,10 +19,10 @@
 import android.os.IRemoteCallback;
 
 /** {@hide} */
-oneway interface IUserSwitchObserver {
+interface IUserSwitchObserver {
     void onBeforeUserSwitching(int newUserId);
-    void onUserSwitching(int newUserId, IRemoteCallback reply);
-    void onUserSwitchComplete(int newUserId);
-    void onForegroundProfileSwitch(int newProfileId);
-    void onLockedBootComplete(int newUserId);
+    oneway void onUserSwitching(int newUserId, IRemoteCallback reply);
+    oneway void onUserSwitchComplete(int newUserId);
+    oneway void onForegroundProfileSwitch(int newProfileId);
+    oneway void onLockedBootComplete(int newUserId);
 }
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 392a1f1..bc7ebce 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -121,7 +121,6 @@
 import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -783,10 +782,41 @@
     @FlaggedApi(Flags.FLAG_API_RICH_ONGOING)
     public static final int FLAG_PROMOTED_ONGOING = 0x00040000;
 
-    private static final List<Class<? extends Style>> PLATFORM_STYLE_CLASSES = Arrays.asList(
-            BigTextStyle.class, BigPictureStyle.class, InboxStyle.class, MediaStyle.class,
-            DecoratedCustomViewStyle.class, DecoratedMediaCustomViewStyle.class,
-            MessagingStyle.class, CallStyle.class);
+    private static final Set<Class<? extends Style>> PLATFORM_STYLE_CLASSES = Set.of(
+            BigTextStyle.class,
+            BigPictureStyle.class,
+            InboxStyle.class,
+            MediaStyle.class,
+            DecoratedCustomViewStyle.class,
+            DecoratedMediaCustomViewStyle.class,
+            MessagingStyle.class,
+            CallStyle.class
+    );
+
+    private static boolean isPlatformStyle(Style style) {
+        if (style == null) {
+            return false;
+        }
+
+        if (PLATFORM_STYLE_CLASSES.contains(style.getClass())) {
+            return true;
+        }
+
+        if (Flags.apiRichOngoing()) {
+            return style.getClass() == ProgressStyle.class;
+        }
+
+        return false;
+    }
+
+    private static boolean isStandardLayout(int layoutId) {
+        if (Flags.apiRichOngoing()) {
+            if (layoutId == R.layout.notification_template_material_progress) {
+                return true;
+            }
+        }
+        return STANDARD_LAYOUTS.contains(layoutId);
+    }
 
     /** @hide */
     @IntDef(flag = true, prefix = {"FLAG_"}, value = {
@@ -1598,28 +1628,72 @@
     public static final String EXTRA_DECLINE_COLOR = "android.declineColor";
 
     /**
-     * {@link #extras} key: {@link Icon} of an image used as an overlay Icon on
-     * {@link Notification#mLargeIcon} for {@link EnRouteStyle} notifications.
-     * This extra is an {@code Icon}.
-     * @hide
-     */
-    @FlaggedApi(Flags.FLAG_API_RICH_ONGOING)
-    public static final String EXTRA_ENROUTE_OVERLAY_ICON = "android.enrouteOverlayIcon";
-
-    /**
-     * {@link #extras} key: text used as a sub-text for the largeIcon of
-     * {@link EnRouteStyle} notification. This extra is a {@code CharSequence}.
-     * @hide
-     */
-    @FlaggedApi(Flags.FLAG_API_RICH_ONGOING)
-    public static final String EXTRA_ENROUTE_LARGE_ICON_SUBTEXT = "android.enrouteLargeIconSubText";
-    /**
      * {@link #extras} key: whether the notification should be colorized as
      * supplied to {@link Builder#setColorized(boolean)}.
      */
     public static final String EXTRA_COLORIZED = "android.colorized";
 
     /**
+     * {@link #extras} key: an arraylist of {@link android.app.Notification.ProgressStyle.Segment}
+     * bundles provided by a
+     * {@link android.app.Notification.ProgressStyle} notification as supplied to
+     * {@link ProgressStyle#setProgressSegments}
+     * or {@link ProgressStyle#addProgressSegment(ProgressStyle.Segment)}.
+     * This extra is a parcelable array list of bundles.
+     * @hide
+     */
+    @FlaggedApi(Flags.FLAG_API_RICH_ONGOING)
+    public static final String EXTRA_PROGRESS_SEGMENTS = "android.progressSegments";
+
+    /**
+     * {@link #extras} key: an arraylist of {@link ProgressStyle.Point}
+     * bundles provided by a
+     * {@link android.app.Notification.ProgressStyle} notification as supplied to
+     * {@link ProgressStyle#setProgressPoints}
+     * or {@link ProgressStyle#addProgressPoint(ProgressStyle.Point)}.
+     * This extra is a parcelable array list of bundles.
+     * @hide
+     */
+    @FlaggedApi(Flags.FLAG_API_RICH_ONGOING)
+    public static final String EXTRA_PROGRESS_POINTS = "android.progressPoints";
+
+    /**
+     * {@link #extras} key: whether the progress bar should be styled by its progress as
+     * supplied to {@link ProgressStyle#setStyledByProgress}.
+     * This extra is a boolean.
+     * @hide
+     */
+    @FlaggedApi(Flags.FLAG_API_RICH_ONGOING)
+    public static final String EXTRA_STYLED_BY_PROGRESS = "android.styledByProgress";
+
+    /**
+     * {@link #extras} key: this is an {@link Icon} of an image to be
+     * shown as progress bar progress tracker icon in {@link ProgressStyle}, supplied to
+     *{@link ProgressStyle#setProgressTrackerIcon(Icon)}.
+     * @hide
+     */
+    @FlaggedApi(Flags.FLAG_API_RICH_ONGOING)
+    public static final String EXTRA_PROGRESS_TRACKER_ICON = "android.progressTrackerIcon";
+
+    /**
+     * {@link #extras} key: this is an {@link Icon} of an image to be
+     * shown at the beginning of the progress bar in {@link ProgressStyle}, supplied to
+     *{@link ProgressStyle#setProgressStartIcon(Icon)}.
+     * @hide
+     */
+    @FlaggedApi(Flags.FLAG_API_RICH_ONGOING)
+    public static final String EXTRA_PROGRESS_START_ICON = "android.progressStartIcon";
+
+    /**
+     * {@link #extras} key: this is an {@link Icon} of an image to be
+     * shown at the end of the progress bar in {@link ProgressStyle}, supplied to
+     *{@link ProgressStyle#setProgressEndIcon(Icon)}.
+     * @hide
+     */
+    @FlaggedApi(Flags.FLAG_API_RICH_ONGOING)
+    public static final String EXTRA_PROGRESS_END_ICON = "android.progressEndIcon";
+
+    /**
      * @hide
      */
     public static final String EXTRA_BUILDER_APPLICATION_INFO = "android.appInfo";
@@ -3071,7 +3145,9 @@
         }
 
         if (Flags.apiRichOngoing()) {
-            visitIconUri(visitor, extras.getParcelable(EXTRA_ENROUTE_OVERLAY_ICON, Icon.class));
+            visitIconUri(visitor, extras.getParcelable(EXTRA_PROGRESS_TRACKER_ICON, Icon.class));
+            visitIconUri(visitor, extras.getParcelable(EXTRA_PROGRESS_START_ICON, Icon.class));
+            visitIconUri(visitor, extras.getParcelable(EXTRA_PROGRESS_END_ICON, Icon.class));
         }
 
         if (mBubbleMetadata != null) {
@@ -3149,11 +3225,13 @@
      */
     @FlaggedApi(Flags.FLAG_UI_RICH_ONGOING)
     public boolean hasPromotableStyle() {
-        //TODO(b/367739672): Add progress style
-        return extras == null || !extras.containsKey(Notification.EXTRA_TEMPLATE)
-                || isStyle(Notification.BigPictureStyle.class)
-                || isStyle(Notification.BigTextStyle.class)
-                || isStyle(Notification.CallStyle.class);
+        final Class<? extends Style> notificationStyle = getNotificationStyle();
+
+        return notificationStyle == null
+                || BigPictureStyle.class.equals(notificationStyle)
+                || BigTextStyle.class.equals(notificationStyle)
+                || CallStyle.class.equals(notificationStyle)
+                || ProgressStyle.class.equals(notificationStyle);
     }
 
     /**
@@ -5914,9 +5992,9 @@
                 }
             }
             boolean contentViewUsesHeader = mN.contentView == null
-                    || STANDARD_LAYOUTS.contains(mN.contentView.getLayoutId());
+                    || isStandardLayout(mN.contentView.getLayoutId());
             boolean bigContentViewUsesHeader = mN.bigContentView == null
-                    || STANDARD_LAYOUTS.contains(mN.bigContentView.getLayoutId());
+                    || isStandardLayout(mN.bigContentView.getLayoutId());
             return contentViewUsesHeader && bigContentViewUsesHeader;
         }
 
@@ -6630,7 +6708,7 @@
             // Custom views which come from a platform style class are safe, and thus do not need to
             // be wrapped.  Any subclass of those styles has the opportunity to make arbitrary
             // changes to the RemoteViews, and thus can't be trusted as a fully vetted view.
-            if (fromStyle && PLATFORM_STYLE_CLASSES.contains(mStyle.getClass())) {
+            if (fromStyle && isPlatformStyle(mStyle)) {
                 return false;
             }
             return mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.S;
@@ -6712,7 +6790,7 @@
                 return false;
             }
             if (fullyCustomViewRequiresDecoration(false)
-                    && STANDARD_LAYOUTS.contains(customContent.getLayoutId())) {
+                    && isStandardLayout(customContent.getLayoutId())) {
                 // If the app's custom views are objects returned from Builder.create*ContentView()
                 // then the app is most likely attempting to spoof the user.  Even if they are not,
                 // the result would be broken (b/189189308) so we will ignore it.
@@ -7610,6 +7688,10 @@
             return R.layout.notification_template_material_conversation;
         }
 
+        private int getProgressLayoutResource() {
+            return R.layout.notification_template_material_progress;
+        }
+
         private int getActionLayoutResource() {
             return R.layout.notification_material_action;
         }
@@ -7971,6 +8053,12 @@
                 return innerClass;
             }
         }
+
+        if (Flags.apiRichOngoing()) {
+            if (templateClass.equals(ProgressStyle.class.getName())) {
+                return ProgressStyle.class;
+            }
+        }
         return null;
     }
 
@@ -11083,81 +11171,73 @@
     }
 
     /**
-     * TODO(b/360827871): Make EnRouteStyle public.
-     * A style used to represent the progress of a real-world journey with a known destination.
-     * For example:
-     * <ul>
-     *     <li>Delivery tracking</li>
-     *     <li>Ride progress</li>
-     *     <li>Flight tracking</li>
-     * </ul>
+     * A Notification Style used to to define a notification whose expanded state includes
+     * a highly customizable progress bar with segments, points, a custom tracker icon,
+     * and custom icons at the start and end of the progress bar.
      *
-     * The exact fields from {@link Notification} that are shown with this style may vary by
-     * the surface where this update appears, but the following fields are recommended:
-     * <ul>
-     *     <li>{@link Notification.Builder#setContentTitle}</li>
-     *     <li>{@link Notification.Builder#setContentText}</li>
-     *     <li>{@link Notification.Builder#setSubText}</li>
-     *     <li>{@link Notification.Builder#setLargeIcon}</li>
-     *     <li>{@link Notification.Builder#setProgress}</li>
-     *     <li>{@link Notification.Builder#setWhen} - This should be the future time of the next,
-     *     final, or most important stop on this journey.</li>
-     * </ul>
-     * @hide
+     * This style is suggested for use cases where the app is showing a tracker to the
+     * user of a thing they are interested in: the location of a car on its way
+     * to pick them up, food being delivered, or their own progress in a navigation
+     * journey.
+     *
+     * To use this style with your Notification, feed it to
+     * {@link Notification.Builder#setStyle(android.app.Notification.Style)} like so:
+     * <pre class="prettyprint">
+     * new Notification.Builder(context)
+     *   .setSmallIcon(R.drawable.ic_notification)
+     *   .setColor(Color.GREEN)
+     *   .setColorized(true)
+     *   .setContentTitle("Arrive 10:08 AM").
+     *   .setContentText("Dominique Ansel Bakery Soho")
+     *   .addAction(new Notification.Action("Exit navigation",...))
+     *   .setStyle(new Notification.ProgressStyle()
+     *       .setStyledByProgress(false)
+     *       .setProgress(456)
+     *       .setProgressTrackerIcon(Icon.createWithResource(R.drawable.ic_driving_tracker))
+     *       .addProgressSegment(new Segment(41).setColor(Color.BLACK))
+     *       .addProgressSegment(new Segment(552).setColor(Color.YELLOW))
+     *       .addProgressSegment(new Segment(253).setColor(Color.YELLOW))
+     *       .addProgressSegment(new Segment(94).setColor(Color.BLUE))
+     *       .addProgressPoint(new Point(60).setColor(Color.RED))
+     *       .addProgressPoint(new Point(560).setColor(Color.YELLOW))
+     *   )
+     * </pre>
+     *
+     *
+     *
+     * NOTE: The progress bar layout will be mirrored for RTL layout.
+     * NOTE: The extras set by {@link Notification.Builder#setProgress} will be overridden by
+     * the values set on this style object when the notification is built.
+     *
      */
     @FlaggedApi(Flags.FLAG_API_RICH_ONGOING)
-    public static class EnRouteStyle extends Notification.Style {
+    public static class ProgressStyle extends Notification.Style {
+        private static final String KEY_ELEMENT_ID = "id";
+        private static final String KEY_ELEMENT_COLOR = "colorInt";
+        private static final String KEY_SEGMENT_LENGTH = "length";
+        private static final String KEY_POINT_POSITION = "position";
+
+        private static final int MAX_PROGRESS_SEGMENT_LIMIT = 15;
+        private static final int MAX_PROGRESS_STOP_LIMIT = 5;
+        private static final int DEFAULT_PROGRESS_MAX = 100;
+
+        private List<Segment> mProgressSegments = new ArrayList<>();
+        private List<Point> mProgressPoints = new ArrayList<>();
+
+        private int mProgress = 0;
+
+        private boolean mIndeterminate;
+
+        private boolean mIsStyledByProgress = true;
 
         @Nullable
-        private Icon mOverlayIcon = null;
-
+        private Icon mTrackerIcon;
         @Nullable
-        private CharSequence mLargeIconSubText = null;
-
-        public EnRouteStyle() {
-        }
-
-        /**
-         * Returns the overlay icon to be displayed on {@link Notification#mLargeIcon}.
-         * @see EnRouteStyle#setOverlayIcon
-         */
+        private Icon mStartIcon;
         @Nullable
-        public Icon getOverlayIcon() {
-            return mOverlayIcon;
-        }
+        private Icon mEndIcon;
 
         /**
-         * Optional icon to be displayed on {@link Notification#mLargeIcon}.
-         *
-         * This image will be cropped to a circle and will obscure
-         * a semicircle of the right side of the large icon.
-         */
-        @NonNull
-        public EnRouteStyle setOverlayIcon(@Nullable Icon overlayIcon) {
-            mOverlayIcon = overlayIcon;
-            return this;
-        }
-
-        /**
-         * Returns the sub-text for {@link Notification#mLargeIcon}.
-         * @see EnRouteStyle#setLargeIconSubText
-         */
-        @Nullable
-        public CharSequence getLargeIconSubText() {
-            return mLargeIconSubText;
-        }
-
-        /**
-         * Optional text which generally related to
-         * the {@link Notification.Builder#setLargeIcon} or {@link #setOverlayIcon} or both.
-         */
-        @NonNull
-        public EnRouteStyle setLargeIconSubText(@Nullable CharSequence largeIconSubText) {
-            mLargeIconSubText = stripStyling(largeIconSubText);
-            return this;
-        }
-
-         /**
          * @hide
          */
         @Override
@@ -11166,29 +11246,277 @@
                 return true;
             }
 
-            final EnRouteStyle enRouteStyle = (EnRouteStyle) other;
-            return !Objects.equals(mOverlayIcon, enRouteStyle.mOverlayIcon)
-                    || !Objects.equals(mLargeIconSubText, enRouteStyle.mLargeIconSubText);
+            final ProgressStyle progressStyle = (ProgressStyle) other;
+
+            /**
+             * @see #setProgressIndeterminate
+             */
+            if (!Objects.equals(mIndeterminate, progressStyle.mIndeterminate)) {
+                return true;
+            }
+            boolean nonIndeterminateCheckResult = false;
+            if (!mIndeterminate) {
+                nonIndeterminateCheckResult = !Objects.equals(mProgress, progressStyle.mProgress)
+                        || !Objects.equals(mIsStyledByProgress, progressStyle.mIsStyledByProgress)
+                        || !Objects.equals(mProgressSegments, progressStyle.mProgressSegments)
+                        || !Objects.equals(mProgressPoints, progressStyle.mProgressPoints)
+                        || !Objects.equals(mTrackerIcon, progressStyle.mTrackerIcon);
+            }
+
+            return !Objects.equals(mStartIcon, progressStyle.mStartIcon)
+                    || !Objects.equals(mEndIcon, progressStyle.mEndIcon)
+                    || nonIndeterminateCheckResult;
         }
 
         /**
-         * @hide
+         * Gets the segments that define the background layer of the progress bar.
+         *
+         * If no segments are provided, the progress bar will be rendered with a single segment
+         * with length 100 and default color.
+         *
+         * @see #setProgressSegments
+         * @see #addProgressSegment
+         * @see Segment
          */
-        @Override
-        public void addExtras(Bundle extras) {
-            super.addExtras(extras);
-            extras.putParcelable(EXTRA_ENROUTE_OVERLAY_ICON, mOverlayIcon);
-            extras.putCharSequence(EXTRA_ENROUTE_LARGE_ICON_SUBTEXT, mLargeIconSubText);
+        public @NonNull List<Segment> getProgressSegments() {
+            return mProgressSegments;
         }
 
         /**
-         * @hide
+         * Sets or replaces the segments of the progress bar.
+         *
+         * Segments allow for creating progress bars with multiple colors or sections
+         * to represent different stages or categories of progress.
+         * For example, Traffic conditions along a navigation journey.
+         * @see Segment
          */
-        @Override
-        protected void restoreFromExtras(Bundle extras) {
-            super.restoreFromExtras(extras);
-            mOverlayIcon = extras.getParcelable(EXTRA_ENROUTE_OVERLAY_ICON, Icon.class);
-            mLargeIconSubText = extras.getCharSequence(EXTRA_ENROUTE_LARGE_ICON_SUBTEXT);
+        public @NonNull ProgressStyle setProgressSegments(@NonNull List<Segment> progressSegments) {
+            mProgressSegments = new ArrayList<>(progressSegments.size());
+            return this;
+        }
+
+        /**
+         * Appends a segment to the end of the progress bar.
+         *
+         * Segments allow for creating progress bars with multiple colors or sections
+         * to represent different stages or categories of progress.
+         * For example, Traffic conditions along a navigation journey.
+         * @see Segment
+         */
+        public @NonNull ProgressStyle addProgressSegment(@NonNull Segment segment) {
+            if (mProgressSegments == null) {
+                mProgressSegments = new ArrayList<>();
+            }
+            mProgressSegments.add(segment);
+
+            return this;
+        }
+
+        /**
+         * Gets the points that are displayed on the progress bar.
+         *.
+         * @see #setProgressPoints
+         * @see #addProgressPoint
+         * @see Point
+         */
+        public @NonNull List<Point> getProgressPoints() {
+            return mProgressPoints;
+        }
+
+        /**
+         * Replaces all the progress points.
+         *
+         * Points within a progress bar are used to visualize distinct stages or milestones.
+         * For example, you might use points to mark stops in a multi-stop
+         * navigation journey, where each point represents a destination.
+         * @see Point
+         */
+        public @NonNull ProgressStyle setProgressPoints(@NonNull List<Point> points) {
+            mProgressPoints = new ArrayList<>(points);
+            return this;
+        }
+
+        /**
+         * Adds another point.
+         *
+         * Points within a progress bar are used to visualize distinct stages or milestones.
+         *
+         * For example, you might use points to mark stops in a multi-stop
+         * navigation journey, where each point represents a destination.
+         *
+         * Points can be added in any order, as their
+         * position within the progress bar is determined by their individual
+         * {@link Point#getPosition()}.
+         * @see Point
+         */
+        public @NonNull ProgressStyle addProgressPoint(@NonNull Point point) {
+            if (mProgressPoints == null) {
+                mProgressPoints = new ArrayList<>();
+            }
+            mProgressPoints.add(point);
+
+            return this;
+        }
+
+        /**
+         * Gets the progress value of the progress bar.
+         * @see #setProgress
+         */
+        public int getProgress() {
+            return mProgress;
+        }
+
+        /**
+        * Specifies the progress (in the same units as {@link Segment#getLength()})
+        * of the tracker along the length of the bar.
+        *
+        * The max progress value is the sum of all Segment lengths.
+        * The default value is 0.
+        */
+        public @NonNull ProgressStyle setProgress(int progress) {
+            mProgress = progress;
+            return this;
+        }
+
+        /**
+         * Gets the sum of the lengths of all Segments in the style, which
+         * defines the maximum progress. Defaults to 100 when segments are omitted.
+         */
+        public int getProgressMax() {
+            final List<Segment> progressSegment = mProgressSegments;
+            if (progressSegment == null || progressSegment.isEmpty()) {
+                return DEFAULT_PROGRESS_MAX;
+            } else {
+                int progressMax = 0;
+                int validSegmentCount = 0;
+                for (int i = 0; i < progressSegment.size()
+                        && validSegmentCount < MAX_PROGRESS_SEGMENT_LIMIT; i++) {
+                    int segmentLength = progressSegment.get(i).getLength();
+                    if (segmentLength > 0) {
+                        try {
+                            progressMax = Math.addExact(progressMax, segmentLength);
+                            validSegmentCount++;
+                        } catch (ArithmeticException e) {
+                            Log.e(TAG,
+                                    "Notification.ProgressStyle segment total overflowed.", e);
+                            return DEFAULT_PROGRESS_MAX;
+                        }
+                    }
+                }
+
+                if (validSegmentCount == 0) {
+                    return DEFAULT_PROGRESS_MAX;
+                }
+
+                return progressMax;
+            }
+
+        }
+
+        /**
+         * Get indeterminate value of the progress bar.
+         * @see #setProgressIndeterminate
+         */
+        public boolean isProgressIndeterminate() {
+            return mIndeterminate;
+        }
+
+        /**
+         * Used to indicate an initialization state without a known progress amount.
+         * When specified, the following fields are ignored:
+         * @see #setProgress
+         * @see #setProgressSegments
+         * @see #setProgressPoints
+         * @see #setProgressTrackerIcon
+         * @see #setStyledByProgress
+         *
+         * If the app provides exactly one Segment, that segment's color will be
+         * used to style the indeterminate bar.
+         */
+        public @NonNull ProgressStyle setProgressIndeterminate(boolean indeterminate) {
+            mIndeterminate = indeterminate;
+            return this;
+        }
+
+        /**
+         * Gets whether the progress bar's style is based on its progress.
+         * @see #setStyledByProgress
+         */
+        public boolean isStyledByProgress() {
+            return mIsStyledByProgress;
+        }
+
+        /**
+         * Indicates whether the segments and points will be styled differently
+         * based on whether they are behind or ahead of the current progress.
+         * When true, segments appearing ahead of the current progress will be given a
+         * slightly different appearance to indicate that it is part of the progress bar
+         * that is not "filled".
+         * When false, all segments will be given the filled appearance, and it will be
+         * the app's responsibility to use #setProgressTrackerIcon or segment colors
+         * to make the current progress clear to the user.
+         * the default value is true.
+         */
+        public @NonNull ProgressStyle setStyledByProgress(boolean enabled) {
+            mIsStyledByProgress = enabled;
+            return this;
+        }
+
+
+        /**
+         * Gets the progress tracker icon for the progress bar.
+         * @see #setProgressTrackerIcon
+         */
+        public @Nullable Icon getProgressTrackerIcon() {
+            return mTrackerIcon;
+        }
+
+        /**
+         * An optional icon that can appear as an overlay on the bar at the point of
+         * current progress.
+         * Aspect ratio may be anywhere from 2:1 to 1:2; content outside that
+         * aspect ratio range will be cropped.
+         * This icon will be mirrored in RTL.
+         */
+        public @NonNull ProgressStyle setProgressTrackerIcon(@Nullable Icon trackerIcon) {
+            mTrackerIcon = trackerIcon;
+            return this;
+        }
+
+        /**
+         * Gets the progress bar start icon.
+         * @see #setProgressStartIcon
+         */
+        public @Nullable Icon getProgressStartIcon() {
+            return mStartIcon;
+        }
+
+        /**
+         * An optional square icon that appears at the start of the progress bar.
+         * This icon will be cropped to its central square.
+         * This icon will NOT be mirrored in RTL layouts.
+         */
+        public @NonNull ProgressStyle setProgressStartIcon(@Nullable Icon startIcon) {
+            mStartIcon = startIcon;
+            return this;
+        }
+
+        /**
+         * Gets the progress bar end icon.
+         * @see #setProgressEndIcon(Icon)
+         */
+        public @Nullable Icon getProgressEndIcon() {
+            return mEndIcon;
+        }
+
+        /**
+         * An optional square icon that appears at the end of the progress bar.
+         * This icon will be cropped to its central square.
+         * This icon will NOT be mirrored in RTL layouts.
+         */
+        public @NonNull ProgressStyle setProgressEndIcon(@Nullable Icon endIcon) {
+            mEndIcon = endIcon;
+            return this;
         }
 
         /**
@@ -11197,8 +11525,14 @@
         @Override
         public void purgeResources() {
             super.purgeResources();
-            if (mOverlayIcon != null) {
-                mOverlayIcon.convertToAshmem();
+            if (mTrackerIcon != null) {
+                mTrackerIcon.convertToAshmem();
+            }
+            if (mStartIcon != null) {
+                mStartIcon.convertToAshmem();
+            }
+            if (mEndIcon != null) {
+                mEndIcon.convertToAshmem();
             }
         }
 
@@ -11208,14 +11542,400 @@
         @Override
         public void reduceImageSizes(Context context) {
             super.reduceImageSizes(context);
-            if (mOverlayIcon != null) {
-                final Resources resources = context.getResources();
-                final boolean isLowRam = ActivityManager.isLowRamDeviceStatic();
 
-                int rightIconSize = resources.getDimensionPixelSize(isLowRam
-                        ? R.dimen.notification_right_icon_size_low_ram
-                        : R.dimen.notification_right_icon_size);
-                mOverlayIcon.scaleDownIfNecessary(rightIconSize, rightIconSize);
+            final Resources resources = context.getResources();
+
+            int progressIconSize =
+                    resources.getDimensionPixelSize(R.dimen.notification_progress_icon_size);
+            if (mStartIcon != null) {
+                mStartIcon.scaleDownIfNecessary(progressIconSize, progressIconSize);
+            }
+            if (mEndIcon != null) {
+                mEndIcon.scaleDownIfNecessary(progressIconSize, progressIconSize);
+            }
+            if (mTrackerIcon != null) {
+                int progressTrackerWidth = resources.getDimensionPixelSize(
+                        R.dimen.notification_progress_tracker_width);
+                int progressTrackerHeight = resources.getDimensionPixelSize(
+                        R.dimen.notification_progress_tracker_height);
+                mTrackerIcon.scaleDownIfNecessary(progressTrackerWidth, progressTrackerHeight);
+            }
+        }
+
+        /**
+         * @hide
+         */
+        @Override
+        public void addExtras(Bundle extras) {
+            super.addExtras(extras);
+            extras.putParcelableArrayList(EXTRA_PROGRESS_SEGMENTS,
+                    getProgressSegmentsAsBundleList(mProgressSegments));
+            extras.putParcelableArrayList(EXTRA_PROGRESS_POINTS,
+                    getProgressPointsAsBundleList(mProgressPoints));
+
+            extras.putInt(EXTRA_PROGRESS, mProgress);
+            extras.putBoolean(EXTRA_PROGRESS_INDETERMINATE, mIndeterminate);
+            extras.putInt(EXTRA_PROGRESS_MAX, getProgressMax());
+            extras.putBoolean(EXTRA_STYLED_BY_PROGRESS, mIsStyledByProgress);
+
+            if (mTrackerIcon != null) {
+                extras.putParcelable(EXTRA_PROGRESS_TRACKER_ICON, mTrackerIcon);
+            } else {
+                extras.remove(EXTRA_PROGRESS_TRACKER_ICON);
+            }
+
+            if (mStartIcon != null) {
+                extras.putParcelable(EXTRA_PROGRESS_START_ICON, mStartIcon);
+            } else {
+                extras.remove(EXTRA_PROGRESS_START_ICON);
+            }
+
+            if (mEndIcon != null) {
+                extras.putParcelable(EXTRA_PROGRESS_END_ICON, mEndIcon);
+            } else {
+                extras.remove(EXTRA_PROGRESS_END_ICON);
+            }
+        }
+
+        /**
+         * @hide
+         */
+        @Override
+        protected void restoreFromExtras(Bundle extras) {
+            super.restoreFromExtras(extras);
+            mProgressSegments = getProgressSegmentsFromBundleList(
+                    extras.getParcelableArrayList(EXTRA_PROGRESS_SEGMENTS, Bundle.class));
+            mProgress = extras.getInt(EXTRA_PROGRESS, 0);
+            mIndeterminate = extras.getBoolean(EXTRA_PROGRESS_INDETERMINATE, false);
+            mIsStyledByProgress = extras.getBoolean(EXTRA_STYLED_BY_PROGRESS, true);
+            mTrackerIcon = extras.getParcelable(EXTRA_PROGRESS_TRACKER_ICON, Icon.class);
+            mStartIcon = extras.getParcelable(EXTRA_PROGRESS_START_ICON, Icon.class);
+            mEndIcon = extras.getParcelable(EXTRA_PROGRESS_END_ICON, Icon.class);
+            mProgressPoints = getProgressPointsFromBundleList(
+                    extras.getParcelableArrayList(EXTRA_PROGRESS_POINTS, Bundle.class));
+        }
+
+        /**
+         * @hide
+         */
+        @Override
+        public boolean displayCustomViewInline() {
+            // This is a lie; True is returned for progress notifications to make sure
+            // that the custom view is not used instead of the template, but it will not
+            // actually be included.
+            return true;
+        }
+        /**
+         * @hide
+         */
+        @Override
+        public RemoteViews makeContentView(boolean increasedHeight) {
+            final StandardTemplateParams p = mBuilder.mParams.reset()
+                    .viewType(StandardTemplateParams.VIEW_TYPE_NORMAL)
+                    .hideProgress(true)
+                    .fillTextsFrom(mBuilder);
+
+            return getStandardView(mBuilder.getBaseLayoutResource(), p, null /* result */);
+        }
+        /**
+         * @hide
+         */
+        @Override
+        public RemoteViews makeHeadsUpContentView(boolean increasedHeight) {
+            final StandardTemplateParams p = mBuilder.mParams.reset()
+                    .viewType(StandardTemplateParams.VIEW_TYPE_HEADS_UP)
+                    .hideProgress(true)
+                    .fillTextsFrom(mBuilder);
+
+            return getStandardView(mBuilder.getHeadsUpBaseLayoutResource(), p, null /* result */);
+        }
+        /**
+         * @hide
+         */
+        @Override
+        public RemoteViews makeBigContentView() {
+            StandardTemplateParams p = mBuilder.mParams.reset()
+                    .viewType(StandardTemplateParams.VIEW_TYPE_BIG)
+                    .allowTextWithProgress(true)
+                    .fillTextsFrom(mBuilder);
+
+            // Replace the text with the big text, but only if the big text is not empty.
+            RemoteViews contentView = getStandardView(mBuilder.getProgressLayoutResource(), p,
+                    null /* result */);
+
+            // Bind progress start and end icons.
+            if (mStartIcon != null) {
+                contentView.setViewVisibility(R.id.notification_progress_start_icon, View.VISIBLE);
+                contentView.setImageViewIcon(R.id.notification_progress_start_icon, mStartIcon);
+            } else {
+                contentView.setViewVisibility(R.id.notification_progress_start_icon, View.GONE);
+            }
+
+            if (mEndIcon != null) {
+                contentView.setViewVisibility(R.id.notification_progress_end_icon, View.VISIBLE);
+                contentView.setImageViewIcon(R.id.notification_progress_end_icon, mEndIcon);
+            } else {
+                contentView.setViewVisibility(R.id.notification_progress_end_icon, View.GONE);
+            }
+
+            return contentView;
+        }
+
+        private static @NonNull ArrayList<Bundle> getProgressSegmentsAsBundleList(
+                @Nullable List<Segment> progressSegments) {
+            final ArrayList<Bundle> segments = new ArrayList<>();
+            if (progressSegments != null && !progressSegments.isEmpty()) {
+                for (int i = 0; i < progressSegments.size(); i++) {
+                    final Segment segment = progressSegments.get(i);
+                    if (segment.getLength() <= 0) {
+                        continue;
+                    }
+
+                    final Bundle bundle = new Bundle();
+                    bundle.putInt(KEY_SEGMENT_LENGTH, segment.getLength());
+                    bundle.putInt(KEY_ELEMENT_ID, segment.getId());
+                    bundle.putInt(KEY_ELEMENT_COLOR, segment.getColor());
+
+                    segments.add(bundle);
+                }
+            }
+
+            return segments;
+        }
+
+        private static @NonNull List<Segment> getProgressSegmentsFromBundleList(
+                @Nullable List<Bundle> segmentBundleList) {
+            final ArrayList<Segment> segments = new ArrayList<>();
+            if (segmentBundleList != null && !segmentBundleList.isEmpty()) {
+                for (int i = 0; i < segmentBundleList.size(); i++) {
+                    final Bundle segmentBundle = segmentBundleList.get(i);
+                    final int length = segmentBundle.getInt(KEY_SEGMENT_LENGTH);
+                    if (length <= 0) {
+                        continue;
+                    }
+
+                    final int id = segmentBundle.getInt(KEY_ELEMENT_ID);
+                    final int color = segmentBundle.getInt(KEY_ELEMENT_COLOR,
+                            Notification.COLOR_DEFAULT);
+                    final Segment segment = new Segment(length)
+                            .setId(id).setColor(color);
+
+                    segments.add(segment);
+                }
+            }
+
+            return segments;
+        }
+
+        private static @NonNull ArrayList<Bundle> getProgressPointsAsBundleList(
+                @Nullable List<Point> progressPoints) {
+            final ArrayList<Bundle> points = new ArrayList<>();
+            if (progressPoints != null && !progressPoints.isEmpty()) {
+                for (int i = 0; i < progressPoints.size(); i++) {
+                    final Point point = progressPoints.get(i);
+                    if (point.getPosition() < 0) {
+                        continue;
+                    }
+
+                    final Bundle bundle = new Bundle();
+                    bundle.putInt(KEY_POINT_POSITION, point.getPosition());
+                    bundle.putInt(KEY_ELEMENT_ID, point.getId());
+                    bundle.putInt(KEY_ELEMENT_COLOR, point.getColor());
+
+                    points.add(bundle);
+                }
+            }
+
+            return points;
+        }
+
+        private static @NonNull List<Point> getProgressPointsFromBundleList(
+                @Nullable List<Bundle> pointBundleList) {
+            final ArrayList<Point> points = new ArrayList<>();
+
+            if (pointBundleList != null && !pointBundleList.isEmpty()) {
+                for (int i = 0; i < pointBundleList.size(); i++) {
+                    final Bundle pointBundle = pointBundleList.get(i);
+                    final int position = pointBundle.getInt(KEY_POINT_POSITION);
+                    if (position < 0) {
+                        continue;
+                    }
+                    final int id = pointBundle.getInt(KEY_ELEMENT_ID);
+                    final int color = pointBundle.getInt(KEY_ELEMENT_COLOR,
+                            Notification.COLOR_DEFAULT);
+                    final Point point = new Point(position).setId(id).setColor(color);
+                    points.add(point);
+                }
+            }
+
+            return points;
+        }
+
+        /**
+         * A segment of the progress bar, which defines its length and color.
+         * Segments allow for creating progress bars with multiple colors or sections
+         * to represent different stages or categories of progress.
+         * For example, Traffic conditions along a navigation journey.
+         */
+        public static final class Segment {
+            private int mLength;
+            private int mId = 0;
+            @ColorInt
+            private int mColor = Notification.COLOR_DEFAULT;
+
+            /**
+             * Create a segment with a non-zero length.
+             * @param length
+             * See {@link #getLength}
+             */
+            public Segment(int length) {
+                mLength = length;
+            }
+
+            /**
+             * The length of this Segment within the progress bar.
+             * This value has no units, it is just relative to the length of other segments,
+             * and the value provided to {@link ProgressStyle#setProgress}.
+             */
+            public int getLength() {
+                return mLength;
+            }
+
+            /**
+             * Gets the id of this Segment.
+             *
+             * @see #setId
+             */
+            public int getId() {
+                return mId;
+            }
+
+            /**
+             * Optional ID used to uniquely identify the element across updates.
+             */
+            public @NonNull Segment setId(int id) {
+                mId = id;
+                return this;
+            }
+
+            /**
+             * Returns the color of this Segment.
+             *
+             * @see #setColor
+             */
+            @ColorInt
+            public int getColor() {
+                return mColor;
+            }
+
+            /**
+             * Optional color of this Segment
+             */
+            public @NonNull Segment setColor(@ColorInt int color) {
+                mColor = color;
+                return this;
+            }
+
+            /**
+             * Needed for {@link Notification.Style#areNotificationsVisiblyDifferent}
+             */
+            @Override
+            public boolean equals(Object o) {
+                if (this == o) return true;
+                if (o == null || getClass() != o.getClass()) return false;
+                final Segment segment = (Segment) o;
+                return mLength == segment.mLength && mId == segment.mId
+                        && mColor == segment.mColor;
+            }
+
+            @Override
+            public int hashCode() {
+                return Objects.hash(mLength, mId, mColor);
+            }
+        }
+
+        /**
+         * A point within the progress bar, defining its position and color.
+         * Points within a progress bar are used to visualize distinct stages or milestones.
+         * For example, you might use points to mark stops in a multi-stop
+         * navigation journey, where each point represents a destination.
+         */
+        public static final class Point {
+
+            private int mPosition;
+            private int mId;
+            @ColorInt
+            private int mColor = Notification.COLOR_DEFAULT;
+
+            /**
+             * Create a point element.
+             * The position of this point on the progress bar
+             * relative to {@link ProgressStyle#getProgressMax}
+             * @param position
+             * See {@link #getPosition}
+             */
+            public Point(int position) {
+                mPosition = position;
+            }
+
+            /**
+             * Gets the position of this Point.
+             * The position of this point on the progress bar
+             * relative to {@link ProgressStyle#getProgressMax}.
+             */
+            public int getPosition() {
+                return mPosition;
+            }
+
+
+            /**
+             * Optional ID used to uniquely identify the element across updates.
+             */
+            public int getId() {
+                return mId;
+            }
+
+            /**
+             * Optional ID used to uniquely identify the element across updates.
+             */
+            public @NonNull Point setId(int id) {
+                mId = id;
+                return this;
+            }
+
+            /**
+             * Returns the color of this Segment.
+             *
+             * @see #setColor
+             */
+            @ColorInt
+            public int getColor() {
+                return mColor;
+            }
+
+            /**
+             * Optional color of this Segment
+             */
+            public @NonNull Point setColor(@ColorInt int color) {
+                mColor = color;
+                return this;
+            }
+
+            /**
+             * Needed for {@link Notification.Style#areNotificationsVisiblyDifferent}
+             */
+            @Override
+            public boolean equals(Object o) {
+                if (this == o) return true;
+                if (o == null || getClass() != o.getClass()) return false;
+                final Point point = (Point) o;
+                return mPosition == point.mPosition && mId == point.mId
+                        && mColor == point.mColor;
+            }
+
+            @Override
+            public int hashCode() {
+                return Objects.hash(mPosition, mId, mColor);
             }
         }
     }
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index 06f21b8..41abd68 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -68,9 +68,11 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.Executor;
 
 /**
@@ -956,6 +958,9 @@
      * Returns whether the calling app's properly formatted notifications can appear in a promoted
      * format, which may result in higher ranking, appearances on additional surfaces, and richer
      * presentation.
+     *
+     * Apps can request this permission by sending the user to the activity that matches the system
+     * intent action {@link android.provider.Settings#ACTION_APP_NOTIFICATION_PROMOTION_SETTINGS}.
      */
     @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
     public boolean canPostPromotedNotifications() {
@@ -976,7 +981,7 @@
     public void setCanPostPromotedNotifications(@NonNull String pkg, int uid, boolean allowed) {
         INotificationManager service = getService();
         try {
-            service.setCanBePromoted(pkg, uid, allowed);
+            service.setCanBePromoted(pkg, uid, allowed, true);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -3094,4 +3099,19 @@
         }
     }
 
+    /**
+     * Returns the list of {@link Adjustment} keys that the current approved
+     * {@link android.service.notification.NotificationAssistantService} does not support.
+     * @hide
+     */
+    @TestApi
+    @FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION)
+    public @NonNull Set<String> getUnsupportedAdjustmentTypes() {
+        INotificationManager service = getService();
+        try {
+            return new HashSet<>(service.getUnsupportedAdjustmentTypes());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
 }
diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java
index 3714e5d..393ec8c 100644
--- a/core/java/android/app/PendingIntent.java
+++ b/core/java/android/app/PendingIntent.java
@@ -1094,6 +1094,9 @@
             @Nullable String requiredPermission, @Nullable Bundle options)
             throws CanceledException {
         try {
+            if (intent != null) {
+                intent.collectExtraIntentKeys();
+            }
             String resolvedType = intent != null ?
                     intent.resolveTypeIfNeeded(context.getContentResolver())
                     : null;
diff --git a/core/java/android/app/PropertyInvalidatedCache.java b/core/java/android/app/PropertyInvalidatedCache.java
index 0e761fc..c17da24 100644
--- a/core/java/android/app/PropertyInvalidatedCache.java
+++ b/core/java/android/app/PropertyInvalidatedCache.java
@@ -54,198 +54,8 @@
  * LRU cache that's invalidated when an opaque value in a property changes. Self-synchronizing,
  * but doesn't hold a lock across data fetches on query misses.
  *
- * The intended use case is caching frequently-read, seldom-changed information normally
- * retrieved across interprocess communication. Imagine that you've written a user birthday
- * information daemon called "birthdayd" that exposes an {@code IUserBirthdayService} interface
- * over binder. That binder interface looks something like this:
- *
- * <pre>
- * parcelable Birthday {
- *   int month;
- *   int day;
- * }
- * interface IUserBirthdayService {
- *   Birthday getUserBirthday(int userId);
- * }
- * </pre>
- *
- * Suppose the service implementation itself looks like this...
- *
- * <pre>
- * public class UserBirthdayServiceImpl implements IUserBirthdayService {
- *   private final HashMap&lt;Integer, Birthday%&gt; mUidToBirthday;
- *   {@literal @}Override
- *   public synchronized Birthday getUserBirthday(int userId) {
- *     return mUidToBirthday.get(userId);
- *   }
- *   private synchronized void updateBirthdays(Map&lt;Integer, Birthday%&gt; uidToBirthday) {
- *     mUidToBirthday.clear();
- *     mUidToBirthday.putAll(uidToBirthday);
- *   }
- * }
- * </pre>
- *
- * ... and we have a client in frameworks (loaded into every app process) that looks
- * like this:
- *
- * <pre>
- * public class ActivityThread {
- *   ...
- *   public Birthday getUserBirthday(int userId) {
- *     return GetService("birthdayd").getUserBirthday(userId);
- *   }
- *   ...
- * }
- * </pre>
- *
- * With this code, every time an app calls {@code getUserBirthday(uid)}, we make a binder call
- * to the birthdayd process and consult its database of birthdays. If we query user birthdays
- * frequently, we do a lot of work that we don't have to do, since user birthdays
- * change infrequently.
- *
- * PropertyInvalidatedCache is part of a pattern for optimizing this kind of
- * information-querying code. Using {@code PropertyInvalidatedCache}, you'd write the client
- * this way:
- *
- * <pre>
- * public class ActivityThread {
- *   ...
- *   private final PropertyInvalidatedCache.QueryHandler&lt;Integer, Birthday&gt; mBirthdayQuery =
- *       new PropertyInvalidatedCache.QueryHandler&lt;Integer, Birthday&gt;() {
- *           {@literal @}Override
- *           public Birthday apply(Integer) {
- *              return GetService("birthdayd").getUserBirthday(userId);
- *           }
- *       };
- *   private static final int BDAY_CACHE_MAX = 8;  // Maximum birthdays to cache
- *   private static final String BDAY_CACHE_KEY = "cache_key.birthdayd";
- *   private final PropertyInvalidatedCache&lt;Integer, Birthday%&gt; mBirthdayCache = new
- *     PropertyInvalidatedCache&lt;Integer, Birthday%&gt;(
- *             BDAY_CACHE_MAX, MODULE_SYSTEM, "getUserBirthday", mBirthdayQuery);
- *
- *   public void disableUserBirthdayCache() {
- *     mBirthdayCache.disableForCurrentProcess();
- *   }
- *   public void invalidateUserBirthdayCache() {
- *     mBirthdayCache.invalidateCache();
- *   }
- *   public Birthday getUserBirthday(int userId) {
- *     return mBirthdayCache.query(userId);
- *   }
- *   ...
- * }
- * </pre>
- *
- * With this cache, clients perform a binder call to birthdayd if asking for a user's birthday
- * for the first time; on subsequent queries, we return the already-known Birthday object.
- *
- * The second parameter to the IpcDataCache constructor is a string that identifies the "module"
- * that owns the cache. There are some well-known modules (such as {@code MODULE_SYSTEM} but any
- * string is permitted.  The third parameters is the name of the API being cached; this, too, can
- * any value.  The fourth is the name of the cache.  The cache is usually named after th API.
- * Some things you must know about the three strings:
- * <list>
- * <ul> The system property that controls the cache is named {@code cache_key.<module>.<api>}.
- * Usually, the SELinux rules permit a process to write a system property (and therefore
- * invalidate a cache) based on the wildcard {@code cache_key.<module>.*}.  This means that
- * although the cache can be constructed with any module string, whatever string is chosen must be
- * consistent with the SELinux configuration.
- * <ul> The API name can be any string of alphanumeric characters.  All caches with the same API
- * are invalidated at the same time.  If a server supports several caches and all are invalidated
- * in common, then it is most efficient to assign the same API string to every cache.
- * <ul> The cache name can be any string.  In debug output, the name is used to distiguish between
- * caches with the same API name.  The cache name is also used when disabling caches in the
- * current process.  So, invalidation is based on the module+api but disabling (which is generally
- * a once-per-process operation) is based on the cache name.
- * </list>
- *
- * User birthdays do occasionally change, so we have to modify the server to invalidate this
- * cache when necessary. That invalidation code looks like this:
- *
- * <pre>
- * public class UserBirthdayServiceImpl {
- *   ...
- *   public UserBirthdayServiceImpl() {
- *     ...
- *     ActivityThread.currentActivityThread().disableUserBirthdayCache();
- *     ActivityThread.currentActivityThread().invalidateUserBirthdayCache();
- *   }
- *
- *   private synchronized void updateBirthdays(Map&lt;Integer, Birthday%&gt; uidToBirthday) {
- *     mUidToBirthday.clear();
- *     mUidToBirthday.putAll(uidToBirthday);
- *     ActivityThread.currentActivityThread().invalidateUserBirthdayCache();
- *   }
- *   ...
- * }
- * </pre>
- *
- * The call to {@code PropertyInvalidatedCache.invalidateCache()} guarantees that all clients
- * will re-fetch birthdays from binder during consequent calls to
- * {@code ActivityThread.getUserBirthday()}. Because the invalidate call happens with the lock
- * held, we maintain consistency between different client views of the birthday state. The use
- * of PropertyInvalidatedCache in this idiomatic way introduces no new race conditions.
- *
- * PropertyInvalidatedCache has a few other features for doing things like incremental
- * enhancement of cached values and invalidation of multiple caches (that all share the same
- * property key) at once.
- *
- * {@code BDAY_CACHE_KEY} is the name of a property that we set to an opaque unique value each
- * time we update the cache. SELinux configuration must allow everyone to read this property
- * and it must allow any process that needs to invalidate the cache (here, birthdayd) to write
- * the property. (These properties conventionally begin with the "cache_key." prefix.)
- *
- * The {@code UserBirthdayServiceImpl} constructor calls {@code disableUserBirthdayCache()} so
- * that calls to {@code getUserBirthday} from inside birthdayd don't go through the cache. In
- * this local case, there's no IPC, so use of the cache is (depending on exact
- * circumstance) unnecessary.
- *
- * There may be queries for which it is more efficient to bypass the cache than to cache
- * the result.  This would be true, for example, if some queries would require frequent
- * cache invalidation while other queries require infrequent invalidation.  To expand on
- * the birthday example, suppose that there is a userId that signifies "the next
- * birthday".  When passed this userId, the server returns the next birthday among all
- * users - this value changes as time advances.  The userId value can be cached, but the
- * cache must be invalidated whenever a birthday occurs, and this invalidates all
- * birthdays.  If there is a large number of users, invalidation will happen so often that
- * the cache provides no value.
- *
- * The class provides a bypass mechanism to handle this situation.
- * <pre>
- * public class ActivityThread {
- *   ...
- *   private final IpcDataCache.QueryHandler&lt;Integer, Birthday&gt; mBirthdayQuery =
- *       new IpcDataCache.QueryHandler&lt;Integer, Birthday&gt;() {
- *           {@literal @}Override
- *           public Birthday apply(Integer) {
- *              return GetService("birthdayd").getUserBirthday(userId);
- *           }
- *           {@literal @}Override
- *           public boolean shouldBypassQuery(Integer userId) {
- *               return userId == NEXT_BIRTHDAY;
- *           }
- *       };
- *   ...
- * }
- * </pre>
- *
- * If the {@code shouldBypassQuery()} method returns true then the cache is not used for that
- * particular query.  The {@code shouldBypassQuery()} method is not abstract and the default
- * implementation returns false.
- *
- * For security, there is a allowlist of processes that are allowed to invalidate a cache.
- * The allowlist includes normal runtime processes but does not include test processes.
- * Test processes must call {@code PropertyInvalidatedCache.disableForTestMode()} to disable
- * all cache activity in that process.
- *
- * Caching can be disabled completely by initializing {@code sEnabled} to false and rebuilding.
- *
- * To test a binder cache, create one or more tests that exercise the binder method.  This
- * should be done twice: once with production code and once with a special image that sets
- * {@code DEBUG} and {@code VERIFY} true.  In the latter case, verify that no cache
- * inconsistencies are reported.  If a cache inconsistency is reported, however, it might be a
- * false positive.  This happens if the server side data can be read and written non-atomically
- * with respect to cache invalidation.
+ * This interface is deprecated.  New clients should use {@link IpcDataCache} instead.  Internally,
+ * that class uses {@link PropertyInvalidatedCache} , but that design may change in the future.
  *
  * @param <Query> The class used to index cache entries: must be hashable and comparable
  * @param <Result> The class holding cache entries; use a boxed primitive if possible
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index 84a4eb4..a458b4e 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -431,16 +431,19 @@
     }
 
     /**
-     * Protected so that tests can override and returns something a fixed value.
+     * public so that tests can access and override
      */
     @VisibleForTesting
-    protected @NonNull DisplayMetrics getDisplayMetrics(int displayId, DisplayAdjustments da) {
+    public @NonNull DisplayMetrics getDisplayMetrics(int displayId, DisplayAdjustments da) {
         final DisplayManagerGlobal displayManagerGlobal = DisplayManagerGlobal.getInstance();
         final DisplayMetrics dm = new DisplayMetrics();
         final DisplayInfo displayInfo = displayManagerGlobal != null
                 ? displayManagerGlobal.getDisplayInfo(displayId) : null;
         if (displayInfo != null) {
-            displayInfo.getAppMetrics(dm, da);
+            final Configuration dajConfig = da.getConfiguration();
+            displayInfo.getAppMetrics(dm, da.getCompatibilityInfo(),
+                    (mResDisplayId == displayId && Configuration.EMPTY.equals(dajConfig))
+                            ? mResConfiguration : dajConfig);
         } else {
             dm.setToDefaults();
         }
@@ -1977,6 +1980,7 @@
     public void registerAllResourcesReference(@NonNull Resources resources) {
         if (android.content.res.Flags.registerResourcePaths()) {
             synchronized (mLock) {
+                cleanupReferences(mAllResourceReferences, mAllResourceReferencesQueue);
                 mAllResourceReferences.add(
                         new WeakReference<>(resources, mAllResourceReferencesQueue));
             }
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index c13a58f..ea4148c 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -230,6 +230,7 @@
 import android.print.PrintManager;
 import android.provider.E2eeContactKeysManager;
 import android.provider.ProviderFrameworkInitializer;
+import android.ranging.RangingFrameworkInitializer;
 import android.safetycenter.SafetyCenterFrameworkInitializer;
 import android.scheduling.SchedulingFrameworkInitializer;
 import android.security.FileIntegrityManager;
@@ -1825,6 +1826,12 @@
             if (android.webkit.Flags.updateServiceIpcWrapper()) {
                 WebViewBootstrapFrameworkInitializer.registerServiceWrappers();
             }
+            // This is guarded by aconfig flag "com.android.ranging.flags.ranging_stack_enabled"
+            // when the build flag RELEASE_RANGING_STACK is enabled. When disabled, this calls the
+            // mock RangingFrameworkInitializer#registerServiceWrappers which is no-op. As the
+            // aconfig lib for ranging module is built only if  RELEASE_RANGING_STACK is enabled,
+            // flagcannot be added here.
+            RangingFrameworkInitializer.registerServiceWrappers();
         } finally {
             // If any of the above code throws, we're in a pretty bad shape and the process
             // will likely crash, but we'll reset it just in case there's an exception handler...
diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java
index 99e6220..e882bb5 100644
--- a/core/java/android/app/TaskInfo.java
+++ b/core/java/android/app/TaskInfo.java
@@ -35,6 +35,7 @@
 import android.os.IBinder;
 import android.os.Parcel;
 import android.view.DisplayCutout;
+import android.view.WindowInsets;
 import android.window.WindowContainerToken;
 
 import java.util.ArrayList;
@@ -274,7 +275,10 @@
     public int parentTaskId;
 
     /**
-     * Whether this task is focused.
+     * Whether this task is focused on the display. This means the task receives input events that
+     * target the display.
+     * CAUTION: This can be true for multiple tasks especially when multiple displays are connected
+     * in the system.
      * @hide
      */
     public boolean isFocused;
@@ -329,6 +333,13 @@
     public long capturedLinkTimestamp;
 
     /**
+     * The requested visible types of insets.
+     * @hide
+     */
+    @WindowInsets.Type.InsetsType
+    public int requestedVisibleTypes;
+
+    /**
      * Encapsulate specific App Compat information.
      * @hide
      */
@@ -465,6 +476,7 @@
                 && lastNonFullscreenBounds == this.lastNonFullscreenBounds
                 && Objects.equals(capturedLink, that.capturedLink)
                 && capturedLinkTimestamp == that.capturedLinkTimestamp
+                && requestedVisibleTypes == that.requestedVisibleTypes
                 && appCompatTaskInfo.equalsForTaskOrganizer(that.appCompatTaskInfo);
     }
 
@@ -539,6 +551,7 @@
         lastNonFullscreenBounds = source.readTypedObject(Rect.CREATOR);
         capturedLink = source.readTypedObject(Uri.CREATOR);
         capturedLinkTimestamp = source.readLong();
+        requestedVisibleTypes = source.readInt();
         appCompatTaskInfo = source.readTypedObject(AppCompatTaskInfo.CREATOR);
     }
 
@@ -591,6 +604,7 @@
         dest.writeTypedObject(lastNonFullscreenBounds, flags);
         dest.writeTypedObject(capturedLink, flags);
         dest.writeLong(capturedLinkTimestamp);
+        dest.writeInt(requestedVisibleTypes);
         dest.writeTypedObject(appCompatTaskInfo, flags);
     }
 
@@ -633,6 +647,7 @@
                 + " lastNonFullscreenBounds=" + lastNonFullscreenBounds
                 + " capturedLink=" + capturedLink
                 + " capturedLinkTimestamp=" + capturedLinkTimestamp
+                + " requestedVisibleTypes=" + requestedVisibleTypes
                 + " appCompatTaskInfo=" + appCompatTaskInfo
                 + "}";
     }
diff --git a/core/java/android/app/UiModeManager.java b/core/java/android/app/UiModeManager.java
index 7903f1c..2e6f3e1 100644
--- a/core/java/android/app/UiModeManager.java
+++ b/core/java/android/app/UiModeManager.java
@@ -16,6 +16,7 @@
 
 package android.app;
 
+import static android.app.Flags.enableCurrentModeTypeBinderCache;
 import static android.app.Flags.enableNightModeBinderCache;
 
 import android.annotation.CallbackExecutor;
@@ -682,6 +683,53 @@
         }
     }
 
+    private Integer getCurrentModeTypeFromServer() {
+        try {
+            if (sGlobals != null) {
+                return sGlobals.mService.getCurrentModeType();
+            }
+            return Configuration.UI_MODE_TYPE_NORMAL;
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+
+    /**
+     * Retrieve the current running mode type for the user.
+     */
+    private final IpcDataCache.QueryHandler<Void, Integer> mCurrentModeTypeQuery =
+            new IpcDataCache.QueryHandler<>() {
+
+                @Override
+                @NonNull
+                public Integer apply(Void query) {
+                    return getCurrentModeTypeFromServer();
+                }
+            };
+
+    private static final String CURRENT_MODE_TYPE_API = "getCurrentModeType";
+
+    /**
+     * Cache the current running mode type for a user.
+     */
+    private final IpcDataCache<Void, Integer> mCurrentModeTypeCache =
+            new IpcDataCache<>(1, IpcDataCache.MODULE_SYSTEM,
+                    CURRENT_MODE_TYPE_API, /* cacheName= */ "CurrentModeTypeCache",
+                    mCurrentModeTypeQuery);
+
+    /**
+     * Invalidate the current mode type cache.
+     *
+     * @hide
+     */
+    @FlaggedApi(Flags.FLAG_ENABLE_CURRENT_MODE_TYPE_BINDER_CACHE)
+    public static void invalidateCurrentModeTypeCache() {
+        IpcDataCache.invalidateCache(IpcDataCache.MODULE_SYSTEM,
+                CURRENT_MODE_TYPE_API);
+    }
+
+
     /**
      * Return the current running mode type.  May be one of
      * {@link Configuration#UI_MODE_TYPE_NORMAL Configuration.UI_MODE_TYPE_NORMAL},
@@ -693,14 +741,11 @@
      * {@link Configuration#UI_MODE_TYPE_VR_HEADSET Configuration.UI_MODE_TYPE_VR_HEADSET}.
      */
     public int getCurrentModeType() {
-        if (sGlobals != null) {
-            try {
-                return sGlobals.mService.getCurrentModeType();
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
+        if (enableCurrentModeTypeBinderCache()) {
+            return mCurrentModeTypeCache.query(null);
+        } else {
+            return getCurrentModeTypeFromServer();
         }
-        return Configuration.UI_MODE_TYPE_NORMAL;
     }
 
     /**
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 38f59ad..c1c96ea 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -299,6 +299,14 @@
             "android.service.wallpaper.extra.FROM_FOREGROUND_APP";
 
     /**
+     * Extra passed on {@link Intent.ACTION_WALLPAPER_CHANGED} indicating if wallpaper was set from
+     * a foreground app.
+     * @hide
+     */
+    public static final String EXTRA_WHICH_WALLPAPER_CHANGED =
+            "android.service.wallpaper.extra.WHICH_WALLPAPER_CHANGED";
+
+    /**
      * The different screen orientations. {@link #getOrientation} provides their exact definition.
      * This is only used internally by the framework and the WallpaperBackupAgent.
      * @hide
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index daa15f0..9be928f 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -213,19 +213,17 @@
  * <a href="{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a>
  * developer guide.
  *
- * <p id="devicepolicycontroller">Through <a href="#managed_provisioning">Managed Provisioning</a>,
- * Device Administrator apps can also be recognised as <b>
- Device Policy Controllers</b>. Device Policy Controllers can be one of
+ * <p id="devicepolicycontroller">Device Administrator apps can also be recognised as <b>
+ * Device Policy Controllers</b>. Device Policy Controllers can be one of
  * two types:
  * <ul>
  * <li>A <i id="deviceowner">Device Owner</i>, which only ever exists on the
- * {@link UserManager#isSystemUser System User} or {@link UserManager#isMainUser Main User}, is
+ * {@link UserManager#isSystemUser System User} or Main User, is
  * the most powerful type of Device Policy Controller and can affect policy across the device.
  * <li>A <i id="profileowner">Profile Owner<i>, which can exist on any user, can
  * affect policy on the user it is on, and when it is running on
  * {@link UserManager#isProfile a profile} has
- * <a href="#profile-on-parent">limited</a> ability to affect policy on its
- * {@link UserManager#getProfileParent parent}.
+ * <a href="#profile-on-parent">limited</a> ability to affect policy on its parent.
  * </ul>
  *
  * <p>Additional capabilities can be provided to Device Policy Controllers in
@@ -233,7 +231,7 @@
  * <ul>
  * <li>A Profile Owner on an <a href="#organization-owned">organization owned</a> device has access
  * to additional abilities, both <a href="#profile-on-parent-organization-owned">affecting policy on the profile's</a>
- * {@link UserManager#getProfileParent parent} and also the profile itself.
+ * parent and also the profile itself.
  * <li>A Profile Owner running on the {@link UserManager#isSystemUser System User} has access to
  * additional capabilities which affect the {@link UserManager#isSystemUser System User} and
  * also the whole device.
@@ -245,13 +243,12 @@
  * Controller</a>.
  *
  * <p><a href="#permissions">Permissions</a> are generally only given to apps
- * fulfilling particular key roles on the device (such as managing {@link DeviceLockManager
-device locks}).
+ * fulfilling particular key roles on the device (such as managing
+ * {@link android.devicelock.DeviceLockManager device locks}).
  *
  * <p id="roleholder"><b>Device Policy Management Role Holder</b>
- * <p>One app on the device fulfills the {@link RoleManager#ROLE_DEVICE_POLICY_MANAGEMENT Device
-Policy Management Role} and is trusted with managing the overall state of
- * Device Policy. This has access to much more powerful methods than
+ * <p>One app on the device fulfills the Device Policy Management Role and is trusted with managing
+ * the overall state of Device Policy. This has access to much more powerful methods than
  * <a href="#managingapps">managing apps</a>.
  *
  * <p id="querying"><b>Querying Device Policy</b>
@@ -273,7 +270,7 @@
  *
  * <p id="managed_profile">A <b>Managed Profile</b> enables data separation. For example to use
  * a device both for personal and corporate usage. The managed profile and its
- * {@link UserManager#getProfileParent parent} share a launcher.
+ * parent share a launcher.
  *
  * <p id="affiliated"><b>Affiliation</b>
  * <p>Using the {@link #setAffiliationIds} method, a
@@ -6643,7 +6640,7 @@
      * @param flags May be 0 or {@link #FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY}.
      * @throws SecurityException if the calling application does not own an active administrator
      *             that uses {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} and the does not hold
-     *             the {@link android.Manifest.permission#LOCK_DEVICE} permission, or
+     *             the LOCK_DEVICE permission, or
      *             the {@link #FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY} flag is passed by an
      *             application that is not a profile owner of a managed profile.
      * @throws IllegalArgumentException if the {@link #FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY} flag is
diff --git a/core/java/android/app/admin/PolicySizeVerifier.java b/core/java/android/app/admin/PolicySizeVerifier.java
index 7f8e50e..1e03e1f 100644
--- a/core/java/android/app/admin/PolicySizeVerifier.java
+++ b/core/java/android/app/admin/PolicySizeVerifier.java
@@ -22,7 +22,9 @@
 import android.os.PersistableBundle;
 
 import com.android.internal.util.Preconditions;
+import com.android.modules.utils.ModifiedUtf8;
 
+import java.io.UTFDataFormatException;
 import java.util.ArrayDeque;
 import java.util.Queue;
 
@@ -33,8 +35,6 @@
  */
 public class PolicySizeVerifier {
 
-    // Binary XML serializer doesn't support longer strings
-    public static final int MAX_POLICY_STRING_LENGTH = 65535;
     // FrameworkParsingPackageUtils#MAX_FILE_NAME_SIZE, Android packages are used in dir names.
     public static final int MAX_PACKAGE_NAME_LENGTH = 223;
 
@@ -47,8 +47,11 @@
      * Throw if string argument is too long to be serialized.
      */
     public static void enforceMaxStringLength(String str, String argName) {
-        Preconditions.checkArgument(
-                str.length() <= MAX_POLICY_STRING_LENGTH, argName + " loo long");
+        try {
+            long len = ModifiedUtf8.countBytes(str, /* throw error if too long */ true);
+        } catch (UTFDataFormatException e) {
+            throw new IllegalArgumentException(argName + " too long");
+        }
     }
 
     /**
diff --git a/core/java/android/app/admin/SecurityLog.java b/core/java/android/app/admin/SecurityLog.java
index beb93fd..eb0ea1e 100644
--- a/core/java/android/app/admin/SecurityLog.java
+++ b/core/java/android/app/admin/SecurityLog.java
@@ -16,7 +16,10 @@
 
 package android.app.admin;
 
+import static android.nfc.Flags.FLAG_NFC_STATE_CHANGE_SECURITY_LOG_EVENT_ENABLED;
+
 import android.Manifest;
+import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -100,6 +103,8 @@
             TAG_PACKAGE_UPDATED,
             TAG_PACKAGE_UNINSTALLED,
             TAG_BACKUP_SERVICE_TOGGLED,
+            TAG_NFC_ENABLED,
+            TAG_NFC_DISABLED,
     })
     public @interface SecurityLogTag {}
 
@@ -610,6 +615,18 @@
      */
     public static final int TAG_BACKUP_SERVICE_TOGGLED =
             SecurityLogTags.SECURITY_BACKUP_SERVICE_TOGGLED;
+
+    /**
+     * Indicates that NFC service is enabled. There is no extra payload in the log event.
+     */
+    @FlaggedApi(FLAG_NFC_STATE_CHANGE_SECURITY_LOG_EVENT_ENABLED)
+    public static final int TAG_NFC_ENABLED = SecurityLogTags.SECURITY_NFC_ENABLED;
+
+    /**
+     * Indicates that NFC service is disabled. There is no extra payload in the log event.
+     */
+    @FlaggedApi(FLAG_NFC_STATE_CHANGE_SECURITY_LOG_EVENT_ENABLED)
+    public static final int TAG_NFC_DISABLED = SecurityLogTags.SECURITY_NFC_DISABLED;
     /**
      * Event severity level indicating that the event corresponds to normal workflow.
      */
diff --git a/core/java/android/app/admin/SecurityLogTags.logtags b/core/java/android/app/admin/SecurityLogTags.logtags
index 7b3aa7b..8f22c76 100644
--- a/core/java/android/app/admin/SecurityLogTags.logtags
+++ b/core/java/android/app/admin/SecurityLogTags.logtags
@@ -48,4 +48,6 @@
 210041 security_package_installed               (package_name|3),(version_code|1),(user_id|1)
 210042 security_package_updated                 (package_name|3),(version_code|1),(user_id|1)
 210043 security_package_uninstalled             (package_name|3),(version_code|1),(user_id|1)
-210044 security_backup_service_toggled          (package|3),(admin_user|1),(enabled|1)
\ No newline at end of file
+210044 security_backup_service_toggled          (package|3),(admin_user|1),(enabled|1)
+210045 security_nfc_enabled
+210046 security_nfc_disabled
\ No newline at end of file
diff --git a/core/java/android/app/admin/flags/flags.aconfig b/core/java/android/app/admin/flags/flags.aconfig
index d9f886d..fd58377 100644
--- a/core/java/android/app/admin/flags/flags.aconfig
+++ b/core/java/android/app/admin/flags/flags.aconfig
@@ -323,9 +323,9 @@
 }
 
 flag {
-    name: "dont_read_policy_definition"
+    name: "dont_write_policy_definition"
     namespace: "enterprise"
-    description: "Rely on <policy-key-entry> to determine policy definition and ignore <policy-definition-entry>"
+    description: "Don't write redundant policy-definition-entry tags"
     bug: "335663055"
     metadata {
         purpose: PURPOSE_BUGFIX
diff --git a/core/java/android/app/appfunctions/AppFunctionManager.java b/core/java/android/app/appfunctions/AppFunctionManager.java
index 4682f3d..439d988 100644
--- a/core/java/android/app/appfunctions/AppFunctionManager.java
+++ b/core/java/android/app/appfunctions/AppFunctionManager.java
@@ -22,13 +22,21 @@
 import android.Manifest;
 import android.annotation.CallbackExecutor;
 import android.annotation.FlaggedApi;
+import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.RequiresPermission;
 import android.annotation.SystemService;
 import android.annotation.UserHandleAware;
+import android.app.appsearch.AppSearchManager;
 import android.content.Context;
+import android.os.CancellationSignal;
+import android.os.ICancellationSignal;
+import android.os.OutcomeReceiver;
+import android.os.ParcelableException;
 import android.os.RemoteException;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.Objects;
 import java.util.concurrent.Executor;
 import java.util.function.Consumer;
@@ -43,10 +51,44 @@
 @FlaggedApi(FLAG_ENABLE_APP_FUNCTION_MANAGER)
 @SystemService(Context.APP_FUNCTION_SERVICE)
 public final class AppFunctionManager {
+
+    /**
+     * The default state of the app function. Call {@link #setAppFunctionEnabled} with this to reset
+     * enabled state to the default value.
+     */
+    public static final int APP_FUNCTION_STATE_DEFAULT = 0;
+
+    /**
+     * The app function is enabled. To enable an app function, call {@link #setAppFunctionEnabled}
+     * with this value.
+     */
+    public static final int APP_FUNCTION_STATE_ENABLED = 1;
+
+    /**
+     * The app function is disabled. To disable an app function, call {@link #setAppFunctionEnabled}
+     * with this value.
+     */
+    public static final int APP_FUNCTION_STATE_DISABLED = 2;
+
     private final IAppFunctionManager mService;
     private final Context mContext;
 
     /**
+     * The enabled state of the app function.
+     *
+     * @hide
+     */
+    @IntDef(
+            prefix = {"APP_FUNCTION_STATE_"},
+            value = {
+                APP_FUNCTION_STATE_DEFAULT,
+                APP_FUNCTION_STATE_ENABLED,
+                APP_FUNCTION_STATE_DISABLED
+            })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface EnabledState {}
+
+    /**
      * Creates an instance.
      *
      * @param service An interface to the backing service.
@@ -73,7 +115,43 @@
      *     android.permission.EXECUTE_APP_FUNCTIONS_TRUSTED} or {@code
      *     android.permission.EXECUTE_APP_FUNCTIONS}, the execution result will contain {@code
      *     ExecuteAppFunctionResponse.RESULT_DENIED}.
+     * @deprecated Use {@link #executeAppFunction(ExecuteAppFunctionRequest, Executor,
+     *     CancellationSignal, Consumer)} instead. This method will be removed once usage references
+     *     are updated.
      */
+    @RequiresPermission(
+            anyOf = {
+                Manifest.permission.EXECUTE_APP_FUNCTIONS_TRUSTED,
+                Manifest.permission.EXECUTE_APP_FUNCTIONS
+            },
+            conditional = true)
+    @UserHandleAware
+    @Deprecated
+    public void executeAppFunction(
+            @NonNull ExecuteAppFunctionRequest request,
+            @NonNull @CallbackExecutor Executor executor,
+            @NonNull Consumer<ExecuteAppFunctionResponse> callback) {
+        executeAppFunction(request, executor, new CancellationSignal(), callback);
+    }
+
+    /**
+     * Executes the app function.
+     *
+     * <p>Note: Applications can execute functions they define. To execute functions defined in
+     * another component, apps would need to have {@code
+     * android.permission.EXECUTE_APP_FUNCTIONS_TRUSTED} or {@code
+     * android.permission.EXECUTE_APP_FUNCTIONS}.
+     *
+     * @param request the request to execute the app function
+     * @param executor the executor to run the callback
+     * @param cancellationSignal the cancellation signal to cancel the execution.
+     * @param callback the callback to receive the function execution result. if the calling app
+     *     does not own the app function or does not have {@code
+     *     android.permission.EXECUTE_APP_FUNCTIONS_TRUSTED} or {@code
+     *     android.permission.EXECUTE_APP_FUNCTIONS}, the execution result will contain {@code
+     *     ExecuteAppFunctionResponse.RESULT_DENIED}.
+     */
+    // TODO(b/357551503): Document the behavior when the cancellation signal is issued.
     // TODO(b/360864791): Document that apps can opt-out from being executed by callers with
     //   EXECUTE_APP_FUNCTIONS and how a caller knows whether a function is opted out.
     // TODO(b/357551503): Update documentation when get / set APIs are implemented that this will
@@ -88,6 +166,7 @@
     public void executeAppFunction(
             @NonNull ExecuteAppFunctionRequest request,
             @NonNull @CallbackExecutor Executor executor,
+            @NonNull CancellationSignal cancellationSignal,
             @NonNull Consumer<ExecuteAppFunctionResponse> callback) {
         Objects.requireNonNull(request);
         Objects.requireNonNull(executor);
@@ -96,27 +175,148 @@
         ExecuteAppFunctionAidlRequest aidlRequest =
                 new ExecuteAppFunctionAidlRequest(
                         request, mContext.getUser(), mContext.getPackageName());
+
         try {
-            mService.executeAppFunction(
-                    aidlRequest,
-                    new IExecuteAppFunctionCallback.Stub() {
-                        @Override
-                        public void onResult(ExecuteAppFunctionResponse result) {
-                            try {
-                                executor.execute(() -> callback.accept(result));
-                            } catch (RuntimeException e) {
-                                // Ideally shouldn't happen since errors are wrapped into the
-                                // response, but we catch it here for additional safety.
-                                callback.accept(
-                                        ExecuteAppFunctionResponse.newFailure(
-                                                getResultCode(e),
-                                                e.getMessage(),
-                                                /* extras= */ null));
-                            }
-                        }
-                    });
+            ICancellationSignal cancellationTransport =
+                    mService.executeAppFunction(
+                            aidlRequest,
+                            new IExecuteAppFunctionCallback.Stub() {
+                                @Override
+                                public void onResult(ExecuteAppFunctionResponse result) {
+                                    try {
+                                        executor.execute(() -> callback.accept(result));
+                                    } catch (RuntimeException e) {
+                                        // Ideally shouldn't happen since errors are wrapped into
+                                        // the
+                                        // response, but we catch it here for additional safety.
+                                        callback.accept(
+                                                ExecuteAppFunctionResponse.newFailure(
+                                                        getResultCode(e),
+                                                        e.getMessage(),
+                                                        /* extras= */ null));
+                                    }
+                                }
+                            });
+            if (cancellationTransport != null) {
+                cancellationSignal.setRemote(cancellationTransport);
+            }
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
     }
+
+    /**
+     * Returns a boolean through a callback, indicating whether the app function is enabled.
+     *
+     * <p>* This method can only check app functions owned by the caller, or those where the caller
+     * has visibility to the owner package and holds either the {@link
+     * Manifest.permission#EXECUTE_APP_FUNCTIONS} or {@link
+     * Manifest.permission#EXECUTE_APP_FUNCTIONS_TRUSTED} permission.
+     *
+     * <p>If operation fails, the callback's {@link OutcomeReceiver#onError} is called with errors:
+     *
+     * <ul>
+     *   <li>{@link IllegalArgumentException}, if the function is not found or the caller does not
+     *       have access to it.
+     * </ul>
+     *
+     * @param functionIdentifier the identifier of the app function to check (unique within the
+     *     target package) and in most cases, these are automatically generated by the AppFunctions
+     *     SDK
+     * @param targetPackage the package name of the app function's owner
+     * @param executor the executor to run the request
+     * @param callback the callback to receive the function enabled check result
+     */
+    public void isAppFunctionEnabled(
+            @NonNull String functionIdentifier,
+            @NonNull String targetPackage,
+            @NonNull Executor executor,
+            @NonNull OutcomeReceiver<Boolean, Exception> callback) {
+        Objects.requireNonNull(functionIdentifier);
+        Objects.requireNonNull(targetPackage);
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(callback);
+        AppSearchManager appSearchManager = mContext.getSystemService(AppSearchManager.class);
+        if (appSearchManager == null) {
+            callback.onError(new IllegalStateException("Failed to get AppSearchManager."));
+            return;
+        }
+
+        AppFunctionManagerHelper.isAppFunctionEnabled(
+                functionIdentifier, targetPackage, appSearchManager, executor, callback);
+    }
+
+    /**
+     * Sets the enabled state of the app function owned by the calling package.
+     *
+     * <p>If operation fails, the callback's {@link OutcomeReceiver#onError} is called with errors:
+     *
+     * <ul>
+     *   <li>{@link IllegalArgumentException}, if the function is not found or the caller does not
+     *       have access to it.
+     * </ul>
+     *
+     * @param functionIdentifier the identifier of the app function to enable (unique within the
+     *     calling package). In most cases, identifiers are automatically generated by the
+     *     AppFunctions SDK
+     * @param newEnabledState the new state of the app function
+     * @param executor the executor to run the callback
+     * @param callback the callback to receive the result of the function enablement. The call was
+     *     successful if no exception was thrown.
+     */
+    @UserHandleAware
+    public void setAppFunctionEnabled(
+            @NonNull String functionIdentifier,
+            @EnabledState int newEnabledState,
+            @NonNull Executor executor,
+            @NonNull OutcomeReceiver<Void, Exception> callback) {
+        Objects.requireNonNull(functionIdentifier);
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(callback);
+        CallbackWrapper callbackWrapper = new CallbackWrapper(executor, callback);
+        try {
+            mService.setAppFunctionEnabled(
+                    mContext.getPackageName(),
+                    functionIdentifier,
+                    mContext.getUser(),
+                    newEnabledState,
+                    callbackWrapper);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    private static class CallbackWrapper extends IAppFunctionEnabledCallback.Stub {
+
+        private final OutcomeReceiver<Void, Exception> mCallback;
+        private final Executor mExecutor;
+
+        CallbackWrapper(
+                @NonNull Executor callbackExecutor,
+                @NonNull OutcomeReceiver<Void, Exception> callback) {
+            mCallback = callback;
+            mExecutor = callbackExecutor;
+        }
+
+        @Override
+        public void onSuccess() {
+            mExecutor.execute(() -> mCallback.onResult(null));
+        }
+
+        @Override
+        public void onError(@NonNull ParcelableException exception) {
+            mExecutor.execute(
+                    () -> {
+                        if (IllegalArgumentException.class.isAssignableFrom(
+                                exception.getCause().getClass())) {
+                            mCallback.onError((IllegalArgumentException) exception.getCause());
+                        } else if (SecurityException.class.isAssignableFrom(
+                                exception.getCause().getClass())) {
+                            mCallback.onError((SecurityException) exception.getCause());
+                        } else {
+                            mCallback.onError(exception);
+                        }
+                    });
+        }
+    }
 }
diff --git a/core/java/android/app/appfunctions/AppFunctionManagerHelper.java b/core/java/android/app/appfunctions/AppFunctionManagerHelper.java
index d6f45e4..64dece9 100644
--- a/core/java/android/app/appfunctions/AppFunctionManagerHelper.java
+++ b/core/java/android/app/appfunctions/AppFunctionManagerHelper.java
@@ -16,13 +16,15 @@
 
 package android.app.appfunctions;
 
+import static android.app.appfunctions.AppFunctionManager.APP_FUNCTION_STATE_DEFAULT;
+import static android.app.appfunctions.AppFunctionManager.APP_FUNCTION_STATE_ENABLED;
 import static android.app.appfunctions.AppFunctionRuntimeMetadata.PROPERTY_APP_FUNCTION_STATIC_METADATA_QUALIFIED_ID;
 import static android.app.appfunctions.AppFunctionRuntimeMetadata.PROPERTY_ENABLED;
 import static android.app.appfunctions.AppFunctionStaticMetadataHelper.APP_FUNCTION_INDEXER_PACKAGE;
 import static android.app.appfunctions.AppFunctionStaticMetadataHelper.STATIC_PROPERTY_ENABLED_BY_DEFAULT;
 import static android.app.appfunctions.flags.Flags.FLAG_ENABLE_APP_FUNCTION_MANAGER;
 
-import android.annotation.CallbackExecutor;
+import android.Manifest;
 import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.app.appsearch.AppSearchManager;
@@ -33,6 +35,7 @@
 import android.app.appsearch.SearchResults;
 import android.app.appsearch.SearchSpec;
 import android.os.OutcomeReceiver;
+import android.text.TextUtils;
 
 import java.io.IOException;
 import java.util.List;
@@ -50,73 +53,69 @@
     /**
      * Returns (through a callback) a boolean indicating whether the app function is enabled.
      *
-     * <p>This method can only check app functions that are owned by the caller owned by packages
-     * visible to the caller.
+     * This method can only check app functions owned by the caller, or those where the caller
+     * has visibility to the owner package and holds either the {@link
+     * Manifest.permission#EXECUTE_APP_FUNCTIONS} or {@link
+     * Manifest.permission#EXECUTE_APP_FUNCTIONS_TRUSTED} permission.
      *
      * <p>If operation fails, the callback's {@link OutcomeReceiver#onError} is called with errors:
      *
      * <ul>
-     *   <li>{@link IllegalArgumentException}, if the function is not found
-     *   <li>{@link SecurityException}, if the caller does not have permission to query the target
-     *       package
+     *   <li>{@link IllegalArgumentException}, if the function is not found or the caller does not
+     *       have access to it.
      * </ul>
      *
      * @param functionIdentifier the identifier of the app function to check (unique within the
-     *     target package) and in most cases, these are automatically generated by the AppFunctions
-     *     SDK
-     * @param targetPackage the package name of the app function's owner
-     * @param appSearchExecutor the executor to run the metadata search mechanism through AppSearch
-     * @param callbackExecutor the executor to run the callback
-     * @param callback the callback to receive the function enabled check result
+     *                           target package) and in most cases, these are automatically
+     *                           generated by the AppFunctions
+     *                           SDK
+     * @param targetPackage      the package name of the app function's owner
+     * @param executor           executor the executor to run the request
+     * @param callback           the callback to receive the function enabled check result
      * @hide
      */
     public static void isAppFunctionEnabled(
             @NonNull String functionIdentifier,
             @NonNull String targetPackage,
             @NonNull AppSearchManager appSearchManager,
-            @NonNull Executor appSearchExecutor,
-            @NonNull @CallbackExecutor Executor callbackExecutor,
+            @NonNull Executor executor,
             @NonNull OutcomeReceiver<Boolean, Exception> callback) {
         Objects.requireNonNull(functionIdentifier);
         Objects.requireNonNull(targetPackage);
         Objects.requireNonNull(appSearchManager);
-        Objects.requireNonNull(appSearchExecutor);
-        Objects.requireNonNull(callbackExecutor);
+        Objects.requireNonNull(executor);
         Objects.requireNonNull(callback);
 
         appSearchManager.createGlobalSearchSession(
-                appSearchExecutor,
+                executor,
                 (searchSessionResult) -> {
                     if (!searchSessionResult.isSuccess()) {
-                        callbackExecutor.execute(
-                                () ->
-                                        callback.onError(
-                                                failedResultToException(searchSessionResult)));
+                        callback.onError(failedResultToException(searchSessionResult));
                         return;
                     }
                     try (GlobalSearchSession searchSession = searchSessionResult.getResultValue()) {
                         SearchResults results =
                                 searchJoinedStaticWithRuntimeAppFunctions(
-                                        searchSession, targetPackage, functionIdentifier);
+                                        Objects.requireNonNull(searchSession),
+                                        targetPackage,
+                                        functionIdentifier);
                         results.getNextPage(
-                                appSearchExecutor,
-                                listAppSearchResult ->
-                                        callbackExecutor.execute(
-                                                () -> {
-                                                    if (listAppSearchResult.isSuccess()) {
-                                                        callback.onResult(
-                                                                getEnabledStateFromSearchResults(
-                                                                        Objects.requireNonNull(
-                                                                                listAppSearchResult
+                                executor,
+                                listAppSearchResult -> {
+                                    if (listAppSearchResult.isSuccess()) {
+                                        callback.onResult(
+                                                getEffectiveEnabledStateFromSearchResults(
+                                                        Objects.requireNonNull(
+                                                                listAppSearchResult
                                                                         .getResultValue())));
-                                                    } else {
-                                                        callback.onError(
-                                                                failedResultToException(
-                                                                        listAppSearchResult));
-                                                    }
-                                                }));
+                                    } else {
+                                        callback.onError(
+                                                failedResultToException(listAppSearchResult));
+                                    }
+                                });
+                        results.close();
                     } catch (Exception e) {
-                        callbackExecutor.execute(() -> callback.onError(e));
+                        callback.onError(e);
                     }
                 });
     }
@@ -124,58 +123,63 @@
     /**
      * Searches joined app function static and runtime metadata using the function Id and the
      * package.
-     *
-     * @hide
      */
     private static @NonNull SearchResults searchJoinedStaticWithRuntimeAppFunctions(
             @NonNull GlobalSearchSession session,
             @NonNull String targetPackage,
             @NonNull String functionIdentifier) {
         SearchSpec runtimeSearchSpec =
-                getAppFunctionRuntimeMetadataSearchSpecByFunctionId(targetPackage);
+                getAppFunctionRuntimeMetadataSearchSpecByPackageName(targetPackage);
         JoinSpec joinSpec =
                 new JoinSpec.Builder(PROPERTY_APP_FUNCTION_STATIC_METADATA_QUALIFIED_ID)
-                        .setNestedSearch(functionIdentifier, runtimeSearchSpec)
+                        .setNestedSearch(
+                                buildFilerRuntimeMetadataByFunctionIdQuery(functionIdentifier),
+                                runtimeSearchSpec)
                         .build();
         SearchSpec joinedStaticWithRuntimeSearchSpec =
                 new SearchSpec.Builder()
-                        .setJoinSpec(joinSpec)
                         .addFilterPackageNames(APP_FUNCTION_INDEXER_PACKAGE)
                         .addFilterSchemas(
                                 AppFunctionStaticMetadataHelper.getStaticSchemaNameForPackage(
                                         targetPackage))
-                        .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
+                        .setJoinSpec(joinSpec)
+                        .setVerbatimSearchEnabled(true)
                         .build();
-        return session.search(functionIdentifier, joinedStaticWithRuntimeSearchSpec);
+        return session.search(
+                buildFilerStaticMetadataByFunctionIdQuery(functionIdentifier),
+                joinedStaticWithRuntimeSearchSpec);
     }
 
     /**
-     * Finds whether the function is enabled or not from the search results returned by {@link
-     * #searchJoinedStaticWithRuntimeAppFunctions}.
+     * Returns whether the function is effectively enabled or not from the search results returned
+     * by {@link #searchJoinedStaticWithRuntimeAppFunctions}.
      *
+     * @param joinedStaticRuntimeResults search results joining AppFunctionStaticMetadata
+     *                                   and AppFunctionRuntimeMetadata.
      * @throws IllegalArgumentException if the function is not found in the results
-     * @hide
      */
-    private static boolean getEnabledStateFromSearchResults(
+    private static boolean getEffectiveEnabledStateFromSearchResults(
             @NonNull List<SearchResult> joinedStaticRuntimeResults) {
         if (joinedStaticRuntimeResults.isEmpty()) {
-            // Function not found.
             throw new IllegalArgumentException("App function not found.");
         } else {
             List<SearchResult> runtimeMetadataResults =
                     joinedStaticRuntimeResults.getFirst().getJoinedResults();
-            if (!runtimeMetadataResults.isEmpty()) {
-                Boolean result =
-                        (Boolean)
-                                runtimeMetadataResults
-                                        .getFirst()
-                                        .getGenericDocument()
-                                        .getProperty(PROPERTY_ENABLED);
-                if (result != null) {
-                    return result;
-                }
+            if (runtimeMetadataResults.isEmpty()) {
+                throw new IllegalArgumentException("App function not found.");
             }
-            // Runtime metadata not found. Using the default value in the static metadata.
+            long enabled =
+                    runtimeMetadataResults
+                            .getFirst()
+                            .getGenericDocument()
+                            .getPropertyLong(PROPERTY_ENABLED);
+            // If enabled is not equal to APP_FUNCTION_STATE_DEFAULT, it means it IS overridden and
+            // we should return the overridden value.
+            if (enabled != APP_FUNCTION_STATE_DEFAULT) {
+                return enabled == APP_FUNCTION_STATE_ENABLED;
+            }
+            // Runtime metadata not found or enabled is equal to APP_FUNCTION_STATE_DEFAULT.
+            // Using the default value in the static metadata.
             return joinedStaticRuntimeResults
                     .getFirst()
                     .getGenericDocument()
@@ -186,36 +190,39 @@
     /**
      * Returns search spec that queries app function metadata for a specific package name by its
      * function identifier.
-     *
-     * @hide
      */
-    public static @NonNull SearchSpec getAppFunctionRuntimeMetadataSearchSpecByFunctionId(
+    private static @NonNull SearchSpec getAppFunctionRuntimeMetadataSearchSpecByPackageName(
             @NonNull String targetPackage) {
         return new SearchSpec.Builder()
                 .addFilterPackageNames(APP_FUNCTION_INDEXER_PACKAGE)
                 .addFilterSchemas(
                         AppFunctionRuntimeMetadata.getRuntimeSchemaNameForPackage(targetPackage))
-                .addFilterProperties(
-                        AppFunctionRuntimeMetadata.getRuntimeSchemaNameForPackage(targetPackage),
-                        List.of(AppFunctionRuntimeMetadata.PROPERTY_FUNCTION_ID))
-                .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
+                .setVerbatimSearchEnabled(true)
                 .build();
     }
 
-    /**
-     * Converts a failed app search result codes into an exception.
-     *
-     * @hide
-     */
-    public static @NonNull Exception failedResultToException(
+    private static String buildFilerRuntimeMetadataByFunctionIdQuery(String functionIdentifier) {
+        return TextUtils.formatSimple("%s:\"%s\"",
+                AppFunctionRuntimeMetadata.PROPERTY_FUNCTION_ID,
+                functionIdentifier);
+    }
+
+    private static String buildFilerStaticMetadataByFunctionIdQuery(String functionIdentifier) {
+        return TextUtils.formatSimple("%s:\"%s\"",
+                AppFunctionStaticMetadataHelper.PROPERTY_FUNCTION_ID,
+                functionIdentifier);
+    }
+
+    /** Converts a failed app search result codes into an exception. */
+    private static @NonNull Exception failedResultToException(
             @NonNull AppSearchResult appSearchResult) {
         return switch (appSearchResult.getResultCode()) {
-            case AppSearchResult.RESULT_INVALID_ARGUMENT ->
-                    new IllegalArgumentException(appSearchResult.getErrorMessage());
-            case AppSearchResult.RESULT_IO_ERROR ->
-                    new IOException(appSearchResult.getErrorMessage());
-            case AppSearchResult.RESULT_SECURITY_ERROR ->
-                    new SecurityException(appSearchResult.getErrorMessage());
+            case AppSearchResult.RESULT_INVALID_ARGUMENT -> new IllegalArgumentException(
+                    appSearchResult.getErrorMessage());
+            case AppSearchResult.RESULT_IO_ERROR -> new IOException(
+                    appSearchResult.getErrorMessage());
+            case AppSearchResult.RESULT_SECURITY_ERROR -> new SecurityException(
+                    appSearchResult.getErrorMessage());
             default -> new IllegalStateException(appSearchResult.getErrorMessage());
         };
     }
diff --git a/core/java/android/app/appfunctions/AppFunctionRuntimeMetadata.java b/core/java/android/app/appfunctions/AppFunctionRuntimeMetadata.java
index 83b5aa0..08ecced 100644
--- a/core/java/android/app/appfunctions/AppFunctionRuntimeMetadata.java
+++ b/core/java/android/app/appfunctions/AppFunctionRuntimeMetadata.java
@@ -16,11 +16,15 @@
 
 package android.app.appfunctions;
 
+import static android.app.appfunctions.AppFunctionManager.APP_FUNCTION_STATE_DEFAULT;
+import static android.app.appfunctions.AppFunctionManager.APP_FUNCTION_STATE_DISABLED;
+import static android.app.appfunctions.AppFunctionManager.APP_FUNCTION_STATE_ENABLED;
 import static android.app.appfunctions.flags.Flags.FLAG_ENABLE_APP_FUNCTION_MANAGER;
 
 import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.app.appfunctions.AppFunctionManager.EnabledState;
 import android.app.appsearch.AppSearchSchema;
 import android.app.appsearch.GenericDocument;
 
@@ -162,15 +166,13 @@
      * Returns if the function is set to be enabled or not. If not set, the {@link
      * AppFunctionStaticMetadataHelper#STATIC_PROPERTY_ENABLED_BY_DEFAULT} value would be used.
      */
-    @Nullable
-    public Boolean getEnabled() {
-        // We can't use getPropertyBoolean here. getPropertyBoolean returns false instead of null
-        // if the value is missing.
-        boolean[] enabled = getPropertyBooleanArray(PROPERTY_ENABLED);
-        if (enabled == null || enabled.length == 0) {
-            return null;
-        }
-        return enabled[0];
+    @EnabledState
+    public int getEnabled() {
+        // getPropertyLong returns the first long associated with the given path or default value 0
+        // if there is no such value or the value is of a different type.
+        // APP_FUNCTION_STATE_DEFAULT also equals 0 which means the returned value will be 0 when an
+        // app as either never changed the enabled bit at runtime or has reset it to the default.
+        return (int) getPropertyLong(PROPERTY_ENABLED);
     }
 
     /** Returns the qualified id linking to the static metadata of the app function. */
@@ -204,19 +206,27 @@
                             packageName, functionId));
         }
 
+        public Builder(AppFunctionRuntimeMetadata original) {
+            this(original.getPackageName(), original.getFunctionId());
+            setEnabled(original.getEnabled());
+        }
+
         /**
          * Sets an indicator specifying if the function is enabled or not. This would override the
          * default enabled state in the static metadata ({@link
-         * AppFunctionStaticMetadataHelper#STATIC_PROPERTY_ENABLED_BY_DEFAULT}). Sets this to
-         * null to clear the override.
+         * AppFunctionStaticMetadataHelper#STATIC_PROPERTY_ENABLED_BY_DEFAULT}). Sets this to null
+         * to clear the override.
+         * TODO(369683073) Replace the tristate Boolean with IntDef EnabledState.
          */
         @NonNull
-        public Builder setEnabled(@Nullable Boolean enabled) {
-            if (enabled == null) {
-                setPropertyBoolean(PROPERTY_ENABLED);
-            } else {
-                setPropertyBoolean(PROPERTY_ENABLED, enabled);
+        public Builder setEnabled(@EnabledState int enabledState) {
+            if (enabledState != APP_FUNCTION_STATE_DEFAULT
+                    && enabledState != APP_FUNCTION_STATE_ENABLED
+                    && enabledState != APP_FUNCTION_STATE_DISABLED) {
+                throw new IllegalArgumentException(
+                        "Value of EnabledState is unsupported.");
             }
+            setPropertyLong(PROPERTY_ENABLED, enabledState);
             return this;
         }
 
diff --git a/core/java/android/app/appfunctions/AppFunctionService.java b/core/java/android/app/appfunctions/AppFunctionService.java
index 0d981ea..7a68a65 100644
--- a/core/java/android/app/appfunctions/AppFunctionService.java
+++ b/core/java/android/app/appfunctions/AppFunctionService.java
@@ -29,7 +29,13 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.Binder;
+import android.os.Bundle;
 import android.os.IBinder;
+import android.os.ICancellationSignal;
+import android.os.CancellationSignal;
+import android.os.RemoteCallback;
+import android.os.RemoteException;
+import android.util.Log;
 
 import java.util.function.Consumer;
 
@@ -74,6 +80,7 @@
          */
         void perform(
                 @NonNull ExecuteAppFunctionRequest request,
+                @NonNull CancellationSignal cancellationSignal,
                 @NonNull Consumer<ExecuteAppFunctionResponse> callback);
     }
 
@@ -85,6 +92,7 @@
             @Override
             public void executeAppFunction(
                     @NonNull ExecuteAppFunctionRequest request,
+                    @NonNull ICancellationCallback cancellationCallback,
                     @NonNull IExecuteAppFunctionCallback callback) {
                 if (context.checkCallingPermission(BIND_APP_FUNCTION_SERVICE)
                         == PERMISSION_DENIED) {
@@ -93,7 +101,10 @@
                 SafeOneTimeExecuteAppFunctionCallback safeCallback =
                         new SafeOneTimeExecuteAppFunctionCallback(callback);
                 try {
-                    onExecuteFunction.perform(request, safeCallback::onResult);
+                    onExecuteFunction.perform(
+                            request,
+                            buildCancellationSignal(cancellationCallback),
+                            safeCallback::onResult);
                 } catch (Exception ex) {
                     // Apps should handle exceptions. But if they don't, report the error on
                     // behalf of them.
@@ -105,6 +116,21 @@
         };
     }
 
+    private static CancellationSignal buildCancellationSignal(
+            @NonNull ICancellationCallback cancellationCallback) {
+        final ICancellationSignal cancellationSignalTransport =
+                CancellationSignal.createTransport();
+        CancellationSignal cancellationSignal =
+                CancellationSignal.fromTransport(cancellationSignalTransport);
+        try {
+            cancellationCallback.sendCancellationTransport(cancellationSignalTransport);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+
+        return cancellationSignal ;
+    }
+
     private final Binder mBinder = createBinder(
             AppFunctionService.this,
             AppFunctionService.this::onExecuteFunction);
@@ -115,6 +141,7 @@
         return mBinder;
     }
 
+
     /**
      * Called by the system to execute a specific app function.
      *
@@ -134,9 +161,49 @@
      *
      * @param request The function execution request.
      * @param callback A callback to report back the result.
+     *
+     * @deprecated Use {@link #onExecuteFunction(ExecuteAppFunctionRequest, CancellationSignal,
+     *     Consumer)} instead. This method will be removed once usage references are updated.
      */
     @MainThread
-    public abstract void onExecuteFunction(
+    @Deprecated
+    public void onExecuteFunction(
             @NonNull ExecuteAppFunctionRequest request,
-            @NonNull Consumer<ExecuteAppFunctionResponse> callback);
+            @NonNull Consumer<ExecuteAppFunctionResponse> callback) {
+        Log.w(
+                "AppFunctionService",
+                "Calling deprecated default implementation of onExecuteFunction");
+    }
+
+    /**
+     * Called by the system to execute a specific app function.
+     *
+     * <p>This method is triggered when the system requests your AppFunctionService to handle a
+     * particular function you have registered and made available.
+     *
+     * <p>To ensure proper routing of function requests, assign a unique identifier to each
+     * function. This identifier doesn't need to be globally unique, but it must be unique within
+     * your app. For example, a function to order food could be identified as "orderFood". In most
+     * cases this identifier should come from the ID automatically generated by the AppFunctions
+     * SDK. You can determine the specific function to invoke by calling {@link
+     * ExecuteAppFunctionRequest#getFunctionIdentifier()}.
+     *
+     * <p>This method is always triggered in the main thread. You should run heavy tasks on a worker
+     * thread and dispatch the result with the given callback. You should always report back the
+     * result using the callback, no matter if the execution was successful or not.
+     *
+     * <p>This method also accepts a {@link CancellationSignal} that the app should listen to cancel
+     * the execution of function if requested by the system.
+     *
+     * @param request The function execution request.
+     * @param cancellationSignal A signal to cancel the execution.
+     * @param callback A callback to report back the result.
+     */
+    @MainThread
+    public void onExecuteFunction(
+            @NonNull ExecuteAppFunctionRequest request,
+            @NonNull CancellationSignal cancellationSignal,
+            @NonNull Consumer<ExecuteAppFunctionResponse> callback) {
+        onExecuteFunction(request, callback);
+    }
 }
diff --git a/core/java/android/app/appfunctions/ExecuteAppFunctionResponse.java b/core/java/android/app/appfunctions/ExecuteAppFunctionResponse.java
index f6580e6..a879b1b 100644
--- a/core/java/android/app/appfunctions/ExecuteAppFunctionResponse.java
+++ b/core/java/android/app/appfunctions/ExecuteAppFunctionResponse.java
@@ -96,8 +96,14 @@
      */
     public static final int RESULT_INVALID_ARGUMENT = 4;
 
-    /** The operation was timed out. */
-    public static final int RESULT_TIMED_OUT = 5;
+    /** The caller tried to execute a disabled app function. */
+    public static final int RESULT_DISABLED = 5;
+
+    /**
+     * The operation was cancelled. Use this error code to report that a cancellation is done after
+     * receiving a cancellation signal.
+     */
+    public static final int RESULT_CANCELLED = 6;
 
     /** The result code of the app function execution. */
     @ResultCode private final int mResultCode;
@@ -273,7 +279,8 @@
                 RESULT_APP_UNKNOWN_ERROR,
                 RESULT_INTERNAL_ERROR,
                 RESULT_INVALID_ARGUMENT,
-                RESULT_TIMED_OUT,
+                RESULT_DISABLED,
+                RESULT_CANCELLED
             })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ResultCode {}
diff --git a/core/java/android/app/appfunctions/GenericDocumentWrapper.java b/core/java/android/app/appfunctions/GenericDocumentWrapper.java
index 84b1837..b29b64e 100644
--- a/core/java/android/app/appfunctions/GenericDocumentWrapper.java
+++ b/core/java/android/app/appfunctions/GenericDocumentWrapper.java
@@ -16,10 +16,13 @@
 
 package android.app.appfunctions;
 
+import android.annotation.Nullable;
 import android.app.appsearch.GenericDocument;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.util.MathUtils;
 
+import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 
 import java.util.Objects;
@@ -31,24 +34,33 @@
  * <p>{#link {@link Parcel#writeBlob(byte[])}} could take care of whether to pass data via binder
  * directly or Android shared memory if the data is large.
  *
+ * <p>This class performs lazy unparcelling. The `GenericDocument` is only unparcelled
+ * from the underlying `Parcel` when {@link #getValue()} is called. This optimization
+ * allows the system server to pass through the generic document, without unparcel and parcel it.
+ *
  * @hide
  * @see Parcel#writeBlob(byte[])
  */
 public final class GenericDocumentWrapper implements Parcelable {
+    @Nullable
+    @GuardedBy("mLock")
+    private GenericDocument mGenericDocument;
+    @GuardedBy("mLock")
+    @Nullable private Parcel mParcel;
+    private final Object mLock = new Object();
+
     public static final Creator<GenericDocumentWrapper> CREATOR =
             new Creator<>() {
                 @Override
                 public GenericDocumentWrapper createFromParcel(Parcel in) {
-                    byte[] dataBlob = Objects.requireNonNull(in.readBlob());
-                    Parcel unmarshallParcel = Parcel.obtain();
-                    try {
-                        unmarshallParcel.unmarshall(dataBlob, 0, dataBlob.length);
-                        unmarshallParcel.setDataPosition(0);
-                        return new GenericDocumentWrapper(
-                                GenericDocument.createFromParcel(unmarshallParcel));
-                    } finally {
-                        unmarshallParcel.recycle();
-                    }
+                    int length = in.readInt();
+                    int offset = in.dataPosition();
+                    in.setDataPosition(MathUtils.addOrThrow(offset, length));
+
+                    Parcel p = Parcel.obtain();
+                    p.appendFrom(in, offset, length);
+                    p.setDataPosition(0);
+                    return new GenericDocumentWrapper(p);
                 }
 
                 @Override
@@ -56,16 +68,42 @@
                     return new GenericDocumentWrapper[size];
                 }
             };
-    @NonNull private final GenericDocument mGenericDocument;
 
     public GenericDocumentWrapper(@NonNull GenericDocument genericDocument) {
         mGenericDocument = Objects.requireNonNull(genericDocument);
+        mParcel = null;
+    }
+
+    public GenericDocumentWrapper(@NonNull Parcel parcel) {
+        mGenericDocument = null;
+        mParcel = Objects.requireNonNull(parcel);
     }
 
     /** Returns the wrapped {@link android.app.appsearch.GenericDocument} */
     @NonNull
     public GenericDocument getValue() {
-        return mGenericDocument;
+        unparcel();
+        synchronized (mLock) {
+            return Objects.requireNonNull(mGenericDocument);
+        }
+    }
+
+    private void unparcel() {
+        synchronized (mLock) {
+            if (mGenericDocument != null) {
+                return;
+            }
+            byte[] dataBlob = Objects.requireNonNull(Objects.requireNonNull(mParcel).readBlob());
+            Parcel unmarshallParcel = Parcel.obtain();
+            try {
+                unmarshallParcel.unmarshall(dataBlob, 0, dataBlob.length);
+                unmarshallParcel.setDataPosition(0);
+                mGenericDocument = GenericDocument.createFromParcel(unmarshallParcel);
+                mParcel = null;
+            } finally {
+                unmarshallParcel.recycle();
+            }
+        }
     }
 
     @Override
@@ -75,13 +113,32 @@
 
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
-        Parcel parcel = Parcel.obtain();
-        try {
-            mGenericDocument.writeToParcel(parcel, flags);
-            byte[] bytes = parcel.marshall();
-            dest.writeBlob(bytes);
-        } finally {
-            parcel.recycle();
+        synchronized (mLock) {
+            if (mGenericDocument != null) {
+                int lengthPos = dest.dataPosition();
+                // write a placeholder for length
+                dest.writeInt(-1);
+                Parcel tempParcel = Parcel.obtain();
+                byte[] bytes;
+                try {
+                    mGenericDocument.writeToParcel(tempParcel, flags);
+                    bytes = tempParcel.marshall();
+                } finally {
+                    tempParcel.recycle();
+                }
+                int startPos = dest.dataPosition();
+                dest.writeBlob(bytes);
+                int endPos = dest.dataPosition();
+                dest.setDataPosition(lengthPos);
+                // Overwrite the length placeholder
+                dest.writeInt(endPos - startPos);
+                dest.setDataPosition(endPos);
+
+            } else {
+                Parcel originalParcel = Objects.requireNonNull(mParcel);
+                dest.writeInt(originalParcel.dataSize());
+                dest.appendFrom(originalParcel, 0, originalParcel.dataSize());
+            }
         }
     }
 }
diff --git a/core/java/android/app/appfunctions/IAppFunctionEnabledCallback.aidl b/core/java/android/app/appfunctions/IAppFunctionEnabledCallback.aidl
new file mode 100644
index 0000000..ced4155
--- /dev/null
+++ b/core/java/android/app/appfunctions/IAppFunctionEnabledCallback.aidl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2021 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 android.app.appfunctions;
+
+import android.os.ParcelableException;
+
+/**
+ * @hide
+ */
+oneway interface IAppFunctionEnabledCallback {
+    void onSuccess();
+    void onError(in ParcelableException exception);
+}
diff --git a/core/java/android/app/appfunctions/IAppFunctionManager.aidl b/core/java/android/app/appfunctions/IAppFunctionManager.aidl
index 28827bb..72335e4 100644
--- a/core/java/android/app/appfunctions/IAppFunctionManager.aidl
+++ b/core/java/android/app/appfunctions/IAppFunctionManager.aidl
@@ -17,8 +17,11 @@
 package android.app.appfunctions;
 
 import android.app.appfunctions.ExecuteAppFunctionAidlRequest;
+import android.app.appfunctions.IAppFunctionEnabledCallback;
 import android.app.appfunctions.IExecuteAppFunctionCallback;
+import android.os.ICancellationSignal;
 
+import android.os.UserHandle;
 /**
  * Defines the interface for apps to interact with the app function execution service
  * {@code AppFunctionManagerService} running in the system server process.
@@ -32,8 +35,19 @@
     * @param callback the callback to report the result.
     */
     @JavaPassthrough(annotation="@android.annotation.RequiresPermission(anyOf = {android.Manifest.permission.EXECUTE_APP_FUNCTIONS_TRUSTED,android.Manifest.permission.EXECUTE_APP_FUNCTIONS}, conditional = true)")
-    void executeAppFunction(
+    ICancellationSignal executeAppFunction(
         in ExecuteAppFunctionAidlRequest request,
         in IExecuteAppFunctionCallback callback
     );
-}
\ No newline at end of file
+
+    /**
+    * Sets an AppFunction's enabled state provided by {@link AppFunctionService} through the system.
+    */
+    void setAppFunctionEnabled(
+        in String callingPackage,
+        in String functionIdentifier,
+        in UserHandle userHandle,
+        int enabledState,
+        in IAppFunctionEnabledCallback callback
+    );
+}
diff --git a/core/java/android/app/appfunctions/IAppFunctionService.aidl b/core/java/android/app/appfunctions/IAppFunctionService.aidl
index cc5a20c..291f33c 100644
--- a/core/java/android/app/appfunctions/IAppFunctionService.aidl
+++ b/core/java/android/app/appfunctions/IAppFunctionService.aidl
@@ -16,7 +16,7 @@
 
 package android.app.appfunctions;
 
-import android.os.Bundle;
+import android.app.appfunctions.ICancellationCallback;
 import android.app.appfunctions.IExecuteAppFunctionCallback;
 import android.app.appfunctions.ExecuteAppFunctionRequest;
 
@@ -34,10 +34,12 @@
      * Called by the system to execute a specific app function.
      *
      * @param request  the function execution request.
+     * @param cancellationCallback a callback to send back the cancellation transport.
      * @param callback a callback to report back the result.
      */
     void executeAppFunction(
         in ExecuteAppFunctionRequest request,
+        in ICancellationCallback cancellationCallback,
         in IExecuteAppFunctionCallback callback
     );
 }
diff --git a/core/java/android/app/appfunctions/ICancellationCallback.aidl b/core/java/android/app/appfunctions/ICancellationCallback.aidl
new file mode 100644
index 0000000..03235ac
--- /dev/null
+++ b/core/java/android/app/appfunctions/ICancellationCallback.aidl
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2024 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 android.app.appfunctions;
+
+import android.os.ICancellationSignal;
+
+/** {@hide} */
+oneway interface ICancellationCallback {
+    void sendCancellationTransport(in ICancellationSignal cancellationTransport);
+}
\ No newline at end of file
diff --git a/core/java/android/app/appfunctions/OWNERS b/core/java/android/app/appfunctions/OWNERS
index c6827cc..6a69e15 100644
--- a/core/java/android/app/appfunctions/OWNERS
+++ b/core/java/android/app/appfunctions/OWNERS
@@ -4,3 +4,4 @@
 tonymak@google.com
 mingweiliao@google.com
 anothermark@google.com
+utkarshnigam@google.com
diff --git a/core/java/android/app/appfunctions/SafeOneTimeExecuteAppFunctionCallback.java b/core/java/android/app/appfunctions/SafeOneTimeExecuteAppFunctionCallback.java
index 86fc369..0018244 100644
--- a/core/java/android/app/appfunctions/SafeOneTimeExecuteAppFunctionCallback.java
+++ b/core/java/android/app/appfunctions/SafeOneTimeExecuteAppFunctionCallback.java
@@ -72,4 +72,12 @@
             mOnDispatchCallback.accept(result);
         }
     }
+
+    /**
+     * Disables this callback. Subsequent calls to {@link #onResult(ExecuteAppFunctionResponse)}
+     * will be ignored.
+     */
+    public void disable() {
+        mOnResultCalled.set(true);
+    }
 }
diff --git a/core/java/android/app/appfunctions/TEST_MAPPING b/core/java/android/app/appfunctions/TEST_MAPPING
index 91e82ec..27517c8 100644
--- a/core/java/android/app/appfunctions/TEST_MAPPING
+++ b/core/java/android/app/appfunctions/TEST_MAPPING
@@ -1,10 +1,7 @@
 {
-  "postsubmit": [
+  "imports": [
     {
-      "name": "FrameworksAppFunctionsTests"
-    },
-    {
-      "name": "CtsAppFunctionTestCases"
+      "path": "frameworks/base/services/appfunctions/TEST_MAPPING"
     }
   ]
 }
\ No newline at end of file
diff --git a/core/java/android/app/notification.aconfig b/core/java/android/app/notification.aconfig
index 108b5f4..b139017 100644
--- a/core/java/android/app/notification.aconfig
+++ b/core/java/android/app/notification.aconfig
@@ -31,6 +31,16 @@
 }
 
 flag {
+  name: "modes_ui_empty_shade"
+  namespace: "systemui"
+  description: "Shows mode that is currently blocking notifications in the empty shade; dependent on flags modes_api and modes_ui"
+  bug: "366003631"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
   name: "modes_ui_test"
   namespace: "systemui"
   description: "Guards new CTS tests for Modes; dependent on flags modes_api and modes_ui"
diff --git a/core/java/android/app/ui_mode_manager.aconfig b/core/java/android/app/ui_mode_manager.aconfig
index 9f44a4d..05b46e0 100644
--- a/core/java/android/app/ui_mode_manager.aconfig
+++ b/core/java/android/app/ui_mode_manager.aconfig
@@ -9,4 +9,15 @@
      metadata {
          purpose: PURPOSE_BUGFIX
      }
+}
+
+flag {
+     namespace: "systemui"
+     name: "enable_current_mode_type_binder_cache"
+     description: "Enables the use of binder caching for current running mode type."
+     bug: "362572732"
+     is_fixed_read_only: true
+     metadata {
+         purpose: PURPOSE_BUGFIX
+     }
 }
\ No newline at end of file
diff --git a/core/java/android/app/wallpaper.aconfig b/core/java/android/app/wallpaper.aconfig
index 4091622..c5bd56f 100644
--- a/core/java/android/app/wallpaper.aconfig
+++ b/core/java/android/app/wallpaper.aconfig
@@ -1,8 +1,16 @@
 package: "android.app"
 container: "system"
+
 flag {
   name: "remove_next_wallpaper_component"
   namespace: "systemui"
   description: "Remove deprecated field WallpaperData#nextWallpaperComponent. Only effective after rebooting."
   bug: "365991991"
 }
+
+flag {
+  name: "fix_wallpaper_changed"
+  namespace: "systemui"
+  description: "Fixes timing of wallpaper changed notification and adds extra information. Only effective after rebooting."
+  bug: "369814294"
+}
diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java
index abb562d..d8142fd 100644
--- a/core/java/android/appwidget/AppWidgetManager.java
+++ b/core/java/android/appwidget/AppWidgetManager.java
@@ -1042,10 +1042,11 @@
     }
 
     /**
-     * Get the available info about the AppWidget.
+     * Returns the {@link AppWidgetProviderInfo} for the specified AppWidget.
      *
-     * @return A appWidgetId.  If the appWidgetId has not been bound to a provider yet, or
-     * you don't have access to that appWidgetId, null is returned.
+     * @return Information regarding the provider of speficied widget, returns null if the
+     *         appWidgetId has not been bound to a provider yet, or you don't have access
+     *         to that widget.
      */
     public AppWidgetProviderInfo getAppWidgetInfo(int appWidgetId) {
         if (mService == null) {
@@ -1390,7 +1391,7 @@
      *
      * @param provider The {@link ComponentName} for the {@link
      *    android.content.BroadcastReceiver BroadcastReceiver} provider for your AppWidget.
-     * @param extras In not null, this is passed to the launcher app. For eg {@link
+     * @param extras IF not null, this is passed to the launcher app. e.g. {@link
      *    #EXTRA_APPWIDGET_PREVIEW} can be used for a custom preview.
      * @param successCallback If not null, this intent will be sent when the widget is created.
      *
diff --git a/core/java/android/companion/virtual/IVirtualDevice.aidl b/core/java/android/companion/virtual/IVirtualDevice.aidl
index 8916ce2..40debe8 100644
--- a/core/java/android/companion/virtual/IVirtualDevice.aidl
+++ b/core/java/android/companion/virtual/IVirtualDevice.aidl
@@ -31,6 +31,8 @@
 import android.content.IntentFilter;
 import android.graphics.Point;
 import android.graphics.PointF;
+import android.hardware.display.IVirtualDisplayCallback;
+import android.hardware.display.VirtualDisplayConfig;
 import android.hardware.input.VirtualDpadConfig;
 import android.hardware.input.VirtualKeyboardConfig;
 import android.hardware.input.VirtualKeyEvent;
@@ -84,11 +86,28 @@
     int getDevicePolicy(int policyType);
 
     /**
-    * Returns whether the device has a valid microphone.
-    */
+     * Returns whether the device has a valid microphone.
+     */
     boolean hasCustomAudioInputSupport();
 
     /**
+     * Returns whether this device is allowed to create mirror displays.
+     */
+    boolean canCreateMirrorDisplays();
+
+    /*
+     * Turns off all trusted non-mirror displays of the virtual device.
+     */
+    @EnforcePermission("CREATE_VIRTUAL_DEVICE")
+    void goToSleep();
+
+    /**
+     * Turns on all trusted non-mirror displays of the virtual device.
+     */
+    @EnforcePermission("CREATE_VIRTUAL_DEVICE")
+    void wakeUp();
+
+    /**
      * Closes the virtual device and frees all associated resources.
      */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
@@ -132,6 +151,13 @@
     void onAudioSessionEnded();
 
     /**
+     * Creates a virtual display and registers it with the display framework.
+     */
+    @EnforcePermission("CREATE_VIRTUAL_DEVICE")
+    int createVirtualDisplay(in VirtualDisplayConfig virtualDisplayConfig,
+            in IVirtualDisplayCallback callback);
+
+    /**
      * Creates a new dpad and registers it with the input framework with the given token.
      */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
@@ -184,6 +210,7 @@
      * Returns the ID of the device corresponding to the given token, as registered with the input
      * framework.
      */
+    @EnforcePermission("CREATE_VIRTUAL_DEVICE")
     int getInputDeviceId(IBinder token);
 
     /**
@@ -255,6 +282,7 @@
     /**
      * Launches a pending intent on the given display that is owned by this virtual device.
      */
+    @EnforcePermission("CREATE_VIRTUAL_DEVICE")
     void launchPendingIntent(int displayId, in PendingIntent pendingIntent,
             in ResultReceiver resultReceiver);
 
@@ -262,6 +290,7 @@
      * Returns the current cursor position of the mouse corresponding to the given token, in x and y
      * coordinates.
      */
+    @EnforcePermission("CREATE_VIRTUAL_DEVICE")
     PointF getCursorPosition(IBinder token);
 
     /** Sets whether to show or hide the cursor while this virtual device is active. */
diff --git a/core/java/android/companion/virtual/IVirtualDeviceManager.aidl b/core/java/android/companion/virtual/IVirtualDeviceManager.aidl
index 83e18ec..c98238c 100644
--- a/core/java/android/companion/virtual/IVirtualDeviceManager.aidl
+++ b/core/java/android/companion/virtual/IVirtualDeviceManager.aidl
@@ -23,8 +23,6 @@
 import android.companion.virtual.VirtualDevice;
 import android.companion.virtual.VirtualDeviceParams;
 import android.content.AttributionSource;
-import android.hardware.display.IVirtualDisplayCallback;
-import android.hardware.display.VirtualDisplayConfig;
 
 /**
  * Interface for communication between VirtualDeviceManager and VirtualDeviceManagerService.
@@ -96,18 +94,6 @@
     int getDevicePolicy(int deviceId, int policyType);
 
     /**
-     * Creates a virtual display owned by a particular virtual device.
-     *
-     * @param virtualDisplayConfig The configuration used in creating the display
-     * @param callback A callback that receives display lifecycle events
-     * @param virtualDevice The device that will own this display
-     * @param packageName The package name of the calling app
-     */
-    int createVirtualDisplay(in VirtualDisplayConfig virtualDisplayConfig,
-            in IVirtualDisplayCallback callback, in IVirtualDevice virtualDevice,
-            String packageName);
-
-    /**
      * Returns device-specific session id for playback, or AUDIO_SESSION_ID_GENERATE
      * if there's none.
      */
diff --git a/core/java/android/companion/virtual/VirtualDeviceInternal.java b/core/java/android/companion/virtual/VirtualDeviceInternal.java
index de20a68..6708cce 100644
--- a/core/java/android/companion/virtual/VirtualDeviceInternal.java
+++ b/core/java/android/companion/virtual/VirtualDeviceInternal.java
@@ -242,6 +242,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     @NonNull
     List<VirtualSensor> getVirtualSensorList() {
         try {
@@ -251,6 +252,25 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+    void goToSleep() {
+        try {
+            mVirtualDevice.goToSleep();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+    void wakeUp() {
+        try {
+            mVirtualDevice.wakeUp();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     void launchPendingIntent(
             int displayId,
             @NonNull PendingIntent pendingIntent,
@@ -272,6 +292,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     @Nullable
     VirtualDisplay createVirtualDisplay(
             @NonNull VirtualDisplayConfig config,
@@ -281,16 +302,15 @@
                 new DisplayManagerGlobal.VirtualDisplayCallback(callback, executor);
         final int displayId;
         try {
-            displayId = mService.createVirtualDisplay(config, callbackWrapper, mVirtualDevice,
-                    mContext.getPackageName());
+            displayId = mVirtualDevice.createVirtualDisplay(config, callbackWrapper);
         } catch (RemoteException ex) {
             throw ex.rethrowFromSystemServer();
         }
         DisplayManagerGlobal displayManager = DisplayManagerGlobal.getInstance();
-        return displayManager.createVirtualDisplayWrapper(config, callbackWrapper,
-                displayId);
+        return displayManager.createVirtualDisplayWrapper(config, callbackWrapper, displayId);
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     void close() {
         try {
             // This also takes care of unregistering all virtual sensors.
@@ -304,6 +324,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     void setDevicePolicy(@VirtualDeviceParams.DynamicPolicyType int policyType,
             @VirtualDeviceParams.DevicePolicy int devicePolicy) {
         switch (policyType) {
@@ -323,6 +344,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     void addActivityPolicyExemption(@NonNull ActivityPolicyExemption exemption) {
         try {
             mVirtualDevice.addActivityPolicyExemption(exemption);
@@ -331,6 +353,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     void removeActivityPolicyExemption(@NonNull ActivityPolicyExemption exemption) {
         try {
             mVirtualDevice.removeActivityPolicyExemption(exemption);
@@ -339,6 +362,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     void setDevicePolicyForDisplay(int displayId,
             @VirtualDeviceParams.DynamicDisplayPolicyType int policyType,
             @VirtualDeviceParams.DevicePolicy int devicePolicy) {
@@ -358,6 +382,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     @NonNull
     VirtualDpad createVirtualDpad(@NonNull VirtualDpadConfig config) {
         try {
@@ -370,6 +395,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     @NonNull
     VirtualKeyboard createVirtualKeyboard(@NonNull VirtualKeyboardConfig config) {
         try {
@@ -382,6 +408,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     @NonNull
     VirtualMouse createVirtualMouse(@NonNull VirtualMouseConfig config) {
         try {
@@ -394,6 +421,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     @NonNull
     VirtualTouchscreen createVirtualTouchscreen(
             @NonNull VirtualTouchscreenConfig config) {
@@ -433,6 +461,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     @NonNull
     VirtualNavigationTouchpad createVirtualNavigationTouchpad(
             @NonNull VirtualNavigationTouchpadConfig config) {
@@ -447,6 +476,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     @NonNull
     VirtualAudioDevice createVirtualAudioDevice(
             @NonNull VirtualDisplay display,
@@ -483,6 +513,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     void setShowPointerIcon(boolean showPointerIcon) {
         try {
             mVirtualDevice.setShowPointerIcon(showPointerIcon);
@@ -491,6 +522,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     void setDisplayImePolicy(int displayId, @WindowManager.DisplayImePolicy int policy) {
         try {
             mVirtualDevice.setDisplayImePolicy(displayId, policy);
@@ -532,6 +564,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     void registerIntentInterceptor(
             @NonNull IntentFilter interceptorFilter,
             @CallbackExecutor @NonNull Executor executor,
@@ -551,6 +584,7 @@
         }
     }
 
+    @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     void unregisterIntentInterceptor(
             @NonNull VirtualDeviceManager.IntentInterceptorCallback interceptorCallback) {
         Objects.requireNonNull(interceptorCallback);
diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java
index 473ab27..96700a9 100644
--- a/core/java/android/companion/virtual/VirtualDeviceManager.java
+++ b/core/java/android/companion/virtual/VirtualDeviceManager.java
@@ -614,12 +614,52 @@
          *
          * @return A list of all sensors for this device, or an empty list if no sensors exist.
          */
+        @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
         @NonNull
         public List<VirtualSensor> getVirtualSensorList() {
             return mVirtualDeviceInternal.getVirtualSensorList();
         }
 
         /**
+         * Forces all trusted non-mirror displays of the virtual device to turn off.
+         *
+         * <p>After this action, if all displays across all devices, including the default one, are
+         * off, then the physical device will be put to sleep. If the displays of this virtual
+         * device are already off, then nothing will happen.</p>
+         *
+         * <p>Overrides all the wake locks that are held. This is equivalent to pressing a "virtual
+         * power key" to turn off the screen.</p>
+         *
+         * @see #wakeUp()
+         * @see DisplayManager#VIRTUAL_DISPLAY_FLAG_TRUSTED
+         * @see DisplayManager#VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
+         */
+        @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_DEVICE_AWARE_DISPLAY_POWER)
+        @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+        public void goToSleep() {
+            mVirtualDeviceInternal.goToSleep();
+        }
+
+        /**
+         * Forces all trusted non-mirror displays of the virtual device to turn on.
+         *
+         * <p>If the displays of this virtual device are turned off, then they will be turned on.
+         * Additionally, if the device is asleep it will be awoken. If the displays of this virtual
+         * device are already on, then nothing will happen.</p>
+         *
+         * <p>This is equivalent to pressing a "virtual power key" to turn on the screen.</p>
+         *
+         * @see #goToSleep()
+         * @see DisplayManager#VIRTUAL_DISPLAY_FLAG_TRUSTED
+         * @see DisplayManager#VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
+         */
+        @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_DEVICE_AWARE_DISPLAY_POWER)
+        @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+        public void wakeUp() {
+            mVirtualDeviceInternal.wakeUp();
+        }
+
+        /**
          * Launches a given pending intent on the give display ID.
          *
          * @param displayId The display to launch the pending intent on. This display must be
@@ -637,6 +677,7 @@
          *   on the virtual display, or one of the {@code LAUNCH_FAILED} status explaining why it
          *   failed.
          */
+        @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
         public void launchPendingIntent(
                 int displayId,
                 @NonNull PendingIntent pendingIntent,
@@ -677,6 +718,7 @@
          * VirtualDisplay.Callback)}
          */
         @Deprecated
+        @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
         @Nullable
         public VirtualDisplay createVirtualDisplay(
                 @IntRange(from = 1) int width,
@@ -714,6 +756,7 @@
          *
          * @see DisplayManager#createVirtualDisplay
          */
+        @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
         @Nullable
         public VirtualDisplay createVirtualDisplay(
                 @NonNull VirtualDisplayConfig config,
diff --git a/core/java/android/companion/virtual/flags/flags.aconfig b/core/java/android/companion/virtual/flags/flags.aconfig
index e9fa3e1..9eb6d56 100644
--- a/core/java/android/companion/virtual/flags/flags.aconfig
+++ b/core/java/android/companion/virtual/flags/flags.aconfig
@@ -132,8 +132,16 @@
 }
 
 flag {
-  namespace: "virtual_devices"
-  name: "camera_timestamp_from_surface"
-  description: "Pass the surface timestamp to the capture result"
-  bug: "351341245"
+    namespace: "virtual_devices"
+    name: "camera_timestamp_from_surface"
+    description: "Pass the surface timestamp to the capture result"
+    bug: "351341245"
+}
+
+flag {
+    namespace: "virtual_devices"
+    name: "enable_limited_vdm_role"
+    description: "New VDM role without trusted displays or input"
+    bug: "370657575"
+    is_exported: true
 }
diff --git a/core/java/android/content/ClipData.java b/core/java/android/content/ClipData.java
index b421339..ff0bb25 100644
--- a/core/java/android/content/ClipData.java
+++ b/core/java/android/content/ClipData.java
@@ -1149,7 +1149,7 @@
         for (int i = 0; i < size; i++) {
             final Item item = mItems.get(i);
             if (item.mIntent != null) {
-                item.mIntent.prepareToLeaveProcess(leavingPackage);
+                item.mIntent.prepareToLeaveProcess(leavingPackage, false);
             }
             if (item.mUri != null && leavingPackage) {
                 if (StrictMode.vmFileUriExposureEnabled()) {
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 044178c..0bb0027 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1064,11 +1064,7 @@
         }
 
         if (sender != null) {
-            if (android.service.chooser.Flags.enableChooserResult()) {
-                intent.putExtra(EXTRA_CHOOSER_RESULT_INTENT_SENDER, sender);
-            } else {
-                intent.putExtra(EXTRA_CHOSEN_COMPONENT_INTENT_SENDER, sender);
-            }
+            intent.putExtra(EXTRA_CHOOSER_RESULT_INTENT_SENDER, sender);
         }
 
         // Migrate any clip data and flags from target.
@@ -6425,7 +6421,6 @@
      * activity. The IntentSender will have the extra {@link #EXTRA_CHOOSER_RESULT} describing
      * the result.
      */
-    @FlaggedApi(android.service.chooser.Flags.FLAG_ENABLE_CHOOSER_RESULT)
     public static final String EXTRA_CHOOSER_RESULT_INTENT_SENDER =
             "android.intent.extra.CHOOSER_RESULT_INTENT_SENDER";
 
@@ -6435,7 +6430,6 @@
      * An instance is supplied to the optional IntentSender provided to
      * {@link #createChooser(Intent, CharSequence, IntentSender)} when the session completes.
      */
-    @FlaggedApi(android.service.chooser.Flags.FLAG_ENABLE_CHOOSER_RESULT)
     public static final String EXTRA_CHOOSER_RESULT = "android.intent.extra.CHOOSER_RESULT";
 
     /**
@@ -12227,6 +12221,8 @@
 
     /**
      * Collects keys in the extra bundle whose value are intents.
+     * With these keys collected on the client side, the system server would only unparcel values
+     * of these keys and create IntentCreatorToken for them.
      * @hide
      */
     public void collectExtraIntentKeys() {
@@ -12589,22 +12585,29 @@
      */
     @android.ravenwood.annotation.RavenwoodThrow
     public void prepareToLeaveProcess(boolean leavingPackage) {
+        prepareToLeaveProcess(leavingPackage, true);
+    }
+
+    /**
+     * @hide
+     */
+    void prepareToLeaveProcess(boolean leavingPackage, boolean isTopLevel) {
         setAllowFds(false);
 
         if (mSelector != null) {
-            mSelector.prepareToLeaveProcess(leavingPackage);
+            mSelector.prepareToLeaveProcess(leavingPackage, false);
         }
         if (mClipData != null) {
             mClipData.prepareToLeaveProcess(leavingPackage, getFlags());
         }
         if (mOriginalIntent != null) {
-            mOriginalIntent.prepareToLeaveProcess(leavingPackage);
+            mOriginalIntent.prepareToLeaveProcess(leavingPackage, false);
         }
 
         if (mExtras != null && !mExtras.isParcelled()) {
             final Object intent = mExtras.get(Intent.EXTRA_INTENT);
             if (intent instanceof Intent) {
-                ((Intent) intent).prepareToLeaveProcess(leavingPackage);
+                ((Intent) intent).prepareToLeaveProcess(leavingPackage, false);
             }
         }
 
@@ -12678,6 +12681,10 @@
                 StrictMode.onUnsafeIntentLaunch(this);
             }
         }
+
+        if (isTopLevel) {
+            collectExtraIntentKeys();
+        }
     }
 
     /**
diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java
index ca6d86a..f406927 100644
--- a/core/java/android/content/IntentSender.java
+++ b/core/java/android/content/IntentSender.java
@@ -288,6 +288,9 @@
             @Nullable Executor executor, @Nullable OnFinished onFinished)
             throws SendIntentException {
         try {
+            if (intent != null) {
+                intent.collectExtraIntentKeys();
+            }
             String resolvedType = intent != null ?
                     intent.resolveTypeIfNeeded(context.getContentResolver())
                     : null;
diff --git a/core/java/android/content/om/FabricatedOverlay.java b/core/java/android/content/om/FabricatedOverlay.java
index 40ffb0f..64e9c33 100644
--- a/core/java/android/content/om/FabricatedOverlay.java
+++ b/core/java/android/content/om/FabricatedOverlay.java
@@ -476,6 +476,20 @@
         return entry;
     }
 
+    @NonNull
+    private static FabricatedOverlayInternalEntry generateFabricatedOverlayInternalEntry(
+            @NonNull String resourceName, float dimensionValue,
+            @TypedValue.ComplexDimensionUnit int dimensionUnit, @Nullable String configuration) {
+        final FabricatedOverlayInternalEntry entry = new FabricatedOverlayInternalEntry();
+        entry.resourceName = resourceName;
+        entry.dataType = TypedValue.TYPE_DIMENSION;
+        Preconditions.checkArgumentInRange(dimensionUnit,
+                TypedValue.COMPLEX_UNIT_PX, TypedValue.COMPLEX_UNIT_MM, "dimensionUnit");
+        entry.data = TypedValue.createComplexDimension(dimensionValue, dimensionUnit);
+        entry.configuration = configuration;
+        return entry;
+    }
+
     /**
      * Sets the resource value in the fabricated overlay for the integer-like types with the
      * configuration.
@@ -586,4 +600,25 @@
         mOverlay.entries.add(
                 generateFabricatedOverlayInternalEntry(resourceName, value, configuration));
     }
+
+    /**
+     * Sets the resource value in the fabricated overlay for the dimension type with the
+     * configuration.
+     *
+     * @param resourceName name of the target resource to overlay (in the form
+     *     [package]:type/entry)
+     * @param dimensionValue the float representing the dimension value
+     * @param dimensionUnit the integer representing the dimension unit
+     * @param configuration The string representation of the config this overlay is enabled for
+     */
+    @FlaggedApi(android.content.res.Flags.FLAG_DIMENSION_FRRO)
+    public void setResourceValue(
+            @NonNull String resourceName,
+            float dimensionValue,
+            @TypedValue.ComplexDimensionUnit int dimensionUnit,
+            @Nullable String configuration) {
+        ensureValidResourceName(resourceName);
+        mOverlay.entries.add(generateFabricatedOverlayInternalEntry(resourceName, dimensionValue,
+                dimensionUnit, configuration));
+    }
 }
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index fb2655c..e985f88 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -5039,6 +5039,25 @@
             "android.content.pm.action.REQUEST_PERMISSIONS_FOR_OTHER";
 
     /**
+     * Used by the system to query a {@link android.content.pm.verify.pkg.VerifierService} provider,
+     * which registers itself via an intent-filter handling this action.
+     *
+     * <p class="note">Only the system can bind to such a verifier service. This is protected by the
+     * {@link android.Manifest.permission#BIND_VERIFICATION_AGENT} permission. The verifier service
+     * app should protect the service by adding this permission in the service declaration in its
+     * manifest.
+     * <p>
+     * A verifier service must be a privileged app and hold the
+     * {@link android.Manifest.permission#VERIFICATION_AGENT} permission.
+     *
+     * @hide
+     */
+    @SystemApi
+    @FlaggedApi(android.content.pm.Flags.FLAG_VERIFICATION_SERVICE)
+    @SdkConstant(SdkConstantType.SERVICE_ACTION)
+    public static final String ACTION_VERIFY_PACKAGE = "android.content.pm.action.VERIFY_PACKAGE";
+
+    /**
      * The names of the requested permissions.
      * <p>
      * <strong>Type:</strong> String[]
diff --git a/core/java/android/content/pm/TEST_MAPPING b/core/java/android/content/pm/TEST_MAPPING
index 2cdae21..44f2a4c 100644
--- a/core/java/android/content/pm/TEST_MAPPING
+++ b/core/java/android/content/pm/TEST_MAPPING
@@ -114,6 +114,17 @@
             ]
         },
         {
+            "name": "CtsPackageInstallerCUJDeviceAdminTestCases",
+            "options":[
+               {
+                   "exclude-annotation":"androidx.test.filters.FlakyTest"
+               },
+               {
+                   "exclude-annotation":"org.junit.Ignore"
+               }
+            ]
+        },
+        {
             "name": "CtsPackageInstallerCUJInstallationTestCases",
             "options":[
                {
@@ -125,6 +136,17 @@
             ]
         },
         {
+            "name": "CtsPackageInstallerCUJMultiUsersTestCases",
+            "options":[
+               {
+                   "exclude-annotation":"androidx.test.filters.FlakyTest"
+               },
+               {
+                   "exclude-annotation":"org.junit.Ignore"
+               }
+            ]
+        },
+        {
             "name": "CtsPackageInstallerCUJUninstallationTestCases",
             "options":[
                {
diff --git a/core/java/android/content/pm/flags.aconfig b/core/java/android/content/pm/flags.aconfig
index 60b409a..300740e 100644
--- a/core/java/android/content/pm/flags.aconfig
+++ b/core/java/android/content/pm/flags.aconfig
@@ -301,4 +301,19 @@
     description: "Feature flag to remove hack code of using PackageManager.MATCH_ANY_USER flag without cross user permission."
     bug: "332664521"
     is_fixed_read_only: true
-}
\ No newline at end of file
+}
+
+flag {
+    name: "delete_packages_silently_backport"
+    namespace: "package_manager_service"
+    description: "Feature flag to enable the holder of SYSTEM_APP_PROTECTION_SERVICE role to silently delete packages. To be deprecated by delete_packages_silently."
+    bug: "361776825"
+}
+
+flag {
+    name: "verification_service"
+    namespace: "package_manager_service"
+    description: "Feature flag to enable the new verification service."
+    bug: "360129103"
+    is_fixed_read_only: true
+}
diff --git a/core/java/android/content/pm/multiuser.aconfig b/core/java/android/content/pm/multiuser.aconfig
index fd1a896..fa26837 100644
--- a/core/java/android/content/pm/multiuser.aconfig
+++ b/core/java/android/content/pm/multiuser.aconfig
@@ -68,6 +68,13 @@
 }
 
 flag {
+    name: "multiuser_widget"
+    namespace: "multiuser"
+    description: "Implement the Multiuser Widget"
+    bug: "365748524"
+}
+
+flag {
     name: "enable_biometrics_to_unlock_private_space"
     is_exported: true
     namespace: "profile_experiences"
@@ -201,6 +208,36 @@
 }
 
 flag {
+    name: "cache_profile_ids"
+    namespace: "multiuser"
+    description: "Cache getProfileIds to avoid unnecessary binder calls"
+    bug: "350421409"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
+    name: "cache_profile_type"
+    namespace: "multiuser"
+    description: "Cache getProfileType to avoid unnecessary binder calls"
+    bug: "350417403"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
+    name: "cache_profiles"
+    namespace: "multiuser"
+    description: "Cache getProfiles to avoid unnecessary binder calls"
+    bug: "350419395"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
     name: "fix_disabling_of_mu_toggle_when_restriction_applied"
     namespace: "multiuser"
     description: "When no_user_switch is set but no EnforcedAdmin is present, the toggle has to be disabled"
@@ -449,7 +486,6 @@
   }
 }
 
-
 flag {
     name: "caching_development_improvements"
     namespace: "multiuser"
@@ -457,3 +493,13 @@
     bug: "364947162"
     is_fixed_read_only: true
 }
+
+flag {
+  name: "show_custom_unlock_title_inside_private_profile"
+  namespace: "profile_experiences"
+  description: "When private space is unlocked show dynamic title in unlock factor screens based on lock factor set for the profile"
+  bug: "323835257"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
diff --git a/core/java/android/content/pm/verify/pkg/IVerificationSessionCallback.aidl b/core/java/android/content/pm/verify/pkg/IVerificationSessionCallback.aidl
new file mode 100644
index 0000000..38a7956
--- /dev/null
+++ b/core/java/android/content/pm/verify/pkg/IVerificationSessionCallback.aidl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2024 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 android.content.pm.verify.pkg;
+
+import android.content.pm.verify.pkg.VerificationStatus;
+import android.os.PersistableBundle;
+
+/**
+ * Oneway interface that allows the verifier to send response or verification results back to
+ * the system.
+ * @hide
+ */
+oneway interface IVerificationSessionCallback {
+    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)")
+    void reportVerificationIncomplete(int verificationId, int reason);
+    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)")
+    void reportVerificationComplete(int verificationId, in VerificationStatus status);
+    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)")
+    void reportVerificationCompleteWithExtensionResponse(int verificationId, in VerificationStatus status, in PersistableBundle response);
+}
diff --git a/core/java/android/content/pm/verify/pkg/IVerificationSessionInterface.aidl b/core/java/android/content/pm/verify/pkg/IVerificationSessionInterface.aidl
new file mode 100644
index 0000000..7a9484a
--- /dev/null
+++ b/core/java/android/content/pm/verify/pkg/IVerificationSessionInterface.aidl
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2024 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 android.content.pm.verify.pkg;
+
+/**
+ * Non-oneway interface that allows the verifier to retrieve information from the system.
+ * @hide
+ */
+interface IVerificationSessionInterface {
+    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)")
+    long getTimeoutTime(int verificationId);
+    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)")
+    long extendTimeRemaining(int verificationId, long additionalMs);
+}
\ No newline at end of file
diff --git a/core/java/android/content/pm/verify/pkg/IVerifierService.aidl b/core/java/android/content/pm/verify/pkg/IVerifierService.aidl
new file mode 100644
index 0000000..d3071fd
--- /dev/null
+++ b/core/java/android/content/pm/verify/pkg/IVerifierService.aidl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2024 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 android.content.pm.verify.pkg;
+
+import android.content.pm.verify.pkg.VerificationSession;
+
+/**
+ * Oneway interface that allows the system to communicate to the verifier service agent.
+ * @hide
+ */
+oneway interface IVerifierService {
+    void onPackageNameAvailable(in String packageName);
+    void onVerificationCancelled(in String packageName);
+    void onVerificationRequired(in VerificationSession session);
+    void onVerificationRetry(in VerificationSession session);
+    void onVerificationTimeout(int verificationId);
+}
\ No newline at end of file
diff --git a/core/java/android/content/pm/verify/pkg/VerificationSession.aidl b/core/java/android/content/pm/verify/pkg/VerificationSession.aidl
new file mode 100644
index 0000000..ac85585
--- /dev/null
+++ b/core/java/android/content/pm/verify/pkg/VerificationSession.aidl
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2024 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 android.content.pm.verify.pkg;
+
+/** @hide */
+parcelable VerificationSession;
diff --git a/core/java/android/content/pm/verify/pkg/VerificationSession.java b/core/java/android/content/pm/verify/pkg/VerificationSession.java
new file mode 100644
index 0000000..70b4a02
--- /dev/null
+++ b/core/java/android/content/pm/verify/pkg/VerificationSession.java
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2024 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 android.content.pm.verify.pkg;
+
+import android.annotation.FlaggedApi;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
+import android.content.pm.Flags;
+import android.content.pm.SharedLibraryInfo;
+import android.content.pm.SigningInfo;
+import android.net.Uri;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.PersistableBundle;
+import android.os.RemoteException;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * This class is used by the system to describe the details about a verification request sent to the
+ * verification agent, aka the verifier. It includes the interfaces for the verifier to communicate
+ * back to the system.
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
+@SystemApi
+public final class VerificationSession implements Parcelable {
+    /**
+     * The verification cannot be completed because of unknown reasons.
+     */
+    public static final int VERIFICATION_INCOMPLETE_UNKNOWN = 0;
+    /**
+     * The verification cannot be completed because the network is unavailable.
+     */
+    public static final int VERIFICATION_INCOMPLETE_NETWORK_UNAVAILABLE = 1;
+    /**
+     * The verification cannot be completed because the network is limited.
+     */
+    public static final int VERIFICATION_INCOMPLETE_NETWORK_LIMITED = 2;
+
+    /**
+     * @hide
+     */
+    @IntDef(prefix = {"VERIFICATION_INCOMPLETE_"}, value = {
+            VERIFICATION_INCOMPLETE_NETWORK_UNAVAILABLE,
+            VERIFICATION_INCOMPLETE_NETWORK_LIMITED,
+            VERIFICATION_INCOMPLETE_UNKNOWN,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface VerificationIncompleteReason {
+    }
+
+    private final int mId;
+    private final int mInstallSessionId;
+    @NonNull
+    private final String mPackageName;
+    @NonNull
+    private final Uri mStagedPackageUri;
+    @NonNull
+    private final SigningInfo mSigningInfo;
+    @NonNull
+    private final List<SharedLibraryInfo> mDeclaredLibraries;
+    @NonNull
+    private final PersistableBundle mExtensionParams;
+    @NonNull
+    private final IVerificationSessionInterface mSession;
+    @NonNull
+    private final IVerificationSessionCallback mCallback;
+
+    /**
+     * Constructor used by the system to describe the details of a verification session.
+     * @hide
+     */
+    public VerificationSession(int id, int installSessionId, @NonNull String packageName,
+            @NonNull Uri stagedPackageUri, @NonNull SigningInfo signingInfo,
+            @NonNull List<SharedLibraryInfo> declaredLibraries,
+            @NonNull PersistableBundle extensionParams,
+            @NonNull IVerificationSessionInterface session,
+            @NonNull IVerificationSessionCallback callback) {
+        mId = id;
+        mInstallSessionId = installSessionId;
+        mPackageName = packageName;
+        mStagedPackageUri = stagedPackageUri;
+        mSigningInfo = signingInfo;
+        mDeclaredLibraries = declaredLibraries;
+        mExtensionParams = extensionParams;
+        mSession = session;
+        mCallback = callback;
+    }
+
+    /**
+     * A unique identifier tied to this specific verification session.
+     */
+    public int getId() {
+        return mId;
+    }
+
+    /**
+     * The package name of the app that is to be verified.
+     */
+    public @NonNull String getPackageName() {
+        return mPackageName;
+    }
+
+    /**
+     * The id of the installation session associated with the verification.
+     */
+    public int getInstallSessionId() {
+        return mInstallSessionId;
+    }
+
+    /**
+     * The Uri of the path where the package's code files are located.
+     */
+    public @NonNull Uri getStagedPackageUri() {
+        return mStagedPackageUri;
+    }
+
+    /**
+     * Signing info of the package to be verified.
+     */
+    public @NonNull SigningInfo getSigningInfo() {
+        return mSigningInfo;
+    }
+
+    /**
+     * Returns a mapping of any shared libraries declared in the manifest
+     * to the {@link SharedLibraryInfo#Type} that is declared. This will be an empty
+     * map if no shared libraries are declared by the package.
+     */
+    @NonNull
+    public List<SharedLibraryInfo> getDeclaredLibraries() {
+        return Collections.unmodifiableList(mDeclaredLibraries);
+    }
+
+    /**
+     * Returns any extension params associated with the verification request.
+     */
+    @NonNull
+    public PersistableBundle getExtensionParams() {
+        return mExtensionParams;
+    }
+
+    /**
+     * Get the value of Clock.elapsedRealtime() at which time this verification
+     * will timeout as incomplete if no other verification response is provided.
+     */
+    @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)
+    public long getTimeoutTime() {
+        try {
+            return mSession.getTimeoutTime(mId);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Extend the timeout for this session by the provided additionalMs to
+     * fetch relevant information over the network or wait for the network.
+     * This may be called multiple times. If the request would bypass any max
+     * duration by the system, the method will return a lower value than the
+     * requested amount that indicates how much the time was extended.
+     */
+    @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)
+    public long extendTimeRemaining(long additionalMs) {
+        try {
+            return mSession.extendTimeRemaining(mId, additionalMs);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Report to the system that verification could not be completed along
+     * with an approximate reason to pass on to the installer.
+     */
+    @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)
+    public void reportVerificationIncomplete(@VerificationIncompleteReason int reason) {
+        try {
+            mCallback.reportVerificationIncomplete(mId, reason);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Report to the system that the verification has completed and the
+     * install process may act on that status to either block in the case
+     * of failure or continue to process the install in the case of success.
+     */
+    @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)
+    public void reportVerificationComplete(@NonNull VerificationStatus status) {
+        try {
+            mCallback.reportVerificationComplete(mId, status);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Same as {@link #reportVerificationComplete(VerificationStatus)}, but also provide
+     * a result to the extension params provided in the request, which will be passed to the
+     * installer in the installation result.
+     */
+    @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)
+    public void reportVerificationComplete(@NonNull VerificationStatus status,
+            @NonNull PersistableBundle response) {
+        try {
+            mCallback.reportVerificationCompleteWithExtensionResponse(mId, status, response);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    private VerificationSession(@NonNull Parcel in) {
+        mId = in.readInt();
+        mInstallSessionId = in.readInt();
+        mPackageName = in.readString8();
+        mStagedPackageUri = Uri.CREATOR.createFromParcel(in);
+        mSigningInfo = SigningInfo.CREATOR.createFromParcel(in);
+        mDeclaredLibraries = in.createTypedArrayList(SharedLibraryInfo.CREATOR);
+        mExtensionParams = in.readPersistableBundle(getClass().getClassLoader());
+        mSession = IVerificationSessionInterface.Stub.asInterface(in.readStrongBinder());
+        mCallback = IVerificationSessionCallback.Stub.asInterface(in.readStrongBinder());
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        dest.writeInt(mId);
+        dest.writeInt(mInstallSessionId);
+        dest.writeString8(mPackageName);
+        Uri.writeToParcel(dest, mStagedPackageUri);
+        mSigningInfo.writeToParcel(dest, flags);
+        dest.writeTypedList(mDeclaredLibraries);
+        dest.writePersistableBundle(mExtensionParams);
+        dest.writeStrongBinder(mSession.asBinder());
+        dest.writeStrongBinder(mCallback.asBinder());
+    }
+
+    @NonNull
+    public static final Creator<VerificationSession> CREATOR = new Creator<>() {
+        @Override
+        public VerificationSession createFromParcel(@NonNull Parcel in) {
+            return new VerificationSession(in);
+        }
+
+        @Override
+        public VerificationSession[] newArray(int size) {
+            return new VerificationSession[size];
+        }
+    };
+}
diff --git a/core/java/android/content/pm/verify/pkg/VerificationStatus.aidl b/core/java/android/content/pm/verify/pkg/VerificationStatus.aidl
new file mode 100644
index 0000000..6a1cb4f
--- /dev/null
+++ b/core/java/android/content/pm/verify/pkg/VerificationStatus.aidl
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2024 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 android.content.pm.verify.pkg;
+
+/** @hide */
+parcelable VerificationStatus;
diff --git a/core/java/android/content/pm/verify/pkg/VerificationStatus.java b/core/java/android/content/pm/verify/pkg/VerificationStatus.java
new file mode 100644
index 0000000..4d0379d7
--- /dev/null
+++ b/core/java/android/content/pm/verify/pkg/VerificationStatus.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2024 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 android.content.pm.verify.pkg;
+
+import android.annotation.FlaggedApi;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.content.pm.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * This class is used by the verifier to describe the status of the verification request, whether
+ * it's successful or it has failed along with any relevant details.
+ * @hide
+ */
+@SystemApi
+@FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
+public final class  VerificationStatus implements Parcelable {
+    /**
+     * The ASL status has not been determined.  This happens in situations where the verification
+     * service is not monitoring ASLs, and means the ASL data in the app is not necessarily bad but
+     * can't be trusted.
+     */
+    public static final int VERIFIER_STATUS_ASL_UNDEFINED = 0;
+
+    /**
+     * The app's ASL data is considered to be in a good state.
+     */
+    public static final int VERIFIER_STATUS_ASL_GOOD = 1;
+
+    /**
+     * There is something bad in the app's ASL data; the user should be warned about this when shown
+     * the ASL data and/or appropriate decisions made about the use of this data by the platform.
+     */
+    public static final int VERIFIER_STATUS_ASL_BAD = 2;
+
+    /** @hide */
+    @IntDef(prefix = {"VERIFIER_STATUS_ASL_"}, value = {
+            VERIFIER_STATUS_ASL_UNDEFINED,
+            VERIFIER_STATUS_ASL_GOOD,
+            VERIFIER_STATUS_ASL_BAD,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface VerifierStatusAsl {}
+
+    private boolean mIsVerified;
+    private @VerifierStatusAsl int mAslStatus;
+    @NonNull
+    private String mFailuresMessage = "";
+
+    private VerificationStatus() {}
+
+    /**
+     * @return whether the status is set to verified or not.
+     */
+    public boolean isVerified() {
+        return mIsVerified;
+    }
+
+    /**
+     * @return the failure message associated with the failure status.
+     */
+    @NonNull
+    public String getFailureMessage() {
+        return mFailuresMessage;
+    }
+
+    /**
+     * @return the asl status.
+     */
+    public @VerifierStatusAsl int getAslStatus() {
+        return mAslStatus;
+    }
+
+    /**
+     * Builder to construct a {@link VerificationStatus} object.
+     */
+    public static final class Builder {
+        final VerificationStatus mStatus = new VerificationStatus();
+
+        /**
+         * Set in the status whether the verification has succeeded or failed.
+         */
+        @NonNull
+        public Builder setVerified(boolean verified) {
+            mStatus.mIsVerified = verified;
+            return this;
+        }
+
+        /**
+         * Set a developer-facing failure message to include in the verification failure status.
+         */
+        @NonNull
+        public Builder setFailureMessage(@NonNull String failureMessage) {
+            mStatus.mFailuresMessage = failureMessage;
+            return this;
+        }
+
+        /**
+         * Set the ASL status, as defined in {@link VerifierStatusAsl}.
+         */
+        @NonNull
+        public Builder setAslStatus(@VerifierStatusAsl int aslStatus) {
+            mStatus.mAslStatus = aslStatus;
+            return this;
+        }
+
+        /**
+         * Build the status object.
+         */
+        @NonNull
+        public VerificationStatus build() {
+            return mStatus;
+        }
+    }
+
+    private VerificationStatus(Parcel in) {
+        mIsVerified = in.readBoolean();
+        mAslStatus = in.readInt();
+        mFailuresMessage = in.readString8();
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        dest.writeBoolean(mIsVerified);
+        dest.writeInt(mAslStatus);
+        dest.writeString8(mFailuresMessage);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @NonNull
+    public static final Creator<VerificationStatus> CREATOR = new Creator<>() {
+        @Override
+        public VerificationStatus createFromParcel(@NonNull Parcel in) {
+            return new VerificationStatus(in);
+        }
+
+        @Override
+        public VerificationStatus[] newArray(int size) {
+            return new VerificationStatus[size];
+        }
+    };
+}
diff --git a/core/java/android/content/pm/verify/pkg/VerifierService.java b/core/java/android/content/pm/verify/pkg/VerifierService.java
new file mode 100644
index 0000000..ccf2119
--- /dev/null
+++ b/core/java/android/content/pm/verify/pkg/VerifierService.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2024 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 android.content.pm.verify.pkg;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.app.Service;
+import android.content.Intent;
+import android.content.pm.Flags;
+import android.content.pm.PackageManager;
+import android.os.IBinder;
+
+/**
+ * A base service implementation for the verifier agent to implement.
+ *
+ * @hide
+ */
+@SystemApi
+@FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
+public abstract class VerifierService extends Service {
+    /**
+     * Called when a package name is available for a pending verification,
+     * giving the verifier opportunity to pre-fetch any relevant information
+     * that may be needed should a verification for the package be required.
+     */
+    public abstract void onPackageNameAvailable(@NonNull String packageName);
+
+    /**
+     * Called when a package recently provided via {@link #onPackageNameAvailable}
+     * is no longer expected to be installed. This is a hint that any pre-fetch or
+     * cache created as a result of the previous call may be be cleared.
+     * <p>This method will never be called after {@link #onVerificationRequired} is called for the
+     * same package. Once a verification is officially requested by
+     * {@link #onVerificationRequired}, it cannot be cancelled.
+     * </p>
+     */
+    public abstract void onVerificationCancelled(@NonNull String packageName);
+
+    /**
+     * Called when an application needs to be verified. Details about the
+     * verification and actions that can be taken on it will be encapsulated in
+     * the provided {@link VerificationSession} parameter.
+     */
+    public abstract void onVerificationRequired(@NonNull VerificationSession session);
+
+    /**
+     * Called when a verification needs to be retried. This can be encountered
+     * when a prior verification was marked incomplete and the user has indicated
+     * that they've resolved the issue, or when a timeout is reached, but the
+     * the system is attempting to retry. Details about the
+     * verification and actions that can be taken on it will be encapsulated in
+     * the provided {@link VerificationSession} parameter.
+     */
+    public abstract void onVerificationRetry(@NonNull VerificationSession session);
+
+    /**
+     * Called in the case that an active verification has failed. Any APIs called
+     * on the {@link VerificationSession} instance associated with this {@code verificationId} will
+     * throw an {@link IllegalStateException}.
+     */
+    public abstract void onVerificationTimeout(int verificationId);
+
+    /**
+     * Called when the verifier service is bound to the system.
+     */
+    public @Nullable IBinder onBind(@Nullable Intent intent) {
+        if (intent == null || !PackageManager.ACTION_VERIFY_PACKAGE.equals(intent.getAction())) {
+            return null;
+        }
+        return new IVerifierService.Stub() {
+            @Override
+            public void onPackageNameAvailable(@NonNull String packageName) {
+                VerifierService.this.onPackageNameAvailable(packageName);
+            }
+
+            @Override
+            public void onVerificationCancelled(@NonNull String packageName) {
+                VerifierService.this.onVerificationCancelled(packageName);
+            }
+
+            @Override
+            public void onVerificationRequired(@NonNull VerificationSession session) {
+                VerifierService.this.onVerificationRequired(session);
+            }
+
+            @Override
+            public void onVerificationRetry(@NonNull VerificationSession session) {
+                VerifierService.this.onVerificationRetry(session);
+            }
+
+            @Override
+            public void onVerificationTimeout(int verificationId) {
+                VerifierService.this.onVerificationTimeout(verificationId);
+            }
+        };
+    }
+}
diff --git a/core/java/android/content/res/flags.aconfig b/core/java/android/content/res/flags.aconfig
index a5f8199..0af2f25 100644
--- a/core/java/android/content/res/flags.aconfig
+++ b/core/java/android/content/res/flags.aconfig
@@ -66,3 +66,11 @@
     # This flag is read at boot time.
     is_fixed_read_only: true
 }
+
+flag {
+    name: "dimension_frro"
+    is_exported: true
+    namespace: "resource_manager"
+    description: "Feature flag for passing a dimension to create an frro"
+    bug: "369672322"
+}
diff --git a/core/java/android/hardware/DisplayLuts.java b/core/java/android/hardware/DisplayLuts.java
new file mode 100644
index 0000000..b162ad6
--- /dev/null
+++ b/core/java/android/hardware/DisplayLuts.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2024 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 android.hardware;
+
+import android.annotation.NonNull;
+import android.util.IntArray;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @hide
+ */
+public final class DisplayLuts {
+    private IntArray mOffsets;
+    private int mTotalLength;
+
+    private List<float[]> mLutBuffers;
+    private IntArray mLutDimensions;
+    private IntArray mLutSizes;
+    private IntArray mLutSamplingKeys;
+    private static final int LUT_LENGTH_LIMIT = 100000;
+
+    public DisplayLuts() {
+        mOffsets = new IntArray();
+        mTotalLength = 0;
+
+        mLutBuffers = new ArrayList<>();
+        mLutDimensions = new IntArray();
+        mLutSizes = new IntArray();
+        mLutSamplingKeys = new IntArray();
+    }
+
+    /**
+     * Add the lut to be applied.
+     *
+     * @param buffer
+     * @param dimension either 1D or 3D
+     * @param size
+     * @param samplingKey
+     */
+    public void addLut(@NonNull float[] buffer, @LutProperties.Dimension int dimension,
+                       int size, @LutProperties.SamplingKey int samplingKey) {
+
+        int lutLength = 0;
+        if (dimension == LutProperties.ONE_DIMENSION) {
+            lutLength = size;
+        } else if (dimension == LutProperties.THREE_DIMENSION) {
+            lutLength = size * size * size;
+        } else {
+            clear();
+            throw new IllegalArgumentException("The dimension is either 1D or 3D!");
+        }
+
+        if (lutLength >= LUT_LENGTH_LIMIT) {
+            clear();
+            throw new IllegalArgumentException("The lut length is too big to handle!");
+        }
+
+        mOffsets.add(mTotalLength);
+        mTotalLength += lutLength;
+
+        mLutBuffers.add(buffer);
+        mLutDimensions.add(dimension);
+        mLutSizes.add(size);
+        mLutSamplingKeys.add(samplingKey);
+    }
+
+    private void clear() {
+        mTotalLength = 0;
+        mOffsets.clear();
+        mLutBuffers.clear();
+        mLutDimensions.clear();
+        mLutSamplingKeys.clear();
+    }
+
+    /**
+     * @return the array of Lut buffers
+     */
+    public float[] getLutBuffers() {
+        float[] buffer = new float[mTotalLength];
+
+        for (int i = 0; i < mLutBuffers.size(); i++) {
+            float[] lutBuffer = mLutBuffers.get(i);
+            System.arraycopy(lutBuffer, 0, buffer, mOffsets.get(i), lutBuffer.length);
+        }
+        return buffer;
+    }
+
+    /**
+     * @return the starting point of each lut memory region of the lut buffer
+     */
+    public int[] getOffsets() {
+        return mOffsets.toArray();
+    }
+
+    /**
+     * @return the array of Lut size
+     */
+    public int[] getLutSizes() {
+        return mLutSizes.toArray();
+    }
+
+    /**
+     * @return the array of Lut dimension
+     */
+    public int[] getLutDimensions() {
+        return mLutDimensions.toArray();
+    }
+
+    /**
+     * @return the array of sampling key
+     */
+    public int[] getLutSamplingKeys() {
+        return mLutSamplingKeys.toArray();
+    }
+}
diff --git a/core/java/android/hardware/LutProperties.java b/core/java/android/hardware/LutProperties.java
new file mode 100644
index 0000000..57f8a4e
--- /dev/null
+++ b/core/java/android/hardware/LutProperties.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2024 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 android.hardware;
+
+import android.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Lut properties class.
+ *
+ * A Lut (Look-Up Table) is a pre-calculated table for color transformation.
+ *
+ * @hide
+ */
+public final class LutProperties {
+    private final @Dimension int mDimension;
+    private final long mSize;
+    private final @SamplingKey int[] mSamplingKeys;
+
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(prefix = {"SAMPLING_KEY_"}, value = {
+        SAMPLING_KEY_RGB,
+        SAMPLING_KEY_MAX_RGB
+    })
+    public @interface SamplingKey {
+    }
+
+    /** use r,g,b channel as the gain value of a Lut */
+    public static final int SAMPLING_KEY_RGB = 0;
+
+    /** use max of r,g,b channel as the gain value of a Lut */
+    public static final int SAMPLING_KEY_MAX_RGB = 1;
+
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(value = {
+        ONE_DIMENSION,
+        THREE_DIMENSION
+    })
+    public @interface Dimension {
+    }
+
+    /** The Lut is one dimensional */
+    public static final int ONE_DIMENSION = 1;
+
+    /** The Lut is three dimensional */
+    public static final int THREE_DIMENSION = 3;
+
+    public @Dimension int getDimension() {
+        return mDimension;
+    }
+
+    /**
+     * @return the size of the Lut.
+     */
+    public long getSize() {
+        return mSize;
+    }
+
+    /**
+     * @return the list of sampling keys
+     */
+    public @SamplingKey int[] getSamplingKeys() {
+        if (mSamplingKeys.length == 0) {
+            throw new IllegalStateException("no sampling key!");
+        }
+        return mSamplingKeys;
+    }
+
+    /* use in the native code */
+    private LutProperties(@Dimension int dimension, long size, @SamplingKey int[] samplingKeys) {
+        if (dimension != ONE_DIMENSION || dimension != THREE_DIMENSION) {
+            throw new IllegalArgumentException("The dimension is either 1 or 3!");
+        }
+        mDimension = dimension;
+        mSize = size;
+        mSamplingKeys = samplingKeys;
+    }
+}
diff --git a/core/java/android/hardware/OWNERS b/core/java/android/hardware/OWNERS
index 43d3f54..f11625e 100644
--- a/core/java/android/hardware/OWNERS
+++ b/core/java/android/hardware/OWNERS
@@ -19,3 +19,6 @@
 
 # OverlayProperties
 per-file OverlayProperties* = file:/graphics/java/android/graphics/OWNERS
+
+# Lut related files
+per-file *Lut* = file:/graphics/java/android/graphics/OWNERS
\ No newline at end of file
diff --git a/core/java/android/hardware/OverlayProperties.java b/core/java/android/hardware/OverlayProperties.java
index 7b452a8..24cfc1b 100644
--- a/core/java/android/hardware/OverlayProperties.java
+++ b/core/java/android/hardware/OverlayProperties.java
@@ -50,6 +50,8 @@
     // Invoked on destruction
     private Runnable mCloser;
 
+    private LutProperties[] mLutProperties;
+
     private OverlayProperties(long nativeObject) {
         if (nativeObject != 0) {
             mCloser = sRegistry.registerNativeAllocation(this, nativeObject);
@@ -70,6 +72,20 @@
     }
 
     /**
+     * Gets the lut properties of the display.
+     * @hide
+     */
+    public LutProperties[] getLutProperties() {
+        if (mNativeObject == 0) {
+            return null;
+        }
+        if (mLutProperties == null) {
+            mLutProperties = nGetLutProperties(mNativeObject);
+        }
+        return mLutProperties;
+    }
+
+    /**
      * Indicates that hardware composition of a buffer encoded with the provided {@link DataSpace}
      * and {@link HardwareBuffer.Format} is supported on the device.
      *
@@ -140,4 +156,5 @@
             long nativeObject, int dataspace, int format);
     private static native void nWriteOverlayPropertiesToParcel(long nativeObject, Parcel dest);
     private static native long nReadOverlayPropertiesFromParcel(Parcel in);
-}
+    private static native LutProperties[] nGetLutProperties(long nativeObject);
+}
\ No newline at end of file
diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java
index b11961c..e3fdd26 100644
--- a/core/java/android/hardware/biometrics/BiometricPrompt.java
+++ b/core/java/android/hardware/biometrics/BiometricPrompt.java
@@ -139,6 +139,13 @@
     public static final int DISMISSED_REASON_CONTENT_VIEW_MORE_OPTIONS = 8;
 
     /**
+     * Dialog dismissal due to the system being unable to retrieve a WindowManager instance required
+     * to show the dialog.
+     * @hide
+     */
+    public static final int DISMISSED_REASON_ERROR_NO_WM = 9;
+
+    /**
      * @hide
      */
     @IntDef({DISMISSED_REASON_BIOMETRIC_CONFIRMED,
@@ -148,7 +155,8 @@
             DISMISSED_REASON_ERROR,
             DISMISSED_REASON_SERVER_REQUESTED,
             DISMISSED_REASON_CREDENTIAL_CONFIRMED,
-            DISMISSED_REASON_CONTENT_VIEW_MORE_OPTIONS})
+            DISMISSED_REASON_CONTENT_VIEW_MORE_OPTIONS,
+            DISMISSED_REASON_ERROR_NO_WM})
     @Retention(RetentionPolicy.SOURCE)
     public @interface DismissedReason {}
 
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 2162792..b785630 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -19,6 +19,7 @@
 import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT;
 import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_CAMERA;
 import static android.content.Context.DEVICE_ID_DEFAULT;
+import static android.content.Context.DEVICE_ID_INVALID;
 
 import android.annotation.CallbackExecutor;
 import android.annotation.FlaggedApi;
@@ -36,6 +37,7 @@
 import android.compat.annotation.ChangeId;
 import android.compat.annotation.EnabledSince;
 import android.compat.annotation.Overridable;
+import android.content.AttributionSource;
 import android.content.AttributionSourceState;
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -69,6 +71,7 @@
 import android.os.ServiceManager;
 import android.os.ServiceSpecificException;
 import android.os.SystemProperties;
+import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Log;
@@ -80,6 +83,7 @@
 import com.android.internal.util.ArrayUtils;
 
 import java.lang.ref.WeakReference;
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
@@ -181,7 +185,7 @@
      * @hide
      */
     @TestApi
-    @FlaggedApi(com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @FlaggedApi(com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public static final int ROTATION_OVERRIDE_NONE = ICameraService.ROTATION_OVERRIDE_NONE;
 
     /**
@@ -191,7 +195,7 @@
      * @hide
      */
     @TestApi
-    @FlaggedApi(com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @FlaggedApi(com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public static final int ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT =
             ICameraService.ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT;
 
@@ -201,7 +205,7 @@
      * @hide
      */
     @TestApi
-    @FlaggedApi(com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @FlaggedApi(com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public static final int ROTATION_OVERRIDE_ROTATION_ONLY =
             ICameraService.ROTATION_OVERRIDE_ROTATION_ONLY;
 
@@ -674,8 +678,8 @@
         }
         try {
             for (String physicalCameraId : physicalCameraIds) {
-                AttributionSourceState clientAttribution = getClientAttribution();
-                clientAttribution.deviceId = DEVICE_ID_DEFAULT;
+                AttributionSourceState clientAttribution = getClientAttribution(DEVICE_ID_DEFAULT,
+                        /* useContextAttributionSource= */ false);
                 CameraMetadataNative physicalCameraInfo =
                         cameraService.getCameraCharacteristics(
                                 physicalCameraId,
@@ -972,27 +976,58 @@
     }
 
     /**
-     * Constructs an AttributionSourceState with only the uid, pid, and deviceId fields set
+     * Retrieves the AttributionSourceState to pass to the CameraService.
      *
-     * <p>This method is a temporary stopgap in the transition to using AttributionSource. Currently
-     * AttributionSourceState is only used as a vehicle for passing deviceId, uid, and pid
-     * arguments.</p>
+     * @param deviceIdOverride An override of the AttributionSource's deviceId, if not equal to
+     *   DEVICE_ID_INVALID
+     * @param useContextAttributionSource Whether to return the full attribution source provided by
+     *   the Context.
+     *
+     * @hide
+     */
+    public AttributionSourceState getClientAttribution(int deviceIdOverride,
+            boolean useContextAttributionSource) {
+        AttributionSource contextAttributionSource = mContext.getAttributionSource();
+        if (deviceIdOverride != DEVICE_ID_INVALID) {
+            contextAttributionSource = contextAttributionSource.withDeviceId(deviceIdOverride);
+        }
+        AttributionSourceState contextAttributionSourceState =
+                contextAttributionSource.asState();
+
+        if (Flags.useContextAttributionSource() && useContextAttributionSource) {
+            return contextAttributionSourceState;
+        } else {
+            AttributionSourceState clientAttribution =
+                    new AttributionSourceState();
+            clientAttribution.uid = USE_CALLING_UID;
+            clientAttribution.pid = USE_CALLING_PID;
+            clientAttribution.deviceId = contextAttributionSourceState.deviceId;
+            clientAttribution.packageName = mContext.getOpPackageName();
+            clientAttribution.attributionTag = mContext.getAttributionTag();
+            clientAttribution.next = new AttributionSourceState[0];
+            return clientAttribution;
+        }
+    }
+
+    /**
+     * Retrieves the AttributionSourceState to pass to the CameraService.
+     *
+     * @param useContextAttributionSource Whether to return the full attribution source provided by
+     *   the Context.
+     *
+     * @hide
+     */
+    public AttributionSourceState getClientAttribution(boolean useContextAttributionSource) {
+        return getClientAttribution(DEVICE_ID_INVALID, useContextAttributionSource);
+    }
+
+    /**
+     * Retrieves the AttributionSourceState to pass to the CameraService.
      *
      * @hide
      */
     public AttributionSourceState getClientAttribution() {
-        // TODO: Send the full contextAttribution over aidl, remove USE_CALLING_*
-        AttributionSourceState contextAttribution =
-                mContext.getAttributionSource().asState();
-        AttributionSourceState clientAttribution =
-                new AttributionSourceState();
-        clientAttribution.uid = USE_CALLING_UID;
-        clientAttribution.pid = USE_CALLING_PID;
-        clientAttribution.deviceId = contextAttribution.deviceId;
-        clientAttribution.packageName = mContext.getOpPackageName();
-        clientAttribution.attributionTag = mContext.getAttributionTag();
-        clientAttribution.next = new AttributionSourceState[0];
-        return clientAttribution;
+        return getClientAttribution(DEVICE_ID_INVALID, /* useContextAttributionSource= */ false);
     }
 
     /**
@@ -1047,7 +1082,7 @@
                 }
 
                 AttributionSourceState clientAttribution =
-                        getClientAttribution();
+                        getClientAttribution(/* useContextAttributionSource= */ true);
                 cameraUser =
                         cameraService.connectDevice(
                                 callbacks,
@@ -1562,7 +1597,7 @@
      */
     public static int getRotationOverride(@Nullable Context context,
             @Nullable PackageManager packageManager, @Nullable String packageName) {
-        if (com.android.window.flags.Flags.cameraCompatForFreeform()) {
+        if (com.android.window.flags.Flags.enableCameraCompatForDesktopWindowing()) {
             return getRotationOverrideInternal(context, packageManager, packageName);
         } else {
             return shouldOverrideToPortrait(packageManager, packageName)
@@ -1574,7 +1609,7 @@
     /**
      * @hide
      */
-    @FlaggedApi(com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @FlaggedApi(com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     @TestApi
     public static int getRotationOverrideInternal(@Nullable Context context,
             @Nullable PackageManager packageManager, @Nullable String packageName) {
@@ -2157,6 +2192,12 @@
 
         private final Set<Set<DeviceCameraInfo>> mConcurrentCameraIdCombinations = new ArraySet<>();
 
+        // Diagnostic messages for ArrayIndexOutOfBoundsException in extractCameraIdListLocked
+        // b/367649718
+        private static final int DEVICE_STATUS_ARRAY_SIZE = 10;
+        private final ArrayDeque<String> mDeviceStatusHistory =
+                new ArrayDeque<>(DEVICE_STATUS_ARRAY_SIZE);
+
         // Registered availability callbacks and their executors
         private final ArrayMap<AvailabilityCallback, Executor> mCallbackMap = new ArrayMap<>();
 
@@ -2274,6 +2315,10 @@
             }
 
             try {
+                addDeviceStatusHistoryLocked(TextUtils.formatSimple(
+                        "connectCameraServiceLocked(E): tid(%d): mDeviceStatus size %d",
+                        Thread.currentThread().getId(), mDeviceStatus.size()));
+
                 CameraStatus[] cameraStatuses = cameraService.addListener(this);
                 for (CameraStatus cameraStatus : cameraStatuses) {
                     DeviceCameraInfo info = new DeviceCameraInfo(cameraStatus.cameraId,
@@ -2296,6 +2341,10 @@
                     }
                 }
                 mCameraService = cameraService;
+
+                addDeviceStatusHistoryLocked(TextUtils.formatSimple(
+                        "connectCameraServiceLocked(X): tid(%d): mDeviceStatus size %d",
+                        Thread.currentThread().getId(), mDeviceStatus.size()));
             } catch (ServiceSpecificException e) {
                 // Unexpected failure
                 throw new IllegalStateException("Failed to register a camera service listener", e);
@@ -2349,18 +2398,28 @@
         }
 
         private String[] extractCameraIdListLocked(int deviceId, int devicePolicy) {
-            List<String> cameraIds = new ArrayList<>();
-            for (int i = 0; i < mDeviceStatus.size(); i++) {
-                int status = mDeviceStatus.valueAt(i);
-                DeviceCameraInfo info = mDeviceStatus.keyAt(i);
-                if (status == ICameraServiceListener.STATUS_NOT_PRESENT
-                        || status == ICameraServiceListener.STATUS_ENUMERATING
-                        || shouldHideCamera(deviceId, devicePolicy, info)) {
-                    continue;
+            addDeviceStatusHistoryLocked(TextUtils.formatSimple(
+                    "extractCameraIdListLocked(E): tid(%d): mDeviceStatus size %d",
+                    Thread.currentThread().getId(), mDeviceStatus.size()));
+            try {
+                List<String> cameraIds = new ArrayList<>();
+                for (int i = 0; i < mDeviceStatus.size(); i++) {
+                    int status = mDeviceStatus.valueAt(i);
+                    DeviceCameraInfo info = mDeviceStatus.keyAt(i);
+                    if (status == ICameraServiceListener.STATUS_NOT_PRESENT
+                            || status == ICameraServiceListener.STATUS_ENUMERATING
+                            || shouldHideCamera(deviceId, devicePolicy, info)) {
+                        continue;
+                    }
+                    cameraIds.add(info.mCameraId);
                 }
-                cameraIds.add(info.mCameraId);
+                return cameraIds.toArray(new String[0]);
+            }  catch (ArrayIndexOutOfBoundsException e) {
+                String message = e.getMessage();
+                String messageWithHistory = message + ": {"
+                        + String.join(" -> ", mDeviceStatusHistory) + "}";
+                throw new ArrayIndexOutOfBoundsException(messageWithHistory);
             }
-            return cameraIds.toArray(new String[0]);
         }
 
         private Set<Set<String>> extractConcurrentCameraIdListLocked(int deviceId,
@@ -2488,6 +2547,10 @@
             synchronized (mLock) {
                 connectCameraServiceLocked();
                 try {
+                    addDeviceStatusHistoryLocked(TextUtils.formatSimple(
+                            "getCameraIdListNoLazy(E): tid(%d): mDeviceStatus size %d",
+                            Thread.currentThread().getId(), mDeviceStatus.size()));
+
                     // The purpose of the addListener, removeListener pair here is to get a fresh
                     // list of camera ids from cameraserver. We do this since for in test processes,
                     // changes can happen w.r.t non-changeable permissions (eg: SYSTEM_CAMERA
@@ -2521,6 +2584,9 @@
                         onStatusChangedLocked(ICameraServiceListener.STATUS_NOT_PRESENT, info);
                         mTorchStatus.remove(info);
                     }
+                    addDeviceStatusHistoryLocked(TextUtils.formatSimple(
+                            "getCameraIdListNoLazy(X): tid(%d): mDeviceStatus size %d",
+                            Thread.currentThread().getId(), mDeviceStatus.size()));
                 } catch (ServiceSpecificException e) {
                     // Unexpected failure
                     throw new IllegalStateException("Failed to register a camera service listener",
@@ -3209,7 +3275,13 @@
         public void onStatusChanged(int status, String cameraId, int deviceId)
                 throws RemoteException {
             synchronized(mLock) {
+                addDeviceStatusHistoryLocked(
+                        TextUtils.formatSimple("onStatusChanged(E): tid(%d): mDeviceStatus size %d",
+                                Thread.currentThread().getId(), mDeviceStatus.size()));
                 onStatusChangedLocked(status, new DeviceCameraInfo(cameraId, deviceId));
+                addDeviceStatusHistoryLocked(
+                        TextUtils.formatSimple("onStatusChanged(X): tid(%d): mDeviceStatus size %d",
+                                Thread.currentThread().getId(), mDeviceStatus.size()));
             }
         }
 
@@ -3352,6 +3424,10 @@
          */
         public void binderDied() {
             synchronized(mLock) {
+                addDeviceStatusHistoryLocked(
+                        TextUtils.formatSimple("binderDied(E): tid(%d): mDeviceStatus size %d",
+                                Thread.currentThread().getId(), mDeviceStatus.size()));
+
                 // Only do this once per service death
                 if (mCameraService == null) return;
 
@@ -3380,6 +3456,10 @@
                 mConcurrentCameraIdCombinations.clear();
 
                 scheduleCameraServiceReconnectionLocked();
+
+                addDeviceStatusHistoryLocked(
+                        TextUtils.formatSimple("binderDied(X): tid(%d): mDeviceStatus size %d",
+                                Thread.currentThread().getId(), mDeviceStatus.size()));
             }
         }
 
@@ -3409,5 +3489,13 @@
                 return Objects.hash(mCameraId, mDeviceId);
             }
         }
+
+        private void addDeviceStatusHistoryLocked(String log) {
+            if (mDeviceStatusHistory.size() == DEVICE_STATUS_ARRAY_SIZE) {
+                mDeviceStatusHistory.removeFirst();
+            }
+            mDeviceStatusHistory.addLast(log);
+        }
+
     } // CameraManagerGlobal
 } // CameraManager
diff --git a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
index b9eba9c..ce8661e 100644
--- a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
@@ -1028,6 +1028,9 @@
                     // Camera is already closed, so nothing left to do
                     if (DEBUG) Log.v(TAG, mIdString +
                             "Camera was already closed or busy, skipping unconfigure");
+                } catch (SecurityException e) {
+                    // UID state change revoked camera permission
+                    Log.e(TAG, mIdString + "Exception while unconfiguring outputs: ", e);
                 }
             }
         }
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index 7185719..6affd12 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -792,7 +792,6 @@
     public void setVirtualDisplaySurface(IVirtualDisplayCallback token, Surface surface) {
         try {
             mDm.setVirtualDisplaySurface(token, surface);
-            setVirtualDisplayState(token, surface != null);
         } catch (RemoteException ex) {
             throw ex.rethrowFromSystemServer();
         }
@@ -815,14 +814,6 @@
         }
     }
 
-    void setVirtualDisplayState(IVirtualDisplayCallback token, boolean isOn) {
-        try {
-            mDm.setVirtualDisplayState(token, isOn);
-        } catch (RemoteException ex) {
-            throw ex.rethrowFromSystemServer();
-        }
-    }
-
     void setVirtualDisplayRotation(IVirtualDisplayCallback token, @Surface.Rotation int rotation) {
         try {
             mDm.setVirtualDisplayRotation(token, rotation);
diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java
index a2d24f6..6c1aa90 100644
--- a/core/java/android/hardware/display/DisplayManagerInternal.java
+++ b/core/java/android/hardware/display/DisplayManagerInternal.java
@@ -92,9 +92,10 @@
             boolean waitForNegativeProximity);
 
     /**
-     * Returns {@code true} if the proximity sensor screen-off function is available.
+     * Returns {@code true} if the proximity sensor screen-off function is available for the given
+     * display.
      */
-    public abstract boolean isProximitySensorAvailable();
+    public abstract boolean isProximitySensorAvailable(int displayId);
 
     /**
      * Registers a display group listener which will be informed of the addition, removal, or change
@@ -431,6 +432,22 @@
      */
     public abstract IntArray getDisplayGroupIds();
 
+
+    /**
+     * Get all display ids belonging to the display group with given id.
+     */
+    public abstract int[] getDisplayIdsForGroup(int groupId);
+
+    /**
+     * Get the mapping of display group ids to the display ids that belong to them.
+     */
+    public abstract SparseArray<int[]> getDisplayIdsByGroupsIds();
+
+    /**
+     * Get all available display ids.
+     */
+    public abstract IntArray getDisplayIds();
+
     /**
      * Called upon presentation started/ended on the display.
      * @param displayId the id of the display where presentation started.
@@ -439,6 +456,11 @@
     public abstract void onPresentation(int displayId, boolean isShown);
 
     /**
+     * Called upon the usage of stylus.
+     */
+    public abstract void stylusGestureStarted(long eventTime);
+
+    /**
      * Describes the requested power state of the display.
      *
      * This object is intended to describe the general characteristics of the
diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl
index aa1539f6..b612bca 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -115,9 +115,6 @@
     void releaseVirtualDisplay(in IVirtualDisplayCallback token);
 
     // No permissions required but must be same Uid as the creator.
-    void setVirtualDisplayState(in IVirtualDisplayCallback token, boolean isOn);
-
-    // No permissions required but must be same Uid as the creator.
     void setVirtualDisplayRotation(in IVirtualDisplayCallback token, int rotation);
 
     // Get a stable metric for the device's display size. No permissions required.
diff --git a/core/java/android/hardware/display/VirtualDisplay.java b/core/java/android/hardware/display/VirtualDisplay.java
index 6cc938f..32b6405 100644
--- a/core/java/android/hardware/display/VirtualDisplay.java
+++ b/core/java/android/hardware/display/VirtualDisplay.java
@@ -112,18 +112,6 @@
     }
 
     /**
-     * Sets the on/off state for a virtual display.
-     *
-     * @param isOn Whether the display should be on or off.
-     * @hide
-     */
-    public void setDisplayState(boolean isOn) {
-        if (mToken != null) {
-            mGlobal.setVirtualDisplayState(mToken, isOn);
-        }
-    }
-
-    /**
      * Sets the rotation of the virtual display.
      *
      * @param rotation the new rotation of the display. May be one of {@link Surface#ROTATION_0},
diff --git a/core/java/android/hardware/input/KeyGestureEvent.java b/core/java/android/hardware/input/KeyGestureEvent.java
index bdbec55..5ee61bc 100644
--- a/core/java/android/hardware/input/KeyGestureEvent.java
+++ b/core/java/android/hardware/input/KeyGestureEvent.java
@@ -48,49 +48,57 @@
     public static final int KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL = 8;
     public static final int KEY_GESTURE_TYPE_TOGGLE_TASKBAR = 9;
     public static final int KEY_GESTURE_TYPE_TAKE_SCREENSHOT = 10;
-    public static final int KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER = 11;
-    public static final int KEY_GESTURE_TYPE_BRIGHTNESS_UP = 12;
-    public static final int KEY_GESTURE_TYPE_BRIGHTNESS_DOWN = 13;
-    public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP = 14;
-    public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN = 15;
-    public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE = 16;
-    public static final int KEY_GESTURE_TYPE_VOLUME_UP = 17;
-    public static final int KEY_GESTURE_TYPE_VOLUME_DOWN = 18;
-    public static final int KEY_GESTURE_TYPE_VOLUME_MUTE = 19;
-    public static final int KEY_GESTURE_TYPE_ALL_APPS = 20;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_SEARCH = 21;
-    public static final int KEY_GESTURE_TYPE_LANGUAGE_SWITCH = 22;
-    public static final int KEY_GESTURE_TYPE_ACCESSIBILITY_ALL_APPS = 23;
-    public static final int KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK = 24;
-    public static final int KEY_GESTURE_TYPE_SYSTEM_MUTE = 25;
-    public static final int KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT = 26;
-    public static final int KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT = 27;
-    public static final int KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT = 28;
-    public static final int KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT = 29;
-    public static final int KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT = 30;
-    public static final int KEY_GESTURE_TYPE_LOCK_SCREEN = 31;
-    public static final int KEY_GESTURE_TYPE_OPEN_NOTES = 32;
-    public static final int KEY_GESTURE_TYPE_TOGGLE_POWER = 33;
-    public static final int KEY_GESTURE_TYPE_SYSTEM_NAVIGATION = 34;
-    public static final int KEY_GESTURE_TYPE_SLEEP = 35;
-    public static final int KEY_GESTURE_TYPE_WAKEUP = 36;
-    public static final int KEY_GESTURE_TYPE_MEDIA_KEY = 37;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_BROWSER = 38;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_EMAIL = 39;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CONTACTS = 40;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALENDAR = 41;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALCULATOR = 42;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MUSIC = 43;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MAPS = 44;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MESSAGING = 45;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_GALLERY = 46;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FILES = 47;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_WEATHER = 48;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FITNESS = 49;
-    public static final int KEY_GESTURE_TYPE_LAUNCH_APPLICATION_BY_PACKAGE_NAME = 50;
-    public static final int KEY_GESTURE_TYPE_DESKTOP_MODE = 51;
-    public static final int KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION = 52;
-    public static final int KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER = 53;
+    public static final int KEY_GESTURE_TYPE_SCREENSHOT_CHORD = 11;
+    public static final int KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER = 12;
+    public static final int KEY_GESTURE_TYPE_BRIGHTNESS_UP = 13;
+    public static final int KEY_GESTURE_TYPE_BRIGHTNESS_DOWN = 14;
+    public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP = 15;
+    public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN = 16;
+    public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE = 17;
+    public static final int KEY_GESTURE_TYPE_VOLUME_UP = 18;
+    public static final int KEY_GESTURE_TYPE_VOLUME_DOWN = 19;
+    public static final int KEY_GESTURE_TYPE_VOLUME_MUTE = 20;
+    public static final int KEY_GESTURE_TYPE_ALL_APPS = 21;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_SEARCH = 22;
+    public static final int KEY_GESTURE_TYPE_LANGUAGE_SWITCH = 23;
+    public static final int KEY_GESTURE_TYPE_ACCESSIBILITY_ALL_APPS = 24;
+    public static final int KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK = 25;
+    public static final int KEY_GESTURE_TYPE_SYSTEM_MUTE = 26;
+    public static final int KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT = 27;
+    public static final int KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT = 28;
+    public static final int KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT = 29;
+    public static final int KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT = 30;
+    public static final int KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT = 31;
+    public static final int KEY_GESTURE_TYPE_LOCK_SCREEN = 32;
+    public static final int KEY_GESTURE_TYPE_OPEN_NOTES = 33;
+    public static final int KEY_GESTURE_TYPE_TOGGLE_POWER = 34;
+    public static final int KEY_GESTURE_TYPE_SYSTEM_NAVIGATION = 35;
+    public static final int KEY_GESTURE_TYPE_SLEEP = 36;
+    public static final int KEY_GESTURE_TYPE_WAKEUP = 37;
+    public static final int KEY_GESTURE_TYPE_MEDIA_KEY = 38;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_BROWSER = 39;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_EMAIL = 40;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CONTACTS = 41;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALENDAR = 42;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALCULATOR = 43;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MUSIC = 44;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MAPS = 45;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MESSAGING = 46;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_GALLERY = 47;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FILES = 48;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_WEATHER = 49;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FITNESS = 50;
+    public static final int KEY_GESTURE_TYPE_LAUNCH_APPLICATION_BY_PACKAGE_NAME = 51;
+    public static final int KEY_GESTURE_TYPE_DESKTOP_MODE = 52;
+    public static final int KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION = 53;
+    public static final int KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER = 54;
+    public static final int KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD = 55;
+    public static final int KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD = 56;
+    public static final int KEY_GESTURE_TYPE_GLOBAL_ACTIONS = 57;
+    public static final int KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD = 58;
+    public static final int KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT = 59;
+    public static final int KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT = 60;
+    public static final int KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS = 61;
 
     public static final int FLAG_CANCELLED = 1;
 
@@ -116,6 +124,7 @@
             KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL,
             KEY_GESTURE_TYPE_TOGGLE_TASKBAR,
             KEY_GESTURE_TYPE_TAKE_SCREENSHOT,
+            KEY_GESTURE_TYPE_SCREENSHOT_CHORD,
             KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER,
             KEY_GESTURE_TYPE_BRIGHTNESS_UP,
             KEY_GESTURE_TYPE_BRIGHTNESS_DOWN,
@@ -158,7 +167,15 @@
             KEY_GESTURE_TYPE_LAUNCH_APPLICATION_BY_PACKAGE_NAME,
             KEY_GESTURE_TYPE_DESKTOP_MODE,
             KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION,
-            KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER
+            KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER,
+            KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD,
+            KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD,
+            KEY_GESTURE_TYPE_GLOBAL_ACTIONS,
+            KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD,
+            KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT,
+            KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT,
+            KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS,
+
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface KeyGestureType {
@@ -360,6 +377,7 @@
             case KEY_GESTURE_TYPE_TOGGLE_TASKBAR:
                 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__TOGGLE_TASKBAR;
             case KEY_GESTURE_TYPE_TAKE_SCREENSHOT:
+            case KEY_GESTURE_TYPE_SCREENSHOT_CHORD:
                 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__TAKE_SCREENSHOT;
             case KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER:
                 return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__OPEN_SHORTCUT_HELPER;
@@ -472,6 +490,8 @@
                 return "KEY_GESTURE_TYPE_TOGGLE_TASKBAR";
             case KEY_GESTURE_TYPE_TAKE_SCREENSHOT:
                 return "KEY_GESTURE_TYPE_TAKE_SCREENSHOT";
+            case KEY_GESTURE_TYPE_SCREENSHOT_CHORD:
+                return "KEY_GESTURE_TYPE_SCREENSHOT_CHORD";
             case KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER:
                 return "KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER";
             case KEY_GESTURE_TYPE_BRIGHTNESS_UP:
@@ -558,6 +578,20 @@
                 return "KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION";
             case KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER:
                 return "KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER";
+            case KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD:
+                return "KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD";
+            case KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD:
+                return "KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD";
+            case KEY_GESTURE_TYPE_GLOBAL_ACTIONS:
+                return "KEY_GESTURE_TYPE_GLOBAL_ACTIONS";
+            case KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD:
+                return "KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD";
+            case KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT:
+                return "KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT";
+            case KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT:
+                return "KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT";
+            case KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS:
+                return "KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS";
             default:
                 return Integer.toHexString(value);
         }
diff --git a/core/java/android/hardware/input/input_framework.aconfig b/core/java/android/hardware/input/input_framework.aconfig
index 75683f6..99eeca9 100644
--- a/core/java/android/hardware/input/input_framework.aconfig
+++ b/core/java/android/hardware/input/input_framework.aconfig
@@ -106,9 +106,6 @@
     description: "Manage key gestures through Input APIs"
     is_exported: true
     bug: "358569822"
-    metadata {
-        purpose: PURPOSE_BUGFIX
-    }
 }
 
 flag {
diff --git a/core/java/android/hardware/soundtrigger/ConversionUtil.java b/core/java/android/hardware/soundtrigger/ConversionUtil.java
index 5c07fa4..22ae676 100644
--- a/core/java/android/hardware/soundtrigger/ConversionUtil.java
+++ b/core/java/android/hardware/soundtrigger/ConversionUtil.java
@@ -155,16 +155,16 @@
     public static RecognitionConfig api2aidlRecognitionConfig(
             SoundTrigger.RecognitionConfig apiConfig) {
         RecognitionConfig aidlConfig = new RecognitionConfig();
-        aidlConfig.captureRequested = apiConfig.captureRequested;
-        // apiConfig.allowMultipleTriggers is ignored by the lower layers.
+        aidlConfig.captureRequested = apiConfig.isCaptureRequested();
+        // apiConfig.isAllowMultipleTriggers() is ignored by the lower layers.
         aidlConfig.phraseRecognitionExtras =
-                new PhraseRecognitionExtra[apiConfig.keyphrases.length];
-        for (int i = 0; i < apiConfig.keyphrases.length; ++i) {
+                new PhraseRecognitionExtra[apiConfig.getKeyphrases().size()];
+        for (int i = 0; i < apiConfig.getKeyphrases().size(); ++i) {
             aidlConfig.phraseRecognitionExtras[i] = api2aidlPhraseRecognitionExtra(
-                    apiConfig.keyphrases[i]);
+                    apiConfig.getKeyphrases().get(i));
         }
-        aidlConfig.data = Arrays.copyOf(apiConfig.data, apiConfig.data.length);
-        aidlConfig.audioCapabilities = api2aidlAudioCapabilities(apiConfig.audioCapabilities);
+        aidlConfig.data = Arrays.copyOf(apiConfig.getData(), apiConfig.getData().length);
+        aidlConfig.audioCapabilities = api2aidlAudioCapabilities(apiConfig.getAudioCapabilities());
         return aidlConfig;
     }
 
diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java
index 9f3e3ad..05e91e4 100644
--- a/core/java/android/hardware/soundtrigger/SoundTrigger.java
+++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java
@@ -63,6 +63,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.List;
 import java.util.Locale;
 import java.util.Objects;
 import java.util.UUID;
@@ -1513,50 +1514,60 @@
      *  A RecognitionConfig is provided to
      *  {@link SoundTriggerModule#startRecognition(int, RecognitionConfig)} to configure the
      *  recognition request.
-     *
-     *  @hide
      */
-    @TestApi
+    @FlaggedApi(android.media.soundtrigger.Flags.FLAG_MANAGER_API)
     public static final class RecognitionConfig implements Parcelable {
-        /** True if the DSP should capture the trigger sound and make it available for further
-         * capture. */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public final boolean captureRequested;
-        /**
-         * True if the service should restart listening after the DSP triggers.
-         * Note: This config flag is currently used at the service layer rather than by the DSP.
-         */
-        public final boolean allowMultipleTriggers;
-        /** List of all keyphrases in the sound model for which recognition should be performed with
-         * options for each keyphrase. */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        @NonNull
-        @SuppressLint("ArrayReturn")
-        public final KeyphraseRecognitionExtra keyphrases[];
-        /** Opaque data for use by system applications who know about voice engine internals,
-         * typically during enrollment. */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        @NonNull
-        public final byte[] data;
-
-        /**
-         * Bit field encoding of the AudioCapabilities
-         * supported by the firmware.
-         */
+        private final boolean mCaptureRequested;
+        private final boolean mAllowMultipleTriggers;
+        private final KeyphraseRecognitionExtra mKeyphrases[];
+        private final byte[] mData;
         @ModuleProperties.AudioCapabilities
-        public final int audioCapabilities;
+        private final int mAudioCapabilities;
 
+        /**
+         * Constructor for {@link RecognitionConfig} with {@code audioCapabilities} describes a
+         * config that can be used by
+         * {@link SoundTriggerModule#startRecognition(int, RecognitionConfig)}
+         *
+         * @deprecated should use builder-based constructor instead.
+         *             TODO(b/368042125): remove this method.
+         * @param captureRequested Whether the DSP should capture the trigger sound.
+         * @param allowMultipleTriggers Whether the service should restart listening after the DSP
+         *                              triggers.
+         * @param keyphrases List of keyphrases in the sound model.
+         * @param data Opaque data for use by system applications who know about voice engine
+         *             internals, typically during enrollment.
+         * @param audioCapabilities Bit field encoding of the AudioCapabilities.
+         *
+         * @hide
+         */
+        @Deprecated
+        @SuppressWarnings("Todo")
+        @TestApi
         public RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers,
                 @SuppressLint("ArrayReturn") @Nullable KeyphraseRecognitionExtra[] keyphrases,
                 @Nullable byte[] data, int audioCapabilities) {
-            this.captureRequested = captureRequested;
-            this.allowMultipleTriggers = allowMultipleTriggers;
-            this.keyphrases = keyphrases != null ? keyphrases : new KeyphraseRecognitionExtra[0];
-            this.data = data != null ? data : new byte[0];
-            this.audioCapabilities = audioCapabilities;
+            this.mCaptureRequested = captureRequested;
+            this.mAllowMultipleTriggers = allowMultipleTriggers;
+            this.mKeyphrases = keyphrases != null ? keyphrases : new KeyphraseRecognitionExtra[0];
+            this.mData = data != null ? data : new byte[0];
+            this.mAudioCapabilities = audioCapabilities;
         }
 
+        /**
+         * Constructor for {@link RecognitionConfig} without audioCapabilities. The
+         * audioCapabilities is set to 0.
+         *
+         * @param captureRequested Whether the DSP should capture the trigger sound.
+         * @param allowMultipleTriggers Whether the service should restart listening after the DSP
+         *                              triggers.
+         * @param keyphrases List of keyphrases in the sound model.
+         * @param data Opaque data for use by system applications.
+         *
+         * @hide
+         */
         @UnsupportedAppUsage
+        @TestApi
         public RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers,
                 @SuppressLint("ArrayReturn") @Nullable KeyphraseRecognitionExtra[] keyphrases,
                 @Nullable byte[] data) {
@@ -1574,9 +1585,52 @@
             }
         };
 
+        /**
+         * Returns whether the DSP should capture the trigger sound and make it available for
+         * further capture.
+         */
+        public boolean isCaptureRequested() {
+            return mCaptureRequested;
+        }
+
+        /**
+         * Returns whether the service should restart listening after the DSP triggers.
+         *
+         * <p><b>Note:</b> This config flag is currently used at the service layer rather than by
+         * the DSP.
+         */
+        public boolean isAllowMultipleTriggers() {
+            return mAllowMultipleTriggers;
+        }
+
+        /**
+         * Gets all keyphrases in the sound model for which recognition should be performed with
+         * options for each keyphrase.
+         */
+        @NonNull
+        public List<KeyphraseRecognitionExtra> getKeyphrases() {
+            return Arrays.asList(mKeyphrases);
+        }
+
+        /**
+         * Opaque data.
+         *
+         * <p>For use by system applications who knows about voice engine internals, typically
+         * during enrollment.
+         */
+        @NonNull
+        public byte[] getData() {
+            return mData;
+        }
+
+        /** Bit field encoding of the AudioCapabilities supported by the firmware. */
+        public int getAudioCapabilities() {
+            return mAudioCapabilities;
+        }
+
         private static RecognitionConfig fromParcel(Parcel in) {
-            boolean captureRequested = in.readByte() == 1;
-            boolean allowMultipleTriggers = in.readByte() == 1;
+            boolean captureRequested = in.readBoolean();
+            boolean allowMultipleTriggers = in.readBoolean();
             KeyphraseRecognitionExtra[] keyphrases =
                     in.createTypedArray(KeyphraseRecognitionExtra.CREATOR);
             byte[] data = in.readBlob();
@@ -1587,11 +1641,11 @@
 
         @Override
         public void writeToParcel(@NonNull Parcel dest, int flags) {
-            dest.writeByte((byte) (captureRequested ? 1 : 0));
-            dest.writeByte((byte) (allowMultipleTriggers ? 1 : 0));
-            dest.writeTypedArray(keyphrases, flags);
-            dest.writeBlob(data);
-            dest.writeInt(audioCapabilities);
+            dest.writeBoolean(mCaptureRequested);
+            dest.writeBoolean(mAllowMultipleTriggers);
+            dest.writeTypedArray(mKeyphrases, flags);
+            dest.writeBlob(mData);
+            dest.writeInt(mAudioCapabilities);
         }
 
         @Override
@@ -1601,10 +1655,10 @@
 
         @Override
         public String toString() {
-            return "RecognitionConfig [captureRequested=" + captureRequested
-                    + ", allowMultipleTriggers=" + allowMultipleTriggers + ", keyphrases="
-                    + Arrays.toString(keyphrases) + ", data=" + Arrays.toString(data)
-                    + ", audioCapabilities=" + Integer.toHexString(audioCapabilities) + "]";
+            return "RecognitionConfig [captureRequested=" + mCaptureRequested
+                    + ", allowMultipleTriggers=" + mAllowMultipleTriggers + ", keyphrases="
+                    + Arrays.toString(mKeyphrases) + ", data=" + Arrays.toString(mData)
+                    + ", audioCapabilities=" + Integer.toHexString(mAudioCapabilities) + "]";
         }
 
         @Override
@@ -1616,19 +1670,19 @@
             if (!(obj instanceof RecognitionConfig))
                 return false;
             RecognitionConfig other = (RecognitionConfig) obj;
-            if (captureRequested != other.captureRequested) {
+            if (mCaptureRequested != other.mCaptureRequested) {
                 return false;
             }
-            if (allowMultipleTriggers != other.allowMultipleTriggers) {
+            if (mAllowMultipleTriggers != other.mAllowMultipleTriggers) {
                 return false;
             }
-            if (!Arrays.equals(keyphrases, other.keyphrases)) {
+            if (!Arrays.equals(mKeyphrases, other.mKeyphrases)) {
                 return false;
             }
-            if (!Arrays.equals(data, other.data)) {
+            if (!Arrays.equals(mData, other.mData)) {
                 return false;
             }
-            if (audioCapabilities != other.audioCapabilities) {
+            if (mAudioCapabilities != other.mAudioCapabilities) {
                 return false;
             }
             return true;
@@ -1638,13 +1692,96 @@
         public final int hashCode() {
             final int prime = 31;
             int result = 1;
-            result = prime * result + (captureRequested ? 1 : 0);
-            result = prime * result + (allowMultipleTriggers ? 1 : 0);
-            result = prime * result + Arrays.hashCode(keyphrases);
-            result = prime * result + Arrays.hashCode(data);
-            result = prime * result + audioCapabilities;
+            result = prime * result + (mCaptureRequested ? 1 : 0);
+            result = prime * result + (mAllowMultipleTriggers ? 1 : 0);
+            result = prime * result + Arrays.hashCode(mKeyphrases);
+            result = prime * result + Arrays.hashCode(mData);
+            result = prime * result + mAudioCapabilities;
             return result;
         }
+
+        /**
+         * Builder class for {@link RecognitionConfig} objects.
+         */
+        public static final class Builder {
+            private boolean mCaptureRequested;
+            private boolean mAllowMultipleTriggers;
+            @Nullable private KeyphraseRecognitionExtra[] mKeyphrases;
+            @Nullable private byte[] mData;
+            private int mAudioCapabilities;
+
+            /**
+             * Constructs a new Builder with the default values.
+             */
+            public Builder() {
+            }
+
+            /**
+             * Sets capture requested state.
+             * @param captureRequested The new requested state.
+             * @return the same Builder instance.
+             */
+            public @NonNull Builder setCaptureRequested(boolean captureRequested) {
+                mCaptureRequested = captureRequested;
+                return this;
+            }
+
+            /**
+             * Sets allow multiple triggers state.
+             * @param allowMultipleTriggers The new allow multiple triggers state.
+             * @return the same Builder instance.
+             */
+            public @NonNull Builder setAllowMultipleTriggers(boolean allowMultipleTriggers) {
+                mAllowMultipleTriggers = allowMultipleTriggers;
+                return this;
+            }
+
+            /**
+             * Sets the keyphrases field.
+             * @param keyphrases The new keyphrases.
+             * @return the same Builder instance.
+             */
+            public @NonNull Builder setKeyphrases(
+                    @NonNull Collection<KeyphraseRecognitionExtra> keyphrases) {
+                mKeyphrases = keyphrases.toArray(new KeyphraseRecognitionExtra[keyphrases.size()]);
+                return this;
+            }
+
+            /**
+             * Sets the data field.
+             * @param data The new data.
+             * @return the same Builder instance.
+             */
+            public @NonNull Builder setData(@Nullable byte[] data) {
+                mData = data;
+                return this;
+            }
+
+            /**
+             * Sets the audio capabilities field.
+             * @param audioCapabilities The new audio capabilities.
+             * @return the same Builder instance.
+             */
+            public @NonNull Builder setAudioCapabilities(int audioCapabilities) {
+                mAudioCapabilities = audioCapabilities;
+                return this;
+            }
+
+            /**
+             * Combines all of the parameters that have been set and return a new
+             * {@link RecognitionConfig} object.
+             * @return a new {@link RecognitionConfig} object
+             */
+            public @NonNull RecognitionConfig build() {
+                RecognitionConfig config = new RecognitionConfig(
+                        /* captureRequested= */ mCaptureRequested,
+                        /* allowMultipleTriggers= */ mAllowMultipleTriggers,
+                        /* keyphrases= */ mKeyphrases,
+                        /* data= */ mData,
+                        /* audioCapabilities= */ mAudioCapabilities);
+                return config;
+            }
+        };
     }
 
     /**
diff --git a/core/java/android/hardware/usb/flags/system_sw_usb_flags.aconfig b/core/java/android/hardware/usb/flags/system_sw_usb_flags.aconfig
index 51024ba..6a39365 100644
--- a/core/java/android/hardware/usb/flags/system_sw_usb_flags.aconfig
+++ b/core/java/android/hardware/usb/flags/system_sw_usb_flags.aconfig
@@ -43,3 +43,10 @@
     description: "Enable usb state update based on udc sysfs"
     bug: "339241080"
 }
+
+flag {
+    name: "enable_usb_data_signal_staking_internal"
+    namespace: "preload_safety"
+    description: "Enables signal API with staking for internal local service callers"
+    bug: "369382558"
+}
\ No newline at end of file
diff --git a/core/java/android/net/vcn/VcnTransportInfo.java b/core/java/android/net/vcn/VcnTransportInfo.java
index f546910..1fc91ee 100644
--- a/core/java/android/net/vcn/VcnTransportInfo.java
+++ b/core/java/android/net/vcn/VcnTransportInfo.java
@@ -17,9 +17,11 @@
 package android.net.vcn;
 
 import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS;
+import static android.net.vcn.VcnGatewayConnectionConfig.MIN_UDP_PORT_4500_NAT_TIMEOUT_SECONDS;
 import static android.net.vcn.VcnGatewayConnectionConfig.MIN_UDP_PORT_4500_NAT_TIMEOUT_UNSET;
 import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
 
+import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.net.NetworkCapabilities;
@@ -29,6 +31,8 @@
 import android.os.Parcelable;
 import android.telephony.SubscriptionManager;
 
+import com.android.internal.util.Preconditions;
+
 import java.util.Objects;
 
 /**
@@ -47,6 +51,7 @@
  *
  * @hide
  */
+// TODO: Do not store WifiInfo and subscription ID in VcnTransportInfo anymore
 public class VcnTransportInfo implements TransportInfo, Parcelable {
     @Nullable private final WifiInfo mWifiInfo;
     private final int mSubId;
@@ -195,4 +200,42 @@
                     return new VcnTransportInfo[size];
                 }
             };
+
+    /** This class can be used to construct a {@link VcnTransportInfo}. */
+    public static final class Builder {
+        private int mMinUdpPort4500NatTimeoutSeconds = MIN_UDP_PORT_4500_NAT_TIMEOUT_UNSET;
+
+        /** Construct Builder */
+        public Builder() {}
+
+        /**
+         * Sets the maximum supported IKEv2/IPsec NATT keepalive timeout.
+         *
+         * <p>This is used as a power-optimization hint for other IKEv2/IPsec use cases (e.g. VPNs,
+         * or IWLAN) to reduce the necessary keepalive frequency, thus conserving power and data.
+         *
+         * @param minUdpPort4500NatTimeoutSeconds the maximum keepalive timeout supported by the VCN
+         *     Gateway Connection, generally the minimum duration a NAT mapping is cached on the VCN
+         *     Gateway.
+         * @return this {@link Builder} instance, for chaining
+         */
+        @NonNull
+        public Builder setMinUdpPort4500NatTimeoutSeconds(
+                @IntRange(from = MIN_UDP_PORT_4500_NAT_TIMEOUT_SECONDS)
+                        int minUdpPort4500NatTimeoutSeconds) {
+            Preconditions.checkArgument(
+                    minUdpPort4500NatTimeoutSeconds >= MIN_UDP_PORT_4500_NAT_TIMEOUT_SECONDS,
+                    "Timeout must be at least 120s");
+
+            mMinUdpPort4500NatTimeoutSeconds = minUdpPort4500NatTimeoutSeconds;
+            return Builder.this;
+        }
+
+        /** Build a VcnTransportInfo instance */
+        @NonNull
+        public VcnTransportInfo build() {
+            return new VcnTransportInfo(
+                    null /* wifiInfo */, INVALID_SUBSCRIPTION_ID, mMinUdpPort4500NatTimeoutSeconds);
+        }
+    }
 }
diff --git a/core/java/android/net/vcn/VcnUtils.java b/core/java/android/net/vcn/VcnUtils.java
new file mode 100644
index 0000000..6dc5180
--- /dev/null
+++ b/core/java/android/net/vcn/VcnUtils.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2024 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 android.net.vcn;
+
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkSpecifier;
+import android.net.TelephonyNetworkSpecifier;
+import android.net.TransportInfo;
+import android.net.wifi.WifiInfo;
+
+import java.util.List;
+
+/**
+ * Utility class for VCN callers get information from VCN network
+ *
+ * @hide
+ */
+public class VcnUtils {
+    /** Get the WifiInfo of the VCN's underlying WiFi network */
+    @Nullable
+    public static WifiInfo getWifiInfoFromVcnCaps(
+            @NonNull ConnectivityManager connectivityMgr,
+            @NonNull NetworkCapabilities networkCapabilities) {
+        final NetworkCapabilities underlyingCaps =
+                getVcnUnderlyingCaps(connectivityMgr, networkCapabilities);
+
+        if (underlyingCaps == null) {
+            return null;
+        }
+
+        final TransportInfo underlyingTransportInfo = underlyingCaps.getTransportInfo();
+        if (!(underlyingTransportInfo instanceof WifiInfo)) {
+            return null;
+        }
+
+        return (WifiInfo) underlyingTransportInfo;
+    }
+
+    /** Get the subscription ID of the VCN's underlying Cell network */
+    public static int getSubIdFromVcnCaps(
+            @NonNull ConnectivityManager connectivityMgr,
+            @NonNull NetworkCapabilities networkCapabilities) {
+        final NetworkCapabilities underlyingCaps =
+                getVcnUnderlyingCaps(connectivityMgr, networkCapabilities);
+
+        if (underlyingCaps == null) {
+            return INVALID_SUBSCRIPTION_ID;
+        }
+
+        final NetworkSpecifier underlyingNetworkSpecifier = underlyingCaps.getNetworkSpecifier();
+        if (!(underlyingNetworkSpecifier instanceof TelephonyNetworkSpecifier)) {
+            return INVALID_SUBSCRIPTION_ID;
+        }
+
+        return ((TelephonyNetworkSpecifier) underlyingNetworkSpecifier).getSubscriptionId();
+    }
+
+    @Nullable
+    private static NetworkCapabilities getVcnUnderlyingCaps(
+            @NonNull ConnectivityManager connectivityMgr,
+            @NonNull NetworkCapabilities networkCapabilities) {
+        // Return null if it is not a VCN network
+        if (networkCapabilities.getTransportInfo() == null
+                || !(networkCapabilities.getTransportInfo() instanceof VcnTransportInfo)) {
+            return null;
+        }
+
+        // As of Android 16, VCN has one underlying network, and only one. If there are more
+        // than one networks due to future changes in the VCN mainline code, just take the first
+        // network
+        final List<Network> underlyingNws = networkCapabilities.getUnderlyingNetworks();
+        if (underlyingNws == null) {
+            return null;
+        }
+
+        return connectivityMgr.getNetworkCapabilities(underlyingNws.get(0));
+    }
+}
diff --git a/core/java/android/os/BatteryConsumer.java b/core/java/android/os/BatteryConsumer.java
index 492b825..b0ecca7 100644
--- a/core/java/android/os/BatteryConsumer.java
+++ b/core/java/android/os/BatteryConsumer.java
@@ -69,6 +69,7 @@
             POWER_COMPONENT_AMBIENT_DISPLAY,
             POWER_COMPONENT_IDLE,
             POWER_COMPONENT_REATTRIBUTED_TO_OTHER_CONSUMERS,
+            POWER_COMPONENT_BASE,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface PowerComponent {
@@ -101,8 +102,10 @@
     // The value should be negative or zero.
     public static final int POWER_COMPONENT_REATTRIBUTED_TO_OTHER_CONSUMERS =
             OsProtoEnums.POWER_COMPONENT_REATTRIBUTED_TO_OTHER_CONSUMERS; // 17
-
-    public static final int POWER_COMPONENT_COUNT = 18;
+    // Power component ID that is used for technical purposes of attribution of time-in-state
+    // for UIDs and other general computations not associated with specific hardware.
+    public static final int POWER_COMPONENT_BASE = 18;
+    public static final int POWER_COMPONENT_COUNT = 19;
 
     public static final int FIRST_CUSTOM_POWER_COMPONENT_ID = 1000;
     public static final int LAST_CUSTOM_POWER_COMPONENT_ID = 9999;
@@ -129,6 +132,7 @@
         sPowerComponentNames[POWER_COMPONENT_AMBIENT_DISPLAY] = "ambient_display";
         sPowerComponentNames[POWER_COMPONENT_IDLE] = "idle";
         sPowerComponentNames[POWER_COMPONENT_REATTRIBUTED_TO_OTHER_CONSUMERS] = "reattributed";
+        sPowerComponentNames[POWER_COMPONENT_BASE] = "";        // Top-level, no need for a name
     }
 
     /**
@@ -211,6 +215,7 @@
     private static final IntArray SUPPORTED_POWER_COMPONENTS_PER_PROCESS_STATE;
     static {
         int[] supportedPowerComponents = {
+                POWER_COMPONENT_BASE,
                 POWER_COMPONENT_CPU,
                 POWER_COMPONENT_MOBILE_RADIO,
                 POWER_COMPONENT_WIFI,
@@ -220,7 +225,9 @@
                 POWER_COMPONENT_FLASHLIGHT,
                 POWER_COMPONENT_CAMERA,
                 POWER_COMPONENT_GNSS,
-                POWER_COMPONENT_SENSORS};
+                POWER_COMPONENT_SENSORS,
+                POWER_COMPONENT_WAKELOCK,
+        };
         Arrays.sort(supportedPowerComponents);
         SUPPORTED_POWER_COMPONENTS_PER_PROCESS_STATE = IntArray.wrap(supportedPowerComponents);
     };
@@ -939,7 +946,7 @@
             ));
 
             // Declare Keys for all process states, if needed
-            if (includeProcessStateData) {
+            if (includeProcessStateData || componentId == POWER_COMPONENT_BASE) {
                 boolean isSupported = SUPPORTED_POWER_COMPONENTS_PER_PROCESS_STATE
                         .binarySearch(componentId) >= 0
                         || componentId >= FIRST_CUSTOM_POWER_COMPONENT_ID;
@@ -1126,6 +1133,13 @@
             return (T) this;
         }
 
+        @SuppressWarnings("unchecked")
+        @NonNull
+        public T addUsageDurationMillis(Key key, long componentUsageTimeMillis) {
+            mPowerComponentsBuilder.addUsageDurationMillis(key, componentUsageTimeMillis);
+            return (T) this;
+        }
+
         /**
          * Returns the total power accumulated by this builder so far. It may change
          * by the time the {@code build()} method is called.
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 996a288..c41e626 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -1950,7 +1950,8 @@
 
         // STATES bits that are used for Power Stats tracking
         public static final int IMPORTANT_FOR_POWER_STATS_STATES =
-                STATE_GPS_ON_FLAG | STATE_SENSOR_ON_FLAG | STATE_AUDIO_ON_FLAG;
+                STATE_GPS_ON_FLAG | STATE_SENSOR_ON_FLAG | STATE_AUDIO_ON_FLAG
+                        | STATE_WAKE_LOCK_FLAG;
 
         @UnsupportedAppUsage
         public int states;
@@ -3087,8 +3088,9 @@
 
     public static final String[] HISTORY_EVENT_CHECKIN_NAMES = new String[] {
             "Enl", "Epr", "Efg", "Etp", "Esy", "Ewl", "Ejb", "Eur", "Euf", "Ecn",
-            "Eac", "Epi", "Epu", "Eal", "Est", "Eai", "Eaa", "Etw",
-            "Esw", "Ewa", "Elw", "Eec", "Esc", "Eds"
+            "Eac", "Epi", "Epu", "Eal", "Est", "Eai", "Eaa",
+            "Etw", "Esw", "Ewa", "Elw", "Esc",
+            "Eds"
     };
 
     @FunctionalInterface
@@ -3625,6 +3627,21 @@
     public abstract int getLearnedBatteryCapacity();
 
     /**
+     * Returns best known estimate of the battery capacity in milli-amp-hours.
+     */
+    public int getBatteryCapacity() {
+        int batteryCapacityUah = getLearnedBatteryCapacity();
+        if (batteryCapacityUah > 0) {
+            return batteryCapacityUah / 1000;
+        }
+        batteryCapacityUah = getMinLearnedBatteryCapacity();
+        if (batteryCapacityUah > 0) {
+            return batteryCapacityUah / 1000;
+        }
+        return getEstimatedBatteryCapacity();
+    }
+
+    /**
      * Return the array of discharge step durations.
      */
     public abstract LevelStepTracker getDischargeLevelStepTracker();
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
index 97e9f34..ed75491 100644
--- a/core/java/android/os/Binder.java
+++ b/core/java/android/os/Binder.java
@@ -1111,6 +1111,21 @@
     }
 
     /**
+     * Called whenever the stub implementation throws an exception which isn't propagated to the
+     * remote caller by the binder. If this method isn't overridden, this exception is swallowed,
+     * and some default return values are propagated to the caller.
+     *
+     * <br> <b> This should not throw. </b> Doing so would defeat the purpose of this handler, and
+     * suppress the exception it is handling.
+     *
+     * @param code The transaction code being handled
+     * @param e The exception which was thrown.
+     * @hide
+     */
+    protected void onUnhandledException(int code, int flags, Exception e) {
+    }
+
+    /**
      * @param in The raw file descriptor that an input data stream can be read from.
      * @param out The raw file descriptor that normal command messages should be written to.
      * @param err The raw file descriptor that command error messages should be written to.
@@ -1408,10 +1423,15 @@
                 } else {
                     Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e);
                 }
+                onUnhandledException(code, flags, e);
             } else {
                 // Clear the parcel before writing the exception.
                 reply.setDataSize(0);
                 reply.setDataPosition(0);
+                // The writeException below won't do anything useful if this is the case.
+                if (Parcel.getExceptionCode(e) == 0) {
+                    onUnhandledException(code, flags, e);
+                }
                 reply.writeException(e);
             }
             res = true;
diff --git a/core/java/android/os/BinderProxy.java b/core/java/android/os/BinderProxy.java
index 80546cd..3b5a99e 100644
--- a/core/java/android/os/BinderProxy.java
+++ b/core/java/android/os/BinderProxy.java
@@ -493,6 +493,11 @@
     public native boolean pingBinder();
 
     /**
+     * Check to see if the process that the binder is in is still alive.
+     *
+     * Note, this only reflects the last known death state, if the object
+     * is linked to death or has made a transactions since the death occurs.
+     *
      * @return false if the hosting process is gone
      */
     public native boolean isBinderAlive();
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index a8267d1..479aa98 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -22,6 +22,7 @@
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
 import android.annotation.SuppressAutoDoc;
+import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
 import android.annotation.TestApi;
 import android.app.ActivityThread;
@@ -401,33 +402,42 @@
          * device. This value never changes while a device is booted, but it may
          * increase when the hardware manufacturer provides an OTA update.
          * <p>
-         * Together with {@link SDK_MINOR_INT}, this constant defines the
-         * <pre>major.minor</pre> version of Android. <pre>SDK_INT</pre> is
-         * increased and <pre>SDK_MINOR_INT</pre> is set to 0 on new Android
-         * dessert releases. Between these, Android may also release so called
-         * minor releases where <pre>SDK_INT</pre> remains unchanged and
-         * <pre>SDK_MINOR_INT</pre> is increased. Minor releases can add new
-         * APIs, and have stricter guarantees around backwards compatibility
-         * (e.g. no changes gated by <pre>targetSdkVersion</pre>) compared to
-         * major releases.
+         * This constant records the major version of Android. Use {@link
+         * SDK_INT_FULL} if you need to consider the minor version of Android
+         * as well.
          * <p>
          * Possible values are defined in {@link Build.VERSION_CODES}.
+         * @see #SDK_INT_FULL
          */
         public static final int SDK_INT = SystemProperties.getInt(
                 "ro.build.version.sdk", 0);
 
         /**
-         * The minor SDK version of the software currently running on this hardware
-         * device. This value never changes while a device is booted, but it may
-         * increase when the hardware manufacturer provides an OTA update.
+         * The major and minor SDK version of the software currently running on
+         * this hardware device. This value never changes while a device is
+         * booted, but it may increase when the hardware manufacturer provides
+         * an OTA update.
          * <p>
-         * Together with {@link SDK_INT}, this constant defines the
-         * <pre>major.minor</pre> version of Android. See {@link SDK_INT} for
-         * more information.
+         * <code>SDK_INT</code> is increased on new Android dessert releases,
+         * also called major releases. Between these, Android may also release
+         * minor releases where <code>SDK_INT</code> remains unchanged. Minor
+         * releases can add new APIs, and have stricter guarantees around
+         * backwards compatibility (e.g. no changes gated by
+         * <code>targetSdkVersion</code>) compared to major releases.
+         * <p>
+         * <code>SDK_INT_FULL</code> is increased on every release.
+         * <p>
+         * Possible values are defined in {@link
+         * android.os.Build.VERSION_CODES_FULL}.
          */
         @FlaggedApi(Flags.FLAG_MAJOR_MINOR_VERSIONING_SCHEME)
-        public static final int SDK_MINOR_INT = SystemProperties.getInt(
-                "ro.build.version.sdk_minor", 0);
+        public static final int SDK_INT_FULL;
+
+        static {
+            SDK_INT_FULL = VERSION_CODES_FULL.SDK_INT_MULTIPLIER
+                * SystemProperties.getInt("ro.build.version.sdk", 0)
+                + SystemProperties.getInt("ro.build.version.sdk_minor", 0);
+        }
 
         /**
          * The SDK version of the software that <em>initially</em> shipped on
@@ -1264,6 +1274,25 @@
     }
 
     /**
+     * Enumeration of the currently known SDK major and minor version codes.
+     * The numbers increase for every release, and are guaranteed to be ordered
+     * by the release date of each release. The actual values should be
+     * considered an implementation detail, and the current encoding scheme may
+     * change in the future.
+     *
+     * @see android.os.Build.VERSION#SDK_INT_FULL
+     */
+    @FlaggedApi(Flags.FLAG_MAJOR_MINOR_VERSIONING_SCHEME)
+    @SuppressLint("AcronymName")
+    public static class VERSION_CODES_FULL {
+        private VERSION_CODES_FULL() {}
+
+        // Use the last 5 digits for the minor version. This allows the
+        // minor version to be set to CUR_DEVELOPMENT.
+        private static final int SDK_INT_MULTIPLIER = 100000;
+    }
+
+    /**
      * The vendor API for 2024 Q2
      *
      * <p>For Android 14-QPR3 and later, the vendor API level is completely decoupled from the SDK
diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java
index beb9a93..2d3dd1b 100644
--- a/core/java/android/os/GraphicsEnvironment.java
+++ b/core/java/android/os/GraphicsEnvironment.java
@@ -598,6 +598,11 @@
         final String abi = chooseAbi(angleInfo);
 
         // Build a path that includes installed native libs and APK
+        // TODO (b/370113081): If the native libraries are not found in this path,
+        // the system libraries will be loaded instead.
+        // This can happen if the ANGLE APK is present,
+        // but accidentally packaged without native libraries.
+        // TBD if this should fail instead of falling back to the system version.
         final String paths = angleInfo.nativeLibraryDir
                 + File.pathSeparator
                 + angleInfo.sourceDir
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index 5f62b8b..e85e580 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -42,7 +42,9 @@
 
     void updateWakeLockWorkSource(IBinder lock, in WorkSource ws, String historyTag);
     void updateWakeLockCallback(IBinder lock, IWakeLockCallback callback);
+    @UnsupportedAppUsage
     boolean isWakeLockLevelSupported(int level);
+    boolean isWakeLockLevelSupportedWithDisplayId(int level, int displayId);
 
     void userActivity(int displayId, long time, int event, int flags);
     void wakeUp(long time, int reason, String details, String opPackageName);
diff --git a/core/java/android/os/IpcDataCache.java b/core/java/android/os/IpcDataCache.java
index 0776cf4..e2a72dd 100644
--- a/core/java/android/os/IpcDataCache.java
+++ b/core/java/android/os/IpcDataCache.java
@@ -48,6 +48,20 @@
  * LRU cache that's invalidated when an opaque value in a property changes. Self-synchronizing,
  * but doesn't hold a lock across data fetches on query misses.
  *
+ * Clients should be aware of the following commonly-seen issues:
+ * <ul>
+ *
+ * <li>Client calls will not go through the cache before the first invalidation signal is
+ * received. Therefore, servers should signal an invalidation as soon as they have data to offer to
+ * clients.
+ *
+ * <li>Cache invalidation is restricted to well-known processes, which means that test code cannot
+ * invalidate a cache.  {@link #disableForTestMode()} and {@link #testPropertyName} must be used in
+ * test processes that attempt cache invalidation.  See
+ * {@link PropertyInvalidatedCacheTest#testBasicCache()} for an example.
+ *
+ * </ul>
+ *
  * The intended use case is caching frequently-read, seldom-changed information normally retrieved
  * across interprocess communication. Imagine that you've written a user birthday information
  * daemon called "birthdayd" that exposes an {@code IUserBirthdayService} interface over
@@ -136,20 +150,20 @@
  * string is permitted.  The third parameters is the name of the API being cached; this, too, can
  * any value.  The fourth is the name of the cache.  The cache is usually named after th API.
  * Some things you must know about the three strings:
- * <list>
- * <ul> The system property that controls the cache is named {@code cache_key.<module>.<api>}.
+ * <ul>
+ * <li> The system property that controls the cache is named {@code cache_key.<module>.<api>}.
  * Usually, the SELinux rules permit a process to write a system property (and therefore
  * invalidate a cache) based on the wildcard {@code cache_key.<module>.*}.  This means that
  * although the cache can be constructed with any module string, whatever string is chosen must be
  * consistent with the SELinux configuration.
- * <ul> The API name can be any string of alphanumeric characters.  All caches with the same API
+ * <li> The API name can be any string of alphanumeric characters.  All caches with the same API
  * are invalidated at the same time.  If a server supports several caches and all are invalidated
  * in common, then it is most efficient to assign the same API string to every cache.
- * <ul> The cache name can be any string.  In debug output, the name is used to distiguish between
+ * <li> The cache name can be any string.  In debug output, the name is used to distiguish between
  * caches with the same API name.  The cache name is also used when disabling caches in the
  * current process.  So, invalidation is based on the module+api but disabling (which is generally
  * a once-per-process operation) is based on the cache name.
- * </list>
+ * </ul>
  *
  * User birthdays do occasionally change, so we have to modify the server to invalidate this
  * cache when necessary. That invalidation code looks like this:
diff --git a/core/java/android/os/PowerComponents.java b/core/java/android/os/PowerComponents.java
index 9200db3..f4e3f3b 100644
--- a/core/java/android/os/PowerComponents.java
+++ b/core/java/android/os/PowerComponents.java
@@ -17,6 +17,7 @@
 
 import static android.os.BatteryConsumer.BatteryConsumerDataLayout.POWER_MODEL_NOT_INCLUDED;
 import static android.os.BatteryConsumer.POWER_COMPONENT_ANY;
+import static android.os.BatteryConsumer.POWER_COMPONENT_BASE;
 import static android.os.BatteryConsumer.POWER_STATE_ANY;
 import static android.os.BatteryConsumer.POWER_STATE_UNSPECIFIED;
 import static android.os.BatteryConsumer.PROCESS_STATE_ANY;
@@ -184,6 +185,10 @@
             @BatteryConsumer.PowerState int powerState, boolean skipEmptyComponents) {
         StringBuilder sb = new StringBuilder();
         for (@BatteryConsumer.PowerComponentId int id : mData.layout.powerComponentIds) {
+            if (id == POWER_COMPONENT_BASE) {
+                continue;
+            }
+
             dump(sb, id, PROCESS_STATE_ANY, screenState, powerState, skipEmptyComponents);
             if (mData.layout.processStateDataIncluded) {
                 for (int processState = 0; processState < BatteryConsumer.PROCESS_STATE_COUNT;
@@ -491,6 +496,14 @@
             return this;
         }
 
+        @NonNull
+        public Builder addUsageDurationMillis(BatteryConsumer.Key key,
+                long componentUsageDurationMillis) {
+            mData.putLong(key.mDurationColumnIndex,
+                    mData.getLong(key.mDurationColumnIndex) + componentUsageDurationMillis);
+            return this;
+        }
+
         public void addPowerAndDuration(PowerComponents.Builder other) {
             addPowerAndDuration(other.mData);
         }
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index b9bae5b..32db3be 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -1344,6 +1344,9 @@
      * @see #ON_AFTER_RELEASE
      */
     public WakeLock newWakeLock(int levelAndFlags, String tag) {
+        if (android.companion.virtualdevice.flags.Flags.displayPowerManagerApis()) {
+            return newWakeLock(levelAndFlags, tag, mContext.getDisplayId());
+        }
         validateWakeLockParameters(levelAndFlags, tag);
         return new WakeLock(levelAndFlags, tag, mContext.getOpPackageName(),
                 Display.INVALID_DISPLAY);
@@ -1734,6 +1737,10 @@
      */
     public boolean isWakeLockLevelSupported(int level) {
         try {
+            if (android.companion.virtualdevice.flags.Flags.displayPowerManagerApis()) {
+                return mService.isWakeLockLevelSupportedWithDisplayId(
+                        level, mContext.getDisplayId());
+            }
             return mService.isWakeLockLevelSupported(level);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
@@ -1797,6 +1804,9 @@
      * @see android.content.Intent#ACTION_SCREEN_OFF
      */
     public boolean isInteractive() {
+        if (android.companion.virtualdevice.flags.Flags.displayPowerManagerApis()) {
+            return isInteractive(mContext.getDisplayId());
+        }
         return mInteractiveCache.query(null);
     }
 
diff --git a/core/java/android/os/RemoteCallbackList.java b/core/java/android/os/RemoteCallbackList.java
index 2cb86f7..769cbdd 100644
--- a/core/java/android/os/RemoteCallbackList.java
+++ b/core/java/android/os/RemoteCallbackList.java
@@ -92,9 +92,9 @@
     /**
      * Add a new callback to the list.  This callback will remain in the list
      * until a corresponding call to {@link #unregister} or its hosting process
-     * goes away.  If the callback was already registered (determined by
+     * goes away. If the callback was already registered (determined by
      * checking to see if the {@link IInterface#asBinder callback.asBinder()}
-     * object is already in the list), then it will be left as-is.
+     * object is already in the list), then it will be replaced with the new callback.
      * Registrations are not counted; a single call to {@link #unregister}
      * will remove a callback after any number calls to register it.
      *
@@ -106,7 +106,7 @@
      *
      * @param cookie Optional additional data to be associated with this
      * callback.
-     * 
+     *
      * @return Returns true if the callback was successfully added to the list.
      * Returns false if it was not added, either because {@link #kill} had
      * previously been called or the callback's process has gone away.
diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java
index 9b5a378..7f7ef04 100644
--- a/core/java/android/os/UidBatteryConsumer.java
+++ b/core/java/android/os/UidBatteryConsumer.java
@@ -70,10 +70,7 @@
 
     static final int COLUMN_INDEX_UID = BatteryConsumer.COLUMN_COUNT;
     static final int COLUMN_INDEX_PACKAGE_WITH_HIGHEST_DRAIN = COLUMN_INDEX_UID + 1;
-    static final int COLUMN_INDEX_TIME_IN_FOREGROUND = COLUMN_INDEX_UID + 2;
-    static final int COLUMN_INDEX_TIME_IN_BACKGROUND = COLUMN_INDEX_UID + 3;
-    static final int COLUMN_INDEX_TIME_IN_FOREGROUND_SERVICE = COLUMN_INDEX_UID + 4;
-    static final int COLUMN_COUNT = BatteryConsumer.COLUMN_COUNT + 5;
+    static final int COLUMN_COUNT = BatteryConsumer.COLUMN_COUNT + 2;
 
     UidBatteryConsumer(BatteryConsumerData data) {
         super(data);
@@ -100,10 +97,10 @@
     public long getTimeInStateMs(@State int state) {
         switch (state) {
             case STATE_BACKGROUND:
-                return mData.getInt(COLUMN_INDEX_TIME_IN_BACKGROUND)
-                        + mData.getInt(COLUMN_INDEX_TIME_IN_FOREGROUND_SERVICE);
+                return getTimeInProcessStateMs(PROCESS_STATE_BACKGROUND)
+                        + getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND_SERVICE);
             case STATE_FOREGROUND:
-                return mData.getInt(COLUMN_INDEX_TIME_IN_FOREGROUND);
+                return getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND);
         }
         return 0;
     }
@@ -112,13 +109,9 @@
      * Returns the amount of time in milliseconds this UID spent in the specified process state.
      */
     public long getTimeInProcessStateMs(@ProcessState int state) {
-        switch (state) {
-            case PROCESS_STATE_BACKGROUND:
-                return mData.getInt(COLUMN_INDEX_TIME_IN_BACKGROUND);
-            case PROCESS_STATE_FOREGROUND:
-                return mData.getInt(COLUMN_INDEX_TIME_IN_FOREGROUND);
-            case PROCESS_STATE_FOREGROUND_SERVICE:
-                return mData.getInt(COLUMN_INDEX_TIME_IN_FOREGROUND_SERVICE);
+        Key key = getKey(POWER_COMPONENT_BASE, state);
+        if (key != null) {
+            return getUsageDurationMillis(key);
         }
         return 0;
     }
@@ -130,20 +123,16 @@
         pw.print(": ");
         pw.print(BatteryStats.formatCharge(getConsumedPower()));
 
-        if (mData.layout.processStateDataIncluded) {
-            StringBuilder sb = new StringBuilder();
-            appendProcessStateData(sb, BatteryConsumer.PROCESS_STATE_FOREGROUND,
-                    skipEmptyComponents);
-            appendProcessStateData(sb, BatteryConsumer.PROCESS_STATE_BACKGROUND,
-                    skipEmptyComponents);
-            appendProcessStateData(sb, BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE,
-                    skipEmptyComponents);
-            appendProcessStateData(sb, BatteryConsumer.PROCESS_STATE_CACHED,
-                    skipEmptyComponents);
-            pw.println(sb);
-        } else {
-            pw.println();
-        }
+        StringBuilder sb = new StringBuilder();
+        appendProcessStateData(sb, BatteryConsumer.PROCESS_STATE_FOREGROUND,
+                skipEmptyComponents);
+        appendProcessStateData(sb, BatteryConsumer.PROCESS_STATE_BACKGROUND,
+                skipEmptyComponents);
+        appendProcessStateData(sb, BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE,
+                skipEmptyComponents);
+        appendProcessStateData(sb, BatteryConsumer.PROCESS_STATE_CACHED,
+                skipEmptyComponents);
+        pw.println(sb);
 
         pw.print("      ");
         mPowerComponents.dump(pw, SCREEN_STATE_ANY, POWER_STATE_ANY, skipEmptyComponents);
@@ -190,12 +179,20 @@
             boolean skipEmptyComponents) {
         Dimensions dimensions = new Dimensions(POWER_COMPONENT_ANY, processState);
         final double power = mPowerComponents.getConsumedPower(dimensions);
-        if (power == 0 && skipEmptyComponents) {
+
+        Key key = getKey(POWER_COMPONENT_BASE, processState);
+        long durationMs = key != null ? mPowerComponents.getUsageDurationMillis(key) : 0;
+        if (power == 0 && durationMs == 0 && skipEmptyComponents) {
             return;
         }
 
         sb.append(" ").append(processStateToString(processState)).append(": ")
                 .append(BatteryStats.formatCharge(power));
+        if (durationMs != 0) {
+            sb.append(" (");
+            BatteryStats.formatTimeMsNoSpace(sb, durationMs);
+            sb.append(")");
+        }
     }
 
     /** Serializes this object to XML */
@@ -322,10 +319,10 @@
         public Builder setTimeInStateMs(@State int state, long timeInStateMs) {
             switch (state) {
                 case STATE_FOREGROUND:
-                    mData.putLong(COLUMN_INDEX_TIME_IN_FOREGROUND, timeInStateMs);
+                    setTimeInProcessStateMs(PROCESS_STATE_FOREGROUND, timeInStateMs);
                     break;
                 case STATE_BACKGROUND:
-                    mData.putLong(COLUMN_INDEX_TIME_IN_BACKGROUND, timeInStateMs);
+                    setTimeInProcessStateMs(PROCESS_STATE_BACKGROUND, timeInStateMs);
                     break;
                 default:
                     throw new IllegalArgumentException("Unsupported state: " + state);
@@ -339,18 +336,9 @@
          */
         @NonNull
         public Builder setTimeInProcessStateMs(@ProcessState int state, long timeInProcessStateMs) {
-            switch (state) {
-                case PROCESS_STATE_FOREGROUND:
-                    mData.putLong(COLUMN_INDEX_TIME_IN_FOREGROUND, timeInProcessStateMs);
-                    break;
-                case PROCESS_STATE_BACKGROUND:
-                    mData.putLong(COLUMN_INDEX_TIME_IN_BACKGROUND, timeInProcessStateMs);
-                    break;
-                case PROCESS_STATE_FOREGROUND_SERVICE:
-                    mData.putLong(COLUMN_INDEX_TIME_IN_FOREGROUND_SERVICE, timeInProcessStateMs);
-                    break;
-                default:
-                    throw new IllegalArgumentException("Unsupported process state: " + state);
+            Key key = getKey(POWER_COMPONENT_BASE, state);
+            if (key != null) {
+                mData.putLong(key.mDurationColumnIndex, timeInProcessStateMs);
             }
             return this;
         }
@@ -368,17 +356,6 @@
          */
         public Builder add(UidBatteryConsumer consumer) {
             mPowerComponentsBuilder.addPowerAndDuration(consumer.mPowerComponents);
-
-            setTimeInProcessStateMs(PROCESS_STATE_FOREGROUND,
-                    mData.getLong(COLUMN_INDEX_TIME_IN_FOREGROUND)
-                            + consumer.getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND));
-            setTimeInProcessStateMs(PROCESS_STATE_BACKGROUND,
-                    mData.getLong(COLUMN_INDEX_TIME_IN_BACKGROUND)
-                            + consumer.getTimeInProcessStateMs(PROCESS_STATE_BACKGROUND));
-            setTimeInProcessStateMs(PROCESS_STATE_FOREGROUND_SERVICE,
-                    mData.getLong(COLUMN_INDEX_TIME_IN_FOREGROUND_SERVICE)
-                            + consumer.getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND_SERVICE));
-
             if (mPackageWithHighestDrain == PACKAGE_NAME_UNINITIALIZED) {
                 mPackageWithHighestDrain = consumer.getPackageWithHighestDrain();
             } else if (!TextUtils.equals(mPackageWithHighestDrain,
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 461f1e0..3ae9511 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -69,6 +69,8 @@
 import android.view.WindowManager.LayoutParams;
 
 import com.android.internal.R;
+import com.android.internal.annotations.CachedProperty;
+import com.android.internal.annotations.CachedPropertyDefaults;
 
 import java.io.IOException;
 import java.lang.annotation.Retention;
@@ -90,6 +92,7 @@
  */
 @SystemService(Context.USER_SERVICE)
 @android.ravenwood.annotation.RavenwoodKeepPartialClass
+@CachedPropertyDefaults()
 public class UserManager {
 
     private static final String TAG = "UserManager";
@@ -108,6 +111,9 @@
     /** Whether the device is in headless system user mode; null until cached. */
     private static Boolean sIsHeadlessSystemUser = null;
 
+    /** Generated class containing IpcDataCaches. */
+    private final Object mIpcDataCache = new UserManagerCache();
+
     /** Maximum length of username.
      * @hide
      */
@@ -3766,62 +3772,18 @@
         return isUserUnlocked(user.getIdentifier());
     }
 
-    private static final String CACHE_KEY_IS_USER_UNLOCKED_PROPERTY =
-        PropertyInvalidatedCache.createPropertyName(
-            PropertyInvalidatedCache.MODULE_SYSTEM, "is_user_unlocked");
-
-    private final PropertyInvalidatedCache<Integer, Boolean> mIsUserUnlockedCache =
-            new PropertyInvalidatedCache<Integer, Boolean>(
-                32, CACHE_KEY_IS_USER_UNLOCKED_PROPERTY) {
-                @Override
-                public Boolean recompute(Integer query) {
-                    try {
-                        return mService.isUserUnlocked(query);
-                    } catch (RemoteException re) {
-                        throw re.rethrowFromSystemServer();
-                    }
-                }
-                @Override
-                public boolean bypass(Integer query) {
-                    return query < 0;
-                }
-            };
-
-    // Uses IS_USER_UNLOCKED_PROPERTY for invalidation as the APIs have the same dependencies.
-    private final PropertyInvalidatedCache<Integer, Boolean> mIsUserUnlockingOrUnlockedCache =
-            new PropertyInvalidatedCache<Integer, Boolean>(
-                32, CACHE_KEY_IS_USER_UNLOCKED_PROPERTY) {
-                @Override
-                public Boolean recompute(Integer query) {
-                    try {
-                        return mService.isUserUnlockingOrUnlocked(query);
-                    } catch (RemoteException re) {
-                        throw re.rethrowFromSystemServer();
-                    }
-                }
-                @Override
-                public boolean bypass(Integer query) {
-                    return query < 0;
-                }
-            };
-
     /** @hide */
     @UnsupportedAppUsage
     @RequiresPermission(anyOf = {Manifest.permission.MANAGE_USERS,
             Manifest.permission.INTERACT_ACROSS_USERS}, conditional = true)
+    @CachedProperty(modsFlagOnOrNone = {}, api = "is_user_unlocked")
     public boolean isUserUnlocked(@UserIdInt int userId) {
-        return mIsUserUnlockedCache.query(userId);
-    }
-
-    /** @hide */
-    public void disableIsUserUnlockedCache() {
-        mIsUserUnlockedCache.disableLocal();
-        mIsUserUnlockingOrUnlockedCache.disableLocal();
+        return ((UserManagerCache) mIpcDataCache).isUserUnlocked(mService::isUserUnlocked, userId);
     }
 
     /** @hide */
     public static final void invalidateIsUserUnlockedCache() {
-        PropertyInvalidatedCache.invalidateCache(CACHE_KEY_IS_USER_UNLOCKED_PROPERTY);
+        UserManagerCache.invalidateUserUnlocked();
     }
 
     /**
@@ -3852,8 +3814,10 @@
     /** @hide */
     @RequiresPermission(anyOf = {Manifest.permission.MANAGE_USERS,
             Manifest.permission.INTERACT_ACROSS_USERS}, conditional = true)
+    @CachedProperty(modsFlagOnOrNone = {}, api = "is_user_unlocked")
     public boolean isUserUnlockingOrUnlocked(@UserIdInt int userId) {
-        return mIsUserUnlockingOrUnlockedCache.query(userId);
+        return ((UserManagerCache) mIpcDataCache)
+                .isUserUnlockingOrUnlocked(mService::isUserUnlockingOrUnlocked, userId);
     }
 
     /**
@@ -5686,31 +5650,9 @@
         }
     }
 
-    private static final String CACHE_KEY_QUIET_MODE_ENABLED_PROPERTY =
-        PropertyInvalidatedCache.createPropertyName(
-            PropertyInvalidatedCache.MODULE_SYSTEM, "quiet_mode_enabled");
-
-    private final PropertyInvalidatedCache<Integer, Boolean> mQuietModeEnabledCache =
-            new PropertyInvalidatedCache<Integer, Boolean>(
-                32, CACHE_KEY_QUIET_MODE_ENABLED_PROPERTY) {
-                @Override
-                public Boolean recompute(Integer query) {
-                    try {
-                        return mService.isQuietModeEnabled(query);
-                    } catch (RemoteException re) {
-                        throw re.rethrowFromSystemServer();
-                    }
-                }
-                @Override
-                public boolean bypass(Integer query) {
-                    return query < 0;
-                }
-            };
-
-
     /** @hide */
     public static final void invalidateQuietModeEnabledCache() {
-        PropertyInvalidatedCache.invalidateCache(CACHE_KEY_QUIET_MODE_ENABLED_PROPERTY);
+        UserManagerCache.invalidateQuietModeEnabled();
     }
 
     /**
@@ -5719,13 +5661,15 @@
      * @param userHandle The user handle of the profile to be queried.
      * @return true if the profile is in quiet mode, false otherwise.
      */
+    @CachedProperty(modsFlagOnOrNone = {})
     public boolean isQuietModeEnabled(UserHandle userHandle) {
-        if (android.multiuser.Flags.cacheQuietModeState()){
+        if (android.multiuser.Flags.cacheQuietModeState()) {
             final int userId = userHandle.getIdentifier();
             if (userId < 0) {
                 return false;
             }
-            return mQuietModeEnabledCache.query(userId);
+            return ((UserManagerCache) mIpcDataCache).isQuietModeEnabled(
+                    (UserHandle uh) -> mService.isQuietModeEnabled(uh.getIdentifier()), userHandle);
         }
         try {
             return mService.isQuietModeEnabled(userHandle.getIdentifier());
@@ -6424,41 +6368,21 @@
                 Settings.Global.DEVICE_DEMO_MODE, 0) > 0;
     }
 
-    private static final String CACHE_KEY_USER_SERIAL_NUMBER_PROPERTY =
-        PropertyInvalidatedCache.createPropertyName(
-            PropertyInvalidatedCache.MODULE_SYSTEM, "user_serial_number");
-
-    private final PropertyInvalidatedCache<Integer, Integer> mUserSerialNumberCache =
-            new PropertyInvalidatedCache<Integer, Integer>(
-                32, CACHE_KEY_USER_SERIAL_NUMBER_PROPERTY) {
-                @Override
-                public Integer recompute(Integer query) {
-                    try {
-                        return mService.getUserSerialNumber(query);
-                    } catch (RemoteException re) {
-                        throw re.rethrowFromSystemServer();
-                    }
-                }
-                @Override
-                public boolean bypass(Integer query) {
-                    return query <= 0;
-                }
-            };
-
-
     /** @hide */
     public static final void invalidateUserSerialNumberCache() {
-        PropertyInvalidatedCache.invalidateCache(CACHE_KEY_USER_SERIAL_NUMBER_PROPERTY);
+        UserManagerCache.invalidateUserSerialNumber();
     }
 
     /**
      * Returns a serial number on this device for a given userId. User handles can be recycled
-     * when deleting and creating users, but serial numbers are not reused until the device is wiped.
+     * when deleting and creating users, but serial numbers are not reused until the device is
+     * wiped.
      * @param userId
      * @return a serial number associated with that user, or -1 if the userId is not valid.
      * @hide
      */
     @UnsupportedAppUsage
+    @CachedProperty(modsFlagOnOrNone = {})
     public int getUserSerialNumber(@UserIdInt int userId) {
         // Read only flag should is to fix early access to this API
         // cacheUserSerialNumber to be removed after the
@@ -6470,7 +6394,8 @@
             if (userId == UserHandle.USER_SYSTEM) {
                return UserHandle.USER_SERIAL_SYSTEM;
             }
-            return mUserSerialNumberCache.query(userId);
+            return ((UserManagerCache) mIpcDataCache).getUserSerialNumber(
+                    mService::getUserSerialNumber, userId);
         }
         try {
             return mService.getUserSerialNumber(userId);
diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java
index 64a2dbc..ffc58c5 100644
--- a/core/java/android/os/VibrationEffect.java
+++ b/core/java/android/os/VibrationEffect.java
@@ -40,6 +40,7 @@
 import android.os.vibrator.RampSegment;
 import android.os.vibrator.StepSegment;
 import android.os.vibrator.VibrationEffectSegment;
+import android.os.vibrator.VibratorFrequencyProfileLegacy;
 import android.util.MathUtils;
 
 import com.android.internal.util.Preconditions;
@@ -1761,7 +1762,7 @@
          * new value as fast as possible.
          *
          * <p>Vibration parameter values will be truncated to conform to the device capabilities
-         * according to the {@link android.os.vibrator.VibratorFrequencyProfile}.
+         * according to the {@link VibratorFrequencyProfileLegacy}.
          *
          * @param duration        The length of time this transition should take. Value must be
          *                        non-negative and will be truncated to milliseconds.
@@ -1792,7 +1793,7 @@
          * new values as fast as possible.
          *
          * <p>Vibration parameters values will be truncated to conform to the device capabilities
-         * according to the {@link android.os.vibrator.VibratorFrequencyProfile}.
+         * according to the {@link VibratorFrequencyProfileLegacy}.
          *
          * @param duration         The length of time this transition should take. Value must be
          *                         non-negative and will be truncated to milliseconds.
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index 84325b7..7327630 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -22,6 +22,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
+import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
 import android.annotation.SystemService;
 import android.annotation.TestApi;
@@ -33,7 +34,7 @@
 import android.media.AudioAttributes;
 import android.os.vibrator.Flags;
 import android.os.vibrator.VibrationConfig;
-import android.os.vibrator.VibratorFrequencyProfile;
+import android.os.vibrator.VibratorFrequencyProfileLegacy;
 import android.util.Log;
 import android.view.HapticFeedbackConstants;
 
@@ -290,13 +291,15 @@
      * @hide
      */
     @TestApi
+    @SuppressLint("UnflaggedApi")
     @Nullable
-    public VibratorFrequencyProfile getFrequencyProfile() {
-        VibratorInfo.FrequencyProfile frequencyProfile = getInfo().getFrequencyProfile();
+    public VibratorFrequencyProfileLegacy getFrequencyProfileLegacy() {
+        VibratorInfo.FrequencyProfileLegacy frequencyProfile =
+                getInfo().getFrequencyProfileLegacy();
         if (frequencyProfile.isEmpty()) {
             return null;
         }
-        return new VibratorFrequencyProfile(frequencyProfile);
+        return new VibratorFrequencyProfileLegacy(frequencyProfile);
     }
 
     /**
diff --git a/core/java/android/os/VibratorInfo.java b/core/java/android/os/VibratorInfo.java
index 5378295e..f7fff39 100644
--- a/core/java/android/os/VibratorInfo.java
+++ b/core/java/android/os/VibratorInfo.java
@@ -59,7 +59,7 @@
     private final int mPwlePrimitiveDurationMax;
     private final int mPwleSizeMax;
     private final float mQFactor;
-    private final FrequencyProfile mFrequencyProfile;
+    private final FrequencyProfileLegacy mFrequencyProfileLegacy;
     private final int mMaxEnvelopeEffectSize;
     private final int mMinEnvelopeEffectControlPointDurationMillis;
     private final int mMaxEnvelopeEffectControlPointDurationMillis;
@@ -75,7 +75,7 @@
         mPwlePrimitiveDurationMax = in.readInt();
         mPwleSizeMax = in.readInt();
         mQFactor = in.readFloat();
-        mFrequencyProfile = FrequencyProfile.CREATOR.createFromParcel(in);
+        mFrequencyProfileLegacy = FrequencyProfileLegacy.CREATOR.createFromParcel(in);
         mMaxEnvelopeEffectSize = in.readInt();
         mMinEnvelopeEffectControlPointDurationMillis = in.readInt();
         mMaxEnvelopeEffectControlPointDurationMillis = in.readInt();
@@ -86,7 +86,7 @@
                 baseVibratorInfo.mSupportedBraking, baseVibratorInfo.mSupportedPrimitives,
                 baseVibratorInfo.mPrimitiveDelayMax, baseVibratorInfo.mCompositionSizeMax,
                 baseVibratorInfo.mPwlePrimitiveDurationMax, baseVibratorInfo.mPwleSizeMax,
-                baseVibratorInfo.mQFactor, baseVibratorInfo.mFrequencyProfile,
+                baseVibratorInfo.mQFactor, baseVibratorInfo.mFrequencyProfileLegacy,
                 baseVibratorInfo.mMaxEnvelopeEffectSize,
                 baseVibratorInfo.mMinEnvelopeEffectControlPointDurationMillis,
                 baseVibratorInfo.mMaxEnvelopeEffectControlPointDurationMillis);
@@ -112,7 +112,7 @@
      * @param pwleSizeMax              The maximum number of primitives supported by a PWLE
      *                                 composition.
      * @param qFactor                  The vibrator quality factor.
-     * @param frequencyProfile         The description of the vibrator supported frequencies and max
+     * @param frequencyProfileLegacy   The description of the vibrator supported frequencies and max
      *                                 amplitude mappings.
      * @hide
      */
@@ -120,11 +120,11 @@
             @Nullable SparseBooleanArray supportedBraking,
             @NonNull SparseIntArray supportedPrimitives, int primitiveDelayMax,
             int compositionSizeMax, int pwlePrimitiveDurationMax, int pwleSizeMax,
-            float qFactor, @NonNull FrequencyProfile frequencyProfile,
+            float qFactor, @NonNull FrequencyProfileLegacy frequencyProfileLegacy,
             int maxEnvelopeEffectSize, int minEnvelopeEffectControlPointDurationMillis,
             int maxEnvelopeEffectControlPointDurationMillis) {
         Preconditions.checkNotNull(supportedPrimitives);
-        Preconditions.checkNotNull(frequencyProfile);
+        Preconditions.checkNotNull(frequencyProfileLegacy);
         mId = id;
         mCapabilities = capabilities;
         mSupportedEffects = supportedEffects == null ? null : supportedEffects.clone();
@@ -135,7 +135,7 @@
         mPwlePrimitiveDurationMax = pwlePrimitiveDurationMax;
         mPwleSizeMax = pwleSizeMax;
         mQFactor = qFactor;
-        mFrequencyProfile = frequencyProfile;
+        mFrequencyProfileLegacy = frequencyProfileLegacy;
         mMaxEnvelopeEffectSize = maxEnvelopeEffectSize;
         mMinEnvelopeEffectControlPointDurationMillis =
                 minEnvelopeEffectControlPointDurationMillis;
@@ -155,7 +155,7 @@
         dest.writeInt(mPwlePrimitiveDurationMax);
         dest.writeInt(mPwleSizeMax);
         dest.writeFloat(mQFactor);
-        mFrequencyProfile.writeToParcel(dest, flags);
+        mFrequencyProfileLegacy.writeToParcel(dest, flags);
         dest.writeInt(mMaxEnvelopeEffectSize);
         dest.writeInt(mMinEnvelopeEffectControlPointDurationMillis);
         dest.writeInt(mMaxEnvelopeEffectControlPointDurationMillis);
@@ -205,7 +205,7 @@
                 && Objects.equals(mSupportedEffects, that.mSupportedEffects)
                 && Objects.equals(mSupportedBraking, that.mSupportedBraking)
                 && Objects.equals(mQFactor, that.mQFactor)
-                && Objects.equals(mFrequencyProfile, that.mFrequencyProfile)
+                && Objects.equals(mFrequencyProfileLegacy, that.mFrequencyProfileLegacy)
                 && mMaxEnvelopeEffectSize == that.mMaxEnvelopeEffectSize
                 && mMinEnvelopeEffectControlPointDurationMillis
                 == that.mMinEnvelopeEffectControlPointDurationMillis
@@ -216,7 +216,7 @@
     @Override
     public int hashCode() {
         int hashCode = Objects.hash(mId, mCapabilities, mSupportedEffects, mSupportedBraking,
-                mQFactor, mFrequencyProfile);
+                mQFactor, mFrequencyProfileLegacy);
         for (int i = 0; i < mSupportedPrimitives.size(); i++) {
             hashCode = 31 * hashCode + mSupportedPrimitives.keyAt(i);
             hashCode = 31 * hashCode + mSupportedPrimitives.valueAt(i);
@@ -238,7 +238,7 @@
                 + ", mPwlePrimitiveDurationMax=" + mPwlePrimitiveDurationMax
                 + ", mPwleSizeMax=" + mPwleSizeMax
                 + ", mQFactor=" + mQFactor
-                + ", mFrequencyProfile=" + mFrequencyProfile
+                + ", mFrequencyProfileLegacy=" + mFrequencyProfileLegacy
                 + ", mMaxEnvelopeEffectSize=" + mMaxEnvelopeEffectSize
                 + ", mMinEnvelopeEffectControlPointDurationMillis="
                 + mMinEnvelopeEffectControlPointDurationMillis
@@ -262,7 +262,7 @@
         pw.println("pwlePrimitiveDurationMax = " + mPwlePrimitiveDurationMax);
         pw.println("pwleSizeMax = " + mPwleSizeMax);
         pw.println("q-factor = " + mQFactor);
-        pw.println("frequencyProfile = " + mFrequencyProfile);
+        pw.println("frequencyProfileLegacy = " + mFrequencyProfileLegacy);
         pw.println("mMaxEnvelopeEffectSize = " + mMaxEnvelopeEffectSize);
         pw.println("mMinEnvelopeEffectControlPointDurationMillis = "
                 + mMinEnvelopeEffectControlPointDurationMillis);
@@ -517,7 +517,7 @@
      * this vibrator is a composite of multiple physical devices.
      */
     public float getResonantFrequencyHz() {
-        return mFrequencyProfile.mResonantFrequencyHz;
+        return mFrequencyProfileLegacy.mResonantFrequencyHz;
     }
 
     /**
@@ -537,8 +537,8 @@
      * <p>If the devices does not have frequency control then the profile should be empty.
      */
     @NonNull
-    public FrequencyProfile getFrequencyProfile() {
-        return mFrequencyProfile;
+    public FrequencyProfileLegacy getFrequencyProfileLegacy() {
+        return mFrequencyProfileLegacy;
     }
 
     /** Returns a single int representing all the capabilities of the vibrator. */
@@ -640,7 +640,7 @@
      *
      * @hide
      */
-    public static final class FrequencyProfile implements Parcelable {
+    public static final class FrequencyProfileLegacy implements Parcelable {
         @Nullable
         private final Range<Float> mFrequencyRangeHz;
         private final float mMinFrequencyHz;
@@ -648,7 +648,7 @@
         private final float mFrequencyResolutionHz;
         private final float[] mMaxAmplitudes;
 
-        FrequencyProfile(Parcel in) {
+        FrequencyProfileLegacy(Parcel in) {
             this(in.readFloat(), in.readFloat(), in.readFloat(), in.createFloatArray());
         }
 
@@ -664,7 +664,7 @@
          *                              resolution.
          * @hide
          */
-        public FrequencyProfile(float resonantFrequencyHz, float minFrequencyHz,
+        public FrequencyProfileLegacy(float resonantFrequencyHz, float minFrequencyHz,
                 float frequencyResolutionHz, float[] maxAmplitudes) {
             mMinFrequencyHz = minFrequencyHz;
             mResonantFrequencyHz = resonantFrequencyHz;
@@ -776,10 +776,10 @@
             if (this == o) {
                 return true;
             }
-            if (!(o instanceof FrequencyProfile)) {
+            if (!(o instanceof FrequencyProfileLegacy)) {
                 return false;
             }
-            FrequencyProfile that = (FrequencyProfile) o;
+            FrequencyProfileLegacy that = (FrequencyProfileLegacy) o;
             return Float.compare(mMinFrequencyHz, that.mMinFrequencyHz) == 0
                     && Float.compare(mResonantFrequencyHz, that.mResonantFrequencyHz) == 0
                     && Float.compare(mFrequencyResolutionHz, that.mFrequencyResolutionHz) == 0
@@ -796,7 +796,7 @@
 
         @Override
         public String toString() {
-            return "FrequencyProfile{"
+            return "FrequencyProfileLegacy{"
                     + "mFrequencyRange=" + mFrequencyRangeHz
                     + ", mMinFrequency=" + mMinFrequencyHz
                     + ", mResonantFrequency=" + mResonantFrequencyHz
@@ -806,16 +806,16 @@
         }
 
         @NonNull
-        public static final Creator<FrequencyProfile> CREATOR =
-                new Creator<FrequencyProfile>() {
+        public static final Creator<FrequencyProfileLegacy> CREATOR =
+                new Creator<FrequencyProfileLegacy>() {
                     @Override
-                    public FrequencyProfile createFromParcel(Parcel in) {
-                        return new FrequencyProfile(in);
+                    public FrequencyProfileLegacy createFromParcel(Parcel in) {
+                        return new FrequencyProfileLegacy(in);
                     }
 
                     @Override
-                    public FrequencyProfile[] newArray(int size) {
-                        return new FrequencyProfile[size];
+                    public FrequencyProfileLegacy[] newArray(int size) {
+                        return new FrequencyProfileLegacy[size];
                     }
                 };
     }
@@ -832,8 +832,8 @@
         private int mPwlePrimitiveDurationMax;
         private int mPwleSizeMax;
         private float mQFactor = Float.NaN;
-        private FrequencyProfile mFrequencyProfile =
-                new FrequencyProfile(Float.NaN, Float.NaN, Float.NaN, null);
+        private FrequencyProfileLegacy mFrequencyProfileLegacy =
+                new FrequencyProfileLegacy(Float.NaN, Float.NaN, Float.NaN, null);
         private int mMaxEnvelopeEffectSize;
         private int mMinEnvelopeEffectControlPointDurationMillis;
         private int mMaxEnvelopeEffectControlPointDurationMillis;
@@ -908,8 +908,8 @@
 
         /** Configure the vibrator frequency information like resonant frequency and bandwidth. */
         @NonNull
-        public Builder setFrequencyProfile(@NonNull FrequencyProfile frequencyProfile) {
-            mFrequencyProfile = frequencyProfile;
+        public Builder setFrequencyProfileLegacy(@NonNull FrequencyProfileLegacy frequencyProfile) {
+            mFrequencyProfileLegacy = frequencyProfile;
             return this;
         }
 
@@ -950,7 +950,7 @@
         public VibratorInfo build() {
             return new VibratorInfo(mId, mCapabilities, mSupportedEffects, mSupportedBraking,
                     mSupportedPrimitives, mPrimitiveDelayMax, mCompositionSizeMax,
-                    mPwlePrimitiveDurationMax, mPwleSizeMax, mQFactor, mFrequencyProfile,
+                    mPwlePrimitiveDurationMax, mPwleSizeMax, mQFactor, mFrequencyProfileLegacy,
                     mMaxEnvelopeEffectSize, mMinEnvelopeEffectControlPointDurationMillis,
                     mMaxEnvelopeEffectControlPointDurationMillis);
         }
diff --git a/core/java/android/os/image/flags/trade_in_mode_flags.aconfig b/core/java/android/os/image/flags/trade_in_mode_flags.aconfig
new file mode 100644
index 0000000..e2e56ef
--- /dev/null
+++ b/core/java/android/os/image/flags/trade_in_mode_flags.aconfig
@@ -0,0 +1,11 @@
+package: "com.android.tradeinmode.flags"
+container: "system"
+
+flag {
+  name: "enable_trade_in_mode"
+  is_exported: true
+  namespace: "phoenix"
+  description: "Enable Trade-in Mode"
+  bug: "332683751"
+  is_fixed_read_only: true
+}
diff --git a/core/java/android/os/vibrator/MultiVibratorInfo.java b/core/java/android/os/vibrator/MultiVibratorInfo.java
index 9c2b978..37dae56 100644
--- a/core/java/android/os/vibrator/MultiVibratorInfo.java
+++ b/core/java/android/os/vibrator/MultiVibratorInfo.java
@@ -48,7 +48,7 @@
     }
 
     private MultiVibratorInfo(
-            int id, VibratorInfo[] vibrators, VibratorInfo.FrequencyProfile mergedProfile) {
+            int id, VibratorInfo[] vibrators, FrequencyProfileLegacy mergedProfile) {
         super(id,
                 capabilitiesIntersection(vibrators, mergedProfile.isEmpty()),
                 supportedEffectsIntersection(vibrators),
@@ -209,15 +209,15 @@
     }
 
     @NonNull
-    private static FrequencyProfile frequencyProfileIntersection(VibratorInfo[] infos) {
+    private static FrequencyProfileLegacy frequencyProfileIntersection(VibratorInfo[] infos) {
         float freqResolution = floatPropertyIntersection(infos,
-                info -> info.getFrequencyProfile().getFrequencyResolutionHz());
+                info -> info.getFrequencyProfileLegacy().getFrequencyResolutionHz());
         float resonantFreq = floatPropertyIntersection(infos,
                 VibratorInfo::getResonantFrequencyHz);
         Range<Float> freqRange = frequencyRangeIntersection(infos, freqResolution);
 
         if ((freqRange == null) || Float.isNaN(freqResolution)) {
-            return new FrequencyProfile(resonantFreq, Float.NaN, freqResolution, null);
+            return new FrequencyProfileLegacy(resonantFreq, Float.NaN, freqResolution, null);
         }
 
         int amplitudeCount =
@@ -230,8 +230,8 @@
         Arrays.fill(maxAmplitudes, Float.MAX_VALUE);
 
         for (VibratorInfo info : infos) {
-            Range<Float> vibratorFreqRange = info.getFrequencyProfile().getFrequencyRangeHz();
-            float[] vibratorMaxAmplitudes = info.getFrequencyProfile().getMaxAmplitudes();
+            Range<Float> vibratorFreqRange = info.getFrequencyProfileLegacy().getFrequencyRangeHz();
+            float[] vibratorMaxAmplitudes = info.getFrequencyProfileLegacy().getMaxAmplitudes();
             int vibratorStartIdx = Math.round(
                     (freqRange.getLower() - vibratorFreqRange.getLower()) / freqResolution);
             int vibratorEndIdx = vibratorStartIdx + maxAmplitudes.length - 1;
@@ -240,7 +240,7 @@
                 Slog.w(TAG, "Error calculating the intersection of vibrator frequency"
                         + " profiles: attempted to fetch from vibrator "
                         + info.getId() + " max amplitude with bad index " + vibratorStartIdx);
-                return new FrequencyProfile(resonantFreq, Float.NaN, Float.NaN, null);
+                return new FrequencyProfileLegacy(resonantFreq, Float.NaN, Float.NaN, null);
             }
 
             for (int i = 0; i < maxAmplitudes.length; i++) {
@@ -249,14 +249,14 @@
             }
         }
 
-        return new FrequencyProfile(resonantFreq, freqRange.getLower(),
+        return new FrequencyProfileLegacy(resonantFreq, freqRange.getLower(),
                 freqResolution, maxAmplitudes);
     }
 
     @Nullable
     private static Range<Float> frequencyRangeIntersection(VibratorInfo[] infos,
             float frequencyResolution) {
-        Range<Float> firstRange = infos[0].getFrequencyProfile().getFrequencyRangeHz();
+        Range<Float> firstRange = infos[0].getFrequencyProfileLegacy().getFrequencyRangeHz();
         if (firstRange == null) {
             // If one vibrator is undefined then the intersection is undefined.
             return null;
@@ -268,7 +268,7 @@
         // min supported frequencies are aligned w.r.t. the frequency resolution.
 
         for (int i = 1; i < infos.length; i++) {
-            Range<Float> vibratorRange = infos[i].getFrequencyProfile().getFrequencyRangeHz();
+            Range<Float> vibratorRange = infos[i].getFrequencyProfileLegacy().getFrequencyRangeHz();
             if (vibratorRange == null) {
                 // If one vibrator is undefined then the intersection is undefined.
                 return null;
diff --git a/core/java/android/os/vibrator/VibratorFrequencyProfile.java b/core/java/android/os/vibrator/VibratorFrequencyProfile.java
deleted file mode 100644
index 8392940..0000000
--- a/core/java/android/os/vibrator/VibratorFrequencyProfile.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2022 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 android.os.vibrator;
-
-import android.annotation.FloatRange;
-import android.annotation.NonNull;
-import android.annotation.TestApi;
-import android.os.VibratorInfo;
-
-import com.android.internal.util.Preconditions;
-
-/**
- * Describes the output of a {@link android.os.Vibrator} for different vibration frequencies.
- *
- * <p>The profile contains the minimum and maximum supported vibration frequencies, if the device
- * supports independent frequency control.
- *
- * <p>It also describes the relative output acceleration of a vibration at different supported
- * frequencies. The acceleration is defined by a relative amplitude value between 0 and 1,
- * inclusive, where 0 represents the vibrator off state and 1 represents the maximum output
- * acceleration that the vibrator can reach across all supported frequencies.
- *
- * <p>The measurements are returned as an array of uniformly distributed amplitude values for
- * frequencies between the minimum and maximum supported ones. The measurement interval is the
- * frequency increment between each pair of amplitude values.
- *
- * <p>Vibrators without independent frequency control do not have a frequency profile.
- * @hide
- */
-@TestApi
-public final class VibratorFrequencyProfile {
-
-    private final VibratorInfo.FrequencyProfile mFrequencyProfile;
-
-    /** @hide */
-    public VibratorFrequencyProfile(@NonNull VibratorInfo.FrequencyProfile frequencyProfile) {
-        Preconditions.checkArgument(!frequencyProfile.isEmpty(),
-                "Frequency profile must have a non-empty frequency range");
-        mFrequencyProfile = frequencyProfile;
-    }
-
-    /**
-     * Measurements of the maximum relative amplitude the vibrator can achieve for each supported
-     * frequency.
-     *
-     * <p>The frequency of a measurement is determined as:
-     *
-     * {@code getMinFrequency() + measurementIndex * getMaxAmplitudeMeasurementInterval()}
-     *
-     * <p>The returned list will not be empty, and will have entries representing frequencies from
-     * {@link #getMinFrequency()} to {@link #getMaxFrequency()}, inclusive.
-     *
-     * @return Array of maximum relative amplitude measurements.
-     * @hide
-     */
-    @TestApi
-    @NonNull
-    @FloatRange(from = 0, to = 1)
-    public float[] getMaxAmplitudeMeasurements() {
-        // VibratorInfo getters always return a copy or clone of the data objects.
-        return mFrequencyProfile.getMaxAmplitudes();
-    }
-
-    /**
-     * Gets the frequency interval used to measure the maximum relative amplitudes.
-     *
-     * @return the frequency interval used for the measurement, in hertz.
-     * @hide
-     */
-    @TestApi
-    public float getMaxAmplitudeMeasurementInterval() {
-        return mFrequencyProfile.getFrequencyResolutionHz();
-    }
-
-    /**
-     * Gets the minimum frequency supported by the vibrator.
-     *
-     * @return the minimum frequency supported by the vibrator, in hertz.
-     * @hide
-     */
-    @TestApi
-    public float getMinFrequency() {
-        return mFrequencyProfile.getFrequencyRangeHz().getLower();
-    }
-
-    /**
-     * Gets the maximum frequency supported by the vibrator.
-     *
-     * @return the maximum frequency supported by the vibrator, in hertz.
-     * @hide
-     */
-    @TestApi
-    public float getMaxFrequency() {
-        return mFrequencyProfile.getFrequencyRangeHz().getUpper();
-    }
-}
diff --git a/core/java/android/os/vibrator/VibratorFrequencyProfileLegacy.java b/core/java/android/os/vibrator/VibratorFrequencyProfileLegacy.java
new file mode 100644
index 0000000..5c3e785
--- /dev/null
+++ b/core/java/android/os/vibrator/VibratorFrequencyProfileLegacy.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2022 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 android.os.vibrator;
+
+import android.annotation.FloatRange;
+import android.annotation.NonNull;
+import android.annotation.SuppressLint;
+import android.annotation.TestApi;
+import android.os.VibratorInfo;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * Describes the output of a {@link android.os.Vibrator} for different vibration frequencies.
+ *
+ * <p>The profile contains the minimum and maximum supported vibration frequencies, if the device
+ * supports independent frequency control.
+ *
+ * <p>It also describes the relative output acceleration of a vibration at different supported
+ * frequencies. The acceleration is defined by a relative amplitude value between 0 and 1,
+ * inclusive, where 0 represents the vibrator off state and 1 represents the maximum output
+ * acceleration that the vibrator can reach across all supported frequencies.
+ *
+ * <p>The measurements are returned as an array of uniformly distributed amplitude values for
+ * frequencies between the minimum and maximum supported ones. The measurement interval is the
+ * frequency increment between each pair of amplitude values.
+ *
+ * <p>Vibrators without independent frequency control do not have a frequency profile.
+ * @hide
+ */
+@TestApi
+@SuppressLint("UnflaggedApi")
+public final class VibratorFrequencyProfileLegacy {
+
+    private final VibratorInfo.FrequencyProfileLegacy mFrequencyProfile;
+
+    /** @hide */
+    public VibratorFrequencyProfileLegacy(
+            @NonNull VibratorInfo.FrequencyProfileLegacy frequencyProfile) {
+        Preconditions.checkArgument(!frequencyProfile.isEmpty(),
+                "Frequency profile must have a non-empty frequency range");
+        mFrequencyProfile = frequencyProfile;
+    }
+
+    /**
+     * Measurements of the maximum relative amplitude the vibrator can achieve for each supported
+     * frequency.
+     *
+     * <p>The frequency of a measurement is determined as:
+     *
+     * {@code getMinFrequency() + measurementIndex * getMaxAmplitudeMeasurementInterval()}
+     *
+     * <p>The returned list will not be empty, and will have entries representing frequencies from
+     * {@link #getMinFrequency()} to {@link #getMaxFrequency()}, inclusive.
+     *
+     * @return Array of maximum relative amplitude measurements.
+     * @hide
+     */
+    @TestApi
+    @SuppressLint("UnflaggedApi")
+    @NonNull
+    @FloatRange(from = 0, to = 1)
+    public float[] getMaxAmplitudeMeasurements() {
+        // VibratorInfo getters always return a copy or clone of the data objects.
+        return mFrequencyProfile.getMaxAmplitudes();
+    }
+
+    /**
+     * Gets the frequency interval used to measure the maximum relative amplitudes.
+     *
+     * @return the frequency interval used for the measurement, in hertz.
+     * @hide
+     */
+    @TestApi
+    @SuppressLint("UnflaggedApi")
+    public float getMaxAmplitudeMeasurementInterval() {
+        return mFrequencyProfile.getFrequencyResolutionHz();
+    }
+
+    /**
+     * Gets the minimum frequency supported by the vibrator.
+     *
+     * @return the minimum frequency supported by the vibrator, in hertz.
+     * @hide
+     */
+    @TestApi
+    @SuppressLint("UnflaggedApi")
+    public float getMinFrequency() {
+        return mFrequencyProfile.getFrequencyRangeHz().getLower();
+    }
+
+    /**
+     * Gets the maximum frequency supported by the vibrator.
+     *
+     * @return the maximum frequency supported by the vibrator, in hertz.
+     * @hide
+     */
+    @TestApi
+    @SuppressLint("UnflaggedApi")
+    public float getMaxFrequency() {
+        return mFrequencyProfile.getFrequencyRangeHz().getUpper();
+    }
+}
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 27b1dfb..98d58d0 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -3027,6 +3027,48 @@
          */
         @FlaggedApi(Flags.FLAG_NEW_DEFAULT_ACCOUNT_API_ENABLED)
         public static final class DefaultAccount {
+            /**
+             * no public constructor since this is a utility class
+             */
+            private DefaultAccount() {
+
+            }
+
+            /**
+             * Key in the outgoing Bundle for the default account list.
+             *
+             * @hide
+             */
+            public static final String KEY_ELIGIBLE_DEFAULT_ACCOUNTS =
+                    "key_eligible_default_accounts";
+            /**
+             * The method to invoke in order to query eligiblie default accounts.
+             *
+             * @hide
+             */
+            public static final String QUERY_ELIGIBLE_DEFAULT_ACCOUNTS_METHOD =
+                    "queryEligibleDefaultAccounts";
+            /**
+             * Key in the Bundle for the default account state.
+             *
+             * @hide
+             */
+            public static final String KEY_DEFAULT_ACCOUNT_STATE =
+                    "key_default_account_state";
+            /**
+             * The method to invoke in order to set the default account.
+             *
+             * @hide
+             */
+            public static final String SET_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD =
+                    "setDefaultAccountForNewContacts";
+            /**
+             * The method to invoke in order to query the default account.
+             *
+             * @hide
+             */
+            public static final String QUERY_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD =
+                    "queryDefaultAccountForNewContacts";
 
             /**
              * Represents the state of the default account, and the actual {@link Account} if it's
@@ -3228,6 +3270,276 @@
                 public @interface DefaultAccountState {
                 }
             }
+
+            /**
+             * Get the account that is set as the default account for new contacts, which should be
+             * initially selected when creating a new contact on contact management apps.
+             *
+             * @param resolver the ContentResolver to query.
+             *
+             * @return the default account state for new contacts.
+             * @throws RuntimeException if failed to look up the default account.
+             * @throws IllegalStateException if the default account is in an invalid state.
+             */
+            @FlaggedApi(Flags.FLAG_NEW_DEFAULT_ACCOUNT_API_ENABLED)
+            public static @NonNull DefaultAccountAndState getDefaultAccountForNewContacts(
+                    @NonNull ContentResolver resolver) {
+                Bundle response = nullSafeCall(resolver, ContactsContract.AUTHORITY_URI,
+                        QUERY_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD, null, null);
+
+                int defaultContactsAccountState = response.getInt(KEY_DEFAULT_ACCOUNT_STATE, -1);
+                if (defaultContactsAccountState
+                        == DefaultAccountAndState.DEFAULT_ACCOUNT_STATE_CLOUD) {
+                    String accountName = response.getString(Settings.ACCOUNT_NAME);
+                    String accountType = response.getString(Settings.ACCOUNT_TYPE);
+                    if (TextUtils.isEmpty(accountName) || TextUtils.isEmpty(accountType)) {
+                        throw new IllegalStateException(
+                                "account name and type cannot be null or empty");
+                    }
+                    return new DefaultAccountAndState(
+                            DefaultAccountAndState.DEFAULT_ACCOUNT_STATE_CLOUD,
+                            new Account(accountName, accountType));
+                } else if (defaultContactsAccountState
+                        == DefaultAccountAndState.DEFAULT_ACCOUNT_STATE_LOCAL
+                        || defaultContactsAccountState
+                        == DefaultAccountAndState.DEFAULT_ACCOUNT_STATE_NOT_SET) {
+                    return new DefaultAccountAndState(defaultContactsAccountState, /*cloudAccount=*/
+                            null);
+                } else {
+                    throw new IllegalStateException("Invalid default account state");
+                }
+            }
+
+            /**
+             * Sets the default account that should be initially selected when creating a new
+             * contact on
+             * contact management apps. Apps can only set one of
+             * The following accounts as the default account:
+             * <ol>
+             *   <li> local account
+             *   <li> cloud account that are eligible to be set as default account.
+             * </ol>
+             *
+             * @param resolver               the ContentResolver to query.
+             * @param defaultAccountAndState the default account and state to be set. To set the
+             *                               local
+             *                               account as the
+             *                               default account, this parameter should be
+             *                               {@link DefaultAccountAndState#ofLocal()}. To set the a
+             *                               cloud
+             *                               account as the default account, this parameter should
+             *                               be
+             *                               {@link DefaultAccountAndState#ofCloud(Account)}. To
+             *                               set
+             *                               the
+             *                               default account to a "not set" state, this parameter
+             *                               should
+             *                               be {@link DefaultAccountAndState#ofNotSet()}.
+             *
+             * @throws RuntimeException if it fails to set the default account.
+             *
+             * @hide
+             */
+            @RequiresPermission(android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS)
+            @FlaggedApi(Flags.FLAG_NEW_DEFAULT_ACCOUNT_API_ENABLED)
+            @SystemApi
+            public static void setDefaultAccountForNewContacts(@NonNull ContentResolver resolver,
+                    @NonNull DefaultAccountAndState defaultAccountAndState) {
+                Bundle extras = new Bundle();
+
+                extras.putInt(KEY_DEFAULT_ACCOUNT_STATE, defaultAccountAndState.getState());
+                if (defaultAccountAndState.getState()
+                        == DefaultAccountAndState.DEFAULT_ACCOUNT_STATE_CLOUD) {
+                    Account cloudAccount = defaultAccountAndState.getAccount();
+                    assert cloudAccount != null;
+                    extras.putString(Settings.ACCOUNT_NAME, cloudAccount.name);
+                    extras.putString(Settings.ACCOUNT_TYPE, cloudAccount.type);
+                }
+                nullSafeCall(resolver, ContactsContract.AUTHORITY_URI,
+                        SET_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD, null, extras);
+            }
+
+            /**
+             * Get a list of cloud accounts that is eligible to set as default account with state of
+             * {@link DefaultAccountAndState#DEFAULT_ACCOUNT_STATE_CLOUD}. May be empty but never
+             * null.
+             *
+             * @param resolver content resolver to query.
+             * @return a of cloud accounts that is eligible to set as default account with state of
+             * {@link DefaultAccountAndState#DEFAULT_ACCOUNT_STATE_CLOUD}.
+             * @throws RuntimeException if the query fails.
+             *
+             * @hide
+             */
+            @RequiresPermission(android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS)
+            @FlaggedApi(Flags.FLAG_NEW_DEFAULT_ACCOUNT_API_ENABLED)
+            @SystemApi
+            public static @NonNull List<Account> getEligibleCloudAccounts(
+                    @NonNull ContentResolver resolver) {
+                Bundle response = nullSafeCall(resolver, ContactsContract.AUTHORITY_URI,
+                        QUERY_ELIGIBLE_DEFAULT_ACCOUNTS_METHOD, null, null);
+                List<Account> result = response.getParcelableArrayList(
+                        KEY_ELIGIBLE_DEFAULT_ACCOUNTS, Account.class);
+                if (result == null) {
+                    return new ArrayList<>();
+                }
+                return result;
+            }
+
+
+
+            /**
+             * The method to invoke to move local {@link RawContacts} and {@link Groups} from local
+             * account(s) to the Cloud Default Account (if any).
+             *
+             * @hide
+             */
+            public static final String MOVE_LOCAL_CONTACTS_TO_CLOUD_DEFAULT_ACCOUNT_METHOD =
+                    "moveLocalContactsToCloudDefaultAccount";
+
+            /**
+             * Move {@link RawContacts} and {@link Groups} (if any) from the local account to the
+             * Cloud Default Account (if any).
+             * @param resolver the ContentResolver to query.
+             * @throws RuntimeException if it fails to move contacts to the default account.
+             *
+             * @hide
+             */
+            @SystemApi
+            @FlaggedApi(Flags.FLAG_NEW_DEFAULT_ACCOUNT_API_ENABLED)
+            @RequiresPermission(allOf = {android.Manifest.permission.WRITE_CONTACTS,
+                    android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS})
+            public static void moveLocalContactsToCloudDefaultAccount(
+                    @NonNull ContentResolver resolver) {
+
+                Bundle extras = new Bundle();
+                Bundle result = nullSafeCall(
+                        resolver,
+                        ContactsContract.AUTHORITY_URI,
+                        MOVE_LOCAL_CONTACTS_TO_CLOUD_DEFAULT_ACCOUNT_METHOD,
+                        null,
+                        extras);
+            }
+
+            /**
+             * The method to invoke to move {@link RawContacts} and {@link Groups} from SIM
+             * account(s) to the Cloud Default Account (if any).
+             *
+             * @hide
+             */
+            public static final String MOVE_SIM_CONTACTS_TO_CLOUD_DEFAULT_ACCOUNT_METHOD =
+                    "moveSimContactsToCloudDefaultAccount";
+
+            /**
+             * Move {@link RawContacts} and {@link Groups} (if any) from the local account to the
+             * Cloud Default Account (if any).
+             * @param resolver the ContentResolver to query.
+             * @throws RuntimeException if it fails to move contacts to the default account.
+             *
+             * @hide
+             */
+            @SystemApi
+            @FlaggedApi(Flags.FLAG_NEW_DEFAULT_ACCOUNT_API_ENABLED)
+            @RequiresPermission(allOf = {android.Manifest.permission.WRITE_CONTACTS,
+                    android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS})
+            public static void moveSimContactsToCloudDefaultAccount(
+                    @NonNull ContentResolver resolver) {
+                Bundle result = nullSafeCall(
+                        resolver,
+                        ContactsContract.AUTHORITY_URI,
+                        MOVE_SIM_CONTACTS_TO_CLOUD_DEFAULT_ACCOUNT_METHOD,
+                        /* arg= */ null,
+                        /* extras= */ null);
+            }
+
+            /**
+             * The method to invoke to get the number of {@link RawContacts} that are in local
+             * account(s) and movable to the Cloud Default Account (if any).
+             *
+             * @hide
+             */
+            public static final String GET_NUMBER_OF_MOVABLE_LOCAL_CONTACTS_METHOD =
+                    "getNumberOfMovableLocalContacts";
+
+            /**
+             * The result key for moving local {@link RawContacts} and {@link Groups} from SIM
+             * account(s) to the Cloud Default Account (if any).
+             *
+             * @hide
+             */
+            public static final String KEY_NUMBER_OF_MOVABLE_LOCAL_CONTACTS =
+                    "key_number_of_movable_local_contacts";
+
+            /**
+             * Gets the number of {@link RawContacts} in the local account(s) which may be moved
+             * using {@link DefaultAccount#moveLocalContactsToCloudDefaultAccount} (if any).
+             * @param resolver the ContentResolver to query.
+             * @return the number of {@link RawContacts} in the local account(s), or 0 if there is
+             * no Cloud Default Account.
+             * @throws RuntimeException if it fails get the number of movable local contacts.
+             *
+             * @hide
+             */
+            @SystemApi
+            @FlaggedApi(Flags.FLAG_NEW_DEFAULT_ACCOUNT_API_ENABLED)
+            @RequiresPermission(allOf = {android.Manifest.permission.READ_CONTACTS,
+                    android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS})
+            public static int getNumberOfMovableLocalContacts(
+                    @NonNull ContentResolver resolver) {
+                Bundle result = nullSafeCall(
+                        resolver,
+                        ContactsContract.AUTHORITY_URI,
+                        GET_NUMBER_OF_MOVABLE_LOCAL_CONTACTS_METHOD,
+                        /* arg= */ null,
+                        /* extras= */ null);
+                return result.getInt(KEY_NUMBER_OF_MOVABLE_LOCAL_CONTACTS,
+                        /* defaultValue= */ 0);
+            }
+
+            /**
+             * The method to invoke to get the number of {@link RawContacts} that are in SIM
+             * account(s) and movable to the Cloud Default Account (if any).
+             *
+             * @hide
+             */
+            public static final String GET_NUMBER_OF_MOVABLE_SIM_CONTACTS_METHOD =
+                    "getNumberOfMovableSimContacts";
+
+            /**
+             * The result key for moving local {@link RawContacts} and {@link Groups} from SIM
+             * account(s) to the Cloud Default Account (if any).
+             *
+             * @hide
+             */
+            public static final String KEY_NUMBER_OF_MOVABLE_SIM_CONTACTS =
+                    "key_number_of_movable_sim_contacts";
+
+            /**
+             * Gets the number of {@link RawContacts} in the SIM account(s) which may be moved using
+             * {@link DefaultAccount#moveSimContactsToCloudDefaultAccount} (if any).
+             * @param resolver the ContentResolver to query.
+             * @return the number of {@link RawContacts} in the SIM account(s), or 0 if there is
+             * no Cloud Default Account.
+             * @throws RuntimeException if it fails get the number of movable sim contacts.
+             *
+             * @hide
+             */
+            @SystemApi
+            @FlaggedApi(Flags.FLAG_NEW_DEFAULT_ACCOUNT_API_ENABLED)
+            @RequiresPermission(allOf = {android.Manifest.permission.READ_CONTACTS,
+                    android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS})
+            public static int getNumberOfMovableSimContacts(
+                    @NonNull ContentResolver resolver) {
+                Bundle result = nullSafeCall(
+                        resolver,
+                        ContactsContract.AUTHORITY_URI,
+                        GET_NUMBER_OF_MOVABLE_SIM_CONTACTS_METHOD,
+                        /* arg= */ null,
+                        /* extras= */ null);
+                return result.getInt(KEY_NUMBER_OF_MOVABLE_SIM_CONTACTS,
+                        /* defaultValue= */ 0);
+            }
+
         }
 
         /**
@@ -9055,30 +9367,6 @@
         public static final String KEY_DEFAULT_ACCOUNT = "key_default_account";
 
         /**
-         * Key in the Bundle for the default account state.
-         *
-         * @hide
-         */
-        public static final String KEY_DEFAULT_ACCOUNT_STATE =
-                "key_default_contacts_account_state";
-
-        /**
-         * The method to invoke in order to set the default account.
-         *
-         * @hide
-         */
-        public static final String SET_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD =
-                "setDefaultAccountForNewContacts";
-
-        /**
-         * The method to invoke in order to query the default account.
-         *
-         * @hide
-         */
-        public static final String QUERY_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD =
-                "queryDefaultAccountForNewContacts";
-
-        /**
          * Get the account that is set as the default account for new contacts, which should be
          * initially selected when creating a new contact on contact management apps.
          * If the setting has not been set by any app, it will return null. Once the setting
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index b8a8be1..1a15d09 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2092,23 +2092,6 @@
     public static final String ACTION_ZEN_MODE_SETTINGS = "android.settings.ZEN_MODE_SETTINGS";
 
     /**
-     * Activity Action: Show Zen Mode visual effects configuration settings.
-     *
-     * @hide
-     */
-    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
-    public static final String ZEN_MODE_BLOCKED_EFFECTS_SETTINGS =
-            "android.settings.ZEN_MODE_BLOCKED_EFFECTS_SETTINGS";
-
-    /**
-     * Activity Action: Show Zen Mode onboarding activity.
-     *
-     * @hide
-     */
-    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
-    public static final String ZEN_MODE_ONBOARDING = "android.settings.ZEN_MODE_ONBOARDING";
-
-    /**
      * Activity Action: Show Zen Mode (aka Do Not Disturb) priority configuration settings.
      */
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
@@ -2367,6 +2350,21 @@
             "android.settings.ALL_APPS_NOTIFICATION_SETTINGS_FOR_REVIEW";
 
     /**
+     * Activity Action: Show the permission screen for allowing apps to post promoted notifications.
+     * <p>
+     *     Input: {@link #EXTRA_APP_PACKAGE}, the package to display.
+     * <p>
+     * In some cases, a matching Activity may not exist, so ensure you
+     * safeguard against this.
+     * <p>
+     * Output: Nothing.
+     */
+    @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_APP_NOTIFICATION_PROMOTION_SETTINGS
+            = "android.settings.APP_NOTIFICATION_PROMOTION_SETTINGS";
+
+    /**
      * Activity Action: Show notification settings for a single app.
      * <p>
      *     Input: {@link #EXTRA_APP_PACKAGE}, the package to display.
@@ -8748,35 +8746,6 @@
         /** @hide */ public static final int ZEN_DURATION_FOREVER = 0;
 
         /**
-         * If nonzero, will show the zen upgrade notification when the user toggles DND on/off.
-         * @hide
-         */
-        @Readable
-        public static final String SHOW_ZEN_UPGRADE_NOTIFICATION = "show_zen_upgrade_notification";
-
-        /**
-         * If nonzero, will show the zen update settings suggestion.
-         * @hide
-         */
-        @Readable
-        public static final String SHOW_ZEN_SETTINGS_SUGGESTION = "show_zen_settings_suggestion";
-
-        /**
-         * If nonzero, zen has not been updated to reflect new changes.
-         * @hide
-         */
-        @Readable
-        public static final String ZEN_SETTINGS_UPDATED = "zen_settings_updated";
-
-        /**
-         * If nonzero, zen setting suggestion has been viewed by user
-         * @hide
-         */
-        @Readable
-        public static final String ZEN_SETTINGS_SUGGESTION_VIEWED =
-                "zen_settings_suggestion_viewed";
-
-        /**
          * Whether the in call notification is enabled to play sound during calls.  The value is
          * boolean (1 or 0).
          * @hide
@@ -10750,6 +10719,16 @@
                 "lock_screen_show_only_unseen_notifications";
 
         /**
+         * Indicates whether to minimalize the number of notifications to show on the lockscreen.
+         * <p>
+         * Type: int (0 for false, 1 for true)
+         *
+         * @hide
+         */
+        public static final String LOCK_SCREEN_NOTIFICATION_MINIMALISM =
+                "lock_screen_notification_minimalism";
+
+        /**
          * Indicates whether snooze options should be shown on notifications
          * <p>
          * Type: int (0 for false, 1 for true)
@@ -17834,12 +17813,6 @@
         public static final String FORCE_NON_DEBUGGABLE_FINAL_BUILD_FOR_COMPAT =
                 "force_non_debuggable_final_build_for_compat";
 
-        /**
-         * Flag to enable the use of ApplicationInfo for getting not-launched status.
-         *
-         * @hide
-         */
-        public static final String ENABLE_USE_APP_INFO_NOT_LAUNCHED = "use_app_info_not_launched";
 
         /**
          * Current version of signed configuration applied.
@@ -18062,10 +18035,6 @@
             MOVED_TO_SECURE = new HashSet<>(8);
             MOVED_TO_SECURE.add(Global.INSTALL_NON_MARKET_APPS);
             MOVED_TO_SECURE.add(Global.ZEN_DURATION);
-            MOVED_TO_SECURE.add(Global.SHOW_ZEN_UPGRADE_NOTIFICATION);
-            MOVED_TO_SECURE.add(Global.SHOW_ZEN_SETTINGS_SUGGESTION);
-            MOVED_TO_SECURE.add(Global.ZEN_SETTINGS_UPDATED);
-            MOVED_TO_SECURE.add(Global.ZEN_SETTINGS_SUGGESTION_VIEWED);
             MOVED_TO_SECURE.add(Global.CHARGING_SOUNDS_ENABLED);
             MOVED_TO_SECURE.add(Global.CHARGING_VIBRATION_ENABLED);
             MOVED_TO_SECURE.add(Global.NOTIFICATION_BUBBLES);
@@ -18900,40 +18869,6 @@
         @Readable
         public static final String SHOW_MUTE_IN_CRASH_DIALOG = "show_mute_in_crash_dialog";
 
-
-        /**
-         * If nonzero, will show the zen upgrade notification when the user toggles DND on/off.
-         * @hide
-         * @deprecated - Use {@link android.provider.Settings.Secure#SHOW_ZEN_UPGRADE_NOTIFICATION}
-         */
-        @Deprecated
-        public static final String SHOW_ZEN_UPGRADE_NOTIFICATION = "show_zen_upgrade_notification";
-
-        /**
-         * If nonzero, will show the zen update settings suggestion.
-         * @hide
-         * @deprecated - Use {@link android.provider.Settings.Secure#SHOW_ZEN_SETTINGS_SUGGESTION}
-         */
-        @Deprecated
-        public static final String SHOW_ZEN_SETTINGS_SUGGESTION = "show_zen_settings_suggestion";
-
-        /**
-         * If nonzero, zen has not been updated to reflect new changes.
-         * @deprecated - Use {@link android.provider.Settings.Secure#ZEN_SETTINGS_UPDATED}
-         * @hide
-         */
-        @Deprecated
-        public static final String ZEN_SETTINGS_UPDATED = "zen_settings_updated";
-
-        /**
-         * If nonzero, zen setting suggestion has been viewed by user
-         * @hide
-         * @deprecated - Use {@link android.provider.Settings.Secure#ZEN_SETTINGS_SUGGESTION_VIEWED}
-         */
-        @Deprecated
-        public static final String ZEN_SETTINGS_SUGGESTION_VIEWED =
-                "zen_settings_suggestion_viewed";
-
         /**
          * Backup and restore agent timeout parameters.
          * These parameters are represented by a comma-delimited key-value list.
@@ -20223,6 +20158,12 @@
             public static final int PHONE_SWITCHING_STATUS_IN_PROGRESS_MIGRATION_SUCCESS = 11;
 
             /**
+             * Phone switching has finished account match step.
+             * @hide
+             */
+            public static final int PHONE_SWITCHING_STATUS_ACCOUNTS_MATCHED = 12;
+
+            /**
              * Phone switching request source
              * @hide
              */
diff --git a/core/java/android/ranging/mock/RangingFrameworkInitializer.java b/core/java/android/ranging/mock/RangingFrameworkInitializer.java
new file mode 100644
index 0000000..540f519
--- /dev/null
+++ b/core/java/android/ranging/mock/RangingFrameworkInitializer.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2024 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 android.ranging;
+
+/**
+* Mock RangingFrameworkInitializer.
+*
+* @hide
+*/
+
+// TODO(b/331206299): Remove this after RANGING_STACK_ENABLED is ramped up to next.
+public final class RangingFrameworkInitializer {
+    private RangingFrameworkInitializer() {}
+    /**
+     * @hide
+     */
+    public static void registerServiceWrappers() {
+        // No-op.
+    }
+}
diff --git a/core/java/android/security/attestationverification/AttestationVerificationManager.java b/core/java/android/security/attestationverification/AttestationVerificationManager.java
index acf3382..ca4d417 100644
--- a/core/java/android/security/attestationverification/AttestationVerificationManager.java
+++ b/core/java/android/security/attestationverification/AttestationVerificationManager.java
@@ -79,9 +79,7 @@
      * is also associated with a particular connection.
      *
      * <p>The {@code callback} is called with a result and {@link VerificationToken} (which may be
-     * null). The result is an integer (see constants in this class with the prefix {@code RESULT_}.
-     * The result is {@link #RESULT_SUCCESS} when at least one verifier has passed its checks. The
-     * token may be used in calls to other parts of the system.
+     * null). The result is an integer (see constants in {@link VerificationResultFlags}).
      *
      * <p>It's expected that a verifier will be able to decode and understand the passed values,
      * otherwise fail to verify. {@code attestation} should contain some type data to prevent parse
@@ -108,7 +106,7 @@
             @NonNull Bundle requirements,
             @NonNull byte[] attestation,
             @NonNull @CallbackExecutor Executor executor,
-            @NonNull BiConsumer<@VerificationResult Integer, VerificationToken> callback) {
+            @NonNull BiConsumer<@VerificationResultFlags Integer, VerificationToken> callback) {
         try {
             AndroidFuture<IVerificationResult> resultCallback = new AndroidFuture<>();
             resultCallback.thenAccept(result -> {
@@ -155,7 +153,7 @@
      */
     @RequiresPermission(Manifest.permission.USE_ATTESTATION_VERIFICATION_SERVICE)
     @CheckResult
-    @VerificationResult
+    @VerificationResultFlags
     public int verifyToken(
             @NonNull AttestationProfile profile,
             @LocalBindingType int localBindingType,
@@ -280,30 +278,66 @@
      */
     public static final int TYPE_CHALLENGE = 3;
 
-    /** @hide */
-    @IntDef(
-            prefix = {"RESULT_"},
-            value = {
-                    RESULT_UNKNOWN,
-                    RESULT_SUCCESS,
-                    RESULT_FAILURE,
-            })
-    @Retention(RetentionPolicy.SOURCE)
+    /**
+     * Verification result returned from {@link #verifyAttestation}.
+     *
+     * A value of {@code 0} indicates success. Otherwise, a bit flag is set from first failing stage
+     * below:
+     * <ol>
+     * <li> The received attestation's integrity (e.g. the certificate signatures) is validated.
+     * If this fails, {@link #FLAG_FAILURE_CERTS} will be returned with all other bits unset.
+     * <li> The local binding requirements are checked. If this fails,
+     * {@link #FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS} is returned with all other bits unset.
+     * <li> The profile requirements are checked. If this fails, a bit flag will be returned with
+     * some of the these bits set to indicate the type of profile requirement failure:
+     * {@link #FLAG_FAILURE_UNSUPPORTED_PROFILE}, {@link #FLAG_FAILURE_KEYSTORE_REQUIREMENTS},
+     * {@link #FLAG_FAILURE_BOOT_STATE}, and {@link #FLAG_FAILURE_PATCH_LEVEL_DIFF}.
+     * </ol>
+     *
+     * Note: The reason of the failure must be not be provided to the remote device.
+     *
+     * @hide
+     */
+    @IntDef(flag = true, prefix = {"FLAG_FAILURE_"},
+    value = {
+            FLAG_FAILURE_UNKNOWN,
+            FLAG_FAILURE_UNSUPPORTED_PROFILE,
+            FLAG_FAILURE_CERTS,
+            FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS,
+            FLAG_FAILURE_KEYSTORE_REQUIREMENTS,
+            FLAG_FAILURE_BOOT_STATE,
+            FLAG_FAILURE_PATCH_LEVEL_DIFF,
+    })
     @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
-    public @interface VerificationResult {
-    }
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface VerificationResultFlags{}
 
-    /** The result of the verification is unknown because it has a value unknown to this SDK. */
-    public static final int RESULT_UNKNOWN = 0;
+    /** Flag: If there are unknown failures e.g. runtime exception. 0 = no, 1 = yes. */
+    public static final int FLAG_FAILURE_UNKNOWN = 1;
 
-    /** The result of the verification was successful. */
-    public static final int RESULT_SUCCESS = 1;
+    /** Flag: If the AVF profile is supported. 0 = supported, 1 = not supported */
+    public static final int FLAG_FAILURE_UNSUPPORTED_PROFILE = 1 << 1;
 
     /**
-     * The result of the attestation verification was failure. The attestation could not be
-     * verified.
+     * Flag: Result bit for certs verification e.g. loading, generating, parsing certs.
+     * 0 = success, 1 = failure
      */
-    public static final int RESULT_FAILURE = 2;
+    public static final int FLAG_FAILURE_CERTS = 1 << 2;
+
+    /** Flag: Result bit for local binding requirements verification. 0 = success, 1 = failure. */
+    public static final int FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS = 1 << 3;
+
+    /**
+     * Flag: Result bit for KeyStore requirements verification.
+     * 0 = success, 1 = failure.
+     */
+    public static final int FLAG_FAILURE_KEYSTORE_REQUIREMENTS = 1 << 4;
+
+    /** Flag: Result bit for boot state verification. 0 = success, 1 = failure */
+    public static final int FLAG_FAILURE_BOOT_STATE = 1 << 5;
+
+    /** Flag: Result bit for patch level diff checks. 0 = success, 1 = failure. */
+    public static final int FLAG_FAILURE_PATCH_LEVEL_DIFF = 1 << 6;
 
     /**
      * Requirements bundle parameter key for a public key, a byte array.
@@ -351,26 +385,4 @@
         }
         return text + "(" + localBindingType + ")";
     }
-
-    /** @hide */
-    public static String verificationResultCodeToString(@VerificationResult int resultCode) {
-        final String text;
-        switch (resultCode) {
-            case RESULT_UNKNOWN:
-                text = "UNKNOWN";
-                break;
-
-            case RESULT_SUCCESS:
-                text = "SUCCESS";
-                break;
-
-            case RESULT_FAILURE:
-                text = "FAILURE";
-                break;
-
-            default:
-                return Integer.toString(resultCode);
-        }
-        return text + "(" + resultCode + ")";
-    }
 }
diff --git a/core/java/android/security/attestationverification/AttestationVerificationService.java b/core/java/android/security/attestationverification/AttestationVerificationService.java
index 26c3051..01668d7 100644
--- a/core/java/android/security/attestationverification/AttestationVerificationService.java
+++ b/core/java/android/security/attestationverification/AttestationVerificationService.java
@@ -20,7 +20,7 @@
 import android.annotation.NonNull;
 import android.app.Service;
 import android.os.Bundle;
-import android.security.attestationverification.AttestationVerificationManager.VerificationResult;
+import android.security.attestationverification.AttestationVerificationManager.VerificationResultFlags;
 
 /**
  * A verifier which can be implemented by apps to verify an attestation (as described in {@link
@@ -93,7 +93,7 @@
      * byte[], java.util.concurrent.Executor, java.util.function.BiConsumer)
      */
     @CheckResult
-    @VerificationResult
+    @VerificationResultFlags
     public abstract int onVerifyPeerDeviceAttestation(
             @NonNull Bundle requirements,
             @NonNull byte[] attestation);
diff --git a/core/java/android/security/attestationverification/VerificationToken.java b/core/java/android/security/attestationverification/VerificationToken.java
index ae26823..015010c5 100644
--- a/core/java/android/security/attestationverification/VerificationToken.java
+++ b/core/java/android/security/attestationverification/VerificationToken.java
@@ -21,7 +21,7 @@
 import android.os.Bundle;
 import android.os.Parcelable;
 import android.security.attestationverification.AttestationVerificationManager.LocalBindingType;
-import android.security.attestationverification.AttestationVerificationManager.VerificationResult;
+import android.security.attestationverification.AttestationVerificationManager.VerificationResultFlags;
 
 import com.android.internal.util.DataClass;
 import com.android.internal.util.Parcelling;
@@ -41,10 +41,6 @@
  * @hide
  * @see Bundle#putParcelable(String, Parcelable)
  */
-@DataClass(
-        genConstructor = false,
-        genHiddenBuilder = true
-)
 public final class VerificationToken implements Parcelable {
 
     /**
@@ -69,17 +65,18 @@
     private final Bundle mRequirements;
 
     /**
-     * The result of the {@link AttestationVerificationManager#verifyAttestation(int, int, Bundle,
-     * byte[], Executor, BiConsumer)} call. This value is kept hidden to prevent token holders from
-     * accidentally reading this value without calling {@code verifyToken}. Do <b>not</b> use this
-     * value directly; call {@link AttestationVerificationManager#verifyToken(VerificationToken,
-     * Duration)} to verify a valid token and it will return this value.
+     * The result of the {@link AttestationVerificationManager#verifyAttestation(AttestationProfile,
+     * int, Bundle, byte[], Executor, BiConsumer)} call. This value is kept hidden to prevent token
+     * holders from accidentally reading this value without calling {@code verifyToken}. Do
+     * <b>not</b> use this value directly; call {@link AttestationVerificationManager#verifyToken(
+     * AttestationProfile, int, Bundle, VerificationToken, Duration)} to verify a valid token and it
+     * will return this value.
      *
      * If the token is valid, this value is returned directly by {#verifyToken}.
      *
      * @hide
      */
-    @VerificationResult
+    @VerificationResultFlags
     private final int mVerificationResult;
 
     /**
@@ -111,28 +108,13 @@
     private int mUid;
 
 
-    // Code below generated by codegen v1.0.23.
-    //
-    // DO NOT MODIFY!
-    // CHECKSTYLE:OFF Generated code
-    //
-    // To regenerate run:
-    // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/security/attestationverification/VerificationToken.java
-    //
-    // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
-    //   Settings > Editor > Code Style > Formatter Control
-    //@formatter:off
-
-
-    @DataClass.Generated.Member
-    /* package-private */ VerificationToken(
+    VerificationToken(
             @NonNull AttestationProfile attestationProfile,
             @LocalBindingType int localBindingType,
             @NonNull Bundle requirements,
-            @VerificationResult int verificationResult,
+            @VerificationResultFlags int verificationResult,
             @NonNull java.time.Instant verificationTime,
-            @NonNull byte[] hmac,
-            int uid) {
+            @NonNull byte[] hmac) {
         this.mAttestationProfile = attestationProfile;
         com.android.internal.util.AnnotationValidations.validate(
                 NonNull.class, null, mAttestationProfile);
@@ -144,62 +126,61 @@
                 NonNull.class, null, mRequirements);
         this.mVerificationResult = verificationResult;
         com.android.internal.util.AnnotationValidations.validate(
-                VerificationResult.class, null, mVerificationResult);
+                VerificationResultFlags.class, null, mVerificationResult);
         this.mVerificationTime = verificationTime;
         com.android.internal.util.AnnotationValidations.validate(
                 NonNull.class, null, mVerificationTime);
         this.mHmac = hmac;
         com.android.internal.util.AnnotationValidations.validate(
                 NonNull.class, null, mHmac);
-        this.mUid = uid;
-
-        // onConstructed(); // You can define this method to get a callback
     }
 
     /**
      * The attestation profile which was used to perform the verification.
+     *
+     * @hide
      */
-    @DataClass.Generated.Member
     public @NonNull AttestationProfile getAttestationProfile() {
         return mAttestationProfile;
     }
 
     /**
      * The local binding type of the local binding data used to perform the verification.
+     *
+     * @hide
      */
-    @DataClass.Generated.Member
     public @LocalBindingType int getLocalBindingType() {
         return mLocalBindingType;
     }
 
     /**
      * The requirements used to perform the verification.
+     *
+     * @hide
      */
-    @DataClass.Generated.Member
     public @NonNull Bundle getRequirements() {
         return mRequirements;
     }
 
     /**
-     * The result of the {@link AttestationVerificationManager#verifyAttestation(int, int, Bundle,
-     * byte[], Executor, BiConsumer)} call. This value is kept hidden to prevent token holders from
-     * accidentally reading this value without calling {@code verifyToken}. Do <b>not</b> use this
-     * value directly; call {@link AttestationVerificationManager#verifyToken(VerificationToken,
-     * Duration)} to verify a valid token and it will return this value.
+     * The result of the {@link AttestationVerificationManager#verifyAttestation(AttestationProfile,
+     * int, Bundle, byte[], Executor, BiConsumer)} call. This value is kept hidden to prevent token
+     * holders from accidentally reading this value without calling {@code verifyToken}. Do
+     * <b>not</b> use this value directly; call {@link AttestationVerificationManager#verifyToken(
+     * AttestationProfile, int, Bundle, VerificationToken, Duration)} to verify a valid token and it
+     * will return this value.
      *
      * If the token is valid, this value is returned directly by {#verifyToken}.
      *
      * @hide
      */
-    @DataClass.Generated.Member
-    public @VerificationResult int getVerificationResult() {
+    public @VerificationResultFlags int getVerificationResult() {
         return mVerificationResult;
     }
 
     /**
      * Time when the token was generated, set by the system.
      */
-    @DataClass.Generated.Member
     public @NonNull java.time.Instant getVerificationTime() {
         return mVerificationTime;
     }
@@ -212,25 +193,10 @@
      *
      * @hide
      */
-    @DataClass.Generated.Member
     public @NonNull byte[] getHmac() {
         return mHmac;
     }
 
-    /**
-     * The UID of the process which called {@code verifyAttestation} to create the token, as
-     * returned by {@link Binder#getCallingUid()}. Calls to {@code verifyToken} will fail if the UID
-     * of calling process does not match this value. This ensures that tokens cannot be shared
-     * between UIDs.
-     *
-     * @hide
-     */
-    @DataClass.Generated.Member
-    public int getUid() {
-        return mUid;
-    }
-
-    @DataClass.Generated.Member
     static Parcelling<java.time.Instant> sParcellingForVerificationTime =
             Parcelling.Cache.get(
                     ForInstant.class);
@@ -242,7 +208,6 @@
     }
 
     @Override
-    @DataClass.Generated.Member
     public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
         // You can override field parcelling by defining methods like:
         // void parcelFieldName(Parcel dest, int flags) { ... }
@@ -253,27 +218,24 @@
         dest.writeInt(mVerificationResult);
         sParcellingForVerificationTime.parcel(mVerificationTime, dest, flags);
         dest.writeByteArray(mHmac);
-        dest.writeInt(mUid);
     }
 
     @Override
-    @DataClass.Generated.Member
     public int describeContents() { return 0; }
 
     /** @hide */
     @SuppressWarnings({"unchecked", "RedundantCast"})
-    @DataClass.Generated.Member
-    /* package-private */ VerificationToken(@NonNull android.os.Parcel in) {
+    VerificationToken(@NonNull android.os.Parcel in) {
         // You can override field unparcelling by defining methods like:
         // static FieldType unparcelFieldName(Parcel in) { ... }
 
-        AttestationProfile attestationProfile = (AttestationProfile) in.readTypedObject(AttestationProfile.CREATOR);
+        AttestationProfile attestationProfile = (AttestationProfile) in.readTypedObject(
+                AttestationProfile.CREATOR);
         int localBindingType = in.readInt();
         Bundle requirements = in.readBundle();
         int verificationResult = in.readInt();
         java.time.Instant verificationTime = sParcellingForVerificationTime.unparcel(in);
         byte[] hmac = in.createByteArray();
-        int uid = in.readInt();
 
         this.mAttestationProfile = attestationProfile;
         com.android.internal.util.AnnotationValidations.validate(
@@ -286,19 +248,15 @@
                 NonNull.class, null, mRequirements);
         this.mVerificationResult = verificationResult;
         com.android.internal.util.AnnotationValidations.validate(
-                VerificationResult.class, null, mVerificationResult);
+                VerificationResultFlags.class, null, mVerificationResult);
         this.mVerificationTime = verificationTime;
         com.android.internal.util.AnnotationValidations.validate(
                 NonNull.class, null, mVerificationTime);
         this.mHmac = hmac;
         com.android.internal.util.AnnotationValidations.validate(
                 NonNull.class, null, mHmac);
-        this.mUid = uid;
-
-        // onConstructed(); // You can define this method to get a callback
     }
 
-    @DataClass.Generated.Member
     public static final @NonNull Parcelable.Creator<VerificationToken> CREATOR
             = new Parcelable.Creator<VerificationToken>() {
         @Override
@@ -317,16 +275,14 @@
      * @hide
      */
     @SuppressWarnings("WeakerAccess")
-    @DataClass.Generated.Member
     public static final class Builder {
 
         private @NonNull AttestationProfile mAttestationProfile;
         private @LocalBindingType int mLocalBindingType;
         private @NonNull Bundle mRequirements;
-        private @VerificationResult int mVerificationResult;
+        private @VerificationResultFlags int mVerificationResult;
         private @NonNull java.time.Instant mVerificationTime;
         private @NonNull byte[] mHmac;
-        private int mUid;
 
         private long mBuilderFieldsSet = 0L;
 
@@ -340,34 +296,29 @@
          * @param requirements
          *   The requirements used to perform the verification.
          * @param verificationResult
-         *   The result of the {@link AttestationVerificationManager#verifyAttestation(int, int, Bundle,
-         *   byte[], Executor, BiConsumer)} call. This value is kept hidden to prevent token holders from
-         *   accidentally reading this value without calling {@code verifyToken}. Do <b>not</b> use this
-         *   value directly; call {@link AttestationVerificationManager#verifyToken(VerificationToken,
-         *   Duration)} to verify a valid token and it will return this value.
+         *   The result of the {@link AttestationVerificationManager#verifyAttestation(
+         *   AttestationProfile, int, Bundle, byte[], Executor, BiConsumer)} call. This value is
+         *   kept hidden to prevent token holders from accidentally reading this value without
+         *   calling {@code verifyToken}. Do <b>not</b> use this value directly; call {@link
+         *   AttestationVerificationManager#verifyToken(AttestationProfile, int, Bundle,
+         *   VerificationToken, Duration)} to verify a valid token and it will return this value.
          *
          *   If the token is valid, this value is returned directly by {#verifyToken}.
          * @param verificationTime
          *   Time when the token was generated, set by the system.
          * @param hmac
-         *   A Hash-based message authentication code used to verify the contents and authenticity of the
-         *   rest of the token. The hash is created using a secret key known only to the system server.
-         *   When verifying the token, the system re-hashes the token and verifies the generated HMAC is
-         *   the same.
-         * @param uid
-         *   The UID of the process which called {@code verifyAttestation} to create the token, as
-         *   returned by {@link Binder#getCallingUid()}. Calls to {@code verifyToken} will fail if the UID
-         *   of calling process does not match this value. This ensures that tokens cannot be shared
-         *   between UIDs.
+         *   A Hash-based message authentication code used to verify the contents and authenticity
+         *   of the rest of the token. The hash is created using a secret key known only to the
+         *   system server. When verifying the token, the system re-hashes the token and verifies
+         *   the generated HMAC is the same.
          */
         public Builder(
                 @NonNull AttestationProfile attestationProfile,
                 @LocalBindingType int localBindingType,
                 @NonNull Bundle requirements,
-                @VerificationResult int verificationResult,
+                @VerificationResultFlags int verificationResult,
                 @NonNull java.time.Instant verificationTime,
-                @NonNull byte[] hmac,
-                int uid) {
+                @NonNull byte[] hmac) {
             mAttestationProfile = attestationProfile;
             com.android.internal.util.AnnotationValidations.validate(
                     NonNull.class, null, mAttestationProfile);
@@ -379,20 +330,20 @@
                     NonNull.class, null, mRequirements);
             mVerificationResult = verificationResult;
             com.android.internal.util.AnnotationValidations.validate(
-                    VerificationResult.class, null, mVerificationResult);
+                    VerificationResultFlags.class, null, mVerificationResult);
             mVerificationTime = verificationTime;
             com.android.internal.util.AnnotationValidations.validate(
                     NonNull.class, null, mVerificationTime);
             mHmac = hmac;
             com.android.internal.util.AnnotationValidations.validate(
                     NonNull.class, null, mHmac);
-            mUid = uid;
         }
 
         /**
          * The attestation profile which was used to perform the verification.
+         *
+         * @hide
          */
-        @DataClass.Generated.Member
         public @NonNull Builder setAttestationProfile(@NonNull AttestationProfile value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x1;
@@ -402,8 +353,9 @@
 
         /**
          * The local binding type of the local binding data used to perform the verification.
+         *
+         * @hide
          */
-        @DataClass.Generated.Member
         public @NonNull Builder setLocalBindingType(@LocalBindingType int value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x2;
@@ -413,8 +365,9 @@
 
         /**
          * The requirements used to perform the verification.
+         *
+         * @hide
          */
-        @DataClass.Generated.Member
         public @NonNull Builder setRequirements(@NonNull Bundle value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x4;
@@ -423,18 +376,18 @@
         }
 
         /**
-         * The result of the {@link AttestationVerificationManager#verifyAttestation(int, int, Bundle,
-         * byte[], Executor, BiConsumer)} call. This value is kept hidden to prevent token holders from
-         * accidentally reading this value without calling {@code verifyToken}. Do <b>not</b> use this
-         * value directly; call {@link AttestationVerificationManager#verifyToken(VerificationToken,
-         * Duration)} to verify a valid token and it will return this value.
+         * The result of the {@link AttestationVerificationManager#verifyAttestation(
+         * AttestationProfile, int, Bundle, byte[], Executor, BiConsumer)} call. This value is kept
+         * hidden to prevent token holders from accidentally reading this value without calling
+         * {@code verifyToken}. Do <b>not</b> use this value directly; call {@link
+         * AttestationVerificationManager#verifyToken(AttestationProfile, int, Bundle,
+         * VerificationToken, Duration)} to verify a valid token and it will return this value.
          *
          * If the token is valid, this value is returned directly by {#verifyToken}.
          *
          * @hide
          */
-        @DataClass.Generated.Member
-        public @NonNull Builder setVerificationResult(@VerificationResult int value) {
+        public @NonNull Builder setVerificationResult(@VerificationResultFlags int value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x8;
             mVerificationResult = value;
@@ -444,7 +397,6 @@
         /**
          * Time when the token was generated, set by the system.
          */
-        @DataClass.Generated.Member
         public @NonNull Builder setVerificationTime(@NonNull java.time.Instant value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x10;
@@ -453,14 +405,13 @@
         }
 
         /**
-         * A Hash-based message authentication code used to verify the contents and authenticity of the
-         * rest of the token. The hash is created using a secret key known only to the system server.
-         * When verifying the token, the system re-hashes the token and verifies the generated HMAC is
-         * the same.
+         * A Hash-based message authentication code used to verify the contents and authenticity of
+         * the rest of the token. The hash is created using a secret key known only to the system
+         * server. When verifying the token, the system re-hashes the token and verifies the
+         * generated HMAC is the same.
          *
          * @hide
          */
-        @DataClass.Generated.Member
         public @NonNull Builder setHmac(@NonNull byte... value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x20;
@@ -468,26 +419,10 @@
             return this;
         }
 
-        /**
-         * The UID of the process which called {@code verifyAttestation} to create the token, as
-         * returned by {@link Binder#getCallingUid()}. Calls to {@code verifyToken} will fail if the UID
-         * of calling process does not match this value. This ensures that tokens cannot be shared
-         * between UIDs.
-         *
-         * @hide
-         */
-        @DataClass.Generated.Member
-        public @NonNull Builder setUid(int value) {
-            checkNotUsed();
-            mBuilderFieldsSet |= 0x40;
-            mUid = value;
-            return this;
-        }
-
         /** Builds the instance. This builder should not be touched after calling this! */
         public @NonNull VerificationToken build() {
             checkNotUsed();
-            mBuilderFieldsSet |= 0x80; // Mark builder used
+            mBuilderFieldsSet |= 0x40; // Mark builder used
 
             VerificationToken o = new VerificationToken(
                     mAttestationProfile,
@@ -495,29 +430,15 @@
                     mRequirements,
                     mVerificationResult,
                     mVerificationTime,
-                    mHmac,
-                    mUid);
+                    mHmac);
             return o;
         }
 
         private void checkNotUsed() {
-            if ((mBuilderFieldsSet & 0x80) != 0) {
+            if ((mBuilderFieldsSet & 0x40) != 0) {
                 throw new IllegalStateException(
                         "This Builder should not be reused. Use a new Builder instance instead");
             }
         }
     }
-
-    @DataClass.Generated(
-            time = 1633629747234L,
-            codegenVersion = "1.0.23",
-            sourceFile = "frameworks/base/core/java/android/security/attestationverification/VerificationToken.java",
-            inputSignatures = "private final @android.annotation.NonNull android.security.attestationverification.AttestationProfile mAttestationProfile\nprivate final @android.security.attestationverification.AttestationVerificationManager.LocalBindingType int mLocalBindingType\nprivate final @android.annotation.NonNull android.os.Bundle mRequirements\nprivate final  @android.security.attestationverification.AttestationVerificationManager.VerificationResult int mVerificationResult\nprivate final @android.annotation.NonNull @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInstant.class) java.time.Instant mVerificationTime\nprivate final @android.annotation.NonNull byte[] mHmac\nprivate  int mUid\nclass VerificationToken extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genHiddenBuilder=true)")
-    @Deprecated
-    private void __metadata() {}
-
-
-    //@formatter:on
-    // End of generated code
-
 }
diff --git a/core/java/android/security/flags.aconfig b/core/java/android/security/flags.aconfig
index a86c961..aedf8e0 100644
--- a/core/java/android/security/flags.aconfig
+++ b/core/java/android/security/flags.aconfig
@@ -106,3 +106,10 @@
     description: "Clear StrongAuth on add credential"
     bug: "320817991"
 }
+
+flag {
+    name: "afl_api"
+    namespace: "platform_security"
+    description: "AFL feature"
+    bug: "365994454"
+}
diff --git a/core/java/android/security/responsible_apis_flags.aconfig b/core/java/android/security/responsible_apis_flags.aconfig
index 45e9def..5457bbe 100644
--- a/core/java/android/security/responsible_apis_flags.aconfig
+++ b/core/java/android/security/responsible_apis_flags.aconfig
@@ -24,6 +24,17 @@
 }
 
 flag {
+  name: "asm_reintroduce_grace_period"
+  namespace: "responsible_apis"
+  description: "Allow launches within the grace period for ASM apps"
+  bug: "367702727"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
+
+
+flag {
     name: "content_uri_permission_apis"
     is_exported: true
     namespace: "responsible_apis"
diff --git a/core/java/android/service/carrier/CarrierMessagingServiceWrapper.java b/core/java/android/service/carrier/CarrierMessagingServiceWrapper.java
index de2c6f77..afff8fe 100644
--- a/core/java/android/service/carrier/CarrierMessagingServiceWrapper.java
+++ b/core/java/android/service/carrier/CarrierMessagingServiceWrapper.java
@@ -20,6 +20,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
+import android.app.ActivityManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -28,8 +29,10 @@
 import android.os.Binder;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.os.UserHandle;
 import android.telephony.SmsMessage;
 
+import com.android.internal.telephony.flags.Flags;
 import com.android.internal.util.Preconditions;
 
 import java.util.List;
@@ -91,8 +94,12 @@
         mOnServiceReadyCallback = onServiceReadyCallback;
         mServiceReadyCallbackExecutor = executor;
         mContext = context;
-        return context.bindService(intent, mCarrierMessagingServiceConnection,
-                Context.BIND_AUTO_CREATE);
+        return Flags.supportCarrierServicesForHsum()
+                ? context.bindServiceAsUser(intent, mCarrierMessagingServiceConnection,
+                Context.BIND_AUTO_CREATE,
+                UserHandle.of(ActivityManager.getCurrentUser()))
+                : context.bindService(intent, mCarrierMessagingServiceConnection,
+                        Context.BIND_AUTO_CREATE);
     }
 
     /**
diff --git a/core/java/android/service/chooser/ChooserResult.java b/core/java/android/service/chooser/ChooserResult.java
index 2d56ec7..9e6c4ff 100644
--- a/core/java/android/service/chooser/ChooserResult.java
+++ b/core/java/android/service/chooser/ChooserResult.java
@@ -16,7 +16,6 @@
 
 package android.service.chooser;
 
-import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -41,7 +40,6 @@
  *
  * @see Intent#EXTRA_CHOOSER_RESULT_INTENT_SENDER
  */
-@FlaggedApi(android.service.chooser.Flags.FLAG_ENABLE_CHOOSER_RESULT)
 public final class ChooserResult implements Parcelable {
 
     /**
diff --git a/core/java/android/service/notification/NotificationAssistantService.java b/core/java/android/service/notification/NotificationAssistantService.java
index 48d7cf7..7b7058e 100644
--- a/core/java/android/service/notification/NotificationAssistantService.java
+++ b/core/java/android/service/notification/NotificationAssistantService.java
@@ -393,6 +393,23 @@
         }
     }
 
+    /**
+     * Informs the notification manager about what {@link Adjustment Adjustments} are supported by
+     * this NAS.
+     *
+     * For backwards compatibility, we assume all Adjustment types are supported by the NAS.
+     */
+    @FlaggedApi(Flags.FLAG_NOTIFICATION_CLASSIFICATION)
+    public final void setAdjustmentTypeSupportedState(@NonNull @Adjustment.Keys String key,
+            boolean supported) {
+        if (!isBound()) return;
+        try {
+            getNotificationInterface().setAdjustmentTypeSupportedState(mWrapper, key, supported);
+        } catch (android.os.RemoteException ex) {
+            Log.v(TAG, "Unable to contact notification manager", ex);
+        }
+    }
+
     private class NotificationAssistantServiceWrapper extends NotificationListenerWrapper {
         @Override
         public void onNotificationEnqueuedWithChannel(IStatusBarNotificationHolder sbnHolder,
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index 303197d..e173255 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -1079,9 +1079,12 @@
                         // in ensureManualZenRule() and setManualZenMode().
                         rt.manualRule.pkg = PACKAGE_ANDROID;
                         rt.manualRule.type = AutomaticZenRule.TYPE_OTHER;
-                        rt.manualRule.condition = new Condition(
-                                rt.manualRule.conditionId != null ? rt.manualRule.conditionId
-                                        : Uri.EMPTY, "", Condition.STATE_TRUE);
+                        // conditionId in rule must match condition.id to pass isValidManualRule().
+                        if (rt.manualRule.conditionId == null) {
+                            rt.manualRule.conditionId = Uri.EMPTY;
+                        }
+                        rt.manualRule.condition = new Condition(rt.manualRule.conditionId, "",
+                                Condition.STATE_TRUE);
                     }
                 }
                 return rt;
diff --git a/core/java/android/service/notification/ZenModeDiff.java b/core/java/android/service/notification/ZenModeDiff.java
index 60a7d6b..c9f4647 100644
--- a/core/java/android/service/notification/ZenModeDiff.java
+++ b/core/java/android/service/notification/ZenModeDiff.java
@@ -16,6 +16,7 @@
 
 package android.service.notification;
 
+import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.Nullable;
 import android.app.Flags;
@@ -24,6 +25,7 @@
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.LinkedHashMap;
 import java.util.Objects;
 import java.util.Set;
 
@@ -62,6 +64,7 @@
     public static class FieldDiff<T> {
         private final T mFrom;
         private final T mTo;
+        private final BaseDiff mDetailedDiff;
 
         /**
          * Constructor to create a FieldDiff object with the given values.
@@ -71,6 +74,19 @@
         public FieldDiff(@Nullable T from, @Nullable T to) {
             mFrom = from;
             mTo = to;
+            mDetailedDiff = null;
+        }
+
+        /**
+         * Constructor to create a FieldDiff object with the given values, and that has a
+         * detailed BaseDiff.
+         * @param from from (old) value
+         * @param to to (new) value
+         */
+        public FieldDiff(@Nullable T from, @Nullable T to, @Nullable BaseDiff detailedDiff) {
+            mFrom = from;
+            mTo = to;
+            mDetailedDiff = detailedDiff;
         }
 
         /**
@@ -92,6 +108,9 @@
          */
         @Override
         public String toString() {
+            if (mDetailedDiff != null) {
+                return mDetailedDiff.toString();
+            }
             return mFrom + "->" + mTo;
         }
 
@@ -99,6 +118,9 @@
          * Returns whether this represents an actual diff.
          */
         public boolean hasDiff() {
+            if (mDetailedDiff != null) {
+                return mDetailedDiff.hasDiff();
+            }
             // note that Objects.equals handles null values gracefully.
             return !Objects.equals(mFrom, mTo);
         }
@@ -114,7 +136,8 @@
         @ExistenceChange private int mExists = NONE;
 
         // Map from field name to diffs for any standalone fields in the object.
-        private ArrayMap<String, FieldDiff> mFields = new ArrayMap<>();
+        // LinkedHashMap is specifically chosen here to show insertion order when keys are fetched.
+        private LinkedHashMap<String, FieldDiff> mFields = new LinkedHashMap<>();
 
         // Functions for actually diffing objects and string representations have to be implemented
         // by subclasses.
@@ -549,8 +572,16 @@
             if (!Objects.equals(from.enabler, to.enabler)) {
                 addField(FIELD_ENABLER, new FieldDiff<>(from.enabler, to.enabler));
             }
-            if (!Objects.equals(from.zenPolicy, to.zenPolicy)) {
-                addField(FIELD_ZEN_POLICY, new FieldDiff<>(from.zenPolicy, to.zenPolicy));
+            if (android.app.Flags.modesApi()) {
+                PolicyDiff policyDiff = new PolicyDiff(from.zenPolicy, to.zenPolicy);
+                if (policyDiff.hasDiff()) {
+                    addField(FIELD_ZEN_POLICY, new FieldDiff<>(from.zenPolicy, to.zenPolicy,
+                            policyDiff));
+                }
+            } else {
+                if (!Objects.equals(from.zenPolicy, to.zenPolicy)) {
+                    addField(FIELD_ZEN_POLICY, new FieldDiff<>(from.zenPolicy, to.zenPolicy));
+                }
             }
             if (from.modified != to.modified) {
                 addField(FIELD_MODIFIED, new FieldDiff<>(from.modified, to.modified));
@@ -559,9 +590,12 @@
                 addField(FIELD_PKG, new FieldDiff<>(from.pkg, to.pkg));
             }
             if (android.app.Flags.modesApi()) {
-                if (!Objects.equals(from.zenDeviceEffects, to.zenDeviceEffects)) {
+                DeviceEffectsDiff deviceEffectsDiff = new DeviceEffectsDiff(from.zenDeviceEffects,
+                        to.zenDeviceEffects);
+                if (deviceEffectsDiff.hasDiff()) {
                     addField(FIELD_ZEN_DEVICE_EFFECTS,
-                            new FieldDiff<>(from.zenDeviceEffects, to.zenDeviceEffects));
+                            new FieldDiff<>(from.zenDeviceEffects, to.zenDeviceEffects,
+                                    deviceEffectsDiff));
                 }
                 if (!Objects.equals(from.triggerDescription, to.triggerDescription)) {
                     addField(FIELD_TRIGGER_DESCRIPTION,
@@ -629,7 +663,7 @@
 
                 sb.append(key);
                 sb.append(":");
-                sb.append(diff);
+                sb.append(diff.toString());
             }
 
             if (becameActive()) {
@@ -663,4 +697,338 @@
             return mActiveDiff != null && !mActiveDiff.to();
         }
     }
+
+    /**
+     * Diff class representing a change between two
+     * {@link android.service.notification.ZenDeviceEffects}.
+     */
+    @FlaggedApi(Flags.FLAG_MODES_API)
+    public static class DeviceEffectsDiff extends BaseDiff {
+        public static final String FIELD_GRAYSCALE = "mGrayscale";
+        public static final String FIELD_SUPPRESS_AMBIENT_DISPLAY = "mSuppressAmbientDisplay";
+        public static final String FIELD_DIM_WALLPAPER = "mDimWallpaper";
+        public static final String FIELD_NIGHT_MODE = "mNightMode";
+        public static final String FIELD_DISABLE_AUTO_BRIGHTNESS = "mDisableAutoBrightness";
+        public static final String FIELD_DISABLE_TAP_TO_WAKE = "mDisableTapToWake";
+        public static final String FIELD_DISABLE_TILT_TO_WAKE = "mDisableTiltToWake";
+        public static final String FIELD_DISABLE_TOUCH = "mDisableTouch";
+        public static final String FIELD_MINIMIZE_RADIO_USAGE = "mMinimizeRadioUsage";
+        public static final String FIELD_MAXIMIZE_DOZE = "mMaximizeDoze";
+        public static final String FIELD_EXTRA_EFFECTS = "mExtraEffects";
+        // NOTE: new field strings must match the variable names in ZenDeviceEffects
+
+        /**
+         * Create a DeviceEffectsDiff representing the difference between two ZenDeviceEffects
+         * objects.
+         * @param from previous ZenDeviceEffects
+         * @param to new ZenDeviceEffects
+         * @return The diff between the two given ZenDeviceEffects
+         */
+        public DeviceEffectsDiff(ZenDeviceEffects from, ZenDeviceEffects to) {
+            super(from, to);
+            // Short-circuit the both-null case
+            if (from == null && to == null) {
+                return;
+            }
+            if (hasExistenceChange()) {
+                // either added or removed; return here. otherwise (they're not both null) there's
+                // field diffs.
+                return;
+            }
+
+            // Compare all fields, knowing there's some diff and that neither is null.
+            if (from.shouldDisplayGrayscale() != to.shouldDisplayGrayscale()) {
+                addField(FIELD_GRAYSCALE, new FieldDiff<>(from.shouldDisplayGrayscale(),
+                        to.shouldDisplayGrayscale()));
+            }
+            if (from.shouldSuppressAmbientDisplay() != to.shouldSuppressAmbientDisplay()) {
+                addField(FIELD_SUPPRESS_AMBIENT_DISPLAY,
+                        new FieldDiff<>(from.shouldSuppressAmbientDisplay(),
+                                to.shouldSuppressAmbientDisplay()));
+            }
+            if (from.shouldDimWallpaper() != to.shouldDimWallpaper()) {
+                addField(FIELD_DIM_WALLPAPER, new FieldDiff<>(from.shouldDimWallpaper(),
+                        to.shouldDimWallpaper()));
+            }
+            if (from.shouldUseNightMode() != to.shouldUseNightMode()) {
+                addField(FIELD_NIGHT_MODE, new FieldDiff<>(from.shouldUseNightMode(),
+                        to.shouldUseNightMode()));
+            }
+            if (from.shouldDisableAutoBrightness() != to.shouldDisableAutoBrightness()) {
+                addField(FIELD_DISABLE_AUTO_BRIGHTNESS,
+                        new FieldDiff<>(from.shouldDisableAutoBrightness(),
+                                to.shouldDisableAutoBrightness()));
+            }
+            if (from.shouldDisableTapToWake() != to.shouldDisableTapToWake()) {
+                addField(FIELD_DISABLE_TAP_TO_WAKE, new FieldDiff<>(from.shouldDisableTapToWake(),
+                        to.shouldDisableTapToWake()));
+            }
+            if (from.shouldDisableTiltToWake() != to.shouldDisableTiltToWake()) {
+                addField(FIELD_DISABLE_TILT_TO_WAKE,
+                        new FieldDiff<>(from.shouldDisableTiltToWake(),
+                                to.shouldDisableTiltToWake()));
+            }
+            if (from.shouldDisableTouch() != to.shouldDisableTouch()) {
+                addField(FIELD_DISABLE_TOUCH, new FieldDiff<>(from.shouldDisableTouch(),
+                        to.shouldDisableTouch()));
+            }
+            if (from.shouldMinimizeRadioUsage() != to.shouldMinimizeRadioUsage()) {
+                addField(FIELD_MINIMIZE_RADIO_USAGE,
+                        new FieldDiff<>(from.shouldMinimizeRadioUsage(),
+                                to.shouldMinimizeRadioUsage()));
+            }
+            if (from.shouldMaximizeDoze() != to.shouldMaximizeDoze()) {
+                addField(FIELD_MAXIMIZE_DOZE, new FieldDiff<>(from.shouldMaximizeDoze(),
+                        to.shouldMaximizeDoze()));
+            }
+            if (!Objects.equals(from.getExtraEffects(), to.getExtraEffects())) {
+                addField(FIELD_EXTRA_EFFECTS, new FieldDiff<>(from.getExtraEffects(),
+                        to.getExtraEffects()));
+            }
+        }
+
+        /**
+         * Returns whether this object represents an actual diff.
+         */
+        @Override
+        public boolean hasDiff() {
+            return hasExistenceChange() || hasFieldDiffs();
+        }
+
+        @Override
+        public String toString() {
+            final StringBuilder sb = new StringBuilder("ZenDeviceEffectsDiff{");
+            if (!hasDiff()) {
+                sb.append("no changes");
+            }
+
+            // If added or deleted, we just append that.
+            if (hasExistenceChange()) {
+                if (wasAdded()) {
+                    sb.append("added");
+                } else if (wasRemoved()) {
+                    sb.append("removed");
+                }
+            }
+
+            // Append all of the individual field diffs
+            boolean first = true;
+            for (String key : fieldNamesWithDiff()) {
+                FieldDiff diff = getDiffForField(key);
+                if (diff == null) {
+                    // The diff should not have null diffs added, but we add this to be defensive.
+                    continue;
+                }
+                if (first) {
+                    first = false;
+                } else {
+                    sb.append(", ");
+                }
+
+                sb.append(key);
+                sb.append(":");
+                sb.append(diff);
+            }
+
+            return sb.append("}").toString();
+        }
+    }
+
+    /**
+     * Diff class representing a change between two {@link android.service.notification.ZenPolicy}.
+     */
+    @FlaggedApi(Flags.FLAG_MODES_API)
+    public static class PolicyDiff extends BaseDiff {
+        public static final String FIELD_PRIORITY_CATEGORY_REMINDERS =
+                "mPriorityCategories_Reminders";
+        public static final String FIELD_PRIORITY_CATEGORY_EVENTS = "mPriorityCategories_Events";
+        public static final String FIELD_PRIORITY_CATEGORY_MESSAGES =
+                "mPriorityCategories_Messages";
+        public static final String FIELD_PRIORITY_CATEGORY_CALLS = "mPriorityCategories_Calls";
+        public static final String FIELD_PRIORITY_CATEGORY_REPEAT_CALLERS =
+                "mPriorityCategories_RepeatCallers";
+        public static final String FIELD_PRIORITY_CATEGORY_ALARMS = "mPriorityCategories_Alarms";
+        public static final String FIELD_PRIORITY_CATEGORY_MEDIA = "mPriorityCategories_Media";
+        public static final String FIELD_PRIORITY_CATEGORY_SYSTEM = "mPriorityCategories_System";
+        public static final String FIELD_PRIORITY_CATEGORY_CONVERSATIONS =
+                "mPriorityCategories_Conversations";
+
+        public static final String FIELD_VISUAL_EFFECT_FULL_SCREEN_INTENT =
+                "mVisualEffects_FullScreenIntent";
+        public static final String FIELD_VISUAL_EFFECT_LIGHTS = "mVisualEffects_Lights";
+        public static final String FIELD_VISUAL_EFFECT_PEEK = "mVisualEffects_Peek";
+        public static final String FIELD_VISUAL_EFFECT_STATUS_BAR = "mVisualEffects_StatusBar";
+        public static final String FIELD_VISUAL_EFFECT_BADGE = "mVisualEffects_Badge";
+        public static final String FIELD_VISUAL_EFFECT_AMBIENT = "mVisualEffects_Ambient";
+        public static final String FIELD_VISUAL_EFFECT_NOTIFICATION_LIST =
+                "mVisualEffects_NotificationList";
+
+        public static final String FIELD_PRIORITY_MESSAGES = "mPriorityMessages";
+        public static final String FIELD_PRIORITY_CALLS = "mPriorityCalls";
+        public static final String FIELD_CONVERSATION_SENDERS = "mConversationSenders";
+        public static final String FIELD_ALLOW_CHANNELS = "mAllowChannels";
+
+        /**
+         * Create a PolicyDiff representing the difference between two ZenPolicy objects.
+         *
+         * @param from previous ZenPolicy
+         * @param to   new ZenPolicy
+         * @return The diff between the two given ZenPolicy
+         */
+        public PolicyDiff(ZenPolicy from, ZenPolicy to) {
+            super(from, to);
+            // Short-circuit the both-null case
+            if (from == null && to == null) {
+                return;
+            }
+            if (hasExistenceChange()) {
+                // either added or removed; return here. otherwise (they're not both null) there's
+                // field diffs.
+                return;
+            }
+
+            // Compare all fields, knowing there's some diff and that neither is null.
+            if (from.getPriorityCategoryReminders() != to.getPriorityCategoryReminders()) {
+                addField(FIELD_PRIORITY_CATEGORY_REMINDERS,
+                        new FieldDiff<>(from.getPriorityCategoryReminders(),
+                                to.getPriorityCategoryReminders()));
+            }
+            if (from.getPriorityCategoryEvents() != to.getPriorityCategoryEvents()) {
+                addField(FIELD_PRIORITY_CATEGORY_EVENTS,
+                        new FieldDiff<>(from.getPriorityCategoryEvents(),
+                                to.getPriorityCategoryEvents()));
+            }
+            if (from.getPriorityCategoryMessages() != to.getPriorityCategoryMessages()) {
+                addField(FIELD_PRIORITY_CATEGORY_MESSAGES,
+                        new FieldDiff<>(from.getPriorityCategoryMessages(),
+                                to.getPriorityCategoryMessages()));
+            }
+            if (from.getPriorityCategoryCalls() != to.getPriorityCategoryCalls()) {
+                addField(FIELD_PRIORITY_CATEGORY_CALLS,
+                        new FieldDiff<>(from.getPriorityCategoryCalls(),
+                                to.getPriorityCategoryCalls()));
+            }
+            if (from.getPriorityCategoryRepeatCallers() != to.getPriorityCategoryRepeatCallers()) {
+                addField(FIELD_PRIORITY_CATEGORY_REPEAT_CALLERS,
+                        new FieldDiff<>(from.getPriorityCategoryRepeatCallers(),
+                                to.getPriorityCategoryRepeatCallers()));
+            }
+            if (from.getPriorityCategoryAlarms() != to.getPriorityCategoryAlarms()) {
+                addField(FIELD_PRIORITY_CATEGORY_ALARMS,
+                        new FieldDiff<>(from.getPriorityCategoryAlarms(),
+                                to.getPriorityCategoryAlarms()));
+            }
+            if (from.getPriorityCategoryMedia() != to.getPriorityCategoryMedia()) {
+                addField(FIELD_PRIORITY_CATEGORY_MEDIA,
+                        new FieldDiff<>(from.getPriorityCategoryMedia(),
+                                to.getPriorityCategoryMedia()));
+            }
+            if (from.getPriorityCategorySystem() != to.getPriorityCategorySystem()) {
+                addField(FIELD_PRIORITY_CATEGORY_SYSTEM,
+                        new FieldDiff<>(from.getPriorityCategorySystem(),
+                                to.getPriorityCategorySystem()));
+            }
+            if (from.getPriorityCategoryConversations() != to.getPriorityCategoryConversations()) {
+                addField(FIELD_PRIORITY_CATEGORY_CONVERSATIONS,
+                        new FieldDiff<>(from.getPriorityCategoryConversations(),
+                                to.getPriorityCategoryConversations()));
+            }
+            if (from.getVisualEffectFullScreenIntent() != to.getVisualEffectFullScreenIntent()) {
+                addField(FIELD_VISUAL_EFFECT_FULL_SCREEN_INTENT,
+                        new FieldDiff<>(from.getVisualEffectFullScreenIntent(),
+                                to.getVisualEffectFullScreenIntent()));
+            }
+            if (from.getVisualEffectLights() != to.getVisualEffectLights()) {
+                addField(FIELD_VISUAL_EFFECT_LIGHTS,
+                        new FieldDiff<>(from.getVisualEffectLights(), to.getVisualEffectLights()));
+            }
+            if (from.getVisualEffectPeek() != to.getVisualEffectPeek()) {
+                addField(FIELD_VISUAL_EFFECT_PEEK, new FieldDiff<>(from.getVisualEffectPeek(),
+                        to.getVisualEffectPeek()));
+            }
+            if (from.getVisualEffectStatusBar() != to.getVisualEffectStatusBar()) {
+                addField(FIELD_VISUAL_EFFECT_STATUS_BAR,
+                        new FieldDiff<>(from.getVisualEffectStatusBar(),
+                                to.getVisualEffectStatusBar()));
+            }
+            if (from.getVisualEffectBadge() != to.getVisualEffectBadge()) {
+                addField(FIELD_VISUAL_EFFECT_BADGE, new FieldDiff<>(from.getVisualEffectBadge(),
+                        to.getVisualEffectBadge()));
+            }
+            if (from.getVisualEffectAmbient() != to.getVisualEffectAmbient()) {
+                addField(FIELD_VISUAL_EFFECT_AMBIENT, new FieldDiff<>(from.getVisualEffectAmbient(),
+                        to.getVisualEffectAmbient()));
+            }
+            if (from.getVisualEffectNotificationList() != to.getVisualEffectNotificationList()) {
+                addField(FIELD_VISUAL_EFFECT_NOTIFICATION_LIST,
+                        new FieldDiff<>(from.getVisualEffectNotificationList(),
+                                to.getVisualEffectNotificationList()));
+            }
+            if (from.getPriorityMessageSenders() != to.getPriorityMessageSenders()) {
+                addField(FIELD_PRIORITY_MESSAGES, new FieldDiff<>(from.getPriorityMessageSenders(),
+                        to.getPriorityMessageSenders()));
+            }
+            if (from.getPriorityCallSenders() != to.getPriorityCallSenders()) {
+                addField(FIELD_PRIORITY_CALLS, new FieldDiff<>(from.getPriorityCallSenders(),
+                        to.getPriorityCallSenders()));
+            }
+            if (from.getPriorityConversationSenders() != to.getPriorityConversationSenders()) {
+                addField(FIELD_CONVERSATION_SENDERS,
+                        new FieldDiff<>(from.getPriorityConversationSenders(),
+                                to.getPriorityConversationSenders()));
+            }
+            if (from.getPriorityChannelsAllowed() != to.getPriorityChannelsAllowed()) {
+                addField(FIELD_ALLOW_CHANNELS, new FieldDiff<>(from.getPriorityChannelsAllowed(),
+                        to.getPriorityChannelsAllowed()));
+            }
+        }
+
+        /**
+         * Returns whether this object represents an actual diff.
+         */
+        @Override
+        public boolean hasDiff() {
+            return hasExistenceChange() || hasFieldDiffs();
+        }
+
+        @Override
+        public String toString() {
+            final StringBuilder sb = new StringBuilder("ZenPolicyDiff{");
+            // The diff should not have null diffs added, but we add this to be defensive.
+            if (!hasDiff()) {
+                sb.append("no changes");
+            }
+
+            // If added or deleted, we just append that.
+            if (hasExistenceChange()) {
+                if (wasAdded()) {
+                    sb.append("added");
+                } else if (wasRemoved()) {
+                    sb.append("removed");
+                }
+            }
+
+            // Go through all of the individual fields
+            boolean first = true;
+            for (String key : fieldNamesWithDiff()) {
+                FieldDiff diff = getDiffForField(key);
+                if (diff == null) {
+                    // this shouldn't happen...
+                    continue;
+                }
+                if (first) {
+                    first = false;
+                } else {
+                    sb.append(", ");
+                }
+
+                sb.append(key);
+                sb.append(":");
+                sb.append(diff);
+            }
+
+            return sb.append("}").toString();
+        }
+    }
+
 }
diff --git a/core/java/android/service/notification/ZenPolicy.java b/core/java/android/service/notification/ZenPolicy.java
index be0d7b3..4cff67e 100644
--- a/core/java/android/service/notification/ZenPolicy.java
+++ b/core/java/android/service/notification/ZenPolicy.java
@@ -29,6 +29,8 @@
 import android.os.Parcelable;
 import android.util.proto.ProtoOutputStream;
 
+import androidx.annotation.VisibleForTesting;
+
 import java.io.ByteArrayOutputStream;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -207,8 +209,10 @@
 
     /**
      * Total number of priority categories. Keep updated with any updates to PriorityCategory enum.
+     * If this changes, you must update {@link ZenModeDiff.PolicyDiff} to include new categories.
      * @hide
      */
+    @VisibleForTesting
     public static final int NUM_PRIORITY_CATEGORIES = 9;
 
     /** @hide */
@@ -241,8 +245,10 @@
 
     /**
      * Total number of visual effects. Keep updated with any updates to VisualEffect enum.
+     * If this changes, you must update {@link ZenModeDiff.PolicyDiff} to include new categories.
      * @hide
      */
+    @VisibleForTesting
     public static final int NUM_VISUAL_EFFECTS = 7;
 
     /** @hide */
diff --git a/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java b/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java
index f123a96..3181556 100644
--- a/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java
+++ b/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java
@@ -129,6 +129,16 @@
      * @hide
      */
     public static final String MODEL_UNLOADED_BUNDLE_KEY = "model_unloaded";
+    /**
+     * @hide
+     */
+    public static final String MODEL_LOADED_BROADCAST_INTENT =
+        "android.service.ondeviceintelligence.MODEL_LOADED";
+    /**
+     * @hide
+     */
+    public static final String MODEL_UNLOADED_BROADCAST_INTENT =
+        "android.service.ondeviceintelligence.MODEL_UNLOADED";
 
     /**
      * @hide
diff --git a/core/java/android/text/flags/flags.aconfig b/core/java/android/text/flags/flags.aconfig
index 3599332..09b2201 100644
--- a/core/java/android/text/flags/flags.aconfig
+++ b/core/java/android/text/flags/flags.aconfig
@@ -178,3 +178,20 @@
     purpose: PURPOSE_BUGFIX
   }
 }
+
+flag {
+  name: "handwriting_unsupported_show_soft_input_fix"
+  namespace: "text"
+  description: "Don't show soft keyboard on stylus input if text field doesn't support handwriting and getShowSoftInputOnFocus() returns false."
+  bug: "363180475"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
+  name: "tts_span_duration"
+  namespace: "text"
+  description: "Feature flag for adding a TYPE_DURATION to TtsSpan"
+  bug: "337103893"
+}
diff --git a/core/java/android/text/style/TtsSpan.java b/core/java/android/text/style/TtsSpan.java
index f9a1a0d..b7b8f0b1 100644
--- a/core/java/android/text/style/TtsSpan.java
+++ b/core/java/android/text/style/TtsSpan.java
@@ -16,6 +16,10 @@
 
 package android.text.style;
 
+import static com.android.text.flags.Flags.FLAG_TTS_SPAN_DURATION;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
 import android.os.Parcel;
 import android.os.PersistableBundle;
 import android.text.ParcelableSpan;
@@ -112,6 +116,16 @@
     public static final String TYPE_TIME = "android.type.time";
 
     /**
+     * The text associated with this span is a duration, consisting of a number of
+     * hours, minutes, and seconds specified with {@link #ARG_HOURS},
+     * {@link #ARG_MINUTES}, and {@link #ARG_SECONDS}. This is different from {@link #TYPE_TIME}.
+     * This should be used to convey an interval of time, while {@link #TYPE_TIME} should be used to
+     * convey a particular moment in time, such as a clock time.
+     */
+    @FlaggedApi(FLAG_TTS_SPAN_DURATION)
+    public static final String TYPE_DURATION = "android.type.duration";
+
+    /**
      * The text associated with this span is a date. At least one of the
      * arguments {@link #ARG_MONTH} and {@link #ARG_YEAR} has to be provided.
      * The argument {@link #ARG_DAY} is optional if {@link #ARG_MONTH} is set.
@@ -302,13 +316,21 @@
     public static final String ARG_HOURS = "android.arg.hours";
 
     /**
-     * Argument used to specify the minutes of a time. The hours should be
+     * Argument used to specify the minutes of a time. The minutes should be
      * provided as an integer in the range from 0 up to and including 59.
      * Can be used with {@link #TYPE_TIME}.
      */
     public static final String ARG_MINUTES = "android.arg.minutes";
 
     /**
+     * Argument used to specify the seconds of a time or duration. The seconds should be
+     * provided as an integer in the range from 0 up to and including 59.
+     * Can be used with {@link #TYPE_TIME} or {@link #TYPE_DURATION}.
+     */
+    @FlaggedApi(FLAG_TTS_SPAN_DURATION)
+    public static final String ARG_SECONDS = "android.arg.seconds";
+
+    /**
      * Argument used to specify the weekday of a date. The value should be
      * provided as an integer and can be any of {@link #WEEKDAY_SUNDAY},
      * {@link #WEEKDAY_MONDAY}, {@link #WEEKDAY_TUESDAY},
@@ -1132,9 +1154,70 @@
         public TimeBuilder setMinutes(int minutes) {
             return setIntArgument(TtsSpan.ARG_MINUTES, minutes);
         }
+
+        /**
+         * Sets the {@link #ARG_SECONDS} argument.
+         * @param seconds The value to be set for seconds.
+         * @return This instance.
+         */
+        @FlaggedApi(FLAG_TTS_SPAN_DURATION)
+        @NonNull
+        public TimeBuilder setSeconds(int seconds) {
+            return setIntArgument(TtsSpan.ARG_SECONDS, seconds);
+        }
     }
 
     /**
+     * A builder for TtsSpans of type {@link #TYPE_DURATION}.
+     */
+    @FlaggedApi(FLAG_TTS_SPAN_DURATION)
+    public static class DurationBuilder
+            extends SemioticClassBuilder<DurationBuilder> {
+
+        /**
+         * Creates a builder for a TtsSpan of type {@link #TYPE_DURATION}.
+         */
+        @FlaggedApi(FLAG_TTS_SPAN_DURATION)
+        public DurationBuilder() {
+            super(TtsSpan.TYPE_DURATION);
+        }
+
+        /**
+         * Sets the {@link #ARG_HOURS} argument.
+         * @param hours The value to be set for hours.
+         * @return This instance.
+         */
+        @FlaggedApi(FLAG_TTS_SPAN_DURATION)
+        @NonNull
+        public DurationBuilder setHours(int hours) {
+            return setIntArgument(TtsSpan.ARG_HOURS, hours);
+        }
+
+        /**
+         * Sets the {@link #ARG_MINUTES} argument.
+         * @param minutes The value to be set for minutes.
+         * @return This instance.
+         */
+        @FlaggedApi(FLAG_TTS_SPAN_DURATION)
+        @NonNull
+        public DurationBuilder setMinutes(int minutes) {
+            return setIntArgument(TtsSpan.ARG_MINUTES, minutes);
+        }
+
+        /**
+         * Sets the {@link #ARG_SECONDS} argument.
+         * @param seconds The value to be set for seconds.
+         * @return This instance.
+         */
+        @FlaggedApi(FLAG_TTS_SPAN_DURATION)
+        @NonNull
+        public DurationBuilder setSeconds(int seconds) {
+            return setIntArgument(TtsSpan.ARG_SECONDS, seconds);
+        }
+    }
+
+
+    /**
      * A builder for TtsSpans of type {@link #TYPE_DATE}.
      */
     public static class DateBuilder
diff --git a/core/java/android/tracing/TEST_MAPPING b/core/java/android/tracing/TEST_MAPPING
new file mode 100644
index 0000000..b51d19d
--- /dev/null
+++ b/core/java/android/tracing/TEST_MAPPING
@@ -0,0 +1,10 @@
+{
+  "postsubmit": [
+    {
+      "name": "TracingTests"
+    },
+    {
+      "name": "ProtologPerfTests"
+    }
+  ]
+}
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 53935e8..8a8022c 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -449,6 +449,13 @@
     public static final int TYPE_VIRTUAL = 5;
 
     /**
+     * The maximum display type value.
+     * Helpful to get all possible display values.
+     * @hide
+     */
+    public static final int TYPE_MAX = TYPE_VIRTUAL;
+
+    /**
      * Display state: The display state is unknown.
      *
      * @see #getState
diff --git a/core/java/android/view/HandwritingInitiator.java b/core/java/android/view/HandwritingInitiator.java
index f132963..c217999 100644
--- a/core/java/android/view/HandwritingInitiator.java
+++ b/core/java/android/view/HandwritingInitiator.java
@@ -19,6 +19,7 @@
 import static com.android.text.flags.Flags.handwritingCursorPosition;
 import static com.android.text.flags.Flags.handwritingTrackDisabled;
 import static com.android.text.flags.Flags.handwritingUnsupportedMessage;
+import static com.android.text.flags.Flags.handwritingUnsupportedShowSoftInputFix;
 
 import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
@@ -241,7 +242,11 @@
                             if (!candidateView.hasFocus()) {
                                 requestFocusWithoutReveal(candidateView);
                             }
-                            mImm.showSoftInput(candidateView, 0);
+                            if (!handwritingUnsupportedShowSoftInputFix()
+                                    || (candidateView instanceof TextView tv
+                                            && tv.getShowSoftInputOnFocus())) {
+                                mImm.showSoftInput(candidateView, 0);
+                            }
                             mState.mHandled = true;
                             mState.mShouldInitHandwriting = false;
                             motionEvent.setAction((motionEvent.getAction()
diff --git a/core/java/android/view/InputEventCompatProcessor.java b/core/java/android/view/InputEventCompatProcessor.java
index ff8407a..50d81f4 100644
--- a/core/java/android/view/InputEventCompatProcessor.java
+++ b/core/java/android/view/InputEventCompatProcessor.java
@@ -18,6 +18,9 @@
 
 import android.content.Context;
 import android.os.Build;
+import android.os.Handler;
+
+import com.android.window.flags.Flags;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -32,28 +35,93 @@
 
     protected Context mContext;
     protected int mTargetSdkVersion;
+    private final LetterboxScrollProcessor mLetterboxScrollProcessor;
 
     /** List of events to be used to return the processed events */
-    private List<InputEvent> mProcessedEvents;
+    private final List<InputEvent> mProcessedEvents;
 
     public InputEventCompatProcessor(Context context) {
+        this(context, null);
+    }
+
+    public InputEventCompatProcessor(Context context, Handler handler) {
         mContext = context;
         mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion;
+        if (Flags.scrollingFromLetterbox()) {
+            mLetterboxScrollProcessor = new LetterboxScrollProcessor(mContext, handler);
+        } else {
+            mLetterboxScrollProcessor = null;
+        }
+
         mProcessedEvents = new ArrayList<>();
     }
 
+
     /**
      * Processes the InputEvent for compatibility before it is sent to the app, allowing for the
      * generation of more than one event if necessary.
      *
-     * @param e The InputEvent to process
-     * @return The list of adjusted events, or null if no adjustments are needed. Do not keep a
-     *         reference to the output as the list is reused.
+     * @param inputEvent The InputEvent to process.
+     * @return The list of adjusted events, or null if no adjustments are needed. The list is empty
+     * if the event should be ignored. Do not keep a reference to the output as the list is reused.
      */
-    public List<InputEvent> processInputEventForCompatibility(InputEvent e) {
-        if (mTargetSdkVersion < Build.VERSION_CODES.M && e instanceof MotionEvent) {
-            mProcessedEvents.clear();
-            MotionEvent motion = (MotionEvent) e;
+    public List<InputEvent> processInputEventForCompatibility(InputEvent inputEvent) {
+        mProcessedEvents.clear();
+
+        // Process the event for StylusButtonCompatibility.
+        final InputEvent stylusCompatEvent = processStylusButtonCompatibility(inputEvent);
+
+        // Process the event for LetterboxScrollCompatibility.
+        List<MotionEvent> letterboxScrollCompatEvents = processLetterboxScrollCompatibility(
+                stylusCompatEvent != null ? stylusCompatEvent : inputEvent);
+
+        // If no adjustments are needed for LetterboxCompatibility.
+        if (letterboxScrollCompatEvents == null) {
+            // If stylus compatibility made adjustments, return that adjusted event.
+            if (stylusCompatEvent != null) {
+                mProcessedEvents.add(stylusCompatEvent);
+                return mProcessedEvents;
+            }
+            // Otherwise, return null to indicate no adjustments.
+            return null;
+        }
+
+        // Otherwise if LetterboxCompatibility made adjustments, return the list of adjusted events.
+        mProcessedEvents.addAll(letterboxScrollCompatEvents);
+        return mProcessedEvents;
+    }
+
+    /**
+     * Processes the InputEvent for compatibility before it is finished by calling
+     * InputEventReceiver#finishInputEvent().
+     *
+     * @param inputEvent The InputEvent to process.
+     * @return The InputEvent to finish, or null if it should not be finished.
+     */
+    public InputEvent processInputEventBeforeFinish(InputEvent inputEvent) {
+        if (mLetterboxScrollProcessor != null && inputEvent instanceof MotionEvent motionEvent) {
+            // LetterboxScrollProcessor may have generated events while processing motion events.
+            return mLetterboxScrollProcessor.processMotionEventBeforeFinish(motionEvent);
+        }
+
+        // No changes needed
+        return inputEvent;
+    }
+
+
+    private List<MotionEvent> processLetterboxScrollCompatibility(InputEvent inputEvent) {
+        if (mLetterboxScrollProcessor != null
+                && inputEvent instanceof MotionEvent motionEvent
+                && motionEvent.getAction() != MotionEvent.ACTION_OUTSIDE) {
+            return mLetterboxScrollProcessor.processMotionEvent(motionEvent);
+        }
+        return null;
+    }
+
+
+    private InputEvent processStylusButtonCompatibility(InputEvent inputEvent) {
+        if (mTargetSdkVersion < Build.VERSION_CODES.M && inputEvent instanceof MotionEvent) {
+            MotionEvent motion = (MotionEvent) inputEvent;
             final int mask =
                     MotionEvent.BUTTON_STYLUS_PRIMARY | MotionEvent.BUTTON_STYLUS_SECONDARY;
             final int buttonState = motion.getButtonState();
@@ -61,21 +129,8 @@
             if (compatButtonState != 0) {
                 motion.setButtonState(buttonState | compatButtonState);
             }
-            mProcessedEvents.add(motion);
-            return mProcessedEvents;
+            return motion;
         }
         return null;
     }
-
-    /**
-     * Processes the InputEvent for compatibility before it is finished by calling
-     * InputEventReceiver#finishInputEvent().
-     *
-     * @param e The InputEvent to process
-     * @return The InputEvent to finish, or null if it should not be finished
-     */
-    public InputEvent processInputEventBeforeFinish(InputEvent e) {
-        // No changes needed
-        return e;
-    }
 }
diff --git a/core/java/android/view/LetterboxScrollProcessor.java b/core/java/android/view/LetterboxScrollProcessor.java
new file mode 100644
index 0000000..dc736d6
--- /dev/null
+++ b/core/java/android/view/LetterboxScrollProcessor.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2024 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 android.view;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.Rect;
+import android.os.Handler;
+
+import androidx.annotation.NonNull;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * {@link MotionEvent} processor that forwards scrolls on the letterbox area to the app's view
+ * hierarchy by translating the coordinates to app's inbound area.
+ *
+ * @hide
+ */
+public class LetterboxScrollProcessor {
+
+    private enum LetterboxScrollState {
+        AWAITING_GESTURE_START,
+        GESTURE_STARTED_IN_APP,
+        GESTURE_STARTED_OUTSIDE_APP,
+        SCROLLING_STARTED_OUTSIDE_APP
+    }
+
+    @NonNull private LetterboxScrollState mState = LetterboxScrollState.AWAITING_GESTURE_START;
+    @NonNull private final List<MotionEvent> mProcessedEvents = new ArrayList<>();
+
+    @NonNull private final GestureDetector mScrollDetector;
+    @NonNull private final Context mContext;
+
+    /** IDs of events generated from this class */
+    private final Set<Integer> mGeneratedEventIds = new HashSet<>();
+
+    public LetterboxScrollProcessor(@NonNull Context context, @Nullable Handler handler) {
+        mContext = context;
+        mScrollDetector = new GestureDetector(context, new ScrollListener(), handler);
+    }
+
+    /**
+     * Processes the MotionEvent. If the gesture is started in the app's bounds, or moves over the
+     * app then the motion events are not adjusted. Motion events from outside the app's
+     * bounds that are detected as a scroll gesture are adjusted to be over the app's bounds.
+     * Otherwise (if the events are outside the app's bounds and not part of a scroll gesture), the
+     * motion events are ignored.
+     *
+     * @param motionEvent The MotionEvent to process.
+     * @return The list of adjusted events, or null if no adjustments are needed. The list is empty
+     * if the event should be ignored. Do not keep a reference to the output as the list is reused.
+     */
+    public List<MotionEvent> processMotionEvent(MotionEvent motionEvent) {
+        mProcessedEvents.clear();
+        final Rect appBounds = getAppBounds();
+
+        // Set state at the start of the gesture (when ACTION_DOWN is received)
+        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
+            if (isOutsideAppBounds(motionEvent, appBounds)) {
+                mState = LetterboxScrollState.GESTURE_STARTED_OUTSIDE_APP;
+            } else {
+                mState = LetterboxScrollState.GESTURE_STARTED_IN_APP;
+            }
+        }
+
+        boolean makeNoAdjustments = false;
+
+        switch (mState) {
+            case AWAITING_GESTURE_START:
+            case GESTURE_STARTED_IN_APP:
+                // Do not adjust events if gesture is started in or is over the app.
+                makeNoAdjustments = true;
+                break;
+
+            case GESTURE_STARTED_OUTSIDE_APP:
+                // Send offset events to the scroll-detector. These events are not added to
+                // mProcessedEvents and are therefore ignored until detected as part of a scroll.
+                applyOffset(motionEvent, appBounds);
+                mScrollDetector.onTouchEvent(motionEvent);
+                // If scroll-detector triggered, then the state is changed to
+                // SCROLLING_STARTED_OUTSIDE_APP (scroll detector can only trigger after an
+                // ACTION_MOVE event is received).
+                if (mState == LetterboxScrollState.SCROLLING_STARTED_OUTSIDE_APP) {
+                    // Also, include ACTION_MOVE motion event that triggered the scroll-detector.
+                    mProcessedEvents.add(motionEvent);
+                }
+                break;
+
+            // Once scroll-detector has detected scrolling, offset is applied to the gesture.
+            case SCROLLING_STARTED_OUTSIDE_APP:
+                if (isOutsideAppBounds(motionEvent, appBounds)) {
+                    // Offset the event to be over the app if the event is out-of-bounds.
+                    applyOffset(motionEvent, appBounds);
+                } else {
+                    // Otherwise, the gesture is already over the app so stop offsetting it.
+                    mState = LetterboxScrollState.GESTURE_STARTED_IN_APP;
+                }
+                mProcessedEvents.add(motionEvent);
+                break;
+        }
+
+        // Reset state at the end of the gesture
+        if (motionEvent.getAction() == MotionEvent.ACTION_UP
+                || motionEvent.getAction() == MotionEvent.ACTION_CANCEL) {
+            mState = LetterboxScrollState.AWAITING_GESTURE_START;
+        }
+
+        if (makeNoAdjustments) return null;
+        return mProcessedEvents;
+    }
+
+
+    /**
+     * Processes the InputEvent for compatibility before it is finished by calling
+     * InputEventReceiver#finishInputEvent().
+     *
+     * @param motionEvent The MotionEvent to process.
+     * @return The motionEvent to finish, or null if it should not be finished.
+     */
+    public InputEvent processMotionEventBeforeFinish(MotionEvent motionEvent) {
+        if (mGeneratedEventIds.remove(motionEvent.getId())) return null;
+        return motionEvent;
+    }
+
+    private Rect getAppBounds() {
+        return mContext.getResources().getConfiguration().windowConfiguration.getBounds();
+    }
+
+    private boolean isOutsideAppBounds(MotionEvent motionEvent, Rect appBounds) {
+        return motionEvent.getX() < 0 || motionEvent.getX() >= appBounds.width()
+                || motionEvent.getY() < 0 || motionEvent.getY() >= appBounds.height();
+    }
+
+    private void applyOffset(MotionEvent event, Rect appBounds) {
+        float horizontalOffset = calculateOffset(event.getX(), appBounds.width());
+        float verticalOffset = calculateOffset(event.getY(), appBounds.height());
+        // Apply the offset to the motion event so it is over the app's view.
+        event.offsetLocation(horizontalOffset, verticalOffset);
+    }
+
+    private float calculateOffset(float eventCoord, int appBoundary) {
+        if (eventCoord < 0) {
+            return -eventCoord;
+        } else if (eventCoord >= appBoundary) {
+            return -(eventCoord - appBoundary + 1);
+        } else {
+            return 0;
+        }
+    }
+
+    private class ScrollListener extends GestureDetector.SimpleOnGestureListener {
+        private ScrollListener() {}
+
+        @Override
+        public boolean onScroll(
+                @Nullable MotionEvent actionDownEvent,
+                @NonNull MotionEvent actionMoveEvent,
+                float distanceX,
+                float distanceY) {
+            // Inject in-bounds ACTION_DOWN event before continuing gesture with offset.
+            final MotionEvent newActionDownEvent = MotionEvent.obtain(
+                    Objects.requireNonNull(actionDownEvent));
+            Rect appBounds = getAppBounds();
+            applyOffset(newActionDownEvent, appBounds);
+            mGeneratedEventIds.add(newActionDownEvent.getId());
+            mProcessedEvents.add(newActionDownEvent);
+
+            // Change state when onScroll method is triggered - at this point, the passed event is
+            // known to be 'part of' a scroll gesture.
+            mState = LetterboxScrollState.SCROLLING_STARTED_OUTSIDE_APP;
+
+            return super.onScroll(actionDownEvent, actionMoveEvent, distanceX, distanceY);
+        }
+    }
+}
diff --git a/core/java/android/view/OWNERS b/core/java/android/view/OWNERS
index 31a8dfa..1ea58bc 100644
--- a/core/java/android/view/OWNERS
+++ b/core/java/android/view/OWNERS
@@ -48,6 +48,7 @@
 per-file VelocityTracker.java = file:/services/core/java/com/android/server/input/OWNERS
 per-file VerifiedInputEvent.java = file:/services/core/java/com/android/server/input/OWNERS
 per-file VerifiedInputEvent.aidl = file:/services/core/java/com/android/server/input/OWNERS
+per-file LetterboxScrollProcessor*.java = file:/services/core/java/com/android/server/input/OWNERS
 
 # InputWindowHandle
 per-file InputWindowHandle.java  = file:/services/core/java/com/android/server/input/OWNERS
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 90ceb44..19e244a 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -49,6 +49,7 @@
 import android.gui.StalledTransactionInfo;
 import android.gui.TrustedOverlay;
 import android.hardware.DataSpace;
+import android.hardware.DisplayLuts;
 import android.hardware.HardwareBuffer;
 import android.hardware.OverlayProperties;
 import android.hardware.SyncFence;
@@ -152,6 +153,8 @@
             long nativeObject, int priority);
     private static native void nativeSetWindowCrop(long transactionObj, long nativeObject,
             int l, int t, int r, int b);
+    private static native void nativeSetCrop(long transactionObj, long nativeObject,
+            float l, float t, float r, float b);
     private static native void nativeSetCornerRadius(long transactionObj, long nativeObject,
             float cornerRadius);
     private static native void nativeSetBackgroundBlurRadius(long transactionObj, long nativeObject,
@@ -305,9 +308,9 @@
     private static native StalledTransactionInfo nativeGetStalledTransactionInfo(int pid);
     private static native void nativeSetDesiredPresentTimeNanos(long transactionObj,
                                                                 long desiredPresentTimeNanos);
-    private static native void nativeSetFrameTimeline(long transactionObj,
-                                                           long vsyncId);
     private static native void nativeNotifyShutdown();
+    private static native void nativeSetLuts(long transactionObj, long nativeObject,
+            float[] buffers, int[] slots, int[] dimensions, int[] sizes, int[] samplingKeys);
 
     /**
      * Transforms that can be applied to buffers as they are displayed to a window.
@@ -3452,6 +3455,29 @@
         }
 
         /**
+         * Bounds the surface and its children to the bounds specified. Size of the surface will be
+         * ignored and only the crop and buffer size will be used to determine the bounds of the
+         * surface. If no crop is specified and the surface has no buffer, the surface bounds is
+         * only constrained by the size of its parent bounds.
+         *
+         * @param sc   SurfaceControl to set crop of.
+         * @param crop Bounds of the crop to apply.
+         * @return this This transaction for chaining
+         * @hide
+         */
+        public @NonNull Transaction setCrop(@NonNull SurfaceControl sc, float top, float left,
+                float bottom, float right) {
+            checkPreconditions(sc);
+            if (SurfaceControlRegistry.sCallStackDebuggingEnabled) {
+                SurfaceControlRegistry.getProcessInstance().checkCallStackDebugging(
+                        "setCrop", this, sc, "crop={" + top + ", " + left + ", " +
+                        bottom + ", " + right + "}");
+            }
+            nativeSetCrop(mNativeObject, sc.mNativeObject, top, left, bottom, right);
+            return this;
+        }
+
+        /**
          * Sets the corner radius of a {@link SurfaceControl}.
          * @param sc SurfaceControl
          * @param cornerRadius Corner radius in pixels.
@@ -4374,6 +4400,17 @@
             return this;
         }
 
+        /** @hide */
+        public @NonNull Transaction setLuts(@NonNull SurfaceControl sc,
+                @NonNull DisplayLuts displayLuts) {
+            checkPreconditions(sc);
+
+            nativeSetLuts(mNativeObject, sc.mNativeObject, displayLuts.getLutBuffers(),
+                    displayLuts.getOffsets(), displayLuts.getLutDimensions(),
+                    displayLuts.getLutSizes(), displayLuts.getLutSamplingKeys());
+            return this;
+        }
+
         /**
          * Sets the caching hint for the layer. By default, the caching hint is
          * {@link CACHING_ENABLED}.
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 0ed0e60..1b62cfd 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -42,6 +42,7 @@
 import static android.view.flags.Flags.FLAG_VIEW_VELOCITY_API;
 import static android.view.flags.Flags.enableUseMeasureCacheDuringForceLayout;
 import static android.view.flags.Flags.sensitiveContentAppProtection;
+import static android.view.flags.Flags.toolkitFrameRateAnimationBugfix25q1;
 import static android.view.flags.Flags.toolkitFrameRateBySizeReadOnly;
 import static android.view.flags.Flags.toolkitFrameRateDefaultNormalReadOnly;
 import static android.view.flags.Flags.toolkitFrameRateSmallUsesPercentReadOnly;
@@ -2458,13 +2459,14 @@
             toolkitFrameRateDefaultNormalReadOnly();
     private static final boolean sToolkitFrameRateBySizeReadOnlyFlagValue =
             toolkitFrameRateBySizeReadOnly();
-
     private static final boolean sToolkitFrameRateSmallUsesPercentReadOnlyFlagValue =
             toolkitFrameRateSmallUsesPercentReadOnly();
     private static final boolean sToolkitFrameRateViewEnablingReadOnlyFlagValue =
             toolkitFrameRateViewEnablingReadOnly();
     private static boolean sToolkitFrameRateVelocityMappingReadOnlyFlagValue =
             toolkitFrameRateVelocityMappingReadOnly();
+    private static boolean sToolkitFrameRateAnimationBugfix25q1FlagValue =
+            toolkitFrameRateAnimationBugfix25q1();
 
     // Used to set frame rate compatibility.
     @Surface.FrameRateCompatibility int mFrameRateCompatibility =
@@ -24429,6 +24431,13 @@
             invalidationTransform = t;
         }
 
+        // Increase the frame rate if there is a transformation that applies a matrix.
+        if (sToolkitFrameRateAnimationBugfix25q1FlagValue
+                && ((t.getTransformationType() & Transformation.TYPE_MATRIX) != 0)) {
+            mPrivateFlags4 |= PFLAG4_HAS_VIEW_PROPERTY_INVALIDATION;
+            mPrivateFlags4 |= PFLAG4_HAS_MOVED;
+        }
+
         if (more) {
             if (!a.willChangeBounds()) {
                 if ((flags & (ViewGroup.FLAG_OPTIMIZE_INVALIDATE | ViewGroup.FLAG_ANIMATION_DONE)) ==
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 66776ce..0ca442d 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -238,7 +238,7 @@
 import android.view.accessibility.AccessibilityInteractionClient;
 import android.view.accessibility.AccessibilityManager;
 import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
-import android.view.accessibility.AccessibilityManager.HighTextContrastChangeListener;
+import android.view.accessibility.AccessibilityManager.HighContrastTextStateChangeListener;
 import android.view.accessibility.AccessibilityNodeIdManager;
 import android.view.accessibility.AccessibilityNodeInfo;
 import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
@@ -1283,7 +1283,7 @@
                                     R.string.config_inputEventCompatProcessorOverrideClassName);
         if (processorOverrideName.isEmpty()) {
             // No compatibility processor override, using default.
-            mInputCompatProcessor = new InputEventCompatProcessor(context);
+            mInputCompatProcessor = new InputEventCompatProcessor(context, mHandler);
         } else {
             InputEventCompatProcessor compatProcessor = null;
             try {
@@ -1800,8 +1800,8 @@
         }
         mAccessibilityManager.addAccessibilityStateChangeListener(
                 mAccessibilityInteractionConnectionManager, mHandler);
-        mAccessibilityManager.addHighTextContrastStateChangeListener(
-                mHighContrastTextManager, mHandler);
+        mAccessibilityManager.addHighContrastTextStateChangeListener(
+                mExecutor, mHighContrastTextManager);
         DisplayManagerGlobal
                 .getInstance()
                 .registerDisplayListener(
@@ -1838,7 +1838,7 @@
     private void unregisterListeners() {
         mAccessibilityManager.removeAccessibilityStateChangeListener(
                 mAccessibilityInteractionConnectionManager);
-        mAccessibilityManager.removeHighTextContrastStateChangeListener(
+        mAccessibilityManager.removeHighContrastTextStateChangeListener(
                 mHighContrastTextManager);
         DisplayManagerGlobal
                 .getInstance()
@@ -2064,7 +2064,11 @@
         if (mAttachInfo.mThreadedRenderer == null) return;
         if (mAttachInfo.mThreadedRenderer.setForceDark(determineForceDarkType())) {
             // TODO: Don't require regenerating all display lists to apply this setting
-            invalidateWorld(mView);
+            if (forceInvertColor()) {
+                destroyAndInvalidate();
+            } else {
+                invalidateWorld(mView);
+            }
         }
     }
 
@@ -7527,6 +7531,7 @@
                         if (keyEvent.isCanceled()) {
                             animationCallback.onBackCancelled();
                         } else {
+                            dispatcher.tryInvokeSystemNavigationObserverCallback();
                             topCallback.onBackInvoked();
                         }
                         break;
@@ -7534,6 +7539,7 @@
             } else if (topCallback != null) {
                 if (keyEvent.getAction() == KeyEvent.ACTION_UP) {
                     if (!keyEvent.isCanceled()) {
+                        dispatcher.tryInvokeSystemNavigationObserverCallback();
                         topCallback.onBackInvoked();
                     } else {
                         Log.d(mTag, "Skip onBackInvoked(), reason: keyEvent.isCanceled=true");
@@ -11903,23 +11909,31 @@
         }
     }
 
-    final class HighContrastTextManager implements HighTextContrastChangeListener {
+    final class HighContrastTextManager implements HighContrastTextStateChangeListener {
         HighContrastTextManager() {
-            ThreadedRenderer.setHighContrastText(mAccessibilityManager.isHighTextContrastEnabled());
+            ThreadedRenderer.setHighContrastText(mAccessibilityManager.isHighContrastTextEnabled());
         }
         @Override
-        public void onHighTextContrastStateChanged(boolean enabled) {
+        public void onHighContrastTextStateChanged(boolean enabled) {
             ThreadedRenderer.setHighContrastText(enabled);
 
-            // Destroy Displaylists so they can be recreated with high contrast recordings
-            destroyHardwareResources();
-
-            // Schedule redraw, which will rerecord + redraw all text
-            invalidate();
+            destroyAndInvalidate();
         }
     }
 
     /**
+     * Destroy Displaylists so they can be recreated with new recordings, in case you are changing
+     * the way things are rendered (e.g. high contrast, force dark), then invalidate to trigger a
+     * redraw.
+     */
+    private void destroyAndInvalidate() {
+        destroyHardwareResources();
+
+        // Schedule redraw, which will rerecord + redraw all text
+        invalidate();
+    }
+
+    /**
      * This class is an interface this ViewAncestor provides to the
      * AccessibilityManagerService to the latter can interact with
      * the view hierarchy in this ViewAncestor.
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 0582afe..381006c 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -1345,7 +1345,7 @@
     }
 
     /**
-     * <p>Sets the desired about of HDR headroom to be used when rendering as a ratio of
+     * <p>Sets the desired amount of HDR headroom to be used when rendering as a ratio of
      * targetHdrPeakBrightnessInNits / targetSdrWhitePointInNits. Only applies when
      * {@link #setColorMode(int)} is {@link ActivityInfo#COLOR_MODE_HDR}</p>
      *
diff --git a/core/java/android/view/WindowLayout.java b/core/java/android/view/WindowLayout.java
index dda3993..d5ccca9 100644
--- a/core/java/android/view/WindowLayout.java
+++ b/core/java/android/view/WindowLayout.java
@@ -157,10 +157,10 @@
             // which prevents overlap with the DisplayCutout.
             if (!attachedInParent && !floatingInScreenWindow) {
                 mTempRect.set(outParentFrame);
-                outParentFrame.intersectUnchecked(displayCutoutSafeExceptMaybeBars);
+                intersectOrClamp(outParentFrame, displayCutoutSafeExceptMaybeBars);
                 frames.isParentFrameClippedByDisplayCutout = !mTempRect.equals(outParentFrame);
             }
-            outDisplayFrame.intersectUnchecked(displayCutoutSafeExceptMaybeBars);
+            intersectOrClamp(outDisplayFrame, displayCutoutSafeExceptMaybeBars);
         }
 
         final boolean noLimits = (attrs.flags & FLAG_LAYOUT_NO_LIMITS) != 0;
@@ -283,6 +283,19 @@
                 + " requestedInvisibleTypes=" + WindowInsets.Type.toString(~requestedVisibleTypes));
     }
 
+    /**
+     * If both rectangles intersect, set inOutRect to that intersection. Otherwise, clamp inOutRect
+     * to the side (or the corner) that the other rectangle is away from.
+     * Unlike {@link Rect#intersectUnchecked(Rect)}, this method guarantees that the new rectangle
+     * is valid and contained in inOutRect if rectangles involved are valid.
+     */
+    private static void intersectOrClamp(Rect inOutRect, Rect other) {
+        inOutRect.left = Math.min(Math.max(inOutRect.left, other.left), inOutRect.right);
+        inOutRect.top = Math.min(Math.max(inOutRect.top, other.top), inOutRect.bottom);
+        inOutRect.right = Math.max(Math.min(inOutRect.right, other.right), inOutRect.left);
+        inOutRect.bottom = Math.max(Math.min(inOutRect.bottom, other.bottom), inOutRect.top);
+    }
+
     public static void extendFrameByCutout(Rect displayCutoutSafe,
             Rect displayFrame, Rect inOutFrame, Rect tempRect) {
         if (displayCutoutSafe.contains(inOutFrame)) {
diff --git a/core/java/android/view/WindowManagerPolicyConstants.java b/core/java/android/view/WindowManagerPolicyConstants.java
index c88048c..1f341ca 100644
--- a/core/java/android/view/WindowManagerPolicyConstants.java
+++ b/core/java/android/view/WindowManagerPolicyConstants.java
@@ -17,6 +17,7 @@
 package android.view;
 
 import static android.os.IInputConstants.POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY;
+import static android.os.IInputConstants.POLICY_FLAG_KEY_GESTURE_TRIGGERED;
 
 import android.annotation.IntDef;
 import android.os.PowerManager;
@@ -35,6 +36,7 @@
     int FLAG_VIRTUAL = 0x00000002;
 
     int FLAG_INJECTED_FROM_ACCESSIBILITY = POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY;
+    int FLAG_KEY_GESTURE_TRIGGERED = POLICY_FLAG_KEY_GESTURE_TRIGGERED;
     int FLAG_INJECTED = 0x01000000;
     int FLAG_TRUSTED = 0x02000000;
     int FLAG_FILTERED = 0x04000000;
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index 2b7cf42..fd57aec 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -253,7 +253,7 @@
     boolean mIsTouchExplorationEnabled;
 
     @UnsupportedAppUsage(trackingBug = 123768939L)
-    boolean mIsHighTextContrastEnabled;
+    boolean mIsHighContrastTextEnabled;
 
     boolean mIsAudioDescriptionByDefaultRequested;
 
@@ -276,8 +276,8 @@
     private final ArrayMap<TouchExplorationStateChangeListener, Handler>
             mTouchExplorationStateChangeListeners = new ArrayMap<>();
 
-    private final ArrayMap<HighTextContrastChangeListener, Handler>
-            mHighTextContrastStateChangeListeners = new ArrayMap<>();
+    private final ArrayMap<HighContrastTextStateChangeListener, Executor>
+            mHighContrastTextStateChangeListeners = new ArrayMap<>();
 
     private final ArrayMap<AccessibilityServicesStateChangeListener, Executor>
             mServicesStateChangeListeners = new ArrayMap<>();
@@ -356,21 +356,20 @@
     }
 
     /**
-     * Listener for the system high text contrast state. To listen for changes to
-     * the high text contrast state on the device, implement this interface and
+     * Listener for the system high contrast text state. To listen for changes to
+     * the high contrast text state on the device, implement this interface and
      * register it with the system by calling
-     * {@link #addHighTextContrastStateChangeListener}.
-     *
-     * @hide
+     * {@link #addHighContrastTextStateChangeListener}.
      */
-    public interface HighTextContrastChangeListener {
+    @FlaggedApi(com.android.graphics.hwui.flags.Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
+    public interface HighContrastTextStateChangeListener {
 
         /**
-         * Called when the high text contrast enabled state changes.
+         * Called when the high contrast text enabled state changes.
          *
-         * @param enabled Whether high text contrast is enabled.
+         * @param enabled Whether high contrast text is enabled.
          */
-        void onHighTextContrastStateChanged(boolean enabled);
+        void onHighContrastTextStateChanged(boolean enabled);
     }
 
     /**
@@ -655,24 +654,23 @@
     }
 
     /**
-     * Returns if the high text contrast in the system is enabled.
+     * Returns if high contrast text in the system is enabled.
      * <p>
      * <strong>Note:</strong> You need to query this only if you application is
      * doing its own rendering and does not rely on the platform rendering pipeline.
      * </p>
      *
-     * @return True if high text contrast is enabled, false otherwise.
+     * @return True if high contrast text is enabled, false otherwise.
      *
-     * @hide
      */
-    @UnsupportedAppUsage
-    public boolean isHighTextContrastEnabled() {
+    @FlaggedApi(com.android.graphics.hwui.flags.Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
+    public boolean isHighContrastTextEnabled() {
         synchronized (mLock) {
             IAccessibilityManager service = getServiceLocked();
             if (service == null) {
                 return false;
             }
-            return mIsHighTextContrastEnabled;
+            return mIsHighContrastTextEnabled;
         }
     }
 
@@ -1303,32 +1301,32 @@
     }
 
     /**
-     * Registers a {@link HighTextContrastChangeListener} for changes in
-     * the global high text contrast state of the system.
+     * Registers a {@link HighContrastTextStateChangeListener} for changes in
+     * the global high contrast text state of the system.
      *
-     * @param listener The listener.
-     *
-     * @hide
+     * @param executor a executor to call the listener from
+     * @param listener The listener to be called
      */
-    public void addHighTextContrastStateChangeListener(
-            @NonNull HighTextContrastChangeListener listener, @Nullable Handler handler) {
+    @FlaggedApi(com.android.graphics.hwui.flags.Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
+    public void addHighContrastTextStateChangeListener(
+            @NonNull @CallbackExecutor Executor executor,
+            @NonNull HighContrastTextStateChangeListener listener
+    ) {
         synchronized (mLock) {
-            mHighTextContrastStateChangeListeners
-                    .put(listener, (handler == null) ? mHandler : handler);
+            mHighContrastTextStateChangeListeners.put(listener, executor);
         }
     }
 
     /**
-     * Unregisters a {@link HighTextContrastChangeListener}.
+     * Unregisters a {@link HighContrastTextStateChangeListener}.
      *
      * @param listener The listener.
-     *
-     * @hide
      */
-    public void removeHighTextContrastStateChangeListener(
-            @NonNull HighTextContrastChangeListener listener) {
+    @FlaggedApi(com.android.graphics.hwui.flags.Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
+    public void removeHighContrastTextStateChangeListener(
+            @NonNull HighContrastTextStateChangeListener listener) {
         synchronized (mLock) {
-            mHighTextContrastStateChangeListeners.remove(listener);
+            mHighContrastTextStateChangeListeners.remove(listener);
         }
     }
 
@@ -1505,13 +1503,13 @@
 
         final boolean wasEnabled = isEnabled();
         final boolean wasTouchExplorationEnabled = mIsTouchExplorationEnabled;
-        final boolean wasHighTextContrastEnabled = mIsHighTextContrastEnabled;
+        final boolean wasHighTextContrastEnabled = mIsHighContrastTextEnabled;
         final boolean wasAudioDescriptionByDefaultRequested = mIsAudioDescriptionByDefaultRequested;
 
         // Ensure listeners get current state from isZzzEnabled() calls.
         mIsEnabled = enabled;
         mIsTouchExplorationEnabled = touchExplorationEnabled;
-        mIsHighTextContrastEnabled = highTextContrastEnabled;
+        mIsHighContrastTextEnabled = highTextContrastEnabled;
         mIsAudioDescriptionByDefaultRequested = audioDescriptionEnabled;
 
         if (wasEnabled != isEnabled()) {
@@ -1523,7 +1521,7 @@
         }
 
         if (wasHighTextContrastEnabled != highTextContrastEnabled) {
-            notifyHighTextContrastStateChanged();
+            notifyHighContrastTextStateChanged();
         }
 
         if (wasAudioDescriptionByDefaultRequested
@@ -2397,24 +2395,24 @@
     }
 
     /**
-     * Notifies the registered {@link HighTextContrastChangeListener}s.
+     * Notifies the registered {@link HighContrastTextStateChangeListener}s.
      */
-    private void notifyHighTextContrastStateChanged() {
+    private void notifyHighContrastTextStateChanged() {
         final boolean isHighTextContrastEnabled;
-        final ArrayMap<HighTextContrastChangeListener, Handler> listeners;
+        final ArrayMap<HighContrastTextStateChangeListener, Executor> listeners;
         synchronized (mLock) {
-            if (mHighTextContrastStateChangeListeners.isEmpty()) {
+            if (mHighContrastTextStateChangeListeners.isEmpty()) {
                 return;
             }
-            isHighTextContrastEnabled = mIsHighTextContrastEnabled;
-            listeners = new ArrayMap<>(mHighTextContrastStateChangeListeners);
+            isHighTextContrastEnabled = mIsHighContrastTextEnabled;
+            listeners = new ArrayMap<>(mHighContrastTextStateChangeListeners);
         }
 
         final int numListeners = listeners.size();
         for (int i = 0; i < numListeners; i++) {
-            final HighTextContrastChangeListener listener = listeners.keyAt(i);
-            listeners.valueAt(i).post(() ->
-                    listener.onHighTextContrastStateChanged(isHighTextContrastEnabled));
+            final HighContrastTextStateChangeListener listener = listeners.keyAt(i);
+            listeners.valueAt(i).execute(() ->
+                    listener.onHighContrastTextStateChanged(isHighTextContrastEnabled));
         }
     }
 
diff --git a/core/java/android/view/accessibility/AccessibilityWindowInfo.java b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
index c92593f..7b6e070 100644
--- a/core/java/android/view/accessibility/AccessibilityWindowInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
@@ -880,10 +880,6 @@
      * @hide
      */
     public static String typeToString(int type) {
-        if (Flags.enableTypeWindowControl() && type == TYPE_WINDOW_CONTROL) {
-            return "TYPE_WINDOW_CONTROL";
-        }
-
         switch (type) {
             case TYPE_APPLICATION: {
                 return "TYPE_APPLICATION";
@@ -903,8 +899,12 @@
             case TYPE_MAGNIFICATION_OVERLAY: {
                 return "TYPE_MAGNIFICATION_OVERLAY";
             }
-            default:
+            default: {
+                if (Flags.enableTypeWindowControl() && type == TYPE_WINDOW_CONTROL) {
+                    return "TYPE_WINDOW_CONTROL";
+                }
                 return "<UNKNOWN:" + type + ">";
+            }
         }
     }
 
diff --git a/core/java/android/view/accessibility/flags/accessibility_flags.aconfig b/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
index 513587e..b9e9750 100644
--- a/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
+++ b/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
@@ -4,6 +4,13 @@
 # NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
 
 flag {
+    name: "a11y_expansion_state_api"
+    namespace: "accessibility"
+    description: "Enables new APIs for an app to convey if a node is expanded or collapsed."
+    bug: "362782536"
+}
+
+flag {
     name: "a11y_overlay_callbacks"
     is_exported: true
     namespace: "accessibility"
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 79ecfe1e..1a45939 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -117,6 +117,8 @@
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import sun.misc.Cleaner;
@@ -4914,7 +4916,22 @@
                     && (root.getWindowFlags() & WindowManager.LayoutParams.FLAG_SECURE) == 0) {
                 ViewNodeBuilder viewStructure = new ViewNodeBuilder();
                 viewStructure.setAutofillId(view.getAutofillId());
-                view.onProvideAutofillStructure(viewStructure, /* flags= */ 0);
+
+                // Post onProvideAutofillStructure to the UI thread
+                final CountDownLatch latch = new CountDownLatch(1);
+                afm.post(
+                    () -> {
+                        view.onProvideAutofillStructure(viewStructure, /* flags= */ 0);
+                        latch.countDown();
+                    }
+                );
+                try {
+                    latch.await(5000, TimeUnit.MILLISECONDS);
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                    return null;
+                }
+
                 // TODO(b/141703532): We don't call View#onProvideAutofillVirtualStructure for
                 //  efficiency reason. But this also means we will return null for virtual views
                 //  for now. We will add a new API to fetch the view node info of the virtual
diff --git a/core/java/android/view/autofill/AutofillStateFingerprint.java b/core/java/android/view/autofill/AutofillStateFingerprint.java
index 2db4285..7f3858e 100644
--- a/core/java/android/view/autofill/AutofillStateFingerprint.java
+++ b/core/java/android/view/autofill/AutofillStateFingerprint.java
@@ -97,7 +97,6 @@
             if (sDebug) {
                 Log.d(TAG, "Autofillable views count prior to auth:" + autofillableViews.size());
             }
-//            ArrayList<Integer> hashes = getFingerprintIds(autofillableViews);
 
             ArrayMap<Integer, View> hashes = getFingerprintIds(autofillableViews);
             for (Map.Entry<Integer, View> entry : hashes.entrySet()) {
@@ -123,7 +122,6 @@
                 if (view != null) {
                     int id = getEphemeralFingerprintId(view, 0 /* position irrelevant */);
                     AutofillId autofillId = view.getAutofillId();
-                    autofillId.setSessionId(mSessionId);
                     mHashToAutofillIdMap.put(id, autofillId);
                 } else {
                     if (sDebug) {
diff --git a/core/java/android/view/flags/refresh_rate_flags.aconfig b/core/java/android/view/flags/refresh_rate_flags.aconfig
index e3054da..7b04927 100644
--- a/core/java/android/view/flags/refresh_rate_flags.aconfig
+++ b/core/java/android/view/flags/refresh_rate_flags.aconfig
@@ -111,4 +111,12 @@
     description: "Feature flag to enable the functionality on views for the dVRR feature"
     bug: "335874198"
     is_fixed_read_only: true
+}
+
+flag {
+    name: "toolkit_frame_rate_animation_bugfix_25q1"
+    namespace: "toolkit"
+    description: "Feature flag to enable the fix for applyLegacyAnimation for VRR V QPR2"
+    bug: "335874198"
+    is_fixed_read_only: true
 }
\ No newline at end of file
diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java
index 806a593..0a83bdc 100644
--- a/core/java/android/view/inputmethod/InputMethodInfo.java
+++ b/core/java/android/view/inputmethod/InputMethodInfo.java
@@ -860,7 +860,7 @@
      * <p>e.g.<pre><code>startActivity(createStylusHandwritingSettingsActivityIntent());</code>
      * </pre></p>
      *
-     * @attr ref R.styleable#InputMethod_stylusHandwritingSettingsActivity
+     * @attr ref android.R.styleable#InputMethod_stylusHandwritingSettingsActivity
      * @see #getSettingsActivity()
      * @see #supportsStylusHandwriting()
      */
@@ -888,8 +888,8 @@
      * the IME language settings activity.</p>
      * <p>e.g.<pre><code>startActivity(createImeLanguageSettingsActivityIntent());</code></pre></p>
      *
-     * @attr ref R.styleable#InputMethod_languageSettingsActivity
-     * @attr ref R.styleable#InputMethod_settingsActivity
+     * @attr ref android.R.styleable#InputMethod_languageSettingsActivity
+     * @attr ref android.R.styleable#InputMethod_settingsActivity
      */
     @FlaggedApi(android.view.inputmethod.Flags.FLAG_IME_SWITCHER_REVAMP_API)
     @Nullable
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 2f649c2..1e5c6d8 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -465,13 +465,6 @@
     private static final long USE_ASYNC_SHOW_HIDE_METHOD = 352594277L; // This is a bug id.
 
     /**
-     * Version-gating is guarded by bug-fix flag.
-     */
-    private static final boolean ASYNC_SHOW_HIDE_METHOD_ENABLED =
-            !Flags.compatchangeForZerojankproxy()
-                || CompatChanges.isChangeEnabled(USE_ASYNC_SHOW_HIDE_METHOD);
-
-    /**
      * If {@code true}, avoid calling the
      * {@link com.android.server.inputmethod.InputMethodManagerService InputMethodManagerService}
      * by skipping the call to {@link IInputMethodManager#startInputOrWindowGainedFocus}
@@ -614,6 +607,15 @@
     @UnsupportedAppUsage
     Rect mCursorRect = new Rect();
 
+    /**
+     * Version-gating is guarded by bug-fix flag.
+     */
+    // Note: this is non-static so that it only gets initialized once CompatChanges has
+    // access to the correct application context.
+    private final boolean mAsyncShowHideMethodEnabled =
+            !Flags.compatchangeForZerojankproxy()
+                    || CompatChanges.isChangeEnabled(USE_ASYNC_SHOW_HIDE_METHOD);
+
     /** Cached value for {@link #isStylusHandwritingAvailable} for userId. */
     @GuardedBy("mH")
     private PropertyInvalidatedCache<Integer, Boolean> mStylusHandwritingAvailableCache;
@@ -2419,7 +2421,7 @@
                         mCurRootView.getLastClickToolType(),
                         resultReceiver,
                         reason,
-                        ASYNC_SHOW_HIDE_METHOD_ENABLED);
+                        mAsyncShowHideMethodEnabled);
             }
         }
     }
@@ -2463,7 +2465,7 @@
                     mCurRootView.getLastClickToolType(),
                     resultReceiver,
                     reason,
-                    ASYNC_SHOW_HIDE_METHOD_ENABLED);
+                    mAsyncShowHideMethodEnabled);
         }
     }
 
@@ -2572,7 +2574,7 @@
                 return true;
             } else {
                 return IInputMethodManagerGlobalInvoker.hideSoftInput(mClient, windowToken,
-                        statsToken, flags, resultReceiver, reason, ASYNC_SHOW_HIDE_METHOD_ENABLED);
+                        statsToken, flags, resultReceiver, reason, mAsyncShowHideMethodEnabled);
             }
         }
     }
@@ -2615,7 +2617,7 @@
             ImeTracker.forLogging().onProgress(statsToken, ImeTracker.PHASE_CLIENT_VIEW_SERVED);
 
             return IInputMethodManagerGlobalInvoker.hideSoftInput(mClient, view.getWindowToken(),
-                    statsToken, flags, null, reason, ASYNC_SHOW_HIDE_METHOD_ENABLED);
+                    statsToken, flags, null, reason, mAsyncShowHideMethodEnabled);
         }
     }
 
@@ -3392,7 +3394,7 @@
                         servedInputConnection == null ? null
                                 : servedInputConnection.asIRemoteAccessibilityInputConnection(),
                         view.getContext().getApplicationInfo().targetSdkVersion, targetUserId,
-                        mImeDispatcher, ASYNC_SHOW_HIDE_METHOD_ENABLED);
+                        mImeDispatcher, mAsyncShowHideMethodEnabled);
             } else {
                 res = IInputMethodManagerGlobalInvoker.startInputOrWindowGainedFocus(
                         startInputReason, mClient, windowGainingFocus, startInputFlags,
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index 510a92d..3f611c7 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -3636,7 +3636,7 @@
      * Returns the drawable that will be drawn between each item in the list.
      *
      * @return the current drawable drawn between list elements
-     * @attr ref R.styleable#ListView_divider
+     * @attr ref android.R.styleable#ListView_divider
      */
     @InspectableProperty
     @Nullable
@@ -3651,7 +3651,7 @@
      * height, you should also call {@link #setDividerHeight(int)}.
      *
      * @param divider the drawable to use
-     * @attr ref R.styleable#ListView_divider
+     * @attr ref android.R.styleable#ListView_divider
      */
     public void setDivider(@Nullable Drawable divider) {
         if (divider != null) {
diff --git a/core/java/android/window/BackMotionEvent.java b/core/java/android/window/BackMotionEvent.java
index 7cda3a3..8ac68ab 100644
--- a/core/java/android/window/BackMotionEvent.java
+++ b/core/java/android/window/BackMotionEvent.java
@@ -34,8 +34,6 @@
     private final float mTouchX;
     private final float mTouchY;
     private final float mProgress;
-    private final float mVelocityX;
-    private final float mVelocityY;
     private final boolean mTriggerBack;
 
     @BackEvent.SwipeEdge
@@ -51,10 +49,6 @@
      * @param touchX Absolute X location of the touch point of this event.
      * @param touchY Absolute Y location of the touch point of this event.
      * @param progress Value between 0 and 1 on how far along the back gesture is.
-     * @param velocityX X velocity computed from the touch point of this event.
-     *                  Value in pixels/second. {@link Float#NaN} if was not computed.
-     * @param velocityY Y velocity computed from the touch point of this event.
-     *                  Value in pixels/second. {@link Float#NaN} if was not computed.
      * @param triggerBack Indicates whether the back arrow is in the triggered state or not
      * @param swipeEdge Indicates which edge the swipe starts from.
      * @param departingAnimationTarget The remote animation target of the departing
@@ -64,16 +58,12 @@
             float touchX,
             float touchY,
             float progress,
-            float velocityX,
-            float velocityY,
             boolean triggerBack,
             @BackEvent.SwipeEdge int swipeEdge,
             @Nullable RemoteAnimationTarget departingAnimationTarget) {
         mTouchX = touchX;
         mTouchY = touchY;
         mProgress = progress;
-        mVelocityX = velocityX;
-        mVelocityY = velocityY;
         mTriggerBack = triggerBack;
         mSwipeEdge = swipeEdge;
         mDepartingAnimationTarget = departingAnimationTarget;
@@ -83,8 +73,6 @@
         mTouchX = in.readFloat();
         mTouchY = in.readFloat();
         mProgress = in.readFloat();
-        mVelocityX = in.readFloat();
-        mVelocityY = in.readFloat();
         mTriggerBack = in.readBoolean();
         mSwipeEdge = in.readInt();
         mDepartingAnimationTarget = in.readTypedObject(RemoteAnimationTarget.CREATOR);
@@ -113,8 +101,6 @@
         dest.writeFloat(mTouchX);
         dest.writeFloat(mTouchY);
         dest.writeFloat(mProgress);
-        dest.writeFloat(mVelocityX);
-        dest.writeFloat(mVelocityY);
         dest.writeBoolean(mTriggerBack);
         dest.writeInt(mSwipeEdge);
         dest.writeTypedObject(mDepartingAnimationTarget, flags);
@@ -145,24 +131,6 @@
     }
 
     /**
-     * Returns the X velocity computed from the touch point.
-     *
-     * @return value in pixels/second or {@link Float#NaN} if was not computed.
-     */
-    public float getVelocityX() {
-        return mVelocityX;
-    }
-
-    /**
-     * Returns the Y velocity computed from the touch point.
-     *
-     * @return value in pixels/second or {@link Float#NaN} if was not computed.
-     */
-    public float getVelocityY() {
-        return mVelocityY;
-    }
-
-    /**
      * Returns whether the back arrow is in the triggered state or not
      *
      * @return boolean indicating whether the back arrow is in the triggered state or not
@@ -195,8 +163,6 @@
                 + "mTouchX=" + mTouchX
                 + ", mTouchY=" + mTouchY
                 + ", mProgress=" + mProgress
-                + ", mVelocityX=" + mVelocityX
-                + ", mVelocityY=" + mVelocityY
                 + ", mTriggerBack=" + mTriggerBack
                 + ", mSwipeEdge" + mSwipeEdge
                 + ", mDepartingAnimationTarget" + mDepartingAnimationTarget
diff --git a/core/java/android/window/BackTouchTracker.java b/core/java/android/window/BackTouchTracker.java
index eb23af2..290c494 100644
--- a/core/java/android/window/BackTouchTracker.java
+++ b/core/java/android/window/BackTouchTracker.java
@@ -48,8 +48,6 @@
      */
     private float mInitTouchX;
     private float mInitTouchY;
-    private float mLatestVelocityX;
-    private float mLatestVelocityY;
     private float mStartThresholdX;
     private int mSwipeEdge;
     private boolean mShouldUpdateStartLocation = false;
@@ -58,7 +56,7 @@
     /**
      * Updates the tracker with a new motion event.
      */
-    public void update(float touchX, float touchY, float velocityX, float velocityY) {
+    public void update(float touchX, float touchY) {
         /**
          * If back was previously cancelled but the user has started swiping in the forward
          * direction again, restart back.
@@ -73,8 +71,6 @@
         }
         mLatestTouchX = touchX;
         mLatestTouchY = touchY;
-        mLatestVelocityX = velocityX;
-        mLatestVelocityY = velocityY;
     }
 
     /** Sets whether the back gesture is past the trigger threshold. */
@@ -156,8 +152,6 @@
                 /* touchX = */ mInitTouchX,
                 /* touchY = */ mInitTouchY,
                 /* progress = */ 0,
-                /* velocityX = */ 0,
-                /* velocityY = */ 0,
                 /* triggerBack = */ mTriggerBack,
                 /* swipeEdge = */ mSwipeEdge,
                 /* departingAnimationTarget = */ target);
@@ -242,8 +236,6 @@
                 /* touchX = */ mLatestTouchX,
                 /* touchY = */ mLatestTouchY,
                 /* progress = */ progress,
-                /* velocityX = */ mLatestVelocityX,
-                /* velocityY = */ mLatestVelocityY,
                 /* triggerBack = */ mTriggerBack,
                 /* swipeEdge = */ mSwipeEdge,
                 /* departingAnimationTarget = */ null);
diff --git a/core/java/android/window/ImeOnBackInvokedDispatcher.java b/core/java/android/window/ImeOnBackInvokedDispatcher.java
index 771dc7a..66c35e2 100644
--- a/core/java/android/window/ImeOnBackInvokedDispatcher.java
+++ b/core/java/android/window/ImeOnBackInvokedDispatcher.java
@@ -237,7 +237,7 @@
             try {
                 mIOnBackInvokedCallback.onBackStarted(
                         new BackMotionEvent(backEvent.getTouchX(), backEvent.getTouchY(),
-                                backEvent.getProgress(), 0f, 0f, false, backEvent.getSwipeEdge(),
+                                backEvent.getProgress(), false, backEvent.getSwipeEdge(),
                                 null));
             } catch (RemoteException e) {
                 Log.e(TAG, "Exception when invoking forwarded callback. e: ", e);
@@ -249,7 +249,7 @@
             try {
                 mIOnBackInvokedCallback.onBackProgressed(
                         new BackMotionEvent(backEvent.getTouchX(), backEvent.getTouchY(),
-                                backEvent.getProgress(), 0f, 0f, false, backEvent.getSwipeEdge(),
+                                backEvent.getProgress(), false, backEvent.getSwipeEdge(),
                                 null));
             } catch (RemoteException e) {
                 Log.e(TAG, "Exception when invoking forwarded callback. e: ", e);
diff --git a/core/java/android/window/KeyguardState.aidl b/core/java/android/window/KeyguardState.aidl
new file mode 100644
index 0000000..9612d95
--- /dev/null
+++ b/core/java/android/window/KeyguardState.aidl
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2024 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 android.window;
+
+/**
+ * @hide
+ */
+parcelable KeyguardState;
diff --git a/core/java/android/window/KeyguardState.java b/core/java/android/window/KeyguardState.java
new file mode 100644
index 0000000..6584d30
--- /dev/null
+++ b/core/java/android/window/KeyguardState.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2024 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 android.window;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+/**
+ * Data object of params for Keyguard related {@link WindowContainerTransaction} operation.
+ *
+ * @hide
+ */
+public final class KeyguardState implements Parcelable {
+
+    private final int mDisplayId;
+
+    private final boolean mKeyguardShowing;
+
+    private final boolean mAodShowing;
+
+
+    private KeyguardState(int displayId, boolean keyguardShowing, boolean aodShowing) {
+        mDisplayId = displayId;
+        mKeyguardShowing = keyguardShowing;
+        mAodShowing = aodShowing;
+    }
+
+    private KeyguardState(Parcel in) {
+        mDisplayId = in.readInt();
+        mKeyguardShowing = in.readBoolean();
+        mAodShowing = in.readBoolean();
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        dest.writeInt(mDisplayId);
+        dest.writeBoolean(mKeyguardShowing);
+        dest.writeBoolean(mAodShowing);
+    }
+
+    @NonNull
+    public static final Creator<KeyguardState> CREATOR =
+            new Creator<KeyguardState>() {
+                @Override
+                public KeyguardState createFromParcel(Parcel in) {
+                    return new KeyguardState(in);
+                }
+
+                @Override
+                public KeyguardState[] newArray(int size) {
+                    return new KeyguardState[size];
+                }
+            };
+
+    /**
+     * Gets the display id of this {@link KeyguardState}.
+     */
+    public int getDisplayId() {
+        return mDisplayId;
+    }
+
+    /** Returns the keyguard showing value. */
+    public boolean getKeyguardShowing() {
+        return mKeyguardShowing;
+    }
+
+    /** Returns the aod showing value. */
+    public boolean getAodShowing() {
+        return mAodShowing;
+    }
+
+    @Override
+    public String toString() {
+        return "KeyguardState{ displayId=" + mDisplayId
+                + ", keyguardShowing=" + mKeyguardShowing
+                + ", aodShowing=" + mAodShowing
+                + '}';
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mDisplayId, mKeyguardShowing, mAodShowing);
+    }
+
+    @Override
+    public boolean equals(@Nullable Object obj) {
+        if (!(obj instanceof KeyguardState other)) {
+            return false;
+        }
+        return mDisplayId == other.mDisplayId
+                && mKeyguardShowing == other.mKeyguardShowing
+                && mAodShowing == other.mAodShowing;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    /** Builder to construct the {@link KeyguardState}. */
+    public static final class Builder {
+
+        private final int mDisplayId;
+
+        private boolean mKeyguardShowing;
+
+        private boolean mAodShowing;
+
+        /**
+         * @param displayId the display of this {@link KeyguardState}.
+         */
+        public Builder(int displayId) {
+            mDisplayId = displayId;
+        }
+
+        /**
+         * Sets the boolean value for this operation.
+         */
+        @NonNull
+        public Builder setKeyguardShowing(boolean keyguardShowing) {
+            mKeyguardShowing = keyguardShowing;
+            return this;
+        }
+
+        /**
+         * Sets the boolean value for this operation.
+         */
+        @NonNull
+        public Builder setAodShowing(boolean aodShowing) {
+            mAodShowing = aodShowing;
+            return this;
+        }
+
+        /**
+         * Constructs the {@link KeyguardState}.
+         */
+        @NonNull
+        public KeyguardState build() {
+            return new KeyguardState(mDisplayId, mKeyguardShowing, mAodShowing);
+        }
+    }
+}
diff --git a/core/java/android/window/OnBackInvokedDispatcher.java b/core/java/android/window/OnBackInvokedDispatcher.java
index 0632a37..02ed57d 100644
--- a/core/java/android/window/OnBackInvokedDispatcher.java
+++ b/core/java/android/window/OnBackInvokedDispatcher.java
@@ -16,11 +16,14 @@
 
 package android.window;
 
+import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.SuppressLint;
 
+import com.android.window.flags.Flags;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -43,6 +46,7 @@
     @IntDef({
             PRIORITY_DEFAULT,
             PRIORITY_OVERLAY,
+            PRIORITY_SYSTEM_NAVIGATION_OBSERVER,
     })
     @Retention(RetentionPolicy.SOURCE)
     @interface Priority{}
@@ -67,6 +71,20 @@
     int PRIORITY_SYSTEM = -1;
 
     /**
+     * Priority level of {@link OnBackInvokedCallback}s designed to observe system-level back
+     * handling.
+     *
+     * <p>Callbacks registered with this priority do not consume back events. They receive back
+     * events whenever the system handles a back navigation and have no impact on the normal back
+     * navigation flow. Useful for logging or analytics.
+     *
+     * <p>Only one callback with {@link #PRIORITY_SYSTEM_NAVIGATION_OBSERVER} can be registered at a
+     * time.
+     */
+    @FlaggedApi(Flags.FLAG_PREDICTIVE_BACK_PRIORITY_SYSTEM_NAVIGATION_OBSERVER)
+    int PRIORITY_SYSTEM_NAVIGATION_OBSERVER = -2;
+
+    /**
      * Registers a {@link OnBackInvokedCallback}.
      *
      * Within the same priority level, callbacks are invoked in the reverse order in which
diff --git a/core/java/android/window/ProxyOnBackInvokedDispatcher.java b/core/java/android/window/ProxyOnBackInvokedDispatcher.java
index 56c05b2..dfc4a58 100644
--- a/core/java/android/window/ProxyOnBackInvokedDispatcher.java
+++ b/core/java/android/window/ProxyOnBackInvokedDispatcher.java
@@ -16,6 +16,8 @@
 
 package android.window;
 
+import static com.android.window.flags.Flags.predictiveBackPrioritySystemNavigationObserver;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.Context;
@@ -95,7 +97,7 @@
         synchronized (mLock) {
             mCallbacks.add(Pair.create(callback, priority));
             if (mActualDispatcher != null) {
-                if (priority <= PRIORITY_SYSTEM) {
+                if (priority == PRIORITY_SYSTEM) {
                     mActualDispatcher.registerSystemOnBackInvokedCallback(callback);
                 } else {
                     mActualDispatcher.registerOnBackInvokedCallback(priority, callback);
@@ -123,10 +125,19 @@
         }
         for (Pair<OnBackInvokedCallback, Integer> callbackPair : mCallbacks) {
             int priority = callbackPair.second;
-            if (priority >= PRIORITY_DEFAULT) {
-                mActualDispatcher.registerOnBackInvokedCallback(priority, callbackPair.first);
+            if (predictiveBackPrioritySystemNavigationObserver()) {
+                if (priority >= PRIORITY_DEFAULT
+                        || priority == PRIORITY_SYSTEM_NAVIGATION_OBSERVER) {
+                    mActualDispatcher.registerOnBackInvokedCallback(priority, callbackPair.first);
+                } else {
+                    mActualDispatcher.registerSystemOnBackInvokedCallback(callbackPair.first);
+                }
             } else {
-                mActualDispatcher.registerSystemOnBackInvokedCallback(callbackPair.first);
+                if (priority >= PRIORITY_DEFAULT) {
+                    mActualDispatcher.registerOnBackInvokedCallback(priority, callbackPair.first);
+                } else {
+                    mActualDispatcher.registerSystemOnBackInvokedCallback(callbackPair.first);
+                }
             }
         }
         mCallbacks.clear();
diff --git a/core/java/android/window/TaskConstants.java b/core/java/android/window/TaskConstants.java
index 44bb33db..46bc30e 100644
--- a/core/java/android/window/TaskConstants.java
+++ b/core/java/android/window/TaskConstants.java
@@ -53,25 +53,30 @@
      */
     public static final int TASK_CHILD_LAYER_COMPAT_UI = TASK_CHILD_LAYER_REGION_SIZE;
 
+    /**
+     * Settings dialogs belonging to the task (e.g. Open by default settings dialog)
+     * @hide
+     */
+    public static final int TASK_CHILD_LAYER_SETTINGS_DIALOG = 2 * TASK_CHILD_LAYER_REGION_SIZE;
 
     /**
      * Captions, window frames and resize handlers around task windows.
      * @hide
      */
-    public static final int TASK_CHILD_LAYER_WINDOW_DECORATIONS = 2 * TASK_CHILD_LAYER_REGION_SIZE;
+    public static final int TASK_CHILD_LAYER_WINDOW_DECORATIONS = 3 * TASK_CHILD_LAYER_REGION_SIZE;
 
     /**
      * Overlays the task when going into PIP w/ gesture navigation.
      * @hide
      */
     public static final int TASK_CHILD_LAYER_RECENTS_ANIMATION_PIP_OVERLAY =
-            3 * TASK_CHILD_LAYER_REGION_SIZE;
+            4 * TASK_CHILD_LAYER_REGION_SIZE;
 
     /**
      * Allows other apps to add overlays on the task (i.e. game dashboard)
      * @hide
      */
-    public static final int TASK_CHILD_LAYER_TASK_OVERLAY = 4 * TASK_CHILD_LAYER_REGION_SIZE;
+    public static final int TASK_CHILD_LAYER_TASK_OVERLAY = 5 * TASK_CHILD_LAYER_REGION_SIZE;
 
 
     /**
@@ -95,6 +100,7 @@
             TASK_CHILD_LAYER_TASK_BACKGROUND,
             TASK_CHILD_LAYER_LETTERBOX_BACKGROUND,
             TASK_CHILD_LAYER_COMPAT_UI,
+            TASK_CHILD_LAYER_SETTINGS_DIALOG,
             TASK_CHILD_LAYER_WINDOW_DECORATIONS,
             TASK_CHILD_LAYER_RECENTS_ANIMATION_PIP_OVERLAY,
             TASK_CHILD_LAYER_TASK_OVERLAY,
diff --git a/core/java/android/window/WindowContainerTransaction.java b/core/java/android/window/WindowContainerTransaction.java
index 314bf89..8e495ec 100644
--- a/core/java/android/window/WindowContainerTransaction.java
+++ b/core/java/android/window/WindowContainerTransaction.java
@@ -28,6 +28,7 @@
 import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.SuppressLint;
 import android.annotation.TestApi;
 import android.app.PendingIntent;
 import android.app.WindowConfiguration;
@@ -44,6 +45,7 @@
 import android.view.InsetsFrameProvider;
 import android.view.InsetsSource;
 import android.view.SurfaceControl;
+import android.view.WindowInsets;
 import android.view.WindowInsets.Type.InsetsType;
 
 import com.android.window.flags.Flags;
@@ -267,6 +269,23 @@
     }
 
     /**
+     * Sets whether the IME insets should be excluded by {@link com.android.server.wm.InsetsPolicy}.
+     * @hide
+     */
+    @SuppressLint("UnflaggedApi")
+    @NonNull
+    public WindowContainerTransaction setExcludeImeInsets(
+            @NonNull WindowContainerToken container, boolean exclude) {
+        final HierarchyOp hierarchyOp =
+                new HierarchyOp.Builder(HierarchyOp.HIERARCHY_OP_TYPE_SET_EXCLUDE_INSETS_TYPES)
+                        .setContainer(container.asBinder())
+                        .setExcludeInsetsTypes(exclude ? WindowInsets.Type.ime() : 0)
+                        .build();
+        mHierarchyOps.add(hierarchyOp);
+        return this;
+    }
+
+    /**
      * Sets whether a container or its children should be hidden. When {@code false}, the existing
      * visibility of the container applies, but when {@code true} the container will be forced
      * to be hidden.
@@ -850,6 +869,24 @@
     }
 
     /**
+     * Adds a {@link KeyguardState} to apply to the given displays.
+     *
+     * @hide
+     */
+    @NonNull
+    public WindowContainerTransaction addKeyguardState(
+            @NonNull KeyguardState keyguardState) {
+        Objects.requireNonNull(keyguardState);
+        final HierarchyOp hierarchyOp =
+                new HierarchyOp.Builder(
+                        HierarchyOp.HIERARCHY_OP_TYPE_SET_KEYGUARD_STATE)
+                        .setKeyguardState(keyguardState)
+                        .build();
+        mHierarchyOps.add(hierarchyOp);
+        return this;
+    }
+
+    /**
      * Sets/removes the always on top flag for this {@code windowContainer}. See
      * {@link com.android.server.wm.ConfigurationContainer#setAlwaysOnTop(boolean)}.
      * Please note that this method is only intended to be used for a
@@ -1449,6 +1486,8 @@
         public static final int HIERARCHY_OP_TYPE_MOVE_PIP_ACTIVITY_TO_PINNED_TASK = 18;
         public static final int HIERARCHY_OP_TYPE_SET_IS_TRIMMABLE = 19;
         public static final int HIERARCHY_OP_TYPE_RESTORE_BACK_NAVIGATION = 20;
+        public static final int HIERARCHY_OP_TYPE_SET_EXCLUDE_INSETS_TYPES = 21;
+        public static final int HIERARCHY_OP_TYPE_SET_KEYGUARD_STATE = 22;
 
         // The following key(s) are for use with mLaunchOptions:
         // When launching a task (eg. from recents), this is the taskId to be launched.
@@ -1496,6 +1535,9 @@
         private TaskFragmentOperation mTaskFragmentOperation;
 
         @Nullable
+        private KeyguardState mKeyguardState;
+
+        @Nullable
         private PendingIntent mPendingIntent;
 
         @Nullable
@@ -1512,6 +1554,8 @@
 
         private boolean mIsTrimmableFromRecents;
 
+        private @InsetsType int mExcludeInsetsTypes;
+
         public static HierarchyOp createForReparent(
                 @NonNull IBinder container, @Nullable IBinder reparent, boolean toTop) {
             return new HierarchyOp.Builder(HIERARCHY_OP_TYPE_REPARENT)
@@ -1644,11 +1688,13 @@
             mLaunchOptions = copy.mLaunchOptions;
             mActivityIntent = copy.mActivityIntent;
             mTaskFragmentOperation = copy.mTaskFragmentOperation;
+            mKeyguardState = copy.mKeyguardState;
             mPendingIntent = copy.mPendingIntent;
             mShortcutInfo = copy.mShortcutInfo;
             mAlwaysOnTop = copy.mAlwaysOnTop;
             mReparentLeafTaskIfRelaunch = copy.mReparentLeafTaskIfRelaunch;
             mIsTrimmableFromRecents = copy.mIsTrimmableFromRecents;
+            mExcludeInsetsTypes = copy.mExcludeInsetsTypes;
         }
 
         protected HierarchyOp(Parcel in) {
@@ -1666,11 +1712,13 @@
             mLaunchOptions = in.readBundle();
             mActivityIntent = in.readTypedObject(Intent.CREATOR);
             mTaskFragmentOperation = in.readTypedObject(TaskFragmentOperation.CREATOR);
+            mKeyguardState = in.readTypedObject(KeyguardState.CREATOR);
             mPendingIntent = in.readTypedObject(PendingIntent.CREATOR);
             mShortcutInfo = in.readTypedObject(ShortcutInfo.CREATOR);
             mAlwaysOnTop = in.readBoolean();
             mReparentLeafTaskIfRelaunch = in.readBoolean();
             mIsTrimmableFromRecents = in.readBoolean();
+            mExcludeInsetsTypes = in.readInt();
         }
 
         public int getType() {
@@ -1746,6 +1794,11 @@
         }
 
         @Nullable
+        public KeyguardState getKeyguardState() {
+            return mKeyguardState;
+        }
+
+        @Nullable
         public PendingIntent getPendingIntent() {
             return mPendingIntent;
         }
@@ -1772,6 +1825,10 @@
             return mIsTrimmableFromRecents;
         }
 
+        public @InsetsType int getExcludeInsetsTypes() {
+            return mExcludeInsetsTypes;
+        }
+
         /** Gets a string representation of a hierarchy-op type. */
         public static String hopToString(int type) {
             switch (type) {
@@ -1795,6 +1852,7 @@
                     return "setReparentLeafTaskIfRelaunch";
                 case HIERARCHY_OP_TYPE_ADD_TASK_FRAGMENT_OPERATION:
                     return "addTaskFragmentOperation";
+                case HIERARCHY_OP_TYPE_SET_EXCLUDE_INSETS_TYPES: return "setExcludeInsetsTypes";
                 default: return "HOP(" + type + ")";
             }
         }
@@ -1868,6 +1926,14 @@
                     sb.append("fragmentToken= ").append(mContainer)
                             .append(" operation= ").append(mTaskFragmentOperation);
                     break;
+                case HIERARCHY_OP_TYPE_SET_EXCLUDE_INSETS_TYPES:
+                    sb.append("container= ").append(mContainer)
+                            .append(" mExcludeInsetsTypes= ")
+                            .append(WindowInsets.Type.toString(mExcludeInsetsTypes));
+                    break;
+                case HIERARCHY_OP_TYPE_SET_KEYGUARD_STATE:
+                    sb.append("KeyguardState= ").append(mKeyguardState);
+                    break;
                 case HIERARCHY_OP_TYPE_SET_IS_TRIMMABLE:
                     sb.append("container= ").append(mContainer)
                             .append(" isTrimmable= ")
@@ -1898,11 +1964,13 @@
             dest.writeBundle(mLaunchOptions);
             dest.writeTypedObject(mActivityIntent, flags);
             dest.writeTypedObject(mTaskFragmentOperation, flags);
+            dest.writeTypedObject(mKeyguardState, flags);
             dest.writeTypedObject(mPendingIntent, flags);
             dest.writeTypedObject(mShortcutInfo, flags);
             dest.writeBoolean(mAlwaysOnTop);
             dest.writeBoolean(mReparentLeafTaskIfRelaunch);
             dest.writeBoolean(mIsTrimmableFromRecents);
+            dest.writeInt(mExcludeInsetsTypes);
         }
 
         @Override
@@ -1958,6 +2026,9 @@
             private TaskFragmentOperation mTaskFragmentOperation;
 
             @Nullable
+            private KeyguardState mKeyguardState;
+
+            @Nullable
             private PendingIntent mPendingIntent;
 
             @Nullable
@@ -1974,6 +2045,8 @@
 
             private boolean mIsTrimmableFromRecents;
 
+            private @InsetsType int mExcludeInsetsTypes;
+
             Builder(int type) {
                 mType = type;
             }
@@ -2044,6 +2117,12 @@
                 return this;
             }
 
+            Builder setKeyguardState(
+                    @Nullable KeyguardState keyguardState) {
+                mKeyguardState = keyguardState;
+                return this;
+            }
+
             Builder setReparentLeafTaskIfRelaunch(boolean reparentLeafTaskIfRelaunch) {
                 mReparentLeafTaskIfRelaunch = reparentLeafTaskIfRelaunch;
                 return this;
@@ -2069,6 +2148,11 @@
                 return this;
             }
 
+            Builder setExcludeInsetsTypes(@InsetsType int excludeInsetsTypes) {
+                mExcludeInsetsTypes = excludeInsetsTypes;
+                return this;
+            }
+
             HierarchyOp build() {
                 final HierarchyOp hierarchyOp = new HierarchyOp(mType);
                 hierarchyOp.mContainer = mContainer;
@@ -2088,11 +2172,13 @@
                 hierarchyOp.mPendingIntent = mPendingIntent;
                 hierarchyOp.mAlwaysOnTop = mAlwaysOnTop;
                 hierarchyOp.mTaskFragmentOperation = mTaskFragmentOperation;
+                hierarchyOp.mKeyguardState = mKeyguardState;
                 hierarchyOp.mShortcutInfo = mShortcutInfo;
                 hierarchyOp.mBounds = mBounds;
                 hierarchyOp.mIncludingParents = mIncludingParents;
                 hierarchyOp.mReparentLeafTaskIfRelaunch = mReparentLeafTaskIfRelaunch;
                 hierarchyOp.mIsTrimmableFromRecents = mIsTrimmableFromRecents;
+                hierarchyOp.mExcludeInsetsTypes = mExcludeInsetsTypes;
 
                 return hierarchyOp;
             }
diff --git a/core/java/android/window/WindowOnBackInvokedDispatcher.java b/core/java/android/window/WindowOnBackInvokedDispatcher.java
index bb89a24..44a374f 100644
--- a/core/java/android/window/WindowOnBackInvokedDispatcher.java
+++ b/core/java/android/window/WindowOnBackInvokedDispatcher.java
@@ -16,6 +16,8 @@
 
 package android.window;
 
+import static com.android.window.flags.Flags.predictiveBackPrioritySystemNavigationObserver;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.Activity;
@@ -103,6 +105,9 @@
     public final TreeMap<Integer, ArrayList<OnBackInvokedCallback>>
             mOnBackInvokedCallbacks = new TreeMap<>();
 
+    @VisibleForTesting
+    public OnBackInvokedCallback mSystemNavigationObserverCallback = null;
+
     private Checker mChecker;
     private final Object mLock = new Object();
     // The threshold for back swipe full progress.
@@ -119,7 +124,7 @@
         if (!isBackGestureInProgress() || ev == null || ev.getAction() != MotionEvent.ACTION_MOVE) {
             return;
         }
-        mTouchTracker.update(ev.getX(), ev.getY(), Float.NaN, Float.NaN);
+        mTouchTracker.update(ev.getX(), ev.getY());
         if (mTouchTracker.shouldUpdateStartLocation()) {
             // Reset the start location on the first event after starting back, so that
             // the beginning of the animation feels smooth.
@@ -170,6 +175,20 @@
         }
     }
 
+    private void registerSystemNavigationObserverCallback(@NonNull OnBackInvokedCallback callback) {
+        synchronized (mLock) {
+            // If callback has already been added as regular callback, remove it.
+            if (mAllCallbacks.containsKey(callback)) {
+                if (DEBUG) {
+                    Log.i(TAG, "Callback already added. Removing and re-adding it as "
+                            + "system-navigation-observer-callback.");
+                }
+                removeCallbackInternal(callback);
+            }
+            mSystemNavigationObserverCallback = callback;
+        }
+    }
+
     /**
      * Register a callback bypassing platform checks. This is used to register compatibility
      * callbacks.
@@ -181,6 +200,12 @@
                 mImeDispatcher.registerOnBackInvokedCallback(priority, callback);
                 return;
             }
+            if (predictiveBackPrioritySystemNavigationObserver()) {
+                if (priority == PRIORITY_SYSTEM_NAVIGATION_OBSERVER) {
+                    registerSystemNavigationObserverCallback(callback);
+                    return;
+                }
+            }
             if (callback instanceof ImeOnBackInvokedDispatcher.ImeOnBackInvokedCallback) {
                 if (callback instanceof ImeOnBackInvokedDispatcher.DefaultImeOnBackAnimationCallback
                         && mImeBackAnimationController != null) {
@@ -202,6 +227,13 @@
                 Integer prevPriority = mAllCallbacks.get(callback);
                 mOnBackInvokedCallbacks.get(prevPriority).remove(callback);
             }
+            if (mSystemNavigationObserverCallback == callback) {
+                mSystemNavigationObserverCallback = null;
+                if (DEBUG) {
+                    Log.i(TAG, "Callback already registered (as system-navigation-observer "
+                            + "callback). Removing and re-adding it.");
+                }
+            }
 
             OnBackInvokedCallback previousTopCallback = getTopCallback();
             callbacks.add(callback);
@@ -221,6 +253,10 @@
                 mImeDispatcher.unregisterOnBackInvokedCallback(callback);
                 return;
             }
+            if (mSystemNavigationObserverCallback == callback) {
+                mSystemNavigationObserverCallback = null;
+                return;
+            }
             if (callback instanceof ImeOnBackInvokedDispatcher.DefaultImeOnBackAnimationCallback) {
                 callback = mImeBackAnimationController;
             }
@@ -230,25 +266,29 @@
                 }
                 return;
             }
-            OnBackInvokedCallback previousTopCallback = getTopCallback();
-            Integer priority = mAllCallbacks.get(callback);
-            ArrayList<OnBackInvokedCallback> callbacks = mOnBackInvokedCallbacks.get(priority);
-            callbacks.remove(callback);
-            if (callbacks.isEmpty()) {
-                mOnBackInvokedCallbacks.remove(priority);
-            }
-            mAllCallbacks.remove(callback);
-            // Re-populate the top callback to WM if the removed callback was previously the top
-            // one.
-            if (previousTopCallback == callback) {
-                // We should call onBackCancelled() when an active callback is removed from
-                // dispatcher.
-                mProgressAnimator.removeOnBackCancelledFinishCallback();
-                mProgressAnimator.removeOnBackInvokedFinishCallback();
-                sendCancelledIfInProgress(callback);
-                mHandler.post(mProgressAnimator::reset);
-                setTopOnBackInvokedCallback(getTopCallback());
-            }
+            removeCallbackInternal(callback);
+        }
+    }
+
+    private void removeCallbackInternal(@NonNull OnBackInvokedCallback callback) {
+        OnBackInvokedCallback previousTopCallback = getTopCallback();
+        Integer priority = mAllCallbacks.get(callback);
+        ArrayList<OnBackInvokedCallback> callbacks = mOnBackInvokedCallbacks.get(priority);
+        callbacks.remove(callback);
+        if (callbacks.isEmpty()) {
+            mOnBackInvokedCallbacks.remove(priority);
+        }
+        mAllCallbacks.remove(callback);
+        // Re-populate the top callback to WM if the removed callback was previously the top
+        // one.
+        if (previousTopCallback == callback) {
+            // We should call onBackCancelled() when an active callback is removed from
+            // dispatcher.
+            mProgressAnimator.removeOnBackCancelledFinishCallback();
+            mProgressAnimator.removeOnBackInvokedFinishCallback();
+            sendCancelledIfInProgress(callback);
+            mHandler.post(mProgressAnimator::reset);
+            setTopOnBackInvokedCallback(getTopCallback());
         }
     }
 
@@ -304,6 +344,7 @@
             mHandler.post(mProgressAnimator::reset);
             mAllCallbacks.clear();
             mOnBackInvokedCallbacks.clear();
+            mSystemNavigationObserverCallback = null;
         }
     }
 
@@ -315,6 +356,25 @@
         }
     }
 
+    /**
+     * Tries to call {@link OnBackInvokedCallback#onBackInvoked} on the system navigation observer
+     * callback (if one is set and if the top-most regular callback has
+     * {@link OnBackInvokedDispatcher#PRIORITY_SYSTEM})
+     */
+    public void tryInvokeSystemNavigationObserverCallback() {
+        OnBackInvokedCallback topCallback = getTopCallback();
+        Integer callbackPriority = mAllCallbacks.getOrDefault(topCallback, null);
+        if (callbackPriority != null && callbackPriority == PRIORITY_SYSTEM) {
+            invokeSystemNavigationObserverCallback();
+        }
+    }
+
+    private void invokeSystemNavigationObserverCallback() {
+        if (mSystemNavigationObserverCallback != null) {
+            mSystemNavigationObserverCallback.onBackInvoked();
+        }
+    }
+
     private void setTopOnBackInvokedCallback(@Nullable OnBackInvokedCallback callback) {
         if (mWindowSession == null || mWindow == null) {
             return;
@@ -324,7 +384,9 @@
             if (callback != null) {
                 int priority = mAllCallbacks.get(callback);
                 final IOnBackInvokedCallback iCallback = new OnBackInvokedCallbackWrapper(callback,
-                        mTouchTracker, mProgressAnimator, mHandler, this::callOnKeyPreIme);
+                        mTouchTracker, mProgressAnimator, mHandler, this::callOnKeyPreIme,
+                        this::invokeSystemNavigationObserverCallback,
+                        /*isSystemCallback*/ priority == PRIORITY_SYSTEM);
                 callbackInfo = new OnBackInvokedCallbackInfo(
                         iCallback,
                         priority,
@@ -416,18 +478,26 @@
         private final Handler mHandler;
         @NonNull
         private final BooleanSupplier mOnKeyPreIme;
+        @NonNull
+        private final Runnable mSystemNavigationObserverCallbackRunnable;
+        private final boolean mIsSystemCallback;
 
         OnBackInvokedCallbackWrapper(
                 @NonNull OnBackInvokedCallback callback,
                 @NonNull BackTouchTracker touchTracker,
                 @NonNull BackProgressAnimator progressAnimator,
                 @NonNull Handler handler,
-                @NonNull BooleanSupplier onKeyPreIme) {
+                @NonNull BooleanSupplier onKeyPreIme,
+                @NonNull Runnable systemNavigationObserverCallbackRunnable,
+                boolean isSystemCallback
+        ) {
             mCallback = new WeakReference<>(callback);
             mTouchTracker = touchTracker;
             mProgressAnimator = progressAnimator;
             mHandler = handler;
             mOnKeyPreIme = onKeyPreIme;
+            mSystemNavigationObserverCallbackRunnable = systemNavigationObserverCallbackRunnable;
+            mIsSystemCallback = isSystemCallback;
         }
 
         @Override
@@ -494,9 +564,17 @@
                 OnBackAnimationCallback animationCallback = getBackAnimationCallback();
                 if (animationCallback != null
                         && !(callback instanceof ImeBackAnimationController)) {
-                    mProgressAnimator.onBackInvoked(callback::onBackInvoked);
+                    mProgressAnimator.onBackInvoked(() -> {
+                        if (mIsSystemCallback) {
+                            mSystemNavigationObserverCallbackRunnable.run();
+                        }
+                        callback.onBackInvoked();
+                    });
                 } else {
                     mProgressAnimator.reset();
+                    if (mIsSystemCallback) {
+                        mSystemNavigationObserverCallbackRunnable.run();
+                    }
                     callback.onBackInvoked();
                 }
             });
@@ -597,9 +675,18 @@
                                 + " application manifest.");
                 return false;
             }
-            if (priority < 0) {
-                throw new IllegalArgumentException("Application registered OnBackInvokedCallback "
-                        + "cannot have negative priority. Priority: " + priority);
+            if (predictiveBackPrioritySystemNavigationObserver()) {
+                if (priority < 0 && priority != PRIORITY_SYSTEM_NAVIGATION_OBSERVER) {
+                    throw new IllegalArgumentException("Application registered "
+                            + "OnBackInvokedCallback cannot have negative priority. Priority: "
+                            + priority);
+                }
+            } else {
+                if (priority < 0) {
+                    throw new IllegalArgumentException("Application registered "
+                            + "OnBackInvokedCallback cannot have negative priority. Priority: "
+                            + priority);
+                }
             }
             Objects.requireNonNull(callback);
             return true;
diff --git a/core/java/android/window/flags/DesktopModeFlags.java b/core/java/android/window/flags/DesktopModeFlags.java
index 944a106..47af50da 100644
--- a/core/java/android/window/flags/DesktopModeFlags.java
+++ b/core/java/android/window/flags/DesktopModeFlags.java
@@ -64,7 +64,8 @@
     ENABLE_WINDOWING_EDGE_DRAG_RESIZE(Flags::enableWindowingEdgeDragResize, true),
     ENABLE_DESKTOP_WINDOWING_TASKBAR_RUNNING_APPS(
             Flags::enableDesktopWindowingTaskbarRunningApps, true),
-    ENABLE_DESKTOP_WINDOWING_TRANSITIONS(Flags::enableDesktopWindowingTransitions, false);
+    ENABLE_DESKTOP_WINDOWING_TRANSITIONS(Flags::enableDesktopWindowingTransitions, false),
+    ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS(Flags::enableDesktopWindowingExitTransitions, false);
 
     private static final String TAG = "DesktopModeFlagsUtil";
     // Function called to obtain aconfig flag value.
diff --git a/core/java/android/window/flags/lse_desktop_experience.aconfig b/core/java/android/window/flags/lse_desktop_experience.aconfig
index fbc30ed..b22aa22 100644
--- a/core/java/android/window/flags/lse_desktop_experience.aconfig
+++ b/core/java/android/window/flags/lse_desktop_experience.aconfig
@@ -162,6 +162,13 @@
 }
 
 flag {
+    name: "enable_a11y_metrics"
+    namespace: "lse_desktop_experience"
+    description: "Whether to enable log collection for a11y actions in desktop windowing mode"
+    bug: "341319597"
+}
+
+flag {
     name: "enable_caption_compat_inset_force_consumption"
     namespace: "lse_desktop_experience"
     description: "Enables force-consumption of caption bar insets for immersive apps in freeform"
@@ -306,3 +313,10 @@
     description: "Allow entering desktop mode by default on freeform displays"
     bug: "361419732"
 }
+
+flag {
+    name: "enable_desktop_app_launch_alttab_transitions"
+    namespace: "lse_desktop_experience"
+    description: "Enables custom transitions for alt-tab app launches in Desktop Mode."
+    bug: "370735595"
+}
\ No newline at end of file
diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig
index ccaaf63..c9b93c9 100644
--- a/core/java/android/window/flags/windowing_frontend.aconfig
+++ b/core/java/android/window/flags/windowing_frontend.aconfig
@@ -299,3 +299,19 @@
     purpose: PURPOSE_BUGFIX
   }
 }
+
+flag {
+  name: "ensure_keyguard_does_transition_starting"
+  namespace: "windowing_frontend"
+  description: "Ensure that keyguard is the one starting transitions, instead of delegating to Core"
+  bug: "364930619"
+  is_fixed_read_only: true
+}
+
+flag {
+    name: "predictive_back_priority_system_navigation_observer"
+    namespace: "systemui"
+    description: "PRIORITY_SYSTEM_NAVIGATION_OBSERVER predictive back API extension"
+    is_fixed_read_only: true
+    bug: "362938401"
+}
diff --git a/core/java/com/android/internal/notification/SystemNotificationChannels.java b/core/java/com/android/internal/notification/SystemNotificationChannels.java
index fef5e83..4aebde5 100644
--- a/core/java/com/android/internal/notification/SystemNotificationChannels.java
+++ b/core/java/com/android/internal/notification/SystemNotificationChannels.java
@@ -26,6 +26,7 @@
 import android.os.RemoteException;
 
 import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -37,38 +38,40 @@
      * @deprecated Legacy system channel, which is no longer used,
      */
     @Deprecated public static String VIRTUAL_KEYBOARD  = "VIRTUAL_KEYBOARD";
-    public static String PHYSICAL_KEYBOARD = "PHYSICAL_KEYBOARD";
-    public static String SECURITY = "SECURITY";
-    public static String CAR_MODE = "CAR_MODE";
-    public static String ACCOUNT = "ACCOUNT";
-    public static String DEVELOPER = "DEVELOPER";
-    public static String DEVELOPER_IMPORTANT = "DEVELOPER_IMPORTANT";
-    public static String UPDATES = "UPDATES";
-    public static String NETWORK_STATUS = "NETWORK_STATUS";
-    public static String NETWORK_ALERTS = "NETWORK_ALERTS";
-    public static String NETWORK_AVAILABLE = "NETWORK_AVAILABLE";
-    public static String VPN = "VPN";
+    public static final String PHYSICAL_KEYBOARD = "PHYSICAL_KEYBOARD";
+    public static final String SECURITY = "SECURITY";
+    public static final String CAR_MODE = "CAR_MODE";
+    public static final String ACCOUNT = "ACCOUNT";
+    public static final String DEVELOPER = "DEVELOPER";
+    public static final String DEVELOPER_IMPORTANT = "DEVELOPER_IMPORTANT";
+    public static final String UPDATES = "UPDATES";
+    public static final String NETWORK_STATUS = "NETWORK_STATUS";
+    public static final String NETWORK_ALERTS = "NETWORK_ALERTS";
+    public static final String NETWORK_AVAILABLE = "NETWORK_AVAILABLE";
+    public static final String VPN = "VPN";
     /**
      * @deprecated Legacy device admin channel with low importance which is no longer used,
      *  Use the high importance {@link #DEVICE_ADMIN} channel instead.
      */
-    @Deprecated public static String DEVICE_ADMIN_DEPRECATED = "DEVICE_ADMIN";
-    public static String DEVICE_ADMIN = "DEVICE_ADMIN_ALERTS";
-    public static String ALERTS = "ALERTS";
-    public static String RETAIL_MODE = "RETAIL_MODE";
-    public static String USB = "USB";
-    public static String FOREGROUND_SERVICE = "FOREGROUND_SERVICE";
-    public static String HEAVY_WEIGHT_APP = "HEAVY_WEIGHT_APP";
+    @Deprecated public static final String DEVICE_ADMIN_DEPRECATED = "DEVICE_ADMIN";
+    public static final String DEVICE_ADMIN = "DEVICE_ADMIN_ALERTS";
+    public static final String ALERTS = "ALERTS";
+    public static final String RETAIL_MODE = "RETAIL_MODE";
+    public static final String USB = "USB";
+    public static final String FOREGROUND_SERVICE = "FOREGROUND_SERVICE";
+    public static final String HEAVY_WEIGHT_APP = "HEAVY_WEIGHT_APP";
     /**
      * @deprecated Legacy system changes channel with low importance which is no longer used,
      *  Use the default importance {@link #SYSTEM_CHANGES} channel instead.
      */
-    @Deprecated public static String SYSTEM_CHANGES_DEPRECATED = "SYSTEM_CHANGES";
-    public static String SYSTEM_CHANGES = "SYSTEM_CHANGES_ALERTS";
-    public static String DO_NOT_DISTURB = "DO_NOT_DISTURB";
-    public static String ACCESSIBILITY_MAGNIFICATION = "ACCESSIBILITY_MAGNIFICATION";
-    public static String ACCESSIBILITY_SECURITY_POLICY = "ACCESSIBILITY_SECURITY_POLICY";
-    public static String ABUSIVE_BACKGROUND_APPS = "ABUSIVE_BACKGROUND_APPS";
+    @Deprecated public static final String SYSTEM_CHANGES_DEPRECATED = "SYSTEM_CHANGES";
+    public static final String SYSTEM_CHANGES = "SYSTEM_CHANGES_ALERTS";
+    public static final String ACCESSIBILITY_MAGNIFICATION = "ACCESSIBILITY_MAGNIFICATION";
+    public static final String ACCESSIBILITY_SECURITY_POLICY = "ACCESSIBILITY_SECURITY_POLICY";
+    public static final String ABUSIVE_BACKGROUND_APPS = "ABUSIVE_BACKGROUND_APPS";
+
+    @VisibleForTesting
+    static final String OBSOLETE_DO_NOT_DISTURB = "DO_NOT_DISTURB";
 
     public static void createAll(Context context) {
         final NotificationManager nm = context.getSystemService(NotificationManager.class);
@@ -193,11 +196,6 @@
                 .build());
         channelsList.add(systemChanges);
 
-        NotificationChannel dndChanges = new NotificationChannel(DO_NOT_DISTURB,
-                context.getString(R.string.notification_channel_do_not_disturb),
-                NotificationManager.IMPORTANCE_LOW);
-        channelsList.add(dndChanges);
-
         final NotificationChannel newFeaturePrompt = new NotificationChannel(
                 ACCESSIBILITY_MAGNIFICATION,
                 context.getString(R.string.notification_channel_accessibility_magnification),
@@ -218,6 +216,9 @@
         channelsList.add(abusiveBackgroundAppsChannel);
 
         nm.createNotificationChannels(channelsList);
+
+        // Delete channels created by previous Android versions that are no longer used.
+        nm.deleteNotificationChannel(OBSOLETE_DO_NOT_DISTURB);
     }
 
     private static String getDeviceAdminNotificationChannelName(Context context) {
diff --git a/core/java/com/android/internal/os/BatteryStatsHistory.java b/core/java/com/android/internal/os/BatteryStatsHistory.java
index 5c270e0..d61785e 100644
--- a/core/java/com/android/internal/os/BatteryStatsHistory.java
+++ b/core/java/com/android/internal/os/BatteryStatsHistory.java
@@ -48,6 +48,7 @@
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.ConcurrentModificationException;
@@ -1745,9 +1746,12 @@
                     mHistoryAddTmp.setTo(mHistoryLastWritten);
                     mHistoryAddTmp.wakelockTag = null;
                     mHistoryAddTmp.wakeReasonTag = null;
+                    mHistoryAddTmp.powerStats = null;
+                    mHistoryAddTmp.processStateChange = null;
                     mHistoryAddTmp.eventCode = HistoryItem.EVENT_NONE;
                     mHistoryAddTmp.states &= ~HistoryItem.STATE_CPU_RUNNING_FLAG;
                     writeHistoryItem(wakeElapsedTimeMs, uptimeMs, mHistoryAddTmp);
+
                 }
             }
             mHistoryCur.states |= HistoryItem.STATE_CPU_RUNNING_FLAG;
@@ -2453,6 +2457,20 @@
     }
 
     /**
+     * Prints battery stats history for debugging.
+     */
+    public void dump(PrintWriter pw, long startTimeMs, long endTimeMs) {
+        BatteryStats.HistoryPrinter printer = new BatteryStats.HistoryPrinter();
+        try (BatteryStatsHistoryIterator iterate = iterate(startTimeMs, endTimeMs)) {
+            while (iterate.hasNext()) {
+                HistoryItem next = iterate.next();
+                printer.printNextItem(pw, next, 0, false, true);
+            }
+        }
+        pw.flush();
+    }
+
+    /**
      * Writes/reads an array of longs into Parcel using a compact format, where small integers use
      * fewer bytes.  It is a bit more expensive than just writing the long into the parcel,
      * but at scale saves a lot of storage and allows recording of longer battery history.
diff --git a/core/java/com/android/internal/pm/pkg/component/ParsedPermissionUtils.java b/core/java/com/android/internal/pm/pkg/component/ParsedPermissionUtils.java
index 5651c1c..d4dabf5 100644
--- a/core/java/com/android/internal/pm/pkg/component/ParsedPermissionUtils.java
+++ b/core/java/com/android/internal/pm/pkg/component/ParsedPermissionUtils.java
@@ -16,6 +16,7 @@
 
 package com.android.internal.pm.pkg.component;
 
+import static com.android.internal.pm.pkg.parsing.ParsingPackageUtils.PARSE_APK_IN_APEX;
 import static com.android.internal.pm.pkg.parsing.ParsingUtils.NOT_SET;
 
 import android.annotation.NonNull;
@@ -26,6 +27,7 @@
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
 import android.os.Build;
+import android.permission.flags.Flags;
 import android.util.ArrayMap;
 import android.util.EventLog;
 import android.util.Slog;
@@ -49,7 +51,7 @@
 
     @NonNull
     public static ParseResult<ParsedPermission> parsePermission(ParsingPackage pkg, Resources res,
-            XmlResourceParser parser, boolean useRoundIcon, ParseInput input)
+            XmlResourceParser parser, boolean useRoundIcon, ParseInput input, int flags)
             throws IOException, XmlPullParserException {
         String packageName = pkg.getPackageName();
         ParsedPermissionImpl permission = new ParsedPermissionImpl();
@@ -77,12 +79,18 @@
 
             if (sa.hasValue(
                     R.styleable.AndroidManifestPermission_backgroundPermission)) {
-                if ("android".equals(packageName)) {
+                final boolean isApkInApex = (flags & PARSE_APK_IN_APEX) != 0;
+                final boolean canUseBackgroundPermissionAttr =
+                    "android".equals(packageName) ||
+                        (Flags.replaceBodySensorPermissionEnabled() && isApkInApex);
+                if (canUseBackgroundPermissionAttr) {
                     permission.setBackgroundPermission(sa.getNonResourceString(
-                            R.styleable.AndroidManifestPermission_backgroundPermission));
+                        R.styleable.AndroidManifestPermission_backgroundPermission));
                 } else {
+                    String allowedPackages = "'android'"
+                        + (Flags.replaceBodySensorPermissionEnabled() ? " and APK_IN_APEX" : "");
                     Slog.w(TAG, packageName + " defines a background permission. Only the "
-                            + "'android' package can do that.");
+                        + allowedPackages + " packages can do that.");
                 }
             }
 
diff --git a/core/java/com/android/internal/pm/pkg/parsing/ParsingPackageUtils.java b/core/java/com/android/internal/pm/pkg/parsing/ParsingPackageUtils.java
index 44fedb1..787006e 100644
--- a/core/java/com/android/internal/pm/pkg/parsing/ParsingPackageUtils.java
+++ b/core/java/com/android/internal/pm/pkg/parsing/ParsingPackageUtils.java
@@ -1090,7 +1090,7 @@
             case TAG_PERMISSION_GROUP:
                 return parsePermissionGroup(input, pkg, res, parser);
             case TAG_PERMISSION:
-                return parsePermission(input, pkg, res, parser);
+                return parsePermission(input, pkg, res, parser, flags);
             case TAG_PERMISSION_TREE:
                 return parsePermissionTree(input, pkg, res, parser);
             case TAG_USES_PERMISSION:
@@ -1329,10 +1329,10 @@
     }
 
     private static ParseResult<ParsingPackage> parsePermission(ParseInput input,
-            ParsingPackage pkg, Resources res, XmlResourceParser parser)
+            ParsingPackage pkg, Resources res, XmlResourceParser parser, int flags)
             throws XmlPullParserException, IOException {
         ParseResult<ParsedPermission> result = ParsedPermissionUtils.parsePermission(
-                pkg, res, parser, sUseRoundIcon, input);
+                pkg, res, parser, sUseRoundIcon, input, flags);
         if (result.isError()) {
             return input.error(result);
         }
diff --git a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
index b0e38e2..f3dc896 100644
--- a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
+++ b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
@@ -56,6 +56,7 @@
 import android.tracing.perfetto.Producer;
 import android.tracing.perfetto.TracingContext;
 import android.util.ArrayMap;
+import android.util.ArraySet;
 import android.util.Log;
 import android.util.LongArray;
 import android.util.Slog;
@@ -351,6 +352,10 @@
     }
 
     private void registerGroupsLocally(@NonNull IProtoLogGroup[] protoLogGroups) {
+        // Verify we don't have id collisions, if we do we want to know as soon as possible and
+        // we might want to manually specify an id for the group with a collision
+        verifyNoCollisionsOrDuplicates(protoLogGroups);
+
         final var groupsLoggingToLogcat = new ArrayList<String>();
         for (IProtoLogGroup protoLogGroup : protoLogGroups) {
             mLogGroups.put(protoLogGroup.name(), protoLogGroup);
@@ -369,6 +374,19 @@
         }
     }
 
+    private void verifyNoCollisionsOrDuplicates(@NonNull IProtoLogGroup[] protoLogGroups) {
+        final var groupId = new ArraySet<Integer>();
+
+        for (IProtoLogGroup protoLogGroup : protoLogGroups) {
+            if (groupId.contains(protoLogGroup.getId())) {
+                throw new RuntimeException(
+                        "Group with same id (" + protoLogGroup.getId() + ") registered twice. "
+                                + "Potential duplicate or hash id collision.");
+            }
+            groupId.add(protoLogGroup.getId());
+        }
+    }
+
     /**
      * Responds to a shell command.
      */
@@ -399,13 +417,10 @@
                 return -1;
             }
             case "enable-text" -> {
-                if (mViewerConfigReader != null) {
-                    mViewerConfigReader.loadViewerConfig(groups, logger);
-                }
-                return setTextLogging(true, logger, groups);
+                return startLoggingToLogcat(groups, logger);
             }
             case "disable-text" -> {
-                return setTextLogging(false, logger, groups);
+                return stopLoggingToLogcat(groups, logger);
             }
             default -> {
                 return unknownCommand(pw);
@@ -896,7 +911,7 @@
         }
     }
 
-    private static class Message {
+    protected static class Message {
         @Nullable
         private final Long mMessageHash;
         private final int mMessageMask;
@@ -921,12 +936,17 @@
         }
 
         @Nullable
-        private String getMessage() {
+        protected Long getMessageHash() {
+            return mMessageHash;
+        }
+
+        @Nullable
+        protected String getMessage() {
             return mMessageString;
         }
 
         @Nullable
-        private String getMessage(@NonNull ProtoLogViewerConfigReader viewerConfigReader) {
+        protected String getMessage(@NonNull ProtoLogViewerConfigReader viewerConfigReader) {
             if (mMessageString != null) {
                 return mMessageString;
             }
diff --git a/core/java/com/android/internal/protolog/ProtoLog.java b/core/java/com/android/internal/protolog/ProtoLog.java
index adf03fe..60213b1 100644
--- a/core/java/com/android/internal/protolog/ProtoLog.java
+++ b/core/java/com/android/internal/protolog/ProtoLog.java
@@ -22,8 +22,8 @@
 import com.android.internal.protolog.common.IProtoLogGroup;
 import com.android.internal.protolog.common.LogLevel;
 
-import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 
 /**
  * ProtoLog API - exposes static logging methods. Usage of this API is similar
@@ -73,7 +73,7 @@
                 if (sProtoLogInstance != null) {
                     // The ProtoLog instance has already been initialized in this process
                     final var alreadyRegisteredGroups = sProtoLogInstance.getRegisteredGroups();
-                    final var allGroups = new ArrayList<>(alreadyRegisteredGroups);
+                    final var allGroups = new HashSet<>(alreadyRegisteredGroups);
                     allGroups.addAll(Arrays.stream(groups).toList());
                     groups = allGroups.toArray(new IProtoLogGroup[0]);
                 }
diff --git a/core/java/com/android/internal/protolog/ProtoLogConfigurationServiceImpl.java b/core/java/com/android/internal/protolog/ProtoLogConfigurationServiceImpl.java
index e382ac1..8d37899 100644
--- a/core/java/com/android/internal/protolog/ProtoLogConfigurationServiceImpl.java
+++ b/core/java/com/android/internal/protolog/ProtoLogConfigurationServiceImpl.java
@@ -110,12 +110,12 @@
     private final ViewerConfigFileTracer mViewerConfigFileTracer;
 
     public ProtoLogConfigurationServiceImpl() {
-        this(ProtoLogDataSource::new, ProtoLogConfigurationServiceImpl::dumpTransitionTraceConfig);
+        this(ProtoLogDataSource::new, ProtoLogConfigurationServiceImpl::dumpViewerConfig);
     }
 
     @VisibleForTesting
     public ProtoLogConfigurationServiceImpl(@NonNull ProtoLogDataSourceBuilder dataSourceBuilder) {
-        this(dataSourceBuilder, ProtoLogConfigurationServiceImpl::dumpTransitionTraceConfig);
+        this(dataSourceBuilder, ProtoLogConfigurationServiceImpl::dumpViewerConfig);
     }
 
     @VisibleForTesting
@@ -375,7 +375,7 @@
         mRunningInstances.remove(instanceIdx);
     }
 
-    private static void dumpTransitionTraceConfig(@NonNull ProtoLogDataSource dataSource,
+    private static void dumpViewerConfig(@NonNull ProtoLogDataSource dataSource,
             @NonNull String viewerConfigFilePath) {
         Utils.dumpViewerConfig(dataSource, () -> {
             try {
diff --git a/core/java/com/android/internal/protolog/ProtoLogGroup.java b/core/java/com/android/internal/protolog/ProtoLogGroup.java
index bb3507c..6521870 100644
--- a/core/java/com/android/internal/protolog/ProtoLogGroup.java
+++ b/core/java/com/android/internal/protolog/ProtoLogGroup.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020 The Android Open Source Project
+ * Copyright (C) 2024 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.
@@ -16,108 +16,35 @@
 
 package com.android.internal.protolog;
 
+import android.annotation.NonNull;
+
 import com.android.internal.protolog.common.IProtoLogGroup;
 
-import java.util.UUID;
+public class ProtoLogGroup implements IProtoLogGroup {
 
-/**
- * Defines logging groups for ProtoLog.
- *
- * This file is used by the ProtoLogTool to generate optimized logging code. All of its dependencies
- * must be included in services.core.wm.protologgroups build target.
- */
-public enum ProtoLogGroup implements IProtoLogGroup {
-    WM_ERROR(true, true, true, Consts.TAG_WM),
-    WM_DEBUG_ORIENTATION(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_FOCUS_LIGHT(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_BOOT(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_RESIZE(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_ADD_REMOVE(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_CONFIGURATION(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_SWITCH(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_CONTAINERS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_FOCUS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_IMMERSIVE(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_LOCKTASK(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_STATES(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_TASKS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_STARTING_WINDOW(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_SHOW_TRANSACTIONS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_SHOW_SURFACE_ALLOC(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_APP_TRANSITIONS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_ANIM(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
-    WM_DEBUG_APP_TRANSITIONS_ANIM(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_RECENTS_ANIMATIONS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_DRAW(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
-    WM_DEBUG_REMOTE_ANIMATIONS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_SCREEN_ON(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
-    WM_DEBUG_KEEP_SCREEN_ON(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_WINDOW_MOVEMENT(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_IME(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_WINDOW_ORGANIZER(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_SYNC_ENGINE(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_WINDOW_TRANSITIONS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_WINDOW_TRANSITIONS_MIN(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true,
-            Consts.TAG_WM),
-    WM_DEBUG_WINDOW_INSETS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    WM_DEBUG_CONTENT_RECORDING(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true,
-            Consts.TAG_WM),
-    WM_DEBUG_WALLPAPER(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
-    WM_DEBUG_BACK_PREVIEW(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true,
-            "CoreBackPreview"),
-    WM_DEBUG_DREAM(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true, Consts.TAG_WM),
-
-    WM_DEBUG_DIMMER(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
-    WM_DEBUG_TPL(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
-    WM_DEBUG_EMBEDDED_WINDOWS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
-            Consts.TAG_WM),
-    TEST_GROUP(true, true, false, "WindowManagerProtoLogTest");
-
-    private final boolean mEnabled;
-    private volatile boolean mLogToProto;
-    private volatile boolean mLogToLogcat;
+    /** The name should be unique across the codebase. */
+    @NonNull
+    private final String mName;
+    @NonNull
     private final String mTag;
+    private final boolean mEnabled;
+    private boolean mLogToProto;
+    private boolean mLogToLogcat;
 
-    /**
-     * @param enabled     set to false to exclude all log statements for this group from
-     *                    compilation,
-     *                    they will not be available in runtime.
-     * @param logToProto  enable binary logging for the group
-     * @param logToLogcat enable text logging for the group
-     * @param tag         name of the source of the logged message
-     */
-    ProtoLogGroup(boolean enabled, boolean logToProto, boolean logToLogcat, String tag) {
-        this.mEnabled = enabled;
-        this.mLogToProto = logToProto;
-        this.mLogToLogcat = logToLogcat;
-        this.mTag = tag;
+    public ProtoLogGroup(@NonNull String name) {
+        this(name, name);
+    }
+
+    public ProtoLogGroup(@NonNull String name, @NonNull String tag) {
+        this(name, tag, true);
+    }
+
+    public ProtoLogGroup(@NonNull String name, @NonNull String tag, boolean enabled) {
+        mName = name;
+        mTag = tag;
+        mEnabled = enabled;
+        mLogToProto = enabled;
+        mLogToLogcat = enabled;
     }
 
     @Override
@@ -125,6 +52,7 @@
         return mEnabled;
     }
 
+    @Deprecated
     @Override
     public boolean isLogToProto() {
         return mLogToProto;
@@ -136,37 +64,30 @@
     }
 
     @Override
-    public boolean isLogToAny() {
-        return mLogToLogcat || mLogToProto;
-    }
-
-    @Override
+    @NonNull
     public String getTag() {
         return mTag;
     }
 
+    @Deprecated
     @Override
     public void setLogToProto(boolean logToProto) {
-        this.mLogToProto = logToProto;
+        mLogToProto = logToProto;
     }
 
     @Override
     public void setLogToLogcat(boolean logToLogcat) {
-        this.mLogToLogcat = logToLogcat;
+        mLogToLogcat = logToLogcat;
+    }
+
+    @Override
+    @NonNull
+    public String name() {
+        return mName;
     }
 
     @Override
     public int getId() {
-        return Consts.START_ID + this.ordinal();
-    }
-
-    private static class Consts {
-        private static final String TAG_WM = "WindowManager";
-
-        private static final boolean ENABLE_DEBUG = true;
-        private static final boolean ENABLE_LOG_TO_PROTO_DEBUG = true;
-        private static final int START_ID = (int) (
-                UUID.nameUUIDFromBytes(ProtoLogGroup.class.getName().getBytes())
-                        .getMostSignificantBits() % Integer.MAX_VALUE);
+        return mName.hashCode();
     }
 }
diff --git a/core/java/com/android/internal/protolog/TEST_MAPPING b/core/java/com/android/internal/protolog/TEST_MAPPING
index 37d57ee..b51d19d 100644
--- a/core/java/com/android/internal/protolog/TEST_MAPPING
+++ b/core/java/com/android/internal/protolog/TEST_MAPPING
@@ -1,6 +1,9 @@
 {
   "postsubmit": [
     {
+      "name": "TracingTests"
+    },
+    {
       "name": "ProtologPerfTests"
     }
   ]
diff --git a/core/java/com/android/internal/protolog/Utils.java b/core/java/com/android/internal/protolog/Utils.java
index 1e6ba30..00ef80a 100644
--- a/core/java/com/android/internal/protolog/Utils.java
+++ b/core/java/com/android/internal/protolog/Utils.java
@@ -93,8 +93,7 @@
                     os.write(TAG, tag);
                     break;
                 default:
-                    throw new RuntimeException(
-                            "Unexpected field id " + pis.getFieldNumber());
+                    Log.e(LOG_TAG, "Unexpected field id " + pis.getFieldNumber());
             }
         }
 
@@ -126,8 +125,7 @@
                     os.write(LOCATION, pis.readString(LOCATION));
                     break;
                 default:
-                    throw new RuntimeException(
-                            "Unexpected field id " + pis.getFieldNumber());
+                    Log.e(LOG_TAG, "Unexpected field id " + pis.getFieldNumber());
             }
         }
 
diff --git a/core/java/com/android/internal/protolog/WmProtoLogGroups.java b/core/java/com/android/internal/protolog/WmProtoLogGroups.java
new file mode 100644
index 0000000..4bd5d24
--- /dev/null
+++ b/core/java/com/android/internal/protolog/WmProtoLogGroups.java
@@ -0,0 +1,174 @@
+/*
+ * 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.internal.protolog;
+
+import com.android.internal.protolog.common.IProtoLogGroup;
+
+import java.util.UUID;
+
+/**
+ * Defines logging groups for ProtoLog.
+ *
+ * This file is used by the ProtoLogTool to generate optimized logging code. All of its dependencies
+ * must be included in services.core.wm.protologgroups build target.
+ */
+public enum WmProtoLogGroups implements IProtoLogGroup {
+    WM_ERROR(true, true, true, Consts.TAG_WM),
+    WM_DEBUG_ORIENTATION(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_FOCUS_LIGHT(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_BOOT(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_RESIZE(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_ADD_REMOVE(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_CONFIGURATION(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_SWITCH(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_CONTAINERS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_FOCUS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_IMMERSIVE(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_LOCKTASK(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_STATES(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_TASKS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_STARTING_WINDOW(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_SHOW_TRANSACTIONS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_SHOW_SURFACE_ALLOC(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_APP_TRANSITIONS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_ANIM(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
+    WM_DEBUG_APP_TRANSITIONS_ANIM(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_RECENTS_ANIMATIONS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_DRAW(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
+    WM_DEBUG_REMOTE_ANIMATIONS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_SCREEN_ON(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
+    WM_DEBUG_KEEP_SCREEN_ON(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_SLEEP_TOKEN(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true,
+            Consts.TAG_WM),
+    WM_DEBUG_WINDOW_MOVEMENT(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_IME(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_WINDOW_ORGANIZER(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_SYNC_ENGINE(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_WINDOW_TRANSITIONS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_WINDOW_TRANSITIONS_MIN(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true,
+            Consts.TAG_WM),
+    WM_DEBUG_WINDOW_INSETS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    WM_DEBUG_CONTENT_RECORDING(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true,
+            Consts.TAG_WM),
+    WM_DEBUG_WALLPAPER(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
+    WM_DEBUG_BACK_PREVIEW(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true,
+            "CoreBackPreview"),
+    WM_DEBUG_DREAM(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true, Consts.TAG_WM),
+
+    WM_DEBUG_DIMMER(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
+    WM_DEBUG_TPL(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
+    WM_DEBUG_EMBEDDED_WINDOWS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+            Consts.TAG_WM),
+    TEST_GROUP(true, true, false, "WindowManagerProtoLogTest");
+
+    private final boolean mEnabled;
+    private volatile boolean mLogToProto;
+    private volatile boolean mLogToLogcat;
+    private final String mTag;
+
+    /**
+     * @param enabled     set to false to exclude all log statements for this group from
+     *                    compilation,
+     *                    they will not be available in runtime.
+     * @param logToProto  enable binary logging for the group
+     * @param logToLogcat enable text logging for the group
+     * @param tag         name of the source of the logged message
+     */
+    WmProtoLogGroups(boolean enabled, boolean logToProto, boolean logToLogcat, String tag) {
+        this.mEnabled = enabled;
+        this.mLogToProto = logToProto;
+        this.mLogToLogcat = logToLogcat;
+        this.mTag = tag;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return mEnabled;
+    }
+
+    @Override
+    public boolean isLogToProto() {
+        return mLogToProto;
+    }
+
+    @Override
+    public boolean isLogToLogcat() {
+        return mLogToLogcat;
+    }
+
+    @Override
+    public boolean isLogToAny() {
+        return mLogToLogcat || mLogToProto;
+    }
+
+    @Override
+    public String getTag() {
+        return mTag;
+    }
+
+    @Override
+    public void setLogToProto(boolean logToProto) {
+        this.mLogToProto = logToProto;
+    }
+
+    @Override
+    public void setLogToLogcat(boolean logToLogcat) {
+        this.mLogToLogcat = logToLogcat;
+    }
+
+    @Override
+    public int getId() {
+        return Consts.START_ID + this.ordinal();
+    }
+
+    private static class Consts {
+        private static final String TAG_WM = "WindowManager";
+
+        private static final boolean ENABLE_DEBUG = true;
+        private static final boolean ENABLE_LOG_TO_PROTO_DEBUG = true;
+        private static final int START_ID = (int) (
+                UUID.nameUUIDFromBytes(WmProtoLogGroups.class.getName().getBytes())
+                        .getMostSignificantBits() % Integer.MAX_VALUE);
+    }
+}
diff --git a/core/java/com/android/internal/widget/NotificationProgressDrawable.java b/core/java/com/android/internal/widget/NotificationProgressDrawable.java
new file mode 100644
index 0000000..4d88546
--- /dev/null
+++ b/core/java/com/android/internal/widget/NotificationProgressDrawable.java
@@ -0,0 +1,722 @@
+/*
+ * Copyright (C) 2024 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.internal.widget;
+
+import android.content.pm.ActivityInfo.Config;
+import android.content.res.Resources;
+import android.content.res.Resources.Theme;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.DashPathEffect;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.util.Log;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.internal.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/**
+ * This is used by NotificationProgressBar for displaying a custom background. It composes of
+ * segments, which have non-zero length, and points, which have zero length.
+ *
+ * @see Segment
+ * @see Point
+ */
+public final class NotificationProgressDrawable extends Drawable {
+    private static final String TAG = "NotifProgressDrawable";
+
+    private State mState;
+    private boolean mMutated;
+
+    private final ArrayList<Part> mParts = new ArrayList<>();
+
+    private final Rect mPointRect = new Rect();
+    private final RectF mPointRectF = new RectF();
+
+    private final Paint mStrokePaint = new Paint();
+    private final Paint mDashedStrokePaint = new Paint();
+    private final Paint mFillPaint = new Paint();
+
+    {
+        mStrokePaint.setStyle(Paint.Style.STROKE);
+        mStrokePaint.setStrokeCap(Paint.Cap.ROUND);
+
+        mDashedStrokePaint.setStyle(Paint.Style.STROKE);
+
+        mFillPaint.setStyle(Paint.Style.FILL);
+    }
+
+    private int mAlpha;
+
+    public NotificationProgressDrawable() {
+        this(new State(), null);
+    }
+
+    /**
+     * <p>Set the stroke width and default color for the drawable.</p>
+     * <p>Note: changing this property will affect all instances of a drawable loaded from a
+     * resource. It is recommended to invoke
+     * {@link #mutate()} before changing this property.</p>
+     *
+     * @param width The width in pixels of the stroke
+     * @param color The color of the stroke
+     * @see #mutate()
+     * @see #setStroke(int, int, float, float)
+     */
+    public void setStroke(int width, @ColorInt int color) {
+        setStroke(width, color, 0, 0);
+    }
+
+    /**
+     * <p>Set the stroke width and default color for the drawable. This method can also be used
+     * to dash the stroke for the dashed segments.</p>
+     * <p>Note: changing this property will affect all instances of a drawable loaded from a
+     * resource. It is recommended to invoke {@link #mutate()} before changing this property.</p>
+     *
+     * @param width     The width in pixels of the stroke
+     * @param color     The color of the stroke
+     * @param dashWidth The length in pixels of the dashes, set to 0 to disable dashes
+     * @param dashGap   The gap in pixels between dashes
+     * @see #mutate()
+     * @see #setStroke(int, int)
+     */
+    public void setStroke(int width, @ColorInt int color, float dashWidth, float dashGap) {
+        mState.setStroke(width, color, dashWidth, dashGap);
+        setStrokeInternal(width, dashWidth, dashGap);
+    }
+
+    /**
+     * <p>Set the stroke default color for the drawable.</p>
+     * <p>Note: changing this property will affect all instances of a drawable loaded from a
+     * resource. It is recommended to invoke {@link #mutate()} before changing this property.</p>
+     *
+     * @param color The color of the stroke
+     * @see #mutate()
+     * @see #setStroke(int, int, float, float)
+     */
+    public void setStrokeDefaultColor(@ColorInt int color) {
+        mState.mStrokeColor = color;
+    }
+
+    /**
+     * <p>Set the point rect default color for the drawable.</p>
+     * <p>Note: changing this property will affect all instances of a drawable loaded from a
+     * resource. It is recommended to invoke {@link #mutate()} before changing this property.</p>
+     *
+     * @param color The color of the point rect
+     * @see #mutate()
+     */
+    public void setPointRectDefaultColor(@ColorInt int color) {
+        mState.mPointRectColor = color;
+    }
+
+    private void setStrokeInternal(int width, float dashWidth, float dashGap) {
+        mStrokePaint.setStrokeWidth(width);
+
+        mDashedStrokePaint.setStrokeWidth(width);
+        DashPathEffect e = null;
+        if (dashWidth > 0) {
+            e = new DashPathEffect(new float[] { dashWidth, dashGap }, 0);
+        }
+        mDashedStrokePaint.setPathEffect(e);
+
+        invalidateSelf();
+    }
+
+    /**
+     *
+     */
+    public void setParts(@NonNull Part... parts) {
+        mParts.clear();
+        mParts.addAll(Arrays.asList(parts));
+    }
+
+    @Override
+    public void draw(@NonNull Canvas canvas) {
+        final float pointRadius =
+                mState.mPointRadius; // how big the point icon will be, halved
+
+        // generally, we will start drawing at (x, y) and end at (x+w, y)
+        float x = (float) getBounds().left;
+        final float centerY = (float) getBounds().centerY();
+        final float totalWidth = (float) getBounds().width();
+
+        final int numParts = mParts.size();
+        for (int iPart = 0; iPart < numParts; iPart++) {
+            final Part part = mParts.get(iPart);
+            final Part prevPart = iPart == 0 ? null : mParts.get(iPart - 1);
+            final Part nextPart = iPart + 1 == numParts ? null : mParts.get(iPart + 1);
+            if (part instanceof Segment segment) {
+                final float segWidth = segment.mFraction * totalWidth;
+                // Advance the start position to account for a point immediately prior.
+                final float startOffset = getSegStartOffset(prevPart, pointRadius,
+                        mState.mSegPointGap);
+                final float start = x + startOffset;
+                // Retract the end position to account for the padding and a point immediately
+                // after.
+                final float endOffset = getSegEndOffset(nextPart, pointRadius, mState.mSegPointGap,
+                        mState.mSegSegGap);
+                final float end = x + segWidth - endOffset;
+
+                // Transparent is not allowed (and also is the default in the data), so use that
+                // as a sentinel to be replaced by default
+                mStrokePaint.setColor(segment.mColor != Color.TRANSPARENT ? segment.mColor
+                        : mState.mStrokeColor);
+                mDashedStrokePaint.setColor(segment.mColor != Color.TRANSPARENT ? segment.mColor
+                        : mState.mStrokeColor);
+
+                // Leave space for the rounded line cap which extends beyond start/end.
+                final float capWidth = mStrokePaint.getStrokeWidth() / 2F;
+
+                canvas.drawLine(start + capWidth, centerY, end - capWidth, centerY,
+                        segment.mDashed ? mDashedStrokePaint : mStrokePaint);
+
+                // Advance the current position to account for the segment's fraction of the total
+                // width (ignoring offset and padding)
+                x += segWidth;
+            } else if (part instanceof Point point) {
+                mPointRect.set((int) (x - pointRadius), (int) (centerY - pointRadius),
+                        (int) (x + pointRadius), (int) (centerY + pointRadius));
+                if (point.mIcon != null) {
+                    point.mIcon.setBounds(mPointRect);
+                    point.mIcon.draw(canvas);
+                } else {
+                    // TODO: b/367804171 - actually use a vector asset for the default point
+                    //  rather than drawing it as a box?
+                    mPointRectF.set(mPointRect);
+                    final float inset = mState.mPointRectInset;
+                    final float cornerRadius = mState.mPointRectCornerRadius;
+                    mPointRectF.inset(inset, inset);
+
+                    mFillPaint.setColor(point.mColor != Color.TRANSPARENT ? point.mColor
+                            : mState.mPointRectColor);
+
+                    canvas.drawRoundRect(mPointRectF, cornerRadius, cornerRadius, mFillPaint);
+                }
+            }
+        }
+    }
+
+    private static float getSegStartOffset(Part prevPart, float pointRadius, float segPointGap) {
+        return (prevPart instanceof Point) ? pointRadius + segPointGap : 0F;
+    }
+
+    private static float getSegEndOffset(Part nextPart, float pointRadius, float segPointGap,
+            float segSegGap) {
+        if (nextPart == null) return 0F;
+        return (nextPart instanceof Point) ? segPointGap + pointRadius : segSegGap;
+    }
+
+    @Override
+    public @Config int getChangingConfigurations() {
+        return super.getChangingConfigurations() | mState.getChangingConfigurations();
+    }
+
+    @Override
+    public void setAlpha(int alpha) {
+        if (mAlpha != alpha) {
+            mAlpha = alpha;
+            invalidateSelf();
+        }
+    }
+
+    @Override
+    public int getAlpha() {
+        return mAlpha;
+    }
+
+    @Override
+    public void setColorFilter(@Nullable ColorFilter colorFilter) {
+        // NO-OP
+    }
+
+    @Override
+    public int getOpacity() {
+        // This method is deprecated. Hence we return UNKNOWN.
+        return PixelFormat.UNKNOWN;
+    }
+
+    @Override
+    public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser,
+            @NonNull AttributeSet attrs, @Nullable Resources.Theme theme)
+            throws XmlPullParserException, IOException {
+        super.inflate(r, parser, attrs, theme);
+
+        mState.setDensity(resolveDensity(r, 0));
+
+        final TypedArray a = obtainAttributes(r, theme, attrs,
+                R.styleable.NotificationProgressDrawable);
+        updateStateFromTypedArray(a);
+        a.recycle();
+
+        inflateChildElements(r, parser, attrs, theme);
+
+        updateLocalState();
+    }
+
+    @Override
+    public void applyTheme(@NonNull Theme t) {
+        super.applyTheme(t);
+
+        final State state = mState;
+        if (state == null) {
+            return;
+        }
+
+        state.setDensity(resolveDensity(t.getResources(), 0));
+
+        if (state.mThemeAttrs != null) {
+            final TypedArray a = t.resolveAttributes(
+                    state.mThemeAttrs, R.styleable.NotificationProgressDrawable);
+            updateStateFromTypedArray(a);
+            a.recycle();
+        }
+
+        applyThemeChildElements(t);
+
+        updateLocalState();
+    }
+
+    @Override
+    public boolean canApplyTheme() {
+        return (mState.canApplyTheme()) || super.canApplyTheme();
+    }
+
+    private void updateStateFromTypedArray(TypedArray a) {
+        final State state = mState;
+
+        // Account for any configuration changes.
+        state.mChangingConfigurations |= a.getChangingConfigurations();
+
+        // Extract the theme attributes, if any.
+        state.mThemeAttrs = a.extractThemeAttrs();
+
+        state.mSegSegGap = a.getDimension(R.styleable.NotificationProgressDrawable_segSegGap,
+                state.mSegSegGap);
+        state.mSegPointGap = a.getDimension(R.styleable.NotificationProgressDrawable_segPointGap,
+                state.mSegPointGap);
+    }
+
+    private void inflateChildElements(Resources r, XmlPullParser parser, AttributeSet attrs,
+            Theme theme) throws XmlPullParserException, IOException {
+        TypedArray a;
+        int type;
+
+        final int innerDepth = parser.getDepth() + 1;
+        int depth;
+        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                && ((depth = parser.getDepth()) >= innerDepth
+                || type != XmlPullParser.END_TAG)) {
+            if (type != XmlPullParser.START_TAG) {
+                continue;
+            }
+
+            if (depth > innerDepth) {
+                continue;
+            }
+
+            String name = parser.getName();
+
+            if (name.equals("segments")) {
+                a = obtainAttributes(r, theme, attrs,
+                        R.styleable.NotificationProgressDrawableSegments);
+                updateSegmentsFromTypedArray(a);
+                a.recycle();
+            } else if (name.equals("points")) {
+                a = obtainAttributes(r, theme, attrs,
+                        R.styleable.NotificationProgressDrawablePoints);
+                updatePointsFromTypedArray(a);
+                a.recycle();
+            } else {
+                Log.w(TAG, "Bad element under NotificationProgressDrawable: " + name);
+            }
+        }
+    }
+
+    private void applyThemeChildElements(Theme t) {
+        final State state = mState;
+
+        if (state.mThemeAttrsSegments != null) {
+            final TypedArray a = t.resolveAttributes(
+                    state.mThemeAttrsSegments, R.styleable.NotificationProgressDrawableSegments);
+            updateSegmentsFromTypedArray(a);
+            a.recycle();
+        }
+
+        if (state.mThemeAttrsPoints != null) {
+            final TypedArray a = t.resolveAttributes(
+                    state.mThemeAttrsPoints, R.styleable.NotificationProgressDrawablePoints);
+            updateSegmentsFromTypedArray(a);
+            a.recycle();
+        }
+    }
+
+    private void updateSegmentsFromTypedArray(TypedArray a) {
+        final State state = mState;
+
+        // Account for any configuration changes.
+        state.mChangingConfigurations |= a.getChangingConfigurations();
+
+        // Extract the theme attributes, if any.
+        state.mThemeAttrsSegments = a.extractThemeAttrs();
+
+        final int width = a.getDimensionPixelSize(
+                R.styleable.NotificationProgressDrawableSegments_width, state.mStrokeWidth);
+        final float dashWidth = a.getDimension(
+                R.styleable.NotificationProgressDrawableSegments_dashWidth, state.mStrokeDashWidth);
+
+        final int color = a.getColor(R.styleable.NotificationProgressDrawableSegments_color,
+                state.mStrokeColor);
+
+        if (dashWidth != 0.0f) {
+            final float dashGap = a.getDimension(
+                    R.styleable.NotificationProgressDrawableSegments_dashGap, state.mStrokeDashGap);
+            setStroke(width, color, dashWidth, dashGap);
+        } else {
+            setStroke(width, color);
+        }
+    }
+
+    private void updatePointsFromTypedArray(TypedArray a) {
+        final State state = mState;
+
+        // Account for any configuration changes.
+        state.mChangingConfigurations |= a.getChangingConfigurations();
+
+        // Extract the theme attributes, if any.
+        state.mThemeAttrsPoints = a.extractThemeAttrs();
+
+        state.mPointRadius = a.getDimension(R.styleable.NotificationProgressDrawablePoints_radius,
+                state.mPointRadius);
+        state.mPointRectInset = a.getDimension(R.styleable.NotificationProgressDrawablePoints_inset,
+                state.mPointRectInset);
+        state.mPointRectCornerRadius = a.getDimension(
+                R.styleable.NotificationProgressDrawablePoints_cornerRadius,
+                state.mPointRectCornerRadius);
+        state.mPointRectColor = a.getColor(R.styleable.NotificationProgressDrawablePoints_color,
+                state.mPointRectColor);
+    }
+
+    static int resolveDensity(@Nullable Resources r, int parentDensity) {
+        final int densityDpi = r == null ? parentDensity : r.getDisplayMetrics().densityDpi;
+        return densityDpi == 0 ? DisplayMetrics.DENSITY_DEFAULT : densityDpi;
+    }
+
+    /**
+     * Scales a floating-point pixel value from the source density to the
+     * target density.
+     */
+    private static float scaleFromDensity(float pixels, int sourceDensity, int targetDensity) {
+        return pixels * targetDensity / sourceDensity;
+    }
+
+    /**
+     * Scales a pixel value from the source density to the target density.
+     * <p>
+     * Optionally, when {@code isSize} is true, handles the resulting pixel value as a size,
+     * which is rounded to the closest positive integer.
+     * <p>
+     * Note: Iteratively applying density changes could result in drift of the pixel values due
+     * to rounding, especially for paddings which are truncated. Therefore it should be avoided.
+     * This isn't an issue for the notifications because the inflation pipeline reinflates
+     * notification views on density change.
+     */
+    private static int scaleFromDensity(
+            int pixels, int sourceDensity, int targetDensity, boolean isSize) {
+        if (pixels == 0 || sourceDensity == targetDensity) {
+            return pixels;
+        }
+
+        final float result = pixels * targetDensity / (float) sourceDensity;
+        if (!isSize) {
+            return (int) result;
+        }
+
+        final int rounded = Math.round(result);
+        if (rounded != 0) {
+            return rounded;
+        } else if (pixels > 0) {
+            return 1;
+        } else {
+            return -1;
+        }
+    }
+
+    /**
+     * A part of the progress bar, which is either a S{@link Segment} with non-zero length, or a
+     * {@link Point} with zero length.
+     */
+    public interface Part {
+
+    }
+
+    /**
+     * A segment is a part of the progress bar with non-zero length. For example, it can
+     * represent a portion in a navigation journey with certain traffic condition.
+     */
+    public static final class Segment implements Part {
+        private final float mFraction;
+        @ColorInt private final int mColor;
+        private final boolean mDashed;
+
+        public Segment(float fraction) {
+            this(fraction, Color.TRANSPARENT);
+        }
+
+        public Segment(float fraction, @ColorInt int color) {
+            this(fraction, color, false);
+        }
+
+        public Segment(float fraction, @ColorInt int color, boolean dashed) {
+            mFraction = fraction;
+            mColor = color;
+            mDashed = dashed;
+        }
+
+        public float getFraction() {
+            return this.mFraction;
+        }
+
+        public int getColor() {
+            return this.mColor;
+        }
+
+        public boolean getDashed() {
+            return this.mDashed;
+        }
+
+        @Override
+        public String toString() {
+            return "Segment(fraction=" + this.mFraction + ", color=" + this.mColor + ", dashed="
+                    + this.mDashed + ')';
+        }
+    }
+
+    /**
+     * A point is a part of the progress bar with zero length. Points are designated points within a
+     * progressbar to visualize distinct stages or milestones. For example, a stop in a multi-stop
+     * ride-share journey.
+     */
+    public static final class Point implements Part {
+        @Nullable
+        private final Drawable mIcon;
+        @ColorInt private final int mColor;
+
+        public Point(@Nullable Drawable icon) {
+            this(icon, Color.TRANSPARENT);
+        }
+
+        public Point(@Nullable Drawable icon, @ColorInt int color) {
+            mIcon = icon;
+            mColor = color;
+        }
+
+        @Nullable
+        public Drawable getIcon() {
+            return this.mIcon;
+        }
+
+        @Override
+        public String toString() {
+            return "Point(icon=" + this.mIcon + ", color=" + this.mColor + ')';
+        }
+    }
+
+    @Override
+    public Drawable mutate() {
+        if (!mMutated && super.mutate() == this) {
+            mState = new State(mState, null);
+            updateLocalState();
+            mMutated = true;
+        }
+        return this;
+    }
+
+    @Override
+    public void clearMutated() {
+        super.clearMutated();
+        mMutated = false;
+    }
+
+    static final class State extends ConstantState {
+        @Config
+        int mChangingConfigurations;
+        float mSegSegGap = 0.0f;
+        float mSegPointGap = 0.0f;
+        int mStrokeWidth = 0;
+        int mStrokeColor;
+        float mStrokeDashWidth = 0.0f;
+        float mStrokeDashGap = 0.0f;
+        float mPointRadius;
+        float mPointRectInset;
+        float mPointRectCornerRadius;
+        int mPointRectColor;
+
+        int[] mThemeAttrs;
+        int[] mThemeAttrsSegments;
+        int[] mThemeAttrsPoints;
+
+        int mDensity = DisplayMetrics.DENSITY_DEFAULT;
+
+        State() {
+        }
+
+        State(@NonNull State orig, @Nullable Resources res) {
+            mChangingConfigurations = orig.mChangingConfigurations;
+            mStrokeColor = orig.mStrokeColor;
+            mStrokeWidth = orig.mStrokeWidth;
+            mStrokeDashWidth = orig.mStrokeDashWidth;
+            mStrokeDashGap = orig.mStrokeDashGap;
+            mPointRadius = orig.mPointRadius;
+            mPointRectInset = orig.mPointRectInset;
+            mPointRectCornerRadius = orig.mPointRectCornerRadius;
+            mPointRectColor = orig.mPointRectColor;
+
+            mThemeAttrs = orig.mThemeAttrs;
+            mThemeAttrsSegments = orig.mThemeAttrsSegments;
+            mThemeAttrsPoints = orig.mThemeAttrsPoints;
+
+            mDensity = resolveDensity(res, orig.mDensity);
+            if (orig.mDensity != mDensity) {
+                applyDensityScaling(orig.mDensity, mDensity);
+            }
+        }
+
+        private void applyDensityScaling(int sourceDensity, int targetDensity) {
+            if (mStrokeWidth > 0) {
+                mStrokeWidth = scaleFromDensity(
+                        mStrokeWidth, sourceDensity, targetDensity, true);
+            }
+            if (mStrokeDashWidth > 0) {
+                mStrokeDashWidth = scaleFromDensity(
+                        mStrokeDashWidth, sourceDensity, targetDensity);
+            }
+            if (mStrokeDashGap > 0) {
+                mStrokeDashGap = scaleFromDensity(
+                        mStrokeDashGap, sourceDensity, targetDensity);
+            }
+            if (mPointRadius > 0) {
+                mPointRadius = scaleFromDensity(
+                        mPointRadius, sourceDensity, targetDensity);
+            }
+            if (mPointRectInset > 0) {
+                mPointRectInset = scaleFromDensity(
+                        mPointRectInset, sourceDensity, targetDensity);
+            }
+            if (mPointRectCornerRadius > 0) {
+                mPointRectCornerRadius = scaleFromDensity(
+                        mPointRectCornerRadius, sourceDensity, targetDensity);
+            }
+        }
+
+        @NonNull
+        @Override
+        public Drawable newDrawable() {
+            return new NotificationProgressDrawable(this, null);
+        }
+
+        @Override
+        public Drawable newDrawable(@Nullable Resources res) {
+            // If this drawable is being created for a different density,
+            // just create a new constant state and call it a day.
+            final State state;
+            final int density = resolveDensity(res, mDensity);
+            if (density != mDensity) {
+                state = new State(this, res);
+            } else {
+                state = this;
+            }
+
+            return new NotificationProgressDrawable(state, res);
+        }
+
+        @Override
+        public int getChangingConfigurations() {
+            return mChangingConfigurations;
+        }
+
+        @Override
+        public boolean canApplyTheme() {
+            return mThemeAttrs != null || mThemeAttrsSegments != null || mThemeAttrsPoints != null
+                    || super.canApplyTheme();
+        }
+
+        public void setDensity(int targetDensity) {
+            if (mDensity != targetDensity) {
+                final int sourceDensity = mDensity;
+                mDensity = targetDensity;
+
+                applyDensityScaling(sourceDensity, targetDensity);
+            }
+        }
+
+        public void setStroke(int width, int color, float dashWidth, float dashGap) {
+            mStrokeWidth = width;
+            mStrokeColor = color;
+            mStrokeDashWidth = dashWidth;
+            mStrokeDashGap = dashGap;
+        }
+    }
+
+    @Override
+    public ConstantState getConstantState() {
+        mState.mChangingConfigurations = getChangingConfigurations();
+        return mState;
+    }
+
+    /**
+     * Creates a new themed NotificationProgressDrawable based on the specified constant state.
+     * <p>
+     * The resulting drawable is guaranteed to have a new constant state.
+     *
+     * @param state Constant state from which the drawable inherits
+     */
+    private NotificationProgressDrawable(@NonNull State state, @Nullable Resources res) {
+        mState = state;
+
+        updateLocalState();
+    }
+
+    private void updateLocalState() {
+        final State state = mState;
+
+        mStrokePaint.setStrokeWidth(state.mStrokeWidth);
+
+        if (state.mStrokeDashWidth != 0.0f) {
+            final DashPathEffect e = new DashPathEffect(
+                    new float[] { state.mStrokeDashWidth, state.mStrokeDashGap }, 0);
+            mDashedStrokePaint.setPathEffect(e);
+        }
+    }
+}
diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java
index c0a7383..e65b4b6 100644
--- a/core/java/com/android/internal/widget/PointerLocationView.java
+++ b/core/java/com/android/internal/widget/PointerLocationView.java
@@ -16,19 +16,14 @@
 
 package com.android.internal.widget;
 
-import static java.lang.Float.NaN;
-
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
 import android.content.res.Configuration;
-import android.graphics.Bitmap;
 import android.graphics.Canvas;
-import android.graphics.Color;
 import android.graphics.Insets;
 import android.graphics.Paint;
 import android.graphics.Paint.FontMetricsInt;
 import android.graphics.Path;
-import android.graphics.PorterDuff;
 import android.graphics.RectF;
 import android.graphics.Region;
 import android.hardware.input.InputManager;
@@ -70,14 +65,11 @@
     private static final PointerState EMPTY_POINTER_STATE = new PointerState();
 
     public static class PointerState {
-        private float mCurrentX = NaN;
-        private float mCurrentY = NaN;
-        private float mPreviousX = NaN;
-        private float mPreviousY = NaN;
-        private float mFirstX = NaN;
-        private float mFirstY = NaN;
-        private boolean mPreviousPointIsHistorical;
-        private boolean mCurrentPointIsHistorical;
+        // Trace of previous points.
+        private float[] mTraceX = new float[32];
+        private float[] mTraceY = new float[32];
+        private boolean[] mTraceCurrent = new boolean[32];
+        private int mTraceCount;
 
         // True if the pointer is down.
         @UnsupportedAppUsage
@@ -104,20 +96,31 @@
         public PointerState() {
         }
 
-        public void addTrace(float x, float y, boolean isHistorical) {
-            if (Float.isNaN(mFirstX)) {
-                mFirstX = x;
-            }
-            if (Float.isNaN(mFirstY)) {
-                mFirstY = y;
+        public void clearTrace() {
+            mTraceCount = 0;
+        }
+
+        public void addTrace(float x, float y, boolean current) {
+            int traceCapacity = mTraceX.length;
+            if (mTraceCount == traceCapacity) {
+                traceCapacity *= 2;
+                float[] newTraceX = new float[traceCapacity];
+                System.arraycopy(mTraceX, 0, newTraceX, 0, mTraceCount);
+                mTraceX = newTraceX;
+
+                float[] newTraceY = new float[traceCapacity];
+                System.arraycopy(mTraceY, 0, newTraceY, 0, mTraceCount);
+                mTraceY = newTraceY;
+
+                boolean[] newTraceCurrent = new boolean[traceCapacity];
+                System.arraycopy(mTraceCurrent, 0, newTraceCurrent, 0, mTraceCount);
+                mTraceCurrent= newTraceCurrent;
             }
 
-            mPreviousX = mCurrentX;
-            mPreviousY = mCurrentY;
-            mCurrentX = x;
-            mCurrentY = y;
-            mPreviousPointIsHistorical = mCurrentPointIsHistorical;
-            mCurrentPointIsHistorical = isHistorical;
+            mTraceX[mTraceCount] = x;
+            mTraceY[mTraceCount] = y;
+            mTraceCurrent[mTraceCount] = current;
+            mTraceCount += 1;
         }
     }
 
@@ -146,12 +149,6 @@
     private final SparseArray<PointerState> mPointers = new SparseArray<PointerState>();
     private final PointerCoords mTempCoords = new PointerCoords();
 
-    // Draw the trace of all pointers in the current gesture in a separate layer
-    // that is not cleared on every frame so that we don't have to re-draw the
-    // entire trace on each frame.
-    private final Bitmap mTraceBitmap;
-    private final Canvas mTraceCanvas;
-
     private final Region mSystemGestureExclusion = new Region();
     private final Region mSystemGestureExclusionRejected = new Region();
     private final Path mSystemGestureExclusionPath = new Path();
@@ -200,10 +197,6 @@
         mPathPaint.setARGB(255, 0, 96, 255);
         mPathPaint.setStyle(Paint.Style.STROKE);
 
-        mTraceBitmap = Bitmap.createBitmap(getResources().getDisplayMetrics().widthPixels,
-                getResources().getDisplayMetrics().heightPixels, Bitmap.Config.ARGB_8888);
-        mTraceCanvas = new Canvas(mTraceBitmap);
-
         configureDensityDependentFactors();
 
         mSystemGestureExclusionPaint = new Paint();
@@ -263,7 +256,7 @@
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
         mTextPaint.getFontMetricsInt(mTextMetrics);
-        mHeaderBottom = mHeaderPaddingTop - mTextMetrics.ascent + mTextMetrics.descent + 2;
+        mHeaderBottom = mHeaderPaddingTop-mTextMetrics.ascent+mTextMetrics.descent+2;
         if (false) {
             Log.i("foo", "Metrics: ascent=" + mTextMetrics.ascent
                     + " descent=" + mTextMetrics.descent
@@ -276,7 +269,6 @@
     // Draw an oval.  When angle is 0 radians, orients the major axis vertically,
     // angles less than or greater than 0 radians rotate the major axis left or right.
     private RectF mReusableOvalRect = new RectF();
-
     private void drawOval(Canvas canvas, float x, float y, float major, float minor,
             float angle, Paint paint) {
         canvas.save(Canvas.MATRIX_SAVE_FLAG);
@@ -293,8 +285,6 @@
     protected void onDraw(Canvas canvas) {
         final int NP = mPointers.size();
 
-        canvas.drawBitmap(mTraceBitmap, 0, 0, null);
-
         if (!mSystemGestureExclusion.isEmpty()) {
             mSystemGestureExclusionPath.reset();
             mSystemGestureExclusion.getBoundaryPath(mSystemGestureExclusionPath);
@@ -313,9 +303,32 @@
         // Pointer trace.
         for (int p = 0; p < NP; p++) {
             final PointerState ps = mPointers.valueAt(p);
-            float lastX = ps.mCurrentX, lastY = ps.mCurrentY;
 
-            if (!Float.isNaN(lastX) && !Float.isNaN(lastY)) {
+            // Draw path.
+            final int N = ps.mTraceCount;
+            float lastX = 0, lastY = 0;
+            boolean haveLast = false;
+            boolean drawn = false;
+            mPaint.setARGB(255, 128, 255, 255);
+            for (int i=0; i < N; i++) {
+                float x = ps.mTraceX[i];
+                float y = ps.mTraceY[i];
+                if (Float.isNaN(x) || Float.isNaN(y)) {
+                    haveLast = false;
+                    continue;
+                }
+                if (haveLast) {
+                    canvas.drawLine(lastX, lastY, x, y, mPathPaint);
+                    final Paint paint = ps.mTraceCurrent[i - 1] ? mCurrentPointPaint : mPaint;
+                    canvas.drawPoint(lastX, lastY, paint);
+                    drawn = true;
+                }
+                lastX = x;
+                lastY = y;
+                haveLast = true;
+            }
+
+            if (drawn) {
                 // Draw velocity vector.
                 mPaint.setARGB(255, 255, 64, 128);
                 float xVel = ps.mXVelocity * (1000 / 60);
@@ -340,7 +353,7 @@
                         Math.max(getHeight(), getWidth()), mTargetPaint);
 
                 // Draw current point.
-                int pressureLevel = (int) (ps.mCoords.pressure * 255);
+                int pressureLevel = (int)(ps.mCoords.pressure * 255);
                 mPaint.setARGB(255, pressureLevel, 255, 255 - pressureLevel);
                 canvas.drawPoint(ps.mCoords.x, ps.mCoords.y, mPaint);
 
@@ -411,7 +424,8 @@
                 .append(" / ").append(mMaxNumPointers)
                 .toString(), 1, base, mTextPaint);
 
-        if ((mCurDown && ps.mCurDown) || Float.isNaN(ps.mCurrentX)) {
+        final int count = ps.mTraceCount;
+        if ((mCurDown && ps.mCurDown) || count == 0) {
             canvas.drawRect(itemW, mHeaderPaddingTop, (itemW * 2) - 1, bottom,
                     mTextBackgroundPaint);
             canvas.drawText(mText.clear()
@@ -423,8 +437,8 @@
                     .append("Y: ").append(ps.mCoords.y, 1)
                     .toString(), 1 + itemW * 2, base, mTextPaint);
         } else {
-            float dx = ps.mCurrentX - ps.mFirstX;
-            float dy = ps.mCurrentY - ps.mFirstY;
+            float dx = ps.mTraceX[count - 1] - ps.mTraceX[0];
+            float dy = ps.mTraceY[count - 1] - ps.mTraceY[0];
             canvas.drawRect(itemW, mHeaderPaddingTop, (itemW * 2) - 1, bottom,
                     Math.abs(dx) < mVC.getScaledTouchSlop()
                             ? mTextBackgroundPaint : mTextLevelPaint);
@@ -551,9 +565,9 @@
                 .append(" TouchMinor=").append(coords.touchMinor, 3)
                 .append(" ToolMajor=").append(coords.toolMajor, 3)
                 .append(" ToolMinor=").append(coords.toolMinor, 3)
-                .append(" Orientation=").append((float) (coords.orientation * 180 / Math.PI), 1)
+                .append(" Orientation=").append((float)(coords.orientation * 180 / Math.PI), 1)
                 .append("deg")
-                .append(" Tilt=").append((float) (
+                .append(" Tilt=").append((float)(
                         coords.getAxisValue(MotionEvent.AXIS_TILT) * 180 / Math.PI), 1)
                 .append("deg")
                 .append(" Distance=").append(coords.getAxisValue(MotionEvent.AXIS_DISTANCE), 1)
@@ -584,7 +598,6 @@
                 mCurNumPointers = 0;
                 mMaxNumPointers = 0;
                 mVelocity.clear();
-                mTraceCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
                 if (mAltVelocity != null) {
                     mAltVelocity.clear();
                 }
@@ -633,8 +646,7 @@
                     logCoords("Pointer", action, i, coords, id, event);
                 }
                 if (ps != null) {
-                    ps.addTrace(coords.x, coords.y, true);
-                    updateDrawTrace(ps);
+                    ps.addTrace(coords.x, coords.y, false);
                 }
             }
         }
@@ -647,8 +659,7 @@
                 logCoords("Pointer", action, i, coords, id, event);
             }
             if (ps != null) {
-                ps.addTrace(coords.x, coords.y, false);
-                updateDrawTrace(ps);
+                ps.addTrace(coords.x, coords.y, true);
                 ps.mXVelocity = mVelocity.getXVelocity(id);
                 ps.mYVelocity = mVelocity.getYVelocity(id);
                 if (mAltVelocity != null) {
@@ -691,26 +702,13 @@
                 if (mActivePointerId == id) {
                     mActivePointerId = event.getPointerId(index == 0 ? 1 : 0);
                 }
-                ps.addTrace(Float.NaN, Float.NaN, true);
+                ps.addTrace(Float.NaN, Float.NaN, false);
             }
         }
 
         invalidate();
     }
 
-    private void updateDrawTrace(PointerState ps) {
-        mPaint.setARGB(255, 128, 255, 255);
-        float x = ps.mCurrentX;
-        float y = ps.mCurrentY;
-        float lastX = ps.mPreviousX;
-        float lastY = ps.mPreviousY;
-        if (!Float.isNaN(x) && !Float.isNaN(y) && !Float.isNaN(lastX) && !Float.isNaN(lastY)) {
-            mTraceCanvas.drawLine(lastX, lastY, x, y, mPathPaint);
-            Paint paint = ps.mPreviousPointIsHistorical ? mPaint : mCurrentPointPaint;
-            mTraceCanvas.drawPoint(lastX, lastY, paint);
-        }
-    }
-
     @Override
     public boolean onTouchEvent(MotionEvent event) {
         onPointerEvent(event);
@@ -769,7 +767,7 @@
                 return true;
             default:
                 return KeyEvent.isGamepadButton(keyCode)
-                        || KeyEvent.isModifierKey(keyCode);
+                    || KeyEvent.isModifierKey(keyCode);
         }
     }
 
@@ -889,7 +887,7 @@
         public FasterStringBuilder append(int value, int zeroPadWidth) {
             final boolean negative = value < 0;
             if (negative) {
-                value = -value;
+                value = - value;
                 if (value < 0) {
                     append("-2147483648");
                     return this;
@@ -975,27 +973,26 @@
 
     private ISystemGestureExclusionListener mSystemGestureExclusionListener =
             new ISystemGestureExclusionListener.Stub() {
-                @Override
-                public void onSystemGestureExclusionChanged(int displayId,
-                        Region systemGestureExclusion,
-                        Region systemGestureExclusionUnrestricted) {
-                    Region exclusion = Region.obtain(systemGestureExclusion);
-                    Region rejected = Region.obtain();
-                    if (systemGestureExclusionUnrestricted != null) {
-                        rejected.set(systemGestureExclusionUnrestricted);
-                        rejected.op(exclusion, Region.Op.DIFFERENCE);
-                    }
-                    Handler handler = getHandler();
-                    if (handler != null) {
-                        handler.post(() -> {
-                            mSystemGestureExclusion.set(exclusion);
-                            mSystemGestureExclusionRejected.set(rejected);
-                            exclusion.recycle();
-                            invalidate();
-                        });
-                    }
-                }
-            };
+        @Override
+        public void onSystemGestureExclusionChanged(int displayId, Region systemGestureExclusion,
+                Region systemGestureExclusionUnrestricted) {
+            Region exclusion = Region.obtain(systemGestureExclusion);
+            Region rejected = Region.obtain();
+            if (systemGestureExclusionUnrestricted != null) {
+                rejected.set(systemGestureExclusionUnrestricted);
+                rejected.op(exclusion, Region.Op.DIFFERENCE);
+            }
+            Handler handler = getHandler();
+            if (handler != null) {
+                handler.post(() -> {
+                    mSystemGestureExclusion.set(exclusion);
+                    mSystemGestureExclusionRejected.set(rejected);
+                    exclusion.recycle();
+                    invalidate();
+                });
+            }
+        }
+    };
 
     @Override
     protected void onConfigurationChanged(Configuration newConfig) {
diff --git a/core/java/com/android/internal/widget/remotecompose/core/CompanionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/CompanionOperation.java
index 2d36536..deae9a5 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/CompanionOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/CompanionOperation.java
@@ -27,9 +27,5 @@
      * @param operations command is to be added
      */
     void read(WireBuffer buffer, List<Operation> operations);
-
-    // Debugging / Documentation utility functions
-    String name();
-    int id();
 }
 
diff --git a/core/java/com/android/internal/widget/remotecompose/core/CoreDocument.java b/core/java/com/android/internal/widget/remotecompose/core/CoreDocument.java
index effbbe2..18be480 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/CoreDocument.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/CoreDocument.java
@@ -15,16 +15,23 @@
  */
 package com.android.internal.widget.remotecompose.core;
 
+import com.android.internal.widget.remotecompose.core.operations.ComponentValue;
 import com.android.internal.widget.remotecompose.core.operations.NamedVariable;
 import com.android.internal.widget.remotecompose.core.operations.RootContentBehavior;
 import com.android.internal.widget.remotecompose.core.operations.Theme;
+import com.android.internal.widget.remotecompose.core.operations.layout.ClickModifierEnd;
+import com.android.internal.widget.remotecompose.core.operations.layout.ClickModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.Component;
 import com.android.internal.widget.remotecompose.core.operations.layout.ComponentEnd;
 import com.android.internal.widget.remotecompose.core.operations.layout.ComponentStartOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.LayoutComponent;
 import com.android.internal.widget.remotecompose.core.operations.layout.RootLayoutComponent;
+import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ComponentModifiers;
+import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ModifierOperation;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -34,6 +41,8 @@
  */
 public class CoreDocument {
 
+    private static final boolean DEBUG = false;
+
     ArrayList<Operation> mOperations;
 
     RootLayoutComponent mRootLayoutComponent = null;
@@ -57,6 +66,8 @@
 
     RemoteComposeBuffer mBuffer = new RemoteComposeBuffer(mRemoteComposeState);
 
+    private int mLastId = 1; // last component id when inflating the file
+
     public String getContentDescription() {
         return mContentDescription;
     }
@@ -303,6 +314,59 @@
         return null;
     }
 
+    /**
+     * Returns a string representation of the component hierarchy of the document
+     *
+     * @return a standardized string representation of the component hierarchy
+     */
+    public String displayHierarchy() {
+        StringSerializer serializer = new StringSerializer();
+        for (Operation op : mOperations) {
+            if (op instanceof RootLayoutComponent) {
+                ((RootLayoutComponent) op).displayHierarchy((Component) op, 0, serializer);
+            } else if (op instanceof SerializableToString) {
+                ((SerializableToString) op).serializeToString(0, serializer);
+            }
+        }
+        return serializer.toString();
+    }
+
+    /**
+     * Callback interface for host actions
+     */
+    public interface ActionCallback {
+        // TODO: add payload support
+        void onAction(String name);
+    }
+
+    HashSet<ActionCallback> mActionListeners = new HashSet<ActionCallback>();
+
+    /**
+     * Warn action listeners for the given named action
+     * @param name the action name
+     */
+    public void runNamedAction(String name) {
+        for (ActionCallback callback : mActionListeners) {
+            callback.onAction(name);
+        }
+    }
+
+    /**
+     * Add a callback for handling the named host actions
+     *
+     * @param callback
+     */
+    public void addActionCallback(ActionCallback callback) {
+        mActionListeners.add(callback);
+    }
+
+    /**
+     * Clear existing callbacks for named host actions
+     */
+    public void clearActionCallbacks() {
+        mActionListeners.clear();
+    }
+
     public interface ClickCallbacks {
         void click(int id, String metadata);
     }
@@ -403,7 +467,7 @@
             }
         }
         if (mRootLayoutComponent != null) {
-            mRootLayoutComponent.assignIds();
+            mRootLayoutComponent.assignIds(mLastId);
         }
     }
 
@@ -417,7 +481,9 @@
         ArrayList<Component> components = new ArrayList<>();
         ArrayList<Operation> finalOperationsList = new ArrayList<>();
         ArrayList<Operation> ops = finalOperationsList;
+        ClickModifierOperation currentClickModifier = null;
 
+        mLastId = -1;
         for (Operation o : operations) {
             if (o instanceof ComponentStartOperation) {
                 Component component = (Component) o;
@@ -426,6 +492,9 @@
                 currentComponent = component;
                 ops.add(currentComponent);
                 ops = currentComponent.getList();
+                if (component.getComponentId() < mLastId) {
+                    mLastId = component.getComponentId();
+                }
             } else if (o instanceof ComponentEnd) {
                 if (currentComponent instanceof LayoutComponent) {
                     ((LayoutComponent) currentComponent).inflate();
@@ -437,6 +506,14 @@
                 } else {
                     ops = finalOperationsList;
                 }
+            } else if (o instanceof ClickModifierOperation) {
+                // TODO: refactor to add container <- component...
+                currentClickModifier = (ClickModifierOperation) o;
+                ops = ((ClickModifierOperation) o).getList();
+            } else if (o instanceof ClickModifierEnd) {
+                ops = currentComponent.getList();
+                ops.add(currentClickModifier);
+                currentClickModifier = null;
             } else {
                 ops.add(o);
             }
@@ -444,12 +521,46 @@
         return ops;
     }
 
+    private HashMap<Integer, Component> mComponentMap = new HashMap<Integer, Component>();
+
+    private void registerVariables(RemoteContext context, ArrayList<Operation> list) {
+        for (Operation op : list) {
+            if (op instanceof VariableSupport) {
+                ((VariableSupport) op).updateVariables(context);
+                ((VariableSupport) op).registerListening(context);
+            }
+            if (op instanceof Component) {
+                mComponentMap.put(((Component) op).getComponentId(), (Component) op);
+                registerVariables(context, ((Component) op).getList());
+            }
+            if (op instanceof ComponentValue) {
+                ComponentValue v = (ComponentValue) op;
+                Component component = mComponentMap.get(v.getComponentId());
+                if (component != null) {
+                    component.addComponentValue(v);
+                } else {
+                    System.out.println("=> Component not found for id " + v.getComponentId());
+                }
+            }
+            if (op instanceof ComponentModifiers) {
+                for (ModifierOperation modifier : ((ComponentModifiers) op).getList()) {
+                    if (modifier instanceof VariableSupport) {
+                        ((VariableSupport) modifier).updateVariables(context);
+                        ((VariableSupport) modifier).registerListening(context);
+                    }
+                }
+            }
+            op.apply(context);
+        }
+    }
+
     /**
      * Called when an initialization is needed, allowing the document to eg load
      * resources / cache them.
      */
     public void initializeContext(RemoteContext context) {
         mRemoteComposeState.reset();
+        mRemoteComposeState.setContext(context);
         mClickAreas.clear();
         mRemoteComposeState.setNextId(RemoteComposeState.START_ID);
         context.mDocument = this;
@@ -458,15 +569,8 @@
         context.mMode = RemoteContext.ContextMode.DATA;
         mTimeVariables.updateTime(context);
 
-        for (Operation op : mOperations) {
-            if (op instanceof VariableSupport) {
-                ((VariableSupport) op).updateVariables(context);
-                ((VariableSupport) op).registerListening(context);
-            }
-            op.apply(context);
-        }
+        registerVariables(context, mOperations);
         context.mMode = RemoteContext.ContextMode.UNSET;
-
     }
 
     ///////////////////////////////////////////////////////////////////////////////////////////////
@@ -529,15 +633,27 @@
     }
 
     /**
+     * Returns the list of set click listeners
+     *
+     * @return set of click listeners
+     */
+    public HashSet<CoreDocument.ClickCallbacks> getClickListeners() {
+        return mClickListeners;
+    }
+
+    /**
      * Passing a click event to the document. This will possibly result in calling the click
      * listeners.
      */
-    public void onClick(float x, float y) {
+    public void onClick(RemoteContext context, float x, float y) {
         for (ClickAreaRepresentation clickArea : mClickAreas) {
             if (clickArea.contains(x, y)) {
                 warnClickListeners(clickArea);
             }
         }
+        if (mRootLayoutComponent != null) {
+            mRootLayoutComponent.onClick(context, this, x, y);
+        }
     }
 
     /**
@@ -551,6 +667,9 @@
                 warnClickListeners(clickArea);
             }
         }
+        for (ClickCallbacks listener : mClickListeners) {
+            listener.click(id, "");
+        }
     }
 
     /**
@@ -627,13 +746,17 @@
      * @param theme   the theme we want to use for this document.
      */
     public void paint(RemoteContext context, int theme) {
-        context.mMode = RemoteContext.ContextMode.PAINT;
+        long time = System.nanoTime();
+        context.getPaintContext().clearNeedsRepaint();
+        context.mMode = RemoteContext.ContextMode.UNSET;
 
         // current theme starts as UNSPECIFIED, until a Theme setter
         // operation gets executed and modify it.
         context.setTheme(Theme.UNSPECIFIED);
 
         context.mRemoteComposeState = mRemoteComposeState;
+        context.mRemoteComposeState.setContext(context);
+
         if (mContentSizing == RootContentBehavior.SIZING_SCALE) {
             // we need to add canvas transforms ops here
             computeScale(context.mWidth, context.mHeight, mScaleOutput);
@@ -643,8 +766,8 @@
             context.mPaintContext.scale(mScaleOutput[0], mScaleOutput[1]);
         }
         mTimeVariables.updateTime(context);
-        context.loadFloat(RemoteContext.ID_WINDOW_WIDTH, getWidth());
-        context.loadFloat(RemoteContext.ID_WINDOW_HEIGHT, getHeight());
+        context.loadFloat(RemoteContext.ID_WINDOW_WIDTH, context.mWidth);
+        context.loadFloat(RemoteContext.ID_WINDOW_HEIGHT, context.mHeight);
         mRepaintNext = context.updateOps();
         if (mRootLayoutComponent != null) {
             if (context.mWidth != mRootLayoutComponent.getWidth()
@@ -654,10 +777,19 @@
             if (mRootLayoutComponent.needsMeasure()) {
                 mRootLayoutComponent.layout(context);
             }
+            // TODO -- this should be specifically about applying animation, not paint
+            mRootLayoutComponent.paint(context.getPaintContext());
+            // TODO -- should be able to remove this
+            mRootLayoutComponent.updateVariables(context);
+            if (DEBUG) {
+                String hierarchy = mRootLayoutComponent.displayHierarchy();
+                System.out.println(hierarchy);
+            }
             if (mRootLayoutComponent.doesNeedsRepaint()) {
                 mRepaintNext = 1;
             }
         }
+        context.mMode = RemoteContext.ContextMode.PAINT;
         for (Operation op : mOperations) {
             // operations will only be executed if no theme is set (ie UNSPECIFIED)
             // or the theme is equal as the one passed in argument to paint.
@@ -671,8 +803,95 @@
                 op.apply(context);
             }
         }
+        if (context.getPaintContext().doesNeedsRepaint()
+                || (mRootLayoutComponent != null && mRootLayoutComponent.doesNeedsRepaint())) {
+            mRepaintNext = 1;
+        }
         context.mMode = RemoteContext.ContextMode.UNSET;
+       // System.out.println(">>   " + (  System.nanoTime() - time)*1E-6f+" ms");
     }
 
+    public String[] getStats() {
+        ArrayList<String> ret = new ArrayList<>();
+        WireBuffer buffer = new WireBuffer();
+        int count = mOperations.size();
+        HashMap<String, int[]> map = new HashMap<>();
+        for (Operation mOperation : mOperations) {
+            Class<? extends Operation> c = mOperation.getClass();
+            int[] values;
+            if (map.containsKey(c.getSimpleName())) {
+                values = map.get(c.getSimpleName());
+            } else {
+                values = new int[2];
+                map.put(c.getSimpleName(), values);
+            }
+
+            values[0] += 1;
+            values[1] += sizeOfComponent(mOperation, buffer);
+            if (mOperation instanceof Component) {
+                Component com = (Component) mOperation;
+                count += addChildren(com, map, buffer);
+
+            }
+        }
+
+        ret.add(0, "number of operations : " + count);
+
+        for (String s : map.keySet()) {
+            int[] v = map.get(s);
+            ret.add(s + " : " + v[0] + ":" + v[1]);
+        }
+        return ret.toArray(new String[0]);
+    }
+
+    private int sizeOfComponent(Operation com, WireBuffer tmp) {
+        tmp.reset(100);
+        com.write(tmp);
+        int size = tmp.getSize();
+        tmp.reset(100);
+        return size;
+    }
+
+    private int addChildren(Component base, HashMap<String, int[]> map, WireBuffer tmp) {
+        int count = base.mList.size();
+        for (Operation mOperation : base.mList) {
+            Class<? extends Operation> c = mOperation.getClass();
+            int[] values;
+            if (map.containsKey(c.getSimpleName())) {
+                values = map.get(c.getSimpleName());
+            } else {
+                values = new int[2];
+                map.put(c.getSimpleName(), values);
+            }
+            values[0] += 1;
+            values[1] += sizeOfComponent(mOperation, tmp);
+            if (mOperation instanceof Component) {
+                count += addChildren((Component) mOperation, map, tmp);
+            }
+        }
+        return count;
+    }
+
+    public String toNestedString() {
+        StringBuilder ret = new StringBuilder();
+        for (Operation mOperation : mOperations) {
+            ret.append(mOperation.toString());
+            ret.append("\n");
+            if (mOperation instanceof Component) {
+                toNestedString((Component) mOperation, ret, "  ");
+            }
+        }
+        return ret.toString();
+    }
+
+    private void toNestedString(Component base, StringBuilder ret, String indent) {
+        for (Operation mOperation : base.mList) {
+            ret.append(mOperation.toString());
+            ret.append("\n");
+            if (mOperation instanceof Component) {
+                toNestedString((Component) mOperation, ret, indent + "  ");
+            }
+        }
+    }
 }
 
diff --git a/core/java/com/android/internal/widget/remotecompose/core/DocumentedCompanion.java b/core/java/com/android/internal/widget/remotecompose/core/DocumentedCompanion.java
new file mode 100644
index 0000000..661cf7c
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/DocumentedCompanion.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core;
+
+import com.android.internal.widget.remotecompose.core.documentation.DocumentedCompanionOperation;
+
+public interface DocumentedCompanion extends CompanionOperation , DocumentedCompanionOperation {
+
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/Operations.java b/core/java/com/android/internal/widget/remotecompose/core/Operations.java
index 9cb024b..4a25b5e 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/Operations.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/Operations.java
@@ -21,6 +21,10 @@
 import com.android.internal.widget.remotecompose.core.operations.ClipRect;
 import com.android.internal.widget.remotecompose.core.operations.ColorConstant;
 import com.android.internal.widget.remotecompose.core.operations.ColorExpression;
+import com.android.internal.widget.remotecompose.core.operations.ComponentValue;
+import com.android.internal.widget.remotecompose.core.operations.DataListFloat;
+import com.android.internal.widget.remotecompose.core.operations.DataListIds;
+import com.android.internal.widget.remotecompose.core.operations.DataMapIds;
 import com.android.internal.widget.remotecompose.core.operations.DrawArc;
 import com.android.internal.widget.remotecompose.core.operations.DrawBitmap;
 import com.android.internal.widget.remotecompose.core.operations.DrawBitmapInt;
@@ -54,24 +58,35 @@
 import com.android.internal.widget.remotecompose.core.operations.TextFromFloat;
 import com.android.internal.widget.remotecompose.core.operations.TextMerge;
 import com.android.internal.widget.remotecompose.core.operations.Theme;
+import com.android.internal.widget.remotecompose.core.operations.layout.CanvasContent;
+import com.android.internal.widget.remotecompose.core.operations.layout.ClickModifierEnd;
+import com.android.internal.widget.remotecompose.core.operations.layout.ClickModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.ComponentEnd;
 import com.android.internal.widget.remotecompose.core.operations.layout.ComponentStart;
 import com.android.internal.widget.remotecompose.core.operations.layout.LayoutComponentContent;
 import com.android.internal.widget.remotecompose.core.operations.layout.RootLayoutComponent;
 import com.android.internal.widget.remotecompose.core.operations.layout.animation.AnimationSpec;
 import com.android.internal.widget.remotecompose.core.operations.layout.managers.BoxLayout;
+import com.android.internal.widget.remotecompose.core.operations.layout.managers.CanvasLayout;
 import com.android.internal.widget.remotecompose.core.operations.layout.managers.ColumnLayout;
 import com.android.internal.widget.remotecompose.core.operations.layout.managers.RowLayout;
+import com.android.internal.widget.remotecompose.core.operations.layout.managers.TextLayout;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.BackgroundModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.BorderModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ClipRectModifierOperation;
+import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ComponentVisibilityOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.HeightModifierOperation;
+import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.HostActionOperation;
+import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.HostNamedActionOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.PaddingModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.RoundedClipRectModifierOperation;
+import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ValueIntegerChangeActionOperation;
+import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ValueStringChangeActionOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.WidthModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.utilities.IntMap;
 import com.android.internal.widget.remotecompose.core.types.BooleanConstant;
 import com.android.internal.widget.remotecompose.core.types.IntegerConstant;
+import com.android.internal.widget.remotecompose.core.types.LongConstant;
 
 /**
  * List of operations supported in a RemoteCompose document
@@ -130,6 +145,10 @@
     public static final int DATA_INT = 140;
     public static final int DATA_BOOLEAN = 143;
     public static final int INTEGER_EXPRESSION = 144;
+    public static final int ID_MAP = 145;
+    public static final int ID_LIST = 146;
+    public static final int FLOAT_LIST = 147;
+    public static final int DATA_LONG = 148;
 
     /////////////////////////////////////////======================
 
@@ -142,6 +161,10 @@
     public static final int LAYOUT_BOX = 202;
     public static final int LAYOUT_ROW = 203;
     public static final int LAYOUT_COLUMN = 204;
+    public static final int LAYOUT_CANVAS = 205;
+    public static final int LAYOUT_CANVAS_CONTENT = 207;
+
+    public static final int LAYOUT_TEXT = 208;
     public static final int COMPONENT_START = 2;
     public static final int COMPONENT_END = 3;
     public static final int MODIFIER_WIDTH = 16;
@@ -151,73 +174,110 @@
     public static final int MODIFIER_PADDING = 58;
     public static final int MODIFIER_CLIP_RECT = 108;
     public static final int MODIFIER_ROUNDED_CLIP_RECT = 54;
+
+    public static final int MODIFIER_CLICK = 59;
+
+    public static final int MODIFIER_CLICK_END = 214;
+
+    public static final int MODIFIER_VISIBILITY = 211;
+    public static final int HOST_ACTION = 209;
+    public static final int HOST_NAMED_ACTION = 210;
+
+    public static final int VALUE_INTEGER_CHANGE_ACTION = 212;
+    public static final int VALUE_STRING_CHANGE_ACTION = 213;
+
     public static final int ANIMATION_SPEC = 14;
 
-    public static IntMap<CompanionOperation> map = new IntMap<>();
+    public static final int COMPONENT_VALUE = 150;
+
+    public static UniqueIntMap<CompanionOperation> map = new UniqueIntMap<>();
+
+    static class UniqueIntMap<T> extends IntMap<T> {
+        @Override
+        public T put(int key,  T value)  {
+            assert null == get(key) : "Opcode " + key + " already used in Operations !";
+            return super.put(key, value);
+        }
+    }
 
     static {
-        map.put(HEADER, Header.COMPANION);
-        map.put(DRAW_BITMAP_INT, DrawBitmapInt.COMPANION);
-        map.put(DATA_BITMAP, BitmapData.COMPANION);
-        map.put(DATA_TEXT, TextData.COMPANION);
-        map.put(THEME, Theme.COMPANION);
-        map.put(CLICK_AREA, ClickArea.COMPANION);
-        map.put(ROOT_CONTENT_BEHAVIOR, RootContentBehavior.COMPANION);
-        map.put(ROOT_CONTENT_DESCRIPTION, RootContentDescription.COMPANION);
+        map.put(HEADER, Header::read);
+        map.put(DRAW_BITMAP_INT, DrawBitmapInt::read);
+        map.put(DATA_BITMAP, BitmapData::read);
+        map.put(DATA_TEXT, TextData::read);
+        map.put(THEME, Theme::read);
+        map.put(CLICK_AREA, ClickArea::read);
+        map.put(ROOT_CONTENT_BEHAVIOR, RootContentBehavior::read);
+        map.put(ROOT_CONTENT_DESCRIPTION, RootContentDescription::read);
 
-        map.put(DRAW_ARC, DrawArc.COMPANION);
-        map.put(DRAW_BITMAP, DrawBitmap.COMPANION);
-        map.put(DRAW_CIRCLE, DrawCircle.COMPANION);
-        map.put(DRAW_LINE, DrawLine.COMPANION);
-        map.put(DRAW_OVAL, DrawOval.COMPANION);
-        map.put(DRAW_PATH, DrawPath.COMPANION);
-        map.put(DRAW_RECT, DrawRect.COMPANION);
-        map.put(DRAW_ROUND_RECT, DrawRoundRect.COMPANION);
-        map.put(DRAW_TEXT_ON_PATH, DrawTextOnPath.COMPANION);
-        map.put(DRAW_TEXT_RUN, DrawText.COMPANION);
-        map.put(DRAW_TWEEN_PATH, DrawTweenPath.COMPANION);
-        map.put(DATA_PATH, PathData.COMPANION);
-        map.put(PAINT_VALUES, PaintData.COMPANION);
-        map.put(MATRIX_RESTORE, MatrixRestore.COMPANION);
-        map.put(MATRIX_ROTATE, MatrixRotate.COMPANION);
-        map.put(MATRIX_SAVE, MatrixSave.COMPANION);
-        map.put(MATRIX_SCALE, MatrixScale.COMPANION);
-        map.put(MATRIX_SKEW, MatrixSkew.COMPANION);
-        map.put(MATRIX_TRANSLATE, MatrixTranslate.COMPANION);
-        map.put(CLIP_PATH, ClipPath.COMPANION);
-        map.put(CLIP_RECT, ClipRect.COMPANION);
-        map.put(DATA_SHADER, ShaderData.COMPANION);
-        map.put(DATA_FLOAT, FloatConstant.COMPANION);
-        map.put(ANIMATED_FLOAT, FloatExpression.COMPANION);
-        map.put(DRAW_TEXT_ANCHOR, DrawTextAnchored.COMPANION);
-        map.put(COLOR_EXPRESSIONS, ColorExpression.COMPANION);
-        map.put(TEXT_FROM_FLOAT, TextFromFloat.COMPANION);
-        map.put(TEXT_MERGE, TextMerge.COMPANION);
-        map.put(NAMED_VARIABLE, NamedVariable.COMPANION);
-        map.put(COLOR_CONSTANT, ColorConstant.COMPANION);
-        map.put(DATA_INT, IntegerConstant.COMPANION);
-        map.put(INTEGER_EXPRESSION, IntegerExpression.COMPANION);
-        map.put(DATA_BOOLEAN, BooleanConstant.COMPANION);
+        map.put(DRAW_ARC, DrawArc::read);
+        map.put(DRAW_BITMAP, DrawBitmap::read);
+        map.put(DRAW_CIRCLE, DrawCircle::read);
+        map.put(DRAW_LINE, DrawLine::read);
+        map.put(DRAW_OVAL, DrawOval::read);
+        map.put(DRAW_PATH, DrawPath::read);
+        map.put(DRAW_RECT, DrawRect::read);
+        map.put(DRAW_ROUND_RECT, DrawRoundRect::read);
+        map.put(DRAW_TEXT_ON_PATH, DrawTextOnPath::read);
+        map.put(DRAW_TEXT_RUN, DrawText::read);
+        map.put(DRAW_TWEEN_PATH, DrawTweenPath::read);
+        map.put(DATA_PATH, PathData::read);
+        map.put(PAINT_VALUES, PaintData::read);
+        map.put(MATRIX_RESTORE, MatrixRestore::read);
+        map.put(MATRIX_ROTATE, MatrixRotate::read);
+        map.put(MATRIX_SAVE, MatrixSave::read);
+        map.put(MATRIX_SCALE, MatrixScale::read);
+        map.put(MATRIX_SKEW, MatrixSkew::read);
+        map.put(MATRIX_TRANSLATE, MatrixTranslate::read);
+        map.put(CLIP_PATH, ClipPath::read);
+        map.put(CLIP_RECT, ClipRect::read);
+        map.put(DATA_SHADER, ShaderData::read);
+        map.put(DATA_FLOAT, FloatConstant::read);
+        map.put(ANIMATED_FLOAT, FloatExpression::read);
+        map.put(DRAW_TEXT_ANCHOR, DrawTextAnchored::read);
+        map.put(COLOR_EXPRESSIONS, ColorExpression::read);
+        map.put(TEXT_FROM_FLOAT, TextFromFloat::read);
+        map.put(TEXT_MERGE, TextMerge::read);
+        map.put(NAMED_VARIABLE, NamedVariable::read);
+        map.put(COLOR_CONSTANT, ColorConstant::read);
+        map.put(DATA_INT, IntegerConstant::read);
+        map.put(INTEGER_EXPRESSION, IntegerExpression::read);
+        map.put(DATA_BOOLEAN, BooleanConstant::read);
+        map.put(ID_MAP, DataMapIds::read);
+        map.put(ID_LIST, DataListIds::read);
+        map.put(FLOAT_LIST, DataListFloat::read);
+        map.put(DATA_LONG, LongConstant::read);
 
         // Layout
 
-        map.put(COMPONENT_START, ComponentStart.COMPANION);
-        map.put(COMPONENT_END, ComponentEnd.COMPANION);
-        map.put(ANIMATION_SPEC, AnimationSpec.COMPANION);
+        map.put(COMPONENT_START, ComponentStart::read);
+        map.put(COMPONENT_END, ComponentEnd::read);
+        map.put(ANIMATION_SPEC, AnimationSpec::read);
 
-        map.put(MODIFIER_WIDTH, WidthModifierOperation.COMPANION);
-        map.put(MODIFIER_HEIGHT, HeightModifierOperation.COMPANION);
-        map.put(MODIFIER_PADDING, PaddingModifierOperation.COMPANION);
-        map.put(MODIFIER_BACKGROUND, BackgroundModifierOperation.COMPANION);
-        map.put(MODIFIER_BORDER, BorderModifierOperation.COMPANION);
-        map.put(MODIFIER_ROUNDED_CLIP_RECT, RoundedClipRectModifierOperation.COMPANION);
-        map.put(MODIFIER_CLIP_RECT, ClipRectModifierOperation.COMPANION);
+        map.put(MODIFIER_WIDTH, WidthModifierOperation::read);
+        map.put(MODIFIER_HEIGHT, HeightModifierOperation::read);
+        map.put(MODIFIER_PADDING, PaddingModifierOperation::read);
+        map.put(MODIFIER_BACKGROUND, BackgroundModifierOperation::read);
+        map.put(MODIFIER_BORDER, BorderModifierOperation::read);
+        map.put(MODIFIER_ROUNDED_CLIP_RECT, RoundedClipRectModifierOperation::read);
+        map.put(MODIFIER_CLIP_RECT, ClipRectModifierOperation::read);
+        map.put(MODIFIER_CLICK, ClickModifierOperation::read);
+        map.put(MODIFIER_CLICK_END, ClickModifierEnd::read);
+        map.put(MODIFIER_VISIBILITY, ComponentVisibilityOperation::read);
+        map.put(HOST_ACTION, HostActionOperation::read);
+        map.put(HOST_NAMED_ACTION, HostNamedActionOperation::read);
+        map.put(VALUE_INTEGER_CHANGE_ACTION, ValueIntegerChangeActionOperation::read);
+        map.put(VALUE_STRING_CHANGE_ACTION, ValueStringChangeActionOperation::read);
 
-        map.put(LAYOUT_ROOT, RootLayoutComponent.COMPANION);
-        map.put(LAYOUT_CONTENT, LayoutComponentContent.COMPANION);
-        map.put(LAYOUT_BOX, BoxLayout.COMPANION);
-        map.put(LAYOUT_COLUMN, ColumnLayout.COMPANION);
-        map.put(LAYOUT_ROW, RowLayout.COMPANION);
+        map.put(LAYOUT_ROOT, RootLayoutComponent::read);
+        map.put(LAYOUT_CONTENT, LayoutComponentContent::read);
+        map.put(LAYOUT_BOX, BoxLayout::read);
+        map.put(LAYOUT_COLUMN, ColumnLayout::read);
+        map.put(LAYOUT_ROW, RowLayout::read);
+        map.put(LAYOUT_CANVAS, CanvasLayout::read);
+        map.put(LAYOUT_CANVAS_CONTENT, CanvasContent::read);
+        map.put(LAYOUT_TEXT, TextLayout::read);
+
+        map.put(COMPONENT_VALUE, ComponentValue::read);
     }
-
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/PaintContext.java b/core/java/com/android/internal/widget/remotecompose/core/PaintContext.java
index 665fcb7..4770b12 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/PaintContext.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/PaintContext.java
@@ -21,12 +21,23 @@
  * Specify an abstract paint context used by RemoteCompose commands to draw
  */
 public abstract class PaintContext {
-    protected RemoteContext mContext;
+    public static final int TEXT_MEASURE_MONOSPACE_WIDTH = 0x01;
+    public static final int TEXT_MEASURE_FONT_HEIGHT = 0x02;
 
+    protected RemoteContext mContext;
+    private boolean mNeedsRepaint = false;
     public RemoteContext getContext() {
         return mContext;
     }
 
+    public boolean doesNeedsRepaint() {
+        return mNeedsRepaint;
+    }
+
+    public void clearNeedsRepaint() {
+        mNeedsRepaint = false;
+    }
+
     public PaintContext(RemoteContext context) {
         this.mContext = context;
     }
@@ -111,13 +122,16 @@
      * @param textId
      * @param start
      * @param end    if end is -1 it means the whole string
-     * @param monospace measure with better support for monospace
+     * @param flags how to measure:
+     *              TEXT_MEASURE_MONOSPACE_WIDTH - measure as a monospace font
+     *              TEXT_MEASURE_FULL_HEIGHT - measure bounds of the given string using the
+     *                max ascend and descent of the font (not just of the measured text)
      * @param bounds the bounds (left, top, right, bottom)
      */
     public abstract void getTextBounds(int textId,
                                        int start,
                                        int end,
-                                       boolean monospace,
+                                       int flags,
                                        float[]bounds);
 
     /**
@@ -267,5 +281,8 @@
         System.out.println("[LOG] " + content);
     }
 
+    public void needsRepaint() {
+        mNeedsRepaint = true;
+    }
 }
 
diff --git a/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeBuffer.java b/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeBuffer.java
index 333951b..6b1828f 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeBuffer.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeBuffer.java
@@ -21,6 +21,10 @@
 import com.android.internal.widget.remotecompose.core.operations.ClipRect;
 import com.android.internal.widget.remotecompose.core.operations.ColorConstant;
 import com.android.internal.widget.remotecompose.core.operations.ColorExpression;
+import com.android.internal.widget.remotecompose.core.operations.ComponentValue;
+import com.android.internal.widget.remotecompose.core.operations.DataListFloat;
+import com.android.internal.widget.remotecompose.core.operations.DataListIds;
+import com.android.internal.widget.remotecompose.core.operations.DataMapIds;
 import com.android.internal.widget.remotecompose.core.operations.DrawArc;
 import com.android.internal.widget.remotecompose.core.operations.DrawBitmap;
 import com.android.internal.widget.remotecompose.core.operations.DrawBitmapInt;
@@ -54,19 +58,23 @@
 import com.android.internal.widget.remotecompose.core.operations.TextMerge;
 import com.android.internal.widget.remotecompose.core.operations.Theme;
 import com.android.internal.widget.remotecompose.core.operations.Utils;
+import com.android.internal.widget.remotecompose.core.operations.layout.CanvasContent;
 import com.android.internal.widget.remotecompose.core.operations.layout.ComponentEnd;
 import com.android.internal.widget.remotecompose.core.operations.layout.ComponentStart;
 import com.android.internal.widget.remotecompose.core.operations.layout.LayoutComponentContent;
 import com.android.internal.widget.remotecompose.core.operations.layout.RootLayoutComponent;
 import com.android.internal.widget.remotecompose.core.operations.layout.managers.BoxLayout;
+import com.android.internal.widget.remotecompose.core.operations.layout.managers.CanvasLayout;
 import com.android.internal.widget.remotecompose.core.operations.layout.managers.ColumnLayout;
 import com.android.internal.widget.remotecompose.core.operations.layout.managers.RowLayout;
+import com.android.internal.widget.remotecompose.core.operations.layout.managers.TextLayout;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.BackgroundModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.BorderModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ClipRectModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.PaddingModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.RoundedClipRectModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.paint.PaintBundle;
+import com.android.internal.widget.remotecompose.core.operations.utilities.NanMap;
 import com.android.internal.widget.remotecompose.core.operations.utilities.easing.FloatAnimation;
 import com.android.internal.widget.remotecompose.core.types.IntegerConstant;
 
@@ -97,6 +105,9 @@
     RemoteComposeState mRemoteComposeState;
     private static final boolean DEBUG = false;
 
+    private int mLastComponentId = 0;
+    private int mGeneratedComponentId = -1;
+
     /**
      * Provides an abstract buffer to encode/decode RemoteCompose operations
      *
@@ -114,6 +125,12 @@
     public void reset(int expectedSize) {
         mBuffer.reset(expectedSize);
         mRemoteComposeState.reset();
+        mLastComponentId = 0;
+        mGeneratedComponentId = -1;
+    }
+
+    public int getLastComponentId() {
+        return mLastComponentId;
     }
 
     public Platform getPlatform() {
@@ -146,11 +163,11 @@
      */
     public void header(int width, int height, String contentDescription,
                        float density, long capabilities) {
-        Header.COMPANION.apply(mBuffer, width, height, density, capabilities);
+        Header.apply(mBuffer, width, height, density, capabilities);
         int contentDescriptionId = 0;
         if (contentDescription != null) {
             contentDescriptionId = addText(contentDescription);
-            RootContentDescription.COMPANION.apply(mBuffer, contentDescriptionId);
+            RootContentDescription.apply(mBuffer, contentDescriptionId);
         }
     }
 
@@ -187,15 +204,15 @@
                            String contentDescription) {
         int imageId = mRemoteComposeState.dataGetId(image);
         if (imageId == -1) {
-            imageId = mRemoteComposeState.cache(image);
+            imageId = mRemoteComposeState.cacheData(image);
             byte[] data = mPlatform.imageToByteArray(image);
-            BitmapData.COMPANION.apply(mBuffer, imageId, imageWidth, imageHeight, data);
+            BitmapData.apply(mBuffer, imageId, imageWidth, imageHeight, data);
         }
         int contentDescriptionId = 0;
         if (contentDescription != null) {
             contentDescriptionId = addText(contentDescription);
         }
-        DrawBitmapInt.COMPANION.apply(
+        DrawBitmapInt.apply(
                 mBuffer, imageId, srcLeft, srcTop, srcRight, srcBottom,
                 dstLeft, dstTop, dstRight, dstBottom, contentDescriptionId
         );
@@ -210,8 +227,8 @@
     public int addText(String text) {
         int id = mRemoteComposeState.dataGetId(text);
         if (id == -1) {
-            id = mRemoteComposeState.cache(text);
-            TextData.COMPANION.apply(mBuffer, id, text);
+            id = mRemoteComposeState.cacheData(text);
+            TextData.apply(mBuffer, id, text);
         }
         return id;
     }
@@ -244,7 +261,7 @@
         if (metadata != null) {
             metadataId = addText(metadata);
         }
-        ClickArea.COMPANION.apply(mBuffer, id, contentDescriptionId,
+        ClickArea.apply(mBuffer, id, contentDescriptionId,
                 left, top, right, bottom, metadataId);
     }
 
@@ -268,7 +285,7 @@
      *                  The LAYOUT_*_FIXED modes will use the intrinsic document size
      */
     public void setRootContentBehavior(int scroll, int alignment, int sizing, int mode) {
-        RootContentBehavior.COMPANION.apply(mBuffer, scroll, alignment, sizing, mode);
+        RootContentBehavior.apply(mBuffer, scroll, alignment, sizing, mode);
     }
 
     /**
@@ -298,7 +315,7 @@
                            float bottom,
                            float startAngle,
                            float sweepAngle) {
-        DrawArc.COMPANION.apply(mBuffer, left, top, right, bottom, startAngle, sweepAngle);
+        DrawArc.apply(mBuffer, left, top, right, bottom, startAngle, sweepAngle);
     }
 
     /**
@@ -317,18 +334,18 @@
                               String contentDescription) {
         int imageId = mRemoteComposeState.dataGetId(image);
         if (imageId == -1) {
-            imageId = mRemoteComposeState.cache(image);
+            imageId = mRemoteComposeState.cacheData(image);
             byte[] data = mPlatform.imageToByteArray(image);
             int imageWidth = mPlatform.getImageWidth(image);
             int imageHeight = mPlatform.getImageHeight(image);
 
-            BitmapData.COMPANION.apply(mBuffer, imageId, imageWidth, imageHeight, data);
+            BitmapData.apply(mBuffer, imageId, imageWidth, imageHeight, data);
         }
         int contentDescriptionId = 0;
         if (contentDescription != null) {
             contentDescriptionId = addText(contentDescription);
         }
-        DrawBitmap.COMPANION.apply(
+        DrawBitmap.apply(
                 mBuffer, imageId, left, top, right, bottom, contentDescriptionId
         );
     }
@@ -342,7 +359,7 @@
      * @param radius  The radius of the circle to be drawn
      */
     public void addDrawCircle(float centerX, float centerY, float radius) {
-        DrawCircle.COMPANION.apply(mBuffer, centerX, centerY, radius);
+        DrawCircle.apply(mBuffer, centerX, centerY, radius);
     }
 
     /**
@@ -355,7 +372,7 @@
      * @param y2 The y-coordinate of the end point of the line
      */
     public void addDrawLine(float x1, float y1, float x2, float y2) {
-        DrawLine.COMPANION.apply(mBuffer, x1, y1, x2, y2);
+        DrawLine.apply(mBuffer, x1, y1, x2, y2);
     }
 
     /**
@@ -367,7 +384,7 @@
      * @param bottom bottom coordinate of oval
      */
     public void addDrawOval(float left, float top, float right, float bottom) {
-        DrawOval.COMPANION.apply(mBuffer, left, top, right, bottom);
+        DrawOval.apply(mBuffer, left, top, right, bottom);
     }
 
     /**
@@ -392,7 +409,7 @@
      * @param pathId
      */
     public void addDrawPath(int pathId) {
-        DrawPath.COMPANION.apply(mBuffer, pathId);
+        DrawPath.apply(mBuffer, pathId);
     }
 
     /**
@@ -404,7 +421,7 @@
      * @param bottom bottom coordinate of rectangle to be drawn
      */
     public void addDrawRect(float left, float top, float right, float bottom) {
-        DrawRect.COMPANION.apply(mBuffer, left, top, right, bottom);
+        DrawRect.apply(mBuffer, left, top, right, bottom);
     }
 
     /**
@@ -419,7 +436,7 @@
      */
     public void addDrawRoundRect(float left, float top, float right, float bottom,
                                  float radiusX, float radiusY) {
-        DrawRoundRect.COMPANION.apply(mBuffer, left, top, right, bottom, radiusX, radiusY);
+        DrawRoundRect.apply(mBuffer, left, top, right, bottom, radiusX, radiusY);
     }
 
     /**
@@ -436,7 +453,7 @@
             pathId = addPathData(path);
         }
         int textId = addText(text);
-        DrawTextOnPath.COMPANION.apply(mBuffer, textId, pathId, hOffset, vOffset);
+        DrawTextOnPath.apply(mBuffer, textId, pathId, hOffset, vOffset);
     }
 
     /**
@@ -461,7 +478,7 @@
                                float y,
                                boolean rtl) {
         int textId = addText(text);
-        DrawText.COMPANION.apply(
+        DrawText.apply(
                 mBuffer, textId, start, end,
                 contextStart, contextEnd, x, y, rtl);
     }
@@ -487,7 +504,7 @@
                                float x,
                                float y,
                                boolean rtl) {
-        DrawText.COMPANION.apply(
+        DrawText.apply(
                 mBuffer, textId, start, end,
                 contextStart, contextEnd, x, y, rtl);
     }
@@ -520,7 +537,7 @@
                                  float panY,
                                  int flags) {
         int textId = addText(text);
-        DrawTextAnchored.COMPANION.apply(
+        DrawTextAnchored.apply(
                 mBuffer, textId,
                 x, y,
                 panX, panY,
@@ -545,7 +562,7 @@
      */
     public int textMerge(int id1, int id2) {
         int textId = addText(id1 + "+" + id2);
-        TextMerge.COMPANION.apply(mBuffer, textId, id1, id2);
+        TextMerge.apply(mBuffer, textId, id1, id2);
         return textId;
     }
 
@@ -571,10 +588,10 @@
                 + "(" + digitsBefore + "," + digitsAfter + "," + flags + ")";
         int id = mRemoteComposeState.dataGetId(placeHolder);
         if (id == -1) {
-            id = mRemoteComposeState.cache(placeHolder);
-            //   TextData.COMPANION.apply(mBuffer, id, text);
+            id = mRemoteComposeState.cacheData(placeHolder);
+            //   TextData.apply(mBuffer, id, text);
         }
-        TextFromFloat.COMPANION.apply(mBuffer, id, value, digitsBefore,
+        TextFromFloat.apply(mBuffer, id, value, digitsBefore,
                 digitsAfter, flags);
         return id;
     }
@@ -607,7 +624,7 @@
                                  float panY,
                                  int flags) {
 
-        DrawTextAnchored.COMPANION.apply(
+        DrawTextAnchored.apply(
                 mBuffer, textId,
                 x, y,
                 panX, panY,
@@ -655,7 +672,7 @@
                                  float tween,
                                  float start,
                                  float stop) {
-        DrawTweenPath.COMPANION.apply(
+        DrawTweenPath.apply(
                 mBuffer, path1Id, path2Id,
                 tween, start, stop);
     }
@@ -668,8 +685,8 @@
      */
     public int addPathData(Object path) {
         float[] pathData = mPlatform.pathToFloatArray(path);
-        int id = mRemoteComposeState.cache(path);
-        PathData.COMPANION.apply(mBuffer, id, pathData);
+        int id = mRemoteComposeState.cacheData(path);
+        PathData.apply(mBuffer, id, pathData);
         return id;
     }
 
@@ -678,7 +695,7 @@
      * @param paint
      */
     public void addPaint(PaintBundle paint) {
-        PaintData.COMPANION.apply(mBuffer, paint);
+        PaintData.apply(mBuffer, paint);
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -697,6 +714,18 @@
         }
     }
 
+    public static void readNextOperation(WireBuffer buffer, ArrayList<Operation> operations) {
+        int opId = buffer.readByte();
+        if (DEBUG) {
+            Utils.log(">> " + opId);
+        }
+        CompanionOperation operation = Operations.map.get(opId);
+        if (operation == null) {
+            throw new RuntimeException("Unknown operation encountered " + opId);
+        }
+        operation.read(buffer, operations);
+    }
+
     RemoteComposeBuffer copy() {
         ArrayList<Operation> operations = new ArrayList<>();
         inflateFromBuffer(operations);
@@ -705,7 +734,7 @@
     }
 
     public void setTheme(int theme) {
-        Theme.COMPANION.apply(mBuffer, theme);
+        Theme.apply(mBuffer, theme);
     }
 
     static String version() {
@@ -743,6 +772,12 @@
         return buffer;
     }
 
+    /**
+     * Write the given RemoteComposeBuffer to the given file
+     *
+     * @param buffer a RemoteComposeBuffer
+     * @param file a target file
+     */
     public void write(RemoteComposeBuffer buffer, File file) {
         try {
             FileOutputStream fd = new FileOutputStream(file);
@@ -750,7 +785,7 @@
             fd.flush();
             fd.close();
         } catch (Exception ex) {
-            ex.printStackTrace();
+            throw new RuntimeException(ex);
         }
     }
 
@@ -766,8 +801,7 @@
             System.arraycopy(bytes, 0, buffer.mBuffer.mBuffer, 0, bytes.length);
             buffer.mBuffer.mSize = bytes.length;
         } catch (Exception e) {
-            e.printStackTrace();
-            // todo decide how to handel this stuff
+            throw new RuntimeException(e);
         }
     }
 
@@ -794,7 +828,7 @@
      * @param skewY The amount to skew in Y
      */
     public void addMatrixSkew(float skewX, float skewY) {
-        MatrixSkew.COMPANION.apply(mBuffer, skewX, skewY);
+        MatrixSkew.apply(mBuffer, skewX, skewY);
     }
 
     /**
@@ -803,7 +837,7 @@
      * Do not call restore() more times than save() was called.
      */
     public void addMatrixRestore() {
-        MatrixRestore.COMPANION.apply(mBuffer);
+        MatrixRestore.apply(mBuffer);
     }
 
     /**
@@ -815,7 +849,7 @@
      * existed before the save() will be reinstated.
      */
     public void addMatrixSave() {
-        MatrixSave.COMPANION.apply(mBuffer);
+        MatrixSave.apply(mBuffer);
     }
 
     /**
@@ -826,7 +860,7 @@
      * @param centerY The y-coord for the pivot point (unchanged by the rotation)
      */
     public void addMatrixRotate(float angle, float centerX, float centerY) {
-        MatrixRotate.COMPANION.apply(mBuffer, angle, centerX, centerY);
+        MatrixRotate.apply(mBuffer, angle, centerX, centerY);
     }
 
     /**
@@ -836,7 +870,7 @@
      * @param dy The distance to translate in Y
      */
     public void addMatrixTranslate(float dx, float dy) {
-        MatrixTranslate.COMPANION.apply(mBuffer, dx, dy);
+        MatrixTranslate.apply(mBuffer, dx, dy);
     }
 
     /**
@@ -846,7 +880,7 @@
      * @param scaleY The amount to scale in Y
      */
     public void addMatrixScale(float scaleX, float scaleY) {
-        MatrixScale.COMPANION.apply(mBuffer, scaleX, scaleY, Float.NaN, Float.NaN);
+        MatrixScale.apply(mBuffer, scaleX, scaleY, Float.NaN, Float.NaN);
     }
 
     /**
@@ -858,7 +892,7 @@
      * @param centerY The y-coord for the pivot point (unchanged by the scale)
      */
     public void addMatrixScale(float scaleX, float scaleY, float centerX, float centerY) {
-        MatrixScale.COMPANION.apply(mBuffer, scaleX, scaleY, centerX, centerY);
+        MatrixScale.apply(mBuffer, scaleX, scaleY, centerX, centerY);
     }
 
     /**
@@ -866,47 +900,47 @@
      * @param pathId 0 clears the clip
      */
     public void addClipPath(int pathId) {
-        ClipPath.COMPANION.apply(mBuffer, pathId);
+        ClipPath.apply(mBuffer, pathId);
     }
 
     /**
-     * Sets the clip based on clip rect
-     * @param left
-     * @param top
-     * @param right
-     * @param bottom
+     * Sets the clip based on clip rec
+     * @param left    left coordinate of the clip rectangle
+     * @param top     top coordinate of the clip rectangle
+     * @param right   right coordinate of the clip rectangle
+     * @param bottom  bottom coordinate of the clip rectangle
      */
     public void addClipRect(float left, float top, float right, float bottom) {
-        ClipRect.COMPANION.apply(mBuffer, left, top, right, bottom);
+        ClipRect.apply(mBuffer, left, top, right, bottom);
     }
 
     /**
      * Add a float return a NaN number pointing to that float
-     * @param value
-     * @return
+     * @param value the value of the float
+     * @return the nan id of float
      */
     public float addFloat(float value) {
         int id = mRemoteComposeState.cacheFloat(value);
-        FloatConstant.COMPANION.apply(mBuffer, id, value);
+        FloatConstant.apply(mBuffer, id, value);
         return Utils.asNan(id);
     }
 
 
     /**
      * Add a Integer return an id number pointing to that float.
-     * @param value
-     * @return
+     * @param value adds an integer and assigns it an id
+     * @return the id of the integer to be used
      */
     public int addInteger(int value) {
         int id = mRemoteComposeState.cacheInteger(value);
-        IntegerConstant.COMPANION.apply(mBuffer, id, value);
+        IntegerConstant.apply(mBuffer, id, value);
         return id;
     }
 
     /**
      * Add a IntegerId as float ID.
      * @param id id to be converted
-     * @return
+     * @return the id wrapped in a NaN
      */
     public float asFloatId(int id) {
         return Utils.asNan(id);
@@ -918,8 +952,8 @@
      * @return NaN id of the result of the calculation
      */
     public float addAnimatedFloat(float... value) {
-        int id = mRemoteComposeState.cache(value);
-        FloatExpression.COMPANION.apply(mBuffer, id, value, null);
+        int id = mRemoteComposeState.cacheData(value);
+        FloatExpression.apply(mBuffer, id, value, null);
         return Utils.asNan(id);
     }
 
@@ -931,8 +965,80 @@
      * @return NaN id of the result of the calculation
      */
     public float addAnimatedFloat(float[] value, float[] animation) {
-        int id = mRemoteComposeState.cache(value);
-        FloatExpression.COMPANION.apply(mBuffer, id, value, animation);
+        int id = mRemoteComposeState.cacheData(value);
+        FloatExpression.apply(mBuffer, id, value, animation);
+        return Utils.asNan(id);
+    }
+
+
+    /**
+     * add a float array
+     *
+     * @param values
+     *
+     * @return the id of the array, encoded as a float NaN
+     */
+    public float addFloatArray(float[] values) {
+        int id = mRemoteComposeState.cacheData(values, NanMap.TYPE_ARRAY);
+        DataListFloat.apply(mBuffer, id, values);
+        return Utils.asNan(id);
+    }
+
+    /**
+     * This creates a list of individual floats
+     * @param values array of floats to be individually stored
+     *
+     * @return id of the list
+     */
+    public float addFloatList(float[] values) {
+        int []listId = new int[values.length];
+        for (int i = 0; i < listId.length; i++) {
+            listId[i] = mRemoteComposeState.cacheFloat(values[i]);
+            FloatConstant.apply(mBuffer,  listId[i], values[i]);
+        }
+        return addList(listId);
+    }
+
+    /**
+     * This creates a list of individual floats
+     * @param listId array id to be stored
+     *
+     * @return id of the list
+     */
+    public float addList(int[] listId) {
+        int id = mRemoteComposeState.cacheData(listId, NanMap.TYPE_ARRAY);
+        DataListIds.apply(mBuffer, id, listId);
+        return Utils.asNan(id);
+    }
+
+    /**
+     * add a float map
+     *
+     * @param keys
+     * @param values
+     *
+     * @return the id of the map, encoded as a float NaN
+     */
+    public float addFloatMap(String[]keys, float[] values) {
+        int []listId = new int[values.length];
+        for (int i = 0; i < listId.length; i++) {
+            listId[i] = mRemoteComposeState.cacheFloat(values[i]);
+            FloatConstant.apply(mBuffer,  listId[i], values[i]);
+        }
+        return addMap(keys, listId);
+    }
+
+    /**
+     * add an int map
+     *
+     * @param keys
+     * @param listId
+     *
+     * @return the id of the map, encoded as a float NaN
+     */
+    public float addMap(String []keys, int[] listId) {
+        int id = mRemoteComposeState.cacheData(listId, NanMap.TYPE_ARRAY);
+        DataMapIds.apply(mBuffer, id, keys, listId);
         return Utils.asNan(id);
     }
 
@@ -940,22 +1046,22 @@
      * Add and integer expression
      * @param mask defines which elements are operators or variables
      * @param value array of values to calculate maximum 32
-     * @return
+     * @return the id as an integer
      */
     public int addIntegerExpression(int mask, int[] value) {
-        int id = mRemoteComposeState.cache(value);
-        IntegerExpression.COMPANION.apply(mBuffer, id, mask, value);
+        int id = mRemoteComposeState.cacheData(value);
+        IntegerExpression.apply(mBuffer, id, mask, value);
         return  id;
     }
 
     /**
      * Add a simple color
-     * @param color
+     * @param color the RGB color value
      * @return id that represents that color
      */
     public int addColor(int color) {
         ColorConstant c = new ColorConstant(0, color);
-        short id = (short) mRemoteComposeState.cache(c);
+        short id = (short) mRemoteComposeState.cacheData(c);
         c.mColorId = id;
         c.write(mBuffer);
         return id;
@@ -964,14 +1070,14 @@
 
     /**
      * Add a color that represents the tween between two colors
-     * @param color1
-     * @param color2
-     * @param tween
+     * @param color1 the ARGB value of the first color
+     * @param color2 the ARGB value of the second color
+     * @param tween the interpolation bet
      * @return id of the color (color ids are short)
      */
     public short addColorExpression(int color1, int color2, float tween) {
         ColorExpression c = new ColorExpression(0, 0, color1, color2, tween);
-        short id = (short) mRemoteComposeState.cache(c);
+        short id = (short) mRemoteComposeState.cacheData(c);
         c.mId = id;
         c.write(mBuffer);
         return id;
@@ -980,14 +1086,14 @@
     /**
      * Add a color that represents the tween between two colors where color1
      * is the id of a color
-     * @param color1
-     * @param color2
-     * @param tween
+     * @param color1 id of color
+     * @param color2 rgb color value
+     * @param tween the tween between color1 and color2 (1 = color2)
      * @return id of the color (color ids are short)
      */
     public short addColorExpression(short color1, int color2, float tween) {
         ColorExpression c = new ColorExpression(0, 1, color1, color2, tween);
-        short id = (short) mRemoteComposeState.cache(c);
+        short id = (short) mRemoteComposeState.cacheData(c);
         c.mId = id;
         c.write(mBuffer);
         return id;
@@ -996,14 +1102,14 @@
     /**
      * Add a color that represents the tween between two colors where color2
      * is the id of a color
-     * @param color1
-     * @param color2
-     * @param tween
+     * @param color1 the ARGB value of the first color
+     * @param color2 id of the second color
+     * @param tween the tween between color1 and color2 (1 = color2)
      * @return id of the color (color ids are short)
      */
     public short addColorExpression(int color1, short color2, float tween) {
         ColorExpression c = new ColorExpression(0, 2, color1, color2, tween);
-        short id = (short) mRemoteComposeState.cache(c);
+        short id = (short) mRemoteComposeState.cacheData(c);
         c.mId = id;
         c.write(mBuffer);
         return id;
@@ -1012,30 +1118,30 @@
     /**
      * Add a color that represents the tween between two colors where color1 &
      * color2 are the ids of colors
-     * @param color1
-     * @param color2
-     * @param tween
+     * @param color1 id of the first color
+     * @param color2 id of the second color
+     * @param tween the tween between color1 and color2 (1 = color2)
      * @return id of the color (color ids are short)
      */
     public short addColorExpression(short color1, short color2, float tween) {
         ColorExpression c = new ColorExpression(0, 3, color1, color2, tween);
-        short id = (short) mRemoteComposeState.cache(c);
+        short id = (short) mRemoteComposeState.cacheData(c);
         c.mId = id;
         c.write(mBuffer);
         return id;
     }
 
     /**
-     *  Color calculated by Hue saturation and value.
-     *  (as floats they can be variables used to create color transitions)
-     * @param hue
-     * @param sat
-     * @param value
+     * Color calculated by Hue saturation and value.
+     * (as floats they can be variables used to create color transitions)
+     * @param hue the Hue
+     * @param sat the saturation
+     * @param value the value
      * @return id of the color (color ids are short)
      */
     public short addColorExpression(float hue, float sat, float value) {
         ColorExpression c = new ColorExpression(0, hue, sat, value);
-        short id = (short) mRemoteComposeState.cache(c);
+        short id = (short) mRemoteComposeState.cacheData(c);
         c.mId = id;
         c.write(mBuffer);
         return id;
@@ -1044,15 +1150,15 @@
     /**
      * Color calculated by Alpha, Hue saturation and value.
      * (as floats they can be variables used to create color transitions)
-     * @param alpha
-     * @param hue
-     * @param sat
-     * @param value
+     * @param alpha the Alpha
+     * @param hue the hue
+     * @param sat the saturation
+     * @param value the value
      * @return id of the color (color ids are short)
      */
     public short addColorExpression(int alpha, float hue, float sat, float value) {
         ColorExpression c = new ColorExpression(0, alpha, hue, sat, value);
-        short id = (short) mRemoteComposeState.cache(c);
+        short id = (short) mRemoteComposeState.cacheData(c);
         c.mId = id;
         c.write(mBuffer);
         return id;
@@ -1061,11 +1167,11 @@
     /**
      * create and animation based on description and return as an array of
      * floats. see addAnimatedFloat
-     * @param duration
-     * @param type
-     * @param spec
-     * @param initialValue
-     * @param wrap
+     * @param duration the duration of the aimation
+     * @param type the type of animation
+     * @param spec the parameters of the animation if any
+     * @param initialValue the initial value if it animates to a start
+     * @param wrap the wraps value so (e.g 360 so angles 355 would animate to 5)
      * @return
      */
     public static float[] packAnimation(float duration,
@@ -1083,39 +1189,49 @@
      * @param name Name of the color
      */
     public void setColorName(int id, String name) {
-        NamedVariable.COMPANION.apply(mBuffer, id,
+        NamedVariable.apply(mBuffer, id,
                 NamedVariable.COLOR_TYPE, name);
     }
 
     /**
+     * This defines the name of the string given the id
+     *
+     * @param id of the string
+     * @param name name of the string
+     */
+    public void setStringName(int id, String name) {
+        NamedVariable.apply(mBuffer, id,
+                NamedVariable.STRING_TYPE, name);
+    }
+
+    /**
+     * Returns a usable component id -- either the one passed in parameter if not -1
+     * or a generated one.
+     *
+     * @param id the current component id (if -1, we'll generate a new one)
+     *
+     * @return a usable component id
+     */
+    private int getComponentId(int id) {
+        int resolvedId = 0;
+        if (id != -1) {
+            resolvedId = id;
+        } else {
+            mGeneratedComponentId--;
+            resolvedId = mGeneratedComponentId;
+        }
+        return resolvedId;
+    }
+
+    /**
      * Add a component start tag
      * @param type type of component
      * @param id component id
      */
     public void addComponentStart(int type, int id) {
-        switch (type) {
-            case ComponentStart.ROOT_LAYOUT: {
-                RootLayoutComponent.COMPANION.apply(mBuffer);
-            } break;
-            case ComponentStart.LAYOUT_CONTENT: {
-                LayoutComponentContent.COMPANION.apply(mBuffer);
-            } break;
-            case ComponentStart.LAYOUT_BOX: {
-                BoxLayout.COMPANION.apply(mBuffer, id, -1,
-                        BoxLayout.CENTER, BoxLayout.CENTER);
-            } break;
-            case ComponentStart.LAYOUT_ROW: {
-                RowLayout.COMPANION.apply(mBuffer, id, -1,
-                        RowLayout.START, RowLayout.TOP, 0f);
-            } break;
-            case ComponentStart.LAYOUT_COLUMN: {
-                ColumnLayout.COMPANION.apply(mBuffer, id, -1,
-                        ColumnLayout.START, ColumnLayout.TOP, 0f);
-            } break;
-            default:
-                ComponentStart.Companion.apply(mBuffer,
-                        type, id, 0f, 0f);
-        }
+        mLastComponentId = getComponentId(id);
+        ComponentStart.apply(mBuffer,
+                type, mLastComponentId, 0f, 0f);
     }
 
     /**
@@ -1130,7 +1246,7 @@
      * Add a component end tag
      */
     public void addComponentEnd() {
-        ComponentEnd.Companion.apply(mBuffer);
+        ComponentEnd.apply(mBuffer);
     }
 
     /**
@@ -1143,7 +1259,7 @@
         float g = ((color >> 8) & 0xff) / 255.0f;
         float b = ((color) & 0xff) / 255.0f;
         float a = ((color >> 24) & 0xff) / 255.0f;
-        BackgroundModifierOperation.COMPANION.apply(mBuffer, 0f, 0f, 0f, 0f,
+        BackgroundModifierOperation.apply(mBuffer, 0f, 0f, 0f, 0f,
                 r, g, b, a, shape);
     }
 
@@ -1160,7 +1276,7 @@
         float g = ((color >>  8) & 0xff) / 255.0f;
         float b = ((color) & 0xff) / 255.0f;
         float a = ((color >> 24) & 0xff) / 255.0f;
-        BorderModifierOperation.COMPANION.apply(mBuffer, 0f, 0f, 0f, 0f,
+        BorderModifierOperation.apply(mBuffer, 0f, 0f, 0f, 0f,
                 borderWidth, borderRoundedCorner, r, g, b, a, shape);
     }
 
@@ -1172,10 +1288,9 @@
      * @param bottom bottom padding
      */
     public void addModifierPadding(float left, float top, float right, float bottom) {
-        PaddingModifierOperation.COMPANION.apply(mBuffer, left, top, right, bottom);
+        PaddingModifierOperation.apply(mBuffer, left, top, right, bottom);
     }
 
-
     /**
      * Sets the clip based on rounded clip rect
      * @param topStart
@@ -1185,30 +1300,138 @@
      */
     public void addRoundClipRectModifier(float topStart, float topEnd,
                                          float bottomStart, float bottomEnd) {
-        RoundedClipRectModifierOperation.COMPANION.apply(mBuffer,
+        RoundedClipRectModifierOperation.apply(mBuffer,
                 topStart, topEnd, bottomStart, bottomEnd);
     }
 
+    /**
+     * Add a clip rect modifier
+     */
     public void addClipRectModifier() {
-        ClipRectModifierOperation.COMPANION.apply(mBuffer);
+        ClipRectModifierOperation.apply(mBuffer);
     }
 
+    /**
+     * Add a box start tag
+     *
+     * @param componentId component id
+     * @param animationId animation id
+     * @param horizontal horizontal alignment
+     * @param vertical vertical alignment
+     */
     public void addBoxStart(int componentId, int animationId,
                             int horizontal, int vertical) {
-        BoxLayout.COMPANION.apply(mBuffer, componentId, animationId,
+        mLastComponentId = getComponentId(componentId);
+        BoxLayout.apply(mBuffer, mLastComponentId, animationId,
                 horizontal, vertical);
     }
 
+    /**
+     * Add a row start tag
+     *
+     * @param componentId component id
+     * @param animationId animation id
+     * @param horizontal horizontal alignment
+     * @param vertical vertical alignment
+     * @param spacedBy spacing between items
+     */
     public void addRowStart(int componentId, int animationId,
                             int horizontal, int vertical, float spacedBy) {
-        RowLayout.COMPANION.apply(mBuffer, componentId, animationId,
+        mLastComponentId = getComponentId(componentId);
+        RowLayout.apply(mBuffer, mLastComponentId, animationId,
                 horizontal, vertical, spacedBy);
     }
 
+    /**
+     * Add a column start tag
+     *
+     * @param componentId component id
+     * @param animationId animation id
+     * @param horizontal horizontal alignment
+     * @param vertical vertical alignment
+     * @param spacedBy spacing between items
+     */
     public void addColumnStart(int componentId, int animationId,
                             int horizontal, int vertical, float spacedBy) {
-        ColumnLayout.COMPANION.apply(mBuffer, componentId, animationId,
+        mLastComponentId = getComponentId(componentId);
+        ColumnLayout.apply(mBuffer, mLastComponentId, animationId,
                 horizontal, vertical, spacedBy);
     }
+
+    /**
+     * Add a canvas start tag
+     * @param componentId component id
+     * @param animationId animation id
+     */
+    public void addCanvasStart(int componentId, int animationId) {
+        mLastComponentId = getComponentId(componentId);
+        CanvasLayout.apply(mBuffer, mLastComponentId, animationId);
+    }
+
+    /**
+     * Add a canvas content start tag
+     * @param componentId component id
+     */
+    public void addCanvasContentStart(int componentId) {
+        mLastComponentId = getComponentId(componentId);
+        CanvasContent.apply(mBuffer, mLastComponentId);
+    }
+
+    /**
+     * Add a root start tag
+     */
+    public void addRootStart() {
+        mLastComponentId = getComponentId(-1);
+        RootLayoutComponent.apply(mBuffer, mLastComponentId);
+    }
+
+    /**
+     * Add a content start tag
+     */
+    public void addContentStart() {
+        mLastComponentId = getComponentId(-1);
+        LayoutComponentContent.apply(mBuffer, mLastComponentId);
+    }
+
+    /**
+     * Add a component width value
+     * @param id id of the value
+     */
+    public void addComponentWidthValue(int id) {
+        ComponentValue.apply(mBuffer, ComponentValue.WIDTH, mLastComponentId, id);
+    }
+
+    /**
+     * Add a component height value
+     *
+     * @param id id of the value
+     */
+    public void addComponentHeightValue(int id) {
+        ComponentValue.apply(mBuffer, ComponentValue.HEIGHT, mLastComponentId, id);
+    }
+
+    /**
+     * Add a text component start tag
+     *
+     * @param componentId component id
+     * @param animationId animation id
+     * @param textId id of the text
+     * @param color color of the text
+     * @param fontSize font size
+     * @param fontStyle font style (0 : Normal, 1 : Italic)
+     * @param fontWeight font weight (1 to 1000, normal is 400)
+     * @param fontFamily font family or null
+     */
+    public void addTextComponentStart(int componentId, int animationId,
+                                      int textId, int color, float fontSize,
+                                      int fontStyle, float fontWeight, String fontFamily) {
+        mLastComponentId = getComponentId(componentId);
+        int fontFamilyId = -1;
+        if (fontFamily != null) {
+            fontFamilyId = addText(fontFamily);
+        }
+        TextLayout.apply(mBuffer, mLastComponentId, animationId, textId, color, fontSize,
+                fontStyle, fontWeight, fontFamilyId);
+    }
 }
 
diff --git a/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeState.java b/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeState.java
index 6b06a54..839522e 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeState.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeState.java
@@ -20,7 +20,11 @@
 import static com.android.internal.widget.remotecompose.core.RemoteContext.ID_TIME_IN_SEC;
 import static com.android.internal.widget.remotecompose.core.RemoteContext.ID_WINDOW_HEIGHT;
 import static com.android.internal.widget.remotecompose.core.RemoteContext.ID_WINDOW_WIDTH;
+import static com.android.internal.widget.remotecompose.core.operations.utilities.NanMap.START_ARRAY;
+import static com.android.internal.widget.remotecompose.core.operations.utilities.NanMap.START_VAR;
 
+import com.android.internal.widget.remotecompose.core.operations.utilities.ArrayAccess;
+import com.android.internal.widget.remotecompose.core.operations.utilities.CollectionsAccess;
 import com.android.internal.widget.remotecompose.core.operations.utilities.IntFloatMap;
 import com.android.internal.widget.remotecompose.core.operations.utilities.IntIntMap;
 import com.android.internal.widget.remotecompose.core.operations.utilities.IntMap;
@@ -32,18 +36,28 @@
  * Represents runtime state for a RemoteCompose document
  * State includes things like the value of variables
  */
-public class RemoteComposeState {
+public class RemoteComposeState implements CollectionsAccess {
     public static final int START_ID = 42;
     private static final int MAX_FLOATS = 500;
     private static final int MAX_COLORS = 200;
+
+    private static final int MAX_DATA = 1000;
     private final IntMap<Object> mIntDataMap = new IntMap<>();
     private final IntMap<Boolean> mIntWrittenMap = new IntMap<>();
-    private final HashMap<Object, Integer> mDataIntMap = new HashMap();
+    private final HashMap<Object, Integer> mDataIntMap = new HashMap<>();
     private final IntFloatMap mFloatMap = new IntFloatMap(); // efficient cache
     private final IntIntMap mIntegerMap = new IntIntMap(); // efficient cache
     private final IntIntMap mColorMap = new IntIntMap(); // efficient cache
+
     private final boolean[] mColorOverride = new boolean[MAX_COLORS];
+    private final IntMap<ArrayAccess> mCollectionMap = new IntMap<>();
+
+    private final boolean[] mDataOverride = new boolean[MAX_DATA];
+    private final boolean[] mIntegerOverride = new boolean[MAX_DATA];
+
     private int mNextId = START_ID;
+    private int[] mIdMaps = new int[]{START_ID, START_VAR, START_ARRAY};
+    private RemoteContext mRemoteContext = null;
 
 
     /**
@@ -70,8 +84,8 @@
     /**
      * Return the id of an item from the cache.
      */
-    public int dataGetId(Object image) {
-        Integer res = mDataIntMap.get(image);
+    public int dataGetId(Object data) {
+        Integer res = mDataIntMap.get(data);
         if (res == null) {
             return -1;
         }
@@ -79,20 +93,31 @@
     }
 
     /**
-     * Add an image to the cache. Generates an id for the image and adds it to the cache based on
+     * Add an item to the cache. Generates an id for the item and adds it to the cache based on
      * that id.
      */
-    public int cache(Object image) {
+    public int cacheData(Object item) {
         int id = nextId();
-        mDataIntMap.put(image, id);
-        mIntDataMap.put(id, image);
+        mDataIntMap.put(item, id);
+        mIntDataMap.put(id, item);
+        return id;
+    }
+
+    /**
+     * Add an item to the cache. Generates an id for the item and adds it to the cache based on
+     * that id.
+     */
+    public int cacheData(Object item, int type) {
+        int id = nextId(type);
+        mDataIntMap.put(item, id);
+        mIntDataMap.put(id, item);
         return id;
     }
 
     /**
      * Insert an item in the cache
      */
-    public void cache(int id, Object item) {
+    public void cacheData(int id, Object item) {
         mDataIntMap.put(item, id);
         mIntDataMap.put(id, item);
     }
@@ -100,10 +125,27 @@
     /**
      * Insert an item in the cache
      */
-    public void update(int id, Object item) {
+    public void updateData(int id, Object item) {
+        if (!mDataOverride[id]) {
+            mDataIntMap.remove(mIntDataMap.get(id));
+            mDataIntMap.put(item, id);
+            mIntDataMap.put(id, item);
+            updateListeners(id);
+        }
+    }
+
+    /**
+     * Adds a data Override.
+     *
+     * @param id
+     * @param item the new value
+     */
+    public void overrideData(int id, Object item) {
         mDataIntMap.remove(mIntDataMap.get(id));
         mDataIntMap.put(item, id);
         mIntDataMap.put(id, item);
+        mDataOverride[id] = true;
+        updateListeners(id);
     }
 
     /**
@@ -119,16 +161,6 @@
     /**
      * Insert an item in the cache
      */
-    public int cacheInteger(int item) {
-        int id = nextId();
-        mIntegerMap.put(id, item);
-        mFloatMap.put(id, item);
-        return id;
-    }
-
-    /**
-     * Insert an item in the cache
-     */
     public void cacheFloat(int id, float item) {
         mFloatMap.put(id, item);
     }
@@ -139,14 +171,41 @@
     public void updateFloat(int id, float item) {
         mFloatMap.put(id, item);
         mIntegerMap.put(id, (int) item);
+        updateListeners(id);
+    }
+
+    /**
+     * Insert an item in the cache
+     */
+    public int cacheInteger(int item) {
+        int id = nextId();
+        mIntegerMap.put(id, item);
+        mFloatMap.put(id, item);
+        return id;
     }
 
     /**
      * Insert an integer item in the cache
      */
     public void updateInteger(int id, int item) {
-        mFloatMap.put(id, item);
-        mIntegerMap.put(id, item);
+        if (!mIntegerOverride[id]) {
+            mFloatMap.put(id, item);
+            mIntegerMap.put(id, item);
+            updateListeners(id);
+        }
+    }
+
+    /**
+     * Adds a integer Override.
+     *
+     * @param id
+     * @param value the new value
+     */
+    public void overrideInteger(int id, int value) {
+        mIntegerMap.put(id, value);
+        mFloatMap.put(id, value);
+        mIntegerOverride[id] = true;
+        updateListeners(id);
     }
 
     /**
@@ -190,11 +249,21 @@
             return;
         }
         mColorMap.put(id, color);
+        updateListeners(id);
+    }
+
+    private void updateListeners(int id) {
+        ArrayList<VariableSupport> v = mVarListeners.get(id);
+        if (v != null && mRemoteContext != null) {
+            for (VariableSupport c : v) {
+                c.updateVariables(mRemoteContext);
+            }
+        }
     }
 
     /**
      * Adds a colorOverride.
-     * This is a list of ids and there colors optimized for playback;
+     * This is a list of ids and their colors optimized for playback;
      *
      * @param id
      * @param color
@@ -214,6 +283,26 @@
     }
 
     /**
+     * Clear the data override
+     *
+     * @param id the data id to clear
+     */
+    public void clearDataOverride(int id) {
+        mDataOverride[id] = false;
+        updateListeners(id);
+    }
+
+    /**
+     * Clear the integer override
+     *
+     * @param id the integer id to clear
+     */
+    public void clearIntegerOverride(int id) {
+        mIntegerOverride[id] = false;
+        updateListeners(id);
+    }
+
+    /**
      * Method to determine if a cached value has been written to the documents WireBuffer based on
      * its id.
      */
@@ -231,8 +320,9 @@
     /**
      * Clear the record of the values that have been written to the WireBuffer.
      */
-    void reset() {
+    public void reset() {
         mIntWrittenMap.clear();
+        mDataIntMap.clear();
     }
 
     /**
@@ -245,6 +335,18 @@
     }
 
     /**
+     * Get the next available id
+     *
+     * @return
+     */
+    public int nextId(int type) {
+        if (0 == type) {
+            return mNextId++;
+        }
+        return mIdMaps[type]++;
+    }
+
+    /**
      * Set the next id
      *
      * @param id
@@ -316,4 +418,25 @@
         updateFloat(ID_WINDOW_HEIGHT, height);
     }
 
+    public void addCollection(int id, ArrayAccess collection) {
+        mCollectionMap.put(id & 0xFFFFF, collection);
+    }
+
+    @Override
+    public float getFloatValue(int id, int index) {
+        return mCollectionMap.get(id & 0xFFFFF).getFloatValue(index);
+    }
+    @Override
+    public float[] getFloats(int id) {
+        return mCollectionMap.get(id & 0xFFFFF).getFloats();
+    }
+
+    @Override
+    public int getFloatsLength(int id) {
+        return mCollectionMap.get(id & 0xFFFFF).getFloatsLength();
+    }
+
+    public void setContext(RemoteContext context) {
+        mRemoteContext = context;
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/RemoteContext.java b/core/java/com/android/internal/widget/remotecompose/core/RemoteContext.java
index 893dcce..0df0aa0 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/RemoteContext.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/RemoteContext.java
@@ -20,6 +20,13 @@
 import com.android.internal.widget.remotecompose.core.operations.Theme;
 import com.android.internal.widget.remotecompose.core.operations.Utils;
 import com.android.internal.widget.remotecompose.core.operations.layout.Component;
+import com.android.internal.widget.remotecompose.core.operations.utilities.ArrayAccess;
+import com.android.internal.widget.remotecompose.core.operations.utilities.CollectionsAccess;
+
+import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
 
 /**
  * Specify an abstract context used to playback RemoteCompose documents
@@ -57,8 +64,18 @@
     }
 
     /**
+     * Provide access to the table of collections
+     *
+     * @return the CollectionsAccess implementation
+     */
+    public CollectionsAccess getCollectionsAccess() {
+        return mRemoteComposeState;
+    }
+
+    /**
      * Load a path under an id.
      * Paths can be use in clip drawPath and drawTweenPath
+     *
      * @param instanceId
      * @param floatPath
      */
@@ -67,22 +84,24 @@
     /**
      * Associate a name with a give id.
      *
-     * @param varName
-     * @param varId
-     * @param varType
+     * @param varName the name
+     * @param varId   the id (color,integer,float etc.)
+     * @param varType thetype
      */
     public abstract void loadVariableName(String varName, int varId, int varType);
 
     /**
      * Save a color under a given id
-     * @param id
-     * @param color
+     *
+     * @param id    the id of the color
+     * @param color the color to set
      */
     public abstract void loadColor(int id, int color);
 
     /**
      * Set the animation time allowing the creator to control animation rates
-     * @param time
+     *
+     * @param time the animation time in seconds
      */
     public void setAnimationTime(float time) {
         mAnimationTime = time;
@@ -90,6 +109,7 @@
 
     /**
      * gets the time animation clock as float in seconds
+     *
      * @return a monotonic time in seconds (arbitrary zero point)
      */
     public float getAnimationTime() {
@@ -100,11 +120,60 @@
     /**
      * Set the value of a named Color.
      * This overrides the color in the document
-     * @param colorName
-     * @param color
+     *
+     * @param colorName the name of the color to override
+     * @param color     Override the default color
      */
     public abstract void setNamedColorOverride(String colorName, int color);
 
+    /**
+     * Set the value of a named String.
+     * This overrides the string in the document
+     * @param stringName the name of the string to override
+     * @param value Override the default string
+     */
+    public abstract void setNamedStringOverride(String stringName, String value);
+
+
+    /**
+     * Allows to clear a named String.
+     *
+     * If an override exists, we revert back to the default value in the document.
+     *
+     * @param stringName the name of the string to override
+     */
+    public abstract void clearNamedStringOverride(String stringName);
+
+    /**
+     * Set the value of a named Integer.
+     * This overrides the integer in the document
+     * @param integerName the name of the integer to override
+     * @param value Override the default integer
+     */
+    public abstract void setNamedIntegerOverride(String integerName, int value);
+
+    /**
+     * Allows to clear a named Integer.
+     *
+     * If an override exists, we revert back to the default value in the document.
+     *
+     * @param integerName the name of the integer to override
+     */
+    public abstract void clearNamedIntegerOverride(String integerName);
+
+
+    /**
+     * Support Collections by registering this collection
+     *
+     * @param id         id of the collection
+     * @param collection the collection under this id
+     */
+    public abstract void addCollection(int id, ArrayAccess collection);
+
+    public abstract void runAction(int id, String metadata);
+
+    public abstract void runNamedAction(int textId);
+
 
     /**
      * The context can be used in a few different mode, allowing operations to skip being executed:
@@ -112,7 +181,7 @@
      * - DATA : only operations dealing with DATA (eg loading a bitmap) should execute
      * - PAINT : only operations painting should execute
      */
-    public enum  ContextMode {
+    public enum ContextMode {
         UNSET, DATA, PAINT
     }
 
@@ -174,21 +243,21 @@
     /**
      * Sets the way the player handles the content
      *
-     * @param scroll set the horizontal behavior (NONE|SCROLL_HORIZONTAL|SCROLL_VERTICAL)
+     * @param scroll    set the horizontal behavior (NONE|SCROLL_HORIZONTAL|SCROLL_VERTICAL)
      * @param alignment set the alignment of the content (TOP|CENTER|BOTTOM|START|END)
-     * @param sizing set the type of sizing for the content (NONE|SIZING_LAYOUT|SIZING_SCALE)
-     * @param mode set the mode of sizing, either LAYOUT modes or SCALE modes
-     *             the LAYOUT modes are:
-     *             - LAYOUT_MATCH_PARENT
-     *             - LAYOUT_WRAP_CONTENT
-     *             or adding an horizontal mode and a vertical mode:
-     *             - LAYOUT_HORIZONTAL_MATCH_PARENT
-     *             - LAYOUT_HORIZONTAL_WRAP_CONTENT
-     *             - LAYOUT_HORIZONTAL_FIXED
-     *             - LAYOUT_VERTICAL_MATCH_PARENT
-     *             - LAYOUT_VERTICAL_WRAP_CONTENT
-     *             - LAYOUT_VERTICAL_FIXED
-     *             The LAYOUT_*_FIXED modes will use the intrinsic document size
+     * @param sizing    set the type of sizing for the content (NONE|SIZING_LAYOUT|SIZING_SCALE)
+     * @param mode      set the mode of sizing, either LAYOUT modes or SCALE modes
+     *                  the LAYOUT modes are:
+     *                  - LAYOUT_MATCH_PARENT
+     *                  - LAYOUT_WRAP_CONTENT
+     *                  or adding an horizontal mode and a vertical mode:
+     *                  - LAYOUT_HORIZONTAL_MATCH_PARENT
+     *                  - LAYOUT_HORIZONTAL_WRAP_CONTENT
+     *                  - LAYOUT_HORIZONTAL_FIXED
+     *                  - LAYOUT_VERTICAL_MATCH_PARENT
+     *                  - LAYOUT_VERTICAL_WRAP_CONTENT
+     *                  - LAYOUT_VERTICAL_FIXED
+     *                  The LAYOUT_*_FIXED modes will use the intrinsic document size
      */
     public void setRootContentBehavior(int scroll, int alignment, int sizing, int mode) {
         mDocument.setRootContentBehavior(scroll, alignment, sizing, mode);
@@ -196,6 +265,7 @@
 
     /**
      * Set a content description for the document
+     *
      * @param contentDescriptionId the text id pointing at the description
      */
     public void setDocumentContentDescription(int contentDescriptionId) {
@@ -209,94 +279,112 @@
 
     /**
      * Save a bitmap under an imageId
-     * @param imageId
-     * @param width
-     * @param height
-     * @param bitmap
+     *
+     * @param imageId the id of the image
+     * @param width   the width of the image
+     * @param height  the height of the image
+     * @param bitmap  the bytes that represent the image
      */
     public abstract void loadBitmap(int imageId, int width, int height, byte[] bitmap);
 
     /**
      * Save a string under a given id
-     * @param id
-     * @param text
+     *
+     * @param id   the id of the string
+     * @param text the value to set
      */
     public abstract void loadText(int id, String text);
 
     /**
      * Get a string given an id
-     * @param id
+     *
+     * @param id the id of the string
      * @return
      */
     public abstract String getText(int id);
 
     /**
      * Load a float
-     * @param id
-     * @param value
+     *
+     * @param id    id of the float
+     * @param value the value to set
      */
     public abstract void loadFloat(int id, float value);
 
     /**
-     * Load a float
-     * @param id
-     * @param value
+     * Load a integer
+     *
+     * @param id    id of the integer
+     * @param value the value to set
      */
     public abstract void loadInteger(int id, int value);
 
+
+    public abstract void overrideInteger(int id, int value);
+
+    public abstract void overrideText(int id, int valueId);
+
     /**
      * Load an animated float associated with an id
      * Todo: Remove?
-     * @param id
-     * @param animatedFloat
+     *
+     * @param id            the id of the float
+     * @param animatedFloat The animated float
      */
     public abstract void loadAnimatedFloat(int id, FloatExpression animatedFloat);
 
     /**
      * Save a shader under and ID
-     * @param id
-     * @param value
+     *
+     * @param id    the id of the Shader
+     * @param value the shader
      */
     public abstract void loadShader(int id, ShaderData value);
 
     /**
      * Get a float given an id
-     * @param id
-     * @return
+     *
+     * @param id the id of the float
+     * @return the value of the float
      */
     public abstract float getFloat(int id);
 
     /**
-     * Get a float given an id
-     * @param id
-     * @return
+     * Get a Integer given an id
+     *
+     * @param id of the integer
+     * @return the value
      */
     public abstract int getInteger(int id);
 
     /**
      * Get the color given and ID
-     * @param id
-     * @return
+     *
+     * @param id of the color
+     * @return the color
      */
     public abstract int getColor(int id);
 
     /**
      * called to notify system that a command is interested in a variable
-     * @param id
-     * @param variableSupport
+     *
+     * @param id              track when this id changes value
+     * @param variableSupport call back when value changes
      */
     public abstract void listensTo(int id, VariableSupport variableSupport);
 
     /**
      * Notify commands with variables have changed
-     * @return
+     *
+     * @return the number of ms to next update
      */
     public abstract int updateOps();
 
     /**
      * Get a shader given the id
-     * @param id
-     * @return
+     *
+     * @param id get a shader given the id
+     * @return The shader
      */
     public abstract ShaderData getShader(int id);
 
@@ -352,6 +440,55 @@
     ///////////////////////////////////////////////////////////////////////////////////////////////
     // Click handling
     ///////////////////////////////////////////////////////////////////////////////////////////////
+    public static boolean isTime(float fl) {
+        int value = Utils.idFromNan(fl);
+        return value >= ID_CONTINUOUS_SEC && value <= ID_DAY_OF_MONTH;
+    }
+
+    public static float getTime(float fl) {
+        LocalDateTime dateTime = LocalDateTime.now();
+        // This define the time in the format
+        // seconds run from Midnight=0 quantized to seconds hour 0..3599
+        // minutes run from Midnight=0 quantized to minutes 0..1439
+        // hours run from Midnight=0 quantized to Hours 0-23
+        // CONTINUOUS_SEC is seconds from midnight looping every hour 0-3600
+        // CONTINUOUS_SEC is accurate to milliseconds due to float precession
+        // ID_OFFSET_TO_UTC is the offset from UTC in sec (typically / 3600f)
+        int value = Utils.idFromNan(fl);
+        int month = dateTime.getMonth().getValue();
+        int hour = dateTime.getHour();
+        int minute = dateTime.getMinute();
+        int seconds = dateTime.getSecond();
+        int currentMinute = hour * 60 + minute;
+        int currentSeconds = minute * 60 + seconds;
+        float sec = currentSeconds + dateTime.getNano() * 1E-9f;
+        int day_week = dateTime.getDayOfWeek().getValue();
+
+
+        ZoneId zone = ZoneId.systemDefault();
+        OffsetDateTime offsetDateTime = dateTime.atZone(zone).toOffsetDateTime();
+        ZoneOffset offset = offsetDateTime.getOffset();
+        switch (value) {
+            case ID_OFFSET_TO_UTC:
+                return offset.getTotalSeconds();
+            case ID_CONTINUOUS_SEC:
+                return sec;
+            case ID_TIME_IN_SEC:
+                return currentSeconds;
+            case ID_TIME_IN_MIN:
+                return currentMinute;
+            case ID_TIME_IN_HR:
+                return hour;
+            case ID_CALENDAR_MONTH:
+            case ID_DAY_OF_MONTH:
+                return month;
+            case ID_WEEK_DAY:
+                return day_week;
+        }
+        return fl;
+    }
+
+
 
     public abstract void addClickArea(
             int id,
diff --git a/core/java/com/android/internal/widget/remotecompose/core/SerializableToString.java b/core/java/com/android/internal/widget/remotecompose/core/SerializableToString.java
new file mode 100644
index 0000000..8f9741d
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/SerializableToString.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core;
+
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
+
+public interface SerializableToString {
+    void serializeToString(int indent, StringSerializer serializer);
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/VariableSupport.java b/core/java/com/android/internal/widget/remotecompose/core/VariableSupport.java
index d59b1bc..ee6d579 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/VariableSupport.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/VariableSupport.java
@@ -17,7 +17,7 @@
 
 /**
  * Interface for operators that interact with variables
- * Threw this they register to listen to particular variables
+ * Through this they register to listen to particular variables
  * and are notified when they change
  */
 public interface VariableSupport {
diff --git a/core/java/com/android/internal/widget/remotecompose/core/documentation/DocumentedCompanionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/documentation/DocumentedCompanionOperation.java
index 6a98b78..4b84291 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/documentation/DocumentedCompanionOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/documentation/DocumentedCompanionOperation.java
@@ -15,8 +15,6 @@
  */
 package com.android.internal.widget.remotecompose.core.documentation;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
-
-public interface DocumentedCompanionOperation extends CompanionOperation {
+public interface DocumentedCompanionOperation {
     void documentation(DocumentationBuilder doc);
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/documentation/Operation.java b/core/java/com/android/internal/widget/remotecompose/core/documentation/Operation.java
index 643b925..9ccb2be 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/documentation/Operation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/documentation/Operation.java
@@ -27,6 +27,10 @@
     public static final int BYTE = 6;
     public static final int VALUE = 7;
     public static final int LONG = 8;
+    public static final int SHORT = 9;
+
+    public static final int FLOAT_ARRAY = 10;
+    public static final int INT_ARRAY = 11;
 
     String mCategory;
     int mId;
@@ -38,7 +42,7 @@
 
     ArrayList<StringPair> mExamples = new ArrayList<>();
     ArrayList<OperationField> mFields = new ArrayList<>();
-
+    String mVarSize = "";
     int mExamplesWidth = 100;
     int mExamplesHeight = 100;
 
@@ -53,6 +57,9 @@
             case (BYTE): return "BYTE";
             case (VALUE): return "VALUE";
             case (LONG): return "LONG";
+            case (SHORT): return "SHORT";
+            case (FLOAT_ARRAY): return "FLOAT[]";
+            case (INT_ARRAY): return "INT[]";
         }
         return "UNKNOWN";
     }
@@ -88,10 +95,18 @@
         return mWIP;
     }
 
+    public String getVarSize() {
+        return mVarSize;
+    }
+
     public int getSizeFields() {
         int size = 0;
+        mVarSize = "";
         for (OperationField field : mFields) {
-            size += field.getSize();
+            size += Math.max(0, field.getSize());
+            if (field.getSize() < 0) {
+                mVarSize += " + " + field.getVarSize() + " x 4";
+            }
         }
         return size;
     }
@@ -121,6 +136,11 @@
         return this;
     }
 
+    public Operation field(int type, String name, String varSize, String description) {
+        mFields.add(new OperationField(type, name, varSize, description));
+        return this;
+    }
+
     public Operation possibleValues(String name, int value) {
         if (!mFields.isEmpty()) {
             mFields.get(mFields.size() - 1).possibleValue(name, "" + value);
diff --git a/core/java/com/android/internal/widget/remotecompose/core/documentation/OperationField.java b/core/java/com/android/internal/widget/remotecompose/core/documentation/OperationField.java
index fc73f4ed6..0dd3039 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/documentation/OperationField.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/documentation/OperationField.java
@@ -21,6 +21,8 @@
     int mType;
     String mName;
     String mDescription;
+    String mVarSize = null;
+
     ArrayList<StringPair> mPossibleValues = new ArrayList<>();
 
     public OperationField(int type, String name, String description) {
@@ -28,6 +30,14 @@
         mName = name;
         mDescription = description;
     }
+
+    public OperationField(int type, String name, String varSize, String description) {
+        mType = type;
+        mName = name;
+        mDescription = description;
+        mVarSize = varSize;
+    }
+
     public int getType() {
         return mType;
     }
@@ -40,18 +50,28 @@
     public ArrayList<StringPair> getPossibleValues() {
         return mPossibleValues;
     }
+
+
     public void possibleValue(String name, String value) {
         mPossibleValues.add(new StringPair(name, value));
     }
     public boolean hasEnumeratedValues() {
         return !mPossibleValues.isEmpty();
     }
+
+    public String getVarSize() {
+        return mVarSize;
+    }
+
     public int getSize() {
         switch (mType) {
             case (Operation.BYTE) : return 1;
             case (Operation.INT) : return 4;
             case (Operation.FLOAT) : return 4;
             case (Operation.LONG) : return 8;
+            case (Operation.SHORT) : return 2;
+            case (Operation.INT_ARRAY): return -1;
+            case (Operation.FLOAT_ARRAY): return -1;
             default : return 0;
         }
     }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/BitmapData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/BitmapData.java
index f186322..58be641 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/BitmapData.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/BitmapData.java
@@ -15,11 +15,16 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT_ARRAY;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.SerializableToString;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
 
 import java.util.List;
 
@@ -28,15 +33,15 @@
  * On getting an Image during a draw call the bitmap is compressed and saved
  * in playback the image is decompressed
  */
-public class BitmapData implements Operation {
+public class BitmapData implements Operation, SerializableToString {
+    private static final int OP_CODE = Operations.DATA_BITMAP;
+    private static final String CLASS_NAME = "BitmapData";
     int mImageId;
     int mImageWidth;
     int mImageHeight;
     byte[] mBitmap;
     public static final int MAX_IMAGE_DIMENSION = 8000;
 
-    public static final Companion COMPANION = new Companion();
-
     public BitmapData(int imageId, int width, int height, byte[] bitmap) {
         this.mImageId = imageId;
         this.mImageWidth = width;
@@ -44,9 +49,17 @@
         this.mBitmap = bitmap;
     }
 
+    public int getWidth() {
+        return mImageWidth;
+    }
+
+    public int getHeight() {
+        return mImageHeight;
+    }
+
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mImageId, mImageWidth, mImageHeight, mBitmap);
+        apply(buffer, mImageId, mImageWidth, mImageHeight, mBitmap);
     }
 
     @Override
@@ -54,42 +67,51 @@
         return "BITMAP DATA " + mImageId;
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
 
-        @Override
-        public String name() {
-            return "BitmapData";
-        }
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public int id() {
-            return Operations.DATA_BITMAP;
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        public void apply(WireBuffer buffer, int imageId, int width, int height, byte[] bitmap) {
-            buffer.start(Operations.DATA_BITMAP);
-            buffer.writeInt(imageId);
-            buffer.writeInt(width);
-            buffer.writeInt(height);
-            buffer.writeBuffer(bitmap);
-        }
+    public static void apply(WireBuffer buffer, int imageId, int width, int height, byte[] bitmap) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(imageId);
+        buffer.writeInt(width);
+        buffer.writeInt(height);
+        buffer.writeBuffer(bitmap);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int imageId = buffer.readInt();
-            int width = buffer.readInt();
-            int height = buffer.readInt();
-            if (width < 1
-                    || height < 1
-                    || height > MAX_IMAGE_DIMENSION
-                    || width > MAX_IMAGE_DIMENSION) {
-                throw new RuntimeException("Dimension of image is invalid " + width + "x" + height);
-            }
-            byte[] bitmap = buffer.readBuffer();
-            operations.add(new BitmapData(imageId, width, height, bitmap));
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int imageId = buffer.readInt();
+        int width = buffer.readInt();
+        int height = buffer.readInt();
+        if (width < 1
+                || height < 1
+                || height > MAX_IMAGE_DIMENSION
+                || width > MAX_IMAGE_DIMENSION) {
+            throw new RuntimeException("Dimension of image is invalid " + width + "x" + height);
         }
+        byte[] bitmap = buffer.readBuffer();
+        operations.add(new BitmapData(imageId, width, height, bitmap));
+    }
+
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Data Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Bitmap data")
+                .field(INT, "id", "id of bitmap data")
+                .field(INT, "width",
+                        "width of the image")
+                .field(INT, "height",
+                        "height of the image")
+                .field(INT_ARRAY, "values", "length",
+                        "Array of ints");
     }
 
     @Override
@@ -102,4 +124,9 @@
         return indent + toString();
     }
 
+    public void serializeToString(int indent, StringSerializer serializer) {
+        serializer.append(indent, CLASS_NAME
+                + " id " + mImageId + " (" + mImageWidth + "x" + mImageHeight + ")");
+    }
+
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ClickArea.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ClickArea.java
index a3cd197..e72e24a 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/ClickArea.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ClickArea.java
@@ -15,12 +15,14 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteComposeOperation;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
@@ -28,6 +30,8 @@
  * Add a click area to the document
  */
 public class ClickArea implements RemoteComposeOperation {
+    private static final int OP_CODE = Operations.CLICK_AREA;
+    private static final String CLASS_NAME = "ClickArea";
     int mId;
     int mContentDescription;
     float mLeft;
@@ -36,18 +40,16 @@
     float mBottom;
     int mMetadata;
 
-    public static final Companion COMPANION = new Companion();
-
     /**
      * Add a click area to the document
      *
-     * @param id       the id of the click area, which will be reported in the listener
-     *                 callback on the player
+     * @param id the id of the click area, which will be reported in the listener
+     *                           callback on the player
      * @param contentDescription the content description (used for accessibility, as a textID)
-     * @param left     left coordinate of the area bounds
-     * @param top      top coordinate of the area bounds
-     * @param right    right coordinate of the area bounds
-     * @param bottom   bottom coordinate of the area bounds
+     * @param left left coordinate of the area bounds
+     * @param top top coordinate of the area bounds
+     * @param right right coordinate of the area bounds
+     * @param bottom bottom coordinate of the area bounds
      * @param metadata associated metadata, user-provided (as a textID, pointing to a string)
      */
     public ClickArea(int id, int contentDescription,
@@ -65,7 +67,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mId, mContentDescription, mLeft, mTop, mRight, mBottom, mMetadata);
+        apply(buffer, mId, mContentDescription, mLeft, mTop, mRight, mBottom, mMetadata);
     }
 
     @Override
@@ -89,44 +91,57 @@
         return indent + toString();
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {}
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public String name() {
-            return "ClickArea";
-        }
 
-        @Override
-        public int id() {
-            return Operations.CLICK_AREA;
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        public void apply(WireBuffer buffer, int id, int contentDescription,
-                   float left, float top, float right, float bottom,
-                   int metadata) {
-            buffer.start(Operations.CLICK_AREA);
-            buffer.writeInt(id);
-            buffer.writeInt(contentDescription);
-            buffer.writeFloat(left);
-            buffer.writeFloat(top);
-            buffer.writeFloat(right);
-            buffer.writeFloat(bottom);
-            buffer.writeInt(metadata);
-        }
+    public static void apply(WireBuffer buffer, int id, int contentDescription,
+                             float left, float top, float right, float bottom,
+                             int metadata) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(id);
+        buffer.writeInt(contentDescription);
+        buffer.writeFloat(left);
+        buffer.writeFloat(top);
+        buffer.writeFloat(right);
+        buffer.writeFloat(bottom);
+        buffer.writeInt(metadata);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int id = buffer.readInt();
-            int contentDescription = buffer.readInt();
-            float left = buffer.readFloat();
-            float top = buffer.readFloat();
-            float right = buffer.readFloat();
-            float bottom = buffer.readFloat();
-            int metadata = buffer.readInt();
-            ClickArea clickArea = new ClickArea(id, contentDescription,
-                    left, top, right, bottom, metadata);
-            operations.add(clickArea);
-        }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int id = buffer.readInt();
+        int contentDescription = buffer.readInt();
+        float left = buffer.readFloat();
+        float top = buffer.readFloat();
+        float right = buffer.readFloat();
+        float bottom = buffer.readFloat();
+        int metadata = buffer.readInt();
+        ClickArea clickArea = new ClickArea(id, contentDescription,
+                left, top, right, bottom, metadata);
+        operations.add(clickArea);
+    }
+
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Define a region you can click on")
+                .field(FLOAT, "left",
+                        "The left side of the region")
+                .field(FLOAT, "top",
+                        "The top of the region")
+                .field(FLOAT, "right",
+                        "The right side of the region")
+                .field(FLOAT, "bottom",
+                        "The bottom of the region")
+                .field(FLOAT, "metadata",
+                        "user defined string accessible in callback");
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ClipPath.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ClipPath.java
index e6d5fe7..d77d53c 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/ClipPath.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ClipPath.java
@@ -15,12 +15,14 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
@@ -30,7 +32,8 @@
  * TODO allow id 0 to mean null?
  */
 public class ClipPath extends PaintOperation {
-    public static final Companion COMPANION = new Companion();
+    private static final int OP_CODE = Operations.CLIP_PATH;
+    private static final String CLASS_NAME = "ClipPath";
     int mId;
     int mRegionOp;
 
@@ -39,17 +42,25 @@
         mRegionOp = regionOp;
     }
 
-    public static final int REPLACE = Companion.PATH_CLIP_REPLACE;
-    public static final int DIFFERENCE = Companion.PATH_CLIP_DIFFERENCE;
-    public static final int INTERSECT = Companion.PATH_CLIP_INTERSECT;
-    public static final int UNION = Companion.PATH_CLIP_UNION;
-    public static final int XOR = Companion.PATH_CLIP_XOR;
-    public static final int REVERSE_DIFFERENCE = Companion.PATH_CLIP_REVERSE_DIFFERENCE;
-    public static final int UNDEFINED = Companion.PATH_CLIP_UNDEFINED;
+    public static final int PATH_CLIP_REPLACE = 0;
+    public static final int PATH_CLIP_DIFFERENCE = 1;
+    public static final int PATH_CLIP_INTERSECT = 2;
+    public static final int PATH_CLIP_UNION = 3;
+    public static final int PATH_CLIP_XOR = 4;
+    public static final int PATH_CLIP_REVERSE_DIFFERENCE = 5;
+    public static final int PATH_CLIP_UNDEFINED = 6;
+
+    public static final int REPLACE = PATH_CLIP_REPLACE;
+    public static final int DIFFERENCE = PATH_CLIP_DIFFERENCE;
+    public static final int INTERSECT = PATH_CLIP_INTERSECT;
+    public static final int UNION = PATH_CLIP_UNION;
+    public static final int XOR = PATH_CLIP_XOR;
+    public static final int REVERSE_DIFFERENCE = PATH_CLIP_REVERSE_DIFFERENCE;
+    public static final int UNDEFINED = PATH_CLIP_UNDEFINED;
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mId);
+        apply(buffer, mId);
     }
 
     @Override
@@ -57,43 +68,40 @@
         return "ClipPath " + mId + ";";
     }
 
-    public static class Companion implements CompanionOperation {
-        public static final int PATH_CLIP_REPLACE = 0;
-        public static final int PATH_CLIP_DIFFERENCE = 1;
-        public static final int PATH_CLIP_INTERSECT = 2;
-        public static final int PATH_CLIP_UNION = 3;
-        public static final int PATH_CLIP_XOR = 4;
-        public static final int PATH_CLIP_REVERSE_DIFFERENCE = 5;
-        public static final int PATH_CLIP_UNDEFINED = 6;
 
-        private Companion() {
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int pack = buffer.readInt();
-            int id = pack & 0xFFFFF;
-            int regionOp = pack >> 24;
-            ClipPath op = new ClipPath(id, regionOp);
-            operations.add(op);
-        }
-
-        @Override
-        public String name() {
-            return "ClipPath";
-        }
-
-        @Override
-        public int id() {
-            return Operations.CLIP_PATH;
-        }
-
-        public void apply(WireBuffer buffer, int id) {
-            buffer.start(Operations.CLIP_PATH);
-            buffer.writeInt(id);
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int pack = buffer.readInt();
+        int id = pack & 0xFFFFF;
+        int regionOp = pack >> 24;
+        ClipPath op = new ClipPath(id, regionOp);
+        operations.add(op);
     }
 
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static void apply(WireBuffer buffer, int id) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(id);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Intersect the current clip with the path")
+                .field(INT, "id",
+                        "id of the path");
+    }
+
+
     @Override
     public void paint(PaintContext context) {
         context.clipPath(mId, mRegionOp);
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ClipRect.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ClipRect.java
index 613eceb..ec9b6fe 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/ClipRect.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ClipRect.java
@@ -15,24 +15,61 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
 
 /**
  * Support clip with a rectangle
  */
 public class ClipRect extends DrawBase4 {
-    public static final Companion COMPANION =
-            new Companion(Operations.CLIP_RECT) {
-                @Override
-                public Operation construct(float x1,
-                                           float y1,
-                                           float x2,
-                                           float y2) {
-                    return new ClipRect(x1, y1, x2, y2);
-                }
-            };
+    public static final int OP_CODE = Operations.CLIP_RECT;
+    public static final String CLASS_NAME = "ClipRect";
+
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Maker m = ClipRect::new;
+        read(m, buffer, operations);
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+
+    protected void write(WireBuffer buffer,
+                         float v1,
+                         float v2,
+                         float v3,
+                         float v4) {
+        apply(buffer, v1, v2, v3, v4);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Expressions Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Intersect the current clip with rectangle")
+                .field(FLOAT, "left",
+                        "The left side of the rectangle to intersect with the current clip")
+                .field(FLOAT, "top",
+                        "The top of the rectangle to intersect with the current clip")
+                .field(FLOAT, "right",
+                        "The right side of the rectangle to intersect with the current clip")
+                .field(FLOAT, "bottom",
+                        "The bottom of the rectangle to intersect with the current clip");
+    }
+
 
     public ClipRect(
             float left,
@@ -40,11 +77,28 @@
             float right,
             float bottom) {
         super(left, top, right, bottom);
-        mName = "ClipRect";
+        mName = CLASS_NAME;
     }
 
     @Override
     public void paint(PaintContext context) {
         context.clipRect(mX1, mY1, mX2, mY2);
     }
+
+    /**
+     * Writes out the clipRect to the buffer
+     *
+     * @param buffer buffer to write to
+     * @param x1     start x of DrawOval
+     * @param y1     start y of the DrawOval
+     * @param x2     end x of the DrawOval
+     * @param y2     end y of the DrawOval
+     */
+    public static void apply(WireBuffer buffer,
+                             float x1,
+                             float y1,
+                             float x2,
+                             float y2) {
+        write(buffer, OP_CODE, x1, y1, x2, y2);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ColorConstant.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ColorConstant.java
index 15c208f..2562e18 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/ColorConstant.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ColorConstant.java
@@ -15,11 +15,13 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
@@ -28,9 +30,10 @@
  * Mainly for colors in theming.
  */
 public class ColorConstant implements Operation {
+    private static final int OP_CODE = Operations.COLOR_CONSTANT;
+    private static final String CLASS_NAME = "ColorConstant";
     public int mColorId;
     public int mColor;
-    public static final Companion COMPANION = new Companion();
 
     public ColorConstant(int colorId, int color) {
         this.mColorId = colorId;
@@ -39,7 +42,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mColorId, mColor);
+        apply(buffer, mColorId, mColor);
     }
 
     @Override
@@ -47,39 +50,42 @@
         return "ColorConstant[" + mColorId + "] = " + Utils.colorInt(mColor) + "";
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public String name() {
-            return "ColorConstant";
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        @Override
-        public int id() {
-            return Operations.COLOR_CONSTANT;
-        }
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer
+     * @param colorId
+     * @param color
+     */
+    public static void apply(WireBuffer buffer, int colorId, int color) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(colorId);
+        buffer.writeInt(color);
+    }
 
-        /**
-         * Writes out the operation to the buffer
-         *
-         * @param buffer
-         * @param colorId
-         * @param color
-         */
-        public void apply(WireBuffer buffer, int colorId, int color) {
-            buffer.start(Operations.COLOR_CONSTANT);
-            buffer.writeInt(colorId);
-            buffer.writeInt(color);
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int colorId = buffer.readInt();
+        int color = buffer.readInt();
+        operations.add(new ColorConstant(colorId, color));
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int colorId = buffer.readInt();
-            int color = buffer.readInt();
-            operations.add(new ColorConstant(colorId, color));
-        }
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Expressions Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Define a Color")
+                .field(INT, "id",
+                        "Id of the color")
+                .field(INT, "color",
+                        "32 bit ARGB color");
     }
 
     @Override
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ColorExpression.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ColorExpression.java
index 7d28cea..96d6674 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/ColorExpression.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ColorExpression.java
@@ -15,12 +15,15 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
@@ -34,6 +37,8 @@
  * mMode = 4  H S V mode
  */
 public class ColorExpression implements Operation, VariableSupport {
+    private static final int OP_CODE = Operations.COLOR_EXPRESSIONS;
+    private static final String CLASS_NAME = "ColorExpression";
     public int mId;
     int mMode;
     public int mColor1;
@@ -52,8 +57,8 @@
     public float mOutTween = 0.0f;
     public int mOutColor1;
     public int mOutColor2;
-    public static final Companion COMPANION = new Companion();
     public static final int HSV_MODE = 4;
+
     public ColorExpression(int id, float hue, float sat, float value) {
         mMode = HSV_MODE;
         mAlpha = 0xFF;
@@ -64,6 +69,7 @@
         mColor2 = Float.floatToRawIntBits(sat);
         mTween = value;
     }
+
     public ColorExpression(int id, int alpha, float hue, float sat, float value) {
         mMode = HSV_MODE;
         mAlpha = alpha;
@@ -90,7 +96,6 @@
         this.mOutTween = tween;
         this.mOutColor1 = color1;
         this.mOutColor2 = color2;
-
     }
 
     @Override
@@ -163,13 +168,12 @@
             context.loadColor(mId,
                     Utils.interpolateColor(mOutColor1, mOutColor2, mOutTween));
         }
-
     }
 
     @Override
     public void write(WireBuffer buffer) {
         int mode = mMode | (mAlpha << 16);
-        COMPANION.apply(buffer, mId, mode, mColor1, mColor2, mTween);
+        apply(buffer, mId, mode, mColor1, mColor2, mTween);
     }
 
     @Override
@@ -187,51 +191,66 @@
                 + Utils.floatToString(mTween) + ")";
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public String name() {
-            return "ColorExpression";
-        }
 
-        @Override
-        public int id() {
-            return Operations.COLOR_EXPRESSIONS;
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        /**
-         * Call to write a ColorExpression object on the buffer
-         * @param buffer
-         * @param id of the ColorExpression object
-         * @param mode if colors are id or actual values
-         * @param color1
-         * @param color2
-         * @param tween
-         */
-        public void apply(WireBuffer buffer,
-                          int id, int mode,
-                          int color1, int color2, float tween) {
-            buffer.start(Operations.COLOR_EXPRESSIONS);
-            buffer.writeInt(id);
-            buffer.writeInt(mode);
-            buffer.writeInt(color1);
-            buffer.writeInt(color2);
-            buffer.writeFloat(tween);
+    /**
+     * Call to write a ColorExpression object on the buffer
+     *
+     * @param buffer
+     * @param id     of the ColorExpression object
+     * @param mode   if colors are id or actual values
+     * @param color1
+     * @param color2
+     * @param tween
+     */
+    public static void apply(WireBuffer buffer,
+                             int id, int mode,
+                             int color1, int color2, float tween) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(id);
+        buffer.writeInt(mode);
+        buffer.writeInt(color1);
+        buffer.writeInt(color2);
+        buffer.writeFloat(tween);
 
-        }
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int id = buffer.readInt();
-            int mode = buffer.readInt();
-            int color1 = buffer.readInt();
-            int color2 = buffer.readInt();
-            float tween = buffer.readFloat();
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int id = buffer.readInt();
+        int mode = buffer.readInt();
+        int color1 = buffer.readInt();
+        int color2 = buffer.readInt();
+        float tween = buffer.readFloat();
 
-            operations.add(new ColorExpression(id, mode, color1, color2, tween));
-        }
+        operations.add(new ColorExpression(id, mode, color1, color2, tween));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Expressions Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("A Color defined by an expression")
+                .field(INT, "id", "Id of the color")
+                .field(INT, "mode", "The use of the next 3 fields")
+                .possibleValues("COLOR_COLOR_INTERPOLATE", 0)
+                .possibleValues("COLOR_ID_INTERPOLATE", 1)
+                .possibleValues("ID_COLOR_INTERPOLATE", 2)
+                .possibleValues("ID_ID_INTERPOLATE", 3)
+                .possibleValues("HSV", 4)
+                .field(INT, "color1",
+                        "32 bit ARGB color")
+                .field(INT, "color2",
+                        "32 bit ARGB color")
+                .field(FLOAT, "tween",
+                        "32 bit ARGB color");
+
     }
 
     @Override
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ComponentValue.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ComponentValue.java
new file mode 100644
index 0000000..22fe673
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ComponentValue.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations;
+
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.SerializableToString;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
+
+import java.util.List;
+
+public class ComponentValue implements Operation, SerializableToString {
+    public static final int OP_CODE = Operations.COMPONENT_VALUE;
+    public static final String CLASS_NAME = "ComponentValue";
+
+    public static final int WIDTH = 0;
+    public static final int HEIGHT = 1;
+
+    private int mType = WIDTH;
+    private int mComponentID = -1;
+    private int mValueId = -1;
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    @Override
+    public String toString() {
+        return CLASS_NAME + "(" + mType + ", " + mComponentID + ", " + mValueId + ")";
+    }
+
+    public int getType() {
+        return mType;
+    }
+
+    public int getComponentId() {
+        return mComponentID;
+    }
+
+    public int getValueId() {
+        return mValueId;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mType, mComponentID, mValueId);
+    }
+
+    @Override
+    public void apply(RemoteContext context) {
+        // Nothing
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int type = buffer.readInt();
+        int componentId = buffer.readInt();
+        int valueId = buffer.readInt();
+        ComponentValue op = new ComponentValue(type, componentId, valueId);
+        operations.add(op);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Expressions Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Encode a component-related value (eg its width, height etc.)")
+                .field(INT, "TYPE",
+                        "The type of value, either WIDTH(0) or HEIGHT(1)")
+                .field(INT, "COMPONENT_ID",
+                        "The component id to reference")
+                .field(INT, "VALUE_ID",
+                        "The id of the RemoteFloat representing the described"
+                                + " component value, which can be used in expressions");
+    }
+
+    public ComponentValue(int type, int componentId, int valueId) {
+        mType = type;
+        mComponentID = componentId;
+        mValueId = valueId;
+    }
+
+    /**
+     * Writes out the ComponentValue to the buffer
+     *
+     * @param buffer buffer to write to
+     * @param type   type of value (WIDTH or HEIGHT)
+     * @param componentId     component id to reference
+     * @param valueId  remote float used to represent the component value
+     */
+    public static void apply(WireBuffer buffer,
+                             int type,
+                             int componentId,
+                             int valueId) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(type);
+        buffer.writeInt(componentId);
+        buffer.writeInt(valueId);
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return null;
+    }
+
+    public void serializeToString(int indent, StringSerializer serializer) {
+        String type = "WIDTH";
+        if (mType == HEIGHT) {
+            type = "HEIGHT";
+        }
+        serializer.append(indent, CLASS_NAME
+                + " value " + mValueId + " set to "
+                + type + " of Component " + mComponentID);
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DataListFloat.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DataListFloat.java
new file mode 100644
index 0000000..edcb5fe
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DataListFloat.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations;
+
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT_ARRAY;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.VariableSupport;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.utilities.ArrayAccess;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class DataListFloat implements VariableSupport, ArrayAccess, Operation {
+    private static final int OP_CODE = Operations.FLOAT_LIST;
+    private static final String CLASS_NAME = "IdListData";
+    int mId;
+    float[] mValues;
+    private static final int MAX_FLOAT_ARRAY = 2000;
+
+    public DataListFloat(int id, float[] values) {
+        mId = id;
+        mValues = values;
+    }
+
+    @Override
+    public void updateVariables(RemoteContext context) {
+        // TODO add support for variables in arrays
+    }
+
+    @Override
+    public void registerListening(RemoteContext context) {
+        context.addCollection(mId, this);
+        for (float value : mValues) {
+            if (Utils.isVariable(value)) {
+                context.listensTo(Utils.idFromNan(value), this);
+            }
+        }
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mId, mValues);
+    }
+
+    @Override
+    public String toString() {
+        return "DataListFloat[A_" + (mId & 0xFFFF) + "] " + Arrays.toString(mValues);
+    }
+
+    public static void apply(WireBuffer buffer, int id, float[] values) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(id);
+        buffer.writeInt(values.length);
+        for (int i = 0; i < values.length; i++) {
+            buffer.writeFloat(values[i]);
+        }
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int id = buffer.readInt();
+        int len = buffer.readInt();
+        if (len > MAX_FLOAT_ARRAY) {
+            throw new RuntimeException(len + " map entries more than max = " + MAX_FLOAT_ARRAY);
+        }
+        float[] values = new float[len];
+        for (int i = 0; i < values.length; i++) {
+            values[i] = buffer.readFloat();
+        }
+        DataListFloat data = new DataListFloat(id, values);
+        operations.add(data);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Data Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("a list of Floats")
+                .field(INT, "id", "id the array (2xxxxx)")
+                .field(INT, "length", "number of floats")
+                .field(FLOAT_ARRAY, "values", "length",
+                        "array of floats");
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return indent + toString();
+    }
+
+    @Override
+    public void apply(RemoteContext context) {
+        context.addCollection(mId, this);
+    }
+
+    @Override
+    public float getFloatValue(int index) {
+        return mValues[index];
+    }
+
+    @Override
+    public float[] getFloats() {
+        return mValues;
+    }
+
+    @Override
+    public int getFloatsLength() {
+        return mValues.length;
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DataListIds.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DataListIds.java
new file mode 100644
index 0000000..bde376e
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DataListIds.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations;
+
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT_ARRAY;
+
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.VariableSupport;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.utilities.ArrayAccess;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class DataListIds implements VariableSupport, ArrayAccess, Operation  {
+    private static final int OP_CODE = Operations.ID_LIST;
+    private static final String CLASS_NAME = "IdListData";
+    int mId;
+    int[] mIds;
+    float[] mValues;
+    private static final int MAX_LIST = 2000;
+
+    public DataListIds(int id, int[] ids) {
+        mId = id;
+        mIds = ids;
+        mValues = new float[ids.length];
+    }
+
+    @Override
+    public void updateVariables(RemoteContext context) {
+        for (int i = 0; i < mIds.length; i++) {
+            int id = mIds[i];
+            mValues[i] = context.getFloat(id);
+        }
+    }
+
+    @Override
+    public void registerListening(RemoteContext context) {
+        for (int mId : mIds) {
+            context.listensTo(mId, this);
+        }
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mId, mIds);
+    }
+
+    @Override
+    public String toString() {
+        return "map " + "\"" + Arrays.toString(mIds) + "\"";
+    }
+
+    public static void apply(WireBuffer buffer, int id, int[] ids) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(id);
+        buffer.writeInt(ids.length);
+        for (int i = 0; i < ids.length; i++) {
+            buffer.writeInt(ids[i]);
+        }
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int id = buffer.readInt();
+        int len = buffer.readInt();
+        if (len > MAX_LIST) {
+            throw new RuntimeException(len + " list entries more than max = " + MAX_LIST);
+        }
+        int[] ids = new int[len];
+        for (int i = 0; i < ids.length; i++) {
+            ids[i] = buffer.readInt();
+        }
+        DataListIds data = new DataListIds(id, ids);
+        operations.add(data);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Data Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("a list of id's")
+                .field(INT, "id", "id the array")
+                .field(INT, "length", "number of ids")
+                .field(INT_ARRAY, "ids[n]", "length",
+                        "ids of other variables");
+
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return indent + toString();
+    }
+
+    @Override
+    public void apply(RemoteContext context) {
+        context.addCollection(mId, this);
+    }
+
+    @Override
+    public float getFloatValue(int index) {
+        return mValues[index];
+    }
+
+    @Override
+    public float[] getFloats() {
+        return mValues;
+    }
+
+    @Override
+    public int getFloatsLength() {
+        return mValues.length;
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DataMapIds.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DataMapIds.java
new file mode 100644
index 0000000..53143dc
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DataMapIds.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations;
+
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.UTF8;
+
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.VariableSupport;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.utilities.ArrayAccess;
+
+import java.util.List;
+
+public class DataMapIds implements VariableSupport, ArrayAccess, Operation  {
+    private static final int OP_CODE = Operations.ID_MAP;
+    private static final String CLASS_NAME = "IdMapData";
+    int mId;
+    String[] mNames;
+    int[] mIds;
+    float[] mValues;
+    private static final int MAX_MAP = 2000;
+
+    public DataMapIds(int id, String[] names, int[] ids) {
+        mId = id;
+        mNames = names;
+        mIds = ids;
+        mValues = new float[ids.length];
+
+    }
+
+    @Override
+    public void updateVariables(RemoteContext context) {
+        for (int i = 0; i < mIds.length; i++) {
+            int id = mIds[i];
+            mValues[i] = context.getFloat(id);
+        }
+    }
+
+    @Override
+    public void registerListening(RemoteContext context) {
+        for (int mId : mIds) {
+            context.listensTo(mId, this);
+        }
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mId, mNames, mIds);
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder("DataMapIds ");
+        for (int i = 0; i < mNames.length; i++) {
+            if (i != 0) {
+                builder.append(" ");
+            }
+            builder.append(mNames[i]);
+            builder.append("[");
+            builder.append(mIds[i]);
+            builder.append("]");
+
+        }
+        return builder.toString();
+    }
+
+    public static void apply(WireBuffer buffer, int id, String[] names, int[] ids) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(id);
+        buffer.writeInt(names.length);
+        for (int i = 0; i < names.length; i++) {
+            buffer.writeUTF8(names[i]);
+            buffer.writeInt(ids[i]);
+        }
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int id = buffer.readInt();
+        int len = buffer.readInt();
+        if (len > MAX_MAP) {
+            throw new RuntimeException(len + " map entries more than max = " + MAX_MAP);
+        }
+        String[] names = new String[len];
+        int[] ids = new int[len];
+        for (int i = 0; i < names.length; i++) {
+            names[i] = buffer.readUTF8();
+            ids[i] = buffer.readInt();
+        }
+        DataMapIds data = new DataMapIds(id, names, ids);
+        operations.add(data);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Data Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Encode a collection of name id pairs")
+                .field(INT, "id", "id the array")
+                .field(INT, "length", "number of entries")
+                .field(INT, "names[0]", "length",
+                        "path encoded as floats")
+                .field(UTF8, "id[0]", "length",
+                        "path encoded as floats");
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return indent + toString();
+    }
+
+    @Override
+    public void apply(RemoteContext context) {
+        context.addCollection(mId, this);
+    }
+
+    @Override
+    public float getFloatValue(int index) {
+        return mValues[index];
+    }
+
+    @Override
+    public float[] getFloats() {
+        return mValues;
+    }
+
+    @Override
+    public int getFloatsLength() {
+        return mValues.length;
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawArc.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawArc.java
index c176864..d377229 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawArc.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawArc.java
@@ -15,23 +15,85 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
 
 public class DrawArc extends DrawBase6 {
-    public static final Companion COMPANION =
-            new Companion(Operations.DRAW_ARC) {
-                @Override
-                public Operation construct(float v1,
-                                           float v2,
-                                           float v3,
-                                           float v4,
-                                           float v5,
-                                           float v6) {
-                    return new DrawArc(v1, v2, v3, v4, v5, v6);
-                }
-            };
+    public static final int OP_CODE = Operations.DRAW_ARC;
+    private static final String CLASS_NAME = "DrawArc";
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Maker m = DrawArc::new;
+        read(m, buffer, operations);
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    /**
+     * Writes out the operation to the buffer
+     * @param buffer the buffer to write to
+     * @param v1 The left side of the Oval
+     * @param v2 The top of the Oval
+     * @param v3 The right side of the Oval
+     * @param v4 The bottom of the Oval
+     * @param v5 Starting angle (in degrees) where the arc begins
+     * @param v6 Sweep angle (in degrees) measured clockwise
+     */
+    public static void apply(WireBuffer buffer,
+                             float v1,
+                             float v2,
+                             float v3,
+                             float v4,
+                             float v5,
+                             float v6) {
+        buffer.start(OP_CODE);
+        buffer.writeFloat(v1);
+        buffer.writeFloat(v2);
+        buffer.writeFloat(v3);
+        buffer.writeFloat(v4);
+        buffer.writeFloat(v5);
+        buffer.writeFloat(v6);
+    }
+
+    protected void write(WireBuffer buffer,
+                             float v1,
+                             float v2,
+                             float v3,
+                             float v4,
+                             float v5,
+                             float v6) {
+        apply(buffer, v1, v2, v3, v4, v5, v6);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw the specified arc"
+                        + "which will be scaled to fit inside the specified oval")
+                .field(FLOAT, "left",
+                        "The left side of the Oval")
+                .field(FLOAT, "top",
+                        "The top of the Oval")
+                .field(FLOAT, "right",
+                        "The right side of the Oval")
+                .field(FLOAT, "bottom",
+                        "The bottom of the Oval")
+                .field(FLOAT, "startAngle",
+                        "Starting angle (in degrees) where the arc begins")
+                .field(FLOAT, "sweepAngle",
+                        "Sweep angle (in degrees) measured clockwise");
+    }
+
 
     public DrawArc(float v1,
                    float v2,
@@ -43,7 +105,6 @@
         mName = "DrawArc";
     }
 
-    @Override
     public void paint(PaintContext context) {
         context.drawArc(mV1, mV2, mV3, mV4, mV5, mV6);
     }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase2.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase2.java
index 0963c13..97eb76b 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase2.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase2.java
@@ -17,9 +17,7 @@
 
 import static com.android.internal.widget.remotecompose.core.operations.Utils.floatToString;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
 import com.android.internal.widget.remotecompose.core.Operation;
-import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.VariableSupport;
@@ -32,14 +30,6 @@
  */
 public abstract class DrawBase2 extends PaintOperation
         implements VariableSupport {
-    public static final Companion COMPANION =
-            new Companion(Operations.DRAW_CIRCLE) {
-                @Override
-                public Operation construct(float x1, float y1) {
-                    // subclass should return new DrawX(x1, y1);
-                    return null;
-                }
-            };
     protected String mName = "DrawRectBase";
     float mV1;
     float mV2;
@@ -71,9 +61,17 @@
         }
     }
 
+
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mV1, mV2);
+        write(buffer, mV1, mV2);
+    }
+
+    protected abstract void write(WireBuffer buffer, float v1, float v2);
+
+    protected interface Maker {
+        DrawBase2 create(float v1,
+                         float v2);
     }
 
     @Override
@@ -81,54 +79,42 @@
         return mName + " " + floatToString(mV1) + " " + floatToString(mV2);
     }
 
-    public static class Companion implements CompanionOperation {
-        public final int OP_CODE;
 
-        protected Companion(int code) {
-            OP_CODE = code;
-        }
+    public static void read(Maker maker, WireBuffer buffer, List<Operation> operations) {
+        float v1 = buffer.readFloat();
+        float v2 = buffer.readFloat();
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            float v1 = buffer.readFloat();
-            float v2 = buffer.readFloat();
+        Operation op = maker.create(v1, v2);
+        operations.add(op);
+    }
 
-            Operation op = construct(v1, v2);
-            operations.add(op);
-        }
+    /**
+     * Override to construct a 2 float value operation
+     *
+     * @param x1
+     * @param y1
+     * @return
+     */
+    public Operation construct(float x1, float y1) {
+        return null;
+    }
 
-        /**
-         * Override to construct a 2 float value operation
-         * @param x1
-         * @param y1
-         * @return
-         */
-        public Operation construct(float x1, float y1) {
-            return null;
-        }
 
-        @Override
-        public String name() {
-            return "DrawRect";
-        }
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer
+     * @param opCode
+     * @param x1
+     * @param y1
+     */
+    protected static void write(WireBuffer buffer,
+                                int opCode,
+                                float x1,
+                                float y1) {
+        buffer.start(opCode);
+        buffer.writeFloat(x1);
+        buffer.writeFloat(y1);
 
-        @Override
-        public int id() {
-            return OP_CODE;
-        }
-
-        /**
-         * Writes out the operation to the buffer
-         * @param buffer
-         * @param x1
-         * @param y1
-         */
-        public void apply(WireBuffer buffer,
-                          float x1,
-                          float y1) {
-            buffer.start(OP_CODE);
-            buffer.writeFloat(x1);
-            buffer.writeFloat(y1);
-        }
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase3.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase3.java
index 5a4a9f3..2d1d3eb 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase3.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase3.java
@@ -17,9 +17,7 @@
 
 import static com.android.internal.widget.remotecompose.core.operations.Utils.floatToString;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
 import com.android.internal.widget.remotecompose.core.Operation;
-import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.VariableSupport;
@@ -32,14 +30,7 @@
  */
 public abstract class DrawBase3 extends PaintOperation
         implements VariableSupport {
-    public static final Companion COMPANION =
-            new Companion(Operations.DRAW_CIRCLE) {
-                @Override
-                public Operation construct(float x1, float y1, float x2) {
-                    // subclass should return new DrawX(x1, y1, x2, y2);
-                    return null;
-                }
-            };
+
     protected String mName = "DrawRectBase";
     float mV1;
     float mV2;
@@ -86,7 +77,18 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mV1, mV2, mV3);
+        write(buffer, mV1, mV2, mV3);
+    }
+
+    protected abstract void write(WireBuffer buffer,
+                                  float v1,
+                                  float v2,
+                                  float v3);
+
+    interface Maker {
+        DrawBase3 create(float v1,
+                         float v2,
+                         float v3);
     }
 
     @Override
@@ -95,63 +97,26 @@
                 + " " + floatToString(mV3);
     }
 
-    public static class Companion implements CompanionOperation {
-        public final int OP_CODE;
+    public static void read(Maker maker, WireBuffer buffer, List<Operation> operations) {
+        float v1 = buffer.readFloat();
+        float v2 = buffer.readFloat();
+        float v3 = buffer.readFloat();
+        Operation op = maker.create(v1, v2, v3);
+        operations.add(op);
+    }
 
-        protected Companion(int code) {
-            OP_CODE = code;
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            float v1 = buffer.readFloat();
-            float v2 = buffer.readFloat();
-            float v3 = buffer.readFloat();
-
-            Operation op = construct(v1, v2, v3);
-            operations.add(op);
-        }
-
-        /**
-         * Construct and Operation from the 3 variables.
-         * This must be overridden by subclasses
-         * @param x1
-         * @param y1
-         * @param x2
-         * @return
-         */
-        public Operation construct(float x1,
-                                   float y1,
-                                   float x2) {
-            return null;
-        }
-
-        @Override
-        public String name() {
-            return "DrawRect";
-        }
-
-        @Override
-        public int id() {
-            return OP_CODE;
-        }
-
-        /**
-         * Writes out the operation to the buffer
-         * @param buffer
-         * @param x1
-         * @param y1
-         * @param x2
-         */
-        public void apply(WireBuffer buffer,
-                          float x1,
-                          float y1,
-                          float x2) {
-            buffer.start(OP_CODE);
-            buffer.writeFloat(x1);
-            buffer.writeFloat(y1);
-            buffer.writeFloat(x2);
-
-        }
+    /**
+     * Construct and Operation from the 3 variables.
+     * This must be overridden by subclasses
+     *
+     * @param x1
+     * @param y1
+     * @param x2
+     * @return
+     */
+    public Operation construct(float x1,
+                               float y1,
+                               float x2) {
+        return null;
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase4.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase4.java
index 53a3aa9..943c5a4 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase4.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase4.java
@@ -17,9 +17,7 @@
 
 import static com.android.internal.widget.remotecompose.core.operations.Utils.floatToString;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
 import com.android.internal.widget.remotecompose.core.Operation;
-import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.VariableSupport;
@@ -32,14 +30,6 @@
  */
 public abstract class DrawBase4 extends PaintOperation
         implements VariableSupport {
-    public static final Companion COMPANION =
-            new Companion(Operations.DRAW_RECT) {
-                @Override
-                public Operation construct(float x1, float y1, float x2, float y2) {
-                    //   return new DrawRectBase(x1, y1, x2, y2);
-                    return null;
-                }
-            };
     protected String mName = "DrawRectBase";
     protected float mX1;
     protected float mY1;
@@ -96,7 +86,20 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mX1, mY1, mX2, mY2);
+        write(buffer, mX1, mY1, mX2, mY2);
+    }
+
+    protected abstract void write(WireBuffer buffer,
+                                  float v1,
+                                  float v2,
+                                  float v3,
+                                  float v4);
+
+    protected interface Maker {
+        DrawBase4 create(float v1,
+                         float v2,
+                         float v3,
+                         float v4);
     }
 
     @Override
@@ -105,67 +108,54 @@
                 + " " + floatToString(mX2Value, mX2) + " " + floatToString(mY2Value, mY2);
     }
 
-    public static class Companion implements CompanionOperation {
-        public final int OP_CODE;
+    public static void read(Maker maker, WireBuffer buffer, List<Operation> operations) {
+        float v1 = buffer.readFloat();
+        float v2 = buffer.readFloat();
+        float v3 = buffer.readFloat();
+        float v4 = buffer.readFloat();
 
-        protected Companion(int code) {
-            OP_CODE = code;
-        }
+        Operation op = maker.create(v1, v2, v3, v4);
+        operations.add(op);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            float sLeft = buffer.readFloat();
-            float srcTop = buffer.readFloat();
-            float srcRight = buffer.readFloat();
-            float srcBottom = buffer.readFloat();
+    /**
+     * Construct and Operation from the 3 variables.
+     *
+     * @param x1
+     * @param y1
+     * @param x2
+     * @param y2
+     * @return
+     */
+    public Operation construct(float x1,
+                               float y1,
+                               float x2,
+                               float y2) {
+        return null;
+    }
 
-            Operation op = construct(sLeft, srcTop, srcRight, srcBottom);
-            operations.add(op);
-        }
 
-        /**
-         * Construct and Operation from the 3 variables.
-         * @param x1
-         * @param y1
-         * @param x2
-         * @param y2
-         * @return
-         */
-        public Operation construct(float x1,
-                                   float y1,
-                                   float x2,
-                                   float y2) {
-            return null;
-        }
-
-        @Override
-        public String name() {
-            return "DrawRect";
-        }
-
-        @Override
-        public int id() {
-            return OP_CODE;
-        }
-
-        /**
-         * Writes out the operation to the buffer
-         * @param buffer
-         * @param x1
-         * @param y1
-         * @param x2
-         * @param y2
-         */
-        public void apply(WireBuffer buffer,
-                          float x1,
-                          float y1,
-                          float x2,
-                          float y2) {
-            buffer.start(OP_CODE);
-            buffer.writeFloat(x1);
-            buffer.writeFloat(y1);
-            buffer.writeFloat(x2);
-            buffer.writeFloat(y2);
-        }
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer
+     * @param opCode
+     * @param x1
+     * @param y1
+     * @param x2
+     * @param y2
+     */
+    protected static void write(WireBuffer buffer,
+                                int opCode,
+                                float x1,
+                                float y1,
+                                float x2,
+                                float y2) {
+        buffer.start(opCode);
+        buffer.writeFloat(x1);
+        buffer.writeFloat(y1);
+        buffer.writeFloat(x2);
+        buffer.writeFloat(y2);
     }
 }
+
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase6.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase6.java
index 2f4335e..767a36d 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase6.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase6.java
@@ -17,9 +17,7 @@
 
 import static com.android.internal.widget.remotecompose.core.operations.Utils.floatToString;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
 import com.android.internal.widget.remotecompose.core.Operation;
-import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.VariableSupport;
@@ -32,13 +30,6 @@
  */
 public abstract class DrawBase6 extends PaintOperation
         implements VariableSupport {
-    public static final Companion COMPANION =
-            new Companion(Operations.DRAW_RECT) {
-                public Operation construct(float x1, float y1, float x2, float y2) {
-                    //   return new DrawRectBase(x1, y1, x2, y2);
-                    return null;
-                }
-            };
     protected String mName = "DrawRectBase";
     float mV1;
     float mV2;
@@ -115,88 +106,67 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mV1, mV2, mV3, mV4, mV5, mV6);
+        write(buffer, mV1, mV2, mV3, mV4, mV5, mV6);
     }
 
+    protected abstract void write(WireBuffer buffer,
+                                  float v1,
+                                  float v2,
+                                  float v3,
+                                  float v4,
+                                  float v5,
+                                  float v6);
+
     @Override
     public String toString() {
         return mName + " " + floatToString(mV1) + " " + floatToString(mV2)
                 + " " + floatToString(mV3) + " " + floatToString(mV4);
     }
 
-    public static class Companion implements CompanionOperation {
-        public final int OP_CODE;
-
-        protected Companion(int code) {
-            OP_CODE = code;
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            float sv1 = buffer.readFloat();
-            float sv2 = buffer.readFloat();
-            float sv3 = buffer.readFloat();
-            float sv4 = buffer.readFloat();
-            float sv5 = buffer.readFloat();
-            float sv6 = buffer.readFloat();
-
-            Operation op = construct(sv1, sv2, sv3, sv4, sv5, sv6);
-            operations.add(op);
-        }
-
-        /**
-         * writes out a the operation to the buffer.
-         * @param v1
-         * @param v2
-         * @param v3
-         * @param v4
-         * @param v5
-         * @param v6
-         * @return
-         */
-        public Operation construct(float v1,
-                                   float v2,
-                                   float v3,
-                                   float v4,
-                                   float v5,
-                                   float v6) {
-            return null;
-        }
-
-        @Override
-        public String name() {
-            return "DrawRect";
-        }
-
-        @Override
-        public int id() {
-            return OP_CODE;
-        }
-
-        /**
-         * Writes out the operation to the buffer
-         * @param buffer
-         * @param v1
-         * @param v2
-         * @param v3
-         * @param v4
-         * @param v5
-         * @param v6
-         */
-        public void apply(WireBuffer buffer,
-                          float v1,
-                          float v2,
-                          float v3,
-                          float v4,
-                          float v5,
-                          float v6) {
-            buffer.start(OP_CODE);
-            buffer.writeFloat(v1);
-            buffer.writeFloat(v2);
-            buffer.writeFloat(v3);
-            buffer.writeFloat(v4);
-            buffer.writeFloat(v5);
-            buffer.writeFloat(v6);
-        }
+    interface Maker {
+        DrawBase6 create(float v1,
+                         float v2,
+                         float v3,
+                         float v4,
+                         float v5,
+                         float v6);
     }
+
+    public static void read(Maker build, WireBuffer buffer, List<Operation> operations) {
+        float sv1 = buffer.readFloat();
+        float sv2 = buffer.readFloat();
+        float sv3 = buffer.readFloat();
+        float sv4 = buffer.readFloat();
+        float sv5 = buffer.readFloat();
+        float sv6 = buffer.readFloat();
+
+        Operation op = build.create(sv1, sv2, sv3, sv4, sv5, sv6);
+        operations.add(op);
+    }
+
+    /**
+     * writes out a the operation to the buffer.
+     *
+     * @param v1
+     * @param v2
+     * @param v3
+     * @param v4
+     * @param v5
+     * @param v6
+     * @return
+     */
+    public Operation construct(float v1,
+                               float v2,
+                               float v3,
+                               float v4,
+                               float v5,
+                               float v6) {
+        return null;
+    }
+
+
+    public static String name() {
+        return "DrawBase6";
+    }
+
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmap.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmap.java
index ca40d12..2748f4c 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmap.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmap.java
@@ -15,7 +15,9 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
@@ -23,11 +25,13 @@
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
 public class DrawBitmap extends PaintOperation implements VariableSupport {
-    public static final Companion COMPANION = new Companion();
+    private static final int OP_CODE = Operations.DRAW_BITMAP;
+    private static final String CLASS_NAME = "DrawBitmap";
     float mLeft;
     float mTop;
     float mRight;
@@ -84,7 +88,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mId, mLeft, mTop, mRight, mBottom, mDescriptionId);
+        apply(buffer, mId, mLeft, mTop, mRight, mBottom, mDescriptionId);
     }
 
     @Override
@@ -93,51 +97,59 @@
                 + " " + mRight + " " + mBottom + ";";
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int id = buffer.readInt();
+        float sLeft = buffer.readFloat();
+        float srcTop = buffer.readFloat();
+        float srcRight = buffer.readFloat();
+        float srcBottom = buffer.readFloat();
+        int discriptionId = buffer.readInt();
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int id = buffer.readInt();
-            float sLeft = buffer.readFloat();
-            float srcTop = buffer.readFloat();
-            float srcRight = buffer.readFloat();
-            float srcBottom = buffer.readFloat();
-            int discriptionId = buffer.readInt();
-
-            DrawBitmap op = new DrawBitmap(id, sLeft, srcTop, srcRight, srcBottom, discriptionId);
-            operations.add(op);
-        }
-
-        @Override
-        public String name() {
-            return "DrawOval";
-        }
-
-        @Override
-        public int id() {
-            return Operations.DRAW_BITMAP;
-        }
-
-        public void apply(WireBuffer buffer,
-                          int id,
-                          float left,
-                          float top,
-                          float right,
-                          float bottom,
-                          int descriptionId) {
-            buffer.start(Operations.DRAW_BITMAP);
-            buffer.writeInt(id);
-            buffer.writeFloat(left);
-            buffer.writeFloat(top);
-            buffer.writeFloat(right);
-            buffer.writeFloat(bottom);
-            buffer.writeInt(descriptionId);
-        }
+        DrawBitmap op = new DrawBitmap(id, sLeft, srcTop, srcRight, srcBottom, discriptionId);
+        operations.add(op);
     }
 
-    @Override
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static void apply(WireBuffer buffer,
+                             int id,
+                             float left,
+                             float top,
+                             float right,
+                             float bottom,
+                             int descriptionId) {
+        buffer.start(Operations.DRAW_BITMAP);
+        buffer.writeInt(id);
+        buffer.writeFloat(left);
+        buffer.writeFloat(top);
+        buffer.writeFloat(right);
+        buffer.writeFloat(bottom);
+        buffer.writeInt(descriptionId);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Draw Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw a bitmap")
+                .field(INT, "id", "id of float")
+                .field(FLOAT, "left",
+                        "The left side of the image")
+                .field(FLOAT, "top",
+                        "The top of the image")
+                .field(FLOAT, "right",
+                        "The right side of the image")
+                .field(FLOAT, "bottom",
+                        "The bottom of the image")
+                .field(INT, "descriptionId", "id of string");
+    }
+
     public void paint(PaintContext context) {
         context.drawBitmap(mId, mOutputLeft,
                 mOutputTop,
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapInt.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapInt.java
index c2a56e7..561d527 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapInt.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapInt.java
@@ -15,12 +15,14 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
@@ -28,6 +30,8 @@
  * Operation to draw a given cached bitmap
  */
 public class DrawBitmapInt extends PaintOperation {
+    private static final int OP_CODE = Operations.DRAW_BITMAP_INT;
+    private static final String CLASS_NAME = "DrawBitmapInt";
     int mImageId;
     int mSrcLeft;
     int mSrcTop;
@@ -38,7 +42,6 @@
     int mDstRight;
     int mDstBottom;
     int mContentDescId = 0;
-    public static final Companion COMPANION = new Companion();
 
     public DrawBitmapInt(int imageId,
                          int srcLeft,
@@ -64,7 +67,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mImageId, mSrcLeft, mSrcTop, mSrcRight, mSrcBottom,
+        apply(buffer, mImageId, mSrcLeft, mSrcTop, mSrcRight, mSrcBottom,
                 mDstLeft, mDstTop, mDstRight, mDstBottom, mContentDescId);
     }
 
@@ -75,54 +78,73 @@
                 + "- " + mDstLeft + " " + mDstTop + " " + mDstRight + " " + mDstBottom + ";";
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
 
-        @Override
-        public String name() {
-            return "DrawBitmapInt";
-        }
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public int id() {
-            return Operations.DRAW_BITMAP;
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        public void apply(WireBuffer buffer, int imageId,
-                          int srcLeft, int srcTop, int srcRight, int srcBottom,
-                          int dstLeft, int dstTop, int dstRight, int dstBottom,
-                          int cdId) {
-            buffer.start(Operations.DRAW_BITMAP_INT);
-            buffer.writeInt(imageId);
-            buffer.writeInt(srcLeft);
-            buffer.writeInt(srcTop);
-            buffer.writeInt(srcRight);
-            buffer.writeInt(srcBottom);
-            buffer.writeInt(dstLeft);
-            buffer.writeInt(dstTop);
-            buffer.writeInt(dstRight);
-            buffer.writeInt(dstBottom);
-            buffer.writeInt(cdId);
-        }
+    public static void apply(WireBuffer buffer, int imageId,
+                             int srcLeft, int srcTop, int srcRight, int srcBottom,
+                             int dstLeft, int dstTop, int dstRight, int dstBottom,
+                             int cdId) {
+        buffer.start(Operations.DRAW_BITMAP_INT);
+        buffer.writeInt(imageId);
+        buffer.writeInt(srcLeft);
+        buffer.writeInt(srcTop);
+        buffer.writeInt(srcRight);
+        buffer.writeInt(srcBottom);
+        buffer.writeInt(dstLeft);
+        buffer.writeInt(dstTop);
+        buffer.writeInt(dstRight);
+        buffer.writeInt(dstBottom);
+        buffer.writeInt(cdId);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int imageId = buffer.readInt();
-            int sLeft = buffer.readInt();
-            int srcTop = buffer.readInt();
-            int srcRight = buffer.readInt();
-            int srcBottom = buffer.readInt();
-            int dstLeft = buffer.readInt();
-            int dstTop = buffer.readInt();
-            int dstRight = buffer.readInt();
-            int dstBottom = buffer.readInt();
-            int cdId = buffer.readInt();
-            DrawBitmapInt op = new DrawBitmapInt(imageId, sLeft, srcTop, srcRight, srcBottom,
-                    dstLeft, dstTop, dstRight, dstBottom, cdId);
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int imageId = buffer.readInt();
+        int sLeft = buffer.readInt();
+        int srcTop = buffer.readInt();
+        int srcRight = buffer.readInt();
+        int srcBottom = buffer.readInt();
+        int dstLeft = buffer.readInt();
+        int dstTop = buffer.readInt();
+        int dstRight = buffer.readInt();
+        int dstBottom = buffer.readInt();
+        int cdId = buffer.readInt();
+        DrawBitmapInt op = new DrawBitmapInt(imageId, sLeft, srcTop, srcRight, srcBottom,
+                dstLeft, dstTop, dstRight, dstBottom, cdId);
 
-            operations.add(op);
-        }
+        operations.add(op);
+    }
+
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Draw Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw a bitmap using integer coordinates")
+                .field(INT, "id", "id of bitmap")
+                .field(INT, "srcLeft",
+                        "The left side of the image")
+                .field(INT, "srcTop",
+                        "The top of the image")
+                .field(INT, "srcRight",
+                        "The right side of the image")
+                .field(INT, "srcBottom",
+                        "The bottom of the image")
+                .field(INT, "dstLeft",
+                        "The left side of the image")
+                .field(INT, "dstTop",
+                        "The top of the image")
+                .field(INT, "dstRight",
+                        "The right side of the image")
+                .field(INT, "dstBottom",
+                        "The bottom of the image")
+                .field(INT, "cdId", "id of string");
     }
 
     @Override
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawCircle.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawCircle.java
index 3a22e4f..e39a191 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawCircle.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawCircle.java
@@ -1,31 +1,80 @@
 package com.android.internal.widget.remotecompose.core.operations;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
 
 public class DrawCircle extends DrawBase3 {
-    public static final Companion COMPANION =
-            new Companion(Operations.DRAW_CIRCLE) {
-                @Override
-                public Operation construct(float x1,
-                                           float y1,
-                                           float x2
-                ) {
-                    return new DrawCircle(x1, y1, x2);
-                }
-            };
+    private static final int OP_CODE = Operations.DRAW_CIRCLE;
+    private static final String CLASS_NAME = "DrawCircle";
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Maker m = DrawCircle::new;
+        read(m, buffer, operations);
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw a Circle")
+                .field(FLOAT, "centerX",
+                        "The x-coordinate of the center of the circle to be drawn")
+                .field(FLOAT, "centerY",
+                        "The y-coordinate of the center of the circle to be drawn")
+                .field(FLOAT, "radius",
+                        "The radius of the circle to be drawn");
+    }
+
+    protected void write(WireBuffer buffer,
+                         float v1,
+                         float v2,
+                         float v3) {
+        apply(buffer, v1, v2, v3);
+    }
 
     public DrawCircle(
             float left,
             float top,
             float right) {
         super(left, top, right);
-        mName = "DrawCircle";
+        mName = CLASS_NAME;
     }
 
     @Override
     public void paint(PaintContext context) {
         context.drawCircle(mV1, mV2, mV3);
     }
+
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer
+     * @param x1
+     * @param y1
+     * @param x2
+     */
+    public static void apply(WireBuffer buffer,
+                      float x1,
+                      float y1,
+                      float x2) {
+        buffer.start(OP_CODE);
+        buffer.writeFloat(x1);
+        buffer.writeFloat(y1);
+        buffer.writeFloat(x2);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawLine.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawLine.java
index c70c6ea..a7276b5 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawLine.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawLine.java
@@ -15,20 +15,58 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.SerializableToString;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
 
-public class DrawLine extends DrawBase4 {
-    public static final Companion COMPANION = new Companion(Operations.DRAW_LINE) {
-        @Override
-        public Operation construct(float x1,
-                                   float y1,
-                                   float x2,
-                                   float y2) {
-            return new DrawLine(x1, y1, x2, y2);
-        }
-    };
+import java.util.List;
+
+public class DrawLine extends DrawBase4 implements SerializableToString {
+    private static final int OP_CODE = Operations.DRAW_LINE;
+    private static final String CLASS_NAME = "DrawLine";
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Maker m = DrawLine::new;
+        read(m, buffer, operations);
+    }
+
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw a line segment")
+                .field(FLOAT, "startX",
+                        "The x-coordinate of the start point of the line")
+                .field(FLOAT, "startY",
+                        "The y-coordinate of the start point of the line")
+                .field(FLOAT, "endX",
+                        "The x-coordinate of the end point of the line")
+                .field(FLOAT, "endY",
+                        "The y-coordinate of the end point of the line");
+    }
+
+    protected void write(WireBuffer buffer,
+                         float v1,
+                         float v2,
+                         float v3,
+                         float v4) {
+        apply(buffer, v1, v2, v3, v4);
+    }
 
     public DrawLine(
             float left,
@@ -41,10 +79,45 @@
 
     @Override
     public void paint(PaintContext context) {
-        context.drawLine(mX1,
-                mY1,
-                mX2,
-                mY2);
+        context.drawLine(mX1, mY1, mX2, mY2);
     }
 
+    /**
+     * Writes out the DrawLine to the buffer
+     *
+     * @param buffer buffer to write to
+     * @param x1 start x of line
+     * @param y1 start y of the line
+     * @param x2 end x of the line
+     * @param y2 end y of the line
+     */
+    public static void apply(WireBuffer buffer,
+                             float x1,
+                             float y1,
+                             float x2,
+                             float y2) {
+        write(buffer, OP_CODE, x1, y1, x2, y2);
+    }
+
+    public void serializeToString(int indent, StringSerializer serializer) {
+        String x1 = "" + mX1;
+        if (Float.isNaN(mX1Value)) {
+            x1 = "[" + Utils.idFromNan(mX1Value) + " = " + mX1 + "]";
+        }
+        String y1 = "" + mY1;
+        if (Float.isNaN(mY1Value)) {
+            y1 = "[" + Utils.idFromNan(mY1Value) + " = " + mY1 + "]";
+        }
+        String x2 = "" + mX2;
+        if (Float.isNaN(mX2Value)) {
+            x2 = "[" + Utils.idFromNan(mX2Value) + " = " + mX2 + "]";
+        }
+        String y2 = "" + mY2;
+        if (Float.isNaN(mY2Value)) {
+            y2 = "[" + Utils.idFromNan(mY2Value) + " = " + mY2 + "]";
+        }
+        serializer.append(indent, CLASS_NAME
+                + "(" + x1 + ", " + y1 + ", " + x2 + ", " +  y2 + ")"
+        );
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawOval.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawOval.java
index ba17994..01761ef 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawOval.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawOval.java
@@ -15,21 +15,60 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
 
 public class DrawOval extends DrawBase4 {
-    public static final Companion COMPANION =
-            new Companion(Operations.DRAW_OVAL) {
-                @Override
-                public Operation construct(float x1,
-                                           float y1,
-                                           float x2,
-                                           float y2) {
-                    return new DrawOval(x1, y1, x2, y2);
-                }
-            };
+    private static final int OP_CODE = Operations.DRAW_OVAL;
+    private static final String CLASS_NAME = "DrawOval";
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Maker m = DrawOval::new;
+        read(m, buffer, operations);
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw the specified oval")
+                .field(FLOAT, "left",
+                        "The left side of the oval")
+                .field(FLOAT, "top",
+                        "The top of the oval")
+                .field(FLOAT, "right",
+                        "The right side of the oval")
+                .field(FLOAT, "bottom",
+                        "The bottom of the oval");
+    }
+
+    protected void write(WireBuffer buffer,
+                         float v1,
+                         float v2,
+                         float v3,
+                         float v4) {
+        apply(buffer, v1, v2, v3, v4);
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mX1, mY1, mX2, mY2);
+    }
 
     public DrawOval(
             float left,
@@ -37,11 +76,27 @@
             float right,
             float bottom) {
         super(left, top, right, bottom);
-        mName = "DrawOval";
+        mName = CLASS_NAME;
     }
 
     @Override
     public void paint(PaintContext context) {
         context.drawOval(mX1, mY1, mX2, mY2);
     }
+    /**
+     * Writes out the DrawOval to the buffer
+     *
+     * @param buffer buffer to write to
+     * @param x1 start x of DrawOval
+     * @param y1 start y of the DrawOval
+     * @param x2 end x of the DrawOval
+     * @param y2 end y of the DrawOval
+     */
+    public static void apply(WireBuffer buffer,
+                             float x1,
+                             float y1,
+                             float x2,
+                             float y2) {
+        write(buffer, OP_CODE, x1, y1, x2, y2);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawPath.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawPath.java
index 6dbc5a6..bc2c53a 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawPath.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawPath.java
@@ -15,17 +15,21 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
 public class DrawPath extends PaintOperation {
-    public static final Companion COMPANION = new Companion();
+    private static final int OP_CODE = Operations.DRAW_PATH;
+    private static final String CLASS_NAME = "DrawPath";
+
     int mId;
     float mStart = 0;
     float mEnd = 1;
@@ -36,7 +40,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mId);
+        apply(buffer, mId);
     }
 
     @Override
@@ -44,33 +48,36 @@
         return "DrawPath " + "[" + mId + "]" + ", " + mStart + ", " + mEnd;
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int id = buffer.readInt();
-            DrawPath op = new DrawPath(id);
-            operations.add(op);
-        }
-
-        @Override
-        public String name() {
-            return "DrawPath";
-        }
-
-        @Override
-        public int id() {
-            return Operations.DRAW_PATH;
-        }
-
-        public void apply(WireBuffer buffer, int id) {
-            buffer.start(Operations.DRAW_PATH);
-            buffer.writeInt(id);
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int id = buffer.readInt();
+        DrawPath op = new DrawPath(id);
+        operations.add(op);
     }
 
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+
+    public static int id() {
+        return Operations.DRAW_PATH;
+    }
+
+    public static void apply(WireBuffer buffer, int id) {
+        buffer.start(Operations.DRAW_PATH);
+        buffer.writeInt(id);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Draw Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw a bitmap using integer coordinates")
+                .field(INT, "id", "id of path");
+    }
+
+
     @Override
     public void paint(PaintContext context) {
         context.drawPath(mId, mStart, mEnd);
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRect.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRect.java
index 633aed4..ad17fe7 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRect.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRect.java
@@ -15,24 +15,60 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
 
 /**
  * Draw a Rectangle
  */
 public class DrawRect extends DrawBase4 {
-    public static final Companion COMPANION =
-            new Companion(Operations.DRAW_RECT) {
-                @Override
-                public Operation construct(float x1,
-                                           float y1,
-                                           float x2,
-                                           float y2) {
-                    return new DrawRect(x1, y1, x2, y2);
-                }
-            };
+    private static final int OP_CODE = Operations.DRAW_RECT;
+    private static final String CLASS_NAME = "DrawRect";
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Maker m = DrawRect::new;
+        read(m, buffer, operations);
+    }
+
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw the specified rectangle")
+                .field(FLOAT, "left",
+                        "The left side of the rectangle")
+                .field(FLOAT, "top",
+                        "The top of the rectangle")
+                .field(FLOAT, "right",
+                        "The right side of the rectangle")
+                .field(FLOAT, "bottom",
+                        "The bottom of the rectangle");
+    }
+
+
+    protected void write(WireBuffer buffer,
+                         float v1,
+                         float v2,
+                         float v3,
+                         float v4) {
+        apply(buffer, v1, v2, v3, v4);
+    }
 
     public DrawRect(
             float left,
@@ -40,7 +76,7 @@
             float right,
             float bottom) {
         super(left, top, right, bottom);
-        mName = "DrawRect";
+        mName = CLASS_NAME;
     }
 
     @Override
@@ -48,4 +84,20 @@
         context.drawRect(mX1, mY1, mX2, mY2);
     }
 
+    /**
+     * Writes out the DrawRect to the buffer
+     *
+     * @param buffer buffer to write to
+     * @param x1     left x of rect
+     * @param y1     top y of the rect
+     * @param x2     right x of the rect
+     * @param y2     bottom y of the rect
+     */
+    public static void apply(WireBuffer buffer,
+                             float x1,
+                             float y1,
+                             float x2,
+                             float y2) {
+        write(buffer, OP_CODE, x1, y1, x2, y2);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRoundRect.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRoundRect.java
index b9d0a67..908e03a 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRoundRect.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRoundRect.java
@@ -15,26 +15,89 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
 
 /**
  * Draw a rounded rectangle
  */
 public class DrawRoundRect extends DrawBase6 {
-    public static final Companion COMPANION =
-            new Companion(Operations.DRAW_ROUND_RECT) {
-                @Override
-                public Operation construct(float v1,
-                                           float v2,
-                                           float v3,
-                                           float v4,
-                                           float v5,
-                                           float v6) {
-                    return new DrawRoundRect(v1, v2, v3, v4, v5, v6);
-                }
-            };
+    private static final int OP_CODE = Operations.DRAW_ROUND_RECT;
+    private static final String CLASS_NAME = "DrawRoundRect";
+
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Maker m = DrawRoundRect::new;
+        read(m, buffer, operations);
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer The buffer to write to
+     * @param v1 The left side of the rect
+     * @param v2 The top of the rect
+     * @param v3 The right side of the rect
+     * @param v4 The bottom of the rect
+     * @param v5 The x-radius of the oval used to round the corners
+     * @param v6 The y-radius of the oval used to round the corners
+     */
+    public static void apply(WireBuffer buffer,
+                             float v1,
+                             float v2,
+                             float v3,
+                             float v4,
+                             float v5,
+                             float v6) {
+        buffer.start(OP_CODE);
+        buffer.writeFloat(v1);
+        buffer.writeFloat(v2);
+        buffer.writeFloat(v3);
+        buffer.writeFloat(v4);
+        buffer.writeFloat(v5);
+        buffer.writeFloat(v6);
+    }
+
+    protected void write(WireBuffer buffer,
+                         float v1,
+                         float v2,
+                         float v3,
+                         float v4,
+                         float v5,
+                         float v6) {
+        apply(buffer, v1, v2, v3, v4, v5, v6);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw the specified round-rect")
+                .field(FLOAT, "left",
+                        "The left side of the rect")
+                .field(FLOAT, "top",
+                        "The top of the rect")
+                .field(FLOAT, "right",
+                        "The right side of the rect")
+                .field(FLOAT, "bottom",
+                        "The bottom of the rect")
+                .field(FLOAT, "rx",
+                        "The x-radius of the oval used to round the corners")
+                .field(FLOAT, "sweepAngle",
+                        "The y-radius of the oval used to round the corners");
+    }
+
 
     public DrawRoundRect(float v1,
                          float v2,
@@ -43,7 +106,7 @@
                          float v5,
                          float v6) {
         super(v1, v2, v3, v4, v5, v6);
-        mName = "ClipRect";
+        mName = CLASS_NAME;
     }
 
     @Override
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawText.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawText.java
index f8f8afd..60dddc2 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawText.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawText.java
@@ -15,20 +15,28 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.BOOLEAN;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.operations.Utils.floatToString;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
 /**
  * Draw Text
  */
-public class DrawText extends PaintOperation {
-    public static final Companion COMPANION = new Companion();
+public class DrawText extends PaintOperation implements VariableSupport {
+    private static final int OP_CODE = Operations.DRAW_TEXT_RUN;
+    private static final String CLASS_NAME = "DrawText";
     int mTextID;
     int mStart = 0;
     int mEnd = 0;
@@ -36,6 +44,8 @@
     int mContextEnd = 0;
     float mX = 0f;
     float mY = 0f;
+    float mOutX = 0f;
+    float mOutY = 0f;
     boolean mRtl = false;
 
     public DrawText(int textID,
@@ -51,86 +61,124 @@
         mEnd = end;
         mContextStart = contextStart;
         mContextEnd = contextEnd;
-        mX = x;
-        mY = y;
+        mOutX = mX = x;
+        mOutY = mY = y;
         mRtl = rtl;
     }
 
     @Override
+    public void updateVariables(RemoteContext context) {
+        mOutX = (Float.isNaN(mX))
+                ? context.getFloat(Utils.idFromNan(mX)) : mX;
+        mOutY = (Float.isNaN(mY))
+                ? context.getFloat(Utils.idFromNan(mY)) : mY;
+    }
+
+    @Override
+    public void registerListening(RemoteContext context) {
+        if (Float.isNaN(mX)) {
+            context.listensTo(Utils.idFromNan(mX), this);
+        }
+        if (Float.isNaN(mY)) {
+            context.listensTo(Utils.idFromNan(mY), this);
+        }
+    }
+
+    @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mTextID, mStart, mEnd, mContextStart, mContextEnd, mX, mY, mRtl);
+        apply(buffer, mTextID, mStart, mEnd, mContextStart, mContextEnd, mX, mY, mRtl);
 
     }
 
     @Override
     public String toString() {
-        return "DrawTextRun [" + mTextID + "] " + mStart + ", " + mEnd + ", " + mX + ", " + mY;
+        return "DrawTextRun [" + mTextID + "] " + mStart + ", " + mEnd + ", "
+                + floatToString(mX, mOutX) + ", " + floatToString(mY, mOutY);
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int text = buffer.readInt();
+        int start = buffer.readInt();
+        int end = buffer.readInt();
+        int contextStart = buffer.readInt();
+        int contextEnd = buffer.readInt();
+        float x = buffer.readFloat();
+        float y = buffer.readFloat();
+        boolean rtl = buffer.readBoolean();
+        DrawText op = new DrawText(text, start, end, contextStart, contextEnd, x, y, rtl);
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int text = buffer.readInt();
-            int start = buffer.readInt();
-            int end = buffer.readInt();
-            int contextStart = buffer.readInt();
-            int contextEnd = buffer.readInt();
-            float x = buffer.readFloat();
-            float y = buffer.readFloat();
-            boolean rtl = buffer.readBoolean();
-            DrawText op = new DrawText(text, start, end, contextStart, contextEnd, x, y, rtl);
-
-            operations.add(op);
-        }
-
-        @Override
-        public String name() {
-            return "";
-        }
-
-        @Override
-        public int id() {
-            return 0;
-        }
-
-        /**
-         * Writes out the operation to the buffer
-         * @param buffer
-         * @param textID
-         * @param start
-         * @param end
-         * @param contextStart
-         * @param contextEnd
-         * @param x
-         * @param y
-         * @param rtl
-         */
-        public void apply(WireBuffer buffer,
-                          int textID,
-                          int start,
-                          int end,
-                          int contextStart,
-                          int contextEnd,
-                          float x,
-                          float y,
-                          boolean rtl) {
-            buffer.start(Operations.DRAW_TEXT_RUN);
-            buffer.writeInt(textID);
-            buffer.writeInt(start);
-            buffer.writeInt(end);
-            buffer.writeInt(contextStart);
-            buffer.writeInt(contextEnd);
-            buffer.writeFloat(x);
-            buffer.writeFloat(y);
-            buffer.writeBoolean(rtl);
-        }
+        operations.add(op);
     }
 
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer       write the command to the buffer
+     * @param textID       id of the text
+     * @param start        Start position
+     * @param end          end position
+     * @param contextStart start of the context
+     * @param contextEnd   end of the context
+     * @param x            position of where to draw
+     * @param y            position of where to draw
+     * @param rtl          is it Right to Left text
+     */
+    public static void apply(WireBuffer buffer,
+                             int textID,
+                             int start,
+                             int end,
+                             int contextStart,
+                             int contextEnd,
+                             float x,
+                             float y,
+                             boolean rtl) {
+        buffer.start(Operations.DRAW_TEXT_RUN);
+        buffer.writeInt(textID);
+        buffer.writeInt(start);
+        buffer.writeInt(end);
+        buffer.writeInt(contextStart);
+        buffer.writeInt(contextEnd);
+        buffer.writeFloat(x);
+        buffer.writeFloat(y);
+        buffer.writeBoolean(rtl);
+    }
+
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Draw Operations",
+                        id(),
+                        CLASS_NAME)
+                .description("Draw a run of text, all in a single direction")
+                .field(INT, "textId", "id of bitmap")
+                .field(INT, "start",
+                        "The start of the text to render. -1=end of string")
+                .field(INT, "end",
+                        "The end of the text to render")
+                .field(INT, "contextStart",
+                        "the index of the start of the shaping context")
+                .field(INT, "contextEnd",
+                        "the index of the end of the shaping context")
+                .field(FLOAT, "x",
+                        "The x position at which to draw the text")
+                .field(FLOAT, "y",
+                        "The y position at which to draw the text")
+                .field(BOOLEAN, "RTL",
+                        "Whether the run is in RTL direction");
+    }
+
+
     @Override
     public void paint(PaintContext context) {
-        context.drawTextRun(mTextID, mStart, mEnd, mContextStart, mContextEnd, mX, mY, mRtl);
+        context.drawTextRun(mTextID, mStart, mEnd, mContextStart,
+                mContextEnd, mOutX, mOutY, mRtl);
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextAnchored.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextAnchored.java
index 4f0641f..242bc25 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextAnchored.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextAnchored.java
@@ -15,7 +15,9 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
@@ -23,6 +25,7 @@
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
@@ -30,7 +33,8 @@
  * Draw Text in Anchored to a point
  */
 public class DrawTextAnchored extends PaintOperation implements VariableSupport {
-    public static final Companion COMPANION = new Companion();
+    private static final int OP_CODE = Operations.DRAW_TEXT_ANCHOR;
+    private static final String CLASS_NAME = "DrawTextAnchored";
     int mTextID;
     float mX;
     float mY;
@@ -91,7 +95,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mTextID, mX,
+        apply(buffer, mTextID, mX,
                 mY,
                 mPanX,
                 mPanY,
@@ -113,64 +117,77 @@
         return Float.toString(v);
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int textID = buffer.readInt();
+        float x = buffer.readFloat();
+        float y = buffer.readFloat();
+        float panX = buffer.readFloat();
+        float panY = buffer.readFloat();
+        int flags = buffer.readInt();
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int textID = buffer.readInt();
-            float x = buffer.readFloat();
-            float y = buffer.readFloat();
-            float panX = buffer.readFloat();
-            float panY = buffer.readFloat();
-            int flags = buffer.readInt();
+        DrawTextAnchored op = new DrawTextAnchored(textID,
+                x, y,
+                panX, panY,
+                flags);
 
-            DrawTextAnchored op = new DrawTextAnchored(textID,
-                    x, y,
-                    panX, panY,
-                    flags);
-
-            operations.add(op);
-        }
-
-        @Override
-        public String name() {
-            return "";
-        }
-
-        @Override
-        public int id() {
-            return 0;
-        }
-
-        /**
-         * Writes out the operation to the buffer
-         * @param buffer
-         * @param textID
-         * @param x
-         * @param y
-         * @param panX
-         * @param panY
-         * @param flags
-         */
-        public void apply(WireBuffer buffer,
-                          int textID,
-                          float x,
-                          float y,
-                          float panX,
-                          float panY,
-                          int flags) {
-            buffer.start(Operations.DRAW_TEXT_ANCHOR);
-            buffer.writeInt(textID);
-            buffer.writeFloat(x);
-            buffer.writeFloat(y);
-            buffer.writeFloat(panX);
-            buffer.writeFloat(panY);
-            buffer.writeInt(flags);
-        }
+        operations.add(op);
     }
 
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer The buffer to write to
+     * @param textID The id of the text data
+     * @param x The x-position of the anchor point
+     * @param y The y-position of the anchor point
+     * @param panX The pan from left(-1) to right(1) 0 being centered
+     * @param panY The pan from top(-1) to bottom(1) 0 being centered
+     * @param flags Change the behaviour
+     */
+    public static void apply(WireBuffer buffer,
+                             int textID,
+                             float x,
+                             float y,
+                             float panX,
+                             float panY,
+                             int flags) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(textID);
+        buffer.writeFloat(x);
+        buffer.writeFloat(y);
+        buffer.writeFloat(panX);
+        buffer.writeFloat(panY);
+        buffer.writeInt(flags);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Draw Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw text centered about an anchor point")
+                .field(INT, "textId", "id of bitmap")
+                .field(FLOAT, "x",
+                        "The x-position of the anchor point")
+                .field(FLOAT, "y",
+                        "The y-position of the anchor point")
+                .field(FLOAT, "panX",
+                        "The pan from left(-1) to right(1) 0 being centered")
+                .field(FLOAT, "panY",
+                        "The pan from top(-1) to bottom(1) 0 being centered")
+                .field(INT, "flags",
+                        "Change the behaviour");
+
+    }
+
+
     float[] mBounds = new float[4];
 
     private float getHorizontalOffset() {
@@ -194,8 +211,9 @@
 
     @Override
     public void paint(PaintContext context) {
-        context.getTextBounds(mTextID, 0, -1,
-                (mFlags & ANCHOR_MONOSPACE_MEASURE) != 0, mBounds);
+        int flags = ((mFlags & ANCHOR_MONOSPACE_MEASURE) != 0)
+                ? PaintContext.TEXT_MEASURE_MONOSPACE_WIDTH : 0;
+        context.getTextBounds(mTextID, 0, -1, flags, mBounds);
         float x = mOutX + getHorizontalOffset();
         float y = (Float.isNaN(mOutPanY)) ? mOutY : mOutY + getVerticalOffset();
         context.drawTextRun(mTextID, 0, -1, 0, 1, x, y,
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextOnPath.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextOnPath.java
index b1a0172..d69362b 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextOnPath.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextOnPath.java
@@ -15,78 +15,117 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.operations.Utils.floatToString;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
 /**
  * Draw text along a path.
  */
-public class DrawTextOnPath extends PaintOperation {
-    public static final Companion COMPANION = new Companion();
+public class DrawTextOnPath extends PaintOperation implements VariableSupport  {
+    private static final int OP_CODE = Operations.DRAW_TEXT_ON_PATH;
+    private static final String CLASS_NAME = "DrawTextOnPath";
     int mPathId;
     public int mTextId;
     float mVOffset;
     float mHOffset;
+    float mOutVOffset;
+    float mOutHOffset;
 
     public DrawTextOnPath(int textId, int pathId, float hOffset, float vOffset) {
         mPathId = pathId;
         mTextId = textId;
-        mHOffset = vOffset;
-        mVOffset = hOffset;
+        mOutHOffset = mHOffset = vOffset;
+        mOutVOffset = mVOffset = hOffset;
+    }
+
+
+    @Override
+    public void updateVariables(RemoteContext context) {
+        mOutHOffset = (Float.isNaN(mHOffset))
+                ? context.getFloat(Utils.idFromNan(mHOffset)) : mHOffset;
+        mOutVOffset = (Float.isNaN(mVOffset))
+                ? context.getFloat(Utils.idFromNan(mVOffset)) : mVOffset;
+
+    }
+
+    @Override
+    public void registerListening(RemoteContext context) {
+        if (Float.isNaN(mHOffset)) {
+            context.listensTo(Utils.idFromNan(mHOffset), this);
+        }
+        if (Float.isNaN(mVOffset)) {
+            context.listensTo(Utils.idFromNan(mVOffset), this);
+        }
     }
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mTextId, mPathId, mHOffset, mVOffset);
+        apply(buffer, mTextId, mPathId, mHOffset, mVOffset);
     }
 
     @Override
     public String toString() {
         return "DrawTextOnPath [" + mTextId + "] [" + mPathId + "] "
-                + mHOffset + ", " + mVOffset;
+                + floatToString(mHOffset, mOutHOffset) + ", "
+                + floatToString(mVOffset, mOutVOffset);
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int textId = buffer.readInt();
+        int pathId = buffer.readInt();
+        float hOffset = buffer.readFloat();
+        float vOffset = buffer.readFloat();
+        DrawTextOnPath op = new DrawTextOnPath(textId, pathId, hOffset, vOffset);
+        operations.add(op);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int textId = buffer.readInt();
-            int pathId = buffer.readInt();
-            float hOffset = buffer.readFloat();
-            float vOffset = buffer.readFloat();
-            DrawTextOnPath op = new DrawTextOnPath(textId, pathId, hOffset, vOffset);
-            operations.add(op);
-        }
+    public static String name() {
+        return "DrawTextOnPath";
+    }
 
-        @Override
-        public String name() {
-            return "DrawTextOnPath";
-        }
 
-        @Override
-        public int id() {
-            return Operations.DRAW_TEXT_ON_PATH;
-        }
+    public static int id() {
+        return Operations.DRAW_TEXT_ON_PATH;
+    }
 
-        public void apply(WireBuffer buffer, int textId, int pathId, float hOffset, float vOffset) {
-            buffer.start(Operations.DRAW_TEXT_ON_PATH);
-            buffer.writeInt(textId);
-            buffer.writeInt(pathId);
-            buffer.writeFloat(hOffset);
-            buffer.writeFloat(vOffset);
-        }
+    public static void apply(WireBuffer buffer, int textId, int pathId,
+                             float hOffset, float vOffset) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(textId);
+        buffer.writeInt(pathId);
+        buffer.writeFloat(hOffset);
+        buffer.writeFloat(vOffset);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Draw Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw text along path object")
+                .field(INT, "textId",
+                        "id of the text")
+                .field(INT, "pathId",
+                        "id of the path")
+                .field(FLOAT, "xOffset",
+                        "x Shift of the text")
+                .field(FLOAT, "yOffset",
+                        "y Shift of the text");
     }
 
     @Override
     public void paint(PaintContext context) {
-        context.drawTextOnPath(mTextId, mPathId, mHOffset, mVOffset);
+        context.drawTextOnPath(mTextId, mPathId, mOutHOffset, mOutVOffset);
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTweenPath.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTweenPath.java
index 48fc94e..3547263 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTweenPath.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTweenPath.java
@@ -15,20 +15,30 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.operations.Utils.floatToString;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
-public class DrawTweenPath extends PaintOperation {
-    public static final Companion COMPANION = new Companion();
+public class DrawTweenPath extends PaintOperation implements VariableSupport {
+    private static final int OP_CODE = Operations.DRAW_TWEEN_PATH;
+    private static final String CLASS_NAME = "DrawTweenPath";
     float mTween;
     float mStart;
     float mStop;
+    float mOutTween;
+    float mOutStart;
+    float mOutStop;
     int mPath1Id;
     int mPath2Id;
 
@@ -38,16 +48,39 @@
             float tween,
             float start,
             float stop) {
-        mTween = tween;
-        mStart = start;
-        mStop = stop;
+        mOutTween = mTween = tween;
+        mOutStart = mStart = start;
+        mOutStop = mStop = stop;
         mPath1Id = path1Id;
         mPath2Id = path2Id;
     }
 
     @Override
+    public void updateVariables(RemoteContext context) {
+        mOutTween = (Float.isNaN(mTween))
+                ? context.getFloat(Utils.idFromNan(mTween)) : mTween;
+        mOutStart = (Float.isNaN(mStart))
+                ? context.getFloat(Utils.idFromNan(mStart)) : mStart;
+        mOutStop = (Float.isNaN(mStop))
+                ? context.getFloat(Utils.idFromNan(mStop)) : mStop;
+    }
+
+    @Override
+    public void registerListening(RemoteContext context) {
+        if (Float.isNaN(mTween)) {
+            context.listensTo(Utils.idFromNan(mTween), this);
+        }
+        if (Float.isNaN(mStart)) {
+            context.listensTo(Utils.idFromNan(mStart), this);
+        }
+        if (Float.isNaN(mStop)) {
+            context.listensTo(Utils.idFromNan(mStop), this);
+        }
+    }
+
+    @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mPath1Id,
+        apply(buffer, mPath1Id,
                 mPath2Id,
                 mTween,
                 mStart,
@@ -57,58 +90,74 @@
     @Override
     public String toString() {
         return "DrawTweenPath " + mPath1Id + " " + mPath2Id
-                + " " + mTween + " " + mStart + " "
-                + "- " + mStop;
+                + " " + floatToString(mTween, mOutTween)  + " "
+                + floatToString(mStart, mOutStart) + " "
+                + "- " + floatToString(mStop, mOutStop);
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int path1Id = buffer.readInt();
-            int path2Id = buffer.readInt();
-            float tween = buffer.readFloat();
-            float start = buffer.readFloat();
-            float stop = buffer.readFloat();
-            DrawTweenPath op = new DrawTweenPath(path1Id, path2Id,
-                    tween, start, stop);
-            operations.add(op);
-        }
-
-        @Override
-        public String name() {
-            return "DrawTweenPath";
-        }
-
-        @Override
-        public int id() {
-            return Operations.DRAW_TWEEN_PATH;
-        }
-
-        public void apply(WireBuffer buffer,
-                          int path1Id,
-                          int path2Id,
-                          float tween,
-                          float start,
-                          float stop) {
-            buffer.start(Operations.DRAW_TWEEN_PATH);
-            buffer.writeInt(path1Id);
-            buffer.writeInt(path2Id);
-            buffer.writeFloat(tween);
-            buffer.writeFloat(start);
-            buffer.writeFloat(stop);
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int path1Id = buffer.readInt();
+        int path2Id = buffer.readInt();
+        float tween = buffer.readFloat();
+        float start = buffer.readFloat();
+        float stop = buffer.readFloat();
+        DrawTweenPath op = new DrawTweenPath(path1Id, path2Id,
+                tween, start, stop);
+        operations.add(op);
     }
 
+
+    public static String name() {
+        return "DrawTweenPath";
+    }
+
+
+    public static int id() {
+        return Operations.DRAW_TWEEN_PATH;
+    }
+
+    public static void apply(WireBuffer buffer,
+                      int path1Id,
+                      int path2Id,
+                      float tween,
+                      float start,
+                      float stop) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(path1Id);
+        buffer.writeInt(path2Id);
+        buffer.writeFloat(tween);
+        buffer.writeFloat(start);
+        buffer.writeFloat(stop);
+    }
+
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Draw Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw text along path object")
+                .field(INT, "pathId1",
+                        "id of path 1")
+                .field(INT, "pathId2",
+                        "id of path 2")
+                .field(FLOAT, "tween",
+                        "interpolate between the two paths")
+                .field(FLOAT, "start",
+                        "trim the start of the path")
+                .field(FLOAT, "yOffset",
+                        "trim the end of the path");
+
+    }
+
+
     @Override
     public void paint(PaintContext context) {
         context.drawTweenPath(mPath1Id,
                 mPath2Id,
-                mTween,
-                mStart,
-                mStop);
+                mOutTween,
+                mOutStart,
+                mOutStop);
     }
 
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatConstant.java b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatConstant.java
index 576b53f..31b8ff6 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatConstant.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatConstant.java
@@ -15,11 +15,14 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
@@ -27,10 +30,10 @@
  * Operation to deal with Text data
  */
 public class FloatConstant implements Operation {
+    private static final int OP_CODE = Operations.DATA_FLOAT;
+    private static final String CLASS_NAME = "FloatConstant";
     public int mTextId;
     public float mValue;
-    public static final Companion COMPANION = new Companion();
-    public static final int MAX_STRING_SIZE = 4000;
 
     public FloatConstant(int textId, float value) {
         this.mTextId = textId;
@@ -39,46 +42,52 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mTextId, mValue);
+        apply(buffer, mTextId, mValue);
     }
 
     @Override
     public String toString() {
-        return "FloatConstant[" + mTextId + "] = " + mValue + "";
+        return "FloatConstant[" + mTextId + "] = " + mValue;
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {}
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public String name() {
-            return "FloatExpression";
-        }
 
-        @Override
-        public int id() {
-            return Operations.DATA_FLOAT;
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        /**
-         * Writes out the operation to the buffer
-         * @param buffer
-         * @param textId
-         * @param value
-         */
-        public void apply(WireBuffer buffer, int textId, float value) {
-            buffer.start(Operations.DATA_FLOAT);
-            buffer.writeInt(textId);
-            buffer.writeFloat(value);
-        }
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer write command to this buffer
+     * @param id     the id
+     * @param value  the value of the float
+     */
+    public static void apply(WireBuffer buffer, int id, float value) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(id);
+        buffer.writeFloat(value);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int textId = buffer.readInt();
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int textId = buffer.readInt();
 
-            float value = buffer.readFloat();
-            operations.add(new FloatConstant(textId, value));
-        }
+        float value = buffer.readFloat();
+        operations.add(new FloatConstant(textId, value));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Expressions Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("A float and its associated id")
+                .field(INT, "id", "id of float")
+                .field(FLOAT, "value",
+                        "32-bit float value");
+
     }
 
     @Override
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatExpression.java b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatExpression.java
index 354f41b..e3df1eb 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatExpression.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatExpression.java
@@ -15,13 +15,19 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT_ARRAY;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.SHORT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.operations.utilities.AnimatedFloatExpression;
+import com.android.internal.widget.remotecompose.core.operations.utilities.NanMap;
 import com.android.internal.widget.remotecompose.core.operations.utilities.easing.FloatAnimation;
 
 import java.util.Arrays;
@@ -35,6 +41,8 @@
  * The floats represent a RPN style calculator
  */
 public class FloatExpression implements Operation, VariableSupport {
+    private static final int OP_CODE = Operations.ANIMATED_FLOAT;
+    private static final String CLASS_NAME = "FloatExpression";
     public int mId;
     public float[] mSrcValue;
     public float[] mSrcAnimation;
@@ -42,8 +50,7 @@
     public float[] mPreCalcValue;
     private float mLastChange = Float.NaN;
     AnimatedFloatExpression mExp = new AnimatedFloatExpression();
-    public static final Companion COMPANION = new Companion();
-    public static final int MAX_STRING_SIZE = 4000;
+    public static final int MAX_EXPRESSION_SIZE = 32;
 
     public FloatExpression(int id, float[] value, float[] animation) {
         this.mId = id;
@@ -59,11 +66,12 @@
         if (mPreCalcValue == null || mPreCalcValue.length != mSrcValue.length) {
             mPreCalcValue = new float[mSrcValue.length];
         }
-        //Utils.log("updateVariables ");
+
         boolean value_changed = false;
         for (int i = 0; i < mSrcValue.length; i++) {
             float v = mSrcValue[i];
-            if (Float.isNaN(v) && !AnimatedFloatExpression.isMathOperator(v)) {
+            if (Float.isNaN(v) && !AnimatedFloatExpression.isMathOperator(v)
+                    && !NanMap.isDataVariable(v)) {
                 float newValue = context.getFloat(Utils.idFromNan(v));
                 if (mFloatAnimation != null) {
                     if (mPreCalcValue[i] != newValue) {
@@ -91,9 +99,9 @@
 
     @Override
     public void registerListening(RemoteContext context) {
-        for (int i = 0; i < mSrcValue.length; i++) {
-            float v = mSrcValue[i];
-            if (Float.isNaN(v) && !AnimatedFloatExpression.isMathOperator(v)) {
+        for (float v : mSrcValue) {
+            if (Float.isNaN(v) && !AnimatedFloatExpression.isMathOperator(v)
+                    && !NanMap.isDataVariable(v)) {
                 context.listensTo(Utils.idFromNan(v), this);
             }
         }
@@ -110,13 +118,14 @@
             float f = mFloatAnimation.get(t - mLastChange);
             context.loadFloat(mId, f);
         } else {
-            context.loadFloat(mId, mExp.eval(Arrays.copyOf(mPreCalcValue, mPreCalcValue.length)));
+            context.loadFloat(mId, mExp.eval(context.getCollectionsAccess(),
+                    Arrays.copyOf(mPreCalcValue, mPreCalcValue.length)));
         }
     }
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mId, mSrcValue, mSrcAnimation);
+        apply(buffer, mId, mSrcValue, mSrcAnimation);
     }
 
     @Override
@@ -124,78 +133,96 @@
         String[] labels = new String[mSrcValue.length];
         for (int i = 0; i < mSrcValue.length; i++) {
             if (Float.isNaN(mSrcValue[i])) {
-                labels[i] = "[" + Utils.idFromNan(mSrcValue[i]) + "]";
+                labels[i] = "[" + Utils.idStringFromNan(mSrcValue[i]) + "]";
             }
-
+        }
+        if (mPreCalcValue == null) {
+            return "FloatExpression[" + mId + "] = ("
+                    + AnimatedFloatExpression.toString(mSrcValue, labels) + ")";
         }
         return "FloatExpression[" + mId + "] = ("
                 + AnimatedFloatExpression.toString(mPreCalcValue, labels) + ")";
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer    The buffer to write to
+     * @param id        the id of the resulting float
+     * @param value     the float expression array
+     * @param animation the animation expression array
+     */
+    public static void apply(WireBuffer buffer, int id, float[] value, float[] animation) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(id);
+
+        int len = value.length;
+        if (animation != null) {
+            len |= (animation.length << 16);
+        }
+        buffer.writeInt(len);
+
+        for (float v : value) {
+            buffer.writeFloat(v);
+        }
+        if (animation != null) {
+            for (float v : animation) {
+                buffer.writeFloat(v);
+            }
         }
 
-        @Override
-        public String name() {
-            return "FloatExpression";
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int id = buffer.readInt();
+        int len = buffer.readInt();
+        int valueLen = len & 0xFFFF;
+        if (valueLen > MAX_EXPRESSION_SIZE) {
+            throw new RuntimeException("Float expression to long");
+        }
+        int animLen = (len >> 16) & 0xFFFF;
+        float[] values = new float[valueLen];
+        for (int i = 0; i < values.length; i++) {
+            values[i] = buffer.readFloat();
         }
 
-        @Override
-        public int id() {
-            return Operations.ANIMATED_FLOAT;
+        float[] animation;
+        if (animLen != 0) {
+            animation = new float[animLen];
+            for (int i = 0; i < animation.length; i++) {
+                animation[i] = buffer.readFloat();
+            }
+        } else {
+            animation = null;
         }
+        operations.add(new FloatExpression(id, values, animation));
+    }
 
-        /**
-         * Writes out the operation to the buffer
-         * @param buffer
-         * @param id
-         * @param value
-         * @param animation
-         */
-        public void apply(WireBuffer buffer, int id, float[] value, float[] animation) {
-            buffer.start(Operations.ANIMATED_FLOAT);
-            buffer.writeInt(id);
-
-            int len = value.length;
-            if (animation != null) {
-                len |= (animation.length << 16);
-            }
-            buffer.writeInt(len);
-
-            for (int i = 0; i < value.length; i++) {
-                buffer.writeFloat(value[i]);
-            }
-            if (animation != null) {
-                for (int i = 0; i < animation.length; i++) {
-                    buffer.writeFloat(animation[i]);
-                }
-            }
-
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int id = buffer.readInt();
-            int len = buffer.readInt();
-            int valueLen = len & 0xFFFF;
-            int animLen = (len >> 16) & 0xFFFF;
-            float[] values = new float[valueLen];
-            for (int i = 0; i < values.length; i++) {
-                values[i] = buffer.readFloat();
-            }
-
-            float[] animation;
-            if (animLen != 0) {
-                animation = new float[animLen];
-                for (int i = 0; i < animation.length; i++) {
-                    animation[i] = buffer.readFloat();
-                }
-            } else {
-                animation = null;
-            }
-            operations.add(new FloatExpression(id, values, animation));
-        }
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Expressions Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("A Float expression")
+                .field(INT, "id", "The id of the Color")
+                .field(SHORT, "expression_length", "expression length")
+                .field(SHORT, "animation_length", "animation description length")
+                .field(FLOAT_ARRAY, "expression", "expression_length",
+                        "Sequence of Floats representing and expression")
+                .field(FLOAT_ARRAY, "AnimationSpec", "animation_length",
+                        "Sequence of Floats representing animation curve")
+                .field(FLOAT, "duration", "> time in sec")
+                .field(INT, "bits", "> WRAP|INITALVALUE | TYPE ")
+                .field(FLOAT_ARRAY, "spec", "> [SPEC PARAMETERS] ")
+                .field(FLOAT, "initialValue", "> [Initial value] ")
+                .field(FLOAT, "wrapValue", "> [Wrap value] ");
     }
 
     @Override
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/Header.java b/core/java/com/android/internal/widget/remotecompose/core/operations/Header.java
index 9a1f37b..099bce88 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/Header.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/Header.java
@@ -24,7 +24,6 @@
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
-import com.android.internal.widget.remotecompose.core.documentation.DocumentedCompanionOperation;
 
 import java.util.List;
 
@@ -35,6 +34,8 @@
  * as the dimensions of the document in pixels.
  */
 public class Header implements RemoteComposeOperation {
+    private static final int OP_CODE = Operations.HEADER;
+    private static final String CLASS_NAME = "Header";
     public static final int MAJOR_VERSION = 0;
     public static final int MINOR_VERSION = 1;
     public static final int PATCH_VERSION = 0;
@@ -49,7 +50,6 @@
     float mDensity;
     long mCapabilities;
 
-    public static final Companion COMPANION = new Companion();
 
     /**
      * It encodes the version of the document (following semantic versioning) as well
@@ -76,7 +76,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mWidth, mHeight, mDensity, mCapabilities);
+        apply(buffer, mWidth, mHeight, mDensity, mCapabilities);
     }
 
     @Override
@@ -96,59 +96,51 @@
         return toString();
     }
 
-    public static class Companion implements DocumentedCompanionOperation {
-        private Companion() {
-        }
-
-        @Override
-        public String name() {
-            return "Header";
-        }
-
-        @Override
-        public int id() {
-            return Operations.HEADER;
-        }
-
-        public void apply(WireBuffer buffer, int width, int height,
-                          float density, long capabilities) {
-            buffer.start(Operations.HEADER);
-            buffer.writeInt(MAJOR_VERSION); // major version number of the protocol
-            buffer.writeInt(MINOR_VERSION); // minor version number of the protocol
-            buffer.writeInt(PATCH_VERSION); // patch version number of the protocol
-            buffer.writeInt(width);
-            buffer.writeInt(height);
-            // buffer.writeFloat(density);
-            buffer.writeLong(capabilities);
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int majorVersion = buffer.readInt();
-            int minorVersion = buffer.readInt();
-            int patchVersion = buffer.readInt();
-            int width = buffer.readInt();
-            int height = buffer.readInt();
-            // float density = buffer.readFloat();
-            float density = 1f;
-            long capabilities = buffer.readLong();
-            Header header = new Header(majorVersion, minorVersion, patchVersion,
-                    width, height, density, capabilities);
-            operations.add(header);
-        }
-
-        @Override
-        public void documentation(DocumentationBuilder doc) {
-            doc.operation("Protocol Operations", id(), name())
-                    .description("Document metadata, containing the version,"
-                          + " original size & density, capabilities mask")
-                    .field(INT, "MAJOR_VERSION", "Major version")
-                    .field(INT, "MINOR_VERSION", "Minor version")
-                    .field(INT, "PATCH_VERSION", "Patch version")
-                    .field(INT, "WIDTH", "Major version")
-                    .field(INT, "HEIGHT", "Major version")
-                    // .field(FLOAT, "DENSITY", "Major version")
-                    .field(LONG, "CAPABILITIES", "Major version");
-        }
+    public static String name() {
+        return CLASS_NAME;
     }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static void apply(WireBuffer buffer, int width, int height,
+                             float density, long capabilities) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(MAJOR_VERSION); // major version number of the protocol
+        buffer.writeInt(MINOR_VERSION); // minor version number of the protocol
+        buffer.writeInt(PATCH_VERSION); // patch version number of the protocol
+        buffer.writeInt(width);
+        buffer.writeInt(height);
+        // buffer.writeFloat(density); TODO fix or remove
+        buffer.writeLong(capabilities);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int majorVersion = buffer.readInt();
+        int minorVersion = buffer.readInt();
+        int patchVersion = buffer.readInt();
+        int width = buffer.readInt();
+        int height = buffer.readInt();
+        // float density = buffer.readFloat();
+        float density = 1f;
+        long capabilities = buffer.readLong();
+        Header header = new Header(majorVersion, minorVersion, patchVersion,
+                width, height, density, capabilities);
+        operations.add(header);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Protocol Operations", OP_CODE, CLASS_NAME)
+                .description("Document metadata, containing the version,"
+                        + " original size & density, capabilities mask")
+                .field(INT, "MAJOR_VERSION", "Major version")
+                .field(INT, "MINOR_VERSION", "Minor version")
+                .field(INT, "PATCH_VERSION", "Patch version")
+                .field(INT, "WIDTH", "Major version")
+                .field(INT, "HEIGHT", "Major version")
+                // .field(FLOAT, "DENSITY", "Major version")
+                .field(LONG, "CAPABILITIES", "Major version");
+    }
+
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/IntegerExpression.java b/core/java/com/android/internal/widget/remotecompose/core/operations/IntegerExpression.java
index d52df5d..11730f3 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/IntegerExpression.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/IntegerExpression.java
@@ -15,12 +15,15 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT_ARRAY;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.operations.utilities.IntegerExpressionEvaluator;
 
 import java.util.Arrays;
@@ -34,13 +37,14 @@
  * The floats represent a RPN style calculator
  */
 public class IntegerExpression implements Operation, VariableSupport {
+    private static final int OP_CODE = Operations.INTEGER_EXPRESSION;
+    private static final String CLASS_NAME = "IntegerExpression";
     public int mId;
     private int mMask;
     private int mPreMask;
     public int[] mSrcValue;
     public int[] mPreCalcValue;
     private float mLastChange = Float.NaN;
-    public static final Companion COMPANION = new Companion();
     public static final int MAX_STRING_SIZE = 4000;
     IntegerExpressionEvaluator mExp = new IntegerExpressionEvaluator();
 
@@ -89,7 +93,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mId, mMask, mSrcValue);
+        apply(buffer, mId, mMask, mSrcValue);
     }
 
     @Override
@@ -112,51 +116,57 @@
         return "IntegerExpression[" + mId + "] = (" + s + ")";
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer buffer to write to
+     * @param id     the id of the integer
+     * @param mask   the mask bits of ints & operators or variables
+     * @param value  array of integers to be evaluated
+     */
+    public static void apply(WireBuffer buffer, int id, int mask, int[] value) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(id);
+        buffer.writeInt(mask);
+        buffer.writeInt(value.length);
+        for (int opMask : value) {
+            buffer.writeInt(opMask);
+        }
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int id = buffer.readInt();
+        int mask = buffer.readInt();
+        int len = buffer.readInt();
+
+        int[] values = new int[len];
+        for (int i = 0; i < values.length; i++) {
+            values[i] = buffer.readInt();
         }
 
-        @Override
-        public String name() {
-            return "FloatExpression";
-        }
+        operations.add(new IntegerExpression(id, mask, values));
+    }
 
-        @Override
-        public int id() {
-            return Operations.INTEGER_EXPRESSION;
-        }
-
-        /**
-         * Writes out the operation to the buffer
-         *
-         * @param buffer
-         * @param id
-         * @param mask
-         * @param value
-         */
-        public void apply(WireBuffer buffer, int id, int mask, int[] value) {
-            buffer.start(Operations.INTEGER_EXPRESSION);
-            buffer.writeInt(id);
-            buffer.writeInt(mask);
-            buffer.writeInt(value.length);
-            for (int i = 0; i < value.length; i++) {
-                buffer.writeInt(value[i]);
-            }
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int id = buffer.readInt();
-            int mask = buffer.readInt();
-            int len = buffer.readInt();
-
-            int[] values = new int[len];
-            for (int i = 0; i < values.length; i++) {
-                values[i] = buffer.readInt();
-            }
-
-            operations.add(new IntegerExpression(id, mask, values));
-        }
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Data Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Expression that computes an integer")
+                .field(INT, "id", "id of integer")
+                .field(INT, "mask",
+                        "bits representing operators or other id's")
+                .field(INT, "length",
+                        "length of array")
+                .field(INT_ARRAY, "values", "length",
+                        "Array of ints");
     }
 
     @Override
@@ -166,8 +176,9 @@
 
     /**
      * given the "i" position in the mask is this an ID
-     * @param mask 32 bit mask used for defining numbers vs other
-     * @param i the bit in question
+     *
+     * @param mask  32 bit mask used for defining numbers vs other
+     * @param i     the bit in question
      * @param value the value
      * @return true if this is an ID
      */
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRestore.java b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRestore.java
index 0dad45c..f3f9a51 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRestore.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRestore.java
@@ -15,24 +15,30 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
 public class MatrixRestore extends PaintOperation {
-    public static final Companion COMPANION = new Companion();
-
+    private static final int OP_CODE = Operations.MATRIX_RESTORE;
+    private static final String CLASS_NAME = "MatrixRestore";
     public MatrixRestore() {
     }
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer);
+        apply(buffer);
+    }
+
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        MatrixRestore op = new MatrixRestore();
+        operations.add(op);
     }
 
     @Override
@@ -40,32 +46,28 @@
         return "MatrixRestore";
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-
-            MatrixRestore op = new MatrixRestore();
-            operations.add(op);
-        }
-
-        @Override
-        public String name() {
-            return "MatrixRestore";
-        }
-
-        @Override
-        public int id() {
-            return Operations.MATRIX_RESTORE;
-        }
-
-        public void apply(WireBuffer buffer) {
-            buffer.start(Operations.MATRIX_RESTORE);
-        }
+    public static String name() {
+        return CLASS_NAME;
     }
 
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static void apply(WireBuffer buffer) {
+        buffer.start(OP_CODE);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Restore the matrix and clip");
+    }
+
+
     @Override
     public void paint(PaintContext context) {
         context.matrixRestore();
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRotate.java b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRotate.java
index bbf4135..9cc82fc 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRotate.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRotate.java
@@ -15,29 +15,81 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
 
 public class MatrixRotate extends DrawBase3 {
-    public static final Companion COMPANION =
-            new Companion(Operations.MATRIX_ROTATE) {
-                @Override
-                public Operation construct(float rotate,
-                                           float pivotX,
-                                           float pivotY
-                ) {
-                    return new MatrixRotate(rotate, pivotX, pivotY);
-                }
-            };
+    public static final int OP_CODE = Operations.MATRIX_ROTATE;
+    private static final String CLASS_NAME = "MatrixRotate";
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Maker m = new Maker() {
+            @Override
+            public DrawBase3 create(float v1, float v2, float v3) {
+                return new MatrixRotate(v1, v2, v3);
+            }
+        };
+        read(m, buffer, operations);
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("apply rotation to matrix")
+                .field(FLOAT, "rotate", "Angle to rotate")
+                .field(FLOAT, "pivotX", "X Pivot point")
+                .field(FLOAT, "pivotY", "Y Pivot point");
+    }
+
+
+    protected void write(WireBuffer buffer,
+                         float v1,
+                         float v2,
+                         float v3) {
+        apply(buffer, v1, v2, v3);
+    }
 
     public MatrixRotate(float rotate, float pivotX, float pivotY) {
         super(rotate, pivotX, pivotY);
-        mName = "MatrixRotate";
+        mName = CLASS_NAME;
     }
 
     @Override
     public void paint(PaintContext context) {
         context.matrixRotate(mV1, mV2, mV3);
     }
+
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer The buffer to write into
+     * @param x1 Angle to rotate
+     * @param y1 X Pivot point
+     * @param x2 Y Pivot point
+     */
+    public static void apply(WireBuffer buffer,
+                             float x1,
+                             float y1,
+                             float x2) {
+        buffer.start(OP_CODE);
+        buffer.writeFloat(x1);
+        buffer.writeFloat(y1);
+        buffer.writeFloat(x2);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSave.java b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSave.java
index d3d5bfb..a47ed6b 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSave.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSave.java
@@ -15,25 +15,22 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
 public class MatrixSave extends PaintOperation {
-    public static final Companion COMPANION = new Companion();
-
-    public MatrixSave() {
-
-    }
+    private static final int OP_CODE = Operations.MATRIX_SAVE;
+    private static final String CLASS_NAME = "MatrixSave";
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer);
+        apply(buffer);
     }
 
     @Override
@@ -41,30 +38,29 @@
         return "MatrixSave;";
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        MatrixSave op = new MatrixSave();
+        operations.add(op);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-            MatrixSave op = new MatrixSave();
-            operations.add(op);
-        }
 
-        @Override
-        public String name() {
-            return "Matrix";
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        @Override
-        public int id() {
-            return Operations.MATRIX_SAVE;
-        }
+    public static void apply(WireBuffer buffer) {
+        buffer.start(Operations.MATRIX_SAVE);
+    }
 
-        public void apply(WireBuffer buffer) {
-            buffer.start(Operations.MATRIX_SAVE);
-        }
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Save the matrix and clip to a stack");
     }
 
     @Override
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixScale.java b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixScale.java
index 04b940b..769e798 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixScale.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixScale.java
@@ -15,30 +15,81 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
 
 public class MatrixScale extends DrawBase4 {
-    public static final Companion COMPANION =
-            new Companion(Operations.MATRIX_SCALE) {
-                @Override
-                public Operation construct(float scaleX,
-                                           float scaleY,
-                                           float centerX,
-                                           float centerY
-                ) {
-                    return new MatrixScale(scaleX, scaleY, centerX, centerY);
-                }
-            };
+    public static final int OP_CODE = Operations.MATRIX_SCALE;
+    public static final String CLASS_NAME = "MatrixScale";
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Maker m = MatrixScale::new;
+        read(m, buffer, operations);
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+
+    protected void write(WireBuffer buffer,
+                         float v1,
+                         float v2,
+                         float v3,
+                         float v4) {
+        apply(buffer, v1, v2, v3, v4);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw the specified Oval")
+                .field(FLOAT, "scaleX",
+                        "The amount to scale in X")
+                .field(FLOAT, "scaleY",
+                        "The amount to scale in Y")
+                .field(FLOAT, "pivotX",
+                        "The x-coordinate for the pivot point")
+                .field(FLOAT, "pivotY",
+                        "The y-coordinate for the pivot point");
+    }
 
     public MatrixScale(float scaleX, float scaleY, float centerX, float centerY) {
         super(scaleX, scaleY, centerX, centerY);
-        mName = "MatrixScale";
+        mName = CLASS_NAME;
     }
 
     @Override
     public void paint(PaintContext context) {
         context.matrixScale(mX1, mY1, mX2, mY2);
     }
+
+    /**
+     * Writes out the DrawOval to the buffer
+     *
+     * @param buffer buffer to write to
+     * @param x1     start x of DrawOval
+     * @param y1     start y of the DrawOval
+     * @param x2     end x of the DrawOval
+     * @param y2     end y of the DrawOval
+     */
+    public static void apply(WireBuffer buffer,
+                             float x1,
+                             float y1,
+                             float x2,
+                             float y2) {
+        write(buffer, OP_CODE, x1, y1, x2, y2);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSkew.java b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSkew.java
index a388899..34f71b4 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSkew.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSkew.java
@@ -15,65 +15,74 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
-import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
-public class MatrixSkew extends PaintOperation {
-    public static final Companion COMPANION = new Companion();
-    float mSkewX, mSkewY;
+public class MatrixSkew extends DrawBase2 {
+    public static final int OP_CODE = Operations.MATRIX_SKEW;
+    public static final String CLASS_NAME = "MatrixSkew";
+
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Maker m = MatrixSkew::new;
+        read(m, buffer, operations);
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+
+    protected void write(WireBuffer buffer,
+                         float v1,
+                         float v2) {
+        apply(buffer, v1, v2);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Current matrix with the specified skew.")
+                .field(FLOAT, "skewX",
+                        "The amount to skew in X")
+                .field(FLOAT, "skewY",
+                        "The amount to skew in Y");
+    }
+
 
     public MatrixSkew(float skewX, float skewY) {
-        mSkewX = skewX;
-        mSkewY = skewY;
-    }
-
-    @Override
-    public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mSkewX, mSkewY);
-    }
-
-    @Override
-    public String toString() {
-        return "DrawArc " + mSkewY + ", " + mSkewY + ";";
-    }
-
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            float skewX = buffer.readFloat();
-            float skewY = buffer.readFloat();
-            MatrixSkew op = new MatrixSkew(skewX, skewY);
-            operations.add(op);
-        }
-
-        @Override
-        public String name() {
-            return "Matrix";
-        }
-
-        @Override
-        public int id() {
-            return Operations.MATRIX_SKEW;
-        }
-
-        public void apply(WireBuffer buffer, float skewX, float skewY) {
-            buffer.start(Operations.MATRIX_SKEW);
-            buffer.writeFloat(skewX);
-            buffer.writeFloat(skewY);
-        }
+        super(skewX, skewY);
+        mName = CLASS_NAME;
     }
 
     @Override
     public void paint(PaintContext context) {
-        context.matrixSkew(mSkewX, mSkewY);
+        context.matrixSkew(mV1, mV2);
+    }
+
+    /**
+     * Writes out the DrawOval to the buffer
+     *
+     * @param buffer buffer to write to
+     * @param x1     start x of DrawOval
+     * @param y1     start y of the DrawOval
+     */
+    public static void apply(WireBuffer buffer,
+                             float x1,
+                             float y1
+    ) {
+        write(buffer, OP_CODE, x1, y1);
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixTranslate.java b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixTranslate.java
index 4f34e98..8561343 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixTranslate.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixTranslate.java
@@ -15,28 +15,71 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
 
 public class MatrixTranslate extends DrawBase2 {
-    public static final Companion COMPANION =
-            new Companion(Operations.MATRIX_TRANSLATE) {
-                @Override
-                public Operation construct(float x1,
-                                           float y1
-                ) {
-                    return new MatrixTranslate(x1, y1);
-                }
-            };
+    public static final int OP_CODE = Operations.MATRIX_TRANSLATE;
+    public static final String CLASS_NAME = "MatrixTranslate";
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Maker m = MatrixTranslate::new;
+        read(m, buffer, operations);
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    protected void write(WireBuffer buffer,
+                         float v1,
+                         float v2) {
+        apply(buffer, v1, v2);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        "MatrixTranslate")
+                .description("Preconcat the current matrix with the specified translation")
+                .field(FLOAT, "dx",
+                        "The distance to translate in X")
+                .field(FLOAT, "dy",
+                        "The distance to translate in Y");
+
+    }
 
     public MatrixTranslate(float translateX, float translateY) {
         super(translateX, translateY);
-        mName = "MatrixTranslate";
+        mName = CLASS_NAME;
     }
 
     @Override
     public void paint(PaintContext context) {
         context.matrixTranslate(mV1, mV2);
     }
+
+    /**
+     * Writes out the DrawOval to the buffer
+     *
+     * @param buffer buffer to write to
+     * @param x1     start x of DrawOval
+     * @param y1     start y of the DrawOval
+     */
+    public static void apply(WireBuffer buffer,
+                             float x1,
+                             float y1) {
+        write(buffer, OP_CODE, x1, y1);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/NamedVariable.java b/core/java/com/android/internal/widget/remotecompose/core/operations/NamedVariable.java
index ae27f5f..2cf83cd 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/NamedVariable.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/NamedVariable.java
@@ -15,11 +15,14 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.UTF8;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
@@ -27,14 +30,16 @@
  * Operation to deal with Text data
  */
 public class NamedVariable implements Operation {
+    private static final int OP_CODE = Operations.NAMED_VARIABLE;
+    private static final String CLASS_NAME = "NamedVariable";
     public int mVarId;
     public String mVarName;
     public int mVarType;
-    public static final Companion COMPANION = new Companion();
     public static final int MAX_STRING_SIZE = 4000;
     public static final int COLOR_TYPE = 2;
     public static final int FLOAT_TYPE = 1;
     public static final int STRING_TYPE = 0;
+
     public NamedVariable(int varId, int varType, String name) {
         this.mVarId = varId;
         this.mVarType = varType;
@@ -43,7 +48,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mVarId, mVarType, mVarName);
+        apply(buffer, mVarId, mVarType, mVarName);
     }
 
     @Override
@@ -52,41 +57,44 @@
                 + Utils.trimString(mVarName, 10) + "\" type=" + mVarType;
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public String name() {
-            return "TextData";
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        @Override
-        public int id() {
-            return Operations.DATA_TEXT;
-        }
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer The buffer to write into
+     * @param varId id to label
+     * @param varType The type of variable
+     * @param text String
+     */
+    public static void apply(WireBuffer buffer, int varId, int varType, String text) {
+        buffer.start(Operations.NAMED_VARIABLE);
+        buffer.writeInt(varId);
+        buffer.writeInt(varType);
+        buffer.writeUTF8(text);
+    }
 
-        /**
-         * Writes out the operation to the buffer
-         * @param buffer
-         * @param varId
-         * @param varType
-         * @param text
-         */
-        public void apply(WireBuffer buffer, int varId, int varType, String text) {
-            buffer.start(Operations.NAMED_VARIABLE);
-            buffer.writeInt(varId);
-            buffer.writeInt(varType);
-            buffer.writeUTF8(text);
-        }
+    public static  void read(WireBuffer buffer, List<Operation> operations) {
+        int varId = buffer.readInt();
+        int varType = buffer.readInt();
+        String text = buffer.readUTF8(MAX_STRING_SIZE);
+        operations.add(new NamedVariable(varId, varType, text));
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int varId = buffer.readInt();
-            int varType = buffer.readInt();
-            String text = buffer.readUTF8(MAX_STRING_SIZE);
-            operations.add(new NamedVariable(varId, varType, text));
-        }
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Data Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Add a string name for an ID")
+                .field(INT, "varId", "id to label")
+                .field(INT, "varType", "The type of variable")
+                .field(UTF8, "name", "String");
     }
 
     @Override
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/PaintData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/PaintData.java
index 0807bcd..ae7a892 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/PaintData.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/PaintData.java
@@ -15,7 +15,9 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT_ARRAY;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
@@ -23,13 +25,15 @@
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.operations.paint.PaintBundle;
 
 import java.util.List;
 
 public class PaintData extends PaintOperation implements VariableSupport {
+    private static final int OP_CODE = Operations.PAINT_VALUES;
+    private static final String CLASS_NAME = "PaintData";
     public PaintBundle mPaintData = new PaintBundle();
-    public static final Companion COMPANION = new Companion();
     public static final int MAX_STRING_SIZE = 4000;
 
     public PaintData() {
@@ -47,7 +51,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mPaintData);
+        apply(buffer, mPaintData);
     }
 
     @Override
@@ -55,31 +59,34 @@
         return "PaintData " + "\"" + mPaintData + "\"";
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
 
-        @Override
-        public String name() {
-            return "TextData";
-        }
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public int id() {
-            return Operations.PAINT_VALUES;
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        public void apply(WireBuffer buffer, PaintBundle paintBundle) {
-            buffer.start(Operations.PAINT_VALUES);
-            paintBundle.writeBundle(buffer);
-        }
+    public static void apply(WireBuffer buffer, PaintBundle paintBundle) {
+        buffer.start(Operations.PAINT_VALUES);
+        paintBundle.writeBundle(buffer);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            PaintData data = new PaintData();
-            data.mPaintData.readBundle(buffer);
-            operations.add(data);
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        PaintData data = new PaintData();
+        data.mPaintData.readBundle(buffer);
+        operations.add(data);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Data Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Encode a Paint ")
+                .field(INT, "length", "id string")
+                .field(INT_ARRAY, "paint", "length",
+                        "path encoded as floats");
     }
 
     @Override
@@ -91,5 +98,4 @@
     public void paint(PaintContext context) {
         context.applyPaint(mPaintData);
     }
-
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/PathData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/PathData.java
index e467e7b..91352d9 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/PathData.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/PathData.java
@@ -15,18 +15,22 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT_ARRAY;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.Arrays;
 import java.util.List;
 
 public class PathData implements Operation, VariableSupport {
-    public static final Companion COMPANION = new Companion();
+    private static final int OP_CODE = Operations.DATA_PATH;
+    private static final String CLASS_NAME = "PathData";
     int mInstanceId;
     float[] mFloatPath;
     float[] mOutputPath;
@@ -52,16 +56,16 @@
 
     @Override
     public void registerListening(RemoteContext context) {
-        for (int i = 0; i < mFloatPath.length; i++) {
-            if (Float.isNaN(mFloatPath[i])) {
-                context.listensTo(Utils.idFromNan(mFloatPath[i]), this);
+        for (float v : mFloatPath) {
+            if (Float.isNaN(v)) {
+                context.listensTo(Utils.idFromNan(v), this);
             }
         }
     }
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mInstanceId, mOutputPath);
+        apply(buffer, mInstanceId, mOutputPath);
     }
 
     @Override
@@ -113,42 +117,45 @@
     public static final float CLOSE_NAN = Utils.asNan(CLOSE);
     public static final float DONE_NAN = Utils.asNan(DONE);
 
-    public static class Companion implements CompanionOperation {
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        private Companion() {
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        @Override
-        public String name() {
-            return "BitmapData";
-        }
-
-        @Override
-        public int id() {
-            return Operations.DATA_PATH;
-        }
-
-        public void apply(WireBuffer buffer, int id, float[] data) {
-            buffer.start(Operations.DATA_PATH);
-            buffer.writeInt(id);
-            buffer.writeInt(data.length);
-            for (int i = 0; i < data.length; i++) {
-                buffer.writeFloat(data[i]);
-            }
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int imageId = buffer.readInt();
-            int len = buffer.readInt();
-            float[] data = new float[len];
-            for (int i = 0; i < data.length; i++) {
-                data[i] = buffer.readFloat();
-            }
-            operations.add(new PathData(imageId, data));
+    public static void apply(WireBuffer buffer, int id, float[] data) {
+        buffer.start(Operations.DATA_PATH);
+        buffer.writeInt(id);
+        buffer.writeInt(data.length);
+        for (float datum : data) {
+            buffer.writeFloat(datum);
         }
     }
 
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int imageId = buffer.readInt();
+        int len = buffer.readInt();
+        float[] data = new float[len];
+        for (int i = 0; i < data.length; i++) {
+            data[i] = buffer.readFloat();
+        }
+        operations.add(new PathData(imageId, data));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Data Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Encode a Path ")
+                .field(INT, "id", "id string")
+                .field(INT, "length", "id string")
+                .field(FLOAT_ARRAY, "pathData", "length",
+                        "path encoded as floats");
+    }
+
+
     public static String pathString(float[] path) {
         if (path == null) {
             return "null";
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentBehavior.java b/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentBehavior.java
index 997e8dc..33f997f 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentBehavior.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentBehavior.java
@@ -15,14 +15,14 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import android.util.Log;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteComposeOperation;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
@@ -33,7 +33,8 @@
  * as the dimensions of the document in pixels.
  */
 public class RootContentBehavior implements RemoteComposeOperation {
-
+    private static final int OP_CODE = Operations.ROOT_CONTENT_BEHAVIOR;
+    private static final String CLASS_NAME = "RootContentBehavior";
     int mScroll = NONE;
     int mSizing = NONE;
 
@@ -94,8 +95,6 @@
     public static final int SCALE_CROP = 5;
     public static final int SCALE_FILL_BOUNDS = 6;
 
-    public static final Companion COMPANION = new Companion();
-
     /**
      * Sets the way the player handles the content
      *
@@ -123,7 +122,7 @@
                 mScroll = scroll;
                 break;
             default: {
-                Log.e(TAG, "incorrect scroll value " + scroll);
+                System.out.println(TAG + "incorrect scroll value " + scroll);
             }
         }
         if (alignment == ALIGNMENT_CENTER) {
@@ -140,14 +139,14 @@
             if (validHorizontalAlignment && validVerticalAlignment) {
                 mAlignment = alignment;
             } else {
-                Log.e(TAG, "incorrect alignment "
+                System.out.println(TAG + "incorrect alignment "
                         + " h: " + horizontalContentAlignment
                         + " v: " + verticalContentAlignment);
             }
         }
         switch (sizing) {
             case SIZING_LAYOUT: {
-                Log.e(TAG, "sizing_layout is not yet supported");
+                System.out.println(TAG + "sizing_layout is not yet supported");
             }
             break;
             case SIZING_SCALE: {
@@ -155,12 +154,12 @@
             }
             break;
             default: {
-                Log.e(TAG, "incorrect sizing value " + sizing);
+                System.out.println(TAG + "incorrect sizing value " + sizing);
             }
         }
         if (mSizing == SIZING_LAYOUT) {
             if (mode != NONE) {
-                Log.e(TAG, "mode for sizing layout is not yet supported");
+                System.out.println(TAG + "mode for sizing layout is not yet supported");
             }
         } else if (mSizing == SIZING_SCALE) {
             switch (mode) {
@@ -173,7 +172,7 @@
                     mMode = mode;
                     break;
                 default: {
-                    Log.e(TAG, "incorrect mode for scale sizing, mode: " + mode);
+                    System.out.println(TAG + "incorrect mode for scale sizing, mode: " + mode);
                 }
             }
         }
@@ -181,7 +180,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mScroll, mAlignment, mSizing, mMode);
+        apply(buffer, mScroll, mAlignment, mSizing, mMode);
     }
 
     @Override
@@ -200,37 +199,67 @@
         return toString();
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
 
-        @Override
-        public String name() {
-            return "RootContentBehavior";
-        }
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public int id() {
-            return Operations.ROOT_CONTENT_BEHAVIOR;
-        }
 
-        public void apply(WireBuffer buffer, int scroll, int alignment, int sizing, int mode) {
-            buffer.start(Operations.ROOT_CONTENT_BEHAVIOR);
-            buffer.writeInt(scroll);
-            buffer.writeInt(alignment);
-            buffer.writeInt(sizing);
-            buffer.writeInt(mode);
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int scroll = buffer.readInt();
-            int alignment = buffer.readInt();
-            int sizing = buffer.readInt();
-            int mode = buffer.readInt();
-            RootContentBehavior rootContentBehavior =
-                    new RootContentBehavior(scroll, alignment, sizing, mode);
-            operations.add(rootContentBehavior);
-        }
+    public static void apply(WireBuffer buffer, int scroll, int alignment, int sizing, int mode) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(scroll);
+        buffer.writeInt(alignment);
+        buffer.writeInt(sizing);
+        buffer.writeInt(mode);
+    }
+
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int scroll = buffer.readInt();
+        int alignment = buffer.readInt();
+        int sizing = buffer.readInt();
+        int mode = buffer.readInt();
+        RootContentBehavior rootContentBehavior =
+                new RootContentBehavior(scroll, alignment, sizing, mode);
+        operations.add(rootContentBehavior);
+    }
+
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Protocol Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Describes the behaviour of the root")
+                .field(INT, "scroll", "scroll")
+                .possibleValues("SCROLL_HORIZONTAL", SCROLL_HORIZONTAL)
+                .possibleValues("SCROLL_VERTICAL", SCROLL_VERTICAL)
+                .field(INT, "alignment", "alignment")
+                .possibleValues("ALIGNMENT_TOP", ALIGNMENT_TOP)
+                .possibleValues("ALIGNMENT_VERTICAL_CENTER", ALIGNMENT_VERTICAL_CENTER)
+                .possibleValues("ALIGNMENT_BOTTOM", ALIGNMENT_BOTTOM)
+                .possibleValues("ALIGNMENT_START", ALIGNMENT_START)
+                .possibleValues("ALIGNMENT_START", ALIGNMENT_START)
+                .possibleValues("ALIGNMENT_END", ALIGNMENT_END)
+                .field(INT, "sizing", "sizing")
+                .possibleValues("SCALE_INSIDE", SCALE_INSIDE)
+                .possibleValues("SCALE_FIT", SCALE_FIT)
+                .possibleValues("SCALE_FILL_WIDTH", SCALE_FILL_WIDTH)
+                .possibleValues("SCALE_FILL_HEIGHT", SCALE_FILL_HEIGHT)
+                .possibleValues("SCALE_CROP", SCALE_CROP)
+                .possibleValues("SCALE_FILL_BOUNDS", SCALE_FILL_BOUNDS)
+                .field(INT, "mode", "mode")
+                .possibleValues("LAYOUT_HORIZONTAL_MATCH_PARENT", LAYOUT_HORIZONTAL_MATCH_PARENT)
+                .possibleValues("LAYOUT_HORIZONTAL_WRAP_CONTENT", LAYOUT_HORIZONTAL_WRAP_CONTENT)
+                .possibleValues("LAYOUT_HORIZONTAL_FIXED", LAYOUT_HORIZONTAL_FIXED)
+                .possibleValues("LAYOUT_VERTICAL_MATCH_PARENT", LAYOUT_VERTICAL_MATCH_PARENT)
+                .possibleValues("LAYOUT_VERTICAL_WRAP_CONTENT", LAYOUT_VERTICAL_WRAP_CONTENT)
+                .possibleValues("LAYOUT_VERTICAL_FIXED", LAYOUT_VERTICAL_FIXED)
+                .possibleValues("LAYOUT_MATCH_PARENT", LAYOUT_MATCH_PARENT)
+                .possibleValues("LAYOUT_WRAP_CONTENT", LAYOUT_WRAP_CONTENT);
+
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentDescription.java b/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentDescription.java
index 076b28e..e1533ee 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentDescription.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentDescription.java
@@ -15,12 +15,14 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteComposeOperation;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
@@ -28,10 +30,10 @@
  * Describe a content description for the document
  */
 public class RootContentDescription implements RemoteComposeOperation {
+    private static final int OP_CODE = Operations.ROOT_CONTENT_DESCRIPTION;
+    private static final String CLASS_NAME = "RootContentDescription";
     int mContentDescription;
 
-    public static final Companion COMPANION = new Companion();
-
     /**
      * Encodes a content description for the document
      *
@@ -43,7 +45,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mContentDescription);
+        apply(buffer, mContentDescription);
     }
 
     @Override
@@ -61,29 +63,32 @@
         return toString();
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {}
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public String name() {
-            return "RootContentDescription";
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        @Override
-        public int id() {
-            return Operations.ROOT_CONTENT_DESCRIPTION;
-        }
+    public static void apply(WireBuffer buffer, int contentDescription) {
+        buffer.start(Operations.ROOT_CONTENT_DESCRIPTION);
+        buffer.writeInt(contentDescription);
+    }
 
-        public void apply(WireBuffer buffer, int contentDescription) {
-            buffer.start(Operations.ROOT_CONTENT_DESCRIPTION);
-            buffer.writeInt(contentDescription);
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int contentDescription = buffer.readInt();
+        RootContentDescription header = new RootContentDescription(contentDescription);
+        operations.add(header);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int contentDescription = buffer.readInt();
-            RootContentDescription header = new RootContentDescription(contentDescription);
-            operations.add(header);
-        }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Protocol Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Content description of root")
+                .field(INT, "id", "id of Int");
+
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ShaderData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ShaderData.java
index 8463ac5..c4dde6e 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/ShaderData.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ShaderData.java
@@ -15,12 +15,19 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.BYTE;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT_ARRAY;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT_ARRAY;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.SHORT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.UTF8;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.Arrays;
 import java.util.HashMap;
@@ -32,6 +39,8 @@
  * in playback the image is decompressed
  */
 public class ShaderData implements Operation, VariableSupport {
+    private static final int OP_CODE = Operations.DATA_SHADER;
+    private static final String CLASS_NAME = "ShaderData";
     int mShaderTextId; // the actual text of a shader
     int mShaderID; // allows shaders to be referenced by number
     HashMap<String, float[]> mUniformRawFloatMap = null;
@@ -39,10 +48,6 @@
     HashMap<String, int[]> mUniformIntMap = null;
     HashMap<String, Integer> mUniformBitmapMap = null;
 
-    public static final int MAX_IMAGE_DIMENSION = 8000;
-
-    public static final Companion COMPANION = new Companion();
-
     public ShaderData(int shaderID,
                       int shaderTextId,
                       HashMap<String, float[]> floatMap,
@@ -81,7 +86,8 @@
 
     /**
      * get names of all known floats
-     * @return
+     *
+     * @return Names of all uniform floats or empty array
      */
     public String[] getUniformFloatNames() {
         if (mUniformFloatMap == null) return new String[0];
@@ -90,8 +96,9 @@
 
     /**
      * Get float values associated with the name
-     * @param name
-     * @return
+     *
+     * @param name name of uniform
+     * @return value of uniform
      */
     public float[] getUniformFloats(String name) {
         return mUniformFloatMap.get(name);
@@ -99,7 +106,8 @@
 
     /**
      * get the name of all know uniform integers
-     * @return
+     *
+     * @return  Name of all integer uniforms
      */
     public String[] getUniformIntegerNames() {
         if (mUniformIntMap == null) return new String[0];
@@ -108,8 +116,9 @@
 
     /**
      * Get Int value associated with the name
-     * @param name
-     * @return
+     *
+     * @param name Name of uniform
+     * @return value of uniform
      */
     public int[] getUniformInts(String name) {
         return mUniformIntMap.get(name);
@@ -117,7 +126,8 @@
 
     /**
      * get list of uniform Bitmaps
-     * @return
+     *
+     * @return Name of all bitmap uniforms
      */
     public String[] getUniformBitmapNames() {
         if (mUniformBitmapMap == null) return new String[0];
@@ -126,8 +136,9 @@
 
     /**
      * Get a bitmap stored under that name
-     * @param name
-     * @return
+     *
+     * @param name Name of bitmap uniform
+     * @return Bitmap ID
      */
     public int getUniformBitmapId(String name) {
         return mUniformBitmapMap.get(name);
@@ -135,7 +146,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mShaderID, mShaderTextId,
+        apply(buffer, mShaderID, mShaderTextId,
                 mUniformFloatMap, mUniformIntMap, mUniformBitmapMap);
     }
 
@@ -165,138 +176,152 @@
     public void registerListening(RemoteContext context) {
         for (String name : mUniformRawFloatMap.keySet()) {
             float[] value = mUniformRawFloatMap.get(name);
-            for (int i = 0; i < value.length; i++) {
-                if (Float.isNaN(value[i])) {
-                    context.listensTo(Utils.idFromNan(value[i]), this);
+            for (float v : value) {
+                if (Float.isNaN(v)) {
+                    context.listensTo(Utils.idFromNan(v), this);
                 }
             }
         }
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public String name() {
-            return "BitmapData";
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        @Override
-        public int id() {
-            return Operations.DATA_SHADER;
-        }
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer buffer to write into
+     * @param shaderID id of shader
+     * @param shaderTextId id of text of shader
+     * @param floatMap the map of float uniforms
+     * @param intMap the map of int uniforms
+     * @param bitmapMap the map of bitmap uniforms
+     */
+    public static void apply(WireBuffer buffer, int shaderID, int shaderTextId,
+                             HashMap<String, float[]> floatMap,
+                             HashMap<String, int[]> intMap,
+                             HashMap<String, Integer> bitmapMap) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(shaderID);
 
-        /**
-         * Writes out the operation to the buffer
-         * @param buffer
-         * @param shaderID
-         * @param shaderTextId
-         * @param floatMap
-         * @param intMap
-         * @param bitmapMap
-         */
-        public void apply(WireBuffer buffer, int shaderID, int shaderTextId,
-                          HashMap<String, float[]> floatMap,
-                          HashMap<String, int[]> intMap,
-                          HashMap<String, Integer> bitmapMap) {
-            buffer.start(Operations.DATA_SHADER);
-            buffer.writeInt(shaderID);
+        buffer.writeInt(shaderTextId);
+        int floatSize = (floatMap == null) ? 0 : floatMap.size();
+        int intSize = (intMap == null) ? 0 : intMap.size();
+        int bitmapSize = (bitmapMap == null) ? 0 : bitmapMap.size();
+        int sizes = floatSize | (intSize << 8) | (bitmapSize << 16);
+        buffer.writeInt(sizes);
 
-            buffer.writeInt(shaderTextId);
-            int floatSize = (floatMap == null) ? 0 : floatMap.size();
-            int intSize = (intMap == null) ? 0 : intMap.size();
-            int bitmapSize = (bitmapMap == null) ? 0 : bitmapMap.size();
-            int sizes = floatSize | (intSize << 8) | (bitmapSize << 16);
-            buffer.writeInt(sizes);
+        if (floatSize > 0) {
 
-            if (floatSize > 0) {
+            for (String name : floatMap.keySet()) {
+                buffer.writeUTF8(name);
+                float[] values = floatMap.get(name);
+                buffer.writeInt(values.length);
 
-                for (String name : floatMap.keySet()) {
-                    buffer.writeUTF8(name);
-                    float[] values = floatMap.get(name);
-                    buffer.writeInt(values.length);
-
-                    for (int i = 0; i < values.length; i++) {
-                        buffer.writeFloat(values[i]);
-                    }
+                for (float value : values) {
+                    buffer.writeFloat(value);
                 }
             }
+        }
 
-            if (intSize > 0) {
-                for (String name : intMap.keySet()) {
-                    buffer.writeUTF8(name);
-                    int[] values = intMap.get(name);
-                    buffer.writeInt(values.length);
-                    for (int i = 0; i < values.length; i++) {
-                        buffer.writeInt(values[i]);
-                    }
-                }
-            }
-            if (bitmapSize > 0) {
-                for (String name : bitmapMap.keySet()) {
-                    buffer.writeUTF8(name);
-                    int value = bitmapMap.get(name);
+        if (intSize > 0) {
+            for (String name : intMap.keySet()) {
+                buffer.writeUTF8(name);
+                int[] values = intMap.get(name);
+                buffer.writeInt(values.length);
+                for (int value : values) {
                     buffer.writeInt(value);
                 }
             }
         }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int shaderID = buffer.readInt();
-            int shaderTextId = buffer.readInt();
-            HashMap<String, float[]> floatMap = null;
-            HashMap<String, int[]> intMap = null;
-            HashMap<String, Integer> bitmapMap = null;
-
-            int sizes = buffer.readInt();
-
-            int floatMapSize = sizes & 0xFF;
-            if (floatMapSize > 0) {
-                floatMap = new HashMap<>();
-                for (int i = 0; i < floatMapSize; i++) {
-                    String name = buffer.readUTF8();
-                    int len = buffer.readInt();
-                    float[] val = new float[len];
-
-                    for (int j = 0; j < len; j++) {
-                        val[j] = buffer.readFloat();
-                    }
-
-                    floatMap.put(name, val);
-                }
+        if (bitmapSize > 0) {
+            for (String name : bitmapMap.keySet()) {
+                buffer.writeUTF8(name);
+                int value = bitmapMap.get(name);
+                buffer.writeInt(value);
             }
-            int intMapSize = (sizes >> 8) & 0xFF;
-
-            if (intMapSize > 0) {
-
-                intMap = new HashMap<>();
-                for (int i = 0; i < intMapSize; i++) {
-                    String name = buffer.readUTF8();
-                    int len = buffer.readInt();
-                    int[] val = new int[len];
-                    for (int j = 0; j < len; j++) {
-                        val[j] = buffer.readInt();
-                    }
-                    intMap.put(name, val);
-                }
-            }
-            int bitmapMapSize = (sizes >> 16) & 0xFF;
-
-            if (bitmapMapSize > 0) {
-                bitmapMap = new HashMap<>();
-                for (int i = 0; i < bitmapMapSize; i++) {
-                    String name = buffer.readUTF8();
-                    int val = buffer.readInt();
-                    bitmapMap.put(name, val);
-                }
-            }
-            operations.add(new ShaderData(shaderID, shaderTextId,
-                    floatMap, intMap, bitmapMap));
         }
     }
 
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int shaderID = buffer.readInt();
+        int shaderTextId = buffer.readInt();
+        HashMap<String, float[]> floatMap = null;
+        HashMap<String, int[]> intMap = null;
+        HashMap<String, Integer> bitmapMap = null;
+
+        int sizes = buffer.readInt();
+
+        int floatMapSize = sizes & 0xFF;
+        if (floatMapSize > 0) {
+            floatMap = new HashMap<>();
+            for (int i = 0; i < floatMapSize; i++) {
+                String name = buffer.readUTF8();
+                int len = buffer.readInt();
+                float[] val = new float[len];
+
+                for (int j = 0; j < len; j++) {
+                    val[j] = buffer.readFloat();
+                }
+
+                floatMap.put(name, val);
+            }
+        }
+        int intMapSize = (sizes >> 8) & 0xFF;
+
+        if (intMapSize > 0) {
+
+            intMap = new HashMap<>();
+            for (int i = 0; i < intMapSize; i++) {
+                String name = buffer.readUTF8();
+                int len = buffer.readInt();
+                int[] val = new int[len];
+                for (int j = 0; j < len; j++) {
+                    val[j] = buffer.readInt();
+                }
+                intMap.put(name, val);
+            }
+        }
+        int bitmapMapSize = (sizes >> 16) & 0xFF;
+
+        if (bitmapMapSize > 0) {
+            bitmapMap = new HashMap<>();
+            for (int i = 0; i < bitmapMapSize; i++) {
+                String name = buffer.readUTF8();
+                int val = buffer.readInt();
+                bitmapMap.put(name, val);
+            }
+        }
+        operations.add(new ShaderData(shaderID, shaderTextId,
+                floatMap, intMap, bitmapMap));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Data Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Shader")
+                .field(INT, "shaderID", "id of shader")
+                .field(BYTE, " floatSize", "number of float uniforms")
+                .field(BYTE, " intSize", "number of int uniform")
+                .field(SHORT, " intSize", "number of int uniform")
+                .field(UTF8, "floatName", "name of float uniform")
+                .field(INT, "length", "length")
+                .field(FLOAT_ARRAY, "VALUE", "float uniform (max 4)")
+                .field(UTF8, "IntName", "id of shader text")
+                .field(INT, "length", "length of uniform")
+                .field(INT_ARRAY, "VALUE", "int uniform (max 4)")
+                .field(UTF8, "bitmapName", "name of bitmap")
+                .field(INT, "VALUE", "id of bitmap");
+
+    }
+
     @Override
     public void apply(RemoteContext context) {
         context.loadShader(mShaderID, this);
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextData.java
index ed13449..b49cb76 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextData.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextData.java
@@ -15,21 +15,27 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.UTF8;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.SerializableToString;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
 
 import java.util.List;
 
 /**
  * Operation to deal with Text data
  */
-public class TextData implements Operation {
+public class TextData implements Operation, SerializableToString {
+    private static final int OP_CODE = Operations.DATA_TEXT;
+    private static final String CLASS_NAME = "TextData";
     public int mTextId;
     public String mText;
-    public static final Companion COMPANION = new Companion();
     public static final int MAX_STRING_SIZE = 4000;
 
     public TextData(int textId, String text) {
@@ -39,7 +45,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mTextId, mText);
+        apply(buffer, mTextId, mText);
     }
 
     @Override
@@ -48,35 +54,41 @@
                 + Utils.trimString(mText, 10) + "\"";
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
-
-        @Override
-        public String name() {
-            return "TextData";
-        }
-
-        @Override
-        public int id() {
-            return Operations.DATA_TEXT;
-        }
-
-        public void apply(WireBuffer buffer, int textId, String text) {
-            buffer.start(Operations.DATA_TEXT);
-            buffer.writeInt(textId);
-            buffer.writeUTF8(text);
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int textId = buffer.readInt();
-
-            String text = buffer.readUTF8(MAX_STRING_SIZE);
-            operations.add(new TextData(textId, text));
-        }
+    public static String name() {
+        return CLASS_NAME;
     }
 
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static void apply(WireBuffer buffer, int textId, String text) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(textId);
+        buffer.writeUTF8(text);
+    }
+
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int textId = buffer.readInt();
+
+        String text = buffer.readUTF8(MAX_STRING_SIZE);
+        operations.add(new TextData(textId, text));
+    }
+
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Data Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Encode a string ")
+                .field(INT, "id", "id string")
+                .field(UTF8, "text",
+                        "encode text as a string");
+    }
+
+
     @Override
     public void apply(RemoteContext context) {
         context.loadText(mTextId, mText);
@@ -86,4 +98,14 @@
     public String deepToString(String indent) {
         return indent + toString();
     }
+
+    @Override
+    public void serializeToString(int indent, StringSerializer serializer) {
+        serializer.append(indent, getSerializedName() + "<" + mTextId
+                + "> = \"" + mText + "\"");
+    }
+
+    private String getSerializedName() {
+        return "DATA_TEXT";
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextFromFloat.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextFromFloat.java
index 65a39a1e..8f235dc 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextFromFloat.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextFromFloat.java
@@ -15,12 +15,15 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.SHORT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.operations.utilities.StringUtils;
 
 import java.util.List;
@@ -31,13 +34,14 @@
  * before and after define number of digits before and after the decimal point
  */
 public class TextFromFloat implements Operation, VariableSupport {
+    private static final int OP_CODE = Operations.TEXT_FROM_FLOAT;
+    private static final String CLASS_NAME = "TextFromFloat";
     public int mTextId;
     public float mValue;
     public float mOutValue;
     public short mDigitsBefore;
     public short mDigitsAfter;
     public int mFlags;
-    public static final Companion COMPANION = new Companion();
     public static final int MAX_STRING_SIZE = 4000;
     char mPre = ' ';
     char mAfter = ' ';
@@ -83,7 +87,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mTextId, mValue, mDigitsAfter, mDigitsBefore, mFlags);
+        apply(buffer, mTextId, mValue, mDigitsAfter, mDigitsBefore, mFlags);
     }
 
     @Override
@@ -99,10 +103,8 @@
         if (Float.isNaN(mValue)) {
             mOutValue = context.getFloat(Utils.idFromNan(mValue));
         }
-
     }
 
-
     @Override
     public void registerListening(RemoteContext context) {
         if (Float.isNaN(mValue)) {
@@ -110,53 +112,63 @@
         }
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
-
-        @Override
-        public String name() {
-            return "TextData";
-        }
-
-        @Override
-        public int id() {
-            return Operations.TEXT_FROM_FLOAT;
-        }
-
-        /**
-         * Writes out the operation to the buffer
-         * @param buffer
-         * @param textId
-         * @param value
-         * @param digitsBefore
-         * @param digitsAfter
-         * @param flags
-         */
-        public void apply(WireBuffer buffer, int textId,
-                          float value, short digitsBefore,
-                          short digitsAfter, int flags) {
-            buffer.start(Operations.TEXT_FROM_FLOAT);
-            buffer.writeInt(textId);
-            buffer.writeFloat(value);
-            buffer.writeInt((digitsBefore << 16) | digitsAfter);
-            buffer.writeInt(flags);
-
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int textId = buffer.readInt();
-            float value = buffer.readFloat();
-            int tmp = buffer.readInt();
-            short post = (short) (tmp & 0xFFFF);
-            short pre = (short) ((tmp >> 16) & 0xFFFF);
-
-            int flags = buffer.readInt();
-            operations.add(new TextFromFloat(textId, value, pre, post, flags));
-        }
+    public static String name() {
+        return CLASS_NAME;
     }
 
+    public static int id() {
+        return OP_CODE;
+    }
+
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer       buffer to write to
+     * @param textId       the id of the output text
+     * @param value        the float value to be turned into strings
+     * @param digitsBefore the digits before the decimal point
+     * @param digitsAfter  the digits after the decimal point
+     * @param flags        flags that control if and how to fill the empty spots
+     */
+    public static void apply(WireBuffer buffer, int textId,
+                             float value, short digitsBefore,
+                             short digitsAfter, int flags) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(textId);
+        buffer.writeFloat(value);
+        buffer.writeInt((digitsBefore << 16) | digitsAfter);
+        buffer.writeInt(flags);
+
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int textId = buffer.readInt();
+        float value = buffer.readFloat();
+        int tmp = buffer.readInt();
+        short post = (short) (tmp & 0xFFFF);
+        short pre = (short) ((tmp >> 16) & 0xFFFF);
+
+        int flags = buffer.readInt();
+        operations.add(new TextFromFloat(textId, value, pre, post, flags));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Expressions Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw text along path object")
+                .field(INT, "textId",
+                        "id of the text generated")
+                .field(INT, "value",
+                        "Value to add")
+                .field(SHORT, "prePoint",
+                        "digits before the decimal point")
+                .field(SHORT, "pstPoint",
+                        "digit after the decimal point")
+                .field(INT, "flags", "options on padding");
+    }
+
+
     @Override
     public void apply(RemoteContext context) {
         float v = mOutValue;
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextMerge.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextMerge.java
index a0fc854..dd78223 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextMerge.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextMerge.java
@@ -15,11 +15,13 @@
  */
 package com.android.internal.widget.remotecompose.core.operations;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
@@ -27,11 +29,11 @@
  * Operation to deal with Text data
  */
 public class TextMerge implements Operation {
+    private static final int OP_CODE = Operations.TEXT_MERGE;
+    private static final String CLASS_NAME = "TextMerge";
     public int mTextId;
     public int mSrcId1;
     public int mSrcId2;
-    public static final Companion COMPANION = new Companion();
-    public static final int MAX_STRING_SIZE = 4000;
 
     public TextMerge(int textId, int srcId1, int srcId2) {
         this.mTextId = textId;
@@ -41,7 +43,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mTextId, mSrcId1, mSrcId2);
+        apply(buffer, mTextId, mSrcId1, mSrcId2);
     }
 
     @Override
@@ -49,42 +51,49 @@
         return "TextMerge[" + mTextId + "] = [" + mSrcId1 + " ] + [ " + mSrcId2 + "]";
     }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
 
-        @Override
-        public String name() {
-            return "TextData";
-        }
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public int id() {
-            return Operations.TEXT_MERGE;
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        /**
-         * Writes out the operation to the buffer
-         * @param buffer
-         * @param textId
-         * @param srcId1
-         * @param srcId2
-         */
-        public void apply(WireBuffer buffer, int textId, int srcId1, int srcId2) {
-            buffer.start(Operations.TEXT_MERGE);
-            buffer.writeInt(textId);
-            buffer.writeInt(srcId1);
-            buffer.writeInt(srcId2);
-        }
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer buffer to write to
+     * @param textId id of the text
+     * @param srcId1 source text 1
+     * @param srcId2 source text 2
+     */
+    public static void apply(WireBuffer buffer, int textId, int srcId1, int srcId2) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(textId);
+        buffer.writeInt(srcId1);
+        buffer.writeInt(srcId2);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int textId = buffer.readInt();
-            int srcId1 = buffer.readInt();
-            int srcId2 = buffer.readInt();
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int textId = buffer.readInt();
+        int srcId1 = buffer.readInt();
+        int srcId2 = buffer.readInt();
 
-            operations.add(new TextMerge(textId, srcId1, srcId2));
-        }
+        operations.add(new TextMerge(textId, srcId1, srcId2));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Data Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Merge two string into one")
+                .field(INT, "textId",
+                        "id of the text")
+                .field(INT, "srcTextId1",
+                        "id of the path")
+                .field(INT, "srcTextId1",
+                        "x Shift of the text");
     }
 
     @Override
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/Theme.java b/core/java/com/android/internal/widget/remotecompose/core/operations/Theme.java
index f982997..52ae7fe 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/Theme.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/Theme.java
@@ -23,7 +23,6 @@
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
-import com.android.internal.widget.remotecompose.core.documentation.DocumentedCompanionOperation;
 
 import java.util.List;
 
@@ -34,13 +33,13 @@
  *
  */
 public class Theme implements RemoteComposeOperation {
+    private static final int OP_CODE = Operations.THEME;
+    private static final String CLASS_NAME = "Theme";
     int mTheme;
     public static final int UNSPECIFIED = -1;
     public static final int DARK = -2;
     public static final int LIGHT = -3;
 
-    public static final Companion COMPANION = new Companion();
-
     /**
      * we can then filter operations depending on the chosen theme.
      *
@@ -55,7 +54,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mTheme);
+        apply(buffer, mTheme);
     }
 
     @Override
@@ -73,38 +72,32 @@
         return indent + toString();
     }
 
-    public static class Companion implements DocumentedCompanionOperation {
-        private Companion() {}
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public String name() {
-            return "Theme";
-        }
 
-        @Override
-        public int id() {
-            return Operations.THEME;
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        public void apply(WireBuffer buffer, int theme) {
-            buffer.start(Operations.THEME);
-            buffer.writeInt(theme);
-        }
+    public static void apply(WireBuffer buffer, int theme) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(theme);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int theme = buffer.readInt();
-            operations.add(new Theme(theme));
-        }
 
-        @Override
-        public void documentation(DocumentationBuilder doc) {
-            doc.operation("Protocol Operations", id(), name())
-                    .description("Set a theme")
-                    .field(INT, "THEME", "theme id")
-                    .possibleValues("UNSPECIFIED", Theme.UNSPECIFIED)
-                    .possibleValues("DARK", Theme.DARK)
-                    .possibleValues("LIGHT", Theme.LIGHT);
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int theme = buffer.readInt();
+        operations.add(new Theme(theme));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Protocol Operations", OP_CODE, CLASS_NAME)
+                .description("Set a theme")
+                .field(INT, "THEME", "theme id")
+                .possibleValues("UNSPECIFIED", Theme.UNSPECIFIED)
+                .possibleValues("DARK", Theme.DARK)
+                .possibleValues("LIGHT", Theme.LIGHT);
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/Utils.java b/core/java/com/android/internal/widget/remotecompose/core/operations/Utils.java
index e9b0c3b..6e858c7 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/Utils.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/Utils.java
@@ -25,7 +25,12 @@
 
     public static int idFromNan(float value) {
         int b = Float.floatToRawIntBits(value);
-        return b & 0xFFFFF;
+        return b & 0x3FFFFF;
+    }
+
+    public static String idStringFromNan(float value) {
+        int b = Float.floatToRawIntBits(value) & 0x3FFFFF;
+        return (b > 0xFFFFF) ? "A_" + (b & 0xFFFFF) : "" + b;
     }
 
     public static float getActualValue(float lr) {
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ActionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ActionOperation.java
new file mode 100644
index 0000000..7588c794
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ActionOperation.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations.layout;
+
+import com.android.internal.widget.remotecompose.core.CoreDocument;
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
+
+/**
+ * Operations representing actions on the document
+ */
+public interface ActionOperation extends Operation {
+    void serializeToString(int indent, StringSerializer serializer);
+    void runAction(RemoteContext context, CoreDocument document,
+                   Component component, float x, float y);
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/CanvasContent.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/CanvasContent.java
new file mode 100644
index 0000000..fd35017
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/CanvasContent.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations.layout;
+
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
+
+/**
+ * Represents the content of a CanvasLayout (i.e. contains the canvas commands)
+ */
+public class CanvasContent extends Component implements ComponentStartOperation {
+
+    public CanvasContent(int componentId, float x, float y,
+                         float width, float height, Component parent, int animationId) {
+        super(parent, componentId, animationId, x, y, width, height);
+    }
+
+    public static String name() {
+        return "CanvasContent";
+    }
+
+    public static int id() {
+        return Operations.LAYOUT_CANVAS_CONTENT;
+    }
+
+    @Override protected String getSerializedName() {
+        return "CANVAS_CONTENT";
+    }
+
+    public static void apply(WireBuffer buffer, int componentId) {
+        buffer.start(Operations.LAYOUT_CANVAS_CONTENT);
+        buffer.writeInt(componentId);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int componentId = buffer.readInt();
+        operations.add(new CanvasContent(
+                componentId, 0, 0, 0, 0, null, -1));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", id(), name())
+                .field(INT, "COMPONENT_ID", "unique id for this component")
+                .description("Container for canvas commands.");
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mComponentId);
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ClickModifierEnd.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ClickModifierEnd.java
new file mode 100644
index 0000000..f7c6ce2
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ClickModifierEnd.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations.layout;
+
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
+
+public class ClickModifierEnd implements Operation {
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer);
+    }
+
+    @Override
+    public String toString() {
+        return "CLICK_END";
+    }
+
+    @Override
+    public void apply(RemoteContext context) {
+        // nothing
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return (indent != null ? indent : "") + toString();
+    }
+
+    public static String name() {
+        return "ClickModifierEnd";
+    }
+
+    public static int id() {
+        return Operations.MODIFIER_CLICK_END;
+    }
+
+    public static void apply(WireBuffer buffer) {
+        buffer.start(id());
+    }
+
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        operations.add(new ClickModifierEnd());
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", id(), name())
+                .description("End tag for click modifiers. This operation marks the end"
+                        + "of a click modifier");
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ClickModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ClickModifierOperation.java
new file mode 100644
index 0000000..d75f70b
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ClickModifierOperation.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations.layout;
+
+import com.android.internal.widget.remotecompose.core.CoreDocument;
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.PaintOperation;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.TextData;
+import com.android.internal.widget.remotecompose.core.operations.Utils;
+import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ModifierOperation;
+import com.android.internal.widget.remotecompose.core.operations.paint.PaintBundle;
+import com.android.internal.widget.remotecompose.core.operations.utilities.ColorUtils;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
+import com.android.internal.widget.remotecompose.core.operations.utilities.easing.Easing;
+import com.android.internal.widget.remotecompose.core.operations.utilities.easing.FloatAnimation;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents a click modifier + actions
+ */
+public class ClickModifierOperation extends PaintOperation
+        implements ModifierOperation, DecoratorComponent {
+    private static final int OP_CODE = Operations.MODIFIER_CLICK;
+
+
+    long mAnimateRippleStart = 0;
+    float mAnimateRippleX = 0f;
+    float mAnimateRippleY = 0f;
+    int mAnimateRippleDuration = 1000;
+
+    float mWidth = 0;
+    float mHeight = 0;
+
+    public float[] locationInWindow = new float[2];
+
+    PaintBundle mPaint = new PaintBundle();
+
+    public void animateRipple(float x, float y) {
+        mAnimateRippleStart = System.currentTimeMillis();
+        mAnimateRippleX = x;
+        mAnimateRippleY = y;
+    }
+    public ArrayList<Operation> mList = new ArrayList<>();
+
+    public ArrayList<Operation> getList() {
+        return mList;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer);
+    }
+
+    @Override
+    public String toString() {
+        return "ClickModifier";
+    }
+
+    @Override
+    public void apply(RemoteContext context) {
+        for (Operation op : mList) {
+            if (op instanceof TextData) {
+                op.apply(context);
+            }
+        }
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return (indent != null ? indent : "") + toString();
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        if (mAnimateRippleStart == 0) {
+            return;
+        }
+        context.needsRepaint();
+
+        float progress = (System.currentTimeMillis() - mAnimateRippleStart);
+        progress /= (float) mAnimateRippleDuration;
+        if (progress > 1f) {
+            mAnimateRippleStart = 0;
+        }
+        progress = Math.min(1f, progress);
+        context.save();
+        context.savePaint();
+        mPaint.reset();
+
+        FloatAnimation anim1 = new FloatAnimation(Easing.CUBIC_STANDARD, 1f,
+                null, Float.NaN, Float.NaN);
+        anim1.setInitialValue(0f);
+        anim1.setTargetValue(1f);
+        float tween = anim1.get(progress);
+
+        FloatAnimation anim2 = new FloatAnimation(Easing.CUBIC_STANDARD, 0.5f,
+                null, Float.NaN, Float.NaN);
+        anim2.setInitialValue(0f);
+        anim2.setTargetValue(1f);
+        float tweenRadius = anim2.get(progress);
+
+        int startColor = ColorUtils.createColor(250, 250, 250, 180);
+        int endColor = ColorUtils.createColor(200, 200, 200, 0);
+        int paintedColor = Utils.interpolateColor(startColor, endColor, tween);
+
+        float radius = Math.max(mWidth, mHeight) * tweenRadius;
+        mPaint.setColor(paintedColor);
+        context.applyPaint(mPaint);
+        context.clipRect(0f, 0f, mWidth, mHeight);
+        context.drawCircle(mAnimateRippleX, mAnimateRippleY, radius);
+        context.restorePaint();
+        context.restore();
+    }
+
+    @Override
+    public void layout(RemoteContext context, float width, float height) {
+        mWidth = width;
+        mHeight = height;
+    }
+
+    @Override
+    public void serializeToString(int indent, StringSerializer serializer) {
+        serializer.append(indent, "CLICK_MODIFIER");
+        for (Operation o : mList) {
+            if (o instanceof ActionOperation) {
+                ((ActionOperation) o).serializeToString(indent + 1, serializer);
+            }
+        }
+    }
+
+    @Override
+    public void onClick(RemoteContext context, CoreDocument document,
+                        Component component, float x, float y) {
+        locationInWindow[0] = 0f;
+        locationInWindow[1] = 0f;
+        component.getLocationInWindow(locationInWindow);
+        animateRipple(x - locationInWindow[0], y - locationInWindow[1]);
+        for (Operation o : mList) {
+            if (o instanceof ActionOperation) {
+                ((ActionOperation) o).runAction(context, document, component, x, y);
+            }
+        }
+    }
+
+    public static String name() {
+        return "ClickModifier";
+    }
+
+    public static void apply(WireBuffer buffer) {
+        buffer.start(OP_CODE);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        operations.add(new ClickModifierOperation());
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", OP_CODE, name())
+                .description("Click modifier. This operation contains"
+                        + " a list of action executed on click");
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/Component.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/Component.java
index ee2e11b..fca0b13 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/Component.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/Component.java
@@ -15,11 +15,17 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout;
 
+import com.android.internal.widget.remotecompose.core.CoreDocument;
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.SerializableToString;
+import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.operations.BitmapData;
+import com.android.internal.widget.remotecompose.core.operations.ComponentValue;
+import com.android.internal.widget.remotecompose.core.operations.TextData;
 import com.android.internal.widget.remotecompose.core.operations.layout.animation.AnimateMeasure;
 import com.android.internal.widget.remotecompose.core.operations.layout.animation.AnimationSpec;
 import com.android.internal.widget.remotecompose.core.operations.layout.measure.ComponentMeasure;
@@ -30,11 +36,14 @@
 import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 
 /**
  * Generic Component class
  */
-public class Component extends PaintOperation implements Measurable {
+public class Component extends PaintOperation implements Measurable, SerializableToString {
+
+    private static final boolean DEBUG = false;
 
     protected int mComponentId = -1;
     protected float mX;
@@ -44,6 +53,7 @@
     protected Component mParent;
     protected int mAnimationId = -1;
     public Visibility mVisibility = Visibility.VISIBLE;
+    public Visibility mScheduledVisibility = Visibility.VISIBLE;
     public ArrayList<Operation> mList = new ArrayList<>();
     public PaintOperation mPreTranslate;
     public boolean mNeedsMeasure = true;
@@ -52,22 +62,29 @@
     public AnimationSpec mAnimationSpec = new AnimationSpec();
     public boolean mFirstLayout = true;
     PaintBundle mPaint = new PaintBundle();
+    protected HashSet<ComponentValue> mComponentValues = new HashSet<>();
+
 
     public ArrayList<Operation> getList() {
         return mList;
     }
+
     public float getX() {
         return mX;
     }
+
     public float getY() {
         return mY;
     }
+
     public float getWidth() {
         return mWidth;
     }
+
     public float getHeight() {
         return mHeight;
     }
+
     public int getComponentId() {
         return mComponentId;
     }
@@ -79,19 +96,55 @@
     public Component getParent() {
         return mParent;
     }
+
     public void setX(float value) {
         mX = value;
     }
+
     public void setY(float value) {
         mY = value;
     }
+
     public void setWidth(float value) {
         mWidth = value;
     }
+
     public void setHeight(float value) {
         mHeight = value;
     }
 
+    /**
+     * Utility function to update variables referencing this component dimensions
+     *
+     * @param context the current context
+     */
+    private void updateComponentValues(RemoteContext context) {
+        if (DEBUG) {
+            System.out.println("UPDATE COMPONENT VALUES ("
+                    + mComponentValues.size()
+                    + ") FOR " + mComponentId);
+        }
+        for (ComponentValue v : mComponentValues) {
+            switch (v.getType()) {
+                case ComponentValue.WIDTH: {
+                    context.loadFloat(v.getValueId(), mWidth);
+                    if (DEBUG) {
+                        System.out.println("Updating WIDTH for " + mComponentId + " to " + mWidth);
+                    }
+                }
+                break;
+                case ComponentValue.HEIGHT: {
+                    context.loadFloat(v.getValueId(), mHeight);
+                    if (DEBUG) {
+                        System.out.println("Updating HEIGHT for " + mComponentId
+                                + " to " + mHeight);
+                    }
+                }
+                break;
+            }
+        }
+    }
+
     public void setComponentId(int id) {
         mComponentId = id;
     }
@@ -145,6 +198,30 @@
         mParent = parent;
     }
 
+    /**
+     * This traverses the component tree and make sure to
+     * update variables referencing the component dimensions as needed.
+     *
+     * @param context the current context
+     */
+    public void updateVariables(RemoteContext context) {
+        if (!mComponentValues.isEmpty()) {
+            updateComponentValues(context);
+        }
+        for (Operation o : mList) {
+            if (o instanceof Component) {
+                ((Component) o).updateVariables(context);
+            }
+            if (o instanceof VariableSupport) {
+                o.apply(context);
+            }
+        }
+    }
+
+    public void addComponentValue(ComponentValue v) {
+        mComponentValues.add(v);
+    }
+
     public enum Visibility {
         VISIBLE,
         INVISIBLE,
@@ -161,6 +238,13 @@
         return true;
     }
 
+    public void setVisibility(Visibility visibility) {
+        if (visibility != mVisibility) {
+            mScheduledVisibility = visibility;
+            invalidateMeasure();
+        }
+    }
+
     @Override
     public void measure(PaintContext context, float minWidth, float maxWidth,
                         float minHeight, float maxHeight, MeasurePass measure) {
@@ -172,7 +256,8 @@
     @Override
     public void layout(RemoteContext context, MeasurePass measure) {
         ComponentMeasure m = measure.get(this);
-        if (!mFirstLayout && context.isAnimationEnabled()) {
+        if (!mFirstLayout && context.isAnimationEnabled()
+                && !(this instanceof LayoutComponentContent)) {
             if (mAnimateMeasure == null) {
                 ComponentMeasure origin = new ComponentMeasure(mComponentId,
                         mX, mY, mWidth, mHeight, mVisibility);
@@ -190,8 +275,8 @@
         } else {
             mVisibility = m.getVisibility();
         }
-        mWidth = m.getW();
-        mHeight = m.getH();
+        setWidth(m.getW());
+        setHeight(m.getH());
         setLayoutPosition(m.getX(), m.getY());
         mFirstLayout = false;
     }
@@ -209,16 +294,16 @@
         return x >= lx1 && x < lx2 && y >= ly1 && y < ly2;
     }
 
-    public void onClick(float x, float y) {
+    public void onClick(RemoteContext context, CoreDocument document, float x, float y) {
         if (!contains(x, y)) {
             return;
         }
         for (Operation op : mList) {
             if (op instanceof Component) {
-                ((Component) op).onClick(x, y);
+                ((Component) op).onClick(context, document, x, y);
             }
             if (op instanceof ComponentModifiers) {
-                ((ComponentModifiers) op).onClick(x, y);
+                ((ComponentModifiers) op).onClick(context, document, this, x, y);
             }
         }
     }
@@ -226,10 +311,11 @@
     public void getLocationInWindow(float[] value) {
         value[0] += mX;
         value[1] += mY;
-        if (mParent != null && mParent instanceof Component) {
+        if (mParent != null) {
             if (mParent instanceof LayoutComponent) {
-                value[0] += ((LayoutComponent) mParent).getMarginLeft();
-                value[1] += ((LayoutComponent) mParent).getMarginTop();
+                LayoutComponent parent = (LayoutComponent) mParent;
+                value[0] += parent.getMarginLeft() + parent.getPaddingLeft();
+                value[1] += parent.getMarginTop() + parent.getPaddingTop();
             }
             mParent.getLocationInWindow(value);
         }
@@ -248,10 +334,10 @@
 
     public void serializeToString(int indent, StringSerializer serializer) {
         serializer.append(indent, getSerializedName() + " [" + mComponentId
-                + ":" + mAnimationId + "] = "
-                + "[" + mX + ", " + mY + ", " + mWidth + ", " + mHeight + "] "
-                + mVisibility
-        //        + " [" + mNeedsMeasure + ", " + mNeedsRepaint + "]"
+                        + ":" + mAnimationId + "] = "
+                        + "[" + mX + ", " + mY + ", " + mWidth + ", " + mHeight + "] "
+                        + mVisibility
+                //        + " [" + mNeedsMeasure + ", " + mNeedsRepaint + "]"
         );
     }
 
@@ -382,6 +468,9 @@
             debugBox(this, context);
         }
         for (Operation op : mList) {
+            if (op instanceof BitmapData) {
+                ((BitmapData) op).apply(context.getContext());
+            }
             if (op instanceof PaintOperation) {
                 ((PaintOperation) op).paint(context);
             }
@@ -435,6 +524,14 @@
         }
     }
 
+    public void getData(ArrayList<TextData> data) {
+        for (Operation op : mList) {
+            if (op instanceof TextData) {
+                data.add((TextData) op);
+            }
+        }
+    }
+
     public int getComponentCount() {
         int count = 0;
         for (Operation op : mList) {
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ComponentEnd.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ComponentEnd.java
index 8a523a2..71decd7 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ComponentEnd.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ComponentEnd.java
@@ -20,17 +20,14 @@
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
-import com.android.internal.widget.remotecompose.core.documentation.DocumentedCompanionOperation;
 
 import java.util.List;
 
 public class ComponentEnd implements Operation {
 
-    public static final ComponentEnd.Companion COMPANION = new ComponentEnd.Companion();
-
     @Override
     public void write(WireBuffer buffer) {
-        Companion.apply(buffer);
+        apply(buffer);
     }
 
     @Override
@@ -48,35 +45,30 @@
         return (indent != null ? indent : "") + toString();
     }
 
-    public static class Companion implements DocumentedCompanionOperation {
-        @Override
-        public String name() {
-            return "ComponentEnd";
-        }
+    public static String name() {
+        return "ComponentEnd";
+    }
 
-        @Override
-        public int id() {
-            return Operations.COMPONENT_END;
-        }
+    public static int id() {
+        return Operations.COMPONENT_END;
+    }
 
-        public static void apply(WireBuffer buffer) {
-            buffer.start(Operations.COMPONENT_END);
-        }
+    public static void apply(WireBuffer buffer) {
+        buffer.start(Operations.COMPONENT_END);
+    }
 
-        public static int size() {
-            return 1 + 4 + 4 + 4;
-        }
+    public static int size() {
+        return 1 + 4 + 4 + 4;
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            operations.add(new ComponentEnd());
-        }
 
-        @Override
-        public void documentation(DocumentationBuilder doc) {
-            doc.operation("Layout Operations", id(), name())
-                    .description("End tag for components / layouts. This operation marks the end"
-                            + "of a component");
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        operations.add(new ComponentEnd());
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", id(), name())
+                .description("End tag for components / layouts. This operation marks the end"
+                        + "of a component");
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ComponentStart.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ComponentStart.java
index 5cfad25..32ef5ce 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ComponentStart.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ComponentStart.java
@@ -23,14 +23,11 @@
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
-import com.android.internal.widget.remotecompose.core.documentation.DocumentedCompanionOperation;
 
 import java.util.List;
 
 public class ComponentStart implements ComponentStartOperation {
 
-    public static final ComponentStart.Companion COMPANION = new ComponentStart.Companion();
-
     int mType = DEFAULT;
     float mX;
     float mY;
@@ -73,12 +70,12 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        Companion.apply(buffer, mType, mComponentId, mWidth, mHeight);
+        apply(buffer, mType, mComponentId, mWidth, mHeight);
     }
 
     @Override
     public String toString() {
-        return "COMPONENT_START (type " + mType + " " + Companion.typeDescription(mType)
+        return "COMPONENT_START (type " + mType + " " + typeDescription(mType)
                 + ") - (" + mX + ", " + mY + " - " + mWidth + " x " + mHeight + ")";
     }
 
@@ -111,83 +108,75 @@
     public static final int LAYOUT_ROW = 15;
     public static final int LAYOUT_COLUMN = 16;
 
-    public static class Companion implements DocumentedCompanionOperation {
-
-
-        public static String typeDescription(int type) {
-            switch (type) {
-                case DEFAULT:
-                    return "DEFAULT";
-                case ROOT_LAYOUT:
-                    return "ROOT_LAYOUT";
-                case LAYOUT:
-                    return "LAYOUT";
-                case LAYOUT_CONTENT:
-                    return "CONTENT";
-                case SCROLL_CONTENT:
-                    return "SCROLL_CONTENT";
-                case BUTTON:
-                    return "BUTTON";
-                case CHECKBOX:
-                    return "CHECKBOX";
-                case TEXT:
-                    return "TEXT";
-                case CURVED_TEXT:
-                    return "CURVED_TEXT";
-                case STATE_HOST:
-                    return "STATE_HOST";
-                case LOTTIE:
-                    return "LOTTIE";
-                case CUSTOM:
-                    return "CUSTOM";
-                case IMAGE:
-                    return "IMAGE";
-                default:
-                    return "UNKNOWN";
-            }
+    public static String typeDescription(int type) {
+        switch (type) {
+            case DEFAULT:
+                return "DEFAULT";
+            case ROOT_LAYOUT:
+                return "ROOT_LAYOUT";
+            case LAYOUT:
+                return "LAYOUT";
+            case LAYOUT_CONTENT:
+                return "CONTENT";
+            case SCROLL_CONTENT:
+                return "SCROLL_CONTENT";
+            case BUTTON:
+                return "BUTTON";
+            case CHECKBOX:
+                return "CHECKBOX";
+            case TEXT:
+                return "TEXT";
+            case CURVED_TEXT:
+                return "CURVED_TEXT";
+            case STATE_HOST:
+                return "STATE_HOST";
+            case LOTTIE:
+                return "LOTTIE";
+            case CUSTOM:
+                return "CUSTOM";
+            case IMAGE:
+                return "IMAGE";
+            default:
+                return "UNKNOWN";
         }
+    }
 
-        @Override
-        public String name() {
-            return "ComponentStart";
-        }
+    public static String name() {
+        return "ComponentStart";
+    }
 
-        @Override
-        public int id() {
-            return Operations.COMPONENT_START;
-        }
+    public static int id() {
+        return Operations.COMPONENT_START;
+    }
 
-        public static void apply(WireBuffer buffer, int type, int componentId,
-                                 float width, float height) {
-            buffer.start(Operations.COMPONENT_START);
-            buffer.writeInt(type);
-            buffer.writeInt(componentId);
-            buffer.writeFloat(width);
-            buffer.writeFloat(height);
-        }
+    public static void apply(WireBuffer buffer, int type, int componentId,
+                             float width, float height) {
+        buffer.start(Operations.COMPONENT_START);
+        buffer.writeInt(type);
+        buffer.writeInt(componentId);
+        buffer.writeFloat(width);
+        buffer.writeFloat(height);
+    }
 
-        public static int size() {
-            return 1 + 4 + 4 + 4;
-        }
+    public static int size() {
+        return 1 + 4 + 4 + 4;
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int type = buffer.readInt();
-            int componentId = buffer.readInt();
-            float width = buffer.readFloat();
-            float height = buffer.readFloat();
-            operations.add(new ComponentStart(type, componentId, width, height));
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int type = buffer.readInt();
+        int componentId = buffer.readInt();
+        float width = buffer.readFloat();
+        float height = buffer.readFloat();
+        operations.add(new ComponentStart(type, componentId, width, height));
+    }
 
-        @Override
-        public void documentation(DocumentationBuilder doc) {
-            doc.operation("Layout Operations", id(), name())
-                    .description("Basic component encapsulating draw commands."
-                           + "This is not resizable.")
-                    .field(INT, "TYPE", "Type of components")
-                    .field(INT, "COMPONENT_ID", "unique id for this component")
-                    .field(FLOAT, "WIDTH", "width of the component")
-                    .field(FLOAT, "HEIGHT", "height of the component");
-        }
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", id(), name())
+                .description("Basic component encapsulating draw commands."
+                        + "This is not resizable.")
+                .field(INT, "TYPE", "Type of components")
+                .field(INT, "COMPONENT_ID", "unique id for this component")
+                .field(FLOAT, "WIDTH", "width of the component")
+                .field(FLOAT, "HEIGHT", "height of the component");
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/DecoratorComponent.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/DecoratorComponent.java
index 941666a..71bf839 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/DecoratorComponent.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/DecoratorComponent.java
@@ -15,6 +15,7 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout;
 
+import com.android.internal.widget.remotecompose.core.CoreDocument;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 
 /**
@@ -23,5 +24,6 @@
  */
 public interface DecoratorComponent {
     void layout(RemoteContext context, float width, float height);
-    void onClick(float x, float y);
+    void onClick(RemoteContext context, CoreDocument document,
+                 Component component, float x, float y);
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LayoutComponent.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LayoutComponent.java
index f198c4a..f4c2131 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LayoutComponent.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LayoutComponent.java
@@ -17,7 +17,13 @@
 
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.operations.BitmapData;
+import com.android.internal.widget.remotecompose.core.operations.MatrixRestore;
+import com.android.internal.widget.remotecompose.core.operations.MatrixSave;
+import com.android.internal.widget.remotecompose.core.operations.MatrixTranslate;
+import com.android.internal.widget.remotecompose.core.operations.TextData;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ComponentModifiers;
+import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ComponentVisibilityOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.DimensionModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.HeightModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ModifierOperation;
@@ -56,40 +62,101 @@
     public float getMarginLeft() {
         return mMarginLeft;
     }
+
     public float getMarginRight() {
         return mMarginRight;
     }
+
     public float getMarginTop() {
         return mMarginTop;
     }
+
     public float getMarginBottom() {
         return mMarginBottom;
     }
 
+    public float getPaddingLeft() {
+        return mPaddingLeft;
+    }
+
+    public float getPaddingTop() {
+        return mPaddingTop;
+    }
+
+    public float getPaddingRight() {
+        return mPaddingRight;
+    }
+
+    public float getPaddingBottom() {
+        return mPaddingBottom;
+    }
+
+
     public WidthModifierOperation getWidthModifier() {
         return mWidthModifier;
     }
+
     public HeightModifierOperation getHeightModifier() {
         return mHeightModifier;
     }
 
+    protected LayoutComponentContent mContent = null;
+
+    // Should be removed after ImageLayout is in
+    private static final boolean USE_IMAGE_TEMP_FIX = true;
+
     public void inflate() {
+        ArrayList<TextData> data = new ArrayList<>();
         for (Operation op : mList) {
             if (op instanceof LayoutComponentContent) {
-                ((LayoutComponentContent) op).mParent = this;
+                mContent = (LayoutComponentContent) op;
+                mContent.mParent = this;
                 mChildrenComponents.clear();
-                ((LayoutComponentContent) op).getComponents(mChildrenComponents);
-                if (mChildrenComponents.isEmpty()) {
-                    mChildrenComponents.add((Component) op);
+                LayoutComponentContent content = (LayoutComponentContent) op;
+                content.getComponents(mChildrenComponents);
+                if (USE_IMAGE_TEMP_FIX) {
+                    if (mChildrenComponents.isEmpty() && !mContent.mList.isEmpty()) {
+                        CanvasContent canvasContent =
+                                new CanvasContent(-1, 0f, 0f, 0f, 0f, this, -1);
+                        for (Operation opc : mContent.mList) {
+                            if (opc instanceof BitmapData) {
+                                canvasContent.mList.add(opc);
+                                int w = ((BitmapData) opc).getWidth();
+                                int h = ((BitmapData) opc).getHeight();
+                                canvasContent.setWidth(w);
+                                canvasContent.setHeight(h);
+                            } else {
+                                if (!((opc instanceof MatrixTranslate)
+                                        || (opc instanceof MatrixSave)
+                                        || (opc instanceof MatrixRestore))) {
+                                    canvasContent.mList.add(opc);
+                                }
+                            }
+                        }
+                        if (!canvasContent.mList.isEmpty()) {
+                            mContent.mList.clear();
+                            mChildrenComponents.add(canvasContent);
+                        }
+                    } else {
+                        content.getData(data);
+                    }
+                } else {
+                    content.getData(data);
                 }
             } else if (op instanceof ModifierOperation) {
+                if (op instanceof ComponentVisibilityOperation) {
+                    ((ComponentVisibilityOperation) op).setParent(this);
+                }
                 mComponentModifiers.add((ModifierOperation) op);
+            } else if (op instanceof TextData) {
+                data.add((TextData) op);
             } else {
                 // nothing
             }
         }
 
         mList.clear();
+        mList.addAll(data);
         mList.add(mComponentModifiers);
         for (Component c : mChildrenComponents) {
             c.mParent = this;
@@ -146,8 +213,8 @@
         if (mHeightModifier == null) {
             mHeightModifier = new HeightModifierOperation(DimensionModifierOperation.Type.WRAP);
         }
-        mWidth = computeModifierDefinedWidth();
-        mHeight = computeModifierDefinedHeight();
+        setWidth(computeModifierDefinedWidth());
+        setHeight(computeModifierDefinedHeight());
     }
 
     @Override
@@ -170,6 +237,7 @@
         context.restore();
     }
 
+
     /**
      * Traverse the modifiers to compute indicated dimension
      */
@@ -195,6 +263,27 @@
     }
 
     /**
+     * Traverse the modifiers to compute padding width
+     *
+     * @param padding output start and end padding values
+     * @return padding width
+     */
+    public float computeModifierDefinedPaddingWidth(float[] padding) {
+        float s = 0f;
+        float e = 0f;
+        for (Operation c : mComponentModifiers.getList()) {
+            if (c instanceof PaddingModifierOperation) {
+                PaddingModifierOperation pop = (PaddingModifierOperation) c;
+                s += pop.getLeft();
+                e += pop.getRight();
+            }
+        }
+        padding[0] = s;
+        padding[1] = e;
+        return s + e;
+    }
+
+    /**
      * Traverse the modifiers to compute indicated dimension
      */
     public float computeModifierDefinedHeight() {
@@ -217,4 +306,26 @@
         }
         return t + h + b;
     }
+
+    /**
+     * Traverse the modifiers to compute padding height
+     *
+     * @param padding output top and bottom padding values
+     * @return padding height
+     */
+    public float computeModifierDefinedPaddingHeight(float[] padding) {
+        float t = 0f;
+        float b = 0f;
+        for (Operation c : mComponentModifiers.getList()) {
+            if (c instanceof PaddingModifierOperation) {
+                PaddingModifierOperation pop = (PaddingModifierOperation) c;
+                t += pop.getTop();
+                b += pop.getBottom();
+            }
+        }
+        padding[0] = t;
+        padding[1] = b;
+        return t + b;
+    }
+
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LayoutComponentContent.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LayoutComponentContent.java
index 769ff6a..5b3b54d 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LayoutComponentContent.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LayoutComponentContent.java
@@ -15,11 +15,12 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
-import com.android.internal.widget.remotecompose.core.documentation.DocumentedCompanionOperation;
 
 import java.util.List;
 
@@ -28,41 +29,44 @@
  */
 public class LayoutComponentContent extends Component implements ComponentStartOperation {
 
-    public static final LayoutComponentContent.Companion COMPANION =
-            new LayoutComponentContent.Companion();
-
     public LayoutComponentContent(int componentId, float x, float y,
                                   float width, float height, Component parent, int animationId) {
         super(parent, componentId, animationId, x, y, width, height);
     }
 
-    public static class Companion implements DocumentedCompanionOperation {
-        @Override
-        public String name() {
-            return "LayoutContent";
-        }
+    public static String name() {
+        return "LayoutContent";
+    }
 
-        @Override
-        public int id() {
-            return Operations.LAYOUT_CONTENT;
-        }
+    public static int id() {
+        return Operations.LAYOUT_CONTENT;
+    }
 
-        public void apply(WireBuffer buffer) {
-            buffer.start(Operations.LAYOUT_CONTENT);
-        }
+    @Override protected String getSerializedName() {
+        return "CONTENT";
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            operations.add(new LayoutComponentContent(
-                    -1, 0, 0, 0, 0, null, -1));
-        }
+    public static void apply(WireBuffer buffer, int componentId) {
+        buffer.start(Operations.LAYOUT_CONTENT);
+        buffer.writeInt(componentId);
+    }
 
-        @Override
-        public void documentation(DocumentationBuilder doc) {
-            doc.operation("Layout Operations", id(), name())
-                    .description("Container for components. BoxLayout, RowLayout and ColumnLayout "
-                           + "expects a LayoutComponentContent as a child, encapsulating the "
-                           + "components that needs to be laid out.");
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int componentId = buffer.readInt();
+        operations.add(new LayoutComponentContent(
+                componentId, 0, 0, 0, 0, null, -1));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", id(), name())
+                .field(INT, "COMPONENT_ID", "unique id for this component")
+                .description("Container for components. BoxLayout, RowLayout and ColumnLayout "
+                        + "expects a LayoutComponentContent as a child, encapsulating the "
+                        + "components that needs to be laid out.");
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mComponentId);
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/RootLayoutComponent.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/RootLayoutComponent.java
index dc13768..bf1a496 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/RootLayoutComponent.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/RootLayoutComponent.java
@@ -15,14 +15,16 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.SerializableToString;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
-import com.android.internal.widget.remotecompose.core.documentation.DocumentedCompanionOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.measure.Measurable;
 import com.android.internal.widget.remotecompose.core.operations.layout.measure.MeasurePass;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ComponentModifiers;
@@ -34,10 +36,6 @@
  * Represents the root layout component. Entry point to the component tree layout/paint.
  */
 public class RootLayoutComponent extends Component implements ComponentStartOperation {
-
-    public static final RootLayoutComponent.Companion COMPANION =
-            new RootLayoutComponent.Companion();
-
     int mCurrentId = -1;
 
     public RootLayoutComponent(int componentId, float x, float y,
@@ -52,7 +50,8 @@
 
     @Override
     public String toString() {
-        return "ROOT (" + mX + ", " + mY + " - " + mWidth + " x " + mHeight + ") " + mVisibility;
+        return "ROOT " + mComponentId + " (" + mX + ", " + mY + " - "
+                + mWidth + " x " + mHeight + ") " + mVisibility;
     }
 
     @Override
@@ -61,18 +60,22 @@
                 + "] = [" + mX + ", " + mY + ", " + mWidth + ", " + mHeight + "] " + mVisibility);
     }
 
-    public int getNextId() {
-        mCurrentId--;
-        return mCurrentId;
-    }
-
-    public void assignIds() {
+    /**
+     * Traverse the hierarchy and assign generated ids to component without ids.
+     * Most components would already have ids assigned during the document creation, but this
+     * allow us to take care of any components added during the inflation.
+     *
+     * @param lastId the last known generated id
+     */
+    public void assignIds(int lastId) {
+        mCurrentId = lastId;
         assignId(this);
     }
 
-    void assignId(Component component) {
+    private void assignId(Component component) {
         if (component.mComponentId == -1) {
-            component.mComponentId = getNextId();
+            mCurrentId--;
+            component.mComponentId = mCurrentId;
         }
         for (Operation op : component.mList) {
             if (op instanceof Component) {
@@ -135,39 +138,42 @@
         for (Operation c : component.mList) {
             if (c instanceof ComponentModifiers) {
                 ((ComponentModifiers) c).serializeToString(indent + 1, serializer);
-            }
-            if (c instanceof Component) {
+            } else if (c instanceof Component) {
                 displayHierarchy((Component) c, indent + 1, serializer);
+            } else if (c instanceof SerializableToString) {
+                ((SerializableToString) c).serializeToString(indent + 1, serializer);
             }
         }
     }
 
-    public static class Companion implements DocumentedCompanionOperation {
-        @Override
-        public String name() {
-            return "RootLayout";
-        }
+    public static String name() {
+        return "RootLayout";
+    }
 
-        @Override
-        public int id() {
-            return Operations.LAYOUT_ROOT;
-        }
+    public static int id() {
+        return Operations.LAYOUT_ROOT;
+    }
 
-        public void apply(WireBuffer buffer) {
-            buffer.start(Operations.LAYOUT_ROOT);
-        }
+    public static void apply(WireBuffer buffer, int componentId) {
+        buffer.start(Operations.LAYOUT_ROOT);
+        buffer.writeInt(componentId);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            operations.add(new RootLayoutComponent(
-                    -1, 0, 0, 0, 0, null, -1));
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int componentId = buffer.readInt();
+        operations.add(new RootLayoutComponent(
+                componentId, 0, 0, 0, 0, null, -1));
+    }
 
-        @Override
-        public void documentation(DocumentationBuilder doc) {
-            doc.operation("Layout Operations", id(), name())
-                    .description("Root element for a document. Other components / layout managers "
-                         + "are children in the component tree starting from this Root component.");
-        }
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", id(), name())
+                .field(INT, "COMPONENT_ID", "unique id for this component")
+                .description("Root element for a document. Other components / layout managers "
+                        + "are children in the component tree starting from this Root component.");
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mComponentId);
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimateMeasure.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimateMeasure.java
index 7c6bef4..1ada733 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimateMeasure.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimateMeasure.java
@@ -75,7 +75,7 @@
         mP = Math.min(elapsed / (float) mDuration, 1f);
         //mP = motionEasing.get(mP);
         mVp = Math.min(elapsed / (float) mDurationVisibilityChange, 1f);
-        mVp = mVisibilityEasing.get(mVp);
+       // mVp = mVisibilityEasing.get(mVp);
     }
 
     public PaintBundle paint = new PaintBundle();
@@ -101,7 +101,6 @@
             }
         }
 
-        mComponent.mVisibility = mTarget.getVisibility();
         if (mOriginal.getVisibility() != mTarget.getVisibility()) {
             if (mTarget.getVisibility() == Component.Visibility.GONE) {
                 switch (mExitAnimation) {
@@ -256,7 +255,7 @@
             } else {
                 mComponent.paintingComponent(context);
             }
-        } else {
+        } else if (mTarget.getVisibility() == Component.Visibility.VISIBLE) {
             mComponent.paintingComponent(context);
         }
 
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimationSpec.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimationSpec.java
index 386d365..0f7db36 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimationSpec.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimationSpec.java
@@ -15,11 +15,13 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout.animation;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.operations.utilities.easing.GeneralEasing;
 
 import java.util.List;
@@ -28,9 +30,6 @@
  * Basic component animation spec
  */
 public class AnimationSpec implements Operation {
-
-    public static final AnimationSpec.Companion COMPANION = new AnimationSpec.Companion();
-
     int mAnimationId = -1;
     int mMotionDuration = 300;
     int mMotionEasingType = GeneralEasing.CUBIC_STANDARD;
@@ -103,7 +102,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        Companion.apply(buffer, mAnimationId, mMotionDuration, mMotionEasingType,
+        apply(buffer, mAnimationId, mMotionDuration, mMotionEasingType,
                 mVisibilityDuration, mVisibilityEasingType, mEnterAnimation, mExitAnimation);
     }
 
@@ -117,70 +116,77 @@
         return (indent != null ? indent : "") + toString();
     }
 
-    public static class Companion implements CompanionOperation {
-        @Override
-        public String name() {
-            return "AnimationSpec";
-        }
+    public static String name() {
+        return "AnimationSpec";
+    }
 
-        @Override
-        public int id() {
-            return Operations.ANIMATION_SPEC;
-        }
+    public static int id() {
+        return Operations.ANIMATION_SPEC;
+    }
 
-        public static int animationToInt(ANIMATION animation) {
-            return animation.ordinal();
-        }
+    public static int animationToInt(ANIMATION animation) {
+        return animation.ordinal();
+    }
 
-        public static ANIMATION intToAnimation(int value) {
-            switch (value) {
-                case 0:
-                    return ANIMATION.FADE_IN;
-                case 1:
-                    return ANIMATION.FADE_OUT;
-                case 2:
-                    return ANIMATION.SLIDE_LEFT;
-                case 3:
-                    return ANIMATION.SLIDE_RIGHT;
-                case 4:
-                    return ANIMATION.SLIDE_TOP;
-                case 5:
-                    return ANIMATION.SLIDE_BOTTOM;
-                case 6:
-                    return ANIMATION.ROTATE;
-                case 7:
-                    return ANIMATION.PARTICLE;
-                default:
-                    return ANIMATION.FADE_IN;
-            }
+    public static ANIMATION intToAnimation(int value) {
+        switch (value) {
+            case 0:
+                return ANIMATION.FADE_IN;
+            case 1:
+                return ANIMATION.FADE_OUT;
+            case 2:
+                return ANIMATION.SLIDE_LEFT;
+            case 3:
+                return ANIMATION.SLIDE_RIGHT;
+            case 4:
+                return ANIMATION.SLIDE_TOP;
+            case 5:
+                return ANIMATION.SLIDE_BOTTOM;
+            case 6:
+                return ANIMATION.ROTATE;
+            case 7:
+                return ANIMATION.PARTICLE;
+            default:
+                return ANIMATION.FADE_IN;
         }
+    }
 
-        public static void apply(WireBuffer buffer, int animationId, int motionDuration,
-                                 int motionEasingType, int visibilityDuration,
-                                 int visibilityEasingType, ANIMATION enterAnimation,
-                                 ANIMATION exitAnimation) {
-            buffer.start(Operations.ANIMATION_SPEC);
-            buffer.writeInt(animationId);
-            buffer.writeInt(motionDuration);
-            buffer.writeInt(motionEasingType);
-            buffer.writeInt(visibilityDuration);
-            buffer.writeInt(visibilityEasingType);
-            buffer.writeInt(animationToInt(enterAnimation));
-            buffer.writeInt(animationToInt(exitAnimation));
-        }
+    public static void apply(WireBuffer buffer, int animationId, int motionDuration,
+                             int motionEasingType, int visibilityDuration,
+                             int visibilityEasingType, ANIMATION enterAnimation,
+                             ANIMATION exitAnimation) {
+        buffer.start(Operations.ANIMATION_SPEC);
+        buffer.writeInt(animationId);
+        buffer.writeInt(motionDuration);
+        buffer.writeInt(motionEasingType);
+        buffer.writeInt(visibilityDuration);
+        buffer.writeInt(visibilityEasingType);
+        buffer.writeInt(animationToInt(enterAnimation));
+        buffer.writeInt(animationToInt(exitAnimation));
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int animationId = buffer.readInt();
-            int motionDuration = buffer.readInt();
-            int motionEasingType = buffer.readInt();
-            int visibilityDuration = buffer.readInt();
-            int visibilityEasingType = buffer.readInt();
-            ANIMATION enterAnimation = intToAnimation(buffer.readInt());
-            ANIMATION exitAnimation = intToAnimation(buffer.readInt());
-            AnimationSpec op = new AnimationSpec(animationId, motionDuration, motionEasingType,
-                    visibilityDuration, visibilityEasingType, enterAnimation, exitAnimation);
-            operations.add(op);
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int animationId = buffer.readInt();
+        int motionDuration = buffer.readInt();
+        int motionEasingType = buffer.readInt();
+        int visibilityDuration = buffer.readInt();
+        int visibilityEasingType = buffer.readInt();
+        ANIMATION enterAnimation = intToAnimation(buffer.readInt());
+        ANIMATION exitAnimation = intToAnimation(buffer.readInt());
+        AnimationSpec op = new AnimationSpec(animationId, motionDuration, motionEasingType,
+                visibilityDuration, visibilityEasingType, enterAnimation, exitAnimation);
+        operations.add(op);
+    }
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations",
+                        id(),
+                        name())
+                .description("define the animation")
+                .field(INT, "animationId", "")
+                .field(INT, "motionDuration", "")
+                .field(INT, "motionEasingType", "")
+                .field(INT, "visibilityDuration", "")
+                .field(INT, "visibilityEasingType", "");
+
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/BoxLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/BoxLayout.java
index fea8dd2..88a49a66 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/BoxLayout.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/BoxLayout.java
@@ -22,7 +22,6 @@
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
-import com.android.internal.widget.remotecompose.core.documentation.DocumentedCompanionOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.Component;
 import com.android.internal.widget.remotecompose.core.operations.layout.ComponentStartOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.measure.ComponentMeasure;
@@ -42,7 +41,6 @@
     public static final int TOP = 4;
     public static final int BOTTOM = 5;
 
-    public static final BoxLayout.Companion COMPANION = new BoxLayout.Companion();
 
     int mHorizontalPositioning;
     int mVerticalPositioning;
@@ -127,63 +125,63 @@
             }
             m.setX(tx);
             m.setY(ty);
-            m.setVisibility(child.mVisibility);
         }
     }
 
-    public static class Companion implements DocumentedCompanionOperation {
-        @Override
-        public String name() {
-            return "BoxLayout";
-        }
+    public static String name() {
+        return "BoxLayout";
+    }
 
-        @Override
-        public int id() {
-            return Operations.LAYOUT_BOX;
-        }
+    public static int id() {
+        return Operations.LAYOUT_BOX;
+    }
 
-        public void apply(WireBuffer buffer, int componentId, int animationId,
-                          int horizontalPositioning, int verticalPositioning) {
-            buffer.start(Operations.LAYOUT_BOX);
-            buffer.writeInt(componentId);
-            buffer.writeInt(animationId);
-            buffer.writeInt(horizontalPositioning);
-            buffer.writeInt(verticalPositioning);
-        }
+    public static void apply(WireBuffer buffer, int componentId, int animationId,
+                             int horizontalPositioning, int verticalPositioning) {
+        buffer.start(Operations.LAYOUT_BOX);
+        buffer.writeInt(componentId);
+        buffer.writeInt(animationId);
+        buffer.writeInt(horizontalPositioning);
+        buffer.writeInt(verticalPositioning);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int componentId = buffer.readInt();
-            int animationId = buffer.readInt();
-            int horizontalPositioning = buffer.readInt();
-            int verticalPositioning = buffer.readInt();
-            operations.add(new BoxLayout(null, componentId, animationId,
-                    horizontalPositioning, verticalPositioning));
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int componentId = buffer.readInt();
+        int animationId = buffer.readInt();
+        int horizontalPositioning = buffer.readInt();
+        int verticalPositioning = buffer.readInt();
+        operations.add(new BoxLayout(null, componentId, animationId,
+                horizontalPositioning, verticalPositioning));
+    }
 
-        @Override
-        public void documentation(DocumentationBuilder doc) {
-            doc.operation("Layout Operations", id(), name())
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", id(), name())
                 .description("Box layout implementation.\n\n"
-                      + "Child components are laid out independently from one another,\n"
-                      + " and painted in their hierarchy order (first children drawn"
-                      + "before the latter). Horizontal and Vertical positioning"
-                      + "are supported.")
+                        + "Child components are laid out independently from one another,\n"
+                        + " and painted in their hierarchy order (first children drawn"
+                        + "before the latter). Horizontal and Vertical positioning"
+                        + "are supported.")
                 .examplesDimension(150, 100)
                 .exampleImage("Top", "layout-BoxLayout-start-top.png")
                 .exampleImage("Center", "layout-BoxLayout-center-center.png")
                 .exampleImage("Bottom", "layout-BoxLayout-end-bottom.png")
                 .field(INT, "COMPONENT_ID", "unique id for this component")
                 .field(INT, "ANIMATION_ID", "id used to match components,"
-                      + " for animation purposes")
+                        + " for animation purposes")
                 .field(INT, "HORIZONTAL_POSITIONING", "horizontal positioning value")
-                    .possibleValues("START", BoxLayout.START)
-                    .possibleValues("CENTER", BoxLayout.CENTER)
-                    .possibleValues("END", BoxLayout.END)
+                .possibleValues("START", BoxLayout.START)
+                .possibleValues("CENTER", BoxLayout.CENTER)
+                .possibleValues("END", BoxLayout.END)
                 .field(INT, "VERTICAL_POSITIONING", "vertical positioning value")
-                    .possibleValues("TOP", BoxLayout.TOP)
-                    .possibleValues("CENTER", BoxLayout.CENTER)
-                    .possibleValues("BOTTOM", BoxLayout.BOTTOM);
-        }
+                .possibleValues("TOP", BoxLayout.TOP)
+                .possibleValues("CENTER", BoxLayout.CENTER)
+                .possibleValues("BOTTOM", BoxLayout.BOTTOM);
+    }
+
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mComponentId, mAnimationId,
+                mHorizontalPositioning, mVerticalPositioning);
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CanvasLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CanvasLayout.java
new file mode 100644
index 0000000..bce7a77a
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CanvasLayout.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations.layout.managers;
+
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.layout.Component;
+import com.android.internal.widget.remotecompose.core.operations.layout.measure.ComponentMeasure;
+import com.android.internal.widget.remotecompose.core.operations.layout.measure.MeasurePass;
+
+import java.util.List;
+
+public class CanvasLayout extends BoxLayout {
+    public CanvasLayout(Component parent, int componentId, int animationId,
+                        float x, float y, float width, float height) {
+        super(parent, componentId, animationId, x, y, width, height, 0, 0);
+    }
+
+    public CanvasLayout(Component parent, int componentId, int animationId) {
+        this(parent, componentId, animationId, 0, 0, 0, 0);
+    }
+
+    @Override
+    public String toString() {
+        return "CANVAS [" + mComponentId + ":" + mAnimationId + "] (" + mX + ", "
+                + mY + " - " + mWidth + " x " + mHeight + ") " + mVisibility;
+    }
+
+    protected String getSerializedName() {
+        return "CANVAS";
+    }
+
+    public static String name() {
+        return "CanvasLayout";
+    }
+
+    public static int id() {
+        return Operations.LAYOUT_CANVAS;
+    }
+
+    public static void apply(WireBuffer buffer, int componentId, int animationId) {
+        buffer.start(Operations.LAYOUT_CANVAS);
+        buffer.writeInt(componentId);
+        buffer.writeInt(animationId);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int componentId = buffer.readInt();
+        int animationId = buffer.readInt();
+        operations.add(new CanvasLayout(null, componentId, animationId));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", id(), name())
+                .description("Canvas implementation. Encapsulate draw operations.\n\n")
+                .field(INT, "COMPONENT_ID", "unique id for this component")
+                .field(INT, "ANIMATION_ID", "id used to match components,"
+                        + " for animation purposes");
+    }
+
+    @Override
+    public void internalLayoutMeasure(PaintContext context,
+                                      MeasurePass measure) {
+        ComponentMeasure selfMeasure = measure.get(this);
+        float selfWidth = selfMeasure.getW() - mPaddingLeft - mPaddingRight;
+        float selfHeight = selfMeasure.getH() - mPaddingTop - mPaddingBottom;
+        for (Component child : mChildrenComponents) {
+            ComponentMeasure m = measure.get(child);
+            m.setX(0f);
+            m.setY(0f);
+            m.setW(selfWidth);
+            m.setH(selfHeight);
+        }
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mComponentId, mAnimationId);
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/ColumnLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/ColumnLayout.java
index a1a2de5..48d966e 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/ColumnLayout.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/ColumnLayout.java
@@ -23,7 +23,6 @@
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
-import com.android.internal.widget.remotecompose.core.documentation.DocumentedCompanionOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.Component;
 import com.android.internal.widget.remotecompose.core.operations.layout.ComponentStartOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.LayoutComponent;
@@ -48,8 +47,6 @@
     public static final int SPACE_EVENLY = 7;
     public static final int SPACE_AROUND = 8;
 
-    public static final ColumnLayout.Companion COMPANION = new ColumnLayout.Companion();
-
     int mHorizontalPositioning;
     int mVerticalPositioning;
     float mSpacedBy = 0f;
@@ -64,7 +61,7 @@
     }
 
     public ColumnLayout(Component parent, int componentId, int animationId,
-                     int horizontalPositioning, int verticalPositioning, float spacedBy) {
+                        int horizontalPositioning, int verticalPositioning, float spacedBy) {
         this(parent, componentId, animationId, 0, 0, 0, 0,
                 horizontalPositioning, verticalPositioning, spacedBy);
     }
@@ -214,7 +211,6 @@
             }
             childMeasure.setX(tx);
             childMeasure.setY(ty);
-            childMeasure.setVisibility(child.mVisibility);
             ty += childMeasure.getH();
             if (mVerticalPositioning == SPACE_BETWEEN
                     || mVerticalPositioning == SPACE_AROUND
@@ -226,66 +222,66 @@
         DebugLog.e();
     }
 
-    public static class Companion implements DocumentedCompanionOperation {
-        @Override
-        public String name() {
-            return "ColumnLayout";
-        }
+    public static String name() {
+        return "ColumnLayout";
+    }
 
-        @Override
-        public int id() {
-            return Operations.LAYOUT_COLUMN;
-        }
+    public static int id() {
+        return Operations.LAYOUT_COLUMN;
+    }
 
-        public void apply(WireBuffer buffer, int componentId, int animationId,
-                          int horizontalPositioning, int verticalPositioning, float spacedBy) {
-            buffer.start(Operations.LAYOUT_COLUMN);
-            buffer.writeInt(componentId);
-            buffer.writeInt(animationId);
-            buffer.writeInt(horizontalPositioning);
-            buffer.writeInt(verticalPositioning);
-            buffer.writeFloat(spacedBy);
-        }
+    public static void apply(WireBuffer buffer, int componentId, int animationId,
+                             int horizontalPositioning, int verticalPositioning, float spacedBy) {
+        buffer.start(Operations.LAYOUT_COLUMN);
+        buffer.writeInt(componentId);
+        buffer.writeInt(animationId);
+        buffer.writeInt(horizontalPositioning);
+        buffer.writeInt(verticalPositioning);
+        buffer.writeFloat(spacedBy);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int componentId = buffer.readInt();
-            int animationId = buffer.readInt();
-            int horizontalPositioning = buffer.readInt();
-            int verticalPositioning = buffer.readInt();
-            float spacedBy = buffer.readFloat();
-            operations.add(new ColumnLayout(null, componentId, animationId,
-                    horizontalPositioning, verticalPositioning, spacedBy));
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int componentId = buffer.readInt();
+        int animationId = buffer.readInt();
+        int horizontalPositioning = buffer.readInt();
+        int verticalPositioning = buffer.readInt();
+        float spacedBy = buffer.readFloat();
+        operations.add(new ColumnLayout(null, componentId, animationId,
+                horizontalPositioning, verticalPositioning, spacedBy));
+    }
 
-        @Override
-        public void documentation(DocumentationBuilder doc) {
-            doc.operation("Layout Operations", id(), name())
-               .description("Column layout implementation, positioning components one"
-                       + " after the other vertically.\n\n"
-                       + "It supports weight and horizontal/vertical positioning.")
-               .examplesDimension(100, 400)
-               .exampleImage("Top", "layout-ColumnLayout-start-top.png")
-               .exampleImage("Center", "layout-ColumnLayout-start-center.png")
-               .exampleImage("Bottom", "layout-ColumnLayout-start-bottom.png")
-               .exampleImage("SpaceEvenly", "layout-ColumnLayout-start-space-evenly.png")
-               .exampleImage("SpaceAround", "layout-ColumnLayout-start-space-around.png")
-               .exampleImage("SpaceBetween", "layout-ColumnLayout-start-space-between.png")
-               .field(INT, "COMPONENT_ID", "unique id for this component")
-               .field(INT, "ANIMATION_ID", "id used to match components,"
-                       + " for animation purposes")
-               .field(INT, "HORIZONTAL_POSITIONING", "horizontal positioning value")
-               .possibleValues("START", ColumnLayout.START)
-               .possibleValues("CENTER", ColumnLayout.CENTER)
-               .possibleValues("END", ColumnLayout.END)
-               .field(INT, "VERTICAL_POSITIONING", "vertical positioning value")
-               .possibleValues("TOP", ColumnLayout.TOP)
-               .possibleValues("CENTER", ColumnLayout.CENTER)
-               .possibleValues("BOTTOM", ColumnLayout.BOTTOM)
-               .possibleValues("SPACE_BETWEEN", ColumnLayout.SPACE_BETWEEN)
-               .possibleValues("SPACE_EVENLY", ColumnLayout.SPACE_EVENLY)
-               .possibleValues("SPACE_AROUND", ColumnLayout.SPACE_AROUND)
-                    .field(FLOAT, "SPACED_BY", "Horizontal spacing between components");
-        }
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", id(), name())
+                .description("Column layout implementation, positioning components one"
+                        + " after the other vertically.\n\n"
+                        + "It supports weight and horizontal/vertical positioning.")
+                .examplesDimension(100, 400)
+                .exampleImage("Top", "layout-ColumnLayout-start-top.png")
+                .exampleImage("Center", "layout-ColumnLayout-start-center.png")
+                .exampleImage("Bottom", "layout-ColumnLayout-start-bottom.png")
+                .exampleImage("SpaceEvenly", "layout-ColumnLayout-start-space-evenly.png")
+                .exampleImage("SpaceAround", "layout-ColumnLayout-start-space-around.png")
+                .exampleImage("SpaceBetween", "layout-ColumnLayout-start-space-between.png")
+                .field(INT, "COMPONENT_ID", "unique id for this component")
+                .field(INT, "ANIMATION_ID", "id used to match components,"
+                        + " for animation purposes")
+                .field(INT, "HORIZONTAL_POSITIONING", "horizontal positioning value")
+                .possibleValues("START", ColumnLayout.START)
+                .possibleValues("CENTER", ColumnLayout.CENTER)
+                .possibleValues("END", ColumnLayout.END)
+                .field(INT, "VERTICAL_POSITIONING", "vertical positioning value")
+                .possibleValues("TOP", ColumnLayout.TOP)
+                .possibleValues("CENTER", ColumnLayout.CENTER)
+                .possibleValues("BOTTOM", ColumnLayout.BOTTOM)
+                .possibleValues("SPACE_BETWEEN", ColumnLayout.SPACE_BETWEEN)
+                .possibleValues("SPACE_EVENLY", ColumnLayout.SPACE_EVENLY)
+                .possibleValues("SPACE_AROUND", ColumnLayout.SPACE_AROUND)
+                .field(FLOAT, "SPACED_BY", "Horizontal spacing between components");
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mComponentId, mAnimationId,
+                mHorizontalPositioning, mVerticalPositioning, mSpacedBy);
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/LayoutManager.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/LayoutManager.java
index 4890683..3a36617 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/LayoutManager.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/LayoutManager.java
@@ -109,12 +109,22 @@
         if (!hasWrap) {
             computeSize(context, 0f, measuredWidth, 0f, measuredHeight, measure);
         }
+
+        if (mContent != null) {
+            ComponentMeasure cm = measure.get(mContent);
+            cm.setX(0f);
+            cm.setY(0f);
+            cm.setW(measuredWidth);
+            cm.setH(measuredHeight);
+        }
+
         measuredWidth += mMarginLeft + mMarginRight;
         measuredHeight += mMarginTop + mMarginBottom;
 
         ComponentMeasure m = measure.get(this);
         m.setW(measuredWidth);
         m.setH(measuredHeight);
+        m.setVisibility(mScheduledVisibility);
 
         internalLayoutMeasure(context, measure);
     }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/RowLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/RowLayout.java
index 07e2ea1..5e452f3 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/RowLayout.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/RowLayout.java
@@ -23,7 +23,6 @@
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
-import com.android.internal.widget.remotecompose.core.documentation.DocumentedCompanionOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.Component;
 import com.android.internal.widget.remotecompose.core.operations.layout.ComponentStartOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.LayoutComponent;
@@ -48,8 +47,6 @@
     public static final int SPACE_EVENLY = 7;
     public static final int SPACE_AROUND = 8;
 
-    public static final RowLayout.Companion COMPANION = new RowLayout.Companion();
-
     int mHorizontalPositioning;
     int mVerticalPositioning;
     float mSpacedBy = 0f;
@@ -68,6 +65,7 @@
         this(parent, componentId, animationId, 0, 0, 0, 0,
                 horizontalPositioning, verticalPositioning, spacedBy);
     }
+
     @Override
     public String toString() {
         return "ROW [" + mComponentId + ":" + mAnimationId + "] (" + mX + ", "
@@ -217,7 +215,6 @@
             }
             childMeasure.setX(tx);
             childMeasure.setY(ty);
-            childMeasure.setVisibility(child.mVisibility);
             tx += childMeasure.getW();
             if (mHorizontalPositioning == SPACE_BETWEEN
                     || mHorizontalPositioning == SPACE_AROUND
@@ -229,66 +226,66 @@
         DebugLog.e();
     }
 
-    public static class Companion implements DocumentedCompanionOperation {
-        @Override
-        public String name() {
-            return "RowLayout";
-        }
+    public static String name() {
+        return "RowLayout";
+    }
 
-        @Override
-        public int id() {
-            return Operations.LAYOUT_ROW;
-        }
+    public static int id() {
+        return Operations.LAYOUT_ROW;
+    }
 
-        public void apply(WireBuffer buffer, int componentId, int animationId,
-                          int horizontalPositioning, int verticalPositioning, float spacedBy) {
-            buffer.start(Operations.LAYOUT_ROW);
-            buffer.writeInt(componentId);
-            buffer.writeInt(animationId);
-            buffer.writeInt(horizontalPositioning);
-            buffer.writeInt(verticalPositioning);
-            buffer.writeFloat(spacedBy);
-        }
+    public static void apply(WireBuffer buffer, int componentId, int animationId,
+                             int horizontalPositioning, int verticalPositioning, float spacedBy) {
+        buffer.start(Operations.LAYOUT_ROW);
+        buffer.writeInt(componentId);
+        buffer.writeInt(animationId);
+        buffer.writeInt(horizontalPositioning);
+        buffer.writeInt(verticalPositioning);
+        buffer.writeFloat(spacedBy);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int componentId = buffer.readInt();
-            int animationId = buffer.readInt();
-            int horizontalPositioning = buffer.readInt();
-            int verticalPositioning = buffer.readInt();
-            float spacedBy = buffer.readFloat();
-            operations.add(new RowLayout(null, componentId, animationId,
-                    horizontalPositioning, verticalPositioning, spacedBy));
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int componentId = buffer.readInt();
+        int animationId = buffer.readInt();
+        int horizontalPositioning = buffer.readInt();
+        int verticalPositioning = buffer.readInt();
+        float spacedBy = buffer.readFloat();
+        operations.add(new RowLayout(null, componentId, animationId,
+                horizontalPositioning, verticalPositioning, spacedBy));
+    }
 
-        @Override
-        public void documentation(DocumentationBuilder doc) {
-            doc.operation("Layout Operations", id(), name())
-                    .description("Row layout implementation, positioning components one"
-                            + " after the other horizontally.\n\n"
-                            + "It supports weight and horizontal/vertical positioning.")
-                    .examplesDimension(400, 100)
-                    .exampleImage("Start", "layout-RowLayout-start-top.png")
-                    .exampleImage("Center", "layout-RowLayout-center-top.png")
-                    .exampleImage("End", "layout-RowLayout-end-top.png")
-                    .exampleImage("SpaceEvenly", "layout-RowLayout-space-evenly-top.png")
-                    .exampleImage("SpaceAround", "layout-RowLayout-space-around-top.png")
-                    .exampleImage("SpaceBetween", "layout-RowLayout-space-between-top.png")
-                    .field(INT, "COMPONENT_ID", "unique id for this component")
-                    .field(INT, "ANIMATION_ID", "id used to match components,"
-                          + " for animation purposes")
-                    .field(INT, "HORIZONTAL_POSITIONING", "horizontal positioning value")
-                    .possibleValues("START", RowLayout.START)
-                    .possibleValues("CENTER", RowLayout.CENTER)
-                    .possibleValues("END", RowLayout.END)
-                    .possibleValues("SPACE_BETWEEN", RowLayout.SPACE_BETWEEN)
-                    .possibleValues("SPACE_EVENLY", RowLayout.SPACE_EVENLY)
-                    .possibleValues("SPACE_AROUND", RowLayout.SPACE_AROUND)
-                    .field(INT, "VERTICAL_POSITIONING", "vertical positioning value")
-                    .possibleValues("TOP", RowLayout.TOP)
-                    .possibleValues("CENTER", RowLayout.CENTER)
-                    .possibleValues("BOTTOM", RowLayout.BOTTOM)
-                    .field(FLOAT, "SPACED_BY", "Horizontal spacing between components");
-        }
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", id(), name())
+                .description("Row layout implementation, positioning components one"
+                        + " after the other horizontally.\n\n"
+                        + "It supports weight and horizontal/vertical positioning.")
+                .examplesDimension(400, 100)
+                .exampleImage("Start", "layout-RowLayout-start-top.png")
+                .exampleImage("Center", "layout-RowLayout-center-top.png")
+                .exampleImage("End", "layout-RowLayout-end-top.png")
+                .exampleImage("SpaceEvenly", "layout-RowLayout-space-evenly-top.png")
+                .exampleImage("SpaceAround", "layout-RowLayout-space-around-top.png")
+                .exampleImage("SpaceBetween", "layout-RowLayout-space-between-top.png")
+                .field(INT, "COMPONENT_ID", "unique id for this component")
+                .field(INT, "ANIMATION_ID", "id used to match components,"
+                        + " for animation purposes")
+                .field(INT, "HORIZONTAL_POSITIONING", "horizontal positioning value")
+                .possibleValues("START", RowLayout.START)
+                .possibleValues("CENTER", RowLayout.CENTER)
+                .possibleValues("END", RowLayout.END)
+                .possibleValues("SPACE_BETWEEN", RowLayout.SPACE_BETWEEN)
+                .possibleValues("SPACE_EVENLY", RowLayout.SPACE_EVENLY)
+                .possibleValues("SPACE_AROUND", RowLayout.SPACE_AROUND)
+                .field(INT, "VERTICAL_POSITIONING", "vertical positioning value")
+                .possibleValues("TOP", RowLayout.TOP)
+                .possibleValues("CENTER", RowLayout.CENTER)
+                .possibleValues("BOTTOM", RowLayout.BOTTOM)
+                .field(FLOAT, "SPACED_BY", "Horizontal spacing between components");
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mComponentId, mAnimationId,
+                mHorizontalPositioning, mVerticalPositioning, mSpacedBy);
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/TextLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/TextLayout.java
new file mode 100644
index 0000000..2370500
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/TextLayout.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations.layout.managers;
+
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.VariableSupport;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.layout.Component;
+import com.android.internal.widget.remotecompose.core.operations.layout.ComponentStartOperation;
+import com.android.internal.widget.remotecompose.core.operations.layout.measure.MeasurePass;
+import com.android.internal.widget.remotecompose.core.operations.layout.measure.Size;
+import com.android.internal.widget.remotecompose.core.operations.paint.PaintBundle;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
+
+import java.util.List;
+
+/**
+ * Text component, referencing a text id
+ */
+public class TextLayout extends LayoutManager implements ComponentStartOperation, VariableSupport {
+
+    private static final boolean DEBUG = false;
+    private int mTextId = -1;
+    private int mColor = 0;
+    private float mFontSize = 16f;
+    private int mFontStyle = 0;
+    private float mFontWeight = 400f;
+    private int mFontFamilyId = -1;
+
+    private int mType = -1;
+    private float mTextX;
+    private float mTextY;
+
+    private String mCachedString = "";
+
+    @Override
+    public void registerListening(RemoteContext context) {
+        if (mTextId != -1) {
+            context.listensTo(mTextId, this);
+        }
+    }
+
+    @Override
+    public void updateVariables(RemoteContext context) {
+        mCachedString = context.getText(mTextId);
+        if (mType == -1) {
+            if (mFontFamilyId != -1) {
+                String fontFamily = context.getText(mFontFamilyId);
+                if (fontFamily != null) {
+                    mType = 0; // default
+                    if (fontFamily.equalsIgnoreCase("default")) {
+                        mType = 0;
+                    } else if (fontFamily.equalsIgnoreCase("sans-serif")) {
+                        mType = 1;
+                    } else if (fontFamily.equalsIgnoreCase("serif")) {
+                        mType = 2;
+                    } else if (fontFamily.equalsIgnoreCase("monospace")) {
+                        mType = 3;
+                    }
+                }
+            } else {
+                mType = 0;
+            }
+        }
+        mNeedsMeasure = true;
+        needsRepaint();
+    }
+
+    public TextLayout(Component parent, int componentId, int animationId,
+                      float x, float y, float width, float height,
+                      int textId, int color, float fontSize,
+                      int fontStyle, float fontWeight, int fontFamilyId) {
+        super(parent, componentId, animationId, x, y, width, height);
+        mTextId = textId;
+        mColor = color;
+        mFontSize = fontSize;
+        mFontStyle = fontStyle;
+        mFontWeight = fontWeight;
+        mFontFamilyId = fontFamilyId;
+    }
+
+    public TextLayout(Component parent, int componentId, int animationId,
+                      int textId, int color, float fontSize,
+                      int fontStyle, float fontWeight, int fontFamilyId) {
+        this(parent, componentId, animationId, 0, 0, 0, 0,
+                textId, color, fontSize, fontStyle, fontWeight, fontFamilyId);
+    }
+
+    public PaintBundle mPaint = new PaintBundle();
+
+    @Override
+    public void paintingComponent(PaintContext context) {
+        context.save();
+        context.translate(mX, mY);
+        mComponentModifiers.paint(context);
+        float tx = mPaddingLeft;
+        float ty = mPaddingTop;
+        context.translate(tx, ty);
+
+        //////////////////////////////////////////////////////////
+        // Text content
+        //////////////////////////////////////////////////////////
+        context.savePaint();
+        mPaint.reset();
+        mPaint.setStyle(PaintBundle.STYLE_FILL);
+        mPaint.setColor(mColor);
+        mPaint.setTextSize(mFontSize);
+        mPaint.setTextStyle(mType, (int) mFontWeight, mFontStyle == 1);
+        context.applyPaint(mPaint);
+        int length = mCachedString.length();
+        context.drawTextRun(mTextId, 0, length, 0, 0, mTextX, mTextY, false);
+        if (DEBUG) {
+            mPaint.setStyle(PaintBundle.STYLE_FILL_AND_STROKE);
+            mPaint.setColor(1f, 1F, 1F, 1F);
+            mPaint.setStrokeWidth(3f);
+            context.applyPaint(mPaint);
+            context.drawLine(0f, 0f, mWidth, mHeight);
+            context.drawLine(0f, mHeight, mWidth, 0f);
+            mPaint.setColor(1f, 0F, 0F, 1F);
+            mPaint.setStrokeWidth(1f);
+            context.applyPaint(mPaint);
+            context.drawLine(0f, 0f, mWidth, mHeight);
+            context.drawLine(0f, mHeight, mWidth, 0f);
+        }
+        context.restorePaint();
+        //////////////////////////////////////////////////////////
+
+        context.translate(-tx, -ty);
+        context.restore();
+    }
+
+    @Override
+    public String toString() {
+        return "TEXT_LAYOUT [" + mComponentId + ":" + mAnimationId + "] (" + mX + ", "
+                + mY + " - " + mWidth + " x " + mHeight + ") " + mVisibility;
+    }
+
+    protected String getSerializedName() {
+        return "TEXT_LAYOUT";
+    }
+
+    @Override
+    public void serializeToString(int indent, StringSerializer serializer) {
+        serializer.append(indent, getSerializedName() + " [" + mComponentId
+                + ":" + mAnimationId + "] = "
+                + "[" + mX + ", " + mY + ", " + mWidth + ", " + mHeight + "] "
+                + mVisibility + " (" + mTextId + ":\"" + mCachedString + "\")"
+        );
+    }
+
+    @Override
+    public void computeWrapSize(PaintContext context, float maxWidth, float maxHeight,
+                                MeasurePass measure, Size size) {
+        context.savePaint();
+        mPaint.reset();
+        mPaint.setTextSize(mFontSize);
+        mPaint.setTextStyle(mType, (int) mFontWeight, mFontStyle == 1);
+        context.applyPaint(mPaint);
+        float[] bounds = new float[4];
+        int flags = PaintContext.TEXT_MEASURE_FONT_HEIGHT;
+        context.getTextBounds(mTextId, 0, mCachedString.length(), flags, bounds);
+        context.restorePaint();
+        float w = bounds[2] - bounds[0];
+        float h = bounds[3] - bounds[1];
+        size.setWidth(w);
+        mTextX = -bounds[0];
+        size.setHeight(h);
+        mTextY = -bounds[1];
+    }
+
+    public static String name() {
+        return "TextLayout";
+    }
+
+    public static int id() {
+        return Operations.LAYOUT_TEXT;
+    }
+
+    public static void apply(WireBuffer buffer, int componentId, int animationId,
+                             int textId, int color, float fontSize, int fontStyle,
+                             float fontWeight, int fontFamilyId) {
+        buffer.start(id());
+        buffer.writeInt(componentId);
+        buffer.writeInt(animationId);
+        buffer.writeInt(textId);
+        buffer.writeInt(color);
+        buffer.writeFloat(fontSize);
+        buffer.writeInt(fontStyle);
+        buffer.writeFloat(fontWeight);
+        buffer.writeInt(fontFamilyId);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int componentId = buffer.readInt();
+        int animationId = buffer.readInt();
+        int textId = buffer.readInt();
+        int color = buffer.readInt();
+        float fontSize = buffer.readFloat();
+        int fontStyle = buffer.readInt();
+        float fontWeight = buffer.readFloat();
+        int fontFamilyId = buffer.readInt();
+        operations.add(new TextLayout(null, componentId, animationId, textId, color, fontSize,
+                fontStyle, fontWeight, fontFamilyId));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", id(), name())
+                .description("Text layout implementation.\n\n")
+                .field(INT, "COMPONENT_ID", "unique id for this component")
+                .field(INT, "ANIMATION_ID", "id used to match components,"
+                        + " for animation purposes")
+                .field(INT, "COLOR", "text color")
+                .field(FLOAT, "FONT_SIZE", "font size")
+                .field(INT, "FONT_STYLE", "font style (0 = normal, 1 = italic)")
+                .field(FLOAT, "FONT_WEIGHT", "font weight (1-1000, normal = 400)")
+                .field(INT, "FONT_FAMILY_ID", "font family id");
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mComponentId, mAnimationId,
+                mTextId, mColor, mFontSize, mFontStyle,
+                mFontWeight, mFontFamilyId);
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BackgroundModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BackgroundModifierOperation.java
index 6f48aee..f3e6a8e 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BackgroundModifierOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BackgroundModifierOperation.java
@@ -15,12 +15,14 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout.modifiers;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.operations.paint.PaintBundle;
 import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
 
@@ -30,10 +32,8 @@
  * Component size-aware background draw
  */
 public class BackgroundModifierOperation extends DecoratorModifierOperation {
-
-    public static final BackgroundModifierOperation.Companion COMPANION =
-            new BackgroundModifierOperation.Companion();
-
+    private static final int OP_CODE = Operations.MODIFIER_BACKGROUND;
+    private static final String CLASS_NAME = "BackgroundModifierOperation";
     float mX;
     float mY;
     float mWidth;
@@ -62,7 +62,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mX, mY, mWidth, mHeight, mR, mG, mB, mA, mShapeType);
+        apply(buffer, mX, mY, mWidth, mHeight, mR, mG, mB, mA, mShapeType);
     }
 
     @Override
@@ -84,55 +84,50 @@
         return "BackgroundModifierOperation(" + mWidth + " x " + mHeight + ")";
     }
 
-    public static class Companion implements CompanionOperation {
-
-
-        @Override
-        public String name() {
-            return "OrigamiBackground";
-        }
-
-        @Override
-        public int id() {
-            return Operations.MODIFIER_BACKGROUND;
-        }
-
-        public void apply(WireBuffer buffer, float x, float y, float width, float height,
-                                 float r, float g, float b, float a, int shapeType) {
-            buffer.start(Operations.MODIFIER_BACKGROUND);
-            buffer.writeFloat(x);
-            buffer.writeFloat(y);
-            buffer.writeFloat(width);
-            buffer.writeFloat(height);
-            buffer.writeFloat(r);
-            buffer.writeFloat(g);
-            buffer.writeFloat(b);
-            buffer.writeFloat(a);
-            // shape type
-            buffer.writeInt(shapeType);
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            float x = buffer.readFloat();
-            float y = buffer.readFloat();
-            float width = buffer.readFloat();
-            float height = buffer.readFloat();
-            float r = buffer.readFloat();
-            float g = buffer.readFloat();
-            float b = buffer.readFloat();
-            float a = buffer.readFloat();
-            // shape type
-            int shapeType = buffer.readInt();
-            operations.add(new BackgroundModifierOperation(x, y, width, height,
-                    r, g, b, a, shapeType));
-        }
+    public static String name() {
+        return CLASS_NAME;
     }
 
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static void apply(WireBuffer buffer, float x, float y, float width, float height,
+                             float r, float g, float b, float a, int shapeType) {
+        buffer.start(OP_CODE);
+        buffer.writeFloat(x);
+        buffer.writeFloat(y);
+        buffer.writeFloat(width);
+        buffer.writeFloat(height);
+        buffer.writeFloat(r);
+        buffer.writeFloat(g);
+        buffer.writeFloat(b);
+        buffer.writeFloat(a);
+        // shape type
+        buffer.writeInt(shapeType);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        float x = buffer.readFloat();
+        float y = buffer.readFloat();
+        float width = buffer.readFloat();
+        float height = buffer.readFloat();
+        float r = buffer.readFloat();
+        float g = buffer.readFloat();
+        float b = buffer.readFloat();
+        float a = buffer.readFloat();
+        // shape type
+        int shapeType = buffer.readInt();
+        operations.add(new BackgroundModifierOperation(x, y, width, height,
+                r, g, b, a, shapeType));
+    }
+
+
     @Override
     public void paint(PaintContext context) {
         context.savePaint();
         mPaint.reset();
+        mPaint.setStyle(PaintBundle.STYLE_FILL);
         mPaint.setColor(mR, mG, mB, mA);
         context.applyPaint(mPaint);
         if (mShapeType == ShapeType.RECTANGLE) {
@@ -143,4 +138,20 @@
         }
         context.restorePaint();
     }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Modifier Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("define the Background Modifier")
+                .field(FLOAT, "x", "")
+                .field(FLOAT, "y", "")
+                .field(FLOAT, "width", "")
+                .field(FLOAT, "height", "")
+                .field(FLOAT, "r", "")
+                .field(FLOAT, "g", "")
+                .field(FLOAT, "b", "")
+                .field(FLOAT, "a", "")
+                .field(FLOAT, "shapeType", "");
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BorderModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BorderModifierOperation.java
index 0b9c01b..4c83ec4 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BorderModifierOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BorderModifierOperation.java
@@ -15,12 +15,14 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout.modifiers;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.operations.paint.PaintBundle;
 import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
 
@@ -30,9 +32,8 @@
  * Component size-aware border draw
  */
 public class BorderModifierOperation extends DecoratorModifierOperation {
-
-    public static final BorderModifierOperation.Companion COMPANION =
-            new BorderModifierOperation.Companion();
+    private static final int OP_CODE = Operations.MODIFIER_BORDER;
+    public static final String CLASS_NAME = "BorderModifierOperation";
 
     float mX;
     float mY;
@@ -75,7 +76,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mX, mY, mWidth, mHeight, mBorderWidth, mRoundedCorner,
+        apply(buffer, mX, mY, mWidth, mHeight, mBorderWidth, mRoundedCorner,
                 mR, mG, mB, mA, mShapeType);
     }
 
@@ -92,56 +93,52 @@
                 + "color(" + mR + "," + mG + "," + mB + "," + mA + ")";
     }
 
-    public static class Companion implements CompanionOperation {
 
-        @Override
-        public String name() {
-            return "BorderModifier";
-        }
-
-        @Override
-        public int id() {
-            return Operations.MODIFIER_BORDER;
-        }
-
-        public void apply(WireBuffer buffer, float x, float y, float width, float height,
-                                 float borderWidth, float roundedCorner,
-                                 float r, float g, float b, float a,
-                                 int shapeType) {
-            buffer.start(Operations.MODIFIER_BORDER);
-            buffer.writeFloat(x);
-            buffer.writeFloat(y);
-            buffer.writeFloat(width);
-            buffer.writeFloat(height);
-            buffer.writeFloat(borderWidth);
-            buffer.writeFloat(roundedCorner);
-            buffer.writeFloat(r);
-            buffer.writeFloat(g);
-            buffer.writeFloat(b);
-            buffer.writeFloat(a);
-            // shape type
-            buffer.writeInt(shapeType);
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            float x = buffer.readFloat();
-            float y = buffer.readFloat();
-            float width = buffer.readFloat();
-            float height = buffer.readFloat();
-            float bw = buffer.readFloat();
-            float rc = buffer.readFloat();
-            float r = buffer.readFloat();
-            float g = buffer.readFloat();
-            float b = buffer.readFloat();
-            float a = buffer.readFloat();
-            // shape type
-            int shapeType = buffer.readInt();
-            operations.add(new BorderModifierOperation(x, y, width, height, bw,
-                    rc, r, g, b, a, shapeType));
-        }
+    public static String name() {
+        return CLASS_NAME;
     }
 
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static void apply(WireBuffer buffer, float x, float y, float width, float height,
+                             float borderWidth, float roundedCorner,
+                             float r, float g, float b, float a,
+                             int shapeType) {
+        buffer.start(OP_CODE);
+        buffer.writeFloat(x);
+        buffer.writeFloat(y);
+        buffer.writeFloat(width);
+        buffer.writeFloat(height);
+        buffer.writeFloat(borderWidth);
+        buffer.writeFloat(roundedCorner);
+        buffer.writeFloat(r);
+        buffer.writeFloat(g);
+        buffer.writeFloat(b);
+        buffer.writeFloat(a);
+        // shape type
+        buffer.writeInt(shapeType);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        float x = buffer.readFloat();
+        float y = buffer.readFloat();
+        float width = buffer.readFloat();
+        float height = buffer.readFloat();
+        float bw = buffer.readFloat();
+        float rc = buffer.readFloat();
+        float r = buffer.readFloat();
+        float g = buffer.readFloat();
+        float b = buffer.readFloat();
+        float a = buffer.readFloat();
+        // shape type
+        int shapeType = buffer.readInt();
+        operations.add(new BorderModifierOperation(x, y, width, height, bw,
+                rc, r, g, b, a, shapeType));
+    }
+
+
     @Override
     public void paint(PaintContext context) {
         context.savePaint();
@@ -161,4 +158,22 @@
         }
         context.restorePaint();
     }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Modifier Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("define the Border Modifier")
+                .field(FLOAT, "x", "")
+                .field(FLOAT, "y", "")
+                .field(FLOAT, "width", "")
+                .field(FLOAT, "height", "")
+                .field(FLOAT, "borderWidth", "")
+                .field(FLOAT, "roundedCorner", "")
+                .field(FLOAT, "r", "")
+                .field(FLOAT, "g", "")
+                .field(FLOAT, "b", "")
+                .field(FLOAT, "a", "")
+                .field(FLOAT, "shapeType", "");
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ClipRectModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ClipRectModifierOperation.java
index 30357af..7cb7925 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ClipRectModifierOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ClipRectModifierOperation.java
@@ -15,12 +15,14 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout.modifiers;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import com.android.internal.widget.remotecompose.core.CoreDocument;
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.layout.Component;
 import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
 
 import java.util.List;
@@ -29,14 +31,11 @@
  * Support modifier clip with a rectangle
  */
 public class ClipRectModifierOperation extends DecoratorModifierOperation {
-
-    public static final ClipRectModifierOperation.Companion COMPANION =
-            new ClipRectModifierOperation.Companion();
-
+    public static final String CLASS_NAME = "ClipRectModifierOperation";
+    private static final int OP_CODE = Operations.MODIFIER_CLIP_RECT;
     float mWidth;
     float mHeight;
 
-
     @Override
     public void paint(PaintContext context) {
         context.clipRect(0f, 0f, mWidth, mHeight);
@@ -49,7 +48,8 @@
     }
 
     @Override
-    public void onClick(float x, float y) {
+    public void onClick(RemoteContext context, CoreDocument document,
+                        Component component, float x, float y) {
         // nothing
     }
 
@@ -61,28 +61,32 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer);
+        apply(buffer);
     }
 
-    public static class Companion implements CompanionOperation {
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public String name() {
-            return "ClipRectModifier";
-        }
 
-        @Override
-        public int id() {
-            return Operations.MODIFIER_CLIP_RECT;
-        }
+    public static int id() {
+        return OP_CODE;
+    }
 
-        public void apply(WireBuffer buffer) {
-            buffer.start(Operations.MODIFIER_CLIP_RECT);
-        }
+    public static void apply(WireBuffer buffer) {
+        buffer.start(OP_CODE);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            operations.add(new ClipRectModifierOperation());
-        }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        operations.add(new ClipRectModifierOperation());
+    }
+
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Canvas Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("Draw the specified round-rect");
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentModifiers.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentModifiers.java
index 2ef0b9d..f55c941 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentModifiers.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentModifiers.java
@@ -15,12 +15,15 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout.modifiers;
 
+import com.android.internal.widget.remotecompose.core.CoreDocument;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.operations.MatrixRestore;
 import com.android.internal.widget.remotecompose.core.operations.MatrixSave;
+import com.android.internal.widget.remotecompose.core.operations.layout.ClickModifierOperation;
+import com.android.internal.widget.remotecompose.core.operations.layout.Component;
 import com.android.internal.widget.remotecompose.core.operations.layout.DecoratorComponent;
 import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
 
@@ -37,6 +40,23 @@
     }
 
     @Override
+    public void apply(RemoteContext context) {
+        super.apply(context);
+        for (ModifierOperation op : mList) {
+            op.apply(context);
+        }
+    }
+
+    @Override
+    public String toString() {
+        String str =  "ComponentModifiers \n";
+        for (ModifierOperation modifierOperation : mList) {
+            str += "    " + modifierOperation.toString() + "\n";
+        }
+        return str;
+    }
+
+    @Override
     public void write(WireBuffer buffer) {
         // nothing
     }
@@ -70,7 +90,11 @@
             if (op instanceof MatrixSave || op instanceof MatrixRestore) {
                 continue;
             }
-            if (op instanceof PaintOperation) {
+            if (op instanceof ClickModifierOperation) {
+                context.translate(-tx, -ty);
+                ((ClickModifierOperation) op).paint(context);
+                context.translate(tx, ty);
+            } else if (op instanceof PaintOperation) {
                 ((PaintOperation) op).paint(context);
             }
         }
@@ -89,7 +113,9 @@
                 w -= pop.getLeft() + pop.getRight();
                 h -= pop.getTop() + pop.getBottom();
             }
-            if (op instanceof DecoratorComponent) {
+            if (op instanceof ClickModifierOperation) {
+                ((DecoratorComponent) op).layout(context, width, height);
+            } else if (op instanceof DecoratorComponent) {
                 ((DecoratorComponent) op).layout(context, w, h);
             }
         }
@@ -99,10 +125,11 @@
         mList.addAll(operations);
     }
 
-    public void onClick(float x, float y) {
+    public void onClick(RemoteContext context, CoreDocument document,
+                        Component component, float x, float y) {
         for (ModifierOperation op : mList) {
             if (op instanceof DecoratorComponent) {
-                ((DecoratorComponent) op).onClick(x, y);
+                ((DecoratorComponent) op).onClick(context, document, component, x, y);
             }
         }
     }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentVisibilityOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentVisibilityOperation.java
new file mode 100644
index 0000000..9c19073
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentVisibilityOperation.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations.layout.modifiers;
+
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
+import com.android.internal.widget.remotecompose.core.CoreDocument;
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.VariableSupport;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.layout.Component;
+import com.android.internal.widget.remotecompose.core.operations.layout.DecoratorComponent;
+import com.android.internal.widget.remotecompose.core.operations.layout.LayoutComponent;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
+
+import java.util.List;
+
+/**
+ * Allows setting visibility on a component
+ */
+public class ComponentVisibilityOperation implements ModifierOperation,
+        VariableSupport, DecoratorComponent {
+    private static final int OP_CODE = Operations.MODIFIER_VISIBILITY;
+
+    int mVisibilityId;
+    Component.Visibility mVisibility = Component.Visibility.VISIBLE;
+    private LayoutComponent mParent;
+
+    public ComponentVisibilityOperation(int id) {
+        mVisibilityId = id;
+    }
+
+    @Override
+    public String toString() {
+        return "ComponentVisibilityOperation(" + mVisibilityId + ")";
+    }
+
+    public String serializedName() {
+        return "COMPONENT_VISIBILITY";
+    }
+
+    @Override
+    public void serializeToString(int indent, StringSerializer serializer) {
+        serializer.append(indent, serializedName() + " = " + mVisibilityId);
+    }
+
+    @Override
+    public void apply(RemoteContext context) {
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return (indent != null ? indent : "") + toString();
+    }
+
+
+    @Override
+    public void write(WireBuffer buffer) {
+
+    }
+
+    public static void apply(WireBuffer buffer, int valueId) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(valueId);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int valueId = buffer.readInt();
+        operations.add(new ComponentVisibilityOperation(valueId));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", OP_CODE, "ComponentVisibility")
+                .description("This operation allows setting a component"
+                        + "visibility from a provided value")
+                .field(INT, "VALUE_ID", "Value ID representing the visibility");
+    }
+
+    @Override
+    public void registerListening(RemoteContext context) {
+        context.listensTo(mVisibilityId, this);
+    }
+
+    @Override
+    public void updateVariables(RemoteContext context) {
+        int visibility = context.getInteger(mVisibilityId);
+        if (visibility == Component.Visibility.VISIBLE.ordinal()) {
+            mVisibility = Component.Visibility.VISIBLE;
+        } else if (visibility == Component.Visibility.GONE.ordinal()) {
+            mVisibility = Component.Visibility.GONE;
+        } else if (visibility == Component.Visibility.INVISIBLE.ordinal()) {
+            mVisibility = Component.Visibility.INVISIBLE;
+        } else {
+            mVisibility = Component.Visibility.GONE;
+        }
+        if (mParent != null) {
+            mParent.setVisibility(mVisibility);
+        }
+    }
+
+    public void setParent(LayoutComponent parent) {
+        mParent = parent;
+    }
+
+    @Override
+    public void layout(RemoteContext context, float width, float height) {
+
+    }
+
+    @Override
+    public void onClick(RemoteContext context, CoreDocument document,
+                        Component component, float x, float y) {
+
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DecoratorModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DecoratorModifierOperation.java
index bf9b27b..70a5728 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DecoratorModifierOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DecoratorModifierOperation.java
@@ -15,7 +15,10 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout.modifiers;
 
+import com.android.internal.widget.remotecompose.core.CoreDocument;
 import com.android.internal.widget.remotecompose.core.PaintOperation;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.operations.layout.Component;
 import com.android.internal.widget.remotecompose.core.operations.layout.DecoratorComponent;
 
 /**
@@ -26,7 +29,8 @@
         implements ModifierOperation, DecoratorComponent {
 
     @Override
-    public void onClick(float x, float y) {
+    public void onClick(RemoteContext context, CoreDocument document,
+                        Component component, float x, float y) {
         // nothing
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DimensionModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DimensionModifierOperation.java
index 04e9431..f085ffb 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DimensionModifierOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DimensionModifierOperation.java
@@ -15,33 +15,33 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout.modifiers;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
-import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
-import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.VariableSupport;
+import com.android.internal.widget.remotecompose.core.operations.Utils;
 import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
 
-import java.util.List;
-
 /**
  * Base class for dimension modifiers
  */
-public class DimensionModifierOperation implements ModifierOperation {
-
-    public static final DimensionModifierOperation.Companion COMPANION =
-            new DimensionModifierOperation.Companion(0, "DIMENSION");
+public abstract class DimensionModifierOperation implements ModifierOperation, VariableSupport {
 
     public enum Type {
         EXACT, FILL, WRAP, WEIGHT, INTRINSIC_MIN, INTRINSIC_MAX;
 
         static Type fromInt(int value) {
             switch (value) {
-                case 0: return EXACT;
-                case 1: return FILL;
-                case 2: return WRAP;
-                case 3: return WEIGHT;
-                case 4: return INTRINSIC_MIN;
-                case 5: return INTRINSIC_MAX;
+                case 0:
+                    return EXACT;
+                case 1:
+                    return FILL;
+                case 2:
+                    return WRAP;
+                case 3:
+                    return WEIGHT;
+                case 4:
+                    return INTRINSIC_MIN;
+                case 5:
+                    return INTRINSIC_MAX;
             }
             return EXACT;
         }
@@ -49,10 +49,11 @@
 
     Type mType = Type.EXACT;
     float mValue = Float.NaN;
+    float mOutValue = Float.NaN;
 
     public DimensionModifierOperation(Type type, float value) {
         mType = type;
-        mValue = value;
+        mOutValue = mValue = value;
     }
 
     public DimensionModifierOperation(Type type) {
@@ -63,6 +64,25 @@
         this(Type.EXACT, value);
     }
 
+    @Override
+    public void updateVariables(RemoteContext context) {
+        if (mType == Type.EXACT) {
+            mOutValue = (Float.isNaN(mValue))
+                    ? context.getFloat(Utils.idFromNan(mValue)) : mValue;
+        }
+
+    }
+
+    @Override
+    public void registerListening(RemoteContext context) {
+        if (mType == Type.EXACT) {
+            if (Float.isNaN(mValue)) {
+                context.listensTo(Utils.idFromNan(mValue), this);
+            }
+        }
+
+    }
+
 
     public boolean hasWeight() {
         return mType == Type.WEIGHT;
@@ -81,17 +101,13 @@
     }
 
     public float getValue() {
-        return mValue;
+        return mOutValue;
     }
 
     public void setValue(float value) {
-        this.mValue = value;
+        mOutValue = mValue = value;
     }
 
-    @Override
-    public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mType.ordinal(), mValue);
-    }
 
     public String serializedName() {
         return "DIMENSION";
@@ -117,43 +133,4 @@
     public String toString() {
         return "DimensionModifierOperation(" + mValue + ")";
     }
-
-    public static class Companion implements CompanionOperation {
-
-        int mOperation;
-        String mName;
-
-        public Companion(int operation, String name) {
-            mOperation = operation;
-            mName = name;
-        }
-
-        @Override
-        public String name() {
-            return mName;
-        }
-
-        @Override
-        public int id() {
-            return mOperation;
-        }
-
-        public void apply(WireBuffer buffer, int type, float value) {
-            buffer.start(mOperation);
-            buffer.writeInt(type);
-            buffer.writeFloat(value);
-        }
-
-        public Operation construct(Type type, float value) {
-            return null;
-        }
-
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            Type type = Type.fromInt(buffer.readInt());
-            float value = buffer.readFloat();
-            Operation op = construct(type, value);
-            operations.add(op);
-        }
-    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HeightModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HeightModifierOperation.java
index 81173c3..a0f576a 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HeightModifierOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HeightModifierOperation.java
@@ -15,21 +15,48 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout.modifiers;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
 
 /**
  * Set the height dimension on a component
  */
 public class HeightModifierOperation extends DimensionModifierOperation {
+    private static final int OP_CODE = Operations.MODIFIER_HEIGHT;
+    public static final String CLASS_NAME = "HeightModifierOperation";
 
-    public static final DimensionModifierOperation.Companion COMPANION =
-            new DimensionModifierOperation.Companion(Operations.MODIFIER_HEIGHT, "WIDTH") {
-                @Override
-                public Operation construct(DimensionModifierOperation.Type type, float value) {
-                    return new HeightModifierOperation(type, value);
-                }
-            };
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static void apply(WireBuffer buffer, int type, float value) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(type);
+        buffer.writeFloat(value);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Type type = Type.fromInt(buffer.readInt());
+        float value = buffer.readFloat();
+        Operation op = new HeightModifierOperation(type, value);
+        operations.add(op);
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mType.ordinal(), mValue);
+    }
 
     public HeightModifierOperation(Type type, float value) {
         super(type, value);
@@ -52,4 +79,13 @@
     public String serializedName() {
         return "HEIGHT";
     }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Modifier Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("define the animation")
+                .field(INT, "type", "")
+                .field(FLOAT, "value", "");
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostActionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostActionOperation.java
new file mode 100644
index 0000000..d405b2b
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostActionOperation.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations.layout.modifiers;
+
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
+import com.android.internal.widget.remotecompose.core.CoreDocument;
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.layout.ActionOperation;
+import com.android.internal.widget.remotecompose.core.operations.layout.Component;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
+
+import java.util.List;
+
+/**
+ * Capture a host action information. This can be triggered on eg. a click.
+ */
+public class HostActionOperation implements ActionOperation {
+    private static final int OP_CODE = Operations.HOST_ACTION;
+
+    int mActionId = -1;
+
+    public HostActionOperation(int id) {
+        mActionId = id;
+    }
+
+    @Override
+    public String toString() {
+        return "HostActionOperation(" + mActionId + ")";
+    }
+
+    public int getActionId() {
+        return mActionId;
+    }
+
+    public String serializedName() {
+        return "HOST_ACTION";
+    }
+
+    @Override
+    public void serializeToString(int indent, StringSerializer serializer) {
+        serializer.append(indent, serializedName() + " = " + mActionId);
+    }
+
+    @Override
+    public void apply(RemoteContext context) {
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return (indent != null ? indent : "") + toString();
+    }
+
+
+    @Override
+    public void write(WireBuffer buffer) {
+
+    }
+
+    @Override
+    public void runAction(RemoteContext context, CoreDocument document,
+                          Component component, float x, float y) {
+        context.runAction(mActionId, "");
+    }
+
+    public static void apply(WireBuffer buffer, int actionId) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(actionId);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int actionId = buffer.readInt();
+        operations.add(new HostActionOperation(actionId));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", OP_CODE, "HostAction")
+                .description("Host action. This operation represents a host action")
+                .field(INT, "ACTION_ID", "Host Action ID");
+    }
+
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostNamedActionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostNamedActionOperation.java
new file mode 100644
index 0000000..35f202b
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostNamedActionOperation.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations.layout.modifiers;
+
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
+import com.android.internal.widget.remotecompose.core.CoreDocument;
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.layout.ActionOperation;
+import com.android.internal.widget.remotecompose.core.operations.layout.Component;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
+
+import java.util.List;
+
+/**
+ * Capture a host action information. This can be triggered on eg. a click.
+ */
+public class HostNamedActionOperation implements ActionOperation {
+    private static final int OP_CODE = Operations.HOST_NAMED_ACTION;
+
+    int mTextId = -1;
+
+    public HostNamedActionOperation(int id) {
+        mTextId = id;
+    }
+
+    @Override
+    public String toString() {
+        return "HostNamedActionOperation(" + mTextId + ")";
+    }
+
+    public String serializedName() {
+        return "HOST_NAMED_ACTION";
+    }
+
+    @Override
+    public void serializeToString(int indent, StringSerializer serializer) {
+        serializer.append(indent, serializedName() + " = " + mTextId);
+    }
+
+    @Override
+    public void apply(RemoteContext context) {
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return (indent != null ? indent : "") + toString();
+    }
+
+
+    @Override
+    public void write(WireBuffer buffer) {
+
+    }
+
+    @Override
+    public void runAction(RemoteContext context, CoreDocument document,
+                          Component component, float x, float y) {
+        context.runNamedAction(mTextId);
+    }
+
+    public static void apply(WireBuffer buffer, int textId) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(textId);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int textId = buffer.readInt();
+        operations.add(new HostNamedActionOperation(textId));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", OP_CODE, "HostNamedAction")
+                .description("Host Named action. This operation represents a host action")
+                .field(INT, "TEXT_ID", "Named Host Action Text ID");
+    }
+
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/PaddingModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/PaddingModifierOperation.java
index 5ea6a97..668db3b 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/PaddingModifierOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/PaddingModifierOperation.java
@@ -15,11 +15,13 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout.modifiers;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
 
 import java.util.List;
@@ -29,10 +31,8 @@
  * Padding modifiers can be chained and will impact following modifiers.
  */
 public class PaddingModifierOperation implements ModifierOperation {
-
-    public static final PaddingModifierOperation.Companion COMPANION =
-            new PaddingModifierOperation.Companion();
-
+    private static final int OP_CODE = Operations.MODIFIER_PADDING;
+    public static final String CLASS_NAME = "PaddingModifierOperation";
     float mLeft;
     float mTop;
     float mRight;
@@ -79,7 +79,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mLeft, mTop, mRight, mBottom);
+        apply(buffer, mLeft, mTop, mRight, mBottom);
     }
 
     @Override
@@ -103,33 +103,39 @@
                 + ", " + mRight + ", " + mBottom + ")";
     }
 
-    public static class Companion implements CompanionOperation {
-        @Override
-        public String name() {
-            return "PaddingModifierOperation";
-        }
+    public static String name() {
+        return CLASS_NAME;
+    }
 
-        @Override
-        public int id() {
-            return Operations.MODIFIER_PADDING;
-        }
+    public static int id() {
+        return Operations.MODIFIER_PADDING;
+    }
 
-        public void apply(WireBuffer buffer,
-                                 float left, float top, float right, float bottom) {
-            buffer.start(Operations.MODIFIER_PADDING);
-            buffer.writeFloat(left);
-            buffer.writeFloat(top);
-            buffer.writeFloat(right);
-            buffer.writeFloat(bottom);
-        }
+    public static void apply(WireBuffer buffer,
+                             float left, float top, float right, float bottom) {
+        buffer.start(Operations.MODIFIER_PADDING);
+        buffer.writeFloat(left);
+        buffer.writeFloat(top);
+        buffer.writeFloat(right);
+        buffer.writeFloat(bottom);
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            float left = buffer.readFloat();
-            float top = buffer.readFloat();
-            float right = buffer.readFloat();
-            float bottom = buffer.readFloat();
-            operations.add(new PaddingModifierOperation(left, top, right, bottom));
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        float left = buffer.readFloat();
+        float top = buffer.readFloat();
+        float right = buffer.readFloat();
+        float bottom = buffer.readFloat();
+        operations.add(new PaddingModifierOperation(left, top, right, bottom));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Modifier Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("define the Padding Modifier")
+                .field(FLOAT, "left", "")
+                .field(FLOAT, "top", "")
+                .field(FLOAT, "right", "")
+                .field(FLOAT, "bottom", "");
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RoundedClipRectModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RoundedClipRectModifierOperation.java
index 9c57c6a..9b662bf5 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RoundedClipRectModifierOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RoundedClipRectModifierOperation.java
@@ -15,30 +15,72 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout.modifiers;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+
+import com.android.internal.widget.remotecompose.core.CoreDocument;
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.operations.DrawBase4;
+import com.android.internal.widget.remotecompose.core.operations.layout.Component;
 import com.android.internal.widget.remotecompose.core.operations.layout.DecoratorComponent;
 import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
 
+import java.util.List;
+
 /**
- * Support clip with a rectangle
+ * Support clip with a rounded rectangle
  */
 public class RoundedClipRectModifierOperation extends DrawBase4
         implements ModifierOperation, DecoratorComponent {
+    public static final int OP_CODE = Operations.MODIFIER_ROUNDED_CLIP_RECT;
+    public static final String CLASS_NAME = "RoundedClipRectModifierOperation";
 
-    public static final Companion COMPANION =
-            new Companion(Operations.MODIFIER_ROUNDED_CLIP_RECT) {
-                @Override
-                public Operation construct(float x1,
-                                           float y1,
-                                           float x2,
-                                           float y2) {
-                    return new RoundedClipRectModifierOperation(x1, y1, x2, y2);
-                }
-            };
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Maker m = RoundedClipRectModifierOperation::new;
+        read(m, buffer, operations);
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+
+    protected void write(WireBuffer buffer,
+                         float v1,
+                         float v2,
+                         float v3,
+                         float v4) {
+        apply(buffer, v1, v2, v3, v4);
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Modifier Operations",
+                        id(),
+                        "RoundedClipRectModifierOperation")
+                .description("clip with rectangle")
+                .field(FLOAT, "topStart",
+                        "The topStart radius of the rectangle to "
+                                + "intersect with the current clip")
+                .field(FLOAT, "topEnd",
+                        "The topEnd radius of the rectangle to "
+                                + "intersect with the current clip")
+                .field(FLOAT, "bottomStart",
+                        "The bottomStart radius of the rectangle to "
+                                + "intersect with the current clip")
+                .field(FLOAT, "bottomEnd",
+                        "The bottomEnd radius of the rectangle to "
+                                + "intersect with the current clip");
+    }
+
+
     float mWidth;
     float mHeight;
 
@@ -49,7 +91,7 @@
             float bottomStart,
             float bottomEnd) {
         super(topStart, topEnd, bottomStart, bottomEnd);
-        mName = "ModifierRoundedClipRect";
+        mName = CLASS_NAME;
     }
 
     @Override
@@ -64,15 +106,33 @@
     }
 
     @Override
-    public void onClick(float x, float y) {
+    public void onClick(RemoteContext context, CoreDocument document,
+                        Component component, float x, float y) {
         // nothing
     }
 
     @Override
     public void serializeToString(int indent, StringSerializer serializer) {
         serializer.append(
-                indent, "ROUND_CLIP = [" + mWidth + ", " + mHeight
+                indent, "ROUNDED_CLIP_RECT = [" + mWidth + ", " + mHeight
                         + ", " + mX1 + ", " + mY1
                         + ", " + mX2 + ", " + mY2 + "]");
     }
+
+    /**
+     * Writes out the rounded rect clip to the buffer
+     *
+     * @param buffer        buffer to write to
+     * @param topStart      topStart radius
+     * @param topEnd        topEnd radius
+     * @param bottomStart   bottomStart radius
+     * @param bottomEnd     bottomEnd radius
+     */
+    public static void apply(WireBuffer buffer,
+                             float topStart,
+                             float topEnd,
+                             float bottomStart,
+                             float bottomEnd) {
+        write(buffer, OP_CODE, topStart, topEnd, bottomStart, bottomEnd);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueIntegerChangeActionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueIntegerChangeActionOperation.java
new file mode 100644
index 0000000..3f19c9b
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueIntegerChangeActionOperation.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations.layout.modifiers;
+
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
+import com.android.internal.widget.remotecompose.core.CoreDocument;
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.layout.ActionOperation;
+import com.android.internal.widget.remotecompose.core.operations.layout.Component;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
+
+import java.util.List;
+
+/**
+ * Apply a value change on an integer variable.
+ */
+public class ValueIntegerChangeActionOperation implements ActionOperation {
+    private static final int OP_CODE = Operations.VALUE_INTEGER_CHANGE_ACTION;
+
+    int mTargetValueId = -1;
+    int mValue = -1;
+
+    public ValueIntegerChangeActionOperation(int id, int value) {
+        mTargetValueId = id;
+        mValue = value;
+    }
+
+    @Override
+    public String toString() {
+        return "ValueChangeActionOperation(" + mTargetValueId + ")";
+    }
+
+    public String serializedName() {
+        return "VALUE_INTEGER_CHANGE";
+    }
+
+    @Override
+    public void serializeToString(int indent, StringSerializer serializer) {
+        serializer.append(indent, serializedName()
+                + " = " + mTargetValueId + " -> " + mValue);
+    }
+
+    @Override
+    public void apply(RemoteContext context) {
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return (indent != null ? indent : "") + toString();
+    }
+
+
+    @Override
+    public void write(WireBuffer buffer) {
+
+    }
+
+    @Override
+    public void runAction(RemoteContext context, CoreDocument document,
+                          Component component, float x, float y) {
+        context.overrideInteger(mTargetValueId, mValue);
+    }
+
+    public static void apply(WireBuffer buffer, int valueId, int value) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(valueId);
+        buffer.writeInt(value);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int valueId = buffer.readInt();
+        int value = buffer.readInt();
+        operations.add(new ValueIntegerChangeActionOperation(valueId, value));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", OP_CODE, "ValueIntegerChangeActionOperation")
+                .description("ValueIntegerChange action. "
+                        + " This operation represents a value change for the given id")
+                .field(INT, "TARGET_VALUE_ID", "Value ID")
+                .field(INT, "VALUE", "integer value to be assigned to the target")
+        ;
+    }
+
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueStringChangeActionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueStringChangeActionOperation.java
new file mode 100644
index 0000000..e2542e5
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueStringChangeActionOperation.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations.layout.modifiers;
+
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
+import com.android.internal.widget.remotecompose.core.CoreDocument;
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.layout.ActionOperation;
+import com.android.internal.widget.remotecompose.core.operations.layout.Component;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
+
+import java.util.List;
+
+/**
+ * Apply a value change on a string variable.
+ */
+public class ValueStringChangeActionOperation implements ActionOperation {
+    private static final int OP_CODE = Operations.VALUE_STRING_CHANGE_ACTION;
+
+    int mTargetValueId = -1;
+    int mValueId = -1;
+
+    public ValueStringChangeActionOperation(int id, int value) {
+        mTargetValueId = id;
+        mValueId = value;
+    }
+
+    @Override
+    public String toString() {
+        return "ValueChangeActionOperation(" + mTargetValueId + ")";
+    }
+
+    public int getActionId() {
+        return mTargetValueId;
+    }
+
+    public String serializedName() {
+        return "VALUE_CHANGE";
+    }
+
+    @Override
+    public void serializeToString(int indent, StringSerializer serializer) {
+        serializer.append(indent, serializedName() + " = " + mTargetValueId + " -> " + mValueId);
+    }
+
+    @Override
+    public void apply(RemoteContext context) {
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return (indent != null ? indent : "") + toString();
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+
+    }
+
+    @Override
+    public void runAction(RemoteContext context, CoreDocument document,
+                          Component component, float x, float y) {
+        context.overrideText(mTargetValueId, mValueId);
+    }
+
+    public static void apply(WireBuffer buffer, int valueId, int value) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(valueId);
+        buffer.writeInt(value);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int valueId = buffer.readInt();
+        int value = buffer.readInt();
+        operations.add(new ValueStringChangeActionOperation(valueId, value));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Layout Operations", OP_CODE, "ValueStringChangeActionOperation")
+                .description("ValueStrin gChange action. "
+                        + " This operation represents a String change (referenced by id) "
+                        + "for the given string id")
+                .field(INT, "TARGET_ID", "Target Value ID")
+                .field(INT, "VALUE_ID", "Value ID to be assigned to the target "
+                        + "value as a string")
+        ;
+    }
+
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/WidthModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/WidthModifierOperation.java
index c46c8d7..7fd5e51 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/WidthModifierOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/WidthModifierOperation.java
@@ -15,26 +15,54 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.layout.modifiers;
 
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.FLOAT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
 
 /**
  * Set the width dimension on a component
  */
 public class WidthModifierOperation extends DimensionModifierOperation {
+    private static final int OP_CODE = Operations.MODIFIER_WIDTH;
+    public static final String CLASS_NAME = "WidthModifierOperation";
 
-    public static final DimensionModifierOperation.Companion COMPANION =
-            new DimensionModifierOperation.Companion(Operations.MODIFIER_WIDTH, "WIDTH") {
-                @Override
-                public Operation construct(DimensionModifierOperation.Type type, float value) {
-                    return new WidthModifierOperation(type, value);
-                }
-            };
+
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    public static int id() {
+        return OP_CODE;
+    }
+
+    public static void apply(WireBuffer buffer, int type, float value) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(type);
+        buffer.writeFloat(value);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        Type type = Type.fromInt(buffer.readInt());
+        float value = buffer.readFloat();
+        Operation op = new WidthModifierOperation(type, value);
+        operations.add(op);
+    }
 
     public WidthModifierOperation(Type type, float value) {
         super(type, value);
     }
 
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mType.ordinal(), mValue);
+    }
+
     public WidthModifierOperation(Type type) {
         super(type);
     }
@@ -52,4 +80,13 @@
     public String serializedName() {
         return "WIDTH";
     }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Modifier Operations",
+                        OP_CODE,
+                        CLASS_NAME)
+                .description("define the animation")
+                .field(INT, "type", "")
+                .field(FLOAT, "value", "");
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintBundle.java b/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintBundle.java
index 8186192..6c8049a 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintBundle.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintBundle.java
@@ -714,7 +714,7 @@
      * @param a alpha (0.0 to 1.0)
      */
     public void setColor(float r, float g, float b, float a) {
-        setColor((int) r * 255, (int) g * 255, (int) b * 255, (int) a * 255);
+        setColor((int) (r * 255), (int) (g * 255), (int) (b * 255), (int) (a * 255));
     }
 
     /**
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/AnimatedFloatExpression.java b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/AnimatedFloatExpression.java
index 616048d..5b295eb 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/AnimatedFloatExpression.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/AnimatedFloatExpression.java
@@ -15,12 +15,15 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.utilities;
 
+import static com.android.internal.widget.remotecompose.core.operations.utilities.NanMap.ID_REGION_ARRAY;
+import static com.android.internal.widget.remotecompose.core.operations.utilities.NanMap.ID_REGION_MASK;
+
 /**
  * high performance floating point expression evaluator used in animation
  */
 public class AnimatedFloatExpression {
     static IntMap<String> sNames = new IntMap<>();
-    public static final int OFFSET = 0x100;
+    public static final int OFFSET = 0x310_000;
     public static final float ADD = asNan(OFFSET + 1);
     public static final float SUB = asNan(OFFSET + 2);
     public static final float MUL = asNan(OFFSET + 3);
@@ -57,11 +60,18 @@
     public static final float CEIL = asNan(OFFSET + 31);
 
 
-    public static final float LAST_OP = 31;
+    // Array ops
+    public static final float A_DEREF = asNan(OFFSET + 32);
+    public static final float A_MAX = asNan(OFFSET + 33);
+    public static final float A_MIN = asNan(OFFSET + 34);
+    public static final float A_SUM = asNan(OFFSET + 35);
+    public static final float A_AVG = asNan(OFFSET + 36);
+    public static final float A_LEN = asNan(OFFSET + 37);
+    public static final int LAST_OP = OFFSET + 37;
 
 
-    public static final float VAR1 = asNan(OFFSET + 27);
-    public static final float VAR2 = asNan(OFFSET + 28);
+    public static final float VAR1 = asNan(OFFSET + 38);
+    public static final float VAR2 = asNan(OFFSET + 39);
 
     // TODO CLAMP, CBRT, DEG, RAD, EXPM1, CEIL, FLOOR
     private static final float FP_PI = (float) Math.PI;
@@ -71,16 +81,23 @@
     float[] mStack;
     float[] mLocalStack = new float[128];
     float[] mVar;
+    CollectionsAccess mCollectionsAccess;
 
     /**
      * is float a math operator
+     *
      * @param v
      * @return
      */
     public static boolean isMathOperator(float v) {
         if (Float.isNaN(v)) {
             int pos = fromNaN(v);
-            return pos > OFFSET && pos <= OFFSET + LAST_OP;
+            // a data variable is a type of math operator for expressions
+            // it dereference to a value
+            if (NanMap.isDataVariable(v)) {
+                return false;
+            }
+            return pos > OFFSET && pos <= LAST_OP;
         }
         return false;
     }
@@ -89,8 +106,21 @@
         int eval(int sp);
     }
 
+
     /**
      * Evaluate a float expression
+     * This system works by processing an Array of float (float[])
+     * in reverse polish notation (rpn)
+     * Within that array some floats are commands
+     * they are encoded within an NaN.
+     * After processing the array the last item on the array is returned.
+     * The system supports variables allowing expressions like.
+     * sin(sqrt(x*x+y*y))/sqrt(x*x+y*y)
+     * Where x & y are passe as parameters
+     * Examples:
+     * (1+2)  (1, 2, ADD) adds two numbers returns 3
+     * eval(new float[]{ Var1, Var * }
+     *
      * @param exp
      * @param var
      * @return
@@ -110,8 +140,46 @@
         return mStack[sp];
     }
 
+
     /**
      * Evaluate a float expression
+     *
+     * @param ca
+     * @param exp
+     * @param var
+     * @return
+     */
+    public float eval(CollectionsAccess ca, float[] exp, float... var) {
+        mStack = exp;
+        mVar = var;
+        mCollectionsAccess = ca;
+        int sp = -1;
+
+        for (int i = 0; i < mStack.length; i++) {
+            float v = mStack[i];
+            if (Float.isNaN(v)) {
+                int id = fromNaN(v);
+                if ((id & ID_REGION_MASK) != ID_REGION_ARRAY) {
+                    sp = mOps[id - OFFSET].eval(sp);
+                } else {
+                    mStack[++sp] = v;
+                }
+            } else {
+                mStack[++sp] = v;
+            }
+        }
+        return mStack[sp];
+    }
+
+
+    private int dereference(CollectionsAccess ca, int id, int sp) {
+        mStack[sp] = ca.getFloatValue(id, (int) (mStack[sp]));
+        return sp;
+    }
+
+    /**
+     * Evaluate a float expression
+     *
      * @param exp
      * @param len
      * @param var
@@ -135,6 +203,7 @@
 
     /**
      * Evaluate a float expression
+     *
      * @param exp
      * @param var
      * @return
@@ -283,6 +352,58 @@
                 mStack[sp] = (float) Math.ceil(mStack[sp]);
                 return sp;
             },
+            (sp) -> { // A_DEREF
+                int id = fromNaN(mStack[sp]);
+                mStack[sp] = mCollectionsAccess.getFloatValue(id, (int) (mStack[sp - 1]));
+                return sp - 1;
+            },
+            (sp) -> { // A_MAX
+                int id = fromNaN(mStack[sp]);
+                float[] array = mCollectionsAccess.getFloats(id);
+                float max = array[0];
+                for (int i = 1; i < array.length; i++) {
+                    max = Math.max(max, array[i]);
+                }
+                mStack[sp] = max;
+                return sp;
+            },
+            (sp) -> { // A_MIN
+                int id = fromNaN(mStack[sp]);
+                float[] array = mCollectionsAccess.getFloats(id);
+                float max = array[0];
+                for (int i = 1; i < array.length; i++) {
+                    max = Math.max(max, array[i]);
+                }
+                mStack[sp] = max;
+                return sp;
+            },
+            (sp) -> { // A_SUM
+                int id = fromNaN(mStack[sp]);
+                float[] array = mCollectionsAccess.getFloats(id);
+                float sum = 0;
+                for (int i = 0; i < array.length; i++) {
+                    sum += array[i];
+                }
+                mStack[sp] = sum;
+                return sp;
+            },
+            (sp) -> { // A_AVG
+                int id = fromNaN(mStack[sp]);
+                float[] array = mCollectionsAccess.getFloats(id);
+                float sum = 0;
+                for (int i = 0; i < array.length; i++) {
+                    sum += array[i];
+                }
+                mStack[sp] = sum / array.length;
+                return sp;
+            },
+            (sp) -> { // A_LEN
+                int id = fromNaN(mStack[sp]);
+                mStack[sp] = mCollectionsAccess.getFloatsLength(id);
+                return sp;
+            },
+
+
             (sp) -> { // first var =
                 mStack[sp] = mVar[0];
                 return sp;
@@ -331,6 +452,14 @@
         sNames.put(k++, "deg");
         sNames.put(k++, "rad");
         sNames.put(k++, "ceil");
+
+        sNames.put(k++, "A_DEREF");
+        sNames.put(k++, "A_MAX");
+        sNames.put(k++, "A_MIN");
+        sNames.put(k++, "A_SUM");
+        sNames.put(k++, "A_AVG");
+        sNames.put(k++, "A_LEN");
+
         sNames.put(k++, "a[0]");
         sNames.put(k++, "a[1]");
         sNames.put(k++, "a[2]");
@@ -338,6 +467,7 @@
 
     /**
      * given a float command return its math name (e.g sin, cos etc.)
+     *
      * @param f
      * @return
      */
@@ -348,6 +478,7 @@
 
     /**
      * Convert an expression encoded as an array of floats int ot a string
+     *
      * @param exp
      * @param labels
      * @return
@@ -360,15 +491,21 @@
                 if (isMathOperator(v)) {
                     s.append(toMathName(v));
                 } else {
+                    int id = fromNaN(v);
+                    String idString = (id > ID_REGION_ARRAY) ? ("A_" + (id & 0xFFFFF)) : "" + id;
                     s.append("[");
-                    s.append(fromNaN(v));
+                    s.append(idString);
                     s.append("]");
                 }
             } else {
-                if (labels[i] != null) {
+                if (labels != null && labels[i] != null) {
                     s.append(labels[i]);
+                    if (!labels[i].contains("_")) {
+                        s.append(v);
+                    }
+                } else {
+                    s.append(v);
                 }
-                s.append(v);
             }
             s.append(" ");
         }
@@ -423,6 +560,7 @@
 
     /**
      * to be used by parser to determine if command is infix
+     *
      * @param n
      * @return
      */
@@ -432,6 +570,7 @@
 
     /**
      * Convert an id into a NaN object
+     *
      * @param v
      * @return
      */
@@ -441,12 +580,12 @@
 
     /**
      * Get ID from a NaN float
+     *
      * @param v
      * @return
      */
     public static int fromNaN(float v) {
         int b = Float.floatToRawIntBits(v);
-        return b & 0xFFFFF;
+        return b & 0x7FFFFF;
     }
-
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/ArrayAccess.java b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/ArrayAccess.java
new file mode 100644
index 0000000..4c7cc38
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/ArrayAccess.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2023 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.internal.widget.remotecompose.core.operations.utilities;
+
+public interface ArrayAccess {
+    float getFloatValue(int index);
+    float[] getFloats();
+    int getFloatsLength();
+
+    default int getIntValue(int index) {
+        return (int) getFloatValue(index);
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/CollectionsAccess.java b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/CollectionsAccess.java
new file mode 100644
index 0000000..9e53126
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/CollectionsAccess.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.operations.utilities;
+
+public interface CollectionsAccess {
+    float getFloatValue(int id, int index);
+    float[] getFloats(int id);
+    int getFloatsLength(int id);
+
+    default int getIntValue(int id, int index) {
+        return (int) getFloatValue(id, index);
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/ColorUtils.java b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/ColorUtils.java
index 0ea28a8..fb96cef 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/ColorUtils.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/ColorUtils.java
@@ -65,4 +65,17 @@
         }
         return 0;
     }
+
+    /**
+     * Utility function to create a color as an int
+     *
+     * @param r red
+     * @param g green
+     * @param b blue
+     * @param a alpha
+     * @return int packed color
+     */
+    public static int createColor(int r, int g, int b, int a) {
+        return (a << 24) | (r << 16) | (g << 8) | b;
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/IntegerExpressionEvaluator.java b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/IntegerExpressionEvaluator.java
index a4fce80..ae61ec1 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/IntegerExpressionEvaluator.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/IntegerExpressionEvaluator.java
@@ -17,6 +17,9 @@
 
 /**
  * High performance Integer expression evaluator
+ *
+ * The evaluation is based on int opMask, int[]exp
+ * exp[i] is an operator if (opMask*(1 << i) != 0)
  */
 public class IntegerExpressionEvaluator {
     static IntMap<String> sNames = new IntMap<>();
@@ -64,11 +67,11 @@
     }
 
     /**
-     * Evaluate a float expression
-     *
-     * @param exp
-     * @param var
-     * @return
+     * Evaluate an integer expression
+     * @param mask bits that are operators
+     * @param exp rpn sequence of values and operators
+     * @param var variables if the expression is a function
+     * @return return the results of evaluating the expression
      */
     public int eval(int mask, int[] exp, int... var) {
         mStack = exp;
@@ -86,12 +89,12 @@
     }
 
     /**
-     * Evaluate a int expression
-     *
-     * @param exp
-     * @param len
-     * @param var
-     * @return
+     * Evaluate a integer expression
+     * @param mask bits that are operators
+     * @param exp rpn sequence of values and operators
+     * @param len the number of values in the expression
+     * @param var variables if the expression is a function
+     * @return return the results of evaluating the expression
      */
     public int eval(int mask, int[] exp, int len, int... var) {
         System.arraycopy(exp, 0, mLocalStack, 0, len);
@@ -111,18 +114,18 @@
 
     /**
      * Evaluate a int expression
-     *
-     * @param exp
-     * @param var
-     * @return
+     * @param opMask bits that are operators
+     * @param exp rpn sequence of values and operators
+     * @param var variables if the expression is a function
+     * @return return the results of evaluating the expression
      */
-    public int evalDB(int mask, int[] exp, int... var) {
+    public int evalDB(int opMask, int[] exp, int... var) {
         mStack = exp;
         mVar = var;
         int sp = -1;
         for (int i = 0; i < exp.length; i++) {
             int v = mStack[i];
-            if (((1 << i) & mask) != 0) {
+            if (((1 << i) & opMask) != 0) {
                 System.out.print(" " + sNames.get((v - OFFSET)));
                 sp = mOps[v - OFFSET].eval(sp);
             } else {
@@ -281,8 +284,8 @@
     /**
      * given a int command return its math name (e.g sin, cos etc.)
      *
-     * @param f
-     * @return
+     * @param f the numerical value of the function + offset
+     * @return the math name of the function
      */
     public static String toMathName(int f) {
         int id = f - OFFSET;
@@ -290,18 +293,19 @@
     }
 
     /**
-     * Convert an expression encoded as an array of ints int ot a string
+     * Convert an expression encoded as an array of ints int to a string
      *
-     * @param exp
-     * @param labels
+     * @param opMask bits that are operators
+     * @param exp rpn sequence of values and operators
+     * @param labels String that represent the variable names
      * @return
      */
-    public static String toString(int mask, int[] exp, String[] labels) {
+    public static String toString(int opMask, int[] exp, String[] labels) {
         StringBuilder s = new StringBuilder();
         for (int i = 0; i < exp.length; i++) {
             int v = exp[i];
 
-            if (((1 << i) & mask) != 0) {
+            if (((1 << i) & opMask) != 0) {
                 if (v < OFFSET) {
                     s.append(toMathName(v));
                 } else {
@@ -323,18 +327,18 @@
     /**
      * Convert an expression encoded as an array of ints int ot a string
      *
-     * @param mask bit mask of operators vs commands
-     * @param exp
-     * @return
+     * @param opMask bit mask of operators vs commands
+     * @param exp rpn sequence of values and operators
+     * @return string representation of the expression
      */
-    public static String toString(int mask, int[] exp) {
+    public static String toString(int opMask, int[] exp) {
         StringBuilder s = new StringBuilder();
-        s.append(Integer.toBinaryString(mask));
+        s.append(Integer.toBinaryString(opMask));
         s.append(" : ");
         for (int i = 0; i < exp.length; i++) {
             int v = exp[i];
 
-            if (((1 << i) & mask) != 0) {
+            if (((1 << i) & opMask) != 0) {
                 if (v > OFFSET) {
                     s.append(" ");
                     s.append(toMathName(v));
@@ -353,16 +357,15 @@
 
     /**
      * This creates an infix string expression
-     * @param mask The bits that are operators
+     * @param opMask The bits that are operators
      * @param exp the array of expressions
      * @return infix string
      */
-    public static String toStringInfix(int mask, int[] exp) {
-        return toString(mask, exp, exp.length - 1);
+    public static String toStringInfix(int opMask, int[] exp) {
+        return toString(opMask, exp, exp.length - 1);
     }
 
     static String toString(int mask, int[] exp, int sp) {
-        String[] str = new String[exp.length];
         if (((1 << sp) & mask) != 0) {
             int id = exp[sp] - OFFSET;
             switch (NO_OF_OPS[id]) {
@@ -418,11 +421,11 @@
 
     /**
      * is it an id or operation
-     * @param mask the bits that mark elements as an operation
+     * @param opMask the bits that mark elements as an operation
      * @param i the bit to check
      * @return true if the bit is 1
      */
-    public static boolean isOperation(int mask, int i) {
-        return ((1 << i) & mask) != 0;
+    public static boolean isOperation(int opMask, int i) {
+        return ((1 << i) & opMask) != 0;
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/NanMap.java b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/NanMap.java
index f4cd504..1e669c6 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/NanMap.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/NanMap.java
@@ -19,20 +19,25 @@
 
 /**
  * This defines the major id maps and ranges used by remote compose
- * Generally ids ranging from 0 ... FFF (4095) are for ids
+ * Generally ids ranging from 1 ... 7FFFFF (4095) are for ids
+ * The data range is divided int to bits
+ * 0xxxxx are allocated for Predefined Global System Variables
+ * 1xxxxx are allocated to normal variables
+ * 2xxxxx are allocated to List&MAPS (Arrays of stuff)
+ * 3xxxxx are allocated to path & float operations
+ * 4xxxxx,5xxxxx,7xxxxx are reserved for future use
  * 0x1000-0x1100 are used for path operations in PathData
  * 0x1100-0x1200 are used for math operations in Animated float
  * 0x
  */
 public class NanMap {
-
-    public static final int MOVE = 0x1000;
-    public static final int LINE = 0x1001;
-    public static final int QUADRATIC = 0x1002;
-    public static final int CONIC = 0x1003;
-    public static final int CUBIC = 0x1004;
-    public static final int CLOSE = 0x1005;
-    public static final int DONE = 0x1006;
+    public static final int MOVE = 0x300_000;
+    public static final int LINE = 0x300_001;
+    public static final int QUADRATIC = 0x300_002;
+    public static final int CONIC = 0x300_003;
+    public static final int CUBIC = 0x300_004;
+    public static final int CLOSE = 0x300_005;
+    public static final int DONE = 0x300_006;
     public static final float MOVE_NAN = Utils.asNan(MOVE);
     public static final float LINE_NAN = Utils.asNan(LINE);
     public static final float QUADRATIC_NAN = Utils.asNan(QUADRATIC);
@@ -41,31 +46,46 @@
     public static final float CLOSE_NAN = Utils.asNan(CLOSE);
     public static final float DONE_NAN = Utils.asNan(DONE);
 
-    /**
-     *
-     */
-    public static final float ADD = asNan(0x1100);
-    public static final float SUB = asNan(0x1101);
-    public static final float MUL = asNan(0x1102);
-    public static final float DIV = asNan(0x1103);
-    public static final float MOD = asNan(0x1104);
-    public static final float MIN = asNan(0x1105);
-    public static final float MAX = asNan(0x1106);
-    public static final float POW = asNan(0x1107);
+    public static boolean isSystemVariable(float value) {
+        return (fromNaN(value) >> 20) == 0;
+    }
+
+    public static boolean isNormalVariable(float value) {
+        return (fromNaN(value) >> 20) == 1;
+    }
+
+    public static boolean isDataVariable(float value) {
+        return (fromNaN(value) >> 20) == 2;
+    }
+
+    public static boolean isOperationVariable(float value) {
+        return (fromNaN(value) >> 20) == 3;
+    }
+
+    public static final int START_VAR = (1 << 20) + 42;
+    public static final int START_ARRAY = (2 << 20) + 42;
+    public static final int TYPE_SYSTEM = 0;
+    public static final int TYPE_VARIABLE = 1;
+    public static final int TYPE_ARRAY = 2;
+    public static final int TYPE_OPERATION = 3;
+    public static final int ID_REGION_MASK = 0x700000;
+    public static final int ID_REGION_ARRAY = 0x200000;
 
 
     /**
      * Get ID from Nan float
+     *
      * @param v
      * @return
      */
     public static int fromNaN(float v) {
         int b = Float.floatToRawIntBits(v);
-        return b & 0xFFFFF;
+        return b & 0x7FFFFF;
     }
 
     /**
      * Given id return as a Nan float
+     *
      * @param v
      * @return
      */
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/easing/FloatAnimation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/easing/FloatAnimation.java
index 4f484de..98dbf00 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/easing/FloatAnimation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/easing/FloatAnimation.java
@@ -51,6 +51,7 @@
     }
 
     public FloatAnimation() {
+        mEasingCurve = new CubicEasing(mType);
     }
 
     public FloatAnimation(float... description) {
@@ -86,21 +87,26 @@
             count++;
         }
         if (spec != null) {
+
             count++;
         }
         if (spec != null || type != CUBIC_STANDARD) {
             count++;
             count += (spec == null) ? 0 : spec.length;
         }
-        if (duration != 1 || count > 0) {
-            count++;
-        }
+
         if (!Float.isNaN(initialValue)) {
             count++;
         }
         if (!Float.isNaN(wrap)) {
             count++;
         }
+        if (duration != 1 || count > 0) {
+            count++;
+        }
+        if  (!Float.isNaN(wrap) || !Float.isNaN(initialValue)) {
+            count++;
+        }
         float[] ret = new float[count];
         int pos = 0;
         int specLen = (spec == null) ? 0 : spec.length;
diff --git a/core/java/com/android/internal/widget/remotecompose/core/types/BooleanConstant.java b/core/java/com/android/internal/widget/remotecompose/core/types/BooleanConstant.java
index 1051192..9045bcbd 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/types/BooleanConstant.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/types/BooleanConstant.java
@@ -15,11 +15,14 @@
  */
 package com.android.internal.widget.remotecompose.core.types;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.BYTE;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
@@ -27,6 +30,7 @@
  * Used to represent a boolean
  */
 public class BooleanConstant implements Operation {
+    private static final int OP_CODE = Operations.DATA_BOOLEAN;
     boolean mValue = false;
     private int mId;
 
@@ -37,7 +41,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mId, mValue);
+        apply(buffer, mId, mValue);
     }
 
     @Override
@@ -55,42 +59,43 @@
         return "BooleanConstant[" + mId + "] = " + mValue + "";
     }
 
-    public static final Companion COMPANION = new Companion();
+    public static String name() {
+        return "OrigamiBoolean";
+    }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
+    public static int id() {
+        return Operations.DATA_BOOLEAN;
+    }
 
-        @Override
-        public String name() {
-            return "OrigamiBoolean";
-        }
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer
+     * @param id
+     * @param value
+     */
+    public static void apply(WireBuffer buffer, int id, boolean value) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(id);
+        buffer.writeBoolean(value);
+    }
 
-        @Override
-        public int id() {
-            return Operations.DATA_BOOLEAN;
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int id = buffer.readInt();
 
-        /**
-         * Writes out the operation to the buffer
-         *
-         * @param buffer
-         * @param id
-         * @param value
-         */
-        public void apply(WireBuffer buffer, int id, boolean value) {
-            buffer.start(Operations.DATA_BOOLEAN);
-            buffer.writeInt(id);
-            buffer.writeBoolean(value);
-        }
+        boolean value = buffer.readBoolean();
+        operations.add(new BooleanConstant(id, value));
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int id = buffer.readInt();
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Expressions Operations",
+                        OP_CODE,
+                        "BooleanConstant")
+                .description("A boolean and its associated id")
+                .field(INT, "id", "id of Int")
+                .field(BYTE, "value",
+                        "8-bit 0 or 1");
 
-            boolean value = buffer.readBoolean();
-            operations.add(new BooleanConstant(id, value));
-        }
     }
 
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/types/IntegerConstant.java b/core/java/com/android/internal/widget/remotecompose/core/types/IntegerConstant.java
index ceb3236..90faf52 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/types/IntegerConstant.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/types/IntegerConstant.java
@@ -15,11 +15,13 @@
  */
 package com.android.internal.widget.remotecompose.core.types;
 
-import com.android.internal.widget.remotecompose.core.CompanionOperation;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+
 import com.android.internal.widget.remotecompose.core.Operation;
 import com.android.internal.widget.remotecompose.core.Operations;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 
 import java.util.List;
 
@@ -38,7 +40,7 @@
 
     @Override
     public void write(WireBuffer buffer) {
-        COMPANION.apply(buffer, mId, mValue);
+        apply(buffer, mId, mValue);
     }
 
     @Override
@@ -56,41 +58,42 @@
         return "IntegerConstant[" + mId + "] = " + mValue + "";
     }
 
-    public static final Companion COMPANION = new Companion();
+    public static String name() {
+        return "IntegerConstant";
+    }
 
-    public static class Companion implements CompanionOperation {
-        private Companion() {
-        }
+    public static int id() {
+        return Operations.DATA_INT;
+    }
 
-        @Override
-        public String name() {
-            return "IntegerConstant";
-        }
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer
+     * @param textId
+     * @param value
+     */
+    public static void apply(WireBuffer buffer, int textId, int value) {
+        buffer.start(Operations.DATA_INT);
+        buffer.writeInt(textId);
+        buffer.writeInt(value);
+    }
 
-        @Override
-        public int id() {
-            return Operations.DATA_INT;
-        }
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int id = buffer.readInt();
 
-        /**
-         * Writes out the operation to the buffer
-         *
-         * @param buffer
-         * @param textId
-         * @param value
-         */
-        public void apply(WireBuffer buffer, int textId, int value) {
-            buffer.start(Operations.DATA_INT);
-            buffer.writeInt(textId);
-            buffer.writeInt(value);
-        }
+        int value = buffer.readInt();
+        operations.add(new IntegerConstant(id, value));
+    }
 
-        @Override
-        public void read(WireBuffer buffer, List<Operation> operations) {
-            int id = buffer.readInt();
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Expressions Operations",
+                        id(),
+                        "IntegerConstant")
+                .description("A integer and its associated id")
+                .field(INT, "id", "id of Int")
+                .field(INT, "value",
+                        "32-bit int value");
 
-            int value = buffer.readInt();
-            operations.add(new IntegerConstant(id, value));
-        }
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/types/LongConstant.java b/core/java/com/android/internal/widget/remotecompose/core/types/LongConstant.java
new file mode 100644
index 0000000..70402cf
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/types/LongConstant.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2024 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.internal.widget.remotecompose.core.types;
+
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.INT;
+import static com.android.internal.widget.remotecompose.core.documentation.Operation.LONG;
+
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+
+import java.util.List;
+
+/**
+ * Used to represent a long
+ */
+public class LongConstant implements Operation {
+    private static final int OP_CODE = Operations.DATA_LONG;
+    long mValue;
+    private int mId;
+
+    public LongConstant(int id, long value) {
+        mId = id;
+        mValue = value;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        apply(buffer, mId, mValue);
+    }
+
+    @Override
+    public void apply(RemoteContext context) {
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return toString();
+    }
+
+    @Override
+    public String toString() {
+        return "LongConstant[" + mId + "] = " + mValue + "";
+    }
+
+    /**
+     * Writes out the operation to the buffer
+     *
+     * @param buffer
+     * @param id
+     * @param value
+     */
+    public static void apply(WireBuffer buffer, int id, long value) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(id);
+        buffer.writeLong(value);
+    }
+
+    public static void read(WireBuffer buffer, List<Operation> operations) {
+        int id = buffer.readInt();
+
+        long value = buffer.readLong();
+        operations.add(new LongConstant(id, value));
+    }
+
+    public static void documentation(DocumentationBuilder doc) {
+        doc.operation("Expressions Operations",
+                        OP_CODE,
+                        "LongConstant")
+                .description("A boolean and its associated id")
+                .field(INT, "id", "id of Int")
+                .field(LONG, "value",
+                        "The long Value");
+
+    }
+
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/player/RemoteComposeDocument.java b/core/java/com/android/internal/widget/remotecompose/player/RemoteComposeDocument.java
index 65a337e..e32f823 100644
--- a/core/java/com/android/internal/widget/remotecompose/player/RemoteComposeDocument.java
+++ b/core/java/com/android/internal/widget/remotecompose/player/RemoteComposeDocument.java
@@ -35,6 +35,10 @@
         mDocument.initFromBuffer(buffer);
     }
 
+    public RemoteComposeDocument(CoreDocument document) {
+        mDocument = document;
+    }
+
     public CoreDocument getDocument() {
         return mDocument;
     }
@@ -122,5 +126,16 @@
     public Component getComponent(int id) {
         return mDocument.getComponent(id);
     }
+
+    public void invalidate() {
+        mDocument.invalidateMeasure();
+    }
+
+    public String[] getStats() {
+        if (mDocument == null) {
+            return new String[0];
+        }
+        return mDocument.getStats();
+    }
 }
 
diff --git a/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java b/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java
index b2406bf..3d78680 100644
--- a/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java
+++ b/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java
@@ -66,6 +66,10 @@
         }
     }
 
+    public RemoteComposeDocument getDocument() {
+        return mInner.getDocument();
+    }
+
     public void setDocument(RemoteComposeDocument value) {
         if (value != null) {
             if (value.canBeDisplayed(
@@ -151,6 +155,84 @@
         addView(mInner, layoutParams);
     }
 
+    /**
+     * Set an override for a string resource
+     *
+     * @param domain domain (SYSTEM or USER)
+     * @param name name of the string
+     * @param content content of the string
+     */
+    public void setLocalString(String domain, String name, String content) {
+        mInner.setLocalString(domain + ":" + name, content);
+    }
+
+    /**
+     * Clear the override of the given string
+     *
+     * @param domain domain (SYSTEM or USER)
+     * @param name name of the string
+     */
+    public void clearLocalString(String domain, String name) {
+        mInner.clearLocalString(domain + ":" + name);
+    }
+
+    /**
+     * Set an override for a user domain string resource
+     *
+     * @param name name of the string
+     * @param content content of the string
+     */
+    public void setUserLocalString(String name, String content) {
+        mInner.setLocalString("USER:" + name, content);
+    }
+
+    /**
+     * Set an override for a user domain int resource
+     *
+     * @param name name of the int
+     * @param value value of the int
+     */
+    public void setUserLocalInt(String name, int value) {
+        mInner.setLocalInt("USER:" + name, value);
+    }
+
+    /**
+     * Clear the override of the given user string
+     *
+     * @param name name of the string
+     */
+    public void clearUserLocalString(String name) {
+        mInner.clearLocalString("USER:" + name);
+    }
+
+    /**
+     * Clear the override of the given user int
+     *
+     * @param name name of the int
+     */
+    public void clearUserLocalInt(String name) {
+        mInner.clearLocalInt("USER:" + name);
+    }
+
+    /**
+     * Set an override for a system domain string resource
+     *
+     * @param name name of the string
+     * @param content content of the string
+     */
+    public void setSystemLocalString(String name, String content) {
+        mInner.setLocalString("SYSTEM:" + name, content);
+    }
+
+    /**
+     * Clear the override of the given system string
+     *
+     * @param name name of the string
+     */
+    public void clearSystemLocalString(String name) {
+        mInner.clearLocalString("SYSTEM:" + name);
+    }
+
     public interface ClickCallbacks {
         void click(int id, String metadata);
     }
@@ -409,4 +491,7 @@
             return color;
         }
     }
+
+
 }
+
diff --git a/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidPaintContext.java b/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidPaintContext.java
index e01dd17..4416cf7 100644
--- a/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidPaintContext.java
+++ b/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidPaintContext.java
@@ -210,19 +210,30 @@
     }
 
     @Override
-    public void getTextBounds(int textId, int start, int end, boolean monospace, float[] bounds) {
+    public void getTextBounds(int textId, int start, int end, int flags, float[] bounds) {
         String str = getText(textId);
         if (end == -1) {
             end = str.length();
         }
 
+        Paint.FontMetrics metrics = mPaint.getFontMetrics();
         mPaint.getTextBounds(str, start, end, mTmpRect);
 
         bounds[0] = mTmpRect.left;
-        bounds[1] = mTmpRect.top;
-        bounds[2] = monospace ? (mPaint.measureText(str, start, end) - mTmpRect.left)
-                : mTmpRect.right;
-        bounds[3] = mTmpRect.bottom;
+
+        if ((flags & PaintContext.TEXT_MEASURE_MONOSPACE_WIDTH) != 0) {
+            bounds[2] = mPaint.measureText(str, start, end) - mTmpRect.left;
+        } else {
+            bounds[2] = mTmpRect.right;
+        }
+
+        if ((flags & PaintContext.TEXT_MEASURE_FONT_HEIGHT) != 0) {
+            bounds[1] = Math.round(metrics.ascent);
+            bounds[3] = Math.round(metrics.bottom);
+        } else {
+            bounds[1] = mTmpRect.top;
+            bounds[3] = mTmpRect.bottom;
+        }
     }
 
     @Override
@@ -236,6 +247,9 @@
                             boolean rtl) {
 
         String textToPaint = getText(textID);
+        if (textToPaint == null) {
+            return;
+        }
         if (end == -1) {
             if (start != 0) {
                 textToPaint = textToPaint.substring(start);
diff --git a/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidRemoteContext.java b/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidRemoteContext.java
index 5a87c70..c989375 100644
--- a/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidRemoteContext.java
+++ b/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidRemoteContext.java
@@ -23,6 +23,7 @@
 import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.operations.FloatExpression;
 import com.android.internal.widget.remotecompose.core.operations.ShaderData;
+import com.android.internal.widget.remotecompose.core.operations.utilities.ArrayAccess;
 
 import java.util.HashMap;
 
@@ -52,7 +53,7 @@
     @Override
     public void loadPathData(int instanceId, float[] floatPath) {
         if (!mRemoteComposeState.containsId(instanceId)) {
-            mRemoteComposeState.cache(instanceId, floatPath);
+            mRemoteComposeState.cacheData(instanceId, floatPath);
         }
     }
 
@@ -75,6 +76,40 @@
         mVarNameHashMap.put(varName, new VarName(varName, varId, varType));
     }
 
+    @Override
+    public void setNamedStringOverride(String stringName, String value) {
+        if (mVarNameHashMap.get(stringName) != null) {
+            int id = mVarNameHashMap.get(stringName).mId;
+            overrideText(id, value);
+        }
+    }
+
+    @Override
+    public void clearNamedStringOverride(String stringName) {
+        if (mVarNameHashMap.get(stringName) != null) {
+            int id = mVarNameHashMap.get(stringName).mId;
+            clearDataOverride(id);
+        }
+        mVarNameHashMap.put(stringName, null);
+    }
+
+    @Override
+    public void setNamedIntegerOverride(String stringName, int value) {
+        if (mVarNameHashMap.get(stringName) != null) {
+            int id = mVarNameHashMap.get(stringName).mId;
+            overrideInt(id, value);
+        }
+    }
+
+    @Override
+    public void clearNamedIntegerOverride(String integerName) {
+        if (mVarNameHashMap.get(integerName) != null) {
+            int id = mVarNameHashMap.get(integerName).mId;
+            clearIntegerOverride(id);
+        }
+        mVarNameHashMap.put(integerName, null);
+    }
+
     /**
      * Override a color to force it to be the color provided
      *
@@ -85,6 +120,23 @@
         int id = mVarNameHashMap.get(colorName).mId;
         mRemoteComposeState.overrideColor(id, color);
     }
+
+    @Override
+    public void addCollection(int id, ArrayAccess collection) {
+        mRemoteComposeState.addCollection(id, collection);
+    }
+
+    @Override
+    public void runAction(int id, String metadata) {
+        mDocument.performClick(id);
+    }
+
+    @Override
+    public void runNamedAction(int id) {
+        String text = getText(id);
+        mDocument.runNamedAction(text);
+    }
+
     /**
      * Decode a byte array into an image and cache it using the given imageId
      *
@@ -97,19 +149,35 @@
     public void loadBitmap(int imageId, int width, int height, byte[] bitmap) {
         if (!mRemoteComposeState.containsId(imageId)) {
             Bitmap image = BitmapFactory.decodeByteArray(bitmap, 0, bitmap.length);
-            mRemoteComposeState.cache(imageId, image);
+            mRemoteComposeState.cacheData(imageId, image);
         }
     }
 
     @Override
     public void loadText(int id, String text) {
         if (!mRemoteComposeState.containsId(id)) {
-            mRemoteComposeState.cache(id, text);
+            mRemoteComposeState.cacheData(id, text);
         } else {
-            mRemoteComposeState.update(id, text);
+            mRemoteComposeState.updateData(id, text);
         }
     }
 
+    public void overrideText(int id, String text) {
+        mRemoteComposeState.overrideData(id, text);
+    }
+
+    public void overrideInt(int id, int value) {
+        mRemoteComposeState.overrideInteger(id, value);
+    }
+
+    public void clearDataOverride(int id) {
+        mRemoteComposeState.clearDataOverride(id);
+    }
+
+    public void clearIntegerOverride(int id) {
+        mRemoteComposeState.clearIntegerOverride(id);
+    }
+
     @Override
     public String getText(int id) {
         return (String) mRemoteComposeState.getFromId(id);
@@ -125,6 +193,14 @@
         mRemoteComposeState.updateInteger(id, value);
     }
 
+    public void overrideInteger(int id, int value) {
+        mRemoteComposeState.overrideInteger(id, value);
+    }
+
+    public void overrideText(int id, int valueId) {
+        String text = getText(valueId);
+        overrideText(id, text);
+    }
 
     @Override
     public void loadColor(int id, int color) {
@@ -133,12 +209,12 @@
 
     @Override
     public void loadAnimatedFloat(int id, FloatExpression animatedFloat) {
-        mRemoteComposeState.cache(id, animatedFloat);
+        mRemoteComposeState.cacheData(id, animatedFloat);
     }
 
     @Override
     public void loadShader(int id, ShaderData value) {
-        mRemoteComposeState.cache(id, value);
+        mRemoteComposeState.cacheData(id, value);
     }
 
     @Override
@@ -187,5 +263,6 @@
         String metadata = (String) mRemoteComposeState.getFromId(metadataId);
         mDocument.addClickArea(id, contentDescription, left, top, right, bottom, metadata);
     }
+
 }
 
diff --git a/core/java/com/android/internal/widget/remotecompose/player/platform/FloatsToPath.java b/core/java/com/android/internal/widget/remotecompose/player/platform/FloatsToPath.java
index 7a85427..d75232a 100644
--- a/core/java/com/android/internal/widget/remotecompose/player/platform/FloatsToPath.java
+++ b/core/java/com/android/internal/widget/remotecompose/player/platform/FloatsToPath.java
@@ -19,7 +19,6 @@
 
 import android.graphics.Path;
 import android.graphics.PathMeasure;
-import android.os.Build;
 
 import com.android.internal.widget.remotecompose.core.operations.PathData;
 
@@ -58,13 +57,11 @@
                 break;
                 case PathData.CONIC: {
                     i += 3;
-                    if (Build.VERSION.SDK_INT >= 34) { // REMOVE IN PLATFORM
-                        path.conicTo(
-                                floatPath[i + 0], floatPath[i + 1],
-                                floatPath[i + 2], floatPath[i + 3],
-                                floatPath[i + 4]
-                        );
-                    }
+                    path.conicTo(
+                            floatPath[i + 0], floatPath[i + 1],
+                            floatPath[i + 2], floatPath[i + 3],
+                            floatPath[i + 4]
+                    );
                     i += 5;
                 }
                 break;
diff --git a/core/java/com/android/internal/widget/remotecompose/player/platform/RemoteComposeCanvas.java b/core/java/com/android/internal/widget/remotecompose/player/platform/RemoteComposeCanvas.java
index 0d7f97a..f91e158 100644
--- a/core/java/com/android/internal/widget/remotecompose/player/platform/RemoteComposeCanvas.java
+++ b/core/java/com/android/internal/widget/remotecompose/player/platform/RemoteComposeCanvas.java
@@ -41,6 +41,7 @@
     int mTheme = Theme.LIGHT;
     boolean mInActionDown = false;
     boolean mDebug = false;
+    boolean mHasClickAreas = false;
     Point mActionDownPoint = new Point(0, 0);
     AndroidRemoteContext mARContext = new AndroidRemoteContext();
 
@@ -85,6 +86,7 @@
         mDocument = value;
         mDocument.initializeContext(mARContext);
         setContentDescription(mDocument.getDocument().getContentDescription());
+        updateClickAreas();
         requestLayout();
         invalidate();
     }
@@ -94,23 +96,33 @@
         if (mDocument == null) {
             return;
         }
-        Set<CoreDocument.ClickAreaRepresentation> clickAreas = mDocument
-                .getDocument().getClickAreas();
-        removeAllViews();
-        for (CoreDocument.ClickAreaRepresentation area : clickAreas) {
-            ClickAreaView viewArea = new ClickAreaView(getContext(), mDebug,
-                    area.getId(), area.getContentDescription(),
-                    area.getMetadata());
-            int w = (int) area.width();
-            int h = (int) area.height();
-            FrameLayout.LayoutParams param = new FrameLayout.LayoutParams(w, h);
-            param.width = w;
-            param.height = h;
-            param.leftMargin = (int) area.getLeft();
-            param.topMargin = (int) area.getTop();
-            viewArea.setOnClickListener(view1
-                    -> mDocument.getDocument().performClick(area.getId()));
-            addView(viewArea, param);
+        updateClickAreas();
+    }
+
+    private void updateClickAreas() {
+        if (USE_VIEW_AREA_CLICK && mDocument != null) {
+            mHasClickAreas = false;
+            Set<CoreDocument.ClickAreaRepresentation> clickAreas = mDocument
+                    .getDocument().getClickAreas();
+            removeAllViews();
+            for (CoreDocument.ClickAreaRepresentation area : clickAreas) {
+                ClickAreaView viewArea = new ClickAreaView(getContext(), mDebug,
+                        area.getId(), area.getContentDescription(),
+                        area.getMetadata());
+                int w = (int) area.width();
+                int h = (int) area.height();
+                FrameLayout.LayoutParams param = new FrameLayout.LayoutParams(w, h);
+                param.width = w;
+                param.height = h;
+                param.leftMargin = (int) area.getLeft();
+                param.topMargin = (int) area.getTop();
+                viewArea.setOnClickListener(view1
+                        -> mDocument.getDocument().performClick(area.getId()));
+                addView(viewArea, param);
+            }
+            if (!clickAreas.isEmpty()) {
+                mHasClickAreas = true;
+            }
         }
     }
 
@@ -133,6 +145,38 @@
         mARContext.setNamedColorOverride(colorName, colorValue);
     }
 
+    public RemoteComposeDocument getDocument() {
+        return mDocument;
+    }
+
+    public void setLocalString(String name, String content) {
+        mARContext.setNamedStringOverride(name, content);
+        if (mDocument != null) {
+            mDocument.invalidate();
+        }
+    }
+
+    public void clearLocalString(String name) {
+        mARContext.clearNamedStringOverride(name);
+        if (mDocument != null) {
+            mDocument.invalidate();
+        }
+    }
+
+    public void setLocalInt(String name, int content) {
+        mARContext.setNamedIntegerOverride(name, content);
+        if (mDocument != null) {
+            mDocument.invalidate();
+        }
+    }
+
+    public void clearLocalInt(String name) {
+        mARContext.clearNamedIntegerOverride(name);
+        if (mDocument != null) {
+            mDocument.invalidate();
+        }
+    }
+
     public interface ClickCallbacks {
         void click(int id, String metadata);
     }
@@ -153,7 +197,7 @@
     }
 
     public boolean onTouchEvent(MotionEvent event) {
-        if (USE_VIEW_AREA_CLICK) {
+        if (USE_VIEW_AREA_CLICK && mHasClickAreas) {
             return super.onTouchEvent(event);
         }
         switch (event.getActionMasked()) {
@@ -180,11 +224,13 @@
 
     @Override
     public boolean performClick() {
-        if (USE_VIEW_AREA_CLICK) {
+        if (USE_VIEW_AREA_CLICK && mHasClickAreas) {
             return super.performClick();
         }
-        mDocument.getDocument().onClick((float) mActionDownPoint.x, (float) mActionDownPoint.y);
+        mDocument.getDocument().onClick(mARContext,
+                 (float) mActionDownPoint.x, (float) mActionDownPoint.y);
         super.performClick();
+        invalidate();
         return true;
     }
 
@@ -213,9 +259,10 @@
         if (mDocument == null) {
             return;
         }
+        int preWidth = getWidth();
+        int preHeight = getHeight();
         int w = measureDimension(widthMeasureSpec, mDocument.getWidth());
         int h = measureDimension(heightMeasureSpec, mDocument.getHeight());
-        mDocument.getDocument().invalidateMeasure();
 
         if (!USE_VIEW_AREA_CLICK) {
             if (mDocument.getDocument().getContentSizing() == RootContentBehavior.SIZING_SCALE) {
@@ -225,6 +272,9 @@
             }
         }
         setMeasuredDimension(w, h);
+        if (preWidth != w || preHeight != h) {
+            mDocument.getDocument().invalidateMeasure();
+        }
     }
 
     private int mCount;
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 9797d96..2bc3265 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -73,6 +73,12 @@
 
     srcs: [
         "android_animation_PropertyValuesHolder.cpp",
+        "android_database_CursorWindow.cpp",
+        "android_database_SQLiteCommon.cpp",
+        "android_database_SQLiteConnection.cpp",
+        "android_database_SQLiteGlobal.cpp",
+        "android_database_SQLiteDebug.cpp",
+        "android_database_SQLiteRawStatement.cpp",
         "android_os_SystemClock.cpp",
         "android_os_SystemProperties.cpp",
         "android_os_Trace.cpp",
@@ -157,12 +163,6 @@
                 "android_opengl_GLES31.cpp",
                 "android_opengl_GLES31Ext.cpp",
                 "android_opengl_GLES32.cpp",
-                "android_database_CursorWindow.cpp",
-                "android_database_SQLiteCommon.cpp",
-                "android_database_SQLiteConnection.cpp",
-                "android_database_SQLiteGlobal.cpp",
-                "android_database_SQLiteDebug.cpp",
-                "android_database_SQLiteRawStatement.cpp",
                 "android_graphics_GraphicBuffer.cpp",
                 "android_graphics_SurfaceTexture.cpp",
                 "android_view_CompositionSamplingListener.cpp",
@@ -308,6 +308,7 @@
                 "spatializer-aidl-cpp",
                 "av-types-aidl-cpp",
                 "android.hardware.camera.device@3.2",
+                "camera_platform_flags_c_lib",
                 "libandroid_net",
                 "libbattery",
                 "libnetdutils",
@@ -427,6 +428,7 @@
                 "libnativehelper_jvm",
                 "libpiex",
                 "libpng",
+                "libsqlite",
                 "libtiff_directory",
                 "libui-types",
                 "libutils",
@@ -442,12 +444,6 @@
         host_linux: {
             srcs: [
                 "android_content_res_ApkAssets.cpp",
-                "android_database_CursorWindow.cpp",
-                "android_database_SQLiteCommon.cpp",
-                "android_database_SQLiteConnection.cpp",
-                "android_database_SQLiteGlobal.cpp",
-                "android_database_SQLiteDebug.cpp",
-                "android_database_SQLiteRawStatement.cpp",
                 "android_hardware_input_InputApplicationHandle.cpp",
                 "android_os_MessageQueue.cpp",
                 "android_os_Parcel.cpp",
@@ -463,7 +459,6 @@
             ],
             static_libs: [
                 "libbinderthreadstateutils",
-                "libsqlite",
                 "libgui_window_info_static",
             ],
             shared_libs: [
diff --git a/core/jni/OWNERS b/core/jni/OWNERS
index af10623..af393fd 100644
--- a/core/jni/OWNERS
+++ b/core/jni/OWNERS
@@ -119,3 +119,4 @@
 
 # ApplicationSharedMemory
 per-file *ApplicationSharedMemory* = file:/PERFORMANCE_OWNERS
+per-file *PropertyInvalidatedCache* = file:/PERFORMANCE_OWNERS
diff --git a/core/jni/android_database_CursorWindow.cpp b/core/jni/android_database_CursorWindow.cpp
index c0e9215..18c3146 100644
--- a/core/jni/android_database_CursorWindow.cpp
+++ b/core/jni/android_database_CursorWindow.cpp
@@ -38,7 +38,9 @@
 #define LOG_NDEBUG 1
 
 #include <androidfw/CursorWindow.h>
+#ifdef __linux__
 #include "android_os_Parcel.h"
+#endif
 #include "android_util_Binder.h"
 #include "android_database_SQLiteCommon.h"
 
@@ -111,6 +113,7 @@
     return 0;
 }
 
+#ifdef __linux__
 static jlong nativeCreateFromParcel(JNIEnv* env, jclass clazz, jobject parcelObj) {
     Parcel* parcel = parcelForJavaObject(env, parcelObj);
 
@@ -128,6 +131,7 @@
             window->getNumRows(), window->getNumColumns(), window);
     return reinterpret_cast<jlong>(window);
 }
+#endif
 
 static void nativeDispose(JNIEnv* env, jclass clazz, jlong windowPtr) {
     CursorWindow* window = reinterpret_cast<CursorWindow*>(windowPtr);
@@ -142,6 +146,7 @@
     return env->NewStringUTF(window->name().c_str());
 }
 
+#ifdef __linux__
 static void nativeWriteToParcel(JNIEnv * env, jclass clazz, jlong windowPtr,
         jobject parcelObj) {
     CursorWindow* window = reinterpret_cast<CursorWindow*>(windowPtr);
@@ -154,6 +159,7 @@
         jniThrowRuntimeException(env, msg.c_str());
     }
 }
+#endif
 
 static void nativeClear(JNIEnv * env, jclass clazz, jlong windowPtr) {
     CursorWindow* window = reinterpret_cast<CursorWindow*>(windowPtr);
@@ -520,55 +526,35 @@
     return true;
 }
 
-static const JNINativeMethod sMethods[] =
-{
-    /* name, signature, funcPtr */
-    { "nativeCreate", "(Ljava/lang/String;I)J",
-            (void*)nativeCreate },
-    { "nativeCreateFromParcel", "(Landroid/os/Parcel;)J",
-            (void*)nativeCreateFromParcel },
-    { "nativeDispose", "(J)V",
-            (void*)nativeDispose },
-    { "nativeWriteToParcel", "(JLandroid/os/Parcel;)V",
-            (void*)nativeWriteToParcel },
+static const JNINativeMethod sMethods[] = {
+        /* name, signature, funcPtr */
+        {"nativeCreate", "(Ljava/lang/String;I)J", (void*)nativeCreate},
+        {"nativeDispose", "(J)V", (void*)nativeDispose},
+#ifdef __linux__
+        {"nativeCreateFromParcel", "(Landroid/os/Parcel;)J", (void*)nativeCreateFromParcel},
+        {"nativeWriteToParcel", "(JLandroid/os/Parcel;)V", (void*)nativeWriteToParcel},
+#endif
+        {"nativeGetName", "(J)Ljava/lang/String;", (void*)nativeGetName},
+        {"nativeGetBlob", "(JII)[B", (void*)nativeGetBlob},
+        {"nativeGetString", "(JII)Ljava/lang/String;", (void*)nativeGetString},
+        {"nativeCopyStringToBuffer", "(JIILandroid/database/CharArrayBuffer;)V",
+         (void*)nativeCopyStringToBuffer},
+        {"nativePutBlob", "(J[BII)Z", (void*)nativePutBlob},
+        {"nativePutString", "(JLjava/lang/String;II)Z", (void*)nativePutString},
 
-    { "nativeGetName", "(J)Ljava/lang/String;",
-            (void*)nativeGetName },
-    { "nativeGetBlob", "(JII)[B",
-            (void*)nativeGetBlob },
-    { "nativeGetString", "(JII)Ljava/lang/String;",
-            (void*)nativeGetString },
-    { "nativeCopyStringToBuffer", "(JIILandroid/database/CharArrayBuffer;)V",
-            (void*)nativeCopyStringToBuffer },
-    { "nativePutBlob", "(J[BII)Z",
-            (void*)nativePutBlob },
-    { "nativePutString", "(JLjava/lang/String;II)Z",
-            (void*)nativePutString },
+        // ------- @FastNative below here ----------------------
+        {"nativeClear", "(J)V", (void*)nativeClear},
+        {"nativeGetNumRows", "(J)I", (void*)nativeGetNumRows},
+        {"nativeSetNumColumns", "(JI)Z", (void*)nativeSetNumColumns},
+        {"nativeAllocRow", "(J)Z", (void*)nativeAllocRow},
+        {"nativeFreeLastRow", "(J)V", (void*)nativeFreeLastRow},
+        {"nativeGetType", "(JII)I", (void*)nativeGetType},
+        {"nativeGetLong", "(JII)J", (void*)nativeGetLong},
+        {"nativeGetDouble", "(JII)D", (void*)nativeGetDouble},
 
-    // ------- @FastNative below here ----------------------
-    { "nativeClear", "(J)V",
-            (void*)nativeClear },
-    { "nativeGetNumRows", "(J)I",
-            (void*)nativeGetNumRows },
-    { "nativeSetNumColumns", "(JI)Z",
-            (void*)nativeSetNumColumns },
-    { "nativeAllocRow", "(J)Z",
-            (void*)nativeAllocRow },
-    { "nativeFreeLastRow", "(J)V",
-            (void*)nativeFreeLastRow },
-    { "nativeGetType", "(JII)I",
-            (void*)nativeGetType },
-    { "nativeGetLong", "(JII)J",
-            (void*)nativeGetLong },
-    { "nativeGetDouble", "(JII)D",
-            (void*)nativeGetDouble },
-
-    { "nativePutLong", "(JJII)Z",
-            (void*)nativePutLong },
-    { "nativePutDouble", "(JDII)Z",
-            (void*)nativePutDouble },
-    { "nativePutNull", "(JII)Z",
-            (void*)nativePutNull },
+        {"nativePutLong", "(JJII)Z", (void*)nativePutLong},
+        {"nativePutDouble", "(JDII)Z", (void*)nativePutDouble},
+        {"nativePutNull", "(JII)Z", (void*)nativePutNull},
 };
 
 int register_android_database_CursorWindow(JNIEnv* env)
diff --git a/core/jni/android_database_SQLiteConnection.cpp b/core/jni/android_database_SQLiteConnection.cpp
index 3370f38..ba7e705 100644
--- a/core/jni/android_database_SQLiteConnection.cpp
+++ b/core/jni/android_database_SQLiteConnection.cpp
@@ -16,27 +16,22 @@
 
 #define LOG_TAG "SQLiteConnection"
 
-#include <jni.h>
-#include <nativehelper/JNIHelp.h>
+#include <android-base/mapped_file.h>
 #include <android_runtime/AndroidRuntime.h>
 #include <android_runtime/Log.h>
-
-#include <utils/Log.h>
-#include <utils/String8.h>
-#include <utils/String16.h>
-#include <cutils/ashmem.h>
-#include <sys/mman.h>
-
-#include <string.h>
-#include <unistd.h>
-
 #include <androidfw/CursorWindow.h>
-
+#include <cutils/ashmem.h>
+#include <jni.h>
+#include <nativehelper/JNIHelp.h>
 #include <sqlite3.h>
 #include <sqlite3_android.h>
+#include <string.h>
+#include <unistd.h>
+#include <utils/Log.h>
+#include <utils/String16.h>
+#include <utils/String8.h>
 
 #include "android_database_SQLiteCommon.h"
-
 #include "core_jni_helpers.h"
 
 // Set to 1 to use UTF16 storage for localized indexes.
@@ -669,13 +664,14 @@
         ALOGE("ashmem_create_region failed: %s", strerror(error));
     } else {
         if (length > 0) {
-            void* ptr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-            if (ptr == MAP_FAILED) {
+            std::unique_ptr<base::MappedFile> mappedFile =
+                    base::MappedFile::FromFd(fd, 0, length, PROT_READ | PROT_WRITE);
+            if (mappedFile == nullptr) {
                 error = errno;
                 ALOGE("mmap failed: %s", strerror(error));
             } else {
-                memcpy(ptr, data, length);
-                munmap(ptr, length);
+                memcpy(mappedFile->data(), data, length);
+                mappedFile.reset();
             }
         }
 
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp
index 3f74fac..10e49ef 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -25,6 +25,7 @@
 #include <binder/Parcel.h>
 #include <camera/Camera.h>
 #include <camera/StringUtils.h>
+#include <com_android_internal_camera_flags.h>
 #include <cutils/properties.h>
 #include <gui/GLConsumer.h>
 #include <gui/Surface.h>
@@ -37,6 +38,7 @@
 #include "jni.h"
 
 using namespace android;
+namespace flags = com::android::internal::camera::flags;
 
 enum {
     // Keep up to date with Camera.java
@@ -527,14 +529,19 @@
 }
 
 static bool attributionSourceStateForJavaParcel(JNIEnv *env, jobject jClientAttributionParcel,
+                                                bool useContextAttributionSource,
                                                 AttributionSourceState &clientAttribution) {
     const Parcel *clientAttributionParcel = parcelForJavaObject(env, jClientAttributionParcel);
     if (clientAttribution.readFromParcel(clientAttributionParcel) != ::android::OK) {
         jniThrowRuntimeException(env, "Fail to unparcel AttributionSourceState");
         return false;
     }
-    clientAttribution.uid = Camera::USE_CALLING_UID;
-    clientAttribution.pid = Camera::USE_CALLING_PID;
+
+    if (!(useContextAttributionSource && flags::use_context_attribution_source())) {
+        clientAttribution.uid = Camera::USE_CALLING_UID;
+        clientAttribution.pid = Camera::USE_CALLING_PID;
+    }
+
     return true;
 }
 
@@ -542,7 +549,9 @@
                                                        jobject jClientAttributionParcel,
                                                        jint devicePolicy) {
     AttributionSourceState clientAttribution;
-    if (!attributionSourceStateForJavaParcel(env, jClientAttributionParcel, clientAttribution)) {
+    if (!attributionSourceStateForJavaParcel(env, jClientAttributionParcel,
+                                             /* useContextAttributionSource= */ false,
+                                             clientAttribution)) {
         return 0;
     }
     return Camera::getNumberOfCameras(clientAttribution, devicePolicy);
@@ -553,7 +562,9 @@
                                                   jobject jClientAttributionParcel,
                                                   jint devicePolicy, jobject info_obj) {
     AttributionSourceState clientAttribution;
-    if (!attributionSourceStateForJavaParcel(env, jClientAttributionParcel, clientAttribution)) {
+    if (!attributionSourceStateForJavaParcel(env, jClientAttributionParcel,
+                                             /* useContextAttributionSource= */ false,
+                                             clientAttribution)) {
         return;
     }
 
@@ -587,7 +598,9 @@
                                                  jobject jClientAttributionParcel,
                                                  jint devicePolicy) {
     AttributionSourceState clientAttribution;
-    if (!attributionSourceStateForJavaParcel(env, jClientAttributionParcel, clientAttribution)) {
+    if (!attributionSourceStateForJavaParcel(env, jClientAttributionParcel,
+                                             /* useContextAttributionSource= */ true,
+                                             clientAttribution)) {
         return -EACCES;
     }
 
diff --git a/core/jni/android_hardware_OverlayProperties.cpp b/core/jni/android_hardware_OverlayProperties.cpp
index 96494b1..63de195 100644
--- a/core/jni/android_hardware_OverlayProperties.cpp
+++ b/core/jni/android_hardware_OverlayProperties.cpp
@@ -17,6 +17,7 @@
 #define LOG_TAG "OverlayProperties"
 // #define LOG_NDEBUG 0
 
+#include <android/gui/LutProperties.h>
 #include <android/gui/OverlayProperties.h>
 #include <binder/Parcel.h>
 #include <gui/SurfaceComposerClient.h>
@@ -35,6 +36,12 @@
     jclass clazz;
     jmethodID ctor;
 } gOverlayPropertiesClassInfo;
+
+static struct {
+    jclass clazz;
+    jmethodID ctor;
+} gLutPropertiesClassInfo;
+
 // ----------------------------------------------------------------------------
 // OverlayProperties lifecycle
 // ----------------------------------------------------------------------------
@@ -95,6 +102,36 @@
     return reinterpret_cast<jlong>(overlayProperties);
 }
 
+static jobjectArray android_hardware_OverlayProperties_getLutProperties(JNIEnv* env, jobject thiz,
+                                                                        jlong nativeObject) {
+    gui::OverlayProperties* overlayProperties =
+            reinterpret_cast<gui::OverlayProperties*>(nativeObject);
+    if (overlayProperties->lutProperties.has_value()) {
+        return NULL;
+    }
+    auto& lutProperties = overlayProperties->lutProperties.value();
+    if (lutProperties.empty()) {
+        return NULL;
+    }
+    int32_t size = static_cast<int32_t>(lutProperties.size());
+    jobjectArray nativeLutProperties =
+            env->NewObjectArray(size, gLutPropertiesClassInfo.clazz, NULL);
+    if (nativeLutProperties == NULL) {
+        return NULL;
+    }
+    for (int32_t i = 0; i < size; i++) {
+        if (lutProperties[i].has_value()) {
+            auto& item = lutProperties[i].value();
+            jobject properties =
+                    env->NewObject(gLutPropertiesClassInfo.clazz, gLutPropertiesClassInfo.ctor,
+                                   static_cast<int32_t>(item.dimension), item.size,
+                                   item.samplingKeys.data());
+            env->SetObjectArrayElement(nativeLutProperties, i, properties);
+        }
+    }
+    return nativeLutProperties;
+}
+
 // ----------------------------------------------------------------------------
 // Serialization
 // ----------------------------------------------------------------------------
@@ -161,6 +198,8 @@
     { "nReadOverlayPropertiesFromParcel", "(Landroid/os/Parcel;)J",
             (void*) android_hardware_OverlayProperties_read },
     {"nCreateDefault", "()J", (void*) android_hardware_OverlayProperties_createDefault },
+    {"nGetLutProperties", "(J)[Landroid/hardware/LutProperties;",
+            (void*) android_hardware_OverlayProperties_getLutProperties },
 };
 // clang-format on
 
@@ -171,5 +210,9 @@
     gOverlayPropertiesClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
     gOverlayPropertiesClassInfo.ctor =
             GetMethodIDOrDie(env, gOverlayPropertiesClassInfo.clazz, "<init>", "(J)V");
+    clazz = FindClassOrDie(env, "android/hardware/LutProperties");
+    gLutPropertiesClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
+    gLutPropertiesClassInfo.ctor =
+            GetMethodIDOrDie(env, gLutPropertiesClassInfo.clazz, "<init>", "(IJ[I)V");
     return err;
 }
diff --git a/core/jni/android_media_AudioFormat.h b/core/jni/android_media_AudioFormat.h
index a9b1906..704aef3 100644
--- a/core/jni/android_media_AudioFormat.h
+++ b/core/jni/android_media_AudioFormat.h
@@ -50,6 +50,7 @@
 #define ENCODING_DTS_HD_MA 29
 #define ENCODING_DTS_UHD_P2 30
 #define ENCODING_DSD 31
+#define ENCODING_AC4_L4 32
 
 #define ENCODING_INVALID    0
 #define ENCODING_DEFAULT    1
@@ -95,6 +96,8 @@
         return AUDIO_FORMAT_AAC_XHE;
     case ENCODING_AC4:
         return AUDIO_FORMAT_AC4;
+    case ENCODING_AC4_L4:
+        return AUDIO_FORMAT_AC4_L4;
     case ENCODING_E_AC3_JOC:
         return AUDIO_FORMAT_E_AC3_JOC;
     case ENCODING_DEFAULT:
@@ -177,6 +180,8 @@
         return ENCODING_AAC_XHE;
     case AUDIO_FORMAT_AC4:
         return ENCODING_AC4;
+    case AUDIO_FORMAT_AC4_L4:
+        return ENCODING_AC4_L4;
     case AUDIO_FORMAT_E_AC3_JOC:
         return ENCODING_E_AC3_JOC;
     case AUDIO_FORMAT_MAT:
diff --git a/core/jni/android_util_XmlBlock.cpp b/core/jni/android_util_XmlBlock.cpp
index 5a444bb..c364451 100644
--- a/core/jni/android_util_XmlBlock.cpp
+++ b/core/jni/android_util_XmlBlock.cpp
@@ -83,7 +83,7 @@
         return 0;
     }
 
-    ResXMLParser* st = new ResXMLParser(*osb);
+    ResXMLParser* st = new(std::nothrow) ResXMLParser(*osb);
     if (st == NULL) {
         jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
         return 0;
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 17c89f8..a939d92 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -33,11 +33,13 @@
 #include <android_runtime/android_view_Surface.h>
 #include <android_runtime/android_view_SurfaceControl.h>
 #include <android_runtime/android_view_SurfaceSession.h>
+#include <cutils/ashmem.h>
 #include <gui/ISurfaceComposer.h>
 #include <gui/Surface.h>
 #include <gui/SurfaceComposerClient.h>
 #include <jni.h>
 #include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
 #include <nativehelper/ScopedUtfChars.h>
 #include <private/gui/ComposerService.h>
 #include <stdio.h>
@@ -48,6 +50,7 @@
 #include <ui/DisplayMode.h>
 #include <ui/DisplayedFrameStats.h>
 #include <ui/DynamicDisplayInfo.h>
+#include <ui/FloatRect.h>
 #include <ui/FrameStats.h>
 #include <ui/GraphicTypes.h>
 #include <ui/HdrCapabilities.h>
@@ -735,6 +738,65 @@
     transaction->setDesiredHdrHeadroom(ctrl, desiredRatio);
 }
 
+static void nativeSetLuts(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
+                          jfloatArray jbufferArray, jintArray joffsetArray,
+                          jintArray jdimensionArray, jintArray jsizeArray,
+                          jintArray jsamplingKeyArray) {
+    auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
+    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
+
+    ScopedIntArrayRW joffsets(env, joffsetArray);
+    if (joffsets.get() == nullptr) {
+        jniThrowRuntimeException(env, "Failed to get ScopedIntArrayRW from joffsetArray");
+        return;
+    }
+    ScopedIntArrayRW jdimensions(env, jdimensionArray);
+    if (jdimensions.get() == nullptr) {
+        jniThrowRuntimeException(env, "Failed to get ScopedIntArrayRW from jdimensionArray");
+        return;
+    }
+    ScopedIntArrayRW jsizes(env, jsizeArray);
+    if (jsizes.get() == nullptr) {
+        jniThrowRuntimeException(env, "Failed to get ScopedIntArrayRW from jsizeArray");
+        return;
+    }
+    ScopedIntArrayRW jsamplingKeys(env, jsamplingKeyArray);
+    if (jsamplingKeys.get() == nullptr) {
+        jniThrowRuntimeException(env, "Failed to get ScopedIntArrayRW from jsamplingKeyArray");
+        return;
+    }
+
+    jsize numLuts = env->GetArrayLength(jdimensionArray);
+    std::vector<int32_t> offsets(joffsets.get(), joffsets.get() + numLuts);
+    std::vector<int32_t> dimensions(jdimensions.get(), jdimensions.get() + numLuts);
+    std::vector<int32_t> sizes(jsizes.get(), jsizes.get() + numLuts);
+    std::vector<int32_t> samplingKeys(jsamplingKeys.get(), jsamplingKeys.get() + numLuts);
+
+    ScopedFloatArrayRW jbuffers(env, jbufferArray);
+    if (jbuffers.get() == nullptr) {
+        jniThrowRuntimeException(env, "Failed to get ScopedFloatArrayRW from jbufferArray");
+        return;
+    }
+
+    // create the shared memory and copy jbuffers
+    size_t bufferSize = jbuffers.size() * sizeof(float);
+    int32_t fd = ashmem_create_region("lut_shread_mem", bufferSize);
+    if (fd < 0) {
+        jniThrowRuntimeException(env, "ashmem_create_region() failed");
+        return;
+    }
+    void* ptr = mmap(nullptr, bufferSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+    if (ptr == MAP_FAILED) {
+        jniThrowRuntimeException(env, "Failed to map the shared memory");
+        return;
+    }
+    memcpy(ptr, jbuffers.get(), bufferSize);
+    // unmap
+    munmap(ptr, bufferSize);
+
+    transaction->setLuts(ctrl, base::unique_fd(fd), offsets, dimensions, sizes, samplingKeys);
+}
+
 static void nativeSetCachingHint(JNIEnv* env, jclass clazz, jlong transactionObj,
                                  jlong nativeObject, jint cachingHint) {
     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
@@ -992,6 +1054,15 @@
     transaction->setCrop(ctrl, crop);
 }
 
+static void nativeSetCrop(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
+                          jfloat l, jfloat t, jfloat r, jfloat b) {
+    auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
+
+    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
+    FloatRect crop(l, t, r, b);
+    transaction->setCrop(ctrl, crop);
+}
+
 static void nativeSetCornerRadius(JNIEnv* env, jclass clazz, jlong transactionObj,
          jlong nativeObject, jfloat cornerRadius) {
     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
@@ -2347,6 +2418,8 @@
             (void*)nativeSetFrameRateSelectionPriority },
     {"nativeSetWindowCrop", "(JJIIII)V",
             (void*)nativeSetWindowCrop },
+    {"nativeSetCrop", "(JJFFFF)V",
+            (void*)nativeSetCrop },
     {"nativeSetCornerRadius", "(JJF)V",
             (void*)nativeSetCornerRadius },
     {"nativeSetBackgroundBlurRadius", "(JJI)V",
@@ -2529,6 +2602,7 @@
             (void*) nativeSetDesiredPresentTimeNanos },
     {"nativeNotifyShutdown", "()V",
             (void*)nativeNotifyShutdown },
+    {"nativeSetLuts", "(JJ[F[I[I[I[I)V", (void*)nativeSetLuts },
         // clang-format on
 };
 
diff --git a/core/jni/jni_wrappers.h b/core/jni/jni_wrappers.h
index 21b5b13..e3e17ee 100644
--- a/core/jni/jni_wrappers.h
+++ b/core/jni/jni_wrappers.h
@@ -79,13 +79,14 @@
     jniMethodFormat = value;
 }
 
-// Potentially translates the given JNINativeMethods if setJniMethodFormat has been set.
-// Has no effect otherwise
-inline const JNINativeMethod* maybeRenameJniMethods(const JNINativeMethod* gMethods,
-                                                    int numMethods) {
+// Register the native methods, potenially applying the jniMethodFormat if it has been set.
+static inline int jniRegisterMaybeRenamedNativeMethods(JNIEnv* env, const char* className,
+                                                       const JNINativeMethod* gMethods,
+                                                       int numMethods) {
     if (jniMethodFormat.empty()) {
-        return gMethods;
+        return jniRegisterNativeMethods(env, className, gMethods, numMethods);
     }
+
     // Make a copy of gMethods with reformatted method names.
     JNINativeMethod* modifiedMethods = new JNINativeMethod[numMethods];
     LOG_ALWAYS_FATAL_IF(!modifiedMethods, "Failed to allocate a copy of the JNI methods");
@@ -103,13 +104,17 @@
         std::strcpy(modifiedNameChars, modifiedName.c_str());
         modifiedMethods[i].name = modifiedNameChars;
     }
-    return modifiedMethods;
+    int res = jniRegisterNativeMethods(env, className, modifiedMethods, numMethods);
+    for (int i = 0; i < numMethods; i++) {
+        delete[] modifiedMethods[i].name;
+    }
+    delete[] modifiedMethods;
+    return res;
 }
 
 static inline int RegisterMethodsOrDie(JNIEnv* env, const char* className,
                                        const JNINativeMethod* gMethods, int numMethods) {
-    const JNINativeMethod* modifiedMethods = maybeRenameJniMethods(gMethods, numMethods);
-    int res = jniRegisterNativeMethods(env, className, modifiedMethods, numMethods);
+    int res = jniRegisterMaybeRenamedNativeMethods(env, className, gMethods, numMethods);
     LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
     return res;
 }
diff --git a/core/jni/platform/host/HostRuntime.cpp b/core/jni/platform/host/HostRuntime.cpp
index 19f8299..88b3e1c 100644
--- a/core/jni/platform/host/HostRuntime.cpp
+++ b/core/jni/platform/host/HostRuntime.cpp
@@ -115,6 +115,9 @@
 #ifdef __linux__
         {"android.content.res.ApkAssets", REG_JNI(register_android_content_res_ApkAssets)},
         {"android.content.res.AssetManager", REG_JNI(register_android_content_AssetManager)},
+        {"android.content.res.StringBlock", REG_JNI(register_android_content_StringBlock)},
+        {"android.content.res.XmlBlock", REG_JNI(register_android_content_XmlBlock)},
+#endif
         {"android.database.CursorWindow", REG_JNI(register_android_database_CursorWindow)},
         {"android.database.sqlite.SQLiteConnection",
          REG_JNI(register_android_database_SQLiteConnection)},
@@ -122,9 +125,6 @@
         {"android.database.sqlite.SQLiteDebug", REG_JNI(register_android_database_SQLiteDebug)},
         {"android.database.sqlite.SQLiteRawStatement",
          REG_JNI(register_android_database_SQLiteRawStatement)},
-#endif
-        {"android.content.res.StringBlock", REG_JNI(register_android_content_StringBlock)},
-        {"android.content.res.XmlBlock", REG_JNI(register_android_content_XmlBlock)},
 #ifdef __linux__
         {"android.os.Binder", REG_JNI(register_android_os_Binder)},
         {"android.os.FileObserver", REG_JNI(register_android_os_FileObserver)},
diff --git a/core/proto/android/server/vibrator/vibratormanagerservice.proto b/core/proto/android/server/vibrator/vibratormanagerservice.proto
index e7f0560..258832e 100644
--- a/core/proto/android/server/vibrator/vibratormanagerservice.proto
+++ b/core/proto/android/server/vibrator/vibratormanagerservice.proto
@@ -157,10 +157,8 @@
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
     repeated int32 vibrator_ids = 1;
     optional VibrationProto current_vibration = 2;
-    optional bool is_vibrating = 3;
     optional int32 is_vibrator_controller_registered = 27;
     optional VibrationProto current_external_vibration = 4;
-    optional bool vibrator_under_external_control = 5;
     optional bool low_power_mode = 6;
     optional bool vibrate_on = 24;
     reserved 25; // prev keyboard_vibration_on
@@ -183,4 +181,6 @@
     repeated VibrationProto previous_vibrations = 16;
     repeated VibrationParamProto previous_vibration_params = 28;
     reserved 17; // prev previous_external_vibrations
+    reserved 3; // prev is_vibrating, check current_vibration instead
+    reserved 5; // prev vibrator_under_external_control, check current_external_vibration instead
 }
\ No newline at end of file
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index d35c66e..549f8df 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -792,6 +792,7 @@
     <protected-broadcast android:name="com.android.cellbroadcastreceiver.GET_LATEST_CB_AREA_INFO" />
     <protected-broadcast android:name="com.android.internal.telephony.ACTION_CARRIER_CERTIFICATE_DOWNLOAD" />
     <protected-broadcast android:name="com.android.internal.telephony.action.COUNTRY_OVERRIDE" />
+    <protected-broadcast android:name="com.android.internal.telephony.action.SILENCE_WIFI_CALLING_NOTIFICATION"/>
     <protected-broadcast android:name="com.android.internal.telephony.OPEN_DEFAULT_SMS_APP" />
     <protected-broadcast android:name="com.android.internal.telephony.ACTION_TEST_OVERRIDE_CARRIER_ID" />
     <protected-broadcast android:name="android.telephony.action.SIM_CARD_STATE_CHANGED" />
@@ -844,6 +845,8 @@
     <protected-broadcast android:name="android.intent.action.MAIN_USER_LOCKSCREEN_KNOWLEDGE_FACTOR_CHANGED" />
     <protected-broadcast android:name="com.android.uwb.uwbcountrycode.GEOCODE_RETRY" />
     <protected-broadcast android:name="android.telephony.action.ACTION_SATELLITE_SUBSCRIBER_ID_LIST_CHANGED" />
+    <protected-broadcast android:name="android.service.ondeviceintelligence.MODEL_LOADED" />
+    <protected-broadcast android:name="android.service.ondeviceintelligence.MODEL_UNLOADED" />
 
     <!-- ====================================================================== -->
     <!--                          RUNTIME PERMISSIONS                           -->
@@ -8449,6 +8452,29 @@
     <permission android:name="android.permission.RESERVED_FOR_TESTING_SIGNATURE"
                 android:protectionLevel="signature"/>
 
+    <!-- @SystemApi
+        @FlaggedApi("android.content.pm.verification_service")
+        Allows app to be the verification agent to verify packages.
+        <p>Protection level: signature|privileged
+        @hide
+    -->
+    <permission android:name="android.permission.VERIFICATION_AGENT"
+        android:protectionLevel="signature|privileged"
+        android:featureFlag="android.content.pm.verification_service" />
+
+    <!-- @SystemApi
+        @FlaggedApi("android.content.pm.verification_service")
+        Must be required by a privileged {@link android.content.pm.verify.pkg.VerifierService}
+        to ensure that only the system can bind to it.
+        This permission should not be held by anything other than the system.
+        <p>Not for use by third-party applications. </p>
+        <p>Protection level: signature
+        @hide
+    -->
+    <permission android:name="android.permission.BIND_VERIFICATION_AGENT"
+        android:protectionLevel="internal"
+        android:featureFlag="android.content.pm.verification_service" />
+
     <!-- Attribution for Geofencing service. -->
     <attribution android:tag="GeofencingService" android:label="@string/geofencing_service"/>
     <!-- Attribution for Country Detector. -->
diff --git a/core/res/res/drawable/notification_progress_icon_background.xml b/core/res/res/drawable/notification_progress_icon_background.xml
new file mode 100644
index 0000000..8e843be
--- /dev/null
+++ b/core/res/res/drawable/notification_progress_icon_background.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
+    <solid android:color="#00000000" />
+    <corners android:radius="4dp" />
+</shape>
\ No newline at end of file
diff --git a/core/res/res/layout/notification_template_material_progress.xml b/core/res/res/layout/notification_template_material_progress.xml
new file mode 100644
index 0000000..b413c70
--- /dev/null
+++ b/core/res/res/layout/notification_template_material_progress.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2024 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
+  -->
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/status_bar_latest_event_content"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:clipChildren="false"
+    android:tag="progress"
+    >
+
+    <LinearLayout
+        android:id="@+id/notification_action_list_margin_target"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/notification_content_margin"
+        android:orientation="vertical"
+        >
+
+        <FrameLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:layout_gravity="top"
+            >
+
+            <include layout="@layout/notification_template_header" />
+
+            <LinearLayout
+                android:id="@+id/notification_main_column"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/notification_content_margin_start"
+                android:layout_marginEnd="@dimen/notification_content_margin_end"
+                android:layout_marginTop="@dimen/notification_content_margin_top"
+                android:orientation="vertical"
+                >
+
+                <include layout="@layout/notification_template_part_line1" />
+
+                <include layout="@layout/notification_template_text_multiline" />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center_vertical"
+                    android:layout_marginTop="@dimen/notification_progress_margin_top"
+                    android:orientation="horizontal">
+
+                    <com.android.internal.widget.CachingIconView
+                        android:id="@+id/notification_progress_start_icon"
+                        android:layout_width="@dimen/notification_progress_icon_size"
+                        android:layout_height="@dimen/notification_progress_icon_size"
+                        android:background="@drawable/notification_progress_icon_background"
+                        android:clipToOutline="true"
+                        android:importantForAccessibility="no"
+                        android:layout_marginEnd="@dimen/notification_progress_margin_horizontal"
+                        android:scaleType="centerCrop"
+                        android:maxDrawableWidth="@dimen/notification_progress_icon_size"
+                        android:maxDrawableHeight="@dimen/notification_progress_icon_size"
+                        />
+
+
+                    <include
+                        android:layout_width="0dp"
+                        android:layout_height="@dimen/notification_progress_bar_height"
+                        layout="@layout/notification_template_progress"
+                        android:layout_weight="1"
+                        />
+
+                    <com.android.internal.widget.CachingIconView
+                        android:id="@+id/notification_progress_end_icon"
+                        android:layout_width="@dimen/notification_progress_icon_size"
+                        android:layout_height="@dimen/notification_progress_icon_size"
+                        android:background="@drawable/notification_progress_icon_background"
+                        android:clipToOutline="true"
+                        android:importantForAccessibility="no"
+                        android:scaleType="centerCrop"
+                        android:layout_marginStart="@dimen/notification_progress_margin_horizontal"
+                        android:maxDrawableWidth="@dimen/notification_progress_icon_size"
+                        android:maxDrawableHeight="@dimen/notification_progress_icon_size"
+                        />
+                </LinearLayout>
+            </LinearLayout>
+
+            <include layout="@layout/notification_template_right_icon" />
+        </FrameLayout>
+
+        <ViewStub
+            android:layout="@layout/notification_material_reply_text"
+            android:id="@+id/notification_material_reply_container"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            />
+
+        <include
+            layout="@layout/notification_template_smart_reply_container"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/notification_content_margin_start"
+            android:layout_marginEnd="@dimen/notification_content_margin_end"
+            android:layout_marginTop="@dimen/notification_content_margin"
+            />
+
+        <include layout="@layout/notification_material_action_list" />
+    </LinearLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 1cd2150..cdae265 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Oproepe en kennisgewings sal vibreer"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Oproepe en kennisgewings sal gedemp wees"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Stelselveranderinge"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Moenie Steur Nie"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nuut: Moenie Steur Nie versteek tans kennisgewings"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tik om meer te wete te kom en te verander."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Moenie Steur Nie het verander"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tik om te kyk wat geblokkeer word."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Gaan kennisgewinginstellings na"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Vanaf Android 13 het programme wat jy installeer jou toestemming nodig om kennisgewings te stuur. Tik om hierdie toestemming vir bestaande programme te verander."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Herinner my later"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 484afc3..cc8ab3e 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ጥሪዎች እና ማሳወቂያዎች ይነዝራሉ"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ጥሪዎች እና ማሳወቂያዎች ድምፀ-ከል ይሆናሉ"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"የሥርዓት ለውጦች"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"አትረብሽ"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"አዲስ፦ አትረብሽ ማሳወቂያዎችን እየደበቀ ነው"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"የበለጠ ለመረዳት እና ለመለወጥ መታ ያድርጉ።"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"አትረብሽ ተቀይሯል"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"ምን እንደታገደ ለመፈተሽ መታ ያድርጉ።"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"የማሳወቂያ ቅንብሮችን ይገምግሙ"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"ከAndroid 13 ጀምረው የሚጭኗቸው መተግበሪያዎች ማሳወቂያዎችን ለመላክ የእርስዎ ፈቃድ ያስፈልጋቸዋል። ይህን ፈቃድ ለነባር መተግበሪያዎች ለመቀየር መታ ያድርጉ።"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"በኋላ አስታውሰኝ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 75e93d1..e81ec89 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -2133,11 +2133,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"سيهتز الهاتف عند تلقّي المكالمات والإشعارات."</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"سيتم كتم صوت الهاتف عند تلقي المكالمات والإشعارات."</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"تغييرات النظام"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"عدم الإزعاج"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"جديد: يؤدي تفعيل ميزة \"عدم الإزعاج\" إلى إخفاء الإشعارات."</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"انقر لمعرفة مزيد من المعلومات وإجراء التغيير."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"تم تغيير ميزة \"عدم الإزعاج\""</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"انقر للاطّلاع على ما تم حظره."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"مراجعة إعدادات الإشعارات"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"‏بدءً من نظام التشغيل Android 13، يجب أن تحصل التطبيقات التي تُثبِّتها على إذن لإرسال الإشعارات. انقر لتغيير هذا الإذن للتطبيقات الحالية."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"تذكيري لاحقًا"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index e64c85e..f36a659 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"কল আৰু জাননীসমূহে কম্পন কৰিব"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"কল আৰু জাননীসমূহ মিউট কৰা হ\'ব"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"ছিষ্টেমৰ সালসলনি"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"অসুবিধা নিদিব"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"নতুন: অসুবিধা নিদিব ম\'ডে জাননীসমূহ লুকাই ৰাখিছে"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"অধিক জানিবলৈ আৰু সলনি কৰিবলৈ টিপক।"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"অসুবিধা নিদিব সলনি হৈছে"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"কি কি অৱৰোধ কৰা হৈছে জানিবলৈ টিপক।"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"জাননীৰ ছেটিং পৰ্যালোচনা কৰক"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13ৰ পৰা, আপুনি ইনষ্টল কৰা এপক জাননী পঠিয়াবলৈ আপোনাৰ অনুমতিৰ প্ৰয়োজন। আগৰে পৰা থকা এপৰ বাবে এই অনুমতিটো সলনি কৰিবলৈ টিপক।"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"পাছত মনত পেলাই দিব"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 25dc429..2a77df2 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Zəng və bildirişlər vibrasiya verəcək"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Zəng və bildirişlər səssiz ediləcək"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistem dəyişiklikləri"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Narahat Etməyin"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Yenilik: \"Narahat etməyin\" rejimi bildirişləri gizlədir"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Ətraflı məıumat əldə edərək dəyişmək üçün klikləyin."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\"Narahat Etməyin\" rejimi dəyişdirildi"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Nəyin blok edildiyini yoxlamaq üçün klikləyin."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Bildiriş ayarlarını nəzərdən keçirin"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13-dən başlayaraq quraşdırdığınız tətbiqlər bildiriş göndərmək üçün icazənizi tələb edir. Mövcud tətbiqlər üçün bu icazəni dəyişmək üçün toxunun."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Sonra xatırladın"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 7413703..a51aad2 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibracija za pozive i obaveštenja je uključena"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Melodija zvona za pozive i obaveštenje je isključena"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistemske promene"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne uznemiravaj"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novo: Režim Ne uznemiravaj krije obaveštenja"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Dodirnite da biste saznali više i promenili podešavanje."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Režim Ne uznemiravaj je promenjen"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Dodirnite da biste proverili šta je blokirano."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Pregledajte podešavanja obaveštenja"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Od Android-a 13 aplikacije koje instalirate moraju da imaju dozvolu za slanje obaveštenja. Dodirnite da biste promenili ovu dozvolu za postojeće aplikacije."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Podseti me kasnije"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index a5af4b9..26f11df 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -2131,11 +2131,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Для выклікаў і апавяшчэнняў уключаны вібрасігнал"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Для выклікаў і апавяшчэнняў гук выключаны"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Сістэмныя змены"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Не турбаваць"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Новае: у рэжыме \"Не турбаваць\" апавяшчэнні не паказваюцца"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Дакраніцеся, каб даведацца больш і змяніць."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Зменены налады рэжыму \"Не турбаваць\""</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Націсніце, каб паглядзець заблакіраванае."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Праверце налады апавяшчэнняў"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Пачынаючы з версіі Android 13 усталяваным вамі праграмам неабходна даваць дазвол на адпраўку апавяшчэнняў. Націсніце, каб змяніць дазвол для існуючых праграм."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Нагадаць пазней"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 93fdf3d..38c9d0b 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"При обаждания и известия устройството ще вибрира"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Обажданията и известията ще бъдат заглушени"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Промени в системата"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Не безпокойте"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Ново: Режимът „Не безпокойте“ скрива известията"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Докоснете, за да научите повече и да извършите промени."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Настройките за „Не безпокойте“ са променени"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Докоснете, за да проверите какво е блокирано."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Преглед на настройките за известия"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"От Android 13 инсталираните от вас приложения трябва да получат разрешението ви, за да изпращат известия. Докоснете, за да промените това разрешение за съществуващите приложения."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Напомняне по-късно"</string>
@@ -2408,9 +2403,9 @@
     <string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"За клавиатурната подредба са зададени <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g> и <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Докоснете за промяна."</string>
     <string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физическите клавиатури са конфигурирани"</string>
     <string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Докоснете за преглед на клавиатурите"</string>
-    <string name="profile_label_private" msgid="6463418670715290696">"Частни"</string>
+    <string name="profile_label_private" msgid="6463418670715290696">"Частен"</string>
     <string name="profile_label_clone" msgid="769106052210954285">"Клониране"</string>
-    <string name="profile_label_work" msgid="3495359133038584618">"Служебни"</string>
+    <string name="profile_label_work" msgid="3495359133038584618">"Служебен"</string>
     <string name="profile_label_work_2" msgid="4691533661598632135">"Служебни 2"</string>
     <string name="profile_label_work_3" msgid="4834572253956798917">"Служебни 3"</string>
     <string name="profile_label_test" msgid="9168641926186071947">"Тестване"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 0871bfd..8a833c8 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"কল এবং বিজ্ঞপ্তি আসলে ভাইব্রেট হবে"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"কল এবং বিজ্ঞপ্তিগুলি মিউট করা হবে"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"সিস্টেমে হয়ে থাকা পরিবর্তন"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"বিরক্ত করবে না"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"নতুন: \'বিরক্ত করবে না\' মোড চালু আছে, তাই বিজ্ঞপ্তি লুকিয়ে ফেলা হচ্ছে"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"আরও জানতে এবং পরিবর্তন করতে ট্যাপ করুন।"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\'বিরক্ত করবে না\' মোডের সেটিং বদলে গেছে"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"কী কী ব্লক করা আছে তা দেখতে ট্যাপ করুন।"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"বিজ্ঞপ্তির সেটিংস পর্যালোচনা করুন"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 থেকে শুরু করে, বিজ্ঞপ্তি পাঠানোর জন্য আপনার ইনস্টল করা অ্যাপকে অনুমতি নিতে হবে। বর্তমান অ্যাপের জন্য এই অনুমতি পরিবর্তন করতে ট্যাপ করুন।"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"পরে মনে করিয়ে দিও"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 50f2221..9e29b7f 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Pozivi i obavještenja će vibrirati"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Pozivi i obavještenja će se isključiti"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistemske promjene"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne ometaj"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novo: Način rada Ne ometaj sakriva obavještenja"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Dodirnite da saznate više i izvršite promjene."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Način rada Ne ometaj je promijenjen"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Dodirnite da provjerite šta je blokirano."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Pregledajte postavke obavještenja"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Počevši od Androida 13, aplikacije koje instalirate trebaju odobrenje da šalju obavještenja. Dodirnite da promijenite ovo odobrenje za postojeće aplikacije."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Podsjeti me kasnije"</string>
@@ -2154,7 +2149,7 @@
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Uredu"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Isključi"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saznajte više"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Poboljšana obavještenja su zamijenila Prilagodljiva obavještenja Androida u verziji Android 12. Ova funkcija prikazuje predložene radnje i odgovore te organizira vaša obavještenja.\n\nPoboljšana obavještenja mogu pristupiti sadržaju obavještenja, uključujući lične informacije kao što su imena kontakata i poruke. Ova funkcija također može odbacivati obavještenja ili reagirati na njih, npr. može odgovarati na telefonske pozive i kontrolirati funkciju Ne ometaj."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Poboljšana obavještenja su zamijenila prilagodljiva obavještenja Androida u verziji Android 12. Ova funkcija prikazuje predložene radnje i odgovore te organizira vaša obavještenja.\n\nPoboljšana obavještenja mogu pristupiti sadržaju obavještenja, uključujući lične informacije kao što su imena kontakata i poruke. Ova funkcija također može odbacivati obavještenja ili reagirati na njih, npr. može odgovarati na telefonske pozive i kontrolirati funkciju Ne ometaj."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Obavještenje za informacije Rutinskog načina"</string>
     <string name="dynamic_mode_notification_title" msgid="1388718452788985481">"Ušteda baterije je uključena"</string>
     <string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"Smanjena je potrošnja baterije da se produži vijek trajanja baterije"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 5728aed..0dd1bca 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Les trucades i les notificacions vibraran"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Les trucades i les notificacions se silenciaran"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Canvis del sistema"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"No molestis"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novetat: el mode No molestis està amagant notificacions"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Toca per obtenir més informació i canviar la configuració."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"S\'ha canviat el mode No molestis"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Toca per consultar què s\'ha bloquejat."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Consulta la configuració de notificacions"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"A partir de la versió Android 13, les aplicacions que instal·les necessiten el teu permís per enviar notificacions. Toca per canviar aquest permís per a les aplicacions existents."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Recorda-m\'ho més tard"</string>
@@ -2394,12 +2389,12 @@
     <string name="connected_display_unavailable_notification_content" msgid="3845903313751217516">"Utilitza un altre cable i torna-ho a provar"</string>
     <string name="connected_display_thermally_unavailable_notification_content" msgid="9205758199439955949">"El dispositiu està massa calent i no pot duplicar a la pantalla fins que es refredi"</string>
     <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Pantalla dual"</string>
-    <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"La pantalla dual està activada"</string>
+    <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Pantalla dual està activada"</string>
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> està utilitzant les dues pantalles per mostrar contingut"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"El dispositiu està massa calent"</string>
-    <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"La pantalla dual no està disponible perquè el telèfon està massa calent"</string>
-    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen no està disponible"</string>
-    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen no està disponible perquè la funció Estalvi de bateria està activada. Pots desactivar aquesta opció a Configuració."</string>
+    <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Pantalla dual no està disponible perquè el telèfon està massa calent"</string>
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Pantalla dual no està disponible"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Pantalla dual no està disponible perquè la funció Estalvi de bateria està activada. Pots desactivar aquesta opció a Configuració."</string>
     <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ves a Configuració"</string>
     <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Desactiva"</string>
     <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> configurat"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 2fea7fb..35f269a 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -2131,11 +2131,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Volání a oznámení budou vibrovat"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Volání a oznámení budou ztlumena"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Změny nastavení systému"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Nerušit"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novinka: Režim Nerušit skrývá oznámení"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Klepnutím zobrazíte další informace a provedete změny."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Nastavení režimu Nerušit se změnilo"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Klepnutím zkontrolujete, co je blokováno."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Zkontrolujte nastavení oznámení"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Počínaje systémem Android 13 od vás nainstalované aplikace potřebují oprávnění k odesílání oznámení. Klepnutím toto oprávnění změníte pro stávající aplikace."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Připomenout později"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index a9626a6..833b0c5 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Telefonen vibrerer ved opkald og notifikationer"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Der afspilles ikke lyd ved opkald og notifikationer"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Systemændringer"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Forstyr ikke"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nyhed! Forstyr ikke skjuler notifikationer"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tryk for at få flere oplysninger og foretage ændringer."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Tilstanden Forstyr ikke blev ændret"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tryk for at se, hvad der er blokeret."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Gennemgå indstillinger for notifikationer"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Fra og med Android 13 skal de apps, som du installerer, have din tilladelse til at sende notifikationer. Tryk for at ændre denne indstilling for eksisterende apps."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Påmind mig senere"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index da0e9bd..1318f64 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Gerät vibriert bei Anrufen und Benachrichtigungen"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Anrufe und Benachrichtigungen stummgeschaltet"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Systemänderungen"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Bitte nicht stören"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Neu: Durch „Bitte nicht stören“ werden Benachrichtigungen nicht mehr angezeigt"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Für weitere Informationen und zum Ändern tippen."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"„Bitte nicht stören“ wurde geändert"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tippe, um zu überprüfen, welche Inhalte blockiert werden."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Benachrichtigungseinstellungen überprüfen"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Ab Android 13 benötigen Apps, die du installierst, die Berechtigung zum Senden von Benachrichtigungen. Wenn du diese Berechtigung für bereits installierte Apps ändern möchtest, tippe hier."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Später erinnern"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 0556a08..bccea8f 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -507,7 +507,7 @@
     <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"Επιτρέπει στην εφαρμογή την τροποποίηση καθολικών ρυθμίσεων ήχου, όπως η ένταση και ποιο ηχείο χρησιμοποιείται για έξοδο."</string>
     <string name="permlab_recordAudio" msgid="1208457423054219147">"εγγράφει ήχο"</string>
     <string name="permdesc_recordAudio" msgid="5857246765327514062">"Αυτή η εφαρμογή μπορεί να εγγράφει ήχο μέσω του μικροφώνου, όταν τη χρησιμοποιείτε."</string>
-    <string name="permlab_recordBackgroundAudio" msgid="5891032812308878254">"εγγραφή ήχου στο παρασκήνιο"</string>
+    <string name="permlab_recordBackgroundAudio" msgid="5891032812308878254">"ηχογράφηση στο παρασκήνιο"</string>
     <string name="permdesc_recordBackgroundAudio" msgid="1992623135737407516">"Αυτή η εφαρμογή μπορεί να εγγράφει ήχο μέσω του μικροφώνου, ανά πάσα στιγμή."</string>
     <string name="permlab_detectScreenCapture" msgid="4447042362828799433">"ανίχνευση καταγραφών οθόνης που περιέχουν τα παράθυρα της εφαρμογής"</string>
     <string name="permdesc_detectScreenCapture" msgid="3485784917960342284">"Η εφαρμογή θα λάβει ειδοποίηση όταν ληφθεί ένα στιγμιότυπο οθόνης ενώ βρίσκεται σε χρήση."</string>
@@ -541,7 +541,7 @@
     <string name="permlab_callCompanionApp" msgid="3654373653014126884">"προβολή και έλεγχος κλήσεων μέσω του συστήματος."</string>
     <string name="permdesc_callCompanionApp" msgid="8474168926184156261">"Επιτρέπει στην εφαρμογή να βλέπει και να ελέγχει τις εισερχόμενες κλήσεις στη συσκευή. Αυτό περιλαμβάνει πληροφορίες όπως τους αριθμούς κλήσεων για τις κλήσεις και την κατάσταση των κλήσεων."</string>
     <string name="permlab_exemptFromAudioRecordRestrictions" msgid="1164725468350759486">"εξαίρεση από περιορισμούς εγγραφής ήχου"</string>
-    <string name="permdesc_exemptFromAudioRecordRestrictions" msgid="2425117015896871976">"Εξαιρέστε την εφαρμογή από περιορισμούς για την εγγραφή ήχου."</string>
+    <string name="permdesc_exemptFromAudioRecordRestrictions" msgid="2425117015896871976">"Εξαιρέστε την εφαρμογή από περιορισμούς για την ηχογράφηση."</string>
     <string name="permlab_acceptHandover" msgid="2925523073573116523">"συνέχιση κλήσης από άλλη συσκευή"</string>
     <string name="permdesc_acceptHandovers" msgid="7129026180128626870">"Επιτρέπει στην εφαρμογή να συνεχίσει μια κλήση η οποία ξεκίνησε σε άλλη εφαρμογή."</string>
     <string name="permlab_readPhoneNumbers" msgid="5668704794723365628">"ανάγνωση αριθμών τηλεφώνου"</string>
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Θα υπάρχει δόνηση για κλήσεις και ειδοποιήσεις"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Οι κλήσεις και οι ειδοποιήσεις θα τεθούν σε παύση"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Αλλαγές στο σύστημα"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Μην ενοχλείτε"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Νέο: Η λειτουργία \"Μην ενοχλείτε\" αποκρύπτει ειδοποιήσεις"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Πατήστε για να μάθετε περισσότερα και να κάνετε αλλαγές."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Η λειτουργία \"Μην ενοχλείτε\" άλλαξε"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Πατήστε για να ελέγξετε το περιεχόμενο που έχει αποκλειστεί."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Έλεγχος ρυθμίσεων ειδοποιήσεων"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Από το Android 13 και έπειτα, οι εφαρμογές που εγκαθιστάτε θα χρειάζονται την άδειά σας για την αποστολή ειδοποιήσεων. Πατήστε για να αλλάξετε αυτή την άδεια για υπάρχουσες εφαρμογές."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Υπενθύμιση αργότερα"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 086835c..e9239e2 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Calls and notifications will vibrate"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Calls and notifications will be muted"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"System changes"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Do not disturb"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"New: Do Not Disturb is hiding notifications"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tap to find out more and change."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Do Not Disturb has changed"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tap to check what\'s blocked."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Review notification settings"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Starting in Android 13, apps that you install need your permission to send notifications. Tap to change this permission for existing apps."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Remind me later"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 88a83b5..c624e2a 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Calls and notifications will vibrate"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Calls and notifications will be muted"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"System changes"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Do Not Disturb"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"New: Do Not Disturb is hiding notifications"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tap to learn more and change."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Do Not Disturb has changed"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tap to check what\'s blocked."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Review notification settings"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Starting in Android 13, apps that you install need your permission to send notifications. Tap to change this permission for existing apps."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Remind me later"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index ef399b7..9ffaa5d 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Calls and notifications will vibrate"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Calls and notifications will be muted"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"System changes"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Do not disturb"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"New: Do Not Disturb is hiding notifications"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tap to find out more and change."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Do Not Disturb has changed"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tap to check what\'s blocked."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Review notification settings"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Starting in Android 13, apps that you install need your permission to send notifications. Tap to change this permission for existing apps."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Remind me later"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 94ddc43..23441bb 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Calls and notifications will vibrate"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Calls and notifications will be muted"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"System changes"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Do not disturb"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"New: Do Not Disturb is hiding notifications"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tap to find out more and change."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Do Not Disturb has changed"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tap to check what\'s blocked."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Review notification settings"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Starting in Android 13, apps that you install need your permission to send notifications. Tap to change this permission for existing apps."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Remind me later"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index a0a891e..b1ba09c 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‎‏‏‏‎Calls and notifications will vibrate‎‏‎‎‏‎"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‏‎‎‏‎‏‎‏‏‎‎‎‎‎‎‏‎‎‏‎‎‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎Calls and notifications will be muted‎‏‎‎‏‎"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‏‏‏‎‎System changes‎‏‎‎‏‎"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‏‎‎‏‎‏‎Do Not Disturb‎‏‎‎‏‎"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‎‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‎New: Do Not Disturb is hiding notifications‎‏‎‎‏‎"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎Tap to learn more and change.‎‏‎‎‏‎"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‏‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‏‎‏‎Do Not Disturb has changed‎‏‎‎‏‎"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎Tap to check what\'s blocked.‎‏‎‎‏‎"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‎‏‎‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‎‏‎‎‎Review notification settings‎‏‎‎‏‎"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‏‏‎‏‎‏‎‏‏‏‎‎‏‎‏‎‏‏‏‎‎‎‏‎‏‎‏‏‎‏‏‏‏‏‎‎‎‏‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎Starting in Android 13, apps that you install need your permission to send notifications. Tap to change this permission for existing apps.‎‏‎‎‏‎"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‎‎‏‏‎‎‎‏‎‏‎‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‏‎‏‏‎Remind me later‎‏‎‎‏‎"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index cbb30fd..89b22b9 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibrarán las llamadas y notificaciones"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Se silenciarán las llamadas y notificaciones"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Cambios del sistema"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"No interrumpir"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nuevo: No interrumpir oculta las notificaciones"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Presiona para obtener más información y realizar cambios."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Se modificó la opción No interrumpir"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Presiona para consultar lo que está bloqueado."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Revisa la configuración de notificaciones"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"A partir de Android 13, las apps que instales necesitarán tu permiso a fin de enviar notificaciones. Presiona para cambiar este permiso para las apps existentes."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Recordarme más tarde"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 23024f0..0082ade 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1407,7 +1407,7 @@
     <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Se ha detectado un accesorio de audio analógico"</string>
     <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"El dispositivo adjunto no es compatible con este teléfono. Toca para obtener más información."</string>
     <string name="adb_active_notification_title" msgid="408390247354560331">"Depuración por USB activa"</string>
-    <string name="adb_active_notification_message" msgid="5617264033476778211">"Toca para desactivar la depuración por USB"</string>
+    <string name="adb_active_notification_message" msgid="5617264033476778211">"Toca para desactivar depuración USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Seleccionar para inhabilitar la depuración por USB"</string>
     <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Depuración inalámbrica conectada"</string>
     <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Toca para desactivar la depuración inalámbrica"</string>
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Las llamadas y las notificaciones vibrarán"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Las llamadas y las notificaciones se silenciarán"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Cambios del sistema"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"No molestar"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novedad: El modo No molestar oculta las notificaciones"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Toca para obtener más información y hacer cambios."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Ha cambiado el modo No molestar"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Toca para consultar lo que se está bloqueando."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Consulta los ajustes de notificaciones"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"A partir de Android 13, las aplicaciones que instalas necesitan tu permiso para enviar notificaciones. Toca para cambiar este permiso en las aplicaciones que ya tengas."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Recordar más tarde"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 326b3db..44f1055 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Kõnede ja märguannete puhul seade vibreerib"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Kõned ja märguanded on vaigistatud"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Süsteemi muudatused"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Mitte segada"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Uus: režiim Mitte segada peidab märguandeid"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Puudutage lisateabe vaatamiseks ja muutmiseks."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Režiimi Mitte segada muudeti"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Puudutage, et kontrollida, mis on blokeeritud."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Vaadake üle märguandeseaded"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Alates operatsioonisüsteemist Android 13 vajavad installitavad rakendused märguannete saatmiseks teie luba. Puudutage, et muuta seda luba olemasolevate rakenduste jaoks."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Tuleta hiljem meelde"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index d092f46..d017a05 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -745,7 +745,7 @@
     <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Saiakera gehiegi egin dira. Horren ordez, erabili pantailaren blokeoa."</string>
     <string name="face_error_unable_to_process" msgid="5723292697366130070">"Ezin da egiaztatu aurpegia. Saiatu berriro."</string>
     <string name="face_error_not_enrolled" msgid="1134739108536328412">"Ez duzu konfiguratu aurpegi bidez desblokeatzeko eginbidea"</string>
-    <string name="face_error_hw_not_present" msgid="7940978724978763011">"Aurpegi bidez desblokeatzeko eginbidea ez da bateragarria gailu honekin"</string>
+    <string name="face_error_hw_not_present" msgid="7940978724978763011">"Aurpegi bidez desblokeatzeko eginbidea ez da onartzen gailu honetan"</string>
     <string name="face_error_security_update_required" msgid="5076017208528750161">"Sentsorea aldi baterako desgaitu da."</string>
     <string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g> aurpegia"</string>
     <string name="face_app_setting_name" msgid="5854024256907828015">"Erabili aurpegi bidez desblokeatzeko eginbidea"</string>
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Dar-dar egingo du deiak eta jakinarazpenak jasotzean"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Ez da joko tonurik deiak eta jakinarazpenak jasotzean"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistema-aldaketak"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ez molestatzeko modua"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Berria: Ez molestatzeko modua jakinarazpenak ezkutatzen ari da"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Sakatu informazio gehiago lortzeko eta portaera aldatzeko."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Ez molestatzeko modua aldatu da"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Sakatu zer dagoen blokeatuta ikusteko."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Berrikusi jakinarazpen-ezarpenak"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 ezkero, jakinarazpenak bidaltzeko baimena eman behar diezu instalatzen dituzun aplikazioei. Sakatu hau lehendik dauden aplikazioen baimenak aldatzeko."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Gogorarazi geroago"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index e37106d..ad8f056 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -22,7 +22,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="byteShort" msgid="202579285008794431">"بایت"</string>
     <string name="fileSizeSuffix" msgid="4233671691980131257">"<xliff:g id="NUMBER">%1$s</xliff:g> ‏<xliff:g id="UNIT">%2$s</xliff:g>"</string>
-    <string name="untitled" msgid="3381766946944136678">"‏&lt;بدون عنوان&gt;"</string>
+    <string name="untitled" msgid="3381766946944136678">"‏&lt;بی‌عنوان&gt;"</string>
     <string name="emptyPhoneNumber" msgid="5812172618020360048">"(بدون شماره تلفن)"</string>
     <string name="unknownName" msgid="7078697621109055330">"نامشخص"</string>
     <string name="defaultVoiceMailAlphaTag" msgid="2190754495304236490">"پست صوتی"</string>
@@ -196,7 +196,7 @@
     <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"توسط یک شخص ثالث ناشناس"</string>
     <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"توسط سرپرست نمایه کاری شما"</string>
     <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"توسط <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
-    <string name="work_profile_deleted" msgid="5891181538182009328">"نمایه کار حذف شد"</string>
+    <string name="work_profile_deleted" msgid="5891181538182009328">"نمایه کاری حذف شد"</string>
     <string name="work_profile_deleted_details" msgid="3773706828364418016">"برنامه سرپرست نمایه کاری یا وجود ندارد یا خراب است. در نتیجه، نمایه کاری شما و داده‌های مرتبط با آن حذف شده است. برای دریافت راهنمایی با سرپرست سیستم تماس بگیرید."</string>
     <string name="work_profile_deleted_description_dpm_wipe" msgid="2477244968924647232">"نمایه کاری شما دیگر در این دستگاه دردسترس نیست"</string>
     <string name="work_profile_deleted_reason_maximum_password_failure" msgid="1080323158315663167">"تلاش‌های بسیار زیادی برای وارد کردن گذرواژه انجام شده است"</string>
@@ -458,7 +458,7 @@
     <string name="permlab_foregroundServiceSpecialUse" msgid="7973536745876645082">"اجرای سرویس پیش‌نما از نوع «استفاده ویژه»"</string>
     <string name="permdesc_foregroundServiceSpecialUse" msgid="646713654541885919">"به برنامه اجازه می‌دهد از سرویس‌های پیش‌نما از نوع «استفاده ویژه» استفاده کند"</string>
     <string name="permlab_getPackageSize" msgid="375391550792886641">"اندازه‌گیری اندازه فضای ذخیره‌سازی برنامه"</string>
-    <string name="permdesc_getPackageSize" msgid="742743530909966782">"‏به برنامه اجازه می‎دهد تا کدها، داده‎ها و اندازه‎های حافظهٔ پنهان خود را بازیابی کند"</string>
+    <string name="permdesc_getPackageSize" msgid="742743530909966782">"‏به برنامه اجازه می‎دهد تا کدها، داده‎ها و اندازه‎های حافظه نهان خود را بازیابی کند"</string>
     <string name="permlab_writeSettings" msgid="8057285063719277394">"تغییر تنظیمات سیستم"</string>
     <string name="permdesc_writeSettings" msgid="8293047411196067188">"‏به برنامه اجازه می‎دهد تا داده‎های تنظیم سیستم را تغییر دهد. برنامه‌های مخرب می‎توانند پیکربندی سیستم شما را خراب کنند."</string>
     <string name="permlab_receiveBootCompleted" msgid="6643339400247325379">"اجرا شدن در هنگام راه‌اندازی"</string>
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"دستگاهتان برای تماس‌ها و اعلان‌ها می‌لرزد"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"دستگاهتان برای تماس‌ها و اعلان‌ها بی‌صدا خواهد شد"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"تغییرات سیستم"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"مزاحم نشوید"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"جدید: «مزاحم نشوید» اعلان‌ها را پنهان می‌کند"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"برای اطلاعات بیشتر و تغییر دادن، تک‌ضرب بزنید."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"«مزاحم نشوید» تغییر کرده است"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"برای بررسی موارد مسدودشده تک‌ضرب بزنید."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"مرور تنظیمات اعلان"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"‏از Android نسخه ۱۳ به بعد، برنامه‌هایی که نصب می‌کنید برای ارسال اعلان به اجازه شما نیاز دارند. برای تغییر دادن این اجازه در برنامه‌های موجود، تک‌ضرب بزنید."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"بعداً یادآوری شود"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 672e508..196db12 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -2010,7 +2010,7 @@
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Näytön lukituksen asettaminen"</string>
     <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Aseta näytön lukitus"</string>
     <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Edellyttää näytön lukitusta"</string>
-    <string name="private_space_set_up_screen_lock_for_reset" msgid="7817091386408432097">"Jos haluat poistaa yksityisen tilan, aseta laitteelle näytön lukitus"</string>
+    <string name="private_space_set_up_screen_lock_for_reset" msgid="7817091386408432097">"Jos haluat poistaa yksityisen tilan, lisää laitteelle näytön lukitus"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"Sovellus ei ole käytettävissä"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei ole nyt käytettävissä."</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ei käytettävissä"</string>
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Puhelut ja ilmoitukset värisevät"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Puhelut ja ilmoitukset mykistetään"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Järjestelmän muutokset"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Älä häiritse"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Uutta: Älä häiritse ‑tila piilottaa ilmoitukset"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Napauta, jos haluat lukea lisää ja tehdä muutoksia."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Älä häiritse ‑tila muuttui"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Napauta niin näet, mitä on estetty."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Tarkista ilmoitusasetukset"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Asentamasi sovellukset tarvitsevat sinulta luvan ilmoitusten lähettämiseen Android 13 ‑käyttöjärjestelmästä alkaen. Napauta muuttaaksesi nykyisten sovellusten lupia."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Muistuta myöhemmin"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index bc11e547..ac87d3b 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Les appels et les notifications vibreront"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Les appels et les notifications seront silencieux"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Changements système"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne pas déranger"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nouveau : Le mode Ne pas déranger masque les notifications"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Touchez ici pour en savoir plus et changer les paramètres"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Les paramètres du mode Ne pas déranger ont changé"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Touchez l\'écran pour vérifier ce qui est bloqué."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Examiner les paramètres de notification"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"À partir d\'Android 13, les applis que vous installez ont besoin de votre autorisation pour envoyer des notifications. Touchez pour modifier cette autorisation pour les applis existantes."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Me rappeler plus tard"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 03cf463..2368c88 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1407,7 +1407,7 @@
     <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Accessoire audio analogique détecté"</string>
     <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"L\'appareil connecté n\'est pas compatible avec ce téléphone. Appuyez ici pour en savoir plus."</string>
     <string name="adb_active_notification_title" msgid="408390247354560331">"Débogage USB activé"</string>
-    <string name="adb_active_notification_message" msgid="5617264033476778211">"Appuyez pour désactiver le débogage USB"</string>
+    <string name="adb_active_notification_message" msgid="5617264033476778211">"Appuyez pour le désactiver"</string>
     <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Sélectionnez cette option pour désactiver le débogage USB."</string>
     <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Débogage sans fil connecté"</string>
     <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Appuyez pour désactiver le débogage sans fil"</string>
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Les appels et les notifications vibreront"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Les appels et les notifications seront silencieux"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Modifications du système"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne pas déranger"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nouveau : Le mode Ne pas déranger masque les notifications"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Appuyez pour en savoir plus et pour modifier les paramètres."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Le mode Ne pas déranger a été modifié"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Appuyez pour vérifier les contenus bloqués."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Vérifiez les paramètres de notification"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"À partir d\'Android 13, les applications que vous installez ont besoin de votre autorisation pour envoyer des notifications. Appuyez pour modifier cette autorisation pour les applications déjà installées."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Plus tard"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 430d649..2aba790 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"As chamadas e as notificacións vibrarán"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"As chamadas e as notificacións estarán silenciadas"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Cambios no sistema"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Non molestar"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novidade! O modo Non molestar oculta as notificacións"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Toca para obter máis información e facer cambios."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"O modo Non molestar cambiou"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Toca para comprobar o contido bloqueado."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Consulta a configuración de notificacións"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Desde Android 13, as aplicacións que instales necesitan o teu permiso para enviar notificacións. Toca para cambiar este permiso nas aplicacións que xa teñas."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Lembrarmo máis tarde"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index f40fb93..8d90e3b 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"કૉલ અને નોટિફિકેશન માટે ઉપકરણ વાઇબ્રેટ થશે"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"કૉલ અને નોટિફિકેશન મ્યૂટ કરવામાં આવશે"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"સિસ્ટમના ફેરફારો"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ખલેલ પાડશો નહીં"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"નવું: ખલેલ પાડશો નહીં હવે નોટિફિકેશન છુપાવી શકે છે"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"વધુ જાણવા અને બદલવા માટે ટૅપ કરો."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"ખલેલ પાડશો નહીંમાં ફેરફાર થયો છે"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"શું બ્લૉક કરેલ છે તે તપાસવા માટે ટૅપ કરો."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"નોટિફિકેશનના સેટિંગ રિવ્યૂ કરો"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13થી શરૂઆત કરીને, તમે જે પણ ઍપ ઇન્સ્ટૉલ કરશો, તેને નોટિફિકેશન મોકલવા માટે તમારી પરવાનગીની જરૂર રહેશે. હાલની બધી ઍપ માટે આ પરવાનગીમાં ફેરફાર કરવા માટે ટૅપ કરો."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"મને પછી યાદ અપાવજો"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 0386387f..12ffe87 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"कॉल और सूचनाओं आने पर डिवाइस वाइब्रेट हाेगा"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"कॉल और सूचनाओं के लिए डिवाइस म्यूट रहेगा"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"सिस्टम में हुए बदलाव"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"परेशान न करें"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"नई सुविधा: परेशान न करें सुविधा चालू होने की वजह से सूचनाएं नहीं दिखाई जा रही हैं"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ज़्यादा जानने और बदलाव करने के लिए टैप करें."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"परेशान न करें की सुविधा बदल गई है"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"टैप करके देखें कि किन चीज़ों पर रोक लगाई गई है."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"सूचना सेटिंग देखें"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 में जो ऐप्लिकेशन इंस्टॉल किए जाएंगे, उन्हें आपको सूचनाएं भेजने के लिए अनुमति लेनी होगी. पहले से इंस्टॉल किए गए ऐप्लिकेशन को दी गई अनुमति बदलने के लिए टैप करें."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"बाद में याद दिलाएं"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 54dc55d..895c3fa 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Uređaj će vibrirati za pozive i obavijesti"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Zvučni signal poziva i obavijesti bit će isključen"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Promjene sustava"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne uznemiravaj"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novo: način Ne uznemiravaj sakriva obavijesti"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Dodirnite da biste saznali više i promijenili postavke."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Promijenjena je postavka Ne uznemiravaj"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Dodirnite da biste provjerili što je blokirano."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Pregledajte postavke obavijesti"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Od Androida 13 aplikacije koje instalirate trebaju vaše dopuštenje za slanje obavijesti. Dodirnite da biste promijenili to dopuštenje za postojeće aplikacije."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Podsjeti me kasnije"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 179de20..3bbaef2 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"A hívások és az értesítések rezegnek"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"A hívások és az értesítések némák"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Rendszermódosítások"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne zavarjanak"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Újdonság: A Ne zavarjanak mód elrejti az értesítéseket"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Koppintással további információhoz juthat, és elvégezheti a módosítást."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Módosultak a Ne zavarjanak mód beállításai"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Koppintson a letiltott elemek megtekintéséhez."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Értesítési beállítások áttekintése"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Az Android 13-as rendszertől kezdődően a telepített alkalmazásoknak engedélyre van szükségük értesítések küldéséhez. Koppintással módosíthatja ezt az engedélyt a meglévő alkalmazások esetében."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Emlékeztessen később"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 312a105..d341adaf 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Զանգերի և ծանուցումների համար թրթռոցը միացված է"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Զանգերի և ծանուցումների համար ձայնն անջատված է"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Համակարգի փոփոխություններ"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Չանհանգստացնել"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Այժմ «Չանհանգստացնել» ռեժիմում ծանուցումները թաքցվում են"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Հպեք՝ ավելին իմանալու և կարգավորումները փոխելու համար:"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"«Չանհանգստացնել» ռեժիմի կարգավորումները փոխվել են"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Հպեք՝ տեսնելու, թե ինչ է արգելափակվել:"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Ստուգեք ծանուցումների կարգավորումները"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Հավելվածներին, որոնք տեղադրում եք Android 13 և ավելի նոր տարբերակներով սարքերում, անհրաժեշտ է տրամադրել ծանուցումներ ուղարկելու թույլտվություն։ Հպեք և փոխեք այս թույլտվությունն արդեն տեղադրված հավելվածների համար։"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Հիշեցնել ավելի ուշ"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index e830d6d..1d20526 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Panggilan dan notifikasi akan bergetar"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Suara panggilan dan notifikasi akan dinonaktifkan"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Perubahan sistem"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Jangan Ganggu"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Baru: Mode Jangan Ganggu menyembunyikan notifikasi"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Ketuk untuk mempelajari lebih lanjut dan mengubah."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Jangan Ganggu telah berubah"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Ketuk untuk memeriksa item yang diblokir."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Tinjau setelan notifikasi"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Mulai Android 13, aplikasi yang Anda instal memerlukan izin untuk mengirim notifikasi. Ketuk guna mengubah izin ini untuk aplikasi yang sudah ada."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Ingatkan saya nanti"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 307fb52..b6d1c12 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Titringur er virkur fyrir símtöl og tilkynningar"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Slökkt verður á hljóði símtala og tilkynninga"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Breytingar á kerfi"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ónáðið ekki"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nýtt: „Ónáðið ekki“ er að fela tilkynningar"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Ýttu til að fá frekari upplýsingar og breyta."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"„Ónáðið ekki“ var breytt"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Ýttu til að skoða hvað lokað hefur verið á."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Yfirfara tilkynningastillingar"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Frá og með Android 13 þurfa forrit sem þú setur upp heimild frá þér til að senda tilkynningar. Ýttu til að breyta þessari heimild fyrir forrit sem fyrir eru."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Minna mig á seinna"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 08ea1f1..66e5f72 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"La vibrazione sarà attiva per chiamate e notifiche"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"L\'audio di chiamate e notifiche sarà disattivato"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Modifiche al sistema"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Non disturbare"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novità: la modalità Non disturbare nasconde le notifiche"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tocca per avere ulteriori informazioni e modificare."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"L\'impostazione Non disturbare è cambiata"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tocca per controllare le notifiche bloccate."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Controlla le impostazioni di notifica"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"A partire da Android 13, le app che installi devono avere la tua autorizzazione per poter inviare notifiche. Tocca per cambiare questa autorizzazione per le app esistenti."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Ricordamelo dopo"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 1c1918c..8f4fbcd 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"שיחות והודעות ירטטו"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"שיחות והתראות יושתקו"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"שינויים במערכת"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"נא לא להפריע"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"חדש: מצב \'נא לא להפריע\' מסתיר התראות"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"אפשר להקיש כדי לקבל מידע נוסף ולבצע שינויים."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"ההגדרה \'נא לא להפריע\' השתנתה"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"יש להקיש כדי לבדוק מה חסום."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"בדיקת הגדרת ההתראות"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"‏החל מגרסת Android 13, אפליקציות שיותקנו יוכלו לשלוח התראות רק אם יקבלו ממך הרשאה. אפשר להקיש כדי לשנות את ההרשאה הזו באפליקציות קיימות."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"תזכירו לי מאוחר יותר"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 36d956c..cd5527c 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"着信や通知をバイブレーションで知らせます"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"着信音と通知音が鳴りません"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"システムの変更"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"サイレント モード"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"新機能: サイレント モードでは通知が非表示になります"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"タップすると、詳細を確認して設定を変更できます。"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"サイレント モードが変わりました"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"タップしてブロック対象をご確認ください。"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"通知設定の確認"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 以降では、インストールするアプリに、通知を送信する権限を付与する必要があります。既存のアプリのこの権限を変更するには、タップしてください。"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"後で"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 9a88e54..9b1c07f 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ზარების და შეტყობინებების მიღებისას ვიბრაცია ჩაირთვება"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ზარები და შეტყობინებები დადუმებული იქნება"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"სისტემის ცვლილებები"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"არ შემაწუხოთ"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ახალი: „არ შემაწუხოთ“ რეჟიმი მალავს შეტყობინებებს"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"შეეხეთ მეტის გასაგებად და შესაცვლელად."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"„არ შემაწუხოთ“ რეჟიმი შეცვლილია"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"შეეხეთ იმის სანახავად, თუ რა არის დაბლოკილი."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"შეტყობინების პარამეტრების შემოწმება"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13-ზე შეტყობინებების გასაგზავნად საჭიროა თქვენ მიერ დაინსტალირებული აპებისთვის ნებართვის მინიჭება. არსებული აპებისთვის ამ ნებართვის შესაცვლელად შეეხეთ."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"შემახსენე მოგვიან."</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 595b9ba..ebf627f 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Қоңыраулар мен хабарландырулардың дірілі болады."</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Қоңыраулар мен хабарландырулардың дыбыстық сигналы өшіріледі"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Жүйе өзгерістері"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Мазаламау режимі"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Жаңа: Мазаламау режимі хабарландыруларды жасыруда"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Толығырақ ақпарат алу және өзгерту үшін түртіңіз."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Мазаламау режимі өзгерді"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Түймені түртіп, неге тыйым салынатынын көріңіз."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Хабарландыру параметрлерін қарау"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 нұсқасынан бастап орнатылатын қолданбалар үшін хабарландыру жіберу рұқсаты керек. Бұрынғы қолданбаларда осы рұқсатты өзгерту үшін түртіңіз."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Кейінірек еске салу"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 696bd79..df7006a 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ការហៅ​ទូរសព្ទ និងការជូន​ដំណឹងនឹងញ័រ"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ការហៅ​ទូរសព្ទ និងការជូន​ដំណឹងនឹង​បិទសំឡេង"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"ការផ្លាស់ប្ដូរ​ប្រព័ន្ធ"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"កុំ​រំខាន"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ថ្មី៖ មុខងារ​កុំរំខាន​កំពុងលាក់​ការជូនដំណឹង"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ចុចដើម្បីស្វែងយល់បន្ថែម និងផ្លាស់ប្ដូរ។"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"មុខងារ​កុំ​រំខាន​ត្រូវ​បាន​ប្ដូរ"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"សូមចុច​ដើម្បី​មើល​ថា​​បានទប់ស្កាត់អ្វីខ្លះ។"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"ពិនិត្យមើលការកំណត់ការជូនដំណឹង"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"ចាប់ពី Android 13 ឡើងទៅ កម្មវិធីដែលអ្នកដំឡើងត្រូវការ​ការអនុញ្ញាតរបស់អ្នក ដើម្បីផ្ញើការជូនដំណឹង។ សូមចុចដើម្បីផ្លាស់ប្ដូរការអនុញ្ញាតនេះសម្រាប់កម្មវិធីដែលមានស្រាប់។"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"រំលឹក​ខ្ញុំ​ពេលក្រោយ"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 126d55e..5ddb586 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -197,7 +197,7 @@
     <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ನಿರ್ವಾಹಕರಿಂದ"</string>
     <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ಪ್ರಕಾರ"</string>
     <string name="work_profile_deleted" msgid="5891181538182009328">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ"</string>
-    <string name="work_profile_deleted_details" msgid="3773706828364418016">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ನಿರ್ವಾಹಕ ಅಪ್ಲಿಕೇಶನ್ ಕಳೆದು ಹೋಗಿದೆ ಅಥವಾ ಹಾಳಾಗಿದೆ. ಇದರ ಪರಿಣಾಮವಾಗಿ ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ಮತ್ತು ಅದಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗಿದೆ. ಸಹಾಯಕ್ಕಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
+    <string name="work_profile_deleted_details" msgid="3773706828364418016">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ನಿರ್ವಾಹಕ ಆ್ಯಪ್ ಕಳೆದು ಹೋಗಿದೆ ಅಥವಾ ಹಾಳಾಗಿದೆ. ಇದರ ಪರಿಣಾಮವಾಗಿ ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ಮತ್ತು ಅದಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗಿದೆ. ಸಹಾಯಕ್ಕಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
     <string name="work_profile_deleted_description_dpm_wipe" msgid="2477244968924647232">"ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ಈ ಸಾಧನದಲ್ಲಿ ಈಗ ಲಭ್ಯವಿಲ್ಲ"</string>
     <string name="work_profile_deleted_reason_maximum_password_failure" msgid="1080323158315663167">"ಹಲವಾರು ಪಾಸ್‌ವರ್ಡ್ ಪ್ರಯತ್ನಗಳು"</string>
     <string name="device_ownership_relinquished" msgid="4080886992183195724">"ವೈಯಕ್ತಿಕ ಬಳಕೆಗಾಗಿ ನಿರ್ವಾಹಕರು ತೊರೆದ ಸಾಧನ"</string>
@@ -217,7 +217,7 @@
     <string name="device_policy_manager_service" msgid="5085762851388850332">"ಸಾಧನ ನೀತಿ ನಿರ್ವಾಹಕ ಸೇವೆ"</string>
     <string name="music_recognition_manager_service" msgid="7481956037950276359">"ಸಂಗೀತ ಗುರುತಿಸುವಿಕೆ ನಿರ್ವಾಹಕ ಸೇವೆ"</string>
     <string name="factory_reset_warning" msgid="6858705527798047809">"ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ"</string>
-    <string name="factory_reset_message" msgid="2657049595153992213">"ನಿರ್ವಹಣೆ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಸಾಧನವನ್ನು ಇದೀಗ ಅಳಿಸಲಾಗುತ್ತದೆ.\n\nನಿಮ್ಮಲ್ಲಿ ಪ್ರಶ್ನೆಗಳಿದ್ದರೆ, ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
+    <string name="factory_reset_message" msgid="2657049595153992213">"ನಿರ್ವಹಣೆ ಆ್ಯಪ್ ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಸಾಧನವನ್ನು ಇದೀಗ ಅಳಿಸಲಾಗುತ್ತದೆ.\n\nನಿಮ್ಮಲ್ಲಿ ಪ್ರಶ್ನೆಗಳಿದ್ದರೆ, ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
     <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> ಮೂಲಕ ಪ್ರಿಂಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string>
     <string name="personal_apps_suspension_title" msgid="7561416677884286600">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="personal_apps_suspension_text" msgid="6115455688932935597">"ನಿಮ್ಮ ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವವರೆಗೆ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಆ್ಯಪ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗುತ್ತದೆ"</string>
@@ -366,7 +366,7 @@
     <string name="permlab_statusBar" msgid="8798267849526214017">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ ಇಲ್ಲವೇ ಮಾರ್ಪಡಿಸಿ"</string>
     <string name="permdesc_statusBar" msgid="5809162768651019642">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಅಥವಾ ಸೇರಿಸಲು ಮತ್ತು ಸಿಸ್ಟಂ ಐಕಾನ್‌ಗಳನ್ನು ತೆಗೆದುಹಾಕಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string>
     <string name="permlab_statusBarService" msgid="2523421018081437981">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯಾಗಿರಲು"</string>
-    <string name="permdesc_statusBarService" msgid="6652917399085712557">"ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸ್ಥಿತಿ ಪಟ್ಟಿಯಾಗಿ ಅನುಮತಿಸುತ್ತದೆ."</string>
+    <string name="permdesc_statusBarService" msgid="6652917399085712557">"ಆ್ಯಪ್‌ ಅನ್ನು ಸ್ಥಿತಿ ಪಟ್ಟಿಯಾಗಿ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_expandStatusBar" msgid="1184232794782141698">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ವಿಸ್ತರಿಸಿ/ಸಂಕುಚಿಸಿ"</string>
     <string name="permdesc_expandStatusBar" msgid="7180756900448498536">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ವಿಸ್ತರಿಸಲು ಅಥವಾ ಸಂಕುಚಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_fullScreenIntent" msgid="4310888199502509104">"ಲಾಕ್ ಮಾಡಲಾದ ಸಾಧನದಲ್ಲಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ಪೂರ್ಣ-ಸ್ಕ್ರೀನ್ ಚಟುವಟಿಕೆ ರೀತಿಯಲ್ಲಿ ಡಿಸ್‌ಪ್ಲೇ ಮಾಡಿ"</string>
@@ -378,11 +378,11 @@
     <string name="permlab_processOutgoingCalls" msgid="4075056020714266558">"ಹೊರಹೋಗುವ ಕರೆಗಳ ಮಾರ್ಗ ಬದಲಿಸಿ"</string>
     <string name="permdesc_processOutgoingCalls" msgid="7833149750590606334">"ಬೇರೊಂದು ಸಂಖ್ಯೆಗೆ ಕರೆಯನ್ನು ಮರುನಿರ್ದೇಶಿಸಲು ಆಯ್ಕೆಯ ಜೊತೆಗೆ ಹೊರ ಹೋಗುವ ಕರೆಯ ಸಮಯದಲ್ಲಿ ಡಯಲ್‌ ಮಾಡಿದ ಸಂಖ್ಯೆಯನ್ನು ನೋಡಲು ಅಪ್ಲಿಕೇಶನ್‌‌ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string>
     <string name="permlab_answerPhoneCalls" msgid="4131324833663725855">"ಫೋನ್ ಕರೆಗಳಿಗೆ ಉತ್ತರಿಸಿ"</string>
-    <string name="permdesc_answerPhoneCalls" msgid="894386681983116838">"ಒಳಬರುವ ಫೋನ್ ಕರೆಗೆ ಉತ್ತರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
+    <string name="permdesc_answerPhoneCalls" msgid="894386681983116838">"ಒಳಬರುವ ಫೋನ್ ಕರೆಗೆ ಉತ್ತರಿಸಲು ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_receiveSms" msgid="505961632050451881">"ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿ (SMS)"</string>
-    <string name="permdesc_receiveSms" msgid="1797345626687832285">"SMS ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದರರ್ಥ, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಅಪ್ಲಿಕೇಶನ್ ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡಬಹುದು ಅಥವಾ ಅಳಿಸಬಹುದು."</string>
+    <string name="permdesc_receiveSms" msgid="1797345626687832285">"SMS ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಆ್ಯಪ್‌ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದರರ್ಥ, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಆ್ಯಪ್‌ ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡಬಹುದು ಅಥವಾ ಅಳಿಸಬಹುದು."</string>
     <string name="permlab_receiveMms" msgid="4000650116674380275">"ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿ (MMS)"</string>
-    <string name="permdesc_receiveMms" msgid="958102423732219710">"MMS ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದರರ್ಥ, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಅಪ್ಲಿಕೇಶನ್ ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡಬಹುದು ಅಥವಾ ಅಳಿಸಬಹುದು."</string>
+    <string name="permdesc_receiveMms" msgid="958102423732219710">"MMS ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಆ್ಯಪ್‌ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದರರ್ಥ, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಆ್ಯಪ್‌ ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡಬಹುದು ಅಥವಾ ಅಳಿಸಬಹುದು."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"ಸೆಲ್ ಪ್ರಸಾರ ಸಂದೇಶಗಳನ್ನು ಫಾರ್ವರ್ಡ್ ಮಾಡಿ"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"ಸೆಲ್ ಪ್ರಸಾರವು ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿದ ರೀತಿಯಲ್ಲಿಯೇ ಫಾರ್ವರ್ಡ್ ಮಾಡಲು, ಸೆಲ್ ಪ್ರಸಾರ ಮಾಡ್ಯುಲ್‌ ಅನ್ನು ಪ್ರತಿಬಂಧಿಸಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಕೆಲವು ಸ್ಥಳಗಳಲ್ಲಿ ತುರ್ತು ಸ್ಥಿತಿಗಳ ಕುರಿತು ನಿಮಗೆ ಎಚ್ಚರಿಸಲು ಸೆಲ್ ಪ್ರಸಾರದ ಎಚ್ಚರಿಕೆಗಳನ್ನು ಕಳುಹಿಸಲಾಗುತ್ತದೆ. ತುರ್ತು ಸೆಲ್‌ ಪ್ರಸಾರವನ್ನು ಸ್ವೀಕರಿಸಿದಾಗ ನಿಮ್ಮ ಸಾಧನದ ಕಾರ್ಯಾಚರಣೆ ಅಥವಾ ಕಾರ್ಯಕ್ಷಮತೆಗೆ ದುರುದ್ದೇಶಪೂರಿತ ಆ್ಯಪ್‌ಗಳು ಹಸ್ತಕ್ಷೇಪ ಮಾಡಬಹುದು."</string>
     <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
@@ -396,9 +396,9 @@
     <string name="permlab_sendSms" msgid="7757368721742014252">"SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು"</string>
     <string name="permdesc_sendSms" msgid="6757089798435130769">"SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು ಅನಿರೀಕ್ಷಿತ ವೆಚ್ಚಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳು ನಿಮ್ಮ ದೃಢೀಕರಣವಿಲ್ಲದೆಯೇ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸುವ ಮೂಲಕ ನಿಮ್ಮ ಹಣವನ್ನು ವ್ಯಯಿಸಬಹುದು."</string>
     <string name="permlab_readSms" msgid="5164176626258800297">"ನಿಮ್ಮ ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಓದಿ (SMS ಅಥವಾ MMS)"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="7912990447198112829">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಎಸ್ಎಂಎಸ್ (ಪಠ್ಯ) ಸಂದೇಶಗಳನ್ನು ಓದಬಹುದು."</string>
-    <string name="permdesc_readSms" product="tv" msgid="3054753345758011986">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ SMS (ಪಠ್ಯ) ಸಂದೇಶಗಳನ್ನು ಓದಬಹುದು."</string>
-    <string name="permdesc_readSms" product="default" msgid="774753371111699782">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಎಸ್ಎಂಎಸ್ (ಪಠ್ಯ) ಸಂದೇಶಗಳನ್ನು ಓದಬಹುದು."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="7912990447198112829">"ಈ ಆ್ಯಪ್‌ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಎಸ್ಎಂಎಸ್ (ಪಠ್ಯ) ಸಂದೇಶಗಳನ್ನು ಓದಬಹುದು."</string>
+    <string name="permdesc_readSms" product="tv" msgid="3054753345758011986">"ಈ ಆ್ಯಪ್ ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ SMS (ಪಠ್ಯ) ಸಂದೇಶಗಳನ್ನು ಓದಬಹುದು."</string>
+    <string name="permdesc_readSms" product="default" msgid="774753371111699782">"ಈ ಆ್ಯಪ್‌ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಎಸ್ಎಂಎಸ್ (ಪಠ್ಯ) ಸಂದೇಶಗಳನ್ನು ಓದಬಹುದು."</string>
     <string name="permlab_receiveWapPush" msgid="4223747702856929056">"ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿ (WAP)"</string>
     <string name="permdesc_receiveWapPush" msgid="1638677888301778457">"WAP ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು, ನಿಮಗೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡುವ ಅಥವಾ ಅಳಿಸುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ."</string>
     <string name="permlab_getTasks" msgid="7460048811831750262">"ರನ್‌ ಆಗುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಹಿಂಪಡೆಯಿರಿ"</string>
@@ -406,24 +406,24 @@
     <string name="permlab_manageProfileAndDeviceOwners" msgid="639849495253987493">"ಪ್ರೊಫೈಲ್ ಮತ್ತು ಸಾಧನ ಮಾಲೀಕರನ್ನು ನಿರ್ವಹಿಸಿ"</string>
     <string name="permdesc_manageProfileAndDeviceOwners" msgid="7304240671781989283">"ಪ್ರೊಫೈಲ್ ಮಾಲೀಕರು ಮತ್ತು ಸಾಧನ ಮಾಲೀಕರನ್ನು ಹೊಂದಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_reorderTasks" msgid="7598562301992923804">"ರನ್‌ ಆಗುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಮರುಕ್ರಮಗೊಳಿಸಿ"</string>
-    <string name="permdesc_reorderTasks" msgid="8796089937352344183">"ಮುನ್ನೆಲೆ ಮತ್ತು ಹಿನ್ನಲೆಗೆ ಕಾರ್ಯಗಳನ್ನು ಸರಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ನಿಮ್ಮ ಇನ್‍‍ಪುಟ್ ಇಲ್ಲದೆಯೇ, ಅಪ್ಲಿಕೇಶನ್ ಈ ಕಾರ್ಯವನ್ನು ಮಾಡಬಹುದು."</string>
+    <string name="permdesc_reorderTasks" msgid="8796089937352344183">"ಮುನ್ನೆಲೆ ಮತ್ತು ಹಿನ್ನಲೆಗೆ ಕಾರ್ಯಗಳನ್ನು ಸರಿಸಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ನಿಮ್ಮ ಇನ್‍‍ಪುಟ್ ಇಲ್ಲದೆಯೇ, ಆ್ಯಪ್‌ ಈ ಕಾರ್ಯವನ್ನು ಮಾಡಬಹುದು."</string>
     <string name="permlab_enableCarMode" msgid="893019409519325311">"ಕಾರು ಮೋಡ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="permdesc_enableCarMode" msgid="56419168820473508">"ಕಾರು‌ ಮೋಡ್‌ ಸಕ್ರಿಯಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_killBackgroundProcesses" msgid="6559320515561928348">"ಇತರೆ ಅಪ್ಲಿಕೇಶನ್‍ಗಳನ್ನು ಮುಚ್ಚಿ"</string>
     <string name="permdesc_killBackgroundProcesses" msgid="2357013583055434685">"ಇತರ ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳ ಹಿನ್ನೆಲೆ ಪ್ರಕ್ರಿಯೆಗಳನ್ನು ಅಂತ್ಯಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ಇತರ ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳ ಚಾಲನೆಯನ್ನು ನಿಲ್ಲಿಸುವುದಕ್ಕೆ ಕಾರಣವಾಗಬಹುದು."</string>
-    <string name="permlab_systemAlertWindow" msgid="5757218350944719065">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಮೇಲೆ ಕಾಣಿಸಿಕೊಳ್ಳಬಹುದು"</string>
-    <string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಅಥವಾ ಪರದೆಯ ಇತರೆ ಭಾಗಗಳ ಮೇಲೆ ಕಾಣಿಸಿಕೊಳ್ಳಬಹುದು. ಇದು ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ ಬಳಕೆಯ ಮೂಲಕ ಹಸ್ತಕ್ಷೇಪ ಮಾಡಬಹುದು ಮತ್ತು ಇತರೆ ಅಪ್ಲಿಕೇಶನ್ ಗೋಚರಿಸುವ ರೀತಿಯಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು."</string>
+    <string name="permlab_systemAlertWindow" msgid="5757218350944719065">"ಈ ಆ್ಯಪ್‌ ಇತರ ಆ್ಯಪ್‌ಗಳ ಮೇಲೆ ಕಾಣಿಸಿಕೊಳ್ಳಬಹುದು"</string>
+    <string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"ಈ ಆ್ಯಪ್ ಇತರ ಆ್ಯಪ್‌ಗಳ ಅಥವಾ ಪರದೆಯ ಇತರೆ ಭಾಗಗಳ ಮೇಲೆ ಕಾಣಿಸಿಕೊಳ್ಳಬಹುದು. ಇದು ಸಾಮಾನ್ಯ ಆ್ಯಪ್ ಬಳಕೆಯ ಮೂಲಕ ಹಸ್ತಕ್ಷೇಪ ಮಾಡಬಹುದು ಮತ್ತು ಇತರೆ ಆ್ಯಪ್‌ಗಳು ಗೋಚರಿಸುವ ರೀತಿಯಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು."</string>
     <string name="permlab_hideOverlayWindows" msgid="6382697828482271802">"ಇತರ ಆ್ಯಪ್‌ಗಳ ಓವರ್‌ಲೇಗಳನ್ನು ಮರೆಮಾಡಿ"</string>
     <string name="permdesc_hideOverlayWindows" msgid="5660242821651958225">"ಇತರ ಆ್ಯಪ್‌ಗಳಿಂದ ರಚಿಸಲ್ಪಡುವ ಓವರ್‌ಲೇಗಳು ಈ ಆ್ಯಪ್‌ನಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳದಂತೆ ಮರೆಮಾಡಲು ಸಿಸ್ಟಮ್‌ಗೆ ಈ ಆ್ಯಪ್ ವಿನಂತಿಸಬಹುದು."</string>
     <string name="permlab_runInBackground" msgid="541863968571682785">"ಹಿನ್ನಲೆಯಲ್ಲಿ ರನ್ ಮಾಡಿ"</string>
-    <string name="permdesc_runInBackground" msgid="4344539472115495141">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಹಿನ್ನಲೆಯಲ್ಲಿ ರನ್ ಆಗಬಹುದು. ಇದು ಬ್ಯಾಟರಿಯನ್ನು ವೇಗವಾಗಿ ಬರಿದಾಗಿಸಬಹುದು."</string>
+    <string name="permdesc_runInBackground" msgid="4344539472115495141">"ಈ ಆ್ಯಪ್‌ ಹಿನ್ನಲೆಯಲ್ಲಿ ರನ್ ಆಗಬಹುದು. ಇದು ಬ್ಯಾಟರಿಯನ್ನು ವೇಗವಾಗಿ ಬರಿದಾಗಿಸಬಹುದು."</string>
     <string name="permlab_useDataInBackground" msgid="783415807623038947">"ಹಿನ್ನಲೆಯಲ್ಲಿ ಡೇಟಾ ಬಳಕೆ ಮಾಡಿ"</string>
-    <string name="permdesc_useDataInBackground" msgid="1230753883865891987">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಹಿನ್ನಲೆಯಲ್ಲಿ ಡೇಟಾವನ್ನು ಬಳಸಬಹುದು. ಇದರಿಂದ ಡೇಟಾ ಬಳಕೆ ಹೆಚ್ಚಾಗಬಹುದು."</string>
+    <string name="permdesc_useDataInBackground" msgid="1230753883865891987">"ಈ ಆ್ಯಪ್‌ ಹಿನ್ನಲೆಯಲ್ಲಿ ಡೇಟಾವನ್ನು ಬಳಸಬಹುದು. ಇದರಿಂದ ಡೇಟಾ ಬಳಕೆ ಹೆಚ್ಚಾಗಬಹುದು."</string>
     <string name="permlab_schedule_exact_alarm" msgid="6683283918033029730">"ನಿಖರವಾದ ಸಮಯೋಚಿತ ಕ್ರಿಯೆಗಳನ್ನು ನಿಗದಿಪಡಿಸಿ"</string>
     <string name="permdesc_schedule_exact_alarm" msgid="8198009212013211497">"ಈ ಆ್ಯಪ್, ಭವಿಷ್ಯದಲ್ಲಿ ಕಾರ್ಯವು ಅಪೇಕ್ಷಿತ ಸಮಯಕ್ಕೆ ನಡೆಯುವಂತೆ ಕಾರ್ಯವನ್ನು ನಿಗದಿಪಡಿಸಬಹುದು. ಇದರರ್ಥ ನೀವು ಸಾಧನವನ್ನು ಸಕ್ರಿಯವಾಗಿ ಬಳಸದೇ ಇರುವಾಗ ಆ್ಯಪ್ ರನ್ ಆಗಬಹುದು."</string>
     <string name="permlab_use_exact_alarm" msgid="348045139777131552">"ಅಲಾರಾಂಗಳು ಅಥವಾ ಈವೆಂಟ್ ರಿಮೈಂಡರ್‌ಗಳನ್ನು ನಿಗದಿಪಡಿಸಿ"</string>
     <string name="permdesc_use_exact_alarm" msgid="7033761461886938912">"ಈ ಆ್ಯಪ್ ಭವಿಷ್ಯದಲ್ಲಿ ಅಪೇಕ್ಷಿತ ಸಮಯದಲ್ಲಿ ನಿಮಗೆ ತಿಳಿಸುವುದಕ್ಕಾಗಿ ಅಲಾರಾಂಗಳು ಮತ್ತು ರಿಮೈಂಡರ್‌ಗಳಂತಹ ಕ್ರಿಯೆಗಳನ್ನು ನಿಗದಿಪಡಿಸಬಹುದು."</string>
-    <string name="permlab_persistentActivity" msgid="464970041740567970">"ಅಪ್ಲಿಕೇಶನ್‌‌ ಅನ್ನು ಯಾವಾಗಲೂ ರನ್‌ ಆಗುವಂತೆ ಮಾಡಿ"</string>
+    <string name="permlab_persistentActivity" msgid="464970041740567970">"ಆ್ಯಪ್‌ ಅನ್ನು ಯಾವಾಗಲೂ ರನ್‌ ಆಗುವಂತೆ ಮಾಡಿ"</string>
     <string name="permdesc_persistentActivity" product="tablet" msgid="6055271149187369916">"ಸ್ಮರಣೆಯಲ್ಲಿ ನಿರಂತರವಾಗಿ ತನ್ನದೇ ಭಾಗಗಳನ್ನು ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ಟ್ಯಾಬ್ಲೆಟ್ ಕಾರ್ಯವನ್ನು ನಿಧಾನಗೊಳಿಸುವುದರ ಮೂಲಕ ಇತರ ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳಿಗೆ ಲಭ್ಯವಿರುವ ಸ್ಮರಣೆಯನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ."</string>
     <string name="permdesc_persistentActivity" product="tv" msgid="6800526387664131321">"ಮೆಮೊರಿಯಲ್ಲಿ ತನ್ನ ಭಾಗಗಳನ್ನು ನಿರಂತರವಾಗಿರಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದು ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಲಭ್ಯವಿರುವ ಮೆಮೊರಿಯನ್ನು ಮಿತಿಗೊಳಿಸಿ Android TV ಸಾಧನವನ್ನು ಇದು ನಿಧಾನಗೊಳಿಸಬಹುದು."</string>
     <string name="permdesc_persistentActivity" product="default" msgid="1914841924366562051">"ಸ್ಮರಣೆಯಲ್ಲಿ ನಿರಂತರವಾಗಿ ತನ್ನದೇ ಭಾಗಗಳನ್ನು ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ಫೋನ್ ಕಾರ್ಯವನ್ನು ನಿಧಾನಗೊಳಿಸುವುದರ ಮೂಲಕ ಇತರ ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳಿಗೆ ಲಭ್ಯವಿರುವ ಸ್ಮರಣೆಯನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ."</string>
@@ -457,14 +457,14 @@
     <string name="permdesc_foregroundServiceMediaProcessing" msgid="8303086172106677312">"\"mediaProcessing\" ಪ್ರಕಾರದೊಂದಿಗೆ ಮುನ್ನೆಲೆ ಸೇವೆಗಳನ್ನು ಬಳಸಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string>
     <string name="permlab_foregroundServiceSpecialUse" msgid="7973536745876645082">"\"specialUse\" ಪ್ರಕಾರದೊಂದಿಗೆ ಮುನ್ನೆಲೆ ಸೇವೆಯನ್ನು ರನ್ ಮಾಡಿ"</string>
     <string name="permdesc_foregroundServiceSpecialUse" msgid="646713654541885919">"\"specialUse\" ಪ್ರಕಾರದೊಂದಿಗೆ ಮುನ್ನೆಲೆ ಸೇವೆಗಳನ್ನು ಬಳಸಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string>
-    <string name="permlab_getPackageSize" msgid="375391550792886641">"ಅಪ್ಲಿಕೇಶನ್‌ ಸಂಗ್ರಹ ಸ್ಥಳವನ್ನು ಅಳೆಯಿರಿ"</string>
+    <string name="permlab_getPackageSize" msgid="375391550792886641">"ಆ್ಯಪ್ ಸಂಗ್ರಹ ಸ್ಥಳವನ್ನು ಅಳೆಯಿರಿ"</string>
     <string name="permdesc_getPackageSize" msgid="742743530909966782">"ಅದರ ಕೋಡ್‌‌, ಡೇಟಾ, ಮತ್ತು ಕ್ಯಾಷ್‌ ಗಾತ್ರಗಳನ್ನು ಹಿಂಪಡೆಯಲು ಅಪ್ಲಿಕೇಶನ್‌‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string>
     <string name="permlab_writeSettings" msgid="8057285063719277394">"ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್‍ಗಳನ್ನು ಮಾರ್ಪಡಿಸಿ"</string>
     <string name="permdesc_writeSettings" msgid="8293047411196067188">"ಸಿಸ್ಟಂನ ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಡೇಟಾವನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ನಿಮ್ಮ ಸಿಸ್ಟಂನ ಕಾನ್ಫಿಗಿರೆಶನ್‌ ಅನ್ನು ಹಾನಿ ಮಾಡಬಹುದು."</string>
     <string name="permlab_receiveBootCompleted" msgid="6643339400247325379">"ಪ್ರಾರಂಭದಲ್ಲಿ ರನ್ ಮಾಡಿ"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="5565659082718177484">"ಸಿಸ್ಟಂ ಬೂಟ್ ಮಾಡುವುದನ್ನು ಮುಗಿಸಿದ ನಂತರ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ತಾನಾಗಿಯೇ ಪ್ರಾರಂಭಿಸಲು ಅನುಮತಿಸುತ್ತದೆ. ಈ ಕಾರಣದಿಂದಾಗಿ ಟ್ಯಾಬ್ಲೆಟ್ ಪ್ರಾರಂಭಿಸಲು ಇದಕ್ಕೆ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಯಾವಾಗಲೂ ರನ್ ಆಗುವ ಮೂಲಕ ಒಟ್ಟು ಮೊತ್ತ ಟ್ಯಾಬ್ಲೆಟ್‌ನ ವೇಗವನ್ನು ಕಡಿಮೆ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ."</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="5565659082718177484">"ಸಿಸ್ಟಂ ಬೂಟ್ ಮಾಡುವುದನ್ನು ಮುಗಿಸಿದ ನಂತರ ಆ್ಯಪ್‌ ಅನ್ನು ತಾನಾಗಿಯೇ ಪ್ರಾರಂಭಿಸಲು ಅನುಮತಿಸುತ್ತದೆ. ಈ ಕಾರಣದಿಂದಾಗಿ ಟ್ಯಾಬ್ಲೆಟ್ ಪ್ರಾರಂಭಿಸಲು ಇದಕ್ಕೆ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಯಾವಾಗಲೂ ರನ್ ಆಗುವ ಮೂಲಕ ಒಟ್ಟು ಮೊತ್ತ ಟ್ಯಾಬ್ಲೆಟ್‌ನ ವೇಗವನ್ನು ಕಡಿಮೆ ಮಾಡಲು ಆ್ಯಪ್‌ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permdesc_receiveBootCompleted" product="tv" msgid="4900842256047614307">"ಸಿಸ್ಟಂ ಬೂಟ್ ಮಾಡುವುದನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ ತಕ್ಷಣ ಸ್ವತಃ ಪ್ರಾರಂಭವಾಗಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದು Android TV ಸಾಧನವನ್ನು ಪ್ರಾರಂಭಿಸಲು ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುವಂತೆ ಮಾಡಬಹುದು ಮತ್ತು ಯಾವಾಗಲೂ ರನ್ ಆಗುವ ಮೂಲಕ ಒಟ್ಟಾರೆ ಸಾಧನವನ್ನು ನಿಧಾನಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
-    <string name="permdesc_receiveBootCompleted" product="default" msgid="7912677044558690092">"ಸಿಸ್ಟಂ ಬೂಟ್ ಮಾಡುವುದನ್ನು ಮುಗಿಸಿದ ನಂತರ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ತಾನಾಗಿಯೇ ಪ್ರಾರಂಭಿಸಲು ಅನುಮತಿಸುತ್ತದೆ. ಈ ಕಾರಣದಿಂದಾಗಿ ಫೋನ್‌ ಪ್ರಾರಂಭಿಸಲು ಇದಕ್ಕೆ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಯಾವಾಗಲೂ ರನ್ ಆಗುವ ಮೂಲಕ ಒಟ್ಟು ಮೊತ್ತ ಫೋನ್‌ನ ವೇಗವನ್ನು ಕಡಿಮೆ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ."</string>
+    <string name="permdesc_receiveBootCompleted" product="default" msgid="7912677044558690092">"ಸಿಸ್ಟಂ ಬೂಟ್ ಮಾಡುವುದನ್ನು ಮುಗಿಸಿದ ನಂತರ ಆ್ಯಪ್‌ ಅನ್ನು ತಾನಾಗಿಯೇ ಪ್ರಾರಂಭಿಸಲು ಅನುಮತಿಸುತ್ತದೆ. ಈ ಕಾರಣದಿಂದಾಗಿ ಫೋನ್‌ ಪ್ರಾರಂಭಿಸಲು ಇದಕ್ಕೆ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಯಾವಾಗಲೂ ರನ್ ಆಗುವ ಮೂಲಕ ಒಟ್ಟು ಮೊತ್ತ ಫೋನ್‌ನ ವೇಗವನ್ನು ಕಡಿಮೆ ಮಾಡಲು ಆ್ಯಪ್‌ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_broadcastSticky" msgid="4552241916400572230">"ಸ್ಟಿಕಿ ಪ್ರಸಾರವನ್ನು ಕಳುಹಿಸಿ"</string>
     <string name="permdesc_broadcastSticky" product="tablet" msgid="5058486069846384013">"ಪ್ರಸಾರ ಕೊನೆಗೊಂಡ ನಂತರ ಹಾಗೆಯೇ ಉಳಿಯುವ ಸ್ಟಿಕಿ ಪ್ರಸಾರಗಳನ್ನು ಕಳುಹಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಮಿತಿಮೀರಿದ ಬಳಕೆಯು ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ನಿಧಾನಗೊಳಿಸಬಹುದು ಅಥವಾ ಅತಿಯಾದ ಮೆಮೊರಿ ಬಳಕೆಯು ಅಸ್ಥಿರತೆಯನ್ನು ಉಂಟುಮಾಡಬಹುದು."</string>
     <string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"ಪ್ರಸಾರವು ಮುಕ್ತಾಯಗೊಂಡ ನಂತರ ಉಳಿದಿರುವ ಜಿಗುಟಾದ ಪ್ರಸಾರಗಳನ್ನು ಕಳುಹಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದರ ಹೆಚ್ಚಿನ ಬಳಕೆಯು Android TV ಸಾಧನವನ್ನು ನಿಧಾನಗೊಳಿಸುತ್ತದೆ ಅಥವಾ ಅತಿಯಾಗಿ ಮೆಮೊರಿಯನ್ನು ಬಳಸುವಂತೆ ಮಾಡುವ ಮೂಲಕ ಅಸ್ಥಿರಗೊಳಿಸುತ್ತದೆ."</string>
@@ -478,7 +478,7 @@
     <string name="permdesc_writeContacts" product="tv" msgid="6488872735379978935">"ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿರುವ ನಿಮ್ಮ ಸಂಪರ್ಕಗಳ ಕುರಿತಾದ ಡೇಟಾವನ್ನು ಮಾರ್ಪಡಿಸಲು ಆ್ಯಪ್‌ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು ಸಂಪರ್ಕ ಡೇಟಾವನ್ನು ಅಳಿಸಲು ಆ್ಯಪ್‌ಗಳಿಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permdesc_writeContacts" product="default" msgid="8304795696237065281">"ನಿಮ್ಮ ಫೋನ್‍ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿರುವ ನಿಮ್ಮ ಸಂಪರ್ಕಗಳ ಕುರಿತಾದ ಡೇಟಾವನ್ನು ಮಾರ್ಪಡಿಸಲು ಆ್ಯಪ್‌ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು ಸಂಪರ್ಕ ಡೇಟಾವನ್ನು ಅಳಿಸಲು ಆ್ಯಪ್‌ಗಳಿಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_readCallLog" msgid="1739990210293505948">"ಕರೆಯ ಲಾಗ್‌ ಓದಿ"</string>
-    <string name="permdesc_readCallLog" msgid="8964770895425873433">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಕರೆಯ ಇತಿಹಾಸ ಓದಬಹುದು."</string>
+    <string name="permdesc_readCallLog" msgid="8964770895425873433">"ಈ ಆ್ಯಪ್‌ ನಿಮ್ಮ ಕರೆಯ ಇತಿಹಾಸ ಓದಬಹುದು."</string>
     <string name="permlab_writeCallLog" msgid="670292975137658895">"ಕರೆ ಲಾಗ್ ಬರೆಯಿರಿ"</string>
     <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"ಒಳಬರುವ ಮತ್ತು ಹೊರಹೋಗುವ ಕರೆಗಳ ಕುರಿತ ಡೇಟಾ ಸೇರಿದಂತೆ, ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ನ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳು ನಿಮ್ಮ ಕರೆಯ ಲಾಗ್‍ ಅನ್ನು ಅಳಿಸಲು ಅಥವಾ ಮಾರ್ಪಡಿಸಲು ಇದನ್ನು ಬಳಸಿಕೊಳ್ಳಬಹುದು."</string>
     <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ಒಳಬರುವ ಮತ್ತು ಹೊರಹೋಗುವ ಕರೆಗಳ ಕುರಿತ ಡೇಟಾ ಸೇರಿದಂತೆ ನಿಮ್ಮ Android TV ಸಾಧನದ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳು ನಿಮ್ಮ ಕರೆಯ ಲಾಗ್‍ ಅನ್ನು ಅಳಿಸಲು ಅಥವಾ ಮಾರ್ಪಡಿಸಲು ಇದನ್ನು ಬಳಸಿಕೊಳ್ಳಬಹುದು."</string>
@@ -488,13 +488,13 @@
     <string name="permlab_bodySensors_background" msgid="4912560779957760446">"ಹಿನ್ನಲೆಯಲ್ಲಿರುವಾಗ ಹೃದಯ ಬಡಿತದಂತಹ ದೇಹದ ಸೆನ್ಸರ್‌ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
     <string name="permdesc_bodySensors_background" product="default" msgid="8870726027557749417">"ಆ್ಯಪ್ ಹಿನ್ನಲೆಯಲ್ಲಿರುವಾಗ ಹೃದಯ ಬಡಿತ, ತಾಪಮಾನ ಮತ್ತು ರಕ್ತದ ಆಮ್ಲಜನಕದ ಶೇಕಡಾವಾರು ಎಂಬಂತಹ ದೇಹದ ಸೆನ್ಸರ್‌ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_readCalendar" msgid="6408654259475396200">"ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳು ಮತ್ತು ವಿವರಗಳನ್ನು ಓದಿ"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string>
-    <string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string>
-    <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ಈ ಆ್ಯಪ್‌ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string>
+    <string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ಈ ಆ್ಯಪ್‌ ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string>
+    <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"ಈ ಆ್ಯಪ್‌ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string>
     <string name="permlab_writeCalendar" msgid="6422137308329578076">"ಮಾಲೀಕರ ಗಮನಕ್ಕೆ ತರದೆಯೇ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಸೇರಿಸಿ ಅಥವಾ ಮಾರ್ಪಡಿಸಿ ಮತ್ತು ಅತಿಥಿಗಳಿಗೆ ಇಮೇಲ್ ಕಳುಹಿಸಿ"</string>
-    <string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ನಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಲೆಂಡರ್‌ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು."</string>
-    <string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಲೆಂಡರ್‌ನ ಮಾಲೀಕರಿಂದ ಬರುವಂತೆ ಕಾಣುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅದರ ಮಾಲೀಕರಿಗೆ ನೋಟಿಫಿಕೇಶನ್ ನೀಡದೆ ಈವೆಂಟ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಬಹುದು."</string>
-    <string name="permdesc_writeCalendar" product="default" msgid="5416380074475634233">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಲೆಂಡರ್‌ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು."</string>
+    <string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"ಈ ಆ್ಯಪ್‌ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ನಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಆ್ಯಪ್‌ ಕ್ಯಾಲೆಂಡರ್‌ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು."</string>
+    <string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"ಈ ಆ್ಯಪ್‌ ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಆ್ಯಪ್‌ ಕ್ಯಾಲೆಂಡರ್‌ನ ಮಾಲೀಕರಿಂದ ಬರುವಂತೆ ಕಾಣುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅದರ ಮಾಲೀಕರಿಗೆ ನೋಟಿಫಿಕೇಶನ್ ನೀಡದೆ ಈವೆಂಟ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಬಹುದು."</string>
+    <string name="permdesc_writeCalendar" product="default" msgid="5416380074475634233">"ಈ ಆ್ಯಪ್‌ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಆ್ಯಪ್‌ ಕ್ಯಾಲೆಂಡರ್‌ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="5162339812057983988">"ಹೆಚ್ಚುವರಿ ಸ್ಥಳ ಪೂರೈಕೆದಾರರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
     <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"ಹೆಚ್ಚಿನ ಸ್ಥಳ ಪೂರೈಕೆದಾರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು GPS ಅಥವಾ ಇತರ ಸ್ಥಳ ಮೂಲಗಳ ಕಾರ್ಯಾಚರಣೆಯಲ್ಲಿ ಮಧ್ಯ ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅನುಮತಿಸಬಹುದು."</string>
     <string name="permlab_accessFineLocation" msgid="6426318438195622966">"ಮುನ್ನೆಲೆಯಲ್ಲಿ ಮಾತ್ರ ನಿಖರವಾದ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
@@ -531,7 +531,7 @@
     <string name="permlab_callPhone" msgid="1798582257194643320">"ಫೋನ್ ಸಂಖ್ಯೆಗಳಿಗೆ ನೇರವಾಗಿ ಕರೆ ಮಾಡಿ"</string>
     <string name="permdesc_callPhone" msgid="7892422187827695656">"ನಿಮ್ಮ ಹಸ್ತಕ್ಷೇಪವಿಲ್ಲದೆಯೇ ಫೋನ್ ಸಂಖ್ಯೆಗಳಿಗೆ ಕರೆ ಮಾಡಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದು ಅನಿರೀಕ್ಷಿತ ಶುಲ್ಕಗಳು ಅಥವಾ ಕರೆಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು. ತುರ್ತು ಸಂಖ್ಯೆಗಳಿಗೆ ಕರೆ ಮಾಡಲು ಇದು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುವುದಿಲ್ಲ ಎಂಬುದನ್ನು ಗಮನಿಸಿ. ದುರುದ್ದೇಶಪ್ರೇರಿತ ಆ್ಯಪ್‌ಗಳು ನಿಮ್ಮ ದೃಢೀಕರಣವಿಲ್ಲದೆಯೇ ಕರೆಗಳನ್ನು ಮಾಡುವ ಮೂಲಕ ಅಥವಾ ಒಳಬರುವ ಕರೆಗಳನ್ನು ಮತ್ತೊಂದು ಸಂಖ್ಯೆಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಫಾರ್ವರ್ಡ್ ಮಾಡಲು ಕಾರಣವಾಗುವ ವಾಹಕದ ಕೋಡ್‌ಗಳನ್ನು ಡಯಲ್ ಮಾಡುವ ಮೂಲಕ ನಿಮ್ಮ ಹಣ ವೆಚ್ಚವಾಗುವಂತೆ ಮಾಡಬಹುದು."</string>
     <string name="permlab_accessImsCallService" msgid="442192920714863782">"IMS ಕರೆ ಸೇವೆಯನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
-    <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"ನಿಮ್ಮ ಮಧ್ಯಸ್ಥಿಕೆ ಇಲ್ಲದೆಯೇ ಕರೆಗಳನ್ನು ಮಾಡಲು IMS ಸೇವೆಯನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
+    <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"ನಿಮ್ಮ ಮಧ್ಯಸ್ಥಿಕೆ ಇಲ್ಲದೆಯೇ ಕರೆಗಳನ್ನು ಮಾಡಲು IMS ಸೇವೆಯನ್ನು ಬಳಸಲು ಆ್ಯಪ್‌ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_readPhoneState" msgid="8138526903259297969">"ಫೋನ್ ಸ್ಥಿತಿ ಮತ್ತು ಗುರುತಿಸುವಿಕೆಯನ್ನು ಓದಿ"</string>
     <string name="permdesc_readPhoneState" msgid="7229063553502788058">"ಸಾಧನದ ಫೋನ್ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು ಫೋನ್ ಸಂಖ್ಯೆ ಮತ್ತು ಸಾಧನದ ID ಗಳನ್ನು ನಿರ್ಧರಿಸಲು, ಕರೆಯು ಸಕ್ರಿಯವಾಗಿದೆಯೇ ಮತ್ತು ಕರೆಯ ಮೂಲಕ ರಿಮೋಟ್ ಸಂಖ್ಯೆಯು ಸಂಪರ್ಕಗೊಂಡಿವೆಯೇ ಎಂಬುದನ್ನೂ ನಿರ್ಧರಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅವಕಾಶ ಕಲ್ಪಿಸುತ್ತದೆ."</string>
     <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ಮೂಲ ಟೆಲಿಫೋನ್ ಸ್ಥಿತಿ ಮತ್ತು ಗುರುತನ್ನು ಓದಿ"</string>
@@ -542,7 +542,7 @@
     <string name="permdesc_callCompanionApp" msgid="8474168926184156261">"ಸಾಧನದಲ್ಲಿನ ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಮತ್ತು ನಿಯಂತ್ರಿಸಲು ಆ್ಯಪ್ ಅನುಮತಿಸುತ್ತದೆ. ಕರೆಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ಕರೆ ಸಂಖ್ಯೆಗಳು ಮತ್ತು ಕರೆ ಮಾಡಿದ ರಾಜ್ಯದಂತಹ ಮಾಹಿತಿಯನ್ನು ಇದು ಒಳಗೊಂಡಿರುತ್ತದೆ."</string>
     <string name="permlab_exemptFromAudioRecordRestrictions" msgid="1164725468350759486">"ಆಡಿಯೋ ರೆಕಾರ್ಡ್ ಮಾಡುವ ನಿರ್ಬಂಧಗಳಿಂದ ವಿನಾಯಿತಿ ನೀಡಿ"</string>
     <string name="permdesc_exemptFromAudioRecordRestrictions" msgid="2425117015896871976">"ಆಡಿಯೋ ರೆಕಾರ್ಡ್ ಮಾಡುವ ನಿರ್ಬಂಧದಿಂದ ಈ ಆ್ಯಪ್‌ಗೆ ವಿನಾಯಿತಿ ನೀಡಿ."</string>
-    <string name="permlab_acceptHandover" msgid="2925523073573116523">"ಮತ್ತೊಂದು ಅಪ್ಲಿಕೇಶನ್‌ ಮೂಲಕ ಕರೆಯನ್ನು ಮುಂದುವರಿಸಿ"</string>
+    <string name="permlab_acceptHandover" msgid="2925523073573116523">"ಮತ್ತೊಂದು ಆ್ಯಪ್ ಮೂಲಕ ಕರೆಯನ್ನು ಮುಂದುವರಿಸಿ"</string>
     <string name="permdesc_acceptHandovers" msgid="7129026180128626870">"ಮತ್ತೊಂದು ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ ಪ್ರಾರಂಭವಾದ ಕರೆಯನ್ನು ಮುಂದುವರಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡಿ."</string>
     <string name="permlab_readPhoneNumbers" msgid="5668704794723365628">"ಫೋನ್‌ ಸಂಖ್ಯೆಗಳನ್ನು ಓದಿ"</string>
     <string name="permdesc_readPhoneNumbers" msgid="7368652482818338871">"ಸಾಧನದ ಫೋನ್ ಸಂಖ್ಯೆಗಳಿಗೆ ಆ್ಯಕ್ಸೆಸ್ ಪಡೆಯಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿ ನೀಡುತ್ತದೆ."</string>
@@ -569,15 +569,15 @@
     <string name="permdesc_setTimeZone" product="tv" msgid="9069045914174455938">"ನಿಮ್ಮ Android TV ಸಾಧನದ ಸಮಯವಲಯವನ್ನು ಬದಲಾಯಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permdesc_setTimeZone" product="default" msgid="4611828585759488256">"ಫೋನ್‌ನ ಸಮಯ ವಲಯವನ್ನು ಬದಲಾಯಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_getAccounts" msgid="5304317160463582791">"ಸಾಧನದಲ್ಲಿ ಖಾತೆಗಳನ್ನು ಹುಡುಕಿ"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="1784452755887604512">"ಟ್ಯಾಬ್ಲೆಟ್ ಮೂಲಕ ತಿಳಿದಿರುವ ಖಾತೆಗಳ ಪಟ್ಟಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ನೀವು ಸ್ಥಾಪಿಸಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ರಚಿಸಲಾದ ಯಾವುದೇ ಖಾತೆಯನ್ನು ಒಳಗೊಂಡಿರಬಹುದು."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="1784452755887604512">"ಟ್ಯಾಬ್ಲೆಟ್ ಮೂಲಕ ತಿಳಿದಿರುವ ಖಾತೆಗಳ ಪಟ್ಟಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಆ್ಯಪ್‌ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ನೀವು ಸ್ಥಾಪಿಸಿರುವ ಆ್ಯಪ್‌ ಮೂಲಕ ರಚಿಸಲಾದ ಯಾವುದೇ ಖಾತೆಯನ್ನು ಒಳಗೊಂಡಿರಬಹುದು."</string>
     <string name="permdesc_getAccounts" product="tv" msgid="437604680436540822">"ನಿಮ್ಮ Android TV ಸಾಧನವು ತಿಳಿದಿರುವ ಖಾತೆಗಳ ಪಟ್ಟಿಯನ್ನು ಪಡೆಯಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ನೀವು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿದ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಂದ ರಚಿಸಲಾದ ಯಾವುದೇ ಖಾತೆಗಳನ್ನು ಇದು ಒಳಗೊಂಡಿರಬಹುದು."</string>
-    <string name="permdesc_getAccounts" product="default" msgid="2491273043569751867">"ಫೋನ್‌ನ ಮೂಲಕ ತಿಳಿದಿರುವ ಖಾತೆಗಳ ಪಟ್ಟಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ನೀವು ಸ್ಥಾಪಿಸಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ರಚಿಸಲಾದ ಯಾವುದೇ ಖಾತೆಯನ್ನು ಒಳಗೊಂಡಿರಬಹುದು."</string>
+    <string name="permdesc_getAccounts" product="default" msgid="2491273043569751867">"ಫೋನ್‌ನ ಮೂಲಕ ತಿಳಿದಿರುವ ಖಾತೆಗಳ ಪಟ್ಟಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಆ್ಯಪ್‌ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ನೀವು ಸ್ಥಾಪಿಸಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ರಚಿಸಲಾದ ಯಾವುದೇ ಖಾತೆಯನ್ನು ಒಳಗೊಂಡಿರಬಹುದು."</string>
     <string name="permlab_accessNetworkState" msgid="2349126720783633918">"ನೆಟ್‍ವರ್ಕ್ ಸಂಪರ್ಕಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
     <string name="permdesc_accessNetworkState" msgid="4394564702881662849">"ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಮತ್ತು ಸಂಪರ್ಕಗೊಂಡಿರುವ ಸಂಪರ್ಕಗಳಂತಹ ನೆಟ್‍‍ವರ್ಕ್ ಸಂಪರ್ಕಗಳ ಕುರಿತ ಮಾಹಿತಿಯನ್ನು ವೀಕ್ಷಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_createNetworkSockets" msgid="3224420491603590541">"ಪೂರ್ಣ ನೆಟ್‌ವರ್ಕ್ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರಿ"</string>
     <string name="permdesc_createNetworkSockets" msgid="7722020828749535988">"ನೆಟ್‍‍ವರ್ಕ್ ಸಾಕೆಟ್‍‍ಗಳನ್ನು ರಚಿಸಲು ಮತ್ತು ಕಸ್ಟಮ್ ನೆಟ್‍‍ವರ್ಕ್ ಪ್ರೊಟೋಕಾಲ್‍‍ಗಳನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಬ್ರೌಸರ್ ಮತ್ತು ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಇಂಟರ್ನೆಟ್‌ಗೆ ಡೇಟಾ ಕಳುಹಿಸಲು ಮಾರ್ಗವನ್ನುಂಟು ಮಾಡುತ್ತದೆ ಹಾಗಾಗಿ ಇಂಟರ್ನೆಟ್‌ಗೆ ಡೇಟಾ ಕಳುಹಿಸಲು ಈ ಅನುಮತಿ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
     <string name="permlab_changeNetworkState" msgid="8945711637530425586">"ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕತೆಯನ್ನು ಬದಲಾಯಿಸಿ"</string>
-    <string name="permdesc_changeNetworkState" msgid="649341947816898736">"ನೆಟ್‌ವರ್ಕ್‌ ಸಂಪರ್ಕದ ಸ್ಥಿತಿಯನ್ನು ಬದಲಾಯಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ ಅನುಮತಿಸುತ್ತದೆ."</string>
+    <string name="permdesc_changeNetworkState" msgid="649341947816898736">"ನೆಟ್‌ವರ್ಕ್‌ ಸಂಪರ್ಕದ ಸ್ಥಿತಿಯನ್ನು ಬದಲಾಯಿಸಲು ಆ್ಯಪ್‌ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_changeTetherState" msgid="9079611809931863861">"ಟೆಥರಡ್ ಸಂಪರ್ಕತೆಯನ್ನು ಬದಲಾಯಿಸಿ"</string>
     <string name="permdesc_changeTetherState" msgid="3025129606422533085">"ಟೆಥರ್‌ ಮಾಡಲಾದ ನೆಟ್‌ವರ್ಕ್‌ ಸಂಪರ್ಕದ ಸ್ಥಿತಿಯನ್ನು ಬದಲಾಯಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_accessWifiState" msgid="5552488500317911052">"ವೈ-ಫೈ ಸಂಪರ್ಕಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
@@ -589,15 +589,15 @@
     <string name="permdesc_changeWifiMulticastState" product="tv" msgid="1336952358450652595">"ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ನಿಮ್ಮ Android TV ಮಾತ್ರವಲ್ಲದೆ, ಮಲ್ಟಿಕ್ಯಾಸ್ಟ್ ವಿಳಾಸಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಎಲ್ಲಾ ಸಾಧನಗಳಿಗೆ ಕಳುಹಿಸಲಾದ ಪ್ಯಾಕೆಟ್‌ಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದು ಮಲ್ಟಿಕ್ಯಾಸ್ಟ್ ಅಲ್ಲದ ಮೋಡ್‌ಗಿಂತಲೂ ಹೆಚ್ಚು ಪವರ್ ಬಳಸುತ್ತದೆ."</string>
     <string name="permdesc_changeWifiMulticastState" product="default" msgid="8296627590220222740">"ನಿಮ್ಮ ಫೋನ್ ಮಾತ್ರವಲ್ಲದೇ, ಮಲ್ಟಿಕಾಸ್ಟ್ ವಿಳಾಸಗಳನ್ನು ಬಳಸಿಕೊಂಡು ವೈ-ಫೈ ನೆಟ್‍‍ವರ್ಕ್‌ನಲ್ಲಿ ಎಲ್ಲಾ ಸಾಧನಗಳಿಗೆ ಕಳುಹಿಸಲಾಗಿರುವ ಪ್ಯಾಕೆಟ್‍‍ಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು ಮಲ್ಟಿಕ್ಯಾಸ್ಟ್ ಅಲ್ಲದ ಮೋಡ್ ಬಳಸುವ ಶಕ್ತಿಗಿಂತಲೂ ಹೆಚ್ಚಿನ ಶಕ್ತಿಯನ್ನು ಬಳಸುತ್ತದೆ."</string>
     <string name="permlab_bluetoothAdmin" msgid="6490373569441946064">"ಬ್ಲೂಟೂತ್‌ ಸೆಟ್ಟಿಂಗ್‍ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="5370837055438574863">"ಸ್ಥಳೀಯ ಬ್ಲೂಟೂತ್‌‌ ಟ್ಯಾಬ್ಲೆಟ್‌‌ ಕಾನ್ಫಿಗರ್‌ ಮಾಡಲು ಮತ್ತು ಅನ್ವೇಷಿಸಲು ಹಾಗೂ ರಿಮೊಟ್‌ ಸಾಧನಗಳ ಜೊತೆಗೆ ಜೋಡಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್‌ ಅನುಮತಿಸುತ್ತದೆ."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="5370837055438574863">"ಸ್ಥಳೀಯ ಬ್ಲೂಟೂತ್‌‌ ಟ್ಯಾಬ್ಲೆಟ್‌‌ ಕಾನ್ಫಿಗರ್‌ ಮಾಡಲು ಮತ್ತು ಅನ್ವೇಷಿಸಲು ಹಾಗೂ ರಿಮೊಟ್‌ ಸಾಧನಗಳ ಜೊತೆಗೆ ಜೋಡಿ ಮಾಡಲು ಆ್ಯಪ್‌ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permdesc_bluetoothAdmin" product="tv" msgid="1623992984547014588">"ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಬ್ಲೂಟೂತ್ ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಮತ್ತು ರಿಮೋಟ್ ಸಾಧನಗಳನ್ನು ಕಂಡುಹಿಡಿಯಲು ಮತ್ತು ಅವುಗಳೊಂದಿಗೆ ಜೋಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7381341743021234863">"ಸ್ಥಳೀಯ ಬ್ಲೂಟೂತ್‌‌ ಫೋನ್‌ ಕಾನ್ಫಿಗರ್‌ ಮಾಡಲು ಮತ್ತು ಅನ್ವೇಷಿಸಲು ಹಾಗೂ ರಿಮೊಟ್‌ ಸಾಧನಗಳ ಜೊತೆಗೆ ಜೋಡಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
     <string name="permlab_accessWimaxState" msgid="7029563339012437434">"WiMAX ನಿಂದ ಸಂಪರ್ಕಗೊಳಿಸಿ ಮತ್ತು ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಿ"</string>
     <string name="permdesc_accessWimaxState" msgid="5372734776802067708">"WiMAX ಸಕ್ರಿಯಗೊಂಡಿದೆಯೇ ಮತ್ತು ಸಂಪರ್ಕಗೊಂಡಿರುವಂತಹ WiMAX ನೆಟ್‍‍ವರ್ಕ್‌ಗಳ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ನಿರ್ಧರಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string>
     <string name="permlab_changeWimaxState" msgid="6223305780806267462">"WiMAX ಸ್ಥಿತಿಯನ್ನು ಬದಲಿಸಿ"</string>
-    <string name="permdesc_changeWimaxState" product="tablet" msgid="4011097664859480108">"ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಟ್ಯಾಬ್ಲೆಟ್‌ಗೆ ಸಂಪರ್ಕಪಡಿಸಲು ಮತ್ತು WiMAX ನೆಟ್‍‍ವರ್ಕ್‌ಗಳಿಂದ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲು ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
+    <string name="permdesc_changeWimaxState" product="tablet" msgid="4011097664859480108">"ಆ್ಯಪ್ ಅನ್ನು ಟ್ಯಾಬ್ಲೆಟ್‌ಗೆ ಸಂಪರ್ಕಪಡಿಸಲು ಮತ್ತು WiMAX ನೆಟ್‍‍ವರ್ಕ್‌ಗಳಿಂದ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲು ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
     <string name="permdesc_changeWimaxState" product="tv" msgid="5373274458799425276">"WiMAX ನೆಟ್‌ವರ್ಕ್‌ಗಳಿಗೆ ನಿಮ್ಮ Android TV ಸಾಧನವನ್ನು ಸಂಪರ್ಕಿಸಲು ಮತ್ತು ನಿಮ್ಮ Android TV ಸಾಧನವನ್ನು WiMAX ನೆಟ್‌ವರ್ಕ್‌ಗಳಿಂದ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
-    <string name="permdesc_changeWimaxState" product="default" msgid="1551666203780202101">"ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಫೋನ್‌ಗೆ ಸಂಪರ್ಕಪಡಿಸಲು ಮತ್ತು WiMAX ನೆಟ್‍‍ವರ್ಕ್‌ಗಳಿಂದ ಫೋನ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲು ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
+    <string name="permdesc_changeWimaxState" product="default" msgid="1551666203780202101">"ಆ್ಯಪ್‌ ಅನ್ನು ಫೋನ್‌ಗೆ ಸಂಪರ್ಕಪಡಿಸಲು ಮತ್ತು WiMAX ನೆಟ್‍‍ವರ್ಕ್‌ಗಳಿಂದ ಫೋನ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲು ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
     <string name="permlab_bluetooth" msgid="586333280736937209">"ಬ್ಲೂಟೂತ್‌ ಸಾಧನಗಳೊಂದಿಗೆ ಜೋಡಿಸಿ"</string>
     <string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"ಟ್ಯಾಬ್ಲೆಟ್‍‍ನಲ್ಲಿ ಬ್ಲೂಟೂತ್‌‌ನ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ವೀಕ್ಷಿಸಲು ಮತ್ತು ಜೋಡಿ ಮಾಡಿರುವ ಸಾಧನಗಳೊಂದಿಗೆ ಸಂಪರ್ಕಗಳನ್ನು ಕಲ್ಪಿಸಲು ಹಾಗೂ ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string>
     <string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಬ್ಲೂಟೂತ್‌ನ ಕಾನ್ಫಿಗರೇಶನ್ ವೀಕ್ಷಿಸಲು ಮತ್ತು ಜೋಡಿಸಿರುವ ಸಾಧನಗಳೊಂದಿಗೆ ಸಂಪರ್ಕಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
@@ -613,9 +613,9 @@
     <string name="permlab_nearby_wifi_devices" msgid="392774237063608500">"ಹತ್ತಿರದ ವೈ -ಫೈ ಸಾಧನಗಳ ಜೊತೆಗೆ ಸಂವಹನ ನಡೆಸಿ"</string>
     <string name="permdesc_nearby_wifi_devices" msgid="3054307728646332906">"ಹತ್ತಿರದ ವೈ -ಫೈ ಸಾಧನಗಳ ಸಂಬಂಧಿತ ಸ್ಥಾನವನ್ನು ಸೂಚಿಸಲು, ಕನೆಕ್ಟ್ ಮಾಡಲು ಮತ್ತು ನಿರ್ಧರಿಸಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string>
     <string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ಆದ್ಯತೆಯ NFC ಪಾವತಿ ಸೇವಾ ಮಾಹಿತಿ"</string>
-    <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ನೋಂದಾಯಿತ ಅಪ್ಲಿಕೇಶನ್ ಗುರುತಿಸುವಿಕೆಗಳು ಮತ್ತು ಮಾರ್ಗ ಗಮ್ಯಸ್ಥಾನಗಳಂತಹ ಆದ್ಯತೆಯ NFC ಪಾವತಿ ಸೇವೆಗಳ ಬಗ್ಗೆ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+    <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ನೋಂದಾಯಿತ ಆ್ಯಪ್ ಗುರುತಿಸುವಿಕೆಗಳು ಮತ್ತು ಮಾರ್ಗ ಗಮ್ಯಸ್ಥಾನಗಳಂತಹ ಆದ್ಯತೆಯ NFC ಪಾವತಿ ಸೇವೆಗಳ ಬಗ್ಗೆ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_nfc" msgid="1904455246837674977">"ಸಮೀಪ ಕ್ಷೇತ್ರ ಸಂವಹನವನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
-    <string name="permdesc_nfc" msgid="8352737680695296741">"ಸಮೀಪದ ಕ್ಷೇತ್ರ ಸಂವಹನ (NFC) ಟ್ಯಾಗ್‌ಗಳು, ಕಾರ್ಡ್‌ಗಳು, ಮತ್ತು ಓದುಗರನ್ನು ಅಪ್ಲಿಕೇಶನ್‌ ಅನುಮತಿಸುತ್ತದೆ."</string>
+    <string name="permdesc_nfc" msgid="8352737680695296741">"ಸಮೀಪದ ಕ್ಷೇತ್ರ ಸಂವಹನ (NFC) ಟ್ಯಾಗ್‌ಗಳು, ಕಾರ್ಡ್‌ಗಳು, ಮತ್ತು ಓದುಗರನ್ನು ಆ್ಯಪ್‌ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"ಸುರಕ್ಷಿತ ಅಂಶದ ವಹಿವಾಟು ಈವೆಂಟ್"</string>
     <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"ಸುರಕ್ಷಿತ ಅಂಶದಲ್ಲಿ ನಡೆಯುತ್ತಿರುವ ವಹಿವಾಟುಗಳ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಸ್ವೀಕರಿಸಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_disableKeyguard" msgid="3605253559020928505">"ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
@@ -757,7 +757,7 @@
     <string name="face_error_vendor_unknown" msgid="7387005932083302070">"ಏನೋ ತಪ್ಪಾಗಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string>
     <string name="face_icon_content_description" msgid="465030547475916280">"ಮುಖದ ಐಕಾನ್‌"</string>
     <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ರೀಡ್‌ ಮಾಡು"</string>
-    <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ಒಂದು ಖಾತೆಯ ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್‍‍ಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಖಾತೆಯೊಂದಿಗೆ ಜನರ ಅಪ್ಲಿಕೇಶನ್ ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಇದು ನಿರ್ಧರಿಸಬಹುದು."</string>
+    <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ಒಂದು ಖಾತೆಯ ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್‍‍ಗಳನ್ನು ಓದಲು ಆ್ಯಪ್‌ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಖಾತೆಯೊಂದಿಗೆ ಜನರ ಆ್ಯಪ್‌ ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಇದು ನಿರ್ಧರಿಸಬಹುದು."</string>
     <string name="permlab_writeSyncSettings" msgid="6583154300780427399">"ಸಿಂಕ್ ಆನ್ ಮತ್ತು ಸಿಂಕ್ ಆಫ್ ಟಾಗಲ್ ಮಾಡಿ"</string>
     <string name="permdesc_writeSyncSettings" msgid="6029151549667182687">"ಖಾತೆಗೆ ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್‍‍ಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಖಾತೆಯನ್ನು ಹೊಂದಿರುವ ವ್ಯಕ್ತಿಗಳ ಸಿಂಕ್ ಸಕ್ರಿಯಗೊಳಿಸಲು ಇದನ್ನು ಬಳಸಬಹುದಾಗಿದೆ."</string>
     <string name="permlab_readSyncStats" msgid="3747407238320105332">"ಸಿಂಕ್ ಅಂಕಿಅಂಶಗಳನ್ನು ಓದಿರಿ"</string>
@@ -779,19 +779,19 @@
     <string name="permlab_register_sim_subscription" msgid="1653054249287576161">"ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಿಮ್‌ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಿ"</string>
     <string name="permdesc_register_sim_subscription" msgid="4183858662792232464">"ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಿಮ್‌ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಲು ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_register_call_provider" msgid="6135073566140050702">"ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಿ"</string>
-    <string name="permdesc_register_call_provider" msgid="4201429251459068613">"ಹೊಸ ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಣಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
+    <string name="permdesc_register_call_provider" msgid="4201429251459068613">"ಹೊಸ ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಣಿ ಮಾಡಲು ಆ್ಯಪ್‌ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
     <string name="permlab_connection_manager" msgid="3179365584691166915">"ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
-    <string name="permdesc_connection_manager" msgid="1426093604238937733">"ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
+    <string name="permdesc_connection_manager" msgid="1426093604238937733">"ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಆ್ಯಪ್‌ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
     <string name="permlab_bind_incall_service" msgid="5990625112603493016">"ಒಳ-ಕಾಲ್ ಸ್ಕ್ರೀನ್ ಮೂಲಕ ಸಂವಹನ ನಡೆಸಿ"</string>
     <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"ಬಳಕೆದಾರರು ಒಳ-ಕಾಲ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಯಾವಾಗ ಮತ್ತು ಹೇಗೆ ನೋಡುತ್ತಾರೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
     <string name="permlab_bind_connection_service" msgid="5409268245525024736">"ಟೆಲಿಫೋನಿ ಸೇವೆಗಳೊಂದಿಗೆ ಸಂವಾದ ನಡೆಸಿ"</string>
     <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"ಕರೆಗಳನ್ನು ಮಾಡಲು/ಸ್ವೀಕರಿಸುವ ನಿಟ್ಟಿನಲ್ಲಿ ಲಿಫೋನಿ ಸೇವೆಗಳ ಜೊತೆ ಸಂವಾದ ನಡೆಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅವಕಾಶ ಮಾಡಕೊಡಿ."</string>
     <string name="permlab_control_incall_experience" msgid="6436863486094352987">"ಒಳ ಕರೆ ಬಳಕೆದಾರರ ಅನುಭವವನ್ನು ಒದಗಿಸಿ"</string>
-    <string name="permdesc_control_incall_experience" msgid="5896723643771737534">"ಒಳ ಕರೆಯ ಬಳಕೆದಾರರ ಅನುಭವವನ್ನು ಒದಗಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ ಅನುಮತಿಸುತ್ತದೆ."</string>
+    <string name="permdesc_control_incall_experience" msgid="5896723643771737534">"ಒಳ ಕರೆಯ ಬಳಕೆದಾರರ ಅನುಭವವನ್ನು ಒದಗಿಸಲು ಆ್ಯಪ್‌ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_readNetworkUsageHistory" msgid="8470402862501573795">"ಐತಿಹಾಸಿಕ ನೆಟ್‌ವರ್ಕ್ ಬಳಕೆಯನ್ನು ಓದಿರಿ"</string>
     <string name="permdesc_readNetworkUsageHistory" msgid="1112962304941637102">"ನಿರ್ದಿಷ್ಟ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಐತಿಹಾಸಿಕ ನೆಟ್‌ವರ್ಕ್‌ನ ಬಳಕೆಯನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_manageNetworkPolicy" msgid="6872549423152175378">"ನೆಟ್‌ವರ್ಕ್ ನೀತಿಯನ್ನು ನಿರ್ವಹಿಸಿ"</string>
-    <string name="permdesc_manageNetworkPolicy" msgid="1865663268764673296">"ನೆಟ್‌‌ವರ್ಕ್‌ ನೀತಿಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ ನಿರ್ದಿಷ್ಟ ನಿಯಮಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+    <string name="permdesc_manageNetworkPolicy" msgid="1865663268764673296">"ನೆಟ್‌‌ವರ್ಕ್‌ ನೀತಿಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಮತ್ತು ಆ್ಯಪ್‌ ನಿರ್ದಿಷ್ಟ ನಿಯಮಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_modifyNetworkAccounting" msgid="7448790834938749041">"ನೆಟವರ್ಕ್ ಬಳಕೆಯ ಲೆಕ್ಕ ಪರಿಶೋಧನೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ"</string>
     <string name="permdesc_modifyNetworkAccounting" msgid="5076042642247205390">"ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳಿಗೆ ವಿರುದ್ಧವಾಗಿ ನೆಟ್‍‍ವರ್ಕ್ ಬಳಕೆಯನ್ನು ಹೇಗೆ ಲೆಕ್ಕಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳಲ್ಲಿ ಬಳಸಲಾಗುವುದಿಲ್ಲ."</string>
     <string name="permlab_accessNotifications" msgid="7130360248191984741">"ಅಧಿಸೂಚನೆಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
@@ -803,7 +803,7 @@
     <string name="permlab_bindDreamService" msgid="4776175992848982706">"ಕನಸಿನ ಸೇವೆಗೆ ಪ್ರತಿಬಂಧಿಸಿ"</string>
     <string name="permdesc_bindDreamService" msgid="9129615743300572973">"ಕನಸಿನ ಸೇವೆಯ ಮೇಲ್ಮಟ್ಟದ ಇಂಟರ್ಫೇಸ್‌ಗೆ ಪ್ರತಿಬಂಧಿಸಲು ಮಾಲೀಕರಿಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
     <string name="permlab_invokeCarrierSetup" msgid="5098810760209818140">"ವಾಹಕ-ಒದಗಿಸಿರುವ ಕಾನ್ಫಿಗರೇಶನ್ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ವಿನಂತಿಸಿಕೊಳ್ಳಿ"</string>
-    <string name="permdesc_invokeCarrierSetup" msgid="4790845896063237887">"ವಾಹಕ-ಒದಗಿಸಿರುವ ಕಾನ್ಫಿಗರೇಶನ್ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ವಿನಂತಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
+    <string name="permdesc_invokeCarrierSetup" msgid="4790845896063237887">"ವಾಹಕ-ಒದಗಿಸಿರುವ ಕಾನ್ಫಿಗರೇಶನ್ ಆ್ಯಪ್‌ ಅನ್ನು ವಿನಂತಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಆ್ಯಪ್‌ಗಳಿಗಾಗಿ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
     <string name="permlab_accessNetworkConditions" msgid="1270732533356286514">"ನೆಟ್‌ವರ್ಕ್ ಪರಿಸ್ಥಿತಿಗಳ ಕುರಿತು ಪರಿಶೀಲನೆಗಳನ್ನು ಆಲಿಸಿ"</string>
     <string name="permdesc_accessNetworkConditions" msgid="2959269186741956109">"ನೆಟ್‌ವರ್ಕ್ ಪರಿಸ್ಥಿತಿಗಳ ಕುರಿತು ಪರಿಶೀಲನೆಗಾಗಿ ಆಲಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
     <string name="permlab_setInputCalibration" msgid="932069700285223434">"ಇನ್‌ಪುಟ್‌‌ ಸಾಧನ ಮಾಪನಾಂಕ ನಿರ್ಣಯವನ್ನು ಬದಲಾಯಿಸಿ"</string>
@@ -863,7 +863,7 @@
     <string name="policylab_expirePassword" msgid="6015404400532459169">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಪಾಸ್‌ವರ್ಡ್ ಮುಕ್ತಾಯವನ್ನು ಹೊಂದಿಸಿ"</string>
     <string name="policydesc_expirePassword" msgid="9136524319325960675">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಪಾಸ್‌ವರ್ಡ್, ಪಿನ್, ಅಥವಾ ನಮೂನೆಯನ್ನು ಹೆಚ್ಚು ಪದೆ ಪದೇ ಬದಲಾಯಿಸಬೇಕಾಗಿರುತ್ತದೆ ಎಂಬುದನ್ನು ಬದಲಾಯಿಸಿ."</string>
     <string name="policylab_encryptedStorage" msgid="9012936958126670110">"ಸಂಗ್ರಹಣೆ ಎನ್‌ಕ್ರಿಪ್ಶನ್ ಹೊಂದಿಸಿ"</string>
-    <string name="policydesc_encryptedStorage" msgid="1102516950740375617">"ಸಂಗ್ರಹಿಸಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಬೇಕಾದ ಅಗತ್ಯವಿದೆ."</string>
+    <string name="policydesc_encryptedStorage" msgid="1102516950740375617">"ಸಂಗ್ರಹಿಸಿರುವ ಆ್ಯಪ್ ಡೇಟಾವನ್ನು ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಬೇಕಾದ ಅಗತ್ಯವಿದೆ."</string>
     <string name="policylab_disableCamera" msgid="5749486347810162018">"ಕ್ಯಾಮರಾಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="policydesc_disableCamera" msgid="3204405908799676104">"ಎಲ್ಲಾ ಸಾಧನ ಕ್ಯಾಮರಾಗಳ ಬಳಕೆಯನ್ನು ತಡೆಯಿರಿ."</string>
     <string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"ಕೆಲವು ಸ್ಕ್ರೀನ್ ಲಾಕ್ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
@@ -1200,7 +1200,7 @@
     <string name="low_internal_storage_view_text" msgid="8172166728369697835">"ಕೆಲವು ಸಿಸ್ಟಂ ಕಾರ್ಯವಿಧಾನಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು"</string>
     <string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"ಸಿಸ್ಟಂನಲ್ಲಿ ಸಾಕಷ್ಟು ಸಂಗ್ರಹಣೆಯಿಲ್ಲ. ನೀವು 250MB ನಷ್ಟು ಖಾಲಿ ಸ್ಥಳವನ್ನು ಹೊಂದಿರುವಿರಾ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಹಾಗೂ ಮರುಪ್ರಾರಂಭಿಸಿ."</string>
     <string name="app_running_notification_title" msgid="8985999749231486569">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಚಾಲನೆಯಲ್ಲಿದೆ"</string>
-    <string name="app_running_notification_text" msgid="5120815883400228566">"ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್ ನಿಲ್ಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+    <string name="app_running_notification_text" msgid="5120815883400228566">"ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ ಅಥವಾ ಆ್ಯಪ್‌ ನಿಲ್ಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="ok" msgid="2646370155170753815">"ಸರಿ"</string>
     <string name="cancel" msgid="6908697720451760115">"ರದ್ದುಮಾಡಿ"</string>
     <string name="yes" msgid="9069828999585032361">"ಸರಿ"</string>
@@ -1235,7 +1235,7 @@
     <string name="whichSendToApplication" msgid="77101541959464018">"ಇದನ್ನು ಬಳಸಿಕೊಂಡು ಕಳುಹಿಸಿ"</string>
     <string name="whichSendToApplicationNamed" msgid="3385686512014670003">"%1$s ಬಳಸಿಕೊಂಡು ಕಳುಹಿಸಿ"</string>
     <string name="whichSendToApplicationLabel" msgid="3543240188816513303">"ಕಳುಹಿಸು"</string>
-    <string name="whichHomeApplication" msgid="8276350727038396616">"ಮುಖಪುಟ‌ ಅಪ್ಲಿಕೇಶನ್‌ ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="whichHomeApplication" msgid="8276350727038396616">"ಮುಖಪುಟ‌ ಆ್ಯಪ್‌ ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="whichHomeApplicationNamed" msgid="5855990024847433794">"%1$s ಅನ್ನು ಹೋಮ್ ಆಗಿ ಬಳಸಿ"</string>
     <string name="whichHomeApplicationLabel" msgid="8907334282202933959">"ಚಿತ್ರ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ"</string>
     <string name="whichImageCaptureApplication" msgid="2737413019463215284">"ಇದರ ಜೊತೆಗೆ ಚಿತ್ರ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ"</string>
@@ -1251,12 +1251,12 @@
     <string name="aerr_process" msgid="4268018696970966407">"<xliff:g id="PROCESS">%1$s</xliff:g> ನಿಲ್ಲಿಸಿದೆ"</string>
     <string name="aerr_application_repeated" msgid="7804378743218496566">"<xliff:g id="APPLICATION">%1$s</xliff:g> ನಿಲ್ಲುತ್ತಲೇ ಇರುತ್ತದೆ"</string>
     <string name="aerr_process_repeated" msgid="1153152413537954974">"<xliff:g id="PROCESS">%1$s</xliff:g> ನಿಲ್ಲುತ್ತಲೇ ಇರುತ್ತದೆ"</string>
-    <string name="aerr_restart" msgid="2789618625210505419">"ಅಪ್ಲಿಕೇಶನ್ ಮತ್ತೆ ತೆರೆಯಿರಿ"</string>
+    <string name="aerr_restart" msgid="2789618625210505419">"ಆ್ಯಪ್ ಮತ್ತೆ ತೆರೆಯಿರಿ"</string>
     <string name="aerr_report" msgid="3095644466849299308">"ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿ"</string>
     <string name="aerr_close" msgid="3398336821267021852">"ಮುಚ್ಚಿ"</string>
     <string name="aerr_mute" msgid="2304972923480211376">"ಸಾಧನವು ಮರುಪ್ರಾರಂಭವಾಗುವವರೆಗೂ ಮ್ಯೂಟ್ ಮಾಡಿ"</string>
     <string name="aerr_wait" msgid="3198677780474548217">"ನಿರೀಕ್ಷಿಸು"</string>
-    <string name="aerr_close_app" msgid="8318883106083050970">"ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಮುಚ್ಚಿ"</string>
+    <string name="aerr_close_app" msgid="8318883106083050970">"ಆ್ಯಪ್‌ ಅನ್ನು ಮುಚ್ಚಿ"</string>
     <string name="anr_title" msgid="7290329487067300120"></string>
     <string name="anr_activity_application" msgid="8121716632960340680">"<xliff:g id="APPLICATION">%2$s</xliff:g> ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ"</string>
     <string name="anr_activity_process" msgid="3477362583767128667">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ"</string>
@@ -1266,7 +1266,7 @@
     <string name="report" msgid="2149194372340349521">"ವರದಿ ಮಾಡು"</string>
     <string name="wait" msgid="7765985809494033348">"ನಿರೀಕ್ಷಿಸು"</string>
     <string name="webpage_unresponsive" msgid="7850879412195273433">"ಪುಟವು ಪ್ರತಿಕ್ರಿಯೆ ರಹಿತವಾಗಿದೆ.\n\nನೀವದನ್ನು ಮುಚ್ಚಲು ಬಯಸುವಿರಾ?"</string>
-    <string name="launch_warning_title" msgid="6725456009564953595">"ಅಪ್ಲಿಕೇಶನ್‌ ಮರುನಿರ್ದೇಶಿಸಲಾಗಿದೆ"</string>
+    <string name="launch_warning_title" msgid="6725456009564953595">"ಆ್ಯಪ್‌ ಮರುನಿರ್ದೇಶಿಸಲಾಗಿದೆ"</string>
     <string name="launch_warning_replace" msgid="3073392976283203402">"ಇದೀಗ <xliff:g id="APP_NAME">%1$s</xliff:g> ರನ್ ಆಗುತ್ತಿದೆ."</string>
     <string name="launch_warning_original" msgid="3332206576800169626">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಅನ್ನು ಮೂಲತಃ ಲಾಂಚ್ ಮಾಡಲಾಗಿದೆ."</string>
     <string name="screen_compat_mode_scale" msgid="8627359598437527726">"ಮಾಪಕ"</string>
@@ -1277,7 +1277,7 @@
     <string name="unsupported_compile_sdk_message" msgid="7326293500707890537">"Android OS ನ ಹೊಂದಾಣಿಕೆಯಾಗದ ಆವೃತ್ತಿ ಗಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನ್ನು ರಚಿಸಲಾಗಿದೆ ಮತ್ತು ಅನಿರೀಕ್ಷಿತವಾಗಿ ವರ್ತಿಸಬಹುದು. ಅಪ್ಲಿಕೇಶನ್‌ನ ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾದ ಆವೃತ್ತಿ ಲಭ್ಯವಿರಬಹುದು."</string>
     <string name="unsupported_compile_sdk_show" msgid="1601210057960312248">"ಯಾವಾಗಲೂ ತೋರಿಸು"</string>
     <string name="unsupported_compile_sdk_check_update" msgid="1103639989147664456">"ಅಪ್‌ಡೇಟ್‌ಗಾಗಿ ಪರಿಶೀಲಿಸಿ"</string>
-    <string name="smv_application" msgid="3775183542777792638">"ಅಪ್ಲಿಕೇಶನ್‌‌ <xliff:g id="APPLICATION">%1$s</xliff:g> (ಪ್ರಕ್ರಿಯೆಯು <xliff:g id="PROCESS">%2$s</xliff:g>) ತನ್ನ ಸ್ವಯಂ-ಜಾರಿ ಕಠಿಣ ಮೋಡ್ ನೀತಿಯನ್ನು ಉಲ್ಲಂಘನೆ ಮಾಡಿದೆ."</string>
+    <string name="smv_application" msgid="3775183542777792638">"ಆ್ಯಪ್ <xliff:g id="APPLICATION">%1$s</xliff:g> (ಪ್ರಕ್ರಿಯೆಯು <xliff:g id="PROCESS">%2$s</xliff:g>) ತನ್ನ ಸ್ವಯಂ-ಜಾರಿ ಕಠಿಣ ಮೋಡ್ ನೀತಿಯನ್ನು ಉಲ್ಲಂಘನೆ ಮಾಡಿದೆ."</string>
     <string name="smv_process" msgid="1398801497130695446">"<xliff:g id="PROCESS">%1$s</xliff:g> ಪ್ರಕ್ರಿಯೆಯು ತನ್ನ ಸ್ವಯಂ-ಜಾರಿ ಕಠಿಣ ಮೋಡ್ ನೀತಿಯನ್ನು ಉಲ್ಲಂಘನೆ ಮಾಡಿದೆ."</string>
     <string name="android_upgrading_title" product="default" msgid="7279077384220829683">"ಫೋನ್ ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
     <string name="android_upgrading_title" product="tablet" msgid="4268417249079938805">"ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
@@ -1379,9 +1379,9 @@
     <string name="sim_added_message" msgid="6602906609509958680">"ಮೊಬೈಲ್ ನೆಟ್‍ವರ್ಕ್ ಪ್ರವೇಶಿಸಲು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ."</string>
     <string name="sim_restart_button" msgid="8481803851341190038">"ಮರುಪ್ರಾರಂಭಿಸು"</string>
     <string name="install_carrier_app_notification_title" msgid="5712723402213090102">"ಮೊಬೈಲ್ ಸೇವೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
-    <string name="install_carrier_app_notification_text" msgid="2781317581274192728">"ನಿಮ್ಮ ಹೊಸ ಸಿಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ವಾಹಕ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬಳಸಿ"</string>
-    <string name="install_carrier_app_notification_text_app_name" msgid="4086877327264106484">"ನಿಮ್ಮ ಹೊಸ ಸಿಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ"</string>
-    <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"ಅಪ್ಲಿಕೇಶನ್ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ"</string>
+    <string name="install_carrier_app_notification_text" msgid="2781317581274192728">"ನಿಮ್ಮ ಹೊಸ ಸಿಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ವಾಹಕ ಆ್ಯಪ್ ಅನ್ನು ಬಳಸಿ"</string>
+    <string name="install_carrier_app_notification_text_app_name" msgid="4086877327264106484">"ನಿಮ್ಮ ಹೊಸ ಸಿಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್‌ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ"</string>
+    <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"ಆ್ಯಪ್‌ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ"</string>
     <string name="carrier_app_notification_title" msgid="5815477368072060250">"ಹೊಸ ಸಿಮ್ ಸೇರಿಸಲಾಗಿದೆ"</string>
     <string name="carrier_app_notification_text" msgid="6567057546341958637">"ಇದನ್ನು ಸ್ಥಾಪಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="time_picker_dialog_title" msgid="9053376764985220821">"ಸಮಯವನ್ನು ಹೊಂದಿಸಿ"</string>
@@ -1502,7 +1502,7 @@
     <string name="permlab_requestDeletePackages" msgid="2541172829260106795">"ಪ್ಯಾಕೇಜ್‌ಗಳನ್ನು ಅಳಿಸಲು ವಿನಂತಿ"</string>
     <string name="permdesc_requestDeletePackages" msgid="6133633516423860381">"ಪ್ಯಾಕೇಜ್‌ಗಳನ್ನು ಅಳಿಸುವುದಕ್ಕಾಗಿ ವಿನಂತಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_requestIgnoreBatteryOptimizations" msgid="7646611326036631439">"ಬ್ಯಾಟರಿ ಆಪ್ಟಿಮೈಸೇಶನ್‌ಗಳನ್ನು ಕಡೆಗಣಿಸಲು ಕೇಳಿ"</string>
-    <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಬ್ಯಾಟರಿ ಆಪ್ಟಿಮೈಸೇಶನ್‌ಗಳನ್ನು ಕಡೆಗಣಿಸುವುದಕ್ಕೆ ಅನುಮತಿಯನ್ನು ಕೇಳಲು ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
+    <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"ಈ ಆ್ಯಪ್‌ಗೆ ಬ್ಯಾಟರಿ ಆಪ್ಟಿಮೈಸೇಶನ್‌ಗಳನ್ನು ಕಡೆಗಣಿಸುವುದಕ್ಕೆ ಅನುಮತಿಯನ್ನು ಕೇಳಲು ಆ್ಯಪ್‌ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_queryAllPackages" msgid="2928450604653281650">"ಎಲ್ಲಾ ಪ್ಯಾಕೇಜ್‌ಗಳ ಕುರಿತಾದ ಮಾಹಿತಿಯನ್ನು ಕೇಳಿ"</string>
     <string name="permdesc_queryAllPackages" msgid="5339069855520996010">"ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿದ ಎಲ್ಲಾ ಪ್ಯಾಕೇಜ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1842872462124648678">"ಝೂಮ್‌ ನಿಯಂತ್ರಿಸಲು ಎರಡು ಬಾರಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -1524,8 +1524,8 @@
     <string name="permission_request_notification_title" msgid="1810025922441048273">"ಅನುಮತಿ ವಿನಂತಿಸಲಾಗಿದೆ"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"<xliff:g id="ACCOUNT">%s</xliff:g> ಖಾತೆಗಾಗಿ\n ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ."</string>
     <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="ACCOUNT">%2$s</xliff:g> ಖಾತೆಗಾಗಿ \n <xliff:g id="APP">%1$s</xliff:g> ನಿಂದ ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ."</string>
-    <string name="forward_intent_to_owner" msgid="4620359037192871015">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನ ಹೊರಗೆ ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ"</string>
-    <string name="forward_intent_to_work" msgid="3620262405636021151">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ"</string>
+    <string name="forward_intent_to_owner" msgid="4620359037192871015">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನ ಹೊರಗೆ ನೀವು ಈ ಆ್ಯಪ್‌ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ"</string>
+    <string name="forward_intent_to_work" msgid="3620262405636021151">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"ಇನ್‌ಪುಟ್ ವಿಧಾನ"</string>
     <string name="sync_binding_label" msgid="469249309424662147">"ಸಿಂಕ್ ಮಾಡು"</string>
     <string name="accessibility_binding_label" msgid="1974602776545801715">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ"</string>
@@ -1548,8 +1548,8 @@
     <string name="no_file_chosen" msgid="4146295695162318057">"ಯಾವುದೇ ಫೈಲ್ ಆಯ್ಕೆ ಮಾಡಿಲ್ಲ"</string>
     <string name="reset" msgid="3865826612628171429">"ಮರುಹೊಂದಿಸು"</string>
     <string name="submit" msgid="862795280643405865">"ಸಲ್ಲಿಸು"</string>
-    <string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ಡ್ರೈವಿಂಗ್‌ ಅಪ್ಲಿಕೇಶನ್ ಚಾಲನೆಯಲ್ಲಿದೆ"</string>
-    <string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ಡ್ರೈವಿಂಗ್‌ ಅಪ್ಲಿಕೇಶನ್ ನಿರ್ಗಮಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+    <string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ಡ್ರೈವಿಂಗ್‌ ಆ್ಯಪ್‌ ಚಾಲನೆಯಲ್ಲಿದೆ"</string>
+    <string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ಡ್ರೈವಿಂಗ್‌ ಆ್ಯಪ್ ನಿರ್ಗಮಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="back_button_label" msgid="4078224038025043387">"ಹಿಂದೆ"</string>
     <string name="next_button_label" msgid="6040209156399907780">"ಮುಂದಿನದು"</string>
     <string name="skip_button_label" msgid="3566599811326688389">"ಸ್ಕಿಪ್‌"</string>
@@ -2000,8 +2000,8 @@
     <string name="language_picker_section_all" msgid="1985809075777564284">"ಎಲ್ಲಾ ಭಾಷೆಗಳು"</string>
     <string name="region_picker_section_all" msgid="756441309928774155">"ಎಲ್ಲಾ ಪ್ರದೇಶಗಳು"</string>
     <string name="locale_search_menu" msgid="6258090710176422934">"ಹುಡುಕಿ"</string>
-    <string name="app_suspended_title" msgid="888873445010322650">"ಅಪ್ಲಿಕೇಶನ್ ಲಭ್ಯವಿಲ್ಲ"</string>
-    <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ಅಪ್ಲಿಕೇಶನ್‌ ಸದ್ಯಕ್ಕೆ ಲಭ್ಯವಿಲ್ಲ. ಇದನ್ನು <xliff:g id="APP_NAME_1">%2$s</xliff:g> ನಲ್ಲಿ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ."</string>
+    <string name="app_suspended_title" msgid="888873445010322650">"ಆ್ಯಪ್ ಲಭ್ಯವಿಲ್ಲ"</string>
+    <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ಆ್ಯಪ್‌ ಸದ್ಯಕ್ಕೆ ಲಭ್ಯವಿಲ್ಲ. ಇದನ್ನು <xliff:g id="APP_NAME_1">%2$s</xliff:g> ನಲ್ಲಿ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ."</string>
     <string name="app_suspended_more_details" msgid="211260942831587014">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</string>
     <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"ಆ್ಯಪ್ ವಿರಾಮ ನಿಲ್ಲಿಸಿ"</string>
     <string name="work_mode_off_title" msgid="6367463960165135829">"ಕೆಲಸದ ಆ್ಯಪ್ ವಿರಾಮ ರದ್ದುಮಾಡಬೇಕೇ"</string>
@@ -2038,7 +2038,7 @@
     <string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"ಅಪ್‌ಡೇಟ್‌ಗಾಗಿ ಪರಿಶೀಲಿಸಿ"</string>
     <string name="deprecated_abi_message" msgid="6820548011196218091">"ಈ ಆ್ಯಪ್ Android ನ ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಯ ಜೊತೆಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. ಅಪ್‌ಡೇಟ್‌ಗಾಗಿ ಪರಿಶೀಲಿಸಿ ಅಥವಾ ಆ್ಯಪ್ ಡೆವಲಪರ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
     <string name="new_sms_notification_title" msgid="6528758221319927107">"ನೀವು ಹೊಸ ಸಂದೇಶಗಳನ್ನು ಹೊಂದಿರುವಿರಿ"</string>
-    <string name="new_sms_notification_content" msgid="3197949934153460639">"ವೀಕ್ಷಿಸಲು SMS ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ"</string>
+    <string name="new_sms_notification_content" msgid="3197949934153460639">"ವೀಕ್ಷಿಸಲು SMS ಆ್ಯಪ್ ತೆರೆಯಿರಿ"</string>
     <string name="profile_encrypted_title" msgid="9001208667521266472">"ಕೆಲವು ಕಾರ್ಯನಿರ್ವಹಣೆ ಸೀಮಿತವಾಗಿರಬಹುದು"</string>
     <string name="profile_encrypted_detail" msgid="5279730442756849055">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ"</string>
     <string name="profile_encrypted_message" msgid="1128512616293157802">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್‌ಲಾಕ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -2116,24 +2116,19 @@
     <string name="mmcc_illegal_me_msim_template" msgid="4802735138861422802">"<xliff:g id="SIMNUMBER">%d</xliff:g> ಸಿಮ್ ಅನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ"</string>
     <string name="popup_window_default_title" msgid="6907717596694826919">"ಪಾಪ್‌ಅಪ್ ವಿಂಡೋ"</string>
     <string name="slice_more_content" msgid="3377367737876888459">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
-    <string name="shortcut_restored_on_lower_version" msgid="9206301954024286063">"ಅಪ್ಲಿಕೇಶನ್ ಆವೃತ್ತಿಯನ್ನು ಡೌನ್‌ಗ್ರೇಡ್‌ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಈ ಶಾರ್ಟ್‌ಕಟ್‌ಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುವುದಿಲ್ಲ"</string>
-    <string name="shortcut_restore_not_supported" msgid="4763198938588468400">"ಅಪ್ಲಿಕೇಶನ್‌ ಬ್ಯಾಕಪ್ ಮತ್ತು ಪುನಃಸ್ಥಾಪನೆಯನ್ನು ಬೆಂಬಲಿಸದಿರುವುದರಿಂದ ಶಾರ್ಟ್‌ಕಟ್‌ ಅನ್ನು ಪುನಃಸ್ಥಾಪನೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
-    <string name="shortcut_restore_signature_mismatch" msgid="579345304221605479">"ಅಪ್ಲಿಕೇಶನ್‌ ಸಹಿ ಹೊಂದಿಕೆಯಾಗದ ಕಾರಣದಿಂದ ಶಾರ್ಟ್‌ಕಟ್‌ ಅನ್ನು ಪುನಃಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
+    <string name="shortcut_restored_on_lower_version" msgid="9206301954024286063">"ಆ್ಯಪ್‌ ಆವೃತ್ತಿಯನ್ನು ಡೌನ್‌ಗ್ರೇಡ್‌ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಈ ಶಾರ್ಟ್‌ಕಟ್‌ಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುವುದಿಲ್ಲ"</string>
+    <string name="shortcut_restore_not_supported" msgid="4763198938588468400">"ಆ್ಯಪ್‌ ಬ್ಯಾಕಪ್ ಮತ್ತು ಪುನಃಸ್ಥಾಪನೆಯನ್ನು ಬೆಂಬಲಿಸದಿರುವುದರಿಂದ ಶಾರ್ಟ್‌ಕಟ್‌ ಅನ್ನು ಪುನಃಸ್ಥಾಪನೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
+    <string name="shortcut_restore_signature_mismatch" msgid="579345304221605479">"ಆ್ಯಪ್‌ ಸಹಿ ಹೊಂದಿಕೆಯಾಗದ ಕಾರಣದಿಂದ ಶಾರ್ಟ್‌ಕಟ್‌ ಅನ್ನು ಪುನಃಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
     <string name="shortcut_restore_unknown_issue" msgid="2478146134395982154">"ಶಾರ್ಟ್‌ಕಟ್‌ ಅನ್ನು ಪುನಃ ಸ್ಥಾಪನೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
     <string name="shortcut_disabled_reason_unknown" msgid="753074793553599166">"ಶಾರ್ಟ್‌ಕಟ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
     <string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
     <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ಹೇಗಿದ್ದರೂ ತೆರೆಯಿರಿ"</string>
-    <string name="harmful_app_warning_title" msgid="8794823880881113856">"ಅಪಾಯಕಾರಿ ಅಪ್ಲಿಕೇಶನ್ ಕಂಡುಬಂದಿದೆ"</string>
+    <string name="harmful_app_warning_title" msgid="8794823880881113856">"ಅಪಾಯಕಾರಿ ಆ್ಯಪ್‌ ಕಂಡುಬಂದಿದೆ"</string>
     <string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_2">%2$s</xliff:g> ಸ್ಲೈಸ್‌ಗಳನ್ನು <xliff:g id="APP_0">%1$s</xliff:g> ತೋರಿಸಲು ಬಯಸಿದೆ"</string>
     <string name="screenshot_edit" msgid="7408934887203689207">"ಎಡಿಟ್"</string>
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ಕರೆಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳು ವೈಬ್ರೇಟ್‌ ಆಗುತ್ತವೆ"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ಕರೆಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಲಾಗುತ್ತದೆ"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"ಸಿಸ್ಟಂ ಬದಲಾವಣೆಗಳು"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಮೋಡ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮರೆಮಾಡುತ್ತಿದೆ"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಮತ್ತು ಬದಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಬದಲಾಗಿದೆ"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"ಏನನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ಪರೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"ನೋಟಿಫಿಕೇಶನ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 ನಿಂದ ಪ್ರಾರಂಭಿಸಿ, ನೀವು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡುವ ಆ್ಯಪ್‌ಗಳಿಗೆ, ಅಧಿಸೂಚನೆಗಳನ್ನು ಕಳುಹಿಸಲು ನಿಮ್ಮ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ. ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಆ್ಯಪ್‌ಗಳಿಗಾಗಿ ಈ ಅನುಮತಿಯನ್ನು ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"ನಂತರ ರಿಮೈಂಡ್ ಮಾಡಿ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 5f0e1f9..92ca1d5 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"전화 및 알림이 오면 진동이 사용됩니다."</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"전화 및 알림 소리가 음소거됩니다."</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"시스템 변경사항"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"방해 금지 모드"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"새로운 기능: 방해 금지 모드로 알림 숨기기"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"자세히 알아보고 변경하려면 탭하세요."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"방해 금지 모드 변경"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"차단된 항목을 확인하려면 탭하세요."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"알림 설정 검토"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13부터 설치된 앱에는 알림을 전송하기 위한 권한이 필요합니다. 기존 앱의 알림 전송 권한을 변경하려면 탭하세요."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"나중에 알림"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 514b9cf..a4380253 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -656,8 +656,8 @@
     <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Улантуу үчүн экрандын кулпусун киргизиңиз"</string>
     <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"Сенсорду катуу басыңыз"</string>
     <string name="fingerprint_acquired_insufficient" msgid="2410176550915730974">"Манжа изи таанылган жок. Кайра аракет кылыңыз."</string>
-    <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Манжа изинин сенсорун тазалап, кайра аракет кылыңыз"</string>
-    <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Сенсорду тазалап, кайра аракет кылыңыз"</string>
+    <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Манжа изинин сенсорун тазалап, кайталап көрүңүз"</string>
+    <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Сенсорду тазалап, кайталап көрүңүз"</string>
     <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Сенсорду катуу басыңыз"</string>
     <string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Манжа өтө жай жылды. Кайталап көрүңүз."</string>
     <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Башка манжа изин байкап көрүңүз"</string>
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Чалуулар менен билдирмелер дирилдөө режиминде иштейт"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Чалуулар менен эскертмелердин үнү өчүрүлөт"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Система өзгөрүүлөрү"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Тынчымды алба"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Жаңы: \"Тынчымды алба\" режими билдирмелерди жашырууда"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Көбүрөөк маалымат алып, өзгөртүү үчүн таптаңыз."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\"Тынчымды алба\" режими өзгөрдү"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Бөгөттөлгөн нерселерди көрүү үчүн таптаңыз."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Билдирмелердин параметрлерин карап чыгуу"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 версиясынан баштап билдирмелерди жөнөтүү үчүн орноткон колдонмолоруңузга уруксат берүү керек. Учурдагы колдонмолор үчүн бул уруксатты өзгөртүү үчүн таптап коюңуз."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Кийинчерээк эскертүү"</string>
@@ -2390,7 +2385,7 @@
     <string name="mic_access_on_toast" msgid="2666925317663845156">"Микрофон жеткиликтүү"</string>
     <string name="mic_access_off_toast" msgid="8111040892954242437">"Микрофон бөгөттөлгөн"</string>
     <string name="connected_display_unavailable_notification_title" msgid="5265409360902073556">"Башка экранга чыгаруу мүмкүн эмес"</string>
-    <string name="connected_display_unavailable_notification_content" msgid="3845903313751217516">"Башка кабелди колдонуп, кайра аракет кылыңыз"</string>
+    <string name="connected_display_unavailable_notification_content" msgid="3845903313751217516">"Башка кабелди колдонуп, кайталап көрүңүз"</string>
     <string name="connected_display_thermally_unavailable_notification_content" msgid="9205758199439955949">"Түзмөгүңүз өтө ысып кетти жана ал муздамайынча башка экранга чыгара албайт"</string>
     <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Кош экран"</string>
     <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen күйүк"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index fb677cf..be09c10 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ການໂທ ແລະ ການແຈ້ງເຕືອນຈະສັ່ນ"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ການໂທ ແລະ ການແຈ້ງເຕືອນຈະບໍ່ມີສຽງ"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"ການປ່ຽນແປງລະບົບ"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ຫ້າມລົບກວນ"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ໃໝ່: ໂໝດຫ້າມລົບກວນຈະເຊື່ອງການແຈ້ງເຕືອນໄວ້"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ ແລະ ປ່ຽນແປງ."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"ປ່ຽນໂໝດຫ້າມລົບກວນແລ້ວ"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"ແຕະເພື່ອກວດສອບວ່າມີຫຍັງຖືກບລັອກໄວ້ແດ່."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"ກວດສອບ​ການ​ຕັ້ງ​ຄ່າ​ການ​ແຈ້ງ​ເຕືອນ"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"ເລີ່ມຕົ້ນໃນ Android 13, ແອັບຕ່າງໆທີ່ທ່ານຕິດຕັ້ງຈະຕ້ອງໃຊ້ການອະນຸຍາດຂອງທ່ານເພື່ອສົ່ງການແຈ້ງເຕືອນ. ແຕະເພື່ອປ່ຽນການອະນຸຍາດນີ້ສຳລັບແອັບທີ່ມີຢູ່ກ່ອນແລ້ວ."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"ແຈ້ງເຕືອນຂ້ອຍພາຍຫຼັງ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index e617a4c..45998ee 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -2131,11 +2131,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Skambučiai ir pranešimai vibruos"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Skambučiai ir pranešimai bus nutildyti"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistemos pakeitimai"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Netrukdymo režimas"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Naujiena: naudojant netrukdymo režimą pranešimai slepiami"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Palieskite, kad sužinotumėte daugiau ir pakeistumėte."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Netrukdymo režimas pakeistas"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Palieskite, kad patikrintumėte, kas blokuojama."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Peržiūrėkite pranešimų nustatymus"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Tryliktos ir naujesnių versijų „Android” jūsų įdiegtoms programoms reikia suteikti leidimą siųsti pranešimus. Palieskite, kad pakeistumėte šį leidimą esamoms programoms."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Priminti vėliau"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index b04dd45..973d8e2 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Zvaniem un paziņojumiem tiks aktivizēta vibrācija."</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Zvanu un paziņojumu signāla skaņa būs izslēgta."</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistēmas izmaiņas"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Netraucēt"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Jaunums: režīmā “Netraucēt” paziņojumi tiek paslēpti"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Pieskarieties, lai uzzinātu vairāk un veiktu izmaiņas."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Režīms “Netraucēt” ir mainīts"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Pieskarieties, lai uzzinātu, kas tiek bloķēts."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Pārskatīt paziņojumu iestatījumus"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Operētājsistēmā Android 13 un jaunākās versijās jūsu instalētajām lietotnēm ir nepieciešama atļauja sūtīt paziņojumus. Pieskarieties, lai mainītu šo atļauju esošajām lietotnēm."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Atgādināt vēlāk"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index b0d6351..3943dc3 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Повиците и известувањата ќе вибрираат"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Повиците и известувањата нема да имаат звук"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Системски промени"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Не вознемирувај"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Ново: режимот „Не вознемирувај“ ги крие известувањата"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Допрете за да дознаете повеќе и да ги промените поставките."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Поставките за „Не вознемирувај“ се изменија"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Допрете за да проверите што е блокирано."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Прегледајте ги поставките за известувања"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Почнувајќи од Android 13, на апликациите што ги инсталирате им е потребна ваша дозвола за испраќање известувања. Допрете за да ја промените оваа дозвола за постојни апликации."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Потсети ме подоцна"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index cc545e2..242e967 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"കോളുകളും അറിയിപ്പുകളും വൈബ്രേറ്റ് ചെയ്യും"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"കോളുകളും അറിയിപ്പുകളും മ്യൂട്ട് ചെയ്യപ്പെടും"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"സിസ്‌റ്റത്തിലെ മാറ്റങ്ങൾ"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ശല്യപ്പെടുത്തരുത്"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"പുതിയത്: അറിയിപ്പുകളെ \'ശല്യപ്പെടുത്തരുത്\' അദൃശ്യമാക്കുന്നു"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"കൂടുതലറിയാനും മാറ്റാനും ടാപ്പ് ചെയ്യുക."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\'ശല്യപ്പെടുത്തരുത്\' മാറ്റി"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"എന്തിനെയാണ് ബ്ലോക്ക് ചെയ്‌തതെന്ന് പരിശോധിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"അറിയിപ്പ് ക്രമീകരണം അവലോകനം ചെയ്യുക"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 മുതൽ, നിങ്ങൾ ഇൻസ്‌റ്റാൾ ചെയ്യുന്ന ആപ്പുകൾക്ക് അറിയിപ്പുകൾ അയയ്‌ക്കാൻ നിങ്ങളുടെ അനുമതി വേണം. നിലവിലുള്ള ആപ്പുകൾക്ക് ഈ അനുമതി മാറ്റാൻ ടാപ്പ് ചെയ്യുക."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"പിന്നീട് ഓർമ്മിപ്പിക്കൂ"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 87ce94b..c8f2eaa 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Дуудлага болон мэдэгдэл чичирнэ"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Дуудлага болон мэдэгдлийн дууг хаана"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Системийн өөрчлөлт"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Бүү саад бол"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Шинэ: Бүү саад бол горим мэдэгдлийг нууж байна"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Илүү ихийг мэдэж, өөрчлөхийн тулд товшино уу."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Бүү саад бол горимыг өөрчилсөн"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Блоклосон зүйлийг шалгахын тулд товшино уу."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Мэдэгдлийн тохиргоог шалгах"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13-аас эхлэн таны суулгасан аппууд мэдэгдэл илгээхийн тулд танаас зөвшөөрөл авах шаардлагатай. Одоо байгаа аппуудын уг зөвшөөрлийг өөрчлөхийн тулд товшино уу."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Надад дараа сануул"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 03cabc3..9980d9f 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"कॉल आणि सूचनांवर व्हायब्रेट होईल"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"कॉल आणि सूचना म्यूट केल्या जातील"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"सिस्टम बदल"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"व्यत्यय आणू नका"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"व्यत्यय आणू नका सूचना लपवत आहे"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"अधिक जाणून घेण्‍यासाठी आणि बदलण्‍यासाठी टॅप करा."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"व्यत्यय आणू नका बदलले आहे"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"काय ब्लॉक केले आहे हे तपासण्यासाठी टॅप करा."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"सूचना सेटिंग्जचे पुनरावलोकन करा"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 पासून, तुम्ही त्यामध्ये इंस्टॉल केलेल्या अ‍ॅप्सना सूचना पाठवण्यासाठी तुमच्या परवानगीची आवश्यकता आहे. सध्याच्या अ‍ॅप्ससाठी ही परवानगी बदलण्याकरिता टॅप करा."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"मला आठवण करून द्या"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 83a1d56..e811635 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -1735,7 +1735,7 @@
     <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"HIDUP"</string>
     <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"MATI"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Benarkan <xliff:g id="SERVICE">%1$s</xliff:g> mempunyai kawalan penuh atas peranti anda?"</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Kawalan penuh sesuai untuk apl yang membantu anda berkaitan dengan keperluan kebolehaksesan tetapi bukan untuk kebanyakan apl."</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Kawalan penuh sesuai untuk apl yang berkaitan dengan keperluan kebolehaksesan anda tetapi bukan untuk kebanyakan apl."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Melihat dan mengawal skrin"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Ciri ini boleh membaca semua kandungan pada skrin dan memaparkan kandungan di atas apl lain."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Melihat dan melaksanakan tindakan"</string>
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Panggilan dan pemberitahuan akan bergetar"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Panggilan dan pemberitahuan akan diredamkan"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Perubahan sistem"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Jangan Ganggu"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Baharu: Jangan Ganggu menyembunyikan pemberitahuan"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Ketik untuk mengetahui lebih lanjut dan menukar tetapan."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Jangan Ganggu telah berubah"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Ketik untuk menyemak item yang disekat."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Semak tetapan pemberitahuan"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Bermula dengan Android 13, apl yang anda pasang memerlukan kebenaran anda untuk menghantar pemberitahuan. Ketik untuk menukar kebenaran ini bagi apl sedia ada."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Ingatkan saya nanti"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index e4e75c1..7088a15 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -322,7 +322,7 @@
     <string name="permgrouplab_location" msgid="1858277002233964394">"တည်နေရာ"</string>
     <string name="permgroupdesc_location" msgid="1995955142118450685">"ဤစက်ပစ္စည်း၏ တည်နေရာကို ရယူရန်"</string>
     <string name="permgrouplab_calendar" msgid="6426860926123033230">"ပြက္ခဒိန်"</string>
-    <string name="permgroupdesc_calendar" msgid="6762751063361489379">"သင့်ပြက္ခဒိန်အား ဝင်ရောက်သုံးရန်"</string>
+    <string name="permgroupdesc_calendar" msgid="6762751063361489379">"သင့်ပြက္ခဒိန်အား ဝင်သုံးရန်"</string>
     <string name="permgrouplab_sms" msgid="795737735126084874">"SMS စာတိုစနစ်"</string>
     <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS စာများကို ပို့ကာ ကြည့်မည်"</string>
     <string name="permgrouplab_storage" msgid="17339216290379241">"ဖိုင်များ"</string>
@@ -797,7 +797,7 @@
     <string name="permlab_accessNotifications" msgid="7130360248191984741">"သတိပေးချက်များအား အသုံးပြုခွင့်"</string>
     <string name="permdesc_accessNotifications" msgid="761730149268789668">"အပလီကေးရှင်းကို အကြောင်းကြားချက်များအား ထုတ်လုပ်ရန်၊ လေ့လာရန်၊ ဖျက်ရန် ခွင့်ပြုခြင်း။ တခြား အပလီကေးရှင်းများမှ သတိပေးချက်များလည်း ပါဝင်ပါသည်"</string>
     <string name="permlab_bindNotificationListenerService" msgid="5848096702733262458">"သတိပေးချက် နားထောင်ခြင်း ဆားဗစ် နှင့် ပူးပေါင်းခြင်း"</string>
-    <string name="permdesc_bindNotificationListenerService" msgid="4970553694467137126">"ဖုန်းကိုင်ထားသူနှင့် အကြောင်းကြားချက် နားစွင့်သော ဆားဗစ်မှ ထိပ်ပိုင်းအင်တာဖေ့စ် ကို ပူးပေါင်းခွင့်ပေးခြင်း။ ပုံမှန် အက်ပ်များအတွက် ဘယ်တော့မှ မလိုအပ်ပါ"</string>
+    <string name="permdesc_bindNotificationListenerService" msgid="4970553694467137126">"ဖုန်းကိုင်ထားသူနှင့် အကြောင်းကြားချက် နားစွင့်သော ဆားဗစ်မှ ထိပ်ပိုင်းအင်တာဖေ့စ် ကို ပူးပေါင်းခွင့်ပေးသည်။ ပုံမှန် အက်ပ်များအတွက် ဘယ်တော့မှ မလိုအပ်ပါ။"</string>
     <string name="permlab_bindConditionProviderService" msgid="5245421224814878483">"အခြေအနေ စီမံပေးရေး ဝန်ဆောင်မှု တစ်ခုဆီသို့ ချိတ်တွဲခြင်း"</string>
     <string name="permdesc_bindConditionProviderService" msgid="6106018791256120258">"စွဲကိုင်ထားသူအား အခြေအနေကို စီမံပေးသူ၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် အက်ပ်များ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
     <string name="permlab_bindDreamService" msgid="4776175992848982706">"အိပ်မက် ဝန်ဆောင်မှုသို့ ပေါင်းစည်းမည်"</string>
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ခေါ်ဆိုမှုများနှင့် အကြောင်းကြားချက်များ တုန်ခါပါမည်"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ခေါ်ဆိုမှုများနှင့် အကြောင်းကြားချက်များကို အသံပိတ်ထားပါမည်"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"စနစ် အပြောင်းအလဲများ"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"မနှောင့်ယှက်ရ"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"အသစ်− \'မနှောင့်ယှက်ရ\' က အကြောင်းကြားချက်များကို ဖျောက်ထားသည်"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ပိုမိုလေ့လာရန်နှင့် ပြောင်းလဲရန် တို့ပါ။"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\'မနှောင့်ယှက်ရ\' ပြောင်းလဲသွားပါပြီ"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"ပိတ်ထားသည့်အရာများကို ကြည့်ရန် တို့ပါ။"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"အကြောင်းကြားချက် ဆက်တင်များ စိစစ်ရန်"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 မှစ၍ ထည့်သွင်းသော အက်ပ်များသည် အကြောင်းကြားချက်များပို့ရန် သင်၏ခွင့်ပြုချက် လိုအပ်ပါမည်။ ရှိပြီးသားအက်ပ်များအတွက် ဤခွင့်ပြုချက်ကိုပြောင်းရန် တို့ပါ။"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"နောက်မှ သတိပေးပါ"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 6d24bdf..f39a4f8 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Anrop og varsler vibrerer"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Anrop og varsler er lydløse"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Systemendringer"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ikke forstyrr"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nytt: «Ikke forstyrr» skjuler varsler"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Trykk for å finne ut mer og endre."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Ikke forstyrr er endret"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Trykk for å sjekke hva som er blokkert."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Gjennomgå varslingsinnstillingene"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Fra og med Android 13 må apper du installerer, få tillatelse til å sende varsler. Trykk for å endre denne tillatelsen for eksisterende apper."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Påminn meg senere"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 133429b..82052b5 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"कल तथा सूचनाहरू आउँदा कम्पन हुने छ"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"कल तथा सूचनाहरूलाई म्युट गरिने छ"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"प्रणालीसम्बन्धी परिवर्तनहरू"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"बाधा नपुऱ्याउनुहोस्"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"नयाँ: बाधा नपुर्‍याउनुहोस् नामक मोडले सूचनाहरू लुकाइरहेको छ"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"थप जान्न र परिवर्तन गर्न ट्याप गर्नुहोस्।"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"बाधा नपुर्‍याउनुहोस् मोड परिवर्तन भएको छ"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"रोक लगाइएका कुराहरू जाँच गर्न ट्याप गर्नुहोस्‌।"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"सूचनाका सेटिङको समीक्षा गर्नुहोस्"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android १३ मा तपाईंले अनुमति दिनुभएका खण्डमा मात्र तपाईंले इन्स्टल गर्नुभएका एपले सूचना पठाउन सक्छन्। यसअघि इन्स्टल गरिसकिएका एपका हकमा यो अनुमति परिवर्तन गर्न ट्याप गर्नुहोस्।"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"मलाई पछि स्मरण गराइयोस्"</string>
@@ -2410,7 +2405,7 @@
     <string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"किबोर्डहरू हेर्न ट्याप गर्नुहोस्"</string>
     <string name="profile_label_private" msgid="6463418670715290696">"निजी"</string>
     <string name="profile_label_clone" msgid="769106052210954285">"क्लोन"</string>
-    <string name="profile_label_work" msgid="3495359133038584618">"कार्य प्रोफाइल"</string>
+    <string name="profile_label_work" msgid="3495359133038584618">"कार्य"</string>
     <string name="profile_label_work_2" msgid="4691533661598632135">"कार्य प्रोफाइल २"</string>
     <string name="profile_label_work_3" msgid="4834572253956798917">"कार्य प्रोफाइल ३"</string>
     <string name="profile_label_test" msgid="9168641926186071947">"परीक्षण"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index d2ec4ba..f591754 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Trillen bij gesprekken en meldingen"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Telefoon- en meldingsgeluid wordt uitgezet"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Systeemwijzigingen"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Niet storen"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nieuw: \'Niet storen\' verbergt meldingen"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tik voor meer informatie en om te wijzigen."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\'Niet storen\' is gewijzigd"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tik om te controleren wat er is geblokkeerd."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Instellingen voor meldingen bekijken"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Vanaf Android 13 hebben de apps die je installeert je toestemming nodig om meldingen te sturen. Tik om deze toestemming voor bestaande apps te wijzigen."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Later herinneren"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 85a6aec..1a952a3 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"କଲ୍ ଓ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଭାଇବ୍ରେଟ୍ ହେବ"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"କଲ୍ ଓ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ନିଃଶବ୍ଦ କରିଦିଆଯିବ"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"ସିଷ୍ଟମ୍‌ରେ ପରିବର୍ତ୍ତନ"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ନୂଆ: \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ମୋଡ୍‌ ଅନ୍‌ ଥିବା ଯୋଗୁଁ ବିଜ୍ଞପ୍ତି ଲୁଚାଇ ଦିଆଯାଉଛି"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ଅଧିକ ଜାଣିବାକୁ ଟ୍ୟାପ୍‌ କରନ୍ତୁ ଏବଂ ବଦଳାନ୍ତୁ।"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"’ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ’ ବଦଳିଯାଇଛି"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"କ’ଣ ଅବରୋଧ ହୋଇଛି ଯାଞ୍ଚ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"ବିଜ୍ଞପ୍ତି ସେଟିଂସକୁ ସମୀକ୍ଷା କରନ୍ତୁ"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13ଠାରୁ, ଆପଣ ଇନଷ୍ଟଲ କରୁଥିବା ଆପ୍ସ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ପଠାଇବା ପାଇଁ ଆପଣଙ୍କ ଅନୁମତି ଆବଶ୍ୟକ କରେ। ପୂର୍ବରୁ ଥିବା ଆପ୍ସ ପାଇଁ ଏହି ଅନୁମତିକୁ ପରିବର୍ତ୍ତନ କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"ମୋତେ ପରେ ରିମାଇଣ୍ଡ କର"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 51d71ff..6953509 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ਕਾਲਾਂ ਅਤੇ ਸੂਚਨਾਵਾਂ ਦੀ ਥਰਥਰਾਹਟ ਹੋਵੇਗੀ"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ਕਾਲਾਂ ਅਤੇ ਸੂਚਨਾਵਾਂ ਨੂੰ ਮਿਊਟ ਕੀਤਾ ਜਾਵੇਗਾ"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"ਸਿਸਟਮ ਬਦਲਾਅ"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ਨਵਾਂ: \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਮੋਡ ਸੂਚਨਾਵਾਂ ਨੂੰ ਲੁਕਾ ਰਿਹਾ ਹੈ"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ਹੋਰ ਜਾਣਨ ਲਈ ਅਤੇ ਬਦਲਾਅ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵਿਕਲਪ ਬਦਲ ਗਿਆ ਹੈ"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"ਟੈਪ ਕਰਕੇ ਦੋਖੋ ਕਿ ਕਿਹੜੀਆਂ ਚੀਜ਼ਾਂ ਬਲਾਕ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ।"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"ਸੂਚਨਾ ਸੈਟਿੰਗਾਂ ਦੀ ਸਮੀਖਿਆ ਕਰੋ"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 ਜਾਂ ਇਸ ਤੋਂ ਬਾਅਦ ਵਾਲੇ ਵਰਜਨਾਂ ਵਿੱਚ, ਤੁਹਾਡੇ ਵੱਲੋਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਜਾਣ ਵਾਲੀਆਂ ਐਪਾਂ ਨੂੰ ਸੂਚਨਾਵਾਂ ਭੇਜਣ ਲਈ ਤੁਹਾਡੀ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। ਮੌਜੂਦਾ ਐਪਾਂ ਲਈ ਇਸ ਇਜਾਜ਼ਤ ਨੂੰ ਬਦਲਣ ਵਾਸਤੇ ਟੈਪ ਕਰੋ।"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"ਬਾਅਦ ਵਿੱਚ ਯਾਦ ਕਰਵਾਓ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 49c30c7..065e9ba 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -2131,11 +2131,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Wibracje przy połączeniach i powiadomieniach"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Wyciszenie połączeń i powiadomień"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Zmiany w systemie"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Nie przeszkadzać"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nowość: w trybie Nie przeszkadzać powiadomienia są ukrywane"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Kliknij, by dowiedzieć się więcej i zmienić ustawienia."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Zmiany w trybie Nie przeszkadzać"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Kliknij, by sprawdzić, co jest zablokowane."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Sprawdź ustawienia powiadomień"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"W Androidzie 13 i nowszych zainstalowane aplikacje będą potrzebowały zezwolenia na wysyłanie powiadomień. Kliknij, aby zmienić uprawnienia dla istniejących aplikacji."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Przypomnij później"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index ff07066..c972e7a 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Chamadas e notificações farão o dispositivo vibrar"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Chamadas e notificações ficarão silenciadas"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Alterações do sistema"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Não perturbe"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novo: o modo Não perturbe está ocultando as notificações"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Toque para saber mais e fazer alterações."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"O modo \"Não perturbe\" foi alterado"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Toque para verificar o que está bloqueado."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Revise as configurações de notificação"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"No Android 13 ou em versões mais recentes, os apps que você instala precisam de permissão para enviar notificações. Toque para mudar essa permissão para os apps já instalados."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Lembrar mais tarde"</string>
@@ -2150,11 +2145,11 @@
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificação foi classificada com maior prioridade. Toque para enviar seu feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificação foi classificada com menor prioridade. Toque para enviar seu feedback."</string>
     <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificações avançadas"</string>
-    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações avançadas. As Notificações adaptáveis do Android não estão mais disponíveis."</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações avançadas. As notificações adaptativas do Android não estão mais disponíveis."</string>
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desativar"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saiba mais"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações avançadas substituíram as notificações adaptáveis. Esse recurso mostra ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações avançadas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender ligações telefônicas e controlar o Não perturbe."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações avançadas substituíram as notificações adaptativas. Esse recurso mostra ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações avançadas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender ligações telefônicas e controlar o Não perturbe."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informação do modo rotina"</string>
     <string name="dynamic_mode_notification_title" msgid="1388718452788985481">"Economia de bateria ativada"</string>
     <string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"Reduzindo o uso da bateria para prolongar a duração dela"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 12245b9..8dddd95 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"As chamadas e as notificações vibram."</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"É desativado o som das chamadas e das notificações."</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Alterações ao sistema"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Não incomodar"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novo: o modo Não incomodar está a ocultar as notificações"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Toque para saber mais e alterar."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"O modo Não incomodar foi alterado"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Toque para verificar o que está bloqueado."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Analise as definições de notificação"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"A partir do Android 13, as apps que instalar precisam da sua autorização para enviar notificações. Toque para alterar esta autorização para as apps existentes."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Lembrar mais tarde"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index ff07066..c972e7a 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Chamadas e notificações farão o dispositivo vibrar"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Chamadas e notificações ficarão silenciadas"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Alterações do sistema"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Não perturbe"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novo: o modo Não perturbe está ocultando as notificações"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Toque para saber mais e fazer alterações."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"O modo \"Não perturbe\" foi alterado"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Toque para verificar o que está bloqueado."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Revise as configurações de notificação"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"No Android 13 ou em versões mais recentes, os apps que você instala precisam de permissão para enviar notificações. Toque para mudar essa permissão para os apps já instalados."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Lembrar mais tarde"</string>
@@ -2150,11 +2145,11 @@
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificação foi classificada com maior prioridade. Toque para enviar seu feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificação foi classificada com menor prioridade. Toque para enviar seu feedback."</string>
     <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificações avançadas"</string>
-    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações avançadas. As Notificações adaptáveis do Android não estão mais disponíveis."</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações avançadas. As notificações adaptativas do Android não estão mais disponíveis."</string>
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desativar"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saiba mais"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações avançadas substituíram as notificações adaptáveis. Esse recurso mostra ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações avançadas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender ligações telefônicas e controlar o Não perturbe."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações avançadas substituíram as notificações adaptativas. Esse recurso mostra ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações avançadas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender ligações telefônicas e controlar o Não perturbe."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informação do modo rotina"</string>
     <string name="dynamic_mode_notification_title" msgid="1388718452788985481">"Economia de bateria ativada"</string>
     <string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"Reduzindo o uso da bateria para prolongar a duração dela"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 85f8592..014a115 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Apelurile și notificările vor vibra"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Apelurile și notificările vor avea sunetul dezactivat"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Modificări de sistem"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Nu deranja"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Funcția nouă Nu deranja ascunde notificările"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Atinge ca să afli mai multe și să modifici"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Funcția Nu deranja s-a schimbat"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Atinge pentru a verifica ce este blocat."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Verifică setările pentru notificări"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Începând cu Android 13, aplicațiile pe care le instalezi necesită permisiunea de a trimite notificări. Atinge ca să modifici permisiunea pentru aplicațiile existente."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Mai târziu"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 6559764..1e819d6 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -2131,11 +2131,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Для звонков и уведомлений включен вибросигнал."</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Для звонков и уведомлений отключен звук."</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Системные изменения"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Не беспокоить"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Теперь в режиме \"Не беспокоить\" уведомления не приходят"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Нажмите, чтобы узнать больше и изменить настройки."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Настройки режима \"Не беспокоить\" изменены"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Нажмите, чтобы проверить настройки."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Проверьте настройки уведомлений"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"В Android 13 и более поздних версий приложения могут отправлять вам уведомления только в том случае, если вы предоставили им такое разрешение. Нажмите, чтобы настроить разрешения для установленных приложений."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Напомнить позже"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index be41512..8c80803 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ඇමතුම් සහ දැනුම්දීම් කම්පනය වනු ඇත"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ඇමතුම් සහ දැනුම්දීම් නිහඬ වනු ඇත"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"පද්ධති වෙනස් කිරීම්"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"බාධා නොකරන්න"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"නව: බාධා නොකරන්න දැනුම්දීම් සඟවමින්"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"තව දැන ගැනීමට සහ වෙනස් කිරීමට තට්ටු කරන්න."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"බාධා නොකරන්න වෙනස් කර ඇත"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"අවහිර කර ඇති දේ පරීක්ෂා කිරීමට තට්ටු කරන්න."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"දැනුම්දීම් සැකසීම් සමාලෝචනය කරන්න"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 හි සිට ආරම්භ වෙමින්, ඔබ ස්ථාපනය කරන යෙදුම්වලට දැනුම්දීම් යැවීමට ඔබගේ අවසරය අවශ්‍ය වේ. තිබෙන යෙදුම් සඳහා මෙම අවසරය වෙනස් කිරීමට තට්ටු කරන්න."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"මට පසුව මතක් කරන්න"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 61d3229..cb3cd61 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -2131,11 +2131,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Hovory a upozornenia budú vibrovať"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Hovory a upozornenia budú stlmené"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Zmeny systému"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Režim bez vyrušení"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novinka: režim bez vyrušení skrýva upozornenia"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Klepnutím získate ďalšie informácie a budete môcť vykonať zmeny."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Režim bez vyrušení sa zmenil"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Klepnutím skontrolujete, čo je blokované."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Kontrola nastavení upozornení"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"V Androide verzie 13 a novších vyžadujú nainštalované aplikácie povolenie, aby mohli odosielať upozornenia. Klepnutím môžete zmeniť toto povolenie pre existujúce aplikácie."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Pripomenúť neskôr"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index ed8cf50..5378875 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -2131,11 +2131,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibriranje bo vklopljeno za klice in obvestila"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Zvonjenje bo izklopljeno za klice in obvestila"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistemske spremembe"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne moti"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novi način »ne moti« skriva obvestila"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Dotaknite se, če želite izvedeti več in spremeniti."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Način »ne moti« je spremenjen"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Dotaknite se, da preverite, kaj je blokirano."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Preglejte nastavitve obvestil"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"V Androidu 13 in novejših različicah bodo aplikacije, ki jih namestite, za pošiljanje obvestil potrebovale vaše dovoljenje. Dotaknite se, če želite spremeniti to dovoljenje za obstoječe aplikacije."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Opomni me pozneje"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index e24e310..4c8dfbc 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Do të lëshojë dridhje për telefonatat dhe njoftimet"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Do të hiqet zëri për telefonatat dhe njoftimet"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Ndryshimet e sistemit"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Mos shqetëso"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"E re: Modaliteti \"Mos shqetëso\" po fsheh njoftimet"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Trokit për të mësuar më shumë dhe për të ndryshuar."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\"Mos shqetëso\" ka ndryshuar"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Trokit për të shënuar atë që është bllokuar"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Rishiko cilësimet e njoftimeve"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Nga Android 13, aplikacionet që instalon kanë nevojë për lejen tënde për të dërguar njoftime. Trokit për ta ndryshuar këtë leje për aplikacionet ekzistuese."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Më kujto më vonë"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 915486e..c9f44db 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -2130,11 +2130,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Вибрација за позиве и обавештења је укључена"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Мелодија звона за позиве и обавештење је искључена"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Системске промене"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Не узнемиравај"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Ново: Режим Не узнемиравај крије обавештења"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Додирните да бисте сазнали више и променили подешавање."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Режим Не узнемиравај је промењен"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Додирните да бисте проверили шта је блокирано."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Прегледајте подешавања обавештења"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Од Android-а 13 апликације које инсталирате морају да имају дозволу за слање обавештења. Додирните да бисте променили ову дозволу за постојеће апликације."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Подсети ме касније"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 0c5b6ac..574b4e8 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -202,7 +202,7 @@
     <string name="work_profile_deleted_reason_maximum_password_failure" msgid="1080323158315663167">"För många försök med lösenord"</string>
     <string name="device_ownership_relinquished" msgid="4080886992183195724">"Administratören tillåter inte längre privat bruk av enheten"</string>
     <string name="private_space_deleted_by_admin" msgid="1484365588862066939">"Privat område har tagits bort"</string>
-    <string name="private_space_deleted_by_admin_details" msgid="7007781735201818689">"Din organisation tillåter inte privata områden på den här hanterade enheten."</string>
+    <string name="private_space_deleted_by_admin_details" msgid="7007781735201818689">"Din organisation tillåter inte privata utrymmen på den här hanterade enheten."</string>
     <string name="network_logging_notification_title" msgid="554983187553845004">"Enheten hanteras"</string>
     <string name="network_logging_notification_text" msgid="1327373071132562512">"Organisationen hanterar den här enheten och kan övervaka nätverkstrafiken. Tryck om du vill veta mer."</string>
     <string name="location_changed_notification_title" msgid="3620158742816699316">"Appar har åtkomst till din plats"</string>
@@ -2009,8 +2009,8 @@
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Nödsituation"</string>
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Ställ in ett skärmlås"</string>
     <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Ställ in skärmlås"</string>
-    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Ställ in ett skärmlås för enheten om du vill använda ditt privata område."</string>
-    <string name="private_space_set_up_screen_lock_for_reset" msgid="7817091386408432097">"Ange ett skärmlås för enheten om du vill radera privat område"</string>
+    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Ställ in ett skärmlås för enheten om du vill använda ditt privata utrymme."</string>
+    <string name="private_space_set_up_screen_lock_for_reset" msgid="7817091386408432097">"Ange ett skärmlås för enheten om du vill radera privat utrymme"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"Appen är inte tillgänglig"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> är inte tillgängligt just nu."</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> är inte tillgänglig"</string>
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibrerar vid samtal och aviseringar"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Ljudet stängs av för samtal och aviseringar"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Systemändringar"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Stör ej"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nytt: Aviseringar döljs av Stör ej"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tryck här om du vill läsa mer och ändra inställningarna."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Stör ej har ändrats"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tryck om du vill se vad som blockeras."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Granska aviseringsinställningarna"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"I Android 13 behöver appar som du installerar behörighet att skicka aviseringar. Tryck om du vill ändra denna behörighet för befintliga appar."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Påminn mig senare"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 8d69834ea..676e7ab 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1338,7 +1338,7 @@
     <string name="network_available_sign_in" msgid="1520342291829283114">"Ingia katika mtandao"</string>
     <!-- no translation found for network_available_sign_in_detailed (7520423801613396556) -->
     <skip />
-    <string name="wifi_no_internet" msgid="1386911698276448061">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> haina uwezo wa kufikia intaneti"</string>
+    <string name="wifi_no_internet" msgid="1386911698276448061">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> haina intaneti"</string>
     <string name="wifi_no_internet_detailed" msgid="634938444133558942">"Gusa ili upate chaguo"</string>
     <string name="mobile_no_internet" msgid="4014455157529909781">"Mtandao wa simu hauna uwezo wa kufikia intaneti"</string>
     <string name="other_networks_no_internet" msgid="6698711684200067033">"Mtandao hauna uwezo wa kufikia intaneti"</string>
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Itatetema arifa ikitumwa au simu ikipigwa"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Haitatoa mlio arifa ikitumwa au simu ikipigwa"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Mabadiliko kwenye mfumo"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Usinisumbue"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Mpya: Kipengele cha Usinisumbue kinaficha arifa"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Gusa ili upate maelezo zaidi na ubadilishe."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Kipengele cha Usinisumbue kimebadilishwa"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Gusa ili uangalie kipengee ambacho kimezuiwa."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Kagua mipangilio ya arifa"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Kuanzia Android toleo la 13, programu unazosakinisha zitahitaji ruhusa yako ili zitume arifa. Gusa ili ubadilishe ruhusa hii kwa programu zilizopo."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Nikumbushe baadaye"</string>
@@ -2408,9 +2403,9 @@
     <string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Muundo wa kibodi umewekwa kuwa <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Gusa ili ubadilishe."</string>
     <string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Mipangilio ya kibodi halisi imewekwa"</string>
     <string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Gusa ili uangalie kibodi"</string>
-    <string name="profile_label_private" msgid="6463418670715290696">"Wa faragha"</string>
+    <string name="profile_label_private" msgid="6463418670715290696">"Faragha"</string>
     <string name="profile_label_clone" msgid="769106052210954285">"Nakala"</string>
-    <string name="profile_label_work" msgid="3495359133038584618">"Wa kazini"</string>
+    <string name="profile_label_work" msgid="3495359133038584618">"Kazini"</string>
     <string name="profile_label_work_2" msgid="4691533661598632135">"Wa 2 wa Kazini"</string>
     <string name="profile_label_work_3" msgid="4834572253956798917">"Wa 3 wa Kazini"</string>
     <string name="profile_label_test" msgid="9168641926186071947">"Jaribio"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index dfc6a79..35cad78 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"அழைப்புகள் மற்றும் அறிவிப்புகளுக்கு அதிரும்"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"அழைப்புகள் மற்றும் அறிவிப்புகளுக்கு ஒலியை முடக்கும்"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"சிஸ்டம் மாற்றங்கள்"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"தொந்தரவு செய்ய வேண்டாம்"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"புதியது: \'தொந்தரவு செய்ய வேண்டாம்\' பயன்முறையானது அறிவிப்புகளைக் காட்டாமல் மறைக்கிறது"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"மேலும் அறிந்து மாற்ற, தட்டவும்."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"தொந்தரவு செய்ய வேண்டாம் அமைப்புகள் மாற்றப்பட்டன"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"எவற்றையெல்லாம் தடுக்கிறது என்பதைப் பார்க்க, தட்டவும்."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"அறிவிப்பு அமைப்புகளை மதிப்பாய்வு செய்யுங்கள்"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 பதிப்பு முதல், நீங்கள் நிறுவுகின்ற ஆப்ஸ் உங்களுக்கு அறிவிப்புகளை அனுப்ப அனுமதி தேவை. ஏற்கெனவே உள்ள ஆப்ஸுக்கு இந்த அனுமதியை மாற்ற தட்டவும்."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"பின்னர் நினைவூட்டு"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 7073266..fd78f1d 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"కాల్స్‌ మరియు నోటిఫికేషన్‌లు వైబ్రేట్ అవుతాయి"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"కాల్స్‌ మరియు నోటిఫికేషన్‌లు మ్యూట్ చేయబడతాయి"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"సిస్టమ్ మార్పులు"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"అంతరాయం కలిగించవద్దు"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"కొత్తది: అంతరాయం కలిగించవద్దు నోటిఫికేషన్‌లను దాస్తోంది"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"మరింత తెలుసుకోవడానికి మరియు మార్చడానికి నొక్కండి."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"అంతరాయం కలిగించవద్దు మార్చబడింది"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"బ్లాక్ చేయబడిన దాన్ని చెక్ చేయడానికి నొక్కండి."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"నోటిఫికేషన్ సెట్టింగ్‌లను రివ్యూ చేయండి"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13తో మొదలుకుని, మీరు ఇన్‌స్టాల్ చేసే యాప్‌లకు నోటిఫికేషన్‌లను పంపడానికి మీ అనుమతి అవసరం. ఇప్పటికే ఉన్న యాప్‌ల కోసం ఈ అనుమతిని మార్చడానికి ట్యాప్ చేయండి."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"తర్వాత గుర్తు చేయి"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 51bb90f..cbac93d 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1735,7 +1735,7 @@
     <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"เปิด"</string>
     <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"ปิด"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"อนุญาตให้ <xliff:g id="SERVICE">%1$s</xliff:g> ควบคุมอุปกรณ์อย่างเต็มที่ไหม"</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"การควบคุมอย่างเต็มที่เหมาะสำหรับแอปเกี่ยวกับความช่วยเหลือพิเศษ แต่ไม่เหมาะสำหรับ​แอปส่วนใหญ่"</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"การควบคุมอย่างเต็มรูปแบบเหมาะสำหรับแอปเกี่ยวกับความช่วยเหลือพิเศษ แต่ไม่เหมาะสำหรับ​แอปส่วนใหญ่"</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"ดูและควบคุมหน้าจอ"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"การควบคุมนี้สามารถอ่านเนื้อหาทั้งหมดบนหน้าจอและแสดงเนื้อหาทับแอปอื่นๆ"</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"ดูและดำเนินการ"</string>
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"สายเรียกเข้าและการแจ้งเตือนจะสั่น"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"สายเรียกเข้าและการแจ้งเตือนจะไม่ส่งเสียง"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"การเปลี่ยนแปลงระบบ"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ห้ามรบกวน"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ใหม่: โหมดห้ามรบกวนซ่อนการแจ้งเตือนไว้"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"แตะเพื่อดูข้อมูลเพิ่มเติมและเปลี่ยนแปลง"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"เปลี่ยน \"ห้ามรบกวน\" แล้ว"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"แตะเพื่อดูรายการที่ถูกบล็อก"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"ตรวจสอบการตั้งค่าการแจ้งเตือน"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"ตั้งแต่ Android 13 เป็นต้นไป แอปที่คุณติดตั้งจะต้องได้รับสิทธิ์จากคุณเพื่อส่งการแจ้งเตือน แตะเพื่อเปลี่ยนแปลงสิทธิ์นี้สำหรับแอปที่มีอยู่"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"เตือนภายหลัง"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index e76dacd..f9edcdc 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Magva-vibrate ang mga tawag at notification"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Mamu-mute ang mga tawag at notification"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Mga pagbabago sa system"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Huwag Istorbohin"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Bago: Itinatago ng Huwag Istorbohin ang mga notification"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"I-tap para matuto pa at baguhin."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Binago ang Huwag Istorbohin"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"I-tap para tingnan kung ano ang naka-block."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Suriin ang mga setting ng notification"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Simula sa Android 13, kakailanganin na ng mga app na ii-install mo ang iyong pahintulot para makapagpadala ng mga notification. I-tap para baguhin ang pahintulot na ito para sa mga kasalukuyang app."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Ipaalala mamaya"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index ad6fc0d..fea0951 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Aramalar ve bildirimler titreşim yapacak"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Aramalar ve bildirimlerin sesi kapalı olacak"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistem değişiklikleri"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Rahatsız Etmeyin"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Yeni: Rahatsız Etmeyin ayarı bildirimleri gizliyor"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Daha fazla bilgi edinmek ve değiştirmek için dokunun."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Rahatsız Etmeyin modu değişti"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Nelerin engellendiğini kontrol etmek için dokunun."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Bildirim ayarlarını inceleyin"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13\'te başlayarak yüklediğiniz uygulamaların bildirim gönderebilmesi için izniniz gereklidir. Mevcut uygulamalarda bu izni değiştirmek için dokunun."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Sonra hatırlat"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index a63f3fb..68f85b8 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -2131,11 +2131,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Вібросигнал для викликів і сповіщень увімкнено"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Звуковий сигнал для викликів і сповіщень вимкнено"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Системні зміни"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Не турбувати"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Нове: у режимі \"Не турбувати\" сповіщення ховаються"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Торкніться, щоб дізнатися більше та змінити."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Налаштування режиму \"Не турбувати\" змінено"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Торкніться, щоб перевірити, що заблоковано."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Перегляньте налаштування сповіщень"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Починаючи з ОС Android 13, установленим додаткам потрібно надати дозвіл, щоб вони могли надсилати сповіщення. Натисніть, щоб змінити цей дозвіл для наявних додатків."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Нагадати пізніше"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 52d9e3b..4f09717 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"کالز اور اطلاعات پر وائبریٹ کرے گا"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"کالز اور اطلاعات کی آواز خاموش کر دی جائے گی"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"سسٹم کی تبدیلیاں"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ڈسٹرب نہ کریں"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"نئی: \'ڈسٹرب نہ کریں\' اطلاعات کو چھپا رہی ہے"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"مزید جاننے اور تبدیل کرنے کیلئے تھپتھپائیں۔"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\'ڈسٹرب نہ کریں\' تبدیل ہو گيا ہے"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"مسدود کی گئی چیزوں کو چیک کرنے کے لیے تھپتھپائیں۔"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"اطلاع کی ترتیبات کا جائزہ لیں"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"‏Android 13 کے ساتھ اب آپ جو بھی ایپس انسٹال کریں گے انہیں اطلاعات بھیجنے کے لیے آپ کی اجازت درکار ہوگی۔ موجودہ ایپس کے لیے اس اجازت کو تبدیل کرنے کی خاطر تھپتھپائیں۔"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"بعد میں یاد دلائیں"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index f62074e..1bb3bcdc 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Chaqiruvlar va bildirishnomalar tebranadi"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Chaqiruvlar va bildirishnomalar ovozsiz qilinadi"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Tizimga oid o‘zgarishlar"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Bezovta qilinmasin"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Yangi: Bezovta qilinmasin rejimi bildirishnomalarni berkitmoqda"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Batafsil axborot olish va o‘zgartirish uchun bosing."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Bezovta qilinmasin rejimi sozlamalari o‘zgartirildi"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Nimalar bloklanganini tekshirish uchun bosing"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Bildirishnoma sozlamalarini tekshiring"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Android 13 versiyasidan boshlab, oʻrnatiladigan ilovalar bildirishnoma yuborish uchun sizdan ruxsat oladi. Mavjud ilovalarda ushbu ruxsatni oʻzgartirish uchun bosing."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Keyinroq eslatilsin"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 3b08a22..3b1b21d 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Cuộc gọi và thông báo sẽ rung"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Cuộc gọi và thông báo sẽ tắt tiếng"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Thay đổi hệ thống"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Không làm phiền"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Mới: Chế độ Không làm phiền sẽ ẩn thông báo"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Nhấn để tìm hiểu thêm và thay đổi."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Cài đặt Không làm phiền đã thay đổi"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Nhấn để xem những thông báo bị chặn."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Xem lại chế độ cài đặt thông báo"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Bắt đầu trên Android 13, các ứng dụng bạn cài đặt sẽ cần bạn cấp quyền để gửi thông báo. Hãy nhấn để thay đổi quyền này cho các ứng dụng hiện có."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Nhắc tôi sau"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 95753eb..e7ebb6c 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"有来电和通知时会振动"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"有来电和通知时会静音"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"系统变更"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"勿扰"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"新功能:勿扰模式目前可隐藏通知"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"点按即可了解详情以及进行更改。"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"“勿扰”设置有变更"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"点按即可查看屏蔽内容。"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"查看通知设置"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"从 Android 13 开始,您安装的应用需要您授予相应权限才能发送通知。点按即可为现有应用更改此权限。"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"稍后提醒我"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index df04ec8..8f7e17c 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"有來電和通知時會震動"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"有來電和通知時會靜音"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"系統變更"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"請勿騷擾"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"新通知:「請勿騷擾」模式目前隱藏通知"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"輕按即可瞭解詳情和作出變更。"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"請勿騷擾已變更"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"輕按即可查看封鎖內容。"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"查看通知設定"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"由 Android 13 開始,你安裝的應用程式須獲得授權才能傳送通知。輕按即可變更現有應用程式的這項權限。"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"稍後提醒我"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index f0351ce..76c581c 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"有來電和通知時會震動"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"有來電和通知時會靜音"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"系統變更"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"零打擾"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"新功能:「零打擾」模式現在可以隱藏通知"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"輕觸即可瞭解詳情及進行變更。"</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"「零打擾」設定已變更"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"輕觸即可查看遭封鎖的項目。"</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"查看通知設定"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"從 Android 13 開始,你安裝的應用程式必須獲得授權,才能傳送通知。輕觸即可為現有應用程式變更這項權限。"</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"稍後提醒我"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index f051a45..5aab13b 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -2129,11 +2129,6 @@
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Amakholi nezaziso zizodlidliza"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Amakholi nezaziso zizothuliswa"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Ushintsho lwesistimu"</string>
-    <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ungaphazamisi"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Ukungaphazamisi kufihle izaziso"</string>
-    <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Thepha ukuze ufunde kabanzi futhi ushintshe."</string>
-    <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Ukungaphazamisi kushintshile"</string>
-    <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Thepha ukuze uhlole ukuthi yini evinjelwe."</string>
     <string name="review_notification_settings_title" msgid="5102557424459810820">"Buyekeza amasethingi wesaziso"</string>
     <string name="review_notification_settings_text" msgid="5916244866751849279">"Kusukela ku-Android 13, ama-app owafakayo adinga imvume yakho yokuthumela izaziso. Thepha ukuze ushintshe le mvume yama-app akhona kakade."</string>
     <string name="review_notification_settings_remind_me_action" msgid="1081081018678480907">"Ngikhumbuze ngesinye isikhathi"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 440219d..02f9f3c 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -7720,6 +7720,44 @@
         <attr name="animation" />
     </declare-styleable>
 
+    <!-- ================================== -->
+    <!-- NotificationProgressDrawable class -->
+    <!-- ================================== -->
+
+    <!-- Drawable used to render a segmented bar, with segments and points. -->
+    <!-- @hide internal use only -->
+    <declare-styleable name="NotificationProgressDrawable">
+        <!-- Default color for the parts. -->
+        <attr name="segSegGap" format="dimension" />
+        <attr name="segPointGap" format="dimension" />
+    </declare-styleable>
+
+    <!-- Used to config the segments of a NotificationProgressDrawable. -->
+    <!-- @hide internal use only -->
+    <declare-styleable name="NotificationProgressDrawableSegments">
+        <!-- Width of the stroke. -->
+        <attr name="width" />
+        <!-- Default color of the stroke. -->
+        <attr name="color" />
+        <!-- Length of a dash in the stroke for the dashed segments. -->
+        <attr name="dashWidth" />
+        <!-- Gap between dashes in the stroke for the dashed segments. -->
+        <attr name="dashGap" />
+    </declare-styleable>
+
+    <!-- Used to config the points of a NotificationProgressDrawable. -->
+    <!-- @hide internal use only -->
+    <declare-styleable name="NotificationProgressDrawablePoints">
+        <!-- Radius (1/2 size) of the point rect. -->
+        <attr name="radius" />
+        <!-- Inset of the point icon or rect. -->
+        <attr name="inset" />
+        <!-- Corner radius of the point rect. -->
+        <attr name="cornerRadius" format="dimension" />
+        <!-- Default color of the point rect. -->
+        <attr name="color" />
+    </declare-styleable>
+
     <!-- ========================== -->
     <!-- Animation class attributes -->
     <!-- ========================== -->
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 07efad8..8a2d767 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1250,6 +1250,7 @@
          a watch, setting this config is no-op.
             0 - Nothing
             1 - Switch to the recent app
+            2 - Launch the default fitness app
     -->
     <integer name="config_doublePressOnStemPrimaryBehavior">0</integer>
 
@@ -1528,6 +1529,11 @@
         factory reset. -->
     <bool name="config_enableCredentialFactoryResetProtection">true</bool>
 
+    <!-- If true, then work around broken Weaver HALs that don't work reliably before the device has
+         fully booted. Setting this to true weakens a security feature; it should be done only when
+         necessary, though it is still better than not using Weaver at all. -->
+    <bool name="config_disableWeaverOnUnsecuredUsers">false</bool>
+
     <!-- Control the behavior when the user long presses the home button.
             0 - Nothing
             1 - Launch all apps intent
@@ -2309,10 +2315,6 @@
          spatial audio is enabled for a newly connected audio device -->
     <bool name="config_spatial_audio_head_tracking_enabled_default">false</bool>
 
-    <!-- Flag indicating whether platform level volume adjustments are enabled for remote sessions
-         on grouped devices. -->
-    <bool name="config_volumeAdjustmentForRemoteGroupSessions">true</bool>
-
     <!-- Flag indicating current media Output Switcher version. -->
     <integer name="config_mediaOutputSwitchDialogVersion">1</integer>
 
@@ -4457,6 +4459,11 @@
     <!-- Bytes that the PinnerService will pin for WebView -->
     <integer name="config_pinnerWebviewPinBytes">0</integer>
 
+    <!-- Maximum memory that PinnerService will pin for apps expressed
+         as a percentage of total device memory [0,100].
+         Example: 10, means 10% of total memory will be the maximum pinned memory -->
+    <integer name="config_pinnerMaxPinnedMemoryPercentage">10</integer>
+
     <!-- Number of days preloaded file cache should be preserved on a device before it can be
          deleted -->
     <integer name="config_keepPreloadsMinDays">7</integer>
@@ -6178,6 +6185,10 @@
         is enabled and activity is connected to the camera in fullscreen. -->
     <bool name="config_isWindowManagerCameraCompatSplitScreenAspectRatioEnabled">false</bool>
 
+    <!-- Which aspect ratio to use when camera compat treatment is enabled and an activity eligible
+        for treatment is connected to the camera. -->
+    <item name="config_windowManagerCameraCompatAspectRatio" format="float" type="dimen">1.0</item>
+
     <!-- Docking is a uiMode configuration change and will cause activities to relaunch if it's not
          handled. If true, the configuration change will be sent but activities will not be
          relaunched upon docking. Apps with desk resources will behave like normal, since they may
@@ -6907,6 +6918,14 @@
          entering the corresponding modes -->
     <string name="config_rearDisplayPhysicalAddress" translatable="false"></string>
 
+    <!-- The maximum number of virtual displays that can exist at the same time.
+         It must be >= 1. -->
+    <integer name="config_virtualDisplayLimit">100</integer>
+
+    <!-- The maximum number of virtual displays per package that can exist at the same time.
+         It must be >= 1. -->
+    <integer name="config_virtualDisplayLimitPerPackage">50</integer>
+
     <!-- List of certificate to be used for font fs-verity integrity verification -->
     <string-array translatable="false" name="config_fontManagerServiceCerts">
     </string-array>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index f397ef2..b92aa2f 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -304,6 +304,9 @@
     <!-- The top margin before the notification progress bar. -->
     <dimen name="notification_progress_margin_top">8dp</dimen>
 
+    <!-- The horizontal margin before and after the notification progress bar. -->
+    <dimen name="notification_progress_margin_horizontal">2dp</dimen>
+
     <!-- height of the notification header -->
     <dimen name="notification_header_height">56dp</dimen>
 
@@ -808,6 +811,12 @@
          This is bigger than displayed because listeners can use it for other displays
          e.g. wearables. -->
     <dimen name="notification_person_icon_max_size">144dp</dimen>
+    <!-- The size of the progress bar icon -->
+    <dimen name="notification_progress_icon_size">20dp</dimen>
+    <!-- The size of the progress tracker width -->
+    <dimen name="notification_progress_tracker_width">40dp</dimen>
+    <!-- The size of the progress tracker height -->
+    <dimen name="notification_progress_tracker_height">20dp</dimen>
 
     <!-- The maximum size of the small notification icon on low memory devices. -->
     <dimen name="notification_small_icon_size_low_ram">@dimen/notification_small_icon_size</dimen>
diff --git a/core/res/res/values/public-staging.xml b/core/res/res/values/public-staging.xml
index b74b41c..8121545 100644
--- a/core/res/res/values/public-staging.xml
+++ b/core/res/res/values/public-staging.xml
@@ -118,6 +118,9 @@
     <public name="languageSettingsActivity"/>
     <!-- @FlaggedApi("android.service.controls.flags.Flags.FLAG_HOME_PANEL_DREAM") -->
     <public name="dreamCategory"/>
+    <!-- @FlaggedApi("android.permission.flags.replace_body_sensor_permission_enabled")
+         @hide @SystemApi -->
+    <public name="backgroundPermission"/>
   </staging-public-group>
 
   <staging-public-group type="id" first-id="0x01b60000">
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index d634210..7aca535 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -5818,16 +5818,6 @@
 
     <!-- Title for the notification channel notifying user of settings system changes. [CHAR LIMIT=NONE] -->
     <string name="notification_channel_system_changes">System changes</string>
-    <!-- Title for the notification channel notifying user of do not disturb system changes (i.e. Do Not Disturb has changed). [CHAR LIMIT=NONE] -->
-    <string name="notification_channel_do_not_disturb">Do Not Disturb</string>
-    <!-- Title of notification indicating do not disturb visual interruption settings have changed when upgrading to P -->
-    <string name="zen_upgrade_notification_visd_title">New: Do Not Disturb is hiding notifications</string>
-    <!-- Content of notification indicating users can tap on the notification to go to dnd behavior settings -->
-    <string name="zen_upgrade_notification_visd_content">Tap to learn more and change.</string>
-    <!-- Title of notification indicating do not disturb settings have changed when upgrading to P -->
-    <string name="zen_upgrade_notification_title">Do Not Disturb has changed</string>
-    <!-- Content of notification indicating users can tap on the notification to go to dnd behavior settings -->
-    <string name="zen_upgrade_notification_content">Tap to check what\'s blocked.</string>
 
     <!-- Notification permission informational notification text -->
     <!-- Title for notification inviting users to review their notification settings [CHAR LIMIT=NONE] -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 06b36b8..c1893ab 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -224,6 +224,8 @@
   <java-symbol type="id" name="status_bar_latest_event_content" />
   <java-symbol type="id" name="notification_main_column" />
   <java-symbol type="id" name="notification_headerless_view_column" />
+  <java-symbol type="id" name="notification_progress_start_icon" />
+  <java-symbol type="id" name="notification_progress_end_icon" />
   <java-symbol type="id" name="sms_short_code_confirm_message" />
   <java-symbol type="id" name="sms_short_code_detail_layout" />
   <java-symbol type="id" name="sms_short_code_detail_message" />
@@ -2390,6 +2392,7 @@
   <java-symbol type="layout" name="notification_template_material_media" />
   <java-symbol type="layout" name="notification_template_material_big_media" />
   <java-symbol type="layout" name="notification_template_material_big_text" />
+  <java-symbol type="layout" name="notification_template_material_progress" />
   <java-symbol type="layout" name="notification_template_header" />
   <java-symbol type="layout" name="notification_material_media_action" />
   <java-symbol type="color" name="notification_progress_background_color" />
@@ -3205,6 +3208,7 @@
   <java-symbol type="dimen" name="notification_heading_margin_end" />
   <java-symbol type="dimen" name="notification_content_margin_top" />
   <java-symbol type="dimen" name="notification_content_margin" />
+  <java-symbol type="dimen" name="notification_progress_margin_horizontal" />
   <java-symbol type="dimen" name="notification_header_background_height" />
   <java-symbol type="dimen" name="notification_header_touchable_height" />
   <java-symbol type="dimen" name="notification_header_expand_icon_size" />
@@ -3467,6 +3471,7 @@
   <java-symbol type="integer" name="config_pinnerHomePinBytes" />
   <java-symbol type="bool" name="config_pinnerAssistantApp" />
   <java-symbol type="integer" name="config_pinnerWebviewPinBytes" />
+  <java-symbol type="integer" name="config_pinnerMaxPinnedMemoryPercentage" />
 
   <java-symbol type="string" name="config_doubleTouchGestureEnableFile" />
 
@@ -3854,6 +3859,9 @@
   <java-symbol type="dimen" name="notification_custom_view_max_image_height"/>
   <java-symbol type="dimen" name="notification_custom_view_max_image_width"/>
   <java-symbol type="dimen" name="notification_person_icon_max_size" />
+  <java-symbol type="dimen" name="notification_progress_icon_size" />
+  <java-symbol type="dimen" name="notification_progress_tracker_width" />
+  <java-symbol type="dimen" name="notification_progress_tracker_height" />
 
   <java-symbol type="dimen" name="notification_small_icon_size_low_ram"/>
   <java-symbol type="dimen" name="notification_big_picture_max_height_low_ram"/>
@@ -3933,7 +3941,6 @@
   <java-symbol type="string" name="notification_channel_usb" />
   <java-symbol type="string" name="notification_channel_heavy_weight_app" />
   <java-symbol type="string" name="notification_channel_system_changes" />
-  <java-symbol type="string" name="notification_channel_do_not_disturb" />
   <java-symbol type="string" name="notification_channel_accessibility_magnification" />
   <java-symbol type="string" name="notification_channel_accessibility_security_policy" />
   <java-symbol type="string" name="notification_channel_display" />
@@ -3985,6 +3992,7 @@
   <java-symbol type="string" name="foreground_service_multiple_separator" />
 
   <java-symbol type="bool" name="config_enableCredentialFactoryResetProtection" />
+  <java-symbol type="bool" name="config_disableWeaverOnUnsecuredUsers" />
 
   <!-- ETWS primary messages -->
   <java-symbol type="string" name="etws_primary_default_message_earthquake" />
@@ -4072,6 +4080,7 @@
   <java-symbol type="dimen" name="text_size_body_2_material" />
   <java-symbol type="dimen" name="notification_icon_circle_size" />
   <java-symbol type="drawable" name="notification_icon_circle" />
+  <java-symbol type="drawable" name="notification_progress_icon_background" />
   <java-symbol type="dimen" name="messaging_avatar_size" />
   <java-symbol type="dimen" name="messaging_group_sending_progress_size" />
   <java-symbol type="dimen" name="messaging_image_rounding" />
@@ -4160,11 +4169,6 @@
   <!-- For Wear devices -->
   <java-symbol type="array" name="config_wearActivityModeRadios" />
 
-  <java-symbol type="string" name="zen_upgrade_notification_title" />
-  <java-symbol type="string" name="zen_upgrade_notification_content" />
-  <java-symbol type="string" name="zen_upgrade_notification_visd_title" />
-  <java-symbol type="string" name="zen_upgrade_notification_visd_content" />
-
   <java-symbol type="string" name="review_notification_settings_title" />
   <java-symbol type="string" name="review_notification_settings_text" />
   <java-symbol type="string" name="review_notification_settings_remind_me_action" />
@@ -4774,6 +4778,7 @@
   <java-symbol type="bool" name="config_isCompatFakeFocusEnabled" />
   <java-symbol type="bool" name="config_isWindowManagerCameraCompatTreatmentEnabled" />
   <java-symbol type="bool" name="config_isWindowManagerCameraCompatSplitScreenAspectRatioEnabled" />
+  <java-symbol type="dimen" name="config_windowManagerCameraCompatAspectRatio" />
   <java-symbol type="bool" name="config_skipActivityRelaunchWhenDocking" />
 
   <java-symbol type="bool" name="config_hideDisplayCutoutWithDisplayArea" />
@@ -5097,8 +5102,6 @@
 
   <java-symbol type="dimen" name="config_wallpaperDimAmount" />
 
-  <java-symbol type="bool" name="config_volumeAdjustmentForRemoteGroupSessions" />
-
   <java-symbol type="integer" name="config_mediaOutputSwitchDialogVersion" />
 
   <!-- List of shared library packages that should be loaded by the classloader after the
@@ -5237,6 +5240,9 @@
   <java-symbol type="integer" name="config_deviceStateConcurrentRearDisplay" />
   <java-symbol type="string" name="config_rearDisplayPhysicalAddress" />
 
+  <java-symbol type="integer" name="config_virtualDisplayLimit" />
+  <java-symbol type="integer" name="config_virtualDisplayLimitPerPackage" />
+
   <!-- For app language picker -->
   <java-symbol type="string" name="system_locale_title" />
   <java-symbol type="layout" name="app_language_picker_system_default" />
diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp
index e9ce712..56e18e6 100644
--- a/core/tests/coretests/Android.bp
+++ b/core/tests/coretests/Android.bp
@@ -25,6 +25,7 @@
         "BinderProxyCountingTestApp/src/**/*.java",
         "BinderProxyCountingTestService/src/**/*.java",
         "BinderDeathRecipientHelperApp/src/**/*.java",
+        "AppThatCallsBinderMethods/src/**/*.kt",
     ],
     visibility: ["//visibility:private"],
 }
@@ -144,6 +145,7 @@
         ":BinderProxyCountingTestApp",
         ":BinderProxyCountingTestService",
         ":AppThatUsesAppOps",
+        ":AppThatCallsBinderMethods",
     ],
 }
 
@@ -248,7 +250,7 @@
         "androidx.test.rules",
         "androidx.test.ext.junit",
         "androidx.test.uiautomator_uiautomator",
-        "compatibility-device-util-axt",
+        "compatibility-device-util-axt-ravenwood",
         "flag-junit",
         "platform-test-annotations",
         "flag-junit",
diff --git a/core/tests/coretests/AndroidTest.xml b/core/tests/coretests/AndroidTest.xml
index b1f1e2c..05ab783 100644
--- a/core/tests/coretests/AndroidTest.xml
+++ b/core/tests/coretests/AndroidTest.xml
@@ -26,6 +26,7 @@
         <option name="test-file-name" value="BinderProxyCountingTestApp.apk" />
         <option name="test-file-name" value="BinderProxyCountingTestService.apk" />
         <option name="test-file-name" value="AppThatUsesAppOps.apk" />
+        <option name="test-file-name" value="AppThatCallsBinderMethods.apk" />
     </target_preparer>
 
     <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
diff --git a/core/tests/coretests/AppThatCallsBinderMethods/Android.bp b/core/tests/coretests/AppThatCallsBinderMethods/Android.bp
new file mode 100644
index 0000000..dcc0d4f
--- /dev/null
+++ b/core/tests/coretests/AppThatCallsBinderMethods/Android.bp
@@ -0,0 +1,20 @@
+// Copyright (C) 2024 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.
+
+android_test_helper_app {
+    name: "AppThatCallsBinderMethods",
+    srcs: ["src/**/*.kt"],
+    platform_apis: true,
+    static_libs: ["coretests-aidl"],
+}
diff --git a/core/tests/coretests/AppThatCallsBinderMethods/AndroidManifest.xml b/core/tests/coretests/AppThatCallsBinderMethods/AndroidManifest.xml
new file mode 100644
index 0000000..b2f6d78
--- /dev/null
+++ b/core/tests/coretests/AppThatCallsBinderMethods/AndroidManifest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.frameworks.coretests.methodcallerhelperapp">
+    <application>
+        <receiver android:name="com.android.frameworks.coretests.methodcallerhelperapp.CallMethodsReceiver"
+                  android:exported="true"/>
+    </application>
+
+</manifest>
diff --git a/core/tests/coretests/AppThatCallsBinderMethods/src/com/android/frameworks/coretests/methodcallerhelperapp/CallMethodsReceiver.kt b/core/tests/coretests/AppThatCallsBinderMethods/src/com/android/frameworks/coretests/methodcallerhelperapp/CallMethodsReceiver.kt
new file mode 100644
index 0000000..638cc3b
--- /dev/null
+++ b/core/tests/coretests/AppThatCallsBinderMethods/src/com/android/frameworks/coretests/methodcallerhelperapp/CallMethodsReceiver.kt
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2024 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.frameworks.coretests.methodcallerhelperapp
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.util.Log
+
+import com.android.frameworks.coretests.aidl.ITestInterface
+
+/**
+ * Receiver used to call methods when a binder is received
+ * {@link android.os.BinderUncaughtExceptionHandlerTest}.
+ */
+class CallMethodsReceiver : BroadcastReceiver() {
+    private val TAG = "CallMethodsReceiver"
+
+    override fun onReceive(context: Context, intent: Intent) {
+        try {
+            when (intent.getAction()) {
+                ACTION_CALL_METHOD -> intent.getExtras()!!.let {
+                    Log.i(TAG, "Received ACTION_CALL_METHOD with extras: $it")
+                    val iface = it.getBinder(EXTRA_BINDER)!!.let(ITestInterface.Stub::asInterface)!!
+                    val name = it.getString(EXTRA_METHOD_NAME)!!
+                    try {
+                        when (name) {
+                            "foo" -> iface.foo(5)
+                            "onewayFoo" -> iface.onewayFoo(5)
+                            "bar" -> iface.bar(5)
+                            else -> Log.e(TAG, "Unknown method name")
+                        }
+                    } catch (e: Exception) {
+                        // Exceptions expected
+                    }
+                }
+                else -> Log.e(TAG, "Unknown action " + intent.getAction())
+            }
+        } catch (e: Exception) {
+            Log.e(TAG, "Exception: ", e)
+        }
+    }
+}
diff --git a/core/tests/coretests/AppThatCallsBinderMethods/src/com/android/frameworks/coretests/methodcallerhelperapp/Constants.kt b/core/tests/coretests/AppThatCallsBinderMethods/src/com/android/frameworks/coretests/methodcallerhelperapp/Constants.kt
new file mode 100644
index 0000000..37c6268
--- /dev/null
+++ b/core/tests/coretests/AppThatCallsBinderMethods/src/com/android/frameworks/coretests/methodcallerhelperapp/Constants.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2024 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.frameworks.coretests.methodcallerhelperapp
+
+const val PACKAGE_NAME = "com.android.frameworks.coretests.methodcallerhelperapp"
+const val RECEIVER_NAME = "CallMethodsReceiver"
+const val ACTION_CALL_METHOD = PACKAGE_NAME + ".ACTION_CALL_METHOD"
+const val EXTRA_METHOD_NAME = PACKAGE_NAME + ".EXTRA_METHOD_NAME"
+const val EXTRA_BINDER = PACKAGE_NAME + ".EXTRA_BINDER"
diff --git a/core/tests/coretests/aidl/com/android/frameworks/coretests/aidl/ITestInterface.aidl b/core/tests/coretests/aidl/com/android/frameworks/coretests/aidl/ITestInterface.aidl
new file mode 100644
index 0000000..ffcf178
--- /dev/null
+++ b/core/tests/coretests/aidl/com/android/frameworks/coretests/aidl/ITestInterface.aidl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2024 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.frameworks.coretests.aidl;
+
+/**
+ * Just an interface with a oneway, void and non-oneway method.
+ */
+interface ITestInterface {
+    // Method order matters, since we verify transaction codes
+    int foo(int a);
+    oneway void onewayFoo(int a);
+    void bar(int a);
+}
diff --git a/core/tests/coretests/src/android/app/NotificationTest.java b/core/tests/coretests/src/android/app/NotificationTest.java
index 0f73df9..48e2620 100644
--- a/core/tests/coretests/src/android/app/NotificationTest.java
+++ b/core/tests/coretests/src/android/app/NotificationTest.java
@@ -97,7 +97,6 @@
 import android.text.style.StyleSpan;
 import android.text.style.TextAppearanceSpan;
 import android.util.Pair;
-import android.util.Slog;
 import android.widget.RemoteViews;
 
 import androidx.test.InstrumentationRegistry;
@@ -118,6 +117,7 @@
 import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.function.Consumer;
 
@@ -439,6 +439,27 @@
     }
 
     @Test
+    @EnableFlags({Flags.FLAG_UI_RICH_ONGOING, Flags.FLAG_API_RICH_ONGOING})
+    public void testHasPromotableStyle_progress() {
+        Notification n = new Notification.Builder(mContext, "test")
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .setStyle(new Notification.ProgressStyle())
+                .build();
+        assertThat(n.hasPromotableStyle()).isTrue();
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_UI_RICH_ONGOING})
+    public void testHasPromotableStyle_unknownStyle() {
+        Notification n = new Notification.Builder(mContext, "test")
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .setStyle(new NotAPlatformStyle())
+                .build();
+
+        assertThat(n.hasPromotableStyle()).isTrue();
+    }
+
+    @Test
     @EnableFlags(Flags.FLAG_UI_RICH_ONGOING)
     public void testHasPromotableCharacteristics() {
         Notification n = new Notification.Builder(mContext, "test")
@@ -2114,6 +2135,300 @@
         assertThat(n.getWhen()).isEqualTo(9);
     }
 
+    @Test
+    public void getNotificationStyleClass_forPlatformClassName_returnsPlatformClass() {
+        final List<Class<? extends Notification.Style>> platformStyleClasses = List.of(
+                Notification.BigTextStyle.class, Notification.BigPictureStyle.class,
+                Notification.MessagingStyle.class, Notification.CallStyle.class,
+                Notification.InboxStyle.class, Notification.MediaStyle.class,
+                Notification.DecoratedCustomViewStyle.class,
+                Notification.DecoratedMediaCustomViewStyle.class
+        );
+
+        for (Class<? extends Notification.Style> platformStyleClass : platformStyleClasses) {
+            assertThat(Notification.getNotificationStyleClass(platformStyleClass.getName()))
+                    .isEqualTo(platformStyleClass);
+        }
+    }
+
+    @Test
+    public void getNotificationStyleClass_forNotPlatformClassName_returnsNull() {
+        assertThat(Notification.getNotificationStyleClass(NotAPlatformStyle.class.getName()))
+                .isNull();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_richOngoingEnabled_platformClass() {
+        assertThat(
+                Notification.getNotificationStyleClass(Notification.ProgressStyle.class.getName()))
+                .isEqualTo(Notification.ProgressStyle.class);
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_richOngoingDisabled_notPlatformClass() {
+        assertThat(
+                Notification.getNotificationStyleClass(Notification.ProgressStyle.class.getName()))
+                .isNull();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_onSegmentChange_visiblyDifferent() {
+        final Notification.Builder nProgress1 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle()
+                        .addProgressSegment(new Notification.ProgressStyle.Segment(100))
+                        .addProgressSegment(new Notification.ProgressStyle.Segment(50)
+                                .setColor(Color.RED)));
+
+        final Notification.Builder nProgress2 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle()
+                        .addProgressSegment(new Notification.ProgressStyle.Segment(100))
+                        .addProgressSegment(new Notification.ProgressStyle.Segment(50)
+                                .setColor(Color.BLUE)));
+
+        assertThat(Notification.areStyledNotificationsVisiblyDifferent(nProgress1, nProgress2))
+                .isTrue();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void indeterminateProgressStyle_onSegmentChange_visiblyNotDifferent() {
+        final Notification.Builder nProgress1 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgressIndeterminate(true)
+                        .addProgressSegment(new Notification.ProgressStyle.Segment(100))
+                        .addProgressSegment(new Notification.ProgressStyle.Segment(50)
+                                .setColor(Color.RED)));
+
+        final Notification.Builder nProgress2 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgressIndeterminate(true)
+                        .addProgressSegment(new Notification.ProgressStyle.Segment(100))
+                        .addProgressSegment(new Notification.ProgressStyle.Segment(50)
+                                .setColor(Color.BLUE)));
+
+        assertThat(Notification.areStyledNotificationsVisiblyDifferent(nProgress1, nProgress2))
+                .isFalse();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_onStartIconChange_visiblyDifferent() {
+        final Icon icon1 = Icon.createWithBitmap(BitmapFactory.decodeResource(
+                mContext.getResources(), com.android.frameworks.coretests.R.drawable.test128x96));
+
+        final Icon icon2 = Icon.createWithBitmap(
+                Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888));
+
+        final Notification.Builder nProgress1 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgressStartIcon(icon1));
+        final Notification.Builder nProgress2 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgressStartIcon(icon2));
+
+        assertThat(Notification.areStyledNotificationsVisiblyDifferent(nProgress1, nProgress2))
+                .isTrue();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_onEndIconChange_visiblyDifferent() {
+        final Icon icon1 = Icon.createWithBitmap(BitmapFactory.decodeResource(
+                mContext.getResources(), com.android.frameworks.coretests.R.drawable.test128x96));
+
+        final Icon icon2 = Icon.createWithBitmap(
+                Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888));
+
+        final Notification.Builder nProgress1 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgressEndIcon(icon1));
+        final Notification.Builder nProgress2 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgressEndIcon(icon2));
+
+        assertThat(Notification.areStyledNotificationsVisiblyDifferent(nProgress1, nProgress2))
+                .isTrue();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_onProgressChange_visiblyDifferent() {
+        final Notification.Builder nProgress1 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgress(20));
+        final Notification.Builder nProgress2 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgress(21));
+
+        assertThat(Notification.areStyledNotificationsVisiblyDifferent(nProgress1, nProgress2))
+                .isTrue();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void indeterminateProgressStyle_onProgressChange_visiblyNotDifferent() {
+        final Notification.Builder nProgress1 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle()
+                        .setProgressIndeterminate(true).setProgress(20));
+        final Notification.Builder nProgress2 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle()
+                        .setProgressIndeterminate(true).setProgress(21));
+
+        assertThat(Notification.areStyledNotificationsVisiblyDifferent(nProgress1, nProgress2))
+                .isFalse();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_onIsStyledByProgressChange_visiblyDifferent() {
+        final Notification.Builder nProgress1 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setStyledByProgress(true));
+        final Notification.Builder nProgress2 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setStyledByProgress(false));
+
+        assertThat(Notification.areStyledNotificationsVisiblyDifferent(nProgress1, nProgress2))
+                .isTrue();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void indeterminateProgressStyle_onIsStyledByProgressChange_visiblyNotDifferent() {
+        final Notification.Builder nProgress1 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle()
+                        .setProgressIndeterminate(true).setStyledByProgress(true));
+        final Notification.Builder nProgress2 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle()
+                        .setProgressIndeterminate(true).setStyledByProgress(false));
+
+        assertThat(Notification.areStyledNotificationsVisiblyDifferent(nProgress1, nProgress2))
+                .isFalse();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_onProgressPointChange_visiblyDifferent() {
+        final Notification.Builder nProgress1 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle()
+                        .addProgressPoint(new Notification.ProgressStyle.Point(10)));
+        final Notification.Builder nProgress2 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle()
+                        .addProgressPoint(new Notification.ProgressStyle.Point(12)));
+
+        assertThat(Notification.areStyledNotificationsVisiblyDifferent(nProgress1, nProgress2))
+                .isTrue();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void indeterminateProgressStyle_onProgressPointChange_visiblyNotDifferent() {
+        final Notification.Builder nProgress1 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgressIndeterminate(true)
+                        .addProgressPoint(new Notification.ProgressStyle.Point(10)));
+        final Notification.Builder nProgress2 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgressIndeterminate(true)
+                        .addProgressPoint(new Notification.ProgressStyle.Point(12)));
+
+        assertThat(Notification.areStyledNotificationsVisiblyDifferent(nProgress1, nProgress2))
+                .isFalse();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_onTrackerIconChange_visiblyDifferent() {
+        final Icon icon1 = Icon.createWithBitmap(BitmapFactory.decodeResource(
+                mContext.getResources(), com.android.frameworks.coretests.R.drawable.test128x96));
+
+        final Icon icon2 = Icon.createWithBitmap(
+                Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888));
+
+        final Notification.Builder nProgress1 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgressTrackerIcon(icon1));
+        final Notification.Builder nProgress2 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgressTrackerIcon(icon2));
+
+        assertThat(Notification.areStyledNotificationsVisiblyDifferent(nProgress1, nProgress2))
+                .isTrue();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void indeterminateProgressStyle_onTrackerIconChange_visiblyNotDifferent() {
+        final Icon icon1 = Icon.createWithBitmap(BitmapFactory.decodeResource(
+                mContext.getResources(), com.android.frameworks.coretests.R.drawable.test128x96));
+
+        final Icon icon2 = Icon.createWithBitmap(
+                Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888));
+
+        final Notification.Builder nProgress1 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgressIndeterminate(true)
+                        .setProgressTrackerIcon(icon1));
+        final Notification.Builder nProgress2 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle()
+                        .setProgressIndeterminate(true).setProgressTrackerIcon(icon2));
+
+        assertThat(Notification.areStyledNotificationsVisiblyDifferent(nProgress1, nProgress2))
+                .isFalse();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_onIndeterminateChange_visiblyDifferent() {
+        final Notification.Builder nProgress1 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgressIndeterminate(true));
+        final Notification.Builder nProgress2 = new Notification.Builder(mContext, "test")
+                .setStyle(new Notification.ProgressStyle().setProgressIndeterminate(false));
+
+        assertThat(Notification.areStyledNotificationsVisiblyDifferent(nProgress1, nProgress2))
+                .isTrue();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_getProgressMax_default100() {
+        final Notification.ProgressStyle progressStyle = new Notification.ProgressStyle();
+        assertThat(progressStyle.getProgressMax()).isEqualTo(100);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_getProgressMax_nooSegments_returnsDefault() {
+        final Notification.ProgressStyle progressStyle = new Notification.ProgressStyle();
+        progressStyle.setProgressSegments(Collections.emptyList());
+        assertThat(progressStyle.getProgressMax()).isEqualTo(100);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_getProgressMax_returnsSumOfSegmentLength() {
+        final Notification.ProgressStyle progressStyle = new Notification.ProgressStyle();
+        progressStyle
+                .addProgressSegment(new Notification.ProgressStyle.Segment(10))
+                .addProgressSegment(new Notification.ProgressStyle.Segment(20));
+
+        assertThat(progressStyle.getProgressMax()).isEqualTo(30);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_getProgressMax_onSegmentOverflow_returnsDefault() {
+        final Notification.ProgressStyle progressStyle = new Notification.ProgressStyle();
+        progressStyle
+                .addProgressSegment(new Notification.ProgressStyle.Segment(Integer.MAX_VALUE))
+                .addProgressSegment(new Notification.ProgressStyle.Segment(10));
+
+        assertThat(progressStyle.getProgressMax()).isEqualTo(100);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_indeterminate_defaultValueFalse() {
+        final Notification.ProgressStyle progressStyle1 = new Notification.ProgressStyle();
+
+        assertThat(progressStyle1.isProgressIndeterminate()).isFalse();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_styledByProgress_defaultValueTrue() {
+        final Notification.ProgressStyle progressStyle1 = new Notification.ProgressStyle();
+
+        assertThat(progressStyle1.isStyledByProgress()).isTrue();
+    }
     private void assertValid(Notification.Colors c) {
         // Assert that all colors are populated
         assertThat(c.getBackgroundColor()).isNotEqualTo(Notification.COLOR_INVALID);
@@ -2214,4 +2529,11 @@
                 new Intent(action).setPackage(mContext.getPackageName()),
                 PendingIntent.FLAG_MUTABLE);
     }
+
+    private static class NotAPlatformStyle extends Notification.Style {
+        @Override
+        public boolean areNotificationsVisiblyDifferent(Notification.Style other) {
+            return false;
+        }
+    }
 }
diff --git a/core/tests/coretests/src/android/content/pm/verify/VerificationSessionTest.java b/core/tests/coretests/src/android/content/pm/verify/VerificationSessionTest.java
new file mode 100644
index 0000000..987f68d
--- /dev/null
+++ b/core/tests/coretests/src/android/content/pm/verify/VerificationSessionTest.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2024 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 android.content.pm.verify;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.pm.SharedLibraryInfo;
+import android.content.pm.SigningInfo;
+import android.content.pm.VersionedPackage;
+import android.content.pm.verify.pkg.IVerificationSessionCallback;
+import android.content.pm.verify.pkg.IVerificationSessionInterface;
+import android.content.pm.verify.pkg.VerificationSession;
+import android.content.pm.verify.pkg.VerificationStatus;
+import android.net.Uri;
+import android.os.Parcel;
+import android.os.PersistableBundle;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class VerificationSessionTest {
+    private static final int TEST_ID = 100;
+    private static final int TEST_INSTALL_SESSION_ID = 33;
+    private static final String TEST_PACKAGE_NAME = "com.foo";
+    private static final Uri TEST_PACKAGE_URI = Uri.parse("test://test");
+    private static final SigningInfo TEST_SIGNING_INFO = new SigningInfo();
+    private static final SharedLibraryInfo TEST_SHARED_LIBRARY_INFO1 =
+            new SharedLibraryInfo("sharedLibPath1", TEST_PACKAGE_NAME,
+                    Collections.singletonList("path1"), "sharedLib1", 101,
+                    SharedLibraryInfo.TYPE_DYNAMIC, new VersionedPackage(TEST_PACKAGE_NAME, 1),
+                    null, null, false);
+    private static final SharedLibraryInfo TEST_SHARED_LIBRARY_INFO2 =
+            new SharedLibraryInfo("sharedLibPath2", TEST_PACKAGE_NAME,
+                    Collections.singletonList("path2"), "sharedLib2", 102,
+                    SharedLibraryInfo.TYPE_DYNAMIC,
+                    new VersionedPackage(TEST_PACKAGE_NAME, 2), null, null, false);
+    private static final long TEST_TIMEOUT_TIME = System.currentTimeMillis();
+    private static final long TEST_EXTEND_TIME = 2000L;
+    private static final String TEST_KEY = "test key";
+    private static final String TEST_VALUE = "test value";
+
+    private final ArrayList<SharedLibraryInfo> mTestDeclaredLibraries = new ArrayList<>();
+    private final PersistableBundle mTestExtensionParams = new PersistableBundle();
+    @Mock
+    private IVerificationSessionInterface mTestSessionInterface;
+    @Mock
+    private IVerificationSessionCallback mTestCallback;
+    private VerificationSession mTestSession;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mTestDeclaredLibraries.add(TEST_SHARED_LIBRARY_INFO1);
+        mTestDeclaredLibraries.add(TEST_SHARED_LIBRARY_INFO2);
+        mTestExtensionParams.putString(TEST_KEY, TEST_VALUE);
+        mTestSession = new VerificationSession(TEST_ID, TEST_INSTALL_SESSION_ID,
+                TEST_PACKAGE_NAME, TEST_PACKAGE_URI, TEST_SIGNING_INFO, mTestDeclaredLibraries,
+                mTestExtensionParams, mTestSessionInterface, mTestCallback);
+    }
+
+    @Test
+    public void testParcel() {
+        Parcel parcel = Parcel.obtain();
+        mTestSession.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        VerificationSession sessionFromParcel =
+                VerificationSession.CREATOR.createFromParcel(parcel);
+        assertThat(sessionFromParcel.getId()).isEqualTo(TEST_ID);
+        assertThat(sessionFromParcel.getInstallSessionId()).isEqualTo(TEST_INSTALL_SESSION_ID);
+        assertThat(sessionFromParcel.getPackageName()).isEqualTo(TEST_PACKAGE_NAME);
+        assertThat(sessionFromParcel.getStagedPackageUri()).isEqualTo(TEST_PACKAGE_URI);
+        assertThat(sessionFromParcel.getSigningInfo().getSigningDetails())
+                .isEqualTo(TEST_SIGNING_INFO.getSigningDetails());
+        List<SharedLibraryInfo> declaredLibrariesFromParcel =
+                sessionFromParcel.getDeclaredLibraries();
+        assertThat(declaredLibrariesFromParcel).hasSize(2);
+        // SharedLibraryInfo doesn't have a "equals" method, so we have to check it indirectly
+        assertThat(declaredLibrariesFromParcel.getFirst().toString())
+                .isEqualTo(TEST_SHARED_LIBRARY_INFO1.toString());
+        assertThat(declaredLibrariesFromParcel.get(1).toString())
+                .isEqualTo(TEST_SHARED_LIBRARY_INFO2.toString());
+        // We can't directly test with PersistableBundle.equals() because the parceled bundle's
+        // structure is different, but all the key/value pairs should be preserved as before.
+        assertThat(sessionFromParcel.getExtensionParams().getString(TEST_KEY))
+                .isEqualTo(mTestExtensionParams.getString(TEST_KEY));
+    }
+
+    @Test
+    public void testInterface() throws Exception {
+        when(mTestSessionInterface.getTimeoutTime(anyInt())).thenAnswer(i -> TEST_TIMEOUT_TIME);
+        when(mTestSessionInterface.extendTimeRemaining(anyInt(), anyLong())).thenAnswer(
+                i -> i.getArguments()[1]);
+
+        assertThat(mTestSession.getTimeoutTime()).isEqualTo(TEST_TIMEOUT_TIME);
+        verify(mTestSessionInterface, times(1)).getTimeoutTime(eq(TEST_ID));
+        assertThat(mTestSession.extendTimeRemaining(TEST_EXTEND_TIME)).isEqualTo(TEST_EXTEND_TIME);
+        verify(mTestSessionInterface, times(1)).extendTimeRemaining(
+                eq(TEST_ID), eq(TEST_EXTEND_TIME));
+    }
+
+    @Test
+    public void testCallback() throws Exception {
+        PersistableBundle response = new PersistableBundle();
+        response.putString("test key", "test value");
+        final VerificationStatus status =
+                new VerificationStatus.Builder().setVerified(true).build();
+        mTestSession.reportVerificationComplete(status);
+        verify(mTestCallback, times(1)).reportVerificationComplete(
+                eq(TEST_ID), eq(status));
+        mTestSession.reportVerificationComplete(status, response);
+        verify(mTestCallback, times(1))
+                .reportVerificationCompleteWithExtensionResponse(
+                        eq(TEST_ID), eq(status), eq(response));
+
+        final int reason = VerificationSession.VERIFICATION_INCOMPLETE_UNKNOWN;
+        mTestSession.reportVerificationIncomplete(reason);
+        verify(mTestCallback, times(1)).reportVerificationIncomplete(
+                eq(TEST_ID), eq(reason));
+    }
+}
diff --git a/core/tests/coretests/src/android/content/pm/verify/VerificationStatusTest.java b/core/tests/coretests/src/android/content/pm/verify/VerificationStatusTest.java
new file mode 100644
index 0000000..67d407a
--- /dev/null
+++ b/core/tests/coretests/src/android/content/pm/verify/VerificationStatusTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2024 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 android.content.pm.verify;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.pm.verify.pkg.VerificationStatus;
+import android.os.Parcel;
+import android.os.PersistableBundle;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class VerificationStatusTest {
+    private static final boolean TEST_VERIFIED = true;
+    private static final int TEST_ASL_STATUS = VerificationStatus.VERIFIER_STATUS_ASL_GOOD;
+    private static final String TEST_FAILURE_MESSAGE = "test test";
+    private static final String TEST_KEY = "test key";
+    private static final String TEST_VALUE = "test value";
+    private final PersistableBundle mTestExtras = new PersistableBundle();
+    private VerificationStatus mStatus;
+
+    @Before
+    public void setUpWithBuilder() {
+        mTestExtras.putString(TEST_KEY, TEST_VALUE);
+        mStatus = new VerificationStatus.Builder()
+                .setAslStatus(TEST_ASL_STATUS)
+                .setFailureMessage(TEST_FAILURE_MESSAGE)
+                .setVerified(TEST_VERIFIED)
+                .build();
+    }
+
+    @Test
+    public void testGetters() {
+        assertThat(mStatus.isVerified()).isEqualTo(TEST_VERIFIED);
+        assertThat(mStatus.getAslStatus()).isEqualTo(TEST_ASL_STATUS);
+        assertThat(mStatus.getFailureMessage()).isEqualTo(TEST_FAILURE_MESSAGE);
+    }
+
+    @Test
+    public void testParcel() {
+        Parcel parcel = Parcel.obtain();
+        mStatus.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        VerificationStatus statusFromParcel = VerificationStatus.CREATOR.createFromParcel(parcel);
+        assertThat(statusFromParcel.isVerified()).isEqualTo(TEST_VERIFIED);
+        assertThat(statusFromParcel.getAslStatus()).isEqualTo(TEST_ASL_STATUS);
+        assertThat(statusFromParcel.getFailureMessage()).isEqualTo(TEST_FAILURE_MESSAGE);
+    }
+}
diff --git a/core/tests/coretests/src/android/content/pm/verify/VerifierServiceTest.java b/core/tests/coretests/src/android/content/pm/verify/VerifierServiceTest.java
new file mode 100644
index 0000000..7f73a1e
--- /dev/null
+++ b/core/tests/coretests/src/android/content/pm/verify/VerifierServiceTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2024 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 android.content.pm.verify;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.SigningInfo;
+import android.content.pm.verify.pkg.IVerifierService;
+import android.content.pm.verify.pkg.VerificationSession;
+import android.content.pm.verify.pkg.VerifierService;
+import android.net.Uri;
+import android.os.PersistableBundle;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class VerifierServiceTest {
+    private static final int TEST_ID = 100;
+    private static final int TEST_INSTALL_SESSION_ID = 33;
+    private static final String TEST_PACKAGE_NAME = "com.foo";
+    private static final Uri TEST_PACKAGE_URI = Uri.parse("test://test");
+    private static final SigningInfo TEST_SIGNING_INFO = new SigningInfo();
+    private VerifierService mService;
+    private VerificationSession mSession;
+
+    @Before
+    public void setUp() {
+        mService = Mockito.mock(VerifierService.class, Answers.CALLS_REAL_METHODS);
+        mSession = new VerificationSession(TEST_ID, TEST_INSTALL_SESSION_ID,
+                TEST_PACKAGE_NAME, TEST_PACKAGE_URI, TEST_SIGNING_INFO,
+                new ArrayList<>(),
+                new PersistableBundle(), null, null);
+    }
+
+    @Test
+    public void testBind() throws Exception {
+        Intent intent = Mockito.mock(Intent.class);
+        when(intent.getAction()).thenReturn(PackageManager.ACTION_VERIFY_PACKAGE);
+        IVerifierService binder =
+                (IVerifierService) mService.onBind(intent);
+        assertThat(binder).isNotNull();
+        binder.onPackageNameAvailable(TEST_PACKAGE_NAME);
+        verify(mService).onPackageNameAvailable(eq(TEST_PACKAGE_NAME));
+        binder.onVerificationCancelled(TEST_PACKAGE_NAME);
+        verify(mService).onVerificationCancelled(eq(TEST_PACKAGE_NAME));
+        binder.onVerificationRequired(mSession);
+        verify(mService).onVerificationRequired(eq(mSession));
+        binder.onVerificationRetry(mSession);
+        verify(mService).onVerificationRetry(eq(mSession));
+        binder.onVerificationTimeout(TEST_ID);
+        verify(mService).onVerificationTimeout(eq(TEST_ID));
+    }
+
+    @Test
+    public void testBindFailsWithWrongIntent() {
+        Intent intent = Mockito.mock(Intent.class);
+        when(intent.getAction()).thenReturn(Intent.ACTION_SEND);
+        assertThat(mService.onBind(intent)).isNull();
+    }
+}
diff --git a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
index 3eefe04..b16c237 100644
--- a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
+++ b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
@@ -119,7 +119,7 @@
             }
 
             @Override
-            protected DisplayMetrics getDisplayMetrics(int displayId, DisplayAdjustments daj) {
+            public DisplayMetrics getDisplayMetrics(int displayId, DisplayAdjustments daj) {
                 return mDisplayMetricsMap.get(displayId);
             }
         };
@@ -470,6 +470,48 @@
 
     @Test
     @SmallTest
+    public void testResourceConfigurationAppliedWhenOverrideDoesNotExist() {
+        final int width = 240;
+        final int height = 360;
+        final float densityDpi = mDisplayMetricsMap.get(Display.DEFAULT_DISPLAY).densityDpi;
+        final int widthDp = (int) (width / densityDpi + 0.5f);
+        final int heightDp = (int) (height / densityDpi + 0.5f);
+
+        final int overrideWidth = 480;
+        final int overrideHeight = 720;
+        final int overrideWidthDp = (int) (overrideWidth / densityDpi + 0.5f);
+        final int overrideHeightDp = (int) (height / densityDpi + 0.5f);
+
+        // The method to be tested is overridden for other tests to provide a setup environment.
+        // Create a new one for this test only.
+        final ResourcesManager resourcesManager = new ResourcesManager();
+
+        Configuration newConfig = new Configuration();
+        newConfig.windowConfiguration.setAppBounds(0, 0, width, height);
+        newConfig.screenWidthDp = widthDp;
+        newConfig.screenHeightDp = heightDp;
+        resourcesManager.applyConfigurationToResources(newConfig, null);
+
+        assertEquals(width, resourcesManager.getDisplayMetrics(Display.DEFAULT_DISPLAY,
+                DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS).widthPixels);
+        assertEquals(height, resourcesManager.getDisplayMetrics(Display.DEFAULT_DISPLAY,
+                DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS).heightPixels);
+
+        Configuration overrideConfig = new Configuration();
+        overrideConfig.windowConfiguration.setAppBounds(0, 0, overrideWidth, overrideHeight);
+        overrideConfig.screenWidthDp = overrideWidthDp;
+        overrideConfig.screenHeightDp = overrideHeightDp;
+
+        final DisplayAdjustments daj = new DisplayAdjustments(overrideConfig);
+
+        assertEquals(overrideWidth, resourcesManager.getDisplayMetrics(
+                Display.DEFAULT_DISPLAY, daj).widthPixels);
+        assertEquals(overrideHeight, resourcesManager.getDisplayMetrics(
+                Display.DEFAULT_DISPLAY, daj).heightPixels);
+    }
+
+    @Test
+    @SmallTest
     @RequiresFlagsEnabled(Flags.FLAG_REGISTER_RESOURCE_PATHS)
     @DisabledOnRavenwood(blockedBy = PackageManager.class)
     public void testNewResourcesWithOutdatedImplAfterResourcePathsRegistration()
diff --git a/core/tests/coretests/src/android/os/BinderUncaughtExceptionHandlerTest.kt b/core/tests/coretests/src/android/os/BinderUncaughtExceptionHandlerTest.kt
new file mode 100644
index 0000000..791c209
--- /dev/null
+++ b/core/tests/coretests/src/android/os/BinderUncaughtExceptionHandlerTest.kt
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2024 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 android.os
+
+import android.content.Intent
+import android.platform.test.annotations.DisabledOnRavenwood
+import android.platform.test.annotations.Presubmit
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+
+import com.android.frameworks.coretests.aidl.ITestInterface
+import com.android.frameworks.coretests.methodcallerhelperapp.*
+
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.mockito.ArgumentMatcher
+import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.ArgumentMatchers.intThat
+import org.mockito.Mockito.after
+import org.mockito.Mockito.doThrow
+import org.mockito.Mockito.never
+import org.mockito.Mockito.timeout
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.`when`
+import org.mockito.Spy
+import org.mockito.junit.MockitoJUnit
+import org.mockito.quality.Strictness.STRICT_STUBS
+
+private const val TIMEOUT_DURATION_MS = 2000L
+private const val FALSE_NEG_DURATION_MS = 500L
+private const val FLAG_ONEWAY = 1
+// From ITestInterface.Stub class, these values are package private
+private const val TRANSACTION_foo = 1
+private const val TRANSACTION_onewayFoo = 2
+private const val TRANSACTION_bar = 3
+
+/** Tests functionality of {@link android.os.Binder.onUnhandledException}. */
+@DisabledOnRavenwood(reason = "multi-app")
+@Presubmit
+@RunWith(AndroidJUnit4::class)
+class BinderUncaughtExceptionHandlerTest {
+
+    val mContext = InstrumentationRegistry.getInstrumentation().getTargetContext()
+
+    @Rule @JvmField val rule = MockitoJUnit.rule().strictness(STRICT_STUBS)
+
+    @Spy var mInterfaceImpl: ITestImpl = ITestImpl()
+
+    // This subclass is needed for visibility issues (via protected), since the method we are
+    // verifying lives on the boot classpath, it is not enough to be in the same package.
+    open class ITestImpl : ITestInterface.Stub() {
+        override fun onUnhandledException(code: Int, flags: Int, e: Exception?) =
+            onUnhandledExceptionVisible(code, flags, e)
+
+        public open fun onUnhandledExceptionVisible(code: Int, flags: Int, e: Exception?) {}
+
+        @Throws(RemoteException::class)
+        override open fun foo(x: Int): Int = throw UnsupportedOperationException()
+
+        @Throws(RemoteException::class)
+        override open fun onewayFoo(x: Int): Unit = throw UnsupportedOperationException()
+
+        @Throws(RemoteException::class)
+        override open fun bar(x: Int): Unit = throw UnsupportedOperationException()
+    }
+
+    class OnewayMatcher(private val isOneway: Boolean) : ArgumentMatcher<Int> {
+        override fun matches(argument: Int?) =
+            (argument!! and FLAG_ONEWAY) == if (isOneway) 1 else 0
+
+        override fun toString() = "Expected oneway: $isOneway"
+    }
+
+    @Test
+    fun testRegularMethod_ifThrowsRuntimeException_HandlerCalled() {
+        val myException = RuntimeException("Test exception")
+        doThrow(myException).`when`(mInterfaceImpl).foo(anyInt())
+
+        dispatchActionCall("foo")
+
+        verify(mInterfaceImpl, timeout(TIMEOUT_DURATION_MS))
+            .onUnhandledExceptionVisible(
+                /* transactionCode = */ eq(TRANSACTION_foo),
+                /* flags= */ intThat(OnewayMatcher(false)),
+                /* exception= */ eq(myException),
+            )
+        // No unexpected calls
+        verify(mInterfaceImpl).onUnhandledExceptionVisible(anyInt(), anyInt(), any())
+    }
+
+    @Test
+    fun testRegularMethod_ifThrowsRemoteException_HandlerCalled() {
+        val myException = RemoteException("Test exception")
+        doThrow(myException).`when`(mInterfaceImpl).foo(anyInt())
+
+        dispatchActionCall("foo")
+
+        verify(mInterfaceImpl, timeout(TIMEOUT_DURATION_MS))
+            .onUnhandledExceptionVisible(
+                /* transactionCode = */ eq(TRANSACTION_foo),
+                /* flags= */ intThat(OnewayMatcher(false)),
+                /* exception= */ eq(myException),
+            )
+        // No unexpected calls
+        verify(mInterfaceImpl).onUnhandledExceptionVisible(anyInt(), anyInt(), any())
+    }
+
+    @Test
+    fun testRegularMethod_ifThrowsSecurityException_HandlerNotCalled() {
+        val myException = SecurityException("Test exception")
+        doThrow(myException).`when`(mInterfaceImpl).foo(anyInt())
+
+        dispatchActionCall("foo")
+
+        // No unexpected calls
+        verify(mInterfaceImpl, after(FALSE_NEG_DURATION_MS).never())
+            .onUnhandledExceptionVisible(anyInt(), anyInt(), any())
+    }
+
+    @Test
+    fun testVoidMethod_ifThrowsRuntimeException_HandlerCalled() {
+        val myException = RuntimeException("Test exception")
+        doThrow(myException).`when`(mInterfaceImpl).bar(anyInt())
+
+        dispatchActionCall("bar")
+
+        verify(mInterfaceImpl, timeout(TIMEOUT_DURATION_MS))
+            .onUnhandledExceptionVisible(
+                /* transactionCode = */ eq(TRANSACTION_bar),
+                /* flags= */ intThat(OnewayMatcher(false)),
+                /* exception= */ eq(myException),
+            )
+        // No unexpected calls
+        verify(mInterfaceImpl).onUnhandledExceptionVisible(anyInt(), anyInt(), any())
+    }
+
+    @Test
+    fun testVoidMethod_ifThrowsRemoteException_HandlerCalled() {
+        val myException = RemoteException("Test exception")
+        doThrow(myException).`when`(mInterfaceImpl).bar(anyInt())
+
+        dispatchActionCall("bar")
+
+        verify(mInterfaceImpl, timeout(TIMEOUT_DURATION_MS))
+            .onUnhandledExceptionVisible(
+                /* transactionCode = */ eq(TRANSACTION_bar),
+                /* flags= */ intThat(OnewayMatcher(false)),
+                /* exception= */ eq(myException),
+            )
+        // No unexpected calls
+        verify(mInterfaceImpl).onUnhandledExceptionVisible(anyInt(), anyInt(), any())
+    }
+
+    @Test
+    fun testVoidMethod_ifThrowsSecurityException_HandlerNotCalled() {
+        val myException = SecurityException("Test exception")
+        doThrow(myException).`when`(mInterfaceImpl).bar(anyInt())
+
+        dispatchActionCall("bar")
+
+        // No unexpected calls
+        verify(mInterfaceImpl, after(FALSE_NEG_DURATION_MS).never())
+            .onUnhandledExceptionVisible(anyInt(), anyInt(), any())
+    }
+
+    @Test
+    fun testOnewayMethod_ifThrowsRuntimeException_HandlerCalled() {
+        val myException = RuntimeException("Test exception")
+        doThrow(myException).doNothing().`when`(mInterfaceImpl).onewayFoo(anyInt())
+
+        dispatchActionCall("onewayFoo")
+
+        verify(mInterfaceImpl, timeout(TIMEOUT_DURATION_MS))
+            .onUnhandledExceptionVisible(
+                /* transactionCode = */ eq(TRANSACTION_onewayFoo),
+                /* flags= */ intThat(OnewayMatcher(true)),
+                /* exception= */ eq(myException),
+            )
+        // No unexpected calls
+        verify(mInterfaceImpl).onUnhandledExceptionVisible(anyInt(), anyInt(), any())
+    }
+
+    @Test
+    fun testOnewayMethod_ifThrowsRemoteException_HandlerCalled() {
+        val myException = RemoteException("Test exception")
+        doThrow(myException).`when`(mInterfaceImpl).onewayFoo(anyInt())
+
+        dispatchActionCall("onewayFoo")
+
+        verify(mInterfaceImpl, timeout(TIMEOUT_DURATION_MS))
+            .onUnhandledExceptionVisible(
+                /* transactionCode = */ eq(TRANSACTION_onewayFoo),
+                /* flags= */ intThat(OnewayMatcher(true)),
+                /* exception= */ eq(myException),
+            )
+        // No unexpected calls
+        verify(mInterfaceImpl).onUnhandledExceptionVisible(anyInt(), anyInt(), any())
+    }
+
+    // All exceptions are uncaught for oneway
+    @Test
+    fun testOnewayMethod_ifThrowsSecurityException_HandlerCalled() {
+        val myException = SecurityException("Test exception")
+        doThrow(myException).`when`(mInterfaceImpl).onewayFoo(anyInt())
+
+        dispatchActionCall("onewayFoo")
+
+        verify(mInterfaceImpl, timeout(TIMEOUT_DURATION_MS))
+            .onUnhandledExceptionVisible(
+                /* transactionCode = */ eq(TRANSACTION_onewayFoo),
+                /* flags= */ intThat(OnewayMatcher(true)),
+                /* exception= */ eq(myException),
+            )
+        // No unexpected calls
+        verify(mInterfaceImpl).onUnhandledExceptionVisible(anyInt(), anyInt(), any())
+    }
+
+    private fun dispatchActionCall(methodName: String) =
+        Intent(ACTION_CALL_METHOD).apply {
+            putExtras(
+                Bundle().apply {
+                    putBinder(EXTRA_BINDER, mInterfaceImpl as IBinder)
+                    putString(EXTRA_METHOD_NAME, methodName)
+                }
+            )
+            setClassName(PACKAGE_NAME, CallMethodsReceiver::class.java.getName())
+        }.let { mContext.sendBroadcast(it) }
+}
diff --git a/core/tests/coretests/src/android/view/InputEventCompatProcessorTest.java b/core/tests/coretests/src/android/view/InputEventCompatProcessorTest.java
new file mode 100644
index 0000000..f2391ee
--- /dev/null
+++ b/core/tests/coretests/src/android/view/InputEventCompatProcessorTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2024 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 android.view;
+
+import static android.view.MotionEvent.ACTION_DOWN;
+import static android.view.MotionEvent.ACTION_UP;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.annotations.Presubmit;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.window.flags.Flags;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for {@link InputEventCompatProcessor}
+ *
+ * Build/Install/Run:
+ *  atest FrameworksCoreTests:InputEventCompatProcessorTest
+ */
+@SmallTest
+@Presubmit
+public class InputEventCompatProcessorTest {
+
+    private InputEventCompatProcessor mInputEventCompatProcessor;
+
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Before
+    public void setUp() {
+        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+        assumeTrue("Is at least targeting Android M",
+                context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M);
+
+        // Set app bounds as if it was letterboxed.
+        context.getResources().getConfiguration().windowConfiguration
+                .setBounds(new Rect(200, 200, 600, 1000));
+
+        Handler handler = new Handler(Looper.getMainLooper());
+
+        mInputEventCompatProcessor = new InputEventCompatProcessor(context, handler);
+    }
+
+    @DisableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
+    @Test
+    public void testTapGestureOutsideBoundsHasNoAdjustmentsWhenScrollingFromLetterboxDisabled() {
+        // Tap-like gesture in bounds (non-scroll).
+        List<MotionEvent> tapGestureEvents = createTapGestureEvents(-100f, -100f);
+
+        for (MotionEvent motionEvent : tapGestureEvents) {
+            List<InputEvent> compatProcessedEvents =
+                    mInputEventCompatProcessor.processInputEventForCompatibility(motionEvent);
+            // Expect null to be returned, because no adjustments should be made to these events
+            // when Letterbox Scroll Processor is disabled.
+            assertNull(compatProcessedEvents);
+        }
+    }
+
+    @EnableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
+    @Test
+    public void testTapGestureOutsideBoundsIsIgnoredWhenScrollingFromLetterboxEnabled() {
+        // Tap-like gesture in bounds (non-scroll).
+        List<MotionEvent> tapGestureEvents = createTapGestureEvents(-100f, -100f);
+
+        for (MotionEvent motionEvent : tapGestureEvents) {
+            List<InputEvent> compatProcessedEvents =
+                    mInputEventCompatProcessor.processInputEventForCompatibility(motionEvent);
+            // Expect no events returned because Letterbox Scroll Processor is enabled and therefore
+            // should cause the out of bound events to be ignored.
+            assertTrue(compatProcessedEvents.isEmpty());
+        }
+    }
+
+    private List<MotionEvent> createTapGestureEvents(float startX, float startY) {
+        // Events for tap-like gesture (non-scroll)
+        List<MotionEvent> motionEvents = new ArrayList<>();
+        motionEvents.add(createBasicMotionEvent(0, ACTION_DOWN, startX, startY));
+        motionEvents.add(createBasicMotionEvent(10, ACTION_UP, startX , startY));
+        return motionEvents;
+    }
+
+    private MotionEvent createBasicMotionEvent(int downTime, int action, float x, float y) {
+        return MotionEvent.obtain(0, downTime, action, x, y, 0);
+    }
+}
diff --git a/core/tests/coretests/src/android/view/LetterboxScrollProcessorTest.java b/core/tests/coretests/src/android/view/LetterboxScrollProcessorTest.java
new file mode 100644
index 0000000..f8ec9f4
--- /dev/null
+++ b/core/tests/coretests/src/android/view/LetterboxScrollProcessorTest.java
@@ -0,0 +1,253 @@
+/*
+ * Copyright 2024 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 android.view;
+
+import static android.view.MotionEvent.ACTION_DOWN;
+import static android.view.MotionEvent.ACTION_MOVE;
+import static android.view.MotionEvent.ACTION_UP;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.os.Handler;
+import android.os.Looper;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.Before;
+import org.junit.Test;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for {@link LetterboxScrollProcessor}
+ *
+ * Build/Install/Run:
+ *  atest FrameworksCoreTests:LetterboxScrollProcessorTest
+ */
+@SmallTest
+@Presubmit
+public class LetterboxScrollProcessorTest {
+
+    private LetterboxScrollProcessor mLetterboxScrollProcessor;
+    private Context mContext;
+
+    // Constant delta used when comparing coordinates (floats)
+    private static final float EPSILON = 0.1f;
+
+    @Before
+    public void setUp() {
+        mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+        // Set app bounds as if it was letterboxed.
+        mContext.getResources().getConfiguration().windowConfiguration
+                .setBounds(new Rect(200, 200, 600, 1000));
+
+        Handler handler = new Handler(Looper.getMainLooper());
+
+        // Recreate to reset LetterboxScrollProcessor state.
+        mLetterboxScrollProcessor = new LetterboxScrollProcessor(mContext, handler);
+    }
+
+    @Test
+    public void testGestureInBoundsHasNoAdjustments() {
+        // Tap-like gesture in bounds (non-scroll).
+        List<MotionEvent> tapGestureEvents = createTapGestureEvents(0f, 0f);
+
+        // Get processed events from Letterbox Scroll Processor.
+        List<MotionEvent> processedEvents = processMotionEvents(tapGestureEvents);
+
+        // Ensure no changes are made to events after processing - event locations should not be
+        // adjusted because the gesture started in the app's bounds (for all gestures).
+        assertEventLocationsAreNotAdjusted(tapGestureEvents, processedEvents);
+        // Ensure all of these events should be finished (expect no generated events).
+        assertMotionEventsShouldBeFinished(processedEvents);
+    }
+
+    @Test
+    public void testGestureOutsideBoundsIsIgnored() {
+        // Tap-like gesture outside bounds (non-scroll).
+        List<MotionEvent> tapGestureEvents = createTapGestureEvents(-100f, -100f);
+
+        // Get processed events from Letterbox Scroll Processor.
+        List<MotionEvent> processedEvents = processMotionEvents(tapGestureEvents);
+
+        // All events should be ignored since it was a non-scroll gesture and out of bounds.
+        assertEquals(0, processedEvents.size());
+    }
+
+    @Test
+    public void testScrollGestureInBoundsHasNoAdjustments() {
+        // Scroll gesture in bounds (non-scroll).
+        List<MotionEvent> scrollGestureEvents = createScrollGestureEvents(0f, 0f);
+
+        // Get processed events from Letterbox Scroll Processor.
+        List<MotionEvent> processedEvents = processMotionEvents(scrollGestureEvents);
+
+        // Ensure no changes are made to events after processing - event locations should not be
+        // adjusted because the gesture started in the app's bounds (for all gestures).
+        assertEventLocationsAreNotAdjusted(scrollGestureEvents, processedEvents);
+        // Ensure all of these events should be finished (expect no generated events).
+        assertMotionEventsShouldBeFinished(processedEvents);
+    }
+
+    @Test
+    public void testScrollGestureInBoundsThenLeavesBoundsHasNoAdjustments() {
+        // Scroll gesture in bounds (non-scroll) that moves out of bounds.
+        List<MotionEvent> scrollGestureEvents = createScrollGestureEvents(390f, 790f);
+
+        // Get processed events from Letterbox Scroll Processor.
+        List<MotionEvent> processedEvents = processMotionEvents(scrollGestureEvents);
+
+        // Ensure no changes are made to events after processing - event locations should not be
+        // adjusted because the gesture started in the app's bounds (for all gestures), even if it
+        // leaves the apps bounds.
+        assertEventLocationsAreNotAdjusted(scrollGestureEvents, processedEvents);
+        // Ensure all of these events should be finished (expect no generated events).
+        assertMotionEventsShouldBeFinished(processedEvents);
+    }
+
+    @Test
+    public void testScrollGestureOutsideBoundsIsStartedInBounds() {
+        // Scroll gesture outside bounds.
+        List<MotionEvent> scrollGestureEvents = createScrollGestureEvents(-100f, 0f);
+
+        // Get processed events from Letterbox Scroll Processor.
+        List<MotionEvent> processedEvents = processMotionEvents(scrollGestureEvents);
+
+        // When a scroll occurs outside bounds: once detected as a scroll, the ACTION_DOWN is
+        // expected to be received again but with an offset so it is over the app's bounds.
+
+        // Ensure offset ACTION_DOWN is first event received.
+        MotionEvent firstProcessedEvent = processedEvents.getFirst();
+        assertEquals(firstProcessedEvent.getAction(), ACTION_DOWN);
+        assertEquals(firstProcessedEvent.getX(), 0, EPSILON);
+        assertEquals(firstProcessedEvent.getY(), 0, EPSILON);
+        // Ensure this event is not finished (because it was generated by LetterboxScrollProcessor).
+        assertNull(mLetterboxScrollProcessor.processMotionEventBeforeFinish(firstProcessedEvent));
+    }
+
+    @Test
+    public void testScrollGestureOutsideBoundsIsMovedInBounds() {
+        // Scroll gesture outside bounds.
+        List<MotionEvent> scrollGestureEvents = createScrollGestureEvents(-100f, 0f);
+
+        // Get processed events from Letterbox Scroll Processor.
+        List<MotionEvent> processedEvents = processMotionEvents(scrollGestureEvents);
+
+        // When a scroll occurs outside bounds: once detected as a scroll, an offset ACTION_DOWN is
+        // placed and then the rest of the gesture is offset also. Some ACTION_MOVE events may be
+        // ignored until the gesture is 'detected as a scroll'.
+        // For this test, we expect the first ACTION_MOVE event to be ignored:
+        scrollGestureEvents.remove(1);
+
+        // Ensure all processed events (that are not ignored) are offset over the app.
+        assertXCoordinatesAdjustedToZero(scrollGestureEvents, processedEvents);
+        // Except the first generated ACTION_DOWN event, ensure the following events should be
+        // finished (these events should not be generated).
+        assertMotionEventsShouldBeFinished(processedEvents.subList(1, processedEvents.size()));
+    }
+
+    private List<MotionEvent> processMotionEvents(List<MotionEvent> motionEvents) {
+        List<MotionEvent> processedEvents = new ArrayList<>();
+        for (MotionEvent motionEvent : motionEvents) {
+            MotionEvent clonedEvent = MotionEvent.obtain(motionEvent);
+            List<MotionEvent> letterboxScrollCompatEvents =
+                    mLetterboxScrollProcessor.processMotionEvent(clonedEvent);
+            if (letterboxScrollCompatEvents == null) {
+                // Use original event if null returned (no adjustments made).
+                processedEvents.add(clonedEvent);
+            } else {
+                // Otherwise, use adjusted events.
+                processedEvents.addAll(letterboxScrollCompatEvents);
+            }
+        }
+        return processedEvents;
+    }
+
+    private List<MotionEvent> createTapGestureEvents(float startX, float startY) {
+        // Events for tap-like gesture (non-scroll)
+        List<MotionEvent> motionEvents = new ArrayList<>();
+        motionEvents.add(createBasicMotionEvent(0, ACTION_DOWN, startX, startY));
+        motionEvents.add(createBasicMotionEvent(10, ACTION_UP, startX , startY));
+        return motionEvents;
+    }
+
+    private List<MotionEvent> createScrollGestureEvents(float startX, float startY) {
+        float touchSlop = (float) ViewConfiguration.get(mContext).getScaledTouchSlop();
+
+        // Events for scroll gesture (starts at (startX, startY) then moves down-right
+        List<MotionEvent> motionEvents = new ArrayList<>();
+        motionEvents.add(createBasicMotionEvent(0, ACTION_DOWN, startX, startY));
+        motionEvents.add(createBasicMotionEvent(10, ACTION_MOVE,
+                startX + touchSlop / 2, startY + touchSlop / 2));
+        // Below event is first event in the scroll gesture where distance > touchSlop
+        motionEvents.add(createBasicMotionEvent(20, ACTION_MOVE,
+                startX + touchSlop * 2, startY + touchSlop * 2));
+        motionEvents.add(createBasicMotionEvent(30, ACTION_MOVE,
+                startX + touchSlop * 3, startY + touchSlop * 3));
+        motionEvents.add(createBasicMotionEvent(40, ACTION_UP,
+                startX + touchSlop * 3, startY + touchSlop * 3));
+        return motionEvents;
+    }
+
+    private MotionEvent createBasicMotionEvent(int downTime, int action, float x, float y) {
+        return MotionEvent.obtain(0, downTime, action, x, y, 0);
+    }
+
+    private void assertEventLocationsAreNotAdjusted(
+            List<MotionEvent> originalEvents,
+            List<MotionEvent> processedEvents) {
+        assertEquals("MotionEvent arrays are not the same size",
+                originalEvents.size(), processedEvents.size());
+
+        for (int i = 0; i < originalEvents.size(); i++) {
+            assertEquals("X coordinates was unexpectedly adjusted at index " + i,
+                    originalEvents.get(i).getX(), processedEvents.get(i).getX(), EPSILON);
+            assertEquals("Y coordinates was unexpectedly adjusted at index " + i,
+                    originalEvents.get(i).getY(), processedEvents.get(i).getY(), EPSILON);
+        }
+    }
+
+    private void assertXCoordinatesAdjustedToZero(
+            List<MotionEvent> originalEvents,
+            List<MotionEvent> processedEvents) {
+        assertEquals("MotionEvent arrays are not the same size",
+                originalEvents.size(), processedEvents.size());
+
+        for (int i = 0; i < originalEvents.size(); i++) {
+            assertEquals("X coordinate was not adjusted to 0 at index " + i,
+                    0, processedEvents.get(i).getX(), EPSILON);
+            assertEquals("Y coordinate was unexpectedly adjusted at index " + i,
+                    originalEvents.get(i).getY(), processedEvents.get(i).getY(), EPSILON);
+        }
+    }
+
+    private void assertMotionEventsShouldBeFinished(List<MotionEvent> processedEvents) {
+        for (MotionEvent processedEvent : processedEvents) {
+            assertNotNull(mLetterboxScrollProcessor.processMotionEventBeforeFinish(processedEvent));
+        }
+    }
+}
diff --git a/core/tests/coretests/src/android/view/ViewFrameRateTest.java b/core/tests/coretests/src/android/view/ViewFrameRateTest.java
index c631c6f..c981423 100644
--- a/core/tests/coretests/src/android/view/ViewFrameRateTest.java
+++ b/core/tests/coretests/src/android/view/ViewFrameRateTest.java
@@ -22,6 +22,7 @@
 import static android.view.Surface.FRAME_RATE_CATEGORY_NORMAL;
 import static android.view.Surface.FRAME_RATE_CATEGORY_NO_PREFERENCE;
 import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
+import static android.view.flags.Flags.FLAG_TOOLKIT_FRAME_RATE_ANIMATION_BUGFIX_25Q1;
 import static android.view.flags.Flags.FLAG_TOOLKIT_FRAME_RATE_VELOCITY_MAPPING_READ_ONLY;
 import static android.view.flags.Flags.FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY;
 import static android.view.flags.Flags.FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY;
@@ -46,6 +47,8 @@
 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 import android.sysprop.ViewProperties;
 import android.util.DisplayMetrics;
+import android.view.animation.Animation;
+import android.view.animation.TranslateAnimation;
 import android.widget.FrameLayout;
 import android.widget.ProgressBar;
 
@@ -1023,6 +1026,30 @@
         });
     }
 
+    @Test
+    @RequiresFlagsEnabled(FLAG_TOOLKIT_FRAME_RATE_ANIMATION_BUGFIX_25Q1)
+    public void boostWhenApplyLegacyAnimation() throws Throwable {
+        if (!ViewProperties.vrr_enabled().orElse(true)) {
+            return;
+        }
+        waitForFrameRateCategoryToSettle();
+        mActivityRule.runOnUiThread(() -> {
+            TranslateAnimation translateAnimation = new TranslateAnimation(
+                    Animation.RELATIVE_TO_PARENT, 0f, // fromXDelta
+                    Animation.RELATIVE_TO_PARENT, 0f, // toXDelta
+                    Animation.RELATIVE_TO_PARENT, 1f, // fromYDelta (100%p)
+                    Animation.RELATIVE_TO_PARENT, 0f  // toYDelta
+            );
+            translateAnimation.setDuration(600);
+
+            mMovingView.startAnimation(translateAnimation);
+
+            runAfterDraw(() -> assertEquals(FRAME_RATE_CATEGORY_HIGH_HINT,
+                    mViewRoot.getLastPreferredFrameRateCategory()));
+        });
+        waitForAfterDraw();
+    }
+
     private void runAfterDraw(@NonNull Runnable runnable) {
         Handler handler = new Handler(Looper.getMainLooper());
         mAfterDrawLatch = new CountDownLatch(1);
diff --git a/core/tests/coretests/src/android/view/WindowLayoutTests.java b/core/tests/coretests/src/android/view/WindowLayoutTests.java
index 5cac98d..d4693e6 100644
--- a/core/tests/coretests/src/android/view/WindowLayoutTests.java
+++ b/core/tests/coretests/src/android/view/WindowLayoutTests.java
@@ -413,4 +413,19 @@
         assertInsetByTopBottom(0, 0, mFrames.parentFrame);
         assertInsetByTopBottom(0, 0, mFrames.frame);
     }
+
+    @Test
+    public void windowBoundsOutsideDisplayCutoutSafe() {
+        addDisplayCutout();
+        mAttrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
+        mWindowBounds.set(0, -1000, DISPLAY_WIDTH, 0);
+        computeFrames();
+
+        assertRect(WATERFALL_INSETS.left, 0, DISPLAY_WIDTH - WATERFALL_INSETS.right, 0,
+                mFrames.displayFrame);
+        assertRect(WATERFALL_INSETS.left, 0, DISPLAY_WIDTH - WATERFALL_INSETS.right, 0,
+                mFrames.parentFrame);
+        assertRect(WATERFALL_INSETS.left, 0, DISPLAY_WIDTH - WATERFALL_INSETS.right, 0,
+                mFrames.frame);
+    }
 }
diff --git a/core/tests/coretests/src/android/window/BackTouchTrackerTest.kt b/core/tests/coretests/src/android/window/BackTouchTrackerTest.kt
index b7bccd4..381b566 100644
--- a/core/tests/coretests/src/android/window/BackTouchTrackerTest.kt
+++ b/core/tests/coretests/src/android/window/BackTouchTrackerTest.kt
@@ -46,45 +46,43 @@
         val linearTracker = linearTouchTracker()
         linearTracker.setGestureStartLocation(INITIAL_X_LEFT_EDGE, 0f, BackEvent.EDGE_LEFT)
         var touchX = 10f
-        val velocityX = 0f
-        val velocityY = 0f
 
         // Pre-commit
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((touchX - INITIAL_X_LEFT_EDGE) / MAX_DISTANCE)
 
         // Post-commit
         touchX += 100f
         linearTracker.setTriggerBack(true)
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((touchX - INITIAL_X_LEFT_EDGE) / MAX_DISTANCE)
 
         // Cancel
         touchX -= 10f
         linearTracker.setTriggerBack(false)
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress(0f)
 
         // Cancel more
         touchX -= 10f
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress(0f)
 
         // Restarted, but pre-commit
         val restartX = touchX
         touchX += 10f
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((touchX - restartX) / MAX_DISTANCE)
 
         // continue restart within pre-commit
         touchX += 10f
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((touchX - restartX) / MAX_DISTANCE)
 
         // Restarted, post-commit
         touchX += 10f
         linearTracker.setTriggerBack(true)
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((touchX - INITIAL_X_LEFT_EDGE) / MAX_DISTANCE)
     }
 
@@ -93,46 +91,44 @@
         val linearTracker = linearTouchTracker()
         linearTracker.setGestureStartLocation(INITIAL_X_RIGHT_EDGE, 0f, BackEvent.EDGE_RIGHT)
         var touchX = INITIAL_X_RIGHT_EDGE - 10 // Fake right edge
-        val velocityX = 0f
-        val velocityY = 0f
         val target = MAX_DISTANCE
 
         // Pre-commit
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((INITIAL_X_RIGHT_EDGE - touchX) / target)
 
         // Post-commit
         touchX -= 100f
         linearTracker.setTriggerBack(true)
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((INITIAL_X_RIGHT_EDGE - touchX) / target)
 
         // Cancel
         touchX += 10f
         linearTracker.setTriggerBack(false)
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress(0f)
 
         // Cancel more
         touchX += 10f
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress(0f)
 
         // Restarted, but pre-commit
         val restartX = touchX
         touchX -= 10f
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((restartX - touchX) / target)
 
         // continue restart within pre-commit
         touchX -= 10f
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((restartX - touchX) / target)
 
         // Restarted, post-commit
         touchX -= 10f
         linearTracker.setTriggerBack(true)
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((INITIAL_X_RIGHT_EDGE - touchX) / target)
     }
 
@@ -141,28 +137,26 @@
         val nonLinearTracker = nonLinearTouchTracker()
         nonLinearTracker.setGestureStartLocation(INITIAL_X_LEFT_EDGE, 0f, BackEvent.EDGE_LEFT)
         var touchX = 10f
-        val velocityX = 0f
-        val velocityY = 0f
         val linearTarget = LINEAR_DISTANCE + (MAX_DISTANCE - LINEAR_DISTANCE) * NON_LINEAR_FACTOR
 
         // Pre-commit: linear progress
-        nonLinearTracker.update(touchX, 0f, velocityX, velocityY)
+        nonLinearTracker.update(touchX, 0f)
         nonLinearTracker.assertProgress((touchX - INITIAL_X_LEFT_EDGE) / linearTarget)
 
         // Post-commit: still linear progress
         touchX += 100f
         nonLinearTracker.setTriggerBack(true)
-        nonLinearTracker.update(touchX, 0f, velocityX, velocityY)
+        nonLinearTracker.update(touchX, 0f)
         nonLinearTracker.assertProgress((touchX - INITIAL_X_LEFT_EDGE) / linearTarget)
 
         // still linear progress
         touchX = INITIAL_X_LEFT_EDGE + LINEAR_DISTANCE
-        nonLinearTracker.update(touchX, 0f, velocityX, velocityY)
+        nonLinearTracker.update(touchX, 0f)
         nonLinearTracker.assertProgress((touchX - INITIAL_X_LEFT_EDGE) / linearTarget)
 
         // non linear progress
         touchX += 10
-        nonLinearTracker.update(touchX, 0f, velocityX, velocityY)
+        nonLinearTracker.update(touchX, 0f)
         val nonLinearTouch = (touchX - INITIAL_X_LEFT_EDGE) - LINEAR_DISTANCE
         val nonLinearProgress = nonLinearTouch / NON_LINEAR_DISTANCE
         val nonLinearTarget = MathUtils.lerp(linearTarget, MAX_DISTANCE, nonLinearProgress)
@@ -178,7 +172,7 @@
         val velocityY = 0f
 
         // assert that progress is increased when increasing touchX
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((touchX - INITIAL_X_LEFT_EDGE) / MAX_DISTANCE)
 
         // assert that progress is reset to 0 when start location is updated
@@ -187,13 +181,13 @@
 
         // assert that progress remains 0 when touchX is decreased
         touchX -= 50
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress(0f)
 
         // assert that progress uses new minimal touchX for progress calculation
         val newInitialTouchX = touchX
         touchX += 100
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((touchX - newInitialTouchX) / MAX_DISTANCE)
 
         // assert the same for triggerBack==true
@@ -207,11 +201,8 @@
         linearTracker.setGestureStartLocation(INITIAL_X_RIGHT_EDGE, 0f, BackEvent.EDGE_RIGHT)
 
         var touchX = INITIAL_X_RIGHT_EDGE - 100f
-        val velocityX = 0f
-        val velocityY = 0f
-
         // assert that progress is increased when decreasing touchX
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((INITIAL_X_RIGHT_EDGE - touchX) / MAX_DISTANCE)
 
         // assert that progress is reset to 0 when start location is updated
@@ -220,13 +211,13 @@
 
         // assert that progress remains 0 when touchX is increased
         touchX += 50
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress(0f)
 
         // assert that progress uses new maximal touchX for progress calculation
         val newInitialTouchX = touchX
         touchX -= 100
-        linearTracker.update(touchX, 0f, velocityX, velocityY)
+        linearTracker.update(touchX, 0f)
         linearTracker.assertProgress((newInitialTouchX - touchX) / MAX_DISTANCE)
 
         // assert the same for triggerBack==true
diff --git a/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java b/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java
index 25f458e..b001cc2 100644
--- a/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java
+++ b/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java
@@ -18,6 +18,9 @@
 
 import static android.window.OnBackInvokedDispatcher.PRIORITY_DEFAULT;
 import static android.window.OnBackInvokedDispatcher.PRIORITY_OVERLAY;
+import static android.window.OnBackInvokedDispatcher.PRIORITY_SYSTEM_NAVIGATION_OBSERVER;
+
+import static com.android.window.flags.Flags.FLAG_PREDICTIVE_BACK_PRIORITY_SYSTEM_NAVIGATION_OBSERVER;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -39,6 +42,10 @@
 import android.os.Looper;
 import android.os.RemoteException;
 import android.platform.test.annotations.Presubmit;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 import android.view.IWindow;
 import android.view.IWindowSession;
 import android.view.ImeBackAnimationController;
@@ -80,6 +87,8 @@
 
     @Rule
     public final MockitoRule mockito = MockitoJUnit.rule();
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
 
     @Mock
     private IWindowSession mWindowSession;
@@ -145,7 +154,8 @@
         assertEquals("No setOnBackInvokedCallbackInfo", mCallbackInfoCalls, actual);
     }
 
-    private void assertCallbacksSize(int expectedDefault, int expectedOverlay) {
+    private void assertCallbacksSize(int expectedDefault, int expectedOverlay,
+            int expectedObserver) {
         ArrayList<OnBackInvokedCallback> callbacksDefault = mDispatcher
                 .mOnBackInvokedCallbacks.get(PRIORITY_DEFAULT);
         int actualSizeDefault = callbacksDefault != null ? callbacksDefault.size() : 0;
@@ -155,6 +165,10 @@
                 .mOnBackInvokedCallbacks.get(PRIORITY_OVERLAY);
         int actualSizeOverlay = callbacksOverlay != null ? callbacksOverlay.size() : 0;
         assertEquals("mOnBackInvokedCallbacks OVERLAY size", expectedOverlay, actualSizeOverlay);
+
+        int actualSizeObserver = mDispatcher.mSystemNavigationObserverCallback == null ? 0 : 1;
+        assertEquals("mOnBackInvokedCallbacks SYSTEM_NAVIGATION_OBSERVER size", expectedObserver,
+                actualSizeObserver);
     }
 
     private void assertTopCallback(OnBackInvokedCallback expectedCallback) {
@@ -164,13 +178,13 @@
     @Test
     public void registerCallback_samePriority_sameCallback() throws RemoteException {
         mDispatcher.registerOnBackInvokedCallback(PRIORITY_DEFAULT, mCallback1);
-        assertCallbacksSize(/* default */ 1, /* overlay */ 0);
+        assertCallbacksSize(/* default */ 1, /* overlay */ 0, /* observer */ 0);
         assertSetCallbackInfo();
         assertTopCallback(mCallback1);
 
         // The callback is removed and added again
         mDispatcher.registerOnBackInvokedCallback(PRIORITY_DEFAULT, mCallback1);
-        assertCallbacksSize(/* default */ 1, /* overlay */ 0);
+        assertCallbacksSize(/* default */ 1, /* overlay */ 0, /* observer */ 0);
         assertSetCallbackInfo();
         assertTopCallback(mCallback1);
 
@@ -182,13 +196,13 @@
     @Test
     public void registerCallback_samePriority_differentCallback() throws RemoteException {
         mDispatcher.registerOnBackInvokedCallback(PRIORITY_DEFAULT, mCallback1);
-        assertCallbacksSize(/* default */ 1, /* overlay */ 0);
+        assertCallbacksSize(/* default */ 1, /* overlay */ 0, /* observer */ 0);
         assertSetCallbackInfo();
         assertTopCallback(mCallback1);
 
         // The new callback becomes the TopCallback
         mDispatcher.registerOnBackInvokedCallback(PRIORITY_DEFAULT, mCallback2);
-        assertCallbacksSize(/* default */ 2, /* overlay */ 0);
+        assertCallbacksSize(/* default */ 2, /* overlay */ 0, /* observer */ 0);
         assertSetCallbackInfo();
         assertTopCallback(mCallback2);
 
@@ -201,13 +215,13 @@
     @Test
     public void registerCallback_differentPriority_sameCallback() throws RemoteException {
         mDispatcher.registerOnBackInvokedCallback(PRIORITY_OVERLAY, mCallback1);
-        assertCallbacksSize(/* default */ 0, /* overlay */ 1);
+        assertCallbacksSize(/* default */ 0, /* overlay */ 1, /* observer */ 0);
         assertSetCallbackInfo();
         assertTopCallback(mCallback1);
 
         // The callback is moved to the new priority list
         mDispatcher.registerOnBackInvokedCallback(PRIORITY_DEFAULT, mCallback1);
-        assertCallbacksSize(/* default */ 1, /* overlay */ 0);
+        assertCallbacksSize(/* default */ 1, /* overlay */ 0, /* observer */ 0);
         assertSetCallbackInfo();
         assertTopCallback(mCallback1);
 
@@ -220,13 +234,13 @@
     public void registerCallback_differentPriority_differentCallback() throws RemoteException {
         mDispatcher.registerOnBackInvokedCallback(PRIORITY_OVERLAY, mCallback1);
         assertSetCallbackInfo();
-        assertCallbacksSize(/* default */ 0, /* overlay */ 1);
+        assertCallbacksSize(/* default */ 0, /* overlay */ 1, /* observer */ 0);
         assertTopCallback(mCallback1);
 
         // The callback with higher priority is still the TopCallback
         mDispatcher.registerOnBackInvokedCallback(PRIORITY_DEFAULT, mCallback2);
         assertNoSetCallbackInfo();
-        assertCallbacksSize(/* default */ 1, /* overlay */ 1);
+        assertCallbacksSize(/* default */ 1, /* overlay */ 1, /* observer */ 0);
         assertTopCallback(mCallback1);
 
         waitForIdle();
@@ -238,22 +252,22 @@
     @Test
     public void registerCallback_sameInstanceAddedTwice() throws RemoteException {
         mDispatcher.registerOnBackInvokedCallback(PRIORITY_OVERLAY, mCallback1);
-        assertCallbacksSize(/* default */ 0, /* overlay */ 1);
+        assertCallbacksSize(/* default */ 0, /* overlay */ 1, /* observer */ 0);
         assertSetCallbackInfo();
         assertTopCallback(mCallback1);
 
         mDispatcher.registerOnBackInvokedCallback(PRIORITY_DEFAULT, mCallback2);
-        assertCallbacksSize(/* default */ 1, /* overlay */ 1);
+        assertCallbacksSize(/* default */ 1, /* overlay */ 1, /* observer */ 0);
         assertNoSetCallbackInfo();
         assertTopCallback(mCallback1);
 
         mDispatcher.registerOnBackInvokedCallback(PRIORITY_DEFAULT, mCallback1);
-        assertCallbacksSize(/* default */ 2, /* overlay */ 0);
+        assertCallbacksSize(/* default */ 2, /* overlay */ 0, /* observer */ 0);
         assertSetCallbackInfo();
         assertTopCallback(mCallback1);
 
         mDispatcher.registerOnBackInvokedCallback(PRIORITY_OVERLAY, mCallback2);
-        assertCallbacksSize(/* default */ 1, /* overlay */ 1);
+        assertCallbacksSize(/* default */ 1, /* overlay */ 1, /* observer */ 0);
         assertSetCallbackInfo();
         assertTopCallback(mCallback2);
 
@@ -561,20 +575,116 @@
         waitForIdle();
         onBackCancelledCalled.await(1000, TimeUnit.MILLISECONDS);
 
+        verify(mWindowSession, timeout(1000)).setOnBackInvokedCallbackInfo(Mockito.eq(mWindow),
+                isNull());
+        waitForIdle();
         // verify that onBackCancelled is called exactly once in this case
         assertEquals(0, onBackCancelledCalled.getCount());
         assertEquals(0, onBackInvokedCalled.get());
-        verify(mWindowSession).setOnBackInvokedCallbackInfo(Mockito.eq(mWindow), isNull());
         assertFalse(mDispatcher.mProgressAnimator.isBackAnimationInProgress());
     }
 
+    @Test(expected = IllegalArgumentException.class)
+    @RequiresFlagsDisabled(FLAG_PREDICTIVE_BACK_PRIORITY_SYSTEM_NAVIGATION_OBSERVER)
+    public void testObserverCallback_registrationFailsWithoutFlaggedApiEnabled() {
+        mDispatcher.registerOnBackInvokedCallback(PRIORITY_SYSTEM_NAVIGATION_OBSERVER, mCallback2);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PREDICTIVE_BACK_PRIORITY_SYSTEM_NAVIGATION_OBSERVER)
+    public void testObserverCallback_invokedWithSystemCallback() throws RemoteException {
+        mDispatcher.registerSystemOnBackInvokedCallback(mCallback1);
+        mDispatcher.registerOnBackInvokedCallback(PRIORITY_SYSTEM_NAVIGATION_OBSERVER, mCallback2);
+
+        assertCallbacksSize(/* default */ 0, /* overlay */ 0, /* observer */ 1);
+        OnBackInvokedCallbackInfo callbackInfo = assertSetCallbackInfo();
+        assertTopCallback(mCallback1);
+
+        callbackInfo.getCallback().onBackStarted(mBackEvent);
+        waitForIdle();
+        verify(mCallback1).onBackStarted(any());
+        verify(mCallback2, never()).onBackStarted(any());
+
+        callbackInfo.getCallback().onBackProgressed(mBackEvent);
+        waitForIdle();
+        verify(mCallback1, atLeast(1)).onBackProgressed(any());
+        verify(mCallback2, never()).onBackProgressed(any());
+
+        callbackInfo.getCallback().onBackCancelled();
+        waitForIdle();
+        verify(mCallback1, timeout(1000)).onBackCancelled();
+        verify(mCallback2, never()).onBackCancelled();
+
+        // start new gesture to test onBackInvoked case
+        callbackInfo.getCallback().onBackStarted(mBackEvent);
+        callbackInfo.getCallback().onBackInvoked();
+        waitForIdle();
+        verify(mCallback1, timeout(1000)).onBackInvoked();
+        verify(mCallback2).onBackInvoked();
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PREDICTIVE_BACK_PRIORITY_SYSTEM_NAVIGATION_OBSERVER)
+    public void testObserverCallback_notInvokedWithNonSystemCallback() throws RemoteException {
+        mDispatcher.registerOnBackInvokedCallback(PRIORITY_DEFAULT, mCallback1);
+        mDispatcher.registerOnBackInvokedCallback(PRIORITY_SYSTEM_NAVIGATION_OBSERVER, mCallback2);
+
+        assertCallbacksSize(/* default */ 1, /* overlay */ 0, /* observer */ 1);
+        OnBackInvokedCallbackInfo callbackInfo = assertSetCallbackInfo();
+        assertTopCallback(mCallback1);
+
+        callbackInfo.getCallback().onBackStarted(mBackEvent);
+        waitForIdle();
+        verify(mCallback1).onBackStarted(any());
+        verify(mCallback2, never()).onBackStarted(any());
+
+        callbackInfo.getCallback().onBackProgressed(mBackEvent);
+        waitForIdle();
+        verify(mCallback1, atLeast(1)).onBackProgressed(any());
+        verify(mCallback2, never()).onBackProgressed(any());
+
+        callbackInfo.getCallback().onBackCancelled();
+        waitForIdle();
+        verify(mCallback1, timeout(1000)).onBackCancelled();
+        verify(mCallback2, never()).onBackCancelled();
+
+        // start new gesture to test onBackInvoked case
+        callbackInfo.getCallback().onBackStarted(mBackEvent);
+        callbackInfo.getCallback().onBackInvoked();
+        waitForIdle();
+        verify(mCallback1, timeout(1000)).onBackInvoked();
+        verify(mCallback2, never()).onBackInvoked();
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PREDICTIVE_BACK_PRIORITY_SYSTEM_NAVIGATION_OBSERVER)
+    public void testObserverCallback_reregistrations() {
+        mDispatcher.registerOnBackInvokedCallback(PRIORITY_SYSTEM_NAVIGATION_OBSERVER, mCallback1);
+        assertCallbacksSize(/* default */ 0, /* overlay */ 0, /* observer */ 1);
+        assertEquals(mCallback1, mDispatcher.mSystemNavigationObserverCallback);
+
+        // test reregistration of observer-callback as observer-callback
+        mDispatcher.registerOnBackInvokedCallback(PRIORITY_SYSTEM_NAVIGATION_OBSERVER, mCallback2);
+        assertCallbacksSize(/* default */ 0, /* overlay */ 0, /* observer */ 1);
+        assertEquals(mCallback2, mDispatcher.mSystemNavigationObserverCallback);
+
+        // test reregistration of observer-callback as regular callback
+        mDispatcher.registerOnBackInvokedCallback(PRIORITY_DEFAULT, mCallback2);
+        assertCallbacksSize(/* default */ 1, /* overlay */ 0, /* observer */ 0);
+
+        // test reregistration of regular callback as observer-callback
+        mDispatcher.registerOnBackInvokedCallback(PRIORITY_SYSTEM_NAVIGATION_OBSERVER, mCallback2);
+        assertCallbacksSize(/* default */ 0, /* overlay */ 0, /* observer */ 1);
+
+        mDispatcher.unregisterOnBackInvokedCallback(mCallback2);
+        assertCallbacksSize(/* default */ 0, /* overlay */ 0, /* observer */ 0);
+    }
+
     private BackMotionEvent backMotionEventFrom(float progress) {
         return new BackMotionEvent(
                 /* touchX = */ 0,
                 /* touchY = */ 0,
                 /* progress = */ progress,
-                /* velocityX = */ 0,
-                /* velocityY = */ 0,
                 /* triggerBack = */ false,
                 /* swipeEdge = */ BackEvent.EDGE_LEFT,
                 /* departingAnimationTarget = */ null);
@@ -583,13 +693,13 @@
     private void verifyImeCallackRegistrations() throws RemoteException {
         // verify default callback is replaced with ImeBackAnimationController
         mDispatcher.registerOnBackInvokedCallbackUnchecked(mDefaultImeCallback, PRIORITY_DEFAULT);
-        assertCallbacksSize(/* default */ 1, /* overlay */ 0);
+        assertCallbacksSize(/* default */ 1, /* overlay */ 0, /* observer */ 0);
         assertSetCallbackInfo();
         assertTopCallback(mImeBackAnimationController);
 
         // verify regular ime callback is successfully registered
         mDispatcher.registerOnBackInvokedCallbackUnchecked(mImeCallback, PRIORITY_DEFAULT);
-        assertCallbacksSize(/* default */ 2, /* overlay */ 0);
+        assertCallbacksSize(/* default */ 2, /* overlay */ 0, /* observer */ 0);
         assertSetCallbackInfo();
         assertTopCallback(mImeCallback);
     }
diff --git a/core/tests/coretests/src/com/android/internal/notification/SystemNotificationChannelsTest.java b/core/tests/coretests/src/com/android/internal/notification/SystemNotificationChannelsTest.java
new file mode 100644
index 0000000..0bf406c
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/notification/SystemNotificationChannelsTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2024 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.internal.notification;
+
+import static com.android.internal.notification.SystemNotificationChannels.ABUSIVE_BACKGROUND_APPS;
+import static com.android.internal.notification.SystemNotificationChannels.ACCESSIBILITY_MAGNIFICATION;
+import static com.android.internal.notification.SystemNotificationChannels.ACCESSIBILITY_SECURITY_POLICY;
+import static com.android.internal.notification.SystemNotificationChannels.ACCOUNT;
+import static com.android.internal.notification.SystemNotificationChannels.ALERTS;
+import static com.android.internal.notification.SystemNotificationChannels.CAR_MODE;
+import static com.android.internal.notification.SystemNotificationChannels.DEVELOPER;
+import static com.android.internal.notification.SystemNotificationChannels.DEVELOPER_IMPORTANT;
+import static com.android.internal.notification.SystemNotificationChannels.DEVICE_ADMIN;
+import static com.android.internal.notification.SystemNotificationChannels.FOREGROUND_SERVICE;
+import static com.android.internal.notification.SystemNotificationChannels.HEAVY_WEIGHT_APP;
+import static com.android.internal.notification.SystemNotificationChannels.NETWORK_ALERTS;
+import static com.android.internal.notification.SystemNotificationChannels.NETWORK_AVAILABLE;
+import static com.android.internal.notification.SystemNotificationChannels.NETWORK_STATUS;
+import static com.android.internal.notification.SystemNotificationChannels.OBSOLETE_DO_NOT_DISTURB;
+import static com.android.internal.notification.SystemNotificationChannels.PHYSICAL_KEYBOARD;
+import static com.android.internal.notification.SystemNotificationChannels.RETAIL_MODE;
+import static com.android.internal.notification.SystemNotificationChannels.SECURITY;
+import static com.android.internal.notification.SystemNotificationChannels.SYSTEM_CHANGES;
+import static com.android.internal.notification.SystemNotificationChannels.UPDATES;
+import static com.android.internal.notification.SystemNotificationChannels.USB;
+import static com.android.internal.notification.SystemNotificationChannels.VPN;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.verify;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.testing.TestableContext;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class SystemNotificationChannelsTest {
+
+    @Rule public TestableContext mContext = new TestableContext(
+            ApplicationProvider.getApplicationContext());
+
+    @Mock private NotificationManager mNm;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext.addMockSystemService(NotificationManager.class, mNm);
+    }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    public void createAll_createsExpectedChannels() {
+        ArgumentCaptor<List<NotificationChannel>> createdChannelsCaptor =
+                ArgumentCaptor.forClass(List.class);
+
+        SystemNotificationChannels.createAll(mContext);
+
+        verify(mNm).createNotificationChannels(createdChannelsCaptor.capture());
+        List<NotificationChannel> createdChannels = createdChannelsCaptor.getValue();
+        assertThat(createdChannels.stream().map(NotificationChannel::getId).toList())
+                .containsExactly(PHYSICAL_KEYBOARD, SECURITY, CAR_MODE, ACCOUNT, DEVELOPER,
+                        DEVELOPER_IMPORTANT, UPDATES, NETWORK_STATUS, NETWORK_ALERTS,
+                        NETWORK_AVAILABLE, VPN, DEVICE_ADMIN, ALERTS, RETAIL_MODE, USB,
+                        FOREGROUND_SERVICE, HEAVY_WEIGHT_APP, SYSTEM_CHANGES,
+                        ACCESSIBILITY_MAGNIFICATION, ACCESSIBILITY_SECURITY_POLICY,
+                        ABUSIVE_BACKGROUND_APPS);
+    }
+
+    @Test
+    public void createAll_deletesObsoleteChannels() {
+        ArgumentCaptor<String> deletedChannelCaptor = ArgumentCaptor.forClass(String.class);
+
+        SystemNotificationChannels.createAll(mContext);
+
+        verify(mNm, atLeastOnce()).deleteNotificationChannel(deletedChannelCaptor.capture());
+        List<String> deletedChannels = deletedChannelCaptor.getAllValues();
+        assertThat(deletedChannels).containsExactly(OBSOLETE_DO_NOT_DISTURB);
+    }
+}
diff --git a/core/tests/resourceflaggingtests/src/com/android/resourceflaggingtests/ResourceFlaggingTest.java b/core/tests/resourceflaggingtests/src/com/android/resourceflaggingtests/ResourceFlaggingTest.java
index 005538a..a37000a 100644
--- a/core/tests/resourceflaggingtests/src/com/android/resourceflaggingtests/ResourceFlaggingTest.java
+++ b/core/tests/resourceflaggingtests/src/com/android/resourceflaggingtests/ResourceFlaggingTest.java
@@ -24,11 +24,13 @@
 import android.content.res.AssetManager;
 import android.content.res.Configuration;
 import android.content.res.Resources;
+import android.content.res.TypedArray;
 import android.os.FileUtils;
 import android.util.DisplayMetrics;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.LinearLayout;
+import android.widget.TextView;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
@@ -78,6 +80,16 @@
     }
 
     @Test
+    public void testNegatedDisabledFlag() {
+        assertThat(mResources.getBoolean(R.bool.bool5)).isTrue();
+    }
+
+    @Test
+    public void testNegatedEnabledFlag() {
+        assertThat(mResources.getBoolean(R.bool.bool6)).isTrue();
+    }
+
+    @Test
     public void testFlagEnabledDifferentCompilationUnit() {
         assertThat(mResources.getBoolean(R.bool.bool3)).isTrue();
     }
@@ -94,6 +106,26 @@
     }
 
     @Test
+    public void testDirectoryEnabledFlag() {
+        assertThat(mResources.getBoolean(R.bool.bool8)).isTrue();
+    }
+
+    @Test
+    public void testDirectoryDisabledFlag() {
+        assertThat(mResources.getBoolean(R.bool.bool7)).isTrue();
+    }
+
+    @Test
+    public void testDirectoryNegatedEnabledFlag() {
+        assertThat(mResources.getBoolean(R.bool.bool9)).isTrue();
+    }
+
+    @Test
+    public void testDirectoryNegatedDisabledFlag() {
+        assertThat(mResources.getBoolean(R.bool.bool10)).isTrue();
+    }
+
+    @Test
     public void testLayoutWithDisabledElements() {
         LinearLayout ll = (LinearLayout) getLayoutInflater().inflate(R.layout.layout1, null);
         assertThat(ll).isNotNull();
@@ -102,6 +134,45 @@
         assertThat((View) ll.findViewById(R.id.text2)).isNotNull();
     }
 
+    @Test
+    public void testEnabledFlagLayoutOverrides() {
+        LinearLayout ll = (LinearLayout) getLayoutInflater().inflate(R.layout.layout3, null);
+        assertThat(ll).isNotNull();
+        assertThat((View) ll.findViewById(R.id.text1)).isNotNull();
+        assertThat(((TextView) ll.findViewById(R.id.text1)).getText()).isEqualTo("foobar");
+    }
+
+    @Test(expected = Resources.NotFoundException.class)
+    public void testDisabledLayout() {
+        getLayoutInflater().inflate(R.layout.layout2, null);
+    }
+
+    @Test(expected = Resources.NotFoundException.class)
+    public void testDisabledDrawable() {
+        mResources.getDrawable(R.drawable.removedpng);
+    }
+
+    @Test
+    public void testDisabledStyleDoesntOverride() {
+        TypedArray ta = mResources.newTheme().obtainStyledAttributes(
+                R.style.style1, new int[] { android.R.attr.windowIsTranslucent});
+        assertThat(ta.getBoolean(0, false)).isTrue();
+    }
+
+    @Test
+    public void testEnabledStyleDoesOverride() {
+        TypedArray ta = mResources.newTheme().obtainStyledAttributes(
+                R.style.style2, new int[] { android.R.attr.windowIsTranslucent});
+        assertThat(ta.getBoolean(0, false)).isTrue();
+    }
+
+    @Test
+    public void testEnabledStyleItemDoesOverride() {
+        TypedArray ta = mResources.newTheme().obtainStyledAttributes(
+                R.style.style3, new int[] { android.R.attr.windowIsTranslucent});
+        assertThat(ta.getBoolean(0, false)).isTrue();
+    }
+
     private LayoutInflater getLayoutInflater() {
         ContextWrapper c = new ContextWrapper(mContext) {
             private LayoutInflater mInflater;
diff --git a/core/tests/utiltests/Android.bp b/core/tests/utiltests/Android.bp
index cdc8a9e..7cf49ab 100644
--- a/core/tests/utiltests/Android.bp
+++ b/core/tests/utiltests/Android.bp
@@ -61,7 +61,7 @@
         "androidx.annotation_annotation",
         "androidx.test.rules",
         "frameworks-base-testutils",
-        "servicestests-utils",
+        "servicestests-utils-ravenwood",
     ],
     srcs: [
         "src/android/util/IRemoteMemoryIntArray.aidl",
diff --git a/core/tests/vibrator/src/android/os/VibratorInfoTest.java b/core/tests/vibrator/src/android/os/VibratorInfoTest.java
index c810810..47d01c4 100644
--- a/core/tests/vibrator/src/android/os/VibratorInfoTest.java
+++ b/core/tests/vibrator/src/android/os/VibratorInfoTest.java
@@ -40,10 +40,10 @@
     private static final float[] TEST_AMPLITUDE_MAP = new float[]{
             /* 50Hz= */ 0.1f, 0.2f, 0.4f, 0.8f, /* 150Hz= */ 1f, 0.9f, /* 200Hz= */ 0.8f};
 
-    private static final VibratorInfo.FrequencyProfile EMPTY_FREQUENCY_PROFILE =
-            new VibratorInfo.FrequencyProfile(Float.NaN, Float.NaN, Float.NaN, null);
-    private static final VibratorInfo.FrequencyProfile TEST_FREQUENCY_PROFILE =
-            new VibratorInfo.FrequencyProfile(TEST_RESONANT_FREQUENCY, TEST_MIN_FREQUENCY,
+    private static final VibratorInfo.FrequencyProfileLegacy EMPTY_FREQUENCY_PROFILE =
+            new VibratorInfo.FrequencyProfileLegacy(Float.NaN, Float.NaN, Float.NaN, null);
+    private static final VibratorInfo.FrequencyProfileLegacy TEST_FREQUENCY_PROFILE_LEGACY =
+            new VibratorInfo.FrequencyProfileLegacy(TEST_RESONANT_FREQUENCY, TEST_MIN_FREQUENCY,
                     TEST_FREQUENCY_RESOLUTION, TEST_AMPLITUDE_MAP);
 
     @Test
@@ -179,53 +179,57 @@
     }
 
     @Test
-    public void testGetFrequencyProfile_unsetProfileIsEmpty() {
-        assertTrue(
-                new VibratorInfo.Builder(TEST_VIBRATOR_ID).build().getFrequencyProfile().isEmpty());
+    public void testGetFrequencyProfileLegacy_unsetProfileIsEmpty() {
+        assertTrue(new VibratorInfo.Builder(
+                TEST_VIBRATOR_ID).build().getFrequencyProfileLegacy().isEmpty());
     }
 
     @Test
     public void testFrequencyProfile_invalidValuesCreatesEmptyProfile() {
         // Invalid, contains NaN values or empty array.
-        assertTrue(new VibratorInfo.FrequencyProfile(
+        assertTrue(new VibratorInfo.FrequencyProfileLegacy(
                 Float.NaN, 50, 25, TEST_AMPLITUDE_MAP).isEmpty());
-        assertTrue(new VibratorInfo.FrequencyProfile(
+        assertTrue(new VibratorInfo.FrequencyProfileLegacy(
                 150, Float.NaN, 25, TEST_AMPLITUDE_MAP).isEmpty());
-        assertTrue(new VibratorInfo.FrequencyProfile(
+        assertTrue(new VibratorInfo.FrequencyProfileLegacy(
                 150, 50, Float.NaN, TEST_AMPLITUDE_MAP).isEmpty());
-        assertTrue(new VibratorInfo.FrequencyProfile(150, 50, 25, null).isEmpty());
+        assertTrue(new VibratorInfo.FrequencyProfileLegacy(150, 50, 25, null).isEmpty());
         // Invalid, contains zero or negative frequency values.
-        assertTrue(new VibratorInfo.FrequencyProfile(-1, 50, 25, TEST_AMPLITUDE_MAP).isEmpty());
-        assertTrue(new VibratorInfo.FrequencyProfile(150, 0, 25, TEST_AMPLITUDE_MAP).isEmpty());
-        assertTrue(new VibratorInfo.FrequencyProfile(150, 50, -2, TEST_AMPLITUDE_MAP).isEmpty());
+        assertTrue(
+                new VibratorInfo.FrequencyProfileLegacy(-1, 50, 25, TEST_AMPLITUDE_MAP).isEmpty());
+        assertTrue(
+                new VibratorInfo.FrequencyProfileLegacy(150, 0, 25, TEST_AMPLITUDE_MAP).isEmpty());
+        assertTrue(
+                new VibratorInfo.FrequencyProfileLegacy(150, 50, -2, TEST_AMPLITUDE_MAP).isEmpty());
         // Invalid max amplitude entries.
-        assertTrue(new VibratorInfo.FrequencyProfile(
+        assertTrue(new VibratorInfo.FrequencyProfileLegacy(
                 150, 50, 50, new float[] { -1, 0, 1, 1, 0 }).isEmpty());
-        assertTrue(new VibratorInfo.FrequencyProfile(
+        assertTrue(new VibratorInfo.FrequencyProfileLegacy(
                 150, 50, 50, new float[] { 0, 1, 2, 1, 0 }).isEmpty());
         // Invalid, minFrequency > resonantFrequency
-        assertTrue(new VibratorInfo.FrequencyProfile(
+        assertTrue(new VibratorInfo.FrequencyProfileLegacy(
                 /* resonantFrequencyHz= */ 150, /* minFrequencyHz= */ 250, 25, TEST_AMPLITUDE_MAP)
                 .isEmpty());
         // Invalid, maxFrequency < resonantFrequency by changing resolution.
-        assertTrue(new VibratorInfo.FrequencyProfile(
+        assertTrue(new VibratorInfo.FrequencyProfileLegacy(
                 150, 50, /* frequencyResolutionHz= */ 10, TEST_AMPLITUDE_MAP).isEmpty());
     }
 
     @Test
     public void testGetFrequencyRangeHz_emptyProfileReturnsNull() {
-        assertNull(new VibratorInfo.FrequencyProfile(
+        assertNull(new VibratorInfo.FrequencyProfileLegacy(
                 Float.NaN, 50, 25, TEST_AMPLITUDE_MAP).getFrequencyRangeHz());
-        assertNull(new VibratorInfo.FrequencyProfile(
+        assertNull(new VibratorInfo.FrequencyProfileLegacy(
                 150, Float.NaN, 25, TEST_AMPLITUDE_MAP).getFrequencyRangeHz());
-        assertNull(new VibratorInfo.FrequencyProfile(
+        assertNull(new VibratorInfo.FrequencyProfileLegacy(
                 150, 50, Float.NaN, TEST_AMPLITUDE_MAP).getFrequencyRangeHz());
-        assertNull(new VibratorInfo.FrequencyProfile(150, 50, 25, null).getFrequencyRangeHz());
+        assertNull(
+                new VibratorInfo.FrequencyProfileLegacy(150, 50, 25, null).getFrequencyRangeHz());
     }
 
     @Test
     public void testGetFrequencyRangeHz_validProfileReturnsMappedValues() {
-        VibratorInfo.FrequencyProfile profile = new VibratorInfo.FrequencyProfile(
+        VibratorInfo.FrequencyProfileLegacy profile = new VibratorInfo.FrequencyProfileLegacy(
                 /* resonantFrequencyHz= */ 150,
                 /* minFrequencyHz= */ 50,
                 /* frequencyResolutionHz= */ 25,
@@ -239,12 +243,12 @@
 
     @Test
     public void testGetMaxAmplitude_emptyProfileReturnsAlwaysZero() {
-        VibratorInfo.FrequencyProfile profile = EMPTY_FREQUENCY_PROFILE;
+        VibratorInfo.FrequencyProfileLegacy profile = EMPTY_FREQUENCY_PROFILE;
         assertEquals(0f, profile.getMaxAmplitude(Float.NaN), TEST_TOLERANCE);
         assertEquals(0f, profile.getMaxAmplitude(100f), TEST_TOLERANCE);
         assertEquals(0f, profile.getMaxAmplitude(200f), TEST_TOLERANCE);
 
-        profile = new VibratorInfo.FrequencyProfile(
+        profile = new VibratorInfo.FrequencyProfileLegacy(
                         /* resonantFrequencyHz= */ 150,
                         /* minFrequencyHz= */ Float.NaN,
                         /* frequencyResolutionHz= */ Float.NaN,
@@ -257,7 +261,7 @@
 
     @Test
     public void testGetMaxAmplitude_validProfileReturnsMappedValues() {
-        VibratorInfo.FrequencyProfile profile = new VibratorInfo.FrequencyProfile(
+        VibratorInfo.FrequencyProfileLegacy profile = new VibratorInfo.FrequencyProfileLegacy(
                         /* resonantFrequencyHz= */ 150,
                         /* minFrequencyHz= */ 50,
                         /* frequencyResolutionHz= */ 25,
@@ -301,7 +305,7 @@
                     .setPwlePrimitiveDurationMax(50)
                     .setPwleSizeMax(20)
                     .setQFactor(2f)
-                    .setFrequencyProfile(TEST_FREQUENCY_PROFILE)
+                    .setFrequencyProfileLegacy(TEST_FREQUENCY_PROFILE_LEGACY)
                     .setMaxEnvelopeEffectSize(16)
                     .setMinEnvelopeEffectControlPointDurationMillis(20)
                     .setMaxEnvelopeEffectControlPointDurationMillis(1_000);
@@ -344,7 +348,7 @@
         assertFalse(complete.equalContent(completeWithDifferentPrimitiveDuration));
 
         VibratorInfo completeWithDifferentFrequencyProfile = completeBuilder
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(
                         TEST_RESONANT_FREQUENCY + 20,
                         TEST_MIN_FREQUENCY + 10,
                         TEST_FREQUENCY_RESOLUTION + 5,
@@ -354,7 +358,7 @@
         assertFalse(complete.equalContent(completeWithDifferentFrequencyProfile));
 
         VibratorInfo completeWithEmptyFrequencyProfile = completeBuilder
-                .setFrequencyProfile(EMPTY_FREQUENCY_PROFILE)
+                .setFrequencyProfileLegacy(EMPTY_FREQUENCY_PROFILE)
                 .build();
         assertNotEquals(complete, completeWithEmptyFrequencyProfile);
         assertFalse(complete.equalContent(completeWithEmptyFrequencyProfile));
@@ -391,7 +395,7 @@
                 .setSupportedEffects(VibrationEffect.EFFECT_CLICK)
                 .setSupportedPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 20)
                 .setQFactor(Float.NaN)
-                .setFrequencyProfile(TEST_FREQUENCY_PROFILE)
+                .setFrequencyProfileLegacy(TEST_FREQUENCY_PROFILE_LEGACY)
                 .build();
 
         Parcel parcel = Parcel.obtain();
diff --git a/core/tests/vibrator/src/android/os/vibrator/MultiVibratorInfoTest.java b/core/tests/vibrator/src/android/os/vibrator/MultiVibratorInfoTest.java
index fc31ac4..f192b89 100644
--- a/core/tests/vibrator/src/android/os/vibrator/MultiVibratorInfoTest.java
+++ b/core/tests/vibrator/src/android/os/vibrator/MultiVibratorInfoTest.java
@@ -161,12 +161,12 @@
         VibratorInfo firstInfo = new VibratorInfo.Builder(/* id= */ 1)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
                 .setQFactor(1f)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(1, 1, 1, null))
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(1, 1, 1, null))
                 .build();
         VibratorInfo secondInfo = new VibratorInfo.Builder(/* id= */ 2)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
                 .setQFactor(2f)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(2, 2, 2, null))
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(2, 2, 2, null))
                 .build();
 
         VibratorInfo info = new MultiVibratorInfo(/* id= */ 1,
@@ -191,13 +191,13 @@
         VibratorInfo firstInfo = new VibratorInfo.Builder(/* id= */ 1)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
                 .setQFactor(10f)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(
                         /* resonantFrequencyHz= */ 11, 10, 0.5f, null))
                 .build();
         VibratorInfo secondInfo = new VibratorInfo.Builder(/* id= */ 2)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
                 .setQFactor(10f)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(
                         /* resonantFrequencyHz= */ 11, 5, 1, null))
                 .build();
 
@@ -207,20 +207,20 @@
         assertEquals(10f, info.getQFactor(), TEST_TOLERANCE);
         assertEquals(11f, info.getResonantFrequencyHz(), TEST_TOLERANCE);
         // No frequency range defined.
-        assertTrue(info.getFrequencyProfile().isEmpty());
+        assertTrue(info.getFrequencyProfileLegacy().isEmpty());
         assertEquals(false, info.hasCapability(IVibrator.CAP_FREQUENCY_CONTROL));
     }
 
     @Test
-    public void testGetFrequencyProfile_differentResonantFrequencyOrResolutions_returnsEmpty() {
+    public void testGetFrequencyProfileLegacy_differentResonantFreqOrResolutions_returnsEmpty() {
         VibratorInfo firstInfo = new VibratorInfo.Builder(/* id= */ 1)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(1, 1, 1,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(1, 1, 1,
                         new float[] { 0, 1 }))
                 .build();
         VibratorInfo differentResonantFrequency = new VibratorInfo.Builder(/* id= */ 2)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(2, 1, 1,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(2, 1, 1,
                         new float[] { 0, 1 }))
                 .build();
         VibratorInfo info = new MultiVibratorInfo(/* id= */ 1,
@@ -230,7 +230,7 @@
 
         VibratorInfo differentFrequencyResolution = new VibratorInfo.Builder(/* id= */ 2)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(1, 1, 2,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(1, 1, 2,
                         new float[] { 0, 1 }))
                 .build();
         info = new MultiVibratorInfo(/* id= */ 1,
@@ -240,15 +240,15 @@
     }
 
     @Test
-    public void testGetFrequencyProfile_missingValues_returnsEmpty() {
+    public void testGetFrequencyProfileLegacy_missingValues_returnsEmpty() {
         VibratorInfo firstInfo = new VibratorInfo.Builder(/* id= */ 1)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(1, 1, 1,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(1, 1, 1,
                         new float[] { 0, 1 }))
                 .build();
         VibratorInfo missingResonantFrequency = new VibratorInfo.Builder(/* id= */ 2)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(Float.NaN, 1, 1,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(Float.NaN, 1, 1,
                         new float[] { 0, 1 }))
                 .build();
 
@@ -259,7 +259,7 @@
 
         VibratorInfo missingMinFrequency = new VibratorInfo.Builder(/* id= */ 2)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(1, Float.NaN, 1,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(1, Float.NaN, 1,
                         new float[] { 0, 1 }))
                 .build();
         info = new MultiVibratorInfo(/* id= */ 1,
@@ -269,7 +269,7 @@
 
         VibratorInfo missingFrequencyResolution = new VibratorInfo.Builder(/* id= */ 2)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(1, 1, Float.NaN,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(1, 1, Float.NaN,
                         new float[] { 0, 1 }))
                 .build();
         info = new MultiVibratorInfo(/* id= */ 1,
@@ -279,7 +279,7 @@
 
         VibratorInfo missingMaxAmplitudes = new VibratorInfo.Builder(/* id= */ 2)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(1, 1, 1, null))
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(1, 1, 1, null))
                 .build();
         info = new MultiVibratorInfo(/* id= */ 1,
                 new VibratorInfo[]{firstInfo, missingMaxAmplitudes});
@@ -288,20 +288,20 @@
     }
 
     @Test
-    public void testGetFrequencyProfile_unalignedMaxAmplitudes_returnsEmpty() {
+    public void testGetFrequencyProfileLegacy_unalignedMaxAmplitudes_returnsEmpty() {
         VibratorInfo firstInfo = new VibratorInfo.Builder(/* id= */ 1)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(11, 10, 0.5f,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(11, 10, 0.5f,
                         new float[] { 0, 1, 1, 0 }))
                 .build();
         VibratorInfo unalignedMinFrequency = new VibratorInfo.Builder(/* id= */ 2)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(11, 10.1f, 0.5f,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(11, 10.1f, 0.5f,
                         new float[] { 0, 1, 1, 0 }))
                 .build();
         VibratorInfo thirdVibrator = new VibratorInfo.Builder(/* id= */ 2)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(11, 10.5f, 0.5f,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(11, 10.5f, 0.5f,
                         new float[] { 0, 1, 1, 0 }))
                 .build();
 
@@ -312,20 +312,20 @@
     }
 
     @Test
-    public void testGetFrequencyProfile_alignedProfiles_returnsIntersection() {
+    public void testGetFrequencyProfileLegacy_alignedProfiles_returnsIntersection() {
         VibratorInfo firstInfo = new VibratorInfo.Builder(/* id= */ 1)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(11, 10, 0.5f,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(11, 10, 0.5f,
                         new float[] { 0.5f, 1, 1, 0.5f }))
                 .build();
         VibratorInfo secondInfo = new VibratorInfo.Builder(/* id= */ 2)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(11, 10.5f, 0.5f,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(11, 10.5f, 0.5f,
                         new float[] { 1, 1, 1 }))
                 .build();
         VibratorInfo thirdVibrator = new VibratorInfo.Builder(/* id= */ 3)
                 .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(11, 10.5f, 0.5f,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(11, 10.5f, 0.5f,
                         new float[] { 0.8f, 1, 0.8f, 0.5f }))
                 .build();
 
@@ -333,21 +333,23 @@
                 new VibratorInfo[]{firstInfo, secondInfo, thirdVibrator});
 
         assertEquals(
-                new VibratorInfo.FrequencyProfile(11, 10.5f, 0.5f, new float[] { 0.8f, 1, 0.5f }),
-                info.getFrequencyProfile());
+                new VibratorInfo.FrequencyProfileLegacy(11, 10.5f, 0.5f,
+                        new float[]{0.8f, 1, 0.5f}),
+                info.getFrequencyProfileLegacy());
         assertEquals(true, info.hasCapability(IVibrator.CAP_FREQUENCY_CONTROL));
 
         // Third vibrator without frequency control capability.
         thirdVibrator = new VibratorInfo.Builder(/* id= */ 3)
-                .setFrequencyProfile(new VibratorInfo.FrequencyProfile(11, 10.5f, 0.5f,
+                .setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(11, 10.5f, 0.5f,
                         new float[] { 0.8f, 1, 0.8f, 0.5f }))
                 .build();
         info = new MultiVibratorInfo(/* id= */ 1,
                 new VibratorInfo[]{firstInfo, secondInfo, thirdVibrator});
 
         assertEquals(
-                new VibratorInfo.FrequencyProfile(11, 10.5f, 0.5f, new float[] { 0.8f, 1, 0.5f }),
-                info.getFrequencyProfile());
+                new VibratorInfo.FrequencyProfileLegacy(11, 10.5f, 0.5f,
+                        new float[]{0.8f, 1, 0.5f}),
+                info.getFrequencyProfileLegacy());
         assertEquals(false, info.hasCapability(IVibrator.CAP_FREQUENCY_CONTROL));
     }
 
@@ -355,7 +357,7 @@
      * Asserts that the frequency profile is empty, and therefore frequency control isn't supported.
      */
     private void assertEmptyFrequencyProfileAndControl(VibratorInfo info) {
-        assertTrue(info.getFrequencyProfile().isEmpty());
+        assertTrue(info.getFrequencyProfileLegacy().isEmpty());
         assertEquals(false, info.hasCapability(IVibrator.CAP_FREQUENCY_CONTROL));
     }
 }
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 880f30c..2e72f0e 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -585,6 +585,8 @@
         <permission name="android.permission.EXECUTE_APP_FUNCTIONS" />
         <!-- Permission required for CTS test - CtsNfcTestCases -->
         <permission name="android.permission.NFC_SET_CONTROLLER_ALWAYS_ON" />
+        <!-- Permission required for CTS test - CtsAppTestCases -->
+        <permission name="android.permission.KILL_UID" />
     </privapp-permissions>
 
     <privapp-permissions package="com.android.statementservice">
diff --git a/errorprone/java/com/google/errorprone/bugpatterns/android/RequiresPermissionChecker.java b/errorprone/java/com/google/errorprone/bugpatterns/android/RequiresPermissionChecker.java
index 9887c27..af26bd0 100644
--- a/errorprone/java/com/google/errorprone/bugpatterns/android/RequiresPermissionChecker.java
+++ b/errorprone/java/com/google/errorprone/bugpatterns/android/RequiresPermissionChecker.java
@@ -130,10 +130,6 @@
                             .onDescendantOf("android.content.Context")
                             .withNameMatching(
                                     Pattern.compile("^send(Ordered|Sticky)?Broadcast.*AsUser.*$")));
-    private static final Matcher<ExpressionTree> SEND_PENDING_INTENT = methodInvocation(
-            instanceMethod()
-                    .onDescendantOf("android.app.PendingIntent")
-                    .named("send"));
 
     private static final Matcher<ExpressionTree> INTENT_SET_ACTION = methodInvocation(
             instanceMethod().onDescendantOf("android.content.Intent").named("setAction"));
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 0b3e545..28c2ca3 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -155,7 +155,7 @@
     /**
      * Indicates whether this Canvas is drawing high contrast text.
      *
-     * @see android.view.accessibility.AccessibilityManager#isHighTextContrastEnabled()
+     * @see android.view.accessibility.AccessibilityManager#isHighContrastTextEnabled()
      * @return True if high contrast text is enabled, false otherwise.
      *
      * @hide
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index b866382..68d8ebb 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -41,6 +41,7 @@
 import android.text.TextUtils;
 
 import com.android.internal.annotations.GuardedBy;
+import com.android.text.flags.Flags;
 
 import dalvik.annotation.optimization.CriticalNative;
 import dalvik.annotation.optimization.FastNative;
@@ -2000,6 +2001,14 @@
     }
 
     /**
+     * A change ID for new font variation settings management.
+     * @hide
+     */
+    @ChangeId
+    @EnabledSince(targetSdkVersion = 36)
+    public static final long NEW_FONT_VARIATION_MANAGEMENT = 361260253L;
+
+    /**
      * Sets TrueType or OpenType font variation settings. The settings string is constructed from
      * multiple pairs of axis tag and style values. The axis tag must contain four ASCII characters
      * and must be wrapped with single quotes (U+0027) or double quotes (U+0022). Axis strings that
@@ -2028,12 +2037,16 @@
      * </li>
      * </ul>
      *
+     * <p>Note: If the application that targets API 35 or before, this function mutates the
+     * underlying typeface instance.
+     *
      * @param fontVariationSettings font variation settings. You can pass null or empty string as
      *                              no variation settings.
      *
-     * @return true if the given settings is effective to at least one font file underlying this
-     *         typeface. This function also returns true for empty settings string. Otherwise
-     *         returns false
+     * @return If the application that targets API 36 or later and is running on devices API 36 or
+     *         later, this function always returns true. Otherwise, this function returns true if
+     *         the given settings is effective to at least one font file underlying this typeface.
+     *         This function also returns true for empty settings string. Otherwise returns false.
      *
      * @throws IllegalArgumentException If given string is not a valid font variation settings
      *                                  format
@@ -2042,6 +2055,26 @@
      * @see FontVariationAxis
      */
     public boolean setFontVariationSettings(String fontVariationSettings) {
+        final boolean useFontVariationStore = Flags.typefaceRedesign()
+                && CompatChanges.isChangeEnabled(NEW_FONT_VARIATION_MANAGEMENT);
+        if (useFontVariationStore) {
+            FontVariationAxis[] axes =
+                    FontVariationAxis.fromFontVariationSettings(fontVariationSettings);
+            if (axes == null) {
+                nSetFontVariationOverride(mNativePaint, 0);
+                mFontVariationSettings = null;
+                return true;
+            }
+
+            long builderPtr = nCreateFontVariationBuilder(axes.length);
+            for (int i = 0; i < axes.length; ++i) {
+                nAddFontVariationToBuilder(builderPtr, axes[i].getOpenTypeTagValue(),
+                        axes[i].getStyleValue());
+            }
+            nSetFontVariationOverride(mNativePaint, builderPtr);
+            mFontVariationSettings = fontVariationSettings;
+            return true;
+        }
         final String settings = TextUtils.nullIfEmpty(fontVariationSettings);
         if (settings == mFontVariationSettings
                 || (settings != null && settings.equals(mFontVariationSettings))) {
@@ -3829,7 +3862,12 @@
     private static native void nSetTextSize(long paintPtr, float textSize);
     @CriticalNative
     private static native boolean nEqualsForTextMeasurement(long leftPaintPtr, long rightPaintPtr);
-
+    @CriticalNative
+    private static native long nCreateFontVariationBuilder(int size);
+    @CriticalNative
+    private static native void nAddFontVariationToBuilder(long builderPtr, int tag, float value);
+    @CriticalNative
+    private static native void nSetFontVariationOverride(long paintPtr, long builderPtr);
 
     // Following Native methods are kept for old Robolectric JNI signature used by
     // SystemUIGoogleRoboRNGTests
diff --git a/graphics/java/android/graphics/PathIterator.java b/graphics/java/android/graphics/PathIterator.java
index 48b29f4..d7caabf 100644
--- a/graphics/java/android/graphics/PathIterator.java
+++ b/graphics/java/android/graphics/PathIterator.java
@@ -44,6 +44,8 @@
     private final Path mPath;
     private final int mPathGenerationId;
     private static final int POINT_ARRAY_SIZE = 8;
+    private static final boolean IS_DALVIK = "dalvik".equalsIgnoreCase(
+            System.getProperty("java.vm.name"));
 
     private static final NativeAllocationRegistry sRegistry =
             NativeAllocationRegistry.createMalloced(
@@ -80,9 +82,14 @@
         mPath = path;
         mNativeIterator = nCreate(mPath.mNativePath);
         mPathGenerationId = mPath.getGenerationId();
-        final VMRuntime runtime = VMRuntime.getRuntime();
-        mPointsArray = (float[]) runtime.newNonMovableArray(float.class, POINT_ARRAY_SIZE);
-        mPointsAddress = runtime.addressOf(mPointsArray);
+        if (IS_DALVIK) {
+            final VMRuntime runtime = VMRuntime.getRuntime();
+            mPointsArray = (float[]) runtime.newNonMovableArray(float.class, POINT_ARRAY_SIZE);
+            mPointsAddress = runtime.addressOf(mPointsArray);
+        } else {
+            mPointsArray = new float[POINT_ARRAY_SIZE];
+            mPointsAddress = 0;
+        }
         sRegistry.registerNativeAllocation(this, mNativeIterator);
     }
 
@@ -177,7 +184,8 @@
             throw new ConcurrentModificationException(
                     "Iterator cannot be used on modified Path");
         }
-        @Verb int verb = nNext(mNativeIterator, mPointsAddress);
+        @Verb int verb = IS_DALVIK
+            ? nNext(mNativeIterator, mPointsAddress) : nNextHost(mNativeIterator, mPointsArray);
         if (verb == VERB_DONE) {
             mDone = true;
         }
@@ -287,6 +295,9 @@
     private static native long nCreate(long nativePath);
     private static native long nGetFinalizer();
 
+    /* nNextHost should be used for host runtimes, e.g. LayoutLib */
+    private static native int nNextHost(long nativeIterator, float[] points);
+
     // ------------------ Critical JNI ------------------------
 
     @CriticalNative
diff --git a/keystore/OWNERS b/keystore/OWNERS
index 6891777..ea783e7 100644
--- a/keystore/OWNERS
+++ b/keystore/OWNERS
@@ -1,5 +1,6 @@
 # Bug component: 189335
+ascull@google.com
 drysdale@google.com
-eranm@google.com
 jbires@google.com
+sethmo@google.com
 swillden@google.com
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/common/DeviceStateManagerFoldingFeatureProducer.java b/libs/WindowManager/Jetpack/src/androidx/window/common/DeviceStateManagerFoldingFeatureProducer.java
index 37f0067..0896138 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/common/DeviceStateManagerFoldingFeatureProducer.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/common/DeviceStateManagerFoldingFeatureProducer.java
@@ -16,12 +16,11 @@
 
 package androidx.window.common;
 
-import static android.hardware.devicestate.DeviceStateManager.INVALID_DEVICE_STATE_IDENTIFIER;
+import static android.hardware.devicestate.DeviceStateManager.INVALID_DEVICE_STATE;
 
 import static androidx.window.common.layout.CommonFoldingFeature.COMMON_STATE_UNKNOWN;
 import static androidx.window.common.layout.CommonFoldingFeature.parseListFromString;
 
-import android.annotation.NonNull;
 import android.content.Context;
 import android.hardware.devicestate.DeviceState;
 import android.hardware.devicestate.DeviceStateManager;
@@ -31,16 +30,23 @@
 import android.util.Log;
 import android.util.SparseIntArray;
 
+import androidx.annotation.BinderThread;
+import androidx.annotation.GuardedBy;
+import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
 import androidx.window.common.layout.CommonFoldingFeature;
 import androidx.window.common.layout.DisplayFoldFeatureCommon;
 
 import com.android.internal.R;
+import com.android.window.flags.Flags;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.concurrent.Executor;
 import java.util.function.Consumer;
 
 /**
@@ -55,13 +61,6 @@
     private static final boolean DEBUG = false;
 
     /**
-     * Emulated device state
-     * {@link DeviceStateManager.DeviceStateCallback#onDeviceStateChanged(DeviceState)} to
-     * {@link CommonFoldingFeature.State} map.
-     */
-    private final SparseIntArray mDeviceStateToPostureMap = new SparseIntArray();
-
-    /**
      * Device state received via
      * {@link DeviceStateManager.DeviceStateCallback#onDeviceStateChanged(DeviceState)}.
      * The identifier returned through {@link DeviceState#getIdentifier()} may not correspond 1:1
@@ -71,23 +70,40 @@
      * "rear display". Concurrent mode for example is activated via public API and can be active in
      * both the "open" and "half folded" device states.
      */
-    private DeviceState mCurrentDeviceState = new DeviceState(
-            new DeviceState.Configuration.Builder(INVALID_DEVICE_STATE_IDENTIFIER,
-                    "INVALID").build());
+    // TODO: b/337820752 - Add @GuardedBy("mCurrentDeviceStateLock") after flag cleanup.
+    private DeviceState mCurrentDeviceState = INVALID_DEVICE_STATE;
 
-    private List<DeviceState> mSupportedStates;
+    /**
+     * Lock to synchronize access to {@link #mCurrentDeviceState}.
+     *
+     * <p>This lock is used to ensure thread-safety when accessing and modifying the
+     * {@link #mCurrentDeviceState} field. It is acquired by both the binder thread (if
+     * {@link Flags#wlinfoOncreate()} is enabled) and the main thread (if
+     * {@link Flags#wlinfoOncreate()} is disabled) to prevent race conditions and
+     * ensure data consistency.
+     */
+    private final Object mCurrentDeviceStateLock = new Object();
 
     @NonNull
     private final RawFoldingFeatureProducer mRawFoldSupplier;
 
-    private final boolean mIsHalfOpenedSupported;
+    @NonNull
+    private final DeviceStateMapper mDeviceStateMapper;
 
-    private final DeviceStateCallback mDeviceStateCallback = new DeviceStateCallback() {
+    @VisibleForTesting
+    final DeviceStateCallback mDeviceStateCallback = new DeviceStateCallback() {
+        // The GuardedBy analysis is intra-procedural, meaning it doesn’t consider the getData()
+        // implementation. See https://errorprone.info/bugpattern/GuardedBy for limitations.
+        @SuppressWarnings("GuardedBy")
+        @BinderThread // When Flags.wlinfoOncreate() is enabled.
+        @MainThread // When Flags.wlinfoOncreate() is disabled.
         @Override
         public void onDeviceStateChanged(@NonNull DeviceState state) {
-            mCurrentDeviceState = state;
-            mRawFoldSupplier.getData(DeviceStateManagerFoldingFeatureProducer
-                    .this::notifyFoldingFeatureChange);
+            synchronized (mCurrentDeviceStateLock) {
+                mCurrentDeviceState = state;
+                mRawFoldSupplier.getData(DeviceStateManagerFoldingFeatureProducer.this
+                        ::notifyFoldingFeatureChangeLocked);
+            }
         }
     };
 
@@ -95,41 +111,14 @@
             @NonNull RawFoldingFeatureProducer rawFoldSupplier,
             @NonNull DeviceStateManager deviceStateManager) {
         mRawFoldSupplier = rawFoldSupplier;
-        String[] deviceStatePosturePairs = context.getResources()
-                .getStringArray(R.array.config_device_state_postures);
-        mSupportedStates = deviceStateManager.getSupportedDeviceStates();
-        boolean isHalfOpenedSupported = false;
-        for (String deviceStatePosturePair : deviceStatePosturePairs) {
-            String[] deviceStatePostureMapping = deviceStatePosturePair.split(":");
-            if (deviceStatePostureMapping.length != 2) {
-                if (DEBUG) {
-                    Log.e(TAG, "Malformed device state posture pair: "
-                            + deviceStatePosturePair);
-                }
-                continue;
-            }
+        mDeviceStateMapper =
+                new DeviceStateMapper(context, deviceStateManager.getSupportedDeviceStates());
 
-            int deviceState;
-            int posture;
-            try {
-                deviceState = Integer.parseInt(deviceStatePostureMapping[0]);
-                posture = Integer.parseInt(deviceStatePostureMapping[1]);
-            } catch (NumberFormatException e) {
-                if (DEBUG) {
-                    Log.e(TAG, "Failed to parse device state or posture: "
-                                    + deviceStatePosturePair,
-                            e);
-                }
-                continue;
-            }
-            isHalfOpenedSupported = isHalfOpenedSupported
-                    || posture == CommonFoldingFeature.COMMON_STATE_HALF_OPENED;
-            mDeviceStateToPostureMap.put(deviceState, posture);
-        }
-        mIsHalfOpenedSupported = isHalfOpenedSupported;
-        if (mDeviceStateToPostureMap.size() > 0) {
+        if (!mDeviceStateMapper.isDeviceStateToPostureMapEmpty()) {
+            final Executor executor =
+                    Flags.wlinfoOncreate() ? Runnable::run : context.getMainExecutor();
             Objects.requireNonNull(deviceStateManager)
-                    .registerCallback(context.getMainExecutor(), mDeviceStateCallback);
+                    .registerCallback(executor, mDeviceStateCallback);
         }
     }
 
@@ -137,50 +126,51 @@
      * Add a callback to mCallbacks if there is no device state. This callback will be run
      * once a device state is set. Otherwise,run the callback immediately.
      */
-    private void runCallbackWhenValidState(@NonNull Consumer<List<CommonFoldingFeature>> callback,
-            String displayFeaturesString) {
-        if (isCurrentStateValid()) {
-            callback.accept(calculateFoldingFeature(displayFeaturesString));
+    private void runCallbackWhenValidState(@NonNull DeviceState state,
+            @NonNull Consumer<List<CommonFoldingFeature>> callback,
+            @NonNull String displayFeaturesString) {
+        if (mDeviceStateMapper.isDeviceStateValid(state)) {
+            callback.accept(calculateFoldingFeature(state, displayFeaturesString));
         } else {
             // This callback will be added to mCallbacks and removed once it runs once.
-            AcceptOnceConsumer<List<CommonFoldingFeature>> singleRunCallback =
+            final AcceptOnceConsumer<List<CommonFoldingFeature>> singleRunCallback =
                     new AcceptOnceConsumer<>(this, callback);
             addDataChangedCallback(singleRunCallback);
         }
     }
 
-    /**
-     * Checks to find {@link DeviceStateManagerFoldingFeatureProducer#mCurrentDeviceState} in the
-     * {@link DeviceStateManagerFoldingFeatureProducer#mDeviceStateToPostureMap} which was
-     * initialized in the constructor of {@link DeviceStateManagerFoldingFeatureProducer}.
-     * Returns a boolean value of whether the device state is valid.
-     */
-    private boolean isCurrentStateValid() {
-        // If the device state is not found in the map, indexOfKey returns a negative number.
-        return mDeviceStateToPostureMap.indexOfKey(mCurrentDeviceState.getIdentifier()) >= 0;
-    }
-
+    // The GuardedBy analysis is intra-procedural, meaning it doesn’t consider the implementation of
+    // addDataChangedCallback(). See https://errorprone.info/bugpattern/GuardedBy for limitations.
+    @SuppressWarnings("GuardedBy")
     @Override
     protected void onListenersChanged() {
         super.onListenersChanged();
-        if (hasListeners()) {
-            mRawFoldSupplier.addDataChangedCallback(this::notifyFoldingFeatureChange);
-        } else {
-            mCurrentDeviceState = new DeviceState(
-                    new DeviceState.Configuration.Builder(INVALID_DEVICE_STATE_IDENTIFIER,
-                            "INVALID").build());
-            mRawFoldSupplier.removeDataChangedCallback(this::notifyFoldingFeatureChange);
+        synchronized (mCurrentDeviceStateLock) {
+            if (hasListeners()) {
+                mRawFoldSupplier.addDataChangedCallback(this::notifyFoldingFeatureChangeLocked);
+            } else {
+                mCurrentDeviceState = INVALID_DEVICE_STATE;
+                mRawFoldSupplier.removeDataChangedCallback(this::notifyFoldingFeatureChangeLocked);
+            }
+        }
+    }
+
+    @NonNull
+    private DeviceState getCurrentDeviceState() {
+        synchronized (mCurrentDeviceStateLock) {
+            return mCurrentDeviceState;
         }
     }
 
     @NonNull
     @Override
     public Optional<List<CommonFoldingFeature>> getCurrentData() {
-        Optional<String> displayFeaturesString = mRawFoldSupplier.getCurrentData();
-        if (!isCurrentStateValid()) {
+        final Optional<String> displayFeaturesString = mRawFoldSupplier.getCurrentData();
+        final DeviceState state = getCurrentDeviceState();
+        if (!mDeviceStateMapper.isDeviceStateValid(state) || displayFeaturesString.isEmpty()) {
             return Optional.empty();
         } else {
-            return displayFeaturesString.map(this::calculateFoldingFeature);
+            return Optional.of(calculateFoldingFeature(state, displayFeaturesString.get()));
         }
     }
 
@@ -191,7 +181,7 @@
      */
     @NonNull
     public List<CommonFoldingFeature> getFoldsWithUnknownState() {
-        Optional<String> optionalFoldingFeatureString = mRawFoldSupplier.getCurrentData();
+        final Optional<String> optionalFoldingFeatureString = mRawFoldSupplier.getCurrentData();
 
         if (optionalFoldingFeatureString.isPresent()) {
             return CommonFoldingFeature.parseListFromString(
@@ -201,7 +191,6 @@
         return Collections.emptyList();
     }
 
-
     /**
      * Returns the list of supported {@link DisplayFoldFeatureCommon} calculated from the
      * {@link DeviceStateManagerFoldingFeatureProducer}.
@@ -218,16 +207,16 @@
         return foldFeatures;
     }
 
-
     /**
      * Returns {@code true} if the device supports half-opened mode, {@code false} otherwise.
      */
     public boolean isHalfOpenedSupported() {
-        return mIsHalfOpenedSupported;
+        return mDeviceStateMapper.mIsHalfOpenedSupported;
     }
 
     /**
      * Adds the data to the storeFeaturesConsumer when the data is ready.
+     *
      * @param storeFeaturesConsumer a consumer to collect the data when it is first available.
      */
     @Override
@@ -236,38 +225,123 @@
             if (TextUtils.isEmpty(displayFeaturesString)) {
                 storeFeaturesConsumer.accept(new ArrayList<>());
             } else {
-                runCallbackWhenValidState(storeFeaturesConsumer, displayFeaturesString);
+                final DeviceState state = getCurrentDeviceState();
+                runCallbackWhenValidState(state, storeFeaturesConsumer, displayFeaturesString);
             }
         });
     }
 
-    private void notifyFoldingFeatureChange(String displayFeaturesString) {
-        if (!isCurrentStateValid()) {
+    @GuardedBy("mCurrentDeviceStateLock")
+    private void notifyFoldingFeatureChangeLocked(String displayFeaturesString) {
+        final DeviceState state = mCurrentDeviceState;
+        if (!mDeviceStateMapper.isDeviceStateValid(state)) {
             return;
         }
         if (TextUtils.isEmpty(displayFeaturesString)) {
             notifyDataChanged(new ArrayList<>());
         } else {
-            notifyDataChanged(calculateFoldingFeature(displayFeaturesString));
+            notifyDataChanged(calculateFoldingFeature(state, displayFeaturesString));
         }
     }
 
-    private List<CommonFoldingFeature> calculateFoldingFeature(String displayFeaturesString) {
-        return parseListFromString(displayFeaturesString, currentHingeState());
-    }
-
-    @CommonFoldingFeature.State
-    private int currentHingeState() {
+    @NonNull
+    private List<CommonFoldingFeature> calculateFoldingFeature(@NonNull DeviceState deviceState,
+            @NonNull String displayFeaturesString) {
         @CommonFoldingFeature.State
-        int posture = mDeviceStateToPostureMap.get(mCurrentDeviceState.getIdentifier(),
-                COMMON_STATE_UNKNOWN);
+        final int hingeState = mDeviceStateMapper.getHingeState(deviceState);
+        return parseListFromString(displayFeaturesString, hingeState);
+    }
 
-        if (posture == CommonFoldingFeature.COMMON_STATE_USE_BASE_STATE) {
-            posture = mDeviceStateToPostureMap.get(
-                    DeviceStateUtil.calculateBaseStateIdentifier(mCurrentDeviceState,
-                            mSupportedStates), COMMON_STATE_UNKNOWN);
+    /**
+     * Internal class to map device states to corresponding postures.
+     *
+     * <p>This class encapsulates the logic for mapping device states to postures. The mapping is
+     * immutable after initialization to ensure thread safety.
+     */
+    private static class DeviceStateMapper {
+        /**
+         * Emulated device state
+         * {@link DeviceStateManager.DeviceStateCallback#onDeviceStateChanged(DeviceState)} to
+         * {@link CommonFoldingFeature.State} map.
+         *
+         * <p>This map must be immutable after initialization to ensure thread safety, as it may be
+         * accessed from multiple threads. Modifications should only occur during object
+         * construction.
+         */
+        private final SparseIntArray mDeviceStateToPostureMap = new SparseIntArray();
+
+        /**
+         * The list of device states that are supported.
+         *
+         * <p>This list must be immutable after initialization to ensure thread safety.
+         */
+        @NonNull
+        private final List<DeviceState> mSupportedStates;
+
+        final boolean mIsHalfOpenedSupported;
+
+        DeviceStateMapper(@NonNull Context context, @NonNull List<DeviceState> supportedStates) {
+            mSupportedStates = supportedStates;
+
+            final String[] deviceStatePosturePairs = context.getResources()
+                    .getStringArray(R.array.config_device_state_postures);
+            boolean isHalfOpenedSupported = false;
+            for (String deviceStatePosturePair : deviceStatePosturePairs) {
+                final String[] deviceStatePostureMapping = deviceStatePosturePair.split(":");
+                if (deviceStatePostureMapping.length != 2) {
+                    if (DEBUG) {
+                        Log.e(TAG, "Malformed device state posture pair: "
+                                + deviceStatePosturePair);
+                    }
+                    continue;
+                }
+
+                final int deviceState;
+                final int posture;
+                try {
+                    deviceState = Integer.parseInt(deviceStatePostureMapping[0]);
+                    posture = Integer.parseInt(deviceStatePostureMapping[1]);
+                } catch (NumberFormatException e) {
+                    if (DEBUG) {
+                        Log.e(TAG, "Failed to parse device state or posture: "
+                                        + deviceStatePosturePair,
+                                e);
+                    }
+                    continue;
+                }
+                isHalfOpenedSupported = isHalfOpenedSupported
+                        || posture == CommonFoldingFeature.COMMON_STATE_HALF_OPENED;
+                mDeviceStateToPostureMap.put(deviceState, posture);
+            }
+            mIsHalfOpenedSupported = isHalfOpenedSupported;
         }
 
-        return posture;
+        boolean isDeviceStateToPostureMapEmpty() {
+            return mDeviceStateToPostureMap.size() == 0;
+        }
+
+        /**
+         * Validates if the provided deviceState exists in the {@link #mDeviceStateToPostureMap}
+         * which was initialized in the constructor of {@link DeviceStateMapper}.
+         * Returns a boolean value of whether the device state is valid.
+         */
+        boolean isDeviceStateValid(@NonNull DeviceState deviceState) {
+            // If the device state is not found in the map, indexOfKey returns a negative number.
+            return mDeviceStateToPostureMap.indexOfKey(deviceState.getIdentifier()) >= 0;
+        }
+
+        @CommonFoldingFeature.State
+        int getHingeState(@NonNull DeviceState deviceState) {
+            @CommonFoldingFeature.State
+            final int posture =
+                    mDeviceStateToPostureMap.get(deviceState.getIdentifier(), COMMON_STATE_UNKNOWN);
+            if (posture != CommonFoldingFeature.COMMON_STATE_USE_BASE_STATE) {
+                return posture;
+            }
+
+            final int baseStateIdentifier =
+                    DeviceStateUtil.calculateBaseStateIdentifier(deviceState, mSupportedStates);
+            return mDeviceStateToPostureMap.get(baseStateIdentifier, COMMON_STATE_UNKNOWN);
+        }
     }
 }
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/BackupHelper.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/BackupHelper.java
index bfccb29..e3a1d8a 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/BackupHelper.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/BackupHelper.java
@@ -142,6 +142,19 @@
         }
     }
 
+    void abortTaskContainerRebuilding(@NonNull WindowContainerTransaction wct) {
+        // Clean-up the legacy states in the system
+        for (int i = mTaskFragmentInfos.size() - 1; i >= 0; i--) {
+            final TaskFragmentInfo info = mTaskFragmentInfos.valueAt(i);
+            mPresenter.deleteTaskFragment(wct, info.getFragmentToken());
+        }
+        mPresenter.setSavedState(new Bundle());
+
+        mParcelableTaskContainerDataList.clear();
+        mTaskFragmentInfos.clear();
+        mTaskFragmentParentInfos.clear();
+    }
+
     boolean hasPendingStateToRestore() {
         return !mParcelableTaskContainerDataList.isEmpty();
     }
@@ -196,6 +209,7 @@
 
             mController.onTaskFragmentParentRestored(wct, taskContainer.getTaskId(),
                     mTaskFragmentParentInfos.get(taskContainer.getTaskId()));
+            mTaskFragmentParentInfos.remove(taskContainer.getTaskId());
             restoredAny = true;
         }
 
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java
index db4bb0e..8345b40 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java
@@ -56,6 +56,7 @@
 import android.annotation.CallbackExecutor;
 import android.app.Activity;
 import android.app.ActivityClient;
+import android.app.ActivityManager;
 import android.app.ActivityOptions;
 import android.app.ActivityThread;
 import android.app.AppGlobals;
@@ -280,7 +281,7 @@
             mSplitRules.clear();
             mSplitRules.addAll(rules);
 
-            if (!Flags.aeBackStackRestore() || !mPresenter.isRebuildTaskContainersNeeded()) {
+            if (!Flags.aeBackStackRestore() || !mPresenter.isWaitingToRebuildTaskContainers()) {
                 return;
             }
 
@@ -2893,6 +2894,36 @@
                 return;
             }
             synchronized (mLock) {
+                if (mPresenter.isWaitingToRebuildTaskContainers()) {
+                    Log.w(TAG, "Rebuilding aborted, clean up and restart");
+
+                    // Retrieve the Task intent.
+                    final int taskId = getTaskId(activity);
+                    Intent taskIntent = null;
+                    final ActivityManager am = activity.getSystemService(ActivityManager.class);
+                    final List<ActivityManager.AppTask> appTasks = am.getAppTasks();
+                    for (ActivityManager.AppTask appTask : appTasks) {
+                        if (appTask.getTaskInfo().taskId == taskId) {
+                            taskIntent = appTask.getTaskInfo().baseIntent.cloneFilter();
+                            break;
+                        }
+                    }
+
+                    // Clean up and abort the restoration
+                    // TODO(b/369488857): also to remove the non-organized activities in the Task?
+                    final TransactionRecord transactionRecord =
+                            mTransactionManager.startNewTransaction();
+                    final WindowContainerTransaction wct = transactionRecord.getTransaction();
+                    mPresenter.abortTaskContainerRebuilding(wct);
+                    transactionRecord.apply(false /* shouldApplyIndependently */);
+
+                    // Start the Task root activity.
+                    if (taskIntent != null) {
+                        activity.startActivity(taskIntent);
+                    }
+                    return;
+                }
+
                 final IBinder activityToken = activity.getActivityToken();
                 final IBinder initialTaskFragmentToken =
                         getTaskFragmentTokenFromActivityClientRecord(activity);
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java
index 0c0ded9..b498ee2 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java
@@ -187,10 +187,14 @@
         mBackupHelper.scheduleBackup();
     }
 
-    boolean isRebuildTaskContainersNeeded() {
+    boolean isWaitingToRebuildTaskContainers() {
         return mBackupHelper.hasPendingStateToRestore();
     }
 
+    void abortTaskContainerRebuilding(@NonNull WindowContainerTransaction wct) {
+        mBackupHelper.abortTaskContainerRebuilding(wct);
+    }
+
     boolean rebuildTaskContainers(@NonNull WindowContainerTransaction wct,
             @NonNull Set<EmbeddingRule> rules) {
         return mBackupHelper.rebuildTaskContainers(wct, rules);
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java
index 74cce68..b453f1d 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java
@@ -156,7 +156,7 @@
         mSplitController = splitController;
         for (ParcelableTaskFragmentContainerData tfData :
                 data.getParcelableTaskFragmentContainerDataList()) {
-            final TaskFragmentInfo info = taskFragmentInfoMap.get(tfData.mToken);
+            final TaskFragmentInfo info = taskFragmentInfoMap.remove(tfData.mToken);
             if (info != null && !info.isEmpty()) {
                 final TaskFragmentContainer container =
                         new TaskFragmentContainer(tfData, splitController, this);
@@ -377,8 +377,16 @@
 
     @Nullable
     TaskFragmentContainer getContainerWithActivity(@NonNull IBinder activityToken) {
-        return getContainer(container -> container.hasAppearedActivity(activityToken)
-                || container.hasPendingAppearedActivity(activityToken));
+        // When the new activity is launched to the topmost TF because the source activity
+        // was in that TF, and the source activity is finished before resolving the new activity,
+        // we will try to see if the new activity match a rule with the split activities below.
+        // If matched, it can be reparented.
+        final TaskFragmentContainer taskFragmentContainer
+                = getContainer(container -> container.hasPendingAppearedActivity(activityToken));
+        if (taskFragmentContainer != null) {
+            return taskFragmentContainer;
+        }
+        return getContainer(container -> container.hasAppearedActivity(activityToken));
     }
 
     @Nullable
diff --git a/libs/WindowManager/Jetpack/tests/unittest/Android.bp b/libs/WindowManager/Jetpack/tests/unittest/Android.bp
index bd430c0..09185ee 100644
--- a/libs/WindowManager/Jetpack/tests/unittest/Android.bp
+++ b/libs/WindowManager/Jetpack/tests/unittest/Android.bp
@@ -29,6 +29,7 @@
 
     srcs: [
         "**/*.java",
+        "**/*.kt",
     ],
 
     static_libs: [
@@ -41,6 +42,7 @@
         "androidx.test.ext.junit",
         "flag-junit",
         "mockito-target-extended-minus-junit4",
+        "mockito-kotlin-nodeps",
         "truth",
         "testables",
         "platform-test-annotations",
diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/common/DeviceStateManagerFoldingFeatureProducerTest.kt b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/common/DeviceStateManagerFoldingFeatureProducerTest.kt
new file mode 100644
index 0000000..90887a7
--- /dev/null
+++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/common/DeviceStateManagerFoldingFeatureProducerTest.kt
@@ -0,0 +1,341 @@
+/*
+ * Copyright (C) 2024 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 androidx.window.common
+
+import android.content.Context
+import android.content.res.Resources
+import android.hardware.devicestate.DeviceState
+import android.hardware.devicestate.DeviceStateManager
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.window.common.layout.CommonFoldingFeature
+import androidx.window.common.layout.CommonFoldingFeature.COMMON_STATE_FLAT
+import androidx.window.common.layout.CommonFoldingFeature.COMMON_STATE_HALF_OPENED
+import androidx.window.common.layout.CommonFoldingFeature.COMMON_STATE_NO_FOLDING_FEATURES
+import androidx.window.common.layout.CommonFoldingFeature.COMMON_STATE_UNKNOWN
+import androidx.window.common.layout.CommonFoldingFeature.COMMON_STATE_USE_BASE_STATE
+import androidx.window.common.layout.DisplayFoldFeatureCommon
+import androidx.window.common.layout.DisplayFoldFeatureCommon.DISPLAY_FOLD_FEATURE_PROPERTY_SUPPORTS_HALF_OPENED
+import androidx.window.common.layout.DisplayFoldFeatureCommon.DISPLAY_FOLD_FEATURE_TYPE_SCREEN_FOLD_IN
+import com.android.internal.R
+import com.android.window.flags.Flags
+import com.google.common.truth.Truth.assertThat
+import java.util.Optional
+import java.util.concurrent.Executor
+import java.util.function.Consumer
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doAnswer
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.never
+import org.mockito.kotlin.stub
+import org.mockito.kotlin.verify
+
+/**
+ * Test class for [DeviceStateManagerFoldingFeatureProducer].
+ *
+ * Build/Install/Run:
+ *  atest WMJetpackUnitTests:DeviceStateManagerFoldingFeatureProducerTest
+ */
+@RunWith(AndroidJUnit4::class)
+class DeviceStateManagerFoldingFeatureProducerTest {
+    @get:Rule
+    val setFlagsRule: SetFlagsRule = SetFlagsRule()
+
+    private val mMockDeviceStateManager = mock<DeviceStateManager>()
+    private val mMockResources = mock<Resources> {
+        on { getStringArray(R.array.config_device_state_postures) } doReturn DEVICE_STATE_POSTURES
+    }
+    private val mMockContext = mock<Context> {
+        on { resources } doReturn mMockResources
+    }
+    private val mRawFoldSupplier = mock<RawFoldingFeatureProducer> {
+        on { currentData } doReturn Optional.of(DISPLAY_FEATURES)
+        on { getData(any<Consumer<String>>()) } doAnswer { invocation ->
+            val callback = invocation.getArgument(0) as Consumer<String>
+            callback.accept(DISPLAY_FEATURES)
+        }
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_WLINFO_ONCREATE)
+    fun testRegisterCallback_whenWlinfoOncreateIsDisabled_usesMainExecutor() {
+        DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+
+        verify(mMockDeviceStateManager).registerCallback(eq(mMockContext.mainExecutor), any())
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_WLINFO_ONCREATE)
+    fun testRegisterCallback_whenWlinfoOncreateIsEnabled_usesRunnableRun() {
+        val executorCaptor = ArgumentCaptor.forClass(Executor::class.java)
+        val runnable = mock<Runnable>()
+
+        DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+
+        verify(mMockDeviceStateManager).registerCallback(executorCaptor.capture(), any())
+        executorCaptor.value.execute(runnable)
+        verify(runnable).run()
+    }
+
+    @Test
+    fun testGetCurrentData_validCurrentState_returnsFoldingFeatureWithState() {
+        val ffp = DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+        ffp.mDeviceStateCallback.onDeviceStateChanged(DEVICE_STATE_HALF_OPENED)
+
+        val currentData = ffp.getCurrentData()
+
+        assertThat(currentData).isPresent()
+        assertThat(currentData.get()).containsExactlyElementsIn(HALF_OPENED_FOLDING_FEATURES)
+    }
+
+    @Test
+    fun testGetCurrentData_invalidCurrentState_returnsEmptyOptionalFoldingFeature() {
+        val ffp = DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+
+        val currentData = ffp.getCurrentData()
+
+        assertThat(currentData).isEmpty()
+    }
+
+    @Test
+    fun testGetFoldsWithUnknownState_validFoldingFeature_returnsFoldingFeaturesWithUnknownState() {
+        val ffp = DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+
+        val result = ffp.getFoldsWithUnknownState()
+
+        assertThat(result).containsExactlyElementsIn(UNKNOWN_STATE_FOLDING_FEATURES)
+    }
+
+    @Test
+    fun testGetFoldsWithUnknownState_emptyFoldingFeature_returnsEmptyList() {
+        mRawFoldSupplier.stub {
+            on { currentData } doReturn Optional.empty()
+        }
+        val ffp = DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+
+        val result = ffp.getFoldsWithUnknownState()
+
+        assertThat(result).isEmpty()
+    }
+
+    @Test
+    fun testGetDisplayFeatures_validFoldingFeature_returnsDisplayFoldFeatures() {
+        mRawFoldSupplier.stub {
+            on { currentData } doReturn Optional.of(DISPLAY_FEATURES_HALF_OPENED_HINGE)
+        }
+        val ffp = DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+
+        val result = ffp.displayFeatures
+
+        assertThat(result).containsExactly(
+            DisplayFoldFeatureCommon(
+                DISPLAY_FOLD_FEATURE_TYPE_SCREEN_FOLD_IN,
+                setOf(DISPLAY_FOLD_FEATURE_PROPERTY_SUPPORTS_HALF_OPENED),
+            ),
+        )
+    }
+
+    @Test
+    fun testIsHalfOpenedSupported_withHalfOpenedPostures_returnsTrue() {
+        val ffp = DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+
+        assertThat(ffp.isHalfOpenedSupported).isTrue()
+    }
+
+    @Test
+    fun testIsHalfOpenedSupported_withEmptyPostures_returnsFalse() {
+        mMockResources.stub {
+            on { getStringArray(R.array.config_device_state_postures) } doReturn emptyArray()
+        }
+        val ffp = DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+
+        assertThat(ffp.isHalfOpenedSupported).isFalse()
+    }
+
+    @Test
+    fun testGetData_emptyDisplayFeaturesString_callsConsumerWithEmptyList() {
+        mRawFoldSupplier.stub {
+            on { getData(any<Consumer<String>>()) } doAnswer { invocation ->
+                val callback = invocation.getArgument(0) as Consumer<String>
+                callback.accept("")
+            }
+        }
+        val ffp = DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+        val storeFeaturesConsumer = mock<Consumer<List<CommonFoldingFeature>>>()
+
+        ffp.getData(storeFeaturesConsumer)
+
+        verify(storeFeaturesConsumer).accept(emptyList())
+    }
+
+    @Test
+    fun testGetData_validState_callsConsumerWithFoldingFeatures() {
+        val ffp = DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+        ffp.mDeviceStateCallback.onDeviceStateChanged(DEVICE_STATE_HALF_OPENED)
+        val storeFeaturesConsumer = mock<Consumer<List<CommonFoldingFeature>>>()
+
+        ffp.getData(storeFeaturesConsumer)
+
+        verify(storeFeaturesConsumer).accept(HALF_OPENED_FOLDING_FEATURES)
+    }
+
+    @Test
+    fun testGetData_invalidState_addsAcceptOnceConsumerToDataChangedCallback() {
+        val ffp = DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+        val storeFeaturesConsumer = mock<Consumer<List<CommonFoldingFeature>>>()
+
+        ffp.getData(storeFeaturesConsumer)
+
+        verify(storeFeaturesConsumer, never()).accept(any())
+        ffp.mDeviceStateCallback.onDeviceStateChanged(DEVICE_STATE_HALF_OPENED)
+        ffp.mDeviceStateCallback.onDeviceStateChanged(DEVICE_STATE_OPENED)
+        verify(storeFeaturesConsumer).accept(HALF_OPENED_FOLDING_FEATURES)
+    }
+
+    @Test
+    fun testDeviceStateMapper_malformedDeviceStatePosturePair_skipsPair() {
+        val malformedDeviceStatePostures = arrayOf(
+            // Missing the posture.
+            "0",
+            // Empty string.
+            "",
+            // Too many elements.
+            "0:1:2",
+        )
+        mMockResources.stub {
+            on { getStringArray(R.array.config_device_state_postures) } doReturn
+                    malformedDeviceStatePostures
+        }
+
+        DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+
+        verify(mMockDeviceStateManager, never()).registerCallback(any(), any())
+    }
+
+    @Test
+    fun testDeviceStateMapper_invalidNumberFormat_skipsPair() {
+        val invalidNumberFormatDeviceStatePostures = arrayOf("a:1", "0:b", "a:b", ":1")
+        mMockResources.stub {
+            on { getStringArray(R.array.config_device_state_postures) } doReturn
+                    invalidNumberFormatDeviceStatePostures
+        }
+
+        DeviceStateManagerFoldingFeatureProducer(
+            mMockContext,
+            mRawFoldSupplier,
+            mMockDeviceStateManager,
+        )
+
+        verify(mMockDeviceStateManager, never()).registerCallback(any(), any())
+    }
+
+    companion object {
+        // Supported device states configuration.
+        private enum class SupportedDeviceStates {
+            CLOSED, HALF_OPENED, OPENED, REAR_DISPLAY, CONCURRENT;
+
+            override fun toString() = ordinal.toString()
+
+            fun toDeviceState(): DeviceState =
+                DeviceState(DeviceState.Configuration.Builder(ordinal, name).build())
+        }
+
+        // Map of supported device states supplied by DeviceStateManager to WM Jetpack posture.
+        private val DEVICE_STATE_POSTURES =
+            arrayOf(
+                "${SupportedDeviceStates.CLOSED}:$COMMON_STATE_NO_FOLDING_FEATURES",
+                "${SupportedDeviceStates.HALF_OPENED}:$COMMON_STATE_HALF_OPENED",
+                "${SupportedDeviceStates.OPENED}:$COMMON_STATE_FLAT",
+                "${SupportedDeviceStates.REAR_DISPLAY}:$COMMON_STATE_NO_FOLDING_FEATURES",
+                "${SupportedDeviceStates.CONCURRENT}:$COMMON_STATE_USE_BASE_STATE",
+            )
+        private val DEVICE_STATE_HALF_OPENED = SupportedDeviceStates.HALF_OPENED.toDeviceState()
+        private val DEVICE_STATE_OPENED = SupportedDeviceStates.OPENED.toDeviceState()
+
+        // WindowsManager Jetpack display features.
+        private val DISPLAY_FEATURES = "fold-[1104,0,1104,1848]"
+        private val DISPLAY_FEATURES_HALF_OPENED_HINGE = "$DISPLAY_FEATURES-half-opened"
+        private val HALF_OPENED_FOLDING_FEATURES = CommonFoldingFeature.parseListFromString(
+            DISPLAY_FEATURES,
+            COMMON_STATE_HALF_OPENED,
+        )
+        private val UNKNOWN_STATE_FOLDING_FEATURES = CommonFoldingFeature.parseListFromString(
+            DISPLAY_FEATURES,
+            COMMON_STATE_UNKNOWN,
+        )
+    }
+}
diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/TaskFragmentContainerTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/TaskFragmentContainerTest.java
index 7fab371..bc4916a 100644
--- a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/TaskFragmentContainerTest.java
+++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/TaskFragmentContainerTest.java
@@ -535,7 +535,8 @@
         // container1.
         container2.setInfo(mTransaction, mInfo);
 
-        assertTrue(container2.hasActivity(mActivity.getActivityToken()));
+        assertTrue(container1.hasActivity(mActivity.getActivityToken()));
+        assertFalse(container2.hasActivity(mActivity.getActivityToken()));
         // When the pending appeared record is removed from container1, we respect the appeared
         // record in container2.
         container1.removePendingAppearedActivity(mActivity.getActivityToken());
diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp
index f857429..4642fe5 100644
--- a/libs/WindowManager/Shell/Android.bp
+++ b/libs/WindowManager/Shell/Android.bp
@@ -197,6 +197,7 @@
 android_library {
     name: "WindowManager-Shell",
     srcs: [
+        "src/com/android/wm/shell/EventLogTags.logtags",
         ":wm_shell_protolog_src",
         // TODO(b/168581922) protologtool do not support kotlin(*.kt)
         ":wm_shell-sources-kt",
@@ -220,6 +221,7 @@
         "//frameworks/libs/systemui:com_android_systemui_shared_flags_lib",
         "//frameworks/libs/systemui:iconloader_base",
         "com_android_wm_shell_flags_lib",
+        "PlatformAnimationLib",
         "WindowManager-Shell-proto",
         "WindowManager-Shell-lite-proto",
         "WindowManager-Shell-shared",
@@ -232,10 +234,6 @@
         // *.kt sources are inside a filegroup.
         "kotlin-annotations",
     ],
-    required: [
-        "wmshell.protolog.json.gz",
-        "wmshell.protolog.pb",
-    ],
     flags_packages: [
         "com_android_wm_shell_flags",
     ],
@@ -244,3 +242,11 @@
     plugins: ["dagger2-compiler"],
     use_resource_processor: true,
 }
+
+java_defaults {
+    name: "wmshell_defaults",
+    required: [
+        "wmshell.protolog.json.gz",
+        "wmshell.protolog.pb",
+    ],
+}
diff --git a/libs/WindowManager/Shell/aconfig/multitasking.aconfig b/libs/WindowManager/Shell/aconfig/multitasking.aconfig
index 63a2880..cf0a975 100644
--- a/libs/WindowManager/Shell/aconfig/multitasking.aconfig
+++ b/libs/WindowManager/Shell/aconfig/multitasking.aconfig
@@ -156,6 +156,13 @@
 }
 
 flag {
+    name: "enable_flexible_two_app_split"
+    namespace: "multitasking"
+    description: "Enables only 2 app 90:10 split"
+    bug: "349828130"
+}
+
+flag {
     name: "enable_flexible_split"
     namespace: "multitasking"
     description: "Enables flexibile split feature for split screen"
diff --git a/libs/WindowManager/Shell/res/color/open_by_default_settings_dialog_radio_button_color.xml b/libs/WindowManager/Shell/res/color/open_by_default_settings_dialog_radio_button_color.xml
new file mode 100644
index 0000000..0f9b28a
--- /dev/null
+++ b/libs/WindowManager/Shell/res/color/open_by_default_settings_dialog_radio_button_color.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+    <item android:state_checked="true"
+        android:color="?androidprv:attr/materialColorPrimaryContainer"/>
+    <item android:color="?androidprv:attr/materialColorSurfaceContainer"/>
+</selector>
diff --git a/libs/WindowManager/Shell/res/drawable/app_handle_education_tooltip_icon.xml b/libs/WindowManager/Shell/res/drawable/app_handle_education_tooltip_icon.xml
new file mode 100644
index 0000000..b74d922
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/app_handle_education_tooltip_icon.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:tint="?android:attr/textColorTertiary"
+    android:viewportHeight="960"
+    android:viewportWidth="960">
+    <path
+        android:fillColor="@android:color/system_on_tertiary_container_light"
+        android:pathData="M419,880Q391,880 366.5,868Q342,856 325,834L107,557L126,537Q146,516 174,512Q202,508 226,523L300,568L300,240Q300,223 311.5,211.5Q323,200 340,200Q357,200 369,211.5Q381,223 381,240L381,712L284,652L388,785Q394,792 402,796Q410,800 419,800L640,800Q673,800 696.5,776.5Q720,753 720,720L720,560Q720,543 708.5,531.5Q697,520 680,520L461,520L461,440L680,440Q730,440 765,475Q800,510 800,560L800,720Q800,786 753,833Q706,880 640,880L419,880ZM167,340Q154,318 147,292.5Q140,267 140,240Q140,157 198.5,98.5Q257,40 340,40Q423,40 481.5,98.5Q540,157 540,240Q540,267 533,292.5Q526,318 513,340L444,300Q452,286 456,271.5Q460,257 460,240Q460,190 425,155Q390,120 340,120Q290,120 255,155Q220,190 220,240Q220,257 224,271.5Q228,286 236,300L167,340ZM502,620L502,620L502,620L502,620Q502,620 502,620Q502,620 502,620L502,620Q502,620 502,620Q502,620 502,620L502,620Q502,620 502,620Q502,620 502,620L502,620L502,620Z" />
+</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_button_dark.xml b/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_button_dark.xml
new file mode 100644
index 0000000..f3800e0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_button_dark.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2024 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.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="24dp"
+    android:width="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillColor="#000000"
+        android:pathData="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"/>
+</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_exit_button_dark.xml b/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_exit_button_dark.xml
new file mode 100644
index 0000000..5260450
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_exit_button_dark.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2024 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.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="960"
+    android:viewportHeight="960"
+    android:tint="?attr/colorControlNormal">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M240,840L240,720L120,720L120,640L320,640L320,840L240,840ZM640,840L640,640L840,640L840,720L720,720L720,840L640,840ZM120,320L120,240L240,240L240,120L320,120L320,320L120,320ZM640,320L640,120L720,120L720,240L840,240L840,320L640,320Z"/>
+</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_open_by_default_settings.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_open_by_default_settings.xml
new file mode 100644
index 0000000..4070c3d
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_open_by_default_settings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="960"
+    android:viewportHeight="960"
+    android:tint="?attr/colorControlNormal">
+    <path android:fillColor="@android:color/black"
+        android:pathData="M370,880L354,752Q341,747 329.5,740Q318,733 307,725L188,775L78,585L181,507Q180,500 180,493.5Q180,487 180,480Q180,473 180,466.5Q180,460 181,453L78,375L188,185L307,235Q318,227 330,220Q342,213 354,208L370,80L590,80L606,208Q619,213 630.5,220Q642,227 653,235L772,185L882,375L779,453Q780,460 780,466.5Q780,473 780,480Q780,487 780,493.5Q780,500 778,507L881,585L771,775L653,725Q642,733 630,740Q618,747 606,752L590,880L370,880ZM440,800L519,800L533,694Q564,686 590.5,670.5Q617,655 639,633L738,674L777,606L691,541Q696,527 698,511.5Q700,496 700,480Q700,464 698,448.5Q696,433 691,419L777,354L738,286L639,328Q617,305 590.5,289.5Q564,274 533,266L520,160L441,160L427,266Q396,274 369.5,289.5Q343,305 321,327L222,286L183,354L269,418Q264,433 262,448Q260,463 260,480Q260,496 262,511Q264,526 269,541L183,606L222,674L321,632Q343,655 369.5,670.5Q396,686 427,694L440,800ZM482,620Q540,620 581,579Q622,538 622,480Q622,422 581,381Q540,340 482,340Q423,340 382.5,381Q342,422 342,480Q342,538 382.5,579Q423,620 482,620ZM480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480L480,480Z"/>
+</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_tooltip_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_tooltip_background.xml
new file mode 100644
index 0000000..a12a746
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_tooltip_background.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape android:shape="rectangle">
+            <corners android:radius="30dp" />
+            <solid android:color="@android:color/system_tertiary_fixed" />
+        </shape>
+    </item>
+</layer-list>
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_tooltip_left_arrow.xml b/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_tooltip_left_arrow.xml
new file mode 100644
index 0000000..aadffb5
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_tooltip_left_arrow.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<!-- An arrow that points towards left. -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="10dp"
+    android:height="12dp"
+    android:viewportWidth="10"
+    android:viewportHeight="12">
+  <path
+      android:pathData="M2.858,4.285C1.564,5.062 1.564,6.938 2.858,7.715L10,12L10,0L2.858,4.285Z"
+      android:fillColor="@android:color/system_tertiary_fixed"/>
+</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_tooltip_top_arrow.xml b/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_tooltip_top_arrow.xml
new file mode 100644
index 0000000..e3c9a66
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_tooltip_top_arrow.xml
@@ -0,0 +1,26 @@
+<!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<!-- An arrow that points upwards. -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="12dp"
+    android:height="9dp"
+    android:viewportWidth="12"
+    android:viewportHeight="9">
+  <path
+      android:pathData="M7.715,1.858C6.938,0.564 5.062,0.564 4.285,1.858L0,9L12,9L7.715,1.858Z"
+      android:fillColor="@android:color/system_tertiary_fixed"/>
+</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_background.xml b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_background.xml
new file mode 100644
index 0000000..4eb2271
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_background.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<shape android:shape="rectangle"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+    <solid android:color="?androidprv:attr/materialColorSurfaceContainer"/>
+    <corners android:radius="28dp"/>
+</shape>
diff --git a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_dismiss_button_background.xml b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_dismiss_button_background.xml
new file mode 100644
index 0000000..2b2e9df
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_dismiss_button_background.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:shape="rectangle">
+    <solid android:color="?androidprv:attr/materialColorPrimary"/>
+    <corners android:radius="50dp"/>
+</shape>
diff --git a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_radio_buttons_background.xml b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_radio_buttons_background.xml
new file mode 100644
index 0000000..1ac952b
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_radio_buttons_background.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<shape android:shape="rectangle"
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/open_by_default_settings_dialog_radio_button_color"/>
+    <corners android:radius="16dp"/>
+</shape>
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml
index 6913e54..aeb734e 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml
@@ -165,17 +165,28 @@
         android:layout_height="@dimen/desktop_mode_handle_menu_open_in_browser_pill_height"
         android:layout_marginTop="@dimen/desktop_mode_handle_menu_pill_spacing_margin"
         android:layout_marginStart="1dp"
-        android:orientation="vertical"
+        android:orientation="horizontal"
         android:elevation="@dimen/desktop_mode_handle_menu_pill_elevation"
         android:background="@drawable/desktop_mode_decor_handle_menu_background">
 
         <Button
             android:id="@+id/open_in_browser_button"
+            android:layout_weight="1"
             android:contentDescription="@string/open_in_browser_text"
             android:text="@string/open_in_browser_text"
             android:drawableStart="@drawable/desktop_mode_ic_handle_menu_open_in_browser"
             android:drawableTint="?androidprv:attr/materialColorOnSurface"
             style="@style/DesktopModeHandleMenuActionButton"/>
+
+        <ImageButton
+            android:id="@+id/open_by_default_button"
+            android:layout_width="20dp"
+            android:layout_height="20dp"
+            android:layout_gravity="end|center_vertical"
+            android:layout_marginEnd="16dp"
+            android:contentDescription="@string/open_by_default_settings_text"
+            android:src="@drawable/desktop_mode_ic_handle_menu_open_by_default_settings"
+            android:tint="?androidprv:attr/materialColorOnSurface"/>
     </LinearLayout>
 </LinearLayout>
 
diff --git a/libs/WindowManager/Shell/res/layout/desktop_windowing_education_left_arrow_tooltip.xml b/libs/WindowManager/Shell/res/layout/desktop_windowing_education_left_arrow_tooltip.xml
new file mode 100644
index 0000000..a269b9e
--- /dev/null
+++ b/libs/WindowManager/Shell/res/layout/desktop_windowing_education_left_arrow_tooltip.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:elevation="1dp"
+    android:orientation="horizontal">
+
+    <!-- ImageView for the arrow icon, positioned horizontally at the start of the tooltip
+    container. -->
+    <ImageView
+        android:id="@+id/arrow_icon"
+        android:layout_width="10dp"
+        android:layout_height="12dp"
+        android:layout_gravity="center_vertical"
+        android:src="@drawable/desktop_windowing_education_tooltip_left_arrow" />
+
+    <!-- Layout for the tooltip, excluding the arrow. Separating the tooltip content from the arrow
+    allows scaling of only the tooltip container when the content changes, without affecting the
+    arrow. -->
+    <include layout="@layout/desktop_windowing_education_tooltip_container" />
+</LinearLayout>
diff --git a/libs/WindowManager/Shell/res/layout/desktop_windowing_education_tooltip_container.xml b/libs/WindowManager/Shell/res/layout/desktop_windowing_education_tooltip_container.xml
new file mode 100644
index 0000000..09a049c
--- /dev/null
+++ b/libs/WindowManager/Shell/res/layout/desktop_windowing_education_tooltip_container.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/tooltip_container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@drawable/desktop_windowing_education_tooltip_background"
+    android:orientation="horizontal"
+    android:padding="@dimen/desktop_windowing_education_tooltip_padding">
+
+    <ImageView
+        android:id="@+id/tooltip_icon"
+        android:layout_width="32dp"
+        android:layout_height="32dp"
+        android:layout_gravity="center_vertical"
+        android:src="@drawable/app_handle_education_tooltip_icon" />
+
+    <TextView
+        android:id="@+id/tooltip_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:layout_marginStart="2dp"
+        android:lineHeight="20dp"
+        android:maxWidth="150dp"
+        android:textColor="@android:color/system_on_tertiary_container_light"
+        android:textFontWeight="500"
+        android:textSize="14sp" />
+</LinearLayout>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/layout/desktop_windowing_education_top_arrow_tooltip.xml b/libs/WindowManager/Shell/res/layout/desktop_windowing_education_top_arrow_tooltip.xml
new file mode 100644
index 0000000..c73c1da
--- /dev/null
+++ b/libs/WindowManager/Shell/res/layout/desktop_windowing_education_top_arrow_tooltip.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:elevation="1dp"
+    android:orientation="vertical">
+
+    <!-- ImageView for the arrow icon, positioned vertically above the tooltip container. -->
+    <ImageView
+        android:id="@+id/arrow_icon"
+        android:layout_width="12dp"
+        android:layout_height="9dp"
+        android:layout_gravity="center_horizontal"
+        android:src="@drawable/desktop_windowing_education_tooltip_top_arrow" />
+
+    <!-- Layout for the tooltip, excluding the arrow. Separating the tooltip content from the arrow
+    allows scaling of only the tooltip container when the content changes, without affecting the
+    arrow. -->
+    <include layout="@layout/desktop_windowing_education_tooltip_container" />
+</LinearLayout>
diff --git a/libs/WindowManager/Shell/res/layout/letterbox_restart_dialog_layout.xml b/libs/WindowManager/Shell/res/layout/letterbox_restart_dialog_layout.xml
index 045b975..462a49c 100644
--- a/libs/WindowManager/Shell/res/layout/letterbox_restart_dialog_layout.xml
+++ b/libs/WindowManager/Shell/res/layout/letterbox_restart_dialog_layout.xml
@@ -99,11 +99,11 @@
 
                 </LinearLayout>
 
-                <FrameLayout
+
+                <LinearLayout
                     android:minHeight="@dimen/letterbox_restart_dialog_button_height"
-                    android:layout_width="match_parent"
+                    android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    style="?android:attr/buttonBarButtonStyle"
                     android:layout_gravity="end">
 
                     <Button
@@ -133,7 +133,7 @@
                         android:text="@string/letterbox_restart_restart"
                         android:contentDescription="@string/letterbox_restart_restart"/>
 
-                </FrameLayout>
+                </LinearLayout>
 
             </LinearLayout>
 
diff --git a/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml b/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml
new file mode 100644
index 0000000..8ff382b
--- /dev/null
+++ b/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<com.android.wm.shell.apptoweb.OpenByDefaultDialogView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    style="@style/LetterboxDialog">
+
+    <!-- The background of the top-level layout acts as the background dim. -->
+    <FrameLayout
+        android:id="@+id/open_by_default_dialog_container"
+        android:layout_width="@dimen/open_by_default_settings_dialog_width"
+        android:layout_height="wrap_content"
+        android:background="@drawable/open_by_default_settings_dialog_background"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent">
+
+        <!-- The ScrollView should only wrap the content of the dialog, otherwise the background
+             corner radius will be cut off when scrolling to the top/bottom. -->
+        <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+            <LinearLayout
+                android:padding="24dp"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:orientation="vertical">
+
+                <ImageView
+                    android:id="@+id/application_icon"
+                    android:layout_width="32dp"
+                    android:layout_height="32dp"
+                    android:layout_gravity="center_horizontal"
+                    android:importantForAccessibility="no"
+                    android:layout_marginTop="24dp"
+                    android:layout_marginBottom="16dp"
+                    android:scaleType="centerCrop"/>
+
+                <TextView
+                    android:id="@+id/application_name"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center_horizontal"
+                    android:layout_marginBottom="8dp"
+                    android:lineHeight="32dp"
+                    android:textFontWeight="400"
+                    android:textSize="24sp"
+                    android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+                    tools:text="Gmail" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textSize="12sp"
+                    android:textFontWeight="400"
+                    android:lineHeight="16dp"
+                    android:layout_gravity="center_horizontal"
+                    android:layout_marginBottom="16dp"
+                    android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+                    android:text="@string/open_by_default_dialog_subheader_text"/>
+
+                <RadioGroup
+                    android:id="@+id/open_by_default_radio_group"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center_horizontal">
+                    <RadioButton
+                        android:id="@+id/open_in_app_button"
+                        android:layout_width="@dimen/open_by_default_settings_dialog_radio_button_width"
+                        android:layout_height="@dimen/open_by_default_settings_dialog_radio_button_height"
+                        android:paddingStart="20dp"
+                        android:paddingEnd="0dp"
+                        android:layout_marginHorizontal="16dp"
+                        android:layout_marginBottom="4dp"
+                        android:text="@string/open_by_default_dialog_in_app_text"
+                        android:textFontWeight="500"
+                        android:textSize="16sp"
+                        android:lineHeight="24dp"
+                        android:background="@drawable/open_by_default_settings_dialog_radio_buttons_background"/>
+                    <RadioButton
+                        android:id="@+id/open_in_browser_button"
+                        android:layout_width="@dimen/open_by_default_settings_dialog_radio_button_width"
+                        android:layout_height="@dimen/open_by_default_settings_dialog_radio_button_height"
+                        android:paddingStart="20dp"
+                        android:paddingEnd="0dp"
+                        android:layout_marginStart="16dp"
+                        android:text="@string/open_by_default_dialog_in_browser_text"
+                        android:textFontWeight="500"
+                        android:textSize="16sp"
+                        android:lineHeight="24dp"
+                        android:background="@drawable/open_by_default_settings_dialog_radio_buttons_background"/>
+                </RadioGroup>
+
+                <Button
+                    android:id="@+id/open_by_default_settings_dialog_dismiss_button"
+                    android:layout_width="wrap_content"
+                    android:layout_height="36dp"
+                    android:text="@string/open_by_default_dialog_dismiss_button_text"
+                    android:layout_gravity="end"
+                    android:layout_marginHorizontal="24dp"
+                    android:layout_marginTop="32dp"
+                    android:layout_marginBottom="24dp"
+                    android:textSize="14sp"
+                    android:textFontWeight="500"
+                    android:textColor="?androidprv:attr/materialColorOnPrimary"
+                    android:background="@drawable/open_by_default_settings_dialog_dismiss_button_background"/>
+            </LinearLayout>
+        </ScrollView>
+    </FrameLayout>
+</com.android.wm.shell.apptoweb.OpenByDefaultDialogView>
+
diff --git a/libs/WindowManager/Shell/res/layout/pip2_menu_action.xml b/libs/WindowManager/Shell/res/layout/pip2_menu_action.xml
new file mode 100644
index 0000000..04ece31
--- /dev/null
+++ b/libs/WindowManager/Shell/res/layout/pip2_menu_action.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2024 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.
+-->
+<com.android.wm.shell.pip2.phone.PipMenuActionView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="@dimen/pip_action_size"
+    android:layout_height="@dimen/pip_action_size"
+    android:background="?android:selectableItemBackgroundBorderless"
+    android:forceHasOverlappingRendering="false">
+
+    <ImageView
+        android:id="@+id/custom_close_bg"
+        android:layout_width="@dimen/pip_custom_close_bg_size"
+        android:layout_height="@dimen/pip_custom_close_bg_size"
+        android:layout_gravity="center"
+        android:src="@drawable/pip_custom_close_bg"
+        android:visibility="gone"/>
+
+    <ImageView
+        android:id="@+id/image"
+        android:layout_width="@dimen/pip_action_inner_size"
+        android:layout_height="@dimen/pip_action_inner_size"
+        android:layout_gravity="center"
+        android:scaleType="fitXY"/>
+
+</com.android.wm.shell.pip2.phone.PipMenuActionView>
diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml
index 50aa4ca..582c1a2 100644
--- a/libs/WindowManager/Shell/res/values-af/strings.xml
+++ b/libs/WindowManager/Shell/res/values-af/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamerakwessies?\nTik om aan te pas"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nie opgelos nie?\nTik om terug te stel"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen kamerakwessies nie? Tik om toe te maak."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tik om die appkieslys oop te maak"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tik om verskeie apps saam te wys"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Keer terug na volskerm van die appkieslys af"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Sien en doen meer"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Sleep ’n ander app in vir verdeelde skerm"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dubbeltik buite ’n program om dit te herposisioneer"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Bestuur vensters"</string>
     <string name="close_text" msgid="4986518933445178928">"Maak toe"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Maak kieslys toe"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Maak kieslys oop"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimeer skerm"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Gryp skerm vas"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Hierdie app se grootte kan nie verander word nie"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"App kan nie hierheen geskuif word nie"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimeer"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Spring na links"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Spring na regs"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml
index 281e313..0798c9a 100644
--- a/libs/WindowManager/Shell/res/values-am/strings.xml
+++ b/libs/WindowManager/Shell/res/values-am/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"የካሜራ ችግሮች አሉ?\nዳግም ለማበጀት መታ ያድርጉ"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"አልተስተካከለም?\nለማህደር መታ ያድርጉ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ምንም የካሜራ ችግሮች የሉም? ለማሰናበት መታ ያድርጉ።"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"የመተግበሪያ ምናሌውን ለመክፈት መታ ያድርጉ"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"በርካታ መተግበሪያዎችን በአንድ ላይ ለማየት መታ ያድርጉ"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ከመተግበሪያ ምናሌው ወደ ሙሉ ማያ ገፅ ይመለሱ"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ተጨማሪ ይመልከቱ እና ያድርጉ"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ለተከፈለ ማያ ገፅ ሌላ መተግበሪያ ይጎትቱ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ቦታውን ለመቀየር ከመተግበሪያው ውጭ ሁለቴ መታ ያድርጉ"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"መስኮቶችን አስተዳድር"</string>
     <string name="close_text" msgid="4986518933445178928">"ዝጋ"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"ምናሌ ዝጋ"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"ምናሌን ክፈት"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"የማያ ገጹ መጠን አሳድግ"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ማያ ገጹን አሳድግ"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ይህ መተግበሪያ መጠኑ ሊቀየር አይችልም"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"መተግበሪያ ወደዚህ መንቀሳቀስ አይችልም"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"አሳድግ"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ወደ ግራ አሳድግ"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ወደ ቀኝ አሳድግ"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml
index 2c0b34a..9dcb5ec 100644
--- a/libs/WindowManager/Shell/res/values-ar/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ar/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"هل هناك مشاكل في الكاميرا؟\nانقر لإعادة الضبط."</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ألم يتم حل المشكلة؟\nانقر للعودة"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"أليس هناك مشاكل في الكاميرا؟ انقر للإغلاق."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"انقر لفتح قائمة التطبيق"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"انقر لعرض عدة تطبيقات معًا"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"الرجوع إلى وضع ملء الشاشة من قائمة التطبيق"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"استخدام تطبيقات متعدّدة في وقت واحد"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"اسحب تطبيقًا آخر لاستخدام وضع تقسيم الشاشة."</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"انقر مرّتين خارج تطبيق لتغيير موضعه."</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"إدارة النوافذ"</string>
     <string name="close_text" msgid="4986518933445178928">"إغلاق"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"إغلاق القائمة"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"فتح القائمة"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"تكبير الشاشة إلى أقصى حدّ"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"التقاط صورة للشاشة"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"لا يمكن تغيير حجم نافذة هذا التطبيق"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"لا يمكن نقل التطبيق إلى هنا"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"تكبير"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"المحاذاة إلى اليسار"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"المحاذاة إلى اليمين"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml
index c5e3716..484eef5 100644
--- a/libs/WindowManager/Shell/res/values-as/strings.xml
+++ b/libs/WindowManager/Shell/res/values-as/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"কেমেৰাৰ কোনো সমস্যা হৈছে নেকি?\nপুনৰ খাপ খোৱাবলৈ টিপক"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এইটো সমাধান কৰা নাই নেকি?\nপূৰ্বাৱস্থালৈ নিবলৈ টিপক"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"কেমেৰাৰ কোনো সমস্যা নাই নেকি? অগ্ৰাহ্য কৰিবলৈ টিপক।"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"এপৰ মেনুখন খুলিবলৈ টিপক"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"একাধিক এপ্ একেলগে দেখুৱাবলৈ টিপক"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"এপৰ মেনুখনৰ পৰা পূৰ্ণ স্ক্ৰীনলৈ উভতি যাওক"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"চাওক আৰু অধিক কৰক"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"বিভাজিত স্ক্ৰীনৰ বাবে অন্য এটা এপ্‌ টানি আনি এৰক"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"এপ্‌টোৰ স্থান সলনি কৰিবলৈ ইয়াৰ বাহিৰত দুবাৰ টিপক"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"ৱিণ্ড’ পৰিচালনা কৰক"</string>
     <string name="close_text" msgid="4986518933445178928">"বন্ধ কৰক"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"মেনু বন্ধ কৰক"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"মেনু খোলক"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"স্ক্ৰীন মেক্সিমাইজ কৰক"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"স্ক্ৰীন স্নেপ কৰক"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"এই এপ্‌টোৰ আকাৰ সলনি কৰিব নোৱাৰি"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ইয়ালৈ এপ্‌টো আনিব নোৱাৰি"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"মেক্সিমাইজ কৰক"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"বাওঁফাললৈ স্নেপ কৰক"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"সোঁফাললৈ স্নেপ কৰক"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml
index e23e8d0..ded6da8 100644
--- a/libs/WindowManager/Shell/res/values-az/strings.xml
+++ b/libs/WindowManager/Shell/res/values-az/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamera problemi var?\nBərpa etmək üçün toxunun"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Düzəltməmisiniz?\nGeri qaytarmaq üçün toxunun"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera problemi yoxdur? Qapatmaq üçün toxunun."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tətbiq menyusunu açmaq üçün toxunun"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Bir neçə tətbiqi birlikdə göstərmək üçün toxunun"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Tətbiq menyusundan tam ekrana qayıdın"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Ardını görün və edin"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Bölünmüş ekran üçün başqa tətbiq sürüşdürün"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Tətbiqin yerini dəyişmək üçün kənarına iki dəfə toxunun"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Pəncərələri idarə edin"</string>
     <string name="close_text" msgid="4986518933445178928">"Bağlayın"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Menyunu bağlayın"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menyunu açın"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ekranı maksimum böyüdün"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ekranı çəkin"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Bu tətbiqin ölçüsünü dəyişmək olmur"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Tətbiqi bura köçürmək mümkün deyil"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Böyüdün"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Sola tərəf çəkin"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Sağa tərəf çəkin"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
index 283d1f5..415547c 100644
--- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Imate problema sa kamerom?\nDodirnite da biste ponovo uklopili"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije rešen?\nDodirnite da biste vratili"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema sa kamerom? Dodirnite da biste odbacili."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Dodirnite da biste otvorili meni aplikacije"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Dodirnite da biste prikazali više aplikacija zajedno"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Vratite se iz menija aplikacije na prikaz preko celog ekrana"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Vidite i uradite više"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Prevucite drugu aplikaciju da biste koristili podeljeni ekran"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvaput dodirnite izvan aplikacije da biste promenili njenu poziciju"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Upravljajte prozorima"</string>
     <string name="close_text" msgid="4986518933445178928">"Zatvorite"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zatvorite meni"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otvorite meni"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Povećaj ekran"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Uklopi ekran"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Veličina ove aplikacije ne može da se promeni"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikacija ne može da se premesti ovde"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Uvećajte"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Prikačite levo"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Prikačite desno"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml
index 48914f1..aded647 100644
--- a/libs/WindowManager/Shell/res/values-be/strings.xml
+++ b/libs/WindowManager/Shell/res/values-be/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Праблемы з камерай?\nНацісніце, каб пераабсталяваць"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не ўдалося выправіць?\nНацісніце, каб аднавіць"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ніякіх праблем з камерай? Націсніце, каб адхіліць."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Адкрыць меню праграмы"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Паказаць некалькі праграм разам"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Вярнуцца ў поўнаэкранны рэжым з меню праграмы"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Адначасова выконвайце розныя задачы"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Перацягніце іншую праграму, каб выкарыстоўваць падзелены экран"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Двойчы націсніце экран па-за праграмай, каб перамясціць яе"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Кіраваць вокнамі"</string>
     <string name="close_text" msgid="4986518933445178928">"Закрыць"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Закрыць меню"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Адкрыць меню"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Разгарнуць на ўвесь экран"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Размясціць на палавіне экрана"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Немагчыма змяніць памер праграмы"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Нельга перамясціць сюды праграму"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Разгарнуць"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Размясціць злева"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Размясціць справа"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml
index b385d28..8a69176 100644
--- a/libs/WindowManager/Shell/res/values-bg/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bg/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Имате проблеми с камерата?\nДокоснете за ремонтиране"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблемът не се отстрани?\nДокоснете за връщане в предишното състояние"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нямате проблеми с камерата? Докоснете, за да отхвърлите."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Докоснете, за да отворите менюто на приложението"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Докоснете, за да видите няколко приложения заедно"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Връщане към цял екран от менюто на приложението"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Преглеждайте и правете повече неща"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Преместете друго приложение с плъзгане, за да преминете в режим за разделен екран"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Докоснете два пъти извън дадено приложение, за да промените позицията му"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Управление на прозорците"</string>
     <string name="close_text" msgid="4986518933445178928">"Затваряне"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Затваряне на менюто"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Отваряне на менюто"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Увеличаване на екрана"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Прилепване на екрана"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Това приложение не може да бъде преоразмерено"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Приложението не може да бъде преместено тук"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Увеличаване"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Прилепване наляво"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Прилепване надясно"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml
index 56fcf7f..3799c9f 100644
--- a/libs/WindowManager/Shell/res/values-bn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bn/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ক্যামেরা সংক্রান্ত সমস্যা?\nরিফিট করতে ট্যাপ করুন"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এখনও সমাধান হয়নি?\nরিভার্ট করার জন্য ট্যাপ করুন"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ক্যামেরা সংক্রান্ত সমস্যা নেই? বাতিল করতে ট্যাপ করুন।"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"অ্যাপ মেনু খুলতে ট্যাপ করুন"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"একাধিক অ্যাপ একসাথে দেখতে ট্যাপ করুন"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"অ্যাপ মেনু থেকে ফুল-স্ক্রিন মোডে ফিরে যান"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"দেখুন ও আরও অনেক কিছু করুন"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"স্প্লিট স্ক্রিনের ক্ষেত্রে অন্য কোনও অ্যাপ টেনে আনুন"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"কোনও অ্যাপের স্থান পরিবর্তন করতে তার বাইরে ডবল ট্যাপ করুন"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"উইন্ডো ম্যানেজ করুন"</string>
     <string name="close_text" msgid="4986518933445178928">"বন্ধ করুন"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"\'মেনু\' বন্ধ করুন"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"মেনু খুলুন"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"স্ক্রিন বড় করুন"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"স্ক্রিনে অ্যাপ মানানসই হিসেবে ছোট বড় করুন"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"এই অ্যাপ ছোট বড় করা যাবে না"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"অ্যাপটি এখানে সরানো যাবে না"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"বড় করুন"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"বাঁদিকে স্ন্যাপ করুন"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ডানদিকে স্ন্যাপ করুন"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml
index 95362bb..f0d172a 100644
--- a/libs/WindowManager/Shell/res/values-bs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bs/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi s kamerom?\nDodirnite da ponovo namjestite"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nije popravljeno?\nDodirnite da vratite"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nema problema s kamerom? Dodirnite da odbacite."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Otvaranje menija aplikacije dodirom"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Istovremeni prikaz više aplikacija dodirom"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Povratak na prikaz preko cijelog ekrana putem menija aplikacije"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Pogledajte i učinite više"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Prevucite još jednu aplikaciju za podijeljeni ekran"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvaput dodirnite izvan aplikacije da promijenite njen položaj"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Upravljanje prozorima"</string>
     <string name="close_text" msgid="4986518933445178928">"Zatvaranje"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zatvaranje menija"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otvaranje menija"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimiziraj ekran"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snimi ekran"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Nije moguće promijeniti veličinu aplikacije"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Ne možete premjestiti aplikaciju ovdje"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimiziranje"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Pomicanje ulijevo"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Pomicanje udesno"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml
index e0b2538..bf35c90 100644
--- a/libs/WindowManager/Shell/res/values-ca/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ca/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Tens problemes amb la càmera?\nToca per resoldre\'ls"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"El problema no s\'ha resolt?\nToca per desfer els canvis"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No tens cap problema amb la càmera? Toca per ignorar."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toca per obrir el menú de l\'aplicació"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toca per mostrar diverses aplicacions alhora"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Torna a la pantalla completa des del menú de l\'aplicació"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Consulta i fes més coses"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arrossega una altra aplicació per utilitzar la pantalla dividida"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Fes doble toc fora d\'una aplicació per canviar-ne la posició"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Gestiona les finestres"</string>
     <string name="close_text" msgid="4986518933445178928">"Tanca"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Tanca el menú"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Obre el menú"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximitza la pantalla"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajusta la pantalla"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"No es pot canviar la mida d\'aquesta aplicació"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"L\'aplicació no es pot moure aquí"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximitza"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ajusta a l\'esquerra"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ajusta a la dreta"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml
index 3aae52e..7fc1033 100644
--- a/libs/WindowManager/Shell/res/values-cs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-cs/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problémy s fotoaparátem?\nKlepnutím vyřešíte"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepomohlo to?\nKlepnutím se vrátíte"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Žádné problémy s fotoaparátem? Klepnutím zavřete."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Klepnutím otevřete nabídku aplikace"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Klepnutím zobrazíte několik aplikací najednou"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Návrat na celou obrazovku z nabídky aplikace"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Lepší zobrazení a více možností"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Přetáhnutím druhé aplikace použijete rozdělenou obrazovku"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvojitým klepnutím mimo aplikaci změníte její umístění"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Spravovat okna"</string>
     <string name="close_text" msgid="4986518933445178928">"Zavřít"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zavřít nabídku"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otevřít nabídku"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximalizovat obrazovku"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Rozpůlit obrazovku"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Velikost aplikace nelze změnit"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikaci sem nelze přesunout"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximalizovat"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Přichytit vlevo"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Přichytit vpravo"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml
index fdc5913..717e6c4 100644
--- a/libs/WindowManager/Shell/res/values-da/strings.xml
+++ b/libs/WindowManager/Shell/res/values-da/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Har du problemer med dit kamera?\nTryk for at gendanne det oprindelige format"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Løste det ikke problemet?\nTryk for at fortryde"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen problemer med dit kamera? Tryk for at afvise."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tryk for at åbne appmenuen"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tryk for at se flere apps på én gang"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Gå tilbage til fuld skærm via appmenuen"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Se og gør mere"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Træk en anden app hertil for at bruge opdelt skærm"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Tryk to gange uden for en app for at justere dens placering"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Administrer vinduer"</string>
     <string name="close_text" msgid="4986518933445178928">"Luk"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Luk menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Åbn menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimér skærm"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Tilpas skærm"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Størrelsen på denne app kan ikke justeres"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Apps kan ikke flyttes hertil"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimér"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Fastgør til venstre"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Fastgør til højre"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml
index 913e3d0..bccd4ae 100644
--- a/libs/WindowManager/Shell/res/values-de/strings.xml
+++ b/libs/WindowManager/Shell/res/values-de/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Probleme mit der Kamera?\nZum Anpassen tippen."</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Das Problem ist nicht behoben?\nZum Rückgängigmachen tippen."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Keine Probleme mit der Kamera? Zum Schließen tippen."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Zum Öffnen des App-Menüs tippen"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tippen, um mehrere Apps gleichzeitig anzuzeigen"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Über das App-Menü zum Vollbildmodus zurückkehren"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Mehr sehen und erledigen"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Für Splitscreen-Modus weitere App hineinziehen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Außerhalb einer App doppeltippen, um die Position zu ändern"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Fenster verwalten"</string>
     <string name="close_text" msgid="4986518933445178928">"Schließen"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Menü schließen"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menü öffnen"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Bildschirm maximieren"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Bildschirm teilen"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Die Größe dieser App kann nicht geändert werden"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Die App kann nicht hierher verschoben werden"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximieren"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Links andocken"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Rechts andocken"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml
index 564fa91..1039273 100644
--- a/libs/WindowManager/Shell/res/values-el/strings.xml
+++ b/libs/WindowManager/Shell/res/values-el/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Προβλήματα με την κάμερα;\nΠατήστε για επιδιόρθωση."</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Δεν διορθώθηκε;\nΠατήστε για επαναφορά."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Δεν αντιμετωπίζετε προβλήματα με την κάμερα; Πατήστε για παράβλεψη."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Πατήστε για άνοιγμα του μενού της εφαρμογής"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Πατήστε για εμφάνιση πολλών εφαρμογών μαζί"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Επιστρέψτε στην πλήρη οθόνη από το μενού της εφαρμογής"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Δείτε και κάντε περισσότερα"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Σύρετε σε μια άλλη εφαρμογή για διαχωρισμό οθόνης."</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Πατήστε δύο φορές έξω από μια εφαρμογή για να αλλάξετε τη θέση της"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Διαχείριση παραθύρων"</string>
     <string name="close_text" msgid="4986518933445178928">"Κλείσιμο"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Κλείσιμο μενού"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Άνοιγμα μενού"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Μεγιστοποίηση οθόνης"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Προβολή στο μισό της οθόνης"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Δεν είναι δυνατή η αλλαγή μεγέθους αυτής της εφαρμογής"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Δεν είναι δυνατή η μετακίνηση της εφαρμογής εδώ"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Μεγιστοποίηση"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Κούμπωμα αριστερά"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Κούμπωμα δεξιά"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
index e4ece93..98da627 100644
--- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tap to open the app menu"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tap to show multiple apps together"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Return to fullscreen from the app menu"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"See and do more"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Drag in another app for split screen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Double-tap outside an app to reposition it"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Manage windows"</string>
     <string name="close_text" msgid="4986518933445178928">"Close"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximise screen"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap screen"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"App can\'t be moved here"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximise"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
index 14fe60b..e928fe0 100644
--- a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tap to open the app menu"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tap to show multiple apps together"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Return to fullscreen from the app menu"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"See and do more"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Drag in another app for split screen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Double-tap outside an app to reposition it"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Manage Windows"</string>
     <string name="close_text" msgid="4986518933445178928">"Close"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Close Menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open Menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximize Screen"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap Screen"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"App can\'t be moved here"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximize"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
index e4ece93..98da627 100644
--- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tap to open the app menu"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tap to show multiple apps together"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Return to fullscreen from the app menu"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"See and do more"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Drag in another app for split screen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Double-tap outside an app to reposition it"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Manage windows"</string>
     <string name="close_text" msgid="4986518933445178928">"Close"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximise screen"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap screen"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"App can\'t be moved here"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximise"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
index e4ece93..98da627 100644
--- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tap to open the app menu"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tap to show multiple apps together"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Return to fullscreen from the app menu"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"See and do more"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Drag in another app for split screen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Double-tap outside an app to reposition it"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Manage windows"</string>
     <string name="close_text" msgid="4986518933445178928">"Close"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximise screen"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap screen"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"App can\'t be moved here"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximise"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
index dda97ab..e48a9db 100644
--- a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‏‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‏‏‎Camera issues?‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Tap to refit‎‏‎‎‏‎"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‏‎Didn’t fix it?‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Tap to revert‎‏‎‎‏‎"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‏‎‏‏‎‎‏‎‎‎‎‏‎‎‏‎‎‏‎‎‎‏‎‎‏‏‎‎‏‏‎‎‎‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎No camera issues? Tap to dismiss.‎‏‎‎‏‎"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‏‏‎‏‏‎‎‏‎‏‎‏‏‎‏‎‏‏‏‎‎‏‏‏‎Tap to open the app menu‎‏‎‎‏‎"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‏‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‏‎‏‏‏‎‏‎Tap to show multiple apps together‎‏‎‎‏‎"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‏‏‎‏‎‏‎‎‏‎‏‎‎‏‎‏‏‎‏‎‎‎‏‏‎‎‎‏‎‎‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‎‏‎Return to fullscreen from the app menu‎‏‎‎‏‎"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‏‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‏‏‏‏‏‏‎‎See and do more‎‏‎‎‏‎"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‎‎‎‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‎‎‏‏‏‎‎‎‎‏‏‎Drag in another app for split screen‎‏‎‎‏‎"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‎‎‎‏‏‏‎‏‎‏‏‎‎‏‎‏‎‎‎‎‎‎‎‎‎‏‎‎‏‏‎‏‎‏‎Double-tap outside an app to reposition it‎‏‎‎‏‎"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‎‎‏‎‏‎‎‎‎‎‎‏‏‎‎‎‏‎‎‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‎‎‎‎‏‎‎‎‎‎‎Manage Windows‎‏‎‎‏‎"</string>
     <string name="close_text" msgid="4986518933445178928">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‏‎‏‏‎‎‎‏‏‎‎‎‎‎Close‎‏‎‎‏‎"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‎‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‎‏‏‎‏‏‎‏‎‎‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‎‏‎Close Menu‎‏‎‎‏‎"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‎‏‎‎‎‎‏‎‎‏‏‏‎‏‎‎‎‏‏‎‎‏‏‏‎‎‎‏‎‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎Open Menu‎‏‎‎‏‎"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎‎‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎Maximize Screen‎‏‎‎‏‎"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‏‏‏‎‎‏‏‎‏‏‏‏‎‏‏‎‏‎‎Snap Screen‎‏‎‎‏‎"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‎‏‎‎‎‏‏‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‎‏‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‎‎‏‏‎This app can\'t be resized‎‏‎‎‏‎"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‏‎‏‎‏‏‎‎‎‎‏‏‏‎‏‎‎‏‎‎‏‎‏‎‎‏‎‎‎‎‎‎‏‏‏‎‎‏‏‎‎App can\'t be moved here‎‏‎‎‏‎"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎Maximize‎‏‎‎‏‎"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‏‎‏‎‏‏‎‎‎‎‎Snap left‎‏‎‎‏‎"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‏‎‏‎‏‎‏‎‎‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎‎‎‎‏‎‏‎‎‏‏‎‏‎‏‏‎‏‏‏‎‏‏‎‎‎‎Snap right‎‏‎‎‏‎"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
index a4c0363..f349cbb 100644
--- a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"¿Tienes problemas con la cámara?\nPresiona para reajustarla"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se resolvió?\nPresiona para revertir los cambios"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No tienes problemas con la cámara? Presionar para descartar."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Presiona para abrir el menú de la app"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Presiona para mostrar varias apps juntas"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Regresa a pantalla completa desde el menú de la app"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Aprovecha más"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arrastra otra app para el modo de pantalla dividida"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Presiona dos veces fuera de una app para cambiar su ubicación"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Administrar ventanas"</string>
     <string name="close_text" msgid="4986518933445178928">"Cerrar"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Cerrar menú"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Abrir el menú"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizar pantalla"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajustar pantalla"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"No se puede cambiar el tamaño de esta app"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"No se puede mover la app aquí"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizar"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ajustar a la izquierda"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ajustar a la derecha"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml
index 69f7d7b..9f6b2e65 100644
--- a/libs/WindowManager/Shell/res/values-es/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"¿Problemas con la cámara?\nToca para reajustar"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se ha solucionado?\nToca para revertir"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No hay problemas con la cámara? Toca para cerrar."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toca para abrir el menú de aplicaciones"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toca para mostrar varias aplicaciones a la vez"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Vuelve a pantalla completa desde el menú de aplicaciones"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Consulta más información y haz más"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arrastra otra aplicación para activar la pantalla dividida"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toca dos veces fuera de una aplicación para cambiarla de posición"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Gestionar ventanas"</string>
     <string name="close_text" msgid="4986518933445178928">"Cerrar"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Cerrar menú"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Abrir menú"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizar pantalla"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajustar pantalla"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"No se puede cambiar el tamaño de esta aplicación"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"La aplicación no se puede mover aquí"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizar"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Acoplar a la izquierda"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Acoplar a la derecha"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml
index 3d929f6..b2b06d6 100644
--- a/libs/WindowManager/Shell/res/values-et/strings.xml
+++ b/libs/WindowManager/Shell/res/values-et/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kas teil on kaameraprobleeme?\nPuudutage ümberpaigutamiseks."</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Kas probleemi ei lahendatud?\nPuudutage ennistamiseks."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kas kaameraprobleeme pole? Puudutage loobumiseks."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Puudutage rakenduse menüü avamiseks"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Puudutage mitme rakenduse koos kuvamiseks"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Minge rakenduse menüüst tagasi täisekraanile"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Vaadake ja tehke rohkem"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Lohistage muusse rakendusse, et jagatud ekraanikuva kasutada"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Topeltpuudutage rakendusest väljaspool, et selle asendit muuta"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Akende haldamine"</string>
     <string name="close_text" msgid="4986518933445178928">"Sule"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Sule menüü"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Ava menüü"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Kuva täisekraanil"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Kuva poolel ekraanil"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Selle rakenduse aknasuurust ei saa muuta"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Rakendust ei saa siia teisaldada"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimeeri"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Tõmmake vasakule"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Tõmmake paremale"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml
index 39bcf08..4a71c49 100644
--- a/libs/WindowManager/Shell/res/values-eu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-eu/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Arazoak dauzkazu kamerarekin?\nBerriro doitzeko, sakatu hau."</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ez al da konpondu?\nLeheneratzeko, sakatu hau."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ez daukazu arazorik kamerarekin? Baztertzeko, sakatu hau."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Sakatu hau aplikazioen menua irekitzeko"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Sakatu hau aplikazio bat baino gehiago aldi berean erakusteko"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Itzuli pantaila osora aplikazioen menutik"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Ikusi eta egin gauza gehiago"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Pantaila zatitua ikusteko, arrastatu beste aplikazio bat"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Aplikazioaren posizioa aldatzeko, sakatu birritan haren kanpoaldea"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Kudeatu leihoak"</string>
     <string name="close_text" msgid="4986518933445178928">"Itxi"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Itxi menua"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Ireki menua"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Handitu pantaila"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Zatitu pantaila"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Ezin zaio aldatu tamaina aplikazio honi"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikazioa ezin da hona ekarri"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizatu"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ezarri ezkerrean"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ezarri eskuinean"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml
index 9f607bf..941ff84 100644
--- a/libs/WindowManager/Shell/res/values-fa/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fa/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"دوربین مشکل دارد؟\nبرای تنظیم مجدد اندازه تک‌ضرب بزنید"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"مشکل برطرف نشد؟\nبرای برگرداندن تک‌ضرب بزنید"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"دوربین مشکلی ندارد؟ برای بستن تک‌ضرب بزنید."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"برای باز کردن منو برنامه، تک‌ضرب بزنید"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"برای نمایش چند برنامه با هم، تک‌ضرب بزنید"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"از منو برنامه به تمام‌صفحه برگردید"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"از چندین برنامه به‌طور هم‌زمان استفاده کنید"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"برای حالت صفحهٔ دونیمه، در برنامه‌ای دیگر بکشید"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"برای جابه‌جا کردن برنامه، بیرون از آن دو تک‌ضرب بزنید"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"مدیریت کردن پنجره‌ها"</string>
     <string name="close_text" msgid="4986518933445178928">"بستن"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"بستن منو"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"باز کردن منو"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"بزرگ کردن صفحه"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"بزرگ کردن صفحه"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"اندازه این برنامه را نمی‌توان تغییر داد"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"برنامه را نمی‌توان به اینجا منتقل کرد"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"بزرگ کردن"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"کشیدن به‌چپ"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"کشیدن به‌راست"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-fa/strings_tv.xml b/libs/WindowManager/Shell/res/values-fa/strings_tv.xml
index 55394cb..7b0c8c6 100644
--- a/libs/WindowManager/Shell/res/values-fa/strings_tv.xml
+++ b/libs/WindowManager/Shell/res/values-fa/strings_tv.xml
@@ -18,7 +18,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="notification_channel_tv_pip" msgid="2576686079160402435">"تصویر در تصویر"</string>
-    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(برنامه بدون عنوان)"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(برنامه بی‌عنوان)"</string>
     <string name="pip_close" msgid="2955969519031223530">"بستن"</string>
     <string name="pip_fullscreen" msgid="7278047353591302554">"تمام صفحه"</string>
     <string name="pip_move" msgid="158770205886688553">"انتقال"</string>
diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml
index 04b6241..a45e9af 100644
--- a/libs/WindowManager/Shell/res/values-fi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fi/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Onko kameran kanssa ongelmia?\nKorjaa napauttamalla"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Eikö ongelma ratkennut?\nKumoa napauttamalla"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ei ongelmia kameran kanssa? Hylkää napauttamalla."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Avaa sovellusvalikko napauttamalla"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Näytä useita sovelluksia yhdessä napauttamalla"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Palaa koko näytön tilaan sovellusvalikosta"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Näe ja tee enemmän"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Käytä jaettua näyttöä vetämällä tähän toinen sovellus"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Kaksoisnapauta sovelluksen ulkopuolella, jos haluat siirtää sitä"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Hallinnoi ikkunoita"</string>
     <string name="close_text" msgid="4986518933445178928">"Sulje"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Sulje valikko"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Avaa valikko"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Suurenna näyttö"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Jaa näyttö"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Tämän sovellusikkunan kokoa ei voi muuttaa"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Sovellusta ei voi siirtää tänne"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Suurenna"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Siirrä vasemmalle"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Siirrä oikealle"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
index 7312952..c163165 100644
--- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problèmes d\'appareil photo?\nTouchez pour réajuster"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu?\nTouchez pour rétablir"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo? Touchez pour ignorer."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toucher ici pour ouvrir le menu de l\'appli"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toucher ici pour afficher plusieurs applis ensemble"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Revenir au mode Plein écran à partir du menu de l\'appli"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Voir et en faire plus"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Faites glisser une autre appli pour utiliser l\'écran partagé"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Touchez deux fois à côté d\'une appli pour la repositionner"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Gérer les fenêtres"</string>
     <string name="close_text" msgid="4986518933445178928">"Fermer"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Fermer le menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Ouvrir le menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Agrandir l\'écran"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Aligner l\'écran"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Impossible de redimensionner cette appli"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Impossible de déplacer l\'appli ici"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Agrandir"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Épingler à gauche"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Épingler à droite"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml
index 8f4e58f..b2a6f16 100644
--- a/libs/WindowManager/Shell/res/values-fr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problèmes d\'appareil photo ?\nAppuyez pour réajuster"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu ?\nAppuyez pour rétablir"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo ? Appuyez pour ignorer."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Appuyer pour ouvrir le menu de l\'appli"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Appuyer pour afficher plusieurs applis simultanément"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Revenir en plein écran depuis le menu de l\'appli"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Voir et interagir plus"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Faites glisser une autre appli pour utiliser l\'écran partagé"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Appuyez deux fois en dehors d\'une appli pour la repositionner"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Gérer les fenêtres"</string>
     <string name="close_text" msgid="4986518933445178928">"Fermer"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Fermer le menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Ouvrir le menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Mettre en plein écran"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Fractionner l\'écran"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Impossible de redimensionner cette appli"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Impossible de déplacer l\'appli ici"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Agrandir"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ancrer à gauche"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ancrer à droite"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml
index 5c0aa07..ab972f9 100644
--- a/libs/WindowManager/Shell/res/values-gl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gl/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Tes problemas coa cámara?\nToca para reaxustala"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Non se solucionaron os problemas?\nToca para reverter o seu tratamento"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Non hai problemas coa cámara? Tocar para ignorar."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toca para abrir o menú da aplicación"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toca para mostrar varias aplicacións xuntas"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Volve á pantalla completa desde o menú da aplicación"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Ver e facer máis"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arrastra outra aplicación para usar a pantalla dividida"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toca dúas veces fóra da aplicación para cambiala de posición"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Xestionar as ventás"</string>
     <string name="close_text" msgid="4986518933445178928">"Pechar"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Pechar o menú"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Abrir o menú"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizar pantalla"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Encaixar pantalla"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Non se pode cambiar o tamaño desta aplicación"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Non se pode mover aquí a aplicación"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizar"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Axustar á esquerda"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Axustar á dereita"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml
index a382d0b..0dc2f73 100644
--- a/libs/WindowManager/Shell/res/values-gu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gu/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"કૅમેરામાં સમસ્યાઓ છે?\nફરીથી ફિટ કરવા માટે ટૅપ કરો"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"સુધારો નથી થયો?\nપહેલાંના પર પાછું ફેરવવા માટે ટૅપ કરો"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"કૅમેરામાં કોઈ સમસ્યા નથી? છોડી દેવા માટે ટૅપ કરો."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ઍપ મેનૂ ખોલવા માટે ટૅપ કરો"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"એકથી વધુ ઍપ એકસાથે બતાવવા માટે ટૅપ કરો"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ઍપ મેનૂમાંથી પૂર્ણસ્ક્રીન પર પાછા ફરો"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"જુઓ અને બીજું ઘણું કરો"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"વિભાજિત સ્ક્રીન માટે કોઈ અન્ય ઍપમાં ખેંચો"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"કોઈ ઍપની જગ્યા બદલવા માટે, તેની બહાર બે વાર ટૅપ કરો"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"વિન્ડો મેનેજ કરો"</string>
     <string name="close_text" msgid="4986518933445178928">"બંધ કરો"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"મેનૂ બંધ કરો"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"મેનૂ ખોલો"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"સ્ક્રીન કરો મોટી કરો"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"સ્ક્રીન સ્નૅપ કરો"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"આ ઍપના કદમાં વધઘટ કરી શકાતો નથી"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ઍપ અહીં ખસેડી શકાતી નથી"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"મોટું કરો"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ડાબે સ્નૅપ કરો"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"જમણે સ્નૅપ કરો"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml
index d6fc85b..679d800 100644
--- a/libs/WindowManager/Shell/res/values-hi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hi/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"क्या कैमरे से जुड़ी कोई समस्या है?\nफिर से फ़िट करने के लिए टैप करें"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"क्या समस्या ठीक नहीं हुई?\nपहले जैसा करने के लिए टैप करें"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्या कैमरे से जुड़ी कोई समस्या नहीं है? खारिज करने के लिए टैप करें."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ऐप्लिकेशन मेन्यू खोलने के लिए टैप करें"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"कई ऐप्लिकेशन एक साथ दिखाने के लिए टैप करें"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ऐप्लिकेशन मेन्यू से फ़ुलस्क्रीन मोड पर वापस जाएं"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"पूरी जानकारी लेकर, बेहतर तरीके से काम करें"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"स्प्लिट स्क्रीन का इस्तेमाल करने के लिए, किसी अन्य ऐप्लिकेशन को खींचें और छोड़ें"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"किसी ऐप्लिकेशन की जगह बदलने के लिए, उसके बाहर दो बार टैप करें"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"विंडो मैनेज करें"</string>
     <string name="close_text" msgid="4986518933445178928">"बंद करें"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"मेन्यू बंद करें"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"मेन्यू खोलें"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"स्क्रीन को बड़ा करें"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"स्नैप स्क्रीन"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"इस ऐप्लिकेशन का साइज़ नहीं बदला जा सकता"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ऐप्लिकेशन को यहां मूव नहीं किया जा सकता"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"बड़ा करें"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"बाईं ओर स्नैप करें"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"दाईं ओर स्नैप करें"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml
index f233c02..1e5ffc8 100644
--- a/libs/WindowManager/Shell/res/values-hr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hr/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi s fotoaparatom?\nDodirnite za popravak"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije riješen?\nDodirnite za vraćanje"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema s fotoaparatom? Dodirnite za odbacivanje."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Dodirnite za otvaranje izbornika aplikacije"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Dodirnite za prikaz više aplikacija zajedno"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Vratite se na cijeli zaslon iz izbornika aplikacije"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Gledajte i učinite više"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Povucite drugu aplikaciju unutra da biste podijelili zaslon"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvaput dodirnite izvan aplikacije da biste je premjestili"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Upravljanje prozorima"</string>
     <string name="close_text" msgid="4986518933445178928">"Zatvorite"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zatvorite izbornik"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otvaranje izbornika"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimalno povećaj zaslon"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Izradi snimku zaslona"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Nije moguće promijeniti veličinu aplikacije"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikacija se ne može premjestiti ovdje"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimiziraj"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Poravnaj lijevo"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Poravnaj desno"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml
index aaa4e26..7c90a19 100644
--- a/libs/WindowManager/Shell/res/values-hu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hu/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamerával kapcsolatos problémába ütközött?\nKoppintson a megoldáshoz."</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nem sikerült a hiba kijavítása?\nKoppintson a visszaállításhoz."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nincsenek problémái kamerával? Koppintson az elvetéshez."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Koppintson az alkalmazásmenü megnyitásához"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Koppintson több alkalmazás együttes megjelenítéséhez"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"A teljes képernyőre az alkalmazásmenüben térhet vissza"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Több mindent láthat és tehet"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Húzzon ide egy másik alkalmazást az osztott képernyő használatához"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Koppintson duplán az alkalmazáson kívül az áthelyezéséhez"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Ablakok kezelése"</string>
     <string name="close_text" msgid="4986518933445178928">"Bezárás"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Menü bezárása"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menü megnyitása"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Képernyő méretének maximalizálása"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Igazodás a képernyő adott részéhez"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Ezt az alkalmazást nem lehet átméretezni"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Az alkalmazás nem helyezhető át ide"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Teljes méret"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Balra igazítás"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Jobbra igazítás"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml
index cd21faa..e8ed4ac 100644
--- a/libs/WindowManager/Shell/res/values-hy/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hy/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Տեսախցիկի հետ կապված խնդիրնե՞ր կան։\nՀպեք՝ վերակարգավորելու համար։"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Չհաջողվե՞ց շտկել։\nՀպեք՝ փոփոխությունները չեղարկելու համար։"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Տեսախցիկի հետ կապված խնդիրներ չկա՞ն։ Փակելու համար հպեք։"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Հպեք՝ հավելվածի ընտրացանկը բացելու համար"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Հպեք՝ էկրանին մի քանի հավելված միասին դիտելու համար"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Հավելվածի ընտրացանկից վերադառնալ լիաէկրան ռեժիմ"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Միաժամանակ կատարեք մի քանի առաջադրանք"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Քաշեք մյուս հավելվածի մեջ՝ էկրանի տրոհումն օգտագործելու համար"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Կրկնակի հպեք հավելվածի կողքին՝ այն տեղափոխելու համար"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Կառավարել պատուհանները"</string>
     <string name="close_text" msgid="4986518933445178928">"Փակել"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Փակել ընտրացանկը"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Բացել ընտրացանկը"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ծավալել էկրանը"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ծալել էկրանը"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Այս հավելվածի չափը հնարավոր չէ փոխել"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Հավելվածը հնարավոր չէ տեղափոխել այստեղ"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Ծավալել"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ամրացնել ձախ կողմում"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ամրացնել աջ կողմում"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml
index ba0683d..06b1634 100644
--- a/libs/WindowManager/Shell/res/values-in/strings.xml
+++ b/libs/WindowManager/Shell/res/values-in/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Masalah kamera?\nKetuk untuk memperbaiki"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tidak dapat diperbaiki?\nKetuk untuk mengembalikan"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tidak ada masalah kamera? Ketuk untuk menutup."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Ketuk untuk membuka menu aplikasi"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Ketuk untuk menampilkan beberapa aplikasi secara bersamaan"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Kembali ke layar penuh dari menu aplikasi"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Lihat dan lakukan lebih banyak hal"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Tarik aplikasi lain untuk menggunakan layar terpisah"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Ketuk dua kali di luar aplikasi untuk mengubah posisinya"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Kelola Jendela"</string>
     <string name="close_text" msgid="4986518933445178928">"Tutup"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Tutup Menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Buka Menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Perbesar Layar"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Gabungkan Layar"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Ukuran aplikasi ini tidak dapat diubah"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikasi tidak dapat dipindahkan ke sini"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimalkan"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Maksimalkan ke kiri"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Maksimalkan ke kanan"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml
index b427eaf..2d44777 100644
--- a/libs/WindowManager/Shell/res/values-is/strings.xml
+++ b/libs/WindowManager/Shell/res/values-is/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Myndavélavesen?\nÝttu til að breyta stærð"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ennþá vesen?\nÝttu til að afturkalla"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ekkert myndavélavesen? Ýttu til að hunsa."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Ýttu til að opna forritavalmyndina"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Ýttu til að sjá mörg forrit saman"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Opnaðu allan skjáinn aftur á forritavalmyndinni"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Sjáðu og gerðu meira"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Dragðu annað forrit inn til að nota skjáskiptingu"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Ýttu tvisvar utan við forrit til að færa það"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Stjórna gluggum"</string>
     <string name="close_text" msgid="4986518933445178928">"Loka"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Loka valmynd"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Opna valmynd"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Stækka skjá"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Smelluskjár"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Ekki er hægt að breyta stærð þessa forrits"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Ekki er hægt að færa forritið hingað"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Stækka"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Smella til vinstri"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Smella til hægri"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml
index 9eb9d4e..b564245 100644
--- a/libs/WindowManager/Shell/res/values-it/strings.xml
+++ b/libs/WindowManager/Shell/res/values-it/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi con la fotocamera?\nTocca per risolverli"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Il problema non si è risolto?\nTocca per ripristinare"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nessun problema con la fotocamera? Tocca per ignorare."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tocca per aprire il menu dell\'app"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tocca per mostrare più app insieme"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Torna allo schermo intero dal menu dell\'app"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Visualizza più contenuti e fai di più"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Trascina in un\'altra app per usare lo schermo diviso"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Tocca due volte fuori da un\'app per riposizionarla"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Gestisci finestre"</string>
     <string name="close_text" msgid="4986518933445178928">"Chiudi"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Chiudi il menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Apri il menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Massimizza schermo"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Aggancia schermo"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Non è possibile ridimensionare questa app"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Impossibile spostare l\'app qui"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Ingrandisci"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Aggancia a sinistra"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Aggancia a destra"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml
index 3e82198..fa07263 100644
--- a/libs/WindowManager/Shell/res/values-iw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-iw/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"בעיות במצלמה?\nאפשר להקיש כדי לבצע התאמה מחדש"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"הבעיה לא נפתרה?\nאפשר להקיש כדי לחזור לגרסה הקודמת"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"אין בעיות במצלמה? אפשר להקיש כדי לסגור."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"צריך להקיש כדי לפתוח את תפריט האפליקציה"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"אפשר להקיש כדי להציג כמה אפליקציות יחד"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"חזרה למסך מלא מתפריט האפליקציה"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"רוצה לראות ולעשות יותר?"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"צריך לגרור אפליקציה אחרת כדי להשתמש במסך המפוצל"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"צריך להקיש הקשה כפולה מחוץ לאפליקציה כדי למקם אותה מחדש"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"ניהול החלונות"</string>
     <string name="close_text" msgid="4986518933445178928">"סגירה"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"סגירת התפריט"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"פתיחת התפריט"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"הגדלת המסך"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"כיווץ המסך"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"לא ניתן לשנות את גודל החלון של האפליקציה הזו"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"לא ניתן להעביר את האפליקציה לכאן"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"הגדלה"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"הצמדה לשמאל"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"הצמדה לימין"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml
index 5d8dc5e..91667c0 100644
--- a/libs/WindowManager/Shell/res/values-ja/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ja/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"カメラに関する問題の場合は、\nタップすると修正できます"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"修正されなかった場合は、\nタップすると元に戻ります"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"カメラに関する問題でない場合は、タップすると閉じます。"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"タップするとアプリメニューが開きます"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"タップすると複数のアプリが同時に表示されます"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"アプリメニューから全画面表示に戻ります"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"表示を拡大して機能を強化"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"分割画面にするにはもう 1 つのアプリをドラッグしてください"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"位置を変えるにはアプリの外側をダブルタップしてください"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"ウィンドウを管理する"</string>
     <string name="close_text" msgid="4986518933445178928">"閉じる"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"メニューを閉じる"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"メニューを開く"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"画面の最大化"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"画面のスナップ"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"このアプリはサイズ変更できません"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"アプリはここに移動できません"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"最大化"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"左にスナップ"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"右にスナップ"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml
index de08b9c..2208348 100644
--- a/libs/WindowManager/Shell/res/values-ka/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ka/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"კამერად პრობლემები აქვს?\nშეეხეთ გამოსასწორებლად"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"არ გამოსწორდა?\nშეეხეთ წინა ვერსიის დასაბრუნებლად"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"კამერას პრობლემები არ აქვს? შეეხეთ უარყოფისთვის."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"შეეხეთ აპის მენიუს გასახსნელად"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"შეეხეთ რამდენიმე აპის ერთად საჩვენებლად"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"სრულეკრანიან რეჟიმზე დაბრუნდით აპის მენიუდან"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"მეტის ნახვა და გაკეთება"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ეკრანის გასაყოფად ჩავლებით გადაიტანეთ სხვა აპში"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ორმაგად შეეხეთ აპის გარშემო სივრცეს, რათა ის სხვაგან გადაიტანოთ"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"ფანჯრების მართვა"</string>
     <string name="close_text" msgid="4986518933445178928">"დახურვა"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"მენიუს დახურვა"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"მენიუს გახსნა"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"აპლიკაციის გაშლა სრულ ეკრანზე"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"აპლიკაციის დაპატარავება ეკრანზე"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"აპის ზომის შეცვლა შეუძლებელია"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"აპის აქ გადატანა შეუძლებელია"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"მაქსიმალურად გაშლა"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"მარცხნივ გადატანა"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"მარჯვნივ გადატანა"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml
index dd4e5c9..416a84c 100644
--- a/libs/WindowManager/Shell/res/values-kk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kk/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерада қателер шықты ма?\nЖөндеу үшін түртіңіз."</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Жөнделмеді ме?\nҚайтару үшін түртіңіз."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада қателер шықпады ма? Жабу үшін түртіңіз."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Қолданба мәзірін ашу үшін түртіңіз"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Бірнеше қолданбаны қатар көрсету үшін түртіңіз"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Қолданба мәзірінен толық экран режиміне қайту"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Қосымша ақпаратты қарап, әрекеттер жасау"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Экранды бөлу үшін басқа қолданбаға өтіңіз."</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Қолданбаның орнын өзгерту үшін одан тыс жерді екі рет түртіңіз."</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Терезелерді басқару"</string>
     <string name="close_text" msgid="4986518933445178928">"Жабу"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Мәзірді жабу"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Мәзірді ашу"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Экранды ұлғайту"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Экранды бөлу"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Бұл қолданбаның өлшемі өзгертілмейді."</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Қолданба бұл жерге қойылмайды."</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Жаю"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Солға тіркеу"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Оңға тіркеу"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml
index 96fe62e..b074d65 100644
--- a/libs/WindowManager/Shell/res/values-km/strings.xml
+++ b/libs/WindowManager/Shell/res/values-km/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"មានបញ្ហា​ពាក់ព័ន្ធនឹង​កាមេរ៉ាឬ?\nចុចដើម្បី​ដោះស្រាយ"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"មិនបាន​ដោះស្រាយ​បញ្ហានេះទេឬ?\nចុចដើម្បី​ត្រឡប់"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"មិនមាន​បញ្ហាពាក់ព័ន្ធនឹង​កាមេរ៉ាទេឬ? ចុចដើម្បី​ច្រានចោល។"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ចុច​ដើម្បីបើក​ម៉ឺនុយ​កម្មវិធី"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"ចុច​ដើម្បីបង្ហាញ​កម្មវិធី​ច្រើនរួមគ្នា"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ត្រឡប់ទៅ​អេក្រង់​ពេញវិញ​ពីម៉ឺនុយ​កម្មវិធី"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"មើលឃើញ និងធ្វើបានកាន់តែច្រើន"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"អូស​កម្មវិធី​មួយ​ទៀត​ចូល ដើម្បី​ប្រើ​មុខងារ​បំបែកអេក្រង់"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ចុចពីរដង​នៅ​ក្រៅ​កម្មវិធី ដើម្បី​ប្ដូរ​ទីតាំង​កម្មវិធី​នោះ"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"គ្រប់គ្រង​វិនដូ"</string>
     <string name="close_text" msgid="4986518933445178928">"បិទ"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"បិទ​ម៉ឺនុយ"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"បើកម៉ឺនុយ"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ពង្រីកអេក្រង់"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ថតអេក្រង់"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"មិនអាចប្ដូរទំហំ​កម្មវិធីនេះ​បានទេ"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"មិនអាចផ្លាស់ទីកម្មវិធីមកទីនេះបានទេ"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ពង្រីក"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ផ្លាស់ទីទៅឆ្វេង"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ផ្លាស់ទីទៅស្ដាំ"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml
index b38f744..9c22241 100644
--- a/libs/WindowManager/Shell/res/values-kn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kn/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ಕ್ಯಾಮರಾ ಸಮಸ್ಯೆಗಳಿವೆಯೇ?\nಮರುಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ಅದನ್ನು ಸರಿಪಡಿಸಲಿಲ್ಲವೇ?\nಹಿಂತಿರುಗಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ಕ್ಯಾಮರಾ ಸಮಸ್ಯೆಗಳಿಲ್ಲವೇ? ವಜಾಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ಆ್ಯಪ್‌ ಮೆನುವನ್ನು ತೆರೆಯಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"ಅನೇಕ ಆ್ಯಪ್‌ಗಳನ್ನು ಒಟ್ಟಿಗೆ ತೋರಿಸಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ಆ್ಯಪ್‌ ಮೆನುವಿನಿಂದ ಫುಲ್‌ಸ್ಕ್ರೀನ್‌ಗೆ ಹಿಂತಿರುಗಿ"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ನೋಡಿ ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ಮಾಡಿ"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ಸ್ಪ್ಲಿಟ್‌ ಸ್ಕ್ರೀನ್‌ಗಾಗಿ ಮತ್ತೊಂದು ಆ್ಯಪ್‌ನಲ್ಲಿ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ಆ್ಯಪ್ ಒಂದರ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸಲು ಅದರ ಹೊರಗೆ ಡಬಲ್-ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"ವಿಂಡೋಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
     <string name="close_text" msgid="4986518933445178928">"ಮುಚ್ಚಿ"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"ಮೆನು ಮುಚ್ಚಿ"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"ಮೆನು ತೆರೆಯಿರಿ"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ಸ್ಕ್ರೀನ್ ಅನ್ನು ಮ್ಯಾಕ್ಸಿಮೈಸ್ ಮಾಡಿ"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ಸ್ನ್ಯಾಪ್ ಸ್ಕ್ರೀನ್"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ಈ ಆ್ಯಪ್ ಅನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ಆ್ಯಪ್ ಅನ್ನು ಇಲ್ಲಿಗೆ ಸರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ಮ್ಯಾಕ್ಸಿಮೈಸ್ ಮಾಡಿ"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ಎಡಕ್ಕೆ ಸ್ನ್ಯಾಪ್ ಮಾಡಿ"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ಬಲಕ್ಕೆ ಸ್ನ್ಯಾಪ್ ಮಾಡಿ"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml
index 421d466..58dd6f8 100644
--- a/libs/WindowManager/Shell/res/values-ko/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ko/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"카메라 문제가 있나요?\n해결하려면 탭하세요."</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"해결되지 않았나요?\n되돌리려면 탭하세요."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"카메라에 문제가 없나요? 닫으려면 탭하세요."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"탭하여 앱 메뉴 열기"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"탭하여 여러 앱을 함께 표시하기"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"앱 메뉴에서 전체 화면으로 돌아가기"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"더 많은 정보를 보고 더 많은 작업을 처리하세요"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"화면 분할을 사용하려면 다른 앱을 드래그해 가져옵니다."</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"앱 위치를 조정하려면 앱 외부를 두 번 탭합니다."</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"창 관리"</string>
     <string name="close_text" msgid="4986518933445178928">"닫기"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"메뉴 닫기"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"메뉴 열기"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"화면 최대화"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"화면 분할"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"이 앱은 크기를 조절할 수 없습니다."</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"앱을 여기로 이동할 수 없음"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"최대화하기"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"왼쪽으로 맞추기"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"오른쪽으로 맞추기"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml
index abafd7a..75feede 100644
--- a/libs/WindowManager/Shell/res/values-ky/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ky/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерада маселелер келип чыктыбы?\nОңдоо үчүн таптаңыз"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Оңдолгон жокпу?\nАртка кайтаруу үчүн таптаңыз"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада маселе жокпу? Этибарга албоо үчүн таптаңыз."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Колдонмонун менюсун ачуу үчүн таптап коюңуз"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Бир нече колдонмону чогуу көрүү үчүн таптап коюңуз"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Колдонмонун менюсунан толук экранга кайтыңыз"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Көрүп, көбүрөөк нерселерди жасаңыз"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Экранды бөлүү үчүн башка колдонмону сүйрөңүз"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Колдонмону жылдыруу үчүн сырт жагын эки жолу таптаңыз"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Терезелерди тескөө"</string>
     <string name="close_text" msgid="4986518933445178928">"Жабуу"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Менюну жабуу"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Менюну ачуу"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Экранды чоңойтуу"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Экранды сүрөткө тартып алуу"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Бул колдонмонун өлчөмүн өзгөртүүгө болбойт"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Колдонмону бул жерге жылдырууга болбойт"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Чоңойтуу"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Солго жылдыруу"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Оңго жылдыруу"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml
index 5bc5316..8f28504 100644
--- a/libs/WindowManager/Shell/res/values-lo/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lo/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ມີບັນຫາກ້ອງຖ່າຍຮູບບໍ?\nແຕະເພື່ອປັບໃໝ່"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ບໍ່ໄດ້ແກ້ໄຂມັນບໍ?\nແຕະເພື່ອແປງກັບຄືນ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ບໍ່ມີບັນຫາກ້ອງຖ່າຍຮູບບໍ? ແຕະເພື່ອ​ປິດ​ໄວ້."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ແຕະເພື່ອເປີດເມນູແອັບ"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"ແຕະເພື່ອສະແດງແອັບຫຼາຍລາຍການພ້ອມກັນ"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ກັບຄືນໄປຫາໂໝດເຕັມຈໍຈາກເມນູແອັບ"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ເບິ່ງ ແລະ ເຮັດຫຼາຍຂຶ້ນ"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ລາກໄປໄວ້ໃນແອັບອື່ນເພື່ອແບ່ງໜ້າຈໍ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ແຕະສອງເທື່ອໃສ່ນອກແອັບໃດໜຶ່ງເພື່ອຈັດຕຳແໜ່ງຂອງມັນຄືນໃໝ່"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"ຈັດການໜ້າຈໍ"</string>
     <string name="close_text" msgid="4986518933445178928">"ປິດ"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"ປິດເມນູ"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"ເປີດເມນູ"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ປັບຈໍໃຫຍ່ສຸດ"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ສະແນັບໜ້າຈໍ"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ບໍ່ສາມາດປັບຂະໜາດແອັບນີ້ໄດ້"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ບໍ່ສາມາດຍ້າຍແອັບມາບ່ອນນີ້ໄດ້"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ຂະຫຍາຍໃຫຍ່ສຸດ"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ແນບຊ້າຍ"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ແນບຂວາ"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml
index 01a72ee..b97b878 100644
--- a/libs/WindowManager/Shell/res/values-lt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lt/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Iškilo problemų dėl kameros?\nPalieskite, kad pritaikytumėte iš naujo"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepavyko pataisyti?\nPalieskite, kad grąžintumėte"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nėra jokių problemų dėl kameros? Palieskite, kad atsisakytumėte."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Palieskite, kad atidarytumėte programos meniu"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Palieskite, kad būtų rodomos kelios programos kartu"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Grįžkite į viso ekrano režimą iš programos meniu"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Daugiau turinio ir funkcijų"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Vilkite kitoje programoje, kad galėtumėte naudoti išskaidyto ekrano režimą"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dukart palieskite už programos ribų, kad pakeistumėte jos poziciją"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Tvarkyti langus"</string>
     <string name="close_text" msgid="4986518933445178928">"Uždaryti"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Uždaryti meniu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Atidaryti meniu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Išskleisti ekraną"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Sutraukti ekraną"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Negalima keisti šios programos dydžio"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Programos negalima perkelti čia"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Padidinti"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Pritraukti kairėje"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Pritraukti dešinėje"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml
index 2f235ba..de200d8 100644
--- a/libs/WindowManager/Shell/res/values-lv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lv/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Vai ir problēmas ar kameru?\nPieskarieties, lai tās novērstu."</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Vai problēma netika novērsta?\nPieskarieties, lai atjaunotu."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Vai nav problēmu ar kameru? Pieskarieties, lai nerādītu."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Lai atvērtu lietotnes izvēlni, pieskarieties."</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Lai parādītu vairākas lietotnes kopā, pieskarieties."</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Varat atgriezties pilnekrāna režīmā no lietotnes izvēlnes."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Uzziniet un paveiciet vairāk"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Lai izmantotu sadalītu ekrānu, ievelciet vēl vienu lietotni"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Lai pārvietotu lietotni, veiciet dubultskārienu ārpus lietotnes"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Pārvaldīt logus"</string>
     <string name="close_text" msgid="4986518933445178928">"Aizvērt"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Aizvērt izvēlni"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Atvērt izvēlni"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimizēt ekrānu"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Fiksēt ekrānu"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Šīs lietotnes loga lielumu nevar mainīt."</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Lietotni nevar pārvietot šeit."</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimizēt"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Piestiprināt pa kreisi"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Piestiprināt pa labi"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml
index e58d8fc..4922d04 100644
--- a/libs/WindowManager/Shell/res/values-mk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mk/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблеми со камерата?\nДопрете за да се совпадне повторно"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не се поправи?\nДопрете за враќање"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нема проблеми со камерата? Допрете за отфрлање."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Допрете за да го отворите менито со апликации"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Допрете за да се прикажат повеќе апликации заедно"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Вратете се на цел екран од менито со апликации"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Погледнете и направете повеќе"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Повлечете друга апликација за поделен екран"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Допрете двапати надвор од некоја апликација за да ја преместите"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Управувајте со прозорци"</string>
     <string name="close_text" msgid="4986518933445178928">"Затворете"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Затворете го менито"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Отвори го менито"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Максимизирај го екранот"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Подели го екранот на половина"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Не може да се промени големината на апликацијава"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Апликацијата не може да се премести овде"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Максимизирај"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Фотографирај лево"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Фотографирај десно"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml
index d51c3fb..61277d6 100644
--- a/libs/WindowManager/Shell/res/values-ml/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ml/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ക്യാമറ പ്രശ്നങ്ങളുണ്ടോ?\nശരിയാക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"അത് പരിഹരിച്ചില്ലേ?\nപുനഃസ്ഥാപിക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ക്യാമറാ പ്രശ്നങ്ങളൊന്നുമില്ലേ? നിരസിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ആപ്പ് മെനു തുറക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"ഒന്നിലധികം ആപ്പുകൾ ഒരുമിച്ച് കാണിക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ആപ്പ് മെനുവിൽ നിന്ന് പൂർണ്ണസ്‌ക്രീനിലേക്ക് മടങ്ങുക"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"കൂടുതൽ കാണുക, ചെയ്യുക"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"സ്‌ക്രീൻ വിഭജന മോഡിന്, മറ്റൊരു ആപ്പ് വലിച്ചിടുക"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ആപ്പിന്റെ സ്ഥാനം മാറ്റാൻ അതിന് പുറത്ത് ഡബിൾ ടാപ്പ് ചെയ്യുക"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"വിൻഡോകൾ മാനേജ് ചെയ്യുക"</string>
     <string name="close_text" msgid="4986518933445178928">"അടയ്ക്കുക"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"മെനു അടയ്ക്കുക"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"മെനു തുറക്കുക"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"സ്‌ക്രീൻ വലുതാക്കുക"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"സ്‌ക്രീൻ സ്‌നാപ്പ് ചെയ്യുക"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ഈ ആപ്പിന്റെ വലുപ്പം മാറ്റാനാകില്ല"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ആപ്പ് ഇവിടേക്ക് നീക്കാനാകില്ല"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"വലുതാക്കുക"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ഇടതുവശത്തേക്ക് സ്‌നാപ്പ് ചെയ്യുക"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"വലതുവശത്തേക്ക് സ്‌നാപ്പ് ചെയ്യുക"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml
index f7e6a6c..2b313a2 100644
--- a/libs/WindowManager/Shell/res/values-mn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mn/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерын асуудал гарсан уу?\nДахин тааруулахын тулд товшино уу"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Үүнийг засаагүй юу?\nБуцаахын тулд товшино уу"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерын асуудал байхгүй юу? Хаахын тулд товшино уу."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Аппын цэсийг нээхийн тулд товшино уу"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Олон аппыг хамтад нь харуулахын товшино уу"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Аппын цэсээс бүтэн дэлгэц рүү буцна уу"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Харж илүү ихийг хий"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Дэлгэц хуваах горимд ашиглахын тулд өөр аппыг чирнэ үү"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Аппыг дахин байрлуулахын тулд гадна талд нь хоёр товшино"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Windows-г удирдах"</string>
     <string name="close_text" msgid="4986518933445178928">"Хаах"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Цэсийг хаах"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Цэсийг нээх"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Дэлгэцийг томруулах"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Дэлгэцийг таллах"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Энэ аппын хэмжээг өөрчлөх боломжгүй"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Аппыг ийш зөөх боломжгүй"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Томруулах"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Зүүн тийш зэрэгцүүлэх"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Баруун тийш зэрэгцүүлэх"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml
index 4832284..9778dcd 100644
--- a/libs/WindowManager/Shell/res/values-mr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mr/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"कॅमेराशी संबंधित काही समस्या आहेत का?\nपुन्हा फिट करण्यासाठी टॅप करा"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"निराकरण झाले नाही?\nरिव्हर्ट करण्यासाठी कृपया टॅप करा"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"कॅमेराशी संबंधित कोणत्याही समस्या नाहीत का? डिसमिस करण्‍यासाठी टॅप करा."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"अ‍ॅप मेनू उघडण्यासाठी टॅप करा"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"एकाहून अधिक ॲप्स एकत्र दाखवण्यासाठी टॅप करा"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ॲप मेनूमधून फुलस्क्रीनवर परत या"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"पहा आणि आणखी बरेच काही करा"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"स्प्लिट स्क्रीन वापरण्यासाठी दुसरे ॲप ड्रॅग करा"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ॲपची स्थिती पुन्हा बदलण्यासाठी, त्याच्या बाहेर दोनदा टॅप करा"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"विंडो व्यवस्थापित करा"</string>
     <string name="close_text" msgid="4986518933445178928">"बंद करा"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"मेनू बंद करा"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"मेनू उघडा"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"स्क्रीन मोठी करा"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"स्क्रीन स्नॅप करा"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"या अ‍ॅपचा आकार बदलला जाऊ शकत नाही"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"अ‍ॅप इथे हलवू शकत नाही"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"मोठे करा"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"डावीकडे स्नॅप करा"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"उजवीकडे स्नॅप करा"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml
index e510d72..0ee4396 100644
--- a/libs/WindowManager/Shell/res/values-ms/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ms/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Isu kamera?\nKetik untuk memuatkan semula"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Isu tidak dibetulkan?\nKetik untuk kembali"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tiada isu kamera? Ketik untuk mengetepikan."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Ketik untuk membuka menu apl"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Ketik untuk memaparkan berbilang apl serentak"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Kembali kepada skrin penuh daripada menu apl"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Lihat dan lakukan lebih"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Seret masuk apl lain untuk menggunakan skrin pisah"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Ketik dua kali di luar apl untuk menempatkan semula apl itu"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Urus Tetingkap"</string>
     <string name="close_text" msgid="4986518933445178928">"Tutup"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Tutup Menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Buka Menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimumkan Skrin"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Tangkap Skrin"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Apl ini tidak boleh diubah saiz"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Apl tidak boleh dialihkan ke sini"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimumkan"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Autojajar ke kiri"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Autojajar ke kanan"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml
index aac6f84..57d0950 100644
--- a/libs/WindowManager/Shell/res/values-my/strings.xml
+++ b/libs/WindowManager/Shell/res/values-my/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ကင်မရာပြဿနာလား။\nပြင်ဆင်ရန် တို့ပါ"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ကောင်းမသွားဘူးလား။\nပြန်ပြောင်းရန် တို့ပါ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ကင်မရာပြဿနာ မရှိဘူးလား။ ပယ်ရန် တို့ပါ။"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"အက်ပ်မီနူးကိုဖွင့်ရန် တို့ပါ"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"အက်ပ်များစွာကို အတူတကွပြရန် တို့ပါ"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"အက်ပ်မီနူးမှ ဖန်သားပြင်အပြည့်သို့ ပြန်သွားပါ"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ကြည့်ပြီး ပိုမိုလုပ်ဆောင်ပါ"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"မျက်နှာပြင် ခွဲ၍ပြသခြင်းအတွက် အက်ပ်နောက်တစ်ခုကို ဖိဆွဲပါ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"နေရာပြန်ချရန် အက်ပ်အပြင်ဘက်ကို နှစ်ချက်တို့ပါ"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"ဝင်းဒိုးများ စီမံရန်"</string>
     <string name="close_text" msgid="4986518933445178928">"ပိတ်ရန်"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"မီနူး ပိတ်ရန်"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"မီနူး ဖွင့်ရန်"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"စခရင်ကို ချဲ့မည်"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"စခရင်ကို ချုံ့မည်"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ဤအက်ပ်ကို အရွယ်ပြင်၍ မရပါ"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"အက်ပ်ကို ဤနေရာသို့ ရွှေ့၍မရပါ"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ချဲ့ရန်"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ဘယ်တွင် ချဲ့ရန်"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ညာတွင် ချဲ့ရန်"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml
index 175133d..eb505ec 100644
--- a/libs/WindowManager/Shell/res/values-nb/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nb/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Har du kameraproblemer?\nTrykk for å tilpasse"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ble ikke problemet løst?\nTrykk for å gå tilbake"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen kameraproblemer? Trykk for å lukke."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Trykk for å åpne appmenyen"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Trykk for å vise flere apper sammen"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Gå tilbake til fullskjerm fra appmenyen"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Se og gjør mer"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Dra inn en annen app for å bruke delt skjerm"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dobbelttrykk utenfor en app for å flytte den"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Administrer vinduene"</string>
     <string name="close_text" msgid="4986518933445178928">"Lukk"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Lukk menyen"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Åpne menyen"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimer skjermen"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Fest skjermen"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Du kan ikke endre størrelse på denne appen"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Appen kan ikke flyttes hit"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimer"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Fest til venstre"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Fest til høyre"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml
index d3a7e12..47d66d5 100644
--- a/libs/WindowManager/Shell/res/values-ne/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ne/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"क्यामेरासम्बन्धी समस्या देखियो?\nसमस्या हल गर्न ट्याप गर्नुहोस्"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"समस्या हल भएन?\nपहिलेको जस्तै बनाउन ट्याप गर्नुहोस्"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्यामेरासम्बन्धी कुनै पनि समस्या छैन? खारेज गर्न ट्याप गर्नुहोस्।"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"एपको मेनु खोल्न ट्याप गर्नुहोस्"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"एकभन्दा बढी एपहरू सँगै देखाउन ट्याप गर्नुहोस्"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"एपको मेनुबाट फुल स्क्रिनमा फर्कनुहोस्"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"थप कुरा हेर्नुहोस् र गर्नुहोस्"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"स्प्लिट स्क्रिन मोड प्रयोग गर्न अर्को एप ड्रयाग एन्ड ड्रप गर्नुहोस्"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"तपाईं जुन एपको स्थिति मिलाउन चाहनुहुन्छ सोही एपको बाहिर डबल ट्याप गर्नुहोस्"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"विन्डोहरू व्यवस्थापन गर्नुहोस्"</string>
     <string name="close_text" msgid="4986518933445178928">"बन्द गर्नुहोस्"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"मेनु बन्द गर्नुहोस्"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"मेनु खोल्नुहोस्"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"स्क्रिन ठुलो बनाउनुहोस्"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"स्क्रिन स्न्याप गर्नुहोस्"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"यो एपको आकार बदल्न मिल्दैन"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"एप सारेर यहाँ ल्याउन सकिएन"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ठुलो बनाउनुहोस्"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"बायाँतिर स्न्याप गर्नुहोस्"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"दायाँतिर स्न्याप गर्नुहोस्"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml
index 747afe3..e3e3441 100644
--- a/libs/WindowManager/Shell/res/values-nl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nl/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Cameraproblemen?\nTik om opnieuw passend te maken."</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Is dit geen oplossing?\nTik om terug te zetten."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen cameraproblemen? Tik om te sluiten."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tik om het app-menu te openen"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tik om meerdere apps tegelijk te tonen"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Terug naar volledig scherm vanuit het app-menu"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Zie en doe meer"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Sleep een andere app hier naartoe om het scherm te splitsen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dubbeltik naast een app om deze opnieuw te positioneren"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Vensters beheren"</string>
     <string name="close_text" msgid="4986518933445178928">"Sluiten"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Menu sluiten"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menu openen"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Scherm maximaliseren"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Scherm halveren"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Het formaat van deze app kan niet worden aangepast"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Kan de app niet hierheen verplaatsen"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximaliseren"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Links uitlijnen"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Rechts uitlijnen"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml
index a5adcbe..baf009e 100644
--- a/libs/WindowManager/Shell/res/values-or/strings.xml
+++ b/libs/WindowManager/Shell/res/values-or/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"କ୍ୟାମେରାରେ ସମସ୍ୟା ଅଛି?\nପୁଣି ଫିଟ କରିବାକୁ ଟାପ କରନ୍ତୁ"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ଏହାର ସମାଧାନ ହୋଇନାହିଁ?\nଫେରିଯିବା ପାଇଁ ଟାପ କରନ୍ତୁ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"କ୍ୟାମେରାରେ କିଛି ସମସ୍ୟା ନାହିଁ? ଖାରଜ କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ଆପ ମେନୁ ଖୋଲିବାକୁ ଟାପ କରନ୍ତୁ"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"ଏକାଠି ଏକାଧିକ ଆପ୍ସ ଦେଖାଇବା ପାଇଁ ଟାପ କରନ୍ତୁ"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ଆପ ମେନୁରୁ ପୂର୍ଣ୍ଣସ୍କ୍ରିନକୁ ଫେରନ୍ତୁ"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ଦେଖନ୍ତୁ ଏବଂ ଆହୁରି ଅନେକ କିଛି କରନ୍ତୁ"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ପାଇଁ ଅନ୍ୟ ଏକ ଆପକୁ ଡ୍ରାଗ କରନ୍ତୁ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ଏକ ଆପକୁ ରିପୋଜିସନ କରିବା ପାଇଁ ଏହାର ବାହାରେ ଦୁଇଥର-ଟାପ କରନ୍ତୁ"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ"</string>
     <string name="close_text" msgid="4986518933445178928">"ବନ୍ଦ କରନ୍ତୁ"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"ମେନୁ ବନ୍ଦ କରନ୍ତୁ"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"ମେନୁ ଖୋଲନ୍ତୁ"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ସ୍କ୍ରିନକୁ ବଡ଼ କରନ୍ତୁ"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ସ୍କ୍ରିନକୁ ସ୍ନାପ କରନ୍ତୁ"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ଏହି ଆପକୁ ରିସାଇଜ କରାଯାଇପାରିବ ନାହିଁ"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ଆପକୁ ଏଠାକୁ ମୁଭ କରାଯାଇପାରିବ ନାହିଁ"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ବଡ଼ କରନ୍ତୁ"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ବାମରେ ସ୍ନାପ କରନ୍ତୁ"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ଡାହାଣରେ ସ୍ନାପ କରନ୍ତୁ"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml
index 5a4e61a..2c29c7f 100644
--- a/libs/WindowManager/Shell/res/values-pa/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pa/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ਕੀ ਕੈਮਰੇ ਸੰਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹਨ?\nਮੁੜ-ਫਿੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ਕੀ ਇਹ ਠੀਕ ਨਹੀਂ ਹੋਈ?\nਵਾਪਸ ਉਹੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ਕੀ ਕੈਮਰੇ ਸੰਬੰਧੀ ਕੋਈ ਸਮੱਸਿਆ ਨਹੀਂ ਹੈ? ਖਾਰਜ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ਐਪ ਮੀਨੂ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"ਕਈ ਐਪਾਂ ਇਕੱਠੀਆਂ ਦਿਖਾਉਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ਐਪ ਮੀਨੂ ਤੋਂ ਪੂਰੀ-ਸਕ੍ਰੀਨ ਮੋਡ \'ਤੇ ਵਾਪਸ ਜਾਓ"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ਦੇਖੋ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਕਰੋ"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੇ ਲਈ ਕਿਸੇ ਹੋਰ ਐਪ ਵਿੱਚ ਘਸੀਟੋ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ਕਿਸੇ ਐਪ ਦੀ ਜਗ੍ਹਾ ਬਦਲਣ ਲਈ ਉਸ ਦੇ ਬਾਹਰ ਡਬਲ ਟੈਪ ਕਰੋ"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"ਵਿੰਡੋਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
     <string name="close_text" msgid="4986518933445178928">"ਬੰਦ ਕਰੋ"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"ਮੀਨੂ ਬੰਦ ਕਰੋ"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"ਮੀਨੂ ਖੋਲ੍ਹੋ"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ਸਕ੍ਰੀਨ ਦਾ ਆਕਾਰ ਵਧਾਓ"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ਸਕ੍ਰੀਨ ਨੂੰ ਸਨੈਪ ਕਰੋ"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ਇਸ ਐਪ ਦਾ ਆਕਾਰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ਐਪ ਨੂੰ ਇੱਥੇ ਨਹੀਂ ਲਿਜਾਇਆ ਜਾ ਸਕਦਾ"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ਵੱਡਾ ਕਰੋ"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ਖੱਬੇ ਪਾਸੇ ਸਨੈਪ ਕਰੋ"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ਸੱਜੇ ਪਾਸੇ ਸਨੈਪ ਕਰੋ"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml
index a14bb99..1e7b1811 100644
--- a/libs/WindowManager/Shell/res/values-pl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pl/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemy z aparatem?\nKliknij, aby dopasować"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Naprawa się nie udała?\nKliknij, aby cofnąć"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Brak problemów z aparatem? Kliknij, aby zamknąć"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Kliknij, aby otworzyć menu aplikacji"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Kliknij, aby wyświetlić jednocześnie kilka aplikacji"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Wróć do trybu pełnoekranowego z menu aplikacji"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Zobacz i zrób więcej"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Aby podzielić ekran, przeciągnij drugą aplikację"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Kliknij dwukrotnie poza aplikacją, aby ją przenieść"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Zarządzaj oknami"</string>
     <string name="close_text" msgid="4986518933445178928">"Zamknij"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zamknij menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otwórz menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksymalizuj ekran"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Przyciągnij ekran"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Nie można zmienić rozmiaru tej aplikacji"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Nie można przenieść aplikacji tutaj"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksymalizuj"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Przyciągnij do lewej"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Przyciągnij do prawej"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
index 75c445c..7d728a0 100644
--- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmera?\nToque para ajustar o enquadramento"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toque para abrir o menu do app"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toque para mostrar vários apps juntos"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Volte para a tela cheia no menu do app"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Veja e faça mais"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arraste outro app para dividir a tela"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toque duas vezes fora de um app para reposicionar"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Gerenciar janelas"</string>
     <string name="close_text" msgid="4986518933445178928">"Fechar"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Abrir o menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ampliar tela"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajustar tela"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Não é possível redimensionar o app"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Não é possível mover o app para cá"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizar"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ajustar à esquerda"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ajustar à direita"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
index 1d31d0d..752fd6f 100644
--- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmara?\nToque aqui para reajustar"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Não foi corrigido?\nToque para reverter"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nenhum problema com a câmara? Toque para ignorar."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toque para abrir o menu de apps"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toque para mostrar várias apps em conjunto"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Regresse ao ecrã inteiro a partir do menu de apps"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Veja e faça mais"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arraste outra app para usar o ecrã dividido"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toque duas vezes fora de uma app para a reposicionar"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Faça a gestão das janelas"</string>
     <string name="close_text" msgid="4986518933445178928">"Fechar"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Abrir menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizar ecrã"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Encaixar ecrã"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Não é possível redimensionar esta app"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Não é possível mover a app para aqui"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizar"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Encaixar à esquerda"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Encaixar à direita"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml
index 75c445c..7d728a0 100644
--- a/libs/WindowManager/Shell/res/values-pt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmera?\nToque para ajustar o enquadramento"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toque para abrir o menu do app"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toque para mostrar vários apps juntos"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Volte para a tela cheia no menu do app"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Veja e faça mais"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arraste outro app para dividir a tela"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toque duas vezes fora de um app para reposicionar"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Gerenciar janelas"</string>
     <string name="close_text" msgid="4986518933445178928">"Fechar"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Abrir o menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ampliar tela"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajustar tela"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Não é possível redimensionar o app"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Não é possível mover o app para cá"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizar"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ajustar à esquerda"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ajustar à direita"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml
index 3c763ea..3985d9b 100644
--- a/libs/WindowManager/Shell/res/values-ro/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ro/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Ai probleme cu camera foto?\nAtinge pentru a reîncadra"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nu ai remediat problema?\nAtinge pentru a reveni"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nu ai probleme cu camera foto? Atinge pentru a închide."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Atinge pentru a deschide meniul aplicației"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Atinge pentru a afișa mai multe aplicații împreună"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Revino la ecranul complet din meniul aplicației"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Vezi și fă mai multe"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Trage în altă aplicație pentru a folosi ecranul împărțit"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Atinge de două ori lângă o aplicație pentru a o repoziționa"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Gestionează ferestrele"</string>
     <string name="close_text" msgid="4986518933445178928">"Închide"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Închide meniul"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Deschide meniul"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizează fereastra"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Micșorează fereastra și fixeaz-o"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Aplicația nu poate fi redimensionată"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplicația nu poate fi mutată aici"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizează"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Trage la stânga"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Trage la dreapta"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml
index a6c20ad..58a196b 100644
--- a/libs/WindowManager/Shell/res/values-ru/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ru/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблемы с камерой?\nНажмите, чтобы исправить."</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не помогло?\nНажмите, чтобы отменить изменения."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нет проблем с камерой? Нажмите, чтобы закрыть."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Нажмите, чтобы открыть меню приложения"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Нажмите, чтобы на экране размещались сразу несколько приложений"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Вернуться из меню приложения в режим полного экрана"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Выполняйте несколько задач одновременно"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Перетащите сюда другое приложение, чтобы использовать разделение экрана."</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Чтобы переместить приложение, дважды нажмите рядом с ним."</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Управление окнами"</string>
     <string name="close_text" msgid="4986518933445178928">"Закрыть"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Закрыть меню"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Открыть меню"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Развернуть на весь экран"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Свернуть"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Изменить размер приложения нельзя."</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Приложение нельзя сюда переместить"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Развернуть"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Привязать слева"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Привязать справа"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml
index ed76269..6682b01 100644
--- a/libs/WindowManager/Shell/res/values-si/strings.xml
+++ b/libs/WindowManager/Shell/res/values-si/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"කැමරා ගැටලුද?\nයළි සවි කිරීමට තට්ටු කරන්න"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"එය විසඳුවේ නැතිද?\nප්‍රතිවර්තනය කිරීමට තට්ටු කරන්න"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"කැමරා ගැටලු නොමැතිද? ඉවත දැමීමට තට්ටු කරන්න"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"යෙදුම් මෙනුව විවෘත කිරීමට තට්ටු කරන්න"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"යෙදුම් කිහිපයක් එකට පෙන්වීමට තට්ටු කරන්න"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"යෙදුම් මෙනුවෙන් පූර්ණ තිරය වෙත ආපසු යන්න"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"බලන්න සහ තවත් දේ කරන්න"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"බෙදුම් තිරය සඳහා වෙනත් යෙදුමකට අදින්න"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"යෙදුමක් නැවත ස්ථානගත කිරීමට පිටතින් දෙවරක් තට්ටු කරන්න"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"කවුළු කළමනාකරණය කරන්න"</string>
     <string name="close_text" msgid="4986518933445178928">"වසන්න"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"මෙනුව වසන්න"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"මෙනුව විවෘත කරන්න"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"තිරය උපරිම කරන්න"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ස්නැප් තිරය"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"මෙම යෙදුම ප්‍රතිප්‍රමාණ කළ නොහැක"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"යෙදුම මෙතැනට ගෙන යා නොහැක"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"විහිදන්න"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"වමට ස්නැප් කරන්න"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"දකුණට ස්නැප් කරන්න"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml
index 529a693..96e54f1 100644
--- a/libs/WindowManager/Shell/res/values-sk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sk/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problémy s kamerou?\nKlepnutím znova upravte."</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nevyriešilo sa to?\nKlepnutím sa vráťte."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemáte problémy s kamerou? Klepnutím zatvoríte."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Klepnúť a otvoriť tak ponuku aplikácií"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Klepnúť a zobraziť tak viacero aplikácií naraz"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Prejsť späť na celú obrazovku z ponuky aplikácií"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Zobrazte si a zvládnite toho viac"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Rozdelenú obrazovku môžete použiť presunutím do inej aplikácie"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvojitým klepnutím mimo aplikácie zmeníte jej pozíciu"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Správa okien"</string>
     <string name="close_text" msgid="4986518933445178928">"Zavrieť"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zavrieť ponuku"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otvoriť ponuku"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximalizovať obrazovku"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Zobraziť polovicu obrazovky"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Veľkosť tejto aplikácie sa nedá zmeniť"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikácia sa sem nedá presunúť"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximalizovať"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Prichytiť vľavo"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Prichytiť vpravo"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml
index fe08e04..66c9b26 100644
--- a/libs/WindowManager/Shell/res/values-sl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sl/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Težave s fotoaparatom?\nDotaknite se za vnovično prilagoditev"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"To ni odpravilo težave?\nDotaknite se za povrnitev"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nimate težav s fotoaparatom? Dotaknite se za opustitev."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Dotaknite se, če želite odpreti meni aplikacije"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Dotaknite se, če želite prikazati več aplikacij hkrati"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Nazaj v celozaslonski način iz menija aplikacije"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Oglejte si in naredite več"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Za razdeljeni zaslon povlecite sem še eno aplikacijo."</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvakrat se dotaknite zunaj aplikacije, če jo želite prestaviti."</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Upravljanje oken"</string>
     <string name="close_text" msgid="4986518933445178928">"Zapri"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zapri meni"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Odpri meni"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimiraj zaslon"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Pripni zaslon"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Velikosti te aplikacije ni mogoče spremeniti"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikacije ni mogoče premakniti sem"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimiraj"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Pripni levo"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Pripni desno"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml
index a4a7e74..6e49999 100644
--- a/libs/WindowManager/Shell/res/values-sq/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sq/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Ka probleme me kamerën?\nTrokit për ta ripërshtatur"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nuk u rregullua?\nTrokit për ta rikthyer"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nuk ka probleme me kamerën? Trokit për ta shpërfillur."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Trokit për të hapur menynë e aplikacionit"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Trokit për të shfaqur disa aplikacone bashkë"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Kthehu tek ekrani i plotë nga menyja e aplikacionit"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Shiko dhe bëj më shumë"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Zvarrite në një aplikacion tjetër për ekranin e ndarë"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Trokit dy herë jashtë një aplikacioni për ta ripozicionuar"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Menaxho dritaret"</string>
     <string name="close_text" msgid="4986518933445178928">"Mbyll"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Mbyll menynë"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Hap menynë"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimizo ekranin"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Regjistro ekranin"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Përmasat e këtij aplikacioni nuk mund të ndryshohen"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikacioni nuk mund të zhvendoset këtu"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimizo"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Zhvendos majtas"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Zhvendos djathtas"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml
index 9545ccf..bd2fb8c 100644
--- a/libs/WindowManager/Shell/res/values-sr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sr/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Имате проблема са камером?\nДодирните да бисте поново уклопили"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблем није решен?\nДодирните да бисте вратили"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немате проблема са камером? Додирните да бисте одбацили."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Додирните да бисте отворили мени апликације"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Додирните да бисте приказали више апликација заједно"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Вратите се из менија апликације на приказ преко целог екрана"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Видите и урадите више"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Превуците другу апликацију да бисте користили подељени екран"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Двапут додирните изван апликације да бисте променили њену позицију"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Управљајте прозорима"</string>
     <string name="close_text" msgid="4986518933445178928">"Затворите"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Затворите мени"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Отворите мени"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Повећај екран"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Уклопи екран"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Величина ове апликације не може да се промени"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Апликација не може да се премести овде"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Увећајте"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Прикачите лево"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Прикачите десно"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml
index c43f5df..2184ac6 100644
--- a/libs/WindowManager/Shell/res/values-sv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sv/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problem med kameran?\nTryck för att anpassa på nytt"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Löstes inte problemet?\nTryck för att återställa"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Inga problem med kameran? Tryck för att ignorera."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tryck för att öppna appmenyn"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tryck för att visa flera appar tillsammans"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Återgå till helskärm från appmenyn"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Se och gör mer"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Dra till en annan app för att dela upp skärmen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Tryck snabbt två gånger utanför en app för att flytta den"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Hantera fönster"</string>
     <string name="close_text" msgid="4986518933445178928">"Stäng"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Stäng menyn"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Öppna menyn"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximera skärmen"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Fäst skärmen"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Det går inte att ändra storlek på appen"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Det går inte att flytta appen hit"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Utöka"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Fäst till vänster"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Fäst till höger"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml
index c6ce023..6068bf0 100644
--- a/libs/WindowManager/Shell/res/values-sw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sw/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Je, kuna hitilafu za kamera?\nGusa ili urekebishe"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Umeshindwa kurekebisha?\nGusa ili urejeshe nakala ya awali"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Je, hakuna hitilafu za kamera? Gusa ili uondoe."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Gusa ili ufungue menyu ya programu"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Gusa ili uonyeshe programu nyingi kwa pamoja"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Rudi kwenye skrini nzima katika menyu ya programu"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Angalia na ufanye zaidi"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Buruta katika programu nyingine ili utumie skrini iliyogawanywa"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Gusa mara mbili nje ya programu ili uihamishe"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Dhibiti Windows"</string>
     <string name="close_text" msgid="4986518933445178928">"Funga"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Funga Menyu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Fungua Menyu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Panua Dirisha kwenye Skrini"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Panga Madirisha kwenye Skrini"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Huwezi kubadilisha ukubwa wa programu hii"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Imeshindwa kuhamishia programu hapa"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Panua"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Telezesha kushoto"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Telezesha kulia"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml
index 2c2f319..a14abac 100644
--- a/libs/WindowManager/Shell/res/values-ta/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ta/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"கேமரா தொடர்பான சிக்கல்களா?\nமீண்டும் பொருத்த தட்டவும்"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"சிக்கல்கள் சரிசெய்யப்படவில்லையா?\nமாற்றியமைக்க தட்டவும்"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"கேமரா தொடர்பான சிக்கல்கள் எதுவும் இல்லையா? நிராகரிக்க தட்டவும்."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ஆப்ஸ் மெனுவைத் திறக்க தட்டவும்"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"பல ஆப்ஸை ஒன்றாகக் காட்ட தட்டவும்"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ஆப்ஸ் மெனுவில் இருந்து முழுத்திரைக்குச் செல்லும்"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"பலவற்றைப் பார்த்தல் மற்றும் செய்தல்"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"திரைப் பிரிப்புக்கு மற்றொரு ஆப்ஸை இழுக்கலாம்"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ஆப்ஸை இடம் மாற்ற அதன் வெளியில் இருமுறை தட்டலாம்"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"சாளரங்களை நிர்வகிக்கலாம்"</string>
     <string name="close_text" msgid="4986518933445178928">"மூடும்"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"மெனுவை மூடும்"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"மெனுவைத் திறக்கும்"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"திரையைப் பெரிதாக்கு"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"திரையை ஸ்னாப் செய்"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"இந்த ஆப்ஸின் அளவை மாற்ற முடியாது"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ஆப்ஸை இங்கே நகர்த்த முடியாது"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"பெரிதாக்கும்"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"இடதுபுறம் நகர்த்தும்"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"வலதுபுறம் நகர்த்தும்"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml
index 8691c9d..84e76a8 100644
--- a/libs/WindowManager/Shell/res/values-te/strings.xml
+++ b/libs/WindowManager/Shell/res/values-te/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"కెమెరా సమస్యలు ఉన్నాయా?\nరీఫిట్ చేయడానికి ట్యాప్ చేయండి"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"దాని సమస్యను పరిష్కరించలేదా?\nపూర్వస్థితికి మార్చడానికి ట్యాప్ చేయండి"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"కెమెరా సమస్యలు లేవా? తీసివేయడానికి ట్యాప్ చేయండి."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"యాప్ మెనూని తెరవడానికి ట్యాప్ చేయండి"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"పలు యాప్‌లను కలిపి చూడటానికి ట్యాప్ చేయండి"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"యాప్ మెనూ నుండి ఫుల్ స్క్రీన్‌కు తిరిగి రండి"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"చూసి, మరిన్ని చేయండి"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"స్ప్లిట్ స్క్రీన్ కోసం మరొక యాప్‌లోకి లాగండి"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"యాప్ స్థానాన్ని మార్చడానికి దాని వెలుపల డబుల్-ట్యాప్ చేయండి"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"విండోలను మేనేజ్ చేయండి"</string>
     <string name="close_text" msgid="4986518933445178928">"మూసివేయండి"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"మెనూను మూసివేయండి"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"మెనూను తెరవండి"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"స్క్రీన్ సైజ్‌ను పెంచండి"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"స్క్రీన్‌ను స్నాప్ చేయండి"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ఈ యాప్ సైజ్‌ను మార్చడం సాధ్యపడదు"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"యాప్‌ను ఇక్కడకి తరలించడం సాధ్యం కాదు"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"మ్యాగ్జిమైజ్ చేయండి"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ఎడమ వైపున స్నాప్ చేయండి"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"కుడి వైపున స్నాప్ చేయండి"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml
index 07e1416..856893f 100644
--- a/libs/WindowManager/Shell/res/values-th/strings.xml
+++ b/libs/WindowManager/Shell/res/values-th/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"หากพบปัญหากับกล้อง\nแตะเพื่อแก้ไข"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"หากไม่ได้แก้ไข\nแตะเพื่อเปลี่ยนกลับ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"หากไม่พบปัญหากับกล้อง แตะเพื่อปิด"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"แตะเพื่อเปิดเมนูแอป"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"แตะเพื่อแสดงแอปหลายรายการพร้อมกัน"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"กลับไปที่เต็มหน้าจอจากเมนูแอป"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"รับชมและทำสิ่งต่างๆ ได้มากขึ้น"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ลากไปไว้ในแอปอื่นเพื่อแยกหน้าจอ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"แตะสองครั้งด้านนอกแอปเพื่อเปลี่ยนตำแหน่ง"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"จัดการหน้าต่าง"</string>
     <string name="close_text" msgid="4986518933445178928">"ปิด"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"ปิดเมนู"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"เปิดเมนู"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ขยายหน้าจอให้ใหญ่สุด"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"สแนปหน้าจอ"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ปรับขนาดแอปนี้ไม่ได้"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ย้ายแอปมาที่นี่ไม่ได้"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ขยายใหญ่สุด"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"จัดพอดีกับทางซ้าย"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"จัดพอดีกับทางขวา"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml
index 477700e..dc92efd 100644
--- a/libs/WindowManager/Shell/res/values-tl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tl/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"May mga isyu sa camera?\nI-tap para i-refit"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Hindi ito naayos?\nI-tap para i-revert"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Walang isyu sa camera? I-tap para i-dismiss."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"I-tap para buksan ang menu ng app"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"I-tap para ipakita nang magkakasama ang maraming app"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Bumalik sa fullscreen mula sa menu ng app"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Tumingin at gumawa ng higit pa"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Mag-drag ng isa pang app para sa split screen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Mag-double tap sa labas ng app para baguhin ang posisyon nito"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Pamahalaan ang Mga Window"</string>
     <string name="close_text" msgid="4986518933445178928">"Isara"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Isara ang Menu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Buksan ang Menu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"I-maximize ang Screen"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"I-snap ang Screen"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Hindi nare-resize ang app na ito"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Hindi mailipat dito ang app"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"I-maximize"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"I-snap pakaliwa"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"I-snap pakanan"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml
index b0c2539..e206cd6 100644
--- a/libs/WindowManager/Shell/res/values-tr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tr/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kameranızda sorun mu var?\nDüzeltmek için dokunun"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bu işlem sorunu düzeltmedi mi?\nİşlemi geri almak için dokunun"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kameranızda sorun yok mu? Kapatmak için dokunun."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Uygulama menüsünü açmak için dokunun"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Birden fazla uygulamayı birlikte göstermek için dokunun"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Uygulama menüsünden tam ekrana dönün"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Daha fazlasını görün ve yapın"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Bölünmüş ekran için başka bir uygulamayı sürükleyin"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Yeniden konumlandırmak için uygulamanın dışına iki kez dokunun"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Pencereleri yönet"</string>
     <string name="close_text" msgid="4986518933445178928">"Kapat"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Menüyü kapat"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menüyü aç"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ekranı Büyüt"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ekranın Yarısına Tuttur"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Bu uygulama yeniden boyutlandırılamaz"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Uygulama buraya taşınamıyor"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Ekranı kapla"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Sola tuttur"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Sağa tuttur"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml
index dd64c66..90a3bc33b 100644
--- a/libs/WindowManager/Shell/res/values-uk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uk/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблеми з камерою?\nНатисніть, щоб пристосувати"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблему не вирішено?\nНатисніть, щоб скасувати зміни"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немає проблем із камерою? Торкніться, щоб закрити."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Натисніть, щоб відкрити меню додатка"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Натисніть, щоб переглянути кілька додатків одночасно"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Повернутися з меню додатка в повноекранний режим"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Більше простору та можливостей"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Щоб перейти в режим розділення екрана, перетягніть сюди інший додаток"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Щоб перемістити додаток, двічі торкніться області поза ним"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Керувати вікнами"</string>
     <string name="close_text" msgid="4986518933445178928">"Закрити"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Закрити меню"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Відкрити меню"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Розгорнути екран"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Зафіксувати екран"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Розмір вікна цього додатка не можна змінити"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Сюди не можна перемістити додаток"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Розгорнути"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Закріпити ліворуч"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Закріпити праворуч"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml
index aa311c2..2006b0b 100644
--- a/libs/WindowManager/Shell/res/values-ur/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ur/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"کیمرے کے مسائل؟\nدوبارہ فٹ کرنے کیلئے تھپتھپائیں"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"یہ حل نہیں ہوا؟\nلوٹانے کیلئے تھپتھپائیں"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"کوئی کیمرے کا مسئلہ نہیں ہے؟ برخاست کرنے کیلئے تھپتھپائیں۔"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ایپ مینو کھولنے کیلئے تھپتھپائیں"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"متعدد ایپس ایک ساتھ دکھانے کیلئے تھپتھپائیں"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ایپ مینو سے مکمل اسکرین پر واپس جائیں"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"دیکھیں اور بہت کچھ کریں"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"اسپلٹ اسکرین کے ليے دوسری ایپ میں گھسیٹیں"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"کسی ایپ کی پوزیشن تبدیل کرنے کے لیے اس ایپ کے باہر دو بار تھپتھپائیں"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"‏‫Windows کا نظم کریں"</string>
     <string name="close_text" msgid="4986518933445178928">"بند کریں"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"مینیو بند کریں"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"مینو کھولیں"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"اسکرین کو بڑا کریں"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"اسکرین کا اسناپ شاٹ لیں"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"اس ایپ کا سائز تبدیل نہیں کیا جا سکتا"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ایپ کو یہاں منتقل نہیں کیا جا سکتا"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"بڑا کریں"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"دائیں منتقل کریں"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"بائیں منتقل کریں"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml
index 8754629..4b163f7 100644
--- a/libs/WindowManager/Shell/res/values-uz/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uz/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamera nosozmi?\nQayta moslash uchun bosing"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tuzatilmadimi?\nQaytarish uchun bosing"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera muammosizmi? Yopish uchun bosing."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Ilova menyusini ochish uchun bosing"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Bir nechta ilovani birga chiqarish uchun bosing"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Ilova menyusidan butun ekranga qayting"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Yana boshqa amallar"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Ekranni ikkiga ajratish uchun boshqa ilovani bu yerga torting"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Qayta joylash uchun ilova tashqarisiga ikki marta bosing"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Oynalarni boshqarish"</string>
     <string name="close_text" msgid="4986518933445178928">"Yopish"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Menyuni yopish"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menyuni ochish"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ekranni yoyish"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ekranni biriktirish"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Bu ilova hajmini oʻzgartirish imkonsiz"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Ilova bu yerga surilmaydi"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Yoyish"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Chapga tortish"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Oʻngga tortish"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml
index abac3fe..db86498 100644
--- a/libs/WindowManager/Shell/res/values-vi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-vi/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Có vấn đề với máy ảnh?\nHãy nhấn để sửa lỗi"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bạn chưa khắc phục vấn đề?\nHãy nhấn để hủy bỏ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Không có vấn đề với máy ảnh? Hãy nhấn để đóng."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Nhấn để mở trình đơn ứng dụng"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Nhấn để hiển thị nhiều ứng dụng cùng lúc"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Quay lại chế độ toàn màn hình từ trình đơn ứng dụng"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Xem và làm được nhiều việc hơn"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Kéo một ứng dụng khác vào để chia đôi màn hình"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Nhấn đúp bên ngoài ứng dụng để đặt lại vị trí"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Quản lý cửa sổ"</string>
     <string name="close_text" msgid="4986518933445178928">"Đóng"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Đóng trình đơn"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Mở Trình đơn"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Mở rộng màn hình"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Điều chỉnh kích thước màn hình"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Không thể đổi kích thước của ứng dụng này"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Không di chuyển được ứng dụng đến đây"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Phóng to tối đa"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Di chuyển nhanh sang trái"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Di chuyển nhanh sang phải"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
index 5a61dec..ebf4b03 100644
--- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相机有问题?\n点按即可整修"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"没有解决此问题?\n点按即可恢复"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相机没有问题?点按即可忽略。"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"点按可打开应用菜单"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"点按可同时显示多个应用"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"从应用菜单可返回到全屏"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"查看和处理更多任务"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"拖入另一个应用,即可使用分屏模式"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"在某个应用外连续点按两次,即可调整它的位置"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"管理窗口"</string>
     <string name="close_text" msgid="4986518933445178928">"关闭"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"关闭菜单"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"打开菜单"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"最大化屏幕"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"屏幕快照"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"无法调整此应用的大小"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"无法将应用移至此处"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"最大化"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"贴靠左侧"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"贴靠右侧"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
index e1c303e..f1d12fc 100644
--- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相機有問題?\n輕按即可修正"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未能修正問題?\n輕按即可還原"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機冇問題?㩒一下就可以即可閂咗佢。"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"輕按即可開啟應用程式選單"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"輕按即可同時顯示多個應用程式"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"從應用程式選單返回全螢幕"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"瀏覽更多內容及執行更多操作"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"拖入另一個應用程式即可分割螢幕"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"在應用程式外輕按兩下即可調整位置"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"管理視窗"</string>
     <string name="close_text" msgid="4986518933445178928">"關閉"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"關閉選單"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"打開選單"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"畫面最大化"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"貼齊畫面"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"此應用程式無法調整大小"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"應用程式無法移至這裡"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"最大化"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"貼齊左邊"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"貼齊右邊"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
index 97e36c3..b5c28d3 100644
--- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相機有問題嗎?\n輕觸即可修正"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未修正問題嗎?\n輕觸即可還原"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機沒問題嗎?輕觸即可關閉。"</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"輕觸即可開啟應用程式選單"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"輕觸即可一次顯示多個應用程式"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"從應用程式選單返回全螢幕"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"瀏覽更多內容及執行更多操作"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"拖進另一個應用程式即可使用分割畫面模式"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"在應用程式外輕觸兩下即可調整位置"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"管理視窗"</string>
     <string name="close_text" msgid="4986518933445178928">"關閉"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"關閉選單"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"開啟選單"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"畫面最大化"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"貼齊畫面"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"這個應用程式無法調整大小"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"應用程式無法移至此處"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"最大化"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"靠左對齊"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"靠右對齊"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml
index 74c7169..f54d0ed 100644
--- a/libs/WindowManager/Shell/res/values-zu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zu/strings.xml
@@ -97,6 +97,9 @@
     <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Izinkinga zekhamera?\nThepha ukuze uyilinganise kabusha"</string>
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Akuyilungisanga?\nThepha ukuze ubuyele"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Azikho izinkinga zekhamera? Thepha ukuze ucashise."</string>
+    <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Thepha ukuze uvule imenyu ye-app"</string>
+    <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Thepha ukuze ubonise ama-app amaningi ndawonye"</string>
+    <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Buyela esikrinini esigcwele ukusuka kumenyu ye-app"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Bona futhi wenze okuningi"</string>
     <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Hudula kwenye i-app mayelana nokuhlukanisa isikrini"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Thepha kabili ngaphandle kwe-app ukuze uyimise kabusha"</string>
@@ -126,15 +129,21 @@
     <string name="manage_windows_text" msgid="5567366688493093920">"Phatha Amawindi"</string>
     <string name="close_text" msgid="4986518933445178928">"Vala"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Vala Imenyu"</string>
-    <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) -->
-    <skip />
+    <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Vula Imenyu"</string>
     <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Khulisa Isikrini Sifike Ekugcineni"</string>
     <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Thwebula Isikrini"</string>
-    <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Le app ayikwazi ukushintshwa usayizi"</string>
-    <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) -->
+    <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"I-app ayikwazi ukuhanjiswa lapha"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Khulisa"</string>
+    <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Chofoza kwesobunxele"</string>
+    <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Chofoza kwesokudla"</string>
+    <!-- no translation found for open_by_default_settings_text (2526548548598185500) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) -->
+    <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) -->
     <skip />
-    <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) -->
+    <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) -->
+    <skip />
+    <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) -->
     <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index 3d87183..1f15651 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -608,6 +608,9 @@
     <!-- The horizontal inset to apply to the close button's ripple drawable -->
     <dimen name="desktop_mode_header_close_ripple_inset_horizontal">6dp</dimen>
 
+    <!-- The padding added to all sides of windowing education tooltip -->
+    <dimen name="desktop_windowing_education_tooltip_padding">8dp</dimen>
+
     <!-- The acceptable area ratio of fg icon area/bg icon area, i.e. (72 x 72) / (108 x 108) -->
     <item type="dimen" format="float" name="splash_icon_enlarge_foreground_threshold">0.44</item>
     <!-- Scaling factor applied to splash icons without provided background i.e. (192 / 160) -->
@@ -621,4 +624,12 @@
     <!-- The offset from the left edge of the entering page for the cross-activity animation -->
     <dimen name="cross_activity_back_entering_start_offset">96dp</dimen>
 
+    <!-- The open by default settings dialog menu width. -->
+    <dimen name="open_by_default_settings_dialog_width">348dp</dimen>
+    <!-- The open by default settings dialog menu height. -->
+    <dimen name="open_by_default_settings_dialog_height">380dp</dimen>
+    <!-- The height of radio buttons in the open by default settings dialog. -->
+    <dimen name="open_by_default_settings_dialog_radio_button_height">64dp</dimen>
+    <!-- The width of radio buttons in the open by default settings dialog. -->
+    <dimen name="open_by_default_settings_dialog_radio_button_width">316dp</dimen>
 </resources>
diff --git a/libs/WindowManager/Shell/res/values/strings.xml b/libs/WindowManager/Shell/res/values/strings.xml
index bda5686..5ef8432 100644
--- a/libs/WindowManager/Shell/res/values/strings.xml
+++ b/libs/WindowManager/Shell/res/values/strings.xml
@@ -219,6 +219,15 @@
          compatibility control. [CHAR LIMIT=NONE] -->
     <string name="camera_compat_dismiss_button_description">No camera issues? Tap to dismiss.</string>
 
+    <!-- App handle education tooltip text for tooltip pointing to app handle -->
+    <string name="windowing_app_handle_education_tooltip">Tap to open the app menu</string>
+
+    <!-- App handle education tooltip text for tooltip pointing to windowing image button -->
+    <string name="windowing_desktop_mode_image_button_education_tooltip">Tap to show multiple apps together</string>
+
+    <!-- App handle education tooltip text for tooltip pointing to app chip -->
+    <string name="windowing_desktop_mode_exit_education_tooltip">Return to fullscreen from the app menu</string>
+
     <!-- The title of the letterbox education dialog. [CHAR LIMIT=NONE] -->
     <string name="letterbox_education_dialog_title">See and do more</string>
 
@@ -307,7 +316,7 @@
     <!-- Maximize menu snap buttons string. -->
     <string name="desktop_mode_maximize_menu_snap_text">Snap Screen</string>
     <!-- Snap resizing non-resizable string. -->
-    <string name="desktop_mode_non_resizable_snap_text">This app can\'t be resized</string>
+    <string name="desktop_mode_non_resizable_snap_text">App can\'t be moved here</string>
     <!-- Accessibility text for the Maximize Menu's maximize button [CHAR LIMIT=NONE] -->
     <string name="desktop_mode_maximize_menu_maximize_button_text">Maximize</string>
     <!-- Accessibility text for the Maximize Menu's snap left button [CHAR LIMIT=NONE] -->
@@ -315,4 +324,14 @@
     <!-- Accessibility text for the Maximize Menu's snap right button [CHAR LIMIT=NONE] -->
     <string name="desktop_mode_maximize_menu_snap_right_button_text">Snap right</string>
 
+    <!-- Accessibility text for open by default settings button [CHAR LIMIT=NONE] -->
+    <string name="open_by_default_settings_text">Open by default settings</string>
+    <!-- Subheader for open by default menu string. -->
+    <string name="open_by_default_dialog_subheader_text">Choose how to open web links for this app</string>
+    <!-- Text for open by default settings dialog option. -->
+    <string name="open_by_default_dialog_in_app_text">In the app</string>
+    <!-- Text for open by default settings dialog option. -->
+    <string name="open_by_default_dialog_in_browser_text">In your browser</string>
+    <!-- Text for open by default settings dialog dismiss button. -->
+    <string name="open_by_default_dialog_dismiss_button_text">OK</string>
 </resources>
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/FocusTransitionListener.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/FocusTransitionListener.java
new file mode 100644
index 0000000..26aae2d
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/FocusTransitionListener.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.shared;
+
+import com.android.wm.shell.shared.annotations.ExternalThread;
+
+/**
+ * Listener to get focus-related transition callbacks.
+ */
+@ExternalThread
+public interface FocusTransitionListener {
+    /**
+     * Called when a transition changes the top, focused display.
+     */
+    void onFocusedDisplayChanged(int displayId);
+}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/IFocusTransitionListener.aidl b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/IFocusTransitionListener.aidl
new file mode 100644
index 0000000..b91d5b6
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/IFocusTransitionListener.aidl
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.shared;
+
+/**
+ * Listener interface that to get focus-related transition callbacks.
+ */
+oneway interface IFocusTransitionListener {
+
+    /**
+     * Called when a transition changes the top, focused display.
+     */
+    void onFocusedDisplayChanged(int displayId);
+}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/IShellTransitions.aidl b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/IShellTransitions.aidl
index 3256abf..02615a9 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/IShellTransitions.aidl
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/IShellTransitions.aidl
@@ -20,6 +20,7 @@
 import android.window.RemoteTransition;
 import android.window.TransitionFilter;
 
+import com.android.wm.shell.shared.IFocusTransitionListener;
 import com.android.wm.shell.shared.IHomeTransitionListener;
 
 /**
@@ -59,4 +60,9 @@
      */
     oneway void registerRemoteForTakeover(in TransitionFilter filter,
             in RemoteTransition remoteTransition) = 6;
+
+    /**
+     * Set listener that will receive callbacks about transitions involving focus switch.
+     */
+    oneway void setFocusTransitionListener(in IFocusTransitionListener listener) = 7;
 }
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/ShellTransitions.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/ShellTransitions.java
index 6d4ab4c..2db4311 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/ShellTransitions.java
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/ShellTransitions.java
@@ -22,6 +22,8 @@
 
 import com.android.wm.shell.shared.annotations.ExternalThread;
 
+import java.util.concurrent.Executor;
+
 /**
  * Interface to manage remote transitions.
  */
@@ -44,4 +46,15 @@
      * Unregisters a remote transition for all operations.
      */
     default void unregisterRemote(@NonNull RemoteTransition remoteTransition) {}
+
+    /**
+     * Sets listener that will receive callbacks about transitions involving focus switch.
+     */
+    default void setFocusTransitionListener(@NonNull FocusTransitionListener listener,
+            Executor executor) {}
+
+    /**
+     * Unsets listener that will receive callbacks about transitions involving focus switch.
+     */
+    default void unsetFocusTransitionListener(@NonNull FocusTransitionListener listener) {}
 }
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/BubbleInfo.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/BubbleInfo.java
index 5876682..85dabce 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/BubbleInfo.java
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/BubbleInfo.java
@@ -30,29 +30,32 @@
  */
 public class BubbleInfo implements Parcelable {
 
-    private String mKey; // Same key as the Notification
+    private final String mKey; // Same key as the Notification
     private int mFlags;  // Flags from BubbleMetadata
     @Nullable
-    private String mShortcutId;
-    private int mUserId;
-    private String mPackageName;
+    private final String mShortcutId;
+    private final int mUserId;
+    private final String mPackageName;
     /**
      * All notification bubbles require a shortcut to be set on the notification, however, the
      * app could still specify an Icon and PendingIntent to use for the bubble. In that case
      * this icon will be populated. If the bubble is entirely shortcut based, this will be null.
      */
     @Nullable
-    private Icon mIcon;
+    private final Icon mIcon;
     @Nullable
-    private String mTitle;
+    private final String mTitle;
     @Nullable
-    private String mAppName;
-    private boolean mIsImportantConversation;
-    private boolean mShowAppBadge;
+    private final String mAppName;
+    private final boolean mIsImportantConversation;
+    private final boolean mShowAppBadge;
+    @Nullable
+    private final ParcelableFlyoutMessage mParcelableFlyoutMessage;
 
     public BubbleInfo(String key, int flags, @Nullable String shortcutId, @Nullable Icon icon,
             int userId, String packageName, @Nullable String title, @Nullable String appName,
-            boolean isImportantConversation, boolean showAppBadge) {
+            boolean isImportantConversation, boolean showAppBadge,
+            @Nullable ParcelableFlyoutMessage flyoutMessage) {
         mKey = key;
         mFlags = flags;
         mShortcutId = shortcutId;
@@ -63,6 +66,7 @@
         mAppName = appName;
         mIsImportantConversation = isImportantConversation;
         mShowAppBadge = showAppBadge;
+        mParcelableFlyoutMessage = flyoutMessage;
     }
 
     private BubbleInfo(Parcel source) {
@@ -76,6 +80,8 @@
         mAppName = source.readString();
         mIsImportantConversation = source.readBoolean();
         mShowAppBadge = source.readBoolean();
+        mParcelableFlyoutMessage = source.readParcelable(
+                ParcelableFlyoutMessage.class.getClassLoader(), ParcelableFlyoutMessage.class);
     }
 
     public String getKey() {
@@ -122,6 +128,11 @@
         return mShowAppBadge;
     }
 
+    @Nullable
+    public ParcelableFlyoutMessage getParcelableFlyoutMessage() {
+        return mParcelableFlyoutMessage;
+    }
+
     /**
      * Whether this bubble is currently being hidden from the stack.
      */
@@ -180,6 +191,7 @@
         parcel.writeString(mAppName);
         parcel.writeBoolean(mIsImportantConversation);
         parcel.writeBoolean(mShowAppBadge);
+        parcel.writeParcelable(mParcelableFlyoutMessage, flags);
     }
 
     @NonNull
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/FlyoutDrawableLoader.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/FlyoutDrawableLoader.kt
new file mode 100644
index 0000000..5a17330
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/FlyoutDrawableLoader.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.shared.bubbles
+
+import android.content.Context
+import android.content.Intent
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.Icon
+import android.util.Log
+
+object FlyoutDrawableLoader {
+
+    private const val TAG = "FlyoutDrawableLoader"
+
+    /** Loads the flyout icon as a [Drawable]. */
+    @JvmStatic
+    fun Icon?.loadFlyoutDrawable(context: Context): Drawable? {
+        if (this == null) return null
+        try {
+            if (this.type == Icon.TYPE_URI || this.type == Icon.TYPE_URI_ADAPTIVE_BITMAP) {
+                context.grantUriPermission(
+                    context.packageName,
+                    this.uri,
+                    Intent.FLAG_GRANT_READ_URI_PERMISSION
+                )
+            }
+            return loadDrawable(context)
+        } catch (e: Exception) {
+            Log.w(TAG, "loadFlyoutDrawable failed: ${e.message}")
+            return null
+        }
+    }
+}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/ParcelableFlyoutMessage.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/ParcelableFlyoutMessage.kt
new file mode 100644
index 0000000..294d5e5
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/ParcelableFlyoutMessage.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.shared.bubbles
+
+import android.graphics.drawable.Icon
+import android.os.Parcel
+import android.os.Parcelable
+
+/** The contents of the flyout message to be passed to launcher for rendering in the bubble bar. */
+class ParcelableFlyoutMessage(
+    val icon: Icon?,
+    val title: String?,
+    val message: String?,
+) : Parcelable {
+
+    constructor(
+        parcel: Parcel
+    ) : this(
+        icon = parcel.readParcelable(Icon::class.java.classLoader),
+        title = parcel.readString(),
+        message = parcel.readString(),
+    )
+
+    override fun writeToParcel(parcel: Parcel, flags: Int) {
+        parcel.writeParcelable(icon, flags)
+        parcel.writeString(title)
+        parcel.writeString(message)
+    }
+
+    override fun describeContents() = 0
+
+    companion object {
+        @JvmField
+        val CREATOR =
+            object : Parcelable.Creator<ParcelableFlyoutMessage> {
+                override fun createFromParcel(parcel: Parcel) = ParcelableFlyoutMessage(parcel)
+
+                override fun newArray(size: Int) = arrayOfNulls<ParcelableFlyoutMessage>(size)
+            }
+    }
+}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/OWNERS b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/OWNERS
new file mode 100644
index 0000000..bfb6d4a
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/OWNERS
@@ -0,0 +1,4 @@
+jeremysim@google.com
+winsonc@google.com
+peanutbutter@google.com
+shuminghao@google.com
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java
index 498dc8b..7f1e4a8 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java
@@ -66,14 +66,54 @@
     public @interface SplitPosition {
     }
 
-    /** A snap target in the first half of the screen, where the split is roughly 30-70. */
-    public static final int SNAP_TO_30_70 = 0;
+    /**
+     * A snap target for two apps, where the split is 33-66. With FLAG_ENABLE_FLEXIBLE_SPLIT,
+     * only used on tablets.
+     */
+    public static final int SNAP_TO_2_33_66 = 0;
 
-    /** The 50-50 snap target */
-    public static final int SNAP_TO_50_50 = 1;
+    /** A snap target for two apps, where the split is 50-50.  */
+    public static final int SNAP_TO_2_50_50 = 1;
 
-    /** A snap target in the latter half of the screen, where the split is roughly 70-30. */
-    public static final int SNAP_TO_70_30 = 2;
+    /**
+     * A snap target for two apps, where the split is 66-33. With FLAG_ENABLE_FLEXIBLE_SPLIT,
+     * only used on tablets.
+     */
+    public static final int SNAP_TO_2_66_33 = 2;
+
+    /**
+     * A snap target for two apps, where the split is 90-10. The "10" app extends off the screen,
+     * and is actually the same size as the onscreen app, but the visible portion takes up 10% of
+     * the screen. With FLAG_ENABLE_FLEXIBLE_SPLIT, used on phones and foldables.
+     */
+    public static final int SNAP_TO_2_90_10 = 3;
+
+    /**
+     * A snap target for two apps, where the split is 10-90. The "10" app extends off the screen,
+     * and is actually the same size as the onscreen app, but the visible portion takes up 10% of
+     * the screen. With FLAG_ENABLE_FLEXIBLE_SPLIT, used on phones and foldables.
+     */
+    public static final int SNAP_TO_2_10_90 = 4;
+
+    /**
+     * A snap target for three apps, where the split is 33-33-33. With FLAG_ENABLE_FLEXIBLE_SPLIT,
+     * only used on tablets.
+     */
+    public static final int SNAP_TO_3_33_33_33 = 5;
+
+    /**
+     * A snap target for three apps, where the split is 45-45-10. The "10" app extends off the
+     * screen, and is actually the same size as the onscreen apps, but the visible portion takes
+     * up 10% of the screen. With FLAG_ENABLE_FLEXIBLE_SPLIT, only used on unfolded foldables.
+     */
+    public static final int SNAP_TO_3_45_45_10 = 6;
+
+    /**
+     * A snap target for three apps, where the split is 10-45-45. The "10" app extends off the
+     * screen, and is actually the same size as the onscreen apps, but the visible portion takes
+     * up 10% of the screen. With FLAG_ENABLE_FLEXIBLE_SPLIT, only used on unfolded foldables.
+     */
+    public static final int SNAP_TO_3_10_45_45 = 7;
 
     /**
      * These snap targets are used for split pairs in a stable, non-transient state. They may be
@@ -81,9 +121,14 @@
      * {@link SnapPosition}.
      */
     @IntDef(prefix = { "SNAP_TO_" }, value = {
-            SNAP_TO_30_70,
-            SNAP_TO_50_50,
-            SNAP_TO_70_30
+            SNAP_TO_2_33_66,
+            SNAP_TO_2_50_50,
+            SNAP_TO_2_66_33,
+            SNAP_TO_2_90_10,
+            SNAP_TO_2_10_90,
+            SNAP_TO_3_33_33_33,
+            SNAP_TO_3_45_45_10,
+            SNAP_TO_3_10_45_45,
     })
     public @interface PersistentSnapPosition {}
 
@@ -91,9 +136,14 @@
      * Checks if the snapPosition in question is a {@link PersistentSnapPosition}.
      */
     public static boolean isPersistentSnapPosition(@SnapPosition int snapPosition) {
-        return snapPosition == SNAP_TO_30_70
-                || snapPosition == SNAP_TO_50_50
-                || snapPosition == SNAP_TO_70_30;
+        return snapPosition == SNAP_TO_2_33_66
+                || snapPosition == SNAP_TO_2_50_50
+                || snapPosition == SNAP_TO_2_66_33
+                || snapPosition == SNAP_TO_2_90_10
+                || snapPosition == SNAP_TO_2_10_90
+                || snapPosition == SNAP_TO_3_33_33_33
+                || snapPosition == SNAP_TO_3_45_45_10
+                || snapPosition == SNAP_TO_3_10_45_45;
     }
 
     /** The divider doesn't snap to any target and is freely placeable. */
@@ -109,9 +159,14 @@
     public static final int SNAP_TO_MINIMIZE = 13;
 
     @IntDef(prefix = { "SNAP_TO_" }, value = {
-            SNAP_TO_30_70,
-            SNAP_TO_50_50,
-            SNAP_TO_70_30,
+            SNAP_TO_2_33_66,
+            SNAP_TO_2_50_50,
+            SNAP_TO_2_66_33,
+            SNAP_TO_2_90_10,
+            SNAP_TO_2_10_90,
+            SNAP_TO_3_33_33_33,
+            SNAP_TO_3_45_45_10,
+            SNAP_TO_3_10_45_45,
             SNAP_TO_NONE,
             SNAP_TO_START_AND_DISMISS,
             SNAP_TO_END_AND_DISMISS,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/EventLogTags.logtags b/libs/WindowManager/Shell/src/com/android/wm/shell/EventLogTags.logtags
new file mode 100644
index 0000000..db960d1
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/EventLogTags.logtags
@@ -0,0 +1,11 @@
+# See system/logging/logcat/event.logtags for a description of the format of this file.
+
+option java_package com.android.wm.shell
+
+# Do not change these names without updating the checkin_events setting in
+# google3/googledata/wireless/android/provisioning/gservices.config !!
+#
+
+38500 wm_shell_enter_desktop_mode (EnterReason|1|5),(SessionId|1|5)
+38501 wm_shell_exit_desktop_mode (ExitReason|1|5),(SessionId|1|5)
+38502 wm_shell_desktop_mode_task_update (TaskEvent|1|5),(InstanceId|1|5),(uid|1|5),(TaskHeight|1),(TaskWidth|1),(TaskX|1),(TaskY|1),(SessionId|1|5),(MinimiseReason|1|5),(UnminimiseReason|1|5),(VisibleTaskCount|1)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt
index 05ce361..71bcb59 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt
@@ -20,10 +20,11 @@
 
 import android.content.Context
 import android.content.Intent
+import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
 import android.content.pm.PackageManager
 import android.net.Uri
 
-private val browserIntent = Intent()
+private val GenericBrowserIntent = Intent()
     .setAction(Intent.ACTION_VIEW)
     .addCategory(Intent.CATEGORY_BROWSABLE)
     .setData(Uri.parse("http:"))
@@ -32,9 +33,9 @@
  * Returns a boolean indicating whether a given package is a browser app.
  */
 fun isBrowserApp(context: Context, packageName: String, userId: Int): Boolean {
-    browserIntent.setPackage(packageName)
+    GenericBrowserIntent.setPackage(packageName)
     val list = context.packageManager.queryIntentActivitiesAsUser(
-        browserIntent, PackageManager.MATCH_ALL, userId
+        GenericBrowserIntent, PackageManager.MATCH_ALL, userId
     )
 
     list.forEach {
@@ -44,3 +45,17 @@
     }
     return false
 }
+
+/**
+ * Returns intent if there is a browser application available to handle the uri. Otherwise, returns
+ * null.
+ */
+fun getBrowserIntent(uri: Uri, packageManager: PackageManager): Intent? {
+    val intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, Intent.CATEGORY_APP_BROWSER)
+        .setData(uri)
+        .addFlags(FLAG_ACTIVITY_NEW_TASK)
+    // If there is no browser application available to handle intent, return null
+    val component = intent.resolveActivity(packageManager) ?: return null
+    intent.setComponent(component)
+    return intent
+}
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt
new file mode 100644
index 0000000..4926cbd
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.apptoweb
+
+import android.app.ActivityManager.RunningTaskInfo
+import android.app.TaskInfo
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.PixelFormat
+import android.view.LayoutInflater
+import android.view.SurfaceControl
+import android.view.SurfaceControlViewHost
+import android.view.WindowManager
+import android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+import android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+import android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL
+import android.view.WindowlessWindowManager
+import android.widget.ImageView
+import android.widget.TextView
+import android.window.TaskConstants
+import com.android.wm.shell.R
+import com.android.wm.shell.common.DisplayController
+import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalViewHostViewContainer
+import java.util.function.Supplier
+
+
+/**
+ * Window manager for the open by default settings dialog
+ */
+internal class OpenByDefaultDialog(
+    private val context: Context,
+    private val taskInfo: TaskInfo,
+    private val taskSurface: SurfaceControl,
+    private val displayController: DisplayController,
+    private val surfaceControlTransactionSupplier: Supplier<SurfaceControl.Transaction>,
+    private val listener: DialogLifecycleListener,
+    appIconBitmap: Bitmap?,
+    appName: CharSequence?
+) {
+    private lateinit var dialog: OpenByDefaultDialogView
+    private lateinit var viewHost: SurfaceControlViewHost
+    private lateinit var dialogSurfaceControl: SurfaceControl
+    private var dialogContainer: AdditionalViewHostViewContainer? = null
+    private lateinit var appIconView: ImageView
+    private lateinit var appNameView: TextView
+
+    init {
+        createDialog()
+        bindAppInfo(appIconBitmap, appName)
+    }
+
+    /** Creates an open by default settings dialog. */
+    fun createDialog() {
+        val t = SurfaceControl.Transaction()
+        val taskBounds = taskInfo.configuration.windowConfiguration.bounds
+
+        dialog = LayoutInflater.from(context)
+            .inflate(
+                R.layout.open_by_default_settings_dialog,
+                null /* root */
+            ) as OpenByDefaultDialogView
+        appIconView = dialog.requireViewById(R.id.application_icon)
+        appNameView = dialog.requireViewById(R.id.application_name)
+
+        val display = displayController.getDisplay(taskInfo.displayId)
+        val builder: SurfaceControl.Builder = SurfaceControl.Builder()
+        dialogSurfaceControl = builder
+            .setName("Open by Default Dialog of Task=" + taskInfo.taskId)
+            .setContainerLayer()
+            .setParent(taskSurface)
+            .setCallsite("OpenByDefaultDialog#createDialog")
+            .build()
+        t.setPosition(dialogSurfaceControl, 0f, 0f)
+            .setWindowCrop(dialogSurfaceControl, taskBounds.width(), taskBounds.height())
+            .setLayer(dialogSurfaceControl, TaskConstants.TASK_CHILD_LAYER_SETTINGS_DIALOG)
+            .show(dialogSurfaceControl)
+        val lp = WindowManager.LayoutParams(
+            taskBounds.width(),
+            taskBounds.height(),
+            TYPE_APPLICATION_PANEL,
+            FLAG_NOT_FOCUSABLE or FLAG_NOT_TOUCH_MODAL,
+            PixelFormat.TRANSLUCENT)
+        lp.title = "Open by default settings dialog of task=" + taskInfo.taskId
+        lp.setTrustedOverlay()
+        val windowManager = WindowlessWindowManager(
+            taskInfo.configuration,
+            dialogSurfaceControl, null /* hostInputToken */
+        )
+        viewHost = SurfaceControlViewHost(context, display, windowManager, "Dialog").apply {
+            setView(dialog, lp)
+            rootSurfaceControl.applyTransactionOnDraw(t)
+        }
+        dialogContainer = AdditionalViewHostViewContainer(
+            dialogSurfaceControl, viewHost, surfaceControlTransactionSupplier)
+
+        dialog.setDismissOnClickListener{
+            closeMenu()
+        }
+
+        listener.onDialogCreated()
+    }
+
+    private fun closeMenu() {
+        dialogContainer?.releaseView()
+        dialogContainer = null
+        listener.onDialogDismissed()
+    }
+
+     private fun bindAppInfo(
+        appIconBitmap: Bitmap?,
+        appName: CharSequence?
+    ) {
+        appIconView.setImageBitmap(appIconBitmap)
+        appNameView.text = appName
+    }
+
+    /**
+     * Relayout the dialog to the new task bounds.
+     */
+    fun relayout(
+        taskInfo: RunningTaskInfo,
+    ) {
+        val t = surfaceControlTransactionSupplier.get()
+        val taskBounds = taskInfo.configuration.windowConfiguration.bounds
+        t.setWindowCrop(dialogSurfaceControl, taskBounds.width(), taskBounds.height())
+        viewHost.rootSurfaceControl.applyTransactionOnDraw(t)
+        viewHost.relayout(taskBounds.width(), taskBounds.height())
+    }
+
+    /**
+     * Defines interface for classes that can listen to lifecycle events of open by default settings
+     * dialog.
+     */
+    interface DialogLifecycleListener {
+        /** Called when open by default dialog view has been created. */
+        fun onDialogCreated()
+
+        /** Called when open by default dialog view has been released. */
+        fun onDialogDismissed()
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialogView.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialogView.kt
new file mode 100644
index 0000000..d03a38e
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialogView.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.apptoweb
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.util.AttributeSet
+import android.view.View
+import android.widget.Button
+import androidx.constraintlayout.widget.ConstraintLayout
+import com.android.wm.shell.R
+
+/** View for open by default settings dialog for an application which allows the user to change
+ * where links will open by default, in the default browser or in the application. */
+class OpenByDefaultDialogView @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0,
+    defStyleRes: Int = 0
+) : ConstraintLayout(context, attrs, defStyleAttr, defStyleRes) {
+
+    private lateinit var dialogContainer: View
+    private lateinit var backgroundDim: Drawable
+
+    fun setDismissOnClickListener(callback: (View) -> Unit) {
+        val dismissButton = dialogContainer.requireViewById<Button>(
+            R.id.open_by_default_settings_dialog_dismiss_button)
+        dismissButton.setOnClickListener(callback)
+        // Clicks on the background dim should also dismiss the dialog.
+        setOnClickListener(callback)
+        // We add a no-op on-click listener to the dialog container so that clicks on it won't
+        // propagate to the listener of the layout (which represents the background dim).
+        dialogContainer.setOnClickListener { }
+    }
+
+    override fun onFinishInflate() {
+        super.onFinishInflate()
+        dialogContainer = requireViewById(R.id.open_by_default_dialog_container)
+        backgroundDim = background.mutate()
+        backgroundDim.alpha = 128
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java
index df80946..7c5f716 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java
@@ -33,8 +33,6 @@
      *
      * @param touchX the X touch position of the {@link MotionEvent}.
      * @param touchY the Y touch position of the {@link MotionEvent}.
-     * @param velocityX the X velocity computed from the {@link MotionEvent}.
-     * @param velocityY the Y velocity computed from the {@link MotionEvent}.
      * @param keyAction the original {@link KeyEvent#getAction()} when the event was dispatched to
      *               the process. This is forwarded separately because the input pipeline may mutate
      *               the {#event} action state later.
@@ -43,8 +41,6 @@
     void onBackMotion(
             float touchX,
             float touchY,
-            float velocityX,
-            float velocityY,
             int keyAction,
             @BackEvent.SwipeEdge int swipeEdge);
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
index 3e5adf3..b90e6e2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
@@ -352,16 +352,12 @@
         public void onBackMotion(
                 float touchX,
                 float touchY,
-                float velocityX,
-                float velocityY,
                 int keyAction,
                 @BackEvent.SwipeEdge int swipeEdge
         ) {
             mShellExecutor.execute(() -> onMotionEvent(
                     /* touchX = */ touchX,
                     /* touchY = */ touchY,
-                    /* velocityX = */ velocityX,
-                    /* velocityY = */ velocityY,
                     /* keyAction = */ keyAction,
                     /* swipeEdge = */ swipeEdge));
         }
@@ -500,14 +496,12 @@
     public void onMotionEvent(
             float touchX,
             float touchY,
-            float velocityX,
-            float velocityY,
             int keyAction,
             @BackEvent.SwipeEdge int swipeEdge) {
 
         BackTouchTracker activeTouchTracker = getActiveTracker();
         if (activeTouchTracker != null) {
-            activeTouchTracker.update(touchX, touchY, velocityX, velocityY);
+            activeTouchTracker.update(touchX, touchY);
         }
 
         // two gestures are waiting to be processed at the moment, skip any further user touches
@@ -1501,10 +1495,6 @@
                 int rootIdx = -1;
                 for (int i = info.getChanges().size() - 1; i >= 0; --i) {
                     final TransitionInfo.Change c = info.getChanges().get(i);
-                    if (c.hasFlags(FLAG_IS_WALLPAPER)) {
-                        st.setAlpha(c.getLeash(), 1.0f);
-                        continue;
-                    }
                     if (TransitionUtil.isOpeningMode(c.getMode())) {
                         final Point offset = c.getEndRelOffset();
                         st.setPosition(c.getLeash(), offset.x, offset.y);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
index 169361a..e3fc5c2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
@@ -56,6 +56,7 @@
 import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
 import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.shared.bubbles.BubbleInfo;
+import com.android.wm.shell.shared.bubbles.ParcelableFlyoutMessage;
 
 import java.io.PrintWriter;
 import java.util.List;
@@ -350,7 +351,22 @@
                 getTitle(),
                 getAppName(),
                 isImportantConversation(),
-                !isAppLaunchIntent());
+                !isAppLaunchIntent(),
+                getParcelableFlyoutMessage());
+    }
+
+    /** Creates a parcelable flyout message to send to launcher. */
+    @Nullable
+    private ParcelableFlyoutMessage getParcelableFlyoutMessage() {
+        if (mFlyoutMessage == null) {
+            return null;
+        }
+        // the icon is only used in group chats
+        Icon icon = mFlyoutMessage.isGroupChat ? mFlyoutMessage.senderIcon : null;
+        String title =
+                mFlyoutMessage.senderName == null ? null : mFlyoutMessage.senderName.toString();
+        String message = mFlyoutMessage.message == null ? null : mFlyoutMessage.message.toString();
+        return new ParcelableFlyoutMessage(icon, title, message);
     }
 
     @Override
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
index af4a0c5..a8a8c2a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
@@ -274,7 +274,8 @@
     private final DragAndDropController mDragAndDropController;
     /** Used to send bubble events to launcher. */
     private Bubbles.BubbleStateListener mBubbleStateListener;
-
+    /** Used to track previous navigation mode to detect switch to buttons navigation. */
+    private boolean mIsPrevNavModeGestures;
     /** Used to send updates to the views from {@link #mBubbleDataListener}. */
     private BubbleViewCallback mBubbleViewCallback;
 
@@ -356,6 +357,7 @@
             }
         };
         mExpandedViewManager = BubbleExpandedViewManager.fromBubbleController(this);
+        mIsPrevNavModeGestures = ContextUtils.isGestureNavigationMode(mContext);
     }
 
     private void registerOneHandedState(OneHandedController oneHanded) {
@@ -589,6 +591,13 @@
      */
     private void sendInitialListenerUpdate() {
         if (mBubbleStateListener != null) {
+            boolean isCurrentNavModeGestures = ContextUtils.isGestureNavigationMode(mContext);
+            if (mIsPrevNavModeGestures && !isCurrentNavModeGestures) {
+                BubbleBarLocation navButtonsLocation = ContextUtils.isRtl(mContext)
+                        ? BubbleBarLocation.RIGHT : BubbleBarLocation.LEFT;
+                mBubblePositioner.setBubbleBarLocation(navButtonsLocation);
+            }
+            mIsPrevNavModeGestures = isCurrentNavModeGestures;
             BubbleBarUpdate update = mBubbleData.getInitialStateForBubbleBar();
             mBubbleStateListener.onBubbleStateChange(update);
         }
@@ -2001,6 +2010,10 @@
             // in bubble bar mode, let the request to show the expanded view come from launcher.
             // only collapse here if we're collapsing.
             if (mLayerView != null && !isExpanded) {
+                if (mBubblePositioner.isImeVisible()) {
+                    // If we're collapsing, hide the IME
+                    hideCurrentInputMethod();
+                }
                 mLayerView.collapse();
             }
         }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
index 2795881..35a0d07 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
@@ -61,7 +61,6 @@
 import android.view.ViewPropertyAnimator;
 import android.view.ViewTreeObserver;
 import android.view.WindowManager;
-import android.view.WindowManagerPolicyConstants;
 import android.view.accessibility.AccessibilityNodeInfo;
 import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
 import android.widget.FrameLayout;
@@ -91,10 +90,10 @@
 import com.android.wm.shell.bubbles.animation.StackAnimationController;
 import com.android.wm.shell.common.FloatingContentCoordinator;
 import com.android.wm.shell.common.ShellExecutor;
-import com.android.wm.shell.shared.bubbles.DismissView;
-import com.android.wm.shell.shared.bubbles.RelativeTouchListener;
 import com.android.wm.shell.shared.animation.Interpolators;
 import com.android.wm.shell.shared.animation.PhysicsAnimator;
+import com.android.wm.shell.shared.bubbles.DismissView;
+import com.android.wm.shell.shared.bubbles.RelativeTouchListener;
 import com.android.wm.shell.shared.magnetictarget.MagnetizedObject;
 
 import java.io.PrintWriter;
@@ -2276,7 +2275,7 @@
     void startMonitoringSwipeUpGesture() {
         stopMonitoringSwipeUpGestureInternal();
 
-        if (isGestureNavEnabled()) {
+        if (ContextUtils.isGestureNavigationMode(mContext)) {
             mBubblesNavBarGestureTracker = new BubblesNavBarGestureTracker(mContext, mPositioner);
             mBubblesNavBarGestureTracker.start(mSwipeUpListener);
             setOnTouchListener(mContainerSwipeListener);
@@ -2311,12 +2310,6 @@
         }
     }
 
-    private boolean isGestureNavEnabled() {
-        return mContext.getResources().getInteger(
-                com.android.internal.R.integer.config_navBarInteractionMode)
-                == WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
-    }
-
     /**
      * Stop monitoring for swipe up gesture
      */
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
index 3982a23..39fb2f49 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
@@ -21,11 +21,10 @@
 import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES;
 import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_BUBBLES;
+import static com.android.wm.shell.shared.bubbles.FlyoutDrawableLoader.loadFlyoutDrawable;
 
-import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.Context;
-import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ShortcutInfo;
@@ -34,7 +33,6 @@
 import android.graphics.Matrix;
 import android.graphics.Path;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
 import android.util.Log;
 import android.util.PathParser;
 import android.view.LayoutInflater;
@@ -51,7 +49,6 @@
 import com.android.wm.shell.shared.handles.RegionSamplingHelper;
 
 import java.lang.ref.WeakReference;
-import java.util.Objects;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -274,7 +271,7 @@
         @Nullable BubbleExpandedView expandedView;
         int dotColor;
         Path dotPath;
-        @Nullable Bubble.FlyoutMessage flyoutMessage;
+        Bubble.FlyoutMessage flyoutMessage;
         Bitmap bubbleBitmap;
         Bitmap badgeBitmap;
 
@@ -300,6 +297,10 @@
                 return null;
             }
 
+            // set the flyout message but don't load the avatar because we can't pass it on the
+            // binder to launcher
+            info.flyoutMessage = b.getFlyoutMessage();
+
             return info;
         }
 
@@ -336,7 +337,7 @@
             info.flyoutMessage = b.getFlyoutMessage();
             if (info.flyoutMessage != null) {
                 info.flyoutMessage.senderAvatar =
-                        loadSenderAvatar(c, info.flyoutMessage.senderIcon);
+                        loadFlyoutDrawable(info.flyoutMessage.senderIcon, c);
             }
             return info;
         }
@@ -418,21 +419,4 @@
                 Color.WHITE, WHITE_SCRIM_ALPHA);
         return true;
     }
-
-    @Nullable
-    static Drawable loadSenderAvatar(@NonNull final Context context, @Nullable final Icon icon) {
-        Objects.requireNonNull(context);
-        if (icon == null) return null;
-        try {
-            if (icon.getType() == Icon.TYPE_URI
-                    || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {
-                context.grantUriPermission(context.getPackageName(),
-                        icon.getUri(), Intent.FLAG_GRANT_READ_URI_PERMISSION);
-            }
-            return icon.loadDrawable(context);
-        } catch (Exception e) {
-            Log.w(TAG, "loadSenderAvatar failed: " + e.getMessage());
-            return null;
-        }
-    }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTaskLegacy.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTaskLegacy.java
index 1b7bb0d..e9a5933 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTaskLegacy.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTaskLegacy.java
@@ -20,11 +20,10 @@
 import static com.android.wm.shell.bubbles.BadgedImageView.WHITE_SCRIM_ALPHA;
 import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES;
 import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME;
+import static com.android.wm.shell.shared.bubbles.FlyoutDrawableLoader.loadFlyoutDrawable;
 
-import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.Context;
-import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ShortcutInfo;
@@ -33,7 +32,6 @@
 import android.graphics.Matrix;
 import android.graphics.Path;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
 import android.os.AsyncTask;
 import android.util.Log;
 import android.util.PathParser;
@@ -50,7 +48,6 @@
 import com.android.wm.shell.shared.handles.RegionSamplingHelper;
 
 import java.lang.ref.WeakReference;
-import java.util.Objects;
 import java.util.concurrent.Executor;
 
 /**
@@ -181,7 +178,7 @@
         @Nullable BubbleExpandedView expandedView;
         int dotColor;
         Path dotPath;
-        @Nullable Bubble.FlyoutMessage flyoutMessage;
+        Bubble.FlyoutMessage flyoutMessage;
         Bitmap bubbleBitmap;
         Bitmap badgeBitmap;
 
@@ -221,6 +218,10 @@
                 return null;
             }
 
+            // set the flyout message but don't load the avatar because we can't pass it on the
+            // binder to launcher
+            info.flyoutMessage = b.getFlyoutMessage();
+
             return info;
         }
 
@@ -260,7 +261,7 @@
             info.flyoutMessage = b.getFlyoutMessage();
             if (info.flyoutMessage != null) {
                 info.flyoutMessage.senderAvatar =
-                        loadSenderAvatar(c, info.flyoutMessage.senderIcon);
+                        loadFlyoutDrawable(info.flyoutMessage.senderIcon, c);
             }
             return info;
         }
@@ -342,21 +343,4 @@
                 Color.WHITE, WHITE_SCRIM_ALPHA);
         return true;
     }
-
-    @Nullable
-    static Drawable loadSenderAvatar(@NonNull final Context context, @Nullable final Icon icon) {
-        Objects.requireNonNull(context);
-        if (icon == null) return null;
-        try {
-            if (icon.getType() == Icon.TYPE_URI
-                    || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {
-                context.grantUriPermission(context.getPackageName(),
-                        icon.getUri(), Intent.FLAG_GRANT_READ_URI_PERMISSION);
-            }
-            return icon.loadDrawable(context);
-        } catch (Exception e) {
-            Log.w(TAG, "loadSenderAvatar failed: " + e.getMessage());
-            return null;
-        }
-    }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/ContextUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/ContextUtils.kt
new file mode 100644
index 0000000..0b36f45
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/ContextUtils.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.bubbles
+
+import android.content.Context
+import android.view.View
+import android.view.WindowManagerPolicyConstants
+import com.android.internal.R
+
+/** Simplifies accessing context fields. */
+object ContextUtils {
+
+    /** Gets navigation mode. */
+    @JvmStatic
+    val Context.navigationMode: Int
+        get() = resources.getInteger(R.integer.config_navBarInteractionMode)
+
+    /** Returns whether the navigation mode is gestures. */
+    @JvmStatic
+    val Context.isGestureNavigationMode: Boolean
+        get() = navigationMode == WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL
+
+    /** Returns whether layout direction is rtl. */
+    @JvmStatic
+    val Context.isRtl: Boolean
+        get() = resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java
index ec235a5..2a90017 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java
@@ -353,6 +353,11 @@
         if (isDragging != mIsDragging) {
             mIsDragging = isDragging;
             updateSamplingState();
+
+            if (isDragging && mPositioner.isImeVisible()) {
+                // Hide the IME when dragging begins
+                mManager.hideCurrentInputMethod();
+            }
         }
     }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java
index c4082d9..38087c0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java
@@ -157,6 +157,14 @@
         }
     }
 
+    private void dispatchImeRequested(int displayId, boolean isRequested) {
+        synchronized (mPositionProcessors) {
+            for (ImePositionProcessor pp : mPositionProcessors) {
+                pp.onImeRequested(displayId, isRequested);
+            }
+        }
+    }
+
     @ImePositionProcessor.ImeAnimationFlags
     private int dispatchStartPositioning(int displayId, int hiddenTop, int shownTop,
             boolean show, boolean isFloating, SurfaceControl.Transaction t) {
@@ -398,11 +406,15 @@
         public void setImeInputTargetRequestedVisibility(boolean visible) {
             if (android.view.inputmethod.Flags.refactorInsetsController()) {
                 mImeRequestedVisible = visible;
+                dispatchImeRequested(mDisplayId, mImeRequestedVisible);
+
                 // In the case that the IME becomes visible, but we have the control with leash
                 // already (e.g., when focussing an editText in activity B, while and editText in
                 // activity A is focussed), we will not get a call of #insetsControlChanged, and
                 // therefore have to start the show animation from here
                 startAnimation(mImeRequestedVisible /* show */, false /* forceRestart */);
+
+                setVisibleDirectly(mImeRequestedVisible || mAnimation != null);
             }
         }
 
@@ -444,6 +456,8 @@
             if (imeSource == null || mImeSourceControl == null) {
                 return;
             }
+            // TODO(b/353463205): For hide: this still has the statsToken from the previous show
+            //  request
             final var statsToken = mImeSourceControl.getImeStatsToken();
 
             startAnimation(show, forceRestart, statsToken);
@@ -540,6 +554,10 @@
                     show ? ANIMATION_DURATION_SHOW_MS : ANIMATION_DURATION_HIDE_MS);
             if (seek) {
                 mAnimation.setCurrentFraction((seekValue - startY) / (endY - startY));
+            } else {
+                // In some cases the value in onAnimationStart is zero, therefore setting it
+                // explicitly to startY
+                mAnimation.setCurrentFraction(0);
             }
 
             mAnimation.addUpdateListener(animation -> {
@@ -621,6 +639,9 @@
                                 ImeTracker.PHASE_WM_ANIMATION_RUNNING);
                         t.hide(animatingLeash);
                         removeImeSurface(mDisplayId);
+                        if (android.view.inputmethod.Flags.refactorInsetsController()) {
+                            setVisibleDirectly(false /* visible */);
+                        }
                         ImeTracker.forLogging().onHidden(mStatsToken);
                     } else if (mAnimationDirection == DIRECTION_SHOW && !mCancelled) {
                         ImeTracker.forLogging().onShown(mStatsToken);
@@ -645,13 +666,13 @@
                     animatingControl.release(SurfaceControl::release);
                 }
             });
-            if (!show) {
+            if (!android.view.inputmethod.Flags.refactorInsetsController() && !show) {
                 // When going away, queue up insets change first, otherwise any bounds changes
                 // can have a "flicker" of ime-provided insets.
                 setVisibleDirectly(false /* visible */);
             }
             mAnimation.start();
-            if (show) {
+            if (!android.view.inputmethod.Flags.refactorInsetsController() && show) {
                 // When showing away, queue up insets change last, otherwise any bounds changes
                 // can have a "flicker" of ime-provided insets.
                 setVisibleDirectly(true /* visible */);
@@ -697,6 +718,14 @@
         }
 
         /**
+         * Called when the IME was requested by an app
+         *
+         * @param isRequested {@code true} if the IME was requested to be visible
+         */
+        default void onImeRequested(int displayId, boolean isRequested) {
+        }
+
+        /**
          * Called when the IME position is starting to animate.
          *
          * @param hiddenTop  The y position of the top of the IME surface when it is hidden.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipUtils.kt
index 7070ce9..b3491ba 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipUtils.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipUtils.kt
@@ -22,6 +22,7 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.pm.PackageManager
+import android.graphics.PointF
 import android.graphics.Rect
 import android.os.RemoteException
 import android.util.DisplayMetrics
@@ -29,10 +30,13 @@
 import android.util.Pair
 import android.util.TypedValue
 import android.window.TaskSnapshot
+import android.window.TransitionInfo
 import com.android.internal.protolog.ProtoLog
 import com.android.wm.shell.Flags
 import com.android.wm.shell.protolog.ShellProtoLogGroup
 import kotlin.math.abs
+import kotlin.math.ceil
+import kotlin.math.floor
 import kotlin.math.roundToInt
 
 /** A class that includes convenience methods.  */
@@ -163,6 +167,84 @@
         return Rect(left, top, left + width, top + height)
     }
 
+    /**
+     * Temporary rounding "outward" (ie. -1.2 -> -2) used for crop since it is an int. We lean
+     * outward since, usually, child surfaces are, themselves, cropped, so we'd prefer to avoid
+     * inadvertently cutting out content that would otherwise be visible.
+     */
+    private fun roundOut(`val`: Float): Int {
+        return (if (`val` >= 0f) ceil(`val`) else floor(`val`)).toInt()
+    }
+
+    /**
+     * Calculates the transform and crop to apply on a Task surface in order for the config-at-end
+     * activity inside it (original-size activity transformed to match it's hint rect to the final
+     * Task bounds) to occupy the same world-space position/dimensions as it had before the
+     * transition.
+     *
+     * Usage example:
+     *     calcStartTransform(pipChange, scale, pos, crop);
+     *     t.setScale(pipChange.getLeash(), scale.x, scale.y);
+     *     t.setPosition(pipChange.getLeash(), pos.x, pos.y);
+     *     t.setCrop(pipChange.getLeash(), crop);
+     */
+    @JvmStatic
+    fun calcStartTransform(pipChange: TransitionInfo.Change, outScale: PointF,
+        outPos: PointF, outCrop: Rect) {
+        val startBounds = pipChange.startAbsBounds
+        val taskEndBounds = pipChange.endAbsBounds
+        // For now, pip activity bounds always matches task bounds. If this ever changes, we'll
+        // need to get the activity offset.
+        val endBounds = taskEndBounds
+        var hintRect = pipChange.taskInfo?.pictureInPictureParams?.sourceRectHint
+        if (hintRect == null) {
+            hintRect = Rect(startBounds)
+            hintRect.offsetTo(0, 0)
+        }
+
+        // FA = final activity bounds (absolute)
+        // FT = final task bounds (absolute)
+        // SA = start activity bounds (absolute)
+        // H = source hint (relative to start activity bounds)
+        // We want to transform the activity so that when the task is at FT, H overlaps with FA
+
+        // The scaling which takes the hint rect (H) in SA and matches it to FA
+        val hintToEndScaleX = (endBounds.width().toFloat()) / (hintRect.width().toFloat())
+        val hintToEndScaleY = (endBounds.height().toFloat()) / (hintRect.height().toFloat())
+
+        // We want to set the transform on the END TASK surface to put the start activity
+        // back to where it was.
+        // First do backwards scale (which takes FA back to H)
+        val endToHintScaleX = 1f / hintToEndScaleX
+        val endToHintScaleY = 1f / hintToEndScaleY
+        // Then top-left needs to place FA (relative to the FT) at H (relative to SA):
+        //   so -(FA.tl - FT.tl) + SA.tl + H.tl
+        //  but we have scaled up the task, so anything that was "within" the task needs to
+        //  be scaled:
+        //   so -(FA.tl - FT.tl)*endToHint + SA.tl + H.tl
+        val endTaskPosForStartX = (-(endBounds.left - taskEndBounds.left) * endToHintScaleX
+                + startBounds.left + hintRect.left)
+        val endTaskPosForStartY = (-(endBounds.top - taskEndBounds.top) * endToHintScaleY
+                + startBounds.top + hintRect.top)
+        outScale[endToHintScaleX] = endToHintScaleY
+        outPos[endTaskPosForStartX] = endTaskPosForStartY
+
+        // now need to set crop to reveal the non-hint stuff. Again, hintrect is relative, so
+        // we must apply outsets to reveal the *activity* content which is *inside* the task
+        // and thus is scaled (ie. if activity is scaled down, each task-level pixel exposes
+        // >1 activity-level pixels)
+        // For example, the topleft crop would be:
+        //   (FA.tl - FT.tl) - H.tl * hintToEnd
+        //    ^ activity within task
+        // bottomright can just use scaled activity size
+        //   tl + scale(SA.size, hintToEnd)
+        outCrop.left = roundOut((endBounds.left - taskEndBounds.left)
+                - hintRect.left * hintToEndScaleX)
+        outCrop.top = roundOut((endBounds.top - taskEndBounds.top) - hintRect.top * hintToEndScaleY)
+        outCrop.right = roundOut(outCrop.left + startBounds.width() * hintToEndScaleX)
+        outCrop.bottom = roundOut(outCrop.top + startBounds.height() * hintToEndScaleY)
+    }
+
     private var isPip2ExperimentEnabled: Boolean? = null
 
     /**
@@ -181,4 +263,4 @@
         }
         return isPip2ExperimentEnabled as Boolean
     }
-}
\ No newline at end of file
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java
index f7f45ae..9f100fa 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java
@@ -19,9 +19,9 @@
 import static android.view.WindowManager.DOCKED_LEFT;
 import static android.view.WindowManager.DOCKED_RIGHT;
 
-import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_30_70;
-import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_50_50;
-import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_70_30;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_33_66;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_66_33;
 import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_END_AND_DISMISS;
 import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_MINIMIZE;
 import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_NONE;
@@ -283,10 +283,10 @@
 
     private void addNonDismissingTargets(boolean isHorizontalDivision, int topPosition,
             int bottomPosition, int dividerMax) {
-        maybeAddTarget(topPosition, topPosition - getStartInset(), SNAP_TO_30_70);
+        maybeAddTarget(topPosition, topPosition - getStartInset(), SNAP_TO_2_33_66);
         addMiddleTarget(isHorizontalDivision);
         maybeAddTarget(bottomPosition,
-                dividerMax - getEndInset() - (bottomPosition + mDividerSize), SNAP_TO_70_30);
+                dividerMax - getEndInset() - (bottomPosition + mDividerSize), SNAP_TO_2_66_33);
     }
 
     private void addFixedDivisionTargets(boolean isHorizontalDivision, int dividerMax) {
@@ -332,7 +332,7 @@
     private void addMiddleTarget(boolean isHorizontalDivision) {
         int position = DockedDividerUtils.calculateMiddlePosition(isHorizontalDivision,
                 mInsets, mDisplayWidth, mDisplayHeight, mDividerSize);
-        mTargets.add(new SnapTarget(position, SNAP_TO_50_50));
+        mTargets.add(new SnapTarget(position, SNAP_TO_2_50_50));
     }
 
     private void addMinimizedTarget(boolean isHorizontalDivision, int dockedSide) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
index 4b55fd0..83ffaf4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
@@ -1106,6 +1106,11 @@
         default void onDoubleTappedDivider() {
         }
 
+        /**
+         * Sets the excludedInsetsTypes for the IME in the root WindowContainer.
+         */
+        void setExcludeImeInsets(boolean exclude);
+
         /** Returns split position of the token. */
         @SplitPosition
         int getSplitItemPosition(WindowContainerToken token);
@@ -1305,6 +1310,14 @@
         }
 
         @Override
+        public void onImeRequested(int displayId, boolean isRequested) {
+            if (displayId != mDisplayId) return;
+            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "IME was set to requested=%s",
+                    isRequested);
+            mSplitLayoutHandler.setExcludeImeInsets(true);
+        }
+
+        @Override
         public int onImeStartPositioning(int displayId, int hiddenTop, int shownTop,
                 boolean showing, boolean isFloating, SurfaceControl.Transaction t) {
             if (displayId != mDisplayId || !mInitialized) {
@@ -1356,6 +1369,12 @@
             setDividerInteractive(!mImeShown || !mHasImeFocus || isFloating, true,
                     "onImeStartPositioning");
 
+            if (android.view.inputmethod.Flags.refactorInsetsController()) {
+                if (mImeShown) {
+                    mSplitLayoutHandler.setExcludeImeInsets(false);
+                }
+            }
+
             return mTargetYOffset != mLastYOffset ? IME_ANIMATION_NO_ALPHA : 0;
         }
 
@@ -1374,6 +1393,16 @@
                     "Split IME animation ending, canceled=%b", cancel);
             onProgress(1.0f);
             mSplitLayoutHandler.onLayoutPositionChanging(SplitLayout.this);
+            if (android.view.inputmethod.Flags.refactorInsetsController()) {
+                if (!mImeShown) {
+                    // The IME hide animation is started immediately and at that point, the IME
+                    // insets are not yet set to hidden. Therefore only resetting the
+                    // excludedTypes at the end of the animation. Note: InsetsPolicy will only
+                    // set the IME height to zero, when it is visible. When it becomes invisible,
+                    // we dispatch the insets (the height there is zero as well)
+                    mSplitLayoutHandler.setExcludeImeInsets(false);
+                }
+            }
         }
 
         @Override
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
index bec2ea5..2a5a519 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
@@ -87,7 +87,7 @@
 import com.android.wm.shell.compatui.impl.DefaultCompatUIRepository;
 import com.android.wm.shell.compatui.impl.DefaultComponentIdGenerator;
 import com.android.wm.shell.desktopmode.DesktopMode;
-import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
+import com.android.wm.shell.desktopmode.DesktopRepository;
 import com.android.wm.shell.desktopmode.DesktopTasksController;
 import com.android.wm.shell.displayareahelper.DisplayAreaHelper;
 import com.android.wm.shell.displayareahelper.DisplayAreaHelperController;
@@ -123,6 +123,7 @@
 import com.android.wm.shell.taskview.TaskViewFactory;
 import com.android.wm.shell.taskview.TaskViewFactoryController;
 import com.android.wm.shell.taskview.TaskViewTransitions;
+import com.android.wm.shell.transition.FocusTransitionObserver;
 import com.android.wm.shell.transition.HomeTransitionObserver;
 import com.android.wm.shell.transition.MixedTransitionHandler;
 import com.android.wm.shell.transition.Transitions;
@@ -266,7 +267,7 @@
             Lazy<CompatUIShellCommandHandler> compatUIShellCommandHandler,
             Lazy<AccessibilityManager> accessibilityManager,
             CompatUIRepository compatUIRepository,
-            Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
+            Optional<DesktopRepository> desktopRepository,
             @NonNull CompatUIState compatUIState,
             @NonNull CompatUIComponentIdGenerator componentIdGenerator,
             @NonNull CompatUIComponentFactory compatUIComponentFactory,
@@ -280,7 +281,7 @@
                             componentIdGenerator, compatUIComponentFactory, mainExecutor));
         }
         final IntPredicate inDesktopModePredicate =
-                desktopModeTaskRepository.<IntPredicate>map(modeTaskRepository -> displayId ->
+                desktopRepository.<IntPredicate>map(modeTaskRepository -> displayId ->
                         modeTaskRepository.getVisibleTaskCount(displayId) > 0)
                             .orElseGet(() -> displayId -> false);
         return Optional.of(
@@ -706,14 +707,14 @@
             ShellCommandHandler shellCommandHandler,
             TaskStackListenerImpl taskStackListener,
             ActivityTaskManager activityTaskManager,
-            Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
+            Optional<DesktopRepository> desktopRepository,
             TaskStackTransitionObserver taskStackTransitionObserver,
             @ShellMainThread ShellExecutor mainExecutor
     ) {
         return Optional.ofNullable(
                 RecentTasksController.create(context, shellInit, shellController,
                         shellCommandHandler, taskStackListener, activityTaskManager,
-                        desktopModeTaskRepository, taskStackTransitionObserver, mainExecutor));
+                        desktopRepository, taskStackTransitionObserver, mainExecutor));
     }
 
     @BindsOptionalOf
@@ -742,14 +743,15 @@
             @ShellMainThread Handler mainHandler,
             @ShellAnimationThread ShellExecutor animExecutor,
             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
-            HomeTransitionObserver homeTransitionObserver) {
+            HomeTransitionObserver homeTransitionObserver,
+            FocusTransitionObserver focusTransitionObserver) {
         if (!context.getResources().getBoolean(R.bool.config_registerShellTransitionsOnInit)) {
             // TODO(b/238217847): Force override shell init if registration is disabled
             shellInit = new ShellInit(mainExecutor);
         }
         return new Transitions(context, shellInit, shellCommandHandler, shellController, organizer,
                 pool, displayController, mainExecutor, mainHandler, animExecutor,
-                rootTaskDisplayAreaOrganizer, homeTransitionObserver);
+                rootTaskDisplayAreaOrganizer, homeTransitionObserver, focusTransitionObserver);
     }
 
     @WMSingleton
@@ -761,6 +763,12 @@
 
     @WMSingleton
     @Provides
+    static FocusTransitionObserver provideFocusTransitionObserver() {
+        return new FocusTransitionObserver();
+    }
+
+    @WMSingleton
+    @Provides
     static TaskViewTransitions provideTaskViewTransitions(Transitions transitions) {
         return new TaskViewTransitions(transitions);
     }
@@ -995,16 +1003,16 @@
 
     @BindsOptionalOf
     @DynamicOverride
-    abstract DesktopModeTaskRepository optionalDesktopModeTaskRepository();
+    abstract DesktopRepository optionalDesktopRepository();
 
     @WMSingleton
     @Provides
-    static Optional<DesktopModeTaskRepository> provideDesktopTaskRepository(Context context,
-            @DynamicOverride Optional<Lazy<DesktopModeTaskRepository>> desktopModeTaskRepository) {
+    static Optional<DesktopRepository> provideDesktopRepository(Context context,
+            @DynamicOverride Optional<Lazy<DesktopRepository>> desktopRepository) {
         // Use optional-of-lazy for the dependency that this provider relies on.
         // Lazy ensures that this provider will not be the cause the dependency is created
         // when it will not be returned due to the condition below.
-        return desktopModeTaskRepository.flatMap((lazy) -> {
+        return desktopRepository.flatMap((lazy) -> {
             if (DesktopModeStatus.canEnterDesktopMode(context)) {
                 return Optional.of(lazy.get());
             }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
index 96a0775..79c31e0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
@@ -16,6 +16,7 @@
 
 package com.android.wm.shell.dagger;
 
+import static android.window.flags.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS;
 import static android.window.flags.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_TASK_LIMIT;
 
 import android.annotation.Nullable;
@@ -28,6 +29,8 @@
 import android.view.IWindowManager;
 import android.view.WindowManager;
 
+import androidx.annotation.OptIn;
+
 import com.android.internal.jank.InteractionJankMonitor;
 import com.android.internal.logging.UiEventLogger;
 import com.android.internal.statusbar.IStatusBarService;
@@ -59,15 +62,19 @@
 import com.android.wm.shell.common.TaskStackListenerImpl;
 import com.android.wm.shell.dagger.back.ShellBackAnimationModule;
 import com.android.wm.shell.dagger.pip.PipModule;
+import com.android.wm.shell.desktopmode.CloseDesktopTaskTransitionHandler;
 import com.android.wm.shell.desktopmode.DefaultDragToDesktopTransitionHandler;
 import com.android.wm.shell.desktopmode.DesktopActivityOrientationChangeHandler;
+import com.android.wm.shell.desktopmode.DesktopFullImmersiveTransitionHandler;
+import com.android.wm.shell.desktopmode.DesktopMixedTransitionHandler;
 import com.android.wm.shell.desktopmode.DesktopModeDragAndDropTransitionHandler;
 import com.android.wm.shell.desktopmode.DesktopModeEventLogger;
 import com.android.wm.shell.desktopmode.DesktopModeLoggerTransitionObserver;
-import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
+import com.android.wm.shell.desktopmode.DesktopRepository;
 import com.android.wm.shell.desktopmode.DesktopTasksController;
 import com.android.wm.shell.desktopmode.DesktopTasksLimiter;
 import com.android.wm.shell.desktopmode.DesktopTasksTransitionObserver;
+import com.android.wm.shell.desktopmode.DesktopTaskChangeListener;
 import com.android.wm.shell.desktopmode.DragToDesktopTransitionHandler;
 import com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler;
 import com.android.wm.shell.desktopmode.ExitDesktopTaskTransitionHandler;
@@ -85,6 +92,9 @@
 import com.android.wm.shell.freeform.FreeformTaskListener;
 import com.android.wm.shell.freeform.FreeformTaskTransitionHandler;
 import com.android.wm.shell.freeform.FreeformTaskTransitionObserver;
+import com.android.wm.shell.freeform.TaskChangeListener;
+import com.android.wm.shell.freeform.FreeformTaskTransitionStarter;
+import com.android.wm.shell.freeform.FreeformTaskTransitionStarterInitializer;
 import com.android.wm.shell.keyguard.KeyguardTransitionHandler;
 import com.android.wm.shell.onehanded.OneHandedController;
 import com.android.wm.shell.pip.PipTransitionController;
@@ -116,6 +126,8 @@
 import com.android.wm.shell.windowdecor.CaptionWindowDecorViewModel;
 import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel;
 import com.android.wm.shell.windowdecor.WindowDecorViewModel;
+import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalSystemViewContainer;
+import com.android.wm.shell.windowdecor.education.DesktopWindowingEducationTooltipController;
 
 import dagger.Binds;
 import dagger.Lazy;
@@ -123,6 +135,8 @@
 import dagger.Provides;
 
 import kotlinx.coroutines.CoroutineScope;
+import kotlinx.coroutines.ExperimentalCoroutinesApi;
+import kotlinx.coroutines.MainCoroutineDispatcher;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -234,6 +248,7 @@
             IWindowManager windowManager,
             ShellCommandHandler shellCommandHandler,
             ShellTaskOrganizer taskOrganizer,
+            @DynamicOverride DesktopRepository desktopRepository,
             DisplayController displayController,
             ShellController shellController,
             DisplayInsetsController displayInsetsController,
@@ -246,6 +261,7 @@
             AssistContentRequester assistContentRequester,
             MultiInstanceHelper multiInstanceHelper,
             Optional<DesktopTasksLimiter> desktopTasksLimiter,
+            AppHandleEducationController appHandleEducationController,
             WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository,
             Optional<DesktopActivityOrientationChangeHandler> desktopActivityOrientationHandler) {
         if (DesktopModeStatus.canEnterDesktopMode(context)) {
@@ -259,6 +275,7 @@
                     shellCommandHandler,
                     windowManager,
                     taskOrganizer,
+                    desktopRepository,
                     displayController,
                     shellController,
                     displayInsetsController,
@@ -271,6 +288,7 @@
                     assistContentRequester,
                     multiInstanceHelper,
                     desktopTasksLimiter,
+                    appHandleEducationController,
                     windowDecorCaptionHandleRepository,
                     desktopActivityOrientationHandler);
         }
@@ -307,6 +325,11 @@
         return new AssistContentRequester(context, shellExecutor, bgExecutor);
     }
 
+    @Provides
+    static AdditionalSystemViewContainer.Factory provideAdditionalSystemViewContainerFactory() {
+        return new AdditionalSystemViewContainer.Factory();
+    }
+
     //
     // Freeform
     //
@@ -317,9 +340,13 @@
     static FreeformComponents provideFreeformComponents(
             FreeformTaskListener taskListener,
             FreeformTaskTransitionHandler transitionHandler,
-            FreeformTaskTransitionObserver transitionObserver) {
+            FreeformTaskTransitionObserver transitionObserver,
+            FreeformTaskTransitionStarterInitializer transitionStarterInitializer) {
         return new FreeformComponents(
-                taskListener, Optional.of(transitionHandler), Optional.of(transitionObserver));
+                taskListener,
+                Optional.of(transitionHandler),
+                Optional.of(transitionObserver),
+                Optional.of(transitionStarterInitializer));
     }
 
     @WMSingleton
@@ -328,7 +355,8 @@
             Context context,
             ShellInit shellInit,
             ShellTaskOrganizer shellTaskOrganizer,
-            Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
+            Optional<DesktopRepository> desktopRepository,
+            Optional<DesktopTasksController> desktopTasksController,
             LaunchAdjacentController launchAdjacentController,
             WindowDecorViewModel windowDecorViewModel) {
         // TODO(b/238217847): Temporarily add this check here until we can remove the dynamic
@@ -337,33 +365,22 @@
                 ? shellInit
                 : null;
         return new FreeformTaskListener(context, init, shellTaskOrganizer,
-                desktopModeTaskRepository, launchAdjacentController, windowDecorViewModel);
+                desktopRepository, desktopTasksController, launchAdjacentController,
+                windowDecorViewModel);
     }
 
     @WMSingleton
     @Provides
     static FreeformTaskTransitionHandler provideFreeformTaskTransitionHandler(
-            ShellInit shellInit,
             Transitions transitions,
-            Context context,
-            WindowDecorViewModel windowDecorViewModel,
             DisplayController displayController,
             @ShellMainThread ShellExecutor mainExecutor,
-            @ShellAnimationThread ShellExecutor animExecutor,
-            @DynamicOverride DesktopModeTaskRepository desktopModeTaskRepository,
-            InteractionJankMonitor interactionJankMonitor,
-            @ShellMainThread Handler handler) {
+            @ShellAnimationThread ShellExecutor animExecutor) {
         return new FreeformTaskTransitionHandler(
-                shellInit,
                 transitions,
-                context,
-                windowDecorViewModel,
                 displayController,
                 mainExecutor,
-                animExecutor,
-                desktopModeTaskRepository,
-                interactionJankMonitor,
-                handler);
+                animExecutor);
     }
 
     @WMSingleton
@@ -372,16 +389,35 @@
             Context context,
             ShellInit shellInit,
             Transitions transitions,
-            WindowDecorViewModel windowDecorViewModel) {
+            Optional<DesktopFullImmersiveTransitionHandler> desktopImmersiveTransitionHandler,
+            WindowDecorViewModel windowDecorViewModel,
+            Optional<TaskChangeListener> taskChangeListener) {
         return new FreeformTaskTransitionObserver(
-                context, shellInit, transitions, windowDecorViewModel);
+                context, shellInit, transitions, desktopImmersiveTransitionHandler,
+                windowDecorViewModel, taskChangeListener);
+    }
+
+    @WMSingleton
+    @Provides
+    static FreeformTaskTransitionStarterInitializer provideFreeformTaskTransitionStarterInitializer(
+            ShellInit shellInit,
+            WindowDecorViewModel windowDecorViewModel,
+            FreeformTaskTransitionHandler freeformTaskTransitionHandler,
+            Optional<DesktopMixedTransitionHandler> desktopMixedTransitionHandler) {
+        FreeformTaskTransitionStarter transitionStarter;
+        if (desktopMixedTransitionHandler.isPresent()) {
+            transitionStarter = desktopMixedTransitionHandler.get();
+        } else {
+            transitionStarter = freeformTaskTransitionHandler;
+        }
+        return new FreeformTaskTransitionStarterInitializer(shellInit, windowDecorViewModel,
+                transitionStarter);
     }
 
     //
     // One handed mode
     //
 
-
     // Needs the shell main handler for ContentObserver callbacks
     @WMSingleton
     @Provides
@@ -591,7 +627,8 @@
             DesktopModeDragAndDropTransitionHandler desktopModeDragAndDropTransitionHandler,
             ToggleResizeDesktopTaskTransitionHandler toggleResizeDesktopTaskTransitionHandler,
             DragToDesktopTransitionHandler dragToDesktopTransitionHandler,
-            @DynamicOverride DesktopModeTaskRepository desktopModeTaskRepository,
+            @DynamicOverride DesktopRepository desktopRepository,
+            Optional<DesktopFullImmersiveTransitionHandler> desktopFullImmersiveTransitionHandler,
             DesktopModeLoggerTransitionObserver desktopModeLoggerTransitionObserver,
             LaunchAdjacentController launchAdjacentController,
             RecentsTransitionHandler recentsTransitionHandler,
@@ -607,7 +644,8 @@
                 returnToDragStartAnimator, enterDesktopTransitionHandler,
                 exitDesktopTransitionHandler, desktopModeDragAndDropTransitionHandler,
                 toggleResizeDesktopTaskTransitionHandler,
-                dragToDesktopTransitionHandler, desktopModeTaskRepository,
+                dragToDesktopTransitionHandler, desktopFullImmersiveTransitionHandler.get(),
+                desktopRepository,
                 desktopModeLoggerTransitionObserver, launchAdjacentController,
                 recentsTransitionHandler, multiInstanceHelper, mainExecutor, desktopTasksLimiter,
                 recentTasksController.orElse(null), interactionJankMonitor, mainHandler);
@@ -615,10 +653,20 @@
 
     @WMSingleton
     @Provides
+    static Optional<TaskChangeListener> provideDesktopTaskChangeListener(Context context) {
+        if (Flags.enableWindowingTransitionHandlersObservers() &&
+                DesktopModeStatus.canEnterDesktopMode(context)) {
+            return Optional.of(new DesktopTaskChangeListener());
+        }
+        return Optional.empty();
+    }
+
+    @WMSingleton
+    @Provides
     static Optional<DesktopTasksLimiter> provideDesktopTasksLimiter(
             Context context,
             Transitions transitions,
-            @DynamicOverride DesktopModeTaskRepository desktopModeTaskRepository,
+            @DynamicOverride DesktopRepository desktopRepository,
             ShellTaskOrganizer shellTaskOrganizer,
             InteractionJankMonitor interactionJankMonitor,
             @ShellMainThread Handler handler) {
@@ -631,7 +679,7 @@
         return Optional.of(
                 new DesktopTasksLimiter(
                         transitions,
-                        desktopModeTaskRepository,
+                        desktopRepository,
                         shellTaskOrganizer,
                         maxTaskLimit,
                         interactionJankMonitor,
@@ -642,6 +690,19 @@
 
     @WMSingleton
     @Provides
+    static Optional<DesktopFullImmersiveTransitionHandler> provideDesktopImmersiveHandler(
+            Context context,
+            Transitions transitions,
+            @DynamicOverride DesktopRepository desktopRepository) {
+        if (DesktopModeStatus.canEnterDesktopMode(context)) {
+            return Optional.of(
+                    new DesktopFullImmersiveTransitionHandler(transitions, desktopRepository));
+        }
+        return Optional.empty();
+    }
+
+    @WMSingleton
+    @Provides
     static ReturnToDragStartAnimator provideReturnToDragStartAnimator(
             Context context, InteractionJankMonitor interactionJankMonitor) {
         return new ReturnToDragStartAnimator(context, interactionJankMonitor);
@@ -686,7 +747,17 @@
             InteractionJankMonitor interactionJankMonitor,
             @ShellMainThread Handler handler) {
         return new ExitDesktopTaskTransitionHandler(
-            transitions, context, interactionJankMonitor, handler);
+                transitions, context, interactionJankMonitor, handler);
+    }
+
+    @WMSingleton
+    @Provides
+    static CloseDesktopTaskTransitionHandler provideCloseDesktopTaskTransitionHandler(
+            Context context,
+            @ShellMainThread ShellExecutor mainExecutor,
+            @ShellAnimationThread ShellExecutor animExecutor
+    ) {
+        return new CloseDesktopTaskTransitionHandler(context, mainExecutor, animExecutor);
     }
 
     @WMSingleton
@@ -700,13 +771,14 @@
     @WMSingleton
     @Provides
     @DynamicOverride
-    static DesktopModeTaskRepository provideDesktopModeTaskRepository(
+
+    static DesktopRepository provideDesktopRepository(
             Context context,
             ShellInit shellInit,
             DesktopPersistentRepository desktopPersistentRepository,
             @ShellMainThread CoroutineScope mainScope
     ) {
-        return new DesktopModeTaskRepository(context, shellInit, desktopPersistentRepository,
+        return new DesktopRepository(context, shellInit, desktopPersistentRepository,
                 mainScope);
     }
 
@@ -718,12 +790,12 @@
             ShellTaskOrganizer shellTaskOrganizer,
             TaskStackListenerImpl taskStackListener,
             ToggleResizeDesktopTaskTransitionHandler toggleResizeDesktopTaskTransitionHandler,
-            @DynamicOverride DesktopModeTaskRepository desktopModeTaskRepository
+            @DynamicOverride DesktopRepository desktopRepository
     ) {
         if (DesktopModeStatus.canEnterDesktopMode(context)) {
             return Optional.of(new DesktopActivityOrientationChangeHandler(
                     context, shellInit, shellTaskOrganizer, taskStackListener,
-                    toggleResizeDesktopTaskTransitionHandler, desktopModeTaskRepository));
+                    toggleResizeDesktopTaskTransitionHandler, desktopRepository));
         }
         return Optional.empty();
     }
@@ -732,12 +804,12 @@
     @Provides
     static Optional<DesktopTasksTransitionObserver> provideDesktopTasksTransitionObserver(
             Context context,
-            Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
+            Optional<DesktopRepository> desktopRepository,
             Transitions transitions,
             ShellTaskOrganizer shellTaskOrganizer,
             ShellInit shellInit
     ) {
-        return desktopModeTaskRepository.flatMap(repository ->
+        return desktopRepository.flatMap(repository ->
                 Optional.of(new DesktopTasksTransitionObserver(
                         context, repository, transitions, shellTaskOrganizer, shellInit))
         );
@@ -745,6 +817,32 @@
 
     @WMSingleton
     @Provides
+    static Optional<DesktopMixedTransitionHandler> provideDesktopMixedTransitionHandler(
+            Context context,
+            Transitions transitions,
+            @DynamicOverride DesktopRepository desktopRepository,
+            FreeformTaskTransitionHandler freeformTaskTransitionHandler,
+            CloseDesktopTaskTransitionHandler closeDesktopTaskTransitionHandler,
+            InteractionJankMonitor interactionJankMonitor,
+            @ShellMainThread Handler handler
+    ) {
+        if (!DesktopModeStatus.canEnterDesktopMode(context)
+                || !ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS.isTrue()) {
+            return Optional.empty();
+        }
+        return Optional.of(
+                new DesktopMixedTransitionHandler(
+                        context,
+                        transitions,
+                        desktopRepository,
+                        freeformTaskTransitionHandler,
+                        closeDesktopTaskTransitionHandler,
+                        interactionJankMonitor,
+                        handler));
+    }
+
+    @WMSingleton
+    @Provides
     static DesktopModeLoggerTransitionObserver provideDesktopModeLoggerTransitionObserver(
             Context context,
             ShellInit shellInit,
@@ -783,13 +881,31 @@
 
     @WMSingleton
     @Provides
+    static DesktopWindowingEducationTooltipController
+            provideDesktopWindowingEducationTooltipController(
+            Context context,
+            AdditionalSystemViewContainer.Factory additionalSystemViewContainerFactory,
+            DisplayController displayController
+    ) {
+        return new DesktopWindowingEducationTooltipController(context,
+                additionalSystemViewContainerFactory, displayController);
+    }
+
+    @OptIn(markerClass = ExperimentalCoroutinesApi.class)
+    @WMSingleton
+    @Provides
     static AppHandleEducationController provideAppHandleEducationController(
+            Context context,
             AppHandleEducationFilter appHandleEducationFilter,
-            ShellTaskOrganizer shellTaskOrganizer,
             AppHandleEducationDatastoreRepository appHandleEducationDatastoreRepository,
-            @ShellMainThread CoroutineScope applicationScope) {
-        return new AppHandleEducationController(appHandleEducationFilter,
-                shellTaskOrganizer, appHandleEducationDatastoreRepository, applicationScope);
+            WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository,
+            DesktopWindowingEducationTooltipController desktopWindowingEducationTooltipController,
+            @ShellMainThread CoroutineScope applicationScope, @ShellBackgroundThread
+            MainCoroutineDispatcher backgroundDispatcher) {
+        return new AppHandleEducationController(context, appHandleEducationFilter,
+                appHandleEducationDatastoreRepository, windowDecorCaptionHandleRepository,
+                desktopWindowingEducationTooltipController, applicationScope,
+                backgroundDispatcher);
     }
 
     @WMSingleton
@@ -841,8 +957,7 @@
     @Provides
     static Object provideIndependentShellComponentsToCreate(
             DragAndDropController dragAndDropController,
-            Optional<DesktopTasksTransitionObserver> desktopTasksTransitionObserverOptional,
-            AppHandleEducationController appHandleEducationController
+            Optional<DesktopTasksTransitionObserver> desktopTasksTransitionObserverOptional
     ) {
         return new Object();
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java
index 3464fef..3508ece 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java
@@ -77,10 +77,12 @@
             PipTaskListener pipTaskListener,
             @NonNull PipScheduler pipScheduler,
             @NonNull PipTransitionState pipStackListenerController,
+            @NonNull PipDisplayLayoutState pipDisplayLayoutState,
             @NonNull PipUiStateChangeController pipUiStateChangeController) {
         return new PipTransition(context, shellInit, shellTaskOrganizer, transitions,
                 pipBoundsState, null, pipBoundsAlgorithm, pipTaskListener,
-                pipScheduler, pipStackListenerController, pipUiStateChangeController);
+                pipScheduler, pipStackListenerController, pipDisplayLayoutState,
+                pipUiStateChangeController);
     }
 
     @WMSingleton
@@ -125,11 +127,9 @@
     @Provides
     static PipScheduler providePipScheduler(Context context,
             PipBoundsState pipBoundsState,
-            PhonePipMenuController pipMenuController,
             @ShellMainThread ShellExecutor mainExecutor,
             PipTransitionState pipTransitionState) {
-        return new PipScheduler(context, pipBoundsState, pipMenuController,
-                mainExecutor, pipTransitionState);
+        return new PipScheduler(context, pipBoundsState, mainExecutor, pipTransitionState);
     }
 
     @WMSingleton
@@ -138,10 +138,13 @@
             PipBoundsState pipBoundsState, PipMediaController pipMediaController,
             SystemWindows systemWindows,
             PipUiEventLogger pipUiEventLogger,
+            PipTaskListener pipTaskListener,
+            @NonNull PipTransitionState pipTransitionState,
             @ShellMainThread ShellExecutor mainExecutor,
             @ShellMainThread Handler mainHandler) {
         return new PhonePipMenuController(context, pipBoundsState, pipMediaController,
-                systemWindows, pipUiEventLogger, mainExecutor, mainHandler);
+                systemWindows, pipUiEventLogger, pipTaskListener, pipTransitionState, mainExecutor,
+                mainHandler);
     }
 
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandler.kt
new file mode 100644
index 0000000..a16c15df
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandler.kt
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.desktopmode
+
+import android.animation.Animator
+import android.animation.AnimatorSet
+import android.animation.RectEvaluator
+import android.animation.ValueAnimator
+import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
+import android.content.Context
+import android.graphics.Rect
+import android.os.IBinder
+import android.util.TypedValue
+import android.view.SurfaceControl.Transaction
+import android.view.WindowManager
+import android.window.TransitionInfo
+import android.window.TransitionRequestInfo
+import android.window.WindowContainerTransaction
+import androidx.core.animation.addListener
+import com.android.app.animation.Interpolators
+import com.android.wm.shell.common.ShellExecutor
+import com.android.wm.shell.transition.Transitions
+import java.util.function.Supplier
+
+/** The [Transitions.TransitionHandler] that handles transitions for closing desktop mode tasks. */
+class CloseDesktopTaskTransitionHandler
+@JvmOverloads
+constructor(
+    private val context: Context,
+    private val mainExecutor: ShellExecutor,
+    private val animExecutor: ShellExecutor,
+    private val transactionSupplier: Supplier<Transaction> = Supplier { Transaction() },
+) : Transitions.TransitionHandler {
+
+    private val runningAnimations = mutableMapOf<IBinder, List<Animator>>()
+
+    /** Returns null, as it only handles transitions started from Shell. */
+    override fun handleRequest(
+        transition: IBinder,
+        request: TransitionRequestInfo,
+    ): WindowContainerTransaction? = null
+
+    override fun startAnimation(
+        transition: IBinder,
+        info: TransitionInfo,
+        startTransaction: Transaction,
+        finishTransaction: Transaction,
+        finishCallback: Transitions.TransitionFinishCallback,
+    ): Boolean {
+        if (info.type != WindowManager.TRANSIT_CLOSE) return false
+        val animations = mutableListOf<Animator>()
+        val onAnimFinish: (Animator) -> Unit = { animator ->
+            mainExecutor.execute {
+                // Animation completed
+                animations.remove(animator)
+                if (animations.isEmpty()) {
+                    // All animations completed, finish the transition
+                    runningAnimations.remove(transition)
+                    finishCallback.onTransitionFinished(/* wct= */ null)
+                }
+            }
+        }
+        animations +=
+            info.changes
+                .filter {
+                    it.mode == WindowManager.TRANSIT_CLOSE &&
+                        it.taskInfo?.windowingMode == WINDOWING_MODE_FREEFORM
+                }
+                .map { createCloseAnimation(it, finishTransaction, onAnimFinish) }
+        if (animations.isEmpty()) return false
+        runningAnimations[transition] = animations
+        animExecutor.execute { animations.forEach(Animator::start) }
+        return true
+    }
+
+    private fun createCloseAnimation(
+        change: TransitionInfo.Change,
+        finishTransaction: Transaction,
+        onAnimFinish: (Animator) -> Unit,
+    ): Animator {
+        finishTransaction.hide(change.leash)
+        return AnimatorSet().apply {
+            playTogether(createBoundsCloseAnimation(change), createAlphaCloseAnimation(change))
+            addListener(onEnd = onAnimFinish)
+        }
+    }
+
+    private fun createBoundsCloseAnimation(change: TransitionInfo.Change): Animator {
+        val startBounds = change.startAbsBounds
+        val endBounds =
+            Rect(startBounds).apply {
+                // Scale the end bounds of the window down with an anchor in the center
+                inset(
+                    (startBounds.width().toFloat() * (1 - CLOSE_ANIM_SCALE) / 2).toInt(),
+                    (startBounds.height().toFloat() * (1 - CLOSE_ANIM_SCALE) / 2).toInt()
+                )
+                val offsetY =
+                    TypedValue.applyDimension(
+                            TypedValue.COMPLEX_UNIT_DIP,
+                            CLOSE_ANIM_OFFSET_Y,
+                            context.resources.displayMetrics
+                        )
+                        .toInt()
+                offset(/* dx= */ 0, offsetY)
+            }
+        return ValueAnimator.ofObject(RectEvaluator(), startBounds, endBounds).apply {
+            duration = CLOSE_ANIM_DURATION_BOUNDS
+            interpolator = Interpolators.STANDARD_ACCELERATE
+            addUpdateListener { animation ->
+                val animBounds = animation.animatedValue as Rect
+                val animScale = 1 - (1 - CLOSE_ANIM_SCALE) * animation.animatedFraction
+                transactionSupplier
+                    .get()
+                    .setPosition(change.leash, animBounds.left.toFloat(), animBounds.top.toFloat())
+                    .setScale(change.leash, animScale, animScale)
+                    .apply()
+            }
+        }
+    }
+
+    private fun createAlphaCloseAnimation(change: TransitionInfo.Change): Animator =
+        ValueAnimator.ofFloat(1f, 0f).apply {
+            duration = CLOSE_ANIM_DURATION_ALPHA
+            interpolator = Interpolators.LINEAR
+            addUpdateListener { animation ->
+                transactionSupplier
+                    .get()
+                    .setAlpha(change.leash, animation.animatedValue as Float)
+                    .apply()
+            }
+        }
+
+    private companion object {
+        const val CLOSE_ANIM_DURATION_BOUNDS = 200L
+        const val CLOSE_ANIM_DURATION_ALPHA = 100L
+        const val CLOSE_ANIM_SCALE = 0.95f
+        const val CLOSE_ANIM_OFFSET_Y = 36.0f
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandler.kt
index 59e0068..606aa6c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandler.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandler.kt
@@ -39,7 +39,7 @@
     private val shellTaskOrganizer: ShellTaskOrganizer,
     private val taskStackListener: TaskStackListenerImpl,
     private val resizeHandler: ToggleResizeDesktopTaskTransitionHandler,
-    private val taskRepository: DesktopModeTaskRepository,
+    private val taskRepository: DesktopRepository,
 ) {
 
     init {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt
new file mode 100644
index 0000000..f749aa1
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.desktopmode
+
+import android.animation.RectEvaluator
+import android.animation.ValueAnimator
+import android.app.ActivityManager.RunningTaskInfo
+import android.graphics.Rect
+import android.os.IBinder
+import android.view.SurfaceControl
+import android.view.WindowManager.TRANSIT_CHANGE
+import android.view.animation.DecelerateInterpolator
+import android.window.TransitionInfo
+import android.window.TransitionRequestInfo
+import android.window.WindowContainerTransaction
+import androidx.core.animation.addListener
+import com.android.internal.protolog.ProtoLog
+import com.android.wm.shell.protolog.ShellProtoLogGroup
+import com.android.wm.shell.transition.Transitions
+import com.android.wm.shell.transition.Transitions.TransitionHandler
+import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener
+
+/**
+ * A [TransitionHandler] to move a task in/out of desktop's full immersive state where the task
+ * remains freeform while being able to take fullscreen bounds and have its App Header visibility
+ * be transient below the status bar like in fullscreen immersive mode.
+ */
+class DesktopFullImmersiveTransitionHandler(
+    private val transitions: Transitions,
+    private val desktopRepository: DesktopRepository,
+    private val transactionSupplier: () -> SurfaceControl.Transaction,
+) : TransitionHandler {
+
+    constructor(
+        transitions: Transitions,
+        desktopRepository: DesktopRepository,
+    ) : this(transitions, desktopRepository, { SurfaceControl.Transaction() })
+
+    private var state: TransitionState? = null
+
+    /** Whether there is an immersive transition that hasn't completed yet. */
+    private val inProgress: Boolean
+        get() = state != null
+
+    private val rectEvaluator = RectEvaluator()
+
+    /** A listener to invoke on animation changes during entry/exit. */
+    var onTaskResizeAnimationListener: OnTaskResizeAnimationListener? = null
+
+    /** Starts a transition to enter full immersive state inside the desktop. */
+    fun enterImmersive(taskInfo: RunningTaskInfo, wct: WindowContainerTransaction) {
+        if (inProgress) {
+            ProtoLog.v(
+                ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
+                "FullImmersive: cannot start entry because transition already in progress."
+            )
+            return
+        }
+
+        val transition = transitions.startTransition(TRANSIT_CHANGE, wct, /* handler= */ this)
+        state = TransitionState(
+            transition = transition,
+            displayId = taskInfo.displayId,
+            taskId = taskInfo.taskId,
+            direction = Direction.ENTER
+        )
+    }
+
+    fun exitImmersive(taskInfo: RunningTaskInfo, wct: WindowContainerTransaction) {
+        if (inProgress) {
+            ProtoLog.v(
+                ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
+                "$TAG: cannot start exit because transition already in progress."
+            )
+            return
+        }
+
+        val transition = transitions.startTransition(TRANSIT_CHANGE, wct, /* handler= */ this)
+        state = TransitionState(
+            transition = transition,
+            displayId = taskInfo.displayId,
+            taskId = taskInfo.taskId,
+            direction = Direction.EXIT
+        )
+    }
+
+    override fun startAnimation(
+        transition: IBinder,
+        info: TransitionInfo,
+        startTransaction: SurfaceControl.Transaction,
+        finishTransaction: SurfaceControl.Transaction,
+        finishCallback: Transitions.TransitionFinishCallback
+    ): Boolean {
+        val state = requireState()
+        if (transition != state.transition) return false
+        animateResize(
+            transitionState = state,
+            info = info,
+            startTransaction = startTransaction,
+            finishTransaction = finishTransaction,
+            finishCallback = finishCallback
+        )
+        return true
+    }
+
+    private fun animateResize(
+        transitionState: TransitionState,
+        info: TransitionInfo,
+        startTransaction: SurfaceControl.Transaction,
+        finishTransaction: SurfaceControl.Transaction,
+        finishCallback: Transitions.TransitionFinishCallback
+    ) {
+        val change = info.changes.first { c ->
+            val taskInfo = c.taskInfo
+            return@first taskInfo != null && taskInfo.taskId == transitionState.taskId
+        }
+        val leash = change.leash
+        val startBounds = change.startAbsBounds
+        val endBounds = change.endAbsBounds
+
+        val updateTransaction = transactionSupplier()
+        ValueAnimator.ofObject(rectEvaluator, startBounds, endBounds).apply {
+            duration = FULL_IMMERSIVE_ANIM_DURATION_MS
+            interpolator = DecelerateInterpolator()
+            addListener(
+                onStart = {
+                    startTransaction
+                        .setPosition(leash, startBounds.left.toFloat(), startBounds.top.toFloat())
+                        .setWindowCrop(leash, startBounds.width(), startBounds.height())
+                        .show(leash)
+                    onTaskResizeAnimationListener
+                        ?.onAnimationStart(transitionState.taskId, startTransaction, startBounds)
+                        ?: startTransaction.apply()
+                },
+                onEnd = {
+                    finishTransaction
+                        .setPosition(leash, endBounds.left.toFloat(), endBounds.top.toFloat())
+                        .setWindowCrop(leash, endBounds.width(), endBounds.height())
+                        .apply()
+                    onTaskResizeAnimationListener?.onAnimationEnd(transitionState.taskId)
+                    finishCallback.onTransitionFinished(null /* wct */)
+                    clearState()
+                }
+            )
+            addUpdateListener { animation ->
+                val rect = animation.animatedValue as Rect
+                updateTransaction
+                    .setPosition(leash, rect.left.toFloat(), rect.top.toFloat())
+                    .setWindowCrop(leash, rect.width(), rect.height())
+                    .apply()
+                onTaskResizeAnimationListener
+                    ?.onBoundsChange(transitionState.taskId, updateTransaction, rect)
+                    ?: updateTransaction.apply()
+            }
+            start()
+        }
+    }
+
+    override fun handleRequest(
+        transition: IBinder,
+        request: TransitionRequestInfo
+    ): WindowContainerTransaction? = null
+
+    override fun onTransitionConsumed(
+        transition: IBinder,
+        aborted: Boolean,
+        finishTransaction: SurfaceControl.Transaction?
+    ) {
+        val state = this.state ?: return
+        if (transition == state.transition && aborted) {
+            clearState()
+        }
+        super.onTransitionConsumed(transition, aborted, finishTransaction)
+    }
+
+    /**
+     * Called when any transition in the system is ready to play. This is needed to update the
+     * repository state before window decorations are drawn (which happens immediately after
+     * |onTransitionReady|, before this transition actually animates) because drawing decorations
+     * depends in whether the task is in full immersive state or not.
+     */
+    fun onTransitionReady(transition: IBinder) {
+        val state = this.state ?: return
+        // TODO: b/369443668 - this assumes invoking the exit transition is the only way to exit
+        //  immersive, which isn't realistic. The app could crash, the user could dismiss it from
+        //  overview, etc. This (or its caller) should search all transitions to look for any
+        //  immersive task exiting that state to keep the repository properly updated.
+        if (transition == state.transition) {
+            when (state.direction) {
+                Direction.ENTER -> {
+                    desktopRepository.setTaskInFullImmersiveState(
+                        displayId = state.displayId,
+                        taskId = state.taskId,
+                        immersive = true
+                    )
+                }
+                Direction.EXIT -> {
+                    desktopRepository.setTaskInFullImmersiveState(
+                        displayId = state.displayId,
+                        taskId = state.taskId,
+                        immersive = false
+                    )
+                }
+            }
+        }
+    }
+
+    private fun clearState() {
+        state = null
+    }
+
+    private fun requireState(): TransitionState =
+        state ?: error("Expected non-null transition state")
+
+    /** The state of the currently running transition. */
+    private data class TransitionState(
+        val transition: IBinder,
+        val displayId: Int,
+        val taskId: Int,
+        val direction: Direction
+    )
+
+    private enum class Direction {
+        ENTER, EXIT
+    }
+
+    private companion object {
+        private const val TAG = "FullImmersiveHandler"
+
+        private const val FULL_IMMERSIVE_ANIM_DURATION_MS = 336L
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt
new file mode 100644
index 0000000..4350199
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.desktopmode
+
+import android.app.ActivityTaskManager.INVALID_TASK_ID
+import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
+import android.content.Context
+import android.os.Handler
+import android.os.IBinder
+import android.view.SurfaceControl
+import android.view.WindowManager
+import android.window.TransitionInfo
+import android.window.TransitionRequestInfo
+import android.window.WindowContainerTransaction
+import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE
+import com.android.internal.jank.InteractionJankMonitor
+import com.android.internal.protolog.ProtoLog
+import com.android.wm.shell.freeform.FreeformTaskTransitionHandler
+import com.android.wm.shell.freeform.FreeformTaskTransitionStarter
+import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
+import com.android.wm.shell.shared.annotations.ShellMainThread
+import com.android.wm.shell.transition.MixedTransitionHandler
+import com.android.wm.shell.transition.Transitions
+
+/** The [Transitions.TransitionHandler] coordinates transition handlers in desktop windowing. */
+class DesktopMixedTransitionHandler(
+    private val context: Context,
+    private val transitions: Transitions,
+    private val desktopRepository: DesktopRepository,
+    private val freeformTaskTransitionHandler: FreeformTaskTransitionHandler,
+    private val closeDesktopTaskTransitionHandler: CloseDesktopTaskTransitionHandler,
+    private val interactionJankMonitor: InteractionJankMonitor,
+    @ShellMainThread private val handler: Handler,
+) : MixedTransitionHandler, FreeformTaskTransitionStarter {
+
+    /** Delegates starting transition to [FreeformTaskTransitionHandler]. */
+    override fun startWindowingModeTransition(
+        targetWindowingMode: Int,
+        wct: WindowContainerTransaction?,
+    ) = freeformTaskTransitionHandler.startWindowingModeTransition(targetWindowingMode, wct)
+
+    /** Delegates starting minimized mode transition to [FreeformTaskTransitionHandler]. */
+    override fun startMinimizedModeTransition(wct: WindowContainerTransaction?): IBinder =
+        freeformTaskTransitionHandler.startMinimizedModeTransition(wct)
+
+    /** Starts close transition and handles or delegates desktop task close animation. */
+    override fun startRemoveTransition(wct: WindowContainerTransaction?) {
+        requireNotNull(wct)
+        transitions.startTransition(WindowManager.TRANSIT_CLOSE, wct, /* handler= */ this)
+    }
+
+    /** Returns null, as it only handles transitions started from Shell. */
+    override fun handleRequest(
+        transition: IBinder,
+        request: TransitionRequestInfo,
+    ): WindowContainerTransaction? = null
+
+    override fun startAnimation(
+        transition: IBinder,
+        info: TransitionInfo,
+        startTransaction: SurfaceControl.Transaction,
+        finishTransaction: SurfaceControl.Transaction,
+        finishCallback: Transitions.TransitionFinishCallback,
+    ): Boolean {
+        val closeChange = findCloseDesktopTaskChange(info)
+        if (closeChange == null) {
+            ProtoLog.w(WM_SHELL_DESKTOP_MODE, "%s: Should have closing desktop task", TAG)
+            return false
+        }
+        if (isLastDesktopTask(closeChange)) {
+            // Dispatch close desktop task animation to the default transition handlers.
+            return dispatchCloseLastDesktopTaskAnimation(
+                transition,
+                info,
+                closeChange,
+                startTransaction,
+                finishTransaction,
+                finishCallback,
+            )
+        }
+        // Animate close desktop task transition with [CloseDesktopTaskTransitionHandler].
+        return closeDesktopTaskTransitionHandler.startAnimation(
+            transition,
+            info,
+            startTransaction,
+            finishTransaction,
+            finishCallback,
+        )
+    }
+
+    /**
+     * Dispatch close desktop task animation to the default transition handlers. Allows delegating
+     * it to Launcher to animate in sync with show Home transition.
+     */
+    private fun dispatchCloseLastDesktopTaskAnimation(
+        transition: IBinder,
+        info: TransitionInfo,
+        change: TransitionInfo.Change,
+        startTransaction: SurfaceControl.Transaction,
+        finishTransaction: SurfaceControl.Transaction,
+        finishCallback: Transitions.TransitionFinishCallback,
+    ): Boolean {
+        // Starting the jank trace if closing the last window in desktop mode.
+        interactionJankMonitor.begin(
+            change.leash,
+            context,
+            handler,
+            CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE,
+        )
+        // Dispatch the last desktop task closing animation.
+        return transitions.dispatchTransition(
+            transition,
+            info,
+            startTransaction,
+            finishTransaction,
+            { wct ->
+                // Finish the jank trace when closing the last window in desktop mode.
+                interactionJankMonitor.end(CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE)
+                finishCallback.onTransitionFinished(wct)
+            },
+            /* skip= */ this
+        ) != null
+    }
+
+    private fun isLastDesktopTask(change: TransitionInfo.Change): Boolean =
+        change.taskInfo?.let {
+            desktopRepository.getActiveNonMinimizedTaskCount(it.displayId) == 1
+        } ?: false
+
+    private fun findCloseDesktopTaskChange(info: TransitionInfo): TransitionInfo.Change? {
+        if (info.type != WindowManager.TRANSIT_CLOSE) return null
+        return info.changes.firstOrNull { change ->
+            change.mode == WindowManager.TRANSIT_CLOSE &&
+                !change.hasFlags(TransitionInfo.FLAG_IS_WALLPAPER) &&
+                change.taskInfo?.taskId != INVALID_TASK_ID &&
+                change.taskInfo?.windowingMode == WINDOWING_MODE_FREEFORM
+        }
+    }
+
+    companion object {
+        private const val TAG = "DesktopMixedTransitionHandler"
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMode.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMode.java
index cca7500..73e55b2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMode.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMode.java
@@ -36,7 +36,7 @@
      * @param listener the listener to add.
      * @param callbackExecutor the executor to call the listener on.
      */
-    void addVisibleTasksListener(DesktopModeTaskRepository.VisibleTasksListener listener,
+    void addVisibleTasksListener(DesktopRepository.VisibleTasksListener listener,
             Executor callbackExecutor);
 
     /**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt
index 02cbe01..5a277316f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt
@@ -19,6 +19,8 @@
 import com.android.internal.annotations.VisibleForTesting
 import com.android.internal.protolog.ProtoLog
 import com.android.internal.util.FrameworkStatsLog
+import com.android.window.flags.Flags
+import com.android.wm.shell.EventLogTags
 import com.android.wm.shell.protolog.ShellProtoLogGroup
 
 /** Event logger for logging desktop mode session events */
@@ -41,6 +43,7 @@
             /* exitReason */ 0,
             /* session_id */ sessionId
         )
+        EventLogTags.writeWmShellEnterDesktopMode(enterReason.reason, sessionId)
     }
 
     /**
@@ -61,6 +64,7 @@
             /* exitReason */ exitReason.reason,
             /* session_id */ sessionId
         )
+        EventLogTags.writeWmShellExitDesktopMode(exitReason.reason, sessionId)
     }
 
     /**
@@ -76,7 +80,8 @@
         )
         logTaskUpdate(
             FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_ADDED,
-            sessionId, taskUpdate)
+            sessionId, taskUpdate
+        )
     }
 
     /**
@@ -92,7 +97,8 @@
         )
         logTaskUpdate(
             FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_REMOVED,
-            sessionId, taskUpdate)
+            sessionId, taskUpdate
+        )
     }
 
     /**
@@ -108,7 +114,46 @@
         )
         logTaskUpdate(
             FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED,
-            sessionId, taskUpdate)
+            sessionId, taskUpdate
+        )
+    }
+
+    /**
+     * Logs that a task resize event is starting with [taskSizeUpdate] within a
+     * Desktop mode [sessionId].
+     */
+    fun logTaskResizingStarted(sessionId: Int, taskSizeUpdate: TaskSizeUpdate) {
+        if (!Flags.enableResizingMetrics()) return
+
+        ProtoLog.v(
+            ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
+            "DesktopModeLogger: Logging task resize is starting, session: %s taskId: %s",
+            sessionId,
+            taskSizeUpdate.instanceId
+        )
+        logTaskSizeUpdated(
+            FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__START_RESIZING_STAGE,
+            sessionId, taskSizeUpdate
+        )
+    }
+
+    /**
+     * Logs that a task resize event is ending with [taskSizeUpdate] within a
+     * Desktop mode [sessionId].
+     */
+    fun logTaskResizingEnded(sessionId: Int, taskSizeUpdate: TaskSizeUpdate) {
+        if (!Flags.enableResizingMetrics()) return
+
+        ProtoLog.v(
+            ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
+            "DesktopModeLogger: Logging task resize is ending, session: %s taskId: %s",
+            sessionId,
+            taskSizeUpdate.instanceId
+        )
+        logTaskSizeUpdated(
+            FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__END_RESIZING_STAGE,
+            sessionId, taskSizeUpdate
+        )
     }
 
     private fun logTaskUpdate(taskEvent: Int, sessionId: Int, taskUpdate: TaskUpdate) {
@@ -135,6 +180,56 @@
             /* visible_task_count */
             taskUpdate.visibleTaskCount
         )
+        EventLogTags.writeWmShellDesktopModeTaskUpdate(
+            /* task_event */
+            taskEvent,
+            /* instance_id */
+            taskUpdate.instanceId,
+            /* uid */
+            taskUpdate.uid,
+            /* task_height */
+            taskUpdate.taskHeight,
+            /* task_width */
+            taskUpdate.taskWidth,
+            /* task_x */
+            taskUpdate.taskX,
+            /* task_y */
+            taskUpdate.taskY,
+            /* session_id */
+            sessionId,
+            taskUpdate.minimizeReason?.reason ?: UNSET_MINIMIZE_REASON,
+            taskUpdate.unminimizeReason?.reason ?: UNSET_UNMINIMIZE_REASON,
+            /* visible_task_count */
+            taskUpdate.visibleTaskCount
+        )
+    }
+
+    private fun logTaskSizeUpdated(
+        resizingStage: Int,
+        sessionId: Int,
+        taskSizeUpdate: TaskSizeUpdate
+    ) {
+        FrameworkStatsLog.write(
+            DESKTOP_MODE_TASK_SIZE_UPDATED_ATOM_ID,
+            /* resize_trigger */
+            taskSizeUpdate.resizeTrigger?.trigger ?: ResizeTrigger.UNKNOWN_RESIZE_TRIGGER.trigger,
+            /* resizing_stage */
+            resizingStage,
+            /* input_method */
+            taskSizeUpdate.inputMethod?.method ?: InputMethod.UNKNOWN_INPUT_METHOD.method,
+            /* desktop_mode_session_id */
+            sessionId,
+            /* instance_id */
+            taskSizeUpdate.instanceId,
+            /* uid */
+            taskSizeUpdate.uid,
+            /* task_height */
+            taskSizeUpdate.taskHeight,
+            /* task_width */
+            taskSizeUpdate.taskWidth,
+            /* display_area */
+            taskSizeUpdate.displayArea
+        )
     }
 
     companion object {
@@ -163,13 +258,35 @@
             val visibleTaskCount: Int,
         )
 
+        /**
+         * Describes a task size update (resizing, snapping or maximizing to
+         * stable bounds).
+         *
+         * @property resizeTrigger the trigger for task resize
+         * @property inputMethod the input method for resizing this task
+         * @property instanceId instance id of the task
+         * @property uid uid of the app associated with the task
+         * @property taskHeight height of the task in dp
+         * @property taskWidth width of the task in dp
+         * @property displayArea the display size of the screen in dp
+         */
+        data class TaskSizeUpdate(
+            val resizeTrigger: ResizeTrigger? = null,
+            val inputMethod: InputMethod? = null,
+            val instanceId: Int,
+            val uid: Int,
+            val taskHeight: Int,
+            val taskWidth: Int,
+            val displayArea: Int,
+        )
+
         // Default value used when the task was not minimized.
         @VisibleForTesting
         const val UNSET_MINIMIZE_REASON =
             FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__MINIMIZE_REASON__UNSET_MINIMIZE
 
         /** The reason a task was minimized. */
-        enum class MinimizeReason (val reason: Int) {
+        enum class MinimizeReason(val reason: Int) {
             TASK_LIMIT(
                 FrameworkStatsLog
                     .DESKTOP_MODE_SESSION_TASK_UPDATE__MINIMIZE_REASON__MINIMIZE_TASK_LIMIT
@@ -186,7 +303,7 @@
             FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__UNMINIMIZE_REASON__UNSET_UNMINIMIZE
 
         /** The reason a task was unminimized. */
-        enum class UnminimizeReason (val reason: Int) {
+        enum class UnminimizeReason(val reason: Int) {
             UNKNOWN(
                 FrameworkStatsLog
                     .DESKTOP_MODE_SESSION_TASK_UPDATE__UNMINIMIZE_REASON__UNMINIMIZE_UNKNOWN
@@ -250,8 +367,88 @@
             SCREEN_OFF(FrameworkStatsLog.DESKTOP_MODE_UICHANGED__EXIT_REASON__SCREEN_OFF)
         }
 
+        /**
+         * Enum ResizeTrigger mapped to the ResizeTrigger definition in
+         * stats/atoms/desktopmode/desktopmode_extensions_atoms.proto
+         */
+        enum class ResizeTrigger(val trigger: Int) {
+            UNKNOWN_RESIZE_TRIGGER(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__UNKNOWN_RESIZE_TRIGGER
+            ),
+            CORNER(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__CORNER_RESIZE_TRIGGER
+            ),
+            EDGE(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__EDGE_RESIZE_TRIGGER
+            ),
+            TILING_DIVIDER(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__TILING_DIVIDER_RESIZE_TRIGGER
+            ),
+            MAXIMIZE_BUTTON(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__MAXIMIZE_BUTTON_RESIZE_TRIGGER
+            ),
+            DOUBLE_TAP_APP_HEADER(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__DOUBLE_TAP_APP_HEADER_RESIZE_TRIGGER
+            ),
+            DRAG_LEFT(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__DRAG_LEFT_RESIZE_TRIGGER
+            ),
+            DRAG_RIGHT(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__DRAG_RIGHT_RESIZE_TRIGGER
+            ),
+            SNAP_LEFT_MENU(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__SNAP_LEFT_MENU_RESIZE_TRIGGER
+            ),
+            SNAP_RIGHT_MENU(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__SNAP_RIGHT_MENU_RESIZE_TRIGGER
+            ),
+        }
+
+        /**
+         * Enum InputMethod mapped to the InputMethod definition in
+         * stats/atoms/desktopmode/desktopmode_extensions_atoms.proto
+         */
+        enum class InputMethod(val method: Int) {
+            UNKNOWN_INPUT_METHOD(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__UNKNOWN_INPUT_METHOD
+            ),
+            TOUCH(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__TOUCH_INPUT_METHOD
+            ),
+            STYLUS(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__STYLUS_INPUT_METHOD
+            ),
+            MOUSE(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__MOUSE_INPUT_METHOD
+            ),
+            TOUCHPAD(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__TOUCHPAD_INPUT_METHOD
+            ),
+            KEYBOARD(
+                FrameworkStatsLog
+                    .DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__KEYBOARD_INPUT_METHOD
+            ),
+        }
+
         private const val DESKTOP_MODE_ATOM_ID = FrameworkStatsLog.DESKTOP_MODE_UI_CHANGED
         private const val DESKTOP_MODE_TASK_UPDATE_ATOM_ID =
             FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE
+        private const val DESKTOP_MODE_TASK_SIZE_UPDATED_ATOM_ID =
+            FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserver.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserver.kt
index 0637474..b8507e3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserver.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserver.kt
@@ -68,9 +68,7 @@
     private val idSequence: InstanceIdSequence by lazy { InstanceIdSequence(Int.MAX_VALUE) }
 
     init {
-        if (
-            Transitions.ENABLE_SHELL_TRANSITIONS && DesktopModeStatus.canEnterDesktopMode(context)
-        ) {
+        if (DesktopModeStatus.canEnterDesktopMode(context)) {
             shellInit.addInitCallback(this::onInit, this)
         }
     }
@@ -101,6 +99,9 @@
 
     fun onInit() {
         transitions.registerObserver(this)
+        SystemProperties.set(
+            VISIBLE_TASKS_COUNTER_SYSTEM_PROPERTY,
+            VISIBLE_TASKS_COUNTER_SYSTEM_PROPERTY_DEFAULT_VALUE)
     }
 
     override fun onTransitionReady(
@@ -441,5 +442,6 @@
         @VisibleForTesting
         const val VISIBLE_TASKS_COUNTER_SYSTEM_PROPERTY =
             "debug.tracing." + VISIBLE_TASKS_COUNTER_NAME
+        const val VISIBLE_TASKS_COUNTER_SYSTEM_PROPERTY_DEFAULT_VALUE = "0"
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt
deleted file mode 100644
index 759ed03..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt
+++ /dev/null
@@ -1,491 +0,0 @@
-/*
- * Copyright (C) 2022 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.wm.shell.desktopmode
-
-import android.content.Context
-import android.graphics.Rect
-import android.graphics.Region
-import android.util.ArrayMap
-import android.util.ArraySet
-import android.util.SparseArray
-import android.view.Display.INVALID_DISPLAY
-import android.window.WindowContainerToken
-import androidx.core.util.forEach
-import androidx.core.util.keyIterator
-import androidx.core.util.valueIterator
-import com.android.internal.protolog.ProtoLog
-import com.android.window.flags.Flags
-import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository
-import com.android.wm.shell.desktopmode.persistence.DesktopTask
-import com.android.wm.shell.desktopmode.persistence.DesktopTaskState
-import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
-import com.android.wm.shell.shared.annotations.ShellMainThread
-import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
-import com.android.wm.shell.sysui.ShellInit
-import java.io.PrintWriter
-import java.util.concurrent.Executor
-import java.util.function.Consumer
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
-
-/** Tracks task data for Desktop Mode. */
-class DesktopModeTaskRepository (
-    private val context: Context,
-    shellInit: ShellInit,
-    private val persistentRepository: DesktopPersistentRepository,
-    @ShellMainThread private val mainCoroutineScope: CoroutineScope,
-){
-
-    /**
-     * Task data tracked per desktop.
-     *
-     * @property activeTasks task ids of active tasks currently or previously visible in Desktop
-     * mode session. Tasks become inactive when task closes or when desktop mode session ends.
-     * @property visibleTasks task ids for active freeform tasks that are currently visible. There
-     * might be other active tasks in desktop mode that are not visible.
-     * @property minimizedTasks task ids for active freeform tasks that are currently minimized.
-     * @property closingTasks task ids for tasks that are going to close, but are currently visible.
-     * @property freeformTasksInZOrder list of current freeform task ids ordered from top to bottom
-     * (top is at index 0).
-     */
-    private data class DesktopTaskData(
-        val activeTasks: ArraySet<Int> = ArraySet(),
-        val visibleTasks: ArraySet<Int> = ArraySet(),
-        val minimizedTasks: ArraySet<Int> = ArraySet(),
-        // TODO(b/332682201): Remove when the repository state is updated via TransitionObserver
-        val closingTasks: ArraySet<Int> = ArraySet(),
-        val freeformTasksInZOrder: ArrayList<Int> = ArrayList(),
-    ) {
-        fun deepCopy(): DesktopTaskData = DesktopTaskData(
-            activeTasks = ArraySet(activeTasks),
-            visibleTasks = ArraySet(visibleTasks),
-            minimizedTasks = ArraySet(minimizedTasks),
-            closingTasks = ArraySet(closingTasks),
-            freeformTasksInZOrder = ArrayList(freeformTasksInZOrder)
-        )
-    }
-
-    /* Current wallpaper activity token to remove wallpaper activity when last task is removed. */
-    var wallpaperActivityToken: WindowContainerToken? = null
-
-    private val activeTasksListeners = ArraySet<ActiveTasksListener>()
-    private val visibleTasksListeners = ArrayMap<VisibleTasksListener, Executor>()
-
-    /* Tracks corner/caption regions of desktop tasks, used to determine gesture exclusion. */
-    private val desktopExclusionRegions = SparseArray<Region>()
-
-    /* Tracks last bounds of task before toggled to stable bounds. */
-    private val boundsBeforeMaximizeByTaskId = SparseArray<Rect>()
-
-    private var desktopGestureExclusionListener: Consumer<Region>? = null
-    private var desktopGestureExclusionExecutor: Executor? = null
-
-    private val desktopTaskDataByDisplayId = object : SparseArray<DesktopTaskData>() {
-        /** Gets [DesktopTaskData] for existing [displayId] or creates a new one. */
-        fun getOrCreate(displayId: Int): DesktopTaskData =
-            this[displayId] ?: DesktopTaskData().also { this[displayId] = it }
-    }
-
-    init {
-        if (DesktopModeStatus.canEnterDesktopMode(context)) {
-            shellInit.addInitCallback(::initRepoFromPersistentStorage, this)
-        }
-    }
-
-    private fun initRepoFromPersistentStorage() {
-        if (!Flags.enableDesktopWindowingPersistence()) return
-        //  TODO: b/365962554 - Handle the case that user moves to desktop before it's initialized
-        mainCoroutineScope.launch {
-            val desktop = persistentRepository.readDesktop()
-            val maxTasks =
-                DesktopModeStatus.getMaxTaskLimit(context).takeIf { it > 0 }
-                    ?: desktop.zOrderedTasksCount
-
-            desktop.zOrderedTasksList
-                // Reverse it so we initialize the repo from bottom to top.
-                .reversed()
-                .map { taskId ->
-                    desktop.tasksByTaskIdMap.getOrDefault(
-                        taskId,
-                        DesktopTask.getDefaultInstance()
-                    )
-                }
-                .filter { task -> task.desktopTaskState == DesktopTaskState.VISIBLE }
-                .take(maxTasks)
-                .forEach { task ->
-                    addOrMoveFreeformTaskToTop(desktop.displayId, task.taskId)
-                    addActiveTask(desktop.displayId, task.taskId)
-                    updateTaskVisibility(desktop.displayId, task.taskId, visible = false)
-                }
-        }
-    }
-
-    /** Adds [activeTasksListener] to be notified of updates to active tasks. */
-    fun addActiveTaskListener(activeTasksListener: ActiveTasksListener) {
-        activeTasksListeners.add(activeTasksListener)
-    }
-
-    /** Adds [visibleTasksListener] to be notified of updates to visible tasks. */
-    fun addVisibleTasksListener(visibleTasksListener: VisibleTasksListener, executor: Executor) {
-        visibleTasksListeners[visibleTasksListener] = executor
-        desktopTaskDataByDisplayId.keyIterator().forEach {
-            val visibleTaskCount = getVisibleTaskCount(it)
-            executor.execute {
-                visibleTasksListener.onTasksVisibilityChanged(it, visibleTaskCount)
-            }
-        }
-    }
-
-    /** Updates tasks changes on all the active task listeners for given display id. */
-    private fun updateActiveTasksListeners(displayId: Int) {
-        activeTasksListeners.onEach { it.onActiveTasksChanged(displayId) }
-    }
-
-    /** Returns a list of all [DesktopTaskData] in the repository. */
-    private fun desktopTaskDataSequence(): Sequence<DesktopTaskData> =
-        desktopTaskDataByDisplayId.valueIterator().asSequence()
-
-    /** Adds [regionListener] to inform about changes to exclusion regions for all Desktop tasks. */
-    fun setExclusionRegionListener(regionListener: Consumer<Region>, executor: Executor) {
-        desktopGestureExclusionListener = regionListener
-        desktopGestureExclusionExecutor = executor
-        executor.execute {
-            desktopGestureExclusionListener?.accept(calculateDesktopExclusionRegion())
-        }
-    }
-
-    /** Creates a new merged region representative of all exclusion regions in all desktop tasks. */
-    private fun calculateDesktopExclusionRegion(): Region {
-        val desktopExclusionRegion = Region()
-        desktopExclusionRegions.valueIterator().forEach { taskExclusionRegion ->
-            desktopExclusionRegion.op(taskExclusionRegion, Region.Op.UNION)
-        }
-        return desktopExclusionRegion
-    }
-
-    /** Remove the previously registered [activeTasksListener] */
-    fun removeActiveTasksListener(activeTasksListener: ActiveTasksListener) {
-        activeTasksListeners.remove(activeTasksListener)
-    }
-
-    /** Removes the previously registered [visibleTasksListener]. */
-    fun removeVisibleTasksListener(visibleTasksListener: VisibleTasksListener) {
-        visibleTasksListeners.remove(visibleTasksListener)
-    }
-
-    /** Adds task with [taskId] to the list of active tasks on [displayId]. */
-    fun addActiveTask(displayId: Int, taskId: Int) {
-        // Removes task if it is active on another display excluding [displayId].
-        removeActiveTask(taskId, excludedDisplayId = displayId)
-
-        if (desktopTaskDataByDisplayId.getOrCreate(displayId).activeTasks.add(taskId)) {
-            logD("Adds active task=%d displayId=%d", taskId, displayId)
-            updateActiveTasksListeners(displayId)
-        }
-    }
-
-    /** Removes task from active task list of displays excluding the [excludedDisplayId]. */
-    fun removeActiveTask(taskId: Int, excludedDisplayId: Int? = null) {
-        desktopTaskDataByDisplayId.forEach { displayId, desktopTaskData ->
-            if ((displayId != excludedDisplayId)
-                    && desktopTaskData.activeTasks.remove(taskId)) {
-                logD("Removed active task=%d displayId=%d", taskId, displayId)
-                updateActiveTasksListeners(displayId)
-            }
-        }
-    }
-
-    /** Adds given task to the closing task list for [displayId]. */
-    fun addClosingTask(displayId: Int, taskId: Int) {
-        if (desktopTaskDataByDisplayId.getOrCreate(displayId).closingTasks.add(taskId)) {
-            logD("Added closing task=%d displayId=%d", taskId, displayId)
-        } else {
-            // If the task hasn't been removed from closing list after it disappeared.
-            logW("Task with taskId=%d displayId=%d is already closing", taskId, displayId)
-        }
-    }
-
-    /** Removes task from the list of closing tasks for [displayId]. */
-    fun removeClosingTask(taskId: Int) {
-        desktopTaskDataByDisplayId.forEach { displayId, taskInfo ->
-            if (taskInfo.closingTasks.remove(taskId)) {
-                logD("Removed closing task=%d displayId=%d", taskId, displayId)
-            }
-        }
-    }
-
-    fun isActiveTask(taskId: Int) = desktopTaskDataSequence().any { taskId in it.activeTasks }
-    fun isClosingTask(taskId: Int) = desktopTaskDataSequence().any { taskId in it.closingTasks }
-    fun isVisibleTask(taskId: Int) = desktopTaskDataSequence().any { taskId in it.visibleTasks }
-    fun isMinimizedTask(taskId: Int) = desktopTaskDataSequence().any { taskId in it.minimizedTasks }
-
-    /** Checks if a task is the only visible, non-closing, non-minimized task on its display. */
-    fun isOnlyVisibleNonClosingTask(taskId: Int): Boolean =
-        desktopTaskDataSequence().any { it.visibleTasks
-            .subtract(it.closingTasks)
-            .subtract(it.minimizedTasks)
-            .singleOrNull() == taskId
-        }
-
-    fun getActiveTasks(displayId: Int): ArraySet<Int> =
-        ArraySet(desktopTaskDataByDisplayId[displayId]?.activeTasks)
-
-    fun getMinimizedTasks(displayId: Int): ArraySet<Int> =
-        ArraySet(desktopTaskDataByDisplayId[displayId]?.minimizedTasks)
-
-    /** Returns all active non-minimized tasks for [displayId] ordered from top to bottom. */
-    fun getActiveNonMinimizedOrderedTasks(displayId: Int): List<Int> =
-        getFreeformTasksInZOrder(displayId).filter { !isMinimizedTask(it) }
-
-    /** Returns the count of active non-minimized tasks for [displayId]. */
-    fun getActiveNonMinimizedTaskCount(displayId: Int): Int {
-        return getActiveTasks(displayId).count { !isMinimizedTask(it) }
-    }
-
-    /** Returns a list of freeform tasks, ordered from top-bottom (top at index 0). */
-    fun getFreeformTasksInZOrder(displayId: Int): ArrayList<Int> =
-        ArrayList(desktopTaskDataByDisplayId[displayId]?.freeformTasksInZOrder ?: emptyList())
-
-    /** Removes task from visible tasks of all displays except [excludedDisplayId]. */
-    private fun removeVisibleTask(taskId: Int, excludedDisplayId: Int? = null) {
-        desktopTaskDataByDisplayId.forEach { displayId, data ->
-            if ((displayId != excludedDisplayId) && data.visibleTasks.remove(taskId)) {
-                notifyVisibleTaskListeners(displayId, data.visibleTasks.size)
-            }
-        }
-    }
-
-    /**
-     * Updates visibility of a freeform task with [taskId] on [displayId] and notifies listeners.
-     *
-     * If task was visible on a different display with a different [displayId], removes from
-     * the set of visible tasks on that display and notifies listeners.
-     */
-    fun updateTaskVisibility(displayId: Int, taskId: Int, visible: Boolean) {
-        if (visible) {
-            // If task is visible, remove it from any other display besides [displayId].
-            removeVisibleTask(taskId, excludedDisplayId = displayId)
-        } else if (displayId == INVALID_DISPLAY) {
-            // Task has vanished. Check which display to remove the task from.
-            removeVisibleTask(taskId)
-            return
-        }
-        val prevCount = getVisibleTaskCount(displayId)
-        if (visible) {
-            desktopTaskDataByDisplayId.getOrCreate(displayId).visibleTasks.add(taskId)
-            unminimizeTask(displayId, taskId)
-        } else {
-            desktopTaskDataByDisplayId[displayId]?.visibleTasks?.remove(taskId)
-        }
-        val newCount = getVisibleTaskCount(displayId)
-        if (prevCount != newCount) {
-            logD("Update task visibility taskId=%d visible=%b displayId=%d",
-                taskId, visible, displayId)
-            logD("VisibleTaskCount has changed from %d to %d", prevCount, newCount)
-            notifyVisibleTaskListeners(displayId, newCount)
-        }
-    }
-
-    private fun notifyVisibleTaskListeners(displayId: Int, visibleTasksCount: Int) {
-        visibleTasksListeners.forEach { (listener, executor) ->
-            executor.execute { listener.onTasksVisibilityChanged(displayId, visibleTasksCount) }
-        }
-    }
-
-    /** Gets number of visible tasks on given [displayId] */
-    fun getVisibleTaskCount(displayId: Int): Int =
-        desktopTaskDataByDisplayId[displayId]?.visibleTasks?.size ?: 0.also {
-            logD("getVisibleTaskCount=$it")
-        }
-
-    /**
-     * Adds task (or moves if it already exists) to the top of the ordered list.
-     *
-     * Unminimizes the task if it is minimized.
-     */
-    fun addOrMoveFreeformTaskToTop(displayId: Int, taskId: Int) {
-        logD("Add or move task to top: display=%d taskId=%d", taskId, displayId)
-        desktopTaskDataByDisplayId[displayId]?.freeformTasksInZOrder?.remove(taskId)
-        desktopTaskDataByDisplayId.getOrCreate(displayId).freeformTasksInZOrder.add(0, taskId)
-        // Unminimize the task if it is minimized.
-        unminimizeTask(displayId, taskId)
-        if (Flags.enableDesktopWindowingPersistence()) {
-            updatePersistentRepository(displayId)
-        }
-    }
-
-    /** Minimizes the task for [taskId] and [displayId] */
-    fun minimizeTask(displayId: Int, taskId: Int) {
-        logD("Minimize Task: display=%d, task=%d", displayId, taskId)
-        desktopTaskDataByDisplayId.getOrCreate(displayId).minimizedTasks.add(taskId)
-        if (Flags.enableDesktopWindowingPersistence()) {
-            updatePersistentRepository(displayId)
-        }
-    }
-
-    /** Unminimizes the task for [taskId] and [displayId] */
-    fun unminimizeTask(displayId: Int, taskId: Int) {
-        logD("Unminimize Task: display=%d, task=%d", displayId, taskId)
-        desktopTaskDataByDisplayId[displayId]?.minimizedTasks?.remove(taskId) ?:
-            logW("Unminimize Task: display=%d, task=%d, no task data", displayId, taskId)
-    }
-
-    private fun getDisplayIdForTask(taskId: Int): Int? {
-        desktopTaskDataByDisplayId.forEach { displayId, data ->
-            if (taskId in data.freeformTasksInZOrder) {
-                return displayId
-            }
-        }
-        logW("No display id found for task: taskId=%d", taskId)
-        return null
-    }
-
-    /**
-     * Removes [taskId] from the respective display. If [INVALID_DISPLAY], the original display id
-     * will be looked up from the task id.
-     */
-    fun removeFreeformTask(displayId: Int, taskId: Int) {
-        logD("Removes freeform task: taskId=%d", taskId)
-        if (displayId == INVALID_DISPLAY) {
-            // Removes the original display id of the task.
-            getDisplayIdForTask(taskId)?.let { removeTaskFromDisplay(it, taskId) }
-        } else {
-            removeTaskFromDisplay(displayId, taskId)
-        }
-    }
-
-    /** Removes given task from a valid [displayId] and updates the repository state. */
-    private fun removeTaskFromDisplay(displayId: Int, taskId: Int) {
-        logD("Removes freeform task: taskId=%d, displayId=%d", taskId, displayId)
-        desktopTaskDataByDisplayId[displayId]?.freeformTasksInZOrder?.remove(taskId)
-        boundsBeforeMaximizeByTaskId.remove(taskId)
-        logD("Remaining freeform tasks: %s",
-            desktopTaskDataByDisplayId[displayId]?.freeformTasksInZOrder?.toDumpString())
-        // Remove task from unminimized task if it is minimized.
-        unminimizeTask(displayId, taskId)
-        removeActiveTask(taskId)
-        updateTaskVisibility(displayId, taskId, visible = false)
-        if (Flags.enableDesktopWindowingPersistence()) {
-            updatePersistentRepository(displayId)
-        }
-    }
-
-    /**
-     * Updates active desktop gesture exclusion regions.
-     *
-     * If [desktopExclusionRegions] is accepted by [desktopGestureExclusionListener], updates it in
-     * appropriate classes.
-     */
-    fun updateTaskExclusionRegions(taskId: Int, taskExclusionRegions: Region) {
-        desktopExclusionRegions.put(taskId, taskExclusionRegions)
-        desktopGestureExclusionExecutor?.execute {
-            desktopGestureExclusionListener?.accept(calculateDesktopExclusionRegion())
-        }
-    }
-
-    /**
-     * Removes desktop gesture exclusion region for the specified task.
-     *
-     * If [desktopExclusionRegions] is accepted by [desktopGestureExclusionListener], updates it in
-     * appropriate classes.
-     */
-    fun removeExclusionRegion(taskId: Int) {
-        desktopExclusionRegions.delete(taskId)
-        desktopGestureExclusionExecutor?.execute {
-            desktopGestureExclusionListener?.accept(calculateDesktopExclusionRegion())
-        }
-    }
-
-    /** Removes and returns the bounds saved before maximizing the given task. */
-    fun removeBoundsBeforeMaximize(taskId: Int): Rect? =
-        boundsBeforeMaximizeByTaskId.removeReturnOld(taskId)
-
-    /** Saves the bounds of the given task before maximizing. */
-    fun saveBoundsBeforeMaximize(taskId: Int, bounds: Rect) =
-        boundsBeforeMaximizeByTaskId.set(taskId, Rect(bounds))
-
-    private fun updatePersistentRepository(displayId: Int) {
-        // Create a deep copy of the data
-        desktopTaskDataByDisplayId[displayId]?.deepCopy()?.let { desktopTaskDataByDisplayIdCopy ->
-            mainCoroutineScope.launch {
-                try {
-                    persistentRepository.addOrUpdateDesktop(
-                        visibleTasks = desktopTaskDataByDisplayIdCopy.visibleTasks,
-                        minimizedTasks = desktopTaskDataByDisplayIdCopy.minimizedTasks,
-                        freeformTasksInZOrder = desktopTaskDataByDisplayIdCopy.freeformTasksInZOrder
-                    )
-                } catch (exception: Exception) {
-                    logE(
-                        "An exception occurred while updating the persistent repository \n%s",
-                        exception.stackTrace
-                    )
-                }
-            }
-        }
-    }
-
-
-    internal fun dump(pw: PrintWriter, prefix: String) {
-        val innerPrefix = "$prefix  "
-        pw.println("${prefix}DesktopModeTaskRepository")
-        dumpDesktopTaskData(pw, innerPrefix)
-        pw.println("${innerPrefix}activeTasksListeners=${activeTasksListeners.size}")
-        pw.println("${innerPrefix}visibleTasksListeners=${visibleTasksListeners.size}")
-    }
-
-    private fun dumpDesktopTaskData(pw: PrintWriter, prefix: String) {
-        val innerPrefix = "$prefix  "
-        desktopTaskDataByDisplayId.forEach { displayId, data ->
-            pw.println("${prefix}Display $displayId:")
-            pw.println("${innerPrefix}activeTasks=${data.activeTasks.toDumpString()}")
-            pw.println("${innerPrefix}visibleTasks=${data.visibleTasks.toDumpString()}")
-            pw.println(
-                "${innerPrefix}freeformTasksInZOrder=${data.freeformTasksInZOrder.toDumpString()}"
-            )
-        }
-    }
-
-    /** Listens to changes for active tasks in desktop mode. */
-    interface ActiveTasksListener {
-        fun onActiveTasksChanged(displayId: Int) {}
-    }
-
-    /** Listens to changes for visible tasks in desktop mode. */
-    interface VisibleTasksListener {
-        fun onTasksVisibilityChanged(displayId: Int, visibleTasksCount: Int) {}
-    }
-
-    private fun logD(msg: String, vararg arguments: Any?) {
-        ProtoLog.d(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
-    }
-
-    private fun logW(msg: String, vararg arguments: Any?) {
-        ProtoLog.w(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
-    }
-
-    private fun logE(msg: String, vararg arguments: Any?) {
-        ProtoLog.e(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
-    }
-
-    companion object {
-        private const val TAG = "DesktopModeTaskRepository"
-    }
-}
-
-private fun <T> Iterable<T>.toDumpString(): String =
-    joinToString(separator = ", ", prefix = "[", postfix = "]")
-
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicator.java
index 7261919..52b92a8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicator.java
@@ -21,6 +21,12 @@
 import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
 
+import static com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.IndicatorType.NO_INDICATOR;
+import static com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.IndicatorType.TO_DESKTOP_INDICATOR;
+import static com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR;
+import static com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.IndicatorType.TO_SPLIT_LEFT_INDICATOR;
+import static com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.IndicatorType.TO_SPLIT_RIGHT_INDICATOR;
+
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.RectEvaluator;
@@ -125,7 +131,7 @@
         mContext = context;
         mTaskSurface = taskSurface;
         mRootTdaOrganizer = taskDisplayAreaOrganizer;
-        mCurrentType = IndicatorType.NO_INDICATOR;
+        mCurrentType = NO_INDICATOR;
         mDragStartState = dragStartState;
     }
 
@@ -136,8 +142,16 @@
     @NonNull
     IndicatorType updateIndicatorType(PointF inputCoordinates) {
         final DisplayLayout layout = mDisplayController.getDisplayLayout(mTaskInfo.displayId);
+        // Perform a quick check first: any input off the left edge of the display should be split
+        // left, and split right for the right edge. This is universal across all drag event types.
+        if (inputCoordinates.x < 0) return TO_SPLIT_LEFT_INDICATOR;
+        if (inputCoordinates.x > layout.width()) return TO_SPLIT_RIGHT_INDICATOR;
         // If we are in freeform, we don't want a visible indicator in the "freeform" drag zone.
-        IndicatorType result = IndicatorType.NO_INDICATOR;
+        // In drags not originating on a freeform caption, we should default to a TO_DESKTOP
+        // indicator.
+        IndicatorType result = mDragStartState == DragStartState.FROM_FREEFORM
+                ? NO_INDICATOR
+                : TO_DESKTOP_INDICATOR;
         final int transitionAreaWidth = mContext.getResources().getDimensionPixelSize(
                 com.android.wm.shell.R.dimen.desktop_mode_transition_region_thickness);
         // Because drags in freeform use task position for indicator calculation, we need to
@@ -149,10 +163,8 @@
                 captionHeight);
         final Region splitRightRegion = calculateSplitRightRegion(layout, transitionAreaWidth,
                 captionHeight);
-        final Region toDesktopRegion = calculateToDesktopRegion(layout, splitLeftRegion,
-                splitRightRegion, fullscreenRegion);
         if (fullscreenRegion.contains((int) inputCoordinates.x, (int) inputCoordinates.y)) {
-            result = IndicatorType.TO_FULLSCREEN_INDICATOR;
+            result = TO_FULLSCREEN_INDICATOR;
         }
         if (splitLeftRegion.contains((int) inputCoordinates.x, (int) inputCoordinates.y)) {
             result = IndicatorType.TO_SPLIT_LEFT_INDICATOR;
@@ -160,9 +172,6 @@
         if (splitRightRegion.contains((int) inputCoordinates.x, (int) inputCoordinates.y)) {
             result = IndicatorType.TO_SPLIT_RIGHT_INDICATOR;
         }
-        if (toDesktopRegion.contains((int) inputCoordinates.x, (int) inputCoordinates.y)) {
-            result = IndicatorType.TO_DESKTOP_INDICATOR;
-        }
         if (mDragStartState != DragStartState.DRAGGED_INTENT) {
             transitionIndicator(result);
         }
@@ -182,7 +191,7 @@
                     R.dimen.desktop_mode_fullscreen_region_scale);
             final float toFullscreenWidth = (layout.width() * toFullscreenScale);
             region.union(new Rect((int) ((layout.width() / 2f) - (toFullscreenWidth / 2f)),
-                    -captionHeight,
+                    Short.MIN_VALUE,
                     (int) ((layout.width() / 2f) + (toFullscreenWidth / 2f)),
                     transitionHeight));
         }
@@ -192,7 +201,7 @@
                 || mDragStartState == DragStartState.DRAGGED_INTENT
         ) {
             region.union(new Rect(0,
-                    -captionHeight,
+                    Short.MIN_VALUE,
                     layout.width(),
                     transitionHeight));
         }
@@ -200,21 +209,6 @@
     }
 
     @VisibleForTesting
-    Region calculateToDesktopRegion(DisplayLayout layout,
-            Region splitLeftRegion, Region splitRightRegion,
-            Region toFullscreenRegion) {
-        final Region region = new Region();
-        // If in desktop, we need no region. Otherwise it's the same for all windowing modes.
-        if (mDragStartState != DragStartState.FROM_FREEFORM) {
-            region.union(new Rect(0, 0, layout.width(), layout.height()));
-            region.op(splitLeftRegion, Region.Op.DIFFERENCE);
-            region.op(splitRightRegion, Region.Op.DIFFERENCE);
-            region.op(toFullscreenRegion, Region.Op.DIFFERENCE);
-        }
-        return region;
-    }
-
-    @VisibleForTesting
     Region calculateSplitLeftRegion(DisplayLayout layout,
             int transitionEdgeWidth, int captionHeight) {
         final Region region = new Region();
@@ -311,7 +305,7 @@
                 }
             });
         }
-        mCurrentType = IndicatorType.NO_INDICATOR;
+        mCurrentType = NO_INDICATOR;
     }
 
     /**
@@ -322,9 +316,9 @@
         if (mView == null) {
             createView();
         }
-        if (mCurrentType == IndicatorType.NO_INDICATOR) {
+        if (mCurrentType == NO_INDICATOR) {
             fadeInIndicator(newType);
-        } else if (newType == IndicatorType.NO_INDICATOR) {
+        } else if (newType == NO_INDICATOR) {
             fadeOutIndicator(null /* finishCallback */);
         } else {
             final VisualIndicatorAnimator animator = VisualIndicatorAnimator.animateIndicatorType(
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt
new file mode 100644
index 0000000..c175133
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt
@@ -0,0 +1,540 @@
+/*
+ * Copyright (C) 2022 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.wm.shell.desktopmode
+
+import android.content.Context
+import android.graphics.Rect
+import android.graphics.Region
+import android.util.ArrayMap
+import android.util.ArraySet
+import android.util.SparseArray
+import android.view.Display.INVALID_DISPLAY
+import android.window.WindowContainerToken
+import androidx.core.util.forEach
+import androidx.core.util.keyIterator
+import androidx.core.util.valueIterator
+import com.android.internal.protolog.ProtoLog
+import com.android.window.flags.Flags
+import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository
+import com.android.wm.shell.desktopmode.persistence.DesktopTask
+import com.android.wm.shell.desktopmode.persistence.DesktopTaskState
+import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
+import com.android.wm.shell.shared.annotations.ShellMainThread
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
+import com.android.wm.shell.sysui.ShellInit
+import java.io.PrintWriter
+import java.util.concurrent.Executor
+import java.util.function.Consumer
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+
+/** Tracks desktop data for Android Desktop Windowing. */
+class DesktopRepository (
+    private val context: Context,
+    shellInit: ShellInit,
+    private val persistentRepository: DesktopPersistentRepository,
+    @ShellMainThread private val mainCoroutineScope: CoroutineScope,
+){
+
+    /**
+     * Task data tracked per desktop.
+     *
+     * @property activeTasks task ids of active tasks currently or previously visible in Desktop
+     * mode session. Tasks become inactive when task closes or when desktop mode session ends.
+     * @property visibleTasks task ids for active freeform tasks that are currently visible. There
+     * might be other active tasks in desktop mode that are not visible.
+     * @property minimizedTasks task ids for active freeform tasks that are currently minimized.
+     * @property closingTasks task ids for tasks that are going to close, but are currently visible.
+     * @property freeformTasksInZOrder list of current freeform task ids ordered from top to bottom
+     * @property fullImmersiveTaskId the task id of the desktop task that is in full-immersive mode.
+     * (top is at index 0).
+     */
+    private data class DesktopTaskData(
+        val activeTasks: ArraySet<Int> = ArraySet(),
+        val visibleTasks: ArraySet<Int> = ArraySet(),
+        val minimizedTasks: ArraySet<Int> = ArraySet(),
+        // TODO(b/332682201): Remove when the repository state is updated via TransitionObserver
+        val closingTasks: ArraySet<Int> = ArraySet(),
+        val freeformTasksInZOrder: ArrayList<Int> = ArrayList(),
+        var fullImmersiveTaskId: Int? = null,
+    ) {
+        fun deepCopy(): DesktopTaskData = DesktopTaskData(
+            activeTasks = ArraySet(activeTasks),
+            visibleTasks = ArraySet(visibleTasks),
+            minimizedTasks = ArraySet(minimizedTasks),
+            closingTasks = ArraySet(closingTasks),
+            freeformTasksInZOrder = ArrayList(freeformTasksInZOrder),
+            fullImmersiveTaskId = fullImmersiveTaskId
+        )
+        fun clear() {
+            activeTasks.clear()
+            visibleTasks.clear()
+            minimizedTasks.clear()
+            closingTasks.clear()
+            freeformTasksInZOrder.clear()
+            fullImmersiveTaskId = null
+        }
+    }
+
+    /* Current wallpaper activity token to remove wallpaper activity when last task is removed. */
+    var wallpaperActivityToken: WindowContainerToken? = null
+
+    private val activeTasksListeners = ArraySet<ActiveTasksListener>()
+    private val visibleTasksListeners = ArrayMap<VisibleTasksListener, Executor>()
+
+    /* Tracks corner/caption regions of desktop tasks, used to determine gesture exclusion. */
+    private val desktopExclusionRegions = SparseArray<Region>()
+
+    /* Tracks last bounds of task before toggled to stable bounds. */
+    private val boundsBeforeMaximizeByTaskId = SparseArray<Rect>()
+
+    private var desktopGestureExclusionListener: Consumer<Region>? = null
+    private var desktopGestureExclusionExecutor: Executor? = null
+
+    private val desktopTaskDataByDisplayId = object : SparseArray<DesktopTaskData>() {
+        /** Gets [DesktopTaskData] for existing [displayId] or creates a new one. */
+        fun getOrCreate(displayId: Int): DesktopTaskData =
+            this[displayId] ?: DesktopTaskData().also { this[displayId] = it }
+    }
+
+    init {
+        if (DesktopModeStatus.canEnterDesktopMode(context)) {
+            shellInit.addInitCallback(::initRepoFromPersistentStorage, this)
+        }
+    }
+
+    private fun initRepoFromPersistentStorage() {
+        if (!Flags.enableDesktopWindowingPersistence()) return
+        //  TODO: b/365962554 - Handle the case that user moves to desktop before it's initialized
+        mainCoroutineScope.launch {
+            val desktop = persistentRepository.readDesktop()
+            val maxTasks =
+                DesktopModeStatus.getMaxTaskLimit(context).takeIf { it > 0 }
+                    ?: desktop.zOrderedTasksCount
+
+            desktop.zOrderedTasksList
+                // Reverse it so we initialize the repo from bottom to top.
+                .reversed()
+                .map { taskId ->
+                    desktop.tasksByTaskIdMap.getOrDefault(
+                        taskId,
+                        DesktopTask.getDefaultInstance()
+                    )
+                }
+                .filter { task -> task.desktopTaskState == DesktopTaskState.VISIBLE }
+                .take(maxTasks)
+                .forEach { task ->
+                    addOrMoveFreeformTaskToTop(desktop.displayId, task.taskId)
+                    addActiveTask(desktop.displayId, task.taskId)
+                    updateTaskVisibility(desktop.displayId, task.taskId, visible = false)
+                }
+        }
+    }
+
+    /** Adds [activeTasksListener] to be notified of updates to active tasks. */
+    fun addActiveTaskListener(activeTasksListener: ActiveTasksListener) {
+        activeTasksListeners.add(activeTasksListener)
+    }
+
+    /** Adds [visibleTasksListener] to be notified of updates to visible tasks. */
+    fun addVisibleTasksListener(visibleTasksListener: VisibleTasksListener, executor: Executor) {
+        visibleTasksListeners[visibleTasksListener] = executor
+        desktopTaskDataByDisplayId.keyIterator().forEach {
+            val visibleTaskCount = getVisibleTaskCount(it)
+            executor.execute {
+                visibleTasksListener.onTasksVisibilityChanged(it, visibleTaskCount)
+            }
+        }
+    }
+
+    /** Updates tasks changes on all the active task listeners for given display id. */
+    private fun updateActiveTasksListeners(displayId: Int) {
+        activeTasksListeners.onEach { it.onActiveTasksChanged(displayId) }
+    }
+
+    /** Returns a list of all [DesktopTaskData] in the repository. */
+    private fun desktopTaskDataSequence(): Sequence<DesktopTaskData> =
+        desktopTaskDataByDisplayId.valueIterator().asSequence()
+
+    /** Adds [regionListener] to inform about changes to exclusion regions for all Desktop tasks. */
+    fun setExclusionRegionListener(regionListener: Consumer<Region>, executor: Executor) {
+        desktopGestureExclusionListener = regionListener
+        desktopGestureExclusionExecutor = executor
+        executor.execute {
+            desktopGestureExclusionListener?.accept(calculateDesktopExclusionRegion())
+        }
+    }
+
+    /** Creates a new merged region representative of all exclusion regions in all desktop tasks. */
+    private fun calculateDesktopExclusionRegion(): Region {
+        val desktopExclusionRegion = Region()
+        desktopExclusionRegions.valueIterator().forEach { taskExclusionRegion ->
+            desktopExclusionRegion.op(taskExclusionRegion, Region.Op.UNION)
+        }
+        return desktopExclusionRegion
+    }
+
+    /** Remove the previously registered [activeTasksListener] */
+    fun removeActiveTasksListener(activeTasksListener: ActiveTasksListener) {
+        activeTasksListeners.remove(activeTasksListener)
+    }
+
+    /** Removes the previously registered [visibleTasksListener]. */
+    fun removeVisibleTasksListener(visibleTasksListener: VisibleTasksListener) {
+        visibleTasksListeners.remove(visibleTasksListener)
+    }
+
+    /** Adds task with [taskId] to the list of active tasks on [displayId]. */
+    fun addActiveTask(displayId: Int, taskId: Int) {
+        // Removes task if it is active on another display excluding [displayId].
+        removeActiveTask(taskId, excludedDisplayId = displayId)
+
+        if (desktopTaskDataByDisplayId.getOrCreate(displayId).activeTasks.add(taskId)) {
+            logD("Adds active task=%d displayId=%d", taskId, displayId)
+            updateActiveTasksListeners(displayId)
+        }
+    }
+
+    /** Removes task from active task list of displays excluding the [excludedDisplayId]. */
+    fun removeActiveTask(taskId: Int, excludedDisplayId: Int? = null) {
+        desktopTaskDataByDisplayId.forEach { displayId, desktopTaskData ->
+            if ((displayId != excludedDisplayId)
+                    && desktopTaskData.activeTasks.remove(taskId)) {
+                logD("Removed active task=%d displayId=%d", taskId, displayId)
+                updateActiveTasksListeners(displayId)
+            }
+        }
+    }
+
+    /** Adds given task to the closing task list for [displayId]. */
+    fun addClosingTask(displayId: Int, taskId: Int) {
+        if (desktopTaskDataByDisplayId.getOrCreate(displayId).closingTasks.add(taskId)) {
+            logD("Added closing task=%d displayId=%d", taskId, displayId)
+        } else {
+            // If the task hasn't been removed from closing list after it disappeared.
+            logW("Task with taskId=%d displayId=%d is already closing", taskId, displayId)
+        }
+    }
+
+    /** Removes task from the list of closing tasks for [displayId]. */
+    fun removeClosingTask(taskId: Int) {
+        desktopTaskDataByDisplayId.forEach { displayId, taskInfo ->
+            if (taskInfo.closingTasks.remove(taskId)) {
+                logD("Removed closing task=%d displayId=%d", taskId, displayId)
+            }
+        }
+    }
+
+    fun isActiveTask(taskId: Int) = desktopTaskDataSequence().any { taskId in it.activeTasks }
+    fun isClosingTask(taskId: Int) = desktopTaskDataSequence().any { taskId in it.closingTasks }
+    fun isVisibleTask(taskId: Int) = desktopTaskDataSequence().any { taskId in it.visibleTasks }
+    fun isMinimizedTask(taskId: Int) = desktopTaskDataSequence().any { taskId in it.minimizedTasks }
+
+    /** Checks if a task is the only visible, non-closing, non-minimized task on its display. */
+    fun isOnlyVisibleNonClosingTask(taskId: Int): Boolean =
+        desktopTaskDataSequence().any { it.visibleTasks
+            .subtract(it.closingTasks)
+            .subtract(it.minimizedTasks)
+            .singleOrNull() == taskId
+        }
+
+    fun getActiveTasks(displayId: Int): ArraySet<Int> =
+        ArraySet(desktopTaskDataByDisplayId[displayId]?.activeTasks)
+
+    fun getMinimizedTasks(displayId: Int): ArraySet<Int> =
+        ArraySet(desktopTaskDataByDisplayId[displayId]?.minimizedTasks)
+
+    /** Returns all active non-minimized tasks for [displayId] ordered from top to bottom. */
+    fun getActiveNonMinimizedOrderedTasks(displayId: Int): List<Int> =
+        getFreeformTasksInZOrder(displayId).filter { !isMinimizedTask(it) }
+
+    /** Returns the count of active non-minimized tasks for [displayId]. */
+    fun getActiveNonMinimizedTaskCount(displayId: Int): Int {
+        return getActiveTasks(displayId).count { !isMinimizedTask(it) }
+    }
+
+    /** Returns a list of freeform tasks, ordered from top-bottom (top at index 0). */
+    fun getFreeformTasksInZOrder(displayId: Int): ArrayList<Int> =
+        ArrayList(desktopTaskDataByDisplayId[displayId]?.freeformTasksInZOrder ?: emptyList())
+
+    /** Removes task from visible tasks of all displays except [excludedDisplayId]. */
+    private fun removeVisibleTask(taskId: Int, excludedDisplayId: Int? = null) {
+        desktopTaskDataByDisplayId.forEach { displayId, data ->
+            if ((displayId != excludedDisplayId) && data.visibleTasks.remove(taskId)) {
+                notifyVisibleTaskListeners(displayId, data.visibleTasks.size)
+            }
+        }
+    }
+
+    /**
+     * Updates visibility of a freeform task with [taskId] on [displayId] and notifies listeners.
+     *
+     * If task was visible on a different display with a different [displayId], removes from
+     * the set of visible tasks on that display and notifies listeners.
+     */
+    fun updateTaskVisibility(displayId: Int, taskId: Int, visible: Boolean) {
+        if (visible) {
+            // If task is visible, remove it from any other display besides [displayId].
+            removeVisibleTask(taskId, excludedDisplayId = displayId)
+        } else if (displayId == INVALID_DISPLAY) {
+            // Task has vanished. Check which display to remove the task from.
+            removeVisibleTask(taskId)
+            return
+        }
+        val prevCount = getVisibleTaskCount(displayId)
+        if (visible) {
+            desktopTaskDataByDisplayId.getOrCreate(displayId).visibleTasks.add(taskId)
+            unminimizeTask(displayId, taskId)
+        } else {
+            desktopTaskDataByDisplayId[displayId]?.visibleTasks?.remove(taskId)
+        }
+        val newCount = getVisibleTaskCount(displayId)
+        if (prevCount != newCount) {
+            logD("Update task visibility taskId=%d visible=%b displayId=%d",
+                taskId, visible, displayId)
+            logD("VisibleTaskCount has changed from %d to %d", prevCount, newCount)
+            notifyVisibleTaskListeners(displayId, newCount)
+        }
+    }
+
+    /** Set whether the given task is the full-immersive task in this display. */
+    fun setTaskInFullImmersiveState(displayId: Int, taskId: Int, immersive: Boolean) {
+        val desktopData = desktopTaskDataByDisplayId.getOrCreate(displayId)
+        if (immersive) {
+            desktopData.fullImmersiveTaskId = taskId
+        } else {
+            if (desktopData.fullImmersiveTaskId == taskId) {
+                desktopData.fullImmersiveTaskId = null
+            }
+        }
+    }
+
+    /* Whether the task is in full-immersive state. */
+    fun isTaskInFullImmersiveState(taskId: Int): Boolean {
+        return desktopTaskDataSequence().any { taskId == it.fullImmersiveTaskId }
+    }
+
+    private fun notifyVisibleTaskListeners(displayId: Int, visibleTasksCount: Int) {
+        visibleTasksListeners.forEach { (listener, executor) ->
+            executor.execute { listener.onTasksVisibilityChanged(displayId, visibleTasksCount) }
+        }
+    }
+
+    /** Gets number of visible tasks on given [displayId] */
+    fun getVisibleTaskCount(displayId: Int): Int =
+        desktopTaskDataByDisplayId[displayId]?.visibleTasks?.size ?: 0.also {
+            logD("getVisibleTaskCount=$it")
+        }
+
+    /**
+     * Adds task (or moves if it already exists) to the top of the ordered list.
+     *
+     * Unminimizes the task if it is minimized.
+     */
+    fun addOrMoveFreeformTaskToTop(displayId: Int, taskId: Int) {
+        logD("Add or move task to top: display=%d taskId=%d", taskId, displayId)
+        desktopTaskDataByDisplayId[displayId]?.freeformTasksInZOrder?.remove(taskId)
+        desktopTaskDataByDisplayId.getOrCreate(displayId).freeformTasksInZOrder.add(0, taskId)
+        // Unminimize the task if it is minimized.
+        unminimizeTask(displayId, taskId)
+        if (Flags.enableDesktopWindowingPersistence()) {
+            updatePersistentRepository(displayId)
+        }
+    }
+
+    /** Minimizes the task for [taskId] and [displayId] */
+    fun minimizeTask(displayId: Int, taskId: Int) {
+        if (displayId == INVALID_DISPLAY) {
+            // When a task vanishes it doesn't have a displayId. Find the display of the task and
+            // mark it as minimized.
+            getDisplayIdForTask(taskId)?.let {
+                minimizeTask(it, taskId)
+            } ?: logW("Minimize task: No display id found for task: taskId=%d", taskId)
+        } else {
+            logD("Minimize Task: display=%d, task=%d", displayId, taskId)
+            desktopTaskDataByDisplayId.getOrCreate(displayId).minimizedTasks.add(taskId)
+        }
+
+        if (Flags.enableDesktopWindowingPersistence()) {
+            updatePersistentRepository(displayId)
+        }
+    }
+
+    /** Unminimizes the task for [taskId] and [displayId] */
+    fun unminimizeTask(displayId: Int, taskId: Int) {
+        logD("Unminimize Task: display=%d, task=%d", displayId, taskId)
+        desktopTaskDataByDisplayId[displayId]?.minimizedTasks?.remove(taskId) ?:
+            logW("Unminimize Task: display=%d, task=%d, no task data", displayId, taskId)
+    }
+
+    private fun getDisplayIdForTask(taskId: Int): Int? {
+        desktopTaskDataByDisplayId.forEach { displayId, data ->
+            if (taskId in data.freeformTasksInZOrder) {
+                return displayId
+            }
+        }
+        logW("No display id found for task: taskId=%d", taskId)
+        return null
+    }
+
+    /**
+     * Removes [taskId] from the respective display. If [INVALID_DISPLAY], the original display id
+     * will be looked up from the task id.
+     */
+    fun removeFreeformTask(displayId: Int, taskId: Int) {
+        logD("Removes freeform task: taskId=%d", taskId)
+        if (displayId == INVALID_DISPLAY) {
+            // Removes the original display id of the task.
+            getDisplayIdForTask(taskId)?.let { removeTaskFromDisplay(it, taskId) }
+        } else {
+            removeTaskFromDisplay(displayId, taskId)
+        }
+    }
+
+    /** Removes given task from a valid [displayId] and updates the repository state. */
+    private fun removeTaskFromDisplay(displayId: Int, taskId: Int) {
+        logD("Removes freeform task: taskId=%d, displayId=%d", taskId, displayId)
+        desktopTaskDataByDisplayId[displayId]?.freeformTasksInZOrder?.remove(taskId)
+        boundsBeforeMaximizeByTaskId.remove(taskId)
+        logD("Remaining freeform tasks: %s",
+            desktopTaskDataByDisplayId[displayId]?.freeformTasksInZOrder?.toDumpString())
+        // Remove task from unminimized task if it is minimized.
+        unminimizeTask(displayId, taskId)
+        removeActiveTask(taskId)
+        updateTaskVisibility(displayId, taskId, visible = false)
+        if (Flags.enableDesktopWindowingPersistence()) {
+            updatePersistentRepository(displayId)
+        }
+    }
+
+    /**
+     * Removes the desktop for the given [displayId] and returns the active tasks on that desktop.
+     */
+    fun removeDesktop(displayId: Int): ArraySet<Int> {
+        if (!desktopTaskDataByDisplayId.contains(displayId)) {
+            logW("Could not find desktop to remove: displayId=%d", displayId)
+            return ArraySet()
+        }
+        val activeTasks = ArraySet(desktopTaskDataByDisplayId[displayId].activeTasks)
+        desktopTaskDataByDisplayId[displayId].clear()
+        return activeTasks
+    }
+
+    /**
+     * Updates active desktop gesture exclusion regions.
+     *
+     * If [desktopExclusionRegions] is accepted by [desktopGestureExclusionListener], updates it in
+     * appropriate classes.
+     */
+    fun updateTaskExclusionRegions(taskId: Int, taskExclusionRegions: Region) {
+        desktopExclusionRegions.put(taskId, taskExclusionRegions)
+        desktopGestureExclusionExecutor?.execute {
+            desktopGestureExclusionListener?.accept(calculateDesktopExclusionRegion())
+        }
+    }
+
+    /**
+     * Removes desktop gesture exclusion region for the specified task.
+     *
+     * If [desktopExclusionRegions] is accepted by [desktopGestureExclusionListener], updates it in
+     * appropriate classes.
+     */
+    fun removeExclusionRegion(taskId: Int) {
+        desktopExclusionRegions.delete(taskId)
+        desktopGestureExclusionExecutor?.execute {
+            desktopGestureExclusionListener?.accept(calculateDesktopExclusionRegion())
+        }
+    }
+
+    /** Removes and returns the bounds saved before maximizing the given task. */
+    fun removeBoundsBeforeMaximize(taskId: Int): Rect? =
+        boundsBeforeMaximizeByTaskId.removeReturnOld(taskId)
+
+    /** Saves the bounds of the given task before maximizing. */
+    fun saveBoundsBeforeMaximize(taskId: Int, bounds: Rect) =
+        boundsBeforeMaximizeByTaskId.set(taskId, Rect(bounds))
+
+    private fun updatePersistentRepository(displayId: Int) {
+        // Create a deep copy of the data
+        desktopTaskDataByDisplayId[displayId]?.deepCopy()?.let { desktopTaskDataByDisplayIdCopy ->
+            mainCoroutineScope.launch {
+                try {
+                    persistentRepository.addOrUpdateDesktop(
+                        visibleTasks = desktopTaskDataByDisplayIdCopy.visibleTasks,
+                        minimizedTasks = desktopTaskDataByDisplayIdCopy.minimizedTasks,
+                        freeformTasksInZOrder = desktopTaskDataByDisplayIdCopy.freeformTasksInZOrder
+                    )
+                } catch (exception: Exception) {
+                    logE(
+                        "An exception occurred while updating the persistent repository \n%s",
+                        exception.stackTrace
+                    )
+                }
+            }
+        }
+    }
+
+    internal fun dump(pw: PrintWriter, prefix: String) {
+        val innerPrefix = "$prefix  "
+        pw.println("${prefix}DesktopRepository")
+        dumpDesktopTaskData(pw, innerPrefix)
+        pw.println("${innerPrefix}activeTasksListeners=${activeTasksListeners.size}")
+        pw.println("${innerPrefix}visibleTasksListeners=${visibleTasksListeners.size}")
+    }
+
+    private fun dumpDesktopTaskData(pw: PrintWriter, prefix: String) {
+        val innerPrefix = "$prefix  "
+        desktopTaskDataByDisplayId.forEach { displayId, data ->
+            pw.println("${prefix}Display $displayId:")
+            pw.println("${innerPrefix}activeTasks=${data.activeTasks.toDumpString()}")
+            pw.println("${innerPrefix}visibleTasks=${data.visibleTasks.toDumpString()}")
+            pw.println(
+                "${innerPrefix}freeformTasksInZOrder=${data.freeformTasksInZOrder.toDumpString()}"
+            )
+            pw.println("${innerPrefix}minimizedTasks=${data.minimizedTasks.toDumpString()}")
+        }
+    }
+
+    /** Listens to changes for active tasks in desktop mode. */
+    interface ActiveTasksListener {
+        fun onActiveTasksChanged(displayId: Int) {}
+    }
+
+    /** Listens to changes for visible tasks in desktop mode. */
+    interface VisibleTasksListener {
+        fun onTasksVisibilityChanged(displayId: Int, visibleTasksCount: Int) {}
+    }
+
+    private fun logD(msg: String, vararg arguments: Any?) {
+        ProtoLog.d(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
+    }
+
+    private fun logW(msg: String, vararg arguments: Any?) {
+        ProtoLog.w(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
+    }
+
+    private fun logE(msg: String, vararg arguments: Any?) {
+        ProtoLog.e(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
+    }
+
+    companion object {
+        private const val TAG = "DesktopRepository"
+    }
+}
+
+private fun <T> Iterable<T>.toDumpString(): String =
+    joinToString(separator = ", ", prefix = "[", postfix = "]")
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt
new file mode 100644
index 0000000..1ee2de9
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.desktopmode
+
+import android.app.ActivityManager.RunningTaskInfo
+import com.android.wm.shell.freeform.TaskChangeListener
+
+/** Manages tasks handling specific to Android Desktop Mode. */
+class DesktopTaskChangeListener: TaskChangeListener {
+
+  override fun onTaskOpening(taskInfo: RunningTaskInfo) {
+    // TODO: b/367268953 - Connect this with DesktopRepository.
+  }
+
+  override fun onTaskChanging(taskInfo: RunningTaskInfo) {
+    // TODO: b/367268953 - Connect this with DesktopRepository.
+  }
+
+  override fun onTaskMovingToFront(taskInfo: RunningTaskInfo) {
+    // TODO: b/367268953 - Connect this with DesktopRepository.
+  }
+
+  override fun onTaskMovingToBack(taskInfo: RunningTaskInfo) {
+    // TODO: b/367268953 - Connect this with DesktopRepository.
+  }
+
+  override fun onTaskClosing(taskInfo: RunningTaskInfo) {
+    // TODO: b/367268953 - Connect this with DesktopRepository.
+  }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
index 968f40c..fa8b6e6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
@@ -16,6 +16,7 @@
 
 package com.android.wm.shell.desktopmode
 
+import android.app.ActivityManager
 import android.app.ActivityManager.RunningTaskInfo
 import android.app.ActivityOptions
 import android.app.KeyguardManager
@@ -43,6 +44,7 @@
 import android.view.DragEvent
 import android.view.SurfaceControl
 import android.view.WindowManager.TRANSIT_CHANGE
+import android.view.WindowManager.TRANSIT_CLOSE
 import android.view.WindowManager.TRANSIT_NONE
 import android.view.WindowManager.TRANSIT_OPEN
 import android.view.WindowManager.TRANSIT_TO_FRONT
@@ -50,6 +52,10 @@
 import android.window.TransitionInfo
 import android.window.TransitionRequestInfo
 import android.window.WindowContainerTransaction
+import android.window.flags.DesktopModeFlags
+import android.window.flags.DesktopModeFlags.DISABLE_NON_RESIZABLE_APP_SNAP_RESIZE
+import android.window.flags.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY
+import android.window.flags.DesktopModeFlags.ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS
 import androidx.annotation.BinderThread
 import com.android.internal.annotations.VisibleForTesting
 import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_HOLD
@@ -72,7 +78,7 @@
 import com.android.wm.shell.common.SingleInstanceRemoteListener
 import com.android.wm.shell.common.SyncTransactionQueue
 import com.android.wm.shell.compatui.isTopActivityExemptFromDesktopWindowing
-import com.android.wm.shell.desktopmode.DesktopModeTaskRepository.VisibleTasksListener
+import com.android.wm.shell.desktopmode.DesktopRepository.VisibleTasksListener
 import com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.DragStartState
 import com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.IndicatorType
 import com.android.wm.shell.desktopmode.DragToDesktopTransitionHandler.DragToDesktopStateListener
@@ -85,10 +91,6 @@
 import com.android.wm.shell.shared.TransitionUtil
 import com.android.wm.shell.shared.annotations.ExternalThread
 import com.android.wm.shell.shared.annotations.ShellMainThread
-import android.window.flags.DesktopModeFlags
-import android.window.flags.DesktopModeFlags.DISABLE_NON_RESIZABLE_APP_SNAP_RESIZE
-import android.window.flags.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY
-import android.window.flags.DesktopModeFlags.ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.DESKTOP_DENSITY_OVERRIDE
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.useDesktopOverrideDensity
@@ -100,6 +102,7 @@
 import com.android.wm.shell.sysui.ShellCommandHandler
 import com.android.wm.shell.sysui.ShellController
 import com.android.wm.shell.sysui.ShellInit
+import com.android.wm.shell.sysui.UserChangeListener
 import com.android.wm.shell.transition.OneShotRemoteHandler
 import com.android.wm.shell.transition.Transitions
 import com.android.wm.shell.windowdecor.DragPositioningCallbackUtility
@@ -108,6 +111,7 @@
 import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener
 import com.android.wm.shell.windowdecor.extension.isFullscreen
 import com.android.wm.shell.windowdecor.extension.isMultiWindow
+import com.android.wm.shell.windowdecor.extension.requestingImmersive
 import java.io.PrintWriter
 import java.util.Optional
 import java.util.concurrent.Executor
@@ -132,7 +136,8 @@
     private val desktopModeDragAndDropTransitionHandler: DesktopModeDragAndDropTransitionHandler,
     private val toggleResizeDesktopTaskTransitionHandler: ToggleResizeDesktopTaskTransitionHandler,
     private val dragToDesktopTransitionHandler: DragToDesktopTransitionHandler,
-    private val taskRepository: DesktopModeTaskRepository,
+    private val immersiveTransitionHandler: DesktopFullImmersiveTransitionHandler,
+    private val taskRepository: DesktopRepository,
     private val desktopModeLoggerTransitionObserver: DesktopModeLoggerTransitionObserver,
     private val launchAdjacentController: LaunchAdjacentController,
     private val recentsTransitionHandler: RecentsTransitionHandler,
@@ -145,10 +150,12 @@
 ) :
     RemoteCallable<DesktopTasksController>,
     Transitions.TransitionHandler,
-    DragAndDropController.DragAndDropListener {
+    DragAndDropController.DragAndDropListener,
+    UserChangeListener {
 
     private val desktopMode: DesktopModeImpl
     private var visualIndicator: DesktopModeVisualIndicator? = null
+    private var userId: Int
     private val desktopModeShellCommandHandler: DesktopModeShellCommandHandler =
         DesktopModeShellCommandHandler(this)
     private val mOnAnimationFinishedCallback =
@@ -192,6 +199,7 @@
         if (DesktopModeStatus.canEnterDesktopMode(context)) {
             shellInit.addInitCallback({ onInit() }, this)
         }
+        userId = ActivityManager.getCurrentUser()
     }
 
     private fun onInit() {
@@ -203,6 +211,7 @@
             { createExternalInterface() },
             this
         )
+        shellController.addUserChangeListener(this)
         transitions.addHandler(this)
         dragToDesktopTransitionHandler.dragToDesktopStateListener = dragToDesktopStateListener
         recentsTransitionHandler.addTransitionStateListener(
@@ -225,6 +234,7 @@
         toggleResizeDesktopTaskTransitionHandler.setOnTaskResizeAnimationListener(listener)
         enterDesktopTaskTransitionHandler.setOnTaskResizeAnimationListener(listener)
         dragToDesktopTransitionHandler.onTaskResizeAnimationListener = listener
+        immersiveTransitionHandler.onTaskResizeAnimationListener = listener
     }
 
     fun setOnTaskRepositionAnimationListener(listener: OnTaskRepositionAnimationListener) {
@@ -252,17 +262,12 @@
         val wct = WindowContainerTransaction()
         bringDesktopAppsToFront(displayId, wct)
 
-        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            val transitionType = transitionType(remoteTransition)
-            val handler =
-                remoteTransition?.let {
-                    OneShotRemoteHandler(transitions.mainExecutor, remoteTransition)
-                }
-            transitions.startTransition(transitionType, wct, handler).also { t ->
-                handler?.setTransition(t)
-            }
-        } else {
-            shellTaskOrganizer.applyTransaction(wct)
+        val transitionType = transitionType(remoteTransition)
+        val handler = remoteTransition?.let {
+            OneShotRemoteHandler(transitions.mainExecutor, remoteTransition)
+        }
+        transitions.startTransition(transitionType, wct, handler).also { t ->
+            handler?.setTransition(t)
         }
     }
 
@@ -379,12 +384,8 @@
             bringDesktopAppsToFrontBeforeShowingNewTask(task.displayId, wct, task.taskId)
         addMoveToDesktopChanges(wct, task)
 
-        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
-            addPendingMinimizeTransition(transition, taskToMinimize)
-        } else {
-            shellTaskOrganizer.applyTransaction(wct)
-        }
+        val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
+        addPendingMinimizeTransition(transition, taskToMinimize)
     }
 
     /**
@@ -400,7 +401,7 @@
         interactionJankMonitor.begin(taskSurface, context, handler,
             CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_HOLD)
         dragToDesktopTransitionHandler.startDragToDesktopTransition(
-            taskInfo.taskId,
+            taskInfo,
             dragToDesktopValueAnimator
         )
     }
@@ -490,11 +491,9 @@
         // Rather than set windowing mode to multi-window at task level, set it to
         // undefined and inherit from split stage.
         wct.setWindowingMode(task.token, WINDOWING_MODE_UNDEFINED)
-        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */)
-        } else {
-            shellTaskOrganizer.applyTransaction(wct)
-        }
+
+        transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */)
+
     }
 
     private fun exitSplitIfApplicable(wct: WindowContainerTransaction, taskInfo: RunningTaskInfo) {
@@ -528,36 +527,51 @@
         val wct = WindowContainerTransaction()
         addMoveToFullscreenChanges(wct, task)
 
-        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            exitDesktopTaskTransitionHandler.startTransition(
+        exitDesktopTaskTransitionHandler.startTransition(
                 transitionSource,
                 wct,
                 position,
                 mOnAnimationFinishedCallback
             )
-        } else {
-            shellTaskOrganizer.applyTransaction(wct)
-            releaseVisualIndicator()
-        }
     }
 
     /** Move a task to the front */
     fun moveTaskToFront(taskId: Int) {
-        shellTaskOrganizer.getRunningTaskInfo(taskId)?.let { task -> moveTaskToFront(task) }
+        val task = shellTaskOrganizer.getRunningTaskInfo(taskId)
+        if (task == null) moveBackgroundTaskToFront(taskId) else moveTaskToFront(task)
+    }
+
+    /**
+     * Launch a background task in desktop. Note that this should be used when we are already in
+     * desktop. If outside of desktop and want to launch a background task in desktop, use
+     * [moveBackgroundTaskToDesktop] instead.
+     */
+    private fun moveBackgroundTaskToFront(taskId: Int) {
+        logV("moveBackgroundTaskToFront taskId=%s", taskId)
+        val wct = WindowContainerTransaction()
+        // TODO: b/342378842 - Instead of using default display, support multiple displays
+        val taskToMinimize: RunningTaskInfo? =
+            addAndGetMinimizeChangesIfNeeded(DEFAULT_DISPLAY, wct, taskId)
+        wct.startTask(
+            taskId,
+            ActivityOptions.makeBasic().apply {
+                launchWindowingMode = WINDOWING_MODE_FREEFORM
+            }.toBundle(),
+        )
+        val transition = transitions.startTransition(TRANSIT_OPEN, wct, null /* handler */)
+        addPendingMinimizeTransition(transition, taskToMinimize)
     }
 
     /** Move a task to the front */
     fun moveTaskToFront(taskInfo: RunningTaskInfo) {
         logV("moveTaskToFront taskId=%s", taskInfo.taskId)
         val wct = WindowContainerTransaction()
-        wct.reorder(taskInfo.token, true)
-        val taskToMinimize = addAndGetMinimizeChangesIfNeeded(taskInfo.displayId, wct, taskInfo)
-        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            val transition = transitions.startTransition(TRANSIT_TO_FRONT, wct, null /* handler */)
-            addPendingMinimizeTransition(transition, taskToMinimize)
-        } else {
-            shellTaskOrganizer.applyTransaction(wct)
-        }
+        wct.reorder(taskInfo.token, true /* onTop */, true /* includingParents */)
+        val taskToMinimize =
+            addAndGetMinimizeChangesIfNeeded(taskInfo.displayId, wct, taskInfo.taskId)
+
+        val transition = transitions.startTransition(TRANSIT_TO_FRONT, wct, null /* handler */)
+        addPendingMinimizeTransition(transition, taskToMinimize)
     }
 
     /**
@@ -613,13 +627,40 @@
 
         val wct = WindowContainerTransaction()
         wct.reparent(task.token, displayAreaInfo.token, true /* onTop */)
-        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */)
+
+        transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */)
+
+    }
+
+    /** Moves a task in/out of full immersive state within the desktop. */
+    fun toggleDesktopTaskFullImmersiveState(taskInfo: RunningTaskInfo) {
+        if (taskRepository.isTaskInFullImmersiveState(taskInfo.taskId)) {
+            exitDesktopTaskFromFullImmersive(taskInfo)
         } else {
-            shellTaskOrganizer.applyTransaction(wct)
+            moveDesktopTaskToFullImmersive(taskInfo)
         }
     }
 
+    private fun moveDesktopTaskToFullImmersive(taskInfo: RunningTaskInfo) {
+        check(taskInfo.isFreeform) { "Task must already be in freeform" }
+        val wct = WindowContainerTransaction().apply {
+            setBounds(taskInfo.token, Rect())
+        }
+        immersiveTransitionHandler.enterImmersive(taskInfo, wct)
+    }
+
+    private fun exitDesktopTaskFromFullImmersive(taskInfo: RunningTaskInfo) {
+        check(taskInfo.isFreeform) { "Task must already be in freeform" }
+        val displayLayout = displayController.getDisplayLayout(taskInfo.displayId) ?: return
+        val stableBounds = Rect().apply { displayLayout.getStableBounds(this) }
+        val destinationBounds = getMaximizeBounds(taskInfo, stableBounds)
+
+        val wct = WindowContainerTransaction().apply {
+            setBounds(taskInfo.token, destinationBounds)
+        }
+        immersiveTransitionHandler.exitImmersive(taskInfo, wct)
+    }
+
     /**
      * Quick-resizes a desktop task, toggling between a fullscreen state (represented by the stable
      * bounds) and a free floating state (either the last saved bounds if available or the default
@@ -656,18 +697,7 @@
             // and toggle to the stable bounds.
             taskRepository.saveBoundsBeforeMaximize(taskInfo.taskId, currentTaskBounds)
 
-            if (taskInfo.isResizeable) {
-                // if resizable then expand to entire stable bounds (full display minus insets)
-                destinationBounds.set(stableBounds)
-            } else {
-                // if non-resizable then calculate max bounds according to aspect ratio
-                val activityAspectRatio = calculateAspectRatio(taskInfo)
-                val newSize = maximizeSizeGivenAspectRatio(taskInfo,
-                    Size(stableBounds.width(), stableBounds.height()), activityAspectRatio)
-                val newBounds = centerInArea(
-                    newSize, stableBounds, stableBounds.left, stableBounds.top)
-                destinationBounds.set(newBounds)
-            }
+            destinationBounds.set(getMaximizeBounds(taskInfo, stableBounds))
         }
 
 
@@ -683,10 +713,22 @@
 
         taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate(doesAnyTaskRequireTaskbarRounding)
         val wct = WindowContainerTransaction().setBounds(taskInfo.token, destinationBounds)
-        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            toggleResizeDesktopTaskTransitionHandler.startTransition(wct)
+
+        toggleResizeDesktopTaskTransitionHandler.startTransition(wct)
+
+    }
+
+    private fun getMaximizeBounds(taskInfo: RunningTaskInfo, stableBounds: Rect): Rect {
+        if (taskInfo.isResizeable) {
+            // if resizable then expand to entire stable bounds (full display minus insets)
+            return Rect(stableBounds)
         } else {
-            shellTaskOrganizer.applyTransaction(wct)
+            // if non-resizable then calculate max bounds according to aspect ratio
+            val activityAspectRatio = calculateAspectRatio(taskInfo)
+            val newSize = maximizeSizeGivenAspectRatio(taskInfo,
+                Size(stableBounds.width(), stableBounds.height()), activityAspectRatio)
+            return centerInArea(
+                newSize, stableBounds, stableBounds.left, stableBounds.top)
         }
     }
 
@@ -783,11 +825,9 @@
 
         taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate(true)
         val wct = WindowContainerTransaction().setBounds(taskInfo.token, destinationBounds)
-        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            toggleResizeDesktopTaskTransitionHandler.startTransition(wct, currentDragBounds)
-        } else {
-            shellTaskOrganizer.applyTransaction(wct)
-        }
+
+        toggleResizeDesktopTaskTransitionHandler.startTransition(wct, currentDragBounds)
+
     }
 
     @VisibleForTesting
@@ -1061,7 +1101,10 @@
                     // Check if freeform task launch during recents should be handled
                     shouldHandleMidRecentsFreeformLaunch -> handleMidRecentsFreeformTaskLaunch(task)
                     // Check if the closing task needs to be handled
-                    TransitionUtil.isClosingType(request.type) -> handleTaskClosing(task)
+                    TransitionUtil.isClosingType(request.type) -> handleTaskClosing(
+                        task,
+                        request.type
+                    )
                     // Check if the top task shouldn't be allowed to enter desktop mode
                     isIncompatibleTask(task) -> handleIncompatibleTaskLaunch(task)
                     // Check if fullscreen task should be updated
@@ -1244,7 +1287,7 @@
         }
         // Desktop Mode is showing and we're launching a new Task - we might need to minimize
         // a Task.
-        val taskToMinimize = addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task)
+        val taskToMinimize = addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task.taskId)
         if (taskToMinimize != null) {
             addPendingMinimizeTransition(transition, taskToMinimize)
             return wct
@@ -1270,7 +1313,8 @@
 
                 // Desktop Mode is already showing and we're launching a new Task - we might need to
                 // minimize another Task.
-                val taskToMinimize = addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task)
+                val taskToMinimize =
+                    addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task.taskId)
                 addPendingMinimizeTransition(transition, taskToMinimize)
             }
         }
@@ -1288,7 +1332,10 @@
     }
 
     /** Handle task closing by removing wallpaper activity if it's the last active task */
-    private fun handleTaskClosing(task: RunningTaskInfo): WindowContainerTransaction? {
+    private fun handleTaskClosing(
+        task: RunningTaskInfo,
+        transitionType: Int
+    ): WindowContainerTransaction? {
         logV("handleTaskClosing")
         if (!isDesktopModeShowing(task.displayId))
             return null
@@ -1300,13 +1347,11 @@
             // Remove wallpaper activity when the last active task is removed
             removeWallpaperActivity(wct)
         }
-        taskRepository.addClosingTask(task.displayId, task.taskId)
-        // If a CLOSE or TO_BACK is triggered on a desktop task, remove the task.
-        if (DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue() &&
-            taskRepository.isVisibleTask(task.taskId)
-        ) {
-            wct.removeTask(task.token)
+
+        if (!DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue()) {
+            taskRepository.addClosingTask(task.displayId, task.taskId)
         }
+
         taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate(
             doesAnyTaskRequireTaskbarRounding(
                 task.displayId,
@@ -1411,12 +1456,12 @@
     private fun addAndGetMinimizeChangesIfNeeded(
         displayId: Int,
         wct: WindowContainerTransaction,
-        newTaskInfo: RunningTaskInfo
+        newTaskId: Int
     ): RunningTaskInfo? {
         if (!desktopTasksLimiter.isPresent) return null
         return desktopTasksLimiter
             .get()
-            .addAndGetMinimizeTaskChangesIfNeeded(displayId, wct, newTaskInfo)
+            .addAndGetMinimizeTaskChangesIfNeeded(displayId, wct, newTaskId)
     }
 
     private fun addPendingMinimizeTransition(
@@ -1429,6 +1474,22 @@
         }
     }
 
+    fun removeDesktop(displayId: Int) {
+        if (!DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue()) return
+
+        val tasksToRemove = taskRepository.removeDesktop(displayId)
+        val wct = WindowContainerTransaction()
+        tasksToRemove.forEach {
+            val task = shellTaskOrganizer.getRunningTaskInfo(it)
+            if (task != null) {
+                wct.removeTask(task.token)
+            } else {
+                recentTasksController?.removeBackgroundTask(it)
+            }
+        }
+        if (!wct.isEmpty) transitions.startTransition(TRANSIT_CLOSE, wct, null)
+    }
+
     /** Enter split by using the focused desktop task in given `displayId`. */
     fun enterSplit(displayId: Int, leftOrTop: Boolean) {
         getFocusedFreeformTask(displayId)?.let { requestSplit(it, leftOrTop) }
@@ -1560,7 +1621,7 @@
             return
         }
 
-        val indicator = visualIndicator ?: return
+        val indicator = getVisualIndicator() ?: return
         val indicatorType =
             indicator.updateIndicatorType(
                 PointF(inputCoordinate.x, currentDragBounds.top.toFloat()),
@@ -1771,6 +1832,22 @@
         return true
     }
 
+    // TODO(b/366397912): Support full multi-user mode in Windowing.
+    override fun onUserChanged(newUserId: Int, userContext: Context) {
+        userId = newUserId
+    }
+
+    /** Called when a task's info changes. */
+    fun onTaskInfoChanged(taskInfo: RunningTaskInfo) {
+        if (!Flags.enableFullyImmersiveInDesktop()) return
+        val inImmersive = taskRepository.isTaskInFullImmersiveState(taskInfo.taskId)
+        val requestingImmersive = taskInfo.requestingImmersive
+        if (inImmersive && !requestingImmersive) {
+            // Exit immersive if the app is no longer requesting it.
+            exitDesktopTaskFromFullImmersive(taskInfo)
+        }
+    }
+
     private fun dump(pw: PrintWriter, prefix: String) {
         val innerPrefix = "$prefix  "
         pw.println("${prefix}DesktopTasksController")
@@ -1940,6 +2017,12 @@
                 c.moveTaskToDesktop(taskId, transitionSource = transitionSource)
             }
         }
+
+        override fun removeDesktop(displayId: Int) {
+            executeRemoteCallWithTaskPermission(controller, "removeDesktop") { c ->
+                c.removeDesktop(displayId)
+            }
+        }
     }
 
     private fun logV(msg: String, vararg arguments: Any?) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt
index d84349b..37bec21 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt
@@ -24,6 +24,7 @@
 import android.view.WindowManager.TRANSIT_TO_BACK
 import android.window.TransitionInfo
 import android.window.WindowContainerTransaction
+import android.window.flags.DesktopModeFlags
 import androidx.annotation.VisibleForTesting
 import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_MINIMIZE_WINDOW
 import com.android.internal.jank.InteractionJankMonitor
@@ -43,7 +44,7 @@
  */
 class DesktopTasksLimiter (
         transitions: Transitions,
-        private val taskRepository: DesktopModeTaskRepository,
+        private val taskRepository: DesktopRepository,
         private val shellTaskOrganizer: ShellTaskOrganizer,
         private val maxTasksLimit: Int,
         private val interactionJankMonitor: InteractionJankMonitor,
@@ -159,8 +160,10 @@
     }
 
     @VisibleForTesting
-    inner class LeftoverMinimizedTasksRemover : DesktopModeTaskRepository.ActiveTasksListener {
+    inner class LeftoverMinimizedTasksRemover : DesktopRepository.ActiveTasksListener {
         override fun onActiveTasksChanged(displayId: Int) {
+            // If back navigation is enabled, we shouldn't remove the leftover tasks
+            if (DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue()) return
             val wct = WindowContainerTransaction()
             removeLeftoverMinimizedTasks(displayId, wct)
             shellTaskOrganizer.applyTransaction(wct)
@@ -208,15 +211,15 @@
     fun addAndGetMinimizeTaskChangesIfNeeded(
             displayId: Int,
             wct: WindowContainerTransaction,
-            newFrontTaskInfo: RunningTaskInfo,
+            newFrontTaskId: Int,
     ): RunningTaskInfo? {
         ProtoLog.v(
                 ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
                 "DesktopTasksLimiter: addMinimizeBackTaskChangesIfNeeded, newFrontTask=%d",
-                newFrontTaskInfo.taskId)
+            newFrontTaskId)
         val newTaskListOrderedFrontToBack = createOrderedTaskListWithGivenTaskInFront(
                 taskRepository.getActiveNonMinimizedOrderedTasks(displayId),
-                newFrontTaskInfo.taskId)
+            newFrontTaskId)
         val taskToMinimize = getTaskToMinimizeIfNeeded(newTaskListOrderedFrontToBack)
         if (taskToMinimize != null) {
             wct.reorder(taskToMinimize.token, false /* onTop */)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt
index 0841628..64ae35b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt
@@ -16,37 +16,39 @@
 
 package com.android.wm.shell.desktopmode
 
+import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
 import android.content.Context
 import android.os.IBinder
 import android.view.SurfaceControl
 import android.view.WindowManager
+import android.view.WindowManager.TRANSIT_TO_BACK
 import android.window.TransitionInfo
 import android.window.WindowContainerTransaction
+import android.window.flags.DesktopModeFlags
+import android.window.flags.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY
 import com.android.internal.protolog.ProtoLog
 import com.android.wm.shell.ShellTaskOrganizer
 import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
-import android.window.flags.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY
+import com.android.wm.shell.shared.TransitionUtil
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
 import com.android.wm.shell.sysui.ShellInit
 import com.android.wm.shell.transition.Transitions
 
 /**
  * A [Transitions.TransitionObserver] that observes shell transitions and updates the
- * [DesktopModeTaskRepository] state TODO: b/332682201 This observes transitions related to desktop
+ * [DesktopRepository] state TODO: b/332682201 This observes transitions related to desktop
  * mode and other transitions that originate both within and outside shell.
  */
 class DesktopTasksTransitionObserver(
     private val context: Context,
-    private val desktopModeTaskRepository: DesktopModeTaskRepository,
+    private val desktopRepository: DesktopRepository,
     private val transitions: Transitions,
     private val shellTaskOrganizer: ShellTaskOrganizer,
     shellInit: ShellInit
 ) : Transitions.TransitionObserver {
 
     init {
-        if (
-            Transitions.ENABLE_SHELL_TRANSITIONS && DesktopModeStatus.canEnterDesktopMode(context)
-        ) {
+        if (DesktopModeStatus.canEnterDesktopMode(context)) {
             shellInit.addInitCallback(::onInit, this)
         }
     }
@@ -64,6 +66,50 @@
     ) {
         // TODO: b/332682201 Update repository state
         updateWallpaperToken(info)
+        if (DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue()) {
+            handleBackNavigation(info)
+            removeTaskIfNeeded(info)
+        }
+    }
+
+    private fun removeTaskIfNeeded(info: TransitionInfo) {
+        // Since we are no longer removing all the tasks [onTaskVanished], we need to remove them by
+        // checking the transitions.
+        if (!TransitionUtil.isOpeningType(info.type)) return
+        // Remove a task from the repository if the app is launched outside of desktop.
+        for (change in info.changes) {
+            val taskInfo = change.taskInfo
+            if (taskInfo == null || taskInfo.taskId == -1) continue
+
+            if (desktopRepository.isActiveTask(taskInfo.taskId)
+                && taskInfo.windowingMode != WINDOWING_MODE_FREEFORM
+            ) {
+                desktopRepository.removeFreeformTask(
+                    taskInfo.displayId,
+                    taskInfo.taskId
+                )
+            }
+        }
+    }
+
+    private fun handleBackNavigation(info: TransitionInfo) {
+        // When default back navigation happens, transition type is TO_BACK and the change is
+        // TO_BACK. Mark the task going to back as minimized.
+        if (info.type == TRANSIT_TO_BACK) {
+            for (change in info.changes) {
+                val taskInfo = change.taskInfo
+                if (taskInfo == null || taskInfo.taskId == -1) {
+                    continue
+                }
+
+                if (desktopRepository.getVisibleTaskCount(taskInfo.displayId) > 0 &&
+                    change.mode == TRANSIT_TO_BACK &&
+                    taskInfo.windowingMode == WINDOWING_MODE_FREEFORM
+                ) {
+                    desktopRepository.minimizeTask(taskInfo.displayId, taskInfo.taskId)
+                }
+            }
+        }
     }
 
     override fun onTransitionStarting(transition: IBinder) {
@@ -87,7 +133,7 @@
                 if (DesktopWallpaperActivity.isWallpaperTask(taskInfo)) {
                     when (change.mode) {
                         WindowManager.TRANSIT_OPEN -> {
-                            desktopModeTaskRepository.wallpaperActivityToken = taskInfo.token
+                            desktopRepository.wallpaperActivityToken = taskInfo.token
                             // After the task for the wallpaper is created, set it non-trimmable.
                             // This is important to prevent recents from trimming and removing the
                             // task.
@@ -97,7 +143,7 @@
                             )
                         }
                         WindowManager.TRANSIT_CLOSE ->
-                            desktopModeTaskRepository.wallpaperActivityToken = null
+                            desktopRepository.wallpaperActivityToken = null
                         else -> {}
                     }
                 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt
index 2bc01b2..8e264b2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt
@@ -109,8 +109,8 @@
      * after one of the "end" or "cancel" transitions is merged into this transition.
      */
     fun startDragToDesktopTransition(
-        taskId: Int,
-        dragToDesktopAnimator: MoveToDesktopAnimator,
+        taskInfo: RunningTaskInfo,
+        dragToDesktopAnimator: MoveToDesktopAnimator
     ) {
         if (inProgress) {
             ProtoLog.v(
@@ -137,23 +137,26 @@
             )
         val wct = WindowContainerTransaction()
         wct.sendPendingIntent(pendingIntent, launchHomeIntent, Bundle())
+        // The home launch done above will result in an attempt to move the task to pip if
+        // applicable, resulting in a broken state. Prevent that here.
+        wct.setDoNotPip(taskInfo.token)
         val startTransitionToken =
             transitions.startTransition(TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP, wct, this)
 
         transitionState =
-            if (isSplitTask(taskId)) {
+            if (isSplitTask(taskInfo.taskId)) {
                 val otherTask =
-                    getOtherSplitTask(taskId)
+                    getOtherSplitTask(taskInfo.taskId)
                         ?: throw IllegalStateException("Expected split task to have a counterpart.")
                 TransitionState.FromSplit(
-                    draggedTaskId = taskId,
+                    draggedTaskId = taskInfo.taskId,
                     dragAnimator = dragToDesktopAnimator,
                     startTransitionToken = startTransitionToken,
                     otherSplitTask = otherTask
                 )
             } else {
                 TransitionState.FromFullscreen(
-                    draggedTaskId = taskId,
+                    draggedTaskId = taskInfo.taskId,
                     dragAnimator = dragToDesktopAnimator,
                     startTransitionToken = startTransitionToken
                 )
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl
index b036e40e..1090a46 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl
@@ -49,4 +49,7 @@
 
     /** Move a task with given `taskId` to desktop */
     void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource);
+
+    /** Remove desktop on the given display */
+    void removeDesktop(int displayId);
 }
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt
index 6013e97..334dc5a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt
@@ -16,98 +16,341 @@
 
 package com.android.wm.shell.desktopmode.education
 
-import android.app.ActivityManager.RunningTaskInfo
-import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
+import android.annotation.DimenRes
+import android.annotation.StringRes
+import android.content.Context
+import android.content.res.Resources
+import android.graphics.Point
 import android.os.SystemProperties
+import android.util.Slog
+import androidx.core.content.withStyledAttributes
 import com.android.window.flags.Flags
-import com.android.wm.shell.ShellTaskOrganizer
+import com.android.wm.shell.R
+import com.android.wm.shell.desktopmode.CaptionState
+import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository
 import com.android.wm.shell.desktopmode.education.data.AppHandleEducationDatastoreRepository
+import com.android.wm.shell.shared.annotations.ShellBackgroundThread
 import com.android.wm.shell.shared.annotations.ShellMainThread
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.canEnterDesktopMode
+import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource
+import com.android.wm.shell.windowdecor.common.DecorThemeUtil
+import com.android.wm.shell.windowdecor.common.Theme
+import com.android.wm.shell.windowdecor.education.DesktopWindowingEducationTooltipController
+import com.android.wm.shell.windowdecor.education.DesktopWindowingEducationTooltipController.EducationViewConfig
+import com.android.wm.shell.windowdecor.education.DesktopWindowingEducationTooltipController.TooltipColorScheme
+import kotlin.time.Duration.Companion.milliseconds
 import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.MainCoroutineDispatcher
+import kotlinx.coroutines.TimeoutCancellationException
 import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.catch
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.flow.debounce
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.emptyFlow
 import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.take
+import kotlinx.coroutines.flow.timeout
 import kotlinx.coroutines.launch
 
 /**
  * Controls app handle education end to end.
  *
  * Listen to the user trigger for app handle education, calls an api to check if the education
- * should be shown and calls an api to show education.
+ * should be shown and controls education UI.
  */
 @OptIn(kotlinx.coroutines.FlowPreview::class)
 @kotlinx.coroutines.ExperimentalCoroutinesApi
 class AppHandleEducationController(
+    private val context: Context,
     private val appHandleEducationFilter: AppHandleEducationFilter,
-    shellTaskOrganizer: ShellTaskOrganizer,
     private val appHandleEducationDatastoreRepository: AppHandleEducationDatastoreRepository,
-    @ShellMainThread private val applicationCoroutineScope: CoroutineScope
+    private val windowDecorCaptionHandleRepository: WindowDecorCaptionHandleRepository,
+    private val windowingEducationViewController: DesktopWindowingEducationTooltipController,
+    @ShellMainThread private val applicationCoroutineScope: CoroutineScope,
+    @ShellBackgroundThread private val backgroundDispatcher: MainCoroutineDispatcher,
 ) {
+  private val decorThemeUtil = DecorThemeUtil(context)
+  private lateinit var openHandleMenuCallback: (Int) -> Unit
+  private lateinit var toDesktopModeCallback: (Int, DesktopModeTransitionSource) -> Unit
+
   init {
     runIfEducationFeatureEnabled {
-      // TODO: b/361038716 - Use app handle state flow instead of focus task change flow
-      val focusTaskChangeFlow = focusTaskChangeFlow(shellTaskOrganizer)
       applicationCoroutineScope.launch {
-        // Central block handling the app's educational flow end-to-end.
-        // This flow listens to the changes to the result of
-        // [WindowingEducationProto#hasEducationViewedTimestampMillis()] in datastore proto object
+        // Central block handling the app handle's educational flow end-to-end.
         isEducationViewedFlow()
             .flatMapLatest { isEducationViewed ->
               if (isEducationViewed) {
                 // If the education is viewed then return emptyFlow() that completes immediately.
-                // This will help us to not listen to focus task changes after the education has
-                // been viewed already.
+                // This will help us to not listen to [captionHandleStateFlow] after the education
+                // has been viewed already.
                 emptyFlow()
               } else {
-                // This flow listens for focus task changes, which trigger the app handle education.
-                focusTaskChangeFlow
-                    .filter { runningTaskInfo ->
-                      runningTaskInfo.topActivityInfo?.packageName?.let {
-                        appHandleEducationFilter.shouldShowAppHandleEducation(it)
-                      } ?: false && runningTaskInfo.windowingMode != WINDOWING_MODE_FREEFORM
+                // Listen for changes to window decor's caption handle.
+                windowDecorCaptionHandleRepository.captionStateFlow
+                    // Wait for few seconds before emitting the latest state.
+                    .debounce(APP_HANDLE_EDUCATION_DELAY_MILLIS)
+                    .filter { captionState ->
+                      captionState is CaptionState.AppHandle &&
+                          appHandleEducationFilter.shouldShowAppHandleEducation(captionState)
                     }
-                    .distinctUntilChanged()
               }
             }
-            .debounce(
-                APP_HANDLE_EDUCATION_DELAY) // Wait for few seconds, if the focus task changes.
-            // During the delay then current emission will be cancelled.
-            .flowOn(Dispatchers.IO)
-            .collectLatest {
-              // Fire and forget show education suspend function, manage entire lifecycle of
-              // tooltip in UI class.
+            .flowOn(backgroundDispatcher)
+            .collectLatest { captionState ->
+              val tooltipColorScheme = tooltipColorScheme(captionState)
+
+              showEducation(captionState, tooltipColorScheme)
+              // After showing first tooltip, mark education as viewed
+              appHandleEducationDatastoreRepository.updateEducationViewedTimestampMillis(true)
+            }
+      }
+
+      applicationCoroutineScope.launch {
+        if (isFeatureUsed()) return@launch
+        windowDecorCaptionHandleRepository.captionStateFlow
+            .filter { captionState ->
+              captionState is CaptionState.AppHandle && captionState.isHandleMenuExpanded
+            }
+            .take(1)
+            .flowOn(backgroundDispatcher)
+            .collect {
+              // If user expands app handle, mark user has used the feature
+              appHandleEducationDatastoreRepository.updateFeatureUsedTimestampMillis(true)
             }
       }
     }
   }
 
   private inline fun runIfEducationFeatureEnabled(block: () -> Unit) {
-    if (Flags.enableDesktopWindowingAppHandleEducation()) block()
+    if (canEnterDesktopMode(context) && Flags.enableDesktopWindowingAppHandleEducation()) block()
   }
 
+  private fun showEducation(captionState: CaptionState, tooltipColorScheme: TooltipColorScheme) {
+    val appHandleBounds = (captionState as CaptionState.AppHandle).globalAppHandleBounds
+    val tooltipGlobalCoordinates =
+        Point(appHandleBounds.left + appHandleBounds.width() / 2, appHandleBounds.bottom)
+    // TODO: b/370546801 - Differentiate between user dismissing the tooltip vs following the cue.
+    // Populate information important to inflate app handle education tooltip.
+    val appHandleTooltipConfig =
+        EducationViewConfig(
+            tooltipViewLayout = R.layout.desktop_windowing_education_top_arrow_tooltip,
+            tooltipColorScheme = tooltipColorScheme,
+            tooltipViewGlobalCoordinates = tooltipGlobalCoordinates,
+            tooltipText = getString(R.string.windowing_app_handle_education_tooltip),
+            arrowDirection = DesktopWindowingEducationTooltipController.TooltipArrowDirection.UP,
+            onEducationClickAction = {
+              launchWithExceptionHandling { showWindowingImageButtonTooltip(tooltipColorScheme) }
+              openHandleMenuCallback(captionState.runningTaskInfo.taskId)
+            },
+            onDismissAction = {
+              launchWithExceptionHandling { showWindowingImageButtonTooltip(tooltipColorScheme) }
+            },
+        )
+
+    windowingEducationViewController.showEducationTooltip(
+        tooltipViewConfig = appHandleTooltipConfig, taskId = captionState.runningTaskInfo.taskId)
+  }
+
+  /** Show tooltip that points to windowing image button in app handle menu */
+  private suspend fun showWindowingImageButtonTooltip(tooltipColorScheme: TooltipColorScheme) {
+    val appInfoPillHeight = getSize(R.dimen.desktop_mode_handle_menu_app_info_pill_height)
+    val windowingOptionPillHeight = getSize(R.dimen.desktop_mode_handle_menu_windowing_pill_height)
+    val appHandleMenuWidth =
+        getSize(R.dimen.desktop_mode_handle_menu_width) +
+            getSize(R.dimen.desktop_mode_handle_menu_pill_spacing_margin)
+    val appHandleMenuMargins =
+        getSize(R.dimen.desktop_mode_handle_menu_margin_top) +
+            getSize(R.dimen.desktop_mode_handle_menu_pill_spacing_margin)
+
+    windowDecorCaptionHandleRepository.captionStateFlow
+        // After the first tooltip was dismissed, wait for 400 ms and see if the app handle menu
+        // has been expanded.
+        .timeout(APP_HANDLE_EDUCATION_TIMEOUT_MILLIS.milliseconds)
+        .catchTimeoutAndLog {
+          // TODO: b/341320146 - Log previous tooltip was dismissed
+        }
+        // Wait for few milliseconds before emitting the latest state.
+        .debounce(APP_HANDLE_EDUCATION_DELAY_MILLIS)
+        .filter { captionState ->
+          // Filter out states when app handle is not visible or not expanded.
+          captionState is CaptionState.AppHandle && captionState.isHandleMenuExpanded
+        }
+        // Before showing this tooltip, stop listening to further emissions to avoid accidentally
+        // showing the same tooltip on future emissions.
+        .take(1)
+        .flowOn(backgroundDispatcher)
+        .collectLatest { captionState ->
+          captionState as CaptionState.AppHandle
+          val appHandleBounds = captionState.globalAppHandleBounds
+          val tooltipGlobalCoordinates =
+              Point(
+                  appHandleBounds.left + appHandleBounds.width() / 2 + appHandleMenuWidth / 2,
+                  appHandleBounds.top +
+                      appHandleMenuMargins +
+                      appInfoPillHeight +
+                      windowingOptionPillHeight / 2)
+          // Populate information important to inflate windowing image button education tooltip.
+          val windowingImageButtonTooltipConfig =
+              EducationViewConfig(
+                  tooltipViewLayout = R.layout.desktop_windowing_education_left_arrow_tooltip,
+                  tooltipColorScheme = tooltipColorScheme,
+                  tooltipViewGlobalCoordinates = tooltipGlobalCoordinates,
+                  tooltipText =
+                      getString(R.string.windowing_desktop_mode_image_button_education_tooltip),
+                  arrowDirection =
+                      DesktopWindowingEducationTooltipController.TooltipArrowDirection.LEFT,
+                  onEducationClickAction = {
+                    launchWithExceptionHandling { showExitWindowingTooltip(tooltipColorScheme) }
+                    toDesktopModeCallback(
+                        captionState.runningTaskInfo.taskId,
+                        DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON)
+                  },
+                  onDismissAction = {
+                    launchWithExceptionHandling { showExitWindowingTooltip(tooltipColorScheme) }
+                  },
+              )
+
+          windowingEducationViewController.showEducationTooltip(
+              taskId = captionState.runningTaskInfo.taskId,
+              tooltipViewConfig = windowingImageButtonTooltipConfig)
+        }
+  }
+
+  /** Show tooltip that points to app chip button and educates user on how to exit desktop mode */
+  private suspend fun showExitWindowingTooltip(tooltipColorScheme: TooltipColorScheme) {
+    windowDecorCaptionHandleRepository.captionStateFlow
+        // After the previous tooltip was dismissed, wait for 400 ms and see if the user entered
+        // desktop mode.
+        .timeout(APP_HANDLE_EDUCATION_TIMEOUT_MILLIS.milliseconds)
+        .catchTimeoutAndLog {
+          // TODO: b/341320146 - Log previous tooltip was dismissed
+        }
+        // Wait for few milliseconds before emitting the latest state.
+        .debounce(APP_HANDLE_EDUCATION_DELAY_MILLIS)
+        .filter { captionState ->
+          // Filter out states when app header is not visible or expanded.
+          captionState is CaptionState.AppHeader && !captionState.isHeaderMenuExpanded
+        }
+        // Before showing this tooltip, stop listening to further emissions to avoid accidentally
+        // showing the same tooltip on future emissions.
+        .take(1)
+        .flowOn(backgroundDispatcher)
+        .collectLatest { captionState ->
+          captionState as CaptionState.AppHeader
+          val globalAppChipBounds = captionState.globalAppChipBounds
+          val tooltipGlobalCoordinates =
+              Point(
+                  globalAppChipBounds.right,
+                  globalAppChipBounds.top + globalAppChipBounds.height() / 2)
+          // Populate information important to inflate exit desktop mode education tooltip.
+          val exitWindowingTooltipConfig =
+              EducationViewConfig(
+                  tooltipViewLayout = R.layout.desktop_windowing_education_left_arrow_tooltip,
+                  tooltipColorScheme = tooltipColorScheme,
+                  tooltipViewGlobalCoordinates = tooltipGlobalCoordinates,
+                  tooltipText = getString(R.string.windowing_desktop_mode_exit_education_tooltip),
+                  arrowDirection =
+                      DesktopWindowingEducationTooltipController.TooltipArrowDirection.LEFT,
+                  onDismissAction = {},
+                  onEducationClickAction = {
+                    openHandleMenuCallback(captionState.runningTaskInfo.taskId)
+                  },
+              )
+          windowingEducationViewController.showEducationTooltip(
+              taskId = captionState.runningTaskInfo.taskId,
+              tooltipViewConfig = exitWindowingTooltipConfig,
+          )
+        }
+  }
+
+  private fun tooltipColorScheme(captionState: CaptionState): TooltipColorScheme {
+    context.withStyledAttributes(
+        set = null,
+        attrs =
+            intArrayOf(
+                com.android.internal.R.attr.materialColorOnTertiaryFixed,
+                com.android.internal.R.attr.materialColorTertiaryFixed,
+                com.android.internal.R.attr.materialColorTertiaryFixedDim),
+        defStyleAttr = 0,
+        defStyleRes = 0) {
+          val onTertiaryFixed = getColor(/* index= */ 0, /* defValue= */ 0)
+          val tertiaryFixed = getColor(/* index= */ 1, /* defValue= */ 0)
+          val tertiaryFixedDim = getColor(/* index= */ 2, /* defValue= */ 0)
+          val taskInfo = (captionState as CaptionState.AppHandle).runningTaskInfo
+
+          val tooltipContainerColor =
+              if (decorThemeUtil.getAppTheme(taskInfo) == Theme.LIGHT) {
+                tertiaryFixed
+              } else {
+                tertiaryFixedDim
+              }
+          return TooltipColorScheme(tooltipContainerColor, onTertiaryFixed, onTertiaryFixed)
+        }
+    return TooltipColorScheme(0, 0, 0)
+  }
+
+  /**
+   * Setup callbacks for app handle education tooltips.
+   *
+   * @param openHandleMenuCallback callback invoked to open app handle menu or app chip menu.
+   * @param toDesktopModeCallback callback invoked to move task into desktop mode.
+   */
+  fun setAppHandleEducationTooltipCallbacks(
+      openHandleMenuCallback: (taskId: Int) -> Unit,
+      toDesktopModeCallback: (taskId: Int, DesktopModeTransitionSource) -> Unit
+  ) {
+    this.openHandleMenuCallback = openHandleMenuCallback
+    this.toDesktopModeCallback = toDesktopModeCallback
+  }
+
+  private inline fun <T> Flow<T>.catchTimeoutAndLog(crossinline block: () -> Unit) =
+      catch { exception ->
+        if (exception is TimeoutCancellationException) block() else throw exception
+      }
+
+  private fun launchWithExceptionHandling(block: suspend () -> Unit) =
+      applicationCoroutineScope.launch {
+        try {
+          block()
+        } catch (e: Throwable) {
+          Slog.e(TAG, "Error: ", e)
+        }
+      }
+
+  /**
+   * Listens to the changes to [WindowingEducationProto#hasEducationViewedTimestampMillis()] in
+   * datastore proto object.
+   */
   private fun isEducationViewedFlow(): Flow<Boolean> =
       appHandleEducationDatastoreRepository.dataStoreFlow
           .map { preferences -> preferences.hasEducationViewedTimestampMillis() }
           .distinctUntilChanged()
 
-  private fun focusTaskChangeFlow(shellTaskOrganizer: ShellTaskOrganizer): Flow<RunningTaskInfo> =
-      callbackFlow {
-        val focusTaskChange = ShellTaskOrganizer.FocusListener { taskInfo -> trySend(taskInfo) }
-        shellTaskOrganizer.addFocusListener(focusTaskChange)
-        awaitClose { shellTaskOrganizer.removeFocusListener(focusTaskChange) }
-      }
+  /**
+   * Listens to the changes to [WindowingEducationProto#hasFeatureUsedTimestampMillis()] in
+   * datastore proto object.
+   */
+  private suspend fun isFeatureUsed(): Boolean =
+      appHandleEducationDatastoreRepository.dataStoreFlow.first().hasFeatureUsedTimestampMillis()
 
-  private companion object {
-    val APP_HANDLE_EDUCATION_DELAY: Long
+  private fun getSize(@DimenRes resourceId: Int): Int {
+    if (resourceId == Resources.ID_NULL) return 0
+    return context.resources.getDimensionPixelSize(resourceId)
+  }
+
+  private fun getString(@StringRes resId: Int): String = context.resources.getString(resId)
+
+  companion object {
+    const val TAG = "AppHandleEducationController"
+    val APP_HANDLE_EDUCATION_DELAY_MILLIS: Long
       get() = SystemProperties.getLong("persist.windowing_app_handle_education_delay", 3000L)
+
+    val APP_HANDLE_EDUCATION_TIMEOUT_MILLIS: Long
+      get() = SystemProperties.getLong("persist.windowing_app_handle_education_timeout", 400L)
   }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilter.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilter.kt
index 51bdb40..15f4c24 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilter.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilter.kt
@@ -22,6 +22,7 @@
 import android.os.SystemClock
 import android.provider.Settings.Secure
 import com.android.wm.shell.R
+import com.android.wm.shell.desktopmode.CaptionState
 import com.android.wm.shell.desktopmode.education.data.AppHandleEducationDatastoreRepository
 import com.android.wm.shell.desktopmode.education.data.WindowingEducationProto
 import java.time.Duration
@@ -35,8 +36,12 @@
       context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
 
   /** Returns true if conditions to show app handle education are met, returns false otherwise. */
-  suspend fun shouldShowAppHandleEducation(focusAppPackageName: String): Boolean {
+  suspend fun shouldShowAppHandleEducation(captionState: CaptionState): Boolean {
+    if ((captionState as CaptionState.AppHandle).isHandleMenuExpanded) return false
+    val focusAppPackageName =
+        captionState.runningTaskInfo.topActivityInfo?.packageName ?: return false
     val windowingEducationProto = appHandleEducationDatastoreRepository.windowingEducationProto()
+
     return isFocusAppInAllowlist(focusAppPackageName) &&
         !isOtherEducationShowing() &&
         hasSufficientTimeSinceSetup() &&
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/data/AppHandleEducationDatastoreRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/data/AppHandleEducationDatastoreRepository.kt
index f420c5b..d21b208 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/data/AppHandleEducationDatastoreRepository.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/data/AppHandleEducationDatastoreRepository.kt
@@ -71,6 +71,37 @@
   suspend fun windowingEducationProto(): WindowingEducationProto = dataStoreFlow.first()
 
   /**
+   * Updates [WindowingEducationProto.educationViewedTimestampMillis_] field in datastore with
+   * current timestamp if [isViewed] is true, if not then clears the field.
+   */
+  suspend fun updateEducationViewedTimestampMillis(isViewed: Boolean) {
+    dataStore.updateData { preferences ->
+      if (isViewed) {
+        preferences
+            .toBuilder()
+            .setEducationViewedTimestampMillis(System.currentTimeMillis())
+            .build()
+      } else {
+        preferences.toBuilder().clearEducationViewedTimestampMillis().build()
+      }
+    }
+  }
+
+  /**
+   * Updates [WindowingEducationProto.featureUsedTimestampMillis_] field in datastore with current
+   * timestamp if [isViewed] is true, if not then clears the field.
+   */
+  suspend fun updateFeatureUsedTimestampMillis(isViewed: Boolean) {
+    dataStore.updateData { preferences ->
+      if (isViewed) {
+        preferences.toBuilder().setFeatureUsedTimestampMillis(System.currentTimeMillis()).build()
+      } else {
+        preferences.toBuilder().clearFeatureUsedTimestampMillis().build()
+      }
+    }
+  }
+
+  /**
    * Updates [AppHandleEducation.appUsageStats] and
    * [AppHandleEducation.appUsageStatsLastUpdateTimestampMillis] fields in datastore with
    * [appUsageStats] and [appUsageStatsLastUpdateTimestamp].
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformComponents.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformComponents.java
index eee5aae..3379ff2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformComponents.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformComponents.java
@@ -35,6 +35,7 @@
     public final ShellTaskOrganizer.TaskListener mTaskListener;
     public final Optional<Transitions.TransitionHandler> mTransitionHandler;
     public final Optional<Transitions.TransitionObserver> mTransitionObserver;
+    public final Optional<FreeformTaskTransitionStarterInitializer> mTransitionStarterInitializer;
 
     /**
      * Creates an instance with the given components.
@@ -42,10 +43,12 @@
     public FreeformComponents(
             ShellTaskOrganizer.TaskListener taskListener,
             Optional<Transitions.TransitionHandler> transitionHandler,
-            Optional<Transitions.TransitionObserver> transitionObserver) {
+            Optional<Transitions.TransitionObserver> transitionObserver,
+            Optional<FreeformTaskTransitionStarterInitializer> transitionStarterInitializer) {
         mTaskListener = taskListener;
         mTransitionHandler = transitionHandler;
         mTransitionObserver = transitionObserver;
+        mTransitionStarterInitializer = transitionStarterInitializer;
     }
 
     /**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskListener.java
index 83cc18b..92e645d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskListener.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskListener.java
@@ -24,11 +24,13 @@
 import android.content.Context;
 import android.util.SparseArray;
 import android.view.SurfaceControl;
+import android.window.flags.DesktopModeFlags;
 
 import com.android.internal.protolog.ProtoLog;
 import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.common.LaunchAdjacentController;
-import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
+import com.android.wm.shell.desktopmode.DesktopRepository;
+import com.android.wm.shell.desktopmode.DesktopTasksController;
 import com.android.wm.shell.protolog.ShellProtoLogGroup;
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
 import com.android.wm.shell.sysui.ShellInit;
@@ -48,7 +50,8 @@
 
     private final Context mContext;
     private final ShellTaskOrganizer mShellTaskOrganizer;
-    private final Optional<DesktopModeTaskRepository> mDesktopModeTaskRepository;
+    private final Optional<DesktopRepository> mDesktopRepository;
+    private final Optional<DesktopTasksController> mDesktopTasksController;
     private final WindowDecorViewModel mWindowDecorationViewModel;
     private final LaunchAdjacentController mLaunchAdjacentController;
 
@@ -63,13 +66,15 @@
             Context context,
             ShellInit shellInit,
             ShellTaskOrganizer shellTaskOrganizer,
-            Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
+            Optional<DesktopRepository> desktopRepository,
+            Optional<DesktopTasksController> desktopTasksController,
             LaunchAdjacentController launchAdjacentController,
             WindowDecorViewModel windowDecorationViewModel) {
         mContext = context;
         mShellTaskOrganizer = shellTaskOrganizer;
         mWindowDecorationViewModel = windowDecorationViewModel;
-        mDesktopModeTaskRepository = desktopModeTaskRepository;
+        mDesktopRepository = desktopRepository;
+        mDesktopTasksController = desktopTasksController;
         mLaunchAdjacentController = launchAdjacentController;
         if (shellInit != null) {
             shellInit.addInitCallback(this::onInit, this);
@@ -94,14 +99,9 @@
         state.mTaskInfo = taskInfo;
         state.mLeash = leash;
         mTasks.put(taskInfo.taskId, state);
-        if (!Transitions.ENABLE_SHELL_TRANSITIONS) {
-            SurfaceControl.Transaction t = new SurfaceControl.Transaction();
-            mWindowDecorationViewModel.onTaskOpening(taskInfo, leash, t, t);
-            t.apply();
-        }
 
         if (DesktopModeStatus.canEnterDesktopMode(mContext)) {
-            mDesktopModeTaskRepository.ifPresent(repository -> {
+            mDesktopRepository.ifPresent(repository -> {
                 repository.addOrMoveFreeformTaskToTop(taskInfo.displayId, taskInfo.taskId);
                 if (taskInfo.isVisible) {
                     repository.addActiveTask(taskInfo.displayId, taskInfo.taskId);
@@ -120,14 +120,20 @@
         mTasks.remove(taskInfo.taskId);
 
         if (DesktopModeStatus.canEnterDesktopMode(mContext)) {
-            mDesktopModeTaskRepository.ifPresent(repository -> {
-                repository.removeFreeformTask(taskInfo.displayId, taskInfo.taskId);
+            mDesktopRepository.ifPresent(repository -> {
+                // TODO: b/370038902 - Handle Activity#finishAndRemoveTask.
+                if (!DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue()
+                        || repository.isClosingTask(taskInfo.taskId)) {
+                    // A task that's vanishing should be removed:
+                    // - If it's closed by the X button which means it's marked as a closing task.
+                    repository.removeFreeformTask(taskInfo.displayId, taskInfo.taskId);
+                } else {
+                    repository.updateTaskVisibility(taskInfo.displayId, taskInfo.taskId, false);
+                    repository.minimizeTask(taskInfo.displayId, taskInfo.taskId);
+                }
             });
         }
         mWindowDecorationViewModel.onTaskVanished(taskInfo);
-        if (!Transitions.ENABLE_SHELL_TRANSITIONS) {
-            mWindowDecorationViewModel.destroyWindowDecoration(taskInfo);
-        }
         updateLaunchAdjacentController();
     }
 
@@ -137,10 +143,11 @@
 
         ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Freeform Task Info Changed: #%d",
                 taskInfo.taskId);
+        mDesktopTasksController.ifPresent(c -> c.onTaskInfoChanged(taskInfo));
         mWindowDecorationViewModel.onTaskInfoChanged(taskInfo);
         state.mTaskInfo = taskInfo;
         if (DesktopModeStatus.canEnterDesktopMode(mContext)) {
-            mDesktopModeTaskRepository.ifPresent(repository -> {
+            mDesktopRepository.ifPresent(repository -> {
                 if (taskInfo.isVisible) {
                     repository.addActiveTask(taskInfo.displayId, taskInfo.taskId);
                 } else if (repository.isClosingTask(taskInfo.taskId)) {
@@ -172,7 +179,7 @@
                 "Freeform Task Focus Changed: #%d focused=%b",
                 taskInfo.taskId, taskInfo.isFocused);
         if (DesktopModeStatus.canEnterDesktopMode(mContext) && taskInfo.isFocused) {
-            mDesktopModeTaskRepository.ifPresent(repository -> {
+            mDesktopRepository.ifPresent(repository -> {
                 repository.addOrMoveFreeformTaskToTop(taskInfo.displayId, taskInfo.taskId);
             });
         }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java
index 517e209..6aaf001 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java
@@ -19,16 +19,12 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 
-import static com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE;
-
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ValueAnimator;
 import android.app.ActivityManager;
 import android.app.WindowConfiguration;
-import android.content.Context;
 import android.graphics.Rect;
-import android.os.Handler;
 import android.os.IBinder;
 import android.util.ArrayMap;
 import android.view.SurfaceControl;
@@ -40,14 +36,9 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
-import com.android.internal.jank.InteractionJankMonitor;
 import com.android.wm.shell.common.DisplayController;
 import com.android.wm.shell.common.ShellExecutor;
-import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
-import com.android.wm.shell.shared.annotations.ShellMainThread;
-import com.android.wm.shell.sysui.ShellInit;
 import com.android.wm.shell.transition.Transitions;
-import com.android.wm.shell.windowdecor.WindowDecorViewModel;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -59,48 +50,24 @@
 public class FreeformTaskTransitionHandler
         implements Transitions.TransitionHandler, FreeformTaskTransitionStarter {
     private static final int CLOSE_ANIM_DURATION = 400;
-    private final Context mContext;
     private final Transitions mTransitions;
-    private final WindowDecorViewModel mWindowDecorViewModel;
-    private final DesktopModeTaskRepository mDesktopModeTaskRepository;
     private final DisplayController mDisplayController;
-    private final InteractionJankMonitor mInteractionJankMonitor;
     private final ShellExecutor mMainExecutor;
     private final ShellExecutor mAnimExecutor;
-    @ShellMainThread
-    private final Handler mHandler;
 
     private final List<IBinder> mPendingTransitionTokens = new ArrayList<>();
 
     private final ArrayMap<IBinder, ArrayList<Animator>> mAnimations = new ArrayMap<>();
 
     public FreeformTaskTransitionHandler(
-            ShellInit shellInit,
             Transitions transitions,
-            Context context,
-            WindowDecorViewModel windowDecorViewModel,
             DisplayController displayController,
             ShellExecutor mainExecutor,
-            ShellExecutor animExecutor,
-            DesktopModeTaskRepository desktopModeTaskRepository,
-            InteractionJankMonitor interactionJankMonitor,
-            @ShellMainThread Handler handler) {
+            ShellExecutor animExecutor) {
         mTransitions = transitions;
-        mContext = context;
-        mWindowDecorViewModel = windowDecorViewModel;
-        mDesktopModeTaskRepository = desktopModeTaskRepository;
         mDisplayController = displayController;
-        mInteractionJankMonitor = interactionJankMonitor;
         mMainExecutor = mainExecutor;
         mAnimExecutor = animExecutor;
-        mHandler = handler;
-        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            shellInit.addInitCallback(this::onInit, this);
-        }
-    }
-
-    private void onInit() {
-        mWindowDecorViewModel.setFreeformTaskTransitionStarter(this);
     }
 
     @Override
@@ -269,20 +236,12 @@
                     startBounds.top + (animation.getAnimatedFraction() * screenHeight));
             t.apply();
         });
-        if (mDesktopModeTaskRepository.getActiveNonMinimizedTaskCount(
-                        change.getTaskInfo().displayId) == 1) {
-            // Starting the jank trace if closing the last window in desktop mode.
-            mInteractionJankMonitor.begin(
-                    sc, mContext, mHandler, CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE);
-        }
         animator.addListener(
                 new AnimatorListenerAdapter() {
                     @Override
                     public void onAnimationEnd(Animator animation) {
                         animations.remove(animator);
                         onAnimFinish.run();
-                        mInteractionJankMonitor.end(
-                                CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE);
                     }
                 });
         animations.add(animator);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java
index ffcc526..c9eccc3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java
@@ -27,6 +27,8 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 
+import com.android.window.flags.Flags;
+import com.android.wm.shell.desktopmode.DesktopFullImmersiveTransitionHandler;
 import com.android.wm.shell.sysui.ShellInit;
 import com.android.wm.shell.transition.Transitions;
 import com.android.wm.shell.windowdecor.WindowDecorViewModel;
@@ -36,6 +38,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * The {@link Transitions.TransitionHandler} that handles freeform task launches, closes,
@@ -44,7 +47,9 @@
  */
 public class FreeformTaskTransitionObserver implements Transitions.TransitionObserver {
     private final Transitions mTransitions;
+    private final Optional<DesktopFullImmersiveTransitionHandler> mImmersiveTransitionHandler;
     private final WindowDecorViewModel mWindowDecorViewModel;
+    private final Optional<TaskChangeListener> mTaskChangeListener;
 
     private final Map<IBinder, List<ActivityManager.RunningTaskInfo>> mTransitionToTaskInfo =
             new HashMap<>();
@@ -53,10 +58,14 @@
             Context context,
             ShellInit shellInit,
             Transitions transitions,
-            WindowDecorViewModel windowDecorViewModel) {
+            Optional<DesktopFullImmersiveTransitionHandler> immersiveTransitionHandler,
+            WindowDecorViewModel windowDecorViewModel,
+            Optional<TaskChangeListener> taskChangeListener) {
         mTransitions = transitions;
+        mImmersiveTransitionHandler = immersiveTransitionHandler;
         mWindowDecorViewModel = windowDecorViewModel;
-        if (Transitions.ENABLE_SHELL_TRANSITIONS && FreeformComponents.isFreeformEnabled(context)) {
+        mTaskChangeListener = taskChangeListener;
+        if (FreeformComponents.isFreeformEnabled(context)) {
             shellInit.addInitCallback(this::onInit, this);
         }
     }
@@ -72,6 +81,13 @@
             @NonNull TransitionInfo info,
             @NonNull SurfaceControl.Transaction startT,
             @NonNull SurfaceControl.Transaction finishT) {
+        if (Flags.enableFullyImmersiveInDesktop()) {
+            // TODO(b/367268953): Remove when DesktopTaskListener is introduced and the repository
+            //  is updated from there **before** the |mWindowDecorViewModel| methods are invoked.
+            //  Otherwise window decoration relayout won't run with the immersive state up to date.
+            mImmersiveTransitionHandler.ifPresent(h -> h.onTransitionReady(transition));
+        }
+
         final ArrayList<ActivityManager.RunningTaskInfo> taskInfoList = new ArrayList<>();
         final ArrayList<WindowContainerToken> taskParents = new ArrayList<>();
         for (TransitionInfo.Change change : info.getChanges()) {
@@ -103,6 +119,9 @@
                 case WindowManager.TRANSIT_TO_FRONT:
                     onToFrontTransitionReady(change, startT, finishT);
                     break;
+                case WindowManager.TRANSIT_TO_BACK:
+                    onToBackTransitionReady(change, startT, finishT);
+                    break;
                 case WindowManager.TRANSIT_CLOSE: {
                     taskInfoList.add(change.getTaskInfo());
                     onCloseTransitionReady(change, startT, finishT);
@@ -120,29 +139,49 @@
             TransitionInfo.Change change,
             SurfaceControl.Transaction startT,
             SurfaceControl.Transaction finishT) {
+        mTaskChangeListener.ifPresent(
+            listener -> listener.onTaskOpening(change.getTaskInfo()));
         mWindowDecorViewModel.onTaskOpening(
-                change.getTaskInfo(), change.getLeash(), startT, finishT);
+            change.getTaskInfo(), change.getLeash(), startT, finishT);
     }
 
     private void onCloseTransitionReady(
             TransitionInfo.Change change,
             SurfaceControl.Transaction startT,
             SurfaceControl.Transaction finishT) {
+        mTaskChangeListener.ifPresent(
+            listener -> listener.onTaskClosing(change.getTaskInfo()));
         mWindowDecorViewModel.onTaskClosing(change.getTaskInfo(), startT, finishT);
+
     }
 
     private void onChangeTransitionReady(
             TransitionInfo.Change change,
             SurfaceControl.Transaction startT,
             SurfaceControl.Transaction finishT) {
+        mTaskChangeListener.ifPresent(listener ->
+            listener.onTaskChanging(change.getTaskInfo()));
         mWindowDecorViewModel.onTaskChanging(
                 change.getTaskInfo(), change.getLeash(), startT, finishT);
     }
 
+
     private void onToFrontTransitionReady(
             TransitionInfo.Change change,
             SurfaceControl.Transaction startT,
             SurfaceControl.Transaction finishT) {
+        mTaskChangeListener.ifPresent(
+                listener -> listener.onTaskMovingToFront(change.getTaskInfo()));
+        mWindowDecorViewModel.onTaskChanging(
+                change.getTaskInfo(), change.getLeash(), startT, finishT);
+    }
+
+    private void onToBackTransitionReady(
+            TransitionInfo.Change change,
+            SurfaceControl.Transaction startT,
+            SurfaceControl.Transaction finishT) {
+        mTaskChangeListener.ifPresent(
+                listener -> listener.onTaskMovingToBack(change.getTaskInfo()));
         mWindowDecorViewModel.onTaskChanging(
                 change.getTaskInfo(), change.getLeash(), startT, finishT);
     }
@@ -179,4 +218,4 @@
             mWindowDecorViewModel.destroyWindowDecoration(taskInfo.get(i));
         }
     }
-}
\ No newline at end of file
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionStarterInitializer.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionStarterInitializer.kt
new file mode 100644
index 0000000..98bdf05
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionStarterInitializer.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.freeform
+
+import com.android.wm.shell.sysui.ShellInit
+import com.android.wm.shell.windowdecor.WindowDecorViewModel
+
+/**
+ * Sets up [FreeformTaskTransitionStarter] for [WindowDecorViewModel] when shell finishes
+ * initializing.
+ *
+ * Used to extract the setup logic from the starter implementation.
+ */
+class FreeformTaskTransitionStarterInitializer(
+    shellInit: ShellInit,
+    private val windowDecorViewModel: WindowDecorViewModel,
+    private val freeformTaskTransitionStarter: FreeformTaskTransitionStarter
+) {
+    init {
+        shellInit.addInitCallback(::onShellInit, this)
+    }
+
+    /** Sets up [WindowDecorViewModel] transition starter with [FreeformTaskTransitionStarter] */
+    private fun onShellInit() {
+        windowDecorViewModel.setFreeformTaskTransitionStarter(freeformTaskTransitionStarter)
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/TaskChangeListener.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/TaskChangeListener.kt
new file mode 100644
index 0000000..f07c069
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/TaskChangeListener.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.freeform
+
+import android.app.ActivityManager.RunningTaskInfo;
+
+/**
+ * Interface used by [FreeformTaskTransitionObserver] to manage freeform tasks.
+ *
+ * The implementations are responsible for handle all the task management.
+ */
+interface TaskChangeListener {
+    /** Notifies a task opening in freeform mode. */
+    fun onTaskOpening(taskInfo: RunningTaskInfo)
+
+    /** Notifies a task info update on the given task. */
+    fun onTaskChanging(taskInfo: RunningTaskInfo)
+
+    /** Notifies a task moving to the front. */
+    fun onTaskMovingToFront(taskInfo: RunningTaskInfo)
+
+    /** Notifies a task moving to the back. */
+    fun onTaskMovingToBack(taskInfo: RunningTaskInfo)
+
+    /** Notifies a task is closing. */
+    fun onTaskClosing(taskInfo: RunningTaskInfo)
+}
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java
index abec3b9..f8d2011 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java
@@ -28,6 +28,8 @@
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_OCCLUDING;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_UNOCCLUDING;
 import static android.view.WindowManager.TRANSIT_SLEEP;
+import static android.view.WindowManager.TRANSIT_TO_BACK;
+import static android.view.WindowManager.TRANSIT_TO_FRONT;
 
 import static com.android.wm.shell.shared.TransitionUtil.isOpeningType;
 
@@ -44,6 +46,7 @@
 import android.view.WindowManager;
 import android.window.IRemoteTransition;
 import android.window.IRemoteTransitionFinishedCallback;
+import android.window.KeyguardState;
 import android.window.TransitionInfo;
 import android.window.TransitionRequestInfo;
 import android.window.WindowContainerToken;
@@ -388,5 +391,18 @@
             mMainExecutor.execute(() ->
                     mIsLaunchingActivityOverLockscreen = isLaunchingActivityOverLockscreen);
         }
+
+        @Override
+        public void startKeyguardTransition(boolean keyguardShowing, boolean aodShowing) {
+            final WindowContainerTransaction wct = new WindowContainerTransaction();
+            final KeyguardState keyguardState =
+                    new KeyguardState.Builder(android.view.Display.DEFAULT_DISPLAY)
+                            .setKeyguardShowing(keyguardShowing).setAodShowing(aodShowing).build();
+            wct.addKeyguardState(keyguardState);
+            mMainExecutor.execute(() -> {
+                mTransitions.startTransition(keyguardShowing ? TRANSIT_TO_FRONT : TRANSIT_TO_BACK,
+                        wct, KeyguardTransitionHandler.this);
+            });
+        }
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitions.java
index b7245b9..1d349e6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitions.java
@@ -44,4 +44,11 @@
      * Notify whether keyguard has created a remote animation runner for next app launch.
      */
     default void setLaunchingActivityOverLockscreen(boolean isLaunchingActivityOverLockscreen) {}
+
+    /**
+     * Notifies Shell to start a keyguard transition directly.
+     * @param keyguardShowing whether keyguard is showing or not.
+     * @param aodShowing whether aod is showing or not.
+     */
+    default void startKeyguardTransition(boolean keyguardShowing, boolean aodShowing) {}
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
index 2138acc..cbb08b8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
@@ -1344,6 +1344,9 @@
         final SurfaceControl leash = pipChange.getLeash();
         final Rect destBounds = mPipOrganizer.getCurrentOrAnimatingBounds();
         final boolean isInPip = mPipTransitionState.isInPip();
+        ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                "%s: Update pip for unhandled transition, change=%s, destBounds=%s, isInPip=%b",
+                TAG, pipChange, destBounds, isInPip);
         mSurfaceTransactionHelper
                 .crop(startTransaction, leash, destBounds)
                 .round(startTransaction, leash, isInPip)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java
index af68442..7f61186 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java
@@ -592,8 +592,9 @@
                     public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task,
                             boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) {
                         ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
-                                "onActivityRestartAttempt: %s", task.topActivity);
-                        if (task.getWindowingMode() != WINDOWING_MODE_PINNED) {
+                                "onActivityRestartAttempt: topActivity=%s, wasVisible=%b",
+                                task.topActivity, wasVisible);
+                        if (task.getWindowingMode() != WINDOWING_MODE_PINNED || !wasVisible) {
                             return;
                         }
                         if (mPipTaskOrganizer.isLaunchToSplit(task)) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PhonePipMenuController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PhonePipMenuController.java
index 9cfe162..8c1e5e6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PhonePipMenuController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PhonePipMenuController.java
@@ -18,10 +18,12 @@
 
 import static android.view.WindowManager.SHELL_ROOT_LAYER_PIP;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.RemoteAction;
 import android.content.Context;
 import android.graphics.Rect;
+import android.os.Bundle;
 import android.os.Debug;
 import android.os.Handler;
 import android.os.RemoteException;
@@ -52,7 +54,8 @@
  * The current media session provides actions whenever there are no valid actions provided by the
  * current PiP activity. Otherwise, those actions always take precedence.
  */
-public class PhonePipMenuController implements PipMenuController {
+public class PhonePipMenuController implements PipMenuController,
+        PipTransitionState.PipTransitionStateChangedListener {
 
     private static final String TAG = "PhonePipMenuController";
     private static final boolean DEBUG = false;
@@ -113,6 +116,11 @@
 
     private PipMenuView mPipMenuView;
 
+    private final PipTaskListener mPipTaskListener;
+
+    @NonNull
+    private final PipTransitionState mPipTransitionState;
+
     private SurfaceControl mLeash;
 
     private ActionListener mMediaActionListener = new ActionListener() {
@@ -125,15 +133,27 @@
 
     public PhonePipMenuController(Context context, PipBoundsState pipBoundsState,
             PipMediaController mediaController, SystemWindows systemWindows,
-            PipUiEventLogger pipUiEventLogger,
-            ShellExecutor mainExecutor, Handler mainHandler) {
+            PipUiEventLogger pipUiEventLogger, PipTaskListener pipTaskListener,
+            @NonNull PipTransitionState pipTransitionState, ShellExecutor mainExecutor,
+            Handler mainHandler) {
         mContext = context;
         mPipBoundsState = pipBoundsState;
         mMediaController = mediaController;
         mSystemWindows = systemWindows;
+        mPipTaskListener = pipTaskListener;
+        mPipTransitionState = pipTransitionState;
         mMainExecutor = mainExecutor;
         mMainHandler = mainHandler;
         mPipUiEventLogger = pipUiEventLogger;
+
+        mPipTransitionState.addPipTransitionStateChangedListener(this);
+
+        mPipTaskListener.addParamsChangedListener(new PipTaskListener.PipParamsChangedCallback() {
+            @Override
+            public void onActionsChanged(List<RemoteAction> actions, RemoteAction closeAction) {
+                setAppActions(actions, closeAction);
+            }
+        });
     }
 
     public boolean isMenuVisible() {
@@ -438,8 +458,7 @@
      * Sets the menu actions to the actions provided by the current PiP menu.
      */
     @Override
-    public void setAppActions(List<RemoteAction> appActions,
-            RemoteAction closeAction) {
+    public void setAppActions(List<RemoteAction> appActions, RemoteAction closeAction) {
         mAppActions = appActions;
         mCloseAction = closeAction;
         updateMenuActions();
@@ -468,8 +487,8 @@
      */
     private void updateMenuActions() {
         if (mPipMenuView != null) {
-            mPipMenuView.setActions(mPipBoundsState.getBounds(),
-                    resolveMenuActions(), mCloseAction);
+            mPipMenuView.setActions(mPipBoundsState.getBounds(), resolveMenuActions(),
+                    mCloseAction);
         }
     }
 
@@ -567,6 +586,29 @@
         }
     }
 
+    @Override
+    public void onPipTransitionStateChanged(@PipTransitionState.TransitionState int oldState,
+            @PipTransitionState.TransitionState int newState, Bundle extra) {
+        switch (newState) {
+            case PipTransitionState.ENTERED_PIP:
+                attach(mPipTransitionState.mPinnedTaskLeash);
+                break;
+            case PipTransitionState.EXITED_PIP:
+                detach();
+                break;
+            case PipTransitionState.CHANGED_PIP_BOUNDS:
+                updateMenuLayout(mPipBoundsState.getBounds());
+                hideMenu();
+                break;
+            case PipTransitionState.CHANGING_PIP_BOUNDS:
+                hideMenu();
+                break;
+            case PipTransitionState.SCHEDULED_BOUNDS_CHANGE:
+                hideMenu();
+                break;
+        }
+    }
+
     void dump(PrintWriter pw, String prefix) {
         final String innerPrefix = prefix + "  ";
         pw.println(prefix + TAG);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java
index e9c4c14..73be8db 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java
@@ -324,10 +324,16 @@
             int launcherRotation, Rect hotseatKeepClearArea) {
         ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
                 "getSwipePipToHomeBounds: %s", componentName);
-        // preemptively add the keep clear area for Hotseat, so that it is taken into account
-        // when calculating the entry destination bounds of PiP window
+        // Preemptively add the keep clear area for Hotseat, so that it is taken into account
+        // when calculating the entry destination bounds of PiP window.
         mPipBoundsState.setNamedUnrestrictedKeepClearArea(
                 PipBoundsState.NAMED_KCA_LAUNCHER_SHELF, hotseatKeepClearArea);
+
+        // Set the display layout rotation early to calculate final orientation bounds that
+        // the animator expects, this will also be used to detect the fixed rotation when
+        // Shell resolves the type of the animation we are undergoing.
+        mPipDisplayLayoutState.rotateTo(launcherRotation);
+
         mPipBoundsState.setBoundsStateForEntry(componentName, activityInfo, pictureInPictureParams,
                 mPipBoundsAlgorithm);
         return mPipBoundsAlgorithm.getEntryDestinationBounds();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMenuView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMenuView.java
index a29104c..0910919 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMenuView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMenuView.java
@@ -447,7 +447,7 @@
                 final LayoutInflater inflater = LayoutInflater.from(mContext);
                 while (mActionsGroup.getChildCount() < mActions.size()) {
                     final PipMenuActionView actionView = (PipMenuActionView) inflater.inflate(
-                            R.layout.pip_menu_action, mActionsGroup, false);
+                            R.layout.pip2_menu_action, mActionsGroup, false);
                     mActionsGroup.addView(actionView);
                 }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java
index 0324fdb..268c3a2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java
@@ -336,7 +336,7 @@
         }
         cancelPhysicsAnimation();
         mMenuController.hideMenu(ANIM_TYPE_NONE, false /* resize */);
-        // mPipTaskOrganizer.exitPip(skipAnimation ? 0 : LEAVE_PIP_DURATION, enterSplit);
+        mPipScheduler.scheduleExitPipViaExpand();
     }
 
     /**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java
index f4defdc..d4f190e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java
@@ -52,7 +52,6 @@
 
     private final Context mContext;
     private final PipBoundsState mPipBoundsState;
-    private final PhonePipMenuController mPipMenuController;
     private final ShellExecutor mMainExecutor;
     private final PipTransitionState mPipTransitionState;
     private PipSchedulerReceiver mSchedulerReceiver;
@@ -97,12 +96,10 @@
 
     public PipScheduler(Context context,
             PipBoundsState pipBoundsState,
-            PhonePipMenuController pipMenuController,
             ShellExecutor mainExecutor,
             PipTransitionState pipTransitionState) {
         mContext = context;
         mPipBoundsState = pipBoundsState;
-        mPipMenuController = pipMenuController;
         mMainExecutor = mainExecutor;
         mPipTransitionState = pipTransitionState;
 
@@ -263,7 +260,6 @@
             return;
         }
         mPipBoundsState.setBounds(newBounds);
-        mPipMenuController.updateMenuLayout(newBounds);
         maybeUpdateMovementBounds();
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTaskListener.java
index 262c14d..c58de2c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTaskListener.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTaskListener.java
@@ -20,6 +20,7 @@
 
 import android.app.ActivityManager;
 import android.app.PictureInPictureParams;
+import android.app.RemoteAction;
 import android.content.Context;
 import android.graphics.Rect;
 import android.os.Bundle;
@@ -37,6 +38,9 @@
 import com.android.wm.shell.pip2.animation.PipResizeAnimator;
 import com.android.wm.shell.shared.annotations.ShellMainThread;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * A Task Listener implementation used only for CUJs and trigger paths that cannot be initiated via
  * Transitions framework directly.
@@ -57,6 +61,7 @@
             new PictureInPictureParams.Builder().build();
 
     private boolean mWaitingForAspectRatioChange = false;
+    private final List<PipParamsChangedCallback> mPipParamsChangedListeners = new ArrayList<>();
 
     public PipTaskListener(Context context,
             ShellTaskOrganizer shellTaskOrganizer,
@@ -85,10 +90,25 @@
         if (mPictureInPictureParams.equals(params)) {
             return;
         }
+        if (PipUtils.remoteActionsChanged(params.getActions(), mPictureInPictureParams.getActions())
+                || !PipUtils.remoteActionsMatch(params.getCloseAction(),
+                mPictureInPictureParams.getCloseAction())) {
+            for (PipParamsChangedCallback listener : mPipParamsChangedListeners) {
+                listener.onActionsChanged(params.getActions(), params.getCloseAction());
+            }
+        }
         mPictureInPictureParams.copyOnlySet(params != null ? params
                 : new PictureInPictureParams.Builder().build());
     }
 
+    /** Add a PipParamsChangedCallback listener. */
+    public void addParamsChangedListener(PipParamsChangedCallback listener) {
+        if (mPipParamsChangedListeners.contains(listener)) {
+            return;
+        }
+        mPipParamsChangedListeners.add(listener);
+    }
+
     @NonNull
     public PictureInPictureParams getPictureInPictureParams() {
         return mPictureInPictureParams;
@@ -164,4 +184,12 @@
                 break;
         }
     }
+
+    public interface PipParamsChangedCallback {
+        /**
+         * Called if either the actions or the close action changed.
+         */
+        default void onActionsChanged(List<RemoteAction> actions, RemoteAction closeAction) {
+        }
+    }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java
index f93233e..62a60fa 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java
@@ -17,6 +17,7 @@
 package com.android.wm.shell.pip2.phone;
 
 import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+import static android.view.Surface.ROTATION_270;
 import static android.view.WindowManager.TRANSIT_CLOSE;
 import static android.view.WindowManager.TRANSIT_OPEN;
 import static android.view.WindowManager.TRANSIT_PIP;
@@ -33,6 +34,7 @@
 import android.app.ActivityManager;
 import android.app.PictureInPictureParams;
 import android.content.Context;
+import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.os.Bundle;
 import android.os.IBinder;
@@ -49,11 +51,13 @@
 import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.common.pip.PipBoundsAlgorithm;
 import com.android.wm.shell.common.pip.PipBoundsState;
+import com.android.wm.shell.common.pip.PipDisplayLayoutState;
 import com.android.wm.shell.common.pip.PipMenuController;
 import com.android.wm.shell.common.pip.PipUtils;
 import com.android.wm.shell.pip.PipTransitionController;
 import com.android.wm.shell.pip2.animation.PipAlphaAnimator;
 import com.android.wm.shell.pip2.animation.PipEnterExitAnimator;
+import com.android.wm.shell.shared.TransitionUtil;
 import com.android.wm.shell.shared.pip.PipContentOverlay;
 import com.android.wm.shell.sysui.ShellInit;
 import com.android.wm.shell.transition.Transitions;
@@ -81,7 +85,7 @@
      * The fixed start delay in ms when fading out the content overlay from bounds animation.
      * The fadeout animation is guaranteed to start after the client has drawn under the new config.
      */
-    private static final int CONTENT_OVERLAY_FADE_OUT_DELAY_MS = 400;
+    private static final int CONTENT_OVERLAY_FADE_OUT_DELAY_MS = 500;
 
     //
     // Dependencies
@@ -91,6 +95,7 @@
     private final PipTaskListener mPipTaskListener;
     private final PipScheduler mPipScheduler;
     private final PipTransitionState mPipTransitionState;
+    private final PipDisplayLayoutState mPipDisplayLayoutState;
 
     //
     // Transition caches
@@ -123,6 +128,7 @@
             PipTaskListener pipTaskListener,
             PipScheduler pipScheduler,
             PipTransitionState pipTransitionState,
+            PipDisplayLayoutState pipDisplayLayoutState,
             PipUiStateChangeController pipUiStateChangeController) {
         super(shellInit, shellTaskOrganizer, transitions, pipBoundsState, pipMenuController,
                 pipBoundsAlgorithm);
@@ -133,6 +139,7 @@
         mPipScheduler.setPipTransitionController(this);
         mPipTransitionState = pipTransitionState;
         mPipTransitionState.addPipTransitionStateChangedListener(this);
+        mPipDisplayLayoutState = pipDisplayLayoutState;
     }
 
     @Override
@@ -303,54 +310,47 @@
         if (pipChange == null) {
             return false;
         }
-        WindowContainerToken pipTaskToken = pipChange.getContainer();
         SurfaceControl pipLeash = pipChange.getLeash();
+        Preconditions.checkNotNull(pipLeash, "Leash is null for swipe-up transition.");
 
-        if (pipTaskToken == null || pipLeash == null) {
-            return false;
-        }
-
-        SurfaceControl overlayLeash = mPipTransitionState.getSwipePipToHomeOverlay();
-        PictureInPictureParams params = pipChange.getTaskInfo().pictureInPictureParams;
-
-        Rect appBounds = mPipTransitionState.getSwipePipToHomeAppBounds();
-        Rect destinationBounds = pipChange.getEndAbsBounds();
-
-        float aspectRatio = pipChange.getTaskInfo().pictureInPictureParams.getAspectRatioFloat();
-
-        // We fake the source rect hint when the one prvided by the app is invalid for
-        // the animation with an app icon overlay.
-        Rect animationSrcRectHint = overlayLeash == null ? params.getSourceRectHint()
-                : PipUtils.getEnterPipWithOverlaySrcRectHint(appBounds, aspectRatio);
-
-        WindowContainerTransaction finishWct = new WindowContainerTransaction();
-        SurfaceControl.Transaction tx = new SurfaceControl.Transaction();
-
-        final float scale = (float) destinationBounds.width() / animationSrcRectHint.width();
-        startTransaction.setWindowCrop(pipLeash, animationSrcRectHint);
-        startTransaction.setPosition(pipLeash,
-                destinationBounds.left - animationSrcRectHint.left * scale,
-                destinationBounds.top - animationSrcRectHint.top * scale);
-        startTransaction.setScale(pipLeash, scale, scale);
-
-        if (overlayLeash != null) {
+        final Rect destinationBounds = pipChange.getEndAbsBounds();
+        final SurfaceControl swipePipToHomeOverlay = mPipTransitionState.getSwipePipToHomeOverlay();
+        if (swipePipToHomeOverlay != null) {
             final int overlaySize = PipContentOverlay.PipAppIconOverlay.getOverlaySize(
                     mPipTransitionState.getSwipePipToHomeAppBounds(), destinationBounds);
+            // It is possible we reparent the PIP activity to a new PIP task (in multi-activity
+            // apps), so we should also reparent the overlay to the final PIP task.
+            startTransaction.reparent(swipePipToHomeOverlay, pipLeash)
+                    .setLayer(swipePipToHomeOverlay, Integer.MAX_VALUE)
+                    .setScale(swipePipToHomeOverlay, 1f, 1f)
+                    .setPosition(swipePipToHomeOverlay,
+                            (destinationBounds.width() - overlaySize) / 2f,
+                            (destinationBounds.height() - overlaySize) / 2f);
+        }
+        startTransaction.merge(finishTransaction);
 
-            // Overlay needs to be adjusted once a new draw comes in resetting surface transform.
-            tx.setScale(overlayLeash, 1f, 1f);
-            tx.setPosition(overlayLeash, (destinationBounds.width() - overlaySize) / 2f,
-                    (destinationBounds.height() - overlaySize) / 2f);
+        final int startRotation = pipChange.getStartRotation();
+        final int endRotation = mPipDisplayLayoutState.getRotation();
+        if (endRotation != startRotation) {
+            boolean isClockwise = (endRotation - startRotation) == -ROTATION_270;
+
+            // Display bounds were already updated to represent the final orientation,
+            // so we just need to readjust the origin, and perform rotation about (0, 0).
+            Rect displayBounds = mPipDisplayLayoutState.getDisplayBounds();
+            int originTranslateX = isClockwise ? 0 : -displayBounds.width();
+            int originTranslateY = isClockwise ? -displayBounds.height() : 0;
+
+            Matrix transformTensor = new Matrix();
+            final float[] matrixTmp = new float[9];
+            transformTensor.setTranslate(originTranslateX + destinationBounds.left,
+                    originTranslateY + destinationBounds.top);
+            final float degrees = (endRotation - startRotation) * 90f;
+            transformTensor.postRotate(degrees);
+            startTransaction.setMatrix(pipLeash, transformTensor, matrixTmp);
         }
         startTransaction.apply();
-
-        tx.addTransactionCommittedListener(mPipScheduler.getMainExecutor(),
-                        this::onClientDrawAtTransitionEnd);
-        finishWct.setBoundsChangeTransaction(pipTaskToken, tx);
-
-        // Note that finishWct should be free of any actual WM state changes; we are using
-        // it for syncing with the client draw after delayed configuration changes are dispatched.
-        finishCallback.onTransitionFinished(finishWct.isEmpty() ? null : finishWct);
+        finishCallback.onTransitionFinished(null /* finishWct */);
+        finishInner();
         return true;
     }
 
@@ -405,12 +405,24 @@
             sourceRectHint = pipChange.getTaskInfo().pictureInPictureParams.getSourceRectHint();
         }
 
+        // For opening type transitions, if there is a non-pip change of mode TO_FRONT/OPEN,
+        // make sure that change has alpha of 1f, since it's init state might be set to alpha=0f
+        // by the Transitions framework to simplify Task opening transitions.
+        if (TransitionUtil.isOpeningType(info.getType())) {
+            for (TransitionInfo.Change change : info.getChanges()) {
+                if (change.getLeash() == null || change == pipChange) continue;
+                if (change.getMode() == TRANSIT_OPEN || change.getMode() == TRANSIT_TO_FRONT) {
+                    startTransaction.setAlpha(change.getLeash(), 1f);
+                }
+            }
+        }
+
         PipEnterExitAnimator animator = new PipEnterExitAnimator(mContext, pipLeash,
                 startTransaction, finishTransaction, startBounds, startBounds, endBounds,
                 sourceRectHint, PipEnterExitAnimator.BOUNDS_ENTER, Surface.ROTATION_0);
 
         tx.addTransactionCommittedListener(mPipScheduler.getMainExecutor(),
-                this::onClientDrawAtTransitionEnd);
+                this::finishInner);
         finishWct.setBoundsChangeTransaction(pipTaskToken, tx);
 
         animator.setAnimationEndCallback(() ->
@@ -443,7 +455,7 @@
         animator.setAnimationEndCallback(() -> {
             finishCallback.onTransitionFinished(null);
             // This should update the pip transition state accordingly after we stop playing.
-            onClientDrawAtTransitionEnd();
+            finishInner();
         });
 
         animator.start();
@@ -618,7 +630,7 @@
     // Miscellaneous callbacks and listeners
     //
 
-    private void onClientDrawAtTransitionEnd() {
+    private void finishInner() {
         if (mPipTransitionState.getSwipePipToHomeOverlay() != null) {
             startOverlayFadeoutAnimation();
         } else if (mPipTransitionState.getState() == PipTransitionState.ENTERING_PIP) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java
index 03ff1aa..a0b7a29 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java
@@ -32,6 +32,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Color;
+import android.graphics.Point;
 import android.os.Bundle;
 import android.os.RemoteException;
 import android.util.Slog;
@@ -46,13 +47,14 @@
 import androidx.annotation.VisibleForTesting;
 
 import com.android.internal.protolog.ProtoLog;
+import com.android.window.flags.Flags;
 import com.android.wm.shell.common.ExternalInterfaceBinder;
 import com.android.wm.shell.common.RemoteCallable;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.SingleInstanceRemoteListener;
 import com.android.wm.shell.common.TaskStackListenerCallback;
 import com.android.wm.shell.common.TaskStackListenerImpl;
-import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
+import com.android.wm.shell.desktopmode.DesktopRepository;
 import com.android.wm.shell.protolog.ShellProtoLogGroup;
 import com.android.wm.shell.shared.GroupedRecentTaskInfo;
 import com.android.wm.shell.shared.annotations.ExternalThread;
@@ -79,14 +81,14 @@
  * Manages the recent task list from the system, caching it as necessary.
  */
 public class RecentTasksController implements TaskStackListenerCallback,
-        RemoteCallable<RecentTasksController>, DesktopModeTaskRepository.ActiveTasksListener,
+        RemoteCallable<RecentTasksController>, DesktopRepository.ActiveTasksListener,
         TaskStackTransitionObserver.TaskStackTransitionObserverListener {
     private static final String TAG = RecentTasksController.class.getSimpleName();
 
     private final Context mContext;
     private final ShellController mShellController;
     private final ShellCommandHandler mShellCommandHandler;
-    private final Optional<DesktopModeTaskRepository> mDesktopModeTaskRepository;
+    private final Optional<DesktopRepository> mDesktopRepository;
     private final ShellExecutor mMainExecutor;
     private final TaskStackListenerImpl mTaskStackListener;
     private final RecentTasksImpl mImpl = new RecentTasksImpl();
@@ -119,7 +121,7 @@
             ShellCommandHandler shellCommandHandler,
             TaskStackListenerImpl taskStackListener,
             ActivityTaskManager activityTaskManager,
-            Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
+            Optional<DesktopRepository> desktopRepository,
             TaskStackTransitionObserver taskStackTransitionObserver,
             @ShellMainThread ShellExecutor mainExecutor
     ) {
@@ -127,7 +129,7 @@
             return null;
         }
         return new RecentTasksController(context, shellInit, shellController, shellCommandHandler,
-                taskStackListener, activityTaskManager, desktopModeTaskRepository,
+                taskStackListener, activityTaskManager, desktopRepository,
                 taskStackTransitionObserver, mainExecutor);
     }
 
@@ -137,7 +139,7 @@
             ShellCommandHandler shellCommandHandler,
             TaskStackListenerImpl taskStackListener,
             ActivityTaskManager activityTaskManager,
-            Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
+            Optional<DesktopRepository> desktopRepository,
             TaskStackTransitionObserver taskStackTransitionObserver,
             ShellExecutor mainExecutor) {
         mContext = context;
@@ -146,7 +148,7 @@
         mActivityTaskManager = activityTaskManager;
         mPcFeatureEnabled = mContext.getPackageManager().hasSystemFeature(FEATURE_PC);
         mTaskStackListener = taskStackListener;
-        mDesktopModeTaskRepository = desktopModeTaskRepository;
+        mDesktopRepository = desktopRepository;
         mTaskStackTransitionObserver = taskStackTransitionObserver;
         mMainExecutor = mainExecutor;
         shellInit.addInitCallback(this::onInit, this);
@@ -166,7 +168,7 @@
                 this::createExternalInterface, this);
         mShellCommandHandler.addDumpCallback(this::dump, this);
         mTaskStackListener.addListener(this);
-        mDesktopModeTaskRepository.ifPresent(it -> it.addActiveTaskListener(this));
+        mDesktopRepository.ifPresent(it -> it.addActiveTaskListener(this));
         if (Transitions.ENABLE_SHELL_TRANSITIONS) {
             mTaskStackTransitionObserver.addTaskStackTransitionObserverListener(this,
                     mMainExecutor);
@@ -415,14 +417,24 @@
             }
 
             if (DesktopModeStatus.canEnterDesktopMode(mContext)
-                    && mDesktopModeTaskRepository.isPresent()
-                    && mDesktopModeTaskRepository.get().isActiveTask(taskInfo.taskId)) {
+                    && mDesktopRepository.isPresent()
+                    && mDesktopRepository.get().isActiveTask(taskInfo.taskId)) {
                 // Freeform tasks will be added as a separate entry
                 if (mostRecentFreeformTaskIndex == Integer.MAX_VALUE) {
                     mostRecentFreeformTaskIndex = recentTasks.size();
                 }
+                // If task has their app bounds set to null which happens after reboot, set the
+                // app bounds to persisted lastFullscreenBounds. Also set the position in parent
+                // to the top left of the bounds.
+                if (Flags.enableDesktopWindowingPersistence()
+                        && taskInfo.configuration.windowConfiguration.getAppBounds() == null) {
+                    taskInfo.configuration.windowConfiguration.setAppBounds(
+                            taskInfo.lastNonFullscreenBounds);
+                    taskInfo.positionInParent = new Point(taskInfo.lastNonFullscreenBounds.left,
+                            taskInfo.lastNonFullscreenBounds.top);
+                }
                 freeformTasks.add(taskInfo);
-                if (mDesktopModeTaskRepository.get().isMinimizedTask(taskInfo.taskId)) {
+                if (mDesktopRepository.get().isMinimizedTask(taskInfo.taskId)) {
                     minimizedFreeformTasks.add(taskInfo.taskId);
                 }
                 continue;
@@ -528,6 +540,14 @@
         return null;
     }
 
+    /**
+     * Remove the background task that match the given taskId. This will remove the task regardless
+     * of whether it's active or recent.
+     */
+    public boolean removeBackgroundTask(int taskId) {
+        return mActivityTaskManager.removeTask(taskId);
+    }
+
     public void dump(@NonNull PrintWriter pw, String prefix) {
         final String innerPrefix = prefix + "  ";
         pw.println(prefix + TAG);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
index 8077aee..f7ed1dd 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
@@ -52,7 +52,6 @@
 import android.util.IntArray;
 import android.util.Pair;
 import android.util.Slog;
-import android.view.Display;
 import android.view.RemoteAnimationTarget;
 import android.view.SurfaceControl;
 import android.window.PictureInPictureSurfaceTransaction;
@@ -910,6 +909,14 @@
                             "task #" + taskInfo.taskId + " is always_on_top");
                     return;
                 }
+                if (TransitionUtil.isClosingType(change.getMode())
+                        && taskInfo != null && taskInfo.lastParentTaskIdBeforePip > 0) {
+                    // Pinned task is closing as a side effect of the removal of its original Task,
+                    // such transition should be handled by PiP. So cancel the merge here.
+                    cancel(false /* toHome */, false /* withScreenshots */,
+                            "task #" + taskInfo.taskId + " is removed with its original parent");
+                    return;
+                }
                 final boolean isRootTask = taskInfo != null
                         && TransitionInfo.isIndependent(change, info);
                 final boolean isRecentsTask = mRecentsTask != null
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/TaskStackTransitionObserver.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/TaskStackTransitionObserver.kt
index e5bfccf..0cbbb71 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/TaskStackTransitionObserver.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/TaskStackTransitionObserver.kt
@@ -17,14 +17,12 @@
 package com.android.wm.shell.recents
 
 import android.app.ActivityManager.RunningTaskInfo
-import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
 import android.os.IBinder
 import android.util.ArrayMap
 import android.view.SurfaceControl
-import android.view.WindowManager
 import android.window.TransitionInfo
-import com.android.wm.shell.shared.TransitionUtil
 import android.window.flags.DesktopModeFlags
+import com.android.wm.shell.shared.TransitionUtil
 import com.android.wm.shell.sysui.ShellInit
 import com.android.wm.shell.transition.Transitions
 import dagger.Lazy
@@ -40,16 +38,11 @@
     private val transitions: Lazy<Transitions>,
     shellInit: ShellInit
 ) : Transitions.TransitionObserver {
-
-    private val transitionToTransitionChanges: MutableMap<IBinder, TransitionChanges> =
-        mutableMapOf()
     private val taskStackTransitionObserverListeners =
         ArrayMap<TaskStackTransitionObserverListener, Executor>()
 
     init {
-        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            shellInit.addInitCallback(::onInit, this)
-        }
+        shellInit.addInitCallback(::onInit, this)
     }
 
     fun onInit() {
@@ -63,9 +56,6 @@
         finishTransaction: SurfaceControl.Transaction
     ) {
         if (DesktopModeFlags.ENABLE_TASK_STACK_OBSERVER_IN_SHELL.isTrue) {
-            val taskInfoList = mutableListOf<RunningTaskInfo>()
-            val transitionTypeList = mutableListOf<Int>()
-
             for (change in info.changes) {
                 if (change.flags and TransitionInfo.FLAG_IS_WALLPAPER != 0) {
                     continue
@@ -76,59 +66,21 @@
                     continue
                 }
 
-                // Filter out changes that we care about
-                if (change.mode == WindowManager.TRANSIT_OPEN) {
-                    change.taskInfo?.let { taskInfoList.add(it) }
-                    transitionTypeList.add(change.mode)
+                // Find the first task that is opening, this should be the one at the front after
+                // the transition
+                if (TransitionUtil.isOpeningType(change.mode)) {
+                    notifyTaskStackTransitionObserverListeners(taskInfo)
+                    break
                 }
             }
-            // Only add the transition to map if it has a change we care about
-            if (taskInfoList.isNotEmpty()) {
-                transitionToTransitionChanges.put(
-                    transition,
-                    TransitionChanges(taskInfoList, transitionTypeList)
-                )
-            }
         }
     }
 
     override fun onTransitionStarting(transition: IBinder) {}
 
-    override fun onTransitionMerged(merged: IBinder, playing: IBinder) {
-        val mergedTransitionChanges =
-            transitionToTransitionChanges.get(merged)
-                ?:
-                // We are adding changes of the merged transition to changes of the playing
-                // transition so if there is no changes nothing to do.
-                return
+    override fun onTransitionMerged(merged: IBinder, playing: IBinder) {}
 
-        transitionToTransitionChanges.remove(merged)
-        val playingTransitionChanges = transitionToTransitionChanges.get(playing)
-        if (playingTransitionChanges != null) {
-            playingTransitionChanges.merge(mergedTransitionChanges)
-        } else {
-            transitionToTransitionChanges.put(playing, mergedTransitionChanges)
-        }
-    }
-
-    override fun onTransitionFinished(transition: IBinder, aborted: Boolean) {
-        val taskInfoList =
-            transitionToTransitionChanges.getOrDefault(transition, TransitionChanges()).taskInfoList
-        val typeList =
-            transitionToTransitionChanges
-                .getOrDefault(transition, TransitionChanges())
-                .transitionTypeList
-        transitionToTransitionChanges.remove(transition)
-
-        for ((index, taskInfo) in taskInfoList.withIndex()) {
-            if (
-                TransitionUtil.isOpeningType(typeList[index]) &&
-                    taskInfo.windowingMode == WINDOWING_MODE_FREEFORM
-            ) {
-                notifyTaskStackTransitionObserverListeners(taskInfo)
-            }
-        }
-    }
+    override fun onTransitionFinished(transition: IBinder, aborted: Boolean) {}
 
     fun addTaskStackTransitionObserverListener(
         taskStackTransitionObserverListener: TaskStackTransitionObserverListener,
@@ -154,14 +106,4 @@
         /** Called when a task is moved to front. */
         fun onTaskMovedToFrontThroughTransition(taskInfo: RunningTaskInfo) {}
     }
-
-    private data class TransitionChanges(
-        val taskInfoList: MutableList<RunningTaskInfo> = ArrayList(),
-        val transitionTypeList: MutableList<Int> = ArrayList(),
-    ) {
-        fun merge(transitionChanges: TransitionChanges) {
-            taskInfoList.addAll(transitionChanges.taskInfoList)
-            transitionTypeList.addAll(transitionChanges.transitionTypeList)
-        }
-    }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
index e8eb10c..e527c02 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
@@ -901,6 +901,23 @@
         setEnterInstanceId(instanceId);
     }
 
+
+    @Override
+    public void setExcludeImeInsets(boolean exclude) {
+        if (android.view.inputmethod.Flags.refactorInsetsController()) {
+            final WindowContainerTransaction wct = new WindowContainerTransaction();
+            if (mRootTaskInfo == null) {
+                ProtoLog.e(WM_SHELL_SPLIT_SCREEN, "setExcludeImeInsets: mRootTaskInfo is null");
+                return;
+            }
+            ProtoLog.d(WM_SHELL_SPLIT_SCREEN,
+                    "setExcludeImeInsets: root taskId=%s exclude=%s",
+                    mRootTaskInfo.taskId, exclude);
+            wct.setExcludeImeInsets(mRootTaskInfo.token, exclude);
+            mTaskOrganizer.applyTransaction(wct);
+        }
+    }
+
     /**
      * Checks if either of the apps in the desired split launch is currently in Pip. If so, it will
      * launch the non-pipped app as a fullscreen app, otherwise no-op.
@@ -1717,6 +1734,7 @@
         final WindowContainerTransaction wct = new WindowContainerTransaction();
         wct.reparent(mMainStage.mRootTaskInfo.token, mRootTaskInfo.token, true);
         wct.reparent(mSideStage.mRootTaskInfo.token, mRootTaskInfo.token, true);
+
         // Make the stages adjacent to each other so they occlude what's behind them.
         wct.setAdjacentRoots(mMainStage.mRootTaskInfo.token, mSideStage.mRootTaskInfo.token);
         setRootForceTranslucent(true, wct);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java
index 6e084d6..2747249 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java
@@ -146,6 +146,11 @@
             Slog.w(TAG, "Failed to relayout snapshot starting window");
             return null;
         }
+        if (!surfaceControl.isValid()) {
+            snapshotSurface.clearWindowSynced();
+            Slog.w(TAG, "Unable to draw snapshot, no valid surface");
+            return null;
+        }
 
         SnapshotDrawerUtils.drawSnapshotOnSurface(info, layoutParams, surfaceControl, snapshot,
                 info.taskBounds, topWindowInsetsState, true /* releaseAfterDraw */);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
index d3bed59..a2439a9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
@@ -361,8 +361,11 @@
                     final int anim = getRotationAnimationHint(change, info, mDisplayController);
                     isSeamlessDisplayChange = anim == ROTATION_ANIMATION_SEAMLESS;
                     if (!(isSeamlessDisplayChange || anim == ROTATION_ANIMATION_JUMPCUT)) {
-                        startRotationAnimation(startTransaction, change, info, anim, animations,
-                                onAnimFinish);
+                        final int flags = wallpaperTransit != WALLPAPER_TRANSITION_NONE
+                                && Flags.commonSurfaceAnimator()
+                                ? ScreenRotationAnimation.FLAG_HAS_WALLPAPER : 0;
+                        startRotationAnimation(startTransaction, change, info, anim, flags,
+                                animations, onAnimFinish);
                         isDisplayRotationAnimationStarted = true;
                         continue;
                     }
@@ -414,7 +417,7 @@
                 if (change.getParent() == null && !change.hasFlags(FLAG_IS_DISPLAY)
                         && change.getStartRotation() != change.getEndRotation()) {
                     startRotationAnimation(startTransaction, change, info,
-                            ROTATION_ANIMATION_ROTATE, animations, onAnimFinish);
+                            ROTATION_ANIMATION_ROTATE, 0 /* flags */, animations, onAnimFinish);
                     continue;
                 }
             }
@@ -699,12 +702,12 @@
     }
 
     private void startRotationAnimation(SurfaceControl.Transaction startTransaction,
-            TransitionInfo.Change change, TransitionInfo info, int animHint,
+            TransitionInfo.Change change, TransitionInfo info, int animHint, int flags,
             ArrayList<Animator> animations, Runnable onAnimFinish) {
         final int rootIdx = TransitionUtil.rootIndexFor(change, info);
         final ScreenRotationAnimation anim = new ScreenRotationAnimation(mContext,
                 mTransactionPool, startTransaction, change, info.getRoot(rootIdx).getLeash(),
-                animHint);
+                animHint, flags);
         // The rotation animation may consist of 3 animations: fade-out screenshot, fade-in real
         // content, and background color. The item of "animGroup" will be removed if the sub
         // animation is finished. Then if the list becomes empty, the rotation animation is done.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/FocusTransitionObserver.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/FocusTransitionObserver.java
new file mode 100644
index 0000000..399e39a
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/FocusTransitionObserver.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.transition;
+
+import static android.view.Display.INVALID_DISPLAY;
+import static android.window.TransitionInfo.FLAG_IS_DISPLAY;
+import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP;
+
+import static com.android.window.flags.Flags.enableDisplayFocusInShellTransitions;
+import static com.android.wm.shell.transition.Transitions.TransitionObserver;
+
+import android.annotation.NonNull;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Slog;
+import android.view.SurfaceControl;
+import android.window.TransitionInfo;
+
+import com.android.wm.shell.shared.FocusTransitionListener;
+import com.android.wm.shell.shared.IFocusTransitionListener;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executor;
+
+/**
+ * The {@link TransitionObserver} that observes for transitions involving focus switch.
+ * It reports transitions to callers outside of the process via {@link IFocusTransitionListener},
+ * and callers within the process via {@link FocusTransitionListener}.
+ */
+public class FocusTransitionObserver implements TransitionObserver {
+    private static final String TAG = FocusTransitionObserver.class.getSimpleName();
+
+    private IFocusTransitionListener mRemoteListener;
+    private final Map<FocusTransitionListener, Executor> mLocalListeners =
+            new HashMap<>();
+
+    private int mFocusedDisplayId = INVALID_DISPLAY;
+
+    public FocusTransitionObserver() {}
+
+    @Override
+    public void onTransitionReady(@NonNull IBinder transition,
+            @NonNull TransitionInfo info,
+            @NonNull SurfaceControl.Transaction startTransaction,
+            @NonNull SurfaceControl.Transaction finishTransaction) {
+        final List<TransitionInfo.Change> changes = info.getChanges();
+        for (int i = changes.size() - 1; i >= 0; i--) {
+            final TransitionInfo.Change change = changes.get(i);
+            if (change.hasFlags(FLAG_IS_DISPLAY) && change.hasFlags(FLAG_MOVED_TO_TOP)) {
+                if (mFocusedDisplayId != change.getEndDisplayId()) {
+                    mFocusedDisplayId = change.getEndDisplayId();
+                    notifyFocusedDisplayChanged();
+                }
+                return;
+            }
+        }
+    }
+
+    @Override
+    public void onTransitionStarting(@NonNull IBinder transition) {}
+
+    @Override
+    public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) {}
+
+    @Override
+    public void onTransitionFinished(@NonNull IBinder transition, boolean aborted) {}
+
+    /**
+     * Sets the focus transition listener that receives any transitions resulting in focus switch.
+     * This is for calls from outside the Shell, within the host process.
+     *
+     */
+    public void setLocalFocusTransitionListener(FocusTransitionListener listener,
+            Executor executor) {
+        if (!enableDisplayFocusInShellTransitions()) {
+            return;
+        }
+        mLocalListeners.put(listener, executor);
+        executor.execute(() -> listener.onFocusedDisplayChanged(mFocusedDisplayId));
+    }
+
+    /**
+     * Sets the focus transition listener that receives any transitions resulting in focus switch.
+     * This is for calls from outside the Shell, within the host process.
+     *
+     */
+    public void unsetLocalFocusTransitionListener(FocusTransitionListener listener) {
+        if (!enableDisplayFocusInShellTransitions()) {
+            return;
+        }
+        mLocalListeners.remove(listener);
+    }
+
+    /**
+     * Sets the focus transition listener that receives any transitions resulting in focus switch.
+     * This is for calls from outside the host process.
+     */
+    public void setRemoteFocusTransitionListener(Transitions transitions,
+            IFocusTransitionListener listener) {
+        if (!enableDisplayFocusInShellTransitions()) {
+            return;
+        }
+        mRemoteListener = listener;
+        notifyFocusedDisplayChangedToRemote();
+    }
+
+    /**
+     * Notifies the listener that display focus has changed.
+     */
+    public void notifyFocusedDisplayChanged() {
+        notifyFocusedDisplayChangedToRemote();
+        mLocalListeners.forEach((listener, executor) ->
+                executor.execute(() -> listener.onFocusedDisplayChanged(mFocusedDisplayId)));
+    }
+
+    private void notifyFocusedDisplayChangedToRemote() {
+        if (mRemoteListener != null) {
+            try {
+                mRemoteListener.onFocusedDisplayChanged(mFocusedDisplayId);
+            } catch (RemoteException e) {
+                Slog.w(TAG, "Failed call notifyFocusedDisplayChangedToRemote", e);
+            }
+        }
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/MixedTransitionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/MixedTransitionHelper.java
index 30d7245..e61929f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/MixedTransitionHelper.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/MixedTransitionHelper.java
@@ -141,10 +141,13 @@
             pipHandler.setEnterAnimationType(ANIM_TYPE_ALPHA);
             pipHandler.startEnterAnimation(pipChange, startTransaction, finishTransaction,
                     finishCB);
+            // make a new finishTransaction because pip's startEnterAnimation "consumes" it so
+            // we need a separate one to send over to launcher.
+            SurfaceControl.Transaction otherFinishT = new SurfaceControl.Transaction();
             // Dispatch the rest of the transition normally. This will most-likely be taken by
             // recents or default handler.
             mixed.mLeftoversHandler = player.dispatchTransition(mixed.mTransition, everythingElse,
-                    otherStartT, finishTransaction, finishCB, mixedHandler);
+                    otherStartT, otherFinishT, finishCB, mixedHandler);
         } else {
             ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "  Not leaving split, so just "
                     + "forward animation to Pip-Handler.");
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java
index 5802e2c..1a04997 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java
@@ -25,12 +25,9 @@
 import static com.android.wm.shell.transition.Transitions.TAG;
 
 import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ArgbEvaluator;
 import android.animation.ValueAnimator;
 import android.annotation.NonNull;
 import android.content.Context;
-import android.graphics.Color;
 import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.hardware.HardwareBuffer;
@@ -38,6 +35,7 @@
 import android.view.Surface;
 import android.view.SurfaceControl;
 import android.view.SurfaceControl.Transaction;
+import android.view.animation.AccelerateInterpolator;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
 import android.window.ScreenCapture;
@@ -74,6 +72,7 @@
  */
 class ScreenRotationAnimation {
     static final int MAX_ANIMATION_DURATION = 10 * 1000;
+    static final int FLAG_HAS_WALLPAPER = 1;
 
     private final Context mContext;
     private final TransactionPool mTransactionPool;
@@ -98,6 +97,12 @@
     private SurfaceControl mBackColorSurface;
     /** The leash using to animate screenshot layer. */
     private final SurfaceControl mAnimLeash;
+    /**
+     * The container with background color for {@link #mSurfaceControl}. It is only created if
+     * {@link #mSurfaceControl} may be translucent. E.g. visible wallpaper with alpha < 1 (dimmed).
+     * That prevents flickering of alpha blending.
+     */
+    private SurfaceControl mBackEffectSurface;
 
     // The current active animation to move from the old to the new rotated
     // state.  Which animation is run here will depend on the old and new
@@ -111,8 +116,8 @@
     /** Intensity of light/whiteness of the layout after rotation occurs. */
     private float mEndLuma;
 
-    ScreenRotationAnimation(Context context, TransactionPool pool,
-            Transaction t, TransitionInfo.Change change, SurfaceControl rootLeash, int animHint) {
+    ScreenRotationAnimation(Context context, TransactionPool pool, Transaction t,
+            TransitionInfo.Change change, SurfaceControl rootLeash, int animHint, int flags) {
         mContext = context;
         mTransactionPool = pool;
         mAnimHint = animHint;
@@ -170,11 +175,20 @@
                 }
                 hardwareBuffer.close();
             }
+            if ((flags & FLAG_HAS_WALLPAPER) != 0) {
+                mBackEffectSurface = new SurfaceControl.Builder()
+                        .setCallsite("ShellRotationAnimation").setParent(rootLeash)
+                        .setEffectLayer().setOpaque(true).setName("BackEffect").build();
+                t.reparent(mSurfaceControl, mBackEffectSurface)
+                        .setColor(mBackEffectSurface,
+                                new float[] {mStartLuma, mStartLuma, mStartLuma})
+                        .show(mBackEffectSurface);
+            }
 
             t.setLayer(mAnimLeash, SCREEN_FREEZE_LAYER_BASE);
             t.show(mAnimLeash);
             // Crop the real content in case it contains a larger child layer, e.g. wallpaper.
-            t.setCrop(mSurfaceControl, new Rect(0, 0, mEndWidth, mEndHeight));
+            t.setCrop(getEnterSurface(), new Rect(0, 0, mEndWidth, mEndHeight));
 
             if (!isCustomRotate()) {
                 mBackColorSurface = new SurfaceControl.Builder()
@@ -202,6 +216,11 @@
         return mAnimHint == ROTATION_ANIMATION_CROSSFADE || mAnimHint == ROTATION_ANIMATION_JUMPCUT;
     }
 
+    /** Returns the surface which contains the real content to animate enter. */
+    private SurfaceControl getEnterSurface() {
+        return mBackEffectSurface != null ? mBackEffectSurface : mSurfaceControl;
+    }
+
     private void setScreenshotTransform(SurfaceControl.Transaction t) {
         if (mScreenshotLayer == null) {
             return;
@@ -314,7 +333,11 @@
         } else {
             startDisplayRotation(animations, finishCallback, mainExecutor);
             startScreenshotRotationAnimation(animations, finishCallback, mainExecutor);
-            //startColorAnimation(mTransaction, animationScale);
+            if (mBackEffectSurface != null && mStartLuma > 0.1f) {
+                // Animate from the color of background to black for smooth alpha blending.
+                buildLumaAnimation(animations, mStartLuma, 0f /* endLuma */, mBackEffectSurface,
+                        animationScale, finishCallback, mainExecutor);
+            }
         }
 
         return true;
@@ -322,7 +345,7 @@
 
     private void startDisplayRotation(@NonNull ArrayList<Animator> animations,
             @NonNull Runnable finishCallback, @NonNull ShellExecutor mainExecutor) {
-        buildSurfaceAnimation(animations, mRotateEnterAnimation, mSurfaceControl, finishCallback,
+        buildSurfaceAnimation(animations, mRotateEnterAnimation, getEnterSurface(), finishCallback,
                 mTransactionPool, mainExecutor, null /* position */, 0 /* cornerRadius */,
                 null /* clipRect */, false /* isActivity */);
     }
@@ -341,40 +364,17 @@
                 null /* clipRect */, false /* isActivity */);
     }
 
-    private void startColorAnimation(float animationScale, @NonNull ShellExecutor animExecutor) {
-        int colorTransitionMs = mContext.getResources().getInteger(
-                R.integer.config_screen_rotation_color_transition);
-        final float[] rgbTmpFloat = new float[3];
-        final int startColor = Color.rgb(mStartLuma, mStartLuma, mStartLuma);
-        final int endColor = Color.rgb(mEndLuma, mEndLuma, mEndLuma);
-        final long duration = colorTransitionMs * (long) animationScale;
-        final Transaction t = mTransactionPool.acquire();
-
-        final ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
-        // Animation length is already expected to be scaled.
-        va.overrideDurationScale(1.0f);
-        va.setDuration(duration);
-        va.addUpdateListener(animation -> {
-            final long currentPlayTime = Math.min(va.getDuration(), va.getCurrentPlayTime());
-            final float fraction = currentPlayTime / va.getDuration();
-            applyColor(startColor, endColor, rgbTmpFloat, fraction, mBackColorSurface, t);
-        });
-        va.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationCancel(Animator animation) {
-                applyColor(startColor, endColor, rgbTmpFloat, 1f /* fraction */, mBackColorSurface,
-                        t);
-                mTransactionPool.release(t);
-            }
-
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                applyColor(startColor, endColor, rgbTmpFloat, 1f /* fraction */, mBackColorSurface,
-                        t);
-                mTransactionPool.release(t);
-            }
-        });
-        animExecutor.execute(va::start);
+    private void buildLumaAnimation(@NonNull ArrayList<Animator> animations,
+            float startLuma, float endLuma, SurfaceControl surface, float animationScale,
+            @NonNull Runnable finishCallback, @NonNull ShellExecutor mainExecutor) {
+        final long durationMillis = (long) (mContext.getResources().getInteger(
+                R.integer.config_screen_rotation_color_transition) * animationScale);
+        final LumaAnimation animation = new LumaAnimation(durationMillis);
+        // Align the end with the enter animation.
+        animation.setStartOffset(mRotateEnterAnimation.getDuration() - durationMillis);
+        final LumaAnimationAdapter adapter = new LumaAnimationAdapter(surface, startLuma, endLuma);
+        DefaultSurfaceAnimator.buildSurfaceAnimation(animations, animation, finishCallback,
+                mTransactionPool, mainExecutor, adapter);
     }
 
     public void kill() {
@@ -389,21 +389,47 @@
         if (mBackColorSurface != null && mBackColorSurface.isValid()) {
             t.remove(mBackColorSurface);
         }
+        if (mBackEffectSurface != null && mBackEffectSurface.isValid()) {
+            t.remove(mBackEffectSurface);
+        }
         t.apply();
         mTransactionPool.release(t);
     }
 
-    private static void applyColor(int startColor, int endColor, float[] rgbFloat,
-            float fraction, SurfaceControl surface, SurfaceControl.Transaction t) {
-        final int color = (Integer) ArgbEvaluator.getInstance().evaluate(fraction, startColor,
-                endColor);
-        Color middleColor = Color.valueOf(color);
-        rgbFloat[0] = middleColor.red();
-        rgbFloat[1] = middleColor.green();
-        rgbFloat[2] = middleColor.blue();
-        if (surface.isValid()) {
-            t.setColor(surface, rgbFloat);
+    /** A no-op wrapper to provide animation duration. */
+    private static class LumaAnimation extends Animation {
+        LumaAnimation(long durationMillis) {
+            setDuration(durationMillis);
         }
-        t.apply();
+    }
+
+    private static class LumaAnimationAdapter extends DefaultSurfaceAnimator.AnimationAdapter {
+        final float[] mColorArray = new float[3];
+        final float mStartLuma;
+        final float mEndLuma;
+        final AccelerateInterpolator mInterpolation;
+
+        LumaAnimationAdapter(@NonNull SurfaceControl leash, float startLuma, float endLuma) {
+            super(leash);
+            mStartLuma = startLuma;
+            mEndLuma = endLuma;
+            // Make the initial progress color lighter if the background is light. That avoids
+            // darker content when fading into the entering surface.
+            final float factor = Math.min(3f, (Math.max(0.5f, mStartLuma) - 0.5f) * 10);
+            Slog.d(TAG, "Luma=" + mStartLuma + " factor=" + factor);
+            mInterpolation = factor > 0.5f ? new AccelerateInterpolator(factor) : null;
+        }
+
+        @Override
+        void applyTransformation(ValueAnimator animator, long currentPlayTime) {
+            final float fraction = mInterpolation != null
+                    ? mInterpolation.getInterpolation(animator.getAnimatedFraction())
+                    : animator.getAnimatedFraction();
+            final float luma = mStartLuma + fraction * (mEndLuma - mStartLuma);
+            mColorArray[0] = luma;
+            mColorArray[1] = luma;
+            mColorArray[2] = luma;
+            mTransaction.setColor(mLeash, mColorArray);
+        }
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
index d03832d..d5e92e6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
@@ -87,6 +87,8 @@
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.keyguard.KeyguardTransitionHandler;
 import com.android.wm.shell.protolog.ShellProtoLogGroup;
+import com.android.wm.shell.shared.FocusTransitionListener;
+import com.android.wm.shell.shared.IFocusTransitionListener;
 import com.android.wm.shell.shared.IHomeTransitionListener;
 import com.android.wm.shell.shared.IShellTransitions;
 import com.android.wm.shell.shared.ShellTransitions;
@@ -103,6 +105,7 @@
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.concurrent.Executor;
 
 /**
  * Plays transition animations. Within this player, each transition has a lifecycle.
@@ -224,6 +227,7 @@
     private final ArrayList<TransitionObserver> mObservers = new ArrayList<>();
 
     private HomeTransitionObserver mHomeTransitionObserver;
+    private FocusTransitionObserver mFocusTransitionObserver;
 
     /** List of {@link Runnable} instances to run when the last active transition has finished.  */
     private final ArrayList<Runnable> mRunWhenIdleQueue = new ArrayList<>();
@@ -309,10 +313,12 @@
             @NonNull ShellExecutor mainExecutor,
             @NonNull Handler mainHandler,
             @NonNull ShellExecutor animExecutor,
-            @NonNull HomeTransitionObserver observer) {
+            @NonNull HomeTransitionObserver homeTransitionObserver,
+            @NonNull FocusTransitionObserver focusTransitionObserver) {
         this(context, shellInit, new ShellCommandHandler(), shellController, organizer, pool,
                 displayController, mainExecutor, mainHandler, animExecutor,
-                new RootTaskDisplayAreaOrganizer(mainExecutor, context, shellInit), observer);
+                new RootTaskDisplayAreaOrganizer(mainExecutor, context, shellInit),
+                homeTransitionObserver, focusTransitionObserver);
     }
 
     public Transitions(@NonNull Context context,
@@ -326,7 +332,8 @@
             @NonNull Handler mainHandler,
             @NonNull ShellExecutor animExecutor,
             @NonNull RootTaskDisplayAreaOrganizer rootTDAOrganizer,
-            @NonNull HomeTransitionObserver observer) {
+            @NonNull HomeTransitionObserver homeTransitionObserver,
+            @NonNull FocusTransitionObserver focusTransitionObserver) {
         mOrganizer = organizer;
         mContext = context;
         mMainExecutor = mainExecutor;
@@ -345,7 +352,8 @@
         mHandlers.add(mRemoteTransitionHandler);
         ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "addHandler: Remote");
         shellInit.addInitCallback(this::onInit, this);
-        mHomeTransitionObserver = observer;
+        mHomeTransitionObserver = homeTransitionObserver;
+        mFocusTransitionObserver = focusTransitionObserver;
 
         if (android.tracing.Flags.perfettoTransitionTracing()) {
             mTransitionTracer = new PerfettoTransitionTracer();
@@ -384,6 +392,8 @@
 
         mShellCommandHandler.addCommandCallback("transitions", this, this);
         mShellCommandHandler.addDumpCallback(this::dump, this);
+
+        registerObserver(mFocusTransitionObserver);
     }
 
     public boolean isRegistered() {
@@ -1026,9 +1036,14 @@
      * Gives every handler (in order) a chance to animate until one consumes the transition.
      * @return the handler which consumed the transition.
      */
-    TransitionHandler dispatchTransition(@NonNull IBinder transition, @NonNull TransitionInfo info,
-            @NonNull SurfaceControl.Transaction startT, @NonNull SurfaceControl.Transaction finishT,
-            @NonNull TransitionFinishCallback finishCB, @Nullable TransitionHandler skip) {
+    public TransitionHandler dispatchTransition(
+            @NonNull IBinder transition,
+            @NonNull TransitionInfo info,
+            @NonNull SurfaceControl.Transaction startT,
+            @NonNull SurfaceControl.Transaction finishT,
+            @NonNull TransitionFinishCallback finishCB,
+            @Nullable TransitionHandler skip
+    ) {
         for (int i = mHandlers.size() - 1; i >= 0; --i) {
             if (mHandlers.get(i) == skip) continue;
             ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " try handler %s",
@@ -1573,6 +1588,21 @@
             mMainExecutor.execute(
                     () -> mRemoteTransitionHandler.removeFiltered(remoteTransition));
         }
+
+        @Override
+        public void setFocusTransitionListener(FocusTransitionListener listener,
+                Executor executor) {
+            mMainExecutor.execute(() ->
+                    mFocusTransitionObserver.setLocalFocusTransitionListener(listener, executor));
+
+        }
+
+        @Override
+        public void unsetFocusTransitionListener(FocusTransitionListener listener) {
+            mMainExecutor.execute(() ->
+                    mFocusTransitionObserver.unsetLocalFocusTransitionListener(listener));
+
+        }
     }
 
     /**
@@ -1634,6 +1664,15 @@
         }
 
         @Override
+        public void setFocusTransitionListener(IFocusTransitionListener listener) {
+            executeRemoteCallWithTaskPermission(mTransitions, "setFocusTransitionListener",
+                    (transitions) -> {
+                        transitions.mFocusTransitionObserver.setRemoteFocusTransitionListener(
+                                transitions, listener);
+                    });
+        }
+
+        @Override
         public SurfaceControl getHomeTaskOverlayContainer() {
             SurfaceControl[] result = new SurfaceControl[1];
             executeRemoteCallWithTaskPermission(mTransitions, "getHomeTaskOverlayContainer",
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java
index f5b2340..c540ede 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java
@@ -361,7 +361,7 @@
                 final RunningTaskInfo taskInfo = mTaskOrganizer.getRunningTaskInfo(mTaskId);
                 if (!taskInfo.isFocused) {
                     final WindowContainerTransaction wct = new WindowContainerTransaction();
-                    wct.reorder(mTaskToken, true /* onTop */);
+                    wct.reorder(mTaskToken, true /* onTop */, true /* includingParents */);
                     mSyncQueue.queue(wct);
                 }
             }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java
index 05065be..839973f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java
@@ -194,6 +194,8 @@
             ActivityManager.RunningTaskInfo taskInfo,
             boolean applyStartTransactionOnDraw,
             boolean setTaskCropAndPosition,
+            boolean isStatusBarVisible,
+            boolean isKeyguardVisibleAndOccluded,
             InsetsState displayInsetsState) {
         relayoutParams.reset();
         relayoutParams.mRunningTaskInfo = taskInfo;
@@ -204,6 +206,8 @@
                 : R.dimen.freeform_decor_shadow_unfocused_thickness;
         relayoutParams.mApplyStartTransactionOnDraw = applyStartTransactionOnDraw;
         relayoutParams.mSetTaskPositionAndCrop = setTaskCropAndPosition;
+        relayoutParams.mIsCaptionVisible = taskInfo.isFreeform()
+                || (isStatusBarVisible && !isKeyguardVisibleAndOccluded);
 
         if (TaskInfoKt.isTransparentCaptionBarAppearance(taskInfo)) {
             // If the app is requesting to customize the caption bar, allow input to fall
@@ -240,7 +244,8 @@
         final WindowContainerTransaction wct = new WindowContainerTransaction();
 
         updateRelayoutParams(mRelayoutParams, taskInfo, applyStartTransactionOnDraw,
-                setTaskCropAndPosition, mDisplayController.getInsetsState(taskInfo.displayId));
+                setTaskCropAndPosition, mIsStatusBarVisible, mIsKeyguardVisibleAndOccluded,
+                mDisplayController.getInsetsState(taskInfo.displayId));
 
         relayout(mRelayoutParams, startT, finishT, wct, oldRootView, mResult);
         // After this line, mTaskInfo is up-to-date and should be used instead of taskInfo
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
index 272508f..bcf48d9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
@@ -22,9 +22,6 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
 import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
-import static android.content.Intent.ACTION_MAIN;
-import static android.content.Intent.CATEGORY_APP_BROWSER;
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static android.view.InputDevice.SOURCE_TOUCHSCREEN;
 import static android.view.MotionEvent.ACTION_CANCEL;
 import static android.view.MotionEvent.ACTION_HOVER_ENTER;
@@ -58,7 +55,6 @@
 import android.graphics.Rect;
 import android.graphics.Region;
 import android.hardware.input.InputManager;
-import android.net.Uri;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Looper;
@@ -87,6 +83,7 @@
 import android.window.flags.DesktopModeFlags;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.OptIn;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.jank.Cuj;
@@ -106,12 +103,14 @@
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.SyncTransactionQueue;
 import com.android.wm.shell.desktopmode.DesktopActivityOrientationChangeHandler;
+import com.android.wm.shell.desktopmode.DesktopRepository;
 import com.android.wm.shell.desktopmode.DesktopModeVisualIndicator;
 import com.android.wm.shell.desktopmode.DesktopTasksController;
 import com.android.wm.shell.desktopmode.DesktopTasksController.SnapPosition;
 import com.android.wm.shell.desktopmode.DesktopTasksLimiter;
 import com.android.wm.shell.desktopmode.DesktopWallpaperActivity;
 import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository;
+import com.android.wm.shell.desktopmode.education.AppHandleEducationController;
 import com.android.wm.shell.freeform.FreeformTaskTransitionStarter;
 import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
 import com.android.wm.shell.shared.annotations.ShellMainThread;
@@ -134,6 +133,8 @@
 import kotlin.Pair;
 import kotlin.Unit;
 
+import kotlinx.coroutines.ExperimentalCoroutinesApi;
+
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.List;
@@ -154,6 +155,7 @@
     private final ActivityTaskManager mActivityTaskManager;
     private final ShellCommandHandler mShellCommandHandler;
     private final ShellTaskOrganizer mTaskOrganizer;
+    private final DesktopRepository mDesktopRepository;
     private final ShellController mShellController;
     private final Context mContext;
     private final @ShellMainThread Handler mMainHandler;
@@ -167,6 +169,7 @@
     private final MultiInstanceHelper mMultiInstanceHelper;
     private final WindowDecorCaptionHandleRepository mWindowDecorCaptionHandleRepository;
     private final Optional<DesktopTasksLimiter> mDesktopTasksLimiter;
+    private final AppHandleEducationController mAppHandleEducationController;
     private final AppHeaderViewHolder.Factory mAppHeaderViewHolderFactory;
     private boolean mTransitionDragActive;
 
@@ -224,6 +227,7 @@
             ShellCommandHandler shellCommandHandler,
             IWindowManager windowManager,
             ShellTaskOrganizer taskOrganizer,
+            DesktopRepository desktopRepository,
             DisplayController displayController,
             ShellController shellController,
             DisplayInsetsController displayInsetsController,
@@ -236,6 +240,7 @@
             AssistContentRequester assistContentRequester,
             MultiInstanceHelper multiInstanceHelper,
             Optional<DesktopTasksLimiter> desktopTasksLimiter,
+            AppHandleEducationController appHandleEducationController,
             WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository,
             Optional<DesktopActivityOrientationChangeHandler> activityOrientationChangeHandler) {
         this(
@@ -248,6 +253,7 @@
                 shellCommandHandler,
                 windowManager,
                 taskOrganizer,
+                desktopRepository,
                 displayController,
                 shellController,
                 displayInsetsController,
@@ -265,6 +271,7 @@
                 new SparseArray<>(),
                 interactionJankMonitor,
                 desktopTasksLimiter,
+                appHandleEducationController,
                 windowDecorCaptionHandleRepository,
                 activityOrientationChangeHandler,
                 new TaskPositionerFactory());
@@ -281,6 +288,7 @@
             ShellCommandHandler shellCommandHandler,
             IWindowManager windowManager,
             ShellTaskOrganizer taskOrganizer,
+            DesktopRepository desktopRepository,
             DisplayController displayController,
             ShellController shellController,
             DisplayInsetsController displayInsetsController,
@@ -298,6 +306,7 @@
             SparseArray<DesktopModeWindowDecoration> windowDecorByTaskId,
             InteractionJankMonitor interactionJankMonitor,
             Optional<DesktopTasksLimiter> desktopTasksLimiter,
+            AppHandleEducationController appHandleEducationController,
             WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository,
             Optional<DesktopActivityOrientationChangeHandler> activityOrientationChangeHandler,
             TaskPositionerFactory taskPositionerFactory) {
@@ -308,6 +317,7 @@
         mBgExecutor = bgExecutor;
         mActivityTaskManager = mContext.getSystemService(ActivityTaskManager.class);
         mTaskOrganizer = taskOrganizer;
+        mDesktopRepository = desktopRepository;
         mShellController = shellController;
         mDisplayController = displayController;
         mDisplayInsetsController = displayInsetsController;
@@ -329,6 +339,7 @@
                 com.android.internal.R.string.config_systemUi);
         mInteractionJankMonitor = interactionJankMonitor;
         mDesktopTasksLimiter = desktopTasksLimiter;
+        mAppHandleEducationController = appHandleEducationController;
         mWindowDecorCaptionHandleRepository = windowDecorCaptionHandleRepository;
         mActivityOrientationChangeHandler = activityOrientationChangeHandler;
         mAssistContentRequester = assistContentRequester;
@@ -362,6 +373,7 @@
         shellInit.addInitCallback(this::onInit, this);
     }
 
+    @OptIn(markerClass = ExperimentalCoroutinesApi.class)
     private void onInit() {
         mShellController.addKeyguardChangeListener(mDesktopModeKeyguardChangeListener);
         mShellCommandHandler.addDumpCallback(this::dump, this);
@@ -378,6 +390,18 @@
         } catch (RemoteException e) {
             Log.e(TAG, "Failed to register window manager callbacks", e);
         }
+        if (DesktopModeStatus.canEnterDesktopMode(mContext)
+                && Flags.enableDesktopWindowingAppHandleEducation()) {
+            mAppHandleEducationController.setAppHandleEducationTooltipCallbacks(
+                    /* appHandleTooltipClickCallback= */(taskId) -> {
+                        openHandleMenu(taskId);
+                        return Unit.INSTANCE;
+                    },
+                    /* onToDesktopClickCallback= */(taskId, desktopModeTransitionSource) -> {
+                        onToDesktop(taskId, desktopModeTransitionSource);
+                        return Unit.INSTANCE;
+                    });
+        }
     }
 
     @Override
@@ -495,6 +519,12 @@
         mWindowDecorByTaskId.remove(taskInfo.taskId);
     }
 
+    private void openHandleMenu(int taskId) {
+        final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId);
+        decoration.createHandleMenu(checkNumberOfOtherInstances(decoration.mTaskInfo)
+                >= MANAGE_WINDOWS_MINIMUM_INSTANCES);
+    }
+
     private void onMaximizeOrRestore(int taskId, String source) {
         final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId);
         if (decoration == null) {
@@ -508,6 +538,14 @@
         decoration.closeMaximizeMenu();
     }
 
+    private void onEnterOrExitImmersive(int taskId) {
+        final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId);
+        if (decoration == null) {
+            return;
+        }
+        mDesktopTasksController.toggleDesktopTaskFullImmersiveState(decoration.mTaskInfo);
+    }
+
     private void onSnapResize(int taskId, boolean left) {
         final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId);
         if (decoration == null) {
@@ -532,20 +570,17 @@
         decoration.closeMaximizeMenu();
     }
 
-    private void onOpenInBrowser(int taskId, @NonNull Uri uri) {
+    private void onOpenInBrowser(int taskId, @NonNull Intent intent) {
         final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId);
         if (decoration == null) {
             return;
         }
-        openInBrowser(uri, decoration.getUser());
+        openInBrowser(intent, decoration.getUser());
         decoration.closeHandleMenu();
         decoration.closeMaximizeMenu();
     }
 
-    private void openInBrowser(Uri uri, @NonNull UserHandle userHandle) {
-        final Intent intent = Intent.makeMainSelectorActivity(ACTION_MAIN, CATEGORY_APP_BROWSER)
-                .setData(uri)
-                .addFlags(FLAG_ACTIVITY_NEW_TASK);
+    private void openInBrowser(@NonNull Intent intent, @NonNull UserHandle userHandle) {
         mContext.startActivityAsUser(intent, userHandle);
     }
 
@@ -720,8 +755,7 @@
             } else if (id == R.id.caption_handle || id == R.id.open_menu_button) {
                 if (!decoration.isHandleMenuActive()) {
                     moveTaskToFront(decoration.mTaskInfo);
-                    decoration.createHandleMenu(checkNumberOfOtherInstances(decoration.mTaskInfo)
-                                    >= MANAGE_WINDOWS_MINIMUM_INSTANCES);
+                    openHandleMenu(mTaskId);
                 }
             } else if (id == R.id.maximize_window) {
                 // TODO(b/346441962): move click detection logic into the decor's
@@ -729,7 +763,16 @@
                 //  back to the decoration using
                 //  {@link DesktopModeWindowDecoration#setOnMaximizeOrRestoreClickListener}, which
                 //  should shared with the maximize menu's maximize/restore actions.
-                onMaximizeOrRestore(decoration.mTaskInfo.taskId, "caption_bar_button");
+                if (Flags.enableFullyImmersiveInDesktop()
+                        && TaskInfoKt.getRequestingImmersive(decoration.mTaskInfo)) {
+                    // Task is requesting immersive, so it should either enter or exit immersive,
+                    // depending on immersive state.
+                    onEnterOrExitImmersive(decoration.mTaskInfo.taskId);
+                } else {
+                    // Full immersive is disabled or task doesn't request/support it, so just
+                    // toggle between maximize/restore states.
+                    onMaximizeOrRestore(decoration.mTaskInfo.taskId, "caption_bar_button");
+                }
             } else if (id == R.id.minimize_window) {
                 final WindowContainerTransaction wct = new WindowContainerTransaction();
                 mDesktopTasksController.onDesktopWindowMinimize(wct, mTaskId);
@@ -909,14 +952,18 @@
             }
             final boolean touchingButton = (id == R.id.close_window || id == R.id.maximize_window
                     || id == R.id.open_menu_button || id == R.id.minimize_window);
+            final boolean dragAllowed =
+                    !mDesktopRepository.isTaskInFullImmersiveState(taskInfo.taskId);
             switch (e.getActionMasked()) {
                 case MotionEvent.ACTION_DOWN: {
-                    mDragPointerId = e.getPointerId(0);
-                    final Rect initialBounds = mDragPositioningCallback.onDragPositioningStart(
-                            0 /* ctrlType */, e.getRawX(0),
-                            e.getRawY(0));
-                    updateDragStatus(e.getActionMasked());
-                    mOnDragStartInitialBounds.set(initialBounds);
+                    if (dragAllowed) {
+                        mDragPointerId = e.getPointerId(0);
+                        final Rect initialBounds = mDragPositioningCallback.onDragPositioningStart(
+                                0 /* ctrlType */, e.getRawX(0),
+                                e.getRawY(0));
+                        updateDragStatus(e.getActionMasked());
+                        mOnDragStartInitialBounds.set(initialBounds);
+                    }
                     mHasLongClicked = false;
                     // Do not consume input event if a button is touched, otherwise it would
                     // prevent the button's ripple effect from showing.
@@ -925,6 +972,9 @@
                 case ACTION_MOVE: {
                     // If a decor's resize drag zone is active, don't also try to reposition it.
                     if (decoration.isHandlingDragResize()) break;
+                    // Dragging the header isn't allowed, so skip the positioning work.
+                    if (!dragAllowed) break;
+
                     decoration.closeMaximizeMenu();
                     if (e.findPointerIndex(mDragPointerId) == -1) {
                         mDragPointerId = e.getPointerId(0);
@@ -1010,6 +1060,10 @@
                     && action != MotionEvent.ACTION_CANCEL)) {
                 return false;
             }
+            if (mDesktopRepository.isTaskInFullImmersiveState(mTaskId)) {
+                // Disallow double-tap to resize when in full immersive.
+                return false;
+            }
             onMaximizeOrRestore(mTaskId, "double_tap");
             return true;
         }
@@ -1394,6 +1448,7 @@
                         mContext.createContextAsUser(UserHandle.of(taskInfo.userId), 0 /* flags */),
                         mDisplayController,
                         mSplitScreenController,
+                        mDesktopRepository,
                         mTaskOrganizer,
                         taskInfo,
                         taskSurface,
@@ -1445,8 +1500,8 @@
             onToSplitScreen(taskInfo.taskId);
             return Unit.INSTANCE;
         });
-        windowDecoration.setOpenInBrowserClickListener((uri) -> {
-            onOpenInBrowser(taskInfo.taskId, uri);
+        windowDecoration.setOpenInBrowserClickListener((intent) -> {
+            onOpenInBrowser(taskInfo.taskId, intent);
         });
         windowDecoration.setOnNewWindowClickListener(() -> {
             onNewWindow(taskInfo.taskId);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
index 8a53f5b..25d37fc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
@@ -44,12 +44,14 @@
 import android.app.assist.AssistContent;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.graphics.Insets;
 import android.graphics.Point;
 import android.graphics.PointF;
 import android.graphics.Rect;
@@ -62,10 +64,12 @@
 import android.util.Size;
 import android.util.Slog;
 import android.view.Choreographer;
+import android.view.InsetsState;
 import android.view.MotionEvent;
 import android.view.SurfaceControl;
 import android.view.View;
 import android.view.ViewConfiguration;
+import android.view.WindowInsets;
 import android.view.WindowManager;
 import android.widget.ImageButton;
 import android.window.TaskSnapshot;
@@ -83,12 +87,14 @@
 import com.android.wm.shell.apptoweb.AppToWebGenericLinksParser;
 import com.android.wm.shell.apptoweb.AppToWebUtils;
 import com.android.wm.shell.apptoweb.AssistContentRequester;
+import com.android.wm.shell.apptoweb.OpenByDefaultDialog;
 import com.android.wm.shell.common.DisplayController;
 import com.android.wm.shell.common.DisplayLayout;
 import com.android.wm.shell.common.MultiInstanceHelper;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.SyncTransactionQueue;
 import com.android.wm.shell.desktopmode.CaptionState;
+import com.android.wm.shell.desktopmode.DesktopRepository;
 import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository;
 import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
@@ -158,6 +164,8 @@
 
     private MaximizeMenu mMaximizeMenu;
 
+    private OpenByDefaultDialog mOpenByDefaultDialog;
+
     private ResizeVeil mResizeVeil;
     private Bitmap mAppIconBitmap;
     private Bitmap mResizeVeilBitmap;
@@ -166,7 +174,7 @@
     private CapturedLink mCapturedLink;
     private Uri mGenericLink;
     private Uri mWebUri;
-    private Consumer<Uri> mOpenInBrowserClickListener;
+    private Consumer<Intent> mOpenInBrowserClickListener;
 
     private ExclusionRegionListener mExclusionRegionListener;
 
@@ -188,12 +196,14 @@
     private final Runnable mCapturedLinkExpiredRunnable = this::onCapturedLinkExpired;
     private final MultiInstanceHelper mMultiInstanceHelper;
     private final WindowDecorCaptionHandleRepository mWindowDecorCaptionHandleRepository;
+    private final DesktopRepository mDesktopRepository;
 
     DesktopModeWindowDecoration(
             Context context,
             @NonNull Context userContext,
             DisplayController displayController,
             SplitScreenController splitScreenController,
+            DesktopRepository desktopRepository,
             ShellTaskOrganizer taskOrganizer,
             ActivityManager.RunningTaskInfo taskInfo,
             SurfaceControl taskSurface,
@@ -207,8 +217,8 @@
             AssistContentRequester assistContentRequester,
             MultiInstanceHelper multiInstanceHelper,
             WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository) {
-        this (context, userContext, displayController, splitScreenController, taskOrganizer,
-                taskInfo, taskSurface, handler, bgExecutor, choreographer, syncQueue,
+        this (context, userContext, displayController, splitScreenController, desktopRepository,
+                taskOrganizer, taskInfo, taskSurface, handler, bgExecutor, choreographer, syncQueue,
                 appHeaderViewHolderFactory, rootTaskDisplayAreaOrganizer, genericLinksParser,
                 assistContentRequester,
                 SurfaceControl.Builder::new, SurfaceControl.Transaction::new,
@@ -225,6 +235,7 @@
             @NonNull Context userContext,
             DisplayController displayController,
             SplitScreenController splitScreenController,
+            DesktopRepository desktopRepository,
             ShellTaskOrganizer taskOrganizer,
             ActivityManager.RunningTaskInfo taskInfo,
             SurfaceControl taskSurface,
@@ -264,6 +275,7 @@
         mMultiInstanceHelper = multiInstanceHelper;
         mWindowManagerWrapper = windowManagerWrapper;
         mWindowDecorCaptionHandleRepository = windowDecorCaptionHandleRepository;
+        mDesktopRepository = desktopRepository;
     }
 
     /**
@@ -335,7 +347,7 @@
         mDragPositioningCallback = dragPositioningCallback;
     }
 
-    void setOpenInBrowserClickListener(Consumer<Uri> listener) {
+    void setOpenInBrowserClickListener(Consumer<Intent> listener) {
         mOpenInBrowserClickListener = listener;
     }
 
@@ -439,8 +451,15 @@
             mHandleMenu.relayout(startT, mResult.mCaptionX);
         }
 
+        if (isOpenByDefaultDialogActive()) {
+            mOpenByDefaultDialog.relayout(taskInfo);
+        }
+
+        final boolean inFullImmersive = mDesktopRepository
+                .isTaskInFullImmersiveState(taskInfo.taskId);
         updateRelayoutParams(mRelayoutParams, mContext, taskInfo, applyStartTransactionOnDraw,
-                shouldSetTaskPositionAndCrop);
+                shouldSetTaskPositionAndCrop, mIsStatusBarVisible, mIsKeyguardVisibleAndOccluded,
+                inFullImmersive, mDisplayController.getInsetsState(taskInfo.displayId));
 
         final WindowDecorLinearLayout oldRootView = mResult.mRootView;
         final SurfaceControl oldDecorationSurface = mDecorationContainerSurface;
@@ -461,6 +480,7 @@
             if (canEnterDesktopMode(mContext) && Flags.enableDesktopWindowingAppHandleEducation()) {
                 notifyNoCaptionHandle();
             }
+            mExclusionRegionListener.onExclusionRegionDismissed(mTaskInfo.taskId);
             disposeStatusBarInputLayer();
             Trace.endSection(); // DesktopModeWindowDecoration#updateRelayoutParamsAndSurfaces
             return;
@@ -479,11 +499,17 @@
         if (canEnterDesktopMode(mContext) && Flags.enableDesktopWindowingAppHandleEducation()) {
             notifyCaptionStateChanged();
         }
-        mWindowDecorViewHolder.bindData(mTaskInfo,
-                position,
-                mResult.mCaptionWidth,
-                mResult.mCaptionHeight,
-                isCaptionVisible());
+
+        if (isAppHandle(mWindowDecorViewHolder)) {
+            mWindowDecorViewHolder.bindData(new AppHandleViewHolder.HandleData(
+                    mTaskInfo, position, mResult.mCaptionWidth, mResult.mCaptionHeight,
+                    isCaptionVisible()
+            ));
+        } else {
+            mWindowDecorViewHolder.bindData(new AppHeaderViewHolder.HeaderData(
+                    mTaskInfo, TaskInfoKt.getRequestingImmersive(mTaskInfo), inFullImmersive
+            ));
+        }
         Trace.endSection();
 
         if (!mTaskInfo.isFocused) {
@@ -491,8 +517,8 @@
             closeManageWindowsMenu();
             closeMaximizeMenu();
         }
-        updateDragResizeListener(oldDecorationSurface);
-        updateMaximizeMenu(startT);
+        updateDragResizeListener(oldDecorationSurface, inFullImmersive);
+        updateMaximizeMenu(startT, inFullImmersive);
         Trace.endSection(); // DesktopModeWindowDecoration#updateRelayoutParamsAndSurfaces
     }
 
@@ -517,32 +543,40 @@
     }
 
     @Nullable
-    private Uri getBrowserLink() {
+    private Intent getBrowserLink() {
         // Do not show browser link in browser applications
         final ComponentName baseActivity = mTaskInfo.baseActivity;
         if (baseActivity != null && AppToWebUtils.isBrowserApp(mContext,
                 baseActivity.getPackageName(), mUserContext.getUserId())) {
             return null;
         }
+
+        final Uri browserLink;
         // If the captured link is available and has not expired, return the captured link.
         // Otherwise, return the generic link which is set to null if a generic link is unavailable.
         if (mCapturedLink != null && !mCapturedLink.mExpired) {
-            return mCapturedLink.mUri;
+            browserLink = mCapturedLink.mUri;
         } else if (mWebUri != null) {
-            return mWebUri;
+            browserLink = mWebUri;
+        } else {
+            browserLink = mGenericLink;
         }
-        return mGenericLink;
+
+        if (browserLink == null) return null;
+        return AppToWebUtils.getBrowserIntent(browserLink, mContext.getPackageManager());
+
     }
 
     UserHandle getUser() {
         return mUserContext.getUser();
     }
 
-    private void updateDragResizeListener(SurfaceControl oldDecorationSurface) {
-        if (!isDragResizable(mTaskInfo)) {
+    private void updateDragResizeListener(SurfaceControl oldDecorationSurface,
+            boolean inFullImmersive) {
+        if (!isDragResizable(mTaskInfo, inFullImmersive)) {
             if (!mTaskInfo.positionInParent.equals(mPositionInParent)) {
                 // We still want to track caption bar's exclusion region on a non-resizeable task.
-                updateExclusionRegion();
+                updateExclusionRegion(inFullImmersive);
             }
             closeDragResizeListener();
             return;
@@ -576,11 +610,16 @@
                         getResizeEdgeHandleSize(res), getResizeHandleEdgeInset(res),
                         getFineResizeCornerSize(res), getLargeResizeCornerSize(res)), touchSlop)
                 || !mTaskInfo.positionInParent.equals(mPositionInParent)) {
-            updateExclusionRegion();
+            updateExclusionRegion(inFullImmersive);
         }
     }
 
-    private static boolean isDragResizable(ActivityManager.RunningTaskInfo taskInfo) {
+    private static boolean isDragResizable(ActivityManager.RunningTaskInfo taskInfo,
+            boolean inFullImmersive) {
+        if (inFullImmersive) {
+            // Task cannot be resized in full immersive.
+            return false;
+        }
         if (DesktopModeFlags.ENABLE_WINDOWING_SCALED_RESIZING.isTrue()) {
             return taskInfo.isFreeform();
         }
@@ -644,8 +683,8 @@
         mWindowDecorCaptionHandleRepository.notifyCaptionChanged(captionState);
     }
 
-    private void updateMaximizeMenu(SurfaceControl.Transaction startT) {
-        if (!isDragResizable(mTaskInfo) || !isMaximizeMenuActive()) {
+    private void updateMaximizeMenu(SurfaceControl.Transaction startT, boolean inFullImmersive) {
+        if (!isDragResizable(mTaskInfo, inFullImmersive) || !isMaximizeMenuActive()) {
             return;
         }
         if (!mTaskInfo.isVisible()) {
@@ -737,7 +776,11 @@
             Context context,
             ActivityManager.RunningTaskInfo taskInfo,
             boolean applyStartTransactionOnDraw,
-            boolean shouldSetTaskPositionAndCrop) {
+            boolean shouldSetTaskPositionAndCrop,
+            boolean isStatusBarVisible,
+            boolean isKeyguardVisibleAndOccluded,
+            boolean inFullImmersiveMode,
+            @NonNull InsetsState displayInsetsState) {
         final int captionLayoutId = getDesktopModeWindowDecorLayoutId(taskInfo.getWindowingMode());
         final boolean isAppHeader =
                 captionLayoutId == R.layout.desktop_mode_app_header;
@@ -748,6 +791,28 @@
         relayoutParams.mCaptionHeightId = getCaptionHeightIdStatic(taskInfo.getWindowingMode());
         relayoutParams.mCaptionWidthId = getCaptionWidthId(relayoutParams.mLayoutResId);
 
+        final boolean showCaption;
+        if (Flags.enableFullyImmersiveInDesktop()) {
+            if (inFullImmersiveMode) {
+                showCaption = isStatusBarVisible && !isKeyguardVisibleAndOccluded;
+            } else {
+                showCaption = taskInfo.isFreeform()
+                        || (isStatusBarVisible && !isKeyguardVisibleAndOccluded);
+            }
+        } else {
+            // Caption should always be visible in freeform mode. When not in freeform,
+            // align with the status bar except when showing over keyguard (where it should not
+            // shown).
+            //  TODO(b/356405803): Investigate how it's possible for the status bar visibility to
+            //   be false while a freeform window is open if the status bar is always
+            //   forcibly-shown. It may be that the InsetsState (from which |mIsStatusBarVisible|
+            //   is set) still contains an invisible insets source in immersive cases even if the
+            //   status bar is shown?
+            showCaption = taskInfo.isFreeform()
+                    || (isStatusBarVisible && !isKeyguardVisibleAndOccluded);
+        }
+        relayoutParams.mIsCaptionVisible = showCaption;
+
         if (isAppHeader) {
             if (TaskInfoKt.isTransparentCaptionBarAppearance(taskInfo)) {
                 // If the app is requesting to customize the caption bar, allow input to fall
@@ -766,6 +831,14 @@
                 // including non-immersive apps that just don't handle caption insets properly.
                 relayoutParams.mInsetSourceFlags |= FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR;
             }
+            if (Flags.enableFullyImmersiveInDesktop() && inFullImmersiveMode) {
+                final Insets systemBarInsets = displayInsetsState.calculateInsets(
+                        taskInfo.getConfiguration().windowConfiguration.getBounds(),
+                        WindowInsets.Type.systemBars() & ~WindowInsets.Type.captionBar(),
+                        false /* ignoreVisibility */);
+                relayoutParams.mCaptionTopPadding = systemBarInsets.top;
+                relayoutParams.mIsInsetSource = false;
+            }
             // Report occluding elements as bounding rects to the insets system so that apps can
             // draw in the empty space in the center:
             //   First, the "app chip" section of the caption bar (+ some extra margins).
@@ -880,6 +953,33 @@
         return mHandleMenu != null;
     }
 
+    boolean isOpenByDefaultDialogActive() {
+        return mOpenByDefaultDialog != null;
+    }
+
+    void createOpenByDefaultDialog() {
+        mOpenByDefaultDialog = new OpenByDefaultDialog(
+                mContext,
+                mTaskInfo,
+                mTaskSurface,
+                mDisplayController,
+                mSurfaceControlTransactionSupplier,
+                new OpenByDefaultDialog.DialogLifecycleListener() {
+                    @Override
+                    public void onDialogCreated() {
+                        closeHandleMenu();
+                    }
+
+                    @Override
+                    public void onDialogDismissed() {
+                        mOpenByDefaultDialog = null;
+                    }
+                },
+                mAppIconBitmap,
+                mAppName
+        );
+    }
+
     boolean shouldResizeListenerHandleEvent(@NonNull MotionEvent e, @NonNull Point offset) {
         return mDragResizeListener != null && mDragResizeListener.shouldHandleEvent(e, offset);
     }
@@ -1048,7 +1148,7 @@
     }
 
     /**
-     * Determine the highest y coordinate of a freeform task. Used for restricting drag inputs.
+     * Determine the highest y coordinate of a freeform task. Used for restricting drag inputs.fmdra
      */
     private int determineMaxY(int requiredEmptySpace, Rect stableBounds) {
         return stableBounds.bottom - requiredEmptySpace;
@@ -1171,11 +1271,17 @@
                 /* onToSplitScreenClickListener= */ mOnToSplitscreenClickListener,
                 /* onNewWindowClickListener= */ mOnNewWindowClickListener,
                 /* onManageWindowsClickListener= */ mOnManageWindowsClickListener,
-                /* openInBrowserClickListener= */ (uri) -> {
-                    mOpenInBrowserClickListener.accept(uri);
+                /* openInBrowserClickListener= */ (intent) -> {
+                    mOpenInBrowserClickListener.accept(intent);
                     onCapturedLinkExpired();
                     return Unit.INSTANCE;
                 },
+                /* onOpenByDefaultClickListener= */ () -> {
+                    if (!isOpenByDefaultDialogActive()) {
+                        createOpenByDefaultDialog();
+                    }
+                    return Unit.INSTANCE;
+                },
                 /* onCloseMenuClickListener= */ () -> {
                     closeHandleMenu();
                     return Unit.INSTANCE;
@@ -1446,24 +1552,29 @@
         mPositionInParent.set(mTaskInfo.positionInParent);
     }
 
-    private void updateExclusionRegion() {
+    private void updateExclusionRegion(boolean inFullImmersive) {
         // An outdated position in parent is one reason for this to be called; update it here.
         updatePositionInParent();
         mExclusionRegionListener
-                .onExclusionRegionChanged(mTaskInfo.taskId, getGlobalExclusionRegion());
+                .onExclusionRegionChanged(mTaskInfo.taskId,
+                        getGlobalExclusionRegion(inFullImmersive));
     }
 
     /**
      * Create a new exclusion region from the corner rects (if resizeable) and caption bounds
      * of this task.
      */
-    private Region getGlobalExclusionRegion() {
+    private Region getGlobalExclusionRegion(boolean inFullImmersive) {
         Region exclusionRegion;
-        if (mDragResizeListener != null && isDragResizable(mTaskInfo)) {
+        if (mDragResizeListener != null && isDragResizable(mTaskInfo, inFullImmersive)) {
             exclusionRegion = mDragResizeListener.getCornersRegion();
         } else {
             exclusionRegion = new Region();
         }
+        if (inFullImmersive) {
+            // Task can't be moved in full immersive, so skip excluding the caption region.
+            return exclusionRegion;
+        }
         exclusionRegion.union(new Rect(0, 0, mResult.mWidth,
                 getCaptionHeight(mTaskInfo.getWindowingMode())));
         exclusionRegion.translate(mPositionInParent.x, mPositionInParent.y);
@@ -1531,6 +1642,7 @@
                 @NonNull Context userContext,
                 DisplayController displayController,
                 SplitScreenController splitScreenController,
+                DesktopRepository desktopRepository,
                 ShellTaskOrganizer taskOrganizer,
                 ActivityManager.RunningTaskInfo taskInfo,
                 SurfaceControl taskSurface,
@@ -1549,6 +1661,7 @@
                     userContext,
                     displayController,
                     splitScreenController,
+                    desktopRepository,
                     taskOrganizer,
                     taskInfo,
                     taskSurface,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java
index 3853f1f..f4c7fe3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java
@@ -95,7 +95,8 @@
         mDragStartListener.onDragStart(mWindowDecoration.mTaskInfo.taskId);
         if (mCtrlType != CTRL_TYPE_UNDEFINED && !mWindowDecoration.mTaskInfo.isFocused) {
             WindowContainerTransaction wct = new WindowContainerTransaction();
-            wct.reorder(mWindowDecoration.mTaskInfo.token, true);
+            wct.reorder(mWindowDecoration.mTaskInfo.token, true /* onTop */,
+                    true /* includingParents */);
             mTaskOrganizer.applyTransaction(wct);
         }
         mRepositionTaskBounds.set(mTaskBoundsAtDragStart);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt
index 9a5b4f5..2e32703 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt
@@ -20,13 +20,13 @@
 import android.annotation.SuppressLint
 import android.app.ActivityManager.RunningTaskInfo
 import android.content.Context
+import android.content.Intent
 import android.content.res.ColorStateList
 import android.content.res.Resources
 import android.graphics.Bitmap
 import android.graphics.Point
 import android.graphics.PointF
 import android.graphics.Rect
-import android.net.Uri
 import android.view.LayoutInflater
 import android.view.MotionEvent
 import android.view.MotionEvent.ACTION_OUTSIDE
@@ -70,7 +70,7 @@
     private val shouldShowWindowingPill: Boolean,
     private val shouldShowNewWindowButton: Boolean,
     private val shouldShowManageWindowsButton: Boolean,
-    private val openInBrowserLink: Uri?,
+    private val openInBrowserIntent: Intent?,
     private val captionWidth: Int,
     private val captionHeight: Int,
     captionX: Int
@@ -107,7 +107,7 @@
     private val globalMenuPosition: Point = Point()
 
     private val shouldShowBrowserPill: Boolean
-        get() = openInBrowserLink != null
+        get() = openInBrowserIntent != null
 
     init {
         updateHandleMenuPillPositions(captionX)
@@ -119,7 +119,8 @@
         onToSplitScreenClickListener: () -> Unit,
         onNewWindowClickListener: () -> Unit,
         onManageWindowsClickListener: () -> Unit,
-        openInBrowserClickListener: (Uri) -> Unit,
+        openInBrowserClickListener: (Intent) -> Unit,
+        onOpenByDefaultClickListener: () -> Unit,
         onCloseMenuClickListener: () -> Unit,
         onOutsideTouchListener: () -> Unit,
     ) {
@@ -135,6 +136,7 @@
             onNewWindowClickListener = onNewWindowClickListener,
             onManageWindowsClickListener = onManageWindowsClickListener,
             openInBrowserClickListener = openInBrowserClickListener,
+            onOpenByDefaultClickListener = onOpenByDefaultClickListener,
             onCloseMenuClickListener = onCloseMenuClickListener,
             onOutsideTouchListener = onOutsideTouchListener,
         )
@@ -152,7 +154,8 @@
         onToSplitScreenClickListener: () -> Unit,
         onNewWindowClickListener: () -> Unit,
         onManageWindowsClickListener: () -> Unit,
-        openInBrowserClickListener: (Uri) -> Unit,
+        openInBrowserClickListener: (Intent) -> Unit,
+        onOpenByDefaultClickListener: () -> Unit,
         onCloseMenuClickListener: () -> Unit,
         onOutsideTouchListener: () -> Unit
     ) {
@@ -172,8 +175,9 @@
             this.onNewWindowClickListener = onNewWindowClickListener
             this.onManageWindowsClickListener = onManageWindowsClickListener
             this.onOpenInBrowserClickListener = {
-                openInBrowserClickListener.invoke(openInBrowserLink!!)
+                openInBrowserClickListener.invoke(openInBrowserIntent!!)
             }
+            this.onOpenByDefaultClickListener = onOpenByDefaultClickListener
             this.onCloseMenuClickListener = onCloseMenuClickListener
             this.onOutsideTouchListener = onOutsideTouchListener
         }
@@ -448,7 +452,8 @@
         private val openInBrowserPill = rootView.requireViewById<View>(R.id.open_in_browser_pill)
         private val browserBtn = openInBrowserPill.requireViewById<Button>(
             R.id.open_in_browser_button)
-
+        private val openByDefaultBtn = openInBrowserPill.requireViewById<ImageButton>(
+            R.id.open_by_default_button)
         private val decorThemeUtil = DecorThemeUtil(context)
         private val animator = HandleMenuAnimator(rootView, menuWidth, captionHeight.toFloat())
 
@@ -461,6 +466,7 @@
         var onNewWindowClickListener: (() -> Unit)? = null
         var onManageWindowsClickListener: (() -> Unit)? = null
         var onOpenInBrowserClickListener: (() -> Unit)? = null
+        var onOpenByDefaultClickListener: (() -> Unit)? = null
         var onCloseMenuClickListener: (() -> Unit)? = null
         var onOutsideTouchListener: (() -> Unit)? = null
 
@@ -469,6 +475,9 @@
             splitscreenBtn.setOnClickListener { onToSplitScreenClickListener?.invoke() }
             desktopBtn.setOnClickListener { onToDesktopClickListener?.invoke() }
             browserBtn.setOnClickListener { onOpenInBrowserClickListener?.invoke() }
+            openByDefaultBtn.setOnClickListener {
+                onOpenByDefaultClickListener?.invoke()
+            }
             collapseMenuButton.setOnClickListener { onCloseMenuClickListener?.invoke() }
             newWindowBtn.setOnClickListener { onNewWindowClickListener?.invoke() }
             manageWindowBtn.setOnClickListener { onManageWindowsClickListener?.invoke() }
@@ -634,6 +643,8 @@
                 setTextColor(style.textColor)
                 compoundDrawableTintList = ColorStateList.valueOf(style.textColor)
             }
+
+            openByDefaultBtn.imageTintList = ColorStateList.valueOf(style.textColor)
         }
 
         private data class MenuStyle(
@@ -661,7 +672,7 @@
         shouldShowWindowingPill: Boolean,
         shouldShowNewWindowButton: Boolean,
         shouldShowManageWindowsButton: Boolean,
-        openInBrowserLink: Uri?,
+        openInBrowserIntent: Intent?,
         captionWidth: Int,
         captionHeight: Int,
         captionX: Int
@@ -680,7 +691,7 @@
         shouldShowWindowingPill: Boolean,
         shouldShowNewWindowButton: Boolean,
         shouldShowManageWindowsButton: Boolean,
-        openInBrowserLink: Uri?,
+        openInBrowserIntent: Intent?,
         captionWidth: Int,
         captionHeight: Int,
         captionX: Int
@@ -695,7 +706,7 @@
             shouldShowWindowingPill,
             shouldShowNewWindowButton,
             shouldShowManageWindowsButton,
-            openInBrowserLink,
+            openInBrowserIntent,
             captionWidth,
             captionHeight,
             captionX
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeButtonView.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeButtonView.kt
index 2d97dc0..68a58ee0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeButtonView.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeButtonView.kt
@@ -18,6 +18,7 @@
 import android.animation.AnimatorSet
 import android.animation.ObjectAnimator
 import android.animation.ValueAnimator
+import android.annotation.DrawableRes
 import android.content.Context
 import android.content.res.ColorStateList
 import android.graphics.Color
@@ -132,6 +133,11 @@
         }
     }
 
+    /** Set the drawable resource to use for the maximize button. */
+    fun setIcon(@DrawableRes icon: Int) {
+        maximizeWindow.setImageResource(icon)
+    }
+
     companion object {
         private const val OPACITY_15 = 38
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java
index 6eb5cca..a1f76d2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java
@@ -108,7 +108,8 @@
                     mDesktopWindowDecoration.mContext, mHandler, CUJ_DESKTOP_MODE_RESIZE_WINDOW);
             if (!mDesktopWindowDecoration.mTaskInfo.isFocused) {
                 WindowContainerTransaction wct = new WindowContainerTransaction();
-                wct.reorder(mDesktopWindowDecoration.mTaskInfo.token, true);
+                wct.reorder(mDesktopWindowDecoration.mTaskInfo.token, true /* onTop */,
+                        true /* includingParents */);
                 mTaskOrganizer.applyTransaction(wct);
             }
         }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java
index c1a55b4..f8aed41 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java
@@ -144,8 +144,8 @@
     TaskDragResizer mTaskDragResizer;
     boolean mIsCaptionVisible;
 
-    private boolean mIsStatusBarVisible;
-    private boolean mIsKeyguardVisibleAndOccluded;
+    boolean mIsStatusBarVisible;
+    boolean mIsKeyguardVisibleAndOccluded;
 
     /** The most recent set of insets applied to this window decoration. */
     private WindowDecorationInsets mWindowDecorationInsets;
@@ -241,7 +241,7 @@
         }
         rootView = null; // Clear it just in case we use it accidentally
 
-        updateCaptionVisibility(outResult.mRootView);
+        updateCaptionVisibility(outResult.mRootView, params);
 
         final Rect taskBounds = mTaskInfo.getConfiguration().windowConfiguration.getBounds();
         outResult.mWidth = taskBounds.width();
@@ -346,7 +346,7 @@
 
     private void updateCaptionInsets(RelayoutParams params, WindowContainerTransaction wct,
             RelayoutResult<T> outResult, Rect taskBounds) {
-        if (!mIsCaptionVisible) {
+        if (!mIsCaptionVisible || !params.mIsInsetSource) {
             if (mWindowDecorationInsets != null) {
                 mWindowDecorationInsets.remove(wct);
                 mWindowDecorationInsets = null;
@@ -527,17 +527,10 @@
     }
 
     /**
-     * Checks if task has entered/exited immersive mode and requires a change in caption visibility.
+     * Update caption visibility state and views.
      */
-    private void updateCaptionVisibility(View rootView) {
-        // Caption should always be visible in freeform mode. When not in freeform, align with the
-        // status bar except when showing over keyguard (where it should not shown).
-        //  TODO(b/356405803): Investigate how it's possible for the status bar visibility to be
-        //   false while a freeform window is open if the status bar is always forcibly-shown. It
-        //   may be that the InsetsState (from which |mIsStatusBarVisible| is set) still contains
-        //   an invisible insets source in immersive cases even if the status bar is shown?
-        mIsCaptionVisible = mTaskInfo.isFreeform()
-                || (mIsStatusBarVisible && !mIsKeyguardVisibleAndOccluded);
+    private void updateCaptionVisibility(View rootView, @NonNull RelayoutParams params) {
+        mIsCaptionVisible = params.mIsCaptionVisible;
         setCaptionVisibility(rootView, mIsCaptionVisible);
     }
 
@@ -731,12 +724,14 @@
         int mCaptionWidthId;
         final List<OccludingCaptionElement> mOccludingCaptionElements = new ArrayList<>();
         int mInputFeatures;
+        boolean mIsInsetSource = true;
         @InsetsSource.Flags int mInsetSourceFlags;
 
         int mShadowRadiusId;
         int mCornerRadius;
 
         int mCaptionTopPadding;
+        boolean mIsCaptionVisible;
 
         Configuration mWindowDecorConfig;
 
@@ -749,12 +744,14 @@
             mCaptionWidthId = Resources.ID_NULL;
             mOccludingCaptionElements.clear();
             mInputFeatures = 0;
+            mIsInsetSource = true;
             mInsetSourceFlags = 0;
 
             mShadowRadiusId = Resources.ID_NULL;
             mCornerRadius = 0;
 
             mCaptionTopPadding = 0;
+            mIsCaptionVisible = false;
 
             mApplyStartTransactionOnDraw = false;
             mSetTaskPositionAndCrop = false;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/additionalviewcontainer/AdditionalSystemViewContainer.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/additionalviewcontainer/AdditionalSystemViewContainer.kt
index 226b0fb..1be26f0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/additionalviewcontainer/AdditionalSystemViewContainer.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/additionalviewcontainer/AdditionalSystemViewContainer.kt
@@ -107,4 +107,27 @@
         }
         windowManagerWrapper.updateViewLayout(view, lp)
     }
+
+    class Factory {
+        fun create(
+            windowManagerWrapper: WindowManagerWrapper,
+            taskId: Int,
+            x: Int,
+            y: Int,
+            width: Int,
+            height: Int,
+            flags: Int,
+            view: View,
+        ): AdditionalSystemViewContainer =
+            AdditionalSystemViewContainer(
+                windowManagerWrapper = windowManagerWrapper,
+                taskId = taskId,
+                x = x,
+                y = y,
+                width = width,
+                height = height,
+                flags = flags,
+                view = view
+            )
+    }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/education/DesktopWindowingEducationTooltipController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/education/DesktopWindowingEducationTooltipController.kt
new file mode 100644
index 0000000..c61b31e
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/education/DesktopWindowingEducationTooltipController.kt
@@ -0,0 +1,302 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.windowdecor.education
+
+import android.annotation.ColorInt
+import android.annotation.DimenRes
+import android.annotation.LayoutRes
+import android.content.Context
+import android.content.res.Resources
+import android.graphics.Point
+import android.util.Size
+import android.view.LayoutInflater
+import android.view.MotionEvent
+import android.view.View
+import android.view.View.MeasureSpec.UNSPECIFIED
+import android.view.WindowManager
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import android.window.DisplayAreaInfo
+import android.window.WindowContainerTransaction
+import androidx.core.graphics.drawable.DrawableCompat
+import androidx.dynamicanimation.animation.DynamicAnimation
+import androidx.dynamicanimation.animation.SpringForce
+import com.android.wm.shell.R
+import com.android.wm.shell.common.DisplayChangeController.OnDisplayChangingListener
+import com.android.wm.shell.common.DisplayController
+import com.android.wm.shell.shared.animation.PhysicsAnimator
+import com.android.wm.shell.windowdecor.WindowManagerWrapper
+import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalSystemViewContainer
+
+/**
+ * Controls the lifecycle of an education tooltip, including showing and hiding it. Ensures that
+ * only one tooltip is displayed at a time.
+ */
+class DesktopWindowingEducationTooltipController(
+    private val context: Context,
+    private val additionalSystemViewContainerFactory: AdditionalSystemViewContainer.Factory,
+    private val displayController: DisplayController,
+) : OnDisplayChangingListener {
+  // TODO: b/369384567 - Set tooltip color scheme to match LT/DT of app theme
+  private var tooltipView: View? = null
+  private var animator: PhysicsAnimator<View>? = null
+  private val springConfig by lazy {
+    PhysicsAnimator.SpringConfig(SpringForce.STIFFNESS_MEDIUM, SpringForce.DAMPING_RATIO_LOW_BOUNCY)
+  }
+  private var popupWindow: AdditionalSystemViewContainer? = null
+
+  override fun onDisplayChange(
+      displayId: Int,
+      fromRotation: Int,
+      toRotation: Int,
+      newDisplayAreaInfo: DisplayAreaInfo?,
+      t: WindowContainerTransaction?
+  ) {
+    // Exit if the rotation hasn't changed or is changed by 180 degrees. [fromRotation] and
+    // [toRotation] can be one of the [@Surface.Rotation] values.
+    if ((fromRotation % 2 == toRotation % 2)) return
+    hideEducationTooltip()
+    // TODO: b/370820018 - Update tooltip position on orientation change instead of dismissing
+  }
+
+  /**
+   * Shows education tooltip.
+   *
+   * @param tooltipViewConfig features of tooltip.
+   * @param taskId is used in the title of popup window created for the tooltip view.
+   */
+  fun showEducationTooltip(tooltipViewConfig: EducationViewConfig, taskId: Int) {
+    hideEducationTooltip()
+    tooltipView = createEducationTooltipView(tooltipViewConfig, taskId)
+    animator = createAnimator()
+    animateShowTooltipTransition()
+    displayController.addDisplayChangingController(this)
+  }
+
+  /** Hide the current education view if visible */
+  private fun hideEducationTooltip() = animateHideTooltipTransition { cleanUp() }
+
+  /** Create education view by inflating layout provided. */
+  private fun createEducationTooltipView(
+      tooltipViewConfig: EducationViewConfig,
+      taskId: Int,
+  ): View {
+    val tooltipView =
+        LayoutInflater.from(context)
+            .inflate(
+                tooltipViewConfig.tooltipViewLayout, /* root= */ null, /* attachToRoot= */ false)
+            .apply {
+              alpha = 0f
+              scaleX = 0f
+              scaleY = 0f
+
+              requireViewById<TextView>(R.id.tooltip_text).apply {
+                text = tooltipViewConfig.tooltipText
+              }
+
+              setOnTouchListener { _, motionEvent ->
+                if (motionEvent.action == MotionEvent.ACTION_OUTSIDE) {
+                  hideEducationTooltip()
+                  tooltipViewConfig.onDismissAction()
+                  true
+                } else {
+                  false
+                }
+              }
+              setOnClickListener {
+                hideEducationTooltip()
+                tooltipViewConfig.onEducationClickAction()
+              }
+              setTooltipColorScheme(tooltipViewConfig.tooltipColorScheme)
+            }
+
+    val tooltipDimens = tooltipDimens(tooltipView = tooltipView, tooltipViewConfig.arrowDirection)
+    val tooltipViewGlobalCoordinates =
+        tooltipViewGlobalCoordinates(
+            tooltipViewGlobalCoordinates = tooltipViewConfig.tooltipViewGlobalCoordinates,
+            arrowDirection = tooltipViewConfig.arrowDirection,
+            tooltipDimen = tooltipDimens)
+    createTooltipPopupWindow(
+        taskId, tooltipViewGlobalCoordinates, tooltipDimens, tooltipView = tooltipView)
+
+    return tooltipView
+  }
+
+  /** Create animator for education transitions */
+  private fun createAnimator(): PhysicsAnimator<View>? =
+      tooltipView?.let {
+        PhysicsAnimator.getInstance(it).apply { setDefaultSpringConfig(springConfig) }
+      }
+
+  /** Animate show transition for the education view */
+  private fun animateShowTooltipTransition() {
+    animator
+        ?.spring(DynamicAnimation.ALPHA, 1f)
+        ?.spring(DynamicAnimation.SCALE_X, 1f)
+        ?.spring(DynamicAnimation.SCALE_Y, 1f)
+        ?.start()
+  }
+
+  /** Animate hide transition for the education view */
+  private fun animateHideTooltipTransition(endActions: () -> Unit) {
+    animator
+        ?.spring(DynamicAnimation.ALPHA, 0f)
+        ?.spring(DynamicAnimation.SCALE_X, 0f)
+        ?.spring(DynamicAnimation.SCALE_Y, 0f)
+        ?.start()
+    endActions()
+  }
+
+  /** Remove education tooltip and clean up all relative properties */
+  private fun cleanUp() {
+    tooltipView = null
+    animator = null
+    popupWindow?.releaseView()
+    popupWindow = null
+    displayController.removeDisplayChangingController(this)
+  }
+
+  private fun createTooltipPopupWindow(
+      taskId: Int,
+      tooltipViewGlobalCoordinates: Point,
+      tooltipDimen: Size,
+      tooltipView: View,
+  ) {
+    popupWindow =
+        additionalSystemViewContainerFactory.create(
+            windowManagerWrapper =
+                WindowManagerWrapper(context.getSystemService(WindowManager::class.java)),
+            taskId = taskId,
+            x = tooltipViewGlobalCoordinates.x,
+            y = tooltipViewGlobalCoordinates.y,
+            width = tooltipDimen.width,
+            height = tooltipDimen.height,
+            flags =
+                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
+                    WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
+            view = tooltipView)
+  }
+
+  private fun View.setTooltipColorScheme(tooltipColorScheme: TooltipColorScheme) {
+    requireViewById<LinearLayout>(R.id.tooltip_container).apply {
+      background.setTint(tooltipColorScheme.container)
+    }
+    requireViewById<ImageView>(R.id.arrow_icon).apply {
+      val wrappedDrawable = DrawableCompat.wrap(this.drawable)
+      DrawableCompat.setTint(wrappedDrawable, tooltipColorScheme.container)
+    }
+    requireViewById<TextView>(R.id.tooltip_text).apply { setTextColor(tooltipColorScheme.text) }
+    requireViewById<ImageView>(R.id.tooltip_icon).apply {
+      val wrappedDrawable = DrawableCompat.wrap(this.drawable)
+      DrawableCompat.setTint(wrappedDrawable, tooltipColorScheme.icon)
+    }
+  }
+
+  private fun tooltipViewGlobalCoordinates(
+      tooltipViewGlobalCoordinates: Point,
+      arrowDirection: TooltipArrowDirection,
+      tooltipDimen: Size,
+  ): Point {
+    var tooltipX = tooltipViewGlobalCoordinates.x
+    var tooltipY = tooltipViewGlobalCoordinates.y
+
+    // Current values of [tooltipX]/[tooltipY] are the coordinates of tip of the arrow.
+    // Parameter x and y passed to [AdditionalSystemViewContainer] is the top left position of
+    // the window to be created. Hence we will need to move the coordinates left/up in order
+    // to position the tooltip correctly.
+    if (arrowDirection == TooltipArrowDirection.UP) {
+      // Arrow is placed at horizontal center on top edge of the tooltip. Hence decrement
+      // half of tooltip width from [tooltipX] to horizontally position the tooltip.
+      tooltipX -= tooltipDimen.width / 2
+    } else {
+      // Arrow is placed at vertical center on the left edge of the tooltip. Hence decrement
+      // half of tooltip height from [tooltipY] to vertically position the tooltip.
+      tooltipY -= tooltipDimen.height / 2
+    }
+    return Point(tooltipX, tooltipY)
+  }
+
+  private fun tooltipDimens(tooltipView: View, arrowDirection: TooltipArrowDirection): Size {
+    val tooltipBackground = tooltipView.requireViewById<LinearLayout>(R.id.tooltip_container)
+    val arrowView = tooltipView.requireViewById<ImageView>(R.id.arrow_icon)
+    tooltipBackground.measure(
+        /* widthMeasureSpec= */ UNSPECIFIED, /* heightMeasureSpec= */ UNSPECIFIED)
+    arrowView.measure(/* widthMeasureSpec= */ UNSPECIFIED, /* heightMeasureSpec= */ UNSPECIFIED)
+
+    var desiredWidth =
+        tooltipBackground.measuredWidth +
+            2 * loadDimensionPixelSize(R.dimen.desktop_windowing_education_tooltip_padding)
+    var desiredHeight =
+        tooltipBackground.measuredHeight +
+            2 * loadDimensionPixelSize(R.dimen.desktop_windowing_education_tooltip_padding)
+    if (arrowDirection == TooltipArrowDirection.UP) {
+      // desiredHeight currently does not account for the height of arrow, hence adding it.
+      desiredHeight += arrowView.height
+    } else {
+      // desiredWidth currently does not account for the width of arrow, hence adding it.
+      desiredWidth += arrowView.width
+    }
+
+    return Size(desiredWidth, desiredHeight)
+  }
+
+  private fun loadDimensionPixelSize(@DimenRes resourceId: Int): Int {
+    if (resourceId == Resources.ID_NULL) return 0
+    return context.resources.getDimensionPixelSize(resourceId)
+  }
+
+  /**
+   * The configuration for education view features:
+   *
+   * @property tooltipViewLayout Layout resource ID of the view to be used for education tooltip.
+   * @property tooltipViewGlobalCoordinates Global (screen) coordinates of the tip of the tooltip
+   *   arrow.
+   * @property tooltipText Text to be added to the TextView of tooltip.
+   * @property arrowDirection Direction of arrow of the tooltip.
+   * @property onEducationClickAction Lambda to be executed when the tooltip is clicked.
+   * @property onDismissAction Lambda to be executed when the tooltip is dismissed.
+   */
+  data class EducationViewConfig(
+      @LayoutRes val tooltipViewLayout: Int,
+      val tooltipColorScheme: TooltipColorScheme,
+      val tooltipViewGlobalCoordinates: Point,
+      val tooltipText: String,
+      val arrowDirection: TooltipArrowDirection,
+      val onEducationClickAction: () -> Unit,
+      val onDismissAction: () -> Unit,
+  )
+
+  /**
+   * Color scheme of education view:
+   *
+   * @property container Color of the container of the tooltip.
+   * @property text Text color of the [TextView] of education tooltip.
+   * @property icon Color to be filled in tooltip's icon.
+   */
+  data class TooltipColorScheme(
+      @ColorInt val container: Int,
+      @ColorInt val text: Int,
+      @ColorInt val icon: Int,
+  )
+
+  /** Direction of arrow of the tooltip */
+  enum class TooltipArrowDirection {
+    UP,
+    LEFT,
+  }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/extension/TaskInfo.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/extension/TaskInfo.kt
index 6f8e001..052cfaf 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/extension/TaskInfo.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/extension/TaskInfo.kt
@@ -20,6 +20,7 @@
 import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN
 import android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW
 import android.app.WindowConfiguration.WINDOWING_MODE_PINNED
+import android.view.WindowInsets
 import android.view.WindowInsetsController.APPEARANCE_LIGHT_CAPTION_BARS
 import android.view.WindowInsetsController.APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND
 
@@ -46,3 +47,10 @@
 /** Whether the task is in multi-window windowing mode. */
 val TaskInfo.isMultiWindow: Boolean
     get() = windowingMode == WINDOWING_MODE_MULTI_WINDOW
+
+/** Whether the task is requesting immersive mode. */
+val TaskInfo.requestingImmersive: Boolean
+    get() {
+        // Considered to be requesting immersive when requesting to hide the status bar.
+        return (requestedVisibleTypes and WindowInsets.Type.statusBars()) == 0
+    }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt
index 8c102eb..b5700ff 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt
@@ -42,6 +42,7 @@
 import com.android.wm.shell.shared.animation.Interpolators
 import com.android.wm.shell.windowdecor.WindowManagerWrapper
 import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalSystemViewContainer
+import com.android.wm.shell.windowdecor.viewholder.WindowDecorationViewHolder.Data
 
 /**
  * A desktop mode window decoration used when the window is in full "focus" (i.e. fullscreen/split).
@@ -53,11 +54,20 @@
     onCaptionButtonClickListener: OnClickListener,
     private val windowManagerWrapper: WindowManagerWrapper,
     private val handler: Handler
-) : WindowDecorationViewHolder(rootView) {
+) : WindowDecorationViewHolder<AppHandleViewHolder.HandleData>(rootView) {
 
     companion object {
         private const val CAPTION_HANDLE_ANIMATION_DURATION: Long = 100
     }
+
+    data class HandleData(
+        val taskInfo: RunningTaskInfo,
+        val position: Point,
+        val width: Int,
+        val height: Int,
+        val isCaptionVisible: Boolean
+    ) : Data()
+
     private lateinit var taskInfo: RunningTaskInfo
     private val captionView: View = rootView.requireViewById(R.id.desktop_mode_caption)
     private val captionHandle: ImageButton = rootView.requireViewById(R.id.caption_handle)
@@ -89,7 +99,11 @@
         }
     }
 
-    override fun bindData(
+    override fun bindData(data: HandleData) {
+        bindData(data.taskInfo, data.position, data.width, data.height, data.isCaptionVisible)
+    }
+
+    private fun bindData(
         taskInfo: RunningTaskInfo,
         position: Point,
         width: Int,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
index e996165..52bf400 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
@@ -16,12 +16,12 @@
 package com.android.wm.shell.windowdecor.viewholder
 
 import android.annotation.ColorInt
+import android.annotation.DrawableRes
 import android.app.ActivityManager.RunningTaskInfo
 import android.content.res.ColorStateList
 import android.content.res.Configuration
 import android.graphics.Bitmap
 import android.graphics.Color
-import android.graphics.Point
 import android.graphics.Rect
 import android.graphics.drawable.LayerDrawable
 import android.graphics.drawable.RippleDrawable
@@ -46,6 +46,7 @@
 import com.android.internal.R.attr.materialColorSurfaceContainerHigh
 import com.android.internal.R.attr.materialColorSurfaceContainerLow
 import com.android.internal.R.attr.materialColorSurfaceDim
+import com.android.window.flags.Flags
 import com.android.window.flags.Flags.enableMinimizeButton
 import com.android.wm.shell.R
 import android.window.flags.DesktopModeFlags
@@ -74,7 +75,13 @@
         appName: CharSequence,
         appIconBitmap: Bitmap,
         onMaximizeHoverAnimationFinishedListener: () -> Unit
-) : WindowDecorationViewHolder(rootView) {
+) : WindowDecorationViewHolder<AppHeaderViewHolder.HeaderData>(rootView) {
+
+    data class HeaderData(
+        val taskInfo: RunningTaskInfo,
+        val isRequestingImmersive: Boolean,
+        val inFullImmersiveState: Boolean,
+    ) : Data()
 
     private val decorThemeUtil = DecorThemeUtil(context)
     private val lightColors = dynamicLightColorScheme(context)
@@ -151,15 +158,17 @@
                 onMaximizeHoverAnimationFinishedListener
     }
 
-    override fun bindData(
+    override fun bindData(data: HeaderData) {
+        bindData(data.taskInfo, data.isRequestingImmersive, data.inFullImmersiveState)
+    }
+
+    private fun bindData(
         taskInfo: RunningTaskInfo,
-        position: Point,
-        width: Int,
-        height: Int,
-        isCaptionVisible: Boolean
+        isRequestingImmersive: Boolean,
+        inFullImmersiveState: Boolean,
     ) {
         if (DesktopModeFlags.ENABLE_THEMED_APP_HEADERS.isTrue()) {
-            bindDataWithThemedHeaders(taskInfo)
+            bindDataWithThemedHeaders(taskInfo, isRequestingImmersive, inFullImmersiveState)
         } else {
             bindDataLegacy(taskInfo)
         }
@@ -198,7 +207,11 @@
         minimizeWindowButton.isGone = !enableMinimizeButton()
     }
 
-    private fun bindDataWithThemedHeaders(taskInfo: RunningTaskInfo) {
+    private fun bindDataWithThemedHeaders(
+        taskInfo: RunningTaskInfo,
+        requestingImmersive: Boolean,
+        inFullImmersiveState: Boolean
+    ) {
         val header = fillHeaderInfo(taskInfo)
         val headerStyle = getHeaderStyle(header)
 
@@ -241,16 +254,19 @@
         }
         minimizeWindowButton.isGone = !enableMinimizeButton()
         // Maximize button.
-        maximizeButtonView.setAnimationTints(
-            darkMode = header.appTheme == Theme.DARK,
-            iconForegroundColor = colorStateList,
-            baseForegroundColor = foregroundColor,
-            rippleDrawable = createRippleDrawable(
-                color = foregroundColor,
-                cornerRadius = headerButtonsRippleRadius,
-                drawableInsets = maximizeDrawableInsets
+        maximizeButtonView.apply {
+            setAnimationTints(
+                darkMode = header.appTheme == Theme.DARK,
+                iconForegroundColor = colorStateList,
+                baseForegroundColor = foregroundColor,
+                rippleDrawable = createRippleDrawable(
+                    color = foregroundColor,
+                    cornerRadius = headerButtonsRippleRadius,
+                    drawableInsets = maximizeDrawableInsets
+                )
             )
-        )
+            setIcon(getMaximizeButtonIcon(requestingImmersive, inFullImmersiveState))
+        }
         // Close button.
         closeWindowButton.apply {
             imageTintList = colorStateList
@@ -320,6 +336,32 @@
         }
     }
 
+    @DrawableRes
+    private fun getMaximizeButtonIcon(
+        requestingImmersive: Boolean,
+        inFullImmersiveState: Boolean
+    ): Int = when {
+        shouldShowEnterFullImmersiveIcon(requestingImmersive, inFullImmersiveState) -> {
+            R.drawable.decor_desktop_mode_immersive_button_dark
+        }
+        shouldShowExitFullImmersiveIcon(requestingImmersive, inFullImmersiveState) -> {
+            R.drawable.decor_desktop_mode_immersive_exit_button_dark
+        }
+        else -> R.drawable.decor_desktop_mode_maximize_button_dark
+    }
+
+    private fun shouldShowEnterFullImmersiveIcon(
+        requestingImmersive: Boolean,
+        inFullImmersiveState: Boolean
+    ): Boolean = Flags.enableFullyImmersiveInDesktop()
+            && requestingImmersive && !inFullImmersiveState
+
+    private fun shouldShowExitFullImmersiveIcon(
+        requestingImmersive: Boolean,
+        inFullImmersiveState: Boolean
+    ): Boolean = Flags.enableFullyImmersiveInDesktop()
+            && requestingImmersive && inFullImmersiveState
+
     private fun getHeaderStyle(header: Header): HeaderStyle {
         return HeaderStyle(
             background = getHeaderBackground(header),
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/WindowDecorationViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/WindowDecorationViewHolder.kt
index 5ea55b3..1fe743d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/WindowDecorationViewHolder.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/WindowDecorationViewHolder.kt
@@ -17,31 +17,28 @@
 
 import android.app.ActivityManager.RunningTaskInfo
 import android.content.Context
-import android.graphics.Point
 import android.view.View
+import com.android.wm.shell.windowdecor.viewholder.WindowDecorationViewHolder.Data
 
 /**
  * Encapsulates the root [View] of a window decoration and its children to facilitate looking up
  * children (via findViewById) and updating to the latest data from [RunningTaskInfo].
  */
-abstract class WindowDecorationViewHolder(rootView: View) {
+abstract class WindowDecorationViewHolder<T : Data>(rootView: View) {
   val context: Context = rootView.context
 
   /**
    * A signal to the view holder that new data is available and that the views should be updated to
    * reflect it.
    */
-  abstract fun bindData(
-    taskInfo: RunningTaskInfo,
-    position: Point,
-    width: Int,
-    height: Int,
-    isCaptionVisible: Boolean
-  )
+  abstract fun bindData(data: T)
 
   /** Callback when the handle menu is opened. */
   abstract fun onHandleMenuOpened()
 
   /** Callback when the handle menu is closed. */
   abstract fun onHandleMenuClosed()
+
+  /** Data clas that contains the information needed to update the view holder. */
+  abstract class Data
 }
diff --git a/libs/WindowManager/Shell/tests/e2e/desktopmode/flicker-service/AndroidTestTemplate.xml b/libs/WindowManager/Shell/tests/e2e/desktopmode/flicker-service/AndroidTestTemplate.xml
index 40dbbac..c8df15d 100644
--- a/libs/WindowManager/Shell/tests/e2e/desktopmode/flicker-service/AndroidTestTemplate.xml
+++ b/libs/WindowManager/Shell/tests/e2e/desktopmode/flicker-service/AndroidTestTemplate.xml
@@ -24,6 +24,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/libs/WindowManager/Shell/tests/e2e/splitscreen/flicker-legacy/Android.bp b/libs/WindowManager/Shell/tests/e2e/splitscreen/flicker-legacy/Android.bp
index a231e38..176020f 100644
--- a/libs/WindowManager/Shell/tests/e2e/splitscreen/flicker-legacy/Android.bp
+++ b/libs/WindowManager/Shell/tests/e2e/splitscreen/flicker-legacy/Android.bp
@@ -69,116 +69,6 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// Begin cleanup after gcl merges
-
-filegroup {
-    name: "WMShellFlickerTestsSplitScreenGroup1-src",
-    srcs: [
-        "src/**/A*.kt",
-        "src/**/B*.kt",
-        "src/**/C*.kt",
-        "src/**/D*.kt",
-    ],
-}
-
-filegroup {
-    name: "WMShellFlickerTestsSplitScreenGroup2-src",
-    srcs: [
-        "src/**/E*.kt",
-    ],
-}
-
-filegroup {
-    name: "WMShellFlickerTestsSplitScreenGroup3-src",
-    srcs: [
-        "src/**/S*.kt",
-    ],
-}
-
-filegroup {
-    name: "WMShellFlickerTestsSplitScreenGroupOther-src",
-    srcs: [
-        "src/**/*.kt",
-    ],
-}
-
-android_test {
-    name: "WMShellFlickerTestsSplitScreenGroup1",
-    defaults: ["WMShellFlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    package_name: "com.android.wm.shell.flicker.splitscreen",
-    instrumentation_target_package: "com.android.wm.shell.flicker.splitscreen",
-    test_config_template: "AndroidTestTemplate.xml",
-    srcs: [
-        ":WMShellFlickerTestsSplitScreenGroup1-src",
-    ],
-    static_libs: [
-        "WMShellFlickerTestsBase",
-        "WMShellFlickerTestsSplitScreenBase",
-    ],
-    data: ["trace_config/*"],
-}
-
-android_test {
-    name: "WMShellFlickerTestsSplitScreenGroup2",
-    defaults: ["WMShellFlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    package_name: "com.android.wm.shell.flicker.splitscreen",
-    instrumentation_target_package: "com.android.wm.shell.flicker.splitscreen",
-    test_config_template: "AndroidTestTemplate.xml",
-    srcs: [
-        ":WMShellFlickerTestsSplitScreenGroup2-src",
-    ],
-    static_libs: [
-        "WMShellFlickerTestsBase",
-        "WMShellFlickerTestsSplitScreenBase",
-    ],
-    data: ["trace_config/*"],
-}
-
-android_test {
-    name: "WMShellFlickerTestsSplitScreenGroup3",
-    defaults: ["WMShellFlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    package_name: "com.android.wm.shell.flicker.splitscreen",
-    instrumentation_target_package: "com.android.wm.shell.flicker.splitscreen",
-    test_config_template: "AndroidTestTemplate.xml",
-    srcs: [
-        ":WMShellFlickerTestsSplitScreenGroup3-src",
-    ],
-    static_libs: [
-        "WMShellFlickerTestsBase",
-        "WMShellFlickerTestsSplitScreenBase",
-    ],
-    data: ["trace_config/*"],
-}
-
-android_test {
-    name: "WMShellFlickerTestsSplitScreenGroupOther",
-    defaults: ["WMShellFlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    package_name: "com.android.wm.shell.flicker.splitscreen",
-    instrumentation_target_package: "com.android.wm.shell.flicker.splitscreen",
-    test_config_template: "AndroidTestTemplate.xml",
-    srcs: [
-        ":WMShellFlickerTestsSplitScreenGroupOther-src",
-    ],
-    exclude_srcs: [
-        ":WMShellFlickerTestsSplitScreenGroup1-src",
-        ":WMShellFlickerTestsSplitScreenGroup2-src",
-        ":WMShellFlickerTestsSplitScreenGroup3-src",
-    ],
-    static_libs: [
-        "WMShellFlickerTestsBase",
-        "WMShellFlickerTestsSplitScreenBase",
-    ],
-    data: ["trace_config/*"],
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// End cleanup after gcl merges
-
-////////////////////////////////////////////////////////////////////////////////
 // Begin breakdowns for FlickerTestsRotation module
 
 test_module_config {
diff --git a/libs/WindowManager/Shell/tests/e2e/splitscreen/flicker-legacy/AndroidTestTemplate.xml b/libs/WindowManager/Shell/tests/e2e/splitscreen/flicker-legacy/AndroidTestTemplate.xml
index 85715db..706c632 100644
--- a/libs/WindowManager/Shell/tests/e2e/splitscreen/flicker-legacy/AndroidTestTemplate.xml
+++ b/libs/WindowManager/Shell/tests/e2e/splitscreen/flicker-legacy/AndroidTestTemplate.xml
@@ -24,6 +24,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/libs/WindowManager/Shell/tests/e2e/splitscreen/flicker-service/AndroidTestTemplate.xml b/libs/WindowManager/Shell/tests/e2e/splitscreen/flicker-service/AndroidTestTemplate.xml
index 6c903a2..7df1675 100644
--- a/libs/WindowManager/Shell/tests/e2e/splitscreen/flicker-service/AndroidTestTemplate.xml
+++ b/libs/WindowManager/Shell/tests/e2e/splitscreen/flicker-service/AndroidTestTemplate.xml
@@ -24,6 +24,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/libs/WindowManager/Shell/tests/e2e/splitscreen/platinum/AndroidTestTemplate.xml b/libs/WindowManager/Shell/tests/e2e/splitscreen/platinum/AndroidTestTemplate.xml
index 6c903a2..7df1675 100644
--- a/libs/WindowManager/Shell/tests/e2e/splitscreen/platinum/AndroidTestTemplate.xml
+++ b/libs/WindowManager/Shell/tests/e2e/splitscreen/platinum/AndroidTestTemplate.xml
@@ -24,6 +24,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/libs/WindowManager/Shell/tests/flicker/Android.bp b/libs/WindowManager/Shell/tests/flicker/Android.bp
index 58559ac..7b6cfe3 100644
--- a/libs/WindowManager/Shell/tests/flicker/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/Android.bp
@@ -30,7 +30,6 @@
 
 java_library {
     name: "wm-shell-flicker-utils",
-    platform_apis: true,
     optimize: {
         enabled: false,
     },
diff --git a/libs/WindowManager/Shell/tests/flicker/appcompat/Android.bp b/libs/WindowManager/Shell/tests/flicker/appcompat/Android.bp
index 29a9f10..b016c9f 100644
--- a/libs/WindowManager/Shell/tests/flicker/appcompat/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/appcompat/Android.bp
@@ -15,7 +15,7 @@
 //
 
 package {
-    default_team: "trendy_team_app_compat",
+    default_team: "trendy_team_lse_app_compat",
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
     // all of the 'license_kinds' from "frameworks_base_license"
@@ -24,31 +24,6 @@
     default_applicable_licenses: ["frameworks_base_license"],
 }
 
-////////////////////////////////////////////////////////////////////////////////
-// Begin cleanup after gcl merge
-
-filegroup {
-    name: "WMShellFlickerTestsAppCompat-src",
-    srcs: [
-        "src/**/*.kt",
-    ],
-}
-
-android_test {
-    name: "WMShellFlickerTestsOther",
-    defaults: ["WMShellFlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    package_name: "com.android.wm.shell.flicker",
-    instrumentation_target_package: "com.android.wm.shell.flicker",
-    test_config_template: "AndroidTestTemplate.xml",
-    srcs: [":WMShellFlickerTestsAppCompat-src"],
-    static_libs: ["WMShellFlickerTestsBase"],
-    data: ["trace_config/*"],
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// End cleanup after gcl merge
-
 android_test {
     name: "WMShellFlickerTestsAppCompat",
     defaults: ["WMShellFlickerTestsDefault"],
diff --git a/libs/WindowManager/Shell/tests/flicker/appcompat/AndroidTestTemplate.xml b/libs/WindowManager/Shell/tests/flicker/appcompat/AndroidTestTemplate.xml
index f69a90c..d87c179 100644
--- a/libs/WindowManager/Shell/tests/flicker/appcompat/AndroidTestTemplate.xml
+++ b/libs/WindowManager/Shell/tests/flicker/appcompat/AndroidTestTemplate.xml
@@ -24,6 +24,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/OpenAppInSizeCompatModeTest.kt b/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/OpenAppInSizeCompatModeTest.kt
index 16c2d47..27303c1 100644
--- a/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/OpenAppInSizeCompatModeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/OpenAppInSizeCompatModeTest.kt
@@ -31,7 +31,7 @@
 /**
  * Test launching app in size compat mode.
  *
- * To run this test: `atest WMShellFlickerTestsOther:OpenAppInSizeCompatModeTest`
+ * To run this test: `atest WMShellFlickerTestsAppCompat:OpenAppInSizeCompatModeTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/OpenTransparentActivityTest.kt b/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/OpenTransparentActivityTest.kt
index d85b771..2980d51 100644
--- a/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/OpenTransparentActivityTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/OpenTransparentActivityTest.kt
@@ -32,7 +32,7 @@
 /**
  * Test launching app in size compat mode.
  *
- * To run this test: `atest WMShellFlickerTestsOther:OpenTransparentActivityTest`
+ * To run this test: `atest WMShellFlickerTestsAppCompat:OpenTransparentActivityTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/QuickSwitchLauncherToLetterboxAppTest.kt b/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/QuickSwitchLauncherToLetterboxAppTest.kt
index 164534c..2484f67 100644
--- a/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/QuickSwitchLauncherToLetterboxAppTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/QuickSwitchLauncherToLetterboxAppTest.kt
@@ -36,7 +36,7 @@
 /**
  * Test quick switching to letterboxed app from launcher
  *
- * To run this test: `atest WMShellFlickerTestsOther:QuickSwitchLauncherToLetterboxAppTest`
+ * To run this test: `atest WMShellFlickerTestsAppCompat:QuickSwitchLauncherToLetterboxAppTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/RepositionFixedPortraitAppTest.kt b/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/RepositionFixedPortraitAppTest.kt
index 034d54b..77423af 100644
--- a/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/RepositionFixedPortraitAppTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/RepositionFixedPortraitAppTest.kt
@@ -32,7 +32,7 @@
 /**
  * Test launching a fixed portrait letterboxed app in landscape and repositioning to the right.
  *
- * To run this test: `atest WMShellFlickerTestsOther:RepositionFixedPortraitAppTest`
+ * To run this test: `atest WMShellFlickerTestsAppCompat:RepositionFixedPortraitAppTest`
  *
  * Actions:
  *
diff --git a/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/RestartAppInSizeCompatModeTest.kt b/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/RestartAppInSizeCompatModeTest.kt
index 443fac1..5459ef03 100644
--- a/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/RestartAppInSizeCompatModeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/RestartAppInSizeCompatModeTest.kt
@@ -31,7 +31,7 @@
 /**
  * Test restarting app in size compat mode.
  *
- * To run this test: `atest WMShellFlickerTestsOther:RestartAppInSizeCompatModeTest`
+ * To run this test: `atest WMShellFlickerTestsAppCompat:RestartAppInSizeCompatModeTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/RotateImmersiveAppInFullscreenTest.kt b/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/RotateImmersiveAppInFullscreenTest.kt
index 22543aa..5bb9640 100644
--- a/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/RotateImmersiveAppInFullscreenTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/appcompat/src/com/android/wm/shell/flicker/appcompat/RotateImmersiveAppInFullscreenTest.kt
@@ -45,7 +45,7 @@
 /**
  * Test rotating an immersive app in fullscreen.
  *
- * To run this test: `atest WMShellFlickerTestsOther:RotateImmersiveAppInFullscreenTest`
+ * To run this test: `atest WMShellFlickerTestsAppCompat:RotateImmersiveAppInFullscreenTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/bubble/AndroidTestTemplate.xml b/libs/WindowManager/Shell/tests/flicker/bubble/AndroidTestTemplate.xml
index b76d065..99969e7 100644
--- a/libs/WindowManager/Shell/tests/flicker/bubble/AndroidTestTemplate.xml
+++ b/libs/WindowManager/Shell/tests/flicker/bubble/AndroidTestTemplate.xml
@@ -24,6 +24,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/Android.bp b/libs/WindowManager/Shell/tests/flicker/pip/Android.bp
index 4165ed0..ddbc681 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/pip/Android.bp
@@ -29,92 +29,12 @@
     srcs: ["src/**/apps/*.kt"],
 }
 
-////////////////////////////////////////////////////////////////////////////////
-// Begin cleanup after gcl merges
-
-filegroup {
-    name: "WMShellFlickerTestsPip1-src",
-    srcs: [
-        "src/**/A*.kt",
-        "src/**/B*.kt",
-        "src/**/C*.kt",
-        "src/**/D*.kt",
-        "src/**/F*.kt",
-        "src/**/S*.kt",
-    ],
-}
-
-filegroup {
-    name: "WMShellFlickerTestsPip2-src",
-    srcs: [
-        "src/**/E*.kt",
-    ],
-}
-
-filegroup {
-    name: "WMShellFlickerTestsPip3-src",
-    srcs: ["src/**/*.kt"],
-}
-
 filegroup {
     name: "WMShellFlickerTestsPipCommon-src",
     srcs: ["src/**/common/*.kt"],
 }
 
 android_test {
-    name: "WMShellFlickerTestsPip1",
-    defaults: ["WMShellFlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    package_name: "com.android.wm.shell.flicker.pip",
-    instrumentation_target_package: "com.android.wm.shell.flicker.pip",
-    test_config_template: "AndroidTestTemplate.xml",
-    srcs: [
-        ":WMShellFlickerTestsPip1-src",
-        ":WMShellFlickerTestsPipCommon-src",
-    ],
-    static_libs: ["WMShellFlickerTestsBase"],
-    data: ["trace_config/*"],
-}
-
-android_test {
-    name: "WMShellFlickerTestsPip2",
-    defaults: ["WMShellFlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    package_name: "com.android.wm.shell.flicker.pip",
-    instrumentation_target_package: "com.android.wm.shell.flicker.pip",
-    test_config_template: "AndroidTestTemplate.xml",
-    srcs: [
-        ":WMShellFlickerTestsPip2-src",
-        ":WMShellFlickerTestsPipCommon-src",
-    ],
-    static_libs: ["WMShellFlickerTestsBase"],
-    data: ["trace_config/*"],
-}
-
-android_test {
-    name: "WMShellFlickerTestsPip3",
-    defaults: ["WMShellFlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    package_name: "com.android.wm.shell.flicker.pip",
-    instrumentation_target_package: "com.android.wm.shell.flicker.pip",
-    test_config_template: "AndroidTestTemplate.xml",
-    srcs: [
-        ":WMShellFlickerTestsPip3-src",
-        ":WMShellFlickerTestsPipCommon-src",
-    ],
-    exclude_srcs: [
-        ":WMShellFlickerTestsPip1-src",
-        ":WMShellFlickerTestsPip2-src",
-        ":WMShellFlickerTestsPipApps-src",
-    ],
-    static_libs: ["WMShellFlickerTestsBase"],
-    data: ["trace_config/*"],
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// End cleanup after gcl merges
-
-android_test {
     name: "WMShellFlickerTestsPip",
     defaults: ["WMShellFlickerTestsDefault"],
     manifest: "AndroidManifest.xml",
@@ -122,6 +42,7 @@
     instrumentation_target_package: "com.android.wm.shell.flicker.pip",
     test_config_template: "AndroidTestTemplate.xml",
     srcs: ["src/**/*.kt"],
+    exclude_srcs: [":WMShellFlickerTestsPipApps-src"],
     static_libs: ["WMShellFlickerTestsBase"],
     data: ["trace_config/*"],
 }
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/AndroidTestTemplate.xml b/libs/WindowManager/Shell/tests/flicker/pip/AndroidTestTemplate.xml
index 041978c..19c3e40 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/AndroidTestTemplate.xml
+++ b/libs/WindowManager/Shell/tests/flicker/pip/AndroidTestTemplate.xml
@@ -24,6 +24,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/csuiteDefaultTemplate.xml b/libs/WindowManager/Shell/tests/flicker/pip/csuiteDefaultTemplate.xml
index bf040d2..7505860 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/csuiteDefaultTemplate.xml
+++ b/libs/WindowManager/Shell/tests/flicker/pip/csuiteDefaultTemplate.xml
@@ -24,6 +24,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="on"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="on"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipOnGoToHomeTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipOnGoToHomeTest.kt
index a9ed13a..a248303 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipOnGoToHomeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipOnGoToHomeTest.kt
@@ -38,7 +38,7 @@
 /**
  * Test entering pip from an app via auto-enter property when navigating to home.
  *
- * To run this test: `atest WMShellFlickerTestsPip1:AutoEnterPipOnGoToHomeTest`
+ * To run this test: `atest WMShellFlickerTestsPip:AutoEnterPipOnGoToHomeTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipWithSourceRectHintTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipWithSourceRectHintTest.kt
index d059211..df952c9 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipWithSourceRectHintTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipWithSourceRectHintTest.kt
@@ -30,7 +30,7 @@
 /**
  * Test auto entering pip using a source rect hint.
  *
- * To run this test: `atest WMShellFlickerTestsPip1:AutoEnterPipWithSourceRectHintTest`
+ * To run this test: `atest WMShellFlickerTestsPip:AutoEnterPipWithSourceRectHintTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ClosePipBySwipingDownTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ClosePipBySwipingDownTest.kt
index 3ffc9d7..302b8c4 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ClosePipBySwipingDownTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ClosePipBySwipingDownTest.kt
@@ -32,7 +32,7 @@
 /**
  * Test closing a pip window by swiping it to the bottom-center of the screen
  *
- * To run this test: `atest WMShellFlickerTestsPip1:ClosePipBySwipingDownTest`
+ * To run this test: `atest WMShellFlickerTestsPip:ClosePipBySwipingDownTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ClosePipWithDismissButtonTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ClosePipWithDismissButtonTest.kt
index d177624..77a1edb 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ClosePipWithDismissButtonTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ClosePipWithDismissButtonTest.kt
@@ -30,7 +30,7 @@
 /**
  * Test closing a pip window via the dismiss button
  *
- * To run this test: `atest WMShellFlickerTestsPip1:ClosePipWithDismissButtonTest`
+ * To run this test: `atest WMShellFlickerTestsPip:ClosePipWithDismissButtonTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/EnterPipOnUserLeaveHintTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/EnterPipOnUserLeaveHintTest.kt
index a86803d..6e32d64 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/EnterPipOnUserLeaveHintTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/EnterPipOnUserLeaveHintTest.kt
@@ -31,7 +31,7 @@
 /**
  * Test entering pip from an app via [onUserLeaveHint] and by navigating to home.
  *
- * To run this test: `atest WMShellFlickerTestsPip2:EnterPipOnUserLeaveHintTest`
+ * To run this test: `atest WMShellFlickerTestsPip:EnterPipOnUserLeaveHintTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientation.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientation.kt
index d0e8215..9a6cb61 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientation.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientation.kt
@@ -46,7 +46,7 @@
 /**
  * Test entering pip while changing orientation (from app in landscape to pip window in portrait)
  *
- * To run this test: `atest WMShellFlickerTestsPip2:EnterPipToOtherOrientation`
+ * To run this test: `atest WMShellFlickerTestsPip:EnterPipToOtherOrientation`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/EnterPipViaAppUiButtonTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/EnterPipViaAppUiButtonTest.kt
index d92f55a..6b4751c 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/EnterPipViaAppUiButtonTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/EnterPipViaAppUiButtonTest.kt
@@ -28,7 +28,7 @@
 /**
  * Test entering pip from an app by interacting with the app UI
  *
- * To run this test: `atest WMShellFlickerTestsPip2:EnterPipViaAppUiButtonTest`
+ * To run this test: `atest WMShellFlickerTestsPip:EnterPipViaAppUiButtonTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaExpandButtonTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaExpandButtonTest.kt
index 8c0817d..8d0bc0f 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaExpandButtonTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaExpandButtonTest.kt
@@ -28,7 +28,7 @@
 /**
  * Test expanding a pip window back to full screen via the expand button
  *
- * To run this test: `atest WMShellFlickerTestsPip2:ExitPipToAppViaExpandButtonTest`
+ * To run this test: `atest WMShellFlickerTestsPip:ExitPipToAppViaExpandButtonTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaIntentTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaIntentTest.kt
index 90a9623..939f328 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaIntentTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaIntentTest.kt
@@ -28,7 +28,7 @@
 /**
  * Test expanding a pip window back to full screen via an intent
  *
- * To run this test: `atest WMShellFlickerTestsPip2:ExitPipToAppViaIntentTest`
+ * To run this test: `atest WMShellFlickerTestsPip:ExitPipToAppViaIntentTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
index 9306c77..258663b 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
@@ -33,7 +33,7 @@
 /**
  * Test expanding a pip window by double-clicking it
  *
- * To run this test: `atest WMShellFlickerTestsPip2:ExpandPipOnDoubleClickTest`
+ * To run this test: `atest WMShellFlickerTestsPip:ExpandPipOnDoubleClickTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenAutoEnterPipOnGoToHomeTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenAutoEnterPipOnGoToHomeTest.kt
index cb8ee27..5f8ac2a 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenAutoEnterPipOnGoToHomeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenAutoEnterPipOnGoToHomeTest.kt
@@ -39,7 +39,7 @@
 /**
  * Test entering pip from an app via auto-enter property when navigating to home from split screen.
  *
- * To run this test: `atest WMShellFlickerTestsPip1:FromSplitScreenAutoEnterPipOnGoToHomeTest`
+ * To run this test: `atest WMShellFlickerTestsPip:FromSplitScreenAutoEnterPipOnGoToHomeTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenEnterPipOnUserLeaveHintTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenEnterPipOnUserLeaveHintTest.kt
index d03d779..48c85a8 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenEnterPipOnUserLeaveHintTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenEnterPipOnUserLeaveHintTest.kt
@@ -40,7 +40,7 @@
 /**
  * Test entering pip from an app via auto-enter property when navigating to home from split screen.
  *
- * To run this test: `atest WMShellFlickerTestsPip1:FromSplitScreenEnterPipOnUserLeaveHintTest`
+ * To run this test: `atest WMShellFlickerTestsPip:FromSplitScreenEnterPipOnUserLeaveHintTest`
  *
  * Actions:
  * ```
@@ -183,12 +183,6 @@
     }
 
     /** {@inheritDoc} */
-    @FlakyTest(bugId = 312446524)
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-
-    /** {@inheritDoc} */
     @Test
     @FlakyTest(bugId = 336510055)
     override fun entireScreenCovered() {
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/MovePipDownOnShelfHeightChange.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/MovePipDownOnShelfHeightChange.kt
index 265eb44..ee62cf5 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/MovePipDownOnShelfHeightChange.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/MovePipDownOnShelfHeightChange.kt
@@ -32,7 +32,7 @@
 /**
  * Test Pip movement with Launcher shelf height change (increase).
  *
- * To run this test: `atest WMShellFlickerTestsPip3:MovePipDownOnShelfHeightChange`
+ * To run this test: `atest WMShellFlickerTestsPip:MovePipDownOnShelfHeightChange`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/MovePipUpOnShelfHeightChangeTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/MovePipUpOnShelfHeightChangeTest.kt
index 8d6be64..4d643f7 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/MovePipUpOnShelfHeightChangeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/MovePipUpOnShelfHeightChangeTest.kt
@@ -32,7 +32,7 @@
 /**
  * Test Pip movement with Launcher shelf height change (decrease).
  *
- * To run this test: `atest WMShellFlickerTestsPip3:MovePipUpOnShelfHeightChangeTest`
+ * To run this test: `atest WMShellFlickerTestsPip:MovePipUpOnShelfHeightChangeTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ShowPipAndRotateDisplay.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ShowPipAndRotateDisplay.kt
index 9109eaf..c6cf341 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ShowPipAndRotateDisplay.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/ShowPipAndRotateDisplay.kt
@@ -35,7 +35,7 @@
 /**
  * Test Pip Stack in bounds after rotations.
  *
- * To run this test: `atest WMShellFlickerTestsPip1:ShowPipAndRotateDisplay`
+ * To run this test: `atest WMShellFlickerTestsPip:ShowPipAndRotateDisplay`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/MapsEnterPipTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/MapsEnterPipTest.kt
index 1fc9d99..7b04b76 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/MapsEnterPipTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/MapsEnterPipTest.kt
@@ -40,7 +40,7 @@
 /**
  * Test entering pip from Maps app by interacting with the app UI
  *
- * To run this test: `atest WMShellFlickerTests:MapsEnterPipTest`
+ * To run this test: `atest WMShellFlickerTestsPipAppsCSuite:MapsEnterPipTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/NetflixEnterPipTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/NetflixEnterPipTest.kt
index 68fa7c7..6911946 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/NetflixEnterPipTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/NetflixEnterPipTest.kt
@@ -38,7 +38,7 @@
 /**
  * Test entering pip from Netflix app by interacting with the app UI
  *
- * To run this test: `atest WMShellFlickerTests:NetflixEnterPipTest`
+ * To run this test: `atest WMShellFlickerTestsPipAppsCSuite:NetflixEnterPipTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/YouTubeEnterPipTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/YouTubeEnterPipTest.kt
index 7873a85..5e54f30 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/YouTubeEnterPipTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/YouTubeEnterPipTest.kt
@@ -34,7 +34,7 @@
 /**
  * Test entering pip from YouTube app by interacting with the app UI
  *
- * To run this test: `atest WMShellFlickerTests:YouTubeEnterPipTest`
+ * To run this test: `atest WMShellFlickerTestsPipAppsCSuite:YouTubeEnterPipTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/YouTubeEnterPipToOtherOrientationTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/YouTubeEnterPipToOtherOrientationTest.kt
index 72be3d8..159cba4 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/YouTubeEnterPipToOtherOrientationTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/YouTubeEnterPipToOtherOrientationTest.kt
@@ -38,7 +38,7 @@
 /**
  * Test entering pip from YouTube app by interacting with the app UI
  *
- * To run this test: `atest WMShellFlickerTests:YouTubeEnterPipTest`
+ * To run this test: `atest WMShellFlickerTestsPipAppsCSuite:YouTubeEnterPipTest`
  *
  * Actions:
  * ```
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/tv/TvPipBasicTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/tv/TvPipBasicTest.kt
index 8a073ab..6a84b28 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/tv/TvPipBasicTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/tv/TvPipBasicTest.kt
@@ -25,7 +25,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/** Test Pip Menu on TV. To run this test: `atest WMShellFlickerTests:TvPipBasicTest` */
+/** Test Pip Menu on TV. To run this test: `atest WMShellFlickerTestsPip:TvPipBasicTest` */
 @RequiresDevice
 @RunWith(Parameterized::class)
 class TvPipBasicTest(private val radioButtonId: String, private val pipWindowRatio: Rational?) :
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt
index d4cd6da..09e8745 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt
@@ -27,7 +27,7 @@
 import org.junit.Before
 import org.junit.Test
 
-/** Test Pip Menu on TV. To run this test: `atest WMShellFlickerTests:TvPipMenuTests` */
+/** Test Pip Menu on TV. To run this test: `atest WMShellFlickerTestsPip:TvPipMenuTests` */
 @RequiresDevice
 class TvPipMenuTests : TvPipTestBase() {
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
index 227060d..dee0b23 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
@@ -860,15 +860,9 @@
     }
 
     private void doMotionEvent(int actionDown, int coordinate) {
-        doMotionEvent(actionDown, coordinate, 0);
-    }
-
-    private void doMotionEvent(int actionDown, int coordinate, float velocity) {
         mController.onMotionEvent(
                 /* touchX */ coordinate,
                 /* touchY */ coordinate,
-                /* velocityX = */ velocity,
-                /* velocityY = */ velocity,
                 /* keyAction */ actionDown,
                 /* swipeEdge */ BackEvent.EDGE_LEFT);
     }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackProgressAnimatorTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackProgressAnimatorTest.java
index 9b019dd..1da4ef6 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackProgressAnimatorTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackProgressAnimatorTest.java
@@ -54,8 +54,6 @@
                 /* touchX = */ touchX,
                 /* touchY = */ 0,
                 /* progress = */ progress,
-                /* velocityX = */ 0,
-                /* velocityY = */ 0,
                 /* triggerBack = */ false,
                 /* swipeEdge = */ BackEvent.EDGE_LEFT,
                 /* departingAnimationTarget = */ null);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/CustomCrossActivityBackAnimationTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/CustomCrossActivityBackAnimationTest.kt
index 5b5ef6f..2235c20 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/CustomCrossActivityBackAnimationTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/CustomCrossActivityBackAnimationTest.kt
@@ -222,8 +222,6 @@
             /* touchX = */ touchX,
             /* touchY = */ 0f,
             /* progress = */ progress,
-            /* velocityX = */ 0f,
-            /* velocityY = */ 0f,
             /* triggerBack = */ false,
             /* swipeEdge = */ BackEvent.EDGE_LEFT,
             /* departingAnimationTarget = */ null
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayImeControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayImeControllerTest.java
index f8f0db9..0373bbd 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayImeControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayImeControllerTest.java
@@ -26,6 +26,8 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
@@ -34,6 +36,12 @@
 
 import android.graphics.Insets;
 import android.graphics.Point;
+import android.os.Looper;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.view.IWindowManager;
 import android.view.InsetsSource;
 import android.view.InsetsSourceControl;
 import android.view.InsetsState;
@@ -47,6 +55,7 @@
 import com.android.wm.shell.sysui.ShellInit;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -61,11 +70,16 @@
  */
 @SmallTest
 public class DisplayImeControllerTest extends ShellTestCase {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
 
     @Mock
     private SurfaceControl.Transaction mT;
     @Mock
     private ShellInit mShellInit;
+    @Mock
+    private IWindowManager mWm;
+    private DisplayImeController mDisplayImeController;
     private DisplayImeController.PerDisplay mPerDisplay;
     private Executor mExecutor;
 
@@ -73,7 +87,8 @@
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
         mExecutor = spy(Runnable::run);
-        mPerDisplay = new DisplayImeController(null, mShellInit, null, null, new TransactionPool() {
+        mDisplayImeController = new DisplayImeController(mWm, mShellInit, null, null,
+                new TransactionPool() {
             @Override
             public SurfaceControl.Transaction acquire() {
                 return mT;
@@ -84,8 +99,10 @@
             }
         }, mExecutor) {
             @Override
-            void removeImeSurface(int displayId) { }
-        }.new PerDisplay(DEFAULT_DISPLAY, ROTATION_0);
+            void removeImeSurface(int displayId) {
+            }
+        };
+        mPerDisplay = mDisplayImeController.new PerDisplay(DEFAULT_DISPLAY, ROTATION_0);
     }
 
     @Test
@@ -95,12 +112,14 @@
 
     @Test
     public void insetsControlChanged_schedulesNoWorkOnExecutor() {
+        Looper.prepare();
         mPerDisplay.insetsControlChanged(insetsStateWithIme(false), insetsSourceControl());
         verifyZeroInteractions(mExecutor);
     }
 
     @Test
     public void insetsChanged_schedulesNoWorkOnExecutor() {
+        Looper.prepare();
         mPerDisplay.insetsChanged(insetsStateWithIme(false));
         verifyZeroInteractions(mExecutor);
     }
@@ -117,7 +136,10 @@
         verifyZeroInteractions(mExecutor);
     }
 
+    // With the refactor, the control's isInitiallyVisible is used to apply to the IME, therefore
+    // this test is obsolete
     @Test
+    @RequiresFlagsDisabled(android.view.inputmethod.Flags.FLAG_REFACTOR_INSETS_CONTROLLER)
     public void reappliesVisibilityToChangedLeash() {
         verifyZeroInteractions(mT);
         mPerDisplay.mImeShowing = false;
@@ -136,6 +158,7 @@
 
     @Test
     public void insetsControlChanged_updateImeSourceControl() {
+        Looper.prepare();
         mPerDisplay.insetsControlChanged(insetsStateWithIme(false), insetsSourceControl());
         assertNotNull(mPerDisplay.mImeSourceControl);
 
@@ -143,6 +166,19 @@
         assertNull(mPerDisplay.mImeSourceControl);
     }
 
+    @Test
+    @RequiresFlagsEnabled(android.view.inputmethod.Flags.FLAG_REFACTOR_INSETS_CONTROLLER)
+    public void setImeInputTargetRequestedVisibility_invokeOnImeRequested() {
+        var mockPp = mock(DisplayImeController.ImePositionProcessor.class);
+        mDisplayImeController.addPositionProcessor(mockPp);
+
+        mPerDisplay.setImeInputTargetRequestedVisibility(true);
+        verify(mockPp).onImeRequested(anyInt(), eq(true));
+
+        mPerDisplay.setImeInputTargetRequestedVisibility(false);
+        verify(mockPp).onImeRequested(anyInt(), eq(false));
+    }
+
     private InsetsSourceControl[] insetsSourceControl() {
         return new InsetsSourceControl[]{
                 new InsetsSourceControl(
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java
index 177e47a..c52d9dd 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java
@@ -19,7 +19,7 @@
 import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
 import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
 
-import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_50_50;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -136,7 +136,7 @@
     @Test
     public void testSetDivideRatio() {
         mSplitLayout.setDividerPosition(200, false /* applyLayoutChange */);
-        mSplitLayout.setDivideRatio(SNAP_TO_50_50);
+        mSplitLayout.setDivideRatio(SNAP_TO_2_50_50);
         assertThat(mSplitLayout.getDividerPosition()).isEqualTo(
                 mSplitLayout.mDividerSnapAlgorithm.getMiddleTarget().position);
     }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandlerTest.kt
new file mode 100644
index 0000000..9b4cc17
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandlerTest.kt
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.desktopmode
+
+import android.app.ActivityManager.RunningTaskInfo
+import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD
+import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
+import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN
+import android.app.WindowConfiguration.WindowingMode
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper.RunWithLooper
+import android.view.SurfaceControl
+import android.view.WindowManager
+import android.window.TransitionInfo
+import androidx.test.filters.SmallTest
+import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.TestRunningTaskInfoBuilder
+import com.android.wm.shell.common.ShellExecutor
+import java.util.function.Supplier
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertNull
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.kotlin.mock
+
+/**
+ * Test class for [CloseDesktopTaskTransitionHandler]
+ *
+ * Usage: atest WMShellUnitTests:CloseDesktopTaskTransitionHandlerTest
+ */
+@SmallTest
+@RunWithLooper
+@RunWith(AndroidTestingRunner::class)
+class CloseDesktopTaskTransitionHandlerTest : ShellTestCase() {
+
+    @Mock lateinit var testExecutor: ShellExecutor
+    @Mock lateinit var closingTaskLeash: SurfaceControl
+
+    private val transactionSupplier = Supplier { mock<SurfaceControl.Transaction>() }
+
+    private lateinit var handler: CloseDesktopTaskTransitionHandler
+
+    @Before
+    fun setUp() {
+        handler =
+            CloseDesktopTaskTransitionHandler(
+                context,
+                testExecutor,
+                testExecutor,
+                transactionSupplier
+            )
+    }
+
+    @Test
+    fun handleRequest_returnsNull() {
+        assertNull(handler.handleRequest(mock(), mock()))
+    }
+
+    @Test
+    fun startAnimation_openTransition_returnsFalse() {
+        val animates =
+            handler.startAnimation(
+                transition = mock(),
+                info =
+                    createTransitionInfo(
+                        type = WindowManager.TRANSIT_OPEN,
+                        task = createTask(WINDOWING_MODE_FREEFORM)
+                    ),
+                startTransaction = mock(),
+                finishTransaction = mock(),
+                finishCallback = {}
+            )
+
+        assertFalse("Should not animate open transition", animates)
+    }
+
+    @Test
+    fun startAnimation_closeTransitionFullscreenTask_returnsFalse() {
+        val animates =
+            handler.startAnimation(
+                transition = mock(),
+                info = createTransitionInfo(task = createTask(WINDOWING_MODE_FULLSCREEN)),
+                startTransaction = mock(),
+                finishTransaction = mock(),
+                finishCallback = {}
+            )
+
+        assertFalse("Should not animate fullscreen task close transition", animates)
+    }
+
+    @Test
+    fun startAnimation_closeTransitionOpeningFreeformTask_returnsFalse() {
+        val animates =
+            handler.startAnimation(
+                transition = mock(),
+                info =
+                    createTransitionInfo(
+                        changeMode = WindowManager.TRANSIT_OPEN,
+                        task = createTask(WINDOWING_MODE_FREEFORM)
+                    ),
+                startTransaction = mock(),
+                finishTransaction = mock(),
+                finishCallback = {}
+            )
+
+        assertFalse("Should not animate opening freeform task close transition", animates)
+    }
+
+    @Test
+    fun startAnimation_closeTransitionClosingFreeformTask_returnsTrue() {
+        val animates =
+            handler.startAnimation(
+                transition = mock(),
+                info = createTransitionInfo(task = createTask(WINDOWING_MODE_FREEFORM)),
+                startTransaction = mock(),
+                finishTransaction = mock(),
+                finishCallback = {}
+            )
+
+        assertTrue("Should animate closing freeform task close transition", animates)
+    }
+
+    private fun createTransitionInfo(
+        type: Int = WindowManager.TRANSIT_CLOSE,
+        changeMode: Int = WindowManager.TRANSIT_CLOSE,
+        task: RunningTaskInfo
+    ): TransitionInfo =
+        TransitionInfo(type, 0 /* flags */).apply {
+            addChange(
+                TransitionInfo.Change(mock(), closingTaskLeash).apply {
+                    mode = changeMode
+                    parent = null
+                    taskInfo = task
+                }
+            )
+        }
+
+    private fun createTask(@WindowingMode windowingMode: Int): RunningTaskInfo =
+        TestRunningTaskInfoBuilder()
+            .setActivityType(ACTIVITY_TYPE_STANDARD)
+            .setWindowingMode(windowingMode)
+            .build()
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt
index 628c9cdd..3e9c732 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt
@@ -98,7 +98,7 @@
     private lateinit var mockitoSession: StaticMockitoSession
     private lateinit var handler: DesktopActivityOrientationChangeHandler
     private lateinit var shellInit: ShellInit
-    private lateinit var taskRepository: DesktopModeTaskRepository
+    private lateinit var taskRepository: DesktopRepository
     private lateinit var testScope: CoroutineScope
     // Mock running tasks are registered here so we can get the list from mock shell task organizer.
     private val runningTasks = mutableListOf<RunningTaskInfo>()
@@ -116,7 +116,7 @@
         testScope = CoroutineScope(Dispatchers.Unconfined + SupervisorJob())
         shellInit = spy(ShellInit(testExecutor))
         taskRepository =
-            DesktopModeTaskRepository(context, shellInit, persistentRepository, testScope)
+            DesktopRepository(context, shellInit, persistentRepository, testScope)
         whenever(shellTaskOrganizer.getRunningTasks(anyInt())).thenAnswer { runningTasks }
         whenever(transitions.startTransition(anyInt(), any(), isNull())).thenAnswer { Binder() }
         whenever(runBlocking { persistentRepository.readDesktop(any(), any()) }).thenReturn(
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt
new file mode 100644
index 0000000..cae6095
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.desktopmode
+
+import android.os.IBinder
+import android.testing.AndroidTestingRunner
+import android.view.SurfaceControl
+import android.view.WindowManager.TRANSIT_CHANGE
+import android.window.WindowContainerTransaction
+import androidx.test.filters.SmallTest
+import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.TestShellExecutor
+import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createFreeformTask
+import com.android.wm.shell.sysui.ShellInit
+import com.android.wm.shell.transition.Transitions
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.mock
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+/**
+ * Tests for [DesktopFullImmersiveTransitionHandler].
+ *
+ * Usage: atest WMShellUnitTests:DesktopFullImmersiveTransitionHandler
+ */
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() {
+
+    @Mock private lateinit var mockTransitions: Transitions
+    private lateinit var desktopRepository: DesktopRepository
+    private val transactionSupplier = { SurfaceControl.Transaction() }
+
+    private lateinit var immersiveHandler: DesktopFullImmersiveTransitionHandler
+
+    @Before
+    fun setUp() {
+        desktopRepository = DesktopRepository(
+            context, ShellInit(TestShellExecutor()), mock(), mock()
+        )
+        immersiveHandler = DesktopFullImmersiveTransitionHandler(
+            transitions = mockTransitions,
+            desktopRepository = desktopRepository,
+            transactionSupplier = transactionSupplier
+        )
+    }
+
+    @Test
+    fun enterImmersive_transitionReady_updatesRepository() {
+        val task = createFreeformTask()
+        val wct = WindowContainerTransaction()
+        val mockBinder = mock(IBinder::class.java)
+        whenever(mockTransitions.startTransition(TRANSIT_CHANGE, wct, immersiveHandler))
+            .thenReturn(mockBinder)
+        desktopRepository.setTaskInFullImmersiveState(
+            displayId = task.displayId,
+            taskId = task.taskId,
+            immersive = false
+        )
+
+        immersiveHandler.enterImmersive(task, wct)
+        immersiveHandler.onTransitionReady(mockBinder)
+
+        assertThat(desktopRepository.isTaskInFullImmersiveState(task.taskId)).isTrue()
+    }
+
+    @Test
+    fun exitImmersive_transitionReady_updatesRepository() {
+        val task = createFreeformTask()
+        val wct = WindowContainerTransaction()
+        val mockBinder = mock(IBinder::class.java)
+        whenever(mockTransitions.startTransition(TRANSIT_CHANGE, wct, immersiveHandler))
+            .thenReturn(mockBinder)
+        desktopRepository.setTaskInFullImmersiveState(
+            displayId = task.displayId,
+            taskId = task.taskId,
+            immersive = true
+        )
+
+        immersiveHandler.exitImmersive(task, wct)
+        immersiveHandler.onTransitionReady(mockBinder)
+
+        assertThat(desktopRepository.isTaskInFullImmersiveState(task.taskId)).isFalse()
+    }
+
+    @Test
+    fun enterImmersive_inProgress_ignores() {
+        val task = createFreeformTask()
+        val wct = WindowContainerTransaction()
+        val mockBinder = mock(IBinder::class.java)
+        whenever(mockTransitions.startTransition(TRANSIT_CHANGE, wct, immersiveHandler))
+            .thenReturn(mockBinder)
+
+        immersiveHandler.enterImmersive(task, wct)
+        immersiveHandler.enterImmersive(task, wct)
+
+        verify(mockTransitions, times(1)).startTransition(TRANSIT_CHANGE, wct, immersiveHandler)
+    }
+
+    @Test
+    fun exitImmersive_inProgress_ignores() {
+        val task = createFreeformTask()
+        val wct = WindowContainerTransaction()
+        val mockBinder = mock(IBinder::class.java)
+        whenever(mockTransitions.startTransition(TRANSIT_CHANGE, wct, immersiveHandler))
+            .thenReturn(mockBinder)
+
+        immersiveHandler.exitImmersive(task, wct)
+        immersiveHandler.exitImmersive(task, wct)
+
+        verify(mockTransitions, times(1)).startTransition(TRANSIT_CHANGE, wct, immersiveHandler)
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt
new file mode 100644
index 0000000..07de0716
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.desktopmode
+
+import android.app.ActivityManager.RunningTaskInfo
+import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD
+import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
+import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN
+import android.app.WindowConfiguration.WindowingMode
+import android.os.Handler
+import android.os.IBinder
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper.RunWithLooper
+import android.view.SurfaceControl
+import android.view.WindowManager
+import android.window.TransitionInfo
+import android.window.WindowContainerTransaction
+import androidx.test.filters.SmallTest
+import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE
+import com.android.internal.jank.InteractionJankMonitor
+import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.TestRunningTaskInfoBuilder
+import com.android.wm.shell.freeform.FreeformTaskTransitionHandler
+import com.android.wm.shell.transition.Transitions
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertNull
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.verify
+import org.mockito.kotlin.any
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
+
+/**
+ * Test class for [DesktopMixedTransitionHandler]
+ *
+ * Usage: atest WMShellUnitTests:DesktopMixedTransitionHandlerTest
+ */
+@SmallTest
+@RunWithLooper
+@RunWith(AndroidTestingRunner::class)
+class DesktopMixedTransitionHandlerTest : ShellTestCase() {
+
+    @Mock lateinit var transitions: Transitions
+    @Mock lateinit var desktopRepository: DesktopRepository
+    @Mock lateinit var freeformTaskTransitionHandler: FreeformTaskTransitionHandler
+    @Mock lateinit var closeDesktopTaskTransitionHandler: CloseDesktopTaskTransitionHandler
+    @Mock lateinit var interactionJankMonitor: InteractionJankMonitor
+    @Mock lateinit var mockHandler: Handler
+    @Mock lateinit var closingTaskLeash: SurfaceControl
+
+    private lateinit var mixedHandler: DesktopMixedTransitionHandler
+
+    @Before
+    fun setUp() {
+        mixedHandler =
+            DesktopMixedTransitionHandler(
+                context,
+                transitions,
+                desktopRepository,
+                freeformTaskTransitionHandler,
+                closeDesktopTaskTransitionHandler,
+                interactionJankMonitor,
+                mockHandler
+            )
+    }
+
+    @Test
+    fun startWindowingModeTransition_callsFreeformTaskTransitionHandler() {
+        val windowingMode = WINDOWING_MODE_FULLSCREEN
+        val wct = WindowContainerTransaction()
+
+        mixedHandler.startWindowingModeTransition(windowingMode, wct)
+
+        verify(freeformTaskTransitionHandler).startWindowingModeTransition(windowingMode, wct)
+    }
+
+    @Test
+    fun startMinimizedModeTransition_callsFreeformTaskTransitionHandler() {
+        val wct = WindowContainerTransaction()
+        whenever(freeformTaskTransitionHandler.startMinimizedModeTransition(any()))
+            .thenReturn(mock())
+
+        mixedHandler.startMinimizedModeTransition(wct)
+
+        verify(freeformTaskTransitionHandler).startMinimizedModeTransition(wct)
+    }
+
+    @Test
+    fun startRemoveTransition_startsCloseTransition() {
+        val wct = WindowContainerTransaction()
+
+        mixedHandler.startRemoveTransition(wct)
+
+        verify(transitions).startTransition(WindowManager.TRANSIT_CLOSE, wct, mixedHandler)
+    }
+
+    @Test
+    fun handleRequest_returnsNull() {
+        assertNull(mixedHandler.handleRequest(mock(), mock()))
+    }
+
+    @Test
+    fun startAnimation_withoutClosingDesktopTask_returnsFalse() {
+        val transition = mock<IBinder>()
+        val transitionInfo =
+            createTransitionInfo(
+                changeMode = WindowManager.TRANSIT_OPEN,
+                task = createTask(WINDOWING_MODE_FREEFORM)
+            )
+        whenever(freeformTaskTransitionHandler.startAnimation(any(), any(), any(), any(), any()))
+            .thenReturn(true)
+
+        val started = mixedHandler.startAnimation(
+            transition = transition,
+            info = transitionInfo,
+            startTransaction = mock(),
+            finishTransaction = mock(),
+            finishCallback = {}
+        )
+
+        assertFalse("Should not start animation without closing desktop task", started)
+    }
+
+    @Test
+    fun startAnimation_withClosingDesktopTask_callsCloseTaskHandler() {
+        val transition = mock<IBinder>()
+        val transitionInfo = createTransitionInfo(task = createTask(WINDOWING_MODE_FREEFORM))
+        whenever(desktopRepository.getActiveNonMinimizedTaskCount(any())).thenReturn(2)
+        whenever(
+                closeDesktopTaskTransitionHandler.startAnimation(any(), any(), any(), any(), any())
+            )
+            .thenReturn(true)
+
+        val started = mixedHandler.startAnimation(
+            transition = transition,
+            info = transitionInfo,
+            startTransaction = mock(),
+            finishTransaction = mock(),
+            finishCallback = {}
+        )
+
+        assertTrue("Should delegate animation to close transition handler", started)
+        verify(closeDesktopTaskTransitionHandler)
+            .startAnimation(eq(transition), eq(transitionInfo), any(), any(), any())
+    }
+
+    @Test
+    fun startAnimation_withClosingLastDesktopTask_dispatchesTransition() {
+        val transition = mock<IBinder>()
+        val transitionInfo = createTransitionInfo(task = createTask(WINDOWING_MODE_FREEFORM))
+        whenever(desktopRepository.getActiveNonMinimizedTaskCount(any())).thenReturn(1)
+        whenever(transitions.dispatchTransition(any(), any(), any(), any(), any(), any()))
+            .thenReturn(mock())
+
+        mixedHandler.startAnimation(
+            transition = transition,
+            info = transitionInfo,
+            startTransaction = mock(),
+            finishTransaction = mock(),
+            finishCallback = {}
+        )
+
+        verify(transitions)
+            .dispatchTransition(
+                eq(transition),
+                eq(transitionInfo),
+                any(),
+                any(),
+                any(),
+                eq(mixedHandler)
+            )
+        verify(interactionJankMonitor)
+            .begin(
+                closingTaskLeash,
+                context,
+                mockHandler,
+                CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE
+            )
+    }
+
+    private fun createTransitionInfo(
+        type: Int = WindowManager.TRANSIT_CLOSE,
+        changeMode: Int = WindowManager.TRANSIT_CLOSE,
+        task: RunningTaskInfo
+    ): TransitionInfo =
+        TransitionInfo(type, 0 /* flags */).apply {
+            addChange(
+                TransitionInfo.Change(mock(), closingTaskLeash).apply {
+                    mode = changeMode
+                    parent = null
+                    taskInfo = task
+                }
+            )
+        }
+
+    private fun createTask(@WindowingMode windowingMode: Int): RunningTaskInfo =
+        TestRunningTaskInfoBuilder()
+            .setActivityType(ACTIVITY_TYPE_STANDARD)
+            .setWindowingMode(windowingMode)
+            .build()
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeEventLoggerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeEventLoggerTest.kt
index ca97229..d7a132d 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeEventLoggerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeEventLoggerTest.kt
@@ -16,13 +16,22 @@
 
 package com.android.wm.shell.desktopmode
 
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
 import com.android.dx.mockito.inline.extended.ExtendedMockito.verify
 import com.android.internal.util.FrameworkStatsLog
 import com.android.modules.utils.testing.ExtendedMockitoRule
+import com.android.window.flags.Flags
+import com.android.wm.shell.EventLogTags
+import com.android.wm.shell.ShellTestCase
 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.EnterReason
 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ExitReason
 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.MinimizeReason
+import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger
+import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.InputMethod
 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.TaskUpdate
+import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.TaskSizeUpdate
 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UnminimizeReason
 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UNSET_MINIMIZE_REASON
 import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UNSET_UNMINIMIZE_REASON
@@ -34,14 +43,19 @@
 /**
  * Tests for [DesktopModeEventLogger].
  */
-class DesktopModeEventLoggerTest {
+class DesktopModeEventLoggerTest : ShellTestCase() {
 
     private val desktopModeEventLogger = DesktopModeEventLogger()
 
     @JvmField
-    @Rule
+    @Rule(order = 0)
     val extendedMockitoRule = ExtendedMockitoRule.Builder(this)
-            .mockStatic(FrameworkStatsLog::class.java).build()!!
+            .mockStatic(FrameworkStatsLog::class.java)
+            .mockStatic(EventLogTags::class.java).build()!!
+
+    @JvmField
+    @Rule(order = 1)
+    val setFlagsRule = SetFlagsRule()
 
     @Test
     fun logSessionEnter_enterReason() = runBlocking {
@@ -60,6 +74,11 @@
                 eq(SESSION_ID)
             )
         }
+        verify {
+            EventLogTags.writeWmShellEnterDesktopMode(
+                eq(EnterReason.UNKNOWN_ENTER.reason),
+                eq(SESSION_ID))
+        }
     }
 
     @Test
@@ -79,6 +98,11 @@
                 eq(SESSION_ID)
             )
         }
+        verify {
+            EventLogTags.writeWmShellExitDesktopMode(
+                eq(ExitReason.UNKNOWN_EXIT.reason),
+                eq(SESSION_ID))
+        }
     }
 
     @Test
@@ -108,6 +132,22 @@
                 /* visible_task_count */
                 eq(TASK_COUNT))
         }
+
+        verify {
+            EventLogTags.writeWmShellDesktopModeTaskUpdate(
+                eq(FrameworkStatsLog
+                    .DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_ADDED),
+                eq(TASK_UPDATE.instanceId),
+                eq(TASK_UPDATE.uid),
+                eq(TASK_UPDATE.taskHeight),
+                eq(TASK_UPDATE.taskWidth),
+                eq(TASK_UPDATE.taskX),
+                eq(TASK_UPDATE.taskY),
+                eq(SESSION_ID),
+                eq(UNSET_MINIMIZE_REASON),
+                eq(UNSET_UNMINIMIZE_REASON),
+                eq(TASK_COUNT))
+        }
     }
 
     @Test
@@ -137,6 +177,22 @@
                 /* visible_task_count */
                 eq(TASK_COUNT))
         }
+
+        verify {
+            EventLogTags.writeWmShellDesktopModeTaskUpdate(
+                eq(FrameworkStatsLog
+                    .DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_REMOVED),
+                eq(TASK_UPDATE.instanceId),
+                eq(TASK_UPDATE.uid),
+                eq(TASK_UPDATE.taskHeight),
+                eq(TASK_UPDATE.taskWidth),
+                eq(TASK_UPDATE.taskX),
+                eq(TASK_UPDATE.taskY),
+                eq(SESSION_ID),
+                eq(UNSET_MINIMIZE_REASON),
+                eq(UNSET_UNMINIMIZE_REASON),
+                eq(TASK_COUNT))
+        }
     }
 
     @Test
@@ -167,6 +223,22 @@
                 /* visible_task_count */
                 eq(TASK_COUNT))
         }
+
+        verify {
+            EventLogTags.writeWmShellDesktopModeTaskUpdate(
+                eq(FrameworkStatsLog
+                    .DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED),
+                eq(TASK_UPDATE.instanceId),
+                eq(TASK_UPDATE.uid),
+                eq(TASK_UPDATE.taskHeight),
+                eq(TASK_UPDATE.taskWidth),
+                eq(TASK_UPDATE.taskX),
+                eq(TASK_UPDATE.taskY),
+                eq(SESSION_ID),
+                eq(UNSET_MINIMIZE_REASON),
+                eq(UNSET_UNMINIMIZE_REASON),
+                eq(TASK_COUNT))
+        }
     }
 
     @Test
@@ -200,6 +272,22 @@
                 /* visible_task_count */
                 eq(TASK_COUNT))
         }
+
+        verify {
+            EventLogTags.writeWmShellDesktopModeTaskUpdate(
+                eq(FrameworkStatsLog
+                    .DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED),
+                eq(TASK_UPDATE.instanceId),
+                eq(TASK_UPDATE.uid),
+                eq(TASK_UPDATE.taskHeight),
+                eq(TASK_UPDATE.taskWidth),
+                eq(TASK_UPDATE.taskX),
+                eq(TASK_UPDATE.taskY),
+                eq(SESSION_ID),
+                eq(MinimizeReason.TASK_LIMIT.reason),
+                eq(UNSET_UNMINIMIZE_REASON),
+                eq(TASK_COUNT))
+        }
     }
 
     @Test
@@ -233,9 +321,83 @@
                 /* visible_task_count */
                 eq(TASK_COUNT))
         }
+
+        verify {
+            EventLogTags.writeWmShellDesktopModeTaskUpdate(
+                eq(FrameworkStatsLog
+                    .DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INFO_CHANGED),
+                eq(TASK_UPDATE.instanceId),
+                eq(TASK_UPDATE.uid),
+                eq(TASK_UPDATE.taskHeight),
+                eq(TASK_UPDATE.taskWidth),
+                eq(TASK_UPDATE.taskX),
+                eq(TASK_UPDATE.taskY),
+                eq(SESSION_ID),
+                eq(UNSET_MINIMIZE_REASON),
+                eq(UnminimizeReason.TASKBAR_TAP.reason),
+                eq(TASK_COUNT))
+        }
     }
 
-    companion object {
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_RESIZING_METRICS)
+    fun logTaskResizingStarted_logsTaskSizeUpdatedWithStartResizingStage() = runBlocking {
+        desktopModeEventLogger.logTaskResizingStarted(sessionId = SESSION_ID, createTaskSizeUpdate())
+
+        verify {
+            FrameworkStatsLog.write(eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED),
+                /* resize_trigger */
+                eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__UNKNOWN_RESIZE_TRIGGER),
+                /* resizing_stage */
+                eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__START_RESIZING_STAGE),
+                /* input_method */
+                eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__UNKNOWN_INPUT_METHOD),
+                /* desktop_mode_session_id */
+                eq(SESSION_ID),
+                /* instance_id */
+                eq(TASK_SIZE_UPDATE.instanceId),
+                /* uid */
+                eq(TASK_SIZE_UPDATE.uid),
+                /* task_height */
+                eq(TASK_SIZE_UPDATE.taskHeight),
+                /* task_width */
+                eq(TASK_SIZE_UPDATE.taskWidth),
+                /* display_area */
+                eq(TASK_SIZE_UPDATE.displayArea),
+            )
+        }
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_RESIZING_METRICS)
+    fun logTaskResizingEnded_logsTaskSizeUpdatedWithEndResizingStage() = runBlocking {
+        desktopModeEventLogger.logTaskResizingEnded(sessionId = SESSION_ID, createTaskSizeUpdate())
+
+        verify {
+            FrameworkStatsLog.write(eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED),
+                /* resize_trigger */
+                eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__UNKNOWN_RESIZE_TRIGGER),
+                /* resizing_stage */
+                eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__END_RESIZING_STAGE),
+                /* input_method */
+                eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__INPUT_METHOD__UNKNOWN_INPUT_METHOD),
+                /* desktop_mode_session_id */
+                eq(SESSION_ID),
+                /* instance_id */
+                eq(TASK_SIZE_UPDATE.instanceId),
+                /* uid */
+                eq(TASK_SIZE_UPDATE.uid),
+                /* task_height */
+                eq(TASK_SIZE_UPDATE.taskHeight),
+                /* task_width */
+                eq(TASK_SIZE_UPDATE.taskWidth),
+                /* display_area */
+                eq(TASK_SIZE_UPDATE.displayArea),
+            )
+        }
+    }
+
+    private companion object {
         private const val SESSION_ID = 1
         private const val TASK_ID = 1
         private const val TASK_UID = 1
@@ -244,16 +406,40 @@
         private const val TASK_HEIGHT = 100
         private const val TASK_WIDTH = 100
         private const val TASK_COUNT = 1
+        private const val DISPLAY_AREA = 1000
 
         private val TASK_UPDATE = TaskUpdate(
             TASK_ID, TASK_UID, TASK_HEIGHT, TASK_WIDTH, TASK_X, TASK_Y,
             visibleTaskCount = TASK_COUNT,
         )
 
+        private val TASK_SIZE_UPDATE = TaskSizeUpdate(
+            resizeTrigger = ResizeTrigger.UNKNOWN_RESIZE_TRIGGER,
+            inputMethod = InputMethod.UNKNOWN_INPUT_METHOD,
+            TASK_ID,
+            TASK_UID,
+            TASK_HEIGHT,
+            TASK_WIDTH,
+            DISPLAY_AREA,
+        )
+
+        private fun createTaskSizeUpdate(
+            resizeTrigger: ResizeTrigger = ResizeTrigger.UNKNOWN_RESIZE_TRIGGER,
+            inputMethod: InputMethod = InputMethod.UNKNOWN_INPUT_METHOD,
+        ) = TaskSizeUpdate(
+            resizeTrigger,
+            inputMethod,
+            TASK_ID,
+            TASK_UID,
+            TASK_HEIGHT,
+            TASK_WIDTH,
+            DISPLAY_AREA,
+        )
+
         private fun createTaskUpdate(
             minimizeReason: MinimizeReason? = null,
             unminimizeReason: UnminimizeReason? = null,
         ) = TaskUpdate(TASK_ID, TASK_UID, TASK_HEIGHT, TASK_WIDTH, TASK_X, TASK_Y, minimizeReason,
             unminimizeReason, TASK_COUNT)
     }
-}
\ No newline at end of file
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserverTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserverTest.kt
index d399b20..daf7e7d 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserverTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserverTest.kt
@@ -110,15 +110,20 @@
     shellInit = spy(ShellInit(testExecutor))
     desktopModeEventLogger = mock<DesktopModeEventLogger>()
 
-    transitionObserver =
-        DesktopModeLoggerTransitionObserver(
-            context, mockShellInit, transitions, desktopModeEventLogger)
-    if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-      val initRunnableCaptor = ArgumentCaptor.forClass(Runnable::class.java)
-      verify(mockShellInit).addInitCallback(initRunnableCaptor.capture(), same(transitionObserver))
-      initRunnableCaptor.value.run()
-    } else {
-      transitionObserver.onInit()
+    transitionObserver = DesktopModeLoggerTransitionObserver(
+        context, mockShellInit, transitions, desktopModeEventLogger)
+    val initRunnableCaptor = ArgumentCaptor.forClass(Runnable::class.java)
+    verify(mockShellInit).addInitCallback(initRunnableCaptor.capture(), same(transitionObserver))
+    initRunnableCaptor.value.run()
+  }
+
+  @Test
+  fun testInitialiseVisibleTasksSystemProperty() {
+    ExtendedMockito.verify {
+      SystemProperties.set(
+          eq(DesktopModeLoggerTransitionObserver.VISIBLE_TASKS_COUNTER_SYSTEM_PROPERTY),
+          eq(DesktopModeLoggerTransitionObserver
+              .VISIBLE_TASKS_COUNTER_SYSTEM_PROPERTY_DEFAULT_VALUE))
     }
   }
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepositoryTest.kt
deleted file mode 100644
index bc40d89..0000000
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepositoryTest.kt
+++ /dev/null
@@ -1,926 +0,0 @@
-/*
- * Copyright (C) 2022 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.wm.shell.desktopmode
-
-import android.graphics.Rect
-import android.platform.test.annotations.EnableFlags
-import android.testing.AndroidTestingRunner
-import android.util.ArraySet
-import android.view.Display.DEFAULT_DISPLAY
-import android.view.Display.INVALID_DISPLAY
-import androidx.test.filters.SmallTest
-import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE
-import com.android.wm.shell.ShellTestCase
-import com.android.wm.shell.TestShellExecutor
-import com.android.wm.shell.common.ShellExecutor
-import com.android.wm.shell.desktopmode.persistence.Desktop
-import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository
-import com.android.wm.shell.sysui.ShellInit
-import com.google.common.truth.Truth.assertThat
-import junit.framework.Assert.fail
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.runTest
-import kotlinx.coroutines.test.setMain
-import org.junit.After
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.Mockito.inOrder
-import org.mockito.Mockito.spy
-import org.mockito.kotlin.any
-import org.mockito.kotlin.never
-import org.mockito.kotlin.verify
-import org.mockito.kotlin.whenever
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
-@ExperimentalCoroutinesApi
-class DesktopModeTaskRepositoryTest : ShellTestCase() {
-
-    private lateinit var repo: DesktopModeTaskRepository
-    private lateinit var shellInit: ShellInit
-    private lateinit var datastoreScope: CoroutineScope
-
-    @Mock private lateinit var testExecutor: ShellExecutor
-    @Mock private lateinit var persistentRepository: DesktopPersistentRepository
-
-    @Before
-    fun setUp() {
-        Dispatchers.setMain(StandardTestDispatcher())
-        datastoreScope = CoroutineScope(Dispatchers.Unconfined + SupervisorJob())
-        shellInit = spy(ShellInit(testExecutor))
-
-        repo = DesktopModeTaskRepository(context, shellInit, persistentRepository, datastoreScope)
-        whenever(runBlocking { persistentRepository.readDesktop(any(), any()) }).thenReturn(
-            Desktop.getDefaultInstance()
-        )
-        shellInit.init()
-    }
-
-    @After
-    fun tearDown() {
-        datastoreScope.cancel()
-    }
-
-    @Test
-    fun addActiveTask_notifiesListener() {
-        val listener = TestListener()
-        repo.addActiveTaskListener(listener)
-
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
-
-        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(1)
-    }
-
-    @Test
-    fun addActiveTask_taskIsActive() {
-        val listener = TestListener()
-        repo.addActiveTaskListener(listener)
-
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
-
-        assertThat(repo.isActiveTask(1)).isTrue()
-    }
-
-    @Test
-    fun addSameActiveTaskTwice_notifiesOnce() {
-        val listener = TestListener()
-        repo.addActiveTaskListener(listener)
-
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
-
-        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(1)
-    }
-
-    @Test
-    fun addActiveTask_multipleTasksAdded_notifiesForAllTasks() {
-        val listener = TestListener()
-        repo.addActiveTaskListener(listener)
-
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 2)
-
-        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(2)
-    }
-
-    @Test
-    fun addActiveTask_multipleDisplays_notifiesCorrectListener() {
-        val listener = TestListener()
-        repo.addActiveTaskListener(listener)
-
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 2)
-        repo.addActiveTask(SECOND_DISPLAY, taskId = 3)
-
-        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(2)
-        assertThat(listener.activeChangesOnSecondaryDisplay).isEqualTo(1)
-    }
-
-    @Test
-    fun removeActiveTask_notifiesListener() {
-        val listener = TestListener()
-        repo.addActiveTaskListener(listener)
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
-
-        repo.removeActiveTask(1)
-
-        // Notify once for add and once for remove
-        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(2)
-    }
-
-    @Test
-    fun removeActiveTask_taskNotActive() {
-        val listener = TestListener()
-        repo.addActiveTaskListener(listener)
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
-
-        repo.removeActiveTask(1)
-
-        assertThat(repo.isActiveTask(1)).isFalse()
-    }
-
-    @Test
-    fun removeActiveTask_nonExistingTask_doesNotNotify() {
-        val listener = TestListener()
-        repo.addActiveTaskListener(listener)
-
-        repo.removeActiveTask(99)
-
-        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(0)
-    }
-
-    @Test
-    fun remoteActiveTask_listenerForOtherDisplayNotNotified() {
-        val listener = TestListener()
-        repo.addActiveTaskListener(listener)
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
-
-        repo.removeActiveTask(1)
-
-        assertThat(listener.activeChangesOnSecondaryDisplay).isEqualTo(0)
-        assertThat(repo.isActiveTask(1)).isFalse()
-    }
-
-    @Test
-    fun isActiveTask_nonExistingTask_returnsFalse() {
-        assertThat(repo.isActiveTask(99)).isFalse()
-    }
-
-    @Test
-    fun isOnlyVisibleNonClosingTask_noTasks_returnsFalse() {
-        // No visible tasks
-        assertThat(repo.isOnlyVisibleNonClosingTask(1)).isFalse()
-    }
-
-    @Test
-    fun isClosingTask_noTasks_returnsFalse() {
-        // No visible tasks
-        assertThat(repo.isClosingTask(1)).isFalse()
-    }
-
-    @Test
-    fun updateTaskVisibility_singleVisibleNonClosingTask_updatesTasksCorrectly() {
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-
-        assertThat(repo.isVisibleTask(1)).isTrue()
-        assertThat(repo.isClosingTask(1)).isFalse()
-        assertThat(repo.isOnlyVisibleNonClosingTask(1)).isTrue()
-
-        assertThat(repo.isVisibleTask(99)).isFalse()
-        assertThat(repo.isClosingTask(99)).isFalse()
-        assertThat(repo.isOnlyVisibleNonClosingTask(99)).isFalse()
-    }
-
-    @Test
-    fun isOnlyVisibleNonClosingTask_singleVisibleClosingTask() {
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-        repo.addClosingTask(DEFAULT_DISPLAY, 1)
-
-        // A visible task that's closing
-        assertThat(repo.isVisibleTask(1)).isTrue()
-        assertThat(repo.isClosingTask(1)).isTrue()
-        assertThat(repo.isOnlyVisibleNonClosingTask(1)).isFalse()
-        // Not a visible task
-        assertThat(repo.isVisibleTask(99)).isFalse()
-        assertThat(repo.isOnlyVisibleNonClosingTask(99)).isFalse()
-    }
-
-    @Test
-    fun isOnlyVisibleNonClosingTask_singleVisibleMinimizedTask() {
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-        repo.minimizeTask(DEFAULT_DISPLAY, 1)
-
-        // The visible task that's closing
-        assertThat(repo.isVisibleTask(1)).isTrue()
-        assertThat(repo.isMinimizedTask(1)).isTrue()
-        assertThat(repo.isOnlyVisibleNonClosingTask(1)).isFalse()
-        // Not a visible task
-        assertThat(repo.isVisibleTask(99)).isFalse()
-        assertThat(repo.isOnlyVisibleNonClosingTask(99)).isFalse()
-    }
-
-    @Test
-    fun isOnlyVisibleNonClosingTask_multipleVisibleNonClosingTasks() {
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = true)
-
-        // Not the only task
-        assertThat(repo.isVisibleTask(1)).isTrue()
-        assertThat(repo.isClosingTask(1)).isFalse()
-        assertThat(repo.isOnlyVisibleNonClosingTask(1)).isFalse()
-        // Not the only task
-        assertThat(repo.isVisibleTask(2)).isTrue()
-        assertThat(repo.isClosingTask(2)).isFalse()
-        assertThat(repo.isOnlyVisibleNonClosingTask(2)).isFalse()
-        // Not a visible task
-        assertThat(repo.isVisibleTask(99)).isFalse()
-        assertThat(repo.isClosingTask(99)).isFalse()
-        assertThat(repo.isOnlyVisibleNonClosingTask(99)).isFalse()
-    }
-
-    @Test
-    fun isOnlyVisibleNonClosingTask_multipleDisplays() {
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = true)
-        repo.updateTaskVisibility(SECOND_DISPLAY, taskId = 3, visible = true)
-
-        // Not the only task on DEFAULT_DISPLAY
-        assertThat(repo.isVisibleTask(1)).isTrue()
-        assertThat(repo.isOnlyVisibleNonClosingTask(1)).isFalse()
-        // Not the only task on DEFAULT_DISPLAY
-        assertThat(repo.isVisibleTask(2)).isTrue()
-        assertThat(repo.isOnlyVisibleNonClosingTask(2)).isFalse()
-        // The only visible task on SECOND_DISPLAY
-        assertThat(repo.isVisibleTask(3)).isTrue()
-        assertThat(repo.isOnlyVisibleNonClosingTask(3)).isTrue()
-        // Not a visible task
-        assertThat(repo.isVisibleTask(99)).isFalse()
-        assertThat(repo.isOnlyVisibleNonClosingTask(99)).isFalse()
-    }
-
-    @Test
-    fun addVisibleTasksListener_notifiesVisibleFreeformTask() {
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-        val listener = TestVisibilityListener()
-        val executor = TestShellExecutor()
-
-        repo.addVisibleTasksListener(listener, executor)
-        executor.flushAll()
-
-        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(1)
-        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(1)
-    }
-
-    @Test
-    fun addListener_tasksOnDifferentDisplay_doesNotNotify() {
-        repo.updateTaskVisibility(SECOND_DISPLAY, taskId = 1, visible = true)
-        val listener = TestVisibilityListener()
-        val executor = TestShellExecutor()
-        repo.addVisibleTasksListener(listener, executor)
-        executor.flushAll()
-
-        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(0)
-        // One call as adding listener notifies it
-        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(0)
-    }
-
-    @Test
-    fun updateTaskVisibility_addVisibleTasksNotifiesListener() {
-        val listener = TestVisibilityListener()
-        val executor = TestShellExecutor()
-        repo.addVisibleTasksListener(listener, executor)
-
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = true)
-        executor.flushAll()
-
-        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(2)
-        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(2)
-    }
-
-    @Test
-    fun updateTaskVisibility_addVisibleTaskNotifiesListenerForThatDisplay() {
-        val listener = TestVisibilityListener()
-        val executor = TestShellExecutor()
-        repo.addVisibleTasksListener(listener, executor)
-
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-        executor.flushAll()
-
-        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(1)
-        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(1)
-        assertThat(listener.visibleTasksCountOnSecondaryDisplay).isEqualTo(0)
-        assertThat(listener.visibleChangesOnSecondaryDisplay).isEqualTo(0)
-
-        repo.updateTaskVisibility(displayId = 1, taskId = 2, visible = true)
-        executor.flushAll()
-
-        // Listener for secondary display is notified
-        assertThat(listener.visibleTasksCountOnSecondaryDisplay).isEqualTo(1)
-        assertThat(listener.visibleChangesOnSecondaryDisplay).isEqualTo(1)
-        // No changes to listener for default display
-        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(1)
-    }
-
-    @Test
-    fun updateTaskVisibility_taskOnDefaultBecomesVisibleOnSecondDisplay_listenersNotified() {
-        val listener = TestVisibilityListener()
-        val executor = TestShellExecutor()
-        repo.addVisibleTasksListener(listener, executor)
-
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-        executor.flushAll()
-        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(1)
-
-        // Mark task 1 visible on secondary display
-        repo.updateTaskVisibility(displayId = 1, taskId = 1, visible = true)
-        executor.flushAll()
-
-        // Default display should have 2 calls
-        // 1 - visible task added
-        // 2 - visible task removed
-        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(2)
-        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(0)
-
-        // Secondary display should have 1 call for visible task added
-        assertThat(listener.visibleChangesOnSecondaryDisplay).isEqualTo(1)
-        assertThat(listener.visibleTasksCountOnSecondaryDisplay).isEqualTo(1)
-    }
-
-    @Test
-    fun updateTaskVisibility_removeVisibleTasksNotifiesListener() {
-        val listener = TestVisibilityListener()
-        val executor = TestShellExecutor()
-        repo.addVisibleTasksListener(listener, executor)
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = true)
-        executor.flushAll()
-
-        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(2)
-
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = false)
-        executor.flushAll()
-
-        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(3)
-
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = false)
-        executor.flushAll()
-
-        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(0)
-        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(4)
-    }
-
-    /**
-     * When a task vanishes, the displayId of the task is set to INVALID_DISPLAY.
-     * This tests that task is removed from the last parent display when it vanishes.
-     */
-    @Test
-    fun updateTaskVisibility_removeVisibleTasksRemovesTaskWithInvalidDisplay() {
-        val listener = TestVisibilityListener()
-        val executor = TestShellExecutor()
-        repo.addVisibleTasksListener(listener, executor)
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = true)
-        executor.flushAll()
-
-        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(2)
-
-        repo.updateTaskVisibility(INVALID_DISPLAY, taskId = 1, visible = false)
-        executor.flushAll()
-
-        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(3)
-        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(1)
-    }
-
-    @Test
-    fun getVisibleTaskCount_defaultDisplay_returnsCorrectCount() {
-        // No tasks, count is 0
-        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(0)
-
-        // New task increments count to 1
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-
-        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(1)
-
-        // Visibility update to same task does not increase count
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-
-        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(1)
-
-        // Second task visible increments count
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = true)
-
-        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(2)
-
-        // Hiding a task decrements count
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = false)
-        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(1)
-
-        // Hiding all tasks leaves count at 0
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = false)
-        assertThat(repo.getVisibleTaskCount(displayId = 9)).isEqualTo(0)
-
-        // Hiding a not existing task, count remains at 0
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 999, visible = false)
-        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(0)
-    }
-
-    @Test
-    fun getVisibleTaskCount_multipleDisplays_returnsCorrectCount() {
-        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(0)
-        assertThat(repo.getVisibleTaskCount(SECOND_DISPLAY)).isEqualTo(0)
-
-        // New task on default display increments count for that display only
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
-
-        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(1)
-        assertThat(repo.getVisibleTaskCount(SECOND_DISPLAY)).isEqualTo(0)
-
-        // New task on secondary display, increments count for that display only
-        repo.updateTaskVisibility(SECOND_DISPLAY, taskId = 2, visible = true)
-
-        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(1)
-        assertThat(repo.getVisibleTaskCount(SECOND_DISPLAY)).isEqualTo(1)
-
-        // Marking task visible on another display, updates counts for both displays
-        repo.updateTaskVisibility(SECOND_DISPLAY, taskId = 1, visible = true)
-
-        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(0)
-        assertThat(repo.getVisibleTaskCount(SECOND_DISPLAY)).isEqualTo(2)
-
-        // Marking task that is on secondary display, hidden on default display, does not affect
-        // secondary display
-        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = false)
-
-        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(0)
-        assertThat(repo.getVisibleTaskCount(SECOND_DISPLAY)).isEqualTo(2)
-
-        // Hiding a task on that display, decrements count
-        repo.updateTaskVisibility(SECOND_DISPLAY, taskId = 1, visible = false)
-
-        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(0)
-        assertThat(repo.getVisibleTaskCount(SECOND_DISPLAY)).isEqualTo(1)
-    }
-
-    @Test
-    fun addOrMoveFreeformTaskToTop_didNotExist_addsToTop() {
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5)
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7)
-
-        val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
-        assertThat(tasks.size).isEqualTo(3)
-        assertThat(tasks[0]).isEqualTo(7)
-        assertThat(tasks[1]).isEqualTo(6)
-        assertThat(tasks[2]).isEqualTo(5)
-    }
-
-    @Test
-    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE)
-    fun addOrMoveFreeformTaskToTop_noTaskExists_persistenceEnabled_addsToTop() =
-        runTest(StandardTestDispatcher()) {
-            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5)
-            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
-            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7)
-
-            val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
-            assertThat(tasks).containsExactly(7, 6, 5).inOrder()
-            inOrder(persistentRepository).run {
-                verify(persistentRepository)
-                    .addOrUpdateDesktop(
-                        DEFAULT_USER_ID,
-                        DEFAULT_DESKTOP_ID,
-                        visibleTasks = ArraySet(),
-                        minimizedTasks = ArraySet(),
-                        freeformTasksInZOrder = arrayListOf(5)
-                    )
-                verify(persistentRepository)
-                    .addOrUpdateDesktop(
-                        DEFAULT_USER_ID,
-                        DEFAULT_DESKTOP_ID,
-                        visibleTasks = ArraySet(),
-                        minimizedTasks = ArraySet(),
-                        freeformTasksInZOrder = arrayListOf(6, 5)
-                    )
-                verify(persistentRepository)
-                    .addOrUpdateDesktop(
-                        DEFAULT_USER_ID,
-                        DEFAULT_DESKTOP_ID,
-                        visibleTasks = ArraySet(),
-                        minimizedTasks = ArraySet(),
-                        freeformTasksInZOrder = arrayListOf(7, 6, 5)
-                    )
-            }
-    }
-
-    @Test
-    fun addOrMoveFreeformTaskToTop_alreadyExists_movesToTop() {
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5)
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7)
-
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
-
-        val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
-        assertThat(tasks.size).isEqualTo(3)
-        assertThat(tasks.first()).isEqualTo(6)
-    }
-
-    @Test
-    fun addOrMoveFreeformTaskToTop_taskIsMinimized_unminimizesTask() {
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5)
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7)
-        repo.minimizeTask(displayId = 0, taskId = 6)
-
-        val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
-        assertThat(tasks).containsExactly(7, 6, 5).inOrder()
-        assertThat(repo.isMinimizedTask(taskId = 6)).isTrue()
-    }
-
-    @Test
-    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE)
-    fun minimizeTask_persistenceEnabled_taskIsPersistedAsMinimized() =
-        runTest(StandardTestDispatcher()) {
-            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5)
-            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
-            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7)
-
-            repo.minimizeTask(displayId = 0, taskId = 6)
-
-            val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
-            assertThat(tasks).containsExactly(7, 6, 5).inOrder()
-            assertThat(repo.isMinimizedTask(taskId = 6)).isTrue()
-            inOrder(persistentRepository).run {
-                verify(persistentRepository)
-                    .addOrUpdateDesktop(
-                        DEFAULT_USER_ID,
-                        DEFAULT_DESKTOP_ID,
-                        visibleTasks = ArraySet(),
-                        minimizedTasks = ArraySet(),
-                        freeformTasksInZOrder = arrayListOf(5)
-                    )
-                verify(persistentRepository)
-                    .addOrUpdateDesktop(
-                        DEFAULT_USER_ID,
-                        DEFAULT_DESKTOP_ID,
-                        visibleTasks = ArraySet(),
-                        minimizedTasks = ArraySet(),
-                        freeformTasksInZOrder = arrayListOf(6, 5)
-                    )
-                verify(persistentRepository)
-                    .addOrUpdateDesktop(
-                        DEFAULT_USER_ID,
-                        DEFAULT_DESKTOP_ID,
-                        visibleTasks = ArraySet(),
-                        minimizedTasks = ArraySet(),
-                        freeformTasksInZOrder = arrayListOf(7, 6, 5)
-                    )
-                verify(persistentRepository)
-                    .addOrUpdateDesktop(
-                        DEFAULT_USER_ID,
-                        DEFAULT_DESKTOP_ID,
-                        visibleTasks = ArraySet(),
-                        minimizedTasks = ArraySet(arrayOf(6)),
-                        freeformTasksInZOrder = arrayListOf(7, 6, 5)
-                    )
-            }
-    }
-
-    @Test
-    fun addOrMoveFreeformTaskToTop_taskIsUnminimized_noop() {
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5)
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7)
-
-        val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
-        assertThat(tasks).containsExactly(7, 6, 5).inOrder()
-        assertThat(repo.isMinimizedTask(taskId = 6)).isFalse()
-    }
-
-    @Test
-    fun removeFreeformTask_invalidDisplay_removesTaskFromFreeformTasks() {
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1)
-
-        repo.removeFreeformTask(INVALID_DISPLAY, taskId = 1)
-
-        val invalidDisplayTasks = repo.getFreeformTasksInZOrder(INVALID_DISPLAY)
-        assertThat(invalidDisplayTasks).isEmpty()
-        val validDisplayTasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
-        assertThat(validDisplayTasks).isEmpty()
-    }
-
-    @Test
-    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE)
-    fun removeFreeformTask_invalidDisplay_persistenceEnabled_removesTaskFromFreeformTasks() {
-        runTest(StandardTestDispatcher()) {
-            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1)
-
-            repo.removeFreeformTask(INVALID_DISPLAY, taskId = 1)
-
-            verify(persistentRepository)
-                .addOrUpdateDesktop(
-                    DEFAULT_USER_ID,
-                    DEFAULT_DESKTOP_ID,
-                    visibleTasks = ArraySet(),
-                    minimizedTasks = ArraySet(),
-                    freeformTasksInZOrder = arrayListOf(1)
-                )
-            verify(persistentRepository)
-                .addOrUpdateDesktop(
-                    DEFAULT_USER_ID,
-                    DEFAULT_DESKTOP_ID,
-                    visibleTasks = ArraySet(),
-                    minimizedTasks = ArraySet(),
-                    freeformTasksInZOrder = ArrayList()
-                )
-        }
-    }
-
-    @Test
-    fun removeFreeformTask_validDisplay_removesTaskFromFreeformTasks() {
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1)
-
-        repo.removeFreeformTask(DEFAULT_DISPLAY, taskId = 1)
-
-        val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
-        assertThat(tasks).isEmpty()
-    }
-
-    @Test
-    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE)
-    fun removeFreeformTask_validDisplay_persistenceEnabled_removesTaskFromFreeformTasks() {
-        runTest(StandardTestDispatcher()) {
-            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1)
-
-            repo.removeFreeformTask(DEFAULT_DISPLAY, taskId = 1)
-
-            verify(persistentRepository)
-                .addOrUpdateDesktop(
-                    DEFAULT_USER_ID,
-                    DEFAULT_DESKTOP_ID,
-                    visibleTasks = ArraySet(),
-                    minimizedTasks = ArraySet(),
-                    freeformTasksInZOrder = arrayListOf(1)
-                )
-            verify(persistentRepository)
-                .addOrUpdateDesktop(
-                    DEFAULT_USER_ID,
-                    DEFAULT_DESKTOP_ID,
-                    visibleTasks = ArraySet(),
-                    minimizedTasks = ArraySet(),
-                    freeformTasksInZOrder = ArrayList()
-                )
-        }
-    }
-
-    @Test
-    fun removeFreeformTask_validDisplay_differentDisplay_doesNotRemovesTask() {
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1)
-
-        repo.removeFreeformTask(SECOND_DISPLAY, taskId = 1)
-
-        val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
-        assertThat(tasks).containsExactly(1)
-    }
-
-    @Test
-    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE)
-    fun removeFreeformTask_validDisplayButDifferentDisplay_persistenceEnabled_doesNotRemoveTask() {
-        runTest(StandardTestDispatcher()) {
-            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1)
-
-            repo.removeFreeformTask(SECOND_DISPLAY, taskId = 1)
-
-            verify(persistentRepository)
-                .addOrUpdateDesktop(
-                    DEFAULT_USER_ID,
-                    DEFAULT_DESKTOP_ID,
-                    visibleTasks = ArraySet(),
-                    minimizedTasks = ArraySet(),
-                    freeformTasksInZOrder = arrayListOf(1)
-                )
-            verify(persistentRepository, never())
-                .addOrUpdateDesktop(
-                    DEFAULT_USER_ID,
-                    DEFAULT_DESKTOP_ID,
-                    visibleTasks = ArraySet(),
-                    minimizedTasks = ArraySet(),
-                    freeformTasksInZOrder = ArrayList()
-                )
-        }
-    }
-
-    @Test
-    fun removeFreeformTask_removesTaskBoundsBeforeMaximize() {
-        val taskId = 1
-        repo.addActiveTask(THIRD_DISPLAY, taskId)
-        repo.addOrMoveFreeformTaskToTop(THIRD_DISPLAY, taskId)
-        repo.saveBoundsBeforeMaximize(taskId, Rect(0, 0, 200, 200))
-
-        repo.removeFreeformTask(THIRD_DISPLAY, taskId)
-
-        assertThat(repo.removeBoundsBeforeMaximize(taskId)).isNull()
-    }
-
-    @Test
-    fun removeFreeformTask_removesActiveTask() {
-        val taskId = 1
-        val listener = TestListener()
-        repo.addActiveTaskListener(listener)
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId)
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId)
-
-        repo.removeFreeformTask(THIRD_DISPLAY, taskId)
-
-        assertThat(repo.isActiveTask(taskId)).isFalse()
-        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(2)
-    }
-
-    @Test
-    fun removeFreeformTask_unminimizesTask() {
-        val taskId = 1
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId)
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId)
-        repo.minimizeTask(DEFAULT_DISPLAY, taskId)
-
-        repo.removeFreeformTask(DEFAULT_DISPLAY, taskId)
-
-        assertThat(repo.isMinimizedTask(taskId)).isFalse()
-    }
-
-    @Test
-    fun removeFreeformTask_updatesTaskVisibility() {
-        val taskId = 1
-        repo.addActiveTask(DEFAULT_DISPLAY, taskId)
-        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId)
-
-        repo.removeFreeformTask(THIRD_DISPLAY, taskId)
-
-        assertThat(repo.isVisibleTask(taskId)).isFalse()
-    }
-
-    @Test
-    fun saveBoundsBeforeMaximize_boundsSavedByTaskId() {
-        val taskId = 1
-        val bounds = Rect(0, 0, 200, 200)
-
-        repo.saveBoundsBeforeMaximize(taskId, bounds)
-
-        assertThat(repo.removeBoundsBeforeMaximize(taskId)).isEqualTo(bounds)
-    }
-
-    @Test
-    fun removeBoundsBeforeMaximize_returnsNullAfterBoundsRemoved() {
-        val taskId = 1
-        val bounds = Rect(0, 0, 200, 200)
-        repo.saveBoundsBeforeMaximize(taskId, bounds)
-        repo.removeBoundsBeforeMaximize(taskId)
-
-        val boundsBeforeMaximize = repo.removeBoundsBeforeMaximize(taskId)
-
-        assertThat(boundsBeforeMaximize).isNull()
-    }
-
-    @Test
-    fun isMinimizedTask_minimizeTaskNotCalled_noTasksMinimized() {
-        assertThat(repo.isMinimizedTask(taskId = 0)).isFalse()
-        assertThat(repo.isMinimizedTask(taskId = 1)).isFalse()
-    }
-
-    @Test
-    fun minimizeTask_minimizesCorrectTask() {
-        repo.minimizeTask(displayId = 0, taskId = 0)
-
-        assertThat(repo.isMinimizedTask(taskId = 0)).isTrue()
-        assertThat(repo.isMinimizedTask(taskId = 1)).isFalse()
-        assertThat(repo.isMinimizedTask(taskId = 2)).isFalse()
-    }
-
-    @Test
-    fun unminimizeTask_unminimizesTask() {
-        repo.minimizeTask(displayId = 0, taskId = 0)
-
-        repo.unminimizeTask(displayId = 0, taskId = 0)
-
-        assertThat(repo.isMinimizedTask(taskId = 0)).isFalse()
-        assertThat(repo.isMinimizedTask(taskId = 1)).isFalse()
-        assertThat(repo.isMinimizedTask(taskId = 2)).isFalse()
-    }
-
-    @Test
-    fun unminimizeTask_nonExistentTask_doesntCrash() {
-        repo.unminimizeTask(displayId = 0, taskId = 0)
-
-        // No change
-        assertThat(repo.isMinimizedTask(taskId = 0)).isFalse()
-        assertThat(repo.isMinimizedTask(taskId = 1)).isFalse()
-        assertThat(repo.isMinimizedTask(taskId = 2)).isFalse()
-    }
-
-
-    @Test
-    fun updateTaskVisibility_minimizedTaskBecomesVisible_unminimizesTask() {
-        repo.minimizeTask(displayId = 10, taskId = 2)
-        repo.updateTaskVisibility(displayId = 10, taskId = 2, visible = true)
-
-        val isMinimizedTask = repo.isMinimizedTask(taskId = 2)
-
-        assertThat(isMinimizedTask).isFalse()
-    }
-
-    @Test
-    fun getActiveNonMinimizedOrderedTasks_returnsFreeformTasksInCorrectOrder() {
-        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 1)
-        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 2)
-        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 3)
-        // The front-most task will be the one added last through `addOrMoveFreeformTaskToTop`
-        repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 3)
-        repo.addOrMoveFreeformTaskToTop(displayId = 0, taskId = 2)
-        repo.addOrMoveFreeformTaskToTop(displayId = 0, taskId = 1)
-
-        val tasks = repo.getActiveNonMinimizedOrderedTasks(displayId = 0)
-
-        assertThat(tasks).containsExactly(1, 2, 3).inOrder()
-    }
-
-    @Test
-    fun getActiveNonMinimizedOrderedTasks_excludesMinimizedTasks() {
-        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 1)
-        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 2)
-        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 3)
-        // The front-most task will be the one added last through `addOrMoveFreeformTaskToTop`
-        repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 3)
-        repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 2)
-        repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 1)
-        repo.minimizeTask(displayId = DEFAULT_DISPLAY, taskId = 2)
-
-        val tasks = repo.getActiveNonMinimizedOrderedTasks(displayId = DEFAULT_DISPLAY)
-
-        assertThat(tasks).containsExactly(1, 3).inOrder()
-    }
-
-
-    class TestListener : DesktopModeTaskRepository.ActiveTasksListener {
-        var activeChangesOnDefaultDisplay = 0
-        var activeChangesOnSecondaryDisplay = 0
-        override fun onActiveTasksChanged(displayId: Int) {
-            when (displayId) {
-                DEFAULT_DISPLAY -> activeChangesOnDefaultDisplay++
-                SECOND_DISPLAY -> activeChangesOnSecondaryDisplay++
-                else -> fail("Active task listener received unexpected display id: $displayId")
-            }
-        }
-    }
-
-    class TestVisibilityListener : DesktopModeTaskRepository.VisibleTasksListener {
-        var visibleTasksCountOnDefaultDisplay = 0
-        var visibleTasksCountOnSecondaryDisplay = 0
-
-        var visibleChangesOnDefaultDisplay = 0
-        var visibleChangesOnSecondaryDisplay = 0
-
-        override fun onTasksVisibilityChanged(displayId: Int, visibleTasksCount: Int) {
-            when (displayId) {
-                DEFAULT_DISPLAY -> {
-                    visibleTasksCountOnDefaultDisplay = visibleTasksCount
-                    visibleChangesOnDefaultDisplay++
-                }
-                SECOND_DISPLAY -> {
-                    visibleTasksCountOnSecondaryDisplay = visibleTasksCount
-                    visibleChangesOnSecondaryDisplay++
-                }
-                else -> fail("Visible task listener received unexpected display id: $displayId")
-            }
-        }
-    }
-
-    companion object {
-        const val SECOND_DISPLAY = 1
-        const val THIRD_DISPLAY = 345
-        private const val DEFAULT_USER_ID = 1000
-        private const val DEFAULT_DESKTOP_ID = 0
-    }
-}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicatorTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicatorTest.kt
index 2b7f86f..935e6d0 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicatorTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicatorTest.kt
@@ -17,8 +17,8 @@
 package com.android.wm.shell.desktopmode
 
 import android.app.ActivityManager.RunningTaskInfo
+import android.graphics.PointF
 import android.graphics.Rect
-import android.graphics.Region
 import android.testing.AndroidTestingRunner
 import android.view.SurfaceControl
 import androidx.test.filters.SmallTest
@@ -33,6 +33,7 @@
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
 import org.mockito.Mock
 import org.mockito.kotlin.whenever
 
@@ -58,13 +59,15 @@
         whenever(displayLayout.width()).thenReturn(DISPLAY_BOUNDS.width())
         whenever(displayLayout.height()).thenReturn(DISPLAY_BOUNDS.height())
         whenever(displayLayout.stableInsets()).thenReturn(STABLE_INSETS)
+        whenever(displayController.getDisplayLayout(anyInt())).thenReturn(displayLayout)
     }
 
     @Test
     fun testFullscreenRegionCalculation() {
         createVisualIndicator(DesktopModeVisualIndicator.DragStartState.FROM_FULLSCREEN)
         var testRegion = visualIndicator.calculateFullscreenRegion(displayLayout, CAPTION_HEIGHT)
-        assertThat(testRegion.bounds).isEqualTo(Rect(0, -50, 2400, 2 * STABLE_INSETS.top))
+        assertThat(testRegion.bounds).isEqualTo(Rect(0, Short.MIN_VALUE.toInt(), 2400,
+            2 * STABLE_INSETS.top))
 
         createVisualIndicator(DesktopModeVisualIndicator.DragStartState.FROM_FREEFORM)
         testRegion = visualIndicator.calculateFullscreenRegion(displayLayout, CAPTION_HEIGHT)
@@ -75,17 +78,19 @@
         val toFullscreenWidth = displayLayout.width() * toFullscreenScale
         assertThat(testRegion.bounds).isEqualTo(Rect(
             (DISPLAY_BOUNDS.width() / 2f - toFullscreenWidth / 2f).toInt(),
-            -50,
+            Short.MIN_VALUE.toInt(),
             (DISPLAY_BOUNDS.width() / 2f + toFullscreenWidth / 2f).toInt(),
             transitionHeight))
 
         createVisualIndicator(DesktopModeVisualIndicator.DragStartState.FROM_SPLIT)
         testRegion = visualIndicator.calculateFullscreenRegion(displayLayout, CAPTION_HEIGHT)
-        assertThat(testRegion.bounds).isEqualTo(Rect(0, -50, 2400, 2 * STABLE_INSETS.top))
+        assertThat(testRegion.bounds).isEqualTo(Rect(0, Short.MIN_VALUE.toInt(), 2400,
+            2 * STABLE_INSETS.top))
 
         createVisualIndicator(DesktopModeVisualIndicator.DragStartState.DRAGGED_INTENT)
         testRegion = visualIndicator.calculateFullscreenRegion(displayLayout, CAPTION_HEIGHT)
-        assertThat(testRegion.bounds).isEqualTo(Rect(0, -50, 2400, transitionHeight))
+        assertThat(testRegion.bounds).isEqualTo(Rect(0, Short.MIN_VALUE.toInt(), 2400,
+            transitionHeight))
     }
 
     @Test
@@ -133,22 +138,19 @@
     }
 
     @Test
-    fun testToDesktopRegionCalculation() {
+    fun testDefaultIndicators() {
         createVisualIndicator(DesktopModeVisualIndicator.DragStartState.FROM_FULLSCREEN)
-        val fullscreenRegion = visualIndicator.calculateFullscreenRegion(displayLayout,
-            CAPTION_HEIGHT)
-        val splitLeftRegion = visualIndicator.calculateSplitLeftRegion(displayLayout,
-            TRANSITION_AREA_WIDTH, CAPTION_HEIGHT)
-        val splitRightRegion = visualIndicator.calculateSplitRightRegion(displayLayout,
-            TRANSITION_AREA_WIDTH, CAPTION_HEIGHT)
-        val desktopRegion = visualIndicator.calculateToDesktopRegion(displayLayout,
-            splitLeftRegion, splitRightRegion, fullscreenRegion)
-        var testRegion = Region()
-        testRegion.union(DISPLAY_BOUNDS)
-        testRegion.op(splitLeftRegion, Region.Op.DIFFERENCE)
-        testRegion.op(splitRightRegion, Region.Op.DIFFERENCE)
-        testRegion.op(fullscreenRegion, Region.Op.DIFFERENCE)
-        assertThat(desktopRegion).isEqualTo(testRegion)
+        var result = visualIndicator.updateIndicatorType(PointF(-10000f, 500f))
+        assertThat(result).isEqualTo(DesktopModeVisualIndicator.IndicatorType.TO_SPLIT_LEFT_INDICATOR)
+        createVisualIndicator(DesktopModeVisualIndicator.DragStartState.FROM_SPLIT)
+        result = visualIndicator.updateIndicatorType(PointF(10000f, 500f))
+        assertThat(result).isEqualTo(DesktopModeVisualIndicator.IndicatorType.TO_SPLIT_RIGHT_INDICATOR)
+        createVisualIndicator(DesktopModeVisualIndicator.DragStartState.DRAGGED_INTENT)
+        result = visualIndicator.updateIndicatorType(PointF(500f, 10000f))
+        assertThat(result).isEqualTo(DesktopModeVisualIndicator.IndicatorType.TO_DESKTOP_INDICATOR)
+        createVisualIndicator(DesktopModeVisualIndicator.DragStartState.FROM_FREEFORM)
+        result = visualIndicator.updateIndicatorType(PointF(500f, 10000f))
+        assertThat(result).isEqualTo(DesktopModeVisualIndicator.IndicatorType.NO_INDICATOR)
     }
 
     private fun createVisualIndicator(dragStartState: DesktopModeVisualIndicator.DragStartState) {
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt
new file mode 100644
index 0000000..1308114
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt
@@ -0,0 +1,1000 @@
+/*
+ * Copyright (C) 2022 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.wm.shell.desktopmode
+
+import android.graphics.Rect
+import android.platform.test.annotations.EnableFlags
+import android.testing.AndroidTestingRunner
+import android.util.ArraySet
+import android.view.Display.DEFAULT_DISPLAY
+import android.view.Display.INVALID_DISPLAY
+import androidx.test.filters.SmallTest
+import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE
+import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.TestShellExecutor
+import com.android.wm.shell.common.ShellExecutor
+import com.android.wm.shell.desktopmode.persistence.Desktop
+import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository
+import com.android.wm.shell.sysui.ShellInit
+import com.google.common.truth.Truth.assertThat
+import junit.framework.Assert.fail
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.runTest
+import kotlinx.coroutines.test.setMain
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.inOrder
+import org.mockito.Mockito.spy
+import org.mockito.kotlin.any
+import org.mockito.kotlin.never
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+@ExperimentalCoroutinesApi
+class DesktopRepositoryTest : ShellTestCase() {
+
+    private lateinit var repo: DesktopRepository
+    private lateinit var shellInit: ShellInit
+    private lateinit var datastoreScope: CoroutineScope
+
+    @Mock private lateinit var testExecutor: ShellExecutor
+    @Mock private lateinit var persistentRepository: DesktopPersistentRepository
+
+    @Before
+    fun setUp() {
+        Dispatchers.setMain(StandardTestDispatcher())
+        datastoreScope = CoroutineScope(Dispatchers.Unconfined + SupervisorJob())
+        shellInit = spy(ShellInit(testExecutor))
+
+        repo = DesktopRepository(context, shellInit, persistentRepository, datastoreScope)
+        whenever(runBlocking { persistentRepository.readDesktop(any(), any()) }).thenReturn(
+            Desktop.getDefaultInstance()
+        )
+        shellInit.init()
+    }
+
+    @After
+    fun tearDown() {
+        datastoreScope.cancel()
+    }
+
+    @Test
+    fun addActiveTask_notifiesListener() {
+        val listener = TestListener()
+        repo.addActiveTaskListener(listener)
+
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
+
+        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(1)
+    }
+
+    @Test
+    fun addActiveTask_taskIsActive() {
+        val listener = TestListener()
+        repo.addActiveTaskListener(listener)
+
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
+
+        assertThat(repo.isActiveTask(1)).isTrue()
+    }
+
+    @Test
+    fun addSameActiveTaskTwice_notifiesOnce() {
+        val listener = TestListener()
+        repo.addActiveTaskListener(listener)
+
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
+
+        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(1)
+    }
+
+    @Test
+    fun addActiveTask_multipleTasksAdded_notifiesForAllTasks() {
+        val listener = TestListener()
+        repo.addActiveTaskListener(listener)
+
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 2)
+
+        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(2)
+    }
+
+    @Test
+    fun addActiveTask_multipleDisplays_notifiesCorrectListener() {
+        val listener = TestListener()
+        repo.addActiveTaskListener(listener)
+
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 2)
+        repo.addActiveTask(SECOND_DISPLAY, taskId = 3)
+
+        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(2)
+        assertThat(listener.activeChangesOnSecondaryDisplay).isEqualTo(1)
+    }
+
+    @Test
+    fun removeActiveTask_notifiesListener() {
+        val listener = TestListener()
+        repo.addActiveTaskListener(listener)
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
+
+        repo.removeActiveTask(1)
+
+        // Notify once for add and once for remove
+        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(2)
+    }
+
+    @Test
+    fun removeActiveTask_taskNotActive() {
+        val listener = TestListener()
+        repo.addActiveTaskListener(listener)
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
+
+        repo.removeActiveTask(1)
+
+        assertThat(repo.isActiveTask(1)).isFalse()
+    }
+
+    @Test
+    fun removeActiveTask_nonExistingTask_doesNotNotify() {
+        val listener = TestListener()
+        repo.addActiveTaskListener(listener)
+
+        repo.removeActiveTask(99)
+
+        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(0)
+    }
+
+    @Test
+    fun remoteActiveTask_listenerForOtherDisplayNotNotified() {
+        val listener = TestListener()
+        repo.addActiveTaskListener(listener)
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId = 1)
+
+        repo.removeActiveTask(1)
+
+        assertThat(listener.activeChangesOnSecondaryDisplay).isEqualTo(0)
+        assertThat(repo.isActiveTask(1)).isFalse()
+    }
+
+    @Test
+    fun isActiveTask_nonExistingTask_returnsFalse() {
+        assertThat(repo.isActiveTask(99)).isFalse()
+    }
+
+    @Test
+    fun isOnlyVisibleNonClosingTask_noTasks_returnsFalse() {
+        // No visible tasks
+        assertThat(repo.isOnlyVisibleNonClosingTask(1)).isFalse()
+    }
+
+    @Test
+    fun isClosingTask_noTasks_returnsFalse() {
+        // No visible tasks
+        assertThat(repo.isClosingTask(1)).isFalse()
+    }
+
+    @Test
+    fun updateTaskVisibility_singleVisibleNonClosingTask_updatesTasksCorrectly() {
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+
+        assertThat(repo.isVisibleTask(1)).isTrue()
+        assertThat(repo.isClosingTask(1)).isFalse()
+        assertThat(repo.isOnlyVisibleNonClosingTask(1)).isTrue()
+
+        assertThat(repo.isVisibleTask(99)).isFalse()
+        assertThat(repo.isClosingTask(99)).isFalse()
+        assertThat(repo.isOnlyVisibleNonClosingTask(99)).isFalse()
+    }
+
+    @Test
+    fun isOnlyVisibleNonClosingTask_singleVisibleClosingTask() {
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+        repo.addClosingTask(DEFAULT_DISPLAY, 1)
+
+        // A visible task that's closing
+        assertThat(repo.isVisibleTask(1)).isTrue()
+        assertThat(repo.isClosingTask(1)).isTrue()
+        assertThat(repo.isOnlyVisibleNonClosingTask(1)).isFalse()
+        // Not a visible task
+        assertThat(repo.isVisibleTask(99)).isFalse()
+        assertThat(repo.isOnlyVisibleNonClosingTask(99)).isFalse()
+    }
+
+    @Test
+    fun isOnlyVisibleNonClosingTask_singleVisibleMinimizedTask() {
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+        repo.minimizeTask(DEFAULT_DISPLAY, 1)
+
+        // The visible task that's closing
+        assertThat(repo.isVisibleTask(1)).isTrue()
+        assertThat(repo.isMinimizedTask(1)).isTrue()
+        assertThat(repo.isOnlyVisibleNonClosingTask(1)).isFalse()
+        // Not a visible task
+        assertThat(repo.isVisibleTask(99)).isFalse()
+        assertThat(repo.isOnlyVisibleNonClosingTask(99)).isFalse()
+    }
+
+    @Test
+    fun isOnlyVisibleNonClosingTask_multipleVisibleNonClosingTasks() {
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = true)
+
+        // Not the only task
+        assertThat(repo.isVisibleTask(1)).isTrue()
+        assertThat(repo.isClosingTask(1)).isFalse()
+        assertThat(repo.isOnlyVisibleNonClosingTask(1)).isFalse()
+        // Not the only task
+        assertThat(repo.isVisibleTask(2)).isTrue()
+        assertThat(repo.isClosingTask(2)).isFalse()
+        assertThat(repo.isOnlyVisibleNonClosingTask(2)).isFalse()
+        // Not a visible task
+        assertThat(repo.isVisibleTask(99)).isFalse()
+        assertThat(repo.isClosingTask(99)).isFalse()
+        assertThat(repo.isOnlyVisibleNonClosingTask(99)).isFalse()
+    }
+
+    @Test
+    fun isOnlyVisibleNonClosingTask_multipleDisplays() {
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = true)
+        repo.updateTaskVisibility(SECOND_DISPLAY, taskId = 3, visible = true)
+
+        // Not the only task on DEFAULT_DISPLAY
+        assertThat(repo.isVisibleTask(1)).isTrue()
+        assertThat(repo.isOnlyVisibleNonClosingTask(1)).isFalse()
+        // Not the only task on DEFAULT_DISPLAY
+        assertThat(repo.isVisibleTask(2)).isTrue()
+        assertThat(repo.isOnlyVisibleNonClosingTask(2)).isFalse()
+        // The only visible task on SECOND_DISPLAY
+        assertThat(repo.isVisibleTask(3)).isTrue()
+        assertThat(repo.isOnlyVisibleNonClosingTask(3)).isTrue()
+        // Not a visible task
+        assertThat(repo.isVisibleTask(99)).isFalse()
+        assertThat(repo.isOnlyVisibleNonClosingTask(99)).isFalse()
+    }
+
+    @Test
+    fun addVisibleTasksListener_notifiesVisibleFreeformTask() {
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+        val listener = TestVisibilityListener()
+        val executor = TestShellExecutor()
+
+        repo.addVisibleTasksListener(listener, executor)
+        executor.flushAll()
+
+        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(1)
+        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(1)
+    }
+
+    @Test
+    fun addListener_tasksOnDifferentDisplay_doesNotNotify() {
+        repo.updateTaskVisibility(SECOND_DISPLAY, taskId = 1, visible = true)
+        val listener = TestVisibilityListener()
+        val executor = TestShellExecutor()
+        repo.addVisibleTasksListener(listener, executor)
+        executor.flushAll()
+
+        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(0)
+        // One call as adding listener notifies it
+        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(0)
+    }
+
+    @Test
+    fun updateTaskVisibility_addVisibleTasksNotifiesListener() {
+        val listener = TestVisibilityListener()
+        val executor = TestShellExecutor()
+        repo.addVisibleTasksListener(listener, executor)
+
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = true)
+        executor.flushAll()
+
+        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(2)
+        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(2)
+    }
+
+    @Test
+    fun updateTaskVisibility_addVisibleTaskNotifiesListenerForThatDisplay() {
+        val listener = TestVisibilityListener()
+        val executor = TestShellExecutor()
+        repo.addVisibleTasksListener(listener, executor)
+
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+        executor.flushAll()
+
+        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(1)
+        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(1)
+        assertThat(listener.visibleTasksCountOnSecondaryDisplay).isEqualTo(0)
+        assertThat(listener.visibleChangesOnSecondaryDisplay).isEqualTo(0)
+
+        repo.updateTaskVisibility(displayId = 1, taskId = 2, visible = true)
+        executor.flushAll()
+
+        // Listener for secondary display is notified
+        assertThat(listener.visibleTasksCountOnSecondaryDisplay).isEqualTo(1)
+        assertThat(listener.visibleChangesOnSecondaryDisplay).isEqualTo(1)
+        // No changes to listener for default display
+        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(1)
+    }
+
+    @Test
+    fun updateTaskVisibility_taskOnDefaultBecomesVisibleOnSecondDisplay_listenersNotified() {
+        val listener = TestVisibilityListener()
+        val executor = TestShellExecutor()
+        repo.addVisibleTasksListener(listener, executor)
+
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+        executor.flushAll()
+        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(1)
+
+        // Mark task 1 visible on secondary display
+        repo.updateTaskVisibility(displayId = 1, taskId = 1, visible = true)
+        executor.flushAll()
+
+        // Default display should have 2 calls
+        // 1 - visible task added
+        // 2 - visible task removed
+        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(2)
+        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(0)
+
+        // Secondary display should have 1 call for visible task added
+        assertThat(listener.visibleChangesOnSecondaryDisplay).isEqualTo(1)
+        assertThat(listener.visibleTasksCountOnSecondaryDisplay).isEqualTo(1)
+    }
+
+    @Test
+    fun updateTaskVisibility_removeVisibleTasksNotifiesListener() {
+        val listener = TestVisibilityListener()
+        val executor = TestShellExecutor()
+        repo.addVisibleTasksListener(listener, executor)
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = true)
+        executor.flushAll()
+
+        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(2)
+
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = false)
+        executor.flushAll()
+
+        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(3)
+
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = false)
+        executor.flushAll()
+
+        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(0)
+        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(4)
+    }
+
+    /**
+     * When a task vanishes, the displayId of the task is set to INVALID_DISPLAY.
+     * This tests that task is removed from the last parent display when it vanishes.
+     */
+    @Test
+    fun updateTaskVisibility_removeVisibleTasksRemovesTaskWithInvalidDisplay() {
+        val listener = TestVisibilityListener()
+        val executor = TestShellExecutor()
+        repo.addVisibleTasksListener(listener, executor)
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = true)
+        executor.flushAll()
+
+        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(2)
+
+        repo.updateTaskVisibility(INVALID_DISPLAY, taskId = 1, visible = false)
+        executor.flushAll()
+
+        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(3)
+        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(1)
+    }
+
+    @Test
+    fun getVisibleTaskCount_defaultDisplay_returnsCorrectCount() {
+        // No tasks, count is 0
+        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(0)
+
+        // New task increments count to 1
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+
+        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(1)
+
+        // Visibility update to same task does not increase count
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+
+        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(1)
+
+        // Second task visible increments count
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = true)
+
+        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(2)
+
+        // Hiding a task decrements count
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = false)
+        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(1)
+
+        // Hiding all tasks leaves count at 0
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 2, visible = false)
+        assertThat(repo.getVisibleTaskCount(displayId = 9)).isEqualTo(0)
+
+        // Hiding a not existing task, count remains at 0
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 999, visible = false)
+        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(0)
+    }
+
+    @Test
+    fun getVisibleTaskCount_multipleDisplays_returnsCorrectCount() {
+        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(0)
+        assertThat(repo.getVisibleTaskCount(SECOND_DISPLAY)).isEqualTo(0)
+
+        // New task on default display increments count for that display only
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = true)
+
+        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(1)
+        assertThat(repo.getVisibleTaskCount(SECOND_DISPLAY)).isEqualTo(0)
+
+        // New task on secondary display, increments count for that display only
+        repo.updateTaskVisibility(SECOND_DISPLAY, taskId = 2, visible = true)
+
+        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(1)
+        assertThat(repo.getVisibleTaskCount(SECOND_DISPLAY)).isEqualTo(1)
+
+        // Marking task visible on another display, updates counts for both displays
+        repo.updateTaskVisibility(SECOND_DISPLAY, taskId = 1, visible = true)
+
+        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(0)
+        assertThat(repo.getVisibleTaskCount(SECOND_DISPLAY)).isEqualTo(2)
+
+        // Marking task that is on secondary display, hidden on default display, does not affect
+        // secondary display
+        repo.updateTaskVisibility(DEFAULT_DISPLAY, taskId = 1, visible = false)
+
+        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(0)
+        assertThat(repo.getVisibleTaskCount(SECOND_DISPLAY)).isEqualTo(2)
+
+        // Hiding a task on that display, decrements count
+        repo.updateTaskVisibility(SECOND_DISPLAY, taskId = 1, visible = false)
+
+        assertThat(repo.getVisibleTaskCount(DEFAULT_DISPLAY)).isEqualTo(0)
+        assertThat(repo.getVisibleTaskCount(SECOND_DISPLAY)).isEqualTo(1)
+    }
+
+    @Test
+    fun addOrMoveFreeformTaskToTop_didNotExist_addsToTop() {
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5)
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7)
+
+        val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
+        assertThat(tasks.size).isEqualTo(3)
+        assertThat(tasks[0]).isEqualTo(7)
+        assertThat(tasks[1]).isEqualTo(6)
+        assertThat(tasks[2]).isEqualTo(5)
+    }
+
+    @Test
+    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE)
+    fun addOrMoveFreeformTaskToTop_noTaskExists_persistenceEnabled_addsToTop() =
+        runTest(StandardTestDispatcher()) {
+            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5)
+            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
+            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7)
+
+            val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
+            assertThat(tasks).containsExactly(7, 6, 5).inOrder()
+            inOrder(persistentRepository).run {
+                verify(persistentRepository)
+                    .addOrUpdateDesktop(
+                        DEFAULT_USER_ID,
+                        DEFAULT_DESKTOP_ID,
+                        visibleTasks = ArraySet(),
+                        minimizedTasks = ArraySet(),
+                        freeformTasksInZOrder = arrayListOf(5)
+                    )
+                verify(persistentRepository)
+                    .addOrUpdateDesktop(
+                        DEFAULT_USER_ID,
+                        DEFAULT_DESKTOP_ID,
+                        visibleTasks = ArraySet(),
+                        minimizedTasks = ArraySet(),
+                        freeformTasksInZOrder = arrayListOf(6, 5)
+                    )
+                verify(persistentRepository)
+                    .addOrUpdateDesktop(
+                        DEFAULT_USER_ID,
+                        DEFAULT_DESKTOP_ID,
+                        visibleTasks = ArraySet(),
+                        minimizedTasks = ArraySet(),
+                        freeformTasksInZOrder = arrayListOf(7, 6, 5)
+                    )
+            }
+    }
+
+    @Test
+    fun addOrMoveFreeformTaskToTop_alreadyExists_movesToTop() {
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5)
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7)
+
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
+
+        val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
+        assertThat(tasks.size).isEqualTo(3)
+        assertThat(tasks.first()).isEqualTo(6)
+    }
+
+    @Test
+    fun addOrMoveFreeformTaskToTop_taskIsMinimized_unminimizesTask() {
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5)
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7)
+        repo.minimizeTask(displayId = 0, taskId = 6)
+
+        val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
+        assertThat(tasks).containsExactly(7, 6, 5).inOrder()
+        assertThat(repo.isMinimizedTask(taskId = 6)).isTrue()
+    }
+
+    @Test
+    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE)
+    fun minimizeTask_persistenceEnabled_taskIsPersistedAsMinimized() =
+        runTest(StandardTestDispatcher()) {
+            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5)
+            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
+            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7)
+
+            repo.minimizeTask(displayId = 0, taskId = 6)
+
+            val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
+            assertThat(tasks).containsExactly(7, 6, 5).inOrder()
+            assertThat(repo.isMinimizedTask(taskId = 6)).isTrue()
+            inOrder(persistentRepository).run {
+                verify(persistentRepository)
+                    .addOrUpdateDesktop(
+                        DEFAULT_USER_ID,
+                        DEFAULT_DESKTOP_ID,
+                        visibleTasks = ArraySet(),
+                        minimizedTasks = ArraySet(),
+                        freeformTasksInZOrder = arrayListOf(5)
+                    )
+                verify(persistentRepository)
+                    .addOrUpdateDesktop(
+                        DEFAULT_USER_ID,
+                        DEFAULT_DESKTOP_ID,
+                        visibleTasks = ArraySet(),
+                        minimizedTasks = ArraySet(),
+                        freeformTasksInZOrder = arrayListOf(6, 5)
+                    )
+                verify(persistentRepository)
+                    .addOrUpdateDesktop(
+                        DEFAULT_USER_ID,
+                        DEFAULT_DESKTOP_ID,
+                        visibleTasks = ArraySet(),
+                        minimizedTasks = ArraySet(),
+                        freeformTasksInZOrder = arrayListOf(7, 6, 5)
+                    )
+                verify(persistentRepository)
+                    .addOrUpdateDesktop(
+                        DEFAULT_USER_ID,
+                        DEFAULT_DESKTOP_ID,
+                        visibleTasks = ArraySet(),
+                        minimizedTasks = ArraySet(arrayOf(6)),
+                        freeformTasksInZOrder = arrayListOf(7, 6, 5)
+                    )
+            }
+    }
+
+    @Test
+    fun addOrMoveFreeformTaskToTop_taskIsUnminimized_noop() {
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5)
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6)
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7)
+
+        val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
+        assertThat(tasks).containsExactly(7, 6, 5).inOrder()
+        assertThat(repo.isMinimizedTask(taskId = 6)).isFalse()
+    }
+
+    @Test
+    fun removeFreeformTask_invalidDisplay_removesTaskFromFreeformTasks() {
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1)
+
+        repo.removeFreeformTask(INVALID_DISPLAY, taskId = 1)
+
+        val invalidDisplayTasks = repo.getFreeformTasksInZOrder(INVALID_DISPLAY)
+        assertThat(invalidDisplayTasks).isEmpty()
+        val validDisplayTasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
+        assertThat(validDisplayTasks).isEmpty()
+    }
+
+    @Test
+    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE)
+    fun removeFreeformTask_invalidDisplay_persistenceEnabled_removesTaskFromFreeformTasks() {
+        runTest(StandardTestDispatcher()) {
+            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1)
+
+            repo.removeFreeformTask(INVALID_DISPLAY, taskId = 1)
+
+            verify(persistentRepository)
+                .addOrUpdateDesktop(
+                    DEFAULT_USER_ID,
+                    DEFAULT_DESKTOP_ID,
+                    visibleTasks = ArraySet(),
+                    minimizedTasks = ArraySet(),
+                    freeformTasksInZOrder = arrayListOf(1)
+                )
+            verify(persistentRepository)
+                .addOrUpdateDesktop(
+                    DEFAULT_USER_ID,
+                    DEFAULT_DESKTOP_ID,
+                    visibleTasks = ArraySet(),
+                    minimizedTasks = ArraySet(),
+                    freeformTasksInZOrder = ArrayList()
+                )
+        }
+    }
+
+    @Test
+    fun removeFreeformTask_validDisplay_removesTaskFromFreeformTasks() {
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1)
+
+        repo.removeFreeformTask(DEFAULT_DISPLAY, taskId = 1)
+
+        val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
+        assertThat(tasks).isEmpty()
+    }
+
+    @Test
+    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE)
+    fun removeFreeformTask_validDisplay_persistenceEnabled_removesTaskFromFreeformTasks() {
+        runTest(StandardTestDispatcher()) {
+            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1)
+
+            repo.removeFreeformTask(DEFAULT_DISPLAY, taskId = 1)
+
+            verify(persistentRepository)
+                .addOrUpdateDesktop(
+                    DEFAULT_USER_ID,
+                    DEFAULT_DESKTOP_ID,
+                    visibleTasks = ArraySet(),
+                    minimizedTasks = ArraySet(),
+                    freeformTasksInZOrder = arrayListOf(1)
+                )
+            verify(persistentRepository)
+                .addOrUpdateDesktop(
+                    DEFAULT_USER_ID,
+                    DEFAULT_DESKTOP_ID,
+                    visibleTasks = ArraySet(),
+                    minimizedTasks = ArraySet(),
+                    freeformTasksInZOrder = ArrayList()
+                )
+        }
+    }
+
+    @Test
+    fun removeFreeformTask_validDisplay_differentDisplay_doesNotRemovesTask() {
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1)
+
+        repo.removeFreeformTask(SECOND_DISPLAY, taskId = 1)
+
+        val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY)
+        assertThat(tasks).containsExactly(1)
+    }
+
+    @Test
+    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE)
+    fun removeFreeformTask_validDisplayButDifferentDisplay_persistenceEnabled_doesNotRemoveTask() {
+        runTest(StandardTestDispatcher()) {
+            repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1)
+
+            repo.removeFreeformTask(SECOND_DISPLAY, taskId = 1)
+
+            verify(persistentRepository)
+                .addOrUpdateDesktop(
+                    DEFAULT_USER_ID,
+                    DEFAULT_DESKTOP_ID,
+                    visibleTasks = ArraySet(),
+                    minimizedTasks = ArraySet(),
+                    freeformTasksInZOrder = arrayListOf(1)
+                )
+            verify(persistentRepository, never())
+                .addOrUpdateDesktop(
+                    DEFAULT_USER_ID,
+                    DEFAULT_DESKTOP_ID,
+                    visibleTasks = ArraySet(),
+                    minimizedTasks = ArraySet(),
+                    freeformTasksInZOrder = ArrayList()
+                )
+        }
+    }
+
+    @Test
+    fun removeFreeformTask_removesTaskBoundsBeforeMaximize() {
+        val taskId = 1
+        repo.addActiveTask(THIRD_DISPLAY, taskId)
+        repo.addOrMoveFreeformTaskToTop(THIRD_DISPLAY, taskId)
+        repo.saveBoundsBeforeMaximize(taskId, Rect(0, 0, 200, 200))
+
+        repo.removeFreeformTask(THIRD_DISPLAY, taskId)
+
+        assertThat(repo.removeBoundsBeforeMaximize(taskId)).isNull()
+    }
+
+    @Test
+    fun removeFreeformTask_removesActiveTask() {
+        val taskId = 1
+        val listener = TestListener()
+        repo.addActiveTaskListener(listener)
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId)
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId)
+
+        repo.removeFreeformTask(THIRD_DISPLAY, taskId)
+
+        assertThat(repo.isActiveTask(taskId)).isFalse()
+        assertThat(listener.activeChangesOnDefaultDisplay).isEqualTo(2)
+    }
+
+    @Test
+    fun removeFreeformTask_unminimizesTask() {
+        val taskId = 1
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId)
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId)
+        repo.minimizeTask(DEFAULT_DISPLAY, taskId)
+
+        repo.removeFreeformTask(DEFAULT_DISPLAY, taskId)
+
+        assertThat(repo.isMinimizedTask(taskId)).isFalse()
+    }
+
+    @Test
+    fun removeFreeformTask_updatesTaskVisibility() {
+        val taskId = 1
+        repo.addActiveTask(DEFAULT_DISPLAY, taskId)
+        repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId)
+
+        repo.removeFreeformTask(THIRD_DISPLAY, taskId)
+
+        assertThat(repo.isVisibleTask(taskId)).isFalse()
+    }
+
+    @Test
+    fun saveBoundsBeforeMaximize_boundsSavedByTaskId() {
+        val taskId = 1
+        val bounds = Rect(0, 0, 200, 200)
+
+        repo.saveBoundsBeforeMaximize(taskId, bounds)
+
+        assertThat(repo.removeBoundsBeforeMaximize(taskId)).isEqualTo(bounds)
+    }
+
+    @Test
+    fun removeBoundsBeforeMaximize_returnsNullAfterBoundsRemoved() {
+        val taskId = 1
+        val bounds = Rect(0, 0, 200, 200)
+        repo.saveBoundsBeforeMaximize(taskId, bounds)
+        repo.removeBoundsBeforeMaximize(taskId)
+
+        val boundsBeforeMaximize = repo.removeBoundsBeforeMaximize(taskId)
+
+        assertThat(boundsBeforeMaximize).isNull()
+    }
+
+    @Test
+    fun isMinimizedTask_minimizeTaskNotCalled_noTasksMinimized() {
+        assertThat(repo.isMinimizedTask(taskId = 0)).isFalse()
+        assertThat(repo.isMinimizedTask(taskId = 1)).isFalse()
+    }
+
+    @Test
+    fun minimizeTask_minimizesCorrectTask() {
+        repo.minimizeTask(displayId = 0, taskId = 0)
+
+        assertThat(repo.isMinimizedTask(taskId = 0)).isTrue()
+        assertThat(repo.isMinimizedTask(taskId = 1)).isFalse()
+        assertThat(repo.isMinimizedTask(taskId = 2)).isFalse()
+    }
+
+    @Test
+    fun minimizeTask_withInvalidDisplay_minimizesCorrectTask() {
+        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 0)
+        repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 0)
+
+        repo.minimizeTask(displayId = INVALID_DISPLAY, taskId = 0)
+
+        assertThat(repo.isMinimizedTask(taskId = 0)).isTrue()
+        assertThat(repo.isMinimizedTask(taskId = 1)).isFalse()
+        assertThat(repo.isMinimizedTask(taskId = 2)).isFalse()
+    }
+
+    @Test
+    fun unminimizeTask_unminimizesTask() {
+        repo.minimizeTask(displayId = 0, taskId = 0)
+
+        repo.unminimizeTask(displayId = 0, taskId = 0)
+
+        assertThat(repo.isMinimizedTask(taskId = 0)).isFalse()
+        assertThat(repo.isMinimizedTask(taskId = 1)).isFalse()
+        assertThat(repo.isMinimizedTask(taskId = 2)).isFalse()
+    }
+
+    @Test
+    fun unminimizeTask_nonExistentTask_doesntCrash() {
+        repo.unminimizeTask(displayId = 0, taskId = 0)
+
+        // No change
+        assertThat(repo.isMinimizedTask(taskId = 0)).isFalse()
+        assertThat(repo.isMinimizedTask(taskId = 1)).isFalse()
+        assertThat(repo.isMinimizedTask(taskId = 2)).isFalse()
+    }
+
+
+    @Test
+    fun updateTaskVisibility_minimizedTaskBecomesVisible_unminimizesTask() {
+        repo.minimizeTask(displayId = 10, taskId = 2)
+        repo.updateTaskVisibility(displayId = 10, taskId = 2, visible = true)
+
+        val isMinimizedTask = repo.isMinimizedTask(taskId = 2)
+
+        assertThat(isMinimizedTask).isFalse()
+    }
+
+    @Test
+    fun getActiveNonMinimizedOrderedTasks_returnsFreeformTasksInCorrectOrder() {
+        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 1)
+        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 2)
+        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 3)
+        // The front-most task will be the one added last through `addOrMoveFreeformTaskToTop`
+        repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 3)
+        repo.addOrMoveFreeformTaskToTop(displayId = 0, taskId = 2)
+        repo.addOrMoveFreeformTaskToTop(displayId = 0, taskId = 1)
+
+        val tasks = repo.getActiveNonMinimizedOrderedTasks(displayId = 0)
+
+        assertThat(tasks).containsExactly(1, 2, 3).inOrder()
+    }
+
+    @Test
+    fun getActiveNonMinimizedOrderedTasks_excludesMinimizedTasks() {
+        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 1)
+        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 2)
+        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 3)
+        // The front-most task will be the one added last through `addOrMoveFreeformTaskToTop`
+        repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 3)
+        repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 2)
+        repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 1)
+        repo.minimizeTask(displayId = DEFAULT_DISPLAY, taskId = 2)
+
+        val tasks = repo.getActiveNonMinimizedOrderedTasks(displayId = DEFAULT_DISPLAY)
+
+        assertThat(tasks).containsExactly(1, 3).inOrder()
+    }
+
+    @Test
+    fun setTaskInFullImmersiveState_savedAsInImmersiveState() {
+        assertThat(repo.isTaskInFullImmersiveState(taskId = 1)).isFalse()
+
+        repo.setTaskInFullImmersiveState(DEFAULT_DESKTOP_ID, taskId = 1, immersive = true)
+
+        assertThat(repo.isTaskInFullImmersiveState(taskId = 1)).isTrue()
+    }
+
+    @Test
+    fun removeTaskInFullImmersiveState_removedAsInImmersiveState() {
+        repo.setTaskInFullImmersiveState(DEFAULT_DESKTOP_ID, taskId = 1, immersive = true)
+        assertThat(repo.isTaskInFullImmersiveState(taskId = 1)).isTrue()
+
+        repo.setTaskInFullImmersiveState(DEFAULT_DESKTOP_ID, taskId = 1, immersive = false)
+
+        assertThat(repo.isTaskInFullImmersiveState(taskId = 1)).isFalse()
+    }
+
+    @Test
+    fun removeTaskInFullImmersiveState_otherWasImmersive_otherRemainsImmersive() {
+        repo.setTaskInFullImmersiveState(DEFAULT_DESKTOP_ID, taskId = 1, immersive = true)
+
+        repo.setTaskInFullImmersiveState(DEFAULT_DESKTOP_ID, taskId = 2, immersive = false)
+
+        assertThat(repo.isTaskInFullImmersiveState(taskId = 1)).isTrue()
+    }
+
+    @Test
+    fun setTaskInFullImmersiveState_sameDisplay_overridesExistingFullImmersiveTask() {
+        repo.setTaskInFullImmersiveState(DEFAULT_DESKTOP_ID, taskId = 1, immersive = true)
+        repo.setTaskInFullImmersiveState(DEFAULT_DESKTOP_ID, taskId = 2, immersive = true)
+
+        assertThat(repo.isTaskInFullImmersiveState(taskId = 1)).isFalse()
+        assertThat(repo.isTaskInFullImmersiveState(taskId = 2)).isTrue()
+    }
+
+    @Test
+    fun setTaskInFullImmersiveState_differentDisplay_bothAreImmersive() {
+        repo.setTaskInFullImmersiveState(DEFAULT_DESKTOP_ID, taskId = 1, immersive = true)
+        repo.setTaskInFullImmersiveState(DEFAULT_DESKTOP_ID + 1, taskId = 2, immersive = true)
+
+        assertThat(repo.isTaskInFullImmersiveState(taskId = 1)).isTrue()
+        assertThat(repo.isTaskInFullImmersiveState(taskId = 2)).isTrue()
+    }
+
+    @Test
+    fun removeDesktop_multipleTasks_removesAll() {
+        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 1)
+        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 2)
+        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 3)
+        // The front-most task will be the one added last through `addOrMoveFreeformTaskToTop`
+        repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 3)
+        repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 2)
+        repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 1)
+        repo.minimizeTask(displayId = DEFAULT_DISPLAY, taskId = 2)
+
+        val tasksBeforeRemoval = repo.removeDesktop(displayId = DEFAULT_DISPLAY)
+
+        assertThat(tasksBeforeRemoval).containsExactly(1, 2, 3).inOrder()
+        assertThat(repo.getActiveTasks(displayId = DEFAULT_DISPLAY)).isEmpty()
+    }
+
+    class TestListener : DesktopRepository.ActiveTasksListener {
+        var activeChangesOnDefaultDisplay = 0
+        var activeChangesOnSecondaryDisplay = 0
+        override fun onActiveTasksChanged(displayId: Int) {
+            when (displayId) {
+                DEFAULT_DISPLAY -> activeChangesOnDefaultDisplay++
+                SECOND_DISPLAY -> activeChangesOnSecondaryDisplay++
+                else -> fail("Active task listener received unexpected display id: $displayId")
+            }
+        }
+    }
+
+    class TestVisibilityListener : DesktopRepository.VisibleTasksListener {
+        var visibleTasksCountOnDefaultDisplay = 0
+        var visibleTasksCountOnSecondaryDisplay = 0
+
+        var visibleChangesOnDefaultDisplay = 0
+        var visibleChangesOnSecondaryDisplay = 0
+
+        override fun onTasksVisibilityChanged(displayId: Int, visibleTasksCount: Int) {
+            when (displayId) {
+                DEFAULT_DISPLAY -> {
+                    visibleTasksCountOnDefaultDisplay = visibleTasksCount
+                    visibleChangesOnDefaultDisplay++
+                }
+                SECOND_DISPLAY -> {
+                    visibleTasksCountOnSecondaryDisplay = visibleTasksCount
+                    visibleChangesOnSecondaryDisplay++
+                }
+                else -> fail("Visible task listener received unexpected display id: $displayId")
+            }
+        }
+    }
+
+    companion object {
+        const val SECOND_DISPLAY = 1
+        const val THIRD_DISPLAY = 345
+        private const val DEFAULT_USER_ID = 1000
+        private const val DEFAULT_DESKTOP_ID = 0
+    }
+}
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
index ee54520..27deb0b 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
@@ -40,6 +40,7 @@
 import android.graphics.PointF
 import android.graphics.Rect
 import android.os.Binder
+import android.os.Bundle
 import android.os.Handler
 import android.platform.test.annotations.DisableFlags
 import android.platform.test.annotations.EnableFlags
@@ -49,6 +50,7 @@
 import android.view.DragEvent
 import android.view.Gravity
 import android.view.SurfaceControl
+import android.view.WindowInsets
 import android.view.WindowManager
 import android.view.WindowManager.TRANSIT_CHANGE
 import android.view.WindowManager.TRANSIT_CLOSE
@@ -74,6 +76,7 @@
 import com.android.internal.jank.InteractionJankMonitor
 import com.android.window.flags.Flags
 import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE
+import com.android.window.flags.Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP
 import com.android.wm.shell.MockToken
 import com.android.wm.shell.R
 import com.android.wm.shell.RootTaskDisplayAreaOrganizer
@@ -141,10 +144,13 @@
 import org.mockito.Mockito.anyInt
 import org.mockito.Mockito.clearInvocations
 import org.mockito.Mockito.mock
+import org.mockito.Mockito.never
 import org.mockito.Mockito.spy
 import org.mockito.Mockito.verify
+import org.mockito.Mockito.times
 import org.mockito.kotlin.any
 import org.mockito.kotlin.anyOrNull
+import org.mockito.kotlin.argThat
 import org.mockito.kotlin.atLeastOnce
 import org.mockito.kotlin.capture
 import org.mockito.kotlin.eq
@@ -181,6 +187,8 @@
   @Mock
   lateinit var toggleResizeDesktopTaskTransitionHandler: ToggleResizeDesktopTaskTransitionHandler
   @Mock lateinit var dragToDesktopTransitionHandler: DragToDesktopTransitionHandler
+  @Mock
+  lateinit var mockDesktopFullImmersiveTransitionHandler: DesktopFullImmersiveTransitionHandler
   @Mock lateinit var launchAdjacentController: LaunchAdjacentController
   @Mock lateinit var splitScreenController: SplitScreenController
   @Mock lateinit var recentsTransitionHandler: RecentsTransitionHandler
@@ -199,7 +207,7 @@
   private lateinit var mockitoSession: StaticMockitoSession
   private lateinit var controller: DesktopTasksController
   private lateinit var shellInit: ShellInit
-  private lateinit var taskRepository: DesktopModeTaskRepository
+  private lateinit var taskRepository: DesktopRepository
   private lateinit var desktopTasksLimiter: DesktopTasksLimiter
   private lateinit var recentsTransitionStateListener: RecentsTransitionStateListener
   private lateinit var testScope: CoroutineScope
@@ -230,7 +238,7 @@
 
     testScope = CoroutineScope(Dispatchers.Unconfined + SupervisorJob())
     shellInit = spy(ShellInit(testExecutor))
-    taskRepository = DesktopModeTaskRepository(context, shellInit, persistentRepository, testScope)
+    taskRepository = DesktopRepository(context, shellInit, persistentRepository, testScope)
     desktopTasksLimiter =
         DesktopTasksLimiter(
             transitions,
@@ -287,6 +295,7 @@
         dragAndDropTransitionHandler,
         toggleResizeDesktopTaskTransitionHandler,
         dragToDesktopTransitionHandler,
+        mockDesktopFullImmersiveTransitionHandler,
         taskRepository,
         desktopModeLoggerTransitionObserver,
         launchAdjacentController,
@@ -1348,6 +1357,32 @@
   }
 
   @Test
+  fun moveTaskToFront_backgroundTask_launchesTask() {
+    val task = createTaskInfo(1)
+    whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null)
+
+    controller.moveTaskToFront(task.taskId)
+
+    val wct = getLatestWct(type = TRANSIT_OPEN)
+    assertThat(wct.hierarchyOps).hasSize(1)
+    wct.assertLaunchTaskAt(0, task.taskId, WINDOWING_MODE_FREEFORM)
+  }
+
+  @Test
+  fun moveTaskToFront_backgroundTaskBringsTasksOverLimit_minimizesBackTask() {
+    val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() }
+    val task = createTaskInfo(1001)
+    whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(null)
+
+    controller.moveTaskToFront(task.taskId)
+
+    val wct = getLatestWct(type = TRANSIT_OPEN)
+    assertThat(wct.hierarchyOps.size).isEqualTo(2) // launch + minimize
+    wct.assertReorderAt(0, freeformTasks[0], toTop = false)
+    wct.assertLaunchTaskAt(1, task.taskId, WINDOWING_MODE_FREEFORM)
+  }
+
+  @Test
   fun moveToNextDisplay_noOtherDisplays() {
     whenever(rootTaskDisplayAreaOrganizer.displayIds).thenReturn(intArrayOf(DEFAULT_DISPLAY))
     val task = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
@@ -2073,11 +2108,8 @@
   }
 
   @Test
-  @DisableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION,
-  )
-  fun handleRequest_backTransition_singleTaskNoToken_noWallpaper_noBackNav_doesNotHandle() {
+  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,)
+  fun handleRequest_backTransition_singleTaskNoToken_noWallpaper_doesNotHandle() {
     val task = setUpFreeformTask()
 
     val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_TO_BACK))
@@ -2086,16 +2118,13 @@
   }
 
   @Test
-  @EnableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_backTransition_singleTaskNoToken_withWallpaper_withBackNav_removesTask() {
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,)
+  fun handleRequest_backTransition_singleTaskNoToken_withWallpaper_removesTask() {
     val task = setUpFreeformTask()
 
     val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_TO_BACK))
 
-    assertNotNull(result, "Should handle request").assertRemoveAt(0, task.token)
+    assertNull(result, "Should not handle request")
   }
 
   @Test
@@ -2113,8 +2142,7 @@
 
   @Test
   @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
-  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
-  fun handleRequest_backTransition_singleTaskNoToken_noBackNav_doesNotHandle() {
+  fun handleRequest_backTransition_singleTaskNoToken_doesNotHandle() {
     val task = setUpFreeformTask()
 
     val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_TO_BACK))
@@ -2123,11 +2151,8 @@
   }
 
   @Test
-  @DisableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_backTransition_singleTaskWithToken_noWallpaper_noBackNav_doesNotHandle() {
+  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,)
+  fun handleRequest_backTransition_singleTaskWithToken_noWallpaper_doesNotHandle() {
     val task = setUpFreeformTask()
 
     taskRepository.wallpaperActivityToken = MockToken().token()
@@ -2137,26 +2162,8 @@
   }
 
   @Test
-  @EnableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_backTransition_singleTask_withWallpaper_withBackNav_removesWallpaperAndTask() {
-    val task = setUpFreeformTask()
-    val wallpaperToken = MockToken().token()
-
-    taskRepository.wallpaperActivityToken = wallpaperToken
-    val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_TO_BACK))
-
-    // Should create remove wallpaper transaction
-    assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, wallpaperToken)
-    result.assertRemoveAt(index = 1, task.token)
-  }
-
-  @Test
   @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
-  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
-  fun handleRequest_backTransition_singleTaskWithToken_noBackNav_removesWallpaper() {
+  fun handleRequest_backTransition_singleTaskWithToken_removesWallpaper() {
     val task = setUpFreeformTask()
     val wallpaperToken = MockToken().token()
 
@@ -2168,11 +2175,8 @@
   }
 
   @Test
-  @DisableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_backTransition_multipleTasks_noWallpaper_noBackNav_doesNotHandle() {
+  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,)
+  fun handleRequest_backTransition_multipleTasks_noWallpaper_doesNotHandle() {
     val task1 = setUpFreeformTask()
     setUpFreeformTask()
 
@@ -2183,24 +2187,8 @@
   }
 
   @Test
-  @EnableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_backTransition_multipleTasks_withWallpaper_withBackNav_removesTask() {
-    val task1 = setUpFreeformTask()
-    setUpFreeformTask()
-
-    taskRepository.wallpaperActivityToken = MockToken().token()
-    val result = controller.handleRequest(Binder(), createTransition(task1, type = TRANSIT_TO_BACK))
-
-    assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, task1.token)
-  }
-
-  @Test
   @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
-  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
-  fun handleRequest_backTransition_multipleTasks_noBackNav_doesNotHandle() {
+  fun handleRequest_backTransition_multipleTasks_doesNotHandle() {
     val task1 = setUpFreeformTask()
     setUpFreeformTask()
 
@@ -2226,29 +2214,11 @@
 
     // Should create remove wallpaper transaction
     assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, wallpaperToken)
-    result.assertRemoveAt(index = 1, task1.token)
-  }
-
-  @Test
-  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
-  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
-  fun handleRequest_backTransition_multipleTasksSingleNonClosing_noBackNav_removesWallpaper() {
-    val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
-    val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
-    val wallpaperToken = MockToken().token()
-
-    taskRepository.wallpaperActivityToken = wallpaperToken
-    taskRepository.addClosingTask(displayId = DEFAULT_DISPLAY, taskId = task2.taskId)
-    val result = controller.handleRequest(Binder(), createTransition(task1, type = TRANSIT_TO_BACK))
-
-    // Should create remove wallpaper transaction
-    assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, wallpaperToken)
   }
 
   @Test
   @EnableFlags(
     Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
   )
   fun handleRequest_backTransition_multipleTasksSingleNonMinimized_removesWallpaperAndTask() {
     val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
@@ -2261,31 +2231,11 @@
 
     // Should create remove wallpaper transaction
     assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, wallpaperToken)
-    result.assertRemoveAt(index = 1, task1.token)
   }
 
   @Test
-  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
-  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
-  fun handleRequest_backTransition_multipleTasksSingleNonMinimized_noBackNav_removesWallpaper() {
-    val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
-    val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
-    val wallpaperToken = MockToken().token()
-
-    taskRepository.wallpaperActivityToken = wallpaperToken
-    taskRepository.minimizeTask(displayId = DEFAULT_DISPLAY, taskId = task2.taskId)
-    val result = controller.handleRequest(Binder(), createTransition(task1, type = TRANSIT_TO_BACK))
-
-    // Should create remove wallpaper transaction
-    assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, wallpaperToken)
-  }
-
-  @Test
-  @EnableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_backTransition_nonMinimizadTask_withWallpaper_withBackNav_removesWallpaper() {
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,)
+  fun handleRequest_backTransition_nonMinimizadTask_withWallpaper_removesWallpaper() {
     val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
     val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
     val wallpaperToken = MockToken().token()
@@ -2301,11 +2251,8 @@
   }
 
   @Test
-  @DisableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_closeTransition_singleTaskNoToken_noWallpaper_noBackNav_doesNotHandle() {
+  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,)
+  fun handleRequest_closeTransition_singleTaskNoToken_noWallpaper_doesNotHandle() {
     val task = setUpFreeformTask()
 
     val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_CLOSE))
@@ -2314,22 +2261,8 @@
   }
 
   @Test
-  @EnableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_closeTransition_singleTaskNoToken_withWallpaper_withBackNav_removesTask() {
-    val task = setUpFreeformTask()
-
-    val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_CLOSE))
-
-    assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, task.token)
-  }
-
-  @Test
   @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
-  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
-  fun handleRequest_closeTransition_singleTaskNoToken_noBackNav_doesNotHandle() {
+  fun handleRequest_closeTransition_singleTaskNoToken_doesNotHandle() {
     val task = setUpFreeformTask()
 
     val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_CLOSE))
@@ -2338,11 +2271,8 @@
   }
 
   @Test
-  @DisableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_closeTransition_singleTaskWithToken_noWallpaper_noBackNav_doesNotHandle() {
+  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
+  fun handleRequest_closeTransition_singleTaskWithToken_noWallpaper_doesNotHandle() {
     val task = setUpFreeformTask()
 
     taskRepository.wallpaperActivityToken = MockToken().token()
@@ -2352,26 +2282,8 @@
   }
 
   @Test
-  @EnableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_closeTransition_singleTaskWithToken_removesWallpaperAndTask() {
-    val task = setUpFreeformTask()
-    val wallpaperToken = MockToken().token()
-
-    taskRepository.wallpaperActivityToken = wallpaperToken
-    val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_CLOSE))
-
-    // Should create remove wallpaper transaction
-    assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, wallpaperToken)
-    result.assertRemoveAt(index = 1, task.token)
-  }
-
-  @Test
   @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
-  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
-  fun handleRequest_closeTransition_singleTaskWithToken_withWallpaper_noBackNav_removesWallpaper() {
+  fun handleRequest_closeTransition_singleTaskWithToken_withWallpaper_removesWallpaper() {
     val task = setUpFreeformTask()
     val wallpaperToken = MockToken().token()
 
@@ -2383,11 +2295,8 @@
   }
 
   @Test
-  @DisableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_closeTransition_multipleTasks_noWallpaper_noBackNav_doesNotHandle() {
+  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
+  fun handleRequest_closeTransition_multipleTasks_noWallpaper_doesNotHandle() {
     val task1 = setUpFreeformTask()
     setUpFreeformTask()
 
@@ -2398,25 +2307,8 @@
   }
 
   @Test
-  @EnableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_closeTransition_multipleTasks_withWallpaper_withBackNav_removesTask() {
-    val task1 = setUpFreeformTask()
-    setUpFreeformTask()
-
-    taskRepository.wallpaperActivityToken = MockToken().token()
-    val result = controller.handleRequest(Binder(), createTransition(task1, type = TRANSIT_CLOSE))
-
-    assertNotNull(result, "Should handle request")
-    result.assertRemoveAt(index = 0, task1.token)
-  }
-
-  @Test
   @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
-  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
-  fun handleRequest_closeTransition_multipleTasksFlagEnabled_noBackNav_doesNotHandle() {
+  fun handleRequest_closeTransition_multipleTasksFlagEnabled_doesNotHandle() {
     val task1 = setUpFreeformTask()
     setUpFreeformTask()
 
@@ -2427,28 +2319,8 @@
   }
 
   @Test
-  @EnableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_closeTransition_multipleTasksSingleNonClosing_removesWallpaperAndTask() {
-    val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
-    val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
-    val wallpaperToken = MockToken().token()
-
-    taskRepository.wallpaperActivityToken = wallpaperToken
-    taskRepository.addClosingTask(displayId = DEFAULT_DISPLAY, taskId = task2.taskId)
-    val result = controller.handleRequest(Binder(), createTransition(task1, type = TRANSIT_CLOSE))
-
-    // Should create remove wallpaper transaction
-    assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, wallpaperToken)
-    result.assertRemoveAt(index = 1, task1.token)
-  }
-
-  @Test
   @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
-  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
-  fun handleRequest_closeTransition_multipleTasksSingleNonClosing_noBackNav_removesWallpaper() {
+  fun handleRequest_closeTransition_multipleTasksSingleNonClosing_removesWallpaper() {
     val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
     val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
     val wallpaperToken = MockToken().token()
@@ -2462,28 +2334,8 @@
   }
 
   @Test
-  @EnableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_closeTransition_multipleTasksOneNonMinimized_removesWallpaperAndTask() {
-    val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
-    val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
-    val wallpaperToken = MockToken().token()
-
-    taskRepository.wallpaperActivityToken = wallpaperToken
-    taskRepository.minimizeTask(displayId = DEFAULT_DISPLAY, taskId = task2.taskId)
-    val result = controller.handleRequest(Binder(), createTransition(task1, type = TRANSIT_CLOSE))
-
-    // Should create remove wallpaper transaction
-    assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, wallpaperToken)
-    result.assertRemoveAt(index = 1, task1.token)
-  }
-
-  @Test
   @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
-  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
-  fun handleRequest_closeTransition_multipleTasksSingleNonMinimized_noBackNav_removesWallpaper() {
+  fun handleRequest_closeTransition_multipleTasksSingleNonMinimized_removesWallpaper() {
     val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
     val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
     val wallpaperToken = MockToken().token()
@@ -2497,11 +2349,8 @@
   }
 
   @Test
-  @EnableFlags(
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
-    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
-  )
-  fun handleRequest_closeTransition_minimizadTask_withWallpaper_withBackNav_removesWallpaper() {
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,)
+  fun handleRequest_closeTransition_minimizadTask_withWallpaper_removesWallpaper() {
     val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
     val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
     val wallpaperToken = MockToken().token()
@@ -2617,6 +2466,41 @@
   }
 
   @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
+  fun removeDesktop_multipleTasks_removesAll() {
+    val task1 = setUpFreeformTask()
+    val task2 = setUpFreeformTask()
+    val task3 = setUpFreeformTask()
+    taskRepository.minimizeTask(DEFAULT_DISPLAY, task2.taskId)
+
+    controller.removeDesktop(displayId = DEFAULT_DISPLAY)
+
+    val wct = getLatestWct(TRANSIT_CLOSE)
+    assertThat(wct.hierarchyOps).hasSize(3)
+    wct.assertRemoveAt(index = 0, task1.token)
+    wct.assertRemoveAt(index = 1, task2.token)
+    wct.assertRemoveAt(index = 2, task3.token)
+  }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
+  fun removeDesktop_multipleTasksWithBackgroundTask_removesAll() {
+    val task1 = setUpFreeformTask()
+    val task2 = setUpFreeformTask()
+    val task3 = setUpFreeformTask()
+    taskRepository.minimizeTask(DEFAULT_DISPLAY, task2.taskId)
+    whenever(shellTaskOrganizer.getRunningTaskInfo(task3.taskId)).thenReturn(null)
+
+    controller.removeDesktop(displayId = DEFAULT_DISPLAY)
+
+    val wct = getLatestWct(TRANSIT_CLOSE)
+    assertThat(wct.hierarchyOps).hasSize(2)
+    wct.assertRemoveAt(index = 0, task1.token)
+    wct.assertRemoveAt(index = 1, task2.token)
+    verify(recentTasksController).removeBackgroundTask(task3.taskId)
+  }
+
+  @Test
   @EnableFlags(Flags.FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS)
   fun dragToDesktop_landscapeDevice_resizable_undefinedOrientation_defaultLandscapeBounds() {
     val spyController = spy(controller)
@@ -2801,13 +2685,17 @@
   @Test
   fun onDesktopDragMove_endsOutsideValidDragArea_snapsToValidBounds() {
     val task = setUpFreeformTask()
+    val spyController = spy(controller)
     val mockSurface = mock(SurfaceControl::class.java)
     val mockDisplayLayout = mock(DisplayLayout::class.java)
     whenever(displayController.getDisplayLayout(task.displayId)).thenReturn(mockDisplayLayout)
     whenever(mockDisplayLayout.stableInsets()).thenReturn(Rect(0, 100, 2000, 2000))
-    controller.onDragPositioningMove(task, mockSurface, 200f, Rect(100, -100, 500, 1000))
+    spyController.onDragPositioningMove(task, mockSurface, 200f, Rect(100, -100, 500, 1000))
 
-    controller.onDragPositioningEnd(
+    whenever(spyController.getVisualIndicator()).thenReturn(desktopModeVisualIndicator)
+    whenever(desktopModeVisualIndicator.updateIndicatorType(anyOrNull()))
+      .thenReturn(DesktopModeVisualIndicator.IndicatorType.NO_INDICATOR)
+    spyController.onDragPositioningEnd(
         task,
         mockSurface,
         Point(100, -100), /* position */
@@ -2937,6 +2825,108 @@
   }
 
   @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES)
+  fun newWindow_fromFullscreenOpensInSplit() {
+    setUpLandscapeDisplay()
+    val task = setUpFullscreenTask()
+    val optionsCaptor = ArgumentCaptor.forClass(Bundle::class.java)
+    runOpenNewWindow(task)
+    verify(splitScreenController)
+      .startIntent(any(), anyInt(), any(), any(),
+        optionsCaptor.capture(), anyOrNull())
+    assertThat(ActivityOptions.fromBundle(optionsCaptor.value).launchWindowingMode)
+      .isEqualTo(WINDOWING_MODE_MULTI_WINDOW)
+  }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES)
+  fun newWindow_fromSplitOpensInSplit() {
+    setUpLandscapeDisplay()
+    val task = setUpSplitScreenTask()
+    val optionsCaptor = ArgumentCaptor.forClass(Bundle::class.java)
+    runOpenNewWindow(task)
+    verify(splitScreenController)
+      .startIntent(
+        any(), anyInt(), any(), any(),
+        optionsCaptor.capture(), anyOrNull()
+      )
+    assertThat(ActivityOptions.fromBundle(optionsCaptor.value).launchWindowingMode)
+      .isEqualTo(WINDOWING_MODE_MULTI_WINDOW)
+  }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES)
+  fun newWindow_fromFreeformAddsNewWindow() {
+    setUpLandscapeDisplay()
+    val task = setUpFreeformTask()
+    val wctCaptor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java)
+    runOpenNewWindow(task)
+    verify(transitions).startTransition(anyInt(), wctCaptor.capture(), anyOrNull())
+    assertThat(ActivityOptions.fromBundle(wctCaptor.value.hierarchyOps[0].launchOptions)
+      .launchWindowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
+  }
+
+  private fun runOpenNewWindow(task: RunningTaskInfo) {
+    markTaskVisible(task)
+    task.baseActivity = mock(ComponentName::class.java)
+    task.isFocused = true
+    runningTasks.add(task)
+    controller.openNewWindow(task)
+  }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES)
+  fun openInstance_fromFullscreenOpensInSplit() {
+    setUpLandscapeDisplay()
+    val task = setUpFullscreenTask()
+    val taskToRequest = setUpFreeformTask()
+    val optionsCaptor = ArgumentCaptor.forClass(Bundle::class.java)
+    runOpenInstance(task, taskToRequest.taskId)
+    verify(splitScreenController)
+      .startTask(anyInt(), anyInt(), optionsCaptor.capture(), anyOrNull())
+    assertThat(ActivityOptions.fromBundle(optionsCaptor.value).launchWindowingMode)
+      .isEqualTo(WINDOWING_MODE_MULTI_WINDOW)
+  }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES)
+  fun openInstance_fromSplitOpensInSplit() {
+    setUpLandscapeDisplay()
+    val task = setUpSplitScreenTask()
+    val taskToRequest = setUpFreeformTask()
+    val optionsCaptor = ArgumentCaptor.forClass(Bundle::class.java)
+    runOpenInstance(task, taskToRequest.taskId)
+    verify(splitScreenController)
+      .startTask(anyInt(), anyInt(), optionsCaptor.capture(), anyOrNull())
+    assertThat(ActivityOptions.fromBundle(optionsCaptor.value).launchWindowingMode)
+      .isEqualTo(WINDOWING_MODE_MULTI_WINDOW)
+  }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES)
+  fun openInstance_fromFreeformAddsNewWindow() {
+    setUpLandscapeDisplay()
+    val task = setUpFreeformTask()
+    val taskToRequest = setUpFreeformTask()
+    val wctCaptor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java)
+    runOpenInstance(task, taskToRequest.taskId)
+    verify(transitions).startTransition(anyInt(), wctCaptor.capture(), anyOrNull())
+    assertThat(ActivityOptions.fromBundle(wctCaptor.value.hierarchyOps[0].launchOptions)
+      .launchWindowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
+  }
+
+  private fun runOpenInstance(
+    callingTask: RunningTaskInfo,
+    requestedTaskId: Int
+  ) {
+    markTaskVisible(callingTask)
+    callingTask.baseActivity = mock(ComponentName::class.java)
+    callingTask.isFocused = true
+    runningTasks.add(callingTask)
+    controller.openInstance(callingTask, requestedTaskId)
+  }
+
+  @Test
   fun toggleBounds_togglesToStableBounds() {
     val bounds = Rect(0, 0, 100, 100)
     val task = setUpFreeformTask(DEFAULT_DISPLAY, bounds)
@@ -3170,6 +3160,59 @@
       Rect())
   }
 
+  @Test
+  fun shellController_registersUserChangeListener() {
+      verify(shellController, times(1)).addUserChangeListener(any())
+  }
+
+  @Test
+  fun toggleImmersive_enter_resizesToDisplayBounds() {
+    val task = setUpFreeformTask(DEFAULT_DISPLAY)
+    taskRepository.setTaskInFullImmersiveState(DEFAULT_DISPLAY, task.taskId, false /* immersive */)
+
+    controller.toggleDesktopTaskFullImmersiveState(task)
+
+    verify(mockDesktopFullImmersiveTransitionHandler).enterImmersive(eq(task), argThat { wct ->
+      wct.hasBoundsChange(task.token, Rect())
+    })
+  }
+
+  @Test
+  fun toggleImmersive_exit_resizesToStableBounds() {
+    val task = setUpFreeformTask(DEFAULT_DISPLAY)
+    taskRepository.setTaskInFullImmersiveState(DEFAULT_DISPLAY, task.taskId, true /* immersive */)
+
+    controller.toggleDesktopTaskFullImmersiveState(task)
+
+    verify(mockDesktopFullImmersiveTransitionHandler).exitImmersive(eq(task), argThat { wct ->
+      wct.hasBoundsChange(task.token, STABLE_BOUNDS)
+    })
+  }
+
+  @Test
+  @EnableFlags(FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+  fun onTaskInfoChanged_inImmersiveUnrequestsImmersive_exits() {
+    val task = setUpFreeformTask(DEFAULT_DISPLAY)
+    taskRepository.setTaskInFullImmersiveState(DEFAULT_DISPLAY, task.taskId, immersive = true)
+
+    task.requestedVisibleTypes = WindowInsets.Type.statusBars()
+    controller.onTaskInfoChanged(task)
+
+    verify(mockDesktopFullImmersiveTransitionHandler).exitImmersive(eq(task), any())
+  }
+
+  @Test
+  @EnableFlags(FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+  fun onTaskInfoChanged_notInImmersiveUnrequestsImmersive_noReExit() {
+    val task = setUpFreeformTask(DEFAULT_DISPLAY)
+    taskRepository.setTaskInFullImmersiveState(DEFAULT_DISPLAY, task.taskId, immersive = false)
+
+    task.requestedVisibleTypes = WindowInsets.Type.statusBars()
+    controller.onTaskInfoChanged(task)
+
+    verify(mockDesktopFullImmersiveTransitionHandler, never()).exitImmersive(eq(task), any())
+  }
+
   /**
    * Assert that an unhandled drag event launches a PendingIntent with the
    * windowing mode and bounds we are expecting.
@@ -3535,6 +3578,13 @@
       .isEqualTo(windowingMode)
 }
 
+private fun WindowContainerTransaction.hasBoundsChange(
+  token: WindowContainerToken,
+  bounds: Rect
+): Boolean = this.changes.any { change ->
+  change.key == token.asBinder() && change.value.configuration.windowConfiguration.bounds == bounds
+}
+
 private fun WindowContainerTransaction?.anyDensityConfigChange(
     token: WindowContainerToken
 ): Boolean {
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt
index 045e077..596b76d 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt
@@ -19,6 +19,8 @@
 import android.app.ActivityManager.RunningTaskInfo
 import android.os.Binder
 import android.os.Handler
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
 import android.platform.test.flag.junit.SetFlagsRule
 import android.testing.AndroidTestingRunner
 import android.view.Display.DEFAULT_DISPLAY
@@ -33,6 +35,7 @@
 import com.android.dx.mockito.inline.extended.StaticMockitoSession
 import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_MINIMIZE_WINDOW
 import com.android.internal.jank.InteractionJankMonitor
+import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
 import com.android.wm.shell.ShellTaskOrganizer
 import com.android.wm.shell.ShellTestCase
 import com.android.wm.shell.common.ShellExecutor
@@ -89,7 +92,7 @@
 
     private lateinit var mockitoSession: StaticMockitoSession
     private lateinit var desktopTasksLimiter: DesktopTasksLimiter
-    private lateinit var desktopTaskRepo: DesktopModeTaskRepository
+    private lateinit var desktopTaskRepo: DesktopRepository
     private lateinit var shellInit: ShellInit
     private lateinit var testScope: CoroutineScope
 
@@ -103,7 +106,7 @@
         testScope = CoroutineScope(Dispatchers.Unconfined + SupervisorJob())
 
         desktopTaskRepo =
-            DesktopModeTaskRepository(context, shellInit, persistentRepository, testScope)
+            DesktopRepository(context, shellInit, persistentRepository, testScope)
         desktopTasksLimiter =
             DesktopTasksLimiter(transitions, desktopTaskRepo, shellTaskOrganizer, MAX_TASK_LIMIT,
                 interactionJankMonitor, mContext, handler)
@@ -243,6 +246,7 @@
     }
 
     @Test
+    @DisableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
     fun removeLeftoverMinimizedTasks_activeNonMinimizedTasksStillAround_doesNothing() {
         desktopTaskRepo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 1)
         desktopTaskRepo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 2)
@@ -256,6 +260,7 @@
     }
 
     @Test
+    @DisableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
     fun removeLeftoverMinimizedTasks_noMinimizedTasks_doesNothing() {
         val wct = WindowContainerTransaction()
         desktopTasksLimiter.leftoverMinimizedTasksRemover.removeLeftoverMinimizedTasks(
@@ -265,6 +270,7 @@
     }
 
     @Test
+    @DisableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
     fun removeLeftoverMinimizedTasks_onlyMinimizedTasksLeft_removesAllMinimizedTasks() {
         val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
         val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
@@ -283,6 +289,20 @@
     }
 
     @Test
+    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
+    fun removeLeftoverMinimizedTasks_onlyMinimizedTasksLeft_backNavEnabled_doesNothing() {
+        val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
+        val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
+        desktopTaskRepo.minimizeTask(displayId = DEFAULT_DISPLAY, taskId = task1.taskId)
+        desktopTaskRepo.minimizeTask(displayId = DEFAULT_DISPLAY, taskId = task2.taskId)
+
+        val wct = WindowContainerTransaction()
+        desktopTasksLimiter.leftoverMinimizedTasksRemover.onActiveTasksChanged(DEFAULT_DISPLAY)
+
+        assertThat(wct.hierarchyOps).isEmpty()
+    }
+
+    @Test
     fun addAndGetMinimizeTaskChangesIfNeeded_tasksWithinLimit_noTaskMinimized() {
         (1..<MAX_TASK_LIMIT).forEach { _ -> setUpFreeformTask() }
 
@@ -291,7 +311,7 @@
                 desktopTasksLimiter.addAndGetMinimizeTaskChangesIfNeeded(
                         displayId = DEFAULT_DISPLAY,
                         wct = wct,
-                        newFrontTaskInfo = setUpFreeformTask())
+                        newFrontTaskId = setUpFreeformTask().taskId)
 
         assertThat(minimizedTaskId).isNull()
         assertThat(wct.hierarchyOps).isEmpty() // No reordering operations added
@@ -307,7 +327,7 @@
                 desktopTasksLimiter.addAndGetMinimizeTaskChangesIfNeeded(
                         displayId = DEFAULT_DISPLAY,
                         wct = wct,
-                        newFrontTaskInfo = setUpFreeformTask())
+                        newFrontTaskId = setUpFreeformTask().taskId)
 
         assertThat(minimizedTaskId).isEqualTo(tasks.first())
         assertThat(wct.hierarchyOps.size).isEqualTo(1)
@@ -325,7 +345,7 @@
                 desktopTasksLimiter.addAndGetMinimizeTaskChangesIfNeeded(
                         displayId = 0,
                         wct = wct,
-                        newFrontTaskInfo = setUpFreeformTask())
+                        newFrontTaskId = setUpFreeformTask().taskId)
 
         assertThat(minimizedTaskId).isNull()
         assertThat(wct.hierarchyOps).isEmpty() // No reordering operations added
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserverTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserverTest.kt
new file mode 100644
index 0000000..598df34
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserverTest.kt
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.desktopmode
+
+import android.app.ActivityManager.RunningTaskInfo
+import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
+import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.platform.test.annotations.EnableFlags
+import android.view.Display.DEFAULT_DISPLAY
+import android.view.WindowManager.TRANSIT_OPEN
+import android.view.WindowManager.TRANSIT_TO_BACK
+import android.window.IWindowContainerToken
+import android.window.TransitionInfo
+import android.window.TransitionInfo.Change
+import android.window.WindowContainerToken
+import com.android.modules.utils.testing.ExtendedMockitoRule
+import com.android.window.flags.Flags
+import com.android.wm.shell.ShellTaskOrganizer
+import com.android.wm.shell.common.ShellExecutor
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
+import com.android.wm.shell.sysui.ShellInit
+import com.android.wm.shell.transition.Transitions
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.Mockito
+import org.mockito.kotlin.any
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.never
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+class DesktopTasksTransitionObserverTest {
+
+    @JvmField
+    @Rule
+    val extendedMockitoRule =
+        ExtendedMockitoRule.Builder(this)
+            .mockStatic(DesktopModeStatus::class.java)
+            .build()!!
+
+    private val testExecutor = mock<ShellExecutor>()
+    private val mockShellInit = mock<ShellInit>()
+    private val transitions = mock<Transitions>()
+    private val context = mock<Context>()
+    private val shellTaskOrganizer = mock<ShellTaskOrganizer>()
+    private val taskRepository = mock<DesktopRepository>()
+
+    private lateinit var transitionObserver: DesktopTasksTransitionObserver
+    private lateinit var shellInit: ShellInit
+
+    @Before
+    fun setup() {
+        whenever(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(true)
+        shellInit = spy(ShellInit(testExecutor))
+
+        transitionObserver =
+            DesktopTasksTransitionObserver(
+                context, taskRepository, transitions, shellTaskOrganizer, shellInit
+            )
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
+    fun backNavigation_taskMinimized() {
+        val task = createTaskInfo(1)
+        whenever(taskRepository.getVisibleTaskCount(any())).thenReturn(1)
+
+        transitionObserver.onTransitionReady(
+            transition = mock(),
+            info =
+            createBackNavigationTransition(task),
+            startTransaction = mock(),
+            finishTransaction = mock(),
+        )
+
+        verify(taskRepository).minimizeTask(task.displayId, task.taskId)
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
+    fun backNavigation_nullTaskInfo_taskNotMinimized() {
+        val task = createTaskInfo(1)
+        whenever(taskRepository.getVisibleTaskCount(any())).thenReturn(1)
+
+        transitionObserver.onTransitionReady(
+            transition = mock(),
+            info =
+            createBackNavigationTransition(null),
+            startTransaction = mock(),
+            finishTransaction = mock(),
+        )
+
+        verify(taskRepository, never()).minimizeTask(task.displayId, task.taskId)
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
+    fun removeTasks_onTaskFullscreenLaunch_taskRemovedFromRepo() {
+        val task = createTaskInfo(1, WINDOWING_MODE_FULLSCREEN)
+        whenever(taskRepository.getVisibleTaskCount(any())).thenReturn(1)
+        whenever(taskRepository.isActiveTask(task.taskId)).thenReturn(true)
+
+        transitionObserver.onTransitionReady(
+            transition = mock(),
+            info = createOpenTransition(task),
+            startTransaction = mock(),
+            finishTransaction = mock(),
+        )
+
+        verify(taskRepository, never()).minimizeTask(task.displayId, task.taskId)
+        verify(taskRepository).removeFreeformTask(task.displayId, task.taskId)
+    }
+
+    private fun createBackNavigationTransition(
+        task: RunningTaskInfo?
+    ): TransitionInfo {
+        return TransitionInfo(TRANSIT_TO_BACK, 0 /* flags */).apply {
+            addChange(
+                Change(mock(), mock()).apply {
+                    mode = TRANSIT_TO_BACK
+                    parent = null
+                    taskInfo = task
+                    flags = flags
+                }
+            )
+        }
+    }
+
+    private fun createOpenTransition(
+        task: RunningTaskInfo?
+    ): TransitionInfo {
+        return TransitionInfo(TRANSIT_OPEN, 0 /* flags */).apply {
+            addChange(
+                Change(mock(), mock()).apply {
+                    mode = TRANSIT_OPEN
+                    parent = null
+                    taskInfo = task
+                    flags = flags
+                }
+            )
+        }
+    }
+
+    private fun createTaskInfo(id: Int, windowingMode: Int = WINDOWING_MODE_FREEFORM) =
+        RunningTaskInfo().apply {
+            taskId = id
+            displayId = DEFAULT_DISPLAY
+            configuration.windowConfiguration.windowingMode = windowingMode
+            token = WindowContainerToken(Mockito.mock(IWindowContainerToken::class.java))
+            baseIntent = Intent().apply {
+                component = ComponentName("package", "component.name")
+            }
+        }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt
index d9387d2..230f7e6 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt
@@ -581,7 +581,7 @@
                 )
             )
             .thenReturn(token)
-        handler.startDragToDesktopTransition(task.taskId, dragAnimator)
+        handler.startDragToDesktopTransition(task, dragAnimator)
         return token
     }
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt
new file mode 100644
index 0000000..1e105d9
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt
@@ -0,0 +1,470 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.desktopmode.education
+
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import android.testing.AndroidTestingRunner
+import android.testing.TestableContext
+import androidx.test.filters.SmallTest
+import com.android.modules.utils.testing.ExtendedMockitoRule
+import com.android.window.flags.Flags
+import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.desktopmode.CaptionState
+import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository
+import com.android.wm.shell.desktopmode.education.AppHandleEducationController.Companion.APP_HANDLE_EDUCATION_DELAY_MILLIS
+import com.android.wm.shell.desktopmode.education.AppHandleEducationController.Companion.APP_HANDLE_EDUCATION_TIMEOUT_MILLIS
+import com.android.wm.shell.desktopmode.education.data.AppHandleEducationDatastoreRepository
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
+import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource
+import com.android.wm.shell.util.createAppHandleState
+import com.android.wm.shell.util.createAppHeaderState
+import com.android.wm.shell.util.createWindowingEducationProto
+import com.android.wm.shell.windowdecor.education.DesktopWindowingEducationTooltipController
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.advanceTimeBy
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import kotlinx.coroutines.test.setMain
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.MockitoAnnotations
+import org.mockito.kotlin.any
+import org.mockito.kotlin.argumentCaptor
+import org.mockito.kotlin.atLeastOnce
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.never
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+/** Tests of [AppHandleEducationController] Usage: atest AppHandleEducationControllerTest */
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+@OptIn(ExperimentalCoroutinesApi::class)
+class AppHandleEducationControllerTest : ShellTestCase() {
+  @JvmField
+  @Rule
+  val extendedMockitoRule =
+      ExtendedMockitoRule.Builder(this).mockStatic(DesktopModeStatus::class.java).build()!!
+  @JvmField @Rule val setFlagsRule = SetFlagsRule()
+
+  private lateinit var educationController: AppHandleEducationController
+  private lateinit var testableContext: TestableContext
+  private val testScope = TestScope()
+  private val testDataStoreFlow = MutableStateFlow(createWindowingEducationProto())
+  private val testCaptionStateFlow = MutableStateFlow<CaptionState>(CaptionState.NoCaption)
+  private val educationConfigCaptor =
+      argumentCaptor<DesktopWindowingEducationTooltipController.EducationViewConfig>()
+  @Mock private lateinit var mockEducationFilter: AppHandleEducationFilter
+  @Mock private lateinit var mockDataStoreRepository: AppHandleEducationDatastoreRepository
+  @Mock private lateinit var mockCaptionHandleRepository: WindowDecorCaptionHandleRepository
+  @Mock private lateinit var mockTooltipController: DesktopWindowingEducationTooltipController
+
+  @Before
+  fun setUp() {
+    MockitoAnnotations.initMocks(this)
+    Dispatchers.setMain(StandardTestDispatcher(testScope.testScheduler))
+    testableContext = TestableContext(mContext)
+    whenever(mockDataStoreRepository.dataStoreFlow).thenReturn(testDataStoreFlow)
+    whenever(mockCaptionHandleRepository.captionStateFlow).thenReturn(testCaptionStateFlow)
+    whenever(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(true)
+
+    educationController =
+        AppHandleEducationController(
+            testableContext,
+            mockEducationFilter,
+            mockDataStoreRepository,
+            mockCaptionHandleRepository,
+            mockTooltipController,
+            testScope.backgroundScope,
+            Dispatchers.Main)
+  }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  fun init_appHandleVisible_shouldCallShowEducationTooltip() =
+      testScope.runTest {
+        // App handle is visible. Should show education tooltip.
+        setShouldShowAppHandleEducation(true)
+
+        // Simulate app handle visible.
+        testCaptionStateFlow.value = createAppHandleState()
+        // Wait for first tooltip to showup.
+        waitForBufferDelay()
+
+        verify(mockTooltipController, times(1)).showEducationTooltip(any(), any())
+      }
+
+  @Test
+  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  fun init_flagDisabled_shouldNotCallShowEducationTooltip() =
+      testScope.runTest {
+        // App handle visible but education aconfig flag disabled, should not show education
+        // tooltip.
+        whenever(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(false)
+        setShouldShowAppHandleEducation(true)
+
+        // Simulate app handle visible.
+        testCaptionStateFlow.value = createAppHandleState()
+        // Wait for first tooltip to showup.
+        waitForBufferDelay()
+
+        verify(mockTooltipController, never()).showEducationTooltip(any(), any())
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  fun init_shouldShowAppHandleEducationReturnsFalse_shouldNotCallShowEducationTooltip() =
+      testScope.runTest {
+        // App handle is visible but [shouldShowAppHandleEducation] api returns false, should not
+        // show education tooltip.
+        setShouldShowAppHandleEducation(false)
+
+        // Simulate app handle visible.
+        testCaptionStateFlow.value = createAppHandleState()
+        // Wait for first tooltip to showup.
+        waitForBufferDelay()
+
+        verify(mockTooltipController, never()).showEducationTooltip(any(), any())
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  fun init_appHandleNotVisible_shouldNotCallShowEducationTooltip() =
+      testScope.runTest {
+        // App handle is not visible, should not show education tooltip.
+        setShouldShowAppHandleEducation(true)
+
+        // Simulate app handle is not visible.
+        testCaptionStateFlow.value = CaptionState.NoCaption
+        // Wait for first tooltip to showup.
+        waitForBufferDelay()
+
+        verify(mockTooltipController, never()).showEducationTooltip(any(), any())
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  fun init_educationViewedAlready_shouldNotCallShowEducationTooltip() =
+      testScope.runTest {
+        // App handle is visible but education has been viewed before. Should not show education
+        // tooltip.
+        // Mark education viewed.
+        testDataStoreFlow.value =
+            createWindowingEducationProto(educationViewedTimestampMillis = 123L)
+        setShouldShowAppHandleEducation(true)
+
+        // Simulate app handle visible.
+        testCaptionStateFlow.value = createAppHandleState(isHandleMenuExpanded = false)
+        // Wait for first tooltip to showup.
+        waitForBufferDelay()
+
+        verify(mockTooltipController, never()).showEducationTooltip(any(), any())
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  fun init_appHandleExpanded_shouldMarkFeatureViewed() =
+      testScope.runTest {
+        setShouldShowAppHandleEducation(false)
+
+        // Simulate app handle visible and expanded.
+        testCaptionStateFlow.value = createAppHandleState(isHandleMenuExpanded = true)
+        // Wait for some time before verifying
+        waitForBufferDelay()
+
+        verify(mockDataStoreRepository, times(1)).updateFeatureUsedTimestampMillis(eq(true))
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  fun init_showFirstTooltip_shouldMarkEducationViewed() =
+      testScope.runTest {
+        // App handle is visible. Should show education tooltip.
+        setShouldShowAppHandleEducation(true)
+
+        // Simulate app handle visible.
+        testCaptionStateFlow.value = createAppHandleState()
+        // Wait for first tooltip to showup.
+        waitForBufferDelay()
+
+        verify(mockDataStoreRepository, times(1)).updateEducationViewedTimestampMillis(eq(true))
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  @Ignore("b/371527084: revisit testcase after refactoring original logic")
+  fun showWindowingImageButtonTooltip_appHandleExpanded_shouldCallShowEducationTooltipTwice() =
+      testScope.runTest {
+        // After first tooltip is dismissed, app handle is expanded. Should show second education
+        // tooltip.
+        showAndDismissFirstTooltip()
+
+        // Simulate app handle expanded.
+        testCaptionStateFlow.value = createAppHandleState(isHandleMenuExpanded = true)
+        // Wait for next tooltip to showup.
+        waitForBufferDelay()
+
+        // [showEducationTooltip] should be called twice, once for each tooltip.
+        verify(mockTooltipController, times(2)).showEducationTooltip(any(), any())
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  @Ignore("b/371527084: revisit testcase after refactoring original logic")
+  fun showWindowingImageButtonTooltip_appHandleExpandedAfterTimeout_shouldCallShowEducationTooltipOnce() =
+      testScope.runTest {
+        // After first tooltip is dismissed, app handle is expanded after timeout. Should not show
+        // second education tooltip.
+        showAndDismissFirstTooltip()
+
+        // Wait for timeout to occur, after this timeout we should not listen for further triggers
+        // anymore.
+        advanceTimeBy(APP_HANDLE_EDUCATION_TIMEOUT_BUFFER_MILLIS)
+        runCurrent()
+        // Simulate app handle expanded.
+        testCaptionStateFlow.value = createAppHandleState(isHandleMenuExpanded = true)
+        // Wait for next tooltip to showup.
+        waitForBufferDelay()
+
+        // [showEducationTooltip] should be called once, just for the first tooltip.
+        verify(mockTooltipController, times(1)).showEducationTooltip(any(), any())
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  @Ignore("b/371527084: revisit testcase after refactoring original logic")
+  fun showWindowingImageButtonTooltip_appHandleExpandedTwice_shouldCallShowEducationTooltipTwice() =
+      testScope.runTest {
+        // After first tooltip is dismissed, app handle is expanded twice. Should show second
+        // education tooltip only once.
+        showAndDismissFirstTooltip()
+
+        // Simulate app handle expanded.
+        testCaptionStateFlow.value = createAppHandleState(isHandleMenuExpanded = true)
+        // Wait for next tooltip to showup.
+        waitForBufferDelay()
+        // Simulate app handle being expanded twice.
+        testCaptionStateFlow.value = createAppHandleState(isHandleMenuExpanded = true)
+        waitForBufferDelay()
+
+        // [showEducationTooltip] should not be called thrice, even if app handle was expanded
+        // twice. Should be called twice, once for each tooltip.
+        verify(mockTooltipController, times(2)).showEducationTooltip(any(), any())
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  @Ignore("b/371527084: revisit testcase after refactoring original logic")
+  fun showWindowingImageButtonTooltip_appHandleNotExpanded_shouldCallShowEducationTooltipOnce() =
+      testScope.runTest {
+        // After first tooltip is dismissed, app handle is not expanded. Should not show second
+        // education tooltip.
+        showAndDismissFirstTooltip()
+
+        // Simulate app handle visible but not expanded.
+        testCaptionStateFlow.value = createAppHandleState(isHandleMenuExpanded = false)
+        // Wait for next tooltip to showup.
+        waitForBufferDelay()
+
+        // [showEducationTooltip] should be called once, just for the first tooltip.
+        verify(mockTooltipController, times(1)).showEducationTooltip(any(), any())
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  @Ignore("b/371527084: revisit testcase after refactoring original logic")
+  fun showExitWindowingButtonTooltip_appHeaderVisible_shouldCallShowEducationTooltipThrice() =
+      testScope.runTest {
+        // After first two tooltips are dismissed, app header is visible. Should show third
+        // education tooltip.
+        showAndDismissFirstTooltip()
+        showAndDismissSecondTooltip()
+
+        // Simulate app header visible.
+        testCaptionStateFlow.value = createAppHeaderState()
+        // Wait for next tooltip to showup.
+        waitForBufferDelay()
+
+        verify(mockTooltipController, times(3)).showEducationTooltip(any(), any())
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  @Ignore("b/371527084: revisit testcase after refactoring original logic")
+  fun showExitWindowingButtonTooltip_appHeaderVisibleAfterTimeout_shouldCallShowEducationTooltipTwice() =
+      testScope.runTest {
+        // After first two tooltips are dismissed, app header is visible after timeout. Should not
+        // show third education tooltip.
+        showAndDismissFirstTooltip()
+        showAndDismissSecondTooltip()
+
+        // Wait for timeout to occur, after this timeout we should not listen for further triggers
+        // anymore.
+        advanceTimeBy(APP_HANDLE_EDUCATION_TIMEOUT_BUFFER_MILLIS)
+        runCurrent()
+        // Simulate app header visible.
+        testCaptionStateFlow.value = createAppHeaderState()
+        // Wait for next tooltip to showup.
+        waitForBufferDelay()
+
+        verify(mockTooltipController, times(2)).showEducationTooltip(any(), any())
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  @Ignore("b/371527084: revisit testcase after refactoring original logic")
+  fun showExitWindowingButtonTooltip_appHeaderVisibleTwice_shouldCallShowEducationTooltipThrice() =
+      testScope.runTest {
+        // After first two tooltips are dismissed, app header is visible twice. Should show third
+        // education tooltip only once.
+        showAndDismissFirstTooltip()
+        showAndDismissSecondTooltip()
+
+        // Simulate app header visible.
+        testCaptionStateFlow.value = createAppHeaderState()
+        // Wait for next tooltip to showup.
+        waitForBufferDelay()
+        testCaptionStateFlow.value = createAppHeaderState()
+        // Wait for next tooltip to showup.
+        waitForBufferDelay()
+
+        verify(mockTooltipController, times(3)).showEducationTooltip(any(), any())
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  @Ignore("b/371527084: revisit testcase after refactoring original logic")
+  fun showExitWindowingButtonTooltip_appHeaderExpanded_shouldCallShowEducationTooltipTwice() =
+      testScope.runTest {
+        // After first two tooltips are dismissed, app header is visible but expanded. Should not
+        // show third education tooltip.
+        showAndDismissFirstTooltip()
+        showAndDismissSecondTooltip()
+
+        // Simulate app header visible.
+        testCaptionStateFlow.value = createAppHeaderState(isHeaderMenuExpanded = true)
+        // Wait for next tooltip to showup.
+        waitForBufferDelay()
+
+        verify(mockTooltipController, times(2)).showEducationTooltip(any(), any())
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  fun setAppHandleEducationTooltipCallbacks_onAppHandleTooltipClicked_callbackInvoked() =
+      testScope.runTest {
+        // App handle is visible. Should show education tooltip.
+        setShouldShowAppHandleEducation(true)
+        val mockOpenHandleMenuCallback: (Int) -> Unit = mock()
+        val mockToDesktopModeCallback: (Int, DesktopModeTransitionSource) -> Unit = mock()
+        educationController.setAppHandleEducationTooltipCallbacks(
+            mockOpenHandleMenuCallback, mockToDesktopModeCallback)
+        // Simulate app handle visible.
+        testCaptionStateFlow.value = createAppHandleState()
+        // Wait for first tooltip to showup.
+        waitForBufferDelay()
+
+        verify(mockTooltipController, atLeastOnce())
+            .showEducationTooltip(educationConfigCaptor.capture(), any())
+        educationConfigCaptor.lastValue.onEducationClickAction.invoke()
+
+        verify(mockOpenHandleMenuCallback, times(1)).invoke(any())
+      }
+
+  @Test
+  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+  @Ignore("b/371527084: revisit testcase after refactoring original logic")
+  fun setAppHandleEducationTooltipCallbacks_onWindowingImageButtonTooltipClicked_callbackInvoked() =
+      testScope.runTest {
+        // After first tooltip is dismissed, app handle is expanded. Should show second education
+        // tooltip.
+        showAndDismissFirstTooltip()
+        val mockOpenHandleMenuCallback: (Int) -> Unit = mock()
+        val mockToDesktopModeCallback: (Int, DesktopModeTransitionSource) -> Unit = mock()
+        educationController.setAppHandleEducationTooltipCallbacks(
+            mockOpenHandleMenuCallback, mockToDesktopModeCallback)
+        // Simulate app handle expanded.
+        testCaptionStateFlow.value = createAppHandleState(isHandleMenuExpanded = true)
+        // Wait for next tooltip to showup.
+        waitForBufferDelay()
+
+        verify(mockTooltipController, atLeastOnce())
+            .showEducationTooltip(educationConfigCaptor.capture(), any())
+        educationConfigCaptor.lastValue.onEducationClickAction.invoke()
+
+        verify(mockToDesktopModeCallback, times(1)).invoke(any(), any())
+      }
+
+  private suspend fun TestScope.showAndDismissFirstTooltip() {
+    setShouldShowAppHandleEducation(true)
+    // Simulate app handle visible.
+    testCaptionStateFlow.value = createAppHandleState(isHandleMenuExpanded = false)
+    // Wait for first tooltip to showup.
+    waitForBufferDelay()
+    // [shouldShowAppHandleEducation] should return false as education has been viewed
+    // before.
+    setShouldShowAppHandleEducation(false)
+    // Dismiss previous tooltip, after this we should listen for next tooltip's trigger.
+    captureAndInvokeOnDismissAction()
+  }
+
+  private fun TestScope.showAndDismissSecondTooltip() {
+    // Simulate app handle expanded.
+    testCaptionStateFlow.value = createAppHandleState(isHandleMenuExpanded = true)
+    // Wait for next tooltip to showup.
+    waitForBufferDelay()
+    // Dismiss previous tooltip, after this we should listen for next tooltip's trigger.
+    captureAndInvokeOnDismissAction()
+  }
+
+  private fun captureAndInvokeOnDismissAction() {
+    verify(mockTooltipController, atLeastOnce())
+        .showEducationTooltip(educationConfigCaptor.capture(), any())
+    educationConfigCaptor.lastValue.onDismissAction.invoke()
+  }
+
+  private suspend fun setShouldShowAppHandleEducation(shouldShowAppHandleEducation: Boolean) =
+      whenever(mockEducationFilter.shouldShowAppHandleEducation(any()))
+          .thenReturn(shouldShowAppHandleEducation)
+
+  /**
+   * Class under test waits for some seconds before showing education, simulate advance time before
+   * verifying or moving forward
+   */
+  private fun TestScope.waitForBufferDelay() {
+    advanceTimeBy(APP_HANDLE_EDUCATION_DELAY_BUFFER_MILLIS)
+    runCurrent()
+  }
+
+  private companion object {
+    val APP_HANDLE_EDUCATION_DELAY_BUFFER_MILLIS: Long = APP_HANDLE_EDUCATION_DELAY_MILLIS + 1000L
+    val APP_HANDLE_EDUCATION_TIMEOUT_BUFFER_MILLIS: Long =
+        APP_HANDLE_EDUCATION_TIMEOUT_MILLIS + 1000L
+  }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationDatastoreRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationDatastoreRepositoryTest.kt
index 765021f..c286544 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationDatastoreRepositoryTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationDatastoreRepositoryTest.kt
@@ -26,6 +26,7 @@
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.wm.shell.desktopmode.education.data.AppHandleEducationDatastoreRepository
 import com.android.wm.shell.desktopmode.education.data.WindowingEducationProto
+import com.android.wm.shell.util.GMAIL_PACKAGE_NAME
 import com.android.wm.shell.util.createWindowingEducationProto
 import com.google.common.truth.Truth.assertThat
 import java.io.File
@@ -108,8 +109,25 @@
         assertThat(result).isEqualTo(windowingEducationProto)
       }
 
+  @Test
+  fun updateEducationViewedTimestampMillis_updatesDatastoreProto() =
+      runTest(StandardTestDispatcher()) {
+        datastoreRepository.updateEducationViewedTimestampMillis(true)
+
+        val result = testDatastore.data.first().hasEducationViewedTimestampMillis()
+        assertThat(result).isEqualTo(true)
+      }
+
+  @Test
+  fun updateFeatureUsedTimestampMillis_updatesDatastoreProto() =
+      runTest(StandardTestDispatcher()) {
+        datastoreRepository.updateFeatureUsedTimestampMillis(true)
+
+        val result = testDatastore.data.first().hasFeatureUsedTimestampMillis()
+        assertThat(result).isEqualTo(true)
+      }
+
   companion object {
-    private const val GMAIL_PACKAGE_NAME = "com.google.android.gm"
     private const val APP_HANDLE_EDUCATION_DATASTORE_TEST_FILE = "app_handle_education_test.pb"
   }
 }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilterTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilterTest.kt
index c0d71c0..ac99424 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilterTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilterTest.kt
@@ -26,6 +26,10 @@
 import com.android.wm.shell.R
 import com.android.wm.shell.ShellTestCase
 import com.android.wm.shell.desktopmode.education.data.AppHandleEducationDatastoreRepository
+import com.android.wm.shell.util.GMAIL_PACKAGE_NAME
+import com.android.wm.shell.util.YOUTUBE_PACKAGE_NAME
+import com.android.wm.shell.util.createAppHandleState
+import com.android.wm.shell.util.createTaskInfo
 import com.android.wm.shell.util.createWindowingEducationProto
 import com.google.common.truth.Truth.assertThat
 import kotlin.Int.Companion.MAX_VALUE
@@ -38,6 +42,8 @@
 import org.mockito.Mockito.`when`
 import org.mockito.MockitoAnnotations
 
+/** Tests of [AppHandleEducationFilter]
+ * Usage: atest AppHandleEducationFilterTest */
 @SmallTest
 @RunWith(AndroidTestingRunner::class)
 class AppHandleEducationFilterTest : ShellTestCase() {
@@ -76,7 +82,7 @@
             appUsageStatsLastUpdateTimestampMillis = Long.MAX_VALUE)
     `when`(datastoreRepository.windowingEducationProto()).thenReturn(windowingEducationProto)
 
-    val result = educationFilter.shouldShowAppHandleEducation(GMAIL_PACKAGE_NAME)
+    val result = educationFilter.shouldShowAppHandleEducation(createAppHandleState())
 
     assertThat(result).isTrue()
   }
@@ -91,9 +97,11 @@
         createWindowingEducationProto(
             appUsageStats = mapOf(YOUTUBE_PACKAGE_NAME to 4),
             appUsageStatsLastUpdateTimestampMillis = Long.MAX_VALUE)
+    val captionState =
+        createAppHandleState(createTaskInfo(runningTaskPackageName = YOUTUBE_PACKAGE_NAME))
     `when`(datastoreRepository.windowingEducationProto()).thenReturn(windowingEducationProto)
 
-    val result = educationFilter.shouldShowAppHandleEducation(YOUTUBE_PACKAGE_NAME)
+    val result = educationFilter.shouldShowAppHandleEducation(captionState)
 
     assertThat(result).isFalse()
   }
@@ -110,7 +118,7 @@
             appUsageStatsLastUpdateTimestampMillis = Long.MAX_VALUE)
     `when`(datastoreRepository.windowingEducationProto()).thenReturn(windowingEducationProto)
 
-    val result = educationFilter.shouldShowAppHandleEducation(GMAIL_PACKAGE_NAME)
+    val result = educationFilter.shouldShowAppHandleEducation(createAppHandleState())
 
     assertThat(result).isFalse()
   }
@@ -125,7 +133,7 @@
             appUsageStatsLastUpdateTimestampMillis = Long.MAX_VALUE)
     `when`(datastoreRepository.windowingEducationProto()).thenReturn(windowingEducationProto)
 
-    val result = educationFilter.shouldShowAppHandleEducation(GMAIL_PACKAGE_NAME)
+    val result = educationFilter.shouldShowAppHandleEducation(createAppHandleState())
 
     assertThat(result).isFalse()
   }
@@ -140,7 +148,7 @@
             appUsageStatsLastUpdateTimestampMillis = Long.MAX_VALUE)
     `when`(datastoreRepository.windowingEducationProto()).thenReturn(windowingEducationProto)
 
-    val result = educationFilter.shouldShowAppHandleEducation(GMAIL_PACKAGE_NAME)
+    val result = educationFilter.shouldShowAppHandleEducation(createAppHandleState())
 
     assertThat(result).isFalse()
   }
@@ -156,7 +164,7 @@
             appUsageStatsLastUpdateTimestampMillis = Long.MAX_VALUE)
     `when`(datastoreRepository.windowingEducationProto()).thenReturn(windowingEducationProto)
 
-    val result = educationFilter.shouldShowAppHandleEducation(GMAIL_PACKAGE_NAME)
+    val result = educationFilter.shouldShowAppHandleEducation(createAppHandleState())
 
     assertThat(result).isFalse()
   }
@@ -179,15 +187,26 @@
         .thenReturn(mapOf(GMAIL_PACKAGE_NAME to UsageStats().apply { mAppLaunchCount = 2 }))
     `when`(datastoreRepository.windowingEducationProto()).thenReturn(windowingEducationProto)
 
-    val result = educationFilter.shouldShowAppHandleEducation(GMAIL_PACKAGE_NAME)
+    val result = educationFilter.shouldShowAppHandleEducation(createAppHandleState())
 
     // Result should be false as queried usage stats should be considered to determine the result
     // instead of cached stats
     assertThat(result).isFalse()
   }
 
-  companion object {
-    private const val GMAIL_PACKAGE_NAME = "com.google.android.gm"
-    private const val YOUTUBE_PACKAGE_NAME = "com.google.android.youtube"
+  @Test
+  fun shouldShowAppHandleEducation_appHandleMenuExpanded_returnsFalse() = runTest {
+    val windowingEducationProto =
+        createWindowingEducationProto(
+            appUsageStats = mapOf(GMAIL_PACKAGE_NAME to 4),
+            appUsageStatsLastUpdateTimestampMillis = Long.MAX_VALUE)
+    // Simulate app handle menu is expanded
+    val captionState = createAppHandleState(isHandleMenuExpanded = true)
+    `when`(datastoreRepository.windowingEducationProto()).thenReturn(windowingEducationProto)
+
+    val result = educationFilter.shouldShowAppHandleEducation(captionState)
+
+    // We should not show app handle education if app menu is expanded
+    assertThat(result).isFalse()
   }
 }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskListenerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskListenerTests.java
index 763d015..36e0427 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskListenerTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskListenerTests.java
@@ -18,15 +18,19 @@
 
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.view.Display.INVALID_DISPLAY;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
+import static com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.app.ActivityManager;
+import android.platform.test.annotations.EnableFlags;
 import android.view.SurfaceControl;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -37,7 +41,8 @@
 import com.android.wm.shell.ShellTestCase;
 import com.android.wm.shell.TestRunningTaskInfoBuilder;
 import com.android.wm.shell.common.LaunchAdjacentController;
-import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
+import com.android.wm.shell.desktopmode.DesktopRepository;
+import com.android.wm.shell.desktopmode.DesktopTasksController;
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
 import com.android.wm.shell.sysui.ShellInit;
 import com.android.wm.shell.windowdecor.WindowDecorViewModel;
@@ -69,7 +74,9 @@
     @Mock
     private SurfaceControl mMockSurfaceControl;
     @Mock
-    private DesktopModeTaskRepository mDesktopModeTaskRepository;
+    private DesktopRepository mDesktopRepository;
+    @Mock
+    private DesktopTasksController mDesktopTasksController;
     @Mock
     private LaunchAdjacentController mLaunchAdjacentController;
     private FreeformTaskListener mFreeformTaskListener;
@@ -85,7 +92,8 @@
                 mContext,
                 mShellInit,
                 mTaskOrganizer,
-                Optional.of(mDesktopModeTaskRepository),
+                Optional.of(mDesktopRepository),
+                Optional.of(mDesktopTasksController),
                 mLaunchAdjacentController,
                 mWindowDecorViewModel);
     }
@@ -98,7 +106,7 @@
 
         mFreeformTaskListener.onFocusTaskChanged(task);
 
-        verify(mDesktopModeTaskRepository)
+        verify(mDesktopRepository)
             .addOrMoveFreeformTaskToTop(task.displayId, task.taskId);
     }
 
@@ -110,7 +118,7 @@
 
         mFreeformTaskListener.onFocusTaskChanged(fullscreenTask);
 
-        verify(mDesktopModeTaskRepository, never())
+        verify(mDesktopRepository, never())
                 .addOrMoveFreeformTaskToTop(fullscreenTask.displayId, fullscreenTask.taskId);
     }
 
@@ -139,6 +147,52 @@
         verify(mLaunchAdjacentController).setLaunchAdjacentEnabled(true);
     }
 
+    @Test
+    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
+    public void onTaskVanished_nonClosingTask_isMinimized() {
+        ActivityManager.RunningTaskInfo task = new TestRunningTaskInfoBuilder()
+                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
+        task.isVisible = true;
+
+        mFreeformTaskListener.onTaskAppeared(task, mMockSurfaceControl);
+
+        task.isVisible = false;
+        task.displayId = INVALID_DISPLAY;
+        mFreeformTaskListener.onTaskVanished(task);
+
+        verify(mDesktopRepository).minimizeTask(task.displayId, task.taskId);
+    }
+
+    @Test
+    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
+    public void onTaskVanished_closingTask_isNotMinimized() {
+        ActivityManager.RunningTaskInfo task = new TestRunningTaskInfoBuilder()
+                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
+        task.isVisible = true;
+
+        mFreeformTaskListener.onTaskAppeared(task, mMockSurfaceControl);
+
+        when(mDesktopRepository.isClosingTask(task.taskId)).thenReturn(true);
+        task.isVisible = false;
+        task.displayId = INVALID_DISPLAY;
+        mFreeformTaskListener.onTaskVanished(task);
+
+        verify(mDesktopRepository, never()).minimizeTask(task.displayId, task.taskId);
+        verify(mDesktopRepository).removeFreeformTask(task.displayId, task.taskId);
+    }
+
+    @Test
+    public void onTaskInfoChanged_withDesktopController_forwards() {
+        ActivityManager.RunningTaskInfo task = new TestRunningTaskInfoBuilder()
+                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
+        task.isVisible = true;
+        mFreeformTaskListener.onTaskAppeared(task, mMockSurfaceControl);
+
+        mFreeformTaskListener.onTaskInfoChanged(task);
+
+        verify(mDesktopTasksController).onTaskInfoChanged(task);
+    }
+
     @After
     public void tearDown() {
         mMockitoSession.finishMocking();
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java
index 499e339..d4a319e 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java
@@ -17,8 +17,12 @@
 package com.android.wm.shell.freeform;
 
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static android.view.WindowManager.TRANSIT_CHANGE;
 import static android.view.WindowManager.TRANSIT_CLOSE;
 import static android.view.WindowManager.TRANSIT_OPEN;
+import static android.view.WindowManager.TRANSIT_TO_BACK;
+import static android.view.WindowManager.TRANSIT_TO_FRONT;
+import static android.view.WindowManager.TRANSIT_CHANGE;
 
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
@@ -30,6 +34,8 @@
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.os.IBinder;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.view.SurfaceControl;
 import android.window.IWindowContainerToken;
 import android.window.TransitionInfo;
@@ -37,30 +43,43 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.window.flags.Flags;
+
+import com.android.wm.shell.desktopmode.DesktopTaskChangeListener;
+import com.android.wm.shell.desktopmode.DesktopFullImmersiveTransitionHandler;
 import com.android.wm.shell.sysui.ShellInit;
 import com.android.wm.shell.transition.TransitionInfoBuilder;
 import com.android.wm.shell.transition.Transitions;
 import com.android.wm.shell.windowdecor.WindowDecorViewModel;
 
+import java.util.Optional;
+
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.Optional;
+
 /**
- * Tests of {@link FreeformTaskTransitionObserver}
+ * Tests for {@link FreeformTaskTransitionObserver}.
  */
 @SmallTest
 public class FreeformTaskTransitionObserverTest {
 
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
     @Mock
     private ShellInit mShellInit;
     @Mock
     private Transitions mTransitions;
     @Mock
+    private DesktopFullImmersiveTransitionHandler mDesktopFullImmersiveTransitionHandler;
+    @Mock
     private WindowDecorViewModel mWindowDecorViewModel;
-
+    @Mock
+    private TaskChangeListener mTaskChangeListener;
     private FreeformTaskTransitionObserver mTransitionObserver;
 
     @Before
@@ -69,30 +88,29 @@
 
         PackageManager pm = mock(PackageManager.class);
         doReturn(true).when(pm).hasSystemFeature(
-                PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT);
+            PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT);
         final Context context = mock(Context.class);
         doReturn(pm).when(context).getPackageManager();
 
         mTransitionObserver = new FreeformTaskTransitionObserver(
-                context, mShellInit, mTransitions, mWindowDecorViewModel);
-        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            final ArgumentCaptor<Runnable> initRunnableCaptor = ArgumentCaptor.forClass(
-                    Runnable.class);
-            verify(mShellInit).addInitCallback(initRunnableCaptor.capture(),
-                    same(mTransitionObserver));
-            initRunnableCaptor.getValue().run();
-        } else {
-            mTransitionObserver.onInit();
-        }
+                context, mShellInit, mTransitions,
+                Optional.of(mDesktopFullImmersiveTransitionHandler),
+                mWindowDecorViewModel, Optional.of(mTaskChangeListener));
+
+        final ArgumentCaptor<Runnable> initRunnableCaptor = ArgumentCaptor.forClass(
+                Runnable.class);
+        verify(mShellInit).addInitCallback(initRunnableCaptor.capture(),
+                same(mTransitionObserver));
+        initRunnableCaptor.getValue().run();
     }
 
     @Test
-    public void testRegistersObserverAtInit() {
+    public void init_registersObserver() {
         verify(mTransitions).registerObserver(same(mTransitionObserver));
     }
 
     @Test
-    public void testCreatesWindowDecorOnOpenTransition_freeform() {
+    public void openTransition_createsWindowDecor() {
         final TransitionInfo.Change change =
                 createChange(TRANSIT_OPEN, 1, WINDOWING_MODE_FREEFORM);
         final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0)
@@ -109,7 +127,71 @@
     }
 
     @Test
-    public void testPreparesWindowDecorOnCloseTransition_freeform() {
+    public void openTransition_notifiesOnTaskOpening() {
+        final TransitionInfo.Change change =
+                createChange(TRANSIT_OPEN, 1, WINDOWING_MODE_FREEFORM);
+        final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0)
+                .addChange(change).build();
+
+        final IBinder transition = mock(IBinder.class);
+        final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
+        final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);
+        mTransitionObserver.onTransitionReady(transition, info, startT, finishT);
+        mTransitionObserver.onTransitionStarting(transition);
+
+        verify(mTaskChangeListener).onTaskOpening(change.getTaskInfo());
+    }
+
+    @Test
+    public void toFrontTransition_notifiesOnTaskMovingToFront() {
+        final TransitionInfo.Change change =
+                createChange(TRANSIT_TO_FRONT, /* taskId= */ 1, WINDOWING_MODE_FREEFORM);
+        final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_TO_FRONT, /* flags= */ 0)
+                .addChange(change).build();
+
+        final IBinder transition = mock(IBinder.class);
+        final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
+        final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);
+        mTransitionObserver.onTransitionReady(transition, info, startT, finishT);
+        mTransitionObserver.onTransitionStarting(transition);
+
+        verify(mTaskChangeListener).onTaskMovingToFront(change.getTaskInfo());
+    }
+
+    @Test
+    public void toBackTransition_notifiesOnTaskMovingToBack() {
+        final TransitionInfo.Change change =
+                createChange(TRANSIT_TO_BACK, /* taskId= */ 1, WINDOWING_MODE_FREEFORM);
+        final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_TO_BACK, /* flags= */ 0)
+                .addChange(change).build();
+
+        final IBinder transition = mock(IBinder.class);
+        final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
+        final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);
+        mTransitionObserver.onTransitionReady(transition, info, startT, finishT);
+        mTransitionObserver.onTransitionStarting(transition);
+
+        verify(mTaskChangeListener).onTaskMovingToBack(change.getTaskInfo());
+    }
+
+    @Test
+    public void changeTransition_notifiesOnTaskChanging() {
+        final TransitionInfo.Change change =
+                createChange(TRANSIT_CHANGE, /* taskId= */ 1, WINDOWING_MODE_FREEFORM);
+        final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_CHANGE, /* flags= */ 0)
+                .addChange(change).build();
+
+        final IBinder transition = mock(IBinder.class);
+        final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
+        final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);
+        mTransitionObserver.onTransitionReady(transition, info, startT, finishT);
+        mTransitionObserver.onTransitionStarting(transition);
+
+        verify(mTaskChangeListener).onTaskChanging(change.getTaskInfo());
+    }
+
+    @Test
+    public void closeTransition_preparesWindowDecor() {
         final TransitionInfo.Change change =
                 createChange(TRANSIT_CLOSE, 1, WINDOWING_MODE_FREEFORM);
         final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_CLOSE, 0)
@@ -126,7 +208,23 @@
     }
 
     @Test
-    public void testDoesntCloseWindowDecorDuringCloseTransition() throws Exception {
+    public void closeTransition_notifiesOnTaskClosing() {
+        final TransitionInfo.Change change =
+                createChange(TRANSIT_CLOSE, 1, WINDOWING_MODE_FREEFORM);
+        final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_CLOSE, 0)
+                .addChange(change).build();
+
+        final IBinder transition = mock(IBinder.class);
+        final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
+        final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);
+        mTransitionObserver.onTransitionReady(transition, info, startT, finishT);
+        mTransitionObserver.onTransitionStarting(transition);
+
+        verify(mTaskChangeListener).onTaskClosing(change.getTaskInfo());
+    }
+
+    @Test
+    public void closeTransition_doesntCloseWindowDecorDuringTransition() throws Exception {
         final TransitionInfo.Change change =
                 createChange(TRANSIT_CLOSE, 1, WINDOWING_MODE_FREEFORM);
         final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_CLOSE, 0)
@@ -142,7 +240,7 @@
     }
 
     @Test
-    public void testClosesWindowDecorAfterCloseTransition() throws Exception {
+    public void closeTransition_closesWindowDecorAfterTransition() throws Exception {
         final TransitionInfo.Change change =
                 createChange(TRANSIT_CLOSE, 1, WINDOWING_MODE_FREEFORM);
         final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_CLOSE, 0)
@@ -161,7 +259,7 @@
     }
 
     @Test
-    public void testClosesMergedWindowDecorationAfterTransitionFinishes() throws Exception {
+    public void transitionFinished_closesMergedWindowDecoration() throws Exception {
         // The playing transition
         final TransitionInfo.Change change1 =
                 createChange(TRANSIT_OPEN, 1, WINDOWING_MODE_FREEFORM);
@@ -192,7 +290,7 @@
     }
 
     @Test
-    public void testClosesAllWindowDecorsOnTransitionMergeAfterCloseTransitions() throws Exception {
+    public void closeTransition_closesWindowDecorsOnTransitionMerge() throws Exception {
         // The playing transition
         final TransitionInfo.Change change1 =
                 createChange(TRANSIT_CLOSE, 1, WINDOWING_MODE_FREEFORM);
@@ -223,6 +321,19 @@
         verify(mWindowDecorViewModel).destroyWindowDecoration(change2.getTaskInfo());
     }
 
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+    public void onTransitionReady_forwardsToDesktopImmersiveHandler() {
+        final IBinder transition = mock(IBinder.class);
+        final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_CHANGE, 0).build();
+        final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
+        final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);
+
+        mTransitionObserver.onTransitionReady(transition, info, startT, finishT);
+
+        verify(mDesktopFullImmersiveTransitionHandler).onTransitionReady(transition);
+    }
+
     private static TransitionInfo.Change createChange(int mode, int taskId, int windowingMode) {
         final ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo();
         taskInfo.taskId = taskId;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedRecentTaskInfoTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedRecentTaskInfoTest.kt
index 0c3f98a..0c100fc 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedRecentTaskInfoTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedRecentTaskInfoTest.kt
@@ -30,7 +30,7 @@
 import com.android.wm.shell.shared.GroupedRecentTaskInfo.TYPE_SINGLE
 import com.android.wm.shell.shared.GroupedRecentTaskInfo.TYPE_SPLIT
 import com.android.wm.shell.shared.split.SplitBounds
-import com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_50_50
+import com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50
 import com.google.common.truth.Correspondence
 import com.google.common.truth.Truth.assertThat
 import org.junit.Assert.assertThrows
@@ -136,7 +136,7 @@
         assertThat(recentTaskInfoParcel.taskInfo2).isNotNull()
         assertThat(recentTaskInfoParcel.taskInfo2!!.taskId).isEqualTo(2)
         assertThat(recentTaskInfoParcel.splitBounds).isNotNull()
-        assertThat(recentTaskInfoParcel.splitBounds!!.snapPosition).isEqualTo(SNAP_TO_50_50)
+        assertThat(recentTaskInfoParcel.splitBounds!!.snapPosition).isEqualTo(SNAP_TO_2_50_50)
     }
 
     @Test
@@ -185,7 +185,7 @@
     private fun splitTasksGroupInfo(): GroupedRecentTaskInfo {
         val task1 = createTaskInfo(id = 1)
         val task2 = createTaskInfo(id = 2)
-        val splitBounds = SplitBounds(Rect(), Rect(), 1, 2, SNAP_TO_50_50)
+        val splitBounds = SplitBounds(Rect(), Rect(), 1, 2, SNAP_TO_2_50_50)
         return GroupedRecentTaskInfo.forSplitTasks(task1, task2, splitBounds)
     }
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java
index 386253c..9b73d53 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java
@@ -22,7 +22,8 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_50_50;
+import static com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -50,6 +51,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.graphics.Point;
 import android.graphics.Rect;
 import android.os.Bundle;
 import android.platform.test.annotations.DisableFlags;
@@ -68,7 +70,7 @@
 import com.android.wm.shell.TestShellExecutor;
 import com.android.wm.shell.common.DisplayInsetsController;
 import com.android.wm.shell.common.TaskStackListenerImpl;
-import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
+import com.android.wm.shell.desktopmode.DesktopRepository;
 import com.android.wm.shell.shared.GroupedRecentTaskInfo;
 import com.android.wm.shell.shared.ShellSharedConstants;
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
@@ -107,7 +109,7 @@
     @Mock
     private ShellCommandHandler mShellCommandHandler;
     @Mock
-    private DesktopModeTaskRepository mDesktopModeTaskRepository;
+    private DesktopRepository mDesktopRepository;
     @Mock
     private ActivityTaskManager mActivityTaskManager;
     @Mock
@@ -144,7 +146,7 @@
                 mDisplayInsetsController, mMainExecutor));
         mRecentTasksControllerReal = new RecentTasksController(mContext, mShellInit,
                 mShellController, mShellCommandHandler, mTaskStackListener, mActivityTaskManager,
-                Optional.of(mDesktopModeTaskRepository), mTaskStackTransitionObserver,
+                Optional.of(mDesktopRepository), mTaskStackTransitionObserver,
                 mMainExecutor);
         mRecentTasksController = spy(mRecentTasksControllerReal);
         mShellTaskOrganizer = new ShellTaskOrganizer(mShellInit, mShellCommandHandler,
@@ -211,10 +213,10 @@
 
         // Verify only one update if the split info is the same
         SplitBounds bounds1 = new SplitBounds(new Rect(0, 0, 50, 50),
-                new Rect(50, 50, 100, 100), t1.taskId, t2.taskId, SNAP_TO_50_50);
+                new Rect(50, 50, 100, 100), t1.taskId, t2.taskId, SNAP_TO_2_50_50);
         mRecentTasksController.addSplitPair(t1.taskId, t2.taskId, bounds1);
         SplitBounds bounds2 = new SplitBounds(new Rect(0, 0, 50, 50),
-                new Rect(50, 50, 100, 100), t1.taskId, t2.taskId, SNAP_TO_50_50);
+                new Rect(50, 50, 100, 100), t1.taskId, t2.taskId, SNAP_TO_2_50_50);
         mRecentTasksController.addSplitPair(t1.taskId, t2.taskId, bounds2);
         verify(mRecentTasksController, times(1)).notifyRecentTasksChanged();
     }
@@ -246,9 +248,9 @@
 
         // Mark a couple pairs [t2, t4], [t3, t5]
         SplitBounds pair1Bounds =
-                new SplitBounds(new Rect(), new Rect(), 2, 4, SNAP_TO_50_50);
+                new SplitBounds(new Rect(), new Rect(), 2, 4, SNAP_TO_2_50_50);
         SplitBounds pair2Bounds =
-                new SplitBounds(new Rect(), new Rect(), 3, 5, SNAP_TO_50_50);
+                new SplitBounds(new Rect(), new Rect(), 3, 5, SNAP_TO_2_50_50);
 
         mRecentTasksController.addSplitPair(t2.taskId, t4.taskId, pair1Bounds);
         mRecentTasksController.addSplitPair(t3.taskId, t5.taskId, pair2Bounds);
@@ -277,9 +279,9 @@
 
         // Mark a couple pairs [t2, t4], [t3, t5]
         SplitBounds pair1Bounds =
-                new SplitBounds(new Rect(), new Rect(), 2, 4, SNAP_TO_50_50);
+                new SplitBounds(new Rect(), new Rect(), 2, 4, SNAP_TO_2_50_50);
         SplitBounds pair2Bounds =
-                new SplitBounds(new Rect(), new Rect(), 3, 5, SNAP_TO_50_50);
+                new SplitBounds(new Rect(), new Rect(), 3, 5, SNAP_TO_2_50_50);
 
         mRecentTasksController.addSplitPair(t2.taskId, t4.taskId, pair1Bounds);
         mRecentTasksController.addSplitPair(t3.taskId, t5.taskId, pair2Bounds);
@@ -303,8 +305,8 @@
         ActivityManager.RecentTaskInfo t4 = makeTaskInfo(4);
         setRawList(t1, t2, t3, t4);
 
-        when(mDesktopModeTaskRepository.isActiveTask(1)).thenReturn(true);
-        when(mDesktopModeTaskRepository.isActiveTask(3)).thenReturn(true);
+        when(mDesktopRepository.isActiveTask(1)).thenReturn(true);
+        when(mDesktopRepository.isActiveTask(3)).thenReturn(true);
 
         ArrayList<GroupedRecentTaskInfo> recentTasks = mRecentTasksController.getRecentTasks(
                 MAX_VALUE, RECENT_IGNORE_UNAVAILABLE, 0);
@@ -339,11 +341,11 @@
         setRawList(t1, t2, t3, t4, t5);
 
         SplitBounds pair1Bounds =
-                new SplitBounds(new Rect(), new Rect(), 1, 2, SNAP_TO_50_50);
+                new SplitBounds(new Rect(), new Rect(), 1, 2, SNAP_TO_2_50_50);
         mRecentTasksController.addSplitPair(t1.taskId, t2.taskId, pair1Bounds);
 
-        when(mDesktopModeTaskRepository.isActiveTask(3)).thenReturn(true);
-        when(mDesktopModeTaskRepository.isActiveTask(5)).thenReturn(true);
+        when(mDesktopRepository.isActiveTask(3)).thenReturn(true);
+        when(mDesktopRepository.isActiveTask(5)).thenReturn(true);
 
         ArrayList<GroupedRecentTaskInfo> recentTasks = mRecentTasksController.getRecentTasks(
                 MAX_VALUE, RECENT_IGNORE_UNAVAILABLE, 0);
@@ -382,8 +384,8 @@
         ActivityManager.RecentTaskInfo t4 = makeTaskInfo(4);
         setRawList(t1, t2, t3, t4);
 
-        when(mDesktopModeTaskRepository.isActiveTask(1)).thenReturn(true);
-        when(mDesktopModeTaskRepository.isActiveTask(3)).thenReturn(true);
+        when(mDesktopRepository.isActiveTask(1)).thenReturn(true);
+        when(mDesktopRepository.isActiveTask(3)).thenReturn(true);
 
         ArrayList<GroupedRecentTaskInfo> recentTasks = mRecentTasksController.getRecentTasks(
                 MAX_VALUE, RECENT_IGNORE_UNAVAILABLE, 0);
@@ -410,10 +412,10 @@
         ActivityManager.RecentTaskInfo t5 = makeTaskInfo(5);
         setRawList(t1, t2, t3, t4, t5);
 
-        when(mDesktopModeTaskRepository.isActiveTask(1)).thenReturn(true);
-        when(mDesktopModeTaskRepository.isActiveTask(3)).thenReturn(true);
-        when(mDesktopModeTaskRepository.isActiveTask(5)).thenReturn(true);
-        when(mDesktopModeTaskRepository.isMinimizedTask(3)).thenReturn(true);
+        when(mDesktopRepository.isActiveTask(1)).thenReturn(true);
+        when(mDesktopRepository.isActiveTask(3)).thenReturn(true);
+        when(mDesktopRepository.isActiveTask(5)).thenReturn(true);
+        when(mDesktopRepository.isMinimizedTask(3)).thenReturn(true);
 
         ArrayList<GroupedRecentTaskInfo> recentTasks = mRecentTasksController.getRecentTasks(
                 MAX_VALUE, RECENT_IGNORE_UNAVAILABLE, 0);
@@ -441,6 +443,40 @@
     }
 
     @Test
+    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE)
+    public void testGetRecentTasks_hasDesktopTasks_persistenceEnabled_freeformTaskHaveBoundsSet() {
+        ActivityManager.RecentTaskInfo t1 = makeTaskInfo(1);
+        ActivityManager.RecentTaskInfo t2 = makeTaskInfo(2);
+
+        t1.lastNonFullscreenBounds = new Rect(100, 200, 300, 400);
+        t2.lastNonFullscreenBounds = new Rect(150, 250, 350, 450);
+        setRawList(t1, t2);
+
+        when(mDesktopRepository.isActiveTask(1)).thenReturn(true);
+        when(mDesktopRepository.isActiveTask(2)).thenReturn(true);
+
+        ArrayList<GroupedRecentTaskInfo> recentTasks = mRecentTasksController.getRecentTasks(
+                MAX_VALUE, RECENT_IGNORE_UNAVAILABLE, 0);
+
+        assertEquals(1, recentTasks.size());
+        GroupedRecentTaskInfo freeformGroup = recentTasks.get(0);
+
+        // Check bounds
+        assertEquals(t1.lastNonFullscreenBounds, freeformGroup.getTaskInfoList().get(
+                0).configuration.windowConfiguration.getAppBounds());
+        assertEquals(t2.lastNonFullscreenBounds, freeformGroup.getTaskInfoList().get(
+                1).configuration.windowConfiguration.getAppBounds());
+
+        // Check position in parent
+        assertEquals(new Point(t1.lastNonFullscreenBounds.left,
+                        t1.lastNonFullscreenBounds.top),
+                freeformGroup.getTaskInfoList().get(0).positionInParent);
+        assertEquals(new Point(t2.lastNonFullscreenBounds.left,
+                        t2.lastNonFullscreenBounds.top),
+                freeformGroup.getTaskInfoList().get(1).positionInParent);
+    }
+
+    @Test
     public void testRemovedTaskRemovesSplit() {
         ActivityManager.RecentTaskInfo t1 = makeTaskInfo(1);
         ActivityManager.RecentTaskInfo t2 = makeTaskInfo(2);
@@ -449,7 +485,7 @@
 
         // Add a pair
         SplitBounds pair1Bounds =
-                new SplitBounds(new Rect(), new Rect(), 2, 3, SNAP_TO_50_50);
+                new SplitBounds(new Rect(), new Rect(), 2, 3, SNAP_TO_2_50_50);
         mRecentTasksController.addSplitPair(t2.taskId, t3.taskId, pair1Bounds);
         reset(mRecentTasksController);
 
@@ -623,6 +659,7 @@
     private ActivityManager.RecentTaskInfo makeTaskInfo(int taskId) {
         ActivityManager.RecentTaskInfo info = new ActivityManager.RecentTaskInfo();
         info.taskId = taskId;
+        info.lastNonFullscreenBounds = new Rect();
         return info;
     }
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentsTransitionHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentsTransitionHandlerTest.java
index 769acf7..0effc3e 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentsTransitionHandlerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentsTransitionHandlerTest.java
@@ -48,7 +48,7 @@
 import com.android.wm.shell.TestShellExecutor;
 import com.android.wm.shell.common.DisplayInsetsController;
 import com.android.wm.shell.common.TaskStackListenerImpl;
-import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
+import com.android.wm.shell.desktopmode.DesktopRepository;
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
 import com.android.wm.shell.sysui.ShellCommandHandler;
 import com.android.wm.shell.sysui.ShellController;
@@ -82,7 +82,7 @@
     @Mock
     private ShellCommandHandler mShellCommandHandler;
     @Mock
-    private DesktopModeTaskRepository mDesktopModeTaskRepository;
+    private DesktopRepository mDesktopRepository;
     @Mock
     private ActivityTaskManager mActivityTaskManager;
     @Mock
@@ -120,7 +120,7 @@
                 mDisplayInsetsController, mMainExecutor));
         mRecentTasksControllerReal = new RecentTasksController(mContext, mShellInit,
                 mShellController, mShellCommandHandler, mTaskStackListener, mActivityTaskManager,
-                Optional.of(mDesktopModeTaskRepository), mTaskStackTransitionObserver,
+                Optional.of(mDesktopRepository), mTaskStackTransitionObserver,
                 mMainExecutor);
         mRecentTasksController = spy(mRecentTasksControllerReal);
         mShellTaskOrganizer = new ShellTaskOrganizer(mShellInit, mShellCommandHandler,
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/SplitBoundsTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/SplitBoundsTest.java
index 248393c..be8e6dc 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/SplitBoundsTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/SplitBoundsTest.java
@@ -1,6 +1,6 @@
 package com.android.wm.shell.recents;
 
-import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_50_50;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -46,21 +46,21 @@
     @Test
     public void testVerticalStacked() {
         SplitBounds ssb = new SplitBounds(mTopRect, mBottomRect,
-                TASK_ID_1, TASK_ID_2, SNAP_TO_50_50);
+                TASK_ID_1, TASK_ID_2, SNAP_TO_2_50_50);
         assertTrue(ssb.appsStackedVertically);
     }
 
     @Test
     public void testHorizontalStacked() {
         SplitBounds ssb = new SplitBounds(mLeftRect, mRightRect,
-                TASK_ID_1, TASK_ID_2, SNAP_TO_50_50);
+                TASK_ID_1, TASK_ID_2, SNAP_TO_2_50_50);
         assertFalse(ssb.appsStackedVertically);
     }
 
     @Test
     public void testHorizontalDividerBounds() {
         SplitBounds ssb = new SplitBounds(mTopRect, mBottomRect,
-                TASK_ID_1, TASK_ID_2, SNAP_TO_50_50);
+                TASK_ID_1, TASK_ID_2, SNAP_TO_2_50_50);
         Rect dividerBounds = ssb.visualDividerBounds;
         assertEquals(0, dividerBounds.left);
         assertEquals(DEVICE_LENGTH / 2 - DIVIDER_SIZE / 2, dividerBounds.top);
@@ -71,7 +71,7 @@
     @Test
     public void testVerticalDividerBounds() {
         SplitBounds ssb = new SplitBounds(mLeftRect, mRightRect,
-                TASK_ID_1, TASK_ID_2, SNAP_TO_50_50);
+                TASK_ID_1, TASK_ID_2, SNAP_TO_2_50_50);
         Rect dividerBounds = ssb.visualDividerBounds;
         assertEquals(DEVICE_WIDTH / 2 - DIVIDER_SIZE / 2, dividerBounds.left);
         assertEquals(0, dividerBounds.top);
@@ -82,7 +82,7 @@
     @Test
     public void testEqualVerticalTaskPercent() {
         SplitBounds ssb = new SplitBounds(mTopRect, mBottomRect,
-                TASK_ID_1, TASK_ID_2, SNAP_TO_50_50);
+                TASK_ID_1, TASK_ID_2, SNAP_TO_2_50_50);
         float topPercentSpaceTaken = (float) (DEVICE_LENGTH / 2 - DIVIDER_SIZE / 2) / DEVICE_LENGTH;
         assertEquals(topPercentSpaceTaken, ssb.topTaskPercent, 0.01);
     }
@@ -90,7 +90,7 @@
     @Test
     public void testEqualHorizontalTaskPercent() {
         SplitBounds ssb = new SplitBounds(mLeftRect, mRightRect,
-                TASK_ID_1, TASK_ID_2, SNAP_TO_50_50);
+                TASK_ID_1, TASK_ID_2, SNAP_TO_2_50_50);
         float leftPercentSpaceTaken = (float) (DEVICE_WIDTH / 2 - DIVIDER_SIZE / 2) / DEVICE_WIDTH;
         assertEquals(leftPercentSpaceTaken, ssb.leftTaskPercent, 0.01);
     }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/TaskStackTransitionObserverTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/TaskStackTransitionObserverTest.kt
index 0e5efa6..afdb687 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/TaskStackTransitionObserverTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/TaskStackTransitionObserverTest.kt
@@ -114,7 +114,7 @@
 
     @Test
     @EnableFlags(Flags.FLAG_ENABLE_TASK_STACK_OBSERVER_IN_SHELL)
-    fun taskCreated_fullscreenWindow_listenerNotNotified() {
+    fun taskCreated_fullscreenWindow_listenerNotified() {
         val listener = TestListener()
         val executor = TestShellExecutor()
         transitionObserver.addTaskStackTransitionObserverListener(listener, executor)
@@ -130,9 +130,9 @@
         callOnTransitionFinished()
         executor.flushAll()
 
-        assertThat(listener.taskInfoToBeNotified.taskId).isEqualTo(0)
+        assertThat(listener.taskInfoToBeNotified.taskId).isEqualTo(1)
         assertThat(listener.taskInfoToBeNotified.windowingMode)
-            .isEqualTo(WindowConfiguration.WINDOWING_MODE_UNDEFINED)
+            .isEqualTo(WindowConfiguration.WINDOWING_MODE_FULLSCREEN)
     }
 
     @Test
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/bubbles/BubbleInfoTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/bubbles/BubbleInfoTest.kt
index 641063c..205defe 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/bubbles/BubbleInfoTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/bubbles/BubbleInfoTest.kt
@@ -16,6 +16,8 @@
 
 package com.android.wm.shell.shared.bubbles
 
+import android.graphics.drawable.Icon
+import android.net.Uri
 import android.os.Parcel
 import android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE
 import android.testing.AndroidTestingRunner
@@ -42,7 +44,12 @@
                 "title",
                 "Some app",
                 true,
-                true
+                true,
+                ParcelableFlyoutMessage(
+                    Icon.createWithContentUri(Uri.parse("content://image/123")),
+                    "sender",
+                    "message"
+                )
             )
         val parcel = Parcel.obtain()
         bubbleInfo.writeToParcel(parcel, PARCELABLE_WRITE_RETURN_VALUE)
@@ -60,5 +67,10 @@
         assertThat(bubbleInfo.appName).isEqualTo(bubbleInfoFromParcel.appName)
         assertThat(bubbleInfo.isImportantConversation)
             .isEqualTo(bubbleInfoFromParcel.isImportantConversation)
+        with(bubbleInfo.parcelableFlyoutMessage!!) {
+            assertThat(icon!!.uri.toString()).isEqualTo("content://image/123")
+            assertThat(title).isEqualTo("sender")
+            assertThat(message).isEqualTo("message")
+        }
     }
 }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/split/SplitScreenConstantsTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/split/SplitScreenConstantsTest.kt
index 19c18be..ac96063 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/split/SplitScreenConstantsTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/split/SplitScreenConstantsTest.kt
@@ -42,19 +42,44 @@
             SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT,
         )
         assertEquals(
-            "the value of SNAP_TO_30_70 should be 0",
+            "the value of SNAP_TO_2_33_66 should be 0",
             0,
-            SplitScreenConstants.SNAP_TO_30_70,
+            SplitScreenConstants.SNAP_TO_2_33_66,
         )
         assertEquals(
-            "the value of SNAP_TO_50_50 should be 1",
+            "the value of SNAP_TO_2_50_50 should be 1",
             1,
-            SplitScreenConstants.SNAP_TO_50_50,
+            SplitScreenConstants.SNAP_TO_2_50_50,
         )
         assertEquals(
-            "the value of SNAP_TO_70_30 should be 2",
+            "the value of SNAP_TO_2_66_33 should be 2",
             2,
-            SplitScreenConstants.SNAP_TO_70_30,
+            SplitScreenConstants.SNAP_TO_2_66_33,
+        )
+        assertEquals(
+            "the value of SNAP_TO_2_90_10 should be 3",
+            3,
+            SplitScreenConstants.SNAP_TO_2_90_10,
+        )
+        assertEquals(
+            "the value of SNAP_TO_2_10_90 should be 4",
+            4,
+            SplitScreenConstants.SNAP_TO_2_10_90,
+        )
+        assertEquals(
+            "the value of SNAP_TO_3_33_33_33 should be 5",
+            5,
+            SplitScreenConstants.SNAP_TO_3_33_33_33,
+        )
+        assertEquals(
+            "the value of SNAP_TO_3_45_45_10 should be 6",
+            6,
+            SplitScreenConstants.SNAP_TO_3_45_45_10,
+        )
+        assertEquals(
+            "the value of SNAP_TO_3_10_45_45 should be 7",
+            7,
+            SplitScreenConstants.SNAP_TO_3_10_45_45,
         )
     }
 }
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java
index a6c16c4..67eda8b 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java
@@ -74,6 +74,7 @@
 import com.android.wm.shell.sysui.ShellController;
 import com.android.wm.shell.sysui.ShellInit;
 import com.android.wm.shell.transition.DefaultMixedHandler;
+import com.android.wm.shell.transition.FocusTransitionObserver;
 import com.android.wm.shell.transition.HomeTransitionObserver;
 import com.android.wm.shell.transition.Transitions;
 
@@ -429,7 +430,8 @@
         ShellInit shellInit = new ShellInit(mMainExecutor);
         final Transitions t = new Transitions(mContext, shellInit, mock(ShellController.class),
                 mTaskOrganizer, mTransactionPool, mock(DisplayController.class), mMainExecutor,
-                mMainHandler, mAnimExecutor, mock(HomeTransitionObserver.class));
+                mMainHandler, mAnimExecutor, mock(HomeTransitionObserver.class),
+                mock(FocusTransitionObserver.class));
         shellInit.init();
         return t;
     }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
index 5f75423..ce482cd 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
@@ -30,7 +30,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.times;
@@ -56,12 +55,11 @@
 import android.os.Looper;
 import android.os.UserHandle;
 import android.testing.TestableContext;
-import android.view.IWindowSession;
 import android.view.InsetsState;
 import android.view.Surface;
 import android.view.WindowManager;
-import android.view.WindowManagerGlobal;
 import android.view.WindowMetrics;
+import android.window.SnapshotDrawerUtils;
 import android.window.StartingWindowInfo;
 import android.window.StartingWindowRemovalInfo;
 import android.window.TaskSnapshot;
@@ -220,18 +218,10 @@
                 createWindowInfo(taskId, android.R.style.Theme, mBinder);
         TaskSnapshot snapshot = createTaskSnapshot(100, 100, new Point(100, 100),
                 new Rect(0, 0, 0, 50), true /* hasImeSurface */);
-        final IWindowSession session = WindowManagerGlobal.getWindowSession();
-        spyOn(session);
-        doReturn(WindowManagerGlobal.ADD_OKAY).when(session).addToDisplay(
-                any() /* window */, any() /* attrs */,
-                anyInt() /* viewVisibility */, anyInt() /* displayId */,
-                anyInt() /* requestedVisibleTypes */, any() /* outInputChannel */,
-                any() /* outInsetsState */, any() /* outActiveControls */,
-                any() /* outAttachedFrame */, any() /* outSizeCompatScale */);
-        TaskSnapshotWindow mockSnapshotWindow = TaskSnapshotWindow.create(windowInfo,
-                mBinder,
-                snapshot, mTestExecutor, () -> {
-                });
+        final TaskSnapshotWindow mockSnapshotWindow = new TaskSnapshotWindow(
+                snapshot, SnapshotDrawerUtils.getOrCreateTaskDescription(windowInfo.taskInfo),
+                snapshot.getOrientation(),
+                () -> {}, mTestExecutor);
         spyOn(mockSnapshotWindow);
         try (AutoCloseable mockTaskSnapshotSession = new AutoCloseable() {
             MockitoSession mockSession = mockitoSession()
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/FocusTransitionObserverTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/FocusTransitionObserverTest.java
new file mode 100644
index 0000000..d63158c
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/FocusTransitionObserverTest.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.transition;
+
+import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.WindowManager.TRANSIT_OPEN;
+import static android.window.TransitionInfo.FLAG_IS_DISPLAY;
+import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
+
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.when;
+
+import android.app.ActivityManager.RunningTaskInfo;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.view.SurfaceControl;
+import android.window.TransitionInfo;
+import android.window.TransitionInfo.TransitionMode;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.window.flags.Flags;
+import com.android.wm.shell.ShellTaskOrganizer;
+import com.android.wm.shell.ShellTestCase;
+import com.android.wm.shell.TestShellExecutor;
+import com.android.wm.shell.common.DisplayController;
+import com.android.wm.shell.shared.IFocusTransitionListener;
+import com.android.wm.shell.shared.TransactionPool;
+import com.android.wm.shell.sysui.ShellController;
+import com.android.wm.shell.sysui.ShellInit;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for the focus transition observer.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+@RequiresFlagsEnabled(Flags.FLAG_ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS)
+public class FocusTransitionObserverTest extends ShellTestCase {
+
+    static final int SECONDARY_DISPLAY_ID = 1;
+
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+    private IFocusTransitionListener mListener;
+    private Transitions mTransition;
+    private FocusTransitionObserver mFocusTransitionObserver;
+
+    @Before
+    public void setUp() {
+        mListener = mock(IFocusTransitionListener.class);
+        when(mListener.asBinder()).thenReturn(mock(IBinder.class));
+
+        mFocusTransitionObserver = new FocusTransitionObserver();
+        mTransition =
+                new Transitions(InstrumentationRegistry.getInstrumentation().getTargetContext(),
+                        mock(ShellInit.class), mock(ShellController.class),
+                        mock(ShellTaskOrganizer.class), mock(TransactionPool.class),
+                        mock(DisplayController.class), new TestShellExecutor(),
+                        new Handler(Looper.getMainLooper()), new TestShellExecutor(),
+                        mock(HomeTransitionObserver.class),
+                mFocusTransitionObserver);
+        mFocusTransitionObserver.setRemoteFocusTransitionListener(mTransition, mListener);
+    }
+
+    @Test
+    public void testOnlyDisplayChangeAffectsDisplayFocus() throws RemoteException {
+        final IBinder binder = mock(IBinder.class);
+        final SurfaceControl.Transaction tx = mock(SurfaceControl.Transaction.class);
+
+        // Open a task on the secondary display, but it doesn't change display focus because it only
+        // has a task change.
+        TransitionInfo info = mock(TransitionInfo.class);
+        final List<TransitionInfo.Change> changes = new ArrayList<>();
+        setupTaskChange(changes, 123 /* taskId */, TRANSIT_OPEN, SECONDARY_DISPLAY_ID,
+                true /* focused */);
+        when(info.getChanges()).thenReturn(changes);
+        mFocusTransitionObserver.onTransitionReady(binder, info, tx, tx);
+        verify(mListener, never()).onFocusedDisplayChanged(SECONDARY_DISPLAY_ID);
+        clearInvocations(mListener);
+
+        // Moving the secondary display to front must change display focus to it.
+        changes.clear();
+        setupDisplayToTopChange(changes, SECONDARY_DISPLAY_ID);
+        when(info.getChanges()).thenReturn(changes);
+        mFocusTransitionObserver.onTransitionReady(binder, info, tx, tx);
+        verify(mListener, times(1))
+                .onFocusedDisplayChanged(SECONDARY_DISPLAY_ID);
+
+        // Moving the secondary display to front must change display focus back to it.
+        changes.clear();
+        setupDisplayToTopChange(changes, DEFAULT_DISPLAY);
+        when(info.getChanges()).thenReturn(changes);
+        mFocusTransitionObserver.onTransitionReady(binder, info, tx, tx);
+        verify(mListener, times(1)).onFocusedDisplayChanged(DEFAULT_DISPLAY);
+    }
+
+    private void setupTaskChange(List<TransitionInfo.Change> changes, int taskId,
+            @TransitionMode int mode, int displayId, boolean focused) {
+        TransitionInfo.Change change = mock(TransitionInfo.Change.class);
+        RunningTaskInfo taskInfo = mock(RunningTaskInfo.class);
+        taskInfo.taskId = taskId;
+        taskInfo.isFocused = focused;
+        when(change.hasFlags(FLAG_MOVED_TO_TOP)).thenReturn(focused);
+        taskInfo.displayId = displayId;
+        when(change.getTaskInfo()).thenReturn(taskInfo);
+        when(change.getMode()).thenReturn(mode);
+        changes.add(change);
+    }
+
+    private void setupDisplayToTopChange(List<TransitionInfo.Change> changes, int displayId) {
+        TransitionInfo.Change change = mock(TransitionInfo.Change.class);
+        when(change.hasFlags(FLAG_MOVED_TO_TOP)).thenReturn(true);
+        when(change.hasFlags(FLAG_IS_DISPLAY)).thenReturn(true);
+        when(change.getEndDisplayId()).thenReturn(displayId);
+        changes.add(change);
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/HomeTransitionObserverTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/HomeTransitionObserverTest.java
index 8f49de0..8dfdfb4 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/HomeTransitionObserverTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/HomeTransitionObserverTest.java
@@ -100,7 +100,8 @@
         mHomeTransitionObserver = new HomeTransitionObserver(mContext, mMainExecutor);
         mTransition = new Transitions(mContext, mock(ShellInit.class), mock(ShellController.class),
                 mOrganizer, mTransactionPool, mDisplayController, mMainExecutor,
-                mMainHandler, mAnimExecutor, mHomeTransitionObserver);
+                mMainHandler, mAnimExecutor, mHomeTransitionObserver,
+                mock(FocusTransitionObserver.class));
         mHomeTransitionObserver.setHomeTransitionListener(mTransition, mListener);
     }
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
index aea14b9..6cde056 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
@@ -158,7 +158,8 @@
         ShellInit shellInit = mock(ShellInit.class);
         final Transitions t = new Transitions(mContext, shellInit, mock(ShellController.class),
                 mOrganizer, mTransactionPool, createTestDisplayController(), mMainExecutor,
-                mMainHandler, mAnimExecutor, mock(HomeTransitionObserver.class));
+                mMainHandler, mAnimExecutor, mock(HomeTransitionObserver.class),
+                mock(FocusTransitionObserver.class));
         // One from Transitions, one from RootTaskDisplayAreaOrganizer
         verify(shellInit).addInitCallback(any(), eq(t));
         verify(shellInit).addInitCallback(any(), isA(RootTaskDisplayAreaOrganizer.class));
@@ -170,7 +171,8 @@
         ShellController shellController = mock(ShellController.class);
         final Transitions t = new Transitions(mContext, shellInit, shellController,
                 mOrganizer, mTransactionPool, createTestDisplayController(), mMainExecutor,
-                mMainHandler, mAnimExecutor, mock(HomeTransitionObserver.class));
+                mMainHandler, mAnimExecutor, mock(HomeTransitionObserver.class),
+                mock(FocusTransitionObserver.class));
         shellInit.init();
         verify(shellController, times(1)).addExternalInterface(
                 eq(ShellSharedConstants.KEY_EXTRA_SHELL_SHELL_TRANSITIONS), any(), any());
@@ -1238,7 +1240,8 @@
         final Transitions transitions =
                 new Transitions(mContext, shellInit, mock(ShellController.class), mOrganizer,
                         mTransactionPool, createTestDisplayController(), mMainExecutor,
-                        mMainHandler, mAnimExecutor, mock(HomeTransitionObserver.class));
+                        mMainHandler, mAnimExecutor, mock(HomeTransitionObserver.class),
+                        mock(FocusTransitionObserver.class));
         final RecentsTransitionHandler recentsHandler =
                 new RecentsTransitionHandler(shellInit, mock(ShellTaskOrganizer.class), transitions,
                         mock(RecentTasksController.class), mock(HomeTransitionObserver.class));
@@ -1780,7 +1783,8 @@
         ShellInit shellInit = new ShellInit(mMainExecutor);
         final Transitions t = new Transitions(mContext, shellInit, mock(ShellController.class),
                 mOrganizer, mTransactionPool, createTestDisplayController(), mMainExecutor,
-                mMainHandler, mAnimExecutor, mock(HomeTransitionObserver.class));
+                mMainHandler, mAnimExecutor, mock(HomeTransitionObserver.class),
+                mock(FocusTransitionObserver.class));
         shellInit.init();
         return t;
     }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/util/WindowingEducationProtoUtils.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/util/WindowingEducationProtoUtils.kt
deleted file mode 100644
index def4b91..0000000
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/util/WindowingEducationProtoUtils.kt
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2024 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.wm.shell.util
-
-import com.android.wm.shell.desktopmode.education.data.WindowingEducationProto
-
-/**
- * Constructs a [WindowingEducationProto] object, populating its fields with the provided
- * parameters.
- *
- * Any fields without corresponding parameters will retain their default values.
- */
-fun createWindowingEducationProto(
-    educationViewedTimestampMillis: Long? = null,
-    featureUsedTimestampMillis: Long? = null,
-    appUsageStats: Map<String, Int>? = null,
-    appUsageStatsLastUpdateTimestampMillis: Long? = null
-): WindowingEducationProto =
-    WindowingEducationProto.newBuilder()
-        .apply {
-          if (educationViewedTimestampMillis != null) {
-            setEducationViewedTimestampMillis(educationViewedTimestampMillis)
-          }
-          if (featureUsedTimestampMillis != null) {
-            setFeatureUsedTimestampMillis(featureUsedTimestampMillis)
-          }
-          setAppHandleEducation(
-              createAppHandleEducationProto(appUsageStats, appUsageStatsLastUpdateTimestampMillis))
-        }
-        .build()
-
-/**
- * Constructs a [WindowingEducationProto.AppHandleEducation] object, populating its fields with the
- * provided parameters.
- *
- * Any fields without corresponding parameters will retain their default values.
- */
-fun createAppHandleEducationProto(
-    appUsageStats: Map<String, Int>? = null,
-    appUsageStatsLastUpdateTimestampMillis: Long? = null
-): WindowingEducationProto.AppHandleEducation =
-    WindowingEducationProto.AppHandleEducation.newBuilder()
-        .apply {
-          if (appUsageStats != null) putAllAppUsageStats(appUsageStats)
-          if (appUsageStatsLastUpdateTimestampMillis != null) {
-            setAppUsageStatsLastUpdateTimestampMillis(appUsageStatsLastUpdateTimestampMillis)
-          }
-        }
-        .build()
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/util/WindowingEducationTestUtils.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/util/WindowingEducationTestUtils.kt
new file mode 100644
index 0000000..708fadb
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/util/WindowingEducationTestUtils.kt
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.util
+
+import android.app.ActivityManager.RunningTaskInfo
+import android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED
+import android.content.pm.ActivityInfo
+import android.graphics.Rect
+import com.android.wm.shell.desktopmode.CaptionState
+import com.android.wm.shell.desktopmode.education.data.WindowingEducationProto
+
+/**
+ * Create an instance of [CaptionState.AppHandle] with parameters as properties.
+ *
+ * Any fields without corresponding parameters will retain their default values.
+ */
+fun createAppHandleState(
+    runningTaskInfo: RunningTaskInfo = createTaskInfo(),
+    isHandleMenuExpanded: Boolean = false,
+    globalAppHandleBounds: Rect = Rect(),
+): CaptionState.AppHandle =
+    CaptionState.AppHandle(
+        runningTaskInfo = runningTaskInfo,
+        isHandleMenuExpanded = isHandleMenuExpanded,
+        globalAppHandleBounds = globalAppHandleBounds)
+
+/**
+ * Create an instance of [CaptionState.AppHeader] with parameters as properties.
+ *
+ * Any fields without corresponding parameters will retain their default values.
+ */
+fun createAppHeaderState(
+    runningTaskInfo: RunningTaskInfo = createTaskInfo(),
+    isHeaderMenuExpanded: Boolean = false,
+    globalAppChipBounds: Rect = Rect(),
+): CaptionState.AppHeader =
+    CaptionState.AppHeader(
+        runningTaskInfo = runningTaskInfo,
+        isHeaderMenuExpanded = isHeaderMenuExpanded,
+        globalAppChipBounds = globalAppChipBounds)
+
+/**
+ * Create an instance of [RunningTaskInfo] with parameters as properties.
+ *
+ * Any fields without corresponding parameters will retain their default values.
+ */
+fun createTaskInfo(
+    deviceWindowingMode: Int = WINDOWING_MODE_UNDEFINED,
+    runningTaskPackageName: String = GMAIL_PACKAGE_NAME,
+): RunningTaskInfo =
+    RunningTaskInfo().apply {
+      configuration.windowConfiguration.windowingMode = deviceWindowingMode
+      topActivityInfo = ActivityInfo().apply { packageName = runningTaskPackageName }
+    }
+
+/**
+ * Constructs a [WindowingEducationProto] object, populating its fields with the provided
+ * parameters.
+ *
+ * Any fields without corresponding parameters will retain their default values.
+ */
+fun createWindowingEducationProto(
+    educationViewedTimestampMillis: Long? = null,
+    featureUsedTimestampMillis: Long? = null,
+    appUsageStats: Map<String, Int>? = null,
+    appUsageStatsLastUpdateTimestampMillis: Long? = null
+): WindowingEducationProto =
+    WindowingEducationProto.newBuilder()
+        .apply {
+          if (educationViewedTimestampMillis != null) {
+            setEducationViewedTimestampMillis(educationViewedTimestampMillis)
+          }
+          if (featureUsedTimestampMillis != null) {
+            setFeatureUsedTimestampMillis(featureUsedTimestampMillis)
+          }
+          setAppHandleEducation(
+              createAppHandleEducationProto(appUsageStats, appUsageStatsLastUpdateTimestampMillis))
+        }
+        .build()
+
+/**
+ * Constructs a [WindowingEducationProto.AppHandleEducation] object, populating its fields with the
+ * provided parameters.
+ *
+ * Any fields without corresponding parameters will retain their default values.
+ */
+fun createAppHandleEducationProto(
+    appUsageStats: Map<String, Int>? = null,
+    appUsageStatsLastUpdateTimestampMillis: Long? = null
+): WindowingEducationProto.AppHandleEducation =
+    WindowingEducationProto.AppHandleEducation.newBuilder()
+        .apply {
+          if (appUsageStats != null) putAllAppUsageStats(appUsageStats)
+          if (appUsageStatsLastUpdateTimestampMillis != null) {
+            setAppUsageStatsLastUpdateTimestampMillis(appUsageStatsLastUpdateTimestampMillis)
+          }
+        }
+        .build()
+
+const val GMAIL_PACKAGE_NAME = "com.google.android.gm"
+const val YOUTUBE_PACKAGE_NAME = "com.google.android.youtube"
+const val LAUNCHER_PACKAGE_NAME = "com.google.android.apps.nexuslauncher"
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/CaptionWindowDecorationTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/CaptionWindowDecorationTests.kt
index d141c2d..0f16b9d 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/CaptionWindowDecorationTests.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/CaptionWindowDecorationTests.kt
@@ -47,6 +47,8 @@
             taskInfo,
             true,
             false,
+            true /* isStatusBarVisible */,
+            false /* isKeyguardVisibleAndOccluded */,
             InsetsState()
         )
 
@@ -66,6 +68,8 @@
             taskInfo,
             true,
             false,
+            true /* isStatusBarVisible */,
+            false /* isKeyguardVisibleAndOccluded */,
             InsetsState()
         )
 
@@ -81,6 +85,8 @@
             taskInfo,
             true,
             false,
+            true /* isStatusBarVisible */,
+            false /* isKeyguardVisibleAndOccluded */,
             InsetsState()
         )
         Truth.assertThat(relayoutParams.mOccludingCaptionElements.size).isEqualTo(2)
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
index 3051714..4aa7e18 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
@@ -27,6 +27,7 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
+import android.content.Intent.ACTION_MAIN
 import android.content.pm.ActivityInfo
 import android.graphics.Rect
 import android.hardware.display.DisplayManager
@@ -64,6 +65,7 @@
 import android.window.WindowContainerTransaction
 import android.window.WindowContainerTransaction.HierarchyOp
 import androidx.test.filters.SmallTest
+import com.android.dx.mockito.inline.extended.ExtendedMockito.anyBoolean
 import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn
 import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
 import com.android.dx.mockito.inline.extended.StaticMockitoSession
@@ -85,10 +87,12 @@
 import com.android.wm.shell.common.ShellExecutor
 import com.android.wm.shell.common.SyncTransactionQueue
 import com.android.wm.shell.desktopmode.DesktopActivityOrientationChangeHandler
+import com.android.wm.shell.desktopmode.DesktopRepository
 import com.android.wm.shell.desktopmode.DesktopTasksController
 import com.android.wm.shell.desktopmode.DesktopTasksController.SnapPosition
 import com.android.wm.shell.desktopmode.DesktopTasksLimiter
 import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository
+import com.android.wm.shell.desktopmode.education.AppHandleEducationController
 import com.android.wm.shell.freeform.FreeformTaskTransitionStarter
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
 import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource
@@ -105,6 +109,7 @@
 import java.util.function.Supplier
 import junit.framework.Assert.assertFalse
 import junit.framework.Assert.assertTrue
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import org.junit.After
 import org.junit.Assert.assertEquals
 import org.junit.Before
@@ -136,6 +141,7 @@
  * Tests of [DesktopModeWindowDecorViewModel]
  * Usage: atest WMShellUnitTests:DesktopModeWindowDecorViewModelTests
  */
+@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(AndroidTestingRunner::class)
 @RunWithLooper
@@ -155,6 +161,7 @@
     @Mock private lateinit var mockTaskOrganizer: ShellTaskOrganizer
     @Mock private lateinit var mockDisplayController: DisplayController
     @Mock private lateinit var mockSplitScreenController: SplitScreenController
+    @Mock private lateinit var mockDesktopRepository: DesktopRepository
     @Mock private lateinit var mockDisplayLayout: DisplayLayout
     @Mock private lateinit var displayInsetsController: DisplayInsetsController
     @Mock private lateinit var mockSyncQueue: SyncTransactionQueue
@@ -184,6 +191,7 @@
     @Mock private lateinit var mockTaskPositionerFactory:
             DesktopModeWindowDecorViewModel.TaskPositionerFactory
     @Mock private lateinit var mockTaskPositioner: TaskPositioner
+    @Mock private lateinit var mockAppHandleEducationController: AppHandleEducationController
     @Mock private lateinit var mockCaptionHandleRepository: WindowDecorCaptionHandleRepository
     private lateinit var spyContext: TestableContext
 
@@ -225,6 +233,7 @@
                 mockShellCommandHandler,
                 mockWindowManager,
                 mockTaskOrganizer,
+                mockDesktopRepository,
                 mockDisplayController,
                 mockShellController,
                 displayInsetsController,
@@ -242,6 +251,7 @@
                 windowDecorByTaskIdSpy,
                 mockInteractionJankMonitor,
                 Optional.of(mockTasksLimiter),
+                mockAppHandleEducationController,
                 mockCaptionHandleRepository,
                 Optional.of(mockActivityOrientationChangeHandler),
                 mockTaskPositionerFactory
@@ -924,13 +934,13 @@
     @Test
     fun testDecor_onClickToOpenBrowser_closeMenus() {
         val openInBrowserListenerCaptor = forClass(Consumer::class.java)
-                as ArgumentCaptor<Consumer<Uri>>
+                as ArgumentCaptor<Consumer<Intent>>
         val decor = createOpenTaskDecoration(
             windowingMode = WINDOWING_MODE_FULLSCREEN,
             onOpenInBrowserClickListener = openInBrowserListenerCaptor
         )
 
-        openInBrowserListenerCaptor.value.accept(Uri.EMPTY)
+        openInBrowserListenerCaptor.value.accept(Intent())
 
         verify(decor).closeHandleMenu()
         verify(decor).closeMaximizeMenu()
@@ -940,23 +950,99 @@
     fun testDecor_onClickToOpenBrowser_opensBrowser() {
         doNothing().whenever(spyContext).startActivity(any())
         val uri = Uri.parse("https://www.google.com")
+        val intent = Intent(ACTION_MAIN, uri)
         val openInBrowserListenerCaptor = forClass(Consumer::class.java)
-                as ArgumentCaptor<Consumer<Uri>>
+                as ArgumentCaptor<Consumer<Intent>>
         createOpenTaskDecoration(
             windowingMode = WINDOWING_MODE_FULLSCREEN,
             onOpenInBrowserClickListener = openInBrowserListenerCaptor
         )
 
-        openInBrowserListenerCaptor.value.accept(uri)
+        openInBrowserListenerCaptor.value.accept(intent)
 
         verify(spyContext).startActivityAsUser(argThat { intent ->
-            intent.data == uri
-                    && ((intent.flags and Intent.FLAG_ACTIVITY_NEW_TASK) != 0)
-                    && intent.categories.contains(Intent.CATEGORY_LAUNCHER)
-                    && intent.action == Intent.ACTION_MAIN
+            uri.equals(intent.data)
+                    && intent.action == ACTION_MAIN
         }, eq(mockUserHandle))
     }
 
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+    fun testDecor_createWindowDecoration_setsAppHandleEducationTooltipClickCallbacks() {
+        whenever(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(true)
+
+        shellInit.init()
+
+        verify(
+            mockAppHandleEducationController,
+            times(1)
+        ).setAppHandleEducationTooltipCallbacks(any(), any())
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+    fun testDecor_invokeOpenHandleMenuCallback_openHandleMenu() {
+        whenever(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(true)
+        val task = createTask(windowingMode = WINDOWING_MODE_FREEFORM)
+        val decor = setUpMockDecorationForTask(task)
+        val openHandleMenuCallbackCaptor = argumentCaptor<(Int) -> Unit>()
+        // Set task as gmail
+        val gmailPackageName = "com.google.android.gm"
+        val baseComponent = ComponentName(gmailPackageName, /* class */ "")
+        task.baseActivity = baseComponent
+
+        onTaskOpening(task)
+        verify(
+            mockAppHandleEducationController,
+            times(1)
+        ).setAppHandleEducationTooltipCallbacks(openHandleMenuCallbackCaptor.capture(), any())
+        openHandleMenuCallbackCaptor.lastValue.invoke(task.taskId)
+
+        verify(decor, times(1)).createHandleMenu(anyBoolean())
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+    fun testDecor_openTaskWithFlagDisabled_doNotOpenHandleMenu() {
+        whenever(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(true)
+        val task = createTask(windowingMode = WINDOWING_MODE_FREEFORM)
+        setUpMockDecorationForTask(task)
+        val openHandleMenuCallbackCaptor = argumentCaptor<(Int) -> Unit>()
+        // Set task as gmail
+        val gmailPackageName = "com.google.android.gm"
+        val baseComponent = ComponentName(gmailPackageName, /* class */ "")
+        task.baseActivity = baseComponent
+
+        onTaskOpening(task)
+        verify(
+            mockAppHandleEducationController,
+            never()
+        ).setAppHandleEducationTooltipCallbacks(openHandleMenuCallbackCaptor.capture(), any())
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION)
+    fun testDecor_invokeOnToDesktopCallback_setsAppHandleEducationTooltipClickCallbacks() {
+        whenever(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(true)
+        val task = createTask(windowingMode = WINDOWING_MODE_FREEFORM)
+        setUpMockDecorationsForTasks(task)
+        onTaskOpening(task)
+        val onToDesktopCallbackCaptor = argumentCaptor<(Int, DesktopModeTransitionSource) -> Unit>()
+
+        verify(
+            mockAppHandleEducationController,
+            times(1)
+        ).setAppHandleEducationTooltipCallbacks(any(), onToDesktopCallbackCaptor.capture())
+        onToDesktopCallbackCaptor.lastValue.invoke(
+            task.taskId,
+            DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON
+        )
+
+        verify(mockDesktopTasksController, times(1))
+            .moveTaskToDesktop(any(), any(), any())
+    }
+
     @Test
     fun testOnDisplayRotation_tasksOutOfValidArea_taskBoundsUpdated() {
         val task = createTask(focused = true, windowingMode = WINDOWING_MODE_FREEFORM)
@@ -1135,9 +1221,48 @@
         assertEquals(decor.mTaskInfo.token.asBinder(), wct.getHierarchyOps().get(0).getContainer())
     }
 
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+    fun testMaximizeButtonClick_requestingImmersive_togglesDesktopImmersiveState() {
+        val onClickListenerCaptor = forClass(View.OnClickListener::class.java)
+                as ArgumentCaptor<View.OnClickListener>
+        val decor = createOpenTaskDecoration(
+            windowingMode = WINDOWING_MODE_FREEFORM,
+            onCaptionButtonClickListener = onClickListenerCaptor,
+            requestingImmersive = true,
+        )
+        val view = mock(View::class.java)
+        whenever(view.id).thenReturn(R.id.maximize_window)
+
+        onClickListenerCaptor.value.onClick(view)
+
+        verify(mockDesktopTasksController)
+            .toggleDesktopTaskFullImmersiveState(decor.mTaskInfo)
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+    fun testMaximizeButtonClick_notRequestingImmersive_togglesDesktopTaskSize() {
+        val onClickListenerCaptor = forClass(View.OnClickListener::class.java)
+                as ArgumentCaptor<View.OnClickListener>
+        val decor = createOpenTaskDecoration(
+            windowingMode = WINDOWING_MODE_FREEFORM,
+            onCaptionButtonClickListener = onClickListenerCaptor,
+            requestingImmersive = false,
+        )
+        val view = mock(View::class.java)
+        whenever(view.id).thenReturn(R.id.maximize_window)
+
+        onClickListenerCaptor.value.onClick(view)
+
+        verify(mockDesktopTasksController)
+            .toggleDesktopTaskSize(decor.mTaskInfo)
+    }
+
     private fun createOpenTaskDecoration(
         @WindowingMode windowingMode: Int,
         taskSurface: SurfaceControl = SurfaceControl(),
+        requestingImmersive: Boolean = false,
         onMaxOrRestoreListenerCaptor: ArgumentCaptor<Function0<Unit>> =
             forClass(Function0::class.java) as ArgumentCaptor<Function0<Unit>>,
         onLeftSnapClickListenerCaptor: ArgumentCaptor<Function0<Unit>> =
@@ -1150,14 +1275,17 @@
             forClass(Function0::class.java) as ArgumentCaptor<Function0<Unit>>,
         onToSplitScreenClickListenerCaptor: ArgumentCaptor<Function0<Unit>> =
             forClass(Function0::class.java) as ArgumentCaptor<Function0<Unit>>,
-        onOpenInBrowserClickListener: ArgumentCaptor<Consumer<Uri>> =
-            forClass(Consumer::class.java) as ArgumentCaptor<Consumer<Uri>>,
+        onOpenInBrowserClickListener: ArgumentCaptor<Consumer<Intent>> =
+            forClass(Consumer::class.java) as ArgumentCaptor<Consumer<Intent>>,
         onCaptionButtonClickListener: ArgumentCaptor<View.OnClickListener> =
             forClass(View.OnClickListener::class.java) as ArgumentCaptor<View.OnClickListener>,
         onCaptionButtonTouchListener: ArgumentCaptor<View.OnTouchListener> =
             forClass(View.OnTouchListener::class.java) as ArgumentCaptor<View.OnTouchListener>
     ): DesktopModeWindowDecoration {
-        val decor = setUpMockDecorationForTask(createTask(windowingMode = windowingMode))
+        val decor = setUpMockDecorationForTask(createTask(
+            windowingMode = windowingMode,
+            requestingImmersive = requestingImmersive
+        ))
         onTaskOpening(decor.mTaskInfo, taskSurface)
         verify(decor).setOnMaximizeOrRestoreClickListener(onMaxOrRestoreListenerCaptor.capture())
         verify(decor).setOnLeftSnapClickListener(onLeftSnapClickListenerCaptor.capture())
@@ -1196,6 +1324,7 @@
             activityType: Int = ACTIVITY_TYPE_STANDARD,
             focused: Boolean = true,
             activityInfo: ActivityInfo = ActivityInfo(),
+            requestingImmersive: Boolean = false
     ): RunningTaskInfo {
         return TestRunningTaskInfoBuilder()
                 .setDisplayId(displayId)
@@ -1206,6 +1335,11 @@
                     topActivityInfo = activityInfo
                     isFocused = focused
                     isResizeable = true
+                    requestedVisibleTypes = if (requestingImmersive) {
+                        statusBars().inv()
+                    } else {
+                        statusBars()
+                    }
                 }
     }
 
@@ -1213,8 +1347,8 @@
         val decoration = mock(DesktopModeWindowDecoration::class.java)
         whenever(
             mockDesktopModeWindowDecorFactory.create(
-                any(), any(), any(), any(), any(), eq(task), any(), any(), any(), any(), any(),
-                any(), any(), any(), any(), any(), any())
+                any(), any(), any(), any(), any(), any(), eq(task), any(), any(), any(), any(),
+                any(), any(), any(), any(), any(), any(), any())
         ).thenReturn(decoration)
         decoration.mTaskInfo = task
         whenever(decoration.isFocused).thenReturn(task.isFocused)
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
index f007115..35be80e 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
@@ -23,6 +23,7 @@
 import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
 import static android.view.InsetsSource.FLAG_FORCE_CONSUMING;
 import static android.view.InsetsSource.FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR;
+import static android.view.WindowInsets.Type.captionBar;
 import static android.view.WindowInsets.Type.statusBars;
 import static android.view.WindowInsetsController.APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND;
 
@@ -37,6 +38,7 @@
 
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.anyInt;
@@ -53,9 +55,11 @@
 import android.app.assist.AssistContent;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.PointF;
@@ -102,6 +106,7 @@
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.SyncTransactionQueue;
 import com.android.wm.shell.desktopmode.CaptionState;
+import com.android.wm.shell.desktopmode.DesktopRepository;
 import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository;
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
 import com.android.wm.shell.splitscreen.SplitScreenController;
@@ -124,6 +129,7 @@
 import org.mockito.Mock;
 import org.mockito.quality.Strictness;
 
+import java.util.List;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
@@ -157,6 +163,8 @@
     @Mock
     private ShellTaskOrganizer mMockShellTaskOrganizer;
     @Mock
+    private DesktopRepository mMockDesktopRepository;
+    @Mock
     private Choreographer mMockChoreographer;
     @Mock
     private SyncTransactionQueue mMockSyncQueue;
@@ -187,7 +195,7 @@
     @Mock
     private Handler mMockHandler;
     @Mock
-    private Consumer<Uri> mMockOpenInBrowserClickListener;
+    private Consumer<Intent> mMockOpenInBrowserClickListener;
     @Mock
     private AppToWebGenericLinksParser mMockGenericLinksParser;
     @Mock
@@ -242,9 +250,11 @@
         when(mMockMultiInstanceHelper.supportsMultiInstanceSplit(any()))
                 .thenReturn(false);
         when(mMockPackageManager.getApplicationLabel(any())).thenReturn("applicationLabel");
-        final ActivityInfo activityInfo = new ActivityInfo();
-        activityInfo.applicationInfo = new ApplicationInfo();
+        final ActivityInfo activityInfo = createActivityInfo();
         when(mMockPackageManager.getActivityInfo(any(), anyInt())).thenReturn(activityInfo);
+        final ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.activityInfo = activityInfo;
+        when(mMockPackageManager.resolveActivity(any(), anyInt())).thenReturn(resolveInfo);
         final Display defaultDisplay = mock(Display.class);
         doReturn(defaultDisplay).when(mMockDisplayController).getDisplay(Display.DEFAULT_DISPLAY);
         doReturn(mInsetsState).when(mMockDisplayController).getInsetsState(anyInt());
@@ -284,7 +294,11 @@
 
         DesktopModeWindowDecoration.updateRelayoutParams(
                 relayoutParams, mContext, taskInfo, /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat(relayoutParams.mShadowRadiusId).isNotEqualTo(Resources.ID_NULL);
     }
@@ -300,7 +314,11 @@
                 mTestableContext,
                 taskInfo,
                 /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat(relayoutParams.mCornerRadius).isGreaterThan(0);
     }
@@ -321,7 +339,11 @@
                 mTestableContext,
                 taskInfo,
                 /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat(relayoutParams.mWindowDecorConfig.densityDpi).isEqualTo(customTaskDensity);
     }
@@ -343,7 +365,11 @@
                 mTestableContext,
                 taskInfo,
                 /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat(relayoutParams.mWindowDecorConfig.densityDpi).isEqualTo(systemDensity);
     }
@@ -361,7 +387,11 @@
                 mTestableContext,
                 taskInfo,
                 /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat(relayoutParams.hasInputFeatureSpy()).isTrue();
     }
@@ -378,7 +408,11 @@
                 mTestableContext,
                 taskInfo,
                 /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat(relayoutParams.hasInputFeatureSpy()).isFalse();
     }
@@ -394,7 +428,11 @@
                 mTestableContext,
                 taskInfo,
                 /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat(relayoutParams.hasInputFeatureSpy()).isFalse();
     }
@@ -410,7 +448,11 @@
                 mTestableContext,
                 taskInfo,
                 /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat(hasNoInputChannelFeature(relayoutParams)).isFalse();
     }
@@ -427,7 +469,11 @@
                 mTestableContext,
                 taskInfo,
                 /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat(hasNoInputChannelFeature(relayoutParams)).isTrue();
     }
@@ -444,7 +490,11 @@
                 mTestableContext,
                 taskInfo,
                 /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat(hasNoInputChannelFeature(relayoutParams)).isTrue();
     }
@@ -462,7 +512,11 @@
                 mTestableContext,
                 taskInfo,
                 /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat((relayoutParams.mInsetSourceFlags & FLAG_FORCE_CONSUMING) != 0).isTrue();
     }
@@ -481,7 +535,11 @@
                 mTestableContext,
                 taskInfo,
                 /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat((relayoutParams.mInsetSourceFlags & FLAG_FORCE_CONSUMING) == 0).isTrue();
     }
@@ -498,7 +556,11 @@
                 mTestableContext,
                 taskInfo,
                 /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat(
                 (relayoutParams.mInsetSourceFlags & FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR) != 0)
@@ -517,7 +579,11 @@
                 mTestableContext,
                 taskInfo,
                 /* applyStartTransactionOnDraw= */ true,
-                /* shouldSetTaskPositionAndCrop */ false);
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
 
         assertThat(
                 (relayoutParams.mInsetSourceFlags & FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR) == 0)
@@ -525,6 +591,192 @@
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+    public void updateRelayoutParams_header_addsPaddingInFullImmersive() {
+        final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true);
+        taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);
+        taskInfo.configuration.windowConfiguration.setBounds(new Rect(0, 0, 1000, 2000));
+        final InsetsState insetsState = createInsetsState(List.of(
+                createInsetsSource(
+                        0 /* id */, statusBars(), true /* visible */, new Rect(0, 0, 1000, 50)),
+                createInsetsSource(
+                        1 /* id */, captionBar(), true /* visible */, new Rect(0, 0, 1000, 100))));
+        final RelayoutParams relayoutParams = new RelayoutParams();
+
+        DesktopModeWindowDecoration.updateRelayoutParams(
+                relayoutParams,
+                mTestableContext,
+                taskInfo,
+                /* applyStartTransactionOnDraw= */ true,
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ true,
+                insetsState);
+
+        // Takes status bar inset as padding, ignores caption bar inset.
+        assertThat(relayoutParams.mCaptionTopPadding).isEqualTo(50);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+    public void updateRelayoutParams_header_notAnInsetsSourceInFullyImmersive() {
+        final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true);
+        taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);
+        final RelayoutParams relayoutParams = new RelayoutParams();
+
+        DesktopModeWindowDecoration.updateRelayoutParams(
+                relayoutParams,
+                mTestableContext,
+                taskInfo,
+                /* applyStartTransactionOnDraw= */ true,
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ true,
+                new InsetsState());
+
+        assertThat(relayoutParams.mIsInsetSource).isFalse();
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+    public void updateRelayoutParams_header_statusBarInvisible_captionVisible() {
+        final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true);
+        taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);
+        final RelayoutParams relayoutParams = new RelayoutParams();
+
+        DesktopModeWindowDecoration.updateRelayoutParams(
+                relayoutParams,
+                mTestableContext,
+                taskInfo,
+                /* applyStartTransactionOnDraw= */ true,
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ false,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
+
+        // Header is always shown because it's assumed the status bar is always visible.
+        assertThat(relayoutParams.mIsCaptionVisible).isTrue();
+    }
+
+    @Test
+    public void updateRelayoutParams_handle_statusBarVisibleAndNotOverKeyguard_captionVisible() {
+        final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true);
+        taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+        final RelayoutParams relayoutParams = new RelayoutParams();
+
+        DesktopModeWindowDecoration.updateRelayoutParams(
+                relayoutParams,
+                mTestableContext,
+                taskInfo,
+                /* applyStartTransactionOnDraw= */ true,
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
+
+        assertThat(relayoutParams.mIsCaptionVisible).isTrue();
+    }
+
+    @Test
+    public void updateRelayoutParams_handle_statusBarInvisible_captionNotVisible() {
+        final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true);
+        taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+        final RelayoutParams relayoutParams = new RelayoutParams();
+
+        DesktopModeWindowDecoration.updateRelayoutParams(
+                relayoutParams,
+                mTestableContext,
+                taskInfo,
+                /* applyStartTransactionOnDraw= */ true,
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ false,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
+
+        assertThat(relayoutParams.mIsCaptionVisible).isFalse();
+    }
+
+    @Test
+    public void updateRelayoutParams_handle_overKeyguard_captionNotVisible() {
+        final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true);
+        taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+        final RelayoutParams relayoutParams = new RelayoutParams();
+
+        DesktopModeWindowDecoration.updateRelayoutParams(
+                relayoutParams,
+                mTestableContext,
+                taskInfo,
+                /* applyStartTransactionOnDraw= */ true,
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ true,
+                /* inFullImmersiveMode */ false,
+                new InsetsState());
+
+        assertThat(relayoutParams.mIsCaptionVisible).isFalse();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+    public void updateRelayoutParams_header_fullyImmersive_captionVisFollowsStatusBar() {
+        final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true);
+        taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);
+        final RelayoutParams relayoutParams = new RelayoutParams();
+
+        DesktopModeWindowDecoration.updateRelayoutParams(
+                relayoutParams,
+                mTestableContext,
+                taskInfo,
+                /* applyStartTransactionOnDraw= */ true,
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ true,
+                new InsetsState());
+
+        assertThat(relayoutParams.mIsCaptionVisible).isTrue();
+
+        DesktopModeWindowDecoration.updateRelayoutParams(
+                relayoutParams,
+                mTestableContext,
+                taskInfo,
+                /* applyStartTransactionOnDraw= */ true,
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ false,
+                /* isKeyguardVisibleAndOccluded */ false,
+                /* inFullImmersiveMode */ true,
+                new InsetsState());
+
+        assertThat(relayoutParams.mIsCaptionVisible).isFalse();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+    public void updateRelayoutParams_header_fullyImmersive_overKeyguard_captionNotVisible() {
+        final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true);
+        taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);
+        final RelayoutParams relayoutParams = new RelayoutParams();
+
+        DesktopModeWindowDecoration.updateRelayoutParams(
+                relayoutParams,
+                mTestableContext,
+                taskInfo,
+                /* applyStartTransactionOnDraw= */ true,
+                /* shouldSetTaskPositionAndCrop */ false,
+                /* isStatusBarVisible */ true,
+                /* isKeyguardVisibleAndOccluded */ true,
+                /* inFullImmersiveMode */ true,
+                new InsetsState());
+
+        assertThat(relayoutParams.mIsCaptionVisible).isFalse();
+    }
+
+    @Test
     public void relayout_fullscreenTask_appliesTransactionImmediately() {
         final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true);
         final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo));
@@ -771,7 +1023,6 @@
 
         // Verify handle menu's browser link is set to captured link since menu was opened before
         // captured link expired
-        createHandleMenu(decor);
         verifyHandleMenuCreated(TEST_URI1);
     }
 
@@ -782,7 +1033,7 @@
         final DesktopModeWindowDecoration decor = createWindowDecoration(
                 taskInfo, TEST_URI1 /* captured link */, null /* web uri */,
                 null /* generic link */);
-        final ArgumentCaptor<Function1<Uri, Unit>> openInBrowserCaptor =
+        final ArgumentCaptor<Function1<Intent, Unit>> openInBrowserCaptor =
                 ArgumentCaptor.forClass(Function1.class);
 
         // Simulate menu opening and clicking open in browser button
@@ -795,9 +1046,10 @@
                 any(),
                 openInBrowserCaptor.capture(),
                 any(),
+                any(),
                 any()
         );
-        openInBrowserCaptor.getValue().invoke(TEST_URI1);
+        openInBrowserCaptor.getValue().invoke(new Intent(Intent.ACTION_MAIN, TEST_URI1));
 
         // Verify handle menu's browser link not set to captured link since link not valid after
         // open in browser clicked
@@ -812,7 +1064,7 @@
         final DesktopModeWindowDecoration decor = createWindowDecoration(
                 taskInfo, TEST_URI1 /* captured link */, null /* web uri */,
                 null /* generic link */);
-        final ArgumentCaptor<Function1<Uri, Unit>> openInBrowserCaptor =
+        final ArgumentCaptor<Function1<Intent, Unit>> openInBrowserCaptor =
                 ArgumentCaptor.forClass(Function1.class);
         createHandleMenu(decor);
         verify(mMockHandleMenu).show(
@@ -823,12 +1075,14 @@
                 any(),
                 openInBrowserCaptor.capture(),
                 any(),
+                any(),
                 any()
         );
 
-        openInBrowserCaptor.getValue().invoke(TEST_URI1);
+        openInBrowserCaptor.getValue().invoke(new Intent(Intent.ACTION_MAIN, TEST_URI1));
 
-        verify(mMockOpenInBrowserClickListener).accept(TEST_URI1);
+        verify(mMockOpenInBrowserClickListener).accept(
+                argThat(intent -> intent.getData() == TEST_URI1));
     }
 
     @Test
@@ -872,6 +1126,7 @@
                 any(),
                 any(),
                 any(),
+                any(),
                 closeClickListener.capture(),
                 any()
         );
@@ -1021,8 +1276,9 @@
 
     private void verifyHandleMenuCreated(@Nullable Uri uri) {
         verify(mMockHandleMenuFactory).create(any(), any(), anyInt(), any(), any(),
-                any(), anyBoolean(), anyBoolean(), anyBoolean(), eq(uri), anyInt(),
-                anyInt(), anyInt());
+                any(), anyBoolean(), anyBoolean(), anyBoolean(),
+                argThat(intent -> (uri == null && intent == null) || intent.getData().equals(uri)),
+                anyInt(), anyInt(), anyInt());
     }
 
     private void createMaximizeMenu(DesktopModeWindowDecoration decoration, MaximizeMenu menu) {
@@ -1086,9 +1342,9 @@
             boolean relayout) {
         final DesktopModeWindowDecoration windowDecor = new DesktopModeWindowDecoration(mContext,
                 mContext, mMockDisplayController, mMockSplitScreenController,
-                mMockShellTaskOrganizer, taskInfo, mMockSurfaceControl, mMockHandler, mBgExecutor,
-                mMockChoreographer, mMockSyncQueue, mMockAppHeaderViewHolderFactory,
-                mMockRootTaskDisplayAreaOrganizer,
+                mMockDesktopRepository, mMockShellTaskOrganizer, taskInfo, mMockSurfaceControl,
+                mMockHandler, mBgExecutor, mMockChoreographer, mMockSyncQueue,
+                mMockAppHeaderViewHolderFactory, mMockRootTaskDisplayAreaOrganizer,
                 mMockGenericLinksParser, mMockAssistContentRequester, SurfaceControl.Builder::new,
                 mMockTransactionSupplier, WindowContainerTransaction::new, SurfaceControl::new,
                 new WindowManagerWrapper(mMockWindowManager), mMockSurfaceControlViewHostFactory,
@@ -1128,19 +1384,39 @@
         decor.onAssistContentReceived(mAssistContent);
     }
 
+    private static ActivityInfo createActivityInfo() {
+        final ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.packageName = "DesktopModeWindowDecorationTestPackage";
+        final ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.applicationInfo = applicationInfo;
+        activityInfo.name = "DesktopModeWindowDecorationTest";
+        return activityInfo;
+    }
+
     private static boolean hasNoInputChannelFeature(RelayoutParams params) {
         return (params.mInputFeatures & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL)
                 != 0;
     }
 
-    private InsetsState createInsetsState(@WindowInsets.Type.InsetsType int type, boolean visible) {
-        final InsetsState state = new InsetsState();
-        final InsetsSource source = new InsetsSource(/* id= */0, type);
+    private InsetsSource createInsetsSource(int id, @WindowInsets.Type.InsetsType int type,
+            boolean visible, @NonNull Rect frame) {
+        final InsetsSource source = new InsetsSource(id, type);
         source.setVisible(visible);
-        state.addSource(source);
+        source.setFrame(frame);
+        return source;
+    }
+
+    private InsetsState createInsetsState(@NonNull List<InsetsSource> sources) {
+        final InsetsState state = new InsetsState();
+        sources.forEach(state::addSource);
         return state;
     }
 
+    private InsetsState createInsetsState(@WindowInsets.Type.InsetsType int type, boolean visible) {
+        final InsetsSource source = createInsetsSource(0 /* id */, type, visible, new Rect());
+        return createInsetsState(List.of(source));
+    }
+
     private static class TestTouchEventListener extends GestureDetector.SimpleOnGestureListener
             implements View.OnClickListener, View.OnTouchListener, View.OnLongClickListener,
             View.OnGenericMotionListener, DragDetector.MotionEventHandler {
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt
index cabd472..1820133 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt
@@ -240,7 +240,7 @@
             null /* openInBrowserLink */, captionWidth = HANDLE_WIDTH, captionHeight = 50,
             captionX = captionX
         )
-        handleMenu.show(mock(), mock(), mock(), mock(), mock(), mock(), mock(), mock())
+        handleMenu.show(mock(), mock(), mock(), mock(), mock(), mock(), mock(), mock(), mock())
         return handleMenu
     }
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java
index 2e117ac..54dd15ba 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java
@@ -47,6 +47,7 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.same;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -246,6 +247,7 @@
         // Density is 2. Shadow radius is 10px. Caption height is 64px.
         taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
         final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
+        mRelayoutParams.mIsCaptionVisible = true;
 
         windowDecor.relayout(taskInfo);
 
@@ -319,6 +321,7 @@
         taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
 
         final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
+        mRelayoutParams.mIsCaptionVisible = true;
 
         windowDecor.relayout(taskInfo);
 
@@ -571,11 +574,7 @@
                 .build();
         final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
 
-        assertTrue(mInsetsState.getOrCreateSource(STATUS_BAR_INSET_SOURCE_ID, statusBars())
-                .isVisible());
-        assertTrue(mInsetsState.sourceSize() == 1);
-        assertTrue(mInsetsState.sourceAt(0).getType() == statusBars());
-
+        mRelayoutParams.mIsCaptionVisible = true;
         windowDecor.relayout(taskInfo);
 
         verify(mMockWindowContainerTransaction).addInsetsSource(eq(taskInfo.token), any(),
@@ -623,33 +622,6 @@
     }
 
     @Test
-    public void testRelayout_captionHidden_insetsRemoved() {
-        final Display defaultDisplay = mock(Display.class);
-        doReturn(defaultDisplay).when(mMockDisplayController)
-                .getDisplay(Display.DEFAULT_DISPLAY);
-
-        final ActivityManager.RunningTaskInfo taskInfo = new TestRunningTaskInfoBuilder()
-                .setDisplayId(Display.DEFAULT_DISPLAY)
-                .setVisible(true)
-                .setBounds(new Rect(0, 0, 1000, 1000))
-                .build();
-        taskInfo.isFocused = true;
-        // Caption visible at first.
-        when(mMockDisplayController.getInsetsState(taskInfo.displayId))
-                .thenReturn(createInsetsState(statusBars(), true /* visible */));
-        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
-        windowDecor.relayout(taskInfo);
-
-        // Hide caption so insets are removed.
-        windowDecor.onInsetsStateChanged(createInsetsState(statusBars(), false /* visible */));
-
-        verify(mMockWindowContainerTransaction).removeInsetsSource(eq(taskInfo.token), any(),
-                eq(0) /* index */, eq(captionBar()));
-        verify(mMockWindowContainerTransaction).removeInsetsSource(eq(taskInfo.token), any(),
-                eq(0) /* index */, eq(mandatorySystemGestures()));
-    }
-
-    @Test
     public void testRelayout_captionHidden_neverWasVisible_insetsNotRemoved() {
         final Display defaultDisplay = mock(Display.class);
         doReturn(defaultDisplay).when(mMockDisplayController)
@@ -661,9 +633,8 @@
                 .setBounds(new Rect(0, 0, 1000, 1000))
                 .build();
         // Hidden from the beginning, so no insets were ever added.
-        when(mMockDisplayController.getInsetsState(taskInfo.displayId))
-                .thenReturn(createInsetsState(statusBars(), false /* visible */));
         final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
+        mRelayoutParams.mIsCaptionVisible = false;
         windowDecor.relayout(taskInfo);
 
         // Never added.
@@ -679,6 +650,57 @@
     }
 
     @Test
+    public void testRelayout_notAnInsetsSource_doesNotAddInsets() {
+        final Display defaultDisplay = mock(Display.class);
+        doReturn(defaultDisplay).when(mMockDisplayController)
+                .getDisplay(Display.DEFAULT_DISPLAY);
+
+        final ActivityManager.RunningTaskInfo taskInfo = new TestRunningTaskInfoBuilder()
+                .setDisplayId(Display.DEFAULT_DISPLAY)
+                .setVisible(true)
+                .setBounds(new Rect(0, 0, 1000, 1000))
+                .build();
+        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
+
+        mRelayoutParams.mIsInsetSource = false;
+        windowDecor.relayout(taskInfo);
+
+        // Never added.
+        verify(mMockWindowContainerTransaction, never()).addInsetsSource(eq(taskInfo.token), any(),
+                eq(0) /* index */, eq(captionBar()), any(), any(), anyInt());
+        verify(mMockWindowContainerTransaction, never()).addInsetsSource(eq(taskInfo.token), any(),
+                eq(0) /* index */, eq(mandatorySystemGestures()), any(), any(), anyInt());
+    }
+
+    @Test
+    public void testRelayout_notAnInsetsSource_hadInsetsBefore_removesInsets() {
+        final Display defaultDisplay = mock(Display.class);
+        doReturn(defaultDisplay).when(mMockDisplayController)
+                .getDisplay(Display.DEFAULT_DISPLAY);
+
+        final ActivityManager.RunningTaskInfo taskInfo = new TestRunningTaskInfoBuilder()
+                .setDisplayId(Display.DEFAULT_DISPLAY)
+                .setVisible(true)
+                .setBounds(new Rect(0, 0, 1000, 1000))
+                .build();
+        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
+
+        mRelayoutParams.mIsCaptionVisible = true;
+        mRelayoutParams.mIsInsetSource = true;
+        windowDecor.relayout(taskInfo);
+
+        mRelayoutParams.mIsCaptionVisible = true;
+        mRelayoutParams.mIsInsetSource = false;
+        windowDecor.relayout(taskInfo);
+
+        // Insets should be removed.
+        verify(mMockWindowContainerTransaction).removeInsetsSource(eq(taskInfo.token), any(),
+                eq(0) /* index */, eq(captionBar()));
+        verify(mMockWindowContainerTransaction).removeInsetsSource(eq(taskInfo.token), any(),
+                eq(0) /* index */, eq(mandatorySystemGestures()));
+    }
+
+    @Test
     public void testClose_withExistingInsets_insetsRemoved() {
         final Display defaultDisplay = mock(Display.class);
         doReturn(defaultDisplay).when(mMockDisplayController)
@@ -692,7 +714,7 @@
         final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
 
         // Relayout will add insets.
-        mInsetsState.getOrCreateSource(STATUS_BAR_INSET_SOURCE_ID, captionBar()).setVisible(true);
+        mRelayoutParams.mIsCaptionVisible = true;
         windowDecor.relayout(taskInfo);
         verify(mMockWindowContainerTransaction).addInsetsSource(eq(taskInfo.token), any(),
                 eq(0) /* index */, eq(captionBar()), any(), any(), anyInt());
@@ -740,6 +762,7 @@
         final TestRunningTaskInfoBuilder builder = new TestRunningTaskInfoBuilder()
                 .setDisplayId(Display.DEFAULT_DISPLAY)
                 .setVisible(true);
+        mRelayoutParams.mIsCaptionVisible = true;
 
         // Relayout twice with different bounds.
         final ActivityManager.RunningTaskInfo firstTaskInfo =
@@ -767,6 +790,7 @@
         final TestRunningTaskInfoBuilder builder = new TestRunningTaskInfoBuilder()
                 .setDisplayId(Display.DEFAULT_DISPLAY)
                 .setVisible(true);
+        mRelayoutParams.mIsCaptionVisible = true;
 
         // Relayout twice with the same bounds.
         final ActivityManager.RunningTaskInfo firstTaskInfo =
@@ -797,6 +821,7 @@
         final ActivityManager.RunningTaskInfo taskInfo =
                 builder.setToken(token).setBounds(new Rect(0, 0, 1000, 1000)).build();
         final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
+        mRelayoutParams.mIsCaptionVisible = true;
         mRelayoutParams.mInsetSourceFlags =
                 FLAG_FORCE_CONSUMING | FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR;
         windowDecor.relayout(taskInfo);
@@ -901,76 +926,61 @@
     }
 
     @Test
-    public void onStatusBarVisibilityChange_fullscreen_shownToHidden_hidesCaption() {
+    public void onStatusBarVisibilityChange() {
         final ActivityManager.RunningTaskInfo task = createTaskInfo();
         task.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
         when(mMockDisplayController.getInsetsState(task.displayId))
                 .thenReturn(createInsetsState(statusBars(), true /* visible */));
-        final TestWindowDecoration decor = createWindowDecoration(task);
+        final TestWindowDecoration decor = spy(createWindowDecoration(task));
         decor.relayout(task);
-        assertTrue(decor.mIsCaptionVisible);
+        assertTrue(decor.mIsStatusBarVisible);
 
         decor.onInsetsStateChanged(createInsetsState(statusBars(), false /* visible */));
 
-        assertFalse(decor.mIsCaptionVisible);
+        verify(decor, times(2)).relayout(task);
     }
 
     @Test
-    public void onStatusBarVisibilityChange_fullscreen_hiddenToShown_showsCaption() {
+    public void onStatusBarVisibilityChange_noChange_doesNotRelayout() {
         final ActivityManager.RunningTaskInfo task = createTaskInfo();
         task.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
         when(mMockDisplayController.getInsetsState(task.displayId))
-                .thenReturn(createInsetsState(statusBars(), false /* visible */));
-        final TestWindowDecoration decor = createWindowDecoration(task);
+                .thenReturn(createInsetsState(statusBars(), true /* visible */));
+        final TestWindowDecoration decor = spy(createWindowDecoration(task));
         decor.relayout(task);
-        assertFalse(decor.mIsCaptionVisible);
 
         decor.onInsetsStateChanged(createInsetsState(statusBars(), true /* visible */));
 
-        assertTrue(decor.mIsCaptionVisible);
+        verify(decor, times(1)).relayout(task);
     }
 
     @Test
-    public void onStatusBarVisibilityChange_freeform_shownToHidden_keepsCaption() {
-        final ActivityManager.RunningTaskInfo task = createTaskInfo();
-        task.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);
-        when(mMockDisplayController.getInsetsState(task.displayId))
-                .thenReturn(createInsetsState(statusBars(), true /* visible */));
-        final TestWindowDecoration decor = createWindowDecoration(task);
-        decor.relayout(task);
-        assertTrue(decor.mIsCaptionVisible);
-
-        decor.onInsetsStateChanged(createInsetsState(statusBars(), false /* visible */));
-
-        assertTrue(decor.mIsCaptionVisible);
-    }
-
-    @Test
-    public void onKeyguardStateChange_hiddenToShownAndOccluding_hidesCaption() {
+    public void onKeyguardStateChange() {
         final ActivityManager.RunningTaskInfo task = createTaskInfo();
         when(mMockDisplayController.getInsetsState(task.displayId))
                 .thenReturn(createInsetsState(statusBars(), true /* visible */));
-        final TestWindowDecoration decor = createWindowDecoration(task);
+        final TestWindowDecoration decor = spy(createWindowDecoration(task));
         decor.relayout(task);
-        assertTrue(decor.mIsCaptionVisible);
+        assertFalse(decor.mIsKeyguardVisibleAndOccluded);
 
         decor.onKeyguardStateChanged(true /* visible */, true /* occluding */);
 
-        assertFalse(decor.mIsCaptionVisible);
+        assertTrue(decor.mIsKeyguardVisibleAndOccluded);
+        verify(decor, times(2)).relayout(task);
     }
 
     @Test
-    public void onKeyguardStateChange_showingAndOccludingToHidden_showsCaption() {
+    public void onKeyguardStateChange_noChange_doesNotRelayout() {
         final ActivityManager.RunningTaskInfo task = createTaskInfo();
         when(mMockDisplayController.getInsetsState(task.displayId))
                 .thenReturn(createInsetsState(statusBars(), true /* visible */));
-        final TestWindowDecoration decor = createWindowDecoration(task);
-        decor.onKeyguardStateChanged(true /* visible */, true /* occluding */);
-        assertFalse(decor.mIsCaptionVisible);
+        final TestWindowDecoration decor = spy(createWindowDecoration(task));
+        decor.relayout(task);
+        assertFalse(decor.mIsKeyguardVisibleAndOccluded);
 
-        decor.onKeyguardStateChanged(false /* visible */, false /* occluding */);
+        decor.onKeyguardStateChanged(false /* visible */, true /* occluding */);
 
-        assertTrue(decor.mIsCaptionVisible);
+        verify(decor, times(1)).relayout(task);
     }
 
     private ActivityManager.RunningTaskInfo createTaskInfo() {
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/education/DesktopWindowingEducationTooltipControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/education/DesktopWindowingEducationTooltipControllerTest.kt
new file mode 100644
index 0000000..741dfb8
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/education/DesktopWindowingEducationTooltipControllerTest.kt
@@ -0,0 +1,297 @@
+/*
+ * Copyright (C) 2024 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.wm.shell.windowdecor.education
+
+import android.annotation.LayoutRes
+import android.content.Context
+import android.graphics.Point
+import android.testing.AndroidTestingRunner
+import android.testing.TestableContext
+import android.testing.TestableLooper
+import android.testing.TestableResources
+import android.view.MotionEvent
+import android.view.Surface.ROTATION_180
+import android.view.Surface.ROTATION_90
+import android.view.View
+import android.view.WindowManager
+import android.widget.TextView
+import android.window.WindowContainerTransaction
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.toArgb
+import androidx.test.filters.SmallTest
+import com.android.wm.shell.R
+import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.common.DisplayController
+import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalSystemViewContainer
+import com.android.wm.shell.windowdecor.education.DesktopWindowingEducationTooltipController.TooltipArrowDirection
+import com.android.wm.shell.windowdecor.education.DesktopWindowingEducationTooltipController.TooltipColorScheme
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.Mock
+import org.mockito.MockitoAnnotations
+import org.mockito.kotlin.any
+import org.mockito.kotlin.anyOrNull
+import org.mockito.kotlin.argumentCaptor
+import org.mockito.kotlin.atLeastOnce
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+@SmallTest
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+@RunWith(AndroidTestingRunner::class)
+class DesktopWindowingEducationTooltipControllerTest : ShellTestCase() {
+  @Mock private lateinit var mockWindowManager: WindowManager
+  @Mock private lateinit var mockViewContainerFactory: AdditionalSystemViewContainer.Factory
+  @Mock private lateinit var mockDisplayController: DisplayController
+  @Mock private lateinit var mockPopupWindow: AdditionalSystemViewContainer
+  private lateinit var testableResources: TestableResources
+  private lateinit var testableContext: TestableContext
+  private lateinit var tooltipController: DesktopWindowingEducationTooltipController
+  private val tooltipViewArgumentCaptor = argumentCaptor<View>()
+
+  @Before
+  fun setUp() {
+    MockitoAnnotations.initMocks(this)
+    testableContext = TestableContext(mContext)
+    testableResources =
+        testableContext.orCreateTestableResources.apply {
+          addOverride(R.dimen.desktop_windowing_education_tooltip_padding, 10)
+        }
+    testableContext.addMockSystemService(
+        Context.LAYOUT_INFLATER_SERVICE, context.getSystemService(Context.LAYOUT_INFLATER_SERVICE))
+    testableContext.addMockSystemService(WindowManager::class.java, mockWindowManager)
+    tooltipController =
+        DesktopWindowingEducationTooltipController(
+            testableContext, mockViewContainerFactory, mockDisplayController)
+  }
+
+  @Test
+  fun showEducationTooltip_createsTooltipWithCorrectText() {
+    val tooltipText = "This is a tooltip"
+    val tooltipViewConfig = createTooltipConfig(tooltipText = tooltipText)
+
+    tooltipController.showEducationTooltip(tooltipViewConfig = tooltipViewConfig, taskId = 123)
+
+    verify(mockViewContainerFactory, times(1))
+        .create(
+            windowManagerWrapper = any(),
+            taskId = anyInt(),
+            x = anyInt(),
+            y = anyInt(),
+            width = anyInt(),
+            height = anyInt(),
+            flags = anyInt(),
+            view = tooltipViewArgumentCaptor.capture())
+    val tooltipTextView =
+        tooltipViewArgumentCaptor.lastValue.findViewById<TextView>(R.id.tooltip_text)
+    assertThat(tooltipTextView.text).isEqualTo(tooltipText)
+  }
+
+  @Test
+  fun showEducationTooltip_usesCorrectTaskIdForWindow() {
+    val tooltipViewConfig = createTooltipConfig()
+    val taskIdArgumentCaptor = argumentCaptor<Int>()
+
+    tooltipController.showEducationTooltip(tooltipViewConfig = tooltipViewConfig, taskId = 123)
+
+    verify(mockViewContainerFactory, times(1))
+        .create(
+            windowManagerWrapper = any(),
+            taskId = taskIdArgumentCaptor.capture(),
+            x = anyInt(),
+            y = anyInt(),
+            width = anyInt(),
+            height = anyInt(),
+            flags = anyInt(),
+            view = anyOrNull())
+    assertThat(taskIdArgumentCaptor.lastValue).isEqualTo(123)
+  }
+
+  @Test
+  fun showEducationTooltip_tooltipPointsUpwards_horizontallyPositionTooltip() {
+    val initialTooltipX = 0
+    val initialTooltipY = 0
+    val tooltipViewConfig =
+        createTooltipConfig(
+            arrowDirection = TooltipArrowDirection.UP,
+            tooltipViewGlobalCoordinates = Point(initialTooltipX, initialTooltipY))
+    val tooltipXArgumentCaptor = argumentCaptor<Int>()
+    val tooltipWidthArgumentCaptor = argumentCaptor<Int>()
+
+    tooltipController.showEducationTooltip(tooltipViewConfig = tooltipViewConfig, taskId = 123)
+
+    verify(mockViewContainerFactory, times(1))
+        .create(
+            windowManagerWrapper = any(),
+            taskId = anyInt(),
+            x = tooltipXArgumentCaptor.capture(),
+            y = anyInt(),
+            width = tooltipWidthArgumentCaptor.capture(),
+            height = anyInt(),
+            flags = anyInt(),
+            view = tooltipViewArgumentCaptor.capture())
+    val expectedTooltipX = initialTooltipX - tooltipWidthArgumentCaptor.lastValue / 2
+    assertThat(tooltipXArgumentCaptor.lastValue).isEqualTo(expectedTooltipX)
+  }
+
+  @Test
+  fun showEducationTooltip_tooltipPointsLeft_verticallyPositionTooltip() {
+    val initialTooltipX = 0
+    val initialTooltipY = 0
+    val tooltipViewConfig =
+        createTooltipConfig(
+            arrowDirection = TooltipArrowDirection.LEFT,
+            tooltipViewGlobalCoordinates = Point(initialTooltipX, initialTooltipY))
+    val tooltipYArgumentCaptor = argumentCaptor<Int>()
+    val tooltipHeightArgumentCaptor = argumentCaptor<Int>()
+
+    tooltipController.showEducationTooltip(tooltipViewConfig = tooltipViewConfig, taskId = 123)
+
+    verify(mockViewContainerFactory, times(1))
+        .create(
+            windowManagerWrapper = any(),
+            taskId = anyInt(),
+            x = anyInt(),
+            y = tooltipYArgumentCaptor.capture(),
+            width = anyInt(),
+            height = tooltipHeightArgumentCaptor.capture(),
+            flags = anyInt(),
+            view = tooltipViewArgumentCaptor.capture())
+    val expectedTooltipY = initialTooltipY - tooltipHeightArgumentCaptor.lastValue / 2
+    assertThat(tooltipYArgumentCaptor.lastValue).isEqualTo(expectedTooltipY)
+  }
+
+  @Test
+  fun showEducationTooltip_touchEventActionOutside_dismissActionPerformed() {
+    val mockLambda: () -> Unit = mock()
+    val tooltipViewConfig = createTooltipConfig(onDismissAction = mockLambda)
+
+    tooltipController.showEducationTooltip(tooltipViewConfig = tooltipViewConfig, taskId = 123)
+    verify(mockViewContainerFactory, times(1))
+        .create(
+            windowManagerWrapper = any(),
+            taskId = anyInt(),
+            x = anyInt(),
+            y = anyInt(),
+            width = anyInt(),
+            height = anyInt(),
+            flags = anyInt(),
+            view = tooltipViewArgumentCaptor.capture())
+    val motionEvent =
+        MotionEvent.obtain(
+            /* downTime= */ 0L,
+            /* eventTime= */ 0L,
+            MotionEvent.ACTION_OUTSIDE,
+            /* x= */ 0f,
+            /* y= */ 0f,
+            /* metaState= */ 0)
+    tooltipViewArgumentCaptor.lastValue.dispatchTouchEvent(motionEvent)
+
+    verify(mockLambda).invoke()
+  }
+
+  @Test
+  fun showEducationTooltip_tooltipClicked_onClickActionPerformed() {
+    val mockLambda: () -> Unit = mock()
+    val tooltipViewConfig = createTooltipConfig(onEducationClickAction = mockLambda)
+
+    tooltipController.showEducationTooltip(tooltipViewConfig = tooltipViewConfig, taskId = 123)
+    verify(mockViewContainerFactory, times(1))
+        .create(
+            windowManagerWrapper = any(),
+            taskId = anyInt(),
+            x = anyInt(),
+            y = anyInt(),
+            width = anyInt(),
+            height = anyInt(),
+            flags = anyInt(),
+            view = tooltipViewArgumentCaptor.capture())
+    tooltipViewArgumentCaptor.lastValue.performClick()
+
+    verify(mockLambda).invoke()
+  }
+
+  @Test
+  fun showEducationTooltip_displayRotationChanged_hidesTooltip() {
+    whenever(
+            mockViewContainerFactory.create(any(), any(), any(), any(), any(), any(), any(), any()))
+        .thenReturn(mockPopupWindow)
+    val tooltipViewConfig = createTooltipConfig()
+
+    tooltipController.showEducationTooltip(tooltipViewConfig = tooltipViewConfig, taskId = 123)
+    tooltipController.onDisplayChange(
+        /* displayId= */ 123,
+        /* fromRotation= */ ROTATION_90,
+        /* toRotation= */ ROTATION_180,
+        /* newDisplayAreaInfo= */ null,
+        WindowContainerTransaction(),
+    )
+
+    verify(mockPopupWindow, times(1)).releaseView()
+    verify(mockDisplayController, atLeastOnce()).removeDisplayChangingController(any())
+  }
+
+  @Test
+  fun showEducationTooltip_setTooltipColorScheme_correctColorsAreSet() {
+    val tooltipColorScheme =
+        TooltipColorScheme(
+            container = Color.Red.toArgb(), text = Color.Blue.toArgb(), icon = Color.Green.toArgb())
+    val tooltipViewConfig = createTooltipConfig(tooltipColorScheme = tooltipColorScheme)
+
+    tooltipController.showEducationTooltip(tooltipViewConfig = tooltipViewConfig, taskId = 123)
+
+    verify(mockViewContainerFactory, times(1))
+        .create(
+            windowManagerWrapper = any(),
+            taskId = anyInt(),
+            x = anyInt(),
+            y = anyInt(),
+            width = anyInt(),
+            height = anyInt(),
+            flags = anyInt(),
+            view = tooltipViewArgumentCaptor.capture())
+    val tooltipTextView =
+        tooltipViewArgumentCaptor.lastValue.findViewById<TextView>(R.id.tooltip_text)
+    assertThat(tooltipTextView.textColors.defaultColor).isEqualTo(Color.Blue.toArgb())
+  }
+
+  private fun createTooltipConfig(
+      @LayoutRes tooltipViewLayout: Int = R.layout.desktop_windowing_education_top_arrow_tooltip,
+      tooltipColorScheme: TooltipColorScheme =
+          TooltipColorScheme(
+              container = Color.Red.toArgb(), text = Color.Red.toArgb(), icon = Color.Red.toArgb()),
+      tooltipViewGlobalCoordinates: Point = Point(0, 0),
+      tooltipText: String = "This is a tooltip",
+      arrowDirection: TooltipArrowDirection = TooltipArrowDirection.UP,
+      onEducationClickAction: () -> Unit = {},
+      onDismissAction: () -> Unit = {}
+  ) =
+      DesktopWindowingEducationTooltipController.EducationViewConfig(
+          tooltipViewLayout = tooltipViewLayout,
+          tooltipColorScheme = tooltipColorScheme,
+          tooltipViewGlobalCoordinates = tooltipViewGlobalCoordinates,
+          tooltipText = tooltipText,
+          arrowDirection = arrowDirection,
+          onEducationClickAction = onEducationClickAction,
+          onDismissAction = onDismissAction,
+      )
+}
diff --git a/libs/androidfw/Android.bp b/libs/androidfw/Android.bp
index a39f30b..385fbfe 100644
--- a/libs/androidfw/Android.bp
+++ b/libs/androidfw/Android.bp
@@ -75,6 +75,7 @@
         "BigBufferStream.cpp",
         "ChunkIterator.cpp",
         "ConfigDescription.cpp",
+        "CursorWindow.cpp",
         "FileStream.cpp",
         "Idmap.cpp",
         "LoadedArsc.cpp",
@@ -113,7 +114,6 @@
             srcs: [
                 "BackupData.cpp",
                 "BackupHelpers.cpp",
-                "CursorWindow.cpp",
             ],
             shared_libs: [
                 "libbase",
@@ -147,11 +147,6 @@
                 "libz",
             ],
         },
-        host_linux: {
-            srcs: [
-                "CursorWindow.cpp",
-            ],
-        },
         windows: {
             enabled: true,
         },
diff --git a/libs/androidfw/CursorWindow.cpp b/libs/androidfw/CursorWindow.cpp
index 5e645cc..abf2b0a 100644
--- a/libs/androidfw/CursorWindow.cpp
+++ b/libs/androidfw/CursorWindow.cpp
@@ -18,11 +18,12 @@
 
 #include <androidfw/CursorWindow.h>
 
-#include <sys/mman.h>
-
 #include "android-base/logging.h"
+#include "android-base/mapped_file.h"
 #include "cutils/ashmem.h"
 
+using android::base::MappedFile;
+
 namespace android {
 
 /**
@@ -39,7 +40,7 @@
 
 CursorWindow::~CursorWindow() {
     if (mAshmemFd != -1) {
-        ::munmap(mData, mSize);
+        mMappedFile.reset();
         ::close(mAshmemFd);
     } else {
         free(mData);
@@ -75,6 +76,7 @@
 status_t CursorWindow::maybeInflate() {
     int ashmemFd = 0;
     void* newData = nullptr;
+    std::unique_ptr<MappedFile> mappedFile;
 
     // Bail early when we can't expand any further
     if (mReadOnly || mSize == mInflatedSize) {
@@ -95,11 +97,12 @@
         goto fail_silent;
     }
 
-    newData = ::mmap(nullptr, mInflatedSize, PROT_READ | PROT_WRITE, MAP_SHARED, ashmemFd, 0);
-    if (newData == MAP_FAILED) {
+    mappedFile = MappedFile::FromFd(ashmemFd, 0, mInflatedSize, PROT_READ | PROT_WRITE);
+    if (mappedFile == nullptr) {
         PLOG(ERROR) << "Failed mmap";
         goto fail_silent;
     }
+    newData = mappedFile->data();
 
     if (ashmem_set_prot_region(ashmemFd, PROT_READ) < 0) {
         PLOG(ERROR) << "Failed ashmem_set_prot_region";
@@ -120,6 +123,7 @@
         mData = newData;
         mSize = mInflatedSize;
         mSlotsOffset = newSlotsOffset;
+        mMappedFile = std::move(mappedFile);
 
         updateSlotsData();
     }
@@ -130,11 +134,12 @@
 fail:
     LOG(ERROR) << "Failed maybeInflate";
 fail_silent:
-    ::munmap(newData, mInflatedSize);
+    mappedFile.reset();
     ::close(ashmemFd);
     return UNKNOWN_ERROR;
 }
 
+#ifdef __linux__
 status_t CursorWindow::createFromParcel(Parcel* parcel, CursorWindow** outWindow) {
     *outWindow = nullptr;
 
@@ -167,11 +172,12 @@
             goto fail_silent;
         }
 
-        window->mData = ::mmap(nullptr, window->mSize, PROT_READ, MAP_SHARED, window->mAshmemFd, 0);
-        if (window->mData == MAP_FAILED) {
+        window->mMappedFile = MappedFile::FromFd(window->mAshmemFd, 0, window->mSize, PROT_READ);
+        if (window->mMappedFile == nullptr) {
             PLOG(ERROR) << "Failed mmap";
             goto fail_silent;
         }
+        window->mData = window->mMappedFile->data();
     } else {
         window->mAshmemFd = -1;
 
@@ -235,6 +241,7 @@
 fail_silent:
     return UNKNOWN_ERROR;
 }
+#endif
 
 status_t CursorWindow::clear() {
     if (mReadOnly) {
diff --git a/libs/androidfw/include/androidfw/CursorWindow.h b/libs/androidfw/include/androidfw/CursorWindow.h
index 9ec026a..0996355 100644
--- a/libs/androidfw/include/androidfw/CursorWindow.h
+++ b/libs/androidfw/include/androidfw/CursorWindow.h
@@ -23,9 +23,13 @@
 #include <string>
 
 #include "android-base/stringprintf.h"
+#ifdef __linux__
 #include "binder/Parcel.h"
+#endif
 #include "utils/String8.h"
 
+#include "android-base/mapped_file.h"
+
 #define LOG_WINDOW(...)
 
 namespace android {
@@ -80,9 +84,11 @@
     ~CursorWindow();
 
     static status_t create(const String8& name, size_t size, CursorWindow** outCursorWindow);
+#ifdef __linux__
     static status_t createFromParcel(Parcel* parcel, CursorWindow** outCursorWindow);
 
     status_t writeToParcel(Parcel* parcel);
+#endif
 
     inline String8 name() { return mName; }
     inline size_t size() { return mSize; }
@@ -149,6 +155,8 @@
     String8 mName;
     int mAshmemFd = -1;
     void* mData = nullptr;
+    std::unique_ptr<android::base::MappedFile> mMappedFile;
+
     /**
      * Pointer to the first FieldSlot, used to optimize the extremely
      * hot code path of getFieldSlot().
diff --git a/libs/appfunctions/api/current.txt b/libs/appfunctions/api/current.txt
index 504e329..bc269fe 100644
--- a/libs/appfunctions/api/current.txt
+++ b/libs/appfunctions/api/current.txt
@@ -3,13 +3,20 @@
 
   public final class AppFunctionManager {
     ctor public AppFunctionManager(android.content.Context);
-    method public void executeAppFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>);
+    method public void executeAppFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull java.util.concurrent.Executor, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>);
+    method @Deprecated public void executeAppFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>);
+    method public void isAppFunctionEnabled(@NonNull String, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Boolean,java.lang.Exception>);
+    method public void setAppFunctionEnabled(@NonNull String, int, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,java.lang.Exception>);
+    field public static final int APP_FUNCTION_STATE_DEFAULT = 0; // 0x0
+    field public static final int APP_FUNCTION_STATE_DISABLED = 2; // 0x2
+    field public static final int APP_FUNCTION_STATE_ENABLED = 1; // 0x1
   }
 
   public abstract class AppFunctionService extends android.app.Service {
     ctor public AppFunctionService();
     method @NonNull public final android.os.IBinder onBind(@Nullable android.content.Intent);
-    method @MainThread public abstract void onExecuteFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>);
+    method @MainThread public void onExecuteFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>);
+    method @Deprecated @MainThread public void onExecuteFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>);
     field @NonNull public static final String BIND_APP_FUNCTION_SERVICE = "android.permission.BIND_APP_FUNCTION_SERVICE";
     field @NonNull public static final String SERVICE_INTERFACE = "android.app.appfunctions.AppFunctionService";
   }
@@ -38,11 +45,12 @@
     method @NonNull public static com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse newSuccess(@NonNull android.app.appsearch.GenericDocument, @Nullable android.os.Bundle);
     field public static final String PROPERTY_RETURN_VALUE = "returnValue";
     field public static final int RESULT_APP_UNKNOWN_ERROR = 2; // 0x2
+    field public static final int RESULT_CANCELLED = 6; // 0x6
     field public static final int RESULT_DENIED = 1; // 0x1
+    field public static final int RESULT_DISABLED = 5; // 0x5
     field public static final int RESULT_INTERNAL_ERROR = 3; // 0x3
     field public static final int RESULT_INVALID_ARGUMENT = 4; // 0x4
     field public static final int RESULT_OK = 0; // 0x0
-    field public static final int RESULT_TIMED_OUT = 5; // 0x5
   }
 
 }
diff --git a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionManager.java b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionManager.java
index b1dd467..d660926 100644
--- a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionManager.java
+++ b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionManager.java
@@ -16,15 +16,22 @@
 
 package com.google.android.appfunctions.sidecar;
 
+import android.Manifest;
 import android.annotation.CallbackExecutor;
+import android.annotation.IntDef;
 import android.annotation.NonNull;
+import android.annotation.SuppressLint;
+import android.annotation.UserHandleAware;
 import android.content.Context;
+import android.os.CancellationSignal;
+import android.os.OutcomeReceiver;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.Objects;
 import java.util.concurrent.Executor;
 import java.util.function.Consumer;
 
-
 /**
  * Provides app functions related functionalities.
  *
@@ -37,6 +44,39 @@
 // TODO(b/357551503): Implement get and set enabled app function APIs.
 // TODO(b/367329899): Add sidecar library to Android B builds.
 public final class AppFunctionManager {
+    /**
+     * The default state of the app function. Call {@link #setAppFunctionEnabled} with this to reset
+     * enabled state to the default value.
+     */
+    public static final int APP_FUNCTION_STATE_DEFAULT = 0;
+
+    /**
+     * The app function is enabled. To enable an app function, call {@link #setAppFunctionEnabled}
+     * with this value.
+     */
+    public static final int APP_FUNCTION_STATE_ENABLED = 1;
+
+    /**
+     * The app function is disabled. To disable an app function, call {@link #setAppFunctionEnabled}
+     * with this value.
+     */
+    public static final int APP_FUNCTION_STATE_DISABLED = 2;
+
+    /**
+     * The enabled state of the app function.
+     *
+     * @hide
+     */
+    @IntDef(
+            prefix = {"APP_FUNCTION_STATE_"},
+            value = {
+                    APP_FUNCTION_STATE_DEFAULT,
+                    APP_FUNCTION_STATE_ENABLED,
+                    APP_FUNCTION_STATE_DISABLED
+            })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface EnabledState {}
+
     private final android.app.appfunctions.AppFunctionManager mManager;
     private final Context mContext;
 
@@ -45,7 +85,7 @@
      *
      * @param context A {@link Context}.
      * @throws java.lang.IllegalStateException if the underlying {@link
-     *   android.app.appfunctions.AppFunctionManager} is not found.
+     *     android.app.appfunctions.AppFunctionManager} is not found.
      */
     public AppFunctionManager(Context context) {
         mContext = Objects.requireNonNull(context);
@@ -66,6 +106,7 @@
     public void executeAppFunction(
             @NonNull ExecuteAppFunctionRequest sidecarRequest,
             @NonNull @CallbackExecutor Executor executor,
+            @NonNull CancellationSignal cancellationSignal,
             @NonNull Consumer<ExecuteAppFunctionResponse> callback) {
         Objects.requireNonNull(sidecarRequest);
         Objects.requireNonNull(executor);
@@ -74,9 +115,100 @@
         android.app.appfunctions.ExecuteAppFunctionRequest platformRequest =
                 SidecarConverter.getPlatformExecuteAppFunctionRequest(sidecarRequest);
         mManager.executeAppFunction(
-                platformRequest, executor, (platformResponse) -> {
-                    callback.accept(SidecarConverter.getSidecarExecuteAppFunctionResponse(
-                            platformResponse));
+                platformRequest,
+                executor,
+                cancellationSignal,
+                (platformResponse) -> {
+                    callback.accept(
+                            SidecarConverter.getSidecarExecuteAppFunctionResponse(
+                                    platformResponse));
                 });
     }
+
+    /**
+     * Executes the app function.
+     *
+     * <p>Proxies request and response to the underlying {@link
+     * android.app.appfunctions.AppFunctionManager#executeAppFunction}, converting the request and
+     * response in the appropriate type required by the function.
+     *
+     * @deprecated Use {@link #executeAppFunction(ExecuteAppFunctionRequest, Executor,
+     *     CancellationSignal, Consumer)} instead. This method will be removed once usage references
+     *     are updated.
+     */
+    @Deprecated
+    public void executeAppFunction(
+            @NonNull ExecuteAppFunctionRequest sidecarRequest,
+            @NonNull @CallbackExecutor Executor executor,
+            @NonNull Consumer<ExecuteAppFunctionResponse> callback) {
+        Objects.requireNonNull(sidecarRequest);
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(callback);
+
+        executeAppFunction(
+                sidecarRequest,
+                executor,
+                new CancellationSignal(),
+                callback);
+    }
+
+    /**
+     * Returns a boolean through a callback, indicating whether the app function is enabled.
+     *
+     * <p>* This method can only check app functions owned by the caller, or those where the caller
+     * has visibility to the owner package and holds either the {@link
+     * Manifest.permission#EXECUTE_APP_FUNCTIONS} or {@link
+     * Manifest.permission#EXECUTE_APP_FUNCTIONS_TRUSTED} permission.
+     *
+     * <p>If operation fails, the callback's {@link OutcomeReceiver#onError} is called with errors:
+     *
+     * <ul>
+     *   <li>{@link IllegalArgumentException}, if the function is not found or the caller does not
+     *       have access to it.
+     * </ul>
+     *
+     * @param functionIdentifier the identifier of the app function to check (unique within the
+     *     target package) and in most cases, these are automatically generated by the AppFunctions
+     *     SDK
+     * @param targetPackage the package name of the app function's owner
+     * @param executor the executor to run the request
+     * @param callback the callback to receive the function enabled check result
+     */
+    public void isAppFunctionEnabled(
+            @NonNull String functionIdentifier,
+            @NonNull String targetPackage,
+            @NonNull Executor executor,
+            @NonNull OutcomeReceiver<Boolean, Exception> callback) {
+        mManager.isAppFunctionEnabled(functionIdentifier, targetPackage, executor, callback);
+    }
+
+    /**
+     * Sets the enabled state of the app function owned by the calling package.
+     *
+     * <p>If operation fails, the callback's {@link OutcomeReceiver#onError} is called with errors:
+     *
+     * <ul>
+     *   <li>{@link IllegalArgumentException}, if the function is not found or the caller does not
+     *       have access to it.
+     * </ul>
+     *
+     * @param functionIdentifier the identifier of the app function to enable (unique within the
+     *     calling package). In most cases, identifiers are automatically generated by the
+     *     AppFunctions SDK
+     * @param newEnabledState the new state of the app function
+     * @param executor the executor to run the callback
+     * @param callback the callback to receive the result of the function enablement. The call was
+     *     successful if no exception was thrown.
+     */
+    // Constants in @EnabledState should always mirror those in
+    // android.app.appfunctions.AppFunctionManager.
+    @SuppressLint("WrongConstant")
+    @UserHandleAware
+    public void setAppFunctionEnabled(
+            @NonNull String functionIdentifier,
+            @EnabledState int newEnabledState,
+            @NonNull Executor executor,
+            @NonNull OutcomeReceiver<Void, Exception> callback) {
+        mManager.setAppFunctionEnabled(functionIdentifier, newEnabledState, executor, callback);
+    }
 }
diff --git a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionService.java b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionService.java
index 65959df..6e91de6 100644
--- a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionService.java
+++ b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionService.java
@@ -25,6 +25,8 @@
 import android.content.Intent;
 import android.os.Binder;
 import android.os.IBinder;
+import android.os.CancellationSignal;
+import android.util.Log;
 
 import java.util.function.Consumer;
 
@@ -69,10 +71,11 @@
     private final Binder mBinder =
             android.app.appfunctions.AppFunctionService.createBinder(
                     /* context= */ this,
-                    /* onExecuteFunction= */ (platformRequest, callback) -> {
+                    /* onExecuteFunction= */ (platformRequest, cancellationSignal, callback) -> {
                         AppFunctionService.this.onExecuteFunction(
                                 SidecarConverter.getSidecarExecuteAppFunctionRequest(
                                         platformRequest),
+                                cancellationSignal,
                                 (sidecarResponse) -> {
                                     callback.accept(
                                             SidecarConverter.getPlatformExecuteAppFunctionResponse(
@@ -105,10 +108,47 @@
      * result using the callback, no matter if the execution was successful or not.
      *
      * @param request The function execution request.
+     * @param cancellationSignal A {@link CancellationSignal} to cancel the request.
      * @param callback A callback to report back the result.
      */
     @MainThread
-    public abstract void onExecuteFunction(
+    public void onExecuteFunction(
             @NonNull ExecuteAppFunctionRequest request,
-            @NonNull Consumer<ExecuteAppFunctionResponse> callback);
+            @NonNull CancellationSignal cancellationSignal,
+            @NonNull Consumer<ExecuteAppFunctionResponse> callback) {
+        onExecuteFunction(request, callback);
+    }
+
+    /**
+     * Called by the system to execute a specific app function.
+     *
+     * <p>This method is triggered when the system requests your AppFunctionService to handle a
+     * particular function you have registered and made available.
+     *
+     * <p>To ensure proper routing of function requests, assign a unique identifier to each
+     * function. This identifier doesn't need to be globally unique, but it must be unique within
+     * your app. For example, a function to order food could be identified as "orderFood". In most
+     * cases this identifier should come from the ID automatically generated by the AppFunctions
+     * SDK. You can determine the specific function to invoke by calling {@link
+     * ExecuteAppFunctionRequest#getFunctionIdentifier()}.
+     *
+     * <p>This method is always triggered in the main thread. You should run heavy tasks on a worker
+     * thread and dispatch the result with the given callback. You should always report back the
+     * result using the callback, no matter if the execution was successful or not.
+     *
+     * @param request The function execution request.
+     * @param callback A callback to report back the result.
+     *
+     * @deprecated Use {@link #onExecuteFunction(ExecuteAppFunctionRequest, CancellationSignal,
+     *     Consumer)} instead. This method will be removed once usage references are updated.
+     */
+    @MainThread
+    @Deprecated
+    public void onExecuteFunction(
+            @NonNull ExecuteAppFunctionRequest request,
+            @NonNull Consumer<ExecuteAppFunctionResponse> callback) {
+        Log.w(
+                "AppFunctionService",
+                "Calling deprecated default implementation of onExecuteFunction");
+    }
 }
diff --git a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java
index 60c25fa..d87fec79 100644
--- a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java
+++ b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java
@@ -73,8 +73,14 @@
      */
     public static final int RESULT_INVALID_ARGUMENT = 4;
 
-    /** The operation was timed out. */
-    public static final int RESULT_TIMED_OUT = 5;
+    /** The caller tried to execute a disabled app function. */
+    public static final int RESULT_DISABLED = 5;
+
+    /**
+     * The operation was cancelled. Use this error code to report that a cancellation is done after
+     * receiving a cancellation signal.
+     */
+    public static final int RESULT_CANCELLED = 6;
 
     /** The result code of the app function execution. */
     @ResultCode private final int mResultCode;
@@ -233,7 +239,7 @@
                     RESULT_APP_UNKNOWN_ERROR,
                     RESULT_INTERNAL_ERROR,
                     RESULT_INVALID_ARGUMENT,
-                    RESULT_TIMED_OUT,
+                    RESULT_DISABLED
             })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ResultCode {}
diff --git a/libs/hwui/AutoBackendTextureRelease.cpp b/libs/hwui/AutoBackendTextureRelease.cpp
index 27add35..4305196 100644
--- a/libs/hwui/AutoBackendTextureRelease.cpp
+++ b/libs/hwui/AutoBackendTextureRelease.cpp
@@ -141,6 +141,13 @@
         return;
     }
 
+    if (!RenderThread::isCurrent()) {
+        // releaseQueueOwnership needs to run on RenderThread to prevent multithread calling
+        // setBackendTextureState will operate skia resource cache which need single owner
+        RenderThread::getInstance().queue().post([this, context]() { releaseQueueOwnership(context); });
+        return;
+    }
+
     LOG_ALWAYS_FATAL_IF(Properties::getRenderPipelineType() != RenderPipelineType::SkiaVulkan);
     if (mBackendTexture.isValid()) {
         // Passing in VK_IMAGE_LAYOUT_UNDEFINED means we keep the old layout.
diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp
index b763a96..c016070 100644
--- a/libs/hwui/DeferredLayerUpdater.cpp
+++ b/libs/hwui/DeferredLayerUpdater.cpp
@@ -19,6 +19,7 @@
 #include <GLES2/gl2ext.h>
 
 // TODO: Use public SurfaceTexture APIs once available and include public NDK header file instead.
+#include <statslog_hwui.h>
 #include <surfacetexture/surface_texture_platform.h>
 
 #include "AutoBackendTextureRelease.h"
@@ -50,6 +51,14 @@
     setTransform(nullptr);
     mRenderState.removeContextCallback(this);
     destroyLayer();
+    if (mFirstTimeForDataspace > std::chrono::steady_clock::time_point::min()) {
+        auto currentTime = std::chrono::steady_clock::now();
+        stats_write(stats::TEXTURE_VIEW_EVENT, static_cast<int32_t>(getuid()),
+                    static_cast<int64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(
+                                                 currentTime - mFirstTimeForDataspace)
+                                                 .count()),
+                    mDataspace);
+    }
 }
 
 void DeferredLayerUpdater::setSurfaceTexture(AutoTextureRelease&& consumer) {
@@ -195,6 +204,21 @@
                     updateLayer(forceFilter, layerImage, outTransform, currentCropRect,
                                 maxLuminanceNits);
                 }
+
+                if (dataspace != mDataspace ||
+                    mFirstTimeForDataspace == std::chrono::steady_clock::time_point::min()) {
+                    auto currentTime = std::chrono::steady_clock::now();
+                    if (mFirstTimeForDataspace > std::chrono::steady_clock::time_point::min()) {
+                        stats_write(stats::TEXTURE_VIEW_EVENT, static_cast<int32_t>(getuid()),
+                                    static_cast<int64_t>(
+                                            std::chrono::duration_cast<std::chrono::milliseconds>(
+                                                    currentTime - mFirstTimeForDataspace)
+                                                    .count()),
+                                    mDataspace);
+                    }
+                    mFirstTimeForDataspace = currentTime;
+                    mDataspace = dataspace;
+                }
             }
         }
 
diff --git a/libs/hwui/DeferredLayerUpdater.h b/libs/hwui/DeferredLayerUpdater.h
index a7f8f61..3abb47c 100644
--- a/libs/hwui/DeferredLayerUpdater.h
+++ b/libs/hwui/DeferredLayerUpdater.h
@@ -16,6 +16,8 @@
 
 #pragma once
 
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
 #include <SkBlendMode.h>
 #include <SkColorFilter.h>
 #include <SkImage.h>
@@ -24,9 +26,9 @@
 #include <android/surface_texture.h>
 #include <cutils/compiler.h>
 #include <utils/Errors.h>
+#include <utils/Timers.h>
 
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
+#include <chrono>
 #include <map>
 #include <memory>
 
@@ -154,6 +156,9 @@
     bool mGLContextAttached;
     bool mUpdateTexImage;
     int mCurrentSlot = -1;
+    android_dataspace mDataspace = HAL_DATASPACE_UNKNOWN;
+    std::chrono::steady_clock::time_point mFirstTimeForDataspace =
+            std::chrono::steady_clock::time_point::min();
 
     Layer* mLayer;
 };
diff --git a/libs/hwui/Gainmap.cpp b/libs/hwui/Gainmap.cpp
index 30f401e..ea955e2 100644
--- a/libs/hwui/Gainmap.cpp
+++ b/libs/hwui/Gainmap.cpp
@@ -15,12 +15,37 @@
  */
 #include "Gainmap.h"
 
+#include <SkBitmap.h>
+#include <SkCanvas.h>
+#include <SkColorFilter.h>
+#include <SkImagePriv.h>
+#include <SkPaint.h>
+
+#include "HardwareBitmapUploader.h"
+
 namespace android::uirenderer {
 
 sp<Gainmap> Gainmap::allocateHardwareGainmap(const sp<Gainmap>& srcGainmap) {
     auto gainmap = sp<Gainmap>::make();
     gainmap->info = srcGainmap->info;
-    const SkBitmap skSrcBitmap = srcGainmap->bitmap->getSkBitmap();
+    SkBitmap skSrcBitmap = srcGainmap->bitmap->getSkBitmap();
+    if (skSrcBitmap.info().colorType() == kAlpha_8_SkColorType &&
+        !HardwareBitmapUploader::hasAlpha8Support()) {
+        // The regular Bitmap::allocateHardwareBitmap will do a conversion that preserves channels,
+        // so alpha8 maps to the alpha channel of rgba. However, for gainmaps we will interpret
+        // the data of an rgba buffer differently as we'll only look at the rgb channels
+        // So we need to map alpha8 to rgbx_8888 essentially
+        SkBitmap bitmap;
+        bitmap.allocPixels(skSrcBitmap.info().makeColorType(kN32_SkColorType));
+        SkCanvas canvas(bitmap);
+        SkPaint paint;
+        const float alphaToOpaque[] = {0, 0, 0, 1, 0, 0, 0, 0, 1, 0,
+                                       0, 0, 0, 1, 0, 0, 0, 0, 0, 255};
+        paint.setColorFilter(SkColorFilters::Matrix(alphaToOpaque, SkColorFilters::Clamp::kNo));
+        canvas.drawImage(SkMakeImageFromRasterBitmap(skSrcBitmap, kNever_SkCopyPixelsMode), 0, 0,
+                         SkSamplingOptions{}, &paint);
+        skSrcBitmap = bitmap;
+    }
     sk_sp<Bitmap> skBitmap(Bitmap::allocateHardwareBitmap(skSrcBitmap));
     if (!skBitmap.get()) {
         return nullptr;
diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp
index b6476c9..ae46a99 100644
--- a/libs/hwui/Properties.cpp
+++ b/libs/hwui/Properties.cpp
@@ -50,6 +50,10 @@
 constexpr bool resample_gainmap_regions() {
     return false;
 }
+
+constexpr bool query_global_priority() {
+    return false;
+}
 }  // namespace hwui_flags
 #endif
 
@@ -110,6 +114,7 @@
 bool Properties::hdr10bitPlus = false;
 bool Properties::skipTelemetry = false;
 bool Properties::resampleGainmapRegions = false;
+bool Properties::queryGlobalPriority = false;
 
 int Properties::timeoutMultiplier = 1;
 
@@ -187,6 +192,7 @@
     hdr10bitPlus = hwui_flags::hdr_10bit_plus();
     resampleGainmapRegions = base::GetBoolProperty("debug.hwui.resample_gainmap_regions",
                                                    hwui_flags::resample_gainmap_regions());
+    queryGlobalPriority = hwui_flags::query_global_priority();
 
     timeoutMultiplier = android::base::GetIntProperty("ro.hw_timeout_multiplier", 1);
     skipTelemetry = base::GetBoolProperty(PROPERTY_SKIP_EGLMANAGER_TELEMETRY,
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index db47152..6f84796 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -346,6 +346,7 @@
     static bool hdr10bitPlus;
     static bool skipTelemetry;
     static bool resampleGainmapRegions;
+    static bool queryGlobalPriority;
 
     static int timeoutMultiplier;
 
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 9e825fb..7c15086 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -619,8 +619,11 @@
     // If it's an unknown colortype then it's not a bitmap-backed canvas
     if (info.colorType() == SkColorType::kUnknown_SkColorType) return true;
 
+    auto colorSpace = info.colorSpace();
+    // If we don't have a colorspace, we can't apply a gainmap
+    if (!colorSpace) return false;
     skcms_TransferFunction tfn;
-    info.colorSpace()->transferFn(&tfn);
+    colorSpace->transferFn(&tfn);
 
     auto transferType = skcms_TransferFunction_getType(&tfn);
     switch (transferType) {
diff --git a/libs/hwui/aconfig/hwui_flags.aconfig b/libs/hwui/aconfig/hwui_flags.aconfig
index ab052b9..93df478 100644
--- a/libs/hwui/aconfig/hwui_flags.aconfig
+++ b/libs/hwui/aconfig/hwui_flags.aconfig
@@ -129,3 +129,13 @@
   description: "APIs that expose gainmap metadata corresponding to those defined in ISO 21496-1"
   bug: "349357636"
 }
+
+flag {
+  name: "query_global_priority"
+  namespace: "core_graphics"
+  description: "Attempt to query whether the vulkan driver supports the requested global priority before queue creation."
+  bug: "343986434"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
diff --git a/libs/hwui/hwui/ImageDecoder.cpp b/libs/hwui/hwui/ImageDecoder.cpp
index 588463c..e074a27 100644
--- a/libs/hwui/hwui/ImageDecoder.cpp
+++ b/libs/hwui/hwui/ImageDecoder.cpp
@@ -501,18 +501,13 @@
 SkCodec::Result ImageDecoder::extractGainmap(Bitmap* destination, bool isShared) {
     ATRACE_CALL();
     SkGainmapInfo gainmapInfo;
-    std::unique_ptr<SkStream> gainmapStream;
+    std::unique_ptr<SkAndroidCodec> gainmapCodec;
     {
-        ATRACE_NAME("getAndroidGainmap");
-        if (!mCodec->getAndroidGainmap(&gainmapInfo, &gainmapStream)) {
+        ATRACE_NAME("getGainmapAndroidCodec");
+        if (!mCodec->getGainmapAndroidCodec(&gainmapInfo, &gainmapCodec)) {
             return SkCodec::kSuccess;
         }
     }
-    auto gainmapCodec = SkAndroidCodec::MakeFromStream(std::move(gainmapStream));
-    if (!gainmapCodec) {
-        ALOGW("Failed to create codec for gainmap stream");
-        return SkCodec::kInvalidInput;
-    }
     ImageDecoder decoder{std::move(gainmapCodec)};
     // Gainmap inherits the origin of the containing image
     decoder.mOverrideOrigin.emplace(getOrigin());
diff --git a/libs/hwui/hwui/MinikinSkia.cpp b/libs/hwui/hwui/MinikinSkia.cpp
index bbb1420..f0bcfe53 100644
--- a/libs/hwui/hwui/MinikinSkia.cpp
+++ b/libs/hwui/hwui/MinikinSkia.cpp
@@ -36,7 +36,7 @@
 
 MinikinFontSkia::MinikinFontSkia(sk_sp<SkTypeface> typeface, int sourceId, const void* fontData,
                                  size_t fontSize, std::string_view filePath, int ttcIndex,
-                                 const std::vector<minikin::FontVariation>& axes)
+                                 const minikin::VariationSettings& axes)
         : mTypeface(std::move(typeface))
         , mSourceId(sourceId)
         , mFontData(fontData)
@@ -123,12 +123,12 @@
     return mTtcIndex;
 }
 
-const std::vector<minikin::FontVariation>& MinikinFontSkia::GetAxes() const {
+const minikin::VariationSettings& MinikinFontSkia::GetAxes() const {
     return mAxes;
 }
 
 std::shared_ptr<minikin::MinikinFont> MinikinFontSkia::createFontWithVariation(
-        const std::vector<minikin::FontVariation>& variations) const {
+        const minikin::VariationSettings& variations) const {
     SkFontArguments args;
 
     std::vector<SkFontArguments::VariationPosition::Coordinate> skVariation;
diff --git a/libs/hwui/hwui/MinikinSkia.h b/libs/hwui/hwui/MinikinSkia.h
index de9a5c2..7fe5978bfd 100644
--- a/libs/hwui/hwui/MinikinSkia.h
+++ b/libs/hwui/hwui/MinikinSkia.h
@@ -32,7 +32,7 @@
 public:
     MinikinFontSkia(sk_sp<SkTypeface> typeface, int sourceId, const void* fontData, size_t fontSize,
                     std::string_view filePath, int ttcIndex,
-                    const std::vector<minikin::FontVariation>& axes);
+                    const minikin::VariationSettings& axes);
 
     float GetHorizontalAdvance(uint32_t glyph_id, const minikin::MinikinPaint& paint,
                                const minikin::FontFakery& fakery) const override;
@@ -59,9 +59,9 @@
     size_t GetFontSize() const;
     int GetFontIndex() const;
     const std::string& getFilePath() const { return mFilePath; }
-    const std::vector<minikin::FontVariation>& GetAxes() const;
+    const minikin::VariationSettings& GetAxes() const;
     std::shared_ptr<minikin::MinikinFont> createFontWithVariation(
-            const std::vector<minikin::FontVariation>&) const;
+            const minikin::VariationSettings&) const;
     int GetSourceId() const override { return mSourceId; }
 
     static uint32_t packFontFlags(const SkFont&);
@@ -80,7 +80,7 @@
     const void* mFontData;
     size_t mFontSize;
     int mTtcIndex;
-    std::vector<minikin::FontVariation> mAxes;
+    minikin::VariationSettings mAxes;
     std::string mFilePath;
 };
 
diff --git a/libs/hwui/hwui/MinikinUtils.cpp b/libs/hwui/hwui/MinikinUtils.cpp
index ede385a..9cd6e25 100644
--- a/libs/hwui/hwui/MinikinUtils.cpp
+++ b/libs/hwui/hwui/MinikinUtils.cpp
@@ -48,6 +48,7 @@
     minikinPaint.localeListId = paint->getMinikinLocaleListId();
     minikinPaint.fontStyle = resolvedFace->fStyle;
     minikinPaint.fontFeatureSettings = paint->getFontFeatureSettings();
+    minikinPaint.fontVariationSettings = paint->getFontVariationOverride();
 
     const std::optional<minikin::FamilyVariant>& familyVariant = paint->getFamilyVariant();
     if (familyVariant.has_value()) {
diff --git a/libs/hwui/hwui/Paint.h b/libs/hwui/hwui/Paint.h
index 708f96e..7eb849f 100644
--- a/libs/hwui/hwui/Paint.h
+++ b/libs/hwui/hwui/Paint.h
@@ -159,6 +159,14 @@
         return SkSamplingOptions(this->filterMode());
     }
 
+    void setVariationOverride(minikin::VariationSettings&& varSettings) {
+        mFontVariationOverride = std::move(varSettings);
+    }
+
+    const minikin::VariationSettings& getFontVariationOverride() const {
+        return mFontVariationOverride;
+    }
+
     // The Java flags (Paint.java) no longer fit into the native apis directly.
     // These methods handle converting to and from them and the native representations
     // in android::Paint.
@@ -179,6 +187,7 @@
     float mLetterSpacing = 0;
     float mWordSpacing = 0;
     std::vector<minikin::FontFeature> mFontFeatureSettings;
+    minikin::VariationSettings mFontVariationOverride;
     uint32_t mMinikinLocaleListId;
     std::optional<minikin::FamilyVariant> mFamilyVariant;
     uint32_t mHyphenEdit = 0;
diff --git a/libs/hwui/hwui/PaintImpl.cpp b/libs/hwui/hwui/PaintImpl.cpp
index c32ea01..6dfcedc 100644
--- a/libs/hwui/hwui/PaintImpl.cpp
+++ b/libs/hwui/hwui/PaintImpl.cpp
@@ -39,6 +39,7 @@
         , mLetterSpacing(paint.mLetterSpacing)
         , mWordSpacing(paint.mWordSpacing)
         , mFontFeatureSettings(paint.mFontFeatureSettings)
+        , mFontVariationOverride(paint.mFontVariationOverride)
         , mMinikinLocaleListId(paint.mMinikinLocaleListId)
         , mFamilyVariant(paint.mFamilyVariant)
         , mHyphenEdit(paint.mHyphenEdit)
@@ -59,6 +60,7 @@
     mLetterSpacing = other.mLetterSpacing;
     mWordSpacing = other.mWordSpacing;
     mFontFeatureSettings = other.mFontFeatureSettings;
+    mFontVariationOverride = other.mFontVariationOverride;
     mMinikinLocaleListId = other.mMinikinLocaleListId;
     mFamilyVariant = other.mFamilyVariant;
     mHyphenEdit = other.mHyphenEdit;
@@ -76,6 +78,7 @@
     return static_cast<const SkPaint&>(a) == static_cast<const SkPaint&>(b) && a.mFont == b.mFont &&
            a.mLooper == b.mLooper && a.mLetterSpacing == b.mLetterSpacing &&
            a.mWordSpacing == b.mWordSpacing && a.mFontFeatureSettings == b.mFontFeatureSettings &&
+           a.mFontVariationOverride == b.mFontVariationOverride &&
            a.mMinikinLocaleListId == b.mMinikinLocaleListId &&
            a.mFamilyVariant == b.mFamilyVariant && a.mHyphenEdit == b.mHyphenEdit &&
            a.mTypeface == b.mTypeface && a.mAlign == b.mAlign &&
diff --git a/libs/hwui/hwui/Typeface.cpp b/libs/hwui/hwui/Typeface.cpp
index a9d1a2a..2d812d6 100644
--- a/libs/hwui/hwui/Typeface.cpp
+++ b/libs/hwui/hwui/Typeface.cpp
@@ -92,8 +92,8 @@
     return result;
 }
 
-Typeface* Typeface::createFromTypefaceWithVariation(
-        Typeface* src, const std::vector<minikin::FontVariation>& variations) {
+Typeface* Typeface::createFromTypefaceWithVariation(Typeface* src,
+                                                    const minikin::VariationSettings& variations) {
     const Typeface* resolvedFace = Typeface::resolveDefault(src);
     Typeface* result = new Typeface();
     if (result != nullptr) {
@@ -192,9 +192,8 @@
     sk_sp<SkTypeface> typeface = fm->makeFromStream(std::move(fontData));
     LOG_ALWAYS_FATAL_IF(typeface == nullptr, "Failed to make typeface from %s", kRobotoFont);
 
-    std::shared_ptr<minikin::MinikinFont> font =
-            std::make_shared<MinikinFontSkia>(std::move(typeface), 0, data, st.st_size, kRobotoFont,
-                                              0, std::vector<minikin::FontVariation>());
+    std::shared_ptr<minikin::MinikinFont> font = std::make_shared<MinikinFontSkia>(
+            std::move(typeface), 0, data, st.st_size, kRobotoFont, 0, minikin::VariationSettings());
     std::vector<std::shared_ptr<minikin::Font>> fonts;
     fonts.push_back(minikin::Font::Builder(font).build());
 
diff --git a/libs/hwui/hwui/Typeface.h b/libs/hwui/hwui/Typeface.h
index 565136e..2c96c1a 100644
--- a/libs/hwui/hwui/Typeface.h
+++ b/libs/hwui/hwui/Typeface.h
@@ -74,8 +74,8 @@
     static Typeface* createRelative(Typeface* src, Style desiredStyle);
     static Typeface* createAbsolute(Typeface* base, int weight, bool italic);
 
-    static Typeface* createFromTypefaceWithVariation(
-            Typeface* src, const std::vector<minikin::FontVariation>& variations);
+    static Typeface* createFromTypefaceWithVariation(Typeface* src,
+                                                     const minikin::VariationSettings& variations);
 
     static Typeface* createFromFamilies(
             std::vector<std::shared_ptr<minikin::FontFamily>>&& families, int weight, int italic,
diff --git a/libs/hwui/jni/BitmapFactory.cpp b/libs/hwui/jni/BitmapFactory.cpp
index 785aef3..49a7f73 100644
--- a/libs/hwui/jni/BitmapFactory.cpp
+++ b/libs/hwui/jni/BitmapFactory.cpp
@@ -183,14 +183,8 @@
            needsFineScale(fullSize.height(), decodedSize.height(), sampleSize);
 }
 
-static bool decodeGainmap(std::unique_ptr<SkStream> gainmapStream, const SkGainmapInfo& gainmapInfo,
+static bool decodeGainmap(std::unique_ptr<SkAndroidCodec> codec, const SkGainmapInfo& gainmapInfo,
                           sp<uirenderer::Gainmap>* outGainmap, const int sampleSize, float scale) {
-    std::unique_ptr<SkAndroidCodec> codec;
-    codec = SkAndroidCodec::MakeFromStream(std::move(gainmapStream), nullptr);
-    if (!codec) {
-        ALOGE("Can not create a codec for Gainmap.");
-        return false;
-    }
     SkColorType decodeColorType = kN32_SkColorType;
     if (codec->getInfo().colorType() == kGray_8_SkColorType) {
         decodeColorType = kGray_8_SkColorType;
@@ -613,15 +607,15 @@
 
     bool hasGainmap = false;
     SkGainmapInfo gainmapInfo;
-    std::unique_ptr<SkStream> gainmapStream = nullptr;
+    std::unique_ptr<SkAndroidCodec> gainmapCodec;
     sp<uirenderer::Gainmap> gainmap = nullptr;
     if (result == SkCodec::kSuccess) {
-        hasGainmap = codec->getAndroidGainmap(&gainmapInfo, &gainmapStream);
+        hasGainmap = codec->getGainmapAndroidCodec(&gainmapInfo, &gainmapCodec);
     }
 
     if (hasGainmap) {
         hasGainmap =
-                decodeGainmap(std::move(gainmapStream), gainmapInfo, &gainmap, sampleSize, scale);
+                decodeGainmap(std::move(gainmapCodec), gainmapInfo, &gainmap, sampleSize, scale);
     }
 
     if (!isMutable && javaBitmap == NULL) {
diff --git a/libs/hwui/jni/BitmapRegionDecoder.cpp b/libs/hwui/jni/BitmapRegionDecoder.cpp
index 6a65b82..f7e8e07 100644
--- a/libs/hwui/jni/BitmapRegionDecoder.cpp
+++ b/libs/hwui/jni/BitmapRegionDecoder.cpp
@@ -48,25 +48,14 @@
         }
 
         SkGainmapInfo gainmapInfo;
-        std::unique_ptr<SkStream> gainmapStream;
+        std::unique_ptr<SkAndroidCodec> gainmapCodec;
         std::unique_ptr<skia::BitmapRegionDecoder> gainmapBRD = nullptr;
-        if (mainImageBRD->getAndroidGainmap(&gainmapInfo, &gainmapStream)) {
-            sk_sp<SkData> data = nullptr;
-            if (gainmapStream->getMemoryBase()) {
-                // It is safe to make without copy because we'll hold onto the stream.
-                data = SkData::MakeWithoutCopy(gainmapStream->getMemoryBase(),
-                                               gainmapStream->getLength());
-            } else {
-                data = SkCopyStreamToData(gainmapStream.get());
-                // We don't need to hold the stream anymore
-                gainmapStream = nullptr;
-            }
-            gainmapBRD = skia::BitmapRegionDecoder::Make(std::move(data));
+        if (!mainImageBRD->getGainmapBitmapRegionDecoder(&gainmapInfo, &gainmapBRD)) {
+            gainmapBRD = nullptr;
         }
 
-        return std::unique_ptr<BitmapRegionDecoderWrapper>(
-                new BitmapRegionDecoderWrapper(std::move(mainImageBRD), std::move(gainmapBRD),
-                                               gainmapInfo, std::move(gainmapStream)));
+        return std::unique_ptr<BitmapRegionDecoderWrapper>(new BitmapRegionDecoderWrapper(
+                std::move(mainImageBRD), std::move(gainmapBRD), gainmapInfo));
     }
 
     SkEncodedImageFormat getEncodedFormat() { return mMainImageBRD->getEncodedFormat(); }
@@ -191,16 +180,14 @@
 private:
     BitmapRegionDecoderWrapper(std::unique_ptr<skia::BitmapRegionDecoder> mainImageBRD,
                                std::unique_ptr<skia::BitmapRegionDecoder> gainmapBRD,
-                               SkGainmapInfo info, std::unique_ptr<SkStream> stream)
+                               SkGainmapInfo info)
             : mMainImageBRD(std::move(mainImageBRD))
             , mGainmapBRD(std::move(gainmapBRD))
-            , mGainmapInfo(info)
-            , mGainmapStream(std::move(stream)) {}
+            , mGainmapInfo(info) {}
 
     std::unique_ptr<skia::BitmapRegionDecoder> mMainImageBRD;
     std::unique_ptr<skia::BitmapRegionDecoder> mGainmapBRD;
     SkGainmapInfo mGainmapInfo;
-    std::unique_ptr<SkStream> mGainmapStream;
 };
 }  // namespace android
 
diff --git a/libs/hwui/jni/FontFamily.cpp b/libs/hwui/jni/FontFamily.cpp
index e6d790f..9922ff3 100644
--- a/libs/hwui/jni/FontFamily.cpp
+++ b/libs/hwui/jni/FontFamily.cpp
@@ -133,9 +133,9 @@
         builder->axes.clear();
         return false;
     }
-    std::shared_ptr<minikin::MinikinFont> minikinFont =
-            std::make_shared<MinikinFontSkia>(std::move(face), fonts::getNewSourceId(), fontPtr,
-                                              fontSize, "", ttcIndex, builder->axes);
+    std::shared_ptr<minikin::MinikinFont> minikinFont = std::make_shared<MinikinFontSkia>(
+            std::move(face), fonts::getNewSourceId(), fontPtr, fontSize, "", ttcIndex,
+            minikin::VariationSettings(builder->axes, false));
     minikin::Font::Builder fontBuilder(minikinFont);
 
     if (weight != RESOLVE_BY_FONT_TABLE) {
diff --git a/libs/hwui/jni/Paint.cpp b/libs/hwui/jni/Paint.cpp
index 286f06a..da23792 100644
--- a/libs/hwui/jni/Paint.cpp
+++ b/libs/hwui/jni/Paint.cpp
@@ -1127,6 +1127,36 @@
         return leftMinikinPaint == rightMinikinPaint;
     }
 
+    struct VariationBuilder {
+        std::vector<minikin::FontVariation> varSettings;
+    };
+
+    static jlong createFontVariationBuilder(CRITICAL_JNI_PARAMS_COMMA jint size) {
+        VariationBuilder* builder = new VariationBuilder();
+        builder->varSettings.reserve(size);
+        return reinterpret_cast<jlong>(builder);
+    }
+
+    static void addFontVariationToBuilder(CRITICAL_JNI_PARAMS_COMMA jlong builderPtr, jint tag,
+                                          jfloat value) {
+        VariationBuilder* builder = reinterpret_cast<VariationBuilder*>(builderPtr);
+        builder->varSettings.emplace_back(static_cast<minikin::AxisTag>(tag), value);
+    }
+
+    static void setFontVariationOverride(CRITICAL_JNI_PARAMS_COMMA jlong paintHandle,
+                                         jlong builderPtr) {
+        Paint* paint = reinterpret_cast<Paint*>(paintHandle);
+        if (builderPtr == 0) {
+            paint->setVariationOverride(minikin::VariationSettings());
+            return;
+        }
+
+        VariationBuilder* builder = reinterpret_cast<VariationBuilder*>(builderPtr);
+        paint->setVariationOverride(
+                minikin::VariationSettings(builder->varSettings, false /* sorted */));
+        delete builder;
+    }
+
 }; // namespace PaintGlue
 
 static const JNINativeMethod methods[] = {
@@ -1235,6 +1265,9 @@
         {"nSetShadowLayer", "(JFFFJJ)V", (void*)PaintGlue::setShadowLayer},
         {"nHasShadowLayer", "(J)Z", (void*)PaintGlue::hasShadowLayer},
         {"nEqualsForTextMeasurement", "(JJ)Z", (void*)PaintGlue::equalsForTextMeasurement},
+        {"nCreateFontVariationBuilder", "(I)J", (void*)PaintGlue::createFontVariationBuilder},
+        {"nAddFontVariationToBuilder", "(JIF)V", (void*)PaintGlue::addFontVariationToBuilder},
+        {"nSetFontVariationOverride", "(JJ)V", (void*)PaintGlue::setFontVariationOverride},
 };
 
 int register_android_graphics_Paint(JNIEnv* env) {
diff --git a/libs/hwui/jni/PathIterator.cpp b/libs/hwui/jni/PathIterator.cpp
index 3884342..e9de655 100644
--- a/libs/hwui/jni/PathIterator.cpp
+++ b/libs/hwui/jni/PathIterator.cpp
@@ -20,6 +20,7 @@
 #include "GraphicsJNI.h"
 #include "SkPath.h"
 #include "SkPoint.h"
+#include "graphics_jni_helpers.h"
 
 namespace android {
 
@@ -36,6 +37,18 @@
         return reinterpret_cast<jlong>(new SkPath::RawIter(*path));
     }
 
+    // A variant of 'next' (below) that is compatible with the host JVM.
+    static jint nextHost(JNIEnv* env, jclass clazz, jlong iteratorHandle, jfloatArray pointsArray) {
+        jfloat* points = env->GetFloatArrayElements(pointsArray, 0);
+#ifdef __ANDROID__
+        jint result = next(iteratorHandle, reinterpret_cast<jlong>(points));
+#else
+        jint result = next(env, clazz, iteratorHandle, reinterpret_cast<jlong>(points));
+#endif
+        env->ReleaseFloatArrayElements(pointsArray, points, 0);
+        return result;
+    }
+
     // ---------------- @CriticalNative -------------------------
 
     static jint peek(CRITICAL_JNI_PARAMS_COMMA jlong iteratorHandle) {
@@ -72,6 +85,7 @@
 
         {"nPeek", "(J)I", (void*)SkPathIteratorGlue::peek},
         {"nNext", "(JJ)I", (void*)SkPathIteratorGlue::next},
+        {"nNextHost", "(J[F)I", (void*)SkPathIteratorGlue::nextHost},
 };
 
 int register_android_graphics_PathIterator(JNIEnv* env) {
diff --git a/libs/hwui/jni/Typeface.cpp b/libs/hwui/jni/Typeface.cpp
index 209b35c..0f458dd 100644
--- a/libs/hwui/jni/Typeface.cpp
+++ b/libs/hwui/jni/Typeface.cpp
@@ -80,7 +80,8 @@
         AxisHelper axis(env, axisObject);
         variations.push_back(minikin::FontVariation(axis.getTag(), axis.getStyleValue()));
     }
-    return toJLong(Typeface::createFromTypefaceWithVariation(toTypeface(familyHandle), variations));
+    return toJLong(Typeface::createFromTypefaceWithVariation(
+            toTypeface(familyHandle), minikin::VariationSettings(variations, false /* sorted */)));
 }
 
 static jlong Typeface_createWeightAlias(JNIEnv* env, jobject, jlong familyHandle, jint weight) {
@@ -273,7 +274,7 @@
     const std::string& path = typeface->GetFontPath();
     writer->writeString(path);
     writer->write<int>(typeface->GetFontIndex());
-    const std::vector<minikin::FontVariation>& axes = typeface->GetAxes();
+    const minikin::VariationSettings& axes = typeface->GetAxes();
     writer->writeArray<minikin::FontVariation>(axes.data(), axes.size());
     bool hasVerity = getVerity(path);
     writer->write<int8_t>(static_cast<int8_t>(hasVerity));
diff --git a/libs/hwui/jni/fonts/Font.cpp b/libs/hwui/jni/fonts/Font.cpp
index f405aba..6a05b6c 100644
--- a/libs/hwui/jni/fonts/Font.cpp
+++ b/libs/hwui/jni/fonts/Font.cpp
@@ -142,7 +142,7 @@
     std::shared_ptr<minikin::MinikinFont> newMinikinFont = std::make_shared<MinikinFontSkia>(
             std::move(newTypeface), minikinSkia->GetSourceId(), minikinSkia->GetFontData(),
             minikinSkia->GetFontSize(), minikinSkia->getFilePath(), minikinSkia->GetFontIndex(),
-            builder->axes);
+            minikin::VariationSettings(builder->axes, false));
     std::shared_ptr<minikin::Font> newFont = minikin::Font::Builder(newMinikinFont)
               .setWeight(weight)
               .setSlant(static_cast<minikin::FontStyle::Slant>(italic))
@@ -303,7 +303,7 @@
         var = reader.readArray<minikin::FontVariation>().first[index];
     } else {
         const std::shared_ptr<minikin::MinikinFont>& minikinFont = font->font->baseTypeface();
-        var = minikinFont->GetAxes().at(index);
+        var = minikinFont->GetAxes()[index];
     }
     uint32_t floatBinary = *reinterpret_cast<const uint32_t*>(&var.value);
     return (static_cast<uint64_t>(var.axisTag) << 32) | static_cast<uint64_t>(floatBinary);
diff --git a/libs/hwui/jni/graphics_jni_helpers.h b/libs/hwui/jni/graphics_jni_helpers.h
index 78db54a..91db134 100644
--- a/libs/hwui/jni/graphics_jni_helpers.h
+++ b/libs/hwui/jni/graphics_jni_helpers.h
@@ -80,9 +80,52 @@
     return static_cast<T>(res);
 }
 
+//  Inline variable that specifies the method binding format.
+//  The expected format is 'XX${method}XX', where ${method} represents the original method name.
+//  This variable is shared across all translation units. This is treated as a global variable as
+//  per C++ 17.
+inline std::string jniMethodFormat;
+
+inline static void setJniMethodFormat(std::string value) {
+    jniMethodFormat = value;
+}
+
+// Register the native methods, potenially applying the jniMethodFormat if it has been set.
+static inline int jniRegisterMaybeRenamedNativeMethods(JNIEnv* env, const char* className,
+                                                       const JNINativeMethod* gMethods,
+                                                       int numMethods) {
+    if (jniMethodFormat.empty()) {
+        return jniRegisterNativeMethods(env, className, gMethods, numMethods);
+    }
+
+    // Make a copy of gMethods with reformatted method names.
+    JNINativeMethod* modifiedMethods = new JNINativeMethod[numMethods];
+    LOG_ALWAYS_FATAL_IF(!modifiedMethods, "Failed to allocate a copy of the JNI methods");
+
+    size_t methodNamePos = jniMethodFormat.find("${method}");
+    LOG_ALWAYS_FATAL_IF(methodNamePos == std::string::npos,
+                        "Invalid jniMethodFormat: could not find '${method}' in pattern");
+
+    for (int i = 0; i < numMethods; i++) {
+        modifiedMethods[i] = gMethods[i];
+        std::string modifiedName = jniMethodFormat;
+        modifiedName.replace(methodNamePos, 9, gMethods[i].name);
+        char* modifiedNameChars = new char[modifiedName.length() + 1];
+        LOG_ALWAYS_FATAL_IF(!modifiedNameChars, "Failed to allocate the new method name");
+        std::strcpy(modifiedNameChars, modifiedName.c_str());
+        modifiedMethods[i].name = modifiedNameChars;
+    }
+    int res = jniRegisterNativeMethods(env, className, modifiedMethods, numMethods);
+    for (int i = 0; i < numMethods; i++) {
+        delete[] modifiedMethods[i].name;
+    }
+    delete[] modifiedMethods;
+    return res;
+}
+
 static inline int RegisterMethodsOrDie(JNIEnv* env, const char* className,
                                        const JNINativeMethod* gMethods, int numMethods) {
-    int res = jniRegisterNativeMethods(env, className, gMethods, numMethods);
+    int res = jniRegisterMaybeRenamedNativeMethods(env, className, gMethods, numMethods);
     LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
     return res;
 }
diff --git a/libs/hwui/jni/text/TextShaper.cpp b/libs/hwui/jni/text/TextShaper.cpp
index 6c05346..4563386 100644
--- a/libs/hwui/jni/text/TextShaper.cpp
+++ b/libs/hwui/jni/text/TextShaper.cpp
@@ -156,16 +156,47 @@
     return layout->layout.getFakery(i).isFakeItalic();
 }
 
+float findValueFromVariationSettings(const minikin::FontFakery& fakery, minikin::AxisTag tag) {
+    for (const minikin::FontVariation& fv : fakery.variationSettings()) {
+        if (fv.axisTag == tag) {
+            return fv.value;
+        }
+    }
+    return std::numeric_limits<float>::quiet_NaN();
+}
+
 // CriticalNative
 static jfloat TextShaper_Result_getWeightOverride(CRITICAL_JNI_PARAMS_COMMA jlong ptr, jint i) {
     const LayoutWrapper* layout = reinterpret_cast<LayoutWrapper*>(ptr);
-    return layout->layout.getFakery(i).wghtAdjustment();
+    if (text_feature::typeface_redesign()) {
+        float value =
+                findValueFromVariationSettings(layout->layout.getFakery(i), minikin::TAG_wght);
+        if (!std::isnan(value)) {
+            return value;
+        } else {
+            const std::shared_ptr<minikin::Font>& font = layout->layout.getFontRef(i);
+            return font->style().weight();
+        }
+    } else {
+        return layout->layout.getFakery(i).wghtAdjustment();
+    }
 }
 
 // CriticalNative
 static jfloat TextShaper_Result_getItalicOverride(CRITICAL_JNI_PARAMS_COMMA jlong ptr, jint i) {
     const LayoutWrapper* layout = reinterpret_cast<LayoutWrapper*>(ptr);
-    return layout->layout.getFakery(i).italAdjustment();
+    if (text_feature::typeface_redesign()) {
+        float value =
+                findValueFromVariationSettings(layout->layout.getFakery(i), minikin::TAG_ital);
+        if (!std::isnan(value)) {
+            return value;
+        } else {
+            const std::shared_ptr<minikin::Font>& font = layout->layout.getFontRef(i);
+            return font->style().isItalic();
+        }
+    } else {
+        return layout->layout.getFakery(i).italAdjustment();
+    }
 }
 
 // CriticalNative
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index e302393..6571d92 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -44,7 +44,7 @@
 namespace renderthread {
 
 // Not all of these are strictly required, but are all enabled if present.
-static std::array<std::string_view, 21> sEnableExtensions{
+static std::array<std::string_view, 23> sEnableExtensions{
         VK_KHR_BIND_MEMORY_2_EXTENSION_NAME,
         VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME,
         VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME,
@@ -65,6 +65,8 @@
         VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
         VK_KHR_ANDROID_SURFACE_EXTENSION_NAME,
         VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME,
+        VK_EXT_GLOBAL_PRIORITY_QUERY_EXTENSION_NAME,
+        VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME,
         VK_EXT_DEVICE_FAULT_EXTENSION_NAME,
 };
 
@@ -206,7 +208,7 @@
     GET_INST_PROC(GetPhysicalDeviceFeatures2);
     GET_INST_PROC(GetPhysicalDeviceImageFormatProperties2);
     GET_INST_PROC(GetPhysicalDeviceProperties);
-    GET_INST_PROC(GetPhysicalDeviceQueueFamilyProperties);
+    GET_INST_PROC(GetPhysicalDeviceQueueFamilyProperties2);
 
     uint32_t gpuCount;
     LOG_ALWAYS_FATAL_IF(mEnumeratePhysicalDevices(mInstance, &gpuCount, nullptr));
@@ -225,21 +227,30 @@
 
     // query to get the initial queue props size
     uint32_t queueCount = 0;
-    mGetPhysicalDeviceQueueFamilyProperties(mPhysicalDevice, &queueCount, nullptr);
+    mGetPhysicalDeviceQueueFamilyProperties2(mPhysicalDevice, &queueCount, nullptr);
     LOG_ALWAYS_FATAL_IF(!queueCount);
 
     // now get the actual queue props
-    std::unique_ptr<VkQueueFamilyProperties[]> queueProps(new VkQueueFamilyProperties[queueCount]);
-    mGetPhysicalDeviceQueueFamilyProperties(mPhysicalDevice, &queueCount, queueProps.get());
+    std::unique_ptr<VkQueueFamilyProperties2[]>
+            queueProps(new VkQueueFamilyProperties2[queueCount]);
+    // query the global priority, this ignored if VK_EXT_global_priority isn't supported
+    std::vector<VkQueueFamilyGlobalPriorityPropertiesEXT> queuePriorityProps(queueCount);
+    for (uint32_t i = 0; i < queueCount; i++) {
+        queuePriorityProps[i].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT;
+        queuePriorityProps[i].pNext = nullptr;
+        queueProps[i].pNext = &queuePriorityProps[i];
+    }
+    mGetPhysicalDeviceQueueFamilyProperties2(mPhysicalDevice, &queueCount, queueProps.get());
 
     constexpr auto kRequestedQueueCount = 2;
 
     // iterate to find the graphics queue
     mGraphicsQueueIndex = queueCount;
     for (uint32_t i = 0; i < queueCount; i++) {
-        if (queueProps[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
+        if (queueProps[i].queueFamilyProperties.queueFlags & VK_QUEUE_GRAPHICS_BIT) {
             mGraphicsQueueIndex = i;
-            LOG_ALWAYS_FATAL_IF(queueProps[i].queueCount < kRequestedQueueCount);
+            LOG_ALWAYS_FATAL_IF(
+                    queueProps[i].queueFamilyProperties.queueCount < kRequestedQueueCount);
             break;
         }
     }
@@ -327,6 +338,15 @@
         tailPNext = &formatFeatures->pNext;
     }
 
+    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* globalPriorityQueryFeatures =
+            new VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT;
+    globalPriorityQueryFeatures->sType =
+            VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT;
+    globalPriorityQueryFeatures->pNext = nullptr;
+    globalPriorityQueryFeatures->globalPriorityQuery = false;
+    *tailPNext = globalPriorityQueryFeatures;
+    tailPNext = &globalPriorityQueryFeatures->pNext;
+
     // query to get the physical device features
     mGetPhysicalDeviceFeatures2(mPhysicalDevice, &features);
     // this looks like it would slow things down,
@@ -341,24 +361,59 @@
 
     if (Properties::contextPriority != 0 &&
         grExtensions.hasExtension(VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME, 2)) {
-        memset(&queuePriorityCreateInfo, 0, sizeof(VkDeviceQueueGlobalPriorityCreateInfoEXT));
-        queuePriorityCreateInfo.sType =
-                VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT;
-        queuePriorityCreateInfo.pNext = nullptr;
+        VkQueueGlobalPriorityEXT globalPriority;
         switch (Properties::contextPriority) {
             case EGL_CONTEXT_PRIORITY_LOW_IMG:
-                queuePriorityCreateInfo.globalPriority = VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT;
+                globalPriority = VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT;
                 break;
             case EGL_CONTEXT_PRIORITY_MEDIUM_IMG:
-                queuePriorityCreateInfo.globalPriority = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT;
+                globalPriority = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT;
                 break;
             case EGL_CONTEXT_PRIORITY_HIGH_IMG:
-                queuePriorityCreateInfo.globalPriority = VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT;
+                globalPriority = VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT;
                 break;
             default:
                 LOG_ALWAYS_FATAL("Unsupported context priority");
         }
-        queueNextPtr = &queuePriorityCreateInfo;
+
+        // check if the requested priority is reported by the query
+        bool attachGlobalPriority = false;
+        if (uirenderer::Properties::queryGlobalPriority &&
+            globalPriorityQueryFeatures->globalPriorityQuery) {
+            for (uint32_t i = 0; i < queuePriorityProps[mGraphicsQueueIndex].priorityCount; i++) {
+                if (queuePriorityProps[mGraphicsQueueIndex].priorities[i] == globalPriority) {
+                    attachGlobalPriority = true;
+                    break;
+                }
+            }
+        } else {
+            // Querying is not supported so attempt queue creation with requested priority anyways
+            // If the priority turns out not to be supported, the driver *may* fail with
+            // VK_ERROR_NOT_PERMITTED_KHR
+            attachGlobalPriority = true;
+        }
+
+        if (attachGlobalPriority) {
+            memset(&queuePriorityCreateInfo, 0, sizeof(VkDeviceQueueGlobalPriorityCreateInfoEXT));
+            queuePriorityCreateInfo.sType =
+                    VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT;
+            queuePriorityCreateInfo.pNext = nullptr;
+            queuePriorityCreateInfo.globalPriority = globalPriority;
+            queueNextPtr = &queuePriorityCreateInfo;
+        } else {
+            // If globalPriorityQuery is enabled, attempting queue creation with an unsupported
+            // priority will return VK_ERROR_INITIALIZATION_FAILED.
+            //
+            // SysUI and Launcher will request HIGH when SF has RT but it is a known issue that
+            // upstream drm drivers currently lack a way to grant them the granular privileges
+            // they need for HIGH (but not RT) so they will fail queue creation.
+            // For now, drop the unsupported global priority request so that queue creation
+            // succeeds.
+            //
+            // Once that is fixed, this should probably be a fatal error indicating an improper
+            // request or an app needs to get the correct privileges.
+            ALOGW("Requested context priority is not supported by the queue");
+        }
     }
 
     const VkDeviceQueueCreateInfo queueInfo = {
diff --git a/libs/hwui/renderthread/VulkanManager.h b/libs/hwui/renderthread/VulkanManager.h
index f042571..a593ec6 100644
--- a/libs/hwui/renderthread/VulkanManager.h
+++ b/libs/hwui/renderthread/VulkanManager.h
@@ -152,7 +152,7 @@
     VkPtr<PFN_vkDestroyInstance> mDestroyInstance;
     VkPtr<PFN_vkEnumeratePhysicalDevices> mEnumeratePhysicalDevices;
     VkPtr<PFN_vkGetPhysicalDeviceProperties> mGetPhysicalDeviceProperties;
-    VkPtr<PFN_vkGetPhysicalDeviceQueueFamilyProperties> mGetPhysicalDeviceQueueFamilyProperties;
+    VkPtr<PFN_vkGetPhysicalDeviceQueueFamilyProperties2> mGetPhysicalDeviceQueueFamilyProperties2;
     VkPtr<PFN_vkGetPhysicalDeviceFeatures2> mGetPhysicalDeviceFeatures2;
     VkPtr<PFN_vkGetPhysicalDeviceImageFormatProperties2> mGetPhysicalDeviceImageFormatProperties2;
     VkPtr<PFN_vkCreateDevice> mCreateDevice;
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java
index c90c441..0da8371b 100644
--- a/media/java/android/media/AudioFormat.java
+++ b/media/java/android/media/AudioFormat.java
@@ -16,6 +16,9 @@
 
 package android.media;
 
+import static android.media.audio.Flags.FLAG_DOLBY_AC4_LEVEL4_ENCODING_API;
+
+import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.IntRange;
 import android.annotation.NonNull;
@@ -309,7 +312,7 @@
     public static final int ENCODING_AAC_ELD = 15;
     /** Audio data format: AAC xHE compressed */
     public static final int ENCODING_AAC_XHE = 16;
-    /** Audio data format: AC-4 sync frame transport format */
+    /** Audio data format: AC-4 (levels 0-3) sync frame transport format */
     public static final int ENCODING_AC4 = 17;
     /** Audio data format: E-AC-3-JOC compressed
      * E-AC-3-JOC streams can be decoded by downstream devices supporting {@link #ENCODING_E_AC3}.
@@ -375,6 +378,9 @@
     public static final int ENCODING_DTS_UHD_P2 = 30;
     /** Audio data format: Direct Stream Digital */
     public static final int ENCODING_DSD = 31;
+    /** Audio data format: AC-4 level 4 sync frame transport format */
+    @FlaggedApi(FLAG_DOLBY_AC4_LEVEL4_ENCODING_API)
+    public static final int ENCODING_AC4_L4 = 32;
 
     /** @hide */
     public static String toLogFriendlyEncoding(int enc) {
@@ -413,6 +419,8 @@
                 return "ENCODING_AAC_XHE";
             case ENCODING_AC4:
                 return "ENCODING_AC4";
+            case ENCODING_AC4_L4:
+                return "ENCODING_AC4_L4";
             case ENCODING_E_AC3_JOC:
                 return "ENCODING_E_AC3_JOC";
             case ENCODING_DOLBY_MAT:
@@ -823,6 +831,7 @@
             case ENCODING_AAC_ELD:
             case ENCODING_AAC_XHE:
             case ENCODING_AC4:
+            case ENCODING_AC4_L4:
             case ENCODING_E_AC3_JOC:
             case ENCODING_DOLBY_MAT:
             case ENCODING_OPUS:
@@ -863,6 +872,7 @@
             case ENCODING_AAC_ELD:
             case ENCODING_AAC_XHE:
             case ENCODING_AC4:
+            case ENCODING_AC4_L4:
             case ENCODING_E_AC3_JOC:
             case ENCODING_DOLBY_MAT:
             case ENCODING_OPUS:
@@ -908,6 +918,7 @@
             case ENCODING_AAC_ELD:
             case ENCODING_AAC_XHE:
             case ENCODING_AC4:
+            case ENCODING_AC4_L4:
             case ENCODING_E_AC3_JOC:
             case ENCODING_DOLBY_MAT:
             case ENCODING_OPUS:
@@ -950,6 +961,7 @@
             case ENCODING_AAC_ELD:
             case ENCODING_AAC_XHE:
             case ENCODING_AC4:
+            case ENCODING_AC4_L4:
             case ENCODING_E_AC3_JOC:
             case ENCODING_DOLBY_MAT:
             case ENCODING_OPUS:
@@ -1238,6 +1250,7 @@
                 case ENCODING_AAC_ELD:
                 case ENCODING_AAC_XHE:
                 case ENCODING_AC4:
+                case ENCODING_AC4_L4:
                 case ENCODING_E_AC3_JOC:
                 case ENCODING_DOLBY_MAT:
                 case ENCODING_OPUS:
@@ -1468,6 +1481,7 @@
         ENCODING_AAC_ELD,
         ENCODING_AAC_XHE,
         ENCODING_AC4,
+        ENCODING_AC4_L4,
         ENCODING_E_AC3_JOC,
         ENCODING_DOLBY_MAT,
         ENCODING_OPUS,
@@ -1506,6 +1520,7 @@
             ENCODING_AAC_ELD,
             ENCODING_AAC_XHE,
             ENCODING_AC4,
+            ENCODING_AC4_L4,
             ENCODING_E_AC3_JOC,
             ENCODING_DOLBY_MAT,
             ENCODING_OPUS,
@@ -1533,6 +1548,7 @@
             ENCODING_AAC_LC,
             ENCODING_DOLBY_TRUEHD,
             ENCODING_AC4,
+            ENCODING_AC4_L4,
             ENCODING_E_AC3_JOC,
             ENCODING_DOLBY_MAT,
             ENCODING_MPEGH_BL_L3,
@@ -1554,6 +1570,7 @@
             ENCODING_AAC_LC,
             ENCODING_DOLBY_TRUEHD,
             ENCODING_AC4,
+            ENCODING_AC4_L4,
             ENCODING_E_AC3_JOC,
             ENCODING_DOLBY_MAT,
             ENCODING_MPEGH_BL_L3,
@@ -1592,7 +1609,9 @@
             case ENCODING_DOLBY_TRUEHD:
                 return "Dolby TrueHD";
             case ENCODING_AC4:
-                return "Dolby AC-4";
+                return "Dolby AC-4 levels 0-3";
+            case ENCODING_AC4_L4:
+                return "Dolby AC-4 level 4";
             case ENCODING_E_AC3_JOC:
                 return "Dolby Atmos in Dolby Digital Plus";
             case ENCODING_DOLBY_MAT:
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index ebdfd3e..a8b863b 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -542,6 +542,8 @@
                 return "AUDIO_FORMAT_AAC_LATM_HE_V2"; // (AAC_LATM | AAC_SUB_HE_V2)
             case /* AUDIO_FORMAT_E_AC3_JOC         */ 0xA000001:
                 return "AUDIO_FORMAT_E_AC3_JOC";  // (E_AC3 | E_AC3_SUB_JOC)
+            case /* AUDIO_FORMAT_AC4_L4            */ 0x22000001:
+                return "AUDIO_FORMAT_AC4_L4";  // (AC4 | AC4_SUB_L4)
             case /* AUDIO_FORMAT_MAT_1_0           */ 0x24000001:
                 return "AUDIO_FORMAT_MAT_1_0"; // (MAT | MAT_SUB_1_0)
             case /* AUDIO_FORMAT_MAT_2_0           */ 0x24000002:
diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java
index f0ab6ec..0f24654 100644
--- a/media/java/android/media/RingtoneManager.java
+++ b/media/java/android/media/RingtoneManager.java
@@ -1089,7 +1089,24 @@
         defaultRingtoneUri = ContentProvider.getUriWithoutUserId(defaultRingtoneUri);
         if (defaultRingtoneUri == null) {
             return -1;
-        } else if (defaultRingtoneUri.equals(Settings.System.DEFAULT_RINGTONE_URI)) {
+        }
+
+        if (Flags.enableRingtoneHapticsCustomization()
+                && Utils.hasVibration(defaultRingtoneUri)) {
+            // skip to check TYPE_ALARM because the customized haptic hasn't enabled in alarm
+            if (defaultRingtoneUri.toString()
+                    .contains(Settings.System.DEFAULT_RINGTONE_URI.toString())) {
+                return TYPE_RINGTONE;
+            } else if (defaultRingtoneUri.toString()
+                    .contains(Settings.System.DEFAULT_NOTIFICATION_URI.toString())) {
+                return TYPE_NOTIFICATION;
+            } else if (defaultRingtoneUri.toString()
+                    .contains(Settings.System.DEFAULT_ALARM_ALERT_URI.toString())) {
+                return TYPE_ALARM;
+            }
+        }
+
+        if (defaultRingtoneUri.equals(Settings.System.DEFAULT_RINGTONE_URI)) {
             return TYPE_RINGTONE;
         } else if (defaultRingtoneUri.equals(Settings.System.DEFAULT_NOTIFICATION_URI)) {
             return TYPE_NOTIFICATION;
diff --git a/media/java/android/media/RoutingSessionInfo.java b/media/java/android/media/RoutingSessionInfo.java
index 9899e4e..83a4dd5 100644
--- a/media/java/android/media/RoutingSessionInfo.java
+++ b/media/java/android/media/RoutingSessionInfo.java
@@ -22,7 +22,6 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.content.res.Resources;
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -57,8 +56,6 @@
                 }
             };
 
-    private static final String TAG = "RoutingSessionInfo";
-
     private static final String KEY_GROUP_ROUTE = "androidx.mediarouter.media.KEY_GROUP_ROUTE";
     private static final String KEY_VOLUME_HANDLING = "volumeHandling";
 
@@ -142,15 +139,7 @@
         mVolume = builder.mVolume;
 
         mIsSystemSession = builder.mIsSystemSession;
-
-        boolean volumeAdjustmentForRemoteGroupSessions = Resources.getSystem().getBoolean(
-                com.android.internal.R.bool.config_volumeAdjustmentForRemoteGroupSessions);
-        mVolumeHandling =
-                defineVolumeHandling(
-                        mIsSystemSession,
-                        builder.mVolumeHandling,
-                        mSelectedRoutes,
-                        volumeAdjustmentForRemoteGroupSessions);
+        mVolumeHandling = builder.mVolumeHandling;
 
         mControlHints = updateVolumeHandlingInHints(builder.mControlHints, mVolumeHandling);
         mTransferReason = builder.mTransferReason;
@@ -207,20 +196,6 @@
         return controlHints;
     }
 
-    @MediaRoute2Info.PlaybackVolume
-    private static int defineVolumeHandling(
-            boolean isSystemSession,
-            @MediaRoute2Info.PlaybackVolume int volumeHandling,
-            List<String> selectedRoutes,
-            boolean volumeAdjustmentForRemoteGroupSessions) {
-        if (!isSystemSession
-                && !volumeAdjustmentForRemoteGroupSessions
-                && selectedRoutes.size() > 1) {
-            return MediaRoute2Info.PLAYBACK_VOLUME_FIXED;
-        }
-        return volumeHandling;
-    }
-
     @NonNull
     private static String ensureString(@Nullable String str) {
         return str != null ? str : "";
diff --git a/media/java/android/media/projection/MediaProjection.java b/media/java/android/media/projection/MediaProjection.java
index 31f8996..ef4c3ef 100644
--- a/media/java/android/media/projection/MediaProjection.java
+++ b/media/java/android/media/projection/MediaProjection.java
@@ -16,6 +16,8 @@
 
 package android.media.projection;
 
+import static android.view.Display.DEFAULT_DISPLAY;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.compat.CompatChanges;
@@ -29,6 +31,7 @@
 import android.os.Build;
 import android.os.Handler;
 import android.os.RemoteException;
+import android.os.UserManager;
 import android.util.ArrayMap;
 import android.util.Log;
 import android.util.Slog;
@@ -70,6 +73,7 @@
     private final DisplayManager mDisplayManager;
     @NonNull
     private final Map<Callback, CallbackRecord> mCallbacks = new ArrayMap<>();
+    private final int mDisplayId;
 
     /** @hide */
     public MediaProjection(Context context, IMediaProjection impl) {
@@ -88,6 +92,11 @@
             throw new RuntimeException("Failed to start media projection", e);
         }
         mDisplayManager = displayManager;
+
+        final UserManager userManager = context.getSystemService(UserManager.class);
+        mDisplayId = userManager.isVisibleBackgroundUsersSupported()
+                ? userManager.getMainDisplayIdAssignedToUser()
+                : DEFAULT_DISPLAY;
     }
 
     /**
@@ -156,6 +165,7 @@
         if (surface != null) {
             builder.setSurface(surface);
         }
+        builder.setDisplayIdToMirror(mDisplayId);
         return createVirtualDisplay(builder, callback, handler);
     }
 
@@ -234,6 +244,7 @@
         if (surface != null) {
             builder.setSurface(surface);
         }
+        builder.setDisplayIdToMirror(mDisplayId);
         return createVirtualDisplay(builder, callback, handler);
     }
 
diff --git a/media/java/android/media/session/PlaybackState.java b/media/java/android/media/session/PlaybackState.java
index 47637b8..290d49b 100644
--- a/media/java/android/media/session/PlaybackState.java
+++ b/media/java/android/media/session/PlaybackState.java
@@ -15,10 +15,8 @@
  */
 package android.media.session;
 
-import static com.android.media.flags.Flags.FLAG_ENABLE_NOTIFYING_ACTIVITY_MANAGER_WITH_MEDIA_SESSION_STATUS_CHANGE;
 
 import android.annotation.DrawableRes;
-import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.LongDef;
 import android.annotation.Nullable;
@@ -187,13 +185,21 @@
      */
     public static final long ACTION_SET_PLAYBACK_SPEED = 1 << 22;
 
-    /**
-     * @hide
-     */
-    @IntDef({STATE_NONE, STATE_STOPPED, STATE_PAUSED, STATE_PLAYING, STATE_FAST_FORWARDING,
-            STATE_REWINDING, STATE_BUFFERING, STATE_ERROR, STATE_CONNECTING,
-            STATE_SKIPPING_TO_PREVIOUS, STATE_SKIPPING_TO_NEXT, STATE_SKIPPING_TO_QUEUE_ITEM,
-            STATE_PLAYBACK_SUPPRESSED})
+    /** @hide */
+    @IntDef({
+        STATE_NONE,
+        STATE_STOPPED,
+        STATE_PAUSED,
+        STATE_PLAYING,
+        STATE_FAST_FORWARDING,
+        STATE_REWINDING,
+        STATE_BUFFERING,
+        STATE_ERROR,
+        STATE_CONNECTING,
+        STATE_SKIPPING_TO_PREVIOUS,
+        STATE_SKIPPING_TO_NEXT,
+        STATE_SKIPPING_TO_QUEUE_ITEM
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface State {}
 
@@ -290,19 +296,6 @@
     public static final int STATE_SKIPPING_TO_QUEUE_ITEM = 11;
 
     /**
-     * State indicating that playback is paused due to an external transient interruption, like a
-     * phone call.
-     *
-     * <p>This state is different from {@link #STATE_PAUSED} in that it is deemed transitory,
-     * possibly allowing the service associated to the session in this state to run in the
-     * foreground.
-     *
-     * @see Builder#setState
-     */
-    @FlaggedApi(FLAG_ENABLE_NOTIFYING_ACTIVITY_MANAGER_WITH_MEDIA_SESSION_STATUS_CHANGE)
-    public static final int STATE_PLAYBACK_SUPPRESSED = 12;
-
-    /**
      * Use this value for the position to indicate the position is not known.
      */
     public static final long PLAYBACK_POSITION_UNKNOWN = -1;
@@ -401,7 +394,6 @@
      * <li> {@link PlaybackState#STATE_SKIPPING_TO_PREVIOUS}</li>
      * <li> {@link PlaybackState#STATE_SKIPPING_TO_NEXT}</li>
      * <li> {@link PlaybackState#STATE_SKIPPING_TO_QUEUE_ITEM}</li>
-     * <li> {@link PlaybackState#STATE_PLAYBACK_SUPPRESSED}</li>
      * </ul>
      */
     @State
@@ -525,7 +517,6 @@
      * <li>{@link #STATE_SKIPPING_TO_NEXT}</li>
      * <li>{@link #STATE_SKIPPING_TO_PREVIOUS}</li>
      * <li>{@link #STATE_SKIPPING_TO_QUEUE_ITEM}</li>
-     * <li>{@link #STATE_PLAYBACK_SUPPRESSED}</li>
      * </ul>
      */
     public boolean isActive() {
@@ -538,7 +529,6 @@
             case PlaybackState.STATE_BUFFERING:
             case PlaybackState.STATE_CONNECTING:
             case PlaybackState.STATE_PLAYING:
-            case PlaybackState.STATE_PLAYBACK_SUPPRESSED:
                 return true;
         }
         return false;
@@ -584,8 +574,6 @@
                 return "SKIPPING_TO_NEXT";
             case STATE_SKIPPING_TO_QUEUE_ITEM:
                 return "SKIPPING_TO_QUEUE_ITEM";
-            case STATE_PLAYBACK_SUPPRESSED:
-                return "STATE_PLAYBACK_SUPPRESSED";
             default:
                 return "UNKNOWN";
         }
@@ -823,7 +811,6 @@
          * <li> {@link PlaybackState#STATE_SKIPPING_TO_PREVIOUS}</li>
          * <li> {@link PlaybackState#STATE_SKIPPING_TO_NEXT}</li>
          * <li> {@link PlaybackState#STATE_SKIPPING_TO_QUEUE_ITEM}</li>
-         * <li> {@link PlaybackState#STATE_PLAYBACK_SUPPRESSED}</li>
          * </ul>
          *
          * @param state The current state of playback.
@@ -868,7 +855,6 @@
          * <li> {@link PlaybackState#STATE_SKIPPING_TO_PREVIOUS}</li>
          * <li> {@link PlaybackState#STATE_SKIPPING_TO_NEXT}</li>
          * <li> {@link PlaybackState#STATE_SKIPPING_TO_QUEUE_ITEM}</li>
-         * <li> {@link PlaybackState#STATE_PLAYBACK_SUPPRESSED}</li>
          * </ul>
          *
          * @param state The current state of playback.
diff --git a/media/java/android/media/soundtrigger/SoundTriggerInstrumentation.java b/media/java/android/media/soundtrigger/SoundTriggerInstrumentation.java
index c376f25..8b28347 100644
--- a/media/java/android/media/soundtrigger/SoundTriggerInstrumentation.java
+++ b/media/java/android/media/soundtrigger/SoundTriggerInstrumentation.java
@@ -17,6 +17,7 @@
 package android.media.soundtrigger;
 
 import android.annotation.CallbackExecutor;
+import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
@@ -328,6 +329,7 @@
          * Get the recognition config used to start this recognition.
          * @return - The config passed to the HAL for startRecognition.
          */
+        @FlaggedApi(Flags.FLAG_MANAGER_API)
         public @NonNull SoundTrigger.RecognitionConfig getRecognitionConfig() {
             return mRecognitionConfig;
         }
diff --git a/media/java/android/media/soundtrigger/SoundTriggerManager.java b/media/java/android/media/soundtrigger/SoundTriggerManager.java
index 78352871..3d0c406 100644
--- a/media/java/android/media/soundtrigger/SoundTriggerManager.java
+++ b/media/java/android/media/soundtrigger/SoundTriggerManager.java
@@ -19,6 +19,7 @@
 import static android.hardware.soundtrigger.SoundTrigger.STATUS_ERROR;
 
 import android.annotation.CallbackExecutor;
+import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
@@ -42,7 +43,6 @@
 import android.media.permission.Identity;
 import android.media.permission.SafeCloseable;
 import android.os.Binder;
-import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
@@ -463,13 +463,18 @@
     public static final String EXTRA_STATUS = "android.media.soundtrigger.STATUS";
 
     /**
-     * Loads a given sound model into the sound trigger. Note the model will be unloaded if there is
-     * an error/the system service is restarted.
-     * @hide
+     * Loads a given sound model into the sound trigger.
+     *
+     * <p><b>Note:</b> the model will be unloaded if there is an error/the system service is
+     * restarted.
+     *
+     * @return {@link SoundTrigger#STATUS_OK} if the model was loaded successfully, error code
+     *         otherwise
      */
+    @SuppressLint("AndroidFrameworkRequiresPermission")
     @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER)
     @UnsupportedAppUsage
-    @TestApi
+    @FlaggedApi(Flags.FLAG_MANAGER_API)
     public int loadSoundModel(@NonNull SoundModel soundModel) {
         if (mSoundTriggerSession == null) {
             throw new IllegalStateException("No underlying SoundTriggerModule available");
@@ -508,11 +513,11 @@
      *
      * @return {@link SoundTrigger#STATUS_OK} if the recognition could be started, error code
      *         otherwise
-     *
-     * @hide
      */
+    @SuppressLint("AndroidFrameworkRequiresPermission")
     @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER)
     @UnsupportedAppUsage
+    @FlaggedApi(Flags.FLAG_MANAGER_API)
     public int startRecognition(@NonNull UUID soundModelId, @Nullable Bundle params,
         @NonNull ComponentName detectionService, @NonNull RecognitionConfig config) {
         Objects.requireNonNull(soundModelId);
@@ -531,11 +536,15 @@
 
     /**
      * Stops the given model's recognition.
-     * @hide
+     *
+     * @return {@link SoundTrigger#STATUS_OK} if the recognition could be stopped, error code
+     *         otherwise
      */
+    @SuppressLint("AndroidFrameworkRequiresPermission")
     @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER)
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public int stopRecognition(UUID soundModelId) {
+    @UnsupportedAppUsage
+    @FlaggedApi(Flags.FLAG_MANAGER_API)
+    public int stopRecognition(@NonNull UUID soundModelId) {
         if (mSoundTriggerSession == null) {
             throw new IllegalStateException("No underlying SoundTriggerModule available");
         }
@@ -548,12 +557,18 @@
     }
 
     /**
-     * Removes the given model from memory. Will also stop any pending recognitions.
-     * @hide
+     * Removes the given model from memory.
+     *
+     * <p>Will also stop any pending recognitions.
+     *
+     * @return {@link SoundTrigger#STATUS_OK} if the model was unloaded successfully, error code
+     *         otherwise
      */
+    @SuppressLint("AndroidFrameworkRequiresPermission")
     @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER)
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public int unloadSoundModel(UUID soundModelId) {
+    @UnsupportedAppUsage
+    @FlaggedApi(Flags.FLAG_MANAGER_API)
+    public int unloadSoundModel(@NonNull UUID soundModelId) {
         if (mSoundTriggerSession == null) {
             throw new IllegalStateException("No underlying SoundTriggerModule available");
         }
@@ -566,12 +581,13 @@
     }
 
     /**
-     * Returns true if the given model has had detection started on it.
-     * @hide
+     * Returns whether the given model has had detection started on it.
      */
+    @SuppressLint("AndroidFrameworkRequiresPermission")
     @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER)
     @UnsupportedAppUsage
-    public boolean isRecognitionActive(UUID soundModelId) {
+    @FlaggedApi(Flags.FLAG_MANAGER_API)
+    public boolean isRecognitionActive(@NonNull UUID soundModelId) {
         if (soundModelId == null || mSoundTriggerSession == null) {
             return false;
         }
@@ -599,14 +615,16 @@
     }
 
     /**
-     * Asynchronously get state of the indicated model.  The model state is returned as
-     * a recognition event in the callback that was registered in the startRecognition
-     * method.
-     * @hide
+     * Asynchronously gets state of the indicated model.
+     *
+     * <p>The model state is returned as a recognition event in the callback that was registered
+     * in the {@link #startRecognition(UUID, Bundle, ComponentName, RecognitionConfig)} method.
      */
+    @SuppressLint("AndroidFrameworkRequiresPermission")
     @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER)
     @UnsupportedAppUsage
-    public int getModelState(UUID soundModelId) {
+    @FlaggedApi(Flags.FLAG_MANAGER_API)
+    public int getModelState(@NonNull UUID soundModelId) {
         if (mSoundTriggerSession == null) {
             throw new IllegalStateException("No underlying SoundTriggerModule available");
         }
@@ -621,7 +639,7 @@
     }
 
     /**
-     * Get the hardware sound trigger module properties currently loaded.
+     * Gets the hardware sound trigger module properties currently loaded.
      *
      * @return The properties currently loaded. Returns null if no supported hardware loaded.
      */
@@ -639,9 +657,11 @@
     }
 
     /**
-     * Set a model specific {@link ModelParams} with the given value. This
-     * parameter will keep its value for the duration the model is loaded regardless of starting and
-     * stopping recognition. Once the model is unloaded, the value will be lost.
+     * Sets a model specific {@link ModelParams} with the given value.
+     *
+     * <p>This parameter will keep its value for the duration the model is loaded regardless of
+     * starting and stopping recognition. Once the model is unloaded, the value will be lost.
+     *
      * {@link SoundTriggerManager#queryParameter} should be checked first before calling this
      * method.
      *
@@ -671,12 +691,15 @@
     }
 
     /**
-     * Get a model specific {@link ModelParams}. This parameter will keep its value
-     * for the duration the model is loaded regardless of starting and stopping recognition.
-     * Once the model is unloaded, the value will be lost. If the value is not set, a default
-     * value is returned. See {@link ModelParams} for parameter default values.
-     * {@link SoundTriggerManager#queryParameter} should be checked first before
-     * calling this method. Otherwise, an exception can be thrown.
+     * Gets a model specific {@link ModelParams}.
+     *
+     * <p>This parameter will keep its value for the duration the model is loaded regardless
+     * of starting and stopping recognition. Once the model is unloaded, the value will be lost.
+     * If the value is not set, a default value is returned. See {@link ModelParams} for
+     * parameter default values.
+     *
+     * {@link SoundTriggerManager#queryParameter} should be checked first before calling this
+     * method. Otherwise, an exception can be thrown.
      *
      * @param soundModelId UUID of model to get parameter
      * @param modelParam   {@link ModelParams}
@@ -697,9 +720,10 @@
     }
 
     /**
-     * Determine if parameter control is supported for the given model handle.
-     * This method should be checked prior to calling {@link SoundTriggerManager#setParameter} or
-     * {@link SoundTriggerManager#getParameter}.
+     * Determines if parameter control is supported for the given model handle.
+     *
+     * <p>This method should be checked prior to calling {@link SoundTriggerManager#setParameter}
+     * or {@link SoundTriggerManager#getParameter}.
      *
      * @param soundModelId handle of model to get parameter
      * @param modelParam {@link ModelParams}
diff --git a/media/java/android/media/tv/flags/media_tv.aconfig b/media/java/android/media/tv/flags/media_tv.aconfig
index c814c95..10423b9 100644
--- a/media/java/android/media/tv/flags/media_tv.aconfig
+++ b/media/java/android/media/tv/flags/media_tv.aconfig
@@ -56,3 +56,11 @@
     description: "Enhance HDMI-CEC power state and activeness transitions"
     bug: "332780751"
 }
+
+flag {
+    name: "media_quality_fw"
+    is_exported: true
+    namespace: "media_tv"
+    description: "Media Quality V1.0 APIs for Android W"
+    bug: "348412562"
+}
diff --git a/media/java/android/media/tv/interactive/ITvInteractiveAppSessionWrapper.java b/media/java/android/media/tv/interactive/ITvInteractiveAppSessionWrapper.java
index ec6c2bf..8e6297c 100644
--- a/media/java/android/media/tv/interactive/ITvInteractiveAppSessionWrapper.java
+++ b/media/java/android/media/tv/interactive/ITvInteractiveAppSessionWrapper.java
@@ -267,7 +267,9 @@
                 break;
             }
             case DO_NOTIFY_CONTENT_BLOCKED: {
-                mSessionImpl.notifyContentBlocked((TvContentRating) msg.obj);
+                String contentRating = (String) msg.obj;
+                mSessionImpl.notifyContentBlocked(
+                        TvContentRating.unflattenFromString(contentRating));
                 break;
             }
             case DO_NOTIFY_SIGNAL_STRENGTH: {
diff --git a/media/java/android/media/tv/tuner/filter/MediaEvent.java b/media/java/android/media/tv/tuner/filter/MediaEvent.java
index 4676dff..84a13ab 100644
--- a/media/java/android/media/tv/tuner/filter/MediaEvent.java
+++ b/media/java/android/media/tv/tuner/filter/MediaEvent.java
@@ -17,12 +17,14 @@
 package android.media.tv.tuner.filter;
 
 import android.annotation.BytesLong;
+import android.annotation.FlaggedApi;
 import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
 import android.media.AudioPresentation;
 import android.media.MediaCodec.LinearBlock;
+import android.media.tv.flags.Flags;
 
 import java.util.Collections;
 import java.util.List;
@@ -57,12 +59,16 @@
     private final int mScIndexMask;
     private final AudioDescriptor mExtraMetaData;
     private final List<AudioPresentation> mAudioPresentations;
+    private final int mNumDataPieces;
+    private final int mIndexInDataGroup;
+    private final int mDataGroupId;
 
     // This constructor is used by JNI code only
     private MediaEvent(int streamId, boolean isPtsPresent, long pts, boolean isDtsPresent, long dts,
             long dataLength, long offset, LinearBlock buffer, boolean isSecureMemory, long dataId,
             int mpuSequenceNumber, boolean isPrivateData, int scIndexMask,
-            AudioDescriptor extraMetaData, List<AudioPresentation> audioPresentations) {
+            AudioDescriptor extraMetaData, List<AudioPresentation> audioPresentations,
+            int numDataPieces, int indexInDataGroup, int dataGroupId) {
         mStreamId = streamId;
         mIsPtsPresent = isPtsPresent;
         mPts = pts;
@@ -78,6 +84,9 @@
         mScIndexMask = scIndexMask;
         mExtraMetaData = extraMetaData;
         mAudioPresentations = audioPresentations;
+        mNumDataPieces = numDataPieces;
+        mIndexInDataGroup = indexInDataGroup;
+        mDataGroupId = dataGroupId;
     }
 
     /**
@@ -235,6 +244,67 @@
     }
 
     /**
+     * Gets the number of data pieces into which the original data was split.
+     *
+     * <p>The {@link #getNumDataPieces()}, {@link #getIndexInDataGroup()} and
+     * {@link #getDataGroupId()} methods should be used together to reassemble the original data if
+     * it was split into pieces. Use {@link #getLinearBlock()} to get the memory where the data
+     * pieces are stored.
+     *
+     * @return 0 or 1 if this MediaEvent object contains the complete data; otherwise the number of
+     *         pieces into which the original data was split.
+     * @see #getIndexInDataGroup()
+     * @see #getDataGroupId()
+     * @see #getLinearBlock()
+     */
+    @FlaggedApi(Flags.FLAG_TUNER_W_APIS)
+    @IntRange(from = 0)
+    public int getNumDataPieces() {
+        return mNumDataPieces;
+    }
+
+    /**
+     * Gets the index of the data piece. The index in the data group indicates the order in which
+     * this {@link MediaEvent}'s data piece should be reassembled. The result should be within the
+     * range [0, {@link #getNumDataPieces()}).
+     *
+     * <p>The {@link #getNumDataPieces()}, {@link #getIndexInDataGroup()} and
+     * {@link #getDataGroupId()} methods should be used together to reassemble the original data if
+     * it was split into pieces. Use {@link #getLinearBlock()} to get the memory where the data
+     * pieces are stored.
+     *
+     * @return The index in the data group.
+     * @see #getNumDataPieces()
+     * @see #getDataGroupId()
+     * @see #getLinearBlock()
+     */
+    @FlaggedApi(Flags.FLAG_TUNER_W_APIS)
+    @IntRange(from = 0)
+    public int getIndexInDataGroup() {
+        return mIndexInDataGroup;
+    }
+
+    /**
+     * Gets the group ID for reassembling the complete data. {@link MediaEvent}s that have the same
+     * data group ID contain different pieces of the same data. This value should be ignored if
+     * {@link #getNumDataPieces()} returns 0 or 1.
+     *
+     * <p>The {@link #getNumDataPieces()}, {@link #getIndexInDataGroup()} and
+     * {@link #getDataGroupId()} methods should be used together to reassemble the original data if
+     * it was split into pieces. Use {@link #getLinearBlock()} to get the memory where the data
+     * pieces are stored.
+     *
+     * @return The data group ID.
+     * @see #getNumDataPieces()
+     * @see #getIndexInDataGroup()
+     * @see #getLinearBlock()
+     */
+    @FlaggedApi(Flags.FLAG_TUNER_W_APIS)
+    public int getDataGroupId() {
+        return mDataGroupId;
+    }
+
+    /**
      * Finalize the MediaEvent object.
      * @hide
      */
diff --git a/media/jni/android_media_ImageWriter.cpp b/media/jni/android_media_ImageWriter.cpp
index 6776f61..93deb51 100644
--- a/media/jni/android_media_ImageWriter.cpp
+++ b/media/jni/android_media_ImageWriter.cpp
@@ -735,10 +735,15 @@
 }
 
 static status_t attachAndQeueuGraphicBuffer(JNIEnv* env, JNIImageWriterContext *ctx,
-        sp<Surface> surface, sp<GraphicBuffer> gb, jlong timestampNs, jint dataSpace,
+        sp<GraphicBuffer> gb, jlong timestampNs, jint dataSpace,
         jint left, jint top, jint right, jint bottom, jint transform, jint scalingMode) {
     status_t res = OK;
     // Step 1. Attach Image
+    sp<Surface> surface = ctx->getProducer();
+    if (surface == nullptr) {
+        jniThrowException(env, "java/lang/IllegalStateException",
+                "Producer surface is null, ImageWriter seems already closed");
+    }
     res = surface->attachBuffer(gb.get());
     if (res != OK) {
         ALOGE("Attach image failed: %s (%d)", strerror(-res), res);
@@ -835,7 +840,6 @@
         return -1;
     }
 
-    sp<Surface> surface = ctx->getProducer();
     if (isFormatOpaque(ctx->getBufferFormat()) != isFormatOpaque(nativeHalFormat)) {
         jniThrowException(env, "java/lang/IllegalStateException",
                 "Trying to attach an opaque image into a non-opaque ImageWriter, or vice versa");
@@ -851,7 +855,7 @@
         return -1;
     }
 
-    return attachAndQeueuGraphicBuffer(env, ctx, surface, buffer->mGraphicBuffer, timestampNs,
+    return attachAndQeueuGraphicBuffer(env, ctx, buffer->mGraphicBuffer, timestampNs,
             dataSpace, left, top, right, bottom, transform, scalingMode);
 }
 
@@ -866,7 +870,6 @@
         return -1;
     }
 
-    sp<Surface> surface = ctx->getProducer();
     if (isFormatOpaque(ctx->getBufferFormat()) != isFormatOpaque(nativeHalFormat)) {
         jniThrowException(env, "java/lang/IllegalStateException",
                 "Trying to attach an opaque image into a non-opaque ImageWriter, or vice versa");
@@ -880,7 +883,8 @@
                 "Trying to attach an invalid graphic buffer");
         return -1;
     }
-    return attachAndQeueuGraphicBuffer(env, ctx, surface, graphicBuffer, timestampNs,
+
+    return attachAndQeueuGraphicBuffer(env, ctx, graphicBuffer, timestampNs,
             dataSpace, left, top, right, bottom, transform, scalingMode);
 }
 
@@ -1025,16 +1029,19 @@
         return;
     }
 
+    // Maintain a StrongPointer so that the GraphicBuffer isn't destroyed when the
+    // StrongPointer in lockImageFromBuffer goes out of scope.
+    sp<GraphicBuffer> bufferSp(buffer);
     // ImageWriter doesn't use crop by itself, app sets it, use the no crop version.
-    const Rect noCrop(buffer->width, buffer->height);
+    const Rect noCrop(bufferSp->width, bufferSp->height);
     status_t res = lockImageFromBuffer(
-            buffer, GRALLOC_USAGE_SW_WRITE_OFTEN, noCrop, fenceFd, image);
+            bufferSp, GRALLOC_USAGE_SW_WRITE_OFTEN, noCrop, fenceFd, image);
     // Clear the fenceFd as it is already consumed by lock call.
     env->SetIntField(thiz, gSurfaceImageClassInfo.mNativeFenceFd, -1);
     if (res != OK) {
         jniThrowExceptionFmt(env, "java/lang/RuntimeException",
                 "lock buffer failed for format 0x%x",
-                buffer->getPixelFormat());
+                bufferSp->getPixelFormat());
         return;
     }
 
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 00b0e57..49e7941 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -686,12 +686,16 @@
     } else if (mediaEvent.scIndexMask.getTag() == DemuxFilterScIndexMask::Tag::scVvc) {
         sc = mediaEvent.scIndexMask.get<DemuxFilterScIndexMask::Tag::scVvc>();
     }
+    jint numDataPieces = mediaEvent.numDataPieces;
+    jint indexInDataGroup = mediaEvent.indexInDataGroup;
+    jint dataGroupId = mediaEvent.dataGroupId;
 
     ScopedLocalRef obj(env, env->NewObject(mMediaEventClass, mMediaEventInitID, streamId,
                                            isPtsPresent, pts, isDtsPresent, dts, dataLength,
                                            offset, nullptr, isSecureMemory, avDataId,
                                            mpuSequenceNumber, isPesPrivateData, sc,
-                                           audioDescriptor.get(), presentationsJObj.get()));
+                                           audioDescriptor.get(), presentationsJObj.get(),
+                                           numDataPieces, indexInDataGroup, dataGroupId));
 
     // Protect mFilterClient from being set to null.
     android::Mutex::Autolock autoLock(mLock);
@@ -1048,7 +1052,7 @@
             "<init>",
             "(IZJZJJJLandroid/media/MediaCodec$LinearBlock;"
             "ZJIZILandroid/media/tv/tuner/filter/AudioDescriptor;"
-            "Ljava/util/List;)V");
+            "Ljava/util/List;III)V");
     mAudioDescriptorInitID = env->GetMethodID(mAudioDescriptorClass, "<init>", "(BBCBBB)V");
     mPesEventInitID = env->GetMethodID(mPesEventClass, "<init>", "(III)V");
     mTsRecordEventInitID = env->GetMethodID(mTsRecordEventClass, "<init>", "(IIIJJI)V");
diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/RoutingSessionInfoTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/RoutingSessionInfoTest.java
index 3955ff0..5f5058d 100644
--- a/media/tests/MediaRouter/src/com/android/mediaroutertest/RoutingSessionInfoTest.java
+++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/RoutingSessionInfoTest.java
@@ -18,8 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import android.content.res.Resources;
-import android.media.MediaRoute2Info;
 import android.media.RoutingSessionInfo;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -95,24 +93,4 @@
         assertThat(sessionInfoWithProviderId2.getTransferableRoutes())
                 .isEqualTo(sessionInfoWithProviderId.getTransferableRoutes());
     }
-
-    @Test
-    public void testGetVolumeHandlingGroupSession() {
-        RoutingSessionInfo sessionInfo = new RoutingSessionInfo.Builder(
-                TEST_ID, TEST_CLIENT_PACKAGE_NAME)
-                .setName(TEST_NAME)
-                .addSelectedRoute(TEST_ROUTE_ID_0)
-                .addSelectedRoute(TEST_ROUTE_ID_2)
-                .setVolumeHandling(MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE)
-                .build();
-
-        boolean volumeAdjustmentForRemoteGroupSessions = Resources.getSystem().getBoolean(
-                com.android.internal.R.bool.config_volumeAdjustmentForRemoteGroupSessions);
-
-        int expectedResult = volumeAdjustmentForRemoteGroupSessions
-                ? MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE :
-                MediaRoute2Info.PLAYBACK_VOLUME_FIXED;
-
-        assertThat(sessionInfo.getVolumeHandling()).isEqualTo(expectedResult);
-    }
 }
diff --git a/native/android/system_fonts.cpp b/native/android/system_fonts.cpp
index 91f78ce..0c07b2a 100644
--- a/native/android/system_fonts.cpp
+++ b/native/android/system_fonts.cpp
@@ -327,7 +327,7 @@
     result->mWeight = font->style().weight();
     result->mItalic = font->style().slant() == minikin::FontStyle::Slant::ITALIC;
     result->mCollectionIndex = minikinFontSkia->GetFontIndex();
-    const std::vector<minikin::FontVariation>& axes = minikinFontSkia->GetAxes();
+    const minikin::VariationSettings& axes = minikinFontSkia->GetAxes();
     result->mAxes.reserve(axes.size());
     for (auto axis : axes) {
         result->mAxes.push_back(std::make_pair(axis.axisTag, axis.value));
diff --git a/nfc/Android.bp b/nfc/Android.bp
index db3dcb0..7ad8c4c 100644
--- a/nfc/Android.bp
+++ b/nfc/Android.bp
@@ -41,6 +41,10 @@
         "framework-permission-s.stubs.module_lib",
         "framework-permission.stubs.module_lib",
     ],
+    stub_only_libs: [
+        // Needed for javadoc references.
+        "framework-permission-s.stubs.module_lib",
+    ],
     static_libs: [
         "android.nfc.flags-aconfig-java",
         "android.permission.flags-aconfig-java",
diff --git a/nfc/api/current.txt b/nfc/api/current.txt
index e7cb76c..96b7c13 100644
--- a/nfc/api/current.txt
+++ b/nfc/api/current.txt
@@ -223,6 +223,7 @@
     field public static final String CATEGORY_PAYMENT = "payment";
     field public static final String EXTRA_CATEGORY = "category";
     field public static final String EXTRA_SERVICE_COMPONENT = "component";
+    field @FlaggedApi("android.nfc.nfc_override_recover_routing_table") public static final int PROTOCOL_AND_TECHNOLOGY_ROUTE_DEFAULT = 3; // 0x3
     field @FlaggedApi("android.nfc.nfc_override_recover_routing_table") public static final int PROTOCOL_AND_TECHNOLOGY_ROUTE_DH = 0; // 0x0
     field @FlaggedApi("android.nfc.nfc_override_recover_routing_table") public static final int PROTOCOL_AND_TECHNOLOGY_ROUTE_ESE = 1; // 0x1
     field @FlaggedApi("android.nfc.nfc_override_recover_routing_table") public static final int PROTOCOL_AND_TECHNOLOGY_ROUTE_UICC = 2; // 0x2
diff --git a/nfc/api/system-current.txt b/nfc/api/system-current.txt
index d17a9b6..4428ade 100644
--- a/nfc/api/system-current.txt
+++ b/nfc/api/system-current.txt
@@ -58,10 +58,19 @@
   @FlaggedApi("android.nfc.nfc_oem_extension") public final class NfcOemExtension {
     method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void clearPreference();
     method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull public java.util.List<java.lang.String> getActiveNfceeList();
+    method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public android.nfc.RoutingStatus getRoutingStatus();
+    method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean hasUserEnabledNfc();
+    method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean isAutoChangeEnabled();
+    method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean isTagPresent();
     method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void maybeTriggerFirmwareUpdate();
+    method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void overwriteRoutingTable(int, int, int);
+    method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void pausePolling(int);
     method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void registerCallback(@NonNull java.util.concurrent.Executor, @NonNull android.nfc.NfcOemExtension.Callback);
+    method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void resumePolling();
+    method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setAutoChangeEnabled(boolean);
     method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.NFC_SET_CONTROLLER_ALWAYS_ON) public void setControllerAlwaysOnMode(int);
     method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void synchronizeScreenState();
+    method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void triggerInitialization();
     method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void unregisterCallback(@NonNull android.nfc.NfcOemExtension.Callback);
     field @FlaggedApi("android.nfc.nfc_oem_extension") public static final int DISABLE = 0; // 0x0
     field @FlaggedApi("android.nfc.nfc_oem_extension") public static final int ENABLE_DEFAULT = 1; // 0x1
@@ -85,7 +94,11 @@
     method public void onEnable(@NonNull java.util.function.Consumer<java.lang.Boolean>);
     method public void onEnableFinished(int);
     method public void onEnableStarted();
+    method public void onGetOemAppSearchIntent(@NonNull java.util.List<java.lang.String>, @NonNull java.util.function.Consumer<android.content.Intent>);
     method public void onHceEventReceived(int);
+    method public void onLaunchHceAppChooserActivity(@NonNull String, @NonNull java.util.List<android.nfc.cardemulation.ApduServiceInfo>, @NonNull android.content.ComponentName, @NonNull String);
+    method public void onLaunchHceTapAgainDialog(@NonNull android.nfc.cardemulation.ApduServiceInfo, @NonNull String);
+    method public void onNdefMessage(@NonNull android.nfc.Tag, @NonNull android.nfc.NdefMessage, @NonNull java.util.function.Consumer<java.lang.Boolean>);
     method public void onNdefRead(@NonNull java.util.function.Consumer<java.lang.Boolean>);
     method public void onReaderOptionChanged(boolean);
     method public void onRfDiscoveryStarted(boolean);
@@ -96,6 +109,12 @@
     method public void onTagDispatch(@NonNull java.util.function.Consumer<java.lang.Boolean>);
   }
 
+  @FlaggedApi("android.nfc.nfc_oem_extension") public class RoutingStatus {
+    method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public int getDefaultIsoDepRoute();
+    method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public int getDefaultOffHostRoute();
+    method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public int getDefaultRoute();
+  }
+
 }
 
 package android.nfc.cardemulation {
diff --git a/nfc/java/android/nfc/INfcAdapter.aidl b/nfc/java/android/nfc/INfcAdapter.aidl
index 246efc7..a166b28 100644
--- a/nfc/java/android/nfc/INfcAdapter.aidl
+++ b/nfc/java/android/nfc/INfcAdapter.aidl
@@ -114,4 +114,7 @@
     void setScreenState();
     void checkFirmware();
     List<String> fetchActiveNfceeList();
+    void triggerInitialization();
+    boolean getSettingStatus();
+    boolean isTagPresent();
 }
diff --git a/nfc/java/android/nfc/INfcCardEmulation.aidl b/nfc/java/android/nfc/INfcCardEmulation.aidl
index 19b9e0f..1eae3c6 100644
--- a/nfc/java/android/nfc/INfcCardEmulation.aidl
+++ b/nfc/java/android/nfc/INfcCardEmulation.aidl
@@ -51,4 +51,8 @@
     void overrideRoutingTable(int userHandle, String protocol, String technology, in String pkg);
     void recoverRoutingTable(int userHandle);
     boolean isEuiccSupported();
+    void setAutoChangeStatus(boolean state);
+    boolean isAutoChangeEnabled();
+    List<String> getRoutingStatus();
+    void overwriteRoutingTable(int userHandle, String emptyAid, String protocol, String tech);
 }
diff --git a/nfc/java/android/nfc/INfcOemExtensionCallback.aidl b/nfc/java/android/nfc/INfcOemExtensionCallback.aidl
index e49ef7e..48c7ee6 100644
--- a/nfc/java/android/nfc/INfcOemExtensionCallback.aidl
+++ b/nfc/java/android/nfc/INfcOemExtensionCallback.aidl
@@ -15,9 +15,14 @@
  */
 package android.nfc;
 
+import android.content.ComponentName;
+import android.nfc.cardemulation.ApduServiceInfo;
+import android.nfc.NdefMessage;
 import android.nfc.Tag;
 import android.os.ResultReceiver;
 
+import java.util.List;
+
 /**
  * @hide
  */
@@ -41,4 +46,8 @@
    void onCardEmulationActivated(boolean isActivated);
    void onRfFieldActivated(boolean isActivated);
    void onRfDiscoveryStarted(boolean isDiscoveryStarted);
+   void onGetOemAppSearchIntent(in List<String> firstPackage, in ResultReceiver intentConsumer);
+   void onNdefMessage(in Tag tag, in NdefMessage message, in ResultReceiver hasOemExecutableContent);
+   void onLaunchHceAppChooserActivity(in String selectedAid, in List<ApduServiceInfo> services, in ComponentName failedComponent, in String category);
+   void onLaunchHceTapAgainActivity(in ApduServiceInfo service, in String category);
 }
diff --git a/nfc/java/android/nfc/NfcOemExtension.java b/nfc/java/android/nfc/NfcOemExtension.java
index 011c60b..fb63b5c 100644
--- a/nfc/java/android/nfc/NfcOemExtension.java
+++ b/nfc/java/android/nfc/NfcOemExtension.java
@@ -16,6 +16,12 @@
 
 package android.nfc;
 
+import static android.nfc.cardemulation.CardEmulation.PROTOCOL_AND_TECHNOLOGY_ROUTE_DH;
+import static android.nfc.cardemulation.CardEmulation.PROTOCOL_AND_TECHNOLOGY_ROUTE_ESE;
+import static android.nfc.cardemulation.CardEmulation.PROTOCOL_AND_TECHNOLOGY_ROUTE_UICC;
+import static android.nfc.cardemulation.CardEmulation.routeIntToString;
+
+import android.Manifest;
 import android.annotation.CallbackExecutor;
 import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
@@ -23,8 +29,14 @@
 import android.annotation.RequiresPermission;
 import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
+import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
+import android.nfc.cardemulation.ApduServiceInfo;
+import android.nfc.cardemulation.CardEmulation;
+import android.nfc.cardemulation.CardEmulation.ProtocolAndTechnologyRoute;
 import android.os.Binder;
+import android.os.Bundle;
 import android.os.RemoteException;
 import android.os.ResultReceiver;
 import android.util.Log;
@@ -306,6 +318,60 @@
         * @param isDiscoveryStarted true, if RF discovery started, else RF state is Idle.
         */
         void onRfDiscoveryStarted(boolean isDiscoveryStarted);
+
+        /**
+         * Gets the intent to find the OEM package in the OEM App market. If the consumer returns
+         * {@code null} or a timeout occurs, the intent from the first available package will be
+         * used instead.
+         *
+         * @param packages the OEM packages name stored in the tag
+         * @param intentConsumer The {@link Consumer} to be completed.
+         *                       The {@link Consumer#accept(Object)} should be called with
+         *                       the Intent required.
+         *
+         */
+        void onGetOemAppSearchIntent(@NonNull List<String> packages,
+                                     @NonNull Consumer<Intent> intentConsumer);
+
+        /**
+         * Checks if the NDEF message contains any specific OEM package executable content
+         *
+         * @param tag        the {@link android.nfc.Tag Tag}
+         * @param message NDEF Message to read from tag
+         * @param hasOemExecutableContent The {@link Consumer} to be completed. If there is
+         *                                OEM package executable content, the
+         *                                {@link Consumer#accept(Object)} should be called with
+         *                                {@link Boolean#TRUE}, otherwise call with
+         *                                {@link Boolean#FALSE}.
+         */
+        void onNdefMessage(@NonNull Tag tag, @NonNull NdefMessage message,
+                           @NonNull Consumer<Boolean> hasOemExecutableContent);
+
+        /**
+         * Callback to indicate the app chooser activity should be launched for handling CE
+         * transaction. This is invoked for example when there are more than 1 app installed that
+         * can handle the HCE transaction. OEMs can launch the Activity based
+         * on their requirement.
+         *
+         * @param selectedAid the selected AID from APDU
+         * @param services {@link ApduServiceInfo} of the service triggering the activity
+         * @param failedComponent the component failed to be resolved
+         * @param category the category of the service
+         */
+        void onLaunchHceAppChooserActivity(@NonNull String selectedAid,
+                                           @NonNull List<ApduServiceInfo> services,
+                                           @NonNull ComponentName failedComponent,
+                                           @NonNull String category);
+
+        /**
+         * Callback to indicate tap again dialog should be launched for handling HCE transaction.
+         * This is invoked for example when a CE service needs the device to unlocked before
+         * handling the transaction. OEMs can launch the Activity based on their requirement.
+         *
+         * @param service {@link ApduServiceInfo} of the service triggering the dialog
+         * @param category the category of the service
+         */
+        void onLaunchHceTapAgainDialog(@NonNull ApduServiceInfo service, @NonNull String category);
     }
 
 
@@ -471,6 +537,137 @@
         NfcAdapter.callService(() -> NfcAdapter.sService.setControllerAlwaysOn(mode));
     }
 
+    /**
+     * Triggers NFC initialization. If OEM extension is registered
+     * (indicated via `enable_oem_extension` NFC overlay), the NFC stack initialization at bootup
+     * is delayed until the OEM extension app triggers the initialization via this call.
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+    public void triggerInitialization() {
+        NfcAdapter.callService(() -> NfcAdapter.sService.triggerInitialization());
+    }
+
+    /**
+     * Gets the last user toggle status.
+     * @return true if NFC is set to ON, false otherwise
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+    public boolean hasUserEnabledNfc() {
+        return NfcAdapter.callServiceReturn(() -> NfcAdapter.sService.getSettingStatus(), false);
+    }
+
+    /**
+     * Checks if the tag is present or not.
+     * @return true if the tag is present, false otherwise
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+    public boolean isTagPresent() {
+        return NfcAdapter.callServiceReturn(() -> NfcAdapter.sService.isTagPresent(), false);
+    }
+
+    /**
+     * Pauses NFC tag reader mode polling for a {@code timeoutInMs} millisecond. If polling must be
+     * resumed before timeout, use {@link #resumePolling()}.
+     * @param timeoutInMs the pause polling duration in millisecond
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+    public void pausePolling(int timeoutInMs) {
+        NfcAdapter.callService(() -> NfcAdapter.sService.pausePolling(timeoutInMs));
+    }
+
+    /**
+     * Resumes default NFC tag reader mode polling for the current device state if polling is
+     * paused. Calling this while polling is not paused is a no-op.
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+    public void resumePolling() {
+        NfcAdapter.callService(() -> NfcAdapter.sService.resumePolling());
+    }
+
+    /**
+     * Set whether to enable auto routing change or not (enabled by default).
+     * If disabled, routing targets are limited to a single off-host destination.
+     *
+     * @param state status of auto routing change, true if enable, otherwise false
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS)
+    public void setAutoChangeEnabled(boolean state) {
+        NfcAdapter.callService(() ->
+                NfcAdapter.sCardEmulationService.setAutoChangeStatus(state));
+    }
+
+    /**
+     * Check if auto routing change is enabled or not.
+     *
+     * @return true if enabled, otherwise false
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS)
+    public boolean isAutoChangeEnabled() {
+        return NfcAdapter.callServiceReturn(() ->
+                NfcAdapter.sCardEmulationService.isAutoChangeEnabled(), false);
+    }
+
+    /**
+     * Get current routing status
+     *
+     * @return {@link RoutingStatus} indicating the default route, default ISO-DEP
+     * route and default off-host route.
+     */
+    @NonNull
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS)
+    public RoutingStatus getRoutingStatus() {
+        List<String> status = NfcAdapter.callServiceReturn(() ->
+                NfcAdapter.sCardEmulationService.getRoutingStatus(), new ArrayList<>());
+        return new RoutingStatus(routeStringToInt(status.get(0)),
+                routeStringToInt(status.get(1)),
+                routeStringToInt(status.get(2)));
+    }
+
+    /**
+     * Overwrites NFC controller routing table, which includes Protocol Route, Technology Route,
+     * and Empty AID Route.
+     *
+     * The parameter set to
+     * {@link ProtocolAndTechnologyRoute#PROTOCOL_AND_TECHNOLOGY_ROUTE_UNSET}
+     * can be used to keep current values for that entry. At least one route should be overridden
+     * when calling this API, otherwise throw {@link IllegalArgumentException}.
+     *
+     * @param protocol ISO-DEP route destination, where the possible inputs are defined in
+     *                 {@link ProtocolAndTechnologyRoute}.
+     * @param technology Tech-A, Tech-B and Tech-F route destination, where the possible inputs
+     *                   are defined in
+     *                   {@link ProtocolAndTechnologyRoute}
+     * @param emptyAid Zero-length AID route destination, where the possible inputs are defined in
+     *                 {@link ProtocolAndTechnologyRoute}
+     */
+    @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS)
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    public void overwriteRoutingTable(
+            @CardEmulation.ProtocolAndTechnologyRoute int protocol,
+            @CardEmulation.ProtocolAndTechnologyRoute int technology,
+            @CardEmulation.ProtocolAndTechnologyRoute int emptyAid) {
+
+        String protocolRoute = routeIntToString(protocol);
+        String technologyRoute = routeIntToString(technology);
+        String emptyAidRoute = routeIntToString(emptyAid);
+
+        NfcAdapter.callService(() ->
+                NfcAdapter.sCardEmulationService.overwriteRoutingTable(
+                        mContext.getUser().getIdentifier(),
+                        emptyAidRoute,
+                        protocolRoute,
+                        technologyRoute
+                ));
+    }
+
     private final class NfcOemExtensionCallback extends INfcOemExtensionCallback.Stub {
 
         @Override
@@ -510,25 +707,25 @@
         public void onApplyRouting(ResultReceiver isSkipped) throws RemoteException {
             mCallbackMap.forEach((cb, ex) ->
                     handleVoidCallback(
-                        new ReceiverWrapper(isSkipped), cb::onApplyRouting, ex));
+                        new ReceiverWrapper<>(isSkipped), cb::onApplyRouting, ex));
         }
         @Override
         public void onNdefRead(ResultReceiver isSkipped) throws RemoteException {
             mCallbackMap.forEach((cb, ex) ->
                     handleVoidCallback(
-                        new ReceiverWrapper(isSkipped), cb::onNdefRead, ex));
+                        new ReceiverWrapper<>(isSkipped), cb::onNdefRead, ex));
         }
         @Override
         public void onEnable(ResultReceiver isAllowed) throws RemoteException {
             mCallbackMap.forEach((cb, ex) ->
                     handleVoidCallback(
-                        new ReceiverWrapper(isAllowed), cb::onEnable, ex));
+                        new ReceiverWrapper<>(isAllowed), cb::onEnable, ex));
         }
         @Override
         public void onDisable(ResultReceiver isAllowed) throws RemoteException {
             mCallbackMap.forEach((cb, ex) ->
                     handleVoidCallback(
-                        new ReceiverWrapper(isAllowed), cb::onDisable, ex));
+                        new ReceiverWrapper<>(isAllowed), cb::onDisable, ex));
         }
         @Override
         public void onBootStarted() throws RemoteException {
@@ -564,7 +761,7 @@
         public void onTagDispatch(ResultReceiver isSkipped) throws RemoteException {
             mCallbackMap.forEach((cb, ex) ->
                     handleVoidCallback(
-                        new ReceiverWrapper(isSkipped), cb::onTagDispatch, ex));
+                        new ReceiverWrapper<>(isSkipped), cb::onTagDispatch, ex));
         }
         @Override
         public void onRoutingChanged() throws RemoteException {
@@ -583,6 +780,59 @@
                     handleVoidCallback(enabled, cb::onReaderOptionChanged, ex));
         }
 
+        @Override
+        public void onGetOemAppSearchIntent(List<String> packages, ResultReceiver intentConsumer)
+                throws RemoteException {
+            mCallbackMap.forEach((cb, ex) ->
+                    handleVoid2ArgCallback(packages, new ReceiverWrapper<>(intentConsumer),
+                            cb::onGetOemAppSearchIntent, ex));
+        }
+
+        @Override
+        public void onNdefMessage(Tag tag, NdefMessage message,
+                                  ResultReceiver hasOemExecutableContent) throws RemoteException {
+            mCallbackMap.forEach((cb, ex) -> {
+                synchronized (mLock) {
+                    final long identity = Binder.clearCallingIdentity();
+                    try {
+                        ex.execute(() -> cb.onNdefMessage(
+                                tag, message, new ReceiverWrapper<>(hasOemExecutableContent)));
+                    } catch (RuntimeException exception) {
+                        throw exception;
+                    } finally {
+                        Binder.restoreCallingIdentity(identity);
+                    }
+                }
+            });
+        }
+
+        @Override
+        public void onLaunchHceAppChooserActivity(String selectedAid,
+                                                  List<ApduServiceInfo> services,
+                                                  ComponentName failedComponent, String category)
+                throws RemoteException {
+            mCallbackMap.forEach((cb, ex) -> {
+                synchronized (mLock) {
+                    final long identity = Binder.clearCallingIdentity();
+                    try {
+                        ex.execute(() -> cb.onLaunchHceAppChooserActivity(
+                                selectedAid, services, failedComponent, category));
+                    } catch (RuntimeException exception) {
+                        throw exception;
+                    } finally {
+                        Binder.restoreCallingIdentity(identity);
+                    }
+                }
+            });
+        }
+
+        @Override
+        public void onLaunchHceTapAgainActivity(ApduServiceInfo service, String category)
+                throws RemoteException {
+            mCallbackMap.forEach((cb, ex) ->
+                    handleVoid2ArgCallback(service, category, cb::onLaunchHceTapAgainDialog, ex));
+        }
+
         private <T> void handleVoidCallback(
                 T input, Consumer<T> callbackMethod, Executor executor) {
             synchronized (mLock) {
@@ -666,7 +916,16 @@
         }
     }
 
-    private class ReceiverWrapper implements Consumer<Boolean> {
+    private @CardEmulation.ProtocolAndTechnologyRoute int routeStringToInt(String route) {
+        return switch (route) {
+            case "DH" -> PROTOCOL_AND_TECHNOLOGY_ROUTE_DH;
+            case "eSE" -> PROTOCOL_AND_TECHNOLOGY_ROUTE_ESE;
+            case "SIM" -> PROTOCOL_AND_TECHNOLOGY_ROUTE_UICC;
+            default -> throw new IllegalStateException("Unexpected value: " + route);
+        };
+    }
+
+    private class ReceiverWrapper<T> implements Consumer<T> {
         private final ResultReceiver mResultReceiver;
 
         ReceiverWrapper(ResultReceiver resultReceiver) {
@@ -674,12 +933,19 @@
         }
 
         @Override
-        public void accept(Boolean result) {
-            mResultReceiver.send(result ? 1 : 0, null);
+        public void accept(T result) {
+            if (result instanceof Boolean) {
+                mResultReceiver.send((Boolean) result ? 1 : 0, null);
+            } else if (result instanceof Intent) {
+                Bundle bundle = new Bundle();
+                bundle.putParcelable("intent", (Intent) result);
+                mResultReceiver.send(0, bundle);
+            }
+
         }
 
         @Override
-        public Consumer<Boolean> andThen(Consumer<? super Boolean> after) {
+        public Consumer<T> andThen(Consumer<? super T> after) {
             return Consumer.super.andThen(after);
         }
     }
diff --git a/nfc/java/android/nfc/RoutingStatus.java b/nfc/java/android/nfc/RoutingStatus.java
new file mode 100644
index 0000000..4a1b1f3
--- /dev/null
+++ b/nfc/java/android/nfc/RoutingStatus.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2024 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 android.nfc;
+
+import android.annotation.FlaggedApi;
+import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
+import android.nfc.cardemulation.CardEmulation;
+
+/**
+ * A class indicating default route, ISO-DEP route and off-host route.
+ *
+ * @hide
+ */
+@SystemApi
+@FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+public class RoutingStatus {
+    private final @CardEmulation.ProtocolAndTechnologyRoute int mDefaultRoute;
+    private final @CardEmulation.ProtocolAndTechnologyRoute int mDefaultIsoDepRoute;
+    private final @CardEmulation.ProtocolAndTechnologyRoute int mDefaultOffHostRoute;
+
+    RoutingStatus(@CardEmulation.ProtocolAndTechnologyRoute int mDefaultRoute,
+                  @CardEmulation.ProtocolAndTechnologyRoute int mDefaultIsoDepRoute,
+                  @CardEmulation.ProtocolAndTechnologyRoute int mDefaultOffHostRoute) {
+        this.mDefaultRoute = mDefaultRoute;
+        this.mDefaultIsoDepRoute = mDefaultIsoDepRoute;
+        this.mDefaultOffHostRoute = mDefaultOffHostRoute;
+    }
+
+    /**
+     * Getter of the default route.
+     * @return an integer defined in
+     * {@link android.nfc.cardemulation.CardEmulation.ProtocolAndTechnologyRoute}
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+    @CardEmulation.ProtocolAndTechnologyRoute
+    public int getDefaultRoute() {
+        return mDefaultRoute;
+    }
+
+    /**
+     * Getter of the default ISO-DEP route.
+     * @return an integer defined in
+     * {@link android.nfc.cardemulation.CardEmulation.ProtocolAndTechnologyRoute}
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+    @CardEmulation.ProtocolAndTechnologyRoute
+    public int getDefaultIsoDepRoute() {
+        return mDefaultIsoDepRoute;
+    }
+
+    /**
+     * Getter of the default off-host route.
+     * @return an integer defined in
+     * {@link android.nfc.cardemulation.CardEmulation.ProtocolAndTechnologyRoute}
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+    @CardEmulation.ProtocolAndTechnologyRoute
+    public int getDefaultOffHostRoute() {
+        return mDefaultOffHostRoute;
+    }
+
+}
diff --git a/nfc/java/android/nfc/cardemulation/CardEmulation.java b/nfc/java/android/nfc/cardemulation/CardEmulation.java
index 4be082c..d8f04c5 100644
--- a/nfc/java/android/nfc/cardemulation/CardEmulation.java
+++ b/nfc/java/android/nfc/cardemulation/CardEmulation.java
@@ -168,6 +168,12 @@
     public static final int PROTOCOL_AND_TECHNOLOGY_ROUTE_UICC = 2;
 
     /**
+     * Route to the default value in config file.
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OVERRIDE_RECOVER_ROUTING_TABLE)
+    public static final int PROTOCOL_AND_TECHNOLOGY_ROUTE_DEFAULT = 3;
+
+    /**
      * Route unset.
      */
     @FlaggedApi(Flags.FLAG_NFC_OVERRIDE_RECOVER_ROUTING_TABLE)
@@ -895,45 +901,47 @@
                     PROTOCOL_AND_TECHNOLOGY_ROUTE_DH,
                     PROTOCOL_AND_TECHNOLOGY_ROUTE_ESE,
                     PROTOCOL_AND_TECHNOLOGY_ROUTE_UICC,
-                    PROTOCOL_AND_TECHNOLOGY_ROUTE_UNSET
+                    PROTOCOL_AND_TECHNOLOGY_ROUTE_UNSET,
+                    PROTOCOL_AND_TECHNOLOGY_ROUTE_DEFAULT
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ProtocolAndTechnologyRoute {}
 
-     /**
-      * Setting NFC controller routing table, which includes Protocol Route and Technology Route,
-      * while this Activity is in the foreground.
-      *
-      * The parameter set to {@link #PROTOCOL_AND_TECHNOLOGY_ROUTE_UNSET}
-      * can be used to keep current values for that entry. Either
-      * Protocol Route or Technology Route should be override when calling this API, otherwise
-      * throw {@link IllegalArgumentException}.
-      * <p>
-      * Example usage in an Activity that requires to set proto route to "ESE" and keep tech route:
-      * <pre>
-      * protected void onResume() {
-      *     mNfcAdapter.overrideRoutingTable(
-      *         this, {@link #PROTOCOL_AND_TECHNOLOGY_ROUTE_ESE}, null);
-      * }</pre>
-      * </p>
-      * Also activities must call {@link #recoverRoutingTable(Activity)}
-      * when it goes to the background. Only the package of the
-      * currently preferred service (the service set as preferred by the current foreground
-      * application via {@link CardEmulation#setPreferredService(Activity, ComponentName)} or the
-      * current Default Wallet Role Holder {@link RoleManager#ROLE_WALLET}),
-      * otherwise a call to this method will fail and throw {@link SecurityException}.
-      * @param activity The Activity that requests NFC controller routing table to be changed.
-      * @param protocol ISO-DEP route destination, where the possible inputs are defined
-      *                 in {@link ProtocolAndTechnologyRoute}.
-      * @param technology Tech-A, Tech-B and Tech-F route destination, where the possible inputs
-      *                   are defined in {@link ProtocolAndTechnologyRoute}
-      * @throws SecurityException if the caller is not the preferred NFC service
-      * @throws IllegalArgumentException if the activity is not resumed or the caller is not in the
-      * foreground.
-      * <p>
-      * This is a high risk API and only included to support mainline effort
-      * @hide
-      */
+    /**
+     * Setting NFC controller routing table, which includes Protocol Route and Technology Route,
+     * while this Activity is in the foreground.
+     *
+     * The parameter set to {@link #PROTOCOL_AND_TECHNOLOGY_ROUTE_UNSET}
+     * can be used to keep current values for that entry. Either
+     * Protocol Route or Technology Route should be override when calling this API, otherwise
+     * throw {@link IllegalArgumentException}.
+     * <p>
+     * Example usage in an Activity that requires to set proto route to "ESE" and keep tech route:
+     * <pre>
+     * protected void onResume() {
+     *     mNfcAdapter.overrideRoutingTable(
+     *         this, {@link #PROTOCOL_AND_TECHNOLOGY_ROUTE_ESE},
+     *         {@link #PROTOCOL_AND_TECHNOLOGY_ROUTE_UNSET});
+     * }</pre>
+     * </p>
+     * Also activities must call {@link #recoverRoutingTable(Activity)}
+     * when it goes to the background. Only the package of the
+     * currently preferred service (the service set as preferred by the current foreground
+     * application via {@link CardEmulation#setPreferredService(Activity, ComponentName)} or the
+     * current Default Wallet Role Holder {@link RoleManager#ROLE_WALLET}),
+     * otherwise a call to this method will fail and throw {@link SecurityException}.
+     * @param activity The Activity that requests NFC controller routing table to be changed.
+     * @param protocol ISO-DEP route destination, where the possible inputs are defined
+     *                 in {@link ProtocolAndTechnologyRoute}.
+     * @param technology Tech-A, Tech-B and Tech-F route destination, where the possible inputs
+     *                   are defined in {@link ProtocolAndTechnologyRoute}
+     * @throws SecurityException if the caller is not the preferred NFC service
+     * @throws IllegalArgumentException if the activity is not resumed or the caller is not in the
+     * foreground.
+     * <p>
+     * This is a high risk API and only included to support mainline effort
+     * @hide
+     */
     @SystemApi
     @FlaggedApi(Flags.FLAG_NFC_OVERRIDE_RECOVER_ROUTING_TABLE)
     public void overrideRoutingTable(
@@ -942,26 +950,14 @@
         if (!activity.isResumed()) {
             throw new IllegalArgumentException("Activity must be resumed.");
         }
-        String protocolRoute = switch (protocol) {
-            case PROTOCOL_AND_TECHNOLOGY_ROUTE_DH -> "DH";
-            case PROTOCOL_AND_TECHNOLOGY_ROUTE_ESE -> "ESE";
-            case PROTOCOL_AND_TECHNOLOGY_ROUTE_UICC -> "UICC";
-            case PROTOCOL_AND_TECHNOLOGY_ROUTE_UNSET -> null;
-            default -> throw new IllegalStateException("Unexpected value: " + protocol);
-        };
-        String technologyRoute = switch (technology) {
-            case PROTOCOL_AND_TECHNOLOGY_ROUTE_DH -> "DH";
-            case PROTOCOL_AND_TECHNOLOGY_ROUTE_ESE -> "ESE";
-            case PROTOCOL_AND_TECHNOLOGY_ROUTE_UICC -> "UICC";
-            case PROTOCOL_AND_TECHNOLOGY_ROUTE_UNSET -> null;
-            default -> throw new IllegalStateException("Unexpected value: " + protocol);
-        };
+        String protocolRoute = routeIntToString(protocol);
+        String technologyRoute = routeIntToString(technology);
         callService(() ->
                 sService.overrideRoutingTable(
-                    mContext.getUser().getIdentifier(),
-                    protocolRoute,
-                    technologyRoute,
-                    mContext.getPackageName()));
+                        mContext.getUser().getIdentifier(),
+                        protocolRoute,
+                        technologyRoute,
+                        mContext.getPackageName()));
     }
 
     /**
@@ -1068,4 +1064,16 @@
         }
         return defaultReturn;
     }
+
+    /** @hide */
+    public static String routeIntToString(@ProtocolAndTechnologyRoute int route) {
+        return switch (route) {
+            case PROTOCOL_AND_TECHNOLOGY_ROUTE_DH -> "DH";
+            case PROTOCOL_AND_TECHNOLOGY_ROUTE_ESE -> "eSE";
+            case PROTOCOL_AND_TECHNOLOGY_ROUTE_UICC -> "SIM";
+            case PROTOCOL_AND_TECHNOLOGY_ROUTE_UNSET -> null;
+            case PROTOCOL_AND_TECHNOLOGY_ROUTE_DEFAULT -> "default";
+            default -> throw new IllegalStateException("Unexpected value: " + route);
+        };
+    }
 }
diff --git a/nfc/java/android/nfc/flags.aconfig b/nfc/java/android/nfc/flags.aconfig
index cc9a97c..6a7e693 100644
--- a/nfc/java/android/nfc/flags.aconfig
+++ b/nfc/java/android/nfc/flags.aconfig
@@ -157,3 +157,11 @@
     description: "Enable EUICC card emulation"
     bug: "321314635"
 }
+
+flag {
+    name: "nfc_state_change_security_log_event_enabled"
+    is_exported: true
+    namespace: "nfc"
+    description: "Enabling security log for nfc state change"
+    bug: "319934052"
+}
diff --git a/packages/CompanionDeviceManager/res/values-af/strings.xml b/packages/CompanionDeviceManager/res/values-af/strings.xml
index 798e7d5..6a241b7 100644
--- a/packages/CompanionDeviceManager/res/values-af/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-af/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Laat &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toe om &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; te bestuur?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"toestel"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Hierdie app sal toegang tot hierdie toestemmings op jou <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> hê"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Gee &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toestemming om jou <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> se apps na &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&amp;gt te stroom?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> sal toegang hê tot enigiets wat sigbaar is of gespeel word op die <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, insluitend oudio, foto’s, wagwoorde en boodskappe.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> sal apps na <xliff:g id="DEVICE_NAME">%3$s</xliff:g> kan stroom totdat jy toegang tot hierdie toestemming verwyder."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> versoek toestemming namens jou <xliff:g id="DEVICE_NAME">%2$s</xliff:g> om apps tussen jou toestelle te vertoon en te stroom"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Gee &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toegang tot hierdie inligting op jou <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> versoek tans namens jou <xliff:g id="DEVICE_NAME">%2$s</xliff:g> toegang tot jou <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> se foto’s, media en kennisgewings"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Gee &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; toestemming om jou <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> se apps en stelselkenmerke na &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; te stroom?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> sal toegang hê tot enigiets wat sigbaar is of gespeel word op jou <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, insluitend oudio, foto’s, betaalinligting, wagwoorde en boodskappe.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> sal apps en stelselkenmerke na <xliff:g id="DEVICE_NAME">%3$s</xliff:g> kan stroom totdat jy toegang tot hierdie toestemming verwyder."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> versoek tans namens jou <xliff:g id="DEVICE_NAME">%2$s</xliff:g> toestemming om apps en ander stelselkenmerke tussen jou toestelle te stroom"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"toestel"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Hierdie app sal inligting kan sinkroniseer, soos die naam van iemand wat bel, tussen jou foon en die gekose toestel"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Laat toe"</string>
diff --git a/packages/CompanionDeviceManager/res/values-am/strings.xml b/packages/CompanionDeviceManager/res/values-am/strings.xml
index 59e1f03..a9f5ed2 100644
--- a/packages/CompanionDeviceManager/res/values-am/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-am/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;ን እንዲያስተዳድር ይፈቅዳሉ?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"መሣሪያ"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"ይህ መተግበሪያ በእርስዎ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> ላይ እነዚህን ፈቃዶች እንዲደርስ ይፈቀድለታል"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; የእርስዎን <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> መተግበሪያዎች ወደ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;? በዥረት እንዲለቅ ይፍቀዱ"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ኦዲዮ፣ ፎቶዎች፣ የይለፍ ቃላት እና መልዕክቶችን ጨምሮ በ<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ላይ የሚታየውን ወይም የሚጫወተውን ማንኛውንም ነገር መዳረሻ ይኖረዋል።&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> የዚህን መዳረሻ እስኪያስወግዱ ድረስ መተግበሪያዎችን ወደ <xliff:g id="DEVICE_NAME">%3$s</xliff:g> በዥረት መልቀቅ ይችላል።"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> የእርስዎን <xliff:g id="DEVICE_NAME">%2$s</xliff:g> በመወከል በመሣሪያዎችዎ መካከል ለማሳየት እና መተግበሪያዎችን በዥረት ለመልቀቅ ፈቃድ እየጠየቀ ነው"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ይህን መረጃ ከእርስዎ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> እንዲደርስ ይፍቀዱ"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> የእርስዎን <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> ፎቶዎች፣ ሚዲያ እና ማሳወቂያዎች ለመድረስ የእርስዎን <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ወክሎ ፈቃድ እየጠየቀ ነው"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; የእርስዎን <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> መተግበሪያዎች እና የሥርዓት ባህሪያት ወደ &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;? በዥረት እንዲለቅ ይፍቀዱ"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ኦዲዮ፣ ፎቶዎች፣ የክፍያ መረጃ፣ የይለፍ ቃላት እና መልዕክቶችን ጨምሮ በእርስዎ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ላይ የሚታየውን ወይም የሚጫወተውን የማንኛውም ነገር መዳረሻ ይኖረዋል።&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> የዚህን መዳረሻ እስኪያስወግዱ ድረስ መተግበሪያዎችን እና የሥርዓት ባህሪያትን ወደ <xliff:g id="DEVICE_NAME">%3$s</xliff:g> በዥረት መልቀቅ ይችላል።"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> የእርስዎን <xliff:g id="DEVICE_NAME">%2$s</xliff:g> በመወከል በመሣሪያዎችዎ መካከል መተግበሪያዎችን እና ሌሎች የሥርዓት ባህሪያትን በዥረት ለመልቀቅ ፈቃድ እየጠየቀ ነው"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"መሣሪያ"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ይህ መተግበሪያ እንደ የሚደውል ሰው ስም ያለ መረጃን በስልክዎ እና በተመረጠው መሣሪያ መካከል ማስመር ይችላል"</string>
     <string name="consent_yes" msgid="8344487259618762872">"ፍቀድ"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ar/strings.xml b/packages/CompanionDeviceManager/res/values-ar/strings.xml
index 89c7efb..ce68ee1 100644
--- a/packages/CompanionDeviceManager/res/values-ar/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ar/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"‏هل تريد السماح لتطبيق &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; بإدارة &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;؟"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"جهاز"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"سيتم السماح لهذا التطبيق باستخدام هذه الأذونات على <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"‏هل تريد السماح لتطبيق &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ببث التطبيقات من <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> إلى <xliff:g id="DEVICE_NAME">%3$s</xliff:g>؟"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"‏سيتمكّن \"<xliff:g id="APP_NAME_0">%1$s</xliff:g>\" من الوصول إلى كل المحتوى المعروض أو الذي يتم تشغيله على <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>، بما في ذلك الملفات الصوتية والصور وكلمات المرور والرسائل.&lt;br/&gt;&lt;br/&gt;سيتمكّن \"<xliff:g id="APP_NAME_1">%1$s</xliff:g>\" من بث التطبيقات إلى <xliff:g id="DEVICE_NAME">%3$s</xliff:g> إلى أن توقف إمكانية استخدام هذا الإذن."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"يطلب \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الحصول على إذن نيابةً عن <xliff:g id="DEVICE_NAME">%2$s</xliff:g> لعرض التطبيقات وبثها بين أجهزتك"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"‏هل تريد السماح لتطبيق &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; بالوصول إلى هذه المعلومات من <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>؟"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"يطلب \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الحصول على إذن نيابةً عن <xliff:g id="DEVICE_NAME">%2$s</xliff:g> للوصول إلى الصور والوسائط والإشعارات في <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"هل تريد السماح لجهاز <xliff:g id="DEVICE_NAME_0">%1$s</xliff:g> ببث التطبيقات وميزات النظام من <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> إلى <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>؟"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"‏سيتمكّن \"<xliff:g id="APP_NAME_0">%1$s</xliff:g>\" من الوصول إلى كل المحتوى المعروض أو الذي يتم تشغيله على <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>، بما في ذلك الملفات الصوتية والصور ومعلومات الدفع وكلمات المرور والرسائل.&lt;br/&gt;&lt;br/&gt;سيتمكّن \"<xliff:g id="APP_NAME_1">%1$s</xliff:g>\" من بث التطبيقات وميزات النظام إلى <xliff:g id="DEVICE_NAME">%3$s</xliff:g> إلى أن توقف إمكانية استخدام هذا الإذن."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"يطلب \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الحصول على إذن نيابةً عن <xliff:g id="DEVICE_NAME">%2$s</xliff:g> لبثّ التطبيقات وميزات النظام الأخرى بين أجهزتك"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"جهاز"</string>
     <string name="summary_generic" msgid="1761976003668044801">"سيتمكّن هذا التطبيق من مزامنة المعلومات، مثل اسم المتصل، بين هاتفك والجهاز المحدّد."</string>
     <string name="consent_yes" msgid="8344487259618762872">"السماح"</string>
diff --git a/packages/CompanionDeviceManager/res/values-as/strings.xml b/packages/CompanionDeviceManager/res/values-as/strings.xml
index 3d252ca..7376cd06 100644
--- a/packages/CompanionDeviceManager/res/values-as/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-as/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ক &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; পৰিচালনা কৰিবলৈ দিবনে?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"ডিভাইচ"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"এই এপ্‌টোক আপোনাৰ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>ত এই অনুমতিসমূহ এক্সেছ কৰিবলৈ অনুমতি দিয়া হ’ব"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ক আপোনাৰ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ৰ এপ্‌সমূহ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;ত ষ্ট্ৰীম কৰিবলৈ দিবনে?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>এ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ত দৃশ্যমান হোৱা বা প্লে’ কৰা অডিঅ’, ফট’ পাছৱৰ্ড আৰু বাৰ্তাকে ধৰি যিকোনো বস্তু এক্সেছ কৰিব পাৰিব।&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g>এ আপুনি এই অনুমতিৰ এক্সেছ আঁতৰাই নিদিয়া পৰ্যন্ত <xliff:g id="DEVICE_NAME">%3$s</xliff:g>ত এপ্‌সমূহ ষ্ট্ৰীম কৰিব পাৰিব।"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="DEVICE_NAME">%2$s</xliff:g>ৰ হৈ আপোনাৰ ডিভাইচসমূহৰ মাজত এপ্‌সমূহ দেখুৱাবলৈ আৰু ষ্ট্ৰীম কৰিবলৈ অনুমতি বিচাৰি অনুৰোধ জনাইছে"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ক আপোনাৰ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ৰ পৰা এই তথ্যখিনি এক্সেছ কৰিবলৈ দিয়ক"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="DEVICE_NAME">%2$s</xliff:g>ৰ হৈ আপোনাৰ <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>ৰ ফট’, মিডিয়া আৰু জাননী এক্সেছ কৰাৰ বাবে অনুমতি বিচাৰি অনুৰোধ জনাইছে"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt;ক আপোনাৰ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ৰ এপ্‌সমূহ আৰু ছিষ্টেমৰ সুবিধাসমূহ &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;ত ষ্ট্ৰীম কৰিবলৈ দিবনে?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ত দৃশ্যমান বা প্লে’ কৰা অডিঅ’, ফট’ পৰিশোধৰ তথ্য, পাছৱৰ্ড আৰু বাৰ্তাকে ধৰি যিকোনো বস্তু এক্সেছ কৰিব পাৰিব।&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g>এ আপুনি এই অনুমতিৰ এক্সেছ আঁতৰাই নিদিয়া পৰ্যন্ত <xliff:g id="DEVICE_NAME">%3$s</xliff:g>ত এপ্‌সমূহ আৰু ছিষ্টেমৰ সুবিধাসমূহ ষ্ট্ৰীম কৰিব পাৰিব।"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="DEVICE_NAME">%2$s</xliff:g>ৰ হৈ আপোনাৰ ডিভাইচসমূহৰ মাজত এপ্‌সমূহ আৰু আন ছিষ্টেমৰ সুবিধাসমূহ ষ্ট্ৰীম কৰিবলৈ অনুমতি বিচাৰি অনুৰোধ জনাইছে"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইচ"</string>
     <string name="summary_generic" msgid="1761976003668044801">"এই এপ্‌টোৱে আপোনাৰ ফ’ন আৰু বাছনি কৰা ডিভাইচটোৰ মাজত কল কৰোঁতাৰ নামৰ দৰে তথ্য ছিংক কৰিব পাৰিব"</string>
     <string name="consent_yes" msgid="8344487259618762872">"অনুমতি দিয়ক"</string>
diff --git a/packages/CompanionDeviceManager/res/values-az/strings.xml b/packages/CompanionDeviceManager/res/values-az/strings.xml
index 2a636a9..dd72093 100644
--- a/packages/CompanionDeviceManager/res/values-az/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-az/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tətbiqinə &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; cihazını idarə etmək icazəsi verilsin?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"cihazda"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Bu tətbiq <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> cihazında bu icazələrə daxil ola biləcək"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; üçün <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> tətbiqlərini &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; cihazına sinxronlaşdırmaq icazəsi verilsin?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> audio, foto, parol və mesajlar daxil olmaqla <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> cihazında görünən və ya oxudulan kontentə giriş əldə edəcək.&lt;br/&gt;&lt;br/&gt;Siz bu icazəyə girişi silənə qədər <xliff:g id="APP_NAME_1">%1$s</xliff:g>tətbiqləri <xliff:g id="DEVICE_NAME">%3$s</xliff:g> cihazına yayımlaya biləcək."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqləri göstərmək və cihazlar arasında yayımlamaq üçün <xliff:g id="DEVICE_NAME">%2$s</xliff:g> adından icazə tələb edir"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tətbiqinə <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> cihazından əldə edilən bu məlumata giriş icazəsi verin"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> üzrə foto, media və bildirişlərə daxil olmaq üçün <xliff:g id="DEVICE_NAME">%2$s</xliff:g> adından icazə tələb edir"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; üçün <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> tətbiq və sistem funksiyalarını &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; cihazına yayımlamaq icazəsi verilsin?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> audio, foto, ödəniş məlumatı, parol və mesajlar daxil olmaqla <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> cihazında görünən və ya işə salınan kontentə giriş əldə edəcək.&lt;br/&gt;&lt;br/&gt;Siz bu icazəyə girişi silənə qədər <xliff:g id="APP_NAME_1">%1$s</xliff:g> tətbiq və sistem funksiyalarını <xliff:g id="DEVICE_NAME">%3$s</xliff:g> cihazına yayımlaya biləcək."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> cihazlar arasında tətbiqləri və digər sistem funksiyalarını yayımlamaq üçün <xliff:g id="DEVICE_NAME">%2$s</xliff:g> adından icazə tələb edir"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"cihaz"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Tətbiq zəng edənin adı kimi məlumatları telefon ilə seçilmiş cihaz arasında sinxronlaşdıracaq"</string>
     <string name="consent_yes" msgid="8344487259618762872">"İcazə verin"</string>
diff --git a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
index 010b59a..2200cec 100644
--- a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Želite li da dozvolite da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; upravlja uređajem &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"uređaj"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Ovoj aplikaciji će biti dozvoljeno da pristupa ovim dozvolama na uređaju <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Želite li da dozvolite da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; strimuje aplikacije uređaja <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> na &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> će imati pristup svemu što se vidi ili pušta na uređaju <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, uključujući zvuk, slike, lozinke i poruke.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> će moći da strimuje aplikacije na <xliff:g id="DEVICE_NAME">%3$s</xliff:g> dok ne uklonite pristup ovoj dozvoli."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> traži dozvolu u ime uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> da prikazuje i strimuje aplikacije između uređaja"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Dozvolite da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pristupa ovim informacijama sa uređaja <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> traži dozvolu u ime uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> da pristupa slikama, medijskom sadržaju i obaveštenjima sa uređaja <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Želite li da dozvolite da &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; strimuje aplikacije i sistemske funkcije uređaja <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> na &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> će imati pristup svemu što se vidi ili pušta na uređaju <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, uključujući zvuk, slike, informacije o plaćanju, lozinke i poruke.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> će moći da strimuje aplikacije i sistemske funkcije na <xliff:g id="DEVICE_NAME">%3$s</xliff:g> dok ne uklonite pristup ovoj dozvoli."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> traži dozvolu u ime uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> da strimuje aplikacije i druge sistemske funkcije između uređaja"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Ova aplikacija će moći da sinhronizuje podatke, poput imena osobe koja upućuje poziv, između telefona i odabranog uređaja"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Dozvoli"</string>
diff --git a/packages/CompanionDeviceManager/res/values-be/strings.xml b/packages/CompanionDeviceManager/res/values-be/strings.xml
index 5cc26a7..7eca403 100644
--- a/packages/CompanionDeviceManager/res/values-be/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-be/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Дазволіць праграме &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; кіраваць прыладай &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"прылада"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Гэта праграма будзе мець на вашай прыладзе тыпу \"<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>\" наступныя дазволы"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Дазволіць праграме &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; трансліраваць праграмы прылады тыпу \"<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>\" на прыладу &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"Праграма \"<xliff:g id="APP_NAME_0">%1$s</xliff:g>\" будзе мець доступ да ўсяго, што паказваецца ці прайграецца на прыладзе тыпу \"<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>\", у тым ліку да аўдыя, фота, пароляў і паведамленняў.&lt;br/&gt;&lt;br/&gt;Праграма \"<xliff:g id="APP_NAME_1">%1$s</xliff:g>\" зможа трансліраваць праграмы на прыладу \"<xliff:g id="DEVICE_NAME">%3$s</xliff:g>\", пакуль вы не адклічаце гэты дазвол."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запытвае дазвол ад імя вашай прылады \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" на паказ і трансляцыю праграм паміж прыладамі"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Дазвольце праграме &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; мець доступ да гэтай інфармацыі з прылады тыпу \"<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>\""</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запытвае дазвол ад імя вашай прылады \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" на доступ да фота, медыяфайлаў і апавяшчэнняў на прыладзе тыпу \"<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>\""</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Дазволіць прыладзе &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; трансліраваць праграмы і сістэмныя функцыі прылады тыпу \"<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>\" на прыладу &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"Праграма \"<xliff:g id="APP_NAME_0">%1$s</xliff:g>\" будзе мець доступ да ўсяго, што паказваецца ці прайграецца на прыладзе тыпу \"<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>\", у тым ліку да аўдыя, фота, пароляў і паведамленняў.&lt;br/&gt;&lt;br/&gt;Праграма \"<xliff:g id="APP_NAME_1">%1$s</xliff:g>\" зможа трансліраваць праграмы і сістэмныя функцыі на прыладу \"<xliff:g id="DEVICE_NAME">%3$s</xliff:g>\", пакуль вы не адклічаце гэты дазвол."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запытвае дазвол ад імя вашай прылады \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" на трансляцыю праграм і іншых сістэмных функцый паміж прыладамі"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"прылада"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Гэта праграма зможа сінхранізаваць інфармацыю (напрыклад, імя таго, хто звоніць) паміж тэлефонам і выбранай прыладай"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Дазволіць"</string>
diff --git a/packages/CompanionDeviceManager/res/values-bg/strings.xml b/packages/CompanionDeviceManager/res/values-bg/strings.xml
index 747a071..3ebf375 100644
--- a/packages/CompanionDeviceManager/res/values-bg/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bg/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Разрешавате ли на &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да управлява устройството &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"устройство"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Това приложение ще има достъп до следните разрешения за вашите <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Да се разреши ли на &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да предава поточно към &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; приложенията на устройството ви от тип <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ще има достъп до всичко, което се показва или възпроизвежда на устройството ви от тип <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, включително аудио, снимки, пароли и съобщения.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> ще може да предава поточно приложения към устройството ви <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, докато не премахнете това разрешение."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> иска разрешение от името на ваше устройство (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) да показва и да предава поточно приложения между устройствата ви"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Разрешете на &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да осъществява достъп до тази информация от вашия <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> иска разрешение от името на ваше устройство (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) за достъп до снимките, мултимедията и известията на вашия <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Да се разреши ли на &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; да предава поточно към &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; приложенията и системните функции на устройството ви от тип <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ще има достъп до всичко, което се показва или възпроизвежда на устройството ви от тип <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, включително аудио, снимки, данни за плащане, пароли и съобщения.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> ще може да предава поточно приложения и системни функции към устройството ви <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, докато не премахнете това разрешение."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> иска разрешение от името на ваше устройство (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) да предава поточно приложения и други системни функции между устройствата ви"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"устройство"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Това приложение ще може да синхронизира различна информация, като например името на обаждащия се, между телефона ви и избраното устройство"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Разрешаване"</string>
diff --git a/packages/CompanionDeviceManager/res/values-bn/strings.xml b/packages/CompanionDeviceManager/res/values-bn/strings.xml
index ef9fddd..d2a0353 100644
--- a/packages/CompanionDeviceManager/res/values-bn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bn/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"আপনি কি &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ম্যানেজ করার জন্য &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;-কে অনুমতি দেবেন?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"ডিভাইস"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>-এ এইসব অনুমতি অ্যাক্সেস করার জন্য এই অ্যাপকে অনুমতি দেওয়া হবে"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"আপনার <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-এর অ্যাপ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?-এ স্ট্রিম করার জন্য &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-কে অনুমতি দেবেন?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"অডিও, ফটো, পাসওয়ার্ড ও মেসেজ সহ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-এ দেখা ও চালানো যায় এমন সব কিছু <xliff:g id="APP_NAME_0">%1$s</xliff:g> অ্যাক্সেস করতে পারবে।&lt;br/&gt;&lt;br/&gt;আপনি এই অনুমতি না সরানো পর্যন্ত <xliff:g id="APP_NAME_1">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME">%3$s</xliff:g>-এ অ্যাপ স্ট্রিম করতে পারবে।"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"আপনার বিভিন্ন ডিভাইসের মধ্যে অ্যাপ, ডিসপ্লে এবং স্ট্রিম করার জন্য আপনার <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-এর হয়ে <xliff:g id="APP_NAME">%1$s</xliff:g> অনুমতি চাইছে"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"আপনার <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> থেকে এই তথ্য অ্যাক্সেস করার জন্য &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-কে অনুমতি দিন"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"আপনার <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>-এর ফটো, মিডিয়া ও বিজ্ঞপ্তি অ্যাক্সেস করার জন্য, আপনার <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-এর হয়ে <xliff:g id="APP_NAME">%1$s</xliff:g> অনুমতি চাইছে"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"আপনার <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-এর অ্যাপ ও সিস্টেমের ফিচার &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?-এ স্ট্রিম করার জন্য &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt;-কে অনুমতি দেবেন?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"অডিও, ফটো, পেমেন্টের তথ্য, পাসওয়ার্ড ও মেসেজ সহ আপনার <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-এ দেখা ও চালানো যায় এমন সব কিছু <xliff:g id="APP_NAME_0">%1$s</xliff:g> অ্যাক্সেস করতে পারবে।&lt;br/&gt;&lt;br/&gt;আপনি এই অনুমতি না সরানো পর্যন্ত <xliff:g id="APP_NAME_1">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME">%3$s</xliff:g>-এ অ্যাপ ও সিস্টেমের ফিচার স্ট্রিম করতে পারবে।"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"আপনার বিভিন্ন ডিভাইসের মধ্যে অ্যাপ ও সিস্টেমের অন্যান্য ফিচার স্ট্রিম করার জন্য, আপনার <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-এর হয়ে <xliff:g id="APP_NAME">%1$s</xliff:g> অনুমতি চাইছে"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইস"</string>
     <string name="summary_generic" msgid="1761976003668044801">"এই অ্যাপ, আপনার ফোন এবং বেছে নেওয়া ডিভাইসের মধ্যে তথ্য সিঙ্ক করতে পারবে, যেমন কোনও কলারের নাম"</string>
     <string name="consent_yes" msgid="8344487259618762872">"অনুমতি দিন"</string>
diff --git a/packages/CompanionDeviceManager/res/values-bs/strings.xml b/packages/CompanionDeviceManager/res/values-bs/strings.xml
index 69ae96f..84316f2 100644
--- a/packages/CompanionDeviceManager/res/values-bs/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bs/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Dozvoliti aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da upravlja uređajem &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"uređaj"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Aplikaciji će biti dozvoljen pristup ovim odobrenjima koje sadržava vaš <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Dozvoliti aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da prenosi aplikacije koje sadržava vaš <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> na uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> će imati pristup svemu što <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> reproducira ili je vidljivo na njemu, uključujući zvukove, fotografije, lozinke i poruke.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> će moći prenositi aplikacije na uređaju <xliff:g id="DEVICE_NAME">%3$s</xliff:g> dok ne uklonite pristup ovom odobrenju."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> traži odobrenje u ime vašeg uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> da prikazuje i prenosi aplikacije između vaših uređaja"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Dozvolite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da pristupa ovim informacijama koje sadržava vaš <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> traži odobrenje u ime vašeg uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> da pristupa fotografijama, medijima i obavještenjima koje sadržava vaš <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Dozvoliti uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; da prenosi aplikacije i funkcije sistema koje sadržava vaš <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> na uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> će imati pristup svemu što <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> reproducira ili je vidljivo na njemu, uključujući zvukove, fotografije, podatke o plaćanju, lozinke i poruke.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> će moći prenositi aplikacije i funkcije sistema na uređaju <xliff:g id="DEVICE_NAME">%3$s</xliff:g> dok ne uklonite pristup ovom odobrenju."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> traži odobrenje u ime vašeg uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> da prenosi aplikacije i druge funkcije sistema između vaših uređaja"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Ova aplikacija će moći sinhronizirati informacije, kao što je ime osobe koja upućuje poziv, između vašeg telefona i odabranog uređaja"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Dozvoli"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ca/strings.xml b/packages/CompanionDeviceManager/res/values-ca/strings.xml
index f8c4084..8b115f7 100644
--- a/packages/CompanionDeviceManager/res/values-ca/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ca/strings.xml
@@ -25,19 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Permet que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; gestioni &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositiu"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Aquesta aplicació podrà accedir a aquests permisos del <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Vols permetre que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; reprodueixi en continu les aplicacions del <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> a &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> podrà accedir a qualsevol cosa que sigui visible o que es reprodueixi al <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, inclosos àudios, fotos, contrasenyes i missatges.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> podrà reproduir en continu aplicacions a <xliff:g id="DEVICE_NAME">%3$s</xliff:g> fins que suprimeixis l\'accés a aquest permís."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> demana permís en nom del teu dispositiu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> per mostrar i reproduir en continu aplicacions entre els dispositius"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Permet que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; accedeixi a aquesta informació del <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> demana permís en nom del teu dispositiu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> per accedir a les fotos, el contingut multimèdia i les notificacions del <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Vols permetre que &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; reprodueixi en continu les aplicacions i les funcions del sistema del <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> a <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>?"</string>
-    <!-- String.format failed for translation -->
-    <!-- no translation found for summary_nearby_device_streaming (962267343109051648) -->
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
     <skip />
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> demana permís en nom del teu dispositiu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> per reproduir en continu aplicacions i altres funcions del sistema entre els dispositius"</string>
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositiu"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Aquesta aplicació podrà sincronitzar informació, com ara el nom d\'algú que truca, entre el teu telèfon i el dispositiu triat"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Permet"</string>
diff --git a/packages/CompanionDeviceManager/res/values-cs/strings.xml b/packages/CompanionDeviceManager/res/values-cs/strings.xml
index 04e7380..7bd6e38 100644
--- a/packages/CompanionDeviceManager/res/values-cs/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-cs/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Povolit aplikaci &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; spravovat zařízení &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"zařízení"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Tato aplikace bude mít na zařízení typu <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> přístup k následujícím oprávněním"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Povolit aplikaci &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; streamovat aplikace na zařízení typu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> do zařízení &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"Aplikace <xliff:g id="APP_NAME_0">%1$s</xliff:g> bude mít přístup ke všemu, co na zařízení typu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> zobrazíte nebo přehrajete, včetně zvuku, fotek, hesel a zpráv.&lt;br/&gt;&lt;br/&gt;Aplikace <xliff:g id="APP_NAME_1">%1$s</xliff:g> bude moct streamovat aplikace do zařízení typu <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, dokud přístup k tomuto oprávnění neodeberete."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> požaduje za vaše zařízení <xliff:g id="DEVICE_NAME">%2$s</xliff:g> oprávnění k zobrazení a streamování obsahu mezi zařízeními"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Povolte aplikaci &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; přístup k těmto informacím z vašeho zařízení typu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> požaduje za vaše zařízení <xliff:g id="DEVICE_NAME">%2$s</xliff:g> oprávnění k přístupu k fotkám, médiím a oznámením na zařízení typu <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Povolit aplikaci &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; streamovat aplikace a systémové funkce ze zařízení typu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> do zařízení &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"Aplikace <xliff:g id="APP_NAME_0">%1$s</xliff:g> bude mít přístup ke všemu, co na zařízení typu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> zobrazíte nebo přehrajete, včetně zvuku, fotek, platebních údajů, hesel a zpráv.&lt;br/&gt;&lt;br/&gt;Aplikace <xliff:g id="APP_NAME_1">%1$s</xliff:g> bude moct streamovat aplikace a systémové funkce do zařízení typu <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, dokud přístup k tomuto oprávnění neodeberete."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> požaduje za vaše zařízení <xliff:g id="DEVICE_NAME">%2$s</xliff:g> oprávnění ke streamování aplikací a dalších systémových funkcí mezi zařízeními"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"zařízení"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Tato aplikace bude moci synchronizovat údaje, jako je jméno volajícího, mezi vaším telefonem a vybraným zařízením"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Povolit"</string>
diff --git a/packages/CompanionDeviceManager/res/values-da/strings.xml b/packages/CompanionDeviceManager/res/values-da/strings.xml
index d948804..4180ef5b 100644
--- a/packages/CompanionDeviceManager/res/values-da/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-da/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Vil du tillade, at &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; administrerer &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"enhed"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Denne app får adgang til disse tilladelser på din <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Vil du give &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tilladelse til at streame apps fra din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> til &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> får adgang til alt, der er synligt eller afspilles på din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, herunder lyd, billeder, adgangskoder og beskeder.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> kan streame apps til <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, indtil du fjerner adgangen til denne tilladelse."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder om tilladelse på vegne af din <xliff:g id="DEVICE_NAME">%2$s</xliff:g> til at vise og streame apps mellem dine enheder"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Giv &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; adgang til disse oplysninger fra din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder om tilladelse på vegne af din <xliff:g id="DEVICE_NAME">%2$s</xliff:g> til at få adgang til billeder, medier og notifikationer på din <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Vil du give &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; tilladelse til at streame apps og systemfunktioner fra din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> til &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> får adgang til alt, der er synligt eller afspilles på din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, herunder lyd, billeder, betalingsoplysninger, adgangskoder og beskeder.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> kan streame apps og systemfunktioner til <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, indtil du fjerner adgangen til denne tilladelse."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder om tilladelse på vegne af din <xliff:g id="DEVICE_NAME">%2$s</xliff:g> til at streame apps og andre systemfunktioner mellem dine enheder"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"enhed"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Denne app vil kunne synkronisere oplysninger som f.eks. navnet på en person, der ringer, mellem din telefon og den valgte enhed"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Tillad"</string>
diff --git a/packages/CompanionDeviceManager/res/values-de/strings.xml b/packages/CompanionDeviceManager/res/values-de/strings.xml
index 8d65f68..725a42d 100644
--- a/packages/CompanionDeviceManager/res/values-de/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-de/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Zulassen, dass &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; das Gerät &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; verwalten darf?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"Gerät"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Diese App darf dann auf diese Berechtigungen auf deinem Gerät (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>) zugreifen:"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; erlauben, die Apps auf deinem Gerät (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) auf &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; zu streamen?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> hat dann Zugriff auf alle Inhalte, die auf deinem Gerät (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) sichtbar sind oder abgespielt werden, einschließlich Audioinhalten, Fotos, Zahlungsinformationen, Passwörter und Nachrichten.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> kann so lange Apps auf „<xliff:g id="DEVICE_NAME">%3$s</xliff:g>“ streamen, bis du diese Berechtigung entfernst."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> bittet im Namen von „<xliff:g id="DEVICE_NAME">%2$s</xliff:g>“ um die Berechtigung, Apps zwischen deinen Geräten anzuzeigen und zu streamen"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; Zugriff auf diese Informationen von deinem Gerät (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) gewähren"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> bittet im Namen von „<xliff:g id="DEVICE_NAME">%2$s</xliff:g>“ um die Berechtigung, auf die Fotos, Medien und Benachrichtigungen auf deinem Gerät (<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>) zuzugreifen"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; erlauben, die Apps und Systemfunktionen auf deinem Gerät (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) auf &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; zu streamen?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> hat dann Zugriff auf alle Inhalte, die auf deinem Gerät (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) sichtbar sind oder abgespielt werden, einschließlich Audioinhalten, Fotos, Zahlungsinformationen, Passwörter und Nachrichten.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> kann so lange Apps und Systemfunktionen auf „<xliff:g id="DEVICE_NAME">%3$s</xliff:g>“ streamen, bis du diese Berechtigung entfernst."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> bittet im Namen von „<xliff:g id="DEVICE_NAME">%2$s</xliff:g>“ um die Berechtigung, Apps und andere Systemfunktionen zwischen deinen Geräten zu streamen"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"Gerät"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Diese App kann dann Daten wie den Namen eines Anrufers zwischen deinem Smartphone und dem ausgewählten Gerät synchronisieren"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Zulassen"</string>
diff --git a/packages/CompanionDeviceManager/res/values-el/strings.xml b/packages/CompanionDeviceManager/res/values-el/strings.xml
index 4a186d5..57aebc3 100644
--- a/packages/CompanionDeviceManager/res/values-el/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-el/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Να επιτρέπεται στην εφαρμογή &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; να διαχειρίζεται τη συσκευή &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ;"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"συσκευή"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Αυτή η εφαρμογή θα μπορεί να έχει πρόσβαση σε αυτές τις άδειες στη συσκευή <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Να επιτρέπεται στην εφαρμογή &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; να κάνει ροή των εφαρμογών της συσκευής <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> στη συσκευή &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;;"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"Η εφαρμογή <xliff:g id="APP_NAME_0">%1$s</xliff:g> θα έχει πρόσβαση σε οτιδήποτε είναι ορατό ή αναπαράγεται στη συσκευή <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, συμπεριλαμβανομένων ήχων, φωτογραφιών, κωδικών πρόσβασης και μηνυμάτων.&lt;br/&gt;&lt;br/&gt;Η εφαρμογή <xliff:g id="APP_NAME_1">%1$s</xliff:g> θα μπορεί να κάνει ροή εφαρμογών στη συσκευή <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, μέχρι να καταργήσετε την πρόσβαση σε αυτή την άδεια."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> ζητά άδεια εκ μέρους της συσκευής <xliff:g id="DEVICE_NAME">%2$s</xliff:g> για προβολή και ροή εφαρμογών μεταξύ των συσκευών σας"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Να επιτρέπεται στην εφαρμογή &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; η πρόσβαση σε αυτές τις πληροφορίες από τη συσκευή σας <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>."</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> ζητά άδεια εκ μέρους της συσκευής σας <xliff:g id="DEVICE_NAME">%2$s</xliff:g>, για πρόσβαση στις φωτογραφίες, τα αρχεία μέσων και τις ειδοποιήσεις της συσκευής <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Να επιτρέπεται στη συσκευή &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; να κάνει ροή των εφαρμογών και των λειτουργιών συστήματος της συσκευής <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> στη συσκευή &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;;"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"Η εφαρμογή <xliff:g id="APP_NAME_0">%1$s</xliff:g> θα έχει πρόσβαση σε οτιδήποτε είναι ορατό ή αναπαράγεται στη συσκευή <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, συμπεριλαμβανομένων ήχων, φωτογραφιών, στοιχείων πληρωμής, κωδικών πρόσβασης και μηνυμάτων.&lt;br/&gt;&lt;br/&gt;Η εφαρμογή <xliff:g id="APP_NAME_1">%1$s</xliff:g> θα μπορεί να κάνει ροή εφαρμογών και λειτουργιών συστήματος στη συσκευή <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, μέχρι να καταργήσετε την πρόσβαση σε αυτή την άδεια."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> ζητά άδεια εκ μέρους της συσκευής σας <xliff:g id="DEVICE_NAME">%2$s</xliff:g> για ροή εφαρμογών και άλλων λειτουργιών συστήματος μεταξύ των συσκευών σας"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"συσκευή"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Αυτή η εφαρμογή θα μπορεί να συγχρονίζει πληροφορίες μεταξύ του τηλεφώνου και της επιλεγμένης συσκευής σας, όπως το όνομα ενός ατόμου που σας καλεί."</string>
     <string name="consent_yes" msgid="8344487259618762872">"Να επιτρέπεται"</string>
diff --git a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
index 346758a..0a85428 100644
--- a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to manage &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"This app will be allowed to access these permissions on your <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>\'s apps to &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> will have access to anything that\'s visible or played on the <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, including audio, photos, passwords and messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> will be able to stream apps to <xliff:g id="DEVICE_NAME">%3$s</xliff:g> until you remove access to this permission."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to display and stream apps between your devices"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to access your <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>\'s photos, media and notifications"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>\'s apps and system features to &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> will have access to anything that\'s visible or played on your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, including audio, photos, payment info, passwords and messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> will be able to stream apps and system features to <xliff:g id="DEVICE_NAME">%3$s</xliff:g> until you remove access to this permission."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and other system features between your devices"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
     <string name="summary_generic" msgid="1761976003668044801">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Allow"</string>
diff --git a/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml
index 5716476..c40018f 100644
--- a/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml
@@ -25,17 +25,17 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to manage &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"This app will be allowed to access these permissions on your <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>’s apps to &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> will have access to anything that’s visible or played on the <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, including audio, photos, passwords, and messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> will be able to stream apps to <xliff:g id="DEVICE_NAME">%3$s</xliff:g> until you remove access to this permission."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to display and stream apps between your devices"</string>
+    <string name="title_app_streaming" msgid="1047090167914857893">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>’s apps and system features to &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
+    <string name="summary_app_streaming" msgid="7990244299655610920">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> will have access to anything that’s visible or played on your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, including audio, photos, payment info, passwords, and messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> will be able to stream apps to <xliff:g id="DEVICE_NAME">%3$s</xliff:g> until you remove access to this permission."</string>
+    <string name="helper_summary_app_streaming" msgid="1872657107404139828">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and system features from your <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to access your <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>’s photos, media, and notifications"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>’s apps and system features to &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> will have access to anything that’s visible or played on your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, including audio, photos, payment info, passwords, and messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> will be able to stream apps and system features to <xliff:g id="DEVICE_NAME">%3$s</xliff:g> until you remove access to this permission."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and other system features between your devices"</string>
+    <string name="title_nearby_device_streaming" msgid="2727103756701741359">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>’s apps to &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
+    <string name="summary_nearby_device_streaming" msgid="70434958004946884">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> will have access to anything that’s visible or played on <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>, including audio, photos, payment info, passwords, and messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_2">%1$s</xliff:g> will be able to stream apps to <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> until you remove access to this permission."</string>
+    <string name="helper_summary_nearby_device_streaming" msgid="4712712177819370967">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps from your <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
     <string name="summary_generic" msgid="1761976003668044801">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Allow"</string>
diff --git a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
index 346758a..0a85428 100644
--- a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to manage &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"This app will be allowed to access these permissions on your <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>\'s apps to &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> will have access to anything that\'s visible or played on the <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, including audio, photos, passwords and messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> will be able to stream apps to <xliff:g id="DEVICE_NAME">%3$s</xliff:g> until you remove access to this permission."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to display and stream apps between your devices"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to access your <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>\'s photos, media and notifications"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>\'s apps and system features to &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> will have access to anything that\'s visible or played on your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, including audio, photos, payment info, passwords and messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> will be able to stream apps and system features to <xliff:g id="DEVICE_NAME">%3$s</xliff:g> until you remove access to this permission."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and other system features between your devices"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
     <string name="summary_generic" msgid="1761976003668044801">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Allow"</string>
diff --git a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
index 346758a..0a85428 100644
--- a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to manage &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"This app will be allowed to access these permissions on your <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>\'s apps to &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> will have access to anything that\'s visible or played on the <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, including audio, photos, passwords and messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> will be able to stream apps to <xliff:g id="DEVICE_NAME">%3$s</xliff:g> until you remove access to this permission."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to display and stream apps between your devices"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to access your <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>\'s photos, media and notifications"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>\'s apps and system features to &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> will have access to anything that\'s visible or played on your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, including audio, photos, payment info, passwords and messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> will be able to stream apps and system features to <xliff:g id="DEVICE_NAME">%3$s</xliff:g> until you remove access to this permission."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and other system features between your devices"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
     <string name="summary_generic" msgid="1761976003668044801">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Allow"</string>
diff --git a/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml b/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml
index 6c6a000..80b02cb 100644
--- a/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml
@@ -25,17 +25,17 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‎‏‎‏‎‏‏‎‎‏‎‏‎Allow &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; to manage &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt;?‎‏‎‎‏‎"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‎‎‎‎‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‎‎‎‏‎‏‏‏‏‎‏‎device‎‏‎‎‏‎"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‎‎‏‎‎‎‏‎‏‏‎‎‎‎‏‏‎‏‎‎‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‎‏‎‏‎This app will be allowed to access these permissions on your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‎‎‏‏‏‏‎‏‎‎‎‎‎‎‏‏‎‏‎‎‏‎‎‏‏‏‎‎‎‏‎‎‎‎‎‎Allow &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; to stream your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>‎‏‎‎‏‏‏‎’s apps to &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%3$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt;?‎‏‎‎‏‎"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‏‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will have access to anything that’s visible or played on the ‎‏‎‎‏‏‎<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>‎‏‎‎‏‏‏‎, including audio, photos, passwords, and messages.&lt;br/&gt;&lt;br/&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME_1">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will be able to stream apps to ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%3$s</xliff:g>‎‏‎‎‏‏‏‎ until you remove access to this permission.‎‏‎‎‏‎"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‎‏‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is requesting permission on behalf of your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ to display and stream apps between your devices‎‏‎‎‏‎"</string>
+    <string name="title_app_streaming" msgid="1047090167914857893">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‏‎‎‏‎‏‎Allow &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; to stream your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>‎‏‎‎‏‏‏‎’s apps and system features to &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%3$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt;?‎‏‎‎‏‎"</string>
+    <string name="summary_app_streaming" msgid="7990244299655610920">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‏‎‎‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‏‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will have access to anything that’s visible or played on your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>‎‏‎‎‏‏‏‎, including audio, photos, payment info, passwords, and messages.&lt;br/&gt;&lt;br/&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME_1">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will be able to stream apps to ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%3$s</xliff:g>‎‏‎‎‏‏‏‎ until you remove access to this permission.‎‏‎‎‏‎"</string>
+    <string name="helper_summary_app_streaming" msgid="1872657107404139828">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is requesting permission on behalf of ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ to stream apps and system features from your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‏‎‏‏‎‏‏‎‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‏‎‎‎‏‎‏‎‏‏‏‏‎Allow &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; to access this information from your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‏‎‏‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is requesting permission on behalf of your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ to access your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>‎‏‎‎‏‏‏‎’s photos, media, and notifications‎‏‎‎‏‎"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‏‎‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‏‎‏‎‎‏‎‎‎‎Allow &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; to stream your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>‎‏‎‎‏‏‏‎’s apps and system features to &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt;?‎‏‎‎‏‎"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‎‎‏‏‎‎‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‏‎‎‎‎‎‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will have access to anything that’s visible or played on your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>‎‏‎‎‏‏‏‎, including audio, photos, payment info, passwords, and messages.&lt;br/&gt;&lt;br/&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME_1">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will be able to stream apps and system features to ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%3$s</xliff:g>‎‏‎‎‏‏‏‎ until you remove access to this permission.‎‏‎‎‏‎"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‎‏‏‎‏‏‎‎‎‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is requesting permission on behalf of your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ to stream apps and other system features between your devices‎‏‎‎‏‎"</string>
+    <string name="title_nearby_device_streaming" msgid="2727103756701741359">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‏‏‎‎‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‎‏‏‎‎‎‏‎‎‏‎‏‏‏‏‎Allow &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; to stream your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>‎‏‎‎‏‏‏‎’s apps to &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%3$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt;?‎‏‎‎‏‎"</string>
+    <string name="summary_nearby_device_streaming" msgid="70434958004946884">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‏‏‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‎‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will have access to anything that’s visible or played on ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>‎‏‎‎‏‏‏‎, including audio, photos, payment info, passwords, and messages.&lt;br/&gt;&lt;br/&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME_2">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will be able to stream apps to ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME_3">%3$s</xliff:g>‎‏‎‎‏‏‏‎ until you remove access to this permission.‎‏‎‎‏‎"</string>
+    <string name="helper_summary_nearby_device_streaming" msgid="4712712177819370967">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‏‎‏‏‎‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‎‏‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is requesting permission on behalf of ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ to stream apps from your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‎‏‏‎‎‎device‎‏‎‎‏‎"</string>
     <string name="summary_generic" msgid="1761976003668044801">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎This app will be able to sync info, like the name of someone calling, between your phone and the chosen device‎‏‎‎‏‎"</string>
     <string name="consent_yes" msgid="8344487259618762872">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‎‏‎‎‏‎‏‏‏‏‎‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‎‏‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎Allow‎‏‎‎‏‎"</string>
diff --git a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
index 63d57c4..9f62192 100644
--- a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Permite que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; administre &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Esta app podrá acceder a los siguientes permisos en tu <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"¿Quieres permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; transmita las apps de <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> a &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> tendrá acceso a todo el contenido visible o que se reproduzca en <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, lo que incluye audio, fotos, contraseñas y mensajes.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> podrá transmitir apps a <xliff:g id="DEVICE_NAME">%3$s</xliff:g> hasta que se quite el acceso a este permiso."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicita tu permiso en nombre de <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para mostrar y transmitir apps entre dispositivos"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Permite que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información de tu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicita tu permiso en nombre de <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para acceder a las fotos, el contenido multimedia y las notificaciones de tu <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"¿Quieres permitir que &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; transmita las apps y las funciones del sistema de <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> a &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> tendrá acceso a todo el contenido visible o que se reproduzca en tu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, lo que incluye audio, fotos, información de pago, contraseñas y mensajes.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> podrá transmitir apps y funciones del sistema a <xliff:g id="DEVICE_NAME">%3$s</xliff:g> hasta que se quite el acceso a este permiso."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicita tu permiso en nombre de <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para transmitir apps y otras funciones del sistema entre dispositivos"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Esta app podrá sincronizar información, como el nombre de la persona que llama, entre el teléfono y el dispositivo elegido"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
diff --git a/packages/CompanionDeviceManager/res/values-es/strings.xml b/packages/CompanionDeviceManager/res/values-es/strings.xml
index f929d24..44474b9 100644
--- a/packages/CompanionDeviceManager/res/values-es/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-es/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"¿Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; gestione &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Esta aplicación podrá acceder a estos permisos de tu <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"¿Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; emita las aplicaciones de tu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> en &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> tendrá acceso a todo lo que se vea o se reproduzca en tu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, incluidos audio, fotos, contraseñas y mensajes.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> podrá emitir aplicaciones en <xliff:g id="DEVICE_NAME">%3$s</xliff:g> hasta que quites el acceso a este permiso."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pidiendo permiso en nombre de tu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para mostrar y emitir aplicaciones en otros dispositivos tuyos"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información de tu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pidiendo permiso en nombre de tu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para acceder a las fotos, los archivos multimedia y las notificaciones de tu <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"¿Permitir que &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; emita las aplicaciones y funciones del sistema de tu<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> en &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> tendrá acceso a todo lo que se vea o se reproduzca en tu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, incluidos audio, fotos, información para pagos, contraseñas y mensajes.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> podrá emitir aplicaciones y funciones del sistema en <xliff:g id="DEVICE_NAME">%3$s</xliff:g> hasta que quites el acceso a este permiso."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pidiendo permiso en nombre de tu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para emitir aplicaciones y otras funciones del sistema en otros dispositivos tuyos"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Esta aplicación podrá sincronizar información (por ejemplo, el nombre de la persona que te llama) entre tu teléfono y el dispositivo que elijas"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
diff --git a/packages/CompanionDeviceManager/res/values-et/strings.xml b/packages/CompanionDeviceManager/res/values-et/strings.xml
index 5fcadcc..a1cb0c6 100644
--- a/packages/CompanionDeviceManager/res/values-et/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-et/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Lubage rakendusel &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; hallata seadet &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"seade"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Sellel rakendusel lubatakse juurde pääseda nendele lubadele, mille asukoht on teie <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Kas lubate rakendusel &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; voogesitada seadmes &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; rakendusi, mille asukoht on teie <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> saab juurdepääsu kõigele, mida teie <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> saab kuvada või esitada sh heli, fotod, paroolid ja sõnumid.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> saab voogesitada rakendusi ja süsteemifunktsioone seadmes <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, kuni eemaldate juurdepääsu sellele loale."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Rakendus <xliff:g id="APP_NAME">%1$s</xliff:g> taotleb teie seadme <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nimel luba teie seadmete vahel rakendusi kuvada ja voogesitada"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Lubage rakendusel &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pääseda juurde sellele teabele, mille asukoht on teie <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Rakendus <xliff:g id="APP_NAME">%1$s</xliff:g> taotleb teie seadme <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nimel luba pääseda juurde fotodele, meediale ja märguannetele, mille asukoht on teie <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Kas lubate rakendusel &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; voogesitada seadmes &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; rakendusi ja süsteemifunktsioone, mille asukoht on teie <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> saab juurdepääsu kõigele, mida teie <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> saab kuvada või esitada, sh heli, fotod, makseteave, paroolid ja sõnumid.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> saab voogesitada rakendusi ja süsteemifunktsioone seadmes <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, kuni eemaldate juurdepääsu sellele loale."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Rakendus <xliff:g id="APP_NAME">%1$s</xliff:g> taotleb teie seadme <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nimel luba voogesitada teie seadmete vahel rakendusi ja muid süsteemifunktsioone"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"seade"</string>
     <string name="summary_generic" msgid="1761976003668044801">"See rakendus saab sünkroonida teavet, näiteks helistaja nime, teie telefoni ja valitud seadme vahel"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Luba"</string>
diff --git a/packages/CompanionDeviceManager/res/values-eu/strings.xml b/packages/CompanionDeviceManager/res/values-eu/strings.xml
index 46da125..f88af3c 100644
--- a/packages/CompanionDeviceManager/res/values-eu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-eu/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; kudeatzeko baimena eman nahi diozu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"gailua"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Baimen hauek izango ditu aplikazioak <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> erabiltzean:"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari zure <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> gailuko aplikazioak <xliff:g id="DEVICE_NAME">%3$s</xliff:g> gailura zuzenean igortzeko baimena eman nahi diozu?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> aplikazioak <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> gailuan ikusgai dagoen edo erreproduzitzen den eduki guztia atzitu ahal izango du, audioa, argazkiak, pasahitzak eta mezuak barne.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%3$s</xliff:g> gailura aplikazioak zuzenean igortzeko gai izango da, baimen hori kentzen diozun arte."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Aplikazioak gailuen artean bistaratzeko eta zuzenean igortzeko baimena eskatzen ari da <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME">%2$s</xliff:g> gailuaren izenean"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Eman informazioa <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> gailutik hartzeko baimena &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="DEVICE_TYPE">%3$s</xliff:g> gailuko argazkiak, multimedia-edukia eta jakinarazpenak atzitzeko baimena eskatzen ari da <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME">%2$s</xliff:g> gailuaren izenean"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; aplikazioari zure <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> gailuko aplikazioak eta sistemaren eginbideak <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g> gailura zuzenean igortzeko baimena eman nahi diozu?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> aplikazioak <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> gailuan ikusgai dagoen edo erreproduzitzen den eduki guztia atzitu ahal izango du, audioa, argazkiak, ordainketa-informazioa, pasahitzak eta mezuak barne.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%3$s</xliff:g> gailura aplikazioak eta sistemaren eginbideak zuzenean igortzeko gai izango da, baimen hori kentzen diozun arte."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Aplikazioak eta sistemaren beste eginbide batzuk zure gailuen artean igortzeko baimena eskatzen ari da <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME">%2$s</xliff:g> gailuaren izenean"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"gailua"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Telefonoaren eta hautatutako gailuaren artean informazioa sinkronizatzeko gai izango da aplikazioa (esate baterako, deitzaileen izenak)"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Eman baimena"</string>
diff --git a/packages/CompanionDeviceManager/res/values-fa/strings.xml b/packages/CompanionDeviceManager/res/values-fa/strings.xml
index 6a651d9..9066c6a 100644
--- a/packages/CompanionDeviceManager/res/values-fa/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fa/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"‏به &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; اجازه داده شود &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; را مدیریت کند؟"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"دستگاه"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"این برنامه قادر خواهد بود به این اجازه‌ها در <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> شما دسترسی پیدا کند"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"‏به &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; اجازه می‌دهید برنامه‌های <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> را در &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; جاری‌سازی کند؟"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"‏‫<xliff:g id="APP_NAME_0">%1$s</xliff:g> به هرچیزی که در <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> نمایان است یا پخش می‌شود، ازجمله صداها، عکس‌ها، گذرواژه‌ها، و پیام‌ها دسترسی خواهد داشت.&lt;br/&gt;&lt;br/&gt;تا زمانی‌که دسترسی به این اجازه را حذف نکنید، <xliff:g id="APP_NAME_1">%1$s</xliff:g> می‌تواند برنامه‌ها را در <xliff:g id="DEVICE_NAME">%3$s</xliff:g> جاری‌سازی کند."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> ازطرف <xliff:g id="DEVICE_NAME">%2$s</xliff:g> اجازه می‌خواهد برنامه‌ها را بین دستگاه‌های شما نمایش دهد و جاری‌سازی کند"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"‏اجازه دادن به &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; برای دسترسی به این اطلاعات در <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> شما"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> ازطرف <xliff:g id="DEVICE_NAME">%2$s</xliff:g> اجازه می‌خواهد به عکس‌ها، رسانه‌ها، و اعلان‌های <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> شما دسترسی پیدا کند"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"‏به &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; اجازه می‌دهید برنامه‌ها و ویژگی‌های سیستم <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> را در &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; جاری‌سازی کند؟"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"‏‫<xliff:g id="APP_NAME_0">%1$s</xliff:g> به هرچیزی که در <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> شما نمایان است یا پخش می‌شود، ازجمله صداها، عکس‌ها، اطلاعات پرداخت، گذرواژه‌ها، و پیام‌ها دسترسی خواهد داشت.&lt;br/&gt;&lt;br/&gt;تا زمانی‌که دسترسی به این اجازه را حذف نکنید، <xliff:g id="APP_NAME_1">%1$s</xliff:g> می‌تواند برنامه‌ها و ویژگی‌های سیستم را در <xliff:g id="DEVICE_NAME">%3$s</xliff:g> جاری‌سازی کند."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> ازطرف <xliff:g id="DEVICE_NAME">%2$s</xliff:g> اجازه می‌خواهد برنامه‌ها و دیگر ویژگی‌های سیستم را بین دستگاه‌های شما جاری‌سازی کند"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"دستگاه"</string>
     <string name="summary_generic" msgid="1761976003668044801">"این برنامه مجاز می‌شود اطلاعتی مثل نام شخصی را که تماس می‌گیرد بین تلفن شما و دستگاه انتخاب‌شده همگام‌سازی کند"</string>
     <string name="consent_yes" msgid="8344487259618762872">"اجازه دادن"</string>
diff --git a/packages/CompanionDeviceManager/res/values-fi/strings.xml b/packages/CompanionDeviceManager/res/values-fi/strings.xml
index 5626f0a..e155077 100644
--- a/packages/CompanionDeviceManager/res/values-fi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fi/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Salli, että &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; saa ylläpitää laitetta: &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"laite"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Sovellus saa käyttää näitä lupia <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Saako &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; striimata <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> olevia sovelluksia laitteelle (&lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;)?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> saa pääsyn kaikkeen <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> näkyvään tai pelattavaan sisältöön, mukaan lukien audioon, kuviin, salasanoihin ja viesteihin.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> voi striimata sovelluksia laitteelle (<xliff:g id="DEVICE_NAME">%3$s</xliff:g>), kunnes poistat luvan."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> pyytää laitteesi (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) puolesta lupaa näyttää ja striimata sovelluksia laitteidesi välillä"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Salli, että &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; saa pääsyn näihin <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> oleviin tietoihin"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> pyytää laitteesi (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) puolesta lupaa päästä <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> oleviin kuviin, mediaan ja ilmoituksiin"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Saako &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; striimata <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> olevia sovelluksia ja järjestelmäominaisuuksia laitteelle (&lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;)?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> saa pääsyn kaikkeen <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> näkyvään tai pelattavaan sisältöön, mukaan lukien audioon, kuviin, maksutietoihin, salasanoihin ja viesteihin.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> voi striimata sovelluksia ja järjestelmäominaisuuksia laitteelle (<xliff:g id="DEVICE_NAME">%3$s</xliff:g>), kunnes poistat luvan."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> pyytää laitteesi (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) puolesta lupaa striimata sovelluksia ja muita järjestelmän ominaisuuksia laitteidesi välillä"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"laite"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Sovellus voi synkronoida tietoja (esimerkiksi soittajan nimen) puhelimesi ja valitun laitteen välillä"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Salli"</string>
diff --git a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
index 61a8b73..b5de650 100644
--- a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à gérer &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"appareil"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Cette appli pourra accéder à ces autorisations sur votre <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à diffuser les applis de votre <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> vers &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> aura accès à tout ce qui est visible ou lu sur votre<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, y compris le contenu audio, les photos, les mots de passe et les messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> pourra diffuser des applis vers <xliff:g id="DEVICE_NAME">%3$s</xliff:g> jusqu\'à ce que vous retiriez l\'accès à cette autorisation."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DEVICE_NAME">%2$s</xliff:g> pour afficher et diffuser des applis entre vos appareils"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à accéder à ces informations à partir de votre <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DEVICE_NAME">%2$s</xliff:g> pour accéder aux photos, aux fichiers multimédias et aux notifications de votre <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Autoriser &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; à diffuser les applis et les fonctionnalités du système de votre <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> vers &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> aura accès à tout ce qui est visible ou lu sur votre <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, y compris le contenu audio, les photos, les infos de paiement, les mots de passe et les messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> pourra diffuser des applis et des fonctionnalités du système vers <xliff:g id="DEVICE_NAME">%3$s</xliff:g> jusqu\'à ce que vous retiriez l\'accès à cette autorisation."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DEVICE_NAME">%2$s</xliff:g> pour diffuser des applis et d\'autres fonctionnalités du système entre vos appareils"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"appareil"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Cette appli pourra synchroniser des informations, comme le nom de l\'appelant, entre votre téléphone et l\'appareil sélectionné"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Autoriser"</string>
diff --git a/packages/CompanionDeviceManager/res/values-fr/strings.xml b/packages/CompanionDeviceManager/res/values-fr/strings.xml
index b319364..b4933ee2 100644
--- a/packages/CompanionDeviceManager/res/values-fr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fr/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à gérer &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"appareil"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Cette appli sera autorisée à accéder à ces autorisations sur votre <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à caster les applis de votre <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> sur &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; ?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> aura accès à tout ce qui est visible ou lu sur votre <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, y compris les contenus audio, les photos, les mots de passe et les messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> pourra caster des applis sur <xliff:g id="DEVICE_NAME">%3$s</xliff:g> jusqu\'à ce que vous supprimiez l\'accès à cette autorisation."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DEVICE_NAME">%2$s</xliff:g> pour afficher et caster des applis d\'un appareil à l\'autre"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à accéder à ces informations depuis votre <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DEVICE_NAME">%2$s</xliff:g> pour accéder aux photos, multimédias et notifications de votre <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Autoriser &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; à caster les applis et les fonctionnalités système de votre <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> sur &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; ?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> aura accès à tout ce qui est visible ou lu sur votre <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, y compris les contenus audio, les photos, les infos de paiement, les mots de passe et les messages.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> pourra caster des applis et des fonctionnalités système sur <xliff:g id="DEVICE_NAME">%3$s</xliff:g> jusqu\'à ce que vous supprimiez l\'accès à cette autorisation."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DEVICE_NAME">%2$s</xliff:g> pour caster des applis et d\'autres fonctionnalités système d\'un appareil à l\'autre"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"appareil"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Cette appli pourra synchroniser des infos, comme le nom de l\'appelant, entre votre téléphone et l\'appareil choisi"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Autoriser"</string>
diff --git a/packages/CompanionDeviceManager/res/values-gl/strings.xml b/packages/CompanionDeviceManager/res/values-gl/strings.xml
index ccab521..85bfdc0 100644
--- a/packages/CompanionDeviceManager/res/values-gl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-gl/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Queres permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; xestione o dispositivo (&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;)?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Esta aplicación poderá acceder a estes permisos do dispositivo (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>)"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Queres permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; emita as aplicacións do dispositivo (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) en &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> terá acceso a todo o que se vexa ou reproduza no dispositivo (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>), como audio, fotos, contrasinais e mensaxes.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> poderá emitir aplicacións en <xliff:g id="DEVICE_NAME">%3$s</xliff:g> ata que quites o acceso a este permiso."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nome do teu dispositivo (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) para mostrar e emitir aplicacións entre dispositivos"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información do dispositivo (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>)"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nome do teu dispositivo (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) para acceder ás fotos, ao contido multimedia e ás notificacións do seguinte aparello: <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Queres permitir que &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; emita as aplicacións e as funcións do sistema do dispositivo (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) en &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> terá acceso a todo o que se vexa ou reproduza no dispositivo (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>), como audio, fotos, contrasinais e mensaxes.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> poderá emitir aplicacións e outras funcións do sistema en <xliff:g id="DEVICE_NAME">%3$s</xliff:g> ata que quites o acceso a este permiso."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nome do teu dispositivo (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) para emitir aplicacións e outras funcións do sistema entre dispositivos"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Esta aplicación poderá sincronizar información (por exemplo, o nome de quen chama) entre o teléfono e o dispositivo escollido"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
diff --git a/packages/CompanionDeviceManager/res/values-gu/strings.xml b/packages/CompanionDeviceManager/res/values-gu/strings.xml
index 816717b..9effe2c 100644
--- a/packages/CompanionDeviceManager/res/values-gu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-gu/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ને &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; મેનેજ કરવા માટે મંજૂરી આપીએ?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"ડિવાઇસ"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"આ ઍપને તમારા <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> પર આ પરવાનગીઓ ઍક્સેસ કરવાની મંજૂરી મળશે"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"શું &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ને <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ની ઍપને &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; પર સ્ટ્રીમ કરવાની મંજૂરી આપીએ?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>ની પાસે એવી બધી બાબતોનો ઍક્સેસ રહેશે જે <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> પર જોઈ શકાતી કે ચલાવી શકાતી હોય, જેમાં ઑડિયો, ફોટા, પાસવર્ડ અને મેસેજ શામેલ છે.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> ત્યાં સુધી ઍપને <xliff:g id="DEVICE_NAME">%3$s</xliff:g> પર સ્ટ્રીમ કરી શકશે, જ્યાં સુધી તમે આ પરવાનગીનો ઍક્સેસ કાઢી નહીં નાખો."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"તમારા એક ડિવાઇસ પરથી બીજા ડિવાઇસ પર ઍપને ડિસ્પ્લે તેમજ સ્ટ્રીમ કરવા માટે, <xliff:g id="APP_NAME">%1$s</xliff:g> તમારા <xliff:g id="DEVICE_NAME">%2$s</xliff:g> વતી પરવાનગી માગી રહી છે"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"તમારા <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>માંથી આ માહિતી ઍક્સેસ કરવા માટે, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ને મંજૂરી આપો"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> તમારા <xliff:g id="DEVICE_NAME">%2$s</xliff:g> વતી તમારા <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>ના ફોટા, મીડિયા અને નોટિફિકેશન ઍક્સેસ કરવાની પરવાનગીની વિનંતી કરી રહી છે"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"શું &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt;ને <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ની ઍપ અને સિસ્ટમની સુવિધાઓને &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; પર સ્ટ્રીમ કરવાની મંજૂરી આપીએ?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>ની પાસે એવી બધી બાબતોનો ઍક્સેસ રહેશે જે <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> પર જોઈ શકાતી કે ચલાવી શકાતી હોય, જેમાં ઑડિયો, ફોટા, ચુકવણીની માહિતી, પાસવર્ડ અને મેસેજ શામેલ છે.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> ત્યાં સુધી ઍપ અને સિસ્ટમની સુવિધાઓને <xliff:g id="DEVICE_NAME">%3$s</xliff:g> પર સ્ટ્રીમ કરી શકશે, જ્યાં સુધી તમે આ પરવાનગીનો ઍક્સેસ કાઢી નહીં નાખો."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> તમારા ડિવાઇસ વચ્ચે ઍપ અને સિસ્ટમની અન્ય સુવિધાઓ સ્ટ્રીમ કરવા તમારા <xliff:g id="DEVICE_NAME">%2$s</xliff:g> વતી પરવાનગીની વિનંતી કરી રહી છે"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"ડિવાઇસ"</string>
     <string name="summary_generic" msgid="1761976003668044801">"આ ઍપ તમારા ફોન અને પસંદ કરેલા ડિવાઇસ વચ્ચે, કૉલ કરનાર કોઈ વ્યક્તિનું નામ જેવી માહિતી સિંક કરી શકશે"</string>
     <string name="consent_yes" msgid="8344487259618762872">"મંજૂરી આપો"</string>
diff --git a/packages/CompanionDeviceManager/res/values-hi/strings.xml b/packages/CompanionDeviceManager/res/values-hi/strings.xml
index b5a40e95f..2a08e00 100644
--- a/packages/CompanionDeviceManager/res/values-hi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hi/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"क्या &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; को &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; मैनेज करने की अनुमति देनी है?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"डिवाइस"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"यह ऐप्लिकेशन, आपके <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> पर इन अनुमतियों को ऐक्सेस कर पाएगा"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"क्या &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; को आपके <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> के ऐप्लिकेशन &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; पर स्ट्रीम करने की अनुमति देनी है?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> के पास ऐसे किसी भी कॉन्टेंट का ऐक्सेस होगा जो इस <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> पर दिखता है या चलाया जाता है. इसमें ऑडियो, फ़ोटो, पासवर्ड, और मैसेज भी शामिल हैं.&lt;br/&gt;&lt;br/&gt;.<xliff:g id="APP_NAME_1">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME">%3$s</xliff:g> पर तब तक ऐप्लिकेशन स्ट्रीम कर पाएगा, जब तक आप यह अनुमति हटा न दें."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"आपके <xliff:g id="DEVICE_NAME">%2$s</xliff:g> की ओर से <xliff:g id="APP_NAME">%1$s</xliff:g>, आपके डिवाइस में मौजूद ऐप्लिकेशन को अन्य डिवाइसों पर दिखाने और स्ट्रीम करने की अनुमति मांग रहा है"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; को आपके <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> की यह जानकारी ऐक्सेस करने दें"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"आपके <xliff:g id="DEVICE_NAME">%2$s</xliff:g> की ओर से <xliff:g id="APP_NAME">%1$s</xliff:g>, आपके <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> में मौजूद फ़ोटो, मीडिया, और सूचनाओं को ऐक्सेस करने की अनुमति मांग रहा है"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"क्या &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; को आपके <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> के ऐप्लिकेशन और सिस्टम की सुविधाओं को &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; पर स्ट्रीम करने की अनुमति देनी है?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> के पास ऐसे किसी भी कॉन्टेंट का ऐक्सेस होगा जो आपके <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> पर दिखता है या चलाया जाता है. इसमें ऑडियो, फ़ोटो, पेमेंट की जानकारी, पासवर्ड, और मैसेज भी शामिल हैं.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME">%3$s</xliff:g> पर तब ऐप्लिकेशन और सिस्टम की सुविधाओं को स्ट्रीम कर सकेगा, जब तक आप यह अनुमति हटा न दें."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"आपके <xliff:g id="DEVICE_NAME">%2$s</xliff:g> की ओर से <xliff:g id="APP_NAME">%1$s</xliff:g>, आपके डिवाइस में मौजूद ऐप्लिकेशन और सिस्टम की अन्य सुविधाओं को आपके दूसरे डिवाइसों पर स्ट्रीम करने की अनुमति मांग रहा है"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"डिवाइस"</string>
     <string name="summary_generic" msgid="1761976003668044801">"यह ऐप्लिकेशन, आपके फ़ोन और चुने हुए डिवाइस के बीच जानकारी सिंक करेगा. जैसे, कॉल करने वाले व्यक्ति का नाम"</string>
     <string name="consent_yes" msgid="8344487259618762872">"अनुमति दें"</string>
diff --git a/packages/CompanionDeviceManager/res/values-hr/strings.xml b/packages/CompanionDeviceManager/res/values-hr/strings.xml
index 2d94b67..6b3e204 100644
--- a/packages/CompanionDeviceManager/res/values-hr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hr/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Dopustiti aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da upravlja uređajem &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"uređaj"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Aplikacija će moći pristupati ovim dopuštenjima na vašem uređaju <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Želite li dopustiti aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da streama aplikacije uređaja <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> na uređaj &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"Aplikacija <xliff:g id="APP_NAME_0">%1$s</xliff:g> imat će pristup svemu što je vidljivo ili se reproducira na uređaju <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, uključujući zvuk, fotografije, zaporke i poruke.&lt;br/&gt;&lt;br/&gt;Aplikacija <xliff:g id="APP_NAME_1">%1$s</xliff:g> moći će streamati aplikacije na uređaj <xliff:g id="DEVICE_NAME">%3$s</xliff:g> dok ne uklonite pristup za to dopuštenje."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahtijeva dopuštenje u ime vašeg uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> za prikaz i streaming aplikacija s jednog uređaja na drugi"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Omogućite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da pristupa informacijama s vašeg uređaja <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahtijeva dopuštenje u ime vašeg uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> za pristup fotografijama, medijskim sadržajima i obavijestima na uređaju <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Želite li dopustiti uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; da streama aplikacije i značajke sustava uređaja <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> na uređaj &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"Aplikacija <xliff:g id="APP_NAME_0">%1$s</xliff:g> imat će pristup svemu što je vidljivo ili se reproducira na vašem uređaju <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, uključujući zvuk, fotografije, informacije o plaćanju, zaporke i poruke.&lt;br/&gt;&lt;br/&gt;Aplikacija <xliff:g id="APP_NAME_1">%1$s</xliff:g> moći će streamati aplikacije i značajke sustava na uređaj <xliff:g id="DEVICE_NAME">%3$s</xliff:g> dok ne uklonite pristup za to dopuštenje."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahtjeva dopuštenja u ime vašeg uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> za stream aplikacija i drugih značajki sustava između vaših uređaja"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Ta će aplikacija moći sinkronizirati podatke između vašeg telefona i odabranog uređaja, primjerice ime pozivatelja"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Dopusti"</string>
diff --git a/packages/CompanionDeviceManager/res/values-hu/strings.xml b/packages/CompanionDeviceManager/res/values-hu/strings.xml
index b63f8ab..31d9828 100644
--- a/packages/CompanionDeviceManager/res/values-hu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hu/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Engedélyezi, hogy a(z) &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; kezelje a következő eszközt: &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"eszköz"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Az alkalmazás hozzáférhet majd ezekhez az engedélyekhez a következőn: <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Engedélyezi a(z) &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; számára a(z) <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> alkalmazásainak streamelését a következőre: &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"A(z) <xliff:g id="APP_NAME_0">%1$s</xliff:g> hozzáférhet a(z) <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> minden látható vagy lejátszható tartalmához, így az audiotartalmakhoz, fényképekhez, jelszavakhoz és üzenetekhez is.&lt;br/&gt;&lt;br/&gt;Amíg Ön el nem távolítja az ehhez az engedélyhez való hozzáférést, a(z) <xliff:g id="APP_NAME_1">%1$s</xliff:g> képes lesz majd az alkalmazások és a rendszerfunkciók <xliff:g id="DEVICE_NAME">%3$s</xliff:g> eszközre való streamelésére."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> engedélyt kér a(z) <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nevében az alkalmazások eszközök közötti megjelenítéséhez és streameléséhez."</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Engedélyezi a(z) &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; alkalmazás számára az ehhez az információhoz való hozzáférést a(z) <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> esetén"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> engedélyt kér a(z) <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nevében a(z) <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> fotóihoz, médiatartalmaihoz és értesítéseihez való hozzáféréshez"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Engedélyezi a(z) &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; számára a(z) <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> alkalmazásainak és rendszerfunkcióinak streamelését a következőre: &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"A(z) <xliff:g id="APP_NAME_0">%1$s</xliff:g> hozzáférhet a(z) <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> minden látható vagy lejátszható tartalmához, így az audiotartalmakhoz, fényképekhez, fizetési adatokhoz, jelszavakhoz és üzenetekhez is.&lt;br/&gt;&lt;br/&gt;Amíg Ön el nem távolítja az ehhez az engedélyhez való hozzáférést, a(z) <xliff:g id="APP_NAME_1">%1$s</xliff:g> képes lesz majd az alkalmazások és a rendszerfunkciók <xliff:g id="DEVICE_NAME">%3$s</xliff:g> eszközre való streamelésére."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> engedélyt kér a(z) <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nevében az alkalmazások és más rendszerfunkcióknak eszközök közötti streameléséhez"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"eszköz"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Ez az alkalmazás képes lesz szinkronizálni az olyan információkat a telefon és a kiválasztott eszköz között, mint például a hívó fél neve."</string>
     <string name="consent_yes" msgid="8344487259618762872">"Engedélyezés"</string>
diff --git a/packages/CompanionDeviceManager/res/values-hy/strings.xml b/packages/CompanionDeviceManager/res/values-hy/strings.xml
index f90a324..a4238c0 100644
--- a/packages/CompanionDeviceManager/res/values-hy/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hy/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Թույլատրե՞լ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածին կառավարել &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; սարքը"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"սարք"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Այս հավելվածը կստանա հետևյալ թույլտվությունները ձեր <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>ում"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Թույլատրե՞լ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածին հեռարձակել ձեր <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ի հավելվածները &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; սարքին։"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> հավելվածին հասանելի կլինի ձեր <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ում ցուցադրվող կամ նվագարկվող բովանդակությունը՝ ներառյալ աուդիոն, լուսանկարները, գաղտնաբառերը և հաղորդագրությունները։&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> հավելվածը կկարողանա հավելվածներ հեռարձակել <xliff:g id="DEVICE_NAME">%3$s</xliff:g> սարքին, քանի դեռ չեք չեղարկել այս թույլտվությունը։"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը ձեր <xliff:g id="DEVICE_NAME">%2$s</xliff:g> սարքի անունից թույլտվություն է խնդրում՝ ձեր սարքերի միջև հավելվածներ հեռարձակելու համար"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Թույլատրեք &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածին օգտագործել այս տեղեկությունները ձեր <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ից"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը ձեր <xliff:g id="DEVICE_NAME">%2$s</xliff:g> սարքի անունից թույլտվություն է խնդրում՝ ձեր <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>ի լուսանկարները, մեդիաֆայլերն ու ծանուցումները տեսնելու համար"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Թույլատրե՞լ &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; սարքին հեռարձակել ձեր <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ի հավելվածները և համակարգի գործառույթները &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; սարքին։"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> հավելվածին հասանելի կլինի ձեր <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ում ցուցադրվող կամ նվագարկվող բովանդակությունը՝ ներառյալ աուդիոն, լուսանկարները, վճարային տեղեկությունները, գաղտնաբառերը և հաղորդագրությունները։&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> հավելվածը կկարողանա հավելվածներ և համակարգի գործառույթներ հեռարձակել <xliff:g id="DEVICE_NAME">%3$s</xliff:g> սարքին, քանի դեռ չեք չեղարկել այս թույլտվությունը։"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը ձեր <xliff:g id="DEVICE_NAME">%2$s</xliff:g> սարքի անունից թույլտվություն է խնդրում՝ ձեր սարքերի միջև հավելվածներ հեռարձակելու համար"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"սարք"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Այս հավելվածը կկարողանա համաժամացնել ձեր հեռախոսի և ընտրված սարքի տվյալները, օր․՝ զանգողի անունը"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Թույլատրել"</string>
diff --git a/packages/CompanionDeviceManager/res/values-in/strings.xml b/packages/CompanionDeviceManager/res/values-in/strings.xml
index 7a9f485..2ee4e89 100644
--- a/packages/CompanionDeviceManager/res/values-in/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-in/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Izinkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; mengelola &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"perangkat"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Aplikasi ini akan diizinkan mengakses izin ini di <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> Anda"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Izinkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; men-streaming aplikasi <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ke &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> akan memiliki akses ke apa pun yang ditampilkan atau diputar di <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, termasuk audio, foto, sandi, dan pesan.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> akan dapat men-streaming aplikasi ke <xliff:g id="DEVICE_NAME">%3$s</xliff:g> hingga Anda menghapus izin ini."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta izin atas nama <xliff:g id="DEVICE_NAME">%2$s</xliff:g> untuk menampilkan dan men-streaming aplikasi di antara perangkat Anda"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Izinkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk mengakses informasi ini dari <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> Anda"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta izin atas nama <xliff:g id="DEVICE_NAME">%2$s</xliff:g> untuk mengakses foto, media, dan notifikasi <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> Anda"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Izinkan &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; men-streaming aplikasi dan fitur sistem <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ke &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> akan memiliki akses ke apa pun yang ditampilkan atau diputar di <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, termasuk audio, foto, info pembayaran, sandi, dan pesan.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> akan dapat men-streaming aplikasi dan fitur sistem ke <xliff:g id="DEVICE_NAME">%3$s</xliff:g> hingga Anda menghapus izin ini."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta izin atas nama <xliff:g id="DEVICE_NAME">%2$s</xliff:g> untuk men-streaming aplikasi dan fitur sistem lainnya di antara perangkat Anda"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"perangkat"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Aplikasi ini akan dapat menyinkronkan info, seperti nama penelepon, antara ponsel dan perangkat yang dipilih"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Izinkan"</string>
diff --git a/packages/CompanionDeviceManager/res/values-is/strings.xml b/packages/CompanionDeviceManager/res/values-is/strings.xml
index 3a41706..d86f5da 100644
--- a/packages/CompanionDeviceManager/res/values-is/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-is/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Leyfa &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; að stjórna &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"tæki"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Þetta forrit fær aðgang að eftirfarandi heimildum í <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Leyfa &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; að streyma forritum í <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> í ;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> fær aðgang að öllu sem er sýnilegt eða spilað í <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, þ.m.t. hljóði, myndum, greiðsluupplýsingum, aðgangsorðum og skilaboðum.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> getur streymt forritum í <xliff:g id="DEVICE_NAME">%3$s</xliff:g> þar til þú fjarlægir aðgang að þessari heimild."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> biður um heimild fyrir <xliff:g id="DEVICE_NAME">%2$s</xliff:g> til að birta og streyma forritum á milli tækjanna þinna"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Veita &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aðgang að þessum upplýsingum úr <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> biður um heimild fyrir <xliff:g id="DEVICE_NAME">%2$s</xliff:g> vegna aðgangs að myndum, margmiðlunarefni og tilkynningum í <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Leyfa &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; að streyma forritum og kerfiseiginleikum í <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> í &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> fær aðgang að öllu sem er sýnilegt eða spilað í <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, þ.m.t. hljóði, myndum, greiðsluupplýsingum, aðgangsorðum og skilaboðum.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> getur streymt forritum og kerfiseiginleikum í <xliff:g id="DEVICE_NAME">%3$s</xliff:g> þar til þú fjarlægir aðgang að þessari heimild."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> biður um heimild fyrir <xliff:g id="DEVICE_NAME">%2$s</xliff:g> til að streyma forritum og öðrum kerfiseiginleikum á milli tækjanna þinna"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"tæki"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Þetta forrit mun geta samstillt upplýsingar, t.d. nafn þess sem hringir, á milli símans og valins tækis"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Leyfa"</string>
diff --git a/packages/CompanionDeviceManager/res/values-it/strings.xml b/packages/CompanionDeviceManager/res/values-it/strings.xml
index b85ce64..2fdcaf0 100644
--- a/packages/CompanionDeviceManager/res/values-it/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-it/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Vuoi consentire all\'app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; di gestire &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Questa app potrà accedere alle seguenti autorizzazioni <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>:"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Consentire all\'app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; di riprodurre in streaming le app <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> su &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> avrà accesso a tutti i contenuti visibili o riprodotti <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, inclusi audio, foto, password e messaggi.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> sarà in grado di riprodurre in streaming le app su <xliff:g id="DEVICE_NAME">%3$s</xliff:g> finché non rimuoverai l\'accesso a questa autorizzazione."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> richiede per conto di <xliff:g id="DEVICE_NAME">%2$s</xliff:g> l\'autorizzazione a mostrare e riprodurre in streaming app tra i dispositivi"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Consenti all\'app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; di accedere a queste informazioni <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> richiede per conto di <xliff:g id="DEVICE_NAME">%2$s</xliff:g> l\'autorizzazione ad accedere a foto, contenuti multimediali e notifiche <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Consentire all\'app &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; di riprodurre in streaming le app e le funzionalità di sistema <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> su &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> avrà accesso a tutti i contenuti visibili o riprodotti <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, inclusi audio, foto, dati di pagamento, password e messaggi.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> sarà in grado di riprodurre in streaming app e funzionalità di sistema su <xliff:g id="DEVICE_NAME">%3$s</xliff:g> finché non rimuoverai l\'accesso a questa autorizzazione."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> richiede per conto di <xliff:g id="DEVICE_NAME">%2$s</xliff:g> l\'autorizzazione a riprodurre in streaming app e altre funzionalità di sistema tra i dispositivi"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Questa app potrà sincronizzare informazioni, ad esempio il nome di un chiamante, tra il telefono e il dispositivo scelto"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Consenti"</string>
diff --git a/packages/CompanionDeviceManager/res/values-iw/strings.xml b/packages/CompanionDeviceManager/res/values-iw/strings.xml
index 8148f56..2efb77e 100644
--- a/packages/CompanionDeviceManager/res/values-iw/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-iw/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"‏מתן הרשאה לאפליקציה ‎&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&amp;g;‎‏ לנהל את ‎&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;‎‏"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"מכשיר"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"האפליקציה הזו תוכל לגשת להרשאות האלה ב<xliff:g id="DEVICE_TYPE">%1$s</xliff:g> שלך"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"‏לאשר לאפליקציית &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; לשדר את האפליקציות של ה<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ל-&lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"‏לאפליקציה <xliff:g id="APP_NAME_0">%1$s</xliff:g> תהיה גישה לכל מה שרואים או מפעילים ב<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, כולל אודיו, תמונות, סיסמאות והודעות.&lt;br/&gt;&lt;br/&gt;לאפליקציה <xliff:g id="APP_NAME_1">%1$s</xliff:g> תהיה אפשרות לשדר אפליקציות ל-<xliff:g id="DEVICE_NAME">%3$s</xliff:g> עד שהגישה להרשאה הזו תוסר."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת הרשאה ל-<xliff:g id="DEVICE_NAME">%2$s</xliff:g> כדי להציג ולשדר אפליקציות בין המכשירים שלך"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"‏מתן אישור לאפליקציה &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; לגשת למידע הזה מה<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> שלך"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת הרשאה ל-<xliff:g id="DEVICE_NAME">%2$s</xliff:g> כדי לגשת לתמונות, למדיה ולהתראות ב<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"‏לאשר ל-&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; לשדר אפליקציות ותכונות מערכת אחרות של ה<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> למכשיר &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"‏לאפליקציה <xliff:g id="APP_NAME_0">%1$s</xliff:g> תהיה גישה לכל מה שרואים או מפעילים ב<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, כולל אודיו, תמונות, פרטי תשלום, סיסמאות והודעות.&lt;br/&gt;&lt;br/&gt;לאפליקציה <xliff:g id="APP_NAME_1">%1$s</xliff:g> תהיה אפשרות לשדר אפליקציות ותכונות מערכת ל-<xliff:g id="DEVICE_NAME">%3$s</xliff:g> עד שהגישה להרשאה הזו תוסר."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת הרשאה ל<xliff:g id="DEVICE_NAME">%2$s</xliff:g> כדי לשדר אפליקציות ותכונות מערכת אחרות בין המכשירים שלך"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"מכשיר"</string>
     <string name="summary_generic" msgid="1761976003668044801">"האפליקציה הזו תוכל לסנכרן מידע, כמו השם של מישהו שמתקשר, מהטלפון שלך למכשיר שבחרת"</string>
     <string name="consent_yes" msgid="8344487259618762872">"יש אישור"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ja/strings.xml b/packages/CompanionDeviceManager/res/values-ja/strings.xml
index 173a72f..639e8bc 100644
--- a/packages/CompanionDeviceManager/res/values-ja/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ja/strings.xml
@@ -25,17 +25,17 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; に &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; の管理を許可しますか?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"デバイス"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"このアプリは、<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>の以下の権限にアクセスできるようになります"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> のアプリを &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; にストリーミングすることを &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; に許可しますか?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> は、音声、写真、パスワード、メッセージを含め、<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>で表示、再生されるすべてのコンテンツにアクセスできるようになります。&lt;br/&gt;&lt;br/&gt;この権限へのアクセス権を削除するまで、<xliff:g id="APP_NAME_1">%1$s</xliff:g> は <xliff:g id="DEVICE_NAME">%3$s</xliff:g> にアプリをストリーミングできます。"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> が <xliff:g id="DEVICE_NAME">%2$s</xliff:g> に代わってデバイス間でアプリを表示およびストリーミングする権限をリクエストしています"</string>
+    <string name="title_app_streaming" msgid="1047090167914857893">"<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> のアプリとシステム機能を &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; にストリーミングすることを &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; に許可しますか?"</string>
+    <string name="summary_app_streaming" msgid="7990244299655610920">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> は、音声、写真、お支払い情報、パスワード、メッセージを含め、<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> で表示、再生されるすべてのコンテンツにアクセスできるようになります。&lt;br/&gt;&lt;br/&gt;この権限へのアクセス権を削除するまで、<xliff:g id="APP_NAME_1">%1$s</xliff:g> は <xliff:g id="DEVICE_NAME">%3$s</xliff:g> にアプリをストリーミングできます。"</string>
+    <string name="helper_summary_app_streaming" msgid="1872657107404139828">"<xliff:g id="APP_NAME">%1$s</xliff:g> が <xliff:g id="DEVICE_NAME">%2$s</xliff:g> に代わって、アプリやシステム機能を <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> からストリーミングする権限をリクエストしています"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>のこの情報へのアクセスを &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; に許可"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> が <xliff:g id="DEVICE_NAME">%2$s</xliff:g> に代わって<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>の写真、メディア、通知にアクセスする権限をリクエストしています"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> のアプリとシステム機能を &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; にストリーミングすることを &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; に許可しますか?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> は、音声、写真、お支払い情報、パスワード、メッセージを含め、<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>で表示、再生されるすべてのコンテンツにアクセスできるようになります。&lt;br/&gt;&lt;br/&gt;この権限へのアクセス権を削除するまで、<xliff:g id="APP_NAME_1">%1$s</xliff:g> は <xliff:g id="DEVICE_NAME">%3$s</xliff:g> にアプリとシステム機能をストリーミングできます。"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> が <xliff:g id="DEVICE_NAME">%2$s</xliff:g> に代わって、アプリやその他のシステム機能をデバイス間でストリーミングする権限をリクエストしています"</string>
+    <string name="title_nearby_device_streaming" msgid="2727103756701741359">"<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> のアプリを &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; にストリーミングすることを &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; に許可しますか?"</string>
+    <string name="summary_nearby_device_streaming" msgid="70434958004946884">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> は、音声、写真、お支払い情報、パスワード、メッセージを含め、<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g> で表示、再生されるすべてのコンテンツにアクセスできるようになります。&lt;br/&gt;&lt;br/&gt;この権限へのアクセス権を削除するまで、<xliff:g id="APP_NAME_2">%1$s</xliff:g> は <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> にアプリをストリーミングできます。"</string>
+    <string name="helper_summary_nearby_device_streaming" msgid="4712712177819370967">"<xliff:g id="APP_NAME">%1$s</xliff:g> が <xliff:g id="DEVICE_NAME">%2$s</xliff:g> に代わって、アプリを <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> からストリーミングする権限をリクエストしています"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"デバイス"</string>
     <string name="summary_generic" msgid="1761976003668044801">"このアプリは、あなたのスマートフォンと選択したデバイスとの間で、通話相手の名前などの情報を同期できるようになります"</string>
     <string name="consent_yes" msgid="8344487259618762872">"許可"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ka/strings.xml b/packages/CompanionDeviceManager/res/values-ka/strings.xml
index 507d13c..949d64b 100644
--- a/packages/CompanionDeviceManager/res/values-ka/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ka/strings.xml
@@ -25,17 +25,17 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"ნება დართეთ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/strong&gt; მართოს &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"მოწყობილობა"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"ეს აპი შეძლებს წვდომას თქვენს <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>-ზე არსებულ ამ ნებართვებზე"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"გსურთ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-ს მისცეთ თქვენი <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-ის აპების სტრიმინგის საშუალება &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;-ზე?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>-ს ექნება წვდომა ყველაფერზე, რაც ჩანს ან უკრავს <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-ზე, მათ შორის, აუდიოზე, ფოტოებზე, პაროლებსა და შეტყობინებებზე.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> შეძლებს აპების სტრიმინგს <xliff:g id="DEVICE_NAME">%3$s</xliff:g>-ზე მანამ, სანამ თქვენ არ გააუქმებთ წვდომას ამ ნებართვაზე."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს ნებართვას თქვენი (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) სახელით, რათა წარმოაჩინოს და მოახდინოს აპების სტრიმინგი თქვენს მოწყობილობებს შორის"</string>
+    <string name="title_app_streaming" msgid="1047090167914857893">"გსურთ, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-ს მისცეთ თქვენი <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-ის აპებისა და სისტემის ფუნქციების სტრიმინგის საშუალება &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;-ზე?"</string>
+    <string name="summary_app_streaming" msgid="7990244299655610920">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> მიიღებს წვდომას ყველაფერზე, რაც ჩანს ან უკრავს თქვენს <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-ზე, მათ შორის, აუდიოზე, ფოტოებზე, გადახდის ინფორმაციაზე, პაროლებსა და შეტყობინებებზე.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> შეძლებს აპების სტრიმინგს <xliff:g id="DEVICE_NAME">%3$s</xliff:g>-ზე მანამ, სანამ თქვენ არ გააუქმებთ წვდომას ამ ნებართვაზე."</string>
+    <string name="helper_summary_app_streaming" msgid="1872657107404139828">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს ნებართვას <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-ის სახელით აპებისა და სისტემური ფუნქციების სტრიმინგისთვის თქვენი <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>-იდან"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-ის წვდომის დაშვება თქვენს <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-ში არსებულ ამ ინფორმაციაზე"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს ნებართვას თქვენი (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) სახელით, რათა მოიპოვოს წვდომა თქვენი <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>-ის ფოტოებზე, მედიასა და შეტყობინებებზე"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"გსურთ &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt;-ს მისცეთ თქვენი <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-ის აპებისა და სისტემის ფუნქციების სტრიმინგის საშუალება &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;-ზე?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>-ს ექნება წვდომა ყველაფერზე, რაც ჩანს ან უკრავს თქვენს <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-ზე, მათ შორის, აუდიოზე, ფოტოებზე, გადახდის ინფორმაციაზე, პაროლებსა და შეტყობინებებზე.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> შეძლებს აპებისა და სისტემის ფუნქციების სტრიმინგს <xliff:g id="DEVICE_NAME">%3$s</xliff:g>-ზე მანამ, სანამ თქვენ არ გააუქმებთ წვდომას ამ ნებართვაზე."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს ნებართვას თქვენი (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) სახელით, რათა მოახდინოს აპებისა და სისტემის სხვა ფუნქციების სტრიმინგი თქვენს მოწყობილობებს შორის"</string>
+    <string name="title_nearby_device_streaming" msgid="2727103756701741359">"გსურთ, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-ს მისცეთ თქვენი <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-ის აპების სტრიმინგის საშუალება &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;-ზე?"</string>
+    <string name="summary_nearby_device_streaming" msgid="70434958004946884">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> მიიღებს წვდომას ყველაფერზე, რაც ჩანს ან უკრავს <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>-ზე, მათ შორის, აუდიოზე, ფოტოებზე, პაროლებსა და შეტყობინებებზე.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_2">%1$s</xliff:g> შეძლებს აპების სტრიმინგს <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g>-ზე მანამ, სანამ თქვენ არ გააუქმებთ წვდომას ამ ნებართვაზე."</string>
+    <string name="helper_summary_nearby_device_streaming" msgid="4712712177819370967">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს ნებართვას <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-ის სახელით აპების სტრიმინგისთვის თქვენი <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>-იდან"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"მოწყობილობა"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ეს აპი შეძლებს ინფორმაციის სინქრონიზებას თქვენს ტელეფონსა და თქვენ მიერ არჩეულ მოწყობილობას შორის, მაგალითად, იმ ადამიანის სახელის, რომელიც გირეკავთ"</string>
     <string name="consent_yes" msgid="8344487259618762872">"დაშვება"</string>
diff --git a/packages/CompanionDeviceManager/res/values-kk/strings.xml b/packages/CompanionDeviceManager/res/values-kk/strings.xml
index 16a02dc..f392c10 100644
--- a/packages/CompanionDeviceManager/res/values-kk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-kk/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; құрылғысын басқаруға рұқсат беру керек пе?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"құрылғы"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Бұл қолданба құрылғыда (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>) осы рұқсаттарды пайдалана алады."</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына құрылғыңыздағы (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) қолданбаларды &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; құрылғысына трансляциялауға рұқсат берілсін бе?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> қолданбасы құрылғыда (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) көрінетін не ойнатылатын барлық контентті (аудиофайлдарды, фотосуреттерді, құпия сөздер мен хабарларды қоса алғанда) пайдалана алады.&lt;br/&gt;&lt;br/&gt;Осы рұқсатты өшірмесеңіз, <xliff:g id="APP_NAME_1">%1$s</xliff:g> қолданбасы құрылғысына (<xliff:g id="DEVICE_NAME">%3$s</xliff:g>) қолданбаларды трансляциялай алады."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DEVICE_NAME">%2$s</xliff:g> атынан құрылғыларыңыздың арасында қолданбаларды көрсетуге және трансляциялауға рұқсат сұрайды."</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына құрылғыңыздағы (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) осы ақпаратты пайдалануға рұқсат беріңіз."</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DEVICE_NAME">%2$s</xliff:g> атынан құрылғыңыздағы (<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>) фотосуреттерді, медиафайлдар мен хабарландыруларды пайдалануға рұқсат сұрайды."</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; қолданбасына құрылғыңыздағы (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) қолданбалар мен жүйе функцияларын &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; құрылғысына трансляциялауға рұқсат берілсін бе?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> қолданбасы құрылғыңызда (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) көрінетін не ойнатылатын барлық контентті (аудиофайлдарды, фотосуреттерді, төлем туралы ақпаратты, құпия сөздер мен хабарларды қоса алғанда) пайдалана алады.&lt;br/&gt;&lt;br/&gt;Осы рұқсатты өшірмесеңіз, <xliff:g id="APP_NAME_1">%1$s</xliff:g> қолданбасы құрылғыға (<xliff:g id="DEVICE_NAME">%3$s</xliff:g>) қолданбаларды және жүйе функцияларын трансляциялай алады."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DEVICE_NAME">%2$s</xliff:g> атынан құрылғыларыңыздың арасында қолданбаларды және басқа жүйе функцияларын трансляциялауға рұқсат сұрайды."</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"құрылғы"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Бұл қолданба телефон мен таңдалған құрылғы арасында деректі (мысалы, қоңырау шалушының атын) синхрондай алады."</string>
     <string name="consent_yes" msgid="8344487259618762872">"Рұқсат беру"</string>
diff --git a/packages/CompanionDeviceManager/res/values-km/strings.xml b/packages/CompanionDeviceManager/res/values-km/strings.xml
index e59db72..149c624 100644
--- a/packages/CompanionDeviceManager/res/values-km/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-km/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"អនុញ្ញាតឱ្យ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; គ្រប់គ្រង &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ឬ?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"ឧបករណ៍"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"កម្មវិធីនេះ​នឹងត្រូវបានអនុញ្ញាតឱ្យ​ចូលប្រើការអនុញ្ញាតទាំងនេះ​នៅលើ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> របស់អ្នក"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"អនុញ្ញាតឱ្យ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ផ្សាយកម្មវិធីលើ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> របស់អ្នកទៅ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; ឬ?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> នឹងមានសិទ្ធិចូលប្រើអ្វីៗដែលអាចមើលឃើញ ឬត្រូវបានចាក់នៅលើ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> រួមទាំងសំឡេង រូបថត ពាក្យសម្ងាត់ និងសារ។&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> នឹងអាចផ្សាយកម្មវិធី <xliff:g id="DEVICE_NAME">%3$s</xliff:g> រហូតទាល់តែអ្នកដកសិទ្ធិចូលប្រើការអនុញ្ញាតនេះចេញ។"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងស្នើសុំការអនុញ្ញាតជំនួសឱ្យ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> របស់អ្នក ដើម្បីបង្ហាញ និងផ្សាយកម្មវិធីរវាងឧបករណ៍នានារបស់អ្នក"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"អនុញ្ញាតឱ្យ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ចូលប្រើព័ត៌មាននេះពី <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> របស់អ្នក"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងស្នើសុំការអនុញ្ញាតជំនួសឱ្យ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> របស់អ្នក ដើម្បីចូលប្រើរូបថត មេឌៀ និងការជូនដំណឹងរបស់ <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> អ្នក"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"អនុញ្ញាតឱ្យ &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; ផ្សាយមុខងារប្រព័ន្ធ និងកម្មវិធីលើ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> របស់អ្នកទៅ &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; ឬ?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> នឹងមានសិទ្ធិចូលប្រើអ្វីៗដែលអាចមើលឃើញ ឬត្រូវបានចាក់នៅលើ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> របស់អ្នក រួមទាំងសំឡេង រូបថត ព័ត៌មាននៃការទូទាត់ប្រាក់ ពាក្យសម្ងាត់ និងសារ។&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> នឹងអាចផ្សាយកម្មវិធី និងមុខងារប្រព័ន្ធទៅ <xliff:g id="DEVICE_NAME">%3$s</xliff:g> រហូតទាល់តែអ្នកដកសិទ្ធិចូលប្រើការអនុញ្ញាតនេះចេញ។"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងស្នើសុំ​ការអនុញ្ញាតជំនួសឱ្យ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> របស់អ្នក ដើម្បីផ្សាយកម្មវិធី និងមុខងារប្រព័ន្ធផ្សេងទៀតរវាងឧបករណ៍របស់អ្នក"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"ឧបករណ៍"</string>
     <string name="summary_generic" msgid="1761976003668044801">"កម្មវិធីនេះនឹងអាច​ធ្វើសមកាលកម្មព័ត៌មាន ដូចជាឈ្មោះមនុស្សដែលហៅទូរសព្ទជាដើម​ រវាងឧបករណ៍ដែលបានជ្រើសរើស និងទូរសព្ទរបស់អ្នក"</string>
     <string name="consent_yes" msgid="8344487259618762872">"អនុញ្ញាត"</string>
diff --git a/packages/CompanionDeviceManager/res/values-kn/strings.xml b/packages/CompanionDeviceManager/res/values-kn/strings.xml
index ea7d824..df7f4f4 100644
--- a/packages/CompanionDeviceManager/res/values-kn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-kn/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;? ನಿರ್ವಹಿಸಲು &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"ಸಾಧನ"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"ನಿಮ್ಮ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> ನಲ್ಲಿ ಈ ಅನುಮತಿಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್‌ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ ಅನ್ನು ಅನುಮತಿಸಲಾಗುತ್ತದೆ"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"ನಿಮ್ಮ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ನ ಆ್ಯಪ್‌ಗಳನ್ನು <xliff:g id="DEVICE_NAME">%3$s</xliff:g> ಗೆ ಸ್ಟ್ರೀಮ್ ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"ನಿಮ್ಮ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ನಲ್ಲಿನ ಆಡಿಯೋ, ಫೋಟೋಗಳು, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಸಂದೇಶಗಳು ಸೇರಿದಂತೆ <xliff:g id="APP_NAME_0">%1$s</xliff:g> ನಲ್ಲಿ ಗೋಚರಿಸುವ ಅಥವಾ ಪ್ಲೇ ಆಗುವ ಯಾವುದಕ್ಕೂ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ನೀವು ಈ ಅನುಮತಿಗೆ <xliff:g id="DEVICE_NAME">%3$s</xliff:g> ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ತೆಗೆದುಹಾಕುವವರೆಗೆ <xliff:g id="APP_NAME_1">%1$s</xliff:g> ಗೆ ಆ್ಯಪ್‌ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"ನಿಮ್ಮ ಸಾಧನಗಳ ನಡುವೆ ಆ್ಯಪ್‌ಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲು ಮತ್ತು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ನಿಮ್ಮ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ಪರವಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸುತ್ತಿದೆ"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"ನಿಮ್ಮ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ನಿಂದ ಈ ಮಾಹಿತಿಯನ್ನು ಆ್ಯಕ್ಸೆಸ್‌ ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಿ"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"ನಿಮ್ಮ <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> ನ ಫೋಟೋಗಳು, ಮೀಡಿಯಾ ಮತ್ತು ನೋಟಿಫಿಕೇಶನ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್‌ ಮಾಡಲು ನಿಮ್ಮ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ಪರವಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸುತ್ತಿದೆ"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"ನಿಮ್ಮ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ನ ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಸಿಸ್ಟಮ್ ಫೀಚರ್‌ಗಳನ್ನು <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g> ಗೆ ಸ್ಟ್ರೀಮ್ ಮಾಡಲು <xliff:g id="DEVICE_NAME_0">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"ನಿಮ್ಮ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ನಲ್ಲಿನ ಆಡಿಯೋ, ಫೋಟೋಗಳು, ಪಾವತಿ ಮಾಹಿತಿ, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಸಂದೇಶಗಳು ಸೇರಿದಂತೆ ನಿಮ್ಮ <xliff:g id="APP_NAME_0">%1$s</xliff:g> ನಲ್ಲಿ ಗೋಚರಿಸುವ ಅಥವಾ ಪ್ಲೇ ಆಗುವ ಯಾವುದಕ್ಕೂ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ನೀವು ಈ ಅನುಮತಿಗೆ <xliff:g id="DEVICE_NAME">%3$s</xliff:g> ಆ್ಯಕ್ಸೆಸ್‌ ಅನ್ನು ತೆಗೆದುಹಾಕುವವರೆಗೆ <xliff:g id="APP_NAME_1">%1$s</xliff:g> ಗೆ ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಸಿಸ್ಟಮ್ ಫೀಚರ್‌ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ ."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಮ್ಮ ಸಾಧನಗಳ ನಡುವೆ ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಇತರ ಸಿಸ್ಟಮ್ ಫೀಚರ್‌ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ನಿಮ್ಮ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ಪರವಾಗಿ ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸುತ್ತಿದೆ"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"ಸಾಧನ"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ಮೊಬೈಲ್ ಫೋನ್ ಮತ್ತು ಆಯ್ಕೆಮಾಡಿದ ಸಾಧನದ ನಡುವೆ, ಕರೆ ಮಾಡುವವರ ಹೆಸರಿನಂತಹ ಮಾಹಿತಿಯನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ"</string>
     <string name="consent_yes" msgid="8344487259618762872">"ಅನುಮತಿಸಿ"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ko/strings.xml b/packages/CompanionDeviceManager/res/values-ko/strings.xml
index 4ff768e..0192eea 100644
--- a/packages/CompanionDeviceManager/res/values-ko/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ko/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;에서 &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; 기기를 관리하도록 허용하시겠습니까?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"기기"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"앱이 <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>에서 이러한 권한에 액세스할 수 있게 됩니다."</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;에서 <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>의 앱을 &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; 기기로 스트리밍하도록 허용하시겠습니까?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>에서 오디오, 사진, 비밀번호, 메시지 등 <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>에 표시되거나 해당 기기에서 재생되는 모든 항목에 액세스할 수 있습니다.&lt;br/&gt;&lt;br/&gt;이 권한에 대한 액세스를 삭제할 때까지 <xliff:g id="APP_NAME_1">%1$s</xliff:g>에서 <xliff:g id="DEVICE_NAME">%3$s</xliff:g> 기기로 앱을 스트리밍할 수 있습니다."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DEVICE_NAME">%2$s</xliff:g> 대신 기기 간에 앱을 표시하고 스트리밍할 수 있는 권한을 요청하고 있습니다."</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; 앱이 <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>에서 이 정보에 액세스하도록 허용합니다."</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DEVICE_NAME">%2$s</xliff:g> 대신 <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>의 사진, 미디어, 알림에 액세스할 수 있는 권한을 요청하고 있습니다."</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt;에서 <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>의 앱 및 시스템 기능을 &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; 기기로 스트리밍하도록 허용하시겠습니까?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>에서 오디오, 사진, 결제 정보, 비밀번호, 메시지 등 <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>에 표시되거나 해당 기기에서 재생되는 모든 항목에 액세스할 수 있습니다.&lt;br/&gt;&lt;br/&gt;이 권한에 대한 액세스를 삭제할 때까지 <xliff:g id="APP_NAME_1">%1$s</xliff:g>에서 <xliff:g id="DEVICE_NAME">%3$s</xliff:g> 기기로 앱 및 시스템 기능을 스트리밍할 수 있습니다."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DEVICE_NAME">%2$s</xliff:g> 대신 기기 간에 앱 및 다른 시스템 기능을 스트리밍할 권한을 요청하고 있습니다."</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"기기"</string>
     <string name="summary_generic" msgid="1761976003668044801">"이 앱에서 휴대전화와 선택한 기기 간에 정보(예: 발신자 이름)를 동기화할 수 있게 됩니다."</string>
     <string name="consent_yes" msgid="8344487259618762872">"허용"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ky/strings.xml b/packages/CompanionDeviceManager/res/values-ky/strings.xml
index 3e265a2..d74436f 100644
--- a/packages/CompanionDeviceManager/res/values-ky/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ky/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; колдонмосуна &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; түзмөгүн тескөөгө уруксат бересизби?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"түзмөк"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Бул колдонмого <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> түзмөгүңүздө төмөнкүлөрдү аткарууга уруксат берилет"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; колдонмосуна <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> түзмөгүңүздөгү колдонмолорду &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; түзмөгүнө алып ойнотууга уруксат бересизби?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> түзмөгүндө көрүнгөн же ойнотулган бардык нерселерге, анын ичинде аудио, сүрөттөр, сырсөздөр жана билдирүүлөргө кире алат.&lt;br/&gt;&lt;br/&gt;Бул уруксатты алып салмайынча, <xliff:g id="APP_NAME_1">%1$s</xliff:g> колдонмолорду <xliff:g id="DEVICE_NAME">%3$s</xliff:g> түзмөгүнө алып ойното алат."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосу <xliff:g id="DEVICE_NAME">%2$s</xliff:g> түзмөгүңүздүн атынан түзмөктөрдүн ортосунда колдонмолорду көрсөтүү жана алып ойнотуу үчүн уруксат сурап жатат"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; колдонмосуна <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> түзмөгүңүздөгү ушул маалыматты көрүүгө уруксат бериңиз"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосу <xliff:g id="DEVICE_NAME">%2$s</xliff:g> түзмөгүңүздүн атынан <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> сүрөттөрүн, медиа файлдарын жана билдирмелерин колдонууга уруксат сурап жатат"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; түзмөгүнө <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> түзмөгүндөгү колдонмолорду жана тутумдун функцияларын &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; түзмөгүндө алып ойнотууга уруксат бересизби?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> түзмөгүңүздө көрүнгөн же ойнотулган бардык нерселерге, анын ичинде аудио, сүрөттөр, төлөм маалыматы, сырсөздөр жана билдирүүлөргө кире алат.&lt;br/&gt;&lt;br/&gt;Бул уруксатты алып салмайынча, <xliff:g id="APP_NAME_1">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%3$s</xliff:g> түзмөгүндөгү колдонмолорду жана тутум функцияларын алып ойното алат."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%2$s</xliff:g> түзмөгүңүздүн атынан түзмөктөрдүн ортосунда колдонмолорду жана тутумдун башка функцияларын алып ойнотууга уруксат сурап жатат"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"түзмөк"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Бул колдонмо маалыматты шайкештире алат, мисалы, чалып жаткан кишинин атын телефон жана тандалган түзмөк менен шайкештирет"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Ооба"</string>
diff --git a/packages/CompanionDeviceManager/res/values-lo/strings.xml b/packages/CompanionDeviceManager/res/values-lo/strings.xml
index 2917c3e..f8da499 100644
--- a/packages/CompanionDeviceManager/res/values-lo/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lo/strings.xml
@@ -25,17 +25,17 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"ອະນຸຍາດ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ຈັດການ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ບໍ?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"ອຸປະກອນ"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"ແອັບນີ້ຈະໄດ້ຮັບສິດເຂົ້າເຖິງການອະນຸຍາດເຫຼົ່ານີ້ຢູ່ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> ຂອງທ່ານ"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"ອະນຸຍາດໃຫ້ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ສະຕຣີມແອັບຂອງ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ຂອງທ່ານໄປຫາ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; ບໍ?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ຈະມີສິດເຂົ້າເຖິງທຸກຢ່າງທີ່ປາກົດ ຫຼື ຫຼິ້ນຢູ່ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, ເຊິ່ງຮວມທັງສຽງ, ຮູບພາບ, ລະຫັດຜ່ານ ແລະ ຂໍ້ຄວາມ.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> ຈະສາມາດສະຕຣີມແອັບໄປຫາ <xliff:g id="DEVICE_NAME">%3$s</xliff:g> ໄດ້ຈົນກວ່າທ່ານຈະລຶບສິດເຂົ້າເຖິງການອະນຸຍາດນີ້ອອກ."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກໍາລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມຂອງ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ຂອງທ່ານເພື່ອສະແດງ ແລະ ສະຕຣີມແອັບລະຫວ່າງອຸປະກອນຕ່າງໆຂອງທ່ານ"</string>
+    <string name="title_app_streaming" msgid="1047090167914857893">"ອະນຸຍາດໃຫ້ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ສະຕຣີມແອັບ ແລະ ຄຸນສົມບັດຂອງລະບົບຂອງ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ຂອງທ່ານໄປຫາ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; ບໍ?"</string>
+    <string name="summary_app_streaming" msgid="7990244299655610920">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ຈະມີສິດເຂົ້າເຖິງທຸກຢ່າງທີ່ປາກົດ ຫຼື ຫຼິ້ນຢູ່ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ຂອງທ່ານ, ເຊິ່ງຮວມທັງສຽງ, ຮູບພາບ, ຂໍ້ມູນການຈ່າຍເງິນ ລະຫັດຜ່ານ ແລະ ຂໍ້ຄວາມ.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> ຈະສາມາດສະຕຣີມແອັບໄປຫາ <xliff:g id="DEVICE_NAME">%3$s</xliff:g> ໄດ້ຈົນກວ່າທ່ານຈະລຶບສິດເຂົ້າເຖິງການອະນຸຍາດນີ້ອອກ."</string>
+    <string name="helper_summary_app_streaming" msgid="1872657107404139828">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກຳລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ເພື່ອສະຕຣີມແອັລ ແລະ ຄຸນສົມບັດລະບົບຈາກ <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> ຂອງທ່ານ"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"ອະນຸຍາດໃຫ້ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ເຂົ້າເຖິງຂໍ້ມູນນີ້ຈາກ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ຂອງທ່ານ"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກຳລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມຂອງ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ຂອງທ່ານເພື່ອເຂົ້າເຖິງຮູບພາບ, ສື່ ແລະ ການແຈ້ງເຕືອນໃນ <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> ຂອງທ່ານ"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"ອະນຸຍາດໃຫ້ &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; ສະຕຣີມແອັບ ແລະ ຄຸນສົມບັດຂອງລະບົບຂອງ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ຂອງທ່ານໄປຫາ &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; ບໍ?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ຈະມີສິດເຂົ້າເຖິງທຸກຢ່າງທີ່ປາກົດ ຫຼື ຫຼິ້ນຢູ່ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ຂອງທ່ານ, ເຊິ່ງຮວມທັງສຽງ, ຮູບພາບ, ຂໍ້ມູນການຈ່າຍເງິນ ລະຫັດຜ່ານ ແລະ ຂໍ້ຄວາມ.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> ຈະສາມາດສະຕຣີມແອັບ ແລະ ຄຸນສົມບັດຂອງລະບົບໄປຫາ <xliff:g id="DEVICE_NAME">%3$s</xliff:g> ໄດ້ຈົນກວ່າທ່ານຈະລຶບສິດເຂົ້າເຖິງການອະນຸຍາດນີ້ອອກ."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກຳລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມຂອງ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ຂອງທ່ານເພື່ອສະຕຣີມແອັບ ແລະ ຄຸນສົມບັດອື່ນໆຂອງລະບົບລະຫວ່າງອຸປະກອນຕ່າງໆຂອງທ່ານ"</string>
+    <string name="title_nearby_device_streaming" msgid="2727103756701741359">"ອະນຸຍາດໃຫ້ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ສະຕຣີມແອັບຂອງ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ຂອງທ່ານໄປຫາ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; ບໍ?"</string>
+    <string name="summary_nearby_device_streaming" msgid="70434958004946884">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ຈະມີສິດເຂົ້າເຖິງທຸກຢ່າງທີ່ປາກົດ ຫຼື ຫຼິ້ນຢູ່ <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>, ເຊິ່ງຮວມທັງສຽງ, ຮູບພາບ, ຂໍ້ມູນການຈ່າຍເງິນ, ລະຫັດຜ່ານ ແລະ ຂໍ້ຄວາມ.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_2">%1$s</xliff:g> ຈະສາມາດສະຕຣີມແອັບໄປຫາ <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> ໄດ້ຈົນກວ່າທ່ານຈະລຶບສິດເຂົ້າເຖິງການອະນຸຍາດນີ້ອອກ."</string>
+    <string name="helper_summary_nearby_device_streaming" msgid="4712712177819370967">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກຳລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ເພື່ອສະຕຣີມແອັບຈາກ <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> ຂອງທ່ານ"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ອຸປະກອນ"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ແອັບນີ້ຈະສາມາດຊິ້ງຂໍ້ມູນ ເຊັ່ນ: ຊື່ຂອງຄົນທີ່ໂທເຂົ້າ, ລະຫວ່າງໂທລະສັບຂອງທ່ານ ແລະ ອຸປະກອນທີ່ເລືອກໄວ້ໄດ້"</string>
     <string name="consent_yes" msgid="8344487259618762872">"ອະນຸຍາດ"</string>
diff --git a/packages/CompanionDeviceManager/res/values-lt/strings.xml b/packages/CompanionDeviceManager/res/values-lt/strings.xml
index a1b5cd9..8a6a564 100644
--- a/packages/CompanionDeviceManager/res/values-lt/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lt/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Leisti &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; valdyti &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"įrenginio"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Šiai programai bus leidžiama pasiekti toliau nurodytus leidimus jūsų <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>."</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Leisti programai &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; srautu perduoti <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> programas į &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"Programa „<xliff:g id="APP_NAME_0">%1$s</xliff:g>“ galės pasiekti visą „<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>“ matomą ar leidžiamą turinį, įskaitant garso įrašus, nuotraukas, slaptažodžius ir pranešimus.&lt;br/&gt;&lt;br/&gt;Programa „<xliff:g id="APP_NAME_1">%1$s</xliff:g>“ galės perduoti srautu programas į „<xliff:g id="DEVICE_NAME">%3$s</xliff:g>“, kol pašalinsite prieigą prie šio leidimo."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ prašo leidimo jūsų „<xliff:g id="DEVICE_NAME">%2$s</xliff:g>“ vardu, kad galėtų rodyti ir srautu perduoti programas iš vieno įrenginio į kitą"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Leisti programai &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pasiekti šią informaciją iš jūsų <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ prašo leidimo jūsų „<xliff:g id="DEVICE_NAME">%2$s</xliff:g>“ vardu, kad galėtų pasiekti <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> nuotraukas, mediją ir pranešimus"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Leisti programai &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; srautu perduoti <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> programas ir sistemos funkcijas į &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"Programa „<xliff:g id="APP_NAME_0">%1$s</xliff:g>“ galės pasiekti visą <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> matomą ar leidžiamą turinį, įskaitant garso įrašus, nuotraukas, mokėjimo informaciją, slaptažodžius ir pranešimus.&lt;br/&gt;&lt;br/&gt;Programa „<xliff:g id="APP_NAME_1">%1$s</xliff:g>“ galės perduoti srautu programas ir sistemos funkcijas į „<xliff:g id="DEVICE_NAME">%3$s</xliff:g>“, kol pašalinsite prieigą prie šio leidimo."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ prašo leidimo jūsų „<xliff:g id="DEVICE_NAME">%2$s</xliff:g>“ vardu, kad galėtų srautu perduoti programas ir kitas sistemos funkcijas iš vieno įrenginio į kitą"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"įrenginys"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Ši programa galės sinchronizuoti tam tikrą informaciją, pvz., skambinančio asmens vardą, su jūsų telefonu ir pasirinktu įrenginiu"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Leisti"</string>
diff --git a/packages/CompanionDeviceManager/res/values-lv/strings.xml b/packages/CompanionDeviceManager/res/values-lv/strings.xml
index 880b981..26f0968 100644
--- a/packages/CompanionDeviceManager/res/values-lv/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lv/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Vai atļaut lietotnei &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; piekļūt ierīcei &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"ierīce"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Šī lietotne drīkstēs piekļūt norādītajām <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> atļaujām."</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Vai atļaut lietotnei &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; straumēt <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> lietotnes ierīcē &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> varēs piekļūt visam <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ekrānā parādītajam vai atskaņotajam saturam, tostarp audio, fotoattēliem, parolēm un ziņojumiem.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> varēs straumēt lietotnes ierīcē <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, līdz noņemsiet piekļuvi šai atļaujai."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> pieprasa atļauju attēlot un straumēt lietotnes starp jūsu ierīcēm šīs ierīces vārdā: <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Vai atļaut lietotnei &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; piekļūt šai informācijai no jūsu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>?"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> pieprasa atļauju piekļūt jūsu <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> fotoattēliem, multivides saturam un paziņojumiem šīs ierīces vārdā: <xliff:g id="DEVICE_NAME">%2$s</xliff:g>."</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Vai atļaut lietotnei &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; straumēt <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> lietotnes un sistēmas funkcijas ierīcē &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> varēs piekļūt visam <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ekrānā parādītajam vai atskaņotajam saturam, tostarp audio, fotoattēliem, maksājumu informācijai, parolēm un ziņojumiem.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> varēs straumēt lietotnes un sistēmas funkcijas ierīcē <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, līdz noņemsiet piekļuvi šai atļaujai."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> pieprasa atļauju straumēt lietotnes un citas sistēmas funkcijas starp jūsu ierīcēm šīs ierīces vārdā: <xliff:g id="DEVICE_NAME">%2$s</xliff:g>."</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"ierīce"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Šī lietotne varēs sinhronizēt informāciju (piemēram, zvanītāja vārdu) starp jūsu tālruni un izvēlēto ierīci"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Atļaut"</string>
diff --git a/packages/CompanionDeviceManager/res/values-mk/strings.xml b/packages/CompanionDeviceManager/res/values-mk/strings.xml
index 219f9d14..c0e48b3 100644
--- a/packages/CompanionDeviceManager/res/values-mk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mk/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Ќе дозволите &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да управува со &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"уред"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Апликацијава ќе може да пристапува до овие дозволи на <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Да се дозволи &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да ги стримува апликациите од <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> на &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ќе има пристап до сè што е видливо или репродуцирано на <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, including вклучувајќи ги и аудиото, фотографиите, лозинките и пораките.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> ќе може да стримува апликации на <xliff:g id="DEVICE_NAME">%3$s</xliff:g> додека не ја повлечете дозволава."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> бара дозвола во име на вашиот <xliff:g id="DEVICE_NAME">%2$s</xliff:g> за да прикажува и стримува апликации меѓу вашите уреди"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Дозволете &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да пристапува до овие податоци на <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> бара дозвола во име на вашиот <xliff:g id="DEVICE_NAME">%2$s</xliff:g> за да пристапува до фотографиите, аудиовизуелните содржини и известувањата на <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Да се дозволи &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; да ги стримува апликациите и системските функции од <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> на &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ќе има пристап до сè што е видливо или репродуцирано на <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, вклучувајќи ги и аудиото, фотографиите, податоците за плаќање, лозинките и пораките.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> ќе може да стримува апликации и системски функции на <xliff:g id="DEVICE_NAME">%3$s</xliff:g> додека не ја повлечете дозволава."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> бара дозвола во име на вашиот <xliff:g id="DEVICE_NAME">%2$s</xliff:g> за да стримува апликации и други системски функции на вашите уреди"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"уред"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Оваа апликација ќе може да ги синхронизира податоците како што се имињата на јавувачите помеѓу вашиот телефон и избраниот уред"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Дозволи"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ml/strings.xml b/packages/CompanionDeviceManager/res/values-ml/strings.xml
index 199f782..2439adc 100644
--- a/packages/CompanionDeviceManager/res/values-ml/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ml/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;? മാനേജ് ചെയ്യാൻ, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; എന്നതിനെ അനുവദിക്കുക"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"ഉപകരണം"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"നിങ്ങളുടെ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> എന്നതിൽ ഇനിപ്പറയുന്ന അനുമതികൾ ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കും"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"നിങ്ങളുടെ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> എന്നതിന്റെ ആപ്പുകൾ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; എന്നതിലേക്ക് സ്ട്രീം ചെയ്യാൻ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; എന്നതിനെ അനുവദിക്കണോ?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"ഓഡിയോ, ഫോട്ടോകൾ, പാസ്‌വേഡുകൾ, സന്ദേശങ്ങൾ എന്നിവ ഉൾപ്പെടെ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> എന്നതിൽ ദൃശ്യമാകുന്നതോ പ്ലേ ചെയ്യുന്നതോ എല്ലാ എല്ലാത്തിലേക്കും <xliff:g id="APP_NAME_0">%1$s</xliff:g> എന്നതിന് ആക്സസ് ഉണ്ടായിരിക്കും.&lt;br/&gt;&lt;br/&gt;നിങ്ങൾ ഈ അനുമതിയിലേക്കുള്ള ആക്സസ് നീക്കം ചെയ്യുന്നത് വരെ <xliff:g id="APP_NAME_1">%1$s</xliff:g> എന്നതിന് <xliff:g id="DEVICE_NAME">%3$s</xliff:g> എന്നതിലേക്ക് ആപ്പുകൾ സ്ട്രീം ചെയ്യാനാകും."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"നിങ്ങളുടെ ഉപകരണങ്ങൾക്കിടയിൽ ആപ്പുകൾ സ്ട്രീം ചെയ്യാനും പ്രദർശിപ്പിക്കാനും നിങ്ങളുടെ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> എന്ന ഉപകരണത്തിന് വേണ്ടി <xliff:g id="APP_NAME">%1$s</xliff:g> അനുമതി അഭ്യർത്ഥിക്കുന്നു"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"നിങ്ങളുടെ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> എന്നതിൽ നിന്ന് ഈ വിവരങ്ങൾ ആക്‌സസ് ചെയ്യാൻ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; എന്നതിനെ അനുവദിക്കുക"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"നിങ്ങളുടെ <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> എന്നതിലെ ഫോട്ടോകൾ, മീഡിയ, അറിയിപ്പുകൾ എന്നിവ ആക്സസ് ചെയ്യാൻ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> എന്ന ഉപകരണത്തിന് വേണ്ടി <xliff:g id="APP_NAME">%1$s</xliff:g> അനുമതി അഭ്യർത്ഥിക്കുന്നു"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"നിങ്ങളുടെ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> എന്നതിന്റെ ആപ്പുകളും സിസ്റ്റം ഫീച്ചറുകളും &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; എന്നതിലേക്ക് സ്ട്രീം ചെയ്യാൻ &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; എന്നതിനെ അനുവദിക്കണോ?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"ഓഡിയോ, ഫോട്ടോകൾ, പാസ്‌വേഡുകൾ, സന്ദേശങ്ങൾ എന്നിവ ഉൾപ്പെടെ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> എന്നതിൽ ദൃശ്യമാകുന്നതോ പ്ലേ ചെയ്യുന്നതോ എല്ലാ എല്ലാത്തിലേക്കും <xliff:g id="APP_NAME_0">%1$s</xliff:g> എന്നതിന് ആക്സസ് ഉണ്ടായിരിക്കും.&lt;br/&gt;&lt;br/&gt;നിങ്ങൾ ഈ അനുമതിയിലേക്കുള്ള ആക്സസ് നീക്കം ചെയ്യുന്നത് വരെ <xliff:g id="APP_NAME_1">%1$s</xliff:g> എന്നതിന് <xliff:g id="DEVICE_NAME">%3$s</xliff:g> എന്നതിലേക്ക് ആപ്പുകളും മറ്റ് സിസ്റ്റം ഫീച്ചറുകളും സ്ട്രീം ചെയ്യാനാകും."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"നിങ്ങളുടെ ഉപകരണങ്ങളിൽ ഒന്നിൽ നിന്ന് അടുത്തതിലേക്ക് ആപ്പുകളും മറ്റ് സിസ്റ്റം ഫീച്ചറുകളും സ്ട്രീം ചെയ്യാൻ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> എന്ന ഉപകരണത്തിന് വേണ്ടി <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നത് അനുമതി അഭ്യർത്ഥിക്കുന്നു"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"ഉപകരണം"</string>
     <string name="summary_generic" msgid="1761976003668044801">"വിളിക്കുന്നയാളുടെ പേര് പോലുള്ള വിവരങ്ങൾ നിങ്ങളുടെ ഫോണിനും തിരഞ്ഞെടുത്ത ഉപകരണത്തിനും ഇടയിൽ സമന്വയിപ്പിക്കുന്നതിന് ഈ ആപ്പിന് കഴിയും"</string>
     <string name="consent_yes" msgid="8344487259618762872">"അനുവദിക്കുക"</string>
diff --git a/packages/CompanionDeviceManager/res/values-mn/strings.xml b/packages/CompanionDeviceManager/res/values-mn/strings.xml
index 94f862c..543bdfa 100644
--- a/packages/CompanionDeviceManager/res/values-mn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mn/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-д &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;-г удирдахыг зөвшөөрөх үү?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"төхөөрөмж"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Энэ аппад таны <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> дээрх эдгээр зөвшөөрөлд хандахыг зөвшөөрнө"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-д таны <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-н аппуудыг &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;-д дамжуулахыг зөвшөөрөх үү?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> аудио, зураг, нууц үг, мессеж зэрэг <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> дээр харагдаж эсвэл тоглуулж буй аливаа зүйлд хандах эрхтэй болно.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> таныг энэ зөвшөөрлийн хандалтыг хасах хүртэл <xliff:g id="DEVICE_NAME">%3$s</xliff:g>-д апп дамжуулах боломжтой байх болно."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> таны <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-н өмнөөс таны төхөөрөмжүүдийн хооронд апп үзүүлж, дамжуулах зөвшөөрлийг хүсэж байна"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-д таны <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-н энэ мэдээлэлд хандахыг зөвшөөрнө үү"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> таны <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-н өмнөөс <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>-н зураг, медиа, мэдэгдэлд хандах зөвшөөрлийг хүсэж байна"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt;-д таны <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-н апп болон системийн онцлогуудыг &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;-д дамжуулахыг зөвшөөрөх үү?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> аудио, зураг, төлбөрийн мэдээлэл, нууц үг, мессеж зэрэг таны <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> дээр харагдаж эсвэл тоглуулж буй аливаа зүйлд хандах эрхтэй байх болно.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> таныг энэ зөвшөөрлийн хандалтыг хасах хүртэл <xliff:g id="DEVICE_NAME">%3$s</xliff:g>-д апп болон системийн онцлогуудыг дамжуулах боломжтой байх болно."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> таны <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-н өмнөөс таны төхөөрөмжүүдийн хооронд апп болон системийн бусад онцлогийг дамжуулах зөвшөөрлийг хүсэж байна"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"төхөөрөмж"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Энэ апп залгаж буй хүний нэр зэрэг мэдээллийг таны утас болон сонгосон төхөөрөмжийн хооронд синк хийх боломжтой болно"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Зөвшөөрөх"</string>
diff --git a/packages/CompanionDeviceManager/res/values-mr/strings.xml b/packages/CompanionDeviceManager/res/values-mr/strings.xml
index c758d29..6a7e10e 100644
--- a/packages/CompanionDeviceManager/res/values-mr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mr/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ला &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; व्यवस्थापित करण्याची अनुमती द्यायची आहे?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"डिव्हाइस"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"या अ‍ॅपला तुमच्या <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> वर या परवानग्या अ‍ॅक्सेस करण्याची अनुमती दिली जाईल"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ला तुमच्या <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> अ‍ॅप्स &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;वर स्ट्रीम करण्याची अनुमती द्यायची आहे का?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ला ऑडिओ, फोटो, पासवर्ड आणि मेसेज यांसह <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> वर दिसणाऱ्या किंवा प्ले होणाऱ्या सर्व गोष्टींचा अ‍ॅक्सेस असेल.&lt;br/&gt;&lt;br/&gt;तुम्ही या परवानगीचा अ‍ॅक्सेस काढून टाकेपर्यंत <xliff:g id="APP_NAME_1">%1$s</xliff:g> हे <xliff:g id="DEVICE_NAME">%3$s</xliff:g> वर ॲप्स स्ट्रीम करू शकेल."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"तुमच्या डिव्हाइसदरम्यान ॲप्स दाखवण्यासाठी आणि स्ट्रीम करण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> हे तुमच्या <xliff:g id="DEVICE_NAME">%2$s</xliff:g> च्या वतीने परवानगीची विनंती करत आहे"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ला ही माहिती तुमच्या <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> वरून अ‍ॅक्सेस करण्यासाठी अनुमती द्या"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"तुमच्या <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> मधील फोटो, मीडिया आणि नोटिफिकेशन अ‍ॅक्सेस करण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> हे तुमच्या <xliff:g id="DEVICE_NAME">%2$s</xliff:g> च्या वतीने परवानगीची विनंती करत आहे"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; ला तुमच्या <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> अ‍ॅप्स आणि सिस्टीमची वैशिष्ट्ये &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;वर स्ट्रीम करण्याची अनुमती द्यायची आहे का?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ला ऑडिओ, फोटो, पेमेंट माहिती, पासवर्ड आणि मेसेज यांसह तुमच्या <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> वर दिसणाऱ्या किंवा प्ले होणाऱ्या सर्व गोष्टींचा अ‍ॅक्सेस असेल.&lt;br/&gt;&lt;br/&gt;तुम्ही या परवानगीचा अ‍ॅक्सेस काढून टाकेपर्यंत <xliff:g id="APP_NAME_1">%1$s</xliff:g> हे ॲप्स आणि सिस्टीमची वैशिष्ट्ये <xliff:g id="DEVICE_NAME">%3$s</xliff:g> वर स्ट्रीम करू शकेल."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"तुमच्या डिव्हाइसदरम्यान ॲप्स आणि इतर सिस्टीम वैशिष्‍ट्ये स्ट्रीम करण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> हे तुमच्या <xliff:g id="DEVICE_NAME">%2$s</xliff:g> च्या वतीने परवानगीची विनंती करत आहे"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"डिव्हाइस"</string>
     <string name="summary_generic" msgid="1761976003668044801">"हे ॲप तुमचा फोन आणि निवडलेल्या डिव्‍हाइसदरम्यान कॉल करत असलेल्‍या एखाद्या व्यक्तीचे नाव यासारखी माहिती सिंक करू शकेल"</string>
     <string name="consent_yes" msgid="8344487259618762872">"अनुमती द्या"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ms/strings.xml b/packages/CompanionDeviceManager/res/values-ms/strings.xml
index 424b815b..13916b7 100644
--- a/packages/CompanionDeviceManager/res/values-ms/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ms/strings.xml
@@ -25,17 +25,17 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Benarkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; mengurus &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"peranti"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Apl ini akan dibenarkan untuk mengakses kebenaran yang berikut pada <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> anda"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Benarkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk menstrim apl <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> anda kepada &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> akan mendapat akses kepada semua perkara yang dipaparkan atau dimainkan pada <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, termasuk audio, foto, kata laluan dan mesej.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> akan dapat menstrim apl kepada <xliff:g id="DEVICE_NAME">%3$s</xliff:g> sehingga anda mengalih keluar akses kepada kebenaran ini."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta kebenaran bagi pihak <xliff:g id="DEVICE_NAME">%2$s</xliff:g> anda untuk memaparkan dan menstrim apl antara peranti anda"</string>
+    <string name="title_app_streaming" msgid="1047090167914857893">"Benarkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk menstrim apl dan ciri sistem <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> anda kepada &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
+    <string name="summary_app_streaming" msgid="7990244299655610920">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> akan mendapat akses kepada semua perkara yang dipaparkan atau dimainkan pada <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> anda, termasuk audio, foto, maklumat pembayaran, kata laluan dan mesej.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> akan dapat menstrim apl kepada <xliff:g id="DEVICE_NAME">%3$s</xliff:g> sehingga anda mengalih keluar akses kepada kebenaran ini."</string>
+    <string name="helper_summary_app_streaming" msgid="1872657107404139828">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta kebenaran bagi pihak <xliff:g id="DEVICE_NAME">%2$s</xliff:g> untuk menstrim apl dan ciri sistem daripada <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> anda"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Benarkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk mengakses maklumat ini daripada <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> anda"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang meminta kebenaran bagi pihak <xliff:g id="DEVICE_NAME">%2$s</xliff:g> anda untuk mengakses foto, media dan pemberitahuan <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> anda"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Benarkan &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; untuk menstrim apl dan ciri sistem <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> anda kepada &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> akan mendapat akses kepada semua perkara yang dipaparkan atau dimainkan pada <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> anda, termasuk audio, foto, maklumat pembayaran, kata laluan dan mesej.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> akan dapat menstrim apl dan ciri sistem kepada <xliff:g id="DEVICE_NAME">%3$s</xliff:g> sehingga anda mengalih keluar akses kepada kebenaran ini."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang meminta kebenaran bagi pihak <xliff:g id="DEVICE_NAME">%2$s</xliff:g> anda untuk menstrim apl dan ciri sistem lain antara peranti anda"</string>
+    <string name="title_nearby_device_streaming" msgid="2727103756701741359">"Benarkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk menstrim apl <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> anda kepada &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
+    <string name="summary_nearby_device_streaming" msgid="70434958004946884">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> akan mendapat akses kepada semua perkara yang dipaparkan atau dimainkan pada <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>, termasuk audio, foto, maklumat pembayaran, kata laluan dan mesej.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_2">%1$s</xliff:g> akan dapat menstrim apl kepada <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> sehingga anda mengalih keluar akses kepada kebenaran ini."</string>
+    <string name="helper_summary_nearby_device_streaming" msgid="4712712177819370967">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta kebenaran bagi pihak <xliff:g id="DEVICE_NAME">%2$s</xliff:g> untuk menstrim apl daripada <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> anda"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"peranti"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Apl ini akan dapat menyegerakkan maklumat seperti nama individu yang memanggil, antara telefon anda dengan peranti yang dipilih"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Benarkan"</string>
diff --git a/packages/CompanionDeviceManager/res/values-my/strings.xml b/packages/CompanionDeviceManager/res/values-my/strings.xml
index 6185f314..dea62f6 100644
--- a/packages/CompanionDeviceManager/res/values-my/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-my/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ကို &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; အား စီမံခွင့်ပြုမလား။"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"စက်"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"သင့် <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> တွင် ၎င်းခွင့်ပြုချက်များရယူရန် ဤအက်ပ်ကိုခွင့်ပြုမည်"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; အား သင့် <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ၏ အက်ပ်များကို &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; တွင် တိုက်ရိုက်ဖွင့်ခွင့်ပြုမလား။"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> သည် အသံ၊ ဓာတ်ပုံ၊ စကားဝှက်နှင့် မက်ဆေ့ဂျ်များအပါအဝင် <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> တွင် မြင်နိုင်သော (သို့) ဖွင့်ထားသော အရာအားလုံးကို သုံးခွင့်ရှိပါမည်။&lt;br/&gt;&lt;br/&gt;ဤခွင့်ပြုချက်သုံးခွင့်ကို သင်မဖယ်ရှားမချင်း <xliff:g id="APP_NAME_1">%1$s</xliff:g> သည် အက်ပ်များကို <xliff:g id="DEVICE_NAME">%3$s</xliff:g> တွင် တိုက်ရိုက်ဖွင့်နိုင်ပါမည်။"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင့်စက်များအကြား အက်ပ်များ ပြပြီး တိုက်ရိုက်ဖွင့်ရန် <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ကိုယ်စား ခွင့်ပြုချက်တောင်းနေသည်"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; အား သင့် <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> မှ ဤအချက်အလက်ကို သုံးခွင့်ပြုမည်"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင့် <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> ၏ ဓာတ်ပုံ၊ မီဒီယာနှင့် အကြောင်းကြားချက်များသုံးရန် <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ကိုယ်စား ခွင့်ပြုချက်တောင်းနေသည်"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; အား သင့် <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ၏ အက်ပ်နှင့် စနစ်တူးလ်များကို &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; တွင် တိုက်ရိုက်ဖွင့်ခွင့်ပြုမလား။"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> သည် အသံ၊ ဓာတ်ပုံ၊ ငွေချေအချက်အလက်၊ စကားဝှက်နှင့် မက်ဆေ့ဂျ်များအပါအဝင် သင့် <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> တွင် မြင်နိုင်သော (သို့) ဖွင့်ထားသော အရာအားလုံးကို သုံးခွင့်ရှိပါမည်။&lt;br/&gt;&lt;br/&gt;ဤခွင့်ပြုချက်သုံးခွင့်ကို သင်မဖယ်ရှားမချင်း <xliff:g id="APP_NAME_1">%1$s</xliff:g> သည် အက်ပ်နှင့် စနစ်တူးလ်များကို <xliff:g id="DEVICE_NAME">%3$s</xliff:g> တွင် တိုက်ရိုက်ဖွင့်နိုင်ပါမည်။"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင့်စက်များအကြား အက်ပ်နှင့် အခြားစနစ်တူးလ်များ တိုက်ရိုက်ဖွင့်ရန် <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ကိုယ်စား ခွင့်ပြုချက်တောင်းနေသည်"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"စက်"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ဤအက်ပ်သည် သင့်ဖုန်းနှင့် ရွေးထားသောစက်အကြား ခေါ်ဆိုသူ၏အမည်ကဲ့သို့ အချက်အလက်ကို စင့်ခ်လုပ်နိုင်ပါမည်"</string>
     <string name="consent_yes" msgid="8344487259618762872">"ခွင့်ပြုရန်"</string>
@@ -61,7 +67,7 @@
     <string name="permission_call_logs_summary" msgid="7545243592757693321">"ဖုန်းခေါ်ဆိုမှတ်တမ်းကို ဖတ်နိုင်၊ ရေးနိုင်သည်"</string>
     <string name="permission_sms_summary" msgid="8499509535410068616">"SMS မက်ဆေ့ဂျ်များ ပို့နိုင်၊ ကြည့်နိုင်သည်"</string>
     <string name="permission_contacts_summary" msgid="2840800622763086808">"သင့်အဆက်အသွယ်များကို ဝင်ကြည့်နိုင်သည်"</string>
-    <string name="permission_calendar_summary" msgid="8430353935747336165">"သင့်ပြက္ခဒိန်ကို ဝင်ကြည့်နိုင်သည်"</string>
+    <string name="permission_calendar_summary" msgid="8430353935747336165">"သင့်ပြက္ခဒိန်အား ဝင်သုံးနိုင်သည်"</string>
     <string name="permission_microphone_summary" msgid="4862628553869973259">"အသံသွင်းနိုင်သည်"</string>
     <string name="permission_nearby_devices_summary" msgid="1306752848196464817">"အနီးတစ်ဝိုက်ရှိ စက်များ၏ ဆက်စပ်နေရာကို ရှာခြင်း၊ ချိတ်ဆက်ခြင်းနှင့် သတ်မှတ်ခြင်းတို့ လုပ်နိုင်သည်"</string>
     <string name="permission_notification_listener_access_summary" msgid="7856071768185367749">"အဆက်အသွယ်၊ မက်ဆေ့ဂျ်နှင့် ဓာတ်ပုံများကဲ့သို့ အချက်အလက်များအပါအဝင် အကြောင်းကြားချက်အားလုံးကို ဖတ်နိုင်သည်"</string>
diff --git a/packages/CompanionDeviceManager/res/values-nb/strings.xml b/packages/CompanionDeviceManager/res/values-nb/strings.xml
index 00700ec..9a40b6b 100644
--- a/packages/CompanionDeviceManager/res/values-nb/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-nb/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Vil du la &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; administrere &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"enheten"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Denne appen får disse tillatelsene på <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Vil du la &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; strømme apper fra <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> til &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> får tilgang til alt som vises eller spilles av på <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, inkludert lyd, bilder, passord og meldinger.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> får muligheten til å strømme apper til <xliff:g id="DEVICE_NAME">%3$s</xliff:g> frem til du fjerner tilgangen til denne tillatelsen."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> ber om tillatelse til å vise og strømme apper mellom enhetene dine, på vegne av <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Vil du gi &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tilgang til denne informasjonen fra <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>?"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> ber om tilgang til bilder, medieinnhold og varsler fra <xliff:g id="DEVICE_NAME">%2$s</xliff:g> på vegne av <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Vil du la &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; strømme apper og systemfunksjoner fra <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> til &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> får tilgang til alt som vises eller spilles av på <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, inkludert lyd, bilder, betalingsopplysninger, passord og meldinger.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> får muligheten til å strømme apper og systemfunksjoner til <xliff:g id="DEVICE_NAME">%3$s</xliff:g> frem til du fjerner tilgangen til denne tillatelsen."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> ber om tillatelse til å strømme apper og andre systemfunksjoner mellom enhetene dine på vegne av <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"enhet"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Denne appen kan synkronisere informasjon som navnet til noen som ringer, mellom telefonen og den valgte enheten"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Tillat"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ne/strings.xml b/packages/CompanionDeviceManager/res/values-ne/strings.xml
index 1af4d85..fdd011b 100644
--- a/packages/CompanionDeviceManager/res/values-ne/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ne/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; व्यवस्थापन गर्ने अनुमति दिने हो?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"डिभाइस"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"तपाईंको <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> मा यो एपलाई निम्न अनुमति दिइने छ:"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई तपाईंको <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> मा भएका एपहरू &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; मा स्ट्रिम गर्न दिने हो?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ले तपाईंको <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> मा देखिने वा प्ले गरिने अडियो, फोटो, पासवर्ड र म्यासेजलगायतका सबै कुरा एक्सेस गर्न सक्ने छ।&lt;br/&gt;&lt;br/&gt;तपाईंले यो अनुमति रद्द नगरेसम्म <xliff:g id="APP_NAME_1">%1$s</xliff:g> ले एपहरू <xliff:g id="DEVICE_NAME">%3$s</xliff:g> मा स्ट्रिम गर्न पाइराख्ने छ।"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> तपाईंको डिभाइस <xliff:g id="DEVICE_NAME">%2$s</xliff:g> को तर्फबाट तपाईंका कुनै एउटा डिभाइसबाट अर्को डिभाइसमा एप देखाउने तथा स्ट्रिम गर्ने अनुमति माग्दै छ"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई तपाईंको <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> मा भएको यो जानकारी एक्सेस गर्ने अनुमति दिनुहोस्"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> तपाईंको डिभाइस <xliff:g id="DEVICE_NAME">%2$s</xliff:g> को तर्फबाट तपाईंको <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> मा भएका फोटो, मिडिया र सूचनाहरू एक्सेस गर्ने अनुमति माग्दै छ"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; लाई तपाईंको <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> मा भएका एप तथा सिस्टमका सुविधाहरू &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; मा स्ट्रिम गर्न दिने हो?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ले तपाईंको <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> मा देखिने वा प्ले गरिने अडियो, फोटो, भुक्तानीसम्बन्धी जानकारी, पासवर्ड र म्यासेजलगायतका सबै कुरा एक्सेस गर्न सक्ने छ।&lt;br/&gt;&lt;br/&gt;तपाईंले यो अनुमति रद्द नगरेसम्म <xliff:g id="APP_NAME_1">%1$s</xliff:g> ले एप तथा सिस्टमका सुविधाहरू <xliff:g id="DEVICE_NAME">%3$s</xliff:g> मा स्ट्रिम गर्न पाइराख्ने छ।"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> तपाईंको डिभाइस <xliff:g id="DEVICE_NAME">%2$s</xliff:g> को तर्फबाट तपाईंका कुनै एउटा डिभाइसबाट अर्को डिभाइसमा एप र सिस्टमका अन्य सुविधाहरूमा स्ट्रिम गर्ने अनुमति माग्दै छ"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"यन्त्र"</string>
     <string name="summary_generic" msgid="1761976003668044801">"यो एपले तपाईंको फोन र तपाईंले छनौट गर्ने डिभाइसका बिचमा कल गर्ने व्यक्तिको नाम जस्ता जानकारी सिंक गर्न सक्ने छ।"</string>
     <string name="consent_yes" msgid="8344487259618762872">"अनुमति दिनुहोस्"</string>
diff --git a/packages/CompanionDeviceManager/res/values-nl/strings.xml b/packages/CompanionDeviceManager/res/values-nl/strings.xml
index ad1cfe0..d71e8c1 100644
--- a/packages/CompanionDeviceManager/res/values-nl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-nl/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toestaan &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; te beheren?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"apparaat"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Deze app krijgt toegang tot deze rechten op je <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toestaan om apps van je <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> naar &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; te streamen?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> krijgt toegang tot alles wat zichtbaar is of wordt afgespeeld op je <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, waaronder audio, foto\'s, wachtwoorden en berichten.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> kan apps naar <xliff:g id="DEVICE_NAME">%3$s</xliff:g> streamen totdat je dit recht verwijdert."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt namens jouw <xliff:g id="DEVICE_NAME">%2$s</xliff:g> toestemming om apps tussen je apparaten weer te geven en te streamen"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toegang geven tot deze informatie op je <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>?"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt namens jouw <xliff:g id="DEVICE_NAME">%2$s</xliff:g> toegang tot de foto\'s, media en meldingen van je <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; toestaan om apps en systeemfuncties van je <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> naar &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; te streamen?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> krijgt toegang tot alles wat zichtbaar is of wordt afgespeeld op je <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, waaronder audio, foto\'s, betalingsgegevens, wachtwoorden en berichten.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> kan apps en systeemfuncties naar <xliff:g id="DEVICE_NAME">%3$s</xliff:g> streamen totdat je dit recht verwijdert."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt namens jouw <xliff:g id="DEVICE_NAME">%2$s</xliff:g> toestemming om apps en andere systeemfuncties te streamen tussen je apparaten"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"apparaat"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Deze app kan informatie, zoals de naam van iemand die belt, synchroniseren tussen je telefoon en het gekozen apparaat"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Toestaan"</string>
diff --git a/packages/CompanionDeviceManager/res/values-or/strings.xml b/packages/CompanionDeviceManager/res/values-or/strings.xml
index 58c6476..1e8ed0b 100644
--- a/packages/CompanionDeviceManager/res/values-or/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-or/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;କୁ ପରିଚାଳନା କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ ଅନୁମତି ଦେବେ?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"ଡିଭାଇସ"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"ଆପଣଙ୍କ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>ରେ ଏହି ଅନୁମତିଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଆଯିବ"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"ଆପଣଙ୍କ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ର ଆପ୍ସକୁ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;ରେ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ ଅନୁମତି ଦେବେ?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"ଅଡିଓ, ଫଟୋ, ପାସୱାର୍ଡ ଏବଂ ମେସେଜ ସମେତ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ <xliff:g id="APP_NAME_0">%1$s</xliff:g>ର ଆକ୍ସେସ ରହିବ।&lt;br/&gt;&lt;br/&gt;ଆପଣ ଏହି ଅନୁମତିକୁ ଆକ୍ସେସ କାଢ଼ି ନଦେବା ପର୍ଯ୍ୟନ୍ତ <xliff:g id="APP_NAME_1">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%3$s</xliff:g>ରେ ଆପ୍ସକୁ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ ସକ୍ଷମ ହେବ।"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"ଆପଣଙ୍କ ଡିଭାଇସଗୁଡ଼ିକ ମଧ୍ୟରେ ଆପ୍ସକୁ ଡିସପ୍ଲେ ଏବଂ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କର <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ତରଫରୁ ଅନୁମତି ପାଇଁ ଅନୁରୋଧ କରୁଛି"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"ଆପଣଙ୍କ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ରୁ ଏହି ସୂଚନାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"ଆପଣଙ୍କ <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>ର ଫଟୋ, ମିଡିଆ ଏବଂ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କର <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ତରଫରୁ ଅନୁମତି ପାଇଁ ଅନୁରୋଧ କରୁଛି"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"ଆପଣଙ୍କ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ର ଆପ୍ସ ଏବଂ ସିଷ୍ଟମ ଫିଚରଗୁଡ଼ିକୁ &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;ରେ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt;କୁ ଅନୁମତି ଦେବେ?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"ଅଡିଓ, ଫଟୋ, ପେମେଣ୍ଟ ସୂଚନା, ପାସୱାର୍ଡ ଏବଂ ମେସେଜ ସମେତ ଆପଣଙ୍କ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ <xliff:g id="APP_NAME_0">%1$s</xliff:g>ର ଆକ୍ସେସ ରହିବ।&lt;br/&gt;&lt;br/&gt;ଆପଣ ଏହି ଅନୁମତିକୁ ଆକ୍ସେସ କାଢ଼ି ନଦେବା ପର୍ଯ୍ୟନ୍ତ <xliff:g id="APP_NAME_1">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%3$s</xliff:g>ରେ ଆପ୍ସ ଏବଂ ସିଷ୍ଟମ ଫିଚରଗୁଡ଼ିକୁ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ ସକ୍ଷମ ହେବ।"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"ଆପଣଙ୍କ ଡିଭାଇସଗୁଡ଼ିକ ମଧ୍ୟରେ ଆପ୍ସ ଏବଂ ଅନ୍ୟ ସିଷ୍ଟମ ଫିଚରଗୁଡ଼ିକୁ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କର <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ତରଫରୁ ଅନୁମତି ପାଇଁ ଅନୁରୋଧ କରୁଛି"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"ଡିଭାଇସ୍"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ଆପଣଙ୍କ ଫୋନ ଏବଂ ବଛାଯାଇଥିବା ଡିଭାଇସ ମଧ୍ୟରେ, କଲ କରୁଥିବା ଯେ କୌଣସି ବ୍ୟକ୍ତିଙ୍କ ନାମ ପରି ସୂଚନା ସିଙ୍କ କରିବାକୁ ଏହି ଆପ ସକ୍ଷମ ହେବ"</string>
     <string name="consent_yes" msgid="8344487259618762872">"ଅନୁମତି ଦିଅନ୍ତୁ"</string>
diff --git a/packages/CompanionDeviceManager/res/values-pa/strings.xml b/packages/CompanionDeviceManager/res/values-pa/strings.xml
index d80c667..94a8584 100644
--- a/packages/CompanionDeviceManager/res/values-pa/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pa/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"ਕੀ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"ਡੀਵਾਈਸ"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"ਇਸ ਐਪ ਨੂੰ ਤੁਹਾਡੇ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> \'ਤੇ ਇਨ੍ਹਾਂ ਇਜਾਜ਼ਤਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਹੋਵੇਗੀ"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"ਕੀ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ ਤੁਹਾਡੇ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ਦੀਆਂ ਐਪਾਂ ਨੂੰ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; \'ਤੇ ਸਟ੍ਰੀਮ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ਕੋਲ ਆਡੀਓ, ਫ਼ੋਟੋਆਂ, ਪਾਸਵਰਡਾਂ ਅਤੇ ਸੁਨੇਹਿਆਂ ਸਮੇਤ, <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> \'ਤੇ ਦਿਖਾਈ ਦੇਣ ਵਾਲੀ ਜਾਂ ਚਲਾਈ ਜਾਣ ਵਾਲੀ ਕਿਸੇ ਵੀ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੋਵੇਗੀ।&lt;br/&gt;&lt;br/&gt;ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਇਸ ਇਜਾਜ਼ਤ ਤੱਕ ਪਹੁੰਚ ਨੂੰ ਹਟਾ ਨਹੀਂ ਦਿੰਦੇ, ਉਦੋਂ ਤੱਕ <xliff:g id="APP_NAME_1">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME">%3$s</xliff:g> \'ਤੇ ਐਪਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰ ਸਕੇਗੀ।"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ਦੀ ਤਰਫ਼ੋਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸਾਂ ਵਿਚਕਾਰ ਐਪਾਂ ਨੂੰ ਦਿਖਾਉਣ ਅਤੇ ਸਟ੍ਰੀਮ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮੰਗ ਰਹੀ ਹੈ"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ ਤੁਹਾਡੇ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ਤੋਂ ਇਸ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ਦੀ ਤਰਫ਼ੋਂ ਤੁਹਾਡੇ <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> ਦੀਆਂ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਸੂਚਨਾਵਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮੰਗ ਰਹੀ ਹੈ"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"ਕੀ &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ ਤੁਹਾਡੇ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ਦੀਆਂ ਐਪਾਂ ਨੂੰ &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; \'ਤੇ ਸਟ੍ਰੀਮ ਕਰਨ ਅਤੇ ਸਿਸਟਮ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ਕੋਲ ਆਡੀਓ, ਫ਼ੋਟੋਆਂ, ਪਾਸਵਰਡਾਂ ਅਤੇ ਸੁਨੇਹਿਆਂ ਸਮੇਤ ਤੁਹਾਡੇ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> \'ਤੇ ਦਿਖਾਈ ਦੇਣ ਵਾਲੀ ਜਾਂ ਚਲਾਈ ਜਾਣ ਵਾਲੀ ਕਿਸੇ ਵੀ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੋਵੇਗੀ।&lt;br/&gt;&lt;br/&gt;ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਇਸ ਇਜਾਜ਼ਤ ਤੱਕ ਪਹੁੰਚ ਨੂੰ ਹਟਾ ਨਹੀਂ ਦਿੰਦੇ, ਉਦੋਂ ਤੱਕ <xliff:g id="APP_NAME_1">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME">%3$s</xliff:g> \'ਤੇ ਐਪਾਂ ਅਤੇ ਸਿਸਟਮ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰ ਸਕੇਗੀ।"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ਦੀ ਤਰਫ਼ੋਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸਾਂ ਵਿਚਕਾਰ ਐਪਾਂ ਅਤੇ ਹੋਰ ਸਿਸਟਮ ਸੰਬੰਧੀ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮੰਗ ਰਹੀ ਹੈ"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"ਡੀਵਾਈਸ"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਫ਼ੋਨ ਅਤੇ ਚੁਣੇ ਗਏ ਡੀਵਾਈਸ ਵਿਚਕਾਰ ਕਾਲਰ ਦੇ ਨਾਮ ਵਰਗੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਿੰਕ ਕਰ ਸਕੇਗੀ"</string>
     <string name="consent_yes" msgid="8344487259618762872">"ਆਗਿਆ ਦਿਓ"</string>
diff --git a/packages/CompanionDeviceManager/res/values-pl/strings.xml b/packages/CompanionDeviceManager/res/values-pl/strings.xml
index 42a05b4..949957d 100644
--- a/packages/CompanionDeviceManager/res/values-pl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pl/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Zezwolić na dostęp aplikacji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; do urządzenia &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"urządzenie"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Aplikacja będzie miała dostęp do tych uprawnień na Twoim urządzeniu (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>)"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Zezwolić aplikacji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na strumieniowanie aplikacji na <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> na urządzenie &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"Aplikacja <xliff:g id="APP_NAME_0">%1$s</xliff:g> będzie miała dostęp do wszystkiego, co jest widoczne i odtwarzane na <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, w tym do dźwięku, zdjęć, haseł i wiadomości.&lt;br/&gt;&lt;br/&gt;Aplikacja <xliff:g id="APP_NAME_1">%1$s</xliff:g> będzie mogła strumieniować aplikacje na urządzenie <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, dopóki nie usuniesz dostępu do tego uprawnienia."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> prosi w imieniu urządzenia <xliff:g id="DEVICE_NAME">%2$s</xliff:g> o pozwolenie na wyświetlanie i strumieniowanie aplikacji między Twoimi urządzeniami"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Zezwól aplikacji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na dostęp do tych informacji na Twoim <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> prosi w imieniu urządzenia <xliff:g id="DEVICE_NAME">%2$s</xliff:g> o uprawnienia dotyczące dostępu do zdjęć, multimediów i powiadomień na <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Zezwolić aplikacji &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; na strumieniowanie aplikacji i funkcji systemowych na <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> na urządzenie &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"Aplikacja <xliff:g id="APP_NAME_0">%1$s</xliff:g> będzie miała dostęp do wszystkiego, co jest widoczne i odtwarzane na <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, w tym do dźwięku, zdjęć, danych do płatności, haseł i wiadomości.&lt;br/&gt;&lt;br/&gt;Aplikacja <xliff:g id="APP_NAME_1">%1$s</xliff:g> będzie mogła strumieniować aplikacje i funkcje systemowe na urządzenie <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, dopóki nie usuniesz dostępu do tego uprawnienia."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> prosi w imieniu urządzenia <xliff:g id="DEVICE_NAME">%2$s</xliff:g> o pozwolenie na strumieniowanie aplikacji i innych funkcji systemowych między Twoimi urządzeniami"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"urządzenie"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Ta aplikacja może synchronizować informacje takie jak imię i nazwisko osoby dzwoniącej między Twoim telefonem i wybranym urządzeniem"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Zezwól"</string>
diff --git a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
index 1ef9635..cce0968 100644
--- a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; gerencie o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"O app poderá acessar estas permissões no seu <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; faça streaming dos aplicativos do seu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> para o &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"O app <xliff:g id="APP_NAME_0">%1$s</xliff:g> terá acesso a tudo que estiver visível ou for aberto no <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, incluindo áudios, fotos, senhas e mensagens.&lt;br/&gt;&lt;br/&gt;O app <xliff:g id="APP_NAME_1">%1$s</xliff:g> poderá fazer streaming de aplicativos para o <xliff:g id="DEVICE_NAME">%3$s</xliff:g> até que você remova o acesso a essa permissão."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para mostrar e fazer streaming de apps entre seus dispositivos"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acesse essas informações do seu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para acessar fotos, mídia e notificações do seu <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Permitir que &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; faça streaming dos apps e recursos do sistema do seu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> para o &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"O app <xliff:g id="APP_NAME_0">%1$s</xliff:g> terá acesso a tudo que estiver visível ou for aberto no <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, incluindo áudios, fotos, informações de pagamento, senhas e mensagens.&lt;br/&gt;&lt;br/&gt;O app <xliff:g id="APP_NAME_1">%1$s</xliff:g> poderá fazer streaming de aplicativos e recursos do sistema para o <xliff:g id="DEVICE_NAME">%3$s</xliff:g> até que você remova o acesso a essa permissão."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para fazer streaming de aplicativos e outros recursos do sistema entre seus dispositivos"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
     <string name="summary_generic" msgid="1761976003668044801">"O app poderá sincronizar informações, como o nome de quem está ligando, entre seu smartphone e o dispositivo escolhido"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
diff --git a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
index 8a464e3..1443b13 100644
--- a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Permita que a app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; faça a gestão do dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Esta app vai poder aceder a estas autorizações no seu <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Permitir que a app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; faça stream das apps do seu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>para o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"A app <xliff:g id="APP_NAME_0">%1$s</xliff:g> vai ter acesso a tudo o que seja visível ou reproduzido no dispositivo <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, incluindo áudio, fotos, palavras-passe e mensagens.&lt;br/&gt;&lt;br/&gt;A app <xliff:g id="APP_NAME_1">%1$s</xliff:g> vai poder fazer stream de apps para o dispositivo <xliff:g id="DEVICE_NAME">%3$s</xliff:g> até remover o acesso a esta autorização."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a pedir autorização em nome do seu dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para apresentar e fazer stream de apps entre os seus dispositivos"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Permita que a app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aceda a estas informações do seu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a pedir autorização em nome do seu dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para aceder às fotos, ao conteúdo multimédia e às notificações do seu <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Permitir que o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; faça stream das apps e funcionalidades do sistema do seu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> para o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"A app <xliff:g id="APP_NAME_0">%1$s</xliff:g> vai ter acesso a tudo o que seja visível ou reproduzido no seu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, incluindo áudio, fotos, informações de pagamento, palavras-passe e mensagens.&lt;br/&gt;&lt;br/&gt;A app <xliff:g id="APP_NAME_1">%1$s</xliff:g> vai poder fazer stream de apps e funcionalidades do sistema para o dispositivo <xliff:g id="DEVICE_NAME">%3$s</xliff:g> até remover o acesso a esta autorização."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a pedir autorização em nome do seu dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para fazer stream de apps e outras funcionalidades do sistema entre os seus dispositivos"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Esta app vai poder sincronizar informações, como o nome do autor de uma chamada, entre o telemóvel e o dispositivo escolhido"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
diff --git a/packages/CompanionDeviceManager/res/values-pt/strings.xml b/packages/CompanionDeviceManager/res/values-pt/strings.xml
index 1ef9635..cce0968 100644
--- a/packages/CompanionDeviceManager/res/values-pt/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; gerencie o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"O app poderá acessar estas permissões no seu <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; faça streaming dos aplicativos do seu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> para o &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"O app <xliff:g id="APP_NAME_0">%1$s</xliff:g> terá acesso a tudo que estiver visível ou for aberto no <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, incluindo áudios, fotos, senhas e mensagens.&lt;br/&gt;&lt;br/&gt;O app <xliff:g id="APP_NAME_1">%1$s</xliff:g> poderá fazer streaming de aplicativos para o <xliff:g id="DEVICE_NAME">%3$s</xliff:g> até que você remova o acesso a essa permissão."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para mostrar e fazer streaming de apps entre seus dispositivos"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acesse essas informações do seu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para acessar fotos, mídia e notificações do seu <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Permitir que &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; faça streaming dos apps e recursos do sistema do seu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> para o &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"O app <xliff:g id="APP_NAME_0">%1$s</xliff:g> terá acesso a tudo que estiver visível ou for aberto no <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, incluindo áudios, fotos, informações de pagamento, senhas e mensagens.&lt;br/&gt;&lt;br/&gt;O app <xliff:g id="APP_NAME_1">%1$s</xliff:g> poderá fazer streaming de aplicativos e recursos do sistema para o <xliff:g id="DEVICE_NAME">%3$s</xliff:g> até que você remova o acesso a essa permissão."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para fazer streaming de aplicativos e outros recursos do sistema entre seus dispositivos"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
     <string name="summary_generic" msgid="1761976003668044801">"O app poderá sincronizar informações, como o nome de quem está ligando, entre seu smartphone e o dispositivo escolhido"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ro/strings.xml b/packages/CompanionDeviceManager/res/values-ro/strings.xml
index cb0572d..528a73f 100644
--- a/packages/CompanionDeviceManager/res/values-ro/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ro/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Permiți ca &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; să gestioneze &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispozitiv"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Aplicația va putea să acceseze următoarele permisiuni pe <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Permiți ca &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; să redea în stream aplicații de pe <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> pe &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> va avea acces la tot conținutul vizibil sau redat pe <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, inclusiv conținut audio, fotografii, parole și mesaje.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> va putea să redea în stream aplicații pe <xliff:g id="DEVICE_NAME">%3$s</xliff:g> până când elimini accesul la această permisiune."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită permisiunea pentru <xliff:g id="DEVICE_NAME">%2$s</xliff:g> de a afișa și a reda în stream aplicații între dispozitive"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Permite ca &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; să acceseze aceste informații de pe <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită permisiunea pentru <xliff:g id="DEVICE_NAME">%2$s</xliff:g> de a accesa fotografiile, conținutul media și notificările de pe <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Permiți ca &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; să redea în stream aplicații și funcții de sistem de pe <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> pe &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> va avea acces la tot conținutul vizibil sau redat pe <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, inclusiv conținut audio, fotografii, informații de plată, parole și mesaje.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> va putea să redea în stream aplicații și funcții de sistem pe <xliff:g id="DEVICE_NAME">%3$s</xliff:g> până când elimini accesul la această permisiune."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită permisiunea pentru <xliff:g id="DEVICE_NAME">%2$s</xliff:g> de a reda în stream aplicații și alte funcții de sistem între dispozitive"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"dispozitiv"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Aplicația va putea să sincronizeze informații, cum ar fi numele unui apelant, între telefonul tău și dispozitivul ales"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Permite"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ru/strings.xml b/packages/CompanionDeviceManager/res/values-ru/strings.xml
index f2e0367..6d21beb 100644
--- a/packages/CompanionDeviceManager/res/values-ru/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ru/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Разрешить приложению &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; управлять устройством &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"устройстве"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Это приложение получит указанные разрешения на вашем устройстве (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>)."</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Разрешить приложению &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; транслировать приложения с вашего устройства (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) на устройство &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"У приложения \"<xliff:g id="APP_NAME_0">%1$s</xliff:g>\" будет доступ ко всему, что показывается или воспроизводится на устройстве (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>), включая аудиофайлы, фотографии, пароли и сообщения.&lt;br/&gt;&lt;br/&gt;Приложение \"<xliff:g id="APP_NAME_1">%1$s</xliff:g>\" сможет транслировать приложения на устройство \"<xliff:g id="DEVICE_NAME">%3$s</xliff:g>\", пока вы не отзовете разрешение."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" от имени вашего устройства \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" запрашивает разрешение транслировать приложения между устройствами."</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Разрешить приложению &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; доступ к этой информации с вашего устройства (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>)?"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" от имени вашего устройства \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" запрашивает разрешение на доступ к фотографиям, медиаконтенту и уведомлениям на устройстве (<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>)."</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Разрешить устройству &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; транслировать приложения и системные функции с вашего устройства (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) на устройство &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"У приложения \"<xliff:g id="APP_NAME_0">%1$s</xliff:g>\" будет доступ ко всему, что показывается или воспроизводится на вашем устройстве (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>), включая аудиофайлы, фотографии, платежные данные, пароли и сообщения.&lt;br/&gt;&lt;br/&gt;Приложение \"<xliff:g id="APP_NAME_1">%1$s</xliff:g>\" сможет транслировать приложения и системные функции на устройство \"<xliff:g id="DEVICE_NAME">%3$s</xliff:g>\", пока вы не отзовете разрешение."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" от имени вашего устройства \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" запрашивает разрешение транслировать приложения и системные функции между устройствами."</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"устройство"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Приложение сможет синхронизировать информацию между телефоном и выбранным устройством, например данные из журнала звонков."</string>
     <string name="consent_yes" msgid="8344487259618762872">"Разрешить"</string>
diff --git a/packages/CompanionDeviceManager/res/values-si/strings.xml b/packages/CompanionDeviceManager/res/values-si/strings.xml
index 0b2369a..e8b1197 100644
--- a/packages/CompanionDeviceManager/res/values-si/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-si/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; හට &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; කළමනා කිරීමට ඉඩ දෙන්න ද?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"උපාංගය"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"මෙම යෙදුමට ඔබේ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> මත මෙම අවසර වෙත ප්‍රවේශ වීමට ඉඩ දෙනු ඇත"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"ඔබේ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> හි යෙදුම් &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; වෙත ප්‍රවාහ කිරීමට &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; හට ඉඩ දෙන්න ද?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> හට ශ්‍රව්‍ය, ඡායාරූප, මුරපද සහ පණිවිඩ ඇතුළුව <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> හි දෘශ්‍යමාන හෝ වාදනය වන ඕනෑම දෙයකට ප්‍රවේශය ඇත.&lt;br/&gt;&lt;br/&gt;ඔබ මෙම අවසරයට ප්‍රවේශය ඉවත් කරන තෙක් <xliff:g id="APP_NAME_1">%1$s</xliff:g> හට <xliff:g id="DEVICE_NAME">%3$s</xliff:g> වෙත යෙදුම් ප්‍රවාහ කිරීමට හැකි වනු ඇත."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"ඔබේ උපාංග අතර යෙදුම් සංදර්ශනය කිරීමට සහ ප්‍රවාහ කිරීමට <xliff:g id="APP_NAME">%1$s</xliff:g> ඔබේ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> වෙනුවෙන් අවසර ඉල්ලා සිටියි"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; හට ඔබේ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> වෙතින් මෙම තොරතුරු වෙත ප්‍රවේශ වීමට ඉඩ දෙන්න"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> ඔබේ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> වෙනුවෙන් ඔබේ <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> හි ඡායාරූප, මාධ්‍ය, සහ දැනුම්දීම් වෙත ප්‍රවේශ වීමට අවසරය ඉල්ලමින් සිටියි"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"ඔබේ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> හි යෙදුම් සහ පද්ධති විශේෂාංග &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; වෙත ප්‍රවාහ කිරීමට &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; හට ඉඩ දෙන්න ද?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> හට ශ්‍රව්‍ය, ඡායාරූප, ගෙවීම් තොරතුරු, මුරපද සහ පණිවිඩ ඇතුළුව ඔබේ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> හි දෘශ්‍යමාන හෝ වාදනය වන ඕනෑම දෙයකට ප්‍රවේශය ඇත.&lt;br/&gt;&lt;br/&gt;ඔබ මෙම අවසරයට ප්‍රවේශය ඉවත් කරන තෙක් <xliff:g id="APP_NAME_1">%1$s</xliff:g> හට යෙදුම් සහ පද්ධති විශේෂාංග <xliff:g id="DEVICE_NAME">%3$s</xliff:g> වෙත ප්‍රවාහ කිරීමට හැකි වනු ඇත."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> ඔබේ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> වෙනුවෙන් ඔබේ උපාංග අතර යෙදුම් සහ අනෙකුත් පද්ධති විශේෂාංග ප්‍රවාහ කිරීමට අවසර ඉල්ලයි"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"උපාංගය"</string>
     <string name="summary_generic" msgid="1761976003668044801">"මෙම යෙදුමට ඔබේ දුරකථනය සහ තෝරා ගත් උපාංගය අතර, අමතන කෙනෙකුගේ නම වැනි, තතු සමමුහුර්ත කිරීමට හැකි වනු ඇත"</string>
     <string name="consent_yes" msgid="8344487259618762872">"ඉඩ දෙන්න"</string>
diff --git a/packages/CompanionDeviceManager/res/values-sk/strings.xml b/packages/CompanionDeviceManager/res/values-sk/strings.xml
index 2819a92..41afcd5 100644
--- a/packages/CompanionDeviceManager/res/values-sk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sk/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Chcete povoliť aplikácii &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; spravovať zariadenie &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"zariadenie"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Táto aplikácia bude mať prístup k týmto povoleniam v zariadení <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Chcete povoliť aplikácii &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; streamovať aplikácie zo zariadenia <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> do zariadenia &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"Aplikácia <xliff:g id="APP_NAME_0">%1$s</xliff:g> bude mať prístup k všetkému, čo sa zobrazuje alebo prehráva v zariadení <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> vrátane zvuku, fotiek, hesiel a správ.&lt;br/&gt;&lt;br/&gt;Aplikácia <xliff:g id="APP_NAME_1">%1$s</xliff:g> bude môcť streamovať aplikácie do zariadenia <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, kým prístup k tomuto povoleniu neodstránite."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> vyžaduje pre zariadenie <xliff:g id="DEVICE_NAME">%2$s</xliff:g> povolenie zobrazovať a streamovať aplikácie medzi zariadeniami"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Povoľte aplikácii &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; prístup k týmto informáciám zo zariadenia <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> vyžaduje pre zariadenie <xliff:g id="DEVICE_NAME">%2$s</xliff:g> povolenie na prístup k fotkám, médiám a upozorneniam zariadenia <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Chcete povoliť zariadeniu &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; streamovať aplikácie a funkcie systému zo zariadenia <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> do zariadenia &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"Aplikácia <xliff:g id="APP_NAME_0">%1$s</xliff:g> bude mať prístup k všetkému, čo sa zobrazuje alebo prehráva v zariadení <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> vrátane zvuku, fotiek, platobných údajov, hesiel a správ.&lt;br/&gt;&lt;br/&gt;Aplikácia <xliff:g id="APP_NAME_1">%1$s</xliff:g> bude môcť streamovať aplikácie a funkcie systému do zariadenia <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, kým prístup k tomuto povoleniu neodstránite."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> vyžaduje pre zariadenie <xliff:g id="DEVICE_NAME">%2$s</xliff:g> povolenie streamovať aplikácie a ďalšie funkcie systému medzi zariadeniami"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"zariadenie"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Táto aplikácia bude môcť synchronizovať informácie, napríklad meno volajúceho, medzi telefónom a vybraným zariadením"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Povoliť"</string>
diff --git a/packages/CompanionDeviceManager/res/values-sl/strings.xml b/packages/CompanionDeviceManager/res/values-sl/strings.xml
index 3e4f8db..2c1edcd 100644
--- a/packages/CompanionDeviceManager/res/values-sl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sl/strings.xml
@@ -25,17 +25,17 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Želite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dovoliti upravljanje naprave &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"naprava"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Ta aplikacija bo lahko dostopala do teh dovoljenj v napravi »<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>«."</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Ali aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dovolite, da pretočno predvaja aplikacije naprave »<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>« v napravi &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"Aplikacija <xliff:g id="APP_NAME_0">%1$s</xliff:g> bo imela dostop do vsega, kar je prikazano ali se predvaja v napravi »<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>«, vključno z zvokom, fotografijami, gesli in sporočili.&lt;br/&gt;&lt;br/&gt;Aplikacija <xliff:g id="APP_NAME_1">%1$s</xliff:g> bo lahko pretočno predvajala aplikacije v napravo »<xliff:g id="DEVICE_NAME">%3$s</xliff:g>«, dokler ne odstranite dostopa do tega dovoljenja."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> v imenu naprave »<xliff:g id="DEVICE_NAME">%2$s</xliff:g>« zahteva dovoljenje za prikaz in pretočno predvajanje aplikacij v vaših napravah."</string>
+    <string name="title_app_streaming" msgid="1047090167914857893">"Ali aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dovolite, da pretočno predvaja aplikacije in sistemske funkcije naprave <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> v napravi &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
+    <string name="summary_app_streaming" msgid="7990244299655610920">"Aplikacija <xliff:g id="APP_NAME_0">%1$s</xliff:g> bo imela dostop do vsega, kar je prikazano ali se predvaja v vaši napravi <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, vključno z zvokom, fotografijami, podatki za plačilo, gesli in sporočili.&lt;br/&gt;&lt;br/&gt;Aplikacija <xliff:g id="APP_NAME_1">%1$s</xliff:g> bo lahko pretočno predvajala aplikacije v napravo <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, dokler ne odstranite dostopa do tega dovoljenja."</string>
+    <string name="helper_summary_app_streaming" msgid="1872657107404139828">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> v imenu naprave <xliff:g id="DEVICE_NAME">%2$s</xliff:g> zahteva dovoljenje za pretočno predvajanje aplikacij in sistemskih funkcij iz naprave <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Dovolite, da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dostopa do teh podatkov v vaši napravi »<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>«."</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> v imenu naprave »<xliff:g id="DEVICE_NAME">%2$s</xliff:g>« zahteva dovoljenje za dostop do fotografij, predstavnosti in obvestil v napravi »<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>«."</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Ali napravi &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; dovolite, da pretočno predvaja aplikacije in sistemske funkcije naprave »<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>« v napravi &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"Aplikacija <xliff:g id="APP_NAME_0">%1$s</xliff:g> bo imela dostop do vsega, kar je prikazano ali se predvaja v napravi »<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>«, vključno z zvokom, fotografijami, podatki za plačilo, gesli in sporočili.&lt;br/&gt;&lt;br/&gt;Aplikacija <xliff:g id="APP_NAME_1">%1$s</xliff:g> bo lahko pretočno predvajala aplikacije in sistemske funkcije v napravo »<xliff:g id="DEVICE_NAME">%3$s</xliff:g>«, dokler ne odstranite dostopa do tega dovoljenja."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> v imenu naprave »<xliff:g id="DEVICE_NAME">%2$s</xliff:g>« zahteva dovoljenje za pretočno predvajanje aplikacij in drugih sistemskih funkcij v vaših napravah."</string>
+    <string name="title_nearby_device_streaming" msgid="2727103756701741359">"Ali aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dovolite, da pretočno predvaja aplikacije naprave <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> v napravi &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
+    <string name="summary_nearby_device_streaming" msgid="70434958004946884">"Aplikacija <xliff:g id="APP_NAME_0">%1$s</xliff:g> bo imela dostop do vsega, kar je prikazano ali se predvaja v napravi <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>, vključno z zvokom, fotografijami, podatki za plačilo, gesli in sporočili.&lt;br/&gt;&lt;br/&gt;Aplikacija <xliff:g id="APP_NAME_2">%1$s</xliff:g> bo lahko pretočno predvajala aplikacije v napravo <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g>, dokler ne odstranite dostopa do tega dovoljenja."</string>
+    <string name="helper_summary_nearby_device_streaming" msgid="4712712177819370967">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> v imenu naprave <xliff:g id="DEVICE_NAME">%2$s</xliff:g> zahteva dovoljenje za pretočno predvajanje aplikacij iz naprave <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"naprava"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Ta aplikacija bo lahko sinhronizirala podatke, na primer ime klicatelja, v telefonu in izbrani napravi."</string>
     <string name="consent_yes" msgid="8344487259618762872">"Dovoli"</string>
diff --git a/packages/CompanionDeviceManager/res/values-sq/strings.xml b/packages/CompanionDeviceManager/res/values-sq/strings.xml
index 9d52281..14acdf0 100644
--- a/packages/CompanionDeviceManager/res/values-sq/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sq/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Të lejohet që &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; të menaxhojë &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"pajisje"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Këtij aplikacioni do t\'i lejohet qasja te këto leje te <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Të lejohet që &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; të transmetojë aplikacionet nga <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> te &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> do të ketë qasje te çdo gjë që është e dukshme ose që luhet te <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, duke përfshirë audion, fotografitë, fjalëkalimet dhe mesazhet.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> do të mund t\'i transmetojë aplikacionet në <xliff:g id="DEVICE_NAME">%3$s</xliff:g> derisa ta heqësh qasjen për këtë leje."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> po kërkon leje në emër të <xliff:g id="DEVICE_NAME">%2$s</xliff:g> për të shfaqur dhe transmetuar aplikacionet mes pajisjeve të tua"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Lejo që &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; të ketë qasje në këto informacione te <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> po kërkon leje në emër të <xliff:g id="DEVICE_NAME">%2$s</xliff:g> për të marrë qasje te fotografitë, media dhe njoftimet te <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Të lejohet që &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; të transmetojë aplikacionet dhe veçoritë e sistemit nga <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> te &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> do të ketë qasje te çdo gjë që është e dukshme ose që luhet te <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, duke përfshirë audion, fotografitë, informacionet për pagesën, fjalëkalimet dhe mesazhet.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> do të mund t\'i transmetojë aplikacionet dhe veçoritë e sistemit në <xliff:g id="DEVICE_NAME">%3$s</xliff:g> derisa ta heqësh qasjen për këtë leje."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> po kërkon leje në emër të <xliff:g id="DEVICE_NAME">%2$s</xliff:g> për të transmetuar aplikacione dhe veçori të tjera të sistemit ndërmjet pajisjeve të tua"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"pajisja"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Ky aplikacion do të mund të sinkronizojë informacione, si p.sh emrin e dikujt që po telefonon, mes telefonit tënd dhe pajisjes së zgjedhur."</string>
     <string name="consent_yes" msgid="8344487259618762872">"Lejo"</string>
diff --git a/packages/CompanionDeviceManager/res/values-sr/strings.xml b/packages/CompanionDeviceManager/res/values-sr/strings.xml
index 69af8ab..3f1420b 100644
--- a/packages/CompanionDeviceManager/res/values-sr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sr/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Желите ли да дозволите да &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; управља уређајем &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"уређај"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Овој апликацији ће бити дозвољено да приступа овим дозволама на уређају <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Желите ли да дозволите да &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; стримује апликације уређаја <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> на &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ће имати приступ свему што се види или пушта на уређају <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, укључујући звук, слике, лозинке и поруке.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> ће моћи да стримује апликације на <xliff:g id="DEVICE_NAME">%3$s</xliff:g> док не уклоните приступ овој дозволи."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> тражи дозволу у име уређаја <xliff:g id="DEVICE_NAME">%2$s</xliff:g> да приказује и стримује апликације између уређаја"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Дозволите да &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; приступа овим информацијама са уређаја <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> тражи дозволу у име уређаја <xliff:g id="DEVICE_NAME">%2$s</xliff:g> да приступа сликама, медијском садржају и обавештењима са уређаја <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Желите ли да дозволите да &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; стримује апликације и системске функције уређаја <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> на &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ће имати приступ свему што се види или пушта на уређају <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, укључујући звук, слике, информације о плаћању, лозинке и поруке.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> ће моћи да стримује апликације и системске функције на <xliff:g id="DEVICE_NAME">%3$s</xliff:g> док не уклоните приступ овој дозволи."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> тражи дозволу у име уређаја <xliff:g id="DEVICE_NAME">%2$s</xliff:g> да стримује апликације и друге системске функције између уређаја"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"уређај"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Ова апликација ће моћи да синхронизује податке, попут имена особе која упућује позив, између телефона и одабраног уређаја"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Дозволи"</string>
diff --git a/packages/CompanionDeviceManager/res/values-sv/strings.xml b/packages/CompanionDeviceManager/res/values-sv/strings.xml
index 6ec27d2..cb7b709 100644
--- a/packages/CompanionDeviceManager/res/values-sv/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sv/strings.xml
@@ -25,17 +25,17 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Tillåt att &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; hanterar &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"enhet"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Appen får åtkomst till dessa behörigheter på din <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Vill du tillåta &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; att streama appar på din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> till &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> får åtkomst till allt som visas eller spelas upp på din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, inklusive ljud, foton, lösenord och meddelanden.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> kan streama appar till <xliff:g id="DEVICE_NAME">%3$s</xliff:g> tills du tar bort åtkomsten till den här behörigheten."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet för din <xliff:g id="DEVICE_NAME">%2$s</xliff:g> att visa och streama appar mellan dina enheter"</string>
+    <string name="title_app_streaming" msgid="1047090167914857893">"Vill du tillåta &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; att streama appar och systemfunktioner på din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> till &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
+    <string name="summary_app_streaming" msgid="7990244299655610920">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> får åtkomst till allt som visas eller spelas upp på din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, inklusive ljud, foton, betalningsuppgifter, lösenord och meddelanden.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> kan streama appar till <xliff:g id="DEVICE_NAME">%3$s</xliff:g> tills du tar bort åtkomsten till den här behörigheten."</string>
+    <string name="helper_summary_app_streaming" msgid="1872657107404139828">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet för <xliff:g id="DEVICE_NAME">%2$s</xliff:g> att streama appar och systemfunktioner från din <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Ge &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; åtkomst till denna information på din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet för din <xliff:g id="DEVICE_NAME">%2$s</xliff:g> att få åtkomst till foton, mediefiler och aviseringar på din <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Vill du tillåta &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; att streama appar och systemfunktioner på din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> till &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> får åtkomst till allt som visas eller spelas upp på din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, inklusive ljud, foton, betalningsuppgifter, lösenord och meddelanden.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> kan streama appar och systemfunktioner till <xliff:g id="DEVICE_NAME">%3$s</xliff:g> tills du tar bort åtkomsten till den här behörigheten."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet för din <xliff:g id="DEVICE_NAME">%2$s</xliff:g> att streama appar och andra systemfunktioner mellan dina enheter"</string>
+    <string name="title_nearby_device_streaming" msgid="2727103756701741359">"Vill du tillåta &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; att streama appar på din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> till &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
+    <string name="summary_nearby_device_streaming" msgid="70434958004946884">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> får åtkomst till allt som visas eller spelas upp på <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>, inklusive ljud, foton, betalningsuppgifter, lösenord och meddelanden.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_2">%1$s</xliff:g> kan streama appar till <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> tills du tar bort åtkomsten till den här behörigheten."</string>
+    <string name="helper_summary_nearby_device_streaming" msgid="4712712177819370967">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet för <xliff:g id="DEVICE_NAME">%2$s</xliff:g> att streama appar från din <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"enhet"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Den här appen kommer att kunna synkronisera information mellan telefonen och den valda enheten, till exempel namnet på någon som ringer"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Tillåt"</string>
diff --git a/packages/CompanionDeviceManager/res/values-sw/strings.xml b/packages/CompanionDeviceManager/res/values-sw/strings.xml
index 8efcb2b..ca8fd22 100644
--- a/packages/CompanionDeviceManager/res/values-sw/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sw/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Ungependa kuruhusu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; idhibiti &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"kifaa"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Programu hii itaruhusiwa kufikia ruhusa hizi kwenye <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> yako"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Ungependa kuruhusu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; itiririshe programu za <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> yako kwenye &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> itafikia chochote kinachoonekana au kuchezwa kwenye <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, ikiwa ni pamoja na sauti, picha, manenosiri na ujumbe.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> itaweza kutiririsha programu kwenye <xliff:g id="DEVICE_NAME">%3$s</xliff:g> hadi utakapoondoa ruhusa hii."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> inaomba ruhusa kwa niaba ya <xliff:g id="DEVICE_NAME">%2$s</xliff:g> yako ili ionyeshe na kutiririsha programu kati ya vifaa vyako"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Ruhusu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ifikie maelezo haya kutoka kwenye <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> yako"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> inaomba ruhusa kwa niaba ya <xliff:g id="DEVICE_NAME">%2$s</xliff:g> yako ili ifikie picha, maudhui na arifa za <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> yako"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Ungependa kuruhusu &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; itiririshe programu na vipengele vya mfumo vya <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> yako kwenye &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> itafikia chochote kinachoonekana au kuchezwa kwenye <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> yako, ikiwa ni pamoja na sauti, picha, maelezo ya malipo, manenosiri na ujumbe.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> itaweza kutiririsha programu na vipengele vya mfumo kwenye <xliff:g id="DEVICE_NAME">%3$s</xliff:g> hadi utakapoondoa ruhusa hii."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> inaomba ruhusa kwa niaba ya <xliff:g id="DEVICE_NAME">%2$s</xliff:g> yako ili itiririshe programu na vipengele vingine vya mfumo kati ya vifaa vyako"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"kifaa"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Programu hii itaweza kusawazisha maelezo, kama vile jina la mtu anayepiga simu, kati ya simu yako na kifaa ulichochagua"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Ruhusu"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ta/strings.xml b/packages/CompanionDeviceManager/res/values-ta/strings.xml
index 1a59c09..76e6410 100644
--- a/packages/CompanionDeviceManager/res/values-ta/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ta/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&amp;gt சாதனத்தை நிர்வகிக்க &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"சாதனம்"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"உங்கள் <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> சாதனத்தில் இந்த அனுமதிகளை அணுக இந்த ஆப்ஸ் அனுமதிக்கப்படும்"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"உங்கள் <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> சாதனத்தின் ஆப்ஸை &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; சாதனத்தில் ஸ்ட்ரீம் செய்ய &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"ஆடியோ, படங்கள், கடவுச்சொற்கள், மெசேஜ்கள் உட்பட <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> சாதனத்தில் காட்டப்படுகின்ற/பிளே செய்யப்படுகின்ற அனைத்தையும் <xliff:g id="APP_NAME_0">%1$s</xliff:g> அணுகும்.&lt;br/&gt;&lt;br/&gt;இந்த அனுமதிக்கான அணுகலை நீங்கள் அகற்றும் வரை <xliff:g id="DEVICE_NAME">%3$s</xliff:g> சாதனத்தில் ஆப்ஸை <xliff:g id="APP_NAME_1">%1$s</xliff:g> ஸ்ட்ரீம் செய்ய முடியும்."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"உங்கள் சாதனங்களுக்கு இடையே ஆப்ஸைக் காட்சிப்படுத்தவும் ஸ்ட்ரீம் செய்யவும் உங்கள் <xliff:g id="DEVICE_NAME">%2$s</xliff:g> சார்பாக <xliff:g id="APP_NAME">%1$s</xliff:g> அனுமதி கேட்கிறது"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"உங்கள் <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> சாதனத்தில் உள்ள இந்தத் தகவல்களை அணுக, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ஆப்ஸை அனுமதிக்கவும்"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"உங்கள் <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> சாதனத்தில் உள்ள படங்கள், மீடியா, அறிவிப்புகள் ஆகியவற்றை அணுக உங்கள் <xliff:g id="DEVICE_NAME">%2$s</xliff:g> சார்பாக <xliff:g id="APP_NAME">%1$s</xliff:g> அனுமதி கேட்கிறது"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"உங்கள் <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> சாதனத்தின் ஆப்ஸையும் சிஸ்டம் அம்சங்களையும் &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; சாதனத்தில் ஸ்ட்ரீம் செய்ய &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; சாதனத்தை அனுமதிக்கவா?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"ஆடியோ, படங்கள், பேமெண்ட் தகவல்கள், கடவுச்சொற்கள், மெசேஜ்கள் உட்பட <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> சாதனத்தில் காட்டப்படுகின்ற/பிளே செய்யப்படுகின்ற அனைத்தையும் <xliff:g id="APP_NAME_0">%1$s</xliff:g> அணுகும்.&lt;br/&gt;&lt;br/&gt;இந்த அனுமதிக்கான அணுகலை நீங்கள் அகற்றும் வரை <xliff:g id="DEVICE_NAME">%3$s</xliff:g> சாதனத்தில் ஆப்ஸையும் சிஸ்டம் அம்சங்களையும் <xliff:g id="APP_NAME_1">%1$s</xliff:g> ஸ்ட்ரீம் செய்ய முடியும்."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"உங்கள் சாதனங்களுக்கு இடையே ஆப்ஸையும் பிற சிஸ்டம் அம்சங்களையும் ஸ்ட்ரீம் செய்ய உங்கள் <xliff:g id="DEVICE_NAME">%2$s</xliff:g> சார்பாக <xliff:g id="APP_NAME">%1$s</xliff:g> அனுமதி கேட்கிறது"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"சாதனம்"</string>
     <string name="summary_generic" msgid="1761976003668044801">"அழைப்பவரின் பெயர் போன்ற தகவலை உங்கள் மொபைல் மற்றும் தேர்வுசெய்த சாதனத்திற்கு இடையில் இந்த ஆப்ஸால் ஒத்திசைக்க முடியும்"</string>
     <string name="consent_yes" msgid="8344487259618762872">"அனுமதி"</string>
diff --git a/packages/CompanionDeviceManager/res/values-te/strings.xml b/packages/CompanionDeviceManager/res/values-te/strings.xml
index 63d86fc..2d3f2f3 100644
--- a/packages/CompanionDeviceManager/res/values-te/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-te/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;‌ను మేనేజ్ చేయడానికి &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;‌ను అనుమతించాలా?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"పరికరం"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"మీ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>‌లో ఈ అనుమతులను యాక్సెస్ చేయడానికి ఈ యాప్ అనుమతించబడుతుంది"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"మీ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> యాప్‌లను &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;‌కు స్ట్రీమ్ చేయడానికి &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;‌ను అనుమతించాలా?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"ఆడియో, ఫోటోలు, పాస్‌వర్డ్‌లు, మెసేజ్‌లతో సహా మీ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>‌లో కనిపించే లేదా ప్లే అయ్యే దేనికైనా <xliff:g id="APP_NAME_0">%1$s</xliff:g>‌కు యాక్సెస్ ఉంటుంది.&lt;br/&gt;&lt;br/&gt;మీరు ఈ అనుమతికి యాక్సెస్‌ను తీసివేసే వరకు <xliff:g id="APP_NAME_1">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%3$s</xliff:g>‌కు యాప్‌లను స్ట్రీమ్ చేయగలదు."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"మీ పరికరాలలో యాప్‌లను డిస్‌ప్లే చేయడానికి, స్ట్రీమ్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g> మీ<xliff:g id="DEVICE_NAME">%2$s</xliff:g> తరఫున అనుమతిని రిక్వెస్ట్ చేస్తోంది"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"మీ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> నుండి ఈ సమాచారాన్ని యాక్సెస్ చేయడానికి &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;‌ను అనుమతించండి"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"మీ <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> ఫోటోలను, మీడియాను, ఇంకా నోటిఫికేషన్‌లను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g> మీ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> తరఫున అనుమతిని రిక్వెస్ట్ చేస్తోంది"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"మీ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> యాప్‌లను, సిస్టమ్ ఫీచర్‌లను &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;‌కు స్ట్రీమ్ చేయడానికి &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt;‌ను అనుమతించాలా?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"ఆడియో, ఫోటోలు, పేమెంట్ సమాచారం, పాస్‌వర్డ్‌లతో సహా మీ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>‌లో కనిపించే లేదా ప్లే అయ్యే దేనికైనా <xliff:g id="APP_NAME_0">%1$s</xliff:g>‌కు యాక్సెస్ ఉంటుంది.&lt;br/&gt;&lt;br/&gt;మీరు ఈ అనుమతికి యాక్సెస్‌ను తీసివేసే వరకు <xliff:g id="APP_NAME_1">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%3$s</xliff:g>‌కు యాప్‌లను, సిస్టమ్ ఫీచర్‌లను స్ట్రీమ్ చేయగలదు."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"మీ పరికరాలలో యాప్‌లను, ఇతర సిస్టమ్ ఫీచర్‌లను స్ట్రీమ్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g> మీ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> తరఫున అనుమతిని రిక్వెస్ట్ చేస్తోంది"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"పరికరం"</string>
     <string name="summary_generic" msgid="1761976003668044801">"కాల్ చేస్తున్న వారి పేరు వంటి సమాచారాన్ని ఈ యాప్ మీ ఫోన్ కు, ఎంచుకున్న పరికరానికీ మధ్య సింక్ చేయగలుగుతుంది"</string>
     <string name="consent_yes" msgid="8344487259618762872">"అనుమతించండి"</string>
diff --git a/packages/CompanionDeviceManager/res/values-th/strings.xml b/packages/CompanionDeviceManager/res/values-th/strings.xml
index eb9a6ed..c157186 100644
--- a/packages/CompanionDeviceManager/res/values-th/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-th/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"อนุญาตให้ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; จัดการ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ไหม"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"อุปกรณ์"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"แอปนี้จะได้รับสิทธิ์ดังต่อไปนี้ใน<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>ของคุณ"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"อนุญาตให้ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; สตรีมแอปใน<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ของคุณไปยัง &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; ไหม"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> จะมีสิทธิ์เข้าถึงทุกอย่างที่ปรากฏหรือเล่นบน<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ซึ่งรวมถึงเสียง รูปภาพ รหัสผ่าน และข้อความ&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> จะสามารถสตรีมแอปไปยัง <xliff:g id="DEVICE_NAME">%3$s</xliff:g> ได้จนกว่าคุณจะนำสิทธิ์เข้าถึงนี้ออก"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังขอสิทธิ์ในนามของ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> เพื่อแสดงและสตรีมแอประหว่างอุปกรณ์ต่างๆ ของคุณ"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"อนุญาตให้ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; เข้าถึงข้อมูลนี้จาก<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ของคุณ"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังขอสิทธิ์ในนามของ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> เพื่อเข้าถึงรูปภาพ สื่อ และการแจ้งเตือนใน<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>ของคุณ"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"อนุญาตให้ &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; สตรีมแอปและฟีเจอร์ของระบบใน<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ของคุณไปยัง &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; ไหม"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> จะมีสิทธิ์เข้าถึงทุกอย่างที่ปรากฏหรือเล่นบน<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ซึ่งรวมถึงเสียง รูปภาพ ข้อมูลการชำระเงิน รหัสผ่าน และข้อความ&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> จะสามารถสตรีมแอปและฟีเจอร์ของระบบไปยัง <xliff:g id="DEVICE_NAME">%3$s</xliff:g> ได้จนกว่าคุณจะนำสิทธิ์เข้าถึงนี้ออก"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังขอสิทธิ์ในนามของ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> เพื่อสตรีมแอปและฟีเจอร์อื่นๆ ของระบบระหว่างอุปกรณ์"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"อุปกรณ์"</string>
     <string name="summary_generic" msgid="1761976003668044801">"แอปนี้จะสามารถซิงค์ข้อมูล เช่น ชื่อของบุคคลที่โทรเข้ามา ระหว่างโทรศัพท์ของคุณและอุปกรณ์ที่เลือกไว้ได้"</string>
     <string name="consent_yes" msgid="8344487259618762872">"อนุญาต"</string>
diff --git a/packages/CompanionDeviceManager/res/values-tl/strings.xml b/packages/CompanionDeviceManager/res/values-tl/strings.xml
index bce6c7c..ffa91b1 100644
--- a/packages/CompanionDeviceManager/res/values-tl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-tl/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Payagan ang &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na pamahalaan ang &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Papayagan ang app na ito na ma-access ang mga pahintulot na ito sa iyong <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Payagan ang &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na i-stream ang mga app ng iyong <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> sa &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"Magkakaroon ang <xliff:g id="APP_NAME_0">%1$s</xliff:g> ng access sa kahit anong nakikita o pine-play sa <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, kasama na ang audio, mga larawan, password, at mensahe.&lt;br/&gt;&lt;br/&gt;Magagawa ng <xliff:g id="APP_NAME_1">%1$s</xliff:g> na mag-stream ng mga app sa <xliff:g id="DEVICE_NAME">%3$s</xliff:g> hanggang sa alisin mo ang access sa pahintulot na ito."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Humihiling ng pahintulot ang <xliff:g id="APP_NAME">%1$s</xliff:g> para sa iyong <xliff:g id="DEVICE_NAME">%2$s</xliff:g> na makapagpakita at makapag-stream ng mga app sa mga device mo"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Payagan ang &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na i-access ang impormasyong ito sa iyong <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Humihiling ng pahintulot ang <xliff:g id="APP_NAME">%1$s</xliff:g> para sa iyong <xliff:g id="DEVICE_NAME">%2$s</xliff:g> na ma-access ang mga larawan, media, at notification ng <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> mo"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Payagan ang &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; na i-stream ang mga app at feature ng system ng iyong <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>’ sa &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"Magkakaroon ng access ang <xliff:g id="APP_NAME_0">%1$s</xliff:g> sa kahit anong nakikita o pine-play sa iyong <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, kasama ang audio, mga larawan, impormasyon sa pagbabayad, mga password, at mga mensahe.&lt;br/&gt;&lt;br/&gt;Magagawa ng <xliff:g id="APP_NAME_1">%1$s</xliff:g> na mag-stream ng mga app sa <xliff:g id="DEVICE_NAME">%3$s</xliff:g> hanggang sa alisin mo ang access sa pahintulot na ito."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Humihiling ng pahintulot ang <xliff:g id="APP_NAME">%1$s</xliff:g> para sa iyong <xliff:g id="DEVICE_NAME">%2$s</xliff:g> na mag-stream ng mga app at iba pang feature ng system sa pagitan ng mga device mo"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Magagawa ng app na ito na mag-sync ng impormasyon, tulad ng pangalan ng isang taong tumatawag, sa pagitan ng iyong telepono at ng napiling device"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Payagan"</string>
diff --git a/packages/CompanionDeviceManager/res/values-tr/strings.xml b/packages/CompanionDeviceManager/res/values-tr/strings.xml
index 131f2e3..44d6bf7 100644
--- a/packages/CompanionDeviceManager/res/values-tr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-tr/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; uygulamasına &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; cihazını yönetmesi için izin verilsin mi?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"Cihaz"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Bu uygulamanın <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> cihazınızda şu izinlere erişmesine izin verilecek:"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; adlı uygulamanın <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> cihazınızdaki uygulamaları &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; cihazına aktarmasına izin verilsin mi?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>; ses, fotoğraflar, şifreler ve mesajlar da dahil olmak üzere <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> cihazında görünen veya oynatılan her şeye erişebilecek.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> siz bu iznin erişimini kaldırana kadar uygulamaları <xliff:g id="DEVICE_NAME">%3$s</xliff:g> cihazına aktarabilecek."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g>, cihazlarınız arasında uygulamaları göstermek ve aktarmak için <xliff:g id="DEVICE_NAME">%2$s</xliff:g> cihazınız adına izin istiyor"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; uygulamasının, <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> cihazınızdaki bu bilgilere erişmesine izin verin"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> içindeki fotoğraf, medya ve bildirimlere erişmek için <xliff:g id="DEVICE_NAME">%2$s</xliff:g> cihazınız adına izin istiyor"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; adlı uygulamanın <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> cihazınızdaki uygulamaları ve sistem özelliklerini &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; cihazına aktarmasına izin verilsin mi?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>; ses, fotoğraflar, ödeme bilgileri, şifreler ve mesajlar da dahil olmak üzere <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> cihazınızda görünen veya oynatılan her şeye erişebilecek.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> siz bu iznin erişimini kaldırana kadar uygulamaları ve diğer sistem özelliklerini <xliff:g id="DEVICE_NAME">%3$s</xliff:g> cihazına aktarabilecek."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g>, cihazlarınız arasında uygulamaları ve diğer sistem özelliklerini aktarmak için <xliff:g id="DEVICE_NAME">%2$s</xliff:g> cihazınız adına izin istiyor"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"cihaz"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Bu uygulama, arayan kişinin adı gibi bilgileri telefonunuz ve seçili cihaz arasında senkronize edebilir"</string>
     <string name="consent_yes" msgid="8344487259618762872">"İzin ver"</string>
diff --git a/packages/CompanionDeviceManager/res/values-uk/strings.xml b/packages/CompanionDeviceManager/res/values-uk/strings.xml
index f170d3c..1d248b6 100644
--- a/packages/CompanionDeviceManager/res/values-uk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-uk/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Дозволити додатку &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; керувати пристроєм &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"пристрій"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Цей додаток матиме доступ до перелічених нижче дозволів на вашому <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Дозволити додатку &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; транслювати додатки на вашому <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> на пристрій &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"Додаток <xliff:g id="APP_NAME_0">%1$s</xliff:g> матиме доступ до контенту, що відображається чи відтворюється на <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, зокрема до аудіо, фото, паролів і повідомлень.&lt;br/&gt;&lt;br/&gt;Додаток <xliff:g id="APP_NAME_1">%1$s</xliff:g> зможе транслювати додатки на пристрої \"<xliff:g id="DEVICE_NAME">%3$s</xliff:g>\", поки ви не скасуєте цей дозвіл."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> від імені вашого пристрою \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" запитує дозвіл на відображення й транслювання додатків на ваших пристроях"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Дозвольте додатку &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; доступ до цієї інформації на вашому <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> від імені вашого пристрою \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" запитує дозвіл на доступ до фотографій, медіафайлів і сповіщень на вашому <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Дозволити пристрою &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; транслювати додатки й системні функції на <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> на пристрій &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"Додаток <xliff:g id="APP_NAME_0">%1$s</xliff:g>матиме доступ до контенту, що відображається чи відтворюється на вашому <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, зокрема до аудіо, фото, платіжної інформації, паролів і повідомлень.&lt;br/&gt;&lt;br/&gt;Додаток <xliff:g id="APP_NAME_1">%1$s</xliff:g> зможе транслювати додатки й системні функції на <xliff:g id="DEVICE_NAME">%3$s</xliff:g>, поки ви не скасуєте цей дозвіл."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> від імені вашого пристрою \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" запитує дозвіл на транслювання додатків й інших системних функцій на ваших пристроях"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"пристрій"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Цей додаток зможе синхронізувати інформацію (наприклад, ім’я абонента, який викликає) між телефоном і вибраним пристроєм"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Дозволити"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ur/strings.xml b/packages/CompanionDeviceManager/res/values-ur/strings.xml
index fd6537e..64732e8 100644
--- a/packages/CompanionDeviceManager/res/values-ur/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ur/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"‏&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; کو &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; کا نظم کرنے کی اجازت دیں؟"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"آلہ"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"اس ایپ کو آپ کے <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> پر ان اجازتوں تک رسائی کی اجازت ہوگی"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"‏&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; کو آپ کے <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> کی ایپس کو <xliff:g id="DEVICE_NAME">%3$s</xliff:g> پر سلسلہ بندی کرنے کی اجازت دیں؟"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"‏<xliff:g id="APP_NAME_0">%1$s</xliff:g> کو <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> پر دکھائی دینے والی یا چلائی جانے والی کسی بھی چیز تک رسائی حاصل ہوگی، بشمول آڈیو، تصاویر، پاس ورڈز اور پیغامات۔&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%3$s</xliff:g> پر اس وقت تک ایپس کی سلسلہ بندی کر سکے گی جب تک آپ اس اجازت تک رسائی کو ہٹا نہیں دیتے۔"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> ایپ آپ کے <xliff:g id="DEVICE_NAME">%2$s</xliff:g> کی جانب سے آپ کے آلات کے درمیان ایپس کو ڈسپلے اور اسٹریم کرنے کے لیے اجازت کی درخواست کر رہی ہے"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"‏‎&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;‎ کو آپ کے <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> سے ان معلومات تک رسائی حاصل کرنے کی اجازت دیں"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> ایپ آپ کے <xliff:g id="DEVICE_NAME">%2$s</xliff:g> کی جانب سے آپ کے <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> کی تصاویر، میڈیا اور اطلاعات تک رسائی کی اجازت کی درخواست کر رہی ہے"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"‏‎&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt;‎ کو آپ کے <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> کی ایپس اور سسٹم کی خصوصیات کو ‎&lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;‎ پر سلسلہ بندی کرنے کی اجازت دیں؟"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"‏<xliff:g id="APP_NAME_0">%1$s</xliff:g> کو آپ کے <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> پر دکھائی دینے والی یا چلائی جانے والی کسی بھی چیز تک رسائی حاصل ہوگی، بشمول آڈیو، تصاویر، ادائیگی کی معلومات، پاس ورڈز اور پیغامات۔;lt;br/&gt;&lt;br/&amp;gt&amp;<xliff:g id="APP_NAME_1">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%3$s</xliff:g> پر اس وقت تک ایپس اور سسٹم کی خصوصیات کی سلسلہ بندی کر سکے گی جب تک آپ اس اجازت تک رسائی کو ہٹا نہیں دیتے۔"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> ایپ آپ کے <xliff:g id="DEVICE_NAME">%2$s</xliff:g> کی جانب سے آپ کے آلات کے درمیان ایپس اور سسٹم کی دیگر خصوصیات کی سلسلہ بندی کرنے کی اجازت کی درخواست کر رہی ہے"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"آلہ"</string>
     <string name="summary_generic" msgid="1761976003668044801">"یہ ایپ آپ کے فون اور منتخب کردہ آلے کے درمیان معلومات، جیسے کسی کال کرنے والے کے نام، کی مطابقت پذیری کر سکے گی"</string>
     <string name="consent_yes" msgid="8344487259618762872">"اجازت دیں"</string>
diff --git a/packages/CompanionDeviceManager/res/values-uz/strings.xml b/packages/CompanionDeviceManager/res/values-uz/strings.xml
index f7a1ef7..4b0c48a 100644
--- a/packages/CompanionDeviceManager/res/values-uz/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-uz/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ilovasiga &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; qurilmasini boshqarish uchun ruxsat berilsinmi?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"qurilma"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Bu ilova <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> qurilmasida quyidagi ruxsatlarni oladi"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>dagi ilovalarni &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; qurilmasiga striming qilishiga ruxsat berasizmi?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>da koʻrinadigan yoki ijro etiladigan hamma narsaga, jumladan, audio, rasmlar, parollar va xabarlarga kirish huquqini oladi.&lt;br/&gt;&lt;br/&gt;Bu ruxsatni olib tashlamaguningizcha, <xliff:g id="APP_NAME_1">%1$s</xliff:g> ilovalarni <xliff:g id="DEVICE_NAME">%3$s</xliff:g> qurilmasiga striming qila oladi."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nomidan ilovalarni koʻrsatish va striming qilishga ruxsat soʻramoqda"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ilovasiga <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>dagi ushbu maʼlumot uchun ruxsat bering"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nomidan <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>dagi suratlar, media va bildirishnomalarga kirish uchun ruxsat soʻramoqda"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>dagi ilovalar va tizim funksiyalarini &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; qurilmasiga striming qilishiga ruxsat berasizmi?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>da koʻrinadigan yoki ijro etiladigan hamma narsaga, jumladan, audio, rasmlar, toʻlov axboroti, parollar va xabarlarga kirish huquqini oladi.&lt;br/&gt;&lt;br/&gt;Bu ruxsatni olib tashlamaguningizcha, <xliff:g id="APP_NAME_1">%1$s</xliff:g> ilovalarni va tizim funksiyalarini <xliff:g id="DEVICE_NAME">%3$s</xliff:g> qurilmasiga striming qila oladi."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> qurilmalaringiz orasida ilovalar va boshqa tizim funksiyalarini striming qilish uchun <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nomidan ruxsat soʻramoqda"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"qurilma"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Bu ilova telefoningiz va tanlangan qurilmada chaqiruvchining ismi kabi maʼlumotlarni sinxronlay oladi"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Ruxsat"</string>
diff --git a/packages/CompanionDeviceManager/res/values-vi/strings.xml b/packages/CompanionDeviceManager/res/values-vi/strings.xml
index e668a69..0b65172 100644
--- a/packages/CompanionDeviceManager/res/values-vi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-vi/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Cho phép &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; quản lý &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"thiết bị"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Ứng dụng này sẽ được phép dùng những quyền sau trên <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> của bạn"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Cho phép &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; truyền trực tuyến các ứng dụng trên <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> của bạn đến &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> sẽ có quyền truy cập vào mọi nội dung hiển thị hoặc phát trên <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, bao gồm cả âm thanh, ảnh, mật khẩu và tin nhắn.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> sẽ có thể truyền trực tuyến các ứng dụng đến <xliff:g id="DEVICE_NAME">%3$s</xliff:g> cho đến khi bạn thu hồi quyền này."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang yêu cầu quyền thay cho <xliff:g id="DEVICE_NAME">%2$s</xliff:g> để hiển thị và truyền trực tuyến các ứng dụng giữa các thiết bị của bạn"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Cho phép &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; truy cập vào thông tin này trên <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> của bạn"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang yêu cầu quyền thay cho <xliff:g id="DEVICE_NAME">%2$s</xliff:g> để truy cập vào ảnh, nội dung nghe nhìn và thông báo trên <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> của bạn"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Cho phép &lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; truyền trực tuyến các ứng dụng và tính năng của hệ thống trên <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> của bạn đến &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> sẽ có quyền truy cập vào mọi nội dung hiển thị hoặc phát trên <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> của bạn, bao gồm cả âm thanh, ảnh, thông tin thanh toán, mật khẩu và tin nhắn.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_1">%1$s</xliff:g> sẽ có thể truyền trực tuyến các ứng dụng và tính năng của hệ thống đến <xliff:g id="DEVICE_NAME">%3$s</xliff:g> cho đến khi bạn thu hồi quyền này."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang yêu cầu quyền thay cho <xliff:g id="DEVICE_NAME">%2$s</xliff:g> để truyền trực tuyến các ứng dụng và những tính năng khác của hệ thống giữa các thiết bị của bạn"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"thiết bị"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Ứng dụng này sẽ đồng bộ hoá thông tin (ví dụ: tên người gọi) giữa điện thoại của bạn và thiết bị bạn chọn"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Cho phép"</string>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
index 8adb160..80e2d50 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"允许&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;管理&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"设备"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"该应用将能获得您<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>上的以下权限"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"允许&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;将您<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>上的应用流式传输到&lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;吗?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"“<xliff:g id="APP_NAME_0">%1$s</xliff:g>”将能访问<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>上可见或播放的任何内容,包括音频、照片、密码和消息。&lt;br/&gt;&lt;br/&gt;“<xliff:g id="APP_NAME_1">%1$s</xliff:g>”能将应用流式传输到“<xliff:g id="DEVICE_NAME">%3$s</xliff:g>”,除非您撤消此访问权限。"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”正代表您的“<xliff:g id="DEVICE_NAME">%2$s</xliff:g>”请求在设备之间显示和流式传输应用"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"允许&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;访问您<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>中的这项信息"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”正代表您的“<xliff:g id="DEVICE_NAME">%2$s</xliff:g>”请求访问您<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>上的照片、媒体内容和通知"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"允许&lt;strong&gt;<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt;将您<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>上的应用和系统功能流式传输到&lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;吗?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"“<xliff:g id="APP_NAME_0">%1$s</xliff:g>”将能访问您<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>上可见或播放的任何内容,包括音频、照片、付款信息、密码和消息。&lt;br/&gt;&lt;br/&gt;“<xliff:g id="APP_NAME_1">%1$s</xliff:g>”能将应用和系统功能流式传输到“<xliff:g id="DEVICE_NAME">%3$s</xliff:g>”,除非您撤消此访问权限。"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”正代表您的“<xliff:g id="DEVICE_NAME">%2$s</xliff:g>”请求在设备之间流式传输应用和其他系统功能"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"设备"</string>
     <string name="summary_generic" msgid="1761976003668044801">"此应用将能在您的手机和所选设备之间同步信息,例如来电者的姓名"</string>
     <string name="consent_yes" msgid="8344487259618762872">"允许"</string>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
index fee37dd..cfb1422 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;管理「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;嗎?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"裝置"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"此應用程式將可在<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>上取得以下權限"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」串流<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>應用程式內容至「<xliff:g id="DEVICE_NAME">%3$s</xliff:g>」嗎?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"「<xliff:g id="APP_NAME_0">%1$s</xliff:g>」將能存取<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>上顯示或播放的任何內容,包括音訊、相片、密碼和訊息。&lt;br/&gt;&lt;br/&gt;「<xliff:g id="APP_NAME_1">%1$s</xliff:g>」將能串流應用程式內容至「<xliff:g id="DEVICE_NAME">%3$s</xliff:g>」,直至你移除此存取權限為止。"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」要求權限,以便在裝置間顯示和串流應用程式的內容"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」在<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>上存取這項資料"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」要求權限,以便存取<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>上的相片、媒體和通知"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"要允許「<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>」串流<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>應用程式內容和系統功能至「<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>」嗎?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"「<xliff:g id="APP_NAME_0">%1$s</xliff:g>」將能存取<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>上顯示或播放的任何內容,包括音訊、相片、付款資料、密碼和訊息。&lt;br/&gt;&lt;br/&gt;「<xliff:g id="APP_NAME_1">%1$s</xliff:g>」將能串流應用程式內容和系統功能至「<xliff:g id="DEVICE_NAME">%3$s</xliff:g>」,直至你移除此存取權限為止。"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」要求權限,以便在裝置間串流應用程式內容和其他系統功能"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string>
     <string name="summary_generic" msgid="1761976003668044801">"此應用程式將可同步手機和所選裝置的資訊,例如來電者的名稱"</string>
     <string name="consent_yes" msgid="8344487259618762872">"允許"</string>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
index 28a3baf..490d1bd 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;管理「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;嗎?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"裝置"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"這個應用程式將可取得<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>上的這些權限"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;將<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>的應用程式串流傳輸到 &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; 嗎?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"「<xliff:g id="APP_NAME_0">%1$s</xliff:g>」將可存取<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>顯示或播放的所有內容,包括音訊、相片、密碼和訊息。&lt;br/&gt;&lt;br/&gt;「<xliff:g id="APP_NAME_1">%1$s</xliff:g>」可將應用程式串流傳輸到 <xliff:g id="DEVICE_NAME">%3$s</xliff:g>,直到你移除這個權限為止。"</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表你的 <xliff:g id="DEVICE_NAME">%2$s</xliff:g> 要求必要權限,以便在裝置間顯示及串流傳輸應用程式"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;存取<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>中的這項資訊"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表你的 <xliff:g id="DEVICE_NAME">%2$s</xliff:g> 要求必要權限,以便存取<xliff:g id="DEVICE_TYPE">%3$s</xliff:g>上的相片、媒體和通知"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"要允許「<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;將<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>的應用程式和系統功能串流傳輸到 &lt;strong&gt;<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt; 嗎?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"「<xliff:g id="APP_NAME_0">%1$s</xliff:g>」將可存取<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>顯示或播放的所有內容,包括音訊、相片、付款資訊、密碼和訊息。&lt;br/&gt;&lt;br/&gt;「<xliff:g id="APP_NAME_1">%1$s</xliff:g>」可將應用程式和系統功能串流傳輸到 <xliff:g id="DEVICE_NAME">%3$s</xliff:g>,直到你移除這個權限為止。"</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表 <xliff:g id="DEVICE_NAME">%2$s</xliff:g> 要求必要權限,以便在裝置間串流傳輸應用程式和其他系統功能"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string>
     <string name="summary_generic" msgid="1761976003668044801">"這個應用程式將可在手機和指定裝置間同步資訊,例如來電者名稱"</string>
     <string name="consent_yes" msgid="8344487259618762872">"允許"</string>
diff --git a/packages/CompanionDeviceManager/res/values-zu/strings.xml b/packages/CompanionDeviceManager/res/values-zu/strings.xml
index 5966f8b..3003fb8 100644
--- a/packages/CompanionDeviceManager/res/values-zu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zu/strings.xml
@@ -25,17 +25,23 @@
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Vumela i-&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ukuthi ifinyelele i-&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"idivayisi"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Le-app izovunyelwa ukufinyelela lezi zimvume ku-<xliff:g id="DEVICE_TYPE">%1$s</xliff:g> yakho"</string>
-    <string name="title_app_streaming" msgid="6845373585257287200">"Vumela &lt;strong&gt;i-<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ukuze isakaze ama-app e-<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> yakho &lt;strong&gt;ku-<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_app_streaming" msgid="1274464413649731829">"I-<xliff:g id="APP_NAME_0">%1$s</xliff:g> izokwazi ukufinyelela kunoma yini ebonakalayo noma edlalwayo ku-<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, okuhlanganisa umsindo, izithombe, amaphasiwedi, nemilayezo.&lt;br/&gt;&lt;br/&gt;I-<xliff:g id="APP_NAME_1">%1$s</xliff:g> izokwazi ukusakaza ama-app ku-<xliff:g id="DEVICE_NAME">%3$s</xliff:g> uze ususe ukufinyelela kule mvume."</string>
-    <string name="helper_summary_app_streaming" msgid="1944832605534698562">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> icela imvume esikhundleni se-<xliff:g id="DEVICE_NAME">%2$s</xliff:g> yakho yokubonisa nokusakaza ama-app phakathi kwamadivayisi wakho"</string>
+    <!-- no translation found for title_app_streaming (1047090167914857893) -->
+    <skip />
+    <!-- no translation found for summary_app_streaming (7990244299655610920) -->
+    <skip />
+    <!-- no translation found for helper_summary_app_streaming (1872657107404139828) -->
+    <skip />
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4782923323932440751">"Vumela &lt;strong&gt;i-<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ukuze ifinyelele lolu lwazi ukusuka ku-<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> yakho"</string>
     <string name="summary_computer" msgid="3798467601598297062"></string>
     <string name="helper_summary_computer" msgid="2298803016482139668">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> icela imvume esikhundleni se-<xliff:g id="DEVICE_NAME">%2$s</xliff:g> yakho ukuze ifinyelele izithombe ze-<xliff:g id="DEVICE_TYPE">%3$s</xliff:g> yakho, imidiya nezaziso"</string>
-    <string name="title_nearby_device_streaming" msgid="4295322493408411976">"Vumela &lt;strong&gt;i-<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt; ukuze isakaze ama-app e-<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> yakho nezakhi zesistimu &lt;strong&gt;ku-<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="summary_nearby_device_streaming" msgid="962267343109051648">"I-<xliff:g id="APP_NAME_0">%1$s</xliff:g> izokwazi ukufinyelela kunoma yini ebonakalayo noma edlalwayo ku-<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> yakho, okuhlanganisa umsindo, izithombe, ulwazi lokukhokha, amaphasiwedi, nemilayezo.&lt;br/&gt;&lt;br/&gt;I-<xliff:g id="APP_NAME_1">%1$s</xliff:g> izokwazi ukusakaza ama-app nezakhi zesistimu ku-<xliff:g id="DEVICE_NAME">%3$s</xliff:g> uze ususe ukufinyelela kule mvume."</string>
-    <string name="helper_summary_nearby_device_streaming" msgid="8509848562931818793">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> icela imvume esikhundleni se-<xliff:g id="DEVICE_NAME">%2$s</xliff:g> yakho ukuze isakaze ama-app nezinye zakhi zesistimu phakathi kwamadivayisi wakho"</string>
+    <!-- no translation found for title_nearby_device_streaming (2727103756701741359) -->
+    <skip />
+    <!-- no translation found for summary_nearby_device_streaming (70434958004946884) -->
+    <skip />
+    <!-- no translation found for helper_summary_nearby_device_streaming (4712712177819370967) -->
+    <skip />
     <string name="profile_name_generic" msgid="6851028682723034988">"idivayisi"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Le app izokwazi ukuvumelanisa ulwazi, njengegama lomuntu othile ofonayo, phakathi kwefoni yakho nedivayisi ekhethiwe"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Vumela"</string>
diff --git a/packages/CompanionDeviceManager/res/values/strings.xml b/packages/CompanionDeviceManager/res/values/strings.xml
index a57d6eb..b266912 100644
--- a/packages/CompanionDeviceManager/res/values/strings.xml
+++ b/packages/CompanionDeviceManager/res/values/strings.xml
@@ -50,13 +50,13 @@
     <!-- ================= DEVICE_PROFILE_APP_STREAMING ================= -->
 
     <!-- Confirmation for associating an application with a companion device of APP_STREAMING profile (type) [CHAR LIMIT=NONE] -->
-    <string name="title_app_streaming">Allow &lt;strong&gt;<xliff:g id="app_name" example="Exo">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="device_type" example="phone">%2$s</xliff:g>\u2019s apps to &lt;strong&gt;<xliff:g id="device_name" example="Chromebook">%3$s</xliff:g>&lt;/strong&gt;?</string>
+    <string name="title_app_streaming">Allow &lt;strong&gt;<xliff:g id="app_name" example="Exo">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="device_type" example="phone">%2$s</xliff:g>\u2019s apps and system features to &lt;strong&gt;<xliff:g id="device_name" example="Chromebook">%3$s</xliff:g>&lt;/strong&gt;?</string>
 
     <!-- Summary for associating an application with a companion device of APP_STREAMING profile [CHAR LIMIT=NONE] -->
-    <string name="summary_app_streaming"><xliff:g id="app_name" example="Exo">%1$s</xliff:g> will have access to anything that’s visible or played on the <xliff:g id="device_type" example="phone">%2$s</xliff:g>, including audio, photos, passwords, and messages.&lt;br/>&lt;br/><xliff:g id="app_name" example="Exo">%1$s</xliff:g> will be able to stream apps to <xliff:g id="device_name" example="Chromebook">%3$s</xliff:g> until you remove access to this permission.</string>
+    <string name="summary_app_streaming"><xliff:g id="app_name" example="Exo">%1$s</xliff:g> will have access to anything that’s visible or played on your <xliff:g id="device_type" example="phone">%2$s</xliff:g>, including audio, photos, payment info, passwords, and messages.&lt;br/>&lt;br/><xliff:g id="app_name" example="Exo">%1$s</xliff:g> will be able to stream apps to <xliff:g id="device_name" example="Chromebook">%3$s</xliff:g> until you remove access to this permission.</string>
 
     <!-- Description of the helper dialog for APP_STREAMING profile. [CHAR LIMIT=NONE] -->
-    <string name="helper_summary_app_streaming"><xliff:g id="app_name" example="GMS">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="device_name" example="Chromebook">%2$s</xliff:g> to display and stream apps between your devices</string>
+    <string name="helper_summary_app_streaming"><xliff:g id="app_name" example="Exo">%1$s</xliff:g> is requesting permission on behalf of <xliff:g id="device_name" example="Chromebook">%2$s</xliff:g> to stream apps and system features from your <xliff:g id="device_type" example="phone">%3$s</xliff:g></string>
 
     <!-- ================= DEVICE_PROFILE_AUTOMOTIVE_PROJECTION ================= -->
 
@@ -80,13 +80,13 @@
     <!-- ================= DEVICE_PROFILE_NEARBY_DEVICE_STREAMING ================= -->
 
     <!-- Confirmation for associating an application with a companion device of NEARBY_DEVICE_STREAMING profile (type) [CHAR LIMIT=NONE] -->
-    <string name="title_nearby_device_streaming">Allow &lt;strong&gt;<xliff:g id="device_name" example="NearbyStreamer">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="device_type" example="phone">%2$s</xliff:g>\u2019s apps and system features to &lt;strong&gt;<xliff:g id="device_name" example="Chromebook">%3$s</xliff:g>&lt;/strong&gt;?</string>
+    <string name="title_nearby_device_streaming">Allow &lt;strong&gt;<xliff:g id="app_name" example="Exo">%1$s</xliff:g>&lt;/strong&gt; to stream your <xliff:g id="device_type" example="phone">%2$s</xliff:g>\u2019s apps to &lt;strong&gt;<xliff:g id="device_name" example="Chromebook">%3$s</xliff:g>&lt;/strong&gt;?</string>
 
     <!-- Summary for associating an application with a companion device of NEARBY_DEVICE_STREAMING profile [CHAR LIMIT=NONE] -->
-    <string name="summary_nearby_device_streaming"><xliff:g id="app_name" example="Exo">%1$s</xliff:g> will have access to anything that’s visible or played on your <xliff:g id="device_type" example="phone">%2$s</xliff:g>, including audio, photos, payment info, passwords, and messages.&lt;br/>&lt;br/><xliff:g id="app_name" example="Exo">%1$s</xliff:g> will be able to stream apps and system features to <xliff:g id="device_name" example="Chromebook">%3$s</xliff:g> until you remove access to this permission.</string>
+    <string name="summary_nearby_device_streaming"><xliff:g id="app_name" example="Exo">%1$s</xliff:g> will have access to anything that’s visible or played on <xliff:g id="device_name" example="Chromebook">%3$s</xliff:g>, including audio, photos, payment info, passwords, and messages.&lt;br/>&lt;br/><xliff:g id="app_name" example="Exo">%1$s</xliff:g> will be able to stream apps to <xliff:g id="device_name" example="Chromebook">%3$s</xliff:g> until you remove access to this permission.</string>
 
     <!-- Description of the helper dialog for NEARBY_DEVICE_STREAMING profile. [CHAR LIMIT=NONE] -->
-    <string name="helper_summary_nearby_device_streaming"><xliff:g id="app_name" example="NearbyStreamerApp">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="device_name" example="NearbyDevice">%2$s</xliff:g> to stream apps and other system features between your devices</string>
+    <string name="helper_summary_nearby_device_streaming"><xliff:g id="app_name" example="Exo">%1$s</xliff:g> is requesting permission on behalf of <xliff:g id="device_name" example="Chromebook">%2$s</xliff:g> to stream apps from your <xliff:g id="device_type" example="phone">%3$s</xliff:g></string>
 
     <!-- ================= null profile ================= -->
 
diff --git a/packages/CrashRecovery/aconfig/flags.aconfig b/packages/CrashRecovery/aconfig/flags.aconfig
index 52e0cbb..c6c49e0 100644
--- a/packages/CrashRecovery/aconfig/flags.aconfig
+++ b/packages/CrashRecovery/aconfig/flags.aconfig
@@ -39,3 +39,10 @@
     bug: "289203818"
     is_fixed_read_only: true
 }
+
+flag {
+    name: "synchronous_reboot_in_rescue_party"
+    namespace: "modularization"
+    description: "Makes reboot and factory reset synchronous in RescueParty"
+    bug: "328203835"
+}
\ No newline at end of file
diff --git a/packages/PackageInstaller/TEST_MAPPING b/packages/PackageInstaller/TEST_MAPPING
index 91882fd..50db501 100644
--- a/packages/PackageInstaller/TEST_MAPPING
+++ b/packages/PackageInstaller/TEST_MAPPING
@@ -1,6 +1,17 @@
 {
   "presubmit": [
     {
+      "name": "CtsPackageInstallerCUJDeviceAdminTestCases",
+      "options":[
+        {
+          "exclude-annotation":"androidx.test.filters.FlakyTest"
+        },
+        {
+          "exclude-annotation":"org.junit.Ignore"
+        }
+      ]
+    },
+    {
       "name": "CtsPackageInstallerCUJInstallationTestCases",
       "options":[
         {
@@ -12,6 +23,17 @@
       ]
     },
     {
+      "name": "CtsPackageInstallerCUJMultiUsersTestCases",
+      "options":[
+        {
+          "exclude-annotation":"androidx.test.filters.FlakyTest"
+        },
+        {
+          "exclude-annotation":"org.junit.Ignore"
+        }
+      ]
+    },
+    {
       "name": "CtsPackageInstallerCUJUninstallationTestCases",
       "options":[
         {
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
index 824dd4a..d688a1a 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
@@ -44,6 +44,7 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Process;
+import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
@@ -100,7 +101,8 @@
     private int mActivityResultCode = Activity.RESULT_CANCELED;
     private int mPendingUserActionReason = -1;
 
-    private final boolean mLocalLOGV = false;
+    private final boolean mLocalLOGV =
+            TextUtils.equals("userdebug", SystemProperties.get("ro.build.type", ""));
     PackageManager mPm;
     AppOpsManager mAppOpsManager;
     UserManager mUserManager;
@@ -143,6 +145,11 @@
     private AlertDialog mDialog;
 
     private void startInstallConfirm() {
+        if (mLocalLOGV) {
+            Log.d(TAG, "startInstallConfirm mAppInfo = " + mAppInfo
+                    + ", existingUpdateOwner = " + getExistingUpdateOwner()
+                    + ", mOriginatingPackage = " + mOriginatingPackage);
+        }
         TextView viewToEnable;
 
         if (mAppInfo != null) {
@@ -183,6 +190,10 @@
         try {
             final String packageName = mPkgInfo.packageName;
             final InstallSourceInfo sourceInfo = mPm.getInstallSourceInfo(packageName);
+            if (mLocalLOGV) {
+                Log.d(TAG, "getExistingUpdateOwner mAppInfo = " + mAppInfo
+                        + ", packageName = " + packageName + ", sourceInfo = " + sourceInfo);
+            }
             return sourceInfo.getUpdateOwnerPackageName();
         } catch (NameNotFoundException e) {
             return null;
@@ -303,6 +314,12 @@
 
     private void initiateInstall() {
         final String existingUpdateOwner = getExistingUpdateOwner();
+        if (mLocalLOGV) {
+            Log.d(TAG, "initiateInstall mAppInfo = " + mAppInfo
+                    + ", existingUpdateOwner = " + existingUpdateOwner
+                    + ", mOriginatingPackage = " + mOriginatingPackage
+                    + ", mSessionId = " + mSessionId);
+        }
         if (mSessionId == SessionInfo.INVALID_ID &&
             !TextUtils.isEmpty(existingUpdateOwner) &&
             !TextUtils.equals(existingUpdateOwner, mOriginatingPackage)) {
@@ -814,15 +831,28 @@
 
         @Override
         public void onOpChanged(String op, String packageName) {
+            if (mLocalLOGV) {
+                Log.d(TAG, "UnknownSourcesListener onOpChanged op = " + op
+                        + ", packageName = " + packageName
+                        + ", mOriginatingPackage = " + mOriginatingPackage);
+            }
             if (!mOriginatingPackage.equals(packageName)) {
                 return;
             }
             unregister(this);
             mActiveUnknownSourcesListeners.remove(this);
+            if (mLocalLOGV) {
+                Log.d(TAG, "UnknownSourcesListener onOpChanged isDestroyed() = "
+                        + isDestroyed());
+            }
             if (isDestroyed()) {
                 return;
             }
             new Handler(Looper.getMainLooper()).postDelayed(() -> {
+                if (mLocalLOGV) {
+                    Log.d(TAG, "UnknownSourcesListener onOpChanged post isDestroyed()"
+                            + "= " + isDestroyed() + ", getIntent() = " + getIntent());
+                }
                 if (!isDestroyed()) {
                     startActivity(getIntent());
                     // The start flag (FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP) doesn't
@@ -840,6 +870,9 @@
     }
 
     private void register(UnknownSourcesListener listener) {
+        if (mLocalLOGV) {
+            Log.d(TAG, "UnknownSourcesListener register");
+        }
         mAppOpsManager.startWatchingMode(
                 AppOpsManager.OPSTR_REQUEST_INSTALL_PACKAGES, mOriginatingPackage,
                 listener);
@@ -847,6 +880,9 @@
     }
 
     private void unregister(UnknownSourcesListener listener) {
+        if (mLocalLOGV) {
+            Log.d(TAG, "UnknownSourcesListener unregister");
+        }
         mAppOpsManager.stopWatchingMode(listener);
         mActiveUnknownSourcesListeners.remove(listener);
     }
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml
index 0d4ef3c..8d6f0da4 100644
--- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml
+++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2021 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.
+    Copyright (C) 2021 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.
   -->
 
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/left_rounded_ripple.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/left_rounded_ripple.xml
index 1584b45..f82388c 100644
--- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/left_rounded_ripple.xml
+++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/left_rounded_ripple.xml
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2021 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.
+    Copyright (C) 2021 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.
   -->
 
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/right_rounded_ripple.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/right_rounded_ripple.xml
index 15f2b5c..3b0cca0 100644
--- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/right_rounded_ripple.xml
+++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/right_rounded_ripple.xml
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2021 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.
+    Copyright (C) 2021 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.
   -->
 
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_ripple.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_ripple.xml
index 90eefbe..bdf9114 100644
--- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_ripple.xml
+++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_ripple.xml
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2021 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.
+    Copyright (C) 2021 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.
   -->
 
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml
index f0da7b4..d56c843 100644
--- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml
+++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2021 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.
+    Copyright (C) 2021 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.
   -->
 
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_ripple.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_ripple.xml
index 06be00d..9270cbe 100644
--- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_ripple.xml
+++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_ripple.xml
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2021 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.
+    Copyright (C) 2021 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.
   -->
 
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/layout-v35/settingslib_expressive_action_buttons.xml b/packages/SettingsLib/ActionButtonsPreference/res/layout-v35/settingslib_expressive_action_buttons.xml
index fc63c0f..3e73ebd 100644
--- a/packages/SettingsLib/ActionButtonsPreference/res/layout-v35/settingslib_expressive_action_buttons.xml
+++ b/packages/SettingsLib/ActionButtonsPreference/res/layout-v35/settingslib_expressive_action_buttons.xml
@@ -35,11 +35,13 @@
             style="@style/SettingsLibActionButton.Expressive"
             android:layout_width="@dimen/settingslib_expressive_space_large3"
             android:layout_height="@dimen/settingslib_expressive_space_medium5"
-            android:layout_gravity="center_horizontal" />
+            android:layout_gravity="center_horizontal"
+            android:importantForAccessibility="no"/>
         <TextView
             android:id="@+id/text1"
             style="@style/SettingsLibActionButton.Expressive.Label"
-            android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"/>
+            android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"
+            android:importantForAccessibility="no"/>
 
     </LinearLayout>
 
@@ -55,11 +57,13 @@
             style="@style/SettingsLibActionButton.Expressive"
             android:layout_width="@dimen/settingslib_expressive_space_large3"
             android:layout_height="@dimen/settingslib_expressive_space_medium5"
-            android:layout_gravity="center_horizontal" />
+            android:layout_gravity="center_horizontal"
+            android:importantForAccessibility="no"/>
         <TextView
             android:id="@+id/text2"
             style="@style/SettingsLibActionButton.Expressive.Label"
-            android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"/>
+            android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"
+            android:importantForAccessibility="no"/>
 
     </LinearLayout>
 
@@ -75,11 +79,13 @@
             style="@style/SettingsLibActionButton.Expressive"
             android:layout_width="@dimen/settingslib_expressive_space_large3"
             android:layout_height="@dimen/settingslib_expressive_space_medium5"
-            android:layout_gravity="center_horizontal" />
+            android:layout_gravity="center_horizontal"
+            android:importantForAccessibility="no"/>
         <TextView
             android:id="@+id/text3"
             style="@style/SettingsLibActionButton.Expressive.Label"
-            android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"/>
+            android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"
+            android:importantForAccessibility="no"/>
 
     </LinearLayout>
 
@@ -95,10 +101,12 @@
             style="@style/SettingsLibActionButton.Expressive"
             android:layout_width="@dimen/settingslib_expressive_space_large3"
             android:layout_height="@dimen/settingslib_expressive_space_medium5"
-            android:layout_gravity="center_horizontal" />
+            android:layout_gravity="center_horizontal"
+            android:importantForAccessibility="no"/>
         <TextView
             android:id="@+id/text4"
             style="@style/SettingsLibActionButton.Expressive.Label"
-            android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"/>
+            android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"
+            android:importantForAccessibility="no"/>
     </LinearLayout>
 </LinearLayout>
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/values/arrays.xml b/packages/SettingsLib/ActionButtonsPreference/res/values/arrays.xml
index fe88845..180564d 100644
--- a/packages/SettingsLib/ActionButtonsPreference/res/values/arrays.xml
+++ b/packages/SettingsLib/ActionButtonsPreference/res/values/arrays.xml
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2021 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.
+    Copyright (C) 2021 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.
   -->
 
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
diff --git a/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java b/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java
index f011039..b286182 100644
--- a/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java
+++ b/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java
@@ -548,16 +548,18 @@
                 if (mButton instanceof MaterialButton) {
                     ((MaterialButton) mButton).setIcon(mIcon);
                 }
+                mButton.setEnabled(mIsEnabled);
+                mActionLayout.setOnClickListener(mListener);
+                mActionLayout.setEnabled(mIsEnabled);
+                mActionLayout.setContentDescription(mText);
             } else {
                 mButton.setText(mText);
                 mButton.setCompoundDrawablesWithIntrinsicBounds(
                         null /* left */, mIcon /* top */, null /* right */, null /* bottom */);
+                mButton.setOnClickListener(mListener);
+                mButton.setEnabled(mIsEnabled);
             }
 
-            mButton.setOnClickListener(mListener);
-            mButton.setEnabled(mIsEnabled);
-
-
             if (shouldBeVisible()) {
                 mButton.setVisibility(View.VISIBLE);
                 if (mIsExpressive) {
diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp
index 0cb85d8..e141867 100644
--- a/packages/SettingsLib/Android.bp
+++ b/packages/SettingsLib/Android.bp
@@ -32,14 +32,18 @@
         "SettingsLibBannerMessagePreference",
         "SettingsLibBarChartPreference",
         "SettingsLibButtonPreference",
+        "SettingsLibBulletPreference",
+        "SettingsLibCardPreference",
         "SettingsLibCollapsingToolbarBaseActivity",
         "SettingsLibDeviceStateRotationLock",
         "SettingsLibDisplayUtils",
         "SettingsLibEmergencyNumber",
         "SettingsLibEntityHeaderWidgets",
+        "SettingsLibExpandablePreference",
         "SettingsLibFooterPreference",
         "SettingsLibHelpUtils",
         "SettingsLibIllustrationPreference",
+        "SettingsLibIntroPreference",
         "SettingsLibLayoutPreference",
         "SettingsLibMainSwitchPreference",
         "SettingsLibProfileSelector",
@@ -49,10 +53,13 @@
         "SettingsLibSelectorWithWidgetPreference",
         "SettingsLibSettingsSpinner",
         "SettingsLibSettingsTransition",
+        "SettingsLibSliderPreference",
+        "SettingsLibStatusBannerPreference",
         "SettingsLibTopIntroPreference",
         "SettingsLibTwoTargetPreference",
         "SettingsLibUsageProgressBarPreference",
         "SettingsLibUtils",
+        "SettingsLibZeroStatePreference",
         "settingslib_media_flags_lib",
         "settingslib_flags_lib",
     ],
diff --git a/packages/SettingsLib/AppPreference/res/layout-v33/preference_app.xml b/packages/SettingsLib/AppPreference/res/layout-v33/preference_app.xml
index 47ce587..b06052a 100644
--- a/packages/SettingsLib/AppPreference/res/layout-v33/preference_app.xml
+++ b/packages/SettingsLib/AppPreference/res/layout-v33/preference_app.xml
@@ -78,15 +78,6 @@
             android:textAppearance="?android:attr/textAppearanceSmall"
             android:textColor="?android:attr/textColorSecondary"
             android:visibility="gone"/>
-
-        <ProgressBar
-            android:id="@android:id/progress"
-            style="?android:attr/progressBarStyleHorizontal"
-            android:layout_width="match_parent"
-            android:layout_height="4dp"
-            android:layout_marginTop="4dp"
-            android:max="100"
-            android:visibility="gone"/>
     </LinearLayout>
 
     <LinearLayout
diff --git a/packages/SettingsLib/AppPreference/res/layout/preference_app.xml b/packages/SettingsLib/AppPreference/res/layout/preference_app.xml
index e65f7de..ac57228 100644
--- a/packages/SettingsLib/AppPreference/res/layout/preference_app.xml
+++ b/packages/SettingsLib/AppPreference/res/layout/preference_app.xml
@@ -74,15 +74,6 @@
             android:textAppearance="?android:attr/textAppearanceSmall"
             android:textColor="?android:attr/textColorSecondary"
             android:visibility="gone"/>
-
-        <ProgressBar
-            android:id="@android:id/progress"
-            style="?android:attr/progressBarStyleHorizontal"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="4dp"
-            android:max="100"
-            android:visibility="gone"/>
     </LinearLayout>
 
     <LinearLayout
diff --git a/packages/SettingsLib/AppPreference/src/com/android/settingslib/widget/AppPreference.java b/packages/SettingsLib/AppPreference/src/com/android/settingslib/widget/AppPreference.java
index f1d162e..3b52df7 100644
--- a/packages/SettingsLib/AppPreference/src/com/android/settingslib/widget/AppPreference.java
+++ b/packages/SettingsLib/AppPreference/src/com/android/settingslib/widget/AppPreference.java
@@ -18,11 +18,8 @@
 
 import android.content.Context;
 import android.util.AttributeSet;
-import android.view.View;
-import android.widget.ProgressBar;
 
 import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
 
 import com.android.settingslib.widget.preference.app.R;
 
@@ -31,9 +28,6 @@
  */
 public class AppPreference extends Preference {
 
-    private int mProgress;
-    private boolean mProgressVisible;
-
     public AppPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
         setLayoutResource(R.layout.preference_app);
@@ -53,29 +47,4 @@
         super(context, attrs);
         setLayoutResource(R.layout.preference_app);
     }
-
-    /**
-     * Sets the current progress.
-     * @param amount the current progress
-     *
-     * @see ProgressBar#setProgress(int)
-     */
-    public void setProgress(int amount) {
-        mProgress = amount;
-        mProgressVisible = true;
-        notifyChanged();
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder view) {
-        super.onBindViewHolder(view);
-
-        final ProgressBar progress = (ProgressBar) view.findViewById(android.R.id.progress);
-        if (mProgressVisible) {
-            progress.setProgress(mProgress);
-            progress.setVisibility(View.VISIBLE);
-        } else {
-            progress.setVisibility(View.GONE);
-        }
-    }
 }
diff --git a/packages/SettingsLib/BulletPreference/Android.bp b/packages/SettingsLib/BulletPreference/Android.bp
new file mode 100644
index 0000000..3ea0b2b
--- /dev/null
+++ b/packages/SettingsLib/BulletPreference/Android.bp
@@ -0,0 +1,33 @@
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "frameworks_base_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["frameworks_base_license"],
+}
+
+android_library {
+    name: "SettingsLibBulletPreference",
+    use_resource_processor: true,
+    defaults: [
+        "SettingsLintDefaults",
+    ],
+
+    srcs: [
+        "src/**/*.java",
+        "src/**/*.kt",
+    ],
+    resource_dirs: ["res"],
+
+    static_libs: [
+        "androidx.annotation_annotation",
+        "androidx.preference_preference",
+        "SettingsLibSettingsTheme",
+    ],
+    sdk_version: "system_current",
+    min_sdk_version: "21",
+    apex_available: [
+        "//apex_available:platform",
+    ],
+}
diff --git a/packages/SettingsLib/BulletPreference/AndroidManifest.xml b/packages/SettingsLib/BulletPreference/AndroidManifest.xml
new file mode 100644
index 0000000..c7495ef
--- /dev/null
+++ b/packages/SettingsLib/BulletPreference/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.android.settingslib.widget.preference.bullet">
+
+    <uses-sdk android:minSdkVersion="21" />
+
+</manifest>
diff --git a/packages/SettingsLib/BulletPreference/res/layout/settingslib_expressive_bullet_icon_frame.xml b/packages/SettingsLib/BulletPreference/res/layout/settingslib_expressive_bullet_icon_frame.xml
new file mode 100644
index 0000000..030f024
--- /dev/null
+++ b/packages/SettingsLib/BulletPreference/res/layout/settingslib_expressive_bullet_icon_frame.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2024 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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/icon_frame"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:minWidth="@dimen/settingslib_expressive_space_medium4"
+    android:gravity="top|start"
+    android:layout_marginTop="@dimen/settingslib_expressive_space_small1"
+    android:paddingStart="@dimen/settingslib_expressive_space_extrasmall4"
+    android:paddingEnd="@dimen/settingslib_expressive_space_small1">
+
+    <androidx.preference.internal.PreferenceImageView
+        android:id="@android:id/icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:maxWidth="@dimen/settingslib_expressive_space_small4"
+        app:maxHeight="@dimen/settingslib_expressive_space_small4"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/BulletPreference/res/layout/settingslib_expressive_bullet_preference.xml b/packages/SettingsLib/BulletPreference/res/layout/settingslib_expressive_bullet_preference.xml
new file mode 100644
index 0000000..3f37f6c
--- /dev/null
+++ b/packages/SettingsLib/BulletPreference/res/layout/settingslib_expressive_bullet_preference.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="?android:attr/listPreferredItemHeightSmall"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:background="?android:attr/selectableItemBackground"
+    android:clipToPadding="false"
+    android:baselineAligned="false">
+
+    <include layout="@layout/settingslib_expressive_bullet_icon_frame"/>
+
+    <include layout="@layout/settingslib_expressive_preference_text_frame"/>
+
+    <!-- Preference should place its actual preference widget here. -->
+    <LinearLayout
+        android:id="@android:id/widget_frame"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:gravity="end|center_vertical"
+        android:paddingStart="@dimen/settingslib_expressive_space_small1"
+        android:paddingEnd="0dp"
+        android:orientation="vertical"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/BulletPreference/src/com/android/settingslib/widget/BulletPreference.kt b/packages/SettingsLib/BulletPreference/src/com/android/settingslib/widget/BulletPreference.kt
new file mode 100644
index 0000000..45e2e9a
--- /dev/null
+++ b/packages/SettingsLib/BulletPreference/src/com/android/settingslib/widget/BulletPreference.kt
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2024 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.settingslib.widget
+
+import android.content.Context
+import android.util.AttributeSet
+import androidx.preference.Preference
+import androidx.preference.PreferenceViewHolder
+
+import com.android.settingslib.widget.preference.bullet.R
+
+/**
+ * The BulletPreference shows a text which describe a feature.
+ */
+class BulletPreference @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0,
+    defStyleRes: Int = 0
+) : Preference(context, attrs, defStyleAttr, defStyleRes) {
+
+    init {
+        layoutResource = R.layout.settingslib_expressive_bullet_preference
+    }
+
+    override fun onBindViewHolder(holder: PreferenceViewHolder) {
+        super.onBindViewHolder(holder)
+        holder.isDividerAllowedAbove = false
+        holder.isDividerAllowedBelow = false
+    }
+}
\ No newline at end of file
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled.xml b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled.xml
new file mode 100644
index 0000000..f55b320
--- /dev/null
+++ b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2024 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+    <com.google.android.material.button.MaterialButton
+        android:id="@+id/settingslib_button"
+        style="@style/SettingsLibButtonStyle.Expressive.Filled" />
+
+</LinearLayout>
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled_extra.xml b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled_extra.xml
new file mode 100644
index 0000000..b663b6c
--- /dev/null
+++ b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled_extra.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2024 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+    <com.google.android.material.button.MaterialButton
+        android:id="@+id/settingslib_button"
+        style="@style/SettingsLibButtonStyle.Expressive.Filled.Extra" />
+
+</LinearLayout>
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled_large.xml b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled_large.xml
new file mode 100644
index 0000000..784e6ad
--- /dev/null
+++ b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled_large.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2024 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+    <com.google.android.material.button.MaterialButton
+        android:id="@+id/settingslib_button"
+        style="@style/SettingsLibButtonStyle.Expressive.Filled.Large" />
+
+</LinearLayout>
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline.xml b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline.xml
new file mode 100644
index 0000000..8b44a65
--- /dev/null
+++ b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2024 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+    <com.google.android.material.button.MaterialButton
+        android:id="@+id/settingslib_button"
+        style="@style/SettingsLibButtonStyle.Expressive.Outline" />
+
+</LinearLayout>
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline_extra.xml b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline_extra.xml
new file mode 100644
index 0000000..f8a2d8f
--- /dev/null
+++ b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline_extra.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2024 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+    <com.google.android.material.button.MaterialButton
+        android:id="@+id/settingslib_button"
+        style="@style/SettingsLibButtonStyle.Expressive.Outline.Extra" />
+
+</LinearLayout>
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline_large.xml b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline_large.xml
new file mode 100644
index 0000000..781a5a1
--- /dev/null
+++ b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline_large.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2024 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+    <com.google.android.material.button.MaterialButton
+        android:id="@+id/settingslib_button"
+        style="@style/SettingsLibButtonStyle.Expressive.Outline.Large" />
+
+</LinearLayout>
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal.xml b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal.xml
new file mode 100644
index 0000000..5b568f8
--- /dev/null
+++ b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2024 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+    <com.google.android.material.button.MaterialButton
+        android:id="@+id/settingslib_button"
+        style="@style/SettingsLibButtonStyle.Expressive.Tonal" />
+
+</LinearLayout>
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal_extra.xml b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal_extra.xml
new file mode 100644
index 0000000..1e7a08b
--- /dev/null
+++ b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal_extra.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2024 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+    <com.google.android.material.button.MaterialButton
+        android:id="@+id/settingslib_button"
+        style="@style/SettingsLibButtonStyle.Expressive.Tonal.Extra" />
+
+</LinearLayout>
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal_large.xml b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal_large.xml
new file mode 100644
index 0000000..42116be
--- /dev/null
+++ b/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal_large.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2024 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+    <com.google.android.material.button.MaterialButton
+        android:id="@+id/settingslib_button"
+        style="@style/SettingsLibButtonStyle.Expressive.Tonal.Large" />
+
+</LinearLayout>
diff --git a/packages/SettingsLib/ButtonPreference/res/values/attrs.xml b/packages/SettingsLib/ButtonPreference/res/values/attrs.xml
index 9a4312a..970eeb2 100644
--- a/packages/SettingsLib/ButtonPreference/res/values/attrs.xml
+++ b/packages/SettingsLib/ButtonPreference/res/values/attrs.xml
@@ -18,5 +18,15 @@
 <resources>
     <declare-styleable name="ButtonPreference">
         <attr name="android:gravity" />
+        <attr name="buttonPreferenceType" format="enum">
+            <enum name="filled" value="0"/>
+            <enum name="tonal" value="1"/>
+            <enum name="outline" value="2"/>
+        </attr>
+        <attr name="buttonPreferenceSize" format="enum">
+            <enum name="normal" value="0"/>
+            <enum name="large" value="1"/>
+            <enum name="extra" value="2"/>
+        </attr>
     </declare-styleable>
 </resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/ButtonPreference/src/com/android/settingslib/widget/ButtonPreference.java b/packages/SettingsLib/ButtonPreference/src/com/android/settingslib/widget/ButtonPreference.java
index 16ba962..979ff96 100644
--- a/packages/SettingsLib/ButtonPreference/src/com/android/settingslib/widget/ButtonPreference.java
+++ b/packages/SettingsLib/ButtonPreference/src/com/android/settingslib/widget/ButtonPreference.java
@@ -32,11 +32,44 @@
 
 import com.android.settingslib.widget.preference.button.R;
 
+import com.google.android.material.button.MaterialButton;
+
 /**
  * A preference handled a button
  */
 public class ButtonPreference extends Preference {
 
+    enum ButtonStyle {
+        FILLED_NORMAL(0, 0, R.layout.settingslib_expressive_button_filled),
+        FILLED_LARGE(0, 1, R.layout.settingslib_expressive_button_filled_large),
+        FILLED_EXTRA(0, 2, R.layout.settingslib_expressive_button_filled_extra),
+        TONAL_NORMAL(1, 0, R.layout.settingslib_expressive_button_tonal),
+        TONAL_LARGE(1, 1, R.layout.settingslib_expressive_button_tonal_large),
+        TONAL_EXTRA(1, 2, R.layout.settingslib_expressive_button_tonal_extra),
+        OUTLINE_NORMAL(2, 0, R.layout.settingslib_expressive_button_outline),
+        OUTLINE_LARGE(2, 1, R.layout.settingslib_expressive_button_outline_large),
+        OUTLINE_EXTRA(2, 2, R.layout.settingslib_expressive_button_outline_extra);
+
+        private final int mType;
+        private final int mSize;
+        private final int mLayoutId;
+
+        ButtonStyle(int type, int size, int layoutId) {
+            this.mType = type;
+            this.mSize = size;
+            this.mLayoutId = layoutId;
+        }
+
+        static int getLayoutId(int type, int size) {
+            for (ButtonStyle style : values()) {
+                if (style.mType == type && style.mSize == size) {
+                    return style.mLayoutId;
+                }
+            }
+            throw new IllegalArgumentException();
+        }
+    }
+
     private static final int ICON_SIZE = 24;
 
     private View.OnClickListener mClickListener;
@@ -86,7 +119,7 @@
     }
 
     private void init(Context context, AttributeSet attrs, int defStyleAttr) {
-        setLayoutResource(R.layout.settingslib_button_layout);
+        int resId = R.layout.settingslib_button_layout;
 
         if (attrs != null) {
             TypedArray a = context.obtainStyledAttributes(attrs,
@@ -102,8 +135,16 @@
                     R.styleable.ButtonPreference, defStyleAttr,
                     0 /*defStyleRes*/);
             mGravity = a.getInt(R.styleable.ButtonPreference_android_gravity, Gravity.START);
+
+            if (SettingsThemeHelper.isExpressiveTheme(context)) {
+                int type = a.getInt(R.styleable.ButtonPreference_buttonPreferenceType, 0);
+                int size = a.getInt(R.styleable.ButtonPreference_buttonPreferenceSize, 0);
+                resId = ButtonStyle.getLayoutId(type, size);
+            }
             a.recycle();
         }
+
+        setLayoutResource(resId);
     }
 
     @Override
@@ -144,14 +185,20 @@
         if (mButton == null || icon == null) {
             return;
         }
-        //get pixel from dp
-        int size = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ICON_SIZE,
-                getContext().getResources().getDisplayMetrics());
-        icon.setBounds(0, 0, size, size);
 
-        //set drawableStart
-        mButton.setCompoundDrawablesRelativeWithIntrinsicBounds(icon, null/* top */, null/* end */,
-                null/* bottom */);
+        if (mButton instanceof MaterialButton) {
+            ((MaterialButton) mButton).setIcon(icon);
+        } else {
+            //get pixel from dp
+            int size = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ICON_SIZE,
+                    getContext().getResources().getDisplayMetrics());
+            icon.setBounds(0, 0, size, size);
+
+            //set drawableStart
+            mButton.setCompoundDrawablesRelativeWithIntrinsicBounds(icon, null/* top */,
+                    null/* end */,
+                    null/* bottom */);
+        }
     }
 
     @Override
diff --git a/packages/SettingsLib/CardPreference/Android.bp b/packages/SettingsLib/CardPreference/Android.bp
new file mode 100644
index 0000000..1d871d1
--- /dev/null
+++ b/packages/SettingsLib/CardPreference/Android.bp
@@ -0,0 +1,33 @@
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "frameworks_base_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["frameworks_base_license"],
+}
+
+android_library {
+    name: "SettingsLibCardPreference",
+    use_resource_processor: true,
+    defaults: [
+        "SettingsLintDefaults",
+    ],
+
+    srcs: [
+        "src/**/*.java",
+        "src/**/*.kt",
+    ],
+    resource_dirs: ["res"],
+
+    static_libs: [
+        "androidx.annotation_annotation",
+        "androidx.preference_preference",
+        "SettingsLibSettingsTheme",
+    ],
+    sdk_version: "system_current",
+    min_sdk_version: "21",
+    apex_available: [
+        "//apex_available:platform",
+    ],
+}
diff --git a/packages/SettingsLib/CardPreference/AndroidManifest.xml b/packages/SettingsLib/CardPreference/AndroidManifest.xml
new file mode 100644
index 0000000..717f66e
--- /dev/null
+++ b/packages/SettingsLib/CardPreference/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.android.settingslib.widget.preference.card">
+
+    <uses-sdk android:minSdkVersion="21" />
+
+</manifest>
diff --git a/packages/SettingsLib/CardPreference/res/layout/settingslib_expressive_preference_card.xml b/packages/SettingsLib/CardPreference/res/layout/settingslib_expressive_preference_card.xml
new file mode 100644
index 0000000..716ed41
--- /dev/null
+++ b/packages/SettingsLib/CardPreference/res/layout/settingslib_expressive_preference_card.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2024 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.
+-->
+<com.google.android.material.card.MaterialCardView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    style="@style/SettingsLibCardStyle">
+
+    <LinearLayout
+        android:id="@+id/card_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:baselineAligned="false"
+        android:minHeight="@dimen/settingslib_expressive_space_large3"
+        android:paddingStart="@dimen/settingslib_expressive_space_small1"
+        android:paddingEnd="@dimen/settingslib_expressive_space_small1"
+        android:orientation="horizontal"
+        android:gravity="center_vertical">
+
+        <LinearLayout
+            android:id="@+id/icon_frame"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:minWidth="@dimen/settingslib_expressive_space_medium3"
+            android:minHeight="@dimen/settingslib_expressive_space_medium3"
+            android:gravity="center"
+            android:orientation="horizontal">
+
+            <ImageView
+                android:id="@android:id/icon"
+                android:src="@drawable/settingslib_arrow_drop_down"
+                android:layout_width="@dimen/settingslib_expressive_space_medium3"
+                android:layout_height="@dimen/settingslib_expressive_space_medium3"
+                android:scaleType="centerInside"/>
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/text_container"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:paddingHorizontal="@dimen/settingslib_expressive_space_small1"
+            android:paddingVertical="@dimen/settingslib_expressive_space_small2"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@android:id/title"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:hyphenationFrequency="normalFast"
+                android:lineBreakWordStyle="phrase"
+                android:textAppearance="@style/TextAppearance.CardTitle.SettingsLib"/>
+
+            <TextView
+                android:id="@android:id/summary"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:hyphenationFrequency="normalFast"
+                android:lineBreakWordStyle="phrase"
+                android:textAppearance="@style/TextAppearance.CardSummary.SettingsLib"/>
+
+        </LinearLayout>
+
+        <ImageView
+            android:id="@android:id/closeButton"
+            android:layout_width="@dimen/settingslib_expressive_space_medium4"
+            android:layout_height="@dimen/settingslib_expressive_space_medium4"
+            android:padding="@dimen/settingslib_expressive_space_extrasmall4"
+            android:layout_gravity="center"
+            android:src="@drawable/settingslib_expressive_icon_close"
+            android:background="?android:attr/selectableItemBackground" />
+
+    </LinearLayout>
+
+</com.google.android.material.card.MaterialCardView>
\ No newline at end of file
diff --git a/packages/SettingsLib/CardPreference/res/values/styles_expressive.xml b/packages/SettingsLib/CardPreference/res/values/styles_expressive.xml
new file mode 100644
index 0000000..4cbdea5
--- /dev/null
+++ b/packages/SettingsLib/CardPreference/res/values/styles_expressive.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2024 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.
+-->
+
+<resources>
+    <style name="TextAppearance.CardTitle.SettingsLib"
+        parent="@style/TextAppearance.PreferenceTitle.SettingsLib">
+        <item name="android:textColor">@color/settingslib_materialColorOnPrimary</item>
+        <item name="android:textSize">20sp</item>
+    </style>
+
+    <style name="TextAppearance.CardSummary.SettingsLib"
+        parent="@style/TextAppearance.PreferenceSummary.SettingsLib">
+        <item name="android:textColor">@color/settingslib_materialColorOnSecondary</item>
+        <item name="android:textSize">14sp</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/CardPreference/src/com/android/settingslib/widget/CardPreference.kt b/packages/SettingsLib/CardPreference/src/com/android/settingslib/widget/CardPreference.kt
new file mode 100644
index 0000000..eb14746
--- /dev/null
+++ b/packages/SettingsLib/CardPreference/src/com/android/settingslib/widget/CardPreference.kt
@@ -0,0 +1,58 @@
+/*
+ * 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.settingslib.widget
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.View
+import androidx.preference.Preference
+import androidx.preference.PreferenceViewHolder
+import com.android.settingslib.widget.preference.card.R
+
+/**
+ * The CardPreference shows a card like suggestion in homepage, which also support dismiss.
+ */
+class CardPreference @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0,
+    defStyleRes: Int = 0
+) : Preference(context, attrs, defStyleAttr, defStyleRes) {
+
+    init {
+        layoutResource = R.layout.settingslib_expressive_preference_card
+    }
+    private var dismissible = false
+        set(value) {
+            if (field != value) {
+                field = value
+                notifyChanged()
+            }
+        }
+
+    override fun onBindViewHolder(holder: PreferenceViewHolder) {
+        super.onBindViewHolder(holder)
+        holder.isDividerAllowedBelow = false
+        holder.isDividerAllowedAbove = false
+
+        holder.findViewById(android.R.id.closeButton)?.let { dismissButton ->
+            dismissButton.visibility = if (dismissible) View.VISIBLE else View.GONE
+            dismissButton.setOnClickListener {
+                isVisible = false
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml
new file mode 100644
index 0000000..ccbe20e
--- /dev/null
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:start="16dp"
+        android:end="16dp"
+        android:top="4dp"
+        android:bottom="4dp">
+        <shape>
+            <size android:width="32dp" android:height="40dp" />
+            <solid android:color="@color/settingslib_materialColorSurfaceContainerHighest" />
+            <corners
+                android:radius="100dp" />
+        </shape>
+    </item>
+
+    <item
+        android:width="24dp"
+        android:height="24dp"
+        android:gravity="center"
+        android:start="16dp"
+        android:end="16dp"
+        android:top="4dp"
+        android:bottom="4dp">
+        <vector
+            android:width="24dp"
+            android:height="24dp"
+            android:viewportWidth="960"
+            android:viewportHeight="960"
+            android:tint="@color/settingslib_materialColorOnSurfaceVariant"
+            android:autoMirrored="true">
+            <path
+                android:fillColor="@android:color/white"
+                android:pathData="M313,520L537,744L480,800L160,480L480,160L537,216L313,440L800,440L800,520L313,520Z"/>
+        </vector>
+    </item>
+</layer-list>
\ No newline at end of file
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v35/settingslib_expressive_collapsing_toolbar_base_layout.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v35/settingslib_expressive_collapsing_toolbar_base_layout.xml
new file mode 100644
index 0000000..b881c57
--- /dev/null
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v35/settingslib_expressive_collapsing_toolbar_base_layout.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+-->
+
+<androidx.coordinatorlayout.widget.CoordinatorLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/content_parent"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:fitsSystemWindows="true">
+
+    <include layout="@layout/settingslib_expressive_collapsing_toolbar_content_layout"/>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v35/settingslib_expressive_collapsing_toolbar_content_layout.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v35/settingslib_expressive_collapsing_toolbar_content_layout.xml
new file mode 100644
index 0000000..6221659
--- /dev/null
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v35/settingslib_expressive_collapsing_toolbar_content_layout.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+-->
+<merge
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <com.google.android.material.appbar.AppBarLayout
+        android:id="@+id/app_bar"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:fitsSystemWindows="true"
+        android:outlineAmbientShadowColor="@android:color/transparent"
+        android:outlineSpotShadowColor="@android:color/transparent"
+        android:background="@android:color/transparent"
+        app:expanded="false"
+        android:theme="@style/SettingsLibTheme.CollapsingToolbar.Expressive">
+
+        <com.google.android.material.appbar.CollapsingToolbarLayout
+            android:id="@+id/collapsing_toolbar"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/settingslib_toolbar_layout_height"
+            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
+            app:toolbarId="@id/action_bar"
+            style="@style/SettingsLibCollapsingToolbarLayoutStyle.Expressive">
+
+            <Toolbar
+                android:id="@+id/action_bar"
+                android:layout_width="match_parent"
+                android:layout_height="?attr/actionBarSize"
+                android:theme="?android:attr/actionBarTheme"
+                android:transitionName="shared_element_view"
+                app:layout_collapseMode="pin"/>
+
+        </com.google.android.material.appbar.CollapsingToolbarLayout>
+    </com.google.android.material.appbar.AppBarLayout>
+
+    <FrameLayout
+        android:id="@+id/content_frame"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
+</merge>
\ No newline at end of file
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml
new file mode 100644
index 0000000..d58c2c2
--- /dev/null
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+-->
+<resources>
+    <style name="SettingsLibCollapsingToolbarLayoutStyle">
+        <item name="expandedTitleTextAppearance">@style/SettingsLibCollapsingToolbarTitle.Expanded</item>
+        <item name="collapsedTitleTextAppearance">@style/SettingsLibCollapsingToolbarTitle.Collapsed</item>
+        <item name="expandedTitleMarginStart">@dimen/settingslib_expressive_space_small4</item>
+        <item name="expandedTitleMarginEnd">@dimen/settingslib_expressive_space_small4</item>
+        <item name="expandedTitleMarginBottom">@dimen/settingslib_expressive_space_medium1</item>
+        <item name="maxLines">3</item>
+        <item name="scrimVisibleHeightTrigger">@dimen/settingslib_scrim_visible_height_trigger</item>
+        <item name="contentScrim">@color/settingslib_materialColorSurfaceVariant</item>
+        <item name="statusBarScrim">@null</item>
+        <item name="scrimAnimationDuration">50</item>
+        <item name="collapsedTitleTextColor">@color/settingslib_materialColorOnSurface</item>
+        <item name="expandedTitleTextColor">@color/settingslib_materialColorOnSurface</item>
+    </style>
+    <style name="SettingsLibCollapsingToolbarLayoutStyle.Expressive">
+        <item name="contentScrim">@color/settingslib_materialColorSurfaceContainer</item>
+    </style>
+
+    <style name="SettingsLibCollapsingToolbarTitle.Collapsed" parent="@android:style/TextAppearance.DeviceDefault.Headline">
+        <!--set dp because we don't want size adjust when font size change-->
+        <item name="android:textSize">20dp</item>
+    </style>
+
+    <style name="SettingsLibCollapsingToolbarTitle.Expanded" parent="CollapsingToolbarTitle.Collapsed">
+        <item name="android:textSize">36dp</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes_expressive.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes_expressive.xml
new file mode 100644
index 0000000..ca1904a
--- /dev/null
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes_expressive.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+-->
+<resources>
+    <style name="SettingsLibTheme.CollapsingToolbar.Expressive" parent="@style/Theme.MaterialComponents.DayNight"/>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarAppCompatActivity.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarAppCompatActivity.java
index f46f110..feacecb 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarAppCompatActivity.java
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarAppCompatActivity.java
@@ -27,6 +27,8 @@
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 
+import com.android.settingslib.widget.SettingsThemeHelper;
+
 import com.google.android.material.appbar.AppBarLayout;
 import com.google.android.material.appbar.CollapsingToolbarLayout;
 import com.google.android.material.color.DynamicColors;
@@ -69,7 +71,10 @@
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
             DynamicColors.applyToActivityIfAvailable(this);
         }
-        setTheme(com.android.settingslib.widget.theme.R.style.Theme_SubSettingsBase);
+        int resId = SettingsThemeHelper.isExpressiveTheme(this)
+                ? com.android.settingslib.widget.theme.R.style.Theme_SubSettingsBase_Expressive
+                : com.android.settingslib.widget.theme.R.style.Theme_SubSettingsBase;
+        setTheme(resId);
 
         if (mCustomizeLayoutResId > 0 && Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
             super.setContentView(mCustomizeLayoutResId);
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
index 16ed5a8..0f9d94e 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
@@ -28,6 +28,8 @@
 import androidx.annotation.Nullable;
 import androidx.fragment.app.FragmentActivity;
 
+import com.android.settingslib.widget.SettingsThemeHelper;
+
 import com.google.android.material.appbar.AppBarLayout;
 import com.google.android.material.appbar.CollapsingToolbarLayout;
 
@@ -59,6 +61,11 @@
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         EdgeToEdgeUtils.enable(this);
         super.onCreate(savedInstanceState);
+
+        if (SettingsThemeHelper.isExpressiveTheme(this)) {
+            setTheme(com.android.settingslib.widget.theme.R.style.Theme_SubSettingsBase_Expressive);
+        }
+
         // for backward compatibility on R devices or wearable devices due to small device size.
         if (mCustomizeLayoutResId > 0 && (Build.VERSION.SDK_INT < Build.VERSION_CODES.S
                 || isWatch())) {
@@ -66,7 +73,7 @@
             return;
         }
 
-        View view = getToolbarDelegate().onCreateView(getLayoutInflater(), null);
+        View view = getToolbarDelegate().onCreateView(getLayoutInflater(), null, this);
         super.setContentView(view);
     }
 
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarDelegate.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarDelegate.java
index 2ab2abd..01ecb66 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarDelegate.java
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarDelegate.java
@@ -20,6 +20,7 @@
 
 import android.app.ActionBar;
 import android.app.Activity;
+import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
@@ -37,6 +38,8 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.coordinatorlayout.widget.CoordinatorLayout;
 
+import com.android.settingslib.widget.SettingsThemeHelper;
+
 import com.google.android.material.appbar.AppBarLayout;
 import com.google.android.material.appbar.CollapsingToolbarLayout;
 
@@ -84,6 +87,8 @@
 
     private boolean mUseCollapsingToolbar;
 
+    private boolean mIsExpressiveTheme;
+
     public CollapsingToolbarDelegate(@NonNull HostCallback hostCallback,
             boolean useCollapsingToolbar) {
         mHostCallback = hostCallback;
@@ -103,11 +108,16 @@
         int layoutId;
         boolean useCollapsingToolbar =
                 mUseCollapsingToolbar || Build.VERSION.SDK_INT < Build.VERSION_CODES.S;
+        Context context = (activity != null) ? activity : inflater.getContext();
+        mIsExpressiveTheme = SettingsThemeHelper.isExpressiveTheme(context);
         if (useCollapsingToolbar) {
-            layoutId = R.layout.collapsing_toolbar_base_layout;
+            layoutId = mIsExpressiveTheme
+                    ? R.layout.settingslib_expressive_collapsing_toolbar_base_layout
+                    : R.layout.collapsing_toolbar_base_layout;
         } else {
             layoutId = R.layout.non_collapsing_toolbar_base_layout;
         }
+
         final View view = inflater.inflate(layoutId, container, false);
         if (view instanceof CoordinatorLayout) {
             mCoordinatorLayout = (CoordinatorLayout) view;
@@ -155,6 +165,9 @@
             if (actionBar != null) {
                 actionBar.setDisplayHomeAsUpEnabled(true);
                 actionBar.setHomeButtonEnabled(true);
+                if (mIsExpressiveTheme) {
+                    actionBar.setHomeAsUpIndicator(R.drawable.settingslib_expressive_icon_back);
+                }
                 actionBar.setDisplayShowTitleEnabled(true);
             }
         }
@@ -174,6 +187,9 @@
         if (actionBar != null) {
             actionBar.setDisplayHomeAsUpEnabled(true);
             actionBar.setHomeButtonEnabled(true);
+            if (mIsExpressiveTheme) {
+                actionBar.setHomeAsUpIndicator(R.drawable.settingslib_expressive_icon_back);
+            }
             actionBar.setDisplayShowTitleEnabled(true);
         }
     }
@@ -188,6 +204,9 @@
         if (actionBar != null) {
             actionBar.setDisplayHomeAsUpEnabled(true);
             actionBar.setHomeButtonEnabled(true);
+            if (mIsExpressiveTheme) {
+                actionBar.setHomeAsUpIndicator(R.drawable.settingslib_expressive_icon_back);
+            }
             actionBar.setDisplayShowTitleEnabled(true);
         }
     }
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/widget/CollapsingCoordinatorLayout.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/widget/CollapsingCoordinatorLayout.java
index f70add9..51d7504 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/widget/CollapsingCoordinatorLayout.java
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/widget/CollapsingCoordinatorLayout.java
@@ -39,6 +39,7 @@
 import androidx.coordinatorlayout.widget.CoordinatorLayout;
 
 import com.android.settingslib.collapsingtoolbar.R;
+import com.android.settingslib.widget.SettingsThemeHelper;
 
 import com.google.android.material.appbar.AppBarLayout;
 import com.google.android.material.appbar.CollapsingToolbarLayout;
@@ -105,7 +106,10 @@
     }
 
     private void init() {
-        inflate(getContext(), R.layout.collapsing_toolbar_content_layout, this);
+        int resId = SettingsThemeHelper.isExpressiveTheme(getContext())
+                ? R.layout.settingslib_expressive_collapsing_toolbar_content_layout
+                : R.layout.collapsing_toolbar_content_layout;
+        inflate(getContext(), resId, this);
         mCollapsingToolbarLayout = findViewById(R.id.collapsing_toolbar);
         mAppBarLayout = findViewById(R.id.app_bar);
         if (mCollapsingToolbarLayout != null) {
@@ -172,6 +176,9 @@
             actionBar.setDisplayHomeAsUpEnabled(true);
             actionBar.setHomeButtonEnabled(true);
             actionBar.setDisplayShowTitleEnabled(true);
+            if (SettingsThemeHelper.isExpressiveTheme(getContext())) {
+                actionBar.setHomeAsUpIndicator(R.drawable.settingslib_expressive_icon_back);
+            }
         }
     }
 
@@ -202,6 +209,9 @@
             actionBar.setDisplayHomeAsUpEnabled(true);
             actionBar.setHomeButtonEnabled(true);
             actionBar.setDisplayShowTitleEnabled(true);
+            if (SettingsThemeHelper.isExpressiveTheme(getContext())) {
+                actionBar.setHomeAsUpIndicator(R.drawable.settingslib_expressive_icon_back);
+            }
         }
     }
 
diff --git a/packages/SettingsLib/ExpandablePreference/Android.bp b/packages/SettingsLib/ExpandablePreference/Android.bp
new file mode 100644
index 0000000..e6de3f1
--- /dev/null
+++ b/packages/SettingsLib/ExpandablePreference/Android.bp
@@ -0,0 +1,33 @@
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "frameworks_base_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["frameworks_base_license"],
+}
+
+android_library {
+    name: "SettingsLibExpandablePreference",
+    use_resource_processor: true,
+    defaults: [
+        "SettingsLintDefaults",
+    ],
+
+    srcs: [
+        "src/**/*.java",
+        "src/**/*.kt",
+    ],
+    resource_dirs: ["res"],
+
+    static_libs: [
+        "androidx.annotation_annotation",
+        "androidx.preference_preference",
+        "SettingsLibSettingsTheme",
+    ],
+    sdk_version: "system_current",
+    min_sdk_version: "21",
+    apex_available: [
+        "//apex_available:platform",
+    ],
+}
diff --git a/packages/SettingsLib/ExpandablePreference/AndroidManifest.xml b/packages/SettingsLib/ExpandablePreference/AndroidManifest.xml
new file mode 100644
index 0000000..7bfa19b
--- /dev/null
+++ b/packages/SettingsLib/ExpandablePreference/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  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.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.android.settingslib.widget.preference.expandable">
+
+    <uses-sdk android:minSdkVersion="21" />
+
+</manifest>
diff --git a/packages/SettingsLib/ExpandablePreference/res/drawable/settingslib_ic_expand.xml b/packages/SettingsLib/ExpandablePreference/res/drawable/settingslib_ic_expand.xml
new file mode 100644
index 0000000..4502311
--- /dev/null
+++ b/packages/SettingsLib/ExpandablePreference/res/drawable/settingslib_ic_expand.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape
+            android:shape="oval">
+            <size android:width="32dp" android:height="40dp"/>
+            <solid android:color="@color/settingslib_materialColorSurfaceContainer"/>
+        </shape>
+    </item>
+    <item>
+        <vector
+            android:width="32dp"
+            android:height="40dp"
+            android:viewportWidth="32"
+            android:viewportHeight="40">
+            <path
+                android:pathData="M16,23.063L11,18.063L12.063,17L16,20.938L19.938,17L21,18.063L16,23.063Z"
+                android:fillColor="@color/settingslib_materialColorOnSurface"/>
+        </vector>
+    </item>
+</layer-list>
\ No newline at end of file
diff --git a/packages/SettingsLib/ExpandablePreference/res/layout/settingslib_widget_expandable_icon.xml b/packages/SettingsLib/ExpandablePreference/res/layout/settingslib_widget_expandable_icon.xml
new file mode 100644
index 0000000..f7fefef
--- /dev/null
+++ b/packages/SettingsLib/ExpandablePreference/res/layout/settingslib_widget_expandable_icon.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <ImageView
+        android:id="@+id/expand_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/settingslib_ic_expand"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/ExpandablePreference/src/com/android/settingslib/widget/ExpandablePreference.kt b/packages/SettingsLib/ExpandablePreference/src/com/android/settingslib/widget/ExpandablePreference.kt
new file mode 100644
index 0000000..1b93ebe
--- /dev/null
+++ b/packages/SettingsLib/ExpandablePreference/src/com/android/settingslib/widget/ExpandablePreference.kt
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2024 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.settingslib.widget
+
+import android.content.Context
+import android.util.AttributeSet
+import android.widget.ImageView
+import androidx.preference.Preference
+import androidx.preference.PreferenceGroup
+import androidx.preference.PreferenceViewHolder
+import com.android.settingslib.widget.preference.expandable.R
+
+class ExpandablePreference @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0,
+    defStyleRes: Int = 0
+) : PreferenceGroup(context, attrs, defStyleAttr, defStyleRes), Expandable {
+
+    private var isExpanded = false
+    private var expandIcon: ImageView? = null
+    private var isDirty = true // Flag to track changes
+
+    init {
+        layoutResource = com.android.settingslib.widget.theme.R.layout.settingslib_expressive_preference
+        widgetLayoutResource = R.layout.settingslib_widget_expandable_icon
+    }
+
+    override fun onBindViewHolder(holder: PreferenceViewHolder) {
+        super.onBindViewHolder(holder)
+
+        holder.isDividerAllowedAbove = false
+        holder.isDividerAllowedBelow = false
+
+        expandIcon = holder.findViewById(R.id.expand_icon) as ImageView?
+
+        updateExpandedState()
+
+        holder.itemView.setOnClickListener { toggleExpansion() }
+    }
+
+    override fun addPreference(preference: Preference): Boolean {
+        preference.isVisible = isExpanded
+        return super.addPreference(preference)
+    }
+
+    override fun onPrepareAddPreference(preference: Preference): Boolean {
+        preference.isVisible = isExpanded
+        return super.onPrepareAddPreference(preference)
+    }
+
+    override fun isExpanded(): Boolean {
+        return isExpanded
+    }
+
+    private fun toggleExpansion() {
+        isExpanded = !isExpanded
+        isDirty = true // Mark as dirty when expansion state changes
+        updateExpandedState()
+        notifyChanged()
+    }
+
+    private fun updateExpandedState() {
+        expandIcon?.rotation = when (isExpanded) {
+            true -> ROTATION_EXPANDED
+            false -> ROTATION_COLLAPSED
+        }
+
+        if (isDirty) {
+            (0 until preferenceCount).forEach { i ->
+                getPreference(i).isVisible = isExpanded
+            }
+            isDirty = false
+        }
+    }
+
+    companion object {
+        private const val ROTATION_EXPANDED = 180f
+        private const val ROTATION_COLLAPSED = 0f
+    }
+}
\ No newline at end of file
diff --git a/packages/SettingsLib/IntroPreference/Android.bp b/packages/SettingsLib/IntroPreference/Android.bp
new file mode 100644
index 0000000..155db18
--- /dev/null
+++ b/packages/SettingsLib/IntroPreference/Android.bp
@@ -0,0 +1,33 @@
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "frameworks_base_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["frameworks_base_license"],
+}
+
+android_library {
+    name: "SettingsLibIntroPreference",
+    use_resource_processor: true,
+    defaults: [
+        "SettingsLintDefaults",
+    ],
+
+    srcs: [
+        "src/**/*.java",
+        "src/**/*.kt",
+    ],
+    resource_dirs: ["res"],
+
+    static_libs: [
+        "androidx.preference_preference",
+        "SettingsLibSettingsTheme",
+    ],
+
+    sdk_version: "system_current",
+    min_sdk_version: "21",
+    apex_available: [
+        "//apex_available:platform",
+    ],
+}
diff --git a/packages/SettingsLib/IntroPreference/AndroidManifest.xml b/packages/SettingsLib/IntroPreference/AndroidManifest.xml
new file mode 100644
index 0000000..f1bfee5
--- /dev/null
+++ b/packages/SettingsLib/IntroPreference/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.android.settingslib.widget.preference.intro">
+
+    <uses-sdk android:minSdkVersion="21" />
+
+</manifest>
diff --git a/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml b/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml
new file mode 100644
index 0000000..2edc001
--- /dev/null
+++ b/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/entity_header"
+    style="@style/SettingsLibEntityHeader">
+
+    <LinearLayout
+        android:id="@+id/entity_header_content"
+        style="@style/SettingsLibEntityHeaderContent">
+
+        <ImageView
+            android:id="@android:id/icon"
+            android:src="@drawable/settingslib_arrow_drop_down"
+            style="@style/SettingsLibEntityHeaderIcon"/>
+
+        <TextView
+            android:id="@android:id/title"
+            style="@style/SettingsLibEntityHeaderTitle"/>
+
+        <com.android.settingslib.widget.CollapsableTextView
+            android:id="@+id/collapsable_summary"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center"/>
+
+    </LinearLayout>
+
+</RelativeLayout>
diff --git a/packages/SettingsLib/IntroPreference/src/com/android/settingslib/widget/IntroPreference.kt b/packages/SettingsLib/IntroPreference/src/com/android/settingslib/widget/IntroPreference.kt
new file mode 100644
index 0000000..0cdfc66
--- /dev/null
+++ b/packages/SettingsLib/IntroPreference/src/com/android/settingslib/widget/IntroPreference.kt
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2024 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.settingslib.widget
+
+import android.content.Context
+import android.os.Build
+import android.text.TextUtils
+import android.util.AttributeSet
+import android.view.View
+import androidx.annotation.RequiresApi
+import androidx.preference.Preference
+import androidx.preference.PreferenceViewHolder
+import com.android.settingslib.widget.preference.intro.R
+
+class IntroPreference @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0,
+    defStyleRes: Int = 0
+) : Preference(context, attrs, defStyleAttr, defStyleRes) {
+
+    private var isCollapsable: Boolean = false
+    private var minLines: Int = 2
+    private var hyperlinkListener: View.OnClickListener? = null
+    private var learnMoreListener: View.OnClickListener? = null
+    private var learnMoreText: CharSequence? = null
+
+    init {
+        layoutResource = R.layout.settingslib_expressive_preference_intro
+        isSelectable = false
+
+        initAttributes(context, attrs, defStyleAttr)
+    }
+
+    private fun initAttributes(context: Context, attrs: AttributeSet?, defStyleAttr: Int) {
+        context.obtainStyledAttributes(
+            attrs,
+            COLLAPSABLE_TEXT_VIEW_ATTRS, defStyleAttr, 0
+        ).apply {
+            isCollapsable = getBoolean(IS_COLLAPSABLE, false)
+            minLines = getInt(
+                MIN_LINES,
+                if (isCollapsable) DEFAULT_MIN_LINES else DEFAULT_MAX_LINES
+            ).coerceIn(1, DEFAULT_MAX_LINES)
+            recycle()
+        }
+    }
+
+    override fun onBindViewHolder(holder: PreferenceViewHolder) {
+        super.onBindViewHolder(holder)
+        holder.isDividerAllowedBelow = false
+        holder.isDividerAllowedAbove = false
+
+        (holder.findViewById(R.id.collapsable_summary) as? CollapsableTextView)?.apply {
+            setCollapsable(isCollapsable)
+            setMinLines(minLines)
+            setText(summary.toString())
+            if (hyperlinkListener != null) {
+                setHyperlinkListener(hyperlinkListener)
+            }
+            if (learnMoreListener != null) {
+                setLearnMoreText(learnMoreText)
+                setLearnMoreAction(learnMoreListener)
+            }
+        }
+    }
+
+    /**
+     * Sets whether the summary is collapsable.
+     * @param collapsable True if the summary should be collapsable, false otherwise.
+     */
+    @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    fun setCollapsable(collapsable: Boolean) {
+        isCollapsable = collapsable
+        minLines = if (isCollapsable) DEFAULT_MIN_LINES else DEFAULT_MAX_LINES
+        notifyChanged()
+    }
+
+    /**
+     * Sets the minimum number of lines to display when collapsed.
+     * @param lines The minimum number of lines.
+     */
+    @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    fun setMinLines(lines: Int) {
+        minLines = lines.coerceIn(1, DEFAULT_MAX_LINES)
+        notifyChanged()
+    }
+
+    /**
+     * Sets the action when clicking on the hyperlink in the text.
+     * @param listener The click listener for hyperlink.
+     */
+    @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    fun setHyperlinkListener(listener: View.OnClickListener) {
+        if (hyperlinkListener != listener) {
+            hyperlinkListener = listener
+            notifyChanged()
+        }
+    }
+
+    /**
+     * Sets the action when clicking on the learn more view.
+     * @param listener The click listener for learn more.
+     */
+    @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    fun setLearnMoreAction(listener: View.OnClickListener) {
+        if (learnMoreListener != listener) {
+            learnMoreListener = listener
+            notifyChanged()
+        }
+    }
+
+    /**
+     * Sets the text of learn more view.
+     * @param text The text of learn more.
+     */
+    @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    fun setLearnMoreText(text: CharSequence) {
+        if (!TextUtils.equals(learnMoreText, text)) {
+            learnMoreText = text
+            notifyChanged()
+        }
+    }
+
+    companion object {
+        private const val DEFAULT_MAX_LINES = 10
+        private const val DEFAULT_MIN_LINES = 2
+
+        private val COLLAPSABLE_TEXT_VIEW_ATTRS =
+            com.android.settingslib.widget.theme.R.styleable.CollapsableTextView
+        private val MIN_LINES =
+            com.android.settingslib.widget.theme.R.styleable.CollapsableTextView_android_minLines
+        private val IS_COLLAPSABLE =
+            com.android.settingslib.widget.theme.R.styleable.CollapsableTextView_isCollapsable
+    }
+}
\ No newline at end of file
diff --git a/packages/SettingsLib/MainSwitchPreference/res/drawable-v35/settingslib_expressive_switch_bar_bg.xml b/packages/SettingsLib/MainSwitchPreference/res/drawable-v35/settingslib_expressive_switch_bar_bg.xml
new file mode 100644
index 0000000..3999e76
--- /dev/null
+++ b/packages/SettingsLib/MainSwitchPreference/res/drawable-v35/settingslib_expressive_switch_bar_bg.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="?android:attr/colorControlHighlight">
+    <item>
+        <shape android:shape="rectangle">
+            <solid android:color="@color/settingslib_materialColorPrimaryContainer"/>
+            <corners android:radius="@dimen/settingslib_expressive_radius_extralarge3"/>
+        </shape>
+    </item>
+</ripple>
\ No newline at end of file
diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v35/settingslib_expressive_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v35/settingslib_expressive_main_switch_bar.xml
new file mode 100644
index 0000000..4425ef0
--- /dev/null
+++ b/packages/SettingsLib/MainSwitchPreference/res/layout-v35/settingslib_expressive_main_switch_bar.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_height="wrap_content"
+    android:layout_width="match_parent"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:paddingVertical="@dimen/settingslib_expressive_space_small1"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:id="@+id/frame"
+        android:minHeight="@dimen/settingslib_expressive_space_large3"
+        android:layout_height="wrap_content"
+        android:layout_width="match_parent"
+        android:paddingStart="@dimen/settingslib_expressive_space_medium1"
+        android:paddingEnd="@dimen/settingslib_expressive_space_small3"
+        android:background="@drawable/settingslib_expressive_switch_bar_bg">
+
+        <RelativeLayout
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:layout_marginEnd="@dimen/settingslib_expressive_space_extrasmall4"
+            android:layout_marginVertical="@dimen/settingslib_expressive_space_small4"
+            android:layout_weight="1">
+
+            <TextView
+                android:id="@+id/switch_text"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="start"
+                android:ellipsize="end"
+                android:textAlignment="viewStart"
+                android:textAppearance="?android:attr/textAppearanceListItem"
+                android:textColor="@color/settingslib_main_switch_text_color" />
+
+            <TextView
+                android:id="@+id/switch_summary"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignLeft="@id/switch_text"
+                android:layout_alignStart="@id/switch_text"
+                android:layout_below="@id/switch_text"
+                android:layout_gravity="start"
+                android:textAlignment="viewStart"
+                android:textAppearance="?android:attr/textAppearanceListItemSmall"
+                android:textColor="@color/settingslib_main_switch_text_color"
+                android:visibility="gone" />
+        </RelativeLayout>
+
+        <com.google.android.material.materialswitch.MaterialSwitch
+            android:theme="@style/Theme.Material3.DynamicColors.DayNight"
+            android:id="@android:id/switch_widget"
+            style="@style/SettingslibMainSwitchStyle.Expressive" />
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
index e6f61a8..106802e 100644
--- a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
+++ b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
@@ -22,6 +22,7 @@
 import android.os.Build.VERSION_CODES;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -31,6 +32,7 @@
 import android.widget.TextView;
 
 import androidx.annotation.ColorInt;
+import androidx.annotation.RequiresApi;
 
 import com.android.settingslib.widget.mainswitch.R;
 
@@ -52,6 +54,7 @@
     private int mBackgroundActivatedColor;
 
     protected TextView mTextView;
+    protected TextView mSummaryView;
     protected CompoundButton mSwitch;
     private final View mFrameView;
 
@@ -71,7 +74,11 @@
             int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
-        LayoutInflater.from(context).inflate(R.layout.settingslib_main_switch_bar, this);
+        boolean isExpressive = SettingsThemeHelper.isExpressiveTheme(context);
+        int resId = isExpressive
+                ? R.layout.settingslib_expressive_main_switch_bar
+                : R.layout.settingslib_main_switch_bar;
+        LayoutInflater.from(context).inflate(resId, this);
 
         if (Build.VERSION.SDK_INT < VERSION_CODES.S) {
             TypedArray a;
@@ -93,6 +100,9 @@
 
         mFrameView = findViewById(R.id.frame);
         mTextView = findViewById(R.id.switch_text);
+        if (isExpressive) {
+            mSummaryView = findViewById(R.id.switch_summary);
+        }
         mSwitch = findViewById(android.R.id.switch_widget);
         addOnSwitchChangeListener((switchView, isChecked) -> setChecked(isChecked));
 
@@ -109,6 +119,12 @@
             final CharSequence title = a.getText(
                     androidx.preference.R.styleable.Preference_android_title);
             setTitle(title);
+            //TODO(b/369470034): update to next version
+            if (isExpressive && Build.VERSION.SDK_INT >= VERSION_CODES.VANILLA_ICE_CREAM) {
+                CharSequence summary = a.getText(
+                        androidx.preference.R.styleable.Preference_android_summary);
+                setSummary(summary);
+            }
             a.recycle();
         }
 
@@ -153,6 +169,18 @@
     }
 
     /**
+     * Set the summary text
+     */
+    @RequiresApi(VERSION_CODES.VANILLA_ICE_CREAM)
+    //TODO(b/369470034): update to next version
+    public void setSummary(CharSequence text) {
+        if (mSummaryView != null) {
+            mSummaryView.setText(text);
+            mSummaryView.setVisibility(TextUtils.isEmpty(text) ? GONE : VISIBLE);
+        }
+    }
+
+    /**
      * Set icon space reserved for title
      */
     public void setIconSpaceReserved(boolean iconSpaceReserved) {
@@ -219,6 +247,12 @@
             mFrameView.setEnabled(enabled);
             mFrameView.setActivated(isChecked());
         }
+
+        if (SettingsThemeHelper.isExpressiveTheme(getContext())) {
+            if (mSummaryView != null) {
+                mSummaryView.setEnabled(enabled);
+            }
+        }
     }
 
     private void propagateChecked(boolean isChecked) {
diff --git a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java
index b294d4e..d895c87 100644
--- a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java
+++ b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.content.res.TypedArray;
+import android.os.Build;
 import android.util.AttributeSet;
 import android.widget.CompoundButton;
 import android.widget.CompoundButton.OnCheckedChangeListener;
@@ -89,6 +90,10 @@
                     androidx.preference.R.styleable.Preference_android_title);
             setTitle(title);
 
+            CharSequence summary = a.getText(
+                    androidx.preference.R.styleable.Preference_android_summary);
+            setSummary(summary);
+
             final boolean bIconSpaceReserved = a.getBoolean(
                     androidx.preference.R.styleable.Preference_android_iconSpaceReserved, true);
             setIconSpaceReserved(bIconSpaceReserved);
@@ -113,6 +118,15 @@
     }
 
     @Override
+    public void setSummary(CharSequence summary) {
+        super.setSummary(summary);
+        if (mMainSwitchBar != null
+                && Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
+            mMainSwitchBar.setSummary(summary);
+        }
+    }
+
+    @Override
     public void setIconSpaceReserved(boolean iconSpaceReserved) {
         super.setIconSpaceReserved(iconSpaceReserved);
         if (mMainSwitchBar != null) {
diff --git a/packages/SettingsLib/Preference/Android.bp b/packages/SettingsLib/Preference/Android.bp
index 17852e8..bff95ce 100644
--- a/packages/SettingsLib/Preference/Android.bp
+++ b/packages/SettingsLib/Preference/Android.bp
@@ -1,3 +1,19 @@
+//
+// Copyright (C) 2024 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 {
     default_applicable_licenses: ["frameworks_base_license"],
 }
diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt
index 5fcf478..5e69895 100644
--- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt
+++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt
@@ -68,10 +68,13 @@
                 preference.icon = null
             }
             val context = preference.context
+            val isPreferenceScreen = preference is PreferenceScreen
             preference.peekExtras()?.clear()
             extras(context)?.let { preference.extras.putAll(it) }
             preference.title = getPreferenceTitle(context)
-            preference.summary = getPreferenceSummary(context)
+            if (!isPreferenceScreen) {
+                preference.summary = getPreferenceSummary(context)
+            }
             preference.isEnabled = isEnabled(context)
             preference.isVisible =
                 (this as? PreferenceAvailabilityProvider)?.isAvailable(context) != false
@@ -81,7 +84,7 @@
             // dependency here. This simplifies dependency management and avoid the
             // IllegalStateException when call Preference.setDependency
             preference.dependency = null
-            if (preference !is PreferenceScreen) { // avoid recursive loop when build graph
+            if (!isPreferenceScreen) { // avoid recursive loop when build graph
                 preference.fragment = (this as? PreferenceScreenCreator)?.fragmentClass()?.name
                 preference.intent = intent(context)
             }
diff --git a/packages/SettingsLib/Preference/testutils/Android.bp b/packages/SettingsLib/Preference/testutils/Android.bp
new file mode 100644
index 0000000..5287d6c
--- /dev/null
+++ b/packages/SettingsLib/Preference/testutils/Android.bp
@@ -0,0 +1,32 @@
+//
+// Copyright (C) 2024 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 {
+    default_applicable_licenses: ["frameworks_base_license"],
+}
+
+android_library {
+    name: "SettingsLibPreference-testutils",
+    srcs: ["**/*.kt"],
+    static_libs: [
+        "SettingsLibPreference",
+        "androidx.fragment_fragment-testing",
+        "androidx.test.core",
+        "androidx.test.ext.junit",
+        "flag-junit",
+        "truth",
+    ],
+}
diff --git a/packages/SettingsLib/Preference/testutils/AndroidManifest.xml b/packages/SettingsLib/Preference/testutils/AndroidManifest.xml
new file mode 100644
index 0000000..4e807a6
--- /dev/null
+++ b/packages/SettingsLib/Preference/testutils/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright (C) 2024 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.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.settingslib.preference.testutils">
+
+  <uses-sdk android:minSdkVersion="21" />
+</manifest>
diff --git a/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt b/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt
new file mode 100644
index 0000000..4d5f85f
--- /dev/null
+++ b/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2024 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.settingslib.preference
+
+import android.content.Context
+import android.platform.test.flag.junit.SetFlagsRule
+import android.util.Log
+import androidx.fragment.app.testing.FragmentScenario
+import androidx.preference.Preference
+import androidx.preference.PreferenceFragmentCompat
+import androidx.preference.PreferenceGroup
+import androidx.preference.PreferenceScreen
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/** Test case for catalyst screen. */
+@RunWith(AndroidJUnit4::class)
+abstract class CatalystScreenTestCase {
+    @get:Rule val setFlagsRule = SetFlagsRule()
+
+    protected val context: Context = ApplicationProvider.getApplicationContext()
+
+    /** Catalyst screen. */
+    protected abstract val preferenceScreenCreator: PreferenceScreenCreator
+
+    /** Flag to control catalyst screen. */
+    protected abstract val flagName: String
+
+    /**
+     * Test to compare the preference screen hierarchy between legacy screen (flag is disabled) and
+     * catalyst screen (flag is enabled).
+     */
+    @Test
+    fun migration() {
+        enableCatalystScreen()
+        assertThat(preferenceScreenCreator.isFlagEnabled(context)).isTrue()
+        val catalystScreen = stringifyPreferenceScreen()
+        Log.i("Catalyst", catalystScreen)
+
+        disableCatalystScreen()
+        assertThat(preferenceScreenCreator.isFlagEnabled(context)).isFalse()
+        val legacyScreen = stringifyPreferenceScreen()
+
+        assertThat(catalystScreen).isEqualTo(legacyScreen)
+    }
+
+    /**
+     * Enables the catalyst screen.
+     *
+     * By default, enable the [flagName]. Override for more complex situation.
+     */
+    @Suppress("DEPRECATION")
+    protected open fun enableCatalystScreen() {
+        setFlagsRule.enableFlags(flagName)
+    }
+
+    /**
+     * Disables the catalyst screen (legacy screen is shown).
+     *
+     * By default, disable the [flagName]. Override for more complex situation.
+     */
+    @Suppress("DEPRECATION")
+    protected open fun disableCatalystScreen() {
+        setFlagsRule.disableFlags(flagName)
+    }
+
+    private fun stringifyPreferenceScreen(): String {
+        @Suppress("UNCHECKED_CAST")
+        val clazz = preferenceScreenCreator.fragmentClass() as Class<PreferenceFragmentCompat>
+        val builder = StringBuilder()
+        FragmentScenario.launch(clazz).use {
+            it.onFragment { fragment -> fragment.preferenceScreen.toString(builder) }
+        }
+        return builder.toString()
+    }
+
+    private fun Preference.toString(builder: StringBuilder, indent: String = "") {
+        val clazz = javaClass
+        builder.append(indent).append(clazz).append(" {\n")
+        val indent2 = "$indent  "
+        if (clazz != PreferenceScreen::class.java) {
+            key?.let { builder.append(indent2).append("key: \"$it\"\n") }
+        }
+        title?.let { builder.append(indent2).append("title: \"$it\"\n") }
+        summary?.let { builder.append(indent2).append("summary: \"$it\"\n") }
+        fragment?.let { builder.append(indent2).append("fragment: \"$it\"\n") }
+        builder.append(indent2).append("order: $order\n")
+        builder.append(indent2).append("isCopyingEnabled: $isCopyingEnabled\n")
+        builder.append(indent2).append("isEnabled: $isEnabled\n")
+        builder.append(indent2).append("isIconSpaceReserved: $isIconSpaceReserved\n")
+        if (clazz != Preference::class.java && clazz != PreferenceScreen::class.java) {
+            builder.append(indent2).append("isPersistent: $isPersistent\n")
+        }
+        builder.append(indent2).append("isSelectable: $isSelectable\n")
+        if (this is PreferenceGroup) {
+            val count = preferenceCount
+            builder.append(indent2).append("preferenceCount: $count\n")
+            val indent4 = "$indent2  "
+            for (index in 0..<count) {
+                getPreference(index).toString(builder, indent4)
+            }
+        }
+        builder.append(indent).append("}\n")
+    }
+}
diff --git a/packages/SettingsLib/SearchWidget/res/values-ms/strings.xml b/packages/SettingsLib/SearchWidget/res/values-ms/strings.xml
index 99a9b05..13a7b5c 100644
--- a/packages/SettingsLib/SearchWidget/res/values-ms/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-ms/strings.xml
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="search_menu" msgid="1914043873178389845">"Cari tetapan"</string>
+    <string name="search_menu" msgid="1914043873178389845">"Cari dalam tetapan"</string>
 </resources>
diff --git a/packages/SettingsLib/SelectorWithWidgetPreference/res/values/attrs.xml b/packages/SettingsLib/SelectorWithWidgetPreference/res/values/attrs.xml
index 7ffde25..b90de6b 100644
--- a/packages/SettingsLib/SelectorWithWidgetPreference/res/values/attrs.xml
+++ b/packages/SettingsLib/SelectorWithWidgetPreference/res/values/attrs.xml
@@ -1,17 +1,18 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  ~ Copyright (C) 2024 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.
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2024 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.
   -->
 
 <resources>
diff --git a/packages/SettingsLib/SelectorWithWidgetPreference/src/com/android/settingslib/widget/SelectorWithWidgetPreference.java b/packages/SettingsLib/SelectorWithWidgetPreference/src/com/android/settingslib/widget/SelectorWithWidgetPreference.java
index 34de5c4..03a2101 100644
--- a/packages/SettingsLib/SelectorWithWidgetPreference/src/com/android/settingslib/widget/SelectorWithWidgetPreference.java
+++ b/packages/SettingsLib/SelectorWithWidgetPreference/src/com/android/settingslib/widget/SelectorWithWidgetPreference.java
@@ -68,6 +68,7 @@
 
     private View mExtraWidgetContainer;
     private ImageView mExtraWidget;
+    @Nullable private String mExtraWidgetContentDescription;
     private boolean mIsCheckBox = false;  // whether to display this button as a checkbox
 
     private View.OnClickListener mExtraWidgetOnClickListener;
@@ -173,6 +174,12 @@
 
         setExtraWidgetOnClickListener(mExtraWidgetOnClickListener);
 
+        if (mExtraWidget != null) {
+            mExtraWidget.setContentDescription(mExtraWidgetContentDescription != null
+                    ? mExtraWidgetContentDescription
+                    : getContext().getString(R.string.settings_label));
+        }
+
         if (Flags.allowSetTitleMaxLines()) {
             TextView title = (TextView) holder.findViewById(android.R.id.title);
             title.setMaxLines(mTitleMaxLines);
@@ -210,6 +217,17 @@
     }
 
     /**
+     * Sets the content description of the extra widget. If {@code null}, a default content
+     * description will be used ("Settings").
+     */
+    public void setExtraWidgetContentDescription(@Nullable String contentDescription) {
+        if (!TextUtils.equals(mExtraWidgetContentDescription, contentDescription)) {
+            mExtraWidgetContentDescription = contentDescription;
+            notifyChanged();
+        }
+    }
+
+    /**
      * Returns whether this preference is a checkbox.
      */
     public boolean isCheckBox() {
@@ -237,4 +255,9 @@
             a.recycle();
         }
     }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.NONE)
+    public View getExtraWidget() {
+        return mExtraWidget;
+    }
 }
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v35/settingslib_expressive_color_main_switch_track.xml b/packages/SettingsLib/SettingsTheme/res/color-v35/settingslib_expressive_color_main_switch_track.xml
new file mode 100644
index 0000000..a6885a4
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v35/settingslib_expressive_color_main_switch_track.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- State Disabled, Unchecked -->
+    <item
+        android:alpha="?android:attr/disabledAlpha"
+        android:color="@color/settingslib_materialColorSurfaceContainerHighest"
+        android:state_enabled="false" android:state_checked="false"/>
+    <!-- State Disabled, Checked -->
+    <item
+        android:alpha="?android:attr/disabledAlpha"
+        android:color="@color/settingslib_materialColorPrimary"
+        android:state_enabled="false" android:state_checked="true"/>
+    <!-- State Checked -->
+    <item
+        android:color="@color/settingslib_materialColorPrimary"
+        android:state_checked="true"/>
+
+    <!-- State Unchecked -->
+    <item
+        android:color="@color/settingslib_materialColorSurfaceContainerHighest"
+        android:state_hovered="true" android:state_checked="false"/>
+    <item
+        android:color="@color/settingslib_materialColorSurfaceContainerHighest"
+        android:state_focused="true" android:state_checked="false"/>
+    <item
+        android:color="@color/settingslib_materialColorSurfaceContainerHighest"
+        android:state_pressed="true" android:state_checked="false"/>
+    <item
+        android:color="@color/settingslib_materialColorSurfaceContainerHighest"
+        android:state_checked="false"/>
+</selector>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_list_divider.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_list_divider.xml
new file mode 100644
index 0000000..eb588d9
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_list_divider.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 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.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/settingslib_list_divider_color" />
+    <size
+        android:height="1dp"
+        android:width="1dp" />
+</shape>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_chevron.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_chevron.xml
index 16ca18a..9447653 100644
--- a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_chevron.xml
+++ b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_chevron.xml
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2024 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.
+    Copyright (C) 2024 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.
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_collapse.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_collapse.xml
new file mode 100644
index 0000000..161ece7
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_collapse.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2024 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.
+  -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape
+            android:shape="oval">
+            <size android:width="24dp" android:height="24dp"/>
+            <solid android:color="@color/settingslib_materialColorSurfaceDim"/>
+        </shape>
+    </item>
+    <item>
+        <vector
+            android:width="24dp"
+            android:height="24dp"
+            android:viewportWidth="960"
+            android:viewportHeight="960">
+            <path
+                android:fillColor="@color/settingslib_materialColorOnSurface"
+                android:pathData="M480,432L296,616L240,560L480,320L720,560L664,616L480,432Z"/>
+        </vector>
+    </item>
+</layer-list>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_expand.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_expand.xml
new file mode 100644
index 0000000..1b5d518
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_expand.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2024 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.
+  -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape
+            android:shape="oval">
+            <size android:width="24dp" android:height="24dp"/>
+            <solid android:color="@color/settingslib_materialColorSurfaceDim"/>
+        </shape>
+    </item>
+    <item>
+        <vector
+            android:width="24dp"
+            android:height="24dp"
+            android:viewportWidth="960"
+            android:viewportHeight="960">
+            <path
+                android:fillColor="@color/settingslib_materialColorOnSurface"
+                android:pathData="M480,616L240,376L296,320L480,504L664,320L720,376L480,616Z"/>
+        </vector>
+    </item>
+</layer-list>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_list_divider.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_list_divider.xml
new file mode 100644
index 0000000..c17f7ee
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_list_divider.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 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.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/settingslib_materialColorOutline" />
+    <size
+        android:height="1dp"
+        android:width="1dp" />
+</shape>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_icon_bullet_start.xml b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_icon_bullet_start.xml
new file mode 100644
index 0000000..9216c96
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_icon_bullet_start.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2024 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.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="960"
+    android:viewportHeight="960"
+    android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M354,673L480,597L606,674L573,530L684,434L538,421L480,285L422,420L276,433L387,530L354,673ZM233,840L298,559L80,370L368,345L480,80L592,345L880,370L662,559L727,840L480,691L233,840ZM480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490Z"/>
+</vector>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v31/settingslib_preference.xml b/packages/SettingsLib/SettingsTheme/res/layout-v31/settingslib_preference.xml
index dda7517c..952562e 100644
--- a/packages/SettingsLib/SettingsTheme/res/layout-v31/settingslib_preference.xml
+++ b/packages/SettingsLib/SettingsTheme/res/layout-v31/settingslib_preference.xml
@@ -31,37 +31,7 @@
 
     <include layout="@layout/settingslib_icon_frame"/>
 
-    <RelativeLayout
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:paddingTop="16dp"
-        android:paddingBottom="16dp">
-
-        <TextView
-            android:id="@android:id/title"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="start"
-            android:textAlignment="viewStart"
-            android:maxLines="2"
-            android:textAppearance="?android:attr/textAppearanceListItem"
-            android:ellipsize="marquee"/>
-
-        <TextView
-            android:id="@android:id/summary"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@android:id/title"
-            android:layout_alignLeft="@android:id/title"
-            android:layout_alignStart="@android:id/title"
-            android:layout_gravity="start"
-            android:textAlignment="viewStart"
-            android:textColor="?android:attr/textColorSecondary"
-            android:maxLines="10"
-            style="@style/PreferenceSummaryTextStyle"/>
-
-    </RelativeLayout>
+    <include layout="@layout/settingslib_preference_frame"/>
 
     <!-- Preference should place its actual preference widget here. -->
     <LinearLayout
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v31/settingslib_preference_frame.xml b/packages/SettingsLib/SettingsTheme/res/layout-v31/settingslib_preference_frame.xml
new file mode 100644
index 0000000..128f7a1
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/layout-v31/settingslib_preference_frame.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2024 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.
+  -->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="0dp"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:paddingTop="16dp"
+    android:paddingBottom="16dp">
+
+    <TextView
+        android:id="@android:id/title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="start"
+        android:textAlignment="viewStart"
+        android:maxLines="2"
+        android:textAppearance="?android:attr/textAppearanceListItem"
+        android:ellipsize="marquee"/>
+
+    <TextView
+        android:id="@android:id/summary"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@android:id/title"
+        android:layout_alignLeft="@android:id/title"
+        android:layout_alignStart="@android:id/title"
+        android:layout_gravity="start"
+        android:textAlignment="viewStart"
+        android:textColor="?android:attr/textColorSecondary"
+        android:maxLines="10"
+        style="@style/PreferenceSummaryTextStyle"/>
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v33/settingslib_preference.xml b/packages/SettingsLib/SettingsTheme/res/layout-v33/settingslib_preference.xml
deleted file mode 100644
index fedcc77..0000000
--- a/packages/SettingsLib/SettingsTheme/res/layout-v33/settingslib_preference.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2022 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.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="?android:attr/listPreferredItemHeightSmall"
-    android:gravity="center_vertical"
-    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingRight="?android:attr/listPreferredItemPaddingRight"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:background="?android:attr/selectableItemBackground"
-    android:clipToPadding="false"
-    android:baselineAligned="false">
-
-    <include layout="@layout/settingslib_icon_frame"/>
-
-    <RelativeLayout
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:paddingTop="16dp"
-        android:paddingBottom="16dp">
-
-        <TextView
-            android:id="@android:id/title"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="start"
-            android:textAlignment="viewStart"
-            android:maxLines="2"
-            android:hyphenationFrequency="normalFast"
-            android:lineBreakWordStyle="phrase"
-            android:textAppearance="?android:attr/textAppearanceListItem"
-            android:ellipsize="marquee"/>
-
-        <TextView
-            android:id="@android:id/summary"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@android:id/title"
-            android:layout_alignLeft="@android:id/title"
-            android:layout_alignStart="@android:id/title"
-            android:layout_gravity="start"
-            android:textAlignment="viewStart"
-            android:textColor="?android:attr/textColorSecondary"
-            android:maxLines="10"
-            android:hyphenationFrequency="normalFast"
-            android:lineBreakWordStyle="phrase"
-            style="@style/PreferenceSummaryTextStyle"/>
-
-    </RelativeLayout>
-
-    <!-- Preference should place its actual preference widget here. -->
-    <LinearLayout
-        android:id="@android:id/widget_frame"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:gravity="end|center_vertical"
-        android:paddingLeft="16dp"
-        android:paddingStart="16dp"
-        android:paddingRight="0dp"
-        android:paddingEnd="0dp"
-        android:orientation="vertical"/>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v33/settingslib_preference_frame.xml b/packages/SettingsLib/SettingsTheme/res/layout-v33/settingslib_preference_frame.xml
new file mode 100644
index 0000000..599e817
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/layout-v33/settingslib_preference_frame.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2024 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.
+  -->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="0dp"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:paddingTop="16dp"
+    android:paddingBottom="16dp">
+
+    <TextView
+        android:id="@android:id/title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="start"
+        android:textAlignment="viewStart"
+        android:maxLines="2"
+        android:hyphenationFrequency="normalFast"
+        android:lineBreakWordStyle="phrase"
+        android:textAppearance="?android:attr/textAppearanceListItem"
+        android:ellipsize="marquee"/>
+
+    <TextView
+        android:id="@android:id/summary"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@android:id/title"
+        android:layout_alignLeft="@android:id/title"
+        android:layout_alignStart="@android:id/title"
+        android:layout_gravity="start"
+        android:textAlignment="viewStart"
+        android:textColor="?android:attr/textColorSecondary"
+        android:maxLines="10"
+        android:hyphenationFrequency="normalFast"
+        android:lineBreakWordStyle="phrase"
+        style="@style/PreferenceSummaryTextStyle"/>
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml
new file mode 100644
index 0000000..ea7baa4
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingBottom="@dimen/settingslib_expressive_space_small1"
+    android:paddingTop="@dimen/settingslib_expressive_space_extrasmall4"
+    android:orientation="vertical"
+    android:animateLayoutChanges="true"
+    android:background="?android:attr/selectableItemBackground"
+    android:filterTouchesWhenObscured="false"
+    android:clipToPadding="false">
+
+    <TextView
+        android:id="@android:id/title"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        android:textAlignment="viewStart"
+        android:clickable="false"
+        android:longClickable="false"
+        android:maxLines="10"
+        android:ellipsize="end"
+        android:textAppearance="@style/TextAppearance.TopIntroText"/>
+
+    <com.android.settingslib.widget.LinkableTextView
+        android:id="@+id/settingslib_expressive_learn_more"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintTop_toBottomOf="@android:id/title"
+        app:layout_constraintStart_toStartOf="parent"
+        android:textAlignment="viewStart"
+        android:clickable="true"
+        android:visibility="gone"
+        style="@style/SettingslibTextAppearance.LinkableTextStyle.Expressive"/>
+
+    <com.google.android.material.button.MaterialButton
+        android:id="@+id/collapse_button"
+        app:layout_constraintTop_toBottomOf="@id/settingslib_expressive_learn_more"
+        app:layout_constraintStart_toStartOf="parent"
+        android:text="@string/settingslib_expressive_text_expand"
+        app:icon="@drawable/settingslib_expressive_icon_expand"
+        style="@style/SettingslibTextButtonStyle.Expressive"/>
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference.xml b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference.xml
index 2475dfd..511e2bb 100644
--- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference.xml
+++ b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference.xml
@@ -25,7 +25,8 @@
     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
     android:background="?android:attr/selectableItemBackground"
     android:clipToPadding="false"
-    android:baselineAligned="false">
+    android:baselineAligned="false"
+    android:filterTouchesWhenObscured="false">
 
     <include layout="@layout/settingslib_expressive_preference_icon_frame"/>
 
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_icon_frame.xml b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_icon_frame.xml
index f5017a5..ccdf37d 100644
--- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_icon_frame.xml
+++ b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_icon_frame.xml
@@ -22,7 +22,8 @@
     android:minWidth="@dimen/settingslib_expressive_space_medium3"
     android:minHeight="@dimen/settingslib_expressive_space_medium3"
     android:gravity="center"
-    android:layout_marginEnd="-8dp">
+    android:layout_marginEnd="-8dp"
+    android:filterTouchesWhenObscured="false">
 
     <androidx.preference.internal.PreferenceImageView
         android:id="@android:id/icon"
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_switch.xml b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_switch.xml
index 4cbdfd5..4abcd22 100644
--- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_switch.xml
+++ b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_switch.xml
@@ -19,4 +19,5 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:theme="@style/Theme.Material3.DynamicColors.DayNight"
     android:id="@+id/switchWidget"
+    android:filterTouchesWhenObscured="false"
     style="@style/SettingslibSwitchStyle.Expressive"/>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_text_frame.xml b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_text_frame.xml
index e3e689b..cc42dab 100644
--- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_text_frame.xml
+++ b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_text_frame.xml
@@ -20,7 +20,8 @@
     android:layout_width="@dimen/settingslib_expressive_space_none"
     android:layout_height="wrap_content"
     android:layout_weight="1"
-    android:padding="@dimen/settingslib_expressive_space_small1">
+    android:paddingVertical="@dimen/settingslib_expressive_space_small1"
+    android:filterTouchesWhenObscured="false">
 
     <TextView
         android:id="@android:id/title"
@@ -28,8 +29,10 @@
         android:layout_height="wrap_content"
         android:layout_gravity="start"
         android:textAlignment="viewStart"
-        android:textAppearance="?android:attr/textAppearanceListItem"
         android:maxLines="2"
+        android:hyphenationFrequency="normalFast"
+        android:lineBreakWordStyle="phrase"
+        android:textAppearance="?android:attr/textAppearanceListItem"
         android:ellipsize="marquee"/>
 
     <TextView
@@ -43,5 +46,7 @@
         android:textAlignment="viewStart"
         android:textAppearance="?android:attr/textAppearanceListItemSecondary"
         android:textColor="?android:attr/textColorSecondary"
-        android:maxLines="10"/>
-</RelativeLayout>
+        android:maxLines="10"
+        android:hyphenationFrequency="normalFast"
+        android:lineBreakWordStyle="phrase"/>
+</RelativeLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_two_target_divider.xml b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_two_target_divider.xml
index 3f75181..9be9ec3 100644
--- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_two_target_divider.xml
+++ b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_two_target_divider.xml
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2024 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.
+    Copyright (C) 2024 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.
   -->
 
 <LinearLayout
@@ -24,7 +24,8 @@
     android:orientation="horizontal"
     android:paddingStart="?android:attr/listPreferredItemPaddingEnd"
     android:paddingLeft="?android:attr/listPreferredItemPaddingEnd"
-    android:paddingVertical="@dimen/settingslib_expressive_space_extrasmall7">
+    android:paddingVertical="@dimen/settingslib_expressive_space_extrasmall7"
+    android:filterTouchesWhenObscured="false">
 
     <ImageView
         android:layout_width="wrap_content"
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_preference_category_no_title.xml b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_preference_category_no_title.xml
index 7f466f6..f69fcd2 100644
--- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_preference_category_no_title.xml
+++ b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_preference_category_no_title.xml
@@ -18,5 +18,6 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:baselineAligned="false">
+    android:baselineAligned="false"
+    android:filterTouchesWhenObscured="false">
 </LinearLayout>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
index 0a36a4f..313748d 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
@@ -56,4 +56,6 @@
 
     <!--Deprecated. After sdk 35, don't use it-->
     <color name="settingslib_colorSurface">@color/settingslib_surface_dark</color>
+
+    <color name="settingslib_list_divider_color">@android:color/system_neutral1_700</color>
 </resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
index 7706e0e..b99ee51 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
@@ -90,4 +90,6 @@
 
     <color name="settingslib_spinner_title_color">@android:color/system_neutral1_900</color>
     <color name="settingslib_spinner_dropdown_color">@android:color/system_neutral2_700</color>
+
+    <color name="settingslib_list_divider_color">@android:color/system_neutral1_200</color>
 </resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml
index 698f21d..3ccbbc0 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml
@@ -27,6 +27,7 @@
         <item name="android:switchStyle">@style/Switch.SettingsLib</item>
         <item name="switchStyle">@style/SwitchCompat.SettingsLib</item>
         <item name="android:progressBarStyleHorizontal">@style/HorizontalProgressBar.SettingsLib</item>
+        <item name="android:listDivider">@drawable/settingslib_list_divider</item>
     </style>
 
     <style name="Theme.SettingsBase" parent="Theme.SettingsBase_v31" />
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/attrs_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/attrs_expressive.xml
new file mode 100644
index 0000000..857dd79
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/values-v35/attrs_expressive.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 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.
+-->
+
+<resources>
+    <declare-styleable name="CollapsableTextView">
+        <attr name="android:gravity"/>
+        <!-- The minimum number of lines when the textView collapsed. -->
+        <attr name="android:minLines"/>
+        <!-- Specifies that the textView is collapsable. -->
+        <attr name="isCollapsable" format="boolean"/>
+    </declare-styleable>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
index 442def9..05a1cea 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
@@ -170,6 +170,52 @@
         <item name="thumbIcon">@drawable/settingslib_expressive_switch_thumb_icon</item>
     </style>
 
+    <style name="SettingslibMainSwitchStyle.Expressive" parent="SettingslibSwitchStyle.Expressive">
+        <item name="android:layout_gravity">center</item>
+        <item name="trackTint">@color/settingslib_expressive_color_main_switch_track</item>
+    </style>
+
+    <style name="SettingsLibCardStyle" parent="">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_marginHorizontal">?android:attr/listPreferredItemPaddingStart</item>
+        <item name="android:layout_marginVertical">@dimen/settingslib_expressive_space_extrasmall4</item>
+        <item name="cardBackgroundColor">@color/settingslib_materialColorPrimary</item>
+        <item name="cardCornerRadius">@dimen/settingslib_expressive_radius_extralarge3</item>
+        <item name="cardElevation">0dp</item>
+        <item name="rippleColor">?android:attr/colorControlHighlight</item>
+    </style>
+
+    <style name="SettingsLibButtonStyle.Expressive.Filled"
+        parent="@style/Widget.Material3.Button">
+        <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:gravity">center</item>
+        <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item>
+        <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item>
+        <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item>
+        <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item>
+        <item name="android:backgroundTint">@color/settingslib_materialColorPrimary</item>
+        <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item>
+        <item name="android:textColor">@color/settingslib_materialColorOnPrimary</item>
+        <item name="android:textSize">14sp</item>
+        <item name="iconGravity">textStart</item>
+        <item name="iconTint">@color/settingslib_materialColorOnPrimary</item>
+        <item name="iconSize">@dimen/settingslib_expressive_space_small4</item>
+    </style>
+
+    <style name="SettingsLibButtonStyle.Expressive.Filled.Large">
+        <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item>
+        <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item>
+        <item name="android:textSize">16sp</item>
+    </style>
+
+    <style name="SettingsLibButtonStyle.Expressive.Filled.Extra"
+        parent="@style/SettingsLibButtonStyle.Expressive.Filled.Large">
+        <item name="android:layout_width">match_parent</item>
+    </style>
+
     <style name="SettingsLibButtonStyle.Expressive.Tonal"
         parent="@style/Widget.Material3.Button.TonalButton">
         <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
@@ -188,4 +234,116 @@
         <item name="iconTint">@color/settingslib_materialColorOnSecondaryContainer</item>
         <item name="iconSize">@dimen/settingslib_expressive_space_small4</item>
     </style>
+
+    <style name="SettingsLibButtonStyle.Expressive.Tonal.Large">
+        <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item>
+        <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item>
+        <item name="android:textSize">16sp</item>
+    </style>
+
+    <style name="SettingsLibButtonStyle.Expressive.Tonal.Extra"
+        parent="@style/SettingsLibButtonStyle.Expressive.Tonal.Large">
+        <item name="android:layout_width">match_parent</item>
+    </style>
+
+    <style name="SettingsLibButtonStyle.Expressive.Outline"
+        parent="@style/Widget.Material3.Button.OutlinedButton.Icon">
+        <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:gravity">center</item>
+        <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item>
+        <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item>
+        <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item>
+        <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item>
+        <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item>
+        <item name="android:textColor">@color/settingslib_materialColorPrimary</item>
+        <item name="android:textSize">14sp</item>
+        <item name="iconTint">@color/settingslib_materialColorPrimary</item>
+        <item name="iconGravity">textStart</item>
+        <item name="iconSize">@dimen/settingslib_expressive_space_small4</item>
+        <item name="iconPadding">@dimen/settingslib_expressive_space_extrasmall4</item>
+        <item name="strokeColor">@color/settingslib_materialColorOutlineVariant</item>
+
+    </style>
+
+    <style name="SettingsLibButtonStyle.Expressive.Outline.Large">
+        <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item>
+        <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item>
+        <item name="android:textSize">16sp</item>
+    </style>
+
+    <style name="SettingsLibButtonStyle.Expressive.Outline.Extra"
+        parent="@style/SettingsLibButtonStyle.Expressive.Outline.Large">
+        <item name="android:layout_width">match_parent</item>
+    </style>
+
+    <style name="SettingslibTextButtonStyle.Expressive"
+        parent="@style/Widget.Material3.Button.TextButton.Icon">
+        <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item>
+        <item name="android:textSize">16sp</item>
+        <item name="android:textColor">@color/settingslib_materialColorOnSurface</item>
+        <item name="iconTint">@null</item>
+        <item name="iconPadding">@dimen/settingslib_expressive_space_extrasmall4</item>
+        <item name="rippleColor">?android:attr/colorControlHighlight</item>
+    </style>
+
+    <style name="EntityHeader">
+        <item name="android:paddingTop">@dimen/settingslib_expressive_space_small4</item>
+        <item name="android:paddingBottom">@dimen/settingslib_expressive_space_small1</item>
+        <item name="android:paddingEnd">@dimen/settingslib_expressive_space_small1</item>
+    </style>
+
+    <style name="SettingsLibEntityHeader" parent="EntityHeader">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:paddingStart">?android:attr/listPreferredItemPaddingStart</item>
+        <item name="android:paddingEnd">?android:attr/listPreferredItemPaddingEnd</item>
+    </style>
+
+    <style name="SettingsLibEntityHeaderContent">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_centerHorizontal">true</item>
+        <item name="android:orientation">vertical</item>
+        <item name="android:gravity">center_horizontal</item>
+    </style>
+
+    <style name="SettingsLibEntityHeaderIcon">
+        <item name="android:layout_width">@dimen/settingslib_expressive_space_large3</item>
+        <item name="android:layout_height">@dimen/settingslib_expressive_space_large3</item>
+        <item name="android:scaleType">fitCenter</item>
+        <item name="android:antialias">true</item>
+    </style>
+
+    <style name="SettingsLibEntityHeaderTitle">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_marginTop">@dimen/settingslib_expressive_space_small1</item>
+        <item name="android:singleLine">false</item>
+        <item name="android:gravity">center</item>
+        <item name="android:ellipsize">marquee</item>
+        <item name="android:textDirection">locale</item>
+        <item name="android:textAppearance">@style/TextAppearance.EntityHeaderTitle</item>
+    </style>
+
+    <style name="SettingslibTextAppearance.LinkableTextStyle.Expressive"
+           parent="@android:style/TextAppearance.DeviceDefault.WindowTitle">
+        <item name="android:textSize">14sp</item>
+        <item name="android:textColor">?android:attr/colorAccent</item>
+    </style>
+
+    <style name="SettingsLibStatusBannerCardStyle">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_marginHorizontal">?android:attr/listPreferredItemPaddingStart</item>
+        <item name="android:layout_marginVertical">@dimen/settingslib_expressive_space_extrasmall4</item>
+        <item name="cardBackgroundColor">@color/settingslib_materialColorSurfaceBright</item>
+        <item name="cardCornerRadius">@dimen/settingslib_expressive_radius_extralarge2</item>
+        <item name="cardElevation">0dp</item>
+        <item name="rippleColor">?android:attr/colorControlHighlight</item>
+    </style>
 </resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values/strings.xml b/packages/SettingsLib/SettingsTheme/res/values/strings.xml
new file mode 100644
index 0000000..c36dcb8
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/values/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+    <!-- text of button to indicate user the textView is expandable [CHAR LIMIT=NONE] -->
+    <string name="settingslib_expressive_text_expand">Expand</string>
+    <!-- text of button to indicate user the textView is collapsable [CHAR LIMIT=NONE] -->
+    <string name="settingslib_expressive_text_collapse">Collapse</string>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt
new file mode 100644
index 0000000..7eb9840
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2024 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.settingslib.widget
+
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.text.Spannable
+import android.text.SpannableString
+import android.text.TextPaint
+import android.text.TextUtils
+import android.text.method.LinkMovementMethod
+import android.text.style.ClickableSpan
+import android.text.style.URLSpan
+import android.util.AttributeSet
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.TextView
+import androidx.constraintlayout.widget.ConstraintLayout
+import com.android.settingslib.widget.theme.R
+import com.google.android.material.button.MaterialButton
+
+class CollapsableTextView @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0
+) : ConstraintLayout(context, attrs, defStyleAttr) {
+
+    private var isCollapsable: Boolean = false
+    private var isCollapsed: Boolean = false
+    private var minLines: Int = DEFAULT_MIN_LINES
+
+    private val titleTextView: TextView
+    private val collapseButton: MaterialButton
+    private val collapseButtonResources: CollapseButtonResources
+    private var hyperlinkListener: View.OnClickListener? = null
+    private var learnMoreListener: View.OnClickListener? = null
+    private var learnMoreText: CharSequence? = null
+    private var learnMoreSpan: LearnMoreSpan? = null
+    val learnMoreTextView: LinkableTextView
+    var isLearnMoreEnabled: Boolean = false
+
+    init {
+        LayoutInflater.from(context)
+            .inflate(R.layout.settingslib_expressive_collapsable_textview, this)
+        titleTextView = findViewById(android.R.id.title)
+        collapseButton = findViewById(R.id.collapse_button)
+        learnMoreTextView = findViewById(R.id.settingslib_expressive_learn_more)
+
+        collapseButtonResources = CollapseButtonResources(
+            context.getDrawable(R.drawable.settingslib_expressive_icon_collapse)!!,
+            context.getDrawable(R.drawable.settingslib_expressive_icon_expand)!!,
+            context.getString(R.string.settingslib_expressive_text_collapse),
+            context.getString(R.string.settingslib_expressive_text_expand)
+        )
+
+        collapseButton.setOnClickListener {
+            isCollapsed = !isCollapsed
+            updateView()
+        }
+
+        initAttributes(context, attrs, defStyleAttr)
+    }
+
+    private fun initAttributes(context: Context, attrs: AttributeSet?, defStyleAttr: Int) {
+        context.obtainStyledAttributes(
+            attrs, Attrs, defStyleAttr, 0
+        ).apply {
+            val gravity = getInt(GravityAttr, Gravity.START)
+            when (gravity) {
+                Gravity.CENTER_VERTICAL, Gravity.CENTER, Gravity.CENTER_HORIZONTAL -> {
+                    centerHorizontally(titleTextView)
+                    centerHorizontally(collapseButton)
+                }
+            }
+            recycle()
+        }
+    }
+
+    private fun centerHorizontally(view: View) {
+        (view.layoutParams as LayoutParams).apply {
+            startToStart = LayoutParams.PARENT_ID
+            endToEnd = LayoutParams.PARENT_ID
+            horizontalBias = 0.5f
+        }
+    }
+
+    /**
+     * Sets the text content of the CollapsableTextView.
+     * @param text The text to display.
+     */
+    fun setText(text: String) {
+        titleTextView.text = text
+    }
+
+    /**
+     * Sets whether the text view is collapsable.
+     * @param collapsable True if the text view should be collapsable, false otherwise.
+     */
+    fun setCollapsable(collapsable: Boolean) {
+        isCollapsable = collapsable
+        updateView()
+    }
+
+    /**
+     * Sets the minimum number of lines to display when collapsed.
+     * @param lines The minimum number of lines.
+     */
+    fun setMinLines(line: Int) {
+        minLines = line.coerceIn(1, DEFAULT_MAX_LINES)
+        updateView()
+    }
+
+    /**
+     * Sets the action when clicking on the learn more view.
+     * @param listener The click listener for learn more.
+     */
+    fun setLearnMoreAction(listener: View.OnClickListener?) {
+        if (learnMoreListener != listener) {
+            learnMoreListener = listener
+            formatLearnMoreText()
+        }
+    }
+
+    /**
+     * Sets the text of learn more view.
+     * @param text The text of learn more.
+     */
+    fun setLearnMoreText(text: CharSequence?) {
+        if (!TextUtils.equals(learnMoreText, text)) {
+            learnMoreText = text
+            formatLearnMoreText()
+        }
+    }
+
+    fun setHyperlinkListener(listener: View.OnClickListener?) {
+        if (hyperlinkListener != listener) {
+            hyperlinkListener = listener
+            linkifyTitle()
+        }
+    }
+
+    private fun linkifyTitle() {
+        var text = titleTextView.text.toString()
+        val beginIndex = text.indexOf(LINK_BEGIN_MARKER)
+        text = text.replace(LINK_BEGIN_MARKER, "")
+        val endIndex = text.indexOf(LINK_END_MARKER)
+        text = text.replace(LINK_END_MARKER, "")
+        titleTextView.text = text
+        if (beginIndex == -1 || endIndex == -1 || beginIndex >= endIndex) {
+            return
+        }
+
+        titleTextView.setText(text, TextView.BufferType.SPANNABLE)
+        titleTextView.movementMethod = LinkMovementMethod.getInstance()
+        val spannableContent = titleTextView.getText() as Spannable
+        val spannableLink = object : ClickableSpan() {
+            override fun onClick(widget: View) {
+                hyperlinkListener?.onClick(widget)
+            }
+
+            override fun updateDrawState(ds: TextPaint) {
+                super.updateDrawState(ds)
+                ds.isUnderlineText = true
+            }
+        }
+        spannableContent.setSpan(
+            spannableLink,
+            beginIndex,
+            endIndex,
+            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
+        )
+    }
+
+    private fun formatLearnMoreText() {
+        if (learnMoreListener == null || TextUtils.isEmpty(learnMoreText)) {
+            learnMoreTextView.visibility = GONE
+            isLearnMoreEnabled = false
+            return
+        }
+        val spannableLearnMoreText = SpannableString(learnMoreText)
+        if (learnMoreSpan != null) {
+            spannableLearnMoreText.removeSpan(learnMoreSpan)
+        }
+        learnMoreSpan = LearnMoreSpan(clickListener = learnMoreListener!!)
+        spannableLearnMoreText.setSpan(learnMoreSpan, 0, learnMoreText!!.length, 0)
+        learnMoreTextView.setText(spannableLearnMoreText)
+        learnMoreTextView.visibility = VISIBLE
+        isLearnMoreEnabled = true
+    }
+
+    private fun updateView() {
+        when {
+            isCollapsed -> {
+                collapseButton.apply {
+                    text = collapseButtonResources.expandText
+                    icon = collapseButtonResources.expandIcon
+                }
+                titleTextView.maxLines = minLines
+            }
+
+            else -> {
+                collapseButton.apply {
+                    text = collapseButtonResources.collapseText
+                    icon = collapseButtonResources.collapseIcon
+                }
+                titleTextView.maxLines = DEFAULT_MAX_LINES
+            }
+        }
+        collapseButton.visibility = if (isCollapsable) VISIBLE else GONE
+        learnMoreTextView.visibility = if (isLearnMoreEnabled && !isCollapsed) VISIBLE else GONE
+    }
+
+    private data class CollapseButtonResources(
+        val collapseIcon: Drawable,
+        val expandIcon: Drawable,
+        val collapseText: String,
+        val expandText: String
+    )
+
+    companion object {
+        private const val DEFAULT_MAX_LINES = 10
+        private const val DEFAULT_MIN_LINES = 2
+
+        private const val LINK_BEGIN_MARKER = "LINK_BEGIN"
+        private const val LINK_END_MARKER = "LINK_END"
+
+        private val Attrs = R.styleable.CollapsableTextView
+        private val GravityAttr = R.styleable.CollapsableTextView_android_gravity
+    }
+}
+
+internal class LearnMoreSpan(
+    val url: String = "",
+    val clickListener: View.OnClickListener) : URLSpan(url) {
+    override fun onClick(widget: View) {
+        clickListener.onClick(widget)
+    }
+}
diff --git a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/Expandable.kt b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/Expandable.kt
new file mode 100644
index 0000000..1f84118
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/Expandable.kt
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2024 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.settingslib.widget
+
+interface Expandable {
+    fun isExpanded(): Boolean
+}
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/LinkableTextView.kt b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/LinkableTextView.kt
new file mode 100644
index 0000000..94a2d44
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/LinkableTextView.kt
@@ -0,0 +1,41 @@
+/*
+* Copyright (C) 2024 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.settingslib.widget
+
+import android.content.Context
+import android.text.Spanned
+import android.text.method.LinkMovementMethod
+import android.text.style.ClickableSpan
+import android.util.AttributeSet
+import android.widget.TextView
+
+class LinkableTextView @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0
+) : TextView(context, attrs, defStyleAttr) {
+
+    override fun setText(text: CharSequence, type: BufferType?) {
+        super.setText(text, type)
+        if (text is Spanned) {
+            val spans = text.getSpans(0, text.length, ClickableSpan::class.java)
+            if (spans.size > 0) {
+                movementMethod = LinkMovementMethod.getInstance()
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/SettingsThemeHelper.kt b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/SettingsThemeHelper.kt
index 10e5267..74f5441 100644
--- a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/SettingsThemeHelper.kt
+++ b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/SettingsThemeHelper.kt
@@ -18,7 +18,6 @@
 
 import android.content.Context
 import android.os.Build
-import android.os.SystemProperties
 
 object SettingsThemeHelper {
     private const val IS_EXPRESSIVE_DESIGN_ENABLED = "is_expressive_design_enabled"
@@ -50,8 +49,7 @@
         expressiveThemeState =
             if (
                 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) &&
-                    (SystemProperties.getBoolean(IS_EXPRESSIVE_DESIGN_ENABLED, false) ||
-                        getPropBoolean(context, IS_EXPRESSIVE_DESIGN_ENABLED, false))
+                        getPropBoolean(context, IS_EXPRESSIVE_DESIGN_ENABLED, false)
             ) {
                 ExpressiveThemeState.ENABLED
             } else {
diff --git a/packages/SettingsLib/SliderPreference/Android.bp b/packages/SettingsLib/SliderPreference/Android.bp
new file mode 100644
index 0000000..46528c1
--- /dev/null
+++ b/packages/SettingsLib/SliderPreference/Android.bp
@@ -0,0 +1,31 @@
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "frameworks_base_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["frameworks_base_license"],
+}
+
+android_library {
+    name: "SettingsLibSliderPreference",
+    use_resource_processor: true,
+    defaults: [
+        "SettingsLintDefaults",
+    ],
+
+    srcs: ["src/**/*.java"],
+    resource_dirs: ["res"],
+
+    static_libs: [
+        "androidx.annotation_annotation",
+        "androidx.preference_preference",
+        "SettingsLibSettingsTheme",
+    ],
+
+    sdk_version: "system_current",
+    min_sdk_version: "23",
+    apex_available: [
+        "//apex_available:platform",
+    ],
+}
diff --git a/packages/SettingsLib/SliderPreference/AndroidManifest.xml b/packages/SettingsLib/SliderPreference/AndroidManifest.xml
new file mode 100644
index 0000000..04a6752
--- /dev/null
+++ b/packages/SettingsLib/SliderPreference/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.android.settingslib.widget.preference.slider">
+
+    <uses-sdk android:minSdkVersion="23" />
+
+</manifest>
diff --git a/packages/SettingsLib/SliderPreference/res/layout/settingslib_expressive_layout_slider.xml b/packages/SettingsLib/SliderPreference/res/layout/settingslib_expressive_layout_slider.xml
new file mode 100644
index 0000000..a9cc2c4
--- /dev/null
+++ b/packages/SettingsLib/SliderPreference/res/layout/settingslib_expressive_layout_slider.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2024 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:clipChildren="false"
+    android:gravity="center_vertical">
+
+    <FrameLayout
+        android:id="@+id/icon_start_frame"
+        android:layout_width="@dimen/settingslib_expressive_space_medium4"
+        android:layout_height="@dimen/settingslib_expressive_space_medium4"
+        android:clipChildren="false"
+        android:focusable="true"
+        android:visibility="gone">
+
+        <ImageView
+            android:id="@+id/icon_start"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:background="?android:attr/selectableItemBackgroundBorderless"
+            android:adjustViewBounds="true"
+            android:focusable="false"
+            android:tint="?android:attr/textColorPrimary"
+            android:tintMode="src_in" />
+    </FrameLayout>
+
+    <com.google.android.material.slider.Slider
+        android:id="@+id/slider"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:theme="@style/Theme.MaterialComponents.DayNight" />
+
+    <FrameLayout
+        android:id="@+id/icon_end_frame"
+        android:layout_width="@dimen/settingslib_expressive_space_medium4"
+        android:layout_height="@dimen/settingslib_expressive_space_medium4"
+        android:clipChildren="false"
+        android:focusable="true"
+        android:visibility="gone">
+
+        <ImageView
+            android:id="@+id/icon_end"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:background="?android:attr/selectableItemBackgroundBorderless"
+            android:adjustViewBounds="true"
+            android:focusable="false"
+            android:tint="?android:attr/textColorPrimary"
+            android:tintMode="src_in" />
+    </FrameLayout>
+</LinearLayout>
diff --git a/packages/SettingsLib/SliderPreference/res/layout/settingslib_expressive_preference_slider.xml b/packages/SettingsLib/SliderPreference/res/layout/settingslib_expressive_preference_slider.xml
new file mode 100644
index 0000000..2772091
--- /dev/null
+++ b/packages/SettingsLib/SliderPreference/res/layout/settingslib_expressive_preference_slider.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center_vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:orientation="horizontal"
+    android:background="?android:attr/selectableItemBackground"
+    android:clipToPadding="false"
+    android:baselineAligned="false">
+
+    <include layout="@layout/settingslib_icon_frame"/>
+
+    <RelativeLayout
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:paddingVertical="@dimen/settingslib_expressive_space_small1">
+
+        <TextView
+            android:id="@android:id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="start"
+            android:textAlignment="viewStart"
+            android:textAppearance="?android:attr/textAppearanceListItem"
+            android:maxLines="2"
+            android:ellipsize="marquee"/>
+
+        <TextView
+            android:id="@android:id/summary"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@android:id/title"
+            android:layout_alignLeft="@android:id/title"
+            android:layout_alignStart="@android:id/title"
+            android:layout_gravity="start"
+            android:textAlignment="viewStart"
+            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+            android:textColor="?android:attr/textColorSecondary"
+            android:maxLines="10"/>
+
+        <include
+            layout="@layout/settingslib_expressive_layout_slider"
+            android:id="@+id/slider_frame"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignStart="@android:id/summary"
+            android:layout_below="@android:id/summary" />
+
+        <LinearLayout
+            android:id="@+id/label_frame"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@id/slider_frame"
+            android:orientation="horizontal"
+            android:visibility="gone">
+
+            <TextView
+                android:id="@android:id/text1"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_gravity="start|top"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:textColor="?android:attr/textColorSecondary"
+                android:gravity="start"
+                android:layout_weight="1"/>
+
+            <TextView
+                android:id="@android:id/text2"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_gravity="end|top"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:textColor="?android:attr/textColorSecondary"
+                android:gravity="end"
+                android:layout_weight="1"/>
+        </LinearLayout>
+
+    </RelativeLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/SliderPreference/res/values/attrs_expressive.xml b/packages/SettingsLib/SliderPreference/res/values/attrs_expressive.xml
new file mode 100644
index 0000000..5946409
--- /dev/null
+++ b/packages/SettingsLib/SliderPreference/res/values/attrs_expressive.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 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.
+-->
+
+<resources>
+    <!-- For SliderPreference -->
+    <declare-styleable name="SliderPreference">
+        <attr name="textStart" format="reference" />
+        <attr name="textEnd" format="reference" />
+        <attr name="iconStart" format="reference" />
+        <attr name="iconEnd" format="reference" />
+        <attr name="iconStartContentDescription" format="reference" />
+        <attr name="iconEndContentDescription" format="reference" />
+    </declare-styleable>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/SliderPreference/res/values/colors_expressive.xml b/packages/SettingsLib/SliderPreference/res/values/colors_expressive.xml
new file mode 100644
index 0000000..803b7a4
--- /dev/null
+++ b/packages/SettingsLib/SliderPreference/res/values/colors_expressive.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<resources>
+    <color name="settingslib_expressive_color_slider_track_active">@color/settingslib_materialColorPrimary</color>
+    <color name="settingslib_expressive_color_slider_track_inactive">@color/settingslib_materialColorSurfaceContainerHighest</color>
+    <color name="settingslib_expressive_color_slider_thumb">@color/settingslib_materialColorPrimary</color>
+    <color name="settingslib_expressive_color_slider_halo">@android:color/transparent</color>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/SliderPreference/res/values/dimens_expressive.xml b/packages/SettingsLib/SliderPreference/res/values/dimens_expressive.xml
new file mode 100644
index 0000000..faae8bc
--- /dev/null
+++ b/packages/SettingsLib/SliderPreference/res/values/dimens_expressive.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+<resources>
+    <dimen name="settingslib_expressive_slider_track_height">@dimen/settingslib_expressive_space_small1</dimen>
+    <dimen name="settingslib_expressive_slider_track_inside_corner_size">@dimen/settingslib_expressive_space_extrasmall1</dimen>
+    <dimen name="settingslib_expressive_slider_track_stop_indicator_size">@dimen/settingslib_expressive_space_extrasmall2</dimen>
+    <dimen name="settingslib_expressive_slider_thumb_width">@dimen/settingslib_expressive_space_extrasmall2</dimen>
+    <dimen name="settingslib_expressive_slider_thumb_height">44dp</dimen>
+    <dimen name="settingslib_expressive_slider_thumb_elevation">@dimen/settingslib_expressive_space_none</dimen>
+    <dimen name="settingslib_expressive_slider_thumb_stroke_width">@dimen/settingslib_expressive_space_extrasmall2</dimen>
+    <dimen name="settingslib_expressive_slider_thumb_track_gap_size">@dimen/settingslib_expressive_space_extrasmall3</dimen>
+    <dimen name="settingslib_expressive_slider_tick_radius">@dimen/settingslib_expressive_radius_extrasmall1</dimen>
+
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java b/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java
new file mode 100644
index 0000000..1815d04
--- /dev/null
+++ b/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java
@@ -0,0 +1,668 @@
+/*
+ * Copyright (C) 2024 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.settingslib.widget;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.settingslib.widget.preference.slider.R;
+
+import com.google.android.material.slider.LabelFormatter;
+import com.google.android.material.slider.Slider;
+
+/**
+ * A {@link Preference} that displays a {@link Slider}.
+ */
+public class SliderPreference extends Preference {
+    private static final String TAG = "SliderPreference";
+
+    private final int mTextStartId;
+    private final int mTextEndId;
+    private final int mIconStartId;
+    private final int mIconEndId;
+    private final int mIconStartContentDescriptionId;
+    private final int mIconEndContentDescriptionId;
+    private final ColorStateList mTrackActiveColor;
+    private final ColorStateList mTrackInactiveColor;
+    private final ColorStateList mThumbColor;
+    private final ColorStateList mHaloColor;
+    private final int mTrackHeight;
+    private final int mTrackInsideCornerSize;
+    private final int mTrackStopIndicatorSize;
+    private final int mThumbWidth;
+    private final int mThumbHeight;
+    private final int mThumbElevation;
+    private final int mThumbStrokeWidth;
+    private final int mThumbTrackGapSize;
+    private final int mTickRadius;
+    @Nullable private Slider mSlider;
+    private int mSliderValue;
+    private int mMin;
+    private int mMax;
+    private int mSliderIncrement;
+    private boolean mAdjustable;
+    private boolean mTrackingTouch;
+
+    /**
+     * Listener reacting to the user pressing DPAD left/right keys if {@code
+     * adjustable} attribute is set to true; it transfers the key presses to the {@link Slider}
+     * to be handled accordingly.
+     */
+    private final View.OnKeyListener mSliderKeyListener = new View.OnKeyListener() {
+        @Override
+        public boolean onKey(@NonNull View v, int keyCode, @NonNull KeyEvent event) {
+            if (event.getAction() != KeyEvent.ACTION_DOWN) {
+                return false;
+            }
+
+            if (!mAdjustable && (keyCode == KeyEvent.KEYCODE_DPAD_LEFT
+                    || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT)) {
+                // Right or left keys are pressed when in non-adjustable mode; Skip the keys.
+                return false;
+            }
+
+            // We don't want to propagate the click keys down to the Slider since it will
+            // create the ripple effect for the thumb.
+            if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) {
+                return false;
+            }
+
+            if (mSlider == null) {
+                Log.e(TAG, "Slider view is null and hence cannot be adjusted.");
+                return false;
+            }
+            return mSlider.onKeyDown(keyCode, event);
+        }
+    };
+    /**
+     * Listener reacting to the {@link Slider} touch event by the user
+     */
+    private final Slider.OnSliderTouchListener mTouchListener = new Slider.OnSliderTouchListener() {
+        @Override
+        public void onStopTrackingTouch(@NonNull Slider slider) {
+            mTrackingTouch = false;
+            if ((int) slider.getValue() != mSliderValue) {
+                syncValueInternal(slider);
+            }
+        }
+
+        @Override
+        public void onStartTrackingTouch(@NonNull Slider slider) {
+            mTrackingTouch = true;
+        }
+    };
+    private LabelFormatter mLabelFormater;
+    // Whether the SliderPreference should continuously save the Slider value while it is being
+    // dragged.
+    private boolean mUpdatesContinuously;
+    /**
+     * Listener reacting to the {@link Slider} changing value by the user
+     */
+    private final Slider.OnChangeListener mChangeListener = new Slider.OnChangeListener() {
+        @Override
+        public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) {
+            if (fromUser && (mUpdatesContinuously || !mTrackingTouch)) {
+                syncValueInternal(slider);
+            }
+        }
+    };
+    // Whether to show the Slider value TextView next to the bar
+    private boolean mShowSliderValue;
+
+    public SliderPreference(@NonNull Context context,
+            @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        setLayoutResource(R.layout.settingslib_expressive_preference_slider);
+
+        TypedArray a = context.obtainStyledAttributes(
+                attrs, androidx.preference.R.styleable.SeekBarPreference, defStyleAttr,
+                0 /*defStyleRes*/);
+
+        // The ordering of these two statements are important. If we want to set max first, we need
+        // to perform the same steps by changing min/max to max/min as following:
+        // mMax = a.getInt(...) and setMin(...).
+        mMin = a.getInt(androidx.preference.R.styleable.SeekBarPreference_min, 0);
+        setMax(a.getInt(androidx.preference.R.styleable.SeekBarPreference_android_max, 100));
+        setSliderIncrement(
+                a.getInt(androidx.preference.R.styleable.SeekBarPreference_seekBarIncrement, 0));
+        mAdjustable = a.getBoolean(androidx.preference.R.styleable.SeekBarPreference_adjustable,
+                true);
+        mShowSliderValue = a.getBoolean(
+                androidx.preference.R.styleable.SeekBarPreference_showSeekBarValue, false);
+        mUpdatesContinuously = a.getBoolean(
+                androidx.preference.R.styleable.SeekBarPreference_updatesContinuously,
+                false);
+        a.recycle();
+
+        a = context.obtainStyledAttributes(attrs,
+                R.styleable.SliderPreference);
+        mTextStartId = a.getResourceId(
+                R.styleable.SliderPreference_textStart, /* defValue= */ 0);
+        mTextEndId = a.getResourceId(
+                R.styleable.SliderPreference_textEnd, /* defValue= */ 0);
+        mIconStartId = a.getResourceId(
+                R.styleable.SliderPreference_iconStart, /* defValue= */ 0);
+        mIconEndId = a.getResourceId(
+                R.styleable.SliderPreference_iconEnd, /* defValue= */ 0);
+
+        mIconStartContentDescriptionId = a.getResourceId(
+                R.styleable.SliderPreference_iconStartContentDescription,
+                /* defValue= */ 0);
+
+        mIconEndContentDescriptionId = a.getResourceId(
+                R.styleable.SliderPreference_iconEndContentDescription,
+                /* defValue= */ 0);
+        a.recycle();
+
+        mTrackActiveColor = context.getColorStateList(
+                R.color.settingslib_expressive_color_slider_track_active);
+        mTrackInactiveColor = context.getColorStateList(
+                R.color.settingslib_expressive_color_slider_track_inactive);
+        mThumbColor = context.getColorStateList(
+                R.color.settingslib_expressive_color_slider_thumb);
+        mHaloColor = context.getColorStateList(R.color.settingslib_expressive_color_slider_halo);
+
+        Resources res = context.getResources();
+        mTrackHeight = res.getDimensionPixelSize(
+                R.dimen.settingslib_expressive_slider_track_height);
+        mTrackInsideCornerSize = res.getDimensionPixelSize(
+                R.dimen.settingslib_expressive_slider_track_inside_corner_size);
+        mTrackStopIndicatorSize = res.getDimensionPixelSize(
+                R.dimen.settingslib_expressive_slider_track_stop_indicator_size);
+        mThumbWidth = res.getDimensionPixelSize(R.dimen.settingslib_expressive_slider_thumb_width);
+        mThumbHeight = res.getDimensionPixelSize(
+                R.dimen.settingslib_expressive_slider_thumb_height);
+        mThumbElevation = res.getDimensionPixelSize(
+                R.dimen.settingslib_expressive_slider_thumb_elevation);
+        mThumbStrokeWidth = res.getDimensionPixelSize(
+                R.dimen.settingslib_expressive_slider_thumb_stroke_width);
+        mThumbTrackGapSize = res.getDimensionPixelSize(
+                R.dimen.settingslib_expressive_slider_thumb_track_gap_size);
+        mTickRadius = res.getDimensionPixelSize(R.dimen.settingslib_expressive_slider_tick_radius);
+    }
+
+    /**
+     * Constructor that is called when inflating a preference from XML. This is called when a
+     * preference is being constructed from an XML file, supplying attributes that were specified
+     * in the XML file. This version uses a default style of 0, so the only attribute values
+     * applied are those in the Context's Theme and the given AttributeSet.
+     *
+     * @param context The Context this is associated with, through which it can access the
+     *                current theme, resources, etc.
+     * @param attrs   The attributes of the XML tag that is inflating the preference
+     */
+    public SliderPreference(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0 /* defStyleAttr */);
+    }
+
+    /**
+     * Constructor to create a slider preference.
+     *
+     * @param context The Context this is associated with, through which it can access the
+     *                current theme, resources, etc.
+     */
+    public SliderPreference(@NonNull Context context) {
+        this(context, null);
+    }
+
+    private static void setIconViewAndFrameEnabled(View iconView, ViewGroup iconFrame,
+            boolean enabled) {
+        iconView.setEnabled(enabled);
+        iconFrame.setEnabled(enabled);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        holder.itemView.setOnKeyListener(mSliderKeyListener);
+        mSlider = (Slider) holder.findViewById(R.id.slider);
+
+        if (mSlider == null) {
+            Log.e(TAG, "Slider is null in onBindViewHolder.");
+            return;
+        }
+
+        if (mShowSliderValue) {
+            mSlider.setLabelBehavior(LabelFormatter.LABEL_FLOATING);
+        } else {
+            mSlider.setLabelBehavior(LabelFormatter.LABEL_GONE);
+        }
+        if (mLabelFormater != null) {
+            mSlider.setLabelFormatter(mLabelFormater);
+        }
+        if (mSliderIncrement != 0) {
+            mSlider.setStepSize(mSliderIncrement);
+        } else {
+            mSliderIncrement = (int) (mSlider.getStepSize());
+        }
+        mSlider.setValueFrom(mMin);
+        mSlider.setValueTo(mMax);
+        mSlider.setValue(mSliderValue);
+        mSlider.addOnSliderTouchListener(mTouchListener);
+        mSlider.addOnChangeListener(mChangeListener);
+        mSlider.setEnabled(isEnabled());
+
+        // Set up slider color
+        mSlider.setTrackActiveTintList(mTrackActiveColor);
+        mSlider.setTrackInactiveTintList(mTrackInactiveColor);
+        mSlider.setThumbTintList(mThumbColor);
+        mSlider.setHaloTintList(mHaloColor);
+        mSlider.setTickActiveTintList(mTrackInactiveColor);
+        mSlider.setTickInactiveTintList(mTrackActiveColor);
+
+        // Set up slider size
+        if (SettingsThemeHelper.isExpressiveTheme(getContext())) {
+            mSlider.setTrackHeight(mTrackHeight);
+            // need to drop 1.12.0 to Android
+            mSlider.setTrackInsideCornerSize(mTrackInsideCornerSize);
+            mSlider.setTrackStopIndicatorSize(mTrackStopIndicatorSize);
+            mSlider.setThumbWidth(mThumbWidth);
+            mSlider.setThumbHeight(mThumbHeight);
+            mSlider.setThumbElevation(mThumbElevation);
+            mSlider.setThumbStrokeWidth(mThumbStrokeWidth);
+            mSlider.setThumbTrackGapSize(mThumbTrackGapSize);
+            mSlider.setTickActiveRadius(mTickRadius);
+            mSlider.setTickInactiveRadius(mTickRadius);
+        }
+
+        TextView startText = (TextView) holder.findViewById(android.R.id.text1);
+        if (mTextStartId > 0 && startText != null) {
+            startText.setText(mTextStartId);
+        }
+
+        TextView endText = (TextView) holder.findViewById(android.R.id.text2);
+        if (mTextEndId > 0 && endText != null) {
+            endText.setText(mTextEndId);
+        }
+
+        View labelFrame = holder.findViewById(R.id.label_frame);
+        if (labelFrame != null) {
+            boolean isValidTextResIdExist = mTextStartId > 0 || mTextEndId > 0;
+            labelFrame.setVisibility(isValidTextResIdExist ? View.VISIBLE : View.GONE);
+        }
+
+        ImageView iconStartView = (ImageView) holder.findViewById(R.id.icon_start);
+        updateIconStartIfNeeded(iconStartView);
+
+        ImageView iconEndView = (ImageView) holder.findViewById(R.id.icon_end);
+        updateIconEndIfNeeded(iconEndView);
+    }
+
+    /**
+     * Gets the lower bound set on the {@link Slider}.
+     *
+     * @return The lower bound set
+     */
+    public int getMin() {
+        return mMin;
+    }
+
+    /**
+     * Sets the lower bound on the {@link Slider}.
+     *
+     * @param min The lower bound to set
+     */
+    public void setMin(int min) {
+        if (min > mMax) {
+            min = mMax;
+        }
+        if (min != mMin) {
+            mMin = min;
+            notifyChanged();
+        }
+    }
+
+    /**
+     * Gets the upper bound set on the {@link Slider}.
+     *
+     * @return The upper bound set
+     */
+    public int getMax() {
+        return mMax;
+    }
+
+    /**
+     * Sets the upper bound on the {@link Slider}.
+     *
+     * @param max The upper bound to set
+     */
+    public final void setMax(int max) {
+        if (max < mMin) {
+            max = mMin;
+        }
+        if (max != mMax) {
+            mMax = max;
+            notifyChanged();
+        }
+    }
+
+    public final int getSliderIncrement() {
+        return mSliderIncrement;
+    }
+
+    /**
+     * Sets the increment amount on the {@link Slider} for each arrow key press.
+     *
+     * @param sliderIncrement The amount to increment or decrement when the user presses an
+     *                        arrow key.
+     */
+    public final void setSliderIncrement(int sliderIncrement) {
+        if (sliderIncrement != mSliderIncrement) {
+            mSliderIncrement = Math.min(mMax - mMin, Math.abs(sliderIncrement));
+            notifyChanged();
+        }
+    }
+
+    /**
+     * Gets whether the {@link Slider} should respond to the left/right keys.
+     *
+     * @return Whether the {@link Slider} should respond to the left/right keys
+     */
+    public boolean isAdjustable() {
+        return mAdjustable;
+    }
+
+    /**
+     * Sets whether the {@link Slider} should respond to the left/right keys.
+     *
+     * @param adjustable Whether the {@link Slider} should respond to the left/right keys
+     */
+    public void setAdjustable(boolean adjustable) {
+        mAdjustable = adjustable;
+    }
+
+    /**
+     * Gets whether the {@link SliderPreference} should continuously save the {@link Slider} value
+     * while it is being dragged. Note that when the value is true,
+     * {@link Preference.OnPreferenceChangeListener} will be called continuously as well.
+     *
+     * @return Whether the {@link SliderPreference} should continuously save the {@link Slider}
+     * value while it is being dragged
+     * @see #setUpdatesContinuously(boolean)
+     */
+    public boolean getUpdatesContinuously() {
+        return mUpdatesContinuously;
+    }
+
+    /**
+     * Sets whether the {@link SliderPreference} should continuously save the {@link Slider} value
+     * while it is being dragged.
+     *
+     * @param updatesContinuously Whether the {@link SliderPreference} should continuously save
+     *                            the {@link Slider} value while it is being dragged
+     * @see #getUpdatesContinuously()
+     */
+    public void setUpdatesContinuously(boolean updatesContinuously) {
+        mUpdatesContinuously = updatesContinuously;
+    }
+
+    /**
+     * Gets whether the current {@link Slider} value is displayed to the user.
+     *
+     * @return Whether the current {@link Slider} value is displayed to the user
+     * @see #setShowSliderValue(boolean)
+     */
+    public boolean getShowSliderValue() {
+        return mShowSliderValue;
+    }
+
+    /**
+     * Sets whether the current {@link Slider} value is displayed to the user.
+     *
+     * @param showSliderValue Whether the current {@link Slider} value is displayed to the user
+     * @see #getShowSliderValue()
+     */
+    public void setShowSliderValue(boolean showSliderValue) {
+        mShowSliderValue = showSliderValue;
+        notifyChanged();
+    }
+
+    public void setLabelFormater(@Nullable LabelFormatter formater) {
+        mLabelFormater = formater;
+    }
+
+    /**
+     * Gets the current progress of the {@link Slider}.
+     *
+     * @return The current progress of the {@link Slider}
+     */
+    public int getValue() {
+        return mSliderValue;
+    }
+
+    /**
+     * Sets the current progress of the {@link Slider}.
+     *
+     * @param sliderValue The current progress of the {@link Slider}
+     */
+    public void setValue(int sliderValue) {
+        setValueInternal(sliderValue, true);
+    }
+
+    @Override
+    protected void onSetInitialValue(@Nullable Object defaultValue) {
+        if (defaultValue == null) {
+            defaultValue = 0;
+        }
+        setValue(getPersistedInt((Integer) defaultValue));
+    }
+
+    @Override
+    protected @Nullable Object onGetDefaultValue(@NonNull TypedArray a, int index) {
+        return a.getInt(index, 0);
+    }
+
+    /**
+     * Persist the {@link Slider}'s Slider value if callChangeListener returns true, otherwise
+     * set the {@link Slider}'s value to the stored value.
+     */
+    void syncValueInternal(@NonNull Slider slider) {
+        int sliderValue = mMin + (int) slider.getValue();
+        if (sliderValue != mSliderValue) {
+            if (callChangeListener(sliderValue)) {
+                setValueInternal(sliderValue, false);
+                // TODO: mHapticFeedbackMode
+            } else {
+                slider.setValue(mSliderValue);
+            }
+        }
+    }
+
+    private void setValueInternal(int sliderValue, boolean notifyChanged) {
+        if (sliderValue < mMin) {
+            sliderValue = mMin;
+        }
+        if (sliderValue > mMax) {
+            sliderValue = mMax;
+        }
+
+        if (sliderValue != mSliderValue) {
+            mSliderValue = sliderValue;
+            persistInt(sliderValue);
+            if (notifyChanged) {
+                notifyChanged();
+            }
+        }
+    }
+
+    @Nullable
+    @Override
+    protected Parcelable onSaveInstanceState() {
+        Parcelable superState = super.onSaveInstanceState();
+        if (isPersistent()) {
+            // No need to save instance state since it's persistent
+            return superState;
+        }
+
+        // Save the instance state
+        SavedState myState = new SavedState(superState);
+        myState.mSliderValue = mSliderValue;
+        myState.mMin = mMin;
+        myState.mMax = mMax;
+        return myState;
+    }
+
+    @Override
+    protected void onRestoreInstanceState(@Nullable Parcelable state) {
+        if (state == null || !state.getClass().equals(SavedState.class)) {
+            // Didn't save state for us in onSaveInstanceState
+            super.onRestoreInstanceState(state);
+            return;
+        }
+
+        // Restore the instance state
+        SavedState myState = (SavedState) state;
+        super.onRestoreInstanceState(myState.getSuperState());
+        mSliderValue = myState.mSliderValue;
+        mMin = myState.mMin;
+        mMax = myState.mMax;
+        notifyChanged();
+    }
+
+    private void updateIconStartIfNeeded(ImageView icon) {
+        if (icon == null) {
+            return;
+        }
+        ViewGroup iconFrame = (ViewGroup) icon.getParent();
+        if (iconFrame == null) {
+            return;
+        }
+
+        if (mIconStartId == 0 || mSliderIncrement == 0) {
+            iconFrame.setVisibility(View.GONE);
+            return;
+        }
+
+        if (icon.getDrawable() == null) {
+            icon.setImageResource(mIconStartId);
+        }
+
+        if (mIconStartContentDescriptionId != 0) {
+            String contentDescription =
+                    iconFrame.getContext().getString(mIconStartContentDescriptionId);
+            iconFrame.setContentDescription(contentDescription);
+        }
+
+        iconFrame.setOnClickListener((view) -> {
+            if (mSliderValue > 0) {
+                setValue(mSliderValue - mSliderIncrement);
+            }
+        });
+
+        iconFrame.setVisibility(View.VISIBLE);
+        setIconViewAndFrameEnabled(icon, iconFrame, mSliderValue > mMin);
+    }
+
+    private void updateIconEndIfNeeded(ImageView icon) {
+        if (icon == null) {
+            return;
+        }
+        ViewGroup iconFrame = (ViewGroup) icon.getParent();
+        if (iconFrame == null) {
+            return;
+        }
+
+        if (mIconEndId == 0 || mSliderIncrement == 0) {
+            iconFrame.setVisibility(View.GONE);
+            return;
+        }
+
+        if (icon.getDrawable() == null) {
+            icon.setImageResource(mIconEndId);
+        }
+
+        if (mIconEndContentDescriptionId != 0) {
+            String contentDescription =
+                    iconFrame.getContext().getString(mIconEndContentDescriptionId);
+            iconFrame.setContentDescription(contentDescription);
+        }
+
+        iconFrame.setOnClickListener((view) -> {
+            if (mSliderValue < mMax) {
+                setValue(mSliderValue + mSliderIncrement);
+            }
+        });
+
+        iconFrame.setVisibility(View.VISIBLE);
+        setIconViewAndFrameEnabled(icon, iconFrame, mSliderValue < mMax);
+    }
+
+    /**
+     * SavedState, a subclass of {@link BaseSavedState}, will store the state of this preference.
+     *
+     * <p>It is important to always call through to super methods.
+     */
+    private static class SavedState extends BaseSavedState {
+        public static final Parcelable.Creator<SavedState> CREATOR =
+                new Parcelable.Creator<>() {
+                    @Override
+                    @NonNull
+                    public SavedState createFromParcel(@NonNull Parcel in) {
+                        return new SavedState(in);
+                    }
+
+                    @Override
+                    @NonNull
+                    public SavedState[] newArray(int size) {
+                        return new SavedState[size];
+                    }
+                };
+
+        int mSliderValue;
+        int mMin;
+        int mMax;
+
+        SavedState(Parcel source) {
+            super(source);
+
+            // Restore the click counter
+            mSliderValue = source.readInt();
+            mMin = source.readInt();
+            mMax = source.readInt();
+        }
+
+        SavedState(Parcelable superState) {
+            super(superState);
+        }
+
+        @Override
+        public void writeToParcel(@NonNull Parcel dest, int flags) {
+            super.writeToParcel(dest, flags);
+
+            // Save the click counter
+            dest.writeInt(mSliderValue);
+            dest.writeInt(mMin);
+            dest.writeInt(mMax);
+        }
+    }
+}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt
index 7139f5b4..2a251a5 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt
@@ -30,9 +30,6 @@
 import com.android.settingslib.spa.gallery.editor.SettingsDropdownBoxPageProvider
 import com.android.settingslib.spa.gallery.editor.SettingsDropdownCheckBoxProvider
 import com.android.settingslib.spa.gallery.home.HomePageProvider
-import com.android.settingslib.spa.gallery.itemList.ItemListPageProvider
-import com.android.settingslib.spa.gallery.itemList.ItemOperatePageProvider
-import com.android.settingslib.spa.gallery.itemList.OperateListPageProvider
 import com.android.settingslib.spa.gallery.editor.SettingsOutlinedTextFieldPageProvider
 import com.android.settingslib.spa.gallery.editor.SettingsTextFieldPasswordPageProvider
 import com.android.settingslib.spa.gallery.page.ArgumentPageProvider
@@ -66,10 +63,6 @@
  */
 enum class SettingsPageProviderEnum(val displayName: String) {
     HOME("home"),
-    PREFERENCE("preference"),
-    ARGUMENT("argument"),
-    ITEM_LIST("itemList"),
-    ITEM_OP_PAGE("itemOp"),
 
     // Add your SPPs
 }
@@ -101,9 +94,6 @@
                 ChartPageProvider,
                 DialogMainPageProvider,
                 NavDialogProvider,
-                ItemListPageProvider,
-                ItemOperatePageProvider,
-                OperateListPageProvider,
                 EditorMainPageProvider,
                 SettingsOutlinedTextFieldPageProvider,
                 SettingsDropdownBoxPageProvider,
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/banner/BannerPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/banner/BannerPageProvider.kt
index 6edd917..c16d8bf 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/banner/BannerPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/banner/BannerPageProvider.kt
@@ -39,9 +39,7 @@
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.tooling.preview.Preview
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.compose.navigator
 import com.android.settingslib.spa.framework.theme.SettingsDimension
 import com.android.settingslib.spa.framework.theme.SettingsTheme
@@ -161,14 +159,12 @@
         }
     }
 
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner = createSettingsPage())
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 
     private const val TITLE = "Sample Banner"
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/button/ActionButtonPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/button/ActionButtonPageProvider.kt
index b001cad..773d3d1 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/button/ActionButtonPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/button/ActionButtonPageProvider.kt
@@ -23,9 +23,7 @@
 import androidx.compose.material.icons.outlined.WarningAmber
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.tooling.preview.Preview
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.compose.navigator
 import com.android.settingslib.spa.framework.theme.SettingsTheme
 import com.android.settingslib.spa.widget.button.ActionButton
@@ -55,14 +53,12 @@
         }
     }
 
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner = createSettingsPage())
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 }
 
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/chart/ChartPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/chart/ChartPageProvider.kt
index 7a6ae2c..6ceb395 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/chart/ChartPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/chart/ChartPageProvider.kt
@@ -39,6 +39,7 @@
 private enum class WeekDay(val num: Int) {
     Sun(0), Mon(1), Tue(2), Wed(3), Thu(4), Fri(5), Sat(6),
 }
+
 private const val TITLE = "Sample Chart"
 
 object ChartPageProvider : SettingsPageProvider {
@@ -103,14 +104,12 @@
         return entryList
     }
 
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner)
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 }
 
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/dialog/DialogMainPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/dialog/DialogMainPageProvider.kt
index 4e3fcee..c9c81aa 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/dialog/DialogMainPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/dialog/DialogMainPageProvider.kt
@@ -18,6 +18,7 @@
 
 import android.os.Bundle
 import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
 import com.android.settingslib.spa.framework.common.SettingsEntry
 import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
@@ -55,13 +56,13 @@
         }.build(),
     )
 
-    fun buildInjectEntry() = SettingsEntryBuilder.createInject(owner)
-        .setUiLayoutFn {
-            Preference(object : PreferenceModel {
-                override val title = TITLE
-                override val onClick = navigator(name)
-            })
-        }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
+    }
 
     override fun getTitle(arguments: Bundle?) = TITLE
 }
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/EditorMainPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/EditorMainPageProvider.kt
index c511542..f2b4091 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/EditorMainPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/EditorMainPageProvider.kt
@@ -17,8 +17,8 @@
 package com.android.settingslib.spa.gallery.editor
 
 import android.os.Bundle
+import androidx.compose.runtime.Composable
 import com.android.settingslib.spa.framework.common.SettingsEntry
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
 import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.compose.navigator
@@ -44,14 +44,12 @@
         )
     }
 
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner = owner)
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 
     override fun getTitle(arguments: Bundle?): String {
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePageProvider.kt
index b1558cc..4d77ea1 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePageProvider.kt
@@ -20,20 +20,16 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.ui.tooling.preview.Preview
-import com.android.settingslib.spa.framework.common.SettingsEntry
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
 import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
-import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.theme.SettingsTheme
 import com.android.settingslib.spa.gallery.R
 import com.android.settingslib.spa.gallery.SettingsPageProviderEnum
-import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider
 import com.android.settingslib.spa.gallery.banner.BannerPageProvider
+import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider
 import com.android.settingslib.spa.gallery.chart.ChartPageProvider
 import com.android.settingslib.spa.gallery.dialog.DialogMainPageProvider
 import com.android.settingslib.spa.gallery.editor.EditorMainPageProvider
-import com.android.settingslib.spa.gallery.itemList.OperateListPageProvider
-import com.android.settingslib.spa.gallery.page.ArgumentPageModel
 import com.android.settingslib.spa.gallery.page.ArgumentPageProvider
 import com.android.settingslib.spa.gallery.page.FooterPageProvider
 import com.android.settingslib.spa.gallery.page.IllustrationPageProvider
@@ -48,35 +44,11 @@
 import com.android.settingslib.spa.gallery.ui.CopyablePageProvider
 import com.android.settingslib.spa.gallery.ui.SpinnerPageProvider
 import com.android.settingslib.spa.widget.scaffold.HomeScaffold
+import com.android.settingslib.spa.widget.ui.Category
 
 object HomePageProvider : SettingsPageProvider {
     override val name = SettingsPageProviderEnum.HOME.name
     override val displayName = SettingsPageProviderEnum.HOME.displayName
-    private val owner = createSettingsPage()
-
-    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
-        return listOf(
-            PreferenceMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            OperateListPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            ArgumentPageProvider.buildInjectEntry("foo")!!.setLink(fromPage = owner).build(),
-            SearchScaffoldPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            SuwScaffoldPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            SliderPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            SpinnerPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            PagerMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            FooterPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            IllustrationPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            CategoryPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            ActionButtonPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            ProgressBarPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            LoadingBarPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            ChartPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            DialogMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            EditorMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            BannerPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            CopyablePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-        )
-    }
 
     override fun getTitle(arguments: Bundle?): String {
         return SpaEnvironmentFactory.instance.appContext.getString(R.string.app_name)
@@ -85,14 +57,30 @@
     @Composable
     override fun Page(arguments: Bundle?) {
         val title = remember { getTitle(arguments) }
-        val entries = remember { buildEntry(arguments) }
         HomeScaffold(title) {
-            for (entry in entries) {
-                if (entry.owner.isCreateBy(SettingsPageProviderEnum.ARGUMENT.name)) {
-                    entry.UiLayout(ArgumentPageModel.buildArgument(intParam = 0))
-                } else {
-                    entry.UiLayout()
-                }
+            Category {
+                PreferenceMainPageProvider.Entry()
+            }
+            Category {
+                SearchScaffoldPageProvider.Entry()
+                SuwScaffoldPageProvider.Entry()
+                ArgumentPageProvider.EntryItem(stringParam = "foo", intParam = 0)
+            }
+            Category {
+                SliderPageProvider.Entry()
+                SpinnerPageProvider.Entry()
+                PagerMainPageProvider.Entry()
+                FooterPageProvider.Entry()
+                IllustrationPageProvider.Entry()
+                CategoryPageProvider.Entry()
+                ActionButtonPageProvider.Entry()
+                ProgressBarPageProvider.Entry()
+                LoadingBarPageProvider.Entry()
+                ChartPageProvider.Entry()
+                DialogMainPageProvider.Entry()
+                EditorMainPageProvider.Entry()
+                BannerPageProvider.Entry()
+                CopyablePageProvider.Entry()
             }
         }
     }
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/itemList/ItemListPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/itemList/ItemListPage.kt
deleted file mode 100644
index 5f251b1..0000000
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/itemList/ItemListPage.kt
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2023 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.settingslib.spa.gallery.itemList
-
-import android.os.Bundle
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import androidx.core.os.bundleOf
-import androidx.navigation.NavType
-import androidx.navigation.navArgument
-import com.android.settingslib.spa.framework.common.EntrySearchData
-import com.android.settingslib.spa.framework.common.SettingsEntry
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
-import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
-import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.util.getStringArg
-import com.android.settingslib.spa.framework.util.navLink
-import com.android.settingslib.spa.gallery.SettingsPageProviderEnum
-import com.android.settingslib.spa.widget.preference.Preference
-import com.android.settingslib.spa.widget.preference.PreferenceModel
-import com.android.settingslib.spa.widget.scaffold.RegularScaffold
-
-private const val OPERATOR_PARAM_NAME = "opParam"
-
-object ItemListPageProvider : SettingsPageProvider {
-    override val name = SettingsPageProviderEnum.ITEM_LIST.name
-    override val displayName = SettingsPageProviderEnum.ITEM_LIST.displayName
-    override val parameter = listOf(
-        navArgument(OPERATOR_PARAM_NAME) { type = NavType.StringType },
-    )
-
-    override fun getTitle(arguments: Bundle?): String {
-        val operation = parameter.getStringArg(OPERATOR_PARAM_NAME, arguments) ?: "NULL"
-        return "Operation: $operation"
-    }
-
-    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
-        if (!ItemOperatePageProvider.isValidArgs(arguments)) return emptyList()
-        val operation = parameter.getStringArg(OPERATOR_PARAM_NAME, arguments)!!
-        val owner = createSettingsPage(arguments)
-        return listOf(
-            ItemOperatePageProvider.buildInjectEntry(operation)!!.setLink(fromPage = owner).build(),
-        )
-    }
-
-    fun buildInjectEntry(opParam: String): SettingsEntryBuilder? {
-        val arguments = bundleOf(OPERATOR_PARAM_NAME to opParam)
-        if (!ItemOperatePageProvider.isValidArgs(arguments)) return null
-
-        return SettingsEntryBuilder.createInject(
-            owner = createSettingsPage(arguments),
-            label = "ItemList_$opParam",
-        ).setUiLayoutFn {
-            Preference(
-                object : PreferenceModel {
-                    override val title = opParam
-                    override val onClick = navigator(
-                        SettingsPageProviderEnum.ITEM_LIST.name + parameter.navLink(it)
-                    )
-                }
-            )
-        }.setSearchDataFn {
-            EntrySearchData(title = "Operation: $opParam")
-        }
-    }
-
-    @Composable
-    override fun Page(arguments: Bundle?) {
-        val title = remember { getTitle(arguments) }
-        val entries = remember { buildEntry(arguments) }
-        val itemList = remember {
-            // Add logic to get item List during runtime.
-            listOf("itemFoo", "itemBar", "itemToy")
-        }
-        RegularScaffold(title) {
-            for (item in itemList) {
-                val rtArgs = ItemOperatePageProvider.genRuntimeArguments(item)
-                for (entry in entries) {
-                    entry.UiLayout(rtArgs)
-                }
-            }
-        }
-    }
-}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/itemList/ItemOperatePage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/itemList/ItemOperatePage.kt
deleted file mode 100644
index 6caec07..0000000
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/itemList/ItemOperatePage.kt
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2023 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.settingslib.spa.gallery.itemList
-
-import android.os.Bundle
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.saveable.rememberSaveable
-import androidx.compose.runtime.setValue
-import androidx.core.os.bundleOf
-import androidx.navigation.NavType
-import androidx.navigation.navArgument
-import com.android.settingslib.spa.framework.common.SettingsEntry
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
-import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
-import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.util.getStringArg
-import com.android.settingslib.spa.framework.util.navLink
-import com.android.settingslib.spa.gallery.SettingsPageProviderEnum
-import com.android.settingslib.spa.widget.preference.Preference
-import com.android.settingslib.spa.widget.preference.PreferenceModel
-import com.android.settingslib.spa.widget.preference.SwitchPreference
-import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
-
-private const val OPERATOR_PARAM_NAME = "opParam"
-private const val ITEM_NAME_PARAM_NAME = "rt_nameParam"
-private val ALLOWED_OPERATOR_LIST = listOf("opDnD", "opPiP", "opInstall", "opConnect")
-
-object ItemOperatePageProvider : SettingsPageProvider {
-    override val name = SettingsPageProviderEnum.ITEM_OP_PAGE.name
-    override val displayName = SettingsPageProviderEnum.ITEM_OP_PAGE.displayName
-    override val parameter = listOf(
-        navArgument(OPERATOR_PARAM_NAME) { type = NavType.StringType },
-        navArgument(ITEM_NAME_PARAM_NAME) { type = NavType.StringType },
-    )
-
-    override fun getTitle(arguments: Bundle?): String {
-        // Operation name is not a runtime parameter, which should always available
-        val operation = parameter.getStringArg(OPERATOR_PARAM_NAME, arguments) ?: "opInValid"
-        // Item name is a runtime parameter, which could be missing
-        val itemName = parameter.getStringArg(ITEM_NAME_PARAM_NAME, arguments) ?: "[unset]"
-        return "$operation on $itemName"
-    }
-
-    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
-        if (!isValidArgs(arguments)) return emptyList()
-
-        val owner = createSettingsPage(arguments)
-        val entryList = mutableListOf<SettingsEntry>()
-        entryList.add(
-            SettingsEntryBuilder.create("ItemName", owner)
-                .setUiLayoutFn {
-                    // Item name is a runtime parameter, which needs to be read inside UiLayoutFn
-                    val itemName = parameter.getStringArg(ITEM_NAME_PARAM_NAME, it) ?: "NULL"
-                    Preference(
-                        object : PreferenceModel {
-                            override val title = "Item $itemName"
-                        }
-                    )
-                }.build()
-        )
-
-        // Operation name is not a runtime parameter, which can be read outside.
-        val opName = parameter.getStringArg(OPERATOR_PARAM_NAME, arguments)!!
-        entryList.add(
-            SettingsEntryBuilder.create("ItemOp", owner)
-                .setUiLayoutFn {
-                    var checked by rememberSaveable { mutableStateOf(false) }
-                    SwitchPreference(remember {
-                        object : SwitchPreferenceModel {
-                            override val title = "Item operation: $opName"
-                            override val checked = { checked }
-                            override val onCheckedChange =
-                                { newChecked: Boolean -> checked = newChecked }
-                        }
-                    })
-                }.build(),
-        )
-        return entryList
-    }
-
-    fun buildInjectEntry(opParam: String): SettingsEntryBuilder? {
-        val arguments = bundleOf(OPERATOR_PARAM_NAME to opParam)
-        if (!isValidArgs(arguments)) return null
-
-        return SettingsEntryBuilder.createInject(
-            owner = createSettingsPage(arguments),
-            label = "ItemOp_$opParam",
-        ).setUiLayoutFn {
-            // Item name is a runtime parameter, which needs to be read inside UiLayoutFn
-            val itemName = parameter.getStringArg(ITEM_NAME_PARAM_NAME, it) ?: "NULL"
-            Preference(
-                object : PreferenceModel {
-                    override val title = "item: $itemName"
-                    override val onClick = navigator(
-                        SettingsPageProviderEnum.ITEM_OP_PAGE.name + parameter.navLink(it)
-                    )
-                }
-            )
-        }
-    }
-
-    fun isValidArgs(arguments: Bundle?): Boolean {
-        val opParam = parameter.getStringArg(OPERATOR_PARAM_NAME, arguments)
-        return (opParam != null && ALLOWED_OPERATOR_LIST.contains(opParam))
-    }
-
-    fun genRuntimeArguments(itemName: String): Bundle {
-        return bundleOf(ITEM_NAME_PARAM_NAME to itemName)
-    }
-}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/itemList/OperateListPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/itemList/OperateListPage.kt
deleted file mode 100644
index e0baf86..0000000
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/itemList/OperateListPage.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2023 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.settingslib.spa.gallery.itemList
-
-import android.os.Bundle
-import com.android.settingslib.spa.framework.common.SettingsEntry
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
-import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
-import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.widget.preference.Preference
-import com.android.settingslib.spa.widget.preference.PreferenceModel
-
-private const val TITLE = "Operate List Main"
-
-object OperateListPageProvider : SettingsPageProvider {
-    override val name = "OpList"
-    private val owner = createSettingsPage()
-
-    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
-        return listOf(
-            ItemListPageProvider.buildInjectEntry("opPiP")!!.setLink(fromPage = owner).build(),
-            ItemListPageProvider.buildInjectEntry("opInstall")!!.setLink(fromPage = owner).build(),
-            ItemListPageProvider.buildInjectEntry("opDnD")!!.setLink(fromPage = owner).build(),
-            ItemListPageProvider.buildInjectEntry("opConnect")!!.setLink(fromPage = owner).build(),
-        )
-    }
-
-    override fun getTitle(arguments: Bundle?): String {
-        return TITLE
-    }
-
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner = owner)
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
-    }
-}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPage.kt
index f01ff38..9ad1c22 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPage.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPage.kt
@@ -18,112 +18,69 @@
 
 import android.os.Bundle
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
 import androidx.compose.ui.tooling.preview.Preview
-import com.android.settingslib.spa.framework.common.SettingsEntry
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
-import com.android.settingslib.spa.framework.common.SettingsPage
+import androidx.navigation.NavType
+import androidx.navigation.navArgument
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
-import com.android.settingslib.spa.framework.common.createSettingsPage
+import com.android.settingslib.spa.framework.compose.navigator
 import com.android.settingslib.spa.framework.theme.SettingsTheme
-import com.android.settingslib.spa.gallery.SettingsPageProviderEnum
 import com.android.settingslib.spa.widget.preference.Preference
+import com.android.settingslib.spa.widget.preference.PreferenceModel
 import com.android.settingslib.spa.widget.scaffold.RegularScaffold
 
+private const val TITLE = "Sample page with arguments"
+private const val STRING_PARAM_NAME = "stringParam"
+private const val INT_PARAM_NAME = "intParam"
+
 object ArgumentPageProvider : SettingsPageProvider {
-    // Defines all entry name in this page.
-    // Note that entry name would be used in log. DO NOT change it once it is set.
-    // One can still change the display name for better readability if necessary.
-    private enum class EntryEnum(val displayName: String) {
-        STRING_PARAM("string_param"),
-        INT_PARAM("int_param"),
-    }
+    override val name = "Argument"
 
-    private fun createEntry(owner: SettingsPage, entry: EntryEnum): SettingsEntryBuilder {
-        return SettingsEntryBuilder.create(owner, entry.name, entry.displayName)
-    }
-
-    override val name = SettingsPageProviderEnum.ARGUMENT.name
-    override val displayName = SettingsPageProviderEnum.ARGUMENT.displayName
-    override val parameter = ArgumentPageModel.parameter
-
-    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
-        if (!ArgumentPageModel.isValidArgument(arguments)) return emptyList()
-
-        val owner = createSettingsPage(arguments)
-        val entryList = mutableListOf<SettingsEntry>()
-        entryList.add(
-            createEntry(owner, EntryEnum.STRING_PARAM)
-                // Set attributes
-                .setIsSearchDataDynamic(true)
-                .setSearchDataFn { ArgumentPageModel.genStringParamSearchData() }
-                .setUiLayoutFn {
-                    // Set ui rendering
-                    Preference(ArgumentPageModel.create(it).genStringParamPreferenceModel())
-                }.build()
-        )
-
-        entryList.add(
-            createEntry(owner, EntryEnum.INT_PARAM)
-                // Set attributes
-                .setIsSearchDataDynamic(true)
-                .setSearchDataFn { ArgumentPageModel.genIntParamSearchData() }
-                .setUiLayoutFn {
-                    // Set ui rendering
-                    Preference(ArgumentPageModel.create(it).genIntParamPreferenceModel())
-                }.build()
-        )
-
-        entryList.add(buildInjectEntry("foo")!!.setLink(fromPage = owner).build())
-        entryList.add(buildInjectEntry("bar")!!.setLink(fromPage = owner).build())
-
-        return entryList
-    }
-
-    fun buildInjectEntry(stringParam: String): SettingsEntryBuilder? {
-        val arguments = ArgumentPageModel.buildArgument(stringParam)
-        if (!ArgumentPageModel.isValidArgument(arguments)) return null
-
-        return SettingsEntryBuilder.createInject(
-            owner = createSettingsPage(arguments),
-            label = "${name}_$stringParam",
-        )
-            .setSearchDataFn { ArgumentPageModel.genInjectSearchData() }
-            .setUiLayoutFn {
-                // Set ui rendering
-                Preference(ArgumentPageModel.create(it).genInjectPreferenceModel())
-            }
-    }
-
-    override fun getTitle(arguments: Bundle?): String {
-        return ArgumentPageModel.genPageTitle()
-    }
+    override val parameter = listOf(
+        navArgument(STRING_PARAM_NAME) { type = NavType.StringType },
+        navArgument(INT_PARAM_NAME) { type = NavType.IntType },
+    )
 
     @Composable
     override fun Page(arguments: Bundle?) {
-        val title = remember { getTitle(arguments) }
-        val entries = remember { buildEntry(arguments) }
-        val rtArgNext = remember { ArgumentPageModel.buildNextArgument(arguments) }
-        RegularScaffold(title) {
-            for (entry in entries) {
-                if (entry.toPage != null) {
-                    entry.UiLayout(rtArgNext)
-                } else {
-                    entry.UiLayout()
-                }
-            }
-        }
+        ArgumentPage(
+            stringParam = arguments!!.getString(STRING_PARAM_NAME, "default"),
+            intParam = arguments.getInt(INT_PARAM_NAME),
+        )
+    }
+
+    @Composable
+    fun EntryItem(stringParam: String, intParam: Int) {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val summary = { "$STRING_PARAM_NAME=$stringParam, $INT_PARAM_NAME=$intParam" }
+            override val onClick = navigator("$name/$stringParam/$intParam")
+        })
+    }
+}
+
+@Composable
+fun ArgumentPage(stringParam: String, intParam: Int) {
+    RegularScaffold(title = TITLE) {
+        Preference(object : PreferenceModel {
+            override val title = "String param value"
+            override val summary = { stringParam }
+        })
+
+        Preference(object : PreferenceModel {
+            override val title = "Int param value"
+            override val summary = { intParam.toString() }
+        })
+
+        ArgumentPageProvider.EntryItem(stringParam = "foo", intParam = intParam + 1)
+
+        ArgumentPageProvider.EntryItem(stringParam = "bar", intParam = intParam + 1)
     }
 }
 
 @Preview(showBackground = true)
 @Composable
 private fun ArgumentPagePreview() {
-    SpaEnvironmentFactory.resetForPreview()
     SettingsTheme {
-        ArgumentPageProvider.Page(
-            ArgumentPageModel.buildArgument(stringParam = "foo", intParam = 0)
-        )
+        ArgumentPage(stringParam = "foo", intParam = 0)
     }
 }
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPageModel.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPageModel.kt
deleted file mode 100644
index d763f77..0000000
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPageModel.kt
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2023 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.settingslib.spa.gallery.page
-
-import android.os.Bundle
-import androidx.compose.runtime.Composable
-import androidx.lifecycle.viewmodel.compose.viewModel
-import androidx.navigation.NavType
-import androidx.navigation.navArgument
-import com.android.settingslib.spa.framework.common.EntrySearchData
-import com.android.settingslib.spa.framework.common.PageModel
-import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
-import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.util.getIntArg
-import com.android.settingslib.spa.framework.util.getStringArg
-import com.android.settingslib.spa.framework.util.navLink
-import com.android.settingslib.spa.gallery.SettingsPageProviderEnum
-import com.android.settingslib.spa.widget.preference.PreferenceModel
-
-private const val TAG = "ArgumentPageModel"
-
-// Defines all the resources for this page.
-// In real Settings App, resources data is defined in xml, rather than SPP.
-private const val PAGE_TITLE = "Sample page with arguments"
-private const val STRING_PARAM_TITLE = "String param value"
-private const val INT_PARAM_TITLE = "Int param value"
-private const val STRING_PARAM_NAME = "stringParam"
-private const val INT_PARAM_NAME = "rt_intParam"
-private val ARGUMENT_PAGE_KEYWORDS = listOf("argument keyword1", "argument keyword2")
-
-class ArgumentPageModel : PageModel() {
-
-    companion object {
-        val parameter = listOf(
-            navArgument(STRING_PARAM_NAME) { type = NavType.StringType },
-            navArgument(INT_PARAM_NAME) { type = NavType.IntType },
-        )
-
-        fun buildArgument(stringParam: String? = null, intParam: Int? = null): Bundle {
-            val args = Bundle()
-            if (stringParam != null) args.putString(STRING_PARAM_NAME, stringParam)
-            if (intParam != null) args.putInt(INT_PARAM_NAME, intParam)
-            return args
-        }
-
-        fun buildNextArgument(arguments: Bundle? = null): Bundle {
-            val intParam = parameter.getIntArg(INT_PARAM_NAME, arguments)
-            val nextIntParam = if (intParam != null) intParam + 1 else null
-            return buildArgument(intParam = nextIntParam)
-        }
-
-        fun isValidArgument(arguments: Bundle?): Boolean {
-            val stringParam = parameter.getStringArg(STRING_PARAM_NAME, arguments)
-            return (stringParam != null && listOf("foo", "bar").contains(stringParam))
-        }
-
-        fun genStringParamSearchData(): EntrySearchData {
-            return EntrySearchData(title = STRING_PARAM_TITLE)
-        }
-
-        fun genIntParamSearchData(): EntrySearchData {
-            return EntrySearchData(title = INT_PARAM_TITLE)
-        }
-
-        fun genInjectSearchData(): EntrySearchData {
-            return EntrySearchData(title = PAGE_TITLE, keyword = ARGUMENT_PAGE_KEYWORDS)
-        }
-
-        fun genPageTitle(): String {
-            return PAGE_TITLE
-        }
-
-        @Composable
-        fun create(arguments: Bundle?): ArgumentPageModel {
-            val pageModel: ArgumentPageModel = viewModel(key = arguments.toString())
-            pageModel.initOnce(arguments)
-            return pageModel
-        }
-    }
-
-    private var arguments: Bundle? = null
-    private var stringParam: String? = null
-    private var intParam: Int? = null
-
-    override fun initialize(arguments: Bundle?) {
-        SpaEnvironmentFactory.instance.logger.message(
-            TAG, "Initialize with args " + arguments.toString()
-        )
-        this.arguments = arguments
-        stringParam = parameter.getStringArg(STRING_PARAM_NAME, arguments)
-        intParam = parameter.getIntArg(INT_PARAM_NAME, arguments)
-    }
-
-    @Composable
-    fun genStringParamPreferenceModel(): PreferenceModel {
-        return object : PreferenceModel {
-            override val title = STRING_PARAM_TITLE
-            override val summary = { stringParam!! }
-        }
-    }
-
-    @Composable
-    fun genIntParamPreferenceModel(): PreferenceModel {
-        return object : PreferenceModel {
-            override val title = INT_PARAM_TITLE
-            override val summary = { intParam!!.toString() }
-        }
-    }
-
-    @Composable
-    fun genInjectPreferenceModel(): PreferenceModel {
-        val summaryArray = listOf(
-            "$STRING_PARAM_NAME=" + stringParam!!,
-            "$INT_PARAM_NAME=" + intParam!!
-        )
-        return object : PreferenceModel {
-            override val title = PAGE_TITLE
-            override val summary = { summaryArray.joinToString(", ") }
-            override val onClick = navigator(
-                SettingsPageProviderEnum.ARGUMENT.name + parameter.navLink(arguments)
-            )
-        }
-    }
-}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/FooterPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/FooterPageProvider.kt
index 345b47a..d31dab3 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/FooterPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/FooterPageProvider.kt
@@ -43,7 +43,7 @@
     override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
         val entryList = mutableListOf<SettingsEntry>()
         entryList.add(
-            SettingsEntryBuilder.create( "Some Preference", owner)
+            SettingsEntryBuilder.create("Some Preference", owner)
                 .setSearchDataFn { EntrySearchData(title = "Some Preference") }
                 .setUiLayoutFn {
                     Preference(remember {
@@ -58,14 +58,12 @@
         return entryList
     }
 
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner)
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 
     override fun getTitle(arguments: Bundle?): String {
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPage.kt
deleted file mode 100644
index ee22b96..0000000
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPage.kt
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2022 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.settingslib.spa.gallery.page
-
-import android.os.Bundle
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.tooling.preview.Preview
-import com.android.settingslib.spa.framework.common.SettingsEntry
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
-import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
-import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.theme.SettingsTheme
-import com.android.settingslib.spa.gallery.R
-import com.android.settingslib.spa.widget.illustration.Illustration
-import com.android.settingslib.spa.widget.illustration.IllustrationModel
-import com.android.settingslib.spa.widget.illustration.ResourceType
-import com.android.settingslib.spa.widget.preference.Preference
-import com.android.settingslib.spa.widget.preference.PreferenceModel
-
-private const val TITLE = "Sample Illustration"
-
-object IllustrationPageProvider : SettingsPageProvider {
-    override val name = "Illustration"
-    private val owner = createSettingsPage()
-
-    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
-        val entryList = mutableListOf<SettingsEntry>()
-        entryList.add(
-            SettingsEntryBuilder.create( "Lottie Illustration", owner)
-                .setUiLayoutFn {
-                    Preference(object : PreferenceModel {
-                        override val title = "Lottie Illustration"
-                    })
-
-                    Illustration(object : IllustrationModel {
-                        override val resId = R.raw.accessibility_shortcut_type_triple_tap
-                        override val resourceType = ResourceType.LOTTIE
-                    })
-                }.build()
-        )
-        entryList.add(
-            SettingsEntryBuilder.create( "Image Illustration", owner)
-                .setUiLayoutFn {
-                    Preference(object : PreferenceModel {
-                        override val title = "Image Illustration"
-                    })
-
-                    Illustration(object : IllustrationModel {
-                        override val resId = R.drawable.accessibility_captioning_banner
-                        override val resourceType = ResourceType.IMAGE
-                    })
-                }.build()
-        )
-
-        return entryList
-    }
-
-     fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner)
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
-    }
-
-    override fun getTitle(arguments: Bundle?): String {
-        return TITLE
-    }
-}
-
-@Preview(showBackground = true)
-@Composable
-private fun IllustrationPagePreview() {
-    SettingsTheme {
-        IllustrationPageProvider.Page(null)
-    }
-}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPageProvider.kt
new file mode 100644
index 0000000..021e84f
--- /dev/null
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPageProvider.kt
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2022 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.settingslib.spa.gallery.page
+
+import android.os.Bundle
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.tooling.preview.Preview
+import com.android.settingslib.spa.framework.common.SettingsEntry
+import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
+import com.android.settingslib.spa.framework.common.SettingsPageProvider
+import com.android.settingslib.spa.framework.common.createSettingsPage
+import com.android.settingslib.spa.framework.compose.navigator
+import com.android.settingslib.spa.framework.theme.SettingsTheme
+import com.android.settingslib.spa.gallery.R
+import com.android.settingslib.spa.widget.illustration.Illustration
+import com.android.settingslib.spa.widget.illustration.IllustrationModel
+import com.android.settingslib.spa.widget.illustration.ResourceType
+import com.android.settingslib.spa.widget.preference.Preference
+import com.android.settingslib.spa.widget.preference.PreferenceModel
+
+private const val TITLE = "Sample Illustration"
+
+object IllustrationPageProvider : SettingsPageProvider {
+    override val name = "Illustration"
+    private val owner = createSettingsPage()
+
+    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
+        val entryList = mutableListOf<SettingsEntry>()
+        entryList.add(
+            SettingsEntryBuilder.create("Lottie Illustration", owner)
+                .setUiLayoutFn {
+                    Preference(object : PreferenceModel {
+                        override val title = "Lottie Illustration"
+                    })
+
+                    Illustration(object : IllustrationModel {
+                        override val resId = R.raw.accessibility_shortcut_type_triple_tap
+                        override val resourceType = ResourceType.LOTTIE
+                    })
+                }.build()
+        )
+        entryList.add(
+            SettingsEntryBuilder.create("Image Illustration", owner)
+                .setUiLayoutFn {
+                    Preference(object : PreferenceModel {
+                        override val title = "Image Illustration"
+                    })
+
+                    Illustration(object : IllustrationModel {
+                        override val resId = R.drawable.accessibility_captioning_banner
+                        override val resourceType = ResourceType.IMAGE
+                    })
+                }.build()
+        )
+
+        return entryList
+    }
+
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
+    }
+
+    override fun getTitle(arguments: Bundle?): String {
+        return TITLE
+    }
+}
+
+@Preview(showBackground = true)
+@Composable
+private fun IllustrationPagePreview() {
+    SettingsTheme {
+        IllustrationPageProvider.Page(null)
+    }
+}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/LoadingBarPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/LoadingBarPageProvider.kt
index f1cbc37..4d47481 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/LoadingBarPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/LoadingBarPageProvider.kt
@@ -30,9 +30,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.compose.navigator
 import com.android.settingslib.spa.framework.theme.SettingsDimension
 import com.android.settingslib.spa.framework.theme.SettingsTheme
@@ -47,14 +45,12 @@
 object LoadingBarPageProvider : SettingsPageProvider {
     override val name = "LoadingBar"
 
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner = createSettingsPage())
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 
     override fun getTitle(arguments: Bundle?): String {
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ProgressBarPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ProgressBarPage.kt
deleted file mode 100644
index 9026a24..0000000
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ProgressBarPage.kt
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2022 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.settingslib.spa.gallery.page
-
-import android.os.Bundle
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.outlined.Delete
-import androidx.compose.material.icons.outlined.SystemUpdate
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.tooling.preview.Preview
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
-import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
-import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.theme.SettingsTheme
-import com.android.settingslib.spa.widget.preference.Preference
-import com.android.settingslib.spa.widget.preference.PreferenceModel
-import com.android.settingslib.spa.widget.preference.ProgressBarPreference
-import com.android.settingslib.spa.widget.preference.ProgressBarPreferenceModel
-import com.android.settingslib.spa.widget.preference.ProgressBarWithDataPreference
-import com.android.settingslib.spa.widget.scaffold.RegularScaffold
-import com.android.settingslib.spa.widget.ui.CircularProgressBar
-import kotlinx.coroutines.delay
-
-private const val TITLE = "Sample ProgressBar"
-
-object ProgressBarPageProvider : SettingsPageProvider {
-    override val name = "ProgressBar"
-
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner = createSettingsPage())
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
-    }
-
-    override fun getTitle(arguments: Bundle?): String {
-        return TITLE
-    }
-
-    @Composable
-    override fun Page(arguments: Bundle?) {
-        RegularScaffold(title = getTitle(arguments)) {
-            // Auto update the progress and finally jump tp 0.4f.
-            var progress by remember { mutableStateOf(0f) }
-            LaunchedEffect(Unit) {
-                while (progress < 1f) {
-                    delay(100)
-                    progress += 0.01f
-                }
-                delay(500)
-                progress = 0.4f
-            }
-
-            LargeProgressBar(progress)
-            SimpleProgressBar()
-            ProgressBarWithData()
-            CircularProgressBar(progress = progress, radius = 160f)
-        }
-    }
-}
-
-@Composable
-private fun LargeProgressBar(progress: Float) {
-    ProgressBarPreference(object : ProgressBarPreferenceModel {
-        override val title = "Large Progress Bar"
-        override val progress = progress
-        override val height = 20f
-    })
-}
-
-@Composable
-private fun SimpleProgressBar() {
-    ProgressBarPreference(object : ProgressBarPreferenceModel {
-        override val title = "Simple Progress Bar"
-        override val progress = 0.2f
-        override val icon = Icons.Outlined.SystemUpdate
-    })
-}
-
-@Composable
-private fun ProgressBarWithData() {
-    ProgressBarWithDataPreference(model = object : ProgressBarPreferenceModel {
-        override val title = "Progress Bar with Data"
-        override val progress = 0.2f
-        override val icon = Icons.Outlined.Delete
-    }, data = "25G")
-}
-
-@Preview(showBackground = true)
-@Composable
-private fun ProgressBarPagePreview() {
-    SettingsTheme {
-        ProgressBarPageProvider.Page(null)
-    }
-}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ProgressBarPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ProgressBarPageProvider.kt
new file mode 100644
index 0000000..47c49fe
--- /dev/null
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ProgressBarPageProvider.kt
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2022 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.settingslib.spa.gallery.page
+
+import android.os.Bundle
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.outlined.Delete
+import androidx.compose.material.icons.outlined.SystemUpdate
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.tooling.preview.Preview
+import com.android.settingslib.spa.framework.common.SettingsPageProvider
+import com.android.settingslib.spa.framework.compose.navigator
+import com.android.settingslib.spa.framework.theme.SettingsTheme
+import com.android.settingslib.spa.widget.preference.Preference
+import com.android.settingslib.spa.widget.preference.PreferenceModel
+import com.android.settingslib.spa.widget.preference.ProgressBarPreference
+import com.android.settingslib.spa.widget.preference.ProgressBarPreferenceModel
+import com.android.settingslib.spa.widget.preference.ProgressBarWithDataPreference
+import com.android.settingslib.spa.widget.scaffold.RegularScaffold
+import com.android.settingslib.spa.widget.ui.CircularProgressBar
+import kotlinx.coroutines.delay
+
+private const val TITLE = "Sample ProgressBar"
+
+object ProgressBarPageProvider : SettingsPageProvider {
+    override val name = "ProgressBar"
+
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
+    }
+
+    override fun getTitle(arguments: Bundle?): String {
+        return TITLE
+    }
+
+    @Composable
+    override fun Page(arguments: Bundle?) {
+        RegularScaffold(title = getTitle(arguments)) {
+            // Auto update the progress and finally jump tp 0.4f.
+            var progress by remember { mutableStateOf(0f) }
+            LaunchedEffect(Unit) {
+                while (progress < 1f) {
+                    delay(100)
+                    progress += 0.01f
+                }
+                delay(500)
+                progress = 0.4f
+            }
+
+            LargeProgressBar(progress)
+            SimpleProgressBar()
+            ProgressBarWithData()
+            CircularProgressBar(progress = progress, radius = 160f)
+        }
+    }
+}
+
+@Composable
+private fun LargeProgressBar(progress: Float) {
+    ProgressBarPreference(object : ProgressBarPreferenceModel {
+        override val title = "Large Progress Bar"
+        override val progress = progress
+        override val height = 20f
+    })
+}
+
+@Composable
+private fun SimpleProgressBar() {
+    ProgressBarPreference(object : ProgressBarPreferenceModel {
+        override val title = "Simple Progress Bar"
+        override val progress = 0.2f
+        override val icon = Icons.Outlined.SystemUpdate
+    })
+}
+
+@Composable
+private fun ProgressBarWithData() {
+    ProgressBarWithDataPreference(model = object : ProgressBarPreferenceModel {
+        override val title = "Progress Bar with Data"
+        override val progress = 0.2f
+        override val icon = Icons.Outlined.Delete
+    }, data = "25G")
+}
+
+@Preview(showBackground = true)
+@Composable
+private fun ProgressBarPagePreview() {
+    SettingsTheme {
+        ProgressBarPageProvider.Page(null)
+    }
+}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPageProvider.kt
index 89b10ee..572746b 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPageProvider.kt
@@ -117,15 +117,14 @@
         return entryList
     }
 
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner).setUiLayoutFn {
-            Preference(
-                object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                }
-            )
-        }
+    @Composable
+    fun Entry() {
+        Preference(
+            object : PreferenceModel {
+                override val title = TITLE
+                override val onClick = navigator(name)
+            }
+        )
     }
 
     override fun getTitle(arguments: Bundle?): String {
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/IntroPreferencePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/IntroPreferencePageProvider.kt
index 603fcee..b83a026 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/IntroPreferencePageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/IntroPreferencePageProvider.kt
@@ -50,15 +50,12 @@
         return entryList
     }
 
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner).setUiLayoutFn {
-            Preference(
-                object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                }
-            )
-        }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 
     override fun getTitle(arguments: Bundle?): String {
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/ListPreferencePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/ListPreferencePageProvider.kt
index d7de9b4..3bb526e 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/ListPreferencePageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/ListPreferencePageProvider.kt
@@ -23,9 +23,7 @@
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.compose.navigator
 import com.android.settingslib.spa.framework.theme.SettingsTheme
 import com.android.settingslib.spa.widget.preference.ListPreference
@@ -33,6 +31,8 @@
 import com.android.settingslib.spa.widget.preference.ListPreferenceOption
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
+import com.android.settingslib.spa.widget.scaffold.RegularScaffold
+import com.android.settingslib.spa.widget.ui.Category
 import kotlin.time.Duration.Companion.seconds
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.flow
@@ -41,30 +41,24 @@
 
 object ListPreferencePageProvider : SettingsPageProvider {
     override val name = "ListPreference"
-    private val owner = createSettingsPage()
 
-    override fun buildEntry(arguments: Bundle?) = listOf(
-        SettingsEntryBuilder.create("ListPreference", owner)
-            .setUiLayoutFn {
+    @Composable
+    override fun Page(arguments: Bundle?) {
+        RegularScaffold(TITLE) {
+            Category {
                 SampleListPreference()
-            }.build(),
-        SettingsEntryBuilder.create("ListPreference not changeable", owner)
-            .setUiLayoutFn {
                 SampleNotChangeableListPreference()
-            }.build(),
-    )
-
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner)
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
             }
+        }
     }
 
-    override fun getTitle(arguments: Bundle?) = TITLE
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
+    }
 }
 
 @Composable
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePage.kt
deleted file mode 100644
index 0d85c0e3..0000000
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePage.kt
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2023 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.settingslib.spa.gallery.preference
-
-import android.os.Bundle
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.saveable.rememberSaveable
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.tooling.preview.Preview
-import com.android.settingslib.spa.framework.common.SettingsEntry
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
-import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
-import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.theme.SettingsTheme
-import com.android.settingslib.spa.widget.preference.MainSwitchPreference
-import com.android.settingslib.spa.widget.preference.Preference
-import com.android.settingslib.spa.widget.preference.PreferenceModel
-import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
-
-private const val TITLE = "Sample MainSwitchPreference"
-
-object MainSwitchPreferencePageProvider : SettingsPageProvider {
-    override val name = "MainSwitchPreference"
-    private val owner = createSettingsPage()
-
-    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
-        val entryList = mutableListOf<SettingsEntry>()
-        entryList.add(
-            SettingsEntryBuilder.create("MainSwitchPreference", owner)
-                .setUiLayoutFn {
-                    SampleMainSwitchPreference()
-                }.build()
-        )
-        entryList.add(
-            SettingsEntryBuilder.create("MainSwitchPreference not changeable", owner)
-                .setUiLayoutFn {
-                    SampleNotChangeableMainSwitchPreference()
-                }.build()
-        )
-
-        return entryList
-    }
-
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner)
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
-    }
-
-    override fun getTitle(arguments: Bundle?): String {
-        return TITLE
-    }
-}
-
-@Composable
-private fun SampleMainSwitchPreference() {
-    var checked by rememberSaveable { mutableStateOf(false) }
-    MainSwitchPreference(remember {
-        object : SwitchPreferenceModel {
-            override val title = "MainSwitchPreference"
-            override val checked = { checked }
-            override val onCheckedChange = { newChecked: Boolean -> checked = newChecked }
-        }
-    })
-}
-
-@Composable
-private fun SampleNotChangeableMainSwitchPreference() {
-    var checked by rememberSaveable { mutableStateOf(true) }
-    MainSwitchPreference(remember {
-        object : SwitchPreferenceModel {
-            override val title = "Not changeable"
-            override val changeable = { false }
-            override val checked = { checked }
-            override val onCheckedChange = { newChecked: Boolean -> checked = newChecked }
-        }
-    })
-}
-
-@Preview(showBackground = true)
-@Composable
-private fun MainSwitchPreferencePagePreview() {
-    SettingsTheme {
-        MainSwitchPreferencePageProvider.Page(null)
-    }
-}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePageProvider.kt
new file mode 100644
index 0000000..f548160
--- /dev/null
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePageProvider.kt
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2023 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.settingslib.spa.gallery.preference
+
+import android.os.Bundle
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.tooling.preview.Preview
+import com.android.settingslib.spa.framework.common.SettingsEntry
+import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
+import com.android.settingslib.spa.framework.common.SettingsPageProvider
+import com.android.settingslib.spa.framework.common.createSettingsPage
+import com.android.settingslib.spa.framework.compose.navigator
+import com.android.settingslib.spa.framework.theme.SettingsTheme
+import com.android.settingslib.spa.widget.preference.MainSwitchPreference
+import com.android.settingslib.spa.widget.preference.Preference
+import com.android.settingslib.spa.widget.preference.PreferenceModel
+import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
+
+private const val TITLE = "Sample MainSwitchPreference"
+
+object MainSwitchPreferencePageProvider : SettingsPageProvider {
+    override val name = "MainSwitchPreference"
+    private val owner = createSettingsPage()
+
+    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
+        val entryList = mutableListOf<SettingsEntry>()
+        entryList.add(
+            SettingsEntryBuilder.create("MainSwitchPreference", owner)
+                .setUiLayoutFn {
+                    SampleMainSwitchPreference()
+                }.build()
+        )
+        entryList.add(
+            SettingsEntryBuilder.create("MainSwitchPreference not changeable", owner)
+                .setUiLayoutFn {
+                    SampleNotChangeableMainSwitchPreference()
+                }.build()
+        )
+
+        return entryList
+    }
+
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
+    }
+
+    override fun getTitle(arguments: Bundle?): String {
+        return TITLE
+    }
+}
+
+@Composable
+private fun SampleMainSwitchPreference() {
+    var checked by rememberSaveable { mutableStateOf(false) }
+    MainSwitchPreference(remember {
+        object : SwitchPreferenceModel {
+            override val title = "MainSwitchPreference"
+            override val checked = { checked }
+            override val onCheckedChange = { newChecked: Boolean -> checked = newChecked }
+        }
+    })
+}
+
+@Composable
+private fun SampleNotChangeableMainSwitchPreference() {
+    var checked by rememberSaveable { mutableStateOf(true) }
+    MainSwitchPreference(remember {
+        object : SwitchPreferenceModel {
+            override val title = "Not changeable"
+            override val changeable = { false }
+            override val checked = { checked }
+            override val onCheckedChange = { newChecked: Boolean -> checked = newChecked }
+        }
+    })
+}
+
+@Preview(showBackground = true)
+@Composable
+private fun MainSwitchPreferencePagePreview() {
+    SettingsTheme {
+        MainSwitchPreferencePageProvider.Page(null)
+    }
+}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferenceMainPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferenceMainPageProvider.kt
index 1626b02..831b439 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferenceMainPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferenceMainPageProvider.kt
@@ -17,45 +17,44 @@
 package com.android.settingslib.spa.gallery.preference
 
 import android.os.Bundle
-import com.android.settingslib.spa.framework.common.SettingsEntry
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
+import androidx.compose.runtime.Composable
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.compose.navigator
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
+import com.android.settingslib.spa.widget.scaffold.RegularScaffold
+import com.android.settingslib.spa.widget.ui.Category
 
 private const val TITLE = "Category: Preference"
 
 object PreferenceMainPageProvider : SettingsPageProvider {
     override val name = "PreferenceMain"
-    private val owner = createSettingsPage()
 
-    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
-        return listOf(
-            PreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            SwitchPreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            MainSwitchPreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            ListPreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            TwoTargetSwitchPreferencePageProvider.buildInjectEntry()
-                .setLink(fromPage = owner).build(),
-            ZeroStatePreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            IntroPreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-            TopIntroPreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
-        )
-    }
-
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner = owner)
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
+    @Composable
+    override fun Page(arguments: Bundle?) {
+        RegularScaffold(TITLE) {
+            Category {
+                PreferencePageProvider.Entry()
+                ListPreferencePageProvider.Entry()
             }
+            Category {
+                SwitchPreferencePageProvider.Entry()
+                MainSwitchPreferencePageProvider.Entry()
+                TwoTargetSwitchPreferencePageProvider.Entry()
+            }
+            Category {
+                ZeroStatePreferencePageProvider.Entry()
+                IntroPreferencePageProvider.Entry()
+                TopIntroPreferencePageProvider.Entry()
+            }
+        }
     }
 
-    override fun getTitle(arguments: Bundle?): String {
-        return TITLE
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 }
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageModel.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageModel.kt
deleted file mode 100644
index fc6f10f..0000000
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageModel.kt
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2022 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.settingslib.spa.gallery.preference
-
-import android.os.Bundle
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.State
-import androidx.compose.runtime.derivedStateOf
-import androidx.compose.runtime.mutableStateOf
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.viewModelScope
-import androidx.lifecycle.viewmodel.compose.viewModel
-import com.android.settingslib.spa.framework.common.PageModel
-import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.launch
-
-private const val TAG = "PreferencePageModel"
-
-class PreferencePageModel : PageModel() {
-    companion object {
-        // Defines all the resources for this page.
-        // In real Settings App, resources data is defined in xml, rather than SPP.
-        const val PAGE_TITLE = "Sample Preference"
-        const val SIMPLE_PREFERENCE_TITLE = "Preference"
-        const val SIMPLE_PREFERENCE_SUMMARY = "Simple summary"
-        const val DISABLE_PREFERENCE_TITLE = "Disabled"
-        const val DISABLE_PREFERENCE_SUMMARY = "Disabled summary"
-        const val ASYNC_PREFERENCE_TITLE = "Async Preference"
-        const val ASYNC_PREFERENCE_SUMMARY = "Async summary"
-        const val MANUAL_UPDATE_PREFERENCE_TITLE = "Manual Updater"
-        const val AUTO_UPDATE_PREFERENCE_TITLE = "Auto Updater"
-        val SIMPLE_PREFERENCE_KEYWORDS = listOf("simple keyword1", "simple keyword2")
-
-        @Composable
-        fun create(): PreferencePageModel {
-            val pageModel: PreferencePageModel = viewModel()
-            pageModel.initOnce()
-            return pageModel
-        }
-    }
-
-    private val spaLogger = SpaEnvironmentFactory.instance.logger
-
-    val asyncSummary = mutableStateOf("(loading)")
-    val asyncEnable = mutableStateOf(false)
-
-    private val manualUpdater = mutableStateOf(0)
-
-    private val autoUpdater = object : MutableLiveData<String>(" ") {
-        private var tick = 0
-        private var updateJob: Job? = null
-        override fun onActive() {
-            spaLogger.message(TAG, "autoUpdater.active")
-            updateJob = viewModelScope.launch(Dispatchers.IO) {
-                while (true) {
-                    delay(1000L)
-                    tick++
-                    spaLogger.message(TAG, "autoUpdater.value $tick")
-                    postValue(tick.toString())
-                }
-            }
-        }
-
-        override fun onInactive() {
-            spaLogger.message(TAG, "autoUpdater.inactive")
-            updateJob?.cancel()
-        }
-    }
-
-    override fun initialize(arguments: Bundle?) {
-        spaLogger.message(TAG, "initialize with args " + arguments.toString())
-        viewModelScope.launch(Dispatchers.IO) {
-            // Loading your data here.
-            delay(2000L)
-            asyncSummary.value = ASYNC_PREFERENCE_SUMMARY
-            asyncEnable.value = true
-        }
-    }
-
-    fun getManualUpdaterSummary(): State<String> {
-        spaLogger.message(TAG, "getManualUpdaterSummary")
-        return derivedStateOf { manualUpdater.value.toString() }
-    }
-
-    fun manualUpdaterOnClick() {
-        spaLogger.message(TAG, "manualUpdaterOnClick")
-        manualUpdater.value = manualUpdater.value + 1
-    }
-
-    fun getAutoUpdaterSummary(): LiveData<String> {
-        spaLogger.message(TAG, "getAutoUpdaterSummary")
-        return autoUpdater
-    }
-}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt
index 6d1d346..f7649b9 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt
@@ -18,187 +18,100 @@
 
 import android.os.Bundle
 import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.outlined.Autorenew
 import androidx.compose.material.icons.outlined.DisabledByDefault
-import androidx.compose.material.icons.outlined.TouchApp
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.produceState
 import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.tooling.preview.Preview
-import com.android.settingslib.spa.framework.common.EntrySearchData
-import com.android.settingslib.spa.framework.common.EntryStatusData
-import com.android.settingslib.spa.framework.common.SettingsEntry
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
 import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
-import com.android.settingslib.spa.framework.common.createSettingsPage
+import com.android.settingslib.spa.framework.compose.navigator
 import com.android.settingslib.spa.framework.theme.SettingsTheme
 import com.android.settingslib.spa.gallery.R
-import com.android.settingslib.spa.gallery.SettingsPageProviderEnum
-import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.ASYNC_PREFERENCE_TITLE
-import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.AUTO_UPDATE_PREFERENCE_TITLE
-import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.DISABLE_PREFERENCE_SUMMARY
-import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.DISABLE_PREFERENCE_TITLE
-import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.MANUAL_UPDATE_PREFERENCE_TITLE
-import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.PAGE_TITLE
-import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.SIMPLE_PREFERENCE_KEYWORDS
-import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.SIMPLE_PREFERENCE_SUMMARY
-import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.SIMPLE_PREFERENCE_TITLE
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
-import com.android.settingslib.spa.widget.preference.SimplePreferenceMacro
+import com.android.settingslib.spa.widget.scaffold.RegularScaffold
+import com.android.settingslib.spa.widget.ui.Category
 import com.android.settingslib.spa.widget.ui.SettingsIcon
-
-private const val TAG = "PreferencePage"
+import kotlinx.coroutines.delay
 
 object PreferencePageProvider : SettingsPageProvider {
-    // Defines all entry name in this page.
-    // Note that entry name would be used in log. DO NOT change it once it is set.
-    // One can still change the display name for better readability if necessary.
-    enum class EntryEnum(val displayName: String) {
-        SIMPLE_PREFERENCE("preference"),
-        SUMMARY_PREFERENCE("preference_with_summary"),
-        SINGLE_LINE_SUMMARY_PREFERENCE("preference_with_single_line_summary"),
-        DISABLED_PREFERENCE("preference_disable"),
-        ASYNC_SUMMARY_PREFERENCE("preference_with_async_summary"),
-        MANUAL_UPDATE_PREFERENCE("preference_actionable"),
-        AUTO_UPDATE_PREFERENCE("preference_auto_update"),
-    }
 
-    override val name = SettingsPageProviderEnum.PREFERENCE.name
-    override val displayName = SettingsPageProviderEnum.PREFERENCE.displayName
-    private val spaLogger = SpaEnvironmentFactory.instance.logger
-    private val owner = createSettingsPage()
+    override val name = "Preference"
+    private const val PAGE_TITLE = "Sample Preference"
 
-    private fun createEntry(entry: EntryEnum): SettingsEntryBuilder {
-        return SettingsEntryBuilder.create(owner, entry.name, entry.displayName)
-    }
-
-    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
-        val entryList = mutableListOf<SettingsEntry>()
-        entryList.add(
-            createEntry(EntryEnum.SIMPLE_PREFERENCE)
-                .setMacro {
-                    spaLogger.message(TAG, "create macro for ${EntryEnum.SIMPLE_PREFERENCE}")
-                    SimplePreferenceMacro(title = SIMPLE_PREFERENCE_TITLE)
-                }
-                .setStatusDataFn { EntryStatusData(isDisabled = false) }
-                .build()
-        )
-        entryList.add(
-            createEntry(EntryEnum.SUMMARY_PREFERENCE)
-                .setMacro {
-                    spaLogger.message(TAG, "create macro for ${EntryEnum.SUMMARY_PREFERENCE}")
-                    SimplePreferenceMacro(
-                        title = SIMPLE_PREFERENCE_TITLE,
-                        summary = SIMPLE_PREFERENCE_SUMMARY,
-                        searchKeywords = SIMPLE_PREFERENCE_KEYWORDS,
-                    )
-                }
-                .setStatusDataFn { EntryStatusData(isDisabled = true) }
-                .build()
-        )
-        entryList.add(singleLineSummaryEntry())
-        entryList.add(
-            createEntry(EntryEnum.DISABLED_PREFERENCE)
-                .setHasMutableStatus(true)
-                .setMacro {
-                    spaLogger.message(TAG, "create macro for ${EntryEnum.DISABLED_PREFERENCE}")
-                    SimplePreferenceMacro(
-                        title = DISABLE_PREFERENCE_TITLE,
-                        summary = DISABLE_PREFERENCE_SUMMARY,
-                        disabled = true,
-                        icon = Icons.Outlined.DisabledByDefault,
-                    )
-                }
-                .setStatusDataFn { EntryStatusData(isDisabled = true) }
-                .build()
-        )
-        entryList.add(
-            createEntry(EntryEnum.ASYNC_SUMMARY_PREFERENCE)
-                .setHasMutableStatus(true)
-                .setSearchDataFn {
-                    EntrySearchData(title = ASYNC_PREFERENCE_TITLE)
-                }
-                .setStatusDataFn { EntryStatusData(isDisabled = false) }
-                .setUiLayoutFn {
-                    val model = PreferencePageModel.create()
-                    Preference(
-                        object : PreferenceModel {
-                            override val title = ASYNC_PREFERENCE_TITLE
-                            override val summary = { model.asyncSummary.value }
-                            override val enabled = { model.asyncEnable.value }
-                        }
-                    )
-                }.build()
-        )
-        entryList.add(
-            createEntry(EntryEnum.MANUAL_UPDATE_PREFERENCE)
-                .setUiLayoutFn {
-                    val model = PreferencePageModel.create()
-                    val manualUpdaterSummary = remember { model.getManualUpdaterSummary() }
-                    Preference(
-                        object : PreferenceModel {
-                            override val title = MANUAL_UPDATE_PREFERENCE_TITLE
-                            override val summary = { manualUpdaterSummary.value }
-                            override val onClick = { model.manualUpdaterOnClick() }
-                            override val icon = @Composable {
-                                SettingsIcon(imageVector = Icons.Outlined.TouchApp)
-                            }
-                        }
-                    )
-                }.build()
-        )
-        entryList.add(
-            createEntry(EntryEnum.AUTO_UPDATE_PREFERENCE)
-                .setUiLayoutFn {
-                    val model = PreferencePageModel.create()
-                    val autoUpdaterSummary = remember {
-                        model.getAutoUpdaterSummary()
-                    }.observeAsState(" ")
-                    Preference(
-                        object : PreferenceModel {
-                            override val title = AUTO_UPDATE_PREFERENCE_TITLE
-                            override val summary = { autoUpdaterSummary.value }
-                            override val icon = @Composable {
-                                SettingsIcon(imageVector = Icons.Outlined.Autorenew)
-                            }
-                        }
-                    )
-                }.build()
-        )
-
-        return entryList
-    }
-
-    private fun singleLineSummaryEntry() = createEntry(EntryEnum.SINGLE_LINE_SUMMARY_PREFERENCE)
-        .setUiLayoutFn {
-            val summary = stringResource(R.string.single_line_summary_preference_summary)
-            Preference(
-                model = object : PreferenceModel {
-                    override val title: String =
-                        stringResource(R.string.single_line_summary_preference_title)
-                    override val summary = { summary }
-                },
-                singleLineSummary = true,
-            )
-        }
-        .build()
-
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner = owner)
-            .setMacro {
-                spaLogger.message(TAG, "create macro for INJECT entry")
-                SimplePreferenceMacro(
-                    title = PAGE_TITLE,
-                    clickRoute = SettingsPageProviderEnum.PREFERENCE.name
+    @Composable
+    override fun Page(arguments: Bundle?) {
+        RegularScaffold(PAGE_TITLE) {
+            Category {
+                Preference(object : PreferenceModel {
+                    override val title = "Preference"
+                })
+                Preference(object : PreferenceModel {
+                    override val title = "Preference"
+                    override val summary = { "Simple summary" }
+                })
+                val summary = stringResource(R.string.single_line_summary_preference_summary)
+                Preference(
+                    model = object : PreferenceModel {
+                        override val title =
+                            stringResource(R.string.single_line_summary_preference_title)
+                        override val summary = { summary }
+                    },
+                    singleLineSummary = true,
                 )
             }
+            Category {
+                Preference(object : PreferenceModel {
+                    override val title = "Disabled"
+                    override val summary = { "Disabled summary" }
+                    override val enabled = { false }
+                    override val icon = @Composable {
+                        SettingsIcon(imageVector = Icons.Outlined.DisabledByDefault)
+                    }
+                })
+            }
+            Category {
+                Preference(object : PreferenceModel {
+                    override val title = "Preference"
+                    val asyncSummary by produceState(initialValue = " ") {
+                        delay(1000L)
+                        value = "Async summary"
+                    }
+                    override val summary = { asyncSummary }
+                })
+
+                var count by remember { mutableIntStateOf(0) }
+                Preference(object : PreferenceModel {
+                    override val title = "Click me"
+                    override val summary = { count.toString() }
+                    override val onClick: (() -> Unit) = { count++ }
+                })
+
+                var ticks by remember { mutableIntStateOf(0) }
+                LaunchedEffect(ticks) {
+                    delay(1000L)
+                    ticks++
+                }
+                Preference(object : PreferenceModel {
+                    override val title = "Ticker"
+                    override val summary = { ticks.toString() }
+                })
+            }
+        }
     }
 
-    override fun getTitle(arguments: Bundle?): String {
-        return PAGE_TITLE
+    @Composable
+    fun Entry() {
+        Preference(model = object : PreferenceModel {
+            override val title = PAGE_TITLE
+            override val onClick = navigator(name)
+        })
     }
 }
 
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/SwitchPreferencePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/SwitchPreferencePageProvider.kt
index f2225fa..9508d50 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/SwitchPreferencePageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/SwitchPreferencePageProvider.kt
@@ -27,16 +27,15 @@
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.tooling.preview.Preview
-import com.android.settingslib.spa.framework.common.SettingsEntry
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.compose.navigator
 import com.android.settingslib.spa.framework.theme.SettingsTheme
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
 import com.android.settingslib.spa.widget.preference.SwitchPreference
 import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
+import com.android.settingslib.spa.widget.scaffold.RegularScaffold
+import com.android.settingslib.spa.widget.ui.Category
 import com.android.settingslib.spa.widget.ui.SettingsIcon
 import kotlinx.coroutines.delay
 
@@ -44,56 +43,26 @@
 
 object SwitchPreferencePageProvider : SettingsPageProvider {
     override val name = "SwitchPreference"
-    private val owner = createSettingsPage()
 
-    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
-        val entryList = mutableListOf<SettingsEntry>()
-        entryList.add(
-            SettingsEntryBuilder.create( "SwitchPreference", owner)
-                .setUiLayoutFn {
-                    SampleSwitchPreference()
-                }.build()
-        )
-        entryList.add(
-            SettingsEntryBuilder.create( "SwitchPreference with summary", owner)
-                .setUiLayoutFn {
-                    SampleSwitchPreferenceWithSummary()
-                }.build()
-        )
-        entryList.add(
-            SettingsEntryBuilder.create( "SwitchPreference with async summary", owner)
-                .setUiLayoutFn {
-                    SampleSwitchPreferenceWithAsyncSummary()
-                }.build()
-        )
-        entryList.add(
-            SettingsEntryBuilder.create( "SwitchPreference not changeable", owner)
-                .setUiLayoutFn {
-                    SampleNotChangeableSwitchPreference()
-                }.build()
-        )
-        entryList.add(
-            SettingsEntryBuilder.create( "SwitchPreference with icon", owner)
-                .setUiLayoutFn {
-                    SampleSwitchPreferenceWithIcon()
-                }.build()
-        )
-
-        return entryList
-    }
-
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner)
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
+    @Composable
+    override fun Page(arguments: Bundle?) {
+        RegularScaffold(TITLE) {
+            Category {
+                SampleSwitchPreference()
+                SampleSwitchPreferenceWithSummary()
+                SampleSwitchPreferenceWithAsyncSummary()
+                SampleNotChangeableSwitchPreference()
+                SampleSwitchPreferenceWithIcon()
             }
+        }
     }
 
-    override fun getTitle(arguments: Bundle?): String {
-        return TITLE
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 }
 
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TopIntroPreferencePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TopIntroPreferencePageProvider.kt
index b251266..ee08e30 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TopIntroPreferencePageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TopIntroPreferencePageProvider.kt
@@ -50,15 +50,12 @@
         return entryList
     }
 
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner).setUiLayoutFn {
-            Preference(
-                object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                }
-            )
-        }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 
     override fun getTitle(arguments: Bundle?): String {
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TwoTargetSwitchPreferencePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TwoTargetSwitchPreferencePageProvider.kt
index 19de31d..1a89bb2 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TwoTargetSwitchPreferencePageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TwoTargetSwitchPreferencePageProvider.kt
@@ -25,66 +25,40 @@
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.tooling.preview.Preview
-import com.android.settingslib.spa.framework.common.SettingsEntry
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.compose.navigator
 import com.android.settingslib.spa.framework.theme.SettingsTheme
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
 import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
 import com.android.settingslib.spa.widget.preference.TwoTargetSwitchPreference
+import com.android.settingslib.spa.widget.scaffold.RegularScaffold
+import com.android.settingslib.spa.widget.ui.Category
 import kotlinx.coroutines.delay
 
 private const val TITLE = "Sample TwoTargetSwitchPreference"
 
 object TwoTargetSwitchPreferencePageProvider : SettingsPageProvider {
     override val name = "TwoTargetSwitchPreference"
-    private val owner = createSettingsPage()
 
-    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
-        val entryList = mutableListOf<SettingsEntry>()
-        entryList.add(
-            SettingsEntryBuilder.create( "TwoTargetSwitchPreference", owner)
-                .setUiLayoutFn {
-                    SampleTwoTargetSwitchPreference()
-                }.build()
-        )
-        entryList.add(
-            SettingsEntryBuilder.create( "TwoTargetSwitchPreference with summary", owner)
-                .setUiLayoutFn {
-                    SampleTwoTargetSwitchPreferenceWithSummary()
-                }.build()
-        )
-        entryList.add(
-            SettingsEntryBuilder.create( "TwoTargetSwitchPreference with async summary", owner)
-                .setUiLayoutFn {
-                    SampleTwoTargetSwitchPreferenceWithAsyncSummary()
-                }.build()
-        )
-        entryList.add(
-            SettingsEntryBuilder.create( "TwoTargetSwitchPreference not changeable", owner)
-                .setUiLayoutFn {
-                    SampleNotChangeableTwoTargetSwitchPreference()
-                }.build()
-        )
-
-        return entryList
-    }
-
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner)
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
+    @Composable
+    override fun Page(arguments: Bundle?) {
+        RegularScaffold(TITLE) {
+            Category {
+                SampleTwoTargetSwitchPreference()
+                SampleTwoTargetSwitchPreferenceWithSummary()
+                SampleTwoTargetSwitchPreferenceWithAsyncSummary()
+                SampleNotChangeableTwoTargetSwitchPreference()
             }
+        }
     }
 
-    override fun getTitle(arguments: Bundle?): String {
-        return TITLE
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 }
 
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/ZeroStatePreferencePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/ZeroStatePreferencePageProvider.kt
index 4a9c5c8..04b5ceb 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/ZeroStatePreferencePageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/ZeroStatePreferencePageProvider.kt
@@ -53,14 +53,12 @@
         return entryList
     }
 
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner)
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 
     override fun getTitle(arguments: Bundle?): String {
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/PagerMainPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/PagerMainPageProvider.kt
index 66cc38f..c9a6557 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/PagerMainPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/PagerMainPageProvider.kt
@@ -17,7 +17,7 @@
 package com.android.settingslib.spa.gallery.scaffold
 
 import android.os.Bundle
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
+import androidx.compose.runtime.Composable
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
 import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.compose.navigator
@@ -34,13 +34,13 @@
         ScrollablePagerPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
     )
 
-    fun buildInjectEntry() = SettingsEntryBuilder.createInject(owner = owner)
-        .setUiLayoutFn {
-            Preference(object : PreferenceModel {
-                override val title = TITLE
-                override val onClick = navigator(name)
-            })
-        }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
+    }
 
     override fun getTitle(arguments: Bundle?) = TITLE
 }
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SearchScaffoldPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SearchScaffoldPageProvider.kt
index eac06e3..0d7cad10 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SearchScaffoldPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SearchScaffoldPageProvider.kt
@@ -18,9 +18,7 @@
 
 import android.os.Bundle
 import androidx.compose.runtime.Composable
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.compose.navigator
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
@@ -32,15 +30,13 @@
 object SearchScaffoldPageProvider : SettingsPageProvider {
     override val name = "SearchScaffold"
 
-    private val owner = createSettingsPage()
-
-    fun buildInjectEntry() = SettingsEntryBuilder.createInject(owner = owner)
-        .setUiLayoutFn {
-            Preference(object : PreferenceModel {
-                override val title = TITLE
-                override val onClick = navigator(name)
-            })
-        }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
+    }
 
     @Composable
     override fun Page(arguments: Bundle?) {
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SuwScaffoldPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SuwScaffoldPageProvider.kt
index a0ab2ce..7b02fcb 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SuwScaffoldPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SuwScaffoldPageProvider.kt
@@ -27,9 +27,7 @@
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.compose.navigator
 import com.android.settingslib.spa.framework.theme.SettingsDimension
 import com.android.settingslib.spa.gallery.R
@@ -49,15 +47,13 @@
 object SuwScaffoldPageProvider : SettingsPageProvider {
     override val name = "SuwScaffold"
 
-    private val owner = createSettingsPage()
-
-    fun buildInjectEntry() = SettingsEntryBuilder.createInject(owner = owner)
-        .setUiLayoutFn {
-            Preference(object : PreferenceModel {
-                override val title = TITLE
-                override val onClick = navigator(name)
-            })
-        }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
+    }
 
     @Composable
     override fun Page(arguments: Bundle?) {
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/CategoryPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/CategoryPage.kt
deleted file mode 100644
index 7a1fad0..0000000
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/CategoryPage.kt
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2022 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.settingslib.spa.gallery.ui
-
-import android.os.Bundle
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.tooling.preview.Preview
-import com.android.settingslib.spa.framework.common.EntrySearchData
-import com.android.settingslib.spa.framework.common.SettingsEntry
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
-import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
-import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.theme.SettingsTheme
-import com.android.settingslib.spa.widget.preference.Preference
-import com.android.settingslib.spa.widget.preference.PreferenceModel
-import com.android.settingslib.spa.widget.preference.SimplePreferenceMacro
-import com.android.settingslib.spa.widget.scaffold.RegularScaffold
-import com.android.settingslib.spa.widget.ui.Category
-import com.android.settingslib.spa.widget.ui.CategoryTitle
-
-private const val TITLE = "Sample Category"
-
-object CategoryPageProvider : SettingsPageProvider {
-    override val name = "Category"
-    private val owner = createSettingsPage()
-
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner)
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
-            .setSearchDataFn { EntrySearchData(title = TITLE) }
-    }
-
-    override fun getTitle(arguments: Bundle?): String {
-        return TITLE
-    }
-
-    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
-        val entryList = mutableListOf<SettingsEntry>()
-        entryList.add(
-            SettingsEntryBuilder.create("Preference 1", owner)
-                .setMacro { SimplePreferenceMacro(title = "Preference 1", summary = "Summary 1") }
-                .build()
-        )
-        entryList.add(
-            SettingsEntryBuilder.create("Preference 2", owner)
-                .setMacro { SimplePreferenceMacro(title = "Preference 2", summary = "Summary 2") }
-                .build()
-        )
-        entryList.add(
-            SettingsEntryBuilder.create("Preference 3", owner)
-                .setMacro { SimplePreferenceMacro(title = "Preference 2", summary = "Summary 3") }
-                .build()
-
-        )
-        entryList.add(
-            SettingsEntryBuilder.create("Preference 4", owner)
-                .setMacro { SimplePreferenceMacro(title = "Preference 4", summary = "Summary 4") }
-                .build()
-        )
-        return entryList
-    }
-
-    @Composable
-    override fun Page(arguments: Bundle?) {
-        val entries = buildEntry(arguments)
-        RegularScaffold(title = getTitle(arguments)) {
-            CategoryTitle("Category A")
-            entries[0].UiLayout()
-            entries[1].UiLayout()
-
-            Category("Category B") {
-                entries[2].UiLayout()
-                entries[3].UiLayout()
-            }
-        }
-    }
-}
-
-@Preview(showBackground = true)
-@Composable
-private fun SpinnerPagePreview() {
-    SettingsTheme {
-        SpinnerPageProvider.Page(null)
-    }
-}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/CategoryPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/CategoryPageProvider.kt
new file mode 100644
index 0000000..4d3a78a5
--- /dev/null
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/CategoryPageProvider.kt
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2022 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.settingslib.spa.gallery.ui
+
+import android.os.Bundle
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.tooling.preview.Preview
+import com.android.settingslib.spa.framework.common.SettingsEntry
+import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
+import com.android.settingslib.spa.framework.common.SettingsPageProvider
+import com.android.settingslib.spa.framework.common.createSettingsPage
+import com.android.settingslib.spa.framework.compose.navigator
+import com.android.settingslib.spa.framework.theme.SettingsTheme
+import com.android.settingslib.spa.widget.preference.Preference
+import com.android.settingslib.spa.widget.preference.PreferenceModel
+import com.android.settingslib.spa.widget.preference.SimplePreferenceMacro
+import com.android.settingslib.spa.widget.scaffold.RegularScaffold
+import com.android.settingslib.spa.widget.ui.Category
+
+private const val TITLE = "Sample Category"
+
+object CategoryPageProvider : SettingsPageProvider {
+    override val name = "Category"
+    private val owner = createSettingsPage()
+
+    @Composable
+    fun Entry() {
+        Preference(
+            object : PreferenceModel {
+                override val title = TITLE
+                override val onClick = navigator(name)
+            }
+        )
+    }
+
+    override fun getTitle(arguments: Bundle?): String {
+        return TITLE
+    }
+
+    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
+        val entryList = mutableListOf<SettingsEntry>()
+        entryList.add(
+            SettingsEntryBuilder.create("Preference 1", owner)
+                .setMacro { SimplePreferenceMacro(title = "Preference 1", summary = "Summary 1") }
+                .build()
+        )
+        entryList.add(
+            SettingsEntryBuilder.create("Preference 2", owner)
+                .setMacro { SimplePreferenceMacro(title = "Preference 2", summary = "Summary 2") }
+                .build()
+        )
+        entryList.add(
+            SettingsEntryBuilder.create("Preference 3", owner)
+                .setMacro { SimplePreferenceMacro(title = "Preference 2", summary = "Summary 3") }
+                .build()
+        )
+        entryList.add(
+            SettingsEntryBuilder.create("Preference 4", owner)
+                .setMacro { SimplePreferenceMacro(title = "Preference 4", summary = "Summary 4") }
+                .build()
+        )
+        return entryList
+    }
+
+    @Composable
+    override fun Page(arguments: Bundle?) {
+        val entries = buildEntry(arguments)
+        RegularScaffold(title = getTitle(arguments)) {
+            Category("Category A") {
+                entries[0].UiLayout()
+                entries[1].UiLayout()
+            }
+            Category {
+                entries[2].UiLayout()
+                entries[3].UiLayout()
+            }
+        }
+    }
+}
+
+@Preview(showBackground = true)
+@Composable
+private fun SpinnerPagePreview() {
+    SettingsTheme { CategoryPageProvider.Page(null) }
+}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/CopyablePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/CopyablePageProvider.kt
index f897d8c..e919129 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/CopyablePageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/CopyablePageProvider.kt
@@ -21,10 +21,7 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
-import com.android.settingslib.spa.framework.common.EntrySearchData
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.compose.navigator
 import com.android.settingslib.spa.framework.theme.SettingsDimension
 import com.android.settingslib.spa.widget.preference.Preference
@@ -37,17 +34,12 @@
 object CopyablePageProvider : SettingsPageProvider {
     override val name = "Copyable"
 
-    private val owner = createSettingsPage()
-
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner)
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
-            .setSearchDataFn { EntrySearchData(title = TITLE) }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 
     @Composable
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/SpinnerPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/SpinnerPageProvider.kt
index 5c5c504..7a4b632 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/SpinnerPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/SpinnerPageProvider.kt
@@ -23,9 +23,7 @@
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.tooling.preview.Preview
-import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.common.createSettingsPage
 import com.android.settingslib.spa.framework.compose.navigator
 import com.android.settingslib.spa.framework.theme.SettingsTheme
 import com.android.settingslib.spa.widget.preference.Preference
@@ -39,14 +37,12 @@
 object SpinnerPageProvider : SettingsPageProvider {
     override val name = "Spinner"
 
-    fun buildInjectEntry(): SettingsEntryBuilder {
-        return SettingsEntryBuilder.createInject(owner = createSettingsPage())
-            .setUiLayoutFn {
-                Preference(object : PreferenceModel {
-                    override val title = TITLE
-                    override val onClick = navigator(name)
-                })
-            }
+    @Composable
+    fun Entry() {
+        Preference(object : PreferenceModel {
+            override val title = TITLE
+            override val onClick = navigator(name)
+        })
     }
 
     override fun getTitle(arguments: Bundle?): String {
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsDimension.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsDimension.kt
index f8c791a..ab95162 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsDimension.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsDimension.kt
@@ -24,6 +24,7 @@
     val paddingExtraSmall = 4.dp
     val paddingSmall = if (isSpaExpressiveEnabled) 8.dp else 4.dp
     val paddingExtraSmall5 = 10.dp
+    val paddingExtraSmall6 = 12.dp
     val paddingLarge = 16.dp
     val paddingExtraLarge = 24.dp
 
@@ -36,9 +37,9 @@
 
     val itemIconSize = 24.dp
     val itemIconContainerSize = 72.dp
-    val itemPaddingStart = paddingExtraLarge
+    val itemPaddingStart = if (isSpaExpressiveEnabled) paddingLarge else paddingExtraLarge
     val itemPaddingEnd = paddingLarge
-    val itemPaddingVertical = paddingLarge
+    val itemPaddingVertical = if (isSpaExpressiveEnabled) paddingExtraSmall6 else paddingLarge
     val itemPadding = PaddingValues(
         start = itemPaddingStart,
         top = itemPaddingVertical,
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsShape.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsShape.kt
index f7c5414..c787715 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsShape.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsShape.kt
@@ -24,5 +24,7 @@
 
     val CornerMedium = RoundedCornerShape(12.dp)
 
+    val categoryCorner = RoundedCornerShape(20.dp)
+
     val CornerExtraLarge = RoundedCornerShape(28.dp)
 }
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsTypography.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsTypography.kt
index 460bf99..965c971 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsTypography.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsTypography.kt
@@ -162,3 +162,6 @@
 /** Creates a new [TextStyle] which font weight set to medium. */
 internal fun TextStyle.toMediumWeight() =
     copy(fontWeight = FontWeight.Medium, letterSpacing = 0.01.em)
+
+internal fun TextStyle.toSemiBoldWeight() =
+    copy(fontWeight = FontWeight.SemiBold, letterSpacing = 0.01.em)
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsBanner.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsBanner.kt
index 185fd29..38707b0 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsBanner.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsBanner.kt
@@ -57,6 +57,7 @@
 import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraSmall
 import com.android.settingslib.spa.framework.theme.SettingsTheme
 import com.android.settingslib.spa.framework.theme.isSpaExpressiveEnabled
+import com.android.settingslib.spa.framework.theme.toSemiBoldWeight
 import com.android.settingslib.spa.widget.ui.SettingsBody
 import com.android.settingslib.spa.widget.ui.SettingsTitle
 
@@ -159,7 +160,9 @@
 @Composable
 fun BannerTitleHeader(title: String, onDismiss: (() -> Unit)? = null) {
     Row(Modifier.fillMaxWidth()) {
-        Box(modifier = Modifier.weight(1f)) { SettingsTitle(title) }
+        Box(modifier = Modifier.weight(1f)) {
+            Text(text = title, style = MaterialTheme.typography.titleMedium.toSemiBoldWeight())
+        }
         Spacer(modifier = Modifier.padding(SettingsDimension.paddingSmall))
         DismissButton(onDismiss)
     }
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/button/ActionButtons.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/button/ActionButtons.kt
index 7e1df16..203a8bd 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/button/ActionButtons.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/button/ActionButtons.kt
@@ -56,6 +56,7 @@
 import com.android.settingslib.spa.framework.theme.SettingsTheme
 import com.android.settingslib.spa.framework.theme.divider
 import com.android.settingslib.spa.framework.theme.isSpaExpressiveEnabled
+import com.android.settingslib.spa.framework.theme.toSemiBoldWeight
 
 data class ActionButton(
     val text: String,
@@ -110,7 +111,7 @@
                 shape = RectangleShape,
                 colors = ButtonDefaults.filledTonalButtonColors(
                     containerColor = MaterialTheme.colorScheme.primaryContainer,
-                    contentColor = MaterialTheme.colorScheme.onPrimary,
+                    contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
                     disabledContainerColor = MaterialTheme.colorScheme.surface,
                 ),
                 contentPadding = PaddingValues(horizontal = 24.dp, vertical = 16.dp),
@@ -129,7 +130,7 @@
                 Text(
                     text = actionButton.text,
                     textAlign = TextAlign.Center,
-                    style = MaterialTheme.typography.labelMedium,
+                    style = MaterialTheme.typography.labelLarge.toSemiBoldWeight(),
                 )
             }
         }
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/dialog/SettingsAlertDialog.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/dialog/SettingsAlertDialog.kt
index 265864e..490936f 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/dialog/SettingsAlertDialog.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/dialog/SettingsAlertDialog.kt
@@ -26,6 +26,7 @@
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.material3.AlertDialog
 import androidx.compose.material3.Button
+import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.OutlinedButton
 import androidx.compose.material3.Text
 import androidx.compose.material3.TextButton
@@ -99,7 +100,16 @@
             dismissButton?.let {
                 { if (isSpaExpressiveEnabled) DismissButton(it) else Button(it) }
             },
-        title = title?.let { { CenterRow { Text(it) } } },
+        title =
+            title?.let {
+                {
+                    CenterRow {
+                        if (isSpaExpressiveEnabled)
+                            Text(it, style = MaterialTheme.typography.bodyLarge)
+                        else Text(it)
+                    }
+                }
+            },
         text =
             text?.let {
                 { CenterRow { Column(Modifier.verticalScroll(rememberScrollState())) { text() } } }
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BaseLayout.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BaseLayout.kt
index 23a8e78..c68ec78 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BaseLayout.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BaseLayout.kt
@@ -16,6 +16,7 @@
 
 package com.android.settingslib.spa.widget.preference
 
+import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
@@ -25,16 +26,20 @@
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
 import androidx.compose.material3.HorizontalDivider
+import androidx.compose.material3.MaterialTheme
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import com.android.settingslib.spa.framework.theme.SettingsDimension
 import com.android.settingslib.spa.framework.theme.SettingsOpacity.alphaForEnabled
+import com.android.settingslib.spa.framework.theme.SettingsShape
 import com.android.settingslib.spa.framework.theme.SettingsTheme
+import com.android.settingslib.spa.framework.theme.isSpaExpressiveEnabled
 import com.android.settingslib.spa.widget.ui.SettingsTitle
 
 @Composable
@@ -51,10 +56,17 @@
     widget: @Composable () -> Unit = {},
 ) {
     Row(
-        modifier = modifier
-            .fillMaxWidth()
-            .semantics(mergeDescendants = true) {}
-            .padding(end = paddingEnd),
+        modifier =
+            modifier
+                .fillMaxWidth()
+                .semantics(mergeDescendants = true) {}
+                .then(
+                    if (isSpaExpressiveEnabled)
+                        Modifier.clip(SettingsShape.CornerExtraSmall)
+                            .background(MaterialTheme.colorScheme.surfaceBright)
+                    else Modifier
+                )
+                .padding(end = paddingEnd),
         verticalAlignment = Alignment.CenterVertically,
     ) {
         val alphaModifier = Modifier.alphaForEnabled(enabled())
@@ -63,20 +75,14 @@
             title = title,
             titleContentDescription = titleContentDescription,
             subTitle = subTitle,
-            modifier = alphaModifier
-                .weight(1f)
-                .padding(vertical = paddingVertical),
+            modifier = alphaModifier.weight(1f).padding(vertical = paddingVertical),
         )
         widget()
     }
 }
 
 @Composable
-internal fun BaseIcon(
-    icon: @Composable (() -> Unit)?,
-    modifier: Modifier,
-    paddingStart: Dp,
-) {
+internal fun BaseIcon(icon: @Composable (() -> Unit)?, modifier: Modifier, paddingStart: Dp) {
     if (icon != null) {
         Box(
             modifier = modifier.size(SettingsDimension.itemIconContainerSize),
@@ -107,11 +113,6 @@
 @Composable
 private fun BaseLayoutPreview() {
     SettingsTheme {
-        BaseLayout(
-            title = "Title",
-            subTitle = {
-                HorizontalDivider(thickness = 10.dp)
-            }
-        )
+        BaseLayout(title = "Title", subTitle = { HorizontalDivider(thickness = 10.dp) })
     }
 }
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/IntroPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/IntroPreference.kt
index 22a5755..6d3f7bc 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/IntroPreference.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/IntroPreference.kt
@@ -36,6 +36,7 @@
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.tooling.preview.Preview
 import com.android.settingslib.spa.framework.theme.SettingsDimension
+import com.android.settingslib.spa.framework.theme.toSemiBoldWeight
 
 @Composable
 fun IntroPreference(
@@ -90,7 +91,7 @@
                 imageVector = imageVector,
                 contentDescription = null,
                 modifier = Modifier.size(SettingsDimension.introIconSize),
-                tint = MaterialTheme.colorScheme.onSecondary,
+                tint = MaterialTheme.colorScheme.onSecondaryContainer,
             )
         }
     }
@@ -112,7 +113,7 @@
         Text(
             text = title,
             textAlign = TextAlign.Center,
-            style = MaterialTheme.typography.titleLarge,
+            style = MaterialTheme.typography.titleLarge.toSemiBoldWeight(),
             color = MaterialTheme.colorScheme.onSurface,
         )
     }
@@ -126,7 +127,7 @@
             Text(
                 text = description,
                 textAlign = TextAlign.Center,
-                style = MaterialTheme.typography.titleMedium,
+                style = MaterialTheme.typography.bodyLarge,
                 color = MaterialTheme.colorScheme.onSurfaceVariant,
                 modifier = Modifier.padding(top = SettingsDimension.paddingExtraSmall),
             )
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetPreference.kt
index 92b1005..3aa7ad0 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetPreference.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetPreference.kt
@@ -49,7 +49,14 @@
     widget: @Composable () -> Unit,
 ) {
     Row(
-        modifier = Modifier.fillMaxWidth().padding(end = SettingsDimension.itemPaddingEnd),
+        modifier =
+            Modifier.fillMaxWidth()
+                .then(
+                    if (isSpaExpressiveEnabled)
+                        Modifier.background(MaterialTheme.colorScheme.surfaceBright)
+                    else Modifier
+                )
+                .padding(end = SettingsDimension.itemPaddingEnd),
         verticalAlignment = Alignment.CenterVertically,
     ) {
         if (isSpaExpressiveEnabled) {
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/ZeroStatePreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/ZeroStatePreference.kt
index 3f2e772..b771f36 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/ZeroStatePreference.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/ZeroStatePreference.kt
@@ -47,6 +47,7 @@
 import androidx.graphics.shapes.RoundedPolygon
 import androidx.graphics.shapes.star
 import androidx.graphics.shapes.toPath
+import com.android.settingslib.spa.framework.theme.toSemiBoldWeight
 
 @Composable
 fun ZeroStatePreference(icon: ImageVector, text: String? = null, description: String? = null) {
@@ -80,7 +81,7 @@
             Text(
                 text = text,
                 textAlign = TextAlign.Center,
-                style = MaterialTheme.typography.titleMedium,
+                style = MaterialTheme.typography.titleMedium.toSemiBoldWeight(),
                 color = MaterialTheme.colorScheme.onSurfaceVariant,
                 modifier = Modifier.padding(top = 24.dp),
             )
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/Actions.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/Actions.kt
index 94d2c21..f99d206 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/Actions.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/Actions.kt
@@ -41,9 +41,7 @@
 internal fun NavigateBack() {
     val navController = LocalNavController.current
     val contentDescription = stringResource(R.string.abc_action_bar_up_description)
-    BackAction(contentDescription) {
-        navController.navigateBack()
-    }
+    BackAction(contentDescription) { navController.navigateBack() }
 }
 
 /** Action that collapses the search bar. */
@@ -55,15 +53,35 @@
 
 @Composable
 private fun BackAction(contentDescription: String, onClick: () -> Unit) {
-    IconButton(onClick) {
+    IconButton(
+        onClick = onClick,
+        modifier =
+        if (isSpaExpressiveEnabled)
+            Modifier
+                .padding(
+                    start = SettingsDimension.paddingLarge,
+                    end = SettingsDimension.paddingSmall,
+                    top = SettingsDimension.paddingExtraSmall,
+                    bottom = SettingsDimension.paddingExtraSmall,
+                )
+                .size(SettingsDimension.actionIconWidth, SettingsDimension.actionIconHeight)
+                .clip(SettingsShape.CornerExtraLarge)
+        else Modifier,
+    ) {
         Icon(
             imageVector = Icons.AutoMirrored.Outlined.ArrowBack,
             contentDescription = contentDescription,
-            modifier = if (isSpaExpressiveEnabled) Modifier
-                .size(SettingsDimension.actionIconWidth, SettingsDimension.actionIconHeight)
-                .clip(SettingsShape.CornerExtraLarge)
-                .background(MaterialTheme.colorScheme.surfaceContainerHigh)
-                .padding(SettingsDimension.actionIconPadding) else Modifier
+            modifier =
+            if (isSpaExpressiveEnabled)
+                Modifier
+                    .size(
+                        SettingsDimension.actionIconWidth,
+                        SettingsDimension.actionIconHeight,
+                    )
+                    .clip(SettingsShape.CornerExtraLarge)
+                    .background(MaterialTheme.colorScheme.surfaceContainerHighest)
+                    .padding(SettingsDimension.actionIconPadding)
+            else Modifier,
         )
     }
 }
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/CustomizedAppBar.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/CustomizedAppBar.kt
index 2ae3b56..2c55779 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/CustomizedAppBar.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/CustomizedAppBar.kt
@@ -78,7 +78,9 @@
 import androidx.compose.ui.unit.Velocity
 import androidx.compose.ui.unit.dp
 import com.android.settingslib.spa.framework.theme.SettingsDimension
+import com.android.settingslib.spa.framework.theme.isSpaExpressiveEnabled
 import com.android.settingslib.spa.framework.theme.settingsBackground
+import com.android.settingslib.spa.framework.theme.toSemiBoldWeight
 import kotlin.math.abs
 import kotlin.math.max
 import kotlin.math.roundToInt
@@ -116,8 +118,12 @@
 ) {
     TwoRowsTopAppBar(
         title = { Title(title = title, maxLines = 3) },
-        titleTextStyle = MaterialTheme.typography.displaySmall,
-        smallTitleTextStyle = MaterialTheme.typography.titleMedium,
+        titleTextStyle =
+            if (isSpaExpressiveEnabled) MaterialTheme.typography.displaySmall.toSemiBoldWeight()
+            else MaterialTheme.typography.displaySmall,
+        smallTitleTextStyle =
+            if (isSpaExpressiveEnabled) MaterialTheme.typography.titleLarge.toSemiBoldWeight()
+            else MaterialTheme.typography.titleLarge,
         titleBottomPadding = LargeTitleBottomPadding,
         smallTitle = { Title(title = title, maxLines = 1) },
         modifier = modifier,
@@ -136,7 +142,9 @@
         text = title,
         modifier =
             Modifier.padding(
-                    start = SettingsDimension.itemPaddingAround,
+                    start =
+                        if (isSpaExpressiveEnabled) SettingsDimension.paddingExtraSmall
+                        else SettingsDimension.itemPaddingAround,
                     end = SettingsDimension.itemPaddingEnd,
                 )
                 .semantics { heading() },
@@ -194,7 +202,7 @@
         return lerp(
             containerColor,
             scrolledContainerColor,
-            FastOutLinearInEasing.transform(colorTransitionFraction)
+            FastOutLinearInEasing.transform(colorTransitionFraction),
         )
     }
 
@@ -241,7 +249,7 @@
             Row(
                 horizontalArrangement = Arrangement.End,
                 verticalAlignment = Alignment.CenterVertically,
-                content = actions
+                content = actions,
             )
         }
 
@@ -296,7 +304,7 @@
     windowInsets: WindowInsets,
     colors: TopAppBarColors,
     pinnedHeight: Dp,
-    scrollBehavior: TopAppBarScrollBehavior?
+    scrollBehavior: TopAppBarScrollBehavior?,
 ) {
     if (MaxHeightWithoutTitle <= pinnedHeight) {
         throw IllegalArgumentException(
@@ -333,7 +341,7 @@
             Row(
                 horizontalArrangement = Arrangement.End,
                 verticalAlignment = Alignment.CenterVertically,
-                content = actions
+                content = actions,
             )
         }
     val topTitleAlpha = { TopTitleAlphaEasing.transform(colorTransitionFraction()) }
@@ -356,9 +364,9 @@
                         scrollBehavior.state,
                         velocity,
                         scrollBehavior.flingAnimationSpec,
-                        scrollBehavior.snapAnimationSpec
+                        scrollBehavior.snapAnimationSpec,
                     )
-                }
+                },
             )
         } else {
             Modifier
@@ -412,7 +420,8 @@
                                 val measuredMaxHeightPx =
                                     density.run {
                                         MaxHeightWithoutTitle.toPx() +
-                                            coordinates.size.height.toFloat()
+                                            coordinates.size.height.toFloat() +
+                                            titleBaselineHeight.toPx()
                                     }
                                 // Allow larger max height for multi-line title, but do not reduce
                                 // max height to prevent flaky.
@@ -430,7 +439,7 @@
                 titleBottomPadding = titleBottomPaddingPx,
                 hideTitleSemantics = hideBottomRowSemantics,
                 navigationIcon = {},
-                actions = {}
+                actions = {},
             )
         }
     }
@@ -485,7 +494,7 @@
             Box(Modifier.layoutId("navigationIcon").padding(start = TopAppBarHorizontalPadding)) {
                 CompositionLocalProvider(
                     LocalContentColor provides navigationIconContentColor,
-                    content = navigationIcon
+                    content = navigationIcon,
                 )
             }
             Box(
@@ -504,18 +513,18 @@
                                     fontScale = if (titleScaleDisabled) 1f else fontScale,
                                 )
                             },
-                        content = title
+                        content = title,
                     )
                 }
             }
             Box(Modifier.layoutId("actionIcons").padding(end = TopAppBarHorizontalPadding)) {
                 CompositionLocalProvider(
                     LocalContentColor provides actionIconContentColor,
-                    content = actions
+                    content = actions,
                 )
             }
         },
-        modifier = modifier
+        modifier = modifier,
     ) { measurables, constraints ->
         val navigationIconPlaceable =
             measurables
@@ -552,7 +561,7 @@
             // Navigation icon
             navigationIconPlaceable.placeRelative(
                 x = 0,
-                y = (layoutHeight - navigationIconPlaceable.height) / 2
+                y = (layoutHeight - navigationIconPlaceable.height) / 2,
             )
 
             // Title
@@ -570,17 +579,17 @@
                                     titlePlaceable.height -
                                     max(
                                         0,
-                                        titleBottomPadding - titlePlaceable.height + titleBaseline
+                                        titleBottomPadding - titlePlaceable.height + titleBaseline,
                                     )
                         // Arrangement.Top
                         else -> 0
-                    }
+                    },
             )
 
             // Action icons
             actionIconsPlaceable.placeRelative(
                 x = constraints.maxWidth - actionIconsPlaceable.width,
-                y = (layoutHeight - actionIconsPlaceable.height) / 2
+                y = (layoutHeight - actionIconsPlaceable.height) / 2,
             )
         }
     }
@@ -595,7 +604,7 @@
     state: TopAppBarState,
     velocity: Float,
     flingAnimationSpec: DecayAnimationSpec<Float>?,
-    snapAnimationSpec: AnimationSpec<Float>?
+    snapAnimationSpec: AnimationSpec<Float>?,
 ): Velocity {
     // Check if the app bar is completely collapsed/expanded. If so, no need to settle the app bar,
     // and just return Zero Velocity.
@@ -609,20 +618,18 @@
     // continue the motion to expand or collapse the app bar.
     if (flingAnimationSpec != null && abs(velocity) > 1f) {
         var lastValue = 0f
-        AnimationState(
-                initialValue = 0f,
-                initialVelocity = velocity,
-            )
-            .animateDecay(flingAnimationSpec) {
-                val delta = value - lastValue
-                val initialHeightOffset = state.heightOffset
-                state.heightOffset = initialHeightOffset + delta
-                val consumed = abs(initialHeightOffset - state.heightOffset)
-                lastValue = value
-                remainingVelocity = this.velocity
-                // avoid rounding errors and stop if anything is unconsumed
-                if (abs(delta - consumed) > 0.5f) this.cancelAnimation()
-            }
+        AnimationState(initialValue = 0f, initialVelocity = velocity).animateDecay(
+            flingAnimationSpec
+        ) {
+            val delta = value - lastValue
+            val initialHeightOffset = state.heightOffset
+            state.heightOffset = initialHeightOffset + delta
+            val consumed = abs(initialHeightOffset - state.heightOffset)
+            lastValue = value
+            remainingVelocity = this.velocity
+            // avoid rounding errors and stop if anything is unconsumed
+            if (abs(delta - consumed) > 0.5f) this.cancelAnimation()
+        }
     }
     // Snap if animation specs were provided.
     if (snapAnimationSpec != null) {
@@ -633,7 +640,7 @@
                 } else {
                     state.heightOffsetLimit
                 },
-                animationSpec = snapAnimationSpec
+                animationSpec = snapAnimationSpec,
             ) {
                 state.heightOffset = value
             }
@@ -647,9 +654,10 @@
 // Medium or Large app bar.
 private val TopTitleAlphaEasing = CubicBezierEasing(.8f, 0f, .8f, .15f)
 
-internal val MaxHeightWithoutTitle = 124.dp
+internal val MaxHeightWithoutTitle = if (isSpaExpressiveEnabled) 84.dp else 124.dp
 internal val DefaultTitleHeight = 52.dp
 internal val ContainerHeight = 56.dp
+private val titleBaselineHeight = if (isSpaExpressiveEnabled) 8.dp else 0.dp
 private val LargeTitleBottomPadding = 28.dp
 private val TopAppBarHorizontalPadding = 4.dp
 
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Category.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Category.kt
index 48cd145..6c5581f 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Category.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Category.kt
@@ -16,9 +16,13 @@
 
 package com.android.settingslib.spa.widget.ui
 
+import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.ColumnScope
+import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.outlined.TouchApp
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
@@ -27,25 +31,31 @@
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 import com.android.settingslib.spa.framework.theme.SettingsDimension
+import com.android.settingslib.spa.framework.theme.SettingsShape
 import com.android.settingslib.spa.framework.theme.SettingsTheme
+import com.android.settingslib.spa.framework.theme.isSpaExpressiveEnabled
+import com.android.settingslib.spa.widget.preference.Preference
+import com.android.settingslib.spa.widget.preference.PreferenceModel
 
-/**
- * A category title that is placed before a group of similar items.
- */
+/** A category title that is placed before a group of similar items. */
 @Composable
 fun CategoryTitle(title: String) {
     Text(
         text = title,
-        modifier = Modifier.padding(
-            start = SettingsDimension.itemPaddingStart,
-            top = 20.dp,
-            end = SettingsDimension.itemPaddingEnd,
-            bottom = 8.dp,
-        ),
+        modifier =
+            Modifier.padding(
+                start = SettingsDimension.itemPaddingStart,
+                top = 20.dp,
+                end =
+                    if (isSpaExpressiveEnabled) SettingsDimension.paddingSmall
+                    else SettingsDimension.itemPaddingEnd,
+                bottom = 8.dp,
+            ),
         color = MaterialTheme.colorScheme.primary,
         style = MaterialTheme.typography.labelMedium,
     )
@@ -56,14 +66,31 @@
  * visually separates groups of items.
  */
 @Composable
-fun Category(title: String, content: @Composable ColumnScope.() -> Unit) {
-    Column {
+fun Category(title: String? = null, content: @Composable ColumnScope.() -> Unit) {
+    Column(
+        modifier =
+            if (isSpaExpressiveEnabled)
+                Modifier.padding(
+                    horizontal = SettingsDimension.paddingLarge,
+                    vertical = SettingsDimension.paddingSmall,
+                )
+            else Modifier
+    ) {
         var displayTitle by remember { mutableStateOf(false) }
-        if (displayTitle) CategoryTitle(title = title)
+        if (title != null && displayTitle) CategoryTitle(title = title)
         Column(
-            modifier = Modifier.onGloballyPositioned { coordinates ->
-                displayTitle = coordinates.size.height > 0
-            },
+            modifier =
+                Modifier.onGloballyPositioned { coordinates ->
+                        displayTitle = coordinates.size.height > 0
+                    }
+                    .then(
+                        if (isSpaExpressiveEnabled)
+                            Modifier.fillMaxWidth().clip(SettingsShape.categoryCorner)
+                        else Modifier
+                    ),
+            verticalArrangement =
+                if (isSpaExpressiveEnabled) Arrangement.spacedBy(SettingsDimension.paddingTiny)
+                else Arrangement.Top,
             content = content,
         )
     }
@@ -73,6 +100,21 @@
 @Composable
 private fun CategoryPreview() {
     SettingsTheme {
-        CategoryTitle("Appearance")
+        Category("Appearance") {
+            Preference(
+                object : PreferenceModel {
+                    override val title = "Title"
+                    override val summary = { "Summary" }
+                }
+            )
+            Preference(
+                object : PreferenceModel {
+                    override val title = "Title"
+                    override val summary = { "Summary" }
+                    override val icon =
+                        @Composable { SettingsIcon(imageVector = Icons.Outlined.TouchApp) }
+                }
+            )
+        }
     }
 }
diff --git a/packages/SettingsLib/StatusBannerPreference/Android.bp b/packages/SettingsLib/StatusBannerPreference/Android.bp
new file mode 100644
index 0000000..d6af318
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/Android.bp
@@ -0,0 +1,33 @@
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "frameworks_base_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["frameworks_base_license"],
+}
+
+android_library {
+    name: "SettingsLibStatusBannerPreference",
+    use_resource_processor: true,
+    defaults: [
+        "SettingsLintDefaults",
+    ],
+
+    srcs: [
+        "src/**/*.java",
+        "src/**/*.kt",
+    ],
+    resource_dirs: ["res"],
+
+    static_libs: [
+        "androidx.annotation_annotation",
+        "androidx.preference_preference",
+        "SettingsLibSettingsTheme",
+    ],
+    sdk_version: "system_current",
+    min_sdk_version: "24",
+    apex_available: [
+        "//apex_available:platform",
+    ],
+}
diff --git a/packages/SettingsLib/StatusBannerPreference/AndroidManifest.xml b/packages/SettingsLib/StatusBannerPreference/AndroidManifest.xml
new file mode 100644
index 0000000..1dca93f
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  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.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.android.settingslib.widget.preference.statusbanner">
+
+    <uses-sdk android:minSdkVersion="24" />
+
+</manifest>
diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_high.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_high.xml
new file mode 100644
index 0000000..b977893c
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_high.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <size android:height="68dp" android:width="68dp" />
+    <solid android:color="@color/settingslib_materialColorSurfaceContainerHigh" />
+</shape>
diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_low.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_low.xml
new file mode 100644
index 0000000..b977893c
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_low.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <size android:height="68dp" android:width="68dp" />
+    <solid android:color="@color/settingslib_materialColorSurfaceContainerHigh" />
+</shape>
diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_medium.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_medium.xml
new file mode 100644
index 0000000..b977893c
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_medium.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <size android:height="68dp" android:width="68dp" />
+    <solid android:color="@color/settingslib_materialColorSurfaceContainerHigh" />
+</shape>
diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_generic.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_generic.xml
new file mode 100644
index 0000000..b64c09f
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_generic.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <size android:height="68dp" android:width="68dp" />
+    <solid android:color="@color/settingslib_materialColorSurfaceContainerHigh" />
+</shape>
\ No newline at end of file
diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_high.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_high.xml
new file mode 100644
index 0000000..c3caaf7
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_high.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <size android:height="68dp" android:width="68dp" />
+    <solid android:color="#FFECEE" />
+</shape>
diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_low.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_low.xml
new file mode 100644
index 0000000..4e2254c
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_low.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <size android:height="68dp" android:width="68dp" />
+    <solid android:color="#DDF8D8" />
+</shape>
diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_medium.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_medium.xml
new file mode 100644
index 0000000..31ac059
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_medium.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <size android:height="68dp" android:width="68dp" />
+    <solid android:color="#FFF2B4" />
+</shape>
diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_high.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_high.xml
new file mode 100644
index 0000000..58d0fd0
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_high.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="34dp"
+    android:height="42dp"
+    android:viewportWidth="34"
+    android:viewportHeight="42">
+    <path
+        android:pathData="M0.856,17.569C0.887,19.083 1.004,20.593 1.206,22.094C2.166,28.584 5.804,35.937 15.774,41.089C16.171,41.293 16.61,41.4 17.056,41.4C17.503,41.4 17.942,41.293 18.339,41.089C28.309,35.936 31.947,28.583 32.907,22.093C33.109,20.593 33.226,19.083 33.256,17.569V8.605C33.257,7.919 33.046,7.25 32.652,6.688C32.259,6.127 31.703,5.7 31.059,5.467L18.191,0.8C17.458,0.534 16.655,0.534 15.922,0.8L3.054,5.467C2.41,5.7 1.854,6.127 1.461,6.688C1.067,7.25 0.856,7.919 0.856,8.605V17.569Z"
+        android:fillColor="#DB372D"/>
+    <path
+        android:pathData="M15.067,24.333V10.733H18.933V24.333H15.067ZM15.067,31.267V27.433H18.933V31.267H15.067Z"
+        android:fillColor="@color/settingslib_materialColorSurfaceContainerLowest"/>
+</vector>
diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_low.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_low.xml
new file mode 100644
index 0000000..d8862e8
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_low.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="34dp"
+    android:height="42dp"
+    android:viewportWidth="34"
+    android:viewportHeight="42">
+    <path
+        android:pathData="M0.856,17.569C0.887,19.083 1.004,20.593 1.206,22.094C2.166,28.584 5.804,35.937 15.774,41.089C16.171,41.293 16.61,41.4 17.056,41.4C17.503,41.4 17.942,41.293 18.339,41.089C28.309,35.936 31.947,28.583 32.907,22.093C33.109,20.593 33.226,19.083 33.256,17.569V8.605C33.257,7.919 33.046,7.25 32.652,6.688C32.259,6.127 31.703,5.7 31.059,5.467L18.191,0.8C17.458,0.534 16.655,0.534 15.922,0.8L3.054,5.467C2.41,5.7 1.854,6.127 1.461,6.688C1.067,7.25 0.856,7.919 0.856,8.605V17.569Z"
+        android:fillColor="#1AA64A"/>
+    <path
+        android:pathData="M14.389,27.733L8.423,21.767L11.156,19.033L14.389,22.267L22.956,13.7L25.69,16.433L14.389,27.733Z"
+        android:fillColor="@color/settingslib_materialColorSurfaceContainerLowest"/>
+</vector>
diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_medium.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_medium.xml
new file mode 100644
index 0000000..5e34050
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_medium.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="34dp"
+    android:height="42dp"
+    android:viewportWidth="34"
+    android:viewportHeight="42">
+    <path
+        android:pathData="M0.856,17.569C0.887,19.083 1.004,20.593 1.206,22.094C2.166,28.584 5.804,35.937 15.774,41.089C16.171,41.293 16.61,41.4 17.056,41.4C17.503,41.4 17.942,41.293 18.339,41.089C28.309,35.936 31.947,28.583 32.907,22.093C33.109,20.593 33.226,19.083 33.256,17.569V8.605C33.257,7.919 33.046,7.25 32.652,6.688C32.259,6.127 31.703,5.7 31.059,5.467L18.191,0.8C17.458,0.534 16.655,0.534 15.922,0.8L3.054,5.467C2.41,5.7 1.854,6.127 1.461,6.688C1.067,7.25 0.856,7.919 0.856,8.605V17.569Z"
+        android:fillColor="#FCBD00"/>
+    <path
+        android:pathData="M15.067,24.333V10.733H18.933V24.333H15.067ZM15.067,31.267V27.433H18.933V31.267H15.067Z"
+        android:fillColor="@color/settingslib_materialColorSurfaceContainerLowest"/>
+</vector>
diff --git a/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml b/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml
new file mode 100644
index 0000000..9a3e5b9
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<com.google.android.material.card.MaterialCardView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    style="@style/SettingsLibStatusBannerCardStyle">
+
+    <LinearLayout
+        android:id="@+id/banner_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:baselineAligned="false"
+        android:paddingVertical="@dimen/settingslib_expressive_space_small1"
+        android:paddingHorizontal="?android:attr/listPreferredItemPaddingStart"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/status_container"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="horizontal">
+
+            <FrameLayout
+                android:id="@android:id/icon_frame"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:minWidth="@dimen/settingslib_status_banner_icon_frame_size"
+                android:minHeight="@dimen/settingslib_status_banner_icon_frame_size"
+                android:gravity="center"
+                android:orientation="horizontal">
+
+                <ImageView
+                    android:id="@+id/icon_background"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"/>
+
+                <ImageView
+                    android:id="@android:id/icon"
+                    android:layout_width="@dimen/settingslib_expressive_space_medium4"
+                    android:layout_height="@dimen/settingslib_expressive_space_medium4"
+                    android:layout_gravity="center"
+                    android:scaleType="centerInside"/>
+
+            </FrameLayout>
+
+            <LinearLayout
+                android:id="@+id/text_container"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:paddingVertical="@dimen/settingslib_expressive_space_extrasmall4"
+                android:paddingHorizontal="@dimen/settingslib_expressive_space_small1"
+                android:layout_weight="1"
+                android:layout_gravity="center"
+                android:orientation="vertical">
+                <TextView
+                    android:id="@android:id/title"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:hyphenationFrequency="normalFast"
+                    android:lineBreakWordStyle="phrase"
+                    android:textAppearance="@style/SettingsLibTextAppearance.Emphasized.Title.Large"/>
+
+                <TextView
+                    android:id="@android:id/summary"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:hyphenationFrequency="normalFast"
+                    android:lineBreakWordStyle="phrase"
+                    android:maxLines="3"
+                    android:textAppearance="@style/SettingsLibTextAppearance.Primary.Body.Medium"/>
+            </LinearLayout>
+        </LinearLayout>
+
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/status_banner_button"
+            android:layout_marginTop="@dimen/settingslib_expressive_space_small3"
+            style="@style/SettingsLibButtonStyle.Expressive.Filled.Extra"/>
+
+    </LinearLayout>
+</com.google.android.material.card.MaterialCardView>
\ No newline at end of file
diff --git a/packages/SettingsLib/StatusBannerPreference/res/values/attrs.xml b/packages/SettingsLib/StatusBannerPreference/res/values/attrs.xml
new file mode 100644
index 0000000..54860d4
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/values/attrs.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 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.
+-->
+
+<resources>
+    <declare-styleable name="StatusBanner">
+        <attr name="iconLevel" format="enum">
+            <enum name="generic" value="0"/>
+            <enum name="low" value="1"/>
+            <enum name="medium" value="2"/>
+            <enum name="high" value="3"/>
+        </attr>
+        <attr name="buttonLevel" format="enum">
+            <enum name="generic" value="0"/>
+            <enum name="low" value="1"/>
+            <enum name="medium" value="2"/>
+            <enum name="high" value="3"/>
+        </attr>
+        <attr name="buttonText" format="string"/>
+    </declare-styleable>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/StatusBannerPreference/res/values/colors.xml b/packages/SettingsLib/StatusBannerPreference/res/values/colors.xml
new file mode 100644
index 0000000..19181dd
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/values/colors.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+-->
+
+<resources>
+    <!-- static palette green60 -->
+    <color name="settingslib_expressive_color_status_level_low">#1AA64A</color>
+    <!-- static palette yellow80 -->
+    <color name="settingslib_expressive_color_status_level_medium">#FCBD00</color>
+    <!-- static palette red50 -->
+    <color name="settingslib_expressive_color_status_level_high">#DB372D</color>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/StatusBannerPreference/res/values/dimens.xml b/packages/SettingsLib/StatusBannerPreference/res/values/dimens.xml
new file mode 100644
index 0000000..f18f168
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/res/values/dimens.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 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.
+-->
+
+<resources>
+    <dimen name="settingslib_status_banner_icon_frame_size">68dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/StatusBannerPreference/src/com/android/settingslib/widget/StatusBannerPreference.kt b/packages/SettingsLib/StatusBannerPreference/src/com/android/settingslib/widget/StatusBannerPreference.kt
new file mode 100644
index 0000000..c1578ef
--- /dev/null
+++ b/packages/SettingsLib/StatusBannerPreference/src/com/android/settingslib/widget/StatusBannerPreference.kt
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2024 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.settingslib.widget
+
+import android.content.Context
+import android.content.res.ColorStateList
+import android.graphics.drawable.Drawable
+import android.util.AttributeSet
+import android.view.View
+import android.widget.ImageView
+import androidx.annotation.StringRes
+import androidx.core.content.ContextCompat
+import androidx.preference.Preference
+import androidx.preference.PreferenceViewHolder
+import com.android.settingslib.widget.preference.statusbanner.R
+import com.google.android.material.button.MaterialButton
+
+class StatusBannerPreference @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0,
+    defStyleRes: Int = 0
+) : Preference(context, attrs, defStyleAttr, defStyleRes) {
+
+    enum class BannerStatus {
+        GENERIC,
+        LOW,
+        MEDIUM,
+        HIGH
+    }
+    var iconLevel: BannerStatus = BannerStatus.GENERIC
+        set(value) {
+            field = value
+            notifyChanged()
+        }
+    var buttonLevel: BannerStatus = BannerStatus.GENERIC
+        set(value) {
+            field = value
+            notifyChanged()
+        }
+    private var buttonText: String = ""
+        set(value) {
+            field = value
+            notifyChanged()
+        }
+    private var listener: View.OnClickListener? = null
+
+    init {
+        layoutResource = R.layout.settingslib_expressive_preference_statusbanner
+        isSelectable = false
+
+        initAttributes(context, attrs, defStyleAttr)
+    }
+
+    private fun initAttributes(context: Context, attrs: AttributeSet?, defStyleAttr: Int) {
+        context.obtainStyledAttributes(
+            attrs,
+            R.styleable.StatusBanner, defStyleAttr, 0
+        ).apply {
+            iconLevel = getInteger(R.styleable.StatusBanner_iconLevel, 0).toBannerStatus()
+            if (icon == null) {
+                icon = getIconDrawable(iconLevel)
+            } else {
+                icon!!.setTintList(ColorStateList.valueOf(getBackgroundColor(iconLevel)))
+            }
+            buttonLevel = getInteger(R.styleable.StatusBanner_buttonLevel, 0).toBannerStatus()
+            buttonText = getString(R.styleable.StatusBanner_buttonText) ?: ""
+            recycle()
+        }
+    }
+
+    private fun Int.toBannerStatus(): BannerStatus = when (this) {
+        1 -> BannerStatus.LOW
+        2 -> BannerStatus.MEDIUM
+        3 -> BannerStatus.HIGH
+        else -> BannerStatus.GENERIC
+    }
+
+    override fun onBindViewHolder(holder: PreferenceViewHolder) {
+        super.onBindViewHolder(holder)
+        holder.isDividerAllowedBelow = false
+        holder.isDividerAllowedAbove = false
+
+        (holder.findViewById(R.id.icon_background) as? ImageView)?.apply {
+            setImageDrawable(getBackgroundDrawable(iconLevel))
+        }
+
+        holder.findViewById(android.R.id.icon_frame)?.apply {
+            visibility = if (icon != null) View.VISIBLE else View.GONE
+        }
+
+        (holder.findViewById(R.id.status_banner_button) as? MaterialButton)?.apply {
+            setBackgroundColor(getBackgroundColor(buttonLevel))
+            text = buttonText
+            setOnClickListener(listener)
+            visibility = if (listener != null) View.VISIBLE else View.GONE
+        }
+    }
+
+    /**
+     * Sets the text to be displayed in button.
+     */
+    fun setButtonText(@StringRes textResId: Int) {
+        buttonText = context.getString(textResId)
+    }
+
+    /**
+     * Register a callback to be invoked when positive button is clicked.
+     */
+    fun setButtonOnClickListener(listener: View.OnClickListener) {
+        this.listener = listener
+        notifyChanged()
+    }
+
+    private fun getBackgroundColor(level: BannerStatus): Int {
+        return when (level) {
+            BannerStatus.LOW -> ContextCompat.getColor(
+                context,
+                R.color.settingslib_expressive_color_status_level_low
+            )
+
+            BannerStatus.MEDIUM -> ContextCompat.getColor(
+                context,
+                R.color.settingslib_expressive_color_status_level_medium
+            )
+
+            BannerStatus.HIGH -> ContextCompat.getColor(
+                context,
+                R.color.settingslib_expressive_color_status_level_high
+            )
+
+            else -> ContextCompat.getColor(
+                context,
+                com.android.settingslib.widget.theme.R.color.settingslib_materialColorPrimary
+            )
+        }
+    }
+
+    private fun getIconDrawable(level: BannerStatus): Drawable? {
+        return when (level) {
+            BannerStatus.LOW -> ContextCompat.getDrawable(
+                context,
+                R.drawable.settingslib_expressive_icon_status_level_low
+            )
+
+            BannerStatus.MEDIUM -> ContextCompat.getDrawable(
+                context,
+                R.drawable.settingslib_expressive_icon_status_level_medium
+            )
+
+            BannerStatus.HIGH -> ContextCompat.getDrawable(
+                context,
+                R.drawable.settingslib_expressive_icon_status_level_high
+            )
+
+            else -> null
+        }
+    }
+
+    private fun getBackgroundDrawable(level: BannerStatus): Drawable? {
+        return when (level) {
+            BannerStatus.LOW -> ContextCompat.getDrawable(
+                context,
+                R.drawable.settingslib_expressive_background_level_low
+            )
+
+            BannerStatus.MEDIUM -> ContextCompat.getDrawable(
+                context,
+                R.drawable.settingslib_expressive_background_level_medium
+            )
+
+            BannerStatus.HIGH -> ContextCompat.getDrawable(
+                context,
+                R.drawable.settingslib_expressive_background_level_high
+            )
+
+            else -> ContextCompat.getDrawable(
+                context,
+                R.drawable.settingslib_expressive_background_generic
+            )
+        }
+    }
+}
\ No newline at end of file
diff --git a/packages/SettingsLib/TopIntroPreference/Android.bp b/packages/SettingsLib/TopIntroPreference/Android.bp
index e70201b..76e36dc 100644
--- a/packages/SettingsLib/TopIntroPreference/Android.bp
+++ b/packages/SettingsLib/TopIntroPreference/Android.bp
@@ -14,7 +14,10 @@
         "SettingsLintDefaults",
     ],
 
-    srcs: ["src/**/*.java"],
+    srcs: [
+        "src/**/*.java",
+        "src/**/*.kt",
+    ],
     resource_dirs: ["res"],
 
     static_libs: [
diff --git a/packages/SettingsLib/TopIntroPreference/res/layout-v35/settingslib_expressive_top_intro.xml b/packages/SettingsLib/TopIntroPreference/res/layout-v35/settingslib_expressive_top_intro.xml
new file mode 100644
index 0000000..fb13ef7
--- /dev/null
+++ b/packages/SettingsLib/TopIntroPreference/res/layout-v35/settingslib_expressive_top_intro.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart">
+
+    <com.android.settingslib.widget.CollapsableTextView
+        android:id="@+id/collapsable_text_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.java b/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.java
deleted file mode 100644
index 1bbd76d..0000000
--- a/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.settingslib.widget;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settingslib.widget.preference.topintro.R;
-
-/**
- * The TopIntroPreference shows a text which describe a feature. Gernerally, we expect this
- * preference always shows on the top of screen.
- */
-public class TopIntroPreference extends Preference {
-
-    public TopIntroPreference(Context context) {
-        super(context);
-        setLayoutResource(R.layout.top_intro_preference);
-        setSelectable(false);
-    }
-
-    public TopIntroPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setLayoutResource(R.layout.top_intro_preference);
-        setSelectable(false);
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
-        super.onBindViewHolder(holder);
-        holder.setDividerAllowedAbove(false);
-        holder.setDividerAllowedBelow(false);
-    }
-}
diff --git a/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt b/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt
new file mode 100644
index 0000000..5be56f8
--- /dev/null
+++ b/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2024 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.settingslib.widget
+
+import android.content.Context
+import android.os.Build
+import android.text.TextUtils
+import android.util.AttributeSet
+import android.view.View
+import androidx.annotation.RequiresApi
+import androidx.preference.Preference
+import androidx.preference.PreferenceViewHolder
+import com.android.settingslib.widget.preference.topintro.R
+
+open class TopIntroPreference @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0,
+    defStyleRes: Int = 0
+) : Preference(context, attrs, defStyleAttr, defStyleRes) {
+
+    private var isCollapsable: Boolean = false
+    private var minLines: Int = 2
+    private var hyperlinkListener: View.OnClickListener? = null
+    private var learnMoreListener: View.OnClickListener? = null
+    private var learnMoreText: CharSequence? = null
+
+    init {
+        if (SettingsThemeHelper.isExpressiveTheme(context)) {
+            layoutResource = R.layout.settingslib_expressive_top_intro
+            initAttributes(context, attrs, defStyleAttr)
+        } else {
+            layoutResource = R.layout.top_intro_preference
+        }
+        isSelectable = false
+    }
+
+    private fun initAttributes(context: Context, attrs: AttributeSet?, defStyleAttr: Int) {
+        context.obtainStyledAttributes(
+            attrs,
+            COLLAPSABLE_TEXT_VIEW_ATTRS, defStyleAttr, 0
+        ).apply {
+            isCollapsable = getBoolean(IS_COLLAPSABLE, false)
+            minLines = getInt(
+                MIN_LINES,
+                if (isCollapsable) DEFAULT_MIN_LINES else DEFAULT_MAX_LINES
+            ).coerceIn(1, DEFAULT_MAX_LINES)
+            recycle()
+        }
+    }
+
+    override fun onBindViewHolder(holder: PreferenceViewHolder) {
+        super.onBindViewHolder(holder)
+        holder.isDividerAllowedAbove = false
+        holder.isDividerAllowedBelow = false
+
+        if (!SettingsThemeHelper.isExpressiveTheme(context)) {
+            return
+        }
+
+        (holder.findViewById(R.id.collapsable_text_view) as? CollapsableTextView)?.apply {
+            setCollapsable(isCollapsable)
+            setMinLines(minLines)
+            setText(title.toString())
+            if (hyperlinkListener != null) {
+                setHyperlinkListener(hyperlinkListener)
+            }
+            if (learnMoreListener != null) {
+                setLearnMoreText(learnMoreText)
+                setLearnMoreAction(learnMoreListener)
+            }
+        }
+    }
+
+    /**
+     * Sets whether the text view is collapsable.
+     * @param collapsable True if the text view should be collapsable, false otherwise.
+     */
+    @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    fun setCollapsable(collapsable: Boolean) {
+        isCollapsable = collapsable
+        notifyChanged()
+    }
+
+    /**
+     * Sets the minimum number of lines to display when collapsed.
+     * @param lines The minimum number of lines.
+     */
+    @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    fun setMinLines(lines: Int) {
+        minLines = lines.coerceIn(1, DEFAULT_MAX_LINES)
+        notifyChanged()
+    }
+
+    /**
+     * Sets the action when clicking on the hyperlink in the text.
+     * @param listener The click listener for hyperlink.
+     */
+    @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    fun setHyperlinkListener(listener: View.OnClickListener) {
+        if (hyperlinkListener != listener) {
+            hyperlinkListener = listener
+            notifyChanged()
+        }
+    }
+
+    /**
+     * Sets the action when clicking on the learn more view.
+     * @param listener The click listener for learn more.
+     */
+    @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    fun setLearnMoreAction(listener: View.OnClickListener) {
+        if (learnMoreListener != listener) {
+            learnMoreListener = listener
+            notifyChanged()
+        }
+    }
+
+    /**
+     * Sets the text of learn more view.
+     * @param text The text of learn more.
+     */
+    @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    fun setLearnMoreText(text: CharSequence) {
+        if (!TextUtils.equals(learnMoreText, text)) {
+            learnMoreText = text
+            notifyChanged()
+        }
+    }
+
+    companion object {
+        private const val DEFAULT_MAX_LINES = 10
+        private const val DEFAULT_MIN_LINES = 2
+
+        private val COLLAPSABLE_TEXT_VIEW_ATTRS =
+            com.android.settingslib.widget.theme.R.styleable.CollapsableTextView
+        private val MIN_LINES =
+            com.android.settingslib.widget.theme.R.styleable.CollapsableTextView_android_minLines
+        private val IS_COLLAPSABLE =
+            com.android.settingslib.widget.theme.R.styleable.CollapsableTextView_isCollapsable
+    }
+}
diff --git a/packages/SettingsLib/ZeroStatePreference/Android.bp b/packages/SettingsLib/ZeroStatePreference/Android.bp
new file mode 100644
index 0000000..4fc00bd
--- /dev/null
+++ b/packages/SettingsLib/ZeroStatePreference/Android.bp
@@ -0,0 +1,33 @@
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "frameworks_base_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["frameworks_base_license"],
+}
+
+android_library {
+    name: "SettingsLibZeroStatePreference",
+    use_resource_processor: true,
+    defaults: [
+        "SettingsLintDefaults",
+    ],
+
+    srcs: [
+        "src/**/*.java",
+        "src/**/*.kt",
+    ],
+    resource_dirs: ["res"],
+
+    static_libs: [
+        "androidx.annotation_annotation",
+        "androidx.preference_preference",
+        "SettingsLibSettingsTheme",
+    ],
+    sdk_version: "system_current",
+    min_sdk_version: "28",
+    apex_available: [
+        "//apex_available:platform",
+    ],
+}
diff --git a/packages/SettingsLib/ZeroStatePreference/AndroidManifest.xml b/packages/SettingsLib/ZeroStatePreference/AndroidManifest.xml
new file mode 100644
index 0000000..51b0ab8
--- /dev/null
+++ b/packages/SettingsLib/ZeroStatePreference/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.android.settingslib.widget.preference.zerostate">
+
+    <uses-sdk android:minSdkVersion="28" />
+
+</manifest>
diff --git a/packages/SettingsLib/ZeroStatePreference/res/drawable/settingslib_expressive_zerostate_background.xml b/packages/SettingsLib/ZeroStatePreference/res/drawable/settingslib_expressive_zerostate_background.xml
new file mode 100644
index 0000000..f42b441
--- /dev/null
+++ b/packages/SettingsLib/ZeroStatePreference/res/drawable/settingslib_expressive_zerostate_background.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="160dp"
+    android:height="160dp"
+    android:viewportWidth="161"
+    android:viewportHeight="161">
+    <path
+        android:pathData="M67.2,4.43C74.79,-1.41 85.35,-1.41 92.94,4.43L112.01,19.1C113.48,20.23 115.09,21.16 116.8,21.87L139.02,31.08C147.86,34.74 153.14,43.9 151.89,53.4L148.74,77.28C148.5,79.12 148.5,80.98 148.74,82.82L151.89,106.71C153.14,116.2 147.86,125.36 139.02,129.03L116.8,138.23C115.09,138.95 113.48,139.87 112.01,141L92.94,155.67C85.35,161.51 74.79,161.51 67.2,155.67L48.13,141C46.66,139.87 45.05,138.95 43.34,138.23L21.12,129.03C12.28,125.36 7,116.2 8.25,106.71L11.4,82.82C11.64,80.98 11.64,79.12 11.4,77.28L8.25,53.4C7,43.9 12.28,34.74 21.12,31.08L43.34,21.87C45.05,21.16 46.66,20.23 48.13,19.1L67.2,4.43Z"
+        android:fillColor="@color/settingslib_materialColorSurfaceContainerHigh"/>
+</vector>
diff --git a/packages/SettingsLib/ZeroStatePreference/res/layout/settingslib_expressive_preference_zerostate.xml b/packages/SettingsLib/ZeroStatePreference/res/layout/settingslib_expressive_preference_zerostate.xml
new file mode 100644
index 0000000..c0b195c
--- /dev/null
+++ b/packages/SettingsLib/ZeroStatePreference/res/layout/settingslib_expressive_preference_zerostate.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_gravity="center"
+    android:gravity="center"
+    android:orientation="vertical">
+
+    <FrameLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        tools:ignore="ContentDescription">
+
+        <ImageView
+            android:layout_width="@dimen/settingslib_expressive_zero_state_background_size"
+            android:layout_height="@dimen/settingslib_expressive_zero_state_background_size"
+            android:src="@drawable/settingslib_expressive_zerostate_background"/>
+
+        <ImageView
+            android:id="@android:id/icon"
+            android:layout_width="@dimen/settingslib_expressive_space_large3"
+            android:layout_height="@dimen/settingslib_expressive_space_large3"
+            android:layout_gravity="center"/>
+
+    </FrameLayout>
+    <TextView
+        android:id="@android:id/title"
+        android:layout_width="@dimen/settingslib_expressive_zero_state_title_width"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:layout_marginTop="@dimen/settingslib_expressive_space_small4"/>
+    <TextView
+        android:id="@android:id/summary"
+        android:layout_width="@dimen/settingslib_expressive_zero_state_title_width"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:layout_marginTop="@dimen/settingslib_expressive_space_small4"
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="?android:attr/textColorSecondary"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/ZeroStatePreference/res/values/dimens.xml b/packages/SettingsLib/ZeroStatePreference/res/values/dimens.xml
new file mode 100644
index 0000000..e981ecc
--- /dev/null
+++ b/packages/SettingsLib/ZeroStatePreference/res/values/dimens.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 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.
+-->
+
+<resources>
+    <dimen name="settingslib_expressive_zero_state_background_size">160dp</dimen>
+    <dimen name="settingslib_expressive_zero_state_title_width">316dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/ZeroStatePreference/src/com/android/settingslib/widget/ZeroStatePreference.kt b/packages/SettingsLib/ZeroStatePreference/src/com/android/settingslib/widget/ZeroStatePreference.kt
new file mode 100644
index 0000000..9b1ccef
--- /dev/null
+++ b/packages/SettingsLib/ZeroStatePreference/src/com/android/settingslib/widget/ZeroStatePreference.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2024 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.settingslib.widget
+
+import android.content.Context
+import android.graphics.PorterDuff
+import android.graphics.PorterDuffColorFilter
+import android.graphics.drawable.Drawable
+import android.util.AttributeSet
+import android.widget.ImageView
+import androidx.preference.Preference
+import androidx.preference.PreferenceViewHolder
+
+import com.android.settingslib.widget.preference.zerostate.R
+
+class ZeroStatePreference @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0,
+    defStyleRes: Int = 0
+) : Preference(context, attrs, defStyleAttr, defStyleRes) {
+
+    private val iconTint: Int = context.getColor(
+        com.android.settingslib.widget.theme.R.color.settingslib_materialColorOnSecondaryContainer
+    )
+    private var tintedIcon: Drawable? = null
+
+    init {
+        isSelectable = false
+        layoutResource = R.layout.settingslib_expressive_preference_zerostate
+        icon?.let { originalIcon ->
+            tintedIcon = originalIcon.mutate().apply {
+                colorFilter = PorterDuffColorFilter(iconTint, PorterDuff.Mode.SRC_IN)
+            }
+        }
+    }
+
+    override fun onBindViewHolder(holder: PreferenceViewHolder) {
+        super.onBindViewHolder(holder)
+
+        holder.itemView.isFocusable = false
+        holder.itemView.isClickable = false
+
+        (holder.findViewById(android.R.id.icon) as? ImageView)?.apply {
+            setImageDrawable(tintedIcon ?: icon)
+        }
+    }
+}
\ No newline at end of file
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index de728e2..0a8c6bf 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Sopas"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Hierdie foon"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Hierdie tablet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Hierdie rekenaar (intern)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofoon (intern)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dokluidspreker"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Eksterne toestel"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Gekoppelde toestel"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Gedeaktiveer"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Geaktiveer"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Jou toestel moet herselflaai om hierdie verandering toe te pas. Herselflaai nou of kanselleer."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Bedrade oorfoon"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Oorfoon"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB-oudio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofoonsok"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofoon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB-mikrofoon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aan"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Af"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Diensverskaffernetwerk verander tans"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 66644cb..56420e2 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ይህ ኮምፒውተር (ውስጣዊ)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"ማይክሮፎን (ውስጣዊ)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"የመትከያ ድምፅ ማውጫ"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"የውጭ መሣሪያ"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"የተገናኘ መሣሪያ"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"የእርስዎን መሣሪያ ይህ ለው ለማመልከት እንደገና መነሣት አለበት። አሁን እንደገና ያስነሡ ወይም ይተዉት።"</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"ባለገመድ የራስ ላይ ማዳመጫ"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"የጆሮ ማዳመጫ"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB ድምፅ ማውጫ"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB ኦዲዮ"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"የማይክሮፎን መሰኪያ"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB ማይክሮፎን"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB ማይክሮፎን"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"አብራ"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"አጥፋ"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"የአገልግሎት አቅራቢ አውታረ መረብን በመቀየር ላይ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index e241c8a..88fadbc 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"هذا الكمبيوتر (داخلي)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"ميكروفون (داخلي)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"مكبّر صوت بقاعدة إرساء"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"جهاز خارجي"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"جهاز متّصل"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"يجب إعادة تشغيل جهازك ليتم تطبيق هذا التغيير. يمكنك إعادة التشغيل الآن أو إلغاء التغيير."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"سماعات رأس سلكية"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"سماعات رأس"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"‏مكبّر صوت USB"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"‏مكبر صوت USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"مقبس الميكروفون"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"‏ميكروفون بمنفذ USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"‏ميكروفون USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"مفعّلة"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"إيقاف"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"جارٍ تغيير شبكة مشغِّل شبكة الجوّال."</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index 4e734b9..fca2953 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"এই কম্পিউটাৰ (অভ্যন্তৰীণ)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"মাইক্ৰ’ফ’ন (অভ্যন্তৰীণ)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ড’ক স্পীকাৰ"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"বাহ্যিক ডিভাইচ"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"সংযোগ হৈ থকা ডিভাইচ"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"এই সলনিটো কার্যকৰী হ’বলৈ আপোনাৰ ডিভাইচটো ৰিবুট কৰিবই লাগিব। এতিয়াই ৰিবুট কৰক অথবা বাতিল কৰক।"</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"তাঁৰযুক্ত হেডফ’ন"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"হেডফ’ন"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB স্পীকাৰ"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"ইউএছবি অডিঅ\'"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"মাইকৰ জেক"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"ইউএছবি মাইক"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"ইউএছবি মাইক্ৰ’ফ’ন"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"অন"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"অফ"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"বাহক নেটৱৰ্কৰ পৰিৱৰ্তন"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 4715109..5ba6186 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"İndicə"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Bu telefon"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Bu planşet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Bu kompüter (daxili)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (daxili)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dok dinamiki"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Xarici cihaz"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Qoşulmuş cihaz"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Deaktiv"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aktiv"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Bu dəyişikliyin tətbiq edilməsi üçün cihaz yenidən başladılmalıdır. İndi yenidən başladın və ya ləğv edin."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Naqilli qulaqlıq"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Qulaqlıq"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB audio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofon yuvası"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB mikrofon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aktiv"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Deaktiv"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Operator şəbəkəsinin dəyişilməsi"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index fdd969d..28eaeba 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ovaj računar (interno)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (interni)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Zvučnik bazne stanice"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Spoljni uređaj"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Povezani uređaj"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Morate da restartujete uređaj da bi se ova promena primenila. Restartujte ga odmah ili otkažite."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Žičane slušalice"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Slušalice"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB zvučnik"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB audio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Utikač za mikrofon"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB mikrofon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Uključeno"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Isključeno"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Promena mreže mobilnog operatera"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 2adcc43..e1da65e 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Толькі што"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Гэты тэлефон"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Гэты планшэт"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Гэты камп’ютар (унутраны)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Мікрафон (унутраны)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Дынамік док-станцыі"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Знешняя прылада"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Падключаная прылада"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Выключана"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Уключана"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Перазагрузіце прыладу, каб прымяніць гэта змяненне. Перазагрузіце ці скасуйце."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Правадныя навушнікі"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Навушнікі"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Аўдыяпрылада USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Раздым для мікрафона"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Мікрафон USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Мікрафон USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Уключана"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Выключана"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Змяненне аператара сеткі"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index df5051f..b0c2354 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -288,7 +288,7 @@
     <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"Да се разреши ли отключване от OEM?"</string>
     <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"ПРЕДУПРЕЖДЕНИЕ: Функциите за защита на устройството няма да работят, докато следната настройка е включена."</string>
     <string name="mock_location_app" msgid="6269380172542248304">"Избиране на приложение за мнимо местоположение"</string>
-    <string name="mock_location_app_not_set" msgid="6972032787262831155">"Няма зададено приложение за мнимо местоположение"</string>
+    <string name="mock_location_app_not_set" msgid="6972032787262831155">"Няма зададено приложение"</string>
     <string name="mock_location_app_set" msgid="4706722469342913843">"Приложение за мнимо местоположение: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="debug_networking_category" msgid="6829757985772659599">"Мрежи"</string>
     <string name="wifi_display_certification" msgid="1805579519992520381">"Безжичен дисплей"</string>
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Току-що"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Този телефон"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Този таблет"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Този компютър (вграден)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (вътрешен)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Високоговорител докинг станция"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Външно устройство"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Свързано устройство"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Деактивирано"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Активирано"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"За да бъде приложена тази промяна, устройството ви трябва да бъде рестартирано. Рестартирайте сега или анулирайте."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Слушалки с кабел"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Слушалки"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Аудиоустройство с USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Жак за микрофон"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Микрофон с USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Микрофон с USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Включване"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Изключване"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Промяна на мрежата на оператора"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index e7b9723..e861b57 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"এখনই"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"এই ফোন"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"এই ট্যাবলেট"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"এই কম্পিউটার (ইন্টার্নাল)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"মাইক্রোফোন (ইন্টার্নাল)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ডক স্পিকার"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"এক্সটার্নাল ডিভাইস"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"কানেক্ট থাকা ডিভাইস"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"বন্ধ করা আছে"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"চালু করা আছে"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"এই পরিবর্তনটি প্রয়োগ করার জন্য আপনার ডিভাইসটি অবশ্যই রিবুট করতে হবে। এখনই রিবুট করুন বা বাতিল করুন।"</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"তারযুক্ত হেডফোন"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"হেডফোন"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB অডিও"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"মাইকের জ্যাক"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB মাইক"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB মাইক্রোফোন"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"চালু আছে"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"বন্ধ আছে"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"পরিষেবা প্রদানকারীর নেটওয়ার্ক পরিবর্তন করা হচ্ছে"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index e8d4a7c..8844503d 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -582,10 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Upravo"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ovaj telefon"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ovaj tablet"</string>
-    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ovo računalo (interno)"</string>
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ovaj računar (interno)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (interni)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Zvučnik priključne stanice"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Vanjski uređaj"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Povezani uređaj"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Morate ponovo pokrenuti uređaj da se ova promjena primijeni. Ponovo pokrenite odmah ili otkažite."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Žičane slušalice"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Slušalice"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB zvučnik"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB audio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Priključak za mikrofon"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB mikrofon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Uključi"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Isključi"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Promjena mreže mobilnog operatera"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index d75e314..b905ae2 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -288,7 +288,7 @@
     <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"Permetre el desbloqueig OEM?"</string>
     <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"ADVERTIMENT: les funcions de protecció del dispositiu no funcionaran mentre aquesta opció estigui activada."</string>
     <string name="mock_location_app" msgid="6269380172542248304">"Selecciona una aplicació d\'ubicació simulada"</string>
-    <string name="mock_location_app_not_set" msgid="6972032787262831155">"No s\'ha definit cap aplicació d\'ubicació simulada"</string>
+    <string name="mock_location_app_not_set" msgid="6972032787262831155">"Cap aplicació d\'ubicació simulada definida"</string>
     <string name="mock_location_app_set" msgid="4706722469342913843">"Aplicació d\'ubicació simulada: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="debug_networking_category" msgid="6829757985772659599">"Xarxes"</string>
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certificació de pantalla sense fil"</string>
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Aquest ordinador (intern)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Micròfon (intern)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Base d\'altaveu"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositiu extern"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositiu connectat"</string>
@@ -688,11 +687,13 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Has de reiniciar el teu dispositiu perquè s\'apliquin els canvis. Reinicia\'l ara o cancel·la."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Auriculars amb cable"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Auriculars"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Altaveu USB"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Àudio USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Connector per al micròfon"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micròfon USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Micròfon USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activa"</string>
-    <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Desactiva"</string>
+    <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Desactivat"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"S\'està canviant la xarxa de l\'operador de telefonia mòbil"</string>
     <string name="data_connection_3g" msgid="931852552688157407">"3G"</string>
     <string name="data_connection_edge" msgid="4625509456544797637">"EDGE"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index e775050..a69374f 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Právě teď"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Tento telefon"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Tento tablet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Tento počítač (interní)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (interní)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Reproduktor doku"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Externí zařízení"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Připojené zařízení"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Vypnuto"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Zapnuto"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Aby se tato změna projevila, je třeba zařízení restartovat. Restartujte zařízení nebo zrušte akci."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Kabelová sluchátka"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Sluchátka"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Zvuk USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Konektor mikrofonu"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Mikrofon USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Zapnout"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Vypnout"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Probíhá změna sítě operátora"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index a85bc29..f14c04b 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Lige nu"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Denne telefon"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Denne tablet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Denne computer (intern)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (indbygget)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dockhøjttaler"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Ekstern enhed"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Forbundet enhed"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Deaktiveret"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aktiveret"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Din enhed skal genstartes for at anvende denne ændring. Genstart nu, eller annuller."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Høretelefoner med ledning"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Høretelefoner"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB-lydenhed"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Stik til mikrofon"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB-mikrofon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Til"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Fra"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Skift af mobilnetværk"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 9ba5b50..972bb1f 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Gerade eben"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Dieses Smartphone"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Dieses Tablet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Dieser Computer (intern)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (intern)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dock-Lautsprecher"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Externes Gerät"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Verbundenes Gerät"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Deaktiviert"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aktiviert"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Damit diese Änderung übernommen wird, musst du dein Gerät neu starten. Du kannst es jetzt neu starten oder den Vorgang abbrechen."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Kabelgebundene Kopfhörer"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Kopfhörer"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB-Audio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofonanschluss"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB‑Mikrofon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB-Mikrofon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"An"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Aus"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Mobilfunknetzwerk wird gewechselt"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index ce045a9..86a4cb9 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -287,7 +287,7 @@
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Να επιτρέπεται το ξεκλείδωμα λειτουργίας εκκίνησης"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"Να επιτρέπεται το ξεκλείδωμα OEM;"</string>
     <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Οι λειτουργίες προστασίας συσκευής δεν θα λειτουργούν σε αυτήν τη συσκευή, όταν είναι ενεργοποιημένη αυτή η ρύθμιση."</string>
-    <string name="mock_location_app" msgid="6269380172542248304">"Επιλογή εφ/γής τεχνητής τοπ/σίας"</string>
+    <string name="mock_location_app" msgid="6269380172542248304">"Επιλογή εφαρμ. τεχνητής τοποθ."</string>
     <string name="mock_location_app_not_set" msgid="6972032787262831155">"Δεν ορίστηκε εφαρμογή τεχνητής τοποθεσίας"</string>
     <string name="mock_location_app_set" msgid="4706722469342913843">"Εφαρμογή τεχνητής τοποθεσίας: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="debug_networking_category" msgid="6829757985772659599">"Δικτύωση"</string>
@@ -329,7 +329,7 @@
     <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Όταν ενεργοποιηθεί αυτή η λειτουργία, η διεύθυνση MAC αυτής της συσκευής μπορεί να αλλάζει κάθε φορά που συνδέεται σε ένα δίκτυο όπου έχει ενεργοποιηθεί η τυχαία σειρά διευθύνσεων MAC."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Μέτρηση με βάση τη χρήση"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Χωρίς μέτρηση με βάση τη χρήση"</string>
-    <string name="select_logd_size_title" msgid="1604578195914595173">"Μέγεθος προσωρινής μνήμης για τη λειτουργία καταγραφής"</string>
+    <string name="select_logd_size_title" msgid="1604578195914595173">"Μέγεθος προσωρινής μνήμης για τη λειτ. καταγραφής"</string>
     <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"Μέγεθος αρχείων κατ/φής ανά προ/νή μνήμη αρχείου κατ/φής"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"Εκκαθάριση αποθηκευτικού χώρου μόνιμων αρχείων καταγραφής;"</string>
     <string name="dev_logpersist_clear_warning_message" msgid="6447590867594287413">"Όταν δεν γίνεται πλέον παρακολούθηση με μόνιμο αρχείο καταγραφής, θα πρέπει να διαγραφούν τα δεδομένα του αρχείου καταγραφής στη συσκευή σας."</string>
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Μόλις τώρα"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Αυτό το τηλέφωνο"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Αυτό το tablet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Αυτός ο υπολογιστής (εσωτερ.)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Μικρόφωνο (εσωτερικό)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Ηχείο βάσης σύνδεσης"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Εξωτερική συσκευή"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Συνδεδεμένη συσκευή"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Ανενεργή"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Ενεργή"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Για να εφαρμοστεί αυτή η αλλαγή, θα πρέπει να επανεκκινήσετε τη συσκευή σας. Επανεκκίνηση τώρα ή ακύρωση."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Ενσύρματα ακουστικά"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Ακουστικά"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Ήχος USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Υποδοχή μικροφώνου"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Μικρόφωνο USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Μικρόφωνο USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Ενεργό"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Ανενεργό"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Αλλαγή δικτύου εταιρείας κινητής τηλεφωνίας"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index d4e01de..7296c96 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"This computer (internal)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microphone (internal)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dock speaker"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"External device"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Connected device"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Wired headphones"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Headphone"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB speaker"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB audio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mic jack"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mic"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB microphone"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"On"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Off"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Operator network changing"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 602a0ed..c07bd34 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"This computer (internal)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microphone (internal)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dock speaker"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"External Device"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Connected device"</string>
@@ -688,9 +687,10 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Wired headphone"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Headphone"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB speaker"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB audio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mic jack"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mic"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB microphone"</string>
+    <string name="media_transfer_bt_device_mic_name" msgid="1870669402238687618">"BT microphone"</string>
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"On"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Off"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Carrier network changing"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index d4e01de..7296c96 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"This computer (internal)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microphone (internal)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dock speaker"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"External device"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Connected device"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Wired headphones"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Headphone"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB speaker"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB audio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mic jack"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mic"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB microphone"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"On"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Off"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Operator network changing"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index d4e01de..7296c96 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"This computer (internal)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microphone (internal)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dock speaker"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"External device"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Connected device"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Wired headphones"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Headphone"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB speaker"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB audio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mic jack"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mic"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB microphone"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"On"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Off"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Operator network changing"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 0731b72..c85b12a 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‏‏‎‎‏‏‎‎‏‏‏‎‎‏‎‏‎‏‏‏‏‎‏‎‎‎This computer (internal)‎‏‎‎‏‎"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎‎‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‏‏‎‎‎‎‏‎‎‎‎‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‏‏‏‎‎‏‏‎Microphone (internal)‎‏‎‎‏‎"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‏‎‏‏‏‎‏‎‏‎‏‎‏‏‏‏‎‎Dock speaker‎‏‎‎‏‎"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‏‎‎‏‎‎‏‎‎‏‎‎External Device‎‏‎‎‏‎"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‎‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‏‎‏‎‎‎Connected device‎‏‎‎‏‎"</string>
@@ -688,9 +687,10 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‏‏‎‏‎‎‏‏‎‎‏‎‎‏‏‏‏‎‏‏‏‎‏‏‎‏‎‏‎‎‏‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‏‎‎‎‎‎Your device must be rebooted for this change to apply. Reboot now or cancel.‎‏‎‎‏‎"</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‎‏‎‎‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‏‎‎‏‏‎‎Wired headphone‎‏‎‎‏‎"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎Headphone‎‏‎‎‏‎"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‎‎‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‎‎USB speaker‎‏‎‎‏‎"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‎‏‏‎‏‎‏‎‎‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎USB audio‎‏‎‎‏‎"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‎‏‎‏‎‎‎‏‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‎‏‏‎‎‎‏‎‏‏‏‎‎‎‏‎‏‎Mic jack‎‏‎‎‏‎"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‏‎‎USB mic‎‏‎‎‏‎"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‎‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎USB microphone‎‏‎‎‏‎"</string>
+    <string name="media_transfer_bt_device_mic_name" msgid="1870669402238687618">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‏‎‎‎‎‎‏‎‎BT microphone‎‏‎‎‏‎"</string>
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‎‎‎‎‏‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎On‎‏‎‎‏‎"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‎‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‏‏‎‎‏‏‎‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎Off‎‏‎‎‏‎"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‎‏‏‎‎‎‎‏‏‏‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‏‏‏‎‏‏‏‎‎‎‏‏‏‎‏‎‎Carrier network changing‎‏‎‎‏‎"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index b0d360d..c933c7e 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Recién"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este teléfono"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Esta tablet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Esta computadora (interna)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Micrófono (interno)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Bocina de la estación de carga"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo externo"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo conectado"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Inhabilitado"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Habilitado"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Debes reiniciar el dispositivo para que se aplique el cambio. Reinícialo ahora o cancela la acción."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Auriculares con cable"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Auriculares"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Audio USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Conector para micrófono"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micrófono USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Micrófono USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activar"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Desactivar"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Cambio de proveedor de red"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 716713a..6215e77 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"justo ahora"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este teléfono"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Esta tablet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Este ordenador (interno)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Micrófono (interno)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Altavoz de la base"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo externo"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo conectado"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Inhabilitado"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Habilitado"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Es necesario reiniciar tu dispositivo para que se apliquen los cambios. Reinicia ahora o cancela la acción."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Auriculares con cable"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Auriculares"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Audio USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Conector jack para micrófono"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micrófono USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Micrófono USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activado"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Desactivado"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Cambiando la red del operador"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index f1975fa..81926e5 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Äsja"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"See telefon"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"See tahvelarvuti"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"See arvuti (sisemine)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (sisemine)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Doki kõlar"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Väline seade"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Ühendatud seade"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Keelatud"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Lubatud"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Selle muudatuse rakendamiseks tuleb seade taaskäivitada. Taaskäivitage kohe või tühistage."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Juhtmega kõrvaklapid"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Kõrvaklapid"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB-heli"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofoni pistikupesa"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB-mikrofon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Sees"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Väljas"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Operaatori võrku muudetakse"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index fc4157c..45c2daa 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Oraintxe"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Telefono hau"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Tableta hau"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ordenagailu hau (barnekoa)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofonoa (barnekoa)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Oinarri bozgorailuduna"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Kanpoko gailua"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Konektatutako gailua"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Desgaituta"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Gaituta"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Aldaketa aplikatzeko, berrabiarazi egin behar da gailua. Berrabiaraz ezazu orain, edo utzi bertan behera."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Entzungailu kableduna"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Entzungailua"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB bidezko audioa"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofonoaren konektorea"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB bidezko mikrofonoa"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB bidezko mikrofonoa"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aktibatu"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Desaktibatu"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Operadorearen sarea aldatzen"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 3dc0e85..af96924 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -239,10 +239,10 @@
     <string name="category_work" msgid="4014193632325996115">"کاری"</string>
     <string name="category_private" msgid="4244892185452788977">"خصوصی"</string>
     <string name="category_clone" msgid="1554511758987195974">"همسانه‌سازی"</string>
-    <string name="development_settings_title" msgid="140296922921597393">"گزینه‌های برنامه‌نویسان"</string>
-    <string name="development_settings_enable" msgid="4285094651288242183">"فعال کردن گزینه‌های برنامه‌نویس"</string>
+    <string name="development_settings_title" msgid="140296922921597393">"گزینه‌های توسعه‌دهندگان"</string>
+    <string name="development_settings_enable" msgid="4285094651288242183">"فعال کردن گزینه‌های توسعه‌دهندگان"</string>
     <string name="development_settings_summary" msgid="8718917813868735095">"تنظیم گزینه‌های مربوط به طراحی برنامه"</string>
-    <string name="development_settings_not_available" msgid="355070198089140951">"گزینه‌های برنامه‌نویس برای این کاربر موجود نیست"</string>
+    <string name="development_settings_not_available" msgid="355070198089140951">"گزینه‌های توسعه‌دهندگان برای این کاربر موجود نیست"</string>
     <string name="vpn_settings_not_available" msgid="2894137119965668920">"‏تنظیمات VPN برای این کاربر در دسترس نیست"</string>
     <string name="tethering_settings_not_available" msgid="266821736434699780">"تنظیمات اشتراک‌گذاری اینترنت برای این کاربر در دسترس نیست"</string>
     <string name="apn_settings_not_available" msgid="1147111671403342300">"تنظیمات نام تقطه دسترسی برای این کاربر در دسترس نیست"</string>
@@ -287,8 +287,8 @@
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"اجازه دهید قفل بوت‌لودر باز شود"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"‏بازکردن سازنده تجهیزات اصلی مجاز (OEM) است؟"</string>
     <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"اخطار: قابلیت‌های حفاظتی دستگاه وقتی این تنظیم روشن است در این دستگاه کار نمی‌کند."</string>
-    <string name="mock_location_app" msgid="6269380172542248304">"انتخاب برنامه موقعیت مکانی ساختگی"</string>
-    <string name="mock_location_app_not_set" msgid="6972032787262831155">"هیچ برنامه موقعیت مکانی ساختگی تنظیم نشده است"</string>
+    <string name="mock_location_app" msgid="6269380172542248304">"انتخاب برنامه مکان ساختگی"</string>
+    <string name="mock_location_app_not_set" msgid="6972032787262831155">"برنامه مکان ساختگی تنظیم نشده است"</string>
     <string name="mock_location_app_set" msgid="4706722469342913843">"برنامه موقعیت مکانی ساختگی: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="debug_networking_category" msgid="6829757985772659599">"شبکه"</string>
     <string name="wifi_display_certification" msgid="1805579519992520381">"گواهینامه نمایش بی‌سیم"</string>
@@ -376,7 +376,7 @@
     <string name="strict_mode_summary" msgid="1838248687233554654">"چشمک زدن صفحه هنگام انجام عملیات طولانی توسط برنامه‌ها در رشته اصلی"</string>
     <string name="pointer_location" msgid="7516929526199520173">"محل اشاره‌گر"</string>
     <string name="pointer_location_summary" msgid="957120116989798464">"هم‌پوشانی صفحه‌نمایش با نمایش داده لمسی فعلی"</string>
-    <string name="show_touches" msgid="8437666942161289025">"نمایش ضربه‌ها"</string>
+    <string name="show_touches" msgid="8437666942161289025">"نمایش تک‌ضرب‌ها"</string>
     <string name="show_touches_summary" msgid="3692861665994502193">"نمایش بازخورد تصویری برای ضربه‌ها"</string>
     <string name="show_key_presses" msgid="6360141722735900214">"نمایش فشار کلیدها"</string>
     <string name="show_key_presses_summary" msgid="725387457373015024">"نمایش بازخورد بصری برای فشار دادن کلیدهای فیزیکی"</string>
@@ -397,7 +397,7 @@
     <string name="usb_audio_disable_routing_summary" msgid="8768242894849534699">"‏غیرفعال کردن مسیریابی خودکار به وسایل جانبی صوتی USB"</string>
     <string name="debug_layout" msgid="1659216803043339741">"نمایش محدوده‌های طرح‌بندی"</string>
     <string name="debug_layout_summary" msgid="8825829038287321978">"نمایش مرزها، حاشیه‌ها و ویژگی‌های دیگر کلیپ."</string>
-    <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"اجباری کردن چیدمان راست‌چین"</string>
+    <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"الزام جانمایی راست به چپ"</string>
     <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"اجباری کردن چیدمان راست‌چین صفحه برای همه زبان‌ها"</string>
     <string name="transparent_navigation_bar" msgid="1933192171384678484">"نوار پیمایش شفاف"</string>
     <string name="transparent_navigation_bar_summary" msgid="5454359021817330722">"رنگ پس‌زمینه نوار پیمایش را به‌طور پیش‌فرض شفاف می‌کند"</string>
@@ -418,7 +418,7 @@
     <string name="verbose_vendor_logging_preference_summary_on" msgid="9017757242481762036">"به‌طور نامحدود فعال شد"</string>
     <string name="window_animation_scale_title" msgid="5236381298376812508">"مقیاس پویانمایی پنجره"</string>
     <string name="transition_animation_scale_title" msgid="1278477690695439337">"مقیاس پویانمایی انتقالی"</string>
-    <string name="animator_duration_scale_title" msgid="7082913931326085176">"مقیاس طول مدت انیماتور"</string>
+    <string name="animator_duration_scale_title" msgid="7082913931326085176">"مقیاس طول مدت مقیاس مدت پویانماساز"</string>
     <string name="overlay_display_devices_title" msgid="5411894622334469607">"شبیه‌سازی نمایشگر ثانویه"</string>
     <string name="debug_applications_category" msgid="5394089406638954196">"برنامه‌ها"</string>
     <string name="immediately_destroy_activities" msgid="1826287490705167403">"فعالیت‌ها نگه داشته نشوند"</string>
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"این رایانه (داخلی)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"میکروفون (داخلی)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"بلندگوی پایه اتصال"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"دستگاه خارجی"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"دستگاه متصل"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"برای اعمال این تغییر، دستگاه باید بازراه‌اندازی شود. یا اکنون بازراه‌اندازی کنید یا لغو کنید."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"هدفون سیمی"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"هدفون"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"‏بلندگوی USB"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"‏بلندگوی USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"فیش میکروفون"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"‏میکروفون USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"‏میکروفون USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"روشن"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"خاموش"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"تغییر شبکه شرکت مخابراتی"</string>
@@ -734,7 +735,7 @@
     <string name="back_navigation_animation" msgid="8105467568421689484">"پویانمایی‌های اشاره برگشت پیش‌گویانه"</string>
     <string name="back_navigation_animation_summary" msgid="741292224121599456">"پویانمایی‌های سیستم را برای اشاره برگشت پیش‌گویانه فعال کنید."</string>
     <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"‏این تنظیم پویانمایی‌های سیستم را برای پویانمایی اشاره برگشت پیش‌بینانه فعال می‌کند. این تنظیم مستلزم تنظیم شدن enableOnBackInvokedCallback مربوط به هر برنامه روی صحیح در فایل مانیفست است."</string>
-    <string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>٪"</string>
+    <string name="font_scale_percentage" msgid="2624057443622817886">"‎%%<xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string>
     <string name="not_specified" msgid="5423502443185110328">"نامشخص"</string>
     <string name="neuter" msgid="2075249330106127310">"خنثی"</string>
     <string name="feminine" msgid="1529155595310784757">"مؤنث"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index b92616b..ab4ac1e 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Äsken"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Tämä puhelin"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Tämä tabletti"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Tämä tietokone (sisäinen)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofoni (sisäinen)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Telinekaiutin"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Ulkoinen laite"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Yhdistetty laite"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Ei käytössä"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Käytössä"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Laitteesi on käynnistettävä uudelleen, jotta muutos tulee voimaan. Käynnistä uudelleen nyt tai peru."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Langalliset kuulokkeet"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Kuulokkeet"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB-audio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofoniliitäntä"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofoni"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB-mikrofoni"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Päällä"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Ei käytössä"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Operaattorin verkko muuttuu"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index bf9adba..05157b7 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"À l\'instant"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ce téléphone"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Cette tablette"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Cet ordinateur (interne)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microphone (interne)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Haut-parleur du socle"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Appareil externe"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Appareil connecté"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Désactivé"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Activé"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Votre appareil doit être redémarré pour que ce changement prenne effet. Redémarrez-le maintenant ou annulez la modification."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Écouteurs filaires"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Écouteurs"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Audio par USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Prise du microphone"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Microphone USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Microphone USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activé"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Désactivé"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Changer de réseau de fournisseur de services"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 0df9489..31616a7 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"À l\'instant"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ce téléphone"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Cette tablette"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Cet ordinateur (interne)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Micro (interne)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Haut-parleur station d\'accueil"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Appareil externe"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Appareil connecté"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Désactivé"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Activé"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Vous devez redémarrer l\'appareil pour que cette modification soit appliquée. Redémarrez maintenant ou annulez l\'opération."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Casque filaire"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Casque audio"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Audio USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Connecteur micro"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micro USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Micro USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Allumé"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Éteint"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Modification du réseau de l\'opérateur"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 98a1401..2fccfba 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Agora mesmo"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este teléfono"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Esta tableta"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Este ordenador (interno)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Micrófono (interno)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Altofalante da base"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo externo"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo conectado"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Desactivado"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Activado"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"É necesario reiniciar o teu dispositivo para aplicar este cambio. Reiníciao agora ou cancela o cambio."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Auriculares con cable"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Auriculares"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Audio USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Conector do micrófono"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micrófono USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Micrófono USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activada"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Desactivada"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Cambio de rede do operador"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index aa768f8..3209b07 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"આ કમ્પ્યૂટર (આંતરિક)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"માઇક્રોફોન (આંતરિક)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ડૉક સ્પીકર"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"બહારનું ડિવાઇસ"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"કનેક્ટ કરેલું ડિવાઇસ"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"આ ફેરફારને લાગુ કરવા માટે તમારા ડિવાઇસને રીબૂટ કરવાની જરૂર છે. હમણાં જ રીબૂટ કરો કે રદ કરો."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"વાયરવાળો હૅડફોન"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"હૅડફોન"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB સ્પીકર"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB ઑડિયો"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"માઇક જૅક"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB માઇક"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB માઇક્રોફોન"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ચાલુ"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"બંધ"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"કૅરીઅર નેટવર્કમાં ફેરફાર થઈ રહ્યો છે"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index b8e55b5..ef93e78 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"इस कंप्यूटर पर (इंटरनल)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"माइक्रोफ़ोन (इंटरनल)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"डॉक स्पीकर"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"बाहरी डिवाइस"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"कनेक्ट किया गया डिवाइस"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"बदली गई सेटिंग को लागू करने के लिए, डिवाइस को रीस्टार्ट करना होगा. अपने डिवाइस को रीस्टार्ट करें या रद्द करें."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"तार वाला हेडफ़ोन"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"हेडफ़ोन"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"यूएसबी स्पीकर"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"यूएसबी ऑडियो"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"माइक्रोफ़ोन जैक"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"यूएसबी माइक्रोफ़ोन"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"यूएसबी माइक्रोफ़ोन"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"चालू है"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"बंद है"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"मोबाइल और इंटरनेट सेवा देने वाली कंपनी का नेटवर्क बदल रहा है"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 45ac8c2..7fda17b 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ovo računalo (interno)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (ugrađeni)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Zvučnik priključne stanice"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Vanjski uređaj"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Povezani uređaj"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Uređaj se mora ponovno pokrenuti da bi se ta promjena primijenila. Ponovo pokrenite uređaj odmah ili odustanite."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Žičane slušalice"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Slušalice"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB zvučnik"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB zvučnik"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Utičnica za mikrofon"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB mikrofon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Uključeno"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Isključeno"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Promjena mreže mobilnog operatera"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 62f4777..838965f 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Az imént"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ez a telefon"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ez a táblagép"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ez a számítógép (belső)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (belső)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dokkhangszóró"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Külső eszköz"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Csatlakoztatott eszköz"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Letiltva"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Engedélyezve"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Az eszközt újra kell indítani, hogy a módosítás megtörténjen. Indítsa újra most, vagy vesse el a módosítást."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Vezetékes fejhallgató"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Fejhallgató"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB-hangeszköz"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofon jack csatlakozója"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB-mikrofon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Be"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Ki"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Szolgáltatói hálózat váltása"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index ba4e204..6ad7007 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Հենց նոր"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Այս հեռախոսը"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Այս պլանշետը"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Այս համակարգիչը (ներքին)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Խոսափող (ներքին)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Դոկ-կայանով բարձրախոս"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Արտաքին սարք"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Միացված սարք"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Անջատված է"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Միացված է"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Սարքն անհրաժեշտ է վերագործարկել, որպեսզի փոփոխությունը կիրառվի։ Վերագործարկեք հիմա կամ չեղարկեք փոփոխությունը։"</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Լարով ականջակալ"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Ականջակալ"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB աուդիո"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Խոսափողի հարակցիչ"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB խոսափող"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB խոսափող"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Միացնել"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Անջատել"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Օպերատորի ցանցի փոփոխություն"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 89d82f0..c6f0800 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -288,7 +288,7 @@
     <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"Izinkan buka kunci OEM?"</string>
     <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"PERINGATAN: Fitur perlindungan perangkat tidak akan berfungsi di perangkat ini saat setelan diaktifkan."</string>
     <string name="mock_location_app" msgid="6269380172542248304">"Pilih aplikasi lokasi palsu"</string>
-    <string name="mock_location_app_not_set" msgid="6972032787262831155">"Tidak ada aplikasi lokasi palsu yang disetel"</string>
+    <string name="mock_location_app_not_set" msgid="6972032787262831155">"Tidak ada aplikasi lokasi simulasi yang disetel"</string>
     <string name="mock_location_app_set" msgid="4706722469342913843">"Aplikasi lokasi palsu: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="debug_networking_category" msgid="6829757985772659599">"Jaringan"</string>
     <string name="wifi_display_certification" msgid="1805579519992520381">"Sertifikasi layar nirkabel"</string>
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Baru saja"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ponsel ini"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Tablet ini"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Komputer ini (internal)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (internal)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Speaker dok"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Perangkat Eksternal"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Perangkat yang terhubung"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Nonaktif"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aktif"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Perangkat Anda harus di-reboot agar perubahan ini diterapkan. Reboot sekarang atau batalkan."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Headphone berkabel"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Headphone"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Audio USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Colokan mikrofon"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Mikrofon USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Mikrofon USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aktif"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Nonaktif"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Jaringan operator berubah"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index b5d1831..2688e0b 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Rétt í þessu"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Þessi sími"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Þessi spjaldtölva"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Þessi tölva (innbyggður)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Hljóðnemi (innbyggður)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Hátalaradokka"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Ytra tæki"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Tengt tæki"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Slökkt"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Virkt"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Endurræsa þarf tækið til að þessi breyting taki gildi. Endurræstu núna eða hættu við."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Heyrnartól með snúru"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Heyrnartól"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB-hljóð"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Hljóðnematengi"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-hljóðnemi"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB-hljóðnemi"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Kveikt"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Slökkt"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Skiptir um farsímakerfi"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 1436c17..c0f1557 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Adesso"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Questo smartphone"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Questo tablet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Questo computer (interno)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microfono (interno)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Base con altoparlante"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo esterno"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo connesso"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Non attivo"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Attivo"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Per applicare questa modifica, devi riavviare il dispositivo. Riavvia ora o annulla."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Cuffie con cavo"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Cuffie"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Audio USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Jack per microfono"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Microfono USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Microfono USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"On"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Off"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Cambio della rete dell\'operatore"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 986fcb9..f1020ca 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"הרגע"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"הטלפון הזה"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"הטאבלט הזה"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"המחשב הזה (פנימי)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"מיקרופון (פנימי)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"רמקול של אביזר העגינה"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"מכשיר חיצוני"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"המכשיר המחובר"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"מושבת"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"מופעל"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"צריך להפעיל מחדש את המכשיר כדי להחיל את השינוי. יש להפעיל מחדש עכשיו או לבטל."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"אוזניות חוטיות"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"אוזניות"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"‏אודיו ב-USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"שקע למיקרופון"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"‏מיקרופון USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"‏מיקרופון ב-USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"פועלת"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"מצב כבוי"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"רשת ספק משתנה"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 185c6c9..ae68a03 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"このパソコン(内蔵)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"マイク(内蔵)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ホルダー スピーカー"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"外部デバイス"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"接続済みのデバイス"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"この変更を適用するには、デバイスの再起動が必要です。今すぐ再起動するか、キャンセルしてください。"</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"有線ヘッドフォン"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ヘッドフォン"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB スピーカー"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB オーディオ"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"マイク差込口"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB マイク"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB マイク"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ON"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"OFF"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"携帯通信会社のネットワークを変更します"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 9532c3a..850ddf1 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ეს კომპიუტერი (შიდა)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"მიკროფონი (შიდა)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"სამაგრის დინამიკი"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"გარე მოწყობილობა"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"დაკავშირებული მოწყობილობა"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ამ ცვლილების ასამოქმედებლად თქვენი მოწყობილობა უნდა გადაიტვირთოს. გადატვირთეთ ახლავე ან გააუქმეთ."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"სადენიანი ყურსასმენი"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ყურსასმენი"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB დინამიკი"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB აუდიო"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"მიკროფონის ჯეკი"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB მიკროფონი"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB მიკროფონი"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ჩართვა"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"გამორთვა"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"ოპერატორის ქსელის შეცვლა"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 6789f40..0cf0e04 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Дәл қазір"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Осы телефон"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Осы планшет"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Осы компьютер (ішкі)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (ішкі)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Динамигі бар қондыру станциясы"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Сыртқы құрылғы"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Жалғанған құрылғы"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Өшірулі"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Қосулы"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Бұл өзгеріс күшіне енуі үшін, құрылғыны қайта жүктеу керек. Қазір қайта жүктеңіз не бас тартыңыз."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Сымды құлақаспап"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Құлақаспап"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB аудио"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Микрофон ұяшығы"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB микрофоны"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB микрофон"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Қосу"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Өшіру"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Оператор желісін өзгерту"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 43807a0..0d22701 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -388,7 +388,7 @@
     <string name="show_hw_screen_updates_summary" msgid="3539770072741435691">"ទិដ្ឋភាព​បញ្ចេញពន្លឺភ្លឹបភ្លែត​នៅក្នុង​វិនដូនៅ​ពេលគូរ"</string>
     <string name="show_hw_layers_updates" msgid="5268370750002509767">"បង្ហាញ​​បច្ចុប្បន្នភាព​ស្រទាប់​ហាតវែរ"</string>
     <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"ស្រទាប់​ហាតវែរ​បញ្ចេញ​ពន្លឺ​បៃ​តង​នៅពេលធ្វើ​បច្ចុប្បន្នភាព"</string>
-    <string name="debug_hw_overdraw" msgid="8944851091008756796">"ជួសជុល​ការគូរលើស GPU"</string>
+    <string name="debug_hw_overdraw" msgid="8944851091008756796">"ជួសជុលការដាក់បង្ហាញពីលើច្រើនជ្រុលរបស់ GPU"</string>
     <string name="disable_overlays" msgid="4206590799671557143">"បិទ​ការ​ត្រួត HW"</string>
     <string name="disable_overlays_summary" msgid="1954852414363338166">"ប្រើ GPU ជា​និច្ច​សម្រាប់​​ផ្សំ​អេក្រង់"</string>
     <string name="simulate_color_space" msgid="1206503300335835151">"ត្រាប់តាមគំរូពណ៌"</string>
@@ -417,8 +417,8 @@
     <string name="verbose_vendor_logging_preference_summary_will_disable" msgid="6175431593394522553">"បិទក្រោយពេលមួយថ្ងៃ"</string>
     <string name="verbose_vendor_logging_preference_summary_on" msgid="9017757242481762036">"បានបើកដោយគ្មានពេលកំណត់"</string>
     <string name="window_animation_scale_title" msgid="5236381298376812508">"មាត្រដ្ឋាន​ចលនា​វិនដូ"</string>
-    <string name="transition_animation_scale_title" msgid="1278477690695439337">"មាត្រដ្ឋាន​ដំណើរ​ផ្លាស់ប្ដូរ​ចលនា"</string>
-    <string name="animator_duration_scale_title" msgid="7082913931326085176">"មាត្រដ្ឋាន​រយៈពេល​នៃ​កម្មវិធី​ចលនា"</string>
+    <string name="transition_animation_scale_title" msgid="1278477690695439337">"មាត្រដ្ឋាន​ចលនាបែបផែនឆ្លង"</string>
+    <string name="animator_duration_scale_title" msgid="7082913931326085176">"មាត្រដ្ឋាន​រយៈពេល​ចលនា"</string>
     <string name="overlay_display_devices_title" msgid="5411894622334469607">"ត្រាប់ជាអេក្រង់​ទី​ពីរ"</string>
     <string name="debug_applications_category" msgid="5394089406638954196">"កម្មវិធី"</string>
     <string name="immediately_destroy_activities" msgid="1826287490705167403">"កុំ​រក្សា​ទុកសកម្មភាព"</string>
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"កុំព្យូទ័រនេះ (ខាងក្នុង)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"មីក្រូហ្វូន (ខាងក្នុង)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ឧបាល័រជើងទម្រ"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"ឧបករណ៍ខាងក្រៅ"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"​ឧបករណ៍ដែលបាន​ភ្ជាប់"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ត្រូវតែ​ចាប់ផ្ដើម​ឧបករណ៍​របស់អ្នក​ឡើងវិញ ដើម្បីឱ្យ​ការផ្លាស់ប្ដូរ​នេះ​មានប្រសិទ្ធភាព។ ចាប់ផ្ដើមឡើងវិញ​ឥឡូវនេះ ឬ​បោះបង់​។"</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"កាស​មានខ្សែ"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"កាស"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"ឧបករណ៍បំពងសំឡេង USB"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"ឧបករណ៍បំពងសំឡេង USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"ឌុយ​មីក្រូហ្វូន"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"មីក្រូហ្វូន USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"មីក្រូហ្វូន USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"បើក"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"បិទ"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"បណ្តាញ​ក្រុមហ៊ុនសេវាទូរសព្ទ​កំពុងផ្លាស់ប្តូរ"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 29417d6..3dc663a 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -241,7 +241,7 @@
     <string name="category_clone" msgid="1554511758987195974">"ಕ್ಲೋನ್"</string>
     <string name="development_settings_title" msgid="140296922921597393">"ಡೆವಲಪರ್ ಆಯ್ಕೆಗಳು"</string>
     <string name="development_settings_enable" msgid="4285094651288242183">"ಡೆವಲಪರ್ ಆಯ್ಕೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
-    <string name="development_settings_summary" msgid="8718917813868735095">"ಅಪ್ಲಿಕೇಶನ್ ಅಭಿವೃದ್ಧಿಗಾಗಿ ಆಯ್ಕೆಗಳನ್ನು ಹೊಂದಿಸಿ"</string>
+    <string name="development_settings_summary" msgid="8718917813868735095">"ಆ್ಯಪ್‌ ಅಭಿವೃದ್ಧಿಗಾಗಿ ಆಯ್ಕೆಗಳನ್ನು ಹೊಂದಿಸಿ"</string>
     <string name="development_settings_not_available" msgid="355070198089140951">"ಈ ಬಳಕೆದಾರರಿಗೆ ಡೆವಲಪರ್‌ ಆಯ್ಕೆಗಳು ಲಭ್ಯವಿಲ್ಲ"</string>
     <string name="vpn_settings_not_available" msgid="2894137119965668920">"VPN ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಈ ಬಳಕೆದಾರರಿಗೆ ಲಭ್ಯವಿಲ್ಲ"</string>
     <string name="tethering_settings_not_available" msgid="266821736434699780">"ಟೆಥರಿಂಗ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಈ ಬಳಕೆದಾರರಿಗೆ ಲಭ್ಯವಿಲ್ಲ"</string>
@@ -287,9 +287,9 @@
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"ಬೂಟ್‌ಲೋಡರ್‌ ಅನ್‌ಲಾಕ್‌ ಮಾಡಲು ಅನುಮತಿಸಿ"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"OEM ಅನ್‌ಲಾಕ್‌ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
     <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"ಎಚ್ಚರಿಕೆ: ಈ ಸೆಟ್ಟಿಂಗ್‌ ಆನ್‌ ಇರುವಾಗ ಈ ಸಾಧನದಲ್ಲಿ ಸಾಧನ ಸಂರಕ್ಷಣಾ ವೈಶಿಷ್ಟ್ಯಗಳು ಕಾರ್ಯ ನಿರ್ವಹಿಸುವುದಿಲ್ಲ."</string>
-    <string name="mock_location_app" msgid="6269380172542248304">"ಅಣಕು ಸ್ಥಳ ಅಪ್ಲಿಕೇಶನ್ ಆಯ್ಕೆಮಾಡಿ"</string>
-    <string name="mock_location_app_not_set" msgid="6972032787262831155">"ಯಾವುದೇ ಅಣಕು ಸ್ಥಳ ಅಪ್ಲಿಕೇಶನ್ ಹೊಂದಿಕೆಯಾಗಿಲ್ಲ"</string>
-    <string name="mock_location_app_set" msgid="4706722469342913843">"ಅಣಕು ಸ್ಥಳ ಅಪ್ಲಿಕೇಶನ್: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="mock_location_app" msgid="6269380172542248304">"ಅಣಕು ಸ್ಥಳ ಆ್ಯಪ್‌ ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="mock_location_app_not_set" msgid="6972032787262831155">"ಯಾವುದೇ ಅಣಕು ಸ್ಥಳ ಆ್ಯಪ್‌ ಹೊಂದಿಕೆಯಾಗಿಲ್ಲ"</string>
+    <string name="mock_location_app_set" msgid="4706722469342913843">"ಅಣಕು ಸ್ಥಳ ಆ್ಯಪ್‌: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="debug_networking_category" msgid="6829757985772659599">"ನೆಟ್‌ವರ್ಕಿಂಗ್"</string>
     <string name="wifi_display_certification" msgid="1805579519992520381">"ವೈರ್‌ಲೆಸ್ ಪ್ರದರ್ಶನ ಪ್ರಮಾಣೀಕರಣ"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi‑Fi ವೆರ್ಬೋಸ್ ಲಾಗಿಂಗ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
@@ -356,17 +356,17 @@
     <string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ಬ್ಲೂಟೂತ್ Gabeldorsche ವೈಶಿಷ್ಟ್ಯದ ಸ್ಟ್ಯಾಕ್‌ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ."</string>
     <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"ವರ್ಧಿತ ಸಂಪರ್ಕ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ"</string>
     <string name="enable_terminal_title" msgid="3834790541986303654">"ಸ್ಥಳೀಯ ಟರ್ಮಿನಲ್"</string>
-    <string name="enable_terminal_summary" msgid="2481074834856064500">"ಸ್ಥಳೀಯ ಶೆಲ್ ಪ್ರವೇಶವನ್ನು ಒದಗಿಸುವ ಟರ್ಮಿನಲ್ ಅಪ್ಲಿಕೇಶನ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
+    <string name="enable_terminal_summary" msgid="2481074834856064500">"ಸ್ಥಳೀಯ ಶೆಲ್ ಪ್ರವೇಶವನ್ನು ಒದಗಿಸುವ ಟರ್ಮಿನಲ್ ಆ್ಯಪ್‌ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP ಪರೀಕ್ಷಿಸುವಿಕೆ"</string>
     <string name="hdcp_checking_dialog_title" msgid="7691060297616217781">"HDCP ಪರಿಶೀಲನಾ ನಡವಳಿಕೆಯನ್ನು ಹೊಂದಿಸಿ"</string>
     <string name="debug_debugging_category" msgid="535341063709248842">"ಡೀಬಗ್ ಮಾಡುವಿಕೆ"</string>
-    <string name="debug_app" msgid="8903350241392391766">"ಡೀಬಗ್ ಅಪ್ಲಿಕೇಶನ್‌ ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="debug_app" msgid="8903350241392391766">"ಡೀಬಗ್ ಆ್ಯಪ್‌ ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="debug_app_not_set" msgid="1934083001283807188">"ಯಾವುದೇ ಡೀಬಗ್ ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಹೊಂದಿಸಿಲ್ಲ"</string>
     <string name="debug_app_set" msgid="6599535090477753651">"ಡೀಬಗ್ ಅಪ್ಲಿಕೇಶನ್‌: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="select_application" msgid="2543228890535466325">"ಅಪ್ಲಿಕೇಶನ್ ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="no_application" msgid="9038334538870247690">"ಏನೂ ಇಲ್ಲ"</string>
     <string name="wait_for_debugger" msgid="7461199843335409809">"ಡೀಬಗರ್‌‌ಗಾಗಿ ನಿರೀಕ್ಷಿಸಿ"</string>
-    <string name="wait_for_debugger_summary" msgid="6846330006113363286">"ಲಗತ್ತನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವ ಮೊದಲು ಡೀಬಗರ್‌‌ಗಾಗಿ ಡೀಬಗ್‌‌‌ ಮಾಡಿದ ಅಪ್ಲಿಕೇಶನ್‌‌ ಕಾಯುತ್ತದೆ"</string>
+    <string name="wait_for_debugger_summary" msgid="6846330006113363286">"ಲಗತ್ತನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವ ಮೊದಲು ಡೀಬಗರ್‌‌ಗಾಗಿ ಡೀಬಗ್‌‌‌ ಮಾಡಿದ ಆ್ಯಪ್‌ ಕಾಯುತ್ತದೆ"</string>
     <string name="debug_input_category" msgid="7349460906970849771">"ಇನ್‌ಪುಟ್"</string>
     <string name="debug_drawing_category" msgid="5066171112313666619">"ಚಿತ್ರಣ"</string>
     <string name="debug_hw_drawing_category" msgid="5830815169336975162">"ಹಾರ್ಡ್‌ವೇರ್‌ ವೇಗವರ್ಧಿತ ರೆಂಡರಿಂಗ್"</string>
@@ -425,11 +425,11 @@
     <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ಬಳಕೆದಾರರು ಹೊರಹೋಗುತ್ತಿದ್ದಂತೆಯೇ ಚಟುವಟಿಕೆ ನಾಶಪಡಿಸು"</string>
     <string name="app_process_limit_title" msgid="8361367869453043007">"ಹಿನ್ನೆಲೆ ಪ್ರಕ್ರಿಯೆ ಮಿತಿ"</string>
     <string name="show_all_anrs" msgid="9160563836616468726">"ಹಿನ್ನೆಲೆ ANR ಗಳನ್ನು ತೋರಿಸಿ"</string>
-    <string name="show_all_anrs_summary" msgid="8562788834431971392">"ಹಿನ್ನೆಲೆ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ ಎಂಬ ಸಂಭಾಷಣೆ ತೋರಿಸಿ"</string>
+    <string name="show_all_anrs_summary" msgid="8562788834431971392">"ಹಿನ್ನೆಲೆ ಆ್ಯಪ್‌ಗಳಿಗಾಗಿ ಆ್ಯಪ್‌ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ ಎಂಬ ಸಂಭಾಷಣೆ ತೋರಿಸಿ"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ನೋಟಿಫಿಕೇಶನ್ ಎಚ್ಚರಿಕೆ ತೋರಿಸಿ"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ಅಮಾನ್ಯ ಚಾನಲ್ ಅಧಿಸೂಚನೆಗಾಗಿ ಪರದೆಯಲ್ಲಿ ಎಚ್ಚರಿಕೆ"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"ಬಾಹ್ಯವಾಗಿ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಒತ್ತಾಯವಾಗಿ ಅನುಮತಿಸಿ"</string>
-    <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ಮ್ಯಾನಿಫೆಸ್ಟ್ ಮೌಲ್ಯಗಳು ಯಾವುದೇ ಆಗಿದ್ದರೂ, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆಗೆ ಬರೆಯಲು ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಅರ್ಹಗೊಳಿಸುತ್ತದೆ"</string>
+    <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ಮ್ಯಾನಿಫೆಸ್ಟ್ ಮೌಲ್ಯಗಳು ಯಾವುದೇ ಆಗಿದ್ದರೂ, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆಗೆ ಬರೆಯಲು ಯಾವುದೇ ಆ್ಯಪ್‌ ಅನ್ನು ಅರ್ಹಗೊಳಿಸುತ್ತದೆ"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"ಚಟುವಟಿಕೆಗಳನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸುವಂತೆ ಒತ್ತಾಯ ಮಾಡಿ"</string>
     <string name="force_resizable_activities_summary" msgid="2490382056981583062">"ಮ್ಯಾನಿಫೆಸ್ಟ್ ಮೌಲ್ಯಗಳನ್ನು ಪರಿಗಣಿಸದೇ, ಬಹು-ವಿಂಡೊಗೆ ಎಲ್ಲಾ ಚಟುವಟಿಕೆಗಳನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸುವಂತೆ ಮಾಡಿ."</string>
     <string name="enable_freeform_support" msgid="7599125687603914253">"ಮುಕ್ತಸ್ವರೂಪದ ವಿಂಡೊಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
@@ -453,7 +453,7 @@
     <string name="inactive_apps_title" msgid="5372523625297212320">"ಸ್ಟ್ಯಾಂಡ್‌ಬೈ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು"</string>
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ನಿಷ್ಕ್ರಿಯ. ಟಾಗಲ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"ಸಕ್ರಿಯ. ಟಾಗಲ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
-    <string name="standby_bucket_summary" msgid="5128193447550429600">"ಅಪ್ಲಿಕೇಶನ್ ಸ್ಟ್ಯಾಂಡ್‌ಬೈ ಸ್ಥಿತಿ:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="standby_bucket_summary" msgid="5128193447550429600">"ಆ್ಯಪ್‌ ಸ್ಟ್ಯಾಂಡ್‌ಬೈ ಸ್ಥಿತಿ:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
     <string name="transcode_settings_title" msgid="2581975870429850549">"ಮೀಡಿಯಾ ಟ್ರಾನ್ಸ್‌ಕೋಡಿಂಗ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="transcode_user_control" msgid="6176368544817731314">"ಟ್ರಾನ್ಸ್‌ಕೋಡಿಂಗ್ ಡೀಫಾಲ್ಟ್‌ಗಳನ್ನು ಅತಿಕ್ರಮಿಸಿ"</string>
     <string name="transcode_enable_all" msgid="2411165920039166710">"ಟ್ರಾನ್ಸ್‌ಕೋಡಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"ಇದೀಗ"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ಈ ಫೋನ್"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ಈ ಟ್ಯಾಬ್ಲೆಟ್"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ಈ ಕಂಪ್ಯೂಟರ್ (ಆಂತರಿಕ)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"ಮೈಕ್ರೊಫೋನ್‌ (ಆಂತರಿಕ)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ಡಾಕ್ ಸ್ಪೀಕರ್"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"ಬಾಹ್ಯ ಸಾಧನ"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"ಕನೆಕ್ಟ್ ಮಾಡಿರುವ ಸಾಧನ"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ಈ ಬದಲಾವಣೆ ಅನ್ವಯವಾಗಲು ನಿಮ್ಮ ಸಾಧನವನ್ನು ರೀಬೂಟ್ ಮಾಡಬೇಕು. ಇದೀಗ ರೀಬೂಟ್ ಮಾಡಿ ಅಥವಾ ರದ್ದುಗೊಳಿಸಿ."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"ವೈಯರ್ ಹೊಂದಿರುವ ಹೆಡ್‌ಫೋನ್"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ಹೆಡ್‌ಫೋನ್"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB ಆಡಿಯೋ"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"ಮೈಕ್‌ ಜ್ಯಾಕ್‌"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB ಮೈಕ್‌"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB ಮೈಕ್ರೊಫೋನ್‌"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ಆನ್ ಆಗಿದೆ"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"ಆಫ್"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"ವಾಹಕ ನೆಟ್‌ವರ್ಕ್ ಬದಲಾಯಿಸುವಿಕೆ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 4b0cfb4..9f714e1 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"조금 전"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"이 휴대전화"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"이 태블릿"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"이 컴퓨터(내부)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"마이크(내부)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"도크 스피커"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"외부 기기"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"연결된 기기"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"사용 중지됨"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"사용 설정됨"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"변경사항을 적용하려면 기기를 재부팅해야 합니다. 지금 재부팅하거나 취소하세요."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"유선 헤드폰"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"헤드폰"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB 오디오"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"마이크 잭"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB 마이크"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB 마이크"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"사용"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"사용 안 함"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"이동통신사 네트워크 변경"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 17b55c4..d7a3913 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Жаңы эле"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ушул телефон"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ушул планшет"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Бул компьютер (ички)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (ички)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Док бекеттин динамиги"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Тышкы түзмөк"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Туташкан түзмөк"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Өчүк"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Күйүк"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Бул өзгөрүү күчүнө кириши үчүн, түзмөктү өчүрүп күйгүзүңүз. Азыр же кийинчерээк өчүрүп күйгүзсөңүз болот."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Зымдуу гарнитура"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Гарнитура"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB аудио"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Микрофондун оюкчасы"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB микрофон"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB микрофон"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Күйгүзүү"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Өчүрүү"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Байланыш оператору өзгөртүлүүдө"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index e6e8ef8..e57dae8 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"ຕອນນີ້"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ໂທລະສັບນີ້"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ແທັບເລັດນີ້"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ຄອມພິວເຕີນີ້ (ພາຍໃນ)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"ໄມໂຄຣໂຟນ (ພາຍໃນ)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ແທ່ນວາງລຳໂພງ"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"ອຸປະກອນພາຍນອກ"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"ອຸປະກອນທີ່ເຊື່ອມຕໍ່"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ປິດການນຳໃຊ້ແລ້ວ"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ເປີດການນຳໃຊ້ແລ້ວ"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ທ່ານຕ້ອງປິດເປີດອຸປະກອນຄືນໃໝ່ເພື່ອນຳໃຊ້ການປ່ຽນແປງນີ້. ປິດເປີດໃໝ່ດຽວນີ້ ຫຼື ຍົກເລີກ."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"ຫູຟັງແບບມີສາຍ"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ຫູຟັງ"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"ສຽງ USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"ຊ່ອງສຽງໄມ"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"ໄມ USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"ໄມໂຄຣໂຟນ USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ເປີດ"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"ປິດ"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"ການປ່ຽນເຄືອຂ່າຍຜູ້ໃຫ້ບໍລິການ"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 5945e2a..a4d5b9b 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Ką tik"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Šis telefonas"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Šis planšetinis kompiuteris"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Šis kompiuteris (vidinis)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofonas (vidinis)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Doko garsiakalbis"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Išorinis įrenginys"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Prijungtas įrenginys"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Išjungta"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Įgalinta"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Kad pakeitimas būtų pritaikytas, įrenginį reikia paleisti iš naujo. Dabar paleiskite iš naujo arba atšaukite."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Laidinės ausinės"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Ausinės"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB garsas"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofono jungtis"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofonas"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB mikrofonas"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Įjungta"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Išjungta"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Keičiamas operatoriaus tinklas"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 34f6c4c..bf6f80c 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Tikko"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Šis tālrunis"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Šis planšetdators"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Šī datora iekšējais skaļrunis"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofons (iebūvētais)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Doka skaļrunis"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Ārēja ierīce"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Pievienotā ierīce"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Atspējots"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Iespējots"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Lai šīs izmaiņas tiktu piemērotas, nepieciešama ierīces atkārtota palaišana. Atkārtoti palaidiet to tūlīt vai atceliet izmaiņas."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Vadu austiņas"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Austiņas"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB audio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofona ligzda"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofons"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB mikrofons"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Ieslēgts"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Izslēgts"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Mobilo sakaru operatora tīkla mainīšana"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index ea9ff6c..f664f72 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Овој компјуер (внатрешен)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (внатрешен)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Док со звучник"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Надворешен уред"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Поврзан уред"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"За да се примени променава, уредот мора да се рестартира. Рестартирајте сега или откажете."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Жичени слушалки"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Слушалка"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-звучник"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB-аудио"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Приклучок за микрофон"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-микрофон"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB-микрофон"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Вклучено"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Исклучено"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Променување на мрежата на операторот"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 7af53aa..49af83d 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ഈ കമ്പ്യൂട്ടർ (ഇന്റേണൽ)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"മൈക്രോഫോൺ (ഇന്റേണൽ)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ഡോക്ക് സ്‌പീക്കർ"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"ബാഹ്യ ഉപകരണം"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"കണക്‌റ്റ് ചെയ്‌ത ഉപകരണം"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ഈ മാറ്റം ബാധകമാകുന്നതിന് നിങ്ങളുടെ ഉപകരണം റീബൂട്ട് ചെയ്യേണ്ടതുണ്ട്. ഇപ്പോൾ റീബൂട്ട് ചെയ്യുകയോ റദ്ദാക്കുകയോ ചെയ്യുക."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"വയേർഡ് ഹെഡ്ഫോൺ"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ഹെഡ്ഫോൺ"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB സ്‌പീക്കർ"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB ഓഡിയോ"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"മൈക്ക് ജാക്ക്"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB മൈക്ക്"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB മൈക്രോഫോൺ"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ഓണാണ്"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"ഓഫാണ്"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"കാരിയർ നെറ്റ്‌വർക്ക് മാറ്റൽ"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index bc953d3..2d010fe 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Дөнгөж сая"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Энэ утас"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Энэ таблет"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Энэ компьютер (дотоод)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (дотоод)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Суурилуулагчийн чанга яригч"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Гадаад төхөөрөмж"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Холбогдсон төхөөрөмж"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Идэвхгүй болгосон"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Идэвхжүүлсэн"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Энэ өөрчлөлтийг хэрэгжүүлэхийн тулд таны төхөөрөмжийг дахин асаах ёстой. Одоо дахин асаах эсвэл цуцлана уу."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Утастай чихэвч"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Чихэвч"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB аудио"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Микрофоны чихэвчний оролт"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB микрофон"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB микрофон"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Асаах"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Унтраах"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Оператор компанийн сүлжээг өөрчилж байна"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 581545d..bea1500 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"हा काँप्युटर (अंतर्गत)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"मायक्रोफोन (अंतर्गत)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"डॉक स्पीकर"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"बाह्य डिव्हाइस"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"कनेक्ट केलेले डिव्हाइस"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"हा बदल लागू करण्यासाठी तुमचे डिव्हाइस रीबूट करणे आवश्यक आहे. आता रीबूट करा किंवा रद्द करा."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"वायर्ड हेडफोन"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"हेडफोन"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB स्पीकर"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB ऑडिओ"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"माइक जॅक"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB माइक"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB मायक्रोफोन"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"सुरू करा"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"बंद करा"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"वाहक नेटवर्क बदलत आहे"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 7990e04..f045490 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Komputer ini (dalaman)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (dalaman)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Pembesar suara dok"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Peranti Luar"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Peranti yang disambungkan"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Peranti anda mesti dibut semula supaya perubahan ini berlaku. But semula sekarang atau batalkan."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Fon kepala berwayar"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Fon kepala"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Pembesar suara USB"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Audio USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Bicu mikrofon"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Mikrofon USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Mikrofon USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Hidup"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Mati"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Rangkaian pembawa berubah"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 063fc9c..4bdb50f 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -376,7 +376,7 @@
     <string name="strict_mode_summary" msgid="1838248687233554654">"အက်ပ်လုပ်ဆောင်မှု ရှည်ကြာလျှင် စကရင်ပြန်စသည်"</string>
     <string name="pointer_location" msgid="7516929526199520173">"မြား၏တည်နေရာ"</string>
     <string name="pointer_location_summary" msgid="957120116989798464">"လက်ရှိထိတွေ့မှုဒေတာကို ဖန်သားပေါ်တွင်ထပ်၍ ပြသသည်"</string>
-    <string name="show_touches" msgid="8437666942161289025">"တို့ခြင်းများကို ပြပါ"</string>
+    <string name="show_touches" msgid="8437666942161289025">"တို့ချက်များ ပြရန်"</string>
     <string name="show_touches_summary" msgid="3692861665994502193">"တို့ခြင်းများအတွက် အမြင်ဖြင့် တုံ့ပြန်မှုပြသည်"</string>
     <string name="show_key_presses" msgid="6360141722735900214">"ကီးနှိပ်မှုများ ပြပါ"</string>
     <string name="show_key_presses_summary" msgid="725387457373015024">"ပကတိကီးနှိပ်မှုများအတွက် ရုပ်မြင်အကြံပြုချက် ပြပါ"</string>
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"ယခုလေးတင်"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ဤဖုန်း"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ဤတက်ဘလက်"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ဤကွန်ပျူတာ (စက်တွင်း)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"မိုက်ခရိုဖုန်း (စက်တွင်း)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"အထိုင် စပီကာ"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"ပြင်ပစက်"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"ချိတ်ဆက်ကိရိယာ"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ပိတ်ထားသည်"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ဖွင့်ထားသည်"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ဤအပြောင်းအလဲ ထည့်သွင်းရန် သင့်စက်ကို ပြန်လည်စတင်ရမည်။ ယခု ပြန်လည်စတင်ပါ သို့မဟုတ် ပယ်ဖျက်ပါ။"</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"ကြိုးတပ်နားကြပ်"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"နားကြပ်"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB အသံ"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"မိုက်ဂျက်ပင်"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB မိုက်"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB မိုက်ခရိုဖုန်း"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ဖွင့်"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"ပိတ်"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"ဝန်ဆောင်မှုပေးသူ ကွန်ရက် ပြောင်းလဲနေသည်။"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 9036c8c..5de7069 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Nå nettopp"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Denne telefonen"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Dette nettbrettet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Denne datamaskinen (intern)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (intern)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dokkhøyttaler"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Ekstern enhet"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Tilkoblet enhet"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Slått av"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Slått på"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Enheten din må startes på nytt for at denne endringen skal tre i kraft. Start på nytt nå eller avbryt."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Hodetelefoner med kabel"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Hodetelefoner"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB-lyd"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofonkontakt"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB-mikrofon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"På"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Av"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Bytting av operatørnettverk"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 916aba9..ec5da45 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"यो कम्प्युटर (आन्तरिक)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"माइक्रोफोन (आन्तरिक)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"डक स्पिकर"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"बाह्य डिभाइस"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"कनेक्ट गरिएको डिभाइस"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"यो परिवर्तन लागू गर्न तपाईंको यन्त्र अनिवार्य रूपमा रिबुट गर्नु पर्छ। अहिले रिबुट गर्नुहोस् वा रद्द गर्नुहोस्।"</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"तारयुक्त हेडफोन"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"हेडफोन"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB स्पिकर"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB अडियो"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"माइकको ज्याक"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB माइक"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB माइक्रोफोन"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"अन छ"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"अफ छ"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"सेवा प्रदायकको नेटवर्क परिवर्तन गर्ने आइकन"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 78dfd35..f6c5c9c 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Deze computer (intern)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microfoon (intern)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dockspeaker"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Extern apparaat"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Verbonden apparaat"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Je apparaat moet opnieuw worden opgestart om deze wijziging toe te passen. Start nu opnieuw op of annuleer de wijziging."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Bedrade koptelefoon"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Koptelefoon"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-speaker"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB-audio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Microfoonaansluiting"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-microfoon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB-microfoon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aan"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Uit"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Netwerk van provider wordt gewijzigd"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 1b2e421..2ab4d13 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"ଏହିକ୍ଷଣି"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ଏହି ଫୋନ"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ଏହି ଟାବଲେଟ"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ଏହି କମ୍ପ୍ୟୁଟର (ଇଣ୍ଟର୍ନଲ)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"ମାଇକ୍ରୋଫୋନ (ଇଣ୍ଟର୍ନଲ)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ଡକ ସ୍ପିକର"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"ଏକ୍ସଟର୍ନଲ ଡିଭାଇସ"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"କନେକ୍ଟ କରାଯାଇଥିବା ଡିଭାଇସ"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ଅକ୍ଷମ କରାଯାଇଛି"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ସକ୍ଷମ କରାଯାଇଛି"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ଏହି ପରିବର୍ତ୍ତନ ଲାଗୁ କରିବା ପାଇଁ ଆପଣଙ୍କ ଡିଭାଇସକୁ ନିଶ୍ଚିତ ରୂପେ ରିବୁଟ୍ କରାଯିବା ଆବଶ୍ୟକ। ବର୍ତ୍ତମାନ ରିବୁଟ୍ କରନ୍ତୁ କିମ୍ବା ବାତିଲ କରନ୍ତୁ।"</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"ତାରଯୁକ୍ତ ହେଡଫୋନ"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ହେଡଫୋନ"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB ଅଡିଓ"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"ମାଇକ ଜେକ"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB ମାଇକ"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB ମାଇକ୍ରୋଫୋନ"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ଚାଲୁ ଅଛି"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"ବନ୍ଦ ଅଛି"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"କେରିଅର୍‍ ନେଟ୍‌ୱର୍କ ବଦଳୁଛି"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index c668e12..f054ed5 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"ਹੁਣੇ ਹੀ"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ਇਹ ਫ਼ੋਨ"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ਇਹ ਟੈਬਲੈੱਟ"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ਇਸ ਕੰਪਿਊਟਰ \'ਤੇ (ਅੰਦਰੂਨੀ)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ (ਅੰਦਰੂਨੀ)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ਡੌਕ ਸਪੀਕਰ"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"ਬਾਹਰੀ ਡੀਵਾਈਸ"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"ਕਨੈਕਟ ਕੀਤਾ ਡੀਵਾਈਸ"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ਬੰਦ ਕੀਤਾ ਗਿਆ"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ਚਾਲੂ ਕੀਤਾ ਗਿਆ"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਰੀਬੂਟ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ। ਹੁਣੇ ਰੀਬੂਟ ਕਰੋ ਜਾਂ ਰੱਦ ਕਰੋ।"</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"ਤਾਰ ਵਾਲੇ ਹੈੱਡਫ਼ੋਨ"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ਹੈੱਡਫ਼ੋਨ"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB ਆਡੀਓ"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"ਮਾਈਕ ਜੈਕ"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB ਮਾਈਕ"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB ਮਾਈਕ੍ਰੋਫ਼ੋਨ"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ਚਾਲੂ"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"ਬੰਦ"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"ਕੈਰੀਅਰ ਨੈੱਟਵਰਕ ਦੀ ਬਦਲੀ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index bb8fe2e..3786e02 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ten komputer (wewnętrzny)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (wewnętrzny)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Głośnik ze stacją dokującą"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Urządzenie zewnętrzne"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Połączone urządzenie"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Wprowadzenie zmiany wymaga ponownego uruchomienia urządzenia. Uruchom ponownie teraz lub anuluj."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Słuchawki przewodowe"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Słuchawki"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Głośnik USB"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Dźwięk przez USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Gniazdo mikrofonu"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Mikrofon USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Mikrofon USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Włączono"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Wyłączono"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Zmiana sieci operatora"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 7f5bb0f..3a8b2b8 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Este computador (interno)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microfone (interno)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Alto-falante da base"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo externo"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo conectado"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"É necessário reinicializar o dispositivo para que a mudança seja aplicada. Faça isso agora ou cancele."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Fones de ouvido com fio"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Fone de ouvido"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Alto-falante USB"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Áudio USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Entrada para microfone"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Microfone USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Microfone USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Ativado"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Desativado"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Alteração de rede da operadora"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 92ab714..7dbabb8 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Agora mesmo"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este telemóvel"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Este tablet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Este computador (interno)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microfone (interno)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Altifalante estação carregamento"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo externo"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo associado"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Desativada"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Ativada"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"É necessário reiniciar o dispositivo para aplicar esta alteração. Reinicie agora ou cancele."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Auscultadores com fios"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Auscultadores"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Áudio USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Entrada para microfone"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Microfone USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Microfone USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Ligado"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Desligado"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Rede do operador em mudança."</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 7f5bb0f..3a8b2b8 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Este computador (interno)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microfone (interno)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Alto-falante da base"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo externo"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo conectado"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"É necessário reinicializar o dispositivo para que a mudança seja aplicada. Faça isso agora ou cancele."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Fones de ouvido com fio"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Fone de ouvido"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Alto-falante USB"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Áudio USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Entrada para microfone"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Microfone USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Microfone USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Ativado"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Desativado"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Alteração de rede da operadora"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index e710634..9e0eb4f 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Chiar acum"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Acest telefon"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Această tabletă"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Acest computer (intern)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Microfon (intern)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Difuzorul dispozitivului de andocare"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispozitiv extern"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispozitiv conectat"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Dezactivat"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Activat"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Pentru ca modificarea să se aplice, trebuie să repornești dispozitivul. Repornește-l acum sau anulează."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Căști cu fir"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Căști"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Audio USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mufă pentru microfon"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Microfon USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Microfon USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Activat"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Dezactivat"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Se schimbă rețeaua operatorului"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 1cdef05..dfde272 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Встроенный динамик компьютера"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (встроенный)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Колонка с док-станцией"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Внешнее устройство"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Подключенное устройство"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Чтобы изменение вступило в силу, необходимо перезапустить устройство. Вы можете сделать это сейчас или позже."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Проводные наушники"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Наушники"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB-колонка"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB-аудиоустройство"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Микрофонный разъем"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-микрофон"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB-микрофон"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Вкл."</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Выкл."</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Сменить сеть"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 980f9c8..fe011c7 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"මෙම පරිගණකය (අභ්‍යන්තර)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"මයික්‍රෆෝනය (අභ්‍යන්තර)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ඩොක් ස්පීකරය"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"බාහිර උපාංගය"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"සම්බන්ධ කළ උපාංගය"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"මෙම වෙනස යෙදීමට ඔබේ උපාංගය නැවත පණ ගැන්විය යුතුය. දැන් නැවත පණ ගන්වන්න හෝ අවලංගු කරන්න."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"රැහැන්ගත හෙඩ්ෆෝන්"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"හෙඩ්ෆෝන්"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB ස්පීකරය"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB ශ්‍රව්‍ය"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"මයික් ජැක්කුව"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB මයික්"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB මයික්‍රෆෝනය"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ක්‍රියාත්මකයි"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"ක්‍රියාවිරහිතයි"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"වාහක ජාලය වෙනස් වෙමින්"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index ddb35d6..46ab80a 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Teraz"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Tento telefón"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Tento tablet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Tento počítač (interný)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofón (vnútorný)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Reproduktor doku"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Externé zariadenie"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Pripojené zariadenie"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Vypnuté"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Zapnuté"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Zmena sa prejaví až po reštarte zariadenia. Môžete ho teraz reštartovať alebo akciu zrušiť."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Slúchadlá s káblom"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Slúchadlá"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Zvuk cez USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Konektor mikrofónu"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Mikrofón USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Mikrofón s rozhraním USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Zapnúť"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Vypnúť"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Mení sa sieť operátora"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 2ee1241..0ea0d43 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ta računalnik (notranji)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (notranji)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Zvočnik nosilca"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Zunanja naprava"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Povezana naprava"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Napravo je treba znova zagnati, da bo ta sprememba uveljavljena. Znova zaženite zdaj ali prekličite."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Žične slušalke"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Slušalke"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"Zvočnik USB"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Zvok USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Vtič za mikrofon"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Mikrofon USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Mikrofon USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Vklop"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Izklop"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Spreminjanje omrežja operaterja"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index d99f2c8..54e75b2 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Pikërisht tani"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ky telefon"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ky tablet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Ky kompjuter (i brendshëm)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofoni (i brendshëm)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Altoparlanti i stacionit"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Pajisja e jashtme"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Pajisja e lidhur"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Joaktiv"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aktiv"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Pajisja jote duhet të riniset që ky ndryshim të zbatohet. Rinise tani ose anuloje."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Kufje me tela"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Kufje"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Pajisja audio me USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Fisha e mikrofonit"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Mikrofoni me USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Mikrofoni me USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aktive"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Joaktive"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Rrjeti i operatorit celular po ndryshohet"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 34ccdaf..742e6ca 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Овај рачунар (интерно)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Микрофон (интерни)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Звучник базне станице"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Спољни уређај"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Повезани уређај"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Морате да рестартујете уређај да би се ова промена применила. Рестартујте га одмах или откажите."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Жичане слушалице"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Слушалице"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB звучник"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB аудио"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Утикач за микрофон"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB микрофон"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB микрофон"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Укључено"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Искључено"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Промена мреже мобилног оператера"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 6b76f87..b726921 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Nyss"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Den här telefonen"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Den här surfplattan"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Den här datorn (intern)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (inbyggd)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dockningsstationens högtalare"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Extern enhet"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Ansluten enhet"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Inaktiverat"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aktiverat"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Enheten måste startas om för att ändringen ska börja gälla. Starta om nu eller avbryt."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Hörlur med kabel"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Hörlur"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB-ljud"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofonuttag"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-mikrofon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB-mikrofon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"På"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Av"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Byter leverantörsnätverk"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index f113e62..adc21db 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Sasa hivi"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Simu hii"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Kishikwambi hiki"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Kompyuta hii (spika ya ndani)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Maikrofoni (ya ndani)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Spika ya kituo"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Kifaa cha Nje"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Kifaa kilichounganishwa"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Imezimwa"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Imewashwa"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Ni lazima uwashe tena kifaa chako ili mabadiliko haya yatekelezwe. Washa tena sasa au ughairi."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Kipokea sauti cha kichwani chenye waya"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Kipokea sauti cha kichwani"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Sauti ya USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Pini ya maikrofoni"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Maikrofoni ya USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Maikrofoni ya USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Umewashwa"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Umezimwa"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Mabadiliko katika mtandao wa mtoa huduma"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index beca738..0e26985 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"சற்றுமுன்"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"இந்த மொபைல்"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"இந்த டேப்லெட்"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"இந்தக் கம்ப்யூட்டர் (அகம்)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"மைக்ரோஃபோன் (அகம்)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"டாக் ஸ்பீக்கர்"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"வெளிப்புறச் சாதனம்"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"இணைக்கப்பட்டுள்ள சாதனம்"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"முடக்கப்பட்டது"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"இயக்கப்பட்டது"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"இந்த மாற்றங்கள் செயல்படுத்தப்பட உங்கள் சாதனத்தை மறுபடி தொடங்க வேண்டும். இப்போதே மறுபடி தொடங்கவும் அல்லது ரத்துசெய்யவும்."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"வயர்டு ஹெட்ஃபோன்"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ஹெட்ஃபோன்"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB ஆடியோ"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"மைக் ஜாக்"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB மைக்"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB மைக்ரோஃபோன்"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ஆன்"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"ஆஃப்"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"மொபைல் நிறுவன நெட்வொர்க்கை மாற்றும்"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 56d0a7d..0f835fa 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"ఈ కంప్యూటర్ (ఇంటర్నల్)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"మైక్రోఫోన్ (అంతర్గతం)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"డాక్ స్పీకర్"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"ఎక్స్‌టర్నల్ పరికరం"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"కనెక్ట్ చేసిన పరికరం"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ఈ మార్పును వర్తింపజేయాలంటే మీరు మీ పరికరాన్ని తప్పనిసరిగా రీబూట్ చేయాలి. ఇప్పుడే రీబూట్ చేయండి లేదా రద్దు చేయండి."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"వైర్ ఉన్న హెడ్‌ఫోన్"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"హెడ్‌ఫోన్"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB స్పీకర్"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB ఆడియో"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"మైక్ జాక్"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB మైక్"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB మైక్రోఫోన్"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"ఆన్‌లో ఉంది"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"ఆఫ్‌లో ఉంది"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"క్యారియర్ నెట్‌వర్క్ మారుతోంది"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 28a0d64..b5deb55 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"คอมพิวเตอร์เครื่องนี้ (ภายใน)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"ไมโครโฟน (ภายใน)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"แท่นชาร์จที่มีลำโพง"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"อุปกรณ์ภายนอก"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"อุปกรณ์ที่เชื่อมต่อ"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"คุณต้องรีบูตอุปกรณ์เพื่อให้การเปลี่ยนแปลงนี้มีผล รีบูตเลยหรือยกเลิก"</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"หูฟังแบบใช้สาย"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"หูฟัง"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"ลำโพง USB"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"เสียง USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"ช่องเสียบไมค์"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"ไมค์ USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"ไมโครโฟน USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"เปิด"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"ปิด"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"การเปลี่ยนเครือข่ายผู้ให้บริการ"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 926ce8f..b664108 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Sa computer na ito (internal)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikropono (internal)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Speaker ng dock"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"External na Device"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Nakakonektang device"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Dapat i-reboot ang iyong device para mailapat ang pagbabagong ito. Mag-reboot ngayon o kanselahin."</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Wired na headphone"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Headphone"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"USB speaker"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB audio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Jack ng mikropono"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB na mikropono"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB na mikropono"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Naka-on"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Naka-off"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Nagpapalit ng carrier network"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index d7ad6b1..7cee87e 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Az önce"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Bu telefon"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Bu tablet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Bu bilgisayar (dahili)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (dahili)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Yuva hoparlörü"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Harici Cihaz"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Bağlı cihaz"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Devre dışı"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Etkin"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Bu değişikliğin geçerli olması için cihazınızın yeniden başlatılması gerekir. Şimdi yeniden başlatın veya iptal edin."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Kablolu kulaklık"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Kulaklık"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB ses cihazı"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofon jakı"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mikrofon"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB mikrofon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Açık"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Kapalı"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Operatör ağı değiştiriliyor"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 3ccbcf2..dd7f157 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Щойно"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Цей телефон"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Цей планшет"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Цей комп’ютер (внутрішній)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Мікрофон (внутрішній)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Динамік док-станції"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Зовнішній пристрій"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Підключений пристрій"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Вимкнено"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Увімкнено"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Щоб застосувати ці зміни, потрібний перезапуск. Перезапустіть пристрій або скасуйте зміни."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Дротові навушники"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Навушники"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB-аудіо"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Гніздо для мікрофона"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB-мікрофон"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB-мікрофон"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Увімкнено"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Вимкнено"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Змінення мережі оператора"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 2157f63..23162cf 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -585,7 +585,6 @@
     <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"یہ کمپیوٹر (داخلی)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"مائیکروفون (داخلی)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ڈاک اسپیکر"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"بیرونی آلہ"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"منسلک آلہ"</string>
@@ -688,9 +687,11 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"اس تبدیلی کو لاگو کرنے کے ليے آپ کے آلہ کو ریبوٹ کرنا ضروری ہے۔ ابھی ریبوٹ کریں یا منسوخ کریں۔"</string>
     <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"تار والا ہیڈ فون"</string>
     <string name="media_transfer_headphone_name" msgid="1131962659136578852">"ہیڈ فون"</string>
-    <string name="media_transfer_usb_speaker_name" msgid="4736537022543593896">"‏‫USB اسپیکر"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"‏‫USB آڈیو"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"مائیک جیک"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"‏‫USB مائیک"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"‏‫USB مائیکروفون"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"آن"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"آف"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"کیریئر نیٹ ورک کی تبدیلی"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 40d1d10..8fa256f 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Hozir"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Shu telefon"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Shu planshet"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Bu kompyuter (ichki)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Mikrofon (ichki)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dok-stansiyali karnay"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Tashqi qurilma"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Ulangan qurilma"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Oʻchiq"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Yoniq"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Oʻzgarishlar kuchga kirishi uchun qurilmani oʻchirib yoqing. Buni hozir yoki keyinroq bajarishingiz mumkin."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Simli quloqlik"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Quloqlik"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB audio"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Mikrofon ulagichi"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB mik"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB mikrofon"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Yoniq"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Oʻchiq"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Mobil tarmoqni o‘zgartirish"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 874aa18..b4e09e0 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Vừa xong"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Điện thoại này"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Máy tính bảng này"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Máy tính này (nội bộ)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Micrô (bên trong)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Loa có gắn đế"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Thiết bị bên ngoài"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Thiết bị đã kết nối"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Đã tắt"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Đã bật"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Bạn phải khởi động lại thiết bị để áp dụng sự thay đổi này. Hãy khởi động lại ngay hoặc hủy."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Tai nghe có dây"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Tai nghe"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Âm thanh qua cổng USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Giắc cắm micrô"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"Micrô có cổng USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Micrô USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Đang bật"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Đang tắt"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Thay đổi mạng của nhà mạng"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 8edc656..f9ce1c3 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"刚刚"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"这部手机"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"这部平板电脑"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"此计算机(内部)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"麦克风(内部)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"基座音箱"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"外部设备"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"连接的设备"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"已停用"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"已启用"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"设备必须重新启动才能应用此更改。您可以立即重新启动或取消。"</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"有线耳机"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"头戴式耳机"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB 音频"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"麦克风插孔"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB 麦克风"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB 麦克风"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"开启"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"关闭"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"运营商网络正在更改"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 736a30d..c50c7ba 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"剛剛"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"此手機"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"此平板電腦"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"此電腦 (內置)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"麥克風 (內置)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"插座喇叭"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"外部裝置"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"已連接的裝置"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"已停用"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"已啟用"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"你的裝置必須重新開機,才能套用此變更。請立即重新開機或取消。"</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"有線耳機"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"耳機"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB 音訊"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"麥克風插孔"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB 麥克風"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB 麥克風"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"開啟"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"關閉"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"流動網絡供應商網絡正在變更"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 692b6e1..c5885de 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"剛剛"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"這支手機"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"這台平板電腦"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"這部電腦 (內部)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"麥克風 (內部)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"座架喇叭"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"外部裝置"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"已連結的裝置"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"已停用"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"已啟用"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"裝置必須重新啟動才能套用這項變更。請立即重新啟動或取消變更。"</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"有線耳機"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"耳機"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"USB 音訊"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"麥克風插孔"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"USB 麥克風"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"USB 麥克風"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"開啟"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"關閉"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"電信業者網路正在進行變更"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 4f0acbd..a39b436 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -582,11 +582,9 @@
     <string name="time_unit_just_now" msgid="3006134267292728099">"Khona manje"</string>
     <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Le foni"</string>
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Le thebhulethi"</string>
-    <!-- no translation found for media_transfer_this_device_name_desktop (7912386128141470452) -->
-    <skip />
+    <string name="media_transfer_this_device_name_desktop" msgid="7912386128141470452">"Le khompyutha (ngaphakathi)"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_internal_mic" msgid="797333824290228595">"Imakrofoni (okwangaphakathi)"</string>
     <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Isipikha sentuba"</string>
     <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Idivayisi Yangaphandle"</string>
     <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Idivayisi exhunyiwe"</string>
@@ -687,14 +685,13 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Ikhutshaziwe"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Inikwe amandla"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Kufanele idivayisi yakho iqaliswe ukuze lolu shintsho lusebenze. Qalisa manje noma khansela."</string>
-    <!-- no translation found for media_transfer_wired_headphone_name (8698668536022665254) -->
-    <skip />
-    <!-- no translation found for media_transfer_headphone_name (1131962659136578852) -->
-    <skip />
-    <!-- no translation found for media_transfer_usb_speaker_name (4736537022543593896) -->
-    <skip />
+    <string name="media_transfer_wired_headphone_name" msgid="8698668536022665254">"Amahedifoni anentambo"</string>
+    <string name="media_transfer_headphone_name" msgid="1131962659136578852">"Amahedifoni"</string>
+    <string name="media_transfer_usb_audio_name" msgid="1789292056757821355">"Umsindo we-USB"</string>
     <string name="media_transfer_wired_device_mic_name" msgid="7417067197803840965">"Umgodi we-earphone ye-mic"</string>
-    <string name="media_transfer_usb_device_mic_name" msgid="9189914846215516322">"I-mic ye-USB"</string>
+    <string name="media_transfer_usb_device_mic_name" msgid="7171789543226269822">"Imakrofoni ye-USB"</string>
+    <!-- no translation found for media_transfer_bt_device_mic_name (1870669402238687618) -->
+    <skip />
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Vuliwe"</string>
     <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Valiwe"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"Inethiwekhi yenkampani yenethiwekhi iyashintsha"</string>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 34e33c0..739c7d6 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -1409,12 +1409,10 @@
     <string name="media_transfer_this_device_name">This phone</string>
     <!-- Name of the tablet device. [CHAR LIMIT=30] -->
     <string name="media_transfer_this_device_name_tablet">This tablet</string>
-    <!-- Name of the internal speaker. [CHAR LIMIT=30] -->
+    <!-- Name of the internal speaker and mic. [CHAR LIMIT=30] -->
     <string name="media_transfer_this_device_name_desktop">This computer (internal)</string>
     <!-- Name of the default media output of the TV. [CHAR LIMIT=30] -->
     <string name="media_transfer_this_device_name_tv">@string/tv_media_transfer_default</string>
-    <!-- Name of the internal mic. [CHAR LIMIT=30] -->
-    <string name="media_transfer_internal_mic">Microphone (internal)</string>
     <!-- Name of the dock device. [CHAR LIMIT=30] -->
     <string name="media_transfer_dock_speaker_device_name">Dock speaker</string>
     <!-- Default name of the external device. [CHAR LIMIT=30] -->
@@ -1645,13 +1643,16 @@
     <string name="media_transfer_headphone_name">Headphone</string>
 
     <!-- Name of the usb audio device speaker, used in desktop devices. [CHAR LIMIT=50] -->
-    <string name="media_transfer_usb_speaker_name">USB speaker</string>
+    <string name="media_transfer_usb_audio_name">USB audio</string>
 
     <!-- Name of the 3.5mm audio device mic. [CHAR LIMIT=50] -->
     <string name="media_transfer_wired_device_mic_name">Mic jack</string>
 
     <!-- Name of the usb audio device mic. [CHAR LIMIT=50] -->
-    <string name="media_transfer_usb_device_mic_name">USB mic</string>
+    <string name="media_transfer_usb_device_mic_name">USB microphone</string>
+
+    <!-- Name of the bluetooth audio device mic. [CHAR LIMIT=50] -->
+    <string name="media_transfer_bt_device_mic_name">BT microphone</string>
 
     <!-- Label for Wifi hotspot switch on. Toggles hotspot on [CHAR LIMIT=30] -->
     <string name="wifi_hotspot_switch_on_text">On</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedInterface.kt b/packages/SettingsLib/src/com/android/settingslib/RestrictedInterface.kt
new file mode 100644
index 0000000..14f9a19
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedInterface.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2024 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.settingslib
+
+import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin
+
+interface RestrictedInterface {
+    fun useAdminDisabledSummary(useSummary: Boolean)
+
+    fun checkRestrictionAndSetDisabled(userRestriction: String)
+
+    fun checkRestrictionAndSetDisabled(userRestriction: String, userId: Int)
+
+    /**
+     * Checks if the given setting is subject to Enhanced Confirmation Mode restrictions for this
+     * package. Marks the preference as disabled if so.
+     *
+     * @param settingIdentifier The key identifying the setting
+     * @param packageName       the package to check the settingIdentifier for
+     */
+    fun checkEcmRestrictionAndSetDisabled(
+        settingIdentifier: String,
+        packageName: String
+    )
+
+    val isDisabledByAdmin: Boolean
+
+    fun setDisabledByAdmin(admin: EnforcedAdmin?)
+
+    val isDisabledByEcm: Boolean
+
+    val uid: Int
+
+    val packageName: String?
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedSliderPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedSliderPreference.java
new file mode 100644
index 0000000..1dc5281
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedSliderPreference.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2024 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.settingslib;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.os.Process;
+import android.os.UserHandle;
+import android.util.AttributeSet;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.res.TypedArrayUtils;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.settingslib.widget.SliderPreference;
+
+/**
+ * Slide Preference that supports being disabled by a user restriction
+ * set by a device admin.
+ */
+public class RestrictedSliderPreference extends SliderPreference implements RestrictedInterface {
+    RestrictedPreferenceHelper mHelper;
+
+    public RestrictedSliderPreference(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr, @Nullable String packageName, int uid) {
+        super(context, attrs, defStyleAttr);
+        mHelper = new RestrictedPreferenceHelper(context, this, attrs, packageName, uid);
+    }
+
+    public RestrictedSliderPreference(@NonNull Context context,
+            @Nullable AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, null, Process.INVALID_UID);
+    }
+
+    @SuppressLint("RestrictedApi")
+    public RestrictedSliderPreference(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle,
+                android.R.attr.preferenceStyle));
+    }
+
+    public RestrictedSliderPreference(@NonNull Context context) {
+        this(context, null);
+    }
+
+    @SuppressLint("RestrictedApi")
+    public RestrictedSliderPreference(@NonNull Context context, @Nullable String packageName,
+            int uid) {
+        this(context, null, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle,
+                android.R.attr.preferenceStyle), packageName, uid);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        mHelper.onBindViewHolder(holder);
+    }
+
+    @SuppressLint("RestrictedApi")
+    @Override
+    public void performClick() {
+        if (!mHelper.performClick()) {
+            super.performClick();
+        }
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        if (enabled && isDisabledByAdmin()) {
+            mHelper.setDisabledByAdmin(null);
+            return;
+        }
+
+        if (enabled && isDisabledByEcm()) {
+            mHelper.setDisabledByEcm(null);
+            return;
+        }
+
+        super.setEnabled(enabled);
+    }
+
+    @Override
+    public void useAdminDisabledSummary(boolean useSummary) {
+        mHelper.useAdminDisabledSummary(useSummary);
+    }
+
+    @Override
+    public void checkRestrictionAndSetDisabled(@NonNull String userRestriction) {
+        mHelper.checkRestrictionAndSetDisabled(userRestriction, UserHandle.myUserId());
+    }
+
+    @Override
+    public void checkRestrictionAndSetDisabled(@NonNull String userRestriction, int userId) {
+        mHelper.checkRestrictionAndSetDisabled(userRestriction, userId);
+    }
+
+    @Override
+    public void checkEcmRestrictionAndSetDisabled(@NonNull String settingIdentifier,
+            @NonNull String packageName) {
+        mHelper.checkEcmRestrictionAndSetDisabled(settingIdentifier, packageName);
+    }
+
+    @Override
+    public void setDisabledByAdmin(@Nullable RestrictedLockUtils.EnforcedAdmin admin) {
+        if (mHelper.setDisabledByAdmin(admin)) {
+            notifyChanged();
+        }
+    }
+
+    @Override
+    public boolean isDisabledByAdmin() {
+        return mHelper.isDisabledByAdmin();
+    }
+
+    @Override
+    public boolean isDisabledByEcm() {
+        return mHelper.isDisabledByEcm();
+    }
+
+    @Override
+    public int getUid() {
+        return mHelper != null ? mHelper.uid : Process.INVALID_UID;
+    }
+
+    @Override
+    @Nullable
+    public String getPackageName() {
+        return mHelper != null ? mHelper.packageName : null;
+    }
+
+    @Override
+    protected void onAttachedToHierarchy(@NonNull PreferenceManager preferenceManager) {
+        mHelper.onAttachedToHierarchy();
+        super.onAttachedToHierarchy(preferenceManager);
+    }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java
index 9d56c77..744e97e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/Utils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java
@@ -30,9 +30,10 @@
 import android.icu.text.NumberFormat;
 import android.location.LocationManager;
 import android.media.AudioManager;
+import android.net.ConnectivityManager;
 import android.net.NetworkCapabilities;
 import android.net.TetheringManager;
-import android.net.vcn.VcnTransportInfo;
+import android.net.vcn.VcnUtils;
 import android.net.wifi.WifiInfo;
 import android.os.BatteryManager;
 import android.os.Build;
@@ -737,14 +738,9 @@
      * @param networkCapabilities NetworkCapabilities of the network.
      */
     @Nullable
-    public static WifiInfo tryGetWifiInfoForVcn(NetworkCapabilities networkCapabilities) {
-        if (networkCapabilities.getTransportInfo() == null
-                || !(networkCapabilities.getTransportInfo() instanceof VcnTransportInfo)) {
-            return null;
-        }
-        VcnTransportInfo vcnTransportInfo =
-                (VcnTransportInfo) networkCapabilities.getTransportInfo();
-        return vcnTransportInfo.getWifiInfo();
+    public static WifiInfo tryGetWifiInfoForVcn(
+            ConnectivityManager connectivityMgr, NetworkCapabilities networkCapabilities) {
+        return VcnUtils.getWifiInfoFromVcnCaps(connectivityMgr, networkCapabilities);
     }
 
     /** Whether there is any incompatible chargers in the current UsbPort? */
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java b/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java
index c8bcabf..261c722 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java
@@ -138,23 +138,37 @@
         }
 
         final PackageManager pmWrapper = mContext.getPackageManager();
+        // Add requesting apps, with full validation
         List<ResolveInfo> installedServices = pmWrapper.queryIntentServicesAsUser(
                 new Intent(mIntentAction), flags, user);
         for (ResolveInfo resolveInfo : installedServices) {
             ServiceInfo info = resolveInfo.serviceInfo;
 
-            if (!mPermission.equals(info.permission)) {
-                Slog.w(mTag, "Skipping " + mNoun + " service "
-                        + info.packageName + "/" + info.name
-                        + ": it does not require the permission "
-                        + mPermission);
-                continue;
+            if (!mEnabledServices.contains(info.getComponentName())) {
+                if (!mPermission.equals(info.permission)) {
+                    Slog.w(mTag, "Skipping " + mNoun + " service "
+                            + info.packageName + "/" + info.name
+                            + ": it does not require the permission "
+                            + mPermission);
+                    continue;
+                }
+                if (mValidator != null && !mValidator.test(info)) {
+                    continue;
+                }
+                mServices.add(info);
             }
-            if (mValidator != null && !mValidator.test(info)) {
-                continue;
-            }
-            mServices.add(info);
         }
+
+        // Add all apps with access, in case prior approval was granted without full validation
+        for (ComponentName cn : mEnabledServices) {
+            List<ResolveInfo> enabledServices = pmWrapper.queryIntentServicesAsUser(
+                    new Intent().setComponent(cn), flags, user);
+            for (ResolveInfo resolveInfo : enabledServices) {
+                ServiceInfo info = resolveInfo.serviceInfo;
+                mServices.add(info);
+            }
+        }
+
         for (Callback callback : mCallbacks) {
             callback.onServicesReloaded(mServices);
         }
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
index 616ab07..612c193 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
@@ -709,6 +709,9 @@
     @WorkerThread
     public static boolean hasConnectedBroadcastSourceForBtDevice(
             @Nullable BluetoothDevice device, @Nullable LocalBluetoothManager localBtManager) {
+        if (Flags.audioSharingHysteresisModeFix()) {
+            return hasActiveLocalBroadcastSourceForBtDevice(device, localBtManager);
+        }
         LocalBluetoothLeBroadcastAssistant assistant =
                 localBtManager == null
                         ? null
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
index 92da2be..8845d2e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
@@ -38,7 +38,6 @@
 import android.os.Message;
 import android.os.ParcelUuid;
 import android.os.SystemClock;
-import android.provider.Settings;
 import android.text.SpannableStringBuilder;
 import android.text.TextUtils;
 import android.text.style.ForegroundColorSpan;
@@ -1291,12 +1290,10 @@
         if (BluetoothUtils.hasConnectedBroadcastSource(this, mBluetoothManager)) {
             // Gets summary for the buds which are in the audio sharing.
             int groupId = BluetoothUtils.getGroupId(this);
-            if (groupId != BluetoothCsipSetCoordinator.GROUP_ID_INVALID
-                    && groupId
-                            == Settings.Secure.getInt(
-                                    mContext.getContentResolver(),
-                                    "bluetooth_le_broadcast_fallback_active_group_id",
-                                    BluetoothCsipSetCoordinator.GROUP_ID_INVALID)) {
+            int primaryGroupId = BluetoothUtils.getPrimaryGroupIdForBroadcast(
+                    mContext.getContentResolver());
+            if ((primaryGroupId != BluetoothCsipSetCoordinator.GROUP_ID_INVALID)
+                    ? (groupId == primaryGroupId) : isActiveDevice(BluetoothProfile.LE_AUDIO)) {
                 // The buds are primary buds
                 return getSummaryWithBatteryInfo(
                         R.string.bluetooth_active_battery_level_untethered,
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java
index a3f9e51..364e95c 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java
@@ -52,6 +52,7 @@
 import androidx.annotation.RequiresApi;
 
 import com.android.settingslib.R;
+import com.android.settingslib.flags.Flags;
 
 import com.google.common.collect.ImmutableList;
 
@@ -1134,20 +1135,8 @@
             Log.d(TAG, "Skip updateFallbackActiveDeviceIfNeeded due to assistant profile is null");
             return;
         }
-        List<BluetoothDevice> connectedDevices = mServiceBroadcastAssistant.getConnectedDevices();
-        List<BluetoothDevice> devicesInSharing =
-                connectedDevices.stream()
-                        .filter(
-                                bluetoothDevice -> {
-                                    List<BluetoothLeBroadcastReceiveState> sourceList =
-                                            mServiceBroadcastAssistant.getAllSources(
-                                                    bluetoothDevice);
-                                    return !sourceList.isEmpty()
-                                            && sourceList.stream()
-                                                    .anyMatch(BluetoothUtils::isConnected);
-                                })
-                        .collect(Collectors.toList());
-        if (devicesInSharing.isEmpty()) {
+        List<BluetoothDevice> devicesInBroadcast = getDevicesInBroadcast();
+        if (devicesInBroadcast.isEmpty()) {
             Log.d(TAG, "Skip updateFallbackActiveDeviceIfNeeded due to no sinks in broadcast");
             return;
         }
@@ -1156,7 +1145,7 @@
         BluetoothDevice targetDevice = null;
         // Find the earliest connected device in sharing session.
         int targetDeviceIdx = -1;
-        for (BluetoothDevice device : devicesInSharing) {
+        for (BluetoothDevice device : devicesInBroadcast) {
             if (devices.contains(device)) {
                 int idx = devices.indexOf(device);
                 if (idx > targetDeviceIdx) {
@@ -1169,10 +1158,6 @@
             Log.d(TAG, "Skip updateFallbackActiveDeviceIfNeeded, target is null");
             return;
         }
-        Log.d(
-                TAG,
-                "updateFallbackActiveDeviceIfNeeded, set active device: "
-                        + targetDevice.getAnonymizedAddress());
         CachedBluetoothDevice targetCachedDevice = mDeviceManager.findDevice(targetDevice);
         if (targetCachedDevice == null) {
             Log.d(TAG, "Skip updateFallbackActiveDeviceIfNeeded, fail to find cached bt device");
@@ -1180,16 +1165,37 @@
         }
         int fallbackActiveGroupId = getFallbackActiveGroupId();
         if (fallbackActiveGroupId != BluetoothCsipSetCoordinator.GROUP_ID_INVALID
-                && getGroupId(targetCachedDevice) == fallbackActiveGroupId) {
+                && BluetoothUtils.getGroupId(targetCachedDevice) == fallbackActiveGroupId) {
             Log.d(
                     TAG,
                     "Skip updateFallbackActiveDeviceIfNeeded, already is fallback: "
                             + fallbackActiveGroupId);
             return;
         }
+        Log.d(
+                TAG,
+                "updateFallbackActiveDeviceIfNeeded, set active device: "
+                        + targetDevice.getAnonymizedAddress());
         targetCachedDevice.setActive();
     }
 
+    private List<BluetoothDevice> getDevicesInBroadcast() {
+        boolean hysteresisModeFixEnabled = Flags.audioSharingHysteresisModeFix();
+        List<BluetoothDevice> connectedDevices = mServiceBroadcastAssistant.getConnectedDevices();
+        return connectedDevices.stream()
+                .filter(
+                        bluetoothDevice -> {
+                            List<BluetoothLeBroadcastReceiveState> sourceList =
+                                    mServiceBroadcastAssistant.getAllSources(
+                                            bluetoothDevice);
+                            return !sourceList.isEmpty() && sourceList.stream().anyMatch(
+                                    source -> hysteresisModeFixEnabled
+                                            ? BluetoothUtils.isSourceMatched(source, mBroadcastId)
+                                            : BluetoothUtils.isConnected(source));
+                        })
+                .collect(Collectors.toList());
+    }
+
     private int getFallbackActiveGroupId() {
         return Settings.Secure.getInt(
                 mContext.getContentResolver(),
@@ -1197,23 +1203,6 @@
                 BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
     }
 
-    private int getGroupId(CachedBluetoothDevice cachedDevice) {
-        int groupId = cachedDevice.getGroupId();
-        String anonymizedAddress = cachedDevice.getDevice().getAnonymizedAddress();
-        if (groupId != BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
-            Log.d(TAG, "getGroupId by CSIP profile for device: " + anonymizedAddress);
-            return groupId;
-        }
-        for (LocalBluetoothProfile profile : cachedDevice.getProfiles()) {
-            if (profile instanceof LeAudioProfile) {
-                Log.d(TAG, "getGroupId by LEA profile for device: " + anonymizedAddress);
-                return ((LeAudioProfile) profile).getGroupId(cachedDevice.getDevice());
-            }
-        }
-        Log.d(TAG, "getGroupId return invalid id for device: " + anonymizedAddress);
-        return BluetoothCsipSetCoordinator.GROUP_ID_INVALID;
-    }
-
     private void notifyBroadcastStateChange(@BroadcastState int state) {
         if (!mContext.getPackageName().equals(SETTINGS_PKG)) {
             Log.d(TAG, "Skip notifyBroadcastStateChange, not triggered by Settings.");
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/ActionSwitchPreference.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/ActionSwitchPreference.java
index 1cbb8b4..2b9088f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/ActionSwitchPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/ActionSwitchPreference.java
@@ -16,7 +16,6 @@
 
 package com.android.settingslib.bluetooth.devicesettings;
 
-import android.content.Intent;
 import android.graphics.Bitmap;
 import android.os.Bundle;
 import android.os.Parcel;
@@ -36,7 +35,7 @@
     private final String mTitle;
     private final String mSummary;
     private final Bitmap mIcon;
-    private final Intent mIntent;
+    private final DeviceSettingAction mAction;
     private final boolean mHasSwitch;
     private final boolean mChecked;
     private final boolean mIsAllowedChangingState;
@@ -46,7 +45,7 @@
             String title,
             @Nullable String summary,
             @Nullable Bitmap icon,
-            @Nullable Intent intent,
+            @NonNull DeviceSettingAction action,
             boolean hasSwitch,
             boolean checked,
             boolean allowChangingState,
@@ -56,7 +55,7 @@
         mTitle = title;
         mSummary = summary;
         mIcon = icon;
-        mIntent = intent;
+        mAction = action;
         mHasSwitch = hasSwitch;
         mChecked = checked;
         mIsAllowedChangingState = allowChangingState;
@@ -79,13 +78,13 @@
         String title = in.readString();
         String summary = in.readString();
         Bitmap icon = in.readParcelable(Bitmap.class.getClassLoader());
-        Intent intent = in.readParcelable(Intent.class.getClassLoader());
+        DeviceSettingAction action = DeviceSettingAction.readFromParcel(in);
         boolean hasSwitch = in.readBoolean();
         boolean checked = in.readBoolean();
         boolean allowChangingState = in.readBoolean();
         Bundle extras = in.readBundle(Bundle.class.getClassLoader());
         return new ActionSwitchPreference(
-                title, summary, icon, intent, hasSwitch, checked, allowChangingState, extras);
+                title, summary, icon, action, hasSwitch, checked, allowChangingState, extras);
     }
 
     public static final Creator<ActionSwitchPreference> CREATOR =
@@ -115,7 +114,7 @@
         dest.writeString(mTitle);
         dest.writeString(mSummary);
         dest.writeParcelable(mIcon, flags);
-        dest.writeParcelable(mIntent, flags);
+        mAction.writeToParcel(dest, flags);
         dest.writeBoolean(mHasSwitch);
         dest.writeBoolean(mChecked);
         dest.writeBoolean(mIsAllowedChangingState);
@@ -127,7 +126,7 @@
         private String mTitle;
         private String mSummary;
         private Bitmap mIcon;
-        private Intent mIntent;
+        private DeviceSettingAction mAction = DeviceSettingAction.EMPTY_ACTION;
         private boolean mHasSwitch;
         private boolean mChecked;
         private boolean mIsAllowedChangingState;
@@ -170,14 +169,14 @@
         }
 
         /**
-         * Sets the Intent to launch when the preference is clicked, optional.
+         * Sets the action to trigger when the preference is clicked, optional.
          *
-         * @param intent The Intent.
+         * @param action The action to trigger.
          * @return Returns the Builder object.
          */
         @NonNull
-        public Builder setIntent(@Nullable Intent intent) {
-            mIntent = intent;
+        public Builder setAction(@Nullable DeviceSettingAction action) {
+            mAction = action == null ? DeviceSettingAction.EMPTY_ACTION : action;
             return this;
         }
 
@@ -239,7 +238,7 @@
                     mTitle,
                     mSummary,
                     mIcon,
-                    mIntent,
+                    mAction,
                     mHasSwitch,
                     mChecked,
                     mIsAllowedChangingState,
@@ -278,13 +277,13 @@
     }
 
     /**
-     * Gets the Intent to launch when the preference is clicked.
+     * Gets the action to trigger when the preference is clicked.
      *
      * @return Returns the intent to launch.
      */
-    @Nullable
-    public Intent getIntent() {
-        return mIntent;
+    @NonNull
+    public DeviceSettingAction getAction() {
+        return mAction;
     }
 
     /**
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingAction.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingAction.java
new file mode 100644
index 0000000..01783e0
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingAction.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2024 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.settingslib.bluetooth.devicesettings;
+
+import android.os.Parcel;
+
+import androidx.annotation.NonNull;
+
+/** An abstract class representing a device setting action. */
+public abstract class DeviceSettingAction {
+    @DeviceSettingActionType private final int mActionType;
+
+    public static final DeviceSettingAction EMPTY_ACTION =
+            new DeviceSettingAction(DeviceSettingActionType.DEVICE_SETTING_ACTION_TYPE_UNKNOWN) {};
+
+    protected DeviceSettingAction(@DeviceSettingActionType int actionType) {
+        mActionType = actionType;
+    }
+
+    /** Read a {@link DeviceSettingPreference} instance from {@link Parcel} */
+    @NonNull
+    public static DeviceSettingAction readFromParcel(@NonNull Parcel in) {
+        int type = in.readInt();
+        return switch (type) {
+            case DeviceSettingActionType.DEVICE_SETTING_ACTION_TYPE_INTENT ->
+                    DeviceSettingIntentAction.readFromParcel(in);
+            case DeviceSettingActionType.DEVICE_SETTING_ACTION_TYPE_PENDING_INTENT ->
+                    DeviceSettingPendingIntentAction.readFromParcel(in);
+            default -> EMPTY_ACTION;
+        };
+    }
+
+    /** Writes the instance to {@link Parcel}. */
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        dest.writeInt(mActionType);
+    }
+
+    /**
+     * Gets the setting action type, as defined by IntDef {@link DeviceSettingActionType}.
+     *
+     * @return the setting action type.
+     */
+    @DeviceSettingType
+    public int getActionType() {
+        return mActionType;
+    }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingActionType.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingActionType.java
new file mode 100644
index 0000000..13d3583
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingActionType.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2024 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.settingslib.bluetooth.devicesettings;
+
+import androidx.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.SOURCE)
+@IntDef(
+        value = {
+            DeviceSettingActionType.DEVICE_SETTING_ACTION_TYPE_UNKNOWN,
+            DeviceSettingActionType.DEVICE_SETTING_ACTION_TYPE_INTENT,
+            DeviceSettingActionType.DEVICE_SETTING_ACTION_TYPE_PENDING_INTENT,
+        },
+        open = true)
+public @interface DeviceSettingActionType {
+    /** Device setting action type is unknown. */
+    int DEVICE_SETTING_ACTION_TYPE_UNKNOWN = 0;
+
+    /** Device setting action is an intent to start an activity. */
+    int DEVICE_SETTING_ACTION_TYPE_INTENT = 1;
+
+    /** Device setting action is a pending intent. */
+    int DEVICE_SETTING_ACTION_TYPE_PENDING_INTENT = 2;
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingId.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingId.java
index 58dc8c7..e7c7476 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingId.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingId.java
@@ -45,6 +45,7 @@
             DeviceSettingId.DEVICE_SETTING_ID_KEYBOARD_SETTINGS,
             DeviceSettingId.DEVICE_SETTING_ID_DEVICE_DETAILS_FOOTER,
             DeviceSettingId.DEVICE_SETTING_ID_ANC,
+            DeviceSettingId.DEVICE_SETTING_ID_GENERAL_BLUETOOTH_DEVICE_HEADER,
         },
         open = true)
 public @interface DeviceSettingId {
@@ -114,6 +115,9 @@
     /** Device setting ID for "More Settings" page. */
     int DEVICE_SETTING_ID_MORE_SETTINGS = 21;
 
+    /** Device setting ID for general bluetooth device header. */
+    int DEVICE_SETTING_ID_GENERAL_BLUETOOTH_DEVICE_HEADER = 22;
+
     /** Device setting ID for ANC. */
     int DEVICE_SETTING_ID_ANC = 1001;
 }
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingIntentAction.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingIntentAction.java
new file mode 100644
index 0000000..a1136e6
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingIntentAction.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2024 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.settingslib.bluetooth.devicesettings;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import androidx.annotation.NonNull;
+
+import java.util.Objects;
+
+/** An abstract class representing a device setting action. */
+public class DeviceSettingIntentAction extends DeviceSettingAction implements Parcelable {
+    private final Intent mIntent;
+    private final Bundle mExtras;
+
+    DeviceSettingIntentAction(@NonNull Intent intent, @NonNull Bundle extras) {
+        super(DeviceSettingActionType.DEVICE_SETTING_ACTION_TYPE_INTENT);
+        validate(intent);
+        mIntent = intent;
+        mExtras = extras;
+    }
+
+    private static void validate(Intent intent) {
+        if (Objects.isNull(intent)) {
+            throw new IllegalArgumentException("Intent must be set");
+        }
+    }
+
+    /** Read a {@link DeviceSettingIntentAction} instance from {@link Parcel} */
+    @NonNull
+    public static DeviceSettingIntentAction readFromParcel(@NonNull Parcel in) {
+        Intent intent = in.readParcelable(Intent.class.getClassLoader());
+        Bundle extras = in.readBundle(Bundle.class.getClassLoader());
+        return new DeviceSettingIntentAction(intent, extras);
+    }
+
+    public static final Creator<DeviceSettingIntentAction> CREATOR =
+            new Creator<>() {
+                @Override
+                @NonNull
+                public DeviceSettingIntentAction createFromParcel(@NonNull Parcel in) {
+                    in.readInt();
+                    return readFromParcel(in);
+                }
+
+                @Override
+                @NonNull
+                public DeviceSettingIntentAction[] newArray(int size) {
+                    return new DeviceSettingIntentAction[size];
+                }
+            };
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    /** Writes the instance to {@link Parcel}. */
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        super.writeToParcel(dest, flags);
+        dest.writeParcelable(mIntent, flags);
+        dest.writeBundle(mExtras);
+    }
+
+    /** Builder class for {@link DeviceSettingFooterPreference}. */
+    public static final class Builder {
+        private Intent mIntent = null;
+        private Bundle mExtras = Bundle.EMPTY;
+
+        /**
+         * Sets the intent for the action.
+         *
+         * @param intent The intent.
+         * @return Returns the Builder object.
+         */
+        @NonNull
+        public Builder setIntent(@NonNull Intent intent) {
+            mIntent = intent;
+            return this;
+        }
+
+        /**
+         * Sets the extras bundle.
+         *
+         * @return Returns the Builder object.
+         */
+        @NonNull
+        public Builder setExtras(@NonNull Bundle extras) {
+            mExtras = extras;
+            return this;
+        }
+
+        /**
+         * Builds the {@link DeviceSettingIntentAction} object.
+         *
+         * @return Returns the built {@link DeviceSettingIntentAction} object.
+         */
+        @NonNull
+        public DeviceSettingIntentAction build() {
+            return new DeviceSettingIntentAction(mIntent, mExtras);
+        }
+    }
+
+    /** Gets the intent. */
+    @NonNull
+    public Intent getIntent() {
+        return mIntent;
+    }
+
+    /** Gets the extra bundle. */
+    @NonNull
+    public Bundle getExtras() {
+        return mExtras;
+    }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingItem.kt b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingItem.kt
index 38183d5..da01b3b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingItem.kt
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingItem.kt
@@ -32,9 +32,9 @@
  */
 data class DeviceSettingItem(
     @DeviceSettingId val settingId: Int,
-    val packageName: String,
-    val className: String,
-    val intentAction: String,
+    val packageName: String? = null,
+    val className: String? = null,
+    val intentAction: String? = null,
     val preferenceKey: String? = null,
     val highlighted: Boolean = false,
     val extras: Bundle = Bundle.EMPTY,
@@ -62,11 +62,11 @@
                     parcel.run {
                         DeviceSettingItem(
                             settingId = readInt(),
-                            packageName = readString() ?: "",
-                            className = readString() ?: "",
-                            intentAction = readString() ?: "",
+                            packageName = readString(),
+                            className = readString(),
+                            intentAction = readString(),
                             highlighted = readBoolean(),
-                            preferenceKey = readString() ?: "",
+                            preferenceKey = readString(),
                             extras = readBundle((Bundle::class.java.classLoader)) ?: Bundle.EMPTY,
                         )
                     }
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingPendingIntentAction.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingPendingIntentAction.java
new file mode 100644
index 0000000..3d4282c
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingPendingIntentAction.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2024 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.settingslib.bluetooth.devicesettings;
+
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import androidx.annotation.NonNull;
+
+import java.util.Objects;
+
+/** An abstract class representing a device setting action. */
+public class DeviceSettingPendingIntentAction extends DeviceSettingAction implements Parcelable {
+    private final PendingIntent mPendingIntent;
+    private final Bundle mExtras;
+
+    DeviceSettingPendingIntentAction(@NonNull PendingIntent pendingIntent, @NonNull Bundle extras) {
+        super(DeviceSettingActionType.DEVICE_SETTING_ACTION_TYPE_PENDING_INTENT);
+        validate(pendingIntent);
+        mPendingIntent = pendingIntent;
+        mExtras = extras;
+    }
+
+    private static void validate(PendingIntent pendingIntent) {
+        if (Objects.isNull(pendingIntent)) {
+            throw new IllegalArgumentException("PendingIntent must be set");
+        }
+    }
+
+    /** Read a {@link DeviceSettingPendingIntentAction} instance from {@link Parcel} */
+    @NonNull
+    public static DeviceSettingPendingIntentAction readFromParcel(@NonNull Parcel in) {
+        PendingIntent pendingIntent = in.readParcelable(Intent.class.getClassLoader());
+        Bundle extras = in.readBundle(Bundle.class.getClassLoader());
+        return new DeviceSettingPendingIntentAction(pendingIntent, extras);
+    }
+
+    public static final Creator<DeviceSettingPendingIntentAction> CREATOR =
+            new Creator<>() {
+                @Override
+                @NonNull
+                public DeviceSettingPendingIntentAction createFromParcel(@NonNull Parcel in) {
+                    in.readInt();
+                    return readFromParcel(in);
+                }
+
+                @Override
+                @NonNull
+                public DeviceSettingPendingIntentAction[] newArray(int size) {
+                    return new DeviceSettingPendingIntentAction[size];
+                }
+            };
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    /** Writes the instance to {@link Parcel}. */
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        super.writeToParcel(dest, flags);
+        dest.writeParcelable(mPendingIntent, flags);
+        dest.writeBundle(mExtras);
+    }
+
+    /** Builder class for {@link DeviceSettingFooterPreference}. */
+    public static final class Builder {
+        private PendingIntent mPendingIntent = null;
+        private Bundle mExtras = Bundle.EMPTY;
+
+        /**
+         * Sets the intent for the action.
+         *
+         * @param pendingIntent The pending intent.
+         * @return Returns the Builder object.
+         */
+        @NonNull
+        public Builder setPendingIntent(@NonNull PendingIntent pendingIntent) {
+            mPendingIntent = pendingIntent;
+            return this;
+        }
+
+        /**
+         * Sets the extras bundle.
+         *
+         * @return Returns the Builder object.
+         */
+        @NonNull
+        public Builder setExtras(@NonNull Bundle extras) {
+            mExtras = extras;
+            return this;
+        }
+
+        /**
+         * Builds the {@link DeviceSettingPendingIntentAction} object.
+         *
+         * @return Returns the built {@link DeviceSettingPendingIntentAction} object.
+         */
+        @NonNull
+        public DeviceSettingPendingIntentAction build() {
+            return new DeviceSettingPendingIntentAction(mPendingIntent, mExtras);
+        }
+    }
+
+    /** Gets the pending intent. */
+    @NonNull
+    public PendingIntent getPendingIntent() {
+        return mPendingIntent;
+    }
+
+    /** Gets the extra bundle. */
+    @NonNull
+    public Bundle getExtras() {
+        return mExtras;
+    }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingType.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingType.java
index ae3bf5e..3cc1343 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingType.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingType.java
@@ -28,6 +28,7 @@
             DeviceSettingType.DEVICE_SETTING_TYPE_ACTION_SWITCH,
             DeviceSettingType.DEVICE_SETTING_TYPE_MULTI_TOGGLE,
             DeviceSettingType.DEVICE_SETTING_TYPE_FOOTER,
+            DeviceSettingType.DEVICE_SETTING_TYPE_HELP,
         },
         open = true)
 public @interface DeviceSettingType {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfig.kt b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfig.kt
index 5656f38..3627669 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfig.kt
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfig.kt
@@ -63,7 +63,8 @@
                                 },
                             moreSettingsHelpItem = readParcelable(
                                 DeviceSettingItem::class.java.classLoader
-                            )
+                            ),
+                            extras = readBundle((Bundle::class.java.classLoader)) ?: Bundle.EMPTY,
                         )
                     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigServiceStatus.aidl b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigServiceStatus.aidl
new file mode 100644
index 0000000..d837806
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigServiceStatus.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2024 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.settingslib.bluetooth.devicesettings;
+
+parcelable DeviceSettingsConfigServiceStatus;
\ No newline at end of file
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigServiceStatus.kt b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigServiceStatus.kt
new file mode 100644
index 0000000..ae86771
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigServiceStatus.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2024 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.settingslib.bluetooth.devicesettings
+
+import android.os.Bundle
+import android.os.Parcel
+import android.os.Parcelable
+
+/**
+ * A data class representing a device settings config service status.
+ *
+ * @property success Whether the status is succeed.
+ * @property extras Extra bundle
+ */
+data class DeviceSettingsConfigServiceStatus(
+    val success: Boolean,
+    val extras: Bundle = Bundle.EMPTY,
+) : Parcelable {
+
+    override fun describeContents(): Int = 0
+
+    override fun writeToParcel(parcel: Parcel, flags: Int) {
+        parcel.run {
+            writeBoolean(success)
+            writeBundle(extras)
+        }
+    }
+
+    companion object {
+        @JvmField
+        val CREATOR: Parcelable.Creator<DeviceSettingsConfigServiceStatus> =
+            object : Parcelable.Creator<DeviceSettingsConfigServiceStatus> {
+                override fun createFromParcel(parcel: Parcel) =
+                    parcel.run {
+                        DeviceSettingsConfigServiceStatus(
+                            success = readBoolean(),
+                            extras = readBundle((Bundle::class.java.classLoader)) ?: Bundle.EMPTY,
+                        )
+                    }
+
+                override fun newArray(size: Int): Array<DeviceSettingsConfigServiceStatus?> {
+                    return arrayOfNulls(size)
+                }
+            }
+    }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsProviderServiceStatus.kt b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsProviderServiceStatus.kt
index 977849e..77d790e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsProviderServiceStatus.kt
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsProviderServiceStatus.kt
@@ -21,7 +21,7 @@
 import android.os.Parcelable
 
 /**
- * A data class representing a device settings item in bluetooth device details config.
+ * A data class representing a device settings provider service status.
  *
  * @property enabled Whether the service is enabled.
  * @property extras Extra bundle
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/IDeviceSettingsConfigProviderService.aidl b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/IDeviceSettingsConfigProviderService.aidl
index 647611e..9cf4907 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/IDeviceSettingsConfigProviderService.aidl
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/IDeviceSettingsConfigProviderService.aidl
@@ -17,8 +17,8 @@
 package com.android.settingslib.bluetooth.devicesettings;
 
 import com.android.settingslib.bluetooth.devicesettings.DeviceInfo;
-import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsConfig;
+import com.android.settingslib.bluetooth.devicesettings.IGetDeviceSettingsConfigCallback;
 
 interface IDeviceSettingsConfigProviderService {
-   DeviceSettingsConfig getDeviceSettingsConfig(in DeviceInfo device);
+   oneway void getDeviceSettingsConfig(in DeviceInfo device, in IGetDeviceSettingsConfigCallback callback);
 }
\ No newline at end of file
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/IGetDeviceSettingsConfigCallback.aidl b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/IGetDeviceSettingsConfigCallback.aidl
new file mode 100644
index 0000000..403cdd9
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/IGetDeviceSettingsConfigCallback.aidl
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2024 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.settingslib.bluetooth.devicesettings;
+
+import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsConfig;
+import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsConfigServiceStatus;
+
+interface IGetDeviceSettingsConfigCallback {
+   oneway void onResult(in DeviceSettingsConfigServiceStatus status, in DeviceSettingsConfig config) = 0;
+}
\ No newline at end of file
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepository.kt b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepository.kt
index 851b614..8537897 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepository.kt
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepository.kt
@@ -22,14 +22,18 @@
 import com.android.settingslib.bluetooth.CachedBluetoothDevice
 import com.android.settingslib.bluetooth.devicesettings.ActionSwitchPreference
 import com.android.settingslib.bluetooth.devicesettings.DeviceSetting
+import com.android.settingslib.bluetooth.devicesettings.DeviceSettingAction
 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingContract
-import com.android.settingslib.bluetooth.devicesettings.DeviceSettingId
-import com.android.settingslib.bluetooth.devicesettings.DeviceSettingItem
-import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsConfig
 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingFooterPreference
 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingHelpPreference
+import com.android.settingslib.bluetooth.devicesettings.DeviceSettingId
+import com.android.settingslib.bluetooth.devicesettings.DeviceSettingIntentAction
+import com.android.settingslib.bluetooth.devicesettings.DeviceSettingItem
+import com.android.settingslib.bluetooth.devicesettings.DeviceSettingPendingIntentAction
+import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsConfig
 import com.android.settingslib.bluetooth.devicesettings.MultiTogglePreference
 import com.android.settingslib.bluetooth.devicesettings.ToggleInfo
+import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingActionModel
 import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingConfigItemModel
 import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingConfigItemModel.AppProvidedItem
 import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingConfigItemModel.BuiltinItem.BluetoothProfilesItem
@@ -58,7 +62,7 @@
     /** Gets device setting for the bluetooth device. */
     fun getDeviceSetting(
         cachedDevice: CachedBluetoothDevice,
-        @DeviceSettingId settingId: Int
+        @DeviceSettingId settingId: Int,
     ): Flow<DeviceSettingModel?>
 }
 
@@ -84,7 +88,8 @@
                             coroutineScope,
                             backgroundCoroutineContext,
                         )
-                })
+                }
+            )
 
     override suspend fun getDeviceSettingsConfig(
         cachedDevice: CachedBluetoothDevice
@@ -93,7 +98,7 @@
 
     override fun getDeviceSetting(
         cachedDevice: CachedBluetoothDevice,
-        settingId: Int
+        settingId: Int,
     ): Flow<DeviceSettingModel?> =
         connectionCache.get(cachedDevice).let { connection ->
             connection.getDeviceSetting(settingId).map { it?.toModel(cachedDevice, connection) }
@@ -103,7 +108,8 @@
         DeviceSettingConfigModel(
             mainItems = mainContentItems.map { it.toModel() },
             moreSettingsItems = moreSettingsItems.map { it.toModel() },
-            moreSettingsHelpItem = moreSettingsHelpItem?.toModel(), )
+            moreSettingsHelpItem = moreSettingsHelpItem?.toModel(),
+        )
 
     private fun DeviceSettingItem.toModel(): DeviceSettingConfigItemModel {
         return if (!TextUtils.isEmpty(preferenceKey)) {
@@ -113,7 +119,7 @@
                     highlighted,
                     preferenceKey!!,
                     extras.getStringArrayList(DeviceSettingContract.INVISIBLE_PROFILES)
-                        ?: emptyList()
+                        ?: emptyList(),
                 )
             } else {
                 CommonBuiltinItem(settingId, highlighted, preferenceKey!!)
@@ -123,9 +129,17 @@
         }
     }
 
+    private fun DeviceSettingAction.toModel(): DeviceSettingActionModel? =
+        when (this) {
+            is DeviceSettingIntentAction -> DeviceSettingActionModel.IntentAction(this.intent)
+            is DeviceSettingPendingIntentAction ->
+                DeviceSettingActionModel.PendingIntentAction(this.pendingIntent)
+            else -> null
+        }
+
     private fun DeviceSetting.toModel(
         cachedDevice: CachedBluetoothDevice,
-        connection: DeviceSettingServiceConnection
+        connection: DeviceSettingServiceConnection,
     ): DeviceSettingModel =
         when (val pref = preference) {
             is ActionSwitchPreference ->
@@ -136,7 +150,7 @@
                     summary = pref.summary,
                     icon = pref.icon?.let { DeviceSettingIcon.BitmapIcon(it) },
                     isAllowedChangingState = pref.isAllowedChangingState,
-                    intent = pref.intent,
+                    action = pref.action?.toModel(),
                     switchState =
                         if (pref.hasSwitch()) {
                             DeviceSettingStateModel.ActionSwitchPreferenceState(pref.checked)
@@ -145,10 +159,7 @@
                         },
                     updateState = { newState ->
                         coroutineScope.launch(backgroundCoroutineContext) {
-                            connection.updateDeviceSettings(
-                                settingId,
-                                newState.toParcelable(),
-                            )
+                            connection.updateDeviceSettings(settingId, newState.toParcelable())
                         }
                     },
                 )
@@ -167,12 +178,18 @@
                         }
                     },
                 )
-            is DeviceSettingFooterPreference -> DeviceSettingModel.FooterPreference(
-                cachedDevice = cachedDevice,
-                id = settingId, footerText = pref.footerText)
-            is DeviceSettingHelpPreference -> DeviceSettingModel.HelpPreference(
-                cachedDevice = cachedDevice,
-                id = settingId, intent = pref.intent)
+            is DeviceSettingFooterPreference ->
+                DeviceSettingModel.FooterPreference(
+                    cachedDevice = cachedDevice,
+                    id = settingId,
+                    footerText = pref.footerText,
+                )
+            is DeviceSettingHelpPreference ->
+                DeviceSettingModel.HelpPreference(
+                    cachedDevice = cachedDevice,
+                    id = settingId,
+                    intent = pref.intent,
+                )
             else -> DeviceSettingModel.Unknown(cachedDevice, settingId)
         }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingServiceConnection.kt b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingServiceConnection.kt
index 3d8ff86..4af0504 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingServiceConnection.kt
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingServiceConnection.kt
@@ -33,12 +33,15 @@
 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingPreferenceState
 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingState
 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsConfig
+import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsConfigServiceStatus
 import com.android.settingslib.bluetooth.devicesettings.IDeviceSettingsConfigProviderService
 import com.android.settingslib.bluetooth.devicesettings.IDeviceSettingsListener
 import com.android.settingslib.bluetooth.devicesettings.IDeviceSettingsProviderService
+import com.android.settingslib.bluetooth.devicesettings.IGetDeviceSettingsConfigCallback
 import com.android.settingslib.bluetooth.devicesettings.data.model.ServiceConnectionStatus
 import java.util.concurrent.ConcurrentHashMap
 import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.resume
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.CoroutineStart
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -63,6 +66,7 @@
 import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.plus
+import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlinx.coroutines.withContext
 
 @OptIn(ExperimentalCoroutinesApi::class)
@@ -74,22 +78,22 @@
     private val backgroundCoroutineContext: CoroutineContext,
 ) {
     data class EndPoint(
-        private val packageName: String,
+        private val packageName: String?,
         private val className: String?,
-        private val intentAction: String,
+        private val intentAction: String?,
     ) {
-        fun toIntent(): Intent =
-            Intent().apply {
+        fun toIntent(): Intent? {
+            if (TextUtils.isEmpty(packageName) || TextUtils.isEmpty(intentAction)) {
+                return null
+            }
+            return Intent().apply {
                 if (className.isNullOrBlank()) {
                     setPackage(packageName)
                 } else {
-                    setClassName(packageName, className)
+                    setClassName(packageName!!, className)
                 }
                 setAction(intentAction)
             }
-
-        fun isValid(): Boolean {
-            return !TextUtils.isEmpty(packageName) && !TextUtils.isEmpty(intentAction)
         }
     }
 
@@ -126,8 +130,9 @@
                     when (it) {
                         is ServiceConnectionStatus.Connected ->
                             flowOf(
-                                it.service.getDeviceSettingsConfig(
-                                    deviceInfo { setBluetoothAddress(cachedDevice.address) }
+                                getDeviceSettingsConfigFromService(
+                                    deviceInfo { setBluetoothAddress(cachedDevice.address) },
+                                    it.service,
                                 )
                             )
                         ServiceConnectionStatus.Connecting -> flowOf()
@@ -137,6 +142,27 @@
                 .first()
         }
 
+    private suspend fun getDeviceSettingsConfigFromService(
+        deviceInfo: DeviceInfo,
+        service: IDeviceSettingsConfigProviderService,
+    ): DeviceSettingsConfig? = suspendCancellableCoroutine { continuation ->
+        service.getDeviceSettingsConfig(
+            deviceInfo,
+            object : IGetDeviceSettingsConfigCallback.Stub() {
+                override fun onResult(
+                    status: DeviceSettingsConfigServiceStatus,
+                    config: DeviceSettingsConfig?,
+                ) {
+                    if (!status.success) {
+                        continuation.resume(null)
+                    } else {
+                        continuation.resume(config)
+                    }
+                }
+            },
+        )
+    }
+
     private val settingIdToItemMapping =
         flow {
                 if (!isServiceEnabled.await()) {
@@ -160,6 +186,12 @@
             }
             .shareIn(scope = coroutineScope, started = SharingStarted.WhileSubscribed(), replay = 1)
 
+    private val services =
+        ConcurrentHashMap<
+            EndPoint,
+            StateFlow<ServiceConnectionStatus<IDeviceSettingsProviderService>>,
+        >()
+
     /** Gets [DeviceSettingsConfig] for the device, return null when failed. */
     suspend fun getDeviceSettingsConfig(): DeviceSettingsConfig? {
         if (!isServiceEnabled.await()) {
@@ -222,24 +254,23 @@
                     )
                 }
             }
-            ?.filter { it.isValid() }
             ?.distinct()
-            ?.associateBy(
-                { it },
-                { endpoint ->
-                    services.computeIfAbsent(endpoint) {
-                        getService(
-                                endpoint.toIntent(),
-                                IDeviceSettingsProviderService.Stub::asInterface,
-                            )
-                            .stateIn(
-                                coroutineScope.plus(backgroundCoroutineContext),
-                                SharingStarted.WhileSubscribed(),
-                                ServiceConnectionStatus.Connecting,
-                            )
-                    }
-                },
-            )
+            ?.mapNotNull { endpoint ->
+                endpoint.toIntent()?.let { intent ->
+                    Pair(
+                        endpoint,
+                        services.computeIfAbsent(endpoint) {
+                            getService(intent, IDeviceSettingsProviderService.Stub::asInterface)
+                                .stateIn(
+                                    coroutineScope.plus(backgroundCoroutineContext),
+                                    SharingStarted.WhileSubscribed(),
+                                    ServiceConnectionStatus.Connecting,
+                                )
+                        },
+                    )
+                }
+            }
+            ?.toMap()
 
     private fun getDeviceSettingsFromService(
         cachedDevice: CachedBluetoothDevice,
@@ -320,11 +351,5 @@
         const val CONFIG_SERVICE_PACKAGE_NAME = "DEVICE_SETTINGS_CONFIG_PACKAGE_NAME"
         const val CONFIG_SERVICE_CLASS_NAME = "DEVICE_SETTINGS_CONFIG_CLASS"
         const val CONFIG_SERVICE_INTENT_ACTION = "DEVICE_SETTINGS_CONFIG_ACTION"
-
-        val services =
-            ConcurrentHashMap<
-                EndPoint,
-                StateFlow<ServiceConnectionStatus<IDeviceSettingsProviderService>>,
-            >()
     }
 }
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingModel.kt b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingModel.kt
index 73648ac..4d9f2d6 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingModel.kt
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingModel.kt
@@ -16,6 +16,7 @@
 
 package com.android.settingslib.bluetooth.devicesettings.shared.model
 
+import android.app.PendingIntent
 import android.content.Intent
 import android.graphics.Bitmap
 import androidx.annotation.DrawableRes
@@ -34,7 +35,7 @@
         val title: String,
         val summary: String? = null,
         val icon: DeviceSettingIcon? = null,
-        val intent: Intent? = null,
+        val action: DeviceSettingActionModel? = null,
         val switchState: DeviceSettingStateModel.ActionSwitchPreferenceState? = null,
         val isAllowedChangingState: Boolean = true,
         val updateState: ((DeviceSettingStateModel.ActionSwitchPreferenceState) -> Unit)? = null,
@@ -83,3 +84,11 @@
 
     data class ResourceIcon(@DrawableRes val resId: Int) : DeviceSettingIcon
 }
+
+/** Models an action in device settings. */
+sealed interface DeviceSettingActionModel {
+
+    data class IntentAction(val intent: Intent) : DeviceSettingActionModel
+
+    data class PendingIntentAction(val pendingIntent: PendingIntent) : DeviceSettingActionModel
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java
index ef0f6cb..13a0601 100644
--- a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java
@@ -42,6 +42,8 @@
 import com.android.settingslib.R;
 import com.android.settingslib.Utils;
 
+import java.util.Objects;
+
 /**
  * Drawable displaying a mobile cell signal indicator.
  */
@@ -90,6 +92,10 @@
     private int mCurrentDot;
 
     public SignalDrawable(Context context) {
+        this(context, new Handler());
+    }
+
+    public SignalDrawable(@NonNull Context context, @NonNull Handler handler) {
         super(context.getDrawable(ICON_RES));
         final String attributionPathString = context.getString(
                 com.android.internal.R.string.config_signalAttributionPath);
@@ -106,7 +112,7 @@
         mIntrinsicSize = context.getResources().getDimensionPixelSize(R.dimen.signal_icon_size);
         mTransparentPaint.setColor(context.getColor(android.R.color.transparent));
         mTransparentPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
-        mHandler = new Handler();
+        mHandler = handler;
         setDarkIntensity(0);
     }
 
@@ -304,6 +310,17 @@
                 | level;
     }
 
+    @Override
+    public boolean equals(@Nullable Object other) {
+        return other instanceof SignalDrawable
+                && ((SignalDrawable) other).getLevel() == this.getLevel();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(getLevel());
+    }
+
     /** Returns the state representing empty mobile signal with the given number of levels. */
     public static int getEmptyState(int numLevels) {
         return getState(0, numLevels, true);
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InputMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/InputMediaDevice.java
index dae69e6..1d17b00 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/InputMediaDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/InputMediaDevice.java
@@ -15,6 +15,7 @@
  */
 package com.android.settingslib.media;
 
+import static android.media.AudioDeviceInfo.TYPE_BLUETOOTH_SCO;
 import static android.media.AudioDeviceInfo.TYPE_BUILTIN_MIC;
 import static android.media.AudioDeviceInfo.TYPE_USB_ACCESSORY;
 import static android.media.AudioDeviceInfo.TYPE_USB_DEVICE;
@@ -90,7 +91,8 @@
                             TYPE_WIRED_HEADSET,
                             TYPE_USB_DEVICE,
                             TYPE_USB_HEADSET,
-                            TYPE_USB_ACCESSORY ->
+                            TYPE_USB_ACCESSORY,
+                            TYPE_BLUETOOTH_SCO ->
                     true;
             default -> false;
         };
@@ -98,14 +100,15 @@
 
     @Override
     public @NonNull String getName() {
-        CharSequence name =
-                switch (mAudioDeviceInfoType) {
-                    case TYPE_WIRED_HEADSET ->
-                            mContext.getString(R.string.media_transfer_wired_device_mic_name);
-                    case TYPE_USB_DEVICE, TYPE_USB_HEADSET, TYPE_USB_ACCESSORY ->
-                            mContext.getString(R.string.media_transfer_usb_device_mic_name);
-                    default -> mContext.getString(R.string.media_transfer_internal_mic);
-                };
+        CharSequence name = switch (mAudioDeviceInfoType) {
+            case TYPE_WIRED_HEADSET -> mContext.getString(
+                    R.string.media_transfer_wired_device_mic_name);
+            case TYPE_USB_DEVICE, TYPE_USB_HEADSET, TYPE_USB_ACCESSORY -> mContext.getString(
+                    R.string.media_transfer_usb_device_mic_name);
+            case TYPE_BLUETOOTH_SCO -> mContext.getString(
+                    R.string.media_transfer_bt_device_mic_name);
+            default -> mContext.getString(R.string.media_transfer_this_device_name_desktop);
+        };
         return name.toString();
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java
index 0b8fb22ce..feaf7fb 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java
@@ -97,7 +97,7 @@
             case TYPE_USB_ACCESSORY:
                 name =
                         inputRoutingEnabledAndIsDesktop()
-                                ? context.getString(R.string.media_transfer_usb_speaker_name)
+                                ? context.getString(R.string.media_transfer_usb_audio_name)
                                 : context.getString(R.string.media_transfer_wired_headphone_name);
                 break;
             case TYPE_DOCK:
diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/modes/TestModeBuilder.java b/packages/SettingsLib/src/com/android/settingslib/notification/modes/TestModeBuilder.java
index 712ddc8..5eeb49a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/notification/modes/TestModeBuilder.java
+++ b/packages/SettingsLib/src/com/android/settingslib/notification/modes/TestModeBuilder.java
@@ -167,6 +167,13 @@
         return this;
     }
 
+    public TestModeBuilder setVisualEffect(int effect, boolean allowed) {
+        ZenPolicy newPolicy = new ZenPolicy.Builder(mRule.getZenPolicy())
+                .showVisualEffect(effect, allowed).build();
+        setZenPolicy(newPolicy);
+        return this;
+    }
+
     public TestModeBuilder setEnabled(boolean enabled) {
         return setEnabled(enabled, /* byUser= */ false);
     }
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
index 015356e..cea3d17 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
@@ -30,6 +30,7 @@
 import android.net.ScoredNetwork;
 import android.net.TransportInfo;
 import android.net.vcn.VcnTransportInfo;
+import android.net.vcn.VcnUtils;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
 import android.net.wifi.WifiNetworkScoreCache;
@@ -394,10 +395,7 @@
 
         TransportInfo transportInfo = networkCapabilities.getTransportInfo();
         if (transportInfo instanceof VcnTransportInfo) {
-            // This VcnTransportInfo logic is copied from
-            // [com.android.settingslib.Utils.tryGetWifiInfoForVcn]. It's copied instead of
-            // re-used because it makes the logic here clearer.
-            return ((VcnTransportInfo) transportInfo).getWifiInfo();
+            return VcnUtils.getWifiInfoFromVcnCaps(mConnectivityManager, networkCapabilities);
         } else if (transportInfo instanceof WifiInfo) {
             return (WifiInfo) transportInfo;
         } else {
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ServiceListingTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ServiceListingTest.java
index 7ff0988..feef559 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ServiceListingTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ServiceListingTest.java
@@ -21,6 +21,7 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
@@ -29,6 +30,7 @@
 
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
@@ -42,6 +44,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
+import org.mockito.ArgumentMatcher;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
@@ -72,19 +75,26 @@
                 .build();
     }
 
+    private ArgumentMatcher<Intent> filterEquals(Intent intent) {
+        return (test) -> {
+            return intent.filterEquals(test);
+        };
+    }
+
     @Test
     public void testValidator() {
         ServiceInfo s1 = new ServiceInfo();
         s1.permission = "testPermission";
         s1.packageName = "pkg";
+        s1.name = "Service1";
         ServiceInfo s2 = new ServiceInfo();
         s2.permission = "testPermission";
         s2.packageName = "pkg2";
+        s2.name = "service2";
         ResolveInfo r1 = new ResolveInfo();
         r1.serviceInfo = s1;
         ResolveInfo r2 = new ResolveInfo();
         r2.serviceInfo = s2;
-
         when(mPm.queryIntentServicesAsUser(any(), anyInt(), anyInt())).thenReturn(
                 ImmutableList.of(r1, r2));
 
@@ -118,9 +128,11 @@
         ServiceInfo s1 = new ServiceInfo();
         s1.permission = "testPermission";
         s1.packageName = "pkg";
+        s1.name = "Service1";
         ServiceInfo s2 = new ServiceInfo();
         s2.permission = "testPermission";
         s2.packageName = "pkg2";
+        s2.name = "service2";
         ResolveInfo r1 = new ResolveInfo();
         r1.serviceInfo = s1;
         ResolveInfo r2 = new ResolveInfo();
@@ -193,4 +205,56 @@
         assertThat(Settings.Secure.getString(RuntimeEnvironment.application.getContentResolver(),
                 TEST_SETTING)).contains(testComponent2.flattenToString());
     }
+
+    @Test
+    public void testHasPermissionWithoutMeetingCurrentRegs() {
+        ServiceInfo s1 = new ServiceInfo();
+        s1.permission = "testPermission";
+        s1.packageName = "pkg";
+        s1.name = "Service1";
+        ServiceInfo s2 = new ServiceInfo();
+        s2.permission = "testPermission";
+        s2.packageName = "pkg2";
+        s2.name = "service2";
+        ResolveInfo r1 = new ResolveInfo();
+        r1.serviceInfo = s1;
+        ResolveInfo r2 = new ResolveInfo();
+        r2.serviceInfo = s2;
+
+        ComponentName approvedComponent = new ComponentName(s2.packageName, s2.name);
+
+        Settings.Secure.putString(
+                mContext.getContentResolver(), TEST_SETTING, approvedComponent.flattenToString());
+
+        when(mPm.queryIntentServicesAsUser(argThat(
+                filterEquals(new Intent(TEST_INTENT))), anyInt(), anyInt()))
+                .thenReturn(ImmutableList.of(r1));
+        when(mPm.queryIntentServicesAsUser(argThat(
+                filterEquals(new Intent().setComponent(approvedComponent))),
+                anyInt(), anyInt()))
+                .thenReturn(ImmutableList.of(r2));
+
+        mServiceListing = new ServiceListing.Builder(mContext)
+                .setTag("testTag")
+                .setSetting(TEST_SETTING)
+                .setNoun("testNoun")
+                .setIntentAction(TEST_INTENT)
+                .setValidator(info -> {
+                    if (info.packageName.equals("pkg")) {
+                        return true;
+                    }
+                    return false;
+                })
+                .setPermission("testPermission")
+                .build();
+        ServiceListing.Callback callback = mock(ServiceListing.Callback.class);
+        mServiceListing.addCallback(callback);
+        mServiceListing.reload();
+
+        verify(mPm, times(2)).queryIntentServicesAsUser(any(), anyInt(), anyInt());
+        ArgumentCaptor<List<ServiceInfo>> captor = ArgumentCaptor.forClass(List.class);
+        verify(callback, times(1)).onServicesReloaded(captor.capture());
+
+        assertThat(captor.getValue()).containsExactlyElementsIn(ImmutableList.of(s2, s1));
+    }
 }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
index 8eedb35..0e060df 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
@@ -47,6 +47,7 @@
 import android.util.Pair;
 
 import com.android.internal.R;
+import com.android.settingslib.flags.Flags;
 import com.android.settingslib.widget.AdaptiveIcon;
 
 import com.google.common.collect.ImmutableList;
@@ -605,6 +606,7 @@
 
     @Test
     public void testHasConnectedBroadcastSource_leadDeviceConnectedToBroadcastSource() {
+        mSetFlagsRule.disableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
         when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
         CachedBluetoothDevice memberCachedDevice = mock(CachedBluetoothDevice.class);
         BluetoothDevice memberDevice = mock(BluetoothDevice.class);
@@ -630,6 +632,7 @@
 
     @Test
     public void testHasConnectedBroadcastSource_memberDeviceConnectedToBroadcastSource() {
+        mSetFlagsRule.disableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
         when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
         CachedBluetoothDevice memberCachedDevice = mock(CachedBluetoothDevice.class);
         BluetoothDevice memberDevice = mock(BluetoothDevice.class);
@@ -655,6 +658,7 @@
 
     @Test
     public void testHasConnectedBroadcastSource_deviceNotConnectedToBroadcastSource() {
+        mSetFlagsRule.disableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
         when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
 
         List<Long> bisSyncState = new ArrayList<>();
@@ -672,6 +676,7 @@
 
     @Test
     public void testHasConnectedBroadcastSourceForBtDevice_deviceConnectedToBroadcastSource() {
+        mSetFlagsRule.disableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
         List<Long> bisSyncState = new ArrayList<>();
         bisSyncState.add(1L);
         when(mLeBroadcastReceiveState.getBisSyncState()).thenReturn(bisSyncState);
@@ -688,6 +693,7 @@
 
     @Test
     public void testHasConnectedBroadcastSourceForBtDevice_deviceNotConnectedToBroadcastSource() {
+        mSetFlagsRule.disableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
         List<Long> bisSyncState = new ArrayList<>();
         when(mLeBroadcastReceiveState.getBisSyncState()).thenReturn(bisSyncState);
 
@@ -702,6 +708,106 @@
     }
 
     @Test
+    public void hasConnectedBroadcastSource_hysteresisFix_leadDeviceHasActiveLocalSource() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
+        when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
+        CachedBluetoothDevice memberCachedDevice = mock(CachedBluetoothDevice.class);
+        BluetoothDevice memberDevice = mock(BluetoothDevice.class);
+        when(memberCachedDevice.getDevice()).thenReturn(memberDevice);
+        Set<CachedBluetoothDevice> memberCachedDevices = new HashSet<>();
+        memberCachedDevices.add(memberCachedDevice);
+        when(mCachedBluetoothDevice.getMemberDevice()).thenReturn(memberCachedDevices);
+
+
+        when(mBroadcast.getLatestBroadcastId()).thenReturn(TEST_BROADCAST_ID);
+        when(mLeBroadcastReceiveState.getBroadcastId()).thenReturn(TEST_BROADCAST_ID);
+
+        List<BluetoothLeBroadcastReceiveState> sourceList = new ArrayList<>();
+        sourceList.add(mLeBroadcastReceiveState);
+        when(mAssistant.getAllSources(mBluetoothDevice)).thenReturn(sourceList);
+        when(mAssistant.getAllSources(memberDevice)).thenReturn(Collections.emptyList());
+
+        assertThat(
+                BluetoothUtils.hasConnectedBroadcastSource(
+                        mCachedBluetoothDevice, mLocalBluetoothManager))
+                .isTrue();
+    }
+
+    @Test
+    public void hasConnectedBroadcastSource_hysteresisFix_memberDeviceHasActiveLocalSource() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
+        when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
+        CachedBluetoothDevice memberCachedDevice = mock(CachedBluetoothDevice.class);
+        BluetoothDevice memberDevice = mock(BluetoothDevice.class);
+        when(memberCachedDevice.getDevice()).thenReturn(memberDevice);
+        Set<CachedBluetoothDevice> memberCachedDevices = new HashSet<>();
+        memberCachedDevices.add(memberCachedDevice);
+        when(mCachedBluetoothDevice.getMemberDevice()).thenReturn(memberCachedDevices);
+
+        when(mBroadcast.getLatestBroadcastId()).thenReturn(TEST_BROADCAST_ID);
+        when(mLeBroadcastReceiveState.getBroadcastId()).thenReturn(TEST_BROADCAST_ID);
+
+        List<BluetoothLeBroadcastReceiveState> sourceList = new ArrayList<>();
+        sourceList.add(mLeBroadcastReceiveState);
+        when(mAssistant.getAllSources(memberDevice)).thenReturn(sourceList);
+        when(mAssistant.getAllSources(mBluetoothDevice)).thenReturn(Collections.emptyList());
+
+        assertThat(
+                BluetoothUtils.hasConnectedBroadcastSource(
+                        mCachedBluetoothDevice, mLocalBluetoothManager))
+                .isTrue();
+    }
+
+    @Test
+    public void hasConnectedBroadcastSource_hysteresisFix_deviceNoActiveLocalSource() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
+        when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
+
+        when(mBroadcast.getLatestBroadcastId()).thenReturn(UNKNOWN_VALUE_PLACEHOLDER);
+
+        List<BluetoothLeBroadcastReceiveState> sourceList = new ArrayList<>();
+        sourceList.add(mLeBroadcastReceiveState);
+        when(mAssistant.getAllSources(mBluetoothDevice)).thenReturn(sourceList);
+
+        assertThat(
+                BluetoothUtils.hasConnectedBroadcastSource(
+                        mCachedBluetoothDevice, mLocalBluetoothManager))
+                .isFalse();
+    }
+
+    @Test
+    public void hasConnectedBroadcastSourceForBtDevice_hysteresisFix_deviceHasActiveLocalSource() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
+        when(mBroadcast.getLatestBroadcastId()).thenReturn(TEST_BROADCAST_ID);
+        when(mLeBroadcastReceiveState.getBroadcastId()).thenReturn(TEST_BROADCAST_ID);
+
+        List<BluetoothLeBroadcastReceiveState> sourceList = new ArrayList<>();
+        sourceList.add(mLeBroadcastReceiveState);
+        when(mAssistant.getAllSources(mBluetoothDevice)).thenReturn(sourceList);
+
+        assertThat(
+                BluetoothUtils.hasConnectedBroadcastSourceForBtDevice(
+                        mBluetoothDevice, mLocalBluetoothManager))
+                .isTrue();
+    }
+
+    @Test
+    public void hasConnectedBroadcastSourceForBtDevice_hysteresisFix_deviceNoActiveLocalSource() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
+        when(mBroadcast.getLatestBroadcastId()).thenReturn(TEST_BROADCAST_ID);
+        when(mLeBroadcastReceiveState.getBroadcastId()).thenReturn(UNKNOWN_VALUE_PLACEHOLDER);
+
+        List<BluetoothLeBroadcastReceiveState> sourceList = new ArrayList<>();
+        sourceList.add(mLeBroadcastReceiveState);
+        when(mAssistant.getAllSources(mBluetoothDevice)).thenReturn(sourceList);
+
+        assertThat(
+                BluetoothUtils.hasConnectedBroadcastSourceForBtDevice(
+                        mBluetoothDevice, mLocalBluetoothManager))
+                .isFalse();
+    }
+
+    @Test
     public void testHasActiveLocalBroadcastSourceForBtDevice_hasActiveLocalSource() {
         when(mBroadcast.getLatestBroadcastId()).thenReturn(TEST_BROADCAST_ID);
         when(mLeBroadcastReceiveState.getBroadcastId()).thenReturn(TEST_BROADCAST_ID);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
index 0d81494..70cb2ef 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
@@ -1977,12 +1977,12 @@
     }
 
     @Test
-    public void getConnectionSummary_isBroadcastPrimary_returnActive() {
+    public void getConnectionSummary_isBroadcastPrimary_fallbackDevice_returnActive() {
         when(mBroadcast.isEnabled(any())).thenReturn(true);
         when(mCachedDevice.getDevice()).thenReturn(mDevice);
         Settings.Secure.putInt(
                 mContext.getContentResolver(),
-                "bluetooth_le_broadcast_fallback_active_group_id",
+                BluetoothUtils.getPrimaryGroupIdUriForBroadcast(),
                 1);
 
         List<Long> bisSyncState = new ArrayList<>();
@@ -1992,12 +1992,30 @@
         sourceList.add(mLeBroadcastReceiveState);
         when(mAssistant.getAllSources(any())).thenReturn(sourceList);
 
-        when(mCachedDevice.getGroupId())
-                .thenReturn(
-                        Settings.Secure.getInt(
-                                mContext.getContentResolver(),
-                                "bluetooth_le_broadcast_fallback_active_group_id",
-                                BluetoothCsipSetCoordinator.GROUP_ID_INVALID));
+        when(mCachedDevice.getGroupId()).thenReturn(1);
+
+        assertThat(mCachedDevice.getConnectionSummary(false))
+                .isEqualTo(mContext.getString(R.string.bluetooth_active_no_battery_level));
+    }
+
+    @Test
+    public void getConnectionSummary_isBroadcastPrimary_activeDevice_returnActive() {
+        when(mBroadcast.isEnabled(any())).thenReturn(true);
+        when(mCachedDevice.getDevice()).thenReturn(mDevice);
+        Settings.Secure.putInt(
+                mContext.getContentResolver(),
+                BluetoothUtils.getPrimaryGroupIdUriForBroadcast(),
+                BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
+
+        List<Long> bisSyncState = new ArrayList<>();
+        bisSyncState.add(1L);
+        when(mLeBroadcastReceiveState.getBisSyncState()).thenReturn(bisSyncState);
+        List<BluetoothLeBroadcastReceiveState> sourceList = new ArrayList<>();
+        sourceList.add(mLeBroadcastReceiveState);
+        when(mAssistant.getAllSources(any())).thenReturn(sourceList);
+
+        when(mCachedDevice.getGroupId()).thenReturn(1);
+        when(mCachedDevice.isActiveDevice(BluetoothProfile.LE_AUDIO)).thenReturn(true);
 
         assertThat(mCachedDevice.getConnectionSummary(false))
                 .isEqualTo(mContext.getString(R.string.bluetooth_active_no_battery_level));
@@ -2009,7 +2027,7 @@
         when(mCachedDevice.getDevice()).thenReturn(mDevice);
         Settings.Secure.putInt(
                 mContext.getContentResolver(),
-                "bluetooth_le_broadcast_fallback_active_group_id",
+                BluetoothUtils.getPrimaryGroupIdUriForBroadcast(),
                 1);
 
         List<Long> bisSyncState = new ArrayList<>();
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/ActionSwitchPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/ActionSwitchPreferenceTest.java
index 354d0f6..7148618 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/ActionSwitchPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/ActionSwitchPreferenceTest.java
@@ -50,11 +50,15 @@
 
     @Test
     public void build_withAllFields_successfully() {
+        DeviceSettingIntentAction action =
+                new DeviceSettingIntentAction.Builder()
+                        .setIntent(new Intent("intent_action"))
+                        .build();
         ActionSwitchPreference unused =
                 new ActionSwitchPreference.Builder()
                         .setTitle("title")
                         .setSummary("summary")
-                        .setIntent(new Intent("intent_action"))
+                        .setAction(action)
                         .setIcon(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888))
                         .setHasSwitch(true)
                         .setChecked(true)
@@ -65,14 +69,17 @@
 
     @Test
     public void getMethods() {
-        Intent intent = new Intent("intent_action");
+        DeviceSettingIntentAction action =
+                new DeviceSettingIntentAction.Builder()
+                        .setIntent(new Intent("intent_action"))
+                        .build();
         Bitmap icon = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
-        ActionSwitchPreference preference = builder().setIcon(icon).setIntent(intent).build();
+        ActionSwitchPreference preference = builder().setIcon(icon).setAction(action).build();
 
         assertThat(preference.getTitle()).isEqualTo("title");
         assertThat(preference.getSummary()).isEqualTo("summary");
         assertThat(preference.getIcon()).isSameInstanceAs(icon);
-        assertThat(preference.getIntent()).isSameInstanceAs(intent);
+        assertThat(preference.getAction()).isSameInstanceAs(action);
         assertThat(preference.hasSwitch()).isTrue();
         assertThat(preference.getChecked()).isTrue();
         assertThat(preference.isAllowedChangingState()).isTrue();
@@ -81,16 +88,20 @@
 
     @Test
     public void parcelOperation() {
-        Intent intent = new Intent("intent_action");
+        DeviceSettingIntentAction action =
+                new DeviceSettingIntentAction.Builder()
+                        .setIntent(new Intent("intent_action"))
+                        .build();
         Bitmap icon = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
-        ActionSwitchPreference preference = builder().setIcon(icon).setIntent(intent).build();
+        ActionSwitchPreference preference = builder().setIcon(icon).setAction(action).build();
 
         ActionSwitchPreference fromParcel = writeAndRead(preference);
 
         assertThat(fromParcel.getTitle()).isEqualTo(preference.getTitle());
         assertThat(fromParcel.getSummary()).isEqualTo(preference.getSummary());
         assertThat(fromParcel.getIcon().sameAs(preference.getIcon())).isTrue();
-        assertThat(fromParcel.getIntent().getAction()).isSameInstanceAs("intent_action");
+        assertThat(((DeviceSettingIntentAction) fromParcel.getAction()).getIntent().getAction())
+                .isEqualTo("intent_action");
         assertThat(fromParcel.hasSwitch()).isEqualTo(preference.hasSwitch());
         assertThat(fromParcel.getChecked()).isEqualTo(preference.getChecked());
         assertThat(fromParcel.isAllowedChangingState())
@@ -102,14 +113,15 @@
     @Test
     public void parcelOperation_noIntent() {
         Bitmap icon = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
-        ActionSwitchPreference preference = builder().setIcon(icon).setIntent(null).build();
+        ActionSwitchPreference preference = builder().setIcon(icon).setAction(null).build();
 
         ActionSwitchPreference fromParcel = writeAndRead(preference);
 
         assertThat(fromParcel.getTitle()).isEqualTo(preference.getTitle());
         assertThat(fromParcel.getSummary()).isEqualTo(preference.getSummary());
         assertThat(fromParcel.getIcon().sameAs(preference.getIcon())).isTrue();
-        assertThat(preference.getIntent()).isNull();
+        assertThat(preference.getAction().getActionType())
+                .isEqualTo(DeviceSettingActionType.DEVICE_SETTING_ACTION_TYPE_UNKNOWN);
         assertThat(fromParcel.hasSwitch()).isEqualTo(preference.hasSwitch());
         assertThat(fromParcel.getChecked()).isEqualTo(preference.getChecked());
         assertThat(fromParcel.isAllowedChangingState())
@@ -120,15 +132,19 @@
 
     @Test
     public void parcelOperation_noIcon() {
-        Intent intent = new Intent("intent_action");
-        ActionSwitchPreference preference = builder().setIcon(null).setIntent(intent).build();
+        DeviceSettingIntentAction action =
+                new DeviceSettingIntentAction.Builder()
+                        .setIntent(new Intent("intent_action"))
+                        .build();
+        ActionSwitchPreference preference = builder().setIcon(null).setAction(action).build();
 
         ActionSwitchPreference fromParcel = writeAndRead(preference);
 
         assertThat(fromParcel.getTitle()).isEqualTo(preference.getTitle());
         assertThat(fromParcel.getSummary()).isEqualTo(preference.getSummary());
         assertThat(fromParcel.getIcon()).isNull();
-        assertThat(fromParcel.getIntent().getAction()).isSameInstanceAs("intent_action");
+        assertThat(((DeviceSettingIntentAction) fromParcel.getAction()).getIntent().getAction())
+                .isEqualTo("intent_action");
         assertThat(fromParcel.hasSwitch()).isEqualTo(preference.hasSwitch());
         assertThat(fromParcel.getChecked()).isEqualTo(preference.getChecked());
         assertThat(fromParcel.isAllowedChangingState())
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingIntentActionTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingIntentActionTest.java
new file mode 100644
index 0000000..d33db4f
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingIntentActionTest.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2024 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.settingslib.bluetooth.devicesettings;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Parcel;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public final class DeviceSettingIntentActionTest {
+
+    @Test
+    public void getMethods() {
+        DeviceSettingIntentAction action =
+                new DeviceSettingIntentAction.Builder()
+                        .setIntent(new Intent("intent_action"))
+                        .setExtras(buildBundle("key1", "value1"))
+                        .build();
+
+        assertThat(action.getIntent().getAction()).isEqualTo("intent_action");
+        assertThat(action.getExtras().getString("key1")).isEqualTo("value1");
+    }
+
+    @Test
+    public void parcelOperation() {
+        DeviceSettingIntentAction action =
+                new DeviceSettingIntentAction.Builder()
+                        .setIntent(new Intent("intent_action"))
+                        .setExtras(buildBundle("key1", "value1"))
+                        .build();
+
+        DeviceSettingIntentAction fromParcel = writeAndRead(action);
+
+        assertThat(fromParcel.getIntent().getAction()).isEqualTo(action.getIntent().getAction());
+        assertThat(fromParcel.getExtras().getString("key1"))
+                .isEqualTo(action.getExtras().getString("key1"));
+    }
+
+    private Bundle buildBundle(String key, String value) {
+        Bundle bundle = new Bundle();
+        bundle.putString(key, value);
+        return bundle;
+    }
+
+    private DeviceSettingIntentAction writeAndRead(DeviceSettingIntentAction preference) {
+        Parcel parcel = Parcel.obtain();
+        preference.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        DeviceSettingIntentAction fromParcel =
+                DeviceSettingIntentAction.CREATOR.createFromParcel(parcel);
+        return fromParcel;
+    }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingPendingIntentActionTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingPendingIntentActionTest.java
new file mode 100644
index 0000000..3c35147
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingPendingIntentActionTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2024 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.settingslib.bluetooth.devicesettings;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Parcel;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public final class DeviceSettingPendingIntentActionTest {
+
+    private Context mContext = ApplicationProvider.getApplicationContext();
+
+    @Test
+    public void getMethods() {
+        DeviceSettingPendingIntentAction action =
+                new DeviceSettingPendingIntentAction.Builder()
+                        .setPendingIntent(
+                                PendingIntent.getBroadcast(mContext, 0, new Intent("action"), 0))
+                        .setExtras(buildBundle("key1", "value1"))
+                        .build();
+
+        assertThat(action.getPendingIntent()).isSameInstanceAs(action.getPendingIntent());
+        assertThat(action.getExtras().getString("key1")).isEqualTo("value1");
+    }
+
+    @Test
+    public void parcelOperation() {
+        DeviceSettingPendingIntentAction action =
+                new DeviceSettingPendingIntentAction.Builder()
+                        .setPendingIntent(
+                                PendingIntent.getBroadcast(mContext, 0, new Intent("action"), 0))
+                        .setExtras(buildBundle("key1", "value1"))
+                        .build();
+
+        DeviceSettingPendingIntentAction fromParcel = writeAndRead(action);
+
+        assertThat(action.getPendingIntent().getIntent())
+                .isEqualTo(action.getPendingIntent().getIntent());
+        assertThat(fromParcel.getExtras().getString("key1"))
+                .isEqualTo(action.getExtras().getString("key1"));
+    }
+
+    private Bundle buildBundle(String key, String value) {
+        Bundle bundle = new Bundle();
+        bundle.putString(key, value);
+        return bundle;
+    }
+
+    private DeviceSettingPendingIntentAction writeAndRead(
+            DeviceSettingPendingIntentAction preference) {
+        Parcel parcel = Parcel.obtain();
+        preference.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        DeviceSettingPendingIntentAction fromParcel =
+                DeviceSettingPendingIntentAction.CREATOR.createFromParcel(parcel);
+        return fromParcel;
+    }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigServiceStatusTest.kt b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigServiceStatusTest.kt
new file mode 100644
index 0000000..3149acf
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigServiceStatusTest.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2024 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.settingslib.bluetooth.devicesettings
+
+import android.os.Bundle
+import android.os.Parcel
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class DeviceSettingsConfigServiceStatusTest {
+
+    @Test
+    fun parcelOperation() {
+        val item =
+            DeviceSettingsConfigServiceStatus(
+                success = true,
+                extras = Bundle().apply { putString("key1", "value1") },
+            )
+
+        val fromParcel = writeAndRead(item)
+
+        assertThat(fromParcel.success).isEqualTo(item.success)
+        assertThat(fromParcel.extras.getString("key1")).isEqualTo(item.extras.getString("key1"))
+    }
+
+    private fun writeAndRead(
+        item: DeviceSettingsConfigServiceStatus
+    ): DeviceSettingsConfigServiceStatus {
+        val parcel = Parcel.obtain()
+        item.writeToParcel(parcel, 0)
+        parcel.setDataPosition(0)
+        return DeviceSettingsConfigServiceStatus.CREATOR.createFromParcel(parcel)
+    }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigTest.kt b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigTest.kt
index 7f17293..ebaad34 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigTest.kt
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigTest.kt
@@ -86,6 +86,7 @@
         assertThat(fromParcel.moreSettingsHelpItem?.packageName).isEqualTo("package_name_2")
         assertThat(fromParcel.moreSettingsHelpItem?.className).isEqualTo("class_name_2")
         assertThat(fromParcel.moreSettingsHelpItem?.intentAction).isEqualTo("intent_action_2")
+        assertThat(fromParcel.extras.getString("key1")).isEqualTo("value1")
     }
 
     private fun writeAndRead(item: DeviceSettingsConfig): DeviceSettingsConfig {
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepositoryTest.kt b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepositoryTest.kt
index 0cb6bc1..4e62fd3b 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepositoryTest.kt
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepositoryTest.kt
@@ -33,10 +33,12 @@
 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingItem
 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingState
 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsConfig
+import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsConfigServiceStatus
 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsProviderServiceStatus
 import com.android.settingslib.bluetooth.devicesettings.IDeviceSettingsConfigProviderService
 import com.android.settingslib.bluetooth.devicesettings.IDeviceSettingsListener
 import com.android.settingslib.bluetooth.devicesettings.IDeviceSettingsProviderService
+import com.android.settingslib.bluetooth.devicesettings.IGetDeviceSettingsConfigCallback
 import com.android.settingslib.bluetooth.devicesettings.MultiTogglePreference
 import com.android.settingslib.bluetooth.devicesettings.MultiTogglePreferenceState
 import com.android.settingslib.bluetooth.devicesettings.ToggleInfo
@@ -53,7 +55,6 @@
 import kotlinx.coroutines.test.TestScope
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
-import org.junit.After
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -140,15 +141,10 @@
             )
     }
 
-    @After
-    fun clean() {
-        DeviceSettingServiceConnection.services.clear()
-    }
-
     @Test
     fun getDeviceSettingsConfig_withMetadata_success() {
         testScope.runTest {
-            `when`(configService.getDeviceSettingsConfig(any())).thenReturn(DEVICE_SETTING_CONFIG)
+            setUpConfigService(true, DEVICE_SETTING_CONFIG)
             `when`(settingProviderService1.serviceStatus)
                 .thenReturn(DeviceSettingsProviderServiceStatus(true))
             `when`(settingProviderService2.serviceStatus)
@@ -179,7 +175,7 @@
                     )
                 )
                 .thenReturn("".toByteArray())
-            `when`(configService.getDeviceSettingsConfig(any())).thenReturn(DEVICE_SETTING_CONFIG)
+            setUpConfigService(true, DEVICE_SETTING_CONFIG)
             `when`(settingProviderService1.serviceStatus)
                 .thenReturn(DeviceSettingsProviderServiceStatus(true))
             `when`(settingProviderService2.serviceStatus)
@@ -194,7 +190,7 @@
     @Test
     fun getDeviceSettingsConfig_providerServiceNotEnabled_returnNull() {
         testScope.runTest {
-            `when`(configService.getDeviceSettingsConfig(any())).thenReturn(DEVICE_SETTING_CONFIG)
+            setUpConfigService(true, DEVICE_SETTING_CONFIG)
             `when`(settingProviderService1.serviceStatus)
                 .thenReturn(DeviceSettingsProviderServiceStatus(false))
             `when`(settingProviderService2.serviceStatus)
@@ -209,7 +205,7 @@
     @Test
     fun getDeviceSettingsConfig_bindingServiceFail_returnNull() {
         testScope.runTest {
-            `when`(configService.getDeviceSettingsConfig(any())).thenReturn(DEVICE_SETTING_CONFIG)
+            setUpConfigService(true, DEVICE_SETTING_CONFIG)
             doReturn(false).`when`(context).bindService(any(), anyInt(), any(), any())
 
             val config = underTest.getDeviceSettingsConfig(cachedDevice)
@@ -221,7 +217,7 @@
     @Test
     fun getDeviceSetting_actionSwitchPreference_success() {
         testScope.runTest {
-            `when`(configService.getDeviceSettingsConfig(any())).thenReturn(DEVICE_SETTING_CONFIG)
+            setUpConfigService(true, DEVICE_SETTING_CONFIG)
             `when`(settingProviderService1.registerDeviceSettingsListener(any(), any())).then {
                 input ->
                 input
@@ -247,7 +243,7 @@
     @Test
     fun getDeviceSetting_multiTogglePreference_success() {
         testScope.runTest {
-            `when`(configService.getDeviceSettingsConfig(any())).thenReturn(DEVICE_SETTING_CONFIG)
+            setUpConfigService(true, DEVICE_SETTING_CONFIG)
             `when`(settingProviderService2.registerDeviceSettingsListener(any(), any())).then {
                 input ->
                 input
@@ -273,7 +269,7 @@
     @Test
     fun getDeviceSetting_helpPreference_success() {
         testScope.runTest {
-            `when`(configService.getDeviceSettingsConfig(any())).thenReturn(DEVICE_SETTING_CONFIG)
+            setUpConfigService(true, DEVICE_SETTING_CONFIG)
             `when`(settingProviderService2.registerDeviceSettingsListener(any(), any())).then {
                 input ->
                 input
@@ -299,6 +295,7 @@
     @Test
     fun getDeviceSetting_noConfig_returnNull() {
         testScope.runTest {
+            setUpConfigService(false, null)
             `when`(settingProviderService1.registerDeviceSettingsListener(any(), any())).then {
                 input ->
                 input
@@ -320,7 +317,7 @@
     @Test
     fun updateDeviceSettingState_switchState_success() {
         testScope.runTest {
-            `when`(configService.getDeviceSettingsConfig(any())).thenReturn(DEVICE_SETTING_CONFIG)
+            setUpConfigService(true, DEVICE_SETTING_CONFIG)
             `when`(settingProviderService1.registerDeviceSettingsListener(any(), any())).then {
                 input ->
                 input
@@ -358,7 +355,7 @@
     @Test
     fun updateDeviceSettingState_multiToggleState_success() {
         testScope.runTest {
-            `when`(configService.getDeviceSettingsConfig(any())).thenReturn(DEVICE_SETTING_CONFIG)
+            setUpConfigService(true, DEVICE_SETTING_CONFIG)
             `when`(settingProviderService2.registerDeviceSettingsListener(any(), any())).then {
                 input ->
                 input
@@ -459,6 +456,17 @@
         assertThat(actual.settingId).isEqualTo(serviceResponse.settingId)
     }
 
+    private fun setUpConfigService(success: Boolean, config: DeviceSettingsConfig?) {
+        `when`(configService.getDeviceSettingsConfig(any(), any())).then { input ->
+            input
+                .getArgument<IGetDeviceSettingsConfigCallback>(1)
+                .onResult(
+                    DeviceSettingsConfigServiceStatus(success = success),
+                    config
+                )
+        }
+    }
+
     private companion object {
         const val BLUETOOTH_ADDRESS = "12:34:56:78"
         const val CONFIG_SERVICE_PACKAGE_NAME = "com.android.fake.configservice"
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputMediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputMediaDeviceTest.java
index 088d554..30e4637 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputMediaDeviceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputMediaDeviceTest.java
@@ -37,6 +37,7 @@
     private final int BUILTIN_MIC_ID = 1;
     private final int WIRED_HEADSET_ID = 2;
     private final int USB_HEADSET_ID = 3;
+    private final int BT_HEADSET_ID = 4;
     private final int MAX_VOLUME = 1;
     private final int CURRENT_VOLUME = 0;
     private final boolean IS_VOLUME_FIXED = true;
@@ -76,7 +77,7 @@
                         IS_VOLUME_FIXED);
         assertThat(builtinMediaDevice).isNotNull();
         assertThat(builtinMediaDevice.getName())
-                .isEqualTo(mContext.getString(R.string.media_transfer_internal_mic));
+                .isEqualTo(mContext.getString(R.string.media_transfer_this_device_name_desktop));
     }
 
     @Test
@@ -108,4 +109,19 @@
         assertThat(usbMediaDevice.getName())
                 .isEqualTo(mContext.getString(R.string.media_transfer_usb_device_mic_name));
     }
+
+    @Test
+    public void getName_returnCorrectName_btHeadset() {
+        InputMediaDevice btMediaDevice =
+                InputMediaDevice.create(
+                        mContext,
+                        String.valueOf(BT_HEADSET_ID),
+                        AudioDeviceInfo.TYPE_BLUETOOTH_SCO,
+                        MAX_VOLUME,
+                        CURRENT_VOLUME,
+                        IS_VOLUME_FIXED);
+        assertThat(btMediaDevice).isNotNull();
+        assertThat(btMediaDevice.getName())
+                .isEqualTo(mContext.getString(R.string.media_transfer_bt_device_mic_name));
+    }
 }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java
index da5f428..1739c0e5 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java
@@ -136,7 +136,7 @@
         when(mInfo.getType()).thenReturn(TYPE_USB_DEVICE);
 
         assertThat(mPhoneMediaDevice.getName())
-                .isEqualTo(mContext.getString(R.string.media_transfer_usb_speaker_name));
+                .isEqualTo(mContext.getString(R.string.media_transfer_usb_audio_name));
 
         when(mInfo.getType()).thenReturn(TYPE_BUILTIN_SPEAKER);
 
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AppPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AppPreferenceTest.java
deleted file mode 100644
index 6c8fd50..0000000
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AppPreferenceTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2021 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.settingslib.widget;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.view.View;
-
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settingslib.widget.preference.app.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class AppPreferenceTest {
-
-    private Context mContext;
-    private View mRootView;
-    private AppPreference mPref;
-    private PreferenceViewHolder mHolder;
-
-    @Before
-    public void setUp() {
-        mContext = RuntimeEnvironment.application;
-        mRootView = View.inflate(mContext, R.layout.preference_app, null /* parent */);
-        mHolder = PreferenceViewHolder.createInstanceForTests(mRootView);
-        mPref = new AppPreference(mContext);
-    }
-
-    @Test
-    public void setProgress_showProgress() {
-        mPref.setProgress(1);
-        mPref.onBindViewHolder(mHolder);
-
-        assertThat(mHolder.findViewById(android.R.id.progress).getVisibility())
-                .isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void foobar_testName() {
-        float iconSize = mContext.getResources().getDimension(com.android.settingslib.widget.theme.R.dimen.secondary_app_icon_size);
-        assertThat(Float.floatToIntBits(iconSize)).isEqualTo(Float.floatToIntBits(32));
-    }
-}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/SelectorWithWidgetPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/SelectorWithWidgetPreferenceTest.java
index 243ce85..2b8b3b7 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/SelectorWithWidgetPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/SelectorWithWidgetPreferenceTest.java
@@ -19,8 +19,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
 import android.app.Application;
 import android.platform.test.annotations.DisableFlags;
@@ -68,7 +66,7 @@
         mPreference = new SelectorWithWidgetPreference(mContext);
 
         View view = LayoutInflater.from(mContext)
-                .inflate(R.layout.preference_selector_with_widget, null /* root */);
+                .inflate(mPreference.getLayoutResource(), null /* root */);
         PreferenceViewHolder preferenceViewHolder =
                 PreferenceViewHolder.createInstanceForTests(view);
         mPreference.onBindViewHolder(preferenceViewHolder);
@@ -104,28 +102,28 @@
     @Test
     public void onBindViewHolder_withSummary_containerShouldBeVisible() {
         mPreference.setSummary("some summary");
-        View summaryContainer = new View(mContext);
-        View view = mock(View.class);
-        when(view.findViewById(R.id.summary_container)).thenReturn(summaryContainer);
+        View view = LayoutInflater.from(mContext)
+                .inflate(mPreference.getLayoutResource(), null /* root */);
         PreferenceViewHolder preferenceViewHolder =
                 PreferenceViewHolder.createInstanceForTests(view);
 
         mPreference.onBindViewHolder(preferenceViewHolder);
 
+        View summaryContainer = view.findViewById(R.id.summary_container);
         assertEquals(View.VISIBLE, summaryContainer.getVisibility());
     }
 
     @Test
     public void onBindViewHolder_emptySummary_containerShouldBeGone() {
         mPreference.setSummary("");
-        View summaryContainer = new View(mContext);
-        View view = mock(View.class);
-        when(view.findViewById(R.id.summary_container)).thenReturn(summaryContainer);
+        View view = LayoutInflater.from(mContext)
+                .inflate(mPreference.getLayoutResource(), null /* root */);
         PreferenceViewHolder preferenceViewHolder =
                 PreferenceViewHolder.createInstanceForTests(view);
 
         mPreference.onBindViewHolder(preferenceViewHolder);
 
+        View summaryContainer = view.findViewById(R.id.summary_container);
         assertEquals(View.GONE, summaryContainer.getVisibility());
     }
 
@@ -184,25 +182,49 @@
     }
 
     @Test
-    public void nullSummary_containerShouldBeGone() {
-        mPreference.setSummary(null);
-        View summaryContainer = new View(mContext);
-        View view = mock(View.class);
-        when(view.findViewById(R.id.summary_container)).thenReturn(summaryContainer);
+    public void onBindViewHolder_appliesWidgetContentDescription() {
+        mPreference = new SelectorWithWidgetPreference(mContext);
+        View view = LayoutInflater.from(mContext)
+                .inflate(mPreference.getLayoutResource(), /* root= */ null);
         PreferenceViewHolder preferenceViewHolder =
                 PreferenceViewHolder.createInstanceForTests(view);
+
+        mPreference.setExtraWidgetContentDescription("this is clearer");
         mPreference.onBindViewHolder(preferenceViewHolder);
+
+        View widget = preferenceViewHolder.findViewById(R.id.selector_extra_widget);
+        assertThat(widget.getContentDescription().toString()).isEqualTo("this is clearer");
+
+        mPreference.setExtraWidgetContentDescription(null);
+        mPreference.onBindViewHolder(preferenceViewHolder);
+
+        assertThat(widget.getContentDescription().toString()).isEqualTo("Settings");
+    }
+
+    @Test
+    public void nullSummary_containerShouldBeGone() {
+        mPreference.setSummary(null);
+        View view = LayoutInflater.from(mContext)
+                .inflate(mPreference.getLayoutResource(), null /* root */);
+        PreferenceViewHolder preferenceViewHolder =
+                PreferenceViewHolder.createInstanceForTests(view);
+
+        mPreference.onBindViewHolder(preferenceViewHolder);
+
+        View summaryContainer = view.findViewById(R.id.summary_container);
         assertEquals(View.GONE, summaryContainer.getVisibility());
     }
 
     @Test
     public void setAppendixVisibility_setGone_shouldBeGone() {
         mPreference.setAppendixVisibility(View.GONE);
-
         View view = LayoutInflater.from(mContext)
-                .inflate(R.layout.preference_selector_with_widget, null /* root */);
-        PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(view);
+                .inflate(mPreference.getLayoutResource(), null /* root */);
+        PreferenceViewHolder holder =
+                PreferenceViewHolder.createInstanceForTests(view);
+
         mPreference.onBindViewHolder(holder);
+
         assertThat(holder.findViewById(R.id.appendix).getVisibility()).isEqualTo(View.GONE);
     }
 
diff --git a/packages/SettingsProvider/Android.bp b/packages/SettingsProvider/Android.bp
index 1a99d25..65b2275 100644
--- a/packages/SettingsProvider/Android.bp
+++ b/packages/SettingsProvider/Android.bp
@@ -39,6 +39,7 @@
         "configinfra_framework_flags_java_lib",
         "device_config_service_flags_java",
         "libaconfig_java_proto_lite",
+        "notification_flags_lib",
         "SettingsLibDeviceStateRotationLock",
         "SettingsLibDisplayUtils",
     ],
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index d710939..4dc8424 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -164,13 +164,10 @@
         Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS,
         Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS,
         Settings.Secure.LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS,
+        Settings.Secure.LOCK_SCREEN_NOTIFICATION_MINIMALISM,
         Settings.Secure.SHOW_NOTIFICATION_SNOOZE,
         Settings.Secure.NOTIFICATION_HISTORY_ENABLED,
         Settings.Secure.ZEN_DURATION,
-        Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION,
-        Settings.Secure.SHOW_ZEN_SETTINGS_SUGGESTION,
-        Settings.Secure.ZEN_SETTINGS_UPDATED,
-        Settings.Secure.ZEN_SETTINGS_SUGGESTION_VIEWED,
         Settings.Secure.CHARGING_SOUNDS_ENABLED,
         Settings.Secure.CHARGING_VIBRATION_ENABLED,
         Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS,
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
index f6e1057..8f58e8c 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
@@ -186,7 +186,7 @@
         VALIDATORS.put(
                 Global.STEM_PRIMARY_BUTTON_SHORT_PRESS, new InclusiveIntegerRangeValidator(0, 1));
         VALIDATORS.put(
-                Global.STEM_PRIMARY_BUTTON_DOUBLE_PRESS, new InclusiveIntegerRangeValidator(0, 1));
+                Global.STEM_PRIMARY_BUTTON_DOUBLE_PRESS, new InclusiveIntegerRangeValidator(0, 2));
         VALIDATORS.put(
                 Global.STEM_PRIMARY_BUTTON_TRIPLE_PRESS, new InclusiveIntegerRangeValidator(0, 1));
         VALIDATORS.put(
@@ -434,7 +434,7 @@
         VALIDATORS.put(Global.Wearable.PHONE_SWITCHING_STATUS,
                 new InclusiveIntegerRangeValidator(
                         Global.Wearable.PHONE_SWITCHING_STATUS_NOT_STARTED,
-                        Global.Wearable.PHONE_SWITCHING_STATUS_IN_PROGRESS_MIGRATION_SUCCESS));
+                        Global.Wearable.PHONE_SWITCHING_STATUS_ACCOUNTS_MATCHED));
         VALIDATORS.put(Global.Wearable.REDUCE_MOTION, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Global.Wearable.RTL_SWIPE_TO_DISMISS_ENABLED_DEV, BOOLEAN_VALIDATOR);
         VALIDATORS.put(
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index fa16a44..688676d 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -243,13 +243,10 @@
         VALIDATORS.put(Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, BOOLEAN_VALIDATOR);
+        VALIDATORS.put(Secure.LOCK_SCREEN_NOTIFICATION_MINIMALISM, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.SHOW_NOTIFICATION_SNOOZE, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.NOTIFICATION_HISTORY_ENABLED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.ZEN_DURATION, ANY_INTEGER_VALIDATOR);
-        VALIDATORS.put(Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, BOOLEAN_VALIDATOR);
-        VALIDATORS.put(Secure.SHOW_ZEN_SETTINGS_SUGGESTION, BOOLEAN_VALIDATOR);
-        VALIDATORS.put(Secure.ZEN_SETTINGS_UPDATED, BOOLEAN_VALIDATOR);
-        VALIDATORS.put(Secure.ZEN_SETTINGS_SUGGESTION_VIEWED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.CHARGING_SOUNDS_ENABLED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.CHARGING_VIBRATION_ENABLED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index 6c31831..ec3bd90 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -29,6 +29,7 @@
 import android.icu.util.ULocale;
 import android.media.AudioManager;
 import android.media.RingtoneManager;
+import android.media.Utils;
 import android.net.Uri;
 import android.os.LocaleList;
 import android.os.RemoteException;
@@ -309,6 +310,13 @@
                     return SILENT_RINGTONE;
                 }
             } else {
+                // If the ringtone/notification support the vibration, use the original value.
+                final int ringtoneType = getRingtoneType(name);
+                if ((Settings.System.RINGTONE.equals(name)
+                        || Settings.System.NOTIFICATION_SOUND.equals(name))
+                        && hasVibrationSettings(value, ringtoneType)) {
+                    return value;
+                }
                 return getCanonicalRingtoneValue(value);
             }
         }
@@ -362,6 +370,15 @@
             return;
         }
 
+        // If the ringtone/notification has vibration, we backup original value in onBackupValue.
+        // So use the value directly for restoring.
+        if ((ringtoneType == RingtoneManager.TYPE_RINGTONE
+                || ringtoneType == RingtoneManager.TYPE_NOTIFICATION)
+                && hasVibrationSettings(value, ringtoneType)) {
+            RingtoneManager.setActualDefaultRingtoneUri(mContext, ringtoneType, Uri.parse(value));
+            return;
+        }
+
         Uri ringtoneUri = null;
         try {
             ringtoneUri =
@@ -617,6 +634,19 @@
         return allLocales.remove(toFullLocale(filteredLocale));
     }
 
+    private boolean hasVibrationSettings(String value, int type) {
+        if (Utils.hasVibration(Uri.parse(value)) && mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_ringtoneVibrationSettingsSupported)) {
+            if (type == RingtoneManager.TYPE_RINGTONE) {
+                return android.media.audio.Flags.enableRingtoneHapticsCustomization();
+            }
+            if (type == RingtoneManager.TYPE_NOTIFICATION) {
+                return com.android.server.notification.Flags.notificationVibrationInSoundUri();
+            }
+        }
+        return false;
+    }
+
     /**
      * Sets the locale specified. Input data is the byte representation of comma separated
      * multiple BCP-47 language tags. For backwards compatibility, strings of the form
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 3c24f5c..2034f36 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -2734,18 +2734,6 @@
                 Settings.Secure.ZEN_DURATION,
                 SecureSettingsProto.Zen.DURATION);
         dumpSetting(s, p,
-                Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION,
-                SecureSettingsProto.Zen.SHOW_ZEN_UPGRADE_NOTIFICATION);
-        dumpSetting(s, p,
-                Settings.Secure.SHOW_ZEN_SETTINGS_SUGGESTION,
-                SecureSettingsProto.Zen.SHOW_ZEN_SETTINGS_SUGGESTION);
-        dumpSetting(s, p,
-                Settings.Secure.ZEN_SETTINGS_UPDATED,
-                SecureSettingsProto.Zen.SETTINGS_UPDATED);
-        dumpSetting(s, p,
-                Settings.Secure.ZEN_SETTINGS_SUGGESTION_VIEWED,
-                SecureSettingsProto.Zen.SETTINGS_SUGGESTION_VIEWED);
-        dumpSetting(s, p,
                 Settings.Secure.CHARGE_OPTIMIZATION_MODE,
                 SecureSettingsProto.CHARGE_OPTIMIZATION_MODE);
         p.end(zenToken);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 749ad0a..a8af43f5 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -4771,9 +4771,9 @@
                 }
 
                 if (currentVersion == 169) {
-                    // Version 169: Set the default value for Secure Settings ZEN_DURATION,
-                    // SHOW_ZEN_SETTINGS_SUGGESTION, ZEN_SETTINGS_UPDATE and
-                    // ZEN_SETTINGS_SUGGESTION_VIEWED
+                    // Version 169: Set the default value for Secure Settings ZEN_DURATION.
+                    // Also used to update SHOW_ZEN_SETTINGS_SUGGESTION, ZEN_SETTINGS_UPDATE and
+                    // ZEN_SETTINGS_SUGGESTION_VIEWED, but those properties are gone now.
 
                     final SettingsState globalSettings = getGlobalSettingsLocked();
                     final Setting globalZenDuration = globalSettings.getSettingLocked(
@@ -4801,33 +4801,6 @@
                                 SettingsState.SYSTEM_PACKAGE_NAME);
                     }
 
-                    // SHOW_ZEN_SETTINGS_SUGGESTION
-                    final Setting currentShowZenSettingSuggestion = secureSettings.getSettingLocked(
-                            Secure.SHOW_ZEN_SETTINGS_SUGGESTION);
-                    if (currentShowZenSettingSuggestion.isNull()) {
-                        secureSettings.insertSettingOverrideableByRestoreLocked(
-                                Secure.SHOW_ZEN_SETTINGS_SUGGESTION, "1",
-                                null, true, SettingsState.SYSTEM_PACKAGE_NAME);
-                    }
-
-                    // ZEN_SETTINGS_UPDATED
-                    final Setting currentUpdatedSetting = secureSettings.getSettingLocked(
-                            Secure.ZEN_SETTINGS_UPDATED);
-                    if (currentUpdatedSetting.isNull()) {
-                        secureSettings.insertSettingOverrideableByRestoreLocked(
-                                Secure.ZEN_SETTINGS_UPDATED, "0",
-                                null, true, SettingsState.SYSTEM_PACKAGE_NAME);
-                    }
-
-                    // ZEN_SETTINGS_SUGGESTION_VIEWED
-                    final Setting currentSettingSuggestionViewed = secureSettings.getSettingLocked(
-                            Secure.ZEN_SETTINGS_SUGGESTION_VIEWED);
-                    if (currentSettingSuggestionViewed.isNull()) {
-                        secureSettings.insertSettingOverrideableByRestoreLocked(
-                                Secure.ZEN_SETTINGS_SUGGESTION_VIEWED, "0",
-                                null, true, SettingsState.SYSTEM_PACKAGE_NAME);
-                    }
-
                     currentVersion = 170;
                 }
 
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
index 3c634f0..011ffbc 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
@@ -610,7 +610,7 @@
                                 flag.getPackageName(),
                                 flag.getFlagName(),
                                 flag.getServerFlagValue(),
-                                false);
+                                StorageRequestMessage.SERVER_ON_REBOOT);
                     }
 
                     if (flag.getHasLocalOverride()) {
@@ -619,7 +619,7 @@
                                 flag.getPackageName(),
                                 flag.getFlagName(),
                                 flag.getLocalFlagValue(),
-                                true);
+                                StorageRequestMessage.LOCAL_ON_REBOOT);
                     }
                 }
 
diff --git a/packages/SettingsProvider/test/AndroidTest.xml b/packages/SettingsProvider/test/AndroidTest.xml
index dccc2d3..541a294 100644
--- a/packages/SettingsProvider/test/AndroidTest.xml
+++ b/packages/SettingsProvider/test/AndroidTest.xml
@@ -32,7 +32,7 @@
         <option name="package" value="com.android.providers.setting.test" />
         <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
         <option name="hidden-api-checks" value="false"/>
-        <option name="exclude-annotation" value="com.android.bedstead.harrier.annotations.RequireRunOnWorkProfile" />
-        <option name="exclude-annotation" value="com.android.bedstead.harrier.annotations.RequireRunOnSecondaryUser" />
+        <option name="exclude-annotation" value="com.android.bedstead.enterprise.annotations.RequireRunOnWorkProfile" />
+        <option name="exclude-annotation" value="com.android.bedstead.multiuser.annotations.RequireRunOnSecondaryUser" />
     </test>
 </configuration>
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index b491b5a..d39b564 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -223,7 +223,6 @@
                     Settings.Global.ENABLE_DELETION_HELPER_NO_THRESHOLD_TOGGLE,
                     Settings.Global.ENABLE_DISKSTATS_LOGGING,
                     Settings.Global.ENABLE_EPHEMERAL_FEATURE,
-                    Settings.Global.ENABLE_USE_APP_INFO_NOT_LAUNCHED,
                     Settings.Global.DYNAMIC_POWER_SAVINGS_ENABLED,
                     Settings.Global.DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD,
                     Settings.Global.SMART_REPLIES_IN_NOTIFICATIONS_FLAGS,
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java
index 4b10b56..babc1a3 100644
--- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java
@@ -37,9 +37,12 @@
 import android.database.Cursor;
 import android.database.MatrixCursor;
 import android.media.AudioManager;
+import android.media.Utils;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.LocaleList;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.provider.BaseColumns;
 import android.provider.MediaStore;
 import android.provider.Settings;
@@ -54,6 +57,7 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -74,9 +78,13 @@
             "content://media/internal/audio/media/20?title=DefaultNotification&canonical=1";
     private static final String DEFAULT_ALARM_VALUE =
             "content://media/internal/audio/media/30?title=DefaultAlarm&canonical=1";
+    private static final String VIBRATION_FILE_NAME = "haptics.xml";
 
     private SettingsHelper mSettingsHelper;
 
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
     @Mock private Context mContext;
     @Mock private Resources mResources;
     @Mock private AudioManager mAudioManager;
@@ -120,6 +128,22 @@
     }
 
     @Test
+    @EnableFlags({android.media.audio.Flags.FLAG_ENABLE_RINGTONE_HAPTICS_CUSTOMIZATION,
+            com.android.server.notification.Flags.FLAG_NOTIFICATION_VIBRATION_IN_SOUND_URI})
+    public void testOnBackupValue_ringtoneVibrationSupport_returnsSameValue() {
+        when(mResources.getBoolean(
+                com.android.internal.R.bool.config_ringtoneVibrationSettingsSupported)).thenReturn(
+                true);
+        String testRingtoneVibrationValue = createUriWithVibration(DEFAULT_RINGTONE_VALUE);
+        String testNotificationVibrationValue = createUriWithVibration(DEFAULT_NOTIFICATION_VALUE);
+
+        assertEquals(testRingtoneVibrationValue, mSettingsHelper.onBackupValue(
+                Settings.System.RINGTONE, testRingtoneVibrationValue));
+        assertEquals(testNotificationVibrationValue, mSettingsHelper.onBackupValue(
+                Settings.System.NOTIFICATION_SOUND, testNotificationVibrationValue));
+    }
+
+    @Test
     public void testGetRealValue_settingNotReplaced_returnsSameValue() {
         when(mSettingsHelper.isReplacedSystemSetting(eq(SETTING_KEY))).thenReturn(false);
 
@@ -675,6 +699,30 @@
                 .isEqualTo(null);
     }
 
+    @Test
+    @EnableFlags({android.media.audio.Flags.FLAG_ENABLE_RINGTONE_HAPTICS_CUSTOMIZATION,
+            com.android.server.notification.Flags.FLAG_NOTIFICATION_VIBRATION_IN_SOUND_URI})
+    public void testRestoreValue_ringtoneVibrationSupport_restoreValue() {
+        when(mResources.getBoolean(
+                com.android.internal.R.bool.config_ringtoneVibrationSettingsSupported)).thenReturn(
+                true);
+        String testRingtoneVibrationValue = createUriWithVibration(DEFAULT_RINGTONE_VALUE);
+        String testNotificationVibrationValue = createUriWithVibration(DEFAULT_NOTIFICATION_VALUE);
+        ContentProvider mockMediaContentProvider =
+                new MockContentProvider(mContext) {
+                    @Override
+                    public String getType(Uri url) {
+                        return "audio/ogg";
+                    }
+                };
+        mContentResolver.addProvider(MediaStore.AUTHORITY, mockMediaContentProvider);
+        resetRingtoneSettingsToDefault();
+
+        assertRingtoneSettingsRestoring(Settings.System.RINGTONE, testRingtoneVibrationValue);
+        assertRingtoneSettingsRestoring(
+                Settings.System.NOTIFICATION_SOUND, testNotificationVibrationValue);
+    }
+
     private static class MockSettingsProvider extends MockContentProvider {
         private final ArrayMap<String, String> mKeyValueStore = new ArrayMap<>();
         MockSettingsProvider(Context context) {
@@ -766,4 +814,25 @@
         assertThat(Settings.System.getString(mContentResolver, Settings.System.ALARM_ALERT))
                 .isEqualTo(DEFAULT_ALARM_VALUE);
     }
+
+    private String createUriWithVibration(String defaultUriString) {
+        return Uri.parse(defaultUriString).buildUpon()
+                .appendQueryParameter(
+                        Utils.VIBRATION_URI_PARAM, VIBRATION_FILE_NAME).build().toString();
+    }
+
+    private void assertRingtoneSettingsRestoring(
+            String settings, String testRingtoneSettingsValue) {
+        mSettingsHelper.restoreValue(
+                mContext,
+                mContentResolver,
+                new ContentValues(),
+                Uri.EMPTY,
+                settings,
+                testRingtoneSettingsValue,
+                0);
+
+        assertThat(Settings.System.getString(mContentResolver, settings))
+                .isEqualTo(testRingtoneSettingsValue);
+    }
 }
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderMultiUsersTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderMultiUsersTest.java
index e4898da..e86e727 100644
--- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderMultiUsersTest.java
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderMultiUsersTest.java
@@ -31,10 +31,10 @@
 import com.android.bedstead.enterprise.annotations.EnsureHasWorkProfile;
 import com.android.bedstead.harrier.BedsteadJUnit4;
 import com.android.bedstead.harrier.DeviceState;
-import com.android.bedstead.harrier.annotations.EnsureHasSecondaryUser;
 import com.android.bedstead.harrier.annotations.RequireFeature;
 import com.android.bedstead.harrier.annotations.RequireRunOnInitialUser;
-import com.android.bedstead.harrier.annotations.RequireRunOnPrimaryUser;
+import com.android.bedstead.multiuser.annotations.EnsureHasSecondaryUser;
+import com.android.bedstead.multiuser.annotations.RequireRunOnPrimaryUser;
 import com.android.bedstead.nene.TestApis;
 import com.android.bedstead.nene.users.UserReference;
 import com.android.bedstead.nene.users.UserType;
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index f3c5a18..408ed1e 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -743,12 +743,6 @@
     <uses-permission android:name="android.permission.READ_SAFETY_CENTER_STATUS" />
     <uses-permission android:name="android.permission.MANAGE_SAFETY_CENTER" />
 
-    <!-- Permissions required for CTS test - CtsVirtualDevicesTestCases -->
-    <uses-permission android:name="android.permission.CREATE_VIRTUAL_DEVICE" />
-    <uses-permission android:name="android.permission.ADD_TRUSTED_DISPLAY" />
-    <uses-permission android:name="android.permission.ADD_ALWAYS_UNLOCKED_DISPLAY" />
-
-
     <!-- Permission required for CTS test - Notification test suite -->
     <uses-permission android:name="android.permission.REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL" />
 
@@ -948,6 +942,9 @@
     <!-- Permission required for CTS test - CtsNfcTestCases -->
     <uses-permission android:name="android.permission.NFC_SET_CONTROLLER_ALWAYS_ON" />
 
+    <!-- Permission required for CTS test - CtsAppTestCases -->
+    <uses-permission android:name="android.permission.KILL_UID" />
+
     <application
         android:label="@string/app_label"
         android:theme="@android:style/Theme.DeviceDefault.DayNight"
diff --git a/packages/Shell/res/values-kn/strings.xml b/packages/Shell/res/values-kn/strings.xml
index 56448f7..18d0f34 100644
--- a/packages/Shell/res/values-kn/strings.xml
+++ b/packages/Shell/res/values-kn/strings.xml
@@ -28,7 +28,7 @@
     <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ ಇಲ್ಲದೇ ಬಗ್ ವರದಿ ಹಂಚಿಕೊಳ್ಳಲು ಆಯ್ಕೆಮಾಡಿ, ಅಥವಾ ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ ಪೂರ್ತಿಯಾಗುವ ತನಕ ಕಾಯಿರಿ"</string>
     <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ ಇಲ್ಲದೇ ನಿಮ್ಮ ಬಗ್ ವರದಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಟ್ಯಾಪ್ ಮಾಡಿ ಅಥವಾ ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ ಪೂರ್ತಿಯಾಗುವವರೆಗೂ ನಿರೀಕ್ಷಿಸಿ"</string>
     <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ ಇಲ್ಲದೇ ನಿಮ್ಮ ಬಗ್ ವರದಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಟ್ಯಾಪ್ ಮಾಡಿ ಅಥವಾ ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ ಪೂರ್ತಿಯಾಗುವವರೆಗೂ ನಿರೀಕ್ಷಿಸಿ"</string>
-    <string name="bugreport_confirm" msgid="5917407234515812495">"ನೀವು ಸೂಕ್ಷ್ಮ ಎಂದು ಪರಿಗಣಿಸಿರುವ ಯಾವುದೇ ಡೇಟಾ ಒಳಗೊಂಡಿರುವ ಸಿಸ್ಟಂನ ಹಲವಾರು ಲಾಗ್ ಫೈಲ್‌ಗಳಿಂದ ಡೇಟಾವನ್ನು ದೋಷದ ವರದಿಗಳು ಒಳಗೊಂಡಿವೆ (ಉದಾಹರಣೆಗೆ ಅಪ್ಲಿಕೇಶನ್-ಬಳಕೆ ಮತ್ತು ಸ್ಥಳ ಮಾಹಿತಿ). ನೀವು ನಂಬಿಕೆ ಇರಿಸಿರುವ ಜನರು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್‌ಗಳೊಂದಿಗೆ ಮಾತ್ರ ದೋಷದ ವರದಿಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಿ."</string>
+    <string name="bugreport_confirm" msgid="5917407234515812495">"ನೀವು ಸೂಕ್ಷ್ಮ ಎಂದು ಪರಿಗಣಿಸಿರುವ ಯಾವುದೇ ಡೇಟಾ ಒಳಗೊಂಡಿರುವ ಸಿಸ್ಟಂನ ಹಲವಾರು ಲಾಗ್ ಫೈಲ್‌ಗಳಿಂದ ಡೇಟಾವನ್ನು ದೋಷದ ವರದಿಗಳು ಒಳಗೊಂಡಿವೆ (ಉದಾಹರಣೆಗೆ ಆ್ಯಪ್-ಬಳಕೆ ಮತ್ತು ಸ್ಥಳ ಮಾಹಿತಿ). ನೀವು ನಂಬಿಕೆ ಇರಿಸಿರುವ ಜನರು ಮತ್ತು ಆ್ಯಪ್‌ಗಳೊಂದಿಗೆ ಮಾತ್ರ ದೋಷದ ವರದಿಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಿ."</string>
     <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"ಮತ್ತೊಮ್ಮೆ ತೋರಿಸಬೇಡ"</string>
     <string name="bugreport_storage_title" msgid="5332488144740527109">"ದೋಷ ವರದಿಗಳು"</string>
     <string name="bugreport_unreadable_text" msgid="586517851044535486">"ಬಗ್‌ ವರದಿ ಫೈಲ್‌‌ ಅನ್ನು ಓದಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string>
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index bd7067b..1f10ead 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -1022,6 +1022,7 @@
     defaults: [
         "platform_app_defaults",
         "SystemUI_optimized_defaults",
+        "wmshell_defaults",
     ],
     static_libs: [
         "SystemUI-core",
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fa/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fa/strings.xml
index 49d8f69..cf6f012 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fa/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fa/strings.xml
@@ -26,6 +26,6 @@
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"دکمه‌های بزرگ"</string>
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"افزایش اندازه «دکمه‌های منوی دسترس‌پذیری»"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"راهنما"</string>
-    <string name="brightness_percentage_label" msgid="7391554573977867369">"روشنایی <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"بلندی صدای موسیقی <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="brightness_percentage_label" msgid="7391554573977867369">"‏روشنایی ‎%%<xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"‏بلندی صدای موسیقی ‎%%<xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index f8383d9..26e6e71 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -40,16 +40,6 @@
 }
 
 flag {
-   name: "notification_minimalism_prototype"
-   namespace: "systemui"
-   description: "Prototype of notification minimalism; the new 'Intermediate' lockscreen customization proposal."
-   bug: "330387368"
-   metadata {
-        purpose: PURPOSE_BUGFIX
-   }
-}
-
-flag {
    name: "notification_view_flipper_pausing_v2"
    namespace: "systemui"
    description: "Pause ViewFlippers inside Notification custom layouts when the shade is closed."
@@ -569,6 +559,13 @@
 }
 
 flag {
+    name: "volume_redesign"
+    namespace: "systemui"
+    description: "Enables Volume BC25 visuals update"
+    bug: "368308908"
+}
+
+flag {
     name: "clipboard_shared_transitions"
     namespace: "systemui"
     description: "Show shared transitions from clipboard"
@@ -633,6 +630,20 @@
 }
 
 flag {
+    name: "screenshot_multidisplay_focus_change"
+    namespace: "systemui"
+    description: "Only capture a single display when screenshotting"
+    bug: "362720389"
+}
+
+flag {
+    name: "screenshot_policy_split_and_desktop_mode"
+    namespace: "systemui"
+    description: "Improves screenshot policy handling for split screen and desktop mode."
+    bug: "365597999"
+}
+
+flag {
    name: "run_fingerprint_detect_on_dismissible_keyguard"
    namespace: "systemui"
    description: "Run fingerprint detect instead of authenticate if the keyguard is dismissible."
@@ -802,16 +813,6 @@
 }
 
 flag {
-    name: "register_zen_mode_content_observer_background"
-    namespace: "systemui"
-    description: "Decide whether to register zen mode content observers in the background thread."
-    bug: "324515627"
-    metadata {
-        purpose: PURPOSE_BUGFIX
-    }
-}
-
-flag {
     name: "clipboard_noninteractive_on_lockscreen"
     namespace: "systemui"
     description: "Prevents the interactive clipboard UI from appearing when device is locked"
@@ -1070,6 +1071,16 @@
 }
 
 flag {
+    name: "dream_overlay_updated_font"
+    namespace: "systemui"
+    description: "Flag to enable updated font settings for dream overlay"
+    bug: "349656117"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
+
+flag {
   name: "app_clips_backlinks"
   namespace: "systemui"
   description: "Enables Backlinks improvement feature in App Clips"
@@ -1128,6 +1139,16 @@
 }
 
 flag {
+  name: "media_controls_umo_inflation_in_background"
+  namespace: "systemui"
+  description: "Inflate UMO in background thread"
+  bug: "368514198"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
   namespace: "systemui"
   name: "enable_view_capture_tracing"
   description: "Enables view capture tracing in System UI."
@@ -1370,10 +1391,13 @@
 }
 
 flag {
-   name: "compose_haptic_sliders"
+   name: "haptics_for_compose_sliders"
    namespace: "systemui"
    description: "Adding haptic component infrastructure to sliders in Compose."
    bug: "341968766"
+   metadata {
+        purpose: PURPOSE_BUGFIX
+   }
 }
 
 flag {
@@ -1424,6 +1448,13 @@
 }
 
 flag {
+   name: "override_suppress_overlay_condition"
+   namespace: "systemui"
+   description: "Allow override the conditions to suppress the clipboard overlay"
+   bug: "358473717"
+}
+
+flag {
    name: "media_projection_dialog_behind_lockscreen"
    namespace: "systemui"
    description: "Ensure MediaProjection Dialog appears behind the lockscreen"
@@ -1431,4 +1462,14 @@
    metadata {
        purpose: PURPOSE_BUGFIX
    }
-}
\ No newline at end of file
+}
+
+flag {
+   name: "check_lockscreen_gone_transition"
+   namespace: "systemui"
+   description: "Run notification pipeline when the lockscreen is not in gone transition for avoiding janky frames during unlocking animation"
+   bug: "358301118"
+   metadata {
+       purpose: PURPOSE_BUGFIX
+   }
+}
diff --git a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginRemoteTransition.java b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginRemoteTransition.java
new file mode 100644
index 0000000..08db95e
--- /dev/null
+++ b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginRemoteTransition.java
@@ -0,0 +1,374 @@
+/*
+ * Copyright (C) 2024 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.systemui.animation;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.ValueAnimator;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.Rect;
+import android.hardware.display.DisplayManager;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.SurfaceControl;
+import android.window.IRemoteTransition;
+import android.window.IRemoteTransitionFinishedCallback;
+import android.window.TransitionInfo;
+import android.window.TransitionInfo.Change;
+import android.window.WindowAnimationState;
+
+import com.android.internal.policy.ScreenDecorationsUtils;
+import com.android.wm.shell.shared.TransitionUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * An implementation of {@link IRemoteTransition} that accepts a {@link UIComponent} as the origin
+ * and automatically attaches it to the transition leash before the transition starts.
+ */
+public class OriginRemoteTransition extends IRemoteTransition.Stub {
+    private static final String TAG = "OriginRemoteTransition";
+
+    private final Context mContext;
+    private final boolean mIsEntry;
+    private final UIComponent mOrigin;
+    private final TransitionPlayer mPlayer;
+    private final long mDuration;
+    private final Handler mHandler;
+
+    @Nullable private SurfaceControl.Transaction mStartTransaction;
+    @Nullable private IRemoteTransitionFinishedCallback mFinishCallback;
+    @Nullable private UIComponent.Transaction mOriginTransaction;
+    @Nullable private ValueAnimator mAnimator;
+    @Nullable private SurfaceControl mOriginLeash;
+    private boolean mCancelled;
+
+    OriginRemoteTransition(
+            Context context,
+            boolean isEntry,
+            UIComponent origin,
+            TransitionPlayer player,
+            long duration,
+            Handler handler) {
+        mContext = context;
+        mIsEntry = isEntry;
+        mOrigin = origin;
+        mPlayer = player;
+        mDuration = duration;
+        mHandler = handler;
+    }
+
+    @Override
+    public void startAnimation(
+            IBinder token,
+            TransitionInfo info,
+            SurfaceControl.Transaction t,
+            IRemoteTransitionFinishedCallback finishCallback) {
+        logD("startAnimation - " + info);
+        mHandler.post(
+                () -> {
+                    mStartTransaction = t;
+                    mFinishCallback = finishCallback;
+                    startAnimationInternal(info);
+                });
+    }
+
+    @Override
+    public void mergeAnimation(
+            IBinder transition,
+            TransitionInfo info,
+            SurfaceControl.Transaction t,
+            IBinder mergeTarget,
+            IRemoteTransitionFinishedCallback finishCallback) {
+        logD("mergeAnimation - " + info);
+        mHandler.post(this::cancel);
+    }
+
+    @Override
+    public void takeOverAnimation(
+            IBinder transition,
+            TransitionInfo info,
+            SurfaceControl.Transaction t,
+            IRemoteTransitionFinishedCallback finishCallback,
+            WindowAnimationState[] states) {
+        logD("takeOverAnimation - " + info);
+    }
+
+    @Override
+    public void onTransitionConsumed(IBinder transition, boolean aborted) {
+        logD("onTransitionConsumed - aborted: " + aborted);
+        mHandler.post(this::cancel);
+    }
+
+    private void startAnimationInternal(TransitionInfo info) {
+        if (!prepareUIs(info)) {
+            logE("Unable to prepare UI!");
+            finishAnimation(/* finished= */ false);
+            return;
+        }
+        // Notify player that we are starting.
+        mPlayer.onStart(info, mStartTransaction, mOrigin, mOriginTransaction);
+
+        // Start the animator.
+        mAnimator = ValueAnimator.ofFloat(0.0f, 1.0f);
+        mAnimator.setDuration(mDuration);
+        mAnimator.addListener(
+                new AnimatorListener() {
+                    @Override
+                    public void onAnimationStart(Animator a) {}
+
+                    @Override
+                    public void onAnimationEnd(Animator a) {
+                        finishAnimation(/* finished= */ !mCancelled);
+                    }
+
+                    @Override
+                    public void onAnimationCancel(Animator a) {
+                        mCancelled = true;
+                    }
+
+                    @Override
+                    public void onAnimationRepeat(Animator a) {}
+                });
+        mAnimator.addUpdateListener(
+                a -> {
+                    mPlayer.onProgress((float) a.getAnimatedValue());
+                });
+        mAnimator.start();
+    }
+
+    private boolean prepareUIs(TransitionInfo info) {
+        if (info.getRootCount() == 0) {
+            logE("prepareUIs: no root leash!");
+            return false;
+        }
+        if (info.getRootCount() > 1) {
+            logE("prepareUIs: multi-display transition is not supported yet!");
+            return false;
+        }
+        if (info.getChanges().isEmpty()) {
+            logE("prepareUIs: no changes!");
+            return false;
+        }
+
+        SurfaceControl rootLeash = info.getRoot(0).getLeash();
+        int displayId = info.getChanges().get(0).getEndDisplayId();
+        Rect displayBounds = getDisplayBounds(displayId);
+        float windowRadius = ScreenDecorationsUtils.getWindowCornerRadius(mContext);
+        logD("prepareUIs: windowRadius=" + windowRadius + ", displayBounds=" + displayBounds);
+
+        // Create the origin leash and add to the transition root leash.
+        mOriginLeash =
+                new SurfaceControl.Builder().setName("OriginTransition-origin-leash").build();
+        mStartTransaction
+                .reparent(mOriginLeash, rootLeash)
+                .show(mOriginLeash)
+                .setCornerRadius(mOriginLeash, windowRadius)
+                .setWindowCrop(mOriginLeash, displayBounds.width(), displayBounds.height());
+
+        // Process surfaces
+        List<SurfaceControl> openingSurfaces = new ArrayList<>();
+        List<SurfaceControl> closingSurfaces = new ArrayList<>();
+        for (Change change : info.getChanges()) {
+            int mode = change.getMode();
+            SurfaceControl leash = change.getLeash();
+            // Reparent leash to the transition root.
+            mStartTransaction.reparent(leash, rootLeash);
+            if (TransitionUtil.isOpeningMode(mode)) {
+                openingSurfaces.add(change.getLeash());
+                // For opening surfaces, ending bounds are base bound. Apply corner radius if
+                // it's full screen.
+                Rect bounds = change.getEndAbsBounds();
+                if (displayBounds.equals(bounds)) {
+                    mStartTransaction
+                            .setCornerRadius(leash, windowRadius)
+                            .setWindowCrop(leash, bounds.width(), bounds.height());
+                }
+            } else if (TransitionUtil.isClosingMode(mode)) {
+                closingSurfaces.add(change.getLeash());
+                // For closing surfaces, starting bounds are base bounds. Apply corner radius if
+                // it's full screen.
+                Rect bounds = change.getStartAbsBounds();
+                if (displayBounds.equals(bounds)) {
+                    mStartTransaction
+                            .setCornerRadius(leash, windowRadius)
+                            .setWindowCrop(leash, bounds.width(), bounds.height());
+                }
+            }
+        }
+
+        // Set relative order:
+        // ----  App1  ----
+        // ---- origin ----
+        // ----  App2  ----
+        if (mIsEntry) {
+            mStartTransaction
+                    .setRelativeLayer(mOriginLeash, closingSurfaces.get(0), 1)
+                    .setRelativeLayer(
+                            openingSurfaces.get(openingSurfaces.size() - 1), mOriginLeash, 1);
+        } else {
+            mStartTransaction
+                    .setRelativeLayer(mOriginLeash, openingSurfaces.get(0), 1)
+                    .setRelativeLayer(
+                            closingSurfaces.get(closingSurfaces.size() - 1), mOriginLeash, 1);
+        }
+
+        // Attach origin UIComponent to origin leash.
+        mOriginTransaction = mOrigin.newTransaction();
+        mOriginTransaction
+                .attachToTransitionLeash(
+                        mOrigin, mOriginLeash, displayBounds.width(), displayBounds.height())
+                .commit();
+
+        // Apply all surface changes.
+        mStartTransaction.apply();
+        return true;
+    }
+
+    private Rect getDisplayBounds(int displayId) {
+        DisplayManager dm = mContext.getSystemService(DisplayManager.class);
+        DisplayMetrics metrics = new DisplayMetrics();
+        dm.getDisplay(displayId).getMetrics(metrics);
+        return new Rect(0, 0, metrics.widthPixels, metrics.heightPixels);
+    }
+
+    private void finishAnimation(boolean finished) {
+        logD("finishAnimation: finished=" + finished);
+        if (mAnimator == null) {
+            // The transition didn't start. Ensure we apply the start transaction and report
+            // finish afterwards.
+            mStartTransaction
+                    .addTransactionCommittedListener(
+                            mContext.getMainExecutor(), this::finishInternal)
+                    .apply();
+            return;
+        }
+        mAnimator = null;
+        // Notify client that we have ended.
+        mPlayer.onEnd(finished);
+        // Detach the origin from the transition leash and report finish after it's done.
+        mOriginTransaction
+                .detachFromTransitionLeash(
+                        mOrigin, mContext.getMainExecutor(), this::finishInternal)
+                .commit();
+    }
+
+    private void finishInternal() {
+        logD("finishInternal");
+        if (mOriginLeash != null) {
+            // Release origin leash.
+            mOriginLeash.release();
+            mOriginLeash = null;
+        }
+        try {
+            mFinishCallback.onTransitionFinished(null, null);
+        } catch (RemoteException e) {
+            logE("Unable to report transition finish!", e);
+        }
+        mStartTransaction = null;
+        mOriginTransaction = null;
+        mFinishCallback = null;
+    }
+
+    private void cancel() {
+        if (mAnimator != null) {
+            mAnimator.cancel();
+        }
+    }
+
+    private static void logD(String msg) {
+        if (OriginTransitionSession.DEBUG) {
+            Log.d(TAG, msg);
+        }
+    }
+
+    private static void logE(String msg) {
+        Log.e(TAG, msg);
+    }
+
+    private static void logE(String msg, Throwable e) {
+        Log.e(TAG, msg, e);
+    }
+
+    private static UIComponent wrapSurfaces(TransitionInfo info, boolean isOpening) {
+        List<SurfaceControl> surfaces = new ArrayList<>();
+        Rect maxBounds = new Rect();
+        for (Change change : info.getChanges()) {
+            int mode = change.getMode();
+            if (TransitionUtil.isOpeningMode(mode) == isOpening) {
+                surfaces.add(change.getLeash());
+                Rect bounds = isOpening ? change.getEndAbsBounds() : change.getStartAbsBounds();
+                maxBounds.union(bounds);
+            }
+        }
+        return new SurfaceUIComponent(
+                surfaces,
+                /* alpha= */ 1.0f,
+                /* visible= */ true,
+                /* bounds= */ maxBounds,
+                /* baseBounds= */ maxBounds);
+    }
+
+    /** An interface that represents an origin transitions. */
+    public interface TransitionPlayer {
+
+        /**
+         * Called when an origin transition starts. This method exposes the raw {@link
+         * TransitionInfo} so that clients can extract more information from it.
+         */
+        default void onStart(
+                TransitionInfo transitionInfo,
+                SurfaceControl.Transaction sfTransaction,
+                UIComponent origin,
+                UIComponent.Transaction uiTransaction) {
+            // Wrap transactions.
+            Transactions transactions =
+                    new Transactions()
+                            .registerTransactionForClass(origin.getClass(), uiTransaction)
+                            .registerTransactionForClass(
+                                    SurfaceUIComponent.class,
+                                    new SurfaceUIComponent.Transaction(sfTransaction));
+            // Wrap surfaces and start.
+            onStart(
+                    transactions,
+                    origin,
+                    wrapSurfaces(transitionInfo, /* isOpening= */ false),
+                    wrapSurfaces(transitionInfo, /* isOpening= */ true));
+        }
+
+        /**
+         * Called when an origin transition starts. This method exposes the opening and closing
+         * windows as wrapped {@link UIComponent} to provide simplified interface to clients.
+         */
+        void onStart(
+                UIComponent.Transaction transaction,
+                UIComponent origin,
+                UIComponent closingApp,
+                UIComponent openingApp);
+
+        /** Called to update the transition frame. */
+        void onProgress(float progress);
+
+        /** Called when the transition ended. */
+        void onEnd(boolean finished);
+    }
+}
diff --git a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginTransitionSession.java b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginTransitionSession.java
index 64bedd3..23693b6 100644
--- a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginTransitionSession.java
+++ b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginTransitionSession.java
@@ -24,11 +24,14 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
 import android.os.RemoteException;
 import android.util.Log;
 import android.window.IRemoteTransition;
 import android.window.RemoteTransition;
 
+import com.android.systemui.animation.OriginRemoteTransition.TransitionPlayer;
 import com.android.systemui.animation.shared.IOriginTransitions;
 
 import java.lang.annotation.Retention;
@@ -182,6 +185,7 @@
         @Nullable private final IOriginTransitions mOriginTransitions;
         @Nullable private Supplier<IRemoteTransition> mEntryTransitionSupplier;
         @Nullable private Supplier<IRemoteTransition> mExitTransitionSupplier;
+        private Handler mHandler = new Handler(Looper.getMainLooper());
         private String mName;
         @Nullable private Predicate<RemoteTransition> mIntentStarter;
 
@@ -259,12 +263,48 @@
             return this;
         }
 
+        /** Add an origin entry transition to the builder. */
+        public Builder withEntryTransition(
+                UIComponent entryOrigin, TransitionPlayer entryPlayer, long entryDuration) {
+            mEntryTransitionSupplier =
+                    () ->
+                            new OriginRemoteTransition(
+                                    mContext,
+                                    /* isEntry= */ true,
+                                    entryOrigin,
+                                    entryPlayer,
+                                    entryDuration,
+                                    mHandler);
+            return this;
+        }
+
         /** Add an exit transition to the builder. */
         public Builder withExitTransition(IRemoteTransition transition) {
             mExitTransitionSupplier = () -> transition;
             return this;
         }
 
+        /** Add an origin exit transition to the builder. */
+        public Builder withExitTransition(
+                UIComponent exitTarget, TransitionPlayer exitPlayer, long exitDuration) {
+            mExitTransitionSupplier =
+                    () ->
+                            new OriginRemoteTransition(
+                                    mContext,
+                                    /* isEntry= */ false,
+                                    exitTarget,
+                                    exitPlayer,
+                                    exitDuration,
+                                    mHandler);
+            return this;
+        }
+
+        /** Supply a handler where transition callbacks will run. */
+        public Builder withHandler(Handler handler) {
+            mHandler = handler;
+            return this;
+        }
+
         /** Build an {@link OriginTransitionSession}. */
         public OriginTransitionSession build() {
             if (mIntentStarter == null) {
diff --git a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/SurfaceUIComponent.java b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/SurfaceUIComponent.java
new file mode 100644
index 0000000..2438736
--- /dev/null
+++ b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/SurfaceUIComponent.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2024 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.systemui.animation;
+
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.view.SurfaceControl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.concurrent.Executor;
+
+/** A {@link UIComponent} representing a {@link SurfaceControl}. */
+public class SurfaceUIComponent implements UIComponent {
+    private final Collection<SurfaceControl> mSurfaces;
+    private final Rect mBaseBounds;
+    private final float[] mFloat9 = new float[9];
+
+    private float mAlpha;
+    private boolean mVisible;
+    private Rect mBounds;
+
+    public SurfaceUIComponent(
+            SurfaceControl sc, float alpha, boolean visible, Rect bounds, Rect baseBounds) {
+        this(Arrays.asList(sc), alpha, visible, bounds, baseBounds);
+    }
+
+    public SurfaceUIComponent(
+            Collection<SurfaceControl> surfaces,
+            float alpha,
+            boolean visible,
+            Rect bounds,
+            Rect baseBounds) {
+        mSurfaces = surfaces;
+        mAlpha = alpha;
+        mVisible = visible;
+        mBounds = bounds;
+        mBaseBounds = baseBounds;
+    }
+
+    @Override
+    public float getAlpha() {
+        return mAlpha;
+    }
+
+    @Override
+    public boolean isVisible() {
+        return mVisible;
+    }
+
+    @Override
+    public Rect getBounds() {
+        return mBounds;
+    }
+
+    @Override
+    public Transaction newTransaction() {
+        return new Transaction(new SurfaceControl.Transaction());
+    }
+
+    @Override
+    public String toString() {
+        return "SurfaceUIComponent{mSurfaces="
+                + mSurfaces
+                + ", mAlpha="
+                + mAlpha
+                + ", mVisible="
+                + mVisible
+                + ", mBounds="
+                + mBounds
+                + ", mBaseBounds="
+                + mBaseBounds
+                + "}";
+    }
+
+    /** A {@link Transaction} wrapping a {@link SurfaceControl.Transaction}. */
+    public static class Transaction implements UIComponent.Transaction<SurfaceUIComponent> {
+        private final SurfaceControl.Transaction mTransaction;
+        private final ArrayList<Runnable> mChanges = new ArrayList<>();
+
+        public Transaction(SurfaceControl.Transaction transaction) {
+            mTransaction = transaction;
+        }
+
+        @Override
+        public Transaction setAlpha(SurfaceUIComponent ui, float alpha) {
+            mChanges.add(
+                    () -> {
+                        ui.mAlpha = alpha;
+                        ui.mSurfaces.forEach(s -> mTransaction.setAlpha(s, alpha));
+                    });
+            return this;
+        }
+
+        @Override
+        public Transaction setVisible(SurfaceUIComponent ui, boolean visible) {
+            mChanges.add(
+                    () -> {
+                        ui.mVisible = visible;
+                        if (visible) {
+                            ui.mSurfaces.forEach(s -> mTransaction.show(s));
+                        } else {
+                            ui.mSurfaces.forEach(s -> mTransaction.hide(s));
+                        }
+                    });
+            return this;
+        }
+
+        @Override
+        public Transaction setBounds(SurfaceUIComponent ui, Rect bounds) {
+            mChanges.add(
+                    () -> {
+                        if (ui.mBounds.equals(bounds)) {
+                            return;
+                        }
+                        ui.mBounds = bounds;
+                        Matrix matrix = new Matrix();
+                        matrix.setRectToRect(
+                                new RectF(ui.mBaseBounds),
+                                new RectF(ui.mBounds),
+                                Matrix.ScaleToFit.FILL);
+                        ui.mSurfaces.forEach(s -> mTransaction.setMatrix(s, matrix, ui.mFloat9));
+                    });
+            return this;
+        }
+
+        @Override
+        public Transaction attachToTransitionLeash(
+                SurfaceUIComponent ui, SurfaceControl transitionLeash, int w, int h) {
+            mChanges.add(
+                    () -> ui.mSurfaces.forEach(s -> mTransaction.reparent(s, transitionLeash)));
+            return this;
+        }
+
+        @Override
+        public Transaction detachFromTransitionLeash(
+                SurfaceUIComponent ui, Executor executor, Runnable onDone) {
+            mChanges.add(
+                    () -> {
+                        ui.mSurfaces.forEach(s -> mTransaction.reparent(s, null));
+                        mTransaction.addTransactionCommittedListener(executor, onDone::run);
+                    });
+            return this;
+        }
+
+        @Override
+        public void commit() {
+            mChanges.forEach(Runnable::run);
+            mChanges.clear();
+            mTransaction.apply();
+        }
+    }
+}
diff --git a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/Transactions.java b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/Transactions.java
new file mode 100644
index 0000000..5240d99
--- /dev/null
+++ b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/Transactions.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2024 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.systemui.animation;
+
+import android.annotation.FloatRange;
+import android.graphics.Rect;
+import android.util.ArrayMap;
+import android.view.SurfaceControl;
+
+import java.util.Map;
+import java.util.concurrent.Executor;
+
+/**
+ * A composite {@link UIComponent.Transaction} that combines multiple other transactions for each ui
+ * type.
+ */
+public class Transactions implements UIComponent.Transaction<UIComponent> {
+    private final Map<Class, UIComponent.Transaction> mTransactions = new ArrayMap<>();
+
+    /** Register a transaction object for updating a certain {@link UIComponent} type. */
+    public <T extends UIComponent> Transactions registerTransactionForClass(
+            Class<T> clazz, UIComponent.Transaction transaction) {
+        mTransactions.put(clazz, transaction);
+        return this;
+    }
+
+    private UIComponent.Transaction getTransactionFor(UIComponent ui) {
+        UIComponent.Transaction transaction = mTransactions.get(ui.getClass());
+        if (transaction == null) {
+            transaction = ui.newTransaction();
+            mTransactions.put(ui.getClass(), transaction);
+        }
+        return transaction;
+    }
+
+    @Override
+    public Transactions setAlpha(UIComponent ui, @FloatRange(from = 0.0, to = 1.0) float alpha) {
+        getTransactionFor(ui).setAlpha(ui, alpha);
+        return this;
+    }
+
+    @Override
+    public Transactions setVisible(UIComponent ui, boolean visible) {
+        getTransactionFor(ui).setVisible(ui, visible);
+        return this;
+    }
+
+    @Override
+    public Transactions setBounds(UIComponent ui, Rect bounds) {
+        getTransactionFor(ui).setBounds(ui, bounds);
+        return this;
+    }
+
+    @Override
+    public Transactions attachToTransitionLeash(
+            UIComponent ui, SurfaceControl transitionLeash, int w, int h) {
+        getTransactionFor(ui).attachToTransitionLeash(ui, transitionLeash, w, h);
+        return this;
+    }
+
+    @Override
+    public Transactions detachFromTransitionLeash(
+            UIComponent ui, Executor executor, Runnable onDone) {
+        getTransactionFor(ui).detachFromTransitionLeash(ui, executor, onDone);
+        return this;
+    }
+
+    @Override
+    public void commit() {
+        mTransactions.values().forEach(UIComponent.Transaction::commit);
+    }
+}
diff --git a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/UIComponent.java b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/UIComponent.java
new file mode 100644
index 0000000..747e4d1
--- /dev/null
+++ b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/UIComponent.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2024 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.systemui.animation;
+
+import android.annotation.FloatRange;
+import android.graphics.Rect;
+import android.view.SurfaceControl;
+
+import java.util.concurrent.Executor;
+
+/** An interface representing an UI component on the display. */
+public interface UIComponent {
+
+    /** Get the current alpha of this UI. */
+    float getAlpha();
+
+    /** Check if this UI is visible. */
+    boolean isVisible();
+
+    /** Get the bounds of this UI in its display. */
+    Rect getBounds();
+
+    /** Create a new {@link Transaction} that can update this UI. */
+    Transaction newTransaction();
+
+    /**
+     * A transaction class for updating {@link UIComponent}.
+     *
+     * @param <T> the subtype of {@link UIComponent} that this {@link Transaction} can handle.
+     */
+    interface Transaction<T extends UIComponent> {
+        /** Update alpha of an UI. Execution will be delayed until {@link #commit()} is called. */
+        Transaction setAlpha(T ui, @FloatRange(from = 0.0, to = 1.0) float alpha);
+
+        /**
+         * Update visibility of an UI. Execution will be delayed until {@link #commit()} is called.
+         */
+        Transaction setVisible(T ui, boolean visible);
+
+        /** Update bounds of an UI. Execution will be delayed until {@link #commit()} is called. */
+        Transaction setBounds(T ui, Rect bounds);
+
+        /**
+         * Attach a ui to the transition leash. Execution will be delayed until {@link #commit()} is
+         * called.
+         */
+        Transaction attachToTransitionLeash(T ui, SurfaceControl transitionLeash, int w, int h);
+
+        /**
+         * Detach a ui from the transition leash. Execution will be delayed until {@link #commit} is
+         * called.
+         */
+        Transaction detachFromTransitionLeash(T ui, Executor executor, Runnable onDone);
+
+        /** Commit any pending changes added to this transaction. */
+        void commit();
+    }
+}
diff --git a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/ViewUIComponent.java b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/ViewUIComponent.java
new file mode 100644
index 0000000..313789c
--- /dev/null
+++ b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/ViewUIComponent.java
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2024 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.systemui.animation;
+
+import android.annotation.Nullable;
+import android.graphics.Canvas;
+import android.graphics.PorterDuff;
+import android.graphics.Rect;
+import android.os.Build;
+import android.util.Log;
+import android.view.Surface;
+import android.view.SurfaceControl;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver.OnDrawListener;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Executor;
+
+/**
+ * A {@link UIComponent} wrapping a {@link View}. After being attached to the transition leash, this
+ * class will draw the content of the {@link View} directly into the leash, and the actual View will
+ * be changed to INVISIBLE in its view tree. This allows the {@link View} to transform in the
+ * full-screen size leash without being constrained by the view tree's boundary or inheriting its
+ * parent's alpha and transformation.
+ */
+public class ViewUIComponent implements UIComponent {
+    private static final String TAG = "ViewUIComponent";
+    private static final boolean DEBUG = Build.IS_USERDEBUG || Log.isLoggable(TAG, Log.DEBUG);
+    private final OnDrawListener mOnDrawListener = this::postDraw;
+    private final View mView;
+
+    @Nullable private SurfaceControl mSurfaceControl;
+    @Nullable private Surface mSurface;
+    @Nullable private Rect mViewBoundsOverride;
+    private boolean mVisibleOverride;
+    private boolean mDirty;
+
+    public ViewUIComponent(View view) {
+        mView = view;
+    }
+
+    @Override
+    public float getAlpha() {
+        return mView.getAlpha();
+    }
+
+    @Override
+    public boolean isVisible() {
+        return isAttachedToLeash() ? mVisibleOverride : mView.getVisibility() == View.VISIBLE;
+    }
+
+    @Override
+    public Rect getBounds() {
+        if (isAttachedToLeash() && mViewBoundsOverride != null) {
+            return mViewBoundsOverride;
+        }
+        return getRealBounds();
+    }
+
+    @Override
+    public Transaction newTransaction() {
+        return new Transaction();
+    }
+
+    private void attachToTransitionLeash(SurfaceControl transitionLeash, int w, int h) {
+        logD("attachToTransitionLeash");
+        // Remember current visibility.
+        mVisibleOverride = mView.getVisibility() == View.VISIBLE;
+
+        // Create the surface
+        mSurfaceControl =
+                new SurfaceControl.Builder().setName("ViewUIComponent").setBufferSize(w, h).build();
+        mSurface = new Surface(mSurfaceControl);
+        forceDraw();
+
+        // Attach surface to transition leash
+        SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+        t.reparent(mSurfaceControl, transitionLeash).show(mSurfaceControl);
+
+        // Make sure view draw triggers surface draw.
+        mView.getViewTreeObserver().addOnDrawListener(mOnDrawListener);
+
+        // Make the view invisible AFTER the surface is shown.
+        t.addTransactionCommittedListener(
+                        mView.getContext().getMainExecutor(),
+                        () -> mView.setVisibility(View.INVISIBLE))
+                .apply();
+    }
+
+    private void detachFromTransitionLeash(Executor executor, Runnable onDone) {
+        logD("detachFromTransitionLeash");
+        Surface s = mSurface;
+        SurfaceControl sc = mSurfaceControl;
+        mSurface = null;
+        mSurfaceControl = null;
+        mView.getViewTreeObserver().removeOnDrawListener(mOnDrawListener);
+        // Restore view visibility
+        mView.setVisibility(mVisibleOverride ? View.VISIBLE : View.INVISIBLE);
+        mView.invalidate();
+        // Clean up surfaces.
+        SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+        t.reparent(sc, null)
+                .addTransactionCommittedListener(
+                        mView.getContext().getMainExecutor(),
+                        () -> {
+                            s.release();
+                            sc.release();
+                            executor.execute(onDone);
+                        });
+        // Apply transaction AFTER the view is drawn.
+        mView.getRootSurfaceControl().applyTransactionOnDraw(t);
+    }
+
+    @Override
+    public String toString() {
+        return "ViewUIComponent{"
+                + "alpha="
+                + getAlpha()
+                + ", visible="
+                + isVisible()
+                + ", bounds="
+                + getBounds()
+                + ", attached="
+                + isAttachedToLeash()
+                + "}";
+    }
+
+    private void draw() {
+        if (!mDirty) {
+            // No need to draw. This is probably a duplicate call.
+            logD("draw: skipped - clean");
+            return;
+        }
+        mDirty = false;
+        if (!isAttachedToLeash()) {
+            // Not attached.
+            logD("draw: skipped - not attached");
+            return;
+        }
+        ViewGroup.LayoutParams params = mView.getLayoutParams();
+        if (params == null || params.width == 0 || params.height == 0) {
+            // layout pass didn't happen.
+            logD("draw: skipped - no layout");
+            return;
+        }
+        Canvas canvas = mSurface.lockHardwareCanvas();
+        // Clear the canvas first.
+        canvas.drawColor(0, PorterDuff.Mode.CLEAR);
+        if (mVisibleOverride) {
+            Rect realBounds = getRealBounds();
+            Rect renderBounds = getBounds();
+            canvas.translate(renderBounds.left, renderBounds.top);
+            canvas.scale(
+                    (float) renderBounds.width() / realBounds.width(),
+                    (float) renderBounds.height() / realBounds.height());
+            canvas.saveLayerAlpha(null, (int) (255 * mView.getAlpha()));
+            mView.draw(canvas);
+            canvas.restore();
+        }
+        mSurface.unlockCanvasAndPost(canvas);
+        logD("draw: done");
+    }
+
+    private void forceDraw() {
+        mDirty = true;
+        draw();
+    }
+
+    private Rect getRealBounds() {
+        Rect output = new Rect();
+        mView.getBoundsOnScreen(output);
+        return output;
+    }
+
+    private boolean isAttachedToLeash() {
+        return mSurfaceControl != null && mSurface != null;
+    }
+
+    private void logD(String msg) {
+        if (DEBUG) {
+            Log.d(TAG, msg);
+        }
+    }
+
+    private void setVisible(boolean visible) {
+        logD("setVisibility: " + visible);
+        if (isAttachedToLeash()) {
+            mVisibleOverride = visible;
+            postDraw();
+        } else {
+            mView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
+        }
+    }
+
+    private void setBounds(Rect bounds) {
+        logD("setBounds: " + bounds);
+        mViewBoundsOverride = bounds;
+        if (isAttachedToLeash()) {
+            postDraw();
+        } else {
+            Log.w(TAG, "setBounds: not attached to leash!");
+        }
+    }
+
+    private void setAlpha(float alpha) {
+        logD("setAlpha: " + alpha);
+        mView.setAlpha(alpha);
+        if (isAttachedToLeash()) {
+            postDraw();
+        }
+    }
+
+    private void postDraw() {
+        if (mDirty) {
+            return;
+        }
+        mDirty = true;
+        mView.post(this::draw);
+    }
+
+    public static class Transaction implements UIComponent.Transaction<ViewUIComponent> {
+        private final List<Runnable> mChanges = new ArrayList<>();
+
+        @Override
+        public Transaction setAlpha(ViewUIComponent ui, float alpha) {
+            mChanges.add(() -> ui.setAlpha(alpha));
+            return this;
+        }
+
+        @Override
+        public Transaction setVisible(ViewUIComponent ui, boolean visible) {
+            mChanges.add(() -> ui.setVisible(visible));
+            return this;
+        }
+
+        @Override
+        public Transaction setBounds(ViewUIComponent ui, Rect bounds) {
+            mChanges.add(() -> ui.setBounds(bounds));
+            return this;
+        }
+
+        @Override
+        public Transaction attachToTransitionLeash(
+                ViewUIComponent ui, SurfaceControl transitionLeash, int w, int h) {
+            mChanges.add(() -> ui.attachToTransitionLeash(transitionLeash, w, h));
+            return this;
+        }
+
+        @Override
+        public Transaction detachFromTransitionLeash(
+                ViewUIComponent ui, Executor executor, Runnable onDone) {
+            mChanges.add(() -> ui.detachFromTransitionLeash(executor, onDone));
+            return this;
+        }
+
+        @Override
+        public void commit() {
+            mChanges.forEach(Runnable::run);
+            mChanges.clear();
+        }
+    }
+}
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogTransitionAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogTransitionAnimator.kt
index f5d01d7..907c39d 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogTransitionAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogTransitionAnimator.kt
@@ -944,9 +944,26 @@
                 }
 
                 override fun onTransitionAnimationEnd(isExpandingFullyAbove: Boolean) {
-                    startController.onTransitionAnimationEnd(isExpandingFullyAbove)
-                    endController.onTransitionAnimationEnd(isExpandingFullyAbove)
-                    onLaunchAnimationEnd()
+                    // onLaunchAnimationEnd is called by an Animator at the end of the animation,
+                    // on a Choreographer animation tick. The following calls will move the animated
+                    // content from the dialog overlay back to its original position, and this
+                    // change must be reflected in the next frame given that we then sync the next
+                    // frame of both the content and dialog ViewRoots. However, in case that content
+                    // is rendered by Compose, whose compositions are also scheduled on a
+                    // Choreographer frame, any state change made *right now* won't be reflected in
+                    // the next frame given that a Choreographer frame can't schedule another and
+                    // have it happen in the same frame. So we post the forwarded calls to
+                    // [Controller.onLaunchAnimationEnd], leaving this Choreographer frame, ensuring
+                    // that the move of the content back to its original window will be reflected in
+                    // the next frame right after [onLaunchAnimationEnd] is called.
+                    //
+                    // TODO(b/330672236): Move this to TransitionAnimator.
+                    dialog.context.mainExecutor.execute {
+                        startController.onTransitionAnimationEnd(isExpandingFullyAbove)
+                        endController.onTransitionAnimationEnd(isExpandingFullyAbove)
+
+                        onLaunchAnimationEnd()
+                    }
                 }
 
                 override fun onTransitionAnimationProgress(
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/TransitionAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/TransitionAnimator.kt
index 859fc4e0..fc4cf1d 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/TransitionAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/TransitionAnimator.kt
@@ -379,26 +379,13 @@
                         Log.d(TAG, "Animation ended")
                     }
 
-                    // onAnimationEnd is called at the end of the animation, on a Choreographer
-                    // animation tick. During dialog launches, the following calls will move the
-                    // animated content from the dialog overlay back to its original position, and
-                    // this change must be reflected in the next frame given that we then sync the
-                    // next frame of both the content and dialog ViewRoots. During SysUI activity
-                    // launches, we will instantly collapse the shade at the end of the transition.
-                    // However, if those are rendered by Compose, whose compositions are also
-                    // scheduled on a Choreographer frame, any state change made *right now* won't
-                    // be reflected in the next frame given that a Choreographer frame can't
-                    // schedule another and have it happen in the same frame. So we post the
-                    // forwarded calls to [Controller.onLaunchAnimationEnd] in the main executor,
-                    // leaving this Choreographer frame, ensuring that any state change applied by
-                    // onTransitionAnimationEnd() will be reflected in the same frame.
-                    mainExecutor.execute {
-                        controller.onTransitionAnimationEnd(isExpandingFullyAbove)
-                        transitionContainerOverlay.remove(windowBackgroundLayer)
+                    // TODO(b/330672236): Post this to the main thread instead so that it does not
+                    // flicker with Flexiglass enabled.
+                    controller.onTransitionAnimationEnd(isExpandingFullyAbove)
+                    transitionContainerOverlay.remove(windowBackgroundLayer)
 
-                        if (moveBackgroundLayerWhenAppVisibilityChanges && controller.isLaunching) {
-                            openingWindowSyncViewOverlay?.remove(windowBackgroundLayer)
-                        }
+                    if (moveBackgroundLayerWhenAppVisibilityChanges && controller.isLaunching) {
+                        openingWindowSyncViewOverlay?.remove(windowBackgroundLayer)
                     }
                 }
             }
diff --git a/packages/SystemUI/compose/core/src/com/android/compose/PlatformButtons.kt b/packages/SystemUI/compose/core/src/com/android/compose/PlatformButtons.kt
index a5f8057..20efea5 100644
--- a/packages/SystemUI/compose/core/src/com/android/compose/PlatformButtons.kt
+++ b/packages/SystemUI/compose/core/src/com/android/compose/PlatformButtons.kt
@@ -28,11 +28,11 @@
 import androidx.compose.material3.IconButton
 import androidx.compose.material3.IconButtonColors
 import androidx.compose.material3.IconButtonDefaults
+import androidx.compose.material3.MaterialTheme
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.unit.dp
-import com.android.compose.theme.LocalAndroidColorScheme
 
 @Composable
 fun PlatformButton(
@@ -100,12 +100,7 @@
     @DrawableRes iconResource: Int,
     contentDescription: String?,
 ) {
-    IconButton(
-        modifier = modifier,
-        onClick = onClick,
-        enabled = enabled,
-        colors = colors,
-    ) {
+    IconButton(modifier = modifier, onClick = onClick, enabled = enabled, colors = colors) {
         Icon(
             painter = painterResource(id = iconResource),
             contentDescription = contentDescription,
@@ -118,7 +113,7 @@
 
 @Composable
 private fun filledButtonColors(): ButtonColors {
-    val colors = LocalAndroidColorScheme.current
+    val colors = MaterialTheme.colorScheme
     return ButtonDefaults.buttonColors(
         containerColor = colors.primary,
         contentColor = colors.onPrimary,
@@ -127,27 +122,22 @@
 
 @Composable
 private fun outlineButtonColors(): ButtonColors {
-    return ButtonDefaults.outlinedButtonColors(
-        contentColor = LocalAndroidColorScheme.current.onSurface,
-    )
+    return ButtonDefaults.outlinedButtonColors(contentColor = MaterialTheme.colorScheme.onSurface)
 }
 
 @Composable
 private fun iconButtonColors(): IconButtonColors {
     return IconButtonDefaults.filledIconButtonColors(
-        contentColor = LocalAndroidColorScheme.current.onSurface,
+        contentColor = MaterialTheme.colorScheme.onSurface
     )
 }
 
 @Composable
 private fun outlineButtonBorder(): BorderStroke {
-    return BorderStroke(
-        width = 1.dp,
-        color = LocalAndroidColorScheme.current.primary,
-    )
+    return BorderStroke(width = 1.dp, color = MaterialTheme.colorScheme.primary)
 }
 
 @Composable
 private fun textButtonColors(): ButtonColors {
-    return ButtonDefaults.textButtonColors(contentColor = LocalAndroidColorScheme.current.primary)
+    return ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.primary)
 }
diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/Bounceable.kt b/packages/SystemUI/compose/core/src/com/android/compose/animation/Bounceable.kt
new file mode 100644
index 0000000..3f2f84b
--- /dev/null
+++ b/packages/SystemUI/compose/core/src/com/android/compose/animation/Bounceable.kt
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2024 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.compose.animation
+
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.layout
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Dp
+import kotlin.math.roundToInt
+
+/** A component that can bounce in one dimension, for instance when it is tapped. */
+interface Bounceable {
+    val bounce: Dp
+}
+
+/**
+ * Bounce a composable in the given [orientation] when this [bounceable], the [previousBounceable]
+ * or [nextBounceable] is bouncing.
+ *
+ * Important: This modifier should be used on composables that have a fixed size in [orientation],
+ * i.e. they should be placed *after* modifiers like Modifier.fillMaxWidth() or Modifier.height().
+ *
+ * @param bounceable the [Bounceable] associated to the current composable that will make this
+ *   composable size grow when bouncing.
+ * @param previousBounceable the [Bounceable] associated to the previous composable in [orientation]
+ *   that will make this composable shrink when bouncing.
+ * @param nextBounceable the [Bounceable] associated to the next composable in [orientation] that
+ *   will make this composable shrink when bouncing.
+ * @param orientation the orientation in which this bounceable should grow/shrink.
+ * @param bounceEnd whether this bounceable should bounce on the end (right in LTR layouts, left in
+ *   RTL layouts) side. This can be used for grids for which the last item does not align perfectly
+ *   with the end of the grid.
+ */
+fun Modifier.bounceable(
+    bounceable: Bounceable,
+    previousBounceable: Bounceable?,
+    nextBounceable: Bounceable?,
+    orientation: Orientation,
+    bounceEnd: Boolean = nextBounceable != null,
+): Modifier {
+    return layout { measurable, constraints ->
+        // The constraints in the orientation should be fixed, otherwise there is no way to know
+        // what the size of our child node will be without this animation code.
+        checkFixedSize(constraints, orientation)
+
+        var sizePrevious = 0f
+        var sizeNext = 0f
+
+        if (previousBounceable != null) {
+            sizePrevious += bounceable.bounce.toPx() - previousBounceable.bounce.toPx()
+        }
+
+        if (nextBounceable != null) {
+            sizeNext += bounceable.bounce.toPx() - nextBounceable.bounce.toPx()
+        } else if (bounceEnd) {
+            sizeNext += bounceable.bounce.toPx()
+        }
+
+        when (orientation) {
+            Orientation.Horizontal -> {
+                val idleWidth = constraints.maxWidth
+                val animatedWidth = (idleWidth + sizePrevious + sizeNext).roundToInt()
+                val animatedConstraints =
+                    constraints.copy(minWidth = animatedWidth, maxWidth = animatedWidth)
+
+                val placeable = measurable.measure(animatedConstraints)
+
+                // Important: we still place the element using the idle size coming from the
+                // constraints, otherwise the parent will automatically center this node given the
+                // size that it expects us to be. This allows us to then place the element where we
+                // want it to be.
+                layout(idleWidth, placeable.height) {
+                    placeable.placeRelative(-sizePrevious.roundToInt(), 0)
+                }
+            }
+            Orientation.Vertical -> {
+                val idleHeight = constraints.maxHeight
+                val animatedHeight = (idleHeight + sizePrevious + sizeNext).roundToInt()
+                val animatedConstraints =
+                    constraints.copy(minHeight = animatedHeight, maxHeight = animatedHeight)
+
+                val placeable = measurable.measure(animatedConstraints)
+                layout(placeable.width, idleHeight) {
+                    placeable.placeRelative(0, -sizePrevious.roundToInt())
+                }
+            }
+        }
+    }
+}
+
+private fun checkFixedSize(constraints: Constraints, orientation: Orientation) {
+    when (orientation) {
+        Orientation.Horizontal -> {
+            check(constraints.hasFixedWidth) {
+                "Modifier.bounceable() should receive a fixed width from its parent. Make sure " +
+                    "that it is used *after* a fixed-width Modifier in the horizontal axis (like" +
+                    " Modifier.fillMaxWidth() or Modifier.width())."
+            }
+        }
+        Orientation.Vertical -> {
+            check(constraints.hasFixedHeight) {
+                "Modifier.bounceable() should receive a fixed height from its parent. Make sure " +
+                    "that it is used *after* a fixed-height Modifier in the vertical axis (like" +
+                    " Modifier.fillMaxHeight() or Modifier.height())."
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/compose/core/src/com/android/compose/theme/AndroidColorScheme.kt b/packages/SystemUI/compose/core/src/com/android/compose/theme/AndroidColorScheme.kt
index b28655b..37c37b0 100644
--- a/packages/SystemUI/compose/core/src/com/android/compose/theme/AndroidColorScheme.kt
+++ b/packages/SystemUI/compose/core/src/com/android/compose/theme/AndroidColorScheme.kt
@@ -84,40 +84,8 @@
     val secondary = getColor(context, R.attr.materialColorSecondary)
     val tertiary = getColor(context, R.attr.materialColorTertiary)
 
-    @Deprecated("Use the new android tokens: go/sysui-colors")
-    val deprecated = DeprecatedValues(context)
-
-    class DeprecatedValues(context: Context) {
-        val colorPrimary = getColor(context, R.attr.colorPrimary)
-        val colorPrimaryDark = getColor(context, R.attr.colorPrimaryDark)
-        val colorAccent = getColor(context, R.attr.colorAccent)
-        val colorAccentPrimary = getColor(context, R.attr.colorAccentPrimary)
-        val colorAccentSecondary = getColor(context, R.attr.colorAccentSecondary)
-        val colorAccentTertiary = getColor(context, R.attr.colorAccentTertiary)
-        val colorAccentPrimaryVariant = getColor(context, R.attr.colorAccentPrimaryVariant)
-        val colorAccentSecondaryVariant = getColor(context, R.attr.colorAccentSecondaryVariant)
-        val colorAccentTertiaryVariant = getColor(context, R.attr.colorAccentTertiaryVariant)
-        val colorSurface = getColor(context, R.attr.colorSurface)
-        val colorSurfaceHighlight = getColor(context, R.attr.colorSurfaceHighlight)
-        val colorSurfaceVariant = getColor(context, R.attr.colorSurfaceVariant)
-        val colorSurfaceHeader = getColor(context, R.attr.colorSurfaceHeader)
-        val colorError = getColor(context, R.attr.colorError)
-        val colorBackground = getColor(context, R.attr.colorBackground)
-        val colorBackgroundFloating = getColor(context, R.attr.colorBackgroundFloating)
-        val panelColorBackground = getColor(context, R.attr.panelColorBackground)
-        val textColorPrimary = getColor(context, R.attr.textColorPrimary)
-        val textColorSecondary = getColor(context, R.attr.textColorSecondary)
-        val textColorTertiary = getColor(context, R.attr.textColorTertiary)
-        val textColorPrimaryInverse = getColor(context, R.attr.textColorPrimaryInverse)
-        val textColorSecondaryInverse = getColor(context, R.attr.textColorSecondaryInverse)
-        val textColorTertiaryInverse = getColor(context, R.attr.textColorTertiaryInverse)
-        val textColorOnAccent = getColor(context, R.attr.textColorOnAccent)
-        val colorForeground = getColor(context, R.attr.colorForeground)
-        val colorForegroundInverse = getColor(context, R.attr.colorForegroundInverse)
-    }
-
     companion object {
-        fun getColor(context: Context, attr: Int): Color {
+        internal fun getColor(context: Context, attr: Int): Color {
             val ta = context.obtainStyledAttributes(intArrayOf(attr))
             @ColorInt val color = ta.getColor(0, 0)
             ta.recycle()
diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/BounceableTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/BounceableTest.kt
new file mode 100644
index 0000000..335e9f8
--- /dev/null
+++ b/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/BounceableTest.kt
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2024 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.compose.animation
+
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.assertHeightIsEqualTo
+import androidx.compose.ui.test.assertPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertWidthIsEqualTo
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.times
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class BounceableTest {
+    @get:Rule val rule = createComposeRule()
+
+    @Test
+    fun bounceable_horizontal() {
+        var bounceables by mutableStateOf(List(4) { bounceable(0.dp) })
+
+        rule.setContent {
+            Row(Modifier.size(100.dp, 50.dp)) {
+                repeat(bounceables.size) { i ->
+                    Box(
+                        Modifier.weight(1f)
+                            .fillMaxHeight()
+                            .bounceable(bounceables, i, orientation = Orientation.Horizontal)
+                    )
+                }
+            }
+        }
+
+        // All bounceables have a width of (100dp / bounceables.size) = 25dp and height of 50dp.
+        repeat(bounceables.size) { i ->
+            rule
+                .onNodeWithTag(bounceableTag(i))
+                .assertWidthIsEqualTo(25.dp)
+                .assertHeightIsEqualTo(50.dp)
+                .assertPositionInRootIsEqualTo(i * 25.dp, 0.dp)
+        }
+
+        // If all bounceables have the same bounce, it's the same as if they didn't have any.
+        bounceables = List(4) { bounceable(10.dp) }
+        repeat(bounceables.size) { i ->
+            rule
+                .onNodeWithTag(bounceableTag(i))
+                .assertWidthIsEqualTo(25.dp)
+                .assertHeightIsEqualTo(50.dp)
+                .assertPositionInRootIsEqualTo(i * 25.dp, 0.dp)
+        }
+
+        // Bounce the first and third one.
+        bounceables =
+            listOf(
+                bounceable(bounce = 5.dp),
+                bounceable(bounce = 0.dp),
+                bounceable(bounce = 10.dp),
+                bounceable(bounce = 0.dp),
+            )
+
+        // First one has a width of 25dp + 5dp, located in (0, 0).
+        rule
+            .onNodeWithTag(bounceableTag(0))
+            .assertWidthIsEqualTo(30.dp)
+            .assertHeightIsEqualTo(50.dp)
+            .assertPositionInRootIsEqualTo(0.dp, 0.dp)
+
+        // Second one has a width of 25dp - 5dp - 10dp, located in (30, 0).
+        rule
+            .onNodeWithTag(bounceableTag(1))
+            .assertWidthIsEqualTo(10.dp)
+            .assertHeightIsEqualTo(50.dp)
+            .assertPositionInRootIsEqualTo(30.dp, 0.dp)
+
+        // Third one has a width of 25 + 2 * 10dp, located in (40, 0).
+        rule
+            .onNodeWithTag(bounceableTag(2))
+            .assertWidthIsEqualTo(45.dp)
+            .assertHeightIsEqualTo(50.dp)
+            .assertPositionInRootIsEqualTo(40.dp, 0.dp)
+
+        // First one has a width of 25dp - 10dp, located in (85, 0).
+        rule
+            .onNodeWithTag(bounceableTag(3))
+            .assertWidthIsEqualTo(15.dp)
+            .assertHeightIsEqualTo(50.dp)
+            .assertPositionInRootIsEqualTo(85.dp, 0.dp)
+    }
+
+    @Test
+    fun bounceable_vertical() {
+        var bounceables by mutableStateOf(List(4) { bounceable(0.dp) })
+
+        rule.setContent {
+            Column(Modifier.size(50.dp, 100.dp)) {
+                repeat(bounceables.size) { i ->
+                    Box(
+                        Modifier.weight(1f)
+                            .fillMaxWidth()
+                            .bounceable(bounceables, i, Orientation.Vertical)
+                    )
+                }
+            }
+        }
+
+        // All bounceables have a height of (100dp / bounceables.size) = 25dp and width of 50dp.
+        repeat(bounceables.size) { i ->
+            rule
+                .onNodeWithTag(bounceableTag(i))
+                .assertWidthIsEqualTo(50.dp)
+                .assertHeightIsEqualTo(25.dp)
+                .assertPositionInRootIsEqualTo(0.dp, i * 25.dp)
+        }
+
+        // If all bounceables have the same bounce, it's the same as if they didn't have any.
+        bounceables = List(4) { bounceable(10.dp) }
+        repeat(bounceables.size) { i ->
+            rule
+                .onNodeWithTag(bounceableTag(i))
+                .assertWidthIsEqualTo(50.dp)
+                .assertHeightIsEqualTo(25.dp)
+                .assertPositionInRootIsEqualTo(0.dp, i * 25.dp)
+        }
+
+        // Bounce the first and third one.
+        bounceables =
+            listOf(
+                bounceable(bounce = 5.dp),
+                bounceable(bounce = 0.dp),
+                bounceable(bounce = 10.dp),
+                bounceable(bounce = 0.dp),
+            )
+
+        // First one has a height of 25dp + 5dp, located in (0, 0).
+        rule
+            .onNodeWithTag(bounceableTag(0))
+            .assertWidthIsEqualTo(50.dp)
+            .assertHeightIsEqualTo(30.dp)
+            .assertPositionInRootIsEqualTo(0.dp, 0.dp)
+
+        // Second one has a height of 25dp - 5dp - 10dp, located in (0, 30).
+        rule
+            .onNodeWithTag(bounceableTag(1))
+            .assertWidthIsEqualTo(50.dp)
+            .assertHeightIsEqualTo(10.dp)
+            .assertPositionInRootIsEqualTo(0.dp, 30.dp)
+
+        // Third one has a height of 25 + 2 * 10dp, located in (0, 40).
+        rule
+            .onNodeWithTag(bounceableTag(2))
+            .assertWidthIsEqualTo(50.dp)
+            .assertHeightIsEqualTo(45.dp)
+            .assertPositionInRootIsEqualTo(0.dp, 40.dp)
+
+        // First one has a height of 25dp - 10dp, located in (0, 85).
+        rule
+            .onNodeWithTag(bounceableTag(3))
+            .assertWidthIsEqualTo(50.dp)
+            .assertHeightIsEqualTo(15.dp)
+            .assertPositionInRootIsEqualTo(0.dp, 85.dp)
+    }
+
+    private fun bounceable(bounce: Dp): Bounceable {
+        return object : Bounceable {
+            override val bounce: Dp = bounce
+        }
+    }
+
+    private fun Modifier.bounceable(
+        bounceables: List<Bounceable>,
+        i: Int,
+        orientation: Orientation,
+    ): Modifier {
+        val previous = if (i > 0) bounceables[i - 1] else null
+        val next = if (i < bounceables.lastIndex) bounceables[i + 1] else null
+        return this.bounceable(bounceables[i], previous, next, orientation)
+            .testTag(bounceableTag(i))
+    }
+
+    private fun bounceableTag(i: Int) = "bounceable$i"
+}
diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/PlatformThemeTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/PlatformThemeTest.kt
new file mode 100644
index 0000000..23538e3
--- /dev/null
+++ b/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/PlatformThemeTest.kt
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2022 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.compose.theme
+
+import androidx.compose.material3.Text
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithText
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import org.junit.Assert.assertThrows
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class PlatformThemeTest {
+    @get:Rule val composeRule = createComposeRule()
+
+    @Test
+    fun testThemeShowsContent() {
+        composeRule.setContent { PlatformTheme { Text("foo") } }
+
+        composeRule.onNodeWithText("foo").assertIsDisplayed()
+    }
+
+    @Test
+    fun testAndroidColorsAreAvailableInsideTheme() {
+        composeRule.setContent {
+            PlatformTheme { Text("foo", color = LocalAndroidColorScheme.current.primaryFixed) }
+        }
+
+        composeRule.onNodeWithText("foo").assertIsDisplayed()
+    }
+
+    @Test
+    fun testAccessingAndroidColorsWithoutThemeThrows() {
+        assertThrows(IllegalStateException::class.java) {
+            composeRule.setContent {
+                Text("foo", color = LocalAndroidColorScheme.current.primaryFixed)
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/SystemUIThemeTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/SystemUIThemeTest.kt
deleted file mode 100644
index fe34017..0000000
--- a/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/SystemUIThemeTest.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2022 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.compose.theme
-
-import androidx.compose.material3.Text
-import androidx.compose.ui.test.assertIsDisplayed
-import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.test.onNodeWithText
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import org.junit.Assert.assertThrows
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@RunWith(AndroidJUnit4::class)
-class SystemUIThemeTest {
-    @get:Rule val composeRule = createComposeRule()
-
-    @Test
-    fun testThemeShowsContent() {
-        composeRule.setContent { PlatformTheme { Text("foo") } }
-
-        composeRule.onNodeWithText("foo").assertIsDisplayed()
-    }
-
-    @Test
-    fun testAndroidColorsAreAvailableInsideTheme() {
-        composeRule.setContent {
-            PlatformTheme {
-                Text("foo", color = LocalAndroidColorScheme.current.deprecated.colorAccent)
-            }
-        }
-
-        composeRule.onNodeWithText("foo").assertIsDisplayed()
-    }
-
-    @Test
-    fun testAccessingAndroidColorsWithoutThemeThrows() {
-        assertThrows(IllegalStateException::class.java) {
-            composeRule.setContent {
-                Text("foo", color = LocalAndroidColorScheme.current.deprecated.colorAccent)
-            }
-        }
-    }
-}
diff --git a/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/DreamSceneModule.kt b/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/DreamSceneModule.kt
new file mode 100644
index 0000000..2f82369
--- /dev/null
+++ b/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/DreamSceneModule.kt
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2024 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.systemui.scene
+
+import com.android.systemui.dream.ui.composable.DreamScene
+import com.android.systemui.scene.ui.composable.Scene
+import dagger.Binds
+import dagger.Module
+import dagger.multibindings.IntoSet
+
+@Module
+interface DreamSceneModule {
+    @Binds @IntoSet fun dreamScene(scene: DreamScene): Scene
+}
diff --git a/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/LockscreenSceneModule.kt b/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/LockscreenSceneModule.kt
index bfeaf92..0f6e6a7 100644
--- a/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/LockscreenSceneModule.kt
+++ b/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/LockscreenSceneModule.kt
@@ -28,6 +28,7 @@
 import com.android.systemui.keyguard.ui.composable.blueprint.ComposableLockscreenSceneBlueprint
 import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel
 import com.android.systemui.scene.ui.composable.Scene
+import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationLockscreenScrimViewModel
 import dagger.Binds
 import dagger.Module
 import dagger.Provides
@@ -35,12 +36,7 @@
 import javax.inject.Provider
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 
-@Module(
-    includes =
-        [
-            LockscreenSceneBlueprintModule::class,
-        ],
-)
+@Module(includes = [LockscreenSceneBlueprintModule::class])
 interface LockscreenSceneModule {
 
     @Binds @IntoSet fun lockscreenScene(scene: LockscreenScene): Scene
@@ -51,9 +47,7 @@
         @Provides
         @SysUISingleton
         @KeyguardRootView
-        fun viewProvider(
-            configurator: Provider<KeyguardViewConfigurator>,
-        ): () -> View {
+        fun viewProvider(configurator: Provider<KeyguardViewConfigurator>): () -> View {
             return { configurator.get().getKeyguardRootView() }
         }
 
@@ -67,10 +61,16 @@
         @Provides
         fun providesLockscreenContent(
             viewModelFactory: LockscreenContentViewModel.Factory,
+            notificationScrimViewModelFactory: NotificationLockscreenScrimViewModel.Factory,
             blueprints: Set<@JvmSuppressWildcards ComposableLockscreenSceneBlueprint>,
             clockInteractor: KeyguardClockInteractor,
         ): LockscreenContent {
-            return LockscreenContent(viewModelFactory, blueprints, clockInteractor)
+            return LockscreenContent(
+                viewModelFactory,
+                notificationScrimViewModelFactory,
+                blueprints,
+                clockInteractor,
+            )
         }
     }
 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt
index d326f00..bf8f6ce 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt
@@ -450,7 +450,7 @@
                             viewModel = viewModel,
                             pinButtonRowVerticalSpacing = 12.dp,
                             centerPatternDotsVertically = true,
-                            modifier = Modifier.align(Alignment.BottomCenter).testTag("InputArea"),
+                            modifier = Modifier.align(Alignment.BottomCenter),
                         )
                     }
 
@@ -904,12 +904,9 @@
         DropdownMenu(
             expanded = isExpanded,
             onDismissRequest = onDismissed,
-            offset =
-                DpOffset(
-                    x = 0.dp,
-                    y = -UserSwitcherDropdownHeight,
-                ),
-            modifier = Modifier.width(UserSwitcherDropdownWidth),
+            offset = DpOffset(x = 0.dp, y = -UserSwitcherDropdownHeight),
+            modifier =
+                Modifier.width(UserSwitcherDropdownWidth).sysuiResTag("user_switcher_dropdown"),
         ) {
             items.forEach { userSwitcherDropdownItem ->
                 DropdownMenuItem(
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt
index 557257d..571b366 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt
@@ -162,7 +162,6 @@
             initialScene = currentSceneKey,
             canChangeScene = { _ -> viewModel.canChangeScene() },
             transitions = sceneTransitions,
-            enableInterruptions = false,
         )
     }
 
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
index f4d1242..7fb4c53 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
@@ -148,6 +148,7 @@
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
@@ -165,6 +166,7 @@
 import com.android.internal.R.dimen.system_app_widget_background_radius
 import com.android.systemui.Flags
 import com.android.systemui.Flags.communalTimerFlickerFix
+import com.android.systemui.Flags.communalWidgetResizing
 import com.android.systemui.communal.domain.model.CommunalContentModel
 import com.android.systemui.communal.shared.model.CommunalContentSize
 import com.android.systemui.communal.shared.model.CommunalScenes
@@ -176,6 +178,7 @@
 import com.android.systemui.communal.ui.viewmodel.BaseCommunalViewModel
 import com.android.systemui.communal.ui.viewmodel.CommunalEditModeViewModel
 import com.android.systemui.communal.ui.viewmodel.CommunalViewModel
+import com.android.systemui.communal.ui.viewmodel.ResizeInfo
 import com.android.systemui.communal.util.DensityUtils.Companion.adjustedDp
 import com.android.systemui.communal.widgets.SmartspaceAppWidgetHostView
 import com.android.systemui.communal.widgets.WidgetConfigurator
@@ -274,7 +277,7 @@
                                     if (layoutDirection == LayoutDirection.Rtl)
                                         screenWidth - offset.x
                                     else offset.x,
-                                    offset.y
+                                    offset.y,
                                 ) - contentOffset
                             val index = firstIndexAtOffset(gridState, adjustedOffset)
                             val key =
@@ -310,6 +313,9 @@
                                         it.changedToUp() || it.changedToUpIgnoreConsumed()
                                     }
                                 )
+
+                                // Reset state once touch ends.
+                                viewModel.onResetTouchState()
                             }
                         }
                     }
@@ -330,7 +336,7 @@
                                         if (layoutDirection == LayoutDirection.Rtl)
                                             screenWidth - offset.x
                                         else offset.x,
-                                        offset.y
+                                        offset.y,
                                     ) - it.positionInWindow() - contentOffset
                                 }
                             val index = adjustedOffset?.let { firstIndexAtOffset(gridState, it) }
@@ -344,14 +350,11 @@
                             }
                         }
                     }
-                },
+                }
     ) {
         AccessibilityContainer(viewModel) {
             if (!viewModel.isEditMode && isEmptyState) {
-                EmptyStateCta(
-                    contentPadding = contentPadding,
-                    viewModel = viewModel,
-                )
+                EmptyStateCta(contentPadding = contentPadding, viewModel = viewModel)
             } else {
                 val slideOffsetInPx =
                     with(LocalDensity.current) { Dimensions.SlideOffsetY.toPx().toInt() }
@@ -364,7 +367,7 @@
                         ) +
                             slideInVertically(
                                 animationSpec = tween(durationMillis = 1000, easing = Emphasized),
-                                initialOffsetY = { -slideOffsetInPx }
+                                initialOffsetY = { -slideOffsetInPx },
                             ),
                     exit =
                         fadeOut(
@@ -372,7 +375,7 @@
                         ) +
                             slideOutVertically(
                                 animationSpec = tween(durationMillis = 1000, easing = Emphasized),
-                                targetOffsetY = { -slideOffsetInPx }
+                                targetOffsetY = { -slideOffsetInPx },
                             ),
                     modifier = Modifier.fillMaxSize(),
                 ) {
@@ -389,7 +392,7 @@
                                     removeEnabled = removeButtonEnabled,
                                     offset =
                                         gridCoordinates?.let { it.positionInWindow() + offset },
-                                    containerToCheck = removeButtonCoordinates
+                                    containerToCheck = removeButtonCoordinates,
                                 )
                             },
                             gridState = gridState,
@@ -410,7 +413,7 @@
                 enter =
                     fadeIn(animationSpec = tween(durationMillis = 250, easing = LinearEasing)) +
                         slideInVertically(
-                            animationSpec = tween(durationMillis = 1000, easing = Emphasized),
+                            animationSpec = tween(durationMillis = 1000, easing = Emphasized)
                         ),
                 exit =
                     fadeOut(animationSpec = tween(durationMillis = 167, easing = LinearEasing)) +
@@ -434,7 +437,7 @@
                             viewModel.setSelectedKey(null)
                         }
                     },
-                    removeEnabled = removeButtonEnabled
+                    removeEnabled = removeButtonEnabled,
                 )
             }
         }
@@ -451,7 +454,7 @@
                 title = stringResource(id = R.string.dialog_title_to_allow_any_widget),
                 positiveButtonText = stringResource(id = R.string.button_text_to_open_settings),
                 onConfirm = viewModel::onEnableWidgetDialogConfirm,
-                onCancel = viewModel::onEnableWidgetDialogCancel
+                onCancel = viewModel::onEnableWidgetDialogCancel,
             )
 
             EnableWidgetDialog(
@@ -460,7 +463,7 @@
                 title = stringResource(id = R.string.work_mode_off_title),
                 positiveButtonText = stringResource(id = R.string.work_mode_turn_on),
                 onConfirm = viewModel::onEnableWorkProfileDialogConfirm,
-                onCancel = viewModel::onEnableWorkProfileDialogCancel
+                onCancel = viewModel::onEnableWorkProfileDialogCancel,
             )
         }
 
@@ -509,7 +512,7 @@
             imageVector = Icons.Outlined.Widgets,
             contentDescription = null,
             tint = colors.primary,
-            modifier = Modifier.size(32.dp)
+            modifier = Modifier.size(32.dp),
         )
         Spacer(modifier = Modifier.height(16.dp))
         Text(
@@ -527,7 +530,7 @@
                 Modifier.padding(horizontal = 26.dp, vertical = 16.dp)
                     .widthIn(min = 200.dp)
                     .heightIn(min = 56.dp),
-            onClick = { onButtonClicked() }
+            onClick = { onButtonClicked() },
         ) {
             Text(
                 stringResource(R.string.communal_widgets_disclaimer_button),
@@ -540,7 +543,7 @@
 @Composable
 private fun ObserveScrollEffect(
     gridState: LazyGridState,
-    communalViewModel: BaseCommunalViewModel
+    communalViewModel: BaseCommunalViewModel,
 ) {
 
     LaunchedEffect(gridState) {
@@ -639,6 +642,38 @@
     }
 }
 
+@Composable
+private fun ResizableItemFrameWrapper(
+    key: String,
+    gridState: LazyGridState,
+    minItemSpan: Int,
+    gridContentPadding: PaddingValues,
+    verticalArrangement: Arrangement.Vertical,
+    enabled: Boolean,
+    modifier: Modifier = Modifier,
+    alpha: () -> Float = { 1f },
+    onResize: (info: ResizeInfo) -> Unit = {},
+    content: @Composable (modifier: Modifier) -> Unit,
+) {
+    if (!communalWidgetResizing()) {
+        content(modifier)
+    } else {
+        ResizableItemFrame(
+            key = key,
+            gridState = gridState,
+            minItemSpan = minItemSpan,
+            gridContentPadding = gridContentPadding,
+            verticalArrangement = verticalArrangement,
+            enabled = enabled,
+            alpha = alpha,
+            modifier = modifier,
+            onResize = onResize,
+        ) {
+            content(Modifier)
+        }
+    }
+}
+
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
 private fun BoxScope.CommunalHubLazyGrid(
@@ -667,7 +702,7 @@
             rememberGridDragDropState(
                 gridState = gridState,
                 contentListState = contentListState,
-                updateDragPositionForRemove = updateDragPositionForRemove
+                updateDragPositionForRemove = updateDragPositionForRemove,
             )
         gridModifier =
             gridModifier
@@ -677,7 +712,7 @@
                     LocalLayoutDirection.current,
                     screenWidth,
                     contentOffset,
-                    viewModel
+                    viewModel,
                 )
         // for widgets dropped from other activities
         val dragAndDropTargetState =
@@ -695,13 +730,14 @@
         gridModifier = gridModifier.height(hubDimensions.GridHeight)
     }
 
+    val itemArrangement = Arrangement.spacedBy(Dimensions.ItemSpacing)
     LazyHorizontalGrid(
         modifier = gridModifier,
         state = gridState,
         rows = GridCells.Fixed(CommunalContentSize.FULL.span),
         contentPadding = contentPadding,
-        horizontalArrangement = Arrangement.spacedBy(Dimensions.ItemSpacing),
-        verticalArrangement = Arrangement.spacedBy(Dimensions.ItemSpacing),
+        horizontalArrangement = itemArrangement,
+        verticalArrangement = itemArrangement,
     ) {
         itemsIndexed(
             items = list,
@@ -709,40 +745,55 @@
             contentType = { _, item -> item.key },
             span = { _, item -> GridItemSpan(item.size.span) },
         ) { index, item ->
-            val size =
-                SizeF(
-                    Dimensions.CardWidth.value,
-                    item.size.dp().value,
-                )
-            val cardModifier = Modifier.requiredSize(width = size.width.dp, height = size.height.dp)
+            val size = SizeF(Dimensions.CardWidth.value, item.size.dp().value)
+            val selected = item.key == selectedKey.value
+            val dpSize = DpSize(size.width.dp, size.height.dp)
+
             if (viewModel.isEditMode && dragDropState != null) {
-                val selected = item.key == selectedKey.value
-                DraggableItem(
+                val outlineAlpha by
+                    animateFloatAsState(
+                        targetValue = if (selected) 1f else 0f,
+                        animationSpec = spring(stiffness = Spring.StiffnessMediumLow),
+                        label = "Widget resizing outline alpha",
+                    )
+                ResizableItemFrameWrapper(
+                    key = item.key,
+                    gridState = gridState,
+                    minItemSpan = CommunalContentSize.HALF.span,
+                    gridContentPadding = contentPadding,
+                    verticalArrangement = itemArrangement,
+                    enabled = selected,
+                    alpha = { outlineAlpha },
                     modifier =
-                        if (dragDropState.draggingItemIndex == index) {
-                            Modifier
-                        } else {
+                        Modifier.requiredSize(dpSize).thenIf(
+                            dragDropState.draggingItemIndex != index
+                        ) {
                             Modifier.animateItem(
                                 placementSpec = spring(stiffness = Spring.StiffnessMediumLow)
                             )
                         },
-                    dragDropState = dragDropState,
-                    selected = selected,
-                    enabled = item.isWidgetContent(),
-                    index = index,
-                ) { isDragging ->
-                    CommunalContent(
-                        modifier = cardModifier,
-                        model = item,
-                        viewModel = viewModel,
-                        size = size,
-                        selected = selected && !isDragging,
-                        widgetConfigurator = widgetConfigurator,
+                    onResize = { resizeInfo -> contentListState.resize(index, resizeInfo) },
+                ) { modifier ->
+                    DraggableItem(
+                        modifier = modifier,
+                        dragDropState = dragDropState,
+                        selected = selected,
+                        enabled = item.isWidgetContent(),
                         index = index,
-                        contentListState = contentListState,
-                        interactionHandler = interactionHandler,
-                        widgetSection = widgetSection,
-                    )
+                    ) { isDragging ->
+                        CommunalContent(
+                            modifier = Modifier.fillMaxSize(),
+                            model = item,
+                            viewModel = viewModel,
+                            size = size,
+                            selected = selected && !isDragging,
+                            widgetConfigurator = widgetConfigurator,
+                            index = index,
+                            contentListState = contentListState,
+                            interactionHandler = interactionHandler,
+                            widgetSection = widgetSection,
+                        )
+                    }
                 }
             } else {
                 CommunalContent(
@@ -750,7 +801,7 @@
                     viewModel = viewModel,
                     size = size,
                     selected = false,
-                    modifier = cardModifier.animateItem(),
+                    modifier = Modifier.requiredSize(dpSize).animateItem(),
                     index = index,
                     contentListState = contentListState,
                     interactionHandler = interactionHandler,
@@ -765,16 +816,13 @@
  * The empty state displays a fullscreen call-to-action (CTA) tile when no widgets are available.
  */
 @Composable
-private fun EmptyStateCta(
-    contentPadding: PaddingValues,
-    viewModel: BaseCommunalViewModel,
-) {
+private fun EmptyStateCta(contentPadding: PaddingValues, viewModel: BaseCommunalViewModel) {
     val colors = LocalAndroidColorScheme.current
     Card(
         modifier = Modifier.height(hubDimensions.GridHeight).padding(contentPadding),
         colors = CardDefaults.cardColors(containerColor = Color.Transparent),
         border = BorderStroke(3.adjustedDp, colors.secondary),
-        shape = RoundedCornerShape(size = 80.adjustedDp)
+        shape = RoundedCornerShape(size = 80.adjustedDp),
     ) {
         Column(
             modifier = Modifier.fillMaxSize().padding(horizontal = 110.adjustedDp),
@@ -788,10 +836,7 @@
                 textAlign = TextAlign.Center,
                 color = colors.secondary,
             )
-            Row(
-                modifier = Modifier.fillMaxWidth(),
-                horizontalArrangement = Arrangement.Center,
-            ) {
+            Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) {
                 Button(
                     modifier = Modifier.height(56.dp),
                     colors =
@@ -799,17 +844,13 @@
                             containerColor = colors.primary,
                             contentColor = colors.onPrimary,
                         ),
-                    onClick = {
-                        viewModel.onOpenWidgetEditor(
-                            shouldOpenWidgetPickerOnStart = true,
-                        )
-                    },
+                    onClick = { viewModel.onOpenWidgetEditor(shouldOpenWidgetPickerOnStart = true) },
                 ) {
                     Icon(
                         imageVector = Icons.Default.Add,
                         contentDescription =
                             stringResource(R.string.label_for_button_in_empty_state_cta),
-                        modifier = Modifier.size(24.dp)
+                        modifier = Modifier.size(24.dp),
                     )
                     Spacer(Modifier.width(ButtonDefaults.IconSpacing))
                     Text(
@@ -835,7 +876,7 @@
     setToolbarSize: (toolbarSize: IntSize) -> Unit,
     setRemoveButtonCoordinates: (coordinates: LayoutCoordinates?) -> Unit,
     onOpenWidgetPicker: () -> Unit,
-    onEditDone: () -> Unit
+    onEditDone: () -> Unit,
 ) {
     if (!removeEnabled) {
         // Clear any existing coordinates when remove is not enabled.
@@ -844,7 +885,7 @@
     val removeButtonAlpha: Float by
         animateFloatAsState(
             targetValue = if (removeEnabled) 1f else 0.5f,
-            label = "RemoveButtonAlphaAnimation"
+            label = "RemoveButtonAlphaAnimation",
         )
 
     Box(
@@ -855,7 +896,7 @@
                     start = Dimensions.ToolbarPaddingHorizontal,
                     end = Dimensions.ToolbarPaddingHorizontal,
                 )
-                .onSizeChanged { setToolbarSize(it) },
+                .onSizeChanged { setToolbarSize(it) }
     ) {
         val addWidgetText = stringResource(R.string.hub_mode_add_widget_button_text)
         ToolbarButton(
@@ -864,16 +905,14 @@
             onClick = onOpenWidgetPicker,
         ) {
             Icon(Icons.Default.Add, null)
-            Text(
-                text = addWidgetText,
-            )
+            Text(text = addWidgetText)
         }
 
         AnimatedVisibility(
             modifier = Modifier.align(Alignment.Center),
             visible = removeEnabled,
             enter = fadeIn(),
-            exit = fadeOut()
+            exit = fadeOut(),
         ) {
             Button(
                 onClick = onRemoveClicked,
@@ -887,20 +926,18 @@
                             if (removeEnabled) {
                                 setRemoveButtonCoordinates(it)
                             }
-                        }
+                        },
             ) {
                 Row(
                     horizontalArrangement =
                         Arrangement.spacedBy(
                             ButtonDefaults.IconSpacing,
-                            Alignment.CenterHorizontally
+                            Alignment.CenterHorizontally,
                         ),
-                    verticalAlignment = Alignment.CenterVertically
+                    verticalAlignment = Alignment.CenterVertically,
                 ) {
                     Icon(Icons.Default.Close, contentDescription = null)
-                    Text(
-                        text = stringResource(R.string.button_to_remove_widget),
-                    )
+                    Text(text = stringResource(R.string.button_to_remove_widget))
                 }
             }
         }
@@ -911,9 +948,7 @@
             onClick = onEditDone,
         ) {
             Icon(Icons.Default.Check, contentDescription = null)
-            Text(
-                text = stringResource(R.string.hub_mode_editing_exit_button_text),
-            )
+            Text(text = stringResource(R.string.hub_mode_editing_exit_button_text))
         }
     }
 }
@@ -926,14 +961,14 @@
     isPrimary: Boolean = true,
     onClick: () -> Unit,
     modifier: Modifier = Modifier,
-    content: @Composable RowScope.() -> Unit
+    content: @Composable RowScope.() -> Unit,
 ) {
     val colors = LocalAndroidColorScheme.current
     AnimatedVisibility(
         visible = isPrimary,
         modifier = modifier,
         enter = fadeIn(),
-        exit = fadeOut()
+        exit = fadeOut(),
     ) {
         Button(
             onClick = onClick,
@@ -943,7 +978,7 @@
             Row(
                 horizontalArrangement =
                     Arrangement.spacedBy(ButtonDefaults.IconSpacing, Alignment.CenterHorizontally),
-                verticalAlignment = Alignment.CenterVertically
+                verticalAlignment = Alignment.CenterVertically,
             ) {
                 content()
             }
@@ -954,21 +989,18 @@
         visible = !isPrimary,
         modifier = modifier,
         enter = fadeIn(),
-        exit = fadeOut()
+        exit = fadeOut(),
     ) {
         OutlinedButton(
             onClick = onClick,
-            colors =
-                ButtonDefaults.outlinedButtonColors(
-                    contentColor = colors.onPrimaryContainer,
-                ),
+            colors = ButtonDefaults.outlinedButtonColors(contentColor = colors.onPrimaryContainer),
             border = BorderStroke(width = 2.0.dp, color = colors.primary),
             contentPadding = Dimensions.ButtonPadding,
         ) {
             Row(
                 horizontalArrangement =
                     Arrangement.spacedBy(ButtonDefaults.IconSpacing, Alignment.CenterHorizontally),
-                verticalAlignment = Alignment.CenterVertically
+                verticalAlignment = Alignment.CenterVertically,
             ) {
                 content()
             }
@@ -1041,7 +1073,7 @@
                     size =
                         Size(width = size.width + padding * 2, height = size.height + padding * 2),
                     cornerRadius = CornerRadius(37.adjustedDp.toPx()),
-                    style = Stroke(width = 3.adjustedDp.toPx())
+                    style = Stroke(width = 3.adjustedDp.toPx()),
                 )
             }
     )
@@ -1061,7 +1093,7 @@
                 containerColor = colors.primary,
                 contentColor = colors.onPrimary,
             ),
-        shape = RoundedCornerShape(68.adjustedDp, 34.adjustedDp, 68.adjustedDp, 34.adjustedDp)
+        shape = RoundedCornerShape(68.adjustedDp, 34.adjustedDp, 68.adjustedDp, 34.adjustedDp),
     ) {
         Column(
             modifier =
@@ -1081,7 +1113,7 @@
                 style = MaterialTheme.typography.titleLarge,
                 fontSize = nonScalableTextSize(22.dp),
                 lineHeight = nonScalableTextSize(28.dp),
-                modifier = Modifier.verticalScroll(rememberScrollState()).weight(1F)
+                modifier = Modifier.verticalScroll(rememberScrollState()).weight(1F),
             )
             Spacer(modifier = Modifier.size(16.adjustedDp))
             Row(
@@ -1093,15 +1125,12 @@
                     LocalDensity provides
                         Density(
                             LocalDensity.current.density,
-                            LocalDensity.current.fontScale.coerceIn(0f, 1.25f)
+                            LocalDensity.current.fontScale.coerceIn(0f, 1.25f),
                         )
                 ) {
                     OutlinedButton(
                         modifier = Modifier.fillMaxHeight().weight(1F),
-                        colors =
-                            ButtonDefaults.buttonColors(
-                                contentColor = colors.onPrimary,
-                            ),
+                        colors = ButtonDefaults.buttonColors(contentColor = colors.onPrimary),
                         border = BorderStroke(width = 1.0.dp, color = colors.primaryContainer),
                         onClick = viewModel::onDismissCtaTile,
                         contentPadding = PaddingValues(0.dp, 0.dp, 0.dp, 0.dp),
@@ -1259,7 +1288,7 @@
                 visible = selected,
                 model = model,
                 widgetConfigurator = widgetConfigurator,
-                modifier = Modifier.align(Alignment.BottomEnd)
+                modifier = Modifier.align(Alignment.BottomEnd),
             )
         }
     }
@@ -1289,14 +1318,14 @@
                     containerColor = colors.primary,
                     contentColor = colors.onPrimary,
                     disabledContainerColor = Color.Transparent,
-                    disabledContentColor = Color.Transparent
+                    disabledContentColor = Color.Transparent,
                 ),
             onClick = { scope.launch { widgetConfigurator.configureWidget(model.appWidgetId) } },
         ) {
             Icon(
                 imageVector = Icons.Outlined.Edit,
                 contentDescription = stringResource(id = R.string.edit_widget),
-                modifier = Modifier.padding(12.adjustedDp)
+                modifier = Modifier.padding(12.adjustedDp),
             )
         }
     }
@@ -1323,13 +1352,13 @@
                 .background(
                     color = MaterialTheme.colorScheme.surfaceVariant,
                     shape =
-                        RoundedCornerShape(dimensionResource(system_app_widget_background_radius))
+                        RoundedCornerShape(dimensionResource(system_app_widget_background_radius)),
                 )
                 .clickable(
                     enabled = !viewModel.isEditMode,
                     interactionSource = null,
                     indication = null,
-                    onClick = viewModel::onOpenEnableWidgetDialog
+                    onClick = viewModel::onOpenEnableWidgetDialog,
                 ),
         verticalArrangement = Arrangement.Center,
         horizontalAlignment = Alignment.CenterHorizontally,
@@ -1360,7 +1389,7 @@
         modifier =
             modifier.background(
                 color = MaterialTheme.colorScheme.surfaceVariant,
-                shape = RoundedCornerShape(dimensionResource(system_app_widget_background_radius))
+                shape = RoundedCornerShape(dimensionResource(system_app_widget_background_radius)),
             ),
         verticalArrangement = Arrangement.Center,
         horizontalAlignment = Alignment.CenterHorizontally,
@@ -1418,7 +1447,7 @@
                             MotionEvent.ACTION_MOVE,
                             change.position.x,
                             change.position.y,
-                            0
+                            0,
                         )
                     viewModel.mediaHost.hostView.dispatchTouchEvent(event)
                     event.recycle()
@@ -1429,12 +1458,12 @@
                 layoutParams =
                     FrameLayout.LayoutParams(
                         FrameLayout.LayoutParams.MATCH_PARENT,
-                        FrameLayout.LayoutParams.MATCH_PARENT
+                        FrameLayout.LayoutParams.MATCH_PARENT,
                     )
             }
             viewModel.mediaHost.hostView
         },
-        onReset = {}
+        onReset = {},
     )
 }
 
@@ -1462,7 +1491,7 @@
                             ) {
                                 viewModel.changeScene(
                                     CommunalScenes.Blank,
-                                    "closed by accessibility"
+                                    "closed by accessibility",
                                 )
                                 true
                             },
@@ -1471,7 +1500,7 @@
                             ) {
                                 viewModel.onOpenWidgetEditor()
                                 true
-                            }
+                            },
                         )
                 }
             }
@@ -1514,7 +1543,7 @@
         start = Dimensions.ToolbarPaddingHorizontal,
         end = Dimensions.ToolbarPaddingHorizontal,
         top = verticalPadding + toolbarHeight,
-        bottom = verticalPadding
+        bottom = verticalPadding,
     )
 }
 
@@ -1523,7 +1552,7 @@
     return with(LocalDensity.current) {
         ContentPaddingInPx(
             start = paddingValues.calculateStartPadding(LocalLayoutDirection.current).toPx(),
-            top = paddingValues.calculateTopPadding().toPx()
+            top = paddingValues.calculateTopPadding().toPx(),
         )
     }
 }
@@ -1536,7 +1565,7 @@
 fun isPointerWithinEnabledRemoveButton(
     removeEnabled: Boolean,
     offset: Offset?,
-    containerToCheck: LayoutCoordinates?
+    containerToCheck: LayoutCoordinates?,
 ): Boolean {
     if (!removeEnabled || offset == null || containerToCheck == null) {
         return false
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalScene.kt
index e41a7df..a88ad94 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalScene.kt
@@ -21,11 +21,10 @@
 import androidx.compose.ui.Modifier
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.compose.animation.scene.SceneScope
-import com.android.compose.animation.scene.Swipe
-import com.android.compose.animation.scene.SwipeDirection
 import com.android.compose.animation.scene.UserAction
 import com.android.compose.animation.scene.UserActionResult
 import com.android.systemui.communal.shared.model.CommunalBackgroundType
+import com.android.systemui.communal.ui.viewmodel.CommunalUserActionsViewModel
 import com.android.systemui.communal.ui.viewmodel.CommunalViewModel
 import com.android.systemui.communal.util.CommunalColors
 import com.android.systemui.dagger.SysUISingleton
@@ -33,38 +32,32 @@
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.scene.ui.composable.Scene
 import javax.inject.Inject
-import kotlinx.coroutines.awaitCancellation
 import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.asStateFlow
 
 /** The communal scene shows glanceable hub when the device is locked and docked. */
 @SysUISingleton
 class CommunalScene
 @Inject
 constructor(
-    private val viewModel: CommunalViewModel,
+    private val contentViewModel: CommunalViewModel,
+    actionsViewModelFactory: CommunalUserActionsViewModel.Factory,
     private val communalColors: CommunalColors,
     private val communalContent: CommunalContent,
 ) : ExclusiveActivatable(), Scene {
     override val key = Scenes.Communal
 
-    override val userActions: Flow<Map<UserAction, UserActionResult>> =
-        MutableStateFlow(
-                mapOf(
-                    Swipe(SwipeDirection.End) to Scenes.Lockscreen,
-                )
-            )
-            .asStateFlow()
+    private val actionsViewModel: CommunalUserActionsViewModel = actionsViewModelFactory.create()
+
+    override val userActions: Flow<Map<UserAction, UserActionResult>> = actionsViewModel.actions
 
     override suspend fun onActivated(): Nothing {
-        awaitCancellation()
+        actionsViewModel.activate()
     }
 
     @Composable
     override fun SceneScope.Content(modifier: Modifier) {
         val backgroundType by
-            viewModel.communalBackground.collectAsStateWithLifecycle(
+            contentViewModel.communalBackground.collectAsStateWithLifecycle(
                 initialValue = CommunalBackgroundType.ANIMATED
             )
 
@@ -72,7 +65,7 @@
             backgroundType = backgroundType,
             colors = communalColors,
             content = communalContent,
-            viewModel = viewModel,
+            viewModel = contentViewModel,
             modifier = modifier.horizontalNestedScrollToScene(),
         )
     }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ContentListState.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ContentListState.kt
index 1137357..6e30575 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ContentListState.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ContentListState.kt
@@ -21,8 +21,12 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.toMutableStateList
+import com.android.systemui.Flags.communalWidgetResizing
 import com.android.systemui.communal.domain.model.CommunalContentModel
+import com.android.systemui.communal.shared.model.CommunalContentSize
 import com.android.systemui.communal.ui.viewmodel.BaseCommunalViewModel
+import com.android.systemui.communal.ui.viewmodel.DragHandle
+import com.android.systemui.communal.ui.viewmodel.ResizeInfo
 import com.android.systemui.communal.widgets.WidgetConfigurator
 
 @Composable
@@ -35,15 +39,11 @@
         ContentListState(
             communalContent,
             { componentName, user, rank ->
-                viewModel.onAddWidget(
-                    componentName,
-                    user,
-                    rank,
-                    widgetConfigurator,
-                )
+                viewModel.onAddWidget(componentName, user, rank, widgetConfigurator)
             },
             viewModel::onDeleteWidget,
             viewModel::onReorderWidgets,
+            viewModel::onResizeWidget,
         )
     }
 }
@@ -59,6 +59,7 @@
     private val onAddWidget: (componentName: ComponentName, user: UserHandle, rank: Int) -> Unit,
     private val onDeleteWidget: (id: Int, componentName: ComponentName, rank: Int) -> Unit,
     private val onReorderWidgets: (widgetIdToRankMap: Map<Int, Int>) -> Unit,
+    private val onResizeWidget: (id: Int, spanY: Int, widgetIdToRankMap: Map<Int, Int>) -> Unit,
 ) {
     var list = communalContent.toMutableStateList()
         private set
@@ -77,6 +78,36 @@
         }
     }
 
+    /** Resize a widget, possibly re-ordering widgets if needed. */
+    fun resize(index: Int, resizeInfo: ResizeInfo) {
+        val item = list[index]
+        val currentSpan = item.size.span
+        val newSpan = currentSpan + resizeInfo.spans
+        // Only widgets can be resized
+        if (
+            !communalWidgetResizing() ||
+                currentSpan == newSpan ||
+                item !is CommunalContentModel.WidgetContent.Widget
+        ) {
+            return
+        }
+        list[index] = item.copy(size = CommunalContentSize.toSize(newSpan))
+        val prevItem = list.getOrNull(index - 1)
+        // Check if we have to update indices of items to accommodate the resize.
+        val widgetIdToRankMap: Map<Int, Int> =
+            if (
+                resizeInfo.isExpanding &&
+                    resizeInfo.fromHandle == DragHandle.TOP &&
+                    prevItem is CommunalContentModel.WidgetContent.Widget
+            ) {
+                onMove(index - 1, index)
+                mapOf(prevItem.appWidgetId to index, item.appWidgetId to index - 1)
+            } else {
+                emptyMap()
+            }
+        onResizeWidget(item.appWidgetId, newSpan, widgetIdToRankMap)
+    }
+
     /**
      * Persists the new order with all the movements happened during drag operations & the new
      * widget drop (if applicable).
@@ -91,7 +122,7 @@
     fun onSaveList(
         newItemComponentName: ComponentName? = null,
         newItemUser: UserHandle? = null,
-        newItemIndex: Int? = null
+        newItemIndex: Int? = null,
     ) {
         // New widget added to the grid. Other widgets are shifted as needed at the database level.
         if (newItemComponentName != null && newItemUser != null && newItemIndex != null) {
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/GridDragDropState.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/GridDragDropState.kt
index 20ee131..101385f 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/GridDragDropState.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/GridDragDropState.kt
@@ -42,6 +42,7 @@
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.toOffset
 import androidx.compose.ui.unit.toSize
+import com.android.systemui.Flags.communalWidgetResizing
 import com.android.systemui.communal.ui.compose.extensions.firstItemAtOffset
 import com.android.systemui.communal.ui.compose.extensions.plus
 import com.android.systemui.communal.ui.viewmodel.BaseCommunalViewModel
@@ -65,7 +66,7 @@
                 state = gridState,
                 contentListState = contentListState,
                 scope = scope,
-                updateDragPositionForRemove = updateDragPositionForRemove
+                updateDragPositionForRemove = updateDragPositionForRemove,
             )
         }
     LaunchedEffect(state) {
@@ -90,7 +91,7 @@
     private val state: LazyGridState,
     private val contentListState: ContentListState,
     private val scope: CoroutineScope,
-    private val updateDragPositionForRemove: (offset: Offset) -> Boolean
+    private val updateDragPositionForRemove: (offset: Offset) -> Boolean,
 ) {
     var draggingItemIndex by mutableStateOf<Int?>(null)
         private set
@@ -122,12 +123,12 @@
         offset: Offset,
         screenWidth: Int,
         layoutDirection: LayoutDirection,
-        contentOffset: Offset
+        contentOffset: Offset,
     ): Boolean {
         val normalizedOffset =
             Offset(
                 if (layoutDirection == LayoutDirection.Ltr) offset.x else screenWidth - offset.x,
-                offset.y
+                offset.y,
             )
         state.layoutInfo.visibleItemsInfo
             .filter { item -> contentListState.isItemEditable(item.index) }
@@ -248,7 +249,7 @@
                             offset,
                             screenWidth,
                             layoutDirection,
-                            contentOffset
+                            contentOffset,
                         )
                     ) {
                         viewModel.onReorderWidgetStart()
@@ -261,7 +262,7 @@
                 onDragCancel = {
                     dragDropState.onDragInterrupted()
                     viewModel.onReorderWidgetCancel()
-                }
+                },
             )
         }
     )
@@ -276,7 +277,7 @@
     enabled: Boolean,
     selected: Boolean,
     modifier: Modifier = Modifier,
-    content: @Composable (isDragging: Boolean) -> Unit
+    content: @Composable (isDragging: Boolean) -> Unit,
 ) {
     if (!enabled) {
         return content(false)
@@ -286,7 +287,7 @@
     val itemAlpha: Float by
         animateFloatAsState(
             targetValue = if (dragDropState.isDraggingToRemove) 0.5f else 1f,
-            label = "DraggableItemAlpha"
+            label = "DraggableItemAlpha",
         )
     val direction = LocalLayoutDirection.current
     val draggingModifier =
@@ -303,12 +304,17 @@
 
     // Animate the highlight alpha manually as alpha modifier (and AnimatedVisibility) clips the
     // widget to bounds, which cuts off the highlight as we are drawing outside the widget bounds.
+    val highlightSelected = !communalWidgetResizing() && selected
     val alpha by
         animateFloatAsState(
             targetValue =
-                if ((dragging || selected) && !dragDropState.isDraggingToRemove) 1f else 0f,
+                if ((dragging || highlightSelected) && !dragDropState.isDraggingToRemove) {
+                    1f
+                } else {
+                    0f
+                },
             animationSpec = spring(stiffness = Spring.StiffnessMediumLow),
-            label = "Widget outline alpha"
+            label = "Widget outline alpha",
         )
 
     Box(modifier) {
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResizeableItemFrame.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResizeableItemFrame.kt
new file mode 100644
index 0000000..ef62eb7
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResizeableItemFrame.kt
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2024 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.systemui.communal.ui.compose
+
+import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.gestures.AnchoredDraggableState
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.anchoredDraggable
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.BoxScope
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.lazy.grid.LazyGridState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.runtime.snapshotFlow
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.CornerRadius
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.Brush
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.drawscope.Stroke
+import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastIsFinite
+import com.android.compose.theme.LocalAndroidColorScheme
+import com.android.systemui.communal.ui.viewmodel.DragHandle
+import com.android.systemui.communal.ui.viewmodel.ResizeInfo
+import com.android.systemui.communal.ui.viewmodel.ResizeableItemFrameViewModel
+import com.android.systemui.lifecycle.rememberViewModel
+import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.flow.combine
+
+@Composable
+private fun UpdateGridLayoutInfo(
+    viewModel: ResizeableItemFrameViewModel,
+    key: String,
+    gridState: LazyGridState,
+    minItemSpan: Int,
+    gridContentPadding: PaddingValues,
+    verticalArrangement: Arrangement.Vertical,
+) {
+    val density = LocalDensity.current
+    LaunchedEffect(
+        density,
+        viewModel,
+        key,
+        gridState,
+        minItemSpan,
+        gridContentPadding,
+        verticalArrangement,
+    ) {
+        val verticalItemSpacingPx = with(density) { verticalArrangement.spacing.toPx() }
+        val verticalContentPaddingPx =
+            with(density) {
+                (gridContentPadding.calculateTopPadding() +
+                        gridContentPadding.calculateBottomPadding())
+                    .toPx()
+            }
+
+        combine(
+                snapshotFlow { gridState.layoutInfo.maxSpan },
+                snapshotFlow { gridState.layoutInfo.viewportSize.height },
+                snapshotFlow {
+                    gridState.layoutInfo.visibleItemsInfo.firstOrNull { it.key == key }
+                },
+                ::Triple,
+            )
+            .collectLatest { (maxItemSpan, viewportHeightPx, itemInfo) ->
+                viewModel.setGridLayoutInfo(
+                    verticalItemSpacingPx,
+                    verticalContentPaddingPx,
+                    viewportHeightPx,
+                    maxItemSpan,
+                    minItemSpan,
+                    itemInfo?.row,
+                    itemInfo?.span,
+                )
+            }
+    }
+}
+
+@Composable
+private fun BoxScope.DragHandle(
+    handle: DragHandle,
+    dragState: AnchoredDraggableState<Int>,
+    outlinePadding: Dp,
+    brush: Brush,
+    alpha: () -> Float,
+    modifier: Modifier = Modifier,
+) {
+    val directionalModifier = if (handle == DragHandle.TOP) -1 else 1
+    val alignment = if (handle == DragHandle.TOP) Alignment.TopCenter else Alignment.BottomCenter
+    Box(
+        modifier
+            .align(alignment)
+            .graphicsLayer {
+                translationY =
+                    directionalModifier * (size.height / 2 + outlinePadding.toPx()) +
+                        (dragState.offset.takeIf { it.fastIsFinite() } ?: 0f)
+            }
+            .anchoredDraggable(dragState, Orientation.Vertical)
+    ) {
+        Canvas(modifier = Modifier.fillMaxSize()) {
+            if (dragState.anchors.size > 1) {
+                drawCircle(
+                    brush = brush,
+                    radius = outlinePadding.toPx(),
+                    center = Offset(size.width / 2, size.height / 2),
+                    alpha = alpha(),
+                )
+            }
+        }
+    }
+}
+
+/**
+ * Draws a frame around the content with drag handles on the top and bottom of the content.
+ *
+ * @param index The index of this item in the [LazyGridState].
+ * @param gridState The [LazyGridState] for the grid containing this item.
+ * @param minItemSpan The minimum span that an item may occupy. Items are resized in multiples of
+ *   this span.
+ * @param gridContentPadding The content padding used for the grid, needed for determining offsets.
+ * @param verticalArrangement The vertical arrangement of the grid items.
+ * @param modifier Optional modifier to apply to the frame.
+ * @param enabled Whether resizing is enabled.
+ * @param outlinePadding The padding to apply around the entire frame, in [Dp]
+ * @param outlineColor Optional color to make the outline around the content.
+ * @param cornerRadius Optional radius to give to the outline around the content.
+ * @param strokeWidth Optional stroke width to draw the outline with.
+ * @param alpha Optional function to provide an alpha value for the outline. Can be used to fade the
+ *   outline in and out. This is wrapped in a function for performance, as the value is only
+ *   accessed during the draw phase.
+ * @param onResize Optional callback which gets executed when the item is resized to a new span.
+ * @param content The content to draw inside the frame.
+ */
+@Composable
+fun ResizableItemFrame(
+    key: String,
+    gridState: LazyGridState,
+    minItemSpan: Int,
+    gridContentPadding: PaddingValues,
+    verticalArrangement: Arrangement.Vertical,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    outlinePadding: Dp = 8.dp,
+    outlineColor: Color = LocalAndroidColorScheme.current.primary,
+    cornerRadius: Dp = 37.dp,
+    strokeWidth: Dp = 3.dp,
+    alpha: () -> Float = { 1f },
+    onResize: (info: ResizeInfo) -> Unit = {},
+    content: @Composable () -> Unit,
+) {
+    val brush = SolidColor(outlineColor)
+    val onResizeUpdated by rememberUpdatedState(onResize)
+    val viewModel =
+        rememberViewModel(traceName = "ResizeableItemFrame.viewModel") {
+            ResizeableItemFrameViewModel()
+        }
+
+    val dragHandleHeight = verticalArrangement.spacing - outlinePadding * 2
+
+    // Draw content surrounded by drag handles at top and bottom. Allow drag handles
+    // to overlap content.
+    Box(modifier) {
+        content()
+
+        if (enabled) {
+            DragHandle(
+                handle = DragHandle.TOP,
+                dragState = viewModel.topDragState,
+                outlinePadding = outlinePadding,
+                brush = brush,
+                alpha = alpha,
+                modifier = Modifier.fillMaxWidth().height(dragHandleHeight),
+            )
+
+            DragHandle(
+                handle = DragHandle.BOTTOM,
+                dragState = viewModel.bottomDragState,
+                outlinePadding = outlinePadding,
+                brush = brush,
+                alpha = alpha,
+                modifier = Modifier.fillMaxWidth().height(dragHandleHeight),
+            )
+
+            // Draw outline around the element.
+            Canvas(modifier = Modifier.matchParentSize()) {
+                val paddingPx = outlinePadding.toPx()
+                val topOffset = viewModel.topDragState.offset.takeIf { it.fastIsFinite() } ?: 0f
+                val bottomOffset =
+                    viewModel.bottomDragState.offset.takeIf { it.fastIsFinite() } ?: 0f
+                drawRoundRect(
+                    brush,
+                    alpha = alpha(),
+                    topLeft = Offset(-paddingPx, topOffset + -paddingPx),
+                    size =
+                        Size(
+                            width = size.width + paddingPx * 2,
+                            height = -topOffset + bottomOffset + size.height + paddingPx * 2,
+                        ),
+                    cornerRadius = CornerRadius(cornerRadius.toPx()),
+                    style = Stroke(width = strokeWidth.toPx()),
+                )
+            }
+
+            UpdateGridLayoutInfo(
+                viewModel,
+                key,
+                gridState,
+                minItemSpan,
+                gridContentPadding,
+                verticalArrangement,
+            )
+            LaunchedEffect(viewModel) {
+                viewModel.resizeInfo.collectLatest { info -> onResizeUpdated(info) }
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/dialog/ui/composable/AlertDialogContent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/dialog/ui/composable/AlertDialogContent.kt
index 0b96694..69ca0a5 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/dialog/ui/composable/AlertDialogContent.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/dialog/ui/composable/AlertDialogContent.kt
@@ -38,7 +38,6 @@
 import androidx.compose.ui.layout.layoutId
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.dp
-import com.android.compose.theme.LocalAndroidColorScheme
 import kotlin.math.roundToInt
 
 /**
@@ -69,7 +68,7 @@
                 Modifier.defaultMinSize(minWidth = defaultSize, minHeight = defaultSize),
                 propagateMinConstraints = true,
             ) {
-                val iconColor = LocalAndroidColorScheme.current.primary
+                val iconColor = MaterialTheme.colorScheme.primary
                 CompositionLocalProvider(LocalContentColor provides iconColor) { icon() }
             }
 
@@ -77,7 +76,7 @@
         }
 
         // Title.
-        val titleColor = LocalAndroidColorScheme.current.onSurface
+        val titleColor = MaterialTheme.colorScheme.onSurface
         CompositionLocalProvider(LocalContentColor provides titleColor) {
             ProvideTextStyle(
                 MaterialTheme.typography.headlineSmall.copy(textAlign = TextAlign.Center)
@@ -88,7 +87,7 @@
         Spacer(Modifier.height(16.dp))
 
         // Content.
-        val contentColor = LocalAndroidColorScheme.current.onSurfaceVariant
+        val contentColor = MaterialTheme.colorScheme.onSurfaceVariant
         Box {
             CompositionLocalProvider(LocalContentColor provides contentColor) {
                 ProvideTextStyle(
@@ -169,7 +168,7 @@
                                 negative.width -
                                 positive.width -
                                 horizontalSpacing.roundToInt(),
-                            0
+                            0,
                         )
                     }
                 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/dream/ui/composable/DreamScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/dream/ui/composable/DreamScene.kt
new file mode 100644
index 0000000..f4374c6
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/dream/ui/composable/DreamScene.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2024 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.systemui.dream.ui.composable
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import com.android.compose.animation.scene.SceneScope
+import com.android.compose.animation.scene.UserAction
+import com.android.compose.animation.scene.UserActionResult
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dreams.ui.viewmodel.DreamUserActionsViewModel
+import com.android.systemui.lifecycle.ExclusiveActivatable
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.scene.ui.composable.Scene
+import javax.inject.Inject
+import kotlinx.coroutines.flow.Flow
+
+/** The dream scene shows when a dream activity is showing. */
+@SysUISingleton
+class DreamScene
+@Inject
+constructor(private val actionsViewModelFactory: DreamUserActionsViewModel.Factory) :
+    ExclusiveActivatable(), Scene {
+    override val key = Scenes.Dream
+
+    private val actionsViewModel: DreamUserActionsViewModel by lazy {
+        actionsViewModelFactory.create()
+    }
+
+    override val userActions: Flow<Map<UserAction, UserActionResult>> = actionsViewModel.actions
+
+    override suspend fun onActivated(): Nothing {
+        actionsViewModel.activate()
+    }
+
+    @Composable
+    override fun SceneScope.Content(modifier: Modifier) {
+        Box(modifier = modifier.fillMaxSize()) {
+            // Render a sleep emoji to make the scene appear visible.
+            Text(
+                modifier = Modifier.padding(16.dp).align(Alignment.BottomStart),
+                text = "\uD83D\uDCA4",
+            )
+        }
+    }
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenContent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenContent.kt
index dbe7538..5c5514a 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenContent.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenContent.kt
@@ -30,6 +30,8 @@
 import com.android.systemui.keyguard.ui.composable.blueprint.ComposableLockscreenSceneBlueprint
 import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel
 import com.android.systemui.lifecycle.rememberViewModel
+import com.android.systemui.notifications.ui.composable.NotificationLockscreenScrim
+import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationLockscreenScrimViewModel
 
 /**
  * Renders the content of the lockscreen.
@@ -39,6 +41,7 @@
  */
 class LockscreenContent(
     private val viewModelFactory: LockscreenContentViewModel.Factory,
+    private val notificationScrimViewModelFactory: NotificationLockscreenScrimViewModel.Factory,
     private val blueprints: Set<@JvmSuppressWildcards ComposableLockscreenSceneBlueprint>,
     private val clockInteractor: KeyguardClockInteractor,
 ) {
@@ -47,10 +50,13 @@
     }
 
     @Composable
-    fun SceneScope.Content(
-        modifier: Modifier = Modifier,
-    ) {
-        val viewModel = rememberViewModel("LockscreenContent") { viewModelFactory.create() }
+    fun SceneScope.Content(modifier: Modifier = Modifier) {
+        val viewModel =
+            rememberViewModel("LockscreenContent-viewModel") { viewModelFactory.create() }
+        val notificationLockscreenScrimViewModel =
+            rememberViewModel("LockscreenContent-scrimViewModel") {
+                notificationScrimViewModelFactory.create()
+            }
         val isContentVisible: Boolean by viewModel.isContentVisible.collectAsStateWithLifecycle()
         if (!isContentVisible) {
             // If the content isn't supposed to be visible, show a large empty box as it's needed
@@ -71,6 +77,9 @@
         }
 
         val blueprint = blueprintByBlueprintId[blueprintId] ?: return
-        with(blueprint) { Content(viewModel, modifier.sysuiResTag("keyguard_root_view")) }
+        with(blueprint) {
+            Content(viewModel, modifier.sysuiResTag("keyguard_root_view"))
+            NotificationLockscreenScrim(notificationLockscreenScrimViewModel)
+        }
     }
 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/TopAreaSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/TopAreaSection.kt
index 97d89a2..afa92f2 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/TopAreaSection.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/TopAreaSection.kt
@@ -83,11 +83,7 @@
             }
 
         val state = remember {
-            MutableSceneTransitionLayoutState(
-                currentScene,
-                ClockTransition.defaultClockTransitions,
-                enableInterruptions = false,
-            )
+            MutableSceneTransitionLayoutState(currentScene, ClockTransition.defaultClockTransitions)
         }
 
         // Update state whenever currentSceneKey has changed.
@@ -102,7 +98,7 @@
                 scene(splitShadeLargeClockScene) {
                     LargeClockWithSmartSpace(
                         smartSpacePaddingTop = smartSpacePaddingTop,
-                        shouldOffSetClockToOneHalf = !hasCustomPositionUpdatedAnimation
+                        shouldOffSetClockToOneHalf = !hasCustomPositionUpdatedAnimation,
                     )
                 }
 
@@ -114,21 +110,15 @@
                 }
 
                 scene(smallClockScene) {
-                    SmallClockWithSmartSpace(
-                        smartSpacePaddingTop = smartSpacePaddingTop,
-                    )
+                    SmallClockWithSmartSpace(smartSpacePaddingTop = smartSpacePaddingTop)
                 }
 
                 scene(largeClockScene) {
-                    LargeClockWithSmartSpace(
-                        smartSpacePaddingTop = smartSpacePaddingTop,
-                    )
+                    LargeClockWithSmartSpace(smartSpacePaddingTop = smartSpacePaddingTop)
                 }
 
                 scene(WeatherClockScenes.largeClockScene) {
-                    WeatherLargeClockWithSmartSpace(
-                        smartSpacePaddingTop = smartSpacePaddingTop,
-                    )
+                    WeatherLargeClockWithSmartSpace(smartSpacePaddingTop = smartSpacePaddingTop)
                 }
 
                 scene(WeatherClockScenes.splitShadeLargeClockScene) {
@@ -154,7 +144,7 @@
                 SmallClock(
                     burnInParams = burnIn.parameters,
                     onTopChanged = burnIn.onSmallClockTopChanged,
-                    modifier = Modifier.wrapContentSize()
+                    modifier = Modifier.wrapContentSize(),
                 )
             }
             with(smartSpaceSection) {
@@ -202,7 +192,7 @@
                                     y = 0,
                                 )
                             }
-                        }
+                        },
                 )
             }
         }
@@ -226,10 +216,7 @@
         Column(modifier = modifier) {
             val currentClock = currentClockState.value ?: return@Column
             with(weatherClockSection) {
-                Time(
-                    clock = currentClock,
-                    burnInParams = burnIn.parameters,
-                )
+                Time(clock = currentClock, burnInParams = burnIn.parameters)
             }
             val density = LocalDensity.current
             val context = LocalContext.current
@@ -242,7 +229,7 @@
                     modifier =
                         Modifier.heightIn(
                             min = getDimen(context, "enhanced_smartspace_height", density)
-                        )
+                        ),
                 )
             }
             with(weatherClockSection) {
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationLockscreenScrim.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationLockscreenScrim.kt
new file mode 100644
index 0000000..4279be3
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationLockscreenScrim.kt
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2024 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.systemui.notifications.ui.composable
+
+import androidx.compose.animation.core.Animatable
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.snapshotFlow
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.graphicsLayer
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.android.compose.animation.scene.SceneScope
+import com.android.compose.animation.scene.content.state.TransitionState
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.shade.shared.model.ShadeMode
+import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationLockscreenScrimViewModel
+import kotlinx.coroutines.launch
+
+/**
+ * A full-screen notifications scrim that is only visible after transitioning from Shade scene to
+ * Lockscreen Scene and ending user input, at which point it fades out, visually completing the
+ * transition.
+ */
+@Composable
+fun SceneScope.NotificationLockscreenScrim(
+    viewModel: NotificationLockscreenScrimViewModel,
+    modifier: Modifier = Modifier,
+) {
+    val coroutineScope = rememberCoroutineScope()
+    val shadeMode = viewModel.shadeMode.collectAsStateWithLifecycle()
+
+    // Important: Make sure that shouldShowScrimFadeOut() is checked the first time the Lockscreen
+    // scene is composed.
+    val useFadeOutOnComposition =
+        remember(shadeMode.value) {
+            layoutState.currentTransition?.let { currentTransition ->
+                shouldShowScrimFadeOut(currentTransition, shadeMode.value)
+            } ?: false
+        }
+
+    val alphaAnimatable = remember { Animatable(1f) }
+
+    LaunchedEffect(
+        alphaAnimatable,
+        layoutState.currentTransition,
+        useFadeOutOnComposition,
+        shadeMode,
+    ) {
+        val currentTransition = layoutState.currentTransition
+        if (
+            useFadeOutOnComposition &&
+                currentTransition != null &&
+                shouldShowScrimFadeOut(currentTransition, shadeMode.value) &&
+                currentTransition.isUserInputOngoing
+        ) {
+            // keep scrim visible until user lifts their finger.
+            viewModel.setAlphaForLockscreenFadeIn(0f)
+            alphaAnimatable.snapTo(1f)
+        } else if (
+            useFadeOutOnComposition &&
+                (currentTransition == null ||
+                    (shouldShowScrimFadeOut(currentTransition, shadeMode.value) &&
+                        !currentTransition.isUserInputOngoing))
+        ) {
+            // we no longer want to keep the scrim from fading out, so animate the scrim fade-out
+            // and pipe the progress to the view model as well, so NSSL can fade-in the stack in
+            // tandem.
+            viewModel.setAlphaForLockscreenFadeIn(0f)
+            coroutineScope.launch {
+                snapshotFlow { alphaAnimatable.value }
+                    .collect { viewModel.setAlphaForLockscreenFadeIn(1 - it) }
+            }
+            alphaAnimatable.animateTo(0f, tween())
+        } else {
+            // disable the scrim fade logic.
+            viewModel.setAlphaForLockscreenFadeIn(1f)
+            alphaAnimatable.snapTo(0f)
+        }
+    }
+
+    Box(
+        modifier
+            .fillMaxSize()
+            .element(Notifications.Elements.NotificationScrim)
+            .graphicsLayer { alpha = alphaAnimatable.value }
+            .background(MaterialTheme.colorScheme.surface)
+    )
+}
+
+private fun shouldShowScrimFadeOut(
+    currentTransition: TransitionState.Transition,
+    shadeMode: ShadeMode,
+): Boolean {
+    return shadeMode == ShadeMode.Single &&
+        currentTransition.isInitiatedByUserInput &&
+        (currentTransition.isTransitioning(from = Scenes.Shade, to = Scenes.Lockscreen) ||
+            currentTransition.isTransitioning(from = Scenes.Bouncer, to = Scenes.Lockscreen))
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt
index fdf82ca..8b9e927 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt
@@ -81,7 +81,7 @@
             if (scrimOffset() < minScrimOffset()) {
                 animateScrimOffset(minScrimOffset())
             }
-            0f
+            { 0f }
         },
     )
 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt
index a2ae8bb..a706585 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt
@@ -100,7 +100,7 @@
         },
         onStop = { velocityAvailable ->
             onStop(velocityAvailable)
-            velocityAvailable
+            suspend { velocityAvailable }
         },
     )
 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt
index fe4a65b..4c6834c 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt
@@ -47,7 +47,6 @@
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.LaunchedEffect
@@ -60,7 +59,6 @@
 import androidx.compose.runtime.snapshotFlow
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clip
 import androidx.compose.ui.draw.drawBehind
 import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Color
@@ -70,7 +68,6 @@
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.boundsInWindow
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.layout.onPlaced
 import androidx.compose.ui.layout.onSizeChanged
 import androidx.compose.ui.layout.positionInWindow
 import androidx.compose.ui.platform.LocalConfiguration
@@ -82,17 +79,21 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.util.lerp
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.android.compose.animation.scene.ContentKey
 import com.android.compose.animation.scene.ElementKey
 import com.android.compose.animation.scene.LowestZIndexContentPicker
 import com.android.compose.animation.scene.NestedScrollBehavior
 import com.android.compose.animation.scene.SceneScope
+import com.android.compose.animation.scene.SceneTransitionLayoutState
+import com.android.compose.animation.scene.content.state.TransitionState
 import com.android.compose.modifiers.thenIf
 import com.android.systemui.common.ui.compose.windowinsets.LocalScreenCornerRadius
 import com.android.systemui.res.R
 import com.android.systemui.scene.session.ui.composable.SaveableSession
 import com.android.systemui.scene.session.ui.composable.rememberSession
+import com.android.systemui.scene.shared.model.Overlays
 import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.shade.shared.model.ShadeMode
+import com.android.systemui.shade.shared.flag.DualShade
 import com.android.systemui.shade.ui.composable.ShadeHeader
 import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
 import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimRounding
@@ -101,7 +102,7 @@
 import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationTransitionThresholds.EXPANSION_FOR_MAX_SCRIM_ALPHA
 import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
 import kotlin.math.roundToInt
-import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.launch
 
 object Notifications {
@@ -110,18 +111,16 @@
         val NotificationStackPlaceholder = ElementKey("NotificationStackPlaceholder")
         val HeadsUpNotificationPlaceholder =
             ElementKey("HeadsUpNotificationPlaceholder", contentPicker = LowestZIndexContentPicker)
-        val ShelfSpace = ElementKey("ShelfSpace")
         val NotificationStackCutoffGuideline = ElementKey("NotificationStackCutoffGuideline")
     }
-
-    // Expansion fraction thresholds (between 0-1f) at which the corresponding value should be
-    // at its maximum, given they are at their minimum value at expansion = 0f.
-    object TransitionThresholds {
-        const val EXPANSION_FOR_MAX_CORNER_RADIUS = 0.1f
-        const val EXPANSION_FOR_MAX_SCRIM_ALPHA = 0.3f
-    }
 }
 
+private val notificationsShadeContentKey: ContentKey
+    get() = if (DualShade.isEnabled) Overlays.NotificationsShade else Scenes.Shade
+
+private val quickSettingsShadeContentKey: ContentKey
+    get() = if (DualShade.isEnabled) Overlays.QuickSettingsShade else Scenes.QuickSettings
+
 /**
  * Adds the space where heads up notifications can appear in the scene. This should generally be the
  * entire size of the scene.
@@ -144,7 +143,7 @@
                     // This element is sometimes opted out of the shared element system, so there
                     // can be multiple instances of it during a transition. Thus we need to
                     // determine which instance should feed its bounds to NSSL to avoid providing
-                    // conflicting values
+                    // conflicting values.
                     val useBounds = useHunBounds()
                     if (useBounds) {
                         val positionInWindow = coordinates.positionInWindow()
@@ -155,8 +154,8 @@
                                 " bounds=$boundsInWindow"
                         }
                         // Note: boundsInWindow doesn't scroll off the screen, so use
-                        // positionInWindow
-                        // for top bound, which can scroll off screen while snoozing
+                        // positionInWindow for top bound, which can scroll off screen while
+                        // snoozing.
                         stackScrollView.setHeadsUpTop(positionInWindow.y)
                         stackScrollView.setHeadsUpBottom(boundsInWindow.bottom)
                     }
@@ -251,11 +250,13 @@
         NotificationPlaceholder(
             stackScrollView = stackScrollView,
             viewModel = viewModel,
+            useStackBounds = { shouldUseLockscreenStackBounds(layoutState.transitionState) },
             modifier = Modifier.fillMaxSize(),
         )
         HeadsUpNotificationSpace(
             stackScrollView = stackScrollView,
             viewModel = viewModel,
+            useHunBounds = { shouldUseLockscreenHunBounds(layoutState.transitionState) },
             modifier = Modifier.align(Alignment.TopCenter),
         )
         NotificationStackCutoffGuideline(
@@ -281,7 +282,8 @@
     shouldFillMaxSize: Boolean = true,
     shouldReserveSpaceForNavBar: Boolean = true,
     shouldIncludeHeadsUpSpace: Boolean = true,
-    shadeMode: ShadeMode,
+    shouldShowScrim: Boolean = true,
+    supportNestedScrolling: Boolean,
     onEmptySpaceClick: (() -> Unit)? = null,
     modifier: Modifier = Modifier,
 ) {
@@ -289,6 +291,7 @@
     val density = LocalDensity.current
     val screenCornerRadius = LocalScreenCornerRadius.current
     val scrimCornerRadius = dimensionResource(R.dimen.notification_scrim_corner_radius)
+    val scrimBackgroundColor = MaterialTheme.colorScheme.surface
     val scrollState =
         shadeSession.rememberSaveableSession(saver = ScrollState.Saver, key = null) {
             ScrollState(initial = 0)
@@ -363,7 +366,6 @@
         snapshotFlow { syntheticScroll.value }
             .collect { delta ->
                 scrollNotificationStack(
-                    scope = coroutineScope,
                     delta = delta,
                     animate = false,
                     scrimOffset = scrimOffset,
@@ -383,7 +385,6 @@
                 // composed at least once), and our remote input row overlaps with the ime bounds.
                 if (isRemoteInputActive && imeTopValue > 0f && remoteInputRowBottom > imeTopValue) {
                     scrollNotificationStack(
-                        scope = coroutineScope,
                         delta = remoteInputRowBottom - imeTopValue,
                         animate = true,
                         scrimOffset = scrimOffset,
@@ -425,8 +426,14 @@
                     // completes.
                     if (
                         scrimOffset.value < 0 &&
-                            layoutState.isTransitioning(from = Scenes.Shade, to = Scenes.Gone) ||
-                            layoutState.isTransitioning(from = Scenes.Shade, to = Scenes.Lockscreen)
+                            (layoutState.isTransitioning(
+                                from = notificationsShadeContentKey,
+                                to = Scenes.Gone,
+                            ) ||
+                                layoutState.isTransitioning(
+                                    from = notificationsShadeContentKey,
+                                    to = Scenes.Lockscreen,
+                                ))
                     ) {
                         IntOffset(x = 0, y = (scrimOffset.value * expansionFraction).roundToInt())
                     } else if (
@@ -450,7 +457,10 @@
                                 scrimCornerRadius,
                                 screenCornerRadius,
                                 { expansionFraction },
-                                shouldPunchHoleBehindScrim,
+                                shouldAnimateScrimCornerRadius(
+                                    layoutState,
+                                    shouldPunchHoleBehindScrim,
+                                ),
                             )
                             .let { scrimRounding.value.toRoundedCornerShape(it) }
                     clip = true
@@ -493,7 +503,7 @@
                                 (expansionFraction / EXPANSION_FOR_MAX_SCRIM_ALPHA).coerceAtMost(1f)
                             } else 1f
                     }
-                    .background(MaterialTheme.colorScheme.surface)
+                    .thenIf(shouldShowScrim) { Modifier.background(scrimBackgroundColor) }
                     .thenIf(shouldFillMaxSize) { Modifier.fillMaxSize() }
                     .debugBackground(viewModel, DEBUG_BOX_COLOR)
         ) {
@@ -503,7 +513,7 @@
                             topBehavior = NestedScrollBehavior.EdgeWithPreview,
                             isExternalOverscrollGesture = { isCurrentGestureOverscroll.value },
                         )
-                        .thenIf(shadeMode == ShadeMode.Single) {
+                        .thenIf(supportNestedScrolling) {
                             Modifier.nestedScroll(scrimNestedScrollConnection)
                         }
                         .stackVerticalOverscroll(coroutineScope) { scrollState.canScrollForward }
@@ -514,6 +524,9 @@
                 NotificationPlaceholder(
                     stackScrollView = stackScrollView,
                     viewModel = viewModel,
+                    useStackBounds = {
+                        !shouldUseLockscreenStackBounds(layoutState.transitionState)
+                    },
                     modifier =
                         Modifier.notificationStackHeight(
                                 view = stackScrollView,
@@ -534,6 +547,7 @@
             HeadsUpNotificationSpace(
                 stackScrollView = stackScrollView,
                 viewModel = viewModel,
+                useHunBounds = { !shouldUseLockscreenHunBounds(layoutState.transitionState) },
                 modifier = Modifier.padding(top = topPadding),
             )
         }
@@ -541,38 +555,6 @@
 }
 
 /**
- * This may be added to the lockscreen to provide a space to the start of the lock icon where the
- * short shelf has room to flow vertically below the lock icon, but to its start, allowing more
- * notifications to fit in the stack itself. (see: b/213934746)
- *
- * NOTE: this is totally unused for now; it is here to clarify the future plan
- */
-@Composable
-fun SceneScope.NotificationShelfSpace(
-    viewModel: NotificationsPlaceholderViewModel,
-    modifier: Modifier = Modifier,
-) {
-    Text(
-        text = "Shelf Space",
-        modifier
-            .element(key = Notifications.Elements.ShelfSpace)
-            .fillMaxWidth()
-            .onPlaced { coordinates: LayoutCoordinates ->
-                debugLog(viewModel) {
-                    ("SHELF onPlaced:" +
-                        " size=${coordinates.size}" +
-                        " bounds=${coordinates.boundsInWindow()}")
-                }
-            }
-            .clip(RoundedCornerShape(24.dp))
-            .background(MaterialTheme.colorScheme.primaryContainer)
-            .padding(16.dp),
-        style = MaterialTheme.typography.titleLarge,
-        color = MaterialTheme.colorScheme.onPrimaryContainer,
-    )
-}
-
-/**
  * A 0 height horizontal spacer to be placed at the bottom-most position in the current scene, where
  * the notification contents (stack, footer, shelf) should be drawn.
  */
@@ -600,6 +582,7 @@
 private fun SceneScope.NotificationPlaceholder(
     stackScrollView: NotificationScrollView,
     viewModel: NotificationsPlaceholderViewModel,
+    useStackBounds: () -> Boolean,
     modifier: Modifier = Modifier,
 ) {
     Box(
@@ -609,21 +592,26 @@
                 .debugBackground(viewModel, DEBUG_STACK_COLOR)
                 .onSizeChanged { size -> debugLog(viewModel) { "STACK onSizeChanged: size=$size" } }
                 .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                    val positionInWindow = coordinates.positionInWindow()
-                    debugLog(viewModel) {
-                        "STACK onGloballyPositioned:" +
-                            " size=${coordinates.size}" +
-                            " position=$positionInWindow" +
-                            " bounds=${coordinates.boundsInWindow()}"
+                    // This element is opted out of the shared element system, so there can be
+                    // multiple instances of it during a transition. Thus we need to determine which
+                    // instance should feed its bounds to NSSL to avoid providing conflicting values
+                    val useBounds = useStackBounds()
+                    if (useBounds) {
+                        // NOTE: positionInWindow.y scrolls off screen, but boundsInWindow.top won't
+                        val positionInWindow = coordinates.positionInWindow()
+                        debugLog(viewModel) {
+                            "STACK onGloballyPositioned:" +
+                                " size=${coordinates.size}" +
+                                " position=$positionInWindow" +
+                                " bounds=${coordinates.boundsInWindow()}"
+                        }
+                        stackScrollView.setStackTop(positionInWindow.y)
                     }
-                    // NOTE: positionInWindow.y scrolls off screen, but boundsInWindow.top will not
-                    stackScrollView.setStackTop(positionInWindow.y)
                 }
     )
 }
 
 private suspend fun scrollNotificationStack(
-    scope: CoroutineScope,
     delta: Float,
     animate: Boolean,
     scrimOffset: Animatable<Float, AnimationVector1D>,
@@ -638,7 +626,7 @@
             if (animate) {
                 // launch a new coroutine for the remainder animation so that it doesn't suspend the
                 // scrim animation, allowing both to play simultaneously.
-                scope.launch { scrollState.animateScrollTo(remainingDelta) }
+                coroutineScope { launch { scrollState.animateScrollTo(remainingDelta) } }
             } else {
                 scrollState.scrollTo(remainingDelta)
             }
@@ -658,6 +646,30 @@
     }
 }
 
+private fun TransitionState.isOnLockscreen(): Boolean {
+    return currentScene == Scenes.Lockscreen && currentOverlays.isEmpty()
+}
+
+private fun shouldUseLockscreenStackBounds(state: TransitionState): Boolean {
+    return state is TransitionState.Idle && state.isOnLockscreen()
+}
+
+private fun shouldUseLockscreenHunBounds(state: TransitionState): Boolean {
+    return when (state) {
+        is TransitionState.Idle -> state.isOnLockscreen()
+        is TransitionState.Transition ->
+            state.isTransitioning(from = quickSettingsShadeContentKey, to = Scenes.Lockscreen)
+    }
+}
+
+private fun shouldAnimateScrimCornerRadius(
+    state: SceneTransitionLayoutState,
+    shouldPunchHoleBehindScrim: Boolean,
+): Boolean {
+    return shouldPunchHoleBehindScrim ||
+        state.isTransitioning(from = notificationsShadeContentKey, to = Scenes.Lockscreen)
+}
+
 private fun calculateCornerRadius(
     scrimCornerRadius: Dp,
     screenCornerRadius: Dp,
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeOverlay.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeOverlay.kt
index a22becc..5b99670 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeOverlay.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeOverlay.kt
@@ -33,7 +33,6 @@
 import com.android.systemui.scene.session.ui.composable.SaveableSession
 import com.android.systemui.scene.shared.model.Overlays
 import com.android.systemui.scene.ui.composable.Overlay
-import com.android.systemui.shade.shared.model.ShadeMode
 import com.android.systemui.shade.ui.composable.ExpandedShadeHeader
 import com.android.systemui.shade.ui.composable.OverlayShade
 import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView
@@ -69,9 +68,7 @@
     }
 
     @Composable
-    override fun ContentScope.Content(
-        modifier: Modifier,
-    ) {
+    override fun ContentScope.Content(modifier: Modifier) {
         val viewModel =
             rememberViewModel("NotificationsShadeOverlay-viewModel") {
                 contentViewModelFactory.create()
@@ -81,10 +78,7 @@
                 viewModel.notificationsPlaceholderViewModelFactory.create()
             }
 
-        OverlayShade(
-            modifier = modifier,
-            onScrimClicked = viewModel::onScrimClicked,
-        ) {
+        OverlayShade(modifier = modifier, onScrimClicked = viewModel::onScrimClicked) {
             Column {
                 ExpandedShadeHeader(
                     viewModelFactory = viewModel.shadeHeaderViewModelFactory,
@@ -102,7 +96,8 @@
                     shouldPunchHoleBehindScrim = false,
                     shouldFillMaxSize = false,
                     shouldReserveSpaceForNavBar = false,
-                    shadeMode = ShadeMode.Dual,
+                    shouldShowScrim = false,
+                    supportNestedScrolling = false,
                     modifier = Modifier.fillMaxWidth(),
                 )
 
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreen.kt b/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreen.kt
index b808044..4f1acdc 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreen.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreen.kt
@@ -46,7 +46,7 @@
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.dp
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import com.android.compose.theme.LocalAndroidColorScheme
+import com.android.compose.theme.colorAttr
 import com.android.systemui.compose.modifiers.sysuiResTag
 import com.android.systemui.people.ui.viewmodel.PeopleTileViewModel
 import com.android.systemui.people.ui.viewmodel.PeopleViewModel
@@ -60,10 +60,7 @@
  *   the Activity/Fragment/View hosting this Composable once a result is available.
  */
 @Composable
-fun PeopleScreen(
-    viewModel: PeopleViewModel,
-    onResult: (PeopleViewModel.Result) -> Unit,
-) {
+fun PeopleScreen(viewModel: PeopleViewModel, onResult: (PeopleViewModel.Result) -> Unit) {
     val priorityTiles by viewModel.priorityTiles.collectAsStateWithLifecycle()
     val recentTiles by viewModel.recentTiles.collectAsStateWithLifecycle()
 
@@ -79,10 +76,9 @@
 
     // Make sure to use the Android colors and not the default Material3 colors to have the exact
     // same colors as the View implementation.
-    val androidColors = LocalAndroidColorScheme.current.deprecated
     Surface(
-        color = androidColors.colorBackground,
-        contentColor = androidColors.textColorPrimary,
+        color = colorAttr(com.android.internal.R.attr.colorBackground),
+        contentColor = colorAttr(com.android.internal.R.attr.textColorPrimary),
         modifier = Modifier.fillMaxSize(),
     ) {
         if (priorityTiles.isNotEmpty() || recentTiles.isNotEmpty()) {
@@ -99,9 +95,7 @@
     recentTiles: List<PeopleTileViewModel>,
     onTileClicked: (PeopleTileViewModel) -> Unit,
 ) {
-    Column(
-        Modifier.sysuiResTag("top_level_with_conversations"),
-    ) {
+    Column(Modifier.sysuiResTag("top_level_with_conversations")) {
         Column(
             Modifier.fillMaxWidth().padding(PeopleSpacePadding),
             horizontalAlignment = Alignment.CenterHorizontally,
@@ -126,12 +120,7 @@
             Modifier.fillMaxWidth()
                 .sysuiResTag("scroll_view")
                 .verticalScroll(rememberScrollState())
-                .padding(
-                    top = 16.dp,
-                    bottom = PeopleSpacePadding,
-                    start = 8.dp,
-                    end = 8.dp,
-                ),
+                .padding(top = 16.dp, bottom = PeopleSpacePadding, start = 8.dp, end = 8.dp)
         ) {
             val hasPriorityConversations = priorityTiles.isNotEmpty()
             if (hasPriorityConversations) {
@@ -153,13 +142,13 @@
 private fun ConversationList(
     @StringRes headerTextResource: Int,
     tiles: List<PeopleTileViewModel>,
-    onTileClicked: (PeopleTileViewModel) -> Unit
+    onTileClicked: (PeopleTileViewModel) -> Unit,
 ) {
     Text(
         stringResource(headerTextResource),
         Modifier.padding(start = 16.dp),
         style = MaterialTheme.typography.labelLarge,
-        color = LocalAndroidColorScheme.current.deprecated.colorAccentPrimaryVariant,
+        color = colorAttr(com.android.internal.R.attr.colorAccentPrimaryVariant),
     )
 
     Spacer(Modifier.height(10.dp))
@@ -167,7 +156,7 @@
     tiles.forEachIndexed { index, tile ->
         if (index > 0) {
             Divider(
-                color = LocalAndroidColorScheme.current.deprecated.colorBackground,
+                color = colorAttr(com.android.internal.R.attr.colorBackground),
                 thickness = 2.dp,
             )
         }
@@ -190,14 +179,13 @@
     withTopCornerRadius: Boolean,
     withBottomCornerRadius: Boolean,
 ) {
-    val androidColors = LocalAndroidColorScheme.current.deprecated
     val cornerRadius = dimensionResource(R.dimen.people_space_widget_radius)
     val topCornerRadius = if (withTopCornerRadius) cornerRadius else 0.dp
     val bottomCornerRadius = if (withBottomCornerRadius) cornerRadius else 0.dp
 
     Surface(
-        color = androidColors.colorSurface,
-        contentColor = androidColors.textColorPrimary,
+        color = colorAttr(com.android.internal.R.attr.colorSurface),
+        contentColor = colorAttr(com.android.internal.R.attr.textColorPrimary),
         shape =
             RoundedCornerShape(
                 topStart = topCornerRadius,
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreenEmpty.kt b/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreenEmpty.kt
index 26cc9b9..d483f88 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreenEmpty.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreenEmpty.kt
@@ -41,13 +41,11 @@
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.dp
-import com.android.compose.theme.LocalAndroidColorScheme
+import com.android.compose.theme.colorAttr
 import com.android.systemui.res.R
 
 @Composable
-internal fun PeopleScreenEmpty(
-    onGotItClicked: () -> Unit,
-) {
+internal fun PeopleScreenEmpty(onGotItClicked: () -> Unit) {
     Column(
         Modifier.fillMaxSize().padding(PeopleSpacePadding),
         horizontalAlignment = Alignment.CenterHorizontally,
@@ -70,15 +68,14 @@
         ExampleTile()
         Spacer(Modifier.weight(1f))
 
-        val androidColors = LocalAndroidColorScheme.current
         Button(
             onGotItClicked,
             Modifier.fillMaxWidth().defaultMinSize(minHeight = 56.dp),
             colors =
                 ButtonDefaults.buttonColors(
-                    containerColor = androidColors.deprecated.colorAccentPrimary,
-                    contentColor = androidColors.deprecated.textColorOnAccent,
-                )
+                    containerColor = colorAttr(com.android.internal.R.attr.colorAccentPrimary),
+                    contentColor = colorAttr(com.android.internal.R.attr.textColorOnAccent),
+                ),
         ) {
             Text(stringResource(R.string.got_it))
         }
@@ -87,11 +84,10 @@
 
 @Composable
 private fun ExampleTile() {
-    val androidColors = LocalAndroidColorScheme.current
     Surface(
         shape = RoundedCornerShape(28.dp),
-        color = androidColors.deprecated.colorSurface,
-        contentColor = androidColors.deprecated.textColorPrimary,
+        color = colorAttr(com.android.internal.R.attr.colorSurface),
+        contentColor = colorAttr(com.android.internal.R.attr.textColorPrimary),
     ) {
         Row(
             Modifier.padding(vertical = 20.dp, horizontal = 16.dp),
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt
index a6d5c1c..e9c5c03 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt
@@ -29,6 +29,8 @@
 import androidx.compose.ui.draw.drawWithContent
 import androidx.compose.ui.layout.layout
 import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.dimensionResource
+import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.viewinterop.AndroidView
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -45,6 +47,7 @@
 import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Expanding
 import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.UnsquishingQQS
 import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.UnsquishingQS
+import com.android.systemui.res.R
 import com.android.systemui.scene.shared.model.Scenes
 
 object QuickSettings {
@@ -73,10 +76,21 @@
         val MediaLandscapeTopOffset = ValueKey("MediaLandscapeTopOffset")
 
         object MediaOffset {
-            val InQQS = 0.dp
             // Brightness + padding
             val InQS = 92.dp
             val Default = 0.dp
+
+            @Composable
+            fun inQqs(isMediaInRow: Boolean): Dp {
+                return if (isMediaInRow) {
+                    // Tiles are laid out in a center of a container, that has this
+                    // margin on the bottom. This compensates this margin, so that the Media
+                    // Carousel can be properly centered
+                    -dimensionResource(id = R.dimen.qqs_layout_padding_bottom) / 2
+                } else {
+                    0.dp
+                }
+            }
         }
     }
 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
index 6304979..d75a776 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
@@ -100,7 +100,6 @@
 import com.android.systemui.scene.session.ui.composable.SaveableSession
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.scene.ui.composable.Scene
-import com.android.systemui.shade.shared.model.ShadeMode
 import com.android.systemui.shade.ui.composable.CollapsedShadeHeader
 import com.android.systemui.shade.ui.composable.ExpandedShadeHeader
 import com.android.systemui.shade.ui.composable.Shade
@@ -114,11 +113,9 @@
 import javax.inject.Inject
 import javax.inject.Named
 import kotlin.math.roundToInt
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
 
 /** The Quick Settings (AKA "QS") scene shows the quick setting tiles. */
-@OptIn(ExperimentalCoroutinesApi::class)
 @SysUISingleton
 class QuickSettingsScene
 @Inject
@@ -420,17 +417,26 @@
                     .navigationBarsPadding()
                     .padding(horizontal = shadeHorizontalPadding),
         )
+
+        // The minimum possible value for the top of the notification stack. In other words: how
+        // high is the notification stack allowed to get when the scene is at rest. It may still be
+        // translated farther upwards by a transition animation but, at rest, the top edge of its
+        // bounds must be limited to be at or below this value.
+        //
+        // A 1 pixel is added to compensate for any kind of rounding errors to make sure 100% that
+        // the notification stack is entirely "below" the entire screen.
+        val minNotificationStackTop = screenHeight.roundToInt() + 1
         NotificationScrollingStack(
             shadeSession = shadeSession,
             stackScrollView = notificationStackScrollView,
             viewModel = notificationsPlaceholderViewModel,
-            maxScrimTop = { screenHeight },
+            maxScrimTop = { minNotificationStackTop.toFloat() },
             shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim,
             shouldIncludeHeadsUpSpace = false,
-            shadeMode = ShadeMode.Single,
+            supportNestedScrolling = true,
             modifier =
                 Modifier.fillMaxWidth()
-                    .offset { IntOffset(x = 0, y = screenHeight.roundToInt()) }
+                    .offset { IntOffset(x = 0, y = minNotificationStackTop) }
                     .padding(horizontal = shadeHorizontalPadding),
         )
         NotificationStackCutoffGuideline(
@@ -439,7 +445,7 @@
             modifier =
                 Modifier.align(Alignment.BottomCenter)
                     .navigationBarsPadding()
-                    .offset { IntOffset(x = 0, y = screenHeight.roundToInt()) }
+                    .offset { IntOffset(x = 0, y = minNotificationStackTop) }
                     .padding(horizontal = shadeHorizontalPadding),
         )
     }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt
index dc9e267..417f2b8 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt
@@ -81,7 +81,6 @@
             initialScene = initialSceneKey,
             canChangeScene = { toScene -> viewModel.canChangeScene(toScene) },
             transitions = SceneContainerTransitions,
-            enableInterruptions = false,
         )
     }
 
@@ -132,7 +131,6 @@
             state = state,
             modifier = modifier.fillMaxSize(),
             swipeSourceDetector = viewModel.edgeDetector,
-            gestureFilter = viewModel::shouldFilterGesture,
         ) {
             sceneByKey.forEach { (sceneKey, scene) ->
                 scene(
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerInterruptionHandler.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerInterruptionHandler.kt
new file mode 100644
index 0000000..7e99847
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerInterruptionHandler.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2024 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.systemui.scene.ui.composable
+
+import com.android.compose.animation.scene.InterruptionHandler
+import com.android.compose.animation.scene.InterruptionResult
+import com.android.compose.animation.scene.SceneKey
+import com.android.compose.animation.scene.content.state.TransitionState
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.scene.ui.composable.transitions.TO_BOUNCER_FADE_FRACTION
+
+object SceneContainerInterruptionHandler : InterruptionHandler {
+    override fun onInterruption(
+        interrupted: TransitionState.Transition.ChangeScene,
+        newTargetScene: SceneKey,
+    ): InterruptionResult? {
+        return handleTransitionToGoneDuringTransitionToBouncer(interrupted, newTargetScene)
+    }
+
+    /**
+     * Handle the case where we start transitioning to Bouncer but then we are interrupted to
+     * transition to Gone, for instance because face auth kicked in.
+     */
+    private fun handleTransitionToGoneDuringTransitionToBouncer(
+        transition: TransitionState.Transition.ChangeScene,
+        targetScene: SceneKey,
+    ): InterruptionResult? {
+        if (targetScene != Scenes.Gone || !transition.isTransitioningFromOrTo(Scenes.Bouncer)) {
+            return null
+        }
+
+        // Animate Bouncer => Gone only when the bouncer is fully opaque, otherwise animate
+        // OtherScene => Gone and reverse the OtherScene => Bouncer transition (note: OtherScene is
+        // usually the Lockscreen scene).
+        val otherScene: SceneKey
+        val animatesFromBouncer =
+            if (transition.isTransitioning(to = Scenes.Bouncer)) {
+                otherScene = transition.fromScene
+                transition.progress >= TO_BOUNCER_FADE_FRACTION
+            } else {
+                otherScene = transition.toScene
+                transition.progress <= 1f - TO_BOUNCER_FADE_FRACTION
+            }
+
+        return if (animatesFromBouncer) {
+            InterruptionResult(
+                animateFrom = Scenes.Bouncer,
+
+                // We don't want the content of the lockscreen to be shown during the Bouncer =>
+                // Launcher transition. We disable chaining of the transitions so that only the
+                // Bouncer and Launcher scenes are composed.
+                chain = false,
+            )
+        } else {
+            InterruptionResult(animateFrom = otherScene)
+        }
+    }
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt
index 58fbf43..dc545b8 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt
@@ -1,5 +1,6 @@
 package com.android.systemui.scene.ui.composable
 
+import androidx.compose.animation.core.spring
 import androidx.compose.foundation.gestures.Orientation
 import com.android.compose.animation.scene.ProgressConverter
 import com.android.compose.animation.scene.TransitionKey
@@ -12,11 +13,15 @@
 import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade
 import com.android.systemui.scene.ui.composable.transitions.bouncerToGoneTransition
 import com.android.systemui.scene.ui.composable.transitions.bouncerToLockscreenPreview
+import com.android.systemui.scene.ui.composable.transitions.communalToBouncerTransition
+import com.android.systemui.scene.ui.composable.transitions.communalToShadeTransition
+import com.android.systemui.scene.ui.composable.transitions.dreamToGoneTransition
 import com.android.systemui.scene.ui.composable.transitions.goneToQuickSettingsTransition
 import com.android.systemui.scene.ui.composable.transitions.goneToShadeTransition
 import com.android.systemui.scene.ui.composable.transitions.goneToSplitShadeTransition
 import com.android.systemui.scene.ui.composable.transitions.lockscreenToBouncerTransition
 import com.android.systemui.scene.ui.composable.transitions.lockscreenToCommunalTransition
+import com.android.systemui.scene.ui.composable.transitions.lockscreenToDreamTransition
 import com.android.systemui.scene.ui.composable.transitions.lockscreenToGoneTransition
 import com.android.systemui.scene.ui.composable.transitions.lockscreenToQuickSettingsTransition
 import com.android.systemui.scene.ui.composable.transitions.lockscreenToShadeTransition
@@ -41,13 +46,16 @@
  * Please keep the list sorted alphabetically.
  */
 val SceneContainerTransitions = transitions {
+    interruptionHandler = SceneContainerInterruptionHandler
 
     // Overscroll progress starts linearly with some resistance (3f) and slowly approaches 0.2f
     defaultOverscrollProgressConverter = ProgressConverter.tanh(maxProgress = 0.2f, tilt = 3f)
+    defaultSwipeSpec = spring(stiffness = 300f, dampingRatio = 0.8f, visibilityThreshold = 0.5f)
 
     // Scene transitions
 
     from(Scenes.Bouncer, to = Scenes.Gone) { bouncerToGoneTransition() }
+    from(Scenes.Dream, to = Scenes.Gone) { dreamToGoneTransition() }
     from(Scenes.Gone, to = Scenes.Shade) { goneToShadeTransition() }
     from(Scenes.Gone, to = Scenes.Shade, key = ToSplitShade) { goneToSplitShadeTransition() }
     from(Scenes.Gone, to = Scenes.Shade, key = SlightlyFasterShadeCollapse) {
@@ -68,6 +76,7 @@
         lockscreenToBouncerTransition()
     }
     from(Scenes.Lockscreen, to = Scenes.Communal) { lockscreenToCommunalTransition() }
+    from(Scenes.Lockscreen, to = Scenes.Dream) { lockscreenToDreamTransition() }
     from(Scenes.Lockscreen, to = Scenes.Shade) { lockscreenToShadeTransition() }
     from(Scenes.Lockscreen, to = Scenes.Shade, key = ToSplitShade) {
         lockscreenToSplitShadeTransition()
@@ -82,18 +91,38 @@
         sharedElement(Notifications.Elements.HeadsUpNotificationPlaceholder, enabled = false)
     }
     from(Scenes.Shade, to = Scenes.QuickSettings) { shadeToQuickSettingsTransition() }
+    from(Scenes.Shade, to = Scenes.Lockscreen) {
+        reversed { lockscreenToShadeTransition() }
+        sharedElement(Notifications.Elements.NotificationStackPlaceholder, enabled = false)
+        sharedElement(Notifications.Elements.HeadsUpNotificationPlaceholder, enabled = false)
+    }
+    from(Scenes.Communal, to = Scenes.Shade) { communalToShadeTransition() }
+    from(Scenes.Communal, to = Scenes.Bouncer) { communalToBouncerTransition() }
 
     // Overlay transitions
 
     to(Overlays.NotificationsShade) { toNotificationsShadeTransition() }
     to(Overlays.QuickSettingsShade) { toQuickSettingsShadeTransition() }
-    from(Overlays.NotificationsShade, Overlays.QuickSettingsShade) {
+    from(Overlays.NotificationsShade, to = Overlays.QuickSettingsShade) {
         notificationsShadeToQuickSettingsShadeTransition()
     }
+    from(Scenes.Gone, to = Overlays.NotificationsShade, key = SlightlyFasterShadeCollapse) {
+        toNotificationsShadeTransition(durationScale = 0.9)
+    }
+    from(Scenes.Gone, to = Overlays.QuickSettingsShade, key = SlightlyFasterShadeCollapse) {
+        toQuickSettingsShadeTransition(durationScale = 0.9)
+    }
+    from(Scenes.Lockscreen, to = Overlays.NotificationsShade, key = SlightlyFasterShadeCollapse) {
+        toNotificationsShadeTransition(durationScale = 0.9)
+    }
+    from(Scenes.Lockscreen, to = Overlays.QuickSettingsShade, key = SlightlyFasterShadeCollapse) {
+        toQuickSettingsShadeTransition(durationScale = 0.9)
+    }
 
     // Scene overscroll
 
     overscrollDisabled(Scenes.Gone, Orientation.Vertical)
+    overscrollDisabled(Scenes.Lockscreen, Orientation.Vertical)
     overscroll(Scenes.Bouncer, Orientation.Vertical) {
         translate(Bouncer.Elements.Content, y = { absoluteDistance })
     }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromCommunalToBouncerTransition.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromCommunalToBouncerTransition.kt
new file mode 100644
index 0000000..d7173fd
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromCommunalToBouncerTransition.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2024 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.systemui.scene.ui.composable.transitions
+
+import com.android.compose.animation.scene.TransitionBuilder
+
+fun TransitionBuilder.communalToBouncerTransition() {
+    toBouncerTransition()
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromCommunalToShadeTransition.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromCommunalToShadeTransition.kt
new file mode 100644
index 0000000..ba920ac
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromCommunalToShadeTransition.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2024 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.systemui.scene.ui.composable.transitions
+
+import com.android.compose.animation.scene.TransitionBuilder
+
+fun TransitionBuilder.communalToShadeTransition() {
+    toShadeTransition()
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromDreamToGoneTransition.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromDreamToGoneTransition.kt
new file mode 100644
index 0000000..60dc4c05
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromDreamToGoneTransition.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2024 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.systemui.scene.ui.composable.transitions
+
+import androidx.compose.animation.core.tween
+import com.android.compose.animation.scene.TransitionBuilder
+import com.android.systemui.scene.shared.model.Scenes
+
+fun TransitionBuilder.dreamToGoneTransition() {
+    spec = tween(durationMillis = 1000)
+
+    fade(Scenes.Dream.rootElementKey)
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromLockscreenToBouncerTransition.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromLockscreenToBouncerTransition.kt
index ac54896..dd37b53 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromLockscreenToBouncerTransition.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromLockscreenToBouncerTransition.kt
@@ -1,23 +1,11 @@
 package com.android.systemui.scene.ui.composable.transitions
 
 import androidx.compose.animation.core.CubicBezierEasing
-import androidx.compose.animation.core.tween
-import androidx.compose.ui.unit.dp
 import com.android.compose.animation.scene.TransitionBuilder
 import com.android.systemui.bouncer.ui.composable.Bouncer
 
-const val FROM_LOCK_SCREEN_TO_BOUNCER_FADE_FRACTION = 0.5f
-
 fun TransitionBuilder.lockscreenToBouncerTransition() {
-    spec = tween(durationMillis = 500)
-
-    translate(Bouncer.Elements.Content, y = 300.dp)
-    fractionRange(end = FROM_LOCK_SCREEN_TO_BOUNCER_FADE_FRACTION) {
-        fade(Bouncer.Elements.Background)
-    }
-    fractionRange(start = FROM_LOCK_SCREEN_TO_BOUNCER_FADE_FRACTION) {
-        fade(Bouncer.Elements.Content)
-    }
+    toBouncerTransition()
 }
 
 fun TransitionBuilder.bouncerToLockscreenPreview() {
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromLockscreenToDreamTransition.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromLockscreenToDreamTransition.kt
new file mode 100644
index 0000000..7092e3f
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromLockscreenToDreamTransition.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2024 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.systemui.scene.ui.composable.transitions
+
+import androidx.compose.animation.core.tween
+import com.android.compose.animation.scene.TransitionBuilder
+import com.android.systemui.scene.shared.model.Scenes
+
+fun TransitionBuilder.lockscreenToDreamTransition() {
+    spec = tween(durationMillis = 1000)
+
+    fade(Scenes.Lockscreen.rootElementKey)
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/ToBouncerTransition.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/ToBouncerTransition.kt
new file mode 100644
index 0000000..de76f70
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/ToBouncerTransition.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 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.systemui.scene.ui.composable.transitions
+
+import androidx.compose.animation.core.tween
+import androidx.compose.ui.unit.dp
+import com.android.compose.animation.scene.TransitionBuilder
+import com.android.compose.animation.scene.UserActionDistance
+import com.android.systemui.bouncer.ui.composable.Bouncer
+
+const val TO_BOUNCER_FADE_FRACTION = 0.5f
+private const val TO_BOUNCER_SWIPE_DISTANCE_FRACTION = 0.5f
+
+fun TransitionBuilder.toBouncerTransition() {
+    spec = tween(durationMillis = 500)
+
+    distance = UserActionDistance { fromSceneSize, _ ->
+        fromSceneSize.height * TO_BOUNCER_SWIPE_DISTANCE_FRACTION
+    }
+
+    translate(Bouncer.Elements.Content, y = 300.dp)
+    fractionRange(end = TO_BOUNCER_FADE_FRACTION) { fade(Bouncer.Elements.Background) }
+    fractionRange(start = TO_BOUNCER_FADE_FRACTION) { fade(Bouncer.Elements.Content) }
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/ToNotificationsShadeTransition.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/ToNotificationsShadeTransition.kt
index 337f53a5..23c4f12 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/ToNotificationsShadeTransition.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/ToNotificationsShadeTransition.kt
@@ -21,26 +21,20 @@
 import androidx.compose.animation.core.tween
 import com.android.compose.animation.scene.Edge
 import com.android.compose.animation.scene.TransitionBuilder
-import com.android.compose.animation.scene.UserActionDistance
 import com.android.systemui.notifications.ui.composable.Notifications
 import com.android.systemui.shade.ui.composable.OverlayShade
 import com.android.systemui.shade.ui.composable.Shade
 import com.android.systemui.shade.ui.composable.ShadeHeader
 import kotlin.time.Duration.Companion.milliseconds
 
-fun TransitionBuilder.toNotificationsShadeTransition(
-    durationScale: Double = 1.0,
-) {
+fun TransitionBuilder.toNotificationsShadeTransition(durationScale: Double = 1.0) {
     spec = tween(durationMillis = (DefaultDuration * durationScale).inWholeMilliseconds.toInt())
     swipeSpec =
         spring(
             stiffness = Spring.StiffnessMediumLow,
             visibilityThreshold = Shade.Dimensions.ScrimVisibilityThreshold,
         )
-    distance = UserActionDistance { fromSceneSize, orientation ->
-        fromSceneSize.height.toFloat() * 2 / 3f
-    }
-
+    scaleSize(OverlayShade.Elements.Panel, height = 0f)
     translate(OverlayShade.Elements.Panel, Edge.Top)
 
     fractionRange(end = .5f) { fade(OverlayShade.Elements.Scrim) }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt
index 4162891..6f1349f 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt
@@ -18,7 +18,6 @@
 
 package com.android.systemui.shade.ui.composable
 
-import android.view.HapticFeedbackConstants
 import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Box
@@ -40,20 +39,17 @@
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.ReadOnlyComposable
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clip
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.LocalLayoutDirection
-import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.unit.dp
 import com.android.compose.animation.scene.ElementKey
 import com.android.compose.animation.scene.LowestZIndexContentPicker
 import com.android.compose.animation.scene.SceneScope
 import com.android.compose.windowsizeclass.LocalWindowSizeClass
-import com.android.systemui.scene.shared.model.Scenes
 
 /** Renders a lightweight shade UI container, as an overlay. */
 @Composable
@@ -62,13 +58,6 @@
     modifier: Modifier = Modifier,
     content: @Composable () -> Unit,
 ) {
-    val view = LocalView.current
-    LaunchedEffect(Unit) {
-        if (layoutState.currentTransition?.fromContent == Scenes.Gone) {
-            view.performHapticFeedback(HapticFeedbackConstants.GESTURE_START)
-        }
-    }
-
     Box(modifier) {
         Scrim(onClicked = onScrimClicked)
 
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
index 7f2ee2a..3ec057b 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
@@ -16,7 +16,6 @@
 
 package com.android.systemui.shade.ui.composable
 
-import android.view.HapticFeedbackConstants
 import android.view.ViewGroup
 import androidx.compose.animation.core.animateDpAsState
 import androidx.compose.animation.core.animateFloatAsState
@@ -41,7 +40,6 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.systemBars
 import androidx.compose.foundation.rememberScrollState
-import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
@@ -54,13 +52,11 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.CompositingStrategy
 import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.input.pointer.pointerInteropFilter
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.layoutId
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLifecycleOwner
-import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.res.colorResource
 import androidx.compose.ui.res.dimensionResource
 import androidx.compose.ui.unit.dp
@@ -72,7 +68,7 @@
 import com.android.compose.animation.scene.SceneScope
 import com.android.compose.animation.scene.UserAction
 import com.android.compose.animation.scene.UserActionResult
-import com.android.compose.animation.scene.animateSceneDpAsState
+import com.android.compose.animation.scene.animateContentDpAsState
 import com.android.compose.animation.scene.animateSceneFloatAsState
 import com.android.compose.animation.scene.content.state.TransitionState
 import com.android.compose.modifiers.padding
@@ -92,7 +88,6 @@
 import com.android.systemui.media.controls.ui.controller.MediaCarouselController
 import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
 import com.android.systemui.media.controls.ui.view.MediaHost
-import com.android.systemui.media.controls.ui.view.MediaHostState
 import com.android.systemui.media.controls.ui.view.MediaHostState.Companion.COLLAPSED
 import com.android.systemui.media.controls.ui.view.MediaHostState.Companion.EXPANDED
 import com.android.systemui.media.dagger.MediaModule.QS_PANEL
@@ -103,7 +98,6 @@
 import com.android.systemui.qs.ui.composable.BrightnessMirror
 import com.android.systemui.qs.ui.composable.QuickSettings
 import com.android.systemui.qs.ui.composable.QuickSettings.SharedValues.MediaLandscapeTopOffset
-import com.android.systemui.qs.ui.composable.QuickSettings.SharedValues.MediaOffset.InQQS
 import com.android.systemui.res.R
 import com.android.systemui.scene.session.ui.composable.SaveableSession
 import com.android.systemui.scene.shared.model.Scenes
@@ -121,7 +115,6 @@
 import javax.inject.Inject
 import javax.inject.Named
 import kotlin.math.roundToInt
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
 
 object Shade {
@@ -132,23 +125,13 @@
     }
 
     object Dimensions {
-        val ScrimCornerSize = 32.dp
         val HorizontalPadding = 16.dp
         val ScrimOverscrollLimit = 32.dp
         const val ScrimVisibilityThreshold = 5f
     }
-
-    object Shapes {
-        val Scrim =
-            RoundedCornerShape(
-                topStart = Dimensions.ScrimCornerSize,
-                topEnd = Dimensions.ScrimCornerSize,
-            )
-    }
 }
 
 /** The shade scene shows scrolling list of notifications and some of the quick setting tiles. */
-@OptIn(ExperimentalCoroutinesApi::class)
 @SysUISingleton
 class ShadeScene
 @Inject
@@ -201,11 +184,11 @@
         )
 
     init {
-        qqsMediaHost.expansion = MediaHostState.EXPANDED
+        qqsMediaHost.expansion = EXPANDED
         qqsMediaHost.showsOnlyActiveMedia = true
         qqsMediaHost.init(MediaHierarchyManager.LOCATION_QQS)
 
-        qsMediaHost.expansion = MediaHostState.EXPANDED
+        qsMediaHost.expansion = EXPANDED
         qsMediaHost.showsOnlyActiveMedia = false
         qsMediaHost.init(MediaHierarchyManager.LOCATION_QS)
     }
@@ -226,12 +209,6 @@
     shadeSession: SaveableSession,
     usingCollapsedLandscapeMedia: Boolean,
 ) {
-    val view = LocalView.current
-    LaunchedEffect(Unit) {
-        if (layoutState.currentTransition?.fromContent == Scenes.Gone) {
-            view.performHapticFeedback(HapticFeedbackConstants.GESTURE_START)
-        }
-    }
 
     val shadeMode by viewModel.shadeMode.collectAsStateWithLifecycle()
     when (shadeMode) {
@@ -296,11 +273,15 @@
 
     val shouldPunchHoleBehindScrim =
         layoutState.isTransitioningBetween(Scenes.Gone, Scenes.Shade) ||
-            layoutState.isTransitioningBetween(Scenes.Lockscreen, Scenes.Shade)
+            layoutState.isTransitioning(from = Scenes.Lockscreen, to = Scenes.Shade)
     // Media is visible and we are in landscape on a small height screen
     val mediaInRow = isMediaVisible && isLandscape()
     val mediaOffset by
-        animateSceneDpAsState(value = InQQS, key = MediaLandscapeTopOffset, canOverflow = false)
+        animateContentDpAsState(
+            value = QuickSettings.SharedValues.MediaOffset.inQqs(mediaInRow),
+            key = MediaLandscapeTopOffset,
+            canOverflow = false,
+        )
 
     val navBarHeight = WindowInsets.systemBars.asPaddingValues().calculateBottomPadding()
 
@@ -335,8 +316,7 @@
         modifier =
             modifier.thenIf(shouldPunchHoleBehindScrim) {
                 // Render the scene to an offscreen buffer so that BlendMode.DstOut only clears this
-                // scene
-                // (and not the one under it) during a scene transition.
+                // scene (and not the one under it) during a scene transition.
                 Modifier.graphicsLayer(compositingStrategy = CompositingStrategy.Offscreen)
             }
     ) {
@@ -388,8 +368,8 @@
                     stackScrollView = notificationStackScrollView,
                     viewModel = notificationsPlaceholderViewModel,
                     maxScrimTop = { maxNotifScrimTop.toFloat() },
-                    shadeMode = ShadeMode.Single,
                     shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim,
+                    supportNestedScrolling = true,
                     onEmptySpaceClick =
                         viewModel::onEmptySpaceClicked.takeIf { isEmptySpaceClickable },
                     modifier =
@@ -403,7 +383,8 @@
             modifier =
                 Modifier.align(Alignment.BottomCenter)
                     .height(navBarHeight)
-                    .pointerInteropFilter { true }
+                    // Intercepts touches, prevents the scrollable container behind from scrolling.
+                    .clickable(interactionSource = null, indication = null) { /* do nothing */ }
                     .verticalNestedScrollToScene(
                         topBehavior = NestedScrollBehavior.EdgeAlways,
                         isExternalOverscrollGesture = { false },
@@ -606,7 +587,7 @@
                     maxScrimTop = { 0f },
                     shouldPunchHoleBehindScrim = false,
                     shouldReserveSpaceForNavBar = false,
-                    shadeMode = ShadeMode.Split,
+                    supportNestedScrolling = false,
                     onEmptySpaceClick =
                         viewModel::onEmptySpaceClicked.takeIf { isEmptySpaceClickable },
                     modifier =
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/SingleShadeMeasurePolicy.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/SingleShadeMeasurePolicy.kt
index 6275ac3..352d29e2 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/SingleShadeMeasurePolicy.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/SingleShadeMeasurePolicy.kt
@@ -90,19 +90,28 @@
                 y = insetsTop + shadeHeaderPlaceable.height,
             )
 
-            if (isMediaInRow) {
-                mediaPlaceable?.placeRelative(
-                    x = insetsLeft + constraintsWithCutout.maxWidth / 2,
-                    y = mediaOffset() + insetsTop + shadeHeaderPlaceable.height,
-                    zIndex = mediaZIndex(),
-                )
-            } else {
-                mediaPlaceable?.placeRelative(
-                    x = insetsLeft,
-                    y = insetsTop + shadeHeaderPlaceable.height + quickSettingsPlaceable.height,
-                    zIndex = mediaZIndex(),
-                )
-            }
+            if (mediaPlaceable != null)
+                if (isMediaInRow) {
+                    // mediaPlaceable height ranges from 0 to qsHeight. We want it to be centered
+                    // vertically when it's smaller than the QS
+                    val mediaCenteringOffset =
+                        (quickSettingsPlaceable.height - mediaPlaceable.height) / 2
+                    mediaPlaceable.placeRelative(
+                        x = insetsLeft + constraintsWithCutout.maxWidth / 2,
+                        y =
+                            insetsTop +
+                                shadeHeaderPlaceable.height +
+                                mediaCenteringOffset +
+                                mediaOffset(),
+                        zIndex = mediaZIndex(),
+                    )
+                } else {
+                    mediaPlaceable.placeRelative(
+                        x = insetsLeft,
+                        y = insetsTop + shadeHeaderPlaceable.height + quickSettingsPlaceable.height,
+                        zIndex = mediaZIndex(),
+                    )
+                }
 
             // Notifications don't need to accommodate for horizontal insets
             notificationsPlaceable.placeRelative(x = 0, y = notificationsTop)
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt
index 9891025..085157a 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt
@@ -27,6 +27,7 @@
 import com.android.compose.animation.scene.content.state.TransitionState
 import com.android.compose.animation.scene.content.state.TransitionState.HasOverscrollProperties.Companion.DistanceUnspecified
 import com.android.compose.nestedscroll.PriorityNestedScrollConnection
+import com.android.compose.nestedscroll.SuspendedValue
 import kotlin.math.absoluteValue
 
 internal interface DraggableHandler {
@@ -54,9 +55,9 @@
     /**
      * Stop the current drag with the given [velocity].
      *
-     * @return the consumed [velocity]
+     * @return the consumed [velocity] when the animation complete
      */
-    fun onStop(velocity: Float, canChangeContent: Boolean): Float
+    fun onStop(velocity: Float, canChangeContent: Boolean): SuspendedValue<Float>
 }
 
 internal class DraggableHandlerImpl(
@@ -123,10 +124,6 @@
         overSlop: Float,
         pointersDown: Int,
     ): DragController {
-        if (startedPosition != null && layoutImpl.gestureFilter(startedPosition)) {
-            return NoOpDragController
-        }
-
         if (overSlop == 0f) {
             val oldDragController = dragController
             check(oldDragController != null && oldDragController.isDrivingTransition) {
@@ -188,39 +185,47 @@
         return createSwipeAnimation(layoutImpl, result, isUpOrLeft, orientation)
     }
 
+    internal fun resolveSwipeSource(startedPosition: Offset?): SwipeSource.Resolved? {
+        if (startedPosition == null) return null
+        return layoutImpl.swipeSourceDetector.source(
+            layoutSize = layoutImpl.lastSize,
+            position = startedPosition.round(),
+            density = layoutImpl.density,
+            orientation = orientation,
+        )
+    }
+
+    internal fun resolveSwipe(
+        pointersDown: Int,
+        fromSource: SwipeSource.Resolved?,
+        isUpOrLeft: Boolean,
+    ): Swipe.Resolved {
+        return Swipe.Resolved(
+            direction =
+                when (orientation) {
+                    Orientation.Horizontal ->
+                        if (isUpOrLeft) {
+                            SwipeDirection.Resolved.Left
+                        } else {
+                            SwipeDirection.Resolved.Right
+                        }
+
+                    Orientation.Vertical ->
+                        if (isUpOrLeft) {
+                            SwipeDirection.Resolved.Up
+                        } else {
+                            SwipeDirection.Resolved.Down
+                        }
+                },
+            pointerCount = pointersDown,
+            fromSource = fromSource,
+        )
+    }
+
     private fun computeSwipes(startedPosition: Offset?, pointersDown: Int): Swipes {
-        val fromSource =
-            startedPosition?.let { position ->
-                layoutImpl.swipeSourceDetector.source(
-                    layoutImpl.lastSize,
-                    position.round(),
-                    layoutImpl.density,
-                    orientation,
-                )
-            }
-
-        val upOrLeft =
-            Swipe.Resolved(
-                direction =
-                    when (orientation) {
-                        Orientation.Horizontal -> SwipeDirection.Resolved.Left
-                        Orientation.Vertical -> SwipeDirection.Resolved.Up
-                    },
-                pointerCount = pointersDown,
-                fromSource = fromSource,
-            )
-
-        val downOrRight =
-            Swipe.Resolved(
-                direction =
-                    when (orientation) {
-                        Orientation.Horizontal -> SwipeDirection.Resolved.Right
-                        Orientation.Vertical -> SwipeDirection.Resolved.Down
-                    },
-                pointerCount = pointersDown,
-                fromSource = fromSource,
-            )
-
+        val fromSource = resolveSwipeSource(startedPosition)
+        val upOrLeft = resolveSwipe(pointersDown, fromSource, isUpOrLeft = true)
+        val downOrRight = resolveSwipe(pointersDown, fromSource, isUpOrLeft = false)
         return if (fromSource == null) {
             Swipes(
                 upOrLeft = null,
@@ -360,10 +365,18 @@
             return 0f
         }
 
+        val currentTransitionIrreversible =
+            if (swipeAnimation.isUpOrLeft) {
+                swipes.upOrLeftResult?.isIrreversible ?: false
+            } else {
+                swipes.downOrRightResult?.isIrreversible ?: false
+            }
+
         val needNewTransition =
-            hasReachedToContent ||
-                result.toContent(layoutState.currentScene) != swipeAnimation.toContent ||
-                result.transitionKey != swipeAnimation.contentTransition.key
+            !currentTransitionIrreversible &&
+                (hasReachedToContent ||
+                    result.toContent(layoutState.currentScene) != swipeAnimation.toContent ||
+                    result.transitionKey != swipeAnimation.contentTransition.key)
 
         if (needNewTransition) {
             // Make sure the current transition will finish to the right current scene.
@@ -377,7 +390,7 @@
         return consumedDelta
     }
 
-    override fun onStop(velocity: Float, canChangeContent: Boolean): Float {
+    override fun onStop(velocity: Float, canChangeContent: Boolean): SuspendedValue<Float> {
         return onStop(velocity, canChangeContent, swipeAnimation)
     }
 
@@ -390,14 +403,14 @@
         // callbacks (like onAnimationCompleted()) might incorrectly finish a new transition that
         // replaced this one.
         swipeAnimation: SwipeAnimation<T>,
-    ): Float {
+    ): SuspendedValue<Float> {
         // The state was changed since the drag started; don't do anything.
         if (!isDrivingTransition || swipeAnimation.isAnimatingOffset()) {
-            return 0f
+            return { 0f }
         }
 
         val fromContent = swipeAnimation.fromContent
-        val consumedVelocity: Float
+        val consumedVelocity: SuspendedValue<Float>
         if (canChangeContent) {
             // If we are halfway between two contents, we check what the target will be based on the
             // velocity and offset of the transition, then we launch the animation.
@@ -549,6 +562,14 @@
 
     val connection: PriorityNestedScrollConnection = nestedScrollConnection()
 
+    private fun PointersInfo.resolveSwipe(isUpOrLeft: Boolean): Swipe.Resolved {
+        return draggableHandler.resolveSwipe(
+            pointersDown = pointersDown,
+            fromSource = draggableHandler.resolveSwipeSource(startedPosition),
+            isUpOrLeft = isUpOrLeft,
+        )
+    }
+
     private fun nestedScrollConnection(): PriorityNestedScrollConnection {
         // If we performed a long gesture before entering priority mode, we would have to avoid
         // moving on to the next scene.
@@ -565,36 +586,19 @@
             val transitionState = layoutState.transitionState
             val scene = transitionState.currentScene
             val fromScene = layoutImpl.scene(scene)
-            val nextScene =
+            val resolvedSwipe =
                 when {
-                    amount < 0f -> {
-                        val actionUpOrLeft =
-                            Swipe.Resolved(
-                                direction =
-                                    when (orientation) {
-                                        Orientation.Horizontal -> SwipeDirection.Resolved.Left
-                                        Orientation.Vertical -> SwipeDirection.Resolved.Up
-                                    },
-                                pointerCount = pointersInfo().pointersDown,
-                                fromSource = null,
-                            )
-                        fromScene.userActions[actionUpOrLeft]
-                    }
-                    amount > 0f -> {
-                        val actionDownOrRight =
-                            Swipe.Resolved(
-                                direction =
-                                    when (orientation) {
-                                        Orientation.Horizontal -> SwipeDirection.Resolved.Right
-                                        Orientation.Vertical -> SwipeDirection.Resolved.Down
-                                    },
-                                pointerCount = pointersInfo().pointersDown,
-                                fromSource = null,
-                            )
-                        fromScene.userActions[actionDownOrRight]
-                    }
+                    amount < 0f -> pointersInfo().resolveSwipe(isUpOrLeft = true)
+                    amount > 0f -> pointersInfo().resolveSwipe(isUpOrLeft = false)
                     else -> null
                 }
+            val nextScene =
+                resolvedSwipe?.let {
+                    fromScene.userActions[it]
+                        ?: if (it.fromSource != null) {
+                            fromScene.userActions[it.copy(fromSource = null)]
+                        } else null
+                }
             if (nextScene != null) return true
 
             if (transitionState !is TransitionState.Idle) return false
@@ -729,5 +733,5 @@
 private object NoOpDragController : DragController {
     override fun onDrag(delta: Float) = 0f
 
-    override fun onStop(velocity: Float, canChangeContent: Boolean) = 0f
+    override fun onStop(velocity: Float, canChangeContent: Boolean) = suspend { 0f }
 }
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MultiPointerDraggable.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MultiPointerDraggable.kt
index 0bb1d92..aa70a0c 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MultiPointerDraggable.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MultiPointerDraggable.kt
@@ -42,10 +42,8 @@
 import androidx.compose.ui.node.CompositionLocalConsumerModifierNode
 import androidx.compose.ui.node.DelegatingNode
 import androidx.compose.ui.node.ModifierNodeElement
-import androidx.compose.ui.node.ObserverModifierNode
 import androidx.compose.ui.node.PointerInputModifierNode
 import androidx.compose.ui.node.currentValueOf
-import androidx.compose.ui.node.observeReads
 import androidx.compose.ui.platform.LocalViewConfiguration
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.Velocity
@@ -79,7 +77,6 @@
 @Stable
 internal fun Modifier.multiPointerDraggable(
     orientation: Orientation,
-    enabled: () -> Boolean,
     startDragImmediately: (startedPosition: Offset) -> Boolean,
     onDragStarted: (startedPosition: Offset, overSlop: Float, pointersDown: Int) -> DragController,
     onFirstPointerDown: () -> Unit = {},
@@ -89,7 +86,6 @@
     this.then(
         MultiPointerDraggableElement(
             orientation,
-            enabled,
             startDragImmediately,
             onDragStarted,
             onFirstPointerDown,
@@ -100,7 +96,6 @@
 
 private data class MultiPointerDraggableElement(
     private val orientation: Orientation,
-    private val enabled: () -> Boolean,
     private val startDragImmediately: (startedPosition: Offset) -> Boolean,
     private val onDragStarted:
         (startedPosition: Offset, overSlop: Float, pointersDown: Int) -> DragController,
@@ -111,7 +106,6 @@
     override fun create(): MultiPointerDraggableNode =
         MultiPointerDraggableNode(
             orientation = orientation,
-            enabled = enabled,
             startDragImmediately = startDragImmediately,
             onDragStarted = onDragStarted,
             onFirstPointerDown = onFirstPointerDown,
@@ -121,7 +115,6 @@
 
     override fun update(node: MultiPointerDraggableNode) {
         node.orientation = orientation
-        node.enabled = enabled
         node.startDragImmediately = startDragImmediately
         node.onDragStarted = onDragStarted
         node.onFirstPointerDown = onFirstPointerDown
@@ -131,27 +124,23 @@
 
 internal class MultiPointerDraggableNode(
     orientation: Orientation,
-    enabled: () -> Boolean,
     var startDragImmediately: (startedPosition: Offset) -> Boolean,
     var onDragStarted:
         (startedPosition: Offset, overSlop: Float, pointersDown: Int) -> DragController,
     var onFirstPointerDown: () -> Unit,
-    var swipeDetector: SwipeDetector = DefaultSwipeDetector,
+    swipeDetector: SwipeDetector = DefaultSwipeDetector,
     private val dispatcher: NestedScrollDispatcher,
 ) :
     DelegatingNode(),
     PointerInputModifierNode,
     CompositionLocalConsumerModifierNode,
-    ObserverModifierNode,
     SpaceVectorConverter {
     private val pointerTracker = delegate(SuspendingPointerInputModifierNode { pointerTracker() })
     private val pointerInput = delegate(SuspendingPointerInputModifierNode { pointerInput() })
     private val velocityTracker = VelocityTracker()
-    private var previousEnabled: Boolean = false
 
-    var enabled: () -> Boolean = enabled
+    var swipeDetector: SwipeDetector = swipeDetector
         set(value) {
-            // Reset the pointer input whenever enabled changed.
             if (value != field) {
                 field = value
                 pointerInput.resetPointerInputHandler()
@@ -178,21 +167,6 @@
             }
         }
 
-    override fun onAttach() {
-        previousEnabled = enabled()
-        onObservedReadsChanged()
-    }
-
-    override fun onObservedReadsChanged() {
-        observeReads {
-            val newEnabled = enabled()
-            if (newEnabled != previousEnabled) {
-                pointerInput.resetPointerInputHandler()
-            }
-            previousEnabled = newEnabled
-        }
-    }
-
     override fun onCancelPointerInput() {
         pointerTracker.onCancelPointerInput()
         pointerInput.onCancelPointerInput()
@@ -213,8 +187,9 @@
 
     internal fun pointersInfo(): PointersInfo {
         return PointersInfo(
+            // This may be null, i.e. when the user uses TalkBack
             startedPosition = startedPosition,
-            // Note: We could have 0 pointers during fling or for other reasons.
+            // We could have 0 pointers during fling or for other reasons.
             pointersDown = pointersDown.coerceAtLeast(1),
         )
     }
@@ -253,9 +228,7 @@
                         velocityTracker.resetTracking()
                         velocityTracker.addPointerInputChange(firstPointerDown)
                         startedPosition = firstPointerDown.position
-                        if (enabled()) {
-                            onFirstPointerDown()
-                        }
+                        onFirstPointerDown()
                     }
 
                     // Changes with at least one pointer
@@ -294,10 +267,6 @@
     }
 
     private suspend fun PointerInputScope.pointerInput() {
-        if (!enabled()) {
-            return
-        }
-
         val currentContext = currentCoroutineContext()
         awaitPointerEventScope {
             while (currentContext.isActive) {
@@ -325,13 +294,17 @@
                                             velocityTracker.calculateVelocity(maxVelocity)
                                         }
                                         .toFloat(),
-                                onFling = { controller.onStop(it, canChangeContent = true) },
+                                onFling = {
+                                    controller.onStop(it, canChangeContent = true).invoke()
+                                },
                             )
                         },
                         onDragCancel = { controller ->
                             startFlingGesture(
                                 initialVelocity = 0f,
-                                onFling = { controller.onStop(it, canChangeContent = true) },
+                                onFling = {
+                                    controller.onStop(it, canChangeContent = true).invoke()
+                                },
                             )
                         },
                         swipeDetector = swipeDetector,
@@ -353,7 +326,10 @@
      *
      * Note: Inspired by [androidx.compose.foundation.gestures.ScrollableNode.onDragStopped]
      */
-    private fun startFlingGesture(initialVelocity: Float, onFling: (velocity: Float) -> Float) {
+    private fun startFlingGesture(
+        initialVelocity: Float,
+        onFling: suspend (velocity: Float) -> Float,
+    ) {
         // Note: [AwaitPointerEventScope] is annotated as @RestrictsSuspension, we need another
         // CoroutineScope to run the fling gestures.
         // We do not need to cancel this [Job], the source will take care of emitting an
@@ -415,7 +391,7 @@
      */
     private suspend inline fun dispatchFlingEvents(
         availableOnPreFling: Float,
-        onFling: (velocity: Float) -> Float,
+        onFling: suspend (velocity: Float) -> Float,
     ): Float {
         // PreFling phase
         val consumedByPreFling =
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
index 6e89814..c9a4d58 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
@@ -47,9 +47,6 @@
  * @param state the state of this layout.
  * @param swipeSourceDetector the edge detector used to detect which edge a swipe is started from,
  *   if any.
- * @param gestureFilter decides whether a drag gesture that started at the given start position
- *   should be filtered. If the lambda returns `true`, the drag gesture will be ignored. If it
- *   returns `false`, the drag gesture will be handled.
  * @param transitionInterceptionThreshold used during a scene transition. For the scene to be
  *   intercepted, the progress value must be above the threshold, and below (1 - threshold).
  * @param builder the configuration of the different scenes and overlays of this layout.
@@ -60,7 +57,6 @@
     modifier: Modifier = Modifier,
     swipeSourceDetector: SwipeSourceDetector = DefaultEdgeDetector,
     swipeDetector: SwipeDetector = DefaultSwipeDetector,
-    gestureFilter: (startedPosition: Offset) -> Boolean = DefaultGestureFilter,
     @FloatRange(from = 0.0, to = 0.5) transitionInterceptionThreshold: Float = 0.05f,
     builder: SceneTransitionLayoutScope.() -> Unit,
 ) {
@@ -69,7 +65,6 @@
         modifier,
         swipeSourceDetector,
         swipeDetector,
-        gestureFilter,
         transitionInterceptionThreshold,
         onLayoutImpl = null,
         builder,
@@ -503,6 +498,12 @@
      * bigger than 100% when the user released their finger. `
      */
     open val requiresFullDistanceSwipe: Boolean,
+
+    /**
+     * Whether swiping back in the opposite direction past the origin point of the swipe can replace
+     * the action with the action for the opposite direction.
+     */
+    open val isIrreversible: Boolean = false,
 ) {
     internal abstract fun toContent(currentScene: SceneKey): ContentKey
 
@@ -512,6 +513,7 @@
         val toScene: SceneKey,
         override val transitionKey: TransitionKey? = null,
         override val requiresFullDistanceSwipe: Boolean = false,
+        override val isIrreversible: Boolean = false,
     ) : UserActionResult(transitionKey, requiresFullDistanceSwipe) {
         override fun toContent(currentScene: SceneKey): ContentKey = toScene
     }
@@ -521,6 +523,7 @@
         val overlay: OverlayKey,
         override val transitionKey: TransitionKey? = null,
         override val requiresFullDistanceSwipe: Boolean = false,
+        override val isIrreversible: Boolean = false,
     ) : UserActionResult(transitionKey, requiresFullDistanceSwipe) {
         override fun toContent(currentScene: SceneKey): ContentKey = overlay
     }
@@ -563,7 +566,14 @@
              * the user released their finger.
              */
             requiresFullDistanceSwipe: Boolean = false,
-        ): UserActionResult = ChangeScene(toScene, transitionKey, requiresFullDistanceSwipe)
+
+            /**
+             * Whether swiping back in the opposite direction past the origin point of the swipe can
+             * replace the action with the action for the opposite direction.
+             */
+            isIrreversible: Boolean = false,
+        ): UserActionResult =
+            ChangeScene(toScene, transitionKey, requiresFullDistanceSwipe, isIrreversible)
 
         /** A [UserActionResult] that shows [toOverlay]. */
         operator fun invoke(
@@ -621,7 +631,6 @@
     modifier: Modifier = Modifier,
     swipeSourceDetector: SwipeSourceDetector = DefaultEdgeDetector,
     swipeDetector: SwipeDetector = DefaultSwipeDetector,
-    gestureFilter: (startedPosition: Offset) -> Boolean = DefaultGestureFilter,
     transitionInterceptionThreshold: Float = 0f,
     onLayoutImpl: ((SceneTransitionLayoutImpl) -> Unit)? = null,
     builder: SceneTransitionLayoutScope.() -> Unit,
@@ -638,7 +647,6 @@
                 transitionInterceptionThreshold = transitionInterceptionThreshold,
                 builder = builder,
                 animationScope = animationScope,
-                gestureFilter = gestureFilter,
             )
             .also { onLayoutImpl?.invoke(it) }
     }
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt
index 9e7be37..65c4043 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt
@@ -31,7 +31,6 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.ApproachLayoutModifierNode
 import androidx.compose.ui.layout.ApproachMeasureScope
 import androidx.compose.ui.layout.LookaheadScope
@@ -71,7 +70,6 @@
      * animations.
      */
     internal val animationScope: CoroutineScope,
-    internal val gestureFilter: (startedPosition: Offset) -> Boolean,
 ) {
     /**
      * The map of [Scene]s.
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitions.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitions.kt
index b358faf..879dc54 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitions.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitions.kt
@@ -152,6 +152,7 @@
         internal val DefaultSwipeSpec =
             spring(
                 stiffness = Spring.StiffnessMediumLow,
+                dampingRatio = Spring.DampingRatioLowBouncy,
                 visibilityThreshold = OffsetVisibilityThreshold,
             )
 
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt
index 84dce0d..205267d 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt
@@ -27,6 +27,7 @@
 import androidx.compose.ui.unit.IntSize
 import com.android.compose.animation.scene.content.state.TransitionState
 import com.android.compose.animation.scene.content.state.TransitionState.HasOverscrollProperties.Companion.DistanceUnspecified
+import com.android.compose.nestedscroll.SuspendedValue
 import kotlin.math.absoluteValue
 import kotlinx.coroutines.CompletableDeferred
 
@@ -321,7 +322,7 @@
         initialVelocity: Float,
         targetContent: T,
         spec: AnimationSpec<Float>? = null,
-    ): Float {
+    ): SuspendedValue<Float> {
         check(!isAnimatingOffset()) { "SwipeAnimation.animateOffset() can only be called once" }
 
         val initialProgress = progress
@@ -360,7 +361,7 @@
             currentContent = targetContent
         }
 
-        val startProgress =
+        val initialOffset =
             if (contentTransition.previewTransformationSpec != null && targetContent == toContent) {
                 0f
             } else {
@@ -368,7 +369,7 @@
             }
 
         val animatable =
-            Animatable(startProgress, OffsetVisibilityThreshold).also { offsetAnimation = it }
+            Animatable(initialOffset, OffsetVisibilityThreshold).also { offsetAnimation = it }
 
         check(isAnimatingOffset())
 
@@ -379,7 +380,7 @@
         if (skipAnimation) {
             // Unblock the job.
             offsetAnimationRunnable.complete(null)
-            return 0f
+            return { 0f }
         }
 
         val isTargetGreater = targetOffset > animatable.value
@@ -391,6 +392,8 @@
                 ?: contentTransition.transformationSpec.swipeSpec
                 ?: layoutState.transitions.defaultSwipeSpec
 
+        val velocityConsumed = CompletableDeferred<Float>()
+
         offsetAnimationRunnable.complete {
             try {
                 animatable.animateTo(
@@ -420,6 +423,9 @@
                             // Immediately stop this transition if we are bouncing on a content that
                             // does not bounce.
                             if (!contentTransition.isWithinProgressRange(progress)) {
+                                // We are no longer able to consume the velocity, the rest can be
+                                // consumed by another component in the hierarchy.
+                                velocityConsumed.complete(initialVelocity - velocity)
                                 throw SnapException()
                             }
                         }
@@ -427,11 +433,15 @@
                 }
             } catch (_: SnapException) {
                 /* Ignore. */
+            } finally {
+                if (!velocityConsumed.isCompleted) {
+                    // The animation consumed the whole available velocity
+                    velocityConsumed.complete(initialVelocity)
+                }
             }
         }
 
-        // This animation always consumes the whole available velocity
-        return initialVelocity
+        return { velocityConsumed.await() }
     }
 
     /** An exception thrown during the animation to stop it immediately. */
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeDetector.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeDetector.kt
index f758102..54ee783 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeDetector.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeDetector.kt
@@ -17,7 +17,6 @@
 package com.android.compose.animation.scene
 
 import androidx.compose.runtime.Stable
-import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.input.pointer.PointerInputChange
 
 /** {@link SwipeDetector} helps determine whether a swipe gestured has occurred. */
@@ -32,8 +31,6 @@
 
 val DefaultSwipeDetector = PassthroughSwipeDetector()
 
-val DefaultGestureFilter = { _: Offset -> false }
-
 /** An {@link SwipeDetector} implementation that recognizes a swipe on any input. */
 class PassthroughSwipeDetector : SwipeDetector {
     override fun detectSwipe(change: PointerInputChange): Boolean {
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt
index 98d4aaa..061583a 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt
@@ -41,22 +41,62 @@
     draggableHandler: DraggableHandlerImpl,
     swipeDetector: SwipeDetector,
 ): Modifier {
-    return this.then(SwipeToSceneElement(draggableHandler, swipeDetector))
+    return if (draggableHandler.enabled()) {
+        this.then(SwipeToSceneElement(draggableHandler, swipeDetector))
+    } else {
+        this
+    }
+}
+
+private fun DraggableHandlerImpl.enabled(): Boolean {
+    return isDrivingTransition || contentForSwipes().shouldEnableSwipes(orientation)
+}
+
+private fun DraggableHandlerImpl.contentForSwipes(): Content {
+    return layoutImpl.contentForUserActions()
+}
+
+/** Whether swipe should be enabled in the given [orientation]. */
+private fun Content.shouldEnableSwipes(orientation: Orientation): Boolean {
+    if (userActions.isEmpty()) {
+        return false
+    }
+
+    return userActions.keys.any { it is Swipe.Resolved && it.direction.orientation == orientation }
 }
 
 private data class SwipeToSceneElement(
     val draggableHandler: DraggableHandlerImpl,
     val swipeDetector: SwipeDetector,
-) : ModifierNodeElement<SwipeToSceneNode>() {
-    override fun create(): SwipeToSceneNode = SwipeToSceneNode(draggableHandler, swipeDetector)
+) : ModifierNodeElement<SwipeToSceneRootNode>() {
+    override fun create(): SwipeToSceneRootNode =
+        SwipeToSceneRootNode(draggableHandler, swipeDetector)
 
-    override fun update(node: SwipeToSceneNode) {
-        node.draggableHandler = draggableHandler
+    override fun update(node: SwipeToSceneRootNode) {
+        node.update(draggableHandler, swipeDetector)
+    }
+}
+
+private class SwipeToSceneRootNode(
+    draggableHandler: DraggableHandlerImpl,
+    swipeDetector: SwipeDetector,
+) : DelegatingNode() {
+    private var delegate = delegate(SwipeToSceneNode(draggableHandler, swipeDetector))
+
+    fun update(draggableHandler: DraggableHandlerImpl, swipeDetector: SwipeDetector) {
+        if (draggableHandler == delegate.draggableHandler) {
+            // Simple update, just update the swipe detector directly and keep the node.
+            delegate.swipeDetector = swipeDetector
+        } else {
+            // The draggableHandler changed, force recreate the underlying SwipeToSceneNode.
+            undelegate(delegate)
+            delegate = delegate(SwipeToSceneNode(draggableHandler, swipeDetector))
+        }
     }
 }
 
 private class SwipeToSceneNode(
-    draggableHandler: DraggableHandlerImpl,
+    val draggableHandler: DraggableHandlerImpl,
     swipeDetector: SwipeDetector,
 ) : DelegatingNode(), PointerInputModifierNode {
     private val dispatcher = NestedScrollDispatcher()
@@ -64,7 +104,6 @@
         delegate(
             MultiPointerDraggableNode(
                 orientation = draggableHandler.orientation,
-                enabled = ::enabled,
                 startDragImmediately = ::startDragImmediately,
                 onDragStarted = draggableHandler::onDragStarted,
                 onFirstPointerDown = ::onFirstPointerDown,
@@ -73,18 +112,10 @@
             )
         )
 
-    private var _draggableHandler = draggableHandler
-    var draggableHandler: DraggableHandlerImpl
-        get() = _draggableHandler
+    var swipeDetector: SwipeDetector
+        get() = multiPointerDraggableNode.swipeDetector
         set(value) {
-            if (_draggableHandler != value) {
-                _draggableHandler = value
-
-                // Make sure to update the delegate orientation. Note that this will automatically
-                // reset the underlying pointer input handler, so previous gestures will be
-                // cancelled.
-                multiPointerDraggableNode.orientation = value.orientation
-            }
+            multiPointerDraggableNode.swipeDetector = value
         }
 
     private val nestedScrollHandlerImpl =
@@ -124,22 +155,6 @@
 
     override fun onCancelPointerInput() = multiPointerDraggableNode.onCancelPointerInput()
 
-    private fun enabled(): Boolean {
-        return draggableHandler.isDrivingTransition ||
-            contentForSwipes().shouldEnableSwipes(multiPointerDraggableNode.orientation)
-    }
-
-    private fun contentForSwipes(): Content {
-        return draggableHandler.layoutImpl.contentForUserActions()
-    }
-
-    /** Whether swipe should be enabled in the given [orientation]. */
-    private fun Content.shouldEnableSwipes(orientation: Orientation): Boolean {
-        return userActions.keys.any {
-            it is Swipe.Resolved && it.direction.orientation == orientation
-        }
-    }
-
     private fun startDragImmediately(startedPosition: Offset): Boolean {
         // Immediately start the drag if the user can't swipe in the other direction and the gesture
         // handler can intercept it.
@@ -152,7 +167,7 @@
                 Orientation.Vertical -> Orientation.Horizontal
                 Orientation.Horizontal -> Orientation.Vertical
             }
-        return contentForSwipes().shouldEnableSwipes(oppositeOrientation)
+        return draggableHandler.contentForSwipes().shouldEnableSwipes(oppositeOrientation)
     }
 }
 
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt
index ae3169b..4ae3235 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt
@@ -72,6 +72,6 @@
             amountConsumed
         },
         // Don't consume the velocity on pre/post fling
-        onStop = { 0f },
+        onStop = { { 0f } },
     )
 }
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt
index 16fb533b..a3641e6 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt
@@ -24,6 +24,8 @@
 import com.android.compose.ui.util.SpaceVectorConverter
 import kotlin.math.sign
 
+internal typealias SuspendedValue<T> = suspend () -> T
+
 /**
  * This [NestedScrollConnection] waits for a child to scroll ([onPreScroll] or [onPostScroll]), and
  * then decides (via [canStartPreScroll] or [canStartPostScroll]) if it should take over scrolling.
@@ -32,71 +34,76 @@
  * Note: Call [reset] before destroying this object to make sure you always get a call to [onStop]
  * after [onStart].
  *
- * @sample com.android.compose.animation.scene.rememberSwipeToSceneNestedScrollConnection
+ * @sample LargeTopAppBarNestedScrollConnection
+ * @sample com.android.compose.animation.scene.NestedScrollHandlerImpl.nestedScrollConnection
  */
 class PriorityNestedScrollConnection(
-    private val canStartPreScroll: (offsetAvailable: Offset, offsetBeforeStart: Offset) -> Boolean,
-    private val canStartPostScroll: (offsetAvailable: Offset, offsetBeforeStart: Offset) -> Boolean,
-    private val canStartPostFling: (velocityAvailable: Velocity) -> Boolean,
+    orientation: Orientation,
+    private val canStartPreScroll: (offsetAvailable: Float, offsetBeforeStart: Float) -> Boolean,
+    private val canStartPostScroll: (offsetAvailable: Float, offsetBeforeStart: Float) -> Boolean,
+    private val canStartPostFling: (velocityAvailable: Float) -> Boolean,
     private val canContinueScroll: (source: NestedScrollSource) -> Boolean,
     private val canScrollOnFling: Boolean,
-    private val onStart: (offsetAvailable: Offset) -> Unit,
-    private val onScroll: (offsetAvailable: Offset) -> Offset,
-    private val onStop: (velocityAvailable: Velocity) -> Velocity,
-) : NestedScrollConnection {
+    private val onStart: (offsetAvailable: Float) -> Unit,
+    private val onScroll: (offsetAvailable: Float) -> Float,
+    private val onStop: (velocityAvailable: Float) -> SuspendedValue<Float>,
+) : NestedScrollConnection, SpaceVectorConverter by SpaceVectorConverter(orientation) {
 
     /** In priority mode [onPreScroll] events are first consumed by the parent, via [onScroll]. */
     private var isPriorityMode = false
 
-    private var offsetScrolledBeforePriorityMode = Offset.Zero
+    private var offsetScrolledBeforePriorityMode = 0f
 
     override fun onPostScroll(
         consumed: Offset,
         available: Offset,
         source: NestedScrollSource,
     ): Offset {
+        val availableFloat = available.toFloat()
         // The offset before the start takes into account the up and down movements, starting from
         // the beginning or from the last fling gesture.
-        val offsetBeforeStart = offsetScrolledBeforePriorityMode - available
+        val offsetBeforeStart = offsetScrolledBeforePriorityMode - availableFloat
 
         if (
             isPriorityMode ||
                 (source == NestedScrollSource.SideEffect && !canScrollOnFling) ||
-                !canStartPostScroll(available, offsetBeforeStart)
+                !canStartPostScroll(availableFloat, offsetBeforeStart)
         ) {
             // The priority mode cannot start so we won't consume the available offset.
             return Offset.Zero
         }
 
-        return onPriorityStart(available)
+        return onPriorityStart(availableFloat).toOffset()
     }
 
     override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
         if (!isPriorityMode) {
             if (source == NestedScrollSource.UserInput || canScrollOnFling) {
-                if (canStartPreScroll(available, offsetScrolledBeforePriorityMode)) {
-                    return onPriorityStart(available)
+                val availableFloat = available.toFloat()
+                if (canStartPreScroll(availableFloat, offsetScrolledBeforePriorityMode)) {
+                    return onPriorityStart(availableFloat).toOffset()
                 }
                 // We want to track the amount of offset consumed before entering priority mode
-                offsetScrolledBeforePriorityMode += available
+                offsetScrolledBeforePriorityMode += availableFloat
             }
 
             return Offset.Zero
         }
 
+        val availableFloat = available.toFloat()
         if (!canContinueScroll(source)) {
             // Step 3a: We have lost priority and we no longer need to intercept scroll events.
-            onPriorityStop(velocity = Velocity.Zero)
+            onPriorityStop(velocity = 0f)
 
-            // We've just reset offsetScrolledBeforePriorityMode to Offset.Zero
+            // We've just reset offsetScrolledBeforePriorityMode to 0f
             // We want to track the amount of offset consumed before entering priority mode
-            offsetScrolledBeforePriorityMode += available
+            offsetScrolledBeforePriorityMode += availableFloat
 
             return Offset.Zero
         }
 
         // Step 2: We have the priority and can consume the scroll events.
-        return onScroll(available)
+        return onScroll(availableFloat).toOffset()
     }
 
     override suspend fun onPreFling(available: Velocity): Velocity {
@@ -106,15 +113,16 @@
         }
         // Step 3b: The finger is lifted, we can stop intercepting scroll events and use the speed
         // of the fling gesture.
-        return onPriorityStop(velocity = available)
+        return onPriorityStop(velocity = available.toFloat()).invoke().toVelocity()
     }
 
     override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+        val availableFloat = available.toFloat()
         if (isPriorityMode) {
-            return onPriorityStop(velocity = available)
+            return onPriorityStop(velocity = availableFloat).invoke().toVelocity()
         }
 
-        if (!canStartPostFling(available)) {
+        if (!canStartPostFling(availableFloat)) {
             return Velocity.Zero
         }
 
@@ -122,11 +130,11 @@
         // given the available velocity.
         // TODO(b/291053278): Remove canStartPostFling() and instead make it possible to define the
         // overscroll behavior on the Scene level.
-        val smallOffset = Offset(available.x.sign, available.y.sign)
-        onPriorityStart(available = smallOffset)
+        val smallOffset = availableFloat.sign
+        onPriorityStart(availableOffset = smallOffset)
 
         // This is the last event of a scroll gesture.
-        return onPriorityStop(available)
+        return onPriorityStop(availableFloat).invoke().toVelocity()
     }
 
     /**
@@ -136,10 +144,10 @@
      */
     fun reset() {
         // Step 3c: To ensure that an onStop is always called for every onStart.
-        onPriorityStop(velocity = Velocity.Zero)
+        onPriorityStop(velocity = 0f)
     }
 
-    private fun onPriorityStart(available: Offset): Offset {
+    private fun onPriorityStart(availableOffset: Float): Float {
         if (isPriorityMode) {
             error("This should never happen, onPriorityStart() was called when isPriorityMode")
         }
@@ -150,17 +158,17 @@
 
         // Note: onStop will be called if we cannot continue to scroll (step 3a), or the finger is
         // lifted (step 3b), or this object has been destroyed (step 3c).
-        onStart(available)
+        onStart(availableOffset)
 
-        return onScroll(available)
+        return onScroll(availableOffset)
     }
 
-    private fun onPriorityStop(velocity: Velocity): Velocity {
+    private fun onPriorityStop(velocity: Float): SuspendedValue<Float> {
         // We can restart tracking the consumed offsets from scratch.
-        offsetScrolledBeforePriorityMode = Offset.Zero
+        offsetScrolledBeforePriorityMode = 0f
 
         if (!isPriorityMode) {
-            return Velocity.Zero
+            return { 0f }
         }
 
         isPriorityMode = false
@@ -168,37 +176,3 @@
         return onStop(velocity)
     }
 }
-
-fun PriorityNestedScrollConnection(
-    orientation: Orientation,
-    canStartPreScroll: (offsetAvailable: Float, offsetBeforeStart: Float) -> Boolean,
-    canStartPostScroll: (offsetAvailable: Float, offsetBeforeStart: Float) -> Boolean,
-    canStartPostFling: (velocityAvailable: Float) -> Boolean,
-    canContinueScroll: (source: NestedScrollSource) -> Boolean,
-    canScrollOnFling: Boolean,
-    onStart: (offsetAvailable: Float) -> Unit,
-    onScroll: (offsetAvailable: Float) -> Float,
-    onStop: (velocityAvailable: Float) -> Float,
-) =
-    with(SpaceVectorConverter(orientation)) {
-        PriorityNestedScrollConnection(
-            canStartPreScroll = { offsetAvailable: Offset, offsetBeforeStart: Offset ->
-                canStartPreScroll(offsetAvailable.toFloat(), offsetBeforeStart.toFloat())
-            },
-            canStartPostScroll = { offsetAvailable: Offset, offsetBeforeStart: Offset ->
-                canStartPostScroll(offsetAvailable.toFloat(), offsetBeforeStart.toFloat())
-            },
-            canStartPostFling = { velocityAvailable: Velocity ->
-                canStartPostFling(velocityAvailable.toFloat())
-            },
-            canContinueScroll = canContinueScroll,
-            canScrollOnFling = canScrollOnFling,
-            onStart = { offsetAvailable -> onStart(offsetAvailable.toFloat()) },
-            onScroll = { offsetAvailable: Offset ->
-                onScroll(offsetAvailable.toFloat()).toOffset()
-            },
-            onStop = { velocityAvailable: Velocity ->
-                onStop(velocityAvailable.toFloat()).toVelocity()
-            },
-        )
-    }
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt
index b64b8be..ecef6be 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt
@@ -39,6 +39,7 @@
 import com.android.compose.animation.scene.content.state.TransitionState
 import com.android.compose.animation.scene.content.state.TransitionState.Transition
 import com.android.compose.animation.scene.subjects.assertThat
+import com.android.compose.nestedscroll.SuspendedValue
 import com.android.compose.test.MonotonicClockTestScope
 import com.android.compose.test.runMonotonicClockTest
 import com.android.compose.test.transition
@@ -108,8 +109,6 @@
 
         val transitionInterceptionThreshold = 0.05f
 
-        var gestureFilter: (startedPosition: Offset) -> Boolean = DefaultGestureFilter
-
         private val layoutImpl =
             SceneTransitionLayoutImpl(
                     state = layoutState,
@@ -122,13 +121,16 @@
                     // Use testScope and not backgroundScope here because backgroundScope does not
                     // work well with advanceUntilIdle(), which is used by some tests.
                     animationScope = testScope,
-                    gestureFilter = { startedPosition -> gestureFilter.invoke(startedPosition) },
                 )
                 .apply { setContentsAndLayoutTargetSizeForTest(LAYOUT_SIZE) }
 
         val draggableHandler = layoutImpl.draggableHandler(Orientation.Vertical)
         val horizontalDraggableHandler = layoutImpl.draggableHandler(Orientation.Horizontal)
 
+        var pointerInfoOwner: () -> PointersInfo = {
+            PointersInfo(startedPosition = Offset.Zero, pointersDown = 1)
+        }
+
         fun nestedScrollConnection(
             nestedScrollBehavior: NestedScrollBehavior,
             isExternalOverscrollGesture: Boolean = false,
@@ -139,9 +141,7 @@
                     topOrLeftBehavior = nestedScrollBehavior,
                     bottomOrRightBehavior = nestedScrollBehavior,
                     isExternalOverscrollGesture = { isExternalOverscrollGesture },
-                    pointersInfoOwner = {
-                        PointersInfo(startedPosition = Offset.Zero, pointersDown = 1)
-                    },
+                    pointersInfoOwner = { pointerInfoOwner() },
                 )
                 .connection
 
@@ -155,11 +155,18 @@
 
         fun downOffset(fractionOfScreen: Float) =
             if (fractionOfScreen < 0f) {
-                error("upOffset() is required, not implemented yet")
+                error("use upOffset()")
             } else {
                 Offset(x = 0f, y = down(fractionOfScreen))
             }
 
+        fun upOffset(fractionOfScreen: Float) =
+            if (fractionOfScreen < 0f) {
+                error("use downOffset()")
+            } else {
+                Offset(x = 0f, y = up(fractionOfScreen))
+            }
+
         val transitionState: TransitionState
             get() = layoutState.transitionState
 
@@ -253,13 +260,35 @@
             assertThat(consumed).isEqualTo(expectedConsumed)
         }
 
-        fun DragController.onDragStopped(
+        suspend fun DragController.onDragStoppedAnimateNow(
             velocity: Float,
             canChangeScene: Boolean = true,
-            expectedConsumed: Boolean = true,
+            onAnimationStart: () -> Unit,
+            onAnimationEnd: (Float) -> Unit,
         ) {
-            val consumed = onStop(velocity, canChangeScene)
-            assertThat(consumed).isEqualTo(if (expectedConsumed) velocity else 0f)
+            val velocityConsumed = onDragStoppedAnimateLater(velocity, canChangeScene)
+            onAnimationStart()
+            onAnimationEnd(velocityConsumed.invoke())
+        }
+
+        suspend fun DragController.onDragStoppedAnimateNow(
+            velocity: Float,
+            canChangeScene: Boolean = true,
+            onAnimationStart: () -> Unit,
+            expectedConsumedVelocity: Float,
+        ) =
+            onDragStoppedAnimateNow(
+                velocity = velocity,
+                canChangeScene = canChangeScene,
+                onAnimationStart = onAnimationStart,
+                onAnimationEnd = { assertThat(it).isEqualTo(expectedConsumedVelocity) },
+            )
+
+        fun DragController.onDragStoppedAnimateLater(
+            velocity: Float,
+            canChangeScene: Boolean = true,
+        ): SuspendedValue<Float> {
+            return onStop(velocity, canChangeScene)
         }
 
         fun NestedScrollConnection.scroll(
@@ -320,13 +349,6 @@
     }
 
     @Test
-    fun onDragStarted_doesNotStartTransition_whenGestureFiltered() = runGestureTest {
-        gestureFilter = { _ -> true }
-        onDragStarted(overSlop = down(fractionOfScreen = 0.1f), expectedConsumedOverSlop = 0f)
-        assertIdle(currentScene = SceneA)
-    }
-
-    @Test
     fun afterSceneTransitionIsStarted_interceptDragEvents() = runGestureTest {
         val dragController = onDragStarted(overSlop = down(fractionOfScreen = 0.1f))
         assertTransition(currentScene = SceneA)
@@ -341,11 +363,12 @@
         val dragController = onDragStarted(overSlop = down(fractionOfScreen = 0.1f))
         assertTransition(currentScene = SceneA)
 
-        dragController.onDragStopped(velocity = velocityThreshold - 0.01f)
-        assertTransition(currentScene = SceneA)
+        dragController.onDragStoppedAnimateNow(
+            velocity = velocityThreshold - 0.01f,
+            onAnimationStart = { assertTransition(currentScene = SceneA) },
+            expectedConsumedVelocity = velocityThreshold - 0.01f,
+        )
 
-        // wait for the stop animation
-        advanceUntilIdle()
         assertIdle(currentScene = SceneA)
     }
 
@@ -359,19 +382,21 @@
             val dragController = onDragStarted(overSlop = down(fractionOfScreen = 0.1f))
             assertTransition(currentScene = SceneA)
 
-            dragController.onDragStopped(velocity = velocityThreshold - 0.01f)
-            runCurrent()
-
-            // verify that transition remains in preview stage and animates back to fromScene
-            assertTransition(
-                currentScene = SceneA,
-                isInPreviewStage = true,
-                previewProgress = 0.1f,
-                progress = 0f,
+            dragController.onDragStoppedAnimateNow(
+                velocity = velocityThreshold - 0.01f,
+                onAnimationStart = {
+                    // verify that transition remains in preview stage and animates back to
+                    // fromScene
+                    assertTransition(
+                        currentScene = SceneA,
+                        isInPreviewStage = true,
+                        previewProgress = 0.1f,
+                        progress = 0f,
+                    )
+                },
+                expectedConsumedVelocity = velocityThreshold - 0.01f,
             )
 
-            // wait for the stop animation
-            advanceUntilIdle()
             assertIdle(currentScene = SceneA)
         }
 
@@ -380,11 +405,11 @@
         val dragController = onDragStarted(overSlop = down(fractionOfScreen = 0.1f))
         assertTransition(currentScene = SceneA)
 
-        dragController.onDragStopped(velocity = velocityThreshold)
-        assertTransition(currentScene = SceneC)
-
-        // wait for the stop animation
-        advanceUntilIdle()
+        dragController.onDragStoppedAnimateNow(
+            velocity = velocityThreshold,
+            onAnimationStart = { assertTransition(currentScene = SceneC) },
+            expectedConsumedVelocity = velocityThreshold,
+        )
         assertIdle(currentScene = SceneC)
     }
 
@@ -393,8 +418,11 @@
         val dragController = onDragStarted(overSlop = down(fractionOfScreen = 0.1f))
         assertTransition(currentScene = SceneA)
 
-        dragController.onDragStopped(velocity = 0f)
-        advanceUntilIdle()
+        dragController.onDragStoppedAnimateNow(
+            velocity = 0f,
+            onAnimationStart = { assertTransition(currentScene = SceneA) },
+            expectedConsumedVelocity = 0f,
+        )
         assertIdle(currentScene = SceneA)
     }
 
@@ -419,11 +447,13 @@
         )
 
         // After the drag stopped scene C should be committed
-        dragController.onDragStopped(velocity = velocityThreshold)
-        assertTransition(currentScene = SceneC, fromScene = SceneA, toScene = SceneC)
-
-        // wait for the stop animation
-        advanceUntilIdle()
+        dragController.onDragStoppedAnimateNow(
+            velocity = velocityThreshold,
+            onAnimationStart = {
+                assertTransition(currentScene = SceneC, fromScene = SceneA, toScene = SceneC)
+            },
+            expectedConsumedVelocity = velocityThreshold,
+        )
         assertIdle(currentScene = SceneC)
     }
 
@@ -477,6 +507,54 @@
     }
 
     @Test
+    fun onDragWithActionsInBothDirections_dragToOppositeDirectionReplacesAction() = runGestureTest {
+        // We are on SceneA. UP -> B, DOWN-> C.
+        val dragController = onDragStarted(overSlop = up(fractionOfScreen = 0.2f))
+        assertTransition(
+            currentScene = SceneA,
+            fromScene = SceneA,
+            toScene = SceneB,
+            progress = 0.2f,
+        )
+
+        // Reverse drag direction, it will replace the previous transition
+        dragController.onDragDelta(pixels = down(fractionOfScreen = 0.5f))
+        assertTransition(
+            currentScene = SceneA,
+            fromScene = SceneA,
+            toScene = SceneC,
+            progress = 0.3f,
+        )
+    }
+
+    @Test
+    fun onDragWithActionsInBothDirections_dragToOppositeDirectionNotReplaceable() = runGestureTest {
+        // We are on SceneA. UP -> B, DOWN-> C. The up swipe is not replaceable though.
+        mutableUserActionsA =
+            mapOf(Swipe.Up to UserActionResult(SceneB, isIrreversible = true), Swipe.Down to SceneC)
+        val dragController =
+            onDragStarted(
+                startedPosition = Offset(SCREEN_SIZE * 0.5f, SCREEN_SIZE * 0.5f),
+                overSlop = up(fractionOfScreen = 0.2f),
+            )
+        assertTransition(
+            currentScene = SceneA,
+            fromScene = SceneA,
+            toScene = SceneB,
+            progress = 0.2f,
+        )
+
+        // Reverse drag direction, it cannot replace the previous transition
+        dragController.onDragDelta(pixels = down(fractionOfScreen = 0.5f))
+        assertTransition(
+            currentScene = SceneA,
+            fromScene = SceneA,
+            toScene = SceneB,
+            progress = -0.3f,
+        )
+    }
+
+    @Test
     fun onDragFromEdge_startTransitionToEdgeAction() = runGestureTest {
         navigateToSceneC()
 
@@ -511,12 +589,17 @@
         )
     }
 
-    private fun TestGestureScope.navigateToSceneC() {
+    private suspend fun TestGestureScope.navigateToSceneC() {
         assertIdle(currentScene = SceneA)
         val dragController = onDragStarted(overSlop = down(fractionOfScreen = 1f))
         assertTransition(currentScene = SceneA, fromScene = SceneA, toScene = SceneC)
-        dragController.onDragStopped(velocity = 0f)
-        advanceUntilIdle()
+        dragController.onDragStoppedAnimateNow(
+            velocity = 0f,
+            onAnimationStart = {
+                assertTransition(currentScene = SceneC, fromScene = SceneA, toScene = SceneC)
+            },
+            expectedConsumedVelocity = 0f,
+        )
         assertIdle(currentScene = SceneC)
     }
 
@@ -532,7 +615,7 @@
         )
 
         // Start animation A -> B with progress 0.2 -> 1.0
-        dragController1.onDragStopped(velocity = -velocityThreshold)
+        dragController1.onDragStoppedAnimateLater(velocity = -velocityThreshold)
         assertTransition(currentScene = SceneB, fromScene = SceneA, toScene = SceneB)
 
         // While at A -> B do a 100% screen drag (progress 1.2). This should go past B and change
@@ -547,11 +630,13 @@
         )
 
         // After the drag stopped scene C should be committed
-        dragController2.onDragStopped(velocity = -velocityThreshold)
-        assertTransition(currentScene = SceneC, fromScene = SceneB, toScene = SceneC)
-
-        // wait for the stop animation
-        advanceUntilIdle()
+        dragController2.onDragStoppedAnimateNow(
+            velocity = -velocityThreshold,
+            onAnimationStart = {
+                assertTransition(currentScene = SceneC, fromScene = SceneB, toScene = SceneC)
+            },
+            expectedConsumedVelocity = -velocityThreshold,
+        )
         assertIdle(currentScene = SceneC)
     }
 
@@ -559,7 +644,7 @@
     fun onAcceleratedScrollBothTargetsBecomeNull_settlesToIdle() = runGestureTest {
         val dragController1 = onDragStarted(overSlop = up(fractionOfScreen = 0.2f))
         dragController1.onDragDelta(pixels = up(fractionOfScreen = 0.2f))
-        dragController1.onDragStopped(velocity = -velocityThreshold)
+        dragController1.onDragStoppedAnimateLater(velocity = -velocityThreshold)
         assertTransition(currentScene = SceneB, fromScene = SceneA, toScene = SceneB)
 
         mutableUserActionsA = emptyMap()
@@ -573,14 +658,24 @@
         // here onDragStopped is already triggered, but subsequent onDelta/onDragStopped calls may
         // still be called. Make sure that they don't crash or change the scene
         dragController2.onDragDelta(pixels = up(fractionOfScreen = 0.5f), expectedConsumed = 0f)
-        dragController2.onDragStopped(velocity = 0f)
+        dragController2.onDragStoppedAnimateNow(
+            velocity = 0f,
+            onAnimationStart = {
+                assertTransition(currentScene = SceneB, fromScene = SceneA, toScene = SceneB)
+            },
+            expectedConsumedVelocity = 0f,
+        )
 
         advanceUntilIdle()
         assertIdle(SceneB)
 
         // These events can still come in after the animation has settled
         dragController2.onDragDelta(pixels = up(fractionOfScreen = 0.5f), expectedConsumed = 0f)
-        dragController2.onDragStopped(velocity = 0f)
+        dragController2.onDragStoppedAnimateNow(
+            velocity = 0f,
+            onAnimationStart = { assertIdle(SceneB) },
+            expectedConsumedVelocity = 0f,
+        )
         assertIdle(SceneB)
     }
 
@@ -593,8 +688,15 @@
         dragController1.onDragDelta(pixels = up(fractionOfScreen = 0.1f))
         // target stays B even though UserActions changed
         assertTransition(fromScene = SceneA, toScene = SceneB, progress = 0.2f)
-        dragController1.onDragStopped(velocity = down(fractionOfScreen = 0.1f))
-        advanceUntilIdle()
+
+        dragController1.onDragStoppedAnimateNow(
+            velocity = down(fractionOfScreen = 0.1f),
+            onAnimationStart = {
+                assertTransition(fromScene = SceneA, toScene = SceneB, progress = 0.2f)
+            },
+            expectedConsumedVelocity = down(fractionOfScreen = 0.1f),
+        )
+        assertIdle(SceneA)
 
         // now target changed to C for new drag
         onDragStarted(overSlop = up(fractionOfScreen = 0.1f))
@@ -608,7 +710,7 @@
 
         mutableUserActionsA += Swipe.Up to UserActionResult(SceneC)
         dragController1.onDragDelta(pixels = up(fractionOfScreen = 0.1f))
-        dragController1.onDragStopped(velocity = down(fractionOfScreen = 0.1f))
+        dragController1.onDragStoppedAnimateLater(velocity = down(fractionOfScreen = 0.1f))
 
         // now target changed to C for new drag that started before previous drag settled to Idle
         val dragController2 = onDragStartedImmediately()
@@ -621,7 +723,7 @@
         val dragController = onDragStarted(overSlop = down(fractionOfScreen = 0.1f))
         assertTransition(currentScene = SceneA)
 
-        dragController.onDragStopped(velocity = velocityThreshold)
+        dragController.onDragStoppedAnimateLater(velocity = velocityThreshold)
         runCurrent()
 
         assertTransition(currentScene = SceneC)
@@ -907,7 +1009,11 @@
         assertThat(progress).isEqualTo(0.2f)
 
         // this should be ignored, we are scrolling now!
-        dragController.onDragStopped(-velocityThreshold, expectedConsumed = false)
+        dragController.onDragStoppedAnimateNow(
+            velocity = -velocityThreshold,
+            onAnimationStart = { assertTransition(currentScene = SceneA) },
+            expectedConsumedVelocity = 0f,
+        )
         assertTransition(currentScene = SceneA)
 
         nestedScroll.scroll(available = -offsetY10)
@@ -1019,8 +1125,11 @@
 
         // Block the transition when the user release their finger.
         canChangeScene = { false }
-        dragController.onDragStopped(velocity = -velocityThreshold)
-        advanceUntilIdle()
+        dragController.onDragStoppedAnimateNow(
+            velocity = -velocityThreshold,
+            onAnimationStart = { assertTransition(fromScene = SceneA, toScene = SceneB) },
+            expectedConsumedVelocity = -velocityThreshold,
+        )
         assertIdle(SceneA)
     }
 
@@ -1031,7 +1140,7 @@
         // Swipe up to B.
         val dragController1 = onDragStarted(overSlop = up(0.1f))
         assertTransition(currentScene = SceneA, fromScene = SceneA, toScene = SceneB)
-        dragController1.onDragStopped(velocity = -velocityThreshold)
+        dragController1.onDragStoppedAnimateLater(velocity = -velocityThreshold)
         assertTransition(currentScene = SceneB, fromScene = SceneA, toScene = SceneB)
 
         // Intercept the transition and swipe down back to scene A.
@@ -1040,9 +1149,11 @@
 
         // Block the transition when the user release their finger.
         canChangeScene = { false }
-        dragController2.onDragStopped(velocity = velocityThreshold)
-
-        advanceUntilIdle()
+        dragController2.onDragStoppedAnimateNow(
+            velocity = velocityThreshold,
+            onAnimationStart = { assertTransition(fromScene = SceneA, toScene = SceneB) },
+            expectedConsumedVelocity = velocityThreshold,
+        )
         assertIdle(SceneB)
     }
 
@@ -1071,13 +1182,52 @@
     }
 
     @Test
+    fun nestedScrollUseFromSourceInfo() = runGestureTest {
+        // Start at scene C.
+        navigateToSceneC()
+        val nestedScroll = nestedScrollConnection(nestedScrollBehavior = EdgeAlways)
+
+        // Drag from the **top** of the screen
+        pointerInfoOwner = { PointersInfo(startedPosition = Offset(0f, 0f), pointersDown = 1) }
+        assertIdle(currentScene = SceneC)
+
+        nestedScroll.scroll(available = upOffset(fractionOfScreen = 0.1f))
+        assertTransition(
+            currentScene = SceneC,
+            fromScene = SceneC,
+            // userAction: Swipe.Up to SceneB
+            toScene = SceneB,
+            progress = 0.1f,
+        )
+
+        // Reset to SceneC
+        nestedScroll.preFling(Velocity.Zero)
+        advanceUntilIdle()
+
+        // Drag from the **bottom** of the screen
+        pointerInfoOwner = {
+            PointersInfo(startedPosition = Offset(0f, SCREEN_SIZE), pointersDown = 1)
+        }
+        assertIdle(currentScene = SceneC)
+
+        nestedScroll.scroll(available = upOffset(fractionOfScreen = 0.1f))
+        assertTransition(
+            currentScene = SceneC,
+            fromScene = SceneC,
+            // userAction: Swipe(SwipeDirection.Up, fromSource = Edge.Bottom) to SceneA
+            toScene = SceneA,
+            progress = 0.1f,
+        )
+    }
+
+    @Test
     fun transitionIsImmediatelyUpdatedWhenReleasingFinger() = runGestureTest {
         // Swipe up from the middle to transition to scene B.
         val middle = Offset(SCREEN_SIZE / 2f, SCREEN_SIZE / 2f)
         val dragController = onDragStarted(startedPosition = middle, overSlop = up(0.1f))
         assertTransition(fromScene = SceneA, toScene = SceneB, isUserInputOngoing = true)
 
-        dragController.onDragStopped(velocity = 0f)
+        dragController.onDragStoppedAnimateLater(velocity = 0f)
         assertTransition(isUserInputOngoing = false)
     }
 
@@ -1100,7 +1250,11 @@
         assertTransition(fromScene = SceneA, toScene = SceneB, progress = 1f)
 
         // Release the finger.
-        dragController.onDragStopped(velocity = -velocityThreshold, expectedConsumed = false)
+        dragController.onDragStoppedAnimateNow(
+            velocity = -velocityThreshold,
+            onAnimationStart = { assertTransition(fromScene = SceneA, toScene = SceneB) },
+            expectedConsumedVelocity = 0f,
+        )
 
         // Exhaust all coroutines *without advancing the clock*. Given that we are at progress >=
         // 100% and that the overscroll on scene B is doing nothing, we are already idle.
@@ -1109,10 +1263,34 @@
     }
 
     @Test
+    fun emptyOverscrollAbortsSettleAnimationAndExposeTheConsumedVelocity() = runGestureTest {
+        // Overscrolling on scene B does nothing.
+        layoutState.transitions = transitions { overscrollDisabled(SceneB, Orientation.Vertical) }
+
+        // Swipe up to scene B at progress = 200%.
+        val middle = Offset(SCREEN_SIZE / 2f, SCREEN_SIZE / 2f)
+        val dragController = onDragStarted(startedPosition = middle, overSlop = up(0.99f))
+        assertTransition(fromScene = SceneA, toScene = SceneB, progress = 0.99f)
+
+        // Release the finger.
+        dragController.onDragStoppedAnimateNow(
+            velocity = -velocityThreshold,
+            onAnimationStart = { assertTransition(fromScene = SceneA, toScene = SceneB) },
+            onAnimationEnd = { consumedVelocity ->
+                // Our progress value was 0.99f and it is coerced in `[0..1]` (overscrollDisabled).
+                // Some of the velocity will be used for animation, but not all of it.
+                assertThat(consumedVelocity).isLessThan(0f)
+                assertThat(consumedVelocity).isGreaterThan(-velocityThreshold)
+            },
+        )
+    }
+
+    @Test
     fun overscroll_releaseBetween0And100Percent_up() = runGestureTest {
         // Make scene B overscrollable.
         layoutState.transitions = transitions {
-            from(SceneA, to = SceneB) { spec = spring(dampingRatio = Spring.DampingRatioNoBouncy) }
+            defaultSwipeSpec = spring(dampingRatio = Spring.DampingRatioNoBouncy)
+            from(SceneA, to = SceneB) {}
             overscroll(SceneB, Orientation.Vertical) { fade(TestElements.Foo) }
         }
 
@@ -1125,8 +1303,13 @@
         assertThat(transition).hasProgress(0.5f)
 
         // Release to B.
-        dragController.onDragStopped(velocity = -velocityThreshold)
-        advanceUntilIdle()
+        dragController.onDragStoppedAnimateNow(
+            velocity = -velocityThreshold,
+            onAnimationStart = {
+                assertTransition(fromScene = SceneA, toScene = SceneB, progress = 0.5f)
+            },
+            expectedConsumedVelocity = -velocityThreshold,
+        )
 
         // We didn't overscroll at the end of the transition.
         assertIdle(SceneB)
@@ -1138,7 +1321,8 @@
     fun overscroll_releaseBetween0And100Percent_down() = runGestureTest {
         // Make scene C overscrollable.
         layoutState.transitions = transitions {
-            from(SceneA, to = SceneC) { spec = spring(dampingRatio = Spring.DampingRatioNoBouncy) }
+            defaultSwipeSpec = spring(dampingRatio = Spring.DampingRatioNoBouncy)
+            from(SceneA, to = SceneC) {}
             overscroll(SceneC, Orientation.Vertical) { fade(TestElements.Foo) }
         }
 
@@ -1151,8 +1335,13 @@
         assertThat(transition).hasProgress(0.5f)
 
         // Release to C.
-        dragController.onDragStopped(velocity = velocityThreshold)
-        advanceUntilIdle()
+        dragController.onDragStoppedAnimateNow(
+            velocity = velocityThreshold,
+            onAnimationStart = {
+                assertTransition(fromScene = SceneA, toScene = SceneC, progress = 0.5f)
+            },
+            expectedConsumedVelocity = velocityThreshold,
+        )
 
         // We didn't overscroll at the end of the transition.
         assertIdle(SceneC)
@@ -1177,8 +1366,13 @@
         assertThat(transition).hasProgress(1.5f)
 
         // Release to B.
-        dragController.onDragStopped(velocity = 0f)
-        advanceUntilIdle()
+        dragController.onDragStoppedAnimateNow(
+            velocity = 0f,
+            onAnimationStart = {
+                assertTransition(fromScene = SceneA, toScene = SceneB, progress = 1.5f)
+            },
+            expectedConsumedVelocity = 0f,
+        )
 
         // We kept the overscroll at 100% so that the placement logic didn't change at the end of
         // the animation.
@@ -1204,8 +1398,13 @@
         assertThat(transition).hasProgress(1.5f)
 
         // Release to C.
-        dragController.onDragStopped(velocity = 0f)
-        advanceUntilIdle()
+        dragController.onDragStoppedAnimateNow(
+            velocity = 0f,
+            onAnimationStart = {
+                assertTransition(fromScene = SceneA, toScene = SceneC, progress = 1.5f)
+            },
+            expectedConsumedVelocity = 0f,
+        )
 
         // We kept the overscroll at 100% so that the placement logic didn't change at the end of
         // the animation.
@@ -1232,8 +1431,13 @@
         assertThat(transition).hasProgress(-1f)
 
         // Release to A.
-        dragController.onDragStopped(velocity = 0f)
-        advanceUntilIdle()
+        dragController.onDragStoppedAnimateNow(
+            velocity = 0f,
+            onAnimationStart = {
+                assertTransition(fromScene = SceneA, toScene = SceneB, progress = -1f)
+            },
+            expectedConsumedVelocity = 0f,
+        )
 
         // We kept the overscroll at 100% so that the placement logic didn't change at the end of
         // the animation.
@@ -1260,8 +1464,13 @@
         assertThat(transition).hasProgress(-1f)
 
         // Release to A.
-        dragController.onDragStopped(velocity = 0f)
-        advanceUntilIdle()
+        dragController.onDragStoppedAnimateNow(
+            velocity = 0f,
+            onAnimationStart = {
+                assertTransition(fromScene = SceneA, toScene = SceneC, progress = -1f)
+            },
+            expectedConsumedVelocity = 0f,
+        )
 
         // We kept the overscroll at 100% so that the placement logic didn't change at the end of
         // the animation.
@@ -1284,7 +1493,7 @@
         // Intercept the transition and change the swipe distance. The original distance and
         // progress should be the same.
         swipeDistance = 50f
-        controller.onDragStopped(0f)
+        controller.onDragStoppedAnimateLater(0f)
         onDragStartedImmediately()
         assertTransition(fromScene = SceneA, toScene = SceneB, progress = 50f / 75f)
     }
@@ -1297,14 +1506,24 @@
         val controller = onDragStarted(overSlop = up(fractionOfScreen = 0.9f))
         assertTransition(fromScene = SceneA, toScene = SceneB, progress = 0.9f)
 
-        controller.onDragStopped(velocity = 0f)
-        advanceUntilIdle()
+        controller.onDragStoppedAnimateNow(
+            velocity = 0f,
+            onAnimationStart = {
+                assertTransition(fromScene = SceneA, toScene = SceneB, progress = 0.9f)
+            },
+            expectedConsumedVelocity = 0f,
+        )
         assertIdle(SceneA)
 
         val otherController = onDragStarted(overSlop = up(fractionOfScreen = 1f))
         assertTransition(fromScene = SceneA, toScene = SceneB, progress = 1f)
-        otherController.onDragStopped(velocity = 0f)
-        advanceUntilIdle()
+        otherController.onDragStoppedAnimateNow(
+            velocity = 0f,
+            onAnimationStart = {
+                assertTransition(fromScene = SceneA, toScene = SceneB, progress = 1f)
+            },
+            expectedConsumedVelocity = 0f,
+        )
         assertIdle(SceneB)
     }
 
@@ -1312,7 +1531,7 @@
     fun interceptingTransitionReplacesCurrentTransition() = runGestureTest {
         val controller = onDragStarted(overSlop = up(fractionOfScreen = 0.5f))
         val transition = assertThat(layoutState.transitionState).isSceneTransition()
-        controller.onDragStopped(velocity = 0f)
+        controller.onDragStoppedAnimateLater(velocity = 0f)
 
         // Intercept the transition.
         onDragStartedImmediately()
@@ -1340,9 +1559,11 @@
         assertThat(transition).hasProgress(0.1f)
 
         // Commit the gesture. The overlay is instantly added in the set of current overlays.
-        controller.onDragStopped(velocityThreshold)
-        assertThat(transition).hasCurrentOverlays(OverlayA)
-        advanceUntilIdle()
+        controller.onDragStoppedAnimateNow(
+            velocity = velocityThreshold,
+            onAnimationStart = { assertThat(transition).hasCurrentOverlays(OverlayA) },
+            expectedConsumedVelocity = velocityThreshold,
+        )
         assertThat(layoutState.transitionState).isIdle()
         assertThat(layoutState.transitionState).hasCurrentScene(SceneA)
         assertThat(layoutState.transitionState).hasCurrentOverlays(OverlayA)
@@ -1368,9 +1589,11 @@
         assertThat(transition).hasProgress(0.1f)
 
         // Commit the gesture. The overlay is instantly removed from the set of current overlays.
-        controller.onDragStopped(-velocityThreshold)
-        assertThat(transition).hasCurrentOverlays(/* empty */ )
-        advanceUntilIdle()
+        controller.onDragStoppedAnimateNow(
+            velocity = -velocityThreshold,
+            onAnimationStart = { assertThat(transition).hasCurrentOverlays(/* empty */ ) },
+            expectedConsumedVelocity = -velocityThreshold,
+        )
         assertThat(layoutState.transitionState).isIdle()
         assertThat(layoutState.transitionState).hasCurrentScene(SceneA)
         assertThat(layoutState.transitionState).hasCurrentOverlays(/* empty */ )
@@ -1396,9 +1619,11 @@
         assertThat(transition).hasProgress(0.1f)
 
         // Commit the gesture. The overlays are instantly swapped in the set of current overlays.
-        controller.onDragStopped(velocityThreshold)
-        assertThat(transition).hasCurrentOverlays(OverlayB)
-        advanceUntilIdle()
+        controller.onDragStoppedAnimateNow(
+            velocity = velocityThreshold,
+            onAnimationStart = { assertThat(transition).hasCurrentOverlays(OverlayB) },
+            expectedConsumedVelocity = velocityThreshold,
+        )
         assertThat(layoutState.transitionState).isIdle()
         assertThat(layoutState.transitionState).hasCurrentScene(SceneA)
         assertThat(layoutState.transitionState).hasCurrentOverlays(OverlayB)
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MultiPointerDraggableTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MultiPointerDraggableTest.kt
index af717ac..c8f6e6d 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MultiPointerDraggableTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MultiPointerDraggableTest.kt
@@ -45,6 +45,8 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.Velocity
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.compose.modifiers.thenIf
+import com.android.compose.nestedscroll.SuspendedValue
 import com.google.common.truth.Truth.assertThat
 import kotlin.properties.Delegates
 import kotlinx.coroutines.coroutineScope
@@ -71,9 +73,9 @@
             return delta
         }
 
-        override fun onStop(velocity: Float, canChangeContent: Boolean): Float {
+        override fun onStop(velocity: Float, canChangeContent: Boolean): SuspendedValue<Float> {
             onStop.invoke(velocity)
-            return velocity
+            return { velocity }
         }
     }
 
@@ -93,19 +95,20 @@
             Box(
                 Modifier.size(with(LocalDensity.current) { Size(size, size).toDpSize() })
                     .nestedScrollDispatcher()
-                    .multiPointerDraggable(
-                        orientation = Orientation.Vertical,
-                        enabled = { enabled },
-                        startDragImmediately = { false },
-                        onDragStarted = { _, _, _ ->
-                            started = true
-                            SimpleDragController(
-                                onDrag = { dragged = true },
-                                onStop = { stopped = true },
-                            )
-                        },
-                        dispatcher = defaultDispatcher,
-                    )
+                    .thenIf(enabled) {
+                        Modifier.multiPointerDraggable(
+                            orientation = Orientation.Vertical,
+                            startDragImmediately = { false },
+                            onDragStarted = { _, _, _ ->
+                                started = true
+                                SimpleDragController(
+                                    onDrag = { dragged = true },
+                                    onStop = { stopped = true },
+                                )
+                            },
+                            dispatcher = defaultDispatcher,
+                        )
+                    }
             )
         }
 
@@ -163,7 +166,6 @@
                     .nestedScrollDispatcher()
                     .multiPointerDraggable(
                         orientation = Orientation.Vertical,
-                        enabled = { true },
                         // We want to start a drag gesture immediately
                         startDragImmediately = { true },
                         onDragStarted = { _, _, _ ->
@@ -237,7 +239,6 @@
                     .nestedScrollDispatcher()
                     .multiPointerDraggable(
                         orientation = Orientation.Vertical,
-                        enabled = { true },
                         startDragImmediately = { false },
                         onDragStarted = { _, _, _ ->
                             started = true
@@ -357,7 +358,6 @@
                     .nestedScrollDispatcher()
                     .multiPointerDraggable(
                         orientation = Orientation.Vertical,
-                        enabled = { true },
                         startDragImmediately = { false },
                         onDragStarted = { _, _, _ ->
                             started = true
@@ -463,7 +463,6 @@
                     .nestedScrollDispatcher()
                     .multiPointerDraggable(
                         orientation = Orientation.Vertical,
-                        enabled = { true },
                         startDragImmediately = { false },
                         onDragStarted = { _, _, _ ->
                             verticalStarted = true
@@ -476,7 +475,6 @@
                     )
                     .multiPointerDraggable(
                         orientation = Orientation.Horizontal,
-                        enabled = { true },
                         startDragImmediately = { false },
                         onDragStarted = { _, _, _ ->
                             horizontalStarted = true
@@ -569,7 +567,6 @@
                     .nestedScrollDispatcher()
                     .multiPointerDraggable(
                         orientation = Orientation.Vertical,
-                        enabled = { true },
                         startDragImmediately = { false },
                         swipeDetector =
                             object : SwipeDetector {
@@ -671,7 +668,6 @@
                     .nestedScrollDispatcher()
                     .multiPointerDraggable(
                         orientation = Orientation.Vertical,
-                        enabled = { true },
                         startDragImmediately = { false },
                         onDragStarted = { _, _, _ ->
                             SimpleDragController(
@@ -743,7 +739,6 @@
                     .nestedScrollDispatcher()
                     .multiPointerDraggable(
                         orientation = Orientation.Vertical,
-                        enabled = { true },
                         startDragImmediately = { false },
                         onDragStarted = { _, _, _ ->
                             SimpleDragController(
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt
index 25e8713..28d0a47 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt
@@ -22,11 +22,15 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.size
+import androidx.compose.material3.Button
+import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
@@ -36,9 +40,14 @@
 import androidx.compose.ui.platform.LocalViewConfiguration
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.assertPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertTextEquals
 import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onRoot
+import androidx.compose.ui.test.performClick
 import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.test.swipeRight
+import androidx.compose.ui.test.swipeUp
 import androidx.compose.ui.test.swipeWithVelocity
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntSize
@@ -844,4 +853,62 @@
         assertThat(transition.progress).isEqualTo(1f)
         assertThat(availableOnPostScroll).isEqualTo(ovescrollPx)
     }
+
+    @Test
+    fun sceneWithoutSwipesDoesNotConsumeGestures() {
+        val buttonTag = "button"
+
+        rule.setContent {
+            Box {
+                var count by remember { mutableStateOf(0) }
+                Button(onClick = { count++ }, Modifier.testTag(buttonTag).align(Alignment.Center)) {
+                    Text("Count: $count")
+                }
+
+                SceneTransitionLayout(remember { MutableSceneTransitionLayoutState(SceneA) }) {
+                    scene(SceneA) { Box(Modifier.fillMaxSize()) }
+                }
+            }
+        }
+
+        rule.onNodeWithTag(buttonTag).assertTextEquals("Count: 0")
+
+        // Click on the root at its center, where the button is located. Clicks should go through
+        // the STL and reach the button given that there is no swipes for the current scene.
+        repeat(3) { rule.onRoot().performClick() }
+        rule.onNodeWithTag(buttonTag).assertTextEquals("Count: 3")
+    }
+
+    @Test
+    fun swipeToSceneSupportsUpdates() {
+        val state = rule.runOnUiThread { MutableSceneTransitionLayoutState(SceneA) }
+
+        rule.setContent {
+            SceneTransitionLayout(state) {
+                // SceneA only has vertical actions, so only one vertical Modifier.swipeToScene()
+                // is composed.
+                scene(SceneA, mapOf(Swipe.Up to SceneB)) { Box(Modifier.fillMaxSize()) }
+
+                // SceneB only has horizontal actions, so only one vertical Modifier.swipeToScene()
+                // is composed, which will be force update it with a new draggableHandler.
+                scene(SceneB, mapOf(Swipe.Right to SceneC)) { Box(Modifier.fillMaxSize()) }
+                scene(SceneC) { Box(Modifier.fillMaxSize()) }
+            }
+        }
+
+        assertThat(state.transitionState).isIdle()
+        assertThat(state.transitionState).hasCurrentScene(SceneA)
+
+        // Swipe up to scene B.
+        rule.onRoot().performTouchInput { swipeUp() }
+        rule.waitForIdle()
+        assertThat(state.transitionState).isIdle()
+        assertThat(state.transitionState).hasCurrentScene(SceneB)
+
+        // Swipe right to scene C.
+        rule.onRoot().performTouchInput { swipeRight() }
+        rule.waitForIdle()
+        assertThat(state.transitionState).isIdle()
+        assertThat(state.transitionState).hasCurrentScene(SceneC)
+    }
 }
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt
index 7f1af05..badc43b 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt
@@ -18,8 +18,9 @@
 
 package com.android.compose.nestedscroll
 
+import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.input.nestedscroll.NestedScrollSource
+import androidx.compose.ui.input.nestedscroll.NestedScrollSource.Companion.UserInput
 import androidx.compose.ui.unit.Velocity
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.google.common.truth.Truth.assertThat
@@ -35,13 +36,14 @@
     private var canStartPostFling = false
     private var canContinueScroll = false
     private var isStarted = false
-    private var lastScroll: Offset? = null
-    private var returnOnScroll = Offset.Zero
-    private var lastStop: Velocity? = null
-    private var returnOnStop = Velocity.Zero
+    private var lastScroll: Float? = null
+    private var returnOnScroll = 0f
+    private var lastStop: Float? = null
+    private var returnOnStop = 0f
 
     private val scrollConnection =
         PriorityNestedScrollConnection(
+            orientation = Orientation.Vertical,
             canStartPreScroll = { _, _ -> canStartPreScroll },
             canStartPostScroll = { _, _ -> canStartPostScroll },
             canStartPostFling = { canStartPostFling },
@@ -54,15 +56,10 @@
             },
             onStop = {
                 lastStop = it
-                returnOnStop
+                { returnOnStop }
             },
         )
 
-    private val offset1 = Offset(1f, 1f)
-    private val offset2 = Offset(2f, 2f)
-    private val velocity1 = Velocity(1f, 1f)
-    private val velocity2 = Velocity(2f, 2f)
-
     @Test
     fun step1_priorityModeShouldStartOnlyOnPreScroll() = runTest {
         canStartPreScroll = true
@@ -70,7 +67,7 @@
         scrollConnection.onPostScroll(
             consumed = Offset.Zero,
             available = Offset.Zero,
-            source = NestedScrollSource.Drag,
+            source = UserInput,
         )
         assertThat(isStarted).isEqualTo(false)
 
@@ -80,7 +77,7 @@
         scrollConnection.onPostFling(consumed = Velocity.Zero, available = Velocity.Zero)
         assertThat(isStarted).isEqualTo(false)
 
-        scrollConnection.onPreScroll(available = Offset.Zero, source = NestedScrollSource.Drag)
+        scrollConnection.onPreScroll(available = Offset.Zero, source = UserInput)
         assertThat(isStarted).isEqualTo(true)
     }
 
@@ -89,7 +86,7 @@
         scrollConnection.onPostScroll(
             consumed = Offset.Zero,
             available = Offset.Zero,
-            source = NestedScrollSource.Drag,
+            source = UserInput,
         )
     }
 
@@ -97,7 +94,7 @@
     fun step1_priorityModeShouldStartOnlyOnPostScroll() = runTest {
         canStartPostScroll = true
 
-        scrollConnection.onPreScroll(available = Offset.Zero, source = NestedScrollSource.Drag)
+        scrollConnection.onPreScroll(available = Offset.Zero, source = UserInput)
         assertThat(isStarted).isEqualTo(false)
 
         scrollConnection.onPreFling(available = Velocity.Zero)
@@ -115,7 +112,7 @@
         scrollConnection.onPostScroll(
             consumed = Offset.Zero,
             available = Offset.Zero,
-            source = NestedScrollSource.Drag,
+            source = UserInput,
         )
         assertThat(isStarted).isEqualTo(false)
 
@@ -128,12 +125,12 @@
         canStartPostScroll = true
 
         scrollConnection.onPostScroll(
-            consumed = offset1,
-            available = offset2,
-            source = NestedScrollSource.Drag,
+            consumed = Offset(1f, 1f),
+            available = Offset(2f, 2f),
+            source = UserInput,
         )
 
-        assertThat(lastScroll).isEqualTo(offset2)
+        assertThat(lastScroll).isEqualTo(2f)
     }
 
     @Test
@@ -141,13 +138,13 @@
         startPriorityModePostScroll()
         canContinueScroll = true
 
-        scrollConnection.onPreScroll(available = offset1, source = NestedScrollSource.Drag)
-        assertThat(lastScroll).isEqualTo(offset1)
+        scrollConnection.onPreScroll(available = Offset(1f, 1f), source = UserInput)
+        assertThat(lastScroll).isEqualTo(1f)
 
         canContinueScroll = false
-        scrollConnection.onPreScroll(available = offset2, source = NestedScrollSource.Drag)
-        assertThat(lastScroll).isNotEqualTo(offset2)
-        assertThat(lastScroll).isEqualTo(offset1)
+        scrollConnection.onPreScroll(available = Offset(2f, 2f), source = UserInput)
+        assertThat(lastScroll).isNotEqualTo(2f)
+        assertThat(lastScroll).isEqualTo(1f)
     }
 
     @Test
@@ -155,7 +152,7 @@
         startPriorityModePostScroll()
         canContinueScroll = false
 
-        scrollConnection.onPreScroll(available = Offset.Zero, source = NestedScrollSource.Drag)
+        scrollConnection.onPreScroll(available = Offset.Zero, source = UserInput)
 
         assertThat(lastStop).isNotNull()
     }
@@ -184,22 +181,22 @@
     fun receive_onPostFling() = runTest {
         canStartPostFling = true
 
-        scrollConnection.onPostFling(consumed = velocity1, available = velocity2)
+        scrollConnection.onPostFling(consumed = Velocity(1f, 1f), available = Velocity(2f, 2f))
 
-        assertThat(lastStop).isEqualTo(velocity2)
+        assertThat(lastStop).isEqualTo(2f)
     }
 
     @Test
     fun step1_priorityModeShouldStartOnlyOnPostFling() = runTest {
         canStartPostFling = true
 
-        scrollConnection.onPreScroll(available = Offset.Zero, source = NestedScrollSource.Drag)
+        scrollConnection.onPreScroll(available = Offset.Zero, source = UserInput)
         assertThat(isStarted).isEqualTo(false)
 
         scrollConnection.onPostScroll(
             consumed = Offset.Zero,
             available = Offset.Zero,
-            source = NestedScrollSource.Drag,
+            source = UserInput,
         )
         assertThat(isStarted).isEqualTo(false)
 
diff --git a/packages/SystemUI/customization/Android.bp b/packages/SystemUI/customization/Android.bp
index c399abc..81d92fa 100644
--- a/packages/SystemUI/customization/Android.bp
+++ b/packages/SystemUI/customization/Android.bp
@@ -36,6 +36,7 @@
         "SystemUIPluginLib",
         "SystemUIUnfoldLib",
         "kotlinx_coroutines",
+        "monet",
         "dagger2",
         "jsr330",
     ],
diff --git a/packages/SystemUI/customization/res/values/ids.xml b/packages/SystemUI/customization/res/values/ids.xml
index 5eafbfc..ec466f0 100644
--- a/packages/SystemUI/customization/res/values/ids.xml
+++ b/packages/SystemUI/customization/res/values/ids.xml
@@ -6,4 +6,13 @@
     <item type="id" name="weather_clock_weather_icon" />
     <item type="id" name="weather_clock_temperature" />
     <item type="id" name="weather_clock_alarm_dnd" />
+
+    <item type="id" name="HOUR_DIGIT_PAIR"/>
+    <item type="id" name="MINUTE_DIGIT_PAIR"/>
+    <item type="id" name="HOUR_FIRST_DIGIT"/>
+    <item type="id" name="HOUR_SECOND_DIGIT"/>
+    <item type="id" name="MINUTE_FIRST_DIGIT"/>
+    <item type="id" name="MINUTE_SECOND_DIGIT"/>
+    <item type="id" name="TIME_FULL_FORMAT"/>
+    <item type="id" name="DATE_FORMAT"/>
 </resources>
\ No newline at end of file
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt
index 1863cd8..9877406 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt
@@ -62,6 +62,7 @@
     // implement the get method and ensure a value is returned before initialization is complete.
     private var logger = DEFAULT_LOGGER
         get() = field ?: DEFAULT_LOGGER
+
     var messageBuffer: MessageBuffer
         get() = logger.buffer
         set(value) {
@@ -123,24 +124,24 @@
                 attrs,
                 R.styleable.AnimatableClockView,
                 defStyleAttr,
-                defStyleRes
+                defStyleRes,
             )
 
         try {
             dozingWeightInternal =
                 animatableClockViewAttributes.getInt(
                     R.styleable.AnimatableClockView_dozeWeight,
-                    /* default = */ 100
+                    /* default = */ 100,
                 )
             lockScreenWeightInternal =
                 animatableClockViewAttributes.getInt(
                     R.styleable.AnimatableClockView_lockScreenWeight,
-                    /* default = */ 300
+                    /* default = */ 300,
                 )
             chargeAnimationDelay =
                 animatableClockViewAttributes.getInt(
                     R.styleable.AnimatableClockView_chargeAnimationDelay,
-                    /* default = */ 200
+                    /* default = */ 200,
                 )
         } finally {
             animatableClockViewAttributes.recycle()
@@ -151,14 +152,14 @@
                 attrs,
                 android.R.styleable.TextView,
                 defStyleAttr,
-                defStyleRes
+                defStyleRes,
             )
 
         try {
             isSingleLineInternal =
                 textViewAttributes.getBoolean(
                     android.R.styleable.TextView_singleLine,
-                    /* default = */ false
+                    /* default = */ false,
                 )
         } finally {
             textViewAttributes.recycle()
@@ -280,7 +281,7 @@
         text: CharSequence,
         start: Int,
         lengthBefore: Int,
-        lengthAfter: Int
+        lengthAfter: Int,
     ) {
         logger.d({ "onTextChanged($str1)" }) { str1 = text.toString() }
         super.onTextChanged(text, start, lengthBefore, lengthAfter)
@@ -305,7 +306,7 @@
             interpolator = null,
             duration = 0,
             delay = 0,
-            onAnimationEnd = null
+            onAnimationEnd = null,
         )
         setTextStyle(
             weight = lockScreenWeight,
@@ -314,7 +315,7 @@
             interpolator = null,
             duration = COLOR_ANIM_DURATION,
             delay = 0,
-            onAnimationEnd = null
+            onAnimationEnd = null,
         )
     }
 
@@ -327,7 +328,7 @@
             interpolator = null,
             duration = 0,
             delay = 0,
-            onAnimationEnd = null
+            onAnimationEnd = null,
         )
         setTextStyle(
             weight = lockScreenWeight,
@@ -336,7 +337,7 @@
             duration = APPEAR_ANIM_DURATION,
             interpolator = Interpolators.EMPHASIZED_DECELERATE,
             delay = 0,
-            onAnimationEnd = null
+            onAnimationEnd = null,
         )
     }
 
@@ -353,7 +354,7 @@
             interpolator = null,
             duration = 0,
             delay = 0,
-            onAnimationEnd = null
+            onAnimationEnd = null,
         )
         setTextStyle(
             weight = dozingWeightInternal,
@@ -362,7 +363,7 @@
             interpolator = Interpolators.EMPHASIZED_DECELERATE,
             duration = ANIMATION_DURATION_FOLD_TO_AOD.toLong(),
             delay = 0,
-            onAnimationEnd = null
+            onAnimationEnd = null,
         )
     }
 
@@ -381,7 +382,7 @@
                 interpolator = null,
                 duration = CHARGE_ANIM_DURATION_PHASE_1,
                 delay = 0,
-                onAnimationEnd = null
+                onAnimationEnd = null,
             )
         }
         setTextStyle(
@@ -391,7 +392,7 @@
             interpolator = null,
             duration = CHARGE_ANIM_DURATION_PHASE_0,
             delay = chargeAnimationDelay.toLong(),
-            onAnimationEnd = startAnimPhase2
+            onAnimationEnd = startAnimPhase2,
         )
     }
 
@@ -404,7 +405,7 @@
             interpolator = null,
             duration = DOZE_ANIM_DURATION,
             delay = 0,
-            onAnimationEnd = null
+            onAnimationEnd = null,
         )
     }
 
@@ -444,7 +445,7 @@
         interpolator: TimeInterpolator?,
         duration: Long,
         delay: Long,
-        onAnimationEnd: Runnable?
+        onAnimationEnd: Runnable?,
     ) {
         textAnimator?.let {
             it.setTextStyle(
@@ -454,7 +455,7 @@
                 duration = duration,
                 interpolator = interpolator,
                 delay = delay,
-                onAnimationEnd = onAnimationEnd
+                onAnimationEnd = onAnimationEnd,
             )
             it.glyphFilter = glyphFilter
         }
@@ -468,7 +469,7 @@
                         duration = duration,
                         interpolator = interpolator,
                         delay = delay,
-                        onAnimationEnd = onAnimationEnd
+                        onAnimationEnd = onAnimationEnd,
                     )
                     textAnimator.glyphFilter = glyphFilter
                 }
@@ -476,6 +477,7 @@
     }
 
     fun refreshFormat() = refreshFormat(DateFormat.is24HourFormat(context))
+
     fun refreshFormat(use24HourFormat: Boolean) {
         Patterns.update(context)
 
@@ -560,18 +562,11 @@
      * @param fraction fraction of the clock movement. 0 means it is at the beginning, and 1 means
      *   it finished moving.
      */
-    fun offsetGlyphsForStepClockAnimation(
-        distance: Float,
-        fraction: Float,
-    ) {
+    fun offsetGlyphsForStepClockAnimation(distance: Float, fraction: Float) {
         for (i in 0 until NUM_DIGITS) {
             val dir = if (isLayoutRtl) -1 else 1
             val digitFraction =
-                getDigitFraction(
-                    digit = i,
-                    isMovingToCenter = distance > 0,
-                    fraction = fraction,
-                )
+                getDigitFraction(digit = i, isMovingToCenter = distance > 0, fraction = fraction)
             val moveAmountForDigit = dir * distance * digitFraction
             glyphOffsets[i] = moveAmountForDigit
 
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AssetLoader.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AssetLoader.kt
new file mode 100644
index 0000000..d001ef96
--- /dev/null
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AssetLoader.kt
@@ -0,0 +1,448 @@
+/*
+ * Copyright (C) 2024 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.systemui.shared.clocks
+
+import android.content.Context
+import android.content.res.ColorStateList
+import android.content.res.Resources
+import android.graphics.Color
+import android.graphics.Typeface
+import android.graphics.drawable.Drawable
+import android.util.TypedValue
+import com.android.internal.graphics.ColorUtils
+import com.android.internal.graphics.cam.Cam
+import com.android.internal.graphics.cam.CamUtils
+import com.android.internal.policy.SystemBarUtils
+import com.android.systemui.log.core.Logger
+import com.android.systemui.log.core.MessageBuffer
+import com.android.systemui.monet.ColorScheme
+import com.android.systemui.monet.Style as MonetStyle
+import com.android.systemui.monet.TonalPalette
+import java.io.IOException
+import kotlin.math.abs
+
+class AssetLoader
+private constructor(
+    private val pluginCtx: Context,
+    private val sysuiCtx: Context,
+    private val baseDir: String,
+    var colorScheme: ColorScheme?,
+    var seedColor: Int?,
+    var overrideChroma: Float?,
+    val typefaceCache: TypefaceCache,
+    val getThemeSeedColor: (Context) -> Int,
+    messageBuffer: MessageBuffer,
+) {
+    val logger = Logger(messageBuffer, TAG)
+    private val resources =
+        listOf(
+            Pair(pluginCtx.resources, pluginCtx.packageName),
+            Pair(sysuiCtx.resources, sysuiCtx.packageName),
+        )
+
+    constructor(
+        pluginCtx: Context,
+        sysuiCtx: Context,
+        baseDir: String,
+        messageBuffer: MessageBuffer,
+        getThemeSeedColor: ((Context) -> Int)? = null,
+    ) : this(
+        pluginCtx,
+        sysuiCtx,
+        baseDir,
+        colorScheme = null,
+        seedColor = null,
+        overrideChroma = null,
+        typefaceCache =
+            TypefaceCache(messageBuffer) { Typeface.createFromAsset(pluginCtx.assets, it) },
+        getThemeSeedColor = getThemeSeedColor ?: Companion::getThemeSeedColor,
+        messageBuffer = messageBuffer,
+    )
+
+    fun listAssets(path: String): List<String> {
+        return pluginCtx.resources.assets.list("$baseDir$path")?.toList() ?: emptyList()
+    }
+
+    fun tryReadString(resStr: String): String? = tryRead(resStr, ::readString)
+
+    fun readString(resStr: String): String {
+        val resPair = resolveResourceId(resStr)
+        if (resPair == null) {
+            throw IOException("Failed to parse string: $resStr")
+        }
+
+        val (res, id) = resPair
+        return res.getString(id)
+    }
+
+    fun tryReadColor(resStr: String): Int? = tryRead(resStr, ::readColor)
+
+    fun readColor(resStr: String): Int {
+        if (resStr.startsWith("#")) {
+            return Color.parseColor(resStr)
+        }
+
+        val schemeColor = tryParseColorFromScheme(resStr)
+        if (schemeColor != null) {
+            logColor("ColorScheme: $resStr", schemeColor)
+            return checkChroma(schemeColor)
+        }
+
+        val result = resolveColorResourceId(resStr)
+        if (result == null) {
+            throw IOException("Failed to parse color: $resStr")
+        }
+
+        val (res, colorId, targetTone) = result
+        val color = res.getColor(colorId)
+        if (targetTone == null || TonalPalette.SHADE_KEYS.contains(targetTone.toInt())) {
+            logColor("Resources: $resStr", color)
+            return checkChroma(color)
+        } else {
+            val interpolatedColor =
+                ColorStateList.valueOf(color)
+                    .withLStar((1000f - targetTone) / 10f)
+                    .getDefaultColor()
+            logColor("Resources (interpolated tone): $resStr", interpolatedColor)
+            return checkChroma(interpolatedColor)
+        }
+    }
+
+    private fun checkChroma(color: Int): Int {
+        return overrideChroma?.let {
+            val cam = Cam.fromInt(color)
+            val tone = CamUtils.lstarFromInt(color)
+            val result = ColorUtils.CAMToColor(cam.hue, it, tone)
+            logColor("Chroma override", result)
+            result
+        } ?: color
+    }
+
+    private fun tryParseColorFromScheme(resStr: String): Int? {
+        val colorScheme = this.colorScheme
+        if (colorScheme == null) {
+            logger.w("No color scheme available")
+            return null
+        }
+
+        val (packageName, category, name) = parseResourceId(resStr)
+        if (packageName != "android" || category != "color") {
+            logger.w("Failed to parse package from $resStr")
+            return null
+        }
+
+        var parts = name.split('_')
+        if (parts.size != 3) {
+            logger.w("Failed to find palette and shade from $name")
+            return null
+        }
+        val (_, paletteKey, shadeKeyStr) = parts
+
+        val palette =
+            when (paletteKey) {
+                "accent1" -> colorScheme.accent1
+                "accent2" -> colorScheme.accent2
+                "accent3" -> colorScheme.accent3
+                "neutral1" -> colorScheme.neutral1
+                "neutral2" -> colorScheme.neutral2
+                else -> return null
+            }
+
+        if (shadeKeyStr.contains("+") || shadeKeyStr.contains("-")) {
+            val signIndex = shadeKeyStr.indexOfLast { it == '-' || it == '+' }
+            // Use the tone of the seed color if it was set explicitly.
+            var baseTone =
+                if (seedColor != null) colorScheme.seedTone.toFloat()
+                else shadeKeyStr.substring(0, signIndex).toFloatOrNull()
+            val diff = shadeKeyStr.substring(signIndex).toFloatOrNull()
+
+            if (baseTone == null) {
+                logger.w("Failed to parse base tone from $shadeKeyStr")
+                return null
+            }
+
+            if (diff == null) {
+                logger.w("Failed to parse relative tone from $shadeKeyStr")
+                return null
+            }
+            return palette.getAtTone(baseTone + diff)
+        } else {
+            val shadeKey = shadeKeyStr.toIntOrNull()
+            if (shadeKey == null) {
+                logger.w("Failed to parse tone from $shadeKeyStr")
+                return null
+            }
+            return palette.allShadesMapped.get(shadeKey) ?: palette.getAtTone(shadeKey.toFloat())
+        }
+    }
+
+    fun readFontAsset(resStr: String): Typeface = typefaceCache.getTypeface(resStr)
+
+    fun tryReadTextAsset(path: String?): String? = tryRead(path, ::readTextAsset)
+
+    fun readTextAsset(path: String): String {
+        return pluginCtx.resources.assets.open("$baseDir$path").use { stream ->
+            val buffer = ByteArray(stream.available())
+            stream.read(buffer)
+            String(buffer)
+        }
+    }
+
+    fun tryReadDrawableAsset(path: String?): Drawable? = tryRead(path, ::readDrawableAsset)
+
+    fun readDrawableAsset(path: String): Drawable {
+        var result: Drawable?
+
+        if (path.startsWith("@")) {
+            val pair = resolveResourceId(path)
+            if (pair == null) {
+                throw IOException("Failed to parse $path to an id")
+            }
+            val (res, id) = pair
+            result = res.getDrawable(id)
+        } else if (path.endsWith("xml")) {
+            // TODO(b/248609434): Support xml files in assets
+            throw IOException("Cannot load xml files from assets")
+        } else {
+            // Attempt to load as if it's a bitmap and directly loadable
+            result =
+                pluginCtx.resources.assets.open("$baseDir$path").use { stream ->
+                    Drawable.createFromResourceStream(
+                        pluginCtx.resources,
+                        TypedValue(),
+                        stream,
+                        null,
+                    )
+                }
+        }
+
+        return result ?: throw IOException("Failed to load: $baseDir$path")
+    }
+
+    fun parseResourceId(resStr: String): Triple<String?, String, String> {
+        if (!resStr.startsWith("@")) {
+            throw IOException("Invalid resource id: $resStr; Must start with '@'")
+        }
+
+        // Parse out resource string
+        val parts = resStr.drop(1).split('/', ':')
+        return when (parts.size) {
+            2 -> Triple(null, parts[0], parts[1])
+            3 -> Triple(parts[0], parts[1], parts[2])
+            else -> throw IOException("Failed to parse resource string: $resStr")
+        }
+    }
+
+    fun resolveColorResourceId(resStr: String): Triple<Resources, Int, Float?>? {
+        var (packageName, category, name) = parseResourceId(resStr)
+
+        // Convert relative tonal specifiers to standard
+        val relIndex = name.indexOfLast { it == '_' }
+        val isToneRelative = name.contains("-") || name.contains("+")
+        val targetTone =
+            if (packageName != "android") {
+                null
+            } else if (isToneRelative) {
+                val signIndex = name.indexOfLast { it == '-' || it == '+' }
+                val baseTone = name.substring(relIndex + 1, signIndex).toFloatOrNull()
+                var diff = name.substring(signIndex).toFloatOrNull()
+                if (baseTone == null || diff == null) {
+                    logger.w("Failed to parse relative tone from $name")
+                    return null
+                }
+                baseTone + diff
+            } else {
+                val absTone = name.substring(relIndex + 1).toFloatOrNull()
+                if (absTone == null) {
+                    logger.w("Failed to parse absolute tone from $name")
+                    return null
+                }
+                absTone
+            }
+
+        if (
+            targetTone != null &&
+                (isToneRelative || !TonalPalette.SHADE_KEYS.contains(targetTone.toInt()))
+        ) {
+            val closeTone = TonalPalette.SHADE_KEYS.minBy { abs(it - targetTone) }
+            val prevName = name
+            name = name.substring(0, relIndex + 1) + closeTone
+            logger.i("Converted $prevName to $name")
+        }
+
+        val result = resolveResourceId(packageName, category, name)
+        if (result == null) {
+            return null
+        }
+
+        val (res, resId) = result
+        return Triple(res, resId, targetTone)
+    }
+
+    fun resolveResourceId(resStr: String): Pair<Resources, Int>? {
+        val (packageName, category, name) = parseResourceId(resStr)
+        return resolveResourceId(packageName, category, name)
+    }
+
+    fun resolveResourceId(
+        packageName: String?,
+        category: String,
+        name: String,
+    ): Pair<Resources, Int>? {
+        for ((res, ctxPkgName) in resources) {
+            val result = res.getIdentifier(name, category, packageName ?: ctxPkgName)
+            if (result != 0) {
+                return Pair(res, result)
+            }
+        }
+        return null
+    }
+
+    private fun <TArg : Any, TRes : Any> tryRead(arg: TArg?, fn: (TArg) -> TRes): TRes? {
+        try {
+            if (arg == null) {
+                return null
+            }
+            return fn(arg)
+        } catch (ex: IOException) {
+            logger.w("Failed to read $arg", ex)
+            return null
+        }
+    }
+
+    fun assetExists(path: String): Boolean {
+        try {
+            if (path.startsWith("@")) {
+                val pair = resolveResourceId(path)
+                val colorPair = resolveColorResourceId(path)
+                return pair != null || colorPair != null
+            } else {
+                val stream = pluginCtx.resources.assets.open("$baseDir$path")
+                if (stream == null) {
+                    return false
+                }
+
+                stream.close()
+                return true
+            }
+        } catch (ex: IOException) {
+            return false
+        }
+    }
+
+    fun copy(messageBuffer: MessageBuffer? = null): AssetLoader =
+        AssetLoader(
+            pluginCtx,
+            sysuiCtx,
+            baseDir,
+            colorScheme,
+            seedColor,
+            overrideChroma,
+            typefaceCache,
+            getThemeSeedColor,
+            messageBuffer ?: logger.buffer,
+        )
+
+    fun setSeedColor(seedColor: Int?, style: MonetStyle?) {
+        this.seedColor = seedColor
+        refreshColorPalette(style)
+    }
+
+    fun refreshColorPalette(style: MonetStyle?) {
+        val seedColor =
+            this.seedColor ?: getThemeSeedColor(sysuiCtx).also { logColor("Theme Seed Color", it) }
+        this.colorScheme =
+            ColorScheme(
+                seedColor,
+                false, // darkTheme is not used for palette generation
+                style ?: MonetStyle.CLOCK,
+            )
+
+        // Enforce low chroma on output colors if low chroma theme is selected
+        this.overrideChroma = run {
+            val cam = colorScheme?.seed?.let { Cam.fromInt(it) }
+            if (cam != null && cam.chroma < LOW_CHROMA_LIMIT) {
+                return@run cam.chroma * LOW_CHROMA_SCALE
+            }
+            return@run null
+        }
+    }
+
+    fun getClockPaddingStart(): Int {
+        val result = resolveResourceId(null, "dimen", "clock_padding_start")
+        if (result != null) {
+            val (res, id) = result
+            return res.getDimensionPixelSize(id)
+        }
+        return -1
+    }
+
+    fun getStatusBarHeight(): Int {
+        val display = pluginCtx.getDisplayNoVerify()
+        if (display != null) {
+            return SystemBarUtils.getStatusBarHeight(pluginCtx.resources, display.cutout)
+        }
+
+        logger.w("No display available; falling back to android.R.dimen.status_bar_height")
+        val statusBarHeight = resolveResourceId("android", "dimen", "status_bar_height")
+        if (statusBarHeight != null) {
+            val (res, resId) = statusBarHeight
+            return res.getDimensionPixelSize(resId)
+        }
+
+        throw Exception("Could not fetch StatusBarHeight")
+    }
+
+    fun getResourcesId(name: String): Int = getResource("id", name) { _, id -> id }
+
+    fun getDimen(name: String): Int = getResource("dimen", name, Resources::getDimensionPixelSize)
+
+    fun getString(name: String): String = getResource("string", name, Resources::getString)
+
+    private fun <T> getResource(
+        category: String,
+        name: String,
+        getter: (res: Resources, id: Int) -> T,
+    ): T {
+        val result = resolveResourceId(null, category, name)
+        if (result != null) {
+            val (res, id) = result
+            if (id == -1) throw Exception("Cannot find id of $id from $TAG")
+            return getter(res, id)
+        }
+        throw Exception("Cannot find id of $name from $TAG")
+    }
+
+    private fun logColor(name: String, color: Int) {
+        if (DEBUG_COLOR) {
+            val cam = Cam.fromInt(color)
+            val tone = CamUtils.lstarFromInt(color)
+            logger.i("$name -> (hue: ${cam.hue}, chroma: ${cam.chroma}, tone: $tone)")
+        }
+    }
+
+    companion object {
+        private val DEBUG_COLOR = true
+        private val LOW_CHROMA_LIMIT = 15
+        private val LOW_CHROMA_SCALE = 1.5f
+        private val TAG = AssetLoader::class.simpleName!!
+
+        private fun getThemeSeedColor(ctx: Context): Int {
+            return ctx.resources.getColor(android.R.color.system_palette_key_color_primary_light)
+        }
+    }
+}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockAnimation.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockAnimation.kt
new file mode 100644
index 0000000..5a04169
--- /dev/null
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockAnimation.kt
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2024 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.systemui.shared.clocks
+
+object ClockAnimation {
+    const val NUM_CLOCK_FONT_ANIMATION_STEPS = 30
+}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockDesign.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockDesign.kt
new file mode 100644
index 0000000..f5e8432
--- /dev/null
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockDesign.kt
@@ -0,0 +1,288 @@
+/*
+ * Copyright (C) 2024 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.systemui.shared.clocks
+
+import android.graphics.Point
+import android.view.animation.Interpolator
+import com.android.app.animation.Interpolators
+import com.android.internal.annotations.Keep
+import com.android.systemui.monet.Style as MonetStyle
+import com.android.systemui.shared.clocks.view.HorizontalAlignment
+import com.android.systemui.shared.clocks.view.VerticalAlignment
+
+/** Data format for a simple asset-defined clock */
+@Keep
+data class ClockDesign(
+    val id: String,
+    val name: String? = null,
+    val description: String? = null,
+    val thumbnail: String? = null,
+    val large: ClockFace? = null,
+    val small: ClockFace? = null,
+    val colorPalette: MonetStyle? = null,
+)
+
+/** Describes a clock using layers */
+@Keep
+data class ClockFace(
+    val layers: List<ClockLayer> = listOf<ClockLayer>(),
+    val layerBounds: LayerBounds = LayerBounds.FIT,
+    val wallpaper: String? = null,
+    val faceLayout: DigitalFaceLayout? = null,
+    val pickerScale: ClockFaceScaleInPicker? = ClockFaceScaleInPicker(1.0f, 1.0f),
+)
+
+@Keep data class ClockFaceScaleInPicker(val scaleX: Float, val scaleY: Float)
+
+/** Base Type for a Clock Layer */
+@Keep
+interface ClockLayer {
+    /** Override of face LayerBounds setting for this layer */
+    val layerBounds: LayerBounds?
+}
+
+/** Clock layer that renders a static asset */
+@Keep
+data class AssetLayer(
+    /** Asset to render in this layer */
+    val asset: AssetReference,
+    override val layerBounds: LayerBounds? = null,
+) : ClockLayer
+
+/** Clock layer that renders the time (or a component of it) using numerals */
+@Keep
+data class DigitalHandLayer(
+    /** See SimpleDateFormat for timespec format info */
+    val timespec: DigitalTimespec,
+    val style: TextStyle,
+    // adoStyle concrete type must match style,
+    // cause styles will transition between style and aodStyle
+    val aodStyle: TextStyle?,
+    val timer: Int? = null,
+    override val layerBounds: LayerBounds? = null,
+    var faceLayout: DigitalFaceLayout? = null,
+    // we pass 12-hour format from json, which will be converted to 24-hour format in codes
+    val dateTimeFormat: String,
+    val alignment: DigitalAlignment?,
+    // ratio of margins to measured size, currently used for handwritten clocks
+    val marginRatio: DigitalMarginRatio? = DigitalMarginRatio(),
+) : ClockLayer
+
+/** Clock layer that renders the time (or a component of it) using numerals */
+@Keep
+data class ComposedDigitalHandLayer(
+    val customizedView: String? = null,
+    /** See SimpleDateFormat for timespec format info */
+    val digitalLayers: List<DigitalHandLayer> = listOf<DigitalHandLayer>(),
+    override val layerBounds: LayerBounds? = null,
+) : ClockLayer
+
+@Keep
+data class DigitalAlignment(
+    val horizontalAlignment: HorizontalAlignment?,
+    val verticalAlignment: VerticalAlignment?,
+)
+
+@Keep
+data class DigitalMarginRatio(
+    val left: Float = 0F,
+    val top: Float = 0F,
+    val right: Float = 0F,
+    val bottom: Float = 0F,
+)
+
+/** Clock layer which renders a component of the time using an analog hand */
+@Keep
+data class AnalogHandLayer(
+    val timespec: AnalogTimespec,
+    val tickMode: AnalogTickMode,
+    val asset: AssetReference,
+    val timer: Int? = null,
+    val clock_pivot: Point = Point(0, 0),
+    val asset_pivot: Point? = null,
+    val length: Float = 1f,
+    override val layerBounds: LayerBounds? = null,
+) : ClockLayer
+
+/** Clock layer which renders the time using an AVD */
+@Keep
+data class AnimatedHandLayer(
+    val timespec: AnalogTimespec,
+    val asset: AssetReference,
+    val timer: Int? = null,
+    override val layerBounds: LayerBounds? = null,
+) : ClockLayer
+
+/** A collection of asset references for use in different device modes */
+@Keep
+data class AssetReference(
+    val light: String,
+    val dark: String,
+    val doze: String? = null,
+    val lightTint: String? = null,
+    val darkTint: String? = null,
+    val dozeTint: String? = null,
+)
+
+/**
+ * Core TextStyling attributes for text clocks. Both color and sizing information can be applied to
+ * either subtype.
+ */
+@Keep
+interface TextStyle {
+    // fontSizeScale is a scale factor applied to the default clock's font size.
+    val fontSizeScale: Float?
+}
+
+/**
+ * This specifies a font and styling parameters for that font. This is rendered using a text view
+ * and the text animation classes used by the default clock. To ensure default value take effects,
+ * all parameters MUST have a default value
+ */
+@Keep
+data class FontTextStyle(
+    // Font to load and use in the TextView
+    val fontFamily: String? = null,
+    val lineHeight: Float? = null,
+    val borderWidth: String? = null,
+    // ratio of borderWidth / fontSize
+    val borderWidthScale: Float? = null,
+    // A color literal like `#FF00FF` or a color resource like `@android:color/system_accent1_100`
+    val fillColorLight: String? = null,
+    // A color literal like `#FF00FF` or a color resource like `@android:color/system_accent1_100`
+    val fillColorDark: String? = null,
+    override val fontSizeScale: Float? = null,
+    /**
+     * use `wdth` for width, `wght` for weight, 'opsz' for optical size single quote for tag name,
+     * and no quote for value separate different axis with `,` e.g. "'wght' 1000, 'wdth' 108, 'opsz'
+     * 90"
+     */
+    var fontVariation: String? = null,
+    // used when alternate in one font file is needed
+    var fontFeatureSettings: String? = null,
+    val renderType: RenderType = RenderType.STROKE_TEXT,
+    val outlineColor: String? = null,
+    val transitionDuration: Long = -1L,
+    val transitionInterpolator: InterpolatorEnum? = null,
+) : TextStyle
+
+/**
+ * As an alternative to using a font, we can instead render a digital clock using a set of drawables
+ * for each numeral, and optionally a colon. These drawables will be rendered directly after sizing
+ * and placing them. This may be easier than generating a font file in some cases, and is provided
+ * for ease of use. Unlike fonts, these are not localizable to other numeric systems (like Burmese).
+ */
+@Keep
+data class LottieTextStyle(
+    val numbers: List<String> = listOf(),
+    // Spacing between numbers, dimension string
+    val spacing: String = "0dp",
+    // Colon drawable may be omitted if unused in format spec
+    val colon: String? = null,
+    // key is keypath name to get strokes from lottie, value is the color name to query color in
+    // palette, e.g. @android:color/system_accent1_100
+    val fillColorLightMap: Map<String, String>? = null,
+    val fillColorDarkMap: Map<String, String>? = null,
+    override val fontSizeScale: Float? = null,
+    val paddingVertical: String = "0dp",
+    val paddingHorizontal: String = "0dp",
+) : TextStyle
+
+/** Layer sizing mode for the clockface or layer */
+enum class LayerBounds {
+    /**
+     * Sized so the larger dimension matches the allocated space. This results in some of the
+     * allocated space being unused.
+     */
+    FIT,
+
+    /**
+     * Sized so the smaller dimension matches the allocated space. This will clip some content to
+     * the edges of the space.
+     */
+    FILL,
+
+    /** Fills the allocated space exactly by stretching the layer */
+    STRETCH,
+}
+
+/** Ticking mode for analog hands. */
+enum class AnalogTickMode {
+    SWEEP,
+    TICK,
+}
+
+/** Timspec options for Analog Hands. Named for tick interval. */
+enum class AnalogTimespec {
+    SECONDS,
+    MINUTES,
+    HOURS,
+    HOURS_OF_DAY,
+    DAY_OF_WEEK,
+    DAY_OF_MONTH,
+    DAY_OF_YEAR,
+    WEEK,
+    MONTH,
+    TIMER,
+}
+
+enum class DigitalTimespec {
+    TIME_FULL_FORMAT,
+    DIGIT_PAIR,
+    FIRST_DIGIT,
+    SECOND_DIGIT,
+    DATE_FORMAT,
+}
+
+enum class DigitalFaceLayout {
+    // can only use HH_PAIR, MM_PAIR from DigitalTimespec
+    TWO_PAIRS_VERTICAL,
+    TWO_PAIRS_HORIZONTAL,
+    // can only use HOUR_FIRST_DIGIT, HOUR_SECOND_DIGIT, MINUTE_FIRST_DIGIT, MINUTE_SECOND_DIGIT
+    // from DigitalTimespec, used for tabular layout when the font doesn't support tnum
+    FOUR_DIGITS_ALIGN_CENTER,
+    FOUR_DIGITS_HORIZONTAL,
+}
+
+enum class RenderType {
+    CHANGE_WEIGHT,
+    HOLLOW_TEXT,
+    STROKE_TEXT,
+    OUTER_OUTLINE_TEXT,
+}
+
+enum class InterpolatorEnum(factory: () -> Interpolator) {
+    STANDARD({ Interpolators.STANDARD }),
+    EMPHASIZED({ Interpolators.EMPHASIZED });
+
+    val interpolator: Interpolator by lazy(factory)
+}
+
+fun generateDigitalLayerIdString(layer: DigitalHandLayer): String {
+    return if (
+        layer.timespec == DigitalTimespec.TIME_FULL_FORMAT ||
+            layer.timespec == DigitalTimespec.DATE_FORMAT
+    ) {
+        layer.timespec.toString()
+    } else {
+        if ("h" in layer.dateTimeFormat) {
+            "HOUR" + "_" + layer.timespec.toString()
+        } else {
+            "MINUTE" + "_" + layer.timespec.toString()
+        }
+    }
+}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt
index 954155d..9da3022 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt
@@ -65,7 +65,7 @@
 private fun <TKey : Any, TVal : Any> ConcurrentHashMap<TKey, TVal>.concurrentGetOrPut(
     key: TKey,
     value: TVal,
-    onNew: (TVal) -> Unit
+    onNew: (TVal) -> Unit,
 ): TVal {
     val result = this.putIfAbsent(key, value)
     if (result == null) {
@@ -110,7 +110,7 @@
                 selfChange: Boolean,
                 uris: Collection<Uri>,
                 flags: Int,
-                userId: Int
+                userId: Int,
             ) {
                 scope.launch(bgDispatcher) { querySettings() }
             }
@@ -180,7 +180,7 @@
             override fun onPluginLoaded(
                 plugin: ClockProviderPlugin,
                 pluginContext: Context,
-                manager: PluginLifecycleManager<ClockProviderPlugin>
+                manager: PluginLifecycleManager<ClockProviderPlugin>,
             ) {
                 plugin.initialize(clockBuffers)
 
@@ -218,7 +218,7 @@
 
             override fun onPluginUnloaded(
                 plugin: ClockProviderPlugin,
-                manager: PluginLifecycleManager<ClockProviderPlugin>
+                manager: PluginLifecycleManager<ClockProviderPlugin>,
             ) {
                 for (clock in plugin.getClocks()) {
                     val id = clock.clockId
@@ -290,12 +290,12 @@
                         Settings.Secure.getStringForUser(
                             context.contentResolver,
                             Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE,
-                            ActivityManager.getCurrentUser()
+                            ActivityManager.getCurrentUser(),
                         )
                     } else {
                         Settings.Secure.getString(
                             context.contentResolver,
-                            Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE
+                            Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE,
                         )
                     }
 
@@ -320,13 +320,13 @@
                     context.contentResolver,
                     Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE,
                     json,
-                    ActivityManager.getCurrentUser()
+                    ActivityManager.getCurrentUser(),
                 )
             } else {
                 Settings.Secure.putString(
                     context.contentResolver,
                     Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE,
-                    json
+                    json,
                 )
             }
         } catch (ex: Exception) {
@@ -418,7 +418,7 @@
         pluginManager.addPluginListener(
             pluginListener,
             ClockProviderPlugin::class.java,
-            /*allowMultiple=*/ true
+            /*allowMultiple=*/ true,
         )
 
         scope.launch(bgDispatcher) { querySettings() }
@@ -427,7 +427,7 @@
                 Settings.Secure.getUriFor(Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE),
                 /*notifyForDescendants=*/ false,
                 settingObserver,
-                UserHandle.USER_ALL
+                UserHandle.USER_ALL,
             )
 
             ActivityManager.getService().registerUserSwitchObserver(userSwitchObserver, TAG)
@@ -435,7 +435,7 @@
             context.contentResolver.registerContentObserver(
                 Settings.Secure.getUriFor(Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE),
                 /*notifyForDescendants=*/ false,
-                settingObserver
+                settingObserver,
             )
         }
     }
@@ -504,7 +504,7 @@
         val isCurrent = currentClockId == info.metadata.clockId
         logger.log(
             if (isCurrent) LogLevel.INFO else LogLevel.DEBUG,
-            { "Connected $str1 @$str2" + if (bool1) " (Current Clock)" else "" }
+            { "Connected $str1 @$str2" + if (bool1) " (Current Clock)" else "" },
         ) {
             str1 = info.metadata.clockId
             str2 = info.manager.toString()
@@ -516,7 +516,7 @@
         val isCurrent = currentClockId == info.metadata.clockId
         logger.log(
             if (isCurrent) LogLevel.INFO else LogLevel.DEBUG,
-            { "Loaded $str1 @$str2" + if (bool1) " (Current Clock)" else "" }
+            { "Loaded $str1 @$str2" + if (bool1) " (Current Clock)" else "" },
         ) {
             str1 = info.metadata.clockId
             str2 = info.manager.toString()
@@ -532,7 +532,7 @@
         val isCurrent = currentClockId == info.metadata.clockId
         logger.log(
             if (isCurrent) LogLevel.WARNING else LogLevel.DEBUG,
-            { "Unloaded $str1 @$str2" + if (bool1) " (Current Clock)" else "" }
+            { "Unloaded $str1 @$str2" + if (bool1) " (Current Clock)" else "" },
         ) {
             str1 = info.metadata.clockId
             str2 = info.manager.toString()
@@ -548,7 +548,7 @@
         val isCurrent = currentClockId == info.metadata.clockId
         logger.log(
             if (isCurrent) LogLevel.INFO else LogLevel.DEBUG,
-            { "Disconnected $str1 @$str2" + if (bool1) " (Current Clock)" else "" }
+            { "Disconnected $str1 @$str2" + if (bool1) " (Current Clock)" else "" },
         ) {
             str1 = info.metadata.clockId
             str2 = info.manager.toString()
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt
index 4802e34..07191c6 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt
@@ -34,7 +34,7 @@
     val layoutInflater: LayoutInflater,
     val resources: Resources,
     val hasStepClockAnimation: Boolean = false,
-    val migratedClocks: Boolean = false
+    val migratedClocks: Boolean = false,
 ) : ClockProvider {
     private var messageBuffers: ClockMessageBuffers? = null
 
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DigitTranslateAnimator.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DigitTranslateAnimator.kt
new file mode 100644
index 0000000..3869706
--- /dev/null
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DigitTranslateAnimator.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2024 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.systemui.shared.clocks
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.animation.TimeInterpolator
+import android.animation.ValueAnimator
+import android.graphics.Point
+
+class DigitTranslateAnimator(val updateCallback: () -> Unit) {
+    val DEFAULT_ANIMATION_DURATION = 500L
+    val updatedTranslate = Point(0, 0)
+
+    val baseTranslation = Point(0, 0)
+    var targetTranslation: Point? = null
+    val bounceAnimator: ValueAnimator =
+        ValueAnimator.ofFloat(1f).apply {
+            duration = DEFAULT_ANIMATION_DURATION
+            addUpdateListener {
+                updateTranslation(it.animatedFraction, updatedTranslate)
+                updateCallback()
+            }
+            addListener(
+                object : AnimatorListenerAdapter() {
+                    override fun onAnimationEnd(animation: Animator) {
+                        rebase()
+                    }
+
+                    override fun onAnimationCancel(animation: Animator) {
+                        rebase()
+                    }
+                }
+            )
+        }
+
+    fun rebase() {
+        baseTranslation.x = updatedTranslate.x
+        baseTranslation.y = updatedTranslate.y
+    }
+
+    fun animatePosition(
+        animate: Boolean = true,
+        delay: Long = 0,
+        duration: Long = -1L,
+        interpolator: TimeInterpolator? = null,
+        targetTranslation: Point? = null,
+        onAnimationEnd: Runnable? = null,
+    ) {
+        this.targetTranslation = targetTranslation ?: Point(0, 0)
+        if (animate) {
+            bounceAnimator.cancel()
+            bounceAnimator.startDelay = delay
+            bounceAnimator.duration =
+                if (duration == -1L) {
+                    DEFAULT_ANIMATION_DURATION
+                } else {
+                    duration
+                }
+            interpolator?.let { bounceAnimator.interpolator = it }
+            if (onAnimationEnd != null) {
+                val listener =
+                    object : AnimatorListenerAdapter() {
+                        override fun onAnimationEnd(animation: Animator) {
+                            onAnimationEnd.run()
+                            bounceAnimator.removeListener(this)
+                        }
+
+                        override fun onAnimationCancel(animation: Animator) {
+                            bounceAnimator.removeListener(this)
+                        }
+                    }
+                bounceAnimator.addListener(listener)
+            }
+            bounceAnimator.start()
+        } else {
+            // No animation is requested, thus set base and target state to the same state.
+            updateTranslation(1F, updatedTranslate)
+            rebase()
+            updateCallback()
+        }
+    }
+
+    fun updateTranslation(progress: Float, outPoint: Point) {
+        outPoint.x =
+            (baseTranslation.x + progress * (targetTranslation!!.x - baseTranslation.x)).toInt()
+        outPoint.y =
+            (baseTranslation.y + progress * (targetTranslation!!.y - baseTranslation.y)).toInt()
+    }
+}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DimensionParser.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DimensionParser.kt
new file mode 100644
index 0000000..2be6c65
--- /dev/null
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DimensionParser.kt
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2024 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.systemui.shared.clocks
+
+import android.content.Context
+import android.util.TypedValue
+import java.util.regex.Pattern
+
+class DimensionParser(private val ctx: Context) {
+    fun convert(dimension: String?): Float? {
+        if (dimension == null) {
+            return null
+        }
+        return convert(dimension)
+    }
+
+    fun convert(dimension: String): Float {
+        val metrics = ctx.resources.displayMetrics
+        val (value, unit) = parse(dimension)
+        return TypedValue.applyDimension(unit, value, metrics)
+    }
+
+    fun parse(dimension: String): Pair<Float, Int> {
+        val matcher = parserPattern.matcher(dimension)
+        if (!matcher.matches()) {
+            throw NumberFormatException("Failed to parse '$dimension'")
+        }
+
+        val value =
+            matcher.group(1)?.toFloat() ?: throw NumberFormatException("Bad value in '$dimension'")
+        val unit =
+            dimensionMap.get(matcher.group(3) ?: "")
+                ?: throw NumberFormatException("Bad unit in '$dimension'")
+        return Pair(value, unit)
+    }
+
+    private companion object {
+        val parserPattern = Pattern.compile("(\\d+(\\.\\d+)?)([a-z]+)")
+        val dimensionMap =
+            mapOf(
+                "dp" to TypedValue.COMPLEX_UNIT_DIP,
+                "dip" to TypedValue.COMPLEX_UNIT_DIP,
+                "sp" to TypedValue.COMPLEX_UNIT_SP,
+                "px" to TypedValue.COMPLEX_UNIT_PX,
+                "pt" to TypedValue.COMPLEX_UNIT_PT,
+                "mm" to TypedValue.COMPLEX_UNIT_MM,
+                "in" to TypedValue.COMPLEX_UNIT_IN,
+            )
+    }
+}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/LogUtil.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/LogUtil.kt
new file mode 100644
index 0000000..34cb4ef
--- /dev/null
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/LogUtil.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2024 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.systemui.shared.clocks
+
+import com.android.systemui.log.core.LogLevel
+import com.android.systemui.log.core.LogcatOnlyMessageBuffer
+import com.android.systemui.log.core.Logger
+
+object LogUtil {
+    // Used when MessageBuffers are not provided by the host application
+    val DEFAULT_MESSAGE_BUFFER = LogcatOnlyMessageBuffer(LogLevel.INFO)
+
+    // Only intended for use during initialization steps where the correct logger doesn't exist yet
+    val FALLBACK_INIT_LOGGER = Logger(LogcatOnlyMessageBuffer(LogLevel.ERROR), "CLOCK_INIT")
+
+    // Debug is primarially used for tests, but can also be used for tracking down hard issues.
+    val DEBUG_MESSAGE_BUFFER = LogcatOnlyMessageBuffer(LogLevel.DEBUG)
+}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/TypefaceCache.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/TypefaceCache.kt
new file mode 100644
index 0000000..f5a9375
--- /dev/null
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/TypefaceCache.kt
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2024 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.systemui.shared.clocks
+
+import android.graphics.Typeface
+import com.android.systemui.animation.TypefaceVariantCache
+import com.android.systemui.log.core.Logger
+import com.android.systemui.log.core.MessageBuffer
+import java.lang.ref.ReferenceQueue
+import java.lang.ref.WeakReference
+
+class TypefaceCache(messageBuffer: MessageBuffer, val typefaceFactory: (String) -> Typeface) {
+    private val logger = Logger(messageBuffer, this::class.simpleName!!)
+
+    private data class CacheKey(val res: String, val fvar: String?)
+
+    private inner class WeakTypefaceRef(val key: CacheKey, typeface: Typeface) :
+        WeakReference<Typeface>(typeface, queue)
+
+    private var totalHits = 0
+
+    private var totalMisses = 0
+
+    private var totalEvictions = 0
+
+    // We use a map of WeakRefs here instead of an LruCache. This prevents needing to resize the
+    // cache depending on the number of distinct fonts used by a clock, as different clocks have
+    // different numbers of simultaneously loaded and configured fonts. Because our clocks tend to
+    // initialize a number of parallel views and animators, our usages of Typefaces overlap. As a
+    // result, once a typeface is no longer being used, it is unlikely to be recreated immediately.
+    private val cache = mutableMapOf<CacheKey, WeakTypefaceRef>()
+    private val queue = ReferenceQueue<Typeface>()
+
+    fun getTypeface(res: String): Typeface {
+        checkQueue()
+        val key = CacheKey(res, null)
+        cache.get(key)?.get()?.let {
+            logHit(key)
+            return it
+        }
+
+        logMiss(key)
+        val result = typefaceFactory(res)
+        cache.put(key, WeakTypefaceRef(key, result))
+        return result
+    }
+
+    fun getVariantCache(res: String): TypefaceVariantCache {
+        val baseTypeface = getTypeface(res)
+        return object : TypefaceVariantCache {
+            override fun getTypefaceForVariant(fvar: String?): Typeface? {
+                checkQueue()
+                val key = CacheKey(res, fvar)
+                cache.get(key)?.get()?.let {
+                    logHit(key)
+                    return it
+                }
+
+                logMiss(key)
+                return TypefaceVariantCache.createVariantTypeface(baseTypeface, fvar).also {
+                    cache.put(key, WeakTypefaceRef(key, it))
+                }
+            }
+        }
+    }
+
+    private fun logHit(key: CacheKey) {
+        totalHits++
+        if (DEBUG_HITS)
+            logger.i({ "HIT: $str1; Total: $int1" }) {
+                str1 = key.toString()
+                int1 = totalHits
+            }
+    }
+
+    private fun logMiss(key: CacheKey) {
+        totalMisses++
+        logger.w({ "MISS: $str1; Total: $int1" }) {
+            str1 = key.toString()
+            int1 = totalMisses
+        }
+    }
+
+    private fun logEviction(key: CacheKey) {
+        totalEvictions++
+        logger.i({ "EVICTED: $str1; Total: $int1" }) {
+            str1 = key.toString()
+            int1 = totalEvictions
+        }
+    }
+
+    private fun checkQueue() =
+        generateSequence { queue.poll() }
+            .filterIsInstance<WeakTypefaceRef>()
+            .forEach {
+                logEviction(it.key)
+                cache.remove(it.key)
+            }
+
+    companion object {
+        private val DEBUG_HITS = false
+    }
+}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/DigitalClockFaceView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/DigitalClockFaceView.kt
new file mode 100644
index 0000000..eb72346
--- /dev/null
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/DigitalClockFaceView.kt
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2024 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.systemui.shared.clocks.view
+
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.Point
+import android.view.View
+import android.widget.FrameLayout
+import androidx.annotation.VisibleForTesting
+import com.android.systemui.log.core.Logger
+import com.android.systemui.log.core.MessageBuffer
+import com.android.systemui.plugins.clocks.AlarmData
+import com.android.systemui.plugins.clocks.WeatherData
+import com.android.systemui.plugins.clocks.ZenData
+import com.android.systemui.shared.clocks.AssetLoader
+import com.android.systemui.shared.clocks.LogUtil
+import java.util.Locale
+
+abstract class DigitalClockFaceView(ctx: Context, messageBuffer: MessageBuffer) : FrameLayout(ctx) {
+    protected val logger = Logger(messageBuffer, this::class.simpleName!!)
+        get() = field ?: LogUtil.FALLBACK_INIT_LOGGER
+
+    abstract var digitalClockTextViewMap: MutableMap<Int, SimpleDigitalClockTextView>
+
+    @VisibleForTesting
+    var isAnimationEnabled = true
+        set(value) {
+            field = value
+            digitalClockTextViewMap.forEach { _, view -> view.isAnimationEnabled = value }
+        }
+
+    var dozeFraction: Float = 0F
+        set(value) {
+            field = value
+            digitalClockTextViewMap.forEach { _, view -> view.dozeFraction = field }
+        }
+
+    val dozeControlState = DozeControlState()
+
+    var isReactiveTouchInteractionEnabled = false
+        set(value) {
+            field = value
+        }
+
+    open val text: String?
+        get() = null
+
+    open fun refreshTime() = logger.d("refreshTime()")
+
+    override fun invalidate() {
+        logger.d("invalidate()")
+        super.invalidate()
+    }
+
+    override fun requestLayout() {
+        logger.d("requestLayout()")
+        super.requestLayout()
+    }
+
+    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
+        logger.d("onMeasure()")
+        calculateSize(widthMeasureSpec, heightMeasureSpec)?.let { setMeasuredDimension(it.x, it.y) }
+            ?: run { super.onMeasure(widthMeasureSpec, heightMeasureSpec) }
+        calculateLeftTopPosition()
+        dozeControlState.animateReady = true
+    }
+
+    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
+        logger.d("onLayout()")
+        super.onLayout(changed, left, top, right, bottom)
+    }
+
+    override fun onDraw(canvas: Canvas) {
+        text?.let { logger.d({ "onDraw($str1)" }) { str1 = it } } ?: run { logger.d("onDraw()") }
+        super.onDraw(canvas)
+    }
+
+    /*
+     * Called in onMeasure to generate width/height overrides to the normal measuring logic. A null
+     * result causes the normal view measuring logic to execute.
+     */
+    protected open fun calculateSize(widthMeasureSpec: Int, heightMeasureSpec: Int): Point? = null
+
+    protected open fun calculateLeftTopPosition() {}
+
+    override fun addView(child: View?) {
+        if (child == null) return
+        logger.d({ "addView($str1 @$int1)" }) {
+            str1 = child::class.simpleName!!
+            int1 = child.id
+        }
+        super.addView(child)
+        if (child is SimpleDigitalClockTextView) {
+            digitalClockTextViewMap[child.id] = child
+        }
+        child.setWillNotDraw(true)
+    }
+
+    open fun animateDoze(isDozing: Boolean, isAnimated: Boolean) {
+        digitalClockTextViewMap.forEach { _, view -> view.animateDoze(isDozing, isAnimated) }
+    }
+
+    open fun animateCharge() {
+        digitalClockTextViewMap.forEach { _, view -> view.animateCharge() }
+    }
+
+    open fun onPositionUpdated(fromLeft: Int, direction: Int, fraction: Float) {}
+
+    fun updateColors(assets: AssetLoader, isRegionDark: Boolean) {
+        digitalClockTextViewMap.forEach { _, view -> view.updateColors(assets, isRegionDark) }
+        invalidate()
+    }
+
+    fun onFontSettingChanged(fontSizePx: Float) {
+        digitalClockTextViewMap.forEach { _, view -> view.applyTextSize(fontSizePx) }
+    }
+
+    open val hasCustomWeatherDataDisplay
+        get() = false
+
+    open val hasCustomPositionUpdatedAnimation
+        get() = false
+
+    /** True if it's large weather clock, will use weatherBlueprint in compose */
+    open val useCustomClockScene
+        get() = false
+
+    // TODO: implement ClockEventUnion?
+    open fun onLocaleChanged(locale: Locale) {}
+
+    open fun onWeatherDataChanged(data: WeatherData) {}
+
+    open fun onAlarmDataChanged(data: AlarmData) {}
+
+    open fun onZenDataChanged(data: ZenData) {}
+
+    open fun onPickerCarouselSwiping(swipingFraction: Float) {}
+
+    open fun isAlignedWithScreen(): Boolean = false
+
+    /**
+     * animateDoze needs correct translate value, which is calculated in onMeasure so we need to
+     * delay this animation when we get correct values
+     */
+    class DozeControlState {
+        var animateDoze: () -> Unit = {}
+            set(value) {
+                if (animateReady) {
+                    value()
+                    field = {}
+                } else {
+                    field = value
+                }
+            }
+
+        var animateReady = false
+            set(value) {
+                if (value) {
+                    animateDoze()
+                    animateDoze = {}
+                }
+                field = value
+            }
+    }
+}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/FlexClockView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/FlexClockView.kt
new file mode 100644
index 0000000..c29c8da
--- /dev/null
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/FlexClockView.kt
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2024 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.systemui.shared.clocks.view
+
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.Point
+import android.view.MotionEvent
+import android.view.View
+import android.view.ViewGroup
+import android.widget.RelativeLayout
+import com.android.app.animation.Interpolators
+import com.android.systemui.customization.R
+import com.android.systemui.log.core.MessageBuffer
+import com.android.systemui.shared.clocks.AssetLoader
+import com.android.systemui.shared.clocks.DigitTranslateAnimator
+import com.android.systemui.shared.clocks.FontTextStyle
+import kotlin.math.abs
+import kotlin.math.max
+import kotlin.math.min
+
+fun clamp(value: Float, minVal: Float, maxVal: Float): Float = max(min(value, maxVal), minVal)
+
+class FlexClockView(context: Context, val assetLoader: AssetLoader, messageBuffer: MessageBuffer) :
+    DigitalClockFaceView(context, messageBuffer) {
+    override var digitalClockTextViewMap = mutableMapOf<Int, SimpleDigitalClockTextView>()
+    val digitLeftTopMap = mutableMapOf<Int, Point>()
+    var maxSingleDigitHeight = -1
+    var maxSingleDigitWidth = -1
+    val lockscreenTranslate = Point(0, 0)
+    val aodTranslate = Point(0, 0)
+
+    init {
+        setWillNotDraw(false)
+        layoutParams =
+            RelativeLayout.LayoutParams(
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+            )
+    }
+
+    private var prevX = 0f
+    private var prevY = 0f
+    private var isDown = false
+
+    // TODO(b/340253296): Genericize; json spec
+    private var wght = 603f
+    private var wdth = 100f
+
+    // TODO(b/340253296): Json spec
+    private val MAX_WGHT = 950f
+    private val MIN_WGHT = 50f
+    private val WGHT_SCALE = 0.5f
+
+    private val MAX_WDTH = 150f
+    private val MIN_WDTH = 0f
+    private val WDTH_SCALE = 0.2f
+
+    override fun onTouchEvent(evt: MotionEvent): Boolean {
+        // TODO(b/340253296): implement on DigitalClockFaceView?
+        if (!isReactiveTouchInteractionEnabled) {
+            return super.onTouchEvent(evt)
+        }
+
+        when (evt.action) {
+            MotionEvent.ACTION_DOWN -> {
+                isDown = true
+                prevX = evt.x
+                prevY = evt.y
+                return true
+            }
+
+            MotionEvent.ACTION_MOVE -> {
+                if (!isDown) {
+                    return super.onTouchEvent(evt)
+                }
+
+                wdth = clamp(wdth + (evt.x - prevX) * WDTH_SCALE, MIN_WDTH, MAX_WDTH)
+                wght = clamp(wght + (evt.y - prevY) * WGHT_SCALE, MIN_WGHT, MAX_WGHT)
+                prevX = evt.x
+                prevY = evt.y
+
+                // TODO(b/340253296): Genericize; json spec
+                val fvar = "'wght' $wght, 'wdth' $wdth, 'opsz' 144, 'ROND' 100"
+                digitalClockTextViewMap.forEach { (_, view) ->
+                    val textStyle = view.textStyle as FontTextStyle
+                    textStyle.fontVariation = fvar
+                    view.applyStyles(assetLoader, textStyle, view.aodStyle)
+                }
+
+                requestLayout()
+                invalidate()
+                return true
+            }
+
+            MotionEvent.ACTION_UP -> {
+                isDown = false
+                return true
+            }
+        }
+
+        return super.onTouchEvent(evt)
+    }
+
+    override fun addView(child: View?) {
+        super.addView(child)
+        (child as SimpleDigitalClockTextView).digitTranslateAnimator =
+            DigitTranslateAnimator(::invalidate)
+    }
+
+    protected override fun calculateSize(widthMeasureSpec: Int, heightMeasureSpec: Int): Point {
+        digitalClockTextViewMap.forEach { (_, textView) ->
+            textView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED)
+        }
+        val textView = digitalClockTextViewMap[R.id.HOUR_FIRST_DIGIT]!!
+        maxSingleDigitHeight = textView.measuredHeight
+        maxSingleDigitWidth = textView.measuredWidth
+        aodTranslate.x = -(maxSingleDigitWidth * AOD_HORIZONTAL_TRANSLATE_RATIO).toInt()
+        aodTranslate.y = (maxSingleDigitHeight * AOD_VERTICAL_TRANSLATE_RATIO).toInt()
+        return Point(
+            ((maxSingleDigitWidth + abs(aodTranslate.x)) * 2),
+            ((maxSingleDigitHeight + abs(aodTranslate.y)) * 2),
+        )
+    }
+
+    protected override fun calculateLeftTopPosition() {
+        digitLeftTopMap[R.id.HOUR_FIRST_DIGIT] = Point(0, 0)
+        digitLeftTopMap[R.id.HOUR_SECOND_DIGIT] = Point(maxSingleDigitWidth, 0)
+        digitLeftTopMap[R.id.MINUTE_FIRST_DIGIT] = Point(0, maxSingleDigitHeight)
+        digitLeftTopMap[R.id.MINUTE_SECOND_DIGIT] = Point(maxSingleDigitWidth, maxSingleDigitHeight)
+        digitLeftTopMap.forEach { _, point ->
+            point.x += abs(aodTranslate.x)
+            point.y += abs(aodTranslate.y)
+        }
+    }
+
+    override fun refreshTime() {
+        super.refreshTime()
+        digitalClockTextViewMap.forEach { (_, textView) -> textView.refreshText() }
+    }
+
+    override fun onDraw(canvas: Canvas) {
+        super.onDraw(canvas)
+        digitalClockTextViewMap.forEach { (id, _) ->
+            val textView = digitalClockTextViewMap[id]!!
+            canvas.translate(digitLeftTopMap[id]!!.x.toFloat(), digitLeftTopMap[id]!!.y.toFloat())
+            textView.draw(canvas)
+            canvas.translate(-digitLeftTopMap[id]!!.x.toFloat(), -digitLeftTopMap[id]!!.y.toFloat())
+        }
+    }
+
+    override fun animateDoze(isDozing: Boolean, isAnimated: Boolean) {
+        dozeControlState.animateDoze = {
+            super.animateDoze(isDozing, isAnimated)
+            if (maxSingleDigitHeight == -1) {
+                measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED)
+            }
+            digitalClockTextViewMap.forEach { (id, textView) ->
+                textView.digitTranslateAnimator?.let {
+                    if (!isDozing) {
+                        it.animatePosition(
+                            animate = isAnimated && isAnimationEnabled,
+                            interpolator = Interpolators.EMPHASIZED,
+                            duration = AOD_TRANSITION_DURATION,
+                            targetTranslation =
+                                updateDirectionalTargetTranslate(id, lockscreenTranslate),
+                        )
+                    } else {
+                        it.animatePosition(
+                            animate = isAnimated && isAnimationEnabled,
+                            interpolator = Interpolators.EMPHASIZED,
+                            duration = AOD_TRANSITION_DURATION,
+                            onAnimationEnd = null,
+                            targetTranslation = updateDirectionalTargetTranslate(id, aodTranslate),
+                        )
+                    }
+                }
+            }
+        }
+    }
+
+    override fun animateCharge() {
+        super.animateCharge()
+        digitalClockTextViewMap.forEach { (id, textView) ->
+            textView.digitTranslateAnimator?.let {
+                it.animatePosition(
+                    animate = isAnimationEnabled,
+                    interpolator = Interpolators.EMPHASIZED,
+                    duration = CHARGING_TRANSITION_DURATION,
+                    onAnimationEnd = {
+                        it.animatePosition(
+                            animate = isAnimationEnabled,
+                            interpolator = Interpolators.EMPHASIZED,
+                            duration = CHARGING_TRANSITION_DURATION,
+                            targetTranslation =
+                                updateDirectionalTargetTranslate(
+                                    id,
+                                    if (dozeFraction == 1F) aodTranslate else lockscreenTranslate,
+                                ),
+                        )
+                    },
+                    targetTranslation =
+                        updateDirectionalTargetTranslate(
+                            id,
+                            if (dozeFraction == 1F) lockscreenTranslate else aodTranslate,
+                        ),
+                )
+            }
+        }
+    }
+
+    companion object {
+        val AOD_TRANSITION_DURATION = 750L
+        val CHARGING_TRANSITION_DURATION = 300L
+
+        val AOD_HORIZONTAL_TRANSLATE_RATIO = 0.15F
+        val AOD_VERTICAL_TRANSLATE_RATIO = 0.075F
+
+        // Use the sign of targetTranslation to control the direction of digit translation
+        fun updateDirectionalTargetTranslate(id: Int, targetTranslation: Point): Point {
+            val outPoint = Point(targetTranslation)
+            when (id) {
+                R.id.HOUR_FIRST_DIGIT -> {
+                    outPoint.x *= -1
+                    outPoint.y *= -1
+                }
+
+                R.id.HOUR_SECOND_DIGIT -> {
+                    outPoint.x *= 1
+                    outPoint.y *= -1
+                }
+
+                R.id.MINUTE_FIRST_DIGIT -> {
+                    outPoint.x *= -1
+                    outPoint.y *= 1
+                }
+
+                R.id.MINUTE_SECOND_DIGIT -> {
+                    outPoint.x *= 1
+                    outPoint.y *= 1
+                }
+            }
+            return outPoint
+        }
+    }
+}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
new file mode 100644
index 0000000..74617b1
--- /dev/null
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
@@ -0,0 +1,654 @@
+/*
+ * Copyright (C) 2024 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.systemui.shared.clocks.view
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.Paint
+import android.graphics.Point
+import android.graphics.PorterDuff
+import android.graphics.PorterDuffXfermode
+import android.graphics.Rect
+import android.text.Layout
+import android.text.TextPaint
+import android.util.AttributeSet
+import android.util.Log
+import android.util.MathUtils
+import android.util.TypedValue
+import android.view.View.MeasureSpec.AT_MOST
+import android.view.View.MeasureSpec.EXACTLY
+import android.view.animation.Interpolator
+import android.widget.TextView
+import com.android.internal.annotations.VisibleForTesting
+import com.android.systemui.animation.TextAnimator
+import com.android.systemui.animation.TypefaceVariantCache
+import com.android.systemui.customization.R
+import com.android.systemui.log.core.Logger
+import com.android.systemui.log.core.MessageBuffer
+import com.android.systemui.shared.clocks.AssetLoader
+import com.android.systemui.shared.clocks.ClockAnimation
+import com.android.systemui.shared.clocks.DigitTranslateAnimator
+import com.android.systemui.shared.clocks.DimensionParser
+import com.android.systemui.shared.clocks.FontTextStyle
+import com.android.systemui.shared.clocks.LogUtil
+import com.android.systemui.shared.clocks.RenderType
+import com.android.systemui.shared.clocks.TextStyle
+import java.lang.Thread
+import kotlin.math.ceil
+import kotlin.math.max
+import kotlin.math.min
+
+private val TAG = SimpleDigitalClockTextView::class.simpleName!!
+
+@SuppressLint("AppCompatCustomView")
+open class SimpleDigitalClockTextView(
+    ctx: Context,
+    messageBuffer: MessageBuffer,
+    attrs: AttributeSet? = null,
+) : TextView(ctx, attrs), SimpleDigitalClockView {
+    val lockScreenPaint = TextPaint()
+    override lateinit var textStyle: FontTextStyle
+    lateinit var aodStyle: FontTextStyle
+    private val parser = DimensionParser(ctx)
+    var maxSingleDigitHeight = -1
+    var maxSingleDigitWidth = -1
+    var digitTranslateAnimator: DigitTranslateAnimator? = null
+    var aodFontSizePx: Float = -1F
+    var isVertical: Boolean = false
+
+    // Store the font size when there's no height constraint as a reference when adjusting font size
+    private var lastUnconstrainedTextSize: Float = Float.MAX_VALUE
+    // Calculated by height of styled text view / text size
+    // Used as a factor to calculate a smaller font size when text height is constrained
+    @VisibleForTesting var fontSizeAdjustFactor = 1F
+
+    private val initThread = Thread.currentThread()
+
+    // textBounds is the size of text in LS, which only measures current text in lockscreen style
+    var textBounds = Rect()
+    // prevTextBounds and targetTextBounds are to deal with dozing animation between LS and AOD
+    // especially for the textView which has different bounds during the animation
+    // prevTextBounds holds the state we are transitioning from
+    private val prevTextBounds = Rect()
+    // targetTextBounds holds the state we are interpolating to
+    private val targetTextBounds = Rect()
+    protected val logger = Logger(messageBuffer, this::class.simpleName!!)
+        get() = field ?: LogUtil.FALLBACK_INIT_LOGGER
+
+    private var aodDozingInterpolator: Interpolator? = null
+
+    @VisibleForTesting lateinit var textAnimator: TextAnimator
+    @VisibleForTesting var outlineAnimator: TextAnimator? = null
+    // used for hollow style for AOD version
+    // because stroke style for some fonts have some unwanted inner strokes
+    // we want to draw this layer on top to oclude them
+    @VisibleForTesting var innerAnimator: TextAnimator? = null
+
+    lateinit var typefaceCache: TypefaceVariantCache
+        private set
+
+    private fun setTypefaceCache(value: TypefaceVariantCache) {
+        typefaceCache = value
+        if (this::textAnimator.isInitialized) {
+            textAnimator.typefaceCache = value
+        }
+        outlineAnimator?.typefaceCache = value
+        innerAnimator?.typefaceCache = value
+    }
+
+    @VisibleForTesting
+    var textAnimatorFactory: (Layout, () -> Unit) -> TextAnimator = { layout, invalidateCb ->
+        TextAnimator(layout, ClockAnimation.NUM_CLOCK_FONT_ANIMATION_STEPS, invalidateCb).also {
+            if (this::typefaceCache.isInitialized) {
+                it.typefaceCache = typefaceCache
+            }
+        }
+    }
+
+    override var verticalAlignment: VerticalAlignment = VerticalAlignment.CENTER
+    override var horizontalAlignment: HorizontalAlignment = HorizontalAlignment.LEFT
+    override var isAnimationEnabled = true
+    override var dozeFraction: Float = 0F
+        set(value) {
+            field = value
+            invalidate()
+        }
+
+    // Have to passthrough to unify View with SimpleDigitalClockView
+    override var text: String
+        get() = super.getText().toString()
+        set(value) = super.setText(value)
+
+    var textBorderWidth = 0F
+    var aodBorderWidth = 0F
+    var baselineFromMeasure = 0
+
+    var textFillColor: Int? = null
+    var textOutlineColor = TEXT_OUTLINE_DEFAULT_COLOR
+    var aodFillColor = AOD_DEFAULT_COLOR
+    var aodOutlineColor = AOD_OUTLINE_DEFAULT_COLOR
+
+    override fun updateColors(assets: AssetLoader, isRegionDark: Boolean) {
+        val fillColor = if (isRegionDark) textStyle.fillColorLight else textStyle.fillColorDark
+        textFillColor =
+            fillColor?.let { assets.readColor(it) }
+                ?: assets.seedColor
+                ?: getDefaultColor(assets, isRegionDark)
+        // for NumberOverlapView to read correct color
+        lockScreenPaint.color = textFillColor as Int
+        textStyle.outlineColor?.let { textOutlineColor = assets.readColor(it) }
+            ?: run { textOutlineColor = TEXT_OUTLINE_DEFAULT_COLOR }
+        (aodStyle.fillColorLight ?: aodStyle.fillColorDark)?.let {
+            aodFillColor = assets.readColor(it)
+        } ?: run { aodFillColor = AOD_DEFAULT_COLOR }
+        aodStyle.outlineColor?.let { aodOutlineColor = assets.readColor(it) }
+            ?: run { aodOutlineColor = AOD_OUTLINE_DEFAULT_COLOR }
+        if (dozeFraction < 1f) {
+            textAnimator.setTextStyle(color = textFillColor, animate = false)
+            outlineAnimator?.setTextStyle(color = textOutlineColor, animate = false)
+        }
+        invalidate()
+    }
+
+    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
+        logger.d("onMeasure()")
+        if (isVertical) {
+            // use at_most to avoid apply measuredWidth from last measuring to measuredHeight
+            // cause we use max to setMeasuredDimension
+            super.onMeasure(
+                MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), AT_MOST),
+                MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec), AT_MOST),
+            )
+        } else {
+            super.onMeasure(widthMeasureSpec, heightMeasureSpec)
+        }
+
+        val layout = this.layout
+        if (layout != null) {
+            if (!this::textAnimator.isInitialized) {
+                textAnimator = textAnimatorFactory(layout, ::invalidate)
+                outlineAnimator = textAnimatorFactory(layout) {}
+                innerAnimator = textAnimatorFactory(layout) {}
+                setInterpolatorPaint()
+            } else {
+                textAnimator.updateLayout(layout)
+                outlineAnimator?.updateLayout(layout)
+                innerAnimator?.updateLayout(layout)
+            }
+            baselineFromMeasure = layout.getLineBaseline(0)
+        } else {
+            val currentThread = Thread.currentThread()
+            Log.wtf(
+                TAG,
+                "TextView.getLayout() is null after measure! " +
+                    "currentThread=$currentThread; initThread=$initThread",
+            )
+        }
+
+        var expectedWidth: Int
+        var expectedHeight: Int
+
+        if (MeasureSpec.getMode(heightMeasureSpec) == EXACTLY) {
+            // For view which has fixed height, e.g. small clock,
+            // we should always return the size required from parent view
+            expectedHeight = heightMeasureSpec
+        } else {
+            expectedHeight =
+                MeasureSpec.makeMeasureSpec(
+                    if (isSingleDigit()) {
+                        maxSingleDigitHeight
+                    } else {
+                        textBounds.height() + 2 * lockScreenPaint.strokeWidth.toInt()
+                    },
+                    MeasureSpec.getMode(measuredHeight),
+                )
+        }
+        if (MeasureSpec.getMode(widthMeasureSpec) == EXACTLY) {
+            expectedWidth = widthMeasureSpec
+        } else {
+            expectedWidth =
+                MeasureSpec.makeMeasureSpec(
+                    if (isSingleDigit()) {
+                        maxSingleDigitWidth
+                    } else {
+                        max(
+                            textBounds.width() + 2 * lockScreenPaint.strokeWidth.toInt(),
+                            MeasureSpec.getSize(measuredWidth),
+                        )
+                    },
+                    MeasureSpec.getMode(measuredWidth),
+                )
+        }
+
+        if (isVertical) {
+            expectedWidth = expectedHeight.also { expectedHeight = expectedWidth }
+        }
+        setMeasuredDimension(expectedWidth, expectedHeight)
+    }
+
+    override fun onDraw(canvas: Canvas) {
+        if (isVertical) {
+            canvas.save()
+            canvas.translate(0F, measuredHeight.toFloat())
+            canvas.rotate(-90F)
+        }
+        logger.d({ "onDraw(); ls: $str1; aod: $str2;" }) {
+            str1 = textAnimator.textInterpolator.shapedText
+            str2 = outlineAnimator?.textInterpolator?.shapedText
+        }
+        val translation = getLocalTranslation()
+        canvas.translate(translation.x.toFloat(), translation.y.toFloat())
+        digitTranslateAnimator?.let {
+            canvas.translate(it.updatedTranslate.x.toFloat(), it.updatedTranslate.y.toFloat())
+        }
+
+        if (aodStyle.renderType == RenderType.HOLLOW_TEXT) {
+            canvas.saveLayer(
+                -translation.x.toFloat(),
+                -translation.y.toFloat(),
+                (-translation.x + measuredWidth).toFloat(),
+                (-translation.y + measuredHeight).toFloat(),
+                null,
+            )
+            outlineAnimator?.draw(canvas)
+            canvas.saveLayer(
+                -translation.x.toFloat(),
+                -translation.y.toFloat(),
+                (-translation.x + measuredWidth).toFloat(),
+                (-translation.y + measuredHeight).toFloat(),
+                Paint().also { it.xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_OUT) },
+            )
+            innerAnimator?.draw(canvas)
+            canvas.restore()
+            canvas.restore()
+        } else if (aodStyle.renderType != RenderType.CHANGE_WEIGHT) {
+            outlineAnimator?.draw(canvas)
+        }
+        textAnimator.draw(canvas)
+
+        digitTranslateAnimator?.let {
+            canvas.translate(-it.updatedTranslate.x.toFloat(), -it.updatedTranslate.y.toFloat())
+        }
+        canvas.translate(-translation.x.toFloat(), -translation.y.toFloat())
+        if (isVertical) {
+            canvas.restore()
+        }
+    }
+
+    override fun invalidate() {
+        logger.d("invalidate()")
+        super.invalidate()
+        (parent as? DigitalClockFaceView)?.invalidate()
+    }
+
+    override fun refreshTime() {
+        logger.d("refreshTime()")
+        refreshText()
+    }
+
+    override fun animateDoze(isDozing: Boolean, isAnimated: Boolean) {
+        if (!this::textAnimator.isInitialized) {
+            return
+        }
+        val fvar = if (isDozing) aodStyle.fontVariation else textStyle.fontVariation
+        textAnimator.setTextStyle(
+            animate = isAnimated && isAnimationEnabled,
+            color = if (isDozing) aodFillColor else textFillColor,
+            textSize = if (isDozing) aodFontSizePx else lockScreenPaint.textSize,
+            fvar = fvar,
+            duration = aodStyle.transitionDuration,
+            interpolator = aodDozingInterpolator,
+        )
+        updateTextBoundsForTextAnimator()
+        outlineAnimator?.setTextStyle(
+            animate = isAnimated && isAnimationEnabled,
+            color = if (isDozing) aodOutlineColor else textOutlineColor,
+            textSize = if (isDozing) aodFontSizePx else lockScreenPaint.textSize,
+            fvar = fvar,
+            strokeWidth = if (isDozing) aodBorderWidth else textBorderWidth,
+            duration = aodStyle.transitionDuration,
+            interpolator = aodDozingInterpolator,
+        )
+        innerAnimator?.setTextStyle(
+            animate = isAnimated && isAnimationEnabled,
+            color = Color.WHITE,
+            textSize = if (isDozing) aodFontSizePx else lockScreenPaint.textSize,
+            fvar = fvar,
+            duration = aodStyle.transitionDuration,
+            interpolator = aodDozingInterpolator,
+        )
+    }
+
+    override fun animateCharge() {
+        if (!this::textAnimator.isInitialized || textAnimator.isRunning()) {
+            // Skip charge animation if dozing animation is already playing.
+            return
+        }
+        logger.d("animateCharge()")
+        val middleFvar = if (dozeFraction == 0F) aodStyle.fontVariation else textStyle.fontVariation
+        val endFvar = if (dozeFraction == 0F) textStyle.fontVariation else aodStyle.fontVariation
+        val startAnimPhase2 = Runnable {
+            textAnimator.setTextStyle(fvar = endFvar, animate = isAnimationEnabled)
+            outlineAnimator?.setTextStyle(fvar = endFvar, animate = isAnimationEnabled)
+            innerAnimator?.setTextStyle(fvar = endFvar, animate = isAnimationEnabled)
+            updateTextBoundsForTextAnimator()
+        }
+        textAnimator.setTextStyle(
+            fvar = middleFvar,
+            animate = isAnimationEnabled,
+            onAnimationEnd = startAnimPhase2,
+        )
+        outlineAnimator?.setTextStyle(fvar = middleFvar, animate = isAnimationEnabled)
+        innerAnimator?.setTextStyle(fvar = middleFvar, animate = isAnimationEnabled)
+        updateTextBoundsForTextAnimator()
+    }
+
+    fun refreshText() {
+        lockScreenPaint.getTextBounds(text, 0, text.length, textBounds)
+        if (this::textAnimator.isInitialized) {
+            textAnimator.textInterpolator.targetPaint.getTextBounds(
+                text,
+                0,
+                text.length,
+                targetTextBounds,
+            )
+        }
+        if (layout == null) {
+            requestLayout()
+        } else {
+            textAnimator.updateLayout(layout)
+            outlineAnimator?.updateLayout(layout)
+            innerAnimator?.updateLayout(layout)
+        }
+    }
+
+    private fun isSingleDigit(): Boolean {
+        return id == R.id.HOUR_FIRST_DIGIT ||
+            id == R.id.HOUR_SECOND_DIGIT ||
+            id == R.id.MINUTE_FIRST_DIGIT ||
+            id == R.id.MINUTE_SECOND_DIGIT
+    }
+
+    private fun updateInterpolatedTextBounds(): Rect {
+        val interpolatedTextBounds = Rect()
+        if (textAnimator.animator.animatedFraction != 1.0f && textAnimator.animator.isRunning) {
+            interpolatedTextBounds.left =
+                MathUtils.lerp(
+                        prevTextBounds.left,
+                        targetTextBounds.left,
+                        textAnimator.animator.animatedValue as Float,
+                    )
+                    .toInt()
+
+            interpolatedTextBounds.right =
+                MathUtils.lerp(
+                        prevTextBounds.right,
+                        targetTextBounds.right,
+                        textAnimator.animator.animatedValue as Float,
+                    )
+                    .toInt()
+
+            interpolatedTextBounds.top =
+                MathUtils.lerp(
+                        prevTextBounds.top,
+                        targetTextBounds.top,
+                        textAnimator.animator.animatedValue as Float,
+                    )
+                    .toInt()
+
+            interpolatedTextBounds.bottom =
+                MathUtils.lerp(
+                        prevTextBounds.bottom,
+                        targetTextBounds.bottom,
+                        textAnimator.animator.animatedValue as Float,
+                    )
+                    .toInt()
+        } else {
+            interpolatedTextBounds.set(targetTextBounds)
+        }
+        return interpolatedTextBounds
+    }
+
+    private fun updateXtranslation(inPoint: Point, interpolatedTextBounds: Rect): Point {
+        val viewWidth = if (isVertical) measuredHeight else measuredWidth
+        when (horizontalAlignment) {
+            HorizontalAlignment.LEFT -> {
+                inPoint.x = lockScreenPaint.strokeWidth.toInt() - interpolatedTextBounds.left
+            }
+            HorizontalAlignment.RIGHT -> {
+                inPoint.x =
+                    viewWidth - interpolatedTextBounds.right - lockScreenPaint.strokeWidth.toInt()
+            }
+            HorizontalAlignment.CENTER -> {
+                inPoint.x =
+                    (viewWidth - interpolatedTextBounds.width()) / 2 - interpolatedTextBounds.left
+            }
+        }
+        return inPoint
+    }
+
+    // translation of reference point of text
+    // used for translation when calling textInterpolator
+    fun getLocalTranslation(): Point {
+        val viewHeight = if (isVertical) measuredWidth else measuredHeight
+        val interpolatedTextBounds = updateInterpolatedTextBounds()
+        val localTranslation = Point(0, 0)
+        val correctedBaseline = if (baseline != -1) baseline else baselineFromMeasure
+        // get the change from current baseline to expected baseline
+        when (verticalAlignment) {
+            VerticalAlignment.CENTER -> {
+                localTranslation.y =
+                    ((viewHeight - interpolatedTextBounds.height()) / 2 -
+                        interpolatedTextBounds.top -
+                        correctedBaseline)
+            }
+            VerticalAlignment.TOP -> {
+                localTranslation.y =
+                    (-interpolatedTextBounds.top + lockScreenPaint.strokeWidth - correctedBaseline)
+                        .toInt()
+            }
+            VerticalAlignment.BOTTOM -> {
+                localTranslation.y =
+                    viewHeight -
+                        interpolatedTextBounds.bottom -
+                        lockScreenPaint.strokeWidth.toInt() -
+                        correctedBaseline
+            }
+            VerticalAlignment.BASELINE -> {
+                localTranslation.y = -lockScreenPaint.strokeWidth.toInt()
+            }
+        }
+
+        return updateXtranslation(localTranslation, interpolatedTextBounds)
+    }
+
+    override fun applyStyles(assets: AssetLoader, textStyle: TextStyle, aodStyle: TextStyle?) {
+        this.textStyle = textStyle as FontTextStyle
+        val typefaceName = "fonts/" + textStyle.fontFamily
+        setTypefaceCache(assets.typefaceCache.getVariantCache(typefaceName))
+        lockScreenPaint.strokeJoin = Paint.Join.ROUND
+        lockScreenPaint.typeface = typefaceCache.getTypefaceForVariant(textStyle.fontVariation)
+        textStyle.fontFeatureSettings?.let {
+            lockScreenPaint.fontFeatureSettings = it
+            fontFeatureSettings = it
+        }
+        typeface = lockScreenPaint.typeface
+        textStyle.lineHeight?.let { lineHeight = it.toInt() }
+        // borderWidth in textStyle and aodStyle is used to draw,
+        // strokeWidth in lockScreenPaint is used to measure and get enough space for the text
+        textStyle.borderWidth?.let { textBorderWidth = parser.convert(it) }
+
+        if (aodStyle != null && aodStyle is FontTextStyle) {
+            this.aodStyle = aodStyle
+        } else {
+            this.aodStyle = textStyle.copy()
+        }
+        this.aodStyle.transitionInterpolator?.let { aodDozingInterpolator = it.interpolator }
+        aodBorderWidth = parser.convert(this.aodStyle.borderWidth ?: DEFAULT_AOD_STROKE_WIDTH)
+        lockScreenPaint.strokeWidth = ceil(max(textBorderWidth, aodBorderWidth))
+        measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED)
+        setInterpolatorPaint()
+        recomputeMaxSingleDigitSizes()
+        invalidate()
+    }
+
+    // When constrainedByHeight is on, targetFontSizePx is the constrained height of textView
+    override fun applyTextSize(targetFontSizePx: Float?, constrainedByHeight: Boolean) {
+        val adjustedFontSizePx = adjustFontSize(targetFontSizePx, constrainedByHeight)
+        val fontSizePx = adjustedFontSizePx * (textStyle.fontSizeScale ?: 1f)
+        aodFontSizePx =
+            adjustedFontSizePx * (aodStyle.fontSizeScale ?: textStyle.fontSizeScale ?: 1f)
+        if (fontSizePx > 0) {
+            setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSizePx)
+            lockScreenPaint.textSize = textSize
+            lockScreenPaint.getTextBounds(text, 0, text.length, textBounds)
+            targetTextBounds.set(textBounds)
+        }
+        if (!constrainedByHeight) {
+            val lastUnconstrainedHeight = textBounds.height() + lockScreenPaint.strokeWidth * 2
+            fontSizeAdjustFactor = lastUnconstrainedHeight / lastUnconstrainedTextSize
+        }
+        textStyle.borderWidthScale?.let {
+            textBorderWidth = fontSizePx * it
+            if (dozeFraction < 1.0F) {
+                outlineAnimator?.setTextStyle(strokeWidth = textBorderWidth, animate = false)
+            }
+        }
+        aodStyle.borderWidthScale?.let {
+            aodBorderWidth = fontSizePx * it
+            if (dozeFraction > 0.0F) {
+                outlineAnimator?.setTextStyle(strokeWidth = aodBorderWidth, animate = false)
+            }
+        }
+
+        lockScreenPaint.strokeWidth = ceil(max(textBorderWidth, aodBorderWidth))
+        recomputeMaxSingleDigitSizes()
+
+        if (this::textAnimator.isInitialized) {
+            textAnimator.setTextStyle(textSize = lockScreenPaint.textSize, animate = false)
+        }
+        outlineAnimator?.setTextStyle(textSize = lockScreenPaint.textSize, animate = false)
+        innerAnimator?.setTextStyle(textSize = lockScreenPaint.textSize, animate = false)
+    }
+
+    private fun recomputeMaxSingleDigitSizes() {
+        val rectForCalculate = Rect()
+        maxSingleDigitHeight = 0
+        maxSingleDigitWidth = 0
+
+        for (i in 0..9) {
+            lockScreenPaint.getTextBounds(i.toString(), 0, 1, rectForCalculate)
+            maxSingleDigitHeight = max(maxSingleDigitHeight, rectForCalculate.height())
+            maxSingleDigitWidth = max(maxSingleDigitWidth, rectForCalculate.width())
+        }
+        maxSingleDigitWidth += 2 * lockScreenPaint.strokeWidth.toInt()
+        maxSingleDigitHeight += 2 * lockScreenPaint.strokeWidth.toInt()
+    }
+
+    // called without animation, can be used to set the initial state of animator
+    private fun setInterpolatorPaint() {
+        if (this::textAnimator.isInitialized) {
+            // set initial style
+            textAnimator.textInterpolator.targetPaint.set(lockScreenPaint)
+            textAnimator.textInterpolator.onTargetPaintModified()
+            textAnimator.setTextStyle(
+                fvar = textStyle.fontVariation,
+                textSize = lockScreenPaint.textSize,
+                color = textFillColor,
+                animate = false,
+            )
+        }
+
+        if (outlineAnimator != null) {
+            outlineAnimator!!
+                .textInterpolator
+                .targetPaint
+                .set(
+                    TextPaint(lockScreenPaint).also {
+                        it.style =
+                            if (aodStyle.renderType == RenderType.HOLLOW_TEXT)
+                                Paint.Style.FILL_AND_STROKE
+                            else Paint.Style.STROKE
+                    }
+                )
+            outlineAnimator!!.textInterpolator.onTargetPaintModified()
+            outlineAnimator!!.setTextStyle(
+                fvar = aodStyle.fontVariation,
+                textSize = lockScreenPaint.textSize,
+                color = Color.TRANSPARENT,
+                animate = false,
+            )
+        }
+
+        if (innerAnimator != null) {
+            innerAnimator!!
+                .textInterpolator
+                .targetPaint
+                .set(TextPaint(lockScreenPaint).also { it.style = Paint.Style.FILL })
+            innerAnimator!!.textInterpolator.onTargetPaintModified()
+            innerAnimator!!.setTextStyle(
+                fvar = aodStyle.fontVariation,
+                textSize = lockScreenPaint.textSize,
+                color = Color.WHITE,
+                animate = false,
+            )
+        }
+    }
+
+    /* Called after textAnimator.setTextStyle
+     * textAnimator.setTextStyle will update targetPaint,
+     * and rebase if previous animator is canceled
+     * so basePaint will store the state we transition from
+     * and targetPaint will store the state we transition to
+     */
+    private fun updateTextBoundsForTextAnimator() {
+        textAnimator.textInterpolator.basePaint.getTextBounds(text, 0, text.length, prevTextBounds)
+        textAnimator.textInterpolator.targetPaint.getTextBounds(
+            text,
+            0,
+            text.length,
+            targetTextBounds,
+        )
+    }
+
+    /*
+     * Adjust text size to adapt to large display / font size
+     * where the text view will be constrained by height
+     */
+    private fun adjustFontSize(targetFontSizePx: Float?, constrainedByHeight: Boolean): Float {
+        return if (constrainedByHeight) {
+            min((targetFontSizePx ?: 0F) / fontSizeAdjustFactor, lastUnconstrainedTextSize)
+        } else {
+            lastUnconstrainedTextSize = targetFontSizePx ?: 1F
+            lastUnconstrainedTextSize
+        }
+    }
+
+    companion object {
+        val DEFAULT_AOD_STROKE_WIDTH = "2dp"
+        val TEXT_OUTLINE_DEFAULT_COLOR = Color.TRANSPARENT
+        val AOD_DEFAULT_COLOR = Color.TRANSPARENT
+        val AOD_OUTLINE_DEFAULT_COLOR = Color.WHITE
+        private val DEFAULT_LIGHT_COLOR = "@android:color/system_accent1_100+0"
+        private val DEFAULT_DARK_COLOR = "@android:color/system_accent2_600+0"
+
+        fun getDefaultColor(assets: AssetLoader, isRegionDark: Boolean) =
+            assets.readColor(if (isRegionDark) DEFAULT_LIGHT_COLOR else DEFAULT_DARK_COLOR)
+    }
+}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockView.kt
new file mode 100644
index 0000000..bbd2d3d
--- /dev/null
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockView.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2024 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.systemui.shared.clocks.view
+
+import androidx.annotation.VisibleForTesting
+import com.android.systemui.shared.clocks.AssetLoader
+import com.android.systemui.shared.clocks.TextStyle
+
+interface SimpleDigitalClockView {
+    var text: String
+    var verticalAlignment: VerticalAlignment
+    var horizontalAlignment: HorizontalAlignment
+    var dozeFraction: Float
+    val textStyle: TextStyle
+    @VisibleForTesting var isAnimationEnabled: Boolean
+
+    fun applyStyles(assets: AssetLoader, textStyle: TextStyle, aodStyle: TextStyle?)
+
+    fun applyTextSize(targetFontSizePx: Float?, constrainedByHeight: Boolean = false)
+
+    fun updateColors(assets: AssetLoader, isRegionDark: Boolean)
+
+    fun refreshTime()
+
+    fun animateCharge()
+
+    fun animateDoze(isDozing: Boolean, isAnimated: Boolean)
+}
+
+enum class VerticalAlignment {
+    TOP,
+    BOTTOM,
+    BASELINE, // default
+    CENTER,
+}
+
+enum class HorizontalAlignment {
+    LEFT,
+    RIGHT,
+    CENTER, // default
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java
new file mode 100644
index 0000000..fbed7cd
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java
@@ -0,0 +1,243 @@
+/*
+ * 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.keyguard;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.os.SystemClock;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.testing.TestableLooper.RunWithLooper;
+import android.view.KeyEvent;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import com.android.internal.util.LatencyTracker;
+import com.android.internal.widget.LockPatternUtils;
+import com.android.keyguard.KeyguardAbsKeyInputView.KeyDownListener;
+import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
+import com.android.systemui.Flags;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer;
+import com.android.systemui.classifier.FalsingCollector;
+import com.android.systemui.classifier.FalsingCollectorFake;
+import com.android.systemui.flags.FakeFeatureFlags;
+import com.android.systemui.haptics.msdl.FakeMSDLPlayer;
+import com.android.systemui.kosmos.KosmosJavaAdapter;
+import com.android.systemui.res.R;
+import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
+
+import com.google.android.msdl.data.model.MSDLToken;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+@RunWithLooper
+public class KeyguardAbsKeyInputViewControllerTest extends SysuiTestCase {
+
+    @Mock
+    private KeyguardAbsKeyInputView mAbsKeyInputView;
+    @Mock
+    private PasswordTextView mPasswordEntry;
+    @Mock
+    private BouncerKeyguardMessageArea mKeyguardMessageArea;
+    @Mock
+    private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+    @Mock
+    private SecurityMode mSecurityMode;
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+    @Mock
+    private KeyguardSecurityCallback mKeyguardSecurityCallback;
+    @Mock
+    private KeyguardMessageAreaController.Factory mKeyguardMessageAreaControllerFactory;
+    @Mock
+    private KeyguardMessageAreaController mKeyguardMessageAreaController;
+    @Mock
+    private LatencyTracker mLatencyTracker;
+    private final FalsingCollector mFalsingCollector = new FalsingCollectorFake();
+    @Mock
+    private EmergencyButtonController mEmergencyButtonController;
+
+    private FakeFeatureFlags mFeatureFlags;
+    @Mock
+    private SelectedUserInteractor mSelectedUserInteractor;
+    @Mock
+    private UserActivityNotifier mUserActivityNotifier;
+    private KeyguardAbsKeyInputViewController mKeyguardAbsKeyInputViewController;
+    private KosmosJavaAdapter mKosmosJavaAdapter = new KosmosJavaAdapter(this);
+    private final BouncerHapticPlayer mBouncerHapticPlayer =
+            mKosmosJavaAdapter.getBouncerHapticHelper();
+    private final FakeMSDLPlayer mMSDLPlayer = mKosmosJavaAdapter.getMsdlPlayer();
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        when(mKeyguardMessageAreaControllerFactory.create(any(KeyguardMessageArea.class)))
+                .thenReturn(mKeyguardMessageAreaController);
+        when(mAbsKeyInputView.getPasswordTextViewId()).thenReturn(1);
+        when(mAbsKeyInputView.findViewById(1)).thenReturn(mPasswordEntry);
+        when(mAbsKeyInputView.isAttachedToWindow()).thenReturn(true);
+        when(mAbsKeyInputView.requireViewById(R.id.bouncer_message_area))
+                .thenReturn(mKeyguardMessageArea);
+        when(mAbsKeyInputView.getResources()).thenReturn(getContext().getResources());
+        mFeatureFlags = new FakeFeatureFlags();
+        mKeyguardAbsKeyInputViewController = createTestObject();
+        mKeyguardAbsKeyInputViewController.init();
+        reset(mKeyguardMessageAreaController);  // Clear out implicit call to init.
+    }
+
+    private KeyguardAbsKeyInputViewController createTestObject() {
+        return new KeyguardAbsKeyInputViewController(mAbsKeyInputView,
+                mKeyguardUpdateMonitor, mSecurityMode, mLockPatternUtils, mKeyguardSecurityCallback,
+                mKeyguardMessageAreaControllerFactory, mLatencyTracker, mFalsingCollector,
+                mEmergencyButtonController, mFeatureFlags, mSelectedUserInteractor,
+                mBouncerHapticPlayer, mUserActivityNotifier) {
+            @Override
+            void resetState() {
+            }
+
+            @Override
+            public void onResume(int reason) {
+                super.onResume(reason);
+            }
+
+            @Override
+            protected int getInitialMessageResId() {
+                return 0;
+            }
+        };
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_REVAMPED_BOUNCER_MESSAGES)
+    public void withFeatureFlagOn_oldMessage_isHidden() {
+        KeyguardAbsKeyInputViewController underTest = createTestObject();
+
+        underTest.init();
+
+        verify(mKeyguardMessageAreaController).disable();
+    }
+
+    @Test
+    public void onKeyDown_clearsSecurityMessage() {
+        ArgumentCaptor<KeyDownListener> onKeyDownListenerArgumentCaptor =
+                ArgumentCaptor.forClass(KeyDownListener.class);
+        verify(mAbsKeyInputView).setKeyDownListener(onKeyDownListenerArgumentCaptor.capture());
+        onKeyDownListenerArgumentCaptor.getValue().onKeyDown(
+                KeyEvent.KEYCODE_0, mock(KeyEvent.class));
+        verify(mKeyguardSecurityCallback).userActivity();
+        verify(mKeyguardMessageAreaController).setMessage(eq(""));
+    }
+
+    @Test
+    public void onKeyDown_noSecurityMessageInteraction() {
+        ArgumentCaptor<KeyDownListener> onKeyDownListenerArgumentCaptor =
+                ArgumentCaptor.forClass(KeyDownListener.class);
+        verify(mAbsKeyInputView).setKeyDownListener(onKeyDownListenerArgumentCaptor.capture());
+        onKeyDownListenerArgumentCaptor.getValue().onKeyDown(
+                KeyEvent.KEYCODE_UNKNOWN, mock(KeyEvent.class));
+        verifyNoMoreInteractions(mKeyguardSecurityCallback);
+        verifyNoMoreInteractions(mKeyguardMessageAreaController);
+    }
+
+    @Test
+    public void onPromptReasonNone_doesNotSetMessage() {
+        mKeyguardAbsKeyInputViewController.showPromptReason(0);
+        verify(mKeyguardMessageAreaController, never()).setMessage(
+                getContext().getResources().getString(R.string.kg_prompt_reason_restart_password),
+                false);
+    }
+
+    @Test
+    public void onPromptReason_setsMessage() {
+        when(mAbsKeyInputView.getPromptReasonStringRes(1)).thenReturn(
+                R.string.kg_prompt_reason_restart_password);
+        mKeyguardAbsKeyInputViewController.showPromptReason(1);
+        verify(mKeyguardMessageAreaController).setMessage(
+                getContext().getResources().getString(R.string.kg_prompt_reason_restart_password),
+                false);
+    }
+
+
+    @Test
+    public void testReset() {
+        mKeyguardAbsKeyInputViewController.reset();
+        verify(mKeyguardMessageAreaController).setMessage("", false);
+    }
+
+    @Test
+    public void testOnViewAttached() {
+        reset(mLockPatternUtils);
+        mKeyguardAbsKeyInputViewController.onViewAttached();
+        verify(mLockPatternUtils).getLockoutAttemptDeadline(anyInt());
+    }
+
+    @Test
+    public void testLockedOut_verifyPasswordAndUnlock_doesNotEnableViewInput() {
+        mKeyguardAbsKeyInputViewController.handleAttemptLockout(SystemClock.elapsedRealtime());
+        verify(mAbsKeyInputView).setPasswordEntryInputEnabled(false);
+        verify(mAbsKeyInputView).setPasswordEntryEnabled(false);
+        verify(mAbsKeyInputView, never()).setPasswordEntryInputEnabled(true);
+        verify(mAbsKeyInputView, never()).setPasswordEntryEnabled(true);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_MSDL_FEEDBACK)
+    public void onPasswordChecked_withMSDLFeedback_withMatch_playsUnlockToken() {
+        mKeyguardAbsKeyInputViewController.onPasswordChecked(0, true, 100, true);
+        assertThat(mMSDLPlayer.getLatestTokenPlayed()).isEqualTo(MSDLToken.UNLOCK);
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_MSDL_FEEDBACK)
+    public void onPasswordChecked_withoutMSDLFeedback_withMatch_doesNotPlayToken() {
+        mKeyguardAbsKeyInputViewController.onPasswordChecked(0, true, 100, true);
+        assertThat(mMSDLPlayer.getLatestTokenPlayed()).isNull();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_MSDL_FEEDBACK)
+    public void onPasswordChecked_withMSDLFeedback_withoutMatch_playsFailureToken() {
+        mKeyguardAbsKeyInputViewController.onPasswordChecked(0, false, 100, true);
+        assertThat(mMSDLPlayer.getLatestTokenPlayed()).isEqualTo(MSDLToken.FAILURE);
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_MSDL_FEEDBACK)
+    public void onPasswordChecked_withoutMSDLFeedback_withoutMatch_doesNotPlayToken() {
+        mKeyguardAbsKeyInputViewController.onPasswordChecked(0, false, 100, true);
+        assertThat(mMSDLPlayer.getLatestTokenPlayed()).isNull();
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerTest.java b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
index 94d3b2c..176824f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
@@ -61,6 +61,7 @@
 import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.res.R;
 import com.android.systemui.statusbar.policy.UserSwitcherController;
+import com.android.systemui.statusbar.policy.UserSwitcherController.UserSwitchCallback;
 import com.android.systemui.user.data.source.UserRecord;
 import com.android.systemui.util.concurrency.FakeExecutor;
 import com.android.systemui.util.settings.GlobalSettings;
@@ -70,6 +71,8 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
@@ -96,6 +99,9 @@
     private UserSwitcherController mUserSwitcherController;
     @Mock
     private FalsingA11yDelegate mFalsingA11yDelegate;
+    @Captor
+    private ArgumentCaptor<UserSwitchCallback> mUserSwitchCallbackCaptor =
+            ArgumentCaptor.forClass(UserSwitchCallback.class);
 
     private KeyguardSecurityContainer mKeyguardSecurityContainer;
     private FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock());
@@ -360,6 +366,18 @@
     }
 
     @Test
+    public void goingOutOfUserSwitcherRemovesCallback() {
+        // WHEN UserSwitcherViewMode is initialized
+        setupUserSwitcher();
+        verify(mUserSwitcherController).addUserSwitchCallback(mUserSwitchCallbackCaptor.capture());
+
+        // Back to default mode, as SIM PIN would be
+        initMode(MODE_DEFAULT);
+        verify(mUserSwitcherController).removeUserSwitchCallback(
+                mUserSwitchCallbackCaptor.getValue());
+    }
+
+    @Test
     public void testOnDensityOrFontScaleChanged() {
         setupUserSwitcher();
         View oldUserSwitcher = mKeyguardSecurityContainer.findViewById(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationFrameSizePrefsTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/WindowMagnificationFrameSizePrefsTest.java
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationFrameSizePrefsTest.java
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/WindowMagnificationFrameSizePrefsTest.java
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/WindowMagnificationFrameSpecTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/WindowMagnificationFrameSpecTest.kt
new file mode 100644
index 0000000..6f43c20
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/WindowMagnificationFrameSpecTest.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2024 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.systemui.accessibility
+
+import android.util.Size
+import androidx.test.filters.SmallTest
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.accessibility.WindowMagnificationSettings.MagnificationSize
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class WindowMagnificationFrameSpecTest : SysuiTestCase() {
+
+    @Test
+    fun deserializeSpec_validSpec_expectedIndex() {
+        val targetIndex = MagnificationSize.LARGE
+        val targetSize = Size(100, 200)
+        val targetPreference = WindowMagnificationFrameSpec.serialize(targetIndex, targetSize)
+
+        assertThat(WindowMagnificationFrameSpec.deserialize(targetPreference).index)
+            .isEqualTo(targetIndex)
+    }
+
+    @Test
+    fun deserializeSpec_validSpec_expectedSize() {
+        val targetIndex = MagnificationSize.LARGE
+        val targetSize = Size(100, 200)
+        val targetPreference = WindowMagnificationFrameSpec.serialize(targetIndex, targetSize)
+
+        assertThat(WindowMagnificationFrameSpec.deserialize(targetPreference).size)
+            .isEqualTo(targetSize)
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogDelegateTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/fontscaling
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogDelegateTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/fontscaling
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegateTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegateTest.java
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegateTest.java
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegateTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/ViewHierarchyAnimatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/animation/ViewHierarchyAnimatorTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/animation/ViewHierarchyAnimatorTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/animation/ViewHierarchyAnimatorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/battery/BatteryMeterViewTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/battery/BatteryMeterViewTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java
index 65825b2..2dcbdc8 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java
@@ -17,6 +17,7 @@
 package com.android.systemui.biometrics;
 
 import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
+import static android.view.Display.INVALID_DISPLAY;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -68,10 +69,12 @@
 import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback;
 import android.os.Handler;
 import android.os.RemoteException;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.testing.TestableContext;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
+import android.view.Display;
 import android.view.DisplayInfo;
 import android.view.Surface;
 import android.view.WindowManager;
@@ -210,6 +213,7 @@
                 .thenReturn(true);
         when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
                 .thenReturn(true);
+        when(mUserManager.isVisibleBackgroundUsersSupported()).thenReturn(false);
 
         when(mDialog1.getOpPackageName()).thenReturn("Dialog1");
         when(mDialog2.getOpPackageName()).thenReturn("Dialog2");
@@ -462,7 +466,7 @@
     @Test
     public void testShowInvoked_whenSystemRequested() {
         showDialog(new int[] {1} /* sensorIds */, false /* credentialAllowed */);
-        verify(mDialog1).show(any());
+        verify(mDialog1).show(mWindowManager);
     }
 
     @Test
@@ -679,7 +683,7 @@
         // 2) Client cancels authentication
 
         showDialog(new int[0] /* sensorIds */, true /* credentialAllowed */);
-        verify(mDialog1).show(any());
+        verify(mDialog1).show(mWindowManager);
 
         final byte[] credentialAttestation = generateRandomHAT();
 
@@ -695,7 +699,7 @@
     @Test
     public void testShowNewDialog_beforeOldDialogDismissed_SkipsAnimations() {
         showDialog(new int[] {1} /* sensorIds */, false /* credentialAllowed */);
-        verify(mDialog1).show(any());
+        verify(mDialog1).show(mWindowManager);
 
         showDialog(new int[] {1} /* sensorIds */, false /* credentialAllowed */);
 
@@ -703,7 +707,7 @@
         verify(mDialog1).dismissWithoutCallback(eq(false) /* animate */);
 
         // Second dialog should be shown without animation
-        verify(mDialog2).show(any());
+        verify(mDialog2).show(mWindowManager);
     }
 
     @Test
@@ -990,13 +994,97 @@
         verify(mDialog1, never()).show(any());
     }
 
+    @Test
+    public void testShowDialog_visibleBackgroundUser() {
+        int backgroundUserId = 1001;
+        int backgroundDisplayId = 1001;
+        when(mUserManager.isVisibleBackgroundUsersSupported()).thenReturn(true);
+        WindowManager wm = mockBackgroundUser(backgroundUserId, backgroundDisplayId,
+                true /* isVisible */, true /* hasUserManager */, true /* hasDisplay */);
+
+        showDialog(new int[]{1} /* sensorIds */, backgroundUserId /* userId */,
+                false /* credentialAllowed */);
+
+        verify(mDialog1).show(wm);
+    }
+
+    @Test
+    public void testShowDialog_invisibleBackgroundUser_defaultWM() {
+        int backgroundUserId = 1001;
+        when(mUserManager.isVisibleBackgroundUsersSupported()).thenReturn(true);
+        mockBackgroundUser(backgroundUserId, INVALID_DISPLAY,
+                false /* isVisible */, true /* hasUserManager */, true /* hasDisplay */);
+
+        showDialog(new int[]{1} /* sensorIds */, backgroundUserId /* userId */,
+                false /* credentialAllowed */);
+
+        verify(mDialog1).show(mWindowManager);
+    }
+
+    @Test
+    public void testShowDialog_visibleBackgroundUser_noUserManager_dismissError()
+            throws RemoteException {
+        int backgroundUserId = 1001;
+        int backgroundDisplayId = 1001;
+        when(mUserManager.isVisibleBackgroundUsersSupported()).thenReturn(true);
+        mockBackgroundUser(backgroundUserId, backgroundDisplayId,
+                true /* isVisible */, false /* hasUserManager */, true /* hasDisplay */);
+
+        showDialog(new int[]{1} /* sensorIds */, backgroundUserId /* userId */,
+                false /* credentialAllowed */);
+
+        verify(mDialog1, never()).show(any());
+        verify(mReceiver).onDialogDismissed(
+                eq(BiometricPrompt.DISMISSED_REASON_ERROR_NO_WM),
+                eq(null) /* credentialAttestation */);
+    }
+
+    @Test
+    public void testShowDialog_visibleBackgroundUser_invalidDisplayId_dismissError()
+            throws RemoteException {
+        int backgroundUserId = 1001;
+        when(mUserManager.isVisibleBackgroundUsersSupported()).thenReturn(true);
+        mockBackgroundUser(backgroundUserId, INVALID_DISPLAY,
+                true /* isVisible */, true /* hasUserManager */, false /* hasDisplay */);
+
+        showDialog(new int[]{1} /* sensorIds */, backgroundUserId /* userId */,
+                false /* credentialAllowed */);
+
+        verify(mDialog1, never()).show(any());
+        verify(mReceiver).onDialogDismissed(
+                eq(BiometricPrompt.DISMISSED_REASON_ERROR_NO_WM),
+                eq(null) /* credentialAttestation */);
+    }
+
+    @Test
+    public void testShowDialog_visibleBackgroundUser_invalidDisplay_dismissError()
+            throws RemoteException {
+        int backgroundUserId = 1001;
+        int backgroundDisplayId = 1001;
+        when(mUserManager.isVisibleBackgroundUsersSupported()).thenReturn(true);
+        mockBackgroundUser(backgroundUserId, backgroundDisplayId,
+                true /* isVisible */, true /* hasUserManager */, false /* hasDisplay */);
+
+        showDialog(new int[]{1} /* sensorIds */, backgroundUserId /* userId */,
+                false /* credentialAllowed */);
+
+        verify(mDialog1, never()).show(any());
+        verify(mReceiver).onDialogDismissed(
+                eq(BiometricPrompt.DISMISSED_REASON_ERROR_NO_WM),
+                eq(null) /* credentialAttestation */);
+    }
+
     private void showDialog(int[] sensorIds, boolean credentialAllowed) {
+        showDialog(sensorIds, 0 /* userId */, credentialAllowed);
+    }
+
+    private void showDialog(int[] sensorIds, int userId, boolean credentialAllowed) {
         mAuthController.showAuthenticationDialog(createTestPromptInfo(),
                 mReceiver /* receiver */,
                 sensorIds,
                 credentialAllowed,
                 true /* requireConfirmation */,
-                0 /* userId */,
+                userId /* userId */,
                 0 /* operationId */,
                 "testPackage",
                 REQUEST_ID);
@@ -1059,6 +1147,40 @@
         assertTrue(mAuthController.isFaceAuthEnrolled(userId));
     }
 
+    /**
+     * Create mocks related to visible background users.
+     *
+     * @param userId the user id of the background user to mock
+     * @param displayId display id of the background user
+     * @param isVisible whether the background user is a visible background user or not
+     * @param hasUserManager simulate whether the background user's context will return a mock
+     *                       UserManager instance or null
+     * @param hasDisplay simulate whether the background user's context will return a mock Display
+     *                   instance or null
+     * @return mock WindowManager instance associated with the background user's display context
+     */
+    private WindowManager mockBackgroundUser(int userId, int displayId, boolean isVisible,
+            boolean hasUserManager, boolean hasDisplay) {
+        Context mockUserContext = mock(Context.class);
+        Context mockDisplayContext = mock(Context.class);
+        UserManager mockUserManager = mock(UserManager.class);
+        Display mockDisplay = mock(Display.class);
+        WindowManager mockDisplayWM = mock(WindowManager.class);
+        doReturn(mockUserContext).when(mContextSpy).createContextAsUser(eq(UserHandle.of(userId)),
+                anyInt());
+        if (hasUserManager) {
+            when(mockUserContext.getSystemService(UserManager.class)).thenReturn(mockUserManager);
+        }
+        when(mockUserManager.isUserVisible()).thenReturn(isVisible);
+        when(mockUserManager.getMainDisplayIdAssignedToUser()).thenReturn(displayId);
+        if (hasDisplay) {
+            when(mDisplayManager.getDisplay(displayId)).thenReturn(mockDisplay);
+        }
+        doReturn(mockDisplayContext).when(mContextSpy).createDisplayContext(mockDisplay);
+        when(mockDisplayContext.getSystemService(WindowManager.class)).thenReturn(mockDisplayWM);
+        return mockDisplayWM;
+    }
+
     private final class TestableAuthController extends AuthController {
         private int mBuildCount = 0;
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt
index 75a77cf..194b41f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt
@@ -27,12 +27,23 @@
 import android.hardware.face.FaceSensorPropertiesInternal
 import android.hardware.fingerprint.FingerprintSensorProperties
 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
+import com.android.keyguard.keyguardUpdateMonitor
+import com.android.systemui.SysuiTestableContext
+import com.android.systemui.biometrics.data.repository.biometricStatusRepository
+import com.android.systemui.biometrics.shared.model.AuthenticationReason
+import com.android.systemui.bouncer.data.repository.keyguardBouncerRepository
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.res.R
+import com.android.systemui.util.mockito.whenever
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
 
 /** Create [FingerprintSensorPropertiesInternal] for a test. */
 internal fun fingerprintSensorPropertiesInternal(
     ids: List<Int> = listOf(0),
     strong: Boolean = true,
-    sensorType: Int = FingerprintSensorProperties.TYPE_REAR
+    sensorType: Int = FingerprintSensorProperties.TYPE_REAR,
 ): List<FingerprintSensorPropertiesInternal> {
     val componentInfo =
         listOf(
@@ -41,15 +52,15 @@
                 "vendor/model/revision" /* hardwareVersion */,
                 "1.01" /* firmwareVersion */,
                 "00000001" /* serialNumber */,
-                "" /* softwareVersion */
+                "", /* softwareVersion */
             ),
             ComponentInfoInternal(
                 "matchingAlgorithm" /* componentId */,
                 "" /* hardwareVersion */,
                 "" /* firmwareVersion */,
                 "" /* serialNumber */,
-                "vendor/version/revision" /* softwareVersion */
-            )
+                "vendor/version/revision", /* softwareVersion */
+            ),
         )
     return ids.map { id ->
         FingerprintSensorPropertiesInternal(
@@ -58,7 +69,7 @@
             5 /* maxEnrollmentsPerUser */,
             componentInfo,
             sensorType,
-            false /* resetLockoutRequiresHardwareAuthToken */
+            false, /* resetLockoutRequiresHardwareAuthToken */
         )
     }
 }
@@ -75,15 +86,15 @@
                 "vendor/model/revision" /* hardwareVersion */,
                 "1.01" /* firmwareVersion */,
                 "00000001" /* serialNumber */,
-                "" /* softwareVersion */
+                "", /* softwareVersion */
             ),
             ComponentInfoInternal(
                 "matchingAlgorithm" /* componentId */,
                 "" /* hardwareVersion */,
                 "" /* firmwareVersion */,
                 "" /* serialNumber */,
-                "vendor/version/revision" /* softwareVersion */
-            )
+                "vendor/version/revision", /* softwareVersion */
+            ),
         )
     return ids.map { id ->
         FaceSensorPropertiesInternal(
@@ -94,7 +105,7 @@
             FaceSensorProperties.TYPE_RGB,
             true /* supportsFaceDetection */,
             true /* supportsSelfIllumination */,
-            false /* resetLockoutRequiresHardwareAuthToken */
+            false, /* resetLockoutRequiresHardwareAuthToken */
         )
     }
 }
@@ -145,3 +156,67 @@
     info.negativeButtonText = negativeButton
     return info
 }
+
+@OptIn(ExperimentalCoroutinesApi::class)
+internal fun TestScope.updateSfpsIndicatorRequests(
+    kosmos: Kosmos,
+    mContext: SysuiTestableContext,
+    primaryBouncerRequest: Boolean? = null,
+    alternateBouncerRequest: Boolean? = null,
+    biometricPromptRequest: Boolean? = null,
+    // TODO(b/365182034): update when rest to unlock feature is implemented
+    //    progressBarShowing: Boolean? = null
+) {
+    biometricPromptRequest?.let { hasBiometricPromptRequest ->
+        if (hasBiometricPromptRequest) {
+            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
+                AuthenticationReason.BiometricPromptAuthentication
+            )
+        } else {
+            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
+                AuthenticationReason.NotRunning
+            )
+        }
+    }
+
+    primaryBouncerRequest?.let { hasPrimaryBouncerRequest ->
+        updatePrimaryBouncer(
+            kosmos,
+            mContext,
+            isShowing = hasPrimaryBouncerRequest,
+            isAnimatingAway = false,
+            fpsDetectionRunning = true,
+            isUnlockingWithFpAllowed = true,
+        )
+    }
+
+    alternateBouncerRequest?.let { hasAlternateBouncerRequest ->
+        kosmos.keyguardBouncerRepository.setAlternateVisible(hasAlternateBouncerRequest)
+    }
+
+    // TODO(b/365182034): set progress bar visibility when rest to unlock feature is implemented
+
+    runCurrent()
+}
+
+internal fun updatePrimaryBouncer(
+    kosmos: Kosmos,
+    mContext: SysuiTestableContext,
+    isShowing: Boolean,
+    isAnimatingAway: Boolean,
+    fpsDetectionRunning: Boolean,
+    isUnlockingWithFpAllowed: Boolean,
+) {
+    kosmos.keyguardBouncerRepository.setPrimaryShow(isShowing)
+    kosmos.keyguardBouncerRepository.setPrimaryStartingToHide(false)
+    val primaryStartDisappearAnimation = if (isAnimatingAway) Runnable {} else null
+    kosmos.keyguardBouncerRepository.setPrimaryStartDisappearAnimation(
+        primaryStartDisappearAnimation
+    )
+
+    whenever(kosmos.keyguardUpdateMonitor.isFingerprintDetectionRunning)
+        .thenReturn(fpsDetectionRunning)
+    whenever(kosmos.keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed)
+        .thenReturn(isUnlockingWithFpAllowed)
+    mContext.orCreateTestableResources.addOverride(R.bool.config_show_sidefps_hint_on_bouncer, true)
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractorImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractorImplTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractorImplTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractorImplTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractorImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractorImplTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractorImplTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractorImplTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractorTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractorTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/PromptSelectorInteractorImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/interactor/PromptSelectorInteractorImplTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/PromptSelectorInteractorImplTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/interactor/PromptSelectorInteractorImplTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequestTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/model
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequestTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/model
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/shared/model/BiometricModalitiesTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/shared/model/BiometricModalitiesTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/biometrics/shared/model/BiometricModalitiesTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/shared/model/BiometricModalitiesTest.kt
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt
index 7fa165c..57df662 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt
@@ -16,64 +16,48 @@
 
 package com.android.systemui.biometrics.ui.binder
 
-import android.animation.Animator
-import android.graphics.Rect
-import android.hardware.biometrics.SensorLocationInternal
-import android.hardware.display.DisplayManager
-import android.hardware.display.DisplayManagerGlobal
 import android.testing.TestableLooper
-import android.view.Display
-import android.view.DisplayInfo
 import android.view.LayoutInflater
 import android.view.View
-import android.view.ViewPropertyAnimator
-import android.view.WindowInsets
 import android.view.WindowManager
-import android.view.WindowMetrics
 import android.view.layoutInflater
 import android.view.windowManager
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.airbnb.lottie.LottieAnimationView
-import com.android.keyguard.keyguardUpdateMonitor
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.biometrics.FingerprintInteractiveToAuthProvider
-import com.android.systemui.biometrics.data.repository.biometricStatusRepository
 import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
-import com.android.systemui.biometrics.shared.model.AuthenticationReason
 import com.android.systemui.biometrics.shared.model.DisplayRotation
 import com.android.systemui.biometrics.shared.model.FingerprintSensorType
 import com.android.systemui.biometrics.shared.model.SensorStrength
-import com.android.systemui.bouncer.data.repository.keyguardBouncerRepository
+import com.android.systemui.biometrics.updateSfpsIndicatorRequests
 import com.android.systemui.display.data.repository.displayRepository
 import com.android.systemui.display.data.repository.displayStateRepository
-import com.android.systemui.keyguard.ui.viewmodel.sideFpsProgressBarViewModel
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.res.R
 import com.android.systemui.testKosmos
 import com.android.systemui.util.mockito.eq
-import com.android.systemui.util.mockito.whenever
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.test.TestScope
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
 import org.junit.Before
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
 import org.mockito.Mock
-import org.mockito.Mockito
 import org.mockito.Mockito.any
 import org.mockito.Mockito.inOrder
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.never
-import org.mockito.Mockito.spy
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.`when`
 import org.mockito.junit.MockitoJUnit
 import org.mockito.junit.MockitoRule
-import org.mockito.kotlin.argumentCaptor
+import org.mockito.kotlin.firstValue
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
@@ -83,84 +67,25 @@
     private val kosmos = testKosmos()
 
     @JvmField @Rule var mockitoRule: MockitoRule = MockitoJUnit.rule()
-    @Mock private lateinit var displayManager: DisplayManager
-    @Mock
-    private lateinit var fingerprintInteractiveToAuthProvider: FingerprintInteractiveToAuthProvider
     @Mock private lateinit var layoutInflater: LayoutInflater
     @Mock private lateinit var sideFpsView: View
-
-    private val contextDisplayInfo = DisplayInfo()
-
-    private var displayWidth: Int = 0
-    private var displayHeight: Int = 0
-    private var boundsWidth: Int = 0
-    private var boundsHeight: Int = 0
-
-    private lateinit var deviceConfig: DeviceConfig
-    private lateinit var sensorLocation: SensorLocationInternal
-
-    enum class DeviceConfig {
-        X_ALIGNED,
-        Y_ALIGNED,
-    }
+    @Captor private lateinit var viewCaptor: ArgumentCaptor<View>
 
     @Before
     fun setup() {
         allowTestableLooperAsMainThread() // repeatWhenAttached requires the main thread
-
-        mContext = spy(mContext)
-
-        val resources = mContext.resources
-        whenever(mContext.display)
-            .thenReturn(
-                Display(mock(DisplayManagerGlobal::class.java), 1, contextDisplayInfo, resources)
-            )
-
         kosmos.layoutInflater = layoutInflater
-
-        whenever(fingerprintInteractiveToAuthProvider.enabledForCurrentUser)
-            .thenReturn(MutableStateFlow(false))
-
-        context.addMockSystemService(DisplayManager::class.java, displayManager)
         context.addMockSystemService(WindowManager::class.java, kosmos.windowManager)
-
         `when`(layoutInflater.inflate(R.layout.sidefps_view, null, false)).thenReturn(sideFpsView)
         `when`(sideFpsView.requireViewById<LottieAnimationView>(eq(R.id.sidefps_animation)))
             .thenReturn(mock(LottieAnimationView::class.java))
-        with(mock(ViewPropertyAnimator::class.java)) {
-            `when`(sideFpsView.animate()).thenReturn(this)
-            `when`(alpha(Mockito.anyFloat())).thenReturn(this)
-            `when`(setStartDelay(Mockito.anyLong())).thenReturn(this)
-            `when`(setDuration(Mockito.anyLong())).thenReturn(this)
-            `when`(setListener(any())).thenAnswer {
-                (it.arguments[0] as Animator.AnimatorListener).onAnimationEnd(
-                    mock(Animator::class.java)
-                )
-                this
-            }
-        }
     }
 
     @Test
     fun verifyIndicatorNotAdded_whenInRearDisplayMode() {
         kosmos.testScope.runTest {
-            setupTestConfiguration(
-                DeviceConfig.X_ALIGNED,
-                rotation = DisplayRotation.ROTATION_0,
-                isInRearDisplayMode = true
-            )
-            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
-                AuthenticationReason.NotRunning
-            )
-            kosmos.sideFpsProgressBarViewModel.setVisible(false)
-            updatePrimaryBouncer(
-                isShowing = true,
-                isAnimatingAway = false,
-                fpsDetectionRunning = true,
-                isUnlockingWithFpAllowed = true
-            )
-            runCurrent()
-
+            setupTestConfiguration(isInRearDisplayMode = true)
+            updateSfpsIndicatorRequests(kosmos, mContext, primaryBouncerRequest = true)
             verify(kosmos.windowManager, never()).addView(any(), any())
         }
     }
@@ -168,33 +93,14 @@
     @Test
     fun verifyIndicatorShowAndHide_onPrimaryBouncerShowAndHide() {
         kosmos.testScope.runTest {
-            setupTestConfiguration(
-                DeviceConfig.X_ALIGNED,
-                rotation = DisplayRotation.ROTATION_0,
-                isInRearDisplayMode = false
-            )
-            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
-                AuthenticationReason.NotRunning
-            )
-            kosmos.sideFpsProgressBarViewModel.setVisible(false)
-            // Show primary bouncer
-            updatePrimaryBouncer(
-                isShowing = true,
-                isAnimatingAway = false,
-                fpsDetectionRunning = true,
-                isUnlockingWithFpAllowed = true
-            )
+            setupTestConfiguration(isInRearDisplayMode = false)
+            updateSfpsIndicatorRequests(kosmos, mContext, primaryBouncerRequest = true)
             runCurrent()
 
             verify(kosmos.windowManager).addView(any(), any())
 
             // Hide primary bouncer
-            updatePrimaryBouncer(
-                isShowing = false,
-                isAnimatingAway = false,
-                fpsDetectionRunning = true,
-                isUnlockingWithFpAllowed = true
-            )
+            updateSfpsIndicatorRequests(kosmos, mContext, primaryBouncerRequest = false)
             runCurrent()
 
             verify(kosmos.windowManager).removeView(any())
@@ -204,30 +110,19 @@
     @Test
     fun verifyIndicatorShowAndHide_onAlternateBouncerShowAndHide() {
         kosmos.testScope.runTest {
-            setupTestConfiguration(
-                DeviceConfig.X_ALIGNED,
-                rotation = DisplayRotation.ROTATION_0,
-                isInRearDisplayMode = false
-            )
-            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
-                AuthenticationReason.NotRunning
-            )
-            kosmos.sideFpsProgressBarViewModel.setVisible(false)
-            // Show alternate bouncer
-            kosmos.keyguardBouncerRepository.setAlternateVisible(true)
+            setupTestConfiguration(isInRearDisplayMode = false)
+            updateSfpsIndicatorRequests(kosmos, mContext, alternateBouncerRequest = true)
             runCurrent()
 
             verify(kosmos.windowManager).addView(any(), any())
 
-            var viewCaptor = argumentCaptor<View>()
             verify(kosmos.windowManager).addView(viewCaptor.capture(), any())
             verify(viewCaptor.firstValue)
                 .announceForAccessibility(
                     mContext.getText(R.string.accessibility_side_fingerprint_indicator_label)
                 )
 
-            // Hide alternate bouncer
-            kosmos.keyguardBouncerRepository.setAlternateVisible(false)
+            updateSfpsIndicatorRequests(kosmos, mContext, alternateBouncerRequest = false)
             runCurrent()
 
             verify(kosmos.windowManager).removeView(any())
@@ -237,30 +132,14 @@
     @Test
     fun verifyIndicatorShownAndHidden_onSystemServerAuthenticationStartedAndStopped() {
         kosmos.testScope.runTest {
-            setupTestConfiguration(
-                DeviceConfig.X_ALIGNED,
-                rotation = DisplayRotation.ROTATION_0,
-                isInRearDisplayMode = false
-            )
-            kosmos.sideFpsProgressBarViewModel.setVisible(false)
-            updatePrimaryBouncer(
-                isShowing = false,
-                isAnimatingAway = false,
-                fpsDetectionRunning = true,
-                isUnlockingWithFpAllowed = true
-            )
-            // System server authentication started
-            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
-                AuthenticationReason.BiometricPromptAuthentication
-            )
+            setupTestConfiguration(isInRearDisplayMode = false)
+            updateSfpsIndicatorRequests(kosmos, mContext, biometricPromptRequest = true)
             runCurrent()
 
             verify(kosmos.windowManager).addView(any(), any())
 
             // System server authentication stopped
-            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
-                AuthenticationReason.NotRunning
-            )
+            updateSfpsIndicatorRequests(kosmos, mContext, biometricPromptRequest = false)
             runCurrent()
 
             verify(kosmos.windowManager).removeView(any())
@@ -269,45 +148,37 @@
 
     // On progress bar shown - hide indicator
     // On progress bar hidden - show indicator
+    // TODO(b/365182034): update + enable when rest to unlock feature is implemented
+    @Ignore("b/365182034")
     @Test
     fun verifyIndicatorProgressBarInteraction() {
         kosmos.testScope.runTest {
             // Pre-auth conditions
-            setupTestConfiguration(
-                DeviceConfig.X_ALIGNED,
-                rotation = DisplayRotation.ROTATION_0,
-                isInRearDisplayMode = false
-            )
-            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
-                AuthenticationReason.NotRunning
-            )
-            kosmos.sideFpsProgressBarViewModel.setVisible(false)
-
-            // Show primary bouncer
-            updatePrimaryBouncer(
-                isShowing = true,
-                isAnimatingAway = false,
-                fpsDetectionRunning = true,
-                isUnlockingWithFpAllowed = true
-            )
+            setupTestConfiguration(isInRearDisplayMode = false)
+            updateSfpsIndicatorRequests(kosmos, mContext, primaryBouncerRequest = true)
             runCurrent()
 
             val inOrder = inOrder(kosmos.windowManager)
-
             // Verify indicator shown
             inOrder.verify(kosmos.windowManager).addView(any(), any())
 
             // Set progress bar visible
-            kosmos.sideFpsProgressBarViewModel.setVisible(true)
-
+            updateSfpsIndicatorRequests(
+                kosmos,
+                mContext,
+                primaryBouncerRequest = true,
+            ) // , progressBarShowing = true)
             runCurrent()
 
             // Verify indicator hidden
             inOrder.verify(kosmos.windowManager).removeView(any())
 
             // Set progress bar invisible
-            kosmos.sideFpsProgressBarViewModel.setVisible(false)
-
+            updateSfpsIndicatorRequests(
+                kosmos,
+                mContext,
+                primaryBouncerRequest = true,
+            ) // , progressBarShowing = false)
             runCurrent()
 
             // Verify indicator shown
@@ -315,78 +186,18 @@
         }
     }
 
-    private fun updatePrimaryBouncer(
-        isShowing: Boolean,
-        isAnimatingAway: Boolean,
-        fpsDetectionRunning: Boolean,
-        isUnlockingWithFpAllowed: Boolean,
-    ) {
-        kosmos.keyguardBouncerRepository.setPrimaryShow(isShowing)
-        kosmos.keyguardBouncerRepository.setPrimaryStartingToHide(false)
-        val primaryStartDisappearAnimation = if (isAnimatingAway) Runnable {} else null
-        kosmos.keyguardBouncerRepository.setPrimaryStartDisappearAnimation(
-            primaryStartDisappearAnimation
-        )
-
-        whenever(kosmos.keyguardUpdateMonitor.isFingerprintDetectionRunning)
-            .thenReturn(fpsDetectionRunning)
-        whenever(kosmos.keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed)
-            .thenReturn(isUnlockingWithFpAllowed)
-        mContext.orCreateTestableResources.addOverride(
-            R.bool.config_show_sidefps_hint_on_bouncer,
-            true
-        )
-    }
-
-    private suspend fun TestScope.setupTestConfiguration(
-        deviceConfig: DeviceConfig,
-        rotation: DisplayRotation = DisplayRotation.ROTATION_0,
-        isInRearDisplayMode: Boolean,
-    ) {
-        this@SideFpsOverlayViewBinderTest.deviceConfig = deviceConfig
-
-        when (deviceConfig) {
-            DeviceConfig.X_ALIGNED -> {
-                displayWidth = 3000
-                displayHeight = 1500
-                boundsWidth = 200
-                boundsHeight = 100
-                sensorLocation = SensorLocationInternal("", 2500, 0, boundsWidth / 2)
-            }
-            DeviceConfig.Y_ALIGNED -> {
-                displayWidth = 2500
-                displayHeight = 2000
-                boundsWidth = 100
-                boundsHeight = 200
-                sensorLocation = SensorLocationInternal("", displayWidth, 300, boundsHeight / 2)
-            }
-        }
-
-        whenever(kosmos.windowManager.maximumWindowMetrics)
-            .thenReturn(
-                WindowMetrics(
-                    Rect(0, 0, displayWidth, displayHeight),
-                    mock(WindowInsets::class.java),
-                )
-            )
-
-        contextDisplayInfo.uniqueId = DISPLAY_ID
-
+    private suspend fun TestScope.setupTestConfiguration(isInRearDisplayMode: Boolean) {
         kosmos.fingerprintPropertyRepository.setProperties(
             sensorId = 1,
             strength = SensorStrength.STRONG,
             sensorType = FingerprintSensorType.POWER_BUTTON,
-            sensorLocations = mapOf(DISPLAY_ID to sensorLocation)
+            sensorLocations = emptyMap(),
         )
 
         kosmos.displayStateRepository.setIsInRearDisplayMode(isInRearDisplayMode)
-        kosmos.displayStateRepository.setCurrentRotation(rotation)
+        kosmos.displayStateRepository.setCurrentRotation(DisplayRotation.ROTATION_0)
         kosmos.displayRepository.emitDisplayChangeEvent(0)
         kosmos.sideFpsOverlayViewBinder.start()
         runCurrent()
     }
-
-    companion object {
-        private const val DISPLAY_ID = "displayId"
-    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModelTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModelTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
index 0db7b62..84d062a 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
@@ -30,23 +30,19 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.airbnb.lottie.model.KeyPath
-import com.android.keyguard.keyguardUpdateMonitor
 import com.android.settingslib.Utils
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.biometrics.FingerprintInteractiveToAuthProvider
-import com.android.systemui.biometrics.data.repository.biometricStatusRepository
 import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
 import com.android.systemui.biometrics.domain.interactor.displayStateInteractor
-import com.android.systemui.biometrics.shared.model.AuthenticationReason
 import com.android.systemui.biometrics.shared.model.DisplayRotation
 import com.android.systemui.biometrics.shared.model.FingerprintSensorType
 import com.android.systemui.biometrics.shared.model.LottieCallback
 import com.android.systemui.biometrics.shared.model.SensorStrength
-import com.android.systemui.bouncer.data.repository.keyguardBouncerRepository
+import com.android.systemui.biometrics.updateSfpsIndicatorRequests
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.display.data.repository.displayRepository
 import com.android.systemui.display.data.repository.displayStateRepository
-import com.android.systemui.keyguard.ui.viewmodel.sideFpsProgressBarViewModel
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.res.R
 import com.android.systemui.testKosmos
@@ -84,17 +80,17 @@
     private val indicatorColor =
         Utils.getColorAttrDefaultColor(
             context,
-            com.android.internal.R.attr.materialColorPrimaryFixed
+            com.android.internal.R.attr.materialColorPrimaryFixed,
         )
     private val outerRimColor =
         Utils.getColorAttrDefaultColor(
             context,
-            com.android.internal.R.attr.materialColorPrimaryFixedDim
+            com.android.internal.R.attr.materialColorPrimaryFixedDim,
         )
     private val chevronFill =
         Utils.getColorAttrDefaultColor(
             context,
-            com.android.internal.R.attr.materialColorOnPrimaryFixed
+            com.android.internal.R.attr.materialColorOnPrimaryFixed,
         )
     private val color_blue400 =
         context.getColor(com.android.settingslib.color.R.color.settingslib_color_blue400)
@@ -133,7 +129,7 @@
             setupTestConfiguration(
                 DeviceConfig.X_ALIGNED,
                 rotation = DisplayRotation.ROTATION_0,
-                isInRearDisplayMode = false
+                isInRearDisplayMode = false,
             )
 
             val overlayViewProperties by
@@ -167,7 +163,7 @@
             setupTestConfiguration(
                 DeviceConfig.Y_ALIGNED,
                 rotation = DisplayRotation.ROTATION_0,
-                isInRearDisplayMode = false
+                isInRearDisplayMode = false,
             )
 
             val overlayViewProperties by
@@ -201,7 +197,7 @@
             setupTestConfiguration(
                 DeviceConfig.X_ALIGNED,
                 rotation = DisplayRotation.ROTATION_0,
-                isInRearDisplayMode = false
+                isInRearDisplayMode = false,
             )
 
             val overlayViewParams by
@@ -243,7 +239,7 @@
             setupTestConfiguration(
                 DeviceConfig.Y_ALIGNED,
                 rotation = DisplayRotation.ROTATION_0,
-                isInRearDisplayMode = false
+                isInRearDisplayMode = false,
             )
 
             val overlayViewParams by
@@ -284,17 +280,7 @@
         kosmos.testScope.runTest {
             val lottieCallbacks by collectLastValue(kosmos.sideFpsOverlayViewModel.lottieCallbacks)
 
-            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
-                AuthenticationReason.NotRunning
-            )
-            kosmos.sideFpsProgressBarViewModel.setVisible(false)
-
-            updatePrimaryBouncer(
-                isShowing = true,
-                isAnimatingAway = false,
-                fpsDetectionRunning = true,
-                isUnlockingWithFpAllowed = true
-            )
+            updateSfpsIndicatorRequests(kosmos, mContext, primaryBouncerRequest = true)
             runCurrent()
 
             assertThat(lottieCallbacks)
@@ -312,17 +298,7 @@
             val lottieCallbacks by collectLastValue(kosmos.sideFpsOverlayViewModel.lottieCallbacks)
             setDarkMode(true)
 
-            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
-                AuthenticationReason.BiometricPromptAuthentication
-            )
-            kosmos.sideFpsProgressBarViewModel.setVisible(false)
-
-            updatePrimaryBouncer(
-                isShowing = false,
-                isAnimatingAway = false,
-                fpsDetectionRunning = true,
-                isUnlockingWithFpAllowed = true
-            )
+            updateSfpsIndicatorRequests(kosmos, mContext, biometricPromptRequest = true)
             runCurrent()
 
             assertThat(lottieCallbacks)
@@ -338,17 +314,7 @@
             val lottieCallbacks by collectLastValue(kosmos.sideFpsOverlayViewModel.lottieCallbacks)
             setDarkMode(false)
 
-            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
-                AuthenticationReason.BiometricPromptAuthentication
-            )
-            kosmos.sideFpsProgressBarViewModel.setVisible(false)
-
-            updatePrimaryBouncer(
-                isShowing = false,
-                isAnimatingAway = false,
-                fpsDetectionRunning = true,
-                isUnlockingWithFpAllowed = true
-            )
+            updateSfpsIndicatorRequests(kosmos, mContext, biometricPromptRequest = true)
             runCurrent()
 
             assertThat(lottieCallbacks)
@@ -371,29 +337,6 @@
         mContext.resources.configuration.uiMode = uiMode
     }
 
-    private fun updatePrimaryBouncer(
-        isShowing: Boolean,
-        isAnimatingAway: Boolean,
-        fpsDetectionRunning: Boolean,
-        isUnlockingWithFpAllowed: Boolean,
-    ) {
-        kosmos.keyguardBouncerRepository.setPrimaryShow(isShowing)
-        kosmos.keyguardBouncerRepository.setPrimaryStartingToHide(false)
-        val primaryStartDisappearAnimation = if (isAnimatingAway) Runnable {} else null
-        kosmos.keyguardBouncerRepository.setPrimaryStartDisappearAnimation(
-            primaryStartDisappearAnimation
-        )
-
-        whenever(kosmos.keyguardUpdateMonitor.isFingerprintDetectionRunning)
-            .thenReturn(fpsDetectionRunning)
-        whenever(kosmos.keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed)
-            .thenReturn(isUnlockingWithFpAllowed)
-        mContext.orCreateTestableResources.addOverride(
-            R.bool.config_show_sidefps_hint_on_bouncer,
-            true
-        )
-    }
-
     private suspend fun TestScope.setupTestConfiguration(
         deviceConfig: DeviceConfig,
         rotation: DisplayRotation = DisplayRotation.ROTATION_0,
@@ -432,7 +375,7 @@
             sensorId = 1,
             strength = SensorStrength.STRONG,
             sensorType = FingerprintSensorType.POWER_BUTTON,
-            sensorLocations = mapOf(DISPLAY_ID to sensorLocation)
+            sensorLocations = mapOf(DISPLAY_ID to sensorLocation),
         )
 
         kosmos.displayStateRepository.setIsInRearDisplayMode(isInRearDisplayMode)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/composable b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/composable
new file mode 100644
index 0000000..97f2e56
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/composable
@@ -0,0 +1,337 @@
+/*
+ * Copyright (C) 2024 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.systemui.bouncer.ui.composable
+
+import android.app.AlertDialog
+import android.platform.test.annotations.MotionTest
+import android.testing.TestableLooper.RunWithLooper
+import android.view.View
+import androidx.activity.BackEventCompat
+import androidx.compose.animation.core.Animatable
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.layout.Box
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.isFinite
+import androidx.compose.ui.geometry.isUnspecified
+import androidx.compose.ui.semantics.SemanticsNode
+import androidx.compose.ui.test.junit4.AndroidComposeTestRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.android.compose.animation.scene.ObservableTransitionState
+import com.android.compose.animation.scene.Scale
+import com.android.compose.animation.scene.SceneKey
+import com.android.compose.animation.scene.SceneScope
+import com.android.compose.animation.scene.UserAction
+import com.android.compose.animation.scene.UserActionResult
+import com.android.compose.animation.scene.isElement
+import com.android.compose.animation.scene.testing.lastAlphaForTesting
+import com.android.compose.animation.scene.testing.lastScaleForTesting
+import com.android.compose.theme.PlatformTheme
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.bouncer.domain.interactor.bouncerInteractor
+import com.android.systemui.bouncer.ui.BouncerDialogFactory
+import com.android.systemui.bouncer.ui.viewmodel.BouncerSceneContentViewModel
+import com.android.systemui.bouncer.ui.viewmodel.BouncerUserActionsViewModel
+import com.android.systemui.bouncer.ui.viewmodel.bouncerSceneContentViewModel
+import com.android.systemui.flags.EnableSceneContainer
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.lifecycle.ExclusiveActivatable
+import com.android.systemui.lifecycle.rememberViewModel
+import com.android.systemui.motion.createSysUiComposeMotionTestRule
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.domain.startable.sceneContainerStartable
+import com.android.systemui.scene.sceneContainerViewModelFactory
+import com.android.systemui.scene.shared.model.SceneContainerConfig
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.scene.shared.model.sceneDataSourceDelegator
+import com.android.systemui.scene.ui.composable.Scene
+import com.android.systemui.scene.ui.composable.SceneContainer
+import com.android.systemui.testKosmos
+import kotlin.time.Duration.Companion.seconds
+import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.flowOf
+import org.json.JSONObject
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.MockitoAnnotations
+import org.mockito.kotlin.mock
+import platform.test.motion.compose.ComposeFeatureCaptures.positionInRoot
+import platform.test.motion.compose.ComposeRecordingSpec
+import platform.test.motion.compose.MotionControl
+import platform.test.motion.compose.feature
+import platform.test.motion.compose.recordMotion
+import platform.test.motion.compose.runTest
+import platform.test.motion.golden.DataPoint
+import platform.test.motion.golden.DataPointType
+import platform.test.motion.golden.DataPointTypes
+import platform.test.motion.golden.FeatureCapture
+import platform.test.motion.golden.UnknownTypeException
+import platform.test.screenshot.DeviceEmulationSpec
+import platform.test.screenshot.Displays.Phone
+
+/** MotionTest for the Bouncer Predictive Back animation */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+@RunWithLooper
+@EnableSceneContainer
+@MotionTest
+class BouncerPredictiveBackTest : SysuiTestCase() {
+
+    private val deviceSpec = DeviceEmulationSpec(Phone)
+    private val kosmos = testKosmos()
+
+    @get:Rule val motionTestRule = createSysUiComposeMotionTestRule(kosmos, deviceSpec)
+    private val androidComposeTestRule =
+        motionTestRule.toolkit.composeContentTestRule as AndroidComposeTestRule<*, *>
+
+    private val sceneInteractor by lazy { kosmos.sceneInteractor }
+    private val Kosmos.sceneKeys by Fixture { listOf(Scenes.Lockscreen, Scenes.Bouncer) }
+    private val Kosmos.initialSceneKey by Fixture { Scenes.Bouncer }
+    private val Kosmos.sceneContainerConfig by Fixture {
+        val navigationDistances = mapOf(Scenes.Lockscreen to 1, Scenes.Bouncer to 0)
+        SceneContainerConfig(sceneKeys, initialSceneKey, emptyList(), navigationDistances)
+    }
+    private val view = mock<View>()
+
+    private val transitionState by lazy {
+        MutableStateFlow<ObservableTransitionState>(
+            ObservableTransitionState.Idle(kosmos.sceneContainerConfig.initialSceneKey)
+        )
+    }
+
+    private val sceneContainerViewModel by lazy {
+        kosmos.sceneContainerViewModelFactory
+            .create(view) {}
+            .apply { setTransitionState(transitionState) }
+    }
+
+    private val bouncerDialogFactory =
+        object : BouncerDialogFactory {
+            override fun invoke(): AlertDialog {
+                throw AssertionError()
+            }
+        }
+    private val bouncerSceneActionsViewModelFactory =
+        object : BouncerUserActionsViewModel.Factory {
+            override fun create() = BouncerUserActionsViewModel(kosmos.bouncerInteractor)
+        }
+    private lateinit var bouncerSceneContentViewModel: BouncerSceneContentViewModel
+    private val bouncerSceneContentViewModelFactory =
+        object : BouncerSceneContentViewModel.Factory {
+            override fun create() = bouncerSceneContentViewModel
+        }
+    private val bouncerScene =
+        BouncerScene(
+            bouncerSceneActionsViewModelFactory,
+            bouncerSceneContentViewModelFactory,
+            bouncerDialogFactory,
+        )
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+
+        bouncerSceneContentViewModel = kosmos.bouncerSceneContentViewModel
+
+        val startable = kosmos.sceneContainerStartable
+        startable.start()
+    }
+
+    @Test
+    fun bouncerPredictiveBackMotion() =
+        motionTestRule.runTest(timeout = 30.seconds) {
+            val motion =
+                recordMotion(
+                    content = { play ->
+                        PlatformTheme {
+                            BackGestureAnimation(play)
+                            SceneContainer(
+                                viewModel =
+                                    rememberViewModel("BouncerPredictiveBackTest") {
+                                        sceneContainerViewModel
+                                    },
+                                sceneByKey =
+                                    mapOf(
+                                        Scenes.Lockscreen to FakeLockscreen(),
+                                        Scenes.Bouncer to bouncerScene,
+                                    ),
+                                initialSceneKey = Scenes.Bouncer,
+                                overlayByKey = emptyMap(),
+                                dataSourceDelegator = kosmos.sceneDataSourceDelegator,
+                            )
+                        }
+                    },
+                    ComposeRecordingSpec(
+                        MotionControl(
+                            delayRecording = {
+                                awaitCondition {
+                                    sceneInteractor.transitionState.value.isTransitioning()
+                                }
+                            }
+                        ) {
+                            awaitCondition {
+                                sceneInteractor.transitionState.value.isIdle(Scenes.Lockscreen)
+                            }
+                        }
+                    ) {
+                        feature(isElement(Bouncer.Elements.Content), elementAlpha, "content_alpha")
+                        feature(isElement(Bouncer.Elements.Content), elementScale, "content_scale")
+                        feature(
+                            isElement(Bouncer.Elements.Content),
+                            positionInRoot,
+                            "content_offset",
+                        )
+                        feature(
+                            isElement(Bouncer.Elements.Background),
+                            elementAlpha,
+                            "background_alpha",
+                        )
+                    },
+                )
+
+            assertThat(motion).timeSeriesMatchesGolden()
+        }
+
+    @Composable
+    private fun BackGestureAnimation(play: Boolean) {
+        val backProgress = remember { Animatable(0f) }
+
+        LaunchedEffect(play) {
+            if (play) {
+                val dispatcher = androidComposeTestRule.activity.onBackPressedDispatcher
+                androidComposeTestRule.runOnUiThread {
+                    dispatcher.dispatchOnBackStarted(backEvent())
+                }
+                backProgress.animateTo(
+                    targetValue = 1f,
+                    animationSpec = tween(durationMillis = 500),
+                ) {
+                    androidComposeTestRule.runOnUiThread {
+                        dispatcher.dispatchOnBackProgressed(
+                            backEvent(progress = backProgress.value)
+                        )
+                        if (backProgress.value == 1f) {
+                            dispatcher.onBackPressed()
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private fun backEvent(progress: Float = 0f): BackEventCompat {
+        return BackEventCompat(
+            touchX = 0f,
+            touchY = 0f,
+            progress = progress,
+            swipeEdge = BackEventCompat.EDGE_LEFT,
+        )
+    }
+
+    private class FakeLockscreen : ExclusiveActivatable(), Scene {
+        override val key: SceneKey = Scenes.Lockscreen
+        override val userActions: Flow<Map<UserAction, UserActionResult>> = flowOf()
+
+        @Composable
+        override fun SceneScope.Content(modifier: Modifier) {
+            Box(modifier = modifier, contentAlignment = Alignment.Center) {
+                Text(text = "Fake Lockscreen")
+            }
+        }
+
+        override suspend fun onActivated() = awaitCancellation()
+    }
+
+    companion object {
+        private val elementAlpha =
+            FeatureCapture<SemanticsNode, Float>("alpha") {
+                DataPoint.of(it.lastAlphaForTesting, DataPointTypes.float)
+            }
+
+        private val elementScale =
+            FeatureCapture<SemanticsNode, Scale>("scale") {
+                DataPoint.of(it.lastScaleForTesting, scale)
+            }
+
+        private val scale: DataPointType<Scale> =
+            DataPointType(
+                "scale",
+                jsonToValue = {
+                    when (it) {
+                        "unspecified" -> Scale.Unspecified
+                        "default" -> Scale.Default
+                        "zero" -> Scale.Zero
+                        is JSONObject -> {
+                            val pivot = it.get("pivot")
+                            Scale(
+                                scaleX = it.getDouble("x").toFloat(),
+                                scaleY = it.getDouble("y").toFloat(),
+                                pivot =
+                                    when (pivot) {
+                                        "unspecified" -> Offset.Unspecified
+                                        "infinite" -> Offset.Infinite
+                                        is JSONObject ->
+                                            Offset(
+                                                pivot.getDouble("x").toFloat(),
+                                                pivot.getDouble("y").toFloat(),
+                                            )
+                                        else -> throw UnknownTypeException()
+                                    },
+                            )
+                        }
+                        else -> throw UnknownTypeException()
+                    }
+                },
+                valueToJson = {
+                    when (it) {
+                        Scale.Unspecified -> "unspecified"
+                        Scale.Default -> "default"
+                        Scale.Zero -> "zero"
+                        else -> {
+                            JSONObject().apply {
+                                put("x", it.scaleX)
+                                put("y", it.scaleY)
+                                put(
+                                    "pivot",
+                                    when {
+                                        it.pivot.isUnspecified -> "unspecified"
+                                        !it.pivot.isFinite -> "infinite"
+                                        else ->
+                                            JSONObject().apply {
+                                                put("x", it.pivot.x)
+                                                put("y", it.pivot.y)
+                                            }
+                                    },
+                                )
+                            }
+                        }
+                    }
+                },
+            )
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt
index c163c6f..0490a26 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt
@@ -350,7 +350,7 @@
         testScope.runTest {
             underTest.performDotFeedback(null)
 
-            assertThat(msdlPlayer.latestTokenPlayed).isEqualTo(MSDLToken.DRAG_INDICATOR)
+            assertThat(msdlPlayer.latestTokenPlayed).isEqualTo(MSDLToken.DRAG_INDICATOR_DISCRETE)
             assertThat(msdlPlayer.latestPropertiesPlayed).isNull()
         }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/classifier/BrightLineClassifierTest.java
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/classifier/BrightLineClassifierTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/ZigZagClassifierTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/classifier/ZigZagClassifierTest.java
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/classifier/ZigZagClassifierTest.java
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/classifier/ZigZagClassifierTest.java
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/db/CommunalWidgetDaoTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/db/CommunalWidgetDaoTest.kt
index d4d966a..2312bbd 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/db/CommunalWidgetDaoTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/db/CommunalWidgetDaoTest.kt
@@ -22,6 +22,7 @@
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.communal.nano.CommunalHubState
+import com.android.systemui.communal.shared.model.CommunalContentSize
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.lifecycle.InstantTaskExecutorRule
 import com.google.common.truth.Truth.assertThat
@@ -102,7 +103,7 @@
                     widgetId = widgetId,
                     provider = provider,
                     rank = rank,
-                    userSerialNumber = userSerialNumber
+                    userSerialNumber = userSerialNumber,
                 )
             }
             assertThat(widgets())
@@ -110,7 +111,7 @@
                     communalItemRankEntry1,
                     communalWidgetItemEntry1,
                     communalItemRankEntry2,
-                    communalWidgetItemEntry2
+                    communalWidgetItemEntry2,
                 )
         }
 
@@ -129,7 +130,7 @@
                 communalWidgetDao.addWidget(
                     widgetId = widgetId,
                     provider = provider,
-                    userSerialNumber = userSerialNumber
+                    userSerialNumber = userSerialNumber,
                 )
             }
 
@@ -165,7 +166,7 @@
                     communalItemRankEntry1,
                     communalWidgetItemEntry1,
                     communalItemRankEntry2,
-                    communalWidgetItemEntry2
+                    communalWidgetItemEntry2,
                 )
 
             communalWidgetDao.deleteWidgetById(communalWidgetItemEntry1.widgetId)
@@ -251,6 +252,7 @@
                     componentName = "pk_name/cls_name_4",
                     itemId = 4L,
                     userSerialNumber = 0,
+                    spanY = 3,
                 )
             assertThat(widgets())
                 .containsExactly(
@@ -267,6 +269,68 @@
         }
 
     @Test
+    fun addWidget_withDifferentSpanY_readsCorrectValuesInDb() =
+        testScope.runTest {
+            val widgets = collectLastValue(communalWidgetDao.getWidgets())
+
+            // Add widgets with different spanY values
+            communalWidgetDao.addWidget(
+                widgetId = 1,
+                provider = ComponentName("pkg_name", "cls_name_1"),
+                rank = 0,
+                userSerialNumber = 0,
+                spanY = CommunalContentSize.FULL.span,
+            )
+            communalWidgetDao.addWidget(
+                widgetId = 2,
+                provider = ComponentName("pkg_name", "cls_name_2"),
+                rank = 1,
+                userSerialNumber = 0,
+                spanY = CommunalContentSize.HALF.span,
+            )
+            communalWidgetDao.addWidget(
+                widgetId = 3,
+                provider = ComponentName("pkg_name", "cls_name_3"),
+                rank = 2,
+                userSerialNumber = 0,
+                spanY = CommunalContentSize.THIRD.span,
+            )
+
+            // Verify that the widgets have the correct spanY values
+            assertThat(widgets())
+                .containsExactly(
+                    CommunalItemRank(uid = 1L, rank = 0),
+                    CommunalWidgetItem(
+                        uid = 1L,
+                        widgetId = 1,
+                        componentName = "pkg_name/cls_name_1",
+                        itemId = 1L,
+                        userSerialNumber = 0,
+                        spanY = CommunalContentSize.FULL.span,
+                    ),
+                    CommunalItemRank(uid = 2L, rank = 1),
+                    CommunalWidgetItem(
+                        uid = 2L,
+                        widgetId = 2,
+                        componentName = "pkg_name/cls_name_2",
+                        itemId = 2L,
+                        userSerialNumber = 0,
+                        spanY = CommunalContentSize.HALF.span,
+                    ),
+                    CommunalItemRank(uid = 3L, rank = 2),
+                    CommunalWidgetItem(
+                        uid = 3L,
+                        widgetId = 3,
+                        componentName = "pkg_name/cls_name_3",
+                        itemId = 3L,
+                        userSerialNumber = 0,
+                        spanY = CommunalContentSize.THIRD.span,
+                    ),
+                )
+                .inOrder()
+        }
+
+    @Test
     fun restoreCommunalHubState() =
         testScope.runTest {
             // Set up db
@@ -288,6 +352,7 @@
                         componentName = fakeWidget.componentName,
                         itemId = rank.uid,
                         userSerialNumber = fakeWidget.userSerialNumber,
+                        spanY = 3,
                     )
                 expected[rank] = widget
             }
@@ -343,6 +408,7 @@
                 componentName = widgetInfo1.provider.flattenToString(),
                 itemId = communalItemRankEntry1.uid,
                 userSerialNumber = widgetInfo1.userSerialNumber,
+                spanY = 3,
             )
         val communalWidgetItemEntry2 =
             CommunalWidgetItem(
@@ -351,6 +417,7 @@
                 componentName = widgetInfo2.provider.flattenToString(),
                 itemId = communalItemRankEntry2.uid,
                 userSerialNumber = widgetInfo2.userSerialNumber,
+                spanY = 3,
             )
         val communalWidgetItemEntry3 =
             CommunalWidgetItem(
@@ -359,6 +426,7 @@
                 componentName = widgetInfo3.provider.flattenToString(),
                 itemId = communalItemRankEntry3.uid,
                 userSerialNumber = widgetInfo3.userSerialNumber,
+                spanY = 3,
             )
         val fakeState =
             CommunalHubState().apply {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/db/DefaultWidgetPopulationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/db/DefaultWidgetPopulationTest.kt
index eba395b..596db07 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/db/DefaultWidgetPopulationTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/db/DefaultWidgetPopulationTest.kt
@@ -117,6 +117,7 @@
                     componentName = defaultWidgets[0],
                     rank = 0,
                     userSerialNumber = 0,
+                    spanY = 3,
                 )
             verify(communalWidgetDao)
                 .addWidget(
@@ -124,6 +125,7 @@
                     componentName = defaultWidgets[1],
                     rank = 1,
                     userSerialNumber = 0,
+                    spanY = 3,
                 )
             verify(communalWidgetDao)
                 .addWidget(
@@ -131,6 +133,7 @@
                     componentName = defaultWidgets[2],
                     rank = 2,
                     userSerialNumber = 0,
+                    spanY = 3,
                 )
         }
 
@@ -152,6 +155,7 @@
                     componentName = any(),
                     rank = anyInt(),
                     userSerialNumber = anyInt(),
+                    spanY = anyInt(),
                 )
         }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt
index 980a5ec..8ae9d2e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt
@@ -25,8 +25,10 @@
 import android.graphics.Bitmap
 import android.os.UserHandle
 import android.os.userManager
+import android.platform.test.annotations.EnableFlags
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
+import com.android.systemui.Flags.FLAG_COMMUNAL_WIDGET_RESIZING
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.common.data.repository.fakePackageChangeRepository
 import com.android.systemui.common.shared.model.PackageInstallSession
@@ -143,7 +145,8 @@
     fun communalWidgets_queryWidgetsFromDb() =
         testScope.runTest {
             val communalItemRankEntry = CommunalItemRank(uid = 1L, rank = 1)
-            val communalWidgetItemEntry = CommunalWidgetItem(uid = 1L, 1, "pk_name/cls_name", 1L, 0)
+            val communalWidgetItemEntry =
+                CommunalWidgetItem(uid = 1L, 1, "pk_name/cls_name", 1L, 0, 3)
             fakeWidgets.value = mapOf(communalItemRankEntry to communalWidgetItemEntry)
             fakeProviders.value = mapOf(1 to providerInfoA)
 
@@ -155,6 +158,7 @@
                         appWidgetId = communalWidgetItemEntry.widgetId,
                         providerInfo = providerInfoA,
                         rank = communalItemRankEntry.rank,
+                        spanY = communalWidgetItemEntry.spanY,
                     )
                 )
 
@@ -169,19 +173,15 @@
             fakeWidgets.value =
                 mapOf(
                     CommunalItemRank(uid = 1L, rank = 1) to
-                        CommunalWidgetItem(uid = 1L, 1, "pk_1/cls_1", 1L, 0),
+                        CommunalWidgetItem(uid = 1L, 1, "pk_1/cls_1", 1L, 0, 3),
                     CommunalItemRank(uid = 2L, rank = 2) to
-                        CommunalWidgetItem(uid = 2L, 2, "pk_2/cls_2", 2L, 0),
+                        CommunalWidgetItem(uid = 2L, 2, "pk_2/cls_2", 2L, 0, 3),
                     CommunalItemRank(uid = 3L, rank = 3) to
-                        CommunalWidgetItem(uid = 3L, 3, "pk_3/cls_3", 3L, 0),
+                        CommunalWidgetItem(uid = 3L, 3, "pk_3/cls_3", 3L, 0, 3),
                     CommunalItemRank(uid = 4L, rank = 4) to
-                        CommunalWidgetItem(uid = 4L, 4, "pk_4/cls_4", 4L, 0),
+                        CommunalWidgetItem(uid = 4L, 4, "pk_4/cls_4", 4L, 0, 3),
                 )
-            fakeProviders.value =
-                mapOf(
-                    1 to providerInfoA,
-                    2 to providerInfoB,
-                )
+            fakeProviders.value = mapOf(1 to providerInfoA, 2 to providerInfoB)
 
             // Expect to see only widget 1 and 2
             val communalWidgets by collectLastValue(underTest.communalWidgets)
@@ -191,11 +191,13 @@
                         appWidgetId = 1,
                         providerInfo = providerInfoA,
                         rank = 1,
+                        spanY = 3,
                     ),
                     CommunalWidgetContentModel.Available(
                         appWidgetId = 2,
                         providerInfo = providerInfoB,
                         rank = 2,
+                        spanY = 3,
                     ),
                 )
         }
@@ -207,15 +209,11 @@
             fakeWidgets.value =
                 mapOf(
                     CommunalItemRank(uid = 1L, rank = 1) to
-                        CommunalWidgetItem(uid = 1L, 1, "pk_1/cls_1", 1L, 0),
+                        CommunalWidgetItem(uid = 1L, 1, "pk_1/cls_1", 1L, 0, 3),
                     CommunalItemRank(uid = 2L, rank = 2) to
-                        CommunalWidgetItem(uid = 2L, 2, "pk_2/cls_2", 2L, 0),
+                        CommunalWidgetItem(uid = 2L, 2, "pk_2/cls_2", 2L, 0, 3),
                 )
-            fakeProviders.value =
-                mapOf(
-                    1 to providerInfoA,
-                    2 to providerInfoB,
-                )
+            fakeProviders.value = mapOf(1 to providerInfoA, 2 to providerInfoB)
 
             // Expect two widgets
             val communalWidgets by collectLastValue(underTest.communalWidgets)
@@ -226,20 +224,18 @@
                         appWidgetId = 1,
                         providerInfo = providerInfoA,
                         rank = 1,
+                        spanY = 3,
                     ),
                     CommunalWidgetContentModel.Available(
                         appWidgetId = 2,
                         providerInfo = providerInfoB,
                         rank = 2,
+                        spanY = 3,
                     ),
                 )
 
             // Provider info updated for widget 1
-            fakeProviders.value =
-                mapOf(
-                    1 to providerInfoC,
-                    2 to providerInfoB,
-                )
+            fakeProviders.value = mapOf(1 to providerInfoC, 2 to providerInfoB)
             runCurrent()
 
             assertThat(communalWidgets)
@@ -249,11 +245,13 @@
                         // Verify that provider info updated
                         providerInfo = providerInfoC,
                         rank = 1,
+                        spanY = 3,
                     ),
                     CommunalWidgetContentModel.Available(
                         appWidgetId = 2,
                         providerInfo = providerInfoB,
                         rank = 2,
+                        spanY = 3,
                     ),
                 )
         }
@@ -269,7 +267,7 @@
             whenever(
                     communalWidgetHost.allocateIdAndBindWidget(
                         any<ComponentName>(),
-                        any<UserHandle>()
+                        any<UserHandle>(),
                     )
                 )
                 .thenReturn(id)
@@ -294,7 +292,7 @@
             whenever(
                     communalWidgetHost.allocateIdAndBindWidget(
                         any<ComponentName>(),
-                        any<UserHandle>()
+                        any<UserHandle>(),
                     )
                 )
                 .thenReturn(id)
@@ -303,7 +301,7 @@
 
             verify(communalWidgetHost).allocateIdAndBindWidget(provider, mainUser)
             verify(communalWidgetDao, never())
-                .addWidget(anyInt(), any<ComponentName>(), anyInt(), anyInt())
+                .addWidget(anyInt(), any<ComponentName>(), anyInt(), anyInt(), anyInt())
             verify(appWidgetHost).deleteAppWidgetId(id)
 
             // Verify backup not requested
@@ -321,7 +319,7 @@
             whenever(
                     communalWidgetHost.allocateIdAndBindWidget(
                         any<ComponentName>(),
-                        any<UserHandle>()
+                        any<UserHandle>(),
                     )
                 )
                 .thenReturn(id)
@@ -332,7 +330,7 @@
 
             verify(communalWidgetHost).allocateIdAndBindWidget(provider, mainUser)
             verify(communalWidgetDao, never())
-                .addWidget(anyInt(), any<ComponentName>(), anyInt(), anyInt())
+                .addWidget(anyInt(), any<ComponentName>(), anyInt(), anyInt(), anyInt())
             verify(appWidgetHost).deleteAppWidgetId(id)
 
             // Verify backup not requested
@@ -350,7 +348,7 @@
             whenever(
                     communalWidgetHost.allocateIdAndBindWidget(
                         any<ComponentName>(),
-                        any<UserHandle>()
+                        any<UserHandle>(),
                     )
                 )
                 .thenReturn(id)
@@ -650,8 +648,10 @@
                     eq(newWidgetId),
                     componentNameCaptor.capture(),
                     eq(2),
-                    eq(testUserSerialNumber(workProfile))
+                    eq(testUserSerialNumber(workProfile)),
+                    anyInt(),
                 )
+
             assertThat(componentNameCaptor.firstValue)
                 .isEqualTo(ComponentName("pk_name", "fake_widget_2"))
         }
@@ -662,9 +662,9 @@
             fakeWidgets.value =
                 mapOf(
                     CommunalItemRank(uid = 1L, rank = 1) to
-                        CommunalWidgetItem(uid = 1L, 1, "pk_1/cls_1", 1L, 0),
+                        CommunalWidgetItem(uid = 1L, 1, "pk_1/cls_1", 1L, 0, 3),
                     CommunalItemRank(uid = 2L, rank = 2) to
-                        CommunalWidgetItem(uid = 2L, 2, "pk_2/cls_2", 2L, 0),
+                        CommunalWidgetItem(uid = 2L, 2, "pk_2/cls_2", 2L, 0, 3),
                 )
 
             // Widget 1 is installed
@@ -690,6 +690,7 @@
                         appWidgetId = 1,
                         providerInfo = providerInfoA,
                         rank = 1,
+                        spanY = 3,
                     ),
                     CommunalWidgetContentModel.Pending(
                         appWidgetId = 2,
@@ -697,6 +698,7 @@
                         componentName = ComponentName("pk_2", "cls_2"),
                         icon = fakeIcon,
                         user = mainUser,
+                        spanY = 3,
                     ),
                 )
         }
@@ -707,7 +709,7 @@
             fakeWidgets.value =
                 mapOf(
                     CommunalItemRank(uid = 1L, rank = 1) to
-                        CommunalWidgetItem(uid = 1L, 1, "pk_1/cls_1", 1L, 0),
+                        CommunalWidgetItem(uid = 1L, 1, "pk_1/cls_1", 1L, 0, 3)
                 )
 
             // Widget 1 is pending install
@@ -732,7 +734,8 @@
                         componentName = ComponentName("pk_1", "cls_1"),
                         icon = fakeIcon,
                         user = mainUser,
-                    ),
+                        spanY = 3,
+                    )
                 )
 
             // Package for widget 1 finished installing
@@ -749,10 +752,26 @@
                         appWidgetId = 1,
                         providerInfo = providerInfoA,
                         rank = 1,
-                    ),
+                        spanY = 3,
+                    )
                 )
         }
 
+    @Test
+    @EnableFlags(FLAG_COMMUNAL_WIDGET_RESIZING)
+    fun updateWidgetSpanY_updatesWidgetInDaoAndRequestsBackup() =
+        testScope.runTest {
+            val widgetId = 1
+            val newSpanY = 6
+            val widgetIdToRankMap = emptyMap<Int, Int>()
+
+            underTest.resizeWidget(widgetId, newSpanY, widgetIdToRankMap)
+            runCurrent()
+
+            verify(communalWidgetDao).resizeWidget(widgetId, newSpanY, widgetIdToRankMap)
+            verify(backupManager).dataChanged()
+        }
+
     private fun setAppWidgetIds(ids: List<Int>) {
         whenever(appWidgetHost.appWidgetIds).thenReturn(ids.toIntArray())
     }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt
index b96e40f..611a61a6 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt
@@ -24,6 +24,7 @@
 import android.os.UserHandle
 import android.os.UserManager
 import android.os.userManager
+import android.platform.test.annotations.EnableFlags
 import android.provider.Settings
 import android.provider.Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED
 import android.widget.RemoteViews
@@ -31,6 +32,7 @@
 import androidx.test.filters.SmallTest
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
+import com.android.systemui.Flags.FLAG_COMMUNAL_WIDGET_RESIZING
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.broadcast.broadcastDispatcher
 import com.android.systemui.communal.data.model.CommunalSmartspaceTimer
@@ -1078,6 +1080,108 @@
             assertThat(managedProfileController.isWorkModeEnabled()).isTrue()
         }
 
+    @Test
+    @EnableFlags(FLAG_COMMUNAL_WIDGET_RESIZING)
+    fun resizeWidget_withoutUpdatingOrder() =
+        testScope.runTest {
+            val userInfos = listOf(MAIN_USER_INFO)
+            userRepository.setUserInfos(userInfos)
+            userTracker.set(userInfos = userInfos, selectedUserIndex = 0)
+            runCurrent()
+
+            // Widgets available.
+            widgetRepository.addWidget(
+                appWidgetId = 1,
+                userId = MAIN_USER_INFO.id,
+                rank = 0,
+                spanY = CommunalContentSize.HALF.span,
+            )
+            widgetRepository.addWidget(
+                appWidgetId = 2,
+                userId = MAIN_USER_INFO.id,
+                rank = 1,
+                spanY = CommunalContentSize.HALF.span,
+            )
+            widgetRepository.addWidget(
+                appWidgetId = 3,
+                userId = MAIN_USER_INFO.id,
+                rank = 2,
+                spanY = CommunalContentSize.HALF.span,
+            )
+
+            val widgetContent by collectLastValue(underTest.widgetContent)
+
+            assertThat(widgetContent?.map { it.appWidgetId to it.size })
+                .containsExactly(
+                    1 to CommunalContentSize.HALF,
+                    2 to CommunalContentSize.HALF,
+                    3 to CommunalContentSize.HALF,
+                )
+                .inOrder()
+
+            underTest.resizeWidget(2, CommunalContentSize.FULL.span, emptyMap())
+
+            // Widget 2 should have been resized to FULL
+            assertThat(widgetContent?.map { it.appWidgetId to it.size })
+                .containsExactly(
+                    1 to CommunalContentSize.HALF,
+                    2 to CommunalContentSize.FULL,
+                    3 to CommunalContentSize.HALF,
+                )
+                .inOrder()
+        }
+
+    @Test
+    @EnableFlags(FLAG_COMMUNAL_WIDGET_RESIZING)
+    fun resizeWidget_andUpdateOrder() =
+        testScope.runTest {
+            val userInfos = listOf(MAIN_USER_INFO)
+            userRepository.setUserInfos(userInfos)
+            userTracker.set(userInfos = userInfos, selectedUserIndex = 0)
+            runCurrent()
+
+            // Widgets available.
+            widgetRepository.addWidget(
+                appWidgetId = 1,
+                userId = MAIN_USER_INFO.id,
+                rank = 0,
+                spanY = CommunalContentSize.HALF.span,
+            )
+            widgetRepository.addWidget(
+                appWidgetId = 2,
+                userId = MAIN_USER_INFO.id,
+                rank = 1,
+                spanY = CommunalContentSize.HALF.span,
+            )
+            widgetRepository.addWidget(
+                appWidgetId = 3,
+                userId = MAIN_USER_INFO.id,
+                rank = 2,
+                spanY = CommunalContentSize.HALF.span,
+            )
+
+            val widgetContent by collectLastValue(underTest.widgetContent)
+
+            assertThat(widgetContent?.map { it.appWidgetId to it.size })
+                .containsExactly(
+                    1 to CommunalContentSize.HALF,
+                    2 to CommunalContentSize.HALF,
+                    3 to CommunalContentSize.HALF,
+                )
+                .inOrder()
+
+            underTest.resizeWidget(2, CommunalContentSize.FULL.span, mapOf(2 to 0, 1 to 1))
+
+            // Widget 2 should have been resized to FULL and moved to the front of the list
+            assertThat(widgetContent?.map { it.appWidgetId to it.size })
+                .containsExactly(
+                    2 to CommunalContentSize.FULL,
+                    1 to CommunalContentSize.HALF,
+                    3 to CommunalContentSize.HALF,
+                )
+                .inOrder()
+        }
+
     private fun setKeyguardFeaturesDisabled(user: UserInfo, disabledFlags: Int) {
         whenever(kosmos.devicePolicyManager.getKeyguardDisabledFeatures(nullable(), eq(user.id)))
             .thenReturn(disabledFlags)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorTest.kt
index e25c1a7..d5020a5 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorTest.kt
@@ -109,7 +109,9 @@
         kosmos.fakeFeatureFlagsClassic.set(Flags.COMMUNAL_SERVICE_ENABLED, true)
         underTest.start()
         kosmos.communalSceneRepository.setTransitionState(sceneTransitions)
-        testScope.launch { keyguardTransitionRepository.emitInitialStepsFromOff(LOCKSCREEN) }
+        testScope.launch {
+            keyguardTransitionRepository.emitInitialStepsFromOff(LOCKSCREEN, testSetup = true)
+        }
     }
 
     /** Transition from blank to glanceable hub. This is the default case. */
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModelTest.kt
new file mode 100644
index 0000000..755c4eb
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModelTest.kt
@@ -0,0 +1,229 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.communal.ui.viewmodel
+
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.compose.animation.scene.Swipe
+import com.android.compose.animation.scene.UserActionResult
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.authentication.data.repository.fakeAuthenticationRepository
+import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
+import com.android.systemui.flags.EnableSceneContainer
+import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
+import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.lifecycle.activateIn
+import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
+import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
+import com.android.systemui.power.domain.interactor.powerInteractor
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.shared.model.Overlays
+import com.android.systemui.scene.shared.model.SceneFamilies
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade
+import com.android.systemui.shade.data.repository.fakeShadeRepository
+import com.android.systemui.shade.shared.flag.DualShade
+import com.android.systemui.shade.shared.model.ShadeMode
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import kotlin.test.Test
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@EnableSceneContainer
+class CommunalUserActionsViewModelTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+
+    private lateinit var underTest: CommunalUserActionsViewModel
+
+    @Before
+    fun setUp() {
+        underTest = kosmos.communalUserActionsViewModel
+        underTest.activateIn(testScope)
+    }
+
+    @Test
+    @DisableFlags(DualShade.FLAG_NAME)
+    fun actions_singleShade() =
+        testScope.runTest {
+            val actions by collectLastValue(underTest.actions)
+
+            setUpState(
+                isShadeTouchable = true,
+                isDeviceUnlocked = false,
+                shadeMode = ShadeMode.Single,
+            )
+            assertThat(actions).isNotEmpty()
+            assertThat(actions?.get(Swipe.End)).isEqualTo(UserActionResult(SceneFamilies.Home))
+            assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Bouncer))
+            assertThat(actions?.get(Swipe.Down))
+                .isEqualTo(UserActionResult(Scenes.Shade, isIrreversible = true))
+
+            setUpState(
+                isShadeTouchable = false,
+                isDeviceUnlocked = false,
+                shadeMode = ShadeMode.Single,
+            )
+            assertThat(actions).isEmpty()
+
+            setUpState(
+                isShadeTouchable = true,
+                isDeviceUnlocked = true,
+                shadeMode = ShadeMode.Single,
+            )
+            assertThat(actions).isNotEmpty()
+            assertThat(actions?.get(Swipe.End)).isEqualTo(UserActionResult(SceneFamilies.Home))
+            assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Gone))
+            assertThat(actions?.get(Swipe.Down))
+                .isEqualTo(UserActionResult(Scenes.Shade, isIrreversible = true))
+        }
+
+    @Test
+    @DisableFlags(DualShade.FLAG_NAME)
+    fun actions_splitShade() =
+        testScope.runTest {
+            val actions by collectLastValue(underTest.actions)
+
+            setUpState(
+                isShadeTouchable = true,
+                isDeviceUnlocked = false,
+                shadeMode = ShadeMode.Split,
+            )
+            assertThat(actions).isNotEmpty()
+            assertThat(actions?.get(Swipe.End)).isEqualTo(UserActionResult(SceneFamilies.Home))
+            assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Bouncer))
+            assertThat(actions?.get(Swipe.Down))
+                .isEqualTo(UserActionResult(Scenes.Shade, ToSplitShade, isIrreversible = true))
+
+            setUpState(
+                isShadeTouchable = false,
+                isDeviceUnlocked = false,
+                shadeMode = ShadeMode.Split,
+            )
+            assertThat(actions).isEmpty()
+
+            setUpState(
+                isShadeTouchable = true,
+                isDeviceUnlocked = true,
+                shadeMode = ShadeMode.Split,
+            )
+            assertThat(actions).isNotEmpty()
+            assertThat(actions?.get(Swipe.End)).isEqualTo(UserActionResult(SceneFamilies.Home))
+            assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Gone))
+            assertThat(actions?.get(Swipe.Down))
+                .isEqualTo(UserActionResult(Scenes.Shade, ToSplitShade, isIrreversible = true))
+        }
+
+    @Test
+    @EnableFlags(DualShade.FLAG_NAME)
+    fun actions_dualShade() =
+        testScope.runTest {
+            val actions by collectLastValue(underTest.actions)
+
+            setUpState(
+                isShadeTouchable = true,
+                isDeviceUnlocked = false,
+                shadeMode = ShadeMode.Dual,
+            )
+            assertThat(actions).isNotEmpty()
+            assertThat(actions?.get(Swipe.End)).isEqualTo(UserActionResult(SceneFamilies.Home))
+            assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Bouncer))
+            assertThat(actions?.get(Swipe.Down))
+                .isEqualTo(
+                    UserActionResult.ShowOverlay(Overlays.NotificationsShade, isIrreversible = true)
+                )
+
+            setUpState(
+                isShadeTouchable = false,
+                isDeviceUnlocked = false,
+                shadeMode = ShadeMode.Dual,
+            )
+            assertThat(actions).isEmpty()
+
+            setUpState(isShadeTouchable = true, isDeviceUnlocked = true, shadeMode = ShadeMode.Dual)
+            assertThat(actions).isNotEmpty()
+            assertThat(actions?.get(Swipe.End)).isEqualTo(UserActionResult(SceneFamilies.Home))
+            assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Gone))
+            assertThat(actions?.get(Swipe.Down))
+                .isEqualTo(
+                    UserActionResult.ShowOverlay(Overlays.NotificationsShade, isIrreversible = true)
+                )
+        }
+
+    private fun TestScope.setUpState(
+        isShadeTouchable: Boolean,
+        isDeviceUnlocked: Boolean,
+        shadeMode: ShadeMode,
+    ) {
+        if (isShadeTouchable) {
+            kosmos.powerInteractor.setAwakeForTest()
+        } else {
+            kosmos.powerInteractor.setAsleepForTest()
+        }
+
+        if (isDeviceUnlocked) {
+            unlockDevice()
+        } else {
+            lockDevice()
+        }
+
+        if (shadeMode == ShadeMode.Dual) {
+            assertThat(DualShade.isEnabled).isTrue()
+        } else {
+            assertThat(DualShade.isEnabled).isFalse()
+            kosmos.fakeShadeRepository.setShadeLayoutWide(shadeMode == ShadeMode.Split)
+        }
+        runCurrent()
+    }
+
+    private fun TestScope.lockDevice() {
+        val deviceUnlockStatus by
+            collectLastValue(kosmos.deviceUnlockedInteractor.deviceUnlockStatus)
+
+        kosmos.fakeAuthenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Pin)
+        assertThat(deviceUnlockStatus?.isUnlocked).isFalse()
+        kosmos.sceneInteractor.changeScene(Scenes.Lockscreen, "reason")
+        runCurrent()
+    }
+
+    private fun TestScope.unlockDevice() {
+        val deviceUnlockStatus by
+            collectLastValue(kosmos.deviceUnlockedInteractor.deviceUnlockStatus)
+
+        kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+            SuccessFingerprintAuthenticationStatus(0, true)
+        )
+        assertThat(deviceUnlockStatus?.isUnlocked).isTrue()
+        kosmos.sceneInteractor.changeScene(Scenes.Gone, "reason")
+        runCurrent()
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModelTest.kt
new file mode 100644
index 0000000..f0d88ab
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModelTest.kt
@@ -0,0 +1,340 @@
+/*
+ * Copyright (C) 2024 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.systemui.communal.ui.viewmodel
+
+import androidx.compose.foundation.gestures.DraggableAnchors
+import androidx.compose.runtime.snapshots.Snapshot
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.lifecycle.activateIn
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import kotlin.time.Duration
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class ResizeableItemFrameViewModelTest : SysuiTestCase() {
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+    private val underTest = kosmos.resizeableItemFrameViewModel
+
+    /** Total viewport height of the entire grid */
+    private val viewportHeightPx = 100
+    /** Total amount of vertical padding around the viewport */
+    private val verticalContentPaddingPx = 20f
+
+    private val singleSpanGrid =
+        GridLayout(
+            verticalItemSpacingPx = 10f,
+            verticalContentPaddingPx = verticalContentPaddingPx,
+            viewportHeightPx = viewportHeightPx,
+            maxItemSpan = 1,
+            minItemSpan = 1,
+            currentSpan = 1,
+            currentRow = 0,
+        )
+
+    @Before
+    fun setUp() {
+        underTest.activateIn(testScope)
+    }
+
+    @Test
+    fun testDefaultState() {
+        val topState = underTest.topDragState
+        assertThat(topState.currentValue).isEqualTo(0)
+        assertThat(topState.offset).isEqualTo(0f)
+        assertThat(topState.anchors.toList()).containsExactly(0 to 0f)
+
+        val bottomState = underTest.bottomDragState
+        assertThat(bottomState.currentValue).isEqualTo(0)
+        assertThat(bottomState.offset).isEqualTo(0f)
+        assertThat(bottomState.anchors.toList()).containsExactly(0 to 0f)
+    }
+
+    @Test
+    fun testSingleSpanGrid() =
+        testScope.runTest(timeout = Duration.INFINITE) {
+            updateGridLayout(singleSpanGrid)
+
+            val topState = underTest.topDragState
+            assertThat(topState.currentValue).isEqualTo(0)
+            assertThat(topState.anchors.toList()).containsExactly(0 to 0f)
+
+            val bottomState = underTest.bottomDragState
+            assertThat(bottomState.currentValue).isEqualTo(0)
+            assertThat(bottomState.anchors.toList()).containsExactly(0 to 0f)
+        }
+
+    /**
+     * Verifies element in first row which is already at the minimum size can only be expanded
+     * downwards.
+     */
+    @Test
+    fun testTwoSpanGrid_elementInFirstRow_sizeSingleSpan() =
+        testScope.runTest {
+            updateGridLayout(singleSpanGrid.copy(maxItemSpan = 2))
+
+            val topState = underTest.topDragState
+            assertThat(topState.currentValue).isEqualTo(0)
+            assertThat(topState.anchors.toList()).containsExactly(0 to 0f)
+
+            val bottomState = underTest.bottomDragState
+            assertThat(bottomState.currentValue).isEqualTo(0)
+            assertThat(bottomState.anchors.toList()).containsExactly(0 to 0f, 1 to 45f)
+        }
+
+    /**
+     * Verifies element in second row which is already at the minimum size can only be expanded
+     * upwards.
+     */
+    @Test
+    fun testTwoSpanGrid_elementInSecondRow_sizeSingleSpan() =
+        testScope.runTest {
+            updateGridLayout(singleSpanGrid.copy(maxItemSpan = 2, currentRow = 1))
+
+            val topState = underTest.topDragState
+            assertThat(topState.currentValue).isEqualTo(0)
+            assertThat(topState.anchors.toList()).containsExactly(0 to 0f, -1 to -45f)
+
+            val bottomState = underTest.bottomDragState
+            assertThat(bottomState.currentValue).isEqualTo(0)
+            assertThat(bottomState.anchors.toList()).containsExactly(0 to 0f)
+        }
+
+    /**
+     * Verifies element in first row which is already at full size (2 span) can only be shrunk from
+     * the bottom.
+     */
+    @Test
+    fun testTwoSpanGrid_elementInFirstRow_sizeTwoSpan() =
+        testScope.runTest {
+            updateGridLayout(singleSpanGrid.copy(maxItemSpan = 2, currentSpan = 2))
+
+            val topState = underTest.topDragState
+            assertThat(topState.currentValue).isEqualTo(0)
+            assertThat(topState.anchors.toList()).containsExactly(0 to 0f)
+
+            val bottomState = underTest.bottomDragState
+            assertThat(bottomState.currentValue).isEqualTo(0)
+            assertThat(bottomState.anchors.toList()).containsExactly(0 to 0f, -1 to -45f)
+        }
+
+    /**
+     * Verifies element in a middle row at minimum size can be expanded from either top or bottom.
+     */
+    @Test
+    fun testThreeSpanGrid_elementInMiddleRow_sizeOneSpan() =
+        testScope.runTest {
+            updateGridLayout(singleSpanGrid.copy(maxItemSpan = 3, currentRow = 1))
+
+            val topState = underTest.topDragState
+            assertThat(topState.currentValue).isEqualTo(0)
+            assertThat(topState.anchors.toList()).containsExactly(0 to 0f, -1 to -30f)
+
+            val bottomState = underTest.bottomDragState
+            assertThat(bottomState.currentValue).isEqualTo(0)
+            assertThat(bottomState.anchors.toList()).containsExactly(0 to 0f, 1 to 30f)
+        }
+
+    @Test
+    fun testThreeSpanGrid_elementInTopRow_sizeOneSpan() =
+        testScope.runTest {
+            updateGridLayout(singleSpanGrid.copy(maxItemSpan = 3))
+
+            val topState = underTest.topDragState
+            assertThat(topState.currentValue).isEqualTo(0)
+            assertThat(topState.anchors.toList()).containsExactly(0 to 0f)
+
+            val bottomState = underTest.bottomDragState
+            assertThat(bottomState.currentValue).isEqualTo(0)
+            assertThat(bottomState.anchors.toList()).containsExactly(0 to 0f, 1 to 30f, 2 to 60f)
+        }
+
+    @Test
+    fun testSixSpanGrid_minSpanThree_itemInThirdRow_sizeThreeSpans() =
+        testScope.runTest {
+            updateGridLayout(
+                singleSpanGrid.copy(
+                    maxItemSpan = 6,
+                    currentRow = 3,
+                    currentSpan = 3,
+                    minItemSpan = 3,
+                )
+            )
+
+            val topState = underTest.topDragState
+            assertThat(topState.currentValue).isEqualTo(0)
+            assertThat(topState.anchors.toList()).containsExactly(0 to 0f, -3 to -45f)
+
+            val bottomState = underTest.bottomDragState
+            assertThat(bottomState.currentValue).isEqualTo(0)
+            assertThat(bottomState.anchors.toList()).containsExactly(0 to 0f)
+        }
+
+    @Test
+    fun testTwoSpanGrid_elementMovesFromFirstRowToSecondRow() =
+        testScope.runTest {
+            updateGridLayout(singleSpanGrid.copy(maxItemSpan = 2))
+
+            val topState = underTest.topDragState
+            val bottomState = underTest.bottomDragState
+
+            assertThat(topState.anchors.toList()).containsExactly(0 to 0f)
+            assertThat(bottomState.anchors.toList()).containsExactly(0 to 0f, 1 to 45f)
+
+            updateGridLayout(singleSpanGrid.copy(maxItemSpan = 2, currentRow = 1))
+
+            assertThat(topState.anchors.toList()).containsExactly(0 to 0f, -1 to -45f)
+            assertThat(bottomState.anchors.toList()).containsExactly(0 to 0f)
+        }
+
+    @Test
+    fun testTwoSpanGrid_expandElementFromBottom() = runTestWithSnapshots {
+        val resizeInfo by collectLastValue(underTest.resizeInfo)
+        updateGridLayout(singleSpanGrid.copy(maxItemSpan = 2))
+
+        assertThat(resizeInfo).isNull()
+        underTest.bottomDragState.anchoredDrag { dragTo(45f) }
+        assertThat(resizeInfo).isEqualTo(ResizeInfo(1, DragHandle.BOTTOM))
+    }
+
+    @Test
+    fun testThreeSpanGrid_expandMiddleElementUpwards() = runTestWithSnapshots {
+        val resizeInfo by collectLastValue(underTest.resizeInfo)
+        updateGridLayout(singleSpanGrid.copy(maxItemSpan = 3, currentRow = 1))
+
+        assertThat(resizeInfo).isNull()
+        underTest.topDragState.anchoredDrag { dragTo(-30f) }
+        assertThat(resizeInfo).isEqualTo(ResizeInfo(1, DragHandle.TOP))
+    }
+
+    @Test
+    fun testThreeSpanGrid_expandTopElementDownBy2Spans() = runTestWithSnapshots {
+        val resizeInfo by collectLastValue(underTest.resizeInfo)
+        updateGridLayout(singleSpanGrid.copy(maxItemSpan = 3))
+
+        assertThat(resizeInfo).isNull()
+        underTest.bottomDragState.anchoredDrag { dragTo(60f) }
+        assertThat(resizeInfo).isEqualTo(ResizeInfo(2, DragHandle.BOTTOM))
+    }
+
+    @Test
+    fun testTwoSpanGrid_shrinkElementFromBottom() = runTestWithSnapshots {
+        val resizeInfo by collectLastValue(underTest.resizeInfo)
+        updateGridLayout(singleSpanGrid.copy(maxItemSpan = 2, currentSpan = 2))
+
+        assertThat(resizeInfo).isNull()
+        underTest.bottomDragState.anchoredDrag { dragTo(-45f) }
+        assertThat(resizeInfo).isEqualTo(ResizeInfo(-1, DragHandle.BOTTOM))
+    }
+
+    @Test
+    fun testRowInfoBecomesNull_revertsBackToDefault() =
+        testScope.runTest {
+            val gridLayout = singleSpanGrid.copy(maxItemSpan = 3, currentRow = 1)
+            updateGridLayout(gridLayout)
+
+            val topState = underTest.topDragState
+            assertThat(topState.anchors.toList()).containsExactly(0 to 0f, -1 to -30f)
+
+            val bottomState = underTest.bottomDragState
+            assertThat(bottomState.anchors.toList()).containsExactly(0 to 0f, 1 to 30f)
+
+            updateGridLayout(gridLayout.copy(currentRow = null))
+            assertThat(topState.anchors.toList()).containsExactly(0 to 0f)
+            assertThat(bottomState.anchors.toList()).containsExactly(0 to 0f)
+        }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun testIllegalState_maxSpanSmallerThanMinSpan() =
+        testScope.runTest {
+            updateGridLayout(singleSpanGrid.copy(maxItemSpan = 2, minItemSpan = 3))
+        }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun testIllegalState_minSpanOfZero() =
+        testScope.runTest {
+            updateGridLayout(singleSpanGrid.copy(maxItemSpan = 2, minItemSpan = 0))
+        }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun testIllegalState_maxSpanOfZero() =
+        testScope.runTest {
+            updateGridLayout(singleSpanGrid.copy(maxItemSpan = 0, minItemSpan = 0))
+        }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun testIllegalState_currentRowNotMultipleOfMinSpan() =
+        testScope.runTest {
+            updateGridLayout(singleSpanGrid.copy(maxItemSpan = 6, minItemSpan = 3, currentSpan = 2))
+        }
+
+    private fun TestScope.updateGridLayout(gridLayout: GridLayout) {
+        underTest.setGridLayoutInfo(
+            gridLayout.verticalItemSpacingPx,
+            gridLayout.verticalContentPaddingPx,
+            gridLayout.viewportHeightPx,
+            gridLayout.maxItemSpan,
+            gridLayout.minItemSpan,
+            gridLayout.currentRow,
+            gridLayout.currentSpan,
+        )
+        runCurrent()
+    }
+
+    private fun DraggableAnchors<Int>.toList() = buildList {
+        for (index in 0 until this@toList.size) {
+            add(anchorAt(index) to positionAt(index))
+        }
+    }
+
+    private fun runTestWithSnapshots(testBody: suspend TestScope.() -> Unit) {
+        val globalWriteObserverHandle =
+            Snapshot.registerGlobalWriteObserver {
+                // This is normally done by the compose runtime.
+                Snapshot.sendApplyNotifications()
+            }
+
+        try {
+            testScope.runTest(testBody = testBody)
+        } finally {
+            globalWriteObserverHandle.dispose()
+        }
+    }
+
+    private data class GridLayout(
+        val verticalItemSpacingPx: Float,
+        val verticalContentPaddingPx: Float,
+        val viewportHeightPx: Int,
+        val maxItemSpan: Int,
+        val minItemSpan: Int,
+        val currentRow: Int?,
+        val currentSpan: Int?,
+    )
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/controls/start/ControlsStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/controls/start/ControlsStartableTest.kt
new file mode 100644
index 0000000..0d8312e
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/controls/start/ControlsStartableTest.kt
@@ -0,0 +1,498 @@
+/*
+ * Copyright (C) 2023 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.systemui.controls.start
+
+import android.content.BroadcastReceiver
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.content.pm.ApplicationInfo
+import android.content.pm.ServiceInfo
+import android.os.UserHandle
+import android.os.UserManager
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.broadcast.BroadcastDispatcher
+import com.android.systemui.common.data.repository.fakePackageChangeRepository
+import com.android.systemui.common.domain.interactor.packageChangeInteractor
+import com.android.systemui.common.shared.model.PackageChangeModel
+import com.android.systemui.controls.ControlsServiceInfo
+import com.android.systemui.controls.controller.ControlsController
+import com.android.systemui.controls.dagger.ControlsComponent
+import com.android.systemui.controls.management.ControlsListingController
+import com.android.systemui.controls.panels.AuthorizedPanelsRepository
+import com.android.systemui.controls.panels.SelectedComponentRepository
+import com.android.systemui.controls.panels.selectedComponentRepository
+import com.android.systemui.controls.ui.SelectedItem
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.testKosmos
+import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.argumentCaptor
+import com.android.systemui.util.mockito.capture
+import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.nullable
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.time.FakeSystemClock
+import com.google.common.truth.Truth.assertThat
+import java.util.Optional
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.anyInt
+import org.mockito.Mockito.doAnswer
+import org.mockito.Mockito.doReturn
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.Mockito.`when`
+import org.mockito.MockitoAnnotations
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class ControlsStartableTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+
+    @Mock private lateinit var controlsController: ControlsController
+    @Mock private lateinit var controlsListingController: ControlsListingController
+    @Mock private lateinit var userTracker: UserTracker
+    @Mock private lateinit var authorizedPanelsRepository: AuthorizedPanelsRepository
+    @Mock private lateinit var userManager: UserManager
+    @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher
+
+    private lateinit var preferredPanelsRepository: SelectedComponentRepository
+
+    private lateinit var fakeExecutor: FakeExecutor
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        whenever(authorizedPanelsRepository.getPreferredPackages()).thenReturn(setOf())
+        whenever(userManager.isUserUnlocked(anyInt())).thenReturn(true)
+        whenever(userTracker.userHandle).thenReturn(UserHandle.of(1))
+
+        fakeExecutor = FakeExecutor(FakeSystemClock())
+        preferredPanelsRepository = kosmos.selectedComponentRepository
+    }
+
+    @Test
+    fun testDisabledNothingIsCalled() {
+        createStartable(enabled = false).apply {
+            start()
+            onBootCompleted()
+        }
+
+        verifyNoMoreInteractions(controlsController, controlsListingController, userTracker)
+    }
+
+    @Test
+    fun testNothingCalledOnStart() {
+        createStartable(enabled = true).start()
+
+        fakeExecutor.advanceClockToLast()
+        fakeExecutor.runAllReady()
+
+        verifyNoMoreInteractions(controlsController, controlsListingController, userTracker)
+    }
+
+    @Test
+    fun testNoPreferredPackagesNoDefaultSelected_noNewSelection() {
+        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
+        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
+        setUpControlsListingControls(listings)
+
+        createStartable(enabled = true).onBootCompleted()
+        fakeExecutor.runAllReady()
+
+        verify(controlsController, never()).setPreferredSelection(any())
+    }
+
+    @Test
+    fun testPreferredPackagesNotInstalled_noNewSelection() {
+        whenever(authorizedPanelsRepository.getPreferredPackages())
+            .thenReturn(setOf(TEST_PACKAGE_PANEL))
+        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
+        setUpControlsListingControls(emptyList())
+
+        createStartable(enabled = true).onBootCompleted()
+        fakeExecutor.runAllReady()
+
+        verify(controlsController, never()).setPreferredSelection(any())
+    }
+
+    @Test
+    fun testPreferredPackageNotPanel_noNewSelection() {
+        whenever(authorizedPanelsRepository.getPreferredPackages())
+            .thenReturn(setOf(TEST_PACKAGE_PANEL))
+        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
+        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT, "not panel", hasPanel = false))
+        setUpControlsListingControls(listings)
+
+        createStartable(enabled = true).onBootCompleted()
+        fakeExecutor.runAllReady()
+
+        verify(controlsController, never()).setPreferredSelection(any())
+    }
+
+    @Test
+    fun testExistingSelection_noNewSelection() {
+        whenever(authorizedPanelsRepository.getPreferredPackages())
+            .thenReturn(setOf(TEST_PACKAGE_PANEL))
+        `when`(controlsController.getPreferredSelection())
+            .thenReturn(mock<SelectedItem.PanelItem>())
+        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
+        setUpControlsListingControls(listings)
+
+        createStartable(enabled = true).onBootCompleted()
+        fakeExecutor.runAllReady()
+
+        verify(controlsController, never()).setPreferredSelection(any())
+    }
+
+    @Test
+    fun testPanelAdded() {
+        whenever(authorizedPanelsRepository.getPreferredPackages())
+            .thenReturn(setOf(TEST_PACKAGE_PANEL))
+        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
+        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
+        setUpControlsListingControls(listings)
+
+        createStartable(enabled = true).onBootCompleted()
+        fakeExecutor.runAllReady()
+
+        verify(controlsController).setPreferredSelection(listings[0].toPanelItem())
+    }
+
+    @Test
+    fun testMultiplePreferredOnlyOnePanel_panelAdded() {
+        whenever(authorizedPanelsRepository.getPreferredPackages())
+            .thenReturn(setOf(TEST_PACKAGE_PANEL))
+        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
+        val listings =
+            listOf(
+                ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true),
+                ControlsServiceInfo(ComponentName("other_package", "cls"), "non panel", false)
+            )
+        setUpControlsListingControls(listings)
+
+        createStartable(enabled = true).onBootCompleted()
+        fakeExecutor.runAllReady()
+
+        verify(controlsController).setPreferredSelection(listings[0].toPanelItem())
+    }
+
+    @Test
+    fun testMultiplePreferredMultiplePanels_firstPreferredAdded() {
+        whenever(authorizedPanelsRepository.getPreferredPackages())
+            .thenReturn(setOf(TEST_PACKAGE_PANEL))
+        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
+        val listings =
+            listOf(
+                ControlsServiceInfo(ComponentName("other_package", "cls"), "panel", true),
+                ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)
+            )
+        setUpControlsListingControls(listings)
+
+        createStartable(enabled = true).onBootCompleted()
+        fakeExecutor.runAllReady()
+
+        verify(controlsController).setPreferredSelection(listings[1].toPanelItem())
+    }
+
+    @Test
+    fun testPreferredSelectionIsPanel_bindOnBoot() {
+        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
+        setUpControlsListingControls(listings)
+        `when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem())
+
+        createStartable(enabled = true).onBootCompleted()
+        fakeExecutor.runAllReady()
+
+        verify(controlsController).bindComponentForPanel(TEST_COMPONENT_PANEL)
+    }
+
+    @Test
+    fun testPreferredSelectionIsPanel_userNotUnlocked_notBind() {
+        whenever(userManager.isUserUnlocked(anyInt())).thenReturn(false)
+
+        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
+        setUpControlsListingControls(listings)
+        `when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem())
+
+        createStartable(enabled = true).onBootCompleted()
+        fakeExecutor.runAllReady()
+
+        verify(controlsController, never()).bindComponentForPanel(TEST_COMPONENT_PANEL)
+    }
+
+    @Test
+    fun testPreferredSelectionIsPanel_userNotUnlocked_broadcastRegistered_broadcastSentBinds() {
+        whenever(userManager.isUserUnlocked(anyInt())).thenReturn(false)
+
+        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
+        setUpControlsListingControls(listings)
+        `when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem())
+
+        createStartable(enabled = true).onBootCompleted()
+        fakeExecutor.runAllReady()
+
+        val intentFilterCaptor = argumentCaptor<IntentFilter>()
+        val receiverCaptor = argumentCaptor<BroadcastReceiver>()
+
+        verify(broadcastDispatcher)
+            .registerReceiver(
+                capture(receiverCaptor),
+                capture(intentFilterCaptor),
+                eq(fakeExecutor),
+                nullable(),
+                anyInt(),
+                nullable()
+            )
+        assertThat(intentFilterCaptor.value.matchAction(Intent.ACTION_USER_UNLOCKED)).isTrue()
+
+        // User is unlocked
+        whenever(userManager.isUserUnlocked(anyInt())).thenReturn(true)
+        receiverCaptor.value.onReceive(mock(), Intent(Intent.ACTION_USER_UNLOCKED))
+
+        verify(controlsController).bindComponentForPanel(TEST_COMPONENT_PANEL)
+    }
+
+    @Test
+    fun testPreferredSelectionPanel_listingNoPanel_notBind() {
+        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = false))
+        setUpControlsListingControls(listings)
+        `when`(controlsController.getPreferredSelection())
+            .thenReturn(SelectedItem.PanelItem("panel", TEST_COMPONENT_PANEL))
+
+        createStartable(enabled = true).onBootCompleted()
+        fakeExecutor.runAllReady()
+
+        verify(controlsController, never()).bindComponentForPanel(any())
+    }
+
+    @Test
+    fun testNotPanelSelection_noBind() {
+        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = false))
+        setUpControlsListingControls(listings)
+        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
+
+        createStartable(enabled = true).onBootCompleted()
+        fakeExecutor.runAllReady()
+
+        verify(controlsController, never()).bindComponentForPanel(any())
+    }
+
+    @Test
+    fun testAlreadyAddedPanel_noNewSelection() {
+        preferredPanelsRepository.setShouldAddDefaultComponent(false)
+        whenever(authorizedPanelsRepository.getPreferredPackages())
+            .thenReturn(setOf(TEST_PACKAGE_PANEL))
+        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
+        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
+        `when`(controlsListingController.getCurrentServices()).thenReturn(listings)
+
+        createStartable(enabled = true).onBootCompleted()
+
+        verify(controlsController, never()).setPreferredSelection(any())
+    }
+
+    @Test
+    fun testSelectedComponentIsUninstalled() =
+        with(kosmos) {
+            testScope.runTest {
+                val selectedComponent =
+                    SelectedComponentRepository.SelectedComponent(
+                        "panel",
+                        TEST_COMPONENT_PANEL,
+                        isPanel = true
+                    )
+                preferredPanelsRepository.setSelectedComponent(selectedComponent)
+                val activeUser = UserHandle.of(100)
+                whenever(userTracker.userHandle).thenReturn(activeUser)
+
+                createStartable(enabled = true).onBootCompleted()
+                fakeExecutor.runAllReady()
+                runCurrent()
+
+                assertThat(preferredPanelsRepository.getSelectedComponent())
+                    .isEqualTo(selectedComponent)
+                fakePackageChangeRepository.notifyChange(
+                    PackageChangeModel.Uninstalled(
+                        packageName = TEST_PACKAGE_PANEL,
+                        packageUid = UserHandle.getUid(100, 1)
+                    )
+                )
+                runCurrent()
+
+                assertThat(preferredPanelsRepository.getSelectedComponent()).isNull()
+            }
+        }
+
+    @Test
+    fun testSelectedComponentIsChanged() =
+        with(kosmos) {
+            testScope.runTest {
+                val selectedComponent =
+                    SelectedComponentRepository.SelectedComponent(
+                        "panel",
+                        TEST_COMPONENT_PANEL,
+                        isPanel = true
+                    )
+                preferredPanelsRepository.setSelectedComponent(selectedComponent)
+                val activeUser = UserHandle.of(100)
+                whenever(userTracker.userHandle).thenReturn(activeUser)
+
+                createStartable(enabled = true).onBootCompleted()
+                fakeExecutor.runAllReady()
+                runCurrent()
+
+                fakePackageChangeRepository.notifyChange(
+                    PackageChangeModel.Changed(
+                        packageName = TEST_PACKAGE_PANEL,
+                        packageUid = UserHandle.getUid(100, 1)
+                    )
+                )
+                runCurrent()
+
+                assertThat(preferredPanelsRepository.getSelectedComponent())
+                    .isEqualTo(selectedComponent)
+            }
+        }
+
+    @Test
+    fun testOtherPackageIsUninstalled() =
+        with(kosmos) {
+            testScope.runTest {
+                val selectedComponent =
+                    SelectedComponentRepository.SelectedComponent(
+                        "panel",
+                        TEST_COMPONENT_PANEL,
+                        isPanel = true
+                    )
+                preferredPanelsRepository.setSelectedComponent(selectedComponent)
+                val activeUser = UserHandle.of(100)
+                whenever(userTracker.userHandle).thenReturn(activeUser)
+
+                createStartable(enabled = true).onBootCompleted()
+                fakeExecutor.runAllReady()
+                runCurrent()
+
+                fakePackageChangeRepository.notifyChange(
+                    PackageChangeModel.Uninstalled(
+                        packageName = TEST_PACKAGE,
+                        packageUid = UserHandle.getUid(100, 1)
+                    )
+                )
+                runCurrent()
+
+                assertThat(preferredPanelsRepository.getSelectedComponent())
+                    .isEqualTo(selectedComponent)
+            }
+        }
+
+    private fun setUpControlsListingControls(listings: List<ControlsServiceInfo>) {
+        doAnswer { doReturn(listings).`when`(controlsListingController).getCurrentServices() }
+            .`when`(controlsListingController)
+            .forceReload()
+    }
+
+    private fun createStartable(enabled: Boolean): ControlsStartable {
+        val component: ControlsComponent =
+            mock() {
+                `when`(isEnabled()).thenReturn(enabled)
+                if (enabled) {
+                    `when`(getControlsController()).thenReturn(Optional.of(controlsController))
+                    `when`(getControlsListingController())
+                        .thenReturn(Optional.of(controlsListingController))
+                } else {
+                    `when`(getControlsController()).thenReturn(Optional.empty())
+                    `when`(getControlsListingController()).thenReturn(Optional.empty())
+                }
+            }
+        return ControlsStartable(
+            kosmos.applicationCoroutineScope,
+            kosmos.testDispatcher,
+            fakeExecutor,
+            component,
+            userTracker,
+            authorizedPanelsRepository,
+            preferredPanelsRepository,
+            kosmos.packageChangeInteractor,
+            userManager,
+            broadcastDispatcher,
+        )
+    }
+
+    private fun ControlsServiceInfo(
+        componentName: ComponentName,
+        label: CharSequence,
+        hasPanel: Boolean
+    ): ControlsServiceInfo {
+        val serviceInfo =
+            ServiceInfo().apply {
+                applicationInfo = ApplicationInfo()
+                packageName = componentName.packageName
+                name = componentName.className
+            }
+        return FakeControlsServiceInfo(context, serviceInfo, label, hasPanel)
+    }
+
+    private class FakeControlsServiceInfo(
+        context: Context,
+        serviceInfo: ServiceInfo,
+        private val label: CharSequence,
+        hasPanel: Boolean
+    ) : ControlsServiceInfo(context, serviceInfo) {
+
+        init {
+            if (hasPanel) {
+                panelActivity = serviceInfo.componentName
+            }
+        }
+
+        override fun loadLabel(): CharSequence {
+            return label
+        }
+    }
+
+    companion object {
+        private fun ControlsServiceInfo.toPanelItem(): SelectedItem.PanelItem {
+            if (panelActivity == null) {
+                throw IllegalArgumentException("$this is not a panel")
+            }
+            return SelectedItem.PanelItem(loadLabel(), componentName)
+        }
+
+        private const val TEST_PACKAGE = "pkg"
+        private val TEST_COMPONENT = ComponentName(TEST_PACKAGE, "service")
+        private const val TEST_PACKAGE_PANEL = "pkg.panel"
+        private val TEST_COMPONENT_PANEL = ComponentName(TEST_PACKAGE_PANEL, "service")
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorTest.kt
new file mode 100644
index 0000000..a0c56b4
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorTest.kt
@@ -0,0 +1,657 @@
+/*
+ * Copyright (C) 2024 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.systemui.deviceentry.domain.interactor
+
+import android.content.pm.UserInfo
+import android.hardware.biometrics.BiometricFaceConstants
+import android.hardware.biometrics.BiometricSourceType
+import android.os.PowerManager
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.compose.animation.scene.ObservableTransitionState
+import com.android.keyguard.keyguardUpdateMonitor
+import com.android.keyguard.trustManager
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.biometrics.data.repository.CameraInfo
+import com.android.systemui.biometrics.data.repository.FaceSensorInfo
+import com.android.systemui.biometrics.data.repository.facePropertyRepository
+import com.android.systemui.biometrics.shared.model.LockoutMode
+import com.android.systemui.biometrics.shared.model.SensorStrength
+import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
+import com.android.systemui.bouncer.domain.interactor.alternateBouncerInteractor
+import com.android.systemui.bouncer.domain.interactor.primaryBouncerInteractor
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.deviceentry.data.repository.fakeFaceWakeUpTriggersConfig
+import com.android.systemui.deviceentry.shared.FaceAuthUiEvent
+import com.android.systemui.deviceentry.shared.model.ErrorFaceAuthenticationStatus
+import com.android.systemui.flags.EnableSceneContainer
+import com.android.systemui.keyguard.data.repository.fakeBiometricSettingsRepository
+import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFaceAuthRepository
+import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.keyguard.shared.model.TransitionState
+import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.log.FaceAuthenticationLogger
+import com.android.systemui.log.logcatLogBuffer
+import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
+import com.android.systemui.power.domain.interactor.powerInteractor
+import com.android.systemui.power.shared.model.WakeSleepReason
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.testKosmos
+import com.android.systemui.user.data.model.SelectionStatus
+import com.android.systemui.user.data.repository.fakeUserRepository
+import com.android.systemui.util.mockito.eq
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
+    private val kosmos = testKosmos()
+    private val testScope: TestScope = kosmos.testScope
+
+    private lateinit var underTest: SystemUIDeviceEntryFaceAuthInteractor
+    private val bouncerRepository = kosmos.fakeKeyguardBouncerRepository
+    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+    private val keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor
+    private val faceAuthRepository = kosmos.fakeDeviceEntryFaceAuthRepository
+    private val fakeUserRepository = kosmos.fakeUserRepository
+    private val facePropertyRepository = kosmos.facePropertyRepository
+    private val fakeDeviceEntryFingerprintAuthInteractor =
+        kosmos.deviceEntryFingerprintAuthInteractor
+    private val powerInteractor = kosmos.powerInteractor
+    private val fakeBiometricSettingsRepository = kosmos.fakeBiometricSettingsRepository
+
+    private val keyguardUpdateMonitor = kosmos.keyguardUpdateMonitor
+    private val faceWakeUpTriggersConfig = kosmos.fakeFaceWakeUpTriggersConfig
+    private val trustManager = kosmos.trustManager
+    private val deviceEntryFaceAuthStatusInteractor = kosmos.deviceEntryFaceAuthStatusInteractor
+
+    @Before
+    fun setup() {
+        fakeUserRepository.setUserInfos(listOf(primaryUser, secondaryUser))
+        underTest =
+            SystemUIDeviceEntryFaceAuthInteractor(
+                mContext,
+                testScope.backgroundScope,
+                kosmos.testDispatcher,
+                faceAuthRepository,
+                { kosmos.primaryBouncerInteractor },
+                kosmos.alternateBouncerInteractor,
+                keyguardTransitionInteractor,
+                FaceAuthenticationLogger(logcatLogBuffer("faceAuthBuffer")),
+                keyguardUpdateMonitor,
+                fakeDeviceEntryFingerprintAuthInteractor,
+                fakeUserRepository,
+                facePropertyRepository,
+                faceWakeUpTriggersConfig,
+                powerInteractor,
+                fakeBiometricSettingsRepository,
+                trustManager,
+                { kosmos.sceneInteractor },
+                deviceEntryFaceAuthStatusInteractor,
+            )
+    }
+
+    @Test
+    fun faceAuthIsRequestedWhenLockscreenBecomesVisibleFromOffState() =
+        testScope.runTest {
+            underTest.start()
+            runCurrent()
+
+            powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_LID)
+            faceWakeUpTriggersConfig.setTriggerFaceAuthOnWakeUpFrom(
+                setOf(WakeSleepReason.LID.powerManagerWakeReason)
+            )
+
+            keyguardTransitionRepository.sendTransitionStep(
+                TransitionStep(
+                    KeyguardState.OFF,
+                    KeyguardState.LOCKSCREEN,
+                    transitionState = TransitionState.STARTED,
+                )
+            )
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(
+                    Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED, true)
+                )
+        }
+
+    @Test
+    fun whenFaceIsLockedOutAnyAttemptsToTriggerFaceAuthMustProvideLockoutError() =
+        testScope.runTest {
+            underTest.start()
+            val authenticationStatus = collectLastValue(underTest.authenticationStatus)
+            faceAuthRepository.setLockedOut(true)
+
+            underTest.onDeviceLifted()
+
+            val outputValue = authenticationStatus()!! as ErrorFaceAuthenticationStatus
+            assertThat(outputValue.msgId)
+                .isEqualTo(BiometricFaceConstants.FACE_ERROR_LOCKOUT_PERMANENT)
+            assertThat(outputValue.msg).isEqualTo("Face Unlock unavailable")
+            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
+        }
+
+    @Test
+    fun faceAuthIsRequestedWhenLockscreenBecomesVisibleFromAodState() =
+        testScope.runTest {
+            underTest.start()
+            runCurrent()
+
+            powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_LID)
+            faceWakeUpTriggersConfig.setTriggerFaceAuthOnWakeUpFrom(
+                setOf(WakeSleepReason.LID.powerManagerWakeReason)
+            )
+
+            keyguardTransitionRepository.sendTransitionStep(
+                TransitionStep(
+                    KeyguardState.AOD,
+                    KeyguardState.LOCKSCREEN,
+                    transitionState = TransitionState.STARTED,
+                )
+            )
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(
+                    Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED, true)
+                )
+        }
+
+    @Test
+    fun faceAuthIsNotRequestedWhenLockscreenBecomesVisibleDueToIgnoredWakeReasons() =
+        testScope.runTest {
+            underTest.start()
+
+            powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_LIFT)
+            faceWakeUpTriggersConfig.setTriggerFaceAuthOnWakeUpFrom(
+                setOf(WakeSleepReason.LID.powerManagerWakeReason)
+            )
+
+            keyguardTransitionRepository.sendTransitionStep(
+                TransitionStep(
+                    KeyguardState.DOZING,
+                    KeyguardState.LOCKSCREEN,
+                    transitionState = TransitionState.STARTED,
+                )
+            )
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
+        }
+
+    @Test
+    fun faceAuthIsRequestedWhenLockscreenBecomesVisibleFromDozingState() =
+        testScope.runTest {
+            underTest.start()
+            runCurrent()
+
+            powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_LID)
+            faceWakeUpTriggersConfig.setTriggerFaceAuthOnWakeUpFrom(
+                setOf(WakeSleepReason.LID.powerManagerWakeReason)
+            )
+
+            keyguardTransitionRepository.sendTransitionStep(
+                TransitionStep(
+                    KeyguardState.DOZING,
+                    KeyguardState.LOCKSCREEN,
+                    transitionState = TransitionState.STARTED,
+                )
+            )
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(
+                    Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED, true)
+                )
+        }
+
+    @Test
+    fun faceAuthLockedOutStateIsUpdatedAfterUserSwitch() =
+        testScope.runTest {
+            underTest.start()
+            runCurrent()
+            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
+
+            // User switching has started
+            fakeUserRepository.setSelectedUserInfo(primaryUser, SelectionStatus.SELECTION_COMPLETE)
+            fakeUserRepository.setSelectedUserInfo(
+                primaryUser,
+                SelectionStatus.SELECTION_IN_PROGRESS,
+            )
+            runCurrent()
+
+            bouncerRepository.setPrimaryShow(true)
+            // New user is not locked out.
+            facePropertyRepository.setLockoutMode(secondaryUser.id, LockoutMode.NONE)
+            fakeUserRepository.setSelectedUserInfo(
+                secondaryUser,
+                SelectionStatus.SELECTION_COMPLETE,
+            )
+            runCurrent()
+
+            assertThat(faceAuthRepository.isLockedOut.value).isFalse()
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value!!.first)
+                .isEqualTo(FaceAuthUiEvent.FACE_AUTH_UPDATED_USER_SWITCHING)
+            assertThat(faceAuthRepository.runningAuthRequest.value!!.second).isEqualTo(false)
+        }
+
+    @Test
+    fun faceAuthIsRequestedWhenPrimaryBouncerIsVisible() =
+        testScope.runTest {
+            underTest.start()
+
+            bouncerRepository.setPrimaryShow(false)
+            runCurrent()
+
+            bouncerRepository.setPrimaryShow(true)
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_PRIMARY_BOUNCER_SHOWN, false))
+        }
+
+    @Test
+    @EnableSceneContainer
+    fun withSceneContainerEnabled_faceAuthIsRequestedWhenPrimaryBouncerIsVisible() =
+        testScope.runTest {
+            underTest.start()
+
+            kosmos.sceneInteractor.changeScene(Scenes.Bouncer, "for-test")
+            kosmos.sceneInteractor.setTransitionState(
+                MutableStateFlow(ObservableTransitionState.Idle(Scenes.Bouncer))
+            )
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_PRIMARY_BOUNCER_SHOWN, false))
+        }
+
+    @Test
+    fun faceAuthIsRequestedWhenAlternateBouncerIsVisible() =
+        testScope.runTest {
+            underTest.start()
+
+            bouncerRepository.setAlternateVisible(false)
+            runCurrent()
+
+            bouncerRepository.setAlternateVisible(true)
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(
+                    Pair(
+                        FaceAuthUiEvent.FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN,
+                        false,
+                    )
+                )
+        }
+
+    @Test
+    fun faceAuthIsRequestedWhenUdfpsSensorTouched() =
+        testScope.runTest {
+            underTest.start()
+
+            underTest.onUdfpsSensorTouched()
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_UDFPS_POINTER_DOWN, false))
+        }
+
+    @Test
+    fun faceAuthIsRequestedWhenOnAssistantTriggeredOnLockScreen() =
+        testScope.runTest {
+            underTest.start()
+
+            underTest.onAssistantTriggeredOnLockScreen()
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(
+                    Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_ASSISTANT_VISIBILITY_CHANGED, true)
+                )
+        }
+
+    @Test
+    fun faceAuthIsRequestedWhenDeviceLifted() =
+        testScope.runTest {
+            underTest.start()
+
+            underTest.onDeviceLifted()
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(
+                    Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_PICK_UP_GESTURE_TRIGGERED, true)
+                )
+        }
+
+    @Test
+    fun faceAuthIsRequestedWhenShadeExpansionStarted() =
+        testScope.runTest {
+            underTest.start()
+
+            underTest.onShadeExpansionStarted()
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_QS_EXPANDED, false))
+        }
+
+    @Test
+    @EnableSceneContainer
+    fun faceAuthIsRequestedWhenShadeExpansionIsStarted() =
+        testScope.runTest {
+            underTest.start()
+            faceAuthRepository.canRunFaceAuth.value = true
+            kosmos.sceneInteractor.snapToScene(toScene = Scenes.Lockscreen, "for-test")
+            runCurrent()
+
+            kosmos.sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "for-test")
+            kosmos.sceneInteractor.setTransitionState(
+                MutableStateFlow(
+                    ObservableTransitionState.Transition(
+                        fromScene = Scenes.Lockscreen,
+                        toScene = Scenes.Shade,
+                        currentScene = flowOf(Scenes.Lockscreen),
+                        progress = MutableStateFlow(0.2f),
+                        isInitiatedByUserInput = true,
+                        isUserInputOngoing = flowOf(false),
+                    )
+                )
+            )
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_QS_EXPANDED, false))
+        }
+
+    @Test
+    @EnableSceneContainer
+    fun faceAuthIsRequestedOnlyOnceWhenShadeExpansionStarts() =
+        testScope.runTest {
+            underTest.start()
+            faceAuthRepository.canRunFaceAuth.value = true
+            kosmos.sceneInteractor.snapToScene(toScene = Scenes.Lockscreen, "for-test")
+            runCurrent()
+
+            kosmos.sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "for-test")
+            kosmos.sceneInteractor.setTransitionState(
+                MutableStateFlow(
+                    ObservableTransitionState.Transition(
+                        fromScene = Scenes.Lockscreen,
+                        toScene = Scenes.Shade,
+                        currentScene = flowOf(Scenes.Lockscreen),
+                        progress = MutableStateFlow(0.2f),
+                        isInitiatedByUserInput = true,
+                        isUserInputOngoing = flowOf(false),
+                    )
+                )
+            )
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_QS_EXPANDED, false))
+            faceAuthRepository.runningAuthRequest.value = null
+
+            // expansion progress shouldn't trigger face auth again
+            kosmos.sceneInteractor.setTransitionState(
+                MutableStateFlow(
+                    ObservableTransitionState.Transition(
+                        fromScene = Scenes.Lockscreen,
+                        toScene = Scenes.Shade,
+                        currentScene = flowOf(Scenes.Lockscreen),
+                        progress = MutableStateFlow(0.5f),
+                        isInitiatedByUserInput = true,
+                        isUserInputOngoing = flowOf(false),
+                    )
+                )
+            )
+
+            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
+        }
+
+    @Test
+    fun faceAuthIsRequestedWhenNotificationPanelClicked() =
+        testScope.runTest {
+            underTest.start()
+
+            underTest.onNotificationPanelClicked()
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(
+                    Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_NOTIFICATION_PANEL_CLICKED, true)
+                )
+        }
+
+    @Test
+    fun faceAuthIsCancelledWhenUserInputOnPrimaryBouncer() =
+        testScope.runTest {
+            underTest.start()
+
+            underTest.onSwipeUpOnBouncer()
+
+            runCurrent()
+            assertThat(faceAuthRepository.isAuthRunning.value).isTrue()
+
+            underTest.onPrimaryBouncerUserInput()
+
+            runCurrent()
+
+            assertThat(faceAuthRepository.isAuthRunning.value).isFalse()
+        }
+
+    @Test
+    fun faceAuthIsRequestedWhenSwipeUpOnBouncer() =
+        testScope.runTest {
+            underTest.start()
+
+            underTest.onSwipeUpOnBouncer()
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER, false))
+        }
+
+    @Test
+    fun faceAuthIsRequestedWhenWalletIsLaunchedAndIfFaceAuthIsStrong() =
+        testScope.runTest {
+            underTest.start()
+            facePropertyRepository.setSensorInfo(FaceSensorInfo(1, SensorStrength.STRONG))
+
+            underTest.onWalletLaunched()
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_OCCLUDING_APP_REQUESTED, true))
+        }
+
+    @Test
+    fun faceAuthIsNotTriggeredIfFaceAuthIsWeak() =
+        testScope.runTest {
+            underTest.start()
+            facePropertyRepository.setSensorInfo(FaceSensorInfo(1, SensorStrength.WEAK))
+
+            underTest.onWalletLaunched()
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
+        }
+
+    @Test
+    fun faceAuthIsNotTriggeredIfFaceAuthIsConvenience() =
+        testScope.runTest {
+            underTest.start()
+            facePropertyRepository.setSensorInfo(FaceSensorInfo(1, SensorStrength.CONVENIENCE))
+
+            underTest.onWalletLaunched()
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
+        }
+
+    @Test
+    fun faceUnlockIsDisabledWhenFpIsLockedOut() =
+        testScope.runTest {
+            underTest.start()
+            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
+
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
+            runCurrent()
+
+            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
+        }
+
+    @Test
+    fun faceLockoutStateIsResetWheneverFingerprintIsNotLockedOut() =
+        testScope.runTest {
+            underTest.start()
+            fakeUserRepository.setSelectedUserInfo(primaryUser, SelectionStatus.SELECTION_COMPLETE)
+            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
+
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
+            runCurrent()
+
+            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
+            facePropertyRepository.setLockoutMode(primaryUserId, LockoutMode.NONE)
+
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
+            runCurrent()
+
+            assertThat(faceAuthRepository.isLockedOut.value).isFalse()
+        }
+
+    @Test
+    fun faceLockoutStateIsSetToUsersLockoutStateWheneverFingerprintIsNotLockedOut() =
+        testScope.runTest {
+            underTest.start()
+            fakeUserRepository.setSelectedUserInfo(primaryUser, SelectionStatus.SELECTION_COMPLETE)
+            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
+
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
+            runCurrent()
+
+            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
+            facePropertyRepository.setLockoutMode(primaryUserId, LockoutMode.TIMED)
+
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
+            runCurrent()
+
+            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
+        }
+
+    @Test
+    fun whenIsAuthenticatedFalse_clearFaceBiometrics() =
+        testScope.runTest {
+            underTest.start()
+
+            faceAuthRepository.isAuthenticated.value = true
+            runCurrent()
+            verify(trustManager, never())
+                .clearAllBiometricRecognized(eq(BiometricSourceType.FACE), anyInt())
+
+            faceAuthRepository.isAuthenticated.value = false
+            runCurrent()
+
+            verify(trustManager).clearAllBiometricRecognized(eq(BiometricSourceType.FACE), anyInt())
+        }
+
+    @Test
+    fun faceAuthIsRequestedWhenAuthIsRunningWhileCameraInfoChanged() =
+        testScope.runTest {
+            facePropertyRepository.setCameraIno(null)
+            underTest.start()
+
+            faceAuthRepository.requestAuthenticate(
+                FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED,
+                true,
+            )
+            facePropertyRepository.setCameraIno(CameraInfo("0", "1", null))
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value)
+                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_CAMERA_AVAILABLE_CHANGED, true))
+        }
+
+    @Test
+    fun faceAuthIsNotRequestedWhenNoAuthRunningWhileCameraInfoChanged() =
+        testScope.runTest {
+            facePropertyRepository.setCameraIno(null)
+            underTest.start()
+
+            facePropertyRepository.setCameraIno(CameraInfo("0", "1", null))
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
+        }
+
+    @Test
+    fun faceAuthIsNotRequestedWhenAuthIsRunningWhileCameraInfoIsNull() =
+        testScope.runTest {
+            facePropertyRepository.setCameraIno(null)
+            underTest.start()
+
+            facePropertyRepository.setCameraIno(null)
+
+            runCurrent()
+            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
+        }
+
+    @Test
+    fun lockedOut_providesSameValueFromRepository() =
+        testScope.runTest {
+            assertThat(underTest.isLockedOut).isSameInstanceAs(faceAuthRepository.isLockedOut)
+        }
+
+    @Test
+    fun authenticated_providesSameValueFromRepository() =
+        testScope.runTest {
+            assertThat(underTest.isAuthenticated)
+                .isSameInstanceAs(faceAuthRepository.isAuthenticated)
+        }
+
+    companion object {
+        private const val primaryUserId = 1
+        private val primaryUser = UserInfo(primaryUserId, "test user", UserInfo.FLAG_PRIMARY)
+
+        private val secondaryUser = UserInfo(2, "secondary user", 0)
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/CommunalTouchHandlerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/dreams/touch/CommunalTouchHandlerTest.java
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch
diff --git a/packages/SystemUI/tests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadStatsInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadStatsInteractorTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadStatsInteractorTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadStatsInteractorTest.kt
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/ui/view/ContextualEduUiCoordinatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/ui/view/ContextualEduUiCoordinatorTest.kt
index ab33269..dd83702 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/ui/view/ContextualEduUiCoordinatorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/ui/view/ContextualEduUiCoordinatorTest.kt
@@ -16,10 +16,10 @@
 
 package com.android.systemui.education.domain.ui.view
 
+import android.app.Dialog
 import android.app.Notification
 import android.app.NotificationManager
 import android.content.applicationContext
-import android.widget.Toast
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
@@ -34,11 +34,13 @@
 import com.android.systemui.kosmos.applicationCoroutineScope
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.res.R
+import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
 import kotlin.time.Duration.Companion.seconds
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.advanceTimeBy
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
 import org.junit.Before
@@ -51,6 +53,7 @@
 import org.mockito.junit.MockitoJUnit
 import org.mockito.kotlin.any
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
@@ -63,10 +66,12 @@
     private val minDurationForNextEdu =
         KeyboardTouchpadEduInteractor.minIntervalBetweenEdu + 1.seconds
     private lateinit var underTest: ContextualEduUiCoordinator
-    @Mock private lateinit var toast: Toast
+    @Mock private lateinit var dialog: Dialog
     @Mock private lateinit var notificationManager: NotificationManager
+    @Mock private lateinit var accessibilityManagerWrapper: AccessibilityManagerWrapper
     @get:Rule val mockitoRule = MockitoJUnit.rule()
     private var toastContent = ""
+    private val timeoutMillis = 5000L
 
     @Before
     fun setUp() {
@@ -75,30 +80,35 @@
             interactor.updateTouchpadFirstConnectionTime()
         }
 
+        whenever(accessibilityManagerWrapper.getRecommendedTimeoutMillis(any(), any()))
+            .thenReturn(timeoutMillis.toInt())
+
         val viewModel =
             ContextualEduViewModel(
                 kosmos.applicationContext.resources,
-                kosmos.keyboardTouchpadEduInteractor
+                kosmos.keyboardTouchpadEduInteractor,
+                accessibilityManagerWrapper,
             )
+
         underTest =
             ContextualEduUiCoordinator(
                 kosmos.applicationCoroutineScope,
                 viewModel,
                 kosmos.applicationContext,
                 notificationManager
-            ) { content ->
-                toastContent = content
-                toast
+            ) { model ->
+                toastContent = model.message
+                dialog
             }
         underTest.start()
         kosmos.keyboardTouchpadEduInteractor.start()
     }
 
     @Test
-    fun showToastOnNewEdu() =
+    fun showDialogOnNewEdu() =
         testScope.runTest {
             triggerEducation(BACK)
-            verify(toast).show()
+            verify(dialog).show()
         }
 
     @Test
@@ -111,6 +121,14 @@
         }
 
     @Test
+    fun dismissDialogAfterTimeout() =
+        testScope.runTest {
+            triggerEducation(BACK)
+            advanceTimeBy(timeoutMillis + 1)
+            verify(dialog).dismiss()
+        }
+
+    @Test
     fun verifyBackEduToastContent() =
         testScope.runTest {
             triggerEducation(BACK)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProviderTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProviderTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProviderTest.kt
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt
new file mode 100644
index 0000000..2e9d993
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt
@@ -0,0 +1,728 @@
+/*
+ * Copyright (C) 2023 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.systemui.haptics.slider
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.UnconfinedTestDispatcher
+import kotlinx.coroutines.test.advanceTimeBy
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.anyFloat
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@OptIn(ExperimentalCoroutinesApi::class)
+@RunWith(AndroidJUnit4::class)
+class SliderStateTrackerTest : SysuiTestCase() {
+
+    @Mock private lateinit var sliderStateListener: SliderStateListener
+    private val sliderEventProducer = FakeSliderEventProducer()
+    private lateinit var mSliderStateTracker: SliderStateTracker
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+    }
+
+    @Test
+    fun initializeSliderTracker_startsTracking() = runTest {
+        // GIVEN Initialized tracker
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+        // THEN the tracker job is active
+        assertThat(mSliderStateTracker.isTracking).isTrue()
+    }
+
+    @Test
+    fun stopTracking_onAnyState_resetsToIdle() = runTest {
+        enumValues<SliderState>().forEach {
+            // GIVEN Initialized tracker
+            initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+            // GIVEN a state in the state machine
+            mSliderStateTracker.setState(it)
+
+            // WHEN the tracker stops tracking the state and listening to events
+            mSliderStateTracker.stopTracking()
+
+            // THEN The state is idle and the tracker is not active
+            assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+            assertThat(mSliderStateTracker.isTracking).isFalse()
+        }
+    }
+
+    // Tests on the IDLE state
+    @Test
+    fun initializeSliderTracker_isIdle() = runTest {
+        // GIVEN Initialized tracker
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+        // THEN The state is idle and the listener is not called to play haptics
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun startsTrackingTouch_onIdle_entersWaitState() = runTest {
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+        // GIVEN a start of tracking touch event
+        val progress = 0f
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
+
+        // THEN the tracker moves to the wait state and the timer job begins
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT)
+        verifyNoMoreInteractions(sliderStateListener)
+        assertThat(mSliderStateTracker.isWaiting).isTrue()
+    }
+
+    // Tests on the WAIT state
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    fun waitCompletes_onWait_movesToHandleAcquired() = runTest {
+        val config = SeekableSliderTrackerConfig()
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+        // GIVEN a start of tracking touch event that moves the tracker to WAIT
+        val progress = 0f
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
+
+        // WHEN the wait time completes plus a small buffer time
+        advanceTimeBy(config.waitTimeMillis + 10L)
+
+        // THEN the tracker moves to the DRAG_HANDLE_ACQUIRED_BY_TOUCH state
+        assertThat(mSliderStateTracker.currentState)
+            .isEqualTo(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
+        assertThat(mSliderStateTracker.isWaiting).isFalse()
+        verify(sliderStateListener).onHandleAcquiredByTouch()
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun impreciseTouch_onWait_movesToHandleAcquired() = runTest {
+        val config = SeekableSliderTrackerConfig()
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+        // GIVEN a start of tracking touch event that moves the tracker to WAIT at the middle of the
+        // slider
+        var progress = 0.5f
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
+
+        // GIVEN a progress event due to an imprecise touch with a progress below threshold
+        progress += (config.jumpThreshold - 0.01f)
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
+        )
+
+        // THEN the tracker moves to the DRAG_HANDLE_ACQUIRED_BY_TOUCH state without the timer job
+        // being complete
+        assertThat(mSliderStateTracker.currentState)
+            .isEqualTo(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
+        assertThat(mSliderStateTracker.isWaiting).isFalse()
+        verify(sliderStateListener).onHandleAcquiredByTouch()
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun trackJump_onWait_movesToJumpTrackLocationSelected() = runTest {
+        val config = SeekableSliderTrackerConfig()
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+        // GIVEN a start of tracking touch event that moves the tracker to WAIT at the middle of the
+        // slider
+        var progress = 0.5f
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
+
+        // GIVEN a progress event due to a touch on the slider track beyond threshold
+        progress += (config.jumpThreshold + 0.01f)
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
+        )
+
+        // THEN the tracker moves to the jump-track location selected state
+        assertThat(mSliderStateTracker.currentState)
+            .isEqualTo(SliderState.JUMP_TRACK_LOCATION_SELECTED)
+        assertThat(mSliderStateTracker.isWaiting).isFalse()
+        verify(sliderStateListener).onProgressJump(anyFloat())
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun upperBookendSelection_onWait_movesToBookendSelected() = runTest {
+        val config = SeekableSliderTrackerConfig()
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+        // GIVEN a start of tracking touch event that moves the tracker to WAIT at the middle of the
+        // slider
+        var progress = 0.5f
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
+
+        // GIVEN a progress event due to a touch on the slider upper bookend zone.
+        progress = (config.upperBookendThreshold + 0.01f)
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
+        )
+
+        // THEN the tracker moves to the jump-track location selected state
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.JUMP_BOOKEND_SELECTED)
+        assertThat(mSliderStateTracker.isWaiting).isFalse()
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun lowerBookendSelection_onWait_movesToBookendSelected() = runTest {
+        val config = SeekableSliderTrackerConfig()
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+        // GIVEN a start of tracking touch event that moves the tracker to WAIT at the middle of the
+        // slider
+        var progress = 0.5f
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
+
+        // GIVEN a progress event due to a touch on the slider lower bookend zone
+        progress = (config.lowerBookendThreshold - 0.01f)
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
+        )
+
+        // THEN the tracker moves to the JUMP_TRACK_LOCATION_SELECTED state
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.JUMP_BOOKEND_SELECTED)
+        assertThat(mSliderStateTracker.isWaiting).isFalse()
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun stopTracking_onWait_whenWaitingJobIsActive_resetsToIdle() = runTest {
+        val config = SeekableSliderTrackerConfig()
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+        // GIVEN a start of tracking touch event that moves the tracker to WAIT at the middle of the
+        // slider
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, 0.5f))
+        assertThat(mSliderStateTracker.isWaiting).isTrue()
+
+        // GIVEN that the tracker stops tracking the state and listening to events
+        mSliderStateTracker.stopTracking()
+
+        // THEN the tracker moves to the IDLE state without the timer job being complete
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+        assertThat(mSliderStateTracker.isWaiting).isFalse()
+        assertThat(mSliderStateTracker.isTracking).isFalse()
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    // Tests on the JUMP_TRACK_LOCATION_SELECTED state
+
+    @Test
+    fun progressChangeByUser_onJumpTrackLocationSelected_movesToDragHandleDragging() = runTest {
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+        // GIVEN a JUMP_TRACK_LOCATION_SELECTED state
+        mSliderStateTracker.setState(SliderState.JUMP_TRACK_LOCATION_SELECTED)
+
+        // GIVEN a progress event due to dragging the handle
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, 0.5f))
+
+        // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
+        verify(sliderStateListener).onProgress(anyFloat())
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun touchRelease_onJumpTrackLocationSelected_movesToIdle() = runTest {
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+        // GIVEN a JUMP_TRACK_LOCATION_SELECTED state
+        mSliderStateTracker.setState(SliderState.JUMP_TRACK_LOCATION_SELECTED)
+
+        // GIVEN that the slider stopped tracking touch
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
+
+        // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
+        verify(sliderStateListener).onHandleReleasedFromTouch()
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun progressChangeByUser_onJumpBookendSelected_movesToDragHandleDragging() = runTest {
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+        // GIVEN a JUMP_BOOKEND_SELECTED state
+        mSliderStateTracker.setState(SliderState.JUMP_BOOKEND_SELECTED)
+
+        // GIVEN that the slider stopped tracking touch
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, 0.5f))
+
+        // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
+        verify(sliderStateListener).onProgress(anyFloat())
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun touchRelease_onJumpBookendSelected_movesToIdle() = runTest {
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+        // GIVEN a JUMP_BOOKEND_SELECTED state
+        mSliderStateTracker.setState(SliderState.JUMP_BOOKEND_SELECTED)
+
+        // GIVEN that the slider stopped tracking touch
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
+
+        // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
+        verify(sliderStateListener).onHandleReleasedFromTouch()
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    // Tests on the DRAG_HANDLE_ACQUIRED state
+
+    @Test
+    fun progressChangeByUser_onHandleAcquired_movesToDragHandleDragging() = runTest {
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+        // GIVEN a DRAG_HANDLE_ACQUIRED_BY_TOUCH state
+        mSliderStateTracker.setState(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
+
+        // GIVEN a progress change by the user
+        val progress = 0.5f
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
+        )
+
+        // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state
+        verify(sliderStateListener).onProgress(progress)
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun touchRelease_onHandleAcquired_movesToIdle() = runTest {
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+        // GIVEN a DRAG_HANDLE_ACQUIRED_BY_TOUCH state
+        mSliderStateTracker.setState(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
+
+        // GIVEN that the handle stops tracking touch
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
+
+        // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
+        verify(sliderStateListener).onHandleReleasedFromTouch()
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    // Tests on DRAG_HANDLE_DRAGGING
+
+    @Test
+    fun progressChangeByUser_onHandleDragging_progressOutsideOfBookends_doesNotChangeState() =
+        runTest {
+            initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+            // GIVEN a DRAG_HANDLE_DRAGGING state
+            mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
+
+            // GIVEN a progress change by the user outside of bookend bounds
+            val progress = 0.5f
+            sliderEventProducer.sendEvent(
+                SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
+            )
+
+            // THEN the tracker does not change state and executes the onProgress call
+            assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
+            verify(sliderStateListener).onProgress(progress)
+            verifyNoMoreInteractions(sliderStateListener)
+        }
+
+    @Test
+    fun progressChangeByUser_onHandleDragging_reachesLowerBookend_movesToHandleReachedBookend() =
+        runTest {
+            val config = SeekableSliderTrackerConfig()
+            initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+            // GIVEN a DRAG_HANDLE_DRAGGING state
+            mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
+
+            // GIVEN a progress change by the user reaching the lower bookend
+            val progress = config.lowerBookendThreshold - 0.01f
+            sliderEventProducer.sendEvent(
+                SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
+            )
+
+            // THEN the tracker moves to the DRAG_HANDLE_REACHED_BOOKEND state and executes the
+            // corresponding callback
+            assertThat(mSliderStateTracker.currentState)
+                .isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+            verify(sliderStateListener).onLowerBookend()
+            verifyNoMoreInteractions(sliderStateListener)
+        }
+
+    @Test
+    fun progressChangeByUser_onHandleDragging_reachesUpperBookend_movesToHandleReachedBookend() =
+        runTest {
+            val config = SeekableSliderTrackerConfig()
+            initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+            // GIVEN a DRAG_HANDLE_DRAGGING state
+            mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
+
+            // GIVEN a progress change by the user reaching the upper bookend
+            val progress = config.upperBookendThreshold + 0.01f
+            sliderEventProducer.sendEvent(
+                SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
+            )
+
+            // THEN the tracker moves to the DRAG_HANDLE_REACHED_BOOKEND state and executes the
+            // corresponding callback
+            assertThat(mSliderStateTracker.currentState)
+                .isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+            verify(sliderStateListener).onUpperBookend()
+            verifyNoMoreInteractions(sliderStateListener)
+        }
+
+    @Test
+    fun touchRelease_onHandleDragging_movesToIdle() = runTest {
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+        // GIVEN a DRAG_HANDLE_DRAGGING state
+        mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
+
+        // GIVEN that the slider stops tracking touch
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
+
+        // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
+        verify(sliderStateListener).onHandleReleasedFromTouch()
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    // Tests on the DRAG_HANDLE_REACHED_BOOKEND state
+
+    @Test
+    fun progressChangeByUser_outsideOfBookendRange_onLowerBookend_movesToDragHandleDragging() =
+        runTest {
+            val config = SeekableSliderTrackerConfig()
+            initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+            // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
+            mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+
+            // GIVEN a progress event that falls outside of the lower bookend range
+            val progress = config.lowerBookendThreshold + 0.01f
+            sliderEventProducer.sendEvent(
+                SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
+            )
+
+            // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state and executes accordingly
+            verify(sliderStateListener).onProgress(progress)
+            assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
+            verifyNoMoreInteractions(sliderStateListener)
+        }
+
+    @Test
+    fun progressChangeByUser_insideOfBookendRange_onLowerBookend_doesNotChangeState() = runTest {
+        val config = SeekableSliderTrackerConfig()
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+        // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
+        mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+
+        // GIVEN a progress event that falls inside of the lower bookend range
+        val progress = config.lowerBookendThreshold - 0.01f
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
+        )
+
+        // THEN the tracker stays in the current state and executes accordingly
+        verify(sliderStateListener).onLowerBookend()
+        assertThat(mSliderStateTracker.currentState)
+            .isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun progressChangeByUser_outsideOfBookendRange_onUpperBookend_movesToDragHandleDragging() =
+        runTest {
+            val config = SeekableSliderTrackerConfig()
+            initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+            // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
+            mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+
+            // GIVEN a progress event that falls outside of the upper bookend range
+            val progress = config.upperBookendThreshold - 0.01f
+            sliderEventProducer.sendEvent(
+                SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
+            )
+
+            // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state and executes accordingly
+            verify(sliderStateListener).onProgress(progress)
+            assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
+            verifyNoMoreInteractions(sliderStateListener)
+        }
+
+    @Test
+    fun progressChangeByUser_insideOfBookendRange_onUpperBookend_doesNotChangeState() = runTest {
+        val config = SeekableSliderTrackerConfig()
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+        // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
+        mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+
+        // GIVEN a progress event that falls inside of the upper bookend range
+        val progress = config.upperBookendThreshold + 0.01f
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
+        )
+
+        // THEN the tracker stays in the current state and executes accordingly
+        verify(sliderStateListener).onUpperBookend()
+        assertThat(mSliderStateTracker.currentState)
+            .isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun touchRelease_onHandleReachedBookend_movesToIdle() = runTest {
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+        // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
+        mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+
+        // GIVEN that the handle stops tracking touch
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
+
+        // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
+        verify(sliderStateListener).onHandleReleasedFromTouch()
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun onStartedTrackingProgram_atTheMiddle_onIdle_movesToArrowHandleMovedOnce() = runTest {
+        // GIVEN an initialized tracker in the IDLE state
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+
+        // GIVEN a progress due to an external source that lands at the middle of the slider
+        val progress = 0.5f
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress)
+        )
+
+        // THEN the state moves to ARROW_HANDLE_MOVED_ONCE and the listener is called to play
+        // haptics
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.ARROW_HANDLE_MOVED_ONCE)
+        verify(sliderStateListener).onSelectAndArrow(progress)
+    }
+
+    @Test
+    fun onStartedTrackingProgram_atUpperBookend_onIdle_movesToIdle() = runTest {
+        // GIVEN an initialized tracker in the IDLE state
+        val config = SeekableSliderTrackerConfig()
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+        // GIVEN a progress due to an external source that lands at the upper bookend
+        val progress = config.upperBookendThreshold + 0.01f
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress)
+        )
+
+        // THEN the tracker executes upper bookend haptics before moving back to IDLE
+        verify(sliderStateListener).onUpperBookend()
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+    }
+
+    @Test
+    fun onStartedTrackingProgram_atLowerBookend_onIdle_movesToIdle() = runTest {
+        // GIVEN an initialized tracker in the IDLE state
+        val config = SeekableSliderTrackerConfig()
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+
+        // WHEN a progress is recorded due to an external source that lands at the lower bookend
+        val progress = config.lowerBookendThreshold - 0.01f
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress)
+        )
+
+        // THEN the tracker executes lower bookend haptics before moving to IDLE
+        verify(sliderStateListener).onLowerBookend()
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+    }
+
+    @Test
+    fun onArrowUp_onArrowMovedOnce_movesToIdle() = runTest {
+        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVED_ONCE state
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE)
+
+        // WHEN the external stimulus is released
+        val progress = 0.5f
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.STOPPED_TRACKING_PROGRAM, progress)
+        )
+
+        // THEN the tracker moves back to IDLE and there are no haptics
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun onStartTrackingTouch_onArrowMovedOnce_movesToWait() = runTest {
+        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVED_ONCE state
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE)
+
+        // WHEN the slider starts tracking touch
+        val progress = 0.5f
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
+
+        // THEN the tracker moves back to WAIT and starts the waiting job. Also, there are no
+        // haptics
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT)
+        assertThat(mSliderStateTracker.isWaiting).isTrue()
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun onProgressChangeByProgram_onArrowMovedOnce_movesToArrowMovesContinuously() = runTest {
+        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVED_ONCE state
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE)
+
+        // WHEN the slider gets an external progress change
+        val progress = 0.5f
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress)
+        )
+
+        // THEN the tracker moves to ARROW_HANDLE_MOVES_CONTINUOUSLY and calls the appropriate
+        // haptics
+        assertThat(mSliderStateTracker.currentState)
+            .isEqualTo(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
+        verify(sliderStateListener).onProgress(progress)
+    }
+
+    @Test
+    fun onArrowUp_onArrowMovesContinuously_movesToIdle() = runTest {
+        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
+
+        // WHEN the external stimulus is released
+        val progress = 0.5f
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.STOPPED_TRACKING_PROGRAM, progress)
+        )
+
+        // THEN the tracker moves to IDLE and no haptics are played
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun onStartTrackingTouch_onArrowMovesContinuously_movesToWait() = runTest {
+        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
+
+        // WHEN the slider starts tracking touch
+        val progress = 0.5f
+        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
+
+        // THEN the tracker moves to WAIT and the wait job starts.
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT)
+        assertThat(mSliderStateTracker.isWaiting).isTrue()
+        verifyNoMoreInteractions(sliderStateListener)
+    }
+
+    @Test
+    fun onProgressChangeByProgram_onArrowMovesContinuously_preservesState() = runTest {
+        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
+        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
+
+        // WHEN the slider changes progress programmatically at the middle
+        val progress = 0.5f
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress)
+        )
+
+        // THEN the tracker stays in the same state and haptics are delivered appropriately
+        assertThat(mSliderStateTracker.currentState)
+            .isEqualTo(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
+        verify(sliderStateListener).onProgress(progress)
+    }
+
+    @Test
+    fun onProgramProgress_atLowerBookend_onArrowMovesContinuously_movesToIdle() = runTest {
+        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
+        val config = SeekableSliderTrackerConfig()
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
+
+        // WHEN the slider reaches the lower bookend programmatically
+        val progress = config.lowerBookendThreshold - 0.01f
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress)
+        )
+
+        // THEN the tracker executes lower bookend haptics before moving to IDLE
+        verify(sliderStateListener).onLowerBookend()
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+    }
+
+    @Test
+    fun onProgramProgress_atUpperBookend_onArrowMovesContinuously_movesToIdle() = runTest {
+        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
+        val config = SeekableSliderTrackerConfig()
+        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
+        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
+
+        // WHEN the slider reaches the lower bookend programmatically
+        val progress = config.upperBookendThreshold + 0.01f
+        sliderEventProducer.sendEvent(
+            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress)
+        )
+
+        // THEN the tracker executes upper bookend haptics before moving to IDLE
+        verify(sliderStateListener).onUpperBookend()
+        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+    }
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    private fun initTracker(
+        scope: CoroutineScope,
+        config: SeekableSliderTrackerConfig = SeekableSliderTrackerConfig(),
+    ) {
+        mSliderStateTracker =
+            SliderStateTracker(sliderStateListener, sliderEventProducer, scope, config)
+        mSliderStateTracker.startTracking()
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/data/repository/KeyboardRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/data/repository/KeyboardRepositoryTest.kt
index 8f9e238..8b13411 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/data/repository/KeyboardRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/data/repository/KeyboardRepositoryTest.kt
@@ -145,7 +145,7 @@
 
             fakeInputManager.addPhysicalKeyboard(
                 PHYSICAL_NOT_FULL_KEYBOARD_ID,
-                isFullKeyboard = false
+                isFullKeyboard = false,
             )
             assertThat(isKeyboardConnected).isFalse()
 
@@ -223,7 +223,7 @@
             backlightListenerCaptor.value.onBacklightChanged(
                 current = 1,
                 max = 5,
-                triggeredByKeyPress = false
+                triggeredByKeyPress = false,
             )
             assertThat(backlight).isNull()
         }
@@ -239,7 +239,7 @@
             backlightListenerCaptor.value.onBacklightChanged(
                 current = 1,
                 max = 5,
-                triggeredByKeyPress = true
+                triggeredByKeyPress = true,
             )
             assertThat(backlight).isNotNull()
         }
@@ -318,15 +318,75 @@
         }
     }
 
+    @Test
+    fun connectedKeyboards_emitsAllKeyboards() {
+        testScope.runTest {
+            val firstKeyboard = Keyboard(vendorId = 1, productId = 1)
+            val secondKeyboard = Keyboard(vendorId = 2, productId = 2)
+            captureDeviceListener()
+            val keyboards by collectLastValueImmediately(underTest.connectedKeyboards)
+
+            fakeInputManager.addPhysicalKeyboard(
+                PHYSICAL_FULL_KEYBOARD_ID,
+                vendorId = firstKeyboard.vendorId,
+                productId = firstKeyboard.productId,
+            )
+            assertThat(keyboards)
+                .containsExactly(Keyboard(firstKeyboard.vendorId, firstKeyboard.productId))
+
+            fakeInputManager.addPhysicalKeyboard(
+                ANOTHER_PHYSICAL_FULL_KEYBOARD_ID,
+                vendorId = secondKeyboard.vendorId,
+                productId = secondKeyboard.productId,
+            )
+            assertThat(keyboards)
+                .containsExactly(
+                    Keyboard(firstKeyboard.vendorId, firstKeyboard.productId),
+                    Keyboard(secondKeyboard.vendorId, secondKeyboard.productId),
+                )
+        }
+    }
+
+    @Test
+    fun connectedKeyboards_emitsOnlyFullPhysicalKeyboards() {
+        testScope.runTest {
+            captureDeviceListener()
+            val keyboards by collectLastValueImmediately(underTest.connectedKeyboards)
+
+            fakeInputManager.addPhysicalKeyboard(PHYSICAL_FULL_KEYBOARD_ID)
+            fakeInputManager.addDevice(VIRTUAL_FULL_KEYBOARD_ID, SOURCE_KEYBOARD)
+            fakeInputManager.addPhysicalKeyboard(
+                PHYSICAL_NOT_FULL_KEYBOARD_ID,
+                isFullKeyboard = false,
+            )
+
+            assertThat(keyboards).hasSize(1)
+        }
+    }
+
+    @Test
+    fun connectedKeyboards_emitsOnlyConnectedKeyboards() {
+        testScope.runTest {
+            captureDeviceListener()
+            val keyboards by collectLastValueImmediately(underTest.connectedKeyboards)
+
+            fakeInputManager.addPhysicalKeyboard(PHYSICAL_FULL_KEYBOARD_ID)
+            fakeInputManager.addPhysicalKeyboard(ANOTHER_PHYSICAL_FULL_KEYBOARD_ID)
+            fakeInputManager.removeDevice(ANOTHER_PHYSICAL_FULL_KEYBOARD_ID)
+
+            assertThat(keyboards).hasSize(1)
+        }
+    }
+
     private fun KeyboardBacklightListener.onBacklightChanged(
         current: Int,
         max: Int,
-        triggeredByKeyPress: Boolean = true
+        triggeredByKeyPress: Boolean = true,
     ) {
         onKeyboardBacklightChanged(
             /* deviceId= */ 0,
             TestBacklightState(current, max),
-            triggeredByKeyPress
+            triggeredByKeyPress,
         )
     }
 
@@ -343,7 +403,7 @@
 
     private class TestBacklightState(
         private val brightnessLevel: Int,
-        private val maxBrightnessLevel: Int
+        private val maxBrightnessLevel: Int,
     ) : KeyboardBacklightState() {
         override fun getBrightnessLevel() = brightnessLevel
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperCategoriesRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperCategoriesRepositoryTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperCategoriesRepositoryTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperCategoriesRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyboard/shortcut/domain/interactor/ShortcutHelperCategoriesInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/domain/interactor/ShortcutHelperCategoriesInteractorTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/keyboard/shortcut/domain/interactor/ShortcutHelperCategoriesInteractorTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/domain/interactor/ShortcutHelperCategoriesInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyboard/shortcut/ui/ShortcutHelperActivityStarterTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/ui
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/keyboard/shortcut/ui/ShortcutHelperActivityStarterTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/ui
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinatorTest.kt
new file mode 100644
index 0000000..727481e
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinatorTest.kt
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2024 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.systemui.keyboard.stickykeys.ui
+
+import android.app.Dialog
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.keyboard.data.repository.FakeStickyKeysRepository
+import com.android.systemui.keyboard.data.repository.keyboardRepository
+import com.android.systemui.keyboard.stickykeys.StickyKeysLogger
+import com.android.systemui.keyboard.stickykeys.shared.model.Locked
+import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey.SHIFT
+import com.android.systemui.keyboard.stickykeys.ui.viewmodel.StickyKeysIndicatorViewModel
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class StickyKeysIndicatorCoordinatorTest : SysuiTestCase() {
+
+    private lateinit var coordinator: StickyKeysIndicatorCoordinator
+    private val testScope = TestScope(StandardTestDispatcher())
+    private val stickyKeysRepository = FakeStickyKeysRepository()
+    private val dialog = mock<Dialog>()
+
+    @Before
+    fun setup() {
+        val dialogFactory = mock<StickyKeyDialogFactory>()
+        whenever(dialogFactory.create(any())).thenReturn(dialog)
+        val keyboardRepository = Kosmos().keyboardRepository
+        val viewModel =
+            StickyKeysIndicatorViewModel(
+                stickyKeysRepository,
+                keyboardRepository,
+                testScope.backgroundScope
+            )
+        coordinator =
+            StickyKeysIndicatorCoordinator(
+                testScope.backgroundScope,
+                dialogFactory,
+                viewModel,
+                mock<StickyKeysLogger>()
+            )
+        coordinator.startListening()
+        keyboardRepository.setIsAnyKeyboardConnected(true)
+    }
+
+    @Test
+    fun dialogIsShownWhenStickyKeysAreEmitted() {
+        testScope.run {
+            verifyNoMoreInteractions(dialog)
+
+            stickyKeysRepository.setStickyKeys(linkedMapOf(SHIFT to Locked(true)))
+            runCurrent()
+
+            verify(dialog).show()
+        }
+    }
+
+    @Test
+    fun dialogDisappearsWhenStickyKeysAreEmpty() {
+        testScope.run {
+            verifyNoMoreInteractions(dialog)
+
+            stickyKeysRepository.setStickyKeys(linkedMapOf(SHIFT to Locked(true)))
+            runCurrent()
+            stickyKeysRepository.setStickyKeys(linkedMapOf())
+            runCurrent()
+
+            verify(dialog).dismiss()
+        }
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/stickykeys/ui/viewmodel/StickyKeysIndicatorViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/stickykeys/ui/viewmodel/StickyKeysIndicatorViewModelTest.kt
new file mode 100644
index 0000000..26ce67d
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/stickykeys/ui/viewmodel/StickyKeysIndicatorViewModelTest.kt
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2024 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.systemui.keyboard.stickykeys.ui.viewmodel
+
+import android.hardware.input.InputManager
+import android.hardware.input.StickyModifierState
+import android.provider.Settings.Secure.ACCESSIBILITY_STICKY_KEYS
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.keyboard.data.repository.FakeKeyboardRepository
+import com.android.systemui.keyboard.stickykeys.StickyKeysLogger
+import com.android.systemui.keyboard.stickykeys.data.repository.StickyKeysRepositoryImpl
+import com.android.systemui.keyboard.stickykeys.shared.model.Locked
+import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey
+import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey.ALT
+import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey.ALT_GR
+import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey.CTRL
+import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey.META
+import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey.SHIFT
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
+import com.android.systemui.user.data.repository.fakeUserRepository
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.settings.fakeSettings
+import com.android.systemui.util.settings.repository.UserAwareSecureSettingsRepositoryImpl
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class StickyKeysIndicatorViewModelTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+    private val dispatcher = kosmos.testDispatcher
+    private val testScope = kosmos.testScope
+    private lateinit var viewModel: StickyKeysIndicatorViewModel
+    private val inputManager = mock<InputManager>()
+    private val keyboardRepository = FakeKeyboardRepository()
+    private val secureSettings = kosmos.fakeSettings
+    private val userRepository = Kosmos().fakeUserRepository
+    private val captor =
+        ArgumentCaptor.forClass(InputManager.StickyModifierStateListener::class.java)
+
+    @Before
+    fun setup() {
+        val settingsRepository =
+            UserAwareSecureSettingsRepositoryImpl(secureSettings, userRepository, dispatcher)
+        val stickyKeysRepository =
+            StickyKeysRepositoryImpl(
+                inputManager,
+                dispatcher,
+                settingsRepository,
+                mock<StickyKeysLogger>()
+            )
+        setStickyKeySetting(enabled = false)
+        viewModel =
+            StickyKeysIndicatorViewModel(
+                stickyKeysRepository = stickyKeysRepository,
+                keyboardRepository = keyboardRepository,
+                applicationScope = testScope.backgroundScope,
+            )
+    }
+
+    @Test
+    fun doesntListenToStickyKeysOnlyWhenKeyboardIsConnected() {
+        testScope.runTest {
+            collectLastValue(viewModel.indicatorContent)
+
+            keyboardRepository.setIsAnyKeyboardConnected(true)
+            runCurrent()
+
+            verifyNoMoreInteractions(inputManager)
+        }
+    }
+
+    @Test
+    fun startsListeningToStickyKeysOnlyWhenKeyboardIsConnectedAndSettingIsOn() {
+        testScope.runTest {
+            collectLastValue(viewModel.indicatorContent)
+            keyboardRepository.setIsAnyKeyboardConnected(true)
+
+            setStickyKeySetting(enabled = true)
+            runCurrent()
+
+            verify(inputManager)
+                .registerStickyModifierStateListener(
+                    any(),
+                    any(InputManager.StickyModifierStateListener::class.java)
+                )
+        }
+    }
+
+    private fun setStickyKeySetting(enabled: Boolean) {
+        val newValue = if (enabled) "1" else "0"
+        val defaultUser = userRepository.getSelectedUserInfo().id
+        secureSettings.putStringForUser(ACCESSIBILITY_STICKY_KEYS, newValue, defaultUser)
+    }
+
+    @Test
+    fun stopsListeningToStickyKeysWhenStickyKeySettingsIsTurnedOff() {
+        testScope.runTest {
+            collectLastValue(viewModel.indicatorContent)
+            setStickyKeysActive()
+            runCurrent()
+
+            setStickyKeySetting(enabled = false)
+            runCurrent()
+
+            verify(inputManager).unregisterStickyModifierStateListener(any())
+        }
+    }
+
+    @Test
+    fun stopsListeningToStickyKeysWhenKeyboardDisconnects() {
+        testScope.runTest {
+            collectLastValue(viewModel.indicatorContent)
+            setStickyKeysActive()
+            runCurrent()
+
+            keyboardRepository.setIsAnyKeyboardConnected(false)
+            runCurrent()
+
+            verify(inputManager).unregisterStickyModifierStateListener(any())
+        }
+    }
+
+    @Test
+    fun emitsStickyKeysListWhenStickyKeyIsPressed() {
+        testScope.runTest {
+            val stickyKeys by collectLastValue(viewModel.indicatorContent)
+            setStickyKeysActive()
+
+            setStickyKeys(mapOf(ALT to false))
+
+            assertThat(stickyKeys).isEqualTo(mapOf(ALT to Locked(false)))
+        }
+    }
+
+    @Test
+    fun emitsEmptyListWhenNoStickyKeysAreActive() {
+        testScope.runTest {
+            val stickyKeys by collectLastValue(viewModel.indicatorContent)
+            setStickyKeysActive()
+
+            setStickyKeys(emptyMap())
+
+            assertThat(stickyKeys).isEqualTo(emptyMap<ModifierKey, Locked>())
+        }
+    }
+
+    @Test
+    fun passesAllStickyKeysToDialog() {
+        testScope.runTest {
+            val stickyKeys by collectLastValue(viewModel.indicatorContent)
+            setStickyKeysActive()
+
+            setStickyKeys(mapOf(ALT to false, META to false, SHIFT to false))
+
+            assertThat(stickyKeys)
+                .isEqualTo(
+                    mapOf(
+                        ALT to Locked(false),
+                        META to Locked(false),
+                        SHIFT to Locked(false),
+                    )
+                )
+        }
+    }
+
+    @Test
+    fun showsOnlyLockedStateIfKeyIsStickyAndLocked() {
+        testScope.runTest {
+            val stickyKeys by collectLastValue(viewModel.indicatorContent)
+            setStickyKeysActive()
+
+            setStickyKeys(mapOf(ALT to false, ALT to true))
+
+            assertThat(stickyKeys).isEqualTo(mapOf(ALT to Locked(true)))
+        }
+    }
+
+    @Test
+    fun doesNotChangeOrderOfKeysIfTheyBecomeLocked() {
+        testScope.runTest {
+            val stickyKeys by collectLastValue(viewModel.indicatorContent)
+            setStickyKeysActive()
+
+            setStickyKeys(
+                mapOf(
+                    META to false,
+                    SHIFT to false, // shift is sticky but not locked
+                    CTRL to false
+                )
+            )
+            val previousShiftIndex = stickyKeys?.toList()?.indexOf(SHIFT to Locked(false))
+
+            setStickyKeys(
+                mapOf(
+                    SHIFT to false,
+                    SHIFT to true, // shift is now locked
+                    META to false,
+                    CTRL to false
+                )
+            )
+            assertThat(stickyKeys?.toList()?.indexOf(SHIFT to Locked(true)))
+                .isEqualTo(previousShiftIndex)
+        }
+    }
+
+    private fun setStickyKeysActive() {
+        keyboardRepository.setIsAnyKeyboardConnected(true)
+        setStickyKeySetting(enabled = true)
+    }
+
+    private fun TestScope.setStickyKeys(keys: Map<ModifierKey, Boolean>) {
+        runCurrent()
+        verify(inputManager).registerStickyModifierStateListener(any(), captor.capture())
+        captor.value.onStickyModifierStateChanged(TestStickyModifierState(keys))
+        runCurrent()
+    }
+
+    private class TestStickyModifierState(private val keys: Map<ModifierKey, Boolean>) :
+        StickyModifierState() {
+
+        private fun isOn(key: ModifierKey) = keys.any { it.key == key && !it.value }
+
+        private fun isLocked(key: ModifierKey) = keys.any { it.key == key && it.value }
+
+        override fun isAltGrModifierLocked() = isLocked(ALT_GR)
+
+        override fun isAltGrModifierOn() = isOn(ALT_GR)
+
+        override fun isAltModifierLocked() = isLocked(ALT)
+
+        override fun isAltModifierOn() = isOn(ALT)
+
+        override fun isCtrlModifierLocked() = isLocked(CTRL)
+
+        override fun isCtrlModifierOn() = isOn(CTRL)
+
+        override fun isMetaModifierLocked() = isLocked(META)
+
+        override fun isMetaModifierOn() = isOn(META)
+
+        override fun isShiftModifierLocked() = isLocked(SHIFT)
+
+        override fun isShiftModifierOn() = isOn(SHIFT)
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt
new file mode 100644
index 0000000..6b49d3a
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt
@@ -0,0 +1,152 @@
+package com.android.systemui.keyguard
+
+import android.content.ComponentCallbacks2
+import android.platform.test.flag.junit.SetFlagsRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.flags.DisableSceneContainer
+import com.android.systemui.flags.EnableSceneContainer
+import com.android.systemui.flags.fakeFeatureFlagsClassic
+import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
+import com.android.systemui.power.domain.interactor.powerInteractor
+import com.android.systemui.scene.data.repository.Idle
+import com.android.systemui.scene.data.repository.setSceneTransition
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.testKosmos
+import com.android.systemui.utils.GlobalWindowManager
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.MockitoAnnotations
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class ResourceTrimmerTest : SysuiTestCase() {
+    val kosmos = testKosmos()
+
+    private val testScope = kosmos.testScope
+    private val keyguardRepository = kosmos.fakeKeyguardRepository
+    private val featureFlags = kosmos.fakeFeatureFlagsClassic
+    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+    private val powerInteractor = kosmos.powerInteractor
+
+    @Mock private lateinit var globalWindowManager: GlobalWindowManager
+    private lateinit var resourceTrimmer: ResourceTrimmer
+
+    @Rule @JvmField public val setFlagsRule = SetFlagsRule()
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        keyguardRepository.setDozeAmount(0f)
+        keyguardRepository.setKeyguardGoingAway(false)
+        resourceTrimmer =
+            ResourceTrimmer(
+                keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor,
+                globalWindowManager = globalWindowManager,
+                applicationScope = testScope.backgroundScope,
+                bgDispatcher = kosmos.testDispatcher,
+            )
+        resourceTrimmer.start()
+    }
+
+    @Test
+    fun dozeAodDisabled_sleep_doesntTrimMemory() =
+        testScope.runTest {
+            powerInteractor.setAsleepForTest()
+            testScope.runCurrent()
+            verifyNoMoreInteractions(globalWindowManager)
+        }
+
+    @Test
+    fun dozeEnabled_sleepWithFullDozeAmount_doesntTrimMemory() =
+        testScope.runTest {
+            keyguardRepository.setDreaming(true)
+            keyguardRepository.setDozeAmount(1f)
+            powerInteractor.setAsleepForTest()
+            testScope.runCurrent()
+            verifyNoMoreInteractions(globalWindowManager)
+        }
+
+    @Test
+    fun dozeEnabled_sleepWithoutFullDozeAmount_doesntTrimMemory() =
+        testScope.runTest {
+            keyguardRepository.setDreaming(true)
+            keyguardRepository.setDozeAmount(0f)
+            powerInteractor.setAsleepForTest()
+            testScope.runCurrent()
+            verifyNoMoreInteractions(globalWindowManager)
+        }
+
+    @Test
+    fun aodEnabled_deviceWakesHalfWayThrough_doesNotTrimMemory() {
+        testScope.runTest {
+            keyguardRepository.setDreaming(true)
+            keyguardRepository.setDozeAmount(0f)
+            powerInteractor.setAsleepForTest()
+
+            testScope.runCurrent()
+            verifyNoMoreInteractions(globalWindowManager)
+
+            generateSequence(0f) { it + 0.1f }
+                .takeWhile { it < 0.8f }
+                .forEach {
+                    keyguardRepository.setDozeAmount(it)
+                    testScope.runCurrent()
+                }
+            verifyNoMoreInteractions(globalWindowManager)
+
+            generateSequence(0.8f) { it - 0.1f }
+                .takeWhile { it >= 0f }
+                .forEach {
+                    keyguardRepository.setDozeAmount(it)
+                    testScope.runCurrent()
+                }
+
+            keyguardRepository.setDozeAmount(0f)
+            testScope.runCurrent()
+            verifyNoMoreInteractions(globalWindowManager)
+        }
+    }
+
+    @Test
+    @DisableSceneContainer
+    fun keyguardTransitionsToGone_trimsFontCache() =
+        testScope.runTest {
+            keyguardTransitionRepository.sendTransitionSteps(
+                from = KeyguardState.LOCKSCREEN,
+                to = KeyguardState.GONE,
+                testScope
+            )
+            verify(globalWindowManager, times(1))
+                .trimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN)
+            verifyNoMoreInteractions(globalWindowManager)
+        }
+
+    @Test
+    @EnableSceneContainer
+    fun keyguardTransitionsToGone_trimsFontCache_scene_container() =
+        testScope.runTest {
+            kosmos.setSceneTransition(Idle(Scenes.Gone))
+
+            verify(globalWindowManager, times(1))
+                .trimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN)
+            verifyNoMoreInteractions(globalWindowManager)
+        }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartableTest.kt
new file mode 100644
index 0000000..42b3463
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartableTest.kt
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2023 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.systemui.keyguard.data.quickaffordance
+
+import android.content.Context
+import android.media.AudioManager
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.Observer
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepository
+import com.android.systemui.settings.UserFileManager
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.util.RingerModeTracker
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.argumentCaptor
+import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.cancelChildren
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Assert.assertEquals
+
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.MockitoAnnotations
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class MuteQuickAffordanceCoreStartableTest : SysuiTestCase() {
+
+    @Mock
+    private lateinit var userTracker: UserTracker
+    @Mock
+    private lateinit var ringerModeTracker: RingerModeTracker
+    @Mock
+    private lateinit var userFileManager: UserFileManager
+    @Mock
+    private lateinit var keyguardQuickAffordanceRepository: KeyguardQuickAffordanceRepository
+
+    private lateinit var testDispatcher: TestDispatcher
+    private lateinit var testScope: TestScope
+
+    private lateinit var underTest: MuteQuickAffordanceCoreStartable
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+
+        val config: KeyguardQuickAffordanceConfig = mock()
+        whenever(config.key).thenReturn(BuiltInKeyguardQuickAffordanceKeys.MUTE)
+
+        val emission = MutableStateFlow(mapOf("testQuickAffordanceKey" to listOf(config)))
+        whenever(keyguardQuickAffordanceRepository.selections).thenReturn(emission)
+
+        testDispatcher = StandardTestDispatcher()
+        testScope = TestScope(testDispatcher)
+
+        underTest = MuteQuickAffordanceCoreStartable(
+            userTracker,
+            ringerModeTracker,
+            userFileManager,
+            keyguardQuickAffordanceRepository,
+            testScope.backgroundScope,
+            testDispatcher,
+        )
+    }
+
+    @Test
+    fun callToKeyguardQuickAffordanceRepository() = testScope.runTest {
+        //given
+        val ringerModeInternal = mock<MutableLiveData<Int>>()
+        whenever(ringerModeTracker.ringerModeInternal).thenReturn(ringerModeInternal)
+
+        //when
+        underTest.start()
+        runCurrent()
+
+        //then
+        verify(keyguardQuickAffordanceRepository).selections
+        coroutineContext.cancelChildren()
+    }
+
+    @Test
+    fun ringerModeIsChangedToSILENT_doNotSaveToSharedPreferences() = testScope.runTest {
+        //given
+        val ringerModeInternal = mock<MutableLiveData<Int>>()
+        val observerCaptor = argumentCaptor<Observer<Int>>()
+        whenever(ringerModeTracker.ringerModeInternal).thenReturn(ringerModeInternal)
+
+        //when
+        underTest.start()
+        runCurrent()
+        verify(ringerModeInternal).observeForever(observerCaptor.capture())
+        observerCaptor.value.onChanged(AudioManager.RINGER_MODE_SILENT)
+
+        //then
+        verifyNoMoreInteractions(userFileManager)
+        coroutineContext.cancelChildren()
+    }
+
+    @Test
+    fun ringerModeInternalChangesToSomethingNotSILENT_isSetInSharedpreferences() = testScope.runTest {
+        //given
+        val newRingerMode = 99
+        val observerCaptor = argumentCaptor<Observer<Int>>()
+        val ringerModeInternal = mock<MutableLiveData<Int>>()
+        val sharedPrefs = context.getSharedPreferences("quick_affordance_mute_ringer_mode_cache_test", Context.MODE_PRIVATE)
+        whenever(ringerModeTracker.ringerModeInternal).thenReturn(ringerModeInternal)
+        whenever(
+            userFileManager.getSharedPreferences(eq("quick_affordance_mute_ringer_mode_cache"), any(), any())
+        ).thenReturn(sharedPrefs)
+
+        //when
+        underTest.start()
+        runCurrent()
+        verify(ringerModeInternal).observeForever(observerCaptor.capture())
+        observerCaptor.value.onChanged(newRingerMode)
+        runCurrent()
+        val result = sharedPrefs.getInt("key_last_non_silent_ringer_mode", -1)
+
+        //then
+        assertEquals(newRingerMode, result)
+        coroutineContext.cancelChildren()
+    }
+
+    @Test
+    fun MUTEisInSelections_observeRingerModeInternal() = testScope.runTest {
+        //given
+        val ringerModeInternal = mock<MutableLiveData<Int>>()
+        whenever(ringerModeTracker.ringerModeInternal).thenReturn(ringerModeInternal)
+
+        //when
+        underTest.start()
+        runCurrent()
+
+        //then
+        verify(ringerModeInternal).observeForever(any())
+        coroutineContext.cancelChildren()
+    }
+
+    @Test
+    fun MUTEisInSelections2x_observeRingerModeInternal() = testScope.runTest {
+        //given
+        val config: KeyguardQuickAffordanceConfig = mock()
+        whenever(config.key).thenReturn(BuiltInKeyguardQuickAffordanceKeys.MUTE)
+        val emission = MutableStateFlow(mapOf("testKey" to listOf(config), "testkey2" to listOf(config)))
+        whenever(keyguardQuickAffordanceRepository.selections).thenReturn(emission)
+        val ringerModeInternal = mock<MutableLiveData<Int>>()
+        whenever(ringerModeTracker.ringerModeInternal).thenReturn(ringerModeInternal)
+
+        //when
+        underTest.start()
+        runCurrent()
+
+        //then
+        verify(ringerModeInternal).observeForever(any())
+        coroutineContext.cancelChildren()
+    }
+
+    @Test
+    fun MUTEisNotInSelections_stopObservingRingerModeInternal() = testScope.runTest {
+        //given
+        val config: KeyguardQuickAffordanceConfig = mock()
+        whenever(config.key).thenReturn("notmutequickaffordance")
+        val emission = MutableStateFlow(mapOf("testKey" to listOf(config)))
+        whenever(keyguardQuickAffordanceRepository.selections).thenReturn(emission)
+        val ringerModeInternal = mock<MutableLiveData<Int>>()
+        whenever(ringerModeTracker.ringerModeInternal).thenReturn(ringerModeInternal)
+
+        //when
+        underTest.start()
+        runCurrent()
+
+        //then
+        verify(ringerModeInternal).removeObserver(any())
+        coroutineContext.cancelChildren()
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardSmartspaceRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardSmartspaceRepositoryImplTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardSmartspaceRepositoryImplTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardSmartspaceRepositoryImplTest.kt
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt
index 17e3006..047d8c2 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt
@@ -42,7 +42,8 @@
 import com.android.systemui.communal.domain.interactor.communalInteractor
 import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
+import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat
 import com.android.systemui.kosmos.testScope
@@ -57,7 +58,6 @@
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.Mockito
 import org.mockito.Mockito.reset
 
 @ExperimentalCoroutinesApi
@@ -66,7 +66,7 @@
 class FromAlternateBouncerTransitionInteractorTest : SysuiTestCase() {
     private val kosmos =
         testKosmos().apply {
-            this.fakeKeyguardTransitionRepository = Mockito.spy(FakeKeyguardTransitionRepository())
+            this.keyguardTransitionRepository = fakeKeyguardTransitionRepositorySpy
         }
     private val testScope = kosmos.testScope
     private lateinit var underTest: FromAlternateBouncerTransitionInteractor
@@ -74,7 +74,7 @@
 
     @Before
     fun setup() {
-        transitionRepository = kosmos.fakeKeyguardTransitionRepository
+        transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy
         underTest = kosmos.fromAlternateBouncerTransitionInteractor
         underTest.start()
     }
@@ -86,7 +86,7 @@
             transitionRepository.sendTransitionSteps(
                 from = KeyguardState.OCCLUDED,
                 to = KeyguardState.ALTERNATE_BOUNCER,
-                testScope
+                testScope,
             )
             reset(transitionRepository)
 
@@ -111,7 +111,7 @@
             transitionRepository.sendTransitionSteps(
                 from = KeyguardState.OCCLUDED,
                 to = KeyguardState.ALTERNATE_BOUNCER,
-                testScope
+                testScope,
             )
             reset(transitionRepository)
 
@@ -129,7 +129,7 @@
             transitionRepository.sendTransitionSteps(
                 from = KeyguardState.OCCLUDED,
                 to = KeyguardState.ALTERNATE_BOUNCER,
-                testScope
+                testScope,
             )
             reset(transitionRepository)
 
@@ -158,7 +158,7 @@
             transitionRepository.sendTransitionSteps(
                 from = KeyguardState.OCCLUDED,
                 to = KeyguardState.ALTERNATE_BOUNCER,
-                testScope
+                testScope,
             )
             reset(transitionRepository)
 
@@ -168,7 +168,7 @@
             assertThat(transitionRepository)
                 .startedTransition(
                     from = KeyguardState.ALTERNATE_BOUNCER,
-                    to = KeyguardState.OCCLUDED
+                    to = KeyguardState.OCCLUDED,
                 )
         }
 
@@ -183,7 +183,7 @@
             transitionRepository.sendTransitionSteps(
                 from = KeyguardState.GLANCEABLE_HUB,
                 to = KeyguardState.ALTERNATE_BOUNCER,
-                testScope
+                testScope,
             )
             reset(transitionRepository)
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorTest.kt
index 33f3cd4..9300964 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorTest.kt
@@ -42,8 +42,9 @@
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
 import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
+import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.keyguard.shared.model.BiometricUnlockMode
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
@@ -69,7 +70,6 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito.reset
-import org.mockito.Mockito.spy
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
@@ -77,7 +77,7 @@
 class FromAodTransitionInteractorTest : SysuiTestCase() {
     private val kosmos =
         testKosmos().apply {
-            this.fakeKeyguardTransitionRepository = spy(FakeKeyguardTransitionRepository())
+            this.keyguardTransitionRepository = fakeKeyguardTransitionRepositorySpy
         }
 
     private val testScope = kosmos.testScope
@@ -89,7 +89,7 @@
     @Before
     fun setup() {
         powerInteractor = kosmos.powerInteractor
-        transitionRepository = kosmos.fakeKeyguardTransitionRepository
+        transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy
         underTest = kosmos.fromAodTransitionInteractor
 
         underTest.start()
@@ -101,7 +101,7 @@
             transitionRepository.sendTransitionSteps(
                 from = KeyguardState.LOCKSCREEN,
                 to = KeyguardState.AOD,
-                testScope
+                testScope,
             )
             kosmos.fakeKeyguardRepository.setBiometricUnlockState(BiometricUnlockMode.NONE)
             reset(transitionRepository)
@@ -117,10 +117,7 @@
 
             // Under default conditions, we should transition to LOCKSCREEN when waking up.
             assertThat(transitionRepository)
-                .startedTransition(
-                    from = KeyguardState.AOD,
-                    to = KeyguardState.LOCKSCREEN,
-                )
+                .startedTransition(from = KeyguardState.AOD, to = KeyguardState.LOCKSCREEN)
         }
 
     @Test
@@ -133,10 +130,7 @@
 
             // Waking with a SHOW_WHEN_LOCKED activity on top should transition to OCCLUDED.
             assertThat(transitionRepository)
-                .startedTransition(
-                    from = KeyguardState.AOD,
-                    to = KeyguardState.OCCLUDED,
-                )
+                .startedTransition(from = KeyguardState.AOD, to = KeyguardState.OCCLUDED)
         }
 
     @Test
@@ -363,13 +357,13 @@
                         from = KeyguardState.GONE,
                         to = KeyguardState.AOD,
                         transitionState = TransitionState.STARTED,
-                        value = 0f
+                        value = 0f,
                     ),
                     TransitionStep(
                         from = KeyguardState.GONE,
                         to = KeyguardState.AOD,
                         transitionState = TransitionState.RUNNING,
-                        value = 0.1f
+                        value = 0.1f,
                     ),
                 ),
                 testScope = testScope,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt
index ff0a4a1..3b6e5d0 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt
@@ -36,8 +36,9 @@
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
 import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
+import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.keyguard.shared.model.BiometricUnlockMode
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
@@ -79,7 +80,7 @@
 class FromDozingTransitionInteractorTest(flags: FlagsParameterization?) : SysuiTestCase() {
     private val kosmos =
         testKosmos().apply {
-            this.fakeKeyguardTransitionRepository = spy(FakeKeyguardTransitionRepository())
+            this.keyguardTransitionRepository = fakeKeyguardTransitionRepositorySpy
             this.fakeCommunalSceneRepository =
                 spy(FakeCommunalSceneRepository(applicationScope = applicationCoroutineScope))
         }
@@ -105,7 +106,7 @@
     @Before
     fun setup() {
         powerInteractor = kosmos.powerInteractor
-        transitionRepository = kosmos.fakeKeyguardTransitionRepository
+        transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy
         underTest = kosmos.fromDozingTransitionInteractor
 
         underTest.start()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorTest.kt
index a08fbbf..9ca3ce6 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorTest.kt
@@ -32,7 +32,9 @@
 import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
 import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
+import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.keyguard.shared.model.BiometricUnlockMode
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat
@@ -53,7 +55,6 @@
 import org.junit.runner.RunWith
 import org.mockito.Mockito.anyBoolean
 import org.mockito.Mockito.reset
-import org.mockito.Mockito.spy
 import org.mockito.kotlin.whenever
 import platform.test.runner.parameterized.ParameterizedAndroidJunit4
 import platform.test.runner.parameterized.Parameters
@@ -77,14 +78,21 @@
 
     private val kosmos =
         testKosmos().apply {
-            this.fakeKeyguardTransitionRepository = spy(FakeKeyguardTransitionRepository())
+            this.fakeKeyguardTransitionRepository =
+                FakeKeyguardTransitionRepository(
+                    // This test sends transition steps manually in the test cases.
+                    sendTransitionStepsOnStartTransition = false,
+                    testScope = testScope,
+                )
+
+            this.keyguardTransitionRepository = fakeKeyguardTransitionRepositorySpy
         }
 
     private val testScope = kosmos.testScope
     private val underTest by lazy { kosmos.fromDreamingTransitionInteractor }
 
     private val powerInteractor = kosmos.powerInteractor
-    private val transitionRepository = kosmos.fakeKeyguardTransitionRepository
+    private val transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy
 
     @Before
     fun setup() {
@@ -198,6 +206,13 @@
     @DisableFlags(Flags.FLAG_SCENE_CONTAINER)
     fun testTransitionToGlanceableHubOnWake() =
         testScope.runTest {
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.LOCKSCREEN,
+                to = KeyguardState.DREAMING,
+                testScope,
+            )
+            reset(transitionRepository)
+
             whenever(kosmos.dreamManager.canStartDreaming(anyBoolean())).thenReturn(true)
             kosmos.setCommunalAvailable(true)
             runCurrent()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorTest.kt
index af76b08..57b1299 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorTest.kt
@@ -23,10 +23,10 @@
 import com.android.internal.widget.LockPatternUtils
 import com.android.systemui.Flags
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.data.repository.fakeBiometricSettingsRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
+import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.keyguard.shared.model.AuthenticationFlags
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.TransitionState
@@ -41,18 +41,17 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito.reset
-import org.mockito.Mockito.spy
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class FromGoneTransitionInteractorTest : SysuiTestCase() {
     private val kosmos =
         testKosmos().apply {
-            fakeKeyguardTransitionRepository = spy(FakeKeyguardTransitionRepository())
+            this.keyguardTransitionRepository = fakeKeyguardTransitionRepositorySpy
         }
     private val testScope = kosmos.testScope
     private val underTest = kosmos.fromGoneTransitionInteractor
-    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy
 
     @Before
     fun setUp() {
@@ -101,9 +100,7 @@
 
             // We're in the middle of a GONE -> LOCKSCREEN transition.
             assertThat(keyguardTransitionRepository)
-                .startedTransition(
-                    to = KeyguardState.LOCKSCREEN,
-                )
+                .startedTransition(to = KeyguardState.LOCKSCREEN)
         }
 
     @Test
@@ -121,15 +118,13 @@
             kosmos.fakeBiometricSettingsRepository.setAuthenticationFlags(
                 AuthenticationFlags(
                     0,
-                    LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN
+                    LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN,
                 )
             )
             runCurrent()
 
             // We're in the middle of a GONE -> LOCKSCREEN transition.
             assertThat(keyguardTransitionRepository)
-                .startedTransition(
-                    to = KeyguardState.LOCKSCREEN,
-                )
+                .startedTransition(to = KeyguardState.LOCKSCREEN)
         }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt
index 1ec7874..9c2e631 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt
@@ -27,9 +27,12 @@
 import com.android.systemui.coroutines.collectValues
 import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
 import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
+import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.keyguard.shared.model.StatusBarState
+import com.android.systemui.keyguard.shared.model.StatusBarState.KEYGUARD
 import com.android.systemui.keyguard.shared.model.TransitionState
 import com.android.systemui.keyguard.shared.model.TransitionStep
 import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat as assertThatRepository
@@ -41,10 +44,10 @@
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
+import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito.reset
-import org.mockito.Mockito.spy
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
@@ -52,15 +55,20 @@
 class FromLockscreenTransitionInteractorTest : SysuiTestCase() {
     private val kosmos =
         testKosmos().apply {
-            fakeKeyguardTransitionRepository = spy(FakeKeyguardTransitionRepository())
+            this.keyguardTransitionRepository = fakeKeyguardTransitionRepositorySpy
         }
 
     private val testScope = kosmos.testScope
     private val underTest = kosmos.fromLockscreenTransitionInteractor
-    private val transitionRepository = kosmos.fakeKeyguardTransitionRepository
+    private lateinit var transitionRepository: FakeKeyguardTransitionRepository
     private val shadeRepository = kosmos.fakeShadeRepository
     private val keyguardRepository = kosmos.fakeKeyguardRepository
 
+    @Before
+    fun setup() {
+        transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy
+    }
+
     @Test
     fun testSurfaceBehindVisibility() =
         testScope.runTest {
@@ -81,7 +89,7 @@
 
             assertThat(values)
                 .containsExactly(
-                    null, // LOCKSCREEN -> AOD does not have any specific surface visibility.
+                    null // LOCKSCREEN -> AOD does not have any specific surface visibility.
                 )
 
             transitionRepository.sendTransitionStep(
@@ -118,6 +126,53 @@
         }
 
     @Test
+    fun draggingToPrimaryBouncerUpdateIsSent() =
+        testScope.runTest {
+            underTest.start()
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.OFF,
+                to = KeyguardState.LOCKSCREEN,
+                testScope,
+            )
+
+            val steps by collectValues(transitionRepository.transitions)
+
+            shadeRepository.setLegacyShadeExpansion(0f)
+            shadeRepository.setLegacyShadeTracking(true)
+            keyguardRepository.setKeyguardDismissible(false)
+            keyguardRepository.setStatusBarState(KEYGUARD)
+            runCurrent()
+
+            // User starts dragging up
+            shadeRepository.setLegacyShadeExpansion(0.1f)
+            runCurrent()
+
+            assertThatRepository(transitionRepository)
+                .startedTransition(
+                    from = KeyguardState.LOCKSCREEN,
+                    to = KeyguardState.PRIMARY_BOUNCER,
+                )
+
+            // FakeKeyguardRepository doesn't send the step, so do that
+            transitionRepository.sendTransitionStep(
+                TransitionStep(
+                    transitionState = TransitionState.STARTED,
+                    from = KeyguardState.LOCKSCREEN,
+                    to = KeyguardState.PRIMARY_BOUNCER,
+                    value = 0f,
+                )
+            )
+            runCurrent()
+
+            // Update is sent
+            shadeRepository.setLegacyShadeExpansion(0.2f)
+            runCurrent()
+
+            assertThatRepository(transitionRepository)
+                .updatedTransition(value = 1f, state = TransitionState.RUNNING)
+        }
+
+    @Test
     @EnableFlags(Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR)
     fun testTransitionsToGone_whenDismissFlingWhileDismissable_flagEnabled() =
         testScope.runTest {
@@ -132,10 +187,7 @@
             runCurrent()
 
             assertThatRepository(transitionRepository)
-                .startedTransition(
-                    from = KeyguardState.LOCKSCREEN,
-                    to = KeyguardState.GONE,
-                )
+                .startedTransition(from = KeyguardState.LOCKSCREEN, to = KeyguardState.GONE)
         }
 
     @Test
@@ -184,15 +236,12 @@
                 true,
                 ActivityManager.RunningTaskInfo().apply {
                     topActivityType = WindowConfiguration.ACTIVITY_TYPE_STANDARD
-                }
+                },
             )
             runCurrent()
 
             assertThatRepository(transitionRepository)
-                .startedTransition(
-                    from = KeyguardState.LOCKSCREEN,
-                    to = KeyguardState.OCCLUDED,
-                )
+                .startedTransition(from = KeyguardState.LOCKSCREEN, to = KeyguardState.OCCLUDED)
         }
 
     @Test
@@ -207,14 +256,50 @@
                 true,
                 ActivityManager.RunningTaskInfo().apply {
                     topActivityType = WindowConfiguration.ACTIVITY_TYPE_DREAM
-                }
+                },
             )
             runCurrent()
 
             assertThatRepository(transitionRepository)
+                .startedTransition(from = KeyguardState.LOCKSCREEN, to = KeyguardState.DREAMING)
+        }
+
+    @Test
+    fun testTransitionsBackToOccluded_ifOccluded_andCanceledSwipe() =
+        testScope.runTest {
+            underTest.start()
+            keyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
+            keyguardRepository.setKeyguardDismissible(false)
+            keyguardRepository.setKeyguardOccluded(false)
+            runCurrent()
+
+            reset(transitionRepository)
+
+            shadeRepository.setLegacyShadeTracking(true)
+            runCurrent()
+            shadeRepository.setLegacyShadeExpansion(0.5f)
+            runCurrent()
+
+            assertThatRepository(transitionRepository)
                 .startedTransition(
                     from = KeyguardState.LOCKSCREEN,
-                    to = KeyguardState.DREAMING,
+                    to = KeyguardState.PRIMARY_BOUNCER,
+                )
+            reset(transitionRepository)
+
+            runCurrent()
+
+            shadeRepository.setLegacyShadeExpansion(0.6f)
+            shadeRepository.setLegacyShadeExpansion(0.7f)
+            runCurrent()
+
+            shadeRepository.setLegacyShadeExpansion(1f)
+            runCurrent()
+
+            assertThatRepository(transitionRepository)
+                .startedTransition(
+                    from = KeyguardState.PRIMARY_BOUNCER,
+                    to = KeyguardState.LOCKSCREEN,
                 )
         }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorTest.kt
index 7424320..4a90722 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorTest.kt
@@ -42,9 +42,9 @@
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.communal.data.repository.fakeCommunalSceneRepository
 import com.android.systemui.communal.shared.model.CommunalScenes
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
 import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
+import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat
 import com.android.systemui.kosmos.testScope
@@ -60,7 +60,6 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito.reset
-import org.mockito.Mockito.spy
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
@@ -68,14 +67,14 @@
 class FromOccludedTransitionInteractorTest : SysuiTestCase() {
     private val kosmos =
         testKosmos().apply {
-            this.fakeKeyguardTransitionRepository = spy(FakeKeyguardTransitionRepository())
+            this.keyguardTransitionRepository = fakeKeyguardTransitionRepositorySpy
         }
 
     private val testScope = kosmos.testScope
     private val underTest = kosmos.fromOccludedTransitionInteractor
 
     private val powerInteractor = kosmos.powerInteractor
-    private val transitionRepository = kosmos.fakeKeyguardTransitionRepository
+    private val transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy
 
     @Before
     fun setup() {
@@ -88,7 +87,7 @@
             transitionRepository.sendTransitionSteps(
                 from = KeyguardState.LOCKSCREEN,
                 to = KeyguardState.OCCLUDED,
-                testScope
+                testScope,
             )
             reset(transitionRepository)
         }
@@ -102,10 +101,7 @@
             runCurrent()
 
             assertThat(transitionRepository)
-                .startedTransition(
-                    from = KeyguardState.OCCLUDED,
-                    to = KeyguardState.LOCKSCREEN,
-                )
+                .startedTransition(from = KeyguardState.OCCLUDED, to = KeyguardState.LOCKSCREEN)
         }
 
     @Test
@@ -122,9 +118,6 @@
             runCurrent()
 
             assertThat(transitionRepository)
-                .startedTransition(
-                    from = KeyguardState.OCCLUDED,
-                    to = KeyguardState.GLANCEABLE_HUB,
-                )
+                .startedTransition(from = KeyguardState.OCCLUDED, to = KeyguardState.GLANCEABLE_HUB)
         }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt
index 14f2d65..a7da230 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt
@@ -26,9 +26,9 @@
 import com.android.systemui.communal.data.repository.fakeCommunalSceneRepository
 import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.coroutines.collectValues
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
 import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
+import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.TransitionState
 import com.android.systemui.keyguard.shared.model.TransitionStep
@@ -44,20 +44,19 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito.reset
-import org.mockito.Mockito.spy
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class FromPrimaryBouncerTransitionInteractorTest : SysuiTestCase() {
-    val kosmos =
+    private val kosmos =
         testKosmos().apply {
-            this.fakeKeyguardTransitionRepository = spy(FakeKeyguardTransitionRepository())
+            this.keyguardTransitionRepository = fakeKeyguardTransitionRepositorySpy
         }
     val underTest = kosmos.fromPrimaryBouncerTransitionInteractor
     val testScope = kosmos.testScope
     val selectedUserInteractor = kosmos.selectedUserInteractor
-    val transitionRepository = kosmos.fakeKeyguardTransitionRepository
+    val transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy
     val bouncerRepository = kosmos.fakeKeyguardBouncerRepository
 
     @Test
@@ -67,12 +66,7 @@
             runCurrent()
 
             // Transition-specific surface visibility should be null ("don't care") initially.
-            assertEquals(
-                listOf(
-                    null,
-                ),
-                values
-            )
+            assertEquals(listOf(null), values)
 
             transitionRepository.sendTransitionStep(
                 TransitionStep(
@@ -86,9 +80,9 @@
 
             assertEquals(
                 listOf(
-                    null, // PRIMARY_BOUNCER -> LOCKSCREEN does not have any specific visibility.
+                    null // PRIMARY_BOUNCER -> LOCKSCREEN does not have any specific visibility.
                 ),
-                values
+                values,
             )
 
             transitionRepository.sendTransitionStep(
@@ -117,7 +111,7 @@
                     null,
                     false, // Surface is only made visible once the bouncer UI animates out.
                 ),
-                values
+                values,
             )
 
             transitionRepository.sendTransitionStep(
@@ -137,7 +131,7 @@
                     false,
                     true, // Surface should eventually be visible.
                 ),
-                values
+                values,
             )
         }
 
@@ -150,7 +144,7 @@
             transitionRepository.sendTransitionSteps(
                 from = KeyguardState.LOCKSCREEN,
                 to = KeyguardState.PRIMARY_BOUNCER,
-                testScope
+                testScope,
             )
 
             reset(transitionRepository)
@@ -161,7 +155,7 @@
             assertThat(transitionRepository)
                 .startedTransition(
                     from = KeyguardState.PRIMARY_BOUNCER,
-                    to = KeyguardState.LOCKSCREEN
+                    to = KeyguardState.LOCKSCREEN,
                 )
         }
 
@@ -177,7 +171,7 @@
             transitionRepository.sendTransitionSteps(
                 from = KeyguardState.LOCKSCREEN,
                 to = KeyguardState.PRIMARY_BOUNCER,
-                testScope
+                testScope,
             )
 
             reset(transitionRepository)
@@ -188,7 +182,7 @@
             assertThat(transitionRepository)
                 .startedTransition(
                     from = KeyguardState.PRIMARY_BOUNCER,
-                    to = KeyguardState.GLANCEABLE_HUB
+                    to = KeyguardState.GLANCEABLE_HUB,
                 )
         }
 
@@ -201,7 +195,7 @@
             transitionRepository.sendTransitionSteps(
                 from = KeyguardState.LOCKSCREEN,
                 to = KeyguardState.PRIMARY_BOUNCER,
-                testScope
+                testScope,
             )
 
             reset(transitionRepository)
@@ -218,7 +212,7 @@
             assertThat(transitionRepository)
                 .startedTransition(
                     from = KeyguardState.PRIMARY_BOUNCER,
-                    to = KeyguardState.OCCLUDED
+                    to = KeyguardState.OCCLUDED,
                 )
         }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorTest.kt
index ba68917..d97909a1 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorTest.kt
@@ -19,17 +19,22 @@
 
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
+import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.authentication.data.repository.fakeAuthenticationRepository
 import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
 import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
 import com.android.systemui.bouncer.domain.interactor.alternateBouncerInteractor
 import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
 import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
 import com.android.systemui.flags.EnableSceneContainer
+import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
 import com.android.systemui.keyguard.shared.model.DismissAction
 import com.android.systemui.keyguard.shared.model.KeyguardDone
+import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.power.data.repository.fakePowerRepository
 import com.android.systemui.power.domain.interactor.powerInteractor
@@ -44,6 +49,7 @@
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
@@ -76,12 +82,12 @@
                 transitionInteractor = kosmos.keyguardTransitionInteractor,
                 dismissInteractor = dismissInteractor,
                 applicationScope = testScope.backgroundScope,
-                sceneInteractor = { kosmos.sceneInteractor },
                 deviceUnlockedInteractor = { kosmos.deviceUnlockedInteractor },
                 powerInteractor = kosmos.powerInteractor,
                 alternateBouncerInteractor = kosmos.alternateBouncerInteractor,
                 shadeInteractor = { kosmos.shadeInteractor },
                 keyguardInteractor = { kosmos.keyguardInteractor },
+                sceneInteractor = { kosmos.sceneInteractor },
             )
     }
 
@@ -180,7 +186,11 @@
             )
             assertThat(executeDismissAction).isNull()
 
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
             kosmos.setSceneTransition(Idle(Scenes.Gone))
+            kosmos.sceneInteractor.changeScene(Scenes.Gone, "")
 
             assertThat(executeDismissAction).isNotNull()
         }
@@ -303,4 +313,78 @@
             underTest.setKeyguardDone(KeyguardDone.IMMEDIATE)
             assertThat(keyguardDoneTiming).isEqualTo(KeyguardDone.IMMEDIATE)
         }
+
+    @Test
+    @EnableSceneContainer
+    fun dismissAction_executesBeforeItsReset_sceneContainerOn_swipeAuth_fromQsScene() =
+        testScope.runTest {
+            val canSwipeToEnter by collectLastValue(kosmos.deviceEntryInteractor.canSwipeToEnter)
+            val currentScene by collectLastValue(kosmos.sceneInteractor.currentScene)
+            val transitionState =
+                MutableStateFlow<ObservableTransitionState>(
+                    ObservableTransitionState.Idle(currentScene!!)
+                )
+            kosmos.sceneInteractor.setTransitionState(transitionState)
+            val executeDismissAction by collectLastValue(underTest.executeDismissAction)
+            val resetDismissAction by collectLastValue(underTest.resetDismissAction)
+            assertThat(executeDismissAction).isNull()
+            assertThat(resetDismissAction).isNull()
+            kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
+                AuthenticationMethodModel.None
+            )
+            kosmos.fakeDeviceEntryRepository.setLockscreenEnabled(true)
+            assertThat(canSwipeToEnter).isTrue()
+            kosmos.sceneInteractor.changeScene(Scenes.QuickSettings, "")
+            transitionState.value = ObservableTransitionState.Idle(Scenes.QuickSettings)
+            assertThat(currentScene).isEqualTo(Scenes.QuickSettings)
+
+            assertThat(executeDismissAction).isNull()
+            assertThat(resetDismissAction).isNull()
+
+            val dismissAction =
+                DismissAction.RunImmediately(
+                    onDismissAction = { KeyguardDone.LATER },
+                    onCancelAction = {},
+                    message = "message",
+                    willAnimateOnLockscreen = true,
+                )
+            underTest.setDismissAction(dismissAction)
+            // Should still be null because the transition to Gone has not yet happened.
+            assertThat(executeDismissAction).isNull()
+            assertThat(resetDismissAction).isNull()
+
+            transitionState.value =
+                ObservableTransitionState.Transition.ChangeScene(
+                    fromScene = Scenes.QuickSettings,
+                    toScene = Scenes.Gone,
+                    currentScene = flowOf(Scenes.QuickSettings),
+                    currentOverlays = emptySet(),
+                    progress = flowOf(0.5f),
+                    isInitiatedByUserInput = true,
+                    isUserInputOngoing = flowOf(false),
+                    previewProgress = flowOf(0f),
+                    isInPreviewStage = flowOf(false),
+                )
+            runCurrent()
+            assertThat(executeDismissAction).isNull()
+            assertThat(resetDismissAction).isNull()
+
+            transitionState.value =
+                ObservableTransitionState.Transition.ChangeScene(
+                    fromScene = Scenes.QuickSettings,
+                    toScene = Scenes.Gone,
+                    currentScene = flowOf(Scenes.Gone),
+                    currentOverlays = emptySet(),
+                    progress = flowOf(1f),
+                    isInitiatedByUserInput = true,
+                    isUserInputOngoing = flowOf(false),
+                    previewProgress = flowOf(0f),
+                    isInPreviewStage = flowOf(false),
+                )
+            kosmos.sceneInteractor.changeScene(Scenes.Gone, "")
+            assertThat(currentScene).isEqualTo(Scenes.Gone)
+            runCurrent()
+            assertThat(executeDismissAction).isNotNull()
+            assertThat(resetDismissAction).isNull()
+        }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt
new file mode 100644
index 0000000..eef4c3d
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt
@@ -0,0 +1,409 @@
+/*
+ * Copyright (C) 2022 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.systemui.keyguard.domain.interactor
+
+import android.app.admin.DevicePolicyManager
+import android.content.Intent
+import android.os.UserHandle
+import androidx.test.filters.FlakyTest
+import androidx.test.filters.SmallTest
+import com.android.internal.widget.LockPatternUtils
+import com.android.keyguard.logging.KeyguardQuickAffordancesLogger
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.ActivityTransitionAnimator
+import com.android.systemui.animation.DialogTransitionAnimator
+import com.android.systemui.animation.Expandable
+import com.android.systemui.common.shared.model.ContentDescription
+import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.dock.DockManagerFake
+import com.android.systemui.flags.DisableSceneContainer
+import com.android.systemui.flags.FakeFeatureFlags
+import com.android.systemui.keyguard.data.quickaffordance.BuiltInKeyguardQuickAffordanceKeys
+import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceConfig
+import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceProviderClientFactory
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLegacySettingSyncer
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLocalUserSelectionManager
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceRemoteUserSelectionManager
+import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
+import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepository
+import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancePosition
+import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancesMetricsLogger
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.settings.FakeUserTracker
+import com.android.systemui.settings.UserFileManager
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.shade.domain.interactor.shadeInteractor
+import com.android.systemui.statusbar.policy.KeyguardStateController
+import com.android.systemui.testKosmos
+import com.android.systemui.util.FakeSharedPreferences
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.settings.FakeSettings
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.anyString
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.ArgumentMatchers.same
+import org.mockito.Mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.MockitoAnnotations
+import platform.test.runner.parameterized.Parameter
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@FlakyTest(
+    bugId = 292574995,
+    detail = "on certain architectures all permutations with startActivity=true is causing failures"
+)
+@SmallTest
+@RunWith(ParameterizedAndroidJunit4::class)
+@DisableSceneContainer
+class KeyguardQuickAffordanceInteractorParameterizedTest : SysuiTestCase() {
+
+    companion object {
+        private val INTENT = Intent("some.intent.action")
+        private val DRAWABLE =
+            mock<Icon> {
+                whenever(this.contentDescription)
+                    .thenReturn(
+                        ContentDescription.Resource(
+                            res = CONTENT_DESCRIPTION_RESOURCE_ID,
+                        )
+                    )
+            }
+        private const val CONTENT_DESCRIPTION_RESOURCE_ID = 1337
+
+        @Parameters(
+            name =
+                "needStrongAuthAfterBoot={0}, canShowWhileLocked={1}," +
+                    " keyguardIsUnlocked={2}, needsToUnlockFirst={3}, startActivity={4}"
+        )
+        @JvmStatic
+        fun data() =
+            listOf(
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ false,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ false,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ false,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ false,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ false,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ false,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ true,
+                ),
+            )
+
+        private val IMMEDIATE = Dispatchers.Main.immediate
+    }
+
+    @Mock private lateinit var lockPatternUtils: LockPatternUtils
+    @Mock private lateinit var keyguardStateController: KeyguardStateController
+    @Mock private lateinit var activityStarter: ActivityStarter
+    @Mock private lateinit var animationController: ActivityTransitionAnimator.Controller
+    @Mock private lateinit var expandable: Expandable
+    @Mock private lateinit var launchAnimator: DialogTransitionAnimator
+    @Mock private lateinit var devicePolicyManager: DevicePolicyManager
+    @Mock private lateinit var logger: KeyguardQuickAffordancesLogger
+    @Mock private lateinit var metricsLogger: KeyguardQuickAffordancesMetricsLogger
+
+    private lateinit var underTest: KeyguardQuickAffordanceInteractor
+    private lateinit var testScope: TestScope
+
+    @JvmField @Parameter(0) var needStrongAuthAfterBoot: Boolean = false
+    @JvmField @Parameter(1) var canShowWhileLocked: Boolean = false
+    @JvmField @Parameter(2) var keyguardIsUnlocked: Boolean = false
+    @JvmField @Parameter(3) var needsToUnlockFirst: Boolean = false
+    @JvmField @Parameter(4) var startActivity: Boolean = false
+    private lateinit var homeControls: FakeKeyguardQuickAffordanceConfig
+    private lateinit var dockManager: DockManagerFake
+    private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
+    private lateinit var userTracker: UserTracker
+
+    private val kosmos = testKosmos()
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        whenever(expandable.activityTransitionController()).thenReturn(animationController)
+
+        userTracker = FakeUserTracker()
+        homeControls =
+            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS)
+        dockManager = DockManagerFake()
+        biometricSettingsRepository = FakeBiometricSettingsRepository()
+        val quickAccessWallet =
+            FakeKeyguardQuickAffordanceConfig(
+                BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
+            )
+        val qrCodeScanner =
+            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.QR_CODE_SCANNER)
+        val scope = CoroutineScope(IMMEDIATE)
+        val localUserSelectionManager =
+            KeyguardQuickAffordanceLocalUserSelectionManager(
+                context = context,
+                userFileManager =
+                    mock<UserFileManager>().apply {
+                        whenever(
+                                getSharedPreferences(
+                                    anyString(),
+                                    anyInt(),
+                                    anyInt(),
+                                )
+                            )
+                            .thenReturn(FakeSharedPreferences())
+                    },
+                userTracker = userTracker,
+                broadcastDispatcher = fakeBroadcastDispatcher,
+            )
+        val remoteUserSelectionManager =
+            KeyguardQuickAffordanceRemoteUserSelectionManager(
+                scope = scope,
+                userTracker = userTracker,
+                clientFactory = FakeKeyguardQuickAffordanceProviderClientFactory(userTracker),
+                userHandle = UserHandle.SYSTEM,
+            )
+        val quickAffordanceRepository =
+            KeyguardQuickAffordanceRepository(
+                appContext = context,
+                scope = scope,
+                localUserSelectionManager = localUserSelectionManager,
+                remoteUserSelectionManager = remoteUserSelectionManager,
+                userTracker = userTracker,
+                legacySettingSyncer =
+                    KeyguardQuickAffordanceLegacySettingSyncer(
+                        scope = scope,
+                        backgroundDispatcher = IMMEDIATE,
+                        secureSettings = FakeSettings(),
+                        selectionsManager = localUserSelectionManager,
+                    ),
+                configs = setOf(homeControls, quickAccessWallet, qrCodeScanner),
+                dumpManager = mock(),
+                userHandle = UserHandle.SYSTEM,
+            )
+        val featureFlags = FakeFeatureFlags()
+        val testDispatcher = StandardTestDispatcher()
+        testScope = TestScope(testDispatcher)
+        underTest =
+            KeyguardQuickAffordanceInteractor(
+                keyguardInteractor =
+                    KeyguardInteractorFactory.create(
+                            featureFlags = featureFlags,
+                        )
+                        .keyguardInteractor,
+                shadeInteractor = kosmos.shadeInteractor,
+                lockPatternUtils = lockPatternUtils,
+                keyguardStateController = keyguardStateController,
+                userTracker = userTracker,
+                activityStarter = activityStarter,
+                featureFlags = featureFlags,
+                repository = { quickAffordanceRepository },
+                launchAnimator = launchAnimator,
+                logger = logger,
+                metricsLogger = metricsLogger,
+                devicePolicyManager = devicePolicyManager,
+                dockManager = dockManager,
+                biometricSettingsRepository = biometricSettingsRepository,
+                backgroundDispatcher = testDispatcher,
+                appContext = mContext,
+                sceneInteractor = { kosmos.sceneInteractor },
+            )
+    }
+
+    @Test
+    fun onQuickAffordanceTriggered() =
+        testScope.runTest {
+            val key = BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS
+            setUpMocks(
+                needStrongAuthAfterBoot = needStrongAuthAfterBoot,
+                keyguardIsUnlocked = keyguardIsUnlocked,
+            )
+
+            homeControls.setState(
+                lockScreenState =
+                    KeyguardQuickAffordanceConfig.LockScreenState.Visible(
+                        icon = DRAWABLE,
+                    )
+            )
+            homeControls.onTriggeredResult =
+                if (startActivity) {
+                    KeyguardQuickAffordanceConfig.OnTriggeredResult.StartActivity(
+                        intent = INTENT,
+                        canShowWhileLocked = canShowWhileLocked,
+                    )
+                } else {
+                    KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled
+                }
+
+            underTest.onQuickAffordanceTriggered(
+                configKey = "${KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId()}::$key",
+                expandable = expandable,
+                slotId = "",
+            )
+
+            if (startActivity) {
+                if (needsToUnlockFirst) {
+                    verify(activityStarter)
+                        .postStartActivityDismissingKeyguard(
+                            any(),
+                            /* delay= */ eq(0),
+                            same(animationController),
+                        )
+                } else {
+                    verify(activityStarter)
+                        .startActivity(
+                            any(),
+                            /* dismissShade= */ eq(true),
+                            same(animationController),
+                            /* showOverLockscreenWhenLocked= */ eq(true),
+                        )
+                }
+            } else {
+                verifyNoMoreInteractions(activityStarter)
+            }
+        }
+
+    private fun setUpMocks(
+        needStrongAuthAfterBoot: Boolean = true,
+        keyguardIsUnlocked: Boolean = false,
+    ) {
+        whenever(lockPatternUtils.getStrongAuthForUser(any()))
+            .thenReturn(
+                if (needStrongAuthAfterBoot) {
+                    LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT
+                } else {
+                    LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED
+                }
+            )
+        whenever(keyguardStateController.isUnlocked).thenReturn(keyguardIsUnlocked)
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorSceneContainerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorSceneContainerTest.kt
new file mode 100644
index 0000000..1184a76
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorSceneContainerTest.kt
@@ -0,0 +1,409 @@
+/*
+ * Copyright (C) 2024 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.systemui.keyguard.domain.interactor
+
+import android.app.admin.DevicePolicyManager
+import android.content.Intent
+import android.os.UserHandle
+import androidx.test.filters.FlakyTest
+import androidx.test.filters.SmallTest
+import com.android.internal.widget.LockPatternUtils
+import com.android.keyguard.logging.KeyguardQuickAffordancesLogger
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.ActivityTransitionAnimator
+import com.android.systemui.animation.DialogTransitionAnimator
+import com.android.systemui.animation.Expandable
+import com.android.systemui.common.shared.model.ContentDescription
+import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.dock.DockManagerFake
+import com.android.systemui.flags.EnableSceneContainer
+import com.android.systemui.flags.FakeFeatureFlags
+import com.android.systemui.keyguard.data.quickaffordance.BuiltInKeyguardQuickAffordanceKeys
+import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceConfig
+import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceProviderClientFactory
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLegacySettingSyncer
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLocalUserSelectionManager
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceRemoteUserSelectionManager
+import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
+import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepository
+import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancePosition
+import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancesMetricsLogger
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.settings.FakeUserTracker
+import com.android.systemui.settings.UserFileManager
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.shade.domain.interactor.shadeInteractor
+import com.android.systemui.statusbar.policy.KeyguardStateController
+import com.android.systemui.testKosmos
+import com.android.systemui.util.FakeSharedPreferences
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.settings.FakeSettings
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.anyString
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.ArgumentMatchers.same
+import org.mockito.Mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.MockitoAnnotations
+import platform.test.runner.parameterized.Parameter
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@FlakyTest(
+    bugId = 292574995,
+    detail = "on certain architectures all permutations with startActivity=true is causing failures"
+)
+@SmallTest
+@RunWith(ParameterizedAndroidJunit4::class)
+@EnableSceneContainer
+class KeyguardQuickAffordanceInteractorSceneContainerTest : SysuiTestCase() {
+
+    companion object {
+        private val INTENT = Intent("some.intent.action")
+        private val DRAWABLE =
+            mock<Icon> {
+                whenever(this.contentDescription)
+                    .thenReturn(
+                        ContentDescription.Resource(
+                            res = CONTENT_DESCRIPTION_RESOURCE_ID,
+                        )
+                    )
+            }
+        private const val CONTENT_DESCRIPTION_RESOURCE_ID = 1337
+
+        @Parameters(
+            name =
+                "needStrongAuthAfterBoot={0}, canShowWhileLocked={1}," +
+                    " keyguardIsUnlocked={2}, needsToUnlockFirst={3}, startActivity={4}"
+        )
+        @JvmStatic
+        fun data() =
+            listOf(
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ false,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ false,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ false,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ false,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ false,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ false,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ false,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ false,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ false,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ false,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ true,
+                ),
+                arrayOf(
+                    /* needStrongAuthAfterBoot= */ true,
+                    /* canShowWhileLocked= */ true,
+                    /* keyguardIsUnlocked= */ true,
+                    /* needsToUnlockFirst= */ true,
+                    /* startActivity= */ true,
+                ),
+            )
+
+        private val IMMEDIATE = Dispatchers.Main.immediate
+    }
+
+    @Mock private lateinit var lockPatternUtils: LockPatternUtils
+    @Mock private lateinit var keyguardStateController: KeyguardStateController
+    @Mock private lateinit var activityStarter: ActivityStarter
+    @Mock private lateinit var animationController: ActivityTransitionAnimator.Controller
+    @Mock private lateinit var expandable: Expandable
+    @Mock private lateinit var launchAnimator: DialogTransitionAnimator
+    @Mock private lateinit var devicePolicyManager: DevicePolicyManager
+    @Mock private lateinit var logger: KeyguardQuickAffordancesLogger
+    @Mock private lateinit var metricsLogger: KeyguardQuickAffordancesMetricsLogger
+
+    private lateinit var underTest: KeyguardQuickAffordanceInteractor
+    private lateinit var testScope: TestScope
+
+    @JvmField @Parameter(0) var needStrongAuthAfterBoot: Boolean = false
+    @JvmField @Parameter(1) var canShowWhileLocked: Boolean = false
+    @JvmField @Parameter(2) var keyguardIsUnlocked: Boolean = false
+    @JvmField @Parameter(3) var needsToUnlockFirst: Boolean = false
+    @JvmField @Parameter(4) var startActivity: Boolean = false
+    private lateinit var homeControls: FakeKeyguardQuickAffordanceConfig
+    private lateinit var dockManager: DockManagerFake
+    private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
+    private lateinit var userTracker: UserTracker
+
+    private val kosmos = testKosmos()
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        whenever(expandable.activityTransitionController()).thenReturn(animationController)
+
+        userTracker = FakeUserTracker()
+        homeControls =
+            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS)
+        dockManager = DockManagerFake()
+        biometricSettingsRepository = FakeBiometricSettingsRepository()
+        val quickAccessWallet =
+            FakeKeyguardQuickAffordanceConfig(
+                BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
+            )
+        val qrCodeScanner =
+            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.QR_CODE_SCANNER)
+        val scope = CoroutineScope(IMMEDIATE)
+        val localUserSelectionManager =
+            KeyguardQuickAffordanceLocalUserSelectionManager(
+                context = context,
+                userFileManager =
+                    mock<UserFileManager>().apply {
+                        whenever(
+                                getSharedPreferences(
+                                    anyString(),
+                                    anyInt(),
+                                    anyInt(),
+                                )
+                            )
+                            .thenReturn(FakeSharedPreferences())
+                    },
+                userTracker = userTracker,
+                broadcastDispatcher = fakeBroadcastDispatcher,
+            )
+        val remoteUserSelectionManager =
+            KeyguardQuickAffordanceRemoteUserSelectionManager(
+                scope = scope,
+                userTracker = userTracker,
+                clientFactory = FakeKeyguardQuickAffordanceProviderClientFactory(userTracker),
+                userHandle = UserHandle.SYSTEM,
+            )
+        val quickAffordanceRepository =
+            KeyguardQuickAffordanceRepository(
+                appContext = context,
+                scope = scope,
+                localUserSelectionManager = localUserSelectionManager,
+                remoteUserSelectionManager = remoteUserSelectionManager,
+                userTracker = userTracker,
+                legacySettingSyncer =
+                    KeyguardQuickAffordanceLegacySettingSyncer(
+                        scope = scope,
+                        backgroundDispatcher = IMMEDIATE,
+                        secureSettings = FakeSettings(),
+                        selectionsManager = localUserSelectionManager,
+                    ),
+                configs = setOf(homeControls, quickAccessWallet, qrCodeScanner),
+                dumpManager = mock(),
+                userHandle = UserHandle.SYSTEM,
+            )
+        val featureFlags = FakeFeatureFlags()
+        val testDispatcher = StandardTestDispatcher()
+        testScope = TestScope(testDispatcher)
+        underTest =
+            KeyguardQuickAffordanceInteractor(
+                keyguardInteractor =
+                    KeyguardInteractorFactory.create(
+                            featureFlags = featureFlags,
+                        )
+                        .keyguardInteractor,
+                shadeInteractor = kosmos.shadeInteractor,
+                lockPatternUtils = lockPatternUtils,
+                keyguardStateController = keyguardStateController,
+                userTracker = userTracker,
+                activityStarter = activityStarter,
+                featureFlags = featureFlags,
+                repository = { quickAffordanceRepository },
+                launchAnimator = launchAnimator,
+                logger = logger,
+                metricsLogger = metricsLogger,
+                devicePolicyManager = devicePolicyManager,
+                dockManager = dockManager,
+                biometricSettingsRepository = biometricSettingsRepository,
+                backgroundDispatcher = testDispatcher,
+                appContext = mContext,
+                sceneInteractor = { kosmos.sceneInteractor },
+            )
+    }
+
+    @Test
+    fun onQuickAffordanceTriggered() =
+        testScope.runTest {
+            val key = BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS
+            setUpMocks(
+                needStrongAuthAfterBoot = needStrongAuthAfterBoot,
+                keyguardIsUnlocked = keyguardIsUnlocked,
+            )
+
+            homeControls.setState(
+                lockScreenState =
+                    KeyguardQuickAffordanceConfig.LockScreenState.Visible(
+                        icon = DRAWABLE,
+                    )
+            )
+            homeControls.onTriggeredResult =
+                if (startActivity) {
+                    KeyguardQuickAffordanceConfig.OnTriggeredResult.StartActivity(
+                        intent = INTENT,
+                        canShowWhileLocked = canShowWhileLocked,
+                    )
+                } else {
+                    KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled
+                }
+
+            underTest.onQuickAffordanceTriggered(
+                configKey = "${KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId()}::$key",
+                expandable = expandable,
+                slotId = "",
+            )
+
+            if (startActivity) {
+                if (needsToUnlockFirst) {
+                    verify(activityStarter)
+                        .postStartActivityDismissingKeyguard(
+                            any(),
+                            /* delay= */ eq(0),
+                            same(animationController),
+                        )
+                } else {
+                    verify(activityStarter)
+                        .startActivity(
+                            any(),
+                            /* dismissShade= */ eq(true),
+                            same(animationController),
+                            /* showOverLockscreenWhenLocked= */ eq(true),
+                        )
+                }
+            } else {
+                verifyNoMoreInteractions(activityStarter)
+            }
+        }
+
+    private fun setUpMocks(
+        needStrongAuthAfterBoot: Boolean = true,
+        keyguardIsUnlocked: Boolean = false,
+    ) {
+        whenever(lockPatternUtils.getStrongAuthForUser(any()))
+            .thenReturn(
+                if (needStrongAuthAfterBoot) {
+                    LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT
+                } else {
+                    LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED
+                }
+            )
+        whenever(keyguardStateController.isUnlocked).thenReturn(keyguardIsUnlocked)
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
index a617484..8f3d549 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
@@ -41,9 +41,9 @@
 import com.android.systemui.flags.Flags.COMMUNAL_SERVICE_ENABLED
 import com.android.systemui.flags.andSceneContainer
 import com.android.systemui.flags.fakeFeatureFlagsClassic
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
+import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.keyguard.shared.model.BiometricUnlockMode
 import com.android.systemui.keyguard.shared.model.DozeStateModel
 import com.android.systemui.keyguard.shared.model.DozeTransitionModel
@@ -76,7 +76,6 @@
 import org.mockito.Mock
 import org.mockito.Mockito.clearInvocations
 import org.mockito.Mockito.reset
-import org.mockito.Mockito.spy
 import org.mockito.MockitoAnnotations
 import platform.test.runner.parameterized.ParameterizedAndroidJunit4
 import platform.test.runner.parameterized.Parameters
@@ -91,7 +90,7 @@
 class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTestCase() {
     private val kosmos =
         testKosmos().apply {
-            fakeKeyguardTransitionRepository = spy(FakeKeyguardTransitionRepository())
+            this.keyguardTransitionRepository = fakeKeyguardTransitionRepositorySpy
         }
     private val testScope = kosmos.testScope
 
@@ -99,7 +98,7 @@
     private val keyguardInteractor by lazy { kosmos.keyguardInteractor }
     private val bouncerRepository by lazy { kosmos.fakeKeyguardBouncerRepository }
     private val shadeTestUtil by lazy { kosmos.shadeTestUtil }
-    private val transitionRepository by lazy { kosmos.fakeKeyguardTransitionRepository }
+    private val transitionRepository by lazy { kosmos.fakeKeyguardTransitionRepositorySpy }
     private lateinit var featureFlags: FakeFeatureFlags
 
     // Used to verify transition requests for test output
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractorTest.kt
index 073ed61..b6ec6a6 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractorTest.kt
@@ -21,16 +21,23 @@
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectValues
 import com.android.systemui.keyguard.data.fakeLightRevealScrimRepository
+import com.android.systemui.keyguard.data.repository.DEFAULT_REVEAL_DURATION
 import com.android.systemui.keyguard.data.repository.DEFAULT_REVEAL_EFFECT
 import com.android.systemui.keyguard.data.repository.FakeLightRevealScrimRepository
+import com.android.systemui.keyguard.data.repository.FakeLightRevealScrimRepository.RevealAnimatorRequest
 import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.TransitionState
 import com.android.systemui.keyguard.shared.model.TransitionStep
 import com.android.systemui.kosmos.testScope
+import com.android.systemui.power.data.repository.fakePowerRepository
+import com.android.systemui.power.domain.interactor.powerInteractor
+import com.android.systemui.power.shared.model.WakeSleepReason
+import com.android.systemui.power.shared.model.WakefulnessState
 import com.android.systemui.statusbar.LightRevealEffect
 import com.android.systemui.statusbar.LightRevealScrim
 import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
@@ -52,6 +59,8 @@
 
     private val fakeKeyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
 
+    private val fakePowerRepository = kosmos.fakePowerRepository
+
     private val underTest = kosmos.lightRevealScrimInteractor
 
     private val reveal1 =
@@ -107,4 +116,50 @@
             runCurrent()
             assertEquals(listOf(DEFAULT_REVEAL_EFFECT, reveal1, reveal2), values)
         }
+
+    @Test
+    fun transitionToAod_folding_doesNotAnimateTheScrim() =
+        kosmos.testScope.runTest {
+            updateWakefulness(goToSleepReason = WakeSleepReason.FOLD)
+            runCurrent()
+
+            // Transition to AOD
+            fakeKeyguardTransitionRepository.sendTransitionStep(
+                TransitionStep(to = KeyguardState.AOD, transitionState = TransitionState.STARTED)
+            )
+            runCurrent()
+
+            assertThat(fakeLightRevealScrimRepository.revealAnimatorRequests.last())
+                .isEqualTo(RevealAnimatorRequest(reveal = false, duration = 0))
+        }
+
+    @Test
+    fun transitionToAod_powerButton_animatesTheScrim() =
+        kosmos.testScope.runTest {
+            updateWakefulness(goToSleepReason = WakeSleepReason.POWER_BUTTON)
+            runCurrent()
+
+            // Transition to AOD
+            fakeKeyguardTransitionRepository.sendTransitionStep(
+                TransitionStep(to = KeyguardState.AOD, transitionState = TransitionState.STARTED)
+            )
+            runCurrent()
+
+            assertThat(fakeLightRevealScrimRepository.revealAnimatorRequests.last())
+                .isEqualTo(
+                    RevealAnimatorRequest(
+                        reveal = false,
+                        duration = DEFAULT_REVEAL_DURATION
+                    )
+                )
+        }
+
+    private fun updateWakefulness(goToSleepReason: WakeSleepReason) {
+        fakePowerRepository.updateWakefulness(
+            rawState = WakefulnessState.STARTING_TO_SLEEP,
+            lastWakeReason = WakeSleepReason.POWER_BUTTON,
+            lastSleepReason = goToSleepReason,
+            powerButtonLaunchGestureTriggered = false
+        )
+    }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityManagerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityManagerTest.kt
new file mode 100644
index 0000000..9c58e2b
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityManagerTest.kt
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2023 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.systemui.keyguard.ui.binder
+
+import android.app.IActivityTaskManager
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.keyguard.WindowManagerLockscreenVisibilityManager
+import com.android.systemui.keyguard.domain.interactor.KeyguardDismissTransitionInteractor
+import com.android.systemui.statusbar.policy.KeyguardStateController
+import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.time.FakeSystemClock
+import com.android.wm.shell.keyguard.KeyguardTransitions
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.anyInt
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@kotlinx.coroutines.ExperimentalCoroutinesApi
+class WindowManagerLockscreenVisibilityManagerTest : SysuiTestCase() {
+    private lateinit var underTest: WindowManagerLockscreenVisibilityManager
+    private lateinit var executor: FakeExecutor
+
+    @Mock private lateinit var activityTaskManagerService: IActivityTaskManager
+    @Mock private lateinit var keyguardStateController: KeyguardStateController
+    @Mock private lateinit var keyguardSurfaceBehindAnimator: KeyguardSurfaceBehindParamsApplier
+    @Mock
+    private lateinit var keyguardDismissTransitionInteractor: KeyguardDismissTransitionInteractor
+    @Mock private lateinit var keyguardTransitions: KeyguardTransitions
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        executor = FakeExecutor(FakeSystemClock())
+
+        underTest =
+            WindowManagerLockscreenVisibilityManager(
+                executor = executor,
+                activityTaskManagerService = activityTaskManagerService,
+                keyguardStateController = keyguardStateController,
+                keyguardSurfaceBehindAnimator = keyguardSurfaceBehindAnimator,
+                keyguardDismissTransitionInteractor = keyguardDismissTransitionInteractor,
+                keyguardTransitions = keyguardTransitions,
+            )
+    }
+
+    @Test
+    fun testLockscreenVisible_andAodVisible() {
+        underTest.setLockscreenShown(true)
+        underTest.setAodVisible(true)
+
+        verify(activityTaskManagerService).setLockScreenShown(true, false)
+        verify(activityTaskManagerService).setLockScreenShown(true, true)
+        verifyNoMoreInteractions(activityTaskManagerService)
+    }
+
+    @Test
+    fun testGoingAway_whenLockscreenVisible_thenSurfaceMadeVisible() {
+        underTest.setLockscreenShown(true)
+        underTest.setAodVisible(true)
+
+        verify(activityTaskManagerService).setLockScreenShown(true, false)
+        verify(activityTaskManagerService).setLockScreenShown(true, true)
+        verifyNoMoreInteractions(activityTaskManagerService)
+
+        underTest.setSurfaceBehindVisibility(true)
+
+        verify(activityTaskManagerService).keyguardGoingAway(anyInt())
+        verifyNoMoreInteractions(activityTaskManagerService)
+    }
+
+    @Test
+    fun testSurfaceVisible_whenLockscreenNotShowing_doesNotTriggerGoingAway() {
+        underTest.setLockscreenShown(false)
+        underTest.setAodVisible(false)
+
+        verify(activityTaskManagerService).setLockScreenShown(false, false)
+        verifyNoMoreInteractions(activityTaskManagerService)
+
+        underTest.setSurfaceBehindVisibility(true)
+
+        verifyNoMoreInteractions(activityTaskManagerService)
+    }
+
+    @Test
+    fun testAodVisible_noLockscreenShownCallYet_doesNotShowLockscreenUntilLater() {
+        underTest.setAodVisible(false)
+        verifyNoMoreInteractions(activityTaskManagerService)
+
+        underTest.setLockscreenShown(true)
+        verify(activityTaskManagerService).setLockScreenShown(true, false)
+        verifyNoMoreInteractions(activityTaskManagerService)
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelTest.kt
new file mode 100644
index 0000000..22677b2
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelTest.kt
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2024 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.systemui.keyguard.ui.viewmodel
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.keyguard.shared.model.TransitionState
+import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING
+import com.android.systemui.keyguard.shared.model.TransitionState.STARTED
+import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@ExperimentalCoroutinesApi
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceEntryBackgroundViewModelTest : SysuiTestCase() {
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+    private val underTest: DeviceEntryBackgroundViewModel by lazy {
+        kosmos.deviceEntryBackgroundViewModel
+    }
+
+    @Test
+    fun lockscreenToDozingTransitionChangesBackgroundViewAlphaToZero() =
+        testScope.runTest {
+            kosmos.fingerprintPropertyRepository.supportsUdfps()
+            val alpha by collectLastValue(underTest.alpha)
+
+            kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
+                listOf(dozingToLockscreen(0f, STARTED), dozingToLockscreen(0.1f)),
+                testScope,
+            )
+            runCurrent()
+            assertThat(alpha).isEqualTo(1.0f)
+
+            kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
+                listOf(lockscreenToDozing(0f, STARTED)),
+                testScope,
+            )
+            runCurrent()
+
+            assertThat(alpha).isEqualTo(0.0f)
+        }
+
+    private fun lockscreenToDozing(value: Float, state: TransitionState = RUNNING): TransitionStep {
+        return TransitionStep(
+            from = KeyguardState.LOCKSCREEN,
+            to = KeyguardState.DOZING,
+            value = value,
+            transitionState = state,
+            ownerName = "DeviceEntryBackgroundViewModelTest",
+        )
+    }
+
+    private fun dozingToLockscreen(value: Float, state: TransitionState = RUNNING): TransitionStep {
+        return TransitionStep(
+            from = KeyguardState.DOZING,
+            to = KeyguardState.LOCKSCREEN,
+            value = value,
+            transitionState = state,
+            ownerName = "DeviceEntryBackgroundViewModelTest",
+        )
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModelTest.kt
index 129752e..aab46d8 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModelTest.kt
@@ -22,6 +22,7 @@
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
 import com.android.systemui.testKosmos
 import org.junit.Before
 import org.junit.Test
@@ -44,6 +45,7 @@
             KeyguardBlueprintViewModel(
                 handler = kosmos.fakeExecutorHandler,
                 keyguardBlueprintInteractor = keyguardBlueprintInteractor,
+                keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor,
             )
     }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt
new file mode 100644
index 0000000..e1845a1
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt
@@ -0,0 +1,771 @@
+/*
+ * Copyright (C) 2022 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.systemui.keyguard.ui.viewmodel
+
+import android.app.admin.DevicePolicyManager
+import android.content.Intent
+import android.os.UserHandle
+import android.platform.test.flag.junit.FlagsParameterization
+import androidx.test.filters.SmallTest
+import com.android.internal.logging.testing.UiEventLoggerFake
+import com.android.internal.widget.LockPatternUtils
+import com.android.keyguard.logging.KeyguardQuickAffordancesLogger
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.DialogTransitionAnimator
+import com.android.systemui.animation.Expandable
+import com.android.systemui.broadcast.BroadcastDispatcher
+import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryFaceAuthInteractor
+import com.android.systemui.dock.DockManagerFake
+import com.android.systemui.doze.util.BurnInHelperWrapper
+import com.android.systemui.flags.FakeFeatureFlags
+import com.android.systemui.flags.Flags
+import com.android.systemui.flags.andSceneContainer
+import com.android.systemui.keyguard.data.quickaffordance.BuiltInKeyguardQuickAffordanceKeys
+import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceConfig
+import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceProviderClientFactory
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLegacySettingSyncer
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLocalUserSelectionManager
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceRemoteUserSelectionManager
+import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
+import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
+import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepository
+import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
+import com.android.systemui.keyguard.domain.interactor.KeyguardQuickAffordanceInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardTouchHandlingInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.quickaffordance.ActivationState
+import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancePosition
+import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancesMetricsLogger
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.res.R
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.settings.UserFileManager
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.shade.domain.interactor.shadeInteractor
+import com.android.systemui.shade.pulsingGestureListener
+import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots
+import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper
+import com.android.systemui.statusbar.policy.KeyguardStateController
+import com.android.systemui.testKosmos
+import com.android.systemui.util.FakeSharedPreferences
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.settings.fakeSettings
+import com.google.common.truth.Truth.assertThat
+import kotlin.math.max
+import kotlin.math.min
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.anyString
+import org.mockito.Mock
+import org.mockito.Mockito
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.MockitoAnnotations
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
+
+@SmallTest
+@RunWith(ParameterizedAndroidJunit4::class)
+class KeyguardBottomAreaViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+    private val testDispatcher = kosmos.testDispatcher
+    private val testScope = kosmos.testScope
+    private val settings = kosmos.fakeSettings
+
+    @Mock private lateinit var expandable: Expandable
+    @Mock private lateinit var burnInHelperWrapper: BurnInHelperWrapper
+    @Mock private lateinit var lockPatternUtils: LockPatternUtils
+    @Mock private lateinit var keyguardStateController: KeyguardStateController
+    @Mock private lateinit var userTracker: UserTracker
+    @Mock private lateinit var activityStarter: ActivityStarter
+    @Mock private lateinit var launchAnimator: DialogTransitionAnimator
+    @Mock private lateinit var devicePolicyManager: DevicePolicyManager
+    @Mock private lateinit var logger: KeyguardQuickAffordancesLogger
+    @Mock private lateinit var metricsLogger: KeyguardQuickAffordancesMetricsLogger
+    @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher
+    @Mock private lateinit var accessibilityManager: AccessibilityManagerWrapper
+
+    private lateinit var underTest: KeyguardBottomAreaViewModel
+
+    private lateinit var repository: FakeKeyguardRepository
+    private lateinit var homeControlsQuickAffordanceConfig: FakeKeyguardQuickAffordanceConfig
+    private lateinit var quickAccessWalletAffordanceConfig: FakeKeyguardQuickAffordanceConfig
+    private lateinit var qrCodeScannerAffordanceConfig: FakeKeyguardQuickAffordanceConfig
+    private lateinit var dockManager: DockManagerFake
+    private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
+
+    init {
+        mSetFlagsRule.setFlagsParameterization(flags)
+    }
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+
+        overrideResource(R.bool.custom_lockscreen_shortcuts_enabled, true)
+        overrideResource(
+            R.array.config_keyguardQuickAffordanceDefaults,
+            arrayOf(
+                KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START +
+                    ":" +
+                    BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS,
+                KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END +
+                    ":" +
+                    BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
+            )
+        )
+
+        whenever(burnInHelperWrapper.burnInOffset(anyInt(), any()))
+            .thenReturn(RETURNED_BURN_IN_OFFSET)
+
+        homeControlsQuickAffordanceConfig =
+            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS)
+        quickAccessWalletAffordanceConfig =
+            FakeKeyguardQuickAffordanceConfig(
+                BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
+            )
+        qrCodeScannerAffordanceConfig =
+            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.QR_CODE_SCANNER)
+        dockManager = DockManagerFake()
+        biometricSettingsRepository = FakeBiometricSettingsRepository()
+        val featureFlags =
+            FakeFeatureFlags().apply { set(Flags.LOCK_SCREEN_LONG_PRESS_ENABLED, false) }
+
+        val withDeps = KeyguardInteractorFactory.create(featureFlags = featureFlags)
+        val keyguardInteractor = withDeps.keyguardInteractor
+        repository = withDeps.repository
+
+        whenever(userTracker.userHandle).thenReturn(mock())
+        whenever(lockPatternUtils.getStrongAuthForUser(anyInt()))
+            .thenReturn(LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED)
+        val localUserSelectionManager =
+            KeyguardQuickAffordanceLocalUserSelectionManager(
+                context = context,
+                userFileManager =
+                    mock<UserFileManager>().apply {
+                        whenever(
+                                getSharedPreferences(
+                                    anyString(),
+                                    anyInt(),
+                                    anyInt(),
+                                )
+                            )
+                            .thenReturn(FakeSharedPreferences())
+                    },
+                userTracker = userTracker,
+                broadcastDispatcher = fakeBroadcastDispatcher,
+            )
+        val remoteUserSelectionManager =
+            KeyguardQuickAffordanceRemoteUserSelectionManager(
+                scope = testScope.backgroundScope,
+                userTracker = userTracker,
+                clientFactory = FakeKeyguardQuickAffordanceProviderClientFactory(userTracker),
+                userHandle = UserHandle.SYSTEM,
+            )
+        val quickAffordanceRepository =
+            KeyguardQuickAffordanceRepository(
+                appContext = context,
+                scope = testScope.backgroundScope,
+                localUserSelectionManager = localUserSelectionManager,
+                remoteUserSelectionManager = remoteUserSelectionManager,
+                userTracker = userTracker,
+                legacySettingSyncer =
+                    KeyguardQuickAffordanceLegacySettingSyncer(
+                        scope = testScope.backgroundScope,
+                        backgroundDispatcher = testDispatcher,
+                        secureSettings = settings,
+                        selectionsManager = localUserSelectionManager,
+                    ),
+                configs =
+                    setOf(
+                        homeControlsQuickAffordanceConfig,
+                        quickAccessWalletAffordanceConfig,
+                        qrCodeScannerAffordanceConfig,
+                    ),
+                dumpManager = mock(),
+                userHandle = UserHandle.SYSTEM,
+            )
+        val keyguardTouchHandlingInteractor =
+            KeyguardTouchHandlingInteractor(
+                appContext = mContext,
+                scope = testScope.backgroundScope,
+                transitionInteractor = kosmos.keyguardTransitionInteractor,
+                repository = repository,
+                logger = UiEventLoggerFake(),
+                featureFlags = featureFlags,
+                broadcastDispatcher = broadcastDispatcher,
+                accessibilityManager = accessibilityManager,
+                pulsingGestureListener = kosmos.pulsingGestureListener,
+                faceAuthInteractor = kosmos.deviceEntryFaceAuthInteractor,
+            )
+        underTest =
+            KeyguardBottomAreaViewModel(
+                keyguardInteractor = keyguardInteractor,
+                quickAffordanceInteractor =
+                    KeyguardQuickAffordanceInteractor(
+                        keyguardInteractor = keyguardInteractor,
+                        shadeInteractor = kosmos.shadeInteractor,
+                        lockPatternUtils = lockPatternUtils,
+                        keyguardStateController = keyguardStateController,
+                        userTracker = userTracker,
+                        activityStarter = activityStarter,
+                        featureFlags = featureFlags,
+                        repository = { quickAffordanceRepository },
+                        launchAnimator = launchAnimator,
+                        logger = logger,
+                        metricsLogger = metricsLogger,
+                        devicePolicyManager = devicePolicyManager,
+                        dockManager = dockManager,
+                        biometricSettingsRepository = biometricSettingsRepository,
+                        backgroundDispatcher = testDispatcher,
+                        appContext = mContext,
+                        sceneInteractor = { kosmos.sceneInteractor },
+                    ),
+                bottomAreaInteractor = KeyguardBottomAreaInteractor(repository = repository),
+                burnInHelperWrapper = burnInHelperWrapper,
+                keyguardTouchHandlingViewModel =
+                    KeyguardTouchHandlingViewModel(
+                        interactor = keyguardTouchHandlingInteractor,
+                    ),
+                settingsMenuViewModel =
+                    KeyguardSettingsMenuViewModel(
+                        interactor = keyguardTouchHandlingInteractor,
+                    ),
+            )
+    }
+
+    @Test
+    fun startButton_present_visibleModel_startsActivityOnClick() =
+        testScope.runTest {
+            repository.setKeyguardShowing(true)
+            val latest = collectLastValue(underTest.startButton)
+
+            val testConfig =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = true,
+                    isActivated = true,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = testConfig,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = testConfig,
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun startButton_hiddenWhenDevicePolicyDisablesAllKeyguardFeatures() =
+        testScope.runTest {
+            whenever(devicePolicyManager.getKeyguardDisabledFeatures(null, userTracker.userId))
+                .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_ALL)
+            repository.setKeyguardShowing(true)
+            val latest by collectLastValue(underTest.startButton)
+
+            val testConfig =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = true,
+                    isActivated = true,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = testConfig,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest,
+                testConfig =
+                    TestConfig(
+                        isVisible = false,
+                        slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                    ),
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun startButton_inPreviewMode_visibleEvenWhenKeyguardNotShowing() =
+        testScope.runTest {
+            underTest.enablePreviewMode(
+                initiallySelectedSlotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START,
+                shouldHighlightSelectedAffordance = true,
+            )
+            repository.setKeyguardShowing(false)
+            val latest = collectLastValue(underTest.startButton)
+
+            val icon: Icon = mock()
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig =
+                        TestConfig(
+                            isVisible = true,
+                            isClickable = true,
+                            isActivated = true,
+                            icon = icon,
+                            canShowWhileLocked = false,
+                            intent = Intent("action"),
+                            slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                        ),
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig =
+                    TestConfig(
+                        isVisible = true,
+                        isClickable = false,
+                        isActivated = false,
+                        icon = icon,
+                        canShowWhileLocked = false,
+                        intent = Intent("action"),
+                        isSelected = true,
+                        slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                    ),
+                configKey = configKey,
+            )
+            assertThat(latest()?.isSelected).isTrue()
+        }
+
+    @Test
+    fun endButton_inHiglightedPreviewMode_dimmedWhenOtherIsSelected() =
+        testScope.runTest {
+            underTest.enablePreviewMode(
+                initiallySelectedSlotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START,
+                shouldHighlightSelectedAffordance = true,
+            )
+            repository.setKeyguardShowing(false)
+            val startButton = collectLastValue(underTest.startButton)
+            val endButton = collectLastValue(underTest.endButton)
+
+            val icon: Icon = mock()
+            setUpQuickAffordanceModel(
+                position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                testConfig =
+                    TestConfig(
+                        isVisible = true,
+                        isClickable = true,
+                        isActivated = true,
+                        icon = icon,
+                        canShowWhileLocked = false,
+                        intent = Intent("action"),
+                        slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                    ),
+            )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_END,
+                    testConfig =
+                        TestConfig(
+                            isVisible = true,
+                            isClickable = true,
+                            isActivated = true,
+                            icon = icon,
+                            canShowWhileLocked = false,
+                            intent = Intent("action"),
+                            slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
+                        ),
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = endButton(),
+                testConfig =
+                    TestConfig(
+                        isVisible = true,
+                        isClickable = false,
+                        isActivated = false,
+                        icon = icon,
+                        canShowWhileLocked = false,
+                        intent = Intent("action"),
+                        isDimmed = true,
+                        slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
+                    ),
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun endButton_present_visibleModel_doNothingOnClick() =
+        testScope.runTest {
+            repository.setKeyguardShowing(true)
+            val latest = collectLastValue(underTest.endButton)
+
+            val config =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = true,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent =
+                        null, // This will cause it to tell the system that the click was handled.
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_END,
+                    testConfig = config,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = config,
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun startButton_notPresent_modelIsHidden() =
+        testScope.runTest {
+            val latest = collectLastValue(underTest.startButton)
+
+            val config =
+                TestConfig(
+                    isVisible = false,
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = config,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = config,
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun animateButtonReveal() =
+        testScope.runTest {
+            repository.setKeyguardShowing(true)
+            val testConfig =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = true,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+
+            setUpQuickAffordanceModel(
+                position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                testConfig = testConfig,
+            )
+
+            val value = collectLastValue(underTest.startButton.map { it.animateReveal })
+
+            assertThat(value()).isFalse()
+            repository.setAnimateDozingTransitions(true)
+            assertThat(value()).isTrue()
+            repository.setAnimateDozingTransitions(false)
+            assertThat(value()).isFalse()
+        }
+
+    @Test
+    fun isOverlayContainerVisible() =
+        testScope.runTest {
+            val value = collectLastValue(underTest.isOverlayContainerVisible)
+
+            assertThat(value()).isTrue()
+            repository.setIsDozing(true)
+            assertThat(value()).isFalse()
+            repository.setIsDozing(false)
+            assertThat(value()).isTrue()
+        }
+
+    @Test
+    fun alpha() =
+        testScope.runTest {
+            val value = collectLastValue(underTest.alpha)
+
+            assertThat(value()).isEqualTo(1f)
+            repository.setBottomAreaAlpha(0.1f)
+            assertThat(value()).isEqualTo(0.1f)
+            repository.setBottomAreaAlpha(0.5f)
+            assertThat(value()).isEqualTo(0.5f)
+            repository.setBottomAreaAlpha(0.2f)
+            assertThat(value()).isEqualTo(0.2f)
+            repository.setBottomAreaAlpha(0f)
+            assertThat(value()).isEqualTo(0f)
+        }
+
+    @Test
+    fun alpha_inPreviewMode_doesNotChange() =
+        testScope.runTest {
+            underTest.enablePreviewMode(
+                initiallySelectedSlotId = null,
+                shouldHighlightSelectedAffordance = false,
+            )
+            val value = collectLastValue(underTest.alpha)
+
+            assertThat(value()).isEqualTo(1f)
+            repository.setBottomAreaAlpha(0.1f)
+            assertThat(value()).isEqualTo(1f)
+            repository.setBottomAreaAlpha(0.5f)
+            assertThat(value()).isEqualTo(1f)
+            repository.setBottomAreaAlpha(0.2f)
+            assertThat(value()).isEqualTo(1f)
+            repository.setBottomAreaAlpha(0f)
+            assertThat(value()).isEqualTo(1f)
+        }
+
+    @Test
+    fun isClickable_trueWhenAlphaAtThreshold() =
+        testScope.runTest {
+            repository.setKeyguardShowing(true)
+            repository.setBottomAreaAlpha(
+                KeyguardBottomAreaViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD
+            )
+
+            val testConfig =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = true,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = testConfig,
+                )
+
+            val latest = collectLastValue(underTest.startButton)
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = testConfig,
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun isClickable_trueWhenAlphaAboveThreshold() =
+        testScope.runTest {
+            repository.setKeyguardShowing(true)
+            val latest = collectLastValue(underTest.startButton)
+            repository.setBottomAreaAlpha(
+                min(1f, KeyguardBottomAreaViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD + 0.1f),
+            )
+
+            val testConfig =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = true,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = testConfig,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = testConfig,
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun isClickable_falseWhenAlphaBelowThreshold() =
+        testScope.runTest {
+            repository.setKeyguardShowing(true)
+            val latest = collectLastValue(underTest.startButton)
+            repository.setBottomAreaAlpha(
+                max(0f, KeyguardBottomAreaViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD - 0.1f),
+            )
+
+            val testConfig =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = false,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = testConfig,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = testConfig,
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun isClickable_falseWhenAlphaAtZero() =
+        testScope.runTest {
+            repository.setKeyguardShowing(true)
+            val latest = collectLastValue(underTest.startButton)
+            repository.setBottomAreaAlpha(0f)
+
+            val testConfig =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = false,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = testConfig,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = testConfig,
+                configKey = configKey,
+            )
+        }
+
+    private suspend fun setUpQuickAffordanceModel(
+        position: KeyguardQuickAffordancePosition,
+        testConfig: TestConfig,
+    ): String {
+        val config =
+            when (position) {
+                KeyguardQuickAffordancePosition.BOTTOM_START -> homeControlsQuickAffordanceConfig
+                KeyguardQuickAffordancePosition.BOTTOM_END -> quickAccessWalletAffordanceConfig
+            }
+
+        val lockScreenState =
+            if (testConfig.isVisible) {
+                if (testConfig.intent != null) {
+                    config.onTriggeredResult =
+                        KeyguardQuickAffordanceConfig.OnTriggeredResult.StartActivity(
+                            intent = testConfig.intent,
+                            canShowWhileLocked = testConfig.canShowWhileLocked,
+                        )
+                }
+                KeyguardQuickAffordanceConfig.LockScreenState.Visible(
+                    icon = testConfig.icon ?: error("Icon is unexpectedly null!"),
+                    activationState =
+                        when (testConfig.isActivated) {
+                            true -> ActivationState.Active
+                            false -> ActivationState.Inactive
+                        }
+                )
+            } else {
+                KeyguardQuickAffordanceConfig.LockScreenState.Hidden
+            }
+        config.setState(lockScreenState)
+
+        return "${position.toSlotId()}::${config.key}"
+    }
+
+    private fun assertQuickAffordanceViewModel(
+        viewModel: KeyguardQuickAffordanceViewModel?,
+        testConfig: TestConfig,
+        configKey: String,
+    ) {
+        checkNotNull(viewModel)
+        assertThat(viewModel.isVisible).isEqualTo(testConfig.isVisible)
+        assertThat(viewModel.isClickable).isEqualTo(testConfig.isClickable)
+        assertThat(viewModel.isActivated).isEqualTo(testConfig.isActivated)
+        assertThat(viewModel.isSelected).isEqualTo(testConfig.isSelected)
+        assertThat(viewModel.isDimmed).isEqualTo(testConfig.isDimmed)
+        assertThat(viewModel.slotId).isEqualTo(testConfig.slotId)
+        if (testConfig.isVisible) {
+            assertThat(viewModel.icon).isEqualTo(testConfig.icon)
+            viewModel.onClicked.invoke(
+                KeyguardQuickAffordanceViewModel.OnClickedParameters(
+                    configKey = configKey,
+                    expandable = expandable,
+                    slotId = viewModel.slotId,
+                )
+            )
+            if (testConfig.intent != null) {
+                assertThat(Mockito.mockingDetails(activityStarter).invocations).hasSize(1)
+            } else {
+                verifyNoMoreInteractions(activityStarter)
+            }
+        } else {
+            assertThat(viewModel.isVisible).isFalse()
+        }
+    }
+
+    private data class TestConfig(
+        val isVisible: Boolean,
+        val isClickable: Boolean = false,
+        val isActivated: Boolean = false,
+        val icon: Icon? = null,
+        val canShowWhileLocked: Boolean = false,
+        val intent: Intent? = null,
+        val isSelected: Boolean = false,
+        val isDimmed: Boolean = false,
+        val slotId: String = ""
+    ) {
+        init {
+            check(!isVisible || icon != null) { "Must supply non-null icon if visible!" }
+        }
+    }
+
+    companion object {
+        private const val DEFAULT_BURN_IN_OFFSET = 5
+        private const val RETURNED_BURN_IN_OFFSET = 3
+
+        @JvmStatic
+        @Parameters(name = "{0}")
+        fun getParams(): List<FlagsParameterization> {
+            return FlagsParameterization.allCombinationsOf().andSceneContainer()
+        }
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt
new file mode 100644
index 0000000..5b21662
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt
@@ -0,0 +1,887 @@
+/*
+ * Copyright (C) 2023 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.systemui.keyguard.ui.viewmodel
+
+import android.app.admin.DevicePolicyManager
+import android.content.Intent
+import android.os.UserHandle
+import android.platform.test.annotations.EnableFlags
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.internal.widget.LockPatternUtils
+import com.android.keyguard.logging.KeyguardQuickAffordancesLogger
+import com.android.systemui.Flags as AConfigFlags
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.DialogTransitionAnimator
+import com.android.systemui.animation.Expandable
+import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.dock.DockManagerFake
+import com.android.systemui.flags.FakeFeatureFlags
+import com.android.systemui.flags.Flags
+import com.android.systemui.keyguard.data.quickaffordance.BuiltInKeyguardQuickAffordanceKeys
+import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceConfig
+import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceProviderClientFactory
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLegacySettingSyncer
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLocalUserSelectionManager
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceRemoteUserSelectionManager
+import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
+import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
+import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepository
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
+import com.android.systemui.keyguard.domain.interactor.KeyguardQuickAffordanceInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
+import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
+import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
+import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.keyguard.shared.quickaffordance.ActivationState
+import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancePosition
+import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancesMetricsLogger
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.res.R
+import com.android.systemui.scene.data.repository.Idle
+import com.android.systemui.scene.data.repository.setTransition
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.settings.UserFileManager
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots
+import com.android.systemui.statusbar.policy.KeyguardStateController
+import com.android.systemui.testKosmos
+import com.android.systemui.util.FakeSharedPreferences
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.settings.fakeSettings
+import com.google.common.truth.Truth
+import kotlin.math.min
+import kotlin.test.assertEquals
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.emptyFlow
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers
+import org.mockito.Mock
+import org.mockito.Mockito
+import org.mockito.MockitoAnnotations
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+    private val settings = kosmos.fakeSettings
+
+    @Mock private lateinit var activityStarter: ActivityStarter
+    @Mock private lateinit var devicePolicyManager: DevicePolicyManager
+    @Mock private lateinit var expandable: Expandable
+    @Mock private lateinit var userTracker: UserTracker
+    @Mock private lateinit var lockPatternUtils: LockPatternUtils
+    @Mock private lateinit var keyguardStateController: KeyguardStateController
+    @Mock private lateinit var launchAnimator: DialogTransitionAnimator
+    @Mock private lateinit var logger: KeyguardQuickAffordancesLogger
+    @Mock private lateinit var metricsLogger: KeyguardQuickAffordancesMetricsLogger
+    @Mock private lateinit var shadeInteractor: ShadeInteractor
+    @Mock
+    private lateinit var aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel
+    @Mock
+    private lateinit var dozingToLockscreenTransitionViewModel:
+        DozingToLockscreenTransitionViewModel
+    @Mock
+    private lateinit var dreamingHostedToLockscreenTransitionViewModel:
+        DreamingHostedToLockscreenTransitionViewModel
+    @Mock
+    private lateinit var dreamingToLockscreenTransitionViewModel:
+        DreamingToLockscreenTransitionViewModel
+    @Mock
+    private lateinit var goneToLockscreenTransitionViewModel: GoneToLockscreenTransitionViewModel
+    @Mock
+    private lateinit var occludedToLockscreenTransitionViewModel:
+        OccludedToLockscreenTransitionViewModel
+    @Mock
+    private lateinit var offToLockscreenTransitionViewModel: OffToLockscreenTransitionViewModel
+    @Mock
+    private lateinit var primaryBouncerToLockscreenTransitionViewModel:
+        PrimaryBouncerToLockscreenTransitionViewModel
+    @Mock
+    private lateinit var lockscreenToAodTransitionViewModel: LockscreenToAodTransitionViewModel
+    @Mock
+    private lateinit var lockscreenToDozingTransitionViewModel:
+        LockscreenToDozingTransitionViewModel
+    @Mock
+    private lateinit var lockscreenToDreamingHostedTransitionViewModel:
+        LockscreenToDreamingHostedTransitionViewModel
+    @Mock
+    private lateinit var lockscreenToDreamingTransitionViewModel:
+        LockscreenToDreamingTransitionViewModel
+    @Mock
+    private lateinit var lockscreenToGoneTransitionViewModel: LockscreenToGoneTransitionViewModel
+    @Mock
+    private lateinit var lockscreenToOccludedTransitionViewModel:
+        LockscreenToOccludedTransitionViewModel
+    @Mock
+    private lateinit var lockscreenToPrimaryBouncerTransitionViewModel:
+        LockscreenToPrimaryBouncerTransitionViewModel
+    @Mock
+    private lateinit var lockscreenToGlanceableHubTransitionViewModel:
+        LockscreenToGlanceableHubTransitionViewModel
+    @Mock
+    private lateinit var glanceableHubToLockscreenTransitionViewModel:
+        GlanceableHubToLockscreenTransitionViewModel
+
+    private lateinit var underTest: KeyguardQuickAffordancesCombinedViewModel
+
+    private lateinit var repository: FakeKeyguardRepository
+    private lateinit var homeControlsQuickAffordanceConfig: FakeKeyguardQuickAffordanceConfig
+    private lateinit var quickAccessWalletAffordanceConfig: FakeKeyguardQuickAffordanceConfig
+    private lateinit var qrCodeScannerAffordanceConfig: FakeKeyguardQuickAffordanceConfig
+    private lateinit var dockManager: DockManagerFake
+    private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
+    private lateinit var keyguardInteractor: KeyguardInteractor
+
+    private val intendedAlphaMutableStateFlow: MutableStateFlow<Float> = MutableStateFlow(1f)
+    // the viewModel does a `map { 1 - it }` on this value, which is why it's different
+    private val intendedShadeAlphaMutableStateFlow: MutableStateFlow<Float> = MutableStateFlow(0f)
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+
+        overrideResource(R.bool.custom_lockscreen_shortcuts_enabled, true)
+        overrideResource(
+            R.array.config_keyguardQuickAffordanceDefaults,
+            arrayOf(
+                KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START +
+                    ":" +
+                    BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS,
+                KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END +
+                    ":" +
+                    BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
+            )
+        )
+
+        homeControlsQuickAffordanceConfig =
+            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS)
+        quickAccessWalletAffordanceConfig =
+            FakeKeyguardQuickAffordanceConfig(
+                BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
+            )
+        qrCodeScannerAffordanceConfig =
+            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.QR_CODE_SCANNER)
+        dockManager = DockManagerFake()
+        biometricSettingsRepository = FakeBiometricSettingsRepository()
+
+        mSetFlagsRule.enableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
+
+        val featureFlags =
+            FakeFeatureFlags().apply { set(Flags.LOCK_SCREEN_LONG_PRESS_ENABLED, false) }
+
+        val withDeps = KeyguardInteractorFactory.create(featureFlags = featureFlags)
+        keyguardInteractor = withDeps.keyguardInteractor
+        repository = withDeps.repository
+
+        whenever(userTracker.userHandle).thenReturn(mock())
+        whenever(lockPatternUtils.getStrongAuthForUser(ArgumentMatchers.anyInt()))
+            .thenReturn(LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED)
+
+        val localUserSelectionManager =
+            KeyguardQuickAffordanceLocalUserSelectionManager(
+                context = context,
+                userFileManager =
+                    mock<UserFileManager>().apply {
+                        whenever(
+                                getSharedPreferences(
+                                    ArgumentMatchers.anyString(),
+                                    ArgumentMatchers.anyInt(),
+                                    ArgumentMatchers.anyInt(),
+                                )
+                            )
+                            .thenReturn(FakeSharedPreferences())
+                    },
+                userTracker = userTracker,
+                broadcastDispatcher = fakeBroadcastDispatcher,
+            )
+        val remoteUserSelectionManager =
+            KeyguardQuickAffordanceRemoteUserSelectionManager(
+                scope = testScope.backgroundScope,
+                userTracker = userTracker,
+                clientFactory = FakeKeyguardQuickAffordanceProviderClientFactory(userTracker),
+                userHandle = UserHandle.SYSTEM,
+            )
+        val quickAffordanceRepository =
+            KeyguardQuickAffordanceRepository(
+                appContext = context,
+                scope = testScope.backgroundScope,
+                localUserSelectionManager = localUserSelectionManager,
+                remoteUserSelectionManager = remoteUserSelectionManager,
+                userTracker = userTracker,
+                legacySettingSyncer =
+                    KeyguardQuickAffordanceLegacySettingSyncer(
+                        scope = testScope.backgroundScope,
+                        backgroundDispatcher = kosmos.testDispatcher,
+                        secureSettings = settings,
+                        selectionsManager = localUserSelectionManager,
+                    ),
+                configs =
+                    setOf(
+                        homeControlsQuickAffordanceConfig,
+                        quickAccessWalletAffordanceConfig,
+                        qrCodeScannerAffordanceConfig,
+                    ),
+                dumpManager = mock(),
+                userHandle = UserHandle.SYSTEM,
+            )
+
+        intendedAlphaMutableStateFlow.value = 1f
+        intendedShadeAlphaMutableStateFlow.value = 0f
+        whenever(aodToLockscreenTransitionViewModel.shortcutsAlpha)
+            .thenReturn(intendedAlphaMutableStateFlow)
+        whenever(dozingToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+        whenever(dreamingHostedToLockscreenTransitionViewModel.shortcutsAlpha)
+            .thenReturn(emptyFlow())
+        whenever(dreamingToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+        whenever(goneToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+        whenever(occludedToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+        whenever(offToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+        whenever(primaryBouncerToLockscreenTransitionViewModel.shortcutsAlpha)
+            .thenReturn(emptyFlow())
+        whenever(lockscreenToAodTransitionViewModel.shortcutsAlpha)
+            .thenReturn(intendedAlphaMutableStateFlow)
+        whenever(lockscreenToDozingTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+        whenever(lockscreenToDreamingHostedTransitionViewModel.shortcutsAlpha)
+            .thenReturn(emptyFlow())
+        whenever(lockscreenToDreamingTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+        whenever(lockscreenToGoneTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+        whenever(lockscreenToOccludedTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+        whenever(lockscreenToPrimaryBouncerTransitionViewModel.shortcutsAlpha)
+            .thenReturn(emptyFlow())
+        whenever(lockscreenToGlanceableHubTransitionViewModel.shortcutsAlpha)
+            .thenReturn(emptyFlow())
+        whenever(glanceableHubToLockscreenTransitionViewModel.shortcutsAlpha)
+            .thenReturn(emptyFlow())
+        whenever(shadeInteractor.anyExpansion).thenReturn(intendedShadeAlphaMutableStateFlow)
+
+        underTest =
+            KeyguardQuickAffordancesCombinedViewModel(
+                applicationScope = testScope.backgroundScope,
+                quickAffordanceInteractor =
+                    KeyguardQuickAffordanceInteractor(
+                        keyguardInteractor = keyguardInteractor,
+                        shadeInteractor = shadeInteractor,
+                        lockPatternUtils = lockPatternUtils,
+                        keyguardStateController = keyguardStateController,
+                        userTracker = userTracker,
+                        activityStarter = activityStarter,
+                        featureFlags = featureFlags,
+                        repository = { quickAffordanceRepository },
+                        launchAnimator = launchAnimator,
+                        logger = logger,
+                        metricsLogger = metricsLogger,
+                        devicePolicyManager = devicePolicyManager,
+                        dockManager = dockManager,
+                        biometricSettingsRepository = biometricSettingsRepository,
+                        backgroundDispatcher = kosmos.testDispatcher,
+                        appContext = mContext,
+                        sceneInteractor = { kosmos.sceneInteractor },
+                    ),
+                keyguardInteractor = keyguardInteractor,
+                shadeInteractor = shadeInteractor,
+                aodToLockscreenTransitionViewModel = aodToLockscreenTransitionViewModel,
+                dozingToLockscreenTransitionViewModel = dozingToLockscreenTransitionViewModel,
+                dreamingHostedToLockscreenTransitionViewModel =
+                    dreamingHostedToLockscreenTransitionViewModel,
+                dreamingToLockscreenTransitionViewModel = dreamingToLockscreenTransitionViewModel,
+                goneToLockscreenTransitionViewModel = goneToLockscreenTransitionViewModel,
+                occludedToLockscreenTransitionViewModel = occludedToLockscreenTransitionViewModel,
+                offToLockscreenTransitionViewModel = offToLockscreenTransitionViewModel,
+                primaryBouncerToLockscreenTransitionViewModel =
+                    primaryBouncerToLockscreenTransitionViewModel,
+                glanceableHubToLockscreenTransitionViewModel =
+                    glanceableHubToLockscreenTransitionViewModel,
+                lockscreenToAodTransitionViewModel = lockscreenToAodTransitionViewModel,
+                lockscreenToDozingTransitionViewModel = lockscreenToDozingTransitionViewModel,
+                lockscreenToDreamingHostedTransitionViewModel =
+                    lockscreenToDreamingHostedTransitionViewModel,
+                lockscreenToDreamingTransitionViewModel = lockscreenToDreamingTransitionViewModel,
+                lockscreenToGoneTransitionViewModel = lockscreenToGoneTransitionViewModel,
+                lockscreenToOccludedTransitionViewModel = lockscreenToOccludedTransitionViewModel,
+                lockscreenToPrimaryBouncerTransitionViewModel =
+                    lockscreenToPrimaryBouncerTransitionViewModel,
+                lockscreenToGlanceableHubTransitionViewModel =
+                    lockscreenToGlanceableHubTransitionViewModel,
+                transitionInteractor = kosmos.keyguardTransitionInteractor,
+            )
+    }
+
+    @Test
+    fun startButton_present_visibleModel_startsActivityOnClick() =
+        testScope.runTest {
+            repository.setKeyguardShowing(true)
+            val latest = collectLastValue(underTest.startButton)
+
+            val testConfig =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = true,
+                    isActivated = true,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = testConfig,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = testConfig,
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun startButton_hiddenWhenDevicePolicyDisablesAllKeyguardFeatures() =
+        testScope.runTest {
+            whenever(devicePolicyManager.getKeyguardDisabledFeatures(null, userTracker.userId))
+                .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_ALL)
+            repository.setKeyguardShowing(true)
+            val latest by collectLastValue(underTest.startButton)
+
+            val testConfig =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = true,
+                    isActivated = true,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = testConfig,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest,
+                testConfig =
+                    TestConfig(
+                        isVisible = false,
+                        slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                    ),
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    @EnableFlags(com.android.systemui.shared.Flags.FLAG_NEW_CUSTOMIZATION_PICKER_UI)
+    fun startButton_inPreviewMode_onPreviewQuickAffordanceSelected() =
+        testScope.runTest {
+            underTest.onPreviewSlotSelected(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START)
+            underTest.enablePreviewMode(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START, true)
+
+            repository.setKeyguardShowing(false)
+            val latest = collectLastValue(underTest.startButton)
+
+            val icon: Icon = mock()
+            val testConfig =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = true,
+                    isActivated = true,
+                    icon = icon,
+                    canShowWhileLocked = false,
+                    intent = null,
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val defaultConfigKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = testConfig,
+                )
+
+            // Set up the quick access wallet config
+            val quickAccessWalletAffordanceConfigKey =
+                quickAccessWalletAffordanceConfig
+                    .apply {
+                        onTriggeredResult =
+                            KeyguardQuickAffordanceConfig.OnTriggeredResult.StartActivity(
+                                intent = Intent("action"),
+                                canShowWhileLocked = false,
+                            )
+                        setState(
+                            KeyguardQuickAffordanceConfig.LockScreenState.Visible(
+                                icon = icon,
+                                activationState = ActivationState.Active,
+                            )
+                        )
+                    }
+                    .let {
+                        KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId() +
+                            "::${quickAccessWalletAffordanceConfig.key}"
+                    }
+
+            // onPreviewQuickAffordanceSelected should trigger the override with the quick access
+            // wallet quick affordance
+            underTest.onPreviewQuickAffordanceSelected(
+                KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START,
+                BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET,
+            )
+            Truth.assertThat(latest()?.configKey).isEqualTo(quickAccessWalletAffordanceConfigKey)
+
+            // onClearPreviewQuickAffordances should make the default quick affordance shows again
+            underTest.onClearPreviewQuickAffordances()
+            Truth.assertThat(latest()?.configKey).isEqualTo(defaultConfigKey)
+        }
+
+    @Test
+    fun startButton_inPreviewMode_visibleEvenWhenKeyguardNotShowing() =
+        testScope.runTest {
+            underTest.onPreviewSlotSelected(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START)
+            underTest.enablePreviewMode(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START, true)
+
+            repository.setKeyguardShowing(false)
+            val latest = collectLastValue(underTest.startButton)
+
+            val icon: Icon = mock()
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig =
+                        TestConfig(
+                            isVisible = true,
+                            isClickable = true,
+                            isActivated = true,
+                            icon = icon,
+                            canShowWhileLocked = false,
+                            intent = Intent("action"),
+                            slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                        ),
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig =
+                    TestConfig(
+                        isVisible = true,
+                        isClickable = false,
+                        isActivated = false,
+                        icon = icon,
+                        canShowWhileLocked = false,
+                        intent = Intent("action"),
+                        isSelected = true,
+                        slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                    ),
+                configKey = configKey,
+            )
+            Truth.assertThat(latest()?.isSelected).isTrue()
+        }
+
+    @Test
+    fun endButton_inHighlightedPreviewMode_dimmedWhenOtherIsSelected() =
+        testScope.runTest {
+            underTest.onPreviewSlotSelected(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START)
+            underTest.enablePreviewMode(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START, true)
+
+            repository.setKeyguardShowing(false)
+            val endButton = collectLastValue(underTest.endButton)
+
+            val icon: Icon = mock()
+            setUpQuickAffordanceModel(
+                position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                testConfig =
+                    TestConfig(
+                        isVisible = true,
+                        isClickable = true,
+                        isActivated = true,
+                        icon = icon,
+                        canShowWhileLocked = false,
+                        intent = Intent("action"),
+                        slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                    ),
+            )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_END,
+                    testConfig =
+                        TestConfig(
+                            isVisible = true,
+                            isClickable = true,
+                            isActivated = true,
+                            icon = icon,
+                            canShowWhileLocked = false,
+                            intent = Intent("action"),
+                            slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
+                        ),
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = endButton(),
+                testConfig =
+                    TestConfig(
+                        isVisible = true,
+                        isClickable = false,
+                        isActivated = false,
+                        icon = icon,
+                        canShowWhileLocked = false,
+                        intent = Intent("action"),
+                        isDimmed = true,
+                        slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
+                    ),
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun endButton_present_visibleModel_doNothingOnClick() =
+        testScope.runTest {
+            repository.setKeyguardShowing(true)
+            val latest = collectLastValue(underTest.endButton)
+
+            val config =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = true,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent =
+                        null, // This will cause it to tell the system that the click was handled.
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_END,
+                    testConfig = config,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = config,
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun startButton_notPresent_modelIsHidden() =
+        testScope.runTest {
+            val latest = collectLastValue(underTest.startButton)
+
+            val config =
+                TestConfig(
+                    isVisible = false,
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = config,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = config,
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun animateButtonReveal() =
+        testScope.runTest {
+            repository.setKeyguardShowing(true)
+            val testConfig =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = true,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+
+            setUpQuickAffordanceModel(
+                position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                testConfig = testConfig,
+            )
+
+            val value = collectLastValue(underTest.startButton.map { it.animateReveal })
+
+            Truth.assertThat(value()).isFalse()
+            repository.setAnimateDozingTransitions(true)
+            Truth.assertThat(value()).isTrue()
+            repository.setAnimateDozingTransitions(false)
+            Truth.assertThat(value()).isFalse()
+        }
+
+    @Test
+    fun isClickable_trueWhenAlphaAtThreshold() =
+        testScope.runTest {
+            repository.setKeyguardShowing(true)
+            repository.setKeyguardAlpha(
+                KeyguardQuickAffordancesCombinedViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD
+            )
+
+            val testConfig =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = true,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = testConfig,
+                )
+
+            val latest = collectLastValue(underTest.startButton)
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = testConfig,
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun isClickable_trueWhenAlphaAboveThreshold() =
+        testScope.runTest {
+            repository.setKeyguardShowing(true)
+            val latest = collectLastValue(underTest.startButton)
+            repository.setKeyguardAlpha(
+                min(
+                    1f,
+                    KeyguardQuickAffordancesCombinedViewModel
+                        .AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD + 0.1f
+                ),
+            )
+
+            val testConfig =
+                TestConfig(
+                    isVisible = true,
+                    isClickable = true,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = testConfig,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = testConfig,
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun isClickable_falseWhenAlphaBelowThreshold() =
+        testScope.runTest {
+            intendedAlphaMutableStateFlow.value =
+                KeyguardQuickAffordancesCombinedViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD -
+                    .1f
+            // the viewModel does a `map { 1 - it }` on this value, which is why it's different
+            intendedShadeAlphaMutableStateFlow.value =
+                KeyguardQuickAffordancesCombinedViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD +
+                    .1f
+            repository.setKeyguardShowing(true)
+            val latest = collectLastValue(underTest.startButton)
+
+            val testConfig =
+                TestConfig(
+                    isVisible = false,
+                    isClickable = false,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = testConfig,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = testConfig,
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun isClickable_falseWhenAlphaAtZero() =
+        testScope.runTest {
+            intendedAlphaMutableStateFlow.value = 0f
+            intendedShadeAlphaMutableStateFlow.value = 1f
+            repository.setKeyguardShowing(true)
+            val latest = collectLastValue(underTest.startButton)
+
+            val testConfig =
+                TestConfig(
+                    isVisible = false,
+                    isClickable = false,
+                    icon = mock(),
+                    canShowWhileLocked = false,
+                    intent = Intent("action"),
+                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+                )
+            val configKey =
+                setUpQuickAffordanceModel(
+                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
+                    testConfig = testConfig,
+                )
+
+            assertQuickAffordanceViewModel(
+                viewModel = latest(),
+                testConfig = testConfig,
+                configKey = configKey,
+            )
+        }
+
+    @Test
+    fun shadeExpansionAlpha_changes_whenOnLockscreen() =
+        testScope.runTest {
+            kosmos.setTransition(
+                sceneTransition = Idle(Scenes.Lockscreen),
+                stateTransition = TransitionStep(from = AOD, to = LOCKSCREEN)
+            )
+            intendedShadeAlphaMutableStateFlow.value = 0.25f
+            val underTest = collectLastValue(underTest.transitionAlpha)
+            assertEquals(0.75f, underTest())
+
+            intendedShadeAlphaMutableStateFlow.value = 0.3f
+            assertEquals(0.7f, underTest())
+        }
+
+    @Test
+    fun shadeExpansionAlpha_alwaysZero_whenNotOnLockscreen() =
+        testScope.runTest {
+            kosmos.setTransition(
+                sceneTransition = Idle(Scenes.Gone),
+                stateTransition = TransitionStep(from = AOD, to = GONE)
+            )
+            intendedShadeAlphaMutableStateFlow.value = 0.5f
+            val underTest = collectLastValue(underTest.transitionAlpha)
+            assertEquals(0f, underTest())
+
+            intendedShadeAlphaMutableStateFlow.value = 0.25f
+            assertEquals(0f, underTest())
+        }
+
+    private suspend fun setUpQuickAffordanceModel(
+        position: KeyguardQuickAffordancePosition,
+        testConfig: TestConfig,
+    ): String {
+        val config =
+            when (position) {
+                KeyguardQuickAffordancePosition.BOTTOM_START -> homeControlsQuickAffordanceConfig
+                KeyguardQuickAffordancePosition.BOTTOM_END -> quickAccessWalletAffordanceConfig
+            }
+
+        val lockScreenState =
+            if (testConfig.isVisible) {
+                if (testConfig.intent != null) {
+                    config.onTriggeredResult =
+                        KeyguardQuickAffordanceConfig.OnTriggeredResult.StartActivity(
+                            intent = testConfig.intent,
+                            canShowWhileLocked = testConfig.canShowWhileLocked,
+                        )
+                }
+                KeyguardQuickAffordanceConfig.LockScreenState.Visible(
+                    icon = testConfig.icon ?: error("Icon is unexpectedly null!"),
+                    activationState =
+                        when (testConfig.isActivated) {
+                            true -> ActivationState.Active
+                            false -> ActivationState.Inactive
+                        }
+                )
+            } else {
+                KeyguardQuickAffordanceConfig.LockScreenState.Hidden
+            }
+        config.setState(lockScreenState)
+        return "${position.toSlotId()}::${config.key}"
+    }
+
+    private fun assertQuickAffordanceViewModel(
+        viewModel: KeyguardQuickAffordanceViewModel?,
+        testConfig: TestConfig,
+        configKey: String,
+    ) {
+        checkNotNull(viewModel)
+        Truth.assertThat(viewModel.isVisible).isEqualTo(testConfig.isVisible)
+        Truth.assertThat(viewModel.isClickable).isEqualTo(testConfig.isClickable)
+        Truth.assertThat(viewModel.isActivated).isEqualTo(testConfig.isActivated)
+        Truth.assertThat(viewModel.isSelected).isEqualTo(testConfig.isSelected)
+        Truth.assertThat(viewModel.isDimmed).isEqualTo(testConfig.isDimmed)
+        Truth.assertThat(viewModel.slotId).isEqualTo(testConfig.slotId)
+        if (testConfig.isVisible) {
+            Truth.assertThat(viewModel.icon).isEqualTo(testConfig.icon)
+            viewModel.onClicked.invoke(
+                KeyguardQuickAffordanceViewModel.OnClickedParameters(
+                    configKey = configKey,
+                    expandable = expandable,
+                    slotId = viewModel.slotId,
+                )
+            )
+            if (testConfig.intent != null) {
+                Truth.assertThat(Mockito.mockingDetails(activityStarter).invocations).hasSize(1)
+            } else {
+                Mockito.verifyNoMoreInteractions(activityStarter)
+            }
+        } else {
+            Truth.assertThat(viewModel.isVisible).isFalse()
+        }
+    }
+
+    private data class TestConfig(
+        val isVisible: Boolean,
+        val isClickable: Boolean = false,
+        val isActivated: Boolean = false,
+        val icon: Icon? = null,
+        val canShowWhileLocked: Boolean = false,
+        val intent: Intent? = null,
+        val isSelected: Boolean = false,
+        val isDimmed: Boolean = false,
+        val slotId: String = ""
+    ) {
+        init {
+            check(!isVisible || icon != null) { "Must supply non-null icon if visible!" }
+        }
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt
index 5186536..12eadfc 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt
@@ -184,17 +184,6 @@
         }
 
     @Test
-    fun iconContainer_isVisible_bypassEnabled() =
-        testScope.runTest {
-            val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
-            runCurrent()
-            deviceEntryRepository.setBypassEnabled(true)
-            runCurrent()
-
-            assertThat(isVisible?.value).isTrue()
-        }
-
-    @Test
     fun iconContainer_isNotVisible_pulseExpanding_notBypassing() =
         testScope.runTest {
             val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
@@ -283,22 +272,23 @@
         }
 
     @Test
-    fun iconContainer_isNotVisible_bypassDisabled_onLockscreen() =
+    fun iconContainer_isNotVisible_notifsFullyHiddenThenVisible_bypassEnabled() =
         testScope.runTest {
             val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
             runCurrent()
-            keyguardTransitionRepository.sendTransitionSteps(
-                from = KeyguardState.AOD,
-                to = KeyguardState.LOCKSCREEN,
-                testScope,
-            )
             notificationsKeyguardInteractor.setPulseExpanding(false)
-            deviceEntryRepository.setBypassEnabled(false)
+            deviceEntryRepository.setBypassEnabled(true)
             whenever(dozeParameters.alwaysOn).thenReturn(true)
             whenever(dozeParameters.displayNeedsBlanking).thenReturn(false)
             notificationsKeyguardInteractor.setNotificationsFullyHidden(true)
             runCurrent()
 
+            assertThat(isVisible?.value).isTrue()
+            assertThat(isVisible?.isAnimating).isTrue()
+
+            notificationsKeyguardInteractor.setNotificationsFullyHidden(false)
+            runCurrent()
+
             assertThat(isVisible?.value).isFalse()
             assertThat(isVisible?.isAnimating).isTrue()
         }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
index e6ea64f..d0da2e9 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
@@ -89,9 +89,12 @@
     }
 
     @Test
-    fun lockscreenFadeOut() =
+    fun lockscreenFadeOut_shadeNotExpanded() =
         testScope.runTest {
             val values by collectValues(underTest.lockscreenAlpha)
+            shadeExpanded(false)
+            runCurrent()
+
             repository.sendTransitionSteps(
                 steps =
                     listOf(
@@ -104,10 +107,34 @@
                     ),
                 testScope = testScope,
             )
-            // Only 5 values should be present, since the dream overlay runs for a small fraction
-            // of the overall animation time
             assertThat(values.size).isEqualTo(5)
-            values.forEach { assertThat(it).isIn(Range.closed(0f, 1f)) }
+            assertThat(values[0]).isEqualTo(1f)
+            assertThat(values[1]).isEqualTo(1f)
+            assertThat(values[2]).isIn(Range.open(0f, 1f))
+            assertThat(values[3]).isIn(Range.open(0f, 1f))
+            assertThat(values[4]).isEqualTo(0f)
+        }
+
+    @Test
+    fun lockscreenFadeOut_shadeExpanded() =
+        testScope.runTest {
+            val values by collectValues(underTest.lockscreenAlpha)
+            shadeExpanded(true)
+            runCurrent()
+
+            repository.sendTransitionSteps(
+                steps =
+                    listOf(
+                        step(0f, TransitionState.STARTED), // Should start running here...
+                        step(0f),
+                        step(.1f),
+                        step(.4f),
+                        step(.7f), // ...up to here
+                        step(1f),
+                    ),
+                testScope = testScope,
+            )
+            values.forEach { assertThat(it).isEqualTo(0f) }
         }
 
     @Test
@@ -115,7 +142,7 @@
         testScope.runTest {
             configurationRepository.setDimensionPixelSize(
                 R.dimen.lockscreen_to_occluded_transition_lockscreen_translation_y,
-                100
+                100,
             )
             val values by collectValues(underTest.lockscreenTranslationY)
             repository.sendTransitionSteps(
@@ -138,7 +165,7 @@
         testScope.runTest {
             configurationRepository.setDimensionPixelSize(
                 R.dimen.lockscreen_to_occluded_transition_lockscreen_translation_y,
-                100
+                100,
             )
             val values by collectValues(underTest.lockscreenTranslationY)
             repository.sendTransitionSteps(
@@ -171,7 +198,7 @@
                     listOf(
                         step(0f, TransitionState.STARTED),
                         step(.5f),
-                        step(1f, TransitionState.FINISHED)
+                        step(1f, TransitionState.FINISHED),
                     ),
                 testScope = testScope,
             )
@@ -228,7 +255,7 @@
             to = KeyguardState.OCCLUDED,
             value = value,
             transitionState = state,
-            ownerName = "LockscreenToOccludedTransitionViewModelTest"
+            ownerName = "LockscreenToOccludedTransitionViewModelTest",
         )
     }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt
index a330cf0..6397979 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt
@@ -147,7 +147,7 @@
             }
         }
 
-        private fun expectedLeftDestination(
+        private fun expectedStartDestination(
             isCommunalAvailable: Boolean,
             isShadeTouchable: Boolean,
         ): SceneKey? {
@@ -246,17 +246,17 @@
                     )
                 )
 
-            val leftScene by
+            val startScene by
                 collectLastValue(
-                    (userActions?.get(Swipe.Left) as? UserActionResult.ChangeScene)?.toScene?.let {
-                        scene ->
-                        kosmos.sceneInteractor.resolveSceneFamily(scene)
-                    } ?: flowOf(null)
+                    (userActions?.get(Swipe.Start) as? UserActionResult.ChangeScene)
+                        ?.toScene
+                        ?.let { scene -> kosmos.sceneInteractor.resolveSceneFamily(scene) }
+                        ?: flowOf(null)
                 )
 
-            assertThat(leftScene)
+            assertThat(startScene)
                 .isEqualTo(
-                    expectedLeftDestination(
+                    expectedStartDestination(
                         isCommunalAvailable = isCommunalAvailable,
                         isShadeTouchable = isShadeTouchable,
                     )
@@ -303,7 +303,8 @@
                 // Top edge is not applicable in dual shade, as well as two-finger swipe.
                 assertThat(downDestination).isNull()
             } else {
-                assertThat(downDestination).isEqualTo(ShowOverlay(Overlays.NotificationsShade))
+                assertThat(downDestination)
+                    .isEqualTo(ShowOverlay(Overlays.NotificationsShade, isIrreversible = true))
                 assertThat(downDestination?.transitionKey).isNull()
             }
 
@@ -320,7 +321,7 @@
                 downWithTwoPointers -> assertThat(downFromTopRightDestination).isNull()
                 else -> {
                     assertThat(downFromTopRightDestination)
-                        .isEqualTo(ShowOverlay(Overlays.QuickSettingsShade))
+                        .isEqualTo(ShowOverlay(Overlays.QuickSettingsShade, isIrreversible = true))
                     assertThat(downFromTopRightDestination?.transitionKey).isNull()
                 }
             }
@@ -341,17 +342,17 @@
                     )
                 )
 
-            val leftScene by
+            val startScene by
                 collectLastValue(
-                    (userActions?.get(Swipe.Left) as? UserActionResult.ChangeScene)?.toScene?.let {
-                        scene ->
-                        kosmos.sceneInteractor.resolveSceneFamily(scene)
-                    } ?: flowOf(null)
+                    (userActions?.get(Swipe.Start) as? UserActionResult.ChangeScene)
+                        ?.toScene
+                        ?.let { scene -> kosmos.sceneInteractor.resolveSceneFamily(scene) }
+                        ?: flowOf(null)
                 )
 
-            assertThat(leftScene)
+            assertThat(startScene)
                 .isEqualTo(
-                    expectedLeftDestination(
+                    expectedStartDestination(
                         isCommunalAvailable = isCommunalAvailable,
                         isShadeTouchable = isShadeTouchable,
                     )
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModelTest.kt
new file mode 100644
index 0000000..0b7a38e
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModelTest.kt
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2024 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.systemui.keyguard.ui.viewmodel
+
+import android.platform.test.flag.junit.FlagsParameterization
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.flags.andSceneContainer
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.keyguard.shared.model.TransitionState
+import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
+import com.google.common.collect.Range
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
+
+@ExperimentalCoroutinesApi
+@SmallTest
+@RunWith(ParameterizedAndroidJunit4::class)
+class OffToLockscreenTransitionViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
+    val kosmos = testKosmos()
+    val testScope = kosmos.testScope
+    val repository = kosmos.fakeKeyguardTransitionRepository
+    lateinit var underTest: OffToLockscreenTransitionViewModel
+
+    companion object {
+        @JvmStatic
+        @Parameters(name = "{0}")
+        fun getParams(): List<FlagsParameterization> {
+            return FlagsParameterization.allCombinationsOf().andSceneContainer()
+        }
+    }
+
+    init {
+        mSetFlagsRule.setFlagsParameterization(flags)
+    }
+
+    @Before
+    fun setup() {
+        underTest = kosmos.offToLockscreenTransitionViewModel
+    }
+
+    @Test
+    fun lockscreenAlpha() =
+        testScope.runTest {
+            val alpha by collectLastValue(underTest.lockscreenAlpha)
+
+            repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+            repository.sendTransitionStep(step(0f))
+            assertThat(alpha).isEqualTo(0f)
+
+            repository.sendTransitionStep(step(0.66f))
+            assertThat(alpha).isIn(Range.open(.1f, .9f))
+
+            repository.sendTransitionStep(step(1f))
+            assertThat(alpha).isEqualTo(1f)
+        }
+
+    private fun step(
+        value: Float,
+        state: TransitionState = TransitionState.RUNNING,
+    ): TransitionStep {
+        return TransitionStep(
+            from = KeyguardState.OFF,
+            to = KeyguardState.LOCKSCREEN,
+            value = value,
+            transitionState = state,
+            ownerName = "OffToLockscreenTransitionViewModelTest",
+        )
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/log/table/LogDiffsForTableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/log/table/LogDiffsForTableTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/log/table/LogDiffsForTableTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/log/table/LogDiffsForTableTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/log/table/TableLogBufferFactoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/log/table/TableLogBufferFactoryTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/log/table/TableLogBufferFactoryTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/log/table/TableLogBufferFactoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/log/table/TableLogBufferTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/log/table/TableLogBufferTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/log/table/TableLogBufferTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/log/table/TableLogBufferTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataLoaderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataLoaderTest.kt
index 7da2e9a..fc9e595 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataLoaderTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataLoaderTest.kt
@@ -408,6 +408,40 @@
             verify(mockImageLoader, times(1)).loadBitmap(any(), anyInt(), anyInt(), anyInt())
         }
 
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    fun testLoadMediaDataInBg_fromResumeToActive_doesNotCancelResumeToActiveTask() =
+        testScope.runTest {
+            val mockImageLoader = mock<ImageLoader>()
+            val mediaDataLoader =
+                MediaDataLoader(
+                    context,
+                    testDispatcher,
+                    testScope,
+                    mediaControllerFactory,
+                    mediaFlags,
+                    mockImageLoader,
+                    statusBarManager,
+                )
+            metadataBuilder.putString(
+                MediaMetadata.METADATA_KEY_ALBUM_ART_URI,
+                "content://album_art_uri",
+            )
+
+            testScope.launch {
+                mediaDataLoader.loadMediaData(
+                    KEY,
+                    createMediaNotification(),
+                    isConvertingToActive = true,
+                )
+            }
+            testScope.launch { mediaDataLoader.loadMediaData(KEY, createMediaNotification()) }
+            testScope.launch { mediaDataLoader.loadMediaData(KEY, createMediaNotification()) }
+            testScope.advanceUntilIdle()
+
+            verify(mockImageLoader, times(2)).loadBitmap(any(), anyInt(), anyInt(), anyInt())
+        }
+
     private fun createMediaNotification(
         mediaSession: MediaSession? = session,
         applicationInfo: ApplicationInfo? = null,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt
index 3e3aa4f..e12c67b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt
@@ -18,7 +18,7 @@
 import com.android.wm.shell.recents.RecentTasks
 import com.android.wm.shell.shared.GroupedRecentTaskInfo
 import com.android.wm.shell.shared.split.SplitBounds
-import com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_50_50
+import com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50
 import com.google.common.truth.Truth.assertThat
 import java.util.Optional
 import java.util.function.Consumer
@@ -268,7 +268,7 @@
         GroupedRecentTaskInfo.forSplitTasks(
             createTaskInfo(taskId1, userId1, isVisible),
             createTaskInfo(taskId2, userId2, isVisible),
-            SplitBounds(Rect(), Rect(), taskId1, taskId2, SNAP_TO_50_50)
+            SplitBounds(Rect(), Rect(), taskId1, taskId2, SNAP_TO_2_50_50)
         )
 
     private fun createTaskInfo(taskId: Int, userId: Int, isVisible: Boolean = false) =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/mediaprojection/taskswitcher/MediaProjectionTaskSwitcherCoreStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/mediaprojection/taskswitcher/MediaProjectionTaskSwitcherCoreStartableTest.kt
new file mode 100644
index 0000000..82fc0b5
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/mediaprojection/taskswitcher/MediaProjectionTaskSwitcherCoreStartableTest.kt
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2023 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.systemui.mediaprojection.taskswitcher
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.Flags.FLAG_PSS_TASK_SWITCHER
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.mediaprojection.taskswitcher.ui.TaskSwitcherNotificationCoordinator
+import com.android.systemui.util.mockito.mock
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class MediaProjectionTaskSwitcherCoreStartableTest : SysuiTestCase() {
+
+    private val coordinator = mock<TaskSwitcherNotificationCoordinator>()
+
+    private val coreStartable =
+        MediaProjectionTaskSwitcherCoreStartable(notificationCoordinatorLazy = { coordinator })
+
+    @Test
+    fun start_flagEnabled_startsCoordinator() {
+        mSetFlagsRule.enableFlags(FLAG_PSS_TASK_SWITCHER)
+
+        coreStartable.start()
+
+        verify(coordinator).start()
+    }
+
+    @Test
+    fun start_flagDisabled_doesNotStartCoordinator() {
+        mSetFlagsRule.disableFlags(FLAG_PSS_TASK_SWITCHER)
+
+        coreStartable.start()
+
+        verifyNoMoreInteractions(coordinator)
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/taskswitcher/ui/viewmodel/TaskSwitcherNotificationViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/mediaprojection/taskswitcher/ui/viewmodel/TaskSwitcherNotificationViewModelTest.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/mediaprojection/taskswitcher/ui/viewmodel/TaskSwitcherNotificationViewModelTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/mediaprojection/taskswitcher/ui/viewmodel/TaskSwitcherNotificationViewModelTest.kt
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepositoryTest.kt
new file mode 100644
index 0000000..77be8c7
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepositoryTest.kt
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2024 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.systemui.mediarouter.data.repository
+
+import androidx.test.filters.SmallTest
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.statusbar.policy.CastDevice
+import com.android.systemui.statusbar.policy.fakeCastController
+import com.google.common.truth.Truth.assertThat
+import kotlin.test.Test
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.runner.RunWith
+
+@SmallTest
+@OptIn(ExperimentalCoroutinesApi::class)
+@RunWith(AndroidJUnit4::class)
+class MediaRouterRepositoryTest : SysuiTestCase() {
+    val kosmos = Kosmos()
+    val testScope = kosmos.testScope
+    val castController = kosmos.fakeCastController
+
+    val underTest = kosmos.realMediaRouterRepository
+
+    @Test
+    fun castDevices_empty_isEmpty() =
+        testScope.runTest {
+            val latest by collectLastValue(underTest.castDevices)
+            // Required to let the listener attach before the devices get set
+            runCurrent()
+
+            castController.castDevices = emptyList()
+
+            assertThat(latest).isEmpty()
+        }
+
+    @Test
+    fun castDevices_onlyIncludesMediaRouterOriginDevices() =
+        testScope.runTest {
+            val latest by collectLastValue(underTest.castDevices)
+            // Required to let the listener attach before the devices get set
+            runCurrent()
+
+            val projectionDevice =
+                CastDevice(
+                    id = "idProjection",
+                    name = "name",
+                    description = "desc",
+                    state = CastDevice.CastState.Connected,
+                    origin = CastDevice.CastOrigin.MediaProjection,
+                )
+            val routerDevice1 =
+                CastDevice(
+                    id = "idRouter1",
+                    name = "name",
+                    description = "desc",
+                    state = CastDevice.CastState.Connected,
+                    origin = CastDevice.CastOrigin.MediaRouter,
+                )
+
+            val routerDevice2 =
+                CastDevice(
+                    id = "idRouter2",
+                    name = "name",
+                    description = "desc",
+                    state = CastDevice.CastState.Connected,
+                    origin = CastDevice.CastOrigin.MediaRouter,
+                )
+            castController.setCastDevices(listOf(projectionDevice, routerDevice1, routerDevice2))
+
+            assertThat(latest).containsExactly(routerDevice1, routerDevice2).inOrder()
+        }
+
+    @Test
+    fun stopCasting_notifiesCastController() {
+        val device =
+            CastDevice(
+                id = "id",
+                name = "name",
+                description = "desc",
+                state = CastDevice.CastState.Connected,
+                origin = CastDevice.CastOrigin.MediaRouter,
+            )
+
+        underTest.stopCasting(device)
+
+        assertThat(castController.lastStoppedDevice).isEqualTo(device)
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModelTest.kt
index 88a1df1..ada2138 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModelTest.kt
@@ -16,46 +16,130 @@
 
 package com.android.systemui.notifications.ui.viewmodel
 
+import android.platform.test.annotations.EnableFlags
 import android.testing.TestableLooper
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.authentication.data.repository.FakeAuthenticationRepository
+import com.android.systemui.authentication.domain.interactor.AuthenticationResult
+import com.android.systemui.authentication.domain.interactor.authenticationInteractor
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.flags.EnableSceneContainer
 import com.android.systemui.kosmos.testScope
+import com.android.systemui.lifecycle.activateIn
+import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
+import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
+import com.android.systemui.power.domain.interactor.powerInteractor
 import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.domain.startable.sceneContainerStartable
 import com.android.systemui.scene.shared.model.Overlays
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.shade.domain.interactor.shadeInteractor
+import com.android.systemui.shade.shared.flag.DualShade
 import com.android.systemui.shade.ui.viewmodel.notificationsShadeOverlayContentViewModel
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
+import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 @TestableLooper.RunWithLooper
 @EnableSceneContainer
+@EnableFlags(DualShade.FLAG_NAME)
 class NotificationsShadeOverlayContentViewModelTest : SysuiTestCase() {
 
     private val kosmos = testKosmos()
     private val testScope = kosmos.testScope
     private val sceneInteractor = kosmos.sceneInteractor
 
-    private val underTest = kosmos.notificationsShadeOverlayContentViewModel
+    private val underTest by lazy { kosmos.notificationsShadeOverlayContentViewModel }
+
+    @Before
+    fun setUp() {
+        kosmos.sceneContainerStartable.start()
+        underTest.activateIn(testScope)
+    }
 
     @Test
     fun onScrimClicked_hidesShade() =
         testScope.runTest {
             val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
-            sceneInteractor.showOverlay(
-                overlay = Overlays.NotificationsShade,
-                loggingReason = "test",
-            )
+            sceneInteractor.showOverlay(Overlays.NotificationsShade, "test")
             assertThat(currentOverlays).contains(Overlays.NotificationsShade)
 
             underTest.onScrimClicked()
 
             assertThat(currentOverlays).doesNotContain(Overlays.NotificationsShade)
         }
+
+    @Test
+    fun deviceLocked_hidesShade() =
+        testScope.runTest {
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            unlockDevice()
+            sceneInteractor.showOverlay(Overlays.NotificationsShade, "test")
+            assertThat(currentOverlays).contains(Overlays.NotificationsShade)
+
+            lockDevice()
+
+            assertThat(currentOverlays).doesNotContain(Overlays.NotificationsShade)
+        }
+
+    @Test
+    fun bouncerShown_hidesShade() =
+        testScope.runTest {
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            lockDevice()
+            sceneInteractor.showOverlay(Overlays.NotificationsShade, "test")
+            assertThat(currentOverlays).contains(Overlays.NotificationsShade)
+
+            sceneInteractor.changeScene(Scenes.Bouncer, "test")
+            runCurrent()
+
+            assertThat(currentOverlays).doesNotContain(Overlays.NotificationsShade)
+        }
+
+    @Test
+    fun shadeNotTouchable_hidesShade() =
+        testScope.runTest {
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            val isShadeTouchable by collectLastValue(kosmos.shadeInteractor.isShadeTouchable)
+            assertThat(isShadeTouchable).isTrue()
+            sceneInteractor.showOverlay(Overlays.NotificationsShade, "test")
+            assertThat(currentOverlays).contains(Overlays.NotificationsShade)
+
+            lockDevice()
+            assertThat(isShadeTouchable).isFalse()
+            assertThat(currentOverlays).doesNotContain(Overlays.NotificationsShade)
+        }
+
+    private fun TestScope.lockDevice() {
+        val currentScene by collectLastValue(sceneInteractor.currentScene)
+        kosmos.powerInteractor.setAsleepForTest()
+        runCurrent()
+
+        assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+    }
+
+    private suspend fun TestScope.unlockDevice() {
+        val currentScene by collectLastValue(sceneInteractor.currentScene)
+        kosmos.powerInteractor.setAwakeForTest()
+        runCurrent()
+        assertThat(
+                kosmos.authenticationInteractor.authenticate(
+                    FakeAuthenticationRepository.DEFAULT_PIN
+                )
+            )
+            .isEqualTo(AuthenticationResult.SUCCEEDED)
+
+        assertThat(currentScene).isEqualTo(Scenes.Gone)
+    }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSFooterViewControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSFooterViewControllerTest.java
new file mode 100644
index 0000000..93dede5
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSFooterViewControllerTest.java
@@ -0,0 +1,159 @@
+/*
+ * 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.systemui.qs;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.testing.TestableLooper;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.res.R;
+import com.android.systemui.retail.data.repository.FakeRetailModeRepository;
+import com.android.systemui.retail.domain.interactor.RetailModeInteractorImpl;
+import com.android.systemui.settings.UserTracker;
+import com.android.systemui.utils.leaks.LeakCheckedTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+@TestableLooper.RunWithLooper
+@SmallTest
+public class QSFooterViewControllerTest extends LeakCheckedTest {
+
+    @Mock
+    private QSFooterView mView;
+    @Mock
+    private UserTracker mUserTracker;
+    @Mock
+    private QSPanelController mQSPanelController;
+    @Mock
+    private ClipboardManager mClipboardManager;
+    @Mock
+    private TextView mBuildText;
+    @Mock
+    private FalsingManager mFalsingManager;
+    @Mock
+    private ActivityStarter mActivityStarter;
+
+    private FakeRetailModeRepository mRetailModeRepository;
+
+    private QSFooterViewController mController;
+    private View mEditButton;
+
+    @Before
+    public void setup() throws Exception {
+        MockitoAnnotations.initMocks(this);
+
+        mRetailModeRepository = new FakeRetailModeRepository();
+        mRetailModeRepository.setRetailMode(false);
+
+        mEditButton = new View(mContext);
+
+        injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
+
+        mContext.addMockSystemService(ClipboardManager.class, mClipboardManager);
+
+        when(mView.getContext()).thenReturn(mContext);
+        when(mView.getResources()).thenReturn(mContext.getResources());
+        when(mUserTracker.getUserContext()).thenReturn(mContext);
+
+        when(mView.isAttachedToWindow()).thenReturn(true);
+        when(mView.findViewById(R.id.build)).thenReturn(mBuildText);
+        when(mView.findViewById(android.R.id.edit)).thenReturn(mEditButton);
+
+        mController = new QSFooterViewController(mView, mUserTracker, mFalsingManager,
+                mActivityStarter, mQSPanelController,
+                new RetailModeInteractorImpl(mRetailModeRepository));
+
+        mController.init();
+    }
+
+    @Test
+    public void testBuildTextCopy() {
+        String text = "TEST";
+        ArgumentCaptor<View.OnLongClickListener> onLongClickCaptor =
+                ArgumentCaptor.forClass(View.OnLongClickListener.class);
+
+        verify(mBuildText).setOnLongClickListener(onLongClickCaptor.capture());
+
+        when(mBuildText.getText()).thenReturn(text);
+        onLongClickCaptor.getValue().onLongClick(mBuildText);
+
+        ArgumentCaptor<ClipData> captor = ArgumentCaptor.forClass(ClipData.class);
+        verify(mClipboardManager).setPrimaryClip(captor.capture());
+        assertThat(captor.getValue().getItemAt(0).getText()).isEqualTo(text);
+    }
+
+    @Test
+    public void testEditButton_falseTap() {
+        when(mFalsingManager.isFalseTap(anyInt())).thenReturn(true);
+
+        mEditButton.performClick();
+
+        verify(mQSPanelController, never()).showEdit(any());
+        verifyNoMoreInteractions(mActivityStarter);
+    }
+
+    @Test
+    public void testEditButton_realTap() {
+        when(mFalsingManager.isFalseTap(anyInt())).thenReturn(false);
+
+        mEditButton.performClick();
+
+        ArgumentCaptor<Runnable> captor = ArgumentCaptor.forClass(Runnable.class);
+
+        verify(mActivityStarter).postQSRunnableDismissingKeyguard(captor.capture());
+        captor.getValue().run();
+        verify(mQSPanelController).showEdit(mEditButton);
+    }
+
+    @Test
+    public void testEditButton_notRetailMode_visible() {
+        mRetailModeRepository.setRetailMode(false);
+
+        mController.setVisibility(View.VISIBLE);
+        assertThat(mEditButton.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void testEditButton_retailMode_notVisible() {
+        mRetailModeRepository.setRetailMode(true);
+
+        mController.setVisibility(View.VISIBLE);
+        assertThat(mEditButton.getVisibility()).isEqualTo(View.GONE);
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSImplTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSImplTest.java
new file mode 100644
index 0000000..fe1b963
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSImplTest.java
@@ -0,0 +1,716 @@
+/*
+ * Copyright (C) 2023 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.systemui.qs;
+
+import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
+
+import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
+import static com.android.systemui.statusbar.StatusBarState.SHADE;
+import static com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.testing.TestableLooper.RunWithLooper;
+import android.view.Display;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import androidx.compose.ui.platform.ComposeView;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import com.android.keyguard.BouncerPanelExpansionCalculator;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.dump.DumpManager;
+import com.android.systemui.flags.EnableSceneContainer;
+import com.android.systemui.media.controls.ui.view.MediaHost;
+import com.android.systemui.qs.customize.QSCustomizerController;
+import com.android.systemui.qs.dagger.QSComponent;
+import com.android.systemui.qs.external.TileServiceRequestController;
+import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel;
+import com.android.systemui.qs.logging.QSLogger;
+import com.android.systemui.res.R;
+import com.android.systemui.settings.FakeDisplayTracker;
+import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.phone.KeyguardBypassController;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
+import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController;
+import com.android.systemui.util.animation.UniqueObjectHostView;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+@RunWithLooper(setAsMainLooper = true)
+@SmallTest
+public class QSImplTest extends SysuiTestCase {
+
+    @Mock private QSComponent mQsComponent;
+    @Mock private QSPanelController mQSPanelController;
+    @Mock private MediaHost mQSMediaHost;
+    @Mock private MediaHost mQQSMediaHost;
+    @Mock private KeyguardBypassController mBypassController;
+    @Mock private TileServiceRequestController.Builder mTileServiceRequestControllerBuilder;
+    @Mock private TileServiceRequestController mTileServiceRequestController;
+    @Mock private QSCustomizerController mQsCustomizerController;
+    @Mock private QuickQSPanelController mQuickQSPanelController;
+    @Mock private FooterActionsController mQSFooterActionController;
+    @Mock private QSContainerImplController mQSContainerImplController;
+    @Mock private QSContainerImpl mContainer;
+    @Mock private QSFooter mFooter;
+    @Mock private LayoutInflater mLayoutInflater;
+    @Mock private NonInterceptingScrollView mQSPanelScrollView;
+    @Mock private QuickStatusBarHeader mHeader;
+    @Mock private QSPanel.QSTileLayout mQsTileLayout;
+    @Mock private QSPanel.QSTileLayout mQQsTileLayout;
+    @Mock private QSAnimator mQSAnimator;
+    @Mock private SysuiStatusBarStateController mStatusBarStateController;
+    @Mock private QSSquishinessController mSquishinessController;
+    @Mock private FooterActionsViewModel mFooterActionsViewModel;
+    @Mock private FooterActionsViewModel.Factory mFooterActionsViewModelFactory;
+    @Mock private LargeScreenShadeInterpolator mLargeScreenShadeInterpolator;
+    private ViewGroup mQsView;
+
+    private final CommandQueue mCommandQueue =
+            new CommandQueue(mContext, new FakeDisplayTracker(mContext));
+
+    private QSImpl mUnderTest;
+
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+
+        mUnderTest = instantiate();
+
+        mUnderTest.onComponentCreated(mQsComponent, null);
+    }
+
+    /*
+     * Regression test for b/303180152.
+     */
+    @Test
+    public void testDisableCallbackOnDisabledQuickSettingsUponCreationDoesntCrash() {
+        QSImpl other = instantiate();
+        mCommandQueue.disable(Display.DEFAULT_DISPLAY, 0, DISABLE2_QUICK_SETTINGS);
+
+        other.onComponentCreated(mQsComponent, null);
+    }
+
+    @Test
+    public void testSaveState() {
+        mUnderTest.setListening(true);
+        mUnderTest.setExpanded(true);
+        mUnderTest.setQsVisible(true);
+
+        Bundle bundle = new Bundle();
+        mUnderTest.onSaveInstanceState(bundle);
+
+        // Get a new instance
+        QSImpl other = instantiate();
+        other.onComponentCreated(mQsComponent, bundle);
+
+        assertTrue(other.isListening());
+        assertTrue(other.isExpanded());
+        assertTrue(other.isQsVisible());
+    }
+
+    @Test
+    public void transitionToFullShade_smallScreen_alphaAlways1() {
+        setIsSmallScreen();
+        setStatusBarCurrentAndUpcomingState(StatusBarState.SHADE);
+        boolean isTransitioningToFullShade = true;
+        float transitionProgress = 0.5f;
+        float squishinessFraction = 0.5f;
+
+        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
+                squishinessFraction);
+
+        assertThat(mQsView.getAlpha()).isEqualTo(1f);
+    }
+
+    @Test
+    public void transitionToFullShade_largeScreen_alphaLargeScreenShadeInterpolator() {
+        setIsLargeScreen();
+        setStatusBarCurrentAndUpcomingState(StatusBarState.SHADE);
+        boolean isTransitioningToFullShade = true;
+        float transitionProgress = 0.5f;
+        float squishinessFraction = 0.5f;
+        when(mLargeScreenShadeInterpolator.getQsAlpha(transitionProgress)).thenReturn(123f);
+
+        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
+                squishinessFraction);
+
+        assertThat(mQsView.getAlpha()).isEqualTo(123f);
+    }
+
+    @Test
+    public void
+            transitionToFullShade_onKeyguard_noBouncer_setsAlphaUsingLinearInterpolator() {
+        setStatusBarCurrentAndUpcomingState(KEYGUARD);
+        when(mQSPanelController.isBouncerInTransit()).thenReturn(false);
+        boolean isTransitioningToFullShade = true;
+        float transitionProgress = 0.5f;
+        float squishinessFraction = 0.5f;
+
+        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
+                squishinessFraction);
+
+        assertThat(mQsView.getAlpha()).isEqualTo(transitionProgress);
+    }
+
+    @Test
+    public void
+            transitionToFullShade_onKeyguard_bouncerActive_setsAlphaUsingBouncerInterpolator() {
+        setStatusBarCurrentAndUpcomingState(KEYGUARD);
+        when(mQSPanelController.isBouncerInTransit()).thenReturn(true);
+        boolean isTransitioningToFullShade = true;
+        float transitionProgress = 0.5f;
+        float squishinessFraction = 0.5f;
+
+        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
+                squishinessFraction);
+
+        assertThat(mQsView.getAlpha())
+                .isEqualTo(
+                        BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(
+                                transitionProgress));
+    }
+
+    @Test
+    public void transitionToFullShade_inFullWidth_alwaysSetsAlphaTo1() {
+        mUnderTest.setIsNotificationPanelFullWidth(true);
+
+        boolean isTransitioningToFullShade = true;
+        float transitionProgress = 0.1f;
+        float squishinessFraction = 0.5f;
+        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
+                squishinessFraction);
+        assertThat(mQsView.getAlpha()).isEqualTo(1);
+
+        transitionProgress = 0.5f;
+        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
+                squishinessFraction);
+        assertThat(mQsView.getAlpha()).isEqualTo(1);
+        assertThat(mQsView.getAlpha()).isEqualTo(1);
+
+        transitionProgress = 0.7f;
+        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
+                squishinessFraction);
+        assertThat(mQsView.getAlpha()).isEqualTo(1);
+    }
+
+    @Test
+    public void transitionToFullShade_setsSquishinessOnController() {
+        boolean isTransitioningToFullShade = true;
+        float transitionProgress = 0.123f;
+        float squishinessFraction = 0.456f;
+
+        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
+                squishinessFraction);
+
+        verify(mQsComponent.getQSSquishinessController()).setSquishiness(squishinessFraction);
+    }
+
+    @Test
+    public void setQsExpansion_whenShouldUpdateSquishinessTrue_setsSquishinessBasedOnFraction() {
+        enableSplitShade();
+        when(mStatusBarStateController.getState()).thenReturn(KEYGUARD);
+        float expansion = 0.456f;
+        float panelExpansionFraction = 0.678f;
+        float proposedTranslation = 567f;
+        float squishinessFraction = 0.789f;
+
+        mUnderTest.setShouldUpdateSquishinessOnMedia(true);
+        mUnderTest.setQsExpansion(expansion, panelExpansionFraction, proposedTranslation,
+                squishinessFraction);
+
+        verify(mQSMediaHost).setSquishFraction(squishinessFraction);
+    }
+
+    @Test
+    public void setQsExpansion_whenOnKeyguardAndShouldUpdateSquishinessFalse_setsSquishiness() {
+        // Random test values without any meaning. They just have to be different from each other.
+        float expansion = 0.123f;
+        float panelExpansionFraction = 0.321f;
+        float proposedTranslation = 456f;
+        float squishinessFraction = 0.567f;
+
+        enableSplitShade();
+        setStatusBarCurrentAndUpcomingState(KEYGUARD);
+        mUnderTest.setShouldUpdateSquishinessOnMedia(false);
+        mUnderTest.setQsExpansion(expansion, panelExpansionFraction, proposedTranslation,
+                squishinessFraction);
+
+        verify(mQSMediaHost).setSquishFraction(1.0f);
+    }
+
+    @Test
+    public void setQsExpansion_inSplitShade_setsFooterActionsExpansion_basedOnPanelExpFraction() {
+        // Random test values without any meaning. They just have to be different from each other.
+        float expansion = 0.123f;
+        float panelExpansionFraction = 0.321f;
+        float proposedTranslation = 456f;
+        float squishinessFraction = 0.987f;
+
+        enableSplitShade();
+
+        mUnderTest.setQsExpansion(expansion, panelExpansionFraction, proposedTranslation,
+                squishinessFraction);
+
+        verify(mFooterActionsViewModel).onQuickSettingsExpansionChanged(
+                panelExpansionFraction, /* isInSplitShade= */ true);
+    }
+
+    @Test
+    public void setQsExpansion_notInSplitShade_setsFooterActionsExpansion_basedOnExpansion() {
+        // Random test values without any meaning. They just have to be different from each other.
+        float expansion = 0.123f;
+        float panelExpansionFraction = 0.321f;
+        float proposedTranslation = 456f;
+        float squishinessFraction = 0.987f;
+
+        disableSplitShade();
+
+        mUnderTest.setQsExpansion(expansion, panelExpansionFraction, proposedTranslation,
+                squishinessFraction);
+
+        verify(mFooterActionsViewModel).onQuickSettingsExpansionChanged(
+                expansion, /* isInSplitShade= */ false);
+    }
+
+    @Test
+    public void setQsExpansion_inSplitShade_whenTransitioningToKeyguard_setsAlphaBasedOnShadeTransitionProgress() {
+        enableSplitShade();
+        when(mStatusBarStateController.getState()).thenReturn(SHADE);
+        when(mStatusBarStateController.getCurrentOrUpcomingState()).thenReturn(KEYGUARD);
+        boolean isTransitioningToFullShade = false;
+        float transitionProgress = 0;
+        float squishinessFraction = 0f;
+
+        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
+                squishinessFraction);
+
+        // trigger alpha refresh with non-zero expansion and fraction values
+        mUnderTest.setQsExpansion(/* expansion= */ 1, /* panelExpansionFraction= */1,
+                /* proposedTranslation= */ 0, /* squishinessFraction= */ 1);
+
+        // alpha should follow lockscreen to shade progress, not panel expansion fraction
+        assertThat(mQsView.getAlpha()).isEqualTo(transitionProgress);
+    }
+
+    @Test
+    public void getQsMinExpansionHeight_notInSplitShade_returnsHeaderHeight() {
+        disableSplitShade();
+        when(mHeader.getHeight()).thenReturn(1234);
+
+        int height = mUnderTest.getQsMinExpansionHeight();
+
+        assertThat(height).isEqualTo(mHeader.getHeight());
+    }
+
+    @Test
+    public void getQsMinExpansionHeight_inSplitShade_returnsAbsoluteBottomOfQSContainer() {
+        int top = 1234;
+        int height = 9876;
+        enableSplitShade();
+        setLocationOnScreen(mQsView, top);
+        when(mQsView.getHeight()).thenReturn(height);
+
+        int expectedHeight = top + height;
+        assertThat(mUnderTest.getQsMinExpansionHeight()).isEqualTo(expectedHeight);
+    }
+
+    @Test
+    public void getQsMinExpansionHeight_inSplitShade_returnsAbsoluteBottomExcludingTranslation() {
+        int top = 1234;
+        int height = 9876;
+        float translationY = -600f;
+        enableSplitShade();
+        setLocationOnScreen(mQsView, (int) (top + translationY));
+        when(mQsView.getHeight()).thenReturn(height);
+        when(mQsView.getTranslationY()).thenReturn(translationY);
+
+        int expectedHeight = top + height;
+        assertThat(mUnderTest.getQsMinExpansionHeight()).isEqualTo(expectedHeight);
+    }
+
+    @Test
+    public void hideImmediately_notInSplitShade_movesViewUpByHeaderHeight() {
+        disableSplitShade();
+        when(mHeader.getHeight()).thenReturn(555);
+
+        mUnderTest.hideImmediately();
+
+        assertThat(mQsView.getY()).isEqualTo(-mHeader.getHeight());
+    }
+
+    @Test
+    public void hideImmediately_inSplitShade_movesViewUpByQSAbsoluteBottom() {
+        enableSplitShade();
+        int top = 1234;
+        int height = 9876;
+        setLocationOnScreen(mQsView, top);
+        when(mQsView.getHeight()).thenReturn(height);
+
+        mUnderTest.hideImmediately();
+
+        int qsAbsoluteBottom = top + height;
+        assertThat(mQsView.getY()).isEqualTo(-qsAbsoluteBottom);
+    }
+
+    @Test
+    public void setCollapseExpandAction_passedToControllers() {
+        Runnable action = () -> {};
+        mUnderTest.setCollapseExpandAction(action);
+
+        verify(mQSPanelController).setCollapseExpandAction(action);
+        verify(mQuickQSPanelController).setCollapseExpandAction(action);
+    }
+
+    @Test
+    public void setOverScrollAmount_setsTranslationOnView() {
+        mUnderTest.setOverScrollAmount(123);
+
+        assertThat(mQsView.getTranslationY()).isEqualTo(123);
+    }
+
+    @Test
+    public void setOverScrollAmount_beforeViewCreated_translationIsNotSet() {
+        QSImpl other = instantiate();
+        other.setOverScrollAmount(123);
+
+        assertThat(mQsView.getTranslationY()).isEqualTo(0);
+    }
+
+    private Lifecycle.State getListeningAndVisibilityLifecycleState() {
+        return mUnderTest
+                .getListeningAndVisibilityLifecycleOwner()
+                .getLifecycle()
+                .getCurrentState();
+    }
+
+    @Test
+    public void setListeningFalse_notVisible() {
+        mUnderTest.setQsVisible(false);
+        clearInvocations(mQSContainerImplController, mQSPanelController, mQSFooterActionController);
+
+        mUnderTest.setListening(false);
+        verify(mQSContainerImplController).setListening(false);
+        assertThat(getListeningAndVisibilityLifecycleState()).isEqualTo(Lifecycle.State.CREATED);
+        verify(mQSPanelController).setListening(eq(false), anyBoolean());
+    }
+
+    @Test
+    public void setListeningTrue_notVisible() {
+        mUnderTest.setQsVisible(false);
+        clearInvocations(mQSContainerImplController, mQSPanelController, mQSFooterActionController);
+
+        mUnderTest.setListening(true);
+        verify(mQSContainerImplController).setListening(false);
+        assertThat(getListeningAndVisibilityLifecycleState()).isEqualTo(Lifecycle.State.STARTED);
+        verify(mQSPanelController).setListening(eq(false), anyBoolean());
+    }
+
+    @Test
+    public void setListeningFalse_visible() {
+        mUnderTest.setQsVisible(true);
+        clearInvocations(mQSContainerImplController, mQSPanelController, mQSFooterActionController);
+
+        mUnderTest.setListening(false);
+        verify(mQSContainerImplController).setListening(false);
+        assertThat(getListeningAndVisibilityLifecycleState()).isEqualTo(Lifecycle.State.CREATED);
+        verify(mQSPanelController).setListening(eq(false), anyBoolean());
+    }
+
+    @Test
+    public void setListeningTrue_visible() {
+        mUnderTest.setQsVisible(true);
+        clearInvocations(mQSContainerImplController, mQSPanelController, mQSFooterActionController);
+
+        mUnderTest.setListening(true);
+        verify(mQSContainerImplController).setListening(true);
+        assertThat(getListeningAndVisibilityLifecycleState()).isEqualTo(Lifecycle.State.RESUMED);
+        verify(mQSPanelController).setListening(eq(true), anyBoolean());
+    }
+
+    @Test
+    public void passCorrectExpansionState_inSplitShade() {
+        enableSplitShade();
+        clearInvocations(mQSPanelController);
+
+        mUnderTest.setExpanded(true);
+        verify(mQSPanelController).setExpanded(true);
+
+        mUnderTest.setExpanded(false);
+        verify(mQSPanelController).setExpanded(false);
+    }
+
+    @Test
+    public void startsListeningAfterStateChangeToExpanded_inSplitShade() {
+        enableSplitShade();
+        mUnderTest.setQsVisible(true);
+        clearInvocations(mQSPanelController);
+
+        mUnderTest.setExpanded(true);
+        verify(mQSPanelController).setListening(true, true);
+    }
+
+    @Test
+    public void testUpdateQSBounds_setMediaClipCorrectly() {
+        disableSplitShade();
+
+        Rect mediaHostClip = new Rect();
+        when(mQSPanelController.getPaddingBottom()).thenReturn(50);
+        setLocationOnScreen(mQSPanelScrollView, 25);
+        when(mQSPanelScrollView.getMeasuredHeight()).thenReturn(200);
+        when(mQSMediaHost.getCurrentClipping()).thenReturn(mediaHostClip);
+
+        mUnderTest.updateQsBounds();
+
+        assertEquals(25, mediaHostClip.top);
+        assertEquals(175, mediaHostClip.bottom);
+    }
+
+    @Test
+    public void testQsUpdatesQsAnimatorWithUpcomingState() {
+        setStatusBarCurrentAndUpcomingState(SHADE);
+        mUnderTest.onUpcomingStateChanged(KEYGUARD);
+
+        verify(mQSAnimator).setOnKeyguard(true);
+    }
+
+    @Test
+    @EnableSceneContainer
+    public void testSceneContainerFlagsEnabled_FooterActionsRemoved_controllerNotStarted() {
+        clearInvocations(mFooterActionsViewModel, mFooterActionsViewModelFactory);
+        QSImpl other = instantiate();
+
+        other.onComponentCreated(mQsComponent, null);
+
+        assertThat((View) other.getView().findViewById(R.id.qs_footer_actions)).isNull();
+        verifyNoMoreInteractions(mFooterActionsViewModel, mFooterActionsViewModelFactory);
+    }
+
+    @Test
+    @EnableSceneContainer
+    public void testSceneContainerFlagsEnabled_statusBarStateIsShade() {
+        mUnderTest.onStateChanged(KEYGUARD);
+        assertThat(mUnderTest.getStatusBarState()).isEqualTo(SHADE);
+
+        mUnderTest.onStateChanged(SHADE_LOCKED);
+        assertThat(mUnderTest.getStatusBarState()).isEqualTo(SHADE);
+    }
+
+    @Test
+    @EnableSceneContainer
+    public void testSceneContainerFlagsEnabled_isKeyguardState_alwaysFalse() {
+        mUnderTest.onStateChanged(KEYGUARD);
+        assertThat(mUnderTest.isKeyguardState()).isFalse();
+
+        when(mStatusBarStateController.getCurrentOrUpcomingState()).thenReturn(KEYGUARD);
+        assertThat(mUnderTest.isKeyguardState()).isFalse();
+    }
+
+    @Test
+    public void testHeaderBounds() {
+        int left = 20;
+        int top = 30;
+        int right = 200;
+        int bottom = 100;
+        setHeaderBounds(left, top, right, bottom);
+
+        assertThat(mUnderTest.getHeaderLeft()).isEqualTo(left);
+        assertThat(mUnderTest.getHeaderTop()).isEqualTo(top);
+        assertThat(mUnderTest.getHeaderBottom()).isEqualTo(bottom);
+        assertThat(mUnderTest.getHeaderHeight()).isEqualTo(bottom - top);
+    }
+
+    @Test
+    public void testHeaderBoundsOnScreen() {
+        Rect bounds = new Rect(0, 10, 100, 200);
+        setHeaderBoundsOnScreen(bounds);
+
+        Rect out = new Rect();
+        mUnderTest.getHeaderBoundsOnScreen(out);
+        assertThat(out).isEqualTo(bounds);
+    }
+
+    private QSImpl instantiate() {
+        setupQsComponent();
+        setUpViews();
+        setUpInflater();
+        setUpMedia();
+        setUpOther();
+
+        return new QSImpl(
+                new RemoteInputQuickSettingsDisabler(
+                        mContext,
+                        mCommandQueue,
+                        new ResourcesSplitShadeStateController(),
+                        mock(ConfigurationController.class)),
+                mStatusBarStateController,
+                mCommandQueue,
+                mQSMediaHost,
+                mQQSMediaHost,
+                mBypassController,
+                mock(QSDisableFlagsLogger.class),
+                mock(DumpManager.class),
+                mock(QSLogger.class),
+                mock(FooterActionsController.class),
+                mFooterActionsViewModelFactory,
+                mLargeScreenShadeInterpolator
+        );
+    }
+
+    private void setUpOther() {
+        when(mTileServiceRequestControllerBuilder.create(any()))
+                .thenReturn(mTileServiceRequestController);
+        when(mQSContainerImplController.getView()).thenReturn(mContainer);
+        when(mQSPanelController.getTileLayout()).thenReturn(mQQsTileLayout);
+        when(mQuickQSPanelController.getTileLayout()).thenReturn(mQsTileLayout);
+        when(mFooterActionsViewModelFactory.create(any(LifecycleOwner.class)))
+                .thenReturn(mFooterActionsViewModel);
+    }
+
+    private void setUpMedia() {
+        when(mQSMediaHost.getCurrentClipping()).thenReturn(new Rect());
+        when(mQSMediaHost.getHostView()).thenReturn(new UniqueObjectHostView(mContext));
+        when(mQQSMediaHost.getHostView()).thenReturn(new UniqueObjectHostView(mContext));
+    }
+
+    private void setUpViews() {
+        mQsView = spy(new FrameLayout(mContext));
+        when(mQsComponent.getRootView()).thenReturn(mQsView);
+
+        when(mQSPanelScrollView.findViewById(R.id.expanded_qs_scroll_view))
+                .thenReturn(mQSPanelScrollView);
+        mQsView.addView(mQSPanelScrollView);
+
+        when(mHeader.findViewById(R.id.header)).thenReturn(mHeader);
+        mQsView.addView(mHeader);
+
+        View customizer = new View(mContext);
+        customizer.setId(android.R.id.edit);
+        mQsView.addView(customizer);
+
+        ComposeView footerActionsView = new ComposeView(mContext);
+        footerActionsView.setId(R.id.qs_footer_actions);
+        mQsView.addView(footerActionsView);
+    }
+
+    private void setUpInflater() {
+        when(mLayoutInflater.cloneInContext(any(Context.class))).thenReturn(mLayoutInflater);
+        when(mLayoutInflater.inflate(anyInt(), nullable(ViewGroup.class), anyBoolean()))
+                .thenAnswer((invocation) -> mQsView);
+        when(mLayoutInflater.inflate(anyInt(), nullable(ViewGroup.class)))
+                .thenAnswer((invocation) -> mQsView);
+        mContext.addMockSystemService(Context.LAYOUT_INFLATER_SERVICE, mLayoutInflater);
+    }
+
+    private void setupQsComponent() {
+        when(mQsComponent.getQSPanelController()).thenReturn(mQSPanelController);
+        when(mQsComponent.getQuickQSPanelController()).thenReturn(mQuickQSPanelController);
+        when(mQsComponent.getQSCustomizerController()).thenReturn(mQsCustomizerController);
+        when(mQsComponent.getQSContainerImplController())
+                .thenReturn(mQSContainerImplController);
+        when(mQsComponent.getQSFooter()).thenReturn(mFooter);
+        when(mQsComponent.getQSFooterActionController())
+                .thenReturn(mQSFooterActionController);
+        when(mQsComponent.getQSAnimator()).thenReturn(mQSAnimator);
+        when(mQsComponent.getQSSquishinessController()).thenReturn(mSquishinessController);
+    }
+
+    private void setStatusBarCurrentAndUpcomingState(int statusBarState) {
+        when(mStatusBarStateController.getState()).thenReturn(statusBarState);
+        when(mStatusBarStateController.getCurrentOrUpcomingState()).thenReturn(statusBarState);
+        mUnderTest.onStateChanged(statusBarState);
+    }
+
+    private void enableSplitShade() {
+        setSplitShadeEnabled(true);
+    }
+
+    private void disableSplitShade() {
+        setSplitShadeEnabled(false);
+    }
+
+    private void setSplitShadeEnabled(boolean enabled) {
+        mUnderTest.setInSplitShade(enabled);
+    }
+
+    private void setLocationOnScreen(View view, int top) {
+        doAnswer(invocation -> {
+            int[] locationOnScreen = invocation.getArgument(/* index= */ 0);
+            locationOnScreen[0] = 0;
+            locationOnScreen[1] = top;
+            return null;
+        }).when(view).getLocationOnScreen(any(int[].class));
+    }
+
+    private void setIsLargeScreen() {
+        mUnderTest.setIsNotificationPanelFullWidth(false);
+    }
+
+    private void setIsSmallScreen() {
+        mUnderTest.setIsNotificationPanelFullWidth(true);
+    }
+
+    private void setHeaderBounds(int left, int top, int right, int bottom) {
+        when(mHeader.getLeft()).thenReturn(left);
+        when(mHeader.getTop()).thenReturn(top);
+        when(mHeader.getRight()).thenReturn(right);
+        when(mHeader.getBottom()).thenReturn(bottom);
+    }
+
+    private void setHeaderBoundsOnScreen(Rect rect) {
+        doAnswer(invocation -> {
+            Rect bounds = invocation.getArgument(/* index= */ 0);
+            bounds.set(rect);
+            return null;
+        }).when(mHeader).getBoundsOnScreen(any(Rect.class));
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/AbstractQSFragmentComposeViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/AbstractQSFragmentComposeViewModelTest.kt
new file mode 100644
index 0000000..4bbdfa4
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/AbstractQSFragmentComposeViewModelTest.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2024 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.systemui.qs.composefragment.viewmodel
+
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.testing.TestLifecycleOwner
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.testKosmos
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.TestResult
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.resetMain
+import kotlinx.coroutines.test.runTest
+import kotlinx.coroutines.test.setMain
+import org.junit.After
+import org.junit.Before
+
+@OptIn(ExperimentalCoroutinesApi::class)
+abstract class AbstractQSFragmentComposeViewModelTest : SysuiTestCase() {
+    protected val kosmos = testKosmos()
+
+    protected val lifecycleOwner =
+        TestLifecycleOwner(
+            initialState = Lifecycle.State.CREATED,
+            coroutineDispatcher = kosmos.testDispatcher,
+        )
+
+    protected val underTest by lazy {
+        kosmos.qsFragmentComposeViewModelFactory.create(lifecycleOwner.lifecycleScope)
+    }
+
+    @Before
+    fun setUp() {
+        Dispatchers.setMain(kosmos.testDispatcher)
+    }
+
+    @After
+    fun teardown() {
+        Dispatchers.resetMain()
+    }
+
+    protected inline fun TestScope.testWithinLifecycle(
+        crossinline block: suspend TestScope.() -> TestResult
+    ): TestResult {
+        return runTest {
+            lifecycleOwner.setCurrentState(Lifecycle.State.RESUMED)
+            lifecycleOwner.lifecycleScope.launch { underTest.activate() }
+            block().also { lifecycleOwner.setCurrentState(Lifecycle.State.DESTROYED) }
+        }
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelForceQSTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelForceQSTest.kt
new file mode 100644
index 0000000..da16640
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelForceQSTest.kt
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2024 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.systemui.qs.composefragment.viewmodel
+
+import android.testing.TestableLooper.RunWithLooper
+import androidx.test.filters.SmallTest
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.statusbar.StatusBarState
+import com.android.systemui.statusbar.sysuiStatusBarStateController
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
+
+@SmallTest
+@RunWith(ParameterizedAndroidJunit4::class)
+@RunWithLooper
+class QSFragmentComposeViewModelForceQSTest(private val testData: TestData) :
+    AbstractQSFragmentComposeViewModelTest() {
+
+    @Test
+    fun forceQs_orRealExpansion() =
+        with(kosmos) {
+            testScope.testWithinLifecycle {
+                val expansionState by collectLastValue(underTest.expansionState)
+
+                with(testData) {
+                    sysuiStatusBarStateController.setState(statusBarState)
+                    underTest.isQSExpanded = expanded
+                    underTest.isStackScrollerOverscrolling = stackScrollerOverScrolling
+                    fakeDeviceEntryRepository.setBypassEnabled(bypassEnabled)
+                    underTest.isTransitioningToFullShade = transitioningToFullShade
+                    underTest.isInSplitShade = inSplitShade
+
+                    underTest.qsExpansionValue = EXPANSION
+                    assertThat(expansionState!!.progress)
+                        .isEqualTo(if (expectedForceQS) 1f else EXPANSION)
+                }
+            }
+        }
+
+    data class TestData(
+        val statusBarState: Int,
+        val expanded: Boolean,
+        val stackScrollerOverScrolling: Boolean,
+        val bypassEnabled: Boolean,
+        val transitioningToFullShade: Boolean,
+        val inSplitShade: Boolean,
+    ) {
+        private val inKeyguard = statusBarState == StatusBarState.KEYGUARD
+
+        private val showCollapsedOnKeyguard =
+            bypassEnabled || (transitioningToFullShade && !inSplitShade)
+
+        val expectedForceQS =
+            (expanded || stackScrollerOverScrolling) && (inKeyguard && !showCollapsedOnKeyguard)
+    }
+
+    companion object {
+        private const val EXPANSION = 0.3f
+
+        @Parameters(name = "{0}")
+        @JvmStatic
+        fun createTestData(): List<TestData> {
+            return statusBarStates.flatMap { statusBarState ->
+                (0u..31u).map { bitfield ->
+                    TestData(
+                        statusBarState,
+                        expanded = (bitfield and 1u) == 1u,
+                        stackScrollerOverScrolling = (bitfield and 2u) == 2u,
+                        bypassEnabled = (bitfield and 4u) == 4u,
+                        transitioningToFullShade = (bitfield and 8u) == 8u,
+                        inSplitShade = (bitfield and 16u) == 16u,
+                    )
+                }
+            }
+        }
+
+        private val statusBarStates =
+            setOf(StatusBarState.SHADE, StatusBarState.KEYGUARD, StatusBarState.SHADE_LOCKED)
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelTest.kt
index 6f20e70..c19e4b8 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelTest.kt
@@ -19,64 +19,28 @@
 import android.app.StatusBarManager
 import android.content.testableContext
 import android.testing.TestableLooper.RunWithLooper
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.testing.TestLifecycleOwner
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
 import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
 import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.kosmos.testDispatcher
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.qs.fgsManagerController
+import com.android.systemui.qs.panels.domain.interactor.tileSquishinessInteractor
 import com.android.systemui.res.R
 import com.android.systemui.shade.largeScreenHeaderHelper
 import com.android.systemui.statusbar.StatusBarState
 import com.android.systemui.statusbar.disableflags.data.model.DisableFlagsModel
 import com.android.systemui.statusbar.disableflags.data.repository.fakeDisableFlagsRepository
 import com.android.systemui.statusbar.sysuiStatusBarStateController
-import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.TestResult
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.resetMain
 import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import kotlinx.coroutines.test.setMain
-import org.junit.After
-import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 @RunWithLooper
-@OptIn(ExperimentalCoroutinesApi::class)
-class QSFragmentComposeViewModelTest : SysuiTestCase() {
-    private val kosmos = testKosmos()
-
-    private val lifecycleOwner =
-        TestLifecycleOwner(
-            initialState = Lifecycle.State.CREATED,
-            coroutineDispatcher = kosmos.testDispatcher,
-        )
-
-    private val underTest by lazy {
-        kosmos.qsFragmentComposeViewModelFactory.create(lifecycleOwner.lifecycleScope)
-    }
-
-    @Before
-    fun setUp() {
-        Dispatchers.setMain(kosmos.testDispatcher)
-    }
-
-    @After
-    fun teardown() {
-        Dispatchers.resetMain()
-    }
+class QSFragmentComposeViewModelTest : AbstractQSFragmentComposeViewModelTest() {
 
     @Test
     fun qsExpansionValueChanges_correctExpansionState() =
@@ -205,16 +169,30 @@
             }
         }
 
-    private inline fun TestScope.testWithinLifecycle(
-        crossinline block: suspend TestScope.() -> TestResult
-    ): TestResult {
-        return runTest {
-            lifecycleOwner.setCurrentState(Lifecycle.State.RESUMED)
-            block().also { lifecycleOwner.setCurrentState(Lifecycle.State.DESTROYED) }
+    @Test
+    fun squishinessInExpansion_setInInteractor() =
+        with(kosmos) {
+            testScope.testWithinLifecycle {
+                val squishiness by collectLastValue(tileSquishinessInteractor.squishiness)
+
+                underTest.squishinessFractionValue = 0.3f
+                assertThat(squishiness).isWithin(epsilon).of(0.3f.constrainSquishiness())
+
+                underTest.squishinessFractionValue = 0f
+                assertThat(squishiness).isWithin(epsilon).of(0f.constrainSquishiness())
+
+                underTest.squishinessFractionValue = 1f
+                assertThat(squishiness).isWithin(epsilon).of(1f.constrainSquishiness())
+            }
         }
-    }
 
     companion object {
         private const val QS_DISABLE_FLAG = StatusBarManager.DISABLE2_QUICK_SETTINGS
+
+        private fun Float.constrainSquishiness(): Float {
+            return (0.1f + this * 0.9f).coerceIn(0f, 1f)
+        }
+
+        private const val epsilon = 0.001f
     }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/InfiniteGridLayoutTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/InfiniteGridLayoutTest.kt
index 9e90090..a9a527f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/InfiniteGridLayoutTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/InfiniteGridLayoutTest.kt
@@ -22,10 +22,8 @@
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.qs.panels.data.repository.DefaultLargeTilesRepository
 import com.android.systemui.qs.panels.data.repository.defaultLargeTilesRepository
-import com.android.systemui.qs.panels.ui.compose.infinitegrid.InfiniteGridLayout
+import com.android.systemui.qs.panels.domain.interactor.infiniteGridLayout
 import com.android.systemui.qs.panels.ui.viewmodel.MockTileViewModel
-import com.android.systemui.qs.panels.ui.viewmodel.fixedColumnsSizeViewModel
-import com.android.systemui.qs.panels.ui.viewmodel.iconTilesViewModel
 import com.android.systemui.qs.pipeline.shared.TileSpec
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
@@ -44,8 +42,7 @@
                 }
         }
 
-    private val underTest =
-        with(kosmos) { InfiniteGridLayout(iconTilesViewModel, fixedColumnsSizeViewModel) }
+    private val underTest = kosmos.infiniteGridLayout
 
     @Test
     fun correctPagination_underOnePage_sameOrder() =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
index 2580ac2..7798f46 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
@@ -14,6 +14,8 @@
 
 package com.android.systemui.qs.tileimpl;
 
+import static com.android.systemui.Flags.FLAG_QS_NEW_TILES;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.mockito.ArgumentMatchers.any;
@@ -21,11 +23,16 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.content.Context;
 import android.graphics.drawable.AnimatedVectorDrawable;
 import android.graphics.drawable.Drawable;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
 import android.service.quicksettings.Tile;
 import android.testing.UiThreadTest;
 import android.widget.ImageView;
@@ -47,7 +54,6 @@
 @UiThreadTest
 @SmallTest
 public class QSIconViewImplTest extends SysuiTestCase {
-
     private QSIconViewImpl mIconView;
 
     @Before
@@ -106,6 +112,34 @@
         verify(iv).setImageTintList(argThat(stateList -> stateList.getColors()[0] == desiredColor));
     }
 
+
+    @EnableFlags(FLAG_QS_NEW_TILES)
+    @Test
+    public void testIconPreloaded_withFlagOn_immediatelyLoadsAll3TintColors() {
+        Context ctx = spy(mContext);
+
+        QSIconViewImpl iconView = new QSIconViewImpl(ctx);
+
+        verify(ctx, times(3)).obtainStyledAttributes(any());
+
+        iconView.getColor(new State()); // this should not increase the call count
+
+        verify(ctx, times(3)).obtainStyledAttributes(any());
+    }
+
+    @DisableFlags(FLAG_QS_NEW_TILES)
+    @Test
+    public void testIconPreloaded_withFlagOff_loadsOneTintColorAfterIconColorIsRead() {
+        Context ctx = spy(mContext);
+        QSIconViewImpl iconView = new QSIconViewImpl(ctx);
+
+        verify(ctx, never()).obtainStyledAttributes(any()); // none of the colors are preloaded
+
+        iconView.getColor(new State());
+
+        verify(ctx, times(1)).obtainStyledAttributes(any());
+    }
+
     @Test
     public void testStateSetCorrectly_toString() {
         ImageView iv = mock(ImageView.class);
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt
new file mode 100644
index 0000000..940da99
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt
@@ -0,0 +1,420 @@
+/*
+ * Copyright (C) 2021 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.systemui.qs.tiles
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.os.Handler
+import android.provider.Settings
+import android.service.quicksettings.Tile
+import android.testing.TestableLooper
+import androidx.lifecycle.LifecycleOwner
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.internal.logging.MetricsLogger
+import com.android.systemui.res.R
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.ActivityTransitionAnimator
+import com.android.systemui.classifier.FalsingManagerFake
+import com.android.systemui.controls.ControlsServiceInfo
+import com.android.systemui.controls.controller.ControlInfo
+import com.android.systemui.controls.controller.ControlsController
+import com.android.systemui.controls.controller.StructureInfo
+import com.android.systemui.controls.dagger.ControlsComponent
+import com.android.systemui.controls.management.ControlsListingController
+import com.android.systemui.controls.ui.ControlsActivity
+import com.android.systemui.controls.ui.ControlsUiController
+import com.android.systemui.controls.ui.SelectedItem
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.plugins.statusbar.StatusBarStateController
+import com.android.systemui.qs.QSHost
+import com.android.systemui.qs.QsEventLogger
+import com.android.systemui.qs.logging.QSLogger
+import com.android.systemui.qs.tileimpl.QSTileImpl
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.capture
+import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.settings.FakeSettings
+import com.android.systemui.util.settings.SecureSettings
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.ArgumentMatchers.anyBoolean
+import org.mockito.Captor
+import org.mockito.Mock
+import org.mockito.Mockito.doNothing
+import org.mockito.Mockito.nullable
+import org.mockito.Mockito.spy
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.Mockito.`when`
+import org.mockito.MockitoAnnotations
+import java.util.Optional
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+class DeviceControlsTileTest : SysuiTestCase() {
+
+    @Mock
+    private lateinit var qsHost: QSHost
+    @Mock
+    private lateinit var metricsLogger: MetricsLogger
+    @Mock
+    private lateinit var statusBarStateController: StatusBarStateController
+    @Mock
+    private lateinit var activityStarter: ActivityStarter
+    @Mock
+    private lateinit var qsLogger: QSLogger
+    @Mock
+    private lateinit var controlsComponent: ControlsComponent
+    @Mock
+    private lateinit var controlsUiController: ControlsUiController
+    @Mock
+    private lateinit var controlsListingController: ControlsListingController
+    @Mock
+    private lateinit var controlsController: ControlsController
+    @Mock
+    private lateinit var serviceInfo: ControlsServiceInfo
+    @Mock
+    private lateinit var uiEventLogger: QsEventLogger
+    @Captor
+    private lateinit var listingCallbackCaptor:
+            ArgumentCaptor<ControlsListingController.ControlsListingCallback>
+    @Captor
+    private lateinit var intentCaptor: ArgumentCaptor<Intent>
+
+    private lateinit var testableLooper: TestableLooper
+    private lateinit var tile: DeviceControlsTile
+
+    private lateinit var secureSettings: SecureSettings
+    private lateinit var spiedContext: Context
+    private var featureEnabled = true
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        testableLooper = TestableLooper.get(this)
+        secureSettings = FakeSettings()
+
+        spiedContext = spy(mContext)
+        doNothing().`when`(spiedContext).startActivity(any(Intent::class.java))
+        `when`(qsHost.context).thenReturn(spiedContext)
+        `when`(controlsComponent.isEnabled()).thenReturn(true)
+        `when`(controlsController.getPreferredSelection())
+                .thenReturn(SelectedItem.StructureItem(
+                        StructureInfo(ComponentName("pkg", "cls"), "structure", listOf())))
+        secureSettings.putInt(Settings.Secure.LOCKSCREEN_SHOW_CONTROLS, 1)
+
+        setupControlsComponent()
+
+        tile = createTile()
+    }
+
+    @After
+    fun tearDown() {
+        tile.destroy()
+        testableLooper.processAllMessages()
+    }
+
+    private fun setupControlsComponent() {
+        `when`(controlsComponent.getControlsController()).thenAnswer {
+            if (featureEnabled) {
+                Optional.of(controlsController)
+            } else {
+                Optional.empty()
+            }
+        }
+
+        `when`(controlsComponent.getControlsListingController()).thenAnswer {
+            if (featureEnabled) {
+                Optional.of(controlsListingController)
+            } else {
+                Optional.empty()
+            }
+        }
+
+        `when`(controlsComponent.getControlsUiController()).thenAnswer {
+            if (featureEnabled) {
+                Optional.of(controlsUiController)
+            } else {
+                Optional.empty()
+            }
+        }
+
+        `when`(controlsComponent.getTileTitleId()).thenReturn(R.string.quick_controls_title)
+        `when`(controlsComponent.getTileTitleId()).thenReturn(R.drawable.controls_icon)
+    }
+
+    @Test
+    fun testAvailable() {
+        assertThat(tile.isAvailable).isTrue()
+    }
+
+    @Test
+    fun testNotAvailableControls() {
+        featureEnabled = false
+
+        // Destroy previous tile
+        tile.destroy()
+        tile = createTile()
+
+        assertThat(tile.isAvailable).isFalse()
+    }
+
+    @Test
+    fun testObservingCallback() {
+        verify(controlsListingController).observe(
+                any(LifecycleOwner::class.java),
+                any(ControlsListingController.ControlsListingCallback::class.java)
+        )
+    }
+
+    @Test
+    fun testLongClickIntent() {
+        assertThat(tile.longClickIntent).isNull()
+    }
+
+    @Test
+    fun testDoesNotHandleLongClick() {
+        assertThat(tile.state.handlesLongClick).isFalse()
+    }
+
+    @Test
+    fun testUnavailableByDefault() {
+        assertThat(tile.state.state).isEqualTo(Tile.STATE_UNAVAILABLE)
+    }
+
+    @Test
+    fun testStateUnavailableIfNoListings() {
+        verify(controlsListingController).observe(
+                any(LifecycleOwner::class.java),
+                capture(listingCallbackCaptor)
+        )
+
+        listingCallbackCaptor.value.onServicesUpdated(emptyList())
+        testableLooper.processAllMessages()
+
+        assertThat(tile.state.state).isEqualTo(Tile.STATE_UNAVAILABLE)
+    }
+
+    @Test
+    fun testStateUnavailableIfNotEnabled() {
+        verify(controlsListingController).observe(
+            any(LifecycleOwner::class.java),
+            capture(listingCallbackCaptor)
+        )
+        `when`(controlsComponent.isEnabled()).thenReturn(false)
+
+        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
+        testableLooper.processAllMessages()
+
+        assertThat(tile.state.state).isEqualTo(Tile.STATE_UNAVAILABLE)
+    }
+
+    @Test
+    fun testStateActiveIfListingsHasControlsFavorited() {
+        verify(controlsListingController).observe(
+                any(LifecycleOwner::class.java),
+                capture(listingCallbackCaptor)
+        )
+        `when`(controlsComponent.getVisibility()).thenReturn(ControlsComponent.Visibility.AVAILABLE)
+        `when`(controlsController.getPreferredSelection()).thenReturn(
+            SelectedItem.StructureItem(StructureInfo(
+                ComponentName("pkg", "cls"),
+                "structure",
+                listOf(ControlInfo("id", "title", "subtitle", 1))
+            ))
+        )
+
+        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
+        testableLooper.processAllMessages()
+
+        assertThat(tile.state.state).isEqualTo(Tile.STATE_ACTIVE)
+    }
+
+    @Test
+    fun testStateInactiveIfListingsHasNoControlsFavorited() {
+        verify(controlsListingController).observe(
+                any(LifecycleOwner::class.java),
+                capture(listingCallbackCaptor)
+        )
+        `when`(controlsComponent.getVisibility()).thenReturn(ControlsComponent.Visibility.AVAILABLE)
+        `when`(controlsController.getPreferredSelection())
+                .thenReturn(SelectedItem.StructureItem(
+                        StructureInfo(ComponentName("pkg", "cls"), "structure", listOf())))
+
+        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
+        testableLooper.processAllMessages()
+
+        assertThat(tile.state.state).isEqualTo(Tile.STATE_INACTIVE)
+    }
+
+    @Test
+    fun testStateActiveIfPreferredIsPanel() {
+        verify(controlsListingController).observe(
+                any(LifecycleOwner::class.java),
+                capture(listingCallbackCaptor)
+        )
+        `when`(controlsComponent.getVisibility()).thenReturn(ControlsComponent.Visibility.AVAILABLE)
+        `when`(controlsController.getPreferredSelection())
+                .thenReturn(SelectedItem.PanelItem("appName", ComponentName("pkg", "cls")))
+
+        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
+        testableLooper.processAllMessages()
+
+        assertThat(tile.state.state).isEqualTo(Tile.STATE_ACTIVE)
+    }
+
+    @Test
+    fun testStateInactiveIfLocked() {
+        verify(controlsListingController).observe(
+            any(LifecycleOwner::class.java),
+            capture(listingCallbackCaptor)
+        )
+        `when`(controlsComponent.getVisibility())
+            .thenReturn(ControlsComponent.Visibility.AVAILABLE_AFTER_UNLOCK)
+
+        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
+        testableLooper.processAllMessages()
+
+        assertThat(tile.state.state).isEqualTo(Tile.STATE_INACTIVE)
+    }
+
+    @Test
+    fun testMoveBetweenStates() {
+        verify(controlsListingController).observe(
+                any(LifecycleOwner::class.java),
+                capture(listingCallbackCaptor)
+        )
+
+        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
+        testableLooper.processAllMessages()
+
+        listingCallbackCaptor.value.onServicesUpdated(emptyList())
+        testableLooper.processAllMessages()
+
+        assertThat(tile.state.state).isEqualTo(Tile.STATE_UNAVAILABLE)
+    }
+
+    @Test
+    fun handleClick_unavailable_noActivityStarted() {
+        tile.click(null /* view */)
+        testableLooper.processAllMessages()
+
+        verifyNoMoreInteractions(activityStarter)
+    }
+
+    @Test
+    fun handleClick_available_shownOverLockscreenWhenLocked() {
+        verify(controlsListingController).observe(
+                any(LifecycleOwner::class.java),
+                capture(listingCallbackCaptor)
+        )
+        `when`(controlsComponent.getVisibility()).thenReturn(ControlsComponent.Visibility.AVAILABLE)
+        `when`(controlsUiController.resolveActivity()).thenReturn(ControlsActivity::class.java)
+        `when`(controlsController.getPreferredSelection()).thenReturn(
+            SelectedItem.StructureItem(StructureInfo(
+                    ComponentName("pkg", "cls"),
+                    "structure",
+                    listOf(ControlInfo("id", "title", "subtitle", 1))
+            ))
+        )
+
+        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
+        testableLooper.processAllMessages()
+
+        tile.click(null /* view */)
+        testableLooper.processAllMessages()
+
+        verify(activityStarter).startActivity(
+                intentCaptor.capture(),
+                eq(true) /* dismissShade */,
+                nullable(ActivityTransitionAnimator.Controller::class.java),
+                eq(true) /* showOverLockscreenWhenLocked */)
+        assertThat(intentCaptor.value.component?.className).isEqualTo(CONTROLS_ACTIVITY_CLASS_NAME)
+    }
+
+    @Test
+    fun handleClick_availableAfterUnlock_notShownOverLockscreenWhenLocked() {
+        verify(controlsListingController).observe(
+            any(LifecycleOwner::class.java),
+            capture(listingCallbackCaptor)
+        )
+        `when`(controlsComponent.getVisibility())
+            .thenReturn(ControlsComponent.Visibility.AVAILABLE_AFTER_UNLOCK)
+        `when`(controlsUiController.resolveActivity()).thenReturn(ControlsActivity::class.java)
+        `when`(controlsController.getPreferredSelection()).thenReturn(
+            SelectedItem.StructureItem(StructureInfo(
+                ComponentName("pkg", "cls"),
+                "structure",
+                listOf(ControlInfo("id", "title", "subtitle", 1))
+            ))
+        )
+
+        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
+        testableLooper.processAllMessages()
+
+        tile.click(null /* view */)
+        testableLooper.processAllMessages()
+
+        verify(activityStarter).startActivity(
+                intentCaptor.capture(),
+                anyBoolean() /* dismissShade */,
+                nullable(ActivityTransitionAnimator.Controller::class.java),
+                eq(false) /* showOverLockscreenWhenLocked */)
+        assertThat(intentCaptor.value.component?.className).isEqualTo(CONTROLS_ACTIVITY_CLASS_NAME)
+    }
+
+    @Test
+    fun verifyTileEqualsResourceFromComponent() {
+        assertThat(tile.tileLabel)
+            .isEqualTo(
+                context.getText(
+                    controlsComponent.getTileTitleId()))
+    }
+
+    @Test
+    fun verifyTileImageEqualsResourceFromComponent() {
+        assertThat(tile.icon)
+            .isEqualTo(QSTileImpl.ResourceIcon.get(controlsComponent.getTileImageId()))
+    }
+
+    private fun createTile(): DeviceControlsTile {
+        return DeviceControlsTile(
+                qsHost,
+                uiEventLogger,
+                testableLooper.looper,
+                Handler(testableLooper.looper),
+                FalsingManagerFake(),
+                metricsLogger,
+                statusBarStateController,
+                activityStarter,
+                qsLogger,
+                controlsComponent
+        ).also {
+            it.initialize()
+            testableLooper.processAllMessages()
+        }
+    }
+}
+
+private const val CONTROLS_ACTIVITY_CLASS_NAME = "com.android.systemui.controls.ui.ControlsActivity"
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
new file mode 100644
index 0000000..0729e2f
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
@@ -0,0 +1,511 @@
+/*
+ * Copyright (C) 2021 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.systemui.qs.tiles;
+
+import static android.content.pm.PackageManager.FEATURE_NFC_HOST_CARD_EMULATION;
+import static android.provider.Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertFalse;
+import static junit.framework.TestCase.assertNotNull;
+import static junit.framework.TestCase.assertNull;
+import static junit.framework.TestCase.assertTrue;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.service.quickaccesswallet.GetWalletCardsError;
+import android.service.quickaccesswallet.GetWalletCardsResponse;
+import android.service.quickaccesswallet.QuickAccessWalletClient;
+import android.service.quickaccesswallet.QuickAccessWalletService;
+import android.service.quickaccesswallet.WalletCard;
+import android.service.quicksettings.Tile;
+import android.testing.TestableLooper;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.classifier.FalsingManagerFake;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.plugins.qs.QSTile;
+import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.qs.QSHost;
+import com.android.systemui.qs.QsEventLogger;
+import com.android.systemui.qs.logging.QSLogger;
+import com.android.systemui.qs.tileimpl.QSTileImpl;
+import com.android.systemui.res.R;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.util.settings.SecureSettings;
+import com.android.systemui.wallet.controller.QuickAccessWalletController;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Collections;
+
+@RunWith(AndroidJUnit4.class)
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+@SmallTest
+public class QuickAccessWalletTileTest extends SysuiTestCase {
+
+    private static final String CARD_ID = "card_id";
+    private static final String LABEL = "QAW";
+    private static final String CARD_DESCRIPTION = "•••• 1234";
+    private static final Icon CARD_IMAGE =
+            Icon.createWithBitmap(Bitmap.createBitmap(70, 50, Bitmap.Config.ARGB_8888));
+    private static final int PRIMARY_USER_ID = 0;
+    private static final int SECONDARY_USER_ID = 10;
+
+    private final Drawable mTileIcon = mContext.getDrawable(R.drawable.ic_qs_wallet);
+    private final Intent mWalletIntent = new Intent(QuickAccessWalletService.ACTION_VIEW_WALLET)
+            .setComponent(new ComponentName(mContext.getPackageName(), "WalletActivity"));
+
+    @Mock
+    private QSHost mHost;
+    @Mock
+    private MetricsLogger mMetricsLogger;
+    @Mock
+    private StatusBarStateController mStatusBarStateController;
+    @Mock
+    private ActivityStarter mActivityStarter;
+    @Mock
+    private QSLogger mQSLogger;
+    @Mock
+    private QsEventLogger mUiEventLogger;
+    @Mock
+    private QuickAccessWalletClient mQuickAccessWalletClient;
+    @Mock
+    private KeyguardStateController mKeyguardStateController;
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private SecureSettings mSecureSettings;
+    @Mock
+    private QuickAccessWalletController mController;
+    @Mock
+    private Icon mCardImage;
+    @Captor
+    ArgumentCaptor<QuickAccessWalletClient.OnWalletCardsRetrievedCallback> mCallbackCaptor;
+
+    private Context mSpiedContext;
+    private TestableLooper mTestableLooper;
+    private QuickAccessWalletTile mTile;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+
+        mTestableLooper = TestableLooper.get(this);
+        mSpiedContext = spy(mContext);
+
+        doNothing().when(mSpiedContext).startActivity(any(Intent.class));
+        when(mHost.getContext()).thenReturn(mSpiedContext);
+        when(mQuickAccessWalletClient.getServiceLabel()).thenReturn(LABEL);
+        when(mQuickAccessWalletClient.getTileIcon()).thenReturn(mTileIcon);
+        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true);
+        when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
+        when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true);
+        when(mController.getWalletClient()).thenReturn(mQuickAccessWalletClient);
+        when(mCardImage.getType()).thenReturn(Icon.TYPE_URI);
+        when(mCardImage.loadDrawableAsUser(any(), eq(SECONDARY_USER_ID))).thenReturn(null);
+
+        mTile = new QuickAccessWalletTile(
+                mHost,
+                mUiEventLogger,
+                mTestableLooper.getLooper(),
+                new Handler(mTestableLooper.getLooper()),
+                new FalsingManagerFake(),
+                mMetricsLogger,
+                mStatusBarStateController,
+                mActivityStarter,
+                mQSLogger,
+                mKeyguardStateController,
+                mPackageManager,
+                mSecureSettings,
+                mController);
+
+        mTile.initialize();
+        mTestableLooper.processAllMessages();
+    }
+
+    @After
+    public void tearDown() {
+        mTile.destroy();
+        mTestableLooper.processAllMessages();
+    }
+
+    @Test
+    public void testNewTile() {
+        assertFalse(mTile.newTileState().handlesLongClick);
+    }
+
+    @Test
+    public void testWalletServiceUnavailable_recreateWalletClient() {
+        when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false);
+
+        mTile.handleSetListening(true);
+
+        verify(mController, times(1)).reCreateWalletClient();
+    }
+
+    @Test
+    public void testWalletFeatureUnavailable_recreateWalletClient() {
+        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);
+
+        mTile.handleSetListening(true);
+
+        verify(mController, times(1)).reCreateWalletClient();
+    }
+
+    @Test
+    public void testIsAvailable_qawFeatureAvailableWalletUnavailable() {
+        when(mController.isWalletRoleAvailable()).thenReturn(false);
+        when(mPackageManager.hasSystemFeature(FEATURE_NFC_HOST_CARD_EMULATION)).thenReturn(true);
+        when(mPackageManager.hasSystemFeature("org.chromium.arc")).thenReturn(false);
+        when(mSecureSettings.getStringForUser(NFC_PAYMENT_DEFAULT_COMPONENT,
+                UserHandle.USER_CURRENT)).thenReturn("Component");
+
+        assertTrue(mTile.isAvailable());
+    }
+
+    @Test
+    public void testIsAvailable_nfcUnavailableWalletAvailable() {
+        when(mController.isWalletRoleAvailable()).thenReturn(true);
+        when(mHost.getUserId()).thenReturn(PRIMARY_USER_ID);
+        when(mPackageManager.hasSystemFeature(FEATURE_NFC_HOST_CARD_EMULATION)).thenReturn(false);
+        when(mPackageManager.hasSystemFeature("org.chromium.arc")).thenReturn(false);
+
+        assertTrue(mTile.isAvailable());
+    }
+
+    @Test
+    public void testHandleClick_startQuickAccessUiIntent_noCard() {
+        setUpWalletCard(/* hasCard= */ false);
+
+        mTile.handleClick(/* view= */ null);
+        mTestableLooper.processAllMessages();
+
+        verify(mController).startQuickAccessUiIntent(
+                eq(mActivityStarter),
+                eq(null),
+                /* hasCard= */ eq(false));
+    }
+
+    @Test
+    public void testHandleClick_startQuickAccessUiIntent_hasCard() {
+        setUpWalletCard(/* hasCard= */ true);
+
+        mTile.handleClick(null /* view */);
+        mTestableLooper.processAllMessages();
+
+        verify(mController).startQuickAccessUiIntent(
+                eq(mActivityStarter),
+                eq(null),
+                /* hasCard= */ eq(true));
+    }
+
+    @Test
+    public void testHandleUpdateState_updateLabelAndIcon() {
+        QSTile.State state = new QSTile.State();
+
+        mTile.handleUpdateState(state, null);
+
+        assertEquals(LABEL, state.label.toString());
+        assertTrue(state.label.toString().contentEquals(state.contentDescription));
+        assertEquals(mTileIcon, state.icon.getDrawable(mContext));
+    }
+
+    @Test
+    public void testHandleUpdateState_updateLabelAndIcon_noIconFromApi() {
+        when(mQuickAccessWalletClient.getTileIcon()).thenReturn(null);
+        QSTile.State state = new QSTile.State();
+        QSTile.Icon icon = QSTileImpl.ResourceIcon.get(R.drawable.ic_wallet_lockscreen);
+
+        mTile.handleUpdateState(state, null);
+
+        assertEquals(LABEL, state.label.toString());
+        assertTrue(state.label.toString().contentEquals(state.contentDescription));
+        assertEquals(icon, state.icon);
+    }
+
+    @Test
+    public void testGetTileLabel_serviceLabelExists() {
+        assertEquals(LABEL, mTile.getTileLabel().toString());
+    }
+
+    @Test
+    public void testGetTileLabel_serviceLabelDoesNotExist() {
+        when(mQuickAccessWalletClient.getServiceLabel()).thenReturn(null);
+        assertEquals(mContext.getString(R.string.wallet_title), mTile.getTileLabel().toString());
+    }
+
+    @Test
+    public void testHandleUpdateState_walletIsUpdating() {
+        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
+        QSTile.State state = new QSTile.State();
+        GetWalletCardsResponse response =
+                new GetWalletCardsResponse(
+                        Collections.singletonList(createWalletCard(mContext)), 0);
+
+        mTile.handleSetListening(true);
+
+        verify(mController).queryWalletCards(mCallbackCaptor.capture());
+
+        // Wallet cards fetching on its way; wallet updating.
+        mTile.handleUpdateState(state, null);
+
+        assertEquals(Tile.STATE_INACTIVE, state.state);
+        assertEquals(
+                mContext.getString(R.string.wallet_secondary_label_updating), state.secondaryLabel);
+        assertNotNull(state.stateDescription);
+        assertNull(state.sideViewCustomDrawable);
+
+        // Wallet cards fetching completed.
+        mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
+        mTestableLooper.processAllMessages();
+
+        mTile.handleUpdateState(state, null);
+
+        assertEquals(Tile.STATE_ACTIVE, state.state);
+        assertEquals(CARD_DESCRIPTION, state.secondaryLabel);
+        assertNotNull(state.stateDescription);
+        assertNotNull(state.sideViewCustomDrawable);
+    }
+
+    @Test
+    public void testHandleUpdateState_hasCard_deviceLocked_tileInactive() {
+        when(mKeyguardStateController.isUnlocked()).thenReturn(false);
+        QSTile.State state = new QSTile.State();
+        setUpWalletCard(/* hasCard= */ true);
+
+        mTile.handleUpdateState(state, null);
+
+        assertEquals(Tile.STATE_INACTIVE, state.state);
+        assertEquals(CARD_DESCRIPTION, state.secondaryLabel);
+        assertNotNull(state.stateDescription);
+        assertNotNull(state.sideViewCustomDrawable);
+    }
+
+    @Test
+    public void testHandleUpdateState_hasCard_deviceUnlocked_tileActive() {
+        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
+        QSTile.State state = new QSTile.State();
+        setUpWalletCard(/* hasCard= */ true);
+
+        mTile.handleUpdateState(state, null);
+
+        assertEquals(Tile.STATE_ACTIVE, state.state);
+        assertEquals(CARD_DESCRIPTION, state.secondaryLabel);
+        assertNotNull(state.stateDescription);
+        assertNotNull(state.sideViewCustomDrawable);
+    }
+
+
+    @Test
+    public void testHandleUpdateState_noCard_tileInactive() {
+        QSTile.State state = new QSTile.State();
+        setUpWalletCard(/* hasCard= */ false);
+
+        mTile.handleUpdateState(state, null);
+
+        assertEquals(Tile.STATE_INACTIVE, state.state);
+        assertEquals(
+                mContext.getString(R.string.wallet_secondary_label_no_card),
+                state.secondaryLabel);
+        assertNotNull(state.stateDescription);
+        assertNull(state.sideViewCustomDrawable);
+    }
+
+    @Test
+    public void testHandleUpdateState_qawServiceUnavailable_tileUnavailable() {
+        when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false);
+        QSTile.State state = new QSTile.State();
+
+        mTile.handleUpdateState(state, null);
+
+        assertEquals(Tile.STATE_UNAVAILABLE, state.state);
+        assertNull(state.stateDescription);
+        assertNull(state.sideViewCustomDrawable);
+    }
+
+    @Test
+    public void testHandleUpdateState_qawFeatureUnavailable_tileUnavailable() {
+        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);
+        QSTile.State state = new QSTile.State();
+
+        mTile.handleUpdateState(state, null);
+
+        assertEquals(Tile.STATE_UNAVAILABLE, state.state);
+        assertNull(state.stateDescription);
+        assertNull(state.sideViewCustomDrawable);
+    }
+
+    @Test
+    public void testHandleSetListening_queryCards() {
+        mTile.handleSetListening(true);
+
+        verify(mController).queryWalletCards(mCallbackCaptor.capture());
+
+        assertThat(mCallbackCaptor.getValue()).isInstanceOf(
+                QuickAccessWalletClient.OnWalletCardsRetrievedCallback.class);
+    }
+
+    @Test
+    public void testQueryCards_hasCards_updateSideViewDrawable() {
+        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
+        setUpWalletCard(/* hasCard= */ true);
+
+        assertNotNull(mTile.getState().sideViewCustomDrawable);
+    }
+
+    @Test
+    public void testQueryCards_notCurrentUser_hasCards_noSideViewDrawable() {
+        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
+
+        PendingIntent pendingIntent =
+                PendingIntent.getActivity(mContext, 0, mWalletIntent, PendingIntent.FLAG_IMMUTABLE);
+        WalletCard walletCard =
+                new WalletCard.Builder(
+                        CARD_ID, mCardImage, CARD_DESCRIPTION, pendingIntent).build();
+        GetWalletCardsResponse response =
+                new GetWalletCardsResponse(Collections.singletonList(walletCard), 0);
+
+        mTile.handleSetListening(true);
+
+        verify(mController).queryWalletCards(mCallbackCaptor.capture());
+
+        mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
+        mTestableLooper.processAllMessages();
+
+        assertNull(mTile.getState().sideViewCustomDrawable);
+    }
+
+    @Test
+    public void testQueryCards_cardDataPayment_updateSideViewDrawable() {
+        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
+        setUpWalletCardWithType(/* hasCard =*/ true, WalletCard.CARD_TYPE_PAYMENT);
+
+        assertNotNull(mTile.getState().sideViewCustomDrawable);
+    }
+
+    @Test
+    public void testQueryCards_cardDataNonPayment_updateSideViewDrawable() {
+        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
+        setUpWalletCardWithType(/* hasCard =*/ true, WalletCard.CARD_TYPE_NON_PAYMENT);
+
+        assertNull(mTile.getState().sideViewCustomDrawable);
+    }
+
+    @Test
+    public void testQueryCards_noCards_notUpdateSideViewDrawable() {
+        setUpWalletCard(/* hasCard= */ false);
+
+        assertNull(mTile.getState().sideViewCustomDrawable);
+    }
+
+    @Test
+    public void testQueryCards_error_notUpdateSideViewDrawable() {
+        String errorMessage = "getWalletCardsError";
+        GetWalletCardsError error = new GetWalletCardsError(CARD_IMAGE, errorMessage);
+
+        mTile.handleSetListening(true);
+
+        verify(mController).queryWalletCards(mCallbackCaptor.capture());
+
+        mCallbackCaptor.getValue().onWalletCardRetrievalError(error);
+        mTestableLooper.processAllMessages();
+
+        assertNull(mTile.getState().sideViewCustomDrawable);
+    }
+
+    @Test
+    public void testHandleSetListening_notListening_notQueryCards() {
+        mTile.handleSetListening(false);
+
+        verifyNoMoreInteractions(mQuickAccessWalletClient);
+    }
+
+    private WalletCard createWalletCardWithType(Context context, int cardType) {
+        PendingIntent pendingIntent =
+                PendingIntent.getActivity(context, 0, mWalletIntent, PendingIntent.FLAG_IMMUTABLE);
+        return new WalletCard.Builder(CARD_ID, cardType, CARD_IMAGE, CARD_DESCRIPTION,
+                pendingIntent).build();
+    }
+
+    private void setUpWalletCardWithType(boolean hasCard, int cardType) {
+        GetWalletCardsResponse response =
+                new GetWalletCardsResponse(
+                        hasCard
+                                ? Collections.singletonList(
+                                createWalletCardWithType(mContext, cardType))
+                                : Collections.EMPTY_LIST, 0);
+
+        mTile.handleSetListening(true);
+
+        verify(mController).queryWalletCards(mCallbackCaptor.capture());
+
+        mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
+        mTestableLooper.processAllMessages();
+    }
+
+    private void setUpWalletCard(boolean hasCard) {
+        GetWalletCardsResponse response =
+                new GetWalletCardsResponse(
+                        hasCard
+                                ? Collections.singletonList(createWalletCard(mContext))
+                                : Collections.EMPTY_LIST, 0);
+
+        mTile.handleSetListening(true);
+
+        verify(mController).queryWalletCards(mCallbackCaptor.capture());
+
+        mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
+        mTestableLooper.processAllMessages();
+    }
+
+    private WalletCard createWalletCard(Context context) {
+        PendingIntent pendingIntent =
+                PendingIntent.getActivity(context, 0, mWalletIntent, PendingIntent.FLAG_IMMUTABLE);
+        return new WalletCard.Builder(CARD_ID, CARD_IMAGE, CARD_DESCRIPTION, pendingIntent).build();
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapperTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapperTest.kt
index 620e90d..d32ba47 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapperTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapperTest.kt
@@ -17,13 +17,17 @@
 package com.android.systemui.qs.tiles.impl.internet.domain
 
 import android.graphics.drawable.TestStubDrawable
+import android.os.fakeExecutorHandler
 import android.widget.Switch
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
+import com.android.settingslib.graph.SignalDrawable
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.common.shared.model.ContentDescription
+import com.android.systemui.common.shared.model.ContentDescription.Companion.loadContentDescription
 import com.android.systemui.common.shared.model.Icon
 import com.android.systemui.common.shared.model.Text
+import com.android.systemui.common.shared.model.Text.Companion.loadText
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.qs.tiles.impl.custom.QSTileStateSubject
 import com.android.systemui.qs.tiles.impl.internet.domain.model.InternetTileModel
@@ -31,6 +35,9 @@
 import com.android.systemui.qs.tiles.viewmodel.QSTileState
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.connectivity.WifiIcons.WIFI_FULL_ICONS
+import com.android.systemui.statusbar.pipeline.mobile.domain.model.SignalIconModel
+import com.android.systemui.statusbar.pipeline.satellite.ui.model.SatelliteIconModel
+import com.android.systemui.statusbar.pipeline.shared.ui.model.InternetTileIconModel
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -39,25 +46,93 @@
 class InternetTileMapperTest : SysuiTestCase() {
     private val kosmos = Kosmos()
     private val internetTileConfig = kosmos.qsInternetTileConfig
+    private val handler = kosmos.fakeExecutorHandler
     private val mapper by lazy {
         InternetTileMapper(
             context.orCreateTestableResources
                 .apply {
                     addOverride(R.drawable.ic_qs_no_internet_unavailable, TestStubDrawable())
+                    addOverride(R.drawable.ic_satellite_connected_2, TestStubDrawable())
                     addOverride(wifiRes, TestStubDrawable())
                 }
                 .resources,
             context.theme,
-            context
+            context,
+            handler,
         )
     }
 
     @Test
-    fun withActiveModel_mappedStateMatchesDataModel() {
+    fun withActiveCellularModel_mappedStateMatchesDataModel() {
         val inputModel =
             InternetTileModel.Active(
                 secondaryLabel = Text.Resource(R.string.quick_settings_networks_available),
-                iconId = wifiRes,
+                icon = InternetTileIconModel.Cellular(3),
+                stateDescription = null,
+                contentDescription =
+                    ContentDescription.Resource(R.string.quick_settings_internet_label),
+            )
+
+        val outputState = mapper.map(internetTileConfig, inputModel)
+
+        val signalDrawable = SignalDrawable(context, handler)
+        signalDrawable.setLevel(3)
+        val expectedState =
+            createInternetTileState(
+                QSTileState.ActivationState.ACTIVE,
+                context.getString(R.string.quick_settings_networks_available),
+                Icon.Loaded(signalDrawable, null),
+                null,
+                context.getString(R.string.quick_settings_internet_label),
+            )
+        QSTileStateSubject.assertThat(outputState).isEqualTo(expectedState)
+    }
+
+    @Test
+    fun withActiveSatelliteModel_mappedStateMatchesDataModel() {
+        val inputIcon =
+            SignalIconModel.Satellite(
+                3,
+                Icon.Resource(
+                    res = R.drawable.ic_satellite_connected_2,
+                    contentDescription =
+                        ContentDescription.Resource(
+                            R.string.accessibility_status_bar_satellite_good_connection
+                        ),
+                ),
+            )
+        val inputModel =
+            InternetTileModel.Active(
+                secondaryLabel = Text.Resource(R.string.quick_settings_networks_available),
+                icon = InternetTileIconModel.Satellite(inputIcon.icon),
+                stateDescription = null,
+                contentDescription =
+                    ContentDescription.Resource(
+                        R.string.accessibility_status_bar_satellite_good_connection
+                    ),
+            )
+
+        val outputState = mapper.map(internetTileConfig, inputModel)
+
+        val expectedSatIcon = SatelliteIconModel.fromSignalStrength(3)
+
+        val expectedState =
+            createInternetTileState(
+                QSTileState.ActivationState.ACTIVE,
+                inputModel.secondaryLabel.loadText(context).toString(),
+                Icon.Loaded(context.getDrawable(expectedSatIcon!!.res)!!, null),
+                expectedSatIcon.res,
+                expectedSatIcon.contentDescription.loadContentDescription(context).toString(),
+            )
+        QSTileStateSubject.assertThat(outputState).isEqualTo(expectedState)
+    }
+
+    @Test
+    fun withActiveWifiModel_mappedStateMatchesDataModel() {
+        val inputModel =
+            InternetTileModel.Active(
+                secondaryLabel = Text.Resource(R.string.quick_settings_networks_available),
+                icon = InternetTileIconModel.ResourceId(wifiRes),
                 stateDescription = null,
                 contentDescription =
                     ContentDescription.Resource(R.string.quick_settings_internet_label),
@@ -71,7 +146,7 @@
                 context.getString(R.string.quick_settings_networks_available),
                 Icon.Loaded(context.getDrawable(wifiRes)!!, contentDescription = null),
                 wifiRes,
-                context.getString(R.string.quick_settings_internet_label)
+                context.getString(R.string.quick_settings_internet_label),
             )
         QSTileStateSubject.assertThat(outputState).isEqualTo(expectedState)
     }
@@ -81,7 +156,7 @@
         val inputModel =
             InternetTileModel.Inactive(
                 secondaryLabel = Text.Resource(R.string.quick_settings_networks_unavailable),
-                iconId = R.drawable.ic_qs_no_internet_unavailable,
+                icon = InternetTileIconModel.ResourceId(R.drawable.ic_qs_no_internet_unavailable),
                 stateDescription = null,
                 contentDescription =
                     ContentDescription.Resource(R.string.quick_settings_networks_unavailable),
@@ -95,10 +170,10 @@
                 context.getString(R.string.quick_settings_networks_unavailable),
                 Icon.Loaded(
                     context.getDrawable(R.drawable.ic_qs_no_internet_unavailable)!!,
-                    contentDescription = null
+                    contentDescription = null,
                 ),
                 R.drawable.ic_qs_no_internet_unavailable,
-                context.getString(R.string.quick_settings_networks_unavailable)
+                context.getString(R.string.quick_settings_networks_unavailable),
             )
         QSTileStateSubject.assertThat(outputState).isEqualTo(expectedState)
     }
@@ -107,7 +182,7 @@
         activationState: QSTileState.ActivationState,
         secondaryLabel: String,
         icon: Icon,
-        iconRes: Int,
+        iconRes: Int? = null,
         contentDescription: String,
     ): QSTileState {
         val label = context.getString(R.string.quick_settings_internet_label)
@@ -120,13 +195,13 @@
             setOf(
                 QSTileState.UserAction.CLICK,
                 QSTileState.UserAction.TOGGLE_CLICK,
-                QSTileState.UserAction.LONG_CLICK
+                QSTileState.UserAction.LONG_CLICK,
             ),
             contentDescription,
             null,
             QSTileState.SideViewIcon.Chevron,
             QSTileState.EnabledState.ENABLED,
-            Switch::class.qualifiedName
+            Switch::class.qualifiedName,
         )
     }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileDataInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileDataInteractorTest.kt
index 5a45060..5259aa8 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileDataInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileDataInteractorTest.kt
@@ -18,14 +18,12 @@
 
 import android.graphics.drawable.TestStubDrawable
 import android.os.UserHandle
-import android.testing.TestableLooper
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.settingslib.AccessibilityContentDescriptions
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.common.shared.model.ContentDescription
 import com.android.systemui.common.shared.model.ContentDescription.Companion.loadContentDescription
-import com.android.systemui.common.shared.model.Icon
 import com.android.systemui.common.shared.model.Text
 import com.android.systemui.common.shared.model.Text.Companion.loadText
 import com.android.systemui.coroutines.collectLastValue
@@ -49,6 +47,7 @@
 import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
 import com.android.systemui.statusbar.pipeline.shared.data.model.DefaultConnectionModel
 import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
+import com.android.systemui.statusbar.pipeline.shared.ui.model.InternetTileIconModel
 import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
 import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractorImpl
 import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
@@ -60,9 +59,7 @@
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.flowOf
-import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
-import org.junit.Assume.assumeFalse
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -144,7 +141,6 @@
         underTest =
             InternetTileDataInteractor(
                 context,
-                testScope.coroutineContext,
                 testScope.backgroundScope,
                 airplaneModeRepository,
                 connectivityRepository,
@@ -164,9 +160,11 @@
 
             connectivityRepository.defaultConnections.value = DefaultConnectionModel()
 
+            val expectedIcon =
+                InternetTileIconModel.ResourceId(R.drawable.ic_qs_no_internet_unavailable)
             assertThat(latest?.secondaryLabel)
                 .isEqualTo(Text.Resource(R.string.quick_settings_networks_unavailable))
-            assertThat(latest?.iconId).isEqualTo(R.drawable.ic_qs_no_internet_unavailable)
+            assertThat(latest?.icon).isEqualTo(expectedIcon)
         }
 
     @Test
@@ -183,11 +181,8 @@
                     underTest.tileData(testUser, flowOf(DataUpdateTrigger.InitialRequest))
                 )
 
-            val networkModel =
-                WifiNetworkModel.Active.of(
-                    level = 4,
-                    ssid = "test ssid",
-                )
+            val networkModel = WifiNetworkModel.Active.of(level = 4, ssid = "test ssid")
+
             val wifiIcon =
                 WifiIcon.fromModel(model = networkModel, context = context, showHotspotInfo = true)
                     as WifiIcon.Visible
@@ -198,12 +193,9 @@
 
             assertThat(latest?.secondaryTitle).isEqualTo("test ssid")
             assertThat(latest?.secondaryLabel).isNull()
-            val expectedIcon =
-                Icon.Loaded(context.getDrawable(WifiIcons.WIFI_NO_INTERNET_ICONS[4])!!, null)
 
-            val actualIcon = latest?.icon
-            assertThat(actualIcon).isEqualTo(expectedIcon)
-            assertThat(latest?.iconId).isEqualTo(WifiIcons.WIFI_NO_INTERNET_ICONS[4])
+            val expectedIcon = InternetTileIconModel.ResourceId(WifiIcons.WIFI_NO_INTERNET_ICONS[4])
+            assertThat(latest?.icon).isEqualTo(expectedIcon)
             assertThat(latest?.contentDescription.loadContentDescription(context))
                 .isEqualTo("$internet,test ssid")
             val expectedSd = wifiIcon.contentDescription
@@ -229,8 +221,7 @@
             wifiRepository.setIsWifiDefault(true)
             wifiRepository.setWifiNetwork(networkModel)
 
-            val expectedIcon =
-                Icon.Loaded(context.getDrawable(WifiIcons.WIFI_NO_INTERNET_ICONS[4])!!, null)
+            val expectedIcon = InternetTileIconModel.ResourceId(WifiIcons.WIFI_NO_INTERNET_ICONS[4])
             assertThat(latest?.icon).isEqualTo(expectedIcon)
             assertThat(latest?.stateDescription.loadContentDescription(context))
                 .doesNotContain(
@@ -249,9 +240,8 @@
             setWifiNetworkWithHotspot(WifiNetworkModel.HotspotDeviceType.TABLET)
 
             val expectedIcon =
-                Icon.Loaded(
-                    context.getDrawable(com.android.settingslib.R.drawable.ic_hotspot_tablet)!!,
-                    null
+                InternetTileIconModel.ResourceId(
+                    com.android.settingslib.R.drawable.ic_hotspot_tablet
                 )
             assertThat(latest?.icon).isEqualTo(expectedIcon)
             assertThat(latest?.stateDescription.loadContentDescription(context))
@@ -271,9 +261,8 @@
             setWifiNetworkWithHotspot(WifiNetworkModel.HotspotDeviceType.LAPTOP)
 
             val expectedIcon =
-                Icon.Loaded(
-                    context.getDrawable(com.android.settingslib.R.drawable.ic_hotspot_laptop)!!,
-                    null
+                InternetTileIconModel.ResourceId(
+                    com.android.settingslib.R.drawable.ic_hotspot_laptop
                 )
             assertThat(latest?.icon).isEqualTo(expectedIcon)
             assertThat(latest?.stateDescription.loadContentDescription(context))
@@ -293,10 +282,10 @@
             setWifiNetworkWithHotspot(WifiNetworkModel.HotspotDeviceType.WATCH)
 
             val expectedIcon =
-                Icon.Loaded(
-                    context.getDrawable(com.android.settingslib.R.drawable.ic_hotspot_watch)!!,
-                    null
+                InternetTileIconModel.ResourceId(
+                    com.android.settingslib.R.drawable.ic_hotspot_watch
                 )
+
             assertThat(latest?.icon).isEqualTo(expectedIcon)
             assertThat(latest?.stateDescription.loadContentDescription(context))
                 .isEqualTo(
@@ -315,10 +304,7 @@
             setWifiNetworkWithHotspot(WifiNetworkModel.HotspotDeviceType.AUTO)
 
             val expectedIcon =
-                Icon.Loaded(
-                    context.getDrawable(com.android.settingslib.R.drawable.ic_hotspot_auto)!!,
-                    null
-                )
+                InternetTileIconModel.ResourceId(com.android.settingslib.R.drawable.ic_hotspot_auto)
             assertThat(latest?.icon).isEqualTo(expectedIcon)
             assertThat(latest?.stateDescription.loadContentDescription(context))
                 .isEqualTo(
@@ -336,9 +322,8 @@
             setWifiNetworkWithHotspot(WifiNetworkModel.HotspotDeviceType.PHONE)
 
             val expectedIcon =
-                Icon.Loaded(
-                    context.getDrawable(com.android.settingslib.R.drawable.ic_hotspot_phone)!!,
-                    null
+                InternetTileIconModel.ResourceId(
+                    com.android.settingslib.R.drawable.ic_hotspot_phone
                 )
             assertThat(latest?.icon).isEqualTo(expectedIcon)
             assertThat(latest?.stateDescription.loadContentDescription(context))
@@ -358,9 +343,8 @@
             setWifiNetworkWithHotspot(WifiNetworkModel.HotspotDeviceType.UNKNOWN)
 
             val expectedIcon =
-                Icon.Loaded(
-                    context.getDrawable(com.android.settingslib.R.drawable.ic_hotspot_phone)!!,
-                    null
+                InternetTileIconModel.ResourceId(
+                    com.android.settingslib.R.drawable.ic_hotspot_phone
                 )
             assertThat(latest?.icon).isEqualTo(expectedIcon)
             assertThat(latest?.stateDescription.loadContentDescription(context))
@@ -380,10 +364,10 @@
             setWifiNetworkWithHotspot(WifiNetworkModel.HotspotDeviceType.INVALID)
 
             val expectedIcon =
-                Icon.Loaded(
-                    context.getDrawable(com.android.settingslib.R.drawable.ic_hotspot_phone)!!,
-                    null
+                InternetTileIconModel.ResourceId(
+                    com.android.settingslib.R.drawable.ic_hotspot_phone
                 )
+
             assertThat(latest?.icon).isEqualTo(expectedIcon)
             assertThat(latest?.stateDescription.loadContentDescription(context))
                 .isEqualTo(
@@ -426,8 +410,9 @@
             assertThat(latest?.secondaryLabel).isNull()
             assertThat(latest?.secondaryTitle)
                 .isEqualTo(context.getString(R.string.quick_settings_networks_available))
-            assertThat(latest?.icon).isNull()
-            assertThat(latest?.iconId).isEqualTo(R.drawable.ic_qs_no_internet_available)
+            val expectedIcon =
+                InternetTileIconModel.ResourceId(R.drawable.ic_qs_no_internet_available)
+            assertThat(latest?.icon).isEqualTo(expectedIcon)
             assertThat(latest?.stateDescription).isNull()
             val expectedCd =
                 "$internet,${context.getString(R.string.quick_settings_networks_available)}"
@@ -435,54 +420,19 @@
                 .isEqualTo(expectedCd)
         }
 
-    /**
-     * We expect a RuntimeException because [underTest] instantiates a SignalDrawable on the
-     * provided context, and so the SignalDrawable constructor attempts to instantiate a Handler()
-     * on the mentioned context. Since that context does not have a looper assigned to it, the
-     * handler instantiation will throw a RuntimeException.
-     *
-     * TODO(b/338068066): Robolectric behavior differs in that it does not throw the exception So
-     *   either we should make Robolectric behave similar to the device test, or change this test to
-     *   look for a different signal than the exception, when run by Robolectric. For now we just
-     *   assume the test is not Robolectric.
-     */
-    @Test(expected = java.lang.RuntimeException::class)
-    fun mobileDefault_usesNetworkNameAndIcon_throwsRunTimeException() =
-        testScope.runTest {
-            assumeFalse(isRobolectricTest())
-
-            collectLastValue(underTest.tileData(testUser, flowOf(DataUpdateTrigger.InitialRequest)))
-
-            connectivityRepository.setMobileConnected()
-            mobileConnectionsRepository.mobileIsDefault.value = true
-            mobileConnectionRepository.apply {
-                setAllLevels(3)
-                setAllRoaming(false)
-                networkName.value = NetworkNameModel.Default("test network")
-            }
-
-            runCurrent()
-        }
-
-    /**
-     * See [mobileDefault_usesNetworkNameAndIcon_throwsRunTimeException] for description of the
-     * problem this test solves. The solution here is to assign a looper to the context via
-     * RunWithLooper. In the production code, the solution is to use a Main CoroutineContext for
-     * creating the SignalDrawable.
-     */
-    @TestableLooper.RunWithLooper
     @Test
-    fun mobileDefault_run_withLooper_usesNetworkNameAndIcon() =
+    fun mobileDefault_usesNetworkNameAndIcon() =
         testScope.runTest {
             val latest by
                 collectLastValue(
                     underTest.tileData(testUser, flowOf(DataUpdateTrigger.InitialRequest))
                 )
+            val iconLevel = 3
 
             connectivityRepository.setMobileConnected()
             mobileConnectionsRepository.mobileIsDefault.value = true
             mobileConnectionRepository.apply {
-                setAllLevels(3)
+                setAllLevels(iconLevel)
                 setAllRoaming(false)
                 networkName.value = NetworkNameModel.Default("test network")
             }
@@ -491,8 +441,9 @@
             assertThat(latest?.secondaryTitle).isNotNull()
             assertThat(latest?.secondaryTitle.toString()).contains("test network")
             assertThat(latest?.secondaryLabel).isNull()
-            assertThat(latest?.icon).isInstanceOf(Icon.Loaded::class.java)
-            assertThat(latest?.iconId).isNull()
+            val expectedIcon = InternetTileIconModel.Cellular(iconLevel)
+
+            assertThat(latest?.icon).isEqualTo(expectedIcon)
             assertThat(latest?.stateDescription.loadContentDescription(context))
                 .isEqualTo(latest?.secondaryTitle.toString())
             assertThat(latest?.contentDescription.loadContentDescription(context))
@@ -513,8 +464,8 @@
             assertThat(latest?.secondaryLabel.loadText(context))
                 .isEqualTo(ethernetIcon!!.contentDescription.loadContentDescription(context))
             assertThat(latest?.secondaryTitle).isNull()
-            assertThat(latest?.iconId).isEqualTo(R.drawable.stat_sys_ethernet_fully)
-            assertThat(latest?.icon).isNull()
+            val expectedIcon = InternetTileIconModel.ResourceId(R.drawable.stat_sys_ethernet_fully)
+            assertThat(latest?.icon).isEqualTo(expectedIcon)
             assertThat(latest?.stateDescription).isNull()
             assertThat(latest?.contentDescription.loadContentDescription(context))
                 .isEqualTo(latest?.secondaryLabel.loadText(context))
@@ -534,8 +485,8 @@
             assertThat(latest?.secondaryLabel.loadText(context))
                 .isEqualTo(ethernetIcon!!.contentDescription.loadContentDescription(context))
             assertThat(latest?.secondaryTitle).isNull()
-            assertThat(latest?.iconId).isEqualTo(R.drawable.stat_sys_ethernet)
-            assertThat(latest?.icon).isNull()
+            val expectedIcon = InternetTileIconModel.ResourceId(R.drawable.stat_sys_ethernet)
+            assertThat(latest?.icon).isEqualTo(expectedIcon)
             assertThat(latest?.stateDescription).isNull()
             assertThat(latest?.contentDescription.loadContentDescription(context))
                 .isEqualTo(latest?.secondaryLabel.loadText(context))
@@ -543,11 +494,7 @@
 
     private fun setWifiNetworkWithHotspot(hotspot: WifiNetworkModel.HotspotDeviceType) {
         val networkModel =
-            WifiNetworkModel.Active.of(
-                level = 4,
-                ssid = "test ssid",
-                hotspotDeviceType = hotspot,
-            )
+            WifiNetworkModel.Active.of(level = 4, ssid = "test ssid", hotspotDeviceType = hotspot)
 
         connectivityRepository.setWifiConnected()
         wifiRepository.setIsWifiDefault(true)
@@ -560,7 +507,7 @@
         val NOT_CONNECTED_NETWORKS_UNAVAILABLE =
             InternetTileModel.Inactive(
                 secondaryLabel = Text.Resource(R.string.quick_settings_networks_unavailable),
-                iconId = R.drawable.ic_qs_no_internet_unavailable,
+                icon = InternetTileIconModel.ResourceId(R.drawable.ic_qs_no_internet_unavailable),
                 stateDescription = null,
                 contentDescription =
                     ContentDescription.Resource(R.string.quick_settings_networks_unavailable),
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelTest.kt
index abd1e2c..f32894d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelTest.kt
@@ -16,45 +16,129 @@
 
 package com.android.systemui.qs.ui.viewmodel
 
+import android.platform.test.annotations.EnableFlags
 import android.testing.TestableLooper
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.authentication.data.repository.FakeAuthenticationRepository
+import com.android.systemui.authentication.domain.interactor.AuthenticationResult
+import com.android.systemui.authentication.domain.interactor.authenticationInteractor
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.flags.EnableSceneContainer
 import com.android.systemui.kosmos.testScope
+import com.android.systemui.lifecycle.activateIn
+import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
+import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
+import com.android.systemui.power.domain.interactor.powerInteractor
 import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.domain.startable.sceneContainerStartable
 import com.android.systemui.scene.shared.model.Overlays
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.shade.domain.interactor.shadeInteractor
+import com.android.systemui.shade.shared.flag.DualShade
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
+import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 @TestableLooper.RunWithLooper
 @EnableSceneContainer
+@EnableFlags(DualShade.FLAG_NAME)
 class QuickSettingsShadeOverlayContentViewModelTest : SysuiTestCase() {
 
     private val kosmos = testKosmos()
     private val testScope = kosmos.testScope
     private val sceneInteractor = kosmos.sceneInteractor
 
-    private val underTest = kosmos.quickSettingsShadeOverlayContentViewModel
+    private val underTest by lazy { kosmos.quickSettingsShadeOverlayContentViewModel }
+
+    @Before
+    fun setUp() {
+        kosmos.sceneContainerStartable.start()
+        underTest.activateIn(testScope)
+    }
 
     @Test
     fun onScrimClicked_hidesShade() =
         testScope.runTest {
             val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
-            sceneInteractor.showOverlay(
-                overlay = Overlays.QuickSettingsShade,
-                loggingReason = "test",
-            )
+            sceneInteractor.showOverlay(Overlays.QuickSettingsShade, "test")
             assertThat(currentOverlays).contains(Overlays.QuickSettingsShade)
 
             underTest.onScrimClicked()
 
             assertThat(currentOverlays).doesNotContain(Overlays.QuickSettingsShade)
         }
+
+    @Test
+    fun deviceLocked_hidesShade() =
+        testScope.runTest {
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            unlockDevice()
+            sceneInteractor.showOverlay(Overlays.QuickSettingsShade, "test")
+            assertThat(currentOverlays).contains(Overlays.QuickSettingsShade)
+
+            lockDevice()
+
+            assertThat(currentOverlays).isEmpty()
+        }
+
+    @Test
+    fun bouncerShown_hidesShade() =
+        testScope.runTest {
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            lockDevice()
+            sceneInteractor.showOverlay(Overlays.QuickSettingsShade, "test")
+            assertThat(currentOverlays).contains(Overlays.QuickSettingsShade)
+
+            sceneInteractor.changeScene(Scenes.Bouncer, "test")
+            runCurrent()
+
+            assertThat(currentOverlays).doesNotContain(Overlays.QuickSettingsShade)
+        }
+
+    @Test
+    fun shadeNotTouchable_hidesShade() =
+        testScope.runTest {
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            val isShadeTouchable by collectLastValue(kosmos.shadeInteractor.isShadeTouchable)
+            assertThat(isShadeTouchable).isTrue()
+            sceneInteractor.showOverlay(Overlays.QuickSettingsShade, "test")
+            assertThat(currentOverlays).contains(Overlays.QuickSettingsShade)
+
+            lockDevice()
+            assertThat(isShadeTouchable).isFalse()
+            assertThat(currentOverlays).doesNotContain(Overlays.QuickSettingsShade)
+        }
+
+    private fun TestScope.lockDevice() {
+        val currentScene by collectLastValue(sceneInteractor.currentScene)
+        kosmos.powerInteractor.setAsleepForTest()
+        runCurrent()
+
+        assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+    }
+
+    private suspend fun TestScope.unlockDevice() {
+        val currentScene by collectLastValue(sceneInteractor.currentScene)
+        kosmos.powerInteractor.setAwakeForTest()
+        runCurrent()
+        assertThat(
+                kosmos.authenticationInteractor.authenticate(
+                    FakeAuthenticationRepository.DEFAULT_PIN
+                )
+            )
+            .isEqualTo(AuthenticationResult.SUCCEEDED)
+
+        assertThat(currentScene).isEqualTo(Scenes.Gone)
+    }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceCommandHandlerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceCommandHandlerTest.kt
deleted file mode 100644
index 57cfe1b..0000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceCommandHandlerTest.kt
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.recordissue
-
-import android.app.IActivityManager
-import android.app.NotificationManager
-import android.net.Uri
-import android.os.UserHandle
-import android.testing.TestableLooper
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.animation.DialogTransitionAnimator
-import com.android.systemui.animation.dialogTransitionAnimator
-import com.android.systemui.concurrency.fakeExecutor
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.kosmos.testCase
-import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor
-import com.android.systemui.settings.UserContextProvider
-import com.android.systemui.settings.userFileManager
-import com.android.systemui.settings.userTracker
-import com.android.traceur.TraceConfig
-import com.google.common.truth.Truth
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.kotlin.any
-import org.mockito.kotlin.isNull
-import org.mockito.kotlin.mock
-import org.mockito.kotlin.verify
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-@TestableLooper.RunWithLooper(setAsMainLooper = true)
-class IssueRecordingServiceCommandHandlerTest : SysuiTestCase() {
-
-    private val kosmos = Kosmos().also { it.testCase = this }
-    private val bgExecutor = kosmos.fakeExecutor
-    private val userContextProvider: UserContextProvider = kosmos.userTracker
-    private val dialogTransitionAnimator: DialogTransitionAnimator = kosmos.dialogTransitionAnimator
-    private lateinit var traceurMessageSender: TraceurMessageSender
-    private val issueRecordingState =
-        IssueRecordingState(kosmos.userTracker, kosmos.userFileManager)
-
-    private val iActivityManager = mock<IActivityManager>()
-    private val notificationManager = mock<NotificationManager>()
-    private val panelInteractor = mock<PanelInteractor>()
-
-    private lateinit var underTest: IssueRecordingServiceCommandHandler
-
-    @Before
-    fun setup() {
-        traceurMessageSender = mock<TraceurMessageSender>()
-        underTest =
-            IssueRecordingServiceCommandHandler(
-                bgExecutor,
-                dialogTransitionAnimator,
-                panelInteractor,
-                traceurMessageSender,
-                issueRecordingState,
-                iActivityManager,
-                notificationManager,
-                userContextProvider
-            )
-    }
-
-    @Test
-    fun startsTracing_afterReceivingActionStartCommand() {
-        underTest.handleStartCommand()
-        bgExecutor.runAllReady()
-
-        Truth.assertThat(issueRecordingState.isRecording).isTrue()
-        verify(traceurMessageSender).startTracing(any<TraceConfig>())
-    }
-
-    @Test
-    fun stopsTracing_afterReceivingStopTracingCommand() {
-        underTest.handleStopCommand(mContext.contentResolver)
-        bgExecutor.runAllReady()
-
-        Truth.assertThat(issueRecordingState.isRecording).isFalse()
-        verify(traceurMessageSender).stopTracing()
-    }
-
-    @Test
-    fun cancelsNotification_afterReceivingShareCommand() {
-        underTest.handleShareCommand(0, null, mContext)
-        bgExecutor.runAllReady()
-
-        verify(notificationManager).cancelAsUser(isNull(), anyInt(), any<UserHandle>())
-    }
-
-    @Test
-    fun requestBugreport_afterReceivingShareCommand_withTakeBugreportTrue() {
-        issueRecordingState.takeBugreport = true
-        val uri = mock<Uri>()
-
-        underTest.handleShareCommand(0, uri, mContext)
-        bgExecutor.runAllReady()
-
-        verify(iActivityManager).requestBugReportWithExtraAttachment(uri)
-    }
-
-    @Test
-    fun sharesTracesDirectly_afterReceivingShareCommand_withTakeBugreportFalse() {
-        issueRecordingState.takeBugreport = false
-        val uri = mock<Uri>()
-
-        underTest.handleShareCommand(0, uri, mContext)
-        bgExecutor.runAllReady()
-
-        verify(traceurMessageSender).shareTraces(mContext, uri)
-    }
-
-    @Test
-    fun closesShade_afterReceivingShareCommand() {
-        val uri = mock<Uri>()
-
-        underTest.handleShareCommand(0, uri, mContext)
-        bgExecutor.runAllReady()
-
-        verify(panelInteractor).collapsePanels()
-    }
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt
new file mode 100644
index 0000000..a1edfc1
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2024 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.systemui.recordissue
+
+import android.app.IActivityManager
+import android.app.NotificationManager
+import android.net.Uri
+import android.os.UserHandle
+import android.testing.TestableLooper
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.DialogTransitionAnimator
+import com.android.systemui.animation.dialogTransitionAnimator
+import com.android.systemui.concurrency.fakeExecutor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.testCase
+import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor
+import com.android.systemui.settings.UserContextProvider
+import com.android.systemui.settings.userFileManager
+import com.android.systemui.settings.userTracker
+import com.android.traceur.TraceConfig
+import com.google.common.truth.Truth
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.kotlin.any
+import org.mockito.kotlin.isNull
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.verify
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+class IssueRecordingServiceSessionTest : SysuiTestCase() {
+
+    private val kosmos = Kosmos().also { it.testCase = this }
+    private val bgExecutor = kosmos.fakeExecutor
+    private val userContextProvider: UserContextProvider = kosmos.userTracker
+    private val dialogTransitionAnimator: DialogTransitionAnimator = kosmos.dialogTransitionAnimator
+    private lateinit var traceurConnection: TraceurConnection
+    private val issueRecordingState =
+        IssueRecordingState(kosmos.userTracker, kosmos.userFileManager)
+
+    private val iActivityManager = mock<IActivityManager>()
+    private val notificationManager = mock<NotificationManager>()
+    private val panelInteractor = mock<PanelInteractor>()
+
+    private lateinit var underTest: IssueRecordingServiceSession
+
+    @Before
+    fun setup() {
+        traceurConnection = mock<TraceurConnection>()
+        underTest =
+            IssueRecordingServiceSession(
+                bgExecutor,
+                dialogTransitionAnimator,
+                panelInteractor,
+                traceurConnection,
+                issueRecordingState,
+                iActivityManager,
+                notificationManager,
+                userContextProvider,
+            )
+    }
+
+    @Test
+    fun startsTracing_afterReceivingActionStartCommand() {
+        underTest.start()
+        bgExecutor.runAllReady()
+
+        Truth.assertThat(issueRecordingState.isRecording).isTrue()
+        verify(traceurConnection).startTracing(any<TraceConfig>())
+    }
+
+    @Test
+    fun stopsTracing_afterReceivingStopTracingCommand() {
+        underTest.stop(mContext.contentResolver)
+        bgExecutor.runAllReady()
+
+        Truth.assertThat(issueRecordingState.isRecording).isFalse()
+        verify(traceurConnection).stopTracing()
+    }
+
+    @Test
+    fun cancelsNotification_afterReceivingShareCommand() {
+        underTest.share(0, null)
+        bgExecutor.runAllReady()
+
+        verify(notificationManager).cancelAsUser(isNull(), anyInt(), any<UserHandle>())
+    }
+
+    @Test
+    fun requestBugreport_afterReceivingShareCommand_withTakeBugreportTrue() {
+        issueRecordingState.takeBugreport = true
+        val uri = mock<Uri>()
+
+        underTest.share(0, uri)
+        bgExecutor.runAllReady()
+
+        verify(iActivityManager).requestBugReportWithExtraAttachment(uri)
+    }
+
+    @Test
+    fun sharesTracesDirectly_afterReceivingShareCommand_withTakeBugreportFalse() {
+        issueRecordingState.takeBugreport = false
+        val uri = mock<Uri>()
+
+        underTest.share(0, uri)
+        bgExecutor.runAllReady()
+
+        verify(traceurConnection).shareTraces(uri)
+    }
+
+    @Test
+    fun closesShade_afterReceivingShareCommand() {
+        val uri = mock<Uri>()
+
+        underTest.share(0, uri)
+        bgExecutor.runAllReady()
+
+        verify(panelInteractor).collapsePanels()
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/RecordIssueDialogDelegateTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/RecordIssueDialogDelegateTest.kt
index 8d84c3e..9639735 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/RecordIssueDialogDelegateTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/RecordIssueDialogDelegateTest.kt
@@ -78,7 +78,6 @@
     @Mock private lateinit var sysuiState: SysUiState
     @Mock private lateinit var systemUIDialogManager: SystemUIDialogManager
     @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher
-    @Mock private lateinit var traceurMessageSender: TraceurMessageSender
     private val systemClock = FakeSystemClock()
     private val bgExecutor = FakeExecutor(systemClock)
     private val mainExecutor = FakeExecutor(systemClock)
@@ -104,7 +103,7 @@
                     systemUIDialogManager,
                     sysuiState,
                     broadcastDispatcher,
-                    mDialogTransitionAnimator
+                    mDialogTransitionAnimator,
                 )
             )
 
@@ -120,7 +119,6 @@
                     mediaProjectionMetricsLogger,
                     screenCaptureDisabledDialogDelegate,
                     state,
-                    traceurMessageSender
                 ) {
                     latch.countDown()
                 }
@@ -166,7 +164,7 @@
         verify(mediaProjectionMetricsLogger, never())
             .notifyProjectionInitiated(
                 anyInt(),
-                eq(SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER)
+                eq(SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER),
             )
         assertThat(screenRecordSwitch.isChecked).isFalse()
     }
@@ -188,7 +186,7 @@
         verify(mediaProjectionMetricsLogger)
             .notifyProjectionInitiated(
                 anyInt(),
-                eq(SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER)
+                eq(SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER),
             )
         verify(factory, times(2)).create(any(SystemUIDialog.Delegate::class.java))
     }
@@ -208,7 +206,7 @@
         verify(mediaProjectionMetricsLogger)
             .notifyProjectionInitiated(
                 anyInt(),
-                eq(SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER)
+                eq(SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER),
             )
         verify(factory, never()).create()
     }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/TraceurConnectionTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/TraceurConnectionTest.kt
new file mode 100644
index 0000000..d90cca9
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/TraceurConnectionTest.kt
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2024 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.systemui.recordissue
+
+import android.os.IBinder
+import android.os.Looper
+import android.os.Messenger
+import android.testing.TestableLooper
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.settings.UserContextProvider
+import com.android.traceur.PresetTraceConfigs
+import java.util.concurrent.CountDownLatch
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.mock
+import org.mockito.MockitoAnnotations
+import org.mockito.kotlin.any
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+class TraceurConnectionTest : SysuiTestCase() {
+
+    @Mock private lateinit var userContextProvider: UserContextProvider
+
+    private lateinit var underTest: TraceurConnection
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+        whenever(userContextProvider.userContext).thenReturn(mContext)
+        underTest = TraceurConnection.Provider(userContextProvider, Looper.getMainLooper()).create()
+    }
+
+    @Test
+    fun onBoundRunnables_areRun_whenServiceIsBound() {
+        val latch = CountDownLatch(1)
+        underTest.onBound.add { latch.countDown() }
+
+        underTest.onServiceConnected(
+            InstrumentationRegistry.getInstrumentation().componentName,
+            mock(IBinder::class.java),
+        )
+
+        latch.await()
+    }
+
+    @Test
+    fun startTracing_sendsMsg_toStartTracing() {
+        underTest.binder = mock(Messenger::class.java)
+
+        underTest.startTracing(PresetTraceConfigs.getThermalConfig())
+
+        verify(underTest.binder)!!.send(any())
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/UserAwareConnectionTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/UserAwareConnectionTest.kt
new file mode 100644
index 0000000..f671bf4
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/UserAwareConnectionTest.kt
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2024 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.systemui.recordissue
+
+import android.content.Context
+import android.content.Intent
+import android.testing.TestableLooper
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.settings.UserContextProvider
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.Mock
+import org.mockito.Mockito.any
+import org.mockito.MockitoAnnotations
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+class UserAwareConnectionTest : SysuiTestCase() {
+
+    @Mock private lateinit var userContextProvider: UserContextProvider
+    @Mock private lateinit var mockContext: Context
+
+    private lateinit var underTest: UserAwareConnection
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+        whenever(userContextProvider.userContext).thenReturn(mockContext)
+        whenever(mockContext.bindService(any(), any(), anyInt())).thenReturn(true)
+        underTest = UserAwareConnection(userContextProvider, Intent())
+    }
+
+    @Test
+    fun doBindService_requestToBindToTheService_viaTheCorrectUserContext() {
+        underTest.doBind()
+
+        verify(userContextProvider).userContext
+    }
+
+    @Test
+    fun doBindService_DoesntRequestToBindToTheService_IfAlreadyRequested() {
+        underTest.doBind()
+        underTest.doBind()
+        underTest.doBind()
+
+        verify(userContextProvider, times(1)).userContext
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
index a0cafcb..d2bf9b88 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
@@ -50,9 +50,7 @@
 import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
 import com.android.systemui.power.domain.interactor.powerInteractor
 import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.scene.domain.resolver.homeSceneFamilyResolver
 import com.android.systemui.scene.domain.startable.sceneContainerStartable
-import com.android.systemui.scene.shared.model.SceneFamilies
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.scene.shared.model.fakeSceneDataSource
 import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel
@@ -185,7 +183,6 @@
     fun swipeUpOnShadeScene_withAuthMethodSwipe_lockscreenNotDismissed_goesToLockscreen() =
         testScope.runTest {
             val actions by collectLastValue(kosmos.shadeUserActionsViewModel.actions)
-            val homeScene by collectLastValue(kosmos.homeSceneFamilyResolver.resolvedScene)
             kosmos.setAuthMethod(AuthenticationMethodModel.None, enableLockscreen = true)
             kosmos.assertCurrentScene(Scenes.Lockscreen)
 
@@ -195,9 +192,8 @@
 
             val upDestinationSceneKey =
                 (actions?.get(Swipe.Up) as? UserActionResult.ChangeScene)?.toScene
-            assertThat(upDestinationSceneKey).isEqualTo(SceneFamilies.Home)
-            assertThat(homeScene).isEqualTo(Scenes.Lockscreen)
-            kosmos.emulateUserDrivenTransition(to = homeScene)
+            assertThat(upDestinationSceneKey).isEqualTo(Scenes.Lockscreen)
+            kosmos.emulateUserDrivenTransition(to = Scenes.Lockscreen)
         }
 
     @Test
@@ -205,7 +201,6 @@
         testScope.runTest {
             val actions by collectLastValue(kosmos.shadeUserActionsViewModel.actions)
             val canSwipeToEnter by collectLastValue(kosmos.deviceEntryInteractor.canSwipeToEnter)
-            val homeScene by collectLastValue(kosmos.homeSceneFamilyResolver.resolvedScene)
 
             kosmos.setAuthMethod(AuthenticationMethodModel.None, enableLockscreen = true)
 
@@ -222,9 +217,8 @@
 
             val upDestinationSceneKey =
                 (actions?.get(Swipe.Up) as? UserActionResult.ChangeScene)?.toScene
-            assertThat(upDestinationSceneKey).isEqualTo(SceneFamilies.Home)
-            assertThat(homeScene).isEqualTo(Scenes.Gone)
-            kosmos.emulateUserDrivenTransition(to = homeScene)
+            assertThat(upDestinationSceneKey).isEqualTo(Scenes.Gone)
+            kosmos.emulateUserDrivenTransition(to = Scenes.Gone)
         }
 
     @Test
@@ -341,7 +335,7 @@
             bouncerActionButton?.onClick?.invoke()
             runCurrent()
 
-            // TODO(b/298026988): Assert that an activity was started once we use ActivityStarter.
+            // TODO(b/369765704): Assert that an activity was started once we use ActivityStarter.
         }
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModelTest.kt
index 5c47f55..47fae9f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModelTest.kt
@@ -106,7 +106,7 @@
             runCurrent()
 
             assertThat(userActions?.get(swipeDownFromTopWithTwoFingers()))
-                .isEqualTo(UserActionResult(Scenes.QuickSettings))
+                .isEqualTo(UserActionResult(Scenes.QuickSettings, isIrreversible = true))
         }
 
     @Test
@@ -118,7 +118,7 @@
             runCurrent()
 
             assertThat(userActions?.get(swipeDownFromTopWithTwoFingers()))
-                .isEqualTo(UserActionResult(Scenes.Shade, ToSplitShade))
+                .isEqualTo(UserActionResult(Scenes.Shade, ToSplitShade, isIrreversible = true))
         }
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerGestureFilterTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerGestureFilterTest.kt
deleted file mode 100644
index efde1ec..0000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerGestureFilterTest.kt
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2024 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.
- */
-
-@file:OptIn(ExperimentalCoroutinesApi::class)
-
-package com.android.systemui.scene.ui.viewmodel
-
-import android.graphics.Region
-import android.view.setSystemGestureExclusionRegion
-import androidx.compose.ui.geometry.Offset
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.lifecycle.activateIn
-import com.android.systemui.scene.sceneContainerGestureFilterFactory
-import com.android.systemui.settings.displayTracker
-import com.android.systemui.testKosmos
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class SceneContainerGestureFilterTest : SysuiTestCase() {
-
-    private val kosmos = testKosmos()
-    private val testScope = kosmos.testScope
-    private val displayId = kosmos.displayTracker.defaultDisplayId
-
-    private val underTest = kosmos.sceneContainerGestureFilterFactory.create(displayId)
-    private val activationJob = Job()
-
-    @Test
-    fun shouldFilterGesture_whenNoRegion_returnsFalse() =
-        testScope.runTest {
-            activate()
-            setSystemGestureExclusionRegion(displayId, null)
-            runCurrent()
-
-            assertThat(underTest.shouldFilterGesture(Offset(100f, 100f))).isFalse()
-        }
-
-    @Test
-    fun shouldFilterGesture_whenOutsideRegion_returnsFalse() =
-        testScope.runTest {
-            activate()
-            setSystemGestureExclusionRegion(displayId, Region(0, 0, 200, 200))
-            runCurrent()
-
-            assertThat(underTest.shouldFilterGesture(Offset(300f, 100f))).isFalse()
-        }
-
-    @Test
-    fun shouldFilterGesture_whenInsideRegion_returnsTrue() =
-        testScope.runTest {
-            activate()
-            setSystemGestureExclusionRegion(displayId, Region(0, 0, 200, 200))
-            runCurrent()
-
-            assertThat(underTest.shouldFilterGesture(Offset(100f, 100f))).isTrue()
-        }
-
-    @Test(expected = IllegalStateException::class)
-    fun shouldFilterGesture_beforeActivation_throws() =
-        testScope.runTest {
-            setSystemGestureExclusionRegion(displayId, Region(0, 0, 200, 200))
-            runCurrent()
-
-            underTest.shouldFilterGesture(Offset(100f, 100f))
-        }
-
-    @Test(expected = IllegalStateException::class)
-    fun shouldFilterGesture_afterCancellation_throws() =
-        testScope.runTest {
-            activate()
-            setSystemGestureExclusionRegion(displayId, Region(0, 0, 200, 200))
-            runCurrent()
-
-            cancel()
-
-            underTest.shouldFilterGesture(Offset(100f, 100f))
-        }
-
-    private fun TestScope.activate() {
-        underTest.activateIn(testScope, activationJob)
-        runCurrent()
-    }
-
-    private fun TestScope.cancel() {
-        activationJob.cancel()
-        runCurrent()
-    }
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerHapticsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerHapticsViewModelTest.kt
new file mode 100644
index 0000000..ca9500b
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerHapticsViewModelTest.kt
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2024 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.systemui.scene.ui.viewmodel
+
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.view.HapticFeedbackConstants
+import android.view.View
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.compose.animation.scene.ContentKey
+import com.android.compose.animation.scene.ObservableTransitionState
+import com.android.compose.animation.scene.ObservableTransitionState.Transition.ShowOrHideOverlay
+import com.android.compose.animation.scene.OverlayKey
+import com.android.compose.animation.scene.SceneKey
+import com.android.systemui.Flags
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.flags.EnableSceneContainer
+import com.android.systemui.haptics.msdl.fakeMSDLPlayer
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.lifecycle.activateIn
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.sceneContainerHapticsViewModelFactory
+import com.android.systemui.scene.shared.model.Overlays
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.testKosmos
+import com.google.android.msdl.data.model.MSDLToken
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.verifyNoMoreInteractions
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@EnableSceneContainer
+class SceneContainerHapticsViewModelTest() : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+    private val sceneInteractor by lazy { kosmos.sceneInteractor }
+    private val msdlPlayer = kosmos.fakeMSDLPlayer
+    private val view = mock<View>()
+
+    private lateinit var underTest: SceneContainerHapticsViewModel
+
+    @Before
+    fun setup() {
+        underTest = kosmos.sceneContainerHapticsViewModelFactory.create(view)
+        underTest.activateIn(testScope)
+    }
+
+    @EnableFlags(Flags.FLAG_MSDL_FEEDBACK)
+    @DisableFlags(Flags.FLAG_DUAL_SHADE)
+    @Test
+    fun onValidSceneTransition_withMSDL_playsMSDLShadePullHaptics() =
+        testScope.runTest {
+            // GIVEN a valid scene transition to play haptics
+            val validTransition = createTransitionState(from = Scenes.Gone, to = Scenes.Shade)
+
+            // WHEN the transition occurs
+            sceneInteractor.setTransitionState(MutableStateFlow(validTransition))
+            runCurrent()
+
+            // THEN the expected token plays without interaction properties
+            assertThat(msdlPlayer.latestTokenPlayed).isEqualTo(MSDLToken.SWIPE_THRESHOLD_INDICATOR)
+            assertThat(msdlPlayer.latestPropertiesPlayed).isNull()
+        }
+
+    @EnableFlags(Flags.FLAG_MSDL_FEEDBACK)
+    @DisableFlags(Flags.FLAG_DUAL_SHADE)
+    @Test
+    fun onInValidSceneTransition_withMSDL_doesNotPlayMSDLShadePullHaptics() =
+        testScope.runTest {
+            // GIVEN an invalid scene transition to play haptics
+            val invalidTransition = createTransitionState(from = Scenes.Shade, to = Scenes.Gone)
+
+            // WHEN the transition occurs
+            sceneInteractor.setTransitionState(MutableStateFlow(invalidTransition))
+            runCurrent()
+
+            // THEN the no token plays with no interaction properties
+            assertThat(msdlPlayer.latestTokenPlayed).isNull()
+            assertThat(msdlPlayer.latestPropertiesPlayed).isNull()
+        }
+
+    @DisableFlags(Flags.FLAG_DUAL_SHADE, Flags.FLAG_MSDL_FEEDBACK)
+    @Test
+    fun onValidSceneTransition_withoutMSDL_playsHapticConstantForShadePullHaptics() =
+        testScope.runTest {
+            // GIVEN a valid scene transition to play haptics
+            val validTransition = createTransitionState(from = Scenes.Gone, to = Scenes.Shade)
+
+            // WHEN the transition occurs
+            sceneInteractor.setTransitionState(MutableStateFlow(validTransition))
+            runCurrent()
+
+            // THEN the expected haptic feedback constant plays
+            verify(view).performHapticFeedback(eq(HapticFeedbackConstants.GESTURE_START))
+        }
+
+    @DisableFlags(Flags.FLAG_DUAL_SHADE, Flags.FLAG_MSDL_FEEDBACK)
+    @Test
+    fun onInValidSceneTransition_withoutMSDL_doesNotPlayHapticConstantForShadePullHaptics() =
+        testScope.runTest {
+            // GIVEN an invalid scene transition to play haptics
+            val invalidTransition = createTransitionState(from = Scenes.Shade, to = Scenes.Gone)
+
+            // WHEN the transition occurs
+            sceneInteractor.setTransitionState(MutableStateFlow(invalidTransition))
+            runCurrent()
+
+            // THEN the view does not play a haptic feedback constant
+            verifyNoMoreInteractions(view)
+        }
+
+    @EnableFlags(Flags.FLAG_MSDL_FEEDBACK, Flags.FLAG_DUAL_SHADE)
+    @Test
+    fun onValidOverlayTransition_withMSDL_playsMSDLShadePullHaptics() =
+        testScope.runTest {
+            // GIVEN a valid scene transition to play haptics
+            val validTransition =
+                createTransitionState(from = Scenes.Gone, to = Overlays.NotificationsShade)
+
+            // WHEN the transition occurs
+            sceneInteractor.setTransitionState(MutableStateFlow(validTransition))
+            runCurrent()
+
+            // THEN the expected token plays without interaction properties
+            assertThat(msdlPlayer.latestTokenPlayed).isEqualTo(MSDLToken.SWIPE_THRESHOLD_INDICATOR)
+            assertThat(msdlPlayer.latestPropertiesPlayed).isNull()
+        }
+
+    @EnableFlags(Flags.FLAG_MSDL_FEEDBACK, Flags.FLAG_DUAL_SHADE)
+    @Test
+    fun onInValidOverlayTransition_withMSDL_doesNotPlayMSDLShadePullHaptics() =
+        testScope.runTest {
+            // GIVEN an invalid scene transition to play haptics
+            val invalidTransition =
+                createTransitionState(from = Scenes.Bouncer, to = Overlays.NotificationsShade)
+
+            // WHEN the transition occurs
+            sceneInteractor.setTransitionState(MutableStateFlow(invalidTransition))
+            runCurrent()
+
+            // THEN the no token plays with no interaction properties
+            assertThat(msdlPlayer.latestTokenPlayed).isNull()
+            assertThat(msdlPlayer.latestPropertiesPlayed).isNull()
+        }
+
+    @EnableFlags(Flags.FLAG_DUAL_SHADE)
+    @DisableFlags(Flags.FLAG_MSDL_FEEDBACK)
+    @Test
+    fun onValidOverlayTransition_withoutMSDL_playsHapticConstantForShadePullHaptics() =
+        testScope.runTest {
+            // GIVEN a valid scene transition to play haptics
+            val validTransition =
+                createTransitionState(from = Scenes.Gone, to = Overlays.NotificationsShade)
+
+            // WHEN the transition occurs
+            sceneInteractor.setTransitionState(MutableStateFlow(validTransition))
+            runCurrent()
+
+            // THEN the expected haptic feedback constant plays
+            verify(view).performHapticFeedback(eq(HapticFeedbackConstants.GESTURE_START))
+        }
+
+    @EnableFlags(Flags.FLAG_DUAL_SHADE)
+    @DisableFlags(Flags.FLAG_MSDL_FEEDBACK)
+    @Test
+    fun onInValidOverlayTransition_withoutMSDL_doesNotPlayHapticConstantForShadePullHaptics() =
+        testScope.runTest {
+            // GIVEN an invalid scene transition to play haptics
+            val invalidTransition =
+                createTransitionState(from = Scenes.Bouncer, to = Overlays.NotificationsShade)
+
+            // WHEN the transition occurs
+            sceneInteractor.setTransitionState(MutableStateFlow(invalidTransition))
+            runCurrent()
+
+            // THEN the view does not play a haptic feedback constant
+            verifyNoMoreInteractions(view)
+        }
+
+    private fun createTransitionState(from: SceneKey, to: ContentKey) =
+        when (to) {
+            is SceneKey ->
+                ObservableTransitionState.Transition(
+                    fromScene = from,
+                    toScene = to,
+                    currentScene = flowOf(from),
+                    progress = MutableStateFlow(0.2f),
+                    isInitiatedByUserInput = true,
+                    isUserInputOngoing = flowOf(true),
+                )
+            is OverlayKey ->
+                ShowOrHideOverlay(
+                    overlay = to,
+                    fromContent = from,
+                    toContent = to,
+                    currentScene = from,
+                    currentOverlays = sceneInteractor.currentOverlays,
+                    progress = MutableStateFlow(0.2f),
+                    isInitiatedByUserInput = true,
+                    isUserInputOngoing = flowOf(true),
+                    previewProgress = flowOf(0f),
+                    isInPreviewStage = flowOf(false),
+                )
+        }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt
index e60e742..b632a8a 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt
@@ -21,27 +21,24 @@
 import android.platform.test.annotations.DisableFlags
 import android.platform.test.annotations.EnableFlags
 import android.view.MotionEvent
+import android.view.View
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.compose.animation.scene.DefaultEdgeDetector
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.classifier.domain.interactor.falsingInteractor
 import com.android.systemui.classifier.fakeFalsingManager
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.flags.EnableSceneContainer
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.lifecycle.activateIn
 import com.android.systemui.power.data.repository.fakePowerRepository
-import com.android.systemui.power.domain.interactor.powerInteractor
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.fakeOverlaysByKeys
 import com.android.systemui.scene.sceneContainerConfig
-import com.android.systemui.scene.sceneContainerGestureFilterFactory
-import com.android.systemui.scene.shared.logger.sceneLogger
+import com.android.systemui.scene.sceneContainerViewModelFactory
 import com.android.systemui.scene.shared.model.Overlays
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.scene.shared.model.fakeSceneDataSource
-import com.android.systemui.settings.displayTracker
 import com.android.systemui.shade.data.repository.fakeShadeRepository
 import com.android.systemui.shade.domain.interactor.shadeInteractor
 import com.android.systemui.shade.shared.flag.DualShade
@@ -72,6 +69,7 @@
     private val fakeShadeRepository by lazy { kosmos.fakeShadeRepository }
     private val sceneContainerConfig by lazy { kosmos.sceneContainerConfig }
     private val falsingManager by lazy { kosmos.fakeFalsingManager }
+    private val view = mock<View>()
 
     private lateinit var underTest: SceneContainerViewModel
 
@@ -81,16 +79,9 @@
     @Before
     fun setUp() {
         underTest =
-            SceneContainerViewModel(
-                sceneInteractor = sceneInteractor,
-                falsingInteractor = kosmos.falsingInteractor,
-                powerInteractor = kosmos.powerInteractor,
-                shadeInteractor = kosmos.shadeInteractor,
-                splitEdgeDetector = kosmos.splitEdgeDetector,
-                logger = kosmos.sceneLogger,
-                gestureFilterFactory = kosmos.sceneContainerGestureFilterFactory,
-                displayId = kosmos.displayTracker.defaultDisplayId,
-                motionEventHandlerReceiver = { motionEventHandler ->
+            kosmos.sceneContainerViewModelFactory.create(
+                view,
+                { motionEventHandler ->
                     this@SceneContainerViewModelTest.motionEventHandler = motionEventHandler
                 },
             )
@@ -185,8 +176,8 @@
             sceneContainerConfig.sceneKeys
                 .filter { it != currentScene }
                 .filter {
-                    // Moving to the Communal scene is not currently falsing protected.
-                    it != Scenes.Communal
+                    // Moving to the Communal and Dream scene is not currently falsing protected.
+                    it != Scenes.Communal && it != Scenes.Dream
                 }
                 .forEach { toScene ->
                     assertWithMessage("Protected scene $toScene not properly protected")
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImplTest.kt
index d163abf..19ac0cf 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImplTest.kt
@@ -287,7 +287,7 @@
 
     @Test
     fun anyExpansion_shadeGreater() =
-        testScope.runTest() {
+        testScope.runTest {
             // WHEN shade is more expanded than QS
             shadeTestUtil.setShadeAndQsExpansion(.5f, 0f)
             runCurrent()
@@ -298,7 +298,7 @@
 
     @Test
     fun anyExpansion_qsGreater() =
-        testScope.runTest() {
+        testScope.runTest {
             // WHEN qs is more expanded than shade
             shadeTestUtil.setShadeAndQsExpansion(0f, .5f)
             runCurrent()
@@ -308,6 +308,36 @@
         }
 
     @Test
+    fun isShadeAnyExpanded_shadeCollapsed() =
+        testScope.runTest {
+            val isShadeAnyExpanded by collectLastValue(underTest.isShadeAnyExpanded)
+            shadeTestUtil.setShadeExpansion(0f)
+            runCurrent()
+
+            assertThat(isShadeAnyExpanded).isFalse()
+        }
+
+    @Test
+    fun isShadeAnyExpanded_shadePartiallyExpanded() =
+        testScope.runTest {
+            val isShadeAnyExpanded by collectLastValue(underTest.isShadeAnyExpanded)
+            shadeTestUtil.setShadeExpansion(0.01f)
+            runCurrent()
+
+            assertThat(isShadeAnyExpanded).isTrue()
+        }
+
+    @Test
+    fun isShadeAnyExpanded_shadeFullyExpanded() =
+        testScope.runTest {
+            val isShadeAnyExpanded by collectLastValue(underTest.isShadeAnyExpanded)
+            shadeTestUtil.setShadeExpansion(1f)
+            runCurrent()
+
+            assertThat(isShadeAnyExpanded).isTrue()
+        }
+
+    @Test
     fun isShadeTouchable_isFalse_whenDeviceAsleepAndNotPulsing() =
         testScope.runTest {
             powerRepository.updateWakefulness(
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImplTest.kt
index 109cd05..4592b60 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImplTest.kt
@@ -35,6 +35,7 @@
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
+import org.junit.Assert.assertThrows
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -382,4 +383,44 @@
             // THEN user is not interacting
             assertThat(actual).isFalse()
         }
+
+    @Test
+    fun expandNotificationsShade_unsupported() =
+        testScope.runTest {
+            assertThrows(UnsupportedOperationException::class.java) {
+                underTest.expandNotificationsShade("reason")
+            }
+        }
+
+    @Test
+    fun expandQuickSettingsShade_unsupported() =
+        testScope.runTest {
+            assertThrows(UnsupportedOperationException::class.java) {
+                underTest.expandQuickSettingsShade("reason")
+            }
+        }
+
+    @Test
+    fun collapseNotificationsShade_unsupported() =
+        testScope.runTest {
+            assertThrows(UnsupportedOperationException::class.java) {
+                underTest.collapseNotificationsShade("reason")
+            }
+        }
+
+    @Test
+    fun collapseQuickSettingsShade_unsupported() =
+        testScope.runTest {
+            assertThrows(UnsupportedOperationException::class.java) {
+                underTest.collapseQuickSettingsShade("reason")
+            }
+        }
+
+    @Test
+    fun collapseEitherShade_unsupported() =
+        testScope.runTest {
+            assertThrows(UnsupportedOperationException::class.java) {
+                underTest.collapseEitherShade("reason")
+            }
+        }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt
index f6fe667ff..eb8ea8b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt
@@ -1,12 +1,15 @@
 package com.android.systemui.shade.ui.viewmodel
 
 import android.content.Intent
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
 import android.provider.AlarmClock
 import android.provider.Settings
 import android.telephony.SubscriptionManager.PROFILE_CLASS_UNSET
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.compose.animation.scene.ObservableTransitionState
+import com.android.compose.animation.scene.OverlayKey
 import com.android.compose.animation.scene.SceneKey
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectLastValue
@@ -18,7 +21,9 @@
 import com.android.systemui.lifecycle.activateIn
 import com.android.systemui.plugins.activityStarter
 import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.shared.model.Overlays
 import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.shade.shared.flag.DualShade
 import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel
 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.fakeMobileIconsInteractor
 import com.android.systemui.testKosmos
@@ -48,7 +53,7 @@
     private val sceneInteractor = kosmos.sceneInteractor
     private val deviceEntryInteractor = kosmos.deviceEntryInteractor
 
-    private val underTest: ShadeHeaderViewModel = kosmos.shadeHeaderViewModel
+    private val underTest by lazy { kosmos.shadeHeaderViewModel }
 
     @Before
     fun setUp() {
@@ -96,6 +101,7 @@
         }
 
     @Test
+    @DisableFlags(DualShade.FLAG_NAME)
     fun onSystemIconContainerClicked_locked_collapsesShadeToLockscreen() =
         testScope.runTest {
             setDeviceEntered(false)
@@ -108,6 +114,25 @@
         }
 
     @Test
+    @EnableFlags(DualShade.FLAG_NAME)
+    fun onSystemIconContainerClicked_lockedOnDualShade_collapsesShadeToLockscreen() =
+        testScope.runTest {
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            setDeviceEntered(false)
+            setScene(Scenes.Lockscreen)
+            setOverlay(Overlays.NotificationsShade)
+            assertThat(currentOverlays).isNotEmpty()
+
+            underTest.onSystemIconContainerClicked()
+            runCurrent()
+
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            assertThat(currentOverlays).isEmpty()
+        }
+
+    @Test
+    @DisableFlags(DualShade.FLAG_NAME)
     fun onSystemIconContainerClicked_unlocked_collapsesShadeToGone() =
         testScope.runTest {
             setDeviceEntered(true)
@@ -119,6 +144,24 @@
             assertThat(sceneInteractor.currentScene.value).isEqualTo(Scenes.Gone)
         }
 
+    @Test
+    @EnableFlags(DualShade.FLAG_NAME)
+    fun onSystemIconContainerClicked_unlockedOnDualShade_collapsesShadeToGone() =
+        testScope.runTest {
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            setDeviceEntered(true)
+            setScene(Scenes.Gone)
+            setOverlay(Overlays.NotificationsShade)
+            assertThat(currentOverlays).isNotEmpty()
+
+            underTest.onSystemIconContainerClicked()
+            runCurrent()
+
+            assertThat(currentScene).isEqualTo(Scenes.Gone)
+            assertThat(currentOverlays).isEmpty()
+        }
+
     companion object {
         private val SUB_1 =
             SubscriptionModel(
@@ -144,6 +187,17 @@
         testScope.runCurrent()
     }
 
+    private fun setOverlay(key: OverlayKey) {
+        val currentOverlays = sceneInteractor.currentOverlays.value + key
+        sceneInteractor.showOverlay(key, "test")
+        sceneInteractor.setTransitionState(
+            MutableStateFlow<ObservableTransitionState>(
+                ObservableTransitionState.Idle(sceneInteractor.currentScene.value, currentOverlays)
+            )
+        )
+        testScope.runCurrent()
+    }
+
     private fun TestScope.setDeviceEntered(isEntered: Boolean) {
         if (isEntered) {
             // Unlock the device marking the device has entered.
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelTest.kt
index 9f3e126e..fcb366b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelTest.kt
@@ -29,6 +29,7 @@
 import com.android.systemui.authentication.data.repository.fakeAuthenticationRepository
 import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
 import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.coroutines.collectValues
 import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
 import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
 import com.android.systemui.flags.EnableSceneContainer
@@ -41,6 +42,7 @@
 import com.android.systemui.res.R
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.domain.resolver.homeSceneFamilyResolver
+import com.android.systemui.scene.domain.startable.sceneContainerStartable
 import com.android.systemui.scene.shared.model.SceneFamilies
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade
@@ -49,6 +51,7 @@
 import com.android.systemui.shade.shared.flag.DualShade
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.test.TestScope
@@ -76,6 +79,7 @@
 
     @Before
     fun setUp() {
+        kosmos.sceneContainerStartable.start()
         underTest.activateIn(testScope)
     }
 
@@ -232,6 +236,41 @@
                 .isEmpty()
         }
 
+    @Test
+    fun upTransitionSceneKey_backToCommunal() =
+        testScope.runTest {
+            val actions by collectLastValue(underTest.actions)
+            val currentScene by collectLastValue(kosmos.sceneInteractor.currentScene)
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            kosmos.sceneInteractor.changeScene(Scenes.Communal, "")
+            assertThat(currentScene).isEqualTo(Scenes.Communal)
+            kosmos.sceneInteractor.changeScene(Scenes.Shade, "")
+            assertThat(currentScene).isEqualTo(Scenes.Shade)
+
+            assertThat(actions?.get(Swipe.Up)).isEqualTo(UserActionResult(Scenes.Communal))
+        }
+
+    @Test
+    fun upTransitionSceneKey_neverGoesBackToShadeScene() =
+        testScope.runTest {
+            val actions by collectValues(underTest.actions)
+            val currentScene by collectLastValue(kosmos.sceneInteractor.currentScene)
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            kosmos.sceneInteractor.changeScene(Scenes.Shade, "")
+            assertThat(currentScene).isEqualTo(Scenes.Shade)
+
+            kosmos.sceneInteractor.changeScene(Scenes.QuickSettings, "")
+            assertThat(currentScene).isEqualTo(Scenes.QuickSettings)
+
+            actions.forEachIndexed { index, map ->
+                assertWithMessage(
+                        "Actions on index $index is incorrectly mapping back to the Shade scene!"
+                    )
+                    .that((map[Swipe.Up] as? UserActionResult.ChangeScene)?.toScene)
+                    .isNotEqualTo(Scenes.Shade)
+            }
+        }
+
     private fun TestScope.setDeviceEntered(isEntered: Boolean) {
         if (isEntered) {
             // Unlock the device marking the device has entered.
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
index 523a89a..5b0b59d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
@@ -71,7 +71,11 @@
 import com.android.internal.widget.LockPatternUtils;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor;
+import com.android.systemui.deviceentry.shared.model.DeviceUnlockStatus;
 import com.android.systemui.dump.DumpManager;
+import com.android.systemui.flags.DisableSceneContainer;
+import com.android.systemui.flags.EnableSceneContainer;
 import com.android.systemui.flags.FakeFeatureFlagsClassic;
 import com.android.systemui.log.LogWtfHandlerRule;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -90,6 +94,10 @@
 
 import com.google.android.collect.Lists;
 
+import dagger.Lazy;
+
+import kotlinx.coroutines.flow.StateFlow;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -152,6 +160,12 @@
     private BroadcastDispatcher mBroadcastDispatcher;
     @Mock
     private KeyguardStateController mKeyguardStateController;
+    @Mock
+    private Lazy<DeviceUnlockedInteractor> mDeviceUnlockedInteractorLazy;
+    @Mock
+    private DeviceUnlockedInteractor mDeviceUnlockedInteractor;
+    @Mock
+    private StateFlow<DeviceUnlockStatus> mDeviceUnlockStatusStateFlow;
 
     private UserInfo mCurrentUser;
     private UserInfo mSecondaryUser;
@@ -238,6 +252,9 @@
         mLockscreenUserManager = new TestNotificationLockscreenUserManager(mContext);
         mLockscreenUserManager.setUpWithPresenter(mPresenter);
 
+        when(mDeviceUnlockedInteractor.getDeviceUnlockStatus())
+                .thenReturn(mDeviceUnlockStatusStateFlow);
+
         mBackgroundExecutor.runAllReady();
     }
 
@@ -493,7 +510,8 @@
     }
 
     @Test
-    public void testUpdateIsPublicMode() {
+    @DisableSceneContainer
+    public void testUpdateIsPublicMode_sceneContainerDisabled() {
         when(mKeyguardStateController.isMethodSecure()).thenReturn(true);
         when(mKeyguardStateController.isShowing()).thenReturn(false);
 
@@ -527,6 +545,57 @@
         mBackgroundExecutor.runAllReady();
         assertTrue(mLockscreenUserManager.isLockscreenPublicMode(0));
         verify(listener, never()).onNotificationStateChanged();
+
+        verify(mDeviceUnlockedInteractorLazy, never()).get();
+    }
+
+    @Test
+    @EnableSceneContainer
+    public void testUpdateIsPublicMode_sceneContainerEnabled() {
+        when(mDeviceUnlockedInteractorLazy.get()).thenReturn(mDeviceUnlockedInteractor);
+
+        // device is unlocked
+        when(mDeviceUnlockStatusStateFlow.getValue()).thenReturn(new DeviceUnlockStatus(
+                /* isUnlocked = */ true,
+                /* deviceUnlockSource = */ null
+        ));
+
+        NotificationStateChangedListener listener = mock(NotificationStateChangedListener.class);
+        mLockscreenUserManager.addNotificationStateChangedListener(listener);
+        mLockscreenUserManager.mCurrentProfiles.append(0, mock(UserInfo.class));
+
+        // first call explicitly sets user 0 to not public; notifies
+        mLockscreenUserManager.updatePublicMode();
+        mBackgroundExecutor.runAllReady();
+        assertFalse(mLockscreenUserManager.isLockscreenPublicMode(0));
+        verify(listener).onNotificationStateChanged();
+        clearInvocations(listener);
+
+        // calling again has no changes; does not notify
+        mLockscreenUserManager.updatePublicMode();
+        mBackgroundExecutor.runAllReady();
+        assertFalse(mLockscreenUserManager.isLockscreenPublicMode(0));
+        verify(listener, never()).onNotificationStateChanged();
+
+        // device is not unlocked
+        when(mDeviceUnlockStatusStateFlow.getValue()).thenReturn(new DeviceUnlockStatus(
+                /* isUnlocked = */ false,
+                /* deviceUnlockSource = */ null
+        ));
+
+        // Calling again with device now not unlocked makes user 0 public; notifies
+        when(mKeyguardStateController.isShowing()).thenReturn(true);
+        mLockscreenUserManager.updatePublicMode();
+        mBackgroundExecutor.runAllReady();
+        assertTrue(mLockscreenUserManager.isLockscreenPublicMode(0));
+        verify(listener).onNotificationStateChanged();
+        clearInvocations(listener);
+
+        // calling again has no changes; does not notify
+        mLockscreenUserManager.updatePublicMode();
+        mBackgroundExecutor.runAllReady();
+        assertTrue(mLockscreenUserManager.isLockscreenPublicMode(0));
+        verify(listener, never()).onNotificationStateChanged();
     }
 
     @Test
@@ -972,7 +1041,9 @@
                     mSettings,
                     mock(DumpManager.class),
                     mock(LockPatternUtils.class),
-                    mFakeFeatureFlags);
+                    mFakeFeatureFlags,
+                    mDeviceUnlockedInteractorLazy
+            );
         }
 
         public BroadcastReceiver getBaseBroadcastReceiverForTest() {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarSignalPolicyTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarSignalPolicyTest.kt
new file mode 100644
index 0000000..1730553
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarSignalPolicyTest.kt
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar
+
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.internal.R
+import com.android.settingslib.mobile.TelephonyIcons
+import com.android.systemui.Flags.FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.testCase
+import com.android.systemui.statusbar.connectivity.IconState
+import com.android.systemui.statusbar.connectivity.NetworkController
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy_Factory
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController
+import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.airplaneModeInteractor
+import com.android.systemui.statusbar.policy.SecurityController
+import com.android.systemui.tuner.TunerService
+import com.android.systemui.util.CarrierConfigTracker
+import com.android.systemui.util.kotlin.JavaAdapter
+import com.android.systemui.util.mockito.mock
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.runner.RunWith
+import org.mockito.Mockito.verify
+import org.mockito.kotlin.clearInvocations
+import org.mockito.kotlin.verifyNoMoreInteractions
+import kotlin.test.Test
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class StatusBarSignalPolicyTest : SysuiTestCase() {
+    private val kosmos = Kosmos().also { it.testCase = this }
+
+    private lateinit var underTest: StatusBarSignalPolicy
+
+    private val testScope = TestScope()
+
+    private val javaAdapter = JavaAdapter(testScope.backgroundScope)
+    private val airplaneModeInteractor = kosmos.airplaneModeInteractor
+
+    private val securityController = mock<SecurityController>()
+    private val tunerService = mock<TunerService>()
+    private val statusBarIconController = mock<StatusBarIconController>()
+    private val networkController = mock<NetworkController>()
+    private val carrierConfigTracker = mock<CarrierConfigTracker>()
+
+    private var slotAirplane: String? = null
+
+    @Before
+    fun setup() {
+        underTest =
+            StatusBarSignalPolicy_Factory.newInstance(
+                mContext,
+                statusBarIconController,
+                carrierConfigTracker,
+                networkController,
+                securityController,
+                tunerService,
+                javaAdapter,
+                airplaneModeInteractor,
+            )
+
+        slotAirplane = mContext.getString(R.string.status_bar_airplane)
+    }
+
+    @Test
+    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
+    fun airplaneModeViaInteractor_statusBarSignalPolicyRefactorFlagEnabled_iconUpdated() =
+        testScope.runTest {
+            underTest.start()
+            airplaneModeInteractor.setIsAirplaneMode(true)
+            runCurrent()
+            verify(statusBarIconController).setIconVisibility(slotAirplane, true)
+
+            airplaneModeInteractor.setIsAirplaneMode(false)
+            runCurrent()
+            verify(statusBarIconController).setIconVisibility(slotAirplane, false)
+        }
+
+    @Test
+    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
+    fun airplaneModeViaSignalCallback_statusBarSignalPolicyRefactorFlagEnabled_iconNotUpdated() =
+        testScope.runTest {
+            underTest.start()
+            runCurrent()
+            clearInvocations(statusBarIconController)
+
+            // Make sure the legacy code path does not change airplane mode when the refactor
+            // flag is enabled.
+            underTest.setIsAirplaneMode(IconState(true, TelephonyIcons.FLIGHT_MODE_ICON, ""))
+            runCurrent()
+            verifyNoMoreInteractions(statusBarIconController)
+
+            underTest.setIsAirplaneMode(IconState(false, TelephonyIcons.FLIGHT_MODE_ICON, ""))
+            runCurrent()
+            verifyNoMoreInteractions(statusBarIconController)
+        }
+
+    @Test
+    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
+    fun statusBarSignalPolicyInitialization_statusBarSignalPolicyRefactorFlagEnabled_initNoOp() =
+        testScope.runTest {
+            // Make sure StatusBarSignalPolicy.init does no initialization when
+            // the refactor flag is disabled.
+            underTest.init()
+            verifyNoMoreInteractions(securityController, networkController, tunerService)
+        }
+
+    @Test
+    @DisableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
+    fun airplaneModeViaSignalCallback_statusBarSignalPolicyRefactorFlagDisabled_iconUpdated() =
+        testScope.runTest {
+            underTest.init()
+
+            underTest.setIsAirplaneMode(IconState(true, TelephonyIcons.FLIGHT_MODE_ICON, ""))
+            runCurrent()
+            verify(statusBarIconController).setIconVisibility(slotAirplane, true)
+
+            underTest.setIsAirplaneMode(IconState(false, TelephonyIcons.FLIGHT_MODE_ICON, ""))
+            runCurrent()
+            verify(statusBarIconController).setIconVisibility(slotAirplane, false)
+        }
+
+    @Test
+    @DisableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
+    fun airplaneModeViaInteractor_statusBarSignalPolicyRefactorFlagDisabled_iconNotUpdated() =
+        testScope.runTest {
+            underTest.init()
+
+            // Make sure changing airplane mode from airplaneModeRepository does nothing
+            // if the StatusBarSignalPolicyRefactor is not enabled.
+            airplaneModeInteractor.setIsAirplaneMode(true)
+            runCurrent()
+            verifyNoMoreInteractions(statusBarIconController)
+
+            airplaneModeInteractor.setIsAirplaneMode(false)
+            runCurrent()
+            verifyNoMoreInteractions(statusBarIconController)
+        }
+
+    @Test
+    @DisableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
+    fun statusBarSignalPolicyInitialization_statusBarSignalPolicyRefactorFlagDisabled_startNoOp() =
+        testScope.runTest {
+            // Make sure StatusBarSignalPolicy.start does no initialization when
+            // the refactor flag is disabled.
+            underTest.start()
+            verifyNoMoreInteractions(securityController, networkController, tunerService)
+        }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
index aefbc6b..db274cc 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
@@ -19,6 +19,8 @@
 package com.android.systemui.statusbar
 
 import android.animation.ObjectAnimator
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
 import android.platform.test.flag.junit.FlagsParameterization
 import android.testing.TestableLooper
 import androidx.test.filters.SmallTest
@@ -47,8 +49,10 @@
 import com.android.systemui.scene.domain.interactor.sceneBackInteractor
 import com.android.systemui.scene.domain.interactor.sceneContainerOcclusionInteractor
 import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.shared.model.Overlays
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.shade.domain.interactor.shadeInteractor
+import com.android.systemui.shade.shared.flag.DualShade
 import com.android.systemui.statusbar.domain.interactor.keyguardOcclusionInteractor
 import com.android.systemui.testKosmos
 import com.android.systemui.util.kotlin.JavaAdapter
@@ -79,6 +83,7 @@
 
     private val kosmos = testKosmos()
     private val testScope = kosmos.testScope
+    private val sceneInteractor = kosmos.sceneInteractor
     private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
     private val mockDarkAnimator = mock<ObjectAnimator>()
 
@@ -229,14 +234,15 @@
     @Test
     fun testSetDreamState_getterReturnsCurrentState() {
         underTest.setIsDreaming(true)
-        assertTrue(underTest.isDreaming())
+        assertTrue(underTest.isDreaming)
 
         underTest.setIsDreaming(false)
-        assertFalse(underTest.isDreaming())
+        assertFalse(underTest.isDreaming)
     }
 
     @Test
     @EnableSceneContainer
+    @DisableFlags(DualShade.FLAG_NAME)
     fun start_hydratesStatusBarState_whileLocked() =
         testScope.runTest {
             var statusBarState = underTest.state
@@ -248,7 +254,7 @@
                 }
             underTest.addCallback(listener)
 
-            val currentScene by collectLastValue(kosmos.sceneInteractor.currentScene)
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
             val deviceUnlockStatus by
                 collectLastValue(kosmos.deviceUnlockedInteractor.deviceUnlockStatus)
 
@@ -258,45 +264,107 @@
             runCurrent()
             assertThat(deviceUnlockStatus!!.isUnlocked).isFalse()
 
-            kosmos.sceneInteractor.changeScene(
-                toScene = Scenes.Lockscreen,
-                loggingReason = "reason"
-            )
+            sceneInteractor.changeScene(toScene = Scenes.Lockscreen, loggingReason = "reason")
             runCurrent()
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
 
             // Call start to begin hydrating based on the scene framework:
             underTest.start()
 
-            kosmos.sceneInteractor.changeScene(toScene = Scenes.Bouncer, loggingReason = "reason")
+            sceneInteractor.changeScene(toScene = Scenes.Bouncer, loggingReason = "reason")
             runCurrent()
             assertThat(currentScene).isEqualTo(Scenes.Bouncer)
             assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD)
 
-            kosmos.sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "reason")
+            sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "reason")
             runCurrent()
             assertThat(currentScene).isEqualTo(Scenes.Shade)
             assertThat(statusBarState).isEqualTo(StatusBarState.SHADE_LOCKED)
 
-            kosmos.sceneInteractor.changeScene(
-                toScene = Scenes.QuickSettings,
-                loggingReason = "reason"
-            )
+            sceneInteractor.changeScene(toScene = Scenes.QuickSettings, loggingReason = "reason")
             runCurrent()
             assertThat(currentScene).isEqualTo(Scenes.QuickSettings)
             assertThat(statusBarState).isEqualTo(StatusBarState.SHADE_LOCKED)
 
-            kosmos.sceneInteractor.changeScene(toScene = Scenes.Communal, loggingReason = "reason")
+            sceneInteractor.changeScene(toScene = Scenes.Communal, loggingReason = "reason")
             runCurrent()
             assertThat(currentScene).isEqualTo(Scenes.Communal)
             assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD)
 
-            kosmos.sceneInteractor.changeScene(
-                toScene = Scenes.Lockscreen,
-                loggingReason = "reason"
+            sceneInteractor.changeScene(toScene = Scenes.Lockscreen, loggingReason = "reason")
+            runCurrent()
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD)
+        }
+
+    @Test
+    @EnableSceneContainer
+    @EnableFlags(DualShade.FLAG_NAME)
+    fun start_hydratesStatusBarState_dualShade_whileLocked() =
+        testScope.runTest {
+            var statusBarState = underTest.state
+            val listener =
+                object : StatusBarStateController.StateListener {
+                    override fun onStateChanged(newState: Int) {
+                        statusBarState = newState
+                    }
+                }
+            underTest.addCallback(listener)
+
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            val deviceUnlockStatus by
+                collectLastValue(kosmos.deviceUnlockedInteractor.deviceUnlockStatus)
+
+            kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
+                AuthenticationMethodModel.Password
+            )
+            runCurrent()
+            assertThat(deviceUnlockStatus!!.isUnlocked).isFalse()
+
+            sceneInteractor.changeScene(Scenes.Lockscreen, loggingReason = "reason")
+            runCurrent()
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+
+            // Call start to begin hydrating based on the scene framework:
+            underTest.start()
+
+            sceneInteractor.changeScene(Scenes.Bouncer, loggingReason = "reason")
+            runCurrent()
+            assertThat(currentScene).isEqualTo(Scenes.Bouncer)
+            assertThat(currentOverlays).isEmpty()
+            assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD)
+
+            sceneInteractor.changeScene(Scenes.Lockscreen, loggingReason = "reason")
+            runCurrent()
+
+            sceneInteractor.showOverlay(Overlays.NotificationsShade, loggingReason = "reason")
+            runCurrent()
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            assertThat(currentOverlays).containsExactly(Overlays.NotificationsShade)
+            assertThat(statusBarState).isEqualTo(StatusBarState.SHADE_LOCKED)
+
+            sceneInteractor.replaceOverlay(
+                from = Overlays.NotificationsShade,
+                to = Overlays.QuickSettingsShade,
+                loggingReason = "reason",
             )
             runCurrent()
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            assertThat(currentOverlays).containsExactly(Overlays.QuickSettingsShade)
+            assertThat(statusBarState).isEqualTo(StatusBarState.SHADE_LOCKED)
+
+            sceneInteractor.hideOverlay(Overlays.QuickSettingsShade, loggingReason = "reason")
+            sceneInteractor.changeScene(Scenes.Communal, loggingReason = "reason")
+            runCurrent()
+            assertThat(currentScene).isEqualTo(Scenes.Communal)
+            assertThat(currentOverlays).isEmpty()
+            assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD)
+
+            sceneInteractor.changeScene(Scenes.Lockscreen, loggingReason = "reason")
+            runCurrent()
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            assertThat(currentOverlays).isEmpty()
             assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD)
         }
 
@@ -313,7 +381,7 @@
                 }
             underTest.addCallback(listener)
 
-            val currentScene by collectLastValue(kosmos.sceneInteractor.currentScene)
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
             val deviceUnlockStatus by
                 collectLastValue(kosmos.deviceUnlockedInteractor.deviceUnlockStatus)
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
@@ -326,10 +394,7 @@
 
             assertThat(deviceUnlockStatus!!.isUnlocked).isTrue()
 
-            kosmos.sceneInteractor.changeScene(
-                toScene = Scenes.Lockscreen,
-                loggingReason = "reason"
-            )
+            sceneInteractor.changeScene(toScene = Scenes.Lockscreen, loggingReason = "reason")
             runCurrent()
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
 
@@ -339,20 +404,17 @@
 
             assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD)
 
-            kosmos.sceneInteractor.changeScene(toScene = Scenes.Gone, loggingReason = "reason")
+            sceneInteractor.changeScene(toScene = Scenes.Gone, loggingReason = "reason")
             runCurrent()
             assertThat(currentScene).isEqualTo(Scenes.Gone)
             assertThat(statusBarState).isEqualTo(StatusBarState.SHADE)
 
-            kosmos.sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "reason")
+            sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "reason")
             runCurrent()
             assertThat(currentScene).isEqualTo(Scenes.Shade)
             assertThat(statusBarState).isEqualTo(StatusBarState.SHADE)
 
-            kosmos.sceneInteractor.changeScene(
-                toScene = Scenes.QuickSettings,
-                loggingReason = "reason"
-            )
+            sceneInteractor.changeScene(toScene = Scenes.QuickSettings, loggingReason = "reason")
             runCurrent()
             assertThat(currentScene).isEqualTo(Scenes.QuickSettings)
             assertThat(statusBarState).isEqualTo(StatusBarState.SHADE)
@@ -371,7 +433,7 @@
                 }
             underTest.addCallback(listener)
 
-            val currentScene by collectLastValue(kosmos.sceneInteractor.currentScene)
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
             val isOccluded by
                 collectLastValue(kosmos.sceneContainerOcclusionInteractor.invisibleDueToOcclusion)
@@ -385,15 +447,12 @@
             // Call start to begin hydrating based on the scene framework:
             underTest.start()
 
-            kosmos.sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "reason")
+            sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "reason")
             runCurrent()
             assertThat(currentScene).isEqualTo(Scenes.Shade)
             assertThat(statusBarState).isEqualTo(StatusBarState.SHADE)
 
-            kosmos.sceneInteractor.changeScene(
-                toScene = Scenes.QuickSettings,
-                loggingReason = "reason"
-            )
+            sceneInteractor.changeScene(toScene = Scenes.QuickSettings, loggingReason = "reason")
             runCurrent()
             assertThat(currentScene).isEqualTo(Scenes.QuickSettings)
             assertThat(statusBarState).isEqualTo(StatusBarState.SHADE)
@@ -415,10 +474,7 @@
             kosmos.setTransition(
                 sceneTransition = Idle(Scenes.Gone),
                 stateTransition =
-                    TransitionStep(
-                        from = KeyguardState.LOCKSCREEN,
-                        to = KeyguardState.GONE,
-                    )
+                    TransitionStep(from = KeyguardState.LOCKSCREEN, to = KeyguardState.GONE),
             )
 
             assertThat(underTest.leaveOpenOnKeyguardHide()).isEqualTo(false)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolverTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolverTest.kt
new file mode 100644
index 0000000..22906b8
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolverTest.kt
@@ -0,0 +1,150 @@
+/*
+ *  Copyright (C) 2022 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.systemui.statusbar.notification.collection
+
+import android.app.Notification
+import android.app.NotificationManager
+import android.content.pm.ApplicationInfo
+import android.content.pm.PackageManager
+import android.os.Bundle
+import android.os.UserHandle
+import android.service.notification.NotificationListenerService.Ranking
+import android.service.notification.StatusBarNotification
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
+import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.withArgCaptor
+import junit.framework.Assert.assertEquals
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.anyInt
+import org.mockito.Mockito.anyString
+import org.mockito.Mockito.eq
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.Mockito.`when` as whenever
+
+private const val SDK_VERSION = 33
+private const val PACKAGE = "pkg"
+private const val USER_ID = -1
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class TargetSdkResolverTest : SysuiTestCase() {
+    private val packageManager: PackageManager = mock()
+    private val applicationInfo = ApplicationInfo().apply { targetSdkVersion = SDK_VERSION }
+
+    private lateinit var targetSdkResolver: TargetSdkResolver
+    private lateinit var notifListener: NotifCollectionListener
+
+    @Before
+    fun setUp() {
+        targetSdkResolver = TargetSdkResolver(mContext)
+        mContext.setMockPackageManager(packageManager)
+
+        val notifCollection: CommonNotifCollection = mock()
+        targetSdkResolver.initialize(notifCollection)
+        notifListener = withArgCaptor {
+            verify(notifCollection).addCollectionListener(capture())
+        }
+    }
+
+    @Test
+    fun resolveFromNotificationExtras() {
+        val extras = Bundle().apply {
+            putParcelable(Notification.EXTRA_BUILDER_APPLICATION_INFO, applicationInfo)
+        }
+        val notification = Notification().apply { this.extras = extras }
+        val sbn = createSbn(notification)
+        val entry = createNotificationEntry(sbn)
+
+        notifListener.onEntryBind(entry, sbn)
+
+        assertEquals(SDK_VERSION, entry.targetSdk)
+        verifyNoMoreInteractions(packageManager)
+    }
+
+    @Test
+    fun resolveFromPackageManager() {
+        val sbn = createSbn(Notification())
+        val entry = createNotificationEntry(sbn)
+        whenever(packageManager.getApplicationInfo(anyString(), anyInt()))
+                .thenReturn(applicationInfo)
+
+        notifListener.onEntryBind(entry, sbn)
+
+        assertEquals(SDK_VERSION, entry.targetSdk)
+        verify(packageManager).getApplicationInfo(eq(PACKAGE), anyInt())
+    }
+
+    @Test
+    fun resolveFromPackageManager_andPackageManagerCrashes() {
+        val sbn = createSbn(Notification())
+        val entry = createNotificationEntry(sbn)
+        whenever(packageManager.getApplicationInfo(anyString(), anyInt()))
+                .thenThrow(PackageManager.NameNotFoundException())
+
+        notifListener.onEntryBind(entry, sbn)
+
+        assertEquals(0, entry.targetSdk)
+        verify(packageManager).getApplicationInfo(eq(PACKAGE), anyInt())
+    }
+
+    private fun createSbn(notification: Notification) = StatusBarNotification(
+            PACKAGE, "opPkg", 0, "tag", 0, 0,
+            notification, UserHandle(USER_ID), "", 0
+    )
+
+    private fun createNotificationEntry(sbn: StatusBarNotification) =
+            NotificationEntry(sbn, createRanking(sbn.key), 0)
+
+    private fun createRanking(key: String) = Ranking().apply {
+        populate(
+                key,
+                /* rank = */ 0,
+                /* matchesInterruptionFilter = */ false,
+                /* visibilityOverride = */ 0,
+                /* suppressedVisualEffects = */ 0,
+                /* importance = */ NotificationManager.IMPORTANCE_DEFAULT,
+                /* explanation = */ null,
+                /* overrideGroupKey = */ null,
+                /* channel = */ null,
+                /* overridePeople = */ null,
+                /* snoozeCriteria = */ null,
+                /* showBadge = */ true,
+                /* userSentiment = */ 0,
+                /* hidden = */ false,
+                /* lastAudiblyAlertedMs = */ -1,
+                /* noisy = */ false,
+                /* smartActions = */ null,
+                /* smartReplies = */ null,
+                /* canBubble = */ false,
+                /* isTextChanged = */ false,
+                /* isConversation = */ false,
+                /* shortcutInfo = */ null,
+                /* rankingAdjustment = */ 0,
+                /* isBubble = */ false,
+                /* proposedImportance = */ 0,
+                /* sensitiveContent = */ false
+        )
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinatorTest.kt
index 7b87aeb..d772e3e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinatorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinatorTest.kt
@@ -42,7 +42,8 @@
 import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
 import com.android.systemui.statusbar.notification.data.repository.FakeHeadsUpRowRepository
 import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository
-import com.android.systemui.statusbar.notification.shared.NotificationMinimalismPrototype
+import com.android.systemui.statusbar.notification.domain.interactor.lockScreenNotificationMinimalismSetting
+import com.android.systemui.statusbar.notification.shared.NotificationMinimalism
 import com.android.systemui.statusbar.notification.stack.data.repository.headsUpNotificationRepository
 import com.android.systemui.testKosmos
 import com.android.systemui.util.settings.FakeSettings
@@ -66,7 +67,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
-@EnableFlags(NotificationMinimalismPrototype.FLAG_NAME)
+@EnableFlags(NotificationMinimalism.FLAG_NAME)
 class LockScreenMinimalismCoordinatorTest : SysuiTestCase() {
 
     private val kosmos =
@@ -76,7 +77,7 @@
                 mock<SysuiStatusBarStateController>().also { mock ->
                     doAnswer { statusBarState.ordinal }.whenever(mock).state
                 }
-            fakeSettings.putInt(Settings.Secure.LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, 1)
+            lockScreenNotificationMinimalismSetting = true
         }
     private val notifPipeline: NotifPipeline = mock()
     private var statusBarState: StatusBarState = StatusBarState.KEYGUARD
@@ -193,7 +194,7 @@
             kosmos.activeNotificationListRepository.topUnseenNotificationKey.value = child2.key
             assertThat(promoter.shouldPromoteToTopLevel(child1)).isFalse()
             assertThat(promoter.shouldPromoteToTopLevel(child2))
-                .isEqualTo(NotificationMinimalismPrototype.ungroupTopUnseen)
+                .isEqualTo(NotificationMinimalism.ungroupTopUnseen)
             assertThat(promoter.shouldPromoteToTopLevel(child3)).isFalse()
             assertThat(promoter.shouldPromoteToTopLevel(parent)).isFalse()
 
@@ -201,7 +202,7 @@
             kosmos.activeNotificationListRepository.topUnseenNotificationKey.value = child2.key
             assertThat(promoter.shouldPromoteToTopLevel(child1)).isTrue()
             assertThat(promoter.shouldPromoteToTopLevel(child2))
-                .isEqualTo(NotificationMinimalismPrototype.ungroupTopUnseen)
+                .isEqualTo(NotificationMinimalism.ungroupTopUnseen)
             assertThat(promoter.shouldPromoteToTopLevel(child3)).isFalse()
             assertThat(promoter.shouldPromoteToTopLevel(parent)).isFalse()
         }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
index beba162..ea5c29e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
@@ -20,8 +20,6 @@
 
 import static junit.framework.Assert.assertFalse;
 
-import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow;
-
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
@@ -31,12 +29,16 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow;
+
+import android.platform.test.annotations.EnableFlags;
 import android.testing.TestableLooper;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
 import com.android.compose.animation.scene.ObservableTransitionState;
+import com.android.systemui.Flags;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.communal.shared.model.CommunalScenes;
 import com.android.systemui.dump.DumpManager;
@@ -67,9 +69,6 @@
 import com.android.systemui.util.kotlin.JavaAdapter;
 import com.android.systemui.util.time.FakeSystemClock;
 
-import kotlinx.coroutines.flow.MutableStateFlow;
-import kotlinx.coroutines.test.TestScope;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -79,6 +78,9 @@
 import org.mockito.MockitoAnnotations;
 import org.mockito.verification.VerificationMode;
 
+import kotlinx.coroutines.flow.MutableStateFlow;
+import kotlinx.coroutines.test.TestScope;
+
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 @TestableLooper.RunWithLooper
@@ -517,6 +519,32 @@
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_CHECK_LOCKSCREEN_GONE_TRANSITION)
+    public void testNotLockscreenInGoneTransition_invalidationCalled() {
+        // GIVEN visual stability is being maintained b/c animation is playing
+        mKosmos.getKeyguardTransitionRepository().sendTransitionStepJava(
+                mTestScope, new TransitionStep(
+                        KeyguardState.LOCKSCREEN,
+                        KeyguardState.GONE,
+                        1f,
+                        TransitionState.RUNNING),  /* validateStep = */ false);
+        mTestScope.getTestScheduler().runCurrent();
+        assertFalse(mNotifStabilityManager.isPipelineRunAllowed());
+
+        // WHEN the animation has stopped playing
+        mKosmos.getKeyguardTransitionRepository().sendTransitionStepJava(
+                mTestScope, new TransitionStep(
+                        KeyguardState.LOCKSCREEN,
+                        KeyguardState.GONE,
+                        1f,
+                        TransitionState.FINISHED),  /* validateStep = */ false);
+        mTestScope.getTestScheduler().runCurrent();
+
+        // invalidate is called, b/c we were previously suppressing the pipeline from running
+        verifyStabilityManagerWasInvalidated(times(1));
+    }
+
+    @Test
     public void testNeverSuppressPipelineRunFromPanelCollapse_noInvalidationCalled() {
         // GIVEN animation is playing
         setPanelCollapsing(true);
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/domain/interactor/SeenNotificationsInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/domain/interactor/SeenNotificationsInteractorTest.kt
index 2159b86..ea2e25e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/domain/interactor/SeenNotificationsInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/domain/interactor/SeenNotificationsInteractorTest.kt
@@ -21,7 +21,7 @@
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
-import com.android.systemui.statusbar.notification.shared.NotificationMinimalismPrototype
+import com.android.systemui.statusbar.notification.shared.NotificationMinimalism
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.test.runTest
@@ -57,7 +57,7 @@
     }
 
     @Test
-    @EnableFlags(NotificationMinimalismPrototype.FLAG_NAME)
+    @EnableFlags(NotificationMinimalism.FLAG_NAME)
     fun topOngoingAndUnseenNotification() = runTest {
         val entry1 = NotificationEntryBuilder().setTag("entry1").build()
         val entry2 = NotificationEntryBuilder().setTag("entry2").build()
@@ -91,4 +91,17 @@
         testScheduler.runCurrent()
         assertThat(settingEnabled).isTrue()
     }
+
+    fun testLockScreenNotificationMinimalismSetting() = runTest {
+        val settingEnabled by
+            collectLastValue(underTest.isLockScreenNotificationMinimalismEnabled())
+
+        kosmos.lockScreenNotificationMinimalismSetting = false
+        testScheduler.runCurrent()
+        assertThat(settingEnabled).isFalse()
+
+        kosmos.lockScreenNotificationMinimalismSetting = true
+        testScheduler.runCurrent()
+        assertThat(settingEnabled).isTrue()
+    }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModelTest.kt
new file mode 100644
index 0000000..34f4608
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModelTest.kt
@@ -0,0 +1,290 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.notification.emptyshade.ui.viewmodel
+
+import android.app.Flags
+import android.app.NotificationManager.Policy
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.FlagsParameterization
+import android.provider.Settings
+import android.service.notification.ZenPolicy.VISUAL_EFFECT_NOTIFICATION_LIST
+import androidx.test.filters.SmallTest
+import com.android.settingslib.notification.data.repository.updateNotificationPolicy
+import com.android.settingslib.notification.modes.TestModeBuilder
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.flags.andSceneContainer
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.shared.settings.data.repository.fakeSecureSettingsRepository
+import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix
+import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor
+import com.android.systemui.statusbar.policy.data.repository.zenModeRepository
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@RunWith(ParameterizedAndroidJunit4::class)
+@SmallTest
+@EnableFlags(FooterViewRefactor.FLAG_NAME)
+class EmptyShadeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+    private val zenModeRepository = kosmos.zenModeRepository
+    private val activeNotificationListRepository = kosmos.activeNotificationListRepository
+    private val fakeSecureSettingsRepository = kosmos.fakeSecureSettingsRepository
+
+    private val underTest = kosmos.emptyShadeViewModel
+
+    companion object {
+        @JvmStatic
+        @Parameters(name = "{0}")
+        fun getParams(): List<FlagsParameterization> {
+            return FlagsParameterization.allCombinationsOf().andSceneContainer()
+        }
+    }
+
+    init {
+        mSetFlagsRule.setFlagsParameterization(flags)
+    }
+
+    @Test
+    fun areNotificationsHiddenInShade_true() =
+        testScope.runTest {
+            val hidden by collectLastValue(underTest.areNotificationsHiddenInShade)
+
+            zenModeRepository.updateNotificationPolicy(
+                suppressedVisualEffects = Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST
+            )
+            zenModeRepository.updateZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS)
+            runCurrent()
+
+            assertThat(hidden).isTrue()
+        }
+
+    @Test
+    fun areNotificationsHiddenInShade_false() =
+        testScope.runTest {
+            val hidden by collectLastValue(underTest.areNotificationsHiddenInShade)
+
+            zenModeRepository.updateNotificationPolicy(
+                suppressedVisualEffects = Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST
+            )
+            zenModeRepository.updateZenMode(Settings.Global.ZEN_MODE_OFF)
+            runCurrent()
+
+            assertThat(hidden).isFalse()
+        }
+
+    @Test
+    fun hasFilteredOutSeenNotifications_true() =
+        testScope.runTest {
+            val hasFilteredNotifs by collectLastValue(underTest.hasFilteredOutSeenNotifications)
+
+            activeNotificationListRepository.hasFilteredOutSeenNotifications.value = true
+            runCurrent()
+
+            assertThat(hasFilteredNotifs).isTrue()
+        }
+
+    @Test
+    fun hasFilteredOutSeenNotifications_false() =
+        testScope.runTest {
+            val hasFilteredNotifs by collectLastValue(underTest.hasFilteredOutSeenNotifications)
+
+            activeNotificationListRepository.hasFilteredOutSeenNotifications.value = false
+            runCurrent()
+
+            assertThat(hasFilteredNotifs).isFalse()
+        }
+
+    @Test
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME)
+    @DisableFlags(Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    fun text_changesWhenNotifsHiddenInShade() =
+        testScope.runTest {
+            val text by collectLastValue(underTest.text)
+
+            zenModeRepository.updateNotificationPolicy(
+                suppressedVisualEffects = Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST
+            )
+            zenModeRepository.updateZenMode(Settings.Global.ZEN_MODE_OFF)
+            runCurrent()
+
+            assertThat(text).isEqualTo("No notifications")
+
+            zenModeRepository.updateNotificationPolicy(
+                suppressedVisualEffects = Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST
+            )
+            zenModeRepository.updateZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS)
+            runCurrent()
+
+            assertThat(text).isEqualTo("Notifications paused by Do Not Disturb")
+        }
+
+    @Test
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    fun text_reflectsModesHidingNotifications() =
+        testScope.runTest {
+            val text by collectLastValue(underTest.text)
+
+            assertThat(text).isEqualTo("No notifications")
+
+            zenModeRepository.addMode(
+                TestModeBuilder()
+                    .setId("Do not disturb")
+                    .setName("Do not disturb")
+                    .setActive(true)
+                    .setVisualEffect(VISUAL_EFFECT_NOTIFICATION_LIST, /* allowed= */ false)
+                    .build()
+            )
+            runCurrent()
+            assertThat(text).isEqualTo("Notifications paused by Do not disturb")
+
+            zenModeRepository.addMode(
+                TestModeBuilder()
+                    .setId("Work")
+                    .setName("Work")
+                    .setActive(true)
+                    .setVisualEffect(VISUAL_EFFECT_NOTIFICATION_LIST, /* allowed= */ false)
+                    .build()
+            )
+            runCurrent()
+            assertThat(text).isEqualTo("Notifications paused by Do not disturb and one other mode")
+
+            zenModeRepository.addMode(
+                TestModeBuilder()
+                    .setId("Gym")
+                    .setName("Gym")
+                    .setActive(true)
+                    .setVisualEffect(VISUAL_EFFECT_NOTIFICATION_LIST, /* allowed= */ false)
+                    .build()
+            )
+            runCurrent()
+            assertThat(text).isEqualTo("Notifications paused by Do not disturb and 2 other modes")
+
+            zenModeRepository.deactivateMode("Do not disturb")
+            zenModeRepository.deactivateMode("Work")
+            runCurrent()
+            assertThat(text).isEqualTo("Notifications paused by Gym")
+        }
+
+    @Test
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME)
+    fun footer_isVisibleWhenSeenNotifsAreFilteredOut() =
+        testScope.runTest {
+            val footerVisible by collectLastValue(underTest.footer.isVisible)
+
+            activeNotificationListRepository.hasFilteredOutSeenNotifications.value = false
+            runCurrent()
+
+            assertThat(footerVisible).isFalse()
+
+            activeNotificationListRepository.hasFilteredOutSeenNotifications.value = true
+            runCurrent()
+
+            assertThat(footerVisible).isTrue()
+        }
+
+    @Test
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    fun onClick_whenHistoryDisabled_leadsToSettingsPage() =
+        testScope.runTest {
+            val onClick by collectLastValue(underTest.onClick)
+            runCurrent()
+
+            fakeSecureSettingsRepository.setInt(Settings.Secure.NOTIFICATION_HISTORY_ENABLED, 0)
+
+            assertThat(onClick?.targetIntent?.action)
+                .isEqualTo(Settings.ACTION_NOTIFICATION_SETTINGS)
+            assertThat(onClick?.backStack).isEmpty()
+        }
+
+    @Test
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    fun onClick_whenHistoryEnabled_leadsToHistoryPage() =
+        testScope.runTest {
+            val onClick by collectLastValue(underTest.onClick)
+            runCurrent()
+
+            fakeSecureSettingsRepository.setInt(Settings.Secure.NOTIFICATION_HISTORY_ENABLED, 1)
+
+            assertThat(onClick?.targetIntent?.action)
+                .isEqualTo(Settings.ACTION_NOTIFICATION_HISTORY)
+            assertThat(onClick?.backStack?.map { it.action })
+                .containsExactly(Settings.ACTION_NOTIFICATION_SETTINGS)
+        }
+
+    @Test
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    fun onClick_whenOneModeHidingNotifications_leadsToModeSettings() =
+        testScope.runTest {
+            val onClick by collectLastValue(underTest.onClick)
+            runCurrent()
+
+            zenModeRepository.addMode(
+                TestModeBuilder()
+                    .setId("ID")
+                    .setActive(true)
+                    .setVisualEffect(VISUAL_EFFECT_NOTIFICATION_LIST, /* allowed= */ false)
+                    .build()
+            )
+            runCurrent()
+
+            assertThat(onClick?.targetIntent?.action)
+                .isEqualTo(Settings.ACTION_AUTOMATIC_ZEN_RULE_SETTINGS)
+            assertThat(
+                    onClick?.targetIntent?.extras?.getString(Settings.EXTRA_AUTOMATIC_ZEN_RULE_ID)
+                )
+                .isEqualTo("ID")
+            assertThat(onClick?.backStack?.map { it.action })
+                .containsExactly(Settings.ACTION_ZEN_MODE_SETTINGS)
+        }
+
+    @Test
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    fun onClick_whenMultipleModesHidingNotifications_leadsToGeneralModesSettings() =
+        testScope.runTest {
+            val onClick by collectLastValue(underTest.onClick)
+            runCurrent()
+
+            zenModeRepository.addMode(
+                TestModeBuilder()
+                    .setActive(true)
+                    .setVisualEffect(VISUAL_EFFECT_NOTIFICATION_LIST, /* allowed= */ false)
+                    .build()
+            )
+            zenModeRepository.addMode(
+                TestModeBuilder()
+                    .setActive(true)
+                    .setVisualEffect(VISUAL_EFFECT_NOTIFICATION_LIST, /* allowed= */ false)
+                    .build()
+            )
+            runCurrent()
+
+            assertThat(onClick?.targetIntent?.action).isEqualTo(Settings.ACTION_ZEN_MODE_SETTINGS)
+            assertThat(onClick?.backStack).isEmpty()
+        }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/BigPictureIconManagerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/BigPictureIconManagerTest.kt
new file mode 100644
index 0000000..da48833
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/BigPictureIconManagerTest.kt
@@ -0,0 +1,490 @@
+/*
+ * Copyright (C) 2023 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.systemui.statusbar.notification.row
+
+import android.graphics.BitmapFactory
+import android.graphics.drawable.BitmapDrawable
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.Icon
+import android.net.Uri
+import android.testing.TestableLooper.RunWithLooper
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.internal.widget.NotificationDrawableConsumer
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.graphics.ImageLoader
+import com.android.systemui.res.R
+import com.android.systemui.util.mockito.argumentCaptor
+import com.android.systemui.util.mockito.mock
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.advanceTimeBy
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.clearInvocations
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+
+private const val FREE_IMAGE_DELAY_MS = 4000L
+private const val MAX_IMAGE_SIZE = 512 // size of the test drawables in pixels
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWithLooper
+@RunWith(AndroidJUnit4::class)
+class BigPictureIconManagerTest : SysuiTestCase() {
+
+    private val testDispatcher = StandardTestDispatcher()
+    private val testScope = TestScope(testDispatcher)
+    private val testableResources = context.orCreateTestableResources
+    private val imageLoader: ImageLoader = ImageLoader(context, testDispatcher)
+    private val statsManager = BigPictureStatsManager(mock(), testDispatcher, mock())
+    private var mockConsumer: NotificationDrawableConsumer = mock()
+    private val drawableCaptor = argumentCaptor<Drawable>()
+
+    private lateinit var iconManager: BigPictureIconManager
+
+    private val expectedDrawable by lazy {
+        context.resources.getDrawable(R.drawable.dessert_zombiegingerbread, context.theme)
+    }
+    private val supportedIcon by lazy {
+        Icon.createWithContentUri(
+            Uri.parse(
+                "android.resource://${context.packageName}/${R.drawable.dessert_zombiegingerbread}"
+            )
+        )
+    }
+    private val unsupportedIcon by lazy {
+        Icon.createWithBitmap(
+            BitmapFactory.decodeResource(context.resources, R.drawable.dessert_donutburger)
+        )
+    }
+    private val invalidIcon by lazy { Icon.createWithContentUri(Uri.parse("this.is/broken")) }
+
+    @Before
+    fun setUp() {
+        allowTestableLooperAsMainThread()
+        overrideMaxImageSizes()
+        iconManager =
+            BigPictureIconManager(
+                context,
+                imageLoader,
+                statsManager,
+                scope = testScope,
+                mainDispatcher = testDispatcher,
+                bgDispatcher = testDispatcher
+            )
+    }
+
+    @After
+    fun tearDown() {
+        disallowTestableLooperAsMainThread()
+    }
+
+    @Test
+    fun onIconUpdated_supportedType_placeholderLoaded() =
+        testScope.runTest {
+            // WHEN update with a supported icon
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+
+            // THEN consumer is updated with a placeholder
+            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
+            assertIsPlaceHolder(drawableCaptor.value)
+            assertSize(drawableCaptor.value)
+        }
+
+    @Test
+    fun onIconUpdated_unsupportedType_fullImageLoaded() =
+        testScope.runTest {
+            // WHEN update with an unsupported icon
+            iconManager.updateIcon(mockConsumer, unsupportedIcon).run()
+
+            // THEN consumer is updated with the full image
+            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
+            assertIsFullImage(drawableCaptor.value)
+            assertSize(drawableCaptor.value)
+        }
+
+    @Test
+    fun onIconUpdated_withNull_drawableIsNull() =
+        testScope.runTest {
+            // WHEN update with null
+            iconManager.updateIcon(mockConsumer, null).run()
+
+            // THEN consumer is updated with null
+            verify(mockConsumer).setImageDrawable(null)
+        }
+
+    @Test
+    fun onIconUpdated_invalidIcon_drawableIsNull() =
+        testScope.runTest {
+            // WHEN update with an invalid icon
+            iconManager.updateIcon(mockConsumer, invalidIcon).run()
+
+            // THEN consumer is updated with null
+            verify(mockConsumer).setImageDrawable(null)
+        }
+
+    @Test
+    fun onIconUpdated_consumerAlreadySet_newConsumerIsUpdatedWithPlaceholder() =
+        testScope.runTest {
+            // GIVEN a consumer is set
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+            clearInvocations(mockConsumer)
+
+            // WHEN a new consumer is set
+            val newConsumer: NotificationDrawableConsumer = mock()
+            iconManager.updateIcon(newConsumer, supportedIcon).run()
+
+            // THEN the new consumer is updated
+            verify(newConsumer).setImageDrawable(drawableCaptor.capture())
+            assertIsPlaceHolder(drawableCaptor.value)
+            assertSize(drawableCaptor.value)
+            // AND nothing happens on the old consumer
+            verifyNoMoreInteractions(mockConsumer)
+        }
+
+    @Test
+    fun onIconUpdated_consumerAlreadySet_newConsumerIsUpdatedWithFullImage() =
+        testScope.runTest {
+            // GIVEN a consumer is set
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+            // AND an icon is loaded
+            iconManager.onViewShown(true)
+            runCurrent()
+            clearInvocations(mockConsumer)
+
+            // WHEN a new consumer is set
+            val newConsumer: NotificationDrawableConsumer = mock()
+            iconManager.updateIcon(newConsumer, supportedIcon).run()
+
+            // THEN the new consumer is updated
+            verify(newConsumer).setImageDrawable(drawableCaptor.capture())
+            assertIsFullImage(drawableCaptor.value)
+            assertSize(drawableCaptor.value)
+            // AND nothing happens on the old consumer
+            verifyNoMoreInteractions(mockConsumer)
+        }
+
+    @Test
+    fun onIconUpdated_iconAlreadySet_loadsNewIcon() =
+        testScope.runTest {
+            // GIVEN an icon is set
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+            clearInvocations(mockConsumer)
+
+            // WHEN a new icon is set
+            iconManager.updateIcon(mockConsumer, unsupportedIcon).run()
+
+            // THEN consumer is updated with the new image
+            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
+            assertIsFullImage(drawableCaptor.value)
+            assertSize(drawableCaptor.value)
+        }
+
+    @Test
+    fun onIconUpdated_iconAlreadySetForTheSameIcon_loadsIconAgain() =
+        testScope.runTest {
+            // GIVEN an icon is set
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+            // AND the view is shown
+            iconManager.onViewShown(true)
+            runCurrent()
+            clearInvocations(mockConsumer)
+            // WHEN the icon is set again
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+
+            // THEN consumer is updated with the new image
+            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
+            assertIsFullImage(drawableCaptor.value)
+            assertSize(drawableCaptor.value)
+        }
+
+    @Test
+    fun onIconUpdated_iconAlreadySetForUnsupportedIcon_loadsNewIcon() =
+        testScope.runTest {
+            // GIVEN an unsupported icon is set
+            iconManager.updateIcon(mockConsumer, unsupportedIcon).run()
+            // AND the view is shown
+            iconManager.onViewShown(true)
+            runCurrent()
+            clearInvocations(mockConsumer)
+
+            // WHEN a new icon is set
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+
+            // THEN consumer is updated with the new image
+            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
+            assertIsFullImage(drawableCaptor.value)
+            assertSize(drawableCaptor.value)
+        }
+
+    @Test
+    fun onIconUpdated_supportedTypeButTooWide_resizedPlaceholderLoaded() =
+        testScope.runTest {
+            // GIVEN the max width is smaller than our image
+            testableResources.addOverride(
+                com.android.internal.R.dimen.notification_big_picture_max_width,
+                20
+            )
+            iconManager.updateMaxImageSizes()
+
+            // WHEN update with a supported icon
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+
+            // THEN consumer is updated with the resized placeholder
+            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
+            assertIsPlaceHolder(drawableCaptor.value)
+            assertSize(drawableCaptor.value, expectedWidth = 20, expectedHeight = 20)
+        }
+
+    @Test
+    fun onIconUpdated_supportedTypeButTooHigh_resizedPlaceholderLoaded() =
+        testScope.runTest {
+            // GIVEN the max height is smaller than our image
+            testableResources.addOverride(
+                com.android.internal.R.dimen.notification_big_picture_max_height,
+                20
+            )
+            iconManager.updateMaxImageSizes()
+
+            // WHEN update with a supported icon
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+
+            // THEN consumer is updated with the resized placeholder
+            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
+            assertIsPlaceHolder(drawableCaptor.value)
+            assertSize(drawableCaptor.value, expectedWidth = 20, expectedHeight = 20)
+        }
+
+    @Test
+    fun onViewShown_placeholderShowing_fullImageLoaded() =
+        testScope.runTest {
+            // GIVEN placeholder is showing
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+            clearInvocations(mockConsumer)
+
+            // WHEN the view is shown
+            iconManager.onViewShown(true)
+            runCurrent()
+
+            // THEN full image is set
+            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
+            assertIsFullImage(drawableCaptor.value)
+            assertSize(drawableCaptor.value)
+        }
+
+    @Test
+    fun onViewHidden_fullImageShowing_placeHolderSet() =
+        testScope.runTest {
+            // GIVEN full image is showing and the view is shown
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+            iconManager.onViewShown(true)
+            runCurrent()
+            clearInvocations(mockConsumer)
+
+            // WHEN the view goes off the screen
+            iconManager.onViewShown(false)
+            // AND we wait a bit
+            advanceTimeBy(FREE_IMAGE_DELAY_MS)
+            runCurrent()
+
+            // THEN placeholder is set
+            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
+            assertIsPlaceHolder(drawableCaptor.value)
+            assertSize(drawableCaptor.value)
+        }
+
+    @Test
+    fun onViewShownToggled_viewShown_nothingHappens() =
+        testScope.runTest {
+            // GIVEN full image is showing and the view is shown
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+            iconManager.onViewShown(true)
+            runCurrent()
+            clearInvocations(mockConsumer)
+
+            // WHEN the onViewShown is toggled
+            iconManager.onViewShown(false)
+            runCurrent()
+            iconManager.onViewShown(true)
+            // AND we wait a bit
+            advanceTimeBy(FREE_IMAGE_DELAY_MS)
+            runCurrent()
+
+            // THEN nothing happens
+            verifyNoMoreInteractions(mockConsumer)
+        }
+
+    @Test
+    fun onViewShown_unsupportedIconLoaded_nothingHappens() =
+        testScope.runTest {
+            // GIVEN full image is showing for an unsupported icon
+            iconManager.updateIcon(mockConsumer, unsupportedIcon).run()
+            clearInvocations(mockConsumer)
+
+            // WHEN the view is shown
+            iconManager.onViewShown(true)
+            runCurrent()
+
+            // THEN nothing happens
+            verifyNoMoreInteractions(mockConsumer)
+        }
+
+    @Test
+    fun onViewShown_nullSetForIcon_nothingHappens() =
+        testScope.runTest {
+            // GIVEN null is set for the icon
+            iconManager.updateIcon(mockConsumer, null).run()
+            clearInvocations(mockConsumer)
+
+            // WHEN the view is shown
+            iconManager.onViewShown(true)
+            runCurrent()
+
+            // THEN nothing happens
+            verifyNoMoreInteractions(mockConsumer)
+        }
+
+    @Test
+    fun onViewHidden_unsupportedIconLoadedAndViewIsShown_nothingHappens() =
+        testScope.runTest {
+            // GIVEN full image is showing for an unsupported icon
+            iconManager.updateIcon(mockConsumer, unsupportedIcon).run()
+            // AND the view is shown
+            iconManager.onViewShown(true)
+            runCurrent()
+            clearInvocations(mockConsumer)
+
+            // WHEN the view goes off the screen
+            iconManager.onViewShown(false)
+            // AND we wait a bit
+            advanceTimeBy(FREE_IMAGE_DELAY_MS)
+            runCurrent()
+
+            // THEN nothing happens
+            verifyNoMoreInteractions(mockConsumer)
+        }
+
+    @Test
+    fun onViewHidden_placeholderShowing_nothingHappens() =
+        testScope.runTest {
+            // GIVEN placeholder image is showing
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+            clearInvocations(mockConsumer)
+
+            // WHEN the view is hidden
+            iconManager.onViewShown(false)
+            // AND we wait a bit
+            advanceTimeBy(FREE_IMAGE_DELAY_MS)
+            runCurrent()
+
+            // THEN nothing happens
+            verifyNoMoreInteractions(mockConsumer)
+        }
+
+    @Test
+    fun onViewShown_alreadyShowing_nothingHappens() =
+        testScope.runTest {
+            // GIVEN full image is showing and the view is shown
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+            iconManager.onViewShown(true)
+            runCurrent()
+            clearInvocations(mockConsumer)
+
+            // WHEN view shown called again
+            iconManager.onViewShown(true)
+            runCurrent()
+
+            // THEN nothing happens
+            verifyNoMoreInteractions(mockConsumer)
+        }
+
+    @Test
+    fun onViewHidden_alreadyHidden_nothingHappens() =
+        testScope.runTest {
+            // GIVEN placeholder image is showing and the view is hidden
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+            iconManager.onViewShown(false)
+            advanceTimeBy(FREE_IMAGE_DELAY_MS)
+            runCurrent()
+            clearInvocations(mockConsumer)
+
+            // WHEN the view is hidden again
+            iconManager.onViewShown(false)
+            // AND we wait a bit
+            advanceTimeBy(FREE_IMAGE_DELAY_MS)
+            runCurrent()
+
+            // THEN nothing happens
+            verifyNoMoreInteractions(mockConsumer)
+        }
+
+    @Test
+    fun cancelJobs_freeImageJobRunning_jobCancelled() =
+        testScope.runTest {
+            // GIVEN full image is showing
+            iconManager.updateIcon(mockConsumer, supportedIcon).run()
+            iconManager.onViewShown(true)
+            runCurrent()
+            clearInvocations(mockConsumer)
+            // AND the view has just gone off the screen
+            iconManager.onViewShown(false)
+
+            // WHEN cancelJobs is called
+            iconManager.cancelJobs()
+            // AND we wait a bit
+            advanceTimeBy(FREE_IMAGE_DELAY_MS)
+            runCurrent()
+
+            // THEN no more updates are happening
+            verifyNoMoreInteractions(mockConsumer)
+        }
+
+    private fun overrideMaxImageSizes() {
+        testableResources.addOverride(
+            com.android.internal.R.dimen.notification_big_picture_max_width,
+            MAX_IMAGE_SIZE
+        )
+        testableResources.addOverride(
+            com.android.internal.R.dimen.notification_big_picture_max_height,
+            MAX_IMAGE_SIZE
+        )
+    }
+
+    private fun assertIsPlaceHolder(drawable: Drawable) {
+        assertThat(drawable).isInstanceOf(PlaceHolderDrawable::class.java)
+    }
+
+    private fun assertIsFullImage(drawable: Drawable) {
+        assertThat(drawable).isInstanceOf(BitmapDrawable::class.java)
+    }
+
+    private fun assertSize(
+        drawable: Drawable,
+        expectedWidth: Int = expectedDrawable.intrinsicWidth,
+        expectedHeight: Int = expectedDrawable.intrinsicHeight
+    ) {
+        assertThat(drawable.intrinsicWidth).isEqualTo(expectedWidth)
+        assertThat(drawable.intrinsicHeight).isEqualTo(expectedHeight)
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt
new file mode 100644
index 0000000..1c7a836
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt
@@ -0,0 +1,282 @@
+/*
+ * Copyright (c) 2023 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.systemui.statusbar.notification.row
+
+import android.app.ActivityManager
+import android.database.ContentObserver
+import android.net.Uri
+import android.os.Handler
+import android.provider.Settings.Secure
+import android.testing.TestableLooper
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.dump.DumpManager
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.statusbar.notification.row.NotificationSettingsController.Listener
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.capture
+import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.settings.SecureSettings
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.anyString
+import org.mockito.Captor
+import org.mockito.Mock
+import org.mockito.Mockito
+import org.mockito.Mockito.anyBoolean
+import org.mockito.Mockito.clearInvocations
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@TestableLooper.RunWithLooper
+class NotificationSettingsControllerTest : SysuiTestCase() {
+
+    val setting1: String = Secure.NOTIFICATION_BUBBLES
+    val setting2: String = Secure.ACCESSIBILITY_ENABLED
+    val settingUri1: Uri = Secure.getUriFor(setting1)
+    val settingUri2: Uri = Secure.getUriFor(setting2)
+
+    @Mock private lateinit var userTracker: UserTracker
+    private lateinit var mainHandler: Handler
+    private lateinit var backgroundHandler: Handler
+    private lateinit var testableLooper: TestableLooper
+    @Mock private lateinit var secureSettings: SecureSettings
+    @Mock private lateinit var dumpManager: DumpManager
+
+    @Captor private lateinit var userTrackerCallbackCaptor: ArgumentCaptor<UserTracker.Callback>
+    @Captor private lateinit var settingsObserverCaptor: ArgumentCaptor<ContentObserver>
+
+    private lateinit var controller: NotificationSettingsController
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        testableLooper = TestableLooper.get(this)
+        mainHandler = Handler(testableLooper.looper)
+        backgroundHandler = Handler(testableLooper.looper)
+        allowTestableLooperAsMainThread()
+        controller =
+            NotificationSettingsController(
+                userTracker,
+                mainHandler,
+                backgroundHandler,
+                secureSettings,
+                dumpManager
+            )
+    }
+
+    @After
+    fun tearDown() {
+        disallowTestableLooperAsMainThread()
+    }
+
+    @Test
+    fun creationRegistersCallbacks() {
+        verify(userTracker).addCallback(any(), any())
+        verify(dumpManager).registerNormalDumpable(anyString(), eq(controller))
+    }
+
+    @Test
+    fun updateContentObserverRegistration_onUserChange_noSettingsListeners() {
+        verify(userTracker).addCallback(capture(userTrackerCallbackCaptor), any())
+        val userCallback = userTrackerCallbackCaptor.value
+        val userId = 9
+
+        // When: User is changed
+        userCallback.onUserChanged(userId, context)
+
+        // Validate: Nothing to do, since we aren't monitoring settings
+        verify(secureSettings, never()).unregisterContentObserverSync(any())
+        verify(secureSettings, never())
+            .registerContentObserverForUserSync(any(Uri::class.java), anyBoolean(), any(), anyInt())
+    }
+
+    @Test
+    fun updateContentObserverRegistration_onUserChange_withSettingsListeners() {
+        // When: someone is listening to a setting
+        controller.addCallback(settingUri1, Mockito.mock(Listener::class.java))
+
+        verify(userTracker).addCallback(capture(userTrackerCallbackCaptor), any())
+        val userCallback = userTrackerCallbackCaptor.value
+        val userId = 9
+
+        // Then: User is changed
+        userCallback.onUserChanged(userId, context)
+
+        // Validate: The tracker is unregistered and re-registered with the new user
+        verify(secureSettings).unregisterContentObserverSync(any())
+        verify(secureSettings)
+            .registerContentObserverForUserSync(eq(settingUri1), eq(false), any(), eq(userId))
+    }
+
+    @Test
+    fun addCallback_onlyFirstForUriRegistersObserver() {
+        controller.addCallback(settingUri1, Mockito.mock(Listener::class.java))
+        verifyNoMoreInteractions(secureSettings)
+        testableLooper.processAllMessages()
+        verify(secureSettings)
+            .registerContentObserverForUserSync(
+                eq(settingUri1),
+                eq(false),
+                any(),
+                eq(ActivityManager.getCurrentUser())
+            )
+
+        controller.addCallback(settingUri1, Mockito.mock(Listener::class.java))
+        verify(secureSettings)
+            .registerContentObserverForUserSync(any(Uri::class.java), anyBoolean(), any(), anyInt())
+    }
+
+    @Test
+    fun addCallback_secondUriRegistersObserver() {
+        controller.addCallback(settingUri1, Mockito.mock(Listener::class.java))
+        verifyNoMoreInteractions(secureSettings)
+        testableLooper.processAllMessages()
+        verify(secureSettings)
+            .registerContentObserverForUserSync(
+                eq(settingUri1),
+                eq(false),
+                any(),
+                eq(ActivityManager.getCurrentUser())
+            )
+        clearInvocations(secureSettings)
+
+        controller.addCallback(settingUri2, Mockito.mock(Listener::class.java))
+        verifyNoMoreInteractions(secureSettings)
+        testableLooper.processAllMessages()
+        verify(secureSettings)
+            .registerContentObserverForUserSync(
+                eq(settingUri2),
+                eq(false),
+                any(),
+                eq(ActivityManager.getCurrentUser())
+            )
+    }
+
+    @Test
+    fun removeCallback_lastUnregistersObserver() {
+        val listenerSetting1: Listener = mock()
+        val listenerSetting2: Listener = mock()
+        controller.addCallback(settingUri1, listenerSetting1)
+        verifyNoMoreInteractions(secureSettings)
+        testableLooper.processAllMessages()
+        verify(secureSettings)
+            .registerContentObserverForUserSync(
+                eq(settingUri1),
+                eq(false),
+                any(),
+                eq(ActivityManager.getCurrentUser())
+            )
+        clearInvocations(secureSettings)
+
+        controller.addCallback(settingUri2, listenerSetting2)
+        verifyNoMoreInteractions(secureSettings)
+        testableLooper.processAllMessages()
+        verify(secureSettings)
+            .registerContentObserverForUserSync(eq(settingUri2), anyBoolean(), any(), anyInt())
+        clearInvocations(secureSettings)
+
+        controller.removeCallback(settingUri2, listenerSetting2)
+        testableLooper.processAllMessages()
+        verify(secureSettings, never()).unregisterContentObserverSync(any())
+        clearInvocations(secureSettings)
+
+        controller.removeCallback(settingUri1, listenerSetting1)
+        verifyNoMoreInteractions(secureSettings)
+        testableLooper.processAllMessages()
+        verify(secureSettings).unregisterContentObserverSync(any())
+    }
+
+    @Test
+    fun addCallback_updatesCurrentValue() {
+        whenever(secureSettings.getStringForUser(setting1, ActivityManager.getCurrentUser()))
+            .thenReturn("9")
+        whenever(secureSettings.getStringForUser(setting2, ActivityManager.getCurrentUser()))
+            .thenReturn("5")
+
+        val listenerSetting1a: Listener = mock()
+        val listenerSetting1b: Listener = mock()
+        val listenerSetting2: Listener = mock()
+
+        controller.addCallback(settingUri1, listenerSetting1a)
+        controller.addCallback(settingUri1, listenerSetting1b)
+        controller.addCallback(settingUri2, listenerSetting2)
+
+        verifyNoMoreInteractions(secureSettings)
+        testableLooper.processAllMessages()
+
+        verify(listenerSetting1a)
+            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
+        verify(listenerSetting1b)
+            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
+        verify(listenerSetting2)
+            .onSettingChanged(settingUri2, ActivityManager.getCurrentUser(), "5")
+    }
+
+    @Test
+    fun removeCallback_noMoreUpdates() {
+        whenever(secureSettings.getStringForUser(setting1, ActivityManager.getCurrentUser()))
+            .thenReturn("9")
+
+        val listenerSetting1a: Listener = mock()
+        val listenerSetting1b: Listener = mock()
+
+        // First, register
+        controller.addCallback(settingUri1, listenerSetting1a)
+        controller.addCallback(settingUri1, listenerSetting1b)
+        verifyNoMoreInteractions(secureSettings)
+        testableLooper.processAllMessages()
+
+        verify(secureSettings)
+            .registerContentObserverForUserSync(
+                any(Uri::class.java),
+                anyBoolean(),
+                capture(settingsObserverCaptor),
+                anyInt()
+            )
+        verify(listenerSetting1a)
+            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
+        verify(listenerSetting1b)
+            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
+        clearInvocations(listenerSetting1b)
+        clearInvocations(listenerSetting1a)
+
+        // Remove one of them
+        controller.removeCallback(settingUri1, listenerSetting1a)
+
+        // On update, only remaining listener should get the callback
+        settingsObserverCaptor.value.onChange(false, settingUri1)
+        testableLooper.processAllMessages()
+
+        verify(listenerSetting1a, never())
+            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
+        verify(listenerSetting1b)
+            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModelTest.kt
deleted file mode 100644
index a310ef4..0000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModelTest.kt
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2024 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.
- */
-
-@file:OptIn(ExperimentalCoroutinesApi::class)
-
-package com.android.systemui.statusbar.notification.row.ui.viewmodel
-
-import android.platform.test.annotations.EnableFlags
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.statusbar.notification.row.data.repository.fakeNotificationRowRepository
-import com.android.systemui.statusbar.notification.row.shared.EnRouteContentModel
-import com.android.systemui.statusbar.notification.row.shared.IconModel
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag
-import com.android.systemui.testKosmos
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.kotlin.mock
-
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-@EnableFlags(RichOngoingNotificationFlag.FLAG_NAME)
-class EnRouteViewModelTest : SysuiTestCase() {
-    private val kosmos = testKosmos()
-    private val testScope = kosmos.testScope
-    private val repository = kosmos.fakeNotificationRowRepository
-
-    private var contentModel: EnRouteContentModel?
-        get() = repository.richOngoingContentModel.value as? EnRouteContentModel
-        set(value) {
-            repository.richOngoingContentModel.value = value
-        }
-
-    private lateinit var underTest: EnRouteViewModel
-
-    @Before
-    fun setup() {
-        underTest = kosmos.getEnRouteViewModel(repository)
-    }
-
-    @Test
-    fun viewModelShowsContent() =
-        testScope.runTest {
-            val title by collectLastValue(underTest.title)
-            val text by collectLastValue(underTest.text)
-            contentModel =
-                exampleEnRouteContent(
-                    title = "Example EnRoute Title",
-                    text = "Example EnRoute Text",
-                )
-            assertThat(title).isEqualTo("Example EnRoute Title")
-            assertThat(text).isEqualTo("Example EnRoute Text")
-        }
-
-    private fun exampleEnRouteContent(
-        icon: IconModel = mock(),
-        title: CharSequence = "example text",
-        text: CharSequence = "example title",
-    ) =
-        EnRouteContentModel(
-            smallIcon = icon,
-            title = title,
-            text = text,
-        )
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModelTest.kt
deleted file mode 100644
index 61873ad..0000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModelTest.kt
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2024 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.
- */
-
-@file:OptIn(ExperimentalCoroutinesApi::class)
-
-package com.android.systemui.statusbar.notification.row.ui.viewmodel
-
-import android.app.Notification
-import android.app.PendingIntent
-import android.platform.test.annotations.EnableFlags
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.statusbar.notification.row.data.repository.fakeNotificationRowRepository
-import com.android.systemui.statusbar.notification.row.shared.IconModel
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag
-import com.android.systemui.statusbar.notification.row.shared.TimerContentModel
-import com.android.systemui.statusbar.notification.row.shared.TimerContentModel.TimerState.Paused
-import com.android.systemui.testKosmos
-import com.google.common.truth.Truth.assertThat
-import java.time.Duration
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.kotlin.mock
-
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-@EnableFlags(RichOngoingNotificationFlag.FLAG_NAME)
-class TimerViewModelTest : SysuiTestCase() {
-    private val kosmos = testKosmos()
-    private val testScope = kosmos.testScope
-    private val repository = kosmos.fakeNotificationRowRepository
-
-    private var contentModel: TimerContentModel?
-        get() = repository.richOngoingContentModel.value as? TimerContentModel
-        set(value) {
-            repository.richOngoingContentModel.value = value
-        }
-
-    private lateinit var underTest: TimerViewModel
-
-    @Before
-    fun setup() {
-        underTest = kosmos.getTimerViewModel(repository)
-    }
-
-    @Test
-    fun labelShowsTheTimerName() =
-        testScope.runTest {
-            val label by collectLastValue(underTest.label)
-            contentModel = pausedTimer(name = "Example Timer Name")
-            assertThat(label).isEqualTo("Example Timer Name")
-        }
-
-    @Test
-    fun pausedTimeRemainingFormatsWell() =
-        testScope.runTest {
-            val label by collectLastValue(underTest.pausedTime)
-            contentModel = pausedTimer(timeRemaining = Duration.ofMinutes(3))
-            assertThat(label).isEqualTo("3:00")
-            contentModel = pausedTimer(timeRemaining = Duration.ofSeconds(119))
-            assertThat(label).isEqualTo("1:59")
-            contentModel = pausedTimer(timeRemaining = Duration.ofSeconds(121))
-            assertThat(label).isEqualTo("2:01")
-            contentModel = pausedTimer(timeRemaining = Duration.ofHours(1))
-            assertThat(label).isEqualTo("1:00:00")
-            contentModel = pausedTimer(timeRemaining = Duration.ofHours(24))
-            assertThat(label).isEqualTo("24:00:00")
-        }
-
-    private fun pausedTimer(
-        icon: IconModel = mock(),
-        name: String = "example",
-        timeRemaining: Duration = Duration.ofMinutes(3),
-        resumeIntent: PendingIntent? = null,
-        addMinuteAction: Notification.Action? = null,
-        resetAction: Notification.Action? = null
-    ) =
-        TimerContentModel(
-            icon = icon,
-            name = name,
-            state =
-                Paused(
-                    timeRemaining = timeRemaining,
-                    resumeIntent = resumeIntent,
-                    addMinuteAction = addMinuteAction,
-                    resetAction = resetAction,
-                )
-        )
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerTest.kt
new file mode 100644
index 0000000..13280f2
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerTest.kt
@@ -0,0 +1,547 @@
+/*
+ * Copyright (C) 2023 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.systemui.statusbar.notification.stack.ui.view
+
+import android.service.notification.notificationListenerService
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.internal.statusbar.NotificationVisibility
+import com.android.internal.statusbar.statusBarService
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.statusbar.notification.data.model.activeNotificationModel
+import com.android.systemui.statusbar.notification.logging.nano.Notifications
+import com.android.systemui.statusbar.notification.logging.notificationPanelLogger
+import com.android.systemui.statusbar.notification.stack.ExpandableViewState
+import com.android.systemui.testKosmos
+import com.android.systemui.util.mockito.argumentCaptor
+import com.android.systemui.util.mockito.eq
+import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.Callable
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.clearInvocations
+import org.mockito.Mockito.spy
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class NotificationStatsLoggerTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+
+    private val testScope = kosmos.testScope
+    private val mockNotificationListenerService = kosmos.notificationListenerService
+    private val mockPanelLogger = kosmos.notificationPanelLogger
+    private val mockStatusBarService = kosmos.statusBarService
+
+    private val underTest = kosmos.notificationStatsLogger
+
+    private val visibilityArrayCaptor = argumentCaptor<Array<NotificationVisibility>>()
+    private val stringArrayCaptor = argumentCaptor<Array<String>>()
+    private val notificationListProtoCaptor = argumentCaptor<Notifications.NotificationList>()
+
+    @Test
+    fun onNotificationListUpdated_itemsAdded_logsNewlyVisibleItems() =
+        testScope.runTest {
+            // WHEN new Notifications are added
+            // AND they're visible
+            val (ranks, locations) = fakeNotificationMaps("key0", "key1")
+            val callable = Callable { locations }
+            underTest.onNotificationLocationsChanged(callable, ranks)
+            runCurrent()
+
+            // THEN visibility changes are reported
+            verify(mockStatusBarService)
+                .onNotificationVisibilityChanged(visibilityArrayCaptor.capture(), eq(emptyArray()))
+            verify(mockNotificationListenerService)
+                .setNotificationsShown(stringArrayCaptor.capture())
+            val loggedVisibilities = visibilityArrayCaptor.value
+            val loggedKeys = stringArrayCaptor.value
+            assertThat(loggedVisibilities).hasLength(2)
+            assertThat(loggedKeys).hasLength(2)
+            assertThat(loggedVisibilities[0]).apply {
+                isKeyEqualTo("key0")
+                isRankEqualTo(0)
+                isVisible()
+                isInMainArea()
+                isCountEqualTo(2)
+            }
+            assertThat(loggedVisibilities[1]).apply {
+                isKeyEqualTo("key1")
+                isRankEqualTo(1)
+                isVisible()
+                isInMainArea()
+                isCountEqualTo(2)
+            }
+            assertThat(loggedKeys[0]).isEqualTo("key0")
+            assertThat(loggedKeys[1]).isEqualTo("key1")
+        }
+
+    @Test
+    fun onNotificationListUpdated_itemsRemoved_logsNoLongerVisibleItems() =
+        testScope.runTest {
+            // GIVEN some visible Notifications are reported
+            val (ranks, locations) = fakeNotificationMaps("key0", "key1")
+            val callable = Callable { locations }
+            underTest.onNotificationLocationsChanged(callable, ranks)
+            runCurrent()
+            clearInvocations(mockStatusBarService, mockNotificationListenerService)
+
+            // WHEN the same Notifications are removed
+            val emptyCallable = Callable { emptyMap<String, Int>() }
+            underTest.onNotificationLocationsChanged(emptyCallable, emptyMap())
+            runCurrent()
+
+            // THEN visibility changes are reported
+            verify(mockStatusBarService)
+                .onNotificationVisibilityChanged(eq(emptyArray()), visibilityArrayCaptor.capture())
+            verifyNoMoreInteractions(mockNotificationListenerService)
+            val noLongerVisible = visibilityArrayCaptor.value
+            assertThat(noLongerVisible).hasLength(2)
+            assertThat(noLongerVisible[0]).apply {
+                isKeyEqualTo("key0")
+                isRankEqualTo(0)
+                notVisible()
+                isInMainArea()
+                isCountEqualTo(0)
+            }
+            assertThat(noLongerVisible[1]).apply {
+                isKeyEqualTo("key1")
+                isRankEqualTo(1)
+                notVisible()
+                isInMainArea()
+                isCountEqualTo(0)
+            }
+        }
+
+    @Test
+    fun onNotificationListUpdated_itemsBecomeInvisible_logsNoLongerVisibleItems() =
+        testScope.runTest {
+            // GIVEN some visible Notifications are reported
+            val (ranks, locations) = fakeNotificationMaps("key0", "key1")
+            val callable = Callable { locations }
+            underTest.onNotificationLocationsChanged(callable, ranks)
+            runCurrent()
+            clearInvocations(mockStatusBarService, mockNotificationListenerService)
+
+            // WHEN the same Notifications are becoming invisible
+            val emptyCallable = Callable { emptyMap<String, Int>() }
+            underTest.onNotificationLocationsChanged(emptyCallable, ranks)
+            runCurrent()
+
+            // THEN visibility changes are reported
+            verify(mockStatusBarService)
+                .onNotificationVisibilityChanged(eq(emptyArray()), visibilityArrayCaptor.capture())
+            verifyNoMoreInteractions(mockNotificationListenerService)
+            val noLongerVisible = visibilityArrayCaptor.value
+            assertThat(noLongerVisible).hasLength(2)
+            assertThat(noLongerVisible[0]).apply {
+                isKeyEqualTo("key0")
+                isRankEqualTo(0)
+                notVisible()
+                isInMainArea()
+                isCountEqualTo(2)
+            }
+            assertThat(noLongerVisible[1]).apply {
+                isKeyEqualTo("key1")
+                isRankEqualTo(1)
+                notVisible()
+                isInMainArea()
+                isCountEqualTo(2)
+            }
+        }
+
+    @Test
+    fun onNotificationListUpdated_itemsChangedPositions_nothingLogged() =
+        testScope.runTest {
+            // GIVEN some visible Notifications are reported
+            val (ranks, locations) = fakeNotificationMaps("key0", "key1")
+            underTest.onNotificationLocationsChanged({ locations }, ranks)
+            runCurrent()
+            clearInvocations(mockStatusBarService, mockNotificationListenerService)
+
+            // WHEN the reported Notifications are changing positions
+            val (newRanks, newLocations) = fakeNotificationMaps("key1", "key0")
+            underTest.onNotificationLocationsChanged({ newLocations }, newRanks)
+            runCurrent()
+
+            // THEN no visibility changes are reported
+            verifyNoMoreInteractions(mockStatusBarService, mockNotificationListenerService)
+        }
+
+    @Test
+    fun onNotificationListUpdated_calledTwice_usesTheNewCallable() =
+        testScope.runTest {
+            // GIVEN some visible Notifications are reported
+            val (ranks, locations) = fakeNotificationMaps("key0", "key1", "key2")
+            val callable = spy(Callable { locations })
+            underTest.onNotificationLocationsChanged(callable, ranks)
+            runCurrent()
+            clearInvocations(callable)
+
+            // WHEN a new update comes
+            val otherCallable = spy(Callable { locations })
+            underTest.onNotificationLocationsChanged(otherCallable, ranks)
+            runCurrent()
+
+            // THEN we call the new Callable
+            verifyNoMoreInteractions(callable)
+            verify(otherCallable).call()
+        }
+
+    @Test
+    fun onLockscreenOrShadeNotInteractive_logsNoLongerVisibleItems() =
+        testScope.runTest {
+            // GIVEN some visible Notifications are reported
+            val (ranks, locations) = fakeNotificationMaps("key0", "key1")
+            val callable = Callable { locations }
+            underTest.onNotificationLocationsChanged(callable, ranks)
+            runCurrent()
+            clearInvocations(mockStatusBarService, mockNotificationListenerService)
+
+            // WHEN the Shade becomes non interactive
+            underTest.onLockscreenOrShadeNotInteractive(emptyList())
+            runCurrent()
+
+            // THEN visibility changes are reported
+            verify(mockStatusBarService)
+                .onNotificationVisibilityChanged(eq(emptyArray()), visibilityArrayCaptor.capture())
+            verifyNoMoreInteractions(mockNotificationListenerService)
+            val noLongerVisible = visibilityArrayCaptor.value
+            assertThat(noLongerVisible).hasLength(2)
+            assertThat(noLongerVisible[0]).apply {
+                isKeyEqualTo("key0")
+                isRankEqualTo(0)
+                notVisible()
+                isInMainArea()
+                isCountEqualTo(0)
+            }
+            assertThat(noLongerVisible[1]).apply {
+                isKeyEqualTo("key1")
+                isRankEqualTo(1)
+                notVisible()
+                isInMainArea()
+                isCountEqualTo(0)
+            }
+        }
+
+    @Test
+    fun onLockscreenOrShadeInteractive_logsPanelShown() =
+        testScope.runTest {
+            // WHEN the Shade becomes interactive
+            underTest.onLockscreenOrShadeInteractive(
+                isOnLockScreen = true,
+                listOf(
+                    activeNotificationModel(
+                        key = "key0",
+                        uid = 0,
+                        packageName = "com.android.first"
+                    ),
+                    activeNotificationModel(
+                        key = "key1",
+                        uid = 1,
+                        packageName = "com.android.second"
+                    ),
+                )
+            )
+            runCurrent()
+
+            // THEN the Panel shown event is reported
+            verify(mockPanelLogger).logPanelShown(eq(true), notificationListProtoCaptor.capture())
+            val loggedNotifications = notificationListProtoCaptor.value.notifications
+            assertThat(loggedNotifications.size).isEqualTo(2)
+            with(loggedNotifications[0]) {
+                assertThat(uid).isEqualTo(0)
+                assertThat(packageName).isEqualTo("com.android.first")
+            }
+            with(loggedNotifications[1]) {
+                assertThat(uid).isEqualTo(1)
+                assertThat(packageName).isEqualTo("com.android.second")
+            }
+        }
+
+    @Test
+    fun onNotificationExpansionChanged_whenExpandedInVisibleLocation_logsExpansion() =
+        testScope.runTest {
+            // WHEN a Notification is expanded
+            underTest.onNotificationExpansionChanged(
+                key = "key",
+                isExpanded = true,
+                location = ExpandableViewState.LOCATION_MAIN_AREA,
+                isUserAction = true
+            )
+            runCurrent()
+
+            // THEN the Expand event is reported
+            verify(mockStatusBarService)
+                .onNotificationExpansionChanged(
+                    /* key = */ "key",
+                    /* userAction = */ true,
+                    /* expanded = */ true,
+                    NotificationVisibility.NotificationLocation.LOCATION_MAIN_AREA.ordinal
+                )
+        }
+
+    @Test
+    fun onNotificationExpansionChanged_whenCalledTwiceWithTheSameUpdate_doesNotDuplicateLogs() =
+        testScope.runTest {
+            // GIVEN a Notification is expanded
+            underTest.onNotificationExpansionChanged(
+                key = "key",
+                isExpanded = true,
+                location = ExpandableViewState.LOCATION_MAIN_AREA,
+                isUserAction = true
+            )
+            runCurrent()
+            clearInvocations(mockStatusBarService)
+
+            // WHEN the logger receives the same expansion update
+            underTest.onNotificationExpansionChanged(
+                key = "key",
+                isExpanded = true,
+                location = ExpandableViewState.LOCATION_MAIN_AREA,
+                isUserAction = true
+            )
+            runCurrent()
+
+            // THEN the Expand event is not reported again
+            verifyNoMoreInteractions(mockStatusBarService)
+        }
+
+    @Test
+    fun onNotificationExpansionChanged_whenCalledForNotVisibleItem_nothingLogged() =
+        testScope.runTest {
+            // WHEN a NOT visible Notification is expanded
+            underTest.onNotificationExpansionChanged(
+                key = "key",
+                isExpanded = true,
+                location = ExpandableViewState.LOCATION_BOTTOM_STACK_HIDDEN,
+                isUserAction = true
+            )
+            runCurrent()
+
+            // No events are reported
+            verifyNoMoreInteractions(mockStatusBarService)
+        }
+
+    @Test
+    fun onNotificationExpansionChanged_whenNotVisibleItemBecomesVisible_logsChanges() =
+        testScope.runTest {
+            // WHEN a NOT visible Notification is expanded
+            underTest.onNotificationExpansionChanged(
+                key = "key",
+                isExpanded = true,
+                location = ExpandableViewState.LOCATION_GONE,
+                isUserAction = false
+            )
+            runCurrent()
+
+            // AND it becomes visible
+            val (ranks, locations) = fakeNotificationMaps("key")
+            val callable = Callable { locations }
+            underTest.onNotificationLocationsChanged(callable, ranks)
+            runCurrent()
+
+            // THEN the Expand event is reported
+            verify(mockStatusBarService)
+                .onNotificationExpansionChanged(
+                    /* key = */ "key",
+                    /* userAction = */ false,
+                    /* expanded = */ true,
+                    NotificationVisibility.NotificationLocation.LOCATION_MAIN_AREA.ordinal
+                )
+        }
+
+    @Test
+    fun onNotificationExpansionChanged_whenUpdatedItemBecomesVisible_logsChanges() =
+        testScope.runTest {
+            // GIVEN a NOT visible Notification is expanded
+            underTest.onNotificationExpansionChanged(
+                key = "key",
+                isExpanded = true,
+                location = ExpandableViewState.LOCATION_GONE,
+                isUserAction = false
+            )
+            runCurrent()
+            // AND we open the shade, so we log its events
+            val (ranks, locations) = fakeNotificationMaps("key")
+            val callable = Callable { locations }
+            underTest.onNotificationLocationsChanged(callable, ranks)
+            runCurrent()
+            // AND we close the shade, so it is NOT visible
+            val emptyCallable = Callable { emptyMap<String, Int>() }
+            underTest.onNotificationLocationsChanged(emptyCallable, ranks)
+            runCurrent()
+            clearInvocations(mockStatusBarService) // clear the previous expand log
+
+            // WHEN it receives an update
+            underTest.onNotificationUpdated("key")
+            // AND it becomes visible again
+            underTest.onNotificationLocationsChanged(callable, ranks)
+            runCurrent()
+
+            // THEN we log its expand event again
+            verify(mockStatusBarService)
+                .onNotificationExpansionChanged(
+                    /* key = */ "key",
+                    /* userAction = */ false,
+                    /* expanded = */ true,
+                    NotificationVisibility.NotificationLocation.LOCATION_MAIN_AREA.ordinal
+                )
+        }
+
+    @Test
+    fun onNotificationExpansionChanged_whenCollapsedForTheFirstTime_nothingLogged() =
+        testScope.runTest {
+            // WHEN a Notification is collapsed, and it is the first interaction
+            underTest.onNotificationExpansionChanged(
+                key = "key",
+                isExpanded = false,
+                location = ExpandableViewState.LOCATION_MAIN_AREA,
+                isUserAction = false
+            )
+            runCurrent()
+
+            // THEN no events are reported, because we consider the Notification initially
+            // collapsed, so only expanded is logged in the first time.
+            verifyNoMoreInteractions(mockStatusBarService)
+        }
+
+    @Test
+    fun onNotificationExpansionChanged_receivesMultipleUpdates_logsChanges() =
+        testScope.runTest {
+            // GIVEN a Notification is expanded
+            underTest.onNotificationExpansionChanged(
+                key = "key",
+                isExpanded = true,
+                location = ExpandableViewState.LOCATION_MAIN_AREA,
+                isUserAction = true
+            )
+            runCurrent()
+
+            // WHEN the Notification is collapsed
+            verify(mockStatusBarService)
+                .onNotificationExpansionChanged(
+                    /* key = */ "key",
+                    /* userAction = */ true,
+                    /* expanded = */ true,
+                    NotificationVisibility.NotificationLocation.LOCATION_MAIN_AREA.ordinal
+                )
+
+            // AND the Notification is expanded again
+            underTest.onNotificationExpansionChanged(
+                key = "key",
+                isExpanded = false,
+                location = ExpandableViewState.LOCATION_MAIN_AREA,
+                isUserAction = true
+            )
+            runCurrent()
+
+            // THEN the expansion changes are logged
+            verify(mockStatusBarService)
+                .onNotificationExpansionChanged(
+                    /* key = */ "key",
+                    /* userAction = */ true,
+                    /* expanded = */ false,
+                    NotificationVisibility.NotificationLocation.LOCATION_MAIN_AREA.ordinal
+                )
+        }
+
+    @Test
+    fun onNotificationUpdated_clearsTrackedExpansionChanges() =
+        testScope.runTest {
+            // GIVEN some notification updates are posted
+            underTest.onNotificationExpansionChanged(
+                key = "key1",
+                isExpanded = true,
+                location = ExpandableViewState.LOCATION_MAIN_AREA,
+                isUserAction = true
+            )
+            runCurrent()
+            underTest.onNotificationExpansionChanged(
+                key = "key2",
+                isExpanded = true,
+                location = ExpandableViewState.LOCATION_MAIN_AREA,
+                isUserAction = true
+            )
+            runCurrent()
+            clearInvocations(mockStatusBarService)
+
+            // WHEN a Notification is updated
+            underTest.onNotificationUpdated("key1")
+
+            // THEN the tracked expansion changes are updated
+            assertThat(underTest.lastReportedExpansionValues.keys).containsExactly("key2")
+        }
+
+    @Test
+    fun onNotificationRemoved_clearsTrackedExpansionChanges() =
+        testScope.runTest {
+            // GIVEN some notification updates are posted
+            underTest.onNotificationExpansionChanged(
+                key = "key1",
+                isExpanded = true,
+                location = ExpandableViewState.LOCATION_MAIN_AREA,
+                isUserAction = true
+            )
+            runCurrent()
+            underTest.onNotificationExpansionChanged(
+                key = "key2",
+                isExpanded = true,
+                location = ExpandableViewState.LOCATION_MAIN_AREA,
+                isUserAction = true
+            )
+            runCurrent()
+            clearInvocations(mockStatusBarService)
+
+            // WHEN a Notification is removed
+            underTest.onNotificationRemoved("key1")
+
+            // THEN it is removed from the tracked expansion changes
+            assertThat(underTest.lastReportedExpansionValues.keys).doesNotContain("key1")
+        }
+
+    private fun fakeNotificationMaps(
+        vararg keys: String
+    ): Pair<Map<String, Int>, Map<String, Int>> {
+        val ranks: Map<String, Int> = keys.mapIndexed { index, key -> key to index }.toMap()
+        val locations: Map<String, Int> =
+            keys.associateWith { ExpandableViewState.LOCATION_MAIN_AREA }
+
+        return Pair(ranks, locations)
+    }
+
+    private fun assertThat(visibility: NotificationVisibility) =
+        NotificationVisibilitySubject(visibility)
+}
+
+private class NotificationVisibilitySubject(private val visibility: NotificationVisibility) {
+    fun isKeyEqualTo(key: String) = assertThat(visibility.key).isEqualTo(key)
+    fun isRankEqualTo(rank: Int) = assertThat(visibility.rank).isEqualTo(rank)
+    fun isCountEqualTo(count: Int) = assertThat(visibility.count).isEqualTo(count)
+    fun isVisible() = assertThat(this.visibility.visible).isTrue()
+    fun notVisible() = assertThat(this.visibility.visible).isFalse()
+    fun isInMainArea() =
+        assertThat(this.visibility.location)
+            .isEqualTo(NotificationVisibility.NotificationLocation.LOCATION_MAIN_AREA)
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelTest.kt
index 26e1a4d..8d678ef 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelTest.kt
@@ -18,12 +18,10 @@
 
 package com.android.systemui.statusbar.notification.stack.ui.viewmodel
 
-import android.app.NotificationManager.Policy
 import android.platform.test.annotations.EnableFlags
 import android.platform.test.flag.junit.FlagsParameterization
-import android.provider.Settings
 import androidx.test.filters.SmallTest
-import com.android.settingslib.notification.data.repository.updateNotificationPolicy
+import com.android.app.tracing.coroutines.flow.map
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.flags.DisableSceneContainer
@@ -43,10 +41,10 @@
 import com.android.systemui.statusbar.notification.data.repository.FakeHeadsUpRowRepository
 import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository
 import com.android.systemui.statusbar.notification.data.repository.setActiveNotifs
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix
 import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor
 import com.android.systemui.statusbar.notification.stack.data.repository.headsUpNotificationRepository
 import com.android.systemui.statusbar.policy.data.repository.fakeUserSetupRepository
-import com.android.systemui.statusbar.policy.data.repository.zenModeRepository
 import com.android.systemui.statusbar.policy.fakeConfigurationController
 import com.android.systemui.testKosmos
 import com.android.systemui.util.ui.isAnimating
@@ -79,7 +77,6 @@
     private val fakeRemoteInputRepository = kosmos.fakeRemoteInputRepository
     private val fakeUserSetupRepository = kosmos.fakeUserSetupRepository
     private val headsUpRepository = kosmos.headsUpNotificationRepository
-    private val zenModeRepository = kosmos.zenModeRepository
 
     private val shadeTestUtil by lazy { kosmos.shadeTestUtil }
 
@@ -155,7 +152,7 @@
     @Test
     fun shouldShowEmptyShadeView_trueWhenNoNotifs() =
         testScope.runTest {
-            val shouldShowEmptyShadeView by collectLastValue(underTest.shouldShowEmptyShadeView)
+            val shouldShowEmptyShadeView by collectEmptyShadeViewVisibility()
             val shouldIncludeFooterView by collectFooterViewVisibility()
 
             // WHEN has no notifs
@@ -170,7 +167,7 @@
     @Test
     fun shouldShowEmptyShadeView_falseWhenNotifs() =
         testScope.runTest {
-            val shouldShowEmptyShadeView by collectLastValue(underTest.shouldShowEmptyShadeView)
+            val shouldShowEmptyShadeView by collectEmptyShadeViewVisibility()
 
             // WHEN has notifs
             activeNotificationListRepository.setActiveNotifs(count = 2)
@@ -183,7 +180,7 @@
     @Test
     fun shouldShowEmptyShadeView_falseWhenQsExpandedDefault() =
         testScope.runTest {
-            val shouldShow by collectLastValue(underTest.shouldShowEmptyShadeView)
+            val shouldShow by collectEmptyShadeViewVisibility()
 
             // WHEN has no notifs
             activeNotificationListRepository.setActiveNotifs(count = 0)
@@ -198,7 +195,7 @@
     @Test
     fun shouldShowEmptyShadeView_trueWhenQsExpandedInSplitShade() =
         testScope.runTest {
-            val shouldShowEmptyShadeView by collectLastValue(underTest.shouldShowEmptyShadeView)
+            val shouldShowEmptyShadeView by collectEmptyShadeViewVisibility()
             val shouldIncludeFooterView by collectFooterViewVisibility()
 
             // WHEN has no notifs
@@ -219,7 +216,7 @@
     @Test
     fun shouldShowEmptyShadeView_trueWhenLockedShade() =
         testScope.runTest {
-            val shouldShowEmptyShadeView by collectLastValue(underTest.shouldShowEmptyShadeView)
+            val shouldShowEmptyShadeView by collectEmptyShadeViewVisibility()
             val shouldIncludeFooterView by collectFooterViewVisibility()
 
             // WHEN has no notifs
@@ -236,7 +233,7 @@
     @Test
     fun shouldShowEmptyShadeView_falseWhenKeyguard() =
         testScope.runTest {
-            val shouldShow by collectLastValue(underTest.shouldShowEmptyShadeView)
+            val shouldShow by collectEmptyShadeViewVisibility()
 
             // WHEN has no notifs
             activeNotificationListRepository.setActiveNotifs(count = 0)
@@ -251,7 +248,7 @@
     @Test
     fun shouldShowEmptyShadeView_falseWhenStartingToSleep() =
         testScope.runTest {
-            val shouldShow by collectLastValue(underTest.shouldShowEmptyShadeView)
+            val shouldShow by collectEmptyShadeViewVisibility()
 
             // WHEN has no notifs
             activeNotificationListRepository.setActiveNotifs(count = 0)
@@ -266,60 +263,10 @@
         }
 
     @Test
-    fun areNotificationsHiddenInShade_true() =
-        testScope.runTest {
-            val hidden by collectLastValue(underTest.areNotificationsHiddenInShade)
-
-            zenModeRepository.updateNotificationPolicy(
-                suppressedVisualEffects = Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST
-            )
-            zenModeRepository.updateZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS)
-            runCurrent()
-
-            assertThat(hidden).isTrue()
-        }
-
-    @Test
-    fun areNotificationsHiddenInShade_false() =
-        testScope.runTest {
-            val hidden by collectLastValue(underTest.areNotificationsHiddenInShade)
-
-            zenModeRepository.updateNotificationPolicy(
-                suppressedVisualEffects = Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST
-            )
-            zenModeRepository.updateZenMode(Settings.Global.ZEN_MODE_OFF)
-            runCurrent()
-
-            assertThat(hidden).isFalse()
-        }
-
-    @Test
-    fun hasFilteredOutSeenNotifications_true() =
-        testScope.runTest {
-            val hasFilteredNotifs by collectLastValue(underTest.hasFilteredOutSeenNotifications)
-
-            activeNotificationListRepository.hasFilteredOutSeenNotifications.value = true
-            runCurrent()
-
-            assertThat(hasFilteredNotifs).isTrue()
-        }
-
-    @Test
-    fun hasFilteredOutSeenNotifications_false() =
-        testScope.runTest {
-            val hasFilteredNotifs by collectLastValue(underTest.hasFilteredOutSeenNotifications)
-
-            activeNotificationListRepository.hasFilteredOutSeenNotifications.value = false
-            runCurrent()
-
-            assertThat(hasFilteredNotifs).isFalse()
-        }
-
-    @Test
     fun shouldIncludeFooterView_trueWhenShade() =
         testScope.runTest {
             val shouldIncludeFooterView by collectFooterViewVisibility()
-            val shouldShowEmptyShadeView by collectLastValue(underTest.shouldShowEmptyShadeView)
+            val shouldShowEmptyShadeView by collectEmptyShadeViewVisibility()
 
             // WHEN has notifs
             activeNotificationListRepository.setActiveNotifs(count = 2)
@@ -337,7 +284,7 @@
     fun shouldIncludeFooterView_trueWhenLockedShade() =
         testScope.runTest {
             val shouldIncludeFooterView by collectFooterViewVisibility()
-            val shouldShowEmptyShadeView by collectLastValue(underTest.shouldShowEmptyShadeView)
+            val shouldShowEmptyShadeView by collectEmptyShadeViewVisibility()
 
             // WHEN has notifs
             activeNotificationListRepository.setActiveNotifs(count = 2)
@@ -425,7 +372,7 @@
     fun shouldIncludeFooterView_trueWhenQsExpandedSplitShade() =
         testScope.runTest {
             val shouldIncludeFooterView by collectFooterViewVisibility()
-            val shouldShowEmptyShadeView by collectLastValue(underTest.shouldShowEmptyShadeView)
+            val shouldShowEmptyShadeView by collectEmptyShadeViewVisibility()
 
             // WHEN has notifs
             activeNotificationListRepository.setActiveNotifs(count = 2)
@@ -559,7 +506,7 @@
     @EnableSceneContainer
     fun pinnedHeadsUpRows_filtersForPinnedItems() =
         testScope.runTest {
-            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRows)
+            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRowKeys)
 
             // WHEN there are no pinned rows
             val rows =
@@ -669,4 +616,11 @@
             if (SceneContainerFlag.isEnabled) underTest.shouldShowFooterView
             else underTest.shouldIncludeFooterView
         )
+
+    private fun TestScope.collectEmptyShadeViewVisibility() =
+        collectLastValue(
+            if (ModesEmptyShadeFix.isEnabled)
+                underTest.shouldShowEmptyShadeViewAnimated.map { it.value }
+            else underTest.shouldShowEmptyShadeView
+        )
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerPhoneTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerPhoneTest.kt
index 3053672..1915e8e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerPhoneTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerPhoneTest.kt
@@ -47,6 +47,7 @@
 import com.android.systemui.util.mockito.mock
 import com.android.systemui.util.settings.GlobalSettings
 import com.android.systemui.util.time.SystemClock
+import com.google.common.truth.Truth.assertThat
 import junit.framework.Assert
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.MutableStateFlow
@@ -244,35 +245,37 @@
         mSystemClock.advanceTime((TEST_AUTO_DISMISS_TIME + hmp.mExtensionTime / 2).toLong())
         Assert.assertTrue(hmp.isHeadsUpEntry(entry.key))
     }
-
     @Test
     @EnableFlags(NotificationThrottleHun.FLAG_NAME)
-    fun testShowNotification_reorderNotAllowed_notPulsing_seenInShadeTrue() {
-        whenever(mVSProvider.isReorderingAllowed).thenReturn(false)
-        val hmp = createHeadsUpManagerPhone()
-
-        val notifEntry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext)
-        val row = mock<ExpandableNotificationRow>()
-        whenever(row.showingPulsing()).thenReturn(false)
-        notifEntry.row = row
-
-        hmp.showNotification(notifEntry)
-        Assert.assertTrue(notifEntry.isSeenInShade)
-    }
-
-    @Test
-    @EnableFlags(NotificationThrottleHun.FLAG_NAME)
-    fun testShowNotification_reorderAllowed_notPulsing_seenInShadeFalse() {
+    fun testShowNotification_removeWhenReorderingAllowedTrue() {
         whenever(mVSProvider.isReorderingAllowed).thenReturn(true)
         val hmp = createHeadsUpManagerPhone()
 
         val notifEntry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext)
-        val row = mock<ExpandableNotificationRow>()
-        whenever(row.showingPulsing()).thenReturn(false)
-        notifEntry.row = row
-
         hmp.showNotification(notifEntry)
-        Assert.assertFalse(notifEntry.isSeenInShade)
+        assertThat(hmp.mEntriesToRemoveWhenReorderingAllowed.contains(notifEntry)).isTrue();
+    }
+
+    @Test
+    @EnableFlags(NotificationThrottleHun.FLAG_NAME)
+    fun testShowNotification_reorderNotAllowed_seenInShadeTrue() {
+        whenever(mVSProvider.isReorderingAllowed).thenReturn(false)
+        val hmp = createHeadsUpManagerPhone()
+
+        val notifEntry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext)
+        hmp.showNotification(notifEntry)
+        assertThat(notifEntry.isSeenInShade).isTrue();
+    }
+
+    @Test
+    @EnableFlags(NotificationThrottleHun.FLAG_NAME)
+    fun testShowNotification_reorderAllowed_seenInShadeFalse() {
+        whenever(mVSProvider.isReorderingAllowed).thenReturn(true)
+        val hmp = createHeadsUpManagerPhone()
+
+        val notifEntry = HeadsUpManagerTestUtil.createEntry(/* id= */ 0, mContext)
+        hmp.showNotification(notifEntry)
+        assertThat(notifEntry.isSeenInShade).isFalse();
     }
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerFlagDisabledTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerFlagDisabledTest.kt
new file mode 100644
index 0000000..799e957
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerFlagDisabledTest.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.policy
+
+import android.app.IActivityManager
+import android.content.pm.PackageManager
+import android.media.projection.MediaProjectionManager
+import android.os.Handler
+import android.platform.test.annotations.DisableFlags
+import android.telephony.TelephonyManager
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.server.notification.Flags
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.log.logcatLogBuffer
+import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.settings.FakeGlobalSettings
+import com.android.systemui.util.time.FakeSystemClock
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@DisableFlags(Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING)
+class SensitiveNotificationProtectionControllerFlagDisabledTest : SysuiTestCase() {
+    private val logger = SensitiveNotificationProtectionControllerLogger(logcatLogBuffer())
+
+    @Mock private lateinit var handler: Handler
+    @Mock private lateinit var activityManager: IActivityManager
+    @Mock private lateinit var mediaProjectionManager: MediaProjectionManager
+    @Mock private lateinit var packageManager: PackageManager
+    @Mock private lateinit var telephonyManager: TelephonyManager
+    private lateinit var controller: SensitiveNotificationProtectionControllerImpl
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+
+        controller =
+            SensitiveNotificationProtectionControllerImpl(
+                mContext,
+                FakeGlobalSettings(),
+                mediaProjectionManager,
+                activityManager,
+                packageManager,
+                telephonyManager,
+                handler,
+                FakeExecutor(FakeSystemClock()),
+                logger
+            )
+    }
+
+    @Test
+    fun init_noRegisterMediaProjectionManagerCallback() {
+        verifyNoMoreInteractions(mediaProjectionManager)
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.kt
new file mode 100644
index 0000000..9abdf42
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.kt
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2017 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.systemui.statusbar.policy
+
+import android.app.NotificationManager
+import android.os.Handler
+import android.provider.Settings
+import android.service.notification.ZenModeConfig
+import android.testing.TestableLooper
+import android.testing.TestableLooper.RunWithLooper
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.broadcast.broadcastDispatcher
+import com.android.systemui.dump.dumpManager
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.settings.userTracker
+import com.android.systemui.testKosmos
+import com.android.systemui.util.settings.fakeGlobalSettings
+import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.atomic.AtomicBoolean
+import java.util.concurrent.atomic.AtomicInteger
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers
+import org.mockito.Mockito
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@RunWithLooper
+class ZenModeControllerImplTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+    private lateinit var testableLooper: TestableLooper
+    private lateinit var controller: ZenModeControllerImpl
+
+    private val globalSettings = kosmos.fakeGlobalSettings
+    private val config: ZenModeConfig = mock<ZenModeConfig>()
+    private val mNm: NotificationManager = mock<NotificationManager>()
+
+    @Before
+    fun setUp() {
+        testableLooper = TestableLooper.get(this)
+        mContext.addMockSystemService(NotificationManager::class.java, mNm)
+        whenever(mNm.zenModeConfig).thenReturn(config)
+
+        controller =
+            ZenModeControllerImpl(
+                mContext,
+                Handler.createAsync(testableLooper.looper),
+                kosmos.broadcastDispatcher,
+                kosmos.dumpManager,
+                globalSettings,
+                kosmos.userTracker,
+            )
+    }
+
+    @Test
+    fun testRemoveDuringCallback() {
+        val callback =
+            object : ZenModeController.Callback {
+                override fun onConfigChanged(config: ZenModeConfig) {
+                    controller.removeCallback(this)
+                }
+            }
+
+        controller.addCallback(callback)
+        val mockCallback = Mockito.mock(ZenModeController.Callback::class.java)
+        controller.addCallback(mockCallback)
+        controller.fireConfigChanged(config)
+        Mockito.verify(mockCallback).onConfigChanged(ArgumentMatchers.eq(config))
+    }
+
+    @Test
+    fun testAreNotificationsHiddenInShade_zenOffShadeSuppressed() {
+        config.suppressedVisualEffects =
+            NotificationManager.Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST
+        controller.updateZenMode(Settings.Global.ZEN_MODE_OFF)
+        controller.updateZenModeConfig()
+        assertThat(controller.areNotificationsHiddenInShade()).isFalse()
+    }
+
+    @Test
+    fun testAreNotificationsHiddenInShade_zenOnShadeNotSuppressed() {
+        val policy =
+            NotificationManager.Policy(
+                0,
+                0,
+                0,
+                NotificationManager.Policy.SUPPRESSED_EFFECT_STATUS_BAR,
+            )
+        whenever(mNm.consolidatedNotificationPolicy).thenReturn(policy)
+        controller.updateConsolidatedNotificationPolicy()
+        controller.updateZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS)
+        assertThat(controller.areNotificationsHiddenInShade()).isFalse()
+    }
+
+    @Test
+    fun testAreNotificationsHiddenInShade_zenOnShadeSuppressed() {
+        val policy =
+            NotificationManager.Policy(
+                0,
+                0,
+                0,
+                NotificationManager.Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST,
+            )
+        whenever(mNm.consolidatedNotificationPolicy).thenReturn(policy)
+        controller.updateConsolidatedNotificationPolicy()
+        controller.updateZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS)
+        assertThat(controller.areNotificationsHiddenInShade()).isTrue()
+    }
+
+    @Test
+    fun testModeChange() =
+        testScope.runTest {
+            val states =
+                listOf(
+                    Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
+                    Settings.Global.ZEN_MODE_NO_INTERRUPTIONS,
+                    Settings.Global.ZEN_MODE_ALARMS,
+                    Settings.Global.ZEN_MODE_ALARMS,
+                )
+
+            for (state in states) {
+                globalSettings.putInt(Settings.Global.ZEN_MODE, state)
+                testScope.runCurrent()
+                testableLooper.processAllMessages()
+                assertThat(controller.zen).isEqualTo(state)
+            }
+        }
+
+    @Test
+    fun testModeChange_callbackNotified() =
+        testScope.runTest {
+            val currentState = AtomicInteger(-1)
+
+            val callback: ZenModeController.Callback =
+                object : ZenModeController.Callback {
+                    override fun onZenChanged(zen: Int) {
+                        currentState.set(zen)
+                    }
+                }
+
+            controller.addCallback(callback)
+
+            val states =
+                listOf(
+                    Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
+                    Settings.Global.ZEN_MODE_NO_INTERRUPTIONS,
+                    Settings.Global.ZEN_MODE_ALARMS,
+                    Settings.Global.ZEN_MODE_ALARMS,
+                )
+
+            for (state in states) {
+                globalSettings.putInt(Settings.Global.ZEN_MODE, state)
+                testScope.runCurrent()
+                testableLooper.processAllMessages()
+                assertThat(currentState.get()).isEqualTo(state)
+            }
+        }
+
+    @Test
+    fun testCallbackRemovedWhileDispatching_doesntCrash() =
+        testScope.runTest {
+            val remove = AtomicBoolean(false)
+            globalSettings.putInt(Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_OFF)
+            testableLooper.processAllMessages()
+            val callback: ZenModeController.Callback =
+                object : ZenModeController.Callback {
+                    override fun onZenChanged(zen: Int) {
+                        if (remove.get()) {
+                            controller.removeCallback(this)
+                        }
+                    }
+                }
+            controller.addCallback(callback)
+            controller.addCallback(object : ZenModeController.Callback {})
+
+            remove.set(true)
+
+            globalSettings.putInt(
+                Settings.Global.ZEN_MODE,
+                Settings.Global.ZEN_MODE_NO_INTERRUPTIONS,
+            )
+            testScope.runCurrent()
+            testableLooper.processAllMessages()
+        }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt
index 0f6dc07..c5ccf9e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt
@@ -25,6 +25,7 @@
 import android.provider.Settings.Secure.ZEN_DURATION_FOREVER
 import android.provider.Settings.Secure.ZEN_DURATION_PROMPT
 import android.service.notification.SystemZenRules
+import android.service.notification.ZenPolicy.VISUAL_EFFECT_NOTIFICATION_LIST
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.internal.R
@@ -34,6 +35,7 @@
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.shared.settings.data.repository.secureSettingsRepository
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix
 import com.android.systemui.statusbar.policy.data.repository.fakeDeviceProvisioningRepository
 import com.android.systemui.statusbar.policy.data.repository.fakeZenModeRepository
 import com.android.systemui.testKosmos
@@ -379,4 +381,46 @@
 
             assertThat(dndMode!!.isActive).isTrue()
         }
+
+    @Test
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    fun modesHidingNotifications_onlyIncludesModesWithNotifListSuppression() =
+        testScope.runTest {
+            val modesHidingNotifications by collectLastValue(underTest.modesHidingNotifications)
+
+            zenModeRepository.addModes(
+                listOf(
+                    TestModeBuilder()
+                        .setName("Not active, no list suppression")
+                        .setActive(false)
+                        .setVisualEffect(VISUAL_EFFECT_NOTIFICATION_LIST, /* allowed= */ true)
+                        .build(),
+                    TestModeBuilder()
+                        .setName("Not active, has list suppression")
+                        .setActive(false)
+                        .setVisualEffect(VISUAL_EFFECT_NOTIFICATION_LIST, /* allowed= */ false)
+                        .build(),
+                    TestModeBuilder()
+                        .setName("No list suppression")
+                        .setActive(true)
+                        .setVisualEffect(VISUAL_EFFECT_NOTIFICATION_LIST, /* allowed= */ true)
+                        .build(),
+                    TestModeBuilder()
+                        .setName("Has list suppression 1")
+                        .setActive(true)
+                        .setVisualEffect(VISUAL_EFFECT_NOTIFICATION_LIST, /* allowed= */ false)
+                        .build(),
+                    TestModeBuilder()
+                        .setName("Has list suppression 2")
+                        .setActive(true)
+                        .setVisualEffect(VISUAL_EFFECT_NOTIFICATION_LIST, /* allowed= */ false)
+                        .build(),
+                )
+            )
+            runCurrent()
+
+            assertThat(modesHidingNotifications?.map { it.name })
+                .containsExactly("Has list suppression 1", "Has list suppression 2")
+                .inOrder()
+        }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModelTest.kt
index a0f6431..9d93a9c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModelTest.kt
@@ -61,7 +61,7 @@
             interactor,
             kosmos.testDispatcher,
             mockDialogDelegate,
-            mockDialogEventLogger
+            mockDialogEventLogger,
         )
 
     @Test
@@ -97,7 +97,7 @@
             assertThat(tiles?.size).isEqualTo(3)
             with(tiles?.elementAt(0)!!) {
                 assertThat(this.text).isEqualTo("Disabled by other")
-                assertThat(this.subtext).isEqualTo("Set up")
+                assertThat(this.subtext).isEqualTo("Not set")
                 assertThat(this.enabled).isEqualTo(false)
             }
             with(tiles?.elementAt(1)!!) {
@@ -323,10 +323,10 @@
             assertThat(tiles!!).hasSize(6)
             assertThat(tiles!![0].subtext).isEqualTo("When the going gets tough")
             assertThat(tiles!![1].subtext).isEqualTo("On • When in Rome")
-            assertThat(tiles!![2].subtext).isEqualTo("Set up")
+            assertThat(tiles!![2].subtext).isEqualTo("Not set")
             assertThat(tiles!![3].subtext).isEqualTo("Off")
             assertThat(tiles!![4].subtext).isEqualTo("On")
-            assertThat(tiles!![5].subtext).isEqualTo("Set up")
+            assertThat(tiles!![5].subtext).isEqualTo("Not set")
         }
 
     @Test
@@ -387,7 +387,7 @@
             }
             with(tiles?.elementAt(2)!!) {
                 assertThat(this.stateDescription).isEqualTo("Off")
-                assertThat(this.subtextDescription).isEqualTo("Set up")
+                assertThat(this.subtextDescription).isEqualTo("Not set")
             }
             with(tiles?.elementAt(3)!!) {
                 assertThat(this.stateDescription).isEqualTo("Off")
@@ -399,7 +399,7 @@
             }
             with(tiles?.elementAt(5)!!) {
                 assertThat(this.stateDescription).isEqualTo("Off")
-                assertThat(this.subtextDescription).isEqualTo("Set up")
+                assertThat(this.subtextDescription).isEqualTo("Not set")
             }
 
             // All tiles have the same long click info
@@ -451,7 +451,7 @@
                         .setName("Active without manual")
                         .setActive(true)
                         .setManualInvocationAllowed(false)
-                        .build(),
+                        .build()
                 )
             )
             runCurrent()
@@ -492,7 +492,7 @@
                         .setId("ID")
                         .setName("Disabled by other")
                         .setEnabled(false, /* byUser= */ false)
-                        .build(),
+                        .build()
                 )
             )
             runCurrent()
@@ -500,7 +500,7 @@
             assertThat(tiles?.size).isEqualTo(1)
             with(tiles?.elementAt(0)!!) {
                 assertThat(this.text).isEqualTo("Disabled by other")
-                assertThat(this.subtext).isEqualTo("Set up")
+                assertThat(this.subtext).isEqualTo("Not set")
                 assertThat(this.enabled).isEqualTo(false)
 
                 // Click the tile
@@ -519,7 +519,7 @@
             // Check that nothing happened to the tile
             with(tiles?.elementAt(0)!!) {
                 assertThat(this.text).isEqualTo("Disabled by other")
-                assertThat(this.subtext).isEqualTo("Set up")
+                assertThat(this.subtext).isEqualTo("Not set")
                 assertThat(this.enabled).isEqualTo(false)
             }
         }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureMonitorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureMonitorTest.kt
index 9064f7c..ba9fa92 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureMonitorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureMonitorTest.kt
@@ -20,9 +20,9 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.FINISHED
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.IN_PROGRESS
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NOT_STARTED
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.Finished
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NotStarted
 import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Companion.SWIPE_DISTANCE
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
@@ -32,28 +32,28 @@
 @RunWith(AndroidJUnit4::class)
 class BackGestureMonitorTest : SysuiTestCase() {
 
-    private var gestureState = NOT_STARTED
+    private var gestureState: GestureState = NotStarted
     private val gestureMonitor =
         BackGestureMonitor(
             gestureDistanceThresholdPx = SWIPE_DISTANCE.toInt(),
-            gestureStateChangedCallback = { gestureState = it }
+            gestureStateChangedCallback = { gestureState = it },
         )
 
     @Test
     fun triggersGestureFinishedForThreeFingerGestureRight() {
-        assertStateAfterEvents(events = ThreeFingerGesture.swipeRight(), expectedState = FINISHED)
+        assertStateAfterEvents(events = ThreeFingerGesture.swipeRight(), expectedState = Finished)
     }
 
     @Test
     fun triggersGestureFinishedForThreeFingerGestureLeft() {
-        assertStateAfterEvents(events = ThreeFingerGesture.swipeLeft(), expectedState = FINISHED)
+        assertStateAfterEvents(events = ThreeFingerGesture.swipeLeft(), expectedState = Finished)
     }
 
     @Test
     fun triggersGestureProgressForThreeFingerGestureStarted() {
         assertStateAfterEvents(
             events = ThreeFingerGesture.startEvents(x = 0f, y = 0f),
-            expectedState = IN_PROGRESS
+            expectedState = InProgress(),
         )
     }
 
@@ -61,24 +61,24 @@
     fun doesntTriggerGestureFinished_onGestureDistanceTooShort() {
         assertStateAfterEvents(
             events = ThreeFingerGesture.swipeLeft(distancePx = SWIPE_DISTANCE / 2),
-            expectedState = NOT_STARTED
+            expectedState = NotStarted,
         )
     }
 
     @Test
     fun doesntTriggerGestureFinished_onThreeFingersSwipeInOtherDirections() {
-        assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = NOT_STARTED)
-        assertStateAfterEvents(events = ThreeFingerGesture.swipeDown(), expectedState = NOT_STARTED)
+        assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = NotStarted)
+        assertStateAfterEvents(events = ThreeFingerGesture.swipeDown(), expectedState = NotStarted)
     }
 
     @Test
     fun doesntTriggerGestureFinished_onTwoFingersSwipe() {
-        assertStateAfterEvents(events = TwoFingerGesture.swipeRight(), expectedState = NOT_STARTED)
+        assertStateAfterEvents(events = TwoFingerGesture.swipeRight(), expectedState = NotStarted)
     }
 
     @Test
     fun doesntTriggerGestureFinished_onFourFingersSwipe() {
-        assertStateAfterEvents(events = FourFingerGesture.swipeRight(), expectedState = NOT_STARTED)
+        assertStateAfterEvents(events = FourFingerGesture.swipeRight(), expectedState = NotStarted)
     }
 
     private fun assertStateAfterEvents(events: List<MotionEvent>, expectedState: GestureState) {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureTest.kt
new file mode 100644
index 0000000..a83ed56
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureTest.kt
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2024 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.systemui.touchpad.tutorial.ui.gesture
+
+import android.view.MotionEvent
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Companion.SWIPE_DISTANCE
+import com.google.common.truth.Truth.assertThat
+import kotlin.math.cos
+import kotlin.math.sin
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class EasterEggGestureTest : SysuiTestCase() {
+
+    private data class Point(val x: Float, val y: Float)
+
+    private var triggered = false
+    private val handler =
+        TouchpadGestureHandler(
+            BackGestureMonitor(
+                gestureDistanceThresholdPx = SWIPE_DISTANCE.toInt(),
+                gestureStateChangedCallback = {},
+            ),
+            EasterEggGestureMonitor(callback = { triggered = true }),
+        )
+
+    @Test
+    fun easterEggTriggeredAfterThreeCircles() {
+        assertStateAfterTwoFingerGesture(
+            gesturePath = generateCircularGesturePoints(circlesCount = 3),
+            wasTriggered = true,
+        )
+    }
+
+    @Test
+    fun easterEggTriggeredAfterThreeImperfectCircles() {
+        assertStateAfterTwoFingerGesture(
+            gesturePath =
+                generateCircularGesturePoints(circlesCount = 3, radiusNoiseFraction = 0.2),
+            wasTriggered = true,
+        )
+    }
+
+    @Test
+    fun easterEggTriggeredAfterFiveCircles() {
+        assertStateAfterTwoFingerGesture(
+            gesturePath = generateCircularGesturePoints(circlesCount = 5),
+            wasTriggered = true,
+        )
+    }
+
+    @Test
+    fun easterEggNotTriggeredAfterTwoCircles() {
+        assertStateAfterTwoFingerGesture(
+            gesturePath = generateCircularGesturePoints(circlesCount = 2),
+            wasTriggered = false,
+        )
+    }
+
+    @Test
+    fun easterEggNotTriggeredAfterVariousSwipes() {
+        val allSwipeGestures =
+            listOf(
+                // two finger gestures
+                TwoFingerGesture.swipeUp(),
+                TwoFingerGesture.swipeDown(),
+                TwoFingerGesture.swipeLeft(),
+                TwoFingerGesture.swipeRight(),
+                // three finger gestures
+                ThreeFingerGesture.swipeUp(),
+                ThreeFingerGesture.swipeDown(),
+                ThreeFingerGesture.swipeLeft(),
+                ThreeFingerGesture.swipeRight(),
+                // four finger gestures
+                FourFingerGesture.swipeUp(),
+                FourFingerGesture.swipeDown(),
+                FourFingerGesture.swipeLeft(),
+                FourFingerGesture.swipeRight(),
+            )
+        allSwipeGestures.forEach { gesture ->
+            assertStateAfterEvents(events = gesture, wasTriggered = false)
+        }
+    }
+
+    private fun assertStateAfterEvents(events: List<MotionEvent>, wasTriggered: Boolean) {
+        events.forEach { handler.onMotionEvent(it) }
+        assertThat(triggered).isEqualTo(wasTriggered)
+    }
+
+    private fun assertStateAfterTwoFingerGesture(gesturePath: List<Point>, wasTriggered: Boolean) {
+        val events = TwoFingerGesture.createEvents { gesturePath.forEach { (x, y) -> move(x, y) } }
+        assertStateAfterEvents(events = events, wasTriggered = wasTriggered)
+    }
+
+    /**
+     * Generates list of points that would make up clockwise circular motion with given [radius].
+     * [circlesCount] determines how many full circles gesture should perform. [radiusNoiseFraction]
+     * can introduce noise to mimic real-world gesture which is not perfect - shape will be still
+     * circular but radius at any given point can be deviate from given radius by
+     * [radiusNoiseFraction].
+     */
+    private fun generateCircularGesturePoints(
+        circlesCount: Int,
+        radiusNoiseFraction: Double? = null,
+        radius: Float = 100f,
+    ): List<Point> {
+        val pointsPerCircle = 50
+        val angleStep = 360 / pointsPerCircle
+        val angleBuffer = 20 // buffer to make sure we're doing a bit more than 360 degree
+        val totalAngle = circlesCount * (360 + angleBuffer)
+        // Because all gestures in tests should start at (DEFAULT_X, DEFAULT_Y) we need to shift
+        // circle center x coordinate by radius
+        val centerX = -radius
+        val centerY = 0f
+
+        val events = mutableListOf<Point>()
+        val randomNoise: (Double) -> Double =
+            if (radiusNoiseFraction == null) {
+                { 0.0 }
+            } else {
+                { radianAngle -> sin(radianAngle * 2) * radiusNoiseFraction }
+            }
+
+        var currentAngle = 0f
+        // as cos(0) == 1 and sin(0) == 0 we start gesture at position of (radius, 0) and go
+        // clockwise - first Y increases and X decreases
+        while (currentAngle < totalAngle) {
+            val radianAngle = Math.toRadians(currentAngle.toDouble())
+            val radiusWithNoise = radius * (1 + randomNoise(radianAngle).toFloat())
+            val x = centerX + radiusWithNoise * cos(radianAngle).toFloat()
+            val y = centerY + radiusWithNoise * sin(radianAngle).toFloat()
+            events.add(Point(x, y))
+            currentAngle += angleStep
+        }
+        return events
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureMonitorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureMonitorTest.kt
index 6aefbe9..59cc026 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureMonitorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureMonitorTest.kt
@@ -20,9 +20,9 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.FINISHED
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.IN_PROGRESS
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NOT_STARTED
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.Finished
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NotStarted
 import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Companion.SWIPE_DISTANCE
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
@@ -32,23 +32,23 @@
 @RunWith(AndroidJUnit4::class)
 class HomeGestureMonitorTest : SysuiTestCase() {
 
-    private var gestureState = NOT_STARTED
+    private var gestureState: GestureState = GestureState.NotStarted
     private val gestureMonitor =
         HomeGestureMonitor(
             gestureDistanceThresholdPx = SWIPE_DISTANCE.toInt(),
-            gestureStateChangedCallback = { gestureState = it }
+            gestureStateChangedCallback = { gestureState = it },
         )
 
     @Test
     fun triggersGestureFinishedForThreeFingerGestureUp() {
-        assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = FINISHED)
+        assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = Finished)
     }
 
     @Test
     fun triggersGestureProgressForThreeFingerGestureStarted() {
         assertStateAfterEvents(
             events = ThreeFingerGesture.startEvents(x = 0f, y = 0f),
-            expectedState = IN_PROGRESS
+            expectedState = InProgress(),
         )
     }
 
@@ -56,28 +56,25 @@
     fun doesntTriggerGestureFinished_onGestureDistanceTooShort() {
         assertStateAfterEvents(
             events = ThreeFingerGesture.swipeUp(distancePx = SWIPE_DISTANCE / 2),
-            expectedState = NOT_STARTED
+            expectedState = NotStarted,
         )
     }
 
     @Test
     fun doesntTriggerGestureFinished_onThreeFingersSwipeInOtherDirections() {
-        assertStateAfterEvents(events = ThreeFingerGesture.swipeDown(), expectedState = NOT_STARTED)
-        assertStateAfterEvents(events = ThreeFingerGesture.swipeLeft(), expectedState = NOT_STARTED)
-        assertStateAfterEvents(
-            events = ThreeFingerGesture.swipeRight(),
-            expectedState = NOT_STARTED
-        )
+        assertStateAfterEvents(events = ThreeFingerGesture.swipeDown(), expectedState = NotStarted)
+        assertStateAfterEvents(events = ThreeFingerGesture.swipeLeft(), expectedState = NotStarted)
+        assertStateAfterEvents(events = ThreeFingerGesture.swipeRight(), expectedState = NotStarted)
     }
 
     @Test
     fun doesntTriggerGestureFinished_onTwoFingersSwipe() {
-        assertStateAfterEvents(events = TwoFingerGesture.swipeUp(), expectedState = NOT_STARTED)
+        assertStateAfterEvents(events = TwoFingerGesture.swipeUp(), expectedState = NotStarted)
     }
 
     @Test
     fun doesntTriggerGestureFinished_onFourFingersSwipe() {
-        assertStateAfterEvents(events = FourFingerGesture.swipeUp(), expectedState = NOT_STARTED)
+        assertStateAfterEvents(events = FourFingerGesture.swipeUp(), expectedState = NotStarted)
     }
 
     private fun assertStateAfterEvents(events: List<MotionEvent>, expectedState: GestureState) {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitorTest.kt
index d059c14..7eac6bb 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitorTest.kt
@@ -21,9 +21,9 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.FINISHED
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.IN_PROGRESS
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NOT_STARTED
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.Finished
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NotStarted
 import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Companion.SWIPE_DISTANCE
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
@@ -43,7 +43,7 @@
         const val FAST = THRESHOLD_VELOCITY_PX_PER_MS * 1000 + 1
     }
 
-    private var gestureState = NOT_STARTED
+    private var gestureState: GestureState = GestureState.NotStarted
     private val velocityTracker =
         mock<VelocityTracker1D> {
             // by default return correct speed for the gesture - as if pointer is slowing down
@@ -54,25 +54,25 @@
             gestureDistanceThresholdPx = SWIPE_DISTANCE.toInt(),
             gestureStateChangedCallback = { gestureState = it },
             velocityThresholdPxPerMs = THRESHOLD_VELOCITY_PX_PER_MS,
-            velocityTracker = velocityTracker
+            velocityTracker = velocityTracker,
         )
 
     @Test
     fun triggersGestureFinishedForThreeFingerGestureUp() {
-        assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = FINISHED)
+        assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = Finished)
     }
 
     @Test
     fun doesntTriggerGestureFinished_onGestureSpeedTooHigh() {
         whenever(velocityTracker.calculateVelocity()).thenReturn(FAST)
-        assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = NOT_STARTED)
+        assertStateAfterEvents(events = ThreeFingerGesture.swipeUp(), expectedState = NotStarted)
     }
 
     @Test
     fun triggersGestureProgressForThreeFingerGestureStarted() {
         assertStateAfterEvents(
             events = ThreeFingerGesture.startEvents(x = 0f, y = 0f),
-            expectedState = IN_PROGRESS
+            expectedState = InProgress(),
         )
     }
 
@@ -80,28 +80,25 @@
     fun doesntTriggerGestureFinished_onGestureDistanceTooShort() {
         assertStateAfterEvents(
             events = ThreeFingerGesture.swipeUp(distancePx = SWIPE_DISTANCE / 2),
-            expectedState = NOT_STARTED
+            expectedState = NotStarted,
         )
     }
 
     @Test
     fun doesntTriggerGestureFinished_onThreeFingersSwipeInOtherDirections() {
-        assertStateAfterEvents(events = ThreeFingerGesture.swipeDown(), expectedState = NOT_STARTED)
-        assertStateAfterEvents(events = ThreeFingerGesture.swipeLeft(), expectedState = NOT_STARTED)
-        assertStateAfterEvents(
-            events = ThreeFingerGesture.swipeRight(),
-            expectedState = NOT_STARTED
-        )
+        assertStateAfterEvents(events = ThreeFingerGesture.swipeDown(), expectedState = NotStarted)
+        assertStateAfterEvents(events = ThreeFingerGesture.swipeLeft(), expectedState = NotStarted)
+        assertStateAfterEvents(events = ThreeFingerGesture.swipeRight(), expectedState = NotStarted)
     }
 
     @Test
     fun doesntTriggerGestureFinished_onTwoFingersSwipe() {
-        assertStateAfterEvents(events = TwoFingerGesture.swipeUp(), expectedState = NOT_STARTED)
+        assertStateAfterEvents(events = TwoFingerGesture.swipeUp(), expectedState = NotStarted)
     }
 
     @Test
     fun doesntTriggerGestureFinished_onFourFingersSwipe() {
-        assertStateAfterEvents(events = FourFingerGesture.swipeUp(), expectedState = NOT_STARTED)
+        assertStateAfterEvents(events = FourFingerGesture.swipeUp(), expectedState = NotStarted)
     }
 
     private fun assertStateAfterEvents(events: List<MotionEvent>, expectedState: GestureState) {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureHandlerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureHandlerTest.kt
index 3a01d4f..4d26366 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureHandlerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureHandlerTest.kt
@@ -25,8 +25,6 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.FINISHED
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NOT_STARTED
 import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Companion.SWIPE_DISTANCE
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
@@ -36,13 +34,14 @@
 @RunWith(AndroidJUnit4::class)
 class TouchpadGestureHandlerTest : SysuiTestCase() {
 
-    private var gestureState = NOT_STARTED
+    private var gestureState: GestureState = GestureState.NotStarted
     private val handler =
         TouchpadGestureHandler(
             BackGestureMonitor(
                 gestureDistanceThresholdPx = SWIPE_DISTANCE.toInt(),
-                gestureStateChangedCallback = { gestureState = it }
-            )
+                gestureStateChangedCallback = { gestureState = it },
+            ),
+            EasterEggGestureMonitor {},
         )
 
     @Test
@@ -81,7 +80,7 @@
     fun triggersGestureDoneForThreeFingerGesture() {
         backGestureEvents().forEach { handler.onMotionEvent(it) }
 
-        assertThat(gestureState).isEqualTo(FINISHED)
+        assertThat(gestureState).isEqualTo(GestureState.Finished)
     }
 
     private fun backGestureEvents(): List<MotionEvent> {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogVisibilityInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogVisibilityInteractorTest.kt
new file mode 100644
index 0000000..7ce421a
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogVisibilityInteractorTest.kt
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.domain.interactor
+
+import android.app.ActivityManager
+import android.testing.TestableLooper
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.plugins.fakeVolumeDialogController
+import com.android.systemui.testKosmos
+import com.android.systemui.volume.Events
+import com.android.systemui.volume.dialog.domain.model.VolumeDialogVisibilityModel
+import com.google.common.truth.Truth.assertThat
+import kotlin.time.Duration.Companion.days
+import kotlin.time.Duration.Companion.seconds
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.advanceTimeBy
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+private val dialogTimeoutDuration = 3.seconds
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@TestableLooper.RunWithLooper()
+class VolumeDialogVisibilityInteractorTest : SysuiTestCase() {
+
+    private val kosmos: Kosmos = testKosmos()
+
+    private lateinit var underTest: VolumeDialogVisibilityInteractor
+
+    @Before
+    fun setUp() {
+        underTest = kosmos.volumeDialogVisibilityInteractor
+    }
+
+    @Test
+    fun testShowRequest_visible() =
+        with(kosmos) {
+            testScope.runTest {
+                runCurrent()
+                val visibilityModel by collectLastValue(underTest.dialogVisibility)
+                fakeVolumeDialogController.onShowRequested(
+                    Events.SHOW_REASON_VOLUME_CHANGED,
+                    false,
+                    ActivityManager.LOCK_TASK_MODE_LOCKED,
+                )
+                runCurrent()
+
+                assertThat(visibilityModel!!)
+                    .isEqualTo(
+                        VolumeDialogVisibilityModel.Visible(
+                            Events.SHOW_REASON_VOLUME_CHANGED,
+                            false,
+                            ActivityManager.LOCK_TASK_MODE_LOCKED,
+                        )
+                    )
+            }
+        }
+
+    @Test
+    fun testDismissRequest_dismissed() =
+        with(kosmos) {
+            testScope.runTest {
+                runCurrent()
+                val visibilityModel by collectLastValue(underTest.dialogVisibility)
+                fakeVolumeDialogController.onShowRequested(
+                    Events.SHOW_REASON_VOLUME_CHANGED,
+                    false,
+                    ActivityManager.LOCK_TASK_MODE_LOCKED,
+                )
+                runCurrent()
+
+                fakeVolumeDialogController.onDismissRequested(Events.DISMISS_REASON_SCREEN_OFF)
+
+                assertThat(visibilityModel!!)
+                    .isEqualTo(
+                        VolumeDialogVisibilityModel.Dismissed(Events.DISMISS_REASON_SCREEN_OFF)
+                    )
+            }
+        }
+
+    @Test
+    fun testTimeout_dismissed() =
+        with(kosmos) {
+            testScope.runTest {
+                runCurrent()
+                underTest.resetDismissTimeout()
+                val visibilityModel by collectLastValue(underTest.dialogVisibility)
+                fakeVolumeDialogController.onShowRequested(
+                    Events.SHOW_REASON_VOLUME_CHANGED,
+                    false,
+                    ActivityManager.LOCK_TASK_MODE_LOCKED,
+                )
+                runCurrent()
+
+                advanceTimeBy(1.days)
+
+                assertThat(visibilityModel!!)
+                    .isEqualTo(VolumeDialogVisibilityModel.Dismissed(Events.DISMISS_REASON_TIMEOUT))
+            }
+        }
+
+    @Test
+    fun testResetTimeoutInterruptsEvents() =
+        with(kosmos) {
+            testScope.runTest {
+                runCurrent()
+                underTest.resetDismissTimeout()
+                val visibilityModel by collectLastValue(underTest.dialogVisibility)
+                fakeVolumeDialogController.onShowRequested(
+                    Events.SHOW_REASON_VOLUME_CHANGED,
+                    false,
+                    ActivityManager.LOCK_TASK_MODE_LOCKED,
+                )
+                runCurrent()
+
+                advanceTimeBy(dialogTimeoutDuration / 2)
+                underTest.resetDismissTimeout()
+                advanceTimeBy(dialogTimeoutDuration / 2)
+                underTest.resetDismissTimeout()
+                advanceTimeBy(dialogTimeoutDuration / 2)
+
+                assertThat(visibilityModel)
+                    .isInstanceOf(VolumeDialogVisibilityModel.Visible::class.java)
+            }
+        }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/wmshell/WMShellTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/wmshell/WMShellTest.kt
index e1be6b0..d2688a8 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/wmshell/WMShellTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/wmshell/WMShellTest.kt
@@ -53,7 +53,7 @@
 import com.android.systemui.user.data.repository.fakeUserRepository
 import com.android.systemui.util.kotlin.JavaAdapter
 import com.android.wm.shell.desktopmode.DesktopMode
-import com.android.wm.shell.desktopmode.DesktopModeTaskRepository.VisibleTasksListener
+import com.android.wm.shell.desktopmode.DesktopRepository.VisibleTasksListener
 import com.android.wm.shell.onehanded.OneHanded
 import com.android.wm.shell.onehanded.OneHandedEventCallback
 import com.android.wm.shell.onehanded.OneHandedTransitionCallback
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
index be44dee..73626b4 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
@@ -184,7 +184,10 @@
             }
         }
 
-        /** Get the text for secondaryLabel. */
+        /**
+         *  If the current secondaryLabel value is not empty, ignore the given input and return
+         *  the current value. Otherwise return current value.
+         */
         public CharSequence getSecondaryLabel(CharSequence stateText) {
             // Use a local reference as the value might change from other threads
             CharSequence localSecondaryLabel = secondaryLabel;
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index fcb3a3e..042067b 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -20,7 +20,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"‏اپنا PIN درج کریں"</string>
+    <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"‏‫اپنا PIN درج کریں"</string>
     <string name="keyguard_enter_pin" msgid="8114529922480276834">"‏PIN درج کریں"</string>
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"اپنا پیٹرن درج کریں"</string>
     <string name="keyguard_enter_pattern" msgid="7616595160901084119">"پیٹرن ڈرا کریں"</string>
diff --git a/packages/SystemUI/res/drawable/contextual_edu_all_apps.xml b/packages/SystemUI/res/drawable/contextual_edu_all_apps.xml
new file mode 100644
index 0000000..263e11c
--- /dev/null
+++ b/packages/SystemUI/res/drawable/contextual_edu_all_apps.xml
@@ -0,0 +1,25 @@
+<!--
+  ~ Copyright 2024 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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="32dp"
+    android:height="32dp"
+    android:viewportHeight="32"
+    android:viewportWidth="32">
+    <path
+        android:fillColor="#001E2D"
+        android:pathData="M28.6 30.3l-4.1-4a5.2 5.2 0 0 1-2.7 0.7a5.2 5.2 0 0 1-5.3-5.3a5 5 0 0 1 1.5-3.6q1.6-1.6 3.8-1.6a5 5 0 0 1 3.7 1.6a5 5 0 0 1 1.3 5.1q-0.2 0.9-0.6 1.3l4.1 4l-1.7 1.8zm-21.7-3.3a5 5 0 0 1-3.7-1.5a5 5 0 0 1-1.5-3.7a5 5 0 0 1 1.5-3.7a5 5 0 0 1 3.7-1.6a5 5 0 0 1 3.8 1.6a5 5 0 0 1 1.5 3.7a5 5 0 0 1-1.5 3.7a5 5 0 0 1-3.8 1.5zm14.9-2.3q1 0 2-0.8q0.8-1 0.8-2q0-1.2-0.8-2t-2-0.8q-1.3 0-2 0.8q-0.9 0.8-0.9 2q0 1.1 0.9 2q0.8 0.8 2 0.8zm-14.9-12.5a5 5 0 0 1-3.7-1.5q-1.5-1.5-1.5-3.7a5 5 0 0 1 1.5-3.7a5 5 0 0 1 3.7-1.6a5 5 0 0 1 3.8 1.6a5 5 0 0 1 1.5 3.7q0 2.2-1.5 3.7a5 5 0 0 1-3.8 1.5zm14.9 0a5.2 5.2 0 0 1-5.3-5.3a5 5 0 0 1 1.5-3.6q1.6-1.6 3.8-1.6a5 5 0 0 1 3.7 1.6a5 5 0 0 1 1.5 3.7q0 2.2-1.5 3.7a5 5 0 0 1-3.7 1.5z" />
+</vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/contextual_edu_dialog_bg.xml b/packages/SystemUI/res/drawable/contextual_edu_dialog_bg.xml
new file mode 100644
index 0000000..d7000d7
--- /dev/null
+++ b/packages/SystemUI/res/drawable/contextual_edu_dialog_bg.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright 2024 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.
+  -->
+<!-- Setting insetBottom to avoid bottom elevation of dialog being clipped off -->
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:insetBottom="@dimen/contextual_edu_dialog_elevation">
+    <shape>
+        <corners android:radius="28dp" />
+        <solid android:color="?androidprv:attr/materialColorTertiaryFixed" />
+    </shape>
+</inset>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/contextual_edu_swipe_back.xml b/packages/SystemUI/res/drawable/contextual_edu_swipe_back.xml
new file mode 100644
index 0000000..8b0142c
--- /dev/null
+++ b/packages/SystemUI/res/drawable/contextual_edu_swipe_back.xml
@@ -0,0 +1,25 @@
+<!--
+  ~ Copyright 2024 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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="28dp"
+    android:height="32dp"
+    android:viewportHeight="32"
+    android:viewportWidth="28">
+  <path
+      android:fillColor="#001E2D"
+      android:pathData="M27.3 9.8h-6.4v-1.8h4a17.4 17.4 0 0 0-5.1-3.1a15.2 15.2 0 0 0-5.8-1.1c-2 0-4 0.4-5.9 1.1a17.6 17.6 0 0 0-5.1 3.1h4v1.8h-6.4v-6.4h1.8l0 2.8a18.6 18.6 0 0 1 11.6-4.2a18.5 18.5 0 0 1 11.6 4.2v-2.8h1.8l0 6.4zm-13.6 20.2c-0.5 0-1-0.1-1.5-0.3s-0.9-0.5-1.3-0.9l-6.8-6.9l0.8-0.9a2.4 2.4 0 0 1 2.5-0.7l2.5 0.7v-11c0-0.3 0.1-0.6 0.3-0.9c0.3-0.3 0.6-0.4 0.9-0.4s0.6 0.1 0.8 0.4c0.2 0.2 0.4 0.5 0.4 0.9v9.4h1.6v-4.3c0-0.3 0.1-0.6 0.3-0.8s0.5-0.4 0.9-0.4s0.6 0.1 0.9 0.4c0.2 0.2 0.4 0.5 0.4 0.8v4.3h1.6v-3c0-0.3 0.1-0.6 0.3-0.8s0.5-0.4 0.9-0.4c0.3 0 0.6 0.1 0.9 0.4c0.3 0.2 0.4 0.5 0.4 0.8v3h1.6v-0.3c0-0.3 0.1-0.6 0.3-0.8s0.5-0.4 0.9-0.4s0.7 0.1 0.9 0.4c0.2 0.2 0.4 0.5 0.4 0.8v5.6c0 1.5-0.5 2.7-1.6 3.8a5.1 5.1 0 0 1-3.8 1.6h-5.6z" />
+</vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/contextual_edu_swipe_up.xml b/packages/SystemUI/res/drawable/contextual_edu_swipe_up.xml
new file mode 100644
index 0000000..294b626
--- /dev/null
+++ b/packages/SystemUI/res/drawable/contextual_edu_swipe_up.xml
@@ -0,0 +1,28 @@
+<!--
+  ~ Copyright 2024 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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="32dp"
+    android:height="32dp"
+    android:viewportHeight="32"
+    android:viewportWidth="32">
+    <group>
+        <clip-path android:pathData="M0,0h32v32H0z" />
+        <path
+            android:fillColor="#001E2D"
+            android:pathData="M21.8 27.1a3.5 3.5 0 0 1-3-0.1l-8.8-4.1l0.5-1.2c0.2-0.4 0.5-0.8 0.8-1c0.4-0.3 0.8-0.5 1.3-0.5l2.6-0.2l-3.8-10.4a1.1 1.1 0 0 1 0-0.9c0.2-0.3 0.4-0.5 0.7-0.6s0.6-0.1 0.9 0s0.5 0.4 0.6 0.7l3.2 8.9l1.5-0.6l-1.5-4.1a1.1 1.1 0 0 1 0-0.9c0.2-0.3 0.4-0.5 0.7-0.6s0.6-0.1 0.9 0s0.5 0.4 0.6 0.7l1.5 4.1l1.5-0.6l-1-2.8a1.1 1.1 0 0 1 0-0.9c0.2-0.3 0.4-0.5 0.7-0.6s0.7-0.1 0.9 0c0.3 0.1 0.5 0.4 0.6 0.7l1 2.8l1.6-0.6l-0.1-0.3a1.1 1.1 0 0 1 0-0.9c0.2-0.3 0.4-0.5 0.7-0.7c0.3-0.1 0.6-0.1 0.9 0.1c0.3 0.1 0.5 0.4 0.6 0.7l1.9 5.2c0.5 1.4 0.5 2.8-0.2 4.1a5.1 5.1 0 0 1-3 2.7l-5.3 1.9zm-13.8-9.4a15.5 15.5 0 0 1-3.4-9.8a17.8 17.8 0 0 1 0.4-3.8l-2.4 2.4l-1.3-1.2l4.5-4.5l4.5 4.5l-1.2 1.2l-2.3-2.3c-0.2 0.6-0.3 1.2-0.4 1.8a14.1 14.1 0 0 0 0.6 6.4a13.5 13.5 0 0 0 2.2 4l-1.3 1.3z" />
+    </group>
+</vector>
diff --git a/packages/SystemUI/res/drawable/touchpad_tutorial_home_icon.xml b/packages/SystemUI/res/drawable/touchpad_tutorial_home_icon.xml
new file mode 100644
index 0000000..9f3d075
--- /dev/null
+++ b/packages/SystemUI/res/drawable/touchpad_tutorial_home_icon.xml
@@ -0,0 +1,26 @@
+<!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:tint="?attr/colorControlNormal"
+    android:viewportHeight="960"
+    android:viewportWidth="960">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M240,760L360,760L360,520L600,520L600,760L720,760L720,400L480,220L240,400L240,760ZM160,840L160,360L480,120L800,360L800,840L520,840L520,600L440,600L440,840L160,840ZM480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490Z" />
+</vector>
diff --git a/packages/SystemUI/res/drawable/touchpad_tutorial_recents_icon.xml b/packages/SystemUI/res/drawable/touchpad_tutorial_recents_icon.xml
new file mode 100644
index 0000000..113908a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/touchpad_tutorial_recents_icon.xml
@@ -0,0 +1,27 @@
+<!--
+  ~ Copyright (C) 2024 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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:autoMirrored="true"
+    android:tint="?attr/colorControlNormal"
+    android:viewportHeight="960"
+    android:viewportWidth="960">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M120,800Q87,800 63.5,776.5Q40,753 40,720L40,240Q40,207 63.5,183.5Q87,160 120,160L200,160Q233,160 256.5,183.5Q280,207 280,240L280,720Q280,753 256.5,776.5Q233,800 200,800L120,800ZM120,721L200,721Q200,721 200,721Q200,721 200,721L200,239Q200,239 200,239Q200,239 200,239L120,239Q120,239 120,239Q120,239 120,239L120,721Q120,721 120,721Q120,721 120,721ZM440,800Q407,800 383.5,776.5Q360,753 360,720L360,240Q360,207 383.5,183.5Q407,160 440,160L840,160Q873,160 896.5,183.5Q920,207 920,240L920,720Q920,753 896.5,776.5Q873,800 840,800L440,800ZM440,721L840,721Q840,721 840,721Q840,721 840,721L840,239Q840,239 840,239Q840,239 840,239L440,239Q440,239 440,239Q440,239 440,239L440,721Q440,721 440,721Q440,721 440,721ZM200,721Q200,721 200,721Q200,721 200,721L200,239Q200,239 200,239Q200,239 200,239L200,239Q200,239 200,239Q200,239 200,239L200,721Q200,721 200,721Q200,721 200,721ZM440,721Q440,721 440,721Q440,721 440,721L440,239Q440,239 440,239Q440,239 440,239L440,239Q440,239 440,239Q440,239 440,239L440,721Q440,721 440,721Q440,721 440,721Z" />
+</vector>
diff --git a/packages/SystemUI/res/layout/biometric_prompt_one_pane_layout.xml b/packages/SystemUI/res/layout/biometric_prompt_one_pane_layout.xml
index 3b3ed39..91cd019 100644
--- a/packages/SystemUI/res/layout/biometric_prompt_one_pane_layout.xml
+++ b/packages/SystemUI/res/layout/biometric_prompt_one_pane_layout.xml
@@ -215,17 +215,4 @@
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintVertical_bias="1.0"
         tools:srcCompat="@tools:sample/avatars" />
-
-    <com.android.systemui.biometrics.BiometricPromptLottieViewWrapper
-        android:id="@+id/biometric_icon_overlay"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:layout_gravity="center"
-        android:contentDescription="@null"
-        android:scaleType="fitXY"
-        android:importantForAccessibility="no"
-        app:layout_constraintBottom_toBottomOf="@+id/biometric_icon"
-        app:layout_constraintEnd_toEndOf="@+id/biometric_icon"
-        app:layout_constraintStart_toStartOf="@+id/biometric_icon"
-        app:layout_constraintTop_toTopOf="@+id/biometric_icon" />
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/packages/SystemUI/res/layout/biometric_prompt_two_pane_layout.xml b/packages/SystemUI/res/layout/biometric_prompt_two_pane_layout.xml
index 2a00495..51117a7 100644
--- a/packages/SystemUI/res/layout/biometric_prompt_two_pane_layout.xml
+++ b/packages/SystemUI/res/layout/biometric_prompt_two_pane_layout.xml
@@ -40,19 +40,6 @@
         app:layout_constraintTop_toTopOf="parent"
         tools:srcCompat="@tools:sample/avatars" />
 
-    <com.android.systemui.biometrics.BiometricPromptLottieViewWrapper
-        android:id="@+id/biometric_icon_overlay"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:layout_gravity="center"
-        android:contentDescription="@null"
-        android:scaleType="fitXY"
-        android:importantForAccessibility="no"
-        app:layout_constraintBottom_toBottomOf="@+id/biometric_icon"
-        app:layout_constraintEnd_toEndOf="@+id/biometric_icon"
-        app:layout_constraintStart_toStartOf="@+id/biometric_icon"
-        app:layout_constraintTop_toTopOf="@+id/biometric_icon" />
-
     <ScrollView
         android:id="@+id/scrollView"
         android:layout_width="0dp"
diff --git a/packages/SystemUI/res/layout/contextual_edu_dialog.xml b/packages/SystemUI/res/layout/contextual_edu_dialog.xml
new file mode 100644
index 0000000..ee42b23
--- /dev/null
+++ b/packages/SystemUI/res/layout/contextual_edu_dialog.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright 2024 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.
+  -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@drawable/contextual_edu_dialog_bg"
+    android:elevation="@dimen/contextual_edu_dialog_elevation"
+    android:gravity="center_vertical"
+    android:orientation="horizontal"
+    android:padding="12dp">
+
+    <ImageView
+        android:id="@+id/edu_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:contentDescription="@null"
+        android:importantForAccessibility="no"
+        android:paddingRight="16dp" />
+
+    <TextView
+        android:id="@+id/edu_message"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:background="@color/transparent"
+        android:ellipsize="end"
+        android:fontFamily="google-sans-medium"
+        android:maxWidth="280dp"
+        android:textColor="?androidprv:attr/materialColorOnTertiaryFixed"
+        android:textSize="14sp"
+        android:textStyle="bold" />
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/notification_template_en_route_contracted.xml b/packages/SystemUI/res/layout/notification_template_en_route_contracted.xml
deleted file mode 100644
index e7a40d1..0000000
--- a/packages/SystemUI/res/layout/notification_template_en_route_contracted.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  ~ Copyright (C) 2024 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.
-  -->
-
-<com.android.systemui.statusbar.notification.row.ui.view.EnRouteView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@*android:id/status_bar_latest_event_content"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_weight="1"
-    android:minHeight="@*android:dimen/notification_headerless_min_height"
-    android:tag="enroute"
-    >
-
-    <include layout="@*android:layout/notification_template_material_base" />
-
-</com.android.systemui.statusbar.notification.row.ui.view.EnRouteView>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/notification_template_en_route_expanded.xml b/packages/SystemUI/res/layout/notification_template_en_route_expanded.xml
deleted file mode 100644
index ca6d66a..0000000
--- a/packages/SystemUI/res/layout/notification_template_en_route_expanded.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  ~ Copyright (C) 2014 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
-  -->
-<com.android.systemui.statusbar.notification.row.ui.view.EnRouteView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@*android:id/status_bar_latest_event_content"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
-    android:clipChildren="false"
-    android:tag="big"
-    >
-
-    <LinearLayout
-        android:id="@*android:id/notification_action_list_margin_target"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="@*android:dimen/notification_content_margin"
-        android:orientation="vertical"
-        >
-
-        <FrameLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:layout_gravity="top"
-            >
-
-            <include layout="@*android:layout/notification_template_header" />
-
-            <LinearLayout
-                android:id="@*android:id/notification_main_column"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginStart="@*android:dimen/notification_content_margin_start"
-                android:layout_marginEnd="@*android:dimen/notification_content_margin_end"
-                android:layout_marginTop="@*android:dimen/notification_content_margin_top"
-                android:orientation="vertical"
-                >
-
-                <include layout="@*android:layout/notification_template_part_line1" />
-
-                <include layout="@*android:layout/notification_template_text_multiline" />
-
-                <include
-                    android:layout_width="match_parent"
-                    android:layout_height="@*android:dimen/notification_progress_bar_height"
-                    android:layout_marginTop="@*android:dimen/notification_progress_margin_top"
-                    layout="@*android:layout/notification_template_progress"
-                    />
-            </LinearLayout>
-
-            <include layout="@*android:layout/notification_template_right_icon" />
-        </FrameLayout>
-
-        <ViewStub
-            android:layout="@*android:layout/notification_material_reply_text"
-            android:id="@*android:id/notification_material_reply_container"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            />
-
-        <include
-            layout="@*android:layout/notification_template_smart_reply_container"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="@*android:dimen/notification_content_margin_start"
-            android:layout_marginEnd="@*android:dimen/notification_content_margin_end"
-            android:layout_marginTop="@*android:dimen/notification_content_margin"
-            />
-
-        <include layout="@*android:layout/notification_material_action_list" />
-    </LinearLayout>
-</com.android.systemui.statusbar.notification.row.ui.view.EnRouteView>
diff --git a/packages/SystemUI/res/layout/rich_ongoing_timer_notification.xml b/packages/SystemUI/res/layout/rich_ongoing_timer_notification.xml
deleted file mode 100644
index 3a679e3..0000000
--- a/packages/SystemUI/res/layout/rich_ongoing_timer_notification.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2024 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
-  -->
-<com.android.systemui.statusbar.notification.row.ui.view.TimerView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
-
-    <androidx.constraintlayout.widget.Guideline
-        android:id="@+id/topBaseline"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        app:layout_constraintGuide_begin="22sp"
-        />
-
-    <ImageView
-        android:id="@+id/icon"
-        android:layout_width="24dp"
-        android:layout_height="24dp"
-        app:tint="@android:color/white"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toStartOf="@id/label"
-        android:baseline="18dp"
-        app:layout_constraintBaseline_toTopOf="@id/topBaseline"
-        />
-    <TextView
-        android:id="@+id/label"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        app:layout_constraintStart_toEndOf="@id/icon"
-        app:layout_constraintEnd_toStartOf="@id/chronoRemaining"
-        android:singleLine="true"
-        tools:text="15s Timer"
-        app:layout_constraintBaseline_toTopOf="@id/topBaseline"
-        android:paddingEnd="4dp"
-        />
-    <Chronometer
-        android:id="@+id/chronoRemaining"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:singleLine="true"
-        android:textSize="20sp"
-        android:gravity="end"
-        tools:text="0:12"
-        app:layout_constraintBaseline_toTopOf="@id/topBaseline"
-        app:layout_constraintEnd_toStartOf="@id/pausedTimeRemaining"
-        app:layout_constraintStart_toEndOf="@id/label"
-        android:countDown="true"
-        android:paddingEnd="4dp"
-        />
-    <TextView
-        android:id="@+id/pausedTimeRemaining"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:singleLine="true"
-        android:textSize="20sp"
-        android:gravity="end"
-        tools:text="0:12"
-        app:layout_constraintBaseline_toTopOf="@id/topBaseline"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toEndOf="@id/chronoRemaining"
-        android:paddingEnd="4dp"
-        />
-
-    <androidx.constraintlayout.widget.Barrier
-        android:id="@+id/bottomOfTop"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        app:barrierDirection="bottom"
-        app:constraint_referenced_ids="icon,label,chronoRemaining,pausedTimeRemaining"
-        />
-
-    <com.android.systemui.statusbar.notification.row.ui.view.TimerButtonView
-        style="@*android:style/NotificationEmphasizedAction"
-        android:id="@+id/mainButton"
-        android:layout_width="124dp"
-        android:layout_height="wrap_content"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toStartOf="@id/altButton"
-        app:layout_constraintTop_toBottomOf="@id/bottomOfTop"
-        app:layout_constraintHorizontal_chainStyle="spread"
-        android:paddingEnd="4dp"
-        />
-
-    <com.android.systemui.statusbar.notification.row.ui.view.TimerButtonView
-        style="@*android:style/NotificationEmphasizedAction"
-        android:id="@+id/altButton"
-        android:layout_width="124dp"
-        android:layout_height="wrap_content"
-        app:layout_constraintTop_toBottomOf="@id/bottomOfTop"
-        app:layout_constraintStart_toEndOf="@id/mainButton"
-        app:layout_constraintEnd_toEndOf="@id/resetButton"
-        android:paddingEnd="4dp"
-        />
-
-    <com.android.systemui.statusbar.notification.row.ui.view.TimerButtonView
-        style="@*android:style/NotificationEmphasizedAction"
-        android:id="@+id/resetButton"
-        android:layout_width="124dp"
-        android:layout_height="wrap_content"
-        app:layout_constraintTop_toBottomOf="@id/bottomOfTop"
-        app:layout_constraintStart_toEndOf="@id/altButton"
-        app:layout_constraintEnd_toEndOf="parent"
-        android:paddingEnd="4dp"
-        />
-</com.android.systemui.statusbar.notification.row.ui.view.TimerView>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/status_bar_no_notifications.xml b/packages/SystemUI/res/layout/status_bar_no_notifications.xml
index 248e611..e26b855 100644
--- a/packages/SystemUI/res/layout/status_bar_no_notifications.xml
+++ b/packages/SystemUI/res/layout/status_bar_no_notifications.xml
@@ -26,6 +26,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center"
             android:gravity="center"
+            android:paddingHorizontal="8dp"
             >
         <TextView
                 android:id="@+id/no_notifications"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index d7c1359..0f411ca 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Aan"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Op • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Af"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Stel op"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Bestuur in instellings"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Geen aktiewe modusse nie}=1{{mode} is aktief}other{# modusse is aktief}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Jy sal nie deur geluide en vibrasies gepla word nie, behalwe deur wekkers, herinneringe, geleenthede en bellers wat jy spesifiseer. Jy sal steeds enigiets hoor wat jy kies om te speel, insluitend musiek, video\'s en speletjies."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Gesprekke"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vee alle stil kennisgewings uit"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Kennisgewings onderbreek deur Moenie Steur Nie"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Geen kennisgewings nie}=1{Kennisgewings is deur {mode} onderbreek}=2{Kennisgewings is deur {mode} en een ander modus onderbreek}other{Kennisgewings is deur {mode} en # ander modusse onderbreek}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Begin nou"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Geen kennisgewings nie"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Geen nuwe kennisgewings nie"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Wys demonstrasiemodus"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Wekker"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> is aan"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Stel op om vinniger, veiliger aankope met jou foon te doen"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Wys alles"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Luidsprekers en skerms"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Voorgestelde toestelle"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Invoer"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Uitvoer"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stop jou gedeelde sessie om media na ’n ander toestel toe te skuif"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stop"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Hoe uitsaai werk"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Vou ikoon in"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Vou ikoon uit"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"of"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Sleephandvatsel"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigeer met jou sleutelbord"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Leer kortpadsleutels"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigeer met jou raakpaneel"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Leer raakpaneelgebare"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigeer met jou sleutelbord en raakpaneel"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Leer raakpaneelgebare, kortpadsleutels en meer"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Teruggebaar"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Tuisgebaar"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Bekyk onlangse apps"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Klaar"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Gaan terug"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Swiep enige plek op die raakpaneel links of regs met drie vingers om terug te gaan.\n\nJy kan ook die kortpadsleutelhandeling + Esc hiervoor gebruik."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Knap gedaan!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Jy het die Gaan Terug-gebaar voltooi."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Gaan na tuisskerm"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Swiep enige tyd van die onderkant van jou skerm af op met drie vingers om na jou tuisskerm toe te gaan."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Mooi so!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Jy het die Gaan na Tuisskerm-gebaar voltooi."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Bekyk onlangse apps"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Swiep op en hou met drie vingers op jou raakpaneel."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Knap gedaan!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Jy het die Bekyk Onlangse Apps-gebaar voltooi."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Handelingsleutel"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Druk die handelingsleutel op jou sleutelbord om toegang tot jou apps te kry."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Geluk!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Jy het die Handelingsleutel-gebaar voltooi.\n\nHandeling + / wys al die kortpaaie wat vir jou beskikbaar is."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Sleutelbordlig"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Vlak %1$d van %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Huiskontroles"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Druk die handelingsleutel op jou sleutelbord om al jou apps te bekyk"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Gewysig"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Ontsluit om te kyk"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontekstuele opvoeding"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Gebruik jou raakpaneel om terug te gaan"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Swiep links of regs met drie vingers. Tik om meer gebare te leer."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Gebruik jou raakpaneel om na die tuisskerm toe te gaan"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 388601b..5531424 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"በርቷል"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"በርቷል • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"ጠፍቷል"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"አዋቅር"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"በቅንብሮች ውስጥ አስተዳድር"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{ምንም ገቢር ሁነታዎች የሉም}=1{{mode} ገቢር ነው}one{# ሁኔታ ገቢር ነው}other{# ሁኔታዎች ገቢር ናቸው}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"እርስዎ ከወሰንዋቸው ማንቂያዎች፣ አስታዋሾች፣ ክስተቶች እና ደዋዮች በስተቀር፣ በድምጾች እና ንዝረቶች አይረበሹም። ሙዚቃ፣ ቪዲዮዎች እና ጨዋታዎች ጨምሮ ለመጫወት የሚመርጡትን ማንኛውም ነገር አሁንም ይሰማሉ።"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"ውይይቶች"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ሁሉንም ጸጥ ያሉ ማሳወቂያዎችን ያጽዱ"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ማሳወቂያዎች በአትረብሽ ባሉበት ቆመዋል"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{ምንም ማሳወቂያዎች የሉም}=1{ማሳወቂያዎች በ{mode} ባሉበት ቆመዋል}=2{ማሳወቂያዎች በ{mode} እና አንድ ሌላ ሁነታ ባሉበት ቆመዋል}one{ማሳወቂያዎች በ{mode} እና # ሌላ ሁነታ ባሉበት ቆመዋል}other{ማሳወቂያዎች በ{mode} እና # ሌላ ሁነታዎች ባሉበት ቆመዋል}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"አሁን ጀምር"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"ምንም ማሳወቂያ የለም"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"ምንም አዲስ ማሳወቂያዎች የሉም"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"ማሳያ ሁነታን አሳይ"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ኤተርኔት"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"ማንቂያ"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> በርቷል"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"በስልክዎ በመጠቀም ፈጣን እና የበለጠ ደህንነቱ በተጠበቀ መንገድ ግዢዎችን ለመፈጸም ዝግጁ ይሁኑ"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"ሁሉንም አሳይ"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"መሰብሰቢያ አዶ"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"መዘርጊያ አዶ"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ወይም"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"መያዣ ይጎትቱ"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"የቁልፍ ሰሌዳዎን በመጠቀም ያስሱ"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"የቁልፍ ሰሌዳ አቋራጮችን ይወቁ"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"የመዳሰሻ ሰሌዳዎን በመጠቀም ያስሱ"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"የመዳሰሻ ሰሌዳ ምልክቶችን ይወቁ"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"የእርስዎን የቁልፍ ሰሌዳ እና የመዳሰሻ ሰሌዳ በመጠቀም ያስሱ"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"የመዳሰሻ ሰሌዳ ምልክቶችን፣ የቁልፍ ሰሌዳ አቋራጮችን እና ሌሎችን ይወቁ"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"የተመለስ ምልክት"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"የቤት ምልክት"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"የቅርብ ጊዜ መተግበሪያዎችን አሳይ"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ተከናውኗል"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ወደኋላ ተመለስ"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"ወደኋላ ለመመለስ የመዳሰሻ ሰሌዳው ላይ የትኛውም ቦታ በሦስት ጣቶች ወደግራ ወይም ወደቀኝ ያንሸራትቱ።\n\nእንዲሁም የቁልፍ ሰሌዳ አቋራጭ + ESC ለዚህ መጠቀም ይችላሉ።"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"ጥሩ ሠርተዋል!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"ወደኋላ የመመለስ ምልክትን አጠናቅቀዋል።"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ወደ መነሻ ሂድ"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"በማንኛውም ጊዜ ወደ መነሻ ማያ ገፅዎ ለመሄድ ከማያ ገፅዎ ታች በሦስት ጣቶች ወደላይ ያሸብልሉ።"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"አሪፍ!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"ወደ መነሻ ሂድ ምልክትን አጠናቅቀዋል።"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"የቅርብ ጊዜ መተግበሪያዎችን አሳይ"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"የመዳሰሻ ሰሌዳዎ ላይ ሦስት ጣቶችን በመጠቀም ወደ ላይ ያንሸራትቱ እና ይያዙ።"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ጥሩ ሠርተዋል!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"የቅርብ ጊዜ መተግበሪያዎች አሳይ ምልክትን አጠናቅቀዋል።"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"የተግባር ቁልፍ"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"መተግበሪያዎችዎን ለመድረስ በቁልፍ ሰሌዳዎ ላይ የእርምጃ ቁልፉን ይጫኑ።"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"እንኳን ደስ አለዎት!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"የተግባር ቁልፍ ምልክቱን አጠናቅቀዋል።\n\nእርምጃ + / ለእርስዎ ተገኚ የሆኑትን አቋራጮች በሙሉ ያሳያል።"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"የቁልፍ ሰሌዳ የጀርባ ብርሃን"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"ደረጃ %1$d ከ %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"የቤት ውስጥ ቁጥጥሮች"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"ሁሉንም መተግበሪያዎችዎን ለማየት በቁልፍ ሰሌዳዎ ላይ ያለውን የተግባር ቁልፍ ይጫኑ"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"ጽሁፍ ተቀይሯል"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"ለመመልከት ይክፈቱ"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"የዓውድ ትምህርት"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"ለመመለስ የመዳሰሻ ሰሌዳዎን ይጠቀሙ"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"ሦስት ጣቶችን በመጠቀም ወደ ግራ ወይም ወደ ቀኝ ያንሸራትቱ። ምልክቶችን የበለጠ ለማወቅ መታ ያድርጉ።"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"ወደ መነሻ ለመመለስ የመዳሰሻ ሰሌዳዎን ይጠቀሙ"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 53b1dfb..091b58e 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"مفعَّل"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"مفعّل • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"غير مفعَّل"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"إعداد"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"الإدارة في الإعدادات"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{ما مِن أوضاع مفعَّلة}=1{الوضع \"{mode}\" مفعَّل}two{وضعان مفعَّلان}few{‫# أوضاع مفعَّلة}many{‫# وضعًا مفعَّلاً}other{‫# وضع مفعَّل}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"لن يتم إزعاجك بالأصوات والاهتزاز، باستثناء المُنبِّهات والتذكيرات والأحداث والمتصلين الذين تحددهم. وسيظل بإمكانك سماع أي عناصر أخرى تختار تشغيلها، بما في ذلك الموسيقى والفيديوهات والألعاب."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"المحادثات"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"محو جميع الإشعارات الصامتة"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"تم إيقاف الإشعارات مؤقتًا وفقًا لإعداد \"عدم الإزعاج\""</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{ما مِن إشعارات}=1{تم إيقاف الإشعارات مؤقتًا بواسطة \"{mode}\"}=2{تم إيقاف الإشعارات مؤقتًا بواسطة \"{mode}\" ووضع واحد آخر}few{تم إيقاف الإشعارات مؤقتًا بواسطة \"{mode}\" و# أوضاع أخرى}many{تم إيقاف الإشعارات مؤقتًا بواسطة \"{mode}\" و# وضعًا آخر}other{تم إيقاف الإشعارات مؤقتًا بواسطة \"{mode}\" و# وضع آخر}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"البدء الآن"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"ما مِن إشعارات"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"ما مِن إشعارات جديدة"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"عرض الوضع التجريبي"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"إيثرنت"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"المنبّه"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"وضع \"<xliff:g id="MODENAME">%1$s</xliff:g>\" مفعَّل"</string>
     <string name="wallet_title" msgid="5369767670735827105">"‏محفظة Google"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"يمكنك إعداد طريقة دفع لإجراء عمليات شراء بسرعة وأمان أكبر باستخدام هاتفك."</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"عرض الكل"</string>
@@ -772,7 +775,7 @@
     <string name="feedback_prompt" msgid="3656728972307896379">"أخبِر مطوِّر البرامج برأيك. هل كان هذا صحيحًا؟"</string>
     <string name="notification_channel_controls_opened_accessibility" msgid="6111817750774381094">"تم فتح عناصر التحكم في الإشعارات لتطبيق <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="notification_channel_controls_closed_accessibility" msgid="1561909368876911701">"تم إغلاق عناصر التحكم في الإشعارات لتطبيق <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
-    <string name="notification_more_settings" msgid="4936228656989201793">"المزيد من الإعدادات"</string>
+    <string name="notification_more_settings" msgid="4936228656989201793">"إعدادات إضافية"</string>
     <string name="notification_app_settings" msgid="8963648463858039377">"تخصيص"</string>
     <string name="notification_conversation_bubble" msgid="2242180995373949022">"إظهار فقاعة تفسيرية"</string>
     <string name="notification_conversation_unbubble" msgid="6908427185031099868">"إزالة فقاعات المحادثات"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"رمز التصغير"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"رمز التوسيع"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"أو"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"مقبض السحب"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"التنقّل باستخدام لوحة المفاتيح"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"تعرَّف على اختصارات لوحة المفاتيح"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"التنقّل باستخدام لوحة اللمس"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"تعرَّف على إيماءات لوحة اللمس"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"التنقّل باستخدام لوحة المفاتيح ولوحة اللمس"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"تعرَّف على إيماءات لوحة اللمس واختصارات لوحة المفاتيح والمزيد"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"إيماءة الرجوع"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"إيماءة الانتقال إلى الشاشة الرئيسية"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"عرض التطبيقات المستخدَمة مؤخرًا"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"تم"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"رجوع"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"‏للرجوع، مرِّر سريعًا لليمين أو لليسار باستخدام ثلاثة أصابع في أي مكان على لوحة اللمس.\n\nيمكنك أيضًا الرجوع باستخدام اختصار لوحة المفاتيح \"مفتاح الإجراء + ESC\"."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"أحسنت"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"لقد أكملت التدريب على إيماءة الرجوع."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"الانتقال إلى الشاشة الرئيسية"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"للانتقال إلى الشاشة الرئيسية في أي وقت، مرِّر سريعًا من أسفل الشاشة إلى أعلاها بثلاثة أصابع."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"أحسنت"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"لقد أكملت التدريب على إيماءة الانتقال إلى الشاشة الرئيسية."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"عرض التطبيقات المستخدَمة مؤخرًا"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"مرِّر سريعًا للأعلى مع استمرار الضغط باستخدام ثلاثة أصابع على لوحة اللمس."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"أحسنت."</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"لقد أكملْت الدليل التوجيهي على إيماءة \"عرض التطبيقات المستخدَمة مؤخرًا\"."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"مفتاح الإجراء"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"للوصول إلى التطبيقات، اضغط على مفتاح الإجراء في لوحة المفاتيح."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"تهانينا!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"لقد أكملت التدريب على إيماءة مفتاح الإجراء.\n\nيؤدي الضغط على مفتاح الإجراء + / إلى عرض جميع الاختصارات المتاحة."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"الإضاءة الخلفية للوحة المفاتيح"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"‏مستوى الإضاءة: %1$d من %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"إدارة المنزل آليًّا"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"لعرض جميع التطبيقات، اضغط على مفتاح الإجراء في لوحة المفاتيح"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"إشعار مخفي"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"افتح القفل لعرض المعلومات"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"التعليم السياقي"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"استخدِم لوحة اللمس للرجوع"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"مرِّر سريعًا لليمين أو لليسار باستخدام 3 أصابع. انقر للتعرّف على المزيد من الإيماءات."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"استخدِم لوحة اللمس للانتقال إلى الشاشة الرئيسية"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 04cb99c..bbaf974 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"অন আছে"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"অন আছে • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"অফ আছে"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"ছেট আপ কৰক"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"ছেটিঙত পৰিচালনা কৰক"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{কোনো সক্ৰিয় ম’ড নাই}=1{{mode} সক্ৰিয় আছে}one{# টা ম’ড সক্ৰিয় আছে}other{# টা ম’ড সক্ৰিয় আছে}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"আপুনি নিৰ্দিষ্ট কৰা এলাৰ্ম, ৰিমাইণ্ডাৰ, ইভেন্ট আৰু কল কৰোঁতাৰ বাহিৰে আন কোনো শব্দৰ পৰা আপুনি অসুবিধা নাপাব। কিন্তু, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি আপুনি প্লে কৰিব খোজা যিকোনো বস্তু তথাপি শুনিব পাৰিব।"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"বাৰ্তালাপ"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"আটাইবোৰ নীৰৱ জাননী মচক"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"অসুবিধা নিদিব-ই জাননী পজ কৰিছে"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{কোনো জাননী নাই}=1{{mode}এ জাননী পজ কৰিছে}=2{{mode} আৰু আন এটা ম’ডে জাননী পজ কৰিছে}one{{mode} আৰু আন # টা ম’ডে জাননী পজ কৰিছে}other{{mode} আৰু আন # টা ম’ডে জাননী পজ কৰিছে}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"এতিয়াই আৰম্ভ কৰক"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"কোনো জাননী নাই"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"কোনো নতুন জাননী নাই"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"ডেম\' ম\'ড দেখুৱাওক"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ইথাৰনেট"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"এলাৰ্ম"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"ৱালেট"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"আপোনাৰ ফ’নটোৰে দ্ৰুত তথা অধিক সুৰক্ষিত ক্ৰয় কৰিবলৈ ছেট আপ পাওক"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"আটাইবোৰ দেখুৱাওক"</string>
@@ -1396,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"সংকোচন কৰাৰ চিহ্ন"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"বিস্তাৰ কৰাৰ চিহ্ন"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"অথবা"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ড্ৰেগ হেণ্ডেল"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"কীব’ৰ্ড ব্যৱহাৰ কৰি নেভিগে’ট কৰক"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"কীব’ৰ্ডৰ শ্বৰ্টকাটসমূহৰ বিষয়ে জানক"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"আপোনাৰ টাচ্চপেড ব্যৱহাৰ কৰি নেভিগে’ট কৰক"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"টাচ্চপেডৰ নিৰ্দেশসমূহ জানক"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"আপোনাৰ কীব’ৰ্ড আৰু টাচ্চপেড ব্যৱহাৰ কৰি নেভিগে’ট কৰক"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"টাচ্চপেডৰ নিৰ্দেশ, কীব’ৰ্ডৰ শ্বৰ্টকাট আৰু অধিকৰ বিষয়ে জানক"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"উভতি যাওক নিৰ্দেশ"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"গৃহ স্ক্ৰীনলৈ যোৱাৰ নিৰ্দেশ"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"শেহতীয়া এপ্‌সমূহ চাওক"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"হ’ল"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"উভতি যাওক"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"উভতি যাবলৈ, টাচ্চপেডৰ যিকোনো স্থানত তিনিটা আঙুলি ব্যৱহাৰ কৰি বাওঁ বা সোঁফালে ছোৱাইপ কৰক।\n\nইয়াৰ বাবে আপুনি কীব’ৰ্ড শ্বৰ্টকাট কাৰ্য + ESC ব্যৱহাৰ কৰিবও পাৰে।"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"বঢ়িয়া!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"আপুনি উভতি যোৱাৰ নিৰ্দেশটো সম্পূৰ্ণ কৰিলে।"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"গৃহ পৃষ্ঠালৈ যাওক"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"যিকোনো সময়তে আপোনাৰ গৃহ স্ক্ৰীনলৈ যাবলৈ, আপোনাৰ স্ক্ৰীনখনৰ একেবাৰে তলৰ পৰা ওপৰলৈ তিনিটা আঙুলিৰে ছোৱাইপ কৰক।"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"সুন্দৰ!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"আপুনি গৃহ স্ক্ৰীনলৈ উভতি যোৱাৰ নিৰ্দেশটো সম্পূৰ্ণ কৰিলে।"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"শেহতীয়া এপ্‌সমূহ চাওক"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"আপোনাৰ টাচ্চপেডত তিনিটা আঙুলি ব্যৱহাৰ কৰি ওপৰলৈ ছোৱাইপ কৰি কিছু সময় ধৰি ৰাখক।"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"বঢ়িয়া!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"আপুনি শেহতীয়া এপ্ চোৱাৰ নিৰ্দেশনাটো সম্পূৰ্ণ কৰিছে।"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"কাৰ্য কী"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"আপোনাৰ এপ্‌সমূহ এক্সেছ কৰিবলৈ আপোনাৰ কীব’ৰ্ডৰ কাৰ্য কীটোত টিপক।"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"অভিনন্দন!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"আপুনি কাৰ্য কীৰ নিৰ্দেশটো সম্পূৰ্ণ কৰিলে।\n\nকাৰ্য + /এ আপোনাৰ বাবে উপলব্ধ আটাইবোৰ শ্বৰ্টকাট দেখুৱায়।"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"কীব’ৰ্ডৰ বেকলাইট"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dৰ %1$d স্তৰ"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"ঘৰৰ সা-সৰঞ্জামৰ নিয়ন্ত্ৰণ"</string>
@@ -1435,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"আপোনাৰ আটাইবোৰ এপ্‌ চাবলৈ আপোনাৰ কীব’ৰ্ডৰ কাৰ্য কীটোত টিপক"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"সম্পাদনা কৰা হৈছে"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"চাবলৈ আনলক কৰক"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"প্ৰাসংগিক শিক্ষা"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"উভতি যাবলৈ আপোনাৰ টাচ্চপেড ব্যৱহাৰ কৰক"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"তিনিটা আঙুলি ব্যৱহাৰ কৰি বাওঁফাললৈ বা সোঁফাললৈ ছোৱাইপ কৰক। অধিক নিৰ্দেশ শিকিবলৈ টিপক।"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"গৃহপৃষ্ঠালৈ যাবলৈ আপোনাৰ টাচ্চপেড ব্যৱহাৰ কৰক"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 85aa42f..211a05d 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Aktiv"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Aktiv • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Deaktiv"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Ayarlayın"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Ayarlarda idarə edin"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Aktiv rejim yoxdur}=1{{mode} aktivdir}other{# rejim aktivdir}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Seçdiyiniz siqnal, xatırladıcı, tədbir və zənglər istisna olmaqla səslər və vibrasiyalar Sizi narahat etməyəcək. Musiqi, video və oyunlar da daxil olmaqla oxutmaq istədiyiniz hər şeyi eşidəcəksiniz."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Söhbətlər"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Səssiz bildirişlərin hamısını silin"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bildirişlər \"Narahat Etməyin\" rejimi tərəfindən dayandırıldı"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Bildiriş yoxdur}=1{Bildirişlər {mode} tərəfindən dayandırıldı}=2{Bildirişlər {mode} və digər rejim tərəfindən dayandırıldı}other{Bildirişlər {mode} və # digər rejim tərəfindən dayandırıldı}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"İndi başlayın"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Heç bir bildiriş yoxdur"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Yeni bildiriş yoxdur"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Demo rejimini göstərin"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Zəngli saat"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Pulqabı"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Telefonunuzla daha sürətli və təhlükəsiz satınalmalar etmək üçün ayarlayın"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Hamısını göstər"</string>
@@ -1179,10 +1183,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Dinamiklər &amp; Displeylər"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Təklif olunan Cihazlar"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Daxiletmə"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Nəticə"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Medianı başqa cihaza köçürmək üçün paylaşılan sessiyanı dayandırın"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Dayandırın"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Yayım necə işləyir"</string>
@@ -1398,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"İkonanı yığcamlaşdırın"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"İkonanı genişləndirin"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"və ya"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Dəstəyi çəkin"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Klaviaturadan istifadə edərək hərəkət edin"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Klaviatura qısayolları haqqında öyrənin"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Taçpeddən istifadə edərək hərəkət edin"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Taçped jestlərini öyrənin"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Klaviatura və taçpeddən istifadə edərək hərəkət edin"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Taçped jestləri, klaviatura qısayolları və s. haqqında öyrənin"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Geri jesti"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Əsas ekran jesti"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Son tətbiqlərə baxın"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hazırdır"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Geri qayıdın"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Geri getmək üçün taçpeddə istənilən yerdə üç barmaqla sola və ya sağa çəkin.\n\nBunun üçün Action + ESC klaviatura qısayolundan da istifadə edə bilərsiniz."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Əla!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Geri getmə jestini tamamladınız."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ana ekrana qayıdın"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"İstənilən vaxt ana ekrana keçmək üçün ekranın aşağısından üç barmağınızla yuxarı çəkin."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Əla!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Əsas ekrana keçid jestini tamamladınız."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Son tətbiqlərə baxın"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Taçpeddə üç barmaq ilə yuxarı çəkib saxlayın."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Əla!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Son tətbiqlərə baxmaq jestini tamamladınız."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Fəaliyyət açarı"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Tətbiqlərə daxil olmaq üçün klaviaturada fəaliyyət açarını basın."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Təbriklər!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Fəaliyyət açarı jestini tamamladınız.\n\nFəaliyyət + / əlçatan bütün qısayolları göstərir."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klaviatura işığı"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Səviyyə %1$d/%2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Ev nizamlayıcıları"</string>
@@ -1437,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Bütün tətbiqlərə baxmaq üçün klaviaturada fəaliyyət açarını basın"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Çıxarılıb"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Baxmaq üçün kiliddən çıxarın"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontekstual təhsil"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Geri qayıtmaq üçün taçped istifadə edin"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Üç barmaqla sola və ya sağa çəkin. Daha çox jest öyrənmək üçün toxunun."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Ana səhifəyə keçmək üçün taçped istifadə edin"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index b838f7c..6064cc1 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Uključeno"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Uklj. • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Isključeno"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Podesi"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Upravljajte u podešavanjima"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Nema aktivnih režima}=1{Aktivan je {mode} režim}one{Aktivan je # režim}few{Aktivna su # režima}other{Aktivno je # režima}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Neće vas uznemiravati zvukovi i vibracije osim za alarme, podsetnike, događaje i pozivaoce koje navedete. I dalje ćete čuti sve što odaberete da pustite, uključujući muziku, video snimke i igre."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzacije"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Obrišite sva nečujna obaveštenja"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Obaveštenja su pauzirana režimom Ne uznemiravaj"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nema obaveštenja}=1{Obaveštenja je pauzirao {mode}}=2{Obaveštenja su pauzirali {mode} i još jedan režim}one{Obaveštenja su pauzirali {mode} i još # režim}few{Obaveštenja su pauzirali {mode} i još # režima}other{Obaveštenja su pauzirali {mode} i još # režima}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Započni"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Nema obaveštenja"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Nema novih obaveštenja"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Prikaži režim demonstracije"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Eternet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g>: uključeno"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Novčanik"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Obavite konfigurisanje da biste mogli brže i sigurnije da kupujete pomoću telefona"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Prikaži sve"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona za skupljanje"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona za proširivanje"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Marker za prevlačenje"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Krećite se pomoću tastature"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Saznajte više o tasterskim prečicama"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Krećite se pomoću tačpeda"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Naučite pokrete za tačped"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Krećite se pomoću tastature i tačpeda"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Naučite pokrete za tačped, tasterske prečice i drugo"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Pokret za vraćanje"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Pokret za početnu stranicu"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Prikaži nedavno korišćene aplikacije"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotovo"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Nazad"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Da biste se vratili, prevucite ulevo sa tri prsta bilo gde na tačpedu.\n\nMožete da koristite i tastersku prečicu Alt + ESC za ovo."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Odlično!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Dovršili ste pokret za povratak."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Idi na početni ekran"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Da biste otišli na početni ekran u bilo kom trenutku, prevucite nagore od dna ekrana pomoću tri prsta."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Svaka čast!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Dovršili ste pokret za povratak na početnu stranicu."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Prikaži nedavno korišćene aplikacije"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Prevucite nagore i zadržite pomoću tri prsta na tačpedu."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Odlično!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Dovršili ste pokret za prikazivanje nedavno korišćenih aplikacija."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Taster radnji"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Da biste pristupili aplikacijama, pritisnite taster radnji na tastaturi."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Čestitamo!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Dovršili ste pokret pomoću tastera radnji.\n\nRadnja + / prikazuje sve prečice koje su vam dostupne."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Pozadinsko osvetljenje tastature"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. nivo od %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrole za dom"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Da biste pogledali sve aplikacije, pritisnite taster radnji na tastaturi"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Redigovano"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Otključajte za prikaz"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontekstualno obrazovanje"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Koristite tačped da biste se vratili"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Prevucite ulevo ili udesno sa tri prsta. Dodirnite da biste videli više pokreta."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Koristite tačped da biste otišli na početni ekran"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 038732c..cdaca7e 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Уключана"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Уключана • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Выключана"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Наладзіць"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Адкрыць налады"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Актыўных рэжымаў няма}=1{Рэжым \"{mode}\" актыўны}one{# рэжым актыўны}few{# рэжымы актыўныя}many{# рэжымаў актыўныя}other{# рэжыму актыўныя}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Вас не будуць турбаваць гукі і вібрацыя, за выключэннем будзільнікаў, напамінаў, падзей і выбраных вамі абанентаў. Вы будзеце чуць усё, што ўключыце, у тым ліку музыку, відэа і гульні."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Размовы"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Выдаліць усе апавяшчэнні без гуку"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Паказ апавяшчэнняў прыпынены ў рэжыме \"Не турбаваць\""</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Апавяшчэнняў няма}=1{Атрыманне апавяшчэнняў прыпынена рэжымам \"{mode}\"}=2{Атрыманне апавяшчэнняў прыпынена рэжымам \"{mode}\" і яшчэ адным рэжымам}one{Атрыманне апавяшчэнняў прыпынена рэжымам \"{mode}\" і яшчэ # рэжымам}few{Атрыманне апавяшчэнняў прыпынена рэжымам \"{mode}\" і яшчэ # рэжымамі}many{Атрыманне апавяшчэнняў прыпынена рэжымам \"{mode}\" і яшчэ # рэжымамі}other{Атрыманне апавяшчэнняў прыпынена рэжымам \"{mode}\" і яшчэ # рэжыму}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Пачаць зараз"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Апавяшчэнняў няма"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Няма новых апавяшчэнняў"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Паказваць дэманстрацыйны рэжым"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Будзільнік"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Кашалёк"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Наладзьце картку, каб рабіць больш хуткія і бяспечныя куплі з дапамогай тэлефона"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Паказаць усе"</string>
@@ -1179,10 +1183,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Дынамікі і дысплэі"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Прылады, якія падтрымліваюцца"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Увод"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Вывад"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Каб перамясціць медыяфайлы на іншую прыладу, спыніце абагулены сеанс"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Спыніць"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Як адбываецца трансляцыя"</string>
@@ -1398,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Значок \"Згарнуць\""</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок \"Разгарнуць\""</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"або"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Маркер перацягвання"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Навігацыя з дапамогай клавіятуры"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Азнаёмцеся са спалучэннямі клавіш"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Навігацыя з дапамогай сэнсарнай панэлі"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Азнаёмцеся з жэстамі для сэнсарнай панэлі"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Навігацыя з дапамогай клавіятуры і сэнсарнай панэлі"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Азнаёмцеся з жэстамі для сэнсарнай панэлі, спалучэннямі клавіш і г. д."</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Жэст для вяртання на папярэдні экран"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Жэст для вяртання на галоўны экран"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Прагляд нядаўніх праграм"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Гатова"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Каб вярнуцца, правядзіце трыма пальцамі ўлева ці ўправа ў любым месцы сэнсарнай панэлі.\n\nТаксама можна выкарыстоўваць спалучэнне \"клавіша дзеяння + ESC\"."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Выдатная праца!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Вы навучыліся рабіць жэст вяртання."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"На галоўны экран"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Каб у любы момант перайсці на галоўны экран, правядзіце па экране трыма пальцамі знізу ўверх."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Выдатна!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Вы навучыліся рабіць жэст для пераходу на галоўны экран."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Прагляд нядаўніх праграм"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Правядзіце па сэнсарнай панэлі трыма пальцамі ўверх і затрымайце пальцы."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Выдатная праца!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Вы скончылі вывучэнне жэсту для прагляду нядаўніх праграм."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Клавіша дзеяння"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Каб атрымаць доступ да праграм, націсніце клавішу дзеяння на клавіятуры."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Віншуем!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Вы навучыліся рабіць жэст з клавішай дзеяння.\n\nКалі націснуць клавішу дзеяння разам з \"/\", будуць паказаны ўсе даступныя спалучэнні клавіш."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Падсветка клавіятуры"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Узровень %1$d з %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Кіраванне домам"</string>
@@ -1437,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Каб праглядзець усе праграмы, націсніце на клавішу дзеяння на клавіятуры"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Схавана"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Разблакіруйце экран, каб праглядзець"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Кантэкстнае навучанне"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Выкарыстайце сэнсарную панэль для вяртання"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Правядзіце ўлева ці ўправа трыма пальцамі. Націсніце, каб азнаёміцца з іншымі жэстамі."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Выкарыстайце сэнсарную панэль для вяртання на галоўны экран"</string>
@@ -1446,7 +1460,7 @@
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"Выкарыстайце клавіятуру для прагляду ўсіх праграм"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Можна націснуць на клавішу дзеяння ў любы момант. Націсніце, каб азнаёміцца з іншымі жэстамі."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Цяпер кіраваць дадатковым памяншэннем яркасці можна з дапамогай паўзунка яркасці"</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Цяпер вы можаце дадаткова зацямніць экран, яшчэ больш панізіўшы ўзровень яркасці.\n\nПаколькі гэта функцыя цяпер уваходзіць у склад паўзунка яркасці, хуткія каманды для дадатковага памяншэння яркасці былі выдалены."</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Цяпер вы можаце дадаткова зацямніць экран, яшчэ больш панізіўшы ўзровень яркасці.\n\nПаколькі гэта функцыя цяпер уваходзіць у склад паўзунка яркасці, хуткія каманды для дадатковага памяншэння яркасці будуць выдалены."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Выдаліць хуткія каманды для дадатковага памяншэння яркасці"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Хуткія каманды для дадатковага памяншэння яркасці выдалены"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Магчымасць падключэння"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 17a8ed5..79fc4b2 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Вкл."</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Вкл. • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Изкл."</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Настройване"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Управление от настройките"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Няма активни режими}=1{Режимът „{mode}“ е активен}other{# активни режима}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Няма да бъдете обезпокоявани от звуци и вибрирания освен от будилници, напомняния, събития и обаждания от посочени от вас контакти. Пак ще чувате всичко, което изберете да се пусне, включително музика, видеоклипове и игри."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Изчистване на всички беззвучни известия"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Известията са поставени на пауза от режима „Не безпокойте“"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Няма известия}=1{Известията са поставени на пауза от {mode}}=2{Известията са поставени на пауза от {mode} и един друг режим}other{Известията са поставени на пауза от {mode} и # други режима}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Стартиране сега"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Няма известия"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Няма нови известия"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Показване на демонстрационния режим"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Будилник"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"Режимът „<xliff:g id="MODENAME">%1$s</xliff:g>“ е включен"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Портфейл"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Купувайте по-бързо и по-сигурно с телефона си"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Показване на всички"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Високоговорители и екрани"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Предложени устройства"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Вход"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Изход"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Спиране на споделената ви сесия с цел преместване на мултимедията на друго устройство"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Спиране"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Как работи предаването"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за свиване"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за разгъване"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Манипулатор за преместване с плъзгане"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Навигирайте посредством клавиатурата си"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Научете за клавишните комбинации"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Навигирайте посредством сензорния панел"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Научете за жестовете със сензорния панел"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Навигирайте посредством клавиатурата и сензорния панел"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Научете за жестовете със сензорния панел, клавишните комбинации и др."</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Жест за връщане назад"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Жест за преминаване към началния екран"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Преглед на скорошните приложения"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"За да се върнете назад, прекарайте три пръста наляво или надясно по сензорния панел.\n\nЗа целта можете също да използвате комбинацията с клавиша за действия + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Отлично!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Изпълнихте жеста за връщане назад."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Към началния екран"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"За да преминете към началния екран по всяко време, прекарайте три пръста нагоре от долната част на екрана."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Чудесно!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Изпълнихте жеста за преминаване към началния екран."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Преглед на скорошните приложения"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Плъзнете нагоре с три пръста по сензорния панел и задръжте."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Отлично!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Изпълнихте жеста за преглед на скорошните приложения."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Клавиш за действия"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"За да осъществите достъп до приложенията, натиснете клавиша за действия на клавиатурата си."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Поздравления!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Изпълнихте жеста с клавиша за действия.\n\nНатискането на клавиша за действия и / показва всички налични клавишни комбинации."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Подсветка на клавиатурата"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Ниво %1$d от %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Контроли за дома"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"За да прегледате всичките си приложения, натиснете клавиша за действия на клавиатурата си"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Скрито"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Отключете за преглед"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Контекстуално обучение"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Използвайте сензорния панел, за да се върнете назад"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Плъзнете три пръста наляво или надясно. Докоснете, за да научите повече жестове."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Използвайте сензорния панел, за да преминете към началния екран"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index ebec652..485221a 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"চালু আছে"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"চালু আছে • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"বন্ধ আছে"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"সেট-আপ করুন"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"সেটিংসে গিয়ে ম্যানেজ করুন"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{কোনও মোড চালু নেই}=1{{mode} চালু আছে}one{# মোড চালু আছে}other{# মোড চালু আছে}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"অ্যালার্ম, রিমাইন্ডার, ইভেন্ট, এবং আপনার নির্দিষ্ট করে দেওয়া ব্যক্তিদের কল ছাড়া অন্য কোনও আওয়াজ বা ভাইব্রেশন হবে না। তবে সঙ্গীত, ভিডিও, এবং গেম সহ আপনি যা কিছু চালাবেন তার আওয়াজ শুনতে পাবেন।"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"কথোপকথন"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"সব নীরব বিজ্ঞপ্তি মুছুন"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'বিরক্ত করবে না\' দিয়ে বিজ্ঞপ্তি পজ করা হয়েছে"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{কোনও বিজ্ঞপ্তি নেই}=1{{mode}-এর জন্য বিজ্ঞপ্তি পজ করা হয়েছে}=2{{mode} ও অন্য আরেকটি মোডের জন্য বিজ্ঞপ্তি পজ করা হয়েছে}one{{mode} ও অন্য #টি মোডের জন্য বিজ্ঞপ্তি পজ করা হয়েছে}other{{mode} ও অন্য #টি মোডের জন্য বিজ্ঞপ্তি পজ করা হয়েছে}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"এখন শুরু করুন"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"কোনও বিজ্ঞপ্তি নেই"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"নতুন কোনও বিজ্ঞপ্তি নেই"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"ডেমো মোড দেখান"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ইথারনেট"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"অ্যালার্ম"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> চালু আছে"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"ফোন ব্যবহার করে আরও দ্রুত ও আরও নিরাপদে কেনাকাটা করার জন্য সেট-আপ করুন"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"সবকটি দেখুন"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"স্পিকার ও ডিসপ্লে"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"সাজেস্ট করা ডিভাইস"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"ইনপুট"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"আউটপুট"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"অন্য ডিভাইসে মিডিয়া সরাতে আপনার শেয়ার করা সেশন বন্ধ করুন"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"বন্ধ করুন"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ব্রডকাস্ট কীভাবে কাজ করে"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"আইকন আড়াল করুন"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"আইকন বড় করুন"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"অথবা"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"টেনে আনার হ্যান্ডেল"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"আপনার কীবোর্ড ব্যবহার করে নেভিগেট করুন"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"কীবোর্ড শর্টকাট সম্পর্কে জানুন"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"আপনার টাচপ্যাড ব্যবহার করে নেভিগেট করুন"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"টাচপ্যাডের জেসচার সম্পর্কে জানুন"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"আপনার কীবোর্ড এবং টাচপ্যাড ব্যবহার করে নেভিগেট করুন"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"টাচপ্যাড জেসচার, কীবোর্ড শর্টকাট এবং আরও অনেক কিছু সম্পর্কে জানুন"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ফিরে যাওয়ার জেসচার"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"হোমপেজে যাওয়ার জেসচার"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"সম্প্রতি ব্যবহার করা হয়েছে এমন অ্যাপ দেখুন"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"হয়ে গেছে"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ফিরে যান"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"ফিরে যেতে, টাচপ্যাডে যেকোনও জায়গায় তিনটি আঙুল দিয়ে বাঁদিক বা ডানদিকে সোয়াইপ করুন।\n\nএছাড়া, এটির জন্য আপনি কীবোর্ড শর্টকাট অ্যাকশন + ESC বোতাম প্রেস করতে পারবেন।"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"অসাধারণ!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"জেসচার ব্যবহার করে কীভাবে ফিরে যাওয়া যায় সেই সম্পর্কে আপনি জেনেছেন।"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"হোমে যান"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"যেকোনও সময়ে আপনার হোম স্ক্রিনে যেতে, আপনার স্ক্রিনের একদম নিচের থেকে তিনটি আঙুল দিয়ে উপরের দিকে সোয়াইপ করুন।"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"সাবাস!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"জেসচার ব্যবহার করে কীভাবে হোমে ফিরে যাওয়া যায় সেই সম্পর্কে আপনি জেনেছেন।"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"সম্প্রতি ব্যবহার করা হয়েছে এমন অ্যাপ দেখুন"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"আপনার টাচপ্যাডে তিনটি আঙুল ব্যবহার করে উপরের দিকে সোয়াইপ করে ধরে রাখুন।"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"অসাধারণ!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"সম্প্রতি ব্যবহার করা হয়েছে এমন অ্যাপের জেসচার দেখা সম্পূর্ণ করেছেন।"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"অ্যাকশন কী"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"আপনার অ্যাপ অ্যাক্সেস করতে, কীবোর্ডে অ্যাকশন কী প্রেস করুন"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"অভিনন্দন!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"অ্যাকশন কী জেসচার সম্পর্কে আপনি জেনেছেন।\n\nঅ্যাকশন + / প্রেস করলে আপনার কাছে উপলভ্য থাকা সব শর্টকাট দেখতে পাবেন।"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"কীবোর্ড ব্যাকলাইট"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d-এর মধ্যে %1$d লেভেল"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"হোম কন্ট্রোল"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"আপনার সব অ্যাপ দেখতে, কীবোর্ডে অ্যাকশন কী প্রেস করুন"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"রিড্যাক্ট করা হয়েছে"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"দেখার জন্য আনলক করুন"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"প্রাসঙ্গিক শিক্ষা"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"ফিরে যেতে টাচপ্যাড ব্যবহার করুন"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"তিনটি আঙুলের ব্যবহার করে ডান বা বাঁদিকে সোয়াইপ করুন। আরও জেসচার সম্পর্কে জানতে ট্যাপ করুন।"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"হোমে যেতে টাচপ্যাড ব্যবহার করুন"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 34e3d80..4c79f48 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Uključeno"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Uključeno • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Isključeno"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Postavite"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Upravljajte opcijom u postavkama"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Nema aktivnih načina rada}=1{Način rada {mode} je aktivan}one{# način rada je aktivan}few{# načina rada su aktivna}other{# načina rada je aktivno}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Neće vas ometati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivalaca koje odredite. I dalje ćete čuti sve što ste odabrali za reprodukciju, uključujući muziku, videozapise i igre."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Obriši sva nečujna obavještenja"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Obavještenja su pauzirana načinom rada Ne ometaj"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nema obavještenja}=1{Obavještenja su pauzirana putem načina rada {mode}}=2{Obavještenja su pauzirana putem načina rada {mode} i još jednog načina rada}one{Obavještenja su pauzirana putem načina rada {mode} i još # načina rada}few{Obavještenja su pauzirana putem načina rada {mode} i još # načina rada}other{Obavještenja su pauzirana putem načina rada {mode} i još # načina rada}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Započni odmah"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Nema obavještenja"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Nema novih obavještenja"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Prikaži način rada za demonstraciju"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"Način rada <xliff:g id="MODENAME">%1$s</xliff:g> je uključen"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Novčanik"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Postavite aplikaciju za brže i sigurnije kupovine putem telefona"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Prikaži sve"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona sužavanja"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona proširivanja"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Ručica za prevlačenje"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Krećite se pomoću tastature"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Saznajte više o prečicama tastature"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Krećite se pomoću dodirne podloge"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Saznajte više o pokretima na dodirnoj podlozi"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Krećite se pomoću tastature i dodirne podloge"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Saznajte više o pokretima na dodirnoj podlozi, prečicama tastature i drugim opcijama"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Pokret za povratak"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Pokret za povratak na početni ekran"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Prikaži nedavne aplikacije"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotovo"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Nazad"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Da se vratite, prevucite ulijevo ili udesno s tri prsta bilo gdje na dodirnoj podlozi.\n\nZa ovo možete koristiti i radnju za prečicu i Esc na tastaturi."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Sjajno!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Savladali ste pokret za vraćanje."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Odlazak na početni ekran"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Da odete na početni ekran bilo kada, prevucite s dna ekrana nagore s tri prsta."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Lijepo!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Savladali ste pokret za odlazak na početni ekran."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Prikaz nedavnih aplikacija"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Prevucite nagore i zadržite s tri prsta na dodirnoj podlozi."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Sjajno!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Izvršili ste pokret za prikaz nedavnih aplikacija."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tipka radnji"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Da pristupite aplikacijama, pritisnite tipku radnji na tastaturi."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Čestitamo!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Savladali ste pokret za tipku radnji.\n\nRadnja + / prikazuje sve prečice koje su vam dostupne."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Pozadinsko osvjetljenje tastature"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. nivo od %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrole za dom"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Da pregledate sve aplikacije, pritisnite tipku radnji na tastaturi"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Redigovano"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Otključajte da pregledate"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontekstualno obrazovanje"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Koristite dodirnu podlogu da se vratite"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Prevucite ulijevo ili udesno s tri prsta. Dodirnite da saznate za više pokreta."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Koristite dodirnu podlogu da se vratite na početnu stranicu"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 27f704d..1552c87 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Activat"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Activat • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Desactivat"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Configura"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Gestiona a la configuració"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{No hi ha cap mode actiu}=1{{mode} està actiu}many{Hi ha # de modes actius}other{Hi ha # modes actius}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"No t\'interromprà cap so ni cap vibració, tret dels de les alarmes, recordatoris, esdeveniments i trucades de les persones que especifiquis. Continuaràs sentint tot allò que decideixis reproduir, com ara música, vídeos i jocs."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Converses"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Esborra totes les notificacions silencioses"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificacions pausades pel mode No molestis"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No hi ha cap notificació}=1{{mode} ha posat en pausa les notificacions}=2{{mode} i un altre mode han posat en pausa les notificacions}many{{mode} i # de modes més han posat en pausa les notificacions}other{{mode} i # modes més han posat en pausa les notificacions}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Comença ara"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"No hi ha cap notificació"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"No hi ha cap notificació nova"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Mostra el mode de demostració"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarma"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"El mode <xliff:g id="MODENAME">%1$s</xliff:g> està activat"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Configura una manera més ràpida i segura de fer compres amb el telèfon"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Mostra-ho tot"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Replega la icona"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Desplega la icona"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Ansa per arrossegar"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navega amb el teclat"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprèn les tecles de drecera"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navega amb el ratolí tàctil"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Aprèn els gestos del ratolí tàctil"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navega amb el teclat i el ratolí tàctil"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprèn els gestos del ratolí tàctil, les tecles de drecera i més"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gest Enrere"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gest Inici"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Mostra les aplicacions recents"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Fet"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Torna"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Per tornar enrere, llisca cap a l\'esquerra o cap a la dreta amb tres dits en qualsevol lloc del ratolí tàctil.\n\nTambé pots utilitzar les tecles d\'accions de drecera+Esc."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Ben fet!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Has completat el gest per tornar enrere."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ves a la pantalla d\'inici"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Per anar a la pantalla d\'inici en qualsevol moment, fes lliscar tres dits cap amunt des de la part inferior de la pantalla."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Molt bé!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Has completat el gest per anar a la pantalla d\'inici."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Mostra les aplicacions recents"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Llisca cap amunt amb tres dits i mantén premut al ratolí tàctil."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Ben fet!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Has completat el gest per veure les aplicacions recents."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tecla d\'acció"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Per accedir a les aplicacions, prem la tecla d\'acció al teclat."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Enhorabona!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Has completat el gest de la tecla d\'acció.\n\nTecla d\'acció+/ mostra totes les dreceres que tens disponibles."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroil·luminació del teclat"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivell %1$d de %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Controls de la llar"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Per veure totes les aplicacions, prem la tecla d\'acció al teclat"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Emmascarat"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Desbloqueja per veure"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Educació contextual"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Utilitza el ratolí tàctil per tornar enrere"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Fes lliscar tres dits cap a l\'esquerra o cap a la dreta. Toca per aprendre més gestos."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Utilitza el ratolí tàctil per anar a la pantalla d\'inici"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index c824837..1689503 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Zapnuto"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Zapnuto • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Vypnuto"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Nastavit"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Spravovat v nastavení"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Žádné aktivní}=1{Režim {mode} je aktivní}few{# režimy jsou aktivní}many{# režimu je aktivních}other{# režimů je aktivních}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Nebudou vás rušit zvuky ani vibrace s výjimkou budíků, upozornění, událostí a volajících, které zadáte. Nadále uslyšíte veškerý obsah, který si sami pustíte (např. hudba, videa nebo hry)."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzace"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vymazat všechna tichá oznámení"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Oznámení jsou pozastavena režimem Nerušit"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Žádná oznámení}=1{Oznámení jsou pozastavená režimem {mode}}=2{Oznámení jsou pozastavená režimem {mode} a 1 dalším}few{Oznámení jsou pozastavená režimem {mode} a # dalšími}many{Oznámení jsou pozastavená režimem {mode} a # dalšího}other{Oznámení jsou pozastavená režimem {mode} a # dalšími}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Spustit"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Žádná oznámení"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Žádná nová oznámení"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Zobrazit ukázkový režim"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Budík"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"Je zapnutý režim <xliff:g id="MODENAME">%1$s</xliff:g>"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Peněženka"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Nastavte si rychlejší a bezpečnější platby pomocí telefonu"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Zobrazit vše"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Reproduktory a displeje"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Navrhovaná zařízení"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Vstup"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Výstup"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Ukončí sdílenou relaci a bude možné přesunout médium do jiného zařízení"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Zastavit"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Jak vysílání funguje"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona sbalení"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozbalení"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"nebo"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Úchyt pro přetažení"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigujte pomocí klávesnice"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Naučte se klávesové zkratky"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigujte pomocí touchpadu"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Naučte se gesta touchpadu"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigujte pomocí klávesnice a touchpadu"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Naučte se gesta touchpadu, klávesové zkratky a další"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto zpět"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto domů"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Zobrazit nedávné aplikace"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hotovo"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Zpět"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Pokud se chcete vrátit zpět, stačí kdekoli na touchpadu přejet třemi prsty doleva nebo doprava.\n\nMůžete také použít klávesovou zkratku Akce + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Výborně!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Dokončili jste gesto pro přechod zpět."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Přejít na plochu"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Na plochu přejdete kdykoli přejetím třemi prsty ze spodní části obrazovky nahoru."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Skvělé!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Dokončili jste gesto pro přechod na plochu."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Zobrazit nedávné aplikace"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Přejeďte po touchpadu třemi prsty nahoru a podržte je."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Výborně!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Provedli jste gesto pro zobrazení nedávných aplikací."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Akční klávesa"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Přístup k aplikacím získáte stisknutím akční klávesy na klávesnici."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Gratulujeme!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Dokončili jste gesto akční klávesy.\n\nAkce + / zobrazí všechny dostupné zkratky."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Podsvícení klávesnice"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Úroveň %1$d z %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Ovládání domácnosti"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Pokud chcete zobrazit všechny aplikace, stiskněte na klávesnici akční klávesu"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Odstraněno"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"K zobrazení je potřeba zařízení odemknout"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontextová výuka"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Návrat zpět pomocí touchpadu"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Přejeďte třemi prsty doleva nebo doprava. Další gesta zjistíte klepnutím."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Návrat domů pomocí touchpadu"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index feac02d..729473c 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Til"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Til • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Fra"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Konfigurer"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Administrer i indstillingerne"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Ingen aktive tilstande}=1{{mode} er aktiv}one{# tilstand er aktiv}other{# tilstande er aktive}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Du bliver ikke forstyrret af lyde eller vibrationer, undtagen fra alarmer, påmindelser, begivenheder og opkald fra udvalgte personer, du selv angiver. Du kan stadig høre alt, du vælger at afspille, f.eks. musik, videoer og spil."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Ryd alle lydløse notifikationer"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifikationer er sat på pause af Forstyr ikke"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Ingen notifikationer}=1{Notifikationer er sat på pause af {mode}}=2{Notifikationer er sat på pause af {mode} og én anden tilstand}one{Notifikationer er sat på pause af {mode} og # anden tilstand}other{Notifikationer er sat på pause af {mode} og # andre tilstande}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Start nu"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Ingen notifikationer"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Ingen nye notifikationer"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Vis Demotilstand"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> er aktiveret"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Bliv klar til at foretage hurtigere og mere sikre køb med din telefon"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Vis alle"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Højttalere og skærme"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Foreslåede enheder"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Input"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Output"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stop din delte session for at flytte medier til en anden enhed"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stop"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Sådan fungerer udsendelser"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikon for Skjul"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikon for Udvid"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Håndtag"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviger ved hjælp af dit tastatur"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Se tastaturgenveje"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviger ved hjælp af din touchplade"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Se bevægelser på touchpladen"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Naviger ved hjælp af dit tastatur og din touchplade"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Se bevægelser på touchpladen, tastaturgenveje m.m."</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Bevægelse for at gå tilbage"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Bevægelse for at gå til startskærm"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Se seneste apps"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Udfør"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Gå tilbage"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Du kan gå tilbage ved at stryge mod venstre eller højre med tre fingre et vilkårligt sted på touchpladen.\n\nDu kan også bruge tastaturgenvejen Alt + Esc."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Flot!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Du har fuldført bevægelsen for Gå tilbage."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Gå til startskærmen"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Du kan til enhver tid stryge opad med tre fingre fra bunden af skærmen, hvis du vil gå til startskærmen."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Sådan!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Du har fuldført bevægelsen for Gå til startskærmen."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Se seneste apps"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Stryg opad, og hold tre fingre på touchpladen."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Godt klaret!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Du har udført bevægelsen for at se de seneste apps."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Handlingstast"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Du kan tilgå alle dine apps ved at trykke på handlingstasten på dit tastatur."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Tillykke!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Du har fuldført bevægelsen for handlingstasten.\n\nHandling + / viser alle de tilgængelige genveje."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Tastaturets baggrundslys"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d af %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Hjemmestyring"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Du kan se alle dine apps ved at trykke på handlingstasten på dit tastatur"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Skjult"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Lås op for at se"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontekstbaseret uddannelse"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Brug din touchplade til at gå tilbage"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Stryg til venstre eller højre med tre fingre. Tryk for at lære flere bevægelser."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Brug din touchplade til at gå til startskærmen"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 3235c3a..655b7a2 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"An"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"An • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Aus"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Einrichten"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"In den Einstellungen verwalten"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Keine aktiven Modi}=1{{mode} aktiv}other{# aktiv}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Klingeltöne und die Vibration werden deaktiviert, außer für Weckrufe, Erinnerungen, Termine sowie Anrufe von zuvor von dir festgelegten Personen. Du hörst jedoch weiterhin Sound, wenn du dir Musik anhörst, Videos ansiehst oder Spiele spielst."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Unterhaltungen"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Alle lautlosen Benachrichtigungen löschen"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Benachrichtigungen durch „Bitte nicht stören“ pausiert"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Keine Benachrichtigungen}=1{Benachrichtigungen durch {mode} pausiert}=2{Benachrichtigungen durch {mode} und einen weiteren Modus pausiert}other{Benachrichtigungen durch {mode} und # weitere Modi pausiert}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Jetzt starten"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Keine Benachrichtigungen"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Keine neuen Benachrichtigungen"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Demomodus anzeigen"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Weckruf"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Füge eine Zahlungsmethode hinzu, um noch schneller und sicherer mit deinem Smartphone zu bezahlen"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Alle anzeigen"</string>
@@ -1179,10 +1183,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Lautsprecher &amp; Displays"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Vorgeschlagene Geräte"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Eingabe"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Ausgabe"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Beende die Freigabesitzung zur Übertragung von Medien auf das andere Gerät"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Beenden"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Funktionsweise von Nachrichten an alle"</string>
@@ -1293,8 +1295,7 @@
     <string name="add" msgid="81036585205287996">"Hinzufügen"</string>
     <string name="manage_users" msgid="1823875311934643849">"Nutzer verwalten"</string>
     <string name="drag_split_not_supported" msgid="7173481676120546121">"Diese Benachrichtigung lässt sich nicht auf einen Splitscreen ziehen"</string>
-    <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
-    <skip />
+    <string name="dream_overlay_location_active" msgid="6484763493158166618">"Standortermittlung aktiv"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WLAN nicht verfügbar"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritätsmodus"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Wecker gestellt"</string>
@@ -1351,8 +1352,7 @@
     <string name="lock_screen_settings" msgid="6152703934761402399">"Sperrbildschirm personalisieren"</string>
     <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Zum Anpassen des Sperrbildschirms entsperren"</string>
     <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Kein WLAN verfügbar"</string>
-    <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
-    <skip />
+    <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Standortermittlung aktiv"</string>
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera blockiert"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera und Mikrofon blockiert"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon blockiert"</string>
@@ -1400,39 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Symbol „Minimieren“"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Symbol „Maximieren“"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"oder"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Ziehpunkt"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigation mit der Tastatur"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Informationen zu Tastenkombinationen"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigation mit dem Touchpad"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Informationen zu Touchpad-Gesten"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigation mit Tastatur und Touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Informationen zu Touchpad-Gesten, Tastenkombinationen und mehr"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Touch-Geste „Zurück“"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Touch-Geste „Startbildschirm“"</string>
-    <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
     <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
+    <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Letzte Apps aufrufen"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Fertig"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Zurück"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Wenn du zurückgehen möchtest, wische an einer beliebigen Stelle des Touchpads mit drei Fingern nach links oder rechts.\n\nDu kannst stattdessen auch die Tastenkombination „Aktion“ + „ESC“ verwenden."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Gut gemacht!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Du hast den Schritt für die „Zurück“-Geste abgeschlossen."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Startbildschirm"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Du kannst jederzeit zum Startbildschirm gehen, indem du mit drei Fingern vom unteren Displayrand nach oben wischst."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Sehr gut!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Du hast den Schritt für die „Startbildschirm“-Geste abgeschlossen."</string>
-    <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
     <skip />
-    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
     <skip />
-    <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
     <skip />
-    <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
+    <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Letzte Apps aufrufen"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
     <skip />
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Aktionstaste"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Wenn du auf deine Apps zugreifen möchtest, drücke auf der Tastatur die Aktionstaste."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Glückwunsch!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Du hast den Schritt für die „Aktionstaste“-Geste abgeschlossen.\n\nAktion + / zeigt alle verfügbaren Tastenkombinationen."</string>
+    <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Gut gemacht!"</string>
+    <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Du hast das Tutorial für die Touch-Geste zum Aufrufen der zuletzt verwendeten Apps abgeschlossen."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Tastaturbeleuchtung"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d von %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Smart-Home-Steuerung"</string>
@@ -1444,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Wenn du alle deine Apps aufrufen möchtest, drücke auf der Tastatur die Aktionstaste"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Entfernt"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Zum Ansehen entsperren"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontextbezogene Informationen"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Über das Touchpad zurückgehen"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Wische mit drei Fingern nach links oder rechts. Tippe für mehr Infos zu Touch-Gesten."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Über das Touchpad zum Startbildschirm zurückkehren"</string>
@@ -1452,14 +1459,10 @@
     <string name="overview_edu_notification_content" msgid="3578204677648432500">"Wische mit 3 Fingern nach oben und halte das Touchpad gedrückt. Tippe für mehr Infos zu Touch-Gesten."</string>
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"Über die Tastatur alle Apps aufrufen"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Du kannst jederzeit die Aktionstaste drücken. Tippe für mehr Infos zu Touch-Gesten."</string>
-    <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
-    <skip />
-    <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
-    <skip />
-    <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
-    <skip />
-    <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
-    <skip />
+    <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"„Extradunkel“ jetzt Teil des Schiebereglers für die Helligkeit"</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Du kannst das Display jetzt extradunkel machen, indem du die Helligkeit noch weiter senkst.\n\nDa diese Funktion jetzt Teil des Schiebereglers für die Helligkeit ist, werden die „Extradunkel“-Kurzbefehle entfernt."</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"„Extradunkel“-Kurzbefehle entfernen"</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Kurzbefehle für „Extradunkel“ entfernt"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Konnektivität"</string>
     <string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Bedienungshilfen"</string>
     <string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Dienstprogramme"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 2187a17..3c99fbb 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Ενεργό"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Ενεργή • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Ανενεργό"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Ρύθμιση"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Διαχείριση στις ρυθμίσεις"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Δεν υπάρχει ενεργή λειτουργία}=1{{mode} ενεργή λειτουργία}other{# ενεργές λειτουργίες}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Δεν θα ενοχλείστε από ήχους και δονήσεις, παρά μόνο από ξυπνητήρια, υπενθυμίσεις, συμβάντα και καλούντες που έχετε καθορίσει. Θα εξακολουθείτε να ακούτε όλο το περιεχόμενο που επιλέγετε να αναπαραγάγετε, συμπεριλαμβανομένης της μουσικής, των βίντεο και των παιχνιδιών."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Συζητήσεις"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Διαγραφή όλων των ειδοποιήσεων σε σίγαση"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Οι ειδοποιήσεις τέθηκαν σε παύση από τη λειτουργία \"Μην ενοχλείτε\""</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Δεν υπάρχουν ειδοποιήσεις}=1{Οι ειδοποιήσεις τέθηκαν σε παύση από τη λειτουργία {mode}}=2{Οι ειδοποιήσεις τέθηκαν σε παύση από τη λειτουργία {mode} και μία άλλη λειτουργία}other{Οι ειδοποιήσεις τέθηκαν σε παύση από τη λειτουργία {mode} και # άλλες λειτουργίες}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Έναρξη τώρα"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Δεν υπάρχουν ειδοποιήσεις"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Δεν υπάρχουν νέες ειδοποιήσεις"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Εμφάνιση λειτουργίας επίδειξης"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Ξυπνητήρι"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"Η λειτουργία <xliff:g id="MODENAME">%1$s</xliff:g> είναι ενεργή"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Πορτοφόλι"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Ολοκληρώστε τη ρύθμιση για να κάνετε πιο γρήγορες και πιο ασφαλείς αγορές με το τηλέφωνό σας"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Εμφάνιση όλων"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Ηχεία και οθόνες"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Προτεινόμενες συσκευές"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Είσοδος"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Έξοδος"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Διακόψτε την κοινόχρηστη περίοδο λειτουργίας για να μεταφέρετε μέσα σε άλλη συσκευή"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Διακοπή"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Πώς λειτουργεί η μετάδοση"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Εικονίδιο σύμπτυξης"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Εικονίδιο ανάπτυξης"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ή"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Λαβή μεταφοράς"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Πλοήγηση με το πληκτρολόγιο"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Μάθετε συντομεύσεις πληκτρολογίου"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Πλοήγηση με την επιφάνεια αφής"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Μάθετε κινήσεις επιφάνειας αφής"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Πλοήγηση με το πληκτρολόγιο και την επιφάνεια αφής"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Μάθετε κινήσεις επιφάνειας αφής, συντομεύσεις πληκτρολογίου και άλλα"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Κίνηση επιστροφής"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Κίνηση μετάβασης στην αρχική οθόνη"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Προβολή πρόσφατων εφαρμογών"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Τέλος"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Επιστροφή"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Για να επιστρέψετε, σύρετε προς τα αριστερά ή προς τα δεξιά χρησιμοποιώντας τρία δάχτυλα σε οποιοδήποτε σημείο της επιφάνειας αφής.\n\nΜπορείτε επίσης να χρησιμοποιήσετε τη συντόμευση πληκτρολογίου Action + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Μπράβο!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Ολοκληρώσατε την κίνηση επιστροφής."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Αρχική"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Για μετάβαση στην αρχική οθόνη ανά πάσα στιγμή, σύρετε προς τα επάνω με τρία δάχτυλα από το κάτω μέρος της οθόνης."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Ωραία!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Ολοκληρώσατε την κίνηση μετάβασης στην αρχική οθόνη."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Προβολή πρόσφατων εφαρμογών"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Σύρετε προς τα πάνω με τρία δάχτυλα στην επιφάνεια αφής και μην τα σηκώσετε."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Μπράβο!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Ολοκληρώσατε την κίνηση για την προβολή πρόσφατων εφαρμογών."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Πλήκτρο ενέργειας"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Για να αποκτήσετε πρόσβαση στις εφαρμογές σας, πατήστε το πλήκτρο ενέργειας στο πληκτρολόγιό σας."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Συγχαρητήρια!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Ολοκληρώσατε την κίνηση του κουμπιού ενέργειας.\n\nΗ ενέργεια + / εμφανίζει όλες τις διαθέσιμες συντομεύσεις."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Οπίσθιος φωτισμός πληκτρολογίου"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Επίπεδο %1$d από %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Οικιακοί έλεγχοι"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Για να δείτε όλες τις εφαρμογές, πιέστε το πλήκτρο ενέργειας στο πληκτρολόγιό σας"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Αποκρύφτηκε"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Ξεκλείδωμα για προβολή"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Εκπαίδευση με βάση τα συμφραζόμενα"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Χρήση της επιφάνειας αφής για επιστροφή"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Σύρετε προς τα αριστερά ή τα δεξιά με τρία δάχτυλα. Πατήστε για να μάθετε περισσότερες κινήσεις."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Χρήση της επιφάνειας αφής για μετάβαση στην αρχική οθόνη"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 3a961e2..4570c0a 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"On"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"On • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Off"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Set up"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Manage in settings"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{No active modes}=1{{mode} is active}other{# modes are active}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers you specify. You\'ll still hear anything you choose to play including music, videos and games."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No notifications}=1{Notifications paused by {mode}}=2{Notifications paused by {mode} and one other mode}other{Notifications paused by {mode} and # other modes}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"No notifications"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"No new notifications"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Show demo mode"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> is on"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Get set up to make faster, more secure purchases with your phone"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Show all"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Drag handle"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigate using your keyboard"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Learn keyboards shortcuts"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigate using your touchpad"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Learn touchpad gestures"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigate using your keyboard and touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Learn touchpad gestures, keyboards shortcuts and more"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Back gesture"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Home gesture"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"View recent apps"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Done"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"To go back, swipe left or right using three fingers anywhere on the touchpad.\n\nYou can also use the keyboard shortcut Action + Esc for this."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Great work!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"You completed the go back gesture."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Go home"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"To go to your home screen at any time, swipe up with three fingers from the bottom of your screen."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Nice!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"You completed the go home gesture."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"View recent apps"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Swipe up and hold using three fingers on your touchpad."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Well done!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"You completed the view recent apps gesture."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Action key"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"To access your apps, press the action key on your keyboard."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Congratulations!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"You completed the action key gesture.\n\nAction + / shows all the shortcuts that you have available."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Home controls"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"To view all your apps, press the action key on your keyboard"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Redacted"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Unlock to view"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Contextual education"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Use your touchpad to go back"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Swipe left or right using three fingers. Tap to learn more gestures."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Use your touchpad to go home"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index ba71ccf..3d33fa0 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -440,7 +440,7 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"On"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"On • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Off"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Set up"</string>
+    <string name="zen_mode_set_up" msgid="8231201163894922821">"Not set"</string>
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Manage in settings"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{No active modes}=1{{mode} is active}other{# modes are active}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events, and callers you specify. You\'ll still hear anything you choose to play including music, videos, and games."</string>
@@ -573,6 +573,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No notifications}=1{Notifications paused by {mode}}=2{Notifications paused by {mode} and one other mode}other{Notifications paused by {mode} and # other modes}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"No notifications"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"No new notifications"</string>
@@ -704,6 +705,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Show demo mode"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> is on"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Get set up to make faster, more secure purchases with your phone"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Show all"</string>
@@ -1403,26 +1405,26 @@
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Learn touchpad gestures"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigate using your keyboard and touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Learn touchpad gestures, keyboards shortcuts, and more"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Back gesture"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Home gesture"</string>
+    <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Go back"</string>
+    <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Go home"</string>
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"View recent apps"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Done"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"To go back, swipe left or right using three fingers anywhere on the touchpad.\n\nYou can also use the keyboard shortcut Action + ESC for this."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Great job!"</string>
+    <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Swipe left or right using three fingers on your touchpad"</string>
+    <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Nice!"</string>
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"You completed the go back gesture."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Go home"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"To go to your home screen at any time, swipe up with three fingers from the bottom of your screen."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Nice!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"You completed the go home gesture."</string>
+    <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Swipe up with three fingers on your touchpad"</string>
+    <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Great job!"</string>
+    <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"You completed the go home gesture"</string>
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"View recent apps"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Swipe up and hold using three fingers on your touchpad."</string>
+    <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Swipe up and hold using three fingers on your touchpad"</string>
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Great job!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"You completed the view recent apps gesture."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Action key"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"To access your apps, press the action key on your keyboard."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Congratulations!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"You completed the action key gesture.\n\nAction + / shows all the shortcuts you have available."</string>
+    <string name="tutorial_action_key_title" msgid="8172535792469008169">"View all apps"</string>
+    <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Press the action key on your keyboard"</string>
+    <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Well done!"</string>
+    <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"You completed the view all apps gesture"</string>
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Home Controls"</string>
@@ -1434,6 +1436,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"To view all your apps, press the action key on your keyboard"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Redacted"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Unlock to view"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Contextual education"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Use your touchpad to go back"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Swipe left or right using three fingers. Tap to learn more gestures."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Use your touchpad to go home"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 3a961e2..4570c0a 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"On"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"On • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Off"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Set up"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Manage in settings"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{No active modes}=1{{mode} is active}other{# modes are active}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers you specify. You\'ll still hear anything you choose to play including music, videos and games."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No notifications}=1{Notifications paused by {mode}}=2{Notifications paused by {mode} and one other mode}other{Notifications paused by {mode} and # other modes}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"No notifications"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"No new notifications"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Show demo mode"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> is on"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Get set up to make faster, more secure purchases with your phone"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Show all"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Drag handle"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigate using your keyboard"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Learn keyboards shortcuts"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigate using your touchpad"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Learn touchpad gestures"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigate using your keyboard and touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Learn touchpad gestures, keyboards shortcuts and more"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Back gesture"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Home gesture"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"View recent apps"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Done"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"To go back, swipe left or right using three fingers anywhere on the touchpad.\n\nYou can also use the keyboard shortcut Action + Esc for this."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Great work!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"You completed the go back gesture."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Go home"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"To go to your home screen at any time, swipe up with three fingers from the bottom of your screen."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Nice!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"You completed the go home gesture."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"View recent apps"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Swipe up and hold using three fingers on your touchpad."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Well done!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"You completed the view recent apps gesture."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Action key"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"To access your apps, press the action key on your keyboard."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Congratulations!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"You completed the action key gesture.\n\nAction + / shows all the shortcuts that you have available."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Home controls"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"To view all your apps, press the action key on your keyboard"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Redacted"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Unlock to view"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Contextual education"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Use your touchpad to go back"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Swipe left or right using three fingers. Tap to learn more gestures."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Use your touchpad to go home"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 3a961e2..4570c0a 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"On"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"On • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Off"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Set up"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Manage in settings"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{No active modes}=1{{mode} is active}other{# modes are active}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers you specify. You\'ll still hear anything you choose to play including music, videos and games."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No notifications}=1{Notifications paused by {mode}}=2{Notifications paused by {mode} and one other mode}other{Notifications paused by {mode} and # other modes}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"No notifications"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"No new notifications"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Show demo mode"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> is on"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Get set up to make faster, more secure purchases with your phone"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Show all"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Drag handle"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigate using your keyboard"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Learn keyboards shortcuts"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigate using your touchpad"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Learn touchpad gestures"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigate using your keyboard and touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Learn touchpad gestures, keyboards shortcuts and more"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Back gesture"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Home gesture"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"View recent apps"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Done"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"To go back, swipe left or right using three fingers anywhere on the touchpad.\n\nYou can also use the keyboard shortcut Action + Esc for this."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Great work!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"You completed the go back gesture."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Go home"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"To go to your home screen at any time, swipe up with three fingers from the bottom of your screen."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Nice!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"You completed the go home gesture."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"View recent apps"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Swipe up and hold using three fingers on your touchpad."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Well done!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"You completed the view recent apps gesture."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Action key"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"To access your apps, press the action key on your keyboard."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Congratulations!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"You completed the action key gesture.\n\nAction + / shows all the shortcuts that you have available."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Home controls"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"To view all your apps, press the action key on your keyboard"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Redacted"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Unlock to view"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Contextual education"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Use your touchpad to go back"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Swipe left or right using three fingers. Tap to learn more gestures."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Use your touchpad to go home"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index eb76a7e..3d157c7 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -440,7 +440,7 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‏‎‏‏‏‏‏‎‎‏‎‏‏‎‎‏‏‏‎‎‏‎‏‎‎‎‎‏‎‎‏‎‎‎‏‎‏‎‎‏‏‏‎‎‏‏‏‏‏‎On‎‏‎‎‏‎"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‎‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‏‎‏‎‎‏‎‎‏‎On • ‎‏‎‎‏‏‎<xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‏‏‎‎‏‏‎‏‎‏‎‎‎‏‎‎‎‏‏‎‏‎‏‏‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎Off‎‏‎‎‏‎"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‏‎‏‏‏‎‏‎‎‎‎‎‎Set up‎‏‎‎‏‎"</string>
+    <string name="zen_mode_set_up" msgid="8231201163894922821">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‎‎‎‏‏‎‎‏‏‏‎‏‏‎‎‏‎‎‎‎‏‎‎‎‏‎‏‏‏‏‎‏‎‎‎‏‏‏‏‎‎‏‎‎‎‏‎‏‎Not set‎‏‎‎‏‎"</string>
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‎‎‎Manage in settings‎‏‎‎‏‎"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‎‏‎‏‏‏‎‎‏‎‏‎‏‎‏‏‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎‎No active modes‎‏‎‎‏‎}=1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‎‏‎‏‏‏‎‎‏‎‏‎‏‎‏‏‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎‎‎‏‎‎‏‏‎{mode}‎‏‎‎‏‏‏‎ is active‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‎‏‎‏‏‏‎‎‏‎‏‎‏‎‏‏‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎‎# modes are active‎‏‎‎‏‎}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‏‎‎‎‏‎‏‏‎‏‏‏‏‎‏‎‎‏‏‎‎You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events, and callers you specify. You\'ll still hear anything you choose to play including music, videos, and games.‎‏‎‎‏‎"</string>
@@ -573,6 +573,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‎‎‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎Conversations‎‏‎‎‏‎"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‏‏‎Clear all silent notifications‎‏‎‎‏‎"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‏‎‏‎‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎‏‏‎‎‏‎‏‎‏‎‎Notifications paused by Do Not Disturb‎‏‎‎‏‎"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎‎‏‏‎‎‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‎‎‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎No notifications‎‏‎‎‏‎}=1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎‎‏‏‎‎‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‎‎‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎Notifications paused by ‎‏‎‎‏‏‎{mode}‎‏‎‎‏‏‏‎‎‏‎‎‏‎}=2{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎‎‏‏‎‎‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‎‎‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎Notifications paused by ‎‏‎‎‏‏‎{mode}‎‏‎‎‏‏‏‎ and one other mode‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎‎‏‏‎‎‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‎‎‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎Notifications paused by ‎‏‎‎‏‏‎{mode}‎‏‎‎‏‏‏‎ and # other modes‎‏‎‎‏‎}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‏‏‎‏‎‎‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‎‎Start now‎‏‎‎‏‎"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‎‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‎‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‏‎‎‎No notifications‎‏‎‎‏‎"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‏‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‏‎‎No new notifications‎‏‎‎‏‎"</string>
@@ -704,6 +705,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‎‏‎‏‎‏‎‏‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‎‎‏‎‎‎‏‏‎‏‎‏‏‎‏‏‏‎‎‎‏‏‏‎‎Show demo mode‎‏‎‎‏‎"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‎‏‎‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎‎‎‎‏‏‏‏‎‎‎Ethernet‎‏‎‎‏‎"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‏‏‎‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‏‎‎‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎Alarm‎‏‎‎‏‎"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="MODENAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is on‎‏‎‎‏‎"</string>
     <string name="wallet_title" msgid="5369767670735827105">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‎‏‎‎‏‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‏‎‏‎‏‏‏‏‏‎‎‎‎‏‎‏‎‎‎‎‏‎Wallet‎‏‎‎‏‎"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‎‎‏‎‎‏‏‎‎‏‎‎‎‏‎‏‎‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‏‏‎‏‎‎Get set up to make faster, more secure purchases with your phone‎‏‎‎‏‎"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‎‏‏‎‏‎‎‏‎‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‏‎‎‎‎‎Show all‎‏‎‎‏‎"</string>
@@ -1403,26 +1405,26 @@
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‎‏‎‏‎‎‎‎‏‎‏‏‏‏‎‎‎‎‎‎‏‎‎‏‎‏‎‎Learn touchpad gestures‎‏‎‎‏‎"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‎‏‏‎‎‏‎‏‎‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‏‏‏‏‎‎‎‏‎‎‏‎‎‎‏‏‎‏‎‏‎‎Navigate using your keyboard and touchpad‎‏‎‎‏‎"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‏‎‏‏‎‎‏‏‎‏‎‎‎‎‎‎‏‏‎‏‏‎‎‎‏‎‎‏‏‎‏‏‏‏‏‎‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‎‏‎Learn touchpad gestures, keyboards shortcuts, and more‎‏‎‎‏‎"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‏‏‏‎‎‏‏‏‎‏‏‎‏‎‎‏‏‎‏‏‎‏‏‎‏‎‏‎‏‎‏‏‏‎‎‎‎‎‏‏‎‏‎‎Back gesture‎‏‎‎‏‎"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‎‏‏‎‎‏‎‏‎‏‎‎‎‏‏‏‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎Home gesture‎‏‎‎‏‎"</string>
+    <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‎‎‎‎‎‏‏‏‏‎‏‏‎‏‏‎Go back‎‏‎‎‏‎"</string>
+    <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‎‏‎‎‏‎‎‎‎‎‎‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‏‎‎‎‎Go home‎‏‎‎‏‎"</string>
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‏‏‏‎‎‏‎‏‎‏‏‏‏‏‎View recent apps‎‏‎‎‏‎"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‎‎‎‏‎‎‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‏‎‏‏‎‏‎‎‎‏‏‏‎‎‏‏‎‏‏‏‏‎Done‎‏‎‎‏‎"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‏‏‎‎‎‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‎‏‏‎‎‏‎‎‎‏‏‏‎‎‏‏‏‏‏‏‎Go back‎‏‎‎‏‎"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‎‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‎‎‎‏‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎To go back, swipe left or right using three fingers anywhere on the touchpad.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎You can also use the keyboard shortcut Action + ESC for this.‎‏‎‎‏‎"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‎‎‏‏‎‎‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‏‎Great job!‎‏‎‎‏‎"</string>
+    <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‎‏‏‏‎‏‎‎‎‏‎‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎Swipe left or right using three fingers on your touchpad‎‏‎‎‏‎"</string>
+    <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎Nice!‎‏‎‎‏‎"</string>
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‎‎‎‎‏‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‏‏‏‏‎‏‎‏‎‏‏‏‎You completed the go back gesture.‎‏‎‎‏‎"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‎‏‎‏‎‏‏‎‎‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‎Go home‎‏‎‎‏‎"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎‏‏‎‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‎‎‎‏‏‎‏‎‎‎‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‏‎‎To go to your home screen at any time, swipe up with three fingers from the bottom of your screen.‎‏‎‎‏‎"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‎‏‏‎‏‎‏‏‎‏‏‏‎‎‏‎‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‎‎‎‏‏‎Nice!‎‏‎‎‏‎"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‏‎‎‏‏‎‎‎‏‏‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‎You completed the go home gesture.‎‏‎‎‏‎"</string>
+    <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‎‏‏‎‏‎‏‎‏‎‎‎‏‏‏‎‎‏‏‎‎‏‎‏‏‏‏‎‏‏‏‏‏‎‏‏‎Swipe up with three fingers on your touchpad‎‏‎‎‏‎"</string>
+    <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‎‎‎‏‏‎‎Great job!‎‏‎‎‏‎"</string>
+    <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‎‏‏‎‎‎‏‏‏‏‎‏‏‎‏‏‏‎‎‎‎‎‎‎‎‎‏‏‎‎‏‏‎You completed the go home gesture‎‏‎‎‏‎"</string>
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‏‏‎‎‎‎‎‏‎‏‏‏‎‎‏‎‎View recent apps‎‏‎‎‏‎"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‎‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎Swipe up and hold using three fingers on your touchpad.‎‏‎‎‏‎"</string>
+    <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‏‏‎‎‏‎‎‎‏‎‏‏‏‎‎‏‎‎‏‏‏‎‎Swipe up and hold using three fingers on your touchpad‎‏‎‎‏‎"</string>
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‏‏‏‎‏‎‏‎‏‏‏‎‎‏‏‏‎‎‎‎‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎Great job!‎‏‎‎‏‎"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‎‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎‎‎‎‎‏‏‏‎‏‏‎‎‎‏‏‎‎‏‎You completed the view recent apps gesture.‎‏‎‎‏‎"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‎‏‎‎‎‎‏‎‏‎‎‏‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‎‎‎‏‎‏‎‏‏‏‎Action key‎‏‎‎‏‎"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‏‏‎‎‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‏‎‎‎To access your apps, press the action key on your keyboard.‎‏‎‎‏‎"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‎‏‏‏‎‏‏‎‎‏‏‎‎‎‏‎‎‎‏‏‏‏‎‎‏‎‎‏‎‏‎Congratulations!‎‏‎‎‏‎"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‏‎‎‏‎‏‏‏‎‏‏‎‎‏‎‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‏‏‏‏‏‎‎You completed the action key gesture.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Action + / shows all the shortcuts you have available.‎‏‎‎‏‎"</string>
+    <string name="tutorial_action_key_title" msgid="8172535792469008169">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‏‎‏‎‏‎‏‎‏‏‏‎‎‎‎‎‎‎‎‎‏‏‎‏‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎View all apps‎‏‎‎‏‎"</string>
+    <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‎‏‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎Press the action key on your keyboard‎‏‎‎‏‎"</string>
+    <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‏‎‎‎‎‏‎‏‎‎‎‎‎‎‏‏‎‎‏‏‎Well done!‎‏‎‎‏‎"</string>
+    <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‎‎‎‎‎‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‏‏‎‏‎‎‎‏‎‎‎‏‎‎‎‎You completed the view all apps gesture‎‏‎‎‏‎"</string>
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‎‏‏‎‎‏‏‎‎‏‎‏‏‏‎‎‎‏‏‎‏‎‎‎Keyboard backlight‎‏‎‎‏‎"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎Level %1$d of %2$d‎‏‎‎‏‎"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‏‎‏‏‎‏‎‎‎‎‏‎Home Controls‎‏‎‎‏‎"</string>
@@ -1434,6 +1436,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‎‏‎‎‎‎‏‏‎‎‎‏‏‎‎‏‎‏‎‏‎‎To view all your apps, press the action key on your keyboard‎‏‎‎‏‎"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‎‎‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‎‎‎‏‏‏‏‎‎‏‏‎‎Redacted‎‏‎‎‏‎"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‎‏‎Unlock to view‎‏‎‎‏‎"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‎‏‏‏‎‏‎‏‎‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‏‏‎‏‏‏‎‎‎Contextual education‎‏‎‎‏‎"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‎‏‎‏‏‏‏‎‎Use your touchpad to go back‎‏‎‎‏‎"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‏‏‎‏‎‎‎‏‎‏‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎Swipe left or right using three fingers. Tap to learn more gestures.‎‏‎‎‏‎"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‎‎‎‎‎‎‎‎‏‏‎‎‏‏‎‏‎‎‎‎‏‏‎‎‎‎‎‎‏‎‏‎‏‎‎‎‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‎‏‎Use your touchpad to go home‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index b1d0c23..6c80a2c 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Activado"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Sí • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Desactivado"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Configurar"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Administrar en configuración"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{No hay modos activos}=1{{mode} está activo}many{# de modos están activos}other{# modos están activos}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"No te molestarán los sonidos ni las vibraciones, excepto las alarmas, los recordatorios, los eventos y las llamadas de los emisores que especifiques. Podrás escuchar el contenido que reproduzcas, como música, videos y juegos."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas las notificaciones silenciosas"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificaciones pausadas por el modo \"No interrumpir\""</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No hay notificaciones}=1{{mode} pausó las notificaciones}=2{{mode} y un modo más pausaron las notificaciones}many{{mode} y # de modos más pausaron las notificaciones}other{{mode} y # modos más pausaron las notificaciones}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Comenzar ahora"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"No hay notificaciones"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"No hay notificaciones nuevas"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Ver en modo de demostración"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarma"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> activado"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Billetera"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Prepárate para realizar compras rápidas y seguras con tu teléfono"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Mostrar todo"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Bocinas y pantallas"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Dispositivos sugeridos"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Entrada"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Salida"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Detiene la sesión de uso compartido para transferir contenido multimedia a otro dispositivo"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Detener"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cómo funciona la transmisión"</string>
@@ -1293,8 +1294,7 @@
     <string name="add" msgid="81036585205287996">"Agregar"</string>
     <string name="manage_users" msgid="1823875311934643849">"Administrar usuarios"</string>
     <string name="drag_split_not_supported" msgid="7173481676120546121">"Esta notificación no admite arrastrar entre pantallas divididas"</string>
-    <!-- no translation found for dream_overlay_location_active (6484763493158166618) -->
-    <skip />
+    <string name="dream_overlay_location_active" msgid="6484763493158166618">"Ubicación activa"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"La red Wi-Fi no está disponible"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modo prioridad"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Se estableció la alarma"</string>
@@ -1351,8 +1351,7 @@
     <string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar pantalla de bloqueo"</string>
     <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desbloquea para personalizar la pantalla de bloqueo"</string>
     <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi no disponible"</string>
-    <!-- no translation found for location_active_dream_overlay_content_description (6208885541020673916) -->
-    <skip />
+    <string name="location_active_dream_overlay_content_description" msgid="6208885541020673916">"Ubicación activa"</string>
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"La cámara está bloqueada"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"La cámara y el micrófono están bloqueados"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"El micrófono está bloqueado"</string>
@@ -1400,39 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícono de contraer"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícono de expandir"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Controlador de arrastre"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navega con el teclado"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprende combinaciones de teclas"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navega con el panel táctil"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Aprende los gestos del panel táctil"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navega con el teclado y el panel táctil"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprende sobre los gestos del panel táctil, las combinaciones de teclas y mucho más"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto atrás"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto para ir a la pantalla principal"</string>
-    <!-- no translation found for touchpad_tutorial_recent_apps_gesture_button (8919227647650347359) -->
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
     <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
+    <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver apps recientes"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Listo"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Atrás"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Para volver, desliza tres dedos hacia la derecha o la izquierda en cualquier lugar del panel táctil.\n\nPara completar esta acción, también puedes usar la combinación de teclas Action + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"¡Bien hecho!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Completaste el gesto para ir atrás."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ir a la página principal"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Para ir a la pantalla principal en cualquier momento, desliza hacia arriba desde la parte inferior de la pantalla con tres dedos."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"¡Muy bien!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Completaste el gesto para ir al inicio."</string>
-    <!-- no translation found for touchpad_recent_apps_gesture_action_title (934906836867137906) -->
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
     <skip />
-    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6012057247259983871) -->
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
     <skip />
-    <!-- no translation found for touchpad_recent_apps_gesture_success_title (8481920554139332593) -->
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
     <skip />
-    <!-- no translation found for touchpad_recent_apps_gesture_success_body (4334263906697493273) -->
+    <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver apps recientes"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
     <skip />
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tecla de acción"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Para acceder a las apps, presiona la tecla de acción en el teclado."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"¡Felicitaciones!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Completaste el gesto de la tecla de acción.\n\nSi presionas las teclas Acción + /, se muestran todas las combinaciones de teclas disponibles."</string>
+    <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"¡Bien hecho!"</string>
+    <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Completaste el gesto para ver las apps recientes."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroiluminación del teclado"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivel %1$d de %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Controles de la casa"</string>
@@ -1444,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Para ver todas las apps, presiona la tecla de acción en el teclado"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Oculto"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Desbloquea el dispositivo para ver"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Educación contextual"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Usa el panel táctil para ir hacia atrás"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Desliza hacia la izquierda o la derecha con tres dedos. Presiona para aprender más gestos."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Usa el panel táctil para ir a la pantalla principal"</string>
@@ -1452,14 +1458,10 @@
     <string name="overview_edu_notification_content" msgid="3578204677648432500">"Desliza hacia arriba con tres dedos y mantenlos presionados. Presiona para aprender más gestos."</string>
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"Usa el teclado para ver todas las apps"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Presiona la tecla de acción en cualquier momento. Presiona para aprender más gestos."</string>
-    <!-- no translation found for accessibility_deprecate_extra_dim_dialog_title (910988771011857460) -->
-    <skip />
-    <!-- no translation found for accessibility_deprecate_extra_dim_dialog_description (4453123359258743230) -->
-    <skip />
-    <!-- no translation found for accessibility_deprecate_extra_dim_dialog_button (3947537827396916005) -->
-    <skip />
-    <!-- no translation found for accessibility_deprecate_extra_dim_dialog_toast (165474092660941104) -->
-    <skip />
+    <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"La atenuación extra ahora es parte del control deslizante de brillo"</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Ahora puedes bajar el nivel del brillo de la pantalla para atenuarla aún más.\n\nComo esta función ahora es parte del control deslizante de brillo, se quitaron los accesos directos a la atenuación extra."</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Quitar accesos directos a la atenuación extra"</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Se quitaron los accesos directos a la atenuación extra"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Conectividad"</string>
     <string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Accesibilidad"</string>
     <string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Utilidades"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 21b42ad..f77119e 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Activado"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Activado • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Desactivado"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Configurar"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Gestionar en los ajustes"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{No hay modos activos}=1{{mode} está activo}many{Hay # modos activos}other{Hay # modos activos}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"No te molestarán los sonidos ni las vibraciones, excepto las alarmas, los recordatorios, los eventos y las llamadas que especifiques. Seguirás escuchando el contenido que quieras reproducir, como música, vídeos y juegos."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas las notificaciones silenciosas"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificaciones pausadas por el modo No molestar"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{No hay notificaciones}=1{Notificaciones pausadas por {mode}}=2{Notificaciones pausadas por {mode} y un modo más}many{Notificaciones pausadas por {mode} y # modos más}other{Notificaciones pausadas por {mode} y # modos más}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Empezar ahora"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"No hay notificaciones"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"No hay notificaciones nuevas"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Mostrar modo Demo"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarma"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> activado"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Configura un método de pago para comprar de forma más rápida y segura con tu teléfono"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Mostrar todo"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Altavoces y pantallas"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Dispositivos sugeridos"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Entrada"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Salida"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Detén tu sesión compartida para transferir el contenido multimedia a otro dispositivo"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Detener"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cómo funciona la emisión"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icono de contraer"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icono de desplegar"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Controlador de arrastre"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Desplázate con el teclado"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprende combinaciones de teclas"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Desplázate con el panel táctil"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Aprende gestos del panel táctil"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Desplázate con el teclado y el panel táctil"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprende gestos del panel táctil, combinaciones de teclas y más"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto para volver"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto para ir al inicio"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver aplicaciones recientes"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hecho"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Atrás"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Para volver, desliza con tres dedos hacia la izquierda o la derecha en cualquier parte del panel táctil.\n\nTambién puedes hacerlo con la combinación de teclas asignada + Esc."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"¡Bien hecho!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Has completado el gesto para volver."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ir a Inicio"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Para ir a la pantalla de inicio en cualquier momento, desliza hacia arriba con tres dedos desde la parte inferior de la pantalla."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"¡Muy bien!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Has completado el gesto para ir a la pantalla de inicio."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver aplicaciones recientes"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Desliza tres dedos hacia arriba y mantén pulsado en el panel táctil."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"¡Bien hecho!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Has completado el gesto para ver las aplicaciones recientes."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tecla de acción"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Para acceder a tus aplicaciones, pulsa la tecla de acción de tu teclado."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"¡Enhorabuena!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Has completado el gesto de la tecla de acción.\n\nLa combinación de teclas Acción + / muestra todas las combinaciones de teclas que tienes disponibles."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroiluminación del teclado"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivel %1$d de %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Controles de la casa"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Para ver todas tus aplicaciones, pulsa la tecla de acción de tu teclado"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Oculta"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Desbloquea para ver"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Educación contextual"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Usa el panel táctil para volver atrás"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Desliza hacia la izquierda o hacia la derecha con tres dedos. Toca para aprender a usar más gestos."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Usa el panel táctil para ir a la pantalla de inicio"</string>
@@ -1446,7 +1459,7 @@
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"Usa el teclado para ver todas las aplicaciones"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Pulsa la tecla de acción en cualquier momento. Toca para aprender a usar más gestos."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"La atenuación extra ahora forma parte del control deslizante de brillo"</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Ahora puedes atenuar aún más tu pantalla reduciendo el nivel de brillo incluso más todavía.\n\nComo esta función ahora forma parte del control deslizante de brillo, se van a quitar los accesos directos de atenuación extra."</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Ahora puedes atenuar aún más tu pantalla reduciendo el nivel de brillo.\n\nComo esta función ahora forma parte del control deslizante de brillo, se van a quitar los accesos directos de atenuación extra."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Eliminar accesos directos de atenuación extra"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Accesos directos de atenuación extra eliminados"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Conectividad"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index c1807ad..3323a3f 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Sees"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Sees • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Väljas"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Seadistamine"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Seadetes halamine"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Aktiivsed režiimid puuduvad}=1{{mode} on aktiivne}other{# režiimi on aktiivsed}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Helid ja värinad ei sega teid. Kuulete siiski enda määratud äratusi, meeldetuletusi, sündmusi ja helistajaid. Samuti kuulete kõike, mille esitamise ise valite, sh muusika, videod ja mängud."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Vestlused"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Kustuta kõik hääletud märguanded"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Režiim Mitte segada peatas märguanded"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Märguandeid pole}=1{{mode} peatas märguanded}=2{{mode} ja veel üks režiim peatasid märguanded}other{{mode} ja veel # režiimi peatasid märguanded}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Alusta kohe"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Märguandeid pole"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Uusi märguandeid ei ole"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Kuva demorežiim"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Äratus"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> on sisse lülitatud"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Seadistage kiirem ja turvalisem viis telefoniga ostmiseks"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Kuva kõik"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Kõlarid ja ekraanid"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Soovitatud seadmed"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Sisend"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Väljund"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Peatage jagatud seanss, et meedia teise seadmesse teisaldada"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Peata"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kuidas ülekandmine toimib?"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ahendamisikoon"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Laiendamisikoon"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"või"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Lohistamispide"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigeerige klaviatuuri abil"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Õppige klaviatuuri otseteid"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigeerige puuteplaadi abil"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Õppige puuteplaadi liigutusi"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigeerige klaviatuuri ja puuteplaadi abil"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Õppige puuteplaadi liigutusi, klaviatuuri otseteid ja palju muud"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Tagasiliikumisliigutus"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Avakuvale liikumise liigutus"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Hiljutiste rakenduste vaatamine"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Valmis"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Tagasi"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Tagasiliikumiseks pühkige puuteplaadil kolme sõrmega vasakule või paremale.\n\nSamuti saate selle jaoks kasutada klaviatuuri otseteed toiminguklahv + paoklahv."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Väga hea!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Tegite tagasiliikumise liigutuse."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Avalehele"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Mis tahes ajal avakuvale liikumiseks pühkige kolme sõrmega ekraanikuva allosast üles."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Hästi tehtud!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Tegite avakuvale minemise liigutuse."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Hiljutiste rakenduste vaatamine"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Pühkige üles ja hoidke kolme sõrmega puuteplaadil."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Väga hea!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Lõpetasite hiljutiste rakenduste vaatamise liigutuse."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Toiminguklahv"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Rakendustele juurdepääsemiseks vajutage klaviatuuril toiminguklahvi."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Õnnitleme!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Tegite toiminguklahvi liigutuse.\n\nKombinatsiooni toiminguklahv + / vajutamisel kuvatakse kõik saadaolevad otseteed."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klaviatuuri taustavalgustus"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Tase %1$d/%2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Kodu juhtelemendid"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Kõigi oma rakenduste kuvamiseks vajutage klaviatuuril toiminguklahvi"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Peidetud"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Vaatamiseks avage"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontekstipõhised õpetused"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Puuteplaadi kasutamine tagasiliikumiseks"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Pühkige kolme sõrmega vasakule või paremale. Puudutage žestide kohta lisateabe saamiseks."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Puuteplaadi kasutamine avakuvale liikumiseks"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 50a55f9..246c230 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Aktibatuta"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Aktibo • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Desaktibatuta"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Konfiguratu"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Kudeatu ezarpenetan"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Ez dago modurik aktibo}=1{\"{mode}\" aktibo dago}other{# modu aktibo daude}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Gailuak ez du egingo ez soinurik ez dardararik, baina alarmak, gertaera eta abisuen tonuak, eta aukeratzen dituzun deitzaileen dei-tonuak joko ditu. Bestalde, zuk erreproduzitutako guztia entzungo duzu, besteak beste, musika, bideoak eta jokoak."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Elkarrizketak"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Garbitu soinurik gabeko jakinarazpen guztiak"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ez molestatzeko moduak pausatu egin ditu jakinarazpenak"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Ez dago jakinarazpenik}=1{Modu honek jakinarazpenak pausatu ditu: {mode}}=2{Modu honek eta beste modu batek jakinarazpenak pausatu dituzte: {mode}}other{Modu honek eta beste # moduk jakinarazpenak pausatu dituzte: {mode}}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Hasi"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Ez dago jakinarazpenik"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Ez dago jakinarazpen berririk"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Erakutsi demo modua"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarma"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Diru-zorroa"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Konfiguratu erosketa bizkorrago eta seguruagoak egiteko telefonoarekin"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Erakutsi guztiak"</string>
@@ -1179,10 +1183,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"%% <xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Bozgorailuak eta pantailak"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Iradokitako gailuak"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Sarrera"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Irteera"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Gelditu partekatutako saioa multimedia-edukia beste gailu batera eramateko"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Gelditu"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Nola funtzionatzen dute iragarpenek?"</string>
@@ -1398,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Tolesteko ikonoa"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Zabaltzeko ikonoa"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"edo"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Arrastatzeko kontrol-puntua"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Nabigatu teklatua erabilita"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Ikasi lasterbideak"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Nabigatu ukipen-panela erabilita"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Ikasi ukipen-paneleko keinuak"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Nabigatu teklatua eta ukipen-panela erabilita"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Ikasi ukipen-paneleko keinuak, lasterbideak eta abar"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Atzera egiteko keinua"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Orri nagusira joateko keinua"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ikusi azkenaldiko aplikazioak"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Eginda"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Egin atzera"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Atzera egiteko, pasatu 3 hatz ezkerrera edo eskuinera ukipen-panelean.\n\nEkintza + Ihes lasterbidea ere erabil dezakezu horretarako."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Bikain!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Ikasi duzu atzera egiteko keinua."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Joan orri nagusira"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Orri nagusira joateko, pasatu 3 hatz pantailaren behealdetik gora."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Ederki!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Ikasi duzu hasierako pantailara joateko keinua."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ikusi azkenaldiko aplikazioak"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Pasatu 3 hatz gora eta eduki sakatuta ukipen-panelean."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bikain!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Osatu duzu azkenaldiko aplikazioak ikusteko keinua."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Ekintza-tekla"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Aplikazioak atzitzeko, sakatu teklatuko ekintza-tekla."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Zorionak!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Ekintza-teklaren keinua egin duzu.\n\nEkintza + / sakatuz gero, erabilgarri dituzun lasterbide guztiak ikusiko dituzu."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Teklatuaren hondoko argia"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d/%2$d maila"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Etxeko gailuen kontrola"</string>
@@ -1437,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Aplikazio guztiak ikusteko, sakatu teklatuko ekintza-tekla"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Desitxuratuta"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Desblokeatu ikusteko"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Testuinguruaren araberako hezkuntza"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Erabili ukipen-panela atzera egiteko"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Pasatu 3 hatz ezkerrera edo eskuinera. Sakatu keinu gehiago ikasteko."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Erabili ukipen-panela hasierako pantailara joateko"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 8f413c8..29a2739 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"روشن"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"روشن • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"خاموش"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"راه‌اندازی"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"مدیریت در تنظیمات"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{حالت فعالی وجود ندارد}=1{‫{mode} فعال است}one{‫# حالت فعال است}other{‫# حالت فعال است}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"به‌جز هشدارها، یادآوری‌ها، رویدادها و تماس‌گیرندگانی که خودتان مشخص می‌کنید، هیچ صدا و لرزشی نخواهید داشت. همچنان صدای مواردی را که پخش می‌کنید می‌شنوید (ازجمله صدای موسیقی، ویدیو و بازی)."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"مکالمه‌ها"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"پاک کردن همه اعلان‌های بی‌صدا"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"اعلان‌ها توسط «مزاحم نشوید» موقتاً متوقف شدند"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{اعلانی موقتاً متوقف نشده است}=1{اعلان‌ها را «{mode}» موقتاً متوقف کرده است}=2{اعلان‌ها را «{mode}» و یک حالت دیگر موقتاً متوقف کرد‌اند}one{اعلان‌ها را «{mode}» و # حالت دیگر موقتاً متوقف کرده‌اند}other{اعلان‌ها را «{mode}» و # حالت دیگر موقتاً متوقف کرده‌اند}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"اکنون شروع کنید"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"اعلانی موجود نیست"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"اعلان جدیدی وجود ندارد"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"نمایش حالت نمایشی"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"اترنت"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"زنگ"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> روشن است"</string>
     <string name="wallet_title" msgid="5369767670735827105">"کیف پول"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"برای خرید سریع‌تر و امن‌تر با تلفن، راه‌اندازی کنید"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"نمایش همه"</string>
@@ -1022,7 +1025,7 @@
     <string name="privacy_type_location" msgid="7991481648444066703">"مکان"</string>
     <string name="privacy_type_microphone" msgid="9136763906797732428">"میکروفون"</string>
     <string name="privacy_type_media_projection" msgid="8136723828804251547">"ضبط صفحه‌نمایش"</string>
-    <string name="music_controls_no_title" msgid="4166497066552290938">"بدون عنوان"</string>
+    <string name="music_controls_no_title" msgid="4166497066552290938">"بی‌عنوان"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"آماده‌به‌کار"</string>
     <string name="font_scaling_dialog_title" msgid="6273107303850248375">"اندازه قلم"</string>
     <string name="font_scaling_smaller" msgid="1012032217622008232">"کوچک‌تر کردن"</string>
@@ -1176,7 +1179,7 @@
     <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"توقف پخش محتوا"</string>
     <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"دستگاه‌های دردسترس برای خروجی صوتی."</string>
     <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"میزان صدا"</string>
-    <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+    <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"‎%%<xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"بلندگوها و نمایشگرها"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"دستگاه‌های پیشنهادی"</string>
     <string name="media_input_group_title" msgid="2057057473860783021">"ورودی"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"نماد جمع کردن"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"نماد ازهم بازکردن"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"یا"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"دستگیره کشاندن"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"پیمایش کردن بااستفاده از صفحه‌کلید"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"آشنایی با میان‌برهای صفحه‌کلید"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"پیمایش کردن بااستفاده از صفحه لمسی"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"آشنایی با اشاره‌های صفحه لمسی"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"پیمایش کردن بااستفاده از صفحه‌کلید و صفحه لمسی"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"آشنایی با اشاره‌های صفحه لمسی، میان‌برهای صفحه‌کلید، و موارد دیگر"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"اشاره برگشت"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"اشاره صفحه اصلی"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"مشاهده کردن برنامه‌های اخیر"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"تمام"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"برگشتن"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"برای برگشتن، در هر جایی از صفحه لمسی، با سه انگشت تند به‌چپ یا راست بکشید.\n\nبرای این کار می‌توانید از میان‌بر صفحه‌کلید «کنش + گریز» هم استفاده کنید."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"عالی بود!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"اشاره برگشت را تکمیل کردید."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"رفتن به صفحه اصلی"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"برای رفتن به صفحه اصلی در هرزمانی، با سه انگشت از پایین صفحه‌نمایش تند به‌بالا بکشید."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"آفرین!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"اشاره رفتن به صفحه اصلی را تکمیل کردید."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"مشاهده کردن برنامه‌های اخیر"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"با سه انگشت روی صفحه لمسی تند به‌بالا بکشید و نگه دارید."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"عالی است!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"اشاره مشاهده برنامه‌های اخیر را انجام دادید"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"دکمه کنش"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"برای دسترسی به برنامه‌هایتان، دکمه کنش در صفحه‌کلید را فشار دهید."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"تبریک!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"اشاره دکمه کنش را تکمیل کردید.\n\n«کنش» + / همه میان‌برهای دردسترس را نمایش می‌دهد."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"نور پس‌زمینه صفحه‌کلید"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"‏سطح %1$d از %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"کنترل خانه هوشمند"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"برای مشاهده همه برنامه‌ها، دکمه کنش در صفحه‌کلید را فشار دهید"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"محوشده"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"برای مشاهده، قفل را باز کنید"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"آموزش زمینه‌ای"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"برای برگشتن از صفحه لمسی استفاده کنید"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"با سه انگشت تند به‌چپ یا راست بکشید. برای آشنایی با اشاره‌های بیشتر، تک‌ضرب بزنید."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"برای رفتن به صفحه اصلی از صفحه لمسی استفاده کنید"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index f8fa57d..e93ac1a 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Päällä"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Päällä • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Pois päältä"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Ota käyttöön"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Muuta asetuksista"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Ei aktiivisia tiloja}=1{{mode} on aktiivinen}other{# tilaa on aktiivisena}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Äänet ja värinät eivät häiritse sinua, paitsi jos ne ovat hälytyksiä, muistutuksia, tapahtumia tai määrittämiäsi soittajia. Kuulet edelleen kaiken valitsemasi sisällön, kuten musiikin, videot ja pelit."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Keskustelut"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Tyhjennä kaikki hiljaiset ilmoitukset"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Älä häiritse ‑tila keskeytti ilmoitukset"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Ei ilmoituksia}=1{{mode} keskeytti ilmoitukset}=2{{mode} ja yksi muu tila keskeytti ilmoitukset}other{{mode} ja # muuta tilaa keskeytti ilmoitukset}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Aloita nyt"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Ei ilmoituksia"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Ei uusia ilmoituksia"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Näytä esittelytila"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Herätys"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> on päällä"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Lisää maksutapa, niin voit maksaa nopeasti ja turvallisesti puhelimella"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Näytä kaikki"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Kaiuttimet ja näytöt"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Ehdotetut laitteet"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Sisääntulo"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Ulostulo"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Lopeta jaettu istunto, jotta voit siirtyä mediaan toisella laitteella"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Lopeta"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Miten lähetys toimii"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Tiivistyskuvake"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Laajennuskuvake"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"tai"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Vetokahva"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Siirry käyttämällä näppäimistöä"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Opettele pikanäppäimiä"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Siirry käyttämällä kosketuslevyä"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Opettele kosketuslevyn eleitä"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Siirry käyttämällä näppäimistöä ja kosketuslevyä"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Opettele kosketuslevyn eleitä, pikanäppäimiä ja muuta"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Takaisin-ele"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Etusivu-ele"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Katso viimeisimmät sovellukset"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Valmis"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Takaisin"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Jos haluat siirtyä takaisin, pyyhkäise kosketuslevyllä vasemmalle tai oikealle kolmella sormella.\n\nVoit myös käyttää pikanäppäinyhdistelmää toimintonäppäin + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Hienoa!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Olet oppinut Takaisin-eleen."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Siirry etusivulle"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Voit siirtyä aloitusnäytölle milloin tahansa pyyhkäisemällä ylös näytön alareunasta kolmella sormella."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Hienoa!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Olet oppinut aloitusnäytölle palaamiseleen."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Katso viimeisimmät sovellukset"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Pyyhkäise ylös ja pidä kosketuslevyä painettuna kolmella sormella."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Hienoa!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Olet oppinut Katso viimeisimmät sovellukset ‑eleen."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Toimintonäppäin"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Voit käyttää sovelluksia painamalla näppäimistön toimintonäppäintä."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Onnittelut!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Olet oppinut toimintonäppäineleen.\n\nToiminto + / tuo esiin kaikki käytettävissä olevat pikakomennot."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Näppämistön taustavalo"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Taso %1$d/%2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Kodin ohjaus"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Jos haluat nähdä kaikki sovellukset, paina näppäimistön toimintonäppäintä"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Sensuroitu"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Avaa lukitus ja katso tiedot"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontekstuaalinen koulutus"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Takaisin siirtyminen kosketuslevyn avulla"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Pyyhkäise vasemmalle tai oikealle kolmella sormella. Lue lisää eleistä napauttamalla."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Aloitusnäytölle siirtyminen kosketuslevyn avulla"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 106af39f..c58ad93 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Activé"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Activé • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Désactivé"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Configurer"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Gérer dans les paramètres"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Aucun mode actif}=1{Le mode {mode} est actif}one{# mode est actif}many{# de modes sont actifs}other{# modes sont actifs}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Vous ne serez pas dérangé par les sons et les vibrations, sauf pour les alarmes, les rappels, les événements et les appelants que vous sélectionnez. Vous entendrez tout ce que vous choisissez d\'écouter, y compris la musique, les vidéos et les jeux."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Effacer toutes les notifications silencieuses"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Les notifications sont suspendues par le mode Ne pas déranger"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Aucune notification}=1{Notifications suspendues par {mode}}=2{Notifications suspendues par {mode} et un autre mode}one{Notifications suspendues par {mode} et # autre mode}many{Notifications suspendues par {mode} et # d\'autres modes}other{Notifications suspendues par {mode} et # autres modes}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Commencer"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Aucune notification"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Aucune nouvelle notification"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Afficher le mode Démo"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarme"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Préparez-vous à faire des achats plus rapidement et de façon plus sûre avec votre téléphone"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Tout afficher"</string>
@@ -1179,10 +1183,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Haut-parleurs et écrans"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Appareils suggérés"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Entrer"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Sortie"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Arrêtez votre session partagée pour déplacer des contenus multimédias vers un autre appareil"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Arrêter"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Fonctionnement de la diffusion"</string>
@@ -1398,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icône Réduire"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icône Développer"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Poignée de déplacement"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviguer à l\'aide de votre clavier"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Apprenez à utiliser les raccourcis-clavier"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviguer à l\'aide de votre pavé tactile"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Apprenez à utiliser les gestes du pavé tactile"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Naviguer à l\'aide de votre clavier et de votre pavé tactile"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Apprenez les gestes du pavé tactile, les raccourcis-clavier et bien plus encore"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Geste de retour"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Geste d\'accès à l\'écran d\'accueil"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Afficher les applis récentes"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"OK"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Retour"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Pour revenir en arrière, balayez vers la gauche ou la droite en utilisant trois doigts n\'importe où sur le pavé tactile.\n\nVous pouvez également utiliser le raccourci clavier Action+Échap."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Bon travail!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Vous avez appris le geste de retour en arrière."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Retour à la page d\'accueil"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Pour accéder à votre écran d\'accueil à tout moment, balayez l\'écran du bas vers le haut avec trois doigts."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bien!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Vous avez appris le geste de retour à l\'écran d\'accueil."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Afficher les applis récentes"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Balayez l\'écran vers le haut avec trois doigts et maintenez-les en place sur votre pavé tactile."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bon travail!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Vous avez effectué le geste pour afficher les applis récentes."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Touche d\'action"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Pour accéder à vos applis, appuyez sur la touche d\'action de votre clavier."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Félicitations!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Vous avez terminé le geste de la touche d\'action.\n\nAction + / affiche tous les raccourcis dont vous disposez."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Rétroéclairage du clavier"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d de %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Domotique"</string>
@@ -1437,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Pour afficher toutes vos applis, appuyez sur la touche d\'action de votre clavier"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Supprimé"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Déverrouiller pour afficher"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Enseignement contextuel"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Utiliser votre pavé tactile pour revenir en arrière"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Balayez vers la gauche ou vers la droite avec trois doigts. Touchez pour apprendre d\'autres gestes."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Utilisez votre pavé tactile pour accéder à l\'écran d\'accueil"</string>
@@ -1446,7 +1460,7 @@
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"Utiliser votre clavier pour afficher toutes les applis"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Appuyez sur la touche d\'action à tout moment. Touchez pour apprendre d\'autres gestes."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"La réduction supplémentaire de la luminosité fait désormais partie du curseur de luminosité"</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Vous pouvez désormais réduire la luminosité de l\'écran encore plus.\n\nÉtant donné que cette fonctionnalité fait désormais partie du curseur de luminosité, les raccourcis de la réduction supplémentaire de la luminosité sont retirés."</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Vous pouvez désormais réduire la luminosité de l\'écran encore plus.\n\nÉtant donné que cette fonctionnalité fait maintenant partie du curseur de luminosité, les raccourcis de la réduction supplémentaire de la luminosité sont retirés."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Retirer les raccourcis de la réduction supplémentaire de la luminosité"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Les raccourcis de la réduction supplémentaire de la luminosité ont été retirés"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Connectivité"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index ad7a875..cf1cae9d 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -197,7 +197,7 @@
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authentifié"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Annuler l\'authentification"</string>
     <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Plus d\'options"</string>
-    <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utiliser un code PIN"</string>
+    <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utiliser un code"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Utiliser un schéma"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Utiliser un mot de passe"</string>
     <string name="biometric_dialog_wrong_pin" msgid="1878539073972762803">"Code incorrect"</string>
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Activé"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Activé • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Désactivé"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Configurer"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Gérer dans les paramètres"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Aucun mode actif}=1{{mode} est actif}one{# mode est actif}many{# de modes sont actifs}other{# modes sont actifs}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Vous ne serez pas dérangé par des sons ou des vibrations, hormis ceux des alarmes, des rappels, des événements et des appelants de votre choix. Vous entendrez encore les sons que vous choisirez de jouer, notamment la musique, les vidéos et les jeux."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Effacer toutes les notifications silencieuses"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications suspendues par le mode Ne pas déranger"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Aucune notification}=1{Notifications suspendues par le mode {mode}}=2{Notifications suspendues par le mode {mode} et un autre mode}one{Notifications suspendues par le mode {mode} et # autre mode}many{Notifications suspendues par le mode {mode} et # d\'autres modes}other{Notifications suspendues par le mode {mode} et # autres modes}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Commencer"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Aucune notification"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Aucune nouvelle notification"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Afficher le mode de démonstration"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarme"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"Mode <xliff:g id="MODENAME">%1$s</xliff:g> activé"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Configurez un mode de paiement pour régler vos achats de façon sûre et rapide via votre téléphone"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Tout afficher"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Enceintes et écrans"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Appareils suggérés"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Entrée"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Sortie"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Arrêter votre session partagée pour déplacer des contenus multimédias vers un autre appareil"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Arrêter"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Fonctionnement des annonces"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icône Réduire"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icône Développer"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Poignée de déplacement"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviguer à l\'aide du clavier"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Découvrir les raccourcis clavier"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviguer à l\'aide de votre pavé tactile"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Découvrir les gestes au pavé tactile"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Naviguer à l\'aide de votre clavier et de votre pavé tactile"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Découvrir les gestes au pavé tactile, les raccourcis clavier et plus encore"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Geste Retour"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Geste Accueil"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Afficher les applis récentes"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"OK"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Retour"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Pour revenir en arrière, balayez vers la gauche ou vers la droite avec trois doigts n\'importe où sur le pavé tactile.\n\nVous pouvez aussi utiliser le raccourci clavier Action+Échap pour cela."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Bravo !"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Vous avez appris le geste pour revenir en arrière."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Retour à l\'accueil"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Pour accéder à l\'écran d\'accueil à tout moment, balayez l\'écran du bas vers le haut avec trois doigts."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bravo !"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Vous avez appris le geste pour revenir à l\'écran d\'accueil."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Afficher les applis récentes"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Avec trois doigts, balayez le pavé tactile vers le haut et maintenez la position."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bravo !"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Vous avez appris le geste pour afficher les applis récentes"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Touche d\'action"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Pour accéder à vos applis, appuyez sur la touche d\'action de votre clavier."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Félicitations !"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Vous avez appris le geste permettant d\'utiliser la touche d\'action.\n\nAction+/ affiche tous les raccourcis disponibles."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Rétroéclairage du clavier"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d sur %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Contrôle de la maison"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Pour afficher toutes vos applis, appuyez sur la touche d\'action de votre clavier"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Masqué"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Déverrouiller pour afficher"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Éducation contextuelle"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Utilisez votre pavé tactile pour revenir en arrière"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Balayez vers la gauche ou la droite en utilisant trois doigts. Appuyez pour apprendre d\'autres gestes."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Utilisez votre pavé tactile pour revenir à l\'accueil"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index bfe5b58..dc0f216 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Activado"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Activo • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Desactivado"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Configurar"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Xestionar na configuración"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Non hai ningún modo activo}=1{{mode} está activo}other{Hai # modos activos}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Non te molestará ningún son nin vibración, agás os procedentes de alarmas, recordatorios, eventos e os emisores de chamada especificados. Seguirás escoitando todo aquilo que decidas reproducir, mesmo a música, os vídeos e os xogos."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas as notificacións silenciadas"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"O modo Non molestar puxo en pausa as notificacións"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Non hai ningunha notificación}=1{Notificacións postas en pausa polo modo {mode}}=2{Notificacións postas en pausa polo modo {mode} e un máis}other{Notificacións postas en pausa polo modo {mode} e # máis}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Non hai notificacións"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Non hai notificacións novas"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Mostrar modo de demostración"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarma"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> activado"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Configura un método de pago para comprar de xeito máis rápido e seguro co teléfono"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Amosar todo"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Altofalantes e pantallas"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Dispositivos suxeridos"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Entrada"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Saída"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Detén a sesión de uso compartido para mover contido multimedia a outro dispositivo"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Deter"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Como funcionan as difusións?"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icona de contraer"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icona de despregar"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Controlador de arrastre"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navega co teclado"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprende a usar os atallos de teclado"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navega co panel táctil"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Aprende a usar os xestos do panel táctil"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navega co teclado e o panel táctil"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprende a usar os xestos do panel táctil, atallos de teclado e moito máis"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Xesto para volver"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Xesto para ir ao inicio"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Consultar aplicacións recentes"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Feito"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Volver"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Para retroceder, pasa tres dedos cara á esquerda ou cara á dereita en calquera parte do panel táctil.\n\nTamén podes usar o atallo de teclado Acción + Escape."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Moi ben!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Completaches o xesto de retroceso."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ir ao inicio"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Para ir á pantalla de inicio, pasa tres dedos cara arriba desde a parte inferior da pantalla."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Excelente!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Completaches o xesto de ir ao inicio."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Consultar aplicacións recentes"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Pasa tres dedos cara arriba e mantenos premidos no panel táctil."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Moi ben!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Completaches o titorial do xesto de consultar aplicacións recentes."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tecla de acción"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Para acceder ás aplicacións, preme a tecla de acción do teclado."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Parabéns!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Completaches o xesto da tecla de acción.\n\nAcción + / mostra todos os atallos que tes á túa disposición."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroiluminación do teclado"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivel %1$d de %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Controis domóticos"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Para ver todas as aplicacións, preme a tecla de acción do teclado"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Contido ocultado"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Desbloquea o dispositivo para ver o contido"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Información contextual"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Usa o panel táctil para volver"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Pasa tres dedos cara á esquerda ou cara á dereita. Toca para obter máis información sobre os xestos."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Usa o panel táctil para volver ao inicio"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 5d952ac..866535e 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"ચાલુ"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"ચાલુ • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"બંધ"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"સેટઅપ કરો"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"સેટિંગમાં જઈને મેનેજ કરો"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{કોઈ સક્રિય મોડ નથી}=1{{mode} સક્રિય છે}one{# મોડ સક્રિય છે}other{# મોડ સક્રિય છે}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"અલાર્મ, રિમાઇન્ડર, ઇવેન્ટ અને તમે ઉલ્લેખ કરો તે કૉલર સિવાય તમને ધ્વનિ કે વાઇબ્રેશન દ્વારા ખલેલ પહોંચાડવામાં આવશે નહીં. સંગીત, વીડિઓ અને રમતો સહિત તમે જે કંઈપણ ચલાવવાનું પસંદ કરશો તે સંભળાતું રહેશે."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"વાતચીત"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"બધા સાઇલન્ટ નોટિફિકેશન સાફ કરો"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ખલેલ પાડશો નહીં દ્વારા થોભાવેલ નોટિફિકેશન"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{કોઈ નોટિફિકેશન નથી}=1{{mode} દ્વારા નોટિફિકેશન થોભાવવામાં આવ્યા}=2{{mode} અને અન્ય એક મોડ દ્વારા નોટિફિકેશન થોભાવવામાં આવ્યા}one{{mode} અને અન્ય # મોડ દ્વારા નોટિફિકેશન થોભાવવામાં આવ્યા}other{{mode} અને અન્ય # મોડ દ્વારા નોટિફિકેશન થોભાવવામાં આવ્યા}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"હવે શરૂ કરો"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"કોઈ નોટિફિકેશન નથી"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"કોઈ નવું નોટિફિકેશન નથી"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"ડેમો મોડ બતાવો"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ઇથરનેટ"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"અલાર્મ"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> ચાલુ છે"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"તમારા ફોન વડે વધુ ઝડપી તેમજ સુરક્ષિત ખરીદીઓ કરવાની રીત સેટઅપ કરી લો"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"બધું બતાવો"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"\'નાનું કરો\'નું આઇકન"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"\'મોટું કરો\'નું આઇકન"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"અથવા"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ઑબ્જેક્ટ ખેંચવાનું હૅન્ડલ"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"તમારા કીબોર્ડ વડે નૅવિગેટ કરો"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"કીબોર્ડ શૉર્ટકર્ટ જાણો"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"તમારા ટચપૅડ વડે નૅવિગેટ કરો"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ટચપૅડના સંકેતો વિશે જાણો"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"તમારા કીબોર્ડ અને ટચપૅડ વડે નૅવિગેટ કરો"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ટચપૅડના સંકેતો અને કીબોર્ડના શૉર્ટકટ જેવું બીજું ઘણું જાણો"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"પાછળ જવાનો સંકેત"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"હોમ સ્ક્રીન પર જવાનો સંકેત"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"તાજેતરની ઍપ જુઓ"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"થઈ ગયું"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"પાછા જાઓ"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"પાછા જવા માટે, ટચપૅડ પર ગમે ત્યાં ત્રણ આંગળી વડે ડાબે અથવા જમણે સ્વાઇપ કરો.\n\nઆના માટે તમે કીબોર્ડ શૉર્ટકટ Action + ESCનો ઉપયોગ કરી શકો છો."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"ખૂબ સરસ કામ!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"તમે પાછા જવાનો સંકેત પૂર્ણ કર્યો છે."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"હોમ પર જાઓ"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"કોઈપણ સમયે તમારી હોમ સ્ક્રીન પર જવા માટે, ત્રણ આંગળી વડે તમારી સ્ક્રીનની સૌથી નીચેની બાજુએથી ઉપરની તરફ સ્વાઇપ કરો."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"સરસ!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"તમે હોમ સ્ક્રીન પર જવાનો સંકેત પૂર્ણ કર્યો છે."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"તાજેતરની ઍપ જુઓ"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"તમારા ટચપૅડ પર ત્રણ આંગળીઓનો ઉપયોગ કરીને ઉપર સ્વાઇપ કરો અને દબાવી રાખો."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ખૂબ સરસ કામ!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"તમે \"તાજેતરની ઍપ જુઓ\" સંકેત પૂર્ણ કર્યો."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"ઍક્શન કી"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"તમારી ઍપ ઍક્સેસ કરવા માટે, તમારા કીબોર્ડ પરની ઍક્શન કી દબાવો."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"અભિનંદન!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"તમે ઍક્શન કીનો સંકેત પૂર્ણ કર્યો છે.\n\nઍક્શન કી + /ને દબાવવાથી, તમારી પાસે ઉપલબ્ધ હોય તે બધા શૉર્ટકટ જોવા મળે છે."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"કીબોર્ડની બૅકલાઇટ"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dમાંથી %1$d લેવલ"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"ઘરેલું સાધનોના નિયંત્રણો"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"તમારી બધી ઍપ જોવા માટે, તમારા કીબોર્ડ પર ઍક્શન કી દબાવો"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"બદલાવેલું"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"જોવા માટે અનલૉક કરો"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"સંદર્ભાત્મક શિક્ષણ"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"પાછા જવા માટે તમારા ટચપૅડનો ઉપયોગ કરો"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"ત્રણ આંગળીનો ઉપયોગ કરીને ડાબે અથવા જમણે સ્વાઇપ કરો. સંકેતો વિશે વધુ જાણવા માટે ટૅપ કરો."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"હોમ સ્ક્રીન પર જવા માટે તમારા ટચપૅડનો ઉપયોગ કરો"</string>
@@ -1443,7 +1458,7 @@
     <string name="overview_edu_notification_content" msgid="3578204677648432500">"ત્રણ આંગળીઓનો ઉપયોગ કરીને ઉપર સ્વાઇપ કરો અને દબાવી રાખો. સંકેતો વિશે વધુ જાણવા માટે ટૅપ કરો."</string>
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"બધી ઍપ જોવા માટે તમારા કીબોર્ડનો ઉપયોગ કરો"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"કોઈપણ સમયે ઍક્શન કી દબાવો. સંકેતો વિશે વધુ જાણવા માટે ટૅપ કરો."</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"બ્રાઇટનેસ સ્લાઇડર હવે એક્સ્ટ્રા ડિમનો ભાગ છે"</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"એક્સ્ટ્રા ડિમ હવે બ્રાઇટનેસ સ્લાઇડરનો ભાગ છે"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"તમે હવે બ્રાઇટનેસ લેવલને હજી પણ ઘટાડીને સ્ક્રીનને એક્સ્ટ્રા ડિમ બનાવી શકો છો.\n\nઆ સુવિધા હવે બ્રાઇટનેસ સ્લાઇડરનો ભાગ હોવાથી એક્સ્ટ્રા ડિમ શૉર્ટકટને કાઢી નાખવામાં આવી રહ્યાં છે."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"એક્સ્ટ્રા ડિમ શૉર્ટકટ કાઢી નાખો"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"એક્સ્ટ્રા ડિમ શૉર્ટકટ કાઢી નાખ્યા"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 03028b1..7a1bf83a 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"चालू है"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"<xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g> • पर"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"बंद है"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"सेट अप करें"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"सेटिंग में जाकर मैनेज करें"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{कोई मोड चालू नहीं है}=1{{mode} चालू है}one{# मोड चालू है}other{# मोड चालू हैं}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"आपको अलार्म, रिमाइंडर, इवेंट और चुनिंदा कॉल करने वालों के अलावा किसी और तरह से (आवाज़ करके और थरथरा कर ) परेशान नहीं किया जाएगा. आप फिर भी संगीत, वीडियो और गेम सहित अपना चुना हुआ सब कुछ सुन सकते हैं."</string>
@@ -573,10 +574,11 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"बातचीत"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"बिना आवाज़ की सभी सूचनाएं हटाएं"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'परेशान न करें\' सुविधा के ज़रिए कुछ समय के लिए सूचनाएं दिखाना रोक दिया गया है"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{कोई सूचना नहीं है}=1{{mode} की वजह से सूचना नहीं दिख रही है}=2{{mode} और एक अन्य मोड की वजह से सूचना नहीं दिख रही है}one{{mode} और # अन्य मोड की वजह से सूचना नहीं दिख रही है}other{{mode} और # अन्य मोड के की वजह से सूचनाएं नहीं दिख रही है}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"अभी शुरू करें"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"कोई सूचना नहीं है"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"कोई नई सूचना नहीं है"</string>
-    <string name="adaptive_notification_edu_hun_title" msgid="7790738150177329960">"नोटिफ़िकेशन कूलडाउन की सेटिंग चालू है"</string>
+    <string name="adaptive_notification_edu_hun_title" msgid="7790738150177329960">"लगातार सूचनाएं आने पर आवाज़ कम करने की सेटिंग चालू है"</string>
     <string name="adaptive_notification_edu_hun_text" msgid="7743367744129536610">"एक साथ कई सूचनाएं मिलने पर, डिवाइस में सूचनाओं से होने वाली आवाज़ और सूचनाएं, दो मिनट के लिए अपने-आप कम हो जाएंगी."</string>
     <string name="go_to_adaptive_notification_settings" msgid="2423690125178298479">"बंद करें"</string>
     <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"पुरानी सूचाएं देखने के लिए अनलॉक करें"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"डेमो मोड दिखाएं"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ईथरनेट"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"अलार्म"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> चालू है"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"फ़ोन के ज़रिए तेज़ी से और सुरक्षित तरीके से खरीदारी करने के लिए सेट अप करें"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"सभी दिखाएं"</string>
@@ -1403,26 +1406,38 @@
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"टचपैड पर हाथ के जेस्चर के बारे में जानें"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"कीबोर्ड और टचपैड का इस्तेमाल करके नेविगेट करें"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"टचपैड पर हाथ के जेस्चर, कीबोर्ड शॉर्टकट वगैरह के बारे में जानें"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"पीछे जाने का जेस्चर"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"होम स्क्रीन पर जाने का जेस्चर"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन देखें"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"हो गया"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"वापस जाएं"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"वापस जाने के लिए, टचपैड पर कहीं भी तीन उंगलियों से दाईं या बाईं ओर स्वाइप करें.\n\nइसके अलावा, ऐसा करने के लिए Action + ESC बटन का भी इस्तेमाल किया जा सकता है."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"बहुत बढ़िया!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"अब आपने जान लिया है कि हाथ का जेस्चर इस्तेमाल करके, पिछली स्क्रीन पर वापस कैसे जाएं."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"होम स्क्रीन पर जाएं"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"किसी भी समय फ़ोन की होम स्क्रीन पर जाने के लिए, तीन उंगलियों से फ़ोन पर सबसे नीचे से ऊपर की ओर स्वाइप करें."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"बढ़िया!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"आपने जान लिया कि हाथ का जेस्चर इस्तेमाल करके, होम स्क्रीन पर कैसे जाएं."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन देखें"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"अपने टचपैड पर तीन उंगलियों से ऊपर की ओर स्वाइप करें और फिर होल्ड करें."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"बहुत बढ़िया!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"आपने हाल ही में इस्तेमाल किए गए ऐप्लिकेशन देखने के लिए, हाथ के जेस्चर के बारे में जान लिया है."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"ऐक्शन बटन"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"अपने ऐप्लिकेशन ऐक्सेस करने के लिए, कीबोर्ड पर ऐक्शन बटन दबाएं."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"बधाई हो!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"आपने ऐक्शन बटन का जेस्चर इस्तेमाल करने की प्रोसेस पूरी कर ली है.\n\nऐक्शन बटन और / को साथ में दबाने पर, आपके पास उपलब्ध सभी शॉर्टकट दिखते हैं."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"कीबोर्ड की बैकलाइट"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d में से %1$d लेवल"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"होम कंट्रोल"</string>
@@ -1434,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"सभी ऐप्लिकेशन देखने के लिए, कीबोर्ड पर ऐक्शन बटन दबाएं"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"जानकारी छिपाने के लिए सूचना में बदलाव किया गया"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"देखने के लिए डिवाइस अनलॉक करें"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"कॉन्टेक्स्ट के हिसाब से जानकारी"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"वापस जाने के लिए, अपने डिवाइस के टचपैड का इस्तेमाल करें"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"तीन उंगलियों से बाईं या दाईं ओर स्वाइप करें. जेस्चर के बारे में ज़्यादा जानने के लिए टैप करें."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"होम पर जाने के लिए, अपने डिवाइस के टचपैड का इस्तेमाल करें"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 4055e74..9607120 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Uključeno"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Uklj. • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Isključeno"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Postavi"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Upravljajte u postavkama"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Nema aktivnih načina}=1{Aktivno: {mode}}one{# način je aktivan}few{# načina su aktivna}other{# načina je aktivno}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Neće vas ometati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivatelja koje navedete. I dalje ćete čuti sve što želite reproducirati, uključujući glazbu, videozapise i igre."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Izbriši sve bešumne obavijesti"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Značajka Ne uznemiravaj pauzirala je Obavijesti"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nema obavijesti}=1{Obavijesti je pauzirao način {mode}}=2{Obavijesti su pauzirali način {mode} i još jedan način}one{Obavijesti su pauzirali način {mode} i još # način rada}few{Obavijesti su pauzirali način {mode} i još # načina rada}other{Obavijesti su pauzirali način {mode} i još # načina rada}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Pokreni"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Nema obavijesti"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Nema novih obavijesti"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Prikaži demo način"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"Uključen je način <xliff:g id="MODENAME">%1$s</xliff:g>"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Postavite aplikaciju za bržu i sigurniju kupnju telefonom"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Prikaži sve"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona za sažimanje"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona za proširivanje"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Marker za povlačenje"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Krećite se pomoću tipkovnice"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Saznajte više o tipkovnim prečacima"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Krećite se pomoću dodirne podloge"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Saznajte više o pokretima za dodirnu podlogu"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Krećite se pomoću tipkovnice i dodirne podloge"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Saznajte više o pokretima za dodirnu podlogu, tipkovnim prečacima i ostalom"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Pokret za povratak"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Pokret za otvaranje početnog zaslona"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Pregled nedavnih aplikacija"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotovo"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Natrag"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Da biste se vratili natrag, s tri prsta prijeđite ulijevo ili udesno bilo gdje na dodirnoj podlozi.\n\nZa to možete upotrijebiti i tipku za radnju tipkovnog prečaca + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Sjajno!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Izvršili ste pokret za povratak."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Na početnu stranicu"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Da biste u bilo kojem trenutku otvorili početni zaslon, trima prstima prijeđite prema gore od dna zaslona."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Odlično!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Izvršili ste pokret za otvaranje početnog zaslona."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Pregled nedavnih aplikacija"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Prijeđite prema gore trima prstima na dodirnoj podlozi i zadržite pritisak."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Sjajno!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Izvršili ste pokret za prikaz nedavno korištenih aplikacija."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tipka za radnju"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Da biste pristupili svojim aplikacijama, pritisnite tipku za radnje na tipkovnici."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Čestitamo!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Izvršili ste pokret tipke za radnju.\n\nRadnja + / prikazuje sve prečace koji su vam dostupni."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Pozadinsko osvjetljenje tipkovnice"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Razina %1$d od %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Upravljanje uređajima"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Za prikaz svojih svih aplikacija pritisnite tipku za radnju na tipkovnici"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Redaktirano"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Otključajte za prikaz"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontekstualno obrazovanje"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Upotrijebite dodirnu podlogu za povratak"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Prijeđite ulijevo ili udesno trima prstima. Dodirnite da biste naučili više pokreta."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Uz pomoć dodirne podloge vratite se na početni zaslon"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 685e219..3a9735b 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Be"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Be • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Ki"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Beállítás"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"A Beállítások között kezelheti"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Nincs aktív mód}=1{A(z) {mode} aktív}other{# mód aktív}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Az Ön által meghatározott ébresztéseken, emlékeztetőkön, eseményeken és hívókon kívül nem fogja Önt más hang vagy rezgés megzavarni. Továbbra is lesz hangjuk azoknak a tartalmaknak, amelyeket Ön elindít, például zenék, videók és játékok."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Beszélgetések"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Az összes néma értesítés törlése"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ne zavarjanak funkcióval szüneteltetett értesítések"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nincs értesítés}=1{A(z) {mode} szüneteltette az értesítéseket}=2{A(z) {mode} és egy másik mód szüneteltette az értesítéseket}other{A(z) {mode} és # másik mód szüneteltette az értesítéseket}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Indítás most"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Nincs értesítés"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Nincsenek új értesítések"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Demó mód megjelenítése"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Ébresztés"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"A(z) <xliff:g id="MODENAME">%1$s</xliff:g> aktív"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Végezze el a beállítást a telefonjával való gyorsabb és biztonságosabb vásárláshoz"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Összes mutatása"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Hangfalak és kijelzők"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Javasolt eszközök"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Bemenet"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Kimenet"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Állítsa le a megosztott munkamenetet, ha át szeretné helyezni a médiát egy másik eszközre"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Leállítás"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"A közvetítés működése"</string>
@@ -1405,26 +1406,38 @@
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Érintőpad-kézmozdulatok megismerése"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigálás a billentyűzet és az érintőpad használatával"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Érintőpad-kézmozdulatok, billentyűparancsok és egyebek megismerése"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Vissza kézmozdulat"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Kezdőképernyő kézmozdulat"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Legutóbbi alkalmazások megtekintése"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Kész"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Vissza"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"A visszalépéshez csúsztasson három ujjal balra vagy a jobbra az érintőpadon.\n\nEnnek végrehajtásához használhatja az Action + Esc billentyűparancsot is."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Kiváló!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Teljesítette a visszalépési kézmozdulatot."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ugrás a főoldalra"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Ha bármikor vissza szeretne térni a kezdőképernyőre, csúsztassa gyorsan felfelé három ujját a képernyő aljáról."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Remek!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Teljesítette a kezdőképernyőre lépés kézmozdulatát."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Legutóbbi alkalmazások megtekintése"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Csúsztasson felfelé három ujjal az érintőpadon, és tartsa lenyomva az ujjait."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Kiváló!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Teljesítette a legutóbbi alkalmazások megtekintésének kézmozdulatát."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Műveletbillentyű"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Az alkalmazásokhoz való hozzáféréshez nyomja meg a billentyűzet műveletbillentyűjét."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Gratulálunk!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Teljesítette a műveletbillentyű kézmozdulatát.\n\nA Művelet + / billentyűkombinációval megjelenítheti az összes használható billentyűparancsot."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"A billentyűzet háttérvilágítása"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Fényerő: %2$d/%1$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Otthon vezérlése"</string>
@@ -1436,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Az összes alkalmazás megtekintéséhez nyomja meg a billentyűzet műveletbillentyűjét."</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Törölve"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Oldja fel a megtekintéshez"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontextusfüggő tájékoztató párbeszédpanel"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"A visszalépéshez használja az érintőpadot"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Csúsztatasson gyorsan három ujjal balra vagy jobbra. Koppintson a további kézmozdulatokért."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"A kezdőképernyő megnyitásához használja az érintőpadot"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 36d3e42..804550c 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Միացված է"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Միաց․ • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Անջատված է"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Կարգավորել"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Կառավարել կարգավորումներում"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Ակտիվ ռեժիմներ չկան}=1{{mode} ռեժիմ ակտիվ է}one{# ռեժիմ ակտիվ է}other{# ռեժիմ ակտիվ է}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Ձայները և թրթռոցները չեն անհանգստացնի ձեզ, բացի ձեր կողմից նշված զարթուցիչները, հիշեցումները, միջոցառումների ծանուցումները և զանգերը։ Դուք կլսեք ձեր ընտրածի նվագարկումը, այդ թվում՝ երաժշտություն, տեսանյութեր և խաղեր:"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Զրույցներ"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Ջնջել բոլոր անձայն ծանուցումները"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ծանուցումները չեն ցուցադրվի «Չանհանգստացնել» ռեժիմում"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Ծանուցումներ չկան}=1{Ծանուցումները դադարեցվել են «{mode}» ռեժիմի կողմից}=2{Ծանուցումները դադարեցվել են «{mode}» ու ևս մի ռեժիմի կողմից}one{Ծանուցումները դադարեցվել են «{mode}» ու ևս # ռեժիմի կողմից}other{Ծանուցումները դադարեցվել են «{mode}» ու ևս # ռեժիմի կողմից}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Սկսել հիմա"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Ծանուցումներ չկան"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Նոր ծանուցումներ չկան"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Ցուցադրական ռեժիմի ցուցադրում"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Զարթուցիչ"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"«<xliff:g id="MODENAME">%1$s</xliff:g>» ռեժիմը միացված է"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Վճարեք հեռախոսով՝ ավելի արագ և ապահով"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Ցույց տալ բոլորը"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Բարձրախոսներ և էկրաններ"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Առաջարկվող սարքեր"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Ներածում"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Արտածում"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Կանգնեցրեք ընդհանուր աշխատաշրջանը՝ մուլտիմեդիա բովանդակությունն այլ սարք տեղափոխելու համար"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Կանգնեցնել"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Ինչպես է աշխատում հեռարձակումը"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ծալել պատկերակը"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ծավալել պատկերակը"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"կամ"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Տեղափոխման նշիչ"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Կողմնորոշվեք ձեր ստեղնաշարի օգնությամբ"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Սովորեք օգտագործել ստեղնային դյուրանցումները"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Կողմնորոշվեք ձեր հպահարթակի օգնությամբ"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Սովորեք օգտագործել հպահարթակի ժեստերը"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Կողմնորոշվեք ստեղնաշարի և հպահարթակի օգնությամբ"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Սովորեք օգտագործել հպահարթակի ժեստերը, ստեղնային դյուրանցումները և ավելին"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"«Հետ» ժեստ"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Հիմնական էկրան անցնելու ժեստ"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Դիտել վերջին հավելվածները"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Պատրաստ է"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Հետ գնալ"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Հետ գնալու համար հպահարթակի վրա երեք մատով սահեցրեք ձախ կամ աջ։\n\nԻնչպես նաև կարող եք օգտագործել ստեղնային դյուրանցման գործողությունը + Esc։"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Կեցցե՛ք"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Դուք սովորեցիք հետ գնալու ժեստը։"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Անցում հիմնական էկրան"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Հիմնական էկրան վերադառնալու համար երեք մատը էկրանի ներքևից սահեցրեք վերև։"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Գերազանց է"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Դուք սովորեցիք հիմնական էկրան անցնելու ժեստը։"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Դիտել վերջին հավելվածները"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Երեք մատը սահեցրեք վերև և սեղմած պահեք հպահարթակին։"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Կեցցե՛ք։"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Դուք կատարեցիք վերջին օգտագործված հավելվածների դիտման ժեստը։"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Գործողության ստեղն"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Բոլոր հավելվածներն օգտագործելու համար սեղմեք գործողության ստեղնը ստեղնաշարի վրա"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Շնորհավո՛ր"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Դուք սովորեցիք գործողության ստեղնի ժեստը։\n\nԳործողություն + / ժեստը ցույց է տալիս ձեզ հասանելի բոլոր դյուրանցումները։"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Հետին լուսավորությամբ ստեղնաշար"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d՝ %2$d-ից"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Տան կառավարման տարրեր"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Բոլոր հավելվածները դիտելու համար սեղմեք գործողության ստեղնը ստեղնաշարի վրա"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Կոդավորված"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Ապակողպել դիտելու համար"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Համատեքստային ուսուցում"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Օգտագործեք ձեր հպահարթակը՝ վերադառնալու համար"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Երեք մատը սահեցրեք ձախ կամ աջ։ Հպեք՝ ավելի շատ ժեստերի ծանոթանալու համար։"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Օգտագործեք ձեր հպահարթակը՝ հիմնական էկրան անցնելու համար"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index a531725..98bbf4f 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Aktif"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Aktif • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Nonaktif"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Siapkan"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Kelola di setelan"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Tidak ada mode yang aktif}=1{{mode} aktif}other{# mode aktif}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Anda tidak akan terganggu oleh suara dan getaran, kecuali dari alarm, pengingat, acara, dan penelepon yang Anda tentukan. Anda akan tetap mendengar apa pun yang telah dipilih untuk diputar, termasuk musik, video, dan game."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Percakapan"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Hapus semua notifikasi senyap"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifikasi dijeda oleh mode Jangan Ganggu"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Tidak ada notifikasi}=1{Notifikasi dijeda oleh {mode}}=2{Notifikasi dijeda oleh {mode} dan satu mode lainnya}other{Notifikasi dijeda oleh {mode} dan # mode lainnya}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Mulai sekarang"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Tidak ada notifikasi"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Tidak ada notifikasi baru"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Tampilkan mode demo"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> aktif"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Siapkan metode pembayaran untuk melakukan pembelian dengan lebih cepat dan aman menggunakan ponsel Anda"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Tampilkan semua"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Speaker &amp; Layar"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Perangkat yang Disarankan"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Input"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Output"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Menghentikan sesi berbagi Anda untuk memindahkan media ke perangkat lain"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Berhenti"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cara kerja siaran"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikon ciutkan"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikon luaskan"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"atau"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Handel geser"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Menavigasi menggunakan keyboard"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Pelajari pintasan keyboard"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Menavigasi menggunakan touchpad"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Pelajari gestur touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Menavigasi menggunakan keyboard dan touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Pelajari gestur touchpad, pintasan keyboard, dan lainnya"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gestur kembali"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gestur layar utama"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Lihat aplikasi terbaru"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Selesai"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Kembali"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Untuk kembali, geser ke kiri atau kanan menggunakan tiga jari di touchpad.\n\nAnda juga dapat menggunakan pintasan keyboard Action + ECS untuk melakukannya."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Bagus!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Anda telah menyelesaikan gestur kembali."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Buka layar utama"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Untuk membuka layar utama kapan saja, geser ke atas menggunakan tiga jari dari bawah layar Anda."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bagus!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Anda telah menyelesaikan gestur buka layar utama."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Lihat aplikasi terbaru"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Geser ke atas dan tahan menggunakan tiga jari di touchpad."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bagus!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Anda telah menyelesaikan gestur untuk melihat aplikasi terbaru."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tombol tindakan"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Untuk mengakses aplikasi, tekan tombol tindakan di keyboard."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Selamat!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Anda telah menyelesaikan gestur tombol tindakan.\n\nTindakan + / akan menampilkan semua pintasan yang Anda miliki."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Lampu latar keyboard"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Tingkat %1$d dari %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrol Rumah"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Untuk melihat semua aplikasi, tekan tombol tindakan di keyboard"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Disamarkan"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Buka kunci untuk melihat"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Pendidikan kontekstual"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Gunakan touchpad untuk kembali"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Geser ke kiri atau kanan menggunakan tiga jari. Ketuk untuk mempelajari gestur lainnya."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Gunakan touchpad untuk membuka layar utama"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index c2ada41..b12a475 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Kveikt"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Kveikt • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Slökkt"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Setja upp"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Stjórna í stillingum"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Engar virkar stillingar}=1{{mode} er virk}one{# stilling er virk}other{# stillingar eru virkar}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Þú verður ekki fyrir truflunum frá hljóðmerkjum og titringi, fyrir utan vekjara, áminningar, viðburði og símtöl frá þeim sem þú leyfir fyrirfram. Þú heyrir áfram í öllu sem þú velur að spila, svo sem tónlist, myndskeiðum og leikjum."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtöl"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Hreinsa allar þöglar tilkynningar"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Hlé gert á tilkynningum þar sem stillt er á „Ónáðið ekki“"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Engar tilkynningar}=1{Hlé gert á tilkynningum þar sem stillt er á {mode}}=2{Hlé gert á tilkynningum þar sem stillt er á {mode} og eina aðra stillingu}one{Hlé gert á tilkynningum þar sem stillt er á {mode} og # aðra stillingu}other{Hlé gert á tilkynningum þar sem stillt er á {mode} og # aðrar stillingar}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Byrja núna"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Engar tilkynningar"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Engar nýjar tilkynningar"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Sýna prufustillingu"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Vekjari"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"Kveikt er á „<xliff:g id="MODENAME">%1$s</xliff:g>“"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Veski"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Stilltu hlutina þannig að þú getir verslað með símanum á hraðari og öruggari hátt"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Sýna allt"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Hátalarar og skjáir"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Tillögur að tækjum"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Inntak"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Úttak"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stöðvaðu sameiginlega lotu til að flytja efni yfir í annað tæki"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stöðva"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Svona virkar útsending"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Minnka tákn"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Stækka tákn"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eða"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Dragkló"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Flettu með því að nota lyklaborðið"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Kynntu þér flýtilykla"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Flettu með því að nota snertiflötinn"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Nánar um bendingar á snertifleti"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Flettu með því að nota lyklaborðið og snertiflötinn"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Kynntu þér bendingar á snertifleti, flýtilykla og fleira"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Bending til að fara til baka"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Bending til að fara á upphafsskjá"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Sjá nýleg forrit"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Lokið"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Til baka"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Strjúktu til vinstri eða hægri með þremur fingrum hvar sem er á snertifletinum til að fara til baka.\n\nÞú getur einnig notað flýtileiðaraðgerðina + ESC til að gera þetta."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Vel gert!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Þú laukst við að kynna þér bendinguna „til baka“."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Heim"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Strjúktu upp frá neðri brún skjásins með þremur fingrum til að opna heimaskjáinn."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Flott!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Þú laukst við að kynna þér bendinguna „heim“."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Sjá nýleg forrit"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Strjúktu upp og haltu þremur fingrum inni á snertifletinum."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Vel gert!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Þú framkvæmdir bendinguna til að sjá nýleg forrit."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Aðgerðalykill"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Ýttu á aðgerðalykilinn á lyklaborðinu til að opna forritin þín."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Til hamingju!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Þú laukst við að kynna þér bendinguna „aðgerðalykill“.\n\nAðgerðalykill + / sýnir þér alla flýtilykla sem eru í boði."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Baklýsing lyklaborðs"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Stig %1$d af %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Heimastýringar"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Ýttu á aðgerðalykilinn á lyklaborðinu til að sjá öll forritin þín"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Ritskoðað"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Taktu úr lás til að skoða"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Samhengismiðuð menntun"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Notaðu snertiflötinn til að fara til baka"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Strjúktu til vinstri eða hægri með þremur fingrum. Ýttu til að læra fleiri bendingar."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Notaðu snertiflötinn til að fara á heimaskjá"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 4ff2eda..4fdf01d 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"On"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"On • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Off"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Configura"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Gestisci nelle impostazioni"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Nessuna modalità attiva}=1{{mode} è attiva}many{# di modalità sono attive}other{# modalità sono attive}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Suoni e vibrazioni non ti disturberanno, ad eccezione di sveglie, promemoria, eventi, chiamate da contatti da te specificati ed elementi che hai scelto di continuare a riprodurre, inclusi video, musica e giochi."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversazioni"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Cancella tutte le notifiche silenziose"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifiche messe in pausa in base alla modalità Non disturbare"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nessuna notifica}=1{Notifica messa in pausa da {mode}}=2{Notifiche messe in pausa da {mode} e un\'altra modalità}many{Notifiche messe in pausa da {mode} e # di modalità}other{Notifiche messe in pausa da {mode} e altre # modalità}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Avvia adesso"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Nessuna notifica"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Nessuna nuova notifica"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Mostra modalità demo"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Sveglia"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"Programmazione <xliff:g id="MODENAME">%1$s</xliff:g> attiva"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Imposta un metodo di pagamento per effettuare acquisti in modo più rapido e sicuro con il telefono"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Mostra tutto"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Speaker e display"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Dispositivi consigliati"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Input"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Output"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Interrompi la sessione condivisa per spostare i contenuti multimediali su un altro dispositivo"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Interrompi"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Come funziona la trasmissione"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icona Comprimi"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icona Espandi"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"oppure"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Punto di trascinamento"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviga usando la tastiera"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Informazioni sulle scorciatoie da tastiera"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviga usando il touchpad"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Impara i gesti con il touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Naviga usando la tastiera e il touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Scopri gesti con il touchpad, scorciatoie da tastiera e altro ancora"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto Indietro"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto Home"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Visualizza app recenti"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Fine"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Indietro"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Per tornare indietro, scorri verso sinistra o verso destra utilizzando tre dita in un punto qualsiasi del touchpad.\n\nPuoi usare anche la scorciatoia da tastiera Action + Esc per farlo."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Ottimo lavoro."</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Hai completato il gesto Indietro."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Vai alla schermata Home"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Per andare alla schermata Home, scorri verso l\'alto con tre dita dalla parte inferiore dello schermo."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bene!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Hai completato il gesto Vai alla schermata Home."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Visualizza app recenti"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Scorri verso l\'alto e tieni premuto con tre dita sul touchpad."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Ottimo lavoro."</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Hai completato il gesto Visualizza app recenti."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tasto azione"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Per accedere alle tue app, premi il tasto azione sulla tastiera."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Complimenti!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Hai completato il gesto del tasto azione.\n\nAzione + / mostra tutte le scorciatoie disponibili."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroilluminazione della tastiera"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Livello %1$d di %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Controlli della casa"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Per visualizzare tutte le tue app, premi il tasto azione sulla tastiera"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Oscurata"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Sblocca per visualizzare"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Istruzione contestuale"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Usa il touchpad per tornare indietro"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Scorri verso sinistra o destra con tre dita. Tocca per scoprire altri gesti."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Usa il touchpad per andare alla schermata Home"</string>
@@ -1446,7 +1459,7 @@
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"Usa la tastiera per visualizzare tutte le app"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Premi il tasto azione in qualsiasi momento. Tocca per scoprire altri gesti."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Ora l\'attenuazione extra è nel cursore della luminosità"</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Ora puoi usare l\'attenuazione extra per lo schermo abbassando il livello di luminosità ancora di più.\n\nDato che questa funzionalità ora fa parte del cursore della luminosità, le scorciatoie per l\'attenuazione extra vengono rimosse."</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Ora puoi usare l\'attenuazione extra per lo schermo abbassando ulteriormente il livello di luminosità.\n\nDato che questa funzionalità è ora integrata nel cursore della luminosità, le scorciatoie per l\'attenuazione extra vengono rimosse."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Rimuovi scorciatoie attenuazione extra"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Scorciatoie attenuazione extra rimosse"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Connettività"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 1c212e1..78d60e5 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"מצב מופעל"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"פועל • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"מצב מושבת"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"להגדרה"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"שינוי ב\'הגדרות\'"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{אין מצבים פעילים}=1{מצב פעיל אחד ({mode})}one{‫# מצבים פעילים}two{‫# מצבים פעילים}other{‫# מצבים פעילים}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"כדי לא להפריע לך, המכשיר לא ירטוט ולא ישמיע שום צליל, חוץ מהתראות, תזכורות, אירועים ושיחות ממתקשרים מסוימים לבחירתך. המצב הזה לא ישפיע על צלילים שהם חלק מתוכן שבחרת להפעיל, כמו מוזיקה, סרטונים ומשחקים."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"שיחות"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ניקוי כל ההתראות השקטות"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"התראות הושהו על ידי מצב \'נא לא להפריע\'"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{אין התראות}=1{ההתראות הושהו על ידי {mode}}=2{ההתראות הושהו על ידי {mode} ועל ידי מצב אחד נוסף}one{ההתראות הושהו על ידי {mode} ועל ידי # מצבים נוספים}other{ההתראות הושהו על ידי {mode} ועל ידי # מצבים נוספים}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"כן, אפשר להתחיל"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"אין התראות"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"אין התראות חדשות"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"הצגת מצב הדגמה"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"אתרנט"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"התראה"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"מצב <xliff:g id="MODENAME">%1$s</xliff:g> פועל"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"מגדירים אמצעי תשלום ונהנים מביצוע מהיר ומאובטח יותר של רכישות באמצעות הטלפון"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"הצגת הכול"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"‎<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%‎‎"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"רמקולים ומסכים"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"הצעות למכשירים"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"קלט"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"פלט"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"עצירת הסשן המשותף כדי להעביר מדיה למכשיר אחר"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"עצירה"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"הסבר על שידורים"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"סמל הכיווץ"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"סמל ההרחבה"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"או"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"נקודת האחיזה לגרירה"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ניווט באמצעות המקלדת"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"מידע על מקשי קיצור"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ניווט באמצעות לוח המגע"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"מידע על התנועות בלוח המגע"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ניווט באמצעות המקלדת ולוח המגע"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"מידע על התנועות בלוח המגע, מקשי קיצור ועוד"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"תנועת חזרה"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"תנועת חזרה למסך הבית"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"הצגת האפליקציות האחרונות"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"סיום"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"חזרה"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"‏כדי לחזור אחורה, מחליקים שמאלה או ימינה עם שלוש אצבעות בכל מקום על לוח המגע.\n\nאפשר לבצע את הפעולה הזו גם באמצעות קיצור הדרך לפעולה + מקש ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"מעולה!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"השלמת את התנועה \'הקודם\'."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"מעבר לדף הבית"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"כדי לעבור למסך הבית בכל שלב, צריך להחליק למעלה עם שלוש אצבעות מהחלק התחתון של המסך."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"איזה יופי!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"השלמת את תנועת המעבר למסך הבית."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"הצגת האפליקציות האחרונות"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"מחליקים למעלה ולוחצים לחיצה ארוכה עם שלוש אצבעות על לוח המגע."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"מעולה!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"השלמת את התנועה להצגת האפליקציות האחרונות."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"מקש הפעולה"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"כדי לגשת לאפליקציות, מקישים על מקש הפעולה במקלדת."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"כל הכבוד!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"השלמת את התנועה של מקש הפעולה.\n\nלחיצה על מקש הפעולה + מקש / מציגה את כל מקשי הקיצור הזמינים."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"התאורה האחורית במקלדת"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"‏רמה %1$d מתוך %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"שליטה במכשירים"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"כדי לראות את כל האפליקציות, מקישים על מקש הפעולה במקלדת"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"מצונזר"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"צריך לבטל את הנעילה כדי לראות"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"חינוך בהתאם להקשר"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"איך להשתמש בלוח המגע כדי לחזור אחורה"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"מחליקים ימינה או שמאלה עם שלוש אצבעות. ניתן להקיש כדי לקבל מידע נוסף על התנועות."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"איך להשתמש בלוח המגע כדי לעבור למסך הבית"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index eda727f..2a35e17c 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -440,7 +440,7 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"ON"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"ON • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"OFF"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"設定"</string>
+    <string name="zen_mode_set_up" msgid="8231201163894922821">"未設定"</string>
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"設定で管理"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{アクティブなモードはありません}=1{{mode} がアクティブです}other{# 個のモードがアクティブです}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"アラーム、リマインダー、予定、指定した人からの着信以外の音やバイブレーションに煩わされることはありません。音楽、動画、ゲームなど再生対象として選択したコンテンツは引き続き再生されます。"</string>
@@ -573,6 +573,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"会話"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"サイレント通知がすべて消去されます"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"サイレント モードにより通知は一時停止中です"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{通知なし}=1{{mode} により通知は一時停止中です}=2{{mode} と他 1 個のモードにより通知は一時停止中です}other{{mode} と他 # 個のモードにより通知は一時停止中です}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"今すぐ開始"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"通知はありません"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"新しい通知はありません"</string>
@@ -704,6 +705,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"デモモードを表示"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"イーサネット"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"アラーム"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g>: ON"</string>
     <string name="wallet_title" msgid="5369767670735827105">"ウォレット"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"スマートフォンを使ってよりすばやく安全に購入できるように設定しましょう"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"すべて表示"</string>
@@ -1396,34 +1398,33 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"閉じるアイコン"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"開くアイコン"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"または"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ドラッグ ハンドル"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"キーボードを使用して移動する"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"キーボード ショートカットの詳細"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"タッチパッドを使用して移動する"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"タッチパッド操作の詳細"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"キーボードとタッチパッドを使用して移動する"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"タッチパッド操作やキーボード ショートカットなどの詳細"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"「戻る」ジェスチャー"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"「ホーム」ジェスチャー"</string>
+    <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"戻る"</string>
+    <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ホームに移動"</string>
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"最近使ったアプリを表示する"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完了"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"戻る"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"戻るには、3 本の指でタッチパッドを左右にスワイプします。\n\nキーボード ショートカットのアクション + ESC キーを使用して、この操作を行うこともできます。"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"お疲れさまでした。"</string>
+    <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"タッチパッドを 3 本の指で左右にスワイプします"</string>
+    <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"その調子です!"</string>
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"「戻る」操作を学習しました。"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ホームに移動"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"3 本の指で画面を下から上にスワイプすると、ホーム画面にいつでも移動できます。"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"お疲れさまでした。"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"「ホームに移動」操作を学習しました。"</string>
+    <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"タッチパッドを 3 本の指で上にスワイプします"</string>
+    <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"よくできました!"</string>
+    <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"「ホームに移動」操作を学習しました"</string>
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"最近使ったアプリを表示する"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"タッチパッドを 3 本の指で上にスワイプして長押しします。"</string>
+    <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"タッチパッドを 3 本の指で上にスワイプして長押しします"</string>
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"よくできました"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"「最近使ったアプリを表示する」操作を学習しました。"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"アクションキー"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"アプリにアクセスするには、キーボードのアクションキーを押します。"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"お疲れさまでした。"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"アクションキー操作を学習しました。\n\nアクションキーと + キーを同時に押すと、利用可能なショートカットがすべて表示されます。"</string>
+    <string name="tutorial_action_key_title" msgid="8172535792469008169">"すべてのアプリを表示"</string>
+    <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"キーボードのアクションキーを押します"</string>
+    <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"完了です!"</string>
+    <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"「すべてのアプリを表示する」操作を学習しました"</string>
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"キーボード バックライト"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"レベル %1$d/%2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"ホーム コントロール"</string>
@@ -1435,6 +1436,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"すべてのアプリを表示するには、キーボードのアクションキーを押してください"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"削除済み"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"表示するにはロックを解除してください"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"コンテキスト メニューに関する説明"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"タッチパッドを使用して、前の画面に戻る"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"3 本の指で左または右にスワイプします。ジェスチャーの詳細を確認するにはタップしてください。"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"タッチパッドを使用して、ホームに移動する"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 836bd44..05a7e42 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -440,7 +440,7 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"ჩართული"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"ჩართულია • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"გამორთული"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"დაყენება"</string>
+    <string name="zen_mode_set_up" msgid="8231201163894922821">"არ არის დაყენებული"</string>
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"პარამეტრებში მართვა"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{აქტიური რეჟიმები არ მოიძებნა}=1{{mode} აქტიურია}other{აქტიურია # რეჟიმი}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"თქვენ მიერ მითითებული მაღვიძარების, შეხსენებების, მოვლენებისა და ზარების გარდა, არავითარი ხმა და ვიბრაცია არ შეგაწუხებთ. თქვენ მაინც შეძლებთ სასურველი კონტენტის, მაგალითად, მუსიკის, ვიდეოებისა და თამაშების აუდიოს მოსმენა."</string>
@@ -573,6 +573,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"საუბრები"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ყველა ჩუმი შეტყობინების გასუფთავება"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"შეტყობინებები დაპაუზდა „არ შემაწუხოთ“ რეჟიმის მეშვეობით"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{შეტყობინებები არ არის}=1{შეტყობინებები შეჩერებულია {mode}-ის გამო}=2{შეტყობინებები შეჩერებულია {mode}-ის და ერთი სხვა რეჟიმის გამო}other{შეტყობინებები შეჩერებულია {mode}-ის და # სხვა რეჟიმის გამო}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"დაწყება ახლავე"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"შეტყობინებები არ არის."</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"ახალი შეტყობინებები არ არის"</string>
@@ -704,6 +705,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"დემო-რეჟიმის ჩვენება"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ეთერნეტი"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"მაღვიძარა"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> ჩართულია"</string>
     <string name="wallet_title" msgid="5369767670735827105">"საფულე"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"დააყენეთ შესყიდვების თქვენი ტელეფონით უფრო სწრაფად და უსაფრთხოდ შესასრულებლად"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"ყველას ჩვენება"</string>
@@ -1396,34 +1398,33 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ხატულის ჩაკეცვა"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ხატულის გაფართოება"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ან"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"სახელური ჩავლებისთვის"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ნავიგაცია კლავიატურის გამოყენებით"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"კლავიატურის მალსახმობების სწავლა"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ნავიგაცია სენსორული პანელის გამოყენებით"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"სენსორული პანელის ჟესტების სწავლა"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ნავიგაცია კლავიატურის და სენსორული პანელის გამოყენებით"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"სენსორული პანელის ჟესტების, კლავიატურის მალსახმობების და სხვა ფუნქციების სწავლა"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"უკან დაბრუნების ჟესტი"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"მთავარ ეკრანზე გადასვლის ჟესტი"</string>
+    <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"უკან დაბრუნება"</string>
+    <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"მთავარ ეკრანზე გადასვლა"</string>
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ბოლო აპების ნახვა"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"მზადაა"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"უკან დაბრუნება"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"უკან დასაბრუნებლად სენსორულ პანელზე გადაფურცლეთ მარცხნივ ან მარჯვნივ სამი თითის გამოყენებით ნებისმიერ ადგილას.\n\nამისთვის თქვენ ასევე შეგიძლიათ გამოიყენოთ კლავიატურის მალსახმობის მოქმედება + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"შესანიშნავია!"</string>
+    <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"თქვენს სენსორულ პანელზე სამი თითით გადაფურცლეთ მარცხნივ ან მარჯვნივ"</string>
+    <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"მშვენიერია!"</string>
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"თქვენ შეასრულეთ უკან დაბრუნების ჟესტი."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"მთავარზე გადასვლა"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"თქვენს მთავარ ეკრანზე ნებისმიერ დროს გადასასვლელად გადაფურცლეთ ეკრანის ქვემოდან ზემოთ სამი თითით."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"მშვენიერია!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"თქვენ შეასრულეთ მთავარ ეკრანზე დაბრუნების ჟესტი."</string>
+    <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"თქვენს სენსორულ პანელზე სამი თითით გადაფურცლეთ ზევით"</string>
+    <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"შესანიშნავია!"</string>
+    <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"თქვენ შეასრულეთ მთავარ ეკრანზე გადასვლის ჟესტი"</string>
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"ბოლო აპების ნახვა"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"თქვენს სენსორულ პანელზე სამი თითით გადაფურცლეთ ზემოთ და მოიცადეთ."</string>
+    <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"თქვენს სენსორულ პანელზე სამი თითით გადაფურცლეთ ზევით და ხანგრძლივად დააჭირეთ"</string>
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"შესანიშნავია!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"თქვენ დაასრულეთ ბოლო აპების ხედის ჟესტი."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"მოქმედების კლავიში"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"აპებზე წვდომისთვის დააჭირეთ მოქმედების კლავიშს თქვენს კლავიატურაზე."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"გილოცავთ!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"თქვენ შეასრულეთ მოქმედების კლავიშის ჟესტი.\n\nქმედება + / აჩვენებს თქვენთვის ხელმისაწვდომ ყველა მალსახმობს."</string>
+    <string name="tutorial_action_key_title" msgid="8172535792469008169">"ყველა აპის ნახვა"</string>
+    <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"დააჭირეთ მოქმედების კლავიშს თქვენს კლავიატურაზე"</string>
+    <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ყოჩაღ!"</string>
+    <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"თქვენ დაასრულეთ ყველა აპის ნახვის ჟესტი"</string>
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"კლავიატურის შენათება"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"დონე: %1$d %2$d-დან"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"სახლის კონტროლი"</string>
@@ -1435,6 +1436,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"ყველა აპის სანახავად დააჭირეთ მოქმედების კლავიშს თქვენს კლავიატურაზე"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"ტექსტს ადევს ცენზურა"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"განბლოკვა სანახავად"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"კონტექსტური განათლება"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"უკან დასაბრუნებლად გამოიყენეთ სენსორული პანელი"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"გადაფურცლეთ მარცხნივ ან მარჯვნივ სამი თითით. შეეხეთ მეტი ჟესტის შესასწავლად."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"მთავარ გვერდზე გადასასვლელად გამოიყენეთ სენსორული პანელი"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index dc2a618..328c82f 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Қосулы"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Қосулы • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Өшірулі"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Реттеу"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"\"Параметрлер\" бөлімінде реттеу"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Қосулы режим жоқ}=1{{mode} қосулы}other{# режим қосулы}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Оятқыш, еске салғыш, іс-шара мен өзіңіз көрсеткен контактілердің қоңырауларынан басқа дыбыстар мен дірілдер мазаламайтын болады. Музыка, бейне және ойын сияқты медиафайлдарды қоссаңыз, оларды естисіз."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Әңгімелер"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Барлық үнсіз хабарландыруларды өшіру"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Хабарландырулар Мазаламау режимінде кідіртілді"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Хабарландырулар жоқ.}=1{Хабарландыруларды {mode} режимі кідіртті.}=2{Хабарландыруларды {mode} және тағы бір режим кідіртті.}other{Хабарландыруларды {mode} және тағы # режим кідіртті.}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Қазір бастау"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Хабарландырулар жоқ"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Жаңа хабарландырулар жоқ"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Демо режимін көрсету"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Оятқыш"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> қосулы."</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Телефоныңызбен бұрынғыдан да жылдам әрі қауіпсіз сатып алу үшін параметрлерді орнатыңыз."</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Барлығын көрсету"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Динамиктер мен дисплейлер"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Ұсынылған құрылғылар"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Кіріс"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Шығыс"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Мультимедиа файлын басқа құрылғыға жылжыту үшін ортақ сеансты тоқтатыңыз."</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Тоқтату"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Тарату қалай жүзеге асады"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Жию белгішесі"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Жаю белгішесі"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"немесе"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Сүйрейтін тетік"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Пернетақтамен жұмыс істеңіз"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Перне тіркесімдерін үйреніңіз."</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Сенсорлық тақтамен жұмыс істеңіз"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Сенсорлық тақта қимылдарын үйреніңіз."</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Пернетақтамен және сенсорлық тақтамен жұмыс істеңіз"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Сенсорлық тақта қимылдарын, перне тіркесімдерін және т.б. үйреніңіз."</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Артқа қайтару қимылы"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Негізгі бетке қайтару қимылы"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Соңғы қолданбаларды көру"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Дайын"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Артқа"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Артқа қайту үшін сенсорлық тақтаның кез келген жерін үш саусақпен солға не оңға сырғытыңыз.\n\nСондай-ақ Action + ESC перне тіркесімін пайдалануға болады."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Жарайсыз!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Артқа қайту қимылын аяқтадыңыз."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Негізгі экранға өту"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Негізгі экранға кез келген уақытта өту үшін экранның төменгі жағынан жоғары қарай үш саусағыңызбен сырғытыңыз."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Жақсы нәтиже!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Негізгі экранға қайту қимылын аяқтадыңыз."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Соңғы қолданбаларды көру"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Сенсорлық тақтада үш саусақпен жоғары сырғытып, басып тұрыңыз."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Жарайсыз!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Соңғы қолданбаларды көру қимылын орындадыңыз."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Әрекет пернесі"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Қолданбаларыңызға кіру үшін пернетақтадағы әрекет пернесін басыңыз."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Құттықтаймыз!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Әрекет пернесі қимылын аяқтадыңыз.\n\n\"+ /\" әрекеті сіз үшін қолжетімді барлық таңбашаны көрсетеді."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Пернетақта жарығы"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Деңгей: %1$d/%2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Үй басқару элементтері"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Пернетақтада әрекет пернесін басып, барлық қолданбаны көре аласыз."</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Жасырылған"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Көру үшін құлыпты ашыңыз."</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Контекстік білім"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Артқа қайту үшін сенсорлық тақтаны қолданыңыз"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Үш саусақпен солға не оңға сырғытыңыз. Басқа қимылдарды үйрену үшін түртіңіз."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Негізгі бетке өту үшін сенсорлық тақтаны қолданыңыз"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 6c15c79..dce1adc 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"បើក"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"បើក • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"បិទ"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"រៀបចំ"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"គ្រប់គ្រង​នៅ​ក្នុង​ការកំណត់"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{គ្មានមុខងារ​ដែលកំពុងដំណើរការទេ}=1{{mode} កំពុង​ដំណើរការ}other{មុខងារ # កំពុងដំណើរការ}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"សំឡេង និងរំញ័រនឹងមិន​រំខានដល់អ្នកឡើយ លើកលែងតែម៉ោងរោទ៍ ការរំលឹក ព្រឹត្តិការណ៍ និងអ្នកហៅទូរសព្ទដែលអ្នកបញ្ជាក់ប៉ុណ្ណោះ។ អ្នកនឹងនៅតែឮសំឡេងសកម្មភាពគ្រប់យ៉ាងដែលអ្នកលេងដដែល រួមទាំងតន្រ្តី វីដេអូ និងហ្គេម។"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"ការសន្ទនា"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"សម្អាត​ការជូនដំណឹង​ស្ងាត់ទាំងអស់"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ការជូនដំណឹង​បានផ្អាក​ដោយ​មុខងារកុំរំខាន"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{គ្មាន​ការជូន​ដំណឹង}=1{ការជូនដំណឹង​ត្រូវបាន​ផ្អាកដោយ {mode}}=2{ការជូនដំណឹង​ត្រូវបាន​ផ្អាកដោយ {mode} និង​មុខងារមួយ​ផ្សេងទៀត}other{ការជូនដំណឹង​ត្រូវបាន​ផ្អាកដោយ {mode} និង​មុខងារ # ផ្សេងទៀត}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"ចាប់ផ្ដើម​ឥឡូវ"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"គ្មាន​ការ​ជូនដំណឹង"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"គ្មាន​ការ​ជូន​ដំណឹង​​ថ្មីៗទេ"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"បង្ហាញរបៀបសាកល្បង"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"អ៊ីសឺរណិត"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"ម៉ោងរោទ៍"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> ត្រូវបាន​បើក"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"ធ្វើការ​រៀបចំ ដើម្បី​ធ្វើការទិញ​កាន់តែលឿន​ជាងមុន សុវត្ថិភាព​ជាងមុន ដោយ​ប្រើ​ទូរសព្ទ​របស់អ្នក"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"បង្ហាញ​ទាំងអស់"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"រូបតំណាង \"បង្រួម\""</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"រូបតំណាង \"ពង្រីក\""</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ឬ"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ដង​អូស"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"រុករកដោយប្រើក្ដារចុចរបស់អ្នក"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ស្វែងយល់អំពីផ្លូវកាត់​ក្ដារ​ចុច"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"រុករកដោយប្រើផ្ទាំងប៉ះរបស់អ្នក"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ស្វែងយល់អំពីចលនាផ្ទាំងប៉ះ"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"រុករកដោយប្រើក្ដារចុច និងផ្ទាំងប៉ះរបស់អ្នក"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ស្វែងយល់អំពីចលនាផ្ទាំងប៉ះ ផ្លូវកាត់​ក្ដារ​ចុច និងអ្វីៗជាច្រើនទៀត"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ចលនាថយក្រោយ"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ចលនាទៅទំព័រដើម"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"មើលកម្មវិធីថ្មីៗ"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"រួចរាល់"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ថយ​ក្រោយ"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"ដើម្បីថយក្រោយ សូមអូសទៅឆ្វេង ឬស្ដាំដោយប្រើ​​ម្រាមដៃបីនៅត្រង់ណាក៏បានលើផ្ទាំងប៉ះ។\n\nអ្នកក៏អាចប្រើសកម្មភាពផ្លូវកាត់ក្ដារចុច + ESC សម្រាប់ការធ្វើបែបនេះ។"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"ធ្វើបានល្អ!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"អ្នក​បានបញ្ចប់​ចលនា​ថយក្រោយ​ហើយ។"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ទៅទំព័រដើម"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"ដើម្បីចូលទៅអេក្រង់ដើមរបស់អ្នកនៅពេលណាក៏បាន សូមអូសឡើងលើដោយប្រើម្រាមដៃបីពីផ្នែកខាងក្រោមនៃអេក្រង់របស់អ្នក។"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"ល្អ!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"អ្នក​បានបញ្ចប់​ចលនា​ចូលទៅកាន់​ទំព័រដើម​ហើយ។"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"មើលកម្មវិធីថ្មីៗ"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"អូសឡើងលើ ហើយសង្កត់ឱ្យជាប់ដោយប្រើម្រាមដៃបីលើផ្ទាំងប៉ះរបស់អ្នក។"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ធ្វើបានល្អ!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"អ្នកបានបញ្ចប់ការមើលចលនាកម្មវិធីថ្មីៗ។"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"គ្រាប់ចុចសកម្មភាព"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"ដើម្បីចូលប្រើប្រាស់កម្មវិធីរបស់អ្នក សូមចុចគ្រាប់ចុចសកម្មភាពនៅលើក្ដារចុចរបស់អ្នក។"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"សូមអបអរសាទរ!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"អ្នកបានបញ្ចប់មេរៀនអំពីចលនាសម្រាប់គ្រាប់ចុចសកម្មភាព។\n\nគ្រាប់ចុចសកម្មភាព + / បង្ហាញផ្លូវកាត់ទាំងអស់ដែលអ្នកអាចប្រើបាន។"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ពន្លឺក្រោយក្ដារចុច"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"កម្រិតទី %1$d នៃ %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"ការគ្រប់គ្រង​ផ្ទះ"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"ដើម្បីមើលកម្មវិធីទាំងអស់របស់អ្នក សូមចុចគ្រាប់ចុចសកម្មភាពនៅលើក្ដារចុចរបស់អ្នក"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"បាន​កែ​លម្អ​ពាក្យពេចន៍"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"ដោះសោដើម្បីមើល"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"ការអប់រំ​តាមបរិបទ"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"ប្រើផ្ទាំងប៉ះរបស់អ្នក ដើម្បីថយក្រោយ"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"អូសទៅឆ្វេង ឬស្ដាំដោយប្រើ​ម្រាមដៃបី។ ចុច ដើម្បីស្វែងយល់បន្ថែមអំពីចលនា។"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"ប្រើផ្ទាំងប៉ះរបស់អ្នក ដើម្បីចូលទៅទំព័រដើម"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index a16f110..5ac9102 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -83,7 +83,7 @@
     <string name="screenshot_failed_to_save_user_locked_text" msgid="6156607948256936920">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಉಳಿಸುವ ಮೊದಲು ಸಾಧನವನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಬೇಕು"</string>
     <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಅನ್ನು ಪುನಃ ತೆಗೆದುಕೊಳ್ಳಲು ಪ್ರಯತ್ನಿಸಿ"</string>
     <string name="screenshot_failed_to_save_text" msgid="7232739948999195960">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಉಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
-    <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ಅಪ್ಲಿಕೇಶನ್ ಅಥವಾ ಸಂಸ್ಥೆಯು ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳನ್ನು ತೆಗೆಯುವುದನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
+    <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ಆ್ಯಪ್ ಅಥವಾ ಸಂಸ್ಥೆಯು ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳನ್ನು ತೆಗೆಯುವುದನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುವುದನ್ನು ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರು ನಿರ್ಬಂಧಿಸಿದ್ದಾರೆ"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"ಎಡಿಟ್ ಮಾಡಿ"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"ಆನ್ ಆಗಿದೆ"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"<xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g> • ನಲ್ಲಿ"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"ಆಫ್ ಆಗಿದೆ"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"ಸೆಟಪ್ ಮಾಡಿ"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ನಿರ್ವಹಿಸಿ"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{ಯಾವುದೇ ಸಕ್ರಿಯ ಮೋಡ್‌ಗಳಿಲ್ಲ}=1{{mode} ಸಕ್ರಿಯವಾಗಿದೆ}one{# ಮೋಡ್‌ಗಳು ಸಕ್ರಿಯವಾಗಿವೆ}other{# ಮೋಡ್‌ಗಳು ಸಕ್ರಿಯವಾಗಿವೆ}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"ಅಲಾರಾಂಗಳು, ಜ್ಞಾಪನೆಗಳು, ಈವೆಂಟ್‌ಗಳು ಹಾಗೂ ನೀವು ಸೂಚಿಸಿರುವ ಕರೆದಾರರನ್ನು ಹೊರತುಪಡಿಸಿ ಬೇರಾವುದೇ ಸದ್ದುಗಳು ಅಥವಾ ವೈಬ್ರೇಶನ್‌ಗಳು ನಿಮಗೆ ತೊಂದರೆ ನೀಡುವುದಿಲ್ಲ. ಹಾಗಿದ್ದರೂ, ನೀವು ಪ್ಲೇ ಮಾಡುವ ಸಂಗೀತ, ವೀಡಿಯೊಗಳು ಮತ್ತು ಆಟಗಳ ಆಡಿಯೊವನ್ನು ನೀವು ಕೇಳಿಸಿಕೊಳ್ಳುತ್ತೀರಿ."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"ಸಂಭಾಷಣೆಗಳು"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ಎಲ್ಲಾ ನಿಶ್ಶಬ್ಧ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಎನ್ನುವ ಮೂಲಕ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{ಯಾವುದೇ ನೋಟಿಫಿಕೇಶನ್‌ಗಳು ಇಲ್ಲ}=1{ನೋಟಿಫಿಕೇಶನ್‌ಗಳನ್ನು {mode} ವಿರಾಮಗೊಳಿಸಿದೆ}=2{ನೋಟಿಫಿಕೇಶನ್‌ಗಳನ್ನು {mode} ಹಾಗೂ ಇತರ ಒಂದು ಮೋಡ್ ವಿರಾಮಗೊಳಿಸಿವೆ}one{ನೋಟಿಫಿಕೇಶನ್‌ಗಳನ್ನು {mode} ಹಾಗೂ ಇತರ # ಮೋಡ್‌ಗಳು ವಿರಾಮಗೊಳಿಸಿವೆ}other{ನೋಟಿಫಿಕೇಶನ್‌ಗಳನ್ನು {mode} ಹಾಗೂ ಇತರ # ಮೋಡ್‌ಗಳು ವಿರಾಮಗೊಳಿಸಿವೆ}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"ಈಗ ಪ್ರಾರಂಭಿಸಿ"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"ಯಾವುದೇ ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"ಯಾವುದೇ ಹೊಸ ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"ಡೆಮೊ ಮೋಡ್ ತೋರಿಸು"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ಇಥರ್ನೆಟ್"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"ಅಲಾರಮ್"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> ಆನ್ ಆಗಿದೆ"</string>
     <string name="wallet_title" msgid="5369767670735827105">"ವಾಲೆಟ್"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"ನಿಮ್ಮ ಫೋನ್ ಮೂಲಕ ವೇಗವಾದ, ಹೆಚ್ಚು ಸುರಕ್ಷಿತ ಖರೀದಿಗಳನ್ನು ಮಾಡಲು ಸೆಟಪ್ ಮಾಡಿಕೊಳ್ಳಿ"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"ಎಲ್ಲವನ್ನೂ ತೋರಿಸಿ"</string>
@@ -963,7 +966,7 @@
     <string name="tuner_left" msgid="5758862558405684490">"ಎಡ"</string>
     <string name="tuner_right" msgid="8247571132790812149">"ಬಲ"</string>
     <string name="tuner_menu" msgid="363690665924769420">"ಮೆನು"</string>
-    <string name="tuner_app" msgid="6949280415826686972">"<xliff:g id="APP">%1$s</xliff:g> ಅಪ್ಲಿಕೇಶನ್"</string>
+    <string name="tuner_app" msgid="6949280415826686972">"<xliff:g id="APP">%1$s</xliff:g> ಆ್ಯಪ್"</string>
     <string name="notification_channel_alerts" msgid="3385787053375150046">"ಅಲರ್ಟ್‌ಗಳು"</string>
     <string name="notification_channel_battery" msgid="9219995638046695106">"ಬ್ಯಾಟರಿ"</string>
     <string name="notification_channel_screenshot" msgid="7665814998932211997">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳು"</string>
@@ -986,8 +989,8 @@
     <string name="dnd_is_off" msgid="3185706903793094463">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆಫ್ ಆಗಿದೆ"</string>
     <string name="dnd_is_on" msgid="7009368176361546279">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಮೋಡ್ ಆನ್ ಆಗಿದೆ"</string>
     <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"(<xliff:g id="ID_1">%s</xliff:g>) ಸ್ವಯಂಚಾಲಿತ ನಿಯಮದ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string>
-    <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"(<xliff:g id="ID_1">%s</xliff:g>) ಅಪ್ಲಿಕೇಶನ್‌ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string>
-    <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"ಸ್ವಯಂಚಾಲಿತ ನಿಯಮ ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್‌ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string>
+    <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"(<xliff:g id="ID_1">%s</xliff:g>) ಆ್ಯಪ್‌ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string>
+    <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"ಸ್ವಯಂಚಾಲಿತ ನಿಯಮ ಅಥವಾ ಆ್ಯಪ್‌ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string>
     <string name="running_foreground_services_title" msgid="5137313173431186685">"ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿವೆ"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"ಬ್ಯಾಟರಿ,ಡೇಟಾ ಬಳಕೆಯ ವಿವರಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"ಮೊಬೈಲ್ ಡೇಟಾ ಆಫ್ ಮಾಡಬೇಕೆ?"</string>
@@ -997,7 +1000,7 @@
     <string name="auto_data_switch_disable_message" msgid="5885533647399535852">"ಲಭ್ಯತೆಯ ಆಧಾರದ ಮೇಲೆ ಮೊಬೈಲ್ ಡೇಟಾ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಬದಲಾಗುವುದಿಲ್ಲ"</string>
     <string name="auto_data_switch_dialog_negative_button" msgid="2370876875999891444">"ಬೇಡ, ಧನ್ಯವಾದಗಳು"</string>
     <string name="auto_data_switch_dialog_positive_button" msgid="8531782041263087564">"ಹೌದು, ಬದಲಿಸಿ"</string>
-    <string name="touch_filtered_warning" msgid="8119511393338714836">"ಅನುಮತಿ ವಿನಂತಿಯನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಮರೆಮಾಚುತ್ತಿರುವ ಕಾರಣ, ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+    <string name="touch_filtered_warning" msgid="8119511393338714836">"ಅನುಮತಿ ವಿನಂತಿಯನ್ನು ಆ್ಯಪ್ ಮರೆಮಾಚುತ್ತಿರುವ ಕಾರಣ, ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_2">%2$s</xliff:g> ಸ್ಲೈಸ್‌ಗಳನ್ನು ತೋರಿಸಲು <xliff:g id="APP_0">%1$s</xliff:g> ಅನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
     <string name="slice_permission_text_1" msgid="6675965177075443714">"- ಇದು <xliff:g id="APP">%1$s</xliff:g> ನಿಂದ ಮಾಹಿತಿಯನ್ನು ಓದಬಹುದು"</string>
     <string name="slice_permission_text_2" msgid="6758906940360746983">"- ಇದು <xliff:g id="APP">%1$s</xliff:g> ಒಳಗಡೆ ಕ್ರಿಯೆಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ಸ್ಪೀಕರ್‌ಗಳು ಮತ್ತು ಡಿಸ್‌ಪ್ಲೇಗಳು"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"ಸೂಚಿಸಿದ ಸಾಧನಗಳು"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"ಇನ್‌ಪುಟ್"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"ಔಟ್‌ಪುಟ್"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"ಮೀಡಿಯಾವನ್ನು ಮತ್ತೊಂದು ಸಾಧನಕ್ಕೆ ಸರಿಸಲು ನಿಮ್ಮ ಹಂಚಿಕೊಂಡ ಸೆಶನ್ ಅನ್ನು ನಿಲ್ಲಿಸಿ"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"ನಿಲ್ಲಿಸಿ"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ಪ್ರಸಾರವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ಕುಗ್ಗಿಸುವ ಐಕಾನ್"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ವಿಸ್ತೃತಗೊಳಿಸುವ ಐಕಾನ್"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ಅಥವಾ"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ಡ್ರ್ಯಾಗ್‌ ಹ್ಯಾಂಡಲ್‌"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ ಬಳಸಿ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳನ್ನು ಕಲಿಯಿರಿ"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ನಿಮ್ಮ ಟಚ್‌ಪ್ಯಾಡ್ ಬಳಸಿ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ಟಚ್‌ಪ್ಯಾಡ್ ಗೆಸ್ಚರ್‌ಗಳನ್ನು ಕಲಿಯಿರಿ"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ ಮತ್ತು ಟಚ್‌ಪ್ಯಾಡ್ ಬಳಸಿ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ಟಚ್‌ಪ್ಯಾಡ್ ಗೆಸ್ಚರ್‌ಗಳು, ಕೀಬೋರ್ಡ್‌ಗಳ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ತಿಳಿಯಿರಿ"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ಹಿಂಬದಿ ಗೆಸ್ಚರ್"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ಹೋಮ್ ಗೆಸ್ಚರ್"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ಮುಗಿದಿದೆ"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ಹಿಂತಿರುಗಿ"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"ಹಿಂತಿರುಗಲು, ಟಚ್‌ಪ್ಯಾಡ್‌ನಲ್ಲಿ ಎಲ್ಲಿಯಾದರೂ ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಎಡ ಅಥವಾ ಬಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ.\n\nಇದಕ್ಕಾಗಿ ನೀವು ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್ Action + ESC ಅನ್ನು ಸಹ ಬಳಸಬಹುದು."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"ಭೇಷ್!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"ನೀವು ಗೋ ಬ್ಯಾಕ್ ಗೆಸ್ಚರ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ಮುಖಪುಟಕ್ಕೆ ಹೋಗಿ"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ನಿಮ್ಮ ಹೋಮ್ ಸ್ಕ್ರೀನ್‌ಗೆ ಹೋಗಲು, ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಕೆಳಗಿನಿಂದ ಮೂರು ಬೆರಳುಗಳಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"ಭೇಷ್!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"ನೀವು ಗೋ ಹೋಮ್ ಗೆಸ್ಚರ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"ನಿಮ್ಮ ಟಚ್‌ಪ್ಯಾಡ್‌ನಲ್ಲಿ ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ಭೇಷ್‌!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ನೀವು ಇತ್ತೀಚಿನ ಆ್ಯಪ್‌ಗಳ ಗೆಸ್ಚರ್‌ ವೀಕ್ಷಣೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"ಆ್ಯಕ್ಷನ್‌ ಕೀ"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"ನಿಮ್ಮ ಆ್ಯಪ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು, ನಿಮ್ಮ ಕೀಬೋರ್ಡ್‌ನಲ್ಲಿರುವ ಆ್ಯಕ್ಷನ್‌ ಕೀಯನ್ನು ಒತ್ತಿರಿ."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"ಅಭಿನಂದನೆಗಳು!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"ನೀವು ಆ್ಯಕ್ಷನ್‌ ಕೀ ಗೆಸ್ಚರ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ.\n\nನಿಮಗೆ ಲಭ್ಯವಿರುವ ಎಲ್ಲಾ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳನ್ನು ಆ್ಯಕ್ಷನ್‌ + / ತೋರಿಸುತ್ತದೆ."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ಕೀಬೋರ್ಡ್ ಬ್ಯಾಕ್‌ಲೈಟ್"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d ರಲ್ಲಿ %1$d ಮಟ್ಟ"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"ಮನೆ ನಿಯಂತ್ರಣಗಳು"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"ನಿಮ್ಮ ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಲು, ನಿಮ್ಮ ಕೀಬೋರ್ಡ್‌ನಲ್ಲಿರುವ ಆ್ಯಕ್ಷನ್‌ ಕೀಯನ್ನು ಒತ್ತಿರಿ"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"ಅರ್ಥಬದ್ಧವಾಗಿಸಲಾಗಿದೆ"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"ನೋಡಲು ಅನ್‌ಲಾಕ್ ಮಾಡಿ"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"ಸಂದರ್ಭೋಚಿತ ಶಿಕ್ಷಣ"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"ಹಿಂತಿರುಗಲು ನಿಮ್ಮ ಟಚ್‌ಪ್ಯಾಡ್ ಅನ್ನು ಬಳಸಿ"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"ಮೂರು ಬೆರಳುಗಳಿಂದ ಎಡಕ್ಕೆ ಅಥವಾ ಬಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ. ಇನ್ನಷ್ಟು ಗೆಸ್ಚರ್‌ಗಳನ್ನು ತಿಳಿಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"ಹೋಮ್‌ಗೆ ಹೋಗಲು ನಿಮ್ಮ ಟಚ್‌ಪ್ಯಾಡ್ ಅನ್ನು ಬಳಸಿ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 622f0fb..b7d81b4 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"사용"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"켜짐 • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"사용 안함"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"설정"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"설정에서 관리"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{활성화된 모드 없음}=1{{mode} 모드가 활성화됨}other{모드 #개가 활성화됨}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"알람, 알림, 일정 및 지정한 발신자로부터 받은 전화를 제외한 소리와 진동을 끕니다. 음악, 동영상, 게임 등 재생하도록 선택한 소리는 정상적으로 들립니다."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"대화"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"무음 알림 모두 삭제"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"방해 금지 모드로 알림이 일시중지됨"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{알림 없음}=1{{mode} 모드로 인해 알림이 일시중지되었습니다.}=2{{mode} 및 다른 모드로 인해 알림이 일시중지되었습니다.}other{{mode} 및 다른 모드 #개로 인해 알림이 일시중지되었습니다.}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"시작하기"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"알림 없음"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"새로운 알림 없음"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"데모 모드 표시"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"이더넷"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"알람"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> 사용 중"</string>
     <string name="wallet_title" msgid="5369767670735827105">"월렛"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"설정하여 휴대전화로 더욱 빠르고 안전하게 구매하세요."</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"모두 표시"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"스피커 및 디스플레이"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"추천 기기"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"입력"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"출력"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"미디어를 다른 기기로 이동하려면 공유 세션을 중지하세요."</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"중지"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"브로드캐스팅 작동 원리"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"접기 아이콘"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"확장 아이콘"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"또는"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"드래그 핸들"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"키보드를 사용하여 이동"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"단축키 알아보기"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"터치패드를 사용하여 이동"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"터치패드 동작 알아보기"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"키보드와 터치패드를 사용하여 이동"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"터치패드 동작, 단축키 등 알아보기"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"뒤로 동작"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"홈 동작"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"최근 앱 보기"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"완료"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"뒤로"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"돌아가려면 세 손가락을 사용해 터치패드의 아무 곳이나 왼쪽 또는 오른쪽으로 스와이프합니다.\n\n키보드 단축키 Action + ESC를 사용할 수도 있습니다."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"아주 좋습니다"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"돌아가기 동작을 완료했습니다."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"홈으로 이동"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"언제든지 홈 화면으로 이동하려면 세 손가락으로 화면 하단에서 위로 스와이프하세요."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"좋습니다"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"홈으로 이동 동작을 완료했습니다."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"최근 앱 보기"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"터치패드에서 세 손가락을 사용해 위로 스와이프한 후 잠시 기다리세요."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"아주 좋습니다"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"최근 앱 보기 동작을 완료했습니다."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"작업 키"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"앱에 액세스하려면 키보드의 작업 키를 누르세요."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"축하합니다"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"작업 키 동작을 완료했습니다.\n\n작업 키 + /를 누르면 사용 가능한 모든 단축키가 표시됩니다."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"키보드 백라이트"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d단계 중 %1$d단계"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"홈 컨트롤"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"모든 앱을 보려면 키보드의 작업 키를 누르세요"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"수정됨"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"잠금 해제하여 보기"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"컨텍스트 교육"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"터치패드를 사용하여 돌아가기"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"세 손가락을 사용해 왼쪽 또는 오른쪽으로 스와이프하세요. 더 많은 동작을 알아보려면 탭하세요."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"터치패드를 사용하여 홈으로 이동"</string>
@@ -1445,8 +1458,8 @@
     <string name="overview_edu_notification_content" msgid="3578204677648432500">"세 손가락을 사용해 위로 스와이프한 다음 잠시 기다리세요. 더 많은 동작을 알아보려면 탭하세요."</string>
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"키보드를 사용하여 모든 앱 보기"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"언제든지 작업 키를 누릅니다. 더 많은 동작을 알아보려면 탭하세요."</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"이제 \'더 어둡게\' 기능이 밝기 슬라이더에 추가되었습니다"</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"이제 밝기 수준을 더 낮춰 화면을 더 어둡게 만들 수 있습니다.\n\n이 기능은 이제 밝기 슬라이더에 포함되므로 \'더 어둡게\' 단축키가 삭제됩니다."</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"\'더 어둡게\' 기능이 밝기 슬라이더에 추가되었습니다"</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"이제 밝기 수준을 더 낮춰 화면을 더 어둡게 만들 수 있습니다.\n\n밝기 슬라이더에서 이 기능을 이용할 수 있으므로 \'더 어둡게\' 단축키가 삭제됩니다."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"\'더 어둡게\' 단축키 삭제"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"\'더 어둡게\' 단축키가 삭제되었습니다."</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"연결"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 0edb3f8..da4d4c3 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Күйүк"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Күйүк • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Өчүк"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Тууралоо"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Параметрлерден тескөө"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Жигердүү режимдер жок}=1{{mode} иштеп жатат}other{# режим иштеп жатат}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Ойготкучтардан, эскертүүлөрдөн, жылнаамадагы иш-чараларды эстеткичтерден жана белгиленген байланыштардын чалууларынан тышкары башка үндөр жана дирилдөөлөр тынчыңызды албайт. Бирок ойнотулуп жаткан музыканы, видеолорду жана оюндарды мурдагыдай эле уга бересиз."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Сүйлөшүүлөр"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Бардык үнсүз билдирмелерди өчүрүү"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\"Тынчымды алба\" режиминде билдирмелер тындырылды"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Билдирмелер жок}=1{{mode} режими билдирмелерди тындырды}=2{{mode} жана дагы бир режим билдирмелерди тындырды}other{{mode} жана дагы # режим билдирмелерди тындырды}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Азыр баштоо"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Билдирме жок"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Жаңы билдирмелер жок"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Демо режимин көрсөтүү"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Ойготкуч"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> күйүк"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Капчык"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Телефонуңуз менен тез жана коопсуз сатып алуу үчүн жөндөңүз"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Баарын көрсөтүү"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Динамиктер жана дисплейлер"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Сунушталган түзмөктөр"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Киргизүү"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Чыккан маалымат"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Медиафайлдарды башка түзмөккө жылдыруу үчүн жалпы сеансыңызды токтотуңуз"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Токтотуу"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Кабарлоо кантип иштейт"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Жыйыштыруу сүрөтчөсү"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Жайып көрсөтүү сүрөтчөсү"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"же"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Cүйрөө маркери"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Нерселерге баскычтоп аркылуу өтүңүз"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Ыкчам баскычтар тууралуу билип алыңыз"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Нерселерге сенсордук такта аркылуу өтүңүз"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Сенсордук тактадагы жаңсоолорду үйрөнүп алыңыз"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Нерселерге баскычтоп жана сенсордук такта аркылуу өтүңүз"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Сенсордук тактадагы жаңсоолор, ыкчам баскычтар жана башкалар жөнүндө билип алыңыз"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Артка кайтуу жаңсоосу"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Башкы бетке өтүү жаңсоосу"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Акыркы колдонмолорду көрүү"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Бүттү"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Артка кайтуу"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Кайтуу үчүн сенсордук тактанын каалаган жерин үч манжаңыз менен солго же оңго сүрүңүз.\n\nОшондой эле Action + ESC баскычтарынын айкалышын колдоно аласыз."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Азаматсыз!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"\"Артка\" жаңсоосу боюнча үйрөткүчтү бүтүрдүңүз."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Башкы бетке өтүү"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Каалаган убакта башкы экранга өтүү үчүн экранды үч манжаңыз менен ылдыйдан жогору карай сүрүңүз."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Сонун!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"\"Башкы бетке өтүү\" жаңсоосун үйрөндүңүз."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Акыркы колдонмолорду көрүү"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Сенсордук тактаны үч манжаңыз менен өйдө сүрүп, кармап туруңуз."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Азаматсыз!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Акыркы колдонмолорду көрүү жаңсоосун аткардыңыз."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Аракет баскычы"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Бардык колдонмолоруңузду көрүү үчүн баскычтобуңуздагы аракет баскычын басыңыз"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Куттуктайбыз!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Аракет баскычынын жаңсоосун аткардыңыз.\n\n+ / аракети бардык жеткиликтүү ыкчам баскычтарды көрсөтөт."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Баскычтоптун жарыгы"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d ичинен %1$d-деңгээл"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Үйдөгү түзмөктөрдү тескөө"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Бардык колдонмолоруңузду көрүү үчүн баскычтобуңуздагы аракет баскычын басыңыз"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Жашырылды"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Көрүү үчүн кулпусун ачыңыз"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Контексттик билим берүү"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Артка кайтуу үчүн сенсордук тактаны колдонуңуз"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Үч манжаңыз менен солго же оңго сүрүңүз. Башка жаңсоолорду үйрөнүү үчүн таптаңыз."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Башкы бетке өтүү үчүн сенсордук тактаны колдонуңуз"</string>
@@ -1446,7 +1459,7 @@
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"Бардык колдонмолорду көрүү үчүн баскычтобуңузду колдонуңуз"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Каалаганда аракет баскычын басыңыз. Башка жаңсоолорду үйрөнүү үчүн таптаңыз."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Кошумча караңгылатуу эми жарыктык сыдырмасында жайгашкан"</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Эми экрандын жарыктыктыгынын деңгээлин азайтып, экранды кошумча караңгылата аласыз.\n\nБул функция эми жарыктык сыдырмасынын бир бөлүгү болуп калгандыктан, кошумча караңгылатуунун ыкчам баскычтары өтүрүлөт."</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Эми экрандын жарыктыктыгынын деңгээлин азайтып, аны кошумча караңгылата аласыз.\n\nБул функция эми жарыктык сыдырмасынын бир бөлүгү болуп калгандыктан, кошумча караңгылатуунун ыкчам баскычтары өчүрүлөт."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Кошумча караңгылатуу ыкчам баскычтарын өчүрүү"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Кошумча караңгылатуу ыкчам баскычтары өчүрүлдү"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Байланыш"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 242d766..92b3974 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -440,7 +440,7 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"ເປີດ"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"ເປີດ • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"ປິດ"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"ຕັ້ງຄ່າ"</string>
+    <string name="zen_mode_set_up" msgid="8231201163894922821">"ຍັງບໍ່ໄດ້ຕັ້ງ"</string>
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"ຈັດການໃນການຕັ້ງຄ່າ"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{ບໍ່ມີໂໝດທີ່ເຮັດວຽກຢູ່}=1{{mode} ເຮັດວຽກຢູ່}other{# ໂໝດເຮັດວຽກຢູ່}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"ທ່ານຈະບໍ່ໄດ້ຮັບການລົບກວນຈາກສຽງ ແລະ ການສັ່ນເຕືອນ, ຍົກເວັ້ນໃນເວລາໂມງປຸກດັງ, ມີການແຈ້ງເຕືອນ ຫຼື ມີສາຍໂທເຂົ້າຈາກຜູ້ໂທທີ່ທ່ານລະບຸໄວ້. ທ່ານອາດຍັງຄົງໄດ້ຍິນຫາກທ່ານເລືອກຫຼິ້ນເພງ, ວິດີໂອ ແລະ ເກມ."</string>
@@ -573,6 +573,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"ການສົນທະນາ"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ລຶບລ້າງການແຈ້ງເຕືອນແບບງຽບທັງໝົດ"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ຢຸດການແຈ້ງເຕືອນໂດຍໂໝດຫ້າມລົບກວນແລ້ວ"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{ບໍ່ມີການແຈ້ງເຕືອນ}=1{{mode} ຢຸດການແຈ້ງເຕືອນໄວ້ຊົ່ວຄາວ}=2{{mode} ແລະ ອີກ 1 ໂໝດຢຸດການແຈ້ງເຕືອນໄວ້ຊົ່ວຄາວ}other{{mode} ແລະ ອີກ # ໂໝດຢຸດການແຈ້ງເຕືອນໄວ້ຊົ່ວຄາວ}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"ເລີ່ມດຽວນີ້"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"ບໍ່ມີການແຈ້ງເຕືອນ"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"ບໍ່ມີການແຈ້ງເຕືອນໃໝ່"</string>
@@ -704,6 +705,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"ສະ​ແດງ​ໂຫມດ​ສາ​ທິດ"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ອີ​ເທ​ເນັດ"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"ໂມງປຸກ"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> ເປີດຢູ່"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"ຕັ້ງຄ່າເພື່ອຊື້ດ້ວຍໂທລະສັບຂອງທ່ານໄດ້ໄວຂຶ້ນ ແລະ ປອດໄພຂຶ້ນ"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"ສະແດງທັງໝົດ"</string>
@@ -1179,10 +1181,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ລຳໂພງ ແລະ ຈໍສະແດງຜົນ"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"ອຸປະກອນທີ່ແນະນຳ"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"ອິນພຸດ"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"ເອົ້າພຸດ"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"ຢຸດເຊດຊັນທີ່ແບ່ງປັນຂອງທ່ານເພື່ອຍ້າຍມີເດຍໄປຫາອຸປະກອນອື່ນ"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"ຢຸດ"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ການອອກອາກາດເຮັດວຽກແນວໃດ"</string>
@@ -1398,34 +1398,33 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ໄອຄອນຫຍໍ້ລົງ"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ໄອຄອນຂະຫຍາຍ"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ຫຼື"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ບ່ອນຈັບລາກ"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ນຳທາງໂດຍໃຊ້ແປ້ນພິມຂອງທ່ານ"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ສຶກສາຄີລັດ"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ນຳທາງໂດຍໃຊ້ແຜ່ນສຳຜັດຂອງທ່ານ"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ສຶກສາທ່າທາງຂອງແຜ່ນສຳຜັດ"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ນຳທາງໂດຍໃຊ້ແປ້ນພິມ ແລະ ແຜ່ນສຳຜັດຂອງທ່ານ"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ສຶກສາທ່າທາງຂອງແຜ່ນສຳຜັດ, ຄີລັດ ແລະ ອື່ນໆ"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ທ່າທາງສຳລັບກັບຄືນ"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ທ່າທາງສຳລັບໜ້າຫຼັກ"</string>
+    <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"ກັບຄືນ"</string>
+    <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ໄປຫາໜ້າຫຼັກ"</string>
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ເບິ່ງແອັບຫຼ້າສຸດ"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ແລ້ວໆ"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ກັບຄືນ"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"ເພື່ອກັບຄືນ, ໃຫ້ໃຊ້ 3 ນິ້ວປັດຊ້າຍ ຫຼື ຂວາບ່ອນໃດກໍໄດ້ເທິງແຜ່ນສຳຜັດ.\n\nທ່ານຍັງສາມາດໃຊ້ຄຳສັ່ງຄີລັດ + ESC ສຳລັບການດຳເນີນການນີ້ໄດ້ນຳ."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"ເກັ່ງຫຼາຍ!"</string>
+    <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"ປັດຊ້າຍ ຫຼື ຂວາໂດຍໃຊ້ມືສາມນິ້ວຢູ່ແຜ່ນສໍາຜັດຂອງທ່ານ"</string>
+    <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"ດີ!"</string>
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"ທ່ານໃຊ້ທ່າທາງກັບຄືນສຳເລັດແລ້ວ."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ໄປຫາໜ້າຫຼັກ"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"ເພື່ອໄປຫາໜ້າຫຼັກຂອງທ່ານຕອນໃດກໍໄດ້, ໃຫ້ປັດຂຶ້ນດ້ວຍສາມນິ້ວຈາກລຸ່ມສຸດຂອງໜ້າຈໍຂອງທ່ານ."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"ດີຫຼາຍ!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"ທ່ານໃຊ້ທ່າທາງໄປໜ້າຫຼັກສຳເລັດແລ້ວ."</string>
+    <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"ປັດຂຶ້ນໂດຍໃຊ້ມືສາມນິ້ວຢູ່ແຜ່ນສໍາຜັດຂອງທ່ານ"</string>
+    <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"ດີຫຼາຍ!"</string>
+    <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"ທ່ານໃຊ້ທ່າທາງໄປໜ້າຫຼັກສຳເລັດແລ້ວ"</string>
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"ເບິ່ງແອັບຫຼ້າສຸດ"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"ໃຊ້ 3 ນິ້ວປັດຂຶ້ນແລ້ວຄ້າງໄວ້ຢູ່ແຜ່ນສໍາຜັດຂອງທ່ານ."</string>
+    <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"ປັດຂຶ້ນໂດຍໃຊ້ມືສາມນິ້ວແລ້ວຄ້າງໄວ້ຢູ່ແຜ່ນສໍາຜັດຂອງທ່ານ"</string>
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ດີຫຼາຍ!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ທ່ານເບິ່ງທ່າທາງຂອງແອັບຫຼ້າສຸດສຳເລັດແລ້ວ."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"ປຸ່ມຄຳສັ່ງ"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"ເພື່ອເຂົ້າເຖິງແອັບ, ໃຫ້ກົດປຸ່ມຄຳສັ່ງຢູ່ແປ້ນພິມຂອງທ່ານ."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"ຂໍສະແດງຄວາມຍິນດີ!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"ທ່ານໃຊ້ທ່າທາງປຸ່ມຄຳສັ່ງສໍາເລັດແລ້ວ.\n\nຄໍາສັ່ງ + / ຈະສະແດງທາງລັດທັງໝົດທີ່ທ່ານມີ."</string>
+    <string name="tutorial_action_key_title" msgid="8172535792469008169">"ເບິ່ງແອັບທັງໝົດ"</string>
+    <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ກົດປຸ່ມຄຳສັ່ງຢູ່ແປ້ນພິມຂອງທ່ານ"</string>
+    <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ດີຫຼາຍ!"</string>
+    <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"ທ່ານເບິ່ງທ່າທາງຂອງແອັບທັງໝົດສຳເລັດແລ້ວ"</string>
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ໄຟປຸ່ມແປ້ນພິມ"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"ລະດັບທີ %1$d ຈາກ %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"ການຄວບຄຸມເຮືອນ"</string>
@@ -1437,6 +1436,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"ເພື່ອເບິ່ງແອັບທັງໝົດຂອງທ່ານ, ໃຫ້ກົດປຸ່ມຄຳສັ່ງຢູ່ແປ້ນພິມຂອງທ່ານ"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"ປົກປິດໄວ້ແລ້ວ"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"ປົດລັອກເພື່ອເບິ່ງ"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"ການສຶກສາຕາມບໍລິບົດ"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"ໃຊ້ແຜ່ນສໍາຜັດຂອງທ່ານເພື່ອກັບຄືນ"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"ໃຊ້ 3 ນິ້ວປັດຊ້າຍ ຫຼື ຂວາ. ແຕະເພື່ອສຶກສາທ່າທາງເພີ່ມເຕີມ."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"ໃຊ້ແຜ່ນສໍາຜັດຂອງທ່ານເພື່ອໄປຫາໜ້າຫຼັກ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index fd62599..a5e325e 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Įjungta"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Įjungta • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Išjungta"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Nustatyti"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Tvarkyti skiltyje „Nustatymai“"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Nėra aktyvių režimų}=1{Aktyvus režimas „{mode}“}one{# aktyvus režimas}few{# aktyvūs režimai}many{# aktyvaus režimo}other{# aktyvių režimų}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Jūsų netrikdys garsai ir vibravimas, išskyrus nurodytų signalų, priminimų, įvykių ir skambintojų garsus. Vis tiek girdėsite viską, ką pasirinksite leisti, įskaitant muziką, vaizdo įrašus ir žaidimus."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Pokalbiai"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Išvalyti visus tylius pranešimus"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Pranešimai pristabdyti naudojant netrukdymo režimą"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nėra pranešimų}=1{Pranešimai pristabdyti naudojant režimą „{mode}“}=2{Pranešimai pristabdyti naudojant režimą „{mode}“ ir dar vieną režimą}one{Pranešimai pristabdyti naudojant režimą „{mode}“ ir dar # režimą}few{Pranešimai pristabdyti naudojant režimą „{mode}“ ir dar # režimus}many{Pranešimai pristabdyti naudojant režimą „{mode}“ ir dar # režimo}other{Pranešimai pristabdyti naudojant režimą „{mode}“ ir dar # režimų}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Pradėti dabar"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Nėra įspėjimų"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Naujų pranešimų nėra"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Rodyti demonstraciniu režimu"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Eternetas"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Signalas"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"Tvarkaraštis „<xliff:g id="MODENAME">%1$s</xliff:g>“ įjungtas"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Nustatykite, kad galėtumėte greičiau ir saugiau pirkti telefonu"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Rodyti viską"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Garsiakalbiai ir ekranai"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Siūlomi įrenginiai"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Įvestis"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Išvestis"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Sustabdyti bendrinamą seansą norint perkelti mediją į kitą įrenginį"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Sustabdyti"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kaip veikia transliacija"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Sutraukimo piktograma"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Išskleidimo piktograma"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"arba"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Vilkimo rankenėlė"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naršykite naudodamiesi klaviatūra"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Sužinokite apie sparčiuosius klavišus"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naršykite naudodamiesi jutikline dalimi"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Sužinokite jutiklinės dalies gestus"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Naršykite naudodamiesi klaviatūra ir jutikline dalimi"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Sužinokite jutiklinės dalies gestus, sparčiuosius klavišus ir kt."</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Grįžimo atgal gestas"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Pagrindinio ekrano gestas"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Peržiūrėti naujausias programas"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Atlikta"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Grįžti"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Jei norite grįžti, perbraukite kairėn arba dešinėn trimis pirštais bet kurioje jutiklinės dalies vietoje.\n\nTaip pat galite naudoti šį spartųjį klavišą: veiksmų klavišas + klavišas „Esc“."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Puiku!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Atlikote grįžimo atgal gestą."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Eikite į pagrindinį ekraną"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Jei norite bet kada pasiekti pagrindinį ekraną, perbraukite aukštyn trim pirštais iš ekrano apačios."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Šaunu!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Atlikote perėjimo į pagrindinį ekraną gestą."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Peržiūrėti naujausias programas"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Jutiklinėje dalyje perbraukite aukštyn trimis pirštais ir palaikykite."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Puiku!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Atlikote naujausių programų peržiūros gestą."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Veiksmų klavišas"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Jei norite pasiekti programas, paspauskite klaviatūros veiksmų klavišą."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Sveikiname!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Atlikote veiksmų klavišo gestą.\n\nVeiksmas + / rodo visus pasiekiamus sparčiuosius klavišus."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klaviatūros foninis apšvietimas"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d lygis iš %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Namų sistemos valdymas"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Jei norite peržiūrėti visas programas, paspauskite klaviatūros veiksmų klavišą"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Paslėpta"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Atrakinkite, kad peržiūrėtumėte"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontekstinis švietimas"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Naudokite klaviatūrą, kad grįžtumėte atgal"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Perbraukite į kairę ar dešinę trimis pirštais. Palieskite, kad sužinotumėte daugiau gestų."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Naudokite jutiklinę dalį, jei norite eiti į pagrindinį ekraną"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index a6b7570..b570ad6 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Ieslēgts"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Ieslēgts • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Izslēgts"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Iestatīt"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Pārvaldīt iestatījumos"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Nav aktīvu režīmu}=1{Režīms “{mode}” ir aktīvs}zero{# režīmi ir aktīvi}one{# režīms ir aktīvs}other{# režīmi ir aktīvi}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Jūs netraucēs skaņas un vibrācija, izņemot signālus, atgādinājumus, pasākumus un zvanītājus, ko būsiet norādījis. Jūs joprojām dzirdēsiet atskaņošanai izvēlētos vienumus, tostarp mūziku, videoklipus un spēles."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Sarunas"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Notīrīt visus klusos paziņojumus"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Paziņojumi pārtraukti, izmantojot iestatījumu “Netraucēt”"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nav paziņojumu}=1{Paziņojumu rādīšana ir pārtraukta režīma “{mode}” dēļ}=2{Paziņojumu rādīšana ir pārtraukta režīma “{mode}” un vēl viena režīma dēļ}zero{Paziņojumu rādīšana ir pārtraukta režīma “{mode}” un vēl # režīmu dēļ}one{Paziņojumu rādīšana ir pārtraukta režīma “{mode}” un vēl # režīma dēļ}other{Paziņojumu rādīšana ir pārtraukta režīma “{mode}” un vēl # režīmu dēļ}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Sākt tūlīt"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Nav paziņojumu"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Nav jaunu paziņojumu"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Rādīt demonstrācijas režīmu"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Tīkls Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Signāls"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Maks"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Iestatiet, lai ātrāk un drošāk veiktu pirkumus, izmantojot tālruni"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Rādīt visu"</string>
@@ -1179,10 +1183,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Skaļruņi un displeji"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Ieteiktās ierīces"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Ievade"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Izvade"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Pārtrauciet savu kopīgoto sesiju, lai pārvietotu multivides saturu uz citu ierīci."</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Pārtraukt"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kā darbojas apraide"</string>
@@ -1398,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Sakļaušanas ikona"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Izvēršanas ikona"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"vai"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Vilkšanas turis"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Pārvietošanās, izmantojot tastatūru"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Uzziniet par īsinājumtaustiņiem."</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Pārvietošanās, izmantojot skārienpaliktni"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Apgūstiet skārienpaliktņa žestus."</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Pārvietošanās, izmantojot tastatūru un skārienpaliktni"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Uzziniet par skārienpaliktņa žestiem, īsinājumtaustiņiem un citām iespējām."</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Žests pāriešanai atpakaļ"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Žests pāriešanai uz sākumu"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Skatīt nesen izmantotās lietotnes"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gatavs"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Atpakaļ"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Lai atgrieztos, ar trīs pirkstiem velciet pa kreisi vai pa labi jebkurā vietā uz skārienpaliktņa.\n\nVarat arī izmantot šim nolūkam īsinājumtaustiņus: darbību taustiņu + Esc."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Lieliski!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Jūs sekmīgi veicāt atgriešanās žestu."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Pāreja uz sākuma ekrānu"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Lai jebkurā brīdī pārietu uz sākuma ekrānu, ar trim pirkstiem velciet augšup no ekrāna apakšdaļas."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Lieliski!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Jūs sekmīgi veicāt sākuma ekrāna atvēršanas žestu."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Nesen izmantoto lietotņu skatīšana"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Skārienpaliktnī ar trīs pirkstiem velciet augšup un turiet."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Lieliski!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Jūs sekmīgi veicāt nesen izmantoto lietotņu skatīšanas žestu."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Darbību taustiņš"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Lai piekļūtu savām lietotnēm, tastatūrā nospiediet darbību taustiņu."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Apsveicam!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Jūs pabeidzāt darbību taustiņa žesta apmācību.\n\nNospiežot darbību taustiņu un taustiņu “/”, tiks parādīti visi pieejamie īsinājumtaustiņi."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Tastatūras fona apgaismojums"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Līmenis numur %1$d, kopā ir %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Mājas kontrolierīces"</string>
@@ -1437,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Lai skatītu visas savas lietotnes, tastatūrā nospiediet darbību taustiņu."</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Rediģēts"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Lai skatītu, atbloķējiet"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontekstuāla pamācība"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Atgriešanās, izmantojot skārienpaliktni"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Ar trīs pirkstiem velciet pa kreisi vai pa labi. Lai apgūtu citus žestus, pieskarieties šeit."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Pāriešana uz sākuma ekrānu, izmantojot skārienpaliktni"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 1773e36..708135d 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Вклучено"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Вклучено: <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Исклучено"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Поставете"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Управувајте во поставките"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Нема активни режими}=1{Активен е {mode}}one{Активни се # режим}other{Активни се # режими}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Нема да ве вознемируваат звуци и вибрации, освен од аларми, потсетници, настани и повикувачи што ќе ги наведете. Сѐ уште ќе слушате сѐ што ќе изберете да пуштите, како музика, видеа и игри."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Избриши ги сите бесчујни известувања"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Известувањата се паузирани од „Не вознемирувај“"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Нема известувања}=1{Известувањата ги паузираше {mode}}=2{Известувањата ги паузираа {mode} и уште еден режим}one{Известувањата ги паузираа {mode} и уште # режим}other{Известувањата ги паузираа {mode} и уште # режими}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Започни сега"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Нема известувања"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Нема нови известувања"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Прикажи демо-режим"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Етернет"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Аларм"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Поставете за да купувате побрзо и побезбедно преку вашиот телефон"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Прикажи ги сите"</string>
@@ -1396,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за собирање"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за проширување"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Рачка за влечење"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Движете се со користење на тастатурата"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Научете кратенки од тастатурата"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Движете се со користење на допирната подлога"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Научете движења за допирната подлога"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Движете се со користење на тастатурата и допирната подлога"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Научете движења за допирната подлога, кратенки од тастатурата и друго"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Движење за назад"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Движење за почетен екран"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Прегледајте ги неодамнешните апликации"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"За да се вратите назад, повлечете налево или надесно со три прста каде било на допирната подлога.\n\nЗа ова може да ја користите и кратенката од тастатурата Action + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Одлично сторено!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Го научивте движењето за враќање назад."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Одете на почетниот екран"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"За да одите на вашиот почетен екран кога сакате, повлечете нагоре со три прсти од дното на екранот."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Одлично!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Го научивте движењето за враќање на почетниот екран."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Прегледајте ги неодамнешните апликации"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Повлечете нагоре и задржете со три прста на допирната подлога."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Одлично!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Го завршивте движењето за прегледување на неодамнешните апликации."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Копче за дејство"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"За да пристапите до апликациите, притиснете го копчето за дејство на тастатурата."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Честитки!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Го научивте движењето со копчето за дејство.\n\nДејство + / ги прикажува сите кратенки што ги имате на располагање."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Осветлување на тастатура"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Ниво %1$d од %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Контроли за домот"</string>
@@ -1435,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Притиснете го копчето за дејство на тастатурата за да ги видите сите апликации"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Редактирано"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Отклучете за приказ"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Контекстуално образование"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Користете ја допирната подлога за да се вратите назад"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Повлечете налево или надесно со три прста. Допрете за да научите повеќе движења."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Користете ја допирната подлога за да одите на почетниот екран"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 05b76d3..28fd77d 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"ഓണാണ്"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"ഓണാണ് • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"ഓഫാണ്"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"സജ്ജീകരിക്കുക"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"ക്രമീകരണത്തിൽ മാനേജ് ചെയ്യുക"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{സജീവ മോഡുകൾ ഒന്നുമില്ല}=1{{mode} സജീവമാണ്}other{# മോഡുകൾ സജീവമാണ്}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"നിങ്ങൾ സജ്ജീകരിച്ച അലാറങ്ങൾ, റിമൈൻഡറുകൾ, ഇവന്റുകൾ, കോളർമാർ എന്നിവയിൽ നിന്നുള്ള ശബ്‌ദങ്ങളും വൈബ്രേഷനുകളുമൊഴികെ മറ്റൊന്നും നിങ്ങളെ ശല്യപ്പെടുത്തുകയില്ല. സംഗീതം, വീഡിയോകൾ, ഗെയിമുകൾ എന്നിവയുൾപ്പെടെ പ്ലേ ചെയ്യുന്നതെന്തും നിങ്ങൾക്ക് ‌തുടർന്നും കേൾക്കാൻ കഴിയും."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"സംഭാഷണങ്ങൾ"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"എല്ലാ നിശബ്‌ദ അറിയിപ്പുകളും മായ്ക്കുക"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ശല്യപ്പെടുത്തരുത്\' വഴി അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തി"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{അറിയിപ്പുകൾ ഒന്നുമില്ല}=1{{mode}, അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തിയിരിക്കുന്നു}=2{{mode} എന്നതും മറ്റൊരു മോഡും, അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തിയിരിക്കുന്നു}other{{mode} എന്നതും മറ്റ് # മോഡുകളും, അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തിയിരിക്കുന്നു}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"ഇപ്പോൾ ആരംഭിക്കുക"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"അറിയിപ്പുകൾ ഒന്നുമില്ല"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"പുതിയ അറിയിപ്പുകളൊന്നുമില്ല"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"ഡെമോ മോഡ് കാണിക്കുക"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ഇതർനെറ്റ്"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"അലാറം"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> ഓണാണ്"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"നിങ്ങളുടെ ഫോൺ ഉപയോഗിച്ച് വാങ്ങലുകൾ വേഗത്തിലും സുരക്ഷിതമായും നടത്താനുള്ള സജ്ജീകരണം നടത്തുക"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"എല്ലാം കാണിക്കുക"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ചുരുക്കൽ ഐക്കൺ"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"വികസിപ്പിക്കൽ ഐക്കൺ"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"അല്ലെങ്കിൽ"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"വലിച്ചിടുന്നതിനുള്ള ഹാൻഡിൽ"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"നിങ്ങളുടെ കീബോർഡ് ഉപയോഗിച്ച് നാവിഗേറ്റ് ചെയ്യുക"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"കീബോർഡ് കുറുക്കുവഴികൾ മനസ്സിലാക്കുക"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"നിങ്ങളുടെ ടച്ച്‌പാഡ് ഉപയോഗിച്ച് നാവിഗേറ്റ് ചെയ്യുക"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ടച്ച്പാഡ് ജെസ്ച്ചറുകൾ മനസ്സിലാക്കുക"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"നിങ്ങളുടെ കീപാഡ്, ടച്ച്‌പാഡ് എന്നിവ ഉപയോഗിച്ച് നാവിഗേറ്റ് ചെയ്യുക"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ടച്ച്‌പാഡ് ജെസ്ച്ചറുകൾ, കീബോർഡ് കുറുക്കുവഴികൾ എന്നിവയും മറ്റും മനസ്സിലാക്കുക"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"\'മടങ്ങുക\' ജെസ്ച്ചർ"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ഹോം ജെസ്‌ച്ചർ"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"അടുത്തിടെയുള്ള ആപ്പുകൾ കാണുക"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"പൂർത്തിയായി"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"മടങ്ങുക"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"തിരികെ പോകാൻ, ടച്ച്പാഡിൽ എവിടെയെങ്കിലും മൂന്ന് വിരലുകൾ ഉപയോഗിച്ച് ഇടത്തേക്കോ വലത്തേക്കോ സ്വൈപ്പ് ചെയ്യുക.\n\nഇതിന് Action + ESC കീബോഡ് കുറുക്കുവഴികളും നിങ്ങൾക്ക് ഉപയോഗിക്കാം."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"കൊള്ളാം!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"മടങ്ങുക ജെസ്ച്ചർ നിങ്ങൾ പൂർത്തിയാക്കി."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ഹോമിലേക്ക് പോകൂ"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"ഏതുസമയത്തും ഹോം സ്ക്രീനിലേക്ക് പോകാൻ, മൂന്ന് വിരലുകൾ ഉപയോഗിച്ച് സ്ക്രീനിന്റെ താഴെ നിന്ന് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യൂ."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"കൊള്ളാം!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"ഹോമിലേക്ക് പോകുക ജെസ്ച്ചർ നിങ്ങൾ പൂർത്തിയാക്കി."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"അടുത്തിടെയുള്ള ആപ്പുകൾ കാണുക"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"നിങ്ങളുടെ ടച്ച്പാഡിൽ മൂന്ന് വിരലുകൾ കൊണ്ട് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്‌ത് പിടിക്കുക."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"കൊള്ളാം!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"അടുത്തിടെയുള്ള ആപ്പുകൾ കാണുക എന്ന ജെസ്ച്ചർ നിങ്ങൾ പൂർത്തിയാക്കി."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Action കീ"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"നിങ്ങളുടെ ആപ്പുകൾ ആക്‌സസ് ചെയ്യാൻ, നിങ്ങളുടെ കീബോർഡിലെ Action കീ അമർത്തുക."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"അഭിനന്ദനങ്ങൾ!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"നിങ്ങൾ Action കീ ജെസ്ച്ചർ പൂർത്തിയാക്കി.\n\nനിങ്ങൾക്ക് ലഭ്യമാകുന്ന എല്ലാ കുറുക്കുവഴികളും Action + / കാണിക്കുന്നു."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"കീബോഡ് ബാക്ക്‌ലൈറ്റ്"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d-ൽ %1$d-ാമത്തെ ലെവൽ"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"ഹോം കൺട്രോളുകൾ"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"എല്ലാ ആപ്പുകളും കാണാൻ, നിങ്ങളുടെ കീബോർഡിലെ ആക്‌ഷൻ കീ അമർത്തുക"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"മറച്ചത്"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"കാണാൻ, അൺലോക്ക് ചെയ്യുക"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"സന്ദർഭോചിത വിദ്യാഭ്യാസം"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"തിരികെ പോകാൻ നിങ്ങളുടെ ടച്ച്‌പാഡ് ഉപയോഗിക്കുക"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"മൂന്ന് വിരലുകൾ കൊണ്ട് ഇടത്തേക്കോ വലത്തേക്കോ സ്വൈപ്പ് ചെയ്യൂ. കൂടുതൽ ജെസ്ച്ചറുകളറിയാൻ ടാപ്പ് ചെയ്യൂ."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"ഹോമിലേക്ക് പോകാൻ നിങ്ങളുടെ ടച്ച്‌പാഡ് ഉപയോഗിക്കുക"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 7a9a38b..dfd2398 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Асаалттай"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Асаасан • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Унтраалттай"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Тохируулах"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Тохиргоонд удирдах"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Ямар ч идэвхтэй горим байхгүй}=1{{mode} идэвхтэй байна}other{# горим идэвхтэй байна}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Танд сэрүүлэг, сануулга, арга хэмжээ, таны сонгосон дуудлага илгээгчээс бусад дуу, чичиргээ саад болохгүй. Та хөгжим, видео, тоглоом зэрэг тоглуулахыг хүссэн бүх зүйлээ сонсох боломжтой хэвээр байна."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Харилцан яриа"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Бүх чимээгүй мэдэгдлийг арилгах"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Бүү саад бол горимын түр зогсоосон мэдэгдэл"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Мэдэгдэл байхгүй}=1{Мэдэгдлийг {mode} түр зогсоосон}=2{Мэдэгдлийг {mode} болон өөр нэг горим түр зогсоосон}other{Мэдэгдлийг {mode} болон өөр # горим түр зогсоосон}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Одоо эхлүүлэх"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Мэдэгдэл байхгүй"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Шинэ мэдэгдэл алга"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Демо горимыг харуулах"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Этернет"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Сэрүүлэг"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> асаалттай байна"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Утсаараа илүү хурдан, аюулгүй худалдан авалт хийхийн тулд тохируулгыг авна уу"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Бүгдийг харуулах"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Чанга яригч ба дэлгэц"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Санал болгосон төхөөрөмжүүд"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Оролт"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Гаралт"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Өөр төхөөрөмж рүү медиа зөөхийн тулд хуваалцсан харилцан үйлдлээ зогсооно уу"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Зогсоох"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Нэвтрүүлэлт хэрхэн ажилладаг вэ?"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Хураах дүрс тэмдэг"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Дэлгэх дүрс тэмдэг"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"эсвэл"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Чирэх бариул"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Гараа ашиглан шилжих"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Товчлуурын шууд холбоосыг мэдэж аваарай"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Мэдрэгч самбараа ашиглан шилжээрэй"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Мэдрэгч самбарын зангааг мэдэж аваарай"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Гар эсвэл мэдрэгч самбараа ашиглан шилжээрэй"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Мэдрэгч самбарын зангаа, товчлуурын шууд холбоос болон бусад зүйлийг мэдэж аваарай"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Буцах зангаа"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Үндсэн нүүрний зангаа"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Саяхны аппуудыг харах"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Болсон"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Буцах"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Буцахын тулд мэдрэгч самбар дээр гурван хуруугаар хүссэн газраа зүүн эсвэл баруун тийш шударна уу.\n\nТа мөн үүнийг хийхэд Action + ESC товчлуурын шууд холбоосыг ашиглах боломжтой."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Үнэхээр сайн ажиллалаа!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Та буцах зангааг гүйцэтгэлээ."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Үндсэн нүүр лүү очих"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Үндсэн нүүр лүүгээ хүссэн үедээ очихын тулд дэлгэцийнхээ доод талаас гурван хуруугаараа дээш шударна уу."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Янзтай!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Та үндсэн нүүр лүү очих зангааг гүйцэтгэлээ."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Саяхны аппуудыг харах"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Мэдрэгч самбар дээрээ гурван хуруугаа ашиглан дээш шудраад, удаан дарна уу."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Сайн байна!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Та саяхны аппуудыг харах зангааг гүйцэтгэсэн."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Тусгай товчлуур"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Аппууддаа хандахын тулд гар дээр тань байх тусгай товчлуурыг дарна уу."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Баяр хүргэе!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Та тусгай товчлуурын зангааг гүйцэтгэлээ.\n\nТусгай товчлуур болох + / нь танд боломжтой бүх товчлолыг харуулна."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Гарын арын гэрэл"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d-с %1$d-р түвшин"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Гэрийн удирдлага"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Бүх аппаа харахын тулд гар дээр тань байх тусгай товчлуурыг дарна уу"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Хассан"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Харахын тулд түгжээг тайлна уу"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Хам сэдэвт боловсрол"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Буцахын тулд мэдрэгч самбараа ашиглах"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Гурван хуруугаараа зүүн эсвэл баруун тийш шударна уу. Илүү олон зангаа сурахын тулд товшино уу."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Нүүр хуудас руу очихын тулд мэдрэгч самбараа ашиглах"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index e4063f6..db2ed93 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"सुरू आहे"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"सुरू • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"बंद आहे"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"सेट करा"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"सेटिंग्जमध्ये व्यवस्थापित करा"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{कोणतेही अ‍ॅक्टिव्ह मोड नाहीत}=1{{mode} अ‍ॅक्टिव्ह आहे}other{# मोड अ‍ॅक्टिव्ह आहेत}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"अलार्म, रिमाइंडर, इव्‍हेंट आणि तुम्ही निश्चित केलेल्या कॉलर व्यतिरिक्त तुम्हाला कोणत्याही आवाज आणि कंपनांचा व्यत्त्यय आणला जाणार नाही. तरीही तुम्ही प्ले करायचे ठरवलेले कोणतेही संगीत, व्हिडिओ आणि गेमचे आवाज ऐकू शकतात."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"संभाषणे"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"सर्व सायलंट सूचना साफ करा"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"व्यत्यय आणून नकाद्वारे सूचना थांबवल्या"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{कोणतेही नोटिफिकेशन नाही}=1{{mode} द्वारे नोटिफिकेशन थांबवली आहेत}=2{{mode} द्वारे आणि आणखी एका मोडद्वारे नोटिफिकेशन थांबवली आहेत}other{{mode} द्वारे आणि आणखी # मोडद्वारे नोटिफिकेशन थांबवली आहेत}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"आता सुरू करा"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"सूचना नाहीत"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"नवीन सूचना नाहीत"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"डेमो मोड दर्शवा"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"इथरनेट"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"अलार्म"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> हे सुरू आहे"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"तुमचा फोन वापरून जलदरीत्या, अधिक सुरक्षित खरेदी करण्यासाठी सेट करा"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"सर्व दाखवा"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"कोलॅप्स करा आयकन"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"विस्तार करा आयकन"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"किंवा"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ड्रॅग हॅंडल"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"तुमचा कीबोर्ड वापरून नेव्हिगेट करा"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"कीबोर्ड शॉर्टकट जाणून घ्या"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"तुमचा टचपॅड वापरून नेव्हिगेट करा"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"टचपॅड जेश्चर जाणून घ्या"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"तुमचा कीबोर्ड आणि टचपॅड वापरून नेव्हिगेट करा"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"टचपॅड जेश्चर, कीबोर्ड शॉर्टकट आणि आणखी बरेच काही जाणून घ्या"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"मागे जा जेश्चर"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"होम जेश्चर"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"अलीकडील अ‍ॅप्स पहा"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"पूर्ण झाले"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"मागे जा"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"मागे जाण्यासाठी, तीन बोटांनी टचपॅडवर कुठेही डावीकडे किंवा उजवीकडे स्वाइप करा.\n\nतुम्ही यासाठी Action + ESC हा कीबोर्ड शॉर्टकटदेखील वापरू शकता."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"उत्तम कामगिरी!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"तुम्ही गो बॅक जेश्चर पूर्ण केले."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"होमवर जा"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"कधीही तुमच्या होम स्क्रीनवर जाण्यासाठी, तीन बोटांनी तुमच्या स्क्रीनच्या तळापासून स्वाइप करा."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"छान!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"तुम्ही गो होम जेश्चर पूर्ण केले आहे."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"अलीकडील अ‍ॅप्स पहा"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"तुमच्या टचपॅडवर तीन बोटांनी वरती आणि खाली स्वाइप करा."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"उत्तम कामगिरी!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"तुम्ही अलीकडील ॲप्स पाहण्याचे जेश्चर पूर्ण केले आहे."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"अ‍ॅक्शन की"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"तुमची ॲप्स अ‍ॅक्सेस करण्यासाठी, तुमच्या कीबोर्डवरील अ‍ॅक्शन की प्रेस करा."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"अभिनंदन!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"तुम्ही अ‍ॅक्शन की जेश्चर पूर्ण केले आहे.\n\nकृती + / हे तुमच्याकडे उपलब्ध असलेले सर्व शॉर्टकट दाखवते."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"कीबोर्ड बॅकलाइट"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d पैकी %1$d पातळी"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"होम कंट्रोल"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"तुमची सर्व ॲप्स पाहण्यासाठी, तुमच्या कीबोर्डवरील अ‍ॅक्शन की प्रेस करा"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"रिडॅक्ट केलेले"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"पाहण्यासाठी अनलॉक करा"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"संदर्भीय शिक्षण"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"मागे जाण्यासाठी तुमचा टचपॅड वापरा"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"तीन बोटांनी डावीकडे किंवा उजवीकडे स्वाइप करा. आणखी जेश्चर जाणून घेण्यासाठी टॅप करा."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"होमवर जाण्यासाठी तुमचा टचपॅड वापरा"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 710d342..abdb32f 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -440,7 +440,7 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Hidup"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Pada • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Mati"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Sediakan"</string>
+    <string name="zen_mode_set_up" msgid="8231201163894922821">"Tidak ditetapkan"</string>
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Urus dalam tetapan"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Tiada mod yang aktif}=1{{mode} aktif}other{# mod aktif}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Anda tidak akan diganggu oleh bunyi dan getaran, kecuali daripada penggera, peringatan, acara dan pemanggil yang anda tetapkan. Anda masih mendengar item lain yang anda pilih untuk dimainkan termasuk muzik, video dan permainan."</string>
@@ -573,6 +573,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Perbualan"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Kosongkan semua pemberitahuan senyap"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Pemberitahuan dijeda oleh Jangan Ganggu"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Tiada pemberitahuan}=1{Pemberitahuan dijeda oleh {mode}}=2{Pemberitahuan dijeda oleh {mode} dan satu lagi mod yang lain}other{Pemberitahuan dijeda oleh {mode} dan # mod yang lain}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Mulakan sekarang"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Tiada pemberitahuan"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Tiada pemberitahuan baharu"</string>
@@ -704,6 +705,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Tunjukkan mod tunjuk cara"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Penggera"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> dihidupkan"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Buat persediaan untuk membuat pembelian yang lebih pantas dan selamat dengan telefon anda"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Tunjukkan semua"</string>
@@ -1396,34 +1398,33 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Kuncupkan ikon"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Kembangkan ikon"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"atau"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Pemegang seret"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigasi menggunakan papan kekunci anda"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Ketahui pintasan papan kekunci"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigasi menggunakan pad sentuh anda"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Ketahui gerak isyarat pad sentuh"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigasi menggunakan papan kekunci dan pad sentuh anda"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Ketahui gerak isyarat pad sentuh, pintasan papan kekunci dan pelbagai lagi"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gerak isyarat kembali"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gerak isyarat pergi ke laman utama"</string>
+    <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Kembali"</string>
+    <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Akses laman utama"</string>
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Lihat apl terbaharu"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Selesai"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Kembali"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Untuk kembali, leret ke kiri atau ke kanan menggunakan tiga jari di mana-mana sahaja pada pad sentuh.\n\nAnda juga boleh menggunakan pintasan papan kekunci Action + ESC untuk kembali."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Syabas!"</string>
+    <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Leret ke kiri atau kanan menggunakan tiga jari pada pad sentuh anda"</string>
+    <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Bagus!"</string>
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Anda telah melengkapkan gerak isyarat undur."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Akses laman utama"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Untuk mengakses skrin utama anda pada bila-bila masa, leret ke atas menggunakan tiga jari daripada bahagian bawah skrin anda."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bagus!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Anda telah melengkapkan gerak isyarat akses laman utama."</string>
+    <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Leret ke atas dengan tiga jari pada pad sentuh anda"</string>
+    <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Bagus!"</string>
+    <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Anda telah melengkapkan gerak isyarat akses laman utama"</string>
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Lihat apl terbaharu"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Leret ke atas dan tahan menggunakan tiga jari pada pad sentuh anda."</string>
+    <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Leret ke atas dan tahan menggunakan tiga jari pada pad sentuh anda"</string>
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Syabas!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Anda melengkapkan gerak isyarat lihat apl terbaharu."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Kekunci tindakan"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Untuk mengakses semua apl anda, tekan kekunci tindakan pada papan kekunci anda."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Tahniah!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Anda telah melengkapkan gerak isyarat kekunci tindakan.\n\nTindakan + / menunjukkan semua pintasan anda yang tersedia."</string>
+    <string name="tutorial_action_key_title" msgid="8172535792469008169">"Lihat semua apl"</string>
+    <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Tekan kekunci tindakan pada papan kekunci anda"</string>
+    <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Syabas!"</string>
+    <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Anda telah melengkapkan gerak isyarat lihat semua apl"</string>
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Cahaya latar papan kekunci"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Tahap %1$d daripada %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Kawalan Rumah"</string>
@@ -1435,6 +1436,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Untuk melihat semua apl anda, tekan kekunci tindakan pada papan kekunci anda"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Disunting"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Buka kunci untuk melihat"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Pendidikan kontekstual"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Gunakan pad sentuh anda untuk kembali"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Leret ke kiri atau ke kanan dengan tiga jari. Ketik dan ketahui lebih lanjut tentang gerak isyarat."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Gunakan pad sentuh untuk mengakses laman utama"</string>
@@ -1443,8 +1445,8 @@
     <string name="overview_edu_notification_content" msgid="3578204677648432500">"Leret ke atas, tahan dengan tiga jari. Ketik untuk mengetahui lebih lanjut tentang gerak isyarat."</string>
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"Gunakan papan kekunci anda untuk melihat semua apl"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Tekan kekunci tindakan pada bila-bila masa. Ketik dan ketahui lebih lanjut tentang gerak isyarat."</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Kini ciri amat malap merupakan sebahagian daripada peluncur kecerahan"</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Kini anda boleh menjadikan skrin amat malap dengan merendahkan lebih lagi tahap kecerahan.\n\nMemandangkan ciri ini kini merupakan sebahagian daripada peluncur kecerahan, pintasan amat malap dialih keluar."</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Ciri amat malap kini bergabung dengan peluncur kecerahan"</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Skrin boleh dijadikan amat malap dengan menurunkan lagi tahap kecerahannya.\n\nOleh sebab ciri ini telah bergabung dengan peluncur kecerahan, pintasan amat malap dialih keluar."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Alih keluar pintasan amat malap"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Pintasan amat malap dialih keluar"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Kesambungan"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 0c9bbe6..f4f337b 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"ဖွင့်"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"ဖွင့် • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"ပိတ်"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"စနစ်ထည့်သွင်းရန်"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"ဆက်တင်များတွင် စီမံရန်"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{သုံးနေသော မုဒ်မရှိပါ}=1{{mode} ကို သုံးနေသည်}other{မုဒ် # ခု သုံးနေသည်}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"နှိုးစက်သံ၊ သတိပေးချက်အသံများ၊ ပွဲစဉ်သတိပေးသံများနှင့် သင်ခွင့်ပြုထားသူများထံမှ ဖုန်းခေါ်မှုများမှလွဲ၍ အခြားအသံများနှင့် တုန်ခါမှုများက သင့်ကို အနှောင့်အယှက်ပြုမည် မဟုတ်ပါ။ သို့သော်လည်း သီချင်း၊ ဗီဒီယိုနှင့် ဂိမ်းများအပါအဝင် သင်ကရွေးချယ်ဖွင့်ထားသည့် အရာတိုင်း၏ အသံကိုမူ ကြားနေရဆဲဖြစ်ပါလိမ့်မည်။"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"စကားဝိုင်းများ"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"အသံတိတ် အကြောင်းကြားချက်များအားလုံးကို ရှင်းလင်းရန်"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"အကြောင်းကြားချက်များကို \'မနှောင့်ယှက်ရ\' က ခေတ္တရပ်ထားသည်"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{အကြောင်းကြားချက် မရှိပါ}=1{{mode} က ခဏရပ်ထားသော အကြောင်းကြားချက်များ}=2{{mode} နှင့် အခြားမုဒ်တစ်ခုက ခဏရပ်ထားသော အကြောင်းကြားချက်များ}other{{mode} နှင့် အခြားမုဒ် # ခုက ခဏရပ်ထားသော အကြောင်းကြားချက်များ}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"ယခု စတင်ပါ"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"အကြောင်းကြားချက် မရှိပါ"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"အကြောင်းကြားချက်သစ် မရှိပါ"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"သရုပ်ပြမုဒ် ပြရန်"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"အီသာနက်"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"နှိုးစက်"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> ဖွင့်ထားသည်"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"သင့်ဖုန်းဖြင့် ပိုမိုမြန်ဆန်၊ ပိုမိုစိတ်ချရသော ဝယ်ယူမှုများ ပြုလုပ်ရန် စတင်သတ်မှတ်ပါ"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"အားလုံးပြရန်"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"စပီကာနှင့် ဖန်သားပြင်များ"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"အကြံပြုထားသော စက်ပစ္စည်းများ"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"ထည့်သွင်းချက်"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"ထုတ်လုပ်ချက်"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"အခြားစက်သို့ မီဒီယာရွှေ့ပြောင်းရန် သင်၏မျှဝေထားသောစက်ရှင်ကို ရပ်ပါ"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"ရပ်ရန်"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ထုတ်လွှင့်မှုဆောင်ရွက်ပုံ"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"လျှော့ပြရန် သင်္ကေတ"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ပိုပြရန် သင်္ကေတ"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"သို့မဟုတ်"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ဖိဆွဲအထိန်း"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"သင့်ကီးဘုတ်ကိုသုံး၍ လမ်းညွှန်ခြင်း"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"လက်ကွက်ဖြတ်လမ်းများကို လေ့လာပါ"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"သင့်တာ့ချ်ပက်ကိုသုံး၍ လမ်းညွှန်ခြင်း"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"တာ့ချ်ပက်လက်ဟန်များကို လေ့လာပါ"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"သင်၏ ကီးဘုတ်နှင့် တာ့ချ်ပက်တို့ကိုသုံး၍ လမ်းညွှန်ခြင်း"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"တာ့ချ်ပက်လက်ဟန်များ၊ လက်ကွက်ဖြတ်လမ်းများ စသည်တို့ကို လေ့လာပါ"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"နောက်သို့ လက်ဟန်"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ပင်မစာမျက်နှာ လက်ဟန်"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"မကြာသေးမီကအက်ပ်များကို ကြည့်ရန်"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ပြီးပြီ"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ပြန်သွားရန်"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"နောက်ပြန်သွားရန် တာ့ချ်ပက်ပေါ်ရှိ မည်သည့်နေရာ၌မဆို လက်သုံးချောင်းဖြင့် ဘယ် (သို့) ညာသို့ ပွတ်ဆွဲပါ။\n\n၎င်းအတွက် လက်ကွက်ဖြတ်လမ်း Action + ESC ကိုလည်း သုံးနိုင်သည်။"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"တော်ပါပေသည်။"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"နောက်သို့လက်ဟန် အပြီးသတ်လိုက်ပါပြီ"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ပင်မစာမျက်နှာသို့ သွားရန်"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"ပင်မစာမျက်နှာသို့ အချိန်မရွေးသွားရန် စခရင်အောက်ခြေမှ အပေါ်သို့ လက်သုံးချောင်းဖြင့် ပွတ်ဆွဲပါ။"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"ကောင်းသည်။"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"ပင်မစာမျက်နှာသို့သွားသည့် လက်ဟန် အပြီးသတ်လိုက်ပါပြီ။"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"မကြာသေးမီကအက်ပ်များကို ကြည့်ခြင်း"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"သင့်တာ့ချ်ပက်တွင် လက်သုံးချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ။"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"တော်ပါပေသည်။"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"မကြာသေးမီကအက်ပ်များကို ကြည့်ခြင်းလက်ဟန် သင်ခန်းစာပြီးပါပြီ။"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"လုပ်ဆောင်ချက်ကီး"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"သင့်အက်ပ်များသုံးရန် ကီးဘုတ်ပေါ်ရှိ လုပ်ဆောင်ချက်ကီးကို နှိပ်ပါ။"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"ဂုဏ်ယူပါသည်။"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"လုပ်ဆောင်ချက်ကီး လက်ဟန် အပြီးသတ်လိုက်ပါပြီ။\n\nလုပ်ဆောင်ချက် + / သည် ရရှိနိုင်သော ဖြတ်လမ်းအားလုံးကို ပြသည်။"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ကီးဘုတ်နောက်မီး"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"အဆင့် %2$d အနက် %1$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"အိမ်ထိန်းချုပ်မှုများ"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"သင့်အက်ပ်အားလုံးကြည့်ရန် ကီးဘုတ်ပေါ်ရှိ လုပ်ဆောင်ချက်ကီးကို နှိပ်ပါ"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"အစားထိုးထားသည်"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"ကြည့်ရန် ဖွင့်ပါ"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"အကြောင်းအရာအလိုက် ပညာရေး"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"နောက်ပြန်သွားရန် သင့်တာ့ချ်ပက်ကို သုံးပါ"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"လက်သုံးချောင်းဖြင့် ဘယ် (သို့) ညာသို့ ပွတ်ဆွဲပါ။ လက်ဟန်များ ပိုမိုလေ့လာရန် တို့ပါ။"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"ပင်မစာမျက်နှာသို့ သွားရန် သင့်တာ့ချ်ပက်ကို သုံးပါ"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index a097505..f98799a 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"På"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"På • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Av"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Konfigurer"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Administrer i innstillingene"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Ingen aktive moduser}=1{{mode} er aktiv}other{# moduser er aktive}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Du blir ikke forstyrret av lyder og vibrasjoner, med unntak av alarmer, påminnelser, aktiviteter og oppringere du angir. Du kan fremdeles høre alt du velger å spille av, for eksempel musikk, videoer og spill."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Fjern alle lydløse varsler"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Varsler er satt på pause av «Ikke forstyrr»"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Ingen varsler}=1{Varsler er satt på pause av {mode}}=2{Varsler er satt på pause av {mode} og én modus til}other{Varsler er satt på pause av {mode} og # moduser til}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Start nå"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Ingen varsler"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Ingen nye varsler"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Vis demo-modus"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Legg til en betalingsmåte for å gjennomføre kjøp raskere og sikrere med telefonen"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Vis alle"</string>
@@ -1179,10 +1183,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Høyttalere og skjermer"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Foreslåtte enheter"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Inngang"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Utgang"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stopp den delte økten for å flytte medieinnholdet til en annen enhet"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stopp"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Slik fungerer kringkasting"</string>
@@ -1398,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Skjul-ikon"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Vis-ikon"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Håndtak"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naviger med tastaturet"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Lær deg hurtigtaster"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naviger med styreflaten"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Lær deg styreflatebevegelser"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Naviger med tastaturet og styreflaten"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Lær deg styreflatebevegelser, hurtigtaster med mer"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Tilbakebevegelse"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Startskjermbevegelse"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Se nylige apper"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Ferdig"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Gå tilbake"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"For å gå tilbake, sveip mot høyre eller venstre med tre fingre hvor som helst på styreflaten.\n\nDu kan også gjøre dette med hurtigtasten Action + Esc."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Bra jobbet!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Du har fullført bevegelsen for å gå tilbake."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Gå til startsiden"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"For å gå til startskjermen, sveip opp med tre fingre fra bunnen av skjermen når som helst."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bra!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Du har fullført bevegelsen for å gå til startskjermen."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Se nylige apper"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Sveip opp og hold med tre fingre på styreflaten."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bra jobbet!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Du har fullført bevegelsen for å se nylige apper."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Handlingstast"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"For å åpne appene dine, trykk på handlingstasten på tastaturet."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Gratulerer!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Du har fullført bevegelsen for handlingstasten.\n\nHandling + / viser alle tilgjengelige snarveier."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Bakgrunnslys for tastatur"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivå %1$d av %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Hjemkontroller"</string>
@@ -1437,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"For å se alle appene dine, trykk på handlingstasten på tastaturet"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Fjernet"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Lås opp for å se"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontekstuell opplæring"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Bruk styreflaten for å gå tilbake"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Sveip til venstre eller høyre med tre fingre. Trykk for å lære flere bevegelser."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Bruk styreflaten for å gå til startsiden"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index e2ae7b9..2c8778f 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"अन छ"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"अन छ • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"अफ छ"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"सेटअप गर्नुहोस्"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"सेटिङमा गई व्यवस्थापन गर्नुहोस्"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{कुनै पनि सक्रिय छैन}=1{{mode} सक्रिय छ}other{# मोड सक्रिय छन्}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"तपाईंलाई अलार्म, रिमाइन्डर, कार्यक्रम र तपाईंले निर्दिष्ट गर्नुभएका कलरहरू बाहेकका ध्वनि र कम्पनहरूले बाधा पुऱ्याउने छैनन्। तपाईंले अझै सङ्गीत, भिडियो र खेलहरू लगायत आफूले प्ले गर्न छनौट गरेका जुनसुकै कुरा सुन्न सक्नुहुनेछ।"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"वार्तालापहरू"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"सबै मौन सूचनाहरू हटाउनुहोस्"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"बाधा नपुऱ्याउनुहोस् नामक मोडमार्फत पज पारिएका सूचनाहरू"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{कुनै पनि नोटिफिकेसन छैन}=1{{mode} ले गर्दा नोटिफिकेसनहरू पज गरिएका छन्}=2{{mode} र अन्य एक मोडले गर्दा नोटिफिकेसनहरू पज गरिएका छन्}other{{mode} र अन्य # वटा मोडले गर्दा नोटिफिकेसनहरू पज गरिएका छन्}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"अहिले न"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"कुनै सूचनाहरू छैनन्"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"कुनै पनि नयाँ सूचना छैन"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"डेमो मोड देखाउनुहोस्"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"इथरनेट"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"अलार्म"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> अन छ"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"फोनमार्फत अझ छिटो र थप सुरक्षित तरिकाले खरिद गर्न भुक्तानी विधि सेटअप गर्नुहोस्"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"सबै देखाउनुहोस्"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"\"कोल्याप्स गर्नुहोस्\" आइकन"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"\"एक्स्पान्ड गर्नुहोस्\" आइकन"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"वा"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ड्र्याग ह्यान्डल"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"किबोर्ड प्रयोग गरी नेभिगेट गर्नुहोस्"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"किबोर्डका सर्टकटहरू प्रयोग गर्न सिक्नुहोस्"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"टचप्याड प्रयोग गरी नेभिगेट गर्नुहोस्"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"टचप्याड जेस्चर प्रयोग गर्न सिक्नुहोस्"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"किबोर्ड र टचप्याड प्रयोग गरी नेभिगेट गर्नुहोस्"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"टचप्याड जेस्चर, किबोर्डका सर्टकट र अन्य कुरा प्रयोग गर्न सिक्नुहोस्"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ब्याक जेस्चर"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"होम जेस्चर"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"हालसालै चलाइएका एपहरू हेर्नुहोस्"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"सम्पन्न भयो"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"पछाडि जानुहोस्"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"पछाडि जान तीन वटा औँलाले टचप्याडमा कतै छोएर बायाँ वा दायाँतिर स्वाइप गर्नुहोस्।\n\nतपाईं यसका लागि किबोर्डको सर्टकट \"Action + ESC\" पनि प्रयोग गर्न सक्नुहुन्छ।"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"अद्भुत!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"तपाईंले \'पछाडि जानुहोस्\' नामक इसारा प्रयोग गर्ने तरिका सिक्नुभयो।"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"होमपेजमा जानुहोस्"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"जुनसुकै बेला आफ्नो होम स्क्रिनमा जान स्क्रिनको फेदबाट तीन वटा औँलाले माथितिर स्वाइप गर्नुहोस्।"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"राम्रो!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"तपाईंले \"होम स्क्रिनमा जानुहोस्\" नामक जेस्चर प्रयोग गर्ने तरिका सिक्नुभयो।"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"हालसालै चलाइएका एपहरू हेर्नुहोस्"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"तीन वटा औँला प्रयोग गरी टचप्याडमा माथितिर स्वाइप गर्नुहोस् र होल्ड गर्नुहोस्।"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"अद्भुत!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"तपाईंले हालसालै चलाइएका एपहरू हेर्ने जेस्चर पूरा गर्नुभएको छ।"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"एक्सन की"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"आफ्ना एपहरू एक्सेस गर्न आफ्नो किबोर्डमा भएको एक्सन की थिच्नुहोस्।"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"बधाई छ!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"तपाईंले एक्सन की थिचेर गरिने जेस्चर प्रयोग गर्ने तरिका सिक्नुभयो।\n\nएक्सन + / थिच्नुभयो भने उपलब्ध सबै सर्टकटहरू देखिन्छन्।"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"किबोर्ड ब्याकलाइट"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d मध्ये %1$d औँ स्तर"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"होम कन्ट्रोलहरू"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"आफ्ना सबै एपहरू हेर्न आफ्नो किबोर्डमा भएको एक्सन की थिच्नुहोस्"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"जानकारी लुकाउन सम्पादन गरिएको"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"हेर्नका लागि अनलक गर्नुहोस्"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"सान्दर्भिक शिक्षा"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"पछाडि जान आफ्नो टचप्याड प्रयोग गर्नुहोस्"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"तिन वटा औँला प्रयोग गरी बायाँ वा दायाँतिर स्वाइप गर्नुहोस्। थप जेस्चर प्रयोग गर्ने तरिका सिक्न ट्याप गर्नुहोस्।"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"होममा जान आफ्नो टचप्याड प्रयोग गर्नुहोस्"</string>
diff --git a/packages/SystemUI/res/values-night/styles.xml b/packages/SystemUI/res/values-night/styles.xml
index e9dd039f3..17ba2e5 100644
--- a/packages/SystemUI/res/values-night/styles.xml
+++ b/packages/SystemUI/res/values-night/styles.xml
@@ -63,5 +63,4 @@
     <style name="ShortcutHelperTheme" parent="@style/ShortcutHelperThemeCommon">
         <item name="android:windowLightNavigationBar">false</item>
     </style>
-
 </resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 9681f1e..cd20a293 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Aan"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Aan • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Uit"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Instellen"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Beheren via instellingen"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Geen actieve modi}=1{{mode} is actief}other{# modi zijn actief}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Je wordt niet gestoord door geluiden en trillingen, behalve bij wekkers, herinneringen, afspraken en specifieke bellers die je selecteert. Je kunt nog steeds alles horen wat je wilt afspelen, waaronder muziek, video\'s en games."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Gesprekken"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Alle stille meldingen wissen"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Meldingen onderbroken door \'Niet storen\'"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Geen meldingen}=1{Meldingen onderbroken door {mode}}=2{Meldingen onderbroken door {mode} en 1 andere modus}other{Meldingen onderbroken door {mode} en # andere modi}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Nu starten"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Geen meldingen"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Geen nieuwe meldingen"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Demomodus tonen"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Wekker"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> staat aan"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Portemonnee"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Zorg dat je sneller en beter beveiligd aankopen kunt doen met je telefoon"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Alles tonen"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icoon voor samenvouwen"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icoon voor uitvouwen"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"of"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Handgreep voor slepen"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigeren met je toetsenbord"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Leer sneltoetsen die je kunt gebruiken"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigeren met je touchpad"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Leer touchpadgebaren die je kunt gebruiken"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigeren met je toetsenbord en touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Leer meer over onder andere touchpadgebaren en sneltoetsen"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gebaar voor terug"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gebaar voor startscherm"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Recente apps bekijken"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Klaar"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Terug"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Als je wilt teruggaan, swipe je met 3 vingers naar links of rechts op de touchpad.\n\nJe kunt hiervoor ook de sneltoets Actie + ESC gebruiken."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Goed bezig!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Je weet nu hoe je het gebaar voor terug maakt."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Naar startscherm"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Swipe met 3 vingers omhoog vanaf de onderkant van het scherm om naar het startscherm te gaan."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Mooi zo!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Je weet nu hoe je het gebaar Naar startscherm maakt."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Recente apps bekijken"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Swipe met 3 vingers omhoog en houd vast op je touchpad."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Goed werk!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Je weet nu hoe je het gebaar Recente apps bekijken maakt."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Actietoets"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Als je toegang tot je apps wilt krijgen, druk je op de actietoets op je toetsenbord."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Gefeliciteerd!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Je hebt het gebaar voor de actietoets uitgevoerd.\n\nActie + / toont alle beschikbare sneltoetsen."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Achtergrondverlichting van toetsenbord"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d van %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Bediening voor in huis"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Als je alle apps wilt bekijken, druk je op de actietoets op je toetsenbord"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Verborgen"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Ontgrendelen om te bekijken"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Contextuele educatie"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Je touchpad gebruiken om terug te gaan"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Swipe met 3 vingers naar links of rechts. Tik voor meer gebaren."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Je touchpad gebruiken om naar het startscherm te gaan"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 14e8490..59e6462 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"ଚାଲୁ ଅଛି"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"ଚାଲୁ ଅଛି • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"ବନ୍ଦ ଅଛି"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"ସେଟ ଅପ କରନ୍ତୁ"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"ସେଟିଂସରେ ପରିଚାଳନା କରନ୍ତୁ"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{କୌଣସି ସକ୍ରିୟ ମୋଡ ନାହିଁ}=1{{mode} ସକ୍ରିୟ ଅଛି}other{# ମୋଡ ସକ୍ରିୟ ଅଛି}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"ଆଲାର୍ମ, ରିମାଇଣ୍ଡର୍‌, ଇଭେଣ୍ଟ ଏବଂ ଆପଣ ନିର୍ଦ୍ଦିଷ୍ଟ କରିଥିବା କଲର୍‌ଙ୍କ ବ୍ୟତୀତ ଆପଣଙ୍କ ଧ୍ୟାନ ଅନ୍ୟ କୌଣସି ଧ୍ୱନୀ ଏବଂ ଭାଇବ୍ରେଶନ୍‌ରେ ଆକର୍ଷଣ କରାଯିବନାହିଁ। ମ୍ୟୁଜିକ୍‍, ଭିଡିଓ ଏବଂ ଗେମ୍‌ ସମେତ ନିଜେ ଚଲାଇବାକୁ ବାଛିଥିବା ଅନ୍ୟ ସବୁକିଛି ଆପଣ ଶୁଣିପାରିବେ।"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ସମସ୍ତ ନୀରବ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଖାଲି କରନ୍ତୁ"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ବିକଳ୍ପ ଦ୍ୱାରା ବିଜ୍ଞପ୍ତି ପଜ୍‍ ହୋଇଛି"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ}=1{{mode} ଦ୍ୱାରା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ବିରତ କରାଯାଇଛି}=2{{mode} ଏବଂ ଅନ୍ୟ ଏକ ମୋଡ ଦ୍ୱାରା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ବିରତ କରାଯାଇଛି}other{{mode} ଏବଂ ଅନ୍ୟ # ମୋଡ ଦ୍ୱାରା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ବିରତ କରାଯାଇଛି}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"ବର୍ତ୍ତମାନ ଆରମ୍ଭ କରନ୍ତୁ"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"କୌଣସି ନୂଆ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ନାହିଁ"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"ଡେମୋ ମୋଡ୍‍ ଦେଖାନ୍ତୁ"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ଇଥରନେଟ୍‌"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"ଆଲାରାମ"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"ୱାଲେଟ୍"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"ଆପଣଙ୍କ ଫୋନ୍ ମାଧ୍ୟମରେ ଆହୁରି ଶୀଘ୍ର, ଅଧିକ ସୁରକ୍ଷିତ କ୍ରୟ କରିବା ପାଇଁ ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"ସବୁ ଦେଖାନ୍ତୁ"</string>
@@ -1179,10 +1183,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ସ୍ପିକର ଏବଂ ଡିସପ୍ଲେଗୁଡ଼ିକ"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"ପ୍ରସ୍ତାବିତ ଡିଭାଇସଗୁଡ଼ିକ"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"ଇନପୁଟ"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"ଆଉଟପୁଟ"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"ଅନ୍ୟ ଏକ ଡିଭାଇସକୁ ମିଡିଆ ମୁଭ କରିବା ପାଇଁ ଆପଣଙ୍କ ସେୟାର କରାଯାଇଥିବା ସେସନକୁ ବନ୍ଦ କରନ୍ତୁ"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"ବନ୍ଦ କରନ୍ତୁ"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ବ୍ରଡକାଷ୍ଟିଂ କିପରି କାମ କରେ"</string>
@@ -1398,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ଆଇକନକୁ ସଙ୍କୁଚିତ କରନ୍ତୁ"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ଆଇକନକୁ ବିସ୍ତାର କରନ୍ତୁ"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"କିମ୍ବା"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ଡ୍ରାଗ ହେଣ୍ଡେଲ"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ଆପଣଙ୍କ କୀବୋର୍ଡ ବ୍ୟବହାର କରି ନାଭିଗେଟ କରନ୍ତୁ"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"କୀବୋର୍ଡ ସର୍ଟକଟଗୁଡ଼ିକ ବିଷୟରେ ଜାଣନ୍ତୁ"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ଆପଣଙ୍କ ଟଚପେଡ ବ୍ୟବହାର କରି ନାଭିଗେଟ କରନ୍ତୁ"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ଟଚପେଡର ଜେଶ୍ଚରଗୁଡ଼ିକ ବିଷୟରେ ଜାଣନ୍ତୁ"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ଆପଣଙ୍କ କୀବୋର୍ଡ ଏବଂ ଟଚପେଡ ବ୍ୟବହାର କରି ନାଭିଗେଟ କରନ୍ତୁ"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ଟଚପେଡ ଜେଶ୍ଚର, କୀବୋର୍ଡ ସର୍ଟକଟ ଏବଂ ଆହୁରି ଅନେକ କିଛି ବିଷୟରେ ଜାଣନ୍ତୁ"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ବେକ ଜେଶ୍ଚର"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ହୋମ ଜେଶ୍ଚର"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ବର୍ତ୍ତମାନର ଆପ୍ସ ଭ୍ୟୁ କରନ୍ତୁ"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ହୋଇଗଲା"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ପଛକୁ ଫେରନ୍ତୁ"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"ପଛକୁ ଫେରିବା ପାଇଁ ଯେ କୌଣସି ସ୍ଥାନରେ ତିନି ଆଙ୍ଗୁଠି ବ୍ୟବହାର କରି ବାମ କିମ୍ବା ଡାହାଣକୁ ସ୍ୱାଇପ କରନ୍ତୁ।\n\nଏଥିପାଇଁ ଆପଣ କୀବୋର୍ଡ ସର୍ଟକଟ ଆକ୍ସନ + ESC ମଧ୍ୟ ବ୍ୟବହାର କରିପାରିବେ।"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"ବଢ଼ିଆ କାମ!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"ଆପଣ \'ପଛକୁ ଫେରନ୍ତୁ\' ଜେଶ୍ଚର ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି।"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ହୋମକୁ ଯାଆନ୍ତୁ"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"ଯେ କୌଣସି ସମୟରେ ଆପଣଙ୍କ ହୋମ ସ୍କ୍ରିନକୁ ଯିବା ପାଇଁ ଆପଣଙ୍କ ସ୍କିନର ତଳୁ ତିନୋଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ କରନ୍ତୁ।"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"ବଢ଼ିଆ!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"ଆପଣ \'ହୋମକୁ ଯାଆନ୍ତୁ\' ଜେଶ୍ଚର ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି।"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"ବର୍ତ୍ତମାନର ଆପ୍ସ ଭ୍ୟୁ କରନ୍ତୁ"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"ଆପଣଙ୍କ ଟଚପେଡରେ ତିନୋଟି ଆଙ୍ଗୁଠିକୁ ବ୍ୟବହାର କରି ଉପରକୁ ସ୍ୱାଇପ କରି ଧରି ରଖନ୍ତୁ।"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ବଢ଼ିଆ କାମ!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ଆପଣ ବର୍ତ୍ତମାନର ଆପ୍ସ ଜେଶ୍ଚରକୁ ଭ୍ୟୁ କରିବା ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି।"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"ଆକ୍ସନ କୀ"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"ଆପଣଙ୍କ ଆପ୍ସ ଆକ୍ସେସ କରିବା ପାଇଁ ଆପଣଙ୍କର କୀବୋର୍ଡରେ ଆକ୍ସନ କୀ\'କୁ ଦବାନ୍ତୁ।"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"ଅଭିନନ୍ଦନ!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"ଆପଣ ଆକ୍ସନ କୀ ଜେଶ୍ଚରକୁ ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି।\n\nଆକ୍ସନ + / ଆପଣଙ୍କ ପାଖରେ ଉପଲବ୍ଧ ଥିବା ସମସ୍ତ ସଟକର୍ଟକୁ ଦେଖାଇଥାଏ।"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"କୀବୋର୍ଡ ବେକଲାଇଟ"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dରୁ %1$d ନମ୍ବର ଲେଭେଲ"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"ହୋମ କଣ୍ଟ୍ରୋଲ୍ସ"</string>
@@ -1437,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"ଆପଣଙ୍କ ସମସ୍ତ ଆପ୍ସ ଭ୍ୟୁ କରିବା ପାଇଁ ଆପଣଙ୍କ କୀବୋର୍ଡରେ ଆକ୍ସନ କୀ\'କୁ ଦବାନ୍ତୁ"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"ଲୁଚା ଯାଇଥିବା"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"ଭ୍ୟୁ କରିବାକୁ ଅନଲକ କରନ୍ତୁ"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"ପ୍ରାସଙ୍ଗିକ ଶିକ୍ଷା"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"ପଛକୁ ଫେରିବା ପାଇଁ ଆପଣଙ୍କ ଟଚପେଡକୁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"ତିନୋଟି ଆଙ୍ଗୁଠିରେ ବାମ ବା ଡାହାଣକୁ ସ୍ୱାଇପ କରନ୍ତୁ। ଜେଶ୍ଚରଗୁଡ଼ିକ ବିଷୟରେ ଅଧିକ ଜାଣିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"ହୋମକୁ ଯିବା ପାଇଁ ଆପଣଙ୍କ ଟଚପେଡ ବ୍ୟବହାର କରନ୍ତୁ"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 8e7ed22e..4c6697d 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"ਚਾਲੂ"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"<xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g> • \'ਤੇ"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"ਬੰਦ"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"ਸੈੱਟਅੱਪ ਕਰੋ"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{ਕੋਈ ਕਿਰਿਆਸ਼ੀਲ ਮੋਡ ਨਹੀਂ ਹੈ}=1{{mode} ਕਿਰਿਆਸ਼ੀਲ ਹੈ}other{# ਮੋਡ ਕਿਰਿਆਸ਼ੀਲ ਹਨ}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"ਧੁਨੀਆਂ ਅਤੇ ਥਰਥਰਾਹਟਾਂ ਤੁਹਾਨੂੰ ਪਰੇਸ਼ਾਨ ਨਹੀਂ ਕਰਨਗੀਆਂ, ਸਿਵਾਏ ਅਲਾਰਮਾਂ, ਯਾਦ-ਦਹਾਨੀਆਂ, ਵਰਤਾਰਿਆਂ, ਅਤੇ ਤੁਹਾਡੇ ਵੱਲੋਂ ਨਿਰਧਾਰਤ ਕੀਤੇ ਕਾਲਰਾਂ ਦੀ ਸੂਰਤ ਵਿੱਚ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਸੰਗੀਤ, ਵੀਡੀਓ ਅਤੇ ਗੇਮਾਂ ਸਮੇਤ ਆਪਣੀ ਚੋਣ ਅਨੁਸਾਰ ਕੁਝ ਵੀ ਸੁਣ ਸਕਦੇ ਹੋ।"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"ਗੱਲਾਂਬਾਤਾਂ"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ਸਾਰੀਆਂ ਸ਼ਾਂਤ ਸੂਚਨਾਵਾਂ ਕਲੀਅਰ ਕਰੋ"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{ਕੋਈ ਸੂਚਨਾ ਨਹੀਂ ਹੈ}=1{{mode} ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ}=2{{mode} ਅਤੇ ਇੱਕ ਹੋਰ ਮੋਡ ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ}other{{mode} ਅਤੇ # ਹੋਰ ਮੋਡਾਂ ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"ਹੁਣੇ ਸ਼ੁਰੂ ਕਰੋ"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"ਕੋਈ ਸੂਚਨਾ ਨਹੀਂ"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"ਕੋਈ ਨਵੀਂ ਸੂਚਨਾ ਨਹੀਂ ਹੈ"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"ਡੈਮੋ ਮੋਡ ਦੇਖੋ"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ਈਥਰਨੈਟ"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"ਅਲਾਰਮ"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> ਚਾਲੂ ਹੈ"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"ਆਪਣੇ ਫ਼ੋਨ ਨਾਲ ਜ਼ਿਆਦਾ ਤੇਜ਼ ਅਤੇ ਜ਼ਿਆਦਾ ਸੁਰੱਖਿਅਤ ਖਰੀਦਾਂ ਕਰਨ ਲਈ ਸੈੱਟਅੱਪ ਕਰੋ"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"ਸਭ ਦਿਖਾਓ"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ਸਪੀਕਰ ਅਤੇ ਡਿਸਪਲੇਆਂ"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"ਸੁਝਾਏ ਗਏ ਡੀਵਾਈਸ"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"ਇਨਪੁੱਟ"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"ਆਊਟਪੁੱਟ"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"ਮੀਡੀਆ ਨੂੰ ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ \'ਤੇ ਲਿਜਾਉਣ ਲਈ ਆਪਣੇ ਸਾਂਝੇ ਕੀਤੇ ਸੈਸ਼ਨ ਨੂੰ ਬੰਦ ਕਰੋ"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"ਬੰਦ ਕਰੋ"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ਪ੍ਰਸਾਰਨ ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ਪ੍ਰਤੀਕ ਨੂੰ ਸਮੇਟੋ"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ਪ੍ਰਤੀਕ ਦਾ ਵਿਸਤਾਰ ਕਰੋ"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ਜਾਂ"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ਘਸੀਟਣ ਵਾਲਾ ਹੈਂਡਲ"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ਆਪਣੇ ਕੀ-ਬੋਰਡ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਨੈਵੀਗੇਟ ਕਰੋ"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਬਾਰੇ ਜਾਣੋ"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ਆਪਣੇ ਟੱਚਪੈਡ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਨੈਵੀਗੇਟ ਕਰੋ"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ਟੱਚਪੈਡ ਇਸ਼ਾਰਿਆਂ ਬਾਰੇ ਜਾਣੋ"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ਆਪਣੇ ਕੀ-ਬੋਰਡ ਅਤੇ ਟੱਚਪੈਡ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਨੈਵੀਗੇਟ ਕਰੋ"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ਟੱਚਪੈਡ ਇਸ਼ਾਰੇ, ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਬਾਰੇ ਜਾਣੋ"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ਪਿੱਛੇ ਜਾਣ ਦਾ ਇਸ਼ਾਰਾ"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ਹੋਮ \'ਤੇ ਜਾਣ ਦਾ ਇਸ਼ਾਰਾ"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ਹਾਲੀਆ ਐਪਾਂ ਦੇਖੋ"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ਹੋ ਗਿਆ"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ਵਾਪਸ ਜਾਓ"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"ਵਾਪਸ ਜਾਣ ਲਈ, ਟੱਚਪੈਡ \'ਤੇ ਕਿਤੇ ਵੀ ਤਿੰਨ ਉਂਗਲਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਖੱਬੇ ਜਾਂ ਸੱਜੇ ਪਾਸੇ ਵੱਲ ਸਵਾਈਪ ਕਰੋ।\n\nਤੁਸੀਂ ਇਸ ਲਈ ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ Action + ESC ਦੀ ਵਰਤੋਂ ਵੀ ਕਰ ਸਕਦੇ ਹੋ।"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"ਬਹੁਤ ਵਧੀਆ!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"ਤੁਸੀਂ \'ਵਾਪਸ ਜਾਓ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ।"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ਹੋਮ \'ਤੇ ਜਾਓ"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"ਕਿਸੇ ਵੀ ਸਮੇਂ ਆਪਣੀ ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਜਾਣ ਲਈ, ਤਿੰਨ ਉਂਗਲਾਂ ਨਾਲ ਆਪਣੀ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ।"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"ਵਧੀਆ!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"ਤੁਸੀਂ \'ਹੋਮ \'ਤੇ ਜਾਓ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ।"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"ਹਾਲੀਆ ਐਪਾਂ ਦੇਖੋ"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"ਆਪਣੇ ਟੱਚਪੈਡ \'ਤੇ ਤਿੰਨ ਉਂਗਲਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰ ਕੇ ਦਬਾਈ ਰੱਖੋ।"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ਬਹੁਤ ਵਧੀਆ!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ਤੁਸੀਂ \'ਹਾਲੀਆ ਐਪਾਂ ਦੇਖੋ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ ਹੈ।"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"ਕਾਰਵਾਈ ਕੁੰਜੀ"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"ਆਪਣੀਆਂ ਐਪਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ, ਆਪਣੇ ਕੀ-ਬੋਰਡ \'ਤੇ ਕਾਰਵਾਈ ਕੁੰਜੀ ਨੂੰ ਦਬਾਓ।"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"ਵਧਾਈਆਂ!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"ਤੁਸੀਂ \'ਕਾਰਵਾਈ ਕੁੰਜੀ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ।\n\nਕਾਰਵਾਈ ਬਟਨ ਅਤੇ / ਨੂੰ ਇਕੱਠੇ ਦਬਾਉਣ \'ਤੇ, ਤੁਹਾਡੇ ਕੋਲ ਉਪਲਬਧ ਸਾਰੇ ਸ਼ਾਰਟਕੱਟ ਦਿਖਦੇ ਹਨ।"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ਕੀ-ਬੋਰਡ ਬੈਕਲਾਈਟ"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d ਵਿੱਚੋਂ %1$d ਪੱਧਰ"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"ਹੋਮ ਕੰਟਰੋਲ"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"ਆਪਣੀਆਂ ਸਾਰੀਆਂ ਐਪਾਂ ਨੂੰ ਦੇਖਣ ਲਈ, ਆਪਣੇ ਕੀ-ਬੋਰਡ \'ਤੇ ਕਾਰਵਾਈ ਕੁੰਜੀ ਨੂੰ ਦਬਾਓ"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"ਅਸਪਸ਼ਟ ਬਣਾਇਆ ਗਿਆ"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"ਦੇਖਣ ਲਈ ਅਣਲਾਕ ਕਰੋ"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"ਸੰਦਰਭੀ ਸਿੱਖਿਆ"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"ਪਿੱਛੇ ਜਾਣ ਲਈ ਆਪਣੇ ਟੱਚਪੈਡ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"ਤਿੰਨ ਉਂਗਲਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਖੱਬੇ ਜਾਂ ਸੱਜੇ ਪਾਸੇ ਵੱਲ ਸਵਾਈਪ ਕਰੋ। ਹੋਰ ਇਸ਼ਾਰਿਆਂ ਨੂੰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"ਹੋਮ \'ਤੇ ਜਾਣ ਲਈ ਆਪਣੇ ਟੱਚਪੈਡ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 287ecd3..f4efe0b 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Wł."</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Włączone • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Wył."</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Skonfiguruj"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Zarządzaj w ustawieniach"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Brak aktywnych trybów}=1{Tryb {mode} jest aktywny}few{# tryby są aktywne}many{# trybów jest aktywnych}other{# trybu jest aktywne}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Nie będą Cię niepokoić żadne dźwięki ani wibracje z wyjątkiem alarmów, przypomnień, wydarzeń i połączeń od wybranych osób. Będziesz słyszeć wszystkie odtwarzane treści, takie jak muzyka, filmy czy gry."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Rozmowy"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Usuń wszystkie ciche powiadomienia"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Powiadomienia wstrzymane przez tryb Nie przeszkadzać"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Brak powiadomień}=1{Powiadomienia są wstrzymane przez tryb {mode}}=2{Powiadomienia są wstrzymane przez tryb {mode} i 1 inny tryb}few{Powiadomienia są wstrzymane przez tryb {mode} i # inne tryby}many{Powiadomienia są wstrzymane przez tryb {mode} i # innych trybów}other{Powiadomienia są wstrzymane przez tryb {mode} i # innego trybu}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Rozpocznij teraz"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Brak powiadomień"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Brak nowych powiadomień"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Pokaż tryb demonstracyjny"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"Aplikacja <xliff:g id="MODENAME">%1$s</xliff:g> jest włączona"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Portfel"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Skonfiguruj formę płatności, aby szybciej i bezpieczniej płacić telefonem za zakupy"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Pokaż wszystko"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona zwijania"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozwijania"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"lub"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Uchwyt do przeciągania"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Nawiguj za pomocą klawiatury"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Dowiedz się więcej o skrótach klawiszowych"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Nawiguj za pomocą touchpada"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Poznaj gesty na touchpada"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Nawiguj za pomocą klawiatury i touchpada"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Poznaj gesty na touchpada, skróty klawiszowe i inne funkcje"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gest przejścia wstecz"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gest przejścia na ekran główny"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Wyświetlanie ostatnich aplikacji"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotowe"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Wróć"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Aby przejść wstecz, przesuń 3 palcami w lewo lub w prawo w dowolnym miejscu touchpada.\n\nMożesz też użyć do tego skrótu klawiszowego Action + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Brawo!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Gest przejścia wstecz został opanowany."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Otwórz stronę główną"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Aby w dowolnym momencie wyświetlić ekran główny, przesuń od dołu ekranu w górę 3 palcami."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Super!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Gest przechodzenia na ekran główny został opanowany."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Wyświetlanie ostatnich aplikacji"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Przesuń w górę za pomocą 3 palców na touchpadzie i przytrzymaj."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Brawo!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Znasz już gest wyświetlania ostatnio używanych aplikacji."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Klawisz działania"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Aby uzyskać dostęp do aplikacji, naciśnij klawisz działania na klawiaturze."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Gratulacje!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Gest klawisza działania został opanowany.\n\nKlawisz działania + / pokazuje wszystkie dostępne skróty."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Podświetlenie klawiatury"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Poziom %1$d z %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Sterowanie domem"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Aby wyświetlić wszystkie swoje aplikacje, naciśnij klawisz działania na klawiaturze"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Usunięto"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Odblokuj, aby zobaczyć"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Edukacja kontekstowa"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Przechodzenie wstecz za pomocą touchpada"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Przesuń w prawo lub lewo za pomocą 3 palców. Kliknij, aby poznać więcej gestów."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Przechodzenie do ekranu głównego za pomocą touchpada"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 408ffcb..b272422 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Ativado"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Ativado • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Desativado"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Configurar"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Gerenciar nas configurações"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Nenhum modo ativo}=1{{mode} está ativo}one{# modo está ativo}many{# de modos estão ativos}other{# modos estão ativos}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Você não será perturbado por sons e vibrações, exceto alarmes, lembretes, eventos e chamadas de pessoas especificadas. No entanto, você ouvirá tudo o que decidir reproduzir, como músicas, vídeos e jogos."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Apagar todas as notificações silenciosas"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações pausadas pelo modo \"Não perturbe\""</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Sem notificações}=1{Notificações pausadas pelo modo {mode}}=2{Notificações pausadas por {mode} e mais um modo}one{Notificações pausadas por {mode} e mais # modo}many{Notificações pausadas por {mode} e mais # de modos}other{Notificações pausadas por {mode} e mais # modos}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Sem notificações"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Nenhuma notificação nova"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Mostrar modo de demonstração"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarme"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Carteira"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Prepare tudo para fazer compras mais rápidas e seguras com seu smartphone"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Mostrar tudo"</string>
@@ -1396,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícone \"Fechar\""</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícone \"Abrir\""</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Alça de arrastar"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navegue usando o teclado"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprenda atalhos do teclado"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navegue usando o touchpad"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Aprenda gestos do touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navegue usando o teclado e o touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprenda gestos do touchpad, atalhos do teclado e muito mais"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto de volta"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto de início"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver os apps recentes"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Concluído"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Voltar"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Para voltar, deslize para a esquerda ou direita usando 3 dedos em qualquer lugar do touchpad.\n\nVocê também pode usar o atalho de teclado Ação + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Muito bem!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Você concluiu o gesto para voltar."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ir para a página inicial"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Para acessar sua tela inicial a qualquer momento, deslize de baixo para cima na tela com três dedos."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Legal!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Você concluiu o gesto para acessar a tela inicial."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver os apps recentes"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Deslize para cima e pressione com 3 dedos no touchpad."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Muito bem!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Você concluiu o gesto para ver os apps recentes."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tecla de ação"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Para acessar os apps, pressione a tecla de ação no teclado."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Parabéns!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Você concluiu o gesto da tecla de ação.\n\nA tecla de ação + / mostra todos os atalhos disponíveis."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Luz de fundo do teclado"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nível %1$d de %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Automação residencial"</string>
@@ -1435,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Para ver todos os apps, pressione a tecla de ação no teclado"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Encoberto"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Desbloquear para visualizar"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Educação contextual"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Use o touchpad para voltar"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Deslize para a esquerda ou direita usando três dedos. Toque para aprender outros gestos."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Use o touchpad para acessar a tela inicial"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 2e0bb56..cca6d72 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Ativado"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Ativado • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Desativado"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Configurar"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Gerir nas definições"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Nenhum modo ativo}=1{{mode} está ativo}many{# modos estão ativos}other{# modos estão ativos}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Não é incomodado por sons e vibrações, exceto de alarmes, lembretes, eventos e autores de chamadas que especificar. Continua a ouvir tudo o que optar por reproduzir, incluindo música, vídeos e jogos."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Limpar todas as notificações silenciosas"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações colocadas em pausa pelo modo Não incomodar."</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Sem notificações}=1{Notificações pausadas pelo modo {mode}}=2{Notificações pausadas pelo modo {mode} e mais um modo}many{Notificações pausadas pelo modo {mode} e mais # modos}other{Notificações pausadas pelo modo {mode} e mais # modos}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Começar agora"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Sem notificações"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Não existem novas notificações"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Mostrar modo de demonstração"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarme"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"O modo <xliff:g id="MODENAME">%1$s</xliff:g> está ativado"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Carteira"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Configure para efetuar pagamentos mais rápidos e seguros com o seu telemóvel"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Mostrar tudo"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Altifalantes e ecrãs"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Dispositivos sugeridos"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Entrada"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Saída"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Pare a sua sessão partilhada para mover conteúdos multimédia para outro dispositivo"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Parar"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Como funciona a transmissão"</string>
@@ -1405,26 +1406,38 @@
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Aprenda gestos do touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navegue com o teclado e o touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprenda gestos do touchpad, atalhos de teclado e muito mais"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto para retroceder"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto para aceder ao ecrã principal"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver apps recentes"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Concluir"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Voltar"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Para retroceder, deslize rapidamente para a esquerda ou direita com 3 dedos em qualquer parte do touchpad.\n\nPara o fazer, também pode usar o atalho de teclado Ação + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Muito bem!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Concluiu o gesto para retroceder."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Aceder ao ecrã principal"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Para aceder ao ecrã principal em qualquer altura, deslize rapidamente com 3 dedos de baixo para cima no ecrã."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Boa!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Concluiu o gesto para aceder ao ecrã principal."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver apps recentes"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Deslize rapidamente para cima e mantenha premido com 3 dedos no touchpad."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Muito bem!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Concluiu o gesto para ver as apps recentes."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tecla de ação"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Para aceder às suas apps, prima a tecla de ação no teclado."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Parabéns!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Concluiu o gesto da tecla de ação.\n\nA ação + / mostra todos os atalhos que tem disponíveis."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Luz do teclado"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nível %1$d de %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Controlos domésticos"</string>
@@ -1436,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Para ver todas as suas apps, prima a tecla de ação no teclado"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Revisto"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Desbloqueie para ver"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Educação contextual"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Use o touchpad para retroceder"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Deslize rapidamente para a esquerda ou direita com 3 dedos. Toque para aprender mais gestos."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Use o touchpad para aceder ao ecrã principal"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 408ffcb..b272422 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Ativado"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Ativado • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Desativado"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Configurar"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Gerenciar nas configurações"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Nenhum modo ativo}=1{{mode} está ativo}one{# modo está ativo}many{# de modos estão ativos}other{# modos estão ativos}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Você não será perturbado por sons e vibrações, exceto alarmes, lembretes, eventos e chamadas de pessoas especificadas. No entanto, você ouvirá tudo o que decidir reproduzir, como músicas, vídeos e jogos."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Apagar todas as notificações silenciosas"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações pausadas pelo modo \"Não perturbe\""</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Sem notificações}=1{Notificações pausadas pelo modo {mode}}=2{Notificações pausadas por {mode} e mais um modo}one{Notificações pausadas por {mode} e mais # modo}many{Notificações pausadas por {mode} e mais # de modos}other{Notificações pausadas por {mode} e mais # modos}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Sem notificações"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Nenhuma notificação nova"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Mostrar modo de demonstração"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarme"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Carteira"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Prepare tudo para fazer compras mais rápidas e seguras com seu smartphone"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Mostrar tudo"</string>
@@ -1396,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícone \"Fechar\""</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícone \"Abrir\""</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Alça de arrastar"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navegue usando o teclado"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Aprenda atalhos do teclado"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navegue usando o touchpad"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Aprenda gestos do touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navegue usando o teclado e o touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Aprenda gestos do touchpad, atalhos do teclado e muito mais"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto de volta"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto de início"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver os apps recentes"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Concluído"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Voltar"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Para voltar, deslize para a esquerda ou direita usando 3 dedos em qualquer lugar do touchpad.\n\nVocê também pode usar o atalho de teclado Ação + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Muito bem!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Você concluiu o gesto para voltar."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ir para a página inicial"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Para acessar sua tela inicial a qualquer momento, deslize de baixo para cima na tela com três dedos."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Legal!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Você concluiu o gesto para acessar a tela inicial."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver os apps recentes"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Deslize para cima e pressione com 3 dedos no touchpad."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Muito bem!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Você concluiu o gesto para ver os apps recentes."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tecla de ação"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Para acessar os apps, pressione a tecla de ação no teclado."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Parabéns!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Você concluiu o gesto da tecla de ação.\n\nA tecla de ação + / mostra todos os atalhos disponíveis."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Luz de fundo do teclado"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nível %1$d de %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Automação residencial"</string>
@@ -1435,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Para ver todos os apps, pressione a tecla de ação no teclado"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Encoberto"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Desbloquear para visualizar"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Educação contextual"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Use o touchpad para voltar"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Deslize para a esquerda ou direita usando três dedos. Toque para aprender outros gestos."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Use o touchpad para acessar a tela inicial"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 443d28a..4222b3d 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Activat"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Activat • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Dezactivat"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Configurează"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Gestionează în setări"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Niciun mod activ}=1{{mode} este activ}few{# moduri sunt active}other{# de moduri sunt active}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Se vor anunța prin sunete și vibrații numai alarmele, mementourile, evenimentele și apelanții specificați de tine. Totuși, vei auzi tot ce alegi să redai, inclusiv muzică, videoclipuri și jocuri."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversații"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Șterge toate notificările silențioase"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificări întrerupte prin „Nu deranja”"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Nicio notificare}=1{Notificările au fost întrerupte de {mode}}=2{Notificările au fost întrerupte de {mode} și de un alt mod}few{Notificările au fost întrerupte de {mode} și de alte # moduri}other{Notificările au fost întrerupte de {mode} și de alte # de moduri}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Începe acum"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Nicio notificare"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Nicio notificare nouă"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Afișează modul demonstrativ"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarmă"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> este activ"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Portofel"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Configurează pentru a face achiziții mai rapide și mai sigure cu telefonul"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Afișează-le pe toate"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Difuzoare și ecrane"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Dispozitive sugerate"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Intrare"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Ieșire"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Oprește sesiunea comună ca să muți elementul media pe alt dispozitiv"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Oprește"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cum funcționează transmisia"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Pictograma de restrângere"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Pictograma de extindere"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"sau"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Ghidaj de tragere"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navighează folosind tastatura"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Învață comenzile rapide de la tastatură"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navighează folosind touchpadul"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Învață gesturi pentru touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navighează folosind tastatura și touchpadul"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Învață gesturi pentru touchpad, comenzi rapide de la tastatură și altele"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gestul Înapoi"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gestul Ecran de pornire"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Vezi aplicațiile recente"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gata"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Înapoi"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Pentru a reveni, glisează spre stânga sau spre dreapta cu trei degete oriunde pe touchpad.\n\nPoți folosi și comanda rapidă de la tastatură Action + ESC pentru aceasta."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Excelent!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Ai finalizat gestul Înapoi."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Înapoi la pagina de pornire"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Pentru a accesa oricând ecranul de pornire, glisează în sus cu trei degete din partea de jos a ecranului"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bravo!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Ai finalizat gestul „accesează ecranul de pornire”."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Vezi aplicațiile recente"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Glisează în sus și ține apăsat cu trei degete pe touchpad."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Excelent!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Ai finalizat gestul pentru afișarea aplicațiilor recente."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tasta de acțiuni"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Pentru a accesa aplicațiile, apasă tasta de acțiuni de pe tastatură."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Felicitări!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Ai finalizat gestul cu tasta de acțiuni.\n\nAcțiune + / afișează toate comenzile rapide disponibile."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Iluminarea din spate a tastaturii"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivelul %1$d din %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Comenzi pentru locuință"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Ca să vezi toate aplicațiile, apasă tasta de acțiuni de pe tastatură"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Ascunsă"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Deblochează pentru a afișa"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Educație contextuală"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Folosește-ți touchpadul ca să revii"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Glisează la stânga sau la dreapta cu trei degete. Atinge ca să înveți mai multe gesturi."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Folosește-ți touchpadul ca să accesezi pagina de pornire"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 66d7808..0340a1e 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Включено"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Вкл. • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Отключено"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Настроить"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Открыть настройки"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Включено 0 режимов}=1{Включен режим \"{mode}\"}one{Включен # режим}few{Включено # режима}many{Включено # режимов}other{Включено # режима}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Вас не будут отвлекать звуки и вибрация, за исключением сигналов будильника, напоминаний, уведомлений о мероприятиях и звонков от помеченных контактов. Вы по-прежнему будете слышать включенную вами музыку, видео, игры и т. д."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговоры"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Отклонить все беззвучные уведомления"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"В режиме \"Не беспокоить\" уведомления заблокированы"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Уведомлений нет}=1{Режим \"{mode}\" приостанавливает уведомления}=2{Режим \"{mode}\" и ещё один режим приостанавливают уведомления}one{Режим \"{mode}\" и ещё # режим приостанавливают уведомления}few{Режим \"{mode}\" и ещё # режима приостанавливают уведомления}many{Режим \"{mode}\" и ещё # режимов приостанавливают уведомления}other{Режим \"{mode}\" и ещё # режима приостанавливают уведомления}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Начать"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Нет уведомлений."</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Новых уведомлений нет"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Перейти в демонстрационный режим"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Будильник"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g>: включено"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Кошелек"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Расплачивайтесь через телефон быстро и безопасно."</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Показать все"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Значок \"Свернуть\""</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок \"Развернуть\""</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Маркер перемещения"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Навигация с помощью клавиатуры"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Узнайте о сочетаниях клавиш."</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Навигация с помощью сенсорной панели"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Узнайте о жестах на сенсорной панели."</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Навигация с помощью клавиатуры и сенсорной панели"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Узнайте о жестах на сенсорной панели, сочетаниях клавиш и многом другом."</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Жест \"назад\""</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Жест \"на главный экран\""</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Жест \"Просмотр недавних приложений\""</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Чтобы вернуться назад, проведите по сенсорной панели тремя пальцами влево или вправо.\n\nВы также можете нажать клавишу действия + Esc."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Отлично!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Вы выполнили жест для перехода назад."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"На главный экран"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Чтобы перейти на главный экран, проведите снизу вверх тремя пальцами."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Неплохо!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Вы выполнили жест для перехода на главный экран."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Просмотр недавних приложений"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Проведите вверх по сенсорной панели тремя пальцами и удерживайте."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Отлично!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Вы выполнили жест для просмотра недавних приложений."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Клавиша действия"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Чтобы перейти к приложениям, нажмите клавишу действия на клавиатуре."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Готово!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Вы выполнили жест с клавишей действия.\n\nЧтобы посмотреть доступные сочетания, нажмите клавишу действия и \"/\"."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Подсветка клавиатуры"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Уровень %1$d из %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Управление домом"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Чтобы открыть список всех своих приложений, нажмите клавишу действия."</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Скрыто"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Разблокируйте экран, чтобы посмотреть."</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Контекстные подсказки"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Используйте сенсорную панель, чтобы возвращаться назад"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Для этого проведите тремя пальцами влево или вправо. Нажмите, чтобы посмотреть другие жесты."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Используйте сенсорную панель, чтобы переходить на главный экран"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 7dd43a9..93f7258 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"ක්‍රියාත්මකයි"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"ක්‍රියාත්මකයි • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"ක්‍රියාවිරහිතයි"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"පිහිටුවන්න"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"සැකසීම් තුළ කළමනාකරණය කරන්න"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{සක්‍රිය ප්‍රකාර නොමැත}=1{{mode} සක්‍රියයි}one{ප්‍රකාර #ක් සක්‍රියයි}other{ප්‍රකාර #ක් සක්‍රියයි}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"එලාම සිහිකැඳවීම්, සිදුවීම්, සහ ඔබ සඳහන් කළ අමතන්නන් හැර, ශබ්ද සහ කම්පනවලින් ඔබට බාධා නොවනු ඇත. සංගීතය, වීඩියෝ, සහ ක්‍රීඩා ඇතුළු ඔබ වාදනය කිරීමට තෝරන ලද සියලු දේ ඔබට තවම ඇසෙනු ඇත."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"සංවාද"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"සියලු නිහඬ දැනුම්දීම් හිස් කරන්න"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"බාධා නොකරන්න මගින් විරාම කරන ලද දැනුම්දීම්"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{දැනුම්දීම් නැත}=1{{mode} මගින් දැනුම්දීම් විරාම කරන ලදි}=2{{mode} සහ තව එක ප්‍රකාරයක් මගින් දැනුම්දීම් විරාම කරන ලදි}one{{mode} සහ තව ප්‍රකාර #ක් මගින් දැනුම්දීම් විරාම කරන ලදි}other{{mode} සහ තව ප්‍රකාර #ක් මගින් දැනුම්දීම් විරාම කරන ලදි}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"දැන් අරඹන්න"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"දැනුම්දීම් නැත"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"නව දැනුම්දීම් නැත"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"ආදර්ශන ප්‍රකාරය පෙන්වන්න"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"එලාමය"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"ඔබගේ දුරකථනය සමඟ වඩා වේගවත්, වඩා සුරක්ෂිත මිලදී ගැනීම් සිදු කිරීමට සූදානම් වන්න"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"සියල්ල පෙන්වන්න"</string>
@@ -1396,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"හැකුළුම් නිරූපකය"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"දිගහැරීම් නිරූපකය"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"හෝ"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"ඇදීම් හැඬලය"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ඔබේ යතුරු පුවරුව භාවිතයෙන් සංචාලනය කරන්න"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"යතුරුපුවරු කෙටිමං ඉගෙන ගන්න"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ඔබේ ස්පර්ශ පෑඩ් භාවිතයෙන් සංචාලනය කරන්න"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ස්පර්ශක පුවරු අභිනයන් ඉගෙන ගන්න"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ඔබේ යතුරු පුවරුව සහ ස්පර්ශ පෑඩ් භාවිතයෙන් සංචාලනය කරන්න"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ස්පර්ශ පෑඩ් අභිනයන්, යතුරුපුවරු කෙටිමං සහ තවත් දේ ඉගෙන ගන්න"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ආපසු අභිනය"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"නිවෙස් අභිනය"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"මෑත යෙදුම් බලන්න"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"නිමයි"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ආපස්සට යන්න"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"ආපසු යාමට, ස්පර්ශ පුවරුවවේ ඕනෑම තැනක ඇඟිලි තුනක් භාවිතයෙන් වමට හෝ දකුණට ස්වයිප් කරන්න.\n\nඔබට මේ සඳහා යතුරු පුවරු කෙටිමං ක්‍රියාව + ESC ද භාවිත කළ හැක."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"අනර්ඝ වැඩක්!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"ඔබ ආපසු යාමේ ඉංගිතය සම්පූර්ණ කරන ලදි."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"මුල් පිටුවට යන්න"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"ඕනෑම වේලාවක ඔබේ මුල් තිරයට යාමට, ඔබේ තිරයේ පහළ සිට ඇඟිලි තුනකින් ඉහළට ස්වයිප් කරන්න."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"කදිමයි!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"ඔබ මුල් පිටුවට යාමේ ඉංගිතය සම්පූර්ණ කළා."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"මෑත යෙදුම් බලන්න"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"ඉහළට ස්වයිප් කර ඔබේ ස්පර්ශ පුවරුව මත ඇඟිලි තුනක් භාවිතා කර සිටින්න."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"අනර්ඝ වැඩක්!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ඔබ මෑත යෙදුම් ඉංගිත බැලීම සම්පූර්ණ කර ඇත."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"ක්‍රියා යතුර"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"ඔබේ යෙදුම් වෙත ප්‍රවේශ වීමට, ඔබේ යතුරු පුවරුවෙහි ක්‍රියා යතුර ඔබන්න."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"සුබ පැතුම්!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"ඔබ ක්‍රියා යතුරු අභිනය සම්පූර්ණ කළා.\n\nක්‍රියාව + / ඔබට ලබා ගත හැකි සියලු කෙටිමං පෙන්වයි."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"යතුරු පුවරු පසු ආලෝකය"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dන් %1$d වැනි මට්ටම"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"නිවෙස් පාලන"</string>
@@ -1435,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"ඔබේ සියලුම යෙදුම් බැලීමට, ඔබේ යතුරුපුවරුවේ ක්‍රියාකාරී යතුර ඔබන්න"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"නැවත සකස් කරන ලද"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"බැලීමට අගුළු හරින්න"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"සන්දර්භීය අධ්‍යාපනය"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"ආපසු යාමට ඔබේ ස්පර්ශ පුවරුව භාවිත කරන්න"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"ඇඟිලි තුනක් භාවිතයෙන් වමට හෝ දකුණට ස්වයිප් කරන්න. තව ඉංගිත දැන ගැනීමට තට්ටු කරන්න."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"මුල් පිටුවට යාමට ඔබේ ස්පර්ශ පුවරුව භාවිත කරන්න"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index a13a1b4..e7c9263 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -152,12 +152,12 @@
     <string name="cast_to_other_device_stop_dialog_message_generic" msgid="4100272100480415076">"Momentálne prenášate do zariadenia v okolí"</string>
     <string name="cast_to_other_device_stop_dialog_button" msgid="6420183747435521834">"Zastaviť prenos"</string>
     <string name="close_dialog_button" msgid="4749497706540104133">"Zavrieť"</string>
-    <string name="issuerecord_title" msgid="286627115110121849">"Nástroj na zaznamenávanie problémov"</string>
+    <string name="issuerecord_title" msgid="286627115110121849">"Nahrávanie problémov"</string>
     <string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Záznam problému sa spracúva"</string>
     <string name="issuerecord_channel_description" msgid="6142326363431474632">"Upozornenie na prebiehajúcu aktivitu týkajúcu sa relácie zhromažďovania problémov"</string>
-    <string name="issuerecord_ongoing_screen_only" msgid="6248206059935015722">"Problém sa zaznamenáva"</string>
+    <string name="issuerecord_ongoing_screen_only" msgid="6248206059935015722">"Problém sa nahráva"</string>
     <string name="issuerecord_share_label" msgid="3992657993619876199">"Zdieľať"</string>
-    <string name="issuerecord_save_title" msgid="4161043023696751591">"Záznam problému bol uložený"</string>
+    <string name="issuerecord_save_title" msgid="4161043023696751591">"Nahrávka problému bola uložená"</string>
     <string name="issuerecord_save_text" msgid="1205985304551521495">"Zobrazíte ho klepnutím"</string>
     <string name="issuerecord_save_error" msgid="6913040083446722726">"Pri ukladaní záznamu problému sa vyskytla chyba"</string>
     <string name="issuerecord_start_error" msgid="3402782952722871190">"Pri spúšťaní záznamu problému sa vyskytla chyba"</string>
@@ -380,16 +380,16 @@
     <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je deaktivované"</string>
     <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je aktivované"</string>
-    <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Rekordér obrazovky"</string>
+    <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Nahrávanie obrazovky"</string>
     <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Začať"</string>
     <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Ukončiť"</string>
-    <string name="qs_record_issue_label" msgid="8166290137285529059">"Zaznamenať problém"</string>
+    <string name="qs_record_issue_label" msgid="8166290137285529059">"Nahrať problém"</string>
     <string name="qs_record_issue_start" msgid="2979831312582567056">"Začať"</string>
     <string name="qs_record_issue_stop" msgid="3531747965741982657">"Zastavte"</string>
     <string name="qs_record_issue_bug_report" msgid="8229031766918650079">"Hlásenie chyby"</string>
     <string name="qs_record_issue_dropdown_header" msgid="5995983175678658329">"Čo v zariadení bolo ovplyvnené?"</string>
     <string name="qs_record_issue_dropdown_prompt" msgid="2526949919167046219">"Vyberte typ problému"</string>
-    <string name="qs_record_issue_dropdown_screenrecord" msgid="6396141928484257626">"Rekordér obrazovky"</string>
+    <string name="qs_record_issue_dropdown_screenrecord" msgid="6396141928484257626">"Nahrávanie obrazovky"</string>
     <string name="performance" msgid="6552785217174378320">"Výkon"</string>
     <string name="user_interface" msgid="3712869377953950887">"Používateľské rozhranie"</string>
     <string name="thermal" msgid="6758074791325414831">"Teplota"</string>
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Zapnuté"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Zapnuté • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Vypnuté"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Nastaviť"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Správa v nastaveniach"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Žiadne aktívne režimy}=1{{mode} je aktívny}few{# režimy sú aktívne}many{# modes are active}other{# režimov je aktívnych}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Nebudú vás vyrušovať zvuky ani vibrácie, iba budíky, pripomenutia, udalosti a volajúci, ktorých určíte. Budete naďalej počuť všetko, čo sa rozhodnete prehrať, ako napríklad hudbu, videá a hry."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzácie"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vymazať všetky tiché upozornenia"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Upozornenia sú pozastavené režimom bez vyrušení"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Žiadne upozornenia}=1{Upozornenia boli pozastavené režimom {mode}}=2{Upozornenia boli pozastavené režimom {mode} a jedným ďalším}few{Upozornenia boli pozastavené režimom {mode} a # ďalšími}many{Notifications paused by {mode} and # other modes}other{Upozornenia boli pozastavené režimom {mode} a # ďalšími}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Spustiť"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Žiadne upozornenia"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Žiadne nové upozornenia"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Zobraziť režim ukážky"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Budík"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"Režim <xliff:g id="MODENAME">%1$s</xliff:g> je zapnutý"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Peňaženka"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Nastavte si všetko potrebné na rýchlejšie a bezpečnejšie nákupy telefónom"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Zobraziť všetko"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Reproduktory a obrazovky"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Navrhované zariadenia"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Vstup"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Výstup"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Ak chcete preniesť médiá do iného zariadenia, ukončite zdieľanú reláciu"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Ukončiť"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Ako vysielanie funguje"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona zbalenia"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozbalenia"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"alebo"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Presúvadlo"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Prechádzajte pomocou klávesnice"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Naučte sa klávesové skratky"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Prechádzajte pomocou touchpadu"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Naučte sa gestá touchpadu"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Prechádzajte pomocou klávesnice a touchpadu"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Naučte sa gestá touchpadu, klávesové skratky a ďalšie funkcie"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gesto prechodu späť"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gesto prechodu domov"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Zobrazenie nedávnych aplikácií"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hotovo"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Prejsť späť"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Ak chcete prejsť späť, potiahnite kdekoľvek na touchpade troma prstami doľava alebo doprava.\n\nMôžete použiť aj klávesovú skratku, teda akčný kláves + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Skvelé!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Dokončili ste gesto na prechod späť."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Prechod na plochu"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Na plochu môžete kedykoľvek prejsť potiahnutím troma prstami zdola obrazovky."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Výborne!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Dokončili ste gesto na prechod na plochu."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Zobrazenie nedávnych aplikácií"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Potiahnite troma prstami na touchpade nahor a pridržte ich."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Skvelé!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Dokončili ste gesto na zobrazenie nedávnych aplikácií."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Akčný kláves"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Ak chcete získať prístup k aplikáciám, stlačte na klávesnici akčný kláves."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Blahoželáme!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Dokončili ste gesto akčného klávesa.\n\nStlačením kombinácie akčný kláves + / zobrazíte všetky skratky, ktoré máte k dispozícii"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Podsvietenie klávesnice"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. úroveň z %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Ovládanie domácnosti"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Ak si chcete zobraziť všetky aplikácie, stlačte na klávesnici akčný kláves"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Zamaskované"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Zobrazíte odomknutím"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontextová náuka"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Prechádzajte späť pomocou touchpadu"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Potiahnite troma prstami doľava alebo doprava. Viac o gestách sa dozviete klepnutím."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Vráťte sa na plochu pomocou touchpadu"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 653bb58..701cdd1 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -440,7 +440,7 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Vklopljeno"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Vklopljeno • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Izklopljeno"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Nastavitev"</string>
+    <string name="zen_mode_set_up" msgid="8231201163894922821">"Ni nastavljeno"</string>
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Upravljanje v nastavitvah"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Ni aktivnih načinov}=1{Način {mode} je aktiven}one{# način je aktiven}two{# načina sta aktivna}few{# načini so aktivni}other{# načinov je aktivnih}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Ne bodo vas motili zvoki ali vibriranje, razen v primeru alarmov, opomnikov, dogodkov in klicateljev, ki jih določite. Še vedno pa boste slišali vse, kar se boste odločili predvajati, vključno z glasbo, videoposnetki in igrami."</string>
@@ -573,6 +573,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Pogovori"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Brisanje vseh tihih obvestil"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Prikazovanje obvestil je začasno zaustavljeno z načinom »ne moti«"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Ni obvestil}=1{Prikazovanje obvestil je začasno zaustavljeno z načinom {mode}}=2{Prikazovanje obvestil je začasno zaustavljeno z načinom {mode} in še enim drugim načinom}one{Prikazovanje obvestil je začasno zaustavljeno z načinom {mode} in še # drugim načinom}two{Prikazovanje obvestil je začasno zaustavljeno z načinom {mode} in še # drugima načinoma}few{Prikazovanje obvestil je začasno zaustavljeno z načinom {mode} in še # drugimi načini}other{Prikazovanje obvestil je začasno zaustavljeno z načinom {mode} in še # drugimi načini}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Začni zdaj"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Ni obvestil"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Ni novih obvestil"</string>
@@ -704,6 +705,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Prikaz predstavitvenega načina"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g>: Vklopljeno"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Denarnica"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Nastavite možnost hitrejšega in varnejšega plačevanja s telefonom."</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Prikaži vse"</string>
@@ -1403,26 +1405,26 @@
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Učenje potez na sledilni ploščici"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Krmarjenje s tipkovnico in sledilno ploščico"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Učenje potez na sledilni ploščici, bližnjičnih tipk in drugega"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Poteza za pomik nazaj"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Poteza za začetni zaslon"</string>
+    <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Nazaj"</string>
+    <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Pojdi na začetni zaslon"</string>
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ogled nedavnih aplikacij"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Končano"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Nazaj"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Za pomik nazaj povlecite levo ali desno s tremi prsti kjer koli na sledilni ploščici.\n\nUporabite lahko tudi bližnjični tipki Action + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Odlično!"</string>
+    <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Na sledilni ploščici s tremi prsti povlecite levo ali desno"</string>
+    <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Odlično!"</string>
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Izvedli ste potezo za pomik nazaj."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Pomik na začetni zaslon"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Za pomik na začetni zaslon lahko kadar koli s tremi prsti povlečete navzgor z dna zaslona."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Odlično!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Izvedli ste potezo za pomik na začetni zaslon."</string>
+    <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Na sledilni ploščici s tremi prsti povlecite navzgor"</string>
+    <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Odlično!"</string>
+    <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Izvedli ste potezo za pomik na začetni zaslon"</string>
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ogled nedavnih aplikacij"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Na sledilni ploščici s tremi prsti povlecite navzgor in pridržite."</string>
+    <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Na sledilni ploščici s tremi prsti povlecite navzgor in pridržite"</string>
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Odlično!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Izvedli ste potezo za ogled nedavnih aplikacij."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tipka za dejanja"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Za dostop do aplikacij pritisnite tipko za dejanja na tipkovnici."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Čestitamo!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Izvedli ste potezo za tipko za dejanja.\n\nČe hkrati pritisnete tipko za dejanja in poševnico naprej »/«, bodo prikazane vse razpoložljive bližnjice."</string>
+    <string name="tutorial_action_key_title" msgid="8172535792469008169">"Ogled vseh aplikacij"</string>
+    <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pritisnite tipko za dejanja na tipkovnici"</string>
+    <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Odlično!"</string>
+    <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Izvedli ste potezo za ogled vseh aplikacij"</string>
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Osvetlitev tipkovnice"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Stopnja %1$d od %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrolniki za dom"</string>
@@ -1434,6 +1436,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Za ogled vseh aplikacij pritisnite tipko za dejanja na tipkovnici"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Zakrito"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Odklenite za ogled"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontekstualno izobraževanje"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Uporaba sledilne ploščice za pomik nazaj"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"S tremi prsti povlecite levo ali desno. Dotaknite se, če želite spoznati več potez."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Uporaba sledilne ploščice za pomik na začetni zaslon"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 00484a7..20f7e82 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Aktiv"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Aktiv • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Joaktiv"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Konfiguro"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Menaxho te cilësimet"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Nuk ka modalitete aktive}=1{\"{mode}\" është aktiv}other{# modalitete janë aktive}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Nuk do të shqetësohesh nga tingujt dhe dridhjet, përveç alarmeve, alarmeve rikujtuese, ngjarjeve dhe telefonuesve që specifikon. Do të vazhdosh të dëgjosh çdo gjë që zgjedh të luash duke përfshirë muzikën, videot dhe lojërat."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Bisedat"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Pastro të gjitha njoftimet në heshtje"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Njoftimet janë vendosur në pauzë nga modaliteti \"Mos shqetëso\""</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Asnjë njoftim}=1{Njoftimet u vendosën në pauzë nga {mode}}=2{Njoftimet u vendosën në pauzë nga {mode} dhe një modalitet tjetër}other{Njoftimet u vendosën në pauzë nga {mode} dhe # modalitete të tjera}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Fillo tani"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Asnjë njoftim"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Nuk ka njoftime të reja"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Shfaq modalitetin e demonstrimit"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Eternet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarmi"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Portofoli"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Konfiguro për të kryer pagesa më të shpejta dhe më të sigurta përmes telefonit"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Shfaqi të gjitha"</string>
@@ -1179,10 +1183,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Altoparlantët dhe ekranet"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Pajisjet e sugjeruara"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Hyrja"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Dalja"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Ndalo sesionin e ndarë për ta zhvendosur median në një pajisje tjetër"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Ndalo"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Si funksionon transmetimi"</string>
@@ -1398,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona e palosjes"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona e zgjerimit"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ose"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Doreza e zvarritjes"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigo duke përdorur tastierën tënde"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Mëso shkurtoret e tastierës"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigo duke përdorur bllokun me prekje"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Mëso gjestet e bllokut me prekje"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigo duke përdorur tastierën dhe bllokun me prekje"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Mëso gjestet e bllokut me prekje, shkurtoret e tastierës etj."</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Gjesti i kthimit prapa"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Gjesti për të shkuar tek ekrani bazë"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Shiko aplikacionet e fundit"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"U krye"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Kthehu prapa"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Për t\'u kthyer, rrëshqit shpejt majtas ose djathtas duke përdorur tri gishta kudo në bllokun me prekje.\n\nPër ta bërë këtë, mund të përdorësh gjithashtu shkurtoren e tastierës \"Action + ESC\"."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Punë e shkëlqyer!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"E ke përfunduar gjestin e kthimit prapa."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Shko tek ekrani bazë"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Për të shkuar tek ekrani bazë në çdo kohë, rrëshqit shpejt lart me tre gishta nga fundi i ekranit."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bukur!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"E ke përfunduar gjestin e kalimit tek ekrani bazë."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Shiko aplikacionet e fundit"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Rrëshqit shpejt lart dhe mbaj shtypur me tre gishta në bllokun me prekje."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Punë e shkëlqyer!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Përfundove gjestin për shikimin e aplikacioneve të fundit."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Tasti i veprimit"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Për t\'u qasur në aplikacionet e tua, shtyp tastin e veprimit në tastierë."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Urime!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Ke përfunduar gjestin e tastit të veprimit.\n\nVeprimi + / shfaq të gjitha shkurtoret që janë të disponueshme për ty."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Drita e sfondit e tastierës"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveli: %1$d nga %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrollet e shtëpisë"</string>
@@ -1437,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Për të shikuar të gjitha aplikacionet, shtyp tastin e veprimit në tastierë"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Redaktuar"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Shkyçe për ta parë"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Edukimi kontekstual"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Përdor bllokun me prekje për t\'u kthyer prapa"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Rrëshqit shpejt majtas ose djathtas duke përdorur tre gishta. Trokit për të mësuar më shumë gjeste."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Përdor bllokun me prekje për të shkuar tek ekrani bazë"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 3a940c1..f757cdc 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Укључено"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Укљ. • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Искључено"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Подеси"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Управљајте у подешавањима"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Нема активних режима}=1{Активан је {mode} режим}one{Активан је # режим}few{Активна су # режима}other{Активно је # режима}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Неће вас узнемиравати звукови и вибрације осим за аларме, подсетнике, догађаје и позиваоце које наведете. И даље ћете чути све што одаберете да пустите, укључујући музику, видео снимке и игре."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Конверзације"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Обришите сва нечујна обавештења"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Обавештења су паузирана режимом Не узнемиравај"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Нема обавештења}=1{Обавештења је паузирао {mode}}=2{Обавештења су паузирали {mode} и још један режим}one{Обавештења су паузирали {mode} и још # режим}few{Обавештења су паузирали {mode} и још # режима}other{Обавештења су паузирали {mode} и још # режима}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Започни"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Нема обавештења"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Нема нових обавештења"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Прикажи режим демонстрације"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Етернет"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Аларм"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g>: укључено"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Новчаник"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Обавите конфигурисање да бисте могли брже и сигурније да купујете помоћу телефона"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Прикажи све"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за скупљање"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за проширивање"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Маркер за превлачење"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Крећите се помоћу тастатуре"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Сазнајте више о тастерским пречицама"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Крећите се помоћу тачпеда"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Научите покрете за тачпед"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Крећите се помоћу тастатуре и тачпeда"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Научите покрете за тачпед, тастерске пречице и друго"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Покрет за враћање"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Покрет за почетну страницу"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Прикажи недавно коришћене апликације"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Да бисте се вратили, превуците улево са три прста било где на тачпеду.\n\nМожете да користите и тастерску пречицу Alt + ESC за ово."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Одлично!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Довршили сте покрет за повратак."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Иди на почетни екран"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Да бисте отишли на почетни екран у било ком тренутку, превуците нагоре од дна екрана помоћу три прста."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Свака част!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Довршили сте покрет за повратак на почетну страницу."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Прикажи недавно коришћене апликације"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Превуците нагоре и задржите помоћу три прста на тачпеду."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Одлично!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Довршили сте покрет за приказивање недавно коришћених апликација."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Тастер радњи"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Да бисте приступили апликацијама, притисните тастер радњи на тастатури."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Честитамо!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Довршили сте покрет помоћу тастера радњи.\n\nРадња + / приказује све пречице које су вам доступне."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Позадинско осветљење тастатуре"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. ниво од %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Контроле за дом"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Да бисте погледали све апликације, притисните тастер радњи на тастатури"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Редиговано"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Откључајте за приказ"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Контекстуално образовање"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Користите тачпед да бисте се вратили"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Превуците улево или удесно са три прста. Додирните да бисте видели више покрета."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Користите тачпед да бисте отишли на почетни екран"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 23f476d..c8ece13 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -440,7 +440,7 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"På"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"På • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Av"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Ställ in"</string>
+    <string name="zen_mode_set_up" msgid="8231201163894922821">"Inte angivet"</string>
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Hantera i inställningarna"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Inga aktiva lägen}=1{{mode} är aktivt}other{# lägen är aktiva}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Du blir inte störd av ljud och vibrationer, förutom från alarm, påminnelser, händelser och specifika samtal. Ljudet är fortfarande på för sådant du väljer att spela upp, till exempel musik, videor och spel."</string>
@@ -573,6 +573,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Konversationer"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Rensa alla ljudlösa aviseringar"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Aviseringar har pausats via Stör ej"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Inga aviseringar}=1{Aviseringar har pausats av {mode}}=2{Aviseringar har pausats av {mode} och ett annat läge}other{Aviseringar har pausats av {mode} och # andra lägen}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Starta nu"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Inga aviseringar"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Det finns inga nya aviseringar"</string>
@@ -704,6 +705,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Visa demoläge"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> är på"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Lägg till en betalningsmetod för att betala snabbare och säkrare med telefonen"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Visa alla"</string>
@@ -1179,10 +1181,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Högtalare och skärmar"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Förslag på enheter"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Ingång"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Utgång"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Stoppa din delade session för att flytta media till en annan enhet"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Stoppa"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Så fungerar utsändning"</string>
@@ -1398,34 +1398,33 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikonen Komprimera"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikonen Utöka"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Handtag"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigera med tangentbordet"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Lär dig kortkommandon"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigera med styrplattan"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Lär dig rörelser för styrplattan"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Navigera med tangentbordet och styrplattan"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Lär dig rörelser för styrplattan, kortkommandon med mera"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Tillbaka-rörelse"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Rörelse för att öppna startskärmen"</string>
+    <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Tillbaka"</string>
+    <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Återvänd till startsidan"</string>
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Se de senaste apparna"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Klar"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Tillbaka"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Gå tillbaka genom att svepa åt vänster eller höger med tre fingrar var som helst på styrplattan.\n\nDu kan även använda kortkommandot Åtgärd + Esc."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Bra jobbat!"</string>
+    <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Svep åt vänster eller höger med tre fingrar på styrplattan"</string>
+    <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Bra!"</string>
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Du är klar med rörelsen för att gå tillbaka."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Återvänd till startskärmen"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Öppna startskärmen när som helst genom att svepa uppåt med tre fingrar från skärmens nederkant."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Bra!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Du är klar med rörelsen för att öppna startskärmen."</string>
+    <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Svep uppåt med tre fingrar på styrplattan"</string>
+    <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Bra jobbat!"</string>
+    <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Du är klar med rörelsen för att öppna startskärmen"</string>
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Se de senaste apparna"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Svep uppåt med tre fingrar på styrplattan och håll kvar."</string>
+    <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Svep uppåt med tre fingrar på styrplattan och håll kvar"</string>
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bra jobbat!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Du är klar med rörelsen för att se de senaste apparna."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Åtgärdstangent"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Tryck på åtgärdstangenten på tangentbordet för att komma åt dina appar."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Grattis!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Du är klar med rörelsen med åtgärdstangenten.\n\nÅtgärd + / visar alla tillgängliga genvägar."</string>
+    <string name="tutorial_action_key_title" msgid="8172535792469008169">"Visa alla appar"</string>
+    <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Tryck på åtgärdstangenten på tangentbordet"</string>
+    <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Bra gjort!"</string>
+    <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Du är klar med rörelsen för att se alla apparna."</string>
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Bakgrundsbelysning för tangentbord"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivå %1$d av %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Hemstyrning"</string>
@@ -1437,6 +1436,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Tryck på åtgärdstangenten på tangentbordet för att se alla appar"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Anonymiserad"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Lås upp för att visa"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontextuell utbildning"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Använd styrplattan för att gå tillbaka"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Svep åt vänster eller höger med tre fingrar. Tryck för att lära dig fler rörelser."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Använd styrplattan för att gå till startskärmen"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index dee6a5f..17a8823 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Imewashwa"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Imewashwa • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Imezimwa"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Ratibu"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Dhibiti katika mipangilio"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Hakuna hali zinazotumika}=1{Unatumia {mode}}other{Unatumia hali #}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Hutasumbuliwa na sauti na mitetemo, isipokuwa kengele, vikumbusho, matukio na simu zinazopigwa na watu uliobainisha. Bado utasikia chochote utakachochagua kucheza, ikiwa ni pamoja na muziki, video na michezo."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Mazungumzo"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Futa arifa zote zisizo na sauti"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Kipengele cha Usinisumbue kimesitisha arifa"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Hakuna arifa}=1{Arifa zimesitishwa na {mode}}=2{Arifa zimesitishwa na {mode} na hali nyingine moja}other{Arifa zimesitishwa na {mode} na hali nyingine #}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Anza sasa"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Hakuna arifa"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Hakuna arifa mpya"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Onyesha hali ya onyesho"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethaneti"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Kengele"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"Umewasha <xliff:g id="MODENAME">%1$s</xliff:g>"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Pochi"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Weka njia ya kulipa ili uweze kununua kwa njia salama na haraka zaidi ukitumia simu yako"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Onyesha zote"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Spika na Skrini"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Vifaa Vilivyopendekezwa"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Vifaa vya kuingiza data"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Vifaa vya kutoa maudhui"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Simamisha kipindi unachoshiriki ili uhamishie maudhui kwenye kifaa kingine"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Simamisha"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Jinsi utangazaji unavyofanya kazi"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Kunja aikoni"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Panua aikoni"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"au"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Aikoni ya buruta"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Kusogeza kwa kutumia kibodi yako"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Jifunze kuhusu mikato ya kibodi"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Kusogeza kwa kutumia padi yako ya kugusa"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Jifunze kuhusu miguso ya padi ya kugusa"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Kusogeza kwa kutumia kibodi na padi yako ya kugusa"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Jifunze kuhusu miguso ya padi ya kugusa, mikato ya kibodi na mengineyo"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Ishara ya kurudi nyuma"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Mguso wa kurudi kwenye skrini ya kwanza"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Angalia programu za hivi majuzi"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Nimemaliza"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Rudi nyuma"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Telezesha vidole vitatu kushoto au kulia mahali popote kwenye padi ya kugusa ili urudi nyuma.\n\nUnaweza pia kutumia mikato ya kibodi ya Kitendo pamoja na ESC kutekeleza kitendo hiki."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Kazi nzuri!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Umekamilisha ishara ya kurudi nyuma."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Nenda kwenye skrini ya kwanza"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Ili uende kwenye skrini ya kwanza wakati wowote, telezesha vidole vitatu juu kutoka sehemu ya chini ya skrini yako."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Safi!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Umeweka ishara ya kwenda kwenye skrini ya kwanza."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Angalia programu za hivi majuzi"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Telezesha vidole vitatu juu kisha ushikilie kwenye padi yako ya kugusa."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Kazi nzuri!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Umekamilisha mafunzo ya mguso wa kuangalia programu za hivi majuzi."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Kitufe cha vitendo"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Bonyeza kitufe cha vitendo kwenye kibodi yako ili ufikie programu zako."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Hongera!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Umekamilisha ishara ya kitufe cha vitendo.\n\nKitendo + / huonyesha njia zote za mkato zinazopatikana."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Mwanga chini ya kibodi"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Kiwango cha %1$d kati ya %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Dhibiti Vifaa Nyumbani"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Bonyeza kitufe cha vitendo kwenye kibodi yako ili uangalie programu zako zote"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Maandishi yameondolewa"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Fungua ili uone"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Elimu inayolingana na muktadha"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Kutumia padi yako ya kugusa ili kurudi nyuma"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Telezesha vidole vitatu kulia au kushoto. Gusa ili upate maelezo kuhusu miguso zaidi."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Kutumia padi yako ya kugusa ili kurudi kwenye skrini ya kwanza"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 92da908..2381e1b 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"இயக்கப்பட்டுள்ளது"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"ஆன் • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"முடக்கப்பட்டுள்ளது"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"அமையுங்கள்"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"அமைப்புகளில் நிர்வகியுங்கள்"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{செயலிலுள்ள பயன்முறைகள் எதுவுமில்லை}=1{{mode} செயலில் உள்ளது}other{# பயன்முறைகள் செயலில் உள்ளன}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"அலாரங்கள், நினைவூட்டல்கள், நிகழ்வுகள் மற்றும் குறிப்பிட்ட அழைப்பாளர்களைத் தவிர்த்து, பிற ஒலிகள் மற்றும் அதிர்வுகளின் தொந்தரவு இருக்காது. எனினும், நீங்கள் எதையேனும் (இசை, வீடியோக்கள், கேம்ஸ் போன்றவை) ஒலிக்கும்படி தேர்ந்தெடுத்திருந்தால், அவை வழக்கம் போல் ஒலிக்கும்."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"உரையாடல்கள்"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"சைலன்ட் அறிவிப்புகள் அனைத்தையும் அழிக்கும்"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'தொந்தரவு செய்ய வேண்டாம்\' அம்சத்தின் மூலம் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{அறிவிப்புகள் இல்லை}=1{{mode} பயன்முறையால் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன}=2{{mode} மற்றும் வேறொரு பயன்முறையால் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன}other{{mode} மற்றும் வேறு # பயன்முறைகளால் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"இப்போது தொடங்கு"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"அறிவிப்புகள் இல்லை"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"புதிய அறிவிப்புகள் இல்லை"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"டெமோ முறையைக் காட்டு"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ஈதர்நெட்"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"அலாரம்"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> இயக்கப்பட்டுள்ளது"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"மொபைல் மூலம் விரைவாகவும் பாதுகாப்பாகவும் பர்ச்சேஸ்கள் செய்ய பேமெண்ட் முறையை அமைக்கவும்"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"அனைத்தையும் காட்டு"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ஸ்பீக்கர்கள் &amp; டிஸ்ப்ளேக்கள்"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"பரிந்துரைக்கப்படும் சாதனங்கள்"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"உள்ளீடு"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"வெளியீடு"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"மீடியாவை வேறொரு சாதனத்திற்கு மாற்ற \'பகிரப்படும் அமர்வை\' நிறுத்தவும்"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"நிறுத்து"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"பிராட்காஸ்ட் எவ்வாறு செயல்படுகிறது?"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"சுருக்குவதற்கான ஐகான்"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"விரிவாக்குவதற்கான ஐகான்"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"அல்லது"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"இழுப்பதற்கான ஹேண்டில்"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"கீபோர்டைப் பயன்படுத்திச் செல்லுதல்"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"கீபோர்டு ஷார்ட்கட்கள் குறித்துத் தெரிந்துகொள்ளுங்கள்"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"டச்பேடைப் பயன்படுத்திச் செல்லுதல்"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"டச்பேட் சைகைள் குறித்துத் தெரிந்துகொள்ளுங்கள்"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"உங்கள் டச்பேட் மற்றும் கீபோர்டைப் பயன்படுத்திச் செல்லுதல்"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"டச்பேட் சைகைகள், கீபோர்டு ஷார்ட்கட்கள் மற்றும் பலவற்றைத் தெரிந்துகொள்ளுங்கள்"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"பின்செல்வதற்கான சைகை"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"முகப்பிற்குச் செல்வதற்கான சைகை"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"சமீபத்திய ஆப்ஸைக் காட்டுதல்"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"முடிந்தது"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"பின்செல்"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"பின்செல்ல, உங்கள் டச்பேடில் எங்கு வேண்டுமானாலும் இடது அல்லது வலதுபுறமாக மூன்று விரல்களால் ஸ்வைப் செய்யவும்.\n\nஇதற்கு நீங்கள் கீபோர்டு ஷார்ட்கட் செயல்பாடுகள் + Esc பட்டனையும் பயன்படுத்தலாம்."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"அருமை!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"பின்செல்வதற்கான சைகையை நிறைவுசெய்துவிட்டீர்கள்."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"முகப்பிற்குச் செல்"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"எப்போது வேண்டுமானாலும் உங்கள் முகப்புத் திரைக்குச் செல்ல, மூன்று விரல்களால் திரையின் கீழிருந்து மேல்நோக்கி ஸ்வைப் செய்யவும்."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"அற்புதம்!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"முகப்புக்குச் செல்வதற்கான சைகையை நிறைவுசெய்துவிட்டீர்கள்."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"சமீபத்திய ஆப்ஸைக் காட்டுதல்"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"உங்கள் டச்பேடில் மூன்று விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடிக்கவும்."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"அருமை!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"சமீபத்தில் பயன்படுத்திய ஆப்ஸுக்கான சைகை பயிற்சியை நிறைவுசெய்துவிட்டீர்கள்."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"ஆக்‌ஷன் பட்டன்"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"ஆப்ஸை அணுக உங்கள் கீபோர்டில் உள்ள ஆக்‌ஷன் பட்டனை அழுத்துங்கள்."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"வாழ்த்துகள்!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"ஆக்‌ஷன் பட்டன் சைகையை நிறைவுசெய்துவிட்டீர்கள்.\n\nAction + / உங்களுக்குக் கிடைக்கக்கூடிய எல்லா ஷார்ட்கட்களையும் காட்டும்."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"கீபோர்டு பேக்லைட்"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"நிலை, %2$d இல் %1$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"ஹோம் கன்ட்ரோல்கள்"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"அனைத்து ஆப்ஸையும் பார்க்க, உங்கள் கீபோர்டில் உள்ள ஆக்ஷன் பட்டனை அழுத்தவும்"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"அர்த்தம் புரியாதபடி திருத்தப்பட்டது"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"பார்ப்பதற்கு அன்லாக் செய்யவும்"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"சூழல் சார்ந்த கல்வி"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"பின்செல்ல, உங்கள் டச்பேடைப் பயன்படுத்துங்கள்"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"மூன்று விரல்களால் இடது அல்லது வலதுபுறம் ஸ்வைப் செய்யவும். சைகைகள் குறித்து மேலும் அறிய தட்டவும்."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"முகப்புக்குச் செல்ல, உங்கள் டச்பேடைப் பயன்படுத்துங்கள்"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 16500ed..fcc344b 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -21,7 +21,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4811759950673118541">"సిస్టమ్ UI"</string>
     <string name="battery_low_title" msgid="5319680173344341779">"బ్యాటరీ సేవర్‌ను ఆన్ చేయాలా?"</string>
-    <string name="battery_low_description" msgid="3282977755476423966">"మీకు <xliff:g id="PERCENTAGE">%s</xliff:g> బ్యాటరీ మిగిలి ఉంది. బ్యాటరీ సేవర్ ముదురు రంగు రూపాన్ని ఆన్ చేస్తుంది, బ్యాక్‌గ్రౌండ్ యాక్టివిటీని పరిమితం చేస్తుంది, అలాగే నోటిఫికేషన్‌లను ఆలస్యంగా పంపిస్తుంది."</string>
+    <string name="battery_low_description" msgid="3282977755476423966">"బ్యాటరీ <xliff:g id="PERCENTAGE">%s</xliff:g> మిగిలి ఉంది. \"బ్యాటరీ సేవర్\" వల్ల డార్క్ థీమ్ ఆన్ అవుతుంది, బ్యాక్‌గ్రౌండ్ యాక్టివిటీ పరిమితం అవుతుంది, అలాగే నోటిఫికేషన్‌లు ఆలస్యంగా వస్తాయి."</string>
     <string name="battery_low_intro" msgid="5148725009653088790">"బ్యాటరీ సేవర్ ముదురు రంగు రూపాన్ని ఆన్ చేస్తుంది, బ్యాక్‌గ్రౌండ్ యాక్టివిటీని పరిమితం చేస్తుంది, అలాగే నోటిఫికేషన్‌లను ఆలస్యంగా పంపిస్తుంది."</string>
     <string name="battery_low_percent_format" msgid="4276661262843170964">"<xliff:g id="PERCENTAGE">%s</xliff:g> మిగిలి ఉంది"</string>
     <string name="invalid_charger_title" msgid="938685362320735167">"USB ద్వారా ఛార్జ్ చేయలేరు"</string>
@@ -369,7 +369,7 @@
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"సూర్యోదయం వరకు"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"<xliff:g id="TIME">%s</xliff:g>కి"</string>
     <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"<xliff:g id="TIME">%s</xliff:g> వరకు"</string>
-    <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"ముదురు రంగు రూపం"</string>
+    <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"డార్క్ థీమ్‌"</string>
     <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"బ్యాటరీ సేవర్"</string>
     <string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"సూర్యాస్తమయానికి"</string>
     <string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"సూర్యోదయం వరకు"</string>
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"ఆన్‌లో ఉంది"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"ఆన్ • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"ఆఫ్‌లో ఉంది"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"సెటప్ చేయండి"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"సెట్టింగ్‌లలో మేనేజ్ చేయండి"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{మోడ్స్ ఏవీ యాక్టివ్‌గా లేవు}=1{{mode} యాక్టివ్‌గా ఉంది}other{# మోడ్స్ యాక్టివ్‌గా ఉన్నాయి}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"మీరు పేర్కొనే అలారాలు, రిమైండర్‌లు, ఈవెంట్‌లు మరియు కాలర్‌ల నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్‌లతో మీకు అంతరాయం కలగదు. మీరు ఇప్పటికీ సంగీతం, వీడియోలు మరియు గేమ్‌లతో సహా మీరు ప్లే చేయడానికి ఎంచుకున్నవి ఏవైనా వింటారు."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"సంభాషణలు"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"అన్ని నిశ్శబ్ద నోటిఫికేషన్‌లను క్లియర్ చేస్తుంది"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"అంతరాయం కలిగించవద్దు ద్వారా నోటిఫికేషన్‌లు పాజ్ చేయబడ్డాయి"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{నోటిఫికేషన్‌లు ఏవీ లేవు}=1{{mode} ద్వారా నోటిఫికేషన్‌లు పాజ్ చేయబడ్డాయి}=2{నోటిఫికేషన్‌లు, {mode}, మరో ఒక మోడ్ ద్వారా పాజ్ చేయబడ్డాయి}other{నోటిఫికేషన్‌లు, {mode}, మరో # మోడ్‌ల ద్వారా పాజ్ చేయబడ్డాయి}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"ఇప్పుడే ప్రారంభించండి"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"నోటిఫికేషన్‌లు లేవు"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"కొత్త నోటిఫికేషన్‌లు ఏవీ లేవు"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"డెమో మోడ్ చూపు"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ఈథర్‌నెట్"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"అలారం"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> ఆన్‌లో ఉంది"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"మీ ఫోన్‌తో మరింత వేగంగా, సురక్షితంగా కొనుగోళ్లు చేయడానికి సెటప్ చేయండి"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"అన్నింటినీ చూపు"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"కుదించండి చిహ్నం"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"విస్తరించండి చిహ్నం"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"లేదా"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"లాగే హ్యాండిల్"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"మీ కీబోర్డ్ ఉపయోగించి నావిగేట్ చేయండి"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"కీబోర్డ్ షార్ట్‌కట్‌ల గురించి తెలుసుకోండి"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"మీ టచ్‌ప్యాడ్‌ని ఉపయోగించి నావిగేట్ చేయండి"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"టచ్‌ప్యాడ్ సంజ్ఞ గురించి తెలుసుకోండి"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"మీ కీబోర్డ్, టచ్‌ప్యాడ్‌ను ఉపయోగించి నావిగేట్ చేయండి"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"టచ్‌ప్యాడ్ సంజ్ఞలు, కీబోర్డ్ షార్ట్‌కట్‌లు, అలాగే మరిన్నింటిని గురించి తెలుసుకోండి"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"వెనుకకు పంపే సంజ్ఞ"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"హోమ్‌కు పంపే సంజ్ఞ"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ఇటీవలి యాప్‌లను చూడండి"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"పూర్తయింది"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"వెనుకకు"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"వెనుకకు వెళ్లడానికి, టచ్‌ప్యాడ్‌లో ఎక్కడైనా మూడు వేళ్లను ఉపయోగించి ఎడమ లేదా కుడి వైపునకు స్వైప్ చేయండి.\n\nమీరు దీని కోసం + ESC కీబోర్డ్ షార్ట్‌కట్ యాక్షన్‌ను కూడా ఉపయోగించవచ్చు."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"చక్కగా పూర్తి చేశారు!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"తిరిగి వెనుకకు వెళ్ళడానికి ఉపయోగించే సంజ్ఞకు సంబంధించిన ట్యుటోరియల్‌ను మీరు పూర్తి చేశారు."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"మొదటి ట్యాబ్‌కు వెళ్లండి"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"ఏ సమయంలోనైనా మీ మొదటి స్క్రీన్‌కు వెళ్లడానికి, మీ స్క్రీన్ కింది నుండి మూడు వేళ్లతో పైకి స్వైప్ చేయండి."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"సూపర్!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"మొదటి స్క్రీన్‌కు వెళ్ళడానికి ఉపయోగించే సంజ్ఞకు సంబంధించిన ట్యుటోరియల్‌ను మీరు పూర్తి చేశారు."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"ఇటీవలి యాప్‌లను చూడండి"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"మీ టచ్‌ప్యాడ్‌లో మూడు వేళ్లను ఉపయోగించి పైకి స్వైప్ చేసి, హోల్డ్ చేయండి."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"పనితీరు అద్భుతంగా ఉంది!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"మీరు ఇటీవలి యాప్‌ల వీక్షణ సంజ్ఞను పూర్తి చేశారు."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"యాక్షన్ కీ"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"మీ యాప్‌లను యాక్సెస్ చేయడానికి, మీ కీబోర్డ్‌లో యాక్షన్ కీని నొక్కండి."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"అభినందనలు!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"మీరు \'యాక్షన్ కీ\' సంజ్ఞను పూర్తి చేశారు.\n\nAction + / నొక్కితే, మీకు అందుబాటులో ఉండే షార్ట్‌కట్‌లన్నీ కనిపిస్తాయి."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"కీబోర్డ్ బ్యాక్‌లైట్"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dలో %1$dవ స్థాయి"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"హోమ్ కంట్రోల్స్"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"మీ యాప్‌లన్నింటినీ చూడటానికి, మీ కీబోర్డ్‌లో యాక్షన్ కీని నొక్కండి"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"దాచిపెట్టినది"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"చూడటానికి అన్‌లాక్ చేయండి"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"సందర్భోచిత విద్య"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"వెనుకకు వెళ్లడానికి మీ టచ్‌ప్యాడ్‌ను ఉపయోగించండి"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"మూడు వేళ్లతో ఎడమ / కుడి వైపునకు స్వైప్ చేయండి. మరిన్ని సంజ్ఞల గురించి తెలుసుకోవడానికి ట్యాప్ చేయండి."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"హోమ్‌కు వెళ్లడానికి మీ టచ్‌ప్యాడ్‌ను ఉపయోగించండి"</string>
@@ -1444,7 +1459,7 @@
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"యాప్‌లన్నింటినీ చూడటానికి మీ కీబోర్డ్‌ను ఉపయోగించండి"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"ఏ సమయంలోనైనా యాక్షన్ కీని నొక్కండి. మరిన్ని సంజ్ఞల గురించి తెలుసుకోవడానికి ట్యాప్ చేయండి."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"కాంతిని మరింత డిమ్ చేసే ఫీచర్ ఇప్పుడు బ్రైట్‌నెస్ స్లయిడర్‌లో ఒక భాగం"</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"మీరు ఇప్పుడు బ్రైట్‌నెస్ స్థాయిని మరింత తగ్గించడం ద్వారా స్క్రీన్‌ను కాంతిని మరింత డిమ్ చేయవచ్చు.\n\nఈ ఫీచర్ ఇప్పుడు బ్రైట్‌నెస్ స్లయిడర్‌లో భాగం కాబట్టి, కాంతిని మరింత డిమ్ చేసే షార్ట్‌కట్‌లు తీసివేయబడుతున్నాయి."</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"మీరు ఇప్పుడు బ్రైట్‌నెస్ స్థాయిని మరింత తగ్గించడం ద్వారా స్క్రీన్‌ కాంతిని మరింత డిమ్ చేయవచ్చు.\n\nఈ ఫీచర్ ఇప్పుడు బ్రైట్‌నెస్ స్లయిడర్‌లో భాగం కాబట్టి, కాంతిని మరింత డిమ్ చేసే షార్ట్‌కట్‌లు తీసివేయబడుతున్నాయి."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"కాంతిని మరింత డిమ్ చేసే షార్ట్‌కట్‌లను తీసివేయండి"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"కాంతిని మరింత డిమ్ చేసే షార్ట్‌కట్‌లు తీసివేయబడ్డాయి"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"కనెక్టివిటీ"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 6bfc9f9..06c2661 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"เปิด"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"เปิด • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"ปิด"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"ตั้งค่า"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"จัดการในการตั้งค่า"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{ไม่มีโหมดที่ใช้งานอยู่}=1{ใช้งานอยู่ {mode} โหมด}other{ใช้งานอยู่ # โหมด}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"คุณจะไม่ถูกรบกวนจากเสียงและการสั่น ยกเว้นเสียงนาฬิกาปลุก การช่วยเตือน กิจกรรม และผู้โทรที่ระบุไว้ คุณจะยังคงได้ยินสิ่งที่คุณเลือกเล่น เช่น เพลง วิดีโอ และเกม"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"การสนทนา"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ล้างการแจ้งเตือนแบบไม่มีเสียงทั้งหมด"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"หยุดการแจ้งเตือนชั่วคราวโดย \"ห้ามรบกวน\""</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{ไม่มีการแจ้งเตือน}=1{หยุดการแจ้งเตือนชั่วคราวโดย {mode}}=2{หยุดการแจ้งเตือนชั่วคราวโดย {mode} และโหมดอื่นอีก 1 โหมด}other{หยุดการแจ้งเตือนชั่วคราวโดย {mode} และโหมดอื่นอีก # โหมด}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"เริ่มเลย"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"ไม่มีการแจ้งเตือน"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"ไม่มีการแจ้งเตือนใหม่"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"แสดงโหมดสาธิต"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"อีเทอร์เน็ต"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"การปลุก"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> เปิดอยู่"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"ตั้งค่าเพื่อซื้อสินค้าและบริการด้วยโทรศัพท์ได้อย่างรวดเร็วและปลอดภัยยิ่งขึ้น"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"แสดงทั้งหมด"</string>
@@ -965,7 +968,7 @@
     <string name="tuner_menu" msgid="363690665924769420">"เมนู"</string>
     <string name="tuner_app" msgid="6949280415826686972">"แอป <xliff:g id="APP">%1$s</xliff:g>"</string>
     <string name="notification_channel_alerts" msgid="3385787053375150046">"การแจ้งเตือน"</string>
-    <string name="notification_channel_battery" msgid="9219995638046695106">"แบตเตอรี"</string>
+    <string name="notification_channel_battery" msgid="9219995638046695106">"แบตเตอรี่"</string>
     <string name="notification_channel_screenshot" msgid="7665814998932211997">"ภาพหน้าจอ"</string>
     <string name="notification_channel_instant" msgid="7556135423486752680">"Instant Apps"</string>
     <string name="notification_channel_setup" msgid="7660580986090760350">"ตั้งค่า"</string>
@@ -1403,26 +1406,38 @@
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ดูข้อมูลเกี่ยวกับท่าทางสัมผัสของทัชแพด"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"ไปยังส่วนต่างๆ โดยใช้แป้นพิมพ์และทัชแพด"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ดูข้อมูลเกี่ยวกับท่าทางสัมผัสของทัชแพด แป้นพิมพ์ลัด และอื่นๆ"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"ท่าทางสัมผัสสำหรับย้อนกลับ"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ท่าทางสัมผัสสำหรับหน้าแรก"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ดูแอปล่าสุด"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"เสร็จสิ้น"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ย้อนกลับ"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"หากต้องการย้อนกลับ ให้ใช้ 3 นิ้วปัดไปทางซ้ายหรือขวาที่ใดก็ได้บนทัชแพด\n\nหรือใช้การดำเนินการแป้นพิมพ์ลัด + ESC ได้เช่นเดียวกัน"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"เก่งมาก"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"คุณทำท่าทางสัมผัสเพื่อย้อนกลับเสร็จแล้ว"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ไปที่หน้าแรก"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"ใช้ 3 นิ้วปัดขึ้นจากด้านล่างของหน้าจอเพื่อไปที่หน้าจอหลักได้ทุกเมื่อ"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"ดีมาก"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"คุณทำท่าทางสัมผัสเพื่อไปที่หน้าแรกเสร็จแล้ว"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"ดูแอปล่าสุด"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"ใช้ 3 นิ้วปัดขึ้นแล้วค้างไว้บนทัชแพด"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"เยี่ยมมาก"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"คุณทำท่าทางสัมผัสเพื่อดูแอปล่าสุดสำเร็จแล้ว"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"ปุ่มดำเนินการ"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"หากต้องการเข้าถึงแอป ให้กดปุ่มดำเนินการบนแป้นพิมพ์"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"ยินดีด้วย"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"คุณทำท่าทางสัมผัสสำหรับปุ่มดำเนินการเสร็จแล้ว\n\nการดำเนินการ + / จะแสดงแป้นพิมพ์ลัดทั้งหมดที่คุณมี"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ไฟแบ็กไลต์ของแป้นพิมพ์"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"ระดับที่ %1$d จาก %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"ระบบควบคุมอุปกรณ์สมาร์ทโฮม"</string>
@@ -1434,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"หากต้องการดูแอปทั้งหมด ให้กดปุ่มดำเนินการบนแป้นพิมพ์"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"ปกปิดไว้"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"ปลดล็อกเพื่อดู"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"การศึกษาตามบริบท"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"ใช้ทัชแพดเพื่อย้อนกลับ"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"ใช้ 3 นิ้วปัดไปทางซ้ายหรือขวา แตะเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับท่าทางสัมผัสต่างๆ"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"ใช้ทัชแพดเพื่อไปยังหน้าแรก"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 4f3819b..8241b72 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Naka-on"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Naka-on • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Naka-off"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"I-set up"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Pamahalaan sa mga setting"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Walang aktibong mode}=1{Aktibo ang {mode}}one{# mode ang aktibo}other{# na mode ang aktibo}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Hindi ka maiistorbo ng mga tunog at pag-vibrate, maliban mula sa mga alarm, paalala, event, at tumatawag na tutukuyin mo. Maririnig mo pa rin ang kahit na anong piliin mong i-play kabilang ang mga musika, video, at laro."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Mga Pag-uusap"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"I-clear ang lahat ng silent na notification"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Mga notification na na-pause ng Huwag Istorbohin"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Walang notification}=1{Na-pause ng {mode} ang mga notification}=2{Na-pause ng {mode} at isa pang mode ang mga notification}one{Na-pause ng {mode} at # pang mode ang mga notification}other{Na-pause ng {mode} at # pang mode ang mga notification}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Magsimula ngayon"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Walang mga notification"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Walang bagong notification"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Ipakita ang demo mode"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"Naka-on ang <xliff:g id="MODENAME">%1$s</xliff:g>"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"I-set up para makapagsagawa ng mas mabibilis, mas secure na pagbili gamit ang telepono mo"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Ipakita lahat"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"I-collapse ang icon"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"I-expand ang icon"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Handle sa pag-drag"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Mag-navigate gamit ang iyong keyboard"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Matuto ng mga keyboard shortcut"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Mag-navigate gamit ang iyong touchpad"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Matuto ng mga galaw sa touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Mag-navigate gamit ang iyong keyboard at touchpad"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Matuto ng mga galaw sa touchpad, keyboard shortcut, at higit pa"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Galaw para bumalik"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Galaw para sa Home"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Tingnan ang mga kamakailang app"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Tapos na"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Bumalik"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Para bumalik, mag-swipe pakaliwa o pakanan gamit ang tatlong daliri saanman sa touchpad.\n\nPuwede mo ring gamitin ang keyboard shortcut na Action + ESC para dito."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Magaling!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Nakumpleto mo na ang galaw para bumalik."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Pumunta sa home"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Para pumunta sa iyong home screen anumang oras, mag-swipe pataas gamit ang tatlong daliri mula sa ibaba ng screen. mo."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Magaling!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Nakumpleto mo na ang galaw para pumunta sa home."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Tingnan ang mga kamakailang app"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Mag-swipe pataas at i-hold gamit ang tatlong daliri sa iyong touchpad."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Magaling!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Nakumpleto mo ang galaw sa pag-view ng mga kamakailang app."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Action key"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Para ma-access ang iyong mga app, pindutin ang action key sa keyboard mo."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Binabati kita!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Nakumpleto mo na ang galaw ng action key.\n\nIpinapakita ng Action + / ang lahat ng shortcut na available sa iyo."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Backlight ng keyboard"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d sa %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Mga Home Control"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Para tingnan ang lahat ng iyong app, pindutin ang action key sa keyboard mo"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Na-redact"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"I-unlock para tingnan"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Edukasyon ayon sa konteksto"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Gamitin ang iyong touchpad para bumalik"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Mag-swipe pakaliwa o pakanan gamit ang tatlong daliri. I-tap para matuto pa tungkol sa mga galaw."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Gamitin ang touchpad mo para pumunta sa home"</string>
@@ -1444,7 +1459,7 @@
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"Gamitin ang iyong keyboard para tingnan ang lahat ng app"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Pindutin ang action key kahit kailan. I-tap para matuto pa tungkol sa mga galaw."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Bahagi na ng slider ng liwanag ang extra dim"</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Puwede mo nang gawing extra dim ang screen sa pamamagitan ng pagbababa pa sa antas ng liwanag .\n\nDahil bahagi na ang feature na ito ng slider ng liwanag, aalisin na ang mga shortcut sa extra dim."</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Puwede mo nang gawing extra dim ang screen sa pamamagitan ng pagbababa pa ng antas ng liwanag .\n\nDahil bahagi na ang feature na ito ng slider ng liwanag, aalisin na ang mga shortcut sa extra dim."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Alisin ang mga shortcut sa extra dim"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Inalis ang mga shortcut sa extra dim"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Pagkakonekta"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 19fad73..966c6ef 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Açık"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Açık • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Kapalı"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Ayarla"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Ayarlarda yönet"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Etkin mod yok}=1{{mode} etkin}other{# mod etkin}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Alarmlar, hatırlatıcılar, etkinlikler ve sizin seçtiğiniz kişilerden gelen çağrılar dışında hiçbir ses ve titreşimle rahatsız edilmeyeceksiniz. O sırada çaldığınız müzik, seyrettiğiniz video ya da oynadığınız oyunların sesini duymaya devam edeceksiniz."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Görüşmeler"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Sessiz bildirimlerin tümünü temizle"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bildirimler, Rahatsız Etmeyin özelliği tarafından duraklatıldı"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Bildirim yok}=1{Bildirimler {mode} tarafından duraklatıldı}=2{Bildirimler, {mode} ve bir diğer mod tarafından duraklatıldı}other{Bildirimler, {mode} ve # diğer mod tarafından duraklatıldı}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Şimdi başlat"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Bildirim yok"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Yeni bildirim yok"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Demo modunu göster"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Cüzdan"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Telefonunuzla daha hızlı ve güvenli satın alma işlemleri gerçekleştirmek için gerekli ayarları yapın"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Tümünü göster"</string>
@@ -1179,10 +1183,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"%%<xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Hoparlörler ve Ekranlar"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Önerilen Cihazlar"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Giriş"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Çıkış"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Medyayı başka bir cihaza taşımak için paylaşılan oturumunuzu durdurun"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Durdur"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Yayınlamanın işleyiş şekli"</string>
@@ -1398,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Daralt simgesi"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Genişlet simgesi"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"veya"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Sürükleme tutamacı"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Klavyenizi kullanarak gezinin"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Klavye kısayollarını öğrenin"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Dokunmatik alanınızı kullanarak gezinin"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Dokunmatik alan hareketlerini öğrenin"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Klavyenizi ve dokunmatik alanınızı kullanarak gezinin"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Dokunmatik alan hareketlerini, klavye kısayollarını ve daha fazlasını öğrenin"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Geri hareketi"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Ana sayfa hareketi"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Son uygulamaları görüntüle"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Bitti"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Geri dön"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Geri dönmek için dokunmatik alanın herhangi bir yerinde üç parmağınızla sola veya sağa kaydırın.\n\nDilerseniz işlem düğmesi + Esc klavye kısayolunu kullanarak da geri dönebilirsiniz."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Tebrikler!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Geri dön hareketini tamamladınız."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ana sayfaya gidin"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"İstediğiniz zaman ana ekrana gitmek için üç parmağınızla ekranınızın altından yukarı doğru kaydırın."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Güzel!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Ana ekrana git hareketini tamamladınız."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Son uygulamaları görüntüle"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Dokunmatik alanda üç parmağınızla yukarı doğru kaydırıp basılı tutun."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Tebrikler!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Son uygulamaları görüntüleme hareketini tamamladınız."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Eylem tuşu"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Uygulamalarınıza erişmek için klavyenizdeki eylem tuşuna basın."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Tebrikler!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Eylem tuşu hareketini tamamladınız.\n\nKullanabileceğiniz tüm kısayolları görmek için eylem + / tuşuna basın."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klavye aydınlatması"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Seviye %1$d / %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Ev Kontrolleri"</string>
@@ -1437,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Tüm uygulamalarınızı görüntülemek için klavyenizdeki eylem tuşuna basın"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Çıkartıldı"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Görüntülemek için kilidi açın"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Bağlama dayalı eğitim"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Geri dönmek için dokunmatik alanınızı kullanın"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Üç parmağınızla sola veya sağa kaydırın. Daha fazla hareket öğrenmek için dokunun."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Ana sayfaya gitmek için dokunmatik alanınızı kullanın"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 453ce4a..c146021 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Увімкнено"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Увімк. • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Вимкнено"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Налаштувати"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Керувати в налаштуваннях"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Немає активних режимів}=1{Активовано режим \"{mode}\"}one{Активовано # режим}few{Активовано # режими}many{Активовано # режимів}other{Активовано # режиму}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Ви отримуватиме звукові та вібросигнали лише для вибраних будильників, нагадувань, подій і абонентів. Однак ви чутимете все, що захочете відтворити, зокрема музику, відео й ігри."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Розмови"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Очистити всі беззвучні сповіщення"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Режим \"Не турбувати\" призупинив сповіщення"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Немає сповіщень}=1{Режим \"{mode}\" призупинив надсилання сповіщень}=2{\"{mode}\" і ще один режим призупинили надсилання сповіщень}one{\"{mode}\" і ще # режим призупинили надсилання сповіщень}few{\"{mode}\" і ще # режими призупинили надсилання сповіщень}many{\"{mode}\" і ще # режимів призупинили надсилання сповіщень}other{\"{mode}\" і ще # режиму призупинили надсилання сповіщень}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Почати зараз"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Сповіщень немає"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Немає нових сповіщень"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Показати демонстраційний режим"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Будильник"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"Гаманець"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Швидше й безпечніше сплачуйте за покупки за допомогою телефона"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Показати все"</string>
@@ -1179,10 +1183,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Колонки й екрани"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Пропоновані пристрої"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Введення"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Виведення"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Зупиніть сеанс спільного доступу, щоб перенести медіаконтент на інший пристрій"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Зупинити"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Як працює трансляція"</string>
@@ -1398,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Значок згортання"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок розгортання"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"або"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Маркер переміщення"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Навігація за допомогою клавіатури"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Комбінації клавіш: докладніше"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Навігація за допомогою сенсорної панелі"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Жести для сенсорної панелі: докладніше"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Навігація за допомогою клавіатури й сенсорної панелі"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Жести для сенсорної панелі, комбінації клавіш тощо: докладніше"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Жест \"Назад\""</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Жест переходу на головний екран"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Переглянути нещодавні додатки"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Щоб перейти назад, проведіть трьома пальцями вліво або вправо по сенсорній панелі.\n\nТакож можна скористатися комбінацією \"клавіша дії\" + ESC."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Чудово!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Ви виконали жест \"Назад\"."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Перейти на головний екран"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Щоб будь-коли перейти на головний екран, проведіть трьома пальцями вгору від нижнього краю екрана."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Чудово!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Ви виконали жест переходу на головний екран."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Переглянути нещодавні додатки"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Проведіть трьома пальцями вгору й утримуйте їх на сенсорній панелі."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Чудово!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Ви виконали жест для перегляду нещодавно відкритих додатків."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Клавіша дії"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Щоб переглянути додатки, натисніть клавішу дії на клавіатурі."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Вітаємо!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Ви виконали жест клавіші дії.\n\nНатисніть клавішу дії + /, щоб переглянути всі доступні комбінації клавіш."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Підсвічування клавіатури"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Рівень %1$d з %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Автоматизація дому"</string>
@@ -1437,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Щоб переглянути всі додатки, натисніть клавішу дії на клавіатурі"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Замасковано"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Розблокуйте, щоб переглянути"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Контекстне навчання"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Щоб повернутися, використовуйте сенсорну панель"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Проведіть трьома пальцями вліво чи вправо. Натисніть, щоб дізнатися про інші жести."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Щоб перейти на головний екран, використовуйте сенсорну панель"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 9865c8d..a0e9347 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"آن ہے"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"آن ہے • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"آف ہے"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"سیٹ اپ کریں"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"ترتیبات میں نظم کریں"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{کوئی فعال موڈ نہیں ہے}=1{{mode} فعال ہے}other{# موڈز فعال ہیں}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"الارمز، یاددہانیوں، ایونٹس اور آپ کے متعین کردہ کالرز کے علاوہ، آپ آوازوں اور وائبریشنز سے ڈسٹرب نہیں ہوں گے۔ موسیقی، ویڈیوز اور گیمز سمیت آپ ابھی بھی ہر وہ چیز سنیں گے جسے چلانے کا آپ انتخاب کرتے ہیں۔"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"گفتگوئیں"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"سبھی خاموش اطلاعات کو صاف کریں"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ڈسٹرب نہ کریں\' کے ذریعے اطلاعات کو موقوف کیا گیا"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{کوئی اطلاع نہیں ہے}=1{{mode} کی طرف سے اطلاعات کو روک دیا گیا ہے}=2{{mode} اور ایک دوسرے موڈ کے ذریعہ اطلاعات کو روک دیا گیا ہے}other{{mode} اور # دیگر طریقوں کے ذریعے اطلاعات کو روک دیا گیا ہے}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"ابھی شروع کریں"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"کوئی اطلاعات نہیں ہیں"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"کوئی نئی اطلاعات نہیں"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"ڈیمو موڈ دکھائیں"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ایتھرنیٹ"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"الارم"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> آن ہے"</string>
     <string name="wallet_title" msgid="5369767670735827105">"والٹ"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"اپنے فون سے تیز تر مزید محفوظ خریداریاں کرنے کے لیے، سیٹ اپ مکمل کریں"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"سبھی دکھائیں"</string>
@@ -1396,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"آئیکن سکیڑیں"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"آئیکن پھیلائیں"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"یا"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"گھسیٹنے کا ہینڈل"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"اپنے کی بورڈ کا استعمال کر کے نیویگیٹ کریں"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"کی بورڈ شارٹ کٹس جانیں"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"اپنے ٹچ پیڈ کا استعمال کر کے نیویگیٹ کریں"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"ٹچ پیڈ کے اشارے کو جانیں"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"اپنے کی بورڈ اور ٹچ پیڈ کا استعمال کر کے نیویگیٹ کریں"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"ٹچ پیڈ کے اشارے، کی بورڈ شارٹ کٹس اور مزید جانیں"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"پیچھے جانے کا اشارہ"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"ہوم کا اشارہ"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"حالیہ ایپس دیکھیں"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ہو گیا"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"واپس جائیں"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"‏واپس جانے کے لیے، ٹچ پیڈ پر کہیں بھی تین انگلیوں کی مدد سے دائیں یا بائیں سوائپ کریں۔\n\nآپ اس کیلئے کی بورڈ شارٹ کٹ ایکشن + Esc کا بھی استعمال کر سکتے ہیں۔"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"بہترین!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"آپ نے واپس جائیں اشارے کو مکمل کر لیا۔"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ہوم پر جائیں"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"کسی بھی وقت اپنی ہوم اسکرین پر جانے کے لیے، تین انگلیوں کی مدد سے اپنی اسکرین کے نیچے سے اوپر کی طرف سوائپ کریں۔"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"عمدہ!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"آپ نے ہوم پر جانے کا اشارہ مکمل کر لیا۔"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"حالیہ ایپس دیکھیں"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"اپنے ٹچ پیڈ پر تین انگلیوں کا استعمال کرتے ہوئے اوپر کی طرف سوائپ کریں اور دبائے رکھیں۔"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"بہترین!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"آپ نے حالیہ ایپس کا اشارہ مکمل کر لیا ہے۔"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"ایکشن کلید"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"اپنی ایپس تک رسائی حاصل کرنے کے لیے، اپنے کی بورڈ پر ایکشن کلید کو دبائیں۔"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"مبارکباد!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"آپ نے ایکشن کلید کا اشارہ مکمل کر لیا۔\n\nایکشن + / دبانے سے آپ کے دستیاب تمام شارٹ کٹس دکھائی دیں گے۔"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"کی بورڈ بیک لائٹ"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"‏%2$d میں سے ‎%1$d کا لیول"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"ہوم کنٹرولز"</string>
@@ -1435,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"اپنی سبھی ایپس دیکھنے کے لیے، اپنے کی بورڈ پر ایکشن کلید دبائیں"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"چھپانے کیلئے تبدیل کردہ"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"دیکھنے کے لیے غیر مقفل کریں"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"سیاق و سباق کی تعلیم"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"واپس جانے کے لیے اپنے ٹچ پیڈ کا استعمال کریں"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"تین انگلیوں سے دائیں یا بائیں طرف سوائپ کریں۔ مزید اشارے جاننے کے لیے تھپتھپائیں۔"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"ہوم پر جانے کے لیے اپنے ٹچ پیڈ کا استعمال کریں"</string>
@@ -1446,7 +1461,7 @@
     <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"اضافی دھندلا اب چمک سلائیڈر کا حصہ ہے"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"آپ چمکیلے پن لیول کو مزید کم کر کے اپنی اسکرین کو اضافی دھندلی بنا سکتے ہیں۔\n\nچونکہ یہ خصوصیت اب چمکیلے پن کے سلائیڈر کا حصہ ہے، اس لیے اضافی دھندلا شارٹ کٹس کو ہٹایا جا رہا ہے۔"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"اضافی دھندلا شارٹ کٹس کو ہٹائیں"</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"اضافی دھندلا شارٹ کٹس ہٹا دیے گئے"</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"اضافی دھندلے شارٹ کٹس ہٹا دیے گئے"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"کنیکٹویٹی"</string>
     <string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"ایکسیسبیلٹی"</string>
     <string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"یوٹیلیٹیز"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index cd4cc0d..0594313 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Yoniq"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Yoniq • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Yoqilmagan"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Sozlash"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Sozlamalarda boshqarish"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{0 ta rejim faol}=1{{mode} faol}other{# ta rejim faol}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Turli ovoz va tebranishlar endi sizni bezovta qilmaydi. Biroq, signallar, eslatmalar, tadbirlar haqidagi bildirishnomalar va siz tanlagan abonentlardan kelgan chaqiruvlar bundan mustasno. Lekin, ijro etiladigan barcha narsalar, jumladan, musiqa, video va o‘yinlar ovozi eshitiladi."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Suhbatlar"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Barcha sokin bildirishnomalarni tozalash"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bezovta qilinmasin rejimida bildirishnomalar pauza qilinadi"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Bildirishnomalar yoʻq}=1{{mode} rejimi bildirishnomalarni pauza qilgan}=2{{mode} va yana bitta boshqa rejim bildirishnomalarni pauza qilgan}other{{mode} va # ta boshqa rejim bildirishnomalarni pauza qilgan}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Boshlash"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Bildirishnomalar yo‘q"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Yangi bildirishoma yoʻq"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Demo rejimni ko‘rsatish"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Signal"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> yoniq"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Telefonda tezroq va xavfsizroq xarid qilish uchun sozlang"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Hammasi"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Karnaylar va displeylar"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Taklif qilingan qurilmalar"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Kiritish qurilmasi"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Chiqarish qurilmasi"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Mediani boshqa qurilmaga koʻchirish uchun umumiy seansingizni toʻxtating"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Toʻxtatish"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Translatsiya qanday ishlaydi"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Yigʻish belgisi"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Yoyish belgisi"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"yoki"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Surish dastagi"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Klaviatura yordamida kezing"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Tezkor tugmalar haqida"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Sensorli panel yordamida kezing"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Sensorli panel ishoralari haqida"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Klaviatura va sensorli panel yordamida kezing"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Sensorli panel ishoralari, tezkor tugmalar va boshqalar haqida"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Orqaga qaytish ishorasi"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Asosiy ekran ishorasi"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Oxirgi ilovalarni koʻrish"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Tayyor"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Orqaga qaytish"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Ortga qaytish uchun sensorli panelda uchta barmoqni chapga yoki oʻngga suring.\n\nBuning uchun Action + ESC tezkor tugmalaridan ham foydalanishingiz mumkin."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Barakalla!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Ortga qaytish ishorasi darsini tamomladingiz."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Boshiga"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Istalgan vaqtda bosh ekranga oʻtish uchun ekranning pastidan uchta barmoq bilan tepaga suring."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Yaxshi!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Bosh ekranni ochish ishorasi darsini tamomladingiz."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Oxirgi ilovalarni koʻrish"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Sensorli panelda uchta barmoq bilan tepaga surib, bosib turing."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Barakalla!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Oxirgi ilovalarni koʻrish ishorasini tugalladingiz."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Amal tugmasi"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Ilovalarga kirish uchun klaviaturadagi amal tugmasini bosing"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Tabriklaymiz!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Amal tugmasi ishorasi darsini tamomladingiz.\n\nAmal + / bosilsa, mavjud buyruqlar koʻrsatiladi."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klaviatura orqa yoritkichi"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Daraja: %1$d / %2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Uy boshqaruvi"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Barcha ishoralarni koʻrish uchun klaviaturadagi amal tugmasini bosing"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Chiqarildi"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Koʻrish uchun qulfdan chiqaring"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Kontekstual taʼlim"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Sensorli panel orqali orqaga qaytish"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Uchta barmoq bilan chapga yoki oʻngga suring. Boshqa ishoralar bilan tanishish uchun bosing."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Sensorli panel orqali bosh ekranga qaytish"</string>
@@ -1447,8 +1460,8 @@
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"Amal tugmasini istalganda bosing. Boshqa ishoralar bilan tanishish uchun bosing."</string>
     <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"Juda xira endi yorqinlik slayderida joylashgan"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"Endi yorqinlik darajasini yanada pasaytirish orqali ekranni yanada xiralashtirishingiz mumkin.\n\nBu funksiya yorqinlik slayderiga kiritilgani uchun \"juda xira\" buyruqlari olib tashlanmoqda."</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"Juda xira buyruqlarini olib tashlash"</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"Juda xira buyruqlari olib tashlandi"</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"“Juda xira” buyruqlarini olib tashlash"</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"“Juda xira” buyruqlari olib tashlandi"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"Aloqa"</string>
     <string name="qs_edit_mode_category_accessibility" msgid="7969091385071475922">"Qulayliklar"</string>
     <string name="qs_edit_mode_category_utilities" msgid="8123080090108420095">"Vositalar"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 28a6900..c38f99f 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Đang bật"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Bật • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Đang tắt"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Thiết lập"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Quản lý trong phần cài đặt"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Không có chế độ nào đang hoạt động}=1{{mode} đang hoạt động}other{# chế độ đang hoạt động}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Bạn sẽ không bị làm phiền bởi âm thanh và tiếng rung, ngoại trừ báo thức, lời nhắc, sự kiện và người gọi mà bạn chỉ định. Bạn sẽ vẫn nghe thấy mọi thứ bạn chọn phát, bao gồm nhạc, video và trò chơi."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Cuộc trò chuyện"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Xóa tất cả thông báo im lặng"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Chế độ Không làm phiền đã tạm dừng thông báo"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Không có thông báo}=1{{mode} đã tạm dừng thông báo}=2{{mode} và một chế độ khác đã tạm dừng thông báo}other{{mode} và # chế độ khác đã tạm dừng thông báo}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Bắt đầu ngay"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Không có thông báo nào"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Không có thông báo mới"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Hiển thị chế độ trình diễn"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"Chuông báo"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g> đang bật"</string>
     <string name="wallet_title" msgid="5369767670735827105">"Ví"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Thiết lập để mua hàng nhanh hơn và an toàn hơn bằng điện thoại"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Hiện tất cả"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Loa và màn hình"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Thiết bị được đề xuất"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Đầu vào"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Đầu ra"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Dừng phiên chia sẻ của bạn để chuyển nội dung nghe nhìn sang thiết bị khác"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Dừng"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cách tính năng truyền hoạt động"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Biểu tượng Thu gọn"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Biểu tượng Mở rộng"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"hoặc"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Nút kéo"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Di chuyển bằng bàn phím"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Tìm hiểu về phím tắt"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Di chuyển bằng bàn di chuột"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Tìm hiểu về cử chỉ trên bàn di chuột"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Di chuyển bằng bàn phím và bàn di chuột"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Tìm hiểu về cử chỉ trên bàn di chuột, phím tắt và nhiều mục khác"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Cử chỉ quay lại"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Cử chỉ chuyển đến màn hình chính"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Xem các ứng dụng gần đây"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Xong"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Quay lại"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Để quay lại, hãy dùng 3 ngón tay vuốt sang trái hoặc sang phải ở vị trí bất kỳ trên bàn di chuột.\n\nBạn cũng có thể dùng phím tắt Hành động + ESC cho thao tác này."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Tuyệt vời!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Bạn đã thực hiện xong cử chỉ quay lại."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Chuyển đến màn hình chính"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Để chuyển đến màn hình chính bất cứ lúc nào, hãy dùng 3 ngón tay vuốt lên từ cuối màn hình lên."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Tốt lắm!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Bạn đã thực hiện xong cử chỉ chuyển đến màn hình chính."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Xem các ứng dụng gần đây"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Dùng 3 ngón tay vuốt lên và giữ trên bàn di chuột."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Tuyệt vời!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Bạn đã hoàn tất cử chỉ xem ứng dụng gần đây."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Phím hành động"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Để truy cập vào các ứng dụng của bạn, hãy nhấn phím hành động trên bàn phím."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Xin chúc mừng!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Bạn đã thực hiện xong cử chỉ nhấn phím hành động.\n\nThao tác + / sẽ hiển thị tất cả phím tắt bạn hiện có."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Đèn nền bàn phím"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Độ sáng %1$d/%2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Điều khiển nhà"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Để xem tất cả ứng dụng của bạn, hãy nhấn phím hành động trên bàn phím"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Bị loại bỏ"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Mở khoá để xem"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Hướng dẫn theo bối cảnh"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Dùng bàn di chuột để quay lại"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Dùng 3 ngón tay vuốt sang trái hoặc sang phải. Hãy nhấn để tìm hiểu các cử chỉ khác."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Dùng bàn di chuột để chuyển đến màn hình chính"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 267f392..60e6c4f 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -98,7 +98,7 @@
     <string name="screenshot_left_boundary_pct" msgid="8502323556112287469">"左侧边界百分之 <xliff:g id="PERCENT">%1$d</xliff:g>"</string>
     <string name="screenshot_right_boundary_pct" msgid="1201150713021779321">"右侧边界百分之 <xliff:g id="PERCENT">%1$d</xliff:g>"</string>
     <string name="screenshot_work_profile_notification" msgid="203041724052970693">"已保存到工作资料名下的 <xliff:g id="APP">%1$s</xliff:g>中"</string>
-    <string name="screenshot_private_profile_notification" msgid="1704440899154243171">"已保存在私密个人资料中的<xliff:g id="APP">%1$s</xliff:g>内"</string>
+    <string name="screenshot_private_profile_notification" msgid="1704440899154243171">"已保存在私密资料中的“<xliff:g id="APP">%1$s</xliff:g>”内"</string>
     <string name="screenshot_default_files_app_name" msgid="8721579578575161912">"文件"</string>
     <string name="screenshot_detected_template" msgid="7940376642921719915">"<xliff:g id="APPNAME">%1$s</xliff:g> 检测到此屏幕截图。"</string>
     <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> 及其他打开的应用检测到此屏幕截图。"</string>
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"已开启"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"已开启 • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"已关闭"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"设置"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"在设置中管理"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{未启用任何模式}=1{已启用“{mode}”模式}other{已启用 # 个模式}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"您将不会受到声音和振动的打扰(闹钟、提醒、活动和所指定来电者的相关提示音除外)。您依然可以听到您选择播放的任何内容(包括音乐、视频和游戏)的相关音效。"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"对话"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有静音通知"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"勿扰模式暂停的通知"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{无通知}=1{{mode}暂停了通知}=2{{mode}和另外 1 种模式暂停了通知}other{{mode}和另外 # 种模式暂停了通知}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"立即开始"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"没有通知"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"没有新通知"</string>
@@ -620,7 +622,7 @@
     <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"您的个人应用已通过“<xliff:g id="VPN_APP">%1$s</xliff:g>”连接到互联网。您的 VPN 提供商可以查看您的网络活动,包括电子邮件和浏览数据。"</string>
     <string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string>
     <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"打开 VPN 设置"</string>
-    <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"此设备由您的家长管理。您的家长可以查看和管理相关信息,例如您使用的应用、您的位置信息和设备使用时间。"</string>
+    <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"此设备由您的家长管理。您的家长可以查看和管理相关信息,例如您使用的应用、您的位置信息和屏幕使用时间。"</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"由 TrustAgent 保持解锁状态"</string>
     <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"尝试验证身份的次数过多,设备已锁定"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"显示演示模式"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"以太网"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"闹钟"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"“<xliff:g id="MODENAME">%1$s</xliff:g>”处于启用状态"</string>
     <string name="wallet_title" msgid="5369767670735827105">"钱包"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"开始设置,享受更加快捷安全的手机购物体验"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"全部显示"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"音箱和显示屏"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"建议的设备"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"输入"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"输出"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"停止共享的会话,即可将媒体移到其他设备"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"停止"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"广播的运作方式"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收起图标"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展开图标"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"拖动手柄"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"使用键盘导航"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"了解键盘快捷键"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"使用触控板导航"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"了解触控板手势"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"使用键盘和触控板进行导航"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"了解触控板手势、键盘快捷键等"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"返回手势"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"主屏幕手势"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"查看最近用过的应用"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完成"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"返回"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"如要返回,请使用三根手指在触控板上的任意位置左滑或右滑。\n\n您也可以使用键盘快捷操作键 + ESC 键进行返回。"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"太棒了!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"您完成了“返回”手势教程。"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"前往主屏幕"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"若要随时进入主屏幕,请用三根手指从屏幕的底部向上滑动。"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"很好!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"您完成了“前往主屏幕”手势教程。"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"查看最近用过的应用"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"在触控板上用三根手指向上滑动并按住。"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"太棒了!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"您已完成“查看最近用过的应用”的手势教程。"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"快捷操作按键"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"如要访问您的应用,请按下键盘上的快捷操作按键。"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"恭喜!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"您完成了“快捷操作按键”手势教程。\n\n按下快捷操作按键 + / 可显示所有可用快捷键。"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"键盘背光"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"第 %1$d 级,共 %2$d 级"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"家居控制"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"如要查看所有应用,请按下键盘上的快捷操作按键"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"已隐去"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"解锁即可查看"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"内容相关指导"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"使用触控板返回"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"用三根手指向左或向右滑动。点按即可了解更多手势。"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"使用触控板前往主屏幕"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
index 0446a1b..7748251b 100644
--- a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
@@ -128,8 +128,8 @@
   </string-array>
   <string-array name="tile_states_record_issue">
     <item msgid="1727196795383575383">"不可用"</item>
-    <item msgid="9061144428113385092">"已停用"</item>
-    <item msgid="2984256114867200368">"已启用"</item>
+    <item msgid="9061144428113385092">"已关闭"</item>
+    <item msgid="2984256114867200368">"已开启"</item>
   </string-array>
   <string-array name="tile_states_reverse">
     <item msgid="3574611556622963971">"不可用"</item>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index c08835a..a838da4 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"開啟"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"開 • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"關閉"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"設定"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"在「設定」中管理"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{沒有啟用模式}=1{已啟用{mode}}other{已啟用 # 個模式}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"你不會受到聲音和震動騷擾 (鬧鐘、提醒、活動和你指定的來電者鈴聲除外)。當你選擇播放音樂、影片和遊戲等,仍可以聽到該內容的聲音。"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有靜音通知"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"「請勿騷擾」模式已將通知暫停"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{沒有通知}=1{{mode}已暫停通知}=2{{mode}和另外一個模式已暫停通知}other{{mode}和另外 # 個模式已暫停通知}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"立即開始"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"沒有通知"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"沒有新通知"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"顯示示範模式"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"以太網"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"鬧鐘"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g>開咗"</string>
     <string name="wallet_title" msgid="5369767670735827105">"錢包"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"完成設定後即可透過手機更快速安全地購物"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"顯示全部"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"喇叭和螢幕"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"建議的裝置"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"輸入"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"輸出"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"停止共享工作階段以移動媒體至其他裝置"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"停止"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"廣播運作方式"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收合圖示"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展開圖示"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"拖曳控點"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"使用鍵盤導覽"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"瞭解鍵盤快速鍵"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"使用觸控板導覽"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"瞭解觸控板手勢"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"使用鍵盤和觸控板導覽"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"瞭解觸控板手勢、鍵盤快速鍵等等"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"返去手勢"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"主畫面手勢"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"查看最近使用的應用程式"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完成"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"返回"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"用三隻手指在觸控板上任何一處向左或向右滑動即可返回。\n\n你也可使用鍵盤快速鍵 Action 鍵 + Esc 鍵執行此操作。"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"太好了!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"你已完成「返回」手勢的教學課程。"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"返回主畫面"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"只要用三隻手指從螢幕底部向上滑動,隨時可以返回主畫面。"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"做得好!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"你已完成「返回主畫面」手勢的教學課程。"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"查看最近使用的應用程式"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"用三隻手指在觸控板向上滑動並按住。"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"做得好!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"你已完成「查看最近使用的應用程式」手勢的教學課程。"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"快捷操作鍵"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"如要存取應用程式,請在鍵盤上按下快捷操作鍵。"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"恭喜!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"你已完成「快捷操作鍵」手勢的教學課程。\n\n按下動作 + / 鍵即可顯示所有可使用的快速鍵。"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"鍵盤背光"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"第 %1$d 級,共 %2$d 級"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"智能家居"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"如要查看所有應用程式,請在鍵盤上按下快捷操作鍵"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"已剔除"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"解鎖即可查看"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"內容教學"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"使用觸控板返回"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"用三隻手指向左或向右滑動。輕按即可瞭解更多手勢。"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"使用觸控板返回主畫面"</string>
@@ -1446,7 +1459,7 @@
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"使用鍵盤查看所有應用程式"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"隨時按下快捷操作鍵。輕按即可瞭解更多手勢。"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"亮度滑桿現已加入超暗功能"</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"而家只要將亮度校得越低,螢幕就會更加暗。\n\n由於亮度滑桿而家加入咗呢個功能,所以系統將會移除超暗功能捷徑。"</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"現在,只要調校亮度就能將螢幕變得超暗。\n\n由於超暗功能已加到亮度滑桿,其功能捷徑將被移除。"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"移除超暗功能捷徑"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"超暗功能捷徑已移除"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"裝置連接"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 787698c..158b68a 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"開啟"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"已開啟 • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"關閉"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"設定"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"在「設定」中管理"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{未啟用任何模式}=1{已啟用 {mode} 個模式}other{已啟用 # 個模式}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"裝置不會發出音效或震動造成干擾,但是會保留與鬧鐘、提醒、活動和指定來電者有關的設定。如果你選擇播放音樂、影片和遊戲等內容,還是可以聽見相關音訊。"</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有靜音通知"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"「零打擾」模式已將通知設為暫停"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{沒有通知}=1{「{mode}」模式已將通知設為暫停}=2{「{mode}」和另一個模式已將通知設為暫停}other{「{mode}」和另外 # 個模式已將通知設為暫停}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"立即開始"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"沒有通知"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"沒有新通知"</string>
@@ -704,6 +706,7 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"顯示展示模式"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"乙太網路"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"鬧鐘"</string>
+    <string name="active_mode_content_description" msgid="1627555562186515927">"<xliff:g id="MODENAME">%1$s</xliff:g>已開啟"</string>
     <string name="wallet_title" msgid="5369767670735827105">"錢包"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"完成相關設定之後,就能以更快速安全的方式透過手機消費"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"顯示全部"</string>
@@ -1179,10 +1182,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"喇叭和螢幕"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"建議的裝置"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"輸入"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"輸出"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"停止共用的工作階段,即可將媒體移至其他裝置"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"停止"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"廣播功能的運作方式"</string>
@@ -1398,34 +1399,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收合圖示"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展開圖示"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"拖曳控點"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"使用鍵盤操作"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"學習鍵盤快速鍵"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"使用觸控板操作"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"學習觸控板手勢"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"使用鍵盤和觸控板操作"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"學習觸控板手勢、鍵盤快速鍵等"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"返回手勢"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"主畫面手勢"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"查看最近使用的應用程式"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完成"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"返回"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"如要返回,請在觸控板的任何位置上用三指向左或向右滑動。\n\n使用快捷操作鍵 + ESC 鍵 (鍵盤快速鍵) 也可以返回。"</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"太棒了!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"你已完成「返回」手勢的教學課程。"</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"返回主畫面"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"用 3 指從螢幕底部向上滑動,就能隨時返回主畫面。"</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"太棒了!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"你已完成「返回主畫面」手勢的教學課程。"</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"查看最近使用的應用程式"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"在觸控板上用三指向上滑動並按住。"</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"太棒了!"</string>
-    <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"你已完成「查看最近使用的應用程式」手勢的教學課程。"</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"快捷操作鍵"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"如要存取應用程式,請按下鍵盤上的快捷操作鍵。"</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"恭喜!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"你已完成「快捷操作鍵」手勢的教學課程。\n\n按下快捷操作鍵 + / 鍵,就能顯示所有可用的快速鍵。"</string>
+    <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"你已完成「查看最近使用的應用程式」手勢教學課程。"</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"鍵盤背光"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"第 %1$d 級,共 %2$d 級"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"居家控制"</string>
@@ -1437,6 +1449,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"如要查看所有應用程式,請按下鍵盤上的快捷操作鍵"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"已遮蓋"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"解鎖即可查看"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"內容教學"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"使用觸控板返回"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"用三指向左或向右滑動。輕觸即可進一步瞭解手勢。"</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"使用觸控板前往主畫面"</string>
@@ -1446,7 +1459,7 @@
     <string name="all_apps_edu_notification_title" msgid="372262997265569063">"使用鍵盤查看所有應用程式"</string>
     <string name="all_apps_edu_notification_content" msgid="3255070575694025585">"你隨時可以按下快捷操作鍵。輕觸即可進一步瞭解手勢。"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_title" msgid="910988771011857460">"「超暗」已併入亮度滑桿"</string>
-    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"現在只要將亮度調得更低,螢幕就會變得更暗。\n\n這項功能已併入亮度滑桿,因此系統將移除「超暗」捷徑。"</string>
+    <string name="accessibility_deprecate_extra_dim_dialog_description" msgid="4453123359258743230">"現在你可以將亮度調得比以往更低,把螢幕變得更暗。\n\n超暗功能現已併入亮度滑桿,因此系統將移除功能捷徑。"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_button" msgid="3947537827396916005">"移除「超暗」捷徑"</string>
     <string name="accessibility_deprecate_extra_dim_dialog_toast" msgid="165474092660941104">"「超暗」捷徑已移除"</string>
     <string name="qs_edit_mode_category_connectivity" msgid="4559726936546032672">"連線"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 3205b0e..a351b1b 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -440,7 +440,8 @@
     <string name="zen_mode_on" msgid="9085304934016242591">"Vuliwe"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"Vuliwe • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"Valiwe"</string>
-    <string name="zen_mode_set_up" msgid="7457957033034460064">"Setha"</string>
+    <!-- no translation found for zen_mode_set_up (8231201163894922821) -->
+    <skip />
     <string name="zen_mode_no_manual_invocation" msgid="1769975741344633672">"Phatha kumasethingi"</string>
     <string name="zen_mode_active_modes" msgid="1625850411578488856">"{count,plural, =0{Awekho amamodi asebenzayo}=1{I-{mode} iyasebenza}one{Amamodi angu-# ayasebenza}other{Amamodi angu-# ayasebenza}}"</string>
     <string name="zen_priority_introduction" msgid="3159291973383796646">"Ngeke uphazanyiswe imisindo nokudlidliza, ngaphandle kusukela kuma-alamu, izikhumbuzi, imicimbi, nabafonayo obacacisayo. Usazozwa noma yini okhetha ukuyidlala okufaka umculo, amavidiyo, namageyimu."</string>
@@ -573,6 +574,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Izingxoxo"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Sula zonke izaziso ezithulile"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Izaziso zimiswe okwesikhashana ukungaphazamisi"</string>
+    <string name="modes_suppressing_shade_text" msgid="6037581130837903239">"{count,plural,offset:1 =0{Azikho izaziso}=1{Izaziso zimiswe okwesikhashana yi-{mode}}=2{Izaziso zimiswe okwesikhashana yi-{mode} nelinye imodi elilodwa}one{Izaziso zimiswe okwesikhashana yi-{mode} kanye namanye amamodi angu-#}other{Izaziso zimiswe okwesikhashana yi-{mode} kanye namanye amamodi angu-#}}"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"Qala manje"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Azikho izaziso"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"Azikho izaziso ezintsha"</string>
@@ -704,6 +706,8 @@
     <string name="show_demo_mode" msgid="3677956462273059726">"Bonisa imodi yedemo"</string>
     <string name="status_bar_ethernet" msgid="5690979758988647484">"I-Ethernet"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"I-alamu"</string>
+    <!-- no translation found for active_mode_content_description (1627555562186515927) -->
+    <skip />
     <string name="wallet_title" msgid="5369767670735827105">"I-wallet"</string>
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Lungela ukuthenga ngokushesha, ngokuphepha ngefoni yakho"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Bonisa konke"</string>
@@ -1179,10 +1183,8 @@
     <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
     <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"Izipikha Neziboniso"</string>
     <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"Amadivayisi Aphakanyisiwe"</string>
-    <!-- no translation found for media_input_group_title (2057057473860783021) -->
-    <skip />
-    <!-- no translation found for media_output_group_title (6789001895863332576) -->
-    <skip />
+    <string name="media_input_group_title" msgid="2057057473860783021">"Okufakwayo"</string>
+    <string name="media_output_group_title" msgid="6789001895863332576">"Umphumela"</string>
     <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"Misa iseshini yakho eyabiwe ukuze uhambise imidiya kwenye idivayisi"</string>
     <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"Misa"</string>
     <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Indlela ukusakaza okusebenza ngayo"</string>
@@ -1398,34 +1400,45 @@
     <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Goqa isithonjana"</string>
     <string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Nweba isithonjana"</string>
     <string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"noma"</string>
-    <!-- no translation found for shortcut_helper_content_description_drag_handle (5092426406009848110) -->
-    <skip />
+    <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Hudula isibambi"</string>
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Funa usebenzisa ikhibhodi yakho"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Funda izinqamuleli zamakhibhodi"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Funa usebenzisa iphedi yokuthinta"</string>
     <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Funda ukunyakaza kwephedi lokuthinta"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Funa usebenzisa ikhibhodi yakho nephedi yokuthinta"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Funda ukunyakaza kwephedi yokuthinta, izinqamuleli zamakhibhodi, nokuningi"</string>
-    <string name="touchpad_tutorial_back_gesture_button" msgid="2746834288077265946">"Ukunyakazisa umzimba kwangemuva"</string>
-    <string name="touchpad_tutorial_home_gesture_button" msgid="7640544867625955304">"Ukunyakazisa umzimba kwasekhaya"</string>
+    <!-- no translation found for touchpad_tutorial_back_gesture_button (3104716365403620315) -->
+    <skip />
+    <!-- no translation found for touchpad_tutorial_home_gesture_button (8023973153559885624) -->
+    <skip />
     <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Buka ama-app akamuva"</string>
     <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Kwenziwe"</string>
     <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Buyela emuva"</string>
-    <string name="touchpad_back_gesture_guidance" msgid="6263750214998421587">"Ukuze ubuyele emuva, swayiphela kwesokunxele noma kwesokudla usebenzisa iminwe emithathu noma yikuphi ephedini yokuthinta.\n\nUngasebenzisa nesinqamuleli sekhibhodi Isenzo + ESC kulokhu."</string>
-    <string name="touchpad_back_gesture_success_title" msgid="7240576648330612171">"Umsebenzi omuhle!"</string>
+    <!-- no translation found for touchpad_back_gesture_guidance (5352221087725906542) -->
+    <skip />
+    <!-- no translation found for touchpad_back_gesture_success_title (7370719098633023496) -->
+    <skip />
     <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Ukuqedile ukuthinta kokubuyela emuva."</string>
     <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Iya ekhasini lokuqala"</string>
-    <string name="touchpad_home_gesture_guidance" msgid="3043931356096731966">"Ukuze uye esikrinini sakho sasekhaya nganoma isiphi isikhathi, swayipha uye phezulu ngeminwe emithathu usuka phansi esikrinini sakho."</string>
-    <string name="touchpad_home_gesture_success_title" msgid="3778407003948209795">"Kuhle!"</string>
-    <string name="touchpad_home_gesture_success_body" msgid="2404031094918807067">"Ukuqedile ukuthinta kokuya ekhaya."</string>
+    <!-- no translation found for touchpad_home_gesture_guidance (4178219118381915899) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_title (3648264553645798470) -->
+    <skip />
+    <!-- no translation found for touchpad_home_gesture_success_body (2590690589194027059) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Buka ama-app akamuva"</string>
-    <string name="touchpad_recent_apps_gesture_guidance" msgid="6012057247259983871">"Swayiphela phezulu bese ubamba usebenzisa iminwe emithathu kuphedi yokuthinta."</string>
+    <!-- no translation found for touchpad_recent_apps_gesture_guidance (6304446013842271822) -->
+    <skip />
     <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Umsebenzi omuhle!"</string>
     <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Uqedele ukubuka ukuthinta kwama-app akamuva."</string>
-    <string name="tutorial_action_key_title" msgid="2659466586996495447">"Inkinobho yokufinyelela"</string>
-    <string name="tutorial_action_key_guidance" msgid="5718948664616999196">"Ukuze ufinyelele ama-app wakho, cindezela inkinobho yokufinyelela kukhibhodi yakho."</string>
-    <string name="tutorial_action_key_success_title" msgid="466467860120112933">"Halala!"</string>
-    <string name="tutorial_action_key_success_body" msgid="7201991081652850430">"Uqedele ukuthinta inkinobho yokufinyelela.\n\nIsenzo +/ sibonisa zonke izinqamuleli onazo."</string>
+    <!-- no translation found for tutorial_action_key_title (8172535792469008169) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_guidance (5040613427202799294) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_title (2371827347071979571) -->
+    <skip />
+    <!-- no translation found for tutorial_action_key_success_body (1688986269491357832) -->
+    <skip />
     <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Ilambu lekhibhodi"</string>
     <string name="keyboard_backlight_value" msgid="7336398765584393538">"Ileveli %1$d ka-%2$d"</string>
     <string name="home_controls_dream_label" msgid="6567105701292324257">"Izilawuli Zasekhaya"</string>
@@ -1437,6 +1450,7 @@
     <string name="all_apps_edu_toast_content" msgid="8807496014667211562">"Ukuze ubuke wonke ama-app wakho, cindezela inkinobho yokufinyelela kukhibhodi yakho"</string>
     <string name="redacted_notification_single_line_title" msgid="212019960919261670">"Kwenziwe iredact"</string>
     <string name="redacted_notification_single_line_text" msgid="8684166405005242945">"Vula ukuze ubuke"</string>
+    <string name="contextual_education_dialog_title" msgid="4630392552837487324">"Imfundo yokuqukethwe"</string>
     <string name="back_edu_notification_title" msgid="5624780717751357278">"Sebenzisa iphedi yokuthinta ukuze ubuyele emuva"</string>
     <string name="back_edu_notification_content" msgid="2497557451540954068">"Swayiphela kwesokunxele noma kwesokudla usebenzisa iminwe emithathu. Thepha ukuze ufunde kabanzi ngokunyakazisa umzimba."</string>
     <string name="home_edu_notification_title" msgid="6097902076909654045">"Sebenzisa iphedi yokuthinta ukuya ekhaya"</string>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index e94248d..1727a5f 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -2047,4 +2047,7 @@
     <!-- SliceView icon size -->
     <dimen name="abc_slice_big_pic_min_height">64dp</dimen>
     <dimen name="abc_slice_big_pic_max_height">64dp</dimen>
+
+    <dimen name="contextual_edu_dialog_bottom_margin">80dp</dimen>
+    <dimen name="contextual_edu_dialog_elevation">2dp</dimen>
 </resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 24b6579..96a85d7 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1120,7 +1120,7 @@
     <string name="zen_mode_off">Off</string>
 
     <!-- Modes: label for a mode that needs to be set up [CHAR LIMIT=35] -->
-    <string name="zen_mode_set_up">Set up</string>
+    <string name="zen_mode_set_up">Not set</string>
 
     <!-- Modes: label for a mode that cannot be manually turned on [CHAR LIMIT=35] -->
     <string name="zen_mode_no_manual_invocation">Manage in settings</string>
@@ -1473,6 +1473,16 @@
     <!-- The text to show in the notifications shade when dnd is suppressing notifications. [CHAR LIMIT=100] -->
     <string name="dnd_suppressing_shade_text">Notifications paused by Do Not Disturb</string>
 
+    <!-- The text to show in the notifications shade when a mode is suppressing notifications. [CHAR LIMIT=100] -->
+    <string name="modes_suppressing_shade_text">
+        {count, plural, offset:1
+            =0 {No notifications}
+            =1 {Notifications paused by {mode}}
+            =2 {Notifications paused by {mode} and one other mode}
+            other {Notifications paused by {mode} and # other modes}
+        }
+    </string>
+
     <!-- Media projection permission dialog action text. [CHAR LIMIT=60] -->
     <string name="media_projection_action_text">Start now</string>
 
@@ -1817,6 +1827,12 @@
     <!-- Name of the alarm status bar icon. -->
     <string name="status_bar_alarm">Alarm</string>
 
+    <!-- Format string for the content description of the icon that indicates that a Mode is on.
+       For example, if the mode name is Bedtime, this will be "Bedtime is on". This content
+       description will be associated to the mode icon in status bar, smartspace, and everyone else
+       where it might be displayed without text. [CHAR LIMIT=NONE] -->
+    <string name="active_mode_content_description"><xliff:g id="modeName" example="Do Not Disturb">%1$s</xliff:g> is on</string>
+
     <!-- Wallet strings -->
     <!-- Wallet empty state, title [CHAR LIMIT=32] -->
     <string name="wallet_title">Wallet</string>
@@ -3736,9 +3752,9 @@
 
     <!-- TOUCHPAD TUTORIAL-->
     <!-- Label for button opening tutorial for back gesture on touchpad [CHAR LIMIT=NONE] -->
-    <string name="touchpad_tutorial_back_gesture_button">Back gesture</string>
+    <string name="touchpad_tutorial_back_gesture_button">Go back</string>
     <!-- Label for button opening tutorial for back gesture on touchpad [CHAR LIMIT=NONE] -->
-    <string name="touchpad_tutorial_home_gesture_button">Home gesture</string>
+    <string name="touchpad_tutorial_home_gesture_button">Go home</string>
     <!-- Label for button opening tutorial for "view recent apps" gesture on touchpad [CHAR LIMIT=NONE] -->
     <string name="touchpad_tutorial_recent_apps_gesture_button">View recent apps</string>
     <!-- Label for button finishing touchpad tutorial [CHAR LIMIT=NONE] -->
@@ -3747,26 +3763,25 @@
     <!-- Touchpad back gesture action name in tutorial [CHAR LIMIT=NONE] -->
     <string name="touchpad_back_gesture_action_title">Go back</string>
     <!-- Touchpad back gesture guidance in gestures tutorial [CHAR LIMIT=NONE] -->
-    <string name="touchpad_back_gesture_guidance">To go back, swipe left or right using three fingers anywhere on the touchpad.\n\nYou can also use the keyboard shortcut
-Action + ESC for this.</string>
+    <string name="touchpad_back_gesture_guidance">Swipe left or right using three fingers on your touchpad</string>
     <!-- Screen title after back gesture was done successfully [CHAR LIMIT=NONE] -->
-    <string name="touchpad_back_gesture_success_title">Great job!</string>
+    <string name="touchpad_back_gesture_success_title">Nice!</string>
     <!-- Text shown to the user after they complete back gesture tutorial [CHAR LIMIT=NONE] -->
     <string name="touchpad_back_gesture_success_body">You completed the go back gesture.</string>
     <!-- HOME GESTURE -->
     <!-- Touchpad home gesture action name in tutorial [CHAR LIMIT=NONE] -->
     <string name="touchpad_home_gesture_action_title">Go home</string>
     <!-- Touchpad home gesture guidance in gestures tutorial [CHAR LIMIT=NONE] -->
-    <string name="touchpad_home_gesture_guidance">To go to your home screen at any time, swipe up with three fingers from the bottom of your screen.</string>
+    <string name="touchpad_home_gesture_guidance">Swipe up with three fingers on your touchpad</string>
     <!-- Screen title after home gesture was done successfully [CHAR LIMIT=NONE] -->
-    <string name="touchpad_home_gesture_success_title">Nice!</string>
+    <string name="touchpad_home_gesture_success_title">Great job!</string>
     <!-- Text shown to the user after they complete home gesture tutorial [CHAR LIMIT=NONE] -->
-    <string name="touchpad_home_gesture_success_body">You completed the go home gesture.</string>
+    <string name="touchpad_home_gesture_success_body">You completed the go home gesture</string>
     <!-- RECENT APPS GESTURE -->
     <!-- Touchpad recent apps gesture action name in tutorial [CHAR LIMIT=NONE] -->
     <string name="touchpad_recent_apps_gesture_action_title">View recent apps</string>
     <!-- Touchpad recent apps gesture guidance in gestures tutorial [CHAR LIMIT=NONE] -->
-    <string name="touchpad_recent_apps_gesture_guidance">Swipe up and hold using three fingers on your touchpad.</string>
+    <string name="touchpad_recent_apps_gesture_guidance">Swipe up and hold using three fingers on your touchpad</string>
     <!-- Screen title after recent apps gesture was done successfully [CHAR LIMIT=NONE] -->
     <string name="touchpad_recent_apps_gesture_success_title">Great job!</string>
     <!-- Text shown to the user after they complete recent apps gesture tutorial [CHAR LIMIT=NONE] -->
@@ -3774,13 +3789,13 @@
 
     <!-- KEYBOARD TUTORIAL-->
     <!-- Action key tutorial title [CHAR LIMIT=NONE] -->
-    <string name="tutorial_action_key_title">Action key</string>
+    <string name="tutorial_action_key_title">View all apps</string>
     <!-- Action key tutorial guidance[CHAR LIMIT=NONE] -->
-    <string name="tutorial_action_key_guidance">To access your apps, press the action key on your keyboard.</string>
+    <string name="tutorial_action_key_guidance">Press the action key on your keyboard</string>
     <!-- Screen title after action key pressed successfully [CHAR LIMIT=NONE] -->
-    <string name="tutorial_action_key_success_title">Congratulations!</string>
+    <string name="tutorial_action_key_success_title">Well done!</string>
     <!-- Text shown to the user after they complete action key tutorial [CHAR LIMIT=NONE] -->
-    <string name="tutorial_action_key_success_body">You completed the action key gesture.\n\nAction + / shows all the shortcuts you have available.</string>
+    <string name="tutorial_action_key_success_body">You completed the view all apps gesture</string>
 
     <!-- Content description for keyboard backlight brightness dialog [CHAR LIMIT=NONE] -->
     <string name="keyboard_backlight_dialog_title">Keyboard backlight</string>
@@ -3808,6 +3823,8 @@
     <!-- Main text of the one line view of a redacted notification -->
     <string name="redacted_notification_single_line_text">Unlock to view</string>
 
+    <!-- Content description for contextual education dialog [CHAR LIMIT=NONE] -->
+    <string name="contextual_education_dialog_title">Contextual education</string>
     <!-- Education notification title for Back [CHAR_LIMIT=100] -->
     <string name="back_edu_notification_title">Use your touchpad to go back</string>
     <!-- Education notification text for Back [CHAR_LIMIT=100] -->
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index a02c354..e1f25f9 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -540,6 +540,7 @@
     <!-- Overridden by values-television/styles.xml with tv-specific settings -->
     <style name="volume_dialog_theme" parent="Theme.SystemUI">
         <item name="android:windowIsFloating">true</item>
+        <item name="android:showWhenLocked">true</item>
     </style>
 
     <style name="Theme.SystemUI.DayNightDialog" parent="@android:style/Theme.DeviceDefault.Light.Dialog"/>
diff --git a/packages/SystemUI/schemas/com.android.systemui.communal.data.db.CommunalDatabase/4.json b/packages/SystemUI/schemas/com.android.systemui.communal.data.db.CommunalDatabase/4.json
new file mode 100644
index 0000000..c3fb8d4
--- /dev/null
+++ b/packages/SystemUI/schemas/com.android.systemui.communal.data.db.CommunalDatabase/4.json
@@ -0,0 +1,88 @@
+{
+  "formatVersion": 1,
+  "database": {
+    "version": 4,
+    "identityHash": "a49f2f7d25cf12d1baf9a3a3e6243b64",
+    "entities": [
+      {
+        "tableName": "communal_widget_table",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `widget_id` INTEGER NOT NULL, `component_name` TEXT NOT NULL, `item_id` INTEGER NOT NULL, `user_serial_number` INTEGER NOT NULL DEFAULT -1, `span_y` INTEGER NOT NULL DEFAULT 3)",
+        "fields": [
+          {
+            "fieldPath": "uid",
+            "columnName": "uid",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "widgetId",
+            "columnName": "widget_id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "componentName",
+            "columnName": "component_name",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "itemId",
+            "columnName": "item_id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "userSerialNumber",
+            "columnName": "user_serial_number",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "-1"
+          },
+          {
+            "fieldPath": "spanY",
+            "columnName": "span_y",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "3"
+          }
+        ],
+        "primaryKey": {
+          "autoGenerate": true,
+          "columnNames": [
+            "uid"
+          ]
+        }
+      },
+      {
+        "tableName": "communal_item_rank_table",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `rank` INTEGER NOT NULL DEFAULT 0)",
+        "fields": [
+          {
+            "fieldPath": "uid",
+            "columnName": "uid",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "rank",
+            "columnName": "rank",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          }
+        ],
+        "primaryKey": {
+          "autoGenerate": true,
+          "columnNames": [
+            "uid"
+          ]
+        }
+      }
+    ],
+    "setupQueries": [
+      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a49f2f7d25cf12d1baf9a3a3e6243b64')"
+    ]
+  }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/shared/Android.bp b/packages/SystemUI/shared/Android.bp
index 8f55961..0f1da50 100644
--- a/packages/SystemUI/shared/Android.bp
+++ b/packages/SystemUI/shared/Android.bp
@@ -70,6 +70,7 @@
         "jsr330",
         "//frameworks/libs/systemui:com_android_systemui_shared_flags_lib",
         "//frameworks/libs/systemui:msdl",
+        "//frameworks/libs/systemui:view_capture",
     ],
     resource_dirs: [
         "res",
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java
index f358ba2..4db6ab6 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java
@@ -16,6 +16,9 @@
 
 package com.android.systemui.shared.rotation;
 
+import static com.android.app.viewcapture.ViewCaptureFactory.getViewCaptureAwareWindowManagerInstance;
+import static com.android.systemui.Flags.enableViewCaptureTracing;
+
 import android.annotation.DimenRes;
 import android.annotation.IdRes;
 import android.annotation.LayoutRes;
@@ -30,7 +33,6 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.WindowManager;
 import android.view.WindowManager.LayoutParams;
 import android.view.animation.AccelerateDecelerateInterpolator;
 import android.widget.FrameLayout;
@@ -38,6 +40,7 @@
 import androidx.annotation.BoolRes;
 import androidx.core.view.OneShotPreDrawListener;
 
+import com.android.app.viewcapture.ViewCaptureAwareWindowManager;
 import com.android.systemui.shared.rotation.FloatingRotationButtonPositionCalculator.Position;
 
 /**
@@ -47,7 +50,7 @@
 
     private static final int MARGIN_ANIMATION_DURATION_MILLIS = 300;
 
-    private final WindowManager mWindowManager;
+    private final ViewCaptureAwareWindowManager mWindowManager;
     private final ViewGroup mKeyButtonContainer;
     private final FloatingRotationButtonView mKeyButtonView;
 
@@ -88,7 +91,8 @@
             @DimenRes int taskbarBottomMargin, @DimenRes int buttonDiameter,
             @DimenRes int rippleMaxWidth, @BoolRes int floatingRotationBtnPositionLeftResource) {
         mContext = context;
-        mWindowManager = mContext.getSystemService(WindowManager.class);
+        mWindowManager = getViewCaptureAwareWindowManagerInstance(mContext,
+                enableViewCaptureTracing());
         mKeyButtonContainer = (ViewGroup) LayoutInflater.from(mContext).inflate(layout, null);
         mKeyButtonView = mKeyButtonContainer.findViewById(keyButtonId);
         mKeyButtonView.setVisibility(View.VISIBLE);
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java
index 78cd02f..ab61190 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java
@@ -347,7 +347,12 @@
         }
         // Disable back gesture on the hub, but not when the shade is showing.
         if ((sysuiStateFlags & SYSUI_STATE_COMMUNAL_HUB_SHOWING) != 0) {
-            return (sysuiStateFlags & SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE) == 0;
+            // Use QS expanded signal as the notification panel is always considered visible
+            // expanded when on the lock screen and when opening hub over lock screen. This does
+            // mean that back gesture is disabled when opening shade over hub while in portrait
+            // mode, since QS is not expanded.
+            // TODO(b/370108274): allow back gesture on shade over hub in portrait
+            return (sysuiStateFlags & SYSUI_STATE_QUICK_SETTINGS_EXPANDED) == 0;
         }
         if ((sysuiStateFlags & SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY) != 0) {
             sysuiStateFlags &= ~SYSUI_STATE_NAV_BAR_HIDDEN;
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index f05cbf4..2d27f1c0 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -1067,6 +1067,8 @@
 
         @Override
         public void onDestroy() {
+            mUserSwitcherController.removeUserSwitchCallback(mUserSwitchCallback);
+
             ConstraintSet constraintSet = new ConstraintSet();
             constraintSet.clone(mView);
             constraintSet.clear(mUserSwitcherViewGroup.getId());
@@ -1075,6 +1077,8 @@
 
             mView.removeView(mUserSwitcherViewGroup);
             mView.removeView(mUserSwitcher);
+            mUserSwitcher = null;
+            mUserSwitcherViewGroup = null;
         }
 
         private void findLargeUserIcon(int userId, Consumer<Drawable> consumer) {
@@ -1102,6 +1106,10 @@
                 return;
             }
 
+            if (mUserSwitcherViewGroup == null) {
+                return;
+            }
+
             mUserSwitcherViewGroup.setAlpha(0f);
             ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
             int yTrans = mView.getResources().getDimensionPixelSize(R.dimen.pin_view_trans_y_entry);
@@ -1110,14 +1118,18 @@
             animator.addListener(new AnimatorListenerAdapter() {
                 @Override
                 public void onAnimationEnd(Animator animation) {
-                    mUserSwitcherViewGroup.setAlpha(1f);
-                    mUserSwitcherViewGroup.setTranslationY(0f);
+                    if (mUserSwitcherViewGroup != null) {
+                        mUserSwitcherViewGroup.setAlpha(1f);
+                        mUserSwitcherViewGroup.setTranslationY(0f);
+                    }
                 }
             });
             animator.addUpdateListener(animation -> {
-                float value = (float) animation.getAnimatedValue();
-                mUserSwitcherViewGroup.setAlpha(value);
-                mUserSwitcherViewGroup.setTranslationY(yTrans - yTrans * value);
+                if (mUserSwitcherViewGroup != null) {
+                    float value = (float) animation.getAnimatedValue();
+                    mUserSwitcherViewGroup.setAlpha(value);
+                    mUserSwitcherViewGroup.setTranslationY(yTrans - yTrans * value);
+                }
             });
             animator.start();
         }
@@ -1148,6 +1160,10 @@
                 Log.e(TAG, "Current user in user switcher is null.");
                 return;
             }
+            if (mUserSwitcher == null) {
+                Log.w(TAG, "User switcher is not inflated, cannot setupUserSwitcher");
+                return;
+            }
             final String currentUserName = mUserSwitcherController.getCurrentUserName();
             findLargeUserIcon(currentUser.info.id,
                     (Drawable userIcon) -> {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 22130f8..8e01e04 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -114,6 +114,7 @@
 import com.android.internal.util.LatencyTracker;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.keyguard.logging.KeyguardUpdateMonitorLogger;
+import com.android.keyguard.logging.SimLogger;
 import com.android.settingslib.Utils;
 import com.android.settingslib.WirelessUtils;
 import com.android.settingslib.fuelgauge.BatteryStatus;
@@ -285,6 +286,7 @@
     private final Context mContext;
     private final UserTracker mUserTracker;
     private final KeyguardUpdateMonitorLogger mLogger;
+    private final SimLogger mSimLogger;
     private final boolean mIsSystemUser;
     private final Provider<JavaAdapter> mJavaAdapter;
     private final Provider<SceneInteractor> mSceneInteractor;
@@ -582,14 +584,14 @@
 
     private void handleSimSubscriptionInfoChanged() {
         Assert.isMainThread();
-        mLogger.v("onSubscriptionInfoChanged()");
+        mSimLogger.v("onSubscriptionInfoChanged()");
         List<SubscriptionInfo> subscriptionInfos = getSubscriptionInfo(true /* forceReload */);
         if (!subscriptionInfos.isEmpty()) {
             for (SubscriptionInfo subInfo : subscriptionInfos) {
-                mLogger.logSubInfo(subInfo);
+                mSimLogger.logSubInfo(subInfo);
             }
         } else {
-            mLogger.v("onSubscriptionInfoChanged: list is null");
+            mSimLogger.v("onSubscriptionInfoChanged: list is null");
         }
 
         // Hack level over 9000: Because the subscription id is not yet valid when we see the
@@ -612,7 +614,7 @@
         while (iter.hasNext()) {
             Map.Entry<Integer, SimData> simData = iter.next();
             if (!activeSubIds.contains(simData.getKey())) {
-                mLogger.logInvalidSubId(simData.getKey());
+                mSimLogger.logInvalidSubId(simData.getKey());
                 iter.remove();
 
                 SimData data = simData.getValue();
@@ -1700,7 +1702,7 @@
                     }
                     return;
                 }
-                mLogger.logSimStateFromIntent(action,
+                mSimLogger.logSimStateFromIntent(action,
                         intent.getStringExtra(Intent.EXTRA_SIM_STATE),
                         args.slotId,
                         args.subId);
@@ -1720,7 +1722,7 @@
                 ServiceState serviceState = ServiceState.newFromBundle(intent.getExtras());
                 int subId = intent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX,
                         SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-                mLogger.logServiceStateIntent(action, serviceState, subId);
+                mSimLogger.logServiceStateIntent(action, serviceState, subId);
                 mHandler.sendMessage(
                         mHandler.obtainMessage(MSG_SERVICE_STATE_CHANGE, subId, 0, serviceState));
             } else if (TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED.equals(action)) {
@@ -2154,6 +2156,7 @@
             LatencyTracker latencyTracker,
             ActiveUnlockConfig activeUnlockConfiguration,
             KeyguardUpdateMonitorLogger logger,
+            SimLogger simLogger,
             UiEventLogger uiEventLogger,
             // This has to be a provider because SessionTracker depends on KeyguardUpdateMonitor :(
             Provider<SessionTracker> sessionTrackerProvider,
@@ -2196,6 +2199,7 @@
         mSensorPrivacyManager = sensorPrivacyManager;
         mActiveUnlockConfig = activeUnlockConfiguration;
         mLogger = logger;
+        mSimLogger = simLogger;
         mUiEventLogger = uiEventLogger;
         mSessionTrackerProvider = sessionTrackerProvider;
         mTrustManager = trustManager;
@@ -3369,36 +3373,39 @@
     }
 
     /**
+     * Removes all valid subscription info from the map for the given slotId.
+     */
+    private void invalidateSlot(int slotId) {
+        Iterator<Map.Entry<Integer, SimData>> iter = mSimDatas.entrySet().iterator();
+        while (iter.hasNext()) {
+            SimData data = iter.next().getValue();
+            if (data.slotId == slotId && SubscriptionManager.isValidSubscriptionId(data.subId)) {
+                mSimLogger.logInvalidSubId(data.subId);
+                iter.remove();
+            }
+        }
+    }
+
+    /**
      * Handle {@link #MSG_SIM_STATE_CHANGE}
      */
     @VisibleForTesting
     void handleSimStateChange(int subId, int slotId, int state) {
         Assert.isMainThread();
-        mLogger.logSimState(subId, slotId, state);
+        mSimLogger.logSimState(subId, slotId, state);
 
-        boolean becameAbsent = false;
+        boolean becameAbsent = ABSENT_SIM_STATE_LIST.contains(state);
         if (!SubscriptionManager.isValidSubscriptionId(subId)) {
-            mLogger.w("invalid subId in handleSimStateChange()");
+            mSimLogger.w("invalid subId in handleSimStateChange()");
             /* Only handle No SIM(ABSENT) and Card Error(CARD_IO_ERROR) due to
              * handleServiceStateChange() handle other case */
-            if (state == TelephonyManager.SIM_STATE_ABSENT) {
-                updateTelephonyCapable(true);
-                // Even though the subscription is not valid anymore, we need to notify that the
-                // SIM card was removed so we can update the UI.
-                becameAbsent = true;
-                for (SimData data : mSimDatas.values()) {
-                    // Set the SIM state of all SimData associated with that slot to ABSENT se we
-                    // do not move back into PIN/PUK locked and not detect the change below.
-                    if (data.slotId == slotId) {
-                        data.simState = TelephonyManager.SIM_STATE_ABSENT;
-                    }
-                }
-            } else if (state == TelephonyManager.SIM_STATE_CARD_IO_ERROR) {
+            if (state == TelephonyManager.SIM_STATE_ABSENT
+                    || state == TelephonyManager.SIM_STATE_CARD_IO_ERROR) {
                 updateTelephonyCapable(true);
             }
-        }
 
-        becameAbsent |= ABSENT_SIM_STATE_LIST.contains(state);
+            invalidateSlot(slotId);
+        }
 
         // TODO(b/327476182): Preserve SIM_STATE_CARD_IO_ERROR sims in a separate data source.
         SimData data = mSimDatas.get(subId);
@@ -3428,10 +3435,10 @@
      */
     @VisibleForTesting
     void handleServiceStateChange(int subId, ServiceState serviceState) {
-        mLogger.logServiceStateChange(subId, serviceState);
+        mSimLogger.logServiceStateChange(subId, serviceState);
 
         if (!SubscriptionManager.isValidSubscriptionId(subId)) {
-            mLogger.w("invalid subId in handleServiceStateChange()");
+            mSimLogger.w("invalid subId in handleServiceStateChange()");
             return;
         } else {
             updateTelephonyCapable(true);
@@ -3711,7 +3718,7 @@
      */
     @MainThread
     public void reportSimUnlocked(int subId) {
-        mLogger.logSimUnlocked(subId);
+        mSimLogger.logSimUnlocked(subId);
         handleSimStateChange(subId, getSlotId(subId), TelephonyManager.SIM_STATE_READY);
     }
 
@@ -3870,6 +3877,11 @@
     private boolean refreshSimState(int subId, int slotId) {
         int state = mTelephonyManager.getSimState(slotId);
         SimData data = mSimDatas.get(subId);
+
+        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+            invalidateSlot(slotId);
+        }
+
         final boolean changed;
         if (data == null) {
             data = new SimData(state, slotId, subId);
diff --git a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt
index 0b58f06..12fc3c2 100644
--- a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt
+++ b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt
@@ -20,8 +20,6 @@
 import android.hardware.biometrics.BiometricConstants.LockoutMode
 import android.hardware.biometrics.BiometricSourceType
 import android.os.PowerManager
-import android.telephony.ServiceState
-import android.telephony.SubscriptionInfo
 import android.telephony.SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX
 import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
 import android.telephony.TelephonyManager
@@ -34,7 +32,6 @@
 import com.android.systemui.log.core.LogLevel
 import com.android.systemui.log.core.LogLevel.DEBUG
 import com.android.systemui.log.core.LogLevel.ERROR
-import com.android.systemui.log.core.LogLevel.INFO
 import com.android.systemui.log.core.LogLevel.VERBOSE
 import com.android.systemui.log.core.LogLevel.WARNING
 import com.android.systemui.log.dagger.KeyguardUpdateMonitorLog
@@ -63,7 +60,7 @@
             "ActiveUnlock",
             DEBUG,
             { str1 = reason },
-            { "initiate active unlock triggerReason=$str1" }
+            { "initiate active unlock triggerReason=$str1" },
         )
     }
 
@@ -75,7 +72,7 @@
             {
                 "Skip requesting active unlock from wake reason that doesn't trigger face auth" +
                     " reason=${PowerManager.wakeReasonToString(int1)}"
-            }
+            },
         )
     }
 
@@ -92,7 +89,7 @@
             TAG,
             DEBUG,
             { bool1 = deviceProvisioned },
-            { "DEVICE_PROVISIONED state = $bool1" }
+            { "DEVICE_PROVISIONED state = $bool1" },
         )
     }
 
@@ -108,7 +105,7 @@
                 str1 = originalErrMsg
                 int1 = msgId
             },
-            { "Face error received: $str1 msgId= $int1" }
+            { "Face error received: $str1 msgId= $int1" },
         )
     }
 
@@ -117,7 +114,7 @@
             TAG,
             DEBUG,
             { int1 = authUserId },
-            { "Face authenticated for wrong user: $int1" }
+            { "Face authenticated for wrong user: $int1" },
         )
     }
 
@@ -130,7 +127,7 @@
             FP_LOG_TAG,
             DEBUG,
             { int1 = authUserId },
-            { "Fingerprint authenticated for wrong user: $int1" }
+            { "Fingerprint authenticated for wrong user: $int1" },
         )
     }
 
@@ -139,7 +136,7 @@
             FP_LOG_TAG,
             DEBUG,
             { int1 = userId },
-            { "Fingerprint disabled by DPM for userId: $int1" }
+            { "Fingerprint disabled by DPM for userId: $int1" },
         )
     }
 
@@ -148,7 +145,7 @@
             FP_LOG_TAG,
             DEBUG,
             { int1 = mode },
-            { "handleFingerprintLockoutReset: $int1" }
+            { "handleFingerprintLockoutReset: $int1" },
         )
     }
 
@@ -157,7 +154,7 @@
             FP_LOG_TAG,
             DEBUG,
             { int1 = fingerprintRunningState },
-            { "fingerprintRunningState: $int1" }
+            { "fingerprintRunningState: $int1" },
         )
     }
 
@@ -169,7 +166,7 @@
                 int1 = userId
                 bool1 = isStrongBiometric
             },
-            { "Fingerprint auth successful: userId: $int1, isStrongBiometric: $bool1" }
+            { "Fingerprint auth successful: userId: $int1, isStrongBiometric: $bool1" },
         )
     }
 
@@ -181,7 +178,7 @@
                 int1 = userId
                 bool1 = isStrongBiometric
             },
-            { "Face detected: userId: $int1, isStrongBiometric: $bool1" }
+            { "Face detected: userId: $int1, isStrongBiometric: $bool1" },
         )
     }
 
@@ -193,7 +190,7 @@
                 int1 = userId
                 bool1 = isStrongBiometric
             },
-            { "Fingerprint detected: userId: $int1, isStrongBiometric: $bool1" }
+            { "Fingerprint detected: userId: $int1, isStrongBiometric: $bool1" },
         )
     }
 
@@ -205,22 +202,13 @@
                 str1 = originalErrMsg
                 int1 = msgId
             },
-            { "Fingerprint error received: $str1 msgId= $int1" }
-        )
-    }
-
-    fun logInvalidSubId(subId: Int) {
-        logBuffer.log(
-            TAG,
-            INFO,
-            { int1 = subId },
-            { "Previously active sub id $int1 is now invalid, will remove" }
+            { "Fingerprint error received: $str1 msgId= $int1" },
         )
     }
 
     fun logPrimaryKeyguardBouncerChanged(
         primaryBouncerIsOrWillBeShowing: Boolean,
-        primaryBouncerFullyShown: Boolean
+        primaryBouncerFullyShown: Boolean,
     ) {
         logBuffer.log(
             TAG,
@@ -232,7 +220,7 @@
             {
                 "handlePrimaryBouncerChanged " +
                     "primaryBouncerIsOrWillBeShowing=$bool1 primaryBouncerFullyShown=$bool2"
-            }
+            },
         )
     }
 
@@ -249,7 +237,7 @@
                 bool2 = occluded
                 bool3 = visible
             },
-            { "keyguardShowingChanged(showing=$bool1 occluded=$bool2 visible=$bool3)" }
+            { "keyguardShowingChanged(showing=$bool1 occluded=$bool2 visible=$bool3)" },
         )
     }
 
@@ -258,7 +246,7 @@
             TAG,
             ERROR,
             { int1 = userId },
-            { "No Profile Owner or Device Owner supervision app found for User $int1" }
+            { "No Profile Owner or Device Owner supervision app found for User $int1" },
         )
     }
 
@@ -279,7 +267,7 @@
                 int2 = delay
                 str1 = "$errString"
             },
-            { "Fingerprint scheduling retry auth after $int2 ms due to($int1) -> $str1" }
+            { "Fingerprint scheduling retry auth after $int2 ms due to($int1) -> $str1" },
         )
     }
 
@@ -288,7 +276,7 @@
             TAG,
             WARNING,
             { int1 = retryCount },
-            { "Retrying fingerprint attempt: $int1" }
+            { "Retrying fingerprint attempt: $int1" },
         )
     }
 
@@ -306,32 +294,7 @@
             {
                 "sendPrimaryBouncerChanged primaryBouncerIsOrWillBeShowing=$bool1 " +
                     "primaryBouncerFullyShown=$bool2"
-            }
-        )
-    }
-
-    fun logServiceStateChange(subId: Int, serviceState: ServiceState?) {
-        logBuffer.log(
-            TAG,
-            DEBUG,
-            {
-                int1 = subId
-                str1 = "$serviceState"
             },
-            { "handleServiceStateChange(subId=$int1, serviceState=$str1)" }
-        )
-    }
-
-    fun logServiceStateIntent(action: String?, serviceState: ServiceState?, subId: Int) {
-        logBuffer.log(
-            TAG,
-            VERBOSE,
-            {
-                str1 = action
-                str2 = "$serviceState"
-                int1 = subId
-            },
-            { "action $str1 serviceState=$str2 subId=$int1" }
         )
     }
 
@@ -344,51 +307,16 @@
                 str1 = intent.getStringExtra(TelephonyManager.EXTRA_SPN)
                 str2 = intent.getStringExtra(TelephonyManager.EXTRA_PLMN)
             },
-            { "action SERVICE_PROVIDERS_UPDATED subId=$int1 spn=$str1 plmn=$str2" }
+            { "action SERVICE_PROVIDERS_UPDATED subId=$int1 spn=$str1 plmn=$str2" },
         )
     }
 
-    fun logSimState(subId: Int, slotId: Int, state: Int) {
-        logBuffer.log(
-            TAG,
-            DEBUG,
-            {
-                int1 = subId
-                int2 = slotId
-                long1 = state.toLong()
-            },
-            { "handleSimStateChange(subId=$int1, slotId=$int2, state=$long1)" }
-        )
-    }
-
-    fun logSimStateFromIntent(action: String?, extraSimState: String?, slotId: Int, subId: Int) {
-        logBuffer.log(
-            TAG,
-            VERBOSE,
-            {
-                str1 = action
-                str2 = extraSimState
-                int1 = slotId
-                int2 = subId
-            },
-            { "action $str1 state: $str2 slotId: $int1 subid: $int2" }
-        )
-    }
-
-    fun logSimUnlocked(subId: Int) {
-        logBuffer.log(TAG, VERBOSE, { int1 = subId }, { "reportSimUnlocked(subId=$int1)" })
-    }
-
-    fun logSubInfo(subInfo: SubscriptionInfo?) {
-        logBuffer.log(TAG, DEBUG, { str1 = "$subInfo" }, { "SubInfo:$str1" })
-    }
-
     fun logTimeFormatChanged(newTimeFormat: String?) {
         logBuffer.log(
             TAG,
             DEBUG,
             { str1 = newTimeFormat },
-            { "handleTimeFormatUpdate timeFormat=$str1" }
+            { "handleTimeFormatUpdate timeFormat=$str1" },
         )
     }
 
@@ -402,7 +330,7 @@
 
     fun logUnexpectedFpCancellationSignalState(
         fingerprintRunningState: Int,
-        unlockPossible: Boolean
+        unlockPossible: Boolean,
     ) {
         logBuffer.log(
             TAG,
@@ -414,7 +342,7 @@
             {
                 "Cancellation signal is not null, high chance of bug in " +
                     "fp auth lifecycle management. FP state: $int1, unlockPossible: $bool1"
-            }
+            },
         )
     }
 
@@ -425,7 +353,7 @@
     fun logUserRequestedUnlock(
         requestOrigin: ActiveUnlockConfig.ActiveUnlockRequestOrigin,
         reason: String?,
-        dismissKeyguard: Boolean
+        dismissKeyguard: Boolean,
     ) {
         logBuffer.log(
             "ActiveUnlock",
@@ -435,7 +363,7 @@
                 str2 = reason
                 bool1 = dismissKeyguard
             },
-            { "reportUserRequestedUnlock origin=$str1 reason=$str2 dismissKeyguard=$bool1" }
+            { "reportUserRequestedUnlock origin=$str1 reason=$str2 dismissKeyguard=$bool1" },
         )
     }
 
@@ -443,7 +371,7 @@
         flags: Int,
         newlyUnlocked: Boolean,
         userId: Int,
-        message: String?
+        message: String?,
     ) {
         logBuffer.log(
             TAG,
@@ -457,7 +385,7 @@
             {
                 "trustGrantedWithFlags[user=$int2] newlyUnlocked=$bool1 " +
                     "flags=${TrustGrantFlags(int1)} message=$str1"
-            }
+            },
         )
     }
 
@@ -470,7 +398,7 @@
                 bool2 = isNowTrusted
                 int1 = userId
             },
-            { "onTrustChanged[user=$int1] wasTrusted=$bool1 isNowTrusted=$bool2" }
+            { "onTrustChanged[user=$int1] wasTrusted=$bool1 isNowTrusted=$bool2" },
         )
     }
 
@@ -478,7 +406,7 @@
         secure: Boolean,
         canDismissLockScreen: Boolean,
         trusted: Boolean,
-        trustManaged: Boolean
+        trustManaged: Boolean,
     ) {
         logBuffer.log(
             "KeyguardState",
@@ -492,7 +420,7 @@
             {
                 "#update secure=$bool1 canDismissKeyguard=$bool2" +
                     " trusted=$bool3 trustManaged=$bool4"
-            }
+            },
         )
     }
 
@@ -501,7 +429,7 @@
             TAG,
             VERBOSE,
             { bool1 = assistantVisible },
-            { "TaskStackChanged for ACTIVITY_TYPE_ASSISTANT, assistant visible: $bool1" }
+            { "TaskStackChanged for ACTIVITY_TYPE_ASSISTANT, assistant visible: $bool1" },
         )
     }
 
@@ -510,7 +438,7 @@
             TAG,
             VERBOSE,
             { bool1 = allow },
-            { "allowFingerprintOnCurrentOccludingActivityChanged: $bool1" }
+            { "allowFingerprintOnCurrentOccludingActivityChanged: $bool1" },
         )
     }
 
@@ -519,7 +447,7 @@
             TAG,
             VERBOSE,
             { bool1 = assistantVisible },
-            { "Updating mAssistantVisible to new value: $bool1" }
+            { "Updating mAssistantVisible to new value: $bool1" },
         )
     }
 
@@ -531,7 +459,7 @@
                 bool1 = isStrongBiometric
                 int1 = userId
             },
-            { "reporting successful biometric unlock: isStrongBiometric: $bool1, userId: $int1" }
+            { "reporting successful biometric unlock: isStrongBiometric: $bool1, userId: $int1" },
         )
     }
 
@@ -543,7 +471,7 @@
             {
                 "MSG_BIOMETRIC_AUTHENTICATION_CONTINUE already queued up, " +
                     "ignoring updating FP listening state to $int1"
-            }
+            },
         )
     }
 
@@ -551,7 +479,7 @@
         userId: Int,
         oldValue: Boolean,
         newValue: Boolean,
-        context: String
+        context: String,
     ) {
         logBuffer.log(
             TAG,
@@ -568,7 +496,7 @@
                     "old: $bool1, " +
                     "new: $bool2 " +
                     "context: $str1"
-            }
+            },
         )
     }
 
@@ -591,7 +519,7 @@
                     "plugged=$str1, " +
                     "chargingStatus=$int2, " +
                     "maxChargingWattage= $long2}"
-            }
+            },
         )
     }
 
@@ -604,7 +532,7 @@
             TAG,
             DEBUG,
             { str1 = "$biometricSourceType" },
-            { "notifying about enrollments changed: $str1" }
+            { "notifying about enrollments changed: $str1" },
         )
     }
 
@@ -616,7 +544,7 @@
                 int1 = userId
                 str1 = context
             },
-            { "userCurrentlySwitching: $str1, userId: $int1" }
+            { "userCurrentlySwitching: $str1, userId: $int1" },
         )
     }
 
@@ -628,7 +556,7 @@
                 int1 = userId
                 str1 = context
             },
-            { "userSwitchComplete: $str1, userId: $int1" }
+            { "userSwitchComplete: $str1, userId: $int1" },
         )
     }
 
@@ -637,7 +565,7 @@
             FP_LOG_TAG,
             DEBUG,
             { int1 = acquireInfo },
-            { "fingerprint acquire message: $int1" }
+            { "fingerprint acquire message: $int1" },
         )
     }
 
@@ -646,7 +574,7 @@
             TAG,
             DEBUG,
             { bool1 = keepUnlocked },
-            { "keepUnlockedOnFold changed to: $bool1" }
+            { "keepUnlockedOnFold changed to: $bool1" },
         )
     }
 
@@ -662,7 +590,7 @@
                 int1 = userId
                 bool1 = isUnlocked
             },
-            { "userStopped userId: $int1 isUnlocked: $bool1" }
+            { "userStopped userId: $int1 isUnlocked: $bool1" },
         )
     }
 
@@ -678,7 +606,7 @@
                 int1 = userId
                 bool1 = isUnlocked
             },
-            { "userUnlockedInitialState userId: $int1 isUnlocked: $bool1" }
+            { "userUnlockedInitialState userId: $int1 isUnlocked: $bool1" },
         )
     }
 }
diff --git a/packages/SystemUI/src/com/android/keyguard/logging/SimLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/SimLogger.kt
new file mode 100644
index 0000000..a81698b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/logging/SimLogger.kt
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2024 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.keyguard.logging
+
+import android.content.Intent
+import android.telephony.ServiceState
+import android.telephony.SubscriptionInfo
+import android.telephony.SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX
+import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
+import android.telephony.TelephonyManager
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.core.LogLevel
+import com.android.systemui.log.core.LogLevel.DEBUG
+import com.android.systemui.log.core.LogLevel.ERROR
+import com.android.systemui.log.core.LogLevel.INFO
+import com.android.systemui.log.core.LogLevel.VERBOSE
+import com.android.systemui.log.core.LogLevel.WARNING
+import com.android.systemui.log.dagger.SimLog
+import com.google.errorprone.annotations.CompileTimeConstant
+import javax.inject.Inject
+
+private const val TAG = "SimLog"
+
+/** Helper class for logging for SIM events */
+class SimLogger @Inject constructor(@SimLog private val logBuffer: LogBuffer) {
+    fun d(@CompileTimeConstant msg: String) = log(msg, DEBUG)
+
+    fun e(@CompileTimeConstant msg: String) = log(msg, ERROR)
+
+    fun v(@CompileTimeConstant msg: String) = log(msg, VERBOSE)
+
+    fun w(@CompileTimeConstant msg: String) = log(msg, WARNING)
+
+    fun log(@CompileTimeConstant msg: String, level: LogLevel) = logBuffer.log(TAG, level, msg)
+
+    fun logInvalidSubId(subId: Int) {
+        logBuffer.log(
+            TAG,
+            INFO,
+            { int1 = subId },
+            { "Previously active sub id $int1 is now invalid, will remove" },
+        )
+    }
+
+    fun logServiceStateChange(subId: Int, serviceState: ServiceState?) {
+        logBuffer.log(
+            TAG,
+            DEBUG,
+            {
+                int1 = subId
+                str1 = "$serviceState"
+            },
+            { "handleServiceStateChange(subId=$int1, serviceState=$str1)" },
+        )
+    }
+
+    fun logServiceStateIntent(action: String?, serviceState: ServiceState?, subId: Int) {
+        logBuffer.log(
+            TAG,
+            VERBOSE,
+            {
+                str1 = action
+                str2 = "$serviceState"
+                int1 = subId
+            },
+            { "action $str1 serviceState=$str2 subId=$int1" },
+        )
+    }
+
+    fun logServiceProvidersUpdated(intent: Intent) {
+        logBuffer.log(
+            TAG,
+            VERBOSE,
+            {
+                int1 = intent.getIntExtra(EXTRA_SUBSCRIPTION_INDEX, INVALID_SUBSCRIPTION_ID)
+                str1 = intent.getStringExtra(TelephonyManager.EXTRA_SPN)
+                str2 = intent.getStringExtra(TelephonyManager.EXTRA_PLMN)
+            },
+            { "action SERVICE_PROVIDERS_UPDATED subId=$int1 spn=$str1 plmn=$str2" },
+        )
+    }
+
+    fun logSimState(subId: Int, slotId: Int, state: Int) {
+        logBuffer.log(
+            TAG,
+            DEBUG,
+            {
+                int1 = subId
+                int2 = slotId
+                long1 = state.toLong()
+            },
+            { "handleSimStateChange(subId=$int1, slotId=$int2, state=$long1)" },
+        )
+    }
+
+    fun logSimStateFromIntent(action: String?, extraSimState: String?, slotId: Int, subId: Int) {
+        logBuffer.log(
+            TAG,
+            VERBOSE,
+            {
+                str1 = action
+                str2 = extraSimState
+                int1 = slotId
+                int2 = subId
+            },
+            { "action $str1 state: $str2 slotId: $int1 subid: $int2" },
+        )
+    }
+
+    fun logSimUnlocked(subId: Int) {
+        logBuffer.log(TAG, VERBOSE, { int1 = subId }, { "reportSimUnlocked(subId=$int1)" })
+    }
+
+    fun logSubInfo(subInfo: SubscriptionInfo?) {
+        logBuffer.log(TAG, DEBUG, { str1 = "$subInfo" }, { "SubInfo:$str1" })
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/CoreStartable.java b/packages/SystemUI/src/com/android/systemui/CoreStartable.java
index 55ccaa6..92bc95a 100644
--- a/packages/SystemUI/src/com/android/systemui/CoreStartable.java
+++ b/packages/SystemUI/src/com/android/systemui/CoreStartable.java
@@ -70,4 +70,12 @@
      * {@link #onBootCompleted()} will never be called before {@link #start()}. */
     default void onBootCompleted() {
     }
+
+    /** No op implementation that can be used when feature flagging on the Dagger Module level. */
+    CoreStartable NOP = new Nop();
+
+    class Nop implements CoreStartable {
+        @Override
+        public void start() {}
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java
index 60edaae..158623f 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java
@@ -280,6 +280,14 @@
         if (mLocalBluetoothManager == null) {
             return;
         }
+
+        // Remove the default padding of the system ui dialog
+        View container = dialog.findViewById(android.R.id.custom);
+        if (container != null && container.getParent() != null) {
+            View containerParent = (View) container.getParent();
+            containerParent.setPadding(0, 0, 0, 0);
+        }
+
         mUiEventLogger.log(HearingDevicesUiEvent.HEARING_DEVICES_DIALOG_SHOW, mLaunchSourceId);
         mPairButton = dialog.requireViewById(R.id.pair_new_device_button);
         mDeviceList = dialog.requireViewById(R.id.device_list);
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java
index 664f3f8..9367cb5 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java
@@ -108,6 +108,7 @@
         private final ImageView mIconView;
         private final ImageView mGearIcon;
         private final View mGearView;
+        private final View mDividerView;
 
         DeviceItemViewHolder(@NonNull View itemView, Context context) {
             super(itemView);
@@ -118,6 +119,7 @@
             mIconView = itemView.requireViewById(R.id.bluetooth_device_icon);
             mGearIcon = itemView.requireViewById(R.id.gear_icon_image);
             mGearView = itemView.requireViewById(R.id.gear_icon);
+            mDividerView = itemView.requireViewById(R.id.divider);
         }
 
         public void bindView(DeviceItem item, HearingDeviceItemCallback callback) {
@@ -153,6 +155,7 @@
 
             mGearIcon.getDrawable().mutate().setTint(tintColor);
             mGearView.setOnClickListener(view -> callback.onDeviceItemGearClicked(item, view));
+            mDividerView.setBackgroundColor(tintColor);
         }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/ambient/touch/TouchMonitor.java b/packages/SystemUI/src/com/android/systemui/ambient/touch/TouchMonitor.java
index 76df9c9..fb00d6e 100644
--- a/packages/SystemUI/src/com/android/systemui/ambient/touch/TouchMonitor.java
+++ b/packages/SystemUI/src/com/android/systemui/ambient/touch/TouchMonitor.java
@@ -75,6 +75,9 @@
  * touches are consumed.
  */
 public class TouchMonitor {
+    // An incrementing id used to identify the touch monitor instance.
+    private static int sNextInstanceId = 0;
+
     private final Logger mLogger;
     // This executor is used to protect {@code mActiveTouchSessions} from being modified
     // concurrently. Any operation that adds or removes values should use this executor.
@@ -138,7 +141,7 @@
                     completer.set(predecessor);
                 }
 
-                if (mActiveTouchSessions.isEmpty()) {
+                if (mActiveTouchSessions.isEmpty() && mInitialized) {
                     if (mStopMonitoringPending) {
                         stopMonitoring(false);
                     } else {
@@ -271,7 +274,7 @@
 
         @Override
         public void onDestroy(LifecycleOwner owner) {
-            stopMonitoring(true);
+            destroy();
         }
     };
 
@@ -279,6 +282,11 @@
      * When invoked, instantiates a new {@link InputSession} to monitor touch events.
      */
     private void startMonitoring() {
+        if (!mInitialized) {
+            mLogger.w("attempting to startMonitoring when not initialized");
+            return;
+        }
+
         mLogger.i("startMonitoring(): monitoring started");
         stopMonitoring(true);
 
@@ -587,7 +595,7 @@
         mDisplayHelper = displayHelper;
         mWindowManagerService = windowManagerService;
         mConfigurationInteractor = configurationInteractor;
-        mLoggingName = loggingName + ":TouchMonitor";
+        mLoggingName = loggingName + ":TouchMonitor[" + sNextInstanceId++ + "]";
         mLogger = new Logger(logBuffer, mLoggingName);
     }
 
@@ -613,7 +621,8 @@
      */
     public void destroy() {
         if (!mInitialized) {
-            throw new IllegalStateException("TouchMonitor not initialized");
+            // In the case that we've already been destroyed, this is a no-op
+            return;
         }
 
         stopMonitoring(true);
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
index b39aae9..a5bd559 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
@@ -19,6 +19,7 @@
 import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
 import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
 import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_REAR;
+import static android.view.Display.INVALID_DISPLAY;
 
 import static com.android.systemui.util.ConvenienceExtensionsKt.toKotlinLazy;
 
@@ -54,6 +55,7 @@
 import android.hardware.fingerprint.IUdfpsRefreshRateRequestCallback;
 import android.os.Handler;
 import android.os.RemoteException;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.Log;
 import android.util.RotationUtils;
@@ -211,9 +213,13 @@
         }
     };
 
-    private void closeDialog(String reason) {
+    private void closeDialog(String reasonString) {
+        closeDialog(BiometricPrompt.DISMISSED_REASON_USER_CANCEL, reasonString);
+    }
+
+    private void closeDialog(@DismissedReason int reason, String reasonString) {
         if (isShowing()) {
-            Log.i(TAG, "Close BP, reason :" + reason);
+            Log.i(TAG, "Close BP, reason :" + reasonString);
             mCurrentDialog.dismissWithoutCallback(true /* animate */);
             mCurrentDialog = null;
 
@@ -223,8 +229,7 @@
 
             try {
                 if (mReceiver != null) {
-                    mReceiver.onDialogDismissed(BiometricPrompt.DISMISSED_REASON_USER_CANCEL,
-                            null /* credentialAttestation */);
+                    mReceiver.onDialogDismissed(reason, null /* credentialAttestation */);
                     mReceiver = null;
                 }
             } catch (RemoteException e) {
@@ -251,25 +256,7 @@
 
     private void cancelIfOwnerIsNotInForeground() {
         mExecution.assertIsMainThread();
-        if (mCurrentDialog != null) {
-            try {
-                mCurrentDialog.dismissWithoutCallback(true /* animate */);
-                mCurrentDialog = null;
-
-                for (Callback cb : mCallbacks) {
-                    cb.onBiometricPromptDismissed();
-                }
-
-                if (mReceiver != null) {
-                    mReceiver.onDialogDismissed(
-                            BiometricPrompt.DISMISSED_REASON_USER_CANCEL,
-                            null /* credentialAttestation */);
-                    mReceiver = null;
-                }
-            } catch (RemoteException e) {
-                Log.e(TAG, "Remote exception", e);
-            }
-        }
+        closeDialog("owner not in foreground");
     }
 
     /**
@@ -1271,10 +1258,44 @@
         if (!promptInfo.isAllowBackgroundAuthentication() && isOwnerInBackground()) {
             cancelIfOwnerIsNotInForeground();
         } else {
-            mCurrentDialog.show(mWindowManager);
+            WindowManager wm = getWindowManagerForUser(userId);
+            if (wm != null) {
+                mCurrentDialog.show(wm);
+            } else {
+                closeDialog(BiometricPrompt.DISMISSED_REASON_ERROR_NO_WM,
+                        "unable to get WM instance for user");
+            }
         }
     }
 
+    @Nullable
+    private WindowManager getWindowManagerForUser(int userId) {
+        if (!mUserManager.isVisibleBackgroundUsersSupported()) {
+            return mWindowManager;
+        }
+        UserManager um = mContext.createContextAsUser(UserHandle.of(userId),
+                0 /* flags */).getSystemService(UserManager.class);
+        if (um == null) {
+            Log.e(TAG, "unable to get UserManager for user=" + userId);
+            return null;
+        }
+        if (!um.isUserVisible()) {
+            // not visible user - use default window manager
+            return mWindowManager;
+        }
+        int displayId = um.getMainDisplayIdAssignedToUser();
+        if (displayId == INVALID_DISPLAY) {
+            Log.e(TAG, "unable to get display assigned to user=" + userId);
+            return null;
+        }
+        Display display = mDisplayManager.getDisplay(displayId);
+        if (display == null) {
+            Log.e(TAG, "unable to get Display for user=" + userId);
+            return null;
+        }
+        return mContext.createDisplayContext(display).getSystemService(WindowManager.class);
+    }
+
     private void onDialogDismissed(@DismissedReason int reason) {
         if (DEBUG) Log.d(TAG, "onDialogDismissed: " + reason);
         if (mCurrentDialog == null) {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt
index 73f75a4..18446f02 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt
@@ -18,13 +18,11 @@
 
 import android.animation.Animator
 import android.animation.AnimatorSet
-import android.animation.ValueAnimator
 import android.graphics.Outline
 import android.graphics.Rect
 import android.transition.AutoTransition
 import android.transition.TransitionManager
 import android.util.TypedValue
-import android.view.Surface
 import android.view.View
 import android.view.ViewGroup
 import android.view.ViewOutlineProvider
@@ -52,7 +50,6 @@
 import com.android.systemui.res.R
 import kotlin.math.abs
 import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.launch
 
 /** Helper for [BiometricViewBinder] to handle resize transitions. */
@@ -98,7 +95,7 @@
             TypedValue.applyDimension(
                 TypedValue.COMPLEX_UNIT_DIP,
                 1f,
-                view.resources.displayMetrics
+                view.resources.displayMetrics,
             )
         val cornerRadiusPx = (pxToDp * cornerRadius).toInt()
 
@@ -114,7 +111,7 @@
                                 0,
                                 view.width + cornerRadiusPx,
                                 view.height,
-                                cornerRadiusPx.toFloat()
+                                cornerRadiusPx.toFloat(),
                             )
                         }
                         PromptPosition.Left -> {
@@ -123,7 +120,7 @@
                                 0,
                                 view.width,
                                 view.height,
-                                cornerRadiusPx.toFloat()
+                                cornerRadiusPx.toFloat(),
                             )
                         }
                         PromptPosition.Bottom,
@@ -133,7 +130,7 @@
                                 0,
                                 view.width,
                                 view.height + cornerRadiusPx,
-                                cornerRadiusPx.toFloat()
+                                cornerRadiusPx.toFloat(),
                             )
                         }
                     }
@@ -160,16 +157,13 @@
             fun setVisibilities(hideSensorIcon: Boolean, size: PromptSize) {
                 viewsToHideWhenSmall.forEach { it.showContentOrHide(forceHide = size.isSmall) }
                 largeConstraintSet.setVisibility(iconHolderView.id, View.GONE)
-                largeConstraintSet.setVisibility(R.id.biometric_icon_overlay, View.GONE)
                 largeConstraintSet.setVisibility(R.id.indicator, View.GONE)
                 largeConstraintSet.setVisibility(R.id.scrollView, View.GONE)
 
                 if (hideSensorIcon) {
                     smallConstraintSet.setVisibility(iconHolderView.id, View.GONE)
-                    smallConstraintSet.setVisibility(R.id.biometric_icon_overlay, View.GONE)
                     smallConstraintSet.setVisibility(R.id.indicator, View.GONE)
                     mediumConstraintSet.setVisibility(iconHolderView.id, View.GONE)
-                    mediumConstraintSet.setVisibility(R.id.biometric_icon_overlay, View.GONE)
                     mediumConstraintSet.setVisibility(R.id.indicator, View.GONE)
                 }
             }
@@ -189,24 +183,24 @@
                                     R.id.biometric_icon,
                                     ConstraintSet.LEFT,
                                     ConstraintSet.PARENT_ID,
-                                    ConstraintSet.LEFT
+                                    ConstraintSet.LEFT,
                                 )
                                 mediumConstraintSet.setMargin(
                                     R.id.biometric_icon,
                                     ConstraintSet.LEFT,
-                                    position.left
+                                    position.left,
                                 )
                                 smallConstraintSet.clear(R.id.biometric_icon, ConstraintSet.RIGHT)
                                 smallConstraintSet.connect(
                                     R.id.biometric_icon,
                                     ConstraintSet.LEFT,
                                     ConstraintSet.PARENT_ID,
-                                    ConstraintSet.LEFT
+                                    ConstraintSet.LEFT,
                                 )
                                 smallConstraintSet.setMargin(
                                     R.id.biometric_icon,
                                     ConstraintSet.LEFT,
-                                    position.left
+                                    position.left,
                                 )
                             }
                             if (position.top != 0) {
@@ -216,13 +210,13 @@
                                 mediumConstraintSet.setMargin(
                                     R.id.biometric_icon,
                                     ConstraintSet.TOP,
-                                    position.top
+                                    position.top,
                                 )
                                 smallConstraintSet.clear(R.id.biometric_icon, ConstraintSet.BOTTOM)
                                 smallConstraintSet.setMargin(
                                     R.id.biometric_icon,
                                     ConstraintSet.TOP,
-                                    position.top
+                                    position.top,
                                 )
                             }
                             if (position.right != 0) {
@@ -233,24 +227,24 @@
                                     R.id.biometric_icon,
                                     ConstraintSet.RIGHT,
                                     ConstraintSet.PARENT_ID,
-                                    ConstraintSet.RIGHT
+                                    ConstraintSet.RIGHT,
                                 )
                                 mediumConstraintSet.setMargin(
                                     R.id.biometric_icon,
                                     ConstraintSet.RIGHT,
-                                    position.right
+                                    position.right,
                                 )
                                 smallConstraintSet.clear(R.id.biometric_icon, ConstraintSet.LEFT)
                                 smallConstraintSet.connect(
                                     R.id.biometric_icon,
                                     ConstraintSet.RIGHT,
                                     ConstraintSet.PARENT_ID,
-                                    ConstraintSet.RIGHT
+                                    ConstraintSet.RIGHT,
                                 )
                                 smallConstraintSet.setMargin(
                                     R.id.biometric_icon,
                                     ConstraintSet.RIGHT,
-                                    position.right
+                                    position.right,
                                 )
                             }
                             if (position.bottom != 0) {
@@ -260,13 +254,13 @@
                                 mediumConstraintSet.setMargin(
                                     R.id.biometric_icon,
                                     ConstraintSet.BOTTOM,
-                                    position.bottom
+                                    position.bottom,
                                 )
                                 smallConstraintSet.clear(R.id.biometric_icon, ConstraintSet.TOP)
                                 smallConstraintSet.setMargin(
                                     R.id.biometric_icon,
                                     ConstraintSet.BOTTOM,
-                                    position.bottom
+                                    position.bottom,
                                 )
                             }
                             iconHolderView.layoutParams = iconParams
@@ -305,11 +299,11 @@
                         } else if (bounds.right < 0) {
                             mediumConstraintSet.setGuidelineBegin(
                                 rightGuideline.id,
-                                abs(bounds.right)
+                                abs(bounds.right),
                             )
                             smallConstraintSet.setGuidelineBegin(
                                 rightGuideline.id,
-                                abs(bounds.right)
+                                abs(bounds.right),
                             )
                         }
 
@@ -362,13 +356,13 @@
                                 R.id.scrollView,
                                 ConstraintSet.LEFT,
                                 R.id.midGuideline,
-                                ConstraintSet.LEFT
+                                ConstraintSet.LEFT,
                             )
                             flipConstraintSet.connect(
                                 R.id.scrollView,
                                 ConstraintSet.RIGHT,
                                 R.id.rightGuideline,
-                                ConstraintSet.RIGHT
+                                ConstraintSet.RIGHT,
                             )
                         } else if (position.isTop) {
                             // Top position is only used for 180 rotation Udfps
@@ -377,24 +371,24 @@
                                 R.id.scrollView,
                                 ConstraintSet.TOP,
                                 R.id.indicator,
-                                ConstraintSet.BOTTOM
+                                ConstraintSet.BOTTOM,
                             )
                             mediumConstraintSet.connect(
                                 R.id.scrollView,
                                 ConstraintSet.BOTTOM,
                                 R.id.button_bar,
-                                ConstraintSet.TOP
+                                ConstraintSet.TOP,
                             )
                             mediumConstraintSet.connect(
                                 R.id.panel,
                                 ConstraintSet.TOP,
                                 R.id.biometric_icon,
-                                ConstraintSet.TOP
+                                ConstraintSet.TOP,
                             )
                             mediumConstraintSet.setMargin(
                                 R.id.panel,
                                 ConstraintSet.TOP,
-                                (-24 * pxToDp).toInt()
+                                (-24 * pxToDp).toInt(),
                             )
                             mediumConstraintSet.setVerticalBias(R.id.scrollView, 0f)
                         }
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerActionButtonInteractor.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerActionButtonInteractor.kt
index 8b5a09b..2c026c0 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerActionButtonInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerActionButtonInteractor.kt
@@ -103,7 +103,7 @@
                 prepareToPerformAction()
                 returnToCall()
             },
-            onLongClick = null
+            onLongClick = null,
         )
     }
 
@@ -115,15 +115,15 @@
                 dozeLogger.logEmergencyCall()
                 startEmergencyDialerActivity()
             },
-            // TODO(b/308001302): The long click detector doesn't work properly, investigate.
+            // TODO(b/369767936): The long click detector doesn't work properly, investigate.
             onLongClick = {
                 if (emergencyAffordanceManager.needsEmergencyAffordance()) {
                     prepareToPerformAction()
 
-                    // TODO(b/298026988): Check that !longPressWasDragged before invoking.
+                    // TODO(b/369767936): Check that !longPressWasDragged before invoking.
                     emergencyAffordanceManager.performEmergencyCall()
                 }
-            }
+            },
         )
     }
 
@@ -143,7 +143,7 @@
             applicationContext.startActivityAsUser(
                 this,
                 ActivityOptions.makeCustomAnimation(applicationContext, 0, 0).toBundle(),
-                UserHandle(selectedUserInteractor.getSelectedUserId())
+                UserHandle(selectedUserInteractor.getSelectedUserId()),
             )
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/helper/BouncerHapticPlayer.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/helper/BouncerHapticPlayer.kt
index b8c30fe..d6b9211 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/helper/BouncerHapticPlayer.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/helper/BouncerHapticPlayer.kt
@@ -69,7 +69,7 @@
                 HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING,
             )
         } else {
-            msdlPlayer.get().playToken(MSDLToken.DRAG_INDICATOR)
+            msdlPlayer.get().playToken(MSDLToken.DRAG_INDICATOR_DISCRETE)
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/util/BouncerTestUtils.kt b/packages/SystemUI/src/com/android/systemui/bouncer/util/BouncerTestUtils.kt
new file mode 100644
index 0000000..08a79c9
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/util/BouncerTestUtils.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 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.systemui.bouncer.util
+
+import android.app.ActivityManager
+import android.content.res.Resources
+import com.android.systemui.res.R
+import java.io.File
+
+private const val ENABLE_MENU_KEY_FILE = "/data/local/enable_menu_key"
+
+/**
+ * In general, we enable unlocking the insecure keyguard with the menu key. However, there are some
+ * cases where we wish to disable it, notably when the menu button placement or technology is prone
+ * to false positives.
+ *
+ * @return true if the menu key should be enabled
+ */
+fun Resources.shouldEnableMenuKey(): Boolean {
+    val configDisabled = getBoolean(R.bool.config_disableMenuKeyInLockScreen)
+    val isTestHarness = ActivityManager.isRunningInTestHarness()
+    val fileOverride = File(ENABLE_MENU_KEY_FILE).exists()
+    return !configDisabled || isTestHarness || fileOverride
+}
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java
index 1ada56d..7033e64 100644
--- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java
@@ -19,6 +19,7 @@
 import static android.content.ClipDescription.CLASSIFICATION_COMPLETE;
 
 import static com.android.systemui.Flags.clipboardNoninteractiveOnLockscreen;
+import static com.android.systemui.Flags.overrideSuppressOverlayCondition;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_ENTERED;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_UPDATED;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_TOAST_SHOWN;
@@ -63,6 +64,7 @@
     private final ClipboardManager mClipboardManager;
     private final KeyguardManager mKeyguardManager;
     private final UiEventLogger mUiEventLogger;
+    private final ClipboardOverlaySuppressionController mClipboardOverlaySuppressionController;
     private ClipboardOverlay mClipboardOverlay;
 
     @Inject
@@ -71,13 +73,15 @@
             ClipboardToast clipboardToast,
             UserScopedService<ClipboardManager> clipboardManager,
             KeyguardManager keyguardManager,
-            UiEventLogger uiEventLogger) {
+            UiEventLogger uiEventLogger,
+            ClipboardOverlaySuppressionController clipboardOverlaySuppressionController) {
         mContext = context;
         mOverlayProvider = clipboardOverlayControllerProvider;
         mClipboardToast = clipboardToast;
         mClipboardManager = clipboardManager.forUser(UserHandle.CURRENT);
         mKeyguardManager = keyguardManager;
         mUiEventLogger = uiEventLogger;
+        mClipboardOverlaySuppressionController = clipboardOverlaySuppressionController;
     }
 
     @Override
@@ -94,9 +98,17 @@
         String clipSource = mClipboardManager.getPrimaryClipSource();
         ClipData clipData = mClipboardManager.getPrimaryClip();
 
-        if (shouldSuppressOverlay(clipData, clipSource, Build.IS_EMULATOR)) {
-            Log.i(TAG, "Clipboard overlay suppressed.");
-            return;
+        if (overrideSuppressOverlayCondition()) {
+            if (mClipboardOverlaySuppressionController.shouldSuppressOverlay(clipData, clipSource,
+                    Build.IS_EMULATOR)) {
+                Log.i(TAG, "Clipboard overlay suppressed.");
+                return;
+            }
+        } else {
+            if (shouldSuppressOverlay(clipData, clipSource, Build.IS_EMULATOR)) {
+                Log.i(TAG, "Clipboard overlay suppressed.");
+                return;
+            }
         }
 
         // user should not access intents before setup or while device is locked
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
index aabfbd1..65c01ed 100644
--- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
@@ -710,9 +710,16 @@
     @Override
     public void onShareButtonTapped() {
         if (clipboardSharedTransitions()) {
-            if (mClipboardModel.getType() != ClipboardModel.Type.OTHER) {
-                finishWithSharedTransition(CLIPBOARD_OVERLAY_SHARE_TAPPED,
-                        IntentCreator.getShareIntent(mClipboardModel.getClipData(), mContext));
+            switch (mClipboardModel.getType()) {
+                case TEXT:
+                case URI:
+                    finish(CLIPBOARD_OVERLAY_SHARE_TAPPED,
+                            IntentCreator.getShareIntent(mClipboardModel.getClipData(), mContext));
+                    break;
+                case IMAGE:
+                    finishWithSharedTransition(CLIPBOARD_OVERLAY_SHARE_TAPPED,
+                            IntentCreator.getShareIntent(mClipboardModel.getClipData(), mContext));
+                    break;
             }
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlaySuppressionController.kt b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlaySuppressionController.kt
new file mode 100644
index 0000000..be592da
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlaySuppressionController.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2024 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.systemui.clipboardoverlay
+
+import android.content.ClipData
+
+/** Interface to control the clipboard overlay suppression behavior. */
+interface ClipboardOverlaySuppressionController {
+
+    /** Decides if the clipboard overlay should be suppressed. */
+    fun shouldSuppressOverlay(
+        clipData: ClipData?,
+        clipSource: String?,
+        isEmulator: Boolean,
+    ): Boolean
+}
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlaySuppressionControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlaySuppressionControllerImpl.kt
new file mode 100644
index 0000000..814341d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlaySuppressionControllerImpl.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2024 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.systemui.clipboardoverlay
+
+import android.content.ClipData
+import com.android.internal.annotations.VisibleForTesting
+import com.android.systemui.dagger.SysUISingleton
+import javax.inject.Inject
+
+@SysUISingleton
+open class ClipboardOverlaySuppressionControllerImpl @Inject constructor() :
+    ClipboardOverlaySuppressionController {
+
+    // The overlay is suppressed if EXTRA_SUPPRESS_OVERLAY is true and the device is an emulator or
+    // the source package is SHELL_PACKAGE. This is meant to suppress the overlay when the emulator
+    // or a mirrored device is syncing the clipboard.
+    override fun shouldSuppressOverlay(
+        clipData: ClipData?,
+        clipSource: String?,
+        isEmulator: Boolean,
+    ): Boolean {
+        if (!(isEmulator || SHELL_PACKAGE == clipSource)) {
+            return false
+        }
+        if (clipData == null || clipData.description.extras == null) {
+            return false
+        }
+        return clipData.description.extras.getBoolean(EXTRA_SUPPRESS_OVERLAY, false)
+    }
+
+    companion object {
+        @VisibleForTesting const val SHELL_PACKAGE = "com.android.shell"
+
+        @VisibleForTesting
+        const val EXTRA_SUPPRESS_OVERLAY = "com.android.systemui.SUPPRESS_CLIPBOARD_OVERLAY"
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/dagger/ClipboardOverlaySuppressionModule.kt b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/dagger/ClipboardOverlaySuppressionModule.kt
new file mode 100644
index 0000000..527819c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/dagger/ClipboardOverlaySuppressionModule.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2022 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.systemui.clipboardoverlay.dagger
+
+import com.android.systemui.clipboardoverlay.ClipboardOverlaySuppressionController
+import com.android.systemui.clipboardoverlay.ClipboardOverlaySuppressionControllerImpl
+import dagger.Binds
+import dagger.Module
+
+/** Dagger Module for code in the clipboard overlay package. */
+@Module
+interface ClipboardOverlaySuppressionModule {
+
+    /** Provides implementation for [ClipboardOverlaySuppressionController]. */
+    @Binds
+    fun provideClipboardOverlaySuppressionController(
+        clipboardOverlaySuppressionControllerImpl: ClipboardOverlaySuppressionControllerImpl
+    ): ClipboardOverlaySuppressionController
+}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalDatabase.kt b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalDatabase.kt
index 8f1854f..17f4f0c 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalDatabase.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalDatabase.kt
@@ -26,7 +26,7 @@
 import androidx.sqlite.db.SupportSQLiteDatabase
 import com.android.systemui.res.R
 
-@Database(entities = [CommunalWidgetItem::class, CommunalItemRank::class], version = 3)
+@Database(entities = [CommunalWidgetItem::class, CommunalItemRank::class], version = 4)
 abstract class CommunalDatabase : RoomDatabase() {
     abstract fun communalWidgetDao(): CommunalWidgetDao
 
@@ -43,19 +43,16 @@
          * @param callback An optional callback registered to the database. Only effective when a
          *   new instance is created.
          */
-        fun getInstance(
-            context: Context,
-            callback: Callback? = null,
-        ): CommunalDatabase {
+        fun getInstance(context: Context, callback: Callback? = null): CommunalDatabase {
             if (instance == null) {
                 instance =
                     Room.databaseBuilder(
                             context,
                             CommunalDatabase::class.java,
-                            context.resources.getString(R.string.config_communalDatabase)
+                            context.resources.getString(R.string.config_communalDatabase),
                         )
                         .also { builder ->
-                            builder.addMigrations(MIGRATION_1_2, MIGRATION_2_3)
+                            builder.addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4)
                             builder.fallbackToDestructiveMigration(dropAllTables = true)
                             callback?.let { callback -> builder.addCallback(callback) }
                         }
@@ -103,5 +100,21 @@
                     )
                 }
             }
+
+        /**
+         * This migration adds a span_y column to the communal_widget_table and sets its default
+         * value to 3.
+         */
+        @VisibleForTesting
+        val MIGRATION_3_4 =
+            object : Migration(3, 4) {
+                override fun migrate(db: SupportSQLiteDatabase) {
+                    Log.i(TAG, "Migrating from version 3 to 4")
+                    db.execSQL(
+                        "ALTER TABLE communal_widget_table " +
+                            "ADD COLUMN span_y INTEGER NOT NULL DEFAULT 3"
+                    )
+                }
+            }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalEntities.kt b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalEntities.kt
index e33aead..f9d2a84 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalEntities.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalEntities.kt
@@ -40,6 +40,12 @@
      */
     @ColumnInfo(name = "user_serial_number", defaultValue = "$USER_SERIAL_NUMBER_UNDEFINED")
     val userSerialNumber: Int,
+
+    /**
+     * The vertical span of the widget. Span_Y default value corresponds to
+     * CommunalContentSize.HALF.span
+     */
+    @ColumnInfo(name = "span_y", defaultValue = "3") val spanY: Int,
 ) {
     companion object {
         /**
diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt
index 93b86bd..02bf9db 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt
@@ -23,8 +23,10 @@
 import androidx.room.Query
 import androidx.room.RoomDatabase
 import androidx.room.Transaction
+import androidx.room.Update
 import androidx.sqlite.db.SupportSQLiteDatabase
 import com.android.systemui.communal.nano.CommunalHubState
+import com.android.systemui.communal.shared.model.CommunalContentSize
 import com.android.systemui.communal.widgets.CommunalWidgetHost
 import com.android.systemui.communal.widgets.CommunalWidgetModule.Companion.DEFAULT_WIDGETS
 import com.android.systemui.dagger.SysUISingleton
@@ -153,14 +155,15 @@
 
     @Query(
         "INSERT INTO communal_widget_table" +
-            "(widget_id, component_name, item_id, user_serial_number) " +
-            "VALUES(:widgetId, :componentName, :itemId, :userSerialNumber)"
+            "(widget_id, component_name, item_id, user_serial_number, span_y) " +
+            "VALUES(:widgetId, :componentName, :itemId, :userSerialNumber, :spanY)"
     )
     fun insertWidget(
         widgetId: Int,
         componentName: String,
         itemId: Long,
         userSerialNumber: Int,
+        spanY: Int = 3,
     ): Long
 
     @Query("INSERT INTO communal_item_rank_table(rank) VALUES(:rank)")
@@ -169,6 +172,8 @@
     @Query("UPDATE communal_item_rank_table SET rank = :order WHERE uid = :itemUid")
     fun updateItemRank(itemUid: Long, order: Int)
 
+    @Update fun updateWidget(widget: CommunalWidgetItem)
+
     @Query("DELETE FROM communal_widget_table") fun clearCommunalWidgetsTable()
 
     @Query("DELETE FROM communal_item_rank_table") fun clearCommunalItemRankTable()
@@ -184,17 +189,28 @@
     }
 
     @Transaction
+    fun resizeWidget(appWidgetId: Int, spanY: Int, widgetIdToRankMap: Map<Int, Int>) {
+        val widget = getWidgetByIdNow(appWidgetId)
+        if (widget != null) {
+            updateWidget(widget.copy(spanY = spanY))
+        }
+        updateWidgetOrder(widgetIdToRankMap)
+    }
+
+    @Transaction
     fun addWidget(
         widgetId: Int,
         provider: ComponentName,
         rank: Int? = null,
         userSerialNumber: Int,
+        spanY: Int = CommunalContentSize.HALF.span,
     ): Long {
         return addWidget(
             widgetId = widgetId,
             componentName = provider.flattenToString(),
             rank = rank,
             userSerialNumber = userSerialNumber,
+            spanY = spanY,
         )
     }
 
@@ -204,6 +220,7 @@
         componentName: String,
         rank: Int? = null,
         userSerialNumber: Int,
+        spanY: Int = 3,
     ): Long {
         val widgets = getWidgetsNow()
 
@@ -224,6 +241,7 @@
             componentName = componentName,
             itemId = insertItemRank(newRank),
             userSerialNumber = userSerialNumber,
+            spanY = spanY,
         )
     }
 
@@ -246,7 +264,8 @@
         clearCommunalItemRankTable()
 
         state.widgets.forEach {
-            addWidget(it.widgetId, it.componentName, it.rank, it.userSerialNumber)
+            val spanY = if (it.spanY != 0) it.spanY else CommunalContentSize.HALF.span
+            addWidget(it.widgetId, it.componentName, it.rank, it.userSerialNumber, spanY)
         }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt
index 6cdd9ff..0e94289 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt
@@ -21,6 +21,7 @@
 import android.content.ComponentName
 import android.os.UserHandle
 import android.os.UserManager
+import com.android.systemui.Flags.communalWidgetResizing
 import com.android.systemui.common.data.repository.PackageChangeRepository
 import com.android.systemui.common.shared.model.PackageInstallSession
 import com.android.systemui.communal.data.backup.CommunalBackupUtils
@@ -82,7 +83,7 @@
      *
      * @param widgetIdToRankMap mapping of the widget ids to the rank of the widget.
      */
-    fun updateWidgetOrder(widgetIdToRankMap: Map<Int, Int>) {}
+    fun updateWidgetOrder(widgetIdToRankMap: Map<Int, Int>)
 
     /**
      * Restores the database by reading a state file from disk and updating the widget ids according
@@ -92,6 +93,17 @@
 
     /** Aborts the restore process and removes files from disk if necessary. */
     fun abortRestoreWidgets()
+
+    /**
+     * Update the spanY of a widget in the database.
+     *
+     * @param appWidgetId id of the widget to update.
+     * @param spanY new spanY value for the widget.
+     * @param widgetIdToRankMap mapping of the widget ids to its rank. Allows re-ordering widgets
+     *   alongside the resize, in case resizing also requires re-ordering. This ensures the
+     *   re-ordering is done in the same database transaction as the resize.
+     */
+    fun resizeWidget(appWidgetId: Int, spanY: Int, widgetIdToRankMap: Map<Int, Int>)
 }
 
 @SysUISingleton
@@ -118,20 +130,32 @@
 
     /** Widget metadata from database + matching [AppWidgetProviderInfo] if any. */
     private val widgetEntries: Flow<List<CommunalWidgetEntry>> =
-        combine(
-            communalWidgetDao.getWidgets(),
-            communalWidgetHost.appWidgetProviders,
-        ) { entries, providers ->
+        combine(communalWidgetDao.getWidgets(), communalWidgetHost.appWidgetProviders) {
+            entries,
+            providers ->
             entries.mapNotNull { (rank, widget) ->
                 CommunalWidgetEntry(
                     appWidgetId = widget.widgetId,
                     componentName = widget.componentName,
                     rank = rank.rank,
-                    providerInfo = providers[widget.widgetId]
+                    providerInfo = providers[widget.widgetId],
+                    spanY = widget.spanY,
                 )
             }
         }
 
+    override fun resizeWidget(appWidgetId: Int, spanY: Int, widgetIdToRankMap: Map<Int, Int>) {
+        if (!communalWidgetResizing()) return
+        bgScope.launch {
+            communalWidgetDao.resizeWidget(appWidgetId, spanY, widgetIdToRankMap)
+            logger.i({ "Updated spanY of widget $int1 to $int2." }) {
+                int1 = appWidgetId
+                int2 = spanY
+            }
+            backupManager.dataChanged()
+        }
+    }
+
     @OptIn(ExperimentalCoroutinesApi::class)
     override val communalWidgets: Flow<List<CommunalWidgetContentModel>> =
         widgetEntries
@@ -197,6 +221,7 @@
                     provider = provider,
                     rank = rank,
                     userSerialNumber = userManager.getUserSerialNumber(user.identifier),
+                    spanY = 3,
                 )
                 backupManager.dataChanged()
             } else {
@@ -325,6 +350,7 @@
                         componentName = restoredWidget.componentName
                         rank = restoredWidget.rank
                         userSerialNumber = userManager.getUserSerialNumber(newUser.identifier)
+                        spanY = restoredWidget.spanY
                     }
                 }
             val newState = CommunalHubState().apply { widgets = newWidgets.toTypedArray() }
@@ -383,6 +409,7 @@
             appWidgetId = entry.appWidgetId,
             providerInfo = entry.providerInfo!!,
             rank = entry.rank,
+            spanY = entry.spanY,
         )
     }
 
@@ -400,6 +427,7 @@
                 appWidgetId = entry.appWidgetId,
                 providerInfo = entry.providerInfo!!,
                 rank = entry.rank,
+                spanY = entry.spanY,
             )
         }
 
@@ -412,6 +440,7 @@
                 componentName = componentName,
                 icon = session.icon,
                 user = session.user,
+                spanY = entry.spanY,
             )
         } else {
             null
@@ -422,6 +451,7 @@
         val appWidgetId: Int,
         val componentName: String,
         val rank: Int,
+        val spanY: Int,
         var providerInfo: AppWidgetProviderInfo? = null,
     )
 }
diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt
index a687734..3a04d02 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt
@@ -399,6 +399,10 @@
     fun updateWidgetOrder(widgetIdToRankMap: Map<Int, Int>) =
         widgetRepository.updateWidgetOrder(widgetIdToRankMap)
 
+    fun resizeWidget(appWidgetId: Int, spanY: Int, widgetIdToRankMap: Map<Int, Int>) {
+        widgetRepository.resizeWidget(appWidgetId, spanY, widgetIdToRankMap)
+    }
+
     /** Request to unpause work profile that is currently in quiet mode. */
     fun unpauseWorkProfile() {
         managedProfileController.setWorkModeEnabled(true)
@@ -449,6 +453,7 @@
                             providerInfo = widget.providerInfo,
                             appWidgetHost = appWidgetHost,
                             inQuietMode = isQuietModeEnabled(widget.providerInfo.profile),
+                            size = CommunalContentSize.toSize(widget.spanY),
                         )
                     }
                     is CommunalWidgetContentModel.Pending -> {
@@ -457,6 +462,7 @@
                             rank = widget.rank,
                             componentName = widget.componentName,
                             icon = widget.icon,
+                            size = CommunalContentSize.toSize(widget.spanY),
                         )
                     }
                 }
diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/model/CommunalContentModel.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/model/CommunalContentModel.kt
index c2f6e85..4c2c094 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/domain/model/CommunalContentModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/domain/model/CommunalContentModel.kt
@@ -62,11 +62,10 @@
             val providerInfo: AppWidgetProviderInfo,
             val appWidgetHost: CommunalAppWidgetHost,
             val inQuietMode: Boolean,
+            override val size: CommunalContentSize,
         ) : WidgetContent {
             override val key = KEY.widget(appWidgetId)
             override val componentName: ComponentName = providerInfo.provider
-            // Widget size is always half.
-            override val size = CommunalContentSize.HALF
 
             /** Whether this widget can be reconfigured after it has already been added. */
             val reconfigurable: Boolean
@@ -79,11 +78,10 @@
             override val appWidgetId: Int,
             override val rank: Int,
             val providerInfo: AppWidgetProviderInfo,
+            override val size: CommunalContentSize,
         ) : WidgetContent {
             override val key = KEY.disabledWidget(appWidgetId)
             override val componentName: ComponentName = providerInfo.provider
-            // Widget size is always half.
-            override val size = CommunalContentSize.HALF
 
             val appInfo: ApplicationInfo?
                 get() = providerInfo.providerInfo?.applicationInfo
@@ -93,11 +91,10 @@
             override val appWidgetId: Int,
             override val rank: Int,
             override val componentName: ComponentName,
+            override val size: CommunalContentSize,
             val icon: Bitmap? = null,
         ) : WidgetContent {
             override val key = KEY.pendingWidget(appWidgetId)
-            // Widget size is always half.
-            override val size = CommunalContentSize.HALF
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/communal/proto/communal_hub_state.proto b/packages/SystemUI/src/com/android/systemui/communal/proto/communal_hub_state.proto
index bc14ae1..7602a7a 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/proto/communal_hub_state.proto
+++ b/packages/SystemUI/src/com/android/systemui/communal/proto/communal_hub_state.proto
@@ -38,5 +38,8 @@
 
         // Serial number of the user associated with the widget.
         int32 user_serial_number = 4;
+
+        // The vertical span of the widget
+        int32 span_y = 5;
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/communal/shared/model/CommunalWidgetContentModel.kt b/packages/SystemUI/src/com/android/systemui/communal/shared/model/CommunalWidgetContentModel.kt
index 63b1a14..0c9ea78 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/shared/model/CommunalWidgetContentModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/shared/model/CommunalWidgetContentModel.kt
@@ -25,12 +25,14 @@
 sealed interface CommunalWidgetContentModel {
     val appWidgetId: Int
     val rank: Int
+    val spanY: Int
 
     /** Widget is ready to display */
     data class Available(
         override val appWidgetId: Int,
         val providerInfo: AppWidgetProviderInfo,
         override val rank: Int,
+        override val spanY: Int,
     ) : CommunalWidgetContentModel
 
     /** Widget is pending installation */
@@ -40,5 +42,6 @@
         val componentName: ComponentName,
         val icon: Bitmap?,
         val user: UserHandle,
+        override val spanY: Int,
     ) : CommunalWidgetContentModel
 }
diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalAppWidgetHostViewBinder.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalAppWidgetHostViewBinder.kt
index 5f421fd..ba96f4e 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalAppWidgetHostViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalAppWidgetHostViewBinder.kt
@@ -17,19 +17,30 @@
 package com.android.systemui.communal.ui.binder
 
 import android.content.Context
+import android.os.Bundle
 import android.util.SizeF
 import android.view.View
 import android.view.ViewGroup
 import android.widget.FrameLayout
+import androidx.compose.ui.unit.IntSize
 import androidx.core.view.doOnLayout
+import com.android.app.tracing.coroutines.flow.flowOn
 import com.android.app.tracing.coroutines.launch
+import com.android.systemui.Flags.communalWidgetResizing
+import com.android.systemui.common.ui.view.onLayoutChanged
 import com.android.systemui.communal.domain.model.CommunalContentModel
 import com.android.systemui.communal.util.WidgetViewFactory
 import com.android.systemui.util.kotlin.DisposableHandles
+import com.android.systemui.util.kotlin.toDp
+import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
+import kotlin.coroutines.CoroutineContext
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.DisposableHandle
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
 
 object CommunalAppWidgetHostViewBinder {
     private const val TAG = "CommunalAppWidgetHostViewBinder"
@@ -37,9 +48,11 @@
     fun bind(
         context: Context,
         applicationScope: CoroutineScope,
+        mainContext: CoroutineContext,
+        backgroundContext: CoroutineContext,
         container: FrameLayout,
         model: CommunalContentModel.WidgetContent.Widget,
-        size: SizeF,
+        size: SizeF?,
         factory: WidgetViewFactory,
     ): DisposableHandle {
         val disposables = DisposableHandles()
@@ -49,6 +62,22 @@
                 val widget = factory.createWidget(context, model, size)
                 waitForLayout(container)
                 container.post { container.setView(widget) }
+                if (communalWidgetResizing()) {
+                    // Update the app widget size in the background.
+                    launch("$TAG#updateSize", backgroundContext) {
+                        container.sizeFlow().flowOn(mainContext).distinctUntilChanged().collect {
+                            (width, height) ->
+                            widget.updateAppWidgetSize(
+                                /* newOptions = */ Bundle(),
+                                /* minWidth = */ width,
+                                /* minHeight = */ height,
+                                /* maxWidth = */ width,
+                                /* maxHeight = */ height,
+                                /* ignorePadding = */ true,
+                            )
+                        }
+                    }
+                }
             }
 
         disposables += DisposableHandle { loadingJob.cancel() }
@@ -69,3 +98,13 @@
     (view.parent as? ViewGroup)?.removeView(view)
     addView(view)
 }
+
+private fun View.sizeAsDp(): IntSize = IntSize(width.toDp(context), height.toDp(context))
+
+private fun View.sizeFlow(): Flow<IntSize> = conflatedCallbackFlow {
+    if (isLaidOut && !isLayoutRequested) {
+        trySend(sizeAsDp())
+    }
+    val disposable = onLayoutChanged { trySend(sizeAsDp()) }
+    awaitClose { disposable.dispose() }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/view/layout/sections/CommunalAppWidgetSection.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/view/layout/sections/CommunalAppWidgetSection.kt
index 56b769e..2e12bad 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/ui/view/layout/sections/CommunalAppWidgetSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/ui/view/layout/sections/CommunalAppWidgetSection.kt
@@ -25,13 +25,17 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.viewinterop.AndroidView
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.android.systemui.Flags.communalWidgetResizing
 import com.android.systemui.communal.domain.model.CommunalContentModel
 import com.android.systemui.communal.ui.binder.CommunalAppWidgetHostViewBinder
 import com.android.systemui.communal.ui.viewmodel.BaseCommunalViewModel
 import com.android.systemui.communal.util.WidgetViewFactory
 import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.dagger.qualifiers.UiBackground
 import com.android.systemui.res.R
 import javax.inject.Inject
+import kotlin.coroutines.CoroutineContext
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.DisposableHandle
 
@@ -39,6 +43,8 @@
 @Inject
 constructor(
     @Application private val applicationScope: CoroutineScope,
+    @Main private val mainContext: CoroutineContext,
+    @UiBackground private val backgroundContext: CoroutineContext,
     private val factory: WidgetViewFactory,
 ) {
 
@@ -76,10 +82,12 @@
                             context = context,
                             container = this,
                             model = model,
-                            size = size,
+                            size = if (!communalWidgetResizing()) size else null,
                             factory = factory,
                             applicationScope = applicationScope,
-                        )
+                            mainContext = mainContext,
+                            backgroundContext = backgroundContext,
+                        ),
                     )
 
                     accessibilityDelegate = viewModel.widgetAccessibilityDelegate
diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/BaseCommunalViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/BaseCommunalViewModel.kt
index 0929d3e..e25ea4c 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/BaseCommunalViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/BaseCommunalViewModel.kt
@@ -105,7 +105,7 @@
         scene: SceneKey,
         loggingReason: String,
         transitionKey: TransitionKey? = null,
-        keyguardState: KeyguardState? = null
+        keyguardState: KeyguardState? = null,
     ) {
         communalSceneInteractor.changeScene(scene, loggingReason, transitionKey, keyguardState)
     }
@@ -155,17 +155,10 @@
     ) {}
 
     /** Called as the UI requests deleting a widget. */
-    open fun onDeleteWidget(
-        id: Int,
-        componentName: ComponentName,
-        rank: Int,
-    ) {}
+    open fun onDeleteWidget(id: Int, componentName: ComponentName, rank: Int) {}
 
     /** Called as the UI detects a tap event on the widget. */
-    open fun onTapWidget(
-        componentName: ComponentName,
-        rank: Int,
-    ) {}
+    open fun onTapWidget(componentName: ComponentName, rank: Int) {}
 
     /**
      * Called as the UI requests reordering widgets.
@@ -176,10 +169,19 @@
      */
     open fun onReorderWidgets(widgetIdToRankMap: Map<Int, Int>) {}
 
+    /**
+     * Called as the UI requests resizing a widget.
+     *
+     * @param appWidgetId The id of the widget being resized.
+     * @param spanY The new size of the widget, in grid spans.
+     * @param widgetIdToRankMap Mapping of the widget ids to its rank. Allows re-ordering widgets
+     *   alongside the resize, in case resizing also requires re-ordering. This ensures the
+     *   re-ordering is done in the same database transaction as the resize.
+     */
+    open fun onResizeWidget(appWidgetId: Int, spanY: Int, widgetIdToRankMap: Map<Int, Int>) {}
+
     /** Called as the UI requests opening the widget editor with an optional preselected widget. */
-    open fun onOpenWidgetEditor(
-        shouldOpenWidgetPickerOnStart: Boolean = false,
-    ) {}
+    open fun onOpenWidgetEditor(shouldOpenWidgetPickerOnStart: Boolean = false) {}
 
     /** Called as the UI requests to dismiss the CTA tile. */
     open fun onDismissCtaTile() {}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt
index 65f0679..3ae9250 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt
@@ -107,9 +107,9 @@
         allOf(
                 keyguardTransitionInteractor.isFinishedIn(
                     scene = Scenes.Gone,
-                    stateWithoutSceneContainer = KeyguardState.GONE
+                    stateWithoutSceneContainer = KeyguardState.GONE,
                 ),
-                communalInteractor.editModeOpen
+                communalInteractor.editModeOpen,
             )
             .filter { it }
 
@@ -128,17 +128,13 @@
         componentName: ComponentName,
         user: UserHandle,
         rank: Int?,
-        configurator: WidgetConfigurator?
+        configurator: WidgetConfigurator?,
     ) {
         communalInteractor.addWidget(componentName, user, rank, configurator)
         metricsLogger.logAddWidget(componentName.flattenToString(), rank)
     }
 
-    override fun onDeleteWidget(
-        id: Int,
-        componentName: ComponentName,
-        rank: Int,
-    ) {
+    override fun onDeleteWidget(id: Int, componentName: ComponentName, rank: Int) {
         communalInteractor.deleteWidget(id)
         metricsLogger.logRemoveWidget(componentName.flattenToString(), rank)
     }
@@ -146,6 +142,10 @@
     override fun onReorderWidgets(widgetIdToRankMap: Map<Int, Int>) =
         communalInteractor.updateWidgetOrder(widgetIdToRankMap)
 
+    override fun onResizeWidget(appWidgetId: Int, spanY: Int, widgetIdToRankMap: Map<Int, Int>) {
+        communalInteractor.resizeWidget(appWidgetId, spanY, widgetIdToRankMap)
+    }
+
     override fun onReorderWidgetStart() {
         // Clear selection status
         setSelectedKey(null)
@@ -173,7 +173,7 @@
         val announcementText =
             context.getString(
                 R.string.accessibility_announcement_communal_widget_added,
-                widgetLabel
+                widgetLabel,
             )
         accessibilityManager.sendAccessibilityEvent(
             AccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT).apply {
@@ -187,7 +187,7 @@
     /** Launch the widget picker activity using the given {@link ActivityResultLauncher}. */
     suspend fun onOpenWidgetPicker(
         resources: Resources,
-        activityLauncher: ActivityResultLauncher<Intent>
+        activityLauncher: ActivityResultLauncher<Intent>,
     ): Boolean =
         withContext(backgroundDispatcher) {
             val widgets = communalInteractor.widgetContent.first()
@@ -210,21 +210,21 @@
 
     private fun getWidgetPickerActivityIntent(
         resources: Resources,
-        excludeList: ArrayList<AppWidgetProviderInfo>
+        excludeList: ArrayList<AppWidgetProviderInfo>,
     ): Intent? {
         return Intent(Intent.ACTION_PICK).apply {
             setPackage(launcherPackage)
             putExtra(
                 EXTRA_DESIRED_WIDGET_WIDTH,
-                resources.getDimensionPixelSize(R.dimen.communal_widget_picker_desired_width)
+                resources.getDimensionPixelSize(R.dimen.communal_widget_picker_desired_width),
             )
             putExtra(
                 EXTRA_DESIRED_WIDGET_HEIGHT,
-                resources.getDimensionPixelSize(R.dimen.communal_widget_picker_desired_height)
+                resources.getDimensionPixelSize(R.dimen.communal_widget_picker_desired_height),
             )
             putExtra(
                 AppWidgetManager.EXTRA_CATEGORY_FILTER,
-                CommunalWidgetCategories.defaultCategories
+                CommunalWidgetCategories.defaultCategories,
             )
 
             communalSettingsInteractor.workProfileUserDisallowedByDevicePolicy.value?.let {
@@ -234,7 +234,7 @@
             putExtra(EXTRA_PICKER_TITLE, resources.getString(R.string.communal_widget_picker_title))
             putExtra(
                 EXTRA_PICKER_DESCRIPTION,
-                resources.getString(R.string.communal_widget_picker_description)
+                resources.getString(R.string.communal_widget_picker_description),
             )
             putParcelableArrayListExtra(EXTRA_ADDED_APP_WIDGETS_KEY, excludeList)
         }
diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModel.kt
new file mode 100644
index 0000000..e35fdfe
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModel.kt
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2024 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.systemui.communal.ui.viewmodel
+
+import com.android.compose.animation.scene.Swipe
+import com.android.compose.animation.scene.UserAction
+import com.android.compose.animation.scene.UserActionResult
+import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor
+import com.android.systemui.scene.shared.model.SceneFamilies
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.scene.ui.viewmodel.UserActionsViewModel
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.shade.shared.model.ShadeMode
+import com.android.systemui.shade.ui.viewmodel.dualShadeActions
+import com.android.systemui.shade.ui.viewmodel.singleShadeActions
+import com.android.systemui.shade.ui.viewmodel.splitShadeActions
+import com.android.systemui.utils.coroutines.flow.flatMapLatestConflated
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.map
+
+/** Provides scene container user actions and results. */
+class CommunalUserActionsViewModel
+@AssistedInject
+constructor(
+    private val deviceUnlockedInteractor: DeviceUnlockedInteractor,
+    private val shadeInteractor: ShadeInteractor,
+) : UserActionsViewModel() {
+
+    override suspend fun hydrateActions(setActions: (Map<UserAction, UserActionResult>) -> Unit) {
+        shadeInteractor.isShadeTouchable
+            .flatMapLatestConflated { isShadeTouchable ->
+                if (!isShadeTouchable) {
+                    flowOf(emptyMap())
+                } else {
+                    combine(
+                        deviceUnlockedInteractor.deviceUnlockStatus.map { it.isUnlocked },
+                        shadeInteractor.shadeMode,
+                    ) { isDeviceUnlocked, shadeMode ->
+                        buildList {
+                                val bouncerOrGone =
+                                    if (isDeviceUnlocked) Scenes.Gone else Scenes.Bouncer
+                                add(Swipe.Up to bouncerOrGone)
+
+                                // "Home" is either Lockscreen, or Gone - if the device is entered.
+                                add(Swipe.End to SceneFamilies.Home)
+
+                                addAll(
+                                    when (shadeMode) {
+                                        ShadeMode.Single -> singleShadeActions()
+                                        ShadeMode.Split -> splitShadeActions()
+                                        ShadeMode.Dual -> dualShadeActions()
+                                    }
+                                )
+                            }
+                            .associate { it }
+                    }
+                }
+            }
+            .collect { setActions(it) }
+    }
+
+    @AssistedFactory
+    interface Factory {
+        fun create(): CommunalUserActionsViewModel
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModel.kt
new file mode 100644
index 0000000..87fcdd7
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModel.kt
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2024 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.systemui.communal.ui.viewmodel
+
+import androidx.compose.foundation.gestures.AnchoredDraggableState
+import androidx.compose.foundation.gestures.DraggableAnchors
+import androidx.compose.runtime.snapshotFlow
+import com.android.app.tracing.coroutines.coroutineScope
+import com.android.systemui.lifecycle.ExclusiveActivatable
+import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.merge
+import kotlinx.coroutines.flow.onEach
+
+enum class DragHandle {
+    TOP,
+    BOTTOM,
+}
+
+data class ResizeInfo(
+    /**
+     * The number of spans to resize by. A positive number indicates expansion, whereas a negative
+     * number indicates shrinking.
+     */
+    val spans: Int,
+    /** The drag handle which was used to resize the element. */
+    val fromHandle: DragHandle,
+) {
+    /** Whether we are expanding. If false, then we are shrinking. */
+    val isExpanding = spans > 0
+}
+
+class ResizeableItemFrameViewModel : ExclusiveActivatable() {
+    private data class GridLayoutInfo(
+        val minSpan: Int,
+        val maxSpan: Int,
+        val heightPerSpanPx: Float,
+        val verticalItemSpacingPx: Float,
+        val currentRow: Int,
+        val currentSpan: Int,
+    )
+
+    /**
+     * The layout information necessary in order to calculate the pixel offsets of the drag anchor
+     * points.
+     */
+    private val gridLayoutInfo = MutableStateFlow<GridLayoutInfo?>(null)
+
+    val topDragState = AnchoredDraggableState(0, DraggableAnchors { 0 at 0f })
+    val bottomDragState = AnchoredDraggableState(0, DraggableAnchors { 0 at 0f })
+
+    /** Emits a [ResizeInfo] when the element is resized using a drag gesture. */
+    val resizeInfo: Flow<ResizeInfo> =
+        merge(
+                snapshotFlow { topDragState.settledValue }.map { ResizeInfo(-it, DragHandle.TOP) },
+                snapshotFlow { bottomDragState.settledValue }
+                    .map { ResizeInfo(it, DragHandle.BOTTOM) },
+            )
+            .filter { it.spans != 0 }
+            .distinctUntilChanged()
+
+    /**
+     * Sets the necessary grid layout information needed for calculating the pixel offsets of the
+     * drag anchors.
+     */
+    fun setGridLayoutInfo(
+        verticalItemSpacingPx: Float,
+        verticalContentPaddingPx: Float,
+        viewportHeightPx: Int,
+        maxItemSpan: Int,
+        minItemSpan: Int,
+        currentRow: Int?,
+        currentSpan: Int?,
+    ) {
+        if (currentSpan == null || currentRow == null) {
+            gridLayoutInfo.value = null
+            return
+        }
+        require(maxItemSpan >= minItemSpan) {
+            "Maximum item span of $maxItemSpan cannot be less than the minimum span of $minItemSpan"
+        }
+        require(minItemSpan in 1..maxItemSpan) {
+            "Minimum span must be between 1 and $maxItemSpan, but was $minItemSpan"
+        }
+        require(currentSpan % minItemSpan == 0) {
+            "Current span of $currentSpan is not a multiple of the minimum span of $minItemSpan"
+        }
+        val availableHeight = viewportHeightPx - verticalContentPaddingPx
+        val totalSpacing = verticalItemSpacingPx * ((maxItemSpan / minItemSpan) - 1)
+        val heightPerSpanPx = (availableHeight - totalSpacing) / maxItemSpan
+        gridLayoutInfo.value =
+            GridLayoutInfo(
+                minSpan = minItemSpan,
+                maxSpan = maxItemSpan,
+                heightPerSpanPx = heightPerSpanPx,
+                verticalItemSpacingPx = verticalItemSpacingPx,
+                currentRow = currentRow,
+                currentSpan = currentSpan,
+            )
+    }
+
+    private fun calculateAnchorsForHandle(
+        handle: DragHandle,
+        layoutInfo: GridLayoutInfo?,
+    ): DraggableAnchors<Int> {
+
+        if (layoutInfo == null || !isDragAllowed(handle, layoutInfo)) {
+            return DraggableAnchors { 0 at 0f }
+        }
+
+        val (
+            minItemSpan,
+            maxItemSpan,
+            heightPerSpanPx,
+            verticalSpacingPx,
+            currentRow,
+            currentSpan,
+        ) = layoutInfo
+
+        // The maximum row this handle can be dragged to.
+        val maxRow =
+            if (handle == DragHandle.TOP) {
+                (currentRow + currentSpan - minItemSpan).coerceAtLeast(0)
+            } else {
+                maxItemSpan
+            }
+
+        // The minimum row this handle can be dragged to.
+        val minRow =
+            if (handle == DragHandle.TOP) {
+                0
+            } else {
+                (currentRow + minItemSpan).coerceAtMost(maxItemSpan)
+            }
+
+        // The current row position of this handle
+        val currentPosition = if (handle == DragHandle.TOP) currentRow else currentRow + currentSpan
+
+        return DraggableAnchors {
+            for (targetRow in minRow..maxRow step minItemSpan) {
+                val diff = targetRow - currentPosition
+                val spacing = diff / minItemSpan * verticalSpacingPx
+                diff at diff * heightPerSpanPx + spacing
+            }
+        }
+    }
+
+    private fun isDragAllowed(handle: DragHandle, layoutInfo: GridLayoutInfo): Boolean {
+        val minItemSpan = layoutInfo.minSpan
+        val maxItemSpan = layoutInfo.maxSpan
+        val currentRow = layoutInfo.currentRow
+        val currentSpan = layoutInfo.currentSpan
+        val atMinSize = currentSpan == minItemSpan
+
+        // If already at the minimum size and in the first row, item cannot be expanded from the top
+        if (handle == DragHandle.TOP && currentRow == 0 && atMinSize) {
+            return false
+        }
+
+        // If already at the minimum size and occupying the last row, item cannot be expanded from
+        // the
+        // bottom
+        if (handle == DragHandle.BOTTOM && (currentRow + currentSpan) == maxItemSpan && atMinSize) {
+            return false
+        }
+
+        // If at maximum size, item can only be shrunk from the bottom and not the top.
+        if (handle == DragHandle.TOP && currentSpan == maxItemSpan) {
+            return false
+        }
+
+        return true
+    }
+
+    override suspend fun onActivated(): Nothing {
+        coroutineScope("ResizeableItemFrameViewModel.onActivated") {
+            gridLayoutInfo
+                .onEach { layoutInfo ->
+                    topDragState.updateAnchors(
+                        calculateAnchorsForHandle(DragHandle.TOP, layoutInfo)
+                    )
+                    bottomDragState.updateAnchors(
+                        calculateAnchorsForHandle(DragHandle.BOTTOM, layoutInfo)
+                    )
+                }
+                .launchIn(this)
+            awaitCancellation()
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/util/WidgetViewFactory.kt b/packages/SystemUI/src/com/android/systemui/communal/util/WidgetViewFactory.kt
index cafa74f..07a7c7cb 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/util/WidgetViewFactory.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/util/WidgetViewFactory.kt
@@ -43,7 +43,7 @@
     suspend fun createWidget(
         context: Context,
         model: CommunalContentModel.WidgetContent.Widget,
-        size: SizeF,
+        size: SizeF?,
     ): CommunalAppWidgetHostView =
         withContext("$TAG#createWidget", uiBgContext) {
             val view =
@@ -54,14 +54,16 @@
             // Instead of setting the view as the listener directly, we wrap the view in a delegate
             // which ensures the callbacks always get called on the main thread.
             appWidgetHost.setListener(model.appWidgetId, listenerFactory.create(view))
-            view.updateAppWidgetSize(
-                /* newOptions = */ Bundle(),
-                /* minWidth = */ size.width.toInt(),
-                /* minHeight = */ size.height.toInt(),
-                /* maxWidth = */ size.width.toInt(),
-                /* maxHeight = */ size.height.toInt(),
-                /* ignorePadding = */ true,
-            )
+            if (size != null) {
+                view.updateAppWidgetSize(
+                    /* newOptions = */ Bundle(),
+                    /* minWidth = */ size.width.toInt(),
+                    /* minHeight = */ size.height.toInt(),
+                    /* maxWidth = */ size.width.toInt(),
+                    /* maxHeight = */ size.height.toInt(),
+                    /* ignorePadding = */ true,
+                )
+            }
             view
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/complication/dagger/DreamClockTimeComplicationComponent.kt b/packages/SystemUI/src/com/android/systemui/complication/dagger/DreamClockTimeComplicationComponent.kt
index 099e3fc..4b9ac1d 100644
--- a/packages/SystemUI/src/com/android/systemui/complication/dagger/DreamClockTimeComplicationComponent.kt
+++ b/packages/SystemUI/src/com/android/systemui/complication/dagger/DreamClockTimeComplicationComponent.kt
@@ -21,9 +21,10 @@
 import android.view.View
 import android.widget.TextClock
 import com.android.internal.util.Preconditions
-import com.android.systemui.res.R
+import com.android.systemui.Flags
 import com.android.systemui.complication.DreamClockTimeComplication
 import com.android.systemui.complication.DreamClockTimeComplication.DreamClockTimeViewHolder
+import com.android.systemui.res.R
 import dagger.Module
 import dagger.Provides
 import dagger.Subcomponent
@@ -71,9 +72,13 @@
                             /* root = */ null,
                             /* attachToRoot = */ false,
                         ) as TextClock,
-                        "R.layout.dream_overlay_complication_clock_time did not properly inflate"
+                        "R.layout.dream_overlay_complication_clock_time did not properly inflate",
                     )
-                view.setFontVariationSettings(TAG_WEIGHT + WEIGHT)
+                if (Flags.dreamOverlayUpdatedFont()) {
+                    view.setFontVariationSettings("'wght' 600, 'opsz' 96")
+                } else {
+                    view.setFontVariationSettings(TAG_WEIGHT + WEIGHT)
+                }
                 return view
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java
index 5c075c2..a5b2277 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java
@@ -29,6 +29,7 @@
 import com.android.systemui.accessibility.SystemActionsModule;
 import com.android.systemui.accessibility.data.repository.AccessibilityRepositoryModule;
 import com.android.systemui.battery.BatterySaverModule;
+import com.android.systemui.clipboardoverlay.dagger.ClipboardOverlaySuppressionModule;
 import com.android.systemui.display.ui.viewmodel.ConnectingDisplayViewModel;
 import com.android.systemui.dock.DockManager;
 import com.android.systemui.dock.DockManagerImpl;
@@ -55,6 +56,7 @@
 import com.android.systemui.scene.SceneContainerFrameworkModule;
 import com.android.systemui.screenshot.ReferenceScreenshotModule;
 import com.android.systemui.settings.MultiUserUtilsModule;
+import com.android.systemui.settings.UserTracker;
 import com.android.systemui.shade.NotificationShadeWindowControllerImpl;
 import com.android.systemui.shade.ShadeModule;
 import com.android.systemui.startable.Dependencies;
@@ -116,6 +118,7 @@
         AccessibilityRepositoryModule.class,
         AospPolicyModule.class,
         BatterySaverModule.class,
+        ClipboardOverlaySuppressionModule.class,
         CollapsedStatusBarFragmentStartableModule.class,
         ConnectingDisplayViewModel.StartableModule.class,
         DefaultBlueprintModule.class,
@@ -176,9 +179,9 @@
     @Provides
     @SysUISingleton
     static IndividualSensorPrivacyController provideIndividualSensorPrivacyController(
-            SensorPrivacyManager sensorPrivacyManager) {
+            SensorPrivacyManager sensorPrivacyManager, UserTracker userTracker) {
         IndividualSensorPrivacyController spC = new IndividualSensorPrivacyControllerImpl(
-                sensorPrivacyManager);
+                sensorPrivacyManager, userTracker);
         spC.init();
         return spC;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt b/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt
index cbea876..8da4d46 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt
@@ -30,7 +30,7 @@
 import com.android.systemui.dreams.DreamMonitor
 import com.android.systemui.dreams.homecontrols.HomeControlsDreamStartable
 import com.android.systemui.globalactions.GlobalActionsComponent
-import com.android.systemui.inputdevice.tutorial.KeyboardTouchpadTutorialCoreStartable
+import com.android.systemui.haptics.msdl.MSDLCoreStartable
 import com.android.systemui.keyboard.KeyboardUI
 import com.android.systemui.keyboard.PhysicalKeyboardCoreStartable
 import com.android.systemui.keyguard.KeyguardViewConfigurator
@@ -323,4 +323,9 @@
     @IntoMap
     @ClassKey(BatteryControllerStartable::class)
     abstract fun bindsBatteryControllerStartable(impl: BatteryControllerStartable): CoreStartable
+
+    @Binds
+    @IntoMap
+    @ClassKey(MSDLCoreStartable::class)
+    abstract fun bindMSDLCoreStartable(impl: MSDLCoreStartable): CoreStartable
 }
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/SystemUIDeviceEntryFaceAuthInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/SystemUIDeviceEntryFaceAuthInteractor.kt
index 3b5d5a8..b19b2d9 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/SystemUIDeviceEntryFaceAuthInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/SystemUIDeviceEntryFaceAuthInteractor.kt
@@ -114,7 +114,7 @@
                 faceAuthenticationLogger.bouncerVisibilityChanged()
                 runFaceAuth(
                     FaceAuthUiEvent.FACE_AUTH_UPDATED_PRIMARY_BOUNCER_SHOWN,
-                    fallbackToDetect = false
+                    fallbackToDetect = false,
                 )
             }
             .launchIn(applicationScope)
@@ -125,7 +125,7 @@
                 faceAuthenticationLogger.alternateBouncerVisibilityChanged()
                 runFaceAuth(
                     FaceAuthUiEvent.FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN,
-                    fallbackToDetect = false
+                    fallbackToDetect = false,
                 )
             }
             .launchIn(applicationScope)
@@ -153,7 +153,7 @@
                     it.lastWakeReason.powerManagerWakeReason
                 runFaceAuth(
                     FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED,
-                    fallbackToDetect = true
+                    fallbackToDetect = true,
                 )
             }
             .launchIn(applicationScope)
@@ -193,13 +193,16 @@
             .map { (_, curr) -> curr.userInfo.id }
             .sample(isBouncerVisible, ::Pair)
             .onEach { (userId, isBouncerCurrentlyVisible) ->
+                if (!isFaceAuthEnabledAndEnrolled()) {
+                    return@onEach
+                }
                 resetLockedOutState(userId)
                 yield()
                 runFaceAuth(
                     FaceAuthUiEvent.FACE_AUTH_UPDATED_USER_SWITCHING,
                     // Fallback to detection if bouncer is not showing so that we can detect a
                     // face and then show the bouncer to the user if face auth can't run
-                    fallbackToDetect = !isBouncerCurrentlyVisible
+                    fallbackToDetect = !isBouncerCurrentlyVisible,
                 )
             }
             .launchIn(applicationScope)
@@ -210,7 +213,7 @@
                     repository.cancel()
                     runFaceAuth(
                         FaceAuthUiEvent.FACE_AUTH_CAMERA_AVAILABLE_CHANGED,
-                        fallbackToDetect = true
+                        fallbackToDetect = true,
                     )
                 }
             }
@@ -321,7 +324,7 @@
             faceAuthenticationStatusOverride.value =
                 ErrorFaceAuthenticationStatus(
                     BiometricFaceConstants.FACE_ERROR_LOCKOUT_PERMANENT,
-                    context.resources.getString(R.string.keyguard_face_unlock_unavailable)
+                    context.resources.getString(R.string.keyguard_face_unlock_unavailable),
                 )
         } else {
             faceAuthenticationStatusOverride.value = null
diff --git a/packages/SystemUI/src/com/android/systemui/display/DisplayModule.kt b/packages/SystemUI/src/com/android/systemui/display/DisplayModule.kt
index 373279c..462e820 100644
--- a/packages/SystemUI/src/com/android/systemui/display/DisplayModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/display/DisplayModule.kt
@@ -20,6 +20,8 @@
 import com.android.systemui.display.data.repository.DeviceStateRepositoryImpl
 import com.android.systemui.display.data.repository.DisplayRepository
 import com.android.systemui.display.data.repository.DisplayRepositoryImpl
+import com.android.systemui.display.data.repository.FocusedDisplayRepository
+import com.android.systemui.display.data.repository.FocusedDisplayRepositoryImpl
 import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractor
 import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractorImpl
 import dagger.Binds
@@ -39,4 +41,9 @@
     fun bindsDeviceStateRepository(
         deviceStateRepository: DeviceStateRepositoryImpl
     ): DeviceStateRepository
+
+    @Binds
+    fun bindsFocusedDisplayRepository(
+        focusedDisplayRepository: FocusedDisplayRepositoryImpl
+    ): FocusedDisplayRepository
 }
diff --git a/packages/SystemUI/src/com/android/systemui/display/data/repository/FocusedDisplayRepository.kt b/packages/SystemUI/src/com/android/systemui/display/data/repository/FocusedDisplayRepository.kt
new file mode 100644
index 0000000..6fc08f6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/display/data/repository/FocusedDisplayRepository.kt
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2024 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.systemui.display.data.repository
+
+import android.annotation.MainThread
+import android.view.Display.DEFAULT_DISPLAY
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.core.LogLevel
+import com.android.systemui.log.dagger.FocusedDisplayRepoLog
+import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
+import com.android.wm.shell.shared.FocusTransitionListener
+import com.android.wm.shell.shared.ShellTransitions
+import java.util.concurrent.Executor
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.flow.stateIn
+
+/** Repository tracking display focus. */
+interface FocusedDisplayRepository {
+    /** Provides the currently focused display. */
+    val focusedDisplayId: StateFlow<Int>
+}
+
+@SysUISingleton
+@MainThread
+class FocusedDisplayRepositoryImpl
+@Inject
+constructor(
+    @Background val backgroundScope: CoroutineScope,
+    @Background private val backgroundExecutor: Executor,
+    transitions: ShellTransitions,
+    @FocusedDisplayRepoLog logBuffer: LogBuffer,
+) : FocusedDisplayRepository {
+    val focusedTask: Flow<Int> =
+        conflatedCallbackFlow<Int> {
+                val listener =
+                    object : FocusTransitionListener {
+                        override fun onFocusedDisplayChanged(displayId: Int) {
+                            trySend(displayId)
+                        }
+                    }
+                transitions.setFocusTransitionListener(listener, backgroundExecutor)
+                awaitClose { transitions.unsetFocusTransitionListener(listener) }
+            }
+            .onEach {
+                logBuffer.log(
+                    "FocusedDisplayRepository",
+                    LogLevel.INFO,
+                    { str1 = it.toString() },
+                    { "Newly focused display: $str1" },
+                )
+            }
+
+    override val focusedDisplayId: StateFlow<Int>
+        get() = focusedTask.stateIn(backgroundScope, SharingStarted.Eagerly, DEFAULT_DISPLAY)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
index 113e001..83f86a7 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
@@ -65,6 +65,7 @@
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
 import com.android.systemui.navigationbar.gestural.domain.GestureInteractor;
 import com.android.systemui.navigationbar.gestural.domain.TaskMatcher;
+import com.android.systemui.scene.shared.flag.SceneContainerFlag;
 import com.android.systemui.shade.ShadeExpansionChangeEvent;
 import com.android.systemui.touch.TouchInsetManager;
 import com.android.systemui.util.concurrency.DelayableExecutor;
@@ -499,8 +500,11 @@
 
         mDreamOverlayContainerViewController =
                 dreamOverlayComponent.getDreamOverlayContainerViewController();
-        mTouchMonitor = ambientTouchComponent.getTouchMonitor();
-        mTouchMonitor.init();
+
+        if (!SceneContainerFlag.isEnabled()) {
+            mTouchMonitor = ambientTouchComponent.getTouchMonitor();
+            mTouchMonitor.init();
+        }
 
         mStateController.setShouldShowComplications(shouldShowComplications());
 
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/ui/viewmodel/DreamUserActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/dreams/ui/viewmodel/DreamUserActionsViewModel.kt
new file mode 100644
index 0000000..8b6cc8c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/dreams/ui/viewmodel/DreamUserActionsViewModel.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2024 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.systemui.dreams.ui.viewmodel
+
+import com.android.compose.animation.scene.UserAction
+import com.android.compose.animation.scene.UserActionResult
+import com.android.systemui.scene.ui.viewmodel.UserActionsViewModel
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+
+/** Handles user input for the dream scene. */
+class DreamUserActionsViewModel @AssistedInject constructor() : UserActionsViewModel() {
+
+    override suspend fun hydrateActions(setActions: (Map<UserAction, UserActionResult>) -> Unit) {
+        setActions(emptyMap())
+    }
+
+    @AssistedFactory
+    interface Factory {
+        fun create(): DreamUserActionsViewModel
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduStatsInteractor.kt b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduStatsInteractor.kt
index 0e2d9b6..43e39cf 100644
--- a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduStatsInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduStatsInteractor.kt
@@ -30,7 +30,7 @@
 import java.time.Clock
 import javax.inject.Inject
 import kotlin.time.Duration
-import kotlin.time.Duration.Companion.hours
+import kotlin.time.Duration.Companion.days
 import kotlin.time.DurationUnit
 import kotlin.time.toDuration
 import kotlinx.coroutines.CoroutineScope
@@ -64,7 +64,7 @@
             get() =
                 SystemProperties.getLong(
                         "persist.contextual_edu.initial_delay_sec",
-                        /* defaultValue= */ 72.hours.inWholeSeconds
+                        /* defaultValue= */ 7.days.inWholeSeconds,
                     )
                     .toDuration(DurationUnit.SECONDS)
     }
diff --git a/packages/SystemUI/src/com/android/systemui/education/ui/view/ContextualEduDialog.kt b/packages/SystemUI/src/com/android/systemui/education/ui/view/ContextualEduDialog.kt
new file mode 100644
index 0000000..ca92953
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/education/ui/view/ContextualEduDialog.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2024 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.systemui.education.ui.view
+
+import android.app.Dialog
+import android.content.Context
+import android.os.Bundle
+import android.view.Gravity
+import android.view.Window
+import android.view.WindowManager
+import android.widget.ImageView
+import android.widget.TextView
+import com.android.systemui.education.ui.viewmodel.ContextualEduToastViewModel
+import com.android.systemui.res.R
+
+class ContextualEduDialog(context: Context, private val model: ContextualEduToastViewModel) :
+    Dialog(context) {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        setUpWindowProperties()
+        setWindowPosition()
+        // title is used for a11y announcement
+        window?.setTitle(context.getString(R.string.contextual_education_dialog_title))
+        setContentView(R.layout.contextual_edu_dialog)
+        setContent()
+        super.onCreate(savedInstanceState)
+    }
+
+    private fun setContent() {
+        findViewById<TextView>(R.id.edu_message)?.let { it.text = model.message }
+        findViewById<ImageView>(R.id.edu_icon)?.let { it.setImageResource(model.icon) }
+    }
+
+    private fun setUpWindowProperties() {
+        window?.apply {
+            requestFeature(Window.FEATURE_NO_TITLE)
+            setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG)
+            clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
+            setBackgroundDrawableResource(android.R.color.transparent)
+        }
+        setCanceledOnTouchOutside(false)
+    }
+
+    private fun setWindowPosition() {
+        window?.apply {
+            setGravity(Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL)
+            this.attributes =
+                WindowManager.LayoutParams().apply {
+                    width = WindowManager.LayoutParams.WRAP_CONTENT
+                    height = WindowManager.LayoutParams.WRAP_CONTENT
+                    copyFrom(attributes)
+                    y =
+                        context.resources.getDimensionPixelSize(
+                            R.dimen.contextual_edu_dialog_bottom_margin
+                        )
+                }
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/education/ui/view/ContextualEduUiCoordinator.kt b/packages/SystemUI/src/com/android/systemui/education/ui/view/ContextualEduUiCoordinator.kt
index e62b26b..913ecdd 100644
--- a/packages/SystemUI/src/com/android/systemui/education/ui/view/ContextualEduUiCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/education/ui/view/ContextualEduUiCoordinator.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.education.ui.view
 
+import android.app.Dialog
 import android.app.Notification
 import android.app.NotificationChannel
 import android.app.NotificationManager
@@ -24,7 +25,6 @@
 import android.content.Intent
 import android.os.Bundle
 import android.os.UserHandle
-import android.widget.Toast
 import androidx.core.app.NotificationCompat
 import com.android.systemui.CoreStartable
 import com.android.systemui.dagger.SysUISingleton
@@ -49,7 +49,7 @@
     private val viewModel: ContextualEduViewModel,
     private val context: Context,
     private val notificationManager: NotificationManager,
-    private val createToast: (String) -> Toast
+    private val createDialog: (ContextualEduToastViewModel) -> Dialog,
 ) : CoreStartable {
 
     companion object {
@@ -69,16 +69,23 @@
         viewModel,
         context,
         notificationManager,
-        createToast = { message -> Toast.makeText(context, message, Toast.LENGTH_LONG) }
+        createDialog = { model -> ContextualEduDialog(context, model) },
     )
 
+    var dialog: Dialog? = null
+
     override fun start() {
         createEduNotificationChannel()
         applicationScope.launch {
             viewModel.eduContent.collect { contentModel ->
-                when (contentModel) {
-                    is ContextualEduToastViewModel -> showToast(contentModel)
-                    is ContextualEduNotificationViewModel -> showNotification(contentModel)
+                if (contentModel != null) {
+                    when (contentModel) {
+                        is ContextualEduToastViewModel -> showDialog(contentModel)
+                        is ContextualEduNotificationViewModel -> showNotification(contentModel)
+                    }
+                } else {
+                    dialog?.dismiss()
+                    dialog = null
                 }
             }
         }
@@ -95,9 +102,9 @@
         notificationManager.createNotificationChannel(channel)
     }
 
-    private fun showToast(model: ContextualEduToastViewModel) {
-        val toast = createToast(model.message)
-        toast.show()
+    private fun showDialog(model: ContextualEduToastViewModel) {
+        dialog = createDialog(model)
+        dialog?.show()
     }
 
     private fun showNotification(model: ContextualEduNotificationViewModel) {
diff --git a/packages/SystemUI/src/com/android/systemui/education/ui/viewmodel/ContextualEduContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/education/ui/viewmodel/ContextualEduContentViewModel.kt
index 632b250..5a02cda 100644
--- a/packages/SystemUI/src/com/android/systemui/education/ui/viewmodel/ContextualEduContentViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/education/ui/viewmodel/ContextualEduContentViewModel.kt
@@ -21,8 +21,11 @@
 data class ContextualEduNotificationViewModel(
     val title: String,
     val message: String,
-    override val userId: Int
+    override val userId: Int,
 ) : ContextualEduContentViewModel(userId)
 
-data class ContextualEduToastViewModel(val message: String, override val userId: Int) :
-    ContextualEduContentViewModel(userId)
+data class ContextualEduToastViewModel(
+    val message: String,
+    val icon: Int,
+    override val userId: Int,
+) : ContextualEduContentViewModel(userId)
diff --git a/packages/SystemUI/src/com/android/systemui/education/ui/viewmodel/ContextualEduViewModel.kt b/packages/SystemUI/src/com/android/systemui/education/ui/viewmodel/ContextualEduViewModel.kt
index cd4a8ad..7417a70 100644
--- a/packages/SystemUI/src/com/android/systemui/education/ui/viewmodel/ContextualEduViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/education/ui/viewmodel/ContextualEduViewModel.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.education.ui.viewmodel
 
 import android.content.res.Resources
+import android.view.accessibility.AccessibilityManager
 import com.android.systemui.contextualeducation.GestureType.ALL_APPS
 import com.android.systemui.contextualeducation.GestureType.BACK
 import com.android.systemui.contextualeducation.GestureType.HOME
@@ -27,23 +28,63 @@
 import com.android.systemui.education.shared.model.EducationInfo
 import com.android.systemui.education.shared.model.EducationUiType
 import com.android.systemui.res.R
+import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper
 import javax.inject.Inject
+import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flow
 import kotlinx.coroutines.flow.map
 
+@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
 @SysUISingleton
 class ContextualEduViewModel
 @Inject
-constructor(@Main private val resources: Resources, interactor: KeyboardTouchpadEduInteractor) {
-    val eduContent: Flow<ContextualEduContentViewModel> =
-        interactor.educationTriggered.filterNotNull().map {
-            if (it.educationUiType == EducationUiType.Notification) {
-                ContextualEduNotificationViewModel(getEduTitle(it), getEduContent(it), it.userId)
-            } else {
-                ContextualEduToastViewModel(getEduContent(it), it.userId)
+constructor(
+    @Main private val resources: Resources,
+    interactor: KeyboardTouchpadEduInteractor,
+    private val accessibilityManagerWrapper: AccessibilityManagerWrapper,
+) {
+
+    companion object {
+        const val DEFAULT_DIALOG_TIMEOUT_MILLIS = 5000
+    }
+
+    private val timeoutMillis: Long
+        get() =
+            accessibilityManagerWrapper
+                .getRecommendedTimeoutMillis(
+                    DEFAULT_DIALOG_TIMEOUT_MILLIS,
+                    AccessibilityManager.FLAG_CONTENT_TEXT,
+                )
+                .toLong()
+
+    val eduContent: Flow<ContextualEduContentViewModel?> =
+        interactor.educationTriggered
+            .filterNotNull()
+            .map {
+                if (it.educationUiType == EducationUiType.Notification) {
+                    ContextualEduNotificationViewModel(
+                        getEduTitle(it),
+                        getEduContent(it),
+                        it.userId,
+                    )
+                } else {
+                    ContextualEduToastViewModel(getEduContent(it), getEduIcon(it), it.userId)
+                }
+            }
+            .timeout(timeoutMillis, emitAfterTimeout = null)
+
+    private fun <T> Flow<T>.timeout(timeoutMillis: Long, emitAfterTimeout: T): Flow<T> {
+        return flatMapLatest {
+            flow {
+                emit(it)
+                delay(timeoutMillis)
+                emit(emitAfterTimeout)
             }
         }
+    }
 
     private fun getEduContent(educationInfo: EducationInfo): String {
         val resourceId =
@@ -77,4 +118,13 @@
 
         return resources.getString(resourceId)
     }
+
+    private fun getEduIcon(educationInfo: EducationInfo): Int {
+        return when (educationInfo.gestureType) {
+            BACK -> R.drawable.contextual_edu_swipe_back
+            HOME,
+            OVERVIEW -> R.drawable.contextual_edu_swipe_up
+            ALL_APPS -> R.drawable.contextual_edu_all_apps
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt b/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt
index 0b775ab..47f0ecf 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt
+++ b/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt
@@ -34,10 +34,14 @@
 import com.android.systemui.keyguard.MigrateClocksToBlueprint
 import com.android.systemui.scene.shared.flag.SceneContainerFlag
 import com.android.systemui.shade.shared.flag.DualShade
+import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
+import com.android.systemui.statusbar.core.StatusBarSimpleFragment
 import com.android.systemui.statusbar.notification.collection.SortBySectionTimeFlag
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix
+import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor
 import com.android.systemui.statusbar.notification.interruption.VisualInterruptionRefactor
 import com.android.systemui.statusbar.notification.shared.NotificationAvalancheSuppression
-import com.android.systemui.statusbar.notification.shared.NotificationMinimalismPrototype
+import com.android.systemui.statusbar.notification.shared.NotificationMinimalism
 import com.android.systemui.statusbar.notification.shared.NotificationThrottleHun
 import com.android.systemui.statusbar.notification.shared.PriorityPeopleSection
 import javax.inject.Inject
@@ -55,7 +59,9 @@
         // Internal notification frontend dependencies
         NotificationAvalancheSuppression.token dependsOn VisualInterruptionRefactor.token
         PriorityPeopleSection.token dependsOn SortBySectionTimeFlag.token
-        NotificationMinimalismPrototype.token dependsOn NotificationThrottleHun.token
+        NotificationMinimalism.token dependsOn NotificationThrottleHun.token
+        ModesEmptyShadeFix.token dependsOn FooterViewRefactor.token
+        ModesEmptyShadeFix.token dependsOn modesUi
 
         // SceneContainer dependencies
         SceneContainerFlag.getFlagDependencies().forEach { (alpha, beta) -> alpha dependsOn beta }
@@ -69,6 +75,8 @@
         // Status bar chip dependencies
         statusBarCallChipNotificationIconToken dependsOn statusBarUseReposForCallChipToken
         statusBarCallChipNotificationIconToken dependsOn statusBarScreenSharingChipsToken
+
+        StatusBarConnectedDisplays.token dependsOn StatusBarSimpleFragment.token
     }
 
     private inline val politeNotifications
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
index 493afde..aa1873c 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
@@ -2298,9 +2298,11 @@
                     }
 
                     @Override
-                    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
+                    public boolean onScroll(@Nullable MotionEvent e1, MotionEvent e2,
+                            float distanceX,
                             float distanceY) {
                         if (distanceY < 0 && distanceY > distanceX
+                                && e1 != null
                                 && e1.getY() <= mStatusBarWindowController.getStatusBarHeight()) {
                             // Downwards scroll from top
                             openShadeAndDismiss();
@@ -2310,9 +2312,11 @@
                     }
 
                     @Override
-                    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
+                    public boolean onFling(@Nullable MotionEvent e1, MotionEvent e2,
+                            float velocityX,
                             float velocityY) {
                         if (velocityY > 0 && Math.abs(velocityY) > Math.abs(velocityX)
+                                && e1 != null
                                 && e1.getY() <= mStatusBarWindowController.getStatusBarHeight()) {
                             // Downwards fling from top
                             openShadeAndDismiss();
diff --git a/packages/SystemUI/src/com/android/systemui/haptics/msdl/MSDLCoreStartable.kt b/packages/SystemUI/src/com/android/systemui/haptics/msdl/MSDLCoreStartable.kt
new file mode 100644
index 0000000..58736c60
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/haptics/msdl/MSDLCoreStartable.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2024 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.systemui.haptics.msdl
+
+import com.android.systemui.CoreStartable
+import com.android.systemui.dagger.SysUISingleton
+import com.google.android.msdl.domain.MSDLPlayer
+import com.google.android.msdl.logging.MSDLHistoryLogger
+import java.io.PrintWriter
+import javax.inject.Inject
+
+@SysUISingleton
+class MSDLCoreStartable @Inject constructor(private val msdlPlayer: MSDLPlayer) : CoreStartable {
+    override fun start() {}
+
+    override fun dump(pw: PrintWriter, args: Array<out String>) {
+        pw.println("MSDLPlayer history of the last ${MSDLHistoryLogger.HISTORY_SIZE} events:")
+        msdlPlayer.getHistory().forEach { event -> pw.println("$event") }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/data/repository/InputDeviceRepository.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/data/repository/InputDeviceRepository.kt
index 5a008bd..7711c48 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/data/repository/InputDeviceRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/data/repository/InputDeviceRepository.kt
@@ -38,7 +38,7 @@
 constructor(
     @Background private val backgroundHandler: Handler,
     @Background private val backgroundScope: CoroutineScope,
-    private val inputManager: InputManager
+    private val inputManager: InputManager,
 ) {
 
     sealed interface DeviceChange
@@ -50,11 +50,11 @@
     data object FreshStart : DeviceChange
 
     /**
-     * Emits collection of all currently connected keyboards and what was the last [DeviceChange].
-     * It emits collection so that every new subscriber to this SharedFlow can get latest state of
-     * all keyboards. Otherwise we might get into situation where subscriber timing on
-     * initialization matter and later subscriber will only get latest device and will miss all
-     * previous devices.
+     * Emits collection of all currently connected input devices and what was the last
+     * [DeviceChange]. It emits collection so that every new subscriber to this SharedFlow can get
+     * latest state of all input devices. Otherwise we might get into situation where subscriber
+     * timing on initialization matter and later subscriber will only get latest device and will
+     * miss all previous devices.
      */
     // TODO(b/351984587): Replace with StateFlow
     @SuppressLint("SharedFlowCreation")
@@ -79,11 +79,7 @@
                 inputManager.registerInputDeviceListener(listener, backgroundHandler)
                 awaitClose { inputManager.unregisterInputDeviceListener(listener) }
             }
-            .shareIn(
-                scope = backgroundScope,
-                started = SharingStarted.Lazily,
-                replay = 1,
-            )
+            .shareIn(scope = backgroundScope, started = SharingStarted.Lazily, replay = 1)
 
     private fun <T> SendChannel<T>.sendWithLogging(element: T) {
         trySendWithFailureLogging(element, TAG)
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/KeyboardTouchpadTutorialMetricsLogger.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/KeyboardTouchpadTutorialMetricsLogger.kt
new file mode 100644
index 0000000..144c5ead
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/KeyboardTouchpadTutorialMetricsLogger.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2024 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.systemui.inputdevice.tutorial
+
+import com.android.systemui.inputdevice.tutorial.ui.view.KeyboardTouchpadTutorialActivity.Companion.INTENT_TUTORIAL_ENTRY_POINT_CONTEXTUAL_EDU
+import com.android.systemui.inputdevice.tutorial.ui.view.KeyboardTouchpadTutorialActivity.Companion.INTENT_TUTORIAL_ENTRY_POINT_SCHEDULER
+import com.android.systemui.inputdevice.tutorial.ui.view.KeyboardTouchpadTutorialActivity.Companion.INTENT_TUTORIAL_TYPE_KEYBOARD
+import com.android.systemui.inputdevice.tutorial.ui.view.KeyboardTouchpadTutorialActivity.Companion.INTENT_TUTORIAL_TYPE_TOUCHPAD
+import com.android.systemui.shared.system.SysUiStatsLog
+import javax.inject.Inject
+
+class KeyboardTouchpadTutorialMetricsLogger @Inject constructor() {
+
+    fun logPeripheralTutorialLaunched(entryPointExtra: String?, tutorialTypeExtra: String?) {
+        val entryPoint =
+            when (entryPointExtra) {
+                INTENT_TUTORIAL_ENTRY_POINT_SCHEDULER ->
+                    SysUiStatsLog.PERIPHERAL_TUTORIAL_LAUNCHED__ENTRY_POINT__SCHEDULED
+                INTENT_TUTORIAL_ENTRY_POINT_CONTEXTUAL_EDU ->
+                    SysUiStatsLog.PERIPHERAL_TUTORIAL_LAUNCHED__ENTRY_POINT__CONTEXTUAL_EDU
+                else -> SysUiStatsLog.PERIPHERAL_TUTORIAL_LAUNCHED__ENTRY_POINT__APP
+            }
+
+        val tutorialType =
+            when (tutorialTypeExtra) {
+                INTENT_TUTORIAL_TYPE_KEYBOARD ->
+                    SysUiStatsLog.PERIPHERAL_TUTORIAL_LAUNCHED__TUTORIAL_TYPE__KEYBOARD
+                INTENT_TUTORIAL_TYPE_TOUCHPAD ->
+                    SysUiStatsLog.PERIPHERAL_TUTORIAL_LAUNCHED__TUTORIAL_TYPE__TOUCHPAD
+                else -> SysUiStatsLog.PERIPHERAL_TUTORIAL_LAUNCHED__TUTORIAL_TYPE__BOTH
+            }
+
+        SysUiStatsLog.write(SysUiStatsLog.PERIPHERAL_TUTORIAL_LAUNCHED, entryPoint, tutorialType)
+    }
+
+    fun logPeripheralTutorialLaunchedFromSettings() {
+        val entryPoint = SysUiStatsLog.PERIPHERAL_TUTORIAL_LAUNCHED__ENTRY_POINT__SETTINGS
+        val tutorialType = SysUiStatsLog.PERIPHERAL_TUTORIAL_LAUNCHED__TUTORIAL_TYPE__TOUCHPAD
+        SysUiStatsLog.write(SysUiStatsLog.PERIPHERAL_TUTORIAL_LAUNCHED, entryPoint, tutorialType)
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt
index 5d9dda3..f2afaee 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt
@@ -31,6 +31,8 @@
 import com.android.systemui.inputdevice.tutorial.domain.interactor.TutorialSchedulerInteractor.Companion.TAG
 import com.android.systemui.inputdevice.tutorial.domain.interactor.TutorialSchedulerInteractor.TutorialType
 import com.android.systemui.inputdevice.tutorial.ui.view.KeyboardTouchpadTutorialActivity
+import com.android.systemui.inputdevice.tutorial.ui.view.KeyboardTouchpadTutorialActivity.Companion.INTENT_TUTORIAL_ENTRY_POINT_KEY
+import com.android.systemui.inputdevice.tutorial.ui.view.KeyboardTouchpadTutorialActivity.Companion.INTENT_TUTORIAL_ENTRY_POINT_SCHEDULER
 import com.android.systemui.inputdevice.tutorial.ui.view.KeyboardTouchpadTutorialActivity.Companion.INTENT_TUTORIAL_TYPE_BOTH
 import com.android.systemui.inputdevice.tutorial.ui.view.KeyboardTouchpadTutorialActivity.Companion.INTENT_TUTORIAL_TYPE_KEY
 import com.android.systemui.inputdevice.tutorial.ui.view.KeyboardTouchpadTutorialActivity.Companion.INTENT_TUTORIAL_TYPE_KEYBOARD
@@ -48,7 +50,7 @@
     @Background private val backgroundScope: CoroutineScope,
     @Application private val context: Context,
     private val tutorialSchedulerInteractor: TutorialSchedulerInteractor,
-    private val notificationManager: NotificationManager
+    private val notificationManager: NotificationManager,
 ) {
     fun start() {
         backgroundScope.launch {
@@ -68,7 +70,7 @@
         val extras = Bundle()
         extras.putString(
             Notification.EXTRA_SUBSTITUTE_APP_NAME,
-            context.getString(com.android.internal.R.string.android_system_label)
+            context.getString(com.android.internal.R.string.android_system_label),
         )
 
         val info = getNotificationInfo(tutorialType)!!
@@ -91,7 +93,7 @@
             NotificationChannel(
                 CHANNEL_ID,
                 context.getString(com.android.internal.R.string.android_system_label),
-                NotificationManager.IMPORTANCE_DEFAULT
+                NotificationManager.IMPORTANCE_DEFAULT,
             )
         notificationManager.createNotificationChannel(channel)
     }
@@ -100,13 +102,14 @@
         val intent =
             Intent(context, KeyboardTouchpadTutorialActivity::class.java).apply {
                 putExtra(INTENT_TUTORIAL_TYPE_KEY, tutorialType)
+                putExtra(INTENT_TUTORIAL_ENTRY_POINT_KEY, INTENT_TUTORIAL_ENTRY_POINT_SCHEDULER)
                 flags = Intent.FLAG_ACTIVITY_NEW_TASK
             }
         return PendingIntent.getActivity(
             context,
             /* requestCode= */ 0,
             intent,
-            PendingIntent.FLAG_IMMUTABLE
+            PendingIntent.FLAG_IMMUTABLE,
         )
     }
 
@@ -118,13 +121,13 @@
                 NotificationInfo(
                     context.getString(R.string.launch_keyboard_tutorial_notification_title),
                     context.getString(R.string.launch_keyboard_tutorial_notification_content),
-                    INTENT_TUTORIAL_TYPE_KEYBOARD
+                    INTENT_TUTORIAL_TYPE_KEYBOARD,
                 )
             TutorialType.TOUCHPAD ->
                 NotificationInfo(
                     context.getString(R.string.launch_touchpad_tutorial_notification_title),
                     context.getString(R.string.launch_touchpad_tutorial_notification_content),
-                    INTENT_TUTORIAL_TYPE_TOUCHPAD
+                    INTENT_TUTORIAL_TYPE_TOUCHPAD,
                 )
             TutorialType.BOTH ->
                 NotificationInfo(
@@ -134,7 +137,7 @@
                     context.getString(
                         R.string.launch_keyboard_touchpad_tutorial_notification_content
                     ),
-                    INTENT_TUTORIAL_TYPE_BOTH
+                    INTENT_TUTORIAL_TYPE_BOTH,
                 )
             TutorialType.NONE -> null
         }
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionKeyTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionKeyTutorialScreen.kt
index 1aa5ee0..4142be3 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionKeyTutorialScreen.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionKeyTutorialScreen.kt
@@ -37,25 +37,22 @@
 import androidx.compose.ui.input.key.type
 import com.airbnb.lottie.compose.rememberLottieDynamicProperties
 import com.android.compose.theme.LocalAndroidColorScheme
-import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState.FINISHED
-import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState.NOT_STARTED
+import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState.Finished
+import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState.NotStarted
 import com.android.systemui.res.R
 
 @Composable
-fun ActionKeyTutorialScreen(
-    onDoneButtonClicked: () -> Unit,
-    onBack: () -> Unit,
-) {
+fun ActionKeyTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Unit) {
     BackHandler(onBack = onBack)
     val screenConfig = buildScreenConfig()
-    var actionState by remember { mutableStateOf(NOT_STARTED) }
+    var actionState: TutorialActionState by remember { mutableStateOf(NotStarted) }
     val focusRequester = remember { FocusRequester() }
     Box(
         modifier =
             Modifier.fillMaxSize()
                 .onKeyEvent { keyEvent: KeyEvent ->
                     if (keyEvent.key == Key.MetaLeft && keyEvent.type == KeyEventType.KeyUp) {
-                        actionState = FINISHED
+                        actionState = Finished
                     }
                     true
                 }
@@ -81,13 +78,13 @@
                 titleResId = R.string.tutorial_action_key_title,
                 bodyResId = R.string.tutorial_action_key_guidance,
                 titleSuccessResId = R.string.tutorial_action_key_success_title,
-                bodySuccessResId = R.string.tutorial_action_key_success_body
+                bodySuccessResId = R.string.tutorial_action_key_success_body,
             ),
         animations =
             TutorialScreenConfig.Animations(
                 educationResId = R.raw.action_key_edu,
-                successResId = R.raw.action_key_success
-            )
+                successResId = R.raw.action_key_success,
+            ),
     )
 
 @Composable
@@ -101,7 +98,7 @@
             rememberColorFilterProperty(".primaryFixedDim", primaryFixedDim),
             rememberColorFilterProperty(".secondaryFixedDim", secondaryFixedDim),
             rememberColorFilterProperty(".onSecondaryFixed", onSecondaryFixed),
-            rememberColorFilterProperty(".onSecondaryFixedVariant", onSecondaryFixedVariant)
+            rememberColorFilterProperty(".onSecondaryFixedVariant", onSecondaryFixedVariant),
         )
     val screenColors =
         remember(dynamicProperties) {
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionTutorialContent.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionTutorialContent.kt
index f32c94b..73975a0 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionTutorialContent.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionTutorialContent.kt
@@ -61,15 +61,16 @@
 import com.airbnb.lottie.compose.animateLottieCompositionAsState
 import com.airbnb.lottie.compose.rememberLottieComposition
 import com.airbnb.lottie.compose.rememberLottieDynamicProperty
-import com.android.compose.modifiers.background
-import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState.FINISHED
-import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState.IN_PROGRESS
-import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState.NOT_STARTED
+import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState.Finished
+import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState.InProgress
+import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState.NotStarted
 
-enum class TutorialActionState {
-    NOT_STARTED,
-    IN_PROGRESS,
-    FINISHED,
+sealed interface TutorialActionState {
+    data object NotStarted : TutorialActionState
+
+    data class InProgress(val progress: Float = 0f) : TutorialActionState
+
+    data object Finished : TutorialActionState
 }
 
 @Composable
@@ -89,11 +90,11 @@
         Row(modifier = Modifier.fillMaxWidth().weight(1f)) {
             TutorialDescription(
                 titleTextId =
-                    if (actionState == FINISHED) config.strings.titleSuccessResId
+                    if (actionState == Finished) config.strings.titleSuccessResId
                     else config.strings.titleResId,
                 titleColor = config.colors.title,
                 bodyTextId =
-                    if (actionState == FINISHED) config.strings.bodySuccessResId
+                    if (actionState == Finished) config.strings.bodySuccessResId
                     else config.strings.bodyResId,
                 modifier = Modifier.weight(1f),
             )
@@ -104,7 +105,7 @@
                 modifier = Modifier.weight(1f).padding(top = 8.dp),
             )
         }
-        AnimatedVisibility(visible = actionState == FINISHED, enter = fadeIn()) {
+        AnimatedVisibility(visible = actionState == Finished, enter = fadeIn()) {
             DoneButton(onDoneButtonClicked = onDoneButtonClicked)
         }
     }
@@ -142,7 +143,7 @@
         AnimatedContent(
             targetState = actionState,
             transitionSpec = {
-                if (initialState == NOT_STARTED) {
+                if (initialState == NotStarted) {
                     val transitionDurationMillis = 150
                     fadeIn(animationSpec = tween(transitionDurationMillis, easing = LinearEasing))
                         .togetherWith(
@@ -160,17 +161,17 @@
             },
         ) { state ->
             when (state) {
-                NOT_STARTED ->
+                NotStarted ->
                     EducationAnimation(
                         config.animations.educationResId,
                         config.colors.animationColors,
                     )
-                IN_PROGRESS ->
+                is InProgress ->
                     FrozenSuccessAnimation(
                         config.animations.successResId,
                         config.colors.animationColors,
                     )
-                FINISHED ->
+                Finished ->
                     SuccessAnimation(config.animations.successResId, config.colors.animationColors)
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/view/KeyboardTouchpadTutorialActivity.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/view/KeyboardTouchpadTutorialActivity.kt
index c130c6c..29febd3 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/view/KeyboardTouchpadTutorialActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/view/KeyboardTouchpadTutorialActivity.kt
@@ -30,6 +30,7 @@
 import com.android.compose.theme.PlatformTheme
 import com.android.systemui.inputdevice.tutorial.InputDeviceTutorialLogger
 import com.android.systemui.inputdevice.tutorial.InputDeviceTutorialLogger.TutorialContext
+import com.android.systemui.inputdevice.tutorial.KeyboardTouchpadTutorialMetricsLogger
 import com.android.systemui.inputdevice.tutorial.TouchpadTutorialScreensProvider
 import com.android.systemui.inputdevice.tutorial.ui.composable.ActionKeyTutorialScreen
 import com.android.systemui.inputdevice.tutorial.ui.viewmodel.KeyboardTouchpadTutorialViewModel
@@ -51,6 +52,7 @@
     private val viewModelFactoryAssistedProvider: ViewModelFactoryAssistedProvider,
     private val touchpadTutorialScreensProvider: Optional<TouchpadTutorialScreensProvider>,
     private val logger: InputDeviceTutorialLogger,
+    private val metricsLogger: KeyboardTouchpadTutorialMetricsLogger,
 ) : ComponentActivity() {
 
     companion object {
@@ -58,6 +60,9 @@
         const val INTENT_TUTORIAL_TYPE_TOUCHPAD = "touchpad"
         const val INTENT_TUTORIAL_TYPE_KEYBOARD = "keyboard"
         const val INTENT_TUTORIAL_TYPE_BOTH = "both"
+        const val INTENT_TUTORIAL_ENTRY_POINT_KEY = "entry_point"
+        const val INTENT_TUTORIAL_ENTRY_POINT_SCHEDULER = "scheduler"
+        const val INTENT_TUTORIAL_ENTRY_POINT_CONTEXTUAL_EDU = "contextual_edu"
     }
 
     private val vm by
@@ -86,6 +91,10 @@
             PlatformTheme { KeyboardTouchpadTutorialContainer(vm, touchpadTutorialScreensProvider) }
         }
         if (savedInstanceState == null) {
+            metricsLogger.logPeripheralTutorialLaunched(
+                intent.getStringExtra(INTENT_TUTORIAL_ENTRY_POINT_KEY),
+                intent.getStringExtra(INTENT_TUTORIAL_TYPE_KEY),
+            )
             logger.logOpenTutorial(TutorialContext.KEYBOARD_TOUCHPAD_TUTORIAL)
         }
     }
@@ -109,7 +118,7 @@
         ACTION_KEY ->
             ActionKeyTutorialScreen(
                 onDoneButtonClicked = vm::onDoneButtonClicked,
-                onBack = vm::onBack
+                onBack = vm::onBack,
             )
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/CommandLineKeyboardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/CommandLineKeyboardRepository.kt
index f49cfdd..021c069 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/CommandLineKeyboardRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/CommandLineKeyboardRepository.kt
@@ -50,6 +50,8 @@
     private val _newlyConnectedKeyboard: MutableStateFlow<Keyboard?> = MutableStateFlow(null)
     override val newlyConnectedKeyboard: Flow<Keyboard> = _newlyConnectedKeyboard.filterNotNull()
 
+    override val connectedKeyboards: Flow<Set<Keyboard>> = MutableStateFlow(emptySet())
+
     init {
         Log.i(TAG, "initializing shell command $COMMAND")
         commandRegistry.registerCommand(COMMAND) { KeyboardCommand() }
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/KeyboardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/KeyboardRepository.kt
index a20dfa5..3329fe2 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/KeyboardRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/KeyboardRepository.kt
@@ -61,6 +61,9 @@
      */
     val newlyConnectedKeyboard: Flow<Keyboard>
 
+    /** Emits set of currently connected keyboards */
+    val connectedKeyboards: Flow<Set<Keyboard>>
+
     /**
      * Emits [BacklightModel] whenever user changes backlight level from keyboard press. Can only
      * happen when physical keyboard is connected
@@ -74,7 +77,7 @@
 constructor(
     @Background private val backgroundDispatcher: CoroutineDispatcher,
     private val inputManager: InputManager,
-    inputDeviceRepository: InputDeviceRepository
+    inputDeviceRepository: InputDeviceRepository,
 ) : KeyboardRepository {
 
     @FlowPreview
@@ -93,6 +96,13 @@
             .mapNotNull { deviceIdToKeyboard(it) }
             .flowOn(backgroundDispatcher)
 
+    override val connectedKeyboards: Flow<Set<Keyboard>> =
+        inputDeviceRepository.deviceChange
+            .map { (deviceIds, _) -> deviceIds }
+            .map { deviceIds -> deviceIds.filter { isPhysicalFullKeyboard(it) } }
+            .distinctUntilChanged()
+            .map { deviceIds -> deviceIds.mapNotNull { deviceIdToKeyboard(it) }.toSet() }
+
     override val isAnyKeyboardConnected: Flow<Boolean> =
         inputDeviceRepository.deviceChange
             .map { (ids, _) -> ids.any { id -> isPhysicalFullKeyboard(id) } }
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/view/ShortcutHelperActivity.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/view/ShortcutHelperActivity.kt
index b9a16c4..52263ce 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/view/ShortcutHelperActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/view/ShortcutHelperActivity.kt
@@ -18,6 +18,7 @@
 
 import android.content.ActivityNotFoundException
 import android.content.Intent
+import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
 import android.content.res.Configuration
 import android.os.Bundle
 import android.provider.Settings
@@ -125,7 +126,7 @@
     private fun onKeyboardSettingsClicked() {
         try {
             startActivityAsUser(
-                Intent(Settings.ACTION_HARD_KEYBOARD_SETTINGS),
+                Intent(Settings.ACTION_HARD_KEYBOARD_SETTINGS).addFlags(FLAG_ACTIVITY_NEW_TASK),
                 userTracker.userHandle,
             )
         } catch (e: ActivityNotFoundException) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
index 68a252b..654c763 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
@@ -515,7 +515,13 @@
     }
 
     protected void notifyChange() {
-        mBgHandler.post(() -> mContentResolver.notifyChange(mSliceUri, null /* observer */));
+        mBgHandler.post(() -> {
+            try {
+                mContentResolver.notifyChange(mSliceUri, null /* observer */);
+            } catch (Exception e) {
+                Log.e(TAG, "Error on mContentResolver.notifyChange()", e);
+            }
+        });
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt
index 416eaba..063adc8 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt
@@ -63,6 +63,7 @@
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.statusbar.KeyguardIndicationController
 import com.android.systemui.statusbar.VibratorHelper
+import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationLockscreenScrimViewModel
 import com.android.systemui.statusbar.phone.ScreenOffAnimationController
 import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
 import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator
@@ -102,6 +103,7 @@
     private val keyguardClockViewModel: KeyguardClockViewModel,
     private val smartspaceViewModel: KeyguardSmartspaceViewModel,
     private val lockscreenContentViewModelFactory: LockscreenContentViewModel.Factory,
+    private val notificationScrimViewModelFactory: NotificationLockscreenScrimViewModel.Factory,
     private val lockscreenSceneBlueprintsLazy: Lazy<Set<LockscreenSceneBlueprint>>,
     private val clockInteractor: KeyguardClockInteractor,
     private val keyguardViewMediator: KeyguardViewMediator,
@@ -207,6 +209,7 @@
     private fun createLockscreen(
         context: Context,
         viewModelFactory: LockscreenContentViewModel.Factory,
+        notificationScrimViewModelFactory: NotificationLockscreenScrimViewModel.Factory,
         blueprints: Set<@JvmSuppressWildcards LockscreenSceneBlueprint>,
     ): View {
         val sceneBlueprints =
@@ -222,6 +225,8 @@
                         with(
                             LockscreenContent(
                                 viewModelFactory = viewModelFactory,
+                                notificationScrimViewModelFactory =
+                                    notificationScrimViewModelFactory,
                                 blueprints = sceneBlueprints,
                                 clockInteractor = clockInteractor,
                             )
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 0a38ce0..2052459 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -147,6 +147,7 @@
 import com.android.systemui.flags.SystemPropertiesHelper;
 import com.android.systemui.keyguard.dagger.KeyguardModule;
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionBootInteractor;
 import com.android.systemui.keyguard.shared.model.TransitionStep;
 import com.android.systemui.log.SessionTracker;
 import com.android.systemui.navigationbar.NavigationModeController;
@@ -177,6 +178,7 @@
 import com.android.systemui.util.settings.SystemSettings;
 import com.android.systemui.util.time.SystemClock;
 import com.android.systemui.wallpapers.data.repository.WallpaperRepository;
+import com.android.window.flags.Flags;
 import com.android.wm.shell.keyguard.KeyguardTransitions;
 
 import dagger.Lazy;
@@ -235,6 +237,9 @@
  */
 public class KeyguardViewMediator implements CoreStartable, Dumpable,
         StatusBarStateController.StateListener {
+
+    private static final boolean ENABLE_NEW_KEYGUARD_SHELL_TRANSITIONS =
+            Flags.ensureKeyguardDoesTransitionStarting();
     private static final int KEYGUARD_DISPLAY_TIMEOUT_DELAY_DEFAULT = 30000;
     private static final long KEYGUARD_DONE_PENDING_TIMEOUT_MS = 3000;
 
@@ -265,6 +270,7 @@
     private static final int NOTIFY_STARTED_GOING_TO_SLEEP = 17;
     private static final int SYSTEM_READY = 18;
     private static final int CANCEL_KEYGUARD_EXIT_ANIM = 19;
+    private static final int BOOT_INTERACTOR = 20;
 
     /** Enum for reasons behind updating wakeAndUnlock state. */
     @Retention(RetentionPolicy.SOURCE)
@@ -1390,6 +1396,7 @@
     private final DozeParameters mDozeParameters;
     private final SelectedUserInteractor mSelectedUserInteractor;
     private final KeyguardInteractor mKeyguardInteractor;
+    private final KeyguardTransitionBootInteractor mTransitionBootInteractor;
     @VisibleForTesting
     protected FoldGracePeriodProvider mFoldGracePeriodProvider =
             new FoldGracePeriodProvider();
@@ -1484,6 +1491,7 @@
             Lazy<WindowManagerLockscreenVisibilityManager> wmLockscreenVisibilityManager,
             SelectedUserInteractor selectedUserInteractor,
             KeyguardInteractor keyguardInteractor,
+            KeyguardTransitionBootInteractor transitionBootInteractor,
             WindowManagerOcclusionManager wmOcclusionManager) {
         mContext = context;
         mUserTracker = userTracker;
@@ -1524,6 +1532,7 @@
         mDozeParameters = dozeParameters;
         mSelectedUserInteractor = selectedUserInteractor;
         mKeyguardInteractor = keyguardInteractor;
+        mTransitionBootInteractor = transitionBootInteractor;
 
         mStatusBarStateController = statusBarStateController;
         statusBarStateController.addCallback(this);
@@ -1678,6 +1687,8 @@
             adjustStatusBarLocked();
             mDreamOverlayStateController.addCallback(mDreamOverlayStateCallback);
 
+            mHandler.obtainMessage(BOOT_INTERACTOR).sendToTarget();
+
             final DreamViewModel dreamViewModel = mDreamViewModel.get();
             final CommunalTransitionViewModel communalViewModel =
                     mCommunalTransitionViewModel.get();
@@ -2705,11 +2716,19 @@
                     message = "SYSTEM_READY";
                     handleSystemReady();
                     break;
+                case BOOT_INTERACTOR:
+                    message = "BOOT_INTERACTOR";
+                    handleBootInteractor();
+                    break;
             }
             Log.d(TAG, "KeyguardViewMediator queue processing message: " + message);
         }
     };
 
+    private void handleBootInteractor() {
+        mTransitionBootInteractor.start();
+    }
+
     private void tryKeyguardDone() {
         if (DEBUG) {
             Log.d(TAG, "tryKeyguardDone: pending - " + mKeyguardDonePending + ", animRan - "
@@ -2850,9 +2869,14 @@
                 return;
             }
 
-            try {
-                mActivityTaskManagerService.setLockScreenShown(showing, aodShowing);
-            } catch (RemoteException ignored) {
+            if (ENABLE_NEW_KEYGUARD_SHELL_TRANSITIONS) {
+                mKeyguardTransitions.startKeyguardTransition(showing, aodShowing);
+            } else {
+                try {
+
+                    mActivityTaskManagerService.setLockScreenShown(showing, aodShowing);
+                } catch (RemoteException ignored) {
+                }
             }
         });
     }
@@ -2983,18 +3007,23 @@
 
             // Handled in WmLockscreenVisibilityManager if flag is enabled.
             if (!KeyguardWmStateRefactor.isEnabled()) {
-                    // Don't actually hide the Keyguard at the moment, wait for window manager 
-                    // until it tells us it's safe to do so with startKeyguardExitAnimation.
-		    // Posting to mUiOffloadThread to ensure that calls to ActivityTaskManager 
-		    // will be in order.
-		    final int keyguardFlag = flags;
-		    mUiBgExecutor.execute(() -> {
-		        try {
-		            mActivityTaskManagerService.keyguardGoingAway(keyguardFlag);
-		        } catch (RemoteException e) {
-		            Log.e(TAG, "Error while calling WindowManager", e);
-		        }
-		    });
+                // Don't actually hide the Keyguard at the moment, wait for window manager
+                // until it tells us it's safe to do so with startKeyguardExitAnimation.
+                // Posting to mUiOffloadThread to ensure that calls to ActivityTaskManager
+                // will be in order.
+                final int keyguardFlag = flags;
+                mUiBgExecutor.execute(() -> {
+                    if (ENABLE_NEW_KEYGUARD_SHELL_TRANSITIONS) {
+                        mKeyguardTransitions.startKeyguardTransition(
+                                false /* keyguardShowing */, false /* aodShowing */);
+                        return;
+                    }
+                    try {
+                        mActivityTaskManagerService.keyguardGoingAway(keyguardFlag);
+                    } catch (RemoteException e) {
+                        Log.e(TAG, "Error while calling WindowManager", e);
+                    }
+                });
             }
 
             Trace.endSection();
@@ -3449,6 +3478,12 @@
     public void showSurfaceBehindKeyguard() {
         mSurfaceBehindRemoteAnimationRequested = true;
 
+        if (ENABLE_NEW_KEYGUARD_SHELL_TRANSITIONS) {
+            mKeyguardTransitions.startKeyguardTransition(
+                    false /* keyguardShowing */, false /* aodShowing */);
+            return;
+        }
+
         try {
             int flags = KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS
                     | KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER;
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerLockscreenVisibilityManager.kt b/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerLockscreenVisibilityManager.kt
index e89594e..032af94 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerLockscreenVisibilityManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerLockscreenVisibilityManager.kt
@@ -26,6 +26,8 @@
 import com.android.systemui.keyguard.domain.interactor.KeyguardDismissTransitionInteractor
 import com.android.systemui.keyguard.ui.binder.KeyguardSurfaceBehindParamsApplier
 import com.android.systemui.statusbar.policy.KeyguardStateController
+import com.android.window.flags.Flags
+import com.android.wm.shell.keyguard.KeyguardTransitions
 import java.util.concurrent.Executor
 import javax.inject.Inject
 
@@ -42,6 +44,7 @@
     private val keyguardStateController: KeyguardStateController,
     private val keyguardSurfaceBehindAnimator: KeyguardSurfaceBehindParamsApplier,
     private val keyguardDismissTransitionInteractor: KeyguardDismissTransitionInteractor,
+    private val keyguardTransitions: KeyguardTransitions
 ) {
 
     /**
@@ -97,6 +100,9 @@
     /** Callback provided by WM to call once we're done with the going away animation. */
     private var goingAwayRemoteAnimationFinishedCallback: IRemoteAnimationFinishedCallback? = null
 
+    private val enableNewKeyguardShellTransitions: Boolean =
+        Flags.ensureKeyguardDoesTransitionStarting()
+
     /**
      * Set the visibility of the surface behind the keyguard, making the appropriate calls to Window
      * Manager to effect the change.
@@ -114,7 +120,14 @@
             return
         }
 
+
+
         if (visible) {
+            if (enableNewKeyguardShellTransitions) {
+                keyguardTransitions.startKeyguardTransition(false /* keyguardShowing */, false /* aodShowing */)
+                isKeyguardGoingAway = true
+                return
+            }
             // Make the surface visible behind the keyguard by calling keyguardGoingAway. The
             // lockscreen is still showing as well, allowing us to animate unlocked.
             Log.d(TAG, "ActivityTaskManagerService#keyguardGoingAway()")
@@ -220,7 +233,11 @@
                 "isLockscreenShowing=$lockscreenShowing, " +
                 "aodVisible=$aodVisible)."
         )
-        activityTaskManagerService.setLockScreenShown(lockscreenShowing, aodVisible)
+        if (enableNewKeyguardShellTransitions) {
+            keyguardTransitions.startKeyguardTransition(lockscreenShowing, aodVisible)
+        } else {
+            activityTaskManagerService.setLockScreenShown(lockscreenShowing, aodVisible)
+        }
         this.isLockscreenShowing = lockscreenShowing
         this.isAodVisible = aodVisible
     }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
index 8a3d017..d0a40ec 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
@@ -59,6 +59,7 @@
 import com.android.systemui.keyguard.data.repository.DeviceEntryFaceAuthModule;
 import com.android.systemui.keyguard.data.repository.KeyguardRepositoryModule;
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionBootInteractor;
 import com.android.systemui.keyguard.domain.interactor.StartKeyguardTransitionModule;
 import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancesMetricsLogger;
 import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancesMetricsLoggerImpl;
@@ -175,6 +176,7 @@
             Lazy<WindowManagerLockscreenVisibilityManager> wmLockscreenVisibilityManager,
             SelectedUserInteractor selectedUserInteractor,
             KeyguardInteractor keyguardInteractor,
+            KeyguardTransitionBootInteractor transitionBootInteractor,
             WindowManagerOcclusionManager windowManagerOcclusionManager) {
         return new KeyguardViewMediator(
                 context,
@@ -225,6 +227,7 @@
                 wmLockscreenVisibilityManager,
                 selectedUserInteractor,
                 keyguardInteractor,
+                transitionBootInteractor,
                 windowManagerOcclusionManager);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt
index 797a4ec..690ae71 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt
@@ -23,6 +23,7 @@
 import android.annotation.SuppressLint
 import android.os.Trace
 import android.util.Log
+import com.android.app.animation.Interpolators
 import com.android.app.tracing.coroutines.withContext
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Main
@@ -95,7 +96,7 @@
      * Emits STARTED and FINISHED transition steps to the given state. This is used during boot to
      * seed the repository with the appropriate initial state.
      */
-    suspend fun emitInitialStepsFromOff(to: KeyguardState)
+    suspend fun emitInitialStepsFromOff(to: KeyguardState, testSetup: Boolean = false)
 
     /**
      * Allows manual control of a transition. When calling [startTransition], the consumer must pass
@@ -108,16 +109,14 @@
     suspend fun updateTransition(
         transitionId: UUID,
         @FloatRange(from = 0.0, to = 1.0) value: Float,
-        state: TransitionState
+        state: TransitionState,
     )
 }
 
 @SysUISingleton
 class KeyguardTransitionRepositoryImpl
 @Inject
-constructor(
-    @Main val mainDispatcher: CoroutineDispatcher,
-) : KeyguardTransitionRepository {
+constructor(@Main val mainDispatcher: CoroutineDispatcher) : KeyguardTransitionRepository {
     /**
      * Each transition between [KeyguardState]s will have an associated Flow. In order to collect
      * these events, clients should call [transition].
@@ -140,7 +139,7 @@
                 ownerName = "",
                 from = KeyguardState.OFF,
                 to = KeyguardState.OFF,
-                animator = null
+                animator = null,
             )
         )
     override var currentTransitionInfoInternal = _currentTransitionInfo.asStateFlow()
@@ -159,12 +158,7 @@
         // to either GONE or LOCKSCREEN once we're booted up and can determine which state we should
         // start in.
         emitTransition(
-            TransitionStep(
-                KeyguardState.OFF,
-                KeyguardState.OFF,
-                1f,
-                TransitionState.FINISHED,
-            )
+            TransitionStep(KeyguardState.OFF, KeyguardState.OFF, 1f, TransitionState.FINISHED)
         )
     }
 
@@ -217,7 +211,7 @@
                         TransitionStep(
                             info,
                             (animation.animatedValue as Float),
-                            TransitionState.RUNNING
+                            TransitionState.RUNNING,
                         )
                     )
                 }
@@ -266,7 +260,7 @@
     override suspend fun updateTransition(
         transitionId: UUID,
         @FloatRange(from = 0.0, to = 1.0) value: Float,
-        state: TransitionState
+        state: TransitionState,
     ) {
         // There is no fairness guarantee with 'withContext', which means that transitions could
         // be processed out of order. Use a Mutex to guarantee ordering. [startTransition]
@@ -282,7 +276,7 @@
     private suspend fun updateTransitionInternal(
         transitionId: UUID,
         @FloatRange(from = 0.0, to = 1.0) value: Float,
-        state: TransitionState
+        state: TransitionState,
     ) {
         if (updateTransitionId != transitionId) {
             Log.e(TAG, "Attempting to update with old/invalid transitionId: $transitionId")
@@ -303,34 +297,51 @@
         lastStep = nextStep
     }
 
-    override suspend fun emitInitialStepsFromOff(to: KeyguardState) {
-        _currentTransitionInfo.value =
-            TransitionInfo(
-                ownerName = "KeyguardTransitionRepository(boot)",
-                from = KeyguardState.OFF,
-                to = to,
-                animator = null
+    override suspend fun emitInitialStepsFromOff(to: KeyguardState, testSetup: Boolean) {
+        val ownerName = "KeyguardTransitionRepository(boot)"
+        // Tests runs on testDispatcher, which is not the main thread, causing the animator thread
+        // check to fail
+        if (testSetup) {
+            _currentTransitionInfo.value =
+                TransitionInfo(
+                    ownerName = ownerName,
+                    from = KeyguardState.OFF,
+                    to = to,
+                    animator = null,
+                )
+            emitTransition(
+                TransitionStep(
+                    KeyguardState.OFF,
+                    to,
+                    0f,
+                    TransitionState.STARTED,
+                    ownerName = ownerName,
+                )
             )
 
-        emitTransition(
-            TransitionStep(
-                KeyguardState.OFF,
-                to,
-                0f,
-                TransitionState.STARTED,
-                ownerName = "KeyguardTransitionRepository(boot)",
+            emitTransition(
+                TransitionStep(
+                    KeyguardState.OFF,
+                    to,
+                    1f,
+                    TransitionState.FINISHED,
+                    ownerName = ownerName,
+                )
             )
-        )
-
-        emitTransition(
-            TransitionStep(
-                KeyguardState.OFF,
-                to,
-                1f,
-                TransitionState.FINISHED,
-                ownerName = "KeyguardTransitionRepository(boot)",
-            ),
-        )
+        } else {
+            startTransition(
+                TransitionInfo(
+                    ownerName = ownerName,
+                    from = KeyguardState.OFF,
+                    to = to,
+                    animator =
+                        ValueAnimator().apply {
+                            interpolator = Interpolators.LINEAR
+                            duration = 933L
+                        },
+                )
+            )
+        }
     }
 
     private fun logAndTrace(step: TransitionStep, isManual: Boolean) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt
index cd5daf9..6d1d9cb 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt
@@ -189,6 +189,7 @@
                     internalTransitionInteractor.currentTransitionInfoInternal,
                     keyguardInteractor.statusBarState,
                     keyguardInteractor.isKeyguardDismissible,
+                    keyguardInteractor.isKeyguardOccluded,
                 )
                 .collect {
                     (
@@ -196,7 +197,8 @@
                         startedStep,
                         currentTransitionInfo,
                         statusBarState,
-                        isKeyguardUnlocked) ->
+                        isKeyguardUnlocked,
+                        isKeyguardOccluded) ->
                     val id = transitionId
                     if (id != null) {
                         if (startedStep.to == KeyguardState.PRIMARY_BOUNCER) {
@@ -210,13 +212,18 @@
                                 } else {
                                     TransitionState.RUNNING
                                 }
-                            transitionRepository.updateTransition(
-                                id,
-                                // This maps the shadeExpansion to a much faster curve, to match
-                                // the existing logic
-                                1f - MathUtils.constrainedMap(0f, 1f, 0.95f, 1f, shadeExpansion),
-                                nextState,
-                            )
+
+                            // startTransition below will issue the CANCELED directly
+                            if (nextState != TransitionState.CANCELED) {
+                                transitionRepository.updateTransition(
+                                    id,
+                                    // This maps the shadeExpansion to a much faster curve, to match
+                                    // the existing logic
+                                    1f -
+                                        MathUtils.constrainedMap(0f, 1f, 0.95f, 1f, shadeExpansion),
+                                    nextState,
+                                )
+                            }
 
                             if (
                                 nextState == TransitionState.CANCELED ||
@@ -231,14 +238,19 @@
                             if (nextState == TransitionState.CANCELED) {
                                 transitionRepository.startTransition(
                                     TransitionInfo(
-                                        ownerName = name,
+                                        ownerName =
+                                            "$name " +
+                                                "(on behalf of FromPrimaryBouncerInteractor)",
                                         from = KeyguardState.PRIMARY_BOUNCER,
-                                        to = KeyguardState.LOCKSCREEN,
+                                        to =
+                                            if (isKeyguardOccluded) KeyguardState.OCCLUDED
+                                            else KeyguardState.LOCKSCREEN,
+                                        modeOnCanceled = TransitionModeOnCanceled.REVERSE,
                                         animator =
                                             getDefaultAnimatorForTransitionsToState(
                                                     KeyguardState.LOCKSCREEN
                                                 )
-                                                .apply { duration = 0 },
+                                                .apply { duration = 100L },
                                     )
                                 )
                             }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt
index 0343786..840bc0f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt
@@ -106,7 +106,7 @@
                         startTransitionToLockscreenOrHub(
                             isIdleOnCommunal,
                             showCommunalFromOccluded,
-                            dreamFromOccluded
+                            dreamFromOccluded,
                         )
                     }
             }
@@ -127,7 +127,7 @@
                         startTransitionToLockscreenOrHub(
                             isIdleOnCommunal,
                             showCommunalFromOccluded,
-                            dreamFromOccluded
+                            dreamFromOccluded,
                         )
                     }
             }
@@ -147,7 +147,7 @@
                 communalSceneInteractor.changeScene(
                     newScene = CommunalScenes.Communal,
                     loggingReason = "occluded to hub",
-                    transitionKey = CommunalTransitionKeys.SimpleFade
+                    transitionKey = CommunalTransitionKeys.SimpleFade,
                 )
             } else {
                 startTransitionTo(KeyguardState.GLANCEABLE_HUB)
@@ -210,8 +210,9 @@
 
             duration =
                 when (toState) {
-                    KeyguardState.LOCKSCREEN -> TO_LOCKSCREEN_DURATION
+                    KeyguardState.ALTERNATE_BOUNCER -> TO_ALTERNATE_BOUNCER_DURATION
                     KeyguardState.GLANCEABLE_HUB -> TO_GLANCEABLE_HUB_DURATION
+                    KeyguardState.LOCKSCREEN -> TO_LOCKSCREEN_DURATION
                     else -> DEFAULT_DURATION
                 }.inWholeMilliseconds
         }
@@ -220,9 +221,10 @@
     companion object {
         const val TAG = "FromOccludedTransitionInteractor"
         private val DEFAULT_DURATION = 500.milliseconds
-        val TO_LOCKSCREEN_DURATION = 933.milliseconds
-        val TO_GLANCEABLE_HUB_DURATION = 250.milliseconds
+        val TO_ALTERNATE_BOUNCER_DURATION = DEFAULT_DURATION
         val TO_AOD_DURATION = DEFAULT_DURATION
         val TO_DOZING_DURATION = DEFAULT_DURATION
+        val TO_GLANCEABLE_HUB_DURATION = 250.milliseconds
+        val TO_LOCKSCREEN_DURATION = 933.milliseconds
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractor.kt
index ea80911..258232b 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractor.kt
@@ -60,12 +60,12 @@
     transitionInteractor: KeyguardTransitionInteractor,
     val dismissInteractor: KeyguardDismissInteractor,
     @Application private val applicationScope: CoroutineScope,
-    sceneInteractor: Lazy<SceneInteractor>,
     deviceUnlockedInteractor: Lazy<DeviceUnlockedInteractor>,
     powerInteractor: PowerInteractor,
     alternateBouncerInteractor: AlternateBouncerInteractor,
     shadeInteractor: Lazy<ShadeInteractor>,
     keyguardInteractor: Lazy<KeyguardInteractor>,
+    sceneInteractor: Lazy<SceneInteractor>,
 ) {
     val dismissAction: Flow<DismissAction> = repository.dismissAction
 
@@ -102,20 +102,20 @@
     private val isOnShadeWhileUnlocked: Flow<Boolean> =
         if (SceneContainerFlag.isEnabled) {
             combine(
-                    sceneInteractor.get().currentScene,
+                    shadeInteractor.get().isAnyExpanded,
                     deviceUnlockedInteractor.get().deviceUnlockStatus,
-                ) { scene, unlockStatus ->
-                    unlockStatus.isUnlocked &&
-                        (scene == Scenes.QuickSettings || scene == Scenes.Shade)
+                ) { isAnyExpanded, unlockStatus ->
+                    isAnyExpanded && unlockStatus.isUnlocked
                 }
                 .distinctUntilChanged()
         } else if (ComposeBouncerFlags.isOnlyComposeBouncerEnabled()) {
             combine(
-                shadeInteractor.get().isAnyExpanded,
-                keyguardInteractor.get().isKeyguardDismissible,
-            ) { isAnyExpanded, keyguardDismissible ->
-                isAnyExpanded && keyguardDismissible
-            }
+                    shadeInteractor.get().isAnyExpanded,
+                    keyguardInteractor.get().isKeyguardDismissible,
+                ) { isAnyExpanded, keyguardDismissible ->
+                    isAnyExpanded && keyguardDismissible
+                }
+                .distinctUntilChanged()
         } else {
             flow {
                 error(
@@ -127,7 +127,20 @@
 
     val executeDismissAction: Flow<() -> KeyguardDone> =
         merge(
-                finishedTransitionToGone,
+                if (SceneContainerFlag.isEnabled) {
+                    // Using currentScene instead of finishedTransitionToGone because of a race
+                    // condition that forms between finishedTransitionToGone and
+                    // isOnShadeWhileUnlocked where the latter emits false before the former emits
+                    // true, causing the merge to not emit until it's too late.
+                    sceneInteractor
+                        .get()
+                        .currentScene
+                        .map { it == Scenes.Gone }
+                        .distinctUntilChanged()
+                        .filter { it }
+                } else {
+                    finishedTransitionToGone
+                },
                 isOnShadeWhileUnlocked.filter { it }.map {},
                 dismissInteractor.dismissKeyguardRequestWithImmediateDismissAction,
             )
@@ -137,10 +150,24 @@
 
     val resetDismissAction: Flow<Unit> =
         combine(
-                transitionInteractor.isFinishedIn(
-                    scene = Scenes.Gone,
-                    stateWithoutSceneContainer = GONE,
-                ),
+                if (SceneContainerFlag.isEnabled) {
+                    // Using currentScene instead of isFinishedIn because of a race condition that
+                    // forms between isFinishedIn(Gone) and isOnShadeWhileUnlocked where the latter
+                    // emits false before the former emits true, causing the evaluation of the
+                    // combine to come up with true, temporarily, before settling on false, which is
+                    // a valid final state. That causes an incorrect reset of the dismiss action to
+                    // occur before it gets executed.
+                    sceneInteractor
+                        .get()
+                        .currentScene
+                        .map { it == Scenes.Gone }
+                        .distinctUntilChanged()
+                } else {
+                    transitionInteractor.isFinishedIn(
+                        scene = Scenes.Gone,
+                        stateWithoutSceneContainer = GONE,
+                    )
+                },
                 transitionInteractor.isFinishedIn(
                     scene = Scenes.Bouncer,
                     stateWithoutSceneContainer = PRIMARY_BOUNCER,
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt
index b218300..89f636d 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt
@@ -17,7 +17,6 @@
 package com.android.systemui.keyguard.domain.interactor
 
 import android.util.Log
-import com.android.systemui.CoreStartable
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
@@ -46,7 +45,7 @@
     val keyguardTransitionInteractor: KeyguardTransitionInteractor,
     val internalTransitionInteractor: InternalKeyguardTransitionInteractor,
     val repository: KeyguardTransitionRepository,
-) : CoreStartable {
+) {
 
     /**
      * Whether the lockscreen should be showing when the device starts up for the first time. If not
@@ -60,14 +59,14 @@
         }
     }
 
-    override fun start() {
+    fun start() {
         scope.launch {
             if (internalTransitionInteractor.currentTransitionInfoInternal.value.from != OFF) {
                 Log.e(
                     "KeyguardTransitionInteractor",
                     "showLockscreenOnBoot emitted, but we've already " +
                         "transitioned to a state other than OFF. We'll respect that " +
-                        "transition, but this should not happen."
+                        "transition, but this should not happen.",
                 )
             } else {
                 if (SceneContainerFlag.isEnabled) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionCoreStartable.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionCoreStartable.kt
index 25b8fd3..b715333 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionCoreStartable.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionCoreStartable.kt
@@ -27,7 +27,6 @@
 constructor(
     private val interactors: Set<TransitionInteractor>,
     private val auditLogger: KeyguardTransitionAuditLogger,
-    private val bootInteractor: KeyguardTransitionBootInteractor,
     private val statusBarDisableFlagsInteractor: StatusBarDisableFlagsInteractor,
     private val keyguardStateCallbackInteractor: KeyguardStateCallbackInteractor,
 ) : CoreStartable {
@@ -54,7 +53,6 @@
             it.start()
         }
         auditLogger.start()
-        bootInteractor.start()
         statusBarDisableFlagsInteractor.start()
         keyguardStateCallbackInteractor.start()
     }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt
index 9443570..1497026 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt
@@ -19,10 +19,12 @@
 import com.android.keyguard.logging.ScrimLogger
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.keyguard.data.repository.DEFAULT_REVEAL_DURATION
 import com.android.systemui.keyguard.data.repository.LightRevealScrimRepository
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.power.domain.interactor.PowerInteractor
 import com.android.systemui.power.shared.model.ScreenPowerState
+import com.android.systemui.power.shared.model.WakeSleepReason
 import com.android.systemui.statusbar.LightRevealEffect
 import com.android.systemui.util.kotlin.sample
 import dagger.Lazy
@@ -50,11 +52,29 @@
         scope.launch {
             transitionInteractor.startedKeyguardTransitionStep.collect {
                 scrimLogger.d(TAG, "listenForStartedKeyguardTransitionStep", it)
-                lightRevealScrimRepository.startRevealAmountAnimator(willBeRevealedInState(it.to))
+                val animationDuration =
+                    if (it.to == KeyguardState.AOD && isLastSleepDueToFold) {
+                        // Do not animate the scrim when folding as we want to cover the screen
+                        // with the scrim immediately while displays are switching.
+                        // This is needed to play the fold to AOD animation which starts with
+                        // fully black screen (see FoldAodAnimationController)
+                        0L
+                    } else {
+                        DEFAULT_REVEAL_DURATION
+                    }
+
+                lightRevealScrimRepository.startRevealAmountAnimator(
+                    willBeRevealedInState(it.to),
+                    duration = animationDuration
+                )
             }
         }
     }
 
+    private val isLastSleepDueToFold: Boolean
+        get() = powerInteractor.get().detailedWakefulness.value
+            .lastSleepReason == WakeSleepReason.FOLD
+
     /**
      * Whenever a keyguard transition starts, sample the latest reveal effect from the repository
      * and use that for the starting transition.
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBlueprintViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBlueprintViewBinder.kt
index f1b9cba..00aa44f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBlueprintViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBlueprintViewBinder.kt
@@ -47,56 +47,53 @@
         constraintLayout.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.CREATED) {
                 launch("$TAG#viewModel.blueprint") {
-                    viewModel.blueprint
-                        .pairwise(
-                            null as KeyguardBlueprint?,
-                        )
-                        .collect { (prevBlueprint, blueprint) ->
-                            val config = Config.DEFAULT
-                            val transition =
-                                if (
-                                    !KeyguardBottomAreaRefactor.isEnabled &&
-                                        prevBlueprint != null &&
-                                        prevBlueprint != blueprint
-                                ) {
-                                    BaseBlueprintTransition(clockViewModel)
-                                        .addTransition(
-                                            IntraBlueprintTransition(
-                                                config,
-                                                clockViewModel,
-                                                smartspaceViewModel
-                                            )
+                    viewModel.blueprint.pairwise(null as KeyguardBlueprint?).collect {
+                        (prevBlueprint, blueprint) ->
+                        val config = Config.DEFAULT
+                        val transition =
+                            if (
+                                !KeyguardBottomAreaRefactor.isEnabled &&
+                                    prevBlueprint != null &&
+                                    prevBlueprint != blueprint
+                            ) {
+                                BaseBlueprintTransition(clockViewModel)
+                                    .addTransition(
+                                        IntraBlueprintTransition(
+                                            config,
+                                            clockViewModel,
+                                            smartspaceViewModel,
                                         )
-                                } else {
-                                    IntraBlueprintTransition(
-                                        config,
-                                        clockViewModel,
-                                        smartspaceViewModel
                                     )
+                            } else {
+                                IntraBlueprintTransition(
+                                    config,
+                                    clockViewModel,
+                                    smartspaceViewModel,
+                                )
+                            }
+
+                        viewModel.runTransition(constraintLayout, transition, config) {
+                            // Replace sections from the previous blueprint with the new ones
+                            blueprint.replaceViews(
+                                constraintLayout,
+                                prevBlueprint,
+                                config.rebuildSections,
+                            )
+
+                            val cs =
+                                ConstraintSet().apply {
+                                    clone(constraintLayout)
+                                    val emptyLayout = ConstraintSet.Layout()
+                                    knownIds.forEach {
+                                        getConstraint(it).layout.copyFrom(emptyLayout)
+                                    }
+                                    blueprint.applyConstraints(this)
                                 }
 
-                            viewModel.runTransition(constraintLayout, transition, config) {
-                                // Replace sections from the previous blueprint with the new ones
-                                blueprint.replaceViews(
-                                    constraintLayout,
-                                    prevBlueprint,
-                                    config.rebuildSections
-                                )
-
-                                val cs =
-                                    ConstraintSet().apply {
-                                        clone(constraintLayout)
-                                        val emptyLayout = ConstraintSet.Layout()
-                                        knownIds.forEach {
-                                            getConstraint(it).layout.copyFrom(emptyLayout)
-                                        }
-                                        blueprint.applyConstraints(this)
-                                    }
-
-                                logAlphaVisibilityScaleOfAppliedConstraintSet(cs, clockViewModel)
-                                cs.applyTo(constraintLayout)
-                            }
+                            logAlphaVisibilityScaleOfAppliedConstraintSet(cs, clockViewModel)
+                            cs.applyTo(constraintLayout)
                         }
+                    }
                 }
 
                 launch("$TAG#viewModel.refreshTransition") {
@@ -105,7 +102,8 @@
 
                         viewModel.runTransition(
                             constraintLayout,
-                            IntraBlueprintTransition(config, clockViewModel, smartspaceViewModel),
+                            clockViewModel,
+                            smartspaceViewModel,
                             config,
                         ) {
                             blueprint.rebuildViews(constraintLayout, config.rebuildSections)
@@ -126,7 +124,7 @@
 
     private fun logAlphaVisibilityScaleOfAppliedConstraintSet(
         cs: ConstraintSet,
-        viewModel: KeyguardClockViewModel
+        viewModel: KeyguardClockViewModel,
     ) {
         val currentClock = viewModel.currentClock.value
         if (!DEBUG || currentClock == null) return
@@ -137,19 +135,19 @@
             TAG,
             "applyCsToSmallClock: vis=${cs.getVisibility(smallClockViewId)} " +
                 "alpha=${cs.getConstraint(smallClockViewId).propertySet.alpha} " +
-                "scale=${cs.getConstraint(smallClockViewId).transform.scaleX} "
+                "scale=${cs.getConstraint(smallClockViewId).transform.scaleX} ",
         )
         Log.i(
             TAG,
             "applyCsToLargeClock: vis=${cs.getVisibility(largeClockViewId)} " +
                 "alpha=${cs.getConstraint(largeClockViewId).propertySet.alpha} " +
                 "scale=${cs.getConstraint(largeClockViewId).transform.scaleX} " +
-                "pivotX=${cs.getConstraint(largeClockViewId).transform.transformPivotX} "
+                "pivotX=${cs.getConstraint(largeClockViewId).transform.transformPivotX} ",
         )
         Log.i(
             TAG,
             "applyCsToSmartspaceDate: vis=${cs.getVisibility(smartspaceDateId)} " +
-                "alpha=${cs.getConstraint(smartspaceDateId).propertySet.alpha}"
+                "alpha=${cs.getConstraint(smartspaceDateId).propertySet.alpha}",
         )
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewClockViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewClockViewBinder.kt
index 8386628..57cb10f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewClockViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewClockViewBinder.kt
@@ -121,7 +121,10 @@
     private fun applyClockDefaultConstraints(context: Context, constraints: ConstraintSet) {
         constraints.apply {
             constrainWidth(R.id.lockscreen_clock_view_large, ConstraintSet.WRAP_CONTENT)
-            constrainHeight(R.id.lockscreen_clock_view_large, ConstraintSet.MATCH_CONSTRAINT)
+            // The following two lines make lockscreen_clock_view_large is constrained to available
+            // height when it goes beyond constraints; otherwise, it use WRAP_CONTENT
+            constrainHeight(R.id.lockscreen_clock_view_large, WRAP_CONTENT)
+            constrainMaxHeight(R.id.lockscreen_clock_view_large, 0)
             val largeClockTopMargin =
                 SystemBarUtils.getStatusBarHeight(context) +
                     context.resources.getDimensionPixelSize(
@@ -138,7 +141,7 @@
                 R.id.lockscreen_clock_view_large,
                 ConstraintSet.END,
                 PARENT_ID,
-                ConstraintSet.END
+                ConstraintSet.END,
             )
 
             // In preview, we'll show UDFPS icon for UDFPS devices
@@ -160,14 +163,14 @@
                     BOTTOM,
                     PARENT_ID,
                     BOTTOM,
-                    clockBottomMargin
+                    clockBottomMargin,
                 )
             }
 
             constrainWidth(R.id.lockscreen_clock_view, WRAP_CONTENT)
             constrainHeight(
                 R.id.lockscreen_clock_view,
-                context.resources.getDimensionPixelSize(customizationR.dimen.small_clock_height)
+                context.resources.getDimensionPixelSize(customizationR.dimen.small_clock_height),
             )
             connect(
                 R.id.lockscreen_clock_view,
@@ -175,7 +178,7 @@
                 PARENT_ID,
                 START,
                 context.resources.getDimensionPixelSize(customizationR.dimen.clock_padding_start) +
-                    context.resources.getDimensionPixelSize(R.dimen.status_view_margin_horizontal)
+                    context.resources.getDimensionPixelSize(R.dimen.status_view_margin_horizontal),
             )
             val smallClockTopMargin =
                 context.resources.getDimensionPixelSize(R.dimen.keyguard_clock_top_margin) +
@@ -188,7 +191,7 @@
         context: Context,
         rootView: ConstraintLayout,
         previewClock: ClockController,
-        viewModel: KeyguardPreviewClockViewModel
+        viewModel: KeyguardPreviewClockViewModel,
     ) {
         val cs = ConstraintSet().apply { clone(rootView) }
         applyClockDefaultConstraints(context, cs)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/transitions/IntraBlueprintTransition.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/transitions/IntraBlueprintTransition.kt
index aa0a9d9..9a55f7b 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/transitions/IntraBlueprintTransition.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/transitions/IntraBlueprintTransition.kt
@@ -29,18 +29,18 @@
     smartspaceViewModel: KeyguardSmartspaceViewModel,
 ) : TransitionSet() {
 
-    enum class Type(
-        val priority: Int,
-        val animateNotifChanges: Boolean,
-    ) {
+    enum class Type(val priority: Int, val animateNotifChanges: Boolean) {
         ClockSize(100, true),
         ClockCenter(99, false),
         DefaultClockStepping(98, false),
-        SmartspaceVisibility(2, true),
-        DefaultTransition(1, false),
+        SmartspaceVisibility(3, true),
+        DefaultTransition(2, false),
         // When transition between blueprint, we don't need any duration or interpolator but we need
         // all elements go to correct state
-        NoTransition(0, false),
+        NoTransition(1, false),
+        // Similar to NoTransition, except also does not explicitly update any alpha. Used in
+        // OFF->LOCKSCREEN transition
+        Init(0, false),
     }
 
     data class Config(
@@ -57,6 +57,7 @@
     init {
         ordering = ORDERING_TOGETHER
         when (config.type) {
+            Type.Init -> {}
             Type.NoTransition -> {}
             Type.DefaultClockStepping ->
                 addTransition(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt
index ff84826..a1c963b 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt
@@ -53,14 +53,11 @@
 internal fun ConstraintSet.setVisibility(views: Iterable<View>, visibility: Int) =
     views.forEach { view -> this.setVisibility(view.id, visibility) }
 
-internal fun ConstraintSet.setAlpha(views: Iterable<View>, alpha: Float) =
-    views.forEach { view -> this.setAlpha(view.id, alpha) }
+internal fun ConstraintSet.setScaleX(views: Iterable<View>, scaleX: Float) =
+    views.forEach { view -> this.setScaleX(view.id, scaleX) }
 
-internal fun ConstraintSet.setScaleX(views: Iterable<View>, alpha: Float) =
-    views.forEach { view -> this.setScaleX(view.id, alpha) }
-
-internal fun ConstraintSet.setScaleY(views: Iterable<View>, alpha: Float) =
-    views.forEach { view -> this.setScaleY(view.id, alpha) }
+internal fun ConstraintSet.setScaleY(views: Iterable<View>, scaleY: Float) =
+    views.forEach { view -> this.setScaleY(view.id, scaleY) }
 
 @SysUISingleton
 class ClockSection
@@ -126,8 +123,6 @@
         return constraintSet.apply {
             setVisibility(getTargetClockFace(clock).views, VISIBLE)
             setVisibility(getNonTargetClockFace(clock).views, GONE)
-            setAlpha(getTargetClockFace(clock).views, 1F)
-            setAlpha(getNonTargetClockFace(clock).views, 0F)
             if (!keyguardClockViewModel.isLargeClockVisible.value) {
                 connect(sharedR.id.bc_smartspace_view, TOP, sharedR.id.date_smartspace_view, BOTTOM)
             } else {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToOccludedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToOccludedTransitionViewModel.kt
index 3f2ef29..c49e783 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToOccludedTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToOccludedTransitionViewModel.kt
@@ -28,22 +28,22 @@
 import kotlinx.coroutines.flow.Flow
 
 /**
- * Breaks down ALTERNATE_BOUNCER->GONE transition into discrete steps for corresponding views to
+ * Breaks down ALTERNATE_BOUNCER->OCCLUDED transition into discrete steps for corresponding views to
  * consume.
  */
 @OptIn(ExperimentalCoroutinesApi::class)
 @SysUISingleton
 class AlternateBouncerToOccludedTransitionViewModel
 @Inject
-constructor(
-    animationFlow: KeyguardTransitionAnimationFlow,
-) : DeviceEntryIconTransition {
+constructor(animationFlow: KeyguardTransitionAnimationFlow) : DeviceEntryIconTransition {
     private val transitionAnimation =
         animationFlow.setup(
             duration = TO_OCCLUDED_DURATION,
             edge = Edge.create(from = ALTERNATE_BOUNCER, to = OCCLUDED),
         )
 
+    val lockscreenAlpha: Flow<Float> = transitionAnimation.immediatelyTransitionTo(0f)
+
     override val deviceEntryParentViewAlpha: Flow<Float> =
         transitionAnimation.immediatelyTransitionTo(0f)
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModel.kt
index a021de4..68244d8 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModel.kt
@@ -56,9 +56,11 @@
     occludedToAodTransitionViewModel: OccludedToAodTransitionViewModel,
     occludedToDozingTransitionViewModel: OccludedToDozingTransitionViewModel,
     occludedToLockscreenTransitionViewModel: OccludedToLockscreenTransitionViewModel,
+    offToLockscreenTransitionViewModel: OffToLockscreenTransitionViewModel,
     primaryBouncerToAodTransitionViewModel: PrimaryBouncerToAodTransitionViewModel,
     primaryBouncerToDozingTransitionViewModel: PrimaryBouncerToDozingTransitionViewModel,
     primaryBouncerToLockscreenTransitionViewModel: PrimaryBouncerToLockscreenTransitionViewModel,
+    lockscreenToDozingTransitionViewModel: LockscreenToDozingTransitionViewModel,
 ) {
     val color: Flow<Int> =
         deviceEntryIconViewModel.useBackgroundProtection.flatMapLatest { useBackground ->
@@ -67,14 +69,14 @@
                     .map {
                         Utils.getColorAttrDefaultColor(
                             context,
-                            com.android.internal.R.attr.colorSurface
+                            com.android.internal.R.attr.colorSurface,
                         )
                     }
                     .onStart {
                         emit(
                             Utils.getColorAttrDefaultColor(
                                 context,
-                                com.android.internal.R.attr.colorSurface
+                                com.android.internal.R.attr.colorSurface,
                             )
                         )
                     }
@@ -86,23 +88,25 @@
         deviceEntryIconViewModel.useBackgroundProtection.flatMapLatest { useBackground ->
             if (useBackground) {
                 setOf(
-                        lockscreenToAodTransitionViewModel.deviceEntryBackgroundViewAlpha,
-                        aodToLockscreenTransitionViewModel.deviceEntryBackgroundViewAlpha,
-                        goneToAodTransitionViewModel.deviceEntryBackgroundViewAlpha,
-                        primaryBouncerToAodTransitionViewModel.deviceEntryBackgroundViewAlpha,
-                        occludedToAodTransitionViewModel.deviceEntryBackgroundViewAlpha,
-                        occludedToLockscreenTransitionViewModel.deviceEntryBackgroundViewAlpha,
-                        dreamingToLockscreenTransitionViewModel.deviceEntryBackgroundViewAlpha,
                         alternateBouncerToAodTransitionViewModel.deviceEntryBackgroundViewAlpha,
-                        goneToLockscreenTransitionViewModel.deviceEntryBackgroundViewAlpha,
-                        goneToDozingTransitionViewModel.deviceEntryBackgroundViewAlpha,
-                        primaryBouncerToDozingTransitionViewModel.deviceEntryBackgroundViewAlpha,
-                        dozingToLockscreenTransitionViewModel.deviceEntryBackgroundViewAlpha,
                         alternateBouncerToDozingTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        aodToLockscreenTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        dozingToLockscreenTransitionViewModel.deviceEntryBackgroundViewAlpha,
                         dreamingToAodTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        dreamingToLockscreenTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        goneToAodTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        goneToDozingTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        goneToLockscreenTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        lockscreenToAodTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        occludedToAodTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        occludedToDozingTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        occludedToLockscreenTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        offToLockscreenTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        primaryBouncerToAodTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        primaryBouncerToDozingTransitionViewModel.deviceEntryBackgroundViewAlpha,
                         primaryBouncerToLockscreenTransitionViewModel
                             .deviceEntryBackgroundViewAlpha,
-                        occludedToDozingTransitionViewModel.deviceEntryBackgroundViewAlpha,
+                        lockscreenToDozingTransitionViewModel.deviceEntryBackgroundViewAlpha,
                     )
                     .merge()
                     .onStart {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModel.kt
index 4cf3c4e..1289036 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModel.kt
@@ -24,6 +24,9 @@
 import androidx.constraintlayout.widget.ConstraintLayout
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition
 import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition.Config
 import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition.Type
 import javax.inject.Inject
@@ -37,6 +40,7 @@
 constructor(
     @Main private val handler: Handler,
     private val keyguardBlueprintInteractor: KeyguardBlueprintInteractor,
+    private val keyguardTransitionInteractor: KeyguardTransitionInteractor,
 ) {
     val blueprint = keyguardBlueprintInteractor.blueprint
     val blueprintId = keyguardBlueprintInteractor.blueprintId
@@ -49,12 +53,12 @@
     private val transitionListener =
         object : Transition.TransitionListener {
             override fun onTransitionCancel(transition: Transition) {
-                if (DEBUG) Log.e(TAG, "onTransitionCancel: ${transition::class.simpleName}")
+                if (DEBUG) Log.w(TAG, "onTransitionCancel: ${transition::class.simpleName}")
                 updateTransitions(null) { remove(transition) }
             }
 
             override fun onTransitionEnd(transition: Transition) {
-                if (DEBUG) Log.e(TAG, "onTransitionEnd: ${transition::class.simpleName}")
+                if (DEBUG) Log.i(TAG, "onTransitionEnd: ${transition::class.simpleName}")
                 updateTransitions(null) { remove(transition) }
             }
 
@@ -86,6 +90,28 @@
 
     fun runTransition(
         constraintLayout: ConstraintLayout,
+        clockViewModel: KeyguardClockViewModel,
+        smartspaceViewModel: KeyguardSmartspaceViewModel,
+        config: Config,
+        apply: () -> Unit,
+    ) {
+        val newConfig =
+            if (keyguardTransitionInteractor.getCurrentState() == KeyguardState.OFF) {
+                config.copy(type = Type.Init)
+            } else {
+                config
+            }
+
+        runTransition(
+            constraintLayout,
+            IntraBlueprintTransition(newConfig, clockViewModel, smartspaceViewModel),
+            config,
+            apply,
+        )
+    }
+
+    fun runTransition(
+        constraintLayout: ConstraintLayout,
         transition: Transition,
         config: Config,
         apply: () -> Unit,
@@ -103,21 +129,29 @@
             return
         }
 
+        // Don't allow transitions with animations while in OFF state
+        val newConfig =
+            if (keyguardTransitionInteractor.getCurrentState() == KeyguardState.OFF) {
+                config.copy(type = Type.Init)
+            } else {
+                config
+            }
+
         if (DEBUG) {
             Log.i(
                 TAG,
                 "runTransition: running ${transition::class.simpleName}: " +
-                    "currentPriority=$currentPriority; config=$config",
+                    "currentPriority=$currentPriority; config=$newConfig",
             )
         }
 
         // beginDelayedTransition makes a copy, so we temporarially add the uncopied transition to
         // the running set until the copy is started by the handler.
-        updateTransitions(TransitionData(config)) { add(transition) }
+        updateTransitions(TransitionData(newConfig)) { add(transition) }
         transition.addListener(transitionListener)
 
         handler.post {
-            if (config.terminatePrevious) {
+            if (newConfig.terminatePrevious) {
                 TransitionManager.endTransitions(constraintLayout)
             }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt
index 10a2e5c..40d4193 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt
@@ -20,7 +20,6 @@
 import android.graphics.Point
 import android.util.MathUtils
 import android.view.View.VISIBLE
-import com.android.app.tracing.coroutines.launch
 import com.android.systemui.common.shared.model.NotificationContainerBounds
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
 import com.android.systemui.dagger.SysUISingleton
@@ -35,6 +34,7 @@
 import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
 import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
 import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED
+import com.android.systemui.keyguard.shared.model.KeyguardState.OFF
 import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER
 import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING
 import com.android.systemui.keyguard.shared.model.TransitionState.STARTED
@@ -88,6 +88,8 @@
         AlternateBouncerToGoneTransitionViewModel,
     private val alternateBouncerToLockscreenTransitionViewModel:
         AlternateBouncerToLockscreenTransitionViewModel,
+    private val alternateBouncerToOccludedTransitionViewModel:
+        AlternateBouncerToOccludedTransitionViewModel,
     private val aodToGoneTransitionViewModel: AodToGoneTransitionViewModel,
     private val aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel,
     private val aodToOccludedTransitionViewModel: AodToOccludedTransitionViewModel,
@@ -112,9 +114,12 @@
     private val lockscreenToOccludedTransitionViewModel: LockscreenToOccludedTransitionViewModel,
     private val lockscreenToPrimaryBouncerTransitionViewModel:
         LockscreenToPrimaryBouncerTransitionViewModel,
+    private val occludedToAlternateBouncerTransitionViewModel:
+        OccludedToAlternateBouncerTransitionViewModel,
     private val occludedToAodTransitionViewModel: OccludedToAodTransitionViewModel,
     private val occludedToDozingTransitionViewModel: OccludedToDozingTransitionViewModel,
     private val occludedToLockscreenTransitionViewModel: OccludedToLockscreenTransitionViewModel,
+    private val offToLockscreenTransitionViewModel: OffToLockscreenTransitionViewModel,
     private val primaryBouncerToAodTransitionViewModel: PrimaryBouncerToAodTransitionViewModel,
     private val primaryBouncerToGoneTransitionViewModel: PrimaryBouncerToGoneTransitionViewModel,
     private val primaryBouncerToLockscreenTransitionViewModel:
@@ -201,6 +206,10 @@
             notificationShadeWindowModel.isKeyguardOccluded,
             communalInteractor.isIdleOnCommunal,
             keyguardTransitionInteractor
+                .transitionValue(OFF)
+                .map { it > 1f - offToLockscreenTransitionViewModel.alphaStartAt }
+                .onStart { emit(false) },
+            keyguardTransitionInteractor
                 .transitionValue(scene = Scenes.Gone, stateWithoutSceneContainer = GONE)
                 .map { it == 1f }
                 .onStart { emit(false) },
@@ -227,6 +236,7 @@
                         alternateBouncerToAodTransitionViewModel.lockscreenAlpha(viewState),
                         alternateBouncerToGoneTransitionViewModel.lockscreenAlpha(viewState),
                         alternateBouncerToLockscreenTransitionViewModel.lockscreenAlpha(viewState),
+                        alternateBouncerToOccludedTransitionViewModel.lockscreenAlpha,
                         aodToGoneTransitionViewModel.lockscreenAlpha(viewState),
                         aodToLockscreenTransitionViewModel.lockscreenAlpha(viewState),
                         aodToOccludedTransitionViewModel.lockscreenAlpha(viewState),
@@ -249,14 +259,16 @@
                         lockscreenToGoneTransitionViewModel.lockscreenAlpha(viewState),
                         lockscreenToOccludedTransitionViewModel.lockscreenAlpha,
                         lockscreenToPrimaryBouncerTransitionViewModel.lockscreenAlpha,
+                        occludedToAlternateBouncerTransitionViewModel.lockscreenAlpha,
                         occludedToAodTransitionViewModel.lockscreenAlpha,
                         occludedToDozingTransitionViewModel.lockscreenAlpha,
                         occludedToLockscreenTransitionViewModel.lockscreenAlpha,
+                        offToLockscreenTransitionViewModel.lockscreenAlpha,
                         primaryBouncerToAodTransitionViewModel.lockscreenAlpha,
                         primaryBouncerToGoneTransitionViewModel.lockscreenAlpha,
                         primaryBouncerToLockscreenTransitionViewModel.lockscreenAlpha(viewState),
                     )
-                    .onStart { emit(1f) },
+                    .onStart { emit(0f) },
             ) { hideKeyguard, alpha ->
                 if (hideKeyguard) {
                     0f
@@ -335,12 +347,8 @@
                             when {
                                 // If there are no notification icons to show, then it can be hidden
                                 !hasAodIcons -> false
-                                // If we're bypassing, then we're visible
-                                isBypassEnabled -> true
                                 // If we are pulsing (and not bypassing), then we are hidden
                                 isPulseExpanding -> false
-                                // Besides bypass above, they should not be visible on lockscreen
-                                isOnLockscreen -> false
                                 // If notifs are fully gone, then we're visible
                                 areNotifsFullyHidden -> true
                                 // Otherwise, we're hidden
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt
index d3eefca..7abf35d 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt
@@ -55,16 +55,16 @@
             onCancel = { 1f },
         )
 
+    val deviceEntryBackgroundViewAlpha: Flow<Float> =
+        transitionAnimation.immediatelyTransitionTo(0f)
+
     override val deviceEntryParentViewAlpha: Flow<Float> =
         deviceEntryUdfpsInteractor.isUdfpsEnrolledAndEnabled.flatMapLatest {
             isUdfpsEnrolledAndEnabled ->
             if (isUdfpsEnrolledAndEnabled) {
                 transitionAnimation.immediatelyTransitionTo(1f)
             } else {
-                transitionAnimation.sharedFlow(
-                    duration = 250.milliseconds,
-                    onStep = { 1f - it },
-                )
+                transitionAnimation.sharedFlow(duration = 250.milliseconds, onStep = { 1f - it })
             }
         }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt
index 8d9ccef..88e8968 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt
@@ -52,18 +52,26 @@
 
     /** Lockscreen views alpha */
     val lockscreenAlpha: Flow<Float> =
-        transitionAnimation.sharedFlow(
-            duration = 250.milliseconds,
-            onStep = { 1f - it },
-            name = "LOCKSCREEN->OCCLUDED: lockscreenAlpha",
+        shadeDependentFlows.transitionFlow(
+            flowWhenShadeIsNotExpanded =
+                transitionAnimation.sharedFlow(
+                    duration = 250.milliseconds,
+                    onStep = { 1f - it },
+                    name = "LOCKSCREEN->OCCLUDED: lockscreenAlpha",
+                ),
+            flowWhenShadeIsExpanded = transitionAnimation.immediatelyTransitionTo(0f),
         )
 
     val shortcutsAlpha: Flow<Float> =
-        transitionAnimation.sharedFlow(
-            duration = 250.milliseconds,
-            onStep = { 1 - it },
-            onFinish = { 0f },
-            onCancel = { 1f },
+        shadeDependentFlows.transitionFlow(
+            flowWhenShadeIsNotExpanded =
+                transitionAnimation.sharedFlow(
+                    duration = 250.milliseconds,
+                    onStep = { 1f - it },
+                    onFinish = { 0f },
+                    onCancel = { 1f },
+                ),
+            flowWhenShadeIsExpanded = transitionAnimation.immediatelyTransitionTo(0f),
         )
 
     /** Lockscreen views y-translation */
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt
index c0b9efaa..914730e 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt
@@ -25,7 +25,7 @@
 import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
 import com.android.systemui.scene.shared.flag.SceneContainerFlag
 import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.scene.ui.composable.transitions.FROM_LOCK_SCREEN_TO_BOUNCER_FADE_FRACTION
+import com.android.systemui.scene.ui.composable.transitions.TO_BOUNCER_FADE_FRACTION
 import javax.inject.Inject
 import kotlin.time.Duration.Companion.milliseconds
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -49,14 +49,12 @@
                 duration = FromLockscreenTransitionInteractor.TO_PRIMARY_BOUNCER_DURATION,
                 edge = Edge.create(from = LOCKSCREEN, to = Scenes.Bouncer),
             )
-            .setupWithoutSceneContainer(
-                edge = Edge.create(from = LOCKSCREEN, to = PRIMARY_BOUNCER),
-            )
+            .setupWithoutSceneContainer(edge = Edge.create(from = LOCKSCREEN, to = PRIMARY_BOUNCER))
 
     private val alphaForAnimationStep: (Float) -> Float =
         when {
             SceneContainerFlag.isEnabled -> { step ->
-                    1f - Math.min((step / FROM_LOCK_SCREEN_TO_BOUNCER_FADE_FRACTION), 1f)
+                    1f - Math.min((step / TO_BOUNCER_FADE_FRACTION), 1f)
                 }
             else -> { step -> 1f - step }
         }
@@ -64,7 +62,7 @@
     val shortcutsAlpha: Flow<Float> =
         transitionAnimation.sharedFlow(
             duration = FromLockscreenTransitionInteractor.TO_PRIMARY_BOUNCER_DURATION,
-            onStep = alphaForAnimationStep
+            onStep = alphaForAnimationStep,
         )
 
     val lockscreenAlpha: Flow<Float> = shortcutsAlpha
@@ -76,8 +74,8 @@
                     duration = 250.milliseconds,
                     onStep = { 1f - it },
                     onCancel = { 0f },
-                    onFinish = { 0f }
+                    onFinish = { 0f },
                 ),
-            flowWhenShadeIsExpanded = transitionAnimation.immediatelyTransitionTo(0f)
+            flowWhenShadeIsExpanded = transitionAnimation.immediatelyTransitionTo(0f),
         )
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModel.kt
index 3b266f9..6f29004 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModel.kt
@@ -18,20 +18,18 @@
 
 package com.android.systemui.keyguard.ui.viewmodel
 
-import com.android.compose.animation.scene.Edge
 import com.android.compose.animation.scene.Swipe
-import com.android.compose.animation.scene.SwipeDirection
 import com.android.compose.animation.scene.UserAction
 import com.android.compose.animation.scene.UserActionResult
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
-import com.android.systemui.scene.shared.model.Overlays
 import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade
-import com.android.systemui.scene.ui.viewmodel.SceneContainerEdge
 import com.android.systemui.scene.ui.viewmodel.UserActionsViewModel
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.shade.shared.model.ShadeMode
+import com.android.systemui.shade.ui.viewmodel.dualShadeActions
+import com.android.systemui.shade.ui.viewmodel.singleShadeActions
+import com.android.systemui.shade.ui.viewmodel.splitShadeActions
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -62,7 +60,7 @@
                 ) { isDeviceUnlocked, isCommunalAvailable, shadeMode ->
                     buildList {
                             if (isCommunalAvailable) {
-                                add(Swipe.Left to Scenes.Communal)
+                                add(Swipe.Start to Scenes.Communal)
                             }
 
                             add(Swipe.Up to if (isDeviceUnlocked) Scenes.Gone else Scenes.Bouncer)
@@ -81,45 +79,6 @@
             .collect { setActions(it) }
     }
 
-    private fun singleShadeActions(): Array<Pair<UserAction, UserActionResult>> {
-        return arrayOf(
-            // Swiping down, not from the edge, always goes to shade.
-            Swipe.Down to Scenes.Shade,
-            swipeDown(pointerCount = 2) to Scenes.Shade,
-            // Swiping down from the top edge goes to QS.
-            swipeDownFromTop(pointerCount = 1) to Scenes.QuickSettings,
-            swipeDownFromTop(pointerCount = 2) to Scenes.QuickSettings,
-        )
-    }
-
-    private fun splitShadeActions(): Array<Pair<UserAction, UserActionResult>> {
-        val splitShadeSceneKey = UserActionResult(Scenes.Shade, ToSplitShade)
-        return arrayOf(
-            // Swiping down, not from the edge, always goes to shade.
-            Swipe.Down to splitShadeSceneKey,
-            swipeDown(pointerCount = 2) to splitShadeSceneKey,
-            // Swiping down from the top edge goes to QS.
-            swipeDownFromTop(pointerCount = 1) to splitShadeSceneKey,
-            swipeDownFromTop(pointerCount = 2) to splitShadeSceneKey,
-        )
-    }
-
-    private fun dualShadeActions(): Array<Pair<UserAction, UserActionResult>> {
-        return arrayOf(
-            Swipe.Down to Overlays.NotificationsShade,
-            Swipe(direction = SwipeDirection.Down, fromSource = SceneContainerEdge.TopRight) to
-                Overlays.QuickSettingsShade,
-        )
-    }
-
-    private fun swipeDownFromTop(pointerCount: Int): Swipe {
-        return Swipe(SwipeDirection.Down, fromSource = Edge.Top, pointerCount = pointerCount)
-    }
-
-    private fun swipeDown(pointerCount: Int): Swipe {
-        return Swipe(SwipeDirection.Down, pointerCount = pointerCount)
-    }
-
     @AssistedFactory
     interface Factory {
         fun create(): LockscreenUserActionsViewModel
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModel.kt
new file mode 100644
index 0000000..5bfcccb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModel.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2024 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.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.keyguard.domain.interactor.FromOccludedTransitionInteractor.Companion.TO_ALTERNATE_BOUNCER_DURATION
+import com.android.systemui.keyguard.shared.model.Edge
+import com.android.systemui.keyguard.shared.model.KeyguardState.ALTERNATE_BOUNCER
+import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED
+import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
+import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
+import javax.inject.Inject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+
+/**
+ * Breaks down OCCLUDED->ALTERNATE_BOUNCER transition into discrete steps for corresponding views to
+ * consume.
+ */
+@OptIn(ExperimentalCoroutinesApi::class)
+@SysUISingleton
+class OccludedToAlternateBouncerTransitionViewModel
+@Inject
+constructor(animationFlow: KeyguardTransitionAnimationFlow) : DeviceEntryIconTransition {
+    private val transitionAnimation =
+        animationFlow.setup(
+            duration = TO_ALTERNATE_BOUNCER_DURATION,
+            edge = Edge.create(from = OCCLUDED, to = ALTERNATE_BOUNCER),
+        )
+
+    val lockscreenAlpha: Flow<Float> = transitionAnimation.immediatelyTransitionTo(0f)
+
+    override val deviceEntryParentViewAlpha: Flow<Float> =
+        transitionAnimation.immediatelyTransitionTo(0f)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModel.kt
index 1eecbd5..b4acce6 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModel.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.keyguard.ui.viewmodel
 
+import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.keyguard.shared.model.Edge
 import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
@@ -29,23 +30,29 @@
 @SysUISingleton
 class OffToLockscreenTransitionViewModel
 @Inject
-constructor(
-    animationFlow: KeyguardTransitionAnimationFlow,
-) : DeviceEntryIconTransition {
+constructor(animationFlow: KeyguardTransitionAnimationFlow) : DeviceEntryIconTransition {
+
+    private val startTime = 300.milliseconds
+    private val alphaDuration = 633.milliseconds
+    val alphaStartAt = startTime / (alphaDuration + startTime)
 
     private val transitionAnimation =
         animationFlow.setup(
-            duration = 250.milliseconds,
+            duration = startTime + alphaDuration,
             edge = Edge.create(from = OFF, to = LOCKSCREEN),
         )
 
-    val shortcutsAlpha: Flow<Float> =
+    val lockscreenAlpha: Flow<Float> =
         transitionAnimation.sharedFlow(
-            duration = 250.milliseconds,
+            startTime = startTime,
+            duration = alphaDuration,
+            interpolator = EMPHASIZED_ACCELERATE,
             onStep = { it },
-            onCancel = { 0f },
         )
 
-    override val deviceEntryParentViewAlpha: Flow<Float> =
-        transitionAnimation.immediatelyTransitionTo(1f)
+    val shortcutsAlpha: Flow<Float> = lockscreenAlpha
+
+    override val deviceEntryParentViewAlpha: Flow<Float> = lockscreenAlpha
+
+    val deviceEntryBackgroundViewAlpha: Flow<Float> = lockscreenAlpha
 }
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/FocusedDisplayRepoLog.kt b/packages/SystemUI/src/com/android/systemui/log/dagger/FocusedDisplayRepoLog.kt
new file mode 100644
index 0000000..302f962
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/log/dagger/FocusedDisplayRepoLog.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2023 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.systemui.log.dagger
+
+import javax.inject.Qualifier
+
+/** A [com.android.systemui.log.LogBuffer] for display metrics related logging. */
+@Qualifier
+@MustBeDocumented
+@Retention(AnnotationRetention.RUNTIME)
+annotation class FocusedDisplayRepoLog
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
index 2053b53..4c21da5 100644
--- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
+++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
@@ -369,7 +369,7 @@
     @SysUISingleton
     @MediaCarouselControllerLog
     public static LogBuffer provideMediaCarouselControllerBuffer(LogBufferFactory factory) {
-        return factory.create("MediaCarouselCtlrLog", 20);
+        return factory.create("MediaCarouselCtlrLog", 100);
     }
 
     /**
@@ -480,6 +480,16 @@
     }
 
     /**
+     * Provides a {@link LogBuffer} for use by SIM events.
+     */
+    @Provides
+    @SysUISingleton
+    @SimLog
+    public static LogBuffer provideSimLogBuffer(LogBufferFactory factory) {
+        return factory.create("SimLog", 500);
+    }
+
+    /**
      * Provides a {@link LogBuffer} for use by {@link com.android.keyguard.KeyguardUpdateMonitor}.
      */
     @Provides
@@ -655,6 +665,14 @@
         return factory.create("DisplayMetricsRepo", 50);
     }
 
+    /** Provides a {@link LogBuffer} for focus related logs. */
+    @Provides
+    @SysUISingleton
+    @FocusedDisplayRepoLog
+    public static LogBuffer provideFocusedDisplayRepoLogBuffer(LogBufferFactory factory) {
+        return factory.create("FocusedDisplayRepo", 50);
+    }
+
     /** Provides a {@link LogBuffer} for the scene framework. */
     @Provides
     @SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/SimLog.kt b/packages/SystemUI/src/com/android/systemui/log/dagger/SimLog.kt
new file mode 100644
index 0000000..64fc6e7
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/log/dagger/SimLog.kt
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2024 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.systemui.log.dagger
+
+import javax.inject.Qualifier
+
+/** A [com.android.systemui.log.LogBuffer] for SIM events. */
+@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class SimLog
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt
index 84aae65..4528b04 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt
@@ -111,7 +111,7 @@
     arrayOf(
         MediaMetadata.METADATA_KEY_ALBUM_ART_URI,
         MediaMetadata.METADATA_KEY_ART_URI,
-        MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI
+        MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI,
     )
 
 private const val TAG = "MediaDataManager"
@@ -136,7 +136,7 @@
         active = true,
         resumeAction = null,
         instanceId = InstanceId.fakeInstanceId(-1),
-        appUid = Process.INVALID_UID
+        appUid = Process.INVALID_UID,
     )
 
 internal val EMPTY_SMARTSPACE_MEDIA_DATA =
@@ -163,7 +163,7 @@
         Settings.Secure.getInt(
             context.contentResolver,
             Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION,
-            1
+            1,
         )
     return Utils.useQsMediaPlayer(context) && flag > 0
 }
@@ -217,7 +217,7 @@
     private val themeText =
         com.android.settingslib.Utils.getColorAttr(
                 context,
-                com.android.internal.R.attr.textColorPrimary
+                com.android.internal.R.attr.textColorPrimary,
             )
             .defaultColor
 
@@ -387,7 +387,7 @@
                 uiExecutor,
                 SmartspaceSession.OnTargetsAvailableListener { targets ->
                     smartspaceMediaDataProvider.onTargetsAvailable(targets)
-                }
+                },
             )
         }
         smartspaceSession?.let { it.requestSmartspaceUpdate() }
@@ -398,12 +398,12 @@
                     if (!allowMediaRecommendations) {
                         dismissSmartspaceRecommendation(
                             key = smartspaceMediaData.targetId,
-                            delay = 0L
+                            delay = 0L,
                         )
                     }
                 }
             },
-            Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION
+            Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION,
         )
     }
 
@@ -417,6 +417,7 @@
     override fun onNotificationAdded(key: String, sbn: StatusBarNotification) {
         if (useQsMediaPlayer && isMediaNotification(sbn)) {
             var isNewlyActiveEntry = false
+            var isConvertingToActive = false
             Assert.isMainThread()
             val oldKey = findExistingEntry(key, sbn.packageName)
             if (oldKey == null) {
@@ -433,9 +434,10 @@
                 // Resume -> active conversion; move to new key
                 val oldData = mediaEntries.remove(oldKey)!!
                 isNewlyActiveEntry = true
+                isConvertingToActive = true
                 mediaEntries.put(key, oldData)
             }
-            loadMediaData(key, sbn, oldKey, isNewlyActiveEntry)
+            loadMediaData(key, sbn, oldKey, isNewlyActiveEntry, isConvertingToActive)
         } else {
             onNotificationRemoved(key)
         }
@@ -461,7 +463,7 @@
         token: MediaSession.Token,
         appName: String,
         appIntent: PendingIntent,
-        packageName: String
+        packageName: String,
     ) {
         // Resume controls don't have a notification key, so store by package name instead
         if (!mediaEntries.containsKey(packageName)) {
@@ -497,7 +499,7 @@
                     token,
                     appName,
                     appIntent,
-                    packageName
+                    packageName,
                 )
             }
         } else {
@@ -509,7 +511,7 @@
                     token,
                     appName,
                     appIntent,
-                    packageName
+                    packageName,
                 )
             }
         }
@@ -535,10 +537,11 @@
         sbn: StatusBarNotification,
         oldKey: String?,
         isNewlyActiveEntry: Boolean = false,
+        isConvertingToActive: Boolean = false,
     ) {
         if (Flags.mediaLoadMetadataViaMediaDataLoader()) {
             applicationScope.launch {
-                loadMediaDataWithLoader(key, sbn, oldKey, isNewlyActiveEntry)
+                loadMediaDataWithLoader(key, sbn, oldKey, isNewlyActiveEntry, isConvertingToActive)
             }
         } else {
             backgroundExecutor.execute { loadMediaDataInBg(key, sbn, oldKey, isNewlyActiveEntry) }
@@ -550,10 +553,11 @@
         sbn: StatusBarNotification,
         oldKey: String?,
         isNewlyActiveEntry: Boolean = false,
+        isConvertingToActive: Boolean = false,
     ) =
         withContext(backgroundDispatcher) {
             val lastActive = systemClock.elapsedRealtime()
-            val result = mediaDataLoader.get().loadMediaData(key, sbn)
+            val result = mediaDataLoader.get().loadMediaData(key, sbn, isConvertingToActive)
             if (result == null) {
                 Log.d(TAG, "No result from loadMediaData")
                 return@withContext
@@ -609,14 +613,14 @@
                     result.appUid,
                     sbn.packageName,
                     instanceId,
-                    result.playbackLocation
+                    result.playbackLocation,
                 )
             } else if (result.playbackLocation != currentEntry?.playbackLocation) {
                 logger.logPlaybackLocationChange(
                     result.appUid,
                     sbn.packageName,
                     instanceId,
-                    result.playbackLocation
+                    result.playbackLocation,
                 )
             }
 
@@ -722,30 +726,32 @@
     /** Called when the player's [PlaybackState] has been updated with new actions and/or state */
     private fun updateState(key: String, state: PlaybackState) {
         mediaEntries.get(key)?.let {
-            val token = it.token
-            if (token == null) {
-                if (DEBUG) Log.d(TAG, "State updated, but token was null")
-                return
-            }
-            val actions =
-                createActionsFromState(
-                    it.packageName,
-                    mediaControllerFactory.create(it.token),
-                    UserHandle(it.userId)
-                )
-
-            // Control buttons
-            // If flag is enabled and controller has a PlaybackState,
-            // create actions from session info
-            // otherwise, no need to update semantic actions.
-            val data =
-                if (actions != null) {
-                    it.copy(semanticActions = actions, isPlaying = isPlayingState(state.state))
-                } else {
-                    it.copy(isPlaying = isPlayingState(state.state))
+            backgroundExecutor.execute {
+                val token = it.token
+                if (token == null) {
+                    if (DEBUG) Log.d(TAG, "State updated, but token was null")
+                    return@execute
                 }
-            if (DEBUG) Log.d(TAG, "State updated outside of notification")
-            onMediaDataLoaded(key, key, data)
+                val actions =
+                    createActionsFromState(
+                        it.packageName,
+                        mediaControllerFactory.create(it.token),
+                        UserHandle(it.userId),
+                    )
+
+                // Control buttons
+                // If flag is enabled and controller has a PlaybackState,
+                // create actions from session info
+                // otherwise, no need to update semantic actions.
+                val data =
+                    if (actions != null) {
+                        it.copy(semanticActions = actions, isPlaying = isPlayingState(state.state))
+                    } else {
+                        it.copy(isPlaying = isPlayingState(state.state))
+                    }
+                if (DEBUG) Log.d(TAG, "State updated outside of notification")
+                foregroundExecutor.execute { onMediaDataLoaded(key, key, data) }
+            }
         }
     }
 
@@ -773,7 +779,7 @@
         }
         foregroundExecutor.executeDelayed(
             { removeEntry(key = key, userInitiated = userInitiated) },
-            delay
+            delay,
         )
         return existed
     }
@@ -793,12 +799,12 @@
             smartspaceMediaData =
                 EMPTY_SMARTSPACE_MEDIA_DATA.copy(
                     targetId = smartspaceMediaData.targetId,
-                    instanceId = smartspaceMediaData.instanceId
+                    instanceId = smartspaceMediaData.instanceId,
                 )
         }
         foregroundExecutor.executeDelayed(
             { notifySmartspaceMediaDataRemoved(smartspaceMediaData.targetId, immediately = true) },
-            delay
+            delay,
         )
     }
 
@@ -826,7 +832,7 @@
         token: MediaSession.Token,
         appName: String,
         appIntent: PendingIntent,
-        packageName: String
+        packageName: String,
     ) =
         withContext(backgroundDispatcher) {
             val lastActive = systemClock.elapsedRealtime()
@@ -843,7 +849,7 @@
                         token,
                         appName,
                         appIntent,
-                        packageName
+                        packageName,
                     )
             if (result == null || desc.title.isNullOrBlank()) {
                 Log.d(TAG, "No MediaData result for resumption")
@@ -882,7 +888,7 @@
                         appUid = result.appUid,
                         isExplicit = result.isExplicit,
                         resumeProgress = result.resumeProgress,
-                    )
+                    ),
                 )
             }
         }
@@ -895,7 +901,7 @@
         token: MediaSession.Token,
         appName: String,
         appIntent: PendingIntent,
-        packageName: String
+        packageName: String,
     ) {
         if (desc.title.isNullOrBlank()) {
             Log.e(TAG, "Description incomplete")
@@ -966,7 +972,7 @@
                     appUid = appUid,
                     isExplicit = isExplicit,
                     resumeProgress = progress,
-                )
+                ),
             )
         }
     }
@@ -981,7 +987,7 @@
         val token =
             sbn.notification.extras.getParcelable(
                 Notification.EXTRA_MEDIA_SESSION,
-                MediaSession.Token::class.java
+                MediaSession.Token::class.java,
             )
         if (token == null) {
             return
@@ -993,7 +999,7 @@
         val appInfo =
             notif.extras.getParcelable(
                 Notification.EXTRA_BUILDER_APPLICATION_INFO,
-                ApplicationInfo::class.java
+                ApplicationInfo::class.java,
             ) ?: getAppInfoFromPackage(sbn.packageName)
 
         // App name
@@ -1057,7 +1063,7 @@
             val deviceIntent =
                 extras.getParcelable(
                     Notification.EXTRA_MEDIA_REMOTE_INTENT,
-                    PendingIntent::class.java
+                    PendingIntent::class.java,
                 )
             Log.d(TAG, "$key is RCN for $deviceName")
 
@@ -1073,7 +1079,7 @@
                         deviceDrawable,
                         deviceName,
                         deviceIntent,
-                        showBroadcastButton = false
+                        showBroadcastButton = false,
                     )
             }
         }
@@ -1160,7 +1166,7 @@
                 mediaData.copy(
                     resumeAction = oldResumeAction,
                     hasCheckedForResume = oldHasCheckedForResume,
-                    active = oldActive
+                    active = oldActive,
                 )
             onMediaDataLoaded(key, oldKey, mediaData)
         }
@@ -1169,7 +1175,7 @@
     private fun logSingleVsMultipleMediaAdded(
         appUid: Int,
         packageName: String,
-        instanceId: InstanceId
+        instanceId: InstanceId,
     ) {
         if (mediaEntries.size == 1) {
             logger.logSingleMediaPlayerInCarousel(appUid, packageName, instanceId)
@@ -1207,7 +1213,7 @@
     private fun createActionsFromState(
         packageName: String,
         controller: MediaController,
-        user: UserHandle
+        user: UserHandle,
     ): MediaButton? {
         if (!mediaFlags.areMediaSessionActionsEnabled(packageName, user)) {
             return null
@@ -1245,7 +1251,7 @@
                 packageName,
                 ContentProvider.getUriWithoutUserId(uri),
                 Intent.FLAG_GRANT_READ_URI_PERMISSION,
-                ContentProvider.getUserIdFromUri(uri, userId)
+                ContentProvider.getUserIdFromUri(uri, userId),
             )
             return loadBitmapFromUri(uri)
         } catch (e: SecurityException) {
@@ -1282,7 +1288,7 @@
                 val scale =
                     MediaDataUtils.getScaleFactor(
                         APair(width, height),
-                        APair(artworkWidth, artworkHeight)
+                        APair(artworkWidth, artworkHeight),
                     )
 
                 // Downscale if needed
@@ -1307,7 +1313,7 @@
                 .loadDrawable(context),
             action,
             context.getString(R.string.controls_media_resume),
-            context.getDrawable(R.drawable.ic_media_play_container)
+            context.getDrawable(R.drawable.ic_media_play_container),
         )
     }
 
@@ -1371,10 +1377,7 @@
                 // There should NOT be more than 1 Smartspace media update. When it happens, it
                 // indicates a bad state or an error. Reset the status accordingly.
                 Log.wtf(TAG, "More than 1 Smartspace Media Update. Resetting the status...")
-                notifySmartspaceMediaDataRemoved(
-                    smartspaceMediaData.targetId,
-                    immediately = false,
-                )
+                notifySmartspaceMediaDataRemoved(smartspaceMediaData.targetId, immediately = false)
                 smartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA
             }
         }
@@ -1420,7 +1423,7 @@
     private fun handlePossibleRemoval(
         key: String,
         removed: MediaData,
-        notificationRemoved: Boolean = false
+        notificationRemoved: Boolean = false,
     ) {
         val hasSession = removed.token != null
         if (hasSession && removed.semanticActions != null) {
@@ -1445,7 +1448,7 @@
                 Log.d(
                     TAG,
                     "Notification ($notificationRemoved) and/or session " +
-                        "($hasSession) gone for inactive player $key"
+                        "($hasSession) gone for inactive player $key",
                 )
             }
             convertToResumePlayer(key, removed)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaActions.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaActions.kt
index f2825d0..4f97913 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaActions.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaActions.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.media.controls.domain.pipeline
 
+import android.annotation.WorkerThread
 import android.app.ActivityOptions
 import android.app.BroadcastOptions
 import android.app.Notification
@@ -50,6 +51,7 @@
  * @return a Pair consisting of a list of media actions, and a list of ints representing which of
  *   those actions should be shown in the compact player
  */
+@WorkerThread
 fun createActionsFromState(
     context: Context,
     packageName: String,
@@ -69,7 +71,7 @@
                 context.getString(R.string.controls_media_button_connecting),
                 context.getDrawable(R.drawable.ic_media_connecting_container),
                 // Specify a rebind id to prevent the spinner from restarting on later binds.
-                com.android.internal.R.drawable.progress_small_material
+                com.android.internal.R.drawable.progress_small_material,
             )
         } else if (isPlayingState(state.state)) {
             getStandardAction(context, controller, state.actions, PlaybackState.ACTION_PAUSE)
@@ -128,7 +130,7 @@
         nextCustomAction(),
         nextCustomAction(),
         reserveNext,
-        reservePrev
+        reservePrev,
     )
 }
 
@@ -146,7 +148,7 @@
     context: Context,
     controller: MediaController,
     stateActions: Long,
-    @PlaybackState.Actions action: Long
+    @PlaybackState.Actions action: Long,
 ): MediaAction? {
     if (!includesAction(stateActions, action)) {
         return null
@@ -158,7 +160,7 @@
                 context.getDrawable(R.drawable.ic_media_play),
                 { controller.transportControls.play() },
                 context.getString(R.string.controls_media_button_play),
-                context.getDrawable(R.drawable.ic_media_play_container)
+                context.getDrawable(R.drawable.ic_media_play_container),
             )
         }
         PlaybackState.ACTION_PAUSE -> {
@@ -166,7 +168,7 @@
                 context.getDrawable(R.drawable.ic_media_pause),
                 { controller.transportControls.pause() },
                 context.getString(R.string.controls_media_button_pause),
-                context.getDrawable(R.drawable.ic_media_pause_container)
+                context.getDrawable(R.drawable.ic_media_pause_container),
             )
         }
         PlaybackState.ACTION_SKIP_TO_PREVIOUS -> {
@@ -174,7 +176,7 @@
                 MediaControlDrawables.getPrevIcon(context),
                 { controller.transportControls.skipToPrevious() },
                 context.getString(R.string.controls_media_button_prev),
-                null
+                null,
             )
         }
         PlaybackState.ACTION_SKIP_TO_NEXT -> {
@@ -182,7 +184,7 @@
                 MediaControlDrawables.getNextIcon(context),
                 { controller.transportControls.skipToNext() },
                 context.getString(R.string.controls_media_button_next),
-                null
+                null,
             )
         }
         else -> null
@@ -194,13 +196,13 @@
     context: Context,
     packageName: String,
     controller: MediaController,
-    customAction: PlaybackState.CustomAction
+    customAction: PlaybackState.CustomAction,
 ): MediaAction {
     return MediaAction(
         Icon.createWithResource(packageName, customAction.icon).loadDrawable(context),
         { controller.transportControls.sendCustomAction(customAction, customAction.extras) },
         customAction.name,
-        null
+        null,
     )
 }
 
@@ -218,7 +220,7 @@
 /** Generate action buttons based on notification actions */
 fun createActionsFromNotification(
     context: Context,
-    sbn: StatusBarNotification
+    sbn: StatusBarNotification,
 ): Pair<List<MediaNotificationAction>, List<Int>> {
     val notif = sbn.notification
     val actionIcons: MutableList<MediaNotificationAction> = ArrayList()
@@ -229,7 +231,7 @@
     if (actionsToShowCollapsed.size > MAX_COMPACT_ACTIONS) {
         Log.e(
             TAG,
-            "Too many compact actions for ${sbn.key}, limiting to first $MAX_COMPACT_ACTIONS"
+            "Too many compact actions for ${sbn.key}, limiting to first $MAX_COMPACT_ACTIONS",
         )
         actionsToShowCollapsed = actionsToShowCollapsed.subList(0, MAX_COMPACT_ACTIONS)
     }
@@ -239,7 +241,7 @@
             Log.w(
                 TAG,
                 "Too many notification actions for ${sbn.key}, " +
-                    "limiting to first $MAX_NOTIFICATION_ACTIONS"
+                    "limiting to first $MAX_NOTIFICATION_ACTIONS",
             )
         }
 
@@ -253,7 +255,7 @@
             val themeText =
                 com.android.settingslib.Utils.getColorAttr(
                         context,
-                        com.android.internal.R.attr.textColorPrimary
+                        com.android.internal.R.attr.textColorPrimary,
                     )
                     .defaultColor
 
@@ -271,7 +273,7 @@
                     action.isAuthenticationRequired,
                     action.actionIntent,
                     mediaActionIcon,
-                    action.title
+                    action.title,
                 )
             actionIcons.add(mediaAction)
         }
@@ -288,7 +290,7 @@
  */
 fun getNotificationActions(
     actions: List<MediaNotificationAction>,
-    activityStarter: ActivityStarter
+    activityStarter: ActivityStarter,
 ): List<MediaAction> {
     return actions.map { action ->
         val runnable =
@@ -303,7 +305,7 @@
                             activityStarter.dismissKeyguardThenExecute(
                                 { sendPendingIntent(action.actionIntent) },
                                 {},
-                                true
+                                true,
                             )
                         else -> sendPendingIntent(actionIntent)
                     }
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataLoader.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataLoader.kt
index 7b55dac8..7b8703d 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataLoader.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataLoader.kt
@@ -111,16 +111,26 @@
      * If a new [loadMediaData] is issued while existing load is in progress, the existing (old)
      * load will be cancelled.
      */
-    suspend fun loadMediaData(key: String, sbn: StatusBarNotification): MediaDataLoaderResult? {
-        val loadMediaJob = backgroundScope.async { loadMediaDataInBackground(key, sbn) }
+    suspend fun loadMediaData(
+        key: String,
+        sbn: StatusBarNotification,
+        isConvertingToActive: Boolean = false,
+    ): MediaDataLoaderResult? {
+        val loadMediaJob =
+            backgroundScope.async { loadMediaDataInBackground(key, sbn, isConvertingToActive) }
         loadMediaJob.invokeOnCompletion {
             // We need to make sure we're removing THIS job after cancellation, not
             // a job that we created later.
             mediaProcessingJobs.remove(key, loadMediaJob)
         }
-        val existingJob = mediaProcessingJobs.put(key, loadMediaJob)
+        var existingJob: Job? = null
+        // Do not cancel loading jobs that convert resume players to active.
+        if (!isConvertingToActive) {
+            existingJob = mediaProcessingJobs.put(key, loadMediaJob)
+            existingJob?.cancel("New processing job incoming.")
+        }
         logD(TAG) { "Loading media data for $key... / existing job: $existingJob" }
-        existingJob?.cancel("New processing job incoming.")
+
         return loadMediaJob.await()
     }
 
@@ -129,12 +139,16 @@
     private suspend fun loadMediaDataInBackground(
         key: String,
         sbn: StatusBarNotification,
+        isConvertingToActive: Boolean = false,
     ): MediaDataLoaderResult? =
         traceCoroutine("MediaDataLoader#loadMediaData") {
             // We have apps spamming us with quick notification updates which can cause
             // us to spend significant CPU time loading duplicate data. This debounces
             // those requests at the cost of a bit of latency.
-            delay(DEBOUNCE_DELAY_MS)
+            // No delay needed to load jobs converting resume players to active.
+            if (!isConvertingToActive) {
+                delay(DEBOUNCE_DELAY_MS)
+            }
 
             val token =
                 sbn.notification.extras.getParcelable(
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessor.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessor.kt
index 5f0a9f8..affc7b7 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessor.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessor.kt
@@ -119,7 +119,7 @@
     arrayOf(
         MediaMetadata.METADATA_KEY_ALBUM_ART_URI,
         MediaMetadata.METADATA_KEY_ART_URI,
-        MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI
+        MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI,
     )
 
 private const val TAG = "MediaDataProcessor"
@@ -177,7 +177,7 @@
     private val themeText =
         com.android.settingslib.Utils.getColorAttr(
                 context,
-                com.android.internal.R.attr.textColorPrimary
+                com.android.internal.R.attr.textColorPrimary,
             )
             .defaultColor
 
@@ -330,6 +330,7 @@
     fun onNotificationAdded(key: String, sbn: StatusBarNotification) {
         if (useQsMediaPlayer && isMediaNotification(sbn)) {
             var isNewlyActiveEntry = false
+            var isConvertingToActive = false
             Assert.isMainThread()
             val oldKey = findExistingEntry(key, sbn.packageName)
             if (oldKey == null) {
@@ -347,9 +348,10 @@
                 // Resume -> active conversion; move to new key
                 val oldData = mediaDataRepository.removeMediaEntry(oldKey)!!
                 isNewlyActiveEntry = true
+                isConvertingToActive = true
                 mediaDataRepository.addMediaEntry(key, oldData)
             }
-            loadMediaData(key, sbn, oldKey, isNewlyActiveEntry)
+            loadMediaData(key, sbn, oldKey, isNewlyActiveEntry, isConvertingToActive)
         } else {
             onNotificationRemoved(key)
         }
@@ -365,7 +367,7 @@
                 secureSettings.getBoolForUser(
                     Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION,
                     true,
-                    UserHandle.USER_CURRENT
+                    UserHandle.USER_CURRENT,
                 )
 
             useQsMediaPlayer && flag
@@ -386,7 +388,7 @@
                 if (!allowMediaRecommendations) {
                     dismissSmartspaceRecommendation(
                         key = mediaDataRepository.smartspaceMediaData.value.targetId,
-                        delay = 0L
+                        delay = 0L,
                     )
                 }
             }
@@ -413,7 +415,7 @@
         token: MediaSession.Token,
         appName: String,
         appIntent: PendingIntent,
-        packageName: String
+        packageName: String,
     ) {
         // Resume controls don't have a notification key, so store by package name instead
         if (!mediaDataRepository.mediaEntries.value.containsKey(packageName)) {
@@ -449,7 +451,7 @@
                     token,
                     appName,
                     appIntent,
-                    packageName
+                    packageName,
                 )
             }
         } else {
@@ -461,7 +463,7 @@
                     token,
                     appName,
                     appIntent,
-                    packageName
+                    packageName,
                 )
             }
         }
@@ -488,10 +490,11 @@
         sbn: StatusBarNotification,
         oldKey: String?,
         isNewlyActiveEntry: Boolean = false,
+        isConvertingToActive: Boolean = false,
     ) {
         if (Flags.mediaLoadMetadataViaMediaDataLoader()) {
             applicationScope.launch {
-                loadMediaDataWithLoader(key, sbn, oldKey, isNewlyActiveEntry)
+                loadMediaDataWithLoader(key, sbn, oldKey, isNewlyActiveEntry, isConvertingToActive)
             }
         } else {
             backgroundExecutor.execute { loadMediaDataInBg(key, sbn, oldKey, isNewlyActiveEntry) }
@@ -582,30 +585,37 @@
     /** Called when the player's [PlaybackState] has been updated with new actions and/or state */
     internal fun updateState(key: String, state: PlaybackState) {
         mediaDataRepository.mediaEntries.value.get(key)?.let {
-            val token = it.token
-            if (token == null) {
-                if (DEBUG) Log.d(TAG, "State updated, but token was null")
-                return
-            }
-            val actions =
-                createActionsFromState(
-                    it.packageName,
-                    mediaControllerFactory.create(it.token),
-                    UserHandle(it.userId)
-                )
+            applicationScope.launch {
+                withContext(backgroundDispatcher) {
+                    val token = it.token
+                    if (token == null) {
+                        if (DEBUG) Log.d(TAG, "State updated, but token was null")
+                        return@withContext
+                    }
+                    val actions =
+                        createActionsFromState(
+                            it.packageName,
+                            mediaControllerFactory.create(it.token),
+                            UserHandle(it.userId),
+                        )
 
-            // Control buttons
-            // If flag is enabled and controller has a PlaybackState,
-            // create actions from session info
-            // otherwise, no need to update semantic actions.
-            val data =
-                if (actions != null) {
-                    it.copy(semanticActions = actions, isPlaying = isPlayingState(state.state))
-                } else {
-                    it.copy(isPlaying = isPlayingState(state.state))
+                    // Control buttons
+                    // If flag is enabled and controller has a PlaybackState,
+                    // create actions from session info
+                    // otherwise, no need to update semantic actions.
+                    val data =
+                        if (actions != null) {
+                            it.copy(
+                                semanticActions = actions,
+                                isPlaying = isPlayingState(state.state),
+                            )
+                        } else {
+                            it.copy(isPlaying = isPlayingState(state.state))
+                        }
+                    if (DEBUG) Log.d(TAG, "State updated outside of notification")
+                    withContext(mainDispatcher) { onMediaDataLoaded(key, key, data) }
                 }
-            if (DEBUG) Log.d(TAG, "State updated outside of notification")
-            onMediaDataLoaded(key, key, data)
+            }
         }
     }
 
@@ -633,7 +643,7 @@
         }
         foregroundExecutor.executeDelayed(
             { removeEntry(key, userInitiated = userInitiated) },
-            delayMs
+            delayMs,
         )
         return existed
     }
@@ -657,7 +667,7 @@
         if (mediaDataRepository.dismissSmartspaceRecommendation(key)) {
             foregroundExecutor.executeDelayed(
                 { notifySmartspaceMediaDataRemoved(key, immediately = true) },
-                delay
+                delay,
             )
         }
     }
@@ -677,7 +687,7 @@
         token: MediaSession.Token,
         appName: String,
         appIntent: PendingIntent,
-        packageName: String
+        packageName: String,
     ) =
         withContext(backgroundDispatcher) {
             val lastActive = systemClock.elapsedRealtime()
@@ -694,7 +704,7 @@
                         token,
                         appName,
                         appIntent,
-                        packageName
+                        packageName,
                     )
             if (result == null || desc.title.isNullOrBlank()) {
                 Log.d(TAG, "No MediaData result for resumption")
@@ -733,7 +743,7 @@
                         appUid = result.appUid,
                         isExplicit = result.isExplicit,
                         resumeProgress = result.resumeProgress,
-                    )
+                    ),
                 )
             }
         }
@@ -746,7 +756,7 @@
         token: MediaSession.Token,
         appName: String,
         appIntent: PendingIntent,
-        packageName: String
+        packageName: String,
     ) {
         if (desc.title.isNullOrBlank()) {
             Log.e(TAG, "Description incomplete")
@@ -818,7 +828,7 @@
                     isExplicit = isExplicit,
                     resumeProgress = progress,
                     smartspaceId = SmallHash.hash(appUid + systemClock.currentTimeMillis().toInt()),
-                )
+                ),
             )
         }
     }
@@ -828,10 +838,11 @@
         sbn: StatusBarNotification,
         oldKey: String?,
         isNewlyActiveEntry: Boolean = false,
+        isConvertingToActive: Boolean = false,
     ) =
         withContext(backgroundDispatcher) {
             val lastActive = systemClock.elapsedRealtime()
-            val result = mediaDataLoader.get().loadMediaData(key, sbn)
+            val result = mediaDataLoader.get().loadMediaData(key, sbn, isConvertingToActive)
             if (result == null) {
                 Log.d(TAG, "No result from loadMediaData")
                 return@withContext
@@ -887,14 +898,14 @@
                     result.appUid,
                     sbn.packageName,
                     instanceId,
-                    result.playbackLocation
+                    result.playbackLocation,
                 )
             } else if (result.playbackLocation != oldEntry?.playbackLocation) {
                 logger.logPlaybackLocationChange(
                     result.appUid,
                     sbn.packageName,
                     instanceId,
-                    result.playbackLocation
+                    result.playbackLocation,
                 )
             }
 
@@ -911,7 +922,7 @@
         val token =
             sbn.notification.extras.getParcelable(
                 Notification.EXTRA_MEDIA_SESSION,
-                MediaSession.Token::class.java
+                MediaSession.Token::class.java,
             )
         if (token == null) {
             return
@@ -923,7 +934,7 @@
         val appInfo =
             notif.extras.getParcelable(
                 Notification.EXTRA_BUILDER_APPLICATION_INFO,
-                ApplicationInfo::class.java
+                ApplicationInfo::class.java,
             ) ?: getAppInfoFromPackage(sbn.packageName)
 
         // App name
@@ -987,7 +998,7 @@
             val deviceIntent =
                 extras.getParcelable(
                     Notification.EXTRA_MEDIA_REMOTE_INTENT,
-                    PendingIntent::class.java
+                    PendingIntent::class.java,
                 )
             Log.d(TAG, "$key is RCN for $deviceName")
 
@@ -1003,7 +1014,7 @@
                         deviceDrawable,
                         deviceName,
                         deviceIntent,
-                        showBroadcastButton = false
+                        showBroadcastButton = false,
                     )
             }
         }
@@ -1093,7 +1104,7 @@
                 mediaData.copy(
                     resumeAction = oldResumeAction,
                     hasCheckedForResume = oldHasCheckedForResume,
-                    active = oldActive
+                    active = oldActive,
                 )
             onMediaDataLoaded(key, oldKey, mediaData)
         }
@@ -1102,7 +1113,7 @@
     private fun logSingleVsMultipleMediaAdded(
         appUid: Int,
         packageName: String,
-        instanceId: InstanceId
+        instanceId: InstanceId,
     ) {
         if (mediaDataRepository.mediaEntries.value.size == 1) {
             logger.logSingleMediaPlayerInCarousel(appUid, packageName, instanceId)
@@ -1151,7 +1162,7 @@
     private fun createActionsFromState(
         packageName: String,
         controller: MediaController,
-        user: UserHandle
+        user: UserHandle,
     ): MediaButton? {
         if (!mediaFlags.areMediaSessionActionsEnabled(packageName, user)) {
             return null
@@ -1189,7 +1200,7 @@
                 packageName,
                 ContentProvider.getUriWithoutUserId(uri),
                 Intent.FLAG_GRANT_READ_URI_PERMISSION,
-                ContentProvider.getUserIdFromUri(uri, userId)
+                ContentProvider.getUserIdFromUri(uri, userId),
             )
             return loadBitmapFromUri(uri)
         } catch (e: SecurityException) {
@@ -1226,7 +1237,7 @@
                 val scale =
                     MediaDataUtils.getScaleFactor(
                         APair(width, height),
-                        APair(artworkWidth, artworkHeight)
+                        APair(artworkWidth, artworkHeight),
                     )
 
                 // Downscale if needed
@@ -1251,7 +1262,7 @@
                 .loadDrawable(context),
             action,
             context.getString(R.string.controls_media_resume),
-            context.getDrawable(R.drawable.ic_media_play_container)
+            context.getDrawable(R.drawable.ic_media_play_container),
         )
     }
 
@@ -1291,7 +1302,7 @@
                 } else {
                     notifySmartspaceMediaDataRemoved(
                         smartspaceMediaData.targetId,
-                        immediately = false
+                        immediately = false,
                     )
                     mediaDataRepository.setRecommendation(
                         SmartspaceMediaData(
@@ -1362,7 +1373,7 @@
     private fun handlePossibleRemoval(
         key: String,
         removed: MediaData,
-        notificationRemoved: Boolean = false
+        notificationRemoved: Boolean = false,
     ) {
         val hasSession = removed.token != null
         if (hasSession && removed.semanticActions != null) {
@@ -1387,7 +1398,7 @@
                 Log.d(
                     TAG,
                     "Notification ($notificationRemoved) and/or session " +
-                        "($hasSession) gone for inactive player $key"
+                        "($hasSession) gone for inactive player $key",
                 )
             }
             convertToResumePlayer(key, removed)
@@ -1513,7 +1524,7 @@
             data: MediaData,
             immediately: Boolean = true,
             receivedSmartspaceCardLatency: Int = 0,
-            isSsReactivated: Boolean = false
+            isSsReactivated: Boolean = false,
         ) {}
 
         /**
@@ -1526,7 +1537,7 @@
         fun onSmartspaceMediaDataLoaded(
             key: String,
             data: SmartspaceMediaData,
-            shouldPrioritize: Boolean = false
+            shouldPrioritize: Boolean = false,
         ) {}
 
         /** Called whenever a previously existing Media notification was removed. */
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListener.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListener.kt
index 275f1ee..39cedc3 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListener.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListener.kt
@@ -128,7 +128,7 @@
         data: MediaData,
         immediately: Boolean,
         receivedSmartspaceCardLatency: Int,
-        isSsReactivated: Boolean
+        isSsReactivated: Boolean,
     ) {
         var reusedListener: PlaybackStateListener? = null
 
@@ -183,7 +183,7 @@
     override fun onSmartspaceMediaDataLoaded(
         key: String,
         data: SmartspaceMediaData,
-        shouldPrioritize: Boolean
+        shouldPrioritize: Boolean,
     ) {
         if (!mediaFlags.isPersistentSsCardEnabled()) return
 
@@ -259,7 +259,9 @@
         }
 
         override fun onPlaybackStateChanged(state: PlaybackState?) {
-            processState(state, dispatchEvents = true, currentResumption = resumption)
+            bgExecutor.execute {
+                processState(state, dispatchEvents = true, currentResumption = resumption)
+            }
         }
 
         override fun onSessionDestroyed() {
@@ -276,6 +278,7 @@
             }
         }
 
+        @WorkerThread
         private fun processState(
             state: PlaybackState?,
             dispatchEvents: Boolean,
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt
index a0fb0bf2..72650ea 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.media.controls.ui.controller
 
+import android.annotation.WorkerThread
 import android.app.PendingIntent
 import android.content.Context
 import android.content.Intent
@@ -41,6 +42,7 @@
 import com.android.keyguard.KeyguardUpdateMonitor
 import com.android.keyguard.KeyguardUpdateMonitorCallback
 import com.android.systemui.Dumpable
+import com.android.systemui.Flags.mediaControlsUmoInflationInBackground
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.dagger.qualifiers.Background
@@ -137,7 +139,7 @@
     private val activityStarter: ActivityStarter,
     private val systemClock: SystemClock,
     @Main private val mainDispatcher: CoroutineDispatcher,
-    @Main executor: DelayableExecutor,
+    @Main private val uiExecutor: DelayableExecutor,
     @Background private val bgExecutor: Executor,
     @Background private val backgroundDispatcher: CoroutineDispatcher,
     private val mediaManager: MediaDataManager,
@@ -227,7 +229,7 @@
     private var carouselLocale: Locale? = null
 
     private val animationScaleObserver: ContentObserver =
-        object : ContentObserver(executor, 0) {
+        object : ContentObserver(uiExecutor, 0) {
             override fun onChange(selfChange: Boolean) {
                 if (!SceneContainerFlag.isEnabled) {
                     MediaPlayerData.players().forEach { it.updateAnimatorDurationScale() }
@@ -350,7 +352,7 @@
             MediaCarouselScrollHandler(
                 mediaCarousel,
                 pageIndicator,
-                executor,
+                uiExecutor,
                 this::onSwipeToDismiss,
                 this::updatePageIndicatorLocation,
                 this::updateSeekbarListening,
@@ -458,7 +460,17 @@
                     isSsReactivated: Boolean,
                 ) {
                     debugLogger.logMediaLoaded(key, data.active)
-                    if (addOrUpdatePlayer(key, oldKey, data, isSsReactivated)) {
+                    val onUiExecutionEnd =
+                        if (mediaControlsUmoInflationInBackground()) {
+                            Runnable {
+                                if (immediately) {
+                                    updateHostVisibility()
+                                }
+                            }
+                        } else {
+                            null
+                        }
+                    if (addOrUpdatePlayer(key, oldKey, data, isSsReactivated, onUiExecutionEnd)) {
                         // Log card received if a new resumable media card is added
                         MediaPlayerData.getMediaPlayer(key)?.let {
                             logSmartspaceCardReported(
@@ -980,6 +992,7 @@
         oldKey: String?,
         data: MediaData,
         isSsReactivated: Boolean,
+        onUiExecutionEnd: Runnable? = null,
     ): Boolean =
         traceSection("MediaCarouselController#addOrUpdatePlayer") {
             MediaPlayerData.moveIfExists(oldKey, key)
@@ -987,76 +1000,119 @@
             val curVisibleMediaKey =
                 MediaPlayerData.visiblePlayerKeys()
                     .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex)
-            if (existingPlayer == null) {
-                val newPlayer = mediaControlPanelFactory.get()
-                if (SceneContainerFlag.isEnabled) {
-                    newPlayer.mediaViewController.widthInSceneContainerPx = widthInSceneContainerPx
-                    newPlayer.mediaViewController.heightInSceneContainerPx =
-                        heightInSceneContainerPx
-                }
-                newPlayer.attachPlayer(
-                    MediaViewHolder.create(LayoutInflater.from(context), mediaContent)
-                )
-                newPlayer.mediaViewController.sizeChangedListener = this::updateCarouselDimensions
-                val lp =
-                    LinearLayout.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        ViewGroup.LayoutParams.WRAP_CONTENT,
-                    )
-                newPlayer.mediaViewHolder?.player?.setLayoutParams(lp)
-                newPlayer.bindPlayer(data, key)
-                newPlayer.setListening(
-                    mediaCarouselScrollHandler.visibleToUser && currentlyExpanded
-                )
-                MediaPlayerData.addMediaPlayer(
-                    key,
-                    data,
-                    newPlayer,
-                    systemClock,
-                    isSsReactivated,
-                    debugLogger,
-                )
-                updateViewControllerToState(newPlayer.mediaViewController, noAnimation = true)
-                // Media data added from a recommendation card should starts playing.
-                if (
-                    (shouldScrollToKey && data.isPlaying == true) ||
-                        (!shouldScrollToKey && data.active)
-                ) {
-                    reorderAllPlayers(curVisibleMediaKey, key)
+            if (mediaControlsUmoInflationInBackground()) {
+                if (existingPlayer == null) {
+                    bgExecutor.execute {
+                        val mediaViewHolder = createMediaViewHolderInBg()
+                        // Add the new player in the main thread.
+                        uiExecutor.execute {
+                            setupNewPlayer(
+                                key,
+                                data,
+                                isSsReactivated,
+                                curVisibleMediaKey,
+                                mediaViewHolder,
+                            )
+                            updatePageIndicator()
+                            mediaCarouselScrollHandler.onPlayersChanged()
+                            mediaFrame.requiresRemeasuring = true
+                            onUiExecutionEnd?.run()
+                        }
+                    }
                 } else {
-                    needsReordering = true
+                    updatePlayer(key, data, isSsReactivated, curVisibleMediaKey, existingPlayer)
+                    updatePageIndicator()
+                    mediaCarouselScrollHandler.onPlayersChanged()
+                    mediaFrame.requiresRemeasuring = true
+                    onUiExecutionEnd?.run()
                 }
             } else {
-                existingPlayer.bindPlayer(data, key)
-                MediaPlayerData.addMediaPlayer(
-                    key,
-                    data,
-                    existingPlayer,
-                    systemClock,
-                    isSsReactivated,
-                    debugLogger,
-                )
-                val packageName = MediaPlayerData.smartspaceMediaData?.packageName ?: String()
-                // In case of recommendations hits.
-                // Check the playing status of media player and the package name.
-                // To make sure we scroll to the right app's media player.
-                if (
-                    isReorderingAllowed ||
-                        shouldScrollToKey &&
-                            data.isPlaying == true &&
-                            packageName == data.packageName
-                ) {
-                    reorderAllPlayers(curVisibleMediaKey, key)
+                if (existingPlayer == null) {
+                    val mediaViewHolder =
+                        MediaViewHolder.create(LayoutInflater.from(context), mediaContent)
+                    setupNewPlayer(key, data, isSsReactivated, curVisibleMediaKey, mediaViewHolder)
                 } else {
-                    needsReordering = true
+                    updatePlayer(key, data, isSsReactivated, curVisibleMediaKey, existingPlayer)
                 }
+                updatePageIndicator()
+                mediaCarouselScrollHandler.onPlayersChanged()
+                mediaFrame.requiresRemeasuring = true
+                onUiExecutionEnd?.run()
             }
-            updatePageIndicator()
-            mediaCarouselScrollHandler.onPlayersChanged()
-            mediaFrame.requiresRemeasuring = true
             return existingPlayer == null
         }
 
+    private fun updatePlayer(
+        key: String,
+        data: MediaData,
+        isSsReactivated: Boolean,
+        curVisibleMediaKey: MediaPlayerData.MediaSortKey?,
+        existingPlayer: MediaControlPanel,
+    ) {
+        existingPlayer.bindPlayer(data, key)
+        MediaPlayerData.addMediaPlayer(
+            key,
+            data,
+            existingPlayer,
+            systemClock,
+            isSsReactivated,
+            debugLogger,
+        )
+        val packageName = MediaPlayerData.smartspaceMediaData?.packageName ?: String()
+        // In case of recommendations hits.
+        // Check the playing status of media player and the package name.
+        // To make sure we scroll to the right app's media player.
+        if (
+            isReorderingAllowed ||
+                shouldScrollToKey && data.isPlaying == true && packageName == data.packageName
+        ) {
+            reorderAllPlayers(curVisibleMediaKey, key)
+        } else {
+            needsReordering = true
+        }
+    }
+
+    private fun setupNewPlayer(
+        key: String,
+        data: MediaData,
+        isSsReactivated: Boolean,
+        curVisibleMediaKey: MediaPlayerData.MediaSortKey?,
+        mediaViewHolder: MediaViewHolder,
+    ) {
+        val newPlayer = mediaControlPanelFactory.get()
+        newPlayer.attachPlayer(mediaViewHolder)
+        newPlayer.mediaViewController.sizeChangedListener =
+            this@MediaCarouselController::updateCarouselDimensions
+        val lp =
+            LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+            )
+        newPlayer.mediaViewHolder?.player?.setLayoutParams(lp)
+        newPlayer.bindPlayer(data, key)
+        newPlayer.setListening(mediaCarouselScrollHandler.visibleToUser && currentlyExpanded)
+        MediaPlayerData.addMediaPlayer(
+            key,
+            data,
+            newPlayer,
+            systemClock,
+            isSsReactivated,
+            debugLogger,
+        )
+        updateViewControllerToState(newPlayer.mediaViewController, noAnimation = true)
+        // Media data added from a recommendation card should starts playing.
+        if ((shouldScrollToKey && data.isPlaying == true) || (!shouldScrollToKey && data.active)) {
+            reorderAllPlayers(curVisibleMediaKey, key)
+        } else {
+            needsReordering = true
+        }
+    }
+
+    @WorkerThread
+    private fun createMediaViewHolderInBg(): MediaViewHolder {
+        return MediaViewHolder.create(LayoutInflater.from(context), mediaContent)
+    }
+
     private fun addSmartspaceMediaRecommendations(
         key: String,
         data: SmartspaceMediaData,
@@ -1173,8 +1229,16 @@
         val previousVisibleKey =
             MediaPlayerData.visiblePlayerKeys()
                 .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex)
+        val onUiExecutionEnd = Runnable {
+            if (recreateMedia) {
+                reorderAllPlayers(previousVisibleKey)
+            }
+        }
 
-        MediaPlayerData.mediaData().forEach { (key, data, isSsMediaRec) ->
+        val mediaDataList = MediaPlayerData.mediaData()
+        // Do not loop through the original list of media data because the re-addition of media data
+        // is being executed in background thread.
+        mediaDataList.forEach { (key, data, isSsMediaRec) ->
             if (isSsMediaRec) {
                 val smartspaceMediaData = MediaPlayerData.smartspaceMediaData
                 removePlayer(key, dismissMediaData = false, dismissRecommendation = false)
@@ -1185,6 +1249,7 @@
                         MediaPlayerData.shouldPrioritizeSs,
                     )
                 }
+                onUiExecutionEnd.run()
             } else {
                 val isSsReactivated = MediaPlayerData.isSsReactivated(key)
                 if (recreateMedia) {
@@ -1195,11 +1260,9 @@
                     oldKey = null,
                     data = data,
                     isSsReactivated = isSsReactivated,
+                    onUiExecutionEnd = onUiExecutionEnd,
                 )
             }
-            if (recreateMedia) {
-                reorderAllPlayers(previousVisibleKey)
-            }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerLogger.kt
index 1be25a7..9b443f5 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerLogger.kt
@@ -39,7 +39,7 @@
             {
                 "Potential memory leak: " +
                     "Removing control panel for $str1 from map without calling #onDestroy"
-            }
+            },
         )
 
     fun logMediaLoaded(key: String, active: Boolean) =
@@ -50,7 +50,7 @@
                 str1 = key
                 bool1 = active
             },
-            { "add player $str1, active: $bool1" }
+            { "add player $str1, active: $bool1" },
         )
 
     fun logMediaRemoved(key: String, userInitiated: Boolean) =
@@ -61,7 +61,7 @@
                 str1 = key
                 bool1 = userInitiated
             },
-            { "removing player $str1, by user $bool1" }
+            { "removing player $str1, by user $bool1" },
         )
 
     fun logRecommendationLoaded(key: String, isActive: Boolean) =
@@ -72,7 +72,7 @@
                 str1 = key
                 bool1 = isActive
             },
-            { "add recommendation $str1, active $bool1" }
+            { "add recommendation $str1, active $bool1" },
         )
 
     fun logRecommendationRemoved(key: String, immediately: Boolean) =
@@ -83,12 +83,24 @@
                 str1 = key
                 bool1 = immediately
             },
-            { "removing recommendation $str1, immediate=$bool1" }
+            { "removing recommendation $str1, immediate=$bool1" },
         )
 
     fun logCarouselHidden() = buffer.log(TAG, LogLevel.DEBUG, {}, { "hiding carousel" })
 
     fun logCarouselVisible() = buffer.log(TAG, LogLevel.DEBUG, {}, { "showing carousel" })
+
+    fun logMediaHostVisibility(location: Int, visible: Boolean) {
+        buffer.log(
+            TAG,
+            LogLevel.DEBUG,
+            {
+                int1 = location
+                bool1 = visible
+            },
+            { "media host visibility changed location=$location, visible:$visible" },
+        )
+    }
 }
 
 private const val TAG = "MediaCarouselCtlrLog"
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHostStatesManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHostStatesManager.kt
index 8660d12..782da4b 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHostStatesManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHostStatesManager.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.media.controls.ui.controller
 
 import com.android.app.tracing.traceSection
+import com.android.systemui.Flags.mediaControlsUmoInflationInBackground
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.media.controls.ui.view.MediaHostState
 import com.android.systemui.util.animation.MeasurementOutput
@@ -71,23 +72,34 @@
      */
     fun updateCarouselDimensions(
         @MediaLocation location: Int,
-        hostState: MediaHostState
+        hostState: MediaHostState,
     ): MeasurementOutput =
         traceSection("MediaHostStatesManager#updateCarouselDimensions") {
             val result = MeasurementOutput(0, 0)
+            var changed = false
             for (controller in controllers) {
                 val measurement = controller.getMeasurementsForState(hostState)
                 measurement?.let {
                     if (it.measuredHeight > result.measuredHeight) {
                         result.measuredHeight = it.measuredHeight
+                        changed = true
                     }
                     if (it.measuredWidth > result.measuredWidth) {
                         result.measuredWidth = it.measuredWidth
+                        changed = true
                     }
                 }
             }
-            carouselSizes[location] = result
-            return result
+            if (mediaControlsUmoInflationInBackground()) {
+                // Set carousel size if result measurements changed. This avoids setting carousel
+                // size when this method gets called before the addition of media view controllers
+                if (!carouselSizes.contains(location) || changed) {
+                    carouselSizes[location] = result
+                }
+            } else {
+                carouselSizes[location] = result
+            }
+            return carouselSizes[location] ?: result
         }
 
     /** Add a callback to be called when a MediaState has updated */
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaHost.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaHost.kt
index 09a6181..11251cd 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaHost.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaHost.kt
@@ -20,10 +20,12 @@
 import android.util.ArraySet
 import android.view.View
 import android.view.View.OnAttachStateChangeListener
+import com.android.systemui.Flags.mediaControlsUmoInflationInBackground
 import com.android.systemui.media.controls.domain.pipeline.MediaDataManager
 import com.android.systemui.media.controls.shared.model.MediaData
 import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
 import com.android.systemui.media.controls.ui.controller.MediaCarouselController
+import com.android.systemui.media.controls.ui.controller.MediaCarouselControllerLogger
 import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
 import com.android.systemui.media.controls.ui.controller.MediaHostStatesManager
 import com.android.systemui.media.controls.ui.controller.MediaLocation
@@ -40,6 +42,7 @@
     private val mediaDataManager: MediaDataManager,
     private val mediaHostStatesManager: MediaHostStatesManager,
     private val mediaCarouselController: MediaCarouselController,
+    private val debugLogger: MediaCarouselControllerLogger,
 ) : MediaHostState by state {
     lateinit var hostView: UniqueObjectHostView
     var location: Int = -1
@@ -91,8 +94,10 @@
                 data: MediaData,
                 immediately: Boolean,
                 receivedSmartspaceCardLatency: Int,
-                isSsReactivated: Boolean
+                isSsReactivated: Boolean,
             ) {
+                if (mediaControlsUmoInflationInBackground()) return
+
                 if (immediately) {
                     updateViewVisibility()
                 }
@@ -101,7 +106,7 @@
             override fun onSmartspaceMediaDataLoaded(
                 key: String,
                 data: SmartspaceMediaData,
-                shouldPrioritize: Boolean
+                shouldPrioritize: Boolean,
             ) {
                 updateViewVisibility()
             }
@@ -171,7 +176,7 @@
                         input.widthMeasureSpec =
                             View.MeasureSpec.makeMeasureSpec(
                                 View.MeasureSpec.getSize(input.widthMeasureSpec),
-                                View.MeasureSpec.EXACTLY
+                                View.MeasureSpec.EXACTLY,
                             )
                     }
                     // This will trigger a state change that ensures that we now have a state
@@ -214,6 +219,7 @@
         val newVisibility = if (visible) View.VISIBLE else View.GONE
         if (newVisibility != hostView.visibility) {
             hostView.visibility = newVisibility
+            debugLogger.logMediaHostVisibility(location, visible)
             visibleChangedListeners.forEach { it.invoke(visible) }
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java b/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java
index 59b98b2..36a9fb3 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java
@@ -22,6 +22,7 @@
 import com.android.systemui.media.controls.domain.MediaDomainModule;
 import com.android.systemui.media.controls.domain.pipeline.MediaDataManager;
 import com.android.systemui.media.controls.ui.controller.MediaCarouselController;
+import com.android.systemui.media.controls.ui.controller.MediaCarouselControllerLogger;
 import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager;
 import com.android.systemui.media.controls.ui.controller.MediaHostStatesManager;
 import com.android.systemui.media.controls.ui.view.MediaHost;
@@ -60,9 +61,10 @@
     @Named(QS_PANEL)
     static MediaHost providesQSMediaHost(MediaHost.MediaHostStateHolder stateHolder,
             MediaHierarchyManager hierarchyManager, MediaDataManager dataManager,
-            MediaHostStatesManager statesManager, MediaCarouselController carouselController) {
+            MediaHostStatesManager statesManager, MediaCarouselController carouselController,
+            MediaCarouselControllerLogger logger) {
         return new MediaHost(stateHolder, hierarchyManager, dataManager, statesManager,
-                carouselController);
+                carouselController, logger);
     }
 
     /** */
@@ -71,9 +73,10 @@
     @Named(QUICK_QS_PANEL)
     static MediaHost providesQuickQSMediaHost(MediaHost.MediaHostStateHolder stateHolder,
             MediaHierarchyManager hierarchyManager, MediaDataManager dataManager,
-            MediaHostStatesManager statesManager, MediaCarouselController carouselController) {
+            MediaHostStatesManager statesManager, MediaCarouselController carouselController,
+            MediaCarouselControllerLogger logger) {
         return new MediaHost(stateHolder, hierarchyManager, dataManager, statesManager,
-                carouselController);
+                carouselController, logger);
     }
 
     /** */
@@ -82,9 +85,10 @@
     @Named(KEYGUARD)
     static MediaHost providesKeyguardMediaHost(MediaHost.MediaHostStateHolder stateHolder,
             MediaHierarchyManager hierarchyManager, MediaDataManager dataManager,
-            MediaHostStatesManager statesManager, MediaCarouselController carouselController) {
+            MediaHostStatesManager statesManager, MediaCarouselController carouselController,
+            MediaCarouselControllerLogger logger) {
         return new MediaHost(stateHolder, hierarchyManager, dataManager, statesManager,
-                carouselController);
+                carouselController, logger);
     }
 
     /** */
@@ -93,9 +97,10 @@
     @Named(DREAM)
     static MediaHost providesDreamMediaHost(MediaHost.MediaHostStateHolder stateHolder,
             MediaHierarchyManager hierarchyManager, MediaDataManager dataManager,
-            MediaHostStatesManager statesManager, MediaCarouselController carouselController) {
+            MediaHostStatesManager statesManager, MediaCarouselController carouselController,
+            MediaCarouselControllerLogger logger) {
         return new MediaHost(stateHolder, hierarchyManager, dataManager, statesManager,
-                carouselController);
+                carouselController, logger);
     }
 
     /** */
@@ -104,9 +109,10 @@
     @Named(COMMUNAL_HUB)
     static MediaHost providesCommunalMediaHost(MediaHost.MediaHostStateHolder stateHolder,
             MediaHierarchyManager hierarchyManager, MediaDataManager dataManager,
-            MediaHostStatesManager statesManager, MediaCarouselController carouselController) {
+            MediaHostStatesManager statesManager, MediaCarouselController carouselController,
+            MediaCarouselControllerLogger logger) {
         return new MediaHost(stateHolder, hierarchyManager, dataManager, statesManager,
-                carouselController);
+                carouselController, logger);
     }
 
     /** Provides a logging buffer related to the media tap-to-transfer chip on the sender device. */
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogger.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogger.kt
index 078d534..f563f87 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogger.kt
@@ -26,18 +26,11 @@
 
 /** A logger for all events related to the media tap-to-transfer receiver experience. */
 @SysUISingleton
-class MediaTttReceiverLogger
-@Inject
-constructor(
-    @MediaTttReceiverLogBuffer buffer: LogBuffer,
-) : TemporaryViewLogger<ChipReceiverInfo>(buffer, TAG) {
+class MediaTttReceiverLogger @Inject constructor(@MediaTttReceiverLogBuffer buffer: LogBuffer) :
+    TemporaryViewLogger<ChipReceiverInfo>(buffer, TAG) {
 
     /** Logs a change in the chip state for the given [mediaRouteId]. */
-    fun logStateChange(
-        stateName: String,
-        mediaRouteId: String,
-        packageName: String?,
-    ) {
+    fun logStateChange(stateName: String, mediaRouteId: String, packageName: String?) {
         MediaTttLoggerUtils.logStateChange(buffer, TAG, stateName, mediaRouteId, packageName)
     }
 
@@ -51,12 +44,27 @@
         MediaTttLoggerUtils.logPackageNotFound(buffer, TAG, packageName)
     }
 
-    fun logRippleAnimationEnd(id: Int) {
+    fun logRippleAnimationEnd(id: Int, type: String) {
         buffer.log(
             tag,
             LogLevel.DEBUG,
-            { int1 = id },
-            { "ripple animation for view with id: $int1 is ended" }
+            {
+                int1 = id
+                str1 = type
+            },
+            { "ripple animation for view with id=$int1 is ended, animation type=$str1" },
+        )
+    }
+
+    fun logRippleAnimationStart(id: Int, type: String) {
+        buffer.log(
+            tag,
+            LogLevel.DEBUG,
+            {
+                int1 = id
+                str1 = type
+            },
+            { "ripple animation for view with id=$int1 is started, animation type=$str1" },
         )
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverRippleController.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverRippleController.kt
index a232971..9d00435 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverRippleController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverRippleController.kt
@@ -69,7 +69,9 @@
         )
         rippleView.addOnAttachStateChangeListener(
             object : View.OnAttachStateChangeListener {
-                override fun onViewDetachedFromWindow(view: View) {}
+                override fun onViewDetachedFromWindow(view: View) {
+                    view.visibility = View.GONE
+                }
 
                 override fun onViewAttachedToWindow(view: View) {
                     if (view == null) {
@@ -81,7 +83,7 @@
                     } else {
                         layoutRipple(attachedRippleView)
                     }
-                    attachedRippleView.expandRipple()
+                    attachedRippleView.expandRipple(mediaTttReceiverLogger)
                     attachedRippleView.removeOnAttachStateChangeListener(this)
                 }
             }
@@ -126,7 +128,7 @@
         iconRippleView.setMaxSize(radius * 0.8f, radius * 0.8f)
         iconRippleView.setCenter(
             width * 0.5f,
-            height - getReceiverIconSize() * 0.5f - getReceiverIconBottomMargin()
+            height - getReceiverIconSize() * 0.5f - getReceiverIconBottomMargin(),
         )
         iconRippleView.setColor(getRippleColor(), RIPPLE_OPACITY)
     }
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ReceiverChipRippleView.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ReceiverChipRippleView.kt
index 81059e3..cd733ec 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ReceiverChipRippleView.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ReceiverChipRippleView.kt
@@ -37,10 +37,14 @@
         isStarted = false
     }
 
-    fun expandRipple(onAnimationEnd: Runnable? = null) {
+    fun expandRipple(logger: MediaTttReceiverLogger, onAnimationEnd: Runnable? = null) {
         duration = DEFAULT_DURATION
         isStarted = true
-        super.startRipple(onAnimationEnd)
+        super.startRipple {
+            logger.logRippleAnimationEnd(id, EXPAND)
+            onAnimationEnd?.run()
+        }
+        logger.logRippleAnimationStart(id, EXPAND)
     }
 
     /** Used to animate out the ripple. No-op if the ripple was never started via [startRipple]. */
@@ -53,10 +57,14 @@
         animator.removeAllListeners()
         animator.addListener(
             object : AnimatorListenerAdapter() {
+                override fun onAnimationCancel(animation: Animator) {
+                    onAnimationEnd(animation)
+                }
+
                 override fun onAnimationEnd(animation: Animator) {
                     animation?.let {
                         visibility = GONE
-                        logger.logRippleAnimationEnd(id)
+                        logger.logRippleAnimationEnd(id, COLLAPSE)
                     }
                     onAnimationEnd?.run()
                     isStarted = false
@@ -64,13 +72,14 @@
             }
         )
         animator.reverse()
+        logger.logRippleAnimationStart(id, COLLAPSE)
     }
 
     // Expands the ripple to cover full screen.
     fun expandToFull(
         newHeight: Float,
         logger: MediaTttReceiverLogger,
-        onAnimationEnd: Runnable? = null
+        onAnimationEnd: Runnable? = null,
     ) {
         if (!isStarted) {
             return
@@ -95,10 +104,14 @@
         }
         animator.addListener(
             object : AnimatorListenerAdapter() {
+                override fun onAnimationCancel(animation: Animator) {
+                    onAnimationEnd(animation)
+                }
+
                 override fun onAnimationEnd(animation: Animator) {
                     animation?.let {
                         visibility = GONE
-                        logger.logRippleAnimationEnd(id)
+                        logger.logRippleAnimationEnd(id, EXPAND_TO_FULL)
                     }
                     onAnimationEnd?.run()
                     isStarted = false
@@ -106,6 +119,7 @@
             }
         )
         animator.start()
+        logger.logRippleAnimationStart(id, EXPAND_TO_FULL)
     }
 
     // Calculates the actual starting percentage according to ripple shader progress set method.
@@ -151,5 +165,8 @@
     companion object {
         const val DEFAULT_DURATION = 333L
         const val EXPAND_TO_FULL_DURATION = 1000L
+        private const val COLLAPSE = "collapse"
+        private const val EXPAND_TO_FULL = "expand to full"
+        private const val EXPAND = "expand"
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt
index 228b576..d413474 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt
@@ -54,6 +54,7 @@
 import com.android.systemui.mediaprojection.appselector.data.RecentTask
 import com.android.systemui.mediaprojection.appselector.view.MediaProjectionRecentsViewController
 import com.android.systemui.res.R
+import com.android.systemui.shared.system.ActivityManagerWrapper
 import com.android.systemui.statusbar.policy.ConfigurationController
 import com.android.systemui.util.AsyncActivityLauncher
 import java.lang.IllegalArgumentException
@@ -62,9 +63,10 @@
 class MediaProjectionAppSelectorActivity(
     private val componentFactory: MediaProjectionAppSelectorComponent.Factory,
     private val activityLauncher: AsyncActivityLauncher,
+    private val activityManager: ActivityManagerWrapper,
     /** This is used to override the dependency in a screenshot test */
     @VisibleForTesting
-    private val listControllerFactory: ((userHandle: UserHandle) -> ResolverListController)?
+    private val listControllerFactory: ((userHandle: UserHandle) -> ResolverListController)?,
 ) :
     ChooserActivity(),
     MediaProjectionAppSelectorView,
@@ -74,8 +76,9 @@
     @Inject
     constructor(
         componentFactory: MediaProjectionAppSelectorComponent.Factory,
-        activityLauncher: AsyncActivityLauncher
-    ) : this(componentFactory, activityLauncher, listControllerFactory = null)
+        activityLauncher: AsyncActivityLauncher,
+        activityManager: ActivityManagerWrapper,
+    ) : this(componentFactory, activityLauncher, activityManager, listControllerFactory = null)
 
     private val lifecycleRegistry = LifecycleRegistry(this)
     override val lifecycle = lifecycleRegistry
@@ -100,7 +103,7 @@
                 callingPackage = callingPackage,
                 view = this,
                 resultHandler = this,
-                isFirstStart = savedInstanceState == null
+                isFirstStart = savedInstanceState == null,
             )
         component.lifecycleObservers.forEach { lifecycle.addObserver(it) }
 
@@ -113,7 +116,7 @@
         intent.configureChooserIntent(
             resources,
             component.hostUserHandle,
-            component.personalProfileUserHandle
+            component.personalProfileUserHandle,
         )
 
         reviewGrantedConsentRequired =
@@ -180,7 +183,13 @@
         // is created and ready to be captured.
         val activityStarted =
             activityLauncher.startActivityAsUser(intent, userHandle, activityOptions.toBundle()) {
-                returnSelectedApp(launchCookie, taskId = -1)
+                if (targetInfo.resolvedComponentName == callingActivity) {
+                    // If attempting to launch the app used to launch the MediaProjection, then
+                    // provide the task id since the launch cookie won't match the existing task
+                    returnSelectedApp(launchCookie, taskId = activityManager.runningTask.taskId)
+                } else {
+                    returnSelectedApp(launchCookie, taskId = -1)
+                }
             }
 
         // Rely on the ActivityManager to pop up a dialog regarding app suspension
@@ -213,7 +222,7 @@
             MediaProjectionServiceHelper.setReviewedConsentIfNeeded(
                 RECORD_CANCEL,
                 reviewGrantedConsentRequired,
-                /* projection= */ null
+                /* projection= */ null,
             )
             if (isFinishing) {
                 // Only log dismissed when actually finishing, and not when changing configuration.
@@ -246,7 +255,7 @@
             val resultReceiver =
                 intent.getParcelableExtra(
                     EXTRA_CAPTURE_REGION_RESULT_RECEIVER,
-                    ResultReceiver::class.java
+                    ResultReceiver::class.java,
                 ) as ResultReceiver
             val captureRegion = MediaProjectionCaptureTarget(launchCookie, taskId)
             val data = Bundle().apply { putParcelable(KEY_CAPTURE_TARGET, captureRegion) }
@@ -260,8 +269,8 @@
             val mediaProjectionBinder = intent.getIBinderExtra(EXTRA_MEDIA_PROJECTION)
             val projection = IMediaProjection.Stub.asInterface(mediaProjectionBinder)
 
-            projection.setLaunchCookie(launchCookie)
-            projection.setTaskId(taskId)
+            projection.launchCookie = launchCookie
+            projection.taskId = taskId
 
             val intent = Intent()
             intent.putExtra(EXTRA_MEDIA_PROJECTION, projection.asBinder())
@@ -270,7 +279,7 @@
             MediaProjectionServiceHelper.setReviewedConsentIfNeeded(
                 RECORD_CONTENT_TASK,
                 reviewGrantedConsentRequired,
-                projection
+                projection,
             )
         }
 
@@ -457,7 +466,7 @@
      */
     private class RecyclerViewExpandingAccessibilityDelegate(
         rdl: ResolverDrawerLayout,
-        view: RecyclerView
+        view: RecyclerView,
     ) : RecyclerViewAccessibilityDelegate(view) {
 
         private val delegate = AppListAccessibilityDelegate(rdl)
@@ -465,7 +474,7 @@
         override fun onRequestSendAccessibilityEvent(
             host: ViewGroup,
             child: View,
-            event: AccessibilityEvent
+            event: AccessibilityEvent,
         ): Boolean {
             super.onRequestSendAccessibilityEvent(host, child, event)
             return delegate.onRequestSendAccessibilityEvent(host, child, event)
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java b/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java
index 8351597..c3729c0 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java
@@ -68,12 +68,12 @@
 import com.android.systemui.statusbar.phone.AlertDialogWithDelegate;
 import com.android.systemui.statusbar.phone.SystemUIDialog;
 
+import dagger.Lazy;
+
 import java.util.function.Consumer;
 
 import javax.inject.Inject;
 
-import dagger.Lazy;
-
 public class MediaProjectionPermissionActivity extends Activity {
     private static final String TAG = "MediaProjectionPermissionActivity";
     private static final float MAX_APP_NAME_SIZE_PX = 500f;
@@ -132,8 +132,7 @@
                 mPackageName = launchingIntent.getStringExtra(
                         EXTRA_PACKAGE_REUSING_GRANTED_CONSENT);
             } else {
-                setResult(RESULT_CANCELED);
-                finish(RECORD_CANCEL, /* projection= */ null);
+                finishAsCancelled();
                 return;
             }
         }
@@ -145,8 +144,7 @@
             mUid = aInfo.uid;
         } catch (PackageManager.NameNotFoundException e) {
             Log.e(TAG, "Unable to look up package name", e);
-            setResult(RESULT_CANCELED);
-            finish(RECORD_CANCEL, /* projection= */ null);
+            finishAsCancelled();
             return;
         }
 
@@ -176,15 +174,13 @@
             }
         } catch (RemoteException e) {
             Log.e(TAG, "Error checking projection permissions", e);
-            setResult(RESULT_CANCELED);
-            finish(RECORD_CANCEL, /* projection= */ null);
+            finishAsCancelled();
             return;
         }
 
         if (mFeatureFlags.isEnabled(Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING_ENTERPRISE_POLICIES)) {
             if (showScreenCaptureDisabledDialogIfNeeded()) {
-                setResult(RESULT_CANCELED);
-                finish(RECORD_CANCEL, /* projection= */ null);
+                finishAsCancelled();
                 return;
             }
         }
@@ -346,6 +342,21 @@
     private void requestDeviceUnlock() {
         mKeyguardManager.requestDismissKeyguard(this,
                 new KeyguardManager.KeyguardDismissCallback() {
+
+                    @Override
+                    public void onDismissError() {
+                        if (com.android.systemui.Flags.mediaProjectionDialogBehindLockscreen()) {
+                            finishAsCancelled();
+                        }
+                    }
+
+                    @Override
+                    public void onDismissCancelled() {
+                        if (com.android.systemui.Flags.mediaProjectionDialogBehindLockscreen()) {
+                            finishAsCancelled();
+                        }
+                    }
+
                     @Override
                     public void onDismissSucceeded() {
                         mDialog.show();
@@ -386,8 +397,7 @@
             }
         } catch (RemoteException e) {
             Log.e(TAG, "Error granting projection permission", e);
-            setResult(RESULT_CANCELED);
-            finish(RECORD_CANCEL, /* projection= */ null);
+            finishAsCancelled();
         } finally {
             if (mDialog != null) {
                 mDialog.dismiss();
@@ -436,6 +446,14 @@
         }
     }
 
+    /**
+     * Finishes this activity and cancel the projection request.
+     */
+    private void finishAsCancelled() {
+        setResult(RESULT_CANCELED);
+        finish(RECORD_CANCEL, /* projection= */ null);
+    }
+
     @Nullable
     private MediaProjectionConfig getMediaProjectionConfig() {
         Intent intent = getIntent();
diff --git a/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt b/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt
index 0d748a1..0bf4c7e 100644
--- a/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt
+++ b/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt
@@ -84,7 +84,10 @@
          */
         val EvaluatorByFlag =
             mapOf<Long, (SceneContainerPluginState) -> Boolean>(
-                SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE to { it.scene != Scenes.Gone },
+                SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE to
+                    {
+                        it.scene != Scenes.Gone || it.overlays.isNotEmpty()
+                    },
                 SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED to
                     {
                         when {
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
index f7a505a..b3463bd 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
@@ -64,7 +64,6 @@
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.Surface;
-import android.view.VelocityTracker;
 import android.view.ViewConfiguration;
 import android.view.WindowInsets;
 import android.view.WindowManager;
@@ -191,7 +190,6 @@
                 }
             };
 
-    private final VelocityTracker mVelocityTracker = VelocityTracker.obtain();
     private final Context mContext;
     private final UserTracker mUserTracker;
     private final OverviewProxyService mOverviewProxyService;
@@ -326,6 +324,11 @@
                     logGesture(mInRejectedExclusion
                             ? SysUiStatsLog.BACK_GESTURE__TYPE__COMPLETED_REJECTED
                             : SysUiStatsLog.BACK_GESTURE__TYPE__COMPLETED);
+                    if (!mInRejectedExclusion) {
+                        // Log successful back gesture to contextual edu stats
+                        mOverviewProxyService.updateContextualEduStats(mIsTrackpadThreeFingerSwipe,
+                                GestureType.BACK);
+                    }
                 }
 
                 @Override
@@ -1037,10 +1040,6 @@
 
             mIsTrackpadThreeFingerSwipe = isTrackpadThreeFingerSwipe(ev);
 
-            // ACTION_UP or ACTION_CANCEL is not guaranteed to be called before a new
-            // ACTION_DOWN, in that case we should just reuse the old instance.
-            mVelocityTracker.clear();
-
             // Verify if this is in within the touch region and we aren't in immersive mode, and
             // either the bouncer is showing or the notification panel is hidden
             mInputEventReceiver.setBatchingEnabled(false);
@@ -1153,8 +1152,6 @@
                         if (mAllowGesture) {
                             if (mBackAnimation != null) {
                                 mBackAnimation.onThresholdCrossed();
-                                mOverviewProxyService.updateContextualEduStats(
-                                        mIsTrackpadThreeFingerSwipe, GestureType.BACK);
                             } else {
                                 pilferPointers();
                             }
@@ -1191,28 +1188,9 @@
 
     private void dispatchToBackAnimation(MotionEvent event) {
         if (mBackAnimation != null) {
-            mVelocityTracker.addMovement(event);
-
-            final float velocityX;
-            final float velocityY;
-            if (event.getAction() == MotionEvent.ACTION_UP) {
-                // Compute the current velocity is expensive (see computeCurrentVelocity), so we
-                // are only doing it when the user completes the gesture.
-                int unitPixelPerSecond = 1000;
-                int maxVelocity = mViewConfiguration.getScaledMaximumFlingVelocity();
-                mVelocityTracker.computeCurrentVelocity(unitPixelPerSecond, maxVelocity);
-                velocityX = mVelocityTracker.getXVelocity();
-                velocityY = mVelocityTracker.getYVelocity();
-            } else {
-                velocityX = Float.NaN;
-                velocityY = Float.NaN;
-            }
-
             mBackAnimation.onBackMotion(
                     /* touchX = */ event.getX(),
                     /* touchY = */ event.getY(),
-                    /* velocityX = */ velocityX,
-                    /* velocityY = */ velocityY,
                     /* keyAction = */ event.getActionMasked(),
                     /* swipeEdge = */ mIsOnLeftEdge ? BackEvent.EDGE_LEFT : BackEvent.EDGE_RIGHT);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModel.kt
index 5be225c..0e54041 100644
--- a/packages/SystemUI/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModel.kt
@@ -16,12 +16,19 @@
 
 package com.android.systemui.notifications.ui.viewmodel
 
+import com.android.systemui.lifecycle.ExclusiveActivatable
 import com.android.systemui.scene.domain.interactor.SceneInteractor
-import com.android.systemui.scene.shared.model.Overlays
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel
 import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.launch
 
 /**
  * Models UI state used to render the content of the notifications shade overlay.
@@ -34,13 +41,40 @@
 constructor(
     val shadeHeaderViewModelFactory: ShadeHeaderViewModel.Factory,
     val notificationsPlaceholderViewModelFactory: NotificationsPlaceholderViewModel.Factory,
-    private val sceneInteractor: SceneInteractor,
-) {
+    val sceneInteractor: SceneInteractor,
+    private val shadeInteractor: ShadeInteractor,
+) : ExclusiveActivatable() {
+
+    override suspend fun onActivated(): Nothing {
+        coroutineScope {
+            launch {
+                sceneInteractor.currentScene.collect { currentScene ->
+                    when (currentScene) {
+                        // TODO(b/369513770): The ShadeSession should be preserved in this scenario.
+                        Scenes.Bouncer ->
+                            shadeInteractor.collapseNotificationsShade(
+                                loggingReason = "bouncer shown while shade is open"
+                            )
+                    }
+                }
+            }
+
+            launch {
+                shadeInteractor.isShadeTouchable
+                    .distinctUntilChanged()
+                    .filter { !it }
+                    .collect {
+                        shadeInteractor.collapseNotificationsShade(
+                            loggingReason = "device became non-interactive"
+                        )
+                    }
+            }
+        }
+        awaitCancellation()
+    }
+
     fun onScrimClicked() {
-        sceneInteractor.hideOverlay(
-            overlay = Overlays.NotificationsShade,
-            loggingReason = "Shade scrim clicked",
-        )
+        shadeInteractor.collapseNotificationsShade(loggingReason = "shade scrim clicked")
     }
 
     @AssistedFactory
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
index ba0d938..65c29b8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
@@ -52,9 +52,8 @@
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.layout.approachLayout
 import androidx.compose.ui.layout.onPlaced
-import androidx.compose.ui.layout.onSizeChanged
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.platform.ComposeView
 import androidx.compose.ui.res.dimensionResource
@@ -62,12 +61,14 @@
 import androidx.compose.ui.semantics.CustomAccessibilityAction
 import androidx.compose.ui.semantics.customActions
 import androidx.compose.ui.semantics.semantics
-import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.round
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import androidx.lifecycle.lifecycleScope
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.compose.animation.scene.ContentKey
+import com.android.compose.animation.scene.ElementKey
+import com.android.compose.animation.scene.ElementMatcher
 import com.android.compose.animation.scene.MutableSceneTransitionLayoutState
 import com.android.compose.animation.scene.SceneKey
 import com.android.compose.animation.scene.SceneScope
@@ -180,6 +181,7 @@
         qqsMediaHost.init(MediaHierarchyManager.LOCATION_QQS)
         qsMediaHost.init(MediaHierarchyManager.LOCATION_QS)
         setListenerCollections()
+        lifecycleScope.launch { viewModel.activate() }
     }
 
     override fun onCreateView(
@@ -190,58 +192,22 @@
         val context = inflater.context
         val composeView =
             ComposeView(context).apply {
-                setBackPressedDispatcher()
-                setContent {
-                    PlatformTheme {
-                        val visible by viewModel.qsVisible.collectAsStateWithLifecycle()
-
-                        AnimatedVisibility(
-                            visible = visible,
-                            modifier =
-                                Modifier.windowInsetsPadding(WindowInsets.navigationBars)
-                                    .thenIf(notificationScrimClippingParams.isEnabled) {
-                                        Modifier.notificationScrimClip(
-                                            notificationScrimClippingParams.leftInset,
-                                            notificationScrimClippingParams.top,
-                                            notificationScrimClippingParams.rightInset,
-                                            notificationScrimClippingParams.bottom,
-                                            notificationScrimClippingParams.radius,
+                repeatWhenAttached {
+                    repeatOnLifecycle(Lifecycle.State.CREATED) {
+                        setViewTreeOnBackPressedDispatcherOwner(
+                            object : OnBackPressedDispatcherOwner {
+                                override val onBackPressedDispatcher =
+                                    OnBackPressedDispatcher().apply {
+                                        setOnBackInvokedDispatcher(
+                                            it.viewRootImpl.onBackInvokedDispatcher
                                         )
                                     }
-                                    .graphicsLayer { elevation = 4.dp.toPx() },
-                        ) {
-                            val isEditing by
-                                viewModel.containerViewModel.editModeViewModel.isEditing
-                                    .collectAsStateWithLifecycle()
-                            val animationSpecEditMode = tween<Float>(EDIT_MODE_TIME_MILLIS)
-                            AnimatedContent(
-                                targetState = isEditing,
-                                transitionSpec = {
-                                    fadeIn(animationSpecEditMode) togetherWith
-                                        fadeOut(animationSpecEditMode)
-                                },
-                                label = "EditModeAnimatedContent",
-                            ) { editing ->
-                                if (editing) {
-                                    val qqsPadding by
-                                        viewModel.qqsHeaderHeight.collectAsStateWithLifecycle()
-                                    EditMode(
-                                        viewModel = viewModel.containerViewModel.editModeViewModel,
-                                        modifier =
-                                            Modifier.fillMaxWidth()
-                                                .padding(top = { qqsPadding })
-                                                .padding(
-                                                    horizontal = {
-                                                        QuickSettingsShade.Dimensions.Padding
-                                                            .roundToPx()
-                                                    }
-                                                ),
-                                    )
-                                } else {
-                                    CollapsableQuickSettingsSTL()
-                                }
+
+                                override val lifecycle: Lifecycle =
+                                    this@repeatWhenAttached.lifecycle
                             }
-                        }
+                        )
+                        setContent { this@QSFragmentCompose.Content() }
                     }
                 }
             }
@@ -260,6 +226,58 @@
         return frame
     }
 
+    @Composable
+    private fun Content() {
+        PlatformTheme {
+            val visible by viewModel.qsVisible.collectAsStateWithLifecycle()
+
+            AnimatedVisibility(
+                visible = visible,
+                modifier =
+                    Modifier.windowInsetsPadding(WindowInsets.navigationBars).thenIf(
+                        notificationScrimClippingParams.isEnabled
+                    ) {
+                        Modifier.notificationScrimClip(
+                            notificationScrimClippingParams.leftInset,
+                            notificationScrimClippingParams.top,
+                            notificationScrimClippingParams.rightInset,
+                            notificationScrimClippingParams.bottom,
+                            notificationScrimClippingParams.radius,
+                        )
+                    },
+            ) {
+                val isEditing by
+                    viewModel.containerViewModel.editModeViewModel.isEditing
+                        .collectAsStateWithLifecycle()
+                val animationSpecEditMode = tween<Float>(EDIT_MODE_TIME_MILLIS)
+                AnimatedContent(
+                    targetState = isEditing,
+                    transitionSpec = {
+                        fadeIn(animationSpecEditMode) togetherWith fadeOut(animationSpecEditMode)
+                    },
+                    label = "EditModeAnimatedContent",
+                ) { editing ->
+                    if (editing) {
+                        val qqsPadding by viewModel.qqsHeaderHeight.collectAsStateWithLifecycle()
+                        EditMode(
+                            viewModel = viewModel.containerViewModel.editModeViewModel,
+                            modifier =
+                                Modifier.fillMaxWidth()
+                                    .padding(top = { qqsPadding })
+                                    .padding(
+                                        horizontal = {
+                                            QuickSettingsShade.Dimensions.Padding.roundToPx()
+                                        }
+                                    ),
+                        )
+                    } else {
+                        CollapsableQuickSettingsSTL()
+                    }
+                }
+            }
+        }
+    }
+
     /**
      * STL that contains both QQS (tiles) and QS (brightness, tiles, footer actions), but no Edit
      * mode. It tracks [QSFragmentComposeViewModel.expansionState] to drive the transition between
@@ -273,7 +291,7 @@
                 transitions =
                     transitions {
                         from(QuickQuickSettings, QuickSettings) {
-                            quickQuickSettingsToQuickSettings()
+                            quickQuickSettingsToQuickSettings(viewModel::inFirstPage::get)
                         }
                     },
             )
@@ -331,7 +349,7 @@
     }
 
     override fun setOverscrolling(overscrolling: Boolean) {
-        viewModel.stackScrollerOverscrollingValue = overscrolling
+        viewModel.isStackScrollerOverscrolling = overscrolling
     }
 
     override fun setExpanded(qsExpanded: Boolean) {
@@ -410,11 +428,11 @@
         qsTransitionFraction: Float,
         qsSquishinessFraction: Float,
     ) {
-        super.setTransitionToFullShadeProgress(
-            isTransitioningToFullShade,
-            qsTransitionFraction,
-            qsSquishinessFraction,
-        )
+        viewModel.isTransitioningToFullShade = isTransitioningToFullShade
+        viewModel.lockscreenToShadeProgressValue = qsTransitionFraction
+        if (isTransitioningToFullShade) {
+            viewModel.squishinessFractionValue = qsSquishinessFraction
+        }
     }
 
     override fun setFancyClipping(
@@ -518,6 +536,10 @@
 
             onDispose { qqsVisible.value = false }
         }
+        val squishiness by
+            viewModel.containerViewModel.quickQuickSettingsViewModel.squishinessViewModel
+                .squishiness
+                .collectAsStateWithLifecycle()
         Column(modifier = Modifier.sysuiResTag("quick_qs_panel")) {
             Box(
                 modifier =
@@ -531,7 +553,16 @@
                                 topFromRoot + coordinates.size.height,
                             )
                         }
-                        .onSizeChanged { size -> qqsHeight.value = size.height }
+                        // Use an approach layout to determien the height without squishiness, as
+                        // that's the value that NPVC and QuickSettingsController care about
+                        // (measured height).
+                        .approachLayout(isMeasurementApproachInProgress = { squishiness < 1f }) {
+                            measurable,
+                            constraints ->
+                            qqsHeight.value = lookaheadSize.height
+                            val placeable = measurable.measure(constraints)
+                            layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+                        }
                         .padding(top = { qqsPadding }, bottom = { bottomPadding.roundToPx() })
             ) {
                 val qsEnabled by viewModel.qsEnabled.collectAsStateWithLifecycle()
@@ -648,23 +679,6 @@
     }
 }
 
-private fun View.setBackPressedDispatcher() {
-    repeatWhenAttached {
-        repeatOnLifecycle(Lifecycle.State.CREATED) {
-            setViewTreeOnBackPressedDispatcherOwner(
-                object : OnBackPressedDispatcherOwner {
-                    override val onBackPressedDispatcher =
-                        OnBackPressedDispatcher().apply {
-                            setOnBackInvokedDispatcher(it.viewRootImpl.onBackInvokedDispatcher)
-                        }
-
-                    override val lifecycle: Lifecycle = this@repeatWhenAttached.lifecycle
-                }
-            )
-        }
-    }
-}
-
 private suspend inline fun <Listener : Any, Data> setListenerJob(
     listenerFlow: MutableStateFlow<Listener?>,
     dataFlow: Flow<Data>,
@@ -706,6 +720,14 @@
             else -> QuickSettings
         }
     }
+
+    val QqsTileElementMatcher =
+        object : ElementMatcher {
+            override fun matches(key: ElementKey, content: ContentKey): Boolean {
+                return content == SceneKeys.QuickQuickSettings &&
+                    ElementKeys.TileElementMatcher.matches(key, content)
+            }
+        }
 }
 
 suspend fun synchronizeQsState(state: MutableSceneTransitionLayoutState, expansion: Flow<Float>) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/ui/FromQuickQuickSettingsToQuickSettings.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/ui/FromQuickQuickSettingsToQuickSettings.kt
index 1514986..9e3945e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/ui/FromQuickQuickSettingsToQuickSettings.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/ui/FromQuickQuickSettingsToQuickSettings.kt
@@ -17,13 +17,23 @@
 package com.android.systemui.qs.composefragment.ui
 
 import com.android.compose.animation.scene.TransitionBuilder
+import com.android.systemui.qs.composefragment.SceneKeys
 import com.android.systemui.qs.shared.ui.ElementKeys
 
-fun TransitionBuilder.quickQuickSettingsToQuickSettings() {
+fun TransitionBuilder.quickQuickSettingsToQuickSettings(inFirstPage: () -> Boolean = { true }) {
 
     fractionRange(start = 0.5f) { fade(ElementKeys.QuickSettingsContent) }
 
     fractionRange(start = 0.9f) { fade(ElementKeys.FooterActions) }
 
     anchoredTranslate(ElementKeys.QuickSettingsContent, ElementKeys.GridAnchor)
+
+    sharedElement(ElementKeys.TileElementMatcher, enabled = inFirstPage())
+
+    // This will animate between 0f (QQS) and 0.6, fading in the QQS tiles when coming back
+    // from non first page QS. The QS content ends fading out at 0.5f, so there's a brief
+    // overlap, but because they are really faint, it looks better than complete black without
+    // overlap.
+    fractionRange(end = 0.6f) { fade(SceneKeys.QqsTileElementMatcher) }
+    anchoredTranslate(SceneKeys.QqsTileElementMatcher, ElementKeys.GridAnchor)
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
index 7300ee1..7a8b2c2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
@@ -24,16 +24,20 @@
 import com.android.systemui.Dumpable
 import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
 import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
+import com.android.systemui.lifecycle.ExclusiveActivatable
 import com.android.systemui.plugins.statusbar.StatusBarStateController
 import com.android.systemui.qs.FooterActionsController
+import com.android.systemui.qs.composefragment.viewmodel.QSFragmentComposeViewModel.QSExpansionState
 import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel
+import com.android.systemui.qs.panels.domain.interactor.TileSquishinessInteractor
+import com.android.systemui.qs.panels.ui.viewmodel.PaginatedGridViewModel
 import com.android.systemui.qs.ui.viewmodel.QuickSettingsContainerViewModel
 import com.android.systemui.shade.LargeScreenHeaderHelper
 import com.android.systemui.shade.transition.LargeScreenShadeInterpolator
 import com.android.systemui.statusbar.StatusBarState
 import com.android.systemui.statusbar.SysuiStatusBarStateController
 import com.android.systemui.statusbar.disableflags.data.repository.DisableFlagsRepository
-import com.android.systemui.statusbar.phone.KeyguardBypassController
 import com.android.systemui.util.LargeScreenUtils
 import com.android.systemui.util.asIndenting
 import com.android.systemui.util.printSection
@@ -50,6 +54,7 @@
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.onStart
 import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.launch
 
@@ -61,13 +66,15 @@
     private val footerActionsViewModelFactory: FooterActionsViewModel.Factory,
     private val footerActionsController: FooterActionsController,
     private val sysuiStatusBarStateController: SysuiStatusBarStateController,
-    private val keyguardBypassController: KeyguardBypassController,
+    private val deviceEntryInteractor: DeviceEntryInteractor,
     private val disableFlagsRepository: DisableFlagsRepository,
     private val largeScreenShadeInterpolator: LargeScreenShadeInterpolator,
     private val configurationInteractor: ConfigurationInteractor,
     private val largeScreenHeaderHelper: LargeScreenHeaderHelper,
+    private val squishinessInteractor: TileSquishinessInteractor,
+    private val paginatedGridViewModel: PaginatedGridViewModel,
     @Assisted private val lifecycleScope: LifecycleCoroutineScope,
-) : Dumpable {
+) : Dumpable, ExclusiveActivatable() {
     val footerActionsViewModel =
         footerActionsViewModelFactory.create(lifecycleScope).also {
             lifecycleScope.launch { footerActionsController.init() }
@@ -110,7 +117,7 @@
             _panelFraction.value = value
         }
 
-    private val _squishinessFraction = MutableStateFlow(0f)
+    private val _squishinessFraction = MutableStateFlow(1f)
     var squishinessFractionValue: Float
         get() = _squishinessFraction.value
         set(value) {
@@ -131,7 +138,7 @@
     private val _headerAnimating = MutableStateFlow(false)
 
     private val _stackScrollerOverscrolling = MutableStateFlow(false)
-    var stackScrollerOverscrollingValue: Boolean
+    var isStackScrollerOverscrolling: Boolean
         get() = _stackScrollerOverscrolling.value
         set(value) {
             _stackScrollerOverscrolling.value = value
@@ -150,8 +157,6 @@
                 disableFlagsRepository.disableFlags.value.isQuickSettingsEnabled(),
             )
 
-    private val _showCollapsedOnKeyguard = MutableStateFlow(false)
-
     private val _keyguardAndExpanded = MutableStateFlow(false)
 
     /**
@@ -177,21 +182,65 @@
 
                 awaitClose { sysuiStatusBarStateController.removeCallback(callback) }
             }
+            .onStart { emit(sysuiStatusBarStateController.state) }
             .stateIn(
                 lifecycleScope,
                 SharingStarted.WhileSubscribed(),
                 sysuiStatusBarStateController.state,
             )
 
+    private val isKeyguardState =
+        statusBarState
+            .map { it == StatusBarState.KEYGUARD }
+            .stateIn(
+                lifecycleScope,
+                SharingStarted.WhileSubscribed(),
+                statusBarState.value == StatusBarState.KEYGUARD,
+            )
+
     private val _viewHeight = MutableStateFlow(0)
 
     private val _headerTranslation = MutableStateFlow(0f)
 
     private val _inSplitShade = MutableStateFlow(false)
+    var isInSplitShade: Boolean
+        get() = _inSplitShade.value
+        set(value) {
+            _inSplitShade.value = value
+        }
 
     private val _transitioningToFullShade = MutableStateFlow(false)
+    var isTransitioningToFullShade: Boolean
+        get() = _transitioningToFullShade.value
+        set(value) {
+            _transitioningToFullShade.value = value
+        }
 
-    private val _lockscreenToShadeProgress = MutableStateFlow(false)
+    private val isBypassEnabled = deviceEntryInteractor.isBypassEnabled
+
+    private val showCollapsedOnKeyguard =
+        combine(
+                isBypassEnabled,
+                _transitioningToFullShade,
+                _inSplitShade,
+                ::calculateShowCollapsedOnKeyguard,
+            )
+            .stateIn(
+                lifecycleScope,
+                SharingStarted.WhileSubscribed(),
+                calculateShowCollapsedOnKeyguard(
+                    isBypassEnabled.value,
+                    isTransitioningToFullShade,
+                    isInSplitShade,
+                ),
+            )
+
+    private val _lockscreenToShadeProgress = MutableStateFlow(0.0f)
+    var lockscreenToShadeProgressValue: Float
+        get() = _lockscreenToShadeProgress.value
+        set(value) {
+            _lockscreenToShadeProgress.value = value
+        }
 
     private val _overscrolling = MutableStateFlow(false)
 
@@ -212,12 +261,32 @@
             _heightOverride.value = value
         }
 
+    private val forceQS =
+        combine(
+                _qsExpanded,
+                _stackScrollerOverscrolling,
+                isKeyguardState,
+                showCollapsedOnKeyguard,
+                ::calculateForceQs,
+            )
+            .stateIn(
+                lifecycleScope,
+                SharingStarted.WhileSubscribed(),
+                calculateForceQs(
+                    isQSExpanded,
+                    isStackScrollerOverscrolling,
+                    isKeyguardState.value,
+                    showCollapsedOnKeyguard.value,
+                ),
+            )
+
     val expansionState: StateFlow<QSExpansionState> =
-        combine(_stackScrollerOverscrolling, _qsExpanded, _qsExpansion) { args: Array<Any> ->
-                val expansion = args[2] as Float
-                QSExpansionState(expansion.coerceIn(0f, 1f))
-            }
-            .stateIn(lifecycleScope, SharingStarted.WhileSubscribed(), QSExpansionState(0f))
+        combine(_qsExpansion, forceQS, ::calculateExpansionState)
+            .stateIn(
+                lifecycleScope,
+                SharingStarted.WhileSubscribed(),
+                calculateExpansionState(_qsExpansion.value, forceQS.value),
+            )
 
     /**
      * Accessibility action for collapsing/expanding QS. The provided runnable is responsible for
@@ -225,6 +294,19 @@
      */
     var collapseExpandAccessibilityAction: Runnable? = null
 
+    val inFirstPage: Boolean
+        get() = paginatedGridViewModel.inFirstPage
+
+    override suspend fun onActivated(): Nothing {
+        hydrateSquishinessInteractor()
+    }
+
+    private suspend fun hydrateSquishinessInteractor(): Nothing {
+        _squishinessFraction.collect {
+            squishinessInteractor.setSquishinessValue(it.constrainSquishiness())
+        }
+    }
+
     override fun dump(pw: PrintWriter, args: Array<out String>) {
         pw.asIndenting().run {
             printSection("Quick Settings state") {
@@ -238,13 +320,17 @@
                 println("panelExpansionFraction", panelExpansionFractionValue)
                 println("squishinessFraction", squishinessFractionValue)
                 println("expansionState", expansionState.value)
+                println("forceQS", forceQS.value)
             }
             printSection("Shade state") {
-                println("stackOverscrolling", stackScrollerOverscrollingValue)
+                println("stackOverscrolling", isStackScrollerOverscrolling)
                 println("statusBarState", StatusBarState.toString(statusBarState.value))
+                println("isKeyguardState", isKeyguardState.value)
                 println("isSmallScreen", isSmallScreenValue)
                 println("heightOverride", "${heightOverrideValue}px")
                 println("qqsHeaderHeight", "${qqsHeaderHeight.value}px")
+                println("isSplitShade", isInSplitShade)
+                println("showCollapsedOnKeyguard", showCollapsedOnKeyguard.value)
             }
         }
     }
@@ -257,3 +343,35 @@
     // In the future, this will have other relevant elements like squishiness.
     data class QSExpansionState(@FloatRange(0.0, 1.0) val progress: Float)
 }
+
+private fun Float.constrainSquishiness(): Float {
+    return (0.1f + this * 0.9f).coerceIn(0f, 1f)
+}
+
+// Helper methods for combining flows.
+
+private fun calculateExpansionState(expansion: Float, forceQs: Boolean): QSExpansionState {
+    return if (forceQs) {
+        QSExpansionState(1f)
+    } else {
+        QSExpansionState(expansion.coerceIn(0f, 1f))
+    }
+}
+
+private fun calculateForceQs(
+    isQSExpanded: Boolean,
+    isStackOverScrolling: Boolean,
+    isKeyguardShowing: Boolean,
+    shouldShowCollapsedOnKeyguard: Boolean,
+): Boolean {
+    return (isQSExpanded || isStackOverScrolling) &&
+        (isKeyguardShowing && !shouldShowCollapsedOnKeyguard)
+}
+
+private fun calculateShowCollapsedOnKeyguard(
+    isBypassEnabled: Boolean,
+    isTransitioningToFullShade: Boolean,
+    isInSplitShade: Boolean,
+): Boolean {
+    return isBypassEnabled || (isTransitioningToFullShade && !isInSplitShade)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/logging/QSLogger.kt b/packages/SystemUI/src/com/android/systemui/qs/logging/QSLogger.kt
index 278352c..ead38f3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/logging/QSLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/logging/QSLogger.kt
@@ -33,6 +33,7 @@
 import com.android.systemui.log.dagger.QSConfigLog
 import com.android.systemui.log.dagger.QSLog
 import com.android.systemui.plugins.qs.QSTile
+import com.android.systemui.plugins.qs.QSTile.State
 import com.android.systemui.statusbar.StatusBarState
 import com.google.errorprone.annotations.CompileTimeConstant
 import javax.inject.Inject
@@ -57,6 +58,7 @@
     fun d(@CompileTimeConstant msg: String, arg: Any) {
         buffer.log(TAG, DEBUG, { str1 = arg.toString() }, { "$msg: $str1" })
     }
+
     fun i(@CompileTimeConstant msg: String, arg: Any) {
         buffer.log(TAG, INFO, { str1 = arg.toString() }, { "$msg: $str1" })
     }
@@ -73,7 +75,19 @@
                 str1 = tileSpec
                 str2 = reason
             },
-            { "[$str1] Tile destroyed. Reason: $str2" }
+            { "[$str1] Tile destroyed. Reason: $str2" },
+        )
+    }
+
+    fun logStateChanged(tileSpec: String, state: State) {
+        buffer.log(
+            TAG,
+            DEBUG,
+            {
+                str1 = tileSpec
+                str2 = state.toString()
+            },
+            { "[$str1] Tile state=$str2" },
         )
     }
 
@@ -85,7 +99,7 @@
                 bool1 = listening
                 str1 = tileSpec
             },
-            { "[$str1] Tile listening=$bool1" }
+            { "[$str1] Tile listening=$bool1" },
         )
     }
 
@@ -98,7 +112,7 @@
                 str1 = containerName
                 str2 = allSpecs
             },
-            { "Tiles listening=$bool1 in $str1. $str2" }
+            { "Tiles listening=$bool1 in $str1. $str2" },
         )
     }
 
@@ -112,7 +126,7 @@
                 str2 = StatusBarState.toString(statusBarState)
                 str3 = toStateString(state)
             },
-            { "[$str1][$int1] Tile clicked. StatusBarState=$str2. TileState=$str3" }
+            { "[$str1][$int1] Tile clicked. StatusBarState=$str2. TileState=$str3" },
         )
     }
 
@@ -124,7 +138,7 @@
                 str1 = tileSpec
                 int1 = eventId
             },
-            { "[$str1][$int1] Tile handling click." }
+            { "[$str1][$int1] Tile handling click." },
         )
     }
 
@@ -138,7 +152,7 @@
                 str2 = StatusBarState.toString(statusBarState)
                 str3 = toStateString(state)
             },
-            { "[$str1][$int1] Tile secondary clicked. StatusBarState=$str2. TileState=$str3" }
+            { "[$str1][$int1] Tile secondary clicked. StatusBarState=$str2. TileState=$str3" },
         )
     }
 
@@ -150,7 +164,7 @@
                 str1 = tileSpec
                 int1 = eventId
             },
-            { "[$str1][$int1] Tile handling secondary click." }
+            { "[$str1][$int1] Tile handling secondary click." },
         )
     }
 
@@ -164,7 +178,7 @@
                 str2 = StatusBarState.toString(statusBarState)
                 str3 = toStateString(state)
             },
-            { "[$str1][$int1] Tile long clicked. StatusBarState=$str2. TileState=$str3" }
+            { "[$str1][$int1] Tile long clicked. StatusBarState=$str2. TileState=$str3" },
         )
     }
 
@@ -176,7 +190,7 @@
                 str1 = tileSpec
                 int1 = eventId
             },
-            { "[$str1][$int1] Tile handling long click." }
+            { "[$str1][$int1] Tile handling long click." },
         )
     }
 
@@ -189,7 +203,7 @@
                 int1 = lastType
                 str2 = callback
             },
-            { "[$str1] mLastTileState=$int1, Callback=$str2." }
+            { "[$str1] mLastTileState=$int1, Callback=$str2." },
         )
     }
 
@@ -198,7 +212,7 @@
         tileSpec: String,
         state: Int,
         disabledByPolicy: Boolean,
-        color: Int
+        color: Int,
     ) {
         // This method is added to further debug b/250618218 which has only been observed from the
         // InternetTile, so we are only logging the background color change for the InternetTile
@@ -215,7 +229,7 @@
                 bool1 = disabledByPolicy
                 int2 = color
             },
-            { "[$str1] state=$int1, disabledByPolicy=$bool1, color=$int2." }
+            { "[$str1] state=$int1, disabledByPolicy=$bool1, color=$int2." },
         )
     }
 
@@ -229,7 +243,7 @@
                 str3 = state.icon?.toString()
                 int1 = state.state
             },
-            { "[$str1] Tile updated. Label=$str2. State=$int1. Icon=$str3." }
+            { "[$str1] Tile updated. Label=$str2. State=$int1. Icon=$str3." },
         )
     }
 
@@ -241,7 +255,7 @@
                 str1 = containerName
                 bool1 = expanded
             },
-            { "$str1 expanded=$bool1" }
+            { "$str1 expanded=$bool1" },
         )
     }
 
@@ -253,7 +267,7 @@
                 str1 = containerName
                 int1 = orientation
             },
-            { "onViewAttached: $str1 orientation $int1" }
+            { "onViewAttached: $str1 orientation $int1" },
         )
     }
 
@@ -265,7 +279,7 @@
                 str1 = containerName
                 int1 = orientation
             },
-            { "onViewDetached: $str1 orientation $int1" }
+            { "onViewDetached: $str1 orientation $int1" },
         )
     }
 
@@ -276,7 +290,7 @@
         newShouldUseSplitShade: Boolean,
         oldScreenLayout: Int,
         newScreenLayout: Int,
-        containerName: String
+        containerName: String,
     ) {
         configChangedBuffer.log(
             TAG,
@@ -297,7 +311,7 @@
                     "screen layout=${toScreenLayoutString(long1.toInt())} " +
                     "(was ${toScreenLayoutString(long2.toInt())}), " +
                     "splitShade=$bool2 (was $bool1)"
-            }
+            },
         )
     }
 
@@ -305,7 +319,7 @@
         after: Boolean,
         before: Boolean,
         force: Boolean,
-        containerName: String
+        containerName: String,
     ) {
         buffer.log(
             TAG,
@@ -316,7 +330,7 @@
                 bool2 = before
                 bool3 = force
             },
-            { "change tile layout: $str1 horizontal=$bool1 (was $bool2), force? $bool3" }
+            { "change tile layout: $str1 horizontal=$bool1 (was $bool2), force? $bool3" },
         )
     }
 
@@ -328,7 +342,7 @@
                 int1 = tilesPerPageCount
                 int2 = totalTilesCount
             },
-            { "Distributing tiles: [tilesPerPageCount=$int1] [totalTilesCount=$int2]" }
+            { "Distributing tiles: [tilesPerPageCount=$int1] [totalTilesCount=$int2]" },
         )
     }
 
@@ -340,7 +354,7 @@
                 str1 = tileName
                 int1 = pageIndex
             },
-            { "Adding $str1 to page number $int1" }
+            { "Adding $str1 to page number $int1" },
         )
     }
 
@@ -361,7 +375,7 @@
                 str1 = viewName
                 str2 = toVisibilityString(visibility)
             },
-            { "$str1 visibility: $str2" }
+            { "$str1 visibility: $str2" },
         )
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/TileSquishinessRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/TileSquishinessRepository.kt
new file mode 100644
index 0000000..76ba9af
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/TileSquishinessRepository.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2024 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.systemui.qs.panels.data.repository
+
+import com.android.systemui.dagger.SysUISingleton
+import javax.inject.Inject
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+
+@SysUISingleton
+class TileSquishinessRepository @Inject constructor() {
+    private val _squishiness = MutableStateFlow(1f)
+    val squishiness = _squishiness.asStateFlow()
+
+    fun setSquishinessValue(value: Float) {
+        _squishiness.value = value
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/TileSquishinessInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/TileSquishinessInteractor.kt
new file mode 100644
index 0000000..4fdbc76
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/TileSquishinessInteractor.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2024 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.systemui.qs.panels.domain.interactor
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.qs.panels.data.repository.TileSquishinessRepository
+import javax.inject.Inject
+
+@SysUISingleton
+class TileSquishinessInteractor
+@Inject
+constructor(private val repository: TileSquishinessRepository) {
+    val squishiness = repository.squishiness
+
+    fun setSquishinessValue(value: Float) {
+        repository.setSquishinessValue(value)
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PagerDots.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PagerDots.kt
index 331aabb..0dedfe1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PagerDots.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PagerDots.kt
@@ -46,6 +46,8 @@
 import kotlin.math.absoluteValue
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.launch
+import platform.test.motion.compose.values.MotionTestValueKey
+import platform.test.motion.compose.values.motionTestValues
 
 @Composable
 fun PagerDots(
@@ -93,13 +95,22 @@
     }
 
     Row(
-        modifier = modifier.wrapContentWidth().pagerDotsSemantics(pagerState, coroutineScope),
+        modifier =
+            modifier
+                .motionTestValues { activeMarkerWidth exportAs PagerDotsMotionKeys.indicatorWidth }
+                .wrapContentWidth()
+                .pagerDotsSemantics(pagerState, coroutineScope),
         horizontalArrangement = spacedBy(spaceSize),
         verticalAlignment = Alignment.CenterVertically,
     ) {
         // This means that the active rounded rect has to be drawn between the current page
         // and the previous one (as we are animating back), or the current one if not transitioning
-        val withPrevious = pagerState.currentPageOffsetFraction <= 0 || pagerState.isOverscrolling()
+        val withPrevious by
+            remember(pagerState) {
+                derivedStateOf {
+                    pagerState.currentPageOffsetFraction <= 0 || pagerState.isOverscrolling()
+                }
+            }
         repeat(pagerState.pageCount) { page ->
             Canvas(Modifier.size(dotSize)) {
                 val rtl = layoutDirection == LayoutDirection.Rtl
@@ -127,6 +138,10 @@
     }
 }
 
+object PagerDotsMotionKeys {
+    val indicatorWidth = MotionTestValueKey<Dp>("indicatorWidth")
+}
+
 private fun Modifier.pagerDotsSemantics(
     pagerState: PagerState,
     coroutineScope: CoroutineScope,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt
index 083f529..e749475 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt
@@ -31,8 +31,10 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.remember
+import androidx.compose.runtime.snapshotFlow
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
@@ -76,6 +78,11 @@
 
         val pagerState = rememberPagerState(0) { pages.size }
 
+        // Used to track if this is currently in the first page or not, for animations
+        LaunchedEffect(key1 = pagerState) {
+            snapshotFlow { pagerState.currentPage == 0 }.collect { viewModel.inFirstPage = it }
+        }
+
         Column {
             HorizontalPager(
                 state = pagerState,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/QuickQuickSettings.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/QuickQuickSettings.kt
index 8998a7f..a645b51 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/QuickQuickSettings.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/QuickQuickSettings.kt
@@ -41,6 +41,7 @@
     val sizedTiles by
         viewModel.tileViewModels.collectAsStateWithLifecycle(initialValue = emptyList())
     val tiles = sizedTiles.fastMap { it.tile }
+    val squishiness by viewModel.squishinessViewModel.squishiness.collectAsStateWithLifecycle()
 
     DisposableEffect(tiles) {
         val token = Any()
@@ -62,6 +63,7 @@
                 tile = it.tile,
                 iconOnly = it.isIcon,
                 modifier = Modifier.element(it.tile.spec.toElementKey(spanIndex)),
+                squishiness = { squishiness },
             )
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt
index 8c2fb25..9ec5a82 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt
@@ -35,6 +35,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.key
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
@@ -73,6 +74,7 @@
     secondaryLabel: String?,
     icon: Icon,
     colors: TileColors,
+    squishiness: () -> Float,
     accessibilityUiState: AccessibilityUiState? = null,
     toggleClickSupported: Boolean = false,
     iconShape: Shape = RoundedCornerShape(CommonTileDefaults.InactiveCornerRadius),
@@ -89,6 +91,7 @@
             modifier =
                 Modifier.size(CommonTileDefaults.ToggleTargetSize).thenIf(toggleClickSupported) {
                     Modifier.clip(iconShape)
+                        .verticalSquish(squishiness)
                         .background(colors.iconBackground, { 1f })
                         .combinedClickable(
                             onClick = onClick,
@@ -174,15 +177,17 @@
     } else if (icon is Icon.Resource) {
         val image = AnimatedImageVector.animatedVectorResource(id = icon.res)
         val painter =
-            if (animateToEnd) {
-                rememberAnimatedVectorPainter(animatedImageVector = image, atEnd = true)
-            } else {
-                var atEnd by remember(icon.res) { mutableStateOf(false) }
-                LaunchedEffect(key1 = icon.res) {
-                    delay(350)
-                    atEnd = true
+            key(icon) {
+                if (animateToEnd) {
+                    rememberAnimatedVectorPainter(animatedImageVector = image, atEnd = true)
+                } else {
+                    var atEnd by remember(icon.res) { mutableStateOf(false) }
+                    LaunchedEffect(key1 = icon.res) {
+                        delay(350)
+                        atEnd = true
+                    }
+                    rememberAnimatedVectorPainter(animatedImageVector = image, atEnd = atEnd)
                 }
-                rememberAnimatedVectorPainter(animatedImageVector = image, atEnd = atEnd)
             }
         Image(
             painter = painter,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt
index 30bafae..45c1e48 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt
@@ -606,6 +606,7 @@
             SmallTileContent(
                 icon = cell.tile.icon,
                 color = colors.icon,
+                animateToEnd = true,
                 modifier = Modifier.align(Alignment.Center),
             )
         }
@@ -652,6 +653,7 @@
             SmallTileContent(
                 icon = tileViewModel.icon,
                 color = colors.icon,
+                animateToEnd = true,
                 modifier = Modifier.align(Alignment.Center),
             )
         }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt
index e6edba5..3ba49ad 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt
@@ -33,6 +33,7 @@
 import com.android.systemui.qs.panels.ui.viewmodel.EditTileViewModel
 import com.android.systemui.qs.panels.ui.viewmodel.FixedColumnsSizeViewModel
 import com.android.systemui.qs.panels.ui.viewmodel.IconTilesViewModel
+import com.android.systemui.qs.panels.ui.viewmodel.TileSquishinessViewModel
 import com.android.systemui.qs.panels.ui.viewmodel.TileViewModel
 import com.android.systemui.qs.pipeline.shared.TileSpec
 import com.android.systemui.qs.shared.ui.ElementKeys.toElementKey
@@ -45,6 +46,7 @@
 constructor(
     private val iconTilesViewModel: IconTilesViewModel,
     private val gridSizeViewModel: FixedColumnsSizeViewModel,
+    private val squishinessViewModel: TileSquishinessViewModel,
 ) : PaginatableGridLayout {
 
     @Composable
@@ -60,6 +62,7 @@
         }
         val columns by gridSizeViewModel.columns.collectAsStateWithLifecycle()
         val sizedTiles = tiles.map { SizedTileImpl(it, it.spec.width()) }
+        val squishiness by squishinessViewModel.squishiness.collectAsStateWithLifecycle()
 
         VerticalSpannedGrid(
             columns = columns,
@@ -72,6 +75,7 @@
                 tile = it.tile,
                 iconOnly = iconTilesViewModel.isIconTile(it.tile.spec),
                 modifier = Modifier.element(it.tile.spec.toElementKey(spanIndex)),
+                squishiness = { squishiness },
             )
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/SquishTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/SquishTile.kt
new file mode 100644
index 0000000..91f7641
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/SquishTile.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 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.systemui.qs.panels.ui.compose.infinitegrid
+
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.approachLayout
+import kotlin.math.roundToInt
+
+/**
+ * Modifier to squish the vertical bounds of a composable (usually a QS tile).
+ *
+ * It will squish the vertical bounds of the inner composable node by the value returned by
+ * [squishiness] on the measure/layout pass.
+ *
+ * The squished composable will be center aligned.
+ *
+ * Use an [approachLayout] to indicate that this should be measured in the lookahead step without
+ * using squishiness. If a parent of this node needs to determine unsquished height, they should
+ * also use an approachLayout tracking the squishiness.
+ */
+fun Modifier.verticalSquish(squishiness: () -> Float): Modifier {
+    return approachLayout(isMeasurementApproachInProgress = { squishiness() < 1 }) { measurable, _
+        ->
+        val squishinessValue = squishiness()
+        val expectedHeight = lookaheadSize.height
+
+        val placeable = measurable.measure(lookaheadConstraints)
+        val squishedHeight = (expectedHeight * squishinessValue).roundToInt()
+        // Center the content by moving it UP (squishedHeight < actualHeight)
+        val scroll = (squishedHeight - expectedHeight) / 2
+
+        layout(placeable.width, squishedHeight) { placeable.place(0, scroll) }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt
index afcbed6d..4bd5b2d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt
@@ -98,7 +98,12 @@
 }
 
 @Composable
-fun Tile(tile: TileViewModel, iconOnly: Boolean, modifier: Modifier) {
+fun Tile(
+    tile: TileViewModel,
+    iconOnly: Boolean,
+    squishiness: () -> Float,
+    modifier: Modifier = Modifier,
+) {
     val state by tile.state.collectAsStateWithLifecycle(tile.currentState)
     val resources = resources()
     val uiState = remember(state, resources) { state.toUiState(resources) }
@@ -119,6 +124,7 @@
         onClick = tile::onClick,
         onLongClick = tile::onLongClick,
         uiState = uiState,
+        squishiness = squishiness,
         modifier = modifier,
     ) { expandable ->
         val icon = getTileIcon(icon = uiState.icon)
@@ -144,6 +150,7 @@
                 },
                 onLongClick = { tile.onLongClick(expandable) },
                 accessibilityUiState = uiState.accessibilityUiState,
+                squishiness = squishiness,
             )
         }
     }
@@ -155,12 +162,17 @@
     shape: Shape,
     iconOnly: Boolean,
     uiState: TileUiState,
+    squishiness: () -> Float,
     modifier: Modifier = Modifier,
     onClick: (Expandable) -> Unit = {},
     onLongClick: (Expandable) -> Unit = {},
     content: @Composable BoxScope.(Expandable) -> Unit,
 ) {
-    Expandable(color = color, shape = shape, modifier = modifier.clip(shape)) {
+    Expandable(
+        color = color,
+        shape = shape,
+        modifier = modifier.clip(shape).verticalSquish(squishiness),
+    ) {
         val longPressLabel = longPressLabel()
         Box(
             modifier =
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModel.kt
index 28bf474..d4f8298 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModel.kt
@@ -43,4 +43,10 @@
             SharingStarted.WhileSubscribed(),
             paginatedGridInteractor.defaultRows,
         )
+
+    /*
+     * Tracks whether the current HorizontalPager (using this viewmodel) is in the first page.
+     * This requires it to be a `@SysUISingleton` to be shared between viewmodels.
+     */
+    var inFirstPage = true
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModel.kt
index eee905f..88e3019 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModel.kt
@@ -42,6 +42,7 @@
     tilesInteractor: CurrentTilesInteractor,
     fixedColumnsSizeViewModel: FixedColumnsSizeViewModel,
     quickQuickSettingsRowInteractor: QuickQuickSettingsRowInteractor,
+    val squishinessViewModel: TileSquishinessViewModel,
     private val iconTilesViewModel: IconTilesViewModel,
     @Application private val applicationScope: CoroutineScope,
 ) {
@@ -52,7 +53,7 @@
         quickQuickSettingsRowInteractor.rows.stateIn(
             applicationScope,
             SharingStarted.WhileSubscribed(),
-            quickQuickSettingsRowInteractor.defaultRows
+            quickQuickSettingsRowInteractor.defaultRows,
         )
 
     val tileViewModels: StateFlow<List<SizedTile<TileViewModel>>> =
@@ -60,12 +61,7 @@
             .flatMapLatest { columns ->
                 tilesInteractor.currentTiles.combine(rows, ::Pair).mapLatest { (tiles, rows) ->
                     tiles
-                        .map {
-                            SizedTileImpl(
-                                TileViewModel(it.tile, it.spec),
-                                it.spec.width,
-                            )
-                        }
+                        .map { SizedTileImpl(TileViewModel(it.tile, it.spec), it.spec.width) }
                         .let { splitInRowsSequence(it, columns).take(rows).toList().flatten() }
                 }
             }
@@ -73,15 +69,10 @@
                 applicationScope,
                 SharingStarted.WhileSubscribed(),
                 tilesInteractor.currentTiles.value
-                    .map {
-                        SizedTileImpl(
-                            TileViewModel(it.tile, it.spec),
-                            it.spec.width,
-                        )
-                    }
+                    .map { SizedTileImpl(TileViewModel(it.tile, it.spec), it.spec.width) }
                     .let {
                         splitInRowsSequence(it, columns.value).take(rows.value).toList().flatten()
-                    }
+                    },
             )
 
     private val TileSpec.width: Int
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/TileSquishinessViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/TileSquishinessViewModel.kt
new file mode 100644
index 0000000..0c4d5de
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/TileSquishinessViewModel.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2024 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.systemui.qs.panels.ui.viewmodel
+
+import com.android.systemui.qs.panels.domain.interactor.TileSquishinessInteractor
+import javax.inject.Inject
+
+/** View model to track the squishiness of tiles. */
+class TileSquishinessViewModel
+@Inject
+constructor(tileSquishinessInteractor: TileSquishinessInteractor) {
+    val squishiness = tileSquishinessInteractor.squishiness
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/shared/ui/ElementKeys.kt b/packages/SystemUI/src/com/android/systemui/qs/shared/ui/ElementKeys.kt
index 625459d..2425f13 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/shared/ui/ElementKeys.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/shared/ui/ElementKeys.kt
@@ -25,7 +25,10 @@
     val GridAnchor = ElementKey("QuickSettingsGridAnchor")
     val FooterActions = ElementKey("FooterActions")
 
-    class TileElementKey(spec: TileSpec, val position: Int) : ElementKey(spec.spec, spec.spec)
+    fun TileSpec.toElementKey(positionInGrid: Int) =
+        ElementKey(this.spec, TileIdentity(this, positionInGrid))
 
-    fun TileSpec.toElementKey(positionInGrid: Int) = TileElementKey(this, positionInGrid)
+    val TileElementMatcher = ElementKey.withIdentity { it is TileIdentity }
 }
+
+private data class TileIdentity(val spec: TileSpec, val position: Int)
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java
index 5ea8c21..a4f3c7a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java
@@ -14,6 +14,7 @@
 
 package com.android.systemui.qs.tileimpl;
 
+import static com.android.systemui.Flags.qsNewTiles;
 import static com.android.systemui.Flags.removeUpdateListenerInQsIconViewImpl;
 
 import android.animation.Animator;
@@ -66,12 +67,22 @@
 
     private ValueAnimator mColorAnimator = new ValueAnimator();
 
+    private int mColorUnavailable;
+    private int mColorInactive;
+    private int mColorActive;
+
     public QSIconViewImpl(Context context) {
         super(context);
 
         final Resources res = context.getResources();
         mIconSizePx = res.getDimensionPixelSize(R.dimen.qs_icon_size);
 
+        if (qsNewTiles()) { // pre-load icon tint colors
+            mColorUnavailable = Utils.getColorAttrDefaultColor(context, R.attr.outline);
+            mColorInactive = Utils.getColorAttrDefaultColor(context, R.attr.onShadeInactiveVariant);
+            mColorActive = Utils.getColorAttrDefaultColor(context, R.attr.onShadeActive);
+        }
+
         mIcon = createIcon();
         addView(mIcon);
         mColorAnimator.setDuration(QS_ANIM_LENGTH);
@@ -195,7 +206,11 @@
     }
 
     protected int getColor(QSTile.State state) {
-        return getIconColorForState(getContext(), state);
+        if (qsNewTiles()) {
+            return getCachedIconColorForState(state);
+        } else {
+            return getIconColorForState(getContext(), state);
+        }
     }
 
     private void animateGrayScale(int fromColor, int toColor, ImageView iv,
@@ -267,6 +282,19 @@
         }
     }
 
+    private int getCachedIconColorForState(QSTile.State state) {
+        if (state.disabledByPolicy || state.state == Tile.STATE_UNAVAILABLE) {
+            return mColorUnavailable;
+        } else if (state.state == Tile.STATE_INACTIVE) {
+            return mColorInactive;
+        } else if (state.state == Tile.STATE_ACTIVE) {
+            return mColorActive;
+        } else {
+            Log.e("QSIconView", "Invalid state " + state);
+            return 0;
+        }
+    }
+
     private static class EndRunnableAnimatorListener extends AnimatorListenerAdapter {
         private Runnable mRunnable;
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
index 4f3ea83..18b1f07 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
@@ -643,7 +643,6 @@
     }
 
     // HANDLE STATE CHANGES RELATED METHODS
-
     protected open fun handleStateChanged(state: QSTile.State) {
         val allowAnimations = animationsEnabled()
         isClickable = state.state != Tile.STATE_UNAVAILABLE
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index a4fe4e3..ad76b4f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -169,50 +169,34 @@
 
     private void enableZenMode(@Nullable Expandable expandable) {
         int zenDuration = mSettingZenDuration.getValue();
-        boolean showOnboarding = Settings.Secure.getInt(mContext.getContentResolver(),
-                Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 0) != 0
-                && Settings.Secure.getInt(mContext.getContentResolver(),
-                Settings.Secure.ZEN_SETTINGS_UPDATED, 0) != 1;
-        if (showOnboarding) {
-            // don't show on-boarding again or notification ever
-            Settings.Secure.putInt(mContext.getContentResolver(),
-                    Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 0);
-            // turn on DND
-            mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG);
-            // show on-boarding screen
-            Intent intent = new Intent(Settings.ZEN_MODE_ONBOARDING);
-            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-            mActivityStarter.postStartActivityDismissingKeyguard(intent, 0);
-        } else {
-            switch (zenDuration) {
-                case Settings.Secure.ZEN_DURATION_PROMPT:
-                    mUiHandler.post(() -> {
-                        Dialog dialog = makeZenModeDialog();
-                        if (expandable != null) {
-                            DialogTransitionAnimator.Controller controller =
-                                    expandable.dialogTransitionController(new DialogCuj(
-                                            InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
-                                            INTERACTION_JANK_TAG));
-                            if (controller != null) {
-                                mDialogTransitionAnimator.show(dialog,
-                                        controller, /* animateBackgroundBoundsChange= */ false);
-                            } else {
-                                dialog.show();
-                            }
+        switch (zenDuration) {
+            case Settings.Secure.ZEN_DURATION_PROMPT:
+                mUiHandler.post(() -> {
+                    Dialog dialog = makeZenModeDialog();
+                    if (expandable != null) {
+                        DialogTransitionAnimator.Controller controller =
+                                expandable.dialogTransitionController(new DialogCuj(
+                                        InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
+                                        INTERACTION_JANK_TAG));
+                        if (controller != null) {
+                            mDialogTransitionAnimator.show(dialog,
+                                    controller, /* animateBackgroundBoundsChange= */ false);
                         } else {
                             dialog.show();
                         }
-                    });
-                    break;
-                case Settings.Secure.ZEN_DURATION_FOREVER:
-                    mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG);
-                    break;
-                default:
-                    Uri conditionId = ZenModeConfig.toTimeCondition(mContext, zenDuration,
-                            mHost.getUserId(), true).id;
-                    mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
-                            conditionId, TAG);
-            }
+                    } else {
+                        dialog.show();
+                    }
+                });
+                break;
+            case Settings.Secure.ZEN_DURATION_FOREVER:
+                mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG);
+                break;
+            default:
+                Uri conditionId = ZenModeConfig.toTimeCondition(mContext, zenDuration,
+                        mHost.getUserId(), true).id;
+                mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
+                        conditionId, TAG);
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt
index d89e73d..fb406d4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt
@@ -45,10 +45,11 @@
 import com.android.systemui.qs.tileimpl.QSTileImpl
 import com.android.systemui.recordissue.IssueRecordingService.Companion.getStartIntent
 import com.android.systemui.recordissue.IssueRecordingService.Companion.getStopIntent
+import com.android.systemui.recordissue.IssueRecordingServiceConnection
 import com.android.systemui.recordissue.IssueRecordingState
 import com.android.systemui.recordissue.RecordIssueDialogDelegate
 import com.android.systemui.recordissue.RecordIssueModule.Companion.TILE_SPEC
-import com.android.systemui.recordissue.TraceurMessageSender
+import com.android.systemui.recordissue.TraceurConnection
 import com.android.systemui.res.R
 import com.android.systemui.screenrecord.RecordingController
 import com.android.systemui.screenrecord.RecordingService
@@ -66,7 +67,7 @@
 constructor(
     host: QSHost,
     uiEventLogger: QsEventLogger,
-    @Background backgroundLooper: Looper,
+    @Background private val backgroundLooper: Looper,
     @Main mainHandler: Handler,
     falsingManager: FalsingManager,
     metricsLogger: MetricsLogger,
@@ -78,7 +79,8 @@
     private val dialogTransitionAnimator: DialogTransitionAnimator,
     private val panelInteractor: PanelInteractor,
     private val userContextProvider: UserContextProvider,
-    private val traceurMessageSender: TraceurMessageSender,
+    irsConnProvider: IssueRecordingServiceConnection.Provider,
+    traceurConnProvider: TraceurConnection.Provider,
     @Background private val bgExecutor: Executor,
     private val issueRecordingState: IssueRecordingState,
     private val delegateFactory: RecordIssueDialogDelegate.Factory,
@@ -93,11 +95,20 @@
         metricsLogger,
         statusBarStateController,
         activityStarter,
-        qsLogger
+        qsLogger,
     ) {
 
     private val onRecordingChangeListener = Runnable { refreshState() }
 
+    private val irsConnection: IssueRecordingServiceConnection = irsConnProvider.create()
+    private val traceurConnection =
+        traceurConnProvider.create().apply {
+            onBound.add {
+                getTags(issueRecordingState)
+                doUnBind()
+            }
+        }
+
     override fun handleSetListening(listening: Boolean) {
         super.handleSetListening(listening)
         if (listening) {
@@ -109,7 +120,7 @@
 
     override fun handleDestroy() {
         super.handleDestroy()
-        bgExecutor.execute { traceurMessageSender.unbindFromTraceur(mContext) }
+        bgExecutor.execute { irsConnection.doUnBind() }
     }
 
     override fun getTileLabel(): CharSequence = mContext.getString(R.string.qs_record_issue_label)
@@ -142,7 +153,7 @@
             DELAY_MS,
             INTERVAL_MS,
             pendingServiceIntent(getStartIntent(userContextProvider.userContext)),
-            pendingServiceIntent(getStopIntent(userContextProvider.userContext))
+            pendingServiceIntent(getStopIntent(userContextProvider.userContext)),
         )
 
     private fun stopIssueRecordingService() =
@@ -154,10 +165,19 @@
             userContextProvider.userContext,
             RecordingService.REQUEST_CODE,
             action,
-            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
+            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE,
         )
 
     private fun showPrompt(expandable: Expandable?) {
+        bgExecutor.execute {
+            // We only want to get the tags once per session, as this is not likely to change, if at
+            // all on a month to month basis. Using onBound's size is a way to verify if the tag
+            // retrieval has already happened or not.
+            if (traceurConnection.onBound.isNotEmpty()) {
+                traceurConnection.doBind()
+            }
+            irsConnection.doBind()
+        }
         val dialog: AlertDialog =
             delegateFactory
                 .create {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
index 5ea9e6a..301ab2b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
@@ -311,10 +311,7 @@
         mConfig = MobileMappings.Config.readConfig(mContext);
         mTelephonyManager = mTelephonyManager.createForSubscriptionId(mDefaultDataSubId);
         mSubIdTelephonyManagerMap.put(mDefaultDataSubId, mTelephonyManager);
-        InternetTelephonyCallback telephonyCallback =
-                new InternetTelephonyCallback(mDefaultDataSubId);
-        mSubIdTelephonyCallbackMap.put(mDefaultDataSubId, telephonyCallback);
-        mTelephonyManager.registerTelephonyCallback(mExecutor, telephonyCallback);
+        registerInternetTelephonyCallback(mTelephonyManager, mDefaultDataSubId);
         // Listen the connectivity changes
         mConnectivityManager.registerDefaultNetworkCallback(mConnectivityManagerNetworkCallback);
         mCanConfigWifi = canConfigWifi;
@@ -346,6 +343,23 @@
         mCallback = null;
     }
 
+    /**
+     * This is to generate and register the new callback to Telephony for uncached subscription id,
+     * then cache it. Telephony also cached this callback into
+     * {@link com.android.server.TelephonyRegistry}, so if subscription id and callback were cached
+     * already, it shall do nothing to avoid registering redundant callback to Telephony.
+     */
+    private void registerInternetTelephonyCallback(
+            TelephonyManager telephonyManager, int subId) {
+        if (mSubIdTelephonyCallbackMap.containsKey(subId)) {
+            // Avoid to generate and register unnecessary callback to Telephony.
+            return;
+        }
+        InternetTelephonyCallback telephonyCallback = new InternetTelephonyCallback(subId);
+        mSubIdTelephonyCallbackMap.put(subId, telephonyCallback);
+        telephonyManager.registerTelephonyCallback(mExecutor, telephonyCallback);
+    }
+
     boolean isAirplaneModeEnabled() {
         return mGlobalSettings.getInt(Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
     }
@@ -673,9 +687,7 @@
             int subId = subInfo.getSubscriptionId();
             if (mSubIdTelephonyManagerMap.get(subId) == null) {
                 TelephonyManager secondaryTm = mTelephonyManager.createForSubscriptionId(subId);
-                InternetTelephonyCallback telephonyCallback = new InternetTelephonyCallback(subId);
-                secondaryTm.registerTelephonyCallback(mExecutor, telephonyCallback);
-                mSubIdTelephonyCallbackMap.put(subId, telephonyCallback);
+                registerInternetTelephonyCallback(secondaryTm, subId);
                 mSubIdTelephonyManagerMap.put(subId, secondaryTm);
             }
             return subId;
@@ -1351,6 +1363,7 @@
         if (DEBUG) {
             Log.d(TAG, "DDS: defaultDataSubId:" + defaultDataSubId);
         }
+
         if (SubscriptionManager.isUsableSubscriptionId(defaultDataSubId)) {
             // clean up old defaultDataSubId
             TelephonyCallback oldCallback = mSubIdTelephonyCallbackMap.get(mDefaultDataSubId);
@@ -1366,9 +1379,7 @@
             // create for new defaultDataSubId
             mTelephonyManager = mTelephonyManager.createForSubscriptionId(defaultDataSubId);
             mSubIdTelephonyManagerMap.put(defaultDataSubId, mTelephonyManager);
-            InternetTelephonyCallback newCallback = new InternetTelephonyCallback(defaultDataSubId);
-            mSubIdTelephonyCallbackMap.put(defaultDataSubId, newCallback);
-            mTelephonyManager.registerTelephonyCallback(mHandler::post, newCallback);
+            registerInternetTelephonyCallback(mTelephonyManager, defaultDataSubId);
             mCallback.onSubscriptionsChanged(defaultDataSubId);
         }
         mDefaultDataSubId = defaultDataSubId;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapper.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapper.kt
index 8965ef2..bb0b9b7 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapper.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapper.kt
@@ -18,7 +18,9 @@
 
 import android.content.Context
 import android.content.res.Resources
+import android.os.Handler
 import android.widget.Switch
+import com.android.settingslib.graph.SignalDrawable
 import com.android.systemui.common.shared.model.ContentDescription.Companion.loadContentDescription
 import com.android.systemui.common.shared.model.Icon
 import com.android.systemui.common.shared.model.Text.Companion.loadText
@@ -28,6 +30,7 @@
 import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
 import com.android.systemui.qs.tiles.viewmodel.QSTileState
 import com.android.systemui.res.R
+import com.android.systemui.statusbar.pipeline.shared.ui.model.InternetTileIconModel
 import javax.inject.Inject
 
 /** Maps [InternetTileModel] to [QSTileState]. */
@@ -37,6 +40,7 @@
     @Main private val resources: Resources,
     private val theme: Resources.Theme,
     private val context: Context,
+    @Main private val handler: Handler,
 ) : QSTileDataToStateMapper<InternetTileModel> {
 
     override fun map(config: QSTileConfig, data: InternetTileModel): QSTileState =
@@ -44,25 +48,42 @@
             label = resources.getString(R.string.quick_settings_internet_label)
             expandedAccessibilityClass = Switch::class
 
-            if (data.secondaryLabel != null) {
-                secondaryLabel = data.secondaryLabel.loadText(context)
-            } else {
-                secondaryLabel = data.secondaryTitle
-            }
+            secondaryLabel =
+                if (data.secondaryLabel != null) {
+                    data.secondaryLabel.loadText(context)
+                } else {
+                    data.secondaryTitle
+                }
 
             stateDescription = data.stateDescription.loadContentDescription(context)
             contentDescription = data.contentDescription.loadContentDescription(context)
 
-            iconRes = data.iconId
-            if (data.icon != null) {
-                this.icon = { data.icon }
-            } else if (data.iconId != null) {
-                val loadedIcon =
-                    Icon.Loaded(
-                        resources.getDrawable(data.iconId!!, theme),
-                        contentDescription = null
-                    )
-                this.icon = { loadedIcon }
+            when (val dataIcon = data.icon) {
+                is InternetTileIconModel.ResourceId -> {
+                    iconRes = dataIcon.resId
+                    icon = {
+                        Icon.Loaded(
+                            resources.getDrawable(dataIcon.resId, theme),
+                            contentDescription = null,
+                        )
+                    }
+                }
+
+                is InternetTileIconModel.Cellular -> {
+                    val signalDrawable = SignalDrawable(context, handler)
+                    signalDrawable.setLevel(dataIcon.level)
+                    icon = { Icon.Loaded(signalDrawable, contentDescription = null) }
+                }
+
+                is InternetTileIconModel.Satellite -> {
+                    iconRes = dataIcon.resourceIcon.res // level is inferred from res
+                    icon = {
+                        Icon.Loaded(
+                            resources.getDrawable(dataIcon.resourceIcon.res, theme),
+                            contentDescription = null,
+                        )
+                    }
+                }
             }
 
             sideViewIcon = QSTileState.SideViewIcon.Chevron
@@ -75,7 +96,7 @@
                 setOf(
                     QSTileState.UserAction.CLICK,
                     QSTileState.UserAction.TOGGLE_CLICK,
-                    QSTileState.UserAction.LONG_CLICK
+                    QSTileState.UserAction.LONG_CLICK,
                 )
         }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileDataInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileDataInteractor.kt
index 204ead3..6fe3979 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileDataInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileDataInteractor.kt
@@ -20,13 +20,10 @@
 import android.content.Context
 import android.os.UserHandle
 import android.text.Html
-import com.android.settingslib.graph.SignalDrawable
 import com.android.systemui.common.shared.model.ContentDescription
 import com.android.systemui.common.shared.model.ContentDescription.Companion.loadContentDescription
-import com.android.systemui.common.shared.model.Icon
 import com.android.systemui.common.shared.model.Text
 import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger
 import com.android.systemui.qs.tiles.base.interactor.QSTileDataInteractor
 import com.android.systemui.qs.tiles.impl.internet.domain.model.InternetTileModel
@@ -36,12 +33,12 @@
 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
 import com.android.systemui.statusbar.pipeline.mobile.domain.model.SignalIconModel
 import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository
+import com.android.systemui.statusbar.pipeline.shared.ui.model.InternetTileIconModel
 import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor
 import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
 import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon
 import com.android.systemui.utils.coroutines.flow.mapLatestConflated
 import javax.inject.Inject
-import kotlin.coroutines.CoroutineContext
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
@@ -51,7 +48,6 @@
 import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.stateIn
-import kotlinx.coroutines.withContext
 
 @OptIn(ExperimentalCoroutinesApi::class)
 /** Observes internet state changes providing the [InternetTileModel]. */
@@ -59,7 +55,6 @@
 @Inject
 constructor(
     private val context: Context,
-    @Main private val mainCoroutineContext: CoroutineContext,
     @Application private val scope: CoroutineScope,
     airplaneModeRepository: AirplaneModeRepository,
     private val connectivityRepository: ConnectivityRepository,
@@ -79,8 +74,7 @@
                 flowOf(
                     InternetTileModel.Active(
                         secondaryTitle = secondary,
-                        iconId = wifiIcon.icon.res,
-                        icon = Icon.Loaded(context.getDrawable(wifiIcon.icon.res)!!, null),
+                        icon = InternetTileIconModel.ResourceId(wifiIcon.icon.res),
                         stateDescription = wifiIcon.contentDescription,
                         contentDescription = ContentDescription.Loaded("$internetLabel,$secondary"),
                     )
@@ -116,11 +110,10 @@
             if (it == null) {
                 notConnectedFlow
             } else {
-                combine(
-                        it.networkName,
-                        it.signalLevelIcon,
-                        mobileDataContentName,
-                    ) { networkNameModel, signalIcon, dataContentDescription ->
+                combine(it.networkName, it.signalLevelIcon, mobileDataContentName) {
+                        networkNameModel,
+                        signalIcon,
+                        dataContentDescription ->
                         Triple(networkNameModel, signalIcon, dataContentDescription)
                     }
                     .mapLatestConflated { (networkNameModel, signalIcon, dataContentDescription) ->
@@ -129,17 +122,12 @@
                                 val secondary =
                                     mobileDataContentConcat(
                                         networkNameModel.name,
-                                        dataContentDescription
+                                        dataContentDescription,
                                     )
 
-                                val drawable =
-                                    withContext(mainCoroutineContext) { SignalDrawable(context) }
-                                drawable.setLevel(signalIcon.level)
-                                val loadedIcon = Icon.Loaded(drawable, null)
-
                                 InternetTileModel.Active(
                                     secondaryTitle = secondary,
-                                    icon = loadedIcon,
+                                    icon = InternetTileIconModel.Cellular(signalIcon.level),
                                     stateDescription =
                                         ContentDescription.Loaded(secondary.toString()),
                                     contentDescription = ContentDescription.Loaded(internetLabel),
@@ -150,9 +138,10 @@
                                     signalIcon.icon.contentDescription.loadContentDescription(
                                         context
                                     )
+
                                 InternetTileModel.Active(
                                     secondaryTitle = secondary,
-                                    iconId = signalIcon.icon.res,
+                                    icon = InternetTileIconModel.Satellite(signalIcon.icon),
                                     stateDescription = ContentDescription.Loaded(secondary),
                                     contentDescription = ContentDescription.Loaded(internetLabel),
                                 )
@@ -164,7 +153,7 @@
 
     private fun mobileDataContentConcat(
         networkName: String?,
-        dataContentDescription: CharSequence?
+        dataContentDescription: CharSequence?,
     ): CharSequence {
         if (dataContentDescription == null) {
             return networkName ?: ""
@@ -177,9 +166,9 @@
             context.getString(
                 R.string.mobile_carrier_text_format,
                 networkName,
-                dataContentDescription
+                dataContentDescription,
             ),
-            0
+            0,
         )
     }
 
@@ -199,7 +188,7 @@
                 flowOf(
                     InternetTileModel.Active(
                         secondaryLabel = secondary?.toText(),
-                        iconId = it.res,
+                        icon = InternetTileIconModel.ResourceId(it.res),
                         stateDescription = null,
                         contentDescription = secondary,
                     )
@@ -208,16 +197,18 @@
         }
 
     private val notConnectedFlow: StateFlow<InternetTileModel> =
-        combine(
-                wifiInteractor.areNetworksAvailable,
-                airplaneModeRepository.isAirplaneMode,
-            ) { networksAvailable, isAirplaneMode ->
+        combine(wifiInteractor.areNetworksAvailable, airplaneModeRepository.isAirplaneMode) {
+                networksAvailable,
+                isAirplaneMode ->
                 when {
                     isAirplaneMode -> {
                         val secondary = context.getString(R.string.status_bar_airplane)
                         InternetTileModel.Inactive(
                             secondaryTitle = secondary,
-                            iconId = R.drawable.ic_qs_no_internet_unavailable,
+                            icon =
+                                InternetTileIconModel.ResourceId(
+                                    R.drawable.ic_qs_no_internet_unavailable
+                                ),
                             stateDescription = null,
                             contentDescription = ContentDescription.Loaded(secondary),
                         )
@@ -227,10 +218,13 @@
                             context.getString(R.string.quick_settings_networks_available)
                         InternetTileModel.Inactive(
                             secondaryTitle = secondary,
-                            iconId = R.drawable.ic_qs_no_internet_available,
+                            icon =
+                                InternetTileIconModel.ResourceId(
+                                    R.drawable.ic_qs_no_internet_available
+                                ),
                             stateDescription = null,
                             contentDescription =
-                                ContentDescription.Loaded("$internetLabel,$secondary")
+                                ContentDescription.Loaded("$internetLabel,$secondary"),
                         )
                     }
                     else -> {
@@ -248,7 +242,7 @@
      */
     override fun tileData(
         user: UserHandle,
-        triggers: Flow<DataUpdateTrigger>
+        triggers: Flow<DataUpdateTrigger>,
     ): Flow<InternetTileModel> =
         connectivityRepository.defaultConnections.flatMapLatest {
             when {
@@ -265,7 +259,7 @@
         val NOT_CONNECTED_NETWORKS_UNAVAILABLE =
             InternetTileModel.Inactive(
                 secondaryLabel = Text.Resource(R.string.quick_settings_networks_unavailable),
-                iconId = R.drawable.ic_qs_no_internet_unavailable,
+                icon = InternetTileIconModel.ResourceId(R.drawable.ic_qs_no_internet_unavailable),
                 stateDescription = null,
                 contentDescription =
                     ContentDescription.Resource(R.string.quick_settings_networks_unavailable),
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/model/InternetTileModel.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/model/InternetTileModel.kt
index ece90461..15b4e47 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/model/InternetTileModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/model/InternetTileModel.kt
@@ -17,23 +17,21 @@
 package com.android.systemui.qs.tiles.impl.internet.domain.model
 
 import com.android.systemui.common.shared.model.ContentDescription
-import com.android.systemui.common.shared.model.Icon
 import com.android.systemui.common.shared.model.Text
+import com.android.systemui.statusbar.pipeline.shared.ui.model.InternetTileIconModel
 
 /** Model describing the state that the QS Internet tile should be in. */
 sealed interface InternetTileModel {
     val secondaryTitle: CharSequence?
     val secondaryLabel: Text?
-    val iconId: Int?
-    val icon: Icon?
+    val icon: InternetTileIconModel
     val stateDescription: ContentDescription?
     val contentDescription: ContentDescription?
 
     data class Active(
         override val secondaryTitle: CharSequence? = null,
         override val secondaryLabel: Text? = null,
-        override val iconId: Int? = null,
-        override val icon: Icon? = null,
+        override val icon: InternetTileIconModel = InternetTileIconModel.Cellular(1),
         override val stateDescription: ContentDescription? = null,
         override val contentDescription: ContentDescription? = null,
     ) : InternetTileModel
@@ -41,8 +39,7 @@
     data class Inactive(
         override val secondaryTitle: CharSequence? = null,
         override val secondaryLabel: Text? = null,
-        override val iconId: Int? = null,
-        override val icon: Icon? = null,
+        override val icon: InternetTileIconModel = InternetTileIconModel.Cellular(1),
         override val stateDescription: ContentDescription? = null,
         override val contentDescription: ContentDescription? = null,
     ) : InternetTileModel
diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModel.kt
index 3b97d82..afb9a78 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModel.kt
@@ -16,11 +16,18 @@
 
 package com.android.systemui.qs.ui.viewmodel
 
+import com.android.systemui.lifecycle.ExclusiveActivatable
 import com.android.systemui.scene.domain.interactor.SceneInteractor
-import com.android.systemui.scene.shared.model.Overlays
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.launch
 
 /**
  * Models UI state used to render the content of the quick settings shade overlay.
@@ -31,15 +38,43 @@
 class QuickSettingsShadeOverlayContentViewModel
 @AssistedInject
 constructor(
+    val shadeInteractor: ShadeInteractor,
     val sceneInteractor: SceneInteractor,
     val shadeHeaderViewModelFactory: ShadeHeaderViewModel.Factory,
     val quickSettingsContainerViewModel: QuickSettingsContainerViewModel,
-) {
+) : ExclusiveActivatable() {
+
+    override suspend fun onActivated(): Nothing {
+        coroutineScope {
+            launch {
+                sceneInteractor.currentScene.collect { currentScene ->
+                    when (currentScene) {
+                        // TODO(b/369513770): The ShadeSession should be preserved in this scenario.
+                        Scenes.Bouncer ->
+                            shadeInteractor.collapseQuickSettingsShade(
+                                loggingReason = "bouncer shown while shade is open"
+                            )
+                    }
+                }
+            }
+
+            launch {
+                shadeInteractor.isShadeTouchable
+                    .distinctUntilChanged()
+                    .filter { !it }
+                    .collect {
+                        shadeInteractor.collapseQuickSettingsShade(
+                            loggingReason = "device became non-interactive"
+                        )
+                    }
+            }
+        }
+
+        awaitCancellation()
+    }
+
     fun onScrimClicked() {
-        sceneInteractor.hideOverlay(
-            overlay = Overlays.QuickSettingsShade,
-            loggingReason = "Shade scrim clicked",
-        )
+        shadeInteractor.collapseQuickSettingsShade(loggingReason = "shade scrim clicked")
     }
 
     @AssistedFactory
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index ac49e91..559c263 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -248,7 +248,8 @@
                         } else if (action == ACTION_UP) {
                             // Gesture was too short to be picked up by scene container touch
                             // handling; programmatically start the transition to the shade.
-                            mShadeInteractor.get().expandNotificationShade("short launcher swipe");
+                            mShadeInteractor.get()
+                                    .expandNotificationsShade("short launcher swipe", null);
                         }
                     }
                     event.recycle();
@@ -265,7 +266,8 @@
                         mSceneInteractor.get().onRemoteUserInputStarted(
                                 "trackpad swipe");
                     } else if (action == ACTION_UP) {
-                        mShadeInteractor.get().expandNotificationShade("short trackpad swipe");
+                        mShadeInteractor.get()
+                                .expandNotificationsShade("short trackpad swipe", null);
                     }
                     mStatusBarWinController.getWindowRootView().dispatchTouchEvent(event);
                 } else {
diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt
index a5f4a89..3f875bc 100644
--- a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt
+++ b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt
@@ -23,9 +23,12 @@
 import android.content.res.Resources
 import android.net.Uri
 import android.os.Handler
+import android.os.IBinder
+import android.os.Looper
 import android.util.Log
 import com.android.internal.logging.UiEventLogger
 import com.android.systemui.animation.DialogTransitionAnimator
+import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.dagger.qualifiers.LongRunning
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor
@@ -42,6 +45,7 @@
 @Inject
 constructor(
     controller: RecordingController,
+    @Background private val bgLooper: Looper,
     @LongRunning private val bgExecutor: Executor,
     @Main handler: Handler,
     uiEventLogger: UiEventLogger,
@@ -50,8 +54,8 @@
     keyguardDismissUtil: KeyguardDismissUtil,
     dialogTransitionAnimator: DialogTransitionAnimator,
     panelInteractor: PanelInteractor,
-    traceurMessageSender: TraceurMessageSender,
     private val issueRecordingState: IssueRecordingState,
+    traceurConnectionProvider: TraceurConnection.Provider,
     iActivityManager: IActivityManager,
 ) :
     RecordingService(
@@ -61,21 +65,40 @@
         uiEventLogger,
         notificationManager,
         userContextProvider,
-        keyguardDismissUtil
+        keyguardDismissUtil,
     ) {
 
-    private val commandHandler =
-        IssueRecordingServiceCommandHandler(
+    private val traceurConnection: TraceurConnection = traceurConnectionProvider.create()
+
+    private val session =
+        IssueRecordingServiceSession(
             bgExecutor,
             dialogTransitionAnimator,
             panelInteractor,
-            traceurMessageSender,
+            traceurConnection,
             issueRecordingState,
             iActivityManager,
             notificationManager,
             userContextProvider,
         )
 
+    /**
+     * It is necessary to bind to IssueRecordingService from the Record Issue Tile because there are
+     * instances where this service is not created in the same user profile as the record issue tile
+     * aka, headless system user mode. In those instances, the TraceurConnection will be considered
+     * a leak in between notification actions unless the tile is bound to this service to keep it
+     * alive.
+     */
+    override fun onBind(intent: Intent): IBinder? {
+        traceurConnection.doBind()
+        return super.onBind(intent)
+    }
+
+    override fun onUnbind(intent: Intent?): Boolean {
+        traceurConnection.doUnBind()
+        return super.onUnbind(intent)
+    }
+
     override fun getTag(): String = TAG
 
     override fun getChannelId(): String = CHANNEL_ID
@@ -86,7 +109,7 @@
         Log.d(getTag(), "handling action: ${intent?.action}")
         when (intent?.action) {
             ACTION_START -> {
-                commandHandler.handleStartCommand()
+                session.start()
                 if (!issueRecordingState.recordScreen) {
                     // If we don't want to record the screen, the ACTION_SHOW_START_NOTIF action
                     // will circumvent the RecordingService's screen recording start code.
@@ -94,12 +117,11 @@
                 }
             }
             ACTION_STOP,
-            ACTION_STOP_NOTIF -> commandHandler.handleStopCommand(contentResolver)
+            ACTION_STOP_NOTIF -> session.stop(contentResolver)
             ACTION_SHARE -> {
-                commandHandler.handleShareCommand(
+                session.share(
                     intent.getIntExtra(EXTRA_NOTIFICATION_ID, mNotificationId),
                     intent.getParcelableExtra(EXTRA_PATH, Uri::class.java),
-                    this
                 )
                 // Unlike all other actions, action_share has different behavior for the screen
                 // recording qs tile than it does for the record issue qs tile. Return sticky to
diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceCommandHandler.kt b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceCommandHandler.kt
deleted file mode 100644
index 32de0f3..0000000
--- a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceCommandHandler.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.recordissue
-
-import android.app.IActivityManager
-import android.app.NotificationManager
-import android.content.ContentResolver
-import android.content.Context
-import android.net.Uri
-import android.os.UserHandle
-import android.provider.Settings
-import com.android.systemui.animation.DialogTransitionAnimator
-import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor
-import com.android.systemui.settings.UserContextProvider
-import java.util.concurrent.Executor
-
-private const val NOTIFY_SESSION_ENDED_SETTING = "should_notify_trace_session_ended"
-private const val DISABLED = 0
-
-/**
- * This class exists to unit test the business logic encapsulated in IssueRecordingService. Android
- * specifically calls out that there is no supported way to test IntentServices here:
- * https://developer.android.com/training/testing/other-components/services
- */
-class IssueRecordingServiceCommandHandler(
-    private val bgExecutor: Executor,
-    private val dialogTransitionAnimator: DialogTransitionAnimator,
-    private val panelInteractor: PanelInteractor,
-    private val traceurMessageSender: TraceurMessageSender,
-    private val issueRecordingState: IssueRecordingState,
-    private val iActivityManager: IActivityManager,
-    private val notificationManager: NotificationManager,
-    private val userContextProvider: UserContextProvider,
-) {
-
-    fun handleStartCommand() {
-        bgExecutor.execute { traceurMessageSender.startTracing(issueRecordingState.traceConfig) }
-        issueRecordingState.isRecording = true
-    }
-
-    fun handleStopCommand(contentResolver: ContentResolver) {
-        bgExecutor.execute {
-            if (issueRecordingState.traceConfig.longTrace) {
-                Settings.Global.putInt(contentResolver, NOTIFY_SESSION_ENDED_SETTING, DISABLED)
-            }
-            traceurMessageSender.stopTracing()
-        }
-        issueRecordingState.isRecording = false
-    }
-
-    fun handleShareCommand(notificationId: Int, screenRecording: Uri?, context: Context) {
-        bgExecutor.execute {
-            notificationManager.cancelAsUser(
-                null,
-                notificationId,
-                UserHandle(userContextProvider.userContext.userId)
-            )
-
-            if (issueRecordingState.takeBugreport) {
-                iActivityManager.requestBugReportWithExtraAttachment(screenRecording)
-            } else {
-                traceurMessageSender.shareTraces(context, screenRecording)
-            }
-        }
-
-        dialogTransitionAnimator.disableAllCurrentDialogsExitAnimations()
-        panelInteractor.collapsePanels()
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceConnection.kt b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceConnection.kt
new file mode 100644
index 0000000..85a5805
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceConnection.kt
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 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.systemui.recordissue
+
+import android.content.Intent
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.settings.UserContextProvider
+import com.android.traceur.MessageConstants.SYSTEM_UI_PACKAGE_NAME
+import javax.inject.Inject
+
+/**
+ * It is necessary to bind to IssueRecordingService from the Record Issue Tile because there are
+ * instances where this service is not created in the same user profile as the record issue tile
+ * aka, headless system user mode. In those instances, the TraceurConnection will be considered a
+ * leak in between notification actions unless the tile is bound to this service to keep it alive.
+ */
+class IssueRecordingServiceConnection(userContextProvider: UserContextProvider) :
+    UserAwareConnection(
+        userContextProvider,
+        Intent().setClassName(SYSTEM_UI_PACKAGE_NAME, IssueRecordingService::class.java.name),
+    ) {
+    @SysUISingleton
+    class Provider @Inject constructor(private val userContextProvider: UserContextProvider) {
+        fun create() = IssueRecordingServiceConnection(userContextProvider)
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt
new file mode 100644
index 0000000..ad9b4fe
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2024 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.systemui.recordissue
+
+import android.app.IActivityManager
+import android.app.NotificationManager
+import android.content.ContentResolver
+import android.net.Uri
+import android.os.UserHandle
+import android.provider.Settings
+import com.android.systemui.animation.DialogTransitionAnimator
+import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor
+import com.android.systemui.settings.UserContextProvider
+import java.util.concurrent.Executor
+
+private const val NOTIFY_SESSION_ENDED_SETTING = "should_notify_trace_session_ended"
+private const val DISABLED = 0
+
+/**
+ * This class exists to unit test the business logic encapsulated in IssueRecordingService. Android
+ * specifically calls out that there is no supported way to test IntentServices here:
+ * https://developer.android.com/training/testing/other-components/services, and mentions that the
+ * best way to add unit tests, is to introduce a separate class containing the business logic of
+ * that service, and test the functionality via that class.
+ */
+class IssueRecordingServiceSession(
+    private val bgExecutor: Executor,
+    private val dialogTransitionAnimator: DialogTransitionAnimator,
+    private val panelInteractor: PanelInteractor,
+    private val traceurConnection: TraceurConnection,
+    private val issueRecordingState: IssueRecordingState,
+    private val iActivityManager: IActivityManager,
+    private val notificationManager: NotificationManager,
+    private val userContextProvider: UserContextProvider,
+) {
+
+    fun start() {
+        bgExecutor.execute { traceurConnection.startTracing(issueRecordingState.traceConfig) }
+        issueRecordingState.isRecording = true
+    }
+
+    fun stop(contentResolver: ContentResolver) {
+        bgExecutor.execute {
+            if (issueRecordingState.traceConfig.longTrace) {
+                Settings.Global.putInt(contentResolver, NOTIFY_SESSION_ENDED_SETTING, DISABLED)
+            }
+            traceurConnection.stopTracing()
+        }
+        issueRecordingState.isRecording = false
+    }
+
+    fun share(notificationId: Int, screenRecording: Uri?) {
+        bgExecutor.execute {
+            notificationManager.cancelAsUser(
+                null,
+                notificationId,
+                UserHandle(userContextProvider.userContext.userId),
+            )
+
+            if (issueRecordingState.takeBugreport) {
+                iActivityManager.requestBugReportWithExtraAttachment(screenRecording)
+            } else {
+                traceurConnection.shareTraces(screenRecording)
+            }
+        }
+
+        dialogTransitionAnimator.disableAllCurrentDialogsExitAnimations()
+        panelInteractor.collapsePanels()
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt
index ed67e64..6758c3b 100644
--- a/packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt
@@ -64,7 +64,6 @@
     private val mediaProjectionMetricsLogger: MediaProjectionMetricsLogger,
     private val screenCaptureDisabledDialogDelegate: ScreenCaptureDisabledDialogDelegate,
     private val state: IssueRecordingState,
-    private val traceurMessageSender: TraceurMessageSender,
     @Assisted private val onStarted: Runnable,
 ) : SystemUIDialog.Delegate {
 
@@ -87,10 +86,6 @@
             setNegativeButton(R.string.cancel) { _, _ -> }
             setPositiveButton(R.string.qs_record_issue_start) { _, _ -> onStarted.run() }
         }
-        bgExecutor.execute {
-            traceurMessageSender.onBoundToTraceur.add { traceurMessageSender.getTags(state) }
-            traceurMessageSender.bindToTraceur(dialog.context)
-        }
     }
 
     override fun createDialog(): SystemUIDialog = factory.create(this)
@@ -151,7 +146,7 @@
 
         mediaProjectionMetricsLogger.notifyProjectionInitiated(
             userTracker.userId,
-            SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER
+            SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER,
         )
 
         if (!state.hasUserApprovedScreenRecording) {
@@ -189,7 +184,7 @@
                         CustomTraceSettingsDialogDelegate(
                                 factory,
                                 state.customTraceState,
-                                state.tagTitles
+                                state.tagTitles,
                             ) {
                                 onMenuItemClickListener.onMenuItemClick(it)
                             }
diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/TraceurConnection.kt b/packages/SystemUI/src/com/android/systemui/recordissue/TraceurConnection.kt
new file mode 100644
index 0000000..81529b3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recordissue/TraceurConnection.kt
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2024 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.systemui.recordissue
+
+import android.content.ComponentName
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.os.Handler
+import android.os.IBinder
+import android.os.Looper
+import android.os.Message
+import android.os.Messenger
+import android.util.Log
+import androidx.annotation.WorkerThread
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.recordissue.IssueRecordingState.Companion.TAG_TITLE_DELIMITER
+import com.android.systemui.settings.UserContextProvider
+import com.android.traceur.FileSender
+import com.android.traceur.MessageConstants
+import com.android.traceur.MessageConstants.TRACING_APP_ACTIVITY
+import com.android.traceur.MessageConstants.TRACING_APP_PACKAGE_NAME
+import com.android.traceur.TraceConfig
+import java.util.concurrent.CopyOnWriteArrayList
+import javax.inject.Inject
+
+private const val TAG = "TraceurConnection"
+
+class TraceurConnection
+private constructor(userContextProvider: UserContextProvider, private val bgLooper: Looper) :
+    UserAwareConnection(
+        userContextProvider,
+        Intent().setClassName(TRACING_APP_PACKAGE_NAME, TRACING_APP_ACTIVITY),
+    ) {
+
+    @SysUISingleton
+    class Provider
+    @Inject
+    constructor(
+        private val userContextProvider: UserContextProvider,
+        @Background private val bgLooper: Looper,
+    ) {
+        fun create() = TraceurConnection(userContextProvider, bgLooper)
+    }
+
+    val onBound: MutableList<Runnable> = CopyOnWriteArrayList(mutableListOf())
+
+    override fun onServiceConnected(className: ComponentName, service: IBinder) {
+        super.onServiceConnected(className, service)
+        onBound.forEach(Runnable::run)
+        onBound.clear()
+    }
+
+    @WorkerThread
+    fun startTracing(traceType: TraceConfig) {
+        val data =
+            Bundle().apply { putParcelable(MessageConstants.INTENT_EXTRA_TRACE_TYPE, traceType) }
+        sendMessage(MessageConstants.START_WHAT, data)
+    }
+
+    @WorkerThread fun stopTracing() = sendMessage(MessageConstants.STOP_WHAT)
+
+    @WorkerThread
+    fun shareTraces(screenRecord: Uri?) {
+        val replyHandler = Messenger(ShareFilesHandler(screenRecord, userContextProvider, bgLooper))
+        sendMessage(MessageConstants.SHARE_WHAT, replyTo = replyHandler)
+    }
+
+    @WorkerThread
+    fun getTags(state: IssueRecordingState) =
+        sendMessage(MessageConstants.TAGS_WHAT, replyTo = Messenger(TagsHandler(bgLooper, state)))
+
+    @WorkerThread
+    private fun sendMessage(what: Int, data: Bundle = Bundle(), replyTo: Messenger? = null) =
+        try {
+            val msg =
+                Message.obtain().apply {
+                    this.what = what
+                    this.data = data
+                    this.replyTo = replyTo
+                }
+            binder?.send(msg) ?: onBound.add { binder!!.send(msg) }
+        } catch (e: Exception) {
+            Log.e(TAG, "failed to notify Traceur", e)
+        }
+}
+
+private class ShareFilesHandler(
+    private val screenRecord: Uri?,
+    private val userContextProvider: UserContextProvider,
+    looper: Looper,
+) : Handler(looper) {
+
+    override fun handleMessage(msg: Message) {
+        if (MessageConstants.SHARE_WHAT == msg.what) {
+            shareTraces(
+                msg.data.getParcelable(MessageConstants.EXTRA_PERFETTO, Uri::class.java),
+                msg.data.getParcelable(MessageConstants.EXTRA_WINSCOPE, Uri::class.java),
+            )
+        } else {
+            throw IllegalArgumentException("received unknown msg.what: " + msg.what)
+        }
+    }
+
+    private fun shareTraces(perfetto: Uri?, winscope: Uri?) {
+        val uris: ArrayList<Uri> =
+            ArrayList<Uri>().apply {
+                perfetto?.let { add(it) }
+                winscope?.let { add(it) }
+                screenRecord?.let { add(it) }
+            }
+        val fileSharingIntent =
+            FileSender.buildSendIntent(userContextProvider.userContext, uris)
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT)
+        userContextProvider.userContext.startActivity(fileSharingIntent)
+    }
+}
+
+private class TagsHandler(looper: Looper, private val state: IssueRecordingState) :
+    Handler(looper) {
+
+    override fun handleMessage(msg: Message) {
+        if (MessageConstants.TAGS_WHAT == msg.what) {
+            val keys = msg.data.getStringArrayList(MessageConstants.BUNDLE_KEY_TAGS)
+            val values = msg.data.getStringArrayList(MessageConstants.BUNDLE_KEY_TAG_DESCRIPTIONS)
+            if (keys == null || values == null) {
+                throw IllegalArgumentException(
+                    "Neither keys: $keys, nor values: $values can be null"
+                )
+            }
+            state.tagTitles =
+                keys.zip(values).map { it.first + TAG_TITLE_DELIMITER + it.second }.toSet()
+        } else {
+            throw IllegalArgumentException("received unknown msg.what: " + msg.what)
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/TraceurMessageSender.kt b/packages/SystemUI/src/com/android/systemui/recordissue/TraceurMessageSender.kt
deleted file mode 100644
index 8bfd14a..0000000
--- a/packages/SystemUI/src/com/android/systemui/recordissue/TraceurMessageSender.kt
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.recordissue
-
-import android.annotation.SuppressLint
-import android.content.ComponentName
-import android.content.Context
-import android.content.Intent
-import android.content.ServiceConnection
-import android.content.pm.PackageManager
-import android.net.Uri
-import android.os.Bundle
-import android.os.Handler
-import android.os.IBinder
-import android.os.Looper
-import android.os.Message
-import android.os.Messenger
-import android.util.Log
-import androidx.annotation.WorkerThread
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Background
-import com.android.systemui.recordissue.IssueRecordingState.Companion.TAG_TITLE_DELIMITER
-import com.android.traceur.FileSender
-import com.android.traceur.MessageConstants
-import com.android.traceur.TraceConfig
-import javax.inject.Inject
-
-private const val TAG = "TraceurMessageSender"
-
-@SysUISingleton
-class TraceurMessageSender @Inject constructor(@Background private val backgroundLooper: Looper) {
-    private var binder: Messenger? = null
-    private var isBound: Boolean = false
-
-    val onBoundToTraceur = mutableListOf<Runnable>()
-
-    private val traceurConnection =
-        object : ServiceConnection {
-            override fun onServiceConnected(className: ComponentName, service: IBinder) {
-                binder = Messenger(service)
-                isBound = true
-                onBoundToTraceur.forEach(Runnable::run)
-                onBoundToTraceur.clear()
-            }
-
-            override fun onServiceDisconnected(className: ComponentName) {
-                binder = null
-                isBound = false
-            }
-        }
-
-    @SuppressLint("WrongConstant")
-    @WorkerThread
-    fun bindToTraceur(context: Context) {
-        if (isBound) {
-            // Binding needs to happen after the phone has been unlocked. The RecordIssueTile is
-            // initialized before this happens though, so binding is placed at a later time, during
-            // normal operations that can be repeated. This check avoids calling "bindService" 2x+
-            return
-        }
-        try {
-            val info =
-                context.packageManager.getPackageInfo(
-                    MessageConstants.TRACING_APP_PACKAGE_NAME,
-                    PackageManager.MATCH_SYSTEM_ONLY
-                )
-            val intent =
-                Intent().setClassName(info.packageName, MessageConstants.TRACING_APP_ACTIVITY)
-            val flags =
-                Context.BIND_AUTO_CREATE or
-                    Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE or
-                    Context.BIND_WAIVE_PRIORITY
-            context.bindService(intent, traceurConnection, flags)
-        } catch (e: Exception) {
-            Log.e(TAG, "failed to bind to Traceur's service", e)
-        }
-    }
-
-    @WorkerThread
-    fun unbindFromTraceur(context: Context) {
-        if (isBound) {
-            context.unbindService(traceurConnection)
-        }
-    }
-
-    @WorkerThread
-    fun startTracing(traceType: TraceConfig) {
-        val data =
-            Bundle().apply { putParcelable(MessageConstants.INTENT_EXTRA_TRACE_TYPE, traceType) }
-        notifyTraceur(MessageConstants.START_WHAT, data)
-    }
-
-    @WorkerThread fun stopTracing() = notifyTraceur(MessageConstants.STOP_WHAT)
-
-    @WorkerThread
-    fun shareTraces(context: Context, screenRecord: Uri?) {
-        val replyHandler = Messenger(ShareFilesHandler(context, screenRecord, backgroundLooper))
-        notifyTraceur(MessageConstants.SHARE_WHAT, replyTo = replyHandler)
-    }
-
-    @WorkerThread
-    fun getTags(state: IssueRecordingState) {
-        val replyHandler = Messenger(TagsHandler(backgroundLooper, state))
-        notifyTraceur(MessageConstants.TAGS_WHAT, replyTo = replyHandler)
-    }
-
-    @WorkerThread
-    private fun notifyTraceur(what: Int, data: Bundle = Bundle(), replyTo: Messenger? = null) {
-        try {
-            binder!!.send(
-                Message.obtain().apply {
-                    this.what = what
-                    this.data = data
-                    this.replyTo = replyTo
-                }
-            )
-        } catch (e: Exception) {
-            Log.e(TAG, "failed to notify Traceur", e)
-        }
-    }
-
-    private class ShareFilesHandler(
-        private val context: Context,
-        private val screenRecord: Uri?,
-        looper: Looper,
-    ) : Handler(looper) {
-
-        override fun handleMessage(msg: Message) {
-            if (MessageConstants.SHARE_WHAT == msg.what) {
-                shareTraces(
-                    msg.data.getParcelable(MessageConstants.EXTRA_PERFETTO, Uri::class.java),
-                    msg.data.getParcelable(MessageConstants.EXTRA_WINSCOPE, Uri::class.java)
-                )
-            } else {
-                throw IllegalArgumentException("received unknown msg.what: " + msg.what)
-            }
-        }
-
-        private fun shareTraces(perfetto: Uri?, winscope: Uri?) {
-            val uris: List<Uri> =
-                mutableListOf<Uri>().apply {
-                    perfetto?.let { add(it) }
-                    winscope?.let { add(it) }
-                    screenRecord?.let { add(it) }
-                }
-            val fileSharingIntent =
-                FileSender.buildSendIntent(context, uris)
-                    .addFlags(
-                        Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
-                    )
-            context.startActivity(fileSharingIntent)
-        }
-    }
-
-    private class TagsHandler(looper: Looper, private val state: IssueRecordingState) :
-        Handler(looper) {
-
-        override fun handleMessage(msg: Message) {
-            if (MessageConstants.TAGS_WHAT == msg.what) {
-                val keys = msg.data.getStringArrayList(MessageConstants.BUNDLE_KEY_TAGS)
-                val values =
-                    msg.data.getStringArrayList(MessageConstants.BUNDLE_KEY_TAG_DESCRIPTIONS)
-                if (keys == null || values == null) {
-                    throw IllegalArgumentException(
-                        "Neither keys: $keys, nor values: $values can be null"
-                    )
-                }
-                state.tagTitles =
-                    keys.zip(values).map { it.first + TAG_TITLE_DELIMITER + it.second }.toSet()
-            } else {
-                throw IllegalArgumentException("received unknown msg.what: " + msg.what)
-            }
-        }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/UserAwareConnection.kt b/packages/SystemUI/src/com/android/systemui/recordissue/UserAwareConnection.kt
new file mode 100644
index 0000000..6aaa27d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recordissue/UserAwareConnection.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2024 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.systemui.recordissue
+
+import android.annotation.SuppressLint
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.ServiceConnection
+import android.os.IBinder
+import android.os.Messenger
+import android.util.Log
+import androidx.annotation.VisibleForTesting
+import androidx.annotation.WorkerThread
+import com.android.systemui.settings.UserContextProvider
+
+private const val TAG = "UserAwareConnection"
+private const val BIND_FLAGS =
+    Context.BIND_AUTO_CREATE or
+        Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE or
+        Context.BIND_WAIVE_PRIORITY
+
+/** ServiceConnection class that can be used to keep an IntentService alive. */
+open class UserAwareConnection(
+    protected val userContextProvider: UserContextProvider,
+    private val intent: Intent,
+) : ServiceConnection {
+    @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) var binder: Messenger? = null
+    private var shouldUnBind = false
+
+    override fun onServiceConnected(className: ComponentName, service: IBinder) {
+        binder = Messenger(service)
+    }
+
+    override fun onServiceDisconnected(className: ComponentName) {
+        binder = null
+    }
+
+    @SuppressLint("WrongConstant")
+    @WorkerThread
+    fun doBind() {
+        if (shouldUnBind) {
+            // Binding needs to happen after the phone has been unlocked. The RecordIssueTile is
+            // initialized before this happens though, so binding is placed at a later time, during
+            // normal operations that can be repeated. This check avoids calling "bindService" 2x+
+            return
+        }
+        try {
+            shouldUnBind = userContextProvider.userContext.bindService(intent, this, BIND_FLAGS)
+        } catch (e: Exception) {
+            Log.e(TAG, "failed to bind to the service", e)
+        }
+    }
+
+    @WorkerThread
+    fun doUnBind() {
+        if (shouldUnBind) {
+            userContextProvider.userContext.unbindService(this)
+            shouldUnBind = false
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt b/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt
index a89f752..4beec10 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt
@@ -44,6 +44,7 @@
         [
             BouncerSceneModule::class,
             CommunalSceneModule::class,
+            DreamSceneModule::class,
             EmptySceneModule::class,
             GoneSceneModule::class,
             LockscreenSceneModule::class,
@@ -98,6 +99,7 @@
                     listOfNotNull(
                         Scenes.Gone,
                         Scenes.Communal,
+                        Scenes.Dream,
                         Scenes.Lockscreen,
                         Scenes.Bouncer,
                         Scenes.QuickSettings.takeUnless { DualShade.isEnabled },
@@ -114,9 +116,10 @@
                             Scenes.Gone to 0,
                             Scenes.Lockscreen to 0,
                             Scenes.Communal to 1,
-                            Scenes.Shade to 2.takeUnless { DualShade.isEnabled },
-                            Scenes.QuickSettings to 3.takeUnless { DualShade.isEnabled },
-                            Scenes.Bouncer to 4,
+                            Scenes.Dream to 2,
+                            Scenes.Shade to 3.takeUnless { DualShade.isEnabled },
+                            Scenes.QuickSettings to 4.takeUnless { DualShade.isEnabled },
+                            Scenes.Bouncer to 5,
                         )
                         .filterValues { it != null }
                         .mapValues { checkNotNull(it.value) },
diff --git a/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneStack.kt b/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneStack.kt
index 323bb3d..6479e57 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneStack.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneStack.kt
@@ -21,10 +21,6 @@
 /** An immutable stack of [SceneKey]s backed by a singly-linked list. */
 sealed interface SceneStack
 
-private data object EmptyStack : SceneStack
-
-private data class StackedNodes(val head: SceneKey, val tail: SceneStack) : SceneStack
-
 /** Returns the scene at the head of the stack, or `null` if empty. O(1) */
 fun SceneStack.peek(): SceneKey? =
     when (this) {
@@ -69,3 +65,14 @@
     }
     return result
 }
+
+private data object EmptyStack : SceneStack {
+    override fun toString() = sceneStackToString()
+}
+
+private data class StackedNodes(val head: SceneKey, val tail: SceneStack) : SceneStack {
+    override fun toString() = sceneStackToString()
+}
+
+private fun SceneStack.sceneStackToString(): String =
+    asIterable().joinToString { it.testTag }.let { "SceneStack([$it])" }
diff --git a/packages/SystemUI/src/com/android/systemui/scene/data/repository/SystemGestureExclusionRepository.kt b/packages/SystemUI/src/com/android/systemui/scene/data/repository/SystemGestureExclusionRepository.kt
deleted file mode 100644
index a8d0777..0000000
--- a/packages/SystemUI/src/com/android/systemui/scene/data/repository/SystemGestureExclusionRepository.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.scene.data.repository
-
-import android.graphics.Region
-import android.view.ISystemGestureExclusionListener
-import android.view.IWindowManager
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
-import javax.inject.Inject
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.Flow
-
-@SysUISingleton
-class SystemGestureExclusionRepository
-@Inject
-constructor(private val windowManager: IWindowManager) {
-
-    /**
-     * Returns [Flow] of the [Region] in which system gestures should be excluded on the display
-     * identified with [displayId].
-     */
-    fun exclusionRegion(displayId: Int): Flow<Region?> {
-        return conflatedCallbackFlow {
-            val listener =
-                object : ISystemGestureExclusionListener.Stub() {
-                    override fun onSystemGestureExclusionChanged(
-                        displayId: Int,
-                        restrictedRegion: Region?,
-                        unrestrictedRegion: Region?,
-                    ) {
-                        trySend(restrictedRegion)
-                    }
-                }
-            windowManager.registerSystemGestureExclusionListener(listener, displayId)
-
-            awaitClose {
-                windowManager.unregisterSystemGestureExclusionListener(listener, displayId)
-            }
-        }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt
index afb72f0..bebd398 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneBackInteractor.kt
@@ -19,7 +19,6 @@
 import com.android.compose.animation.scene.SceneKey
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.scene.data.model.SceneStack
-import com.android.systemui.scene.data.model.asIterable
 import com.android.systemui.scene.data.model.peek
 import com.android.systemui.scene.data.model.pop
 import com.android.systemui.scene.data.model.push
@@ -68,13 +67,13 @@
                     checkNotNull(stack.pop()) { "Cannot pop ${from.debugName} when stack is empty" }
             }
         }
-        logger.logSceneBackStack(backStack.value.asIterable())
+        logger.logSceneBackStack(backStack.value)
     }
 
     /** Applies the given [transform] to the back stack. */
     fun updateBackStack(transform: (SceneStack) -> SceneStack) {
         _backStack.update { stack -> transform(stack) }
-        logger.logSceneBackStack(backStack.value.asIterable())
+        logger.logSceneBackStack(backStack.value)
     }
 
     private fun stackOperation(from: SceneKey, to: SceneKey, stack: SceneStack): StackOperation? {
diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SystemGestureExclusionInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SystemGestureExclusionInteractor.kt
deleted file mode 100644
index 4cee874..0000000
--- a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SystemGestureExclusionInteractor.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.scene.domain.interactor
-
-import android.graphics.Region
-import com.android.systemui.scene.data.repository.SystemGestureExclusionRepository
-import javax.inject.Inject
-import kotlinx.coroutines.flow.Flow
-
-class SystemGestureExclusionInteractor
-@Inject
-constructor(private val repository: SystemGestureExclusionRepository) {
-
-    /**
-     * Returns [Flow] of the [Region] in which system gestures should be excluded on the display
-     * identified with [displayId].
-     */
-    fun exclusionRegion(displayId: Int): Flow<Region?> {
-        return repository.exclusionRegion(displayId)
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/logger/SceneLogger.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/logger/SceneLogger.kt
index fb53ddb..16c2ef5 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/shared/logger/SceneLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/shared/logger/SceneLogger.kt
@@ -22,6 +22,7 @@
 import com.android.systemui.log.LogBuffer
 import com.android.systemui.log.core.LogLevel
 import com.android.systemui.log.dagger.SceneFrameworkLog
+import com.android.systemui.scene.data.model.SceneStack
 import javax.inject.Inject
 
 class SceneLogger @Inject constructor(@SceneFrameworkLog private val logBuffer: LogBuffer) {
@@ -40,16 +41,11 @@
             },
             messagePrinter = {
                 "Scene framework is ${asWord(bool1)}${if (str1 != null) " $str1" else ""}"
-            }
+            },
         )
     }
 
-    fun logSceneChanged(
-        from: SceneKey,
-        to: SceneKey,
-        reason: String,
-        isInstant: Boolean,
-    ) {
+    fun logSceneChanged(from: SceneKey, to: SceneKey, reason: String, isInstant: Boolean) {
         logBuffer.log(
             tag = TAG,
             level = LogLevel.INFO,
@@ -123,11 +119,7 @@
         )
     }
 
-    fun logVisibilityChange(
-        from: Boolean,
-        to: Boolean,
-        reason: String,
-    ) {
+    fun logVisibilityChange(from: Boolean, to: Boolean, reason: String) {
         fun asWord(isVisible: Boolean): String {
             return if (isVisible) "visible" else "invisible"
         }
@@ -144,9 +136,7 @@
         )
     }
 
-    fun logRemoteUserInputStarted(
-        reason: String,
-    ) {
+    fun logRemoteUserInputStarted(reason: String) {
         logBuffer.log(
             tag = TAG,
             level = LogLevel.INFO,
@@ -164,11 +154,11 @@
         )
     }
 
-    fun logSceneBackStack(backStack: Iterable<SceneKey>) {
+    fun logSceneBackStack(backStack: SceneStack) {
         logBuffer.log(
             tag = TAG,
             level = LogLevel.INFO,
-            messageInitializer = { str1 = backStack.joinToString(", ") { it.debugName } },
+            messageInitializer = { str1 = backStack.toString() },
             messagePrinter = { "back stack: $str1" },
         )
     }
diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/model/Scenes.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/model/Scenes.kt
index 82b4b1c..16492ef 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/shared/model/Scenes.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/shared/model/Scenes.kt
@@ -33,6 +33,9 @@
     /** The communal scene shows the glanceable hub when device is locked and docked. */
     @JvmField val Communal = SceneKey("communal")
 
+    /** The dream scene shows up when a dream activity is showing. */
+    @JvmField val Dream = SceneKey("dream")
+
     /**
      * "Gone" is not a real scene but rather the absence of scenes when we want to skip showing any
      * content from the scene framework.
diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/model/TransitionKeys.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/model/TransitionKeys.kt
index b9f57f2..3c6d858 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/shared/model/TransitionKeys.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/shared/model/TransitionKeys.kt
@@ -32,4 +32,7 @@
      * normal collapse would.
      */
     val SlightlyFasterShadeCollapse = TransitionKey("SlightlyFasterShadeCollapse")
+
+    /** Reference to a content transition that should happen instantly, i.e. without animation. */
+    val Instant = TransitionKey("Instant")
 }
diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt
index a7e7d8b..38f4e73 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt
@@ -107,9 +107,7 @@
             view.viewModel(
                 traceName = "SceneWindowRootViewBinder",
                 minWindowLifecycleState = WindowLifecycleState.ATTACHED,
-                factory = {
-                    viewModelFactory.create(view.context.displayId, motionEventHandlerReceiver)
-                },
+                factory = { viewModelFactory.create(view, motionEventHandlerReceiver) },
             ) { viewModel ->
                 try {
                     view.setViewTreeOnBackPressedDispatcherOwner(
diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/view/WindowRootView.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/view/WindowRootView.kt
index ea19020..f0f476e 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/ui/view/WindowRootView.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/ui/view/WindowRootView.kt
@@ -25,6 +25,7 @@
 import android.view.WindowInsets
 import android.widget.FrameLayout
 import androidx.core.view.updateMargins
+import com.android.systemui.Flags
 import com.android.systemui.compose.ComposeInitializer
 import com.android.systemui.res.R
 
@@ -103,6 +104,8 @@
 
     private fun applyMargins() {
         val count = childCount
+        val hasFlagsEnabled = Flags.checkLockscreenGoneTransition()
+        var hasChildMarginUpdated = false
         for (i in 0 until count) {
             val child = getChildAt(i)
             if (child.layoutParams is LayoutParams) {
@@ -113,10 +116,17 @@
                             layoutParams.leftMargin != leftInset)
                 ) {
                     layoutParams.updateMargins(left = leftInset, right = rightInset)
-                    child.requestLayout()
+                    hasChildMarginUpdated = true
+                    if (!hasFlagsEnabled) {
+                        child.requestLayout()
+                    }
                 }
             }
         }
+        if (hasFlagsEnabled && hasChildMarginUpdated) {
+            // Request layout at once after all children's margins has updated
+            requestLayout()
+        }
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt
index 5ff507a..fc172e8 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt
@@ -16,16 +16,13 @@
 
 package com.android.systemui.scene.ui.viewmodel
 
-import com.android.compose.animation.scene.Edge
-import com.android.compose.animation.scene.Swipe
-import com.android.compose.animation.scene.SwipeDirection
 import com.android.compose.animation.scene.UserAction
 import com.android.compose.animation.scene.UserActionResult
-import com.android.systemui.scene.shared.model.Overlays
-import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.shade.shared.model.ShadeMode
+import com.android.systemui.shade.ui.viewmodel.dualShadeActions
+import com.android.systemui.shade.ui.viewmodel.singleShadeActions
+import com.android.systemui.shade.ui.viewmodel.splitShadeActions
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
 
@@ -36,41 +33,21 @@
     override suspend fun hydrateActions(setActions: (Map<UserAction, UserActionResult>) -> Unit) {
         shadeInteractor.shadeMode.collect { shadeMode ->
             setActions(
-                when (shadeMode) {
-                    ShadeMode.Single -> singleShadeActions()
-                    ShadeMode.Split -> splitShadeActions()
-                    ShadeMode.Dual -> dualShadeActions()
-                }
+                buildList {
+                        addAll(
+                            when (shadeMode) {
+                                ShadeMode.Single ->
+                                    singleShadeActions(requireTwoPointersForTopEdgeForQs = true)
+                                ShadeMode.Split -> splitShadeActions()
+                                ShadeMode.Dual -> dualShadeActions()
+                            }
+                        )
+                    }
+                    .associate { it }
             )
         }
     }
 
-    private fun singleShadeActions(): Map<UserAction, UserActionResult> {
-        return mapOf(
-            Swipe.Down to Scenes.Shade,
-            swipeDownFromTopWithTwoFingers() to Scenes.QuickSettings,
-        )
-    }
-
-    private fun splitShadeActions(): Map<UserAction, UserActionResult> {
-        return mapOf(
-            Swipe.Down to UserActionResult(Scenes.Shade, ToSplitShade),
-            swipeDownFromTopWithTwoFingers() to UserActionResult(Scenes.Shade, ToSplitShade),
-        )
-    }
-
-    private fun dualShadeActions(): Map<UserAction, UserActionResult> {
-        return mapOf(
-            Swipe.Down to Overlays.NotificationsShade,
-            Swipe(direction = SwipeDirection.Down, fromSource = SceneContainerEdge.TopRight) to
-                Overlays.QuickSettingsShade,
-        )
-    }
-
-    private fun swipeDownFromTopWithTwoFingers(): UserAction {
-        return Swipe(direction = SwipeDirection.Down, pointerCount = 2, fromSource = Edge.Top)
-    }
-
     @AssistedFactory
     interface Factory {
         fun create(): GoneUserActionsViewModel
diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerGestureFilter.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerGestureFilter.kt
deleted file mode 100644
index a1d915a..0000000
--- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerGestureFilter.kt
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.scene.ui.viewmodel
-
-import androidx.compose.runtime.getValue
-import androidx.compose.ui.geometry.Offset
-import com.android.systemui.lifecycle.ExclusiveActivatable
-import com.android.systemui.lifecycle.Hydrator
-import com.android.systemui.scene.domain.interactor.SystemGestureExclusionInteractor
-import dagger.assisted.Assisted
-import dagger.assisted.AssistedFactory
-import dagger.assisted.AssistedInject
-import kotlin.math.roundToInt
-
-/** Decides whether drag gestures should be filtered out in the scene container framework. */
-class SceneContainerGestureFilter
-@AssistedInject
-constructor(interactor: SystemGestureExclusionInteractor, @Assisted displayId: Int) :
-    ExclusiveActivatable() {
-
-    private val hydrator = Hydrator("SceneContainerGestureFilter.hydrator")
-    private val exclusionRegion by
-        hydrator.hydratedStateOf(
-            traceName = "exclusionRegion",
-            initialValue = null,
-            source = interactor.exclusionRegion(displayId),
-        )
-
-    override suspend fun onActivated(): Nothing {
-        hydrator.activate()
-    }
-
-    /**
-     * Returns `true` if a drag gesture starting at [startPosition] should be filtered out (e.g.
-     * ignored, `false` otherwise.
-     *
-     * Invoke this and pass in the position of the `ACTION_DOWN` pointer event that began the
-     * gesture.
-     */
-    fun shouldFilterGesture(startPosition: Offset): Boolean {
-        check(isActive) { "Must be activated to use!" }
-
-        return exclusionRegion?.contains(startPosition.x.roundToInt(), startPosition.y.roundToInt())
-            ?: false
-    }
-
-    @AssistedFactory
-    interface Factory {
-        fun create(displayId: Int): SceneContainerGestureFilter
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerHapticsViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerHapticsViewModel.kt
new file mode 100644
index 0000000..4ef8e0f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerHapticsViewModel.kt
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2024 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.systemui.scene.ui.viewmodel
+
+import android.view.HapticFeedbackConstants
+import android.view.View
+import com.android.compose.animation.scene.ObservableTransitionState
+import com.android.systemui.Flags
+import com.android.systemui.lifecycle.ExclusiveActivatable
+import com.android.systemui.scene.domain.interactor.SceneInteractor
+import com.android.systemui.scene.shared.model.Overlays
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.google.android.msdl.data.model.MSDLToken
+import com.google.android.msdl.domain.MSDLPlayer
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.distinctUntilChanged
+
+/**
+ * Models haptics UI state for the scene container.
+ *
+ * This model gets a [View] to play haptics using the [View.performHapticFeedback] API. This should
+ * be the only purpose of this reference.
+ */
+class SceneContainerHapticsViewModel
+@AssistedInject
+constructor(
+    @Assisted private val view: View,
+    sceneInteractor: SceneInteractor,
+    shadeInteractor: ShadeInteractor,
+    private val msdlPlayer: MSDLPlayer,
+) : ExclusiveActivatable() {
+
+    /** Should haptics be played by pulling down the shade */
+    private val isShadePullHapticsRequired: Flow<Boolean> =
+        combine(shadeInteractor.isUserInteracting, sceneInteractor.transitionState) {
+                interacting,
+                transitionState ->
+                interacting && transitionState.isValidForShadePullHaptics()
+            }
+            .distinctUntilChanged()
+
+    override suspend fun onActivated(): Nothing {
+        isShadePullHapticsRequired.collect { playShadePullHaptics ->
+            if (!playShadePullHaptics) return@collect
+
+            if (Flags.msdlFeedback()) {
+                msdlPlayer.playToken(MSDLToken.SWIPE_THRESHOLD_INDICATOR)
+            } else {
+                view.performHapticFeedback(HapticFeedbackConstants.GESTURE_START)
+            }
+        }
+        awaitCancellation()
+    }
+
+    private fun ObservableTransitionState.isValidForShadePullHaptics(): Boolean {
+        val validOrigin =
+            isTransitioning(from = Scenes.Gone) || isTransitioning(from = Scenes.Lockscreen)
+        val validDestination =
+            isTransitioning(to = Scenes.Shade) ||
+                isTransitioning(to = Scenes.QuickSettings) ||
+                isTransitioning(to = Overlays.QuickSettingsShade) ||
+                isTransitioning(to = Overlays.NotificationsShade)
+        return validOrigin && validDestination
+    }
+
+    @AssistedFactory
+    interface Factory {
+        fun create(view: View): SceneContainerHapticsViewModel
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
index 0bf2d49..889380a 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
@@ -17,8 +17,9 @@
 package com.android.systemui.scene.ui.viewmodel
 
 import android.view.MotionEvent
+import android.view.View
 import androidx.compose.runtime.getValue
-import androidx.compose.ui.geometry.Offset
+import com.android.app.tracing.coroutines.launch
 import com.android.compose.animation.scene.ContentKey
 import com.android.compose.animation.scene.DefaultEdgeDetector
 import com.android.compose.animation.scene.ObservableTransitionState
@@ -59,8 +60,8 @@
     shadeInteractor: ShadeInteractor,
     private val splitEdgeDetector: SplitEdgeDetector,
     private val logger: SceneLogger,
-    gestureFilterFactory: SceneContainerGestureFilter.Factory,
-    @Assisted displayId: Int,
+    hapticsViewModelFactory: SceneContainerHapticsViewModel.Factory,
+    @Assisted view: View,
     @Assisted private val motionEventHandlerReceiver: (MotionEventHandler?) -> Unit,
 ) : ExclusiveActivatable() {
 
@@ -72,6 +73,8 @@
     /** Whether the container is visible. */
     val isVisible: Boolean by hydrator.hydratedStateOf("isVisible", sceneInteractor.isVisible)
 
+    private val hapticsViewModel = hapticsViewModelFactory.create(view)
+
     /**
      * The [SwipeSourceDetector] to use for defining which edges of the screen can be defined in the
      * [UserAction]s for this container.
@@ -86,8 +89,6 @@
                 },
         )
 
-    private val gestureFilter: SceneContainerGestureFilter = gestureFilterFactory.create(displayId)
-
     override suspend fun onActivated(): Nothing {
         try {
             // Sends a MotionEventHandler to the owner of the view-model so they can report
@@ -106,7 +107,7 @@
 
             coroutineScope {
                 launch { hydrator.activate() }
-                launch { gestureFilter.activate() }
+                launch("SceneContainerHapticsViewModel") { hapticsViewModel.activate() }
             }
             awaitCancellation()
         } finally {
@@ -255,17 +256,6 @@
         }
     }
 
-    /**
-     * Returns `true` if a drag gesture starting at [startPosition] should be filtered out (e.g.
-     * ignored, `false` otherwise.
-     *
-     * Invoke this and pass in the position of the `ACTION_DOWN` pointer event that began the
-     * gesture.
-     */
-    fun shouldFilterGesture(startPosition: Offset): Boolean {
-        return gestureFilter.shouldFilterGesture(startPosition)
-    }
-
     /** Defines interface for classes that can handle externally-reported [MotionEvent]s. */
     interface MotionEventHandler {
         /** Notifies that a [MotionEvent] has occurred. */
@@ -281,7 +271,7 @@
     @AssistedFactory
     interface Factory {
         fun create(
-            displayId: Int,
+            view: View,
             motionEventHandlerReceiver: (MotionEventHandler?) -> Unit,
         ): SceneContainerViewModel
     }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/HeadlessScreenshotHandler.kt b/packages/SystemUI/src/com/android/systemui/screenshot/HeadlessScreenshotHandler.kt
index 6730d2d..7b56688 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/HeadlessScreenshotHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/HeadlessScreenshotHandler.kt
@@ -49,7 +49,7 @@
     override fun handleScreenshot(
         screenshot: ScreenshotData,
         finisher: Consumer<Uri?>,
-        requestCallback: TakeScreenshotService.RequestCallback
+        requestCallback: TakeScreenshotService.RequestCallback,
     ) {
         if (screenshot.type == WindowManager.TAKE_SCREENSHOT_FULLSCREEN) {
             screenshot.bitmap = imageCapture.captureDisplay(screenshot.displayId, crop = null)
@@ -69,8 +69,8 @@
                 Executors.newSingleThreadExecutor(),
                 UUID.randomUUID(),
                 screenshot.bitmap,
-                screenshot.getUserOrDefault(),
-                screenshot.displayId
+                screenshot.userHandle,
+                screenshot.displayId,
             )
         future.addListener(
             {
@@ -86,7 +86,7 @@
                     requestCallback.reportError()
                 }
             },
-            mainExecutor
+            mainExecutor,
         )
     }
 
@@ -98,11 +98,11 @@
                 .notifyScreenshotError(R.string.screenshot_failed_to_save_text)
         } else {
             uiEventLogger.log(ScreenshotEvent.SCREENSHOT_SAVED, 0, screenshot.packageNameString)
-            if (userManager.isManagedProfile(screenshot.getUserOrDefault().identifier)) {
+            if (userManager.isManagedProfile(screenshot.userHandle.identifier)) {
                 uiEventLogger.log(
                     ScreenshotEvent.SCREENSHOT_SAVED_TO_WORK_PROFILE,
                     0,
-                    screenshot.packageNameString
+                    screenshot.packageNameString,
                 )
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/LegacyScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/LegacyScreenshotController.java
index 7724abd..3920d58 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/LegacyScreenshotController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/LegacyScreenshotController.java
@@ -255,11 +255,11 @@
         Assert.isMainThread();
 
         mCurrentRequestCallback = requestCallback;
+        Rect bounds = screenshot.getOriginalScreenBounds();
         if (screenshot.getType() == WindowManager.TAKE_SCREENSHOT_FULLSCREEN
                 && screenshot.getBitmap() == null) {
-            Rect bounds = getFullScreenRect();
+            bounds = getFullScreenRect();
             screenshot.setBitmap(mImageCapture.captureDisplay(mDisplay.getDisplayId(), bounds));
-            screenshot.setScreenBounds(bounds);
         }
 
         if (screenshot.getBitmap() == null) {
@@ -301,7 +301,7 @@
         saveScreenshotInBackground(screenshot, requestId, finisher, result -> {
             if (result.uri != null) {
                 ScreenshotSavedResult savedScreenshot = new ScreenshotSavedResult(
-                        result.uri, screenshot.getUserOrDefault(), result.timestamp);
+                        result.uri, screenshot.getUserHandle(), result.timestamp);
                 mActionsController.setCompletedScreenshot(requestId, savedScreenshot);
             }
         });
@@ -325,22 +325,22 @@
 
         boolean showFlash;
         if (screenshot.getType() == WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE) {
-            if (screenshot.getScreenBounds() != null
-                    && aspectRatiosMatch(screenshot.getBitmap(), screenshot.getInsets(),
-                    screenshot.getScreenBounds())) {
+            if (bounds != null
+                    && aspectRatiosMatch(screenshot.getBitmap(), screenshot.getOriginalInsets(),
+                    bounds)) {
                 showFlash = false;
             } else {
                 showFlash = true;
-                screenshot.setInsets(Insets.NONE);
-                screenshot.setScreenBounds(new Rect(0, 0, screenshot.getBitmap().getWidth(),
-                        screenshot.getBitmap().getHeight()));
+                bounds = new Rect(0, 0, screenshot.getBitmap().getWidth(),
+                        screenshot.getBitmap().getHeight());
             }
         } else {
             showFlash = true;
         }
 
+        final Rect animationBounds = bounds;
         mViewProxy.prepareEntranceAnimation(
-                () -> startAnimation(screenshot.getScreenBounds(), showFlash,
+                () -> startAnimation(animationBounds, showFlash,
                         () -> mMessageContainerController.onScreenshotTaken(screenshot)));
 
         mViewProxy.setScreenshot(screenshot);
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.kt
index 29208f8..e3fbb60 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.kt
@@ -60,7 +60,6 @@
 import java.util.concurrent.ExecutorService
 import java.util.concurrent.Executors
 import java.util.function.Consumer
-import javax.inject.Provider
 import kotlin.math.abs
 
 /** Controls the state and flow for screenshots. */
@@ -73,7 +72,7 @@
     screenshotNotificationsControllerFactory: ScreenshotNotificationsController.Factory,
     screenshotActionsControllerFactory: ScreenshotActionsController.Factory,
     actionExecutorFactory: ActionExecutor.Factory,
-    screenshotSoundControllerProvider: Provider<ScreenshotSoundController?>,
+    private val screenshotSoundController: ScreenshotSoundController,
     private val uiEventLogger: UiEventLogger,
     private val imageExporter: ImageExporter,
     private val imageCapture: ImageCapture,
@@ -97,12 +96,12 @@
     private val window: ScreenshotWindow
     private val actionExecutor: ActionExecutor
     private val copyBroadcastReceiver: BroadcastReceiver
+    private val currentRequestCallbacks: MutableList<TakeScreenshotService.RequestCallback> =
+        mutableListOf()
 
-    private var screenshotSoundController: ScreenshotSoundController? = null
     private var screenBitmap: Bitmap? = null
     private var screenshotTakenInPortrait = false
     private var screenshotAnimation: Animator? = null
-    private var currentRequestCallback: TakeScreenshotService.RequestCallback? = null
     private var packageName = ""
 
     /** Tracks config changes that require re-creating UI */
@@ -137,14 +136,6 @@
         actionExecutor = actionExecutorFactory.create(window.window, viewProxy) { finishDismiss() }
         actionsController = screenshotActionsControllerFactory.getController(actionExecutor)
 
-        // Sound is only reproduced from the controller of the default display.
-        screenshotSoundController =
-            if (display.displayId == Display.DEFAULT_DISPLAY) {
-                screenshotSoundControllerProvider.get()
-            } else {
-                null
-            }
-
         copyBroadcastReceiver =
             object : BroadcastReceiver() {
                 override fun onReceive(context: Context, intent: Intent) {
@@ -169,19 +160,18 @@
         requestCallback: TakeScreenshotService.RequestCallback,
     ) {
         Assert.isMainThread()
+        screenshotHandler.resetTimeout()
 
-        currentRequestCallback = requestCallback
         if (screenshot.type == TAKE_SCREENSHOT_FULLSCREEN && screenshot.bitmap == null) {
             val bounds = fullScreenRect
             screenshot.bitmap = imageCapture.captureDisplay(display.displayId, bounds)
-            screenshot.screenBounds = bounds
         }
 
         val currentBitmap = screenshot.bitmap
         if (currentBitmap == null) {
             Log.e(TAG, "handleScreenshot: Screenshot bitmap was null")
             notificationController.notifyScreenshotError(R.string.screenshot_failed_to_capture_text)
-            currentRequestCallback?.reportError()
+            requestCallback.reportError()
             return
         }
 
@@ -194,8 +184,10 @@
             // User setup isn't complete, so we don't want to show any UI beyond a toast, as editing
             // and sharing shouldn't be exposed to the user.
             saveScreenshotAndToast(screenshot, finisher)
+            requestCallback.onFinish()
             return
         }
+        currentRequestCallbacks.add(requestCallback)
 
         broadcastSender.sendBroadcast(
             Intent(ClipboardOverlayController.SCREENSHOT_ACTION),
@@ -214,11 +206,7 @@
         saveScreenshotInBackground(screenshot, requestId, finisher) { result ->
             if (result.uri != null) {
                 val savedScreenshot =
-                    ScreenshotSavedResult(
-                        result.uri,
-                        screenshot.getUserOrDefault(),
-                        result.timestamp,
-                    )
+                    ScreenshotSavedResult(result.uri, screenshot.userHandle, result.timestamp)
                 actionsController.setCompletedScreenshot(requestId, savedScreenshot)
             }
         }
@@ -235,27 +223,31 @@
         window.setFocusable(true)
         viewProxy.requestFocus()
 
-        enqueueScrollCaptureRequest(requestId, screenshot.userHandle!!)
+        enqueueScrollCaptureRequest(requestId, screenshot.userHandle)
 
         window.attachWindow()
 
+        var bounds =
+            screenshot.originalScreenBounds ?: Rect(0, 0, currentBitmap.width, currentBitmap.height)
+
         val showFlash: Boolean
         if (screenshot.type == TAKE_SCREENSHOT_PROVIDED_IMAGE) {
-            if (aspectRatiosMatch(currentBitmap, screenshot.insets, screenshot.screenBounds)) {
+            if (
+                aspectRatiosMatch(
+                    currentBitmap,
+                    screenshot.originalInsets,
+                    screenshot.originalScreenBounds,
+                )
+            ) {
                 showFlash = false
             } else {
                 showFlash = true
-                screenshot.insets = Insets.NONE
-                screenshot.screenBounds = Rect(0, 0, currentBitmap.width, currentBitmap.height)
+                bounds = Rect(0, 0, currentBitmap.width, currentBitmap.height)
             }
         } else {
             showFlash = true
         }
 
-        // screenshot.screenBounds is expected to be non-null in all cases at this point
-        val bounds =
-            screenshot.screenBounds ?: Rect(0, 0, currentBitmap.width, currentBitmap.height)
-
         viewProxy.prepareEntranceAnimation {
             startAnimation(bounds, showFlash) {
                 messageContainerController.onScreenshotTaken(screenshot)
@@ -267,7 +259,7 @@
 
     private fun prepareViewForNewScreenshot(screenshot: ScreenshotData, oldPackageName: String?) {
         window.whenWindowAttached {
-            announcementResolver.getScreenshotAnnouncement(screenshot.userHandle!!.identifier) {
+            announcementResolver.getScreenshotAnnouncement(screenshot.userHandle.identifier) {
                 viewProxy.announceForAccessibility(it)
             }
         }
@@ -306,7 +298,7 @@
     // Any cleanup needed when the service is being destroyed.
     override fun onDestroy() {
         removeWindow()
-        releaseMediaPlayer()
+        screenshotSoundController.releaseScreenshotSoundAsync()
         releaseContext()
         bgExecutor.shutdown()
     }
@@ -317,10 +309,6 @@
         context.release()
     }
 
-    private fun releaseMediaPlayer() {
-        screenshotSoundController?.releaseScreenshotSoundAsync()
-    }
-
     /** Update resources on configuration change. Reinflate for theme/color changes. */
     private fun reloadAssets() {
         if (LogConfig.DEBUG_UI) {
@@ -446,18 +434,13 @@
         viewProxy.stopInputListening()
     }
 
-    private fun playCameraSoundIfNeeded() {
-        // the controller is not-null only on the default display controller
-        screenshotSoundController?.playScreenshotSoundAsync()
-    }
-
     /**
      * Save the bitmap but don't show the normal screenshot UI.. just a toast (or notification on
      * failure).
      */
     private fun saveScreenshotAndToast(screenshot: ScreenshotData, finisher: Consumer<Uri?>) {
         // Play the shutter sound to notify that we've taken a screenshot
-        playCameraSoundIfNeeded()
+        screenshotSoundController.playScreenshotSoundAsync()
 
         saveScreenshotInBackground(screenshot, UUID.randomUUID(), finisher) {
             result: ImageExporter.Result ->
@@ -486,7 +469,7 @@
             viewProxy.createScreenshotDropInAnimation(screenRect, showFlash).apply {
                 doOnEnd { onAnimationComplete?.run() }
                 // Play the shutter sound to notify that we've taken a screenshot
-                playCameraSoundIfNeeded()
+                screenshotSoundController.playScreenshotSoundAsync()
                 if (LogConfig.DEBUG_ANIM) {
                     Log.d(TAG, "starting post-screenshot animation")
                 }
@@ -499,8 +482,8 @@
         Log.d(TAG, "finishDismiss")
         actionsController.endScreenshotSession()
         scrollCaptureExecutor.close()
-        currentRequestCallback?.onFinish()
-        currentRequestCallback = null
+        currentRequestCallbacks.forEach { it.onFinish() }
+        currentRequestCallbacks.clear()
         viewProxy.reset()
         removeWindow()
         screenshotHandler.cancelTimeout()
@@ -517,7 +500,7 @@
                 bgExecutor,
                 requestId,
                 screenshot.bitmap,
-                screenshot.getUserOrDefault(),
+                screenshot.userHandle,
                 display.displayId,
             )
         future.addListener(
@@ -525,7 +508,7 @@
                 try {
                     val result = future.get()
                     Log.d(TAG, "Saved screenshot: $result")
-                    logScreenshotResultStatus(result.uri, screenshot.userHandle!!)
+                    logScreenshotResultStatus(result.uri, screenshot.userHandle)
                     onResult.accept(result)
                     if (LogConfig.DEBUG_CALLBACK) {
                         Log.d(TAG, "finished bg processing, calling back with uri: ${result.uri}")
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotData.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotData.kt
index 4fdd90b..c390e71 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotData.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotData.kt
@@ -4,10 +4,10 @@
 import android.graphics.Bitmap
 import android.graphics.Insets
 import android.graphics.Rect
-import android.net.Uri
 import android.os.Process
 import android.os.UserHandle
 import android.view.Display
+import android.view.WindowManager
 import android.view.WindowManager.ScreenshotSource
 import android.view.WindowManager.ScreenshotType
 import androidx.annotation.VisibleForTesting
@@ -15,22 +15,20 @@
 
 /** [ScreenshotData] represents the current state of a single screenshot being acquired. */
 data class ScreenshotData(
-    @ScreenshotType var type: Int,
-    @ScreenshotSource var source: Int,
+    @ScreenshotType val type: Int,
+    @ScreenshotSource val source: Int,
     /** UserHandle for the owner of the app being screenshotted, if known. */
-    var userHandle: UserHandle?,
+    val userHandle: UserHandle,
     /** ComponentName of the top-most app in the screenshot. */
-    var topComponent: ComponentName?,
-    var screenBounds: Rect?,
-    var taskId: Int,
-    var insets: Insets,
+    val topComponent: ComponentName?,
+    val taskId: Int,
+    val originalScreenBounds: Rect?,
+    val originalInsets: Insets,
     var bitmap: Bitmap?,
-    var displayId: Int,
-    /** App-provided URL representing the content the user was looking at in the screenshot. */
-    var contextUrl: Uri? = null,
+    val displayId: Int,
 ) {
-    val packageNameString: String
-        get() = if (topComponent == null) "" else topComponent!!.packageName
+    val packageNameString
+        get() = topComponent?.packageName ?: ""
 
     fun getUserOrDefault(): UserHandle {
         return userHandle ?: Process.myUserHandle()
@@ -42,26 +40,31 @@
             ScreenshotData(
                 type = request.type,
                 source = request.source,
-                userHandle = if (request.userId >= 0) UserHandle.of(request.userId) else null,
+                userHandle = UserHandle.of(request.userId),
                 topComponent = request.topComponent,
-                screenBounds = request.boundsInScreen,
+                originalScreenBounds = request.boundsInScreen,
                 taskId = request.taskId,
-                insets = request.insets,
+                originalInsets = request.insets,
                 bitmap = request.bitmap,
                 displayId = displayId,
             )
 
         @VisibleForTesting
-        fun forTesting() =
+        fun forTesting(
+            userHandle: UserHandle = UserHandle.CURRENT,
+            source: Int = ScreenshotSource.SCREENSHOT_KEY_CHORD,
+            topComponent: ComponentName? = null,
+            bitmap: Bitmap? = null,
+        ) =
             ScreenshotData(
-                type = 0,
-                source = 0,
-                userHandle = null,
-                topComponent = null,
-                screenBounds = null,
+                type = WindowManager.TAKE_SCREENSHOT_FULLSCREEN,
+                source = source,
+                userHandle = userHandle,
+                topComponent = topComponent,
+                originalScreenBounds = null,
                 taskId = 0,
-                insets = Insets.NONE,
-                bitmap = null,
+                originalInsets = Insets.NONE,
+                bitmap = bitmap,
                 displayId = Display.DEFAULT_DISPLAY,
             )
     }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt
index 448f7c4..a755746 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt
@@ -20,12 +20,15 @@
 import android.os.Trace
 import android.util.Log
 import android.view.Display
+import android.view.WindowManager.ScreenshotSource
 import android.view.WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE
 import com.android.internal.logging.UiEventLogger
 import com.android.internal.util.ScreenshotRequest
+import com.android.systemui.Flags.screenshotMultidisplayFocusChange
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.display.data.repository.DisplayRepository
+import com.android.systemui.display.data.repository.FocusedDisplayRepository
 import com.android.systemui.res.R
 import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_CAPTURE_FAILED
 import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_DISMISSED_OTHER
@@ -40,7 +43,7 @@
     suspend fun executeScreenshots(
         screenshotRequest: ScreenshotRequest,
         onSaved: (Uri?) -> Unit,
-        requestCallback: RequestCallback
+        requestCallback: RequestCallback,
     )
 
     fun onCloseSystemDialogsReceived()
@@ -52,7 +55,7 @@
     fun executeScreenshotsAsync(
         screenshotRequest: ScreenshotRequest,
         onSaved: Consumer<Uri?>,
-        requestCallback: RequestCallback
+        requestCallback: RequestCallback,
     )
 }
 
@@ -60,7 +63,7 @@
     fun handleScreenshot(
         screenshot: ScreenshotData,
         finisher: Consumer<Uri?>,
-        requestCallback: RequestCallback
+        requestCallback: RequestCallback,
     )
 }
 
@@ -75,12 +78,13 @@
 @Inject
 constructor(
     private val interactiveScreenshotHandlerFactory: InteractiveScreenshotHandler.Factory,
-    displayRepository: DisplayRepository,
+    private val displayRepository: DisplayRepository,
     @Application private val mainScope: CoroutineScope,
     private val screenshotRequestProcessor: ScreenshotRequestProcessor,
     private val uiEventLogger: UiEventLogger,
     private val screenshotNotificationControllerFactory: ScreenshotNotificationsController.Factory,
     private val headlessScreenshotHandler: HeadlessScreenshotHandler,
+    private val focusedDisplayRepository: FocusedDisplayRepository,
 ) : TakeScreenshotExecutor {
     private val displays = displayRepository.displays
     private var screenshotController: InteractiveScreenshotHandler? = null
@@ -95,31 +99,44 @@
     override suspend fun executeScreenshots(
         screenshotRequest: ScreenshotRequest,
         onSaved: (Uri?) -> Unit,
-        requestCallback: RequestCallback
+        requestCallback: RequestCallback,
     ) {
-        val displays = getDisplaysToScreenshot(screenshotRequest.type)
-        val resultCallbackWrapper = MultiResultCallbackWrapper(requestCallback)
-        if (displays.isEmpty()) {
-            Log.wtf(TAG, "No displays found for screenshot.")
-        }
-        displays.forEach { display ->
-            val displayId = display.displayId
-            var screenshotHandler: ScreenshotHandler =
-                if (displayId == Display.DEFAULT_DISPLAY) {
-                    getScreenshotController(display)
-                } else {
-                    headlessScreenshotHandler
-                }
-            Log.d(TAG, "Executing screenshot for display $displayId")
+        if (screenshotMultidisplayFocusChange()) {
+            val display = getDisplayToScreenshot(screenshotRequest)
+            val screenshotHandler = getScreenshotController(display)
             dispatchToController(
                 screenshotHandler,
-                rawScreenshotData = ScreenshotData.fromRequest(screenshotRequest, displayId),
-                onSaved =
-                    if (displayId == Display.DEFAULT_DISPLAY) {
-                        onSaved
-                    } else { _ -> },
-                callback = resultCallbackWrapper.createCallbackForId(displayId)
+                ScreenshotData.fromRequest(screenshotRequest, display.displayId),
+                onSaved,
+                requestCallback,
             )
+        } else {
+            val displays = getDisplaysToScreenshot(screenshotRequest.type)
+            val resultCallbackWrapper = MultiResultCallbackWrapper(requestCallback)
+            if (displays.isEmpty()) {
+                Log.e(TAG, "No displays found for screenshot.")
+            }
+
+            displays.forEach { display ->
+                val displayId = display.displayId
+                var screenshotHandler: ScreenshotHandler =
+                    if (displayId == Display.DEFAULT_DISPLAY) {
+                        getScreenshotController(display)
+                    } else {
+                        headlessScreenshotHandler
+                    }
+
+                Log.d(TAG, "Executing screenshot for display $displayId")
+                dispatchToController(
+                    screenshotHandler,
+                    rawScreenshotData = ScreenshotData.fromRequest(screenshotRequest, displayId),
+                    onSaved =
+                        if (displayId == Display.DEFAULT_DISPLAY) {
+                            onSaved
+                        } else { _ -> },
+                    callback = resultCallbackWrapper.createCallbackForId(displayId),
+                )
+            }
         }
     }
 
@@ -128,7 +145,7 @@
         screenshotHandler: ScreenshotHandler,
         rawScreenshotData: ScreenshotData,
         onSaved: (Uri?) -> Unit,
-        callback: RequestCallback
+        callback: RequestCallback,
     ) {
         // Let's wait before logging "screenshot requested", as we should log the processed
         // ScreenshotData.
@@ -160,13 +177,13 @@
         uiEventLogger.log(
             ScreenshotEvent.getScreenshotSource(screenshotData.source),
             0,
-            screenshotData.packageNameString
+            screenshotData.packageNameString,
         )
     }
 
     private fun onFailedScreenshotRequest(
         screenshotData: ScreenshotData,
-        callback: RequestCallback
+        callback: RequestCallback,
     ) {
         uiEventLogger.log(SCREENSHOT_CAPTURE_FAILED, 0, screenshotData.packageNameString)
         getNotificationController(screenshotData.displayId)
@@ -184,6 +201,30 @@
         }
     }
 
+    // Return the single display to be screenshot based upon the request.
+    private suspend fun getDisplayToScreenshot(screenshotRequest: ScreenshotRequest): Display {
+        return when (screenshotRequest.source) {
+            ScreenshotSource.SCREENSHOT_OVERVIEW ->
+                // Show on the display where overview was shown if available.
+                displayRepository.getDisplay(screenshotRequest.displayId)
+                    ?: displayRepository.getDisplay(Display.DEFAULT_DISPLAY)
+                    ?: error("Can't find default display")
+
+            // Key chord and vendor gesture occur on the device itself, so screenshot the device's
+            // display
+            ScreenshotSource.SCREENSHOT_KEY_CHORD,
+            ScreenshotSource.SCREENSHOT_VENDOR_GESTURE ->
+                displayRepository.getDisplay(Display.DEFAULT_DISPLAY)
+                    ?: error("Can't find default display")
+
+            // All other invocations use the focused display
+            else ->
+                displayRepository.getDisplay(focusedDisplayRepository.focusedDisplayId.value)
+                    ?: displayRepository.getDisplay(Display.DEFAULT_DISPLAY)
+                    ?: error("Can't find default display")
+        }
+    }
+
     /** Propagates the close system dialog signal to the ScreenshotController. */
     override fun onCloseSystemDialogsReceived() {
         if (screenshotController?.isPendingSharedTransition() == false) {
@@ -214,7 +255,7 @@
     override fun executeScreenshotsAsync(
         screenshotRequest: ScreenshotRequest,
         onSaved: Consumer<Uri?>,
-        requestCallback: RequestCallback
+        requestCallback: RequestCallback,
     ) {
         mainScope.launch {
             executeScreenshots(screenshotRequest, { uri -> onSaved.accept(uri) }, requestCallback)
@@ -235,9 +276,7 @@
      * - If any finished with an error, [reportError] of [originalCallback] is called
      * - Otherwise, [onFinish] is called.
      */
-    private class MultiResultCallbackWrapper(
-        private val originalCallback: RequestCallback,
-    ) {
+    private class MultiResultCallbackWrapper(private val originalCallback: RequestCallback) {
         private val idsPending = mutableSetOf<Int>()
         private val idsWithErrors = mutableSetOf<Int>()
 
@@ -290,7 +329,7 @@
                 Display.TYPE_EXTERNAL,
                 Display.TYPE_INTERNAL,
                 Display.TYPE_OVERLAY,
-                Display.TYPE_WIFI
+                Display.TYPE_WIFI,
             )
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/policy/PolicyRequestProcessor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/policy/PolicyRequestProcessor.kt
index b3d5c9e..a94393b 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/policy/PolicyRequestProcessor.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/policy/PolicyRequestProcessor.kt
@@ -92,7 +92,7 @@
                         updates.component,
                         updates.owner,
                         type.taskId,
-                        type.taskBounds
+                        type.taskBounds,
                     )
                 is FullScreen ->
                     replaceWithScreenshot(
@@ -122,7 +122,7 @@
             componentName = topMainRootTask?.topActivity ?: defaultComponent,
             taskId = topMainRootTask?.taskId,
             owner = defaultOwner,
-            displayId = original.displayId
+            displayId = original.displayId,
         )
     }
 
@@ -141,14 +141,14 @@
             userHandle = owner,
             taskId = taskId,
             topComponent = componentName,
-            screenBounds = taskBounds
+            originalScreenBounds = taskBounds,
         )
     }
 
     private suspend fun replaceWithScreenshot(
         original: ScreenshotData,
         componentName: ComponentName?,
-        owner: UserHandle?,
+        owner: UserHandle,
         displayId: Int,
         taskId: Int? = null,
     ): ScreenshotData {
@@ -159,7 +159,7 @@
             bitmap = screenshot,
             userHandle = owner,
             topComponent = componentName,
-            screenBounds = Rect(0, 0, screenshot?.width ?: 0, screenshot?.height ?: 0),
+            originalScreenBounds = Rect(0, 0, screenshot?.width ?: 0, screenshot?.height ?: 0),
             taskId = taskId ?: -1,
         )
     }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/ScreenshotAnimationController.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/ScreenshotAnimationController.kt
index a4906c1..91efa0a 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/ScreenshotAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/ScreenshotAnimationController.kt
@@ -41,7 +41,7 @@
 
 class ScreenshotAnimationController(
     private val view: ScreenshotShelfView,
-    private val viewModel: ScreenshotViewModel
+    private val viewModel: ScreenshotViewModel,
 ) {
     private var animator: Animator? = null
     private val screenshotPreview = view.requireViewById<ImageView>(R.id.screenshot_preview)
@@ -56,7 +56,7 @@
         listOf<View>(
             view.requireViewById(R.id.screenshot_preview_border),
             view.requireViewById(R.id.screenshot_badge),
-            view.requireViewById(R.id.screenshot_dismiss_button)
+            view.requireViewById(R.id.screenshot_dismiss_button),
         )
     private val fadeUI =
         listOf<View>(
@@ -70,9 +70,11 @@
     fun getEntranceAnimation(
         bounds: Rect,
         showFlash: Boolean,
-        onRevealMilestone: () -> Unit
+        onRevealMilestone: () -> Unit,
     ): Animator {
         val entranceAnimation = AnimatorSet()
+        view.alpha = 1f
+        view.translationX = 0f
 
         val previewAnimator = getPreviewAnimator(bounds)
 
@@ -142,7 +144,7 @@
     fun runLongScreenshotTransition(
         destRect: Rect,
         longScreenshot: ScrollCaptureController.LongScreenshot,
-        onTransitionEnd: Runnable
+        onTransitionEnd: Runnable,
     ): Animator {
         val animSet = AnimatorSet()
 
@@ -165,7 +167,7 @@
             matrix.setScale(currentScale, currentScale)
             matrix.postTranslate(
                 longScreenshot.left * currentScale,
-                longScreenshot.top * currentScale
+                longScreenshot.top * currentScale,
             )
             scrollTransitionPreview.setImageMatrix(matrix)
             val destinationScale: Float = destRect.width() / scrollTransitionPreview.width.toFloat()
@@ -315,7 +317,7 @@
     }
 
     private fun getAdjustedVelocity(requestedVelocity: Float?): Float {
-        return if (requestedVelocity == null) {
+        return if (requestedVelocity == null || abs(requestedVelocity) < .005f) {
             val isLTR = view.resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_LTR
             // dismiss to the left in LTR locales, to the right in RTL
             if (isLTR) -MINIMUM_VELOCITY else MINIMUM_VELOCITY
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/SwipeGestureListener.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/SwipeGestureListener.kt
index 61d4489..ecb45e1 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/SwipeGestureListener.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/SwipeGestureListener.kt
@@ -25,7 +25,7 @@
 class SwipeGestureListener(
     private val view: View,
     private val onDismiss: (Float?) -> Unit,
-    private val onCancel: () -> Unit
+    private val onCancel: () -> Unit,
 ) {
     private val velocityTracker = VelocityTracker.obtain()
     private val displayMetrics = view.resources.displayMetrics
@@ -54,9 +54,9 @@
                     onDismiss.invoke(xVelocity)
                     return true
                 } else {
-                    velocityTracker.clear()
                     onCancel.invoke()
                 }
+                velocityTracker.clear()
             }
             MotionEvent.ACTION_MOVE -> {
                 velocityTracker.addMovement(ev)
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
index 0c05dbd..757e37e 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
@@ -23,12 +23,14 @@
 import static com.android.app.animation.Interpolators.EMPHASIZED_DECELERATE;
 import static com.android.keyguard.KeyguardClockSwitch.LARGE;
 import static com.android.keyguard.KeyguardClockSwitch.SMALL;
+import static com.android.systemui.Flags.msdlFeedback;
 import static com.android.systemui.Flags.predictiveBackAnimateShade;
 import static com.android.systemui.Flags.smartspaceRelocateToBottom;
 import static com.android.systemui.classifier.Classifier.BOUNCER_UNLOCK;
 import static com.android.systemui.classifier.Classifier.GENERIC;
 import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS;
 import static com.android.systemui.classifier.Classifier.UNLOCK;
+import static com.android.systemui.keyguard.shared.model.KeyguardState.AOD;
 import static com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING;
 import static com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING_LOCKSCREEN_HOSTED;
 import static com.android.systemui.keyguard.shared.model.KeyguardState.GONE;
@@ -236,6 +238,9 @@
 
 import dalvik.annotation.optimization.NeverCompile;
 
+import com.google.android.msdl.data.model.MSDLToken;
+import com.google.android.msdl.domain.MSDLPlayer;
+
 import kotlin.Unit;
 
 import kotlinx.coroutines.CoroutineDispatcher;
@@ -312,6 +317,7 @@
     private final StatusBarStateListener mStatusBarStateListener = new StatusBarStateListener();
     private final NotificationPanelView mView;
     private final VibratorHelper mVibratorHelper;
+    private final MSDLPlayer mMSDLPlayer;
     private final MetricsLogger mMetricsLogger;
     private final ConfigurationController mConfigurationController;
     private final Provider<FlingAnimationUtils.Builder> mFlingAnimationUtilsBuilder;
@@ -777,7 +783,8 @@
             SplitShadeStateController splitShadeStateController,
             PowerInteractor powerInteractor,
             KeyguardClockPositionAlgorithm keyguardClockPositionAlgorithm,
-            NaturalScrollingSettingObserver naturalScrollingSettingObserver) {
+            NaturalScrollingSettingObserver naturalScrollingSettingObserver,
+            MSDLPlayer msdlPlayer) {
         SceneContainerFlag.assertInLegacyMode();
         keyguardStateController.addCallback(new KeyguardStateController.Callback() {
             @Override
@@ -855,6 +862,7 @@
         mNotificationsDragEnabled = mResources.getBoolean(
                 R.bool.config_enableNotificationShadeDrag);
         mVibratorHelper = vibratorHelper;
+        mMSDLPlayer = msdlPlayer;
         mVibrateOnOpening = mResources.getBoolean(R.bool.config_vibrateOnIconAnimation);
         mStatusBarTouchableRegionManager = statusBarTouchableRegionManager;
         mSystemClock = systemClock;
@@ -1206,6 +1214,16 @@
                     }, mMainDispatcher);
         }
 
+        if (MigrateClocksToBlueprint.isEnabled()) {
+            collectFlow(mView, mKeyguardTransitionInteractor.transition(
+                    Edge.Companion.create(AOD, LOCKSCREEN)),
+                    (TransitionStep step) -> {
+                    if (step.getTransitionState() == TransitionState.FINISHED) {
+                        updateExpandedHeightToMaxHeight();
+                    }
+                }, mMainDispatcher);
+        }
+
         // Ensures that flags are updated when an activity launches
         collectFlow(mView,
                 mShadeAnimationInteractor.isLaunchingActivity(),
@@ -2710,6 +2728,11 @@
     }
 
     private int calculatePanelHeightShade() {
+        // Bypass should always occupy the full height
+        if (mBarState == KEYGUARD && mKeyguardBypassController.getBypassEnabled()) {
+            return mNotificationStackScrollLayoutController.getHeight();
+        }
+
         int emptyBottomMargin = mNotificationStackScrollLayoutController.getEmptyBottomMargin();
         int maxHeight = mNotificationStackScrollLayoutController.getHeight() - emptyBottomMargin;
 
@@ -2911,7 +2934,7 @@
         }
 
         if (!mStatusBarStateController.isDozing()) {
-            mVibratorHelper.performHapticFeedback(mView, HapticFeedbackConstants.REJECT);
+            performHapticFeedback(HapticFeedbackConstants.REJECT);
         }
     }
 
@@ -3279,7 +3302,20 @@
     }
 
     public void performHapticFeedback(int constant) {
-        mVibratorHelper.performHapticFeedback(mView, constant);
+        if (msdlFeedback()) {
+            MSDLToken token;
+            switch (constant) {
+                case HapticFeedbackConstants.GESTURE_START ->
+                        token = MSDLToken.SWIPE_THRESHOLD_INDICATOR;
+                case HapticFeedbackConstants.REJECT -> token = MSDLToken.FAILURE;
+                default -> token = null;
+            }
+            if (token != null) {
+                mMSDLPlayer.playToken(token, null);
+            }
+        } else {
+            mVibratorHelper.performHapticFeedback(mView, constant);
+        }
     }
 
     private class ShadeHeadsUpTrackerImpl implements ShadeHeadsUpTracker {
@@ -3736,10 +3772,7 @@
     private void maybeVibrateOnOpening(boolean openingWithTouch) {
         if (mVibrateOnOpening && mBarState != KEYGUARD && mBarState != SHADE_LOCKED) {
             if (!openingWithTouch || !mHasVibratedOnOpen) {
-                mVibratorHelper.performHapticFeedback(
-                        mView,
-                        HapticFeedbackConstants.GESTURE_START
-                );
+                performHapticFeedback(HapticFeedbackConstants.GESTURE_START);
                 mHasVibratedOnOpen = true;
                 mShadeLog.v("Vibrating on opening, mHasVibratedOnOpen=true");
             }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java
index 4f47536..f83548d 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java
@@ -994,7 +994,9 @@
         // be dropped, causing the shade expansion to fail silently. Since the shade doesn't open,
         // it doesn't become visible, and the bounds will never update. Therefore, we must detect
         // the incorrect bounds here and force the update so that touches are routed correctly.
-        if (SceneContainerFlag.isEnabled() && mWindowRootView.getVisibility() == View.INVISIBLE) {
+        if (SceneContainerFlag.isEnabled()
+                && mWindowRootView != null
+                && mWindowRootView.getVisibility() == View.INVISIBLE) {
             Rect bounds = newConfig.windowConfiguration.getBounds();
             if (mWindowRootView.getWidth() != bounds.width()) {
                 mLogger.logConfigChangeWidthAdjust(mWindowRootView.getWidth(), bounds.width());
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
index 5473af3..cae141d 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
@@ -736,7 +736,9 @@
             event.recycle();
             mTouchCancelled = true;
         }
-        mAmbientState.setSwipingUp(false);
+        if (!SceneContainerFlag.isEnabled()) {
+            mAmbientState.setSwipingUp(false);
+        }
         if (MigrateClocksToBlueprint.isEnabled()) {
             mDragDownHelper.stopDragging();
         }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/OWNERS b/packages/SystemUI/src/com/android/systemui/shade/OWNERS
index bbcf10b..5b82772 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/OWNERS
+++ b/packages/SystemUI/src/com/android/systemui/shade/OWNERS
@@ -13,10 +13,9 @@
 per-file *Repository* = set noparent
 per-file *Repository* = justinweir@google.com, syeonlee@google.com, nijamkin@google.com
 
-per-file NotificationShadeWindowViewController.java = pixel@google.com, cinek@google.com, juliacr@google.com
-per-file NotificationShadeWindowView.java = pixel@google.com, cinek@google.com, juliacr@google.com
+per-file NotificationShadeWindow* = pixel@google.com, cinek@google.com, juliacr@google.com, justinweir@google.com, syeonlee@google.com
 
 per-file NotificationPanelUnfoldAnimationController.kt = alexflo@google.com, jeffdq@google.com, juliacr@google.com
 
-per-file NotificationPanelView.java = pixel@google.com, cinek@google.com, juliacr@google.com, justinweir@google.com
-per-file NotificationPanelViewController.java = pixel@google.com, cinek@google.com, juliacr@google.com, justinweir@google.com
+per-file NotificationPanelView.java = pixel@google.com, cinek@google.com, juliacr@google.com, justinweir@google.com, syeonlee@google.com
+per-file NotificationPanelViewController.java = pixel@google.com, cinek@google.com, juliacr@google.com, justinweir@google.com, syeonlee@google.com
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt
index 361226a4..6c99282 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt
@@ -22,8 +22,8 @@
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.scene.domain.interactor.SceneInteractor
-import com.android.systemui.scene.shared.model.SceneFamilies
 import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.scene.shared.model.TransitionKeys.Instant
 import com.android.systemui.scene.shared.model.TransitionKeys.SlightlyFasterShadeCollapse
 import com.android.systemui.shade.ShadeController.ShadeVisibilityListener
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
@@ -80,18 +80,25 @@
         }
     }
 
+    @Deprecated("Deprecated in Java")
     override fun isShadeEnabled() = shadeInteractor.isShadeEnabled.value
 
+    @Deprecated("Deprecated in Java")
     override fun isShadeFullyOpen(): Boolean = shadeInteractor.isAnyFullyExpanded.value
 
+    @Deprecated("Deprecated in Java")
     override fun isExpandingOrCollapsing(): Boolean = shadeInteractor.isUserInteracting.value
 
+    @Deprecated("Deprecated in Java")
     override fun instantExpandShade() {
         // Do nothing
     }
 
     override fun instantCollapseShade() {
-        sceneInteractor.snapToScene(SceneFamilies.Home, "hide shade")
+        shadeInteractor.collapseNotificationsShade(
+            loggingReason = "ShadeControllerSceneImpl.instantCollapseShade",
+            transitionKey = Instant,
+        )
     }
 
     override fun animateCollapseShade(
@@ -122,16 +129,17 @@
         }
     }
 
+    @Deprecated("Deprecated in Java")
     override fun collapseWithDuration(animationDuration: Int) {
         // TODO(b/300258424) inline this. The only caller uses the default duration.
         animateCollapseShade()
     }
 
     private fun animateCollapseShadeInternal() {
-        sceneInteractor.changeScene(
-            SceneFamilies.Home, // TODO(b/336581871): add sceneState?
-            "ShadeController.animateCollapseShade",
-            SlightlyFasterShadeCollapse,
+        // TODO(b/336581871): add sceneState?
+        shadeInteractor.collapseEitherShade(
+            loggingReason = "ShadeController.animateCollapseShade",
+            transitionKey = SlightlyFasterShadeCollapse,
         )
     }
 
@@ -140,6 +148,7 @@
         animateCollapseShade()
     }
 
+    @Deprecated("Deprecated in Java")
     override fun closeShadeIfOpen(): Boolean {
         if (shadeInteractor.isAnyExpanded.value) {
             commandQueue.animateCollapsePanels(
@@ -155,6 +164,7 @@
         animateCollapseShadeForcedDelayed()
     }
 
+    @Deprecated("Deprecated in Java")
     override fun collapseShade(animate: Boolean) {
         if (animate) {
             animateCollapseShade()
@@ -163,13 +173,14 @@
         }
     }
 
+    @Deprecated("Deprecated in Java")
     override fun collapseOnMainThread() {
         // TODO if this works with delegation alone, we can deprecate and delete
         collapseShade()
     }
 
     override fun expandToNotifications() {
-        shadeInteractor.expandNotificationShade("ShadeController.animateExpandShade")
+        shadeInteractor.expandNotificationsShade("ShadeController.animateExpandShade")
     }
 
     override fun expandToQs() {
@@ -193,14 +204,17 @@
         }
     }
 
+    @Deprecated("Deprecated in Java")
     override fun postAnimateCollapseShade() {
         animateCollapseShade()
     }
 
+    @Deprecated("Deprecated in Java")
     override fun postAnimateForceCollapseShade() {
         animateCollapseShadeForced()
     }
 
+    @Deprecated("Deprecated in Java")
     override fun postAnimateExpandQs() {
         expandToQs()
     }
@@ -214,18 +228,23 @@
         }
     }
 
+    @Deprecated("Deprecated in Java")
     override fun makeExpandedInvisible() {
         // Do nothing
     }
 
+    @Deprecated("Deprecated in Java")
     override fun makeExpandedVisible(force: Boolean) {
         // Do nothing
     }
 
+    @Deprecated("Deprecated in Java")
     override fun isExpandedVisible(): Boolean {
-        return sceneInteractor.currentScene.value != Scenes.Gone
+        return sceneInteractor.currentScene.value != Scenes.Gone ||
+            sceneInteractor.currentOverlays.value.isNotEmpty()
     }
 
+    @Deprecated("Deprecated in Java")
     override fun onStatusBarTouch(event: MotionEvent) {
         // The only call to this doesn't happen with MigrateClocksToBlueprint.isEnabled enabled
         throw UnsupportedOperationException()
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt
index b046c50..a3f2c64 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.shade.domain.interactor
 
 import androidx.annotation.FloatRange
+import com.android.compose.animation.scene.TransitionKey
 import com.android.systemui.shade.shared.model.ShadeMode
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.Flow
@@ -27,19 +28,22 @@
 
 /** Business logic for shade interactions. */
 interface ShadeInteractor : BaseShadeInteractor {
-    /** Emits true if the shade is currently allowed and false otherwise. */
+    /** Emits true if the Notifications shade is currently allowed and false otherwise. */
     val isShadeEnabled: StateFlow<Boolean>
 
-    /** Emits true if QS is currently allowed and false otherwise. */
+    /** Emits true if QS shade is currently allowed and false otherwise. */
     val isQsEnabled: StateFlow<Boolean>
 
-    /** Whether either the shade or QS is fully expanded. */
+    /** Whether either the Notifications shade or QS shade is fully expanded. */
     val isAnyFullyExpanded: StateFlow<Boolean>
 
-    /** Whether the Shade is fully expanded. */
+    /** Whether the Notifications Shade is fully expanded. */
     val isShadeFullyExpanded: Flow<Boolean>
 
-    /** Whether the Shade is fully collapsed. */
+    /** Whether Notifications Shade is expanded a non-zero amount. */
+    val isShadeAnyExpanded: StateFlow<Boolean>
+
+    /** Whether the Notifications Shade is fully collapsed. */
     val isShadeFullyCollapsed: Flow<Boolean>
 
     /**
@@ -102,7 +106,7 @@
      */
     val isAnyExpanded: StateFlow<Boolean>
 
-    /** The amount [0-1] that the shade has been opened. */
+    /** The amount [0-1] that the Notifications Shade has been opened. */
     val shadeExpansion: StateFlow<Float>
 
     /**
@@ -111,7 +115,7 @@
      */
     val qsExpansion: StateFlow<Float>
 
-    /** Whether Quick Settings is expanded a non-zero amount. */
+    /** Whether Quick Settings Shade is expanded a non-zero amount. */
     val isQsExpanded: StateFlow<Boolean>
 
     /**
@@ -142,16 +146,38 @@
     val isUserInteractingWithQs: Flow<Boolean>
 
     /**
-     * Triggers the expansion (opening) of the notification shade. If the notification shade is
-     * already open, this has no effect.
+     * Triggers the expansion (opening) of the notifications shade. If it is already expanded, this
+     * has no effect.
      */
-    fun expandNotificationShade(loggingReason: String)
+    fun expandNotificationsShade(loggingReason: String, transitionKey: TransitionKey? = null)
 
     /**
-     * Triggers the expansion (opening) of the quick settings shade. If the quick settings shade is
-     * already open, this has no effect.
+     * Triggers the expansion (opening) of the quick settings shade. If it is already expanded, this
+     * has no effect.
      */
-    fun expandQuickSettingsShade(loggingReason: String)
+    fun expandQuickSettingsShade(loggingReason: String, transitionKey: TransitionKey? = null)
+
+    /**
+     * Triggers the collapse (closing) of the notifications shade. If it is already collapsed, this
+     * has no effect.
+     */
+    fun collapseNotificationsShade(loggingReason: String, transitionKey: TransitionKey? = null)
+
+    /**
+     * Triggers the collapse (closing) of the quick settings shade. If it is already collapsed, this
+     * has no effect.
+     */
+    fun collapseQuickSettingsShade(
+        loggingReason: String,
+        transitionKey: TransitionKey? = null,
+        bypassNotificationsShade: Boolean = false,
+    )
+
+    /**
+     * Triggers the collapse (closing) of the notifications shade or quick settings shade, whichever
+     * is open. If both are already collapsed, this has no effect.
+     */
+    fun collapseEitherShade(loggingReason: String, transitionKey: TransitionKey? = null)
 }
 
 fun createAnyExpansionFlow(
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt
index fb14828..322fca3 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.shade.domain.interactor
 
+import com.android.compose.animation.scene.TransitionKey
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.shade.shared.model.ShadeMode
 import javax.inject.Inject
@@ -31,6 +32,7 @@
     override val isShadeEnabled: StateFlow<Boolean> = inactiveFlowBoolean
     override val isQsEnabled: StateFlow<Boolean> = inactiveFlowBoolean
     override val shadeExpansion: StateFlow<Float> = inactiveFlowFloat
+    override val isShadeAnyExpanded: StateFlow<Boolean> = inactiveFlowBoolean
     override val qsExpansion: StateFlow<Float> = inactiveFlowFloat
     override val isQsExpanded: StateFlow<Boolean> = inactiveFlowBoolean
     override val isQsBypassingShade: Flow<Boolean> = inactiveFlowBoolean
@@ -50,7 +52,17 @@
 
     override fun getTopEdgeSplitFraction(): Float = 0.5f
 
-    override fun expandNotificationShade(loggingReason: String) {}
+    override fun expandNotificationsShade(loggingReason: String, transitionKey: TransitionKey?) {}
 
-    override fun expandQuickSettingsShade(loggingReason: String) {}
+    override fun expandQuickSettingsShade(loggingReason: String, transitionKey: TransitionKey?) {}
+
+    override fun collapseNotificationsShade(loggingReason: String, transitionKey: TransitionKey?) {}
+
+    override fun collapseQuickSettingsShade(
+        loggingReason: String,
+        transitionKey: TransitionKey?,
+        bypassNotificationsShade: Boolean,
+    ) {}
+
+    override fun collapseEitherShade(loggingReason: String, transitionKey: TransitionKey?) {}
 }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt
index 3eab02a..949d2aa 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt
@@ -78,12 +78,16 @@
     override val isShadeFullyExpanded: Flow<Boolean> =
         baseShadeInteractor.shadeExpansion.map { it >= 1f }.distinctUntilChanged()
 
+    override val isShadeAnyExpanded: StateFlow<Boolean> =
+        baseShadeInteractor.shadeExpansion
+            .map { it > 0 }
+            .stateIn(scope, SharingStarted.Eagerly, false)
+
     override val isShadeFullyCollapsed: Flow<Boolean> =
         baseShadeInteractor.shadeExpansion.map { it <= 0f }.distinctUntilChanged()
 
     override val isUserInteracting: StateFlow<Boolean> =
         combine(isUserInteractingWithShade, isUserInteractingWithQs) { shade, qs -> shade || qs }
-            .distinctUntilChanged()
             .stateIn(scope, SharingStarted.Eagerly, false)
 
     override val isShadeTouchable: Flow<Boolean> =
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImpl.kt
index df09486..0902c39 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImpl.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.shade.domain.interactor
 
 import com.android.app.tracing.FlowTracing.traceAsCounter
+import com.android.compose.animation.scene.TransitionKey
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.keyguard.data.repository.KeyguardRepository
@@ -111,18 +112,40 @@
     override val isUserInteractingWithQs: Flow<Boolean> =
         userInteractingFlow(repository.legacyQsTracking, repository.qsExpansion)
 
-    override fun expandNotificationShade(loggingReason: String) {
+    override fun expandNotificationsShade(loggingReason: String, transitionKey: TransitionKey?) {
         throw UnsupportedOperationException(
             "expandNotificationShade() is not supported in legacy shade"
         )
     }
 
-    override fun expandQuickSettingsShade(loggingReason: String) {
+    override fun expandQuickSettingsShade(loggingReason: String, transitionKey: TransitionKey?) {
         throw UnsupportedOperationException(
             "expandQuickSettingsShade() is not supported in legacy shade"
         )
     }
 
+    override fun collapseNotificationsShade(loggingReason: String, transitionKey: TransitionKey?) {
+        throw UnsupportedOperationException(
+            "collapseNotificationShade() is not supported in legacy shade"
+        )
+    }
+
+    override fun collapseQuickSettingsShade(
+        loggingReason: String,
+        transitionKey: TransitionKey?,
+        bypassNotificationsShade: Boolean,
+    ) {
+        throw UnsupportedOperationException(
+            "collapseQuickSettingsShade() is not supported in legacy shade"
+        )
+    }
+
+    override fun collapseEitherShade(loggingReason: String, transitionKey: TransitionKey?) {
+        throw UnsupportedOperationException(
+            "collapseEitherShade() is not supported in legacy shade"
+        )
+    }
+
     /**
      * Return a flow for whether a user is interacting with an expandable shade component using
      * tracking and expansion flows. NOTE: expansion must be a `StateFlow` to guarantee that
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImpl.kt
index 81bf712..7658108 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImpl.kt
@@ -21,12 +21,16 @@
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.compose.animation.scene.OverlayKey
 import com.android.compose.animation.scene.SceneKey
+import com.android.compose.animation.scene.TransitionKey
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.scene.domain.interactor.SceneInteractor
 import com.android.systemui.scene.shared.flag.SceneContainerFlag
 import com.android.systemui.scene.shared.model.Overlays
+import com.android.systemui.scene.shared.model.SceneFamilies
 import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.scene.shared.model.TransitionKeys.Instant
+import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade
 import com.android.systemui.shade.shared.model.ShadeMode
 import com.android.systemui.utils.coroutines.flow.flatMapLatestConflated
 import javax.inject.Inject
@@ -133,43 +137,120 @@
             }
         }
 
-    override fun expandNotificationShade(loggingReason: String) {
+    override fun expandNotificationsShade(loggingReason: String, transitionKey: TransitionKey?) {
         if (shadeModeInteractor.isDualShade) {
             if (Overlays.QuickSettingsShade in sceneInteractor.currentOverlays.value) {
                 sceneInteractor.replaceOverlay(
                     from = Overlays.QuickSettingsShade,
                     to = Overlays.NotificationsShade,
                     loggingReason = loggingReason,
+                    transitionKey = transitionKey,
                 )
             } else {
                 sceneInteractor.showOverlay(
                     overlay = Overlays.NotificationsShade,
                     loggingReason = loggingReason,
+                    transitionKey = transitionKey,
                 )
             }
         } else {
-            sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = loggingReason)
+            sceneInteractor.changeScene(
+                toScene = Scenes.Shade,
+                loggingReason = loggingReason,
+                transitionKey =
+                    transitionKey ?: ToSplitShade.takeIf { shadeModeInteractor.isSplitShade },
+            )
         }
     }
 
-    override fun expandQuickSettingsShade(loggingReason: String) {
+    override fun expandQuickSettingsShade(loggingReason: String, transitionKey: TransitionKey?) {
         if (shadeModeInteractor.isDualShade) {
             if (Overlays.NotificationsShade in sceneInteractor.currentOverlays.value) {
                 sceneInteractor.replaceOverlay(
                     from = Overlays.NotificationsShade,
                     to = Overlays.QuickSettingsShade,
                     loggingReason = loggingReason,
+                    transitionKey = transitionKey,
                 )
             } else {
                 sceneInteractor.showOverlay(
                     overlay = Overlays.QuickSettingsShade,
                     loggingReason = loggingReason,
+                    transitionKey = transitionKey,
                 )
             }
         } else {
+            val isSplitShade = shadeModeInteractor.isSplitShade
             sceneInteractor.changeScene(
-                toScene = Scenes.QuickSettings,
+                toScene = if (isSplitShade) Scenes.Shade else Scenes.QuickSettings,
                 loggingReason = loggingReason,
+                transitionKey = transitionKey ?: ToSplitShade.takeIf { isSplitShade },
+            )
+        }
+    }
+
+    override fun collapseNotificationsShade(loggingReason: String, transitionKey: TransitionKey?) {
+        if (shadeModeInteractor.isDualShade) {
+            // TODO(b/356596436): Hide without animation if transitionKey is Instant.
+            sceneInteractor.hideOverlay(
+                overlay = Overlays.NotificationsShade,
+                loggingReason = loggingReason,
+                transitionKey = transitionKey,
+            )
+        } else if (transitionKey == Instant) {
+            // TODO(b/356596436): Define instant transition instead of snapToScene().
+            sceneInteractor.snapToScene(toScene = SceneFamilies.Home, loggingReason = loggingReason)
+        } else {
+            sceneInteractor.changeScene(
+                toScene = SceneFamilies.Home,
+                loggingReason = loggingReason,
+                transitionKey =
+                    transitionKey ?: ToSplitShade.takeIf { shadeModeInteractor.isSplitShade },
+            )
+        }
+    }
+
+    override fun collapseQuickSettingsShade(
+        loggingReason: String,
+        transitionKey: TransitionKey?,
+        bypassNotificationsShade: Boolean,
+    ) {
+        if (shadeModeInteractor.isDualShade) {
+            // TODO(b/356596436): Hide without animation if transitionKey is Instant.
+            sceneInteractor.hideOverlay(
+                overlay = Overlays.QuickSettingsShade,
+                loggingReason = loggingReason,
+                transitionKey = transitionKey,
+            )
+            return
+        }
+
+        val isSplitShade = shadeModeInteractor.isSplitShade
+        val targetScene =
+            if (bypassNotificationsShade || isSplitShade) SceneFamilies.Home else Scenes.Shade
+        if (transitionKey == Instant) {
+            // TODO(b/356596436): Define instant transition instead of snapToScene().
+            sceneInteractor.snapToScene(toScene = targetScene, loggingReason = loggingReason)
+        } else {
+            sceneInteractor.changeScene(
+                toScene = targetScene,
+                loggingReason = loggingReason,
+                transitionKey = transitionKey ?: ToSplitShade.takeIf { isSplitShade },
+            )
+        }
+    }
+
+    override fun collapseEitherShade(loggingReason: String, transitionKey: TransitionKey?) {
+        // Note: The notifications shade and QS shade may be both partially expanded simultaneously,
+        // so we don't use an 'else' clause here.
+        if (shadeExpansion.value > 0) {
+            collapseNotificationsShade(loggingReason = loggingReason, transitionKey = transitionKey)
+        }
+        if (isQsExpanded.value) {
+            collapseQuickSettingsShade(
+                loggingReason = loggingReason,
+                transitionKey = transitionKey,
+                bypassNotificationsShade = true,
             )
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorImpl.kt
index 0fb3790..ea76ac4b 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorImpl.kt
@@ -21,10 +21,9 @@
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.scene.domain.interactor.SceneInteractor
-import com.android.systemui.scene.shared.model.Overlays
 import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.scene.shared.model.TransitionKeys.Instant
 import com.android.systemui.shade.data.repository.ShadeRepository
-import com.android.systemui.shade.shared.model.ShadeMode
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
@@ -48,7 +47,7 @@
 
     @Deprecated("Use ShadeInteractor instead")
     override fun expandToNotifications() {
-        shadeInteractor.expandNotificationShade(
+        shadeInteractor.expandNotificationsShade(
             loggingReason = "ShadeLockscreenInteractorImpl.expandToNotifications"
         )
     }
@@ -71,17 +70,11 @@
     }
 
     override fun resetViews(animate: Boolean) {
-        val loggingReason = "ShadeLockscreenInteractorImpl.resetViews"
         // The existing comment to the only call to this claims it only calls it to collapse QS
-        if (shadeInteractor.shadeMode.value == ShadeMode.Dual) {
-            // TODO(b/356596436): Hide without animation if !animate.
-            sceneInteractor.hideOverlay(
-                overlay = Overlays.QuickSettingsShade,
-                loggingReason = loggingReason,
-            )
-        } else {
-            shadeInteractor.expandNotificationShade(loggingReason)
-        }
+        shadeInteractor.collapseQuickSettingsShade(
+            loggingReason = "ShadeLockscreenInteractorImpl.resetViews",
+            transitionKey = Instant.takeIf { !animate },
+        )
     }
 
     @Deprecated("Not supported by scenes")
@@ -93,7 +86,7 @@
         backgroundScope.launch {
             delay(delay)
             withContext(mainDispatcher) {
-                shadeInteractor.expandNotificationShade(
+                shadeInteractor.expandNotificationsShade(
                     "ShadeLockscreenInteractorImpl.transitionToExpandedShade"
                 )
             }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractor.kt
index caa4513..c838c37 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractor.kt
@@ -55,6 +55,10 @@
     val isDualShade: Boolean
         get() = shadeMode.value is ShadeMode.Dual
 
+    /** Convenience shortcut for querying whether the current [shadeMode] is [ShadeMode.Split]. */
+    val isSplitShade: Boolean
+        get() = shadeMode.value is ShadeMode.Split
+
     /**
      * The fraction between [0..1] (i.e., percentage) of screen width to consider the threshold
      * between "top-left" and "top-right" for the purposes of dual-shade invocation.
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt
index a154e91..bd4ed5b 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt
@@ -29,9 +29,7 @@
 import com.android.systemui.privacy.OngoingPrivacyChip
 import com.android.systemui.privacy.PrivacyItem
 import com.android.systemui.res.R
-import com.android.systemui.scene.domain.interactor.SceneInteractor
-import com.android.systemui.scene.shared.model.SceneFamilies
-import com.android.systemui.scene.shared.model.TransitionKeys
+import com.android.systemui.scene.shared.model.TransitionKeys.SlightlyFasterShadeCollapse
 import com.android.systemui.shade.domain.interactor.PrivacyChipInteractor
 import com.android.systemui.shade.domain.interactor.ShadeHeaderClockInteractor
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
@@ -55,9 +53,8 @@
 class ShadeHeaderViewModel
 @AssistedInject
 constructor(
-    private val context: Context,
+    context: Context,
     private val activityStarter: ActivityStarter,
-    private val sceneInteractor: SceneInteractor,
     private val shadeInteractor: ShadeInteractor,
     private val mobileIconsInteractor: MobileIconsInteractor,
     val mobileIconsViewModel: MobileIconsViewModel,
@@ -120,7 +117,7 @@
                         map = { intent, _ ->
                             intent.action == Intent.ACTION_TIMEZONE_CHANGED ||
                                 intent.action == Intent.ACTION_LOCALE_CHANGED
-                        }
+                        },
                     )
                     .onEach { invalidateFormats -> updateDateTexts(invalidateFormats) }
                     .launchIn(this)
@@ -152,10 +149,9 @@
 
     /** Notifies that the system icons container was clicked. */
     fun onSystemIconContainerClicked() {
-        sceneInteractor.changeScene(
-            SceneFamilies.Home,
-            "ShadeHeaderViewModel.onSystemIconContainerClicked",
-            TransitionKeys.SlightlyFasterShadeCollapse,
+        shadeInteractor.collapseEitherShade(
+            loggingReason = "ShadeHeaderViewModel.onSystemIconContainerClicked",
+            transitionKey = SlightlyFasterShadeCollapse,
         )
     }
 
@@ -163,7 +159,7 @@
     fun onShadeCarrierGroupClicked() {
         activityStarter.postStartActivityDismissingKeyguard(
             Intent(Settings.ACTION_WIRELESS_SETTINGS),
-            0
+            0,
         )
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActions.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActions.kt
new file mode 100644
index 0000000..e5f6846
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActions.kt
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2024 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.systemui.shade.ui.viewmodel
+
+import com.android.compose.animation.scene.Edge
+import com.android.compose.animation.scene.Swipe
+import com.android.compose.animation.scene.SwipeDirection
+import com.android.compose.animation.scene.UserAction
+import com.android.compose.animation.scene.UserActionResult
+import com.android.systemui.scene.shared.model.Overlays
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade
+import com.android.systemui.scene.ui.viewmodel.SceneContainerEdge
+
+/** Returns collection of [UserAction] to [UserActionResult] pairs for opening the single shade. */
+fun singleShadeActions(
+    requireTwoPointersForTopEdgeForQs: Boolean = false
+): Array<Pair<UserAction, UserActionResult>> {
+    val shadeUserActionResult = UserActionResult(Scenes.Shade, isIrreversible = true)
+    val qsSceneUserActionResult = UserActionResult(Scenes.QuickSettings, isIrreversible = true)
+    return arrayOf(
+        // Swiping down, not from the edge, always goes to shade.
+        Swipe.Down to shadeUserActionResult,
+        swipeDown(pointerCount = 2) to shadeUserActionResult,
+
+        // Swiping down from the top edge.
+        swipeDownFromTop(pointerCount = 1) to
+            if (requireTwoPointersForTopEdgeForQs) {
+                shadeUserActionResult
+            } else {
+                qsSceneUserActionResult
+            },
+        swipeDownFromTop(pointerCount = 2) to qsSceneUserActionResult,
+    )
+}
+
+/** Returns collection of [UserAction] to [UserActionResult] pairs for opening the split shade. */
+fun splitShadeActions(): Array<Pair<UserAction, UserActionResult>> {
+    val shadeUserActionResult = UserActionResult(Scenes.Shade, ToSplitShade, isIrreversible = true)
+    return arrayOf(
+        // Swiping down, not from the edge, always goes to shade.
+        Swipe.Down to shadeUserActionResult,
+        swipeDown(pointerCount = 2) to shadeUserActionResult,
+        // Swiping down from the top edge goes to QS.
+        swipeDownFromTop(pointerCount = 1) to shadeUserActionResult,
+        swipeDownFromTop(pointerCount = 2) to shadeUserActionResult,
+    )
+}
+
+/** Returns collection of [UserAction] to [UserActionResult] pairs for opening the dual shade. */
+fun dualShadeActions(): Array<Pair<UserAction, UserActionResult>> {
+    val notifShadeUserActionResult =
+        UserActionResult.ShowOverlay(Overlays.NotificationsShade, isIrreversible = true)
+    val qsShadeuserActionResult =
+        UserActionResult.ShowOverlay(Overlays.QuickSettingsShade, isIrreversible = true)
+    return arrayOf(
+        Swipe.Down to notifShadeUserActionResult,
+        Swipe(direction = SwipeDirection.Down, fromSource = SceneContainerEdge.TopRight) to
+            qsShadeuserActionResult,
+    )
+}
+
+private fun swipeDownFromTop(pointerCount: Int): Swipe {
+    return Swipe(SwipeDirection.Down, fromSource = Edge.Top, pointerCount = pointerCount)
+}
+
+private fun swipeDown(pointerCount: Int): Swipe {
+    return Swipe(SwipeDirection.Down, pointerCount = pointerCount)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModel.kt
index f8a850a..3113dc4 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModel.kt
@@ -16,11 +16,13 @@
 
 package com.android.systemui.shade.ui.viewmodel
 
+import com.android.app.tracing.coroutines.flow.map
 import com.android.compose.animation.scene.Swipe
 import com.android.compose.animation.scene.SwipeDirection
 import com.android.compose.animation.scene.UserAction
 import com.android.compose.animation.scene.UserActionResult
 import com.android.systemui.qs.ui.adapter.QSSceneAdapter
+import com.android.systemui.scene.domain.interactor.SceneBackInteractor
 import com.android.systemui.scene.shared.model.SceneFamilies
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade
@@ -30,6 +32,7 @@
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
 import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.filter
 
 /**
  * Models the UI state for the user actions that the user can perform to navigate to other scenes.
@@ -41,21 +44,25 @@
 constructor(
     private val qsSceneAdapter: QSSceneAdapter,
     private val shadeInteractor: ShadeInteractor,
+    private val sceneBackInteractor: SceneBackInteractor,
 ) : UserActionsViewModel() {
 
     override suspend fun hydrateActions(setActions: (Map<UserAction, UserActionResult>) -> Unit) {
         combine(
                 shadeInteractor.shadeMode,
                 qsSceneAdapter.isCustomizerShowing,
-            ) { shadeMode, isCustomizerShowing ->
+                sceneBackInteractor.backScene
+                    .filter { it != Scenes.Shade }
+                    .map { it ?: SceneFamilies.Home },
+            ) { shadeMode, isCustomizerShowing, backScene ->
                 buildMap<UserAction, UserActionResult> {
                     if (!isCustomizerShowing) {
                         set(
                             Swipe(SwipeDirection.Up),
                             UserActionResult(
-                                SceneFamilies.Home,
-                                ToSplitShade.takeIf { shadeMode is ShadeMode.Split }
-                            )
+                                backScene,
+                                ToSplitShade.takeIf { shadeMode is ShadeMode.Split },
+                            ),
                         )
                     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
index 7244f8a..a79b78f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
@@ -58,15 +58,18 @@
 import com.android.internal.statusbar.NotificationVisibility;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.systemui.Dumpable;
+import com.android.systemui.Flags;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.flags.FeatureFlagsClassic;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
 import com.android.systemui.recents.OverviewProxyService;
+import com.android.systemui.scene.shared.flag.SceneContainerFlag;
 import com.android.systemui.settings.UserTracker;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
@@ -286,6 +289,8 @@
     protected ContentObserver mLockscreenSettingsObserver;
     protected ContentObserver mSettingsObserver;
 
+    private final Lazy<DeviceUnlockedInteractor> mDeviceUnlockedInteractorLazy;
+
     @Inject
     public NotificationLockscreenUserManagerImpl(Context context,
             BroadcastDispatcher broadcastDispatcher,
@@ -305,7 +310,8 @@
             SecureSettings secureSettings,
             DumpManager dumpManager,
             LockPatternUtils lockPatternUtils,
-            FeatureFlagsClassic featureFlags) {
+            FeatureFlagsClassic featureFlags,
+            Lazy<DeviceUnlockedInteractor> deviceUnlockedInteractorLazy) {
         mContext = context;
         mMainExecutor = mainExecutor;
         mBackgroundExecutor = backgroundExecutor;
@@ -325,6 +331,7 @@
         mSecureSettings = secureSettings;
         mKeyguardStateController = keyguardStateController;
         mFeatureFlags = featureFlags;
+        mDeviceUnlockedInteractorLazy = deviceUnlockedInteractorLazy;
 
         mLockScreenUris.add(SHOW_LOCKSCREEN);
         mLockScreenUris.add(SHOW_PRIVATE_LOCKSCREEN);
@@ -748,8 +755,13 @@
         // camera on the keyguard has a state of SHADE but the keyguard is still showing.
         final boolean showingKeyguard = mState != StatusBarState.SHADE
                 || mKeyguardStateController.isShowing();
-        final boolean devicePublic = showingKeyguard && mKeyguardStateController.isMethodSecure();
-
+        final boolean devicePublic;
+        if (SceneContainerFlag.isEnabled()) {
+            devicePublic = !mDeviceUnlockedInteractorLazy.get()
+                    .getDeviceUnlockStatus().getValue().isUnlocked();
+        } else {
+            devicePublic = showingKeyguard && mKeyguardStateController.isMethodSecure();
+        }
 
         // Look for public mode users. Users are considered public in either case of:
         //   - device keyguard is shown in secure mode;
@@ -802,11 +814,17 @@
 
     private void notifyNotificationStateChanged() {
         if (!Looper.getMainLooper().isCurrentThread()) {
-            mMainExecutor.execute(() -> {
+            if (Flags.checkLockscreenGoneTransition()) {
                 for (NotificationStateChangedListener listener : mNotifStateChangedListeners) {
-                    listener.onNotificationStateChanged();
+                    mMainExecutor.execute(listener::onNotificationStateChanged);
                 }
-            });
+            } else {
+                mMainExecutor.execute(() -> {
+                    for (NotificationStateChangedListener listener : mNotifStateChangedListeners) {
+                        listener.onNotificationStateChanged();
+                    }
+                });
+            }
         } else {
             for (NotificationStateChangedListener listener : mNotifStateChangedListeners) {
                 listener.onNotificationStateChanged();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
index 8a6ec2a..73ad0e5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
@@ -37,6 +37,7 @@
 import androidx.annotation.NonNull;
 
 import com.android.app.animation.Interpolators;
+import com.android.compose.animation.scene.OverlayKey;
 import com.android.compose.animation.scene.SceneKey;
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
@@ -60,6 +61,7 @@
 import com.android.systemui.scene.domain.interactor.SceneContainerOcclusionInteractor;
 import com.android.systemui.scene.domain.interactor.SceneInteractor;
 import com.android.systemui.scene.shared.flag.SceneContainerFlag;
+import com.android.systemui.scene.shared.model.Overlays;
 import com.android.systemui.scene.shared.model.Scenes;
 import com.android.systemui.shade.domain.interactor.ShadeInteractor;
 import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
@@ -67,14 +69,12 @@
 import com.android.systemui.util.Compile;
 import com.android.systemui.util.kotlin.JavaAdapter;
 
-import com.google.common.base.Preconditions;
-
 import dagger.Lazy;
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Comparator;
-import java.util.Map;
+import java.util.Set;
 
 import javax.inject.Inject;
 
@@ -230,6 +230,7 @@
                     combineFlows(
                         mDeviceUnlockedInteractorLazy.get().getDeviceUnlockStatus(),
                         mSceneInteractorLazy.get().getCurrentScene(),
+                        mSceneInteractorLazy.get().getCurrentOverlays(),
                         mSceneBackInteractorLazy.get().getBackStack(),
                         mSceneContainerOcclusionInteractorLazy.get().getInvisibleDueToOcclusion(),
                         this::calculateStateFromSceneFramework),
@@ -271,7 +272,7 @@
      * Updates the {@link StatusBarState} and notifies registered listeners, if needed.
      */
     private void updateStateAndNotifyListeners(int state) {
-        if (state != mUpcomingState) {
+        if (state != mUpcomingState && !SceneContainerFlag.isEnabled()) {
             Log.d(TAG, "setState: requested state " + StatusBarState.toString(state)
                     + "!= upcomingState: " + StatusBarState.toString(mUpcomingState) + ". "
                     + "This usually means the status bar state transition was interrupted before "
@@ -690,19 +691,82 @@
     private int calculateStateFromSceneFramework(
             DeviceUnlockStatus deviceUnlockStatus,
             SceneKey currentScene,
+            Set<OverlayKey> currentOverlays,
             SceneStack backStack,
             boolean isOccluded) {
         SceneContainerFlag.isUnexpectedlyInLegacyMode();
-        if (currentScene.equals(Scenes.Lockscreen)) {
-            return StatusBarState.KEYGUARD;
-        } else if (currentScene.equals(Scenes.Shade)
-                && SceneStackKt.contains(backStack, Scenes.Lockscreen)) {
-            return StatusBarState.SHADE_LOCKED;
-        } else if (deviceUnlockStatus.isUnlocked() || isOccluded) {
-            return StatusBarState.SHADE;
+
+        final boolean onBouncer = currentScene.equals(Scenes.Bouncer);
+        final boolean onCommunal = currentScene.equals(Scenes.Communal);
+        final boolean onGone = currentScene.equals(Scenes.Gone);
+        final boolean onLockscreen = currentScene.equals(Scenes.Lockscreen);
+        final boolean onQuickSettings = currentScene.equals(Scenes.QuickSettings);
+        final boolean onShade = currentScene.equals(Scenes.Shade);
+
+        final boolean overCommunal = SceneStackKt.contains(backStack, Scenes.Communal);
+        final boolean overLockscreen = SceneStackKt.contains(backStack, Scenes.Lockscreen);
+        final boolean overShade = SceneStackKt.contains(backStack, Scenes.Shade);
+
+        final boolean overlaidShade = currentOverlays.contains(Overlays.NotificationsShade);
+        final boolean overlaidQuickSettings = currentOverlays.contains(Overlays.QuickSettingsShade);
+
+        final boolean isUnlocked = deviceUnlockStatus.isUnlocked();
+
+        final String inputLogString = "currentScene=" + currentScene.getTestTag()
+                + " currentOverlays=" + currentOverlays + " backStack=" + backStack
+                + " isUnlocked=" + isUnlocked + " isOccluded=" + isOccluded;
+
+        int newState;
+
+        // When the device unlocks, several things happen 'at once':
+        // 1. deviceUnlockStatus.isUnlocked changes from false to true.
+        // 2. Lockscreen changes to Gone, either in currentScene or in backStack.
+        // 3. Bouncer is removed from currentScene or backStack, if it was present.
+        //
+        // From this function's perspective, though, deviceUnlockStatus, currentScene, and backStack
+        // each update separately, and the relative order of those updates is not well-defined. This
+        // doesn't work well for clients of this class (like remote input) that expect the device to
+        // be fully and properly unlocked when the state changes to SHADE.
+        //
+        // Therefore, we consider the device to be in a keyguardish state (KEYGUARD or SHADE_LOCKED,
+        // but not SHADE) if *any* of these are still true:
+        // 1. deviceUnlockStatus.isUnlocked is false.
+        // 2. currentScene is a keyguardish scene (Lockscreen, Bouncer, or Communal).
+        // 3. backStack contains a keyguardish scene (Lockscreen or Communal).
+
+        final boolean onKeyguardish = onLockscreen || onBouncer || onCommunal;
+        final boolean overKeyguardish = overLockscreen || overCommunal;
+
+        if (isOccluded) {
+            // Occlusion is special; even though the device is still technically on the lockscreen,
+            // the UI behaves as if it is unlocked.
+            newState = StatusBarState.SHADE;
+        } else if (onKeyguardish || overKeyguardish) {
+            // We get here if we are on or over a keyguardish scene, even if isUnlocked is true; we
+            // want to return SHADE_LOCKED or KEYGUARD until we are also neither on nor over a
+            // keyguardish scene.
+            if (onShade || onQuickSettings || overShade || overlaidShade || overlaidQuickSettings) {
+                newState = StatusBarState.SHADE_LOCKED;
+            } else {
+                newState = StatusBarState.KEYGUARD;
+            }
+        } else if (isUnlocked || onGone) {
+            newState = StatusBarState.SHADE;
+        } else if (onShade || onQuickSettings) {
+            // We get here if deviceUnlockStatus.isUnlocked is false but we are no longer on or over
+            // a keyguardish scene; we want to return SHADE_LOCKED until isUnlocked is also true.
+            newState = StatusBarState.SHADE_LOCKED;
         } else {
-            return Preconditions.checkNotNull(sStatusBarStateByLockedSceneKey.get(currentScene));
+            throw new IllegalArgumentException(
+                    "unhandled input to calculateStateFromSceneFramework: " + inputLogString);
         }
+
+        if (Compile.IS_DEBUG) {
+            Log.v(TAG, "calculateStateFromSceneFramework: "
+                    + inputLogString + " -> " + StatusBarState.toString(newState));
+        }
+
+        return newState;
     }
 
     /** Notifies that the {@link StatusBarState} has changed to the given new state. */
@@ -716,15 +780,6 @@
         updateStateAndNotifyListeners(newState);
     }
 
-    private static final Map<SceneKey, Integer> sStatusBarStateByLockedSceneKey = Map.of(
-            Scenes.Lockscreen, StatusBarState.KEYGUARD,
-            Scenes.Bouncer, StatusBarState.KEYGUARD,
-            Scenes.Communal, StatusBarState.KEYGUARD,
-            Scenes.Shade, StatusBarState.SHADE_LOCKED,
-            Scenes.QuickSettings, StatusBarState.SHADE_LOCKED,
-            Scenes.Gone, StatusBarState.SHADE
-    );
-
     /**
      * For keeping track of our previous state to help with debugging
      */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java
index e3c47a4..321593b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java
@@ -596,7 +596,8 @@
             // NetworkCapabilities, but we need to convert it into TRANSPORT_WIFI in order to
             // distinguish it from VCN over Cellular.
             if (transportTypes[i] == NetworkCapabilities.TRANSPORT_CELLULAR
-                    && Utils.tryGetWifiInfoForVcn(networkCapabilities) != null) {
+                    && Utils.tryGetWifiInfoForVcn(mConnectivityManager, networkCapabilities)
+                            != null) {
                 transportTypes[i] = NetworkCapabilities.TRANSPORT_WIFI;
                 break;
             }
@@ -1112,7 +1113,9 @@
                     continue;
                 }
                 if (transportType == NetworkCapabilities.TRANSPORT_CELLULAR
-                        && Utils.tryGetWifiInfoForVcn(mLastDefaultNetworkCapabilities) != null) {
+                        && Utils.tryGetWifiInfoForVcn(
+                                        mConnectivityManager, mLastDefaultNetworkCapabilities)
+                                != null) {
                     mConnectedTransports.set(NetworkCapabilities.TRANSPORT_WIFI);
                     if (mLastDefaultNetworkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED)) {
                         mValidatedTransports.set(NetworkCapabilities.TRANSPORT_WIFI);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/CommandQueueInitializer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/CommandQueueInitializer.kt
new file mode 100644
index 0000000..57c8bc6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/CommandQueueInitializer.kt
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.core
+
+import android.app.StatusBarManager
+import android.content.Context
+import android.os.Binder
+import android.os.RemoteException
+import android.view.WindowInsets
+import com.android.internal.statusbar.IStatusBarService
+import com.android.internal.statusbar.RegisterStatusBarResult
+import com.android.systemui.CoreStartable
+import com.android.systemui.InitController
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.navigationbar.NavigationBarController
+import com.android.systemui.statusbar.CommandQueue
+import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore
+import dagger.Lazy
+import javax.inject.Inject
+
+@SysUISingleton
+class CommandQueueInitializer
+@Inject
+constructor(
+    private val context: Context,
+    private val commandQueue: CommandQueue,
+    private val commandQueueCallbacksLazy: Lazy<CommandQueue.Callbacks>,
+    private val statusBarModeRepository: StatusBarModeRepositoryStore,
+    private val initController: InitController,
+    private val barService: IStatusBarService,
+    private val navigationBarController: NavigationBarController,
+) : CoreStartable {
+
+    override fun start() {
+        StatusBarSimpleFragment.assertInNewMode()
+        val result: RegisterStatusBarResult =
+            try {
+                barService.registerStatusBar(commandQueue)
+            } catch (ex: RemoteException) {
+                ex.rethrowFromSystemServer()
+                return
+            }
+
+        createNavigationBar(result)
+
+        if ((result.mTransientBarTypes and WindowInsets.Type.statusBars()) != 0) {
+            statusBarModeRepository.defaultDisplay.showTransient()
+        }
+        val displayId = context.display.displayId
+        val commandQueueCallbacks = commandQueueCallbacksLazy.get()
+        commandQueueCallbacks.onSystemBarAttributesChanged(
+            displayId,
+            result.mAppearance,
+            result.mAppearanceRegions,
+            result.mNavbarColorManagedByIme,
+            result.mBehavior,
+            result.mRequestedVisibleTypes,
+            result.mPackageName,
+            result.mLetterboxDetails,
+        )
+
+        // StatusBarManagerService has a back up of IME token and it's restored here.
+        commandQueueCallbacks.setImeWindowStatus(
+            displayId,
+            result.mImeWindowVis,
+            result.mImeBackDisposition,
+            result.mShowImeSwitcher,
+        )
+
+        // Set up the initial icon state
+        val numIcons: Int = result.mIcons.size
+        for (i in 0 until numIcons) {
+            commandQueue.setIcon(result.mIcons.keyAt(i), result.mIcons.valueAt(i))
+        }
+
+        // set the initial view visibility
+        val disabledFlags1 = result.mDisabledFlags1
+        val disabledFlags2 = result.mDisabledFlags2
+        initController.addPostInitTask {
+            commandQueue.disable(displayId, disabledFlags1, disabledFlags2, /* animate= */ false)
+            try {
+                // NOTE(b/262059863): Force-update the disable flags after applying the flags
+                // returned from registerStatusBar(). The result's disabled flags may be stale
+                // if StatusBarManager's disabled flags are updated between registering the bar
+                // and this handling this post-init task. We force an update in this case, and use a
+                // new token to not conflict with any other disabled flags already requested by
+                // SysUI
+                val token = Binder()
+                barService.disable(StatusBarManager.DISABLE_HOME, token, context.packageName)
+                barService.disable(0, token, context.packageName)
+            } catch (ex: RemoteException) {
+                ex.rethrowFromSystemServer()
+            }
+        }
+    }
+
+    private fun createNavigationBar(result: RegisterStatusBarResult) {
+        navigationBarController.createNavigationBars(/* includeDefaultDisplay= */ true, result)
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarConntectedDisplays.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarConntectedDisplays.kt
new file mode 100644
index 0000000..54a18f7
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarConntectedDisplays.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.core
+
+import com.android.systemui.Flags
+import com.android.systemui.flags.FlagToken
+import com.android.systemui.flags.RefactorFlagUtils
+
+/** Helper for reading or using the status bar connected displays flag state. */
+@Suppress("NOTHING_TO_INLINE")
+object StatusBarConnectedDisplays {
+    /** The aconfig flag name */
+    const val FLAG_NAME = Flags.FLAG_STATUS_BAR_CONNECTED_DISPLAYS
+
+    /** A token used for dependency declaration */
+    val token: FlagToken
+        get() = FlagToken(FLAG_NAME, isEnabled)
+
+    /** Is the refactor enabled */
+    @JvmStatic
+    inline val isEnabled
+        get() = Flags.statusBarConnectedDisplays()
+
+    /**
+     * Called to ensure code is only run when the flag is enabled. This protects users from the
+     * unintended behaviors caused by accidentally running new logic, while also crashing on an eng
+     * build to ensure that the refactor author catches issues in testing.
+     */
+    @JvmStatic
+    inline fun isUnexpectedlyInLegacyMode() =
+        RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME)
+
+    /**
+     * Called to ensure code is only run when the flag is enabled. This will throw an exception if
+     * the flag is not enabled to ensure that the refactor author catches issues in testing.
+     * Caution!! Using this check incorrectly will cause crashes in nextfood builds!
+     */
+    @JvmStatic
+    inline fun assertInNewMode() = RefactorFlagUtils.assertInNewMode(isEnabled, FLAG_NAME)
+
+    /**
+     * Called to ensure code is only run when the flag is disabled. This will throw an exception if
+     * the flag is enabled to ensure that the refactor author catches issues in testing.
+     */
+    @JvmStatic
+    inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt
new file mode 100644
index 0000000..8bd990b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.core
+
+import android.view.View
+import com.android.systemui.CoreStartable
+import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.demomode.DemoModeController
+import com.android.systemui.plugins.DarkIconDispatcher
+import com.android.systemui.plugins.PluginDependencyProvider
+import com.android.systemui.plugins.statusbar.StatusBarStateController
+import com.android.systemui.power.domain.interactor.PowerInteractor
+import com.android.systemui.shade.NotificationShadeWindowViewController
+import com.android.systemui.shade.ShadeSurface
+import com.android.systemui.statusbar.AutoHideUiElement
+import com.android.systemui.statusbar.NotificationRemoteInputManager
+import com.android.systemui.statusbar.data.model.StatusBarMode
+import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore
+import com.android.systemui.statusbar.phone.AutoHideController
+import com.android.systemui.statusbar.phone.CentralSurfaces
+import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions
+import com.android.systemui.statusbar.phone.PhoneStatusBarViewController
+import com.android.systemui.statusbar.window.StatusBarWindowController
+import com.android.systemui.statusbar.window.data.model.StatusBarWindowState
+import com.android.systemui.statusbar.window.data.repository.StatusBarWindowStateRepositoryStore
+import com.android.wm.shell.bubbles.Bubbles
+import dagger.Lazy
+import java.io.PrintWriter
+import java.util.Optional
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.distinctUntilChangedBy
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.launch
+
+/**
+ * Class responsible for managing the lifecycle and state of the status bar.
+ *
+ * It is a temporary class, created to pull status bar related logic out of CentralSurfacesImpl. The
+ * plan is break it out into individual classes.
+ */
+@SysUISingleton
+class StatusBarOrchestrator
+@Inject
+constructor(
+    @Application private val applicationScope: CoroutineScope,
+    private val statusBarInitializer: StatusBarInitializer,
+    private val statusBarWindowController: StatusBarWindowController,
+    private val statusBarModeRepository: StatusBarModeRepositoryStore,
+    private val demoModeController: DemoModeController,
+    private val pluginDependencyProvider: PluginDependencyProvider,
+    private val autoHideController: AutoHideController,
+    private val remoteInputManager: NotificationRemoteInputManager,
+    private val notificationShadeWindowViewControllerLazy:
+    Lazy<NotificationShadeWindowViewController>,
+    private val shadeSurface: ShadeSurface,
+    private val bubblesOptional: Optional<Bubbles>,
+    private val statusBarWindowStateRepositoryStore: StatusBarWindowStateRepositoryStore,
+    powerInteractor: PowerInteractor,
+    primaryBouncerInteractor: PrimaryBouncerInteractor,
+) : CoreStartable {
+
+    private val phoneStatusBarViewController =
+        MutableStateFlow<PhoneStatusBarViewController?>(value = null)
+
+    private val phoneStatusBarTransitions =
+        MutableStateFlow<PhoneStatusBarTransitions?>(value = null)
+
+    private val shouldAnimateNextBarModeChange =
+        combine(
+            statusBarModeRepository.defaultDisplay.isTransientShown,
+            powerInteractor.isAwake,
+            statusBarWindowStateRepositoryStore.defaultDisplay.windowState,
+        ) { isTransientShown, isDeviceAwake, statusBarWindowState ->
+            !isTransientShown &&
+                isDeviceAwake &&
+                statusBarWindowState != StatusBarWindowState.Hidden
+        }
+
+    private val controllerAndBouncerShowing =
+        combine(
+            phoneStatusBarViewController.filterNotNull(),
+            primaryBouncerInteractor.isShowing,
+            ::Pair,
+        )
+
+    private val barTransitionsAndDeviceAsleep =
+        combine(phoneStatusBarTransitions.filterNotNull(), powerInteractor.isAsleep, ::Pair)
+
+    private val statusBarVisible =
+        combine(
+            statusBarModeRepository.defaultDisplay.statusBarMode,
+            statusBarWindowStateRepositoryStore.defaultDisplay.windowState,
+        ) { mode, statusBarWindowState ->
+            mode != StatusBarMode.LIGHTS_OUT &&
+                mode != StatusBarMode.LIGHTS_OUT_TRANSPARENT &&
+                statusBarWindowState != StatusBarWindowState.Hidden
+        }
+
+    private val barModeUpdate =
+        combine(
+                shouldAnimateNextBarModeChange,
+                phoneStatusBarTransitions.filterNotNull(),
+                statusBarModeRepository.defaultDisplay.statusBarMode,
+                ::Triple,
+            )
+            .distinctUntilChangedBy { (_, barTransitions, statusBarMode) ->
+                // We only want to collect when either bar transitions or status bar mode
+                // changed.
+                Pair(barTransitions, statusBarMode)
+            }
+
+    override fun start() {
+        StatusBarSimpleFragment.assertInNewMode()
+        applicationScope.launch {
+            launch {
+                controllerAndBouncerShowing.collect { (controller, bouncerShowing) ->
+                    setBouncerShowingForStatusBarComponents(controller, bouncerShowing)
+                }
+            }
+            launch {
+                barTransitionsAndDeviceAsleep.collect { (barTransitions, deviceAsleep) ->
+                    if (deviceAsleep) {
+                        barTransitions.finishAnimations()
+                    }
+                }
+            }
+            launch { statusBarVisible.collect { updateBubblesVisibility(it) } }
+            launch {
+                barModeUpdate.collect { (animate, barTransitions, statusBarMode) ->
+                    updateBarMode(animate, barTransitions, statusBarMode)
+                }
+            }
+        }
+        createAndAddWindow()
+        setupPluginDependencies()
+        setUpAutoHide()
+    }
+
+    private fun createAndAddWindow() {
+        initializeStatusBarFragment()
+        statusBarWindowController.attach()
+    }
+
+    private fun initializeStatusBarFragment() {
+        statusBarInitializer.statusBarViewUpdatedListener =
+            object : StatusBarInitializer.OnStatusBarViewUpdatedListener {
+                override fun onStatusBarViewUpdated(
+                    statusBarViewController: PhoneStatusBarViewController,
+                    statusBarTransitions: PhoneStatusBarTransitions,
+                ) {
+                    phoneStatusBarViewController.value = statusBarViewController
+                    phoneStatusBarTransitions.value = statusBarTransitions
+
+                    notificationShadeWindowViewControllerLazy
+                        .get()
+                        .setStatusBarViewController(statusBarViewController)
+                    // Ensure we re-propagate panel expansion values to the panel controller and
+                    // any listeners it may have, such as PanelBar. This will also ensure we
+                    // re-display the notification panel if necessary (for example, if
+                    // a heads-up notification was being displayed and should continue being
+                    // displayed).
+                    shadeSurface.updateExpansionAndVisibility()
+                }
+            }
+    }
+
+    private fun setupPluginDependencies() {
+        pluginDependencyProvider.allowPluginDependency(DarkIconDispatcher::class.java)
+        pluginDependencyProvider.allowPluginDependency(StatusBarStateController::class.java)
+    }
+
+    private fun setUpAutoHide() {
+        autoHideController.setStatusBar(
+            object : AutoHideUiElement {
+                override fun synchronizeState() {}
+
+                override fun shouldHideOnTouch(): Boolean {
+                    return !remoteInputManager.isRemoteInputActive
+                }
+
+                override fun isVisible(): Boolean {
+                    return statusBarModeRepository.defaultDisplay.isTransientShown.value
+                }
+
+                override fun hide() {
+                    statusBarModeRepository.defaultDisplay.clearTransient()
+                }
+            })
+    }
+
+    private fun updateBarMode(
+        animate: Boolean,
+        barTransitions: PhoneStatusBarTransitions,
+        barMode: StatusBarMode,
+    ) {
+        if (!demoModeController.isInDemoMode) {
+            barTransitions.transitionTo(barMode.toTransitionModeInt(), animate)
+        }
+        autoHideController.touchAutoHide()
+    }
+
+    private fun updateBubblesVisibility(statusBarVisible: Boolean) {
+        bubblesOptional.ifPresent { bubbles: Bubbles ->
+            bubbles.onStatusBarVisibilityChanged(statusBarVisible)
+        }
+    }
+
+    private fun setBouncerShowingForStatusBarComponents(
+        controller: PhoneStatusBarViewController,
+        bouncerShowing: Boolean,
+    ) {
+        val importance =
+            if (bouncerShowing) {
+                View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
+            } else {
+                View.IMPORTANT_FOR_ACCESSIBILITY_AUTO
+            }
+        controller.setImportantForAccessibility(importance)
+    }
+
+    override fun dump(pw: PrintWriter, args: Array<out String>) {
+        pw.println(statusBarWindowStateRepositoryStore.defaultDisplay.windowState.value)
+        CentralSurfaces.dumpBarTransitions(
+            pw,
+            "PhoneStatusBarTransitions",
+            phoneStatusBarTransitions.value,
+        )
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt
index 3903ff3..cf238d5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt
@@ -46,6 +46,7 @@
  */
 @Module(includes = [StatusBarDataLayerModule::class, SystemBarUtilsProxyImpl.Module::class])
 abstract class StatusBarModule {
+
     @Binds
     @IntoMap
     @ClassKey(OngoingCallController::class)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt
index 97add30..a24f267 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt
@@ -91,7 +91,6 @@
 constructor(
         private val context: Context,
         private val featureFlags: FeatureFlags,
-        private val smartspaceManager: SmartspaceManager?,
         private val activityStarter: ActivityStarter,
         private val falsingManager: FalsingManager,
         private val systemClock: SystemClock,
@@ -124,6 +123,7 @@
         private const val MAX_RECENT_SMARTSPACE_DATA_FOR_DUMP = 5
     }
 
+    private var userSmartspaceManager: SmartspaceManager? = null
     private var session: SmartspaceSession? = null
     private val datePlugin: BcSmartspaceDataPlugin? = optionalDatePlugin.orElse(null)
     private val weatherPlugin: BcSmartspaceDataPlugin? = optionalWeatherPlugin.orElse(null)
@@ -461,7 +461,11 @@
     }
 
     private fun connectSession() {
-        if (smartspaceManager == null) return
+        if (userSmartspaceManager == null) {
+            userSmartspaceManager =
+                userTracker.userContext.getSystemService(SmartspaceManager::class.java)
+        }
+        if (userSmartspaceManager == null) return
         if (datePlugin == null && weatherPlugin == null && plugin == null) return
         if (session != null || smartspaceViews.isEmpty()) {
             return
@@ -474,12 +478,14 @@
             return
         }
 
-        val newSession = smartspaceManager.createSmartspaceSession(
-                SmartspaceConfig.Builder(
-                        context, BcSmartspaceDataPlugin.UI_SURFACE_LOCK_SCREEN_AOD).build())
+        val newSession = userSmartspaceManager?.createSmartspaceSession(
+            SmartspaceConfig.Builder(
+                userTracker.userContext, BcSmartspaceDataPlugin.UI_SURFACE_LOCK_SCREEN_AOD
+            ).build()
+        )
         Log.d(TAG, "Starting smartspace session for " +
                 BcSmartspaceDataPlugin.UI_SURFACE_LOCK_SCREEN_AOD)
-        newSession.addOnTargetsAvailableListener(uiExecutor, sessionListener)
+        newSession?.addOnTargetsAvailableListener(uiExecutor, sessionListener)
         this.session = newSession
 
         deviceProvisionedController.removeCallback(deviceProvisionedListener)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/HeadsUpManagerPhone.java
index 1c840e0..fb42bad 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/HeadsUpManagerPhone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/HeadsUpManagerPhone.java
@@ -103,7 +103,8 @@
     private boolean mTrackingHeadsUp;
     private final HashSet<String> mSwipedOutKeys = new HashSet<>();
     private final HashSet<NotificationEntry> mEntriesToRemoveAfterExpand = new HashSet<>();
-    private final ArraySet<NotificationEntry> mEntriesToRemoveWhenReorderingAllowed
+    @VisibleForTesting
+    public final ArraySet<NotificationEntry> mEntriesToRemoveWhenReorderingAllowed
             = new ArraySet<>();
     private boolean mIsShadeOrQsExpanded;
     private boolean mIsQsExpanded;
@@ -630,11 +631,8 @@
             super.setEntry(entry, removeRunnable);
 
             if (NotificationThrottleHun.isEnabled()) {
-                if (!mVisualStabilityProvider.isReorderingAllowed()
-                        // We don't want to allow reordering while pulsing, but headsup need to
-                        // time out anyway
-                        && !entry.showingPulsing()) {
-                    mEntriesToRemoveWhenReorderingAllowed.add(entry);
+                mEntriesToRemoveWhenReorderingAllowed.add(entry);
+                if (!mVisualStabilityProvider.isReorderingAllowed()) {
                     entry.setSeenInShade(true);
                 }
             }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.java
deleted file mode 100644
index ec3c7d0..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2018 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.systemui.statusbar.notification;
-
-import android.content.Intent;
-import android.view.View;
-
-import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
-
-/**
- * Component responsible for handling actions on a notification which cause activites to start.
- * (e.g. clicking on a notification, tapping on the settings icon in the notification guts)
- */
-public interface NotificationActivityStarter {
-    /** Called when the user clicks on the notification bubble icon. */
-    void onNotificationBubbleIconClicked(NotificationEntry entry);
-
-    /** Called when the user clicks on the surface of a notification. */
-    void onNotificationClicked(NotificationEntry entry, ExpandableNotificationRow row);
-
-    /** Called when the user clicks on a button in the notification guts which fires an intent. */
-    void startNotificationGutsIntent(Intent intent, int appUid,
-            ExpandableNotificationRow row);
-
-    /** Called when the user clicks "Manage" or "History" in the Shade. */
-    void startHistoryIntent(View view, boolean showHistory);
-
-    /** Called when the user succeed to drop notification to proper target view. */
-    void onDragSuccess(NotificationEntry entry);
-
-    default boolean isCollapsingToShowActivityOverLockscreen() {
-        return false;
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.kt
new file mode 100644
index 0000000..231a0b0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.kt
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.notification
+
+import android.content.Intent
+import android.provider.Settings.ACTION_AUTOMATIC_ZEN_RULE_SETTINGS
+import android.provider.Settings.ACTION_NOTIFICATION_HISTORY
+import android.provider.Settings.ACTION_NOTIFICATION_SETTINGS
+import android.provider.Settings.ACTION_ZEN_MODE_SETTINGS
+import android.provider.Settings.EXTRA_AUTOMATIC_ZEN_RULE_ID
+import android.view.View
+import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
+
+/**
+ * Component responsible for handling actions on a notification which cause activites to start.
+ * (e.g. clicking on a notification, tapping on the settings icon in the notification guts)
+ */
+interface NotificationActivityStarter {
+
+    /** Called when the user clicks on the notification bubble icon. */
+    fun onNotificationBubbleIconClicked(entry: NotificationEntry?)
+
+    /** Called when the user clicks on the surface of a notification. */
+    fun onNotificationClicked(entry: NotificationEntry?, row: ExpandableNotificationRow?)
+
+    /** Called when the user clicks on a button in the notification guts which fires an intent. */
+    fun startNotificationGutsIntent(intent: Intent?, appUid: Int, row: ExpandableNotificationRow?)
+
+    /**
+     * Called when the user clicks "Manage" or "History" in the Shade. Prefer using
+     * [startSettingsIntent] instead.
+     */
+    fun startHistoryIntent(view: View?, showHistory: Boolean)
+
+    /**
+     * Called to open a settings intent from a launchable view (such as the "Manage" or "History"
+     * button in the shade, or the "No notifications" text).
+     *
+     * @param view the view to perform the launch animation from (must extend [LaunchableView])
+     * @param intentInfo information about the (settings) intent to be launched
+     */
+    fun startSettingsIntent(view: View, intentInfo: SettingsIntent)
+
+    /** Called when the user succeed to drop notification to proper target view. */
+    fun onDragSuccess(entry: NotificationEntry?)
+
+    val isCollapsingToShowActivityOverLockscreen: Boolean
+        get() = false
+
+    /**
+     * Information about a settings intent to be launched.
+     *
+     * If the [targetIntent] is T and [backStack] is [A, B, C], the stack will look like
+     * [A, B, C, T].
+     */
+    data class SettingsIntent(
+        var targetIntent: Intent,
+        var backStack: List<Intent> = emptyList(),
+        var cujType: Int? = null,
+    ) {
+        // Utility factory methods for known intents
+        companion object {
+            fun forNotificationSettings(cujType: Int? = null) =
+                SettingsIntent(
+                    targetIntent = Intent(ACTION_NOTIFICATION_SETTINGS),
+                    cujType = cujType,
+                )
+
+            fun forNotificationHistory(cujType: Int? = null) =
+                SettingsIntent(
+                    targetIntent = Intent(ACTION_NOTIFICATION_HISTORY),
+                    backStack = listOf(Intent(ACTION_NOTIFICATION_SETTINGS)),
+                    cujType = cujType,
+                )
+
+            fun forModesSettings(cujType: Int? = null) =
+                SettingsIntent(targetIntent = Intent(ACTION_ZEN_MODE_SETTINGS), cujType = cujType)
+
+            fun forModeSettings(modeId: String, cujType: Int? = null) =
+                SettingsIntent(
+                    targetIntent =
+                        Intent(ACTION_AUTOMATIC_ZEN_RULE_SETTINGS)
+                            .putExtra(EXTRA_AUTOMATIC_ZEN_RULE_ID, modeId),
+                    backStack = listOf(Intent(ACTION_ZEN_MODE_SETTINGS)),
+                    cujType = cujType,
+                )
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManager.kt
index b342722..b67092c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManager.kt
@@ -22,7 +22,7 @@
 import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NOTIFICATIONS_USE_PEOPLE_FILTERING
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.statusbar.notification.collection.NotificationClassificationFlag
-import com.android.systemui.statusbar.notification.shared.NotificationMinimalismPrototype
+import com.android.systemui.statusbar.notification.shared.NotificationMinimalism
 import com.android.systemui.statusbar.notification.shared.PriorityPeopleSection
 import com.android.systemui.statusbar.notification.stack.BUCKET_ALERTING
 import com.android.systemui.statusbar.notification.stack.BUCKET_FOREGROUND_SERVICE
@@ -54,7 +54,7 @@
     fun getNotificationBuckets(): IntArray {
         if (
             PriorityPeopleSection.isEnabled ||
-                NotificationMinimalismPrototype.isEnabled ||
+                NotificationMinimalism.isEnabled ||
                 NotificationClassificationFlag.isEnabled
         ) {
             // We don't need this list to be adaptive, it can be the superset of all features.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/OWNERS b/packages/SystemUI/src/com/android/systemui/statusbar/notification/OWNERS
index 5558ab1..0a7f08d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/OWNERS
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/OWNERS
@@ -2,11 +2,13 @@
 
 # Bug component: 78010
 
-aioana@google.com
-aroederer@google.com
-iyz@google.com
 jeffdq@google.com
 juliacr@google.com
+
+aioana@google.com
+aroederer@google.com
+asc@google.com
+iyz@google.com
 juliatuttle@google.com
 kurucz@google.com
 liuyining@google.com
@@ -15,4 +17,4 @@
 valiiftime@google.com
 yurilin@google.com
 
-per-file MediaNotificationProcessor.java = ethibodeau@google.com, asc@google.com
+per-file MediaNotificationProcessor.java = ethibodeau@google.com
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
index cb133ec..e74ed8d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
@@ -68,11 +68,9 @@
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRowController;
 import com.android.systemui.statusbar.notification.row.NotificationGuts;
-import com.android.systemui.statusbar.notification.row.data.repository.NotificationRowRepository;
 import com.android.systemui.statusbar.notification.row.shared.HeadsUpStatusBarModel;
 import com.android.systemui.statusbar.notification.row.shared.NotificationContentModel;
 import com.android.systemui.statusbar.notification.row.shared.NotificationRowContentBinderRefactor;
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel;
 import com.android.systemui.statusbar.notification.stack.PriorityBucket;
 import com.android.systemui.util.ListenerSet;
 
@@ -99,7 +97,7 @@
  * At the moment, there are many things here that shouldn't be and vice-versa. Hopefully we can
  * clean this up in the future.
  */
-public final class NotificationEntry extends ListEntry implements NotificationRowRepository {
+public final class NotificationEntry extends ListEntry {
 
     private final String mKey;
     private StatusBarNotification mSbn;
@@ -161,8 +159,6 @@
             StateFlowKt.MutableStateFlow(null);
     private final MutableStateFlow<CharSequence> mHeadsUpStatusBarTextPublic =
             StateFlowKt.MutableStateFlow(null);
-    private final MutableStateFlow<RichOngoingContentModel> mRichOngoingContentModel =
-            StateFlowKt.MutableStateFlow(null);
 
     // indicates when this entry's view was first attached to a window
     // this value will reset when the view is completely removed from the shade (ie: filtered out)
@@ -969,12 +965,6 @@
         return mHeadsUpStatusBarTextPublic;
     }
 
-    /** Gets the current RON content model, which may be null */
-    @NonNull
-    public StateFlow<RichOngoingContentModel> getRichOngoingContentModel() {
-        return mRichOngoingContentModel;
-    }
-
     /**
      * Sets the text to be displayed on the StatusBar, when this notification is the top pinned
      * heads up, and its content is sensitive right now.
@@ -1069,7 +1059,6 @@
         HeadsUpStatusBarModel headsUpStatusBarModel = contentModel.getHeadsUpStatusBarModel();
         this.mHeadsUpStatusBarText.setValue(headsUpStatusBarModel.getPrivateText());
         this.mHeadsUpStatusBarTextPublic.setValue(headsUpStatusBarModel.getPublicText());
-        this.mRichOngoingContentModel.setValue(contentModel.getRichOngoingContentModel());
     }
 
     /** Information about a suggestion that is being edited. */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinator.kt
index a621b2a..4e63b92 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinator.kt
@@ -35,7 +35,7 @@
 import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
 import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor
 import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor
-import com.android.systemui.statusbar.notification.shared.NotificationMinimalismPrototype
+import com.android.systemui.statusbar.notification.shared.NotificationMinimalism
 import com.android.systemui.statusbar.notification.stack.BUCKET_TOP_ONGOING
 import com.android.systemui.statusbar.notification.stack.BUCKET_TOP_UNSEEN
 import com.android.systemui.util.asIndenting
@@ -77,7 +77,7 @@
     private var unseenFilterEnabled = false
 
     override fun attach(pipeline: NotifPipeline) {
-        if (NotificationMinimalismPrototype.isUnexpectedlyInLegacyMode()) {
+        if (NotificationMinimalism.isUnexpectedlyInLegacyMode()) {
             return
         }
         pipeline.addPromoter(unseenNotifPromoter)
@@ -129,26 +129,25 @@
             }
     }
 
-    private fun unseenFeatureEnabled(): Flow<Boolean> {
-        // TODO(b/330387368): create LOCK_SCREEN_NOTIFICATION_MINIMALISM setting to use here?
-        //  Or should we actually just repurpose using the existing setting?
-        if (NotificationMinimalismPrototype.isEnabled) {
-            return flowOf(true)
+    private fun minimalismFeatureSettingEnabled(): Flow<Boolean> {
+        if (!NotificationMinimalism.isEnabled) {
+            return flowOf(false)
         }
-        return seenNotificationsInteractor.isLockScreenShowOnlyUnseenNotificationsEnabled()
+        return seenNotificationsInteractor.isLockScreenNotificationMinimalismEnabled()
     }
 
     private suspend fun trackUnseenFilterSettingChanges() {
-        unseenFeatureEnabled().collectLatest { isSettingEnabled ->
+        // Only filter the seen notifs when the lock screen minimalism feature settings is on.
+        minimalismFeatureSettingEnabled().collectLatest { isMinimalismSettingEnabled ->
             // update local field and invalidate if necessary
-            if (isSettingEnabled != unseenFilterEnabled) {
-                unseenFilterEnabled = isSettingEnabled
+            if (isMinimalismSettingEnabled != unseenFilterEnabled) {
+                unseenFilterEnabled = isMinimalismSettingEnabled
                 unseenNotifications.clear()
                 unseenNotifPromoter.invalidateList("unseen setting changed")
             }
             // if the setting is enabled, then start tracking and filtering unseen notifications
-            logger.logTrackingUnseen(isSettingEnabled)
-            if (isSettingEnabled) {
+            logger.logTrackingUnseen(isMinimalismSettingEnabled)
+            if (isMinimalismSettingEnabled) {
                 trackSeenNotifications()
             }
         }
@@ -178,7 +177,7 @@
         }
 
     private fun pickOutTopUnseenNotifs(list: List<ListEntry>) {
-        if (NotificationMinimalismPrototype.isUnexpectedlyInLegacyMode()) return
+        if (NotificationMinimalism.isUnexpectedlyInLegacyMode()) return
         if (!unseenFilterEnabled) return
         // Only ever elevate a top unseen notification on keyguard, not even locked shade
         if (statusBarStateController.state != StatusBarState.KEYGUARD) {
@@ -215,9 +214,9 @@
         object : NotifPromoter(TAG) {
             override fun shouldPromoteToTopLevel(child: NotificationEntry): Boolean =
                 when {
-                    NotificationMinimalismPrototype.isUnexpectedlyInLegacyMode() -> false
+                    NotificationMinimalism.isUnexpectedlyInLegacyMode() -> false
                     seenNotificationsInteractor.isTopOngoingNotification(child) -> true
-                    !NotificationMinimalismPrototype.ungroupTopUnseen -> false
+                    !NotificationMinimalism.ungroupTopUnseen -> false
                     else -> seenNotificationsInteractor.isTopUnseenNotification(child)
                 }
         }
@@ -225,7 +224,7 @@
     val topOngoingSectioner =
         object : NotifSectioner("TopOngoing", BUCKET_TOP_ONGOING) {
             override fun isInSection(entry: ListEntry): Boolean {
-                if (NotificationMinimalismPrototype.isUnexpectedlyInLegacyMode()) return false
+                if (NotificationMinimalism.isUnexpectedlyInLegacyMode()) return false
                 return entry.anyEntry { notificationEntry ->
                     seenNotificationsInteractor.isTopOngoingNotification(notificationEntry)
                 }
@@ -235,7 +234,7 @@
     val topUnseenSectioner =
         object : NotifSectioner("TopUnseen", BUCKET_TOP_UNSEEN) {
             override fun isInSection(entry: ListEntry): Boolean {
-                if (NotificationMinimalismPrototype.isUnexpectedlyInLegacyMode()) return false
+                if (NotificationMinimalism.isUnexpectedlyInLegacyMode()) return false
                 return entry.anyEntry { notificationEntry ->
                     seenNotificationsInteractor.isTopUnseenNotification(notificationEntry)
                 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinatorLogger.kt
index e44a77c..a4fa729 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinatorLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinatorLogger.kt
@@ -34,7 +34,10 @@
             TAG,
             LogLevel.DEBUG,
             messageInitializer = { bool1 = trackingUnseen },
-            messagePrinter = { "${if (bool1) "Start" else "Stop"} tracking unseen notifications." },
+            messagePrinter = {
+                "${if (bool1) "Start" else "Stop"} " +
+                    "tracking unseen notifications because of settings change."
+            },
         )
 
     fun logShadeVisible(numUnseen: Int) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinator.java
index 0bbde21..82ce31b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinator.java
@@ -25,7 +25,6 @@
 import androidx.annotation.NonNull;
 
 import com.android.internal.statusbar.IStatusBarService;
-import com.android.systemui.Flags;
 import com.android.systemui.media.controls.util.MediaFeatureFlag;
 import com.android.systemui.statusbar.notification.InflationException;
 import com.android.systemui.statusbar.notification.collection.NotifPipeline;
@@ -61,8 +60,27 @@
                 return false;
             }
 
-            if (!Flags.notificationsBackgroundIcons()) {
-                inflateOrUpdateIcons(entry);
+            switch (mIconsState.getOrDefault(entry, STATE_ICONS_UNINFLATED)) {
+                case STATE_ICONS_UNINFLATED:
+                    try {
+                        mIconManager.createIcons(entry);
+                        mIconsState.put(entry, STATE_ICONS_INFLATED);
+                    } catch (InflationException e) {
+                        reportInflationError(entry, e);
+                        mIconsState.put(entry, STATE_ICONS_ERROR);
+                    }
+                    break;
+                case STATE_ICONS_INFLATED:
+                    try {
+                        mIconManager.updateIcons(entry, /* usingCache = */ false);
+                    } catch (InflationException e) {
+                        reportInflationError(entry, e);
+                        mIconsState.put(entry, STATE_ICONS_ERROR);
+                    }
+                    break;
+                case STATE_ICONS_ERROR:
+                    // do nothing
+                    break;
             }
 
             return true;
@@ -72,19 +90,7 @@
     private final NotifCollectionListener mCollectionListener = new NotifCollectionListener() {
         @Override
         public void onEntryInit(@NonNull NotificationEntry entry) {
-            // We default to STATE_ICONS_UNINFLATED anyway, so there's no need to initialize it.
-            if (!Flags.notificationsBackgroundIcons()) {
-                mIconsState.put(entry, STATE_ICONS_UNINFLATED);
-            }
-        }
-
-        @Override
-        public void onEntryAdded(@NonNull NotificationEntry entry) {
-            if (Flags.notificationsBackgroundIcons()) {
-                if (isMediaNotification(entry.getSbn())) {
-                    inflateOrUpdateIcons(entry);
-                }
-            }
+            mIconsState.put(entry, STATE_ICONS_UNINFLATED);
         }
 
         @Override
@@ -93,12 +99,6 @@
                 // The update may have fixed the inflation error, so give it another chance.
                 mIconsState.put(entry, STATE_ICONS_UNINFLATED);
             }
-
-            if (Flags.notificationsBackgroundIcons()) {
-                if (isMediaNotification(entry.getSbn())) {
-                    inflateOrUpdateIcons(entry);
-                }
-            }
         }
 
         @Override
@@ -107,31 +107,6 @@
         }
     };
 
-    private void inflateOrUpdateIcons(NotificationEntry entry) {
-        switch (mIconsState.getOrDefault(entry, STATE_ICONS_UNINFLATED)) {
-            case STATE_ICONS_UNINFLATED:
-                try {
-                    mIconManager.createIcons(entry);
-                    mIconsState.put(entry, STATE_ICONS_INFLATED);
-                } catch (InflationException e) {
-                    reportInflationError(entry, e);
-                    mIconsState.put(entry, STATE_ICONS_ERROR);
-                }
-                break;
-            case STATE_ICONS_INFLATED:
-                try {
-                    mIconManager.updateIcons(entry, /* usingCache = */ false);
-                } catch (InflationException e) {
-                    reportInflationError(entry, e);
-                    mIconsState.put(entry, STATE_ICONS_ERROR);
-                }
-                break;
-            case STATE_ICONS_ERROR:
-                // do nothing
-                break;
-        }
-    }
-
     private void reportInflationError(NotificationEntry entry, Exception e) {
         // This is the same logic as in PreparationCoordinator; it doesn't handle media
         // notifications when the media feature is enabled since they aren't displayed in the shade,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt
index 73ce48b..96c260b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt
@@ -25,7 +25,7 @@
 import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
 import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider
-import com.android.systemui.statusbar.notification.shared.NotificationMinimalismPrototype
+import com.android.systemui.statusbar.notification.shared.NotificationMinimalism
 import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor
 import com.android.systemui.statusbar.notification.shared.PriorityPeopleSection
 import javax.inject.Inject
@@ -88,11 +88,10 @@
         mCoordinators.add(hideLocallyDismissedNotifsCoordinator)
         mCoordinators.add(hideNotifsForOtherUsersCoordinator)
         mCoordinators.add(keyguardCoordinator)
-        if (NotificationMinimalismPrototype.isEnabled) {
+        if (NotificationMinimalism.isEnabled) {
             mCoordinators.add(lockScreenMinimalismCoordinator)
-        } else {
-            mCoordinators.add(unseenKeyguardCoordinator)
         }
+        mCoordinators.add(unseenKeyguardCoordinator)
         mCoordinators.add(rankingCoordinator)
         mCoordinators.add(colorizedFgsCoordinator)
         mCoordinators.add(deviceProvisionedCoordinator)
@@ -125,11 +124,11 @@
         }
 
         // Manually add Ordered Sections
-        if (NotificationMinimalismPrototype.isEnabled) {
+        if (NotificationMinimalism.isEnabled) {
             mOrderedSections.add(lockScreenMinimalismCoordinator.topOngoingSectioner) // Top Ongoing
         }
         mOrderedSections.add(headsUpCoordinator.sectioner) // HeadsUp
-        if (NotificationMinimalismPrototype.isEnabled) {
+        if (NotificationMinimalism.isEnabled) {
             mOrderedSections.add(lockScreenMinimalismCoordinator.topUnseenSectioner) // Top Unseen
         }
         mOrderedSections.add(colorizedFgsCoordinator.sectioner) // ForegroundService
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/OriginalUnseenKeyguardCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/OriginalUnseenKeyguardCoordinator.kt
index bfea2ba..cf1329c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/OriginalUnseenKeyguardCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/OriginalUnseenKeyguardCoordinator.kt
@@ -35,7 +35,6 @@
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter
 import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
 import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor
-import com.android.systemui.statusbar.notification.shared.NotificationMinimalismPrototype
 import com.android.systemui.statusbar.policy.HeadsUpManager
 import com.android.systemui.statusbar.policy.headsUpEvents
 import com.android.systemui.util.asIndenting
@@ -51,7 +50,6 @@
 import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.launch
@@ -87,7 +85,6 @@
     private var unseenFilterEnabled = false
 
     override fun attach(pipeline: NotifPipeline) {
-        NotificationMinimalismPrototype.assertInLegacyMode()
         pipeline.addFinalizeFilter(unseenNotifFilter)
         pipeline.addCollectionListener(collectionListener)
         scope.launch { trackUnseenFilterSettingChanges() }
@@ -253,10 +250,6 @@
     }
 
     private fun unseenFeatureEnabled(): Flow<Boolean> {
-        if (NotificationMinimalismPrototype.isEnabled) {
-            // TODO(b/330387368): should this really just be turned off? If so, hide the setting.
-            return flowOf(false)
-        }
         return seenNotificationsInteractor.isLockScreenShowOnlyUnseenNotificationsEnabled()
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RemoteInputCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RemoteInputCoordinator.kt
index fe59d73..1fe32c9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RemoteInputCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RemoteInputCoordinator.kt
@@ -45,17 +45,16 @@
 
 /**
  * How long to wait before auto-dismissing a notification that was kept for active remote input, and
- * has now sent a remote input. We auto-dismiss, because the app may not cannot cancel
- * these given that they technically don't exist anymore. We wait a bit in case the app issues
- * an update, and to also give the other lifetime extenders a beat to decide they want it.
+ * has now sent a remote input. We auto-dismiss, because the app may not cannot cancel these given
+ * that they technically don't exist anymore. We wait a bit in case the app issues an update, and to
+ * also give the other lifetime extenders a beat to decide they want it.
  */
 private const val REMOTE_INPUT_ACTIVE_EXTENDER_AUTO_CANCEL_DELAY: Long = 500
 
 /**
  * How long to wait before releasing a lifetime extension when requested to do so due to a user
- * interaction (such as tapping another action).
- * We wait a bit in case the app issues an update in response to the action, but not too long or we
- * risk appearing unresponsive to the user.
+ * interaction (such as tapping another action). We wait a bit in case the app issues an update in
+ * response to the action, but not too long or we risk appearing unresponsive to the user.
  */
 private const val REMOTE_INPUT_EXTENDER_RELEASE_DELAY: Long = 200
 
@@ -63,22 +62,21 @@
 private val DEBUG: Boolean by lazy { Log.isLoggable(TAG, Log.DEBUG) }
 
 @CoordinatorScope
-class RemoteInputCoordinator @Inject constructor(
+class RemoteInputCoordinator
+@Inject
+constructor(
     dumpManager: DumpManager,
     private val mRebuilder: RemoteInputNotificationRebuilder,
     private val mNotificationRemoteInputManager: NotificationRemoteInputManager,
     @Main private val mMainHandler: Handler,
-    private val mSmartReplyController: SmartReplyController
+    private val mSmartReplyController: SmartReplyController,
 ) : Coordinator, RemoteInputListener, Dumpable {
 
     @VisibleForTesting val mRemoteInputHistoryExtender = RemoteInputHistoryExtender()
     @VisibleForTesting val mSmartReplyHistoryExtender = SmartReplyHistoryExtender()
     @VisibleForTesting val mRemoteInputActiveExtender = RemoteInputActiveExtender()
-    private val mRemoteInputLifetimeExtenders = listOf(
-            mRemoteInputHistoryExtender,
-            mSmartReplyHistoryExtender,
-            mRemoteInputActiveExtender
-    )
+    private val mRemoteInputLifetimeExtenders =
+        listOf(mRemoteInputHistoryExtender, mSmartReplyHistoryExtender, mRemoteInputActiveExtender)
 
     private lateinit var mNotifUpdater: InternalNotifUpdater
 
@@ -93,9 +91,7 @@
         if (lifetimeExtensionRefactor()) {
             pipeline.addNotificationLifetimeExtender(mRemoteInputActiveExtender)
         } else {
-            mRemoteInputLifetimeExtenders.forEach {
-                pipeline.addNotificationLifetimeExtender(it)
-            }
+            mRemoteInputLifetimeExtenders.forEach { pipeline.addNotificationLifetimeExtender(it) }
         }
         mNotifUpdater = pipeline.getInternalNotifUpdater(TAG)
         pipeline.addCollectionListener(mCollectionListener)
@@ -105,65 +101,75 @@
      * Listener that updates the appearance of the notification if it has been lifetime extended
      * by a a direct reply or a smart reply, and cancelled.
      */
-    val mCollectionListener = object : NotifCollectionListener {
-        override fun onEntryUpdated(entry: NotificationEntry, fromSystem: Boolean) {
-            if (DEBUG) {
-                Log.d(TAG, "mCollectionListener.onEntryUpdated(entry=${entry.key}," +
-                        " fromSystem=$fromSystem)")
-            }
-            if (fromSystem) {
-                if (lifetimeExtensionRefactor()) {
-                    if ((entry.getSbn().getNotification().flags
-                                    and FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY) > 0) {
-                        if (mNotificationRemoteInputManager.shouldKeepForRemoteInputHistory(
-                                        entry)) {
-                            val newSbn = mRebuilder.rebuildForRemoteInputReply(entry)
-                            entry.onRemoteInputInserted()
-                            mNotifUpdater.onInternalNotificationUpdate(newSbn,
-                                    "Extending lifetime of notification with remote input")
-                        } else if (mNotificationRemoteInputManager.shouldKeepForSmartReplyHistory(
-                                        entry)) {
-                            val newSbn = mRebuilder.rebuildForCanceledSmartReplies(entry)
-                            mSmartReplyController.stopSending(entry)
-                            mNotifUpdater.onInternalNotificationUpdate(newSbn,
-                                    "Extending lifetime of notification with smart reply")
+    val mCollectionListener =
+        object : NotifCollectionListener {
+            override fun onEntryUpdated(entry: NotificationEntry, fromSystem: Boolean) {
+                if (DEBUG) {
+                    Log.d(
+                        TAG,
+                        "mCollectionListener.onEntryUpdated(entry=${entry.key}," +
+                            " fromSystem=$fromSystem)",
+                    )
+                }
+                if (fromSystem) {
+                    if (lifetimeExtensionRefactor()) {
+                        if (
+                            (entry.getSbn().getNotification().flags and
+                                FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY) > 0
+                        ) {
+                            // If we've received an update from the system and the entry is marked
+                            // as lifetime extended, that means system server has received a
+                            // cancelation in response to a direct reply, and sent an update to
+                            // let system ui know that it should rebuild the notification with
+                            // that direct reply.
+                            if (
+                                mNotificationRemoteInputManager.shouldKeepForSmartReplyHistory(
+                                    entry
+                                )
+                            ) {
+                                val newSbn = mRebuilder.rebuildForCanceledSmartReplies(entry)
+                                mSmartReplyController.stopSending(entry)
+                                mNotifUpdater.onInternalNotificationUpdate(
+                                    newSbn,
+                                    "Extending lifetime of notification with smart reply",
+                                )
+                            } else {
+                                val newSbn = mRebuilder.rebuildForRemoteInputReply(entry)
+                                entry.onRemoteInputInserted()
+                                mNotifUpdater.onInternalNotificationUpdate(
+                                    newSbn,
+                                    "Extending lifetime of notification with remote input",
+                                )
+                            }
                         } else {
-                            // The app may have re-cancelled a notification after it had already
-                            // been lifetime extended.
-                            // Rebuild the notification with the replies it already had to ensure
-                            // those replies continue to be displayed.
-                            val newSbn = mRebuilder.rebuildWithExistingReplies(entry)
-                            mNotifUpdater.onInternalNotificationUpdate(newSbn,
-                                    "Extending lifetime of notification that has already been " +
-                                            "lifetime extended.")
+                            // Notifications updated without FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY
+                            // should have their remote inputs list cleared.
+                            entry.remoteInputs = null
                         }
                     } else {
-                        // Notifications updated without FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY
-                        // should have their remote inputs list cleared.
-                        entry.remoteInputs = null
+                        // Mark smart replies as sent whenever a notification is updated by the app,
+                        // otherwise the smart replies are never marked as sent.
+                        mSmartReplyController.stopSending(entry)
                     }
-                } else {
-                    // Mark smart replies as sent whenever a notification is updated by the app,
-                    // otherwise the smart replies are never marked as sent.
-                    mSmartReplyController.stopSending(entry)
+                }
+            }
+
+            override fun onEntryRemoved(entry: NotificationEntry, reason: Int) {
+                if (DEBUG) Log.d(TAG, "mCollectionListener.onEntryRemoved(entry=${entry.key})")
+                // We're removing the notification, the smart reply controller can forget about it.
+                // TODO(b/145659174): track 'sending' state on the entry to avoid having to clear
+                // it.
+                mSmartReplyController.stopSending(entry)
+
+                // When we know the entry will not be lifetime extended, clean up the remote input
+                // view
+                // TODO: Share code with NotifCollection.cannotBeLifetimeExtended
+                if (reason == REASON_CANCEL || reason == REASON_CLICK) {
+                    mNotificationRemoteInputManager.cleanUpRemoteInputForUserRemoval(entry)
                 }
             }
         }
 
-        override fun onEntryRemoved(entry: NotificationEntry, reason: Int) {
-            if (DEBUG) Log.d(TAG, "mCollectionListener.onEntryRemoved(entry=${entry.key})")
-            // We're removing the notification, the smart reply controller can forget about it.
-            // TODO(b/145659174): track 'sending' state on the entry to avoid having to clear it.
-            mSmartReplyController.stopSending(entry)
-
-            // When we know the entry will not be lifetime extended, clean up the remote input view
-            // TODO: Share code with NotifCollection.cannotBeLifetimeExtended
-            if (reason == REASON_CANCEL || reason == REASON_CLICK) {
-                mNotificationRemoteInputManager.cleanUpRemoteInputForUserRemoval(entry)
-            }
-        }
-    }
-
     override fun dump(pw: PrintWriter, args: Array<out String>) {
         mRemoteInputLifetimeExtenders.forEach { it.dump(pw, args) }
     }
@@ -183,22 +189,25 @@
         // view it is already canceled, so we'll need to cancel it on the apps behalf
         // now that a reply has been sent. However, delay so that the app has time to posts an
         // update in the mean time, and to give another lifetime extender time to pick it up.
-        mRemoteInputActiveExtender.endLifetimeExtensionAfterDelay(entry.key,
-                REMOTE_INPUT_ACTIVE_EXTENDER_AUTO_CANCEL_DELAY)
+        mRemoteInputActiveExtender.endLifetimeExtensionAfterDelay(
+            entry.key,
+            REMOTE_INPUT_ACTIVE_EXTENDER_AUTO_CANCEL_DELAY,
+        )
     }
 
     private fun onSmartReplySent(entry: NotificationEntry, reply: CharSequence) {
         if (DEBUG) Log.d(TAG, "onSmartReplySent(entry=${entry.key})")
         val newSbn = mRebuilder.rebuildForSendingSmartReply(entry, reply)
-        mNotifUpdater.onInternalNotificationUpdate(newSbn,
-                "Adding smart reply spinner for sent")
+        mNotifUpdater.onInternalNotificationUpdate(newSbn, "Adding smart reply spinner for sent")
 
         // If we're extending for remote input being active, then from the apps point of
         // view it is already canceled, so we'll need to cancel it on the apps behalf
         // now that a reply has been sent. However, delay so that the app has time to posts an
         // update in the mean time, and to give another lifetime extender time to pick it up.
-        mRemoteInputActiveExtender.endLifetimeExtensionAfterDelay(entry.key,
-                REMOTE_INPUT_ACTIVE_EXTENDER_AUTO_CANCEL_DELAY)
+        mRemoteInputActiveExtender.endLifetimeExtensionAfterDelay(
+            entry.key,
+            REMOTE_INPUT_ACTIVE_EXTENDER_AUTO_CANCEL_DELAY,
+        )
     }
 
     override fun onPanelCollapsed() {
@@ -208,19 +217,25 @@
     override fun isNotificationKeptForRemoteInputHistory(key: String) =
         if (!lifetimeExtensionRefactor()) {
             mRemoteInputHistoryExtender.isExtending(key) ||
-                    mSmartReplyHistoryExtender.isExtending(key)
+                mSmartReplyHistoryExtender.isExtending(key)
         } else false
 
     override fun releaseNotificationIfKeptForRemoteInputHistory(entry: NotificationEntry) {
         if (DEBUG) Log.d(TAG, "releaseNotificationIfKeptForRemoteInputHistory(entry=${entry.key})")
         if (!lifetimeExtensionRefactor()) {
-            mRemoteInputHistoryExtender.endLifetimeExtensionAfterDelay(entry.key,
-                    REMOTE_INPUT_EXTENDER_RELEASE_DELAY)
-            mSmartReplyHistoryExtender.endLifetimeExtensionAfterDelay(entry.key,
-                    REMOTE_INPUT_EXTENDER_RELEASE_DELAY)
+            mRemoteInputHistoryExtender.endLifetimeExtensionAfterDelay(
+                entry.key,
+                REMOTE_INPUT_EXTENDER_RELEASE_DELAY,
+            )
+            mSmartReplyHistoryExtender.endLifetimeExtensionAfterDelay(
+                entry.key,
+                REMOTE_INPUT_EXTENDER_RELEASE_DELAY,
+            )
         }
-        mRemoteInputActiveExtender.endLifetimeExtensionAfterDelay(entry.key,
-                REMOTE_INPUT_EXTENDER_RELEASE_DELAY)
+        mRemoteInputActiveExtender.endLifetimeExtensionAfterDelay(
+            entry.key,
+            REMOTE_INPUT_EXTENDER_RELEASE_DELAY,
+        )
     }
 
     override fun setRemoteInputController(remoteInputController: RemoteInputController) {
@@ -229,32 +244,36 @@
 
     @VisibleForTesting
     inner class RemoteInputHistoryExtender :
-            SelfTrackingLifetimeExtender(TAG, "RemoteInputHistory", DEBUG, mMainHandler) {
+        SelfTrackingLifetimeExtender(TAG, "RemoteInputHistory", DEBUG, mMainHandler) {
 
         override fun queryShouldExtendLifetime(entry: NotificationEntry): Boolean =
-                mNotificationRemoteInputManager.shouldKeepForRemoteInputHistory(entry)
+            mNotificationRemoteInputManager.shouldKeepForRemoteInputHistory(entry)
 
         override fun onStartedLifetimeExtension(entry: NotificationEntry) {
             val newSbn = mRebuilder.rebuildForRemoteInputReply(entry)
             entry.onRemoteInputInserted()
-            mNotifUpdater.onInternalNotificationUpdate(newSbn,
-                    "Extending lifetime of notification with remote input")
+            mNotifUpdater.onInternalNotificationUpdate(
+                newSbn,
+                "Extending lifetime of notification with remote input",
+            )
             // TODO: Check if the entry was removed due perhaps to an inflation exception?
         }
     }
 
     @VisibleForTesting
     inner class SmartReplyHistoryExtender :
-            SelfTrackingLifetimeExtender(TAG, "SmartReplyHistory", DEBUG, mMainHandler) {
+        SelfTrackingLifetimeExtender(TAG, "SmartReplyHistory", DEBUG, mMainHandler) {
 
         override fun queryShouldExtendLifetime(entry: NotificationEntry): Boolean =
-                mNotificationRemoteInputManager.shouldKeepForSmartReplyHistory(entry)
+            mNotificationRemoteInputManager.shouldKeepForSmartReplyHistory(entry)
 
         override fun onStartedLifetimeExtension(entry: NotificationEntry) {
             val newSbn = mRebuilder.rebuildForCanceledSmartReplies(entry)
             mSmartReplyController.stopSending(entry)
-            mNotifUpdater.onInternalNotificationUpdate(newSbn,
-                    "Extending lifetime of notification with smart reply")
+            mNotifUpdater.onInternalNotificationUpdate(
+                newSbn,
+                "Extending lifetime of notification with smart reply",
+            )
             // TODO: Check if the entry was removed due perhaps to an inflation exception?
         }
 
@@ -266,9 +285,9 @@
 
     @VisibleForTesting
     inner class RemoteInputActiveExtender :
-            SelfTrackingLifetimeExtender(TAG, "RemoteInputActive", DEBUG, mMainHandler) {
+        SelfTrackingLifetimeExtender(TAG, "RemoteInputActive", DEBUG, mMainHandler) {
 
         override fun queryShouldExtendLifetime(entry: NotificationEntry): Boolean =
-                mNotificationRemoteInputManager.isRemoteInputActive(entry)
+            mNotificationRemoteInputManager.isRemoteInputActive(entry)
     }
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java
index 6d0148a..8660cd1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java
@@ -22,15 +22,18 @@
 import androidx.annotation.VisibleForTesting;
 
 import com.android.systemui.Dumpable;
+import com.android.systemui.Flags;
 import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.keyguard.WakefulnessLifecycle;
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
+import com.android.systemui.keyguard.shared.model.Edge;
 import com.android.systemui.keyguard.shared.model.KeyguardState;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.scene.shared.flag.SceneContainerFlag;
+import com.android.systemui.scene.shared.model.Scenes;
 import com.android.systemui.shade.domain.interactor.ShadeAnimationInteractor;
 import com.android.systemui.shade.domain.interactor.ShadeInteractor;
 import com.android.systemui.statusbar.notification.VisibilityLocationProvider;
@@ -41,7 +44,7 @@
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifStabilityManager;
 import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
 import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor;
-import com.android.systemui.statusbar.notification.shared.NotificationMinimalismPrototype;
+import com.android.systemui.statusbar.notification.shared.NotificationMinimalism;
 import com.android.systemui.statusbar.policy.HeadsUpManager;
 import com.android.systemui.util.concurrency.DelayableExecutor;
 import com.android.systemui.util.kotlin.BooleanFlowOperators;
@@ -85,6 +88,7 @@
     private boolean mNotifPanelLaunchingActivity;
     private boolean mCommunalShowing = false;
     private boolean mLockscreenShowing = false;
+    private boolean mLockscreenInGoneTransition = false;
 
     private boolean mPipelineRunAllowed;
     private boolean mReorderingAllowed;
@@ -158,6 +162,13 @@
                             KeyguardState.LOCKSCREEN),
                     this::onLockscreenKeyguardStateTransitionValueChanged);
         }
+        if (Flags.checkLockscreenGoneTransition()) {
+            mJavaAdapter.alwaysCollectFlow(mKeyguardTransitionInteractor.isInTransition(
+                            Edge.create(KeyguardState.LOCKSCREEN, Scenes.Gone),
+                            Edge.create(KeyguardState.LOCKSCREEN, KeyguardState.GONE)),
+                    this::onLockscreenInGoneTransitionChanged);
+        }
+
 
         pipeline.setVisualStabilityManager(mNotifStabilityManager);
     }
@@ -170,7 +181,7 @@
                     if (entry == null) {
                         return false;
                     }
-                    boolean isTopUnseen = NotificationMinimalismPrototype.isEnabled()
+                    boolean isTopUnseen = NotificationMinimalism.isEnabled()
                             && (mSeenNotificationsInteractor.isTopUnseenNotification(entry)
                                 || mSeenNotificationsInteractor.isTopOngoingNotification(entry));
                     if (isTopUnseen || mHeadsUpManager.isHeadsUpEntry(entry.getKey())) {
@@ -239,7 +250,9 @@
     private void updateAllowedStates(String field, boolean value) {
         boolean wasPipelineRunAllowed = mPipelineRunAllowed;
         boolean wasReorderingAllowed = mReorderingAllowed;
-        mPipelineRunAllowed = !isPanelCollapsingOrLaunchingActivity();
+        // No need to run notification pipeline when the lockscreen is in fading animation.
+        mPipelineRunAllowed = !(isPanelCollapsingOrLaunchingActivity()
+                || (Flags.checkLockscreenGoneTransition() && mLockscreenInGoneTransition));
         mReorderingAllowed = isReorderingAllowed();
         if (wasPipelineRunAllowed != mPipelineRunAllowed
                 || wasReorderingAllowed != mReorderingAllowed) {
@@ -330,7 +343,6 @@
                     updateAllowedStates("fullyDozed", fullyDozed);
                 }
             };
-
     final WakefulnessLifecycle.Observer mWakefulnessObserver = new WakefulnessLifecycle.Observer() {
         @Override
         public void onFinishedGoingToSleep() {
@@ -353,6 +365,9 @@
         pw.println("pipelineRunAllowed: " + mPipelineRunAllowed);
         pw.println("  notifPanelCollapsing: " + mNotifPanelCollapsing);
         pw.println("  launchingNotifActivity: " + mNotifPanelLaunchingActivity);
+        if (Flags.checkLockscreenGoneTransition()) {
+            pw.println("  lockscreenInGoneTransition: " + mLockscreenInGoneTransition);
+        }
         pw.println("reorderingAllowed: " + mReorderingAllowed);
         pw.println("  sleepy: " + mSleepy);
         pw.println("  fullyDozed: " + mFullyDozed);
@@ -401,4 +416,15 @@
         mLockscreenShowing = isShowing;
         updateAllowedStates("lockscreenShowing", isShowing);
     }
+
+    private void onLockscreenInGoneTransitionChanged(boolean inGoneTransition) {
+        if (!Flags.checkLockscreenGoneTransition()) {
+            return;
+        }
+        if (inGoneTransition == mLockscreenInGoneTransition) {
+            return;
+        }
+        mLockscreenInGoneTransition = inGoneTransition;
+        updateAllowedStates("lockscreenInGoneTransition", mLockscreenInGoneTransition);
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractor.kt
index aa203d7..e25127e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractor.kt
@@ -39,10 +39,10 @@
 @Inject
 constructor(
     private val headsUpRepository: HeadsUpRepository,
-    private val faceAuthInteractor: DeviceEntryFaceAuthInteractor,
-    private val keyguardTransitionInteractor: KeyguardTransitionInteractor,
-    private val notificationsKeyguardInteractor: NotificationsKeyguardInteractor,
-    private val shadeInteractor: ShadeInteractor,
+    faceAuthInteractor: DeviceEntryFaceAuthInteractor,
+    keyguardTransitionInteractor: KeyguardTransitionInteractor,
+    notificationsKeyguardInteractor: NotificationsKeyguardInteractor,
+    shadeInteractor: ShadeInteractor,
 ) {
 
     /** The top-ranked heads up row, regardless of pinned state */
@@ -56,8 +56,7 @@
             }
             .distinctUntilChanged()
 
-    /** Set of currently pinned top-level heads up rows to be displayed. */
-    val pinnedHeadsUpRows: Flow<Set<HeadsUpRowKey>> by lazy {
+    private val activeHeadsUpRows: Flow<Set<Pair<HeadsUpRowKey, Boolean>>> by lazy {
         if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) {
             flowOf(emptySet())
         } else {
@@ -67,9 +66,7 @@
                         repositories.map { repo ->
                             repo.isPinned.map { isPinned -> repo to isPinned }
                         }
-                    combine(toCombine) { pairs ->
-                        pairs.filter { (_, isPinned) -> isPinned }.map { (repo, _) -> repo }.toSet()
-                    }
+                    combine(toCombine) { pairs -> pairs.toSet() }
                 } else {
                     // if the set is empty, there are no flows to combine
                     flowOf(emptySet())
@@ -78,6 +75,26 @@
         }
     }
 
+    /** Set of currently active top-level heads up rows to be displayed. */
+    val activeHeadsUpRowKeys: Flow<Set<HeadsUpRowKey>> by lazy {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) {
+            flowOf(emptySet())
+        } else {
+            activeHeadsUpRows.map { it.map { (repo, _) -> repo }.toSet() }
+        }
+    }
+
+    /** Set of currently pinned top-level heads up rows to be displayed. */
+    val pinnedHeadsUpRowKeys: Flow<Set<HeadsUpRowKey>> by lazy {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) {
+            flowOf(emptySet())
+        } else {
+            activeHeadsUpRows.map {
+                it.filter { (_, isPinned) -> isPinned }.map { (repo, _) -> repo }.toSet()
+            }
+        }
+    }
+
     /** Are there any pinned heads up rows to display? */
     val hasPinnedRows: Flow<Boolean> by lazy {
         if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/SeenNotificationsInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/SeenNotificationsInteractor.kt
index 2956432..1babe47 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/SeenNotificationsInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/SeenNotificationsInteractor.kt
@@ -23,7 +23,7 @@
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.statusbar.notification.collection.NotificationEntry
 import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationListRepository
-import com.android.systemui.statusbar.notification.shared.NotificationMinimalismPrototype
+import com.android.systemui.statusbar.notification.shared.NotificationMinimalism
 import com.android.systemui.util.printSection
 import com.android.systemui.util.settings.SecureSettings
 import com.android.systemui.util.settings.SettingsProxyExt.observerFlow
@@ -57,25 +57,25 @@
 
     /** Set the entry that is identified as the top ongoing notification. */
     fun setTopOngoingNotification(entry: NotificationEntry?) {
-        if (NotificationMinimalismPrototype.isUnexpectedlyInLegacyMode()) return
+        if (NotificationMinimalism.isUnexpectedlyInLegacyMode()) return
         notificationListRepository.topOngoingNotificationKey.value = entry?.key
     }
 
     /** Determine if the given notification is the top ongoing notification. */
     fun isTopOngoingNotification(entry: NotificationEntry?): Boolean =
-        if (NotificationMinimalismPrototype.isUnexpectedlyInLegacyMode()) false
+        if (NotificationMinimalism.isUnexpectedlyInLegacyMode()) false
         else
             entry != null && notificationListRepository.topOngoingNotificationKey.value == entry.key
 
     /** Set the entry that is identified as the top unseen notification. */
     fun setTopUnseenNotification(entry: NotificationEntry?) {
-        if (NotificationMinimalismPrototype.isUnexpectedlyInLegacyMode()) return
+        if (NotificationMinimalism.isUnexpectedlyInLegacyMode()) return
         notificationListRepository.topUnseenNotificationKey.value = entry?.key
     }
 
     /** Determine if the given notification is the top unseen notification. */
     fun isTopUnseenNotification(entry: NotificationEntry?): Boolean =
-        if (NotificationMinimalismPrototype.isUnexpectedlyInLegacyMode()) false
+        if (NotificationMinimalism.isUnexpectedlyInLegacyMode()) false
         else entry != null && notificationListRepository.topUnseenNotificationKey.value == entry.key
 
     fun dump(pw: IndentingPrintWriter) =
@@ -120,4 +120,29 @@
             // only track the most recent emission, if events are happening faster than they can be
             // consumed
             .conflate()
+
+    fun isLockScreenNotificationMinimalismEnabled(): Flow<Boolean> =
+        secureSettings
+            // emit whenever the setting has changed
+            .observerFlow(
+                UserHandle.USER_ALL,
+                Settings.Secure.LOCK_SCREEN_NOTIFICATION_MINIMALISM,
+            )
+            // perform a query immediately
+            .onStart { emit(Unit) }
+            // for each change, lookup the new value
+            .map {
+                secureSettings.getIntForUser(
+                    name = Settings.Secure.LOCK_SCREEN_NOTIFICATION_MINIMALISM,
+                    default = 1,
+                    userHandle = UserHandle.USER_CURRENT,
+                ) == 1
+            }
+            // don't emit anything if nothing has changed
+            .distinctUntilChanged()
+            // perform lookups on the bg thread pool
+            .flowOn(bgDispatcher)
+            // only track the most recent emission, if events are happening faster than they can be
+            // consumed
+            .conflate()
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/shared/ModesEmptyShadeFix.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/shared/ModesEmptyShadeFix.kt
new file mode 100644
index 0000000..f1fc275
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/shared/ModesEmptyShadeFix.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.notification.emptyshade.shared
+
+import android.app.Flags
+import com.android.systemui.flags.FlagToken
+import com.android.systemui.flags.RefactorFlagUtils
+
+/** Helper for reading or using the modes_ui_empty_shade flag state. */
+@Suppress("NOTHING_TO_INLINE")
+object ModesEmptyShadeFix {
+    /** The aconfig flag name */
+    const val FLAG_NAME = Flags.FLAG_MODES_UI_EMPTY_SHADE
+
+    /** A token used for dependency declaration */
+    val token: FlagToken
+        get() = FlagToken(FLAG_NAME, isEnabled)
+
+    /** Is the refactor enabled */
+    @JvmStatic
+    inline val isEnabled
+        get() = Flags.modesUiEmptyShade()
+
+    /**
+     * Called to ensure code is only run when the flag is enabled. This protects users from the
+     * unintended behaviors caused by accidentally running new logic, while also crashing on an eng
+     * build to ensure that the refactor author catches issues in testing.
+     */
+    @JvmStatic
+    inline fun isUnexpectedlyInLegacyMode() =
+        RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME)
+
+    /**
+     * Called to ensure code is only run when the flag is disabled. This will throw an exception if
+     * the flag is not enabled to ensure that the refactor author catches issues in testing.
+     * Caution!! Using this check incorrectly will cause crashes in nextfood builds!
+     */
+    @JvmStatic
+    inline fun assertInNewMode() = RefactorFlagUtils.assertInNewMode(isEnabled, FLAG_NAME)
+
+    /**
+     * Called to ensure code is only run when the flag is disabled. This will throw an exception if
+     * the flag is enabled to ensure that the refactor author catches issues in testing.
+     */
+    @JvmStatic
+    inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/view/EmptyShadeView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/view/EmptyShadeView.java
index 850e944..73477da 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/view/EmptyShadeView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/view/EmptyShadeView.java
@@ -22,6 +22,7 @@
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.content.res.Configuration;
+import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.View;
@@ -29,26 +30,71 @@
 
 import androidx.annotation.NonNull;
 
+import com.android.systemui.animation.LaunchableView;
+import com.android.systemui.animation.LaunchableViewDelegate;
 import com.android.systemui.res.R;
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix;
 import com.android.systemui.statusbar.notification.row.StackScrollerDecorView;
 import com.android.systemui.statusbar.notification.stack.ExpandableViewState;
 
-public class EmptyShadeView extends StackScrollerDecorView {
+import kotlin.Unit;
+
+import java.util.Objects;
+
+public class EmptyShadeView extends StackScrollerDecorView implements LaunchableView {
 
     private TextView mEmptyText;
     private TextView mEmptyFooterText;
 
-    private @StringRes int mText = R.string.empty_shade_text;
+    private @StringRes int mTextId = R.string.empty_shade_text;
+    private String mTextString;
 
-    private @DrawableRes int mFooterIcon = R.drawable.ic_friction_lock_closed;
-    private @StringRes int mFooterText = R.string.unlock_to_see_notif_text;
+    private @DrawableRes int mFooterIcon;
+    private @StringRes int mFooterText;
+    // This view is initially gone in the xml.
     private @Visibility int mFooterVisibility = View.GONE;
     private int mSize;
 
+    private LaunchableViewDelegate mLaunchableViewDelegate = new LaunchableViewDelegate(this,
+            visibility -> {
+                super.setVisibility(visibility);
+                return Unit.INSTANCE;
+            });
+
     public EmptyShadeView(Context context, AttributeSet attrs) {
         super(context, attrs);
         mSize = getResources().getDimensionPixelSize(
                 R.dimen.notifications_unseen_footer_icon_size);
+        if (ModesEmptyShadeFix.isEnabled()) {
+            mTextString = getContext().getString(R.string.empty_shade_text);
+        } else {
+            // These will be set by the binder when appropriate if ModesEmptyShadeFix is on.
+            mFooterIcon = R.drawable.ic_friction_lock_closed;
+            mFooterText = R.string.unlock_to_see_notif_text;
+        }
+    }
+
+    @Override
+    public void setVisibility(int visibility) {
+        mLaunchableViewDelegate.setVisibility(visibility);
+    }
+
+    @Override
+    public void setShouldBlockVisibilityChanges(boolean block) {
+        /* check if */ ModesEmptyShadeFix.isUnexpectedlyInLegacyMode();
+        mLaunchableViewDelegate.setShouldBlockVisibilityChanges(block);
+    }
+
+    @Override
+    public void onActivityLaunchAnimationEnd() {
+        /* check if */ ModesEmptyShadeFix.isUnexpectedlyInLegacyMode();
+    }
+
+    @Override
+    @NonNull
+    public Rect getPaddingForLaunchAnimation() {
+        /* check if */ ModesEmptyShadeFix.isUnexpectedlyInLegacyMode();
+        return new Rect();
     }
 
     @Override
@@ -56,7 +102,11 @@
         super.onConfigurationChanged(newConfig);
         mSize = getResources().getDimensionPixelSize(
                 R.dimen.notifications_unseen_footer_icon_size);
-        mEmptyText.setText(mText);
+        if (ModesEmptyShadeFix.isEnabled()) {
+            mEmptyText.setText(mTextString);
+        } else {
+            mEmptyText.setText(mTextId);
+        }
         mEmptyFooterText.setVisibility(mFooterVisibility);
         setFooterText(mFooterText);
         setFooterIcon(mFooterIcon);
@@ -72,25 +122,45 @@
         return findViewById(R.id.no_notifications_footer);
     }
 
+    /** Update view colors. */
     public void setTextColors(@ColorInt int onSurface, @ColorInt int onSurfaceVariant) {
         mEmptyText.setTextColor(onSurfaceVariant);
         mEmptyFooterText.setTextColor(onSurface);
         mEmptyFooterText.setCompoundDrawableTintList(ColorStateList.valueOf(onSurface));
     }
 
+    /** Set the resource ID for the main text shown by the view. */
     public void setText(@StringRes int text) {
-        mText = text;
-        mEmptyText.setText(mText);
+        ModesEmptyShadeFix.assertInLegacyMode();
+        mTextId = text;
+        mEmptyText.setText(mTextId);
     }
 
+    /** Set the string for the main text shown by the view. */
+    public void setText(String text) {
+        if (ModesEmptyShadeFix.isUnexpectedlyInLegacyMode() || Objects.equals(mTextString, text)) {
+            return;
+        }
+        mTextString = text;
+        mEmptyText.setText(text);
+    }
+
+    /** Visibility for the footer (the additional icon+text shown below the main text). */
     public void setFooterVisibility(@Visibility int visibility) {
+        if (ModesEmptyShadeFix.isEnabled() && mFooterVisibility == visibility) {
+            return; // nothing to change
+        }
         mFooterVisibility = visibility;
         setSecondaryVisible(/* visible = */ visibility == View.VISIBLE,
                 /* animate = */false,
                 /* onAnimationEnded = */ null);
     }
 
+    /** Text resource ID for the footer (the additional icon+text shown below the main text). */
     public void setFooterText(@StringRes int text) {
+        if (ModesEmptyShadeFix.isEnabled() && mFooterText == text) {
+            return; // nothing to change
+        }
         mFooterText = text;
         if (text != 0) {
             mEmptyFooterText.setText(mFooterText);
@@ -99,7 +169,11 @@
         }
     }
 
+    /** Icon resource ID for the footer (the additional icon+text shown below the main text). */
     public void setFooterIcon(@DrawableRes int icon) {
+        if (ModesEmptyShadeFix.isEnabled() && mFooterIcon == icon) {
+            return; // nothing to change
+        }
         mFooterIcon = icon;
         Drawable drawable;
         if (icon == 0) {
@@ -111,18 +185,24 @@
         mEmptyFooterText.setCompoundDrawablesRelative(drawable, null, null, null);
     }
 
+    /** Get resource ID for main text. */
     @StringRes
     public int getTextResource() {
-        return mText;
+        ModesEmptyShadeFix.assertInLegacyMode();
+        return mTextId;
     }
 
+    /** Get resource ID for footer text. */
     @StringRes
     public int getFooterTextResource() {
+        ModesEmptyShadeFix.assertInLegacyMode();
         return mFooterText;
     }
 
+    /** Get resource ID for footer icon. */
     @DrawableRes
     public int getFooterIconResource() {
+        ModesEmptyShadeFix.assertInLegacyMode();
         return mFooterIcon;
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewbinder/EmptyShadeViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewbinder/EmptyShadeViewBinder.kt
new file mode 100644
index 0000000..7f1b043
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewbinder/EmptyShadeViewBinder.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.notification.emptyshade.ui.viewbinder
+
+import android.view.View
+import com.android.systemui.statusbar.notification.NotificationActivityStarter
+import com.android.systemui.statusbar.notification.emptyshade.ui.view.EmptyShadeView
+import com.android.systemui.statusbar.notification.emptyshade.ui.viewmodel.EmptyShadeViewModel
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.launch
+
+object EmptyShadeViewBinder {
+    suspend fun bind(
+        view: EmptyShadeView,
+        viewModel: EmptyShadeViewModel,
+        notificationActivityStarter: NotificationActivityStarter,
+    ) = coroutineScope {
+        launch { viewModel.text.collect { view.setText(it) } }
+
+        launch {
+            viewModel.onClick.collect { settingsIntent ->
+                val onClickListener = { view: View ->
+                    notificationActivityStarter.startSettingsIntent(view, settingsIntent)
+                }
+                view.setOnClickListener(onClickListener)
+            }
+        }
+
+        launch { bindFooter(view, viewModel) }
+    }
+
+    private suspend fun bindFooter(view: EmptyShadeView, viewModel: EmptyShadeViewModel) =
+        coroutineScope {
+            // Bind the resource IDs
+            view.setFooterText(viewModel.footer.messageId)
+            view.setFooterIcon(viewModel.footer.iconId)
+
+            launch {
+                viewModel.footer.isVisible.collect { visible ->
+                    view.setFooterVisibility(if (visible) View.VISIBLE else View.GONE)
+                }
+            }
+        }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModel.kt
new file mode 100644
index 0000000..695e088
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModel.kt
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.notification.emptyshade.ui.viewmodel
+
+import android.content.Context
+import android.icu.text.MessageFormat
+import com.android.app.tracing.coroutines.flow.flowOn
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.dump.DumpManager
+import com.android.systemui.modes.shared.ModesUi
+import com.android.systemui.res.R
+import com.android.systemui.shared.notifications.domain.interactor.NotificationSettingsInteractor
+import com.android.systemui.statusbar.notification.NotificationActivityStarter.SettingsIntent
+import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix
+import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor
+import com.android.systemui.statusbar.notification.footer.ui.viewmodel.FooterMessageViewModel
+import com.android.systemui.statusbar.policy.domain.interactor.ZenModeInteractor
+import com.android.systemui.util.kotlin.FlowDumperImpl
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+import java.util.Locale
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.map
+
+/**
+ * ViewModel for the empty shade (aka the "No notifications" text shown when there are no
+ * notifications.
+ */
+class EmptyShadeViewModel
+@AssistedInject
+constructor(
+    private val context: Context,
+    zenModeInteractor: ZenModeInteractor,
+    seenNotificationsInteractor: SeenNotificationsInteractor,
+    notificationSettingsInteractor: NotificationSettingsInteractor,
+    @Background bgDispatcher: CoroutineDispatcher,
+    dumpManager: DumpManager,
+) : FlowDumperImpl(dumpManager) {
+    val areNotificationsHiddenInShade: Flow<Boolean> by lazy {
+        if (FooterViewRefactor.isUnexpectedlyInLegacyMode()) {
+            flowOf(false)
+        } else if (ModesEmptyShadeFix.isEnabled) {
+            zenModeInteractor.areNotificationsHiddenInShade
+                .dumpWhileCollecting("areNotificationsHiddenInShade")
+                .flowOn(bgDispatcher)
+        } else {
+            zenModeInteractor.areNotificationsHiddenInShade.dumpWhileCollecting(
+                "areNotificationsHiddenInShade"
+            )
+        }
+    }
+
+    val hasFilteredOutSeenNotifications: StateFlow<Boolean> by lazy {
+        if (FooterViewRefactor.isUnexpectedlyInLegacyMode()) {
+            MutableStateFlow(false)
+        } else {
+            seenNotificationsInteractor.hasFilteredOutSeenNotifications.dumpValue(
+                "hasFilteredOutSeenNotifications"
+            )
+        }
+    }
+
+    val text: Flow<String> by lazy {
+        if (ModesEmptyShadeFix.isUnexpectedlyInLegacyMode()) {
+            flowOf(context.getString(R.string.empty_shade_text))
+        } else {
+            // Note: Flag modes_ui_empty_shade includes two pieces: refactoring the empty shade to
+            // recommended architecture, and making it so it reacts to changes for the new Modes.
+            // The former does not depend on the modes flags being on, but the latter does.
+            if (ModesUi.isEnabled) {
+                    zenModeInteractor.modesHidingNotifications.map { modes ->
+                        // Create a string that is either "No notifications" if no modes are
+                        // filtering
+                        // them out, or something like "Notifications paused by SomeMode" otherwise.
+                        val msgFormat =
+                            MessageFormat(
+                                context.getString(R.string.modes_suppressing_shade_text),
+                                Locale.getDefault(),
+                            )
+                        val count = modes.count()
+                        val args: MutableMap<String, Any> = HashMap()
+                        args["count"] = count
+                        if (count >= 1) {
+                            args["mode"] = modes[0].name
+                        }
+                        msgFormat.format(args)
+                    }
+                } else {
+                    areNotificationsHiddenInShade.map { areNotificationsHiddenInShade ->
+                        if (areNotificationsHiddenInShade) {
+                            context.getString(R.string.dnd_suppressing_shade_text)
+                        } else {
+                            context.getString(R.string.empty_shade_text)
+                        }
+                    }
+                }
+                .flowOn(bgDispatcher)
+        }
+    }
+
+    val footer: FooterMessageViewModel by lazy {
+        ModesEmptyShadeFix.assertInNewMode()
+        FooterMessageViewModel(
+            messageId = R.string.unlock_to_see_notif_text,
+            iconId = R.drawable.ic_friction_lock_closed,
+            isVisible = hasFilteredOutSeenNotifications,
+        )
+    }
+
+    val onClick: Flow<SettingsIntent> by lazy {
+        ModesEmptyShadeFix.assertInNewMode()
+        combine(
+                zenModeInteractor.modesHidingNotifications,
+                notificationSettingsInteractor.isNotificationHistoryEnabled,
+            ) { modes, isNotificationHistoryEnabled ->
+                if (modes.isNotEmpty()) {
+                    if (modes.size == 1) {
+                        SettingsIntent.forModeSettings(modes[0].id)
+                    } else {
+                        SettingsIntent.forModesSettings()
+                    }
+                } else {
+                    if (isNotificationHistoryEnabled) {
+                        SettingsIntent.forNotificationHistory()
+                    } else {
+                        SettingsIntent.forNotificationSettings()
+                    }
+                }
+            }
+            .flowOn(bgDispatcher)
+    }
+
+    @AssistedFactory
+    interface Factory {
+        fun create(): EmptyShadeViewModel
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewbinder/FooterViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewbinder/FooterViewBinder.kt
index 920541d..22bec5a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewbinder/FooterViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewbinder/FooterViewBinder.kt
@@ -19,6 +19,8 @@
 import android.view.View
 import androidx.lifecycle.lifecycleScope
 import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.statusbar.notification.NotificationActivityStarter
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix
 import com.android.systemui.statusbar.notification.footer.ui.view.FooterView
 import com.android.systemui.statusbar.notification.footer.ui.viewmodel.FooterViewModel
 import com.android.systemui.util.ui.isAnimating
@@ -36,6 +38,7 @@
         clearAllNotifications: View.OnClickListener,
         launchNotificationSettings: View.OnClickListener,
         launchNotificationHistory: View.OnClickListener,
+        notificationActivityStarter: NotificationActivityStarter,
     ): DisposableHandle {
         return footer.repeatWhenAttached {
             lifecycleScope.launch {
@@ -45,6 +48,7 @@
                     clearAllNotifications,
                     launchNotificationSettings,
                     launchNotificationHistory,
+                    notificationActivityStarter,
                 )
             }
         }
@@ -56,6 +60,7 @@
         clearAllNotifications: View.OnClickListener,
         launchNotificationSettings: View.OnClickListener,
         launchNotificationHistory: View.OnClickListener,
+        notificationActivityStarter: NotificationActivityStarter,
     ) = coroutineScope {
         launch { bindClearAllButton(footer, viewModel, clearAllNotifications) }
         launch {
@@ -64,6 +69,7 @@
                 viewModel,
                 launchNotificationSettings,
                 launchNotificationHistory,
+                notificationActivityStarter,
             )
         }
         launch { bindMessage(footer, viewModel) }
@@ -113,13 +119,23 @@
         viewModel: FooterViewModel,
         launchNotificationSettings: View.OnClickListener,
         launchNotificationHistory: View.OnClickListener,
+        notificationActivityStarter: NotificationActivityStarter,
     ) = coroutineScope {
         launch {
-            viewModel.manageButtonShouldLaunchHistory.collect { shouldLaunchHistory ->
-                if (shouldLaunchHistory) {
-                    footer.setManageButtonClickListener(launchNotificationHistory)
-                } else {
-                    footer.setManageButtonClickListener(launchNotificationSettings)
+            if (ModesEmptyShadeFix.isEnabled) {
+                viewModel.manageOrHistoryButtonClick.collect { settingsIntent ->
+                    val onClickListener = { view: View ->
+                        notificationActivityStarter.startSettingsIntent(view, settingsIntent)
+                    }
+                    footer.setManageButtonClickListener(onClickListener)
+                }
+            } else {
+                viewModel.manageButtonShouldLaunchHistory.collect { shouldLaunchHistory ->
+                    if (shouldLaunchHistory) {
+                        footer.setManageButtonClickListener(launchNotificationHistory)
+                    } else {
+                        footer.setManageButtonClickListener(launchNotificationSettings)
+                    }
                 }
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewmodel/FooterViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewmodel/FooterViewModel.kt
index 90fb728..a3f4cd2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewmodel/FooterViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewmodel/FooterViewModel.kt
@@ -16,12 +16,17 @@
 
 package com.android.systemui.statusbar.notification.footer.ui.viewmodel
 
+import android.content.Intent
+import android.provider.Settings
+import com.android.internal.jank.InteractionJankMonitor
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.res.R
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.shared.notifications.domain.interactor.NotificationSettingsInteractor
+import com.android.systemui.statusbar.notification.NotificationActivityStarter.SettingsIntent
 import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor
 import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix
 import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor
 import com.android.systemui.statusbar.notification.footer.ui.view.FooterView
 import com.android.systemui.util.kotlin.sample
@@ -80,7 +85,7 @@
                         combine(
                                 shadeInteractor.isShadeFullyExpanded,
                                 shadeInteractor.isShadeTouchable,
-                                ::Pair
+                                ::Pair,
                             )
                             .onStart { emit(Pair(false, false)) }
                     ) { clearAllButtonVisible, (isShadeFullyExpanded, animationsEnabled) ->
@@ -93,8 +98,28 @@
     val manageButtonShouldLaunchHistory =
         notificationSettingsInteractor.isNotificationHistoryEnabled
 
+    // TODO(b/366003631): When inlining the flag, consider adding this to FooterButtonViewModel.
+    val manageOrHistoryButtonClick: Flow<SettingsIntent> by lazy {
+        if (ModesEmptyShadeFix.isUnexpectedlyInLegacyMode()) {
+            flowOf(SettingsIntent(Intent(Settings.ACTION_NOTIFICATION_SETTINGS)))
+        } else {
+            notificationSettingsInteractor.isNotificationHistoryEnabled.map {
+                isNotificationHistoryEnabled ->
+                if (isNotificationHistoryEnabled) {
+                    SettingsIntent.forNotificationHistory(
+                        cujType = InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_HISTORY_BUTTON
+                    )
+                } else {
+                    SettingsIntent.forNotificationSettings(
+                        cujType = InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_HISTORY_BUTTON
+                    )
+                }
+            }
+        }
+    }
+
     private val manageOrHistoryButtonText: Flow<Int> =
-        manageButtonShouldLaunchHistory.map { shouldLaunchHistory ->
+        notificationSettingsInteractor.isNotificationHistoryEnabled.map { shouldLaunchHistory ->
             if (shouldLaunchHistory) R.string.manage_notifications_history_text
             else R.string.manage_notifications_text
         }
@@ -128,7 +153,7 @@
                     activeNotificationsInteractor.get(),
                     notificationSettingsInteractor.get(),
                     seenNotificationsInteractor.get(),
-                    shadeInteractor.get()
+                    shadeInteractor.get(),
                 )
             )
         } else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index 0b6674e..adb3352 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -3218,7 +3218,7 @@
     }
 
     @Override
-    protected void resetAllContentAlphas() {
+    public void resetAllContentAlphas() {
         mLogger.logResetAllContentAlphas(getEntry());
         mPrivateLayout.setAlpha(1f);
         mPrivateLayout.setLayerType(LAYER_TYPE_NONE, null);
@@ -3873,7 +3873,11 @@
             pw.print(", mShowingPublicInitialized: " + mShowingPublicInitialized);
             NotificationContentView showingLayout = getShowingLayout();
             pw.print(", privateShowing: " + (showingLayout == mPrivateLayout));
+            pw.print(", childrenContainerShowing: "
+                    + (!shouldShowPublic() && mIsSummaryWithChildren));
             pw.print(", mShowNoBackground: " + mShowNoBackground);
+            pw.print(", clipBounds: " + getClipBounds());
+
             pw.println();
             if (NotificationContentView.INCLUDE_HEIGHTS_TO_DUMP) {
                 dumpHeights(pw);
@@ -3897,6 +3901,8 @@
                     ? 0 : mChildrenContainer.getTransientViewCount();
             if (mIsSummaryWithChildren || transientViewCount > 0) {
                 pw.println(mChildrenContainer.debugString());
+                pw.println("Children Container Intrinsic Height: "
+                        + mChildrenContainer.getIntrinsicHeight());
                 pw.println();
                 List<ExpandableNotificationRow> notificationChildren = getAttachedChildren();
                 pw.print("Children: " + notificationChildren.size() + " {");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
index 8c80fd4..69f45db 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
@@ -203,13 +203,16 @@
                 messagingStyle = mConversationProcessor
                         .processNotification(entry, builder, mLogger);
             }
-            result.mInflatedSingleLineViewModel = SingleLineViewInflater
+            SingleLineViewModel viewModel = SingleLineViewInflater
                     .inflateSingleLineViewModel(
                             entry.getSbn().getNotification(),
                             messagingStyle,
                             builder,
                             row.getContext()
                     );
+            // If the messagingStyle is null, we want to inflate the normal view
+            isConversation = viewModel.isConversation();
+            result.mInflatedSingleLineViewModel = viewModel;
             result.mInflatedSingleLineView =
                     SingleLineViewInflater.inflatePrivateSingleLineView(
                             isConversation,
@@ -357,11 +360,11 @@
         if ((contentViews & FLAG_CONTENT_VIEW_PUBLIC) != 0) {
             row.getPublicLayout().removeContentInactiveRunnable(VISIBLE_TYPE_CONTRACTED);
         }
-        if (AsyncHybridViewInflation.isEnabled()
+        if (LockscreenOtpRedaction.isEnabled()
                 && (contentViews & FLAG_CONTENT_VIEW_PUBLIC_SINGLE_LINE) != 0) {
             row.getPublicLayout().removeContentInactiveRunnable(VISIBLE_TYPE_SINGLELINE);
         }
-        if (LockscreenOtpRedaction.isEnabled()
+        if (AsyncHybridViewInflation.isEnabled()
                 && (contentViews & FLAG_CONTENT_VIEW_SINGLE_LINE) != 0) {
             row.getPrivateLayout().removeContentInactiveRunnable(VISIBLE_TYPE_SINGLELINE);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
index 48c974a..9166e7e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
@@ -76,8 +76,6 @@
 import com.android.systemui.util.Compile;
 import com.android.systemui.util.DumpUtilsKt;
 
-import kotlinx.coroutines.DisposableHandle;
-
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -116,10 +114,6 @@
     @VisibleForTesting
     protected HybridNotificationView mSingleLineView;
 
-    @Nullable public DisposableHandle mContractedBinderHandle;
-    @Nullable public DisposableHandle mExpandedBinderHandle;
-    @Nullable public DisposableHandle mHeadsUpBinderHandle;
-
     private RemoteInputView mExpandedRemoteInput;
     private RemoteInputView mHeadsUpRemoteInput;
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt
index c342bcd..b166def 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt
@@ -46,9 +46,6 @@
 import com.android.systemui.statusbar.notification.ConversationNotificationProcessor
 import com.android.systemui.statusbar.notification.InflationException
 import com.android.systemui.statusbar.notification.collection.NotificationEntry
-import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.InflatedContentViewHolder
-import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.KeepExistingView
-import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.NullContentView
 import com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_CONTRACTED
 import com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_EXPANDED
 import com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_HEADSUP
@@ -71,7 +68,6 @@
 import com.android.systemui.statusbar.notification.row.shared.NewRemoteViews
 import com.android.systemui.statusbar.notification.row.shared.NotificationContentModel
 import com.android.systemui.statusbar.notification.row.shared.NotificationRowContentBinderRefactor
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel
 import com.android.systemui.statusbar.notification.row.ui.viewbinder.SingleLineViewBinder
 import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper
 import com.android.systemui.statusbar.notification.stack.NotificationChildrenContainer
@@ -95,8 +91,6 @@
     private val remoteViewCache: NotifRemoteViewCache,
     private val remoteInputManager: NotificationRemoteInputManager,
     private val conversationProcessor: ConversationNotificationProcessor,
-    private val ronExtractor: RichOngoingNotificationContentExtractor,
-    private val ronInflater: RichOngoingNotificationViewInflater,
     @NotifInflation private val inflationExecutor: Executor,
     private val smartReplyStateInflater: SmartReplyStateInflater,
     private val notifLayoutInflaterFactoryProvider: NotifLayoutInflaterFactory.Provider,
@@ -144,8 +138,6 @@
                 remoteViewCache,
                 entry,
                 conversationProcessor,
-                ronExtractor,
-                ronInflater,
                 row,
                 bindParams.isMinimized,
                 bindParams.usesIncreasedHeight,
@@ -190,7 +182,6 @@
                 notifLayoutInflaterFactoryProvider = notifLayoutInflaterFactoryProvider,
                 headsUpStyleProvider = headsUpStyleProvider,
                 conversationProcessor = conversationProcessor,
-                ronExtractor = ronExtractor,
                 logger = logger,
             )
         inflateSmartReplyViews(
@@ -282,22 +273,16 @@
         when (inflateFlag) {
             FLAG_CONTENT_VIEW_CONTRACTED ->
                 row.privateLayout.performWhenContentInactive(VISIBLE_TYPE_CONTRACTED) {
-                    row.privateLayout.mContractedBinderHandle?.dispose()
-                    row.privateLayout.mContractedBinderHandle = null
                     row.privateLayout.setContractedChild(null)
                     remoteViewCache.removeCachedView(entry, FLAG_CONTENT_VIEW_CONTRACTED)
                 }
             FLAG_CONTENT_VIEW_EXPANDED ->
                 row.privateLayout.performWhenContentInactive(VISIBLE_TYPE_EXPANDED) {
-                    row.privateLayout.mExpandedBinderHandle?.dispose()
-                    row.privateLayout.mExpandedBinderHandle = null
                     row.privateLayout.setExpandedChild(null)
                     remoteViewCache.removeCachedView(entry, FLAG_CONTENT_VIEW_EXPANDED)
                 }
             FLAG_CONTENT_VIEW_HEADS_UP ->
                 row.privateLayout.performWhenContentInactive(VISIBLE_TYPE_HEADSUP) {
-                    row.privateLayout.mHeadsUpBinderHandle?.dispose()
-                    row.privateLayout.mHeadsUpBinderHandle = null
                     row.privateLayout.setHeadsUpChild(null)
                     remoteViewCache.removeCachedView(entry, FLAG_CONTENT_VIEW_HEADS_UP)
                     row.privateLayout.setHeadsUpInflatedSmartReplies(null)
@@ -378,8 +363,6 @@
         private val remoteViewCache: NotifRemoteViewCache,
         private val entry: NotificationEntry,
         private val conversationProcessor: ConversationNotificationProcessor,
-        private val ronExtractor: RichOngoingNotificationContentExtractor,
-        private val ronInflater: RichOngoingNotificationViewInflater,
         private val row: ExpandableNotificationRow,
         private val isMinimized: Boolean,
         private val usesIncreasedHeight: Boolean,
@@ -459,7 +442,6 @@
                     notifLayoutInflaterFactoryProvider = notifLayoutInflaterFactoryProvider,
                     headsUpStyleProvider = headsUpStyleProvider,
                     conversationProcessor = conversationProcessor,
-                    ronExtractor = ronExtractor,
                     logger = logger
                 )
             logger.logAsyncTaskProgress(
@@ -506,90 +488,6 @@
                     }
             }
 
-            val richOngoingContentModel = inflationProgress.contentModel.richOngoingContentModel
-
-            if (
-                richOngoingContentModel != null &&
-                    reInflateFlags and CONTENT_VIEWS_TO_CREATE_RICH_ONGOING != 0
-            ) {
-                logger.logAsyncTaskProgress(entry, "inflating RON view")
-                val inflateContractedView = reInflateFlags and FLAG_CONTENT_VIEW_CONTRACTED != 0
-                val inflateExpandedView = reInflateFlags and FLAG_CONTENT_VIEW_EXPANDED != 0
-                val inflateHeadsUpView = reInflateFlags and FLAG_CONTENT_VIEW_HEADS_UP != 0
-
-                inflationProgress.contractedRichOngoingNotificationViewHolder =
-                    if (inflateContractedView) {
-                        ronInflater.inflateView(
-                            contentModel = richOngoingContentModel,
-                            existingView = row.privateLayout.contractedChild,
-                            entry = entry,
-                            systemUiContext = context,
-                            parentView = row.privateLayout,
-                            viewType = RichOngoingNotificationViewType.Contracted
-                        )
-                    } else {
-                        if (
-                            ronInflater.canKeepView(
-                                contentModel = richOngoingContentModel,
-                                existingView = row.privateLayout.contractedChild,
-                                viewType = RichOngoingNotificationViewType.Contracted
-                            )
-                        ) {
-                            KeepExistingView
-                        } else {
-                            NullContentView
-                        }
-                    }
-
-                inflationProgress.expandedRichOngoingNotificationViewHolder =
-                    if (inflateExpandedView) {
-                        ronInflater.inflateView(
-                            contentModel = richOngoingContentModel,
-                            existingView = row.privateLayout.expandedChild,
-                            entry = entry,
-                            systemUiContext = context,
-                            parentView = row.privateLayout,
-                            viewType = RichOngoingNotificationViewType.Expanded
-                        )
-                    } else {
-                        if (
-                            ronInflater.canKeepView(
-                                contentModel = richOngoingContentModel,
-                                existingView = row.privateLayout.expandedChild,
-                                viewType = RichOngoingNotificationViewType.Expanded
-                            )
-                        ) {
-                            KeepExistingView
-                        } else {
-                            NullContentView
-                        }
-                    }
-
-                inflationProgress.headsUpRichOngoingNotificationViewHolder =
-                    if (inflateHeadsUpView) {
-                        ronInflater.inflateView(
-                            contentModel = richOngoingContentModel,
-                            existingView = row.privateLayout.headsUpChild,
-                            entry = entry,
-                            systemUiContext = context,
-                            parentView = row.privateLayout,
-                            viewType = RichOngoingNotificationViewType.HeadsUp
-                        )
-                    } else {
-                        if (
-                            ronInflater.canKeepView(
-                                contentModel = richOngoingContentModel,
-                                existingView = row.privateLayout.headsUpChild,
-                                viewType = RichOngoingNotificationViewType.HeadsUp
-                            )
-                        ) {
-                            KeepExistingView
-                        } else {
-                            NullContentView
-                        }
-                    }
-            }
-
             logger.logAsyncTaskProgress(entry, "getting row image resolver (on wrong thread!)")
             val imageResolver = row.imageResolver
             // wait for image resolver to finish preloading
@@ -695,9 +593,6 @@
         var inflatedSmartReplyState: InflatedSmartReplyState? = null
         var expandedInflatedSmartReplies: InflatedSmartReplyViewHolder? = null
         var headsUpInflatedSmartReplies: InflatedSmartReplyViewHolder? = null
-        var contractedRichOngoingNotificationViewHolder: ContentViewInflationResult? = null
-        var expandedRichOngoingNotificationViewHolder: ContentViewInflationResult? = null
-        var headsUpRichOngoingNotificationViewHolder: ContentViewInflationResult? = null
 
         // Inflated SingleLineView that lacks the UI State
         var inflatedSingleLineView: HybridNotificationView? = null
@@ -734,7 +629,6 @@
             val inflateHeadsUp =
                 (reInflateFlags and FLAG_CONTENT_VIEW_HEADS_UP != 0 &&
                     result.remoteViews.headsUp != null)
-
             if (inflateContracted || inflateExpanded || inflateHeadsUp) {
                 logger.logAsyncTaskProgress(entry, "inflating contracted smart reply state")
                 result.inflatedSmartReplyState = inflater.inflateSmartReplyState(entry)
@@ -776,7 +670,6 @@
             notifLayoutInflaterFactoryProvider: NotifLayoutInflaterFactory.Provider,
             headsUpStyleProvider: HeadsUpStyleProvider,
             conversationProcessor: ConversationNotificationProcessor,
-            ronExtractor: RichOngoingNotificationContentExtractor,
             logger: NotificationRowContentBinderLogger
         ): InflationProgress {
             // process conversations and extract the messaging style
@@ -785,24 +678,9 @@
                     conversationProcessor.processNotification(entry, builder, logger)
                 } else null
 
-            val richOngoingContentModel =
-                if (reInflateFlags and CONTENT_VIEWS_TO_CREATE_RICH_ONGOING != 0) {
-                    ronExtractor.extractContentModel(
-                        entry = entry,
-                        builder = builder,
-                        systemUIContext = systemUIContext,
-                        packageContext = packageContext
-                    )
-                } else {
-                    // if we're not re-inflating any RON views, make sure the model doesn't change
-                    entry.richOngoingContentModel.value
-                }
-
-            val remoteViewsFlags = getRemoteViewsFlags(reInflateFlags, richOngoingContentModel)
-
             val remoteViews =
                 createRemoteViews(
-                    reInflateFlags = remoteViewsFlags,
+                    reInflateFlags = reInflateFlags,
                     builder = builder,
                     isMinimized = isMinimized,
                     usesIncreasedHeight = usesIncreasedHeight,
@@ -850,7 +728,6 @@
                     headsUpStatusBarModel = headsUpStatusBarModel,
                     singleLineViewModel = singleLineViewModel,
                     publicSingleLineViewModel = publicSingleLineViewModel,
-                    richOngoingContentModel = richOngoingContentModel,
                 )
 
             return InflationProgress(
@@ -1506,31 +1383,11 @@
             }
             logger.logAsyncTaskProgress(entry, "finishing")
 
-            // before updating the content model, stop existing binding if necessary
-            if (result.contractedRichOngoingNotificationViewHolder.shouldDisposeViewBinder()) {
-                row.privateLayout.mContractedBinderHandle?.dispose()
-                row.privateLayout.mContractedBinderHandle = null
-            }
-
-            if (result.expandedRichOngoingNotificationViewHolder.shouldDisposeViewBinder()) {
-                row.privateLayout.mExpandedBinderHandle?.dispose()
-                row.privateLayout.mExpandedBinderHandle = null
-            }
-
-            if (result.headsUpRichOngoingNotificationViewHolder.shouldDisposeViewBinder()) {
-                row.privateLayout.mHeadsUpBinderHandle?.dispose()
-                row.privateLayout.mHeadsUpBinderHandle = null
-            }
-
-            // set the content model after disposal and before setting new rich ongoing view
             entry.setContentModel(result.contentModel)
             result.inflatedSmartReplyState?.let { row.privateLayout.setInflatedSmartReplyState(it) }
 
-            // set normal remote views (skipping rich ongoing states when that model exists)
-            val remoteViewsFlags =
-                getRemoteViewsFlags(reInflateFlags, result.contentModel.richOngoingContentModel)
             setContentViewsFromRemoteViews(
-                remoteViewsFlags,
+                reInflateFlags,
                 entry,
                 remoteViewCache,
                 result,
@@ -1538,7 +1395,6 @@
                 isMinimized,
             )
 
-            // set single line view
             if (
                 AsyncHybridViewInflation.isEnabled &&
                     reInflateFlags and FLAG_CONTENT_VIEW_SINGLE_LINE != 0
@@ -1563,55 +1419,6 @@
                 }
             }
 
-            val hasRichOngoingViewHolder =
-                result.contractedRichOngoingNotificationViewHolder != null ||
-                    result.expandedRichOngoingNotificationViewHolder != null ||
-                    result.headsUpRichOngoingNotificationViewHolder != null
-
-            if (hasRichOngoingViewHolder) {
-                // after updating the content model, set the view, then start the new binder
-                result.contractedRichOngoingNotificationViewHolder?.let { contractedViewHolder ->
-                    if (contractedViewHolder is InflatedContentViewHolder) {
-                        row.privateLayout.contractedChild = contractedViewHolder.view
-                        row.privateLayout.mContractedBinderHandle =
-                            contractedViewHolder.binder.setupContentViewBinder()
-                    } else if (contractedViewHolder == NullContentView) {
-                        row.privateLayout.contractedChild = null
-                    }
-                }
-
-                result.expandedRichOngoingNotificationViewHolder?.let { expandedViewHolder ->
-                    if (expandedViewHolder is InflatedContentViewHolder) {
-                        row.privateLayout.expandedChild = expandedViewHolder.view
-                        row.privateLayout.mExpandedBinderHandle =
-                            expandedViewHolder.binder.setupContentViewBinder()
-                    } else if (expandedViewHolder == NullContentView) {
-                        row.privateLayout.expandedChild = null
-                    }
-                }
-
-                result.headsUpRichOngoingNotificationViewHolder?.let { headsUpViewHolder ->
-                    if (headsUpViewHolder is InflatedContentViewHolder) {
-                        row.privateLayout.headsUpChild = headsUpViewHolder.view
-                        row.privateLayout.mHeadsUpBinderHandle =
-                            headsUpViewHolder.binder.setupContentViewBinder()
-                    } else if (headsUpViewHolder == NullContentView) {
-                        row.privateLayout.headsUpChild = null
-                    }
-                }
-
-                // clean remoteViewCache when we don't keep existing views.
-                remoteViewCache.removeCachedView(entry, FLAG_CONTENT_VIEW_CONTRACTED)
-                remoteViewCache.removeCachedView(entry, FLAG_CONTENT_VIEW_EXPANDED)
-                remoteViewCache.removeCachedView(entry, FLAG_CONTENT_VIEW_HEADS_UP)
-
-                // Since RONs don't support smart reply, remove them from HUNs and Expanded.
-                row.privateLayout.setExpandedInflatedSmartReplies(null)
-                row.privateLayout.setHeadsUpInflatedSmartReplies(null)
-
-                row.setExpandable(row.privateLayout.expandedChild != null)
-            }
-
             Trace.endAsyncSection(APPLY_TRACE_METHOD, System.identityHashCode(row))
             endListener?.onAsyncInflationFinished(entry)
             return true
@@ -1775,21 +1582,6 @@
                     !oldView.hasFlags(RemoteViews.FLAG_REAPPLY_DISALLOWED)
         }
 
-        @InflationFlag
-        private fun getRemoteViewsFlags(
-            @InflationFlag reInflateFlags: Int,
-            richOngoingContentModel: RichOngoingContentModel?
-        ): Int =
-            if (richOngoingContentModel != null) {
-                reInflateFlags and CONTENT_VIEWS_TO_CREATE_RICH_ONGOING.inv()
-            } else {
-                reInflateFlags
-            }
-
-        @InflationFlag
-        private const val CONTENT_VIEWS_TO_CREATE_RICH_ONGOING =
-            FLAG_CONTENT_VIEW_CONTRACTED or FLAG_CONTENT_VIEW_EXPANDED or FLAG_CONTENT_VIEW_HEADS_UP
-
         private const val ASYNC_TASK_TRACE_METHOD =
             "NotificationRowContentBinderImpl.AsyncInflationTask"
         private const val APPLY_TRACE_METHOD = "NotificationRowContentBinderImpl#apply"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowModule.java
index c630c4d..84f2f66 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowModule.java
@@ -18,8 +18,6 @@
 
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.statusbar.notification.row.shared.NotificationRowContentBinderRefactor;
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag;
-import com.android.systemui.statusbar.notification.row.ui.viewmodel.RichOngoingViewModelComponent;
 
 import dagger.Binds;
 import dagger.Module;
@@ -30,7 +28,7 @@
 /**
  * Dagger Module containing notification row and view inflation implementations.
  */
-@Module(subcomponents = {RichOngoingViewModelComponent.class})
+@Module
 public abstract class NotificationRowModule {
 
     /**
@@ -49,25 +47,6 @@
         }
     }
 
-    /** Provides ron content model extractor. */
-    @Provides
-    @SysUISingleton
-    public static RichOngoingNotificationContentExtractor provideRonContentExtractor(
-            Provider<RichOngoingNotificationContentExtractorImpl> realImpl
-    ) {
-        if (RichOngoingNotificationFlag.isEnabled()) {
-            return realImpl.get();
-        } else {
-            return new NoOpRichOngoingNotificationContentExtractor();
-        }
-    }
-
-    /** Provides ron view inflater. */
-    @Binds
-    @SysUISingleton
-    public abstract RichOngoingNotificationViewInflater provideRonViewInflater(
-            RichOngoingNotificationViewInflaterImpl impl);
-
     /**
      * Provides notification remote view cache instance.
      */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RichOngoingNotificationContentExtractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RichOngoingNotificationContentExtractor.kt
deleted file mode 100644
index da29b0f..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RichOngoingNotificationContentExtractor.kt
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row
-
-import android.app.Notification
-import android.app.PendingIntent
-import android.content.Context
-import android.util.Log
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.statusbar.notification.collection.NotificationEntry
-import com.android.systemui.statusbar.notification.row.shared.EnRouteContentModel
-import com.android.systemui.statusbar.notification.row.shared.IconModel
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag
-import com.android.systemui.statusbar.notification.row.shared.TimerContentModel
-import java.time.Duration
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.ZoneId
-import javax.inject.Inject
-
-/**
- * Interface which provides a [RichOngoingContentModel] for a given [Notification] when one is
- * applicable to the given style.
- */
-interface RichOngoingNotificationContentExtractor {
-    fun extractContentModel(
-        entry: NotificationEntry,
-        builder: Notification.Builder,
-        systemUIContext: Context,
-        packageContext: Context
-    ): RichOngoingContentModel?
-}
-
-class NoOpRichOngoingNotificationContentExtractor : RichOngoingNotificationContentExtractor {
-    override fun extractContentModel(
-        entry: NotificationEntry,
-        builder: Notification.Builder,
-        systemUIContext: Context,
-        packageContext: Context
-    ): RichOngoingContentModel? = null
-}
-
-@SysUISingleton
-class RichOngoingNotificationContentExtractorImpl @Inject constructor() :
-    RichOngoingNotificationContentExtractor {
-
-    init {
-        /* check if */ RichOngoingNotificationFlag.isUnexpectedlyInLegacyMode()
-    }
-
-    override fun extractContentModel(
-        entry: NotificationEntry,
-        builder: Notification.Builder,
-        systemUIContext: Context,
-        packageContext: Context
-    ): RichOngoingContentModel? {
-        val sbn = entry.sbn
-        val notification = sbn.notification
-        val icon = IconModel(notification.smallIcon)
-
-        try {
-            return if (sbn.packageName == "com.google.android.deskclock") {
-                when (notification.channelId) {
-                    "Timers v2" -> {
-                        parseTimerNotification(notification, icon)
-                    }
-                    "Stopwatch v2" -> {
-                        Log.i("RONs", "Can't process stopwatch yet")
-                        null
-                    }
-                    else -> {
-                        Log.i("RONs", "Can't process channel '${notification.channelId}'")
-                        null
-                    }
-                }
-            } else if (builder.style is Notification.EnRouteStyle) {
-                parseEnRouteNotification(notification, icon)
-            } else null
-        } catch (e: Exception) {
-            Log.e("RONs", "Error parsing RON", e)
-            return null
-        }
-    }
-
-    /**
-     * FOR PROTOTYPING ONLY: create a RON TimerContentModel using the time information available
-     * inside the sortKey of the clock app's timer notifications.
-     */
-    private fun parseTimerNotification(
-        notification: Notification,
-        icon: IconModel
-    ): TimerContentModel {
-        // sortKey=1 0|↺7|RUNNING|▶16:21:58.523|Σ0:05:00|Δ0:00:03|⏳0:04:57
-        // sortKey=1 0|↺7|PAUSED|Σ0:05:00|Δ0:04:54|⏳0:00:06
-        // sortKey=1 1|↺7|RUNNING|▶16:30:28.433|Σ0:04:05|Δ0:00:06|⏳0:03:59
-        // sortKey=1 0|↺7|RUNNING|▶16:36:18.350|Σ0:05:00|Δ0:01:42|⏳0:03:18
-        // sortKey=1 2|↺7|RUNNING|▶16:38:37.816|Σ0:02:00|Δ0:01:09|⏳0:00:51
-        // ▶ = "current" time (when updated)
-        // Σ = total time
-        // Δ = time elapsed
-        // ⏳ = time remaining
-        val sortKey = notification.sortKey
-        val (_, _, state, extra) = sortKey.split("|", limit = 4)
-        return when (state) {
-            "PAUSED" -> {
-                val (total, _, remaining) = extra.split("|")
-                val timeRemaining = parseTimeDelta(remaining)
-                TimerContentModel(
-                    icon = icon,
-                    // TODO: b/352142761 - define and use a string resource rather than " Timer".
-                    // (The UX isn't final so using " Timer" for now).
-                    name = total.replace("Σ", "") + " Timer",
-                    state =
-                        TimerContentModel.TimerState.Paused(
-                            timeRemaining = timeRemaining,
-                            resumeIntent = notification.findStartIntent(),
-                            addMinuteAction = notification.findAddMinuteAction(),
-                            resetAction = notification.findResetAction(),
-                        )
-                )
-            }
-            "RUNNING" -> {
-                val (current, total, _, remaining) = extra.split("|")
-                val finishTime = parseCurrentTime(current) + parseTimeDelta(remaining).toMillis()
-                TimerContentModel(
-                    icon = icon,
-                    // TODO: b/352142761 - define and use a string resource rather than " Timer".
-                    // (The UX isn't final so using " Timer" for now).
-                    name = total.replace("Σ", "") + " Timer",
-                    state =
-                        TimerContentModel.TimerState.Running(
-                            finishTime = finishTime,
-                            pauseIntent = notification.findPauseIntent(),
-                            addMinuteAction = notification.findAddMinuteAction(),
-                            resetAction = notification.findResetAction(),
-                        )
-                )
-            }
-            else -> error("unknown state ($state) in sortKey=$sortKey")
-        }
-    }
-
-    private fun Notification.findPauseIntent(): PendingIntent? {
-        return actions
-            .firstOrNull { it.actionIntent.intent?.action?.endsWith(".PAUSE_TIMER") == true }
-            ?.actionIntent
-    }
-
-    private fun Notification.findStartIntent(): PendingIntent? {
-        return actions
-            .firstOrNull { it.actionIntent.intent?.action?.endsWith(".START_TIMER") == true }
-            ?.actionIntent
-    }
-
-    // TODO: b/352142761 - switch to system attributes for label and icon.
-    //   - We probably want a consistent look for the Reset button. (Double check with UX.)
-    //   - Using the custom assets now since I couldn't an existing "Reset" icon.
-    private fun Notification.findResetAction(): Notification.Action? {
-        return actions.firstOrNull {
-            it.actionIntent.intent?.action?.endsWith(".RESET_TIMER") == true
-        }
-    }
-
-    // TODO: b/352142761 - check with UX on whether this should be required.
-    //   - Alternative is to allow for optional actions in addition to main and reset.
-    //   - For optional actions, we should take the custom label and icon.
-    private fun Notification.findAddMinuteAction(): Notification.Action? {
-        return actions.firstOrNull {
-            it.actionIntent.intent?.action?.endsWith(".ADD_MINUTE_TIMER") == true
-        }
-    }
-
-    private fun parseCurrentTime(current: String): Long {
-        val (hour, minute, second, millis) = current.replace("▶", "").split(":", ".")
-        // NOTE: this won't work correctly at/around midnight.  It's just for prototyping.
-        val localDateTime =
-            LocalDateTime.of(
-                LocalDate.now(),
-                LocalTime.of(hour.toInt(), minute.toInt(), second.toInt(), millis.toInt() * 1000000)
-            )
-        val offset = ZoneId.systemDefault().rules.getOffset(localDateTime)
-        return localDateTime.toInstant(offset).toEpochMilli()
-    }
-
-    private fun parseTimeDelta(delta: String): Duration {
-        val (hour, minute, second) = delta.replace("Σ", "").replace("⏳", "").split(":")
-        return Duration.ofHours(hour.toLong())
-            .plusMinutes(minute.toLong())
-            .plusSeconds(second.toLong())
-    }
-
-    private fun parseEnRouteNotification(
-        notification: Notification,
-        icon: IconModel,
-    ): EnRouteContentModel {
-        return EnRouteContentModel(
-            smallIcon = icon,
-            title = notification.extras.getCharSequence(Notification.EXTRA_TITLE),
-            text = notification.extras.getCharSequence(Notification.EXTRA_TEXT),
-        )
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RichOngoingNotificationViewInflater.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RichOngoingNotificationViewInflater.kt
deleted file mode 100644
index 77c4130..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RichOngoingNotificationViewInflater.kt
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row
-
-import android.app.Notification
-import android.content.Context
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.res.R
-import com.android.systemui.statusbar.notification.collection.NotificationEntry
-import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.InflatedContentViewHolder
-import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.KeepExistingView
-import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.NullContentView
-import com.android.systemui.statusbar.notification.row.shared.EnRouteContentModel
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag
-import com.android.systemui.statusbar.notification.row.shared.TimerContentModel
-import com.android.systemui.statusbar.notification.row.ui.view.EnRouteView
-import com.android.systemui.statusbar.notification.row.ui.view.TimerView
-import com.android.systemui.statusbar.notification.row.ui.viewbinder.EnRouteViewBinder
-import com.android.systemui.statusbar.notification.row.ui.viewbinder.TimerViewBinder
-import com.android.systemui.statusbar.notification.row.ui.viewmodel.EnRouteViewModel
-import com.android.systemui.statusbar.notification.row.ui.viewmodel.RichOngoingViewModelComponent
-import com.android.systemui.statusbar.notification.row.ui.viewmodel.TimerViewModel
-import javax.inject.Inject
-import kotlinx.coroutines.DisposableHandle
-
-fun interface DeferredContentViewBinder {
-    fun setupContentViewBinder(): DisposableHandle
-}
-
-enum class RichOngoingNotificationViewType {
-    Contracted,
-    Expanded,
-    HeadsUp,
-}
-
-/**
- * * Supertype of the 3 different possible result types of
- *   [RichOngoingNotificationViewInflater.inflateView].
- */
-sealed interface ContentViewInflationResult {
-
-    /** Indicates that the content view should be removed if present. */
-    data object NullContentView : ContentViewInflationResult
-
-    /**
-     * Indicates that the content view (which *must be* present) should be unmodified during this
-     * inflation.
-     */
-    data object KeepExistingView : ContentViewInflationResult
-
-    /**
-     * Contains the new view and binder that should replace any existing content view for this slot.
-     */
-    data class InflatedContentViewHolder(val view: View, val binder: DeferredContentViewBinder) :
-        ContentViewInflationResult
-}
-
-fun ContentViewInflationResult?.shouldDisposeViewBinder() = this !is KeepExistingView
-
-/**
- * Interface which provides a [RichOngoingContentModel] for a given [Notification] when one is
- * applicable to the given style.
- */
-interface RichOngoingNotificationViewInflater {
-    fun inflateView(
-        contentModel: RichOngoingContentModel,
-        existingView: View?,
-        entry: NotificationEntry,
-        systemUiContext: Context,
-        parentView: ViewGroup,
-        viewType: RichOngoingNotificationViewType,
-    ): ContentViewInflationResult
-
-    fun canKeepView(
-        contentModel: RichOngoingContentModel,
-        existingView: View?,
-        viewType: RichOngoingNotificationViewType
-    ): Boolean
-}
-
-@SysUISingleton
-class RichOngoingNotificationViewInflaterImpl
-@Inject
-constructor(
-    private val viewModelComponentFactory: RichOngoingViewModelComponent.Factory,
-) : RichOngoingNotificationViewInflater {
-
-    override fun inflateView(
-        contentModel: RichOngoingContentModel,
-        existingView: View?,
-        entry: NotificationEntry,
-        systemUiContext: Context,
-        parentView: ViewGroup,
-        viewType: RichOngoingNotificationViewType,
-    ): ContentViewInflationResult {
-        if (RichOngoingNotificationFlag.isUnexpectedlyInLegacyMode()) return NullContentView
-        val component = viewModelComponentFactory.create(entry)
-        return when (contentModel) {
-            is TimerContentModel ->
-                inflateTimerView(
-                    existingView,
-                    component::createTimerViewModel,
-                    systemUiContext,
-                    parentView,
-                    viewType
-                )
-            is EnRouteContentModel ->
-                inflateEnRouteView(
-                    existingView,
-                    component::createEnRouteViewModel,
-                    systemUiContext,
-                    parentView,
-                    viewType
-                )
-            else -> TODO("Not yet implemented")
-        }
-    }
-
-    override fun canKeepView(
-        contentModel: RichOngoingContentModel,
-        existingView: View?,
-        viewType: RichOngoingNotificationViewType
-    ): Boolean {
-        if (RichOngoingNotificationFlag.isUnexpectedlyInLegacyMode()) return false
-        return when (contentModel) {
-            is TimerContentModel -> canKeepTimerView(contentModel, existingView, viewType)
-            is EnRouteContentModel -> canKeepEnRouteView(contentModel, existingView, viewType)
-            else -> TODO("Not yet implemented")
-        }
-    }
-
-    private fun inflateTimerView(
-        existingView: View?,
-        createViewModel: () -> TimerViewModel,
-        systemUiContext: Context,
-        parentView: ViewGroup,
-        viewType: RichOngoingNotificationViewType,
-    ): ContentViewInflationResult {
-        if (existingView is TimerView && !existingView.isReinflateNeeded()) return KeepExistingView
-
-        return when (viewType) {
-            RichOngoingNotificationViewType.Contracted -> {
-                val newView =
-                    LayoutInflater.from(systemUiContext)
-                        .inflate(
-                            R.layout.rich_ongoing_timer_notification,
-                            parentView,
-                            /* attachToRoot= */ false
-                        ) as TimerView
-                InflatedContentViewHolder(newView) {
-                    TimerViewBinder.bindWhileAttached(newView, createViewModel())
-                }
-            }
-            RichOngoingNotificationViewType.Expanded,
-            RichOngoingNotificationViewType.HeadsUp -> NullContentView
-        }
-    }
-
-    private fun canKeepTimerView(
-        contentModel: TimerContentModel,
-        existingView: View?,
-        viewType: RichOngoingNotificationViewType
-    ): Boolean = true
-
-    private fun inflateEnRouteView(
-        existingView: View?,
-        createViewModel: () -> EnRouteViewModel,
-        systemUiContext: Context,
-        parentView: ViewGroup,
-        viewType: RichOngoingNotificationViewType,
-    ): ContentViewInflationResult {
-        if (existingView is EnRouteView && !existingView.isReinflateNeeded())
-            return KeepExistingView
-        return when (viewType) {
-            RichOngoingNotificationViewType.Contracted -> {
-                val newView =
-                    LayoutInflater.from(systemUiContext)
-                        .inflate(
-                            R.layout.notification_template_en_route_contracted,
-                            parentView,
-                            /* attachToRoot= */ false
-                        ) as EnRouteView
-                InflatedContentViewHolder(newView) {
-                    EnRouteViewBinder.bindWhileAttached(newView, createViewModel())
-                }
-            }
-            RichOngoingNotificationViewType.Expanded -> {
-                val newView =
-                    LayoutInflater.from(systemUiContext)
-                        .inflate(
-                            R.layout.notification_template_en_route_expanded,
-                            parentView,
-                            /* attachToRoot= */ false
-                        ) as EnRouteView
-                InflatedContentViewHolder(newView) {
-                    EnRouteViewBinder.bindWhileAttached(newView, createViewModel())
-                }
-            }
-            RichOngoingNotificationViewType.HeadsUp -> NullContentView
-        }
-    }
-
-    private fun canKeepEnRouteView(
-        contentModel: EnRouteContentModel,
-        existingView: View?,
-        viewType: RichOngoingNotificationViewType
-    ): Boolean = true
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/StackScrollerDecorView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/StackScrollerDecorView.java
index 291dc13..cd228e7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/StackScrollerDecorView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/StackScrollerDecorView.java
@@ -72,14 +72,24 @@
     }
 
     /**
+     * See {@link #setVisible(boolean, boolean, Consumer)}.
+     */
+    public void setVisible(boolean visible, boolean animate) {
+        setVisible(visible, animate, null /* onAnimationEnded */);
+    }
+
+    /**
      * Make this view visible. If {@code false} is passed, the view will fade out its content
      * and set the view Visibility to GONE. If only the content should be changed,
      * {@link #setContentVisibleAnimated(boolean)} can be used.
      *
      * @param visible True if the contents should be visible.
      * @param animate True if we should fade to new visibility.
+     * @param onAnimationEnded Callback to run after visibility updates, takes a boolean as a
+     *                         parameter that represents whether the animation was cancelled.
      */
-    public void setVisible(boolean visible, boolean animate) {
+    public void setVisible(boolean visible, boolean animate,
+            Consumer<Boolean> onAnimationEnded) {
         if (mIsVisible != visible) {
             mIsVisible = visible;
             if (animate) {
@@ -90,10 +100,10 @@
                 } else {
                     setWillBeGone(true);
                 }
-                setContentVisible(visible, true /* animate */, null /* onAnimationEnded */);
+                setContentVisible(visible, true /* animate */, onAnimationEnded);
             } else {
                 setVisibility(visible ? VISIBLE : GONE);
-                setContentVisible(visible, false /* animate */, null /* onAnimationEnded */);
+                setContentVisible(visible, false /* animate */, onAnimationEnded);
                 setWillBeGone(false);
                 notifyHeightChanged(false /* needsAnimation */);
             }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/data/repository/NotificationRowRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/data/repository/NotificationRowRepository.kt
deleted file mode 100644
index bac887b..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/data/repository/NotificationRowRepository.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.data.repository
-
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel
-import kotlinx.coroutines.flow.StateFlow
-
-/** A repository of states relating to a specific notification row. */
-interface NotificationRowRepository {
-    /**
-     * A flow of an immutable data class with the current state of the Rich Ongoing Notification
-     * content, if applicable.
-     */
-    val richOngoingContentModel: StateFlow<RichOngoingContentModel?>
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/domain/interactor/NotificationRowInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/domain/interactor/NotificationRowInteractor.kt
deleted file mode 100644
index 72823a7..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/domain/interactor/NotificationRowInteractor.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.domain.interactor
-
-import com.android.systemui.statusbar.notification.row.data.repository.NotificationRowRepository
-import com.android.systemui.statusbar.notification.row.shared.EnRouteContentModel
-import com.android.systemui.statusbar.notification.row.shared.TimerContentModel
-import javax.inject.Inject
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.filterIsInstance
-
-/** Interactor specific to a particular notification row. */
-class NotificationRowInteractor @Inject constructor(repository: NotificationRowRepository) {
-    /** Content of a rich ongoing timer notification. */
-    val timerContentModel: Flow<TimerContentModel> =
-        repository.richOngoingContentModel.filterIsInstance<TimerContentModel>()
-
-    /** Content of a rich ongoing timer notification. */
-    val enRouteContentModel: Flow<EnRouteContentModel> =
-        repository.richOngoingContentModel.filterIsInstance<EnRouteContentModel>()
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/EnRouteContentModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/EnRouteContentModel.kt
deleted file mode 100644
index 7e78cca..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/EnRouteContentModel.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.shared
-
-/**
- * Represents something en route.
- *
- * @param smallIcon the main small icon of the EnRoute notification.
- * @param title the title of the EnRoute notification.
- * @param text the text of the EnRoute notification.
- */
-data class EnRouteContentModel(
-    val smallIcon: IconModel,
-    val title: CharSequence?,
-    val text: CharSequence?,
-) : RichOngoingContentModel
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/IconModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/IconModel.kt
deleted file mode 100644
index e611938..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/IconModel.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.shared
-
-import android.graphics.drawable.Drawable
-import android.graphics.drawable.Icon
-
-// TODO: figure out how to support lazy resolution of the drawable, e.g. on unrelated text change
-class IconModel(val icon: Icon) {
-    var drawable: Drawable? = null
-
-    override fun equals(other: Any?): Boolean =
-        when (other) {
-            null -> false
-            (other === this) -> true
-            !is IconModel -> false
-            else -> other.icon.sameAs(icon)
-        }
-
-    override fun toString(): String = "IconModel(icon=$icon, drawable=$drawable)"
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/NotificationContentModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/NotificationContentModel.kt
index 0f9a5a3..004c66b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/NotificationContentModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/NotificationContentModel.kt
@@ -22,7 +22,4 @@
     val headsUpStatusBarModel: HeadsUpStatusBarModel,
     val singleLineViewModel: SingleLineViewModel? = null,
     val publicSingleLineViewModel: SingleLineViewModel? = null,
-    val richOngoingContentModel: RichOngoingContentModel? = null,
 )
-
-sealed interface RichOngoingContentModel
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/RichOngoingClock.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/RichOngoingClock.kt
deleted file mode 100644
index 33b2564..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/RichOngoingClock.kt
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.shared
-
-import android.app.Notification
-import android.app.PendingIntent
-import java.time.Duration
-
-/**
- * Represents a simple timer that counts down to a time.
- *
- * @param name the label for the timer
- * @param state state of the timer, including time and whether it is paused or running
- */
-data class TimerContentModel(
-    val icon: IconModel,
-    val name: String,
-    val state: TimerState,
-) : RichOngoingContentModel {
-    /** The state (paused or running) of the timer, and relevant time */
-    sealed interface TimerState {
-        val addMinuteAction: Notification.Action?
-        val resetAction: Notification.Action?
-
-        /**
-         * Indicates a running timer
-         *
-         * @param finishTime the time in ms since epoch that the timer will finish
-         * @param pauseIntent the action for pausing the timer
-         */
-        data class Running(
-            val finishTime: Long,
-            val pauseIntent: PendingIntent?,
-            override val addMinuteAction: Notification.Action?,
-            override val resetAction: Notification.Action?,
-        ) : TimerState
-
-        /**
-         * Indicates a paused timer
-         *
-         * @param timeRemaining the time in ms remaining on the paused timer
-         * @param resumeIntent the action for resuming the timer
-         */
-        data class Paused(
-            val timeRemaining: Duration,
-            val resumeIntent: PendingIntent?,
-            override val addMinuteAction: Notification.Action?,
-            override val resetAction: Notification.Action?,
-        ) : TimerState
-    }
-}
-
-/**
- * Represents a simple stopwatch that counts up and allows tracking laps.
- *
- * @param state state of the stopwatch, including time and whether it is paused or running
- * @param lapDurations a list of durations of each completed lap
- */
-data class StopwatchContentModel(
-    val icon: IconModel,
-    val state: StopwatchState,
-    val lapDurations: List<Long>,
-) : RichOngoingContentModel {
-    /** The state (paused or running) of the stopwatch, and relevant time */
-    sealed interface StopwatchState {
-        /**
-         * Indicates a running stopwatch
-         *
-         * @param startTime the time in ms since epoch that the stopwatch started, plus any
-         *   accumulated pause time
-         * @param pauseIntent the action for pausing the stopwatch
-         */
-        data class Running(
-            val startTime: Long,
-            val pauseIntent: PendingIntent,
-        ) : StopwatchState
-
-        /**
-         * Indicates a paused stopwatch
-         *
-         * @param timeElapsed the time in ms elapsed on the stopwatch
-         * @param resumeIntent the action for resuming the stopwatch
-         */
-        data class Paused(
-            val timeElapsed: Duration,
-            val resumeIntent: PendingIntent,
-        ) : StopwatchState
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/RichOngoingNotificationFlag.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/RichOngoingNotificationFlag.kt
deleted file mode 100644
index 4a7f7cd..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/RichOngoingNotificationFlag.kt
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.shared
-
-import android.app.Flags
-import com.android.systemui.flags.FlagToken
-import com.android.systemui.flags.RefactorFlagUtils
-
-/** Helper for reading or using the api rich ongoing flag state. */
-@Suppress("NOTHING_TO_INLINE")
-object RichOngoingNotificationFlag {
-    /** The aconfig flag name */
-    const val FLAG_NAME = Flags.FLAG_API_RICH_ONGOING
-
-    /** A token used for dependency declaration */
-    val token: FlagToken
-        get() = FlagToken(FLAG_NAME, isEnabled)
-
-    /** Is the refactor enabled */
-    @JvmStatic
-    inline val isEnabled
-        get() = Flags.apiRichOngoing()
-
-    /**
-     * Called to ensure code is only run when the flag is enabled. This protects users from the
-     * unintended behaviors caused by accidentally running new logic, while also crashing on an eng
-     * build to ensure that the refactor author catches issues in testing.
-     */
-    @JvmStatic
-    inline fun isUnexpectedlyInLegacyMode() =
-        RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME)
-
-    /**
-     * Called to ensure code is only run when the flag is disabled. This will throw an exception if
-     * the flag is enabled to ensure that the refactor author catches issues in testing.
-     */
-    @JvmStatic
-    inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME)
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/ConfigurationTracker.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/ConfigurationTracker.kt
deleted file mode 100644
index 95c507c..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/ConfigurationTracker.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.ui.view
-
-import android.content.pm.ActivityInfo.CONFIG_ASSETS_PATHS
-import android.content.pm.ActivityInfo.CONFIG_DENSITY
-import android.content.pm.ActivityInfo.CONFIG_FONT_SCALE
-import android.content.pm.ActivityInfo.CONFIG_LAYOUT_DIRECTION
-import android.content.pm.ActivityInfo.CONFIG_LOCALE
-import android.content.pm.ActivityInfo.CONFIG_UI_MODE
-import android.content.res.Configuration
-import android.content.res.Resources
-
-/**
- * Tracks the active configuration when constructed and returns (when queried) whether the
- * configuration has unhandled changes.
- */
-class ConfigurationTracker(
-    private val resources: Resources,
-    private val unhandledConfigChanges: Int
-) {
-    private val initialConfig = Configuration(resources.configuration)
-
-    constructor(
-        resources: Resources,
-        handlesDensityFontScale: Boolean = false,
-        handlesTheme: Boolean = false,
-        handlesLocaleAndLayout: Boolean = true,
-    ) : this(
-        resources,
-        unhandledConfigChanges =
-            (if (handlesDensityFontScale) 0 else CONFIG_DENSITY or CONFIG_FONT_SCALE) or
-                (if (handlesTheme) 0 else CONFIG_ASSETS_PATHS or CONFIG_UI_MODE) or
-                (if (handlesLocaleAndLayout) 0 else CONFIG_LOCALE or CONFIG_LAYOUT_DIRECTION)
-    )
-
-    /**
-     * Whether the current configuration has unhandled changes relative to the initial configuration
-     */
-    fun hasUnhandledConfigChange(): Boolean =
-        initialConfig.diff(resources.configuration) and unhandledConfigChanges != 0
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/EnRouteView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/EnRouteView.kt
deleted file mode 100644
index e5c2b5f..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/EnRouteView.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.ui.view
-
-import android.content.Context
-import android.graphics.drawable.Icon
-import android.util.AttributeSet
-import android.widget.FrameLayout
-import android.widget.ImageView
-import android.widget.TextView
-import com.android.internal.R
-import com.android.internal.widget.NotificationExpandButton
-
-class EnRouteView
-@JvmOverloads
-constructor(
-    context: Context,
-    attrs: AttributeSet? = null,
-    defStyleAttr: Int = 0,
-    defStyleRes: Int = 0,
-) : FrameLayout(context, attrs, defStyleAttr, defStyleRes) {
-
-    private val configTracker = ConfigurationTracker(resources)
-
-    private lateinit var icon: ImageView
-    private lateinit var title: TextView
-    private lateinit var text: TextView
-    private lateinit var expandButton: NotificationExpandButton
-
-    override fun onFinishInflate() {
-        super.onFinishInflate()
-        icon = requireViewById(R.id.icon)
-        title = requireViewById(R.id.title)
-        text = requireViewById(R.id.text)
-
-        expandButton = requireViewById(R.id.expand_button)
-        expandButton.setExpanded(false)
-    }
-
-    /** the resources configuration has changed such that the view needs to be reinflated */
-    fun isReinflateNeeded(): Boolean = configTracker.hasUnhandledConfigChange()
-
-    fun setIcon(icon: Icon?) {
-        this.icon.setImageIcon(icon)
-    }
-
-    fun setTitle(title: CharSequence?) {
-        this.title.text = title
-    }
-
-    fun setText(text: CharSequence?) {
-        this.text.text = text
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/TimerButtonView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/TimerButtonView.kt
deleted file mode 100644
index 8c95187..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/TimerButtonView.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.ui.view
-
-import android.annotation.DrawableRes
-import android.content.Context
-import android.graphics.BlendMode
-import android.util.AttributeSet
-import com.android.internal.widget.EmphasizedNotificationButton
-
-class TimerButtonView
-@JvmOverloads
-constructor(
-    context: Context,
-    attrs: AttributeSet? = null,
-    defStyleAttr: Int = 0,
-    defStyleRes: Int = 0,
-) : EmphasizedNotificationButton(context, attrs, defStyleAttr, defStyleRes) {
-
-    private val Int.dp: Int
-        get() = (this * context.resources.displayMetrics.density).toInt()
-
-    fun setIcon(@DrawableRes icon: Int) {
-        val drawable = context.getDrawable(icon)
-
-        drawable?.mutate()
-        drawable?.setTintList(textColors)
-        drawable?.setTintBlendMode(BlendMode.SRC_IN)
-        drawable?.setBounds(0, 0, 24.dp, 24.dp)
-
-        setCompoundDrawablesRelative(drawable, null, null, null)
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/TimerView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/TimerView.kt
deleted file mode 100644
index d481b50..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/TimerView.kt
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.ui.view
-
-import android.content.Context
-import android.graphics.drawable.Icon
-import android.os.SystemClock
-import android.util.AttributeSet
-import android.widget.Chronometer
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.core.view.isVisible
-import com.android.systemui.res.R
-
-class TimerView
-@JvmOverloads
-constructor(
-    context: Context,
-    attrs: AttributeSet? = null,
-    defStyleAttr: Int = 0,
-    defStyleRes: Int = 0,
-) : ConstraintLayout(context, attrs, defStyleAttr, defStyleRes) {
-
-    private val configTracker = ConfigurationTracker(resources)
-
-    private lateinit var icon: ImageView
-    private lateinit var label: TextView
-    private lateinit var chronometer: Chronometer
-    private lateinit var pausedTimeRemaining: TextView
-    lateinit var mainButton: TimerButtonView
-        private set
-
-    lateinit var altButton: TimerButtonView
-        private set
-
-    lateinit var resetButton: TimerButtonView
-        private set
-
-    override fun onFinishInflate() {
-        super.onFinishInflate()
-        icon = requireViewById(R.id.icon)
-        label = requireViewById(R.id.label)
-        chronometer = requireViewById(R.id.chronoRemaining)
-        pausedTimeRemaining = requireViewById(R.id.pausedTimeRemaining)
-        mainButton = requireViewById(R.id.mainButton)
-        altButton = requireViewById(R.id.altButton)
-        resetButton = requireViewById(R.id.resetButton)
-    }
-
-    /** the resources configuration has changed such that the view needs to be reinflated */
-    fun isReinflateNeeded(): Boolean = configTracker.hasUnhandledConfigChange()
-
-    fun setIcon(icon: Icon?) {
-        this.icon.setImageIcon(icon)
-    }
-
-    fun setLabel(label: String) {
-        this.label.text = label
-    }
-
-    fun setPausedTime(pausedTime: String?) {
-        if (pausedTime != null) {
-            pausedTimeRemaining.text = pausedTime
-            pausedTimeRemaining.isVisible = true
-        } else {
-            pausedTimeRemaining.isVisible = false
-        }
-    }
-
-    fun setCountdownTime(countdownTimeMs: Long?) {
-        if (countdownTimeMs != null) {
-            chronometer.base =
-                countdownTimeMs - System.currentTimeMillis() + SystemClock.elapsedRealtime()
-            chronometer.isVisible = true
-            chronometer.start()
-        } else {
-            chronometer.isVisible = false
-            chronometer.stop()
-        }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/EnRouteViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/EnRouteViewBinder.kt
deleted file mode 100644
index 3b8957c..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/EnRouteViewBinder.kt
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.ui.viewbinder
-
-import androidx.lifecycle.lifecycleScope
-import com.android.systemui.lifecycle.repeatWhenAttached
-import com.android.systemui.statusbar.notification.row.ui.view.EnRouteView
-import com.android.systemui.statusbar.notification.row.ui.viewmodel.EnRouteViewModel
-import kotlinx.coroutines.DisposableHandle
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.launch
-
-/** Binds a [EnRouteView] to its [view model][EnRouteViewModel]. */
-object EnRouteViewBinder {
-    fun bindWhileAttached(
-        view: EnRouteView,
-        viewModel: EnRouteViewModel,
-    ): DisposableHandle {
-        return view.repeatWhenAttached { lifecycleScope.launch { bind(view, viewModel) } }
-    }
-
-    suspend fun bind(
-        view: EnRouteView,
-        viewModel: EnRouteViewModel,
-    ) = coroutineScope {
-        launch { viewModel.icon.collect { view.setIcon(it) } }
-        launch { viewModel.title.collect { view.setTitle(it) } }
-        launch { viewModel.text.collect { view.setText(it) } }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/SingleLineViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/SingleLineViewBinder.kt
index 3b0f1ee..a17197c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/SingleLineViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/SingleLineViewBinder.kt
@@ -24,14 +24,14 @@
 object SingleLineViewBinder {
     @JvmStatic
     fun bind(viewModel: SingleLineViewModel?, view: HybridNotificationView?) {
-        if (viewModel?.isConversation() == true && view is HybridConversationNotificationView) {
+        if (view is HybridConversationNotificationView) {
             if (AsyncHybridViewInflation.isUnexpectedlyInLegacyMode()) return
 
-            viewModel.conversationData?.avatar?.let { view.setAvatar(it) }
+            viewModel?.conversationData?.avatar?.let { view.setAvatar(it) }
             view.setText(
-                viewModel.titleText,
-                viewModel.contentText,
-                viewModel.conversationData?.conversationSenderName
+                viewModel?.titleText,
+                viewModel?.contentText,
+                viewModel?.conversationData?.conversationSenderName,
             )
         } else {
             // bind the title and content text views
@@ -39,7 +39,7 @@
                 bind(
                     /* title = */ viewModel?.titleText,
                     /* text = */ viewModel?.contentText,
-                    /* contentView = */ null
+                    /* contentView = */ null,
                 )
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/TimerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/TimerViewBinder.kt
deleted file mode 100644
index 042d1bc..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/TimerViewBinder.kt
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.ui.viewbinder
-
-import android.content.res.ColorStateList
-import android.graphics.drawable.Icon
-import android.view.View
-import androidx.core.view.isGone
-import androidx.lifecycle.lifecycleScope
-import com.android.systemui.lifecycle.repeatWhenAttached
-import com.android.systemui.statusbar.notification.row.ui.view.TimerButtonView
-import com.android.systemui.statusbar.notification.row.ui.view.TimerView
-import com.android.systemui.statusbar.notification.row.ui.viewmodel.TimerViewModel
-import kotlinx.coroutines.DisposableHandle
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.launch
-
-/** Binds a [TimerView] to its [view model][TimerViewModel]. */
-object TimerViewBinder {
-    fun bindWhileAttached(
-        view: TimerView,
-        viewModel: TimerViewModel,
-    ): DisposableHandle {
-        return view.repeatWhenAttached { lifecycleScope.launch { bind(view, viewModel) } }
-    }
-
-    suspend fun bind(
-        view: TimerView,
-        viewModel: TimerViewModel,
-    ) = coroutineScope {
-        launch { viewModel.icon.collect { view.setIcon(it) } }
-        launch { viewModel.label.collect { view.setLabel(it) } }
-        launch { viewModel.pausedTime.collect { view.setPausedTime(it) } }
-        launch { viewModel.countdownTime.collect { view.setCountdownTime(it) } }
-        launch { viewModel.mainButtonModel.collect { bind(view.mainButton, it) } }
-        launch { viewModel.altButtonModel.collect { bind(view.altButton, it) } }
-        launch { viewModel.resetButtonModel.collect { bind(view.resetButton, it) } }
-    }
-
-    fun bind(buttonView: TimerButtonView, model: TimerViewModel.ButtonViewModel?) {
-        if (model != null) {
-            buttonView.setButtonBackground(
-                ColorStateList.valueOf(
-                    buttonView.context.getColor(com.android.internal.R.color.system_accent2_100)
-                )
-            )
-            buttonView.setTextColor(
-                buttonView.context.getColor(
-                    com.android.internal.R.color.notification_primary_text_color_light
-                )
-            )
-
-            when (model) {
-                is TimerViewModel.ButtonViewModel.WithSystemAttrs -> {
-                    buttonView.setIcon(model.iconRes)
-                    buttonView.setText(model.labelRes)
-                }
-                is TimerViewModel.ButtonViewModel.WithCustomAttrs -> {
-                    // TODO: b/352142761 - is there a better way to deal with TYPE_RESOURCE icons
-                    // with empty resPackage? RemoteViews handles this by using a  different
-                    // `contextForResources` for inflation.
-                    val icon =
-                        if (model.icon.type == Icon.TYPE_RESOURCE && model.icon.resPackage == "")
-                            Icon.createWithResource(
-                                "com.google.android.deskclock",
-                                model.icon.resId
-                            )
-                        else model.icon
-                    buttonView.setImageIcon(icon)
-                    buttonView.text = model.label
-                }
-            }
-
-            buttonView.setOnClickListener(
-                model.pendingIntent?.let { pendingIntent ->
-                    View.OnClickListener { pendingIntent.send() }
-                }
-            )
-            buttonView.isEnabled = model.pendingIntent != null
-        }
-        buttonView.isGone = model == null
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModel.kt
deleted file mode 100644
index 307a983..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModel.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.ui.viewmodel
-
-import android.graphics.drawable.Icon
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.statusbar.notification.row.domain.interactor.NotificationRowInteractor
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag
-import com.android.systemui.util.kotlin.FlowDumperImpl
-import javax.inject.Inject
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.mapNotNull
-
-/** A view model for EnRoute notifications. */
-class EnRouteViewModel
-@Inject
-constructor(
-    dumpManager: DumpManager,
-    rowInteractor: NotificationRowInteractor,
-) : FlowDumperImpl(dumpManager) {
-    init {
-        /* check if */ RichOngoingNotificationFlag.isUnexpectedlyInLegacyMode()
-    }
-
-    val icon: Flow<Icon?> = rowInteractor.enRouteContentModel.mapNotNull { it.smallIcon.icon }
-
-    val title: Flow<CharSequence?> = rowInteractor.enRouteContentModel.map { it.title }
-
-    val text: Flow<CharSequence?> = rowInteractor.enRouteContentModel.map { it.text }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/RichOngoingViewModelComponent.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/RichOngoingViewModelComponent.kt
deleted file mode 100644
index 5552d89..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/RichOngoingViewModelComponent.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.ui.viewmodel
-
-// noinspection CleanArchitectureDependencyViolation
-import com.android.systemui.statusbar.notification.row.data.repository.NotificationRowRepository
-import dagger.BindsInstance
-import dagger.Subcomponent
-
-@Subcomponent
-interface RichOngoingViewModelComponent {
-
-    @Subcomponent.Factory
-    interface Factory {
-        /** Creates an instance of [RichOngoingViewModelComponent]. */
-        fun create(
-            @BindsInstance repository: NotificationRowRepository
-        ): RichOngoingViewModelComponent
-    }
-
-    fun createTimerViewModel(): TimerViewModel
-
-    fun createEnRouteViewModel(): EnRouteViewModel
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModel.kt
deleted file mode 100644
index 768a093..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModel.kt
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.ui.viewmodel
-
-import android.annotation.DrawableRes
-import android.annotation.StringRes
-import android.app.PendingIntent
-import android.graphics.drawable.Icon
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.statusbar.notification.row.domain.interactor.NotificationRowInteractor
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag
-import com.android.systemui.statusbar.notification.row.shared.TimerContentModel.TimerState
-import com.android.systemui.util.kotlin.FlowDumperImpl
-import java.time.Duration
-import javax.inject.Inject
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.mapNotNull
-
-/** A view model for Timer notifications. */
-class TimerViewModel
-@Inject
-constructor(
-    dumpManager: DumpManager,
-    rowInteractor: NotificationRowInteractor,
-) : FlowDumperImpl(dumpManager) {
-    init {
-        /* check if */ RichOngoingNotificationFlag.isUnexpectedlyInLegacyMode()
-    }
-
-    private val state: Flow<TimerState> = rowInteractor.timerContentModel.mapNotNull { it.state }
-
-    val icon: Flow<Icon?> = rowInteractor.timerContentModel.mapNotNull { it.icon.icon }
-
-    val label: Flow<String> = rowInteractor.timerContentModel.mapNotNull { it.name }
-
-    val countdownTime: Flow<Long?> = state.map { (it as? TimerState.Running)?.finishTime }
-
-    val pausedTime: Flow<String?> =
-        state.map { (it as? TimerState.Paused)?.timeRemaining?.format() }
-
-    val mainButtonModel: Flow<ButtonViewModel> =
-        state.map {
-            when (it) {
-                is TimerState.Paused ->
-                    ButtonViewModel.WithSystemAttrs(
-                        it.resumeIntent,
-                        com.android.systemui.res.R.string.controls_media_resume, // "Resume",
-                        com.android.systemui.res.R.drawable.ic_media_play
-                    )
-                is TimerState.Running ->
-                    ButtonViewModel.WithSystemAttrs(
-                        it.pauseIntent,
-                        com.android.systemui.res.R.string.controls_media_button_pause, // "Pause",
-                        com.android.systemui.res.R.drawable.ic_media_pause
-                    )
-            }
-        }
-
-    val altButtonModel: Flow<ButtonViewModel?> =
-        state.map {
-            it.addMinuteAction?.let { action ->
-                ButtonViewModel.WithCustomAttrs(
-                    action.actionIntent,
-                    action.title, // "1:00",
-                    action.getIcon()
-                )
-            }
-        }
-
-    val resetButtonModel: Flow<ButtonViewModel?> =
-        state.map {
-            it.resetAction?.let { action ->
-                ButtonViewModel.WithCustomAttrs(
-                    action.actionIntent,
-                    action.title, // "Reset",
-                    action.getIcon()
-                )
-            }
-        }
-
-    sealed interface ButtonViewModel {
-        val pendingIntent: PendingIntent?
-
-        data class WithSystemAttrs(
-            override val pendingIntent: PendingIntent?,
-            @StringRes val labelRes: Int,
-            @DrawableRes val iconRes: Int,
-        ) : ButtonViewModel
-
-        data class WithCustomAttrs(
-            override val pendingIntent: PendingIntent?,
-            val label: CharSequence,
-            val icon: Icon,
-        ) : ButtonViewModel
-    }
-}
-
-private fun Duration.format(): String {
-    val hours = this.toHours()
-    return if (hours > 0) {
-        String.format("%d:%02d:%02d", hours, toMinutesPart(), toSecondsPart())
-    } else {
-        String.format("%d:%02d", toMinutes(), toSecondsPart())
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shared/NotificationMinimalism.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shared/NotificationMinimalism.kt
new file mode 100644
index 0000000..70bb272
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shared/NotificationMinimalism.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.notification.shared
+
+import android.os.SystemProperties
+import com.android.server.notification.Flags
+import com.android.systemui.flags.FlagToken
+import com.android.systemui.flags.RefactorFlagUtils
+
+/** Helper for reading or using the minimalism prototype flag state. */
+@Suppress("NOTHING_TO_INLINE")
+object NotificationMinimalism {
+    const val FLAG_NAME = Flags.FLAG_NOTIFICATION_MINIMALISM
+
+    /** A token used for dependency declaration */
+    val token: FlagToken
+        get() = FlagToken(FLAG_NAME, isEnabled)
+
+    /** Is the notification minimalism enabled */
+    @JvmStatic
+    inline val isEnabled
+        get() = Flags.notificationMinimalism()
+
+    /**
+     * The prototype will (by default) use a promoter to ensure that the top unseen notification is
+     * not grouped, but this property read allows that behavior to be disabled.
+     */
+    val ungroupTopUnseen: Boolean
+        get() =
+            if (isUnexpectedlyInLegacyMode()) false
+            else
+                SystemProperties.getBoolean(
+                    "persist.notification_minimalism_prototype.ungroup_top_unseen",
+                    false
+                )
+
+    /**
+     * Called to ensure code is only run when the flag is enabled. This protects users from the
+     * unintended behaviors caused by accidentally running new logic, while also crashing on an eng
+     * build to ensure that the refactor author catches issues in testing.
+     */
+    @JvmStatic
+    inline fun isUnexpectedlyInLegacyMode() =
+        RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME)
+
+    /**
+     * Called to ensure code is only run when the flag is disabled. This will throw an exception if
+     * the flag is enabled to ensure that the refactor author catches issues in testing.
+     */
+    @JvmStatic
+    inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shared/NotificationMinimalismPrototype.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shared/NotificationMinimalismPrototype.kt
deleted file mode 100644
index 06f3db5..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shared/NotificationMinimalismPrototype.kt
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.shared
-
-import android.os.SystemProperties
-import com.android.systemui.Flags
-import com.android.systemui.flags.FlagToken
-import com.android.systemui.flags.RefactorFlagUtils
-
-/** Helper for reading or using the minimalism prototype flag state. */
-@Suppress("NOTHING_TO_INLINE")
-object NotificationMinimalismPrototype {
-    const val FLAG_NAME = Flags.FLAG_NOTIFICATION_MINIMALISM_PROTOTYPE
-
-    /** A token used for dependency declaration */
-    val token: FlagToken
-        get() = FlagToken(FLAG_NAME, isEnabled)
-
-    /** Is the heads-up cycling animation enabled */
-    @JvmStatic
-    inline val isEnabled
-        get() = Flags.notificationMinimalismPrototype()
-
-    /**
-     * The prototype will (by default) use a promoter to ensure that the top unseen notification is
-     * not grouped, but this property read allows that behavior to be disabled.
-     */
-    val ungroupTopUnseen: Boolean
-        get() =
-            if (isUnexpectedlyInLegacyMode()) false
-            else
-                SystemProperties.getBoolean(
-                    "persist.notification_minimalism_prototype.ungroup_top_unseen",
-                    false
-                )
-
-    /**
-     * Called to ensure code is only run when the flag is enabled. This protects users from the
-     * unintended behaviors caused by accidentally running new logic, while also crashing on an eng
-     * build to ensure that the refactor author catches issues in testing.
-     */
-    @JvmStatic
-    inline fun isUnexpectedlyInLegacyMode() =
-        RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME)
-
-    /**
-     * Called to ensure code is only run when the flag is disabled. This will throw an exception if
-     * the flag is enabled to ensure that the refactor author catches issues in testing.
-     */
-    @JvmStatic
-    inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME)
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
index 1431b28..129d4ce 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
@@ -88,6 +88,8 @@
     private ExpandableView mLastVisibleBackgroundChild;
     private float mCurrentScrollVelocity;
     private int mStatusBarState;
+    private boolean mShowingStackOnLockscreen;
+    private float mLockscreenStackFadeInProgress;
     private float mExpandingVelocity;
     private boolean mPanelTracking;
     private boolean mExpansionChanging;
@@ -222,6 +224,7 @@
      * @param isSwipingUp Whether we are swiping up.
      */
     public void setSwipingUp(boolean isSwipingUp) {
+        SceneContainerFlag.assertInLegacyMode();
         if (!isSwipingUp && mIsSwipingUp) {
             // Just stopped swiping up.
             mIsFlingRequiredAfterLockScreenSwipeUp = true;
@@ -240,6 +243,7 @@
      * @param isFlinging Whether we are flinging the shade open or closed.
      */
     public void setFlinging(boolean isFlinging) {
+        SceneContainerFlag.assertInLegacyMode();
         if (isOnKeyguard() && !isFlinging && mIsFlinging) {
             // Just stopped flinging.
             mIsFlingRequiredAfterLockScreenSwipeUp = false;
@@ -624,6 +628,26 @@
         return mStatusBarState == StatusBarState.KEYGUARD;
     }
 
+    public boolean isShowingStackOnLockscreen() {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return false;
+        return mShowingStackOnLockscreen;
+    }
+
+    public void setShowingStackOnLockscreen(boolean showingStackOnLockscreen) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
+        mShowingStackOnLockscreen = showingStackOnLockscreen;
+    }
+
+    public float getLockscreenStackFadeInProgress() {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return 0f;
+        return mLockscreenStackFadeInProgress;
+    }
+
+    public void setLockscreenStackFadeInProgress(float lockscreenStackFadeInProgress) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
+        mLockscreenStackFadeInProgress = lockscreenStackFadeInProgress;
+    }
+
     public void setStatusBarState(int statusBarState) {
         if (mStatusBarState != StatusBarState.KEYGUARD) {
             mIsFlingRequiredAfterLockScreenSwipeUp = false;
@@ -695,6 +719,7 @@
      * @return Whether we need to do a fling down after swiping up on lockscreen.
      */
     public boolean isFlingingAfterSwipeUpOnLockscreen() {
+        SceneContainerFlag.assertInLegacyMode();
         return mIsFlinging && mIsFlingRequiredAfterLockScreenSwipeUp;
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
index b108388..cfca830 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
@@ -1704,6 +1704,7 @@
                 + "visibility: " + getVisibility()
                 + ", alpha: " + getAlpha()
                 + ", translationY: " + getTranslationY()
+                + ", clipBounds: " + getClipBounds()
                 + ", roundableState: " + getRoundableState().debugString() + "}";
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index cd3516d..8ae6b79 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -104,6 +104,7 @@
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager;
 import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix;
 import com.android.systemui.statusbar.notification.emptyshade.ui.view.EmptyShadeView;
 import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor;
 import com.android.systemui.statusbar.notification.footer.ui.view.FooterView;
@@ -112,6 +113,7 @@
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.systemui.statusbar.notification.row.ExpandableView;
 import com.android.systemui.statusbar.notification.row.StackScrollerDecorView;
+import com.android.systemui.statusbar.notification.shared.NotificationContentAlphaOptimization;
 import com.android.systemui.statusbar.notification.shared.NotificationHeadsUpCycling;
 import com.android.systemui.statusbar.notification.shared.NotificationThrottleHun;
 import com.android.systemui.statusbar.notification.shared.NotificationsImprovedHunAnimation;
@@ -567,6 +569,7 @@
     private boolean mHasFilteredOutSeenNotifications;
     @Nullable private SplitShadeStateController mSplitShadeStateController = null;
     private boolean mIsSmallLandscapeLockscreenEnabled = false;
+    private boolean mSuppressHeightUpdates;
 
     /** Pass splitShadeStateController to view and update split shade */
     public void passSplitShadeStateController(SplitShadeStateController splitShadeStateController) {
@@ -686,7 +689,9 @@
     protected void onFinishInflate() {
         super.onFinishInflate();
 
-        inflateEmptyShadeView();
+        if (!ModesEmptyShadeFix.isEnabled()) {
+            inflateEmptyShadeView();
+        }
         if (!FooterViewRefactor.isEnabled()) {
             inflateFooterView();
         }
@@ -729,7 +734,9 @@
             inflateFooterView();
             updateFooter();
         }
-        inflateEmptyShadeView();
+        if (!ModesEmptyShadeFix.isEnabled()) {
+            inflateEmptyShadeView();
+        }
         mSectionsManager.reinflateViews();
     }
 
@@ -1154,11 +1161,13 @@
 
     @Override
     public void addHeadsUpHeightChangedListener(@NonNull Runnable runnable) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
         mHeadsUpHeightChangedListeners.addIfAbsent(runnable);
     }
 
     @Override
     public void removeHeadsUpHeightChangedListener(@NonNull Runnable runnable) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
         mHeadsUpHeightChangedListeners.remove(runnable);
     }
 
@@ -1234,11 +1243,13 @@
 
     @Override
     public void setScrolledToTop(boolean scrolledToTop) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
         mScrollViewFields.setScrolledToTop(scrolledToTop);
     }
 
     @Override
     public void setStackTop(float stackTop) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
         if (mAmbientState.getStackTop() != stackTop) {
             mAmbientState.setStackTop(stackTop);
             onTopPaddingChanged(/* animate = */ isAddOrRemoveAnimationPending());
@@ -1247,51 +1258,54 @@
 
     @Override
     public void setStackCutoff(float stackCutoff) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
         mAmbientState.setStackCutoff(stackCutoff);
     }
 
     @Override
     public void setHeadsUpTop(float headsUpTop) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
         mAmbientState.setHeadsUpTop(headsUpTop);
         requestChildrenUpdate();
     }
 
     @Override
     public void setHeadsUpBottom(float headsUpBottom) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
         mAmbientState.setHeadsUpBottom(headsUpBottom);
         mStateAnimator.setHeadsUpAppearHeightBottom(Math.round(headsUpBottom));
     }
 
     @Override
     public void closeGutsOnSceneTouch() {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
         mController.closeControlsDueToOutsideTouch();
     }
 
     @Override
     public void setSyntheticScrollConsumer(@Nullable Consumer<Float> consumer) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
         mScrollViewFields.setSyntheticScrollConsumer(consumer);
     }
 
     @Override
     public void setCurrentGestureOverscrollConsumer(@Nullable Consumer<Boolean> consumer) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
         mScrollViewFields.setCurrentGestureOverscrollConsumer(consumer);
     }
 
     @Override
     public void setCurrentGestureInGutsConsumer(@Nullable Consumer<Boolean> consumer) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
         mScrollViewFields.setCurrentGestureInGutsConsumer(consumer);
     }
 
     @Override
     public void setRemoteInputRowBottomBoundConsumer(@Nullable Consumer<Float> consumer) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
         mScrollViewFields.setRemoteInputRowBottomBoundConsumer(consumer);
     }
 
-    @Override
-    public void setHeadsUpHeightConsumer(@Nullable Consumer<Float> consumer) {
-        mScrollViewFields.setHeadsUpHeightConsumer(consumer);
-    }
-
     /**
      * @param listener to be notified after the location of Notification children might have
      *                 changed.
@@ -1453,9 +1467,13 @@
      * 2) Swiping up on lockscreen or flinging down after swipe up
      */
     private boolean shouldSkipHeightUpdate() {
-        return mAmbientState.isOnKeyguard()
-                && (mAmbientState.isSwipingUp()
-                || mAmbientState.isFlingingAfterSwipeUpOnLockscreen());
+        if (SceneContainerFlag.isEnabled()) {
+            return mSuppressHeightUpdates;
+        } else {
+            return mAmbientState.isOnKeyguard()
+                    && (mAmbientState.isSwipingUp()
+                    || mAmbientState.isFlingingAfterSwipeUpOnLockscreen());
+        }
     }
 
     /**
@@ -2611,11 +2629,13 @@
 
     @Override
     public int getTopHeadsUpHeight() {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return 0;
         return getTopHeadsUpIntrinsicHeight();
     }
 
     @Override
     public int getHeadsUpInset() {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return 0;
         return mHeadsUpInset;
     }
 
@@ -4353,6 +4373,16 @@
         }
     }
 
+    private void resetChildAlpha() {
+        for (int i = 0; i < getChildCount(); i++) {
+            ExpandableView child = getChildAtIndex(i);
+            if (child instanceof ExpandableNotificationRow row) {
+                if (row.isExpandAnimationRunning()) continue;
+                row.resetAllContentAlphas();
+            }
+        }
+    }
+
     private void logTransientNotificationRowTraversalCleaned(
             ExpandableNotificationRow transientView,
             String reason
@@ -4396,6 +4426,9 @@
                 if (SceneContainerFlag.isEnabled()) {
                     setHeadsUpAnimatingAway(false);
                 }
+                if (NotificationContentAlphaOptimization.isEnabled()) {
+                    resetChildAlpha();
+                }
             } else {
                 mGroupExpansionManager.collapseGroups();
                 mExpandHelper.cancelImmediately();
@@ -4835,6 +4868,8 @@
     /** Trigger an update for the empty shade resources and visibility. */
     public void updateEmptyShadeView(boolean visible, boolean areNotificationsHiddenInShade,
             boolean hasFilteredOutSeenNotifications) {
+        ModesEmptyShadeFix.assertInLegacyMode();
+
         mEmptyShadeView.setVisible(visible, mIsExpanded && mAnimationsEnabled);
 
         if (areNotificationsHiddenInShade) {
@@ -4853,6 +4888,8 @@
             @StringRes int newTextRes,
             @StringRes int newFooterTextRes,
             @DrawableRes int newFooterIconRes) {
+        ModesEmptyShadeFix.assertInLegacyMode();
+
         int oldTextRes = mEmptyShadeView.getTextResource();
         if (oldTextRes != newTextRes) {
             mEmptyShadeView.setText(newTextRes);
@@ -4874,6 +4911,9 @@
 
     public boolean isEmptyShadeViewVisible() {
         SceneContainerFlag.assertInLegacyMode();
+        if (mEmptyShadeView == null) {
+            return false;
+        }
         return mEmptyShadeView.isVisible();
     }
 
@@ -5330,6 +5370,19 @@
         updateDismissBehavior();
     }
 
+    @Override
+    public void setShowingStackOnLockscreen(boolean showingStackOnLockscreen) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
+        mAmbientState.setShowingStackOnLockscreen(showingStackOnLockscreen);
+    }
+
+    @Override
+    public void setAlphaForLockscreenFadeIn(float alphaForLockscreenFadeIn) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
+        mAmbientState.setLockscreenStackFadeInProgress(alphaForLockscreenFadeIn);
+        requestChildrenUpdate();
+    }
+
     void setUpcomingStatusBarState(int upcomingStatusBarState) {
         FooterViewRefactor.assertInLegacyMode();
         mUpcomingStatusBarState = upcomingStatusBarState;
@@ -5361,7 +5414,7 @@
 
     public float getOpeningHeight() {
         SceneContainerFlag.assertInLegacyMode();
-        if (mEmptyShadeView.getVisibility() == GONE) {
+        if (mEmptyShadeView == null || mEmptyShadeView.getVisibility() == GONE) {
             return getMinExpansionHeight();
         } else {
             return FooterViewRefactor.isEnabled() ? getAppearEndPosition()
@@ -5374,6 +5427,7 @@
     }
 
     public void setPanelFlinging(boolean flinging) {
+        SceneContainerFlag.assertInLegacyMode();
         mAmbientState.setFlinging(flinging);
         if (!flinging) {
             // re-calculate the stack height which was frozen while flinging
@@ -5381,6 +5435,12 @@
         }
     }
 
+    @Override
+    public void suppressHeightUpdates(boolean suppress) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
+        mSuppressHeightUpdates = suppress;
+    }
+
     public void setHeadsUpGoingAwayAnimationsAllowed(boolean headsUpGoingAwayAnimationsAllowed) {
         mHeadsUpGoingAwayAnimationsAllowed = headsUpGoingAwayAnimationsAllowed;
     }
@@ -5710,6 +5770,8 @@
     }
 
     private void inflateEmptyShadeView() {
+        ModesEmptyShadeFix.assertInLegacyMode();
+
         EmptyShadeView oldView = mEmptyShadeView;
         EmptyShadeView view = (EmptyShadeView) LayoutInflater.from(mContext).inflate(
                 R.layout.status_bar_no_notifications, this, false);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index dad6894..7b02d0c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -380,7 +380,7 @@
             new StatusBarStateController.StateListener() {
                 @Override
                 public void onStatePreChange(int oldState, int newState) {
-                    if (oldState == StatusBarState.SHADE_LOCKED
+                    if (!SceneContainerFlag.isEnabled() && oldState == StatusBarState.SHADE_LOCKED
                             && newState == KEYGUARD) {
                         mView.requestAnimateEverything();
                     }
@@ -1439,6 +1439,7 @@
     }
 
     public void setPanelFlinging(boolean flinging) {
+        SceneContainerFlag.assertInLegacyMode();
         mView.setPanelFlinging(flinging);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackSizeCalculator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackSizeCalculator.kt
index 06222fd..3bc5495 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackSizeCalculator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackSizeCalculator.kt
@@ -29,7 +29,7 @@
 import com.android.systemui.statusbar.SysuiStatusBarStateController
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
 import com.android.systemui.statusbar.notification.row.ExpandableView
-import com.android.systemui.statusbar.notification.shared.NotificationMinimalismPrototype
+import com.android.systemui.statusbar.notification.shared.NotificationMinimalism
 import com.android.systemui.statusbar.policy.SplitShadeStateController
 import com.android.systemui.util.Compile
 import com.android.systemui.util.children
@@ -74,7 +74,7 @@
 
     /** Whether we allow keyguard to show less important notifications above the shelf. */
     private val limitLockScreenToOneImportant
-        get() = NotificationMinimalismPrototype.isEnabled
+        get() = NotificationMinimalism.isEnabled
 
     /** Minimum space between two notifications, see [calculateGapAndDividerHeight]. */
     private var dividerHeight by notNull<Float>()
@@ -406,7 +406,7 @@
     fun updateResources() {
         maxKeyguardNotifications =
             infiniteIfNegative(resources.getInteger(R.integer.keyguard_max_notification_count))
-        maxNotificationsExcludesMedia = NotificationMinimalismPrototype.isEnabled
+        maxNotificationsExcludesMedia = NotificationMinimalism.isEnabled
 
         dividerHeight =
             max(1f, resources.getDimensionPixelSize(R.dimen.notification_divider_height).toFloat())
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ScrollViewFields.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ScrollViewFields.kt
index c08ed61..f6e8b8f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ScrollViewFields.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ScrollViewFields.kt
@@ -86,9 +86,6 @@
     fun sendRemoteInputRowBottomBound(bottomY: Float?) =
         remoteInputRowBottomBoundConsumer?.accept(bottomY)
 
-    /** send the [headsUpHeight] to the [headsUpHeightConsumer], if present. */
-    fun sendHeadsUpHeight(headsUpHeight: Float) = headsUpHeightConsumer?.accept(headsUpHeight)
-
     fun dump(pw: IndentingPrintWriter) {
         pw.printSection("StackViewStates") {
             pw.println("scrimClippingShape", scrimClippingShape)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
index 9c0fd0e..109f0ae 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
@@ -148,17 +148,30 @@
             if (isHunGoingToShade) {
                 // Keep 100% opacity for heads up notification going to shade.
                 viewState.setAlpha(1f);
-            } else if (ambientState.isOnKeyguard()) {
+            } else if (!SceneContainerFlag.isEnabled() && ambientState.isOnKeyguard()) {
                 // Adjust alpha for wakeup to lockscreen.
                 if (view.isHeadsUpState()) {
-                    // Pulsing HUN should be visible on AOD and stay visible during 
+                    // Pulsing HUN should be visible on AOD and stay visible during
                     // AOD=>lockscreen transition
                     viewState.setAlpha(1f - ambientState.getHideAmount());
                 } else {
-                    // Normal notifications are hidden on AOD and should fade in during 
+                    // Normal notifications are hidden on AOD and should fade in during
                     // AOD=>lockscreen transition
                     viewState.setAlpha(1f - ambientState.getDozeAmount());
                 }
+            } else if (SceneContainerFlag.isEnabled()
+                    && ambientState.isShowingStackOnLockscreen()) {
+                    // Adjust alpha for wakeup to lockscreen.
+                if (view.isHeadsUpState()) {
+                    // Pulsing HUN should be visible on AOD and stay visible during
+                    // AOD=>lockscreen transition
+                    viewState.setAlpha(1f - ambientState.getHideAmount());
+                } else {
+                    // Take into account scene container-specific Lockscreen fade-in progress
+                    float fadeAlpha = ambientState.getLockscreenStackFadeInProgress();
+                    float dozeAlpha = 1f - ambientState.getDozeAmount();
+                    viewState.setAlpha(Math.min(dozeAlpha, fadeAlpha));
+                }
             } else if (ambientState.isExpansionChanging()) {
                 // Adjust alpha for shade open & close.
                 float expansion = ambientState.getExpansionFraction();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepository.kt
index f6722a4..c0f1a56 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepository.kt
@@ -31,6 +31,9 @@
     /** The alpha of the shade in order to show brightness. */
     val alphaForBrightnessMirror = MutableStateFlow(1f)
 
+    /** The alpha of the Notification Stack for lockscreen fade-in */
+    val alphaForLockscreenFadeIn = MutableStateFlow(0f)
+
     /**
      * The bounds of the notification shade scrim / container in the current scene.
      *
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractor.kt
index 756cd87..32e092b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractor.kt
@@ -56,10 +56,9 @@
 
     /** The rounding of the notification stack. */
     val shadeScrimRounding: Flow<ShadeScrimRounding> =
-        combine(
-                shadeInteractor.shadeMode,
-                isExpandingFromHeadsUp,
-            ) { shadeMode, isExpandingFromHeadsUp ->
+        combine(shadeInteractor.shadeMode, isExpandingFromHeadsUp) {
+                shadeMode,
+                isExpandingFromHeadsUp ->
                 ShadeScrimRounding(
                     isTopRounded = !(shadeMode == ShadeMode.Split && isExpandingFromHeadsUp),
                     isBottomRounded = shadeMode != ShadeMode.Single,
@@ -71,6 +70,10 @@
     val alphaForBrightnessMirror: StateFlow<Float> =
         placeholderRepository.alphaForBrightnessMirror.asStateFlow()
 
+    /** The alpha of the Notification Stack for lockscreen fade-in */
+    val alphaForLockscreenFadeIn: StateFlow<Float> =
+        placeholderRepository.alphaForLockscreenFadeIn.asStateFlow()
+
     /** The height of the keyguard's available space bounds */
     val constrainedAvailableSpace: StateFlow<Int> =
         placeholderRepository.constrainedAvailableSpace.asStateFlow()
@@ -99,7 +102,7 @@
     val shouldCloseGuts: Flow<Boolean> =
         combine(
             sceneInteractor.isSceneContainerUserInputOngoing,
-            viewHeightRepository.isCurrentGestureInGuts
+            viewHeightRepository.isCurrentGestureInGuts,
         ) { isUserInputOngoing, isCurrentGestureInGuts ->
             isUserInputOngoing && !isCurrentGestureInGuts
         }
@@ -109,6 +112,11 @@
         placeholderRepository.alphaForBrightnessMirror.value = alpha
     }
 
+    /** Sets the alpha to apply to the NSSL for fade-in on lockscreen */
+    fun setAlphaForLockscreenFadeIn(alpha: Float) {
+        placeholderRepository.alphaForLockscreenFadeIn.value = alpha
+    }
+
     /** Sets the position of the notification stack in the current scene. */
     fun setShadeScrimBounds(bounds: ShadeScrimBounds?) {
         check(bounds == null || bounds.top <= bounds.bottom) { "Invalid bounds: $bounds" }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt
index 41c0293..6ad9f01 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt
@@ -77,9 +77,6 @@
     /** Set a consumer for current remote input notification row bottom bound events */
     fun setRemoteInputRowBottomBoundConsumer(consumer: Consumer<Float?>?)
 
-    /** Set a consumer for heads up height changed events */
-    fun setHeadsUpHeightConsumer(consumer: Consumer<Float>?)
-
     /** sets that scrolling is allowed */
     fun setScrollingEnabled(enabled: Boolean)
 
@@ -89,6 +86,12 @@
     /** sets the current QS expand fraction */
     fun setQsExpandFraction(expandFraction: Float)
 
+    /** set whether we are idle on the lockscreen scene */
+    fun setShowingStackOnLockscreen(showingStackOnLockscreen: Boolean)
+
+    /** set the alpha from 0-1f of stack fade-in on lockscreen */
+    fun setAlphaForLockscreenFadeIn(alphaForLockscreenFadeIn: Float)
+
     /** Sets whether the view is displayed in doze mode. */
     fun setDozing(dozing: Boolean)
 
@@ -118,4 +121,7 @@
 
     /** @see addHeadsUpHeightChangedListener */
     fun removeHeadsUpHeightChangedListener(runnable: Runnable)
+
+    /** Sets whether updates to the stack are are suppressed. */
+    fun suppressHeightUpdates(suppress: Boolean)
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt
index dc9615c..ebae235 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.statusbar.notification.stack.ui.viewbinder
 
 import android.view.LayoutInflater
+import android.view.View
 import androidx.lifecycle.lifecycleScope
 import com.android.app.tracing.TraceUtils.traceAsync
 import com.android.internal.logging.MetricsLogger
@@ -25,6 +26,7 @@
 import com.android.systemui.common.ui.view.setImportantForAccessibilityYesNo
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.lifecycle.repeatWhenAttachedToWindow
 import com.android.systemui.plugins.FalsingManager
 import com.android.systemui.res.R
 import com.android.systemui.scene.shared.flag.SceneContainerFlag
@@ -32,6 +34,10 @@
 import com.android.systemui.statusbar.notification.NotificationActivityStarter
 import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController
 import com.android.systemui.statusbar.notification.dagger.SilentHeader
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix
+import com.android.systemui.statusbar.notification.emptyshade.ui.view.EmptyShadeView
+import com.android.systemui.statusbar.notification.emptyshade.ui.viewbinder.EmptyShadeViewBinder
+import com.android.systemui.statusbar.notification.emptyshade.ui.viewmodel.EmptyShadeViewModel
 import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor
 import com.android.systemui.statusbar.notification.footer.ui.view.FooterView
 import com.android.systemui.statusbar.notification.footer.ui.viewbinder.FooterViewBinder
@@ -49,6 +55,7 @@
 import com.android.systemui.util.kotlin.awaitCancellationThenDispose
 import com.android.systemui.util.kotlin.getOrNull
 import com.android.systemui.util.ui.isAnimating
+import com.android.systemui.util.ui.stopAnimating
 import com.android.systemui.util.ui.value
 import java.util.Optional
 import javax.inject.Inject
@@ -84,7 +91,7 @@
 
     fun bindWhileAttached(
         view: NotificationStackScrollLayout,
-        viewController: NotificationStackScrollLayoutController
+        viewController: NotificationStackScrollLayoutController,
     ) {
         val shelf =
             LayoutInflater.from(view.context)
@@ -103,7 +110,13 @@
                     val hasNonClearableSilentNotifications: StateFlow<Boolean> =
                         viewModel.hasNonClearableSilentNotifications.stateIn(this)
                     launch { reinflateAndBindFooter(view, hasNonClearableSilentNotifications) }
-                    launch { bindEmptyShade(view) }
+                    launch {
+                        if (ModesEmptyShadeFix.isEnabled) {
+                            reinflateAndBindEmptyShade(view)
+                        } else {
+                            bindEmptyShadeLegacy(viewModel.emptyShadeViewFactory.create(), view)
+                        }
+                    }
                     launch {
                         bindSilentHeaderClickListener(view, hasNonClearableSilentNotifications)
                     }
@@ -121,17 +134,12 @@
     }
 
     private suspend fun bindShelf(shelf: NotificationShelf) {
-        NotificationShelfViewBinder.bind(
-            shelf,
-            viewModel.shelf,
-            falsingManager,
-            nicBinder,
-        )
+        NotificationShelfViewBinder.bind(shelf, viewModel.shelf, falsingManager, nicBinder)
     }
 
     private suspend fun reinflateAndBindFooter(
         parentView: NotificationStackScrollLayout,
-        hasNonClearableSilentNotifications: StateFlow<Boolean>
+        hasNonClearableSilentNotifications: StateFlow<Boolean>,
     ) {
         viewModel.footer.getOrNull()?.let { footerViewModel ->
             // The footer needs to be re-inflated every time the theme or the font size changes.
@@ -149,7 +157,7 @@
                             footerView,
                             footerViewModel,
                             parentView,
-                            hasNonClearableSilentNotifications
+                            hasNonClearableSilentNotifications,
                         )
                     }
                 }
@@ -163,13 +171,13 @@
         footerView: FooterView,
         footerViewModel: FooterViewModel,
         parentView: NotificationStackScrollLayout,
-        hasNonClearableSilentNotifications: StateFlow<Boolean>
+        hasNonClearableSilentNotifications: StateFlow<Boolean>,
     ): Unit = coroutineScope {
         val disposableHandle =
             FooterViewBinder.bindWhileAttached(
                 footerView,
                 footerViewModel,
-                clearAllNotifications = {
+                {
                     clearAllNotifications(
                         parentView,
                         // Hide the silent section header (if present) if there will be
@@ -177,16 +185,9 @@
                         hideSilentSection = !hasNonClearableSilentNotifications.value,
                     )
                 },
-                launchNotificationSettings = { view ->
-                    notificationActivityStarter
-                        .get()
-                        .startHistoryIntent(view, /* showHistory= */ false)
-                },
-                launchNotificationHistory = { view ->
-                    notificationActivityStarter
-                        .get()
-                        .startHistoryIntent(view, /* showHistory= */ true)
-                },
+                launchNotificationSettings,
+                launchNotificationHistory,
+                notificationActivityStarter.get(),
             )
         if (SceneContainerFlag.isEnabled) {
             launch {
@@ -194,7 +195,9 @@
                     footerView.setVisible(
                         /* visible = */ animatedVisibility.value,
                         /* animate = */ animatedVisibility.isAnimating,
-                    )
+                    ) {
+                        animatedVisibility.stopAnimating()
+                    }
                 }
             }
         } else {
@@ -211,20 +214,70 @@
         disposableHandle.awaitCancellationThenDispose()
     }
 
-    private suspend fun bindEmptyShade(parentView: NotificationStackScrollLayout) {
+    private val launchNotificationSettings: (View) -> Unit = { view: View ->
+        notificationActivityStarter.get().startHistoryIntent(view, /* showHistory= */ false)
+    }
+
+    private val launchNotificationHistory: (View) -> Unit = { view ->
+        notificationActivityStarter.get().startHistoryIntent(view, /* showHistory= */ true)
+    }
+
+    private suspend fun reinflateAndBindEmptyShade(parentView: NotificationStackScrollLayout) {
+        ModesEmptyShadeFix.assertInNewMode()
+        // The empty shade needs to be re-inflated every time the theme or the font size
+        // changes.
+        configuration
+            .inflateLayout<EmptyShadeView>(
+                R.layout.status_bar_no_notifications,
+                parentView,
+                attachToRoot = false,
+            )
+            .flowOn(backgroundDispatcher)
+            .collectLatest { emptyShadeView: EmptyShadeView ->
+                traceAsync("bind EmptyShadeView") {
+                    parentView.setEmptyShadeView(emptyShadeView)
+                    bindEmptyShade(emptyShadeView, viewModel.emptyShadeViewFactory.create())
+                }
+            }
+    }
+
+    private suspend fun bindEmptyShadeLegacy(
+        emptyShadeViewModel: EmptyShadeViewModel,
+        parentView: NotificationStackScrollLayout,
+    ) {
+        ModesEmptyShadeFix.assertInLegacyMode()
         combine(
                 viewModel.shouldShowEmptyShadeView,
-                viewModel.areNotificationsHiddenInShade,
-                viewModel.hasFilteredOutSeenNotifications,
-                ::Triple
+                emptyShadeViewModel.areNotificationsHiddenInShade,
+                emptyShadeViewModel.hasFilteredOutSeenNotifications,
+                ::Triple,
             )
             .collect { (shouldShow, areNotifsHidden, hasFilteredNotifs) ->
-                parentView.updateEmptyShadeView(
-                    shouldShow,
-                    areNotifsHidden,
-                    hasFilteredNotifs,
+                parentView.updateEmptyShadeView(shouldShow, areNotifsHidden, hasFilteredNotifs)
+            }
+    }
+
+    private suspend fun bindEmptyShade(
+        emptyShadeView: EmptyShadeView,
+        emptyShadeViewModel: EmptyShadeViewModel,
+    ): Unit = coroutineScope {
+        ModesEmptyShadeFix.assertInNewMode()
+        launch {
+            emptyShadeView.repeatWhenAttachedToWindow {
+                EmptyShadeViewBinder.bind(
+                    emptyShadeView,
+                    emptyShadeViewModel,
+                    notificationActivityStarter.get(),
                 )
             }
+        }
+        launch {
+            viewModel.shouldShowEmptyShadeViewAnimated.collect { shouldShow ->
+                emptyShadeView.setVisible(shouldShow.value, shouldShow.isAnimating) {
+                    shouldShow.stopAnimating()
+                }
+            }
+        }
     }
 
     private suspend fun bindSilentHeaderClickListener(
@@ -261,7 +314,7 @@
     private fun clearSilentNotifications(
         view: NotificationStackScrollLayout,
         closeShade: Boolean,
-        hideSilentSection: Boolean
+        hideSilentSection: Boolean,
     ) {
         view.clearSilentNotifications(closeShade, hideSilentSection)
     }
@@ -270,11 +323,7 @@
         if (NotificationsLiveDataStoreRefactor.isEnabled) {
             viewModel.logger.getOrNull()?.let { viewModel ->
                 loggerOptional.getOrNull()?.let { logger ->
-                    NotificationStatsLoggerBinder.bindLogger(
-                        view,
-                        logger,
-                        viewModel,
-                    )
+                    NotificationStatsLoggerBinder.bindLogger(view, logger, viewModel)
                 }
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt
index 2e37dea..87d70ba 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt
@@ -88,6 +88,14 @@
                 viewModel.expandFraction.collect { view.setExpandFraction(it.coerceIn(0f, 1f)) }
             }
             launch { viewModel.qsExpandFraction.collect { view.setQsExpandFraction(it) } }
+            launch {
+                viewModel.isShowingStackOnLockscreen.collect {
+                    view.setShowingStackOnLockscreen(it)
+                }
+            }
+            launch {
+                viewModel.alphaForLockscreenFadeIn.collect { view.setAlphaForLockscreenFadeIn(it) }
+            }
             launch { viewModel.isScrollable.collect { view.setScrollingEnabled(it) } }
             launch { viewModel.isDozing.collect { isDozing -> view.setDozing(isDozing) } }
             launch {
@@ -103,6 +111,7 @@
             launch {
                 viewModel.shouldCloseGuts.filter { it }.collect { view.closeGutsOnSceneTouch() }
             }
+            launch { viewModel.suppressHeightUpdates.collect { view.suppressHeightUpdates(it) } }
 
             launchAndDispose {
                 view.setSyntheticScrollConsumer(viewModel.syntheticScrollConsumer)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModel.kt
index 4e2a46d..38390e7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModel.kt
@@ -23,14 +23,14 @@
 import com.android.systemui.statusbar.domain.interactor.RemoteInputInteractor
 import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor
 import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor
-import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix
+import com.android.systemui.statusbar.notification.emptyshade.ui.viewmodel.EmptyShadeViewModel
 import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor
 import com.android.systemui.statusbar.notification.footer.ui.viewmodel.FooterViewModel
 import com.android.systemui.statusbar.notification.shared.HeadsUpRowKey
 import com.android.systemui.statusbar.notification.shelf.ui.viewmodel.NotificationShelfViewModel
 import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackInteractor
 import com.android.systemui.statusbar.policy.domain.interactor.UserSetupInteractor
-import com.android.systemui.statusbar.policy.domain.interactor.ZenModeInteractor
 import com.android.systemui.util.kotlin.FlowDumperImpl
 import com.android.systemui.util.kotlin.combine
 import com.android.systemui.util.kotlin.sample
@@ -48,22 +48,24 @@
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onStart
 
-/** ViewModel for the list of notifications. */
+/**
+ * ViewModel for the list of notifications, including child elements like the Clear all/Manage
+ * button at the bottom (the footer) and the "No notifications" text (the empty shade).
+ */
 class NotificationListViewModel
 @Inject
 constructor(
     val shelf: NotificationShelfViewModel,
     val hideListViewModel: HideListViewModel,
     val footer: Optional<FooterViewModel>,
+    val emptyShadeViewFactory: EmptyShadeViewModel.Factory,
     val logger: Optional<NotificationLoggerViewModel>,
     activeNotificationsInteractor: ActiveNotificationsInteractor,
     notificationStackInteractor: NotificationStackInteractor,
     private val headsUpNotificationInteractor: HeadsUpNotificationInteractor,
     remoteInputInteractor: RemoteInputInteractor,
-    seenNotificationsInteractor: SeenNotificationsInteractor,
     shadeInteractor: ShadeInteractor,
     userSetupInteractor: UserSetupInteractor,
-    zenModeInteractor: ZenModeInteractor,
     @Background bgDispatcher: CoroutineDispatcher,
     dumpManager: DumpManager,
 ) : FlowDumperImpl(dumpManager) {
@@ -90,6 +92,7 @@
     }
 
     val shouldShowEmptyShadeView: Flow<Boolean> by lazy {
+        ModesEmptyShadeFix.assertInLegacyMode()
         if (FooterViewRefactor.isUnexpectedlyInLegacyMode()) {
             flowOf(false)
         } else {
@@ -114,6 +117,45 @@
         }
     }
 
+    val shouldShowEmptyShadeViewAnimated: Flow<AnimatedValue<Boolean>> by lazy {
+        if (ModesEmptyShadeFix.isUnexpectedlyInLegacyMode()) {
+            flowOf(AnimatedValue.NotAnimating(false))
+        } else {
+            combine(
+                    activeNotificationsInteractor.areAnyNotificationsPresent,
+                    shadeInteractor.isQsFullscreen,
+                    notificationStackInteractor.isShowingOnLockscreen,
+                ) { hasNotifications, isQsFullScreen, isShowingOnLockscreen ->
+                    when {
+                        hasNotifications -> false
+                        isQsFullScreen -> false
+                        // Do not show the empty shade if the lockscreen is visible (including AOD
+                        // b/228790482 and bouncer b/267060171), except if the shade is opened on
+                        // top.
+                        isShowingOnLockscreen -> false
+                        else -> true
+                    }
+                }
+                .distinctUntilChanged()
+                .sample(
+                    // TODO(b/322167853): This check is currently duplicated in FooterViewModel
+                    //  but instead it should be a field in ShadeAnimationInteractor.
+                    combine(
+                            shadeInteractor.isShadeFullyExpanded,
+                            shadeInteractor.isShadeTouchable,
+                            ::Pair,
+                        )
+                        .onStart { emit(Pair(false, false)) }
+                ) { visible, (isShadeFullyExpanded, animationsEnabled) ->
+                    val shouldAnimate = isShadeFullyExpanded && animationsEnabled
+                    AnimatableEvent(visible, shouldAnimate)
+                }
+                .toAnimatedValueFlow()
+                .dumpWhileCollecting("shouldShowEmptyShadeViewAnimated")
+                .flowOn(bgDispatcher)
+        }
+    }
+
     /**
      * Whether the footer should not be visible for the user, even if it's present in the list (as
      * per [shouldIncludeFooterView] below).
@@ -154,7 +196,7 @@
                     userSetupInteractor.isUserSetUp,
                     notificationStackInteractor.isShowingOnLockscreen,
                     shadeInteractor.isQsFullscreen,
-                    remoteInputInteractor.isRemoteInputActive
+                    remoteInputInteractor.isRemoteInputActive,
                 ) {
                     hasNotifications,
                     isUserSetUp,
@@ -193,7 +235,7 @@
                     combine(
                             shadeInteractor.isShadeFullyExpanded,
                             shadeInteractor.isShadeTouchable,
-                            ::Pair
+                            ::Pair,
                         )
                         .onStart { emit(Pair(false, false)) }
                 ) { visibilityChange, (isShadeFullyExpanded, animationsEnabled) ->
@@ -263,7 +305,7 @@
                     combine(
                             shadeInteractor.isShadeFullyExpanded,
                             shadeInteractor.isShadeTouchable,
-                            ::Pair
+                            ::Pair,
                         )
                         .onStart { emit(Pair(false, false)) }
                 ) { visibilityChange, (isShadeFullyExpanded, animationsEnabled) ->
@@ -283,29 +325,7 @@
     enum class VisibilityChange(val visible: Boolean, val canAnimate: Boolean) {
         DISAPPEAR_WITHOUT_ANIMATION(visible = false, canAnimate = false),
         DISAPPEAR_WITH_ANIMATION(visible = false, canAnimate = true),
-        APPEAR_WITH_ANIMATION(visible = true, canAnimate = true)
-    }
-
-    // TODO(b/308591475): This should be tracked separately by the empty shade.
-    val areNotificationsHiddenInShade: Flow<Boolean> by lazy {
-        if (FooterViewRefactor.isUnexpectedlyInLegacyMode()) {
-            flowOf(false)
-        } else {
-            zenModeInteractor.areNotificationsHiddenInShade.dumpWhileCollecting(
-                "areNotificationsHiddenInShade"
-            )
-        }
-    }
-
-    // TODO(b/308591475): This should be tracked separately by the empty shade.
-    val hasFilteredOutSeenNotifications: Flow<Boolean> by lazy {
-        if (FooterViewRefactor.isUnexpectedlyInLegacyMode()) {
-            flowOf(false)
-        } else {
-            seenNotificationsInteractor.hasFilteredOutSeenNotifications.dumpWhileCollecting(
-                "hasFilteredOutSeenNotifications"
-            )
-        }
+        APPEAR_WITH_ANIMATION(visible = true, canAnimate = true),
     }
 
     val hasClearableAlertingNotifications: Flow<Boolean> by lazy {
@@ -336,11 +356,23 @@
         }
     }
 
-    val pinnedHeadsUpRows: Flow<Set<HeadsUpRowKey>> by lazy {
+    val activeHeadsUpRowKeys: Flow<Set<HeadsUpRowKey>> by lazy {
         if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) {
             flowOf(emptySet())
         } else {
-            headsUpNotificationInteractor.pinnedHeadsUpRows.dumpWhileCollecting("pinnedHeadsUpRows")
+            headsUpNotificationInteractor.activeHeadsUpRowKeys.dumpWhileCollecting(
+                "pinnedHeadsUpRows"
+            )
+        }
+    }
+
+    val pinnedHeadsUpRowKeys: Flow<Set<HeadsUpRowKey>> by lazy {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) {
+            flowOf(emptySet())
+        } else {
+            headsUpNotificationInteractor.pinnedHeadsUpRowKeys.dumpWhileCollecting(
+                "pinnedHeadsUpRows"
+            )
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationLockscreenScrimViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationLockscreenScrimViewModel.kt
new file mode 100644
index 0000000..84aa997
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationLockscreenScrimViewModel.kt
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.notification.stack.ui.viewmodel
+
+import com.android.systemui.dump.DumpManager
+import com.android.systemui.lifecycle.ExclusiveActivatable
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor
+import com.android.systemui.util.kotlin.ActivatableFlowDumper
+import com.android.systemui.util.kotlin.ActivatableFlowDumperImpl
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+
+class NotificationLockscreenScrimViewModel
+@AssistedInject
+constructor(
+    dumpManager: DumpManager,
+    shadeInteractor: ShadeInteractor,
+    private val stackAppearanceInteractor: NotificationStackAppearanceInteractor,
+) :
+    ActivatableFlowDumper by ActivatableFlowDumperImpl(dumpManager, "NotificationScrollViewModel"),
+    ExclusiveActivatable() {
+
+    val shadeMode = shadeInteractor.shadeMode
+
+    /** Sets the alpha to apply to the NSSL for fade-in on lockscreen */
+    fun setAlphaForLockscreenFadeIn(alpha: Float) {
+        stackAppearanceInteractor.setAlphaForLockscreenFadeIn(alpha)
+    }
+
+    override suspend fun onActivated(): Nothing {
+        activateFlowDumper()
+    }
+
+    @AssistedFactory
+    interface Factory {
+        fun create(): NotificationLockscreenScrimViewModel
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt
index 5b2e02d..aec81b0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt
@@ -18,6 +18,7 @@
 package com.android.systemui.statusbar.notification.stack.ui.viewmodel
 
 import com.android.compose.animation.scene.ContentKey
+import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.compose.animation.scene.ObservableTransitionState.Idle
 import com.android.compose.animation.scene.ObservableTransitionState.Transition
 import com.android.compose.animation.scene.ObservableTransitionState.Transition.ChangeScene
@@ -48,6 +49,7 @@
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.mapNotNull
 
 /** ViewModel which represents the state of the NSSL/Controller in the world of flexiglass */
@@ -82,8 +84,13 @@
     private fun fullyExpandedDuringSceneChange(change: ChangeScene): Boolean {
         // The lockscreen stack is visible during all transitions away from the lockscreen, so keep
         // the stack expanded until those transitions finish.
-        return (expandedInScene(change.fromScene) && expandedInScene(change.toScene)) ||
-            change.isBetween({ it == Scenes.Lockscreen }, { true })
+        return if (change.isTransitioning(from = Scenes.Lockscreen)) {
+            true
+        } else if (change.isTransitioning(from = Scenes.Shade, to = Scenes.Lockscreen)) {
+            false
+        } else {
+            (expandedInScene(change.fromScene) && expandedInScene(change.toScene))
+        }
     }
 
     private fun expandFractionDuringSceneChange(
@@ -93,9 +100,12 @@
     ): Float {
         return if (fullyExpandedDuringSceneChange(change)) {
             1f
-        } else if (change.isBetween({ it == Scenes.Gone }, { it == Scenes.Shade })) {
+        } else if (
+            change.isTransitioningBetween(Scenes.Gone, Scenes.Shade) ||
+                change.isTransitioning(from = Scenes.Gone, to = Scenes.Lockscreen)
+        ) {
             shadeExpansion
-        } else if (change.isBetween({ it == Scenes.Gone }, { it == Scenes.QuickSettings })) {
+        } else if (change.isTransitioningBetween(Scenes.Gone, Scenes.QuickSettings)) {
             // during QS expansion, increase fraction at same rate as scrim alpha,
             // but start when scrim alpha is at EXPANSION_FOR_DELAYED_STACK_FADE_IN.
             (qsExpansion / EXPANSION_FOR_MAX_SCRIM_ALPHA - EXPANSION_FOR_DELAYED_STACK_FADE_IN)
@@ -121,6 +131,14 @@
         }
     }
 
+    /** Are notification stack height updates suppressed? */
+    val suppressHeightUpdates: Flow<Boolean> =
+        sceneInteractor.transitionState.map { transition: ObservableTransitionState ->
+            transition is Transition &&
+                transition.fromContent == Scenes.Lockscreen &&
+                (transition.toContent == Scenes.Bouncer || transition.toContent == Scenes.Gone)
+        }
+
     /**
      * The expansion fraction of the notification stack. It should go from 0 to 1 when transitioning
      * from Gone to Shade scenes, and remain at 1 when in Lockscreen or Shade scenes and while
@@ -178,12 +196,28 @@
             .distinctUntilChanged()
             .dumpWhileCollecting("shouldResetStackTop")
 
+    /** Whether the Notification Stack is visibly on the lockscreen scene. */
+    val isShowingStackOnLockscreen: Flow<Boolean> =
+        sceneInteractor.transitionState
+            .mapNotNull { state ->
+                state.isIdle(Scenes.Lockscreen) ||
+                    state.isTransitioning(from = Scenes.Lockscreen, to = Scenes.Shade)
+            }
+            .distinctUntilChanged()
+
+    /** The alpha of the Notification Stack for lockscreen fade-in */
+    val alphaForLockscreenFadeIn = stackAppearanceInteractor.alphaForLockscreenFadeIn
+
     private operator fun SceneKey.contains(scene: SceneKey) =
         sceneInteractor.isSceneInFamily(scene, this)
 
     private val qsAllowsClipping: Flow<Boolean> =
         combine(shadeInteractor.shadeMode, shadeInteractor.qsExpansion) { shadeMode, qsExpansion ->
-                qsExpansion < 0.5f || shadeMode != ShadeMode.Single
+                when (shadeMode) {
+                    is ShadeMode.Dual -> false
+                    is ShadeMode.Split -> true
+                    is ShadeMode.Single -> qsExpansion < 0.5f
+                }
             }
             .distinctUntilChanged()
 
@@ -295,6 +329,3 @@
         fun create(): NotificationScrollViewModel
     }
 }
-
-private fun ChangeScene.isBetween(a: (SceneKey) -> Boolean, b: (SceneKey) -> Boolean): Boolean =
-    (a(fromScene) && b(toScene)) || (b(fromScene) && a(toScene))
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt
index 57be629..0ad22e0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt
@@ -61,6 +61,7 @@
 import com.android.systemui.keyguard.ui.viewmodel.OccludedToAodTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.OccludedToGoneTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.OccludedToLockscreenTransitionViewModel
+import com.android.systemui.keyguard.ui.viewmodel.OffToLockscreenTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToLockscreenTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.ViewStateAccessor
@@ -132,6 +133,7 @@
     private val occludedToAodTransitionViewModel: OccludedToAodTransitionViewModel,
     private val occludedToGoneTransitionViewModel: OccludedToGoneTransitionViewModel,
     private val occludedToLockscreenTransitionViewModel: OccludedToLockscreenTransitionViewModel,
+    private val offToLockscreenTransitionViewModel: OffToLockscreenTransitionViewModel,
     private val primaryBouncerToGoneTransitionViewModel: PrimaryBouncerToGoneTransitionViewModel,
     private val primaryBouncerToLockscreenTransitionViewModel:
         PrimaryBouncerToLockscreenTransitionViewModel,
@@ -444,6 +446,7 @@
             occludedToAodTransitionViewModel.lockscreenAlpha,
             occludedToGoneTransitionViewModel.notificationAlpha(viewState),
             occludedToLockscreenTransitionViewModel.lockscreenAlpha,
+            offToLockscreenTransitionViewModel.lockscreenAlpha,
             primaryBouncerToLockscreenTransitionViewModel.lockscreenAlpha(viewState),
             glanceableHubToLockscreenTransitionViewModel.keyguardAlpha,
             lockscreenToGlanceableHubTransitionViewModel.keyguardAlpha,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ui/viewbinder/HeadsUpNotificationViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ui/viewbinder/HeadsUpNotificationViewBinder.kt
index dc15970..e2e5c59 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ui/viewbinder/HeadsUpNotificationViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ui/viewbinder/HeadsUpNotificationViewBinder.kt
@@ -26,6 +26,7 @@
 import kotlinx.coroutines.channels.awaitClose
 import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.launch
 
 class HeadsUpNotificationViewBinder
@@ -35,18 +36,21 @@
         coroutineScope {
             launch {
                 var previousKeys = emptySet<HeadsUpRowKey>()
-                viewModel.pinnedHeadsUpRows
+                combine(viewModel.pinnedHeadsUpRowKeys, viewModel.activeHeadsUpRowKeys, ::Pair)
                     .sample(viewModel.headsUpAnimationsEnabled, ::Pair)
                     .collect { (newKeys, animationsEnabled) ->
-                        val added = newKeys - previousKeys
-                        val removed = previousKeys - newKeys
-                        previousKeys = newKeys
+                        val pinned = newKeys.first
+                        val all = newKeys.second
+                        val added = all.union(pinned) - previousKeys
+                        val removed = previousKeys - pinned
+                        previousKeys = pinned
+                        Pair(added, removed)
 
                         if (animationsEnabled) {
                             added.forEach { key ->
                                 parentView.generateHeadsUpAnimation(
                                     obtainView(key),
-                                    /* isHeadsUp = */ true
+                                    /* isHeadsUp = */ true,
                                 )
                             }
                             removed.forEach { key ->
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
index 1d3f0e1..0474344 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -241,10 +241,10 @@
 import com.android.wm.shell.startingsurface.SplashscreenContentDrawer;
 import com.android.wm.shell.startingsurface.StartingSurface;
 
-import dagger.Lazy;
-
 import dalvik.annotation.optimization.NeverCompile;
 
+import dagger.Lazy;
+
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.Map;
@@ -304,6 +304,7 @@
             };
 
     void onStatusBarWindowStateChanged(@WindowVisibleState int state) {
+        StatusBarSimpleFragment.assertInLegacyMode();
         mStatusBarWindowState = state;
         updateBubblesVisibility();
     }
@@ -593,7 +594,9 @@
     private final ColorExtractor.OnColorsChangedListener mOnColorsChangedListener =
             (extractor, which) -> updateTheme();
     private final BrightnessMirrorShowingInteractor mBrightnessMirrorShowingInteractor;
-    private final GlanceableHubContainerController mGlanceableHubContainerController;
+
+    // Only use before the scene container. Null if scene container is enabled.
+    @Nullable private final GlanceableHubContainerController mGlanceableHubContainerController;
 
     private final EmergencyGestureIntentFactory mEmergencyGestureIntentFactory;
 
@@ -806,15 +809,20 @@
         mFingerprintManager = fingerprintManager;
         mActivityStarter = activityStarter;
         mBrightnessMirrorShowingInteractor = brightnessMirrorShowingInteractor;
-        mGlanceableHubContainerController = glanceableHubContainerController;
+        if (!SceneContainerFlag.isEnabled()) {
+            mGlanceableHubContainerController = glanceableHubContainerController;
+        } else {
+            mGlanceableHubContainerController = null;
+        }
         mEmergencyGestureIntentFactory = emergencyGestureIntentFactory;
 
         mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
         mStartingSurfaceOptional = startingSurfaceOptional;
         mDreamManager = dreamManager;
         lockscreenShadeTransitionController.setCentralSurfaces(this);
-        statusBarWindowStateController.addListener(this::onStatusBarWindowStateChanged);
-
+        if (!StatusBarSimpleFragment.isEnabled()) {
+            statusBarWindowStateController.addListener(this::onStatusBarWindowStateChanged);
+        }
         mScreenOffAnimationController = screenOffAnimationController;
 
         ShadeExpansionListener shadeExpansionListener = this::onPanelExpansionChanged;
@@ -901,10 +909,12 @@
         mWallpaperSupported = mWallpaperManager.isWallpaperSupported();
 
         RegisterStatusBarResult result = null;
-        try {
-            result = mBarService.registerStatusBar(mCommandQueue);
-        } catch (RemoteException ex) {
-            ex.rethrowFromSystemServer();
+        if (!StatusBarSimpleFragment.isEnabled()) {
+            try {
+                result = mBarService.registerStatusBar(mCommandQueue);
+            } catch (RemoteException ex) {
+                ex.rethrowFromSystemServer();
+            }
         }
 
         createAndAddWindows(result);
@@ -912,30 +922,45 @@
         // Set up the initial notification state. This needs to happen before CommandQueue.disable()
         setUpPresenter();
 
-        if ((result.mTransientBarTypes & WindowInsets.Type.statusBars()) != 0) {
-            mStatusBarModeRepository.getDefaultDisplay().showTransient();
-        }
-        mCommandQueueCallbacks.onSystemBarAttributesChanged(mDisplayId, result.mAppearance,
-                result.mAppearanceRegions, result.mNavbarColorManagedByIme, result.mBehavior,
-                result.mRequestedVisibleTypes, result.mPackageName, result.mLetterboxDetails);
-
-        // StatusBarManagerService has a back up of IME token and it's restored here.
-        mCommandQueueCallbacks.setImeWindowStatus(mDisplayId, result.mImeWindowVis,
-                result.mImeBackDisposition, result.mShowImeSwitcher);
-
-        // Set up the initial icon state
-        int numIcons = result.mIcons.size();
-        for (int i = 0; i < numIcons; i++) {
-            mCommandQueue.setIcon(result.mIcons.keyAt(i), result.mIcons.valueAt(i));
-        }
-
-        if (DEBUG) {
-            Log.d(TAG, String.format(
-                    "init: icons=%d disabled=0x%08x lights=0x%08x imeButton=0x%08x",
-                    numIcons,
-                    result.mDisabledFlags1,
+        // When the StatusBarSimpleFragment flag is enabled, this logic will be done in
+        // StatusBarOrchestrator
+        if (!StatusBarSimpleFragment.isEnabled()) {
+            if ((result.mTransientBarTypes & WindowInsets.Type.statusBars()) != 0) {
+                mStatusBarModeRepository.getDefaultDisplay().showTransient();
+            }
+            mCommandQueueCallbacks.onSystemBarAttributesChanged(
+                    mDisplayId,
                     result.mAppearance,
-                    result.mImeWindowVis));
+                    result.mAppearanceRegions,
+                    result.mNavbarColorManagedByIme,
+                    result.mBehavior,
+                    result.mRequestedVisibleTypes,
+                    result.mPackageName,
+                    result.mLetterboxDetails);
+
+            // StatusBarManagerService has a back up of IME token and it's restored here.
+            mCommandQueueCallbacks.setImeWindowStatus(
+                    mDisplayId,
+                    result.mImeWindowVis,
+                    result.mImeBackDisposition,
+                    result.mShowImeSwitcher);
+
+            // Set up the initial icon state
+            int numIcons = result.mIcons.size();
+            for (int i = 0; i < numIcons; i++) {
+                mCommandQueue.setIcon(result.mIcons.keyAt(i), result.mIcons.valueAt(i));
+            }
+
+            if (DEBUG) {
+                Log.d(
+                        TAG,
+                        String.format(
+                                "init: icons=%d disabled=0x%08x lights=0x%08x imeButton=0x%08x",
+                                numIcons,
+                                result.mDisabledFlags1,
+                                result.mAppearance,
+                                result.mImeWindowVis));
+            }
         }
 
         IntentFilter internalFilter = new IntentFilter();
@@ -1005,24 +1030,30 @@
 
         mAccessibilityFloatingMenuController.init();
 
-        // set the initial view visibility
-        int disabledFlags1 = result.mDisabledFlags1;
-        int disabledFlags2 = result.mDisabledFlags2;
-        mInitController.addPostInitTask(() -> {
-            setUpDisableFlags(disabledFlags1, disabledFlags2);
-            try {
-                // NOTE(b/262059863): Force-update the disable flags after applying the flags
-                // returned from registerStatusBar(). The result's disabled flags may be stale
-                // if StatusBarManager's disabled flags are updated between registering the bar and
-                // this handling this post-init task. We force an update in this case, and use a new
-                // token to not conflict with any other disabled flags already requested by SysUI
-                Binder token = new Binder();
-                mBarService.disable(DISABLE_HOME, token, mContext.getPackageName());
-                mBarService.disable(0, token, mContext.getPackageName());
-            } catch (RemoteException ex) {
-                ex.rethrowFromSystemServer();
-            }
-        });
+        // When the StatusBarSimpleFragment flag is enabled, this logic will be done in
+        // StatusBarOrchestrator
+        if (!StatusBarSimpleFragment.isEnabled()) {
+            // set the initial view visibility
+            int disabledFlags1 = result.mDisabledFlags1;
+            int disabledFlags2 = result.mDisabledFlags2;
+            mInitController.addPostInitTask(
+                    () -> {
+                        setUpDisableFlags(disabledFlags1, disabledFlags2);
+                        try {
+                            // NOTE(b/262059863): Force-update the disable flags after applying the
+                            // flags returned from registerStatusBar(). The result's disabled flags
+                            // may be stale if StatusBarManager's disabled flags are updated between
+                            // registering the bar and this handling this post-init task. We force
+                            // an update in this case, and use a new token to not conflict with any
+                            // other disabled flags already requested by SysUI
+                            Binder token = new Binder();
+                            mBarService.disable(DISABLE_HOME, token, mContext.getPackageName());
+                            mBarService.disable(0, token, mContext.getPackageName());
+                        } catch (RemoteException ex) {
+                            ex.rethrowFromSystemServer();
+                        }
+                    });
+        }
 
         registerCallbacks();
 
@@ -1101,7 +1132,7 @@
 
     /**
      * @deprecated use {@link
-     * WindowRootViewVisibilityInteractor.isLockscreenOrShadeVisible} instead.
+     * WindowRootViewVisibilityInteractor#isLockscreenOrShadeVisible()} instead.
      */    @VisibleForTesting
     @Deprecated
     void initShadeVisibilityListener() {
@@ -1168,13 +1199,16 @@
         mWallpaperController.setRootView(getNotificationShadeWindowView());
 
         mDemoModeController.addCallback(mDemoModeCallback);
-        mJavaAdapter.alwaysCollectFlow(
-                mStatusBarModeRepository.getDefaultDisplay().isTransientShown(),
-                this::onTransientShownChanged);
-        mJavaAdapter.alwaysCollectFlow(
-                mStatusBarModeRepository.getDefaultDisplay().getStatusBarMode(),
-                this::updateBarMode);
-
+        // When the StatusBarSimpleFragment flag is enabled, this logic will be done in
+        // StatusBarOrchestrator.
+        if (!StatusBarSimpleFragment.isEnabled()) {
+            mJavaAdapter.alwaysCollectFlow(
+                    mStatusBarModeRepository.getDefaultDisplay().isTransientShown(),
+                    this::onTransientShownChanged);
+            mJavaAdapter.alwaysCollectFlow(
+                    mStatusBarModeRepository.getDefaultDisplay().getStatusBarMode(),
+                    this::updateBarMode);
+        }
         mCommandQueueCallbacks = mCommandQueueCallbacksLazy.get();
         mCommandQueue.addCallback(mCommandQueueCallbacks);
 
@@ -1184,59 +1218,70 @@
                 mShadeExpansionStateManager.addExpansionListener(mWakeUpCoordinator);
         mWakeUpCoordinator.onPanelExpansionChanged(currentState);
 
-        // Allow plugins to reference DarkIconDispatcher and StatusBarStateController
-        mPluginDependencyProvider.allowPluginDependency(DarkIconDispatcher.class);
-        mPluginDependencyProvider.allowPluginDependency(StatusBarStateController.class);
-
-        // Set up CollapsedStatusBarFragment and PhoneStatusBarView
-        mStatusBarInitializer.setStatusBarViewUpdatedListener(
-                (statusBarViewController, statusBarTransitions) -> {
-                    mPhoneStatusBarViewController = statusBarViewController;
-                    mStatusBarTransitions = statusBarTransitions;
-                    getNotificationShadeWindowViewController()
-                            .setStatusBarViewController(mPhoneStatusBarViewController);
-                    // Ensure we re-propagate panel expansion values to the panel controller and
-                    // any listeners it may have, such as PanelBar. This will also ensure we
-                    // re-display the notification panel if necessary (for example, if
-                    // a heads-up notification was being displayed and should continue being
-                    // displayed).
-                    mShadeSurface.updateExpansionAndVisibility();
-                    setBouncerShowingForStatusBarComponents(mBouncerShowing);
-                    checkBarModes();
-                });
-        // When the flag is on, we register the fragment as a core startable and this is not needed
+        // When the StatusBarSimpleFragment flag is enabled, all this logic will be done in
+        // StatusBarOrchestrator.
         if (!StatusBarSimpleFragment.isEnabled()) {
+            // Allow plugins to reference DarkIconDispatcher and StatusBarStateController
+            mPluginDependencyProvider.allowPluginDependency(DarkIconDispatcher.class);
+            mPluginDependencyProvider.allowPluginDependency(StatusBarStateController.class);
+
+            // Set up CollapsedStatusBarFragment and PhoneStatusBarView
+            mStatusBarInitializer.setStatusBarViewUpdatedListener(
+                    (statusBarViewController, statusBarTransitions) -> {
+
+                        mPhoneStatusBarViewController = statusBarViewController;
+                        mStatusBarTransitions = statusBarTransitions;
+                        getNotificationShadeWindowViewController()
+                                .setStatusBarViewController(mPhoneStatusBarViewController);
+                        // Ensure we re-propagate panel expansion values to the panel controller and
+                        // any listeners it may have, such as PanelBar. This will also ensure we
+                        // re-display the notification panel if necessary (for example, if
+                        // a heads-up notification was being displayed and should continue being
+                        // displayed).
+                        mShadeSurface.updateExpansionAndVisibility();
+                        setBouncerShowingForStatusBarComponents(mBouncerShowing);
+                        checkBarModes();
+                    });
+            // When the flag is on, we register the fragment as a core startable and this is not
+            // needed
             mStatusBarInitializer.initializeStatusBar();
         }
 
         mStatusBarTouchableRegionManager.setup(getNotificationShadeWindowView());
 
-        createNavigationBar(result);
+        if (!StatusBarSimpleFragment.isEnabled()) {
+            createNavigationBar(result);
+        }
 
         mAmbientIndicationContainer = getNotificationShadeWindowView().findViewById(
                 R.id.ambient_indication_container);
 
-        mAutoHideController.setStatusBar(new AutoHideUiElement() {
-            @Override
-            public void synchronizeState() {
-                checkBarModes();
-            }
+        // When the StatusBarSimpleFragment flag is enabled, all this logic will be done in
+        // StatusBarOrchestrator.
+        if (!StatusBarSimpleFragment.isEnabled()) {
+            mAutoHideController.setStatusBar(
+                    new AutoHideUiElement() {
+                        @Override
+                        public void synchronizeState() {
+                            checkBarModes();
+                        }
 
-            @Override
-            public boolean shouldHideOnTouch() {
-                return !mRemoteInputManager.isRemoteInputActive();
-            }
+                        @Override
+                        public boolean shouldHideOnTouch() {
+                            return !mRemoteInputManager.isRemoteInputActive();
+                        }
 
-            @Override
-            public boolean isVisible() {
-                return isTransientShown();
-            }
+                        @Override
+                        public boolean isVisible() {
+                            return isTransientShown();
+                        }
 
-            @Override
-            public void hide() {
-                mStatusBarModeRepository.getDefaultDisplay().clearTransient();
-            }
-        });
+                        @Override
+                        public void hide() {
+                            mStatusBarModeRepository.getDefaultDisplay().clearTransient();
+                        }
+                    });
+        }
 
         ScrimView scrimBehind = getNotificationShadeWindowView().findViewById(R.id.scrim_behind);
         ScrimView notificationsScrim = getNotificationShadeWindowView()
@@ -1479,12 +1524,14 @@
      * @param state2 disable2 flags
      */
     protected void setUpDisableFlags(int state1, int state2) {
+        StatusBarSimpleFragment.assertInLegacyMode();
         mCommandQueue.disable(mDisplayId, state1, state2, false /* animate */);
     }
 
     // TODO(b/117478341): This was left such that CarStatusBar can override this method.
     // Try to remove this.
     protected void createNavigationBar(@Nullable RegisterStatusBarResult result) {
+        StatusBarSimpleFragment.assertInLegacyMode();
         mNavigationBarController.createNavigationBars(true /* includeDefaultDisplay */, result);
     }
 
@@ -1697,14 +1744,16 @@
     @Override
     public void checkBarModes() {
         if (mDemoModeController.isInDemoMode()) return;
-        if (mStatusBarTransitions != null) {
+        // When the StatusBarSimpleFragment flag is enabled, this logic will be done in
+        // StatusBarOrchestrator.
+        if (!StatusBarSimpleFragment.isEnabled() && mStatusBarTransitions != null) {
             checkBarMode(
                     mStatusBarModeRepository.getDefaultDisplay().getStatusBarMode().getValue(),
                     mStatusBarWindowState,
                     mStatusBarTransitions);
+            mNoAnimationOnNextBarModeChange = false;
         }
         mNavigationBarController.checkNavBarModes(mDisplayId);
-        mNoAnimationOnNextBarModeChange = false;
     }
 
     /** Temporarily hides Bubbles if the status bar is hidden. */
@@ -1728,7 +1777,9 @@
     }
 
     private void finishBarAnimations() {
-        if (mStatusBarTransitions != null) {
+        // When the StatusBarSimpleFragment flag is enabled, this logic will be done in
+        // StatusBarOrchestrator.
+        if (!StatusBarSimpleFragment.isEnabled() && mStatusBarTransitions != null) {
             mStatusBarTransitions.finishAnimations();
         }
         mNavigationBarController.finishBarAnimations(mDisplayId);
@@ -1770,14 +1821,17 @@
         }
 
         pw.print("  mInteractingWindows="); pw.println(mInteractingWindows);
-        pw.print("  mStatusBarWindowState=");
-        pw.println(windowStateToString(mStatusBarWindowState));
+        if (!StatusBarSimpleFragment.isEnabled()) {
+            pw.print("  mStatusBarWindowState=");
+            pw.println(windowStateToString(mStatusBarWindowState));
+        }
         pw.print("  mDozing="); pw.println(mDozing);
         pw.print("  mWallpaperSupported= "); pw.println(mWallpaperSupported);
 
-        CentralSurfaces.dumpBarTransitions(
-                pw, "PhoneStatusBarTransitions", mStatusBarTransitions);
-
+        if (!StatusBarSimpleFragment.isEnabled()) {
+            CentralSurfaces.dumpBarTransitions(
+                    pw, "PhoneStatusBarTransitions", mStatusBarTransitions);
+        }
         pw.println("  mMediaManager: ");
         if (mMediaManager != null) {
             mMediaManager.dump(pw, args);
@@ -1850,7 +1904,11 @@
     private void createAndAddWindows(@Nullable RegisterStatusBarResult result) {
         makeStatusBarView(result);
         mNotificationShadeWindowController.attach();
-        mStatusBarWindowController.attach();
+        // When the StatusBarSimpleFragment flag is enabled, this logic will be done in
+        // StatusBarOrchestrator
+        if (!StatusBarSimpleFragment.isEnabled()) {
+            mStatusBarWindowController.attach();
+        }
     }
 
     // called by makeStatusbar and also by PhoneStatusBarView
@@ -2475,7 +2533,7 @@
         int importance = bouncerShowing
                 ? IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
                 : IMPORTANT_FOR_ACCESSIBILITY_AUTO;
-        if (mPhoneStatusBarViewController != null) {
+        if (!StatusBarSimpleFragment.isEnabled() && mPhoneStatusBarViewController != null) {
             mPhoneStatusBarViewController.setImportantForAccessibility(importance);
         }
         mShadeSurface.setImportantForAccessibility(importance);
@@ -2920,7 +2978,9 @@
 
     @Override
     public void handleCommunalHubTouch(MotionEvent event) {
-        mGlanceableHubContainerController.onTouchEvent(event);
+        if (mGlanceableHubContainerController != null) {
+            mGlanceableHubContainerController.onTouchEvent(event);
+        }
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index 8c03538..f8eae36 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -411,7 +411,8 @@
                     mainActiveMode.getIcon().key().resPackage(),
                     mainActiveMode.getIcon().key().resId(),
                     mainActiveMode.getIcon().drawable(),
-                    mainActiveMode.getName(),
+                    mResources.getString(R.string.active_mode_content_description,
+                            mainActiveMode.getName()),
                     StatusBarIcon.Shape.FIXED_SPACE);
         }
         if (visible != mZenVisible) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 1ea26e5..479ffb7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -55,6 +55,7 @@
 import com.android.keyguard.KeyguardViewController;
 import com.android.keyguard.TrustGrantFlags;
 import com.android.keyguard.ViewMediatorCallback;
+import com.android.systemui.DejankUtils;
 import com.android.systemui.Flags;
 import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor;
 import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
@@ -63,6 +64,7 @@
 import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
 import com.android.systemui.bouncer.shared.flag.ComposeBouncerFlags;
 import com.android.systemui.bouncer.ui.BouncerView;
+import com.android.systemui.bouncer.util.BouncerTestUtilsKt;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor;
@@ -1202,6 +1204,11 @@
     @Override
     public void hide(long startTime, long fadeoutDuration) {
         Trace.beginSection("StatusBarKeyguardViewManager#hide");
+        if (Flags.checkLockscreenGoneTransition()) {
+            DejankUtils.notifyRendererOfExpensiveFrame(
+                    mNotificationShadeWindowController.getWindowRootView(),
+                    "StatusBarKeyguardViewManager#hide");
+        }
         mKeyguardStateController.notifyKeyguardState(false,
                 mKeyguardStateController.isOccluded());
         launchPendingWakeupAction();
@@ -1552,8 +1559,10 @@
     }
 
     public boolean shouldDismissOnMenuPressed() {
-        return mPrimaryBouncerView.getDelegate() != null
-                && mPrimaryBouncerView.getDelegate().shouldDismissOnMenuPressed();
+        return (mPrimaryBouncerView.getDelegate() != null
+                && mPrimaryBouncerView.getDelegate().shouldDismissOnMenuPressed()) || (
+                ComposeBouncerFlags.INSTANCE.isEnabled() && BouncerTestUtilsKt.shouldEnableMenuKey(
+                        mContext.getResources()));
     }
 
     public boolean interceptMediaKey(KeyEvent event) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLocationPublisher.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLocationPublisher.kt
deleted file mode 100644
index 4e5ecfe..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLocationPublisher.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2021 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.systemui.statusbar.phone
-
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.statusbar.policy.CallbackController
-import java.lang.ref.WeakReference
-import javax.inject.Inject
-
-/**
- * Publishes updates to the status bar's margins.
- *
- * While the status bar view consumes the entire width of the device, the status bar
- * contents are laid out with margins for rounded corners, padding from the absolute
- * edges, and potentially display cutouts in the corner.
- */
-@SysUISingleton
-class StatusBarLocationPublisher @Inject constructor()
-: CallbackController<StatusBarMarginUpdatedListener> {
-    private val listeners = mutableSetOf<WeakReference<StatusBarMarginUpdatedListener>>()
-
-    var marginLeft: Int = 0
-        private set
-    var marginRight: Int = 0
-        private set
-
-    override fun addCallback(listener: StatusBarMarginUpdatedListener) {
-        listeners.add(WeakReference(listener))
-    }
-
-    override fun removeCallback(listener: StatusBarMarginUpdatedListener) {
-        var toRemove: WeakReference<StatusBarMarginUpdatedListener>? = null
-        for (l in listeners) {
-            if (l.get() == listener) {
-                toRemove = l
-            }
-        }
-
-        if (toRemove != null) {
-            listeners.remove(toRemove)
-        }
-    }
-
-    fun updateStatusBarMargin(left: Int, right: Int) {
-        marginLeft = left
-        marginRight = right
-
-        notifyListeners()
-    }
-
-    private fun notifyListeners() {
-        var listenerList: List<WeakReference<StatusBarMarginUpdatedListener>>
-        synchronized(this) {
-            listenerList = listeners.toList()
-        }
-
-        listenerList.forEach { wrapper ->
-            if (wrapper.get() == null) {
-                listeners.remove(wrapper)
-            }
-
-            wrapper.get()?.onStatusBarMarginUpdated(marginLeft, marginRight)
-        }
-    }
-}
-
-interface StatusBarMarginUpdatedListener {
-    fun onStatusBarMarginUpdated(marginLeft: Int, marginRight: Int)
-}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
index 0a6e7f5..93db2db 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
@@ -20,6 +20,7 @@
 import static android.service.notification.NotificationListenerService.REASON_CLICK;
 
 import static com.android.systemui.statusbar.phone.CentralSurfaces.getActivityOptions;
+import static com.android.systemui.util.kotlin.NullabilityKt.expectNotNull;
 
 import android.app.ActivityManager;
 import android.app.ActivityOptions;
@@ -43,6 +44,7 @@
 import android.util.EventLog;
 import android.view.View;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 
 import com.android.internal.jank.InteractionJankMonitor;
@@ -74,6 +76,7 @@
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.collection.provider.LaunchFullScreenIntentProvider;
 import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRowDragController;
 import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback;
@@ -110,6 +113,8 @@
                 boolean showOverTheLockScreen);
     }
 
+    private final static String TAG = "StatusBarNotificationActivityStarter";
+
     private final Context mContext;
     private final int mDisplayId;
 
@@ -227,6 +232,7 @@
      */
     @Override
     public void onNotificationBubbleIconClicked(NotificationEntry entry) {
+        expectNotNull(TAG, "entry", entry);
         Runnable action = () -> {
             mBubblesManagerOptional.ifPresent(bubblesManager ->
                     bubblesManager.onUserChangedBubble(entry, !entry.isBubble()));
@@ -249,10 +255,12 @@
      * Called when a notification is clicked.
      *
      * @param entry notification that was clicked
-     * @param row row for that notification
+     * @param row   row for that notification
      */
     @Override
     public void onNotificationClicked(NotificationEntry entry, ExpandableNotificationRow row) {
+        expectNotNull(TAG, "entry", entry);
+        expectNotNull(TAG, "row", row);
         mLogger.logStartingActivityFromClick(entry, row.isHeadsUpState(),
                 mKeyguardStateController.isVisible(),
                 mNotificationShadeWindowController.getPanelExpanded());
@@ -435,6 +443,7 @@
      */
     @Override
     public void onDragSuccess(NotificationEntry entry) {
+        expectNotNull(TAG, "entry", entry);
         // this method is not responsible for intent sending.
         // will focus follow operation only after drag-and-drop that notification.
         final NotificationVisibility nv = mVisibilityProvider.obtain(entry, true);
@@ -527,6 +536,8 @@
     @Override
     public void startNotificationGutsIntent(final Intent intent, final int appUid,
             ExpandableNotificationRow row) {
+        expectNotNull(TAG, "intent", intent);
+        expectNotNull(TAG, "row", row);
         boolean animate = mActivityStarter.shouldAnimateLaunch(true /* isActivityIntent */);
         ActivityStarter.OnDismissAction onDismissAction = new ActivityStarter.OnDismissAction() {
             @Override
@@ -547,8 +558,8 @@
                             (adapter) -> TaskStackBuilder.create(mContext)
                                     .addNextIntentWithParentStack(intent)
                                     .startActivities(getActivityOptions(
-                                            mDisplayId,
-                                            adapter),
+                                                    mDisplayId,
+                                                    adapter),
                                             new UserHandle(UserHandle.getUserId(appUid))));
                 });
                 return true;
@@ -565,6 +576,7 @@
 
     @Override
     public void startHistoryIntent(View view, boolean showHistory) {
+        ModesEmptyShadeFix.assertInLegacyMode();
         boolean animate = mActivityStarter.shouldAnimateLaunch(true /* isActivityIntent */);
         ActivityStarter.OnDismissAction onDismissAction = new ActivityStarter.OnDismissAction() {
             @Override
@@ -585,14 +597,14 @@
                             );
                     ActivityTransitionAnimator.Controller animationController =
                             viewController == null ? null
-                                : new StatusBarTransitionAnimatorController(
-                                        viewController,
-                                        mShadeAnimationInteractor,
-                                        mShadeController,
-                                        mNotificationShadeWindowController,
-                                        mCommandQueue,
-                                        mDisplayId,
-                                        true /* isActivityIntent */);
+                                    : new StatusBarTransitionAnimatorController(
+                                            viewController,
+                                            mShadeAnimationInteractor,
+                                            mShadeController,
+                                            mNotificationShadeWindowController,
+                                            mCommandQueue,
+                                            mDisplayId,
+                                            true /* isActivityIntent */);
 
                     mActivityTransitionAnimator.startIntentWithAnimation(
                             animationController, animate, intent.getPackage(),
@@ -612,6 +624,51 @@
                 false /* afterKeyguardGone */);
     }
 
+    @Override
+    public void startSettingsIntent(@NonNull View view, @NonNull SettingsIntent intentInfo) {
+        boolean animate = mActivityStarter.shouldAnimateLaunch(true /* isActivityIntent */);
+        ActivityStarter.OnDismissAction onDismissAction = new ActivityStarter.OnDismissAction() {
+            @Override
+            public boolean onDismiss() {
+                AsyncTask.execute(() -> {
+                    TaskStackBuilder tsb = TaskStackBuilder.create(mContext);
+                    for (Intent intent : intentInfo.getBackStack()) {
+                        tsb.addNextIntent(intent);
+                    }
+                    tsb.addNextIntent(intentInfo.getTargetIntent());
+
+                    ActivityTransitionAnimator.Controller viewController =
+                            ActivityTransitionAnimator.Controller.fromView(view,
+                                    intentInfo.getCujType());
+                    ActivityTransitionAnimator.Controller animationController =
+                            viewController == null ? null
+                                    : new StatusBarTransitionAnimatorController(
+                                            viewController,
+                                            mShadeAnimationInteractor,
+                                            mShadeController,
+                                            mNotificationShadeWindowController,
+                                            mCommandQueue,
+                                            mDisplayId,
+                                            true /* isActivityIntent */);
+
+                    mActivityTransitionAnimator.startIntentWithAnimation(
+                            animationController, animate, intentInfo.getTargetIntent().getPackage(),
+                            (adapter) -> tsb.startActivities(
+                                    getActivityOptions(mDisplayId, adapter),
+                                    mUserTracker.getUserHandle()));
+                });
+                return true;
+            }
+
+            @Override
+            public boolean willRunAnimationOnKeyguard() {
+                return animate;
+            }
+        };
+        mActivityStarter.dismissKeyguardThenExecute(onDismissAction, null,
+                false /* afterKeyguardGone */);
+    }
+
     private void removeHunAfterClick(ExpandableNotificationRow row) {
         String key = row.getEntry().getSbn().getKey();
         if (mHeadsUpManager != null && mHeadsUpManager.isHeadsUpEntry(key)) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
index b1754fd..200f080 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
@@ -34,11 +34,15 @@
 
 import androidx.annotation.Nullable;
 
+import com.android.compose.animation.scene.ObservableTransitionState;
 import com.android.systemui.ActivityIntentHelper;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor;
 import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.scene.domain.interactor.SceneInteractor;
+import com.android.systemui.scene.shared.flag.SceneContainerFlag;
 import com.android.systemui.shade.ShadeController;
 import com.android.systemui.statusbar.ActionClickLogger;
 import com.android.systemui.statusbar.CommandQueue;
@@ -52,6 +56,9 @@
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.util.kotlin.JavaAdapter;
+
+import dagger.Lazy;
 
 import java.util.concurrent.Executor;
 
@@ -80,6 +87,8 @@
     private final ActionClickLogger mActionClickLogger;
     private int mDisabled2;
     protected BroadcastReceiver mChallengeReceiver = new ChallengeReceiver();
+    private final Lazy<DeviceUnlockedInteractor> mDeviceUnlockedInteractorLazy;
+    private final Lazy<SceneInteractor> mSceneInteractorLazy;
 
     /**
      */
@@ -95,7 +104,10 @@
             ShadeController shadeController,
             CommandQueue commandQueue,
             ActionClickLogger clickLogger,
-            @Main Executor executor) {
+            @Main Executor executor,
+            Lazy<DeviceUnlockedInteractor> deviceUnlockedInteractorLazy,
+            Lazy<SceneInteractor> sceneInteractorLazy,
+            JavaAdapter javaAdapter) {
         mContext = context;
         mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
         mShadeController = shadeController;
@@ -113,20 +125,28 @@
         mActionClickLogger = clickLogger;
         mActivityIntentHelper = new ActivityIntentHelper(mContext);
         mGroupExpansionManager = groupExpansionManager;
+        mDeviceUnlockedInteractorLazy = deviceUnlockedInteractorLazy;
+        mSceneInteractorLazy = sceneInteractorLazy;
+
+        if (SceneContainerFlag.isEnabled()) {
+            javaAdapter.alwaysCollectFlow(
+                    mDeviceUnlockedInteractorLazy.get().getDeviceUnlockStatus(),
+                    deviceUnlockStatus -> onStateChanged(mStatusBarStateController.getState()));
+            javaAdapter.alwaysCollectFlow(
+                    mSceneInteractorLazy.get().getTransitionState(),
+                    deviceUnlockStatus -> onStateChanged(mStatusBarStateController.getState()));
+        }
     }
 
     @Override
     public void onStateChanged(int state) {
-        boolean hasPendingRemoteInput = mPendingRemoteInputView != null;
-        if (state == StatusBarState.SHADE
-                && (mStatusBarStateController.leaveOpenOnKeyguardHide() || hasPendingRemoteInput)) {
-            if (!mStatusBarStateController.isKeyguardRequested()
-                    && mKeyguardStateController.isUnlocked()) {
-                if (hasPendingRemoteInput) {
-                    mExecutor.execute(mPendingRemoteInputView::callOnClick);
-                }
-                mPendingRemoteInputView = null;
-            }
+        if (mPendingRemoteInputView == null) {
+            return;
+        }
+
+        if (state == StatusBarState.SHADE && canRetryPendingRemoteInput()) {
+            mExecutor.execute(mPendingRemoteInputView::callOnClick);
+            mPendingRemoteInputView = null;
         }
     }
 
@@ -320,6 +340,23 @@
         }
     }
 
+    /**
+     * Returns {@code true} if it is safe to retry a pending remote input. The exact criteria for
+     * this vary depending whether the scene container is enabled.
+     */
+    private boolean canRetryPendingRemoteInput() {
+        if (SceneContainerFlag.isEnabled()) {
+            final boolean isUnlocked = mDeviceUnlockedInteractorLazy.get()
+                    .getDeviceUnlockStatus().getValue().isUnlocked();
+            final boolean isIdle = mSceneInteractorLazy.get()
+                    .getTransitionState().getValue() instanceof ObservableTransitionState.Idle;
+            return isUnlocked && isIdle;
+        } else {
+            return mKeyguardStateController.isUnlocked()
+                    && !mStatusBarStateController.isKeyguardRequested();
+        }
+    }
+
     protected class ChallengeReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt
index 13b651e8..5b03198 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt
@@ -16,10 +16,20 @@
 package com.android.systemui.statusbar.phone.dagger
 
 import com.android.systemui.CoreStartable
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.statusbar.CommandQueue
+import com.android.systemui.statusbar.core.CommandQueueInitializer
 import com.android.systemui.statusbar.core.StatusBarInitializer
 import com.android.systemui.statusbar.core.StatusBarInitializerImpl
+import com.android.systemui.statusbar.core.StatusBarOrchestrator
+import com.android.systemui.statusbar.core.StatusBarSimpleFragment
+import com.android.systemui.statusbar.phone.CentralSurfacesCommandQueueCallbacks
+import com.android.systemui.statusbar.window.data.repository.StatusBarWindowStateRepositoryStore
+import com.android.systemui.statusbar.window.data.repository.StatusBarWindowStateRepositoryStoreImpl
 import dagger.Binds
+import dagger.Lazy
 import dagger.Module
+import dagger.Provides
 import dagger.multibindings.ClassKey
 import dagger.multibindings.IntoMap
 
@@ -27,6 +37,16 @@
 @Module
 interface StatusBarPhoneModule {
 
+    @Binds
+    abstract fun windowStateRepoStore(
+        impl: StatusBarWindowStateRepositoryStoreImpl
+    ): StatusBarWindowStateRepositoryStore
+
+    @Binds
+    abstract fun commandQCallbacks(
+        impl: CentralSurfacesCommandQueueCallbacks
+    ): CommandQueue.Callbacks
+
     /** Binds {@link StatusBarInitializer} as a {@link CoreStartable}. */
     @Binds
     @IntoMap
@@ -34,4 +54,34 @@
     fun bindStatusBarInitializer(impl: StatusBarInitializerImpl): CoreStartable
 
     @Binds fun statusBarInitializer(impl: StatusBarInitializerImpl): StatusBarInitializer
+
+    companion object {
+        @Provides
+        @SysUISingleton
+        @IntoMap
+        @ClassKey(StatusBarOrchestrator::class)
+        fun orchestratorCoreStartable(
+            orchestratorLazy: Lazy<StatusBarOrchestrator>
+        ): CoreStartable {
+            return if (StatusBarSimpleFragment.isEnabled) {
+                orchestratorLazy.get()
+            } else {
+                CoreStartable.NOP
+            }
+        }
+
+        @Provides
+        @SysUISingleton
+        @IntoMap
+        @ClassKey(CommandQueueInitializer::class)
+        fun commandQueueInitializerCoreStartable(
+            initializerLazy: Lazy<CommandQueueInitializer>
+        ): CoreStartable {
+            return if (StatusBarSimpleFragment.isEnabled) {
+                initializerLazy.get()
+            } else {
+                CoreStartable.NOP
+            }
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
index a8b4728..c258095 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
@@ -65,7 +65,6 @@
 import com.android.systemui.statusbar.phone.PhoneStatusBarView;
 import com.android.systemui.statusbar.phone.StatusBarHideIconsForBouncerManager;
 import com.android.systemui.statusbar.phone.StatusBarLocation;
-import com.android.systemui.statusbar.phone.StatusBarLocationPublisher;
 import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent;
 import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent.Startable;
 import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
@@ -140,7 +139,6 @@
     private final OperatorNameViewController.Factory mOperatorNameViewControllerFactory;
     private final OngoingCallController mOngoingCallController;
     private final SystemStatusAnimationScheduler mAnimationScheduler;
-    private final StatusBarLocationPublisher mLocationPublisher;
     private final ShadeExpansionStateManager mShadeExpansionStateManager;
     private final StatusBarIconController mStatusBarIconController;
     private final CarrierConfigTracker mCarrierConfigTracker;
@@ -243,7 +241,6 @@
             StatusBarFragmentComponent.Factory statusBarFragmentComponentFactory,
             OngoingCallController ongoingCallController,
             SystemStatusAnimationScheduler animationScheduler,
-            StatusBarLocationPublisher locationPublisher,
             ShadeExpansionStateManager shadeExpansionStateManager,
             StatusBarIconController statusBarIconController,
             DarkIconManager.Factory darkIconManagerFactory,
@@ -267,7 +264,6 @@
         mStatusBarFragmentComponentFactory = statusBarFragmentComponentFactory;
         mOngoingCallController = ongoingCallController;
         mAnimationScheduler = animationScheduler;
-        mLocationPublisher = locationPublisher;
         mShadeExpansionStateManager = shadeExpansionStateManager;
         mStatusBarIconController = statusBarIconController;
         mCollapsedStatusBarViewModel = collapsedStatusBarViewModel;
@@ -349,9 +345,6 @@
         }
 
         mStatusBar = (PhoneStatusBarView) view;
-        View contents = mStatusBar.findViewById(R.id.status_bar_contents);
-        contents.addOnLayoutChangeListener(mStatusBarLayoutListener);
-        updateStatusBarLocation(contents.getLeft(), contents.getRight());
         if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_PANEL_STATE)) {
             mStatusBar.restoreHierarchyState(
                     savedInstanceState.getSparseParcelableArray(EXTRA_PANEL_STATE));
@@ -977,13 +970,6 @@
         }, /*isAnimationRunning*/ false);
     }
 
-    private void updateStatusBarLocation(int left, int right) {
-        int leftMargin = left - mStatusBar.getLeft();
-        int rightMargin = mStatusBar.getRight() - right;
-
-        mLocationPublisher.updateStatusBarMargin(leftMargin, rightMargin);
-    }
-
     private final ContentObserver mVolumeSettingObserver = new ContentObserver(null) {
         @Override
         public void onChange(boolean selfChange) {
@@ -991,14 +977,6 @@
         }
     };
 
-    // Listen for view end changes of PhoneStatusBarView and publish that to the privacy dot
-    private View.OnLayoutChangeListener mStatusBarLayoutListener =
-            (view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
-                if (left != oldLeft || right != oldRight) {
-                    updateStatusBarLocation(left, right);
-                }
-            };
-
     @Override
     public void dump(PrintWriter printWriter, String[] args) {
         IndentingPrintWriter pw = new IndentingPrintWriter(printWriter, /* singleIndent= */"  ");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/CollapsedStatusBarViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/CollapsedStatusBarViewBinder.kt
index eea4c21..9c168be 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/CollapsedStatusBarViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/CollapsedStatusBarViewBinder.kt
@@ -95,7 +95,8 @@
                                         primaryChipView.show(shouldAnimateChange = true)
                                     is OngoingActivityChipModel.Hidden ->
                                         primaryChipView.hide(
-                                            shouldAnimateChange = primaryChipModel.shouldAnimate
+                                            state = View.GONE,
+                                            shouldAnimateChange = primaryChipModel.shouldAnimate,
                                         )
                                 }
                             } else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/model/InternetTileIconModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/model/InternetTileIconModel.kt
new file mode 100644
index 0000000..f8958e0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/model/InternetTileIconModel.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.pipeline.shared.ui.model
+
+import com.android.systemui.common.shared.model.Icon
+
+sealed interface InternetTileIconModel {
+    data class ResourceId(val resId: Int) : InternetTileIconModel
+
+    data class Cellular(val level: Int) : InternetTileIconModel
+
+    data class Satellite(val resourceIcon: Icon.Resource) : InternetTileIconModel
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt
index 674cbb7..d406ed4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt
@@ -46,6 +46,8 @@
 
     private val tag = "AvalancheController"
     private val debug = Compile.IS_DEBUG && Log.isLoggable(tag, Log.DEBUG)
+    var baseEntryMapStr : () -> String = { "baseEntryMapStr not initialized" }
+
     var enableAtRuntime = true
         set(value) {
             if (!value) {
@@ -116,17 +118,25 @@
         val key = getKey(entry)
 
         if (runnable == null) {
-            headsUpManagerLogger.logAvalancheUpdate(caller, isEnabled, key, "Runnable NULL, stop")
+            headsUpManagerLogger.logAvalancheUpdate(
+                caller, isEnabled, key,
+                "Runnable NULL, stop. ${getStateStr()}"
+            )
             return
         }
         if (!isEnabled) {
-            headsUpManagerLogger.logAvalancheUpdate(caller, isEnabled, key,
-                    "NOT ENABLED, run runnable")
+            headsUpManagerLogger.logAvalancheUpdate(
+                caller, isEnabled, key,
+                "NOT ENABLED, run runnable. ${getStateStr()}"
+            )
             runnable.run()
             return
         }
         if (entry == null) {
-            headsUpManagerLogger.logAvalancheUpdate(caller, isEnabled, key, "Entry NULL, stop")
+            headsUpManagerLogger.logAvalancheUpdate(
+                caller, isEnabled, key,
+                "Entry NULL, stop. ${getStateStr()}"
+            )
             return
         }
         if (debug) {
@@ -181,32 +191,40 @@
         val key = getKey(entry)
 
         if (runnable == null) {
-            headsUpManagerLogger.logAvalancheDelete(caller, isEnabled, key, "Runnable NULL, stop")
+            headsUpManagerLogger.logAvalancheDelete(
+                caller, isEnabled, key,
+                "Runnable NULL, stop. ${getStateStr()}"
+            )
             return
         }
         if (!isEnabled) {
-            headsUpManagerLogger.logAvalancheDelete(caller, isEnabled, key,
-                    "NOT ENABLED, run runnable")
             runnable.run()
+            headsUpManagerLogger.logAvalancheDelete(
+                caller, isEnabled = false, key,
+                "NOT ENABLED, run runnable. ${getStateStr()}"
+            )
             return
         }
         if (entry == null) {
-            headsUpManagerLogger.logAvalancheDelete(caller, isEnabled, key,
-                    "Entry NULL, run runnable")
             runnable.run()
+            headsUpManagerLogger.logAvalancheDelete(
+                caller, isEnabled = true, key,
+                "Entry NULL, run runnable. ${getStateStr()}"
+            )
             return
         }
         val outcome: String
         if (entry in nextMap) {
-            outcome = "remove from next"
             if (entry in nextMap) nextMap.remove(entry)
             if (entry in nextList) nextList.remove(entry)
             uiEventLogger.log(ThrottleEvent.AVALANCHE_THROTTLING_HUN_REMOVED)
+            outcome = "remove from next. ${getStateStr()}"
+
         } else if (entry in debugDropSet) {
-            outcome = "remove from dropset"
             debugDropSet.remove(entry)
+            outcome = "remove from dropset. ${getStateStr()}"
+
         } else if (isShowing(entry)) {
-            outcome = "remove showing"
             previousHunKey = getKey(headsUpEntryShowing)
             // Show the next HUN before removing this one, so that we don't tell listeners
             // onHeadsUpPinnedModeChanged, which causes
@@ -214,9 +232,11 @@
             // HUN is animating out, resulting in a flicker.
             showNext()
             runnable.run()
+            outcome = "remove showing. ${getStateStr()}"
+
         } else {
-            outcome = "run runnable for untracked shown"
             runnable.run()
+            outcome = "run runnable for untracked shown HUN. ${getStateStr()}"
         }
         headsUpManagerLogger.logAvalancheDelete(caller, isEnabled(), getKey(entry), outcome)
     }
@@ -405,7 +425,9 @@
                 "\n\tprevious: [$previousHunKey]" +
                 "\n\tnext list: $nextListStr" +
                 "\n\tnext map: $nextMapStr" +
-                "\n\tdropped: $dropSetStr"
+                "\n\tdropped: $dropSetStr" +
+                "\nBHUM.mHeadsUpEntryMap: " +
+                baseEntryMapStr()
     }
 
     private val dropSetStr: String
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BaseHeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BaseHeadsUpManager.java
index f37393a..4284c19 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BaseHeadsUpManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BaseHeadsUpManager.java
@@ -116,6 +116,7 @@
         mAccessibilityMgr = accessibilityManagerWrapper;
         mUiEventLogger = uiEventLogger;
         mAvalancheController = avalancheController;
+        mAvalancheController.setBaseEntryMapStr(this::getEntryMapStr);
         Resources resources = context.getResources();
         mMinimumDisplayTime = NotificationThrottleHun.isEnabled()
                 ? 500 : resources.getInteger(R.integer.heads_up_notification_minimum_time);
@@ -583,6 +584,18 @@
         return  mUser;
     }
 
+    private String getEntryMapStr() {
+        if (mHeadsUpEntryMap.isEmpty()) {
+            return "EMPTY";
+        }
+        StringBuilder entryMapStr = new StringBuilder();
+        for (HeadsUpEntry entry: mHeadsUpEntryMap.values()) {
+            entryMapStr.append("\n\t").append(
+                    entry.mEntry == null ? "null" : entry.mEntry.getKey());
+        }
+        return entryMapStr.toString();
+    }
+
     @Override
     public void dump(@NonNull PrintWriter pw, @NonNull String[] args) {
         pw.println("HeadsUpManager state:");
@@ -992,7 +1005,6 @@
          * Clear any pending removal runnables.
          */
         public void cancelAutoRemovalCallbacks(@Nullable String reason) {
-            mLogger.logAutoRemoveCancelRequest(this.mEntry, reason);
             Runnable runnable = () -> {
                 final boolean removed = cancelAutoRemovalCallbackInternal();
 
@@ -1001,6 +1013,7 @@
                 }
             };
             if (mEntry != null && isHeadsUpEntry(mEntry.getKey())) {
+                mLogger.logAutoRemoveCancelRequest(this.mEntry, reason);
                 mAvalancheController.update(this, runnable, reason + " cancelAutoRemovalCallbacks");
             } else {
                 // Just removed
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerExt.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerExt.kt
new file mode 100644
index 0000000..441cbb3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerExt.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.policy
+
+import com.android.systemui.statusbar.policy.DevicePostureController.DevicePostureInt
+import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.onStart
+
+/** [DevicePostureController.getDevicePosture] as a [Flow]. */
+@DevicePostureInt
+fun DevicePostureController.devicePosture(): Flow<Int> =
+    conflatedCallbackFlow {
+            val callback = DevicePostureController.Callback { posture -> trySend(posture) }
+            addCallback(callback)
+            awaitClose { removeCallback(callback) }
+        }
+        .onStart { emit(devicePosture) }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyControllerImpl.java
index da928a3..3cf2066 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyControllerImpl.java
@@ -32,6 +32,7 @@
 import androidx.annotation.NonNull;
 
 import com.android.internal.camera.flags.Flags;
+import com.android.systemui.settings.UserTracker;
 import com.android.systemui.util.ListenerSet;
 
 import java.util.Set;
@@ -41,14 +42,17 @@
     private static final int[] SENSORS = new int[] {CAMERA, MICROPHONE};
 
     private final @NonNull SensorPrivacyManager mSensorPrivacyManager;
+    private final @NonNull UserTracker mUserTracker;
     private final SparseBooleanArray mSoftwareToggleState = new SparseBooleanArray();
     private final SparseBooleanArray mHardwareToggleState = new SparseBooleanArray();
     private Boolean mRequiresAuthentication;
     private final ListenerSet<Callback> mCallbacks = new ListenerSet<>();
 
     public IndividualSensorPrivacyControllerImpl(
-            @NonNull SensorPrivacyManager sensorPrivacyManager) {
+            @NonNull SensorPrivacyManager sensorPrivacyManager,
+            @NonNull UserTracker userTracker) {
         mSensorPrivacyManager = sensorPrivacyManager;
+        mUserTracker = userTracker;
     }
 
     @Override
@@ -94,12 +98,14 @@
 
     @Override
     public void setSensorBlocked(@Source int source, @Sensor int sensor, boolean blocked) {
-        mSensorPrivacyManager.setSensorPrivacyForProfileGroup(source, sensor, blocked);
+        mSensorPrivacyManager.setSensorPrivacyForProfileGroup(source, sensor, blocked,
+                mUserTracker.getUserId());
     }
 
     @Override
     public void suppressSensorPrivacyReminders(int sensor, boolean suppress) {
-        mSensorPrivacyManager.suppressSensorPrivacyReminders(sensor, suppress);
+        mSensorPrivacyManager.suppressSensorPrivacyReminders(sensor, suppress,
+                mUserTracker.getUserId());
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
index e09e577..0cba940 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
@@ -16,8 +16,6 @@
 
 package com.android.systemui.statusbar.policy;
 
-import static com.android.systemui.Flags.registerZenModeContentObserverBackground;
-
 import android.app.AlarmManager;
 import android.app.Flags;
 import android.app.NotificationManager;
@@ -47,7 +45,6 @@
 import com.android.systemui.Dumpable;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.settings.UserTracker;
@@ -107,7 +104,6 @@
     public ZenModeControllerImpl(
             Context context,
             @Main Handler handler,
-            @Background Handler bgHandler,
             BroadcastDispatcher broadcastDispatcher,
             DumpManager dumpManager,
             GlobalSettings globalSettings,
@@ -138,17 +134,9 @@
             }
         };
         mNoMan = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
-        if (registerZenModeContentObserverBackground()) {
-            bgHandler.post(() -> {
-                globalSettings.registerContentObserverSync(Global.ZEN_MODE, modeContentObserver);
-                globalSettings.registerContentObserverSync(Global.ZEN_MODE_CONFIG_ETAG,
-                        configContentObserver);
-            });
-        } else {
-            globalSettings.registerContentObserverSync(Global.ZEN_MODE, modeContentObserver);
-            globalSettings.registerContentObserverSync(Global.ZEN_MODE_CONFIG_ETAG,
-                    configContentObserver);
-        }
+        globalSettings.registerContentObserverAsync(Global.ZEN_MODE, modeContentObserver);
+        globalSettings.registerContentObserverAsync(Global.ZEN_MODE_CONFIG_ETAG,
+                configContentObserver);
         updateZenMode(getModeSettingValueFromProvider());
         updateZenModeConfig();
         updateConsolidatedNotificationPolicy();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt
index ba45942..daba109 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt
@@ -20,6 +20,7 @@
 import android.provider.Settings
 import android.provider.Settings.Secure.ZEN_DURATION_FOREVER
 import android.provider.Settings.Secure.ZEN_DURATION_PROMPT
+import android.service.notification.ZenPolicy.VISUAL_EFFECT_NOTIFICATION_LIST
 import android.util.Log
 import androidx.concurrent.futures.await
 import com.android.settingslib.notification.data.repository.ZenModeRepository
@@ -29,6 +30,7 @@
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.modes.shared.ModesUi
 import com.android.systemui.shared.notifications.data.repository.NotificationSettingsRepository
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix
 import com.android.systemui.statusbar.policy.data.repository.DeviceProvisioningRepository
 import com.android.systemui.statusbar.policy.data.repository.UserSetupRepository
 import com.android.systemui.statusbar.policy.domain.model.ActiveZenModes
@@ -39,6 +41,7 @@
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.flow.map
 
@@ -54,8 +57,8 @@
     private val notificationSettingsRepository: NotificationSettingsRepository,
     @Background private val bgDispatcher: CoroutineDispatcher,
     private val iconLoader: ZenIconLoader,
-    private val deviceProvisioningRepository: DeviceProvisioningRepository,
-    private val userSetupRepository: UserSetupRepository,
+    deviceProvisioningRepository: DeviceProvisioningRepository,
+    userSetupRepository: UserSetupRepository,
 ) {
     val isZenAvailable: Flow<Boolean> =
         combine(
@@ -126,6 +129,25 @@
     val mainActiveMode: Flow<ZenModeInfo?> =
         activeModes.map { a -> a.mainMode }.distinctUntilChanged()
 
+    val modesHidingNotifications: Flow<List<ZenMode>> by lazy {
+        if (ModesEmptyShadeFix.isUnexpectedlyInLegacyMode() || !ModesUi.isEnabled) {
+            flowOf(listOf())
+        } else {
+            modes
+                .map { modes ->
+                    modes.filter { mode ->
+                        mode.isActive &&
+                            !mode.policy.isVisualEffectAllowed(
+                                /* effect = */ VISUAL_EFFECT_NOTIFICATION_LIST,
+                                /* defaultVal = */ true,
+                            )
+                    }
+                }
+                .flowOn(bgDispatcher)
+                .distinctUntilChanged()
+        }
+    }
+
     suspend fun getModeIcon(mode: ZenMode): ZenIcon {
         return iconLoader.getIcon(context, mode).await()
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegate.kt
index e1dcc52..a1d5cbe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegate.kt
@@ -19,17 +19,21 @@
 import android.content.Intent
 import android.provider.Settings
 import android.util.Log
+import androidx.compose.foundation.isSystemInDarkTheme
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.semantics.paneTitle
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.semantics.testTagsAsResourceId
 import androidx.lifecycle.DefaultLifecycleObserver
 import androidx.lifecycle.LifecycleOwner
 import com.android.compose.PlatformButton
 import com.android.compose.PlatformOutlinedButton
+import com.android.compose.theme.PlatformTheme
 import com.android.internal.annotations.VisibleForTesting
 import com.android.internal.jank.InteractionJankMonitor
 import com.android.systemui.animation.DialogCuj
@@ -74,7 +78,7 @@
             currentDialog?.dismiss()
         }
 
-        currentDialog = sysuiDialogFactory.create() { ModesDialogContent(it) }
+        currentDialog = sysuiDialogFactory.create { ModesDialogContent(it) }
         currentDialog
             ?.lifecycle
             ?.addObserver(
@@ -91,28 +95,40 @@
 
     @Composable
     private fun ModesDialogContent(dialog: SystemUIDialog) {
-        AlertDialogContent(
-            modifier = Modifier.semantics {
-                testTagsAsResourceId = true
-            },
-            title = {
-                Text(
-                    modifier = Modifier.testTag("modes_title"),
-                    text = stringResource(R.string.zen_modes_dialog_title)
-                )
-            },
-            content = { ModeTileGrid(viewModel.get()) },
-            neutralButton = {
-                PlatformOutlinedButton(onClick = { openSettings(dialog) }) {
-                    Text(stringResource(R.string.zen_modes_dialog_settings))
-                }
-            },
-            positiveButton = {
-                PlatformButton(onClick = { dialog.dismiss() }) {
-                    Text(stringResource(R.string.zen_modes_dialog_done))
-                }
-            },
-        )
+        // TODO(b/369376884): The composable does correctly update when the theme changes
+        //  while the dialog is open, but the background (which we don't control here)
+        //  doesn't, which causes us to show things like white text on a white background.
+        //  as a workaround, we remember the original theme and keep it on recomposition.
+        val isCurrentlyInDarkTheme = isSystemInDarkTheme()
+        val cachedDarkTheme = remember { isCurrentlyInDarkTheme }
+        PlatformTheme(isDarkTheme = cachedDarkTheme) {
+            AlertDialogContent(
+                modifier =
+                    Modifier.semantics {
+                        testTagsAsResourceId = true
+                        paneTitle = dialog.context.getString(
+                            R.string.accessibility_desc_quick_settings
+                        )
+                    },
+                title = {
+                    Text(
+                        modifier = Modifier.testTag("modes_title"),
+                        text = stringResource(R.string.zen_modes_dialog_title),
+                    )
+                },
+                content = { ModeTileGrid(viewModel.get()) },
+                neutralButton = {
+                    PlatformOutlinedButton(onClick = { openSettings(dialog) }) {
+                        Text(stringResource(R.string.zen_modes_dialog_settings))
+                    }
+                },
+                positiveButton = {
+                    PlatformButton(onClick = { dialog.dismiss() }) {
+                        Text(stringResource(R.string.zen_modes_dialog_done))
+                    }
+                },
+            )
+        }
     }
 
     @VisibleForTesting
@@ -128,8 +144,8 @@
         }
         activityStarter.startActivity(
             ZEN_MODE_SETTINGS_INTENT,
-            true /* dismissShade */,
-            animationController
+            /* dismissShade= */ true,
+            animationController,
         )
     }
 
@@ -163,7 +179,7 @@
             Log.w(
                 TAG,
                 "Cannot launch from dialog, the dialog is not present. " +
-                    "Will launch activity without animating."
+                    "Will launch activity without animating.",
             )
         }
 
@@ -172,11 +188,7 @@
         if (animationController == null) {
             currentDialog?.dismiss()
         }
-        activityStarter.startActivity(
-            intent,
-            true, /* dismissShade */
-            animationController,
-        )
+        activityStarter.startActivity(intent, /* dismissShade= */ true, animationController)
     }
 
     companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModel.kt
index 6764839c..4f595ed 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModel.kt
@@ -76,7 +76,7 @@
                         // can be manually toggled on
                         mode.rule.isEnabled -> mode.isActive || mode.rule.isManualInvocationAllowed
                         // Mode was created as disabled, or disabled by the app that owns it ->
-                        // will be shown with a "Set up" text
+                        // will be shown with a "Not set" text
                         !mode.rule.isEnabled -> mode.status == ZenMode.Status.DISABLED_BY_OTHER
                         else -> false
                     }
@@ -120,7 +120,7 @@
                         },
                         onLongClick = { openSettings(mode) },
                         onLongClickLabel =
-                            context.resources.getString(R.string.accessibility_long_click_tile)
+                            context.resources.getString(R.string.accessibility_long_click_tile),
                     )
                 }
             }
@@ -137,10 +137,10 @@
 
     /**
      * Returns a description of the mode, which is:
-     *   * a prompt to set up the mode if it is not enabled
-     *   * if it cannot be manually activated, text that says so
-     *   * otherwise, the trigger description of the mode if it exists...
-     *   * ...or null if it doesn't
+     * * a prompt to set up the mode if it is not enabled
+     * * if it cannot be manually activated, text that says so
+     * * otherwise, the trigger description of the mode if it exists...
+     * * ...or null if it doesn't
      *
      * This description is used directly for the content description of a mode tile for screen
      * readers, and for the tile subtext will be augmented with the current status of the mode.
@@ -174,7 +174,7 @@
                     context,
                     R.style.Theme_SystemUI_Dialog,
                     /* cancelIsNeutral= */ true,
-                    zenDialogMetricsLogger
+                    zenDialogMetricsLogger,
                 )
                 .createDialog()
         SystemUIDialog.applyFlags(dialog)
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt
index 0ecbf70..72389cd 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt
@@ -18,24 +18,29 @@
 
 import android.content.res.Resources
 import androidx.activity.compose.BackHandler
+import androidx.compose.animation.core.Animatable
+import androidx.compose.animation.core.tween
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.BoxScope
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.input.pointer.pointerInteropFilter
 import androidx.compose.ui.platform.LocalContext
 import com.android.systemui.inputdevice.tutorial.ui.composable.ActionTutorialContent
 import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState
 import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialScreenConfig
+import com.android.systemui.touchpad.tutorial.ui.gesture.EasterEggGestureMonitor
 import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.FINISHED
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.IN_PROGRESS
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NOT_STARTED
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.Finished
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NotStarted
 import com.android.systemui.touchpad.tutorial.ui.gesture.TouchpadGestureHandler
 import com.android.systemui.touchpad.tutorial.ui.gesture.TouchpadGestureMonitor
 
@@ -44,7 +49,7 @@
     @Composable
     fun rememberGestureMonitor(
         resources: Resources,
-        gestureStateChangedCallback: (GestureState) -> Unit
+        gestureStateChangedCallback: (GestureState) -> Unit,
     ): TouchpadGestureMonitor
 }
 
@@ -57,7 +62,7 @@
     @Composable
     override fun rememberGestureMonitor(
         resources: Resources,
-        gestureStateChangedCallback: (GestureState) -> Unit
+        gestureStateChangedCallback: (GestureState) -> Unit,
     ): TouchpadGestureMonitor {
         val distanceThresholdPx =
             resources.getDimensionPixelSize(
@@ -71,9 +76,9 @@
 
 fun GestureState.toTutorialActionState(): TutorialActionState {
     return when (this) {
-        NOT_STARTED -> TutorialActionState.NOT_STARTED
-        IN_PROGRESS -> TutorialActionState.IN_PROGRESS
-        FINISHED -> TutorialActionState.FINISHED
+        NotStarted -> TutorialActionState.NotStarted
+        is InProgress -> TutorialActionState.InProgress()
+        Finished -> TutorialActionState.Finished
     }
 }
 
@@ -85,18 +90,26 @@
     onBack: () -> Unit,
 ) {
     BackHandler(onBack = onBack)
-    var gestureState by remember { mutableStateOf(NOT_STARTED) }
+    var gestureState: GestureState by remember { mutableStateOf(NotStarted) }
+    var easterEggTriggered by remember { mutableStateOf(false) }
     val gestureMonitor =
         gestureMonitorProvider.rememberGestureMonitor(
             resources = LocalContext.current.resources,
-            gestureStateChangedCallback = { gestureState = it }
+            gestureStateChangedCallback = { gestureState = it },
         )
-    val gestureHandler = remember(gestureMonitor) { TouchpadGestureHandler(gestureMonitor) }
-    TouchpadGesturesHandlingBox(gestureHandler, gestureState) {
+    val easterEggMonitor = EasterEggGestureMonitor { easterEggTriggered = true }
+    val gestureHandler =
+        remember(gestureMonitor) { TouchpadGestureHandler(gestureMonitor, easterEggMonitor) }
+    TouchpadGesturesHandlingBox(
+        gestureHandler,
+        gestureState,
+        easterEggTriggered,
+        resetEasterEggFlag = { easterEggTriggered = false },
+    ) {
         ActionTutorialContent(
             gestureState.toTutorialActionState(),
             onDoneButtonClicked,
-            screenConfig
+            screenConfig,
         )
     }
 }
@@ -105,9 +118,22 @@
 private fun TouchpadGesturesHandlingBox(
     gestureHandler: TouchpadGestureHandler,
     gestureState: GestureState,
+    easterEggTriggered: Boolean,
+    resetEasterEggFlag: () -> Unit,
     modifier: Modifier = Modifier,
-    content: @Composable BoxScope.() -> Unit
+    content: @Composable BoxScope.() -> Unit,
 ) {
+    val rotationAnimation = remember { Animatable(0f) }
+    LaunchedEffect(easterEggTriggered) {
+        if (easterEggTriggered || rotationAnimation.isRunning) {
+            rotationAnimation.snapTo(0f)
+            rotationAnimation.animateTo(
+                targetValue = 360f,
+                animationSpec = tween(durationMillis = 2000),
+            )
+            resetEasterEggFlag()
+        }
+    }
     Box(
         modifier =
             modifier
@@ -117,13 +143,14 @@
                 .pointerInteropFilter(
                     onTouchEvent = { event ->
                         // FINISHED is the final state so we don't need to process touches anymore
-                        if (gestureState == FINISHED) {
+                        if (gestureState == Finished) {
                             false
                         } else {
                             gestureHandler.onMotionEvent(event)
                         }
                     }
                 )
+                .graphicsLayer { rotationZ = rotationAnimation.value }
     ) {
         content()
     }
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/TutorialSelectionScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/TutorialSelectionScreen.kt
index 6acc891..94e19de 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/TutorialSelectionScreen.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/TutorialSelectionScreen.kt
@@ -20,19 +20,27 @@
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.aspectRatio
 import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.automirrored.outlined.ArrowBack
 import androidx.compose.material3.Button
 import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.Icon
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.res.vectorResource
 import androidx.compose.ui.unit.dp
 import com.android.systemui.inputdevice.tutorial.ui.composable.DoneButton
 import com.android.systemui.res.R
@@ -47,20 +55,17 @@
     Column(
         verticalArrangement = Arrangement.Center,
         modifier =
-            Modifier.background(
-                    color = MaterialTheme.colorScheme.surfaceContainer,
-                )
-                .fillMaxSize()
+            Modifier.background(color = MaterialTheme.colorScheme.surfaceContainer).fillMaxSize(),
     ) {
         TutorialSelectionButtons(
             onBackTutorialClicked = onBackTutorialClicked,
             onHomeTutorialClicked = onHomeTutorialClicked,
             onRecentAppsTutorialClicked = onRecentAppsTutorialClicked,
-            modifier = Modifier.padding(60.dp)
+            modifier = Modifier.padding(60.dp),
         )
         DoneButton(
             onDoneButtonClicked = onDoneButtonClicked,
-            modifier = Modifier.padding(horizontal = 60.dp)
+            modifier = Modifier.padding(horizontal = 60.dp),
         )
     }
 }
@@ -70,30 +75,36 @@
     onBackTutorialClicked: () -> Unit,
     onHomeTutorialClicked: () -> Unit,
     onRecentAppsTutorialClicked: () -> Unit,
-    modifier: Modifier = Modifier
+    modifier: Modifier = Modifier,
 ) {
     Row(
         horizontalArrangement = Arrangement.spacedBy(20.dp),
         verticalAlignment = Alignment.CenterVertically,
-        modifier = modifier
+        modifier = modifier,
     ) {
         TutorialButton(
             text = stringResource(R.string.touchpad_tutorial_home_gesture_button),
+            icon = Icons.AutoMirrored.Outlined.ArrowBack,
+            iconColor = MaterialTheme.colorScheme.onPrimary,
             onClick = onHomeTutorialClicked,
-            color = MaterialTheme.colorScheme.primary,
-            modifier = Modifier.weight(1f)
+            backgroundColor = MaterialTheme.colorScheme.primary,
+            modifier = Modifier.weight(1f),
         )
         TutorialButton(
             text = stringResource(R.string.touchpad_tutorial_back_gesture_button),
+            icon = ImageVector.vectorResource(id = R.drawable.touchpad_tutorial_home_icon),
+            iconColor = MaterialTheme.colorScheme.onTertiary,
             onClick = onBackTutorialClicked,
-            color = MaterialTheme.colorScheme.tertiary,
-            modifier = Modifier.weight(1f)
+            backgroundColor = MaterialTheme.colorScheme.tertiary,
+            modifier = Modifier.weight(1f),
         )
         TutorialButton(
             text = stringResource(R.string.touchpad_tutorial_recent_apps_gesture_button),
+            icon = ImageVector.vectorResource(id = R.drawable.touchpad_tutorial_recents_icon),
+            iconColor = MaterialTheme.colorScheme.onSecondary,
             onClick = onRecentAppsTutorialClicked,
-            color = MaterialTheme.colorScheme.secondary,
-            modifier = Modifier.weight(1f)
+            backgroundColor = MaterialTheme.colorScheme.secondary,
+            modifier = Modifier.weight(1f),
         )
     }
 }
@@ -101,16 +112,30 @@
 @Composable
 private fun TutorialButton(
     text: String,
+    icon: ImageVector,
+    iconColor: Color,
     onClick: () -> Unit,
-    color: Color,
-    modifier: Modifier = Modifier
+    backgroundColor: Color,
+    modifier: Modifier = Modifier,
 ) {
     Button(
         onClick = onClick,
         shape = RoundedCornerShape(16.dp),
-        colors = ButtonDefaults.buttonColors(containerColor = color),
-        modifier = modifier.aspectRatio(0.66f)
+        colors = ButtonDefaults.buttonColors(containerColor = backgroundColor),
+        modifier = modifier.aspectRatio(0.66f),
     ) {
-        Text(text = text, style = MaterialTheme.typography.headlineLarge)
+        Column(
+            verticalArrangement = Arrangement.Center,
+            horizontalAlignment = Alignment.CenterHorizontally,
+        ) {
+            Icon(
+                imageVector = icon,
+                contentDescription = text,
+                modifier = Modifier.width(30.dp).height(30.dp),
+                tint = iconColor,
+            )
+            Spacer(modifier = Modifier.height(16.dp))
+            Text(text = text, style = MaterialTheme.typography.headlineLarge)
+        }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureMonitor.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureMonitor.kt
new file mode 100644
index 0000000..7483840
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureMonitor.kt
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2024 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.systemui.touchpad.tutorial.ui.gesture
+
+import android.view.MotionEvent
+import com.android.systemui.touchpad.tutorial.ui.gesture.EasterEggGestureMonitor.Companion.CIRCLES_COUNT_THRESHOLD
+import kotlin.math.abs
+import kotlin.math.atan2
+import kotlin.math.pow
+import kotlin.math.sqrt
+
+/**
+ * Monitor recognizing easter egg gesture, that is at least [CIRCLES_COUNT_THRESHOLD] circles
+ * clockwise within one gesture. It tries to be on the safer side of not triggering gesture if we're
+ * not sure if full circle was done.
+ */
+class EasterEggGestureMonitor(private val callback: () -> Unit) {
+
+    private var last: Point = Point(0f, 0f)
+    private var cumulativeAngle: Float = 0f
+    private var lastAngle: Float? = null
+    private var circleCount: Int = 0
+
+    private class Point(val x: Float, val y: Float)
+
+    private val points = mutableListOf<Point>()
+
+    fun processTouchpadEvent(event: MotionEvent) {
+        when (event.action) {
+            MotionEvent.ACTION_DOWN -> {
+                reset()
+                last = Point(event.x, event.y)
+                points.add(Point(event.x, event.y))
+            }
+            MotionEvent.ACTION_MOVE -> {
+                val current = Point(event.x, event.y)
+                points.add(current)
+
+                if (distanceBetween(last, current) > MIN_MOTION_EVENT_DISTANCE_PX) {
+                    val currentAngle = calculateAngle(last, current)
+                    if (lastAngle == null) {
+                        // we can't start calculating angle changes before having calculated first
+                        // angle which serves as a reference point
+                        lastAngle = currentAngle
+                    } else {
+                        val deltaAngle = currentAngle - lastAngle!!
+
+                        cumulativeAngle += normalizeAngleDelta(deltaAngle)
+                        lastAngle = currentAngle
+                        last = current
+
+                        val fullCircleCompleted = cumulativeAngle >= 2 * Math.PI
+                        if (fullCircleCompleted) {
+                            cumulativeAngle = 0f
+                            circleCount += 1
+                        }
+                    }
+                }
+            }
+            MotionEvent.ACTION_UP -> {
+                // without checking if gesture is circular we can have gesture doing arches back and
+                // forth that finally reaches full circle angle
+                if (circleCount >= CIRCLES_COUNT_THRESHOLD && wasGestureCircular(points)) {
+                    callback()
+                }
+                reset()
+            }
+            MotionEvent.ACTION_CANCEL -> {
+                reset()
+            }
+        }
+    }
+
+    private fun reset() {
+        cumulativeAngle = 0f
+        lastAngle = null
+        circleCount = 0
+        points.clear()
+    }
+
+    private fun normalizeAngleDelta(deltaAngle: Float): Float {
+        // Normalize the deltaAngle to [-PI, PI] range
+        val normalizedDelta =
+            if (deltaAngle > Math.PI) {
+                deltaAngle - (2 * Math.PI).toFloat()
+            } else if (deltaAngle < -Math.PI) {
+                deltaAngle + (2 * Math.PI).toFloat()
+            } else {
+                deltaAngle
+            }
+        return normalizedDelta
+    }
+
+    private fun wasGestureCircular(points: List<Point>): Boolean {
+        val center =
+            Point(
+                x = points.map { it.x }.average().toFloat(),
+                y = points.map { it.y }.average().toFloat(),
+            )
+        val radius = points.map { distanceBetween(it, center) }.average().toFloat()
+        for (point in points) {
+            val distance = distanceBetween(point, center)
+            if (abs(distance - radius) > RADIUS_DEVIATION_TOLERANCE * radius) {
+                return false
+            }
+        }
+        return true
+    }
+
+    private fun distanceBetween(point: Point, center: Point) =
+        sqrt((point.x - center.x).toDouble().pow(2.0) + (point.y - center.y).toDouble().pow(2.0))
+
+    private fun calculateAngle(point1: Point, point2: Point): Float {
+        return atan2(point2.y - point1.y, point2.x - point1.x)
+    }
+
+    companion object {
+        /**
+         * How much we allow any one point to deviate from average radius. In other words it's a
+         * modifier of how difficult is to trigger the gesture. The smaller value the harder it is
+         * to trigger. 0.6f seems quite high but:
+         * 1. this is just extra check after circles were verified with movement angle
+         * 2. it's because of how touchpad events work - they're approximating movement, so doing
+         *    smooth circle is ~impossible. Rounded corners square is probably the best thing that
+         *    user can do
+         */
+        private const val RADIUS_DEVIATION_TOLERANCE: Float = 0.7f
+        private const val CIRCLES_COUNT_THRESHOLD = 3
+
+        /**
+         * Min distance required between motion events to have angular difference calculated. This
+         * value is a tradeoff between: minimizing the noise and delaying circle recognition (high
+         * value) versus performing calculations very/too often (low value).
+         */
+        private const val MIN_MOTION_EVENT_DISTANCE_PX = 10
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureState.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureState.kt
index 446875a..b513c49 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureState.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureState.kt
@@ -16,8 +16,10 @@
 
 package com.android.systemui.touchpad.tutorial.ui.gesture
 
-enum class GestureState {
-    NOT_STARTED,
-    IN_PROGRESS,
-    FINISHED
+sealed interface GestureState {
+    data object NotStarted : GestureState
+
+    data object Finished : GestureState
+
+    data class InProgress(val progress: Float = 0f) : GestureState
 }
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitor.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitor.kt
index 5828239..ca3880a 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitor.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureMonitor.kt
@@ -43,14 +43,14 @@
                 if (isThreeFingerTouchpadSwipe(event)) {
                     xStart = event.x
                     yStart = event.y
-                    gestureStateChangedCallback(GestureState.IN_PROGRESS)
+                    gestureStateChangedCallback(GestureState.InProgress())
                 }
             }
             MotionEvent.ACTION_UP -> {
                 if (isThreeFingerTouchpadSwipe(event) && isRecentAppsGesture(event)) {
-                    gestureStateChangedCallback(GestureState.FINISHED)
+                    gestureStateChangedCallback(GestureState.Finished)
                 } else {
-                    gestureStateChangedCallback(GestureState.NOT_STARTED)
+                    gestureStateChangedCallback(GestureState.NotStarted)
                 }
                 velocityTracker.resetTracking()
             }
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerDistanceBasedGestureMonitor.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerDistanceBasedGestureMonitor.kt
index 9bf0fe9..12bcaea 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerDistanceBasedGestureMonitor.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerDistanceBasedGestureMonitor.kt
@@ -46,15 +46,15 @@
                 if (isThreeFingerTouchpadSwipe(event)) {
                     xStart = event.x
                     yStart = event.y
-                    gestureStateChangedCallback(GestureState.IN_PROGRESS)
+                    gestureStateChangedCallback(GestureState.InProgress())
                 }
             }
             MotionEvent.ACTION_UP -> {
                 if (isThreeFingerTouchpadSwipe(event)) {
                     if (donePredicate.wasGestureDone(xStart, yStart, event.x, event.y)) {
-                        gestureStateChangedCallback(GestureState.FINISHED)
+                        gestureStateChangedCallback(GestureState.Finished)
                     } else {
-                        gestureStateChangedCallback(GestureState.NOT_STARTED)
+                        gestureStateChangedCallback(GestureState.NotStarted)
                     }
                 }
             }
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureHandler.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureHandler.kt
index bf85b0a..88671d4 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureHandler.kt
@@ -25,6 +25,7 @@
  */
 class TouchpadGestureHandler(
     private val gestureMonitor: TouchpadGestureMonitor,
+    private val easterEggGestureMonitor: EasterEggGestureMonitor,
 ) {
 
     fun onMotionEvent(event: MotionEvent): Boolean {
@@ -36,7 +37,11 @@
             event.actionMasked == MotionEvent.ACTION_DOWN &&
                 event.isButtonPressed(MotionEvent.BUTTON_PRIMARY)
         return if (isFromTouchpad && !buttonClick) {
-            gestureMonitor.processTouchpadEvent(event)
+            if (isTwoFingerSwipe(event)) {
+                easterEggGestureMonitor.processTouchpadEvent(event)
+            } else {
+                gestureMonitor.processTouchpadEvent(event)
+            }
             true
         } else {
             false
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureMonitor.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureMonitor.kt
index 1d2097d..8774a92 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureMonitor.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureMonitor.kt
@@ -38,3 +38,7 @@
     return event.classification == MotionEvent.CLASSIFICATION_MULTI_FINGER_SWIPE &&
         event.getAxisValue(MotionEvent.AXIS_GESTURE_SWIPE_FINGER_COUNT) == fingerCount.toFloat()
 }
+
+fun isTwoFingerSwipe(event: MotionEvent): Boolean {
+    return event.classification == MotionEvent.CLASSIFICATION_TWO_FINGER_SWIPE
+}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt
index d03b2e7..e1f7bd5 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt
@@ -29,6 +29,7 @@
 import com.android.compose.theme.PlatformTheme
 import com.android.systemui.inputdevice.tutorial.InputDeviceTutorialLogger
 import com.android.systemui.inputdevice.tutorial.InputDeviceTutorialLogger.TutorialContext
+import com.android.systemui.inputdevice.tutorial.KeyboardTouchpadTutorialMetricsLogger
 import com.android.systemui.touchpad.tutorial.ui.composable.BackGestureTutorialScreen
 import com.android.systemui.touchpad.tutorial.ui.composable.HomeGestureTutorialScreen
 import com.android.systemui.touchpad.tutorial.ui.composable.RecentAppsGestureTutorialScreen
@@ -45,6 +46,7 @@
 constructor(
     private val viewModelFactory: TouchpadTutorialViewModel.Factory,
     private val logger: InputDeviceTutorialLogger,
+    private val metricsLogger: KeyboardTouchpadTutorialMetricsLogger,
 ) : ComponentActivity() {
 
     private val vm by viewModels<TouchpadTutorialViewModel>(factoryProducer = { viewModelFactory })
@@ -57,6 +59,7 @@
         }
         // required to handle 3+ fingers on touchpad
         window.addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY)
+        metricsLogger.logPeripheralTutorialLaunchedFromSettings()
         logger.logOpenTutorial(TutorialContext.TOUCHPAD_TUTORIAL)
     }
 
@@ -85,7 +88,7 @@
                 onBackTutorialClicked = { vm.goTo(BACK_GESTURE) },
                 onHomeTutorialClicked = { vm.goTo(HOME_GESTURE) },
                 onRecentAppsTutorialClicked = { vm.goTo(RECENT_APPS_GESTURE) },
-                onDoneButtonClicked = closeTutorial
+                onDoneButtonClicked = closeTutorial,
             )
         BACK_GESTURE ->
             BackGestureTutorialScreen(
diff --git a/packages/SystemUI/src/com/android/systemui/util/AlphaTintDrawableWrapper.java b/packages/SystemUI/src/com/android/systemui/util/AlphaTintDrawableWrapper.java
index 947746c..4b2fe49 100644
--- a/packages/SystemUI/src/com/android/systemui/util/AlphaTintDrawableWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/util/AlphaTintDrawableWrapper.java
@@ -45,8 +45,8 @@
  * This class should only be used in XML.
  *
  * @attr ref android.R.styleable#DrawableWrapper_drawable
- * @attr ref R.styleable#AlphaTintDrawableWrapper_tint
- * @attr ref R.styleable#AlphaTintDrawableWrapper_alpha
+ * @attr ref android.R.styleable#AlphaTintDrawableWrapper_tint
+ * @attr ref android.R.styleable#AlphaTintDrawableWrapper_alpha
  */
 public class AlphaTintDrawableWrapper extends InsetDrawable {
     private ColorStateList mTint;
diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/JavaAdapter.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/JavaAdapter.kt
index 64e056d..7f90242 100644
--- a/packages/SystemUI/src/com/android/systemui/util/kotlin/JavaAdapter.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/kotlin/JavaAdapter.kt
@@ -39,11 +39,7 @@
 
 /** A class allowing Java classes to collect on Kotlin flows. */
 @SysUISingleton
-class JavaAdapter
-@Inject
-constructor(
-    @Application private val scope: CoroutineScope,
-) {
+class JavaAdapter @Inject constructor(@Application private val scope: CoroutineScope) {
     /**
      * Collect information for the given [flow], calling [consumer] for each emitted event.
      *
@@ -55,10 +51,7 @@
      * Do *not* call this method in a class's constructor. Instead, call it in
      * [com.android.systemui.CoreStartable.start] or similar method.
      */
-    fun <T> alwaysCollectFlow(
-        flow: Flow<T>,
-        consumer: Consumer<T>,
-    ): Job {
+    fun <T> alwaysCollectFlow(flow: Flow<T>, consumer: Consumer<T>): Job {
         return scope.launch { flow.collect { consumer.accept(it) } }
     }
 
@@ -66,7 +59,7 @@
     fun <T> stateInApp(
         flow: Flow<T>,
         initialValue: T,
-        started: SharingStarted = SharingStarted.Eagerly
+        started: SharingStarted = SharingStarted.Eagerly,
     ): StateFlow<T> {
         return flow.stateIn(scope, started, initialValue)
     }
@@ -117,7 +110,7 @@
     flow1: Flow<A>,
     flow2: Flow<B>,
     flow3: Flow<C>,
-    trifunction: (A, B, C) -> R
+    trifunction: (A, B, C) -> R,
 ): Flow<R> {
     return combine(flow1, flow2, flow3, trifunction)
 }
@@ -127,7 +120,30 @@
     flow2: Flow<T2>,
     flow3: Flow<T3>,
     flow4: Flow<T4>,
-    transform: (T1, T2, T3, T4) -> R
+    transform: (T1, T2, T3, T4) -> R,
 ): Flow<R> {
     return combine(flow, flow2, flow3, flow4, transform)
 }
+
+fun <T1, T2, T3, T4, T5, R> combineFlows(
+    flow: Flow<T1>,
+    flow2: Flow<T2>,
+    flow3: Flow<T3>,
+    flow4: Flow<T4>,
+    flow5: Flow<T5>,
+    transform: (T1, T2, T3, T4, T5) -> R,
+): Flow<R> {
+    return combine(flow, flow2, flow3, flow4, flow5, transform)
+}
+
+fun <T1, T2, T3, T4, T5, T6, R> combineFlows(
+    flow: Flow<T1>,
+    flow2: Flow<T2>,
+    flow3: Flow<T3>,
+    flow4: Flow<T4>,
+    flow5: Flow<T5>,
+    flow6: Flow<T6>,
+    transform: (T1, T2, T3, T4, T5, T6) -> R,
+): Flow<R> {
+    return combine(flow, flow2, flow3, flow4, flow5, flow6, transform)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/Nullability.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/Nullability.kt
new file mode 100644
index 0000000..1c760be
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/kotlin/Nullability.kt
@@ -0,0 +1,42 @@
+/*
+ * 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.systemui.util.kotlin
+
+import android.util.Log
+import java.util.Optional
+
+/**
+ * If [value] is not null, then returns block(value). Otherwise returns null.
+ */
+inline fun <T : Any, R> transform(value: T?, block: (T) -> R): R? = value?.let(block)
+
+/**
+ * Assists type-checking to unpack a Java Optional into T?
+ */
+@Suppress("NOTHING_TO_INLINE")
+inline fun <T> Optional<T>.getOrNull(): T? = orElse(null)
+
+/**
+ * Utility method to check if a value that is technically nullable is actually null. If it is null,
+ * this will crash development builds (but just log on production/droidfood builds). It can be used
+ * as a first step to verify if a nullable value can be made non-nullable instead.
+ */
+fun <T> expectNotNull(logTag: String, name: String, nullable: T?) {
+    if (nullable == null) {
+        Log.wtf(logTag, "Expected value of $name to not be null.")
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/nullability.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/nullability.kt
deleted file mode 100644
index 298dacd..0000000
--- a/packages/SystemUI/src/com/android/systemui/util/kotlin/nullability.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.systemui.util.kotlin
-
-import java.util.Optional
-
-/**
- * If [value] is not null, then returns block(value). Otherwise returns null.
- */
-inline fun <T : Any, R> transform(value: T?, block: (T) -> R): R? = value?.let(block)
-
-/**
- * Assists type-checking to unpack a Java Optional into T?
- */
-@Suppress("NOTHING_TO_INLINE")
-inline fun <T> Optional<T>.getOrNull(): T? = orElse(null)
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
index 079c72f..1f92bc1 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
@@ -37,11 +37,8 @@
 import android.media.AudioSystem;
 import android.media.IAudioService;
 import android.media.IVolumeController;
-import android.media.MediaRoute2Info;
 import android.media.MediaRouter2Manager;
-import android.media.RoutingSessionInfo;
 import android.media.VolumePolicy;
-import android.media.session.MediaController;
 import android.media.session.MediaController.PlaybackInfo;
 import android.media.session.MediaSession.Token;
 import android.net.Uri;
@@ -88,7 +85,6 @@
 
 import java.io.PrintWriter;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
@@ -217,7 +213,7 @@
                 VolumeDialogControllerImpl.class.getSimpleName());
         mWorker = new W(mWorkerLooper);
         mRouter2Manager = MediaRouter2Manager.getInstance(mContext);
-        mMediaSessionsCallbacksW = new MediaSessionsCallbacks(mContext);
+        mMediaSessionsCallbacksW = new MediaSessionsCallbacks();
         mMediaSessions = createMediaSessions(mContext, mWorkerLooper, mMediaSessionsCallbacksW);
         mAudioSharingInteractor = audioSharingInteractor;
         mJavaAdapter = javaAdapter;
@@ -1360,16 +1356,9 @@
         private final HashMap<Token, Integer> mRemoteStreams = new HashMap<>();
 
         private int mNextStream = DYNAMIC_STREAM_REMOTE_START_INDEX;
-        private final boolean mVolumeAdjustmentForRemoteGroupSessions;
-
-        public MediaSessionsCallbacks(Context context) {
-            mVolumeAdjustmentForRemoteGroupSessions = context.getResources().getBoolean(
-                    com.android.internal.R.bool.config_volumeAdjustmentForRemoteGroupSessions);
-        }
 
         @Override
         public void onRemoteUpdate(Token token, String name, PlaybackInfo pi) {
-            if (showForSession(token)) {
                 addStream(token, "onRemoteUpdate");
 
                 int stream = 0;
@@ -1396,12 +1385,10 @@
                     Log.d(TAG, "onRemoteUpdate: " + name + ": " + ss.level + " of " + ss.levelMax);
                     mCallbacks.onStateChanged(mState);
                 }
-            }
         }
 
         @Override
         public void onRemoteVolumeChanged(Token token, int flags) {
-            if (showForSession(token)) {
                 addStream(token, "onRemoteVolumeChanged");
                 int stream = 0;
                 synchronized (mRemoteStreams) {
@@ -1420,27 +1407,27 @@
                 if (showUI) {
                     onShowRequestedW(Events.SHOW_REASON_REMOTE_VOLUME_CHANGED);
                 }
-            }
         }
 
         @Override
         public void onRemoteRemoved(Token token) {
-            if (showForSession(token)) {
-                int stream = 0;
-                synchronized (mRemoteStreams) {
-                    if (!mRemoteStreams.containsKey(token)) {
-                        Log.d(TAG, "onRemoteRemoved: stream doesn't exist, "
-                                + "aborting remote removed for token:" + token.toString());
-                        return;
-                    }
-                    stream = mRemoteStreams.get(token);
+            int stream;
+            synchronized (mRemoteStreams) {
+                if (!mRemoteStreams.containsKey(token)) {
+                    Log.d(
+                            TAG,
+                            "onRemoteRemoved: stream doesn't exist, "
+                                    + "aborting remote removed for token:"
+                                    + token.toString());
+                    return;
                 }
-                mState.states.remove(stream);
-                if (mState.activeStream == stream) {
-                    updateActiveStreamW(-1);
-                }
-                mCallbacks.onStateChanged(mState);
+                stream = mRemoteStreams.get(token);
             }
+            mState.states.remove(stream);
+            if (mState.activeStream == stream) {
+                updateActiveStreamW(-1);
+            }
+            mCallbacks.onStateChanged(mState);
         }
 
         public void setStreamVolume(int stream, int level) {
@@ -1449,39 +1436,7 @@
                 Log.w(TAG, "setStreamVolume: No token found for stream: " + stream);
                 return;
             }
-            if (showForSession(token)) {
-                mMediaSessions.setVolume(token, level);
-            }
-        }
-
-        private boolean showForSession(Token token) {
-            if (mVolumeAdjustmentForRemoteGroupSessions) {
-                if (DEBUG) {
-                    Log.d(TAG, "Volume adjustment for remote group sessions allowed,"
-                            + " showForSession: true");
-                }
-                return true;
-            }
-            MediaController ctr = new MediaController(mContext, token);
-            String packageName = ctr.getPackageName();
-            List<RoutingSessionInfo> sessions =
-                    mRouter2Manager.getRoutingSessions(packageName);
-            if (DEBUG) {
-                Log.d(TAG, "Found " + sessions.size() + " routing sessions for package name "
-                        + packageName);
-            }
-            for (RoutingSessionInfo session : sessions) {
-                if (DEBUG) {
-                    Log.d(TAG, "Found routingSessionInfo: " + session);
-                }
-                if (!session.isSystemSession()
-                        && session.getVolumeHandling() != MediaRoute2Info.PLAYBACK_VOLUME_FIXED) {
-                    return true;
-                }
-            }
-
-            Log.d(TAG, "No routing session for " + packageName);
-            return false;
+            mMediaSessions.setVolume(token, level);
         }
 
         private Token findToken(int stream) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java b/packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java
index ebb9ce9..ed8de69 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java
@@ -23,6 +23,7 @@
 
 import com.android.internal.jank.InteractionJankMonitor;
 import com.android.systemui.CoreStartable;
+import com.android.systemui.Flags;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.media.dialog.MediaOutputDialogManager;
 import com.android.systemui.plugins.VolumeDialog;
@@ -40,6 +41,8 @@
 import com.android.systemui.volume.VolumeDialogImpl;
 import com.android.systemui.volume.VolumePanelDialogReceiver;
 import com.android.systemui.volume.VolumeUI;
+import com.android.systemui.volume.dialog.VolumeDialogPlugin;
+import com.android.systemui.volume.dialog.dagger.VolumeDialogPluginComponent;
 import com.android.systemui.volume.domain.interactor.VolumeDialogInteractor;
 import com.android.systemui.volume.domain.interactor.VolumePanelNavigationInteractor;
 import com.android.systemui.volume.panel.dagger.VolumePanelComponent;
@@ -66,7 +69,8 @@
                 SpatializerModule.class,
         },
         subcomponents = {
-                VolumePanelComponent.class
+                VolumePanelComponent.class,
+                VolumeDialogPluginComponent.class,
         }
 )
 public interface VolumeModule {
@@ -101,6 +105,7 @@
     /**  */
     @Provides
     static VolumeDialog provideVolumeDialog(
+            Lazy<VolumeDialogPlugin> volumeDialogProvider,
             Context context,
             VolumeDialogController volumeDialogController,
             AccessibilityManagerWrapper accessibilityManagerWrapper,
@@ -118,29 +123,33 @@
             VibratorHelper vibratorHelper,
             SystemClock systemClock,
             VolumeDialogInteractor interactor) {
-        VolumeDialogImpl impl = new VolumeDialogImpl(
-                context,
-                volumeDialogController,
-                accessibilityManagerWrapper,
-                deviceProvisionedController,
-                configurationController,
-                mediaOutputDialogManager,
-                interactionJankMonitor,
-                volumePanelNavigationInteractor,
-                volumeNavigator,
-                true, /* should listen for jank */
-                csdFactory,
-                devicePostureController,
-                Looper.getMainLooper(),
-                volumePanelFlag,
-                dumpManager,
-                secureSettings,
-                vibratorHelper,
-                systemClock,
-                interactor);
-        impl.setStreamImportant(AudioManager.STREAM_SYSTEM, false);
-        impl.setAutomute(true);
-        impl.setSilentMode(false);
-        return impl;
+        if (Flags.volumeRedesign()) {
+            return volumeDialogProvider.get();
+        } else {
+            VolumeDialogImpl impl = new VolumeDialogImpl(
+                    context,
+                    volumeDialogController,
+                    accessibilityManagerWrapper,
+                    deviceProvisionedController,
+                    configurationController,
+                    mediaOutputDialogManager,
+                    interactionJankMonitor,
+                    volumePanelNavigationInteractor,
+                    volumeNavigator,
+                    true, /* should listen for jank */
+                    csdFactory,
+                    devicePostureController,
+                    Looper.getMainLooper(),
+                    volumePanelFlag,
+                    dumpManager,
+                    secureSettings,
+                    vibratorHelper,
+                    systemClock,
+                    interactor);
+            impl.setStreamImportant(AudioManager.STREAM_SYSTEM, false);
+            impl.setAutomute(true);
+            impl.setSilentMode(false);
+            return impl;
+        }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/VolumeDialog.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/VolumeDialog.kt
new file mode 100644
index 0000000..7476c6a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/VolumeDialog.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog
+
+import android.app.Dialog
+import android.content.Context
+import android.os.Bundle
+import android.view.ContextThemeWrapper
+import android.view.MotionEvent
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.res.R
+import com.android.systemui.volume.Events
+import com.android.systemui.volume.dialog.domain.interactor.VolumeDialogVisibilityInteractor
+import com.android.systemui.volume.dialog.ui.binder.VolumeDialogBinder
+import javax.inject.Inject
+
+class VolumeDialog
+@Inject
+constructor(
+    @Application context: Context,
+    private val dialogBinder: VolumeDialogBinder,
+    private val visibilityInteractor: VolumeDialogVisibilityInteractor,
+) : Dialog(ContextThemeWrapper(context, R.style.volume_dialog_theme)) {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        dialogBinder.bind(this)
+    }
+
+    /**
+     * NOTE: This will be called with ACTION_OUTSIDE MotionEvents for touches that occur outside of
+     * the touchable region of the volume dialog (as returned by [.onComputeInternalInsets]) even if
+     * those touches occurred within the bounds of the volume dialog.
+     */
+    override fun onTouchEvent(event: MotionEvent): Boolean {
+        if (isShowing) {
+            if (event.action == MotionEvent.ACTION_OUTSIDE) {
+                visibilityInteractor.dismissDialog(Events.DISMISS_REASON_TOUCH_OUTSIDE)
+                return true
+            }
+        }
+        return false
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/VolumeDialogPlugin.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/VolumeDialogPlugin.kt
new file mode 100644
index 0000000..4b7a978
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/VolumeDialogPlugin.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog
+
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.plugins.VolumeDialog
+import com.android.systemui.volume.dialog.dagger.VolumeDialogPluginComponent
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.launch
+
+class VolumeDialogPlugin
+@Inject
+constructor(
+    @Application private val applicationCoroutineScope: CoroutineScope,
+    private val volumeDialogPluginComponentFactory: VolumeDialogPluginComponent.Factory,
+) : VolumeDialog {
+
+    private var job: Job? = null
+
+    override fun init(windowType: Int, callback: VolumeDialog.Callback?) {
+        job =
+            applicationCoroutineScope.launch {
+                coroutineScope {
+                    val component = volumeDialogPluginComponentFactory.create(this)
+
+                    component.viewModel().activate()
+                }
+            }
+    }
+
+    override fun destroy() {
+        job?.cancel()
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/VolumeDialogComponent.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/VolumeDialogComponent.kt
new file mode 100644
index 0000000..f7ad320
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/VolumeDialogComponent.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.dagger
+
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
+import dagger.BindsInstance
+import dagger.Subcomponent
+import kotlinx.coroutines.CoroutineScope
+
+/**
+ * Core Volume Dialog dagger component. It's managed by
+ * [com.android.systemui.volume.dialog.VolumeDialogPlugin] and lives alongside it.
+ */
+@VolumeDialogScope
+@Subcomponent(modules = [])
+interface VolumeDialogComponent {
+
+    /**
+     * Provides a coroutine scope to use inside [VolumeDialogScope].
+     * [com.android.systemui.volume.dialog.VolumeDialogPlugin] manages the lifecycle of this scope.
+     * It's cancelled when the dialog is disposed. This helps to free occupied resources when volume
+     * dialog is not shown.
+     */
+    @VolumeDialog fun coroutineScope(): CoroutineScope
+
+    @VolumeDialogScope fun volumeDialog(): com.android.systemui.volume.dialog.VolumeDialog
+
+    @Subcomponent.Factory
+    interface Factory {
+
+        fun create(@BindsInstance @VolumeDialog scope: CoroutineScope): VolumeDialogComponent
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/VolumeDialogPluginComponent.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/VolumeDialogPluginComponent.kt
new file mode 100644
index 0000000..4e0098c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/VolumeDialogPluginComponent.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.dagger
+
+import com.android.systemui.volume.dialog.dagger.module.VolumeDialogPluginModule
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPlugin
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPluginScope
+import com.android.systemui.volume.dialog.ui.viewmodel.VolumeDialogPluginViewModel
+import dagger.BindsInstance
+import dagger.Subcomponent
+import kotlinx.coroutines.CoroutineScope
+
+/**
+ * Volume Dialog plugin dagger component. It's managed by
+ * [com.android.systemui.volume.dialog.VolumeDialogPlugin] and lives alongside it.
+ */
+@VolumeDialogPluginScope
+@Subcomponent(modules = [VolumeDialogPluginModule::class])
+interface VolumeDialogPluginComponent {
+
+    fun viewModel(): VolumeDialogPluginViewModel
+
+    @Subcomponent.Factory
+    interface Factory {
+
+        fun create(
+            @BindsInstance @VolumeDialogPlugin scope: CoroutineScope
+        ): VolumeDialogPluginComponent
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/module/VolumeDialogPluginModule.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/module/VolumeDialogPluginModule.kt
new file mode 100644
index 0000000..3fdf86a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/module/VolumeDialogPluginModule.kt
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.dagger.module
+
+import com.android.systemui.volume.dialog.dagger.VolumeDialogComponent
+import dagger.Module
+
+@Module(subcomponents = [VolumeDialogComponent::class]) interface VolumeDialogPluginModule
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/scope/VolumeDialog.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/scope/VolumeDialog.kt
new file mode 100644
index 0000000..34bddb4
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/scope/VolumeDialog.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.dagger.scope
+
+import javax.inject.Qualifier
+
+/**
+ * Volume Dialog qualifier.
+ *
+ * @see VolumeDialogScope
+ */
+@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class VolumeDialog
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/scope/VolumeDialogPlugin.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/scope/VolumeDialogPlugin.kt
new file mode 100644
index 0000000..1038c30
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/scope/VolumeDialogPlugin.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.dagger.scope
+
+import javax.inject.Qualifier
+
+/**
+ * Volume Dialog plugin qualifier.
+ *
+ * @see VolumeDialogPluginScope
+ */
+@Qualifier
+@MustBeDocumented
+@Retention(AnnotationRetention.RUNTIME)
+annotation class VolumeDialogPlugin
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/scope/VolumeDialogPluginScope.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/scope/VolumeDialogPluginScope.kt
new file mode 100644
index 0000000..6c5f672
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/scope/VolumeDialogPluginScope.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.dagger.scope
+
+import javax.inject.Scope
+
+/**
+ * Volume Dialog plugin dependency injection scope. This scope is created alongside Volume Dialog
+ * plugin is initialized and destroyed alongside it. This is effectively almost similar
+ * to @Application now.
+ */
+@MustBeDocumented
+@Retention(AnnotationRetention.RUNTIME)
+@Scope
+annotation class VolumeDialogPluginScope
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/scope/VolumeDialogScope.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/scope/VolumeDialogScope.kt
new file mode 100644
index 0000000..52caa6a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/scope/VolumeDialogScope.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.dagger.scope
+
+import javax.inject.Scope
+
+/**
+ * Volume Panel dependency injection scope. This scope is created alongside Volume Panel and
+ * destroyed when it's lo longer present.
+ */
+@MustBeDocumented @Retention(AnnotationRetention.RUNTIME) @Scope annotation class VolumeDialogScope
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogCallbacksInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogCallbacksInteractor.kt
new file mode 100644
index 0000000..2e26fd6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogCallbacksInteractor.kt
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.domain.interactor
+
+import android.annotation.SuppressLint
+import android.os.Handler
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.plugins.VolumeDialogController
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPlugin
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPluginScope
+import com.android.systemui.volume.dialog.domain.model.VolumeDialogEventModel
+import com.android.systemui.volume.dialog.domain.model.VolumeDialogStateModel
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.ProducerScope
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.buffer
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.shareIn
+
+private const val BUFFER_CAPACITY = 16
+
+/**
+ * Exposes [VolumeDialogController] callback events in the [event].
+ *
+ * @see VolumeDialogController.Callbacks
+ */
+@VolumeDialogPluginScope
+class VolumeDialogCallbacksInteractor
+@Inject
+constructor(
+    private val volumeDialogController: VolumeDialogController,
+    @VolumeDialogPlugin private val coroutineScope: CoroutineScope,
+    @Background private val bgHandler: Handler,
+) {
+
+    @SuppressLint("SharedFlowCreation") // event-but needed
+    val event: Flow<VolumeDialogEventModel> =
+        callbackFlow {
+                val producer = VolumeDialogEventModelProducer(this)
+                volumeDialogController.addCallback(producer, bgHandler)
+                awaitClose { volumeDialogController.removeCallback(producer) }
+            }
+            .buffer(BUFFER_CAPACITY)
+            .shareIn(replay = 0, scope = coroutineScope, started = SharingStarted.WhileSubscribed())
+
+    private class VolumeDialogEventModelProducer(
+        private val scope: ProducerScope<VolumeDialogEventModel>
+    ) : VolumeDialogController.Callbacks {
+        override fun onShowRequested(reason: Int, keyguardLocked: Boolean, lockTaskModeState: Int) {
+            scope.trySend(
+                VolumeDialogEventModel.ShowRequested(
+                    reason = reason,
+                    keyguardLocked = keyguardLocked,
+                    lockTaskModeState = lockTaskModeState,
+                )
+            )
+        }
+
+        override fun onDismissRequested(reason: Int) {
+            scope.trySend(VolumeDialogEventModel.DismissRequested(reason))
+        }
+
+        override fun onStateChanged(state: VolumeDialogController.State?) {
+            if (state != null) {
+                scope.trySend(VolumeDialogEventModel.StateChanged(VolumeDialogStateModel(state)))
+            }
+        }
+
+        override fun onLayoutDirectionChanged(layoutDirection: Int) {
+            scope.trySend(VolumeDialogEventModel.LayoutDirectionChanged(layoutDirection))
+        }
+
+        // Configuration change is never emitted by the VolumeDialogControllerImpl now.
+        override fun onConfigurationChanged() = Unit
+
+        override fun onShowVibrateHint() {
+            scope.trySend(VolumeDialogEventModel.ShowVibrateHint)
+        }
+
+        override fun onShowSilentHint() {
+            scope.trySend(VolumeDialogEventModel.ShowSilentHint)
+        }
+
+        override fun onScreenOff() {
+            scope.trySend(VolumeDialogEventModel.ScreenOff)
+        }
+
+        override fun onShowSafetyWarning(flags: Int) {
+            scope.trySend(VolumeDialogEventModel.ShowSafetyWarning(flags))
+        }
+
+        override fun onAccessibilityModeChanged(showA11yStream: Boolean) {
+            scope.trySend(VolumeDialogEventModel.AccessibilityModeChanged(showA11yStream))
+        }
+
+        // Captions button is remove from the Volume Dialog
+        override fun onCaptionComponentStateChanged(
+            isComponentEnabled: Boolean,
+            fromTooltip: Boolean,
+        ) = Unit
+
+        // Captions button is remove from the Volume Dialog
+        override fun onCaptionEnabledStateChanged(isEnabled: Boolean, checkBeforeSwitch: Boolean) =
+            Unit
+
+        override fun onShowCsdWarning(csdWarning: Int, durationMs: Int) {
+            scope.trySend(
+                VolumeDialogEventModel.ShowCsdWarning(
+                    csdWarning = csdWarning,
+                    durationMs = durationMs,
+                )
+            )
+        }
+
+        override fun onVolumeChangedFromKey() {
+            scope.trySend(VolumeDialogEventModel.VolumeChangedFromKey)
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogStateInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogStateInteractor.kt
new file mode 100644
index 0000000..4a709a44b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogStateInteractor.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.domain.interactor
+
+import com.android.systemui.plugins.VolumeDialogController
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPlugin
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPluginScope
+import com.android.systemui.volume.dialog.domain.model.VolumeDialogEventModel
+import com.android.systemui.volume.dialog.domain.model.VolumeDialogStateModel
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.filterIsInstance
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.onStart
+import kotlinx.coroutines.flow.stateIn
+
+/**
+ * Exposes [VolumeDialogController.getState] in the [volumeDialogState].
+ *
+ * @see [VolumeDialogController]
+ */
+@VolumeDialogPluginScope
+class VolumeDialogStateInteractor
+@Inject
+constructor(
+    volumeDialogCallbacksInteractor: VolumeDialogCallbacksInteractor,
+    private val volumeDialogController: VolumeDialogController,
+    @VolumeDialogPlugin private val coroutineScope: CoroutineScope,
+) {
+
+    val volumeDialogState: Flow<VolumeDialogStateModel> =
+        volumeDialogCallbacksInteractor.event
+            .onStart { volumeDialogController.getState() }
+            .filterIsInstance(VolumeDialogEventModel.StateChanged::class)
+            .map { it.state }
+            .stateIn(scope = coroutineScope, started = SharingStarted.Eagerly, initialValue = null)
+            .filterNotNull()
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogVisibilityInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogVisibilityInteractor.kt
new file mode 100644
index 0000000..f7d6d90
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogVisibilityInteractor.kt
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.domain.interactor
+
+import android.annotation.SuppressLint
+import com.android.systemui.volume.Events
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPlugin
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPluginScope
+import com.android.systemui.volume.dialog.domain.model.VolumeDialogEventModel
+import com.android.systemui.volume.dialog.domain.model.VolumeDialogVisibilityModel
+import javax.inject.Inject
+import kotlin.time.Duration
+import kotlin.time.Duration.Companion.seconds
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.mapLatest
+import kotlinx.coroutines.flow.merge
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.flow.update
+
+private val MAX_DIALOG_SHOW_TIME: Duration = 3.seconds
+
+/**
+ * Handles Volume Dialog visibility state. It might change from several sources:
+ * - [com.android.systemui.plugins.VolumeDialogController] requests visibility change;
+ * - it might be dismissed by the inactivity timeout;
+ * - it can be dismissed by the user;
+ */
+@OptIn(ExperimentalCoroutinesApi::class)
+@VolumeDialogPluginScope
+class VolumeDialogVisibilityInteractor
+@Inject
+constructor(
+    @VolumeDialogPlugin coroutineScope: CoroutineScope,
+    callbacksInteractor: VolumeDialogCallbacksInteractor,
+) {
+
+    @SuppressLint("SharedFlowCreation")
+    private val mutableDismissDialogEvents = MutableSharedFlow<Unit>()
+    private val mutableDialogVisibility =
+        MutableStateFlow<VolumeDialogVisibilityModel>(VolumeDialogVisibilityModel.Invisible)
+
+    val dialogVisibility: Flow<VolumeDialogVisibilityModel> = mutableDialogVisibility.asStateFlow()
+
+    init {
+        merge(
+                mutableDismissDialogEvents.mapLatest {
+                    delay(MAX_DIALOG_SHOW_TIME)
+                    VolumeDialogEventModel.DismissRequested(Events.DISMISS_REASON_TIMEOUT)
+                },
+                callbacksInteractor.event,
+            )
+            .onEach { event ->
+                VolumeDialogVisibilityModel.fromEvent(event)?.let { model ->
+                    mutableDialogVisibility.value = model
+                    if (model is VolumeDialogVisibilityModel.Visible) {
+                        resetDismissTimeout()
+                    }
+                }
+            }
+            .launchIn(coroutineScope)
+    }
+
+    /**
+     * Dismisses the dialog with a given [reason]. The new state will be emitted in the
+     * [dialogVisibility].
+     */
+    fun dismissDialog(reason: Int) {
+        mutableDialogVisibility.update {
+            if (it is VolumeDialogVisibilityModel.Dismissed) {
+                it
+            } else {
+                VolumeDialogVisibilityModel.Dismissed(reason)
+            }
+        }
+    }
+
+    /** Resets current dialog timeout. */
+    suspend fun resetDismissTimeout() {
+        mutableDismissDialogEvents.emit(Unit)
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/model/VolumeDialogEventModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/model/VolumeDialogEventModel.kt
new file mode 100644
index 0000000..ca0310e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/model/VolumeDialogEventModel.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.domain.model
+
+import android.media.AudioManager
+
+/**
+ * Models VolumeDialogController callback events.
+ *
+ * @see VolumeDialogController.Callbacks
+ */
+sealed interface VolumeDialogEventModel {
+
+    data class ShowRequested(
+        val reason: Int,
+        val keyguardLocked: Boolean,
+        val lockTaskModeState: Int,
+    ) : VolumeDialogEventModel
+
+    data class DismissRequested(val reason: Int) : VolumeDialogEventModel
+
+    data class StateChanged(val state: VolumeDialogStateModel) : VolumeDialogEventModel
+
+    data class LayoutDirectionChanged(val layoutDirection: Int) : VolumeDialogEventModel
+
+    data object ShowVibrateHint : VolumeDialogEventModel
+
+    data object ShowSilentHint : VolumeDialogEventModel
+
+    data object ScreenOff : VolumeDialogEventModel
+
+    data class ShowSafetyWarning(val flags: Int) : VolumeDialogEventModel
+
+    data class AccessibilityModeChanged(val showA11yStream: Boolean) : VolumeDialogEventModel
+
+    data class ShowCsdWarning(@AudioManager.CsdWarning val csdWarning: Int, val durationMs: Int) :
+        VolumeDialogEventModel
+
+    data object VolumeChangedFromKey : VolumeDialogEventModel
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/model/VolumeDialogStateModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/model/VolumeDialogStateModel.kt
new file mode 100644
index 0000000..f1443e3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/model/VolumeDialogStateModel.kt
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.domain.model
+
+import android.content.ComponentName
+import android.util.SparseArray
+import androidx.core.util.keyIterator
+import com.android.systemui.plugins.VolumeDialogController
+
+/** Models a state of the Volume Dialog. */
+data class VolumeDialogStateModel(
+    val states: Map<Int, VolumeDialogStreamStateModel>,
+    val ringerModeInternal: Int = 0,
+    val ringerModeExternal: Int = 0,
+    val zenMode: Int = 0,
+    val effectsSuppressor: ComponentName? = null,
+    val effectsSuppressorName: String? = null,
+    val activeStream: Int = NO_ACTIVE_STREAM,
+    val disallowAlarms: Boolean = false,
+    val disallowMedia: Boolean = false,
+    val disallowSystem: Boolean = false,
+    val disallowRinger: Boolean = false,
+) {
+
+    constructor(
+        legacyState: VolumeDialogController.State
+    ) : this(
+        states = legacyState.states.mapToMap { VolumeDialogStreamStateModel(it) },
+        ringerModeInternal = legacyState.ringerModeInternal,
+        ringerModeExternal = legacyState.ringerModeExternal,
+        zenMode = legacyState.zenMode,
+        effectsSuppressor = legacyState.effectsSuppressor,
+        effectsSuppressorName = legacyState.effectsSuppressorName,
+        activeStream = legacyState.activeStream,
+        disallowAlarms = legacyState.disallowAlarms,
+        disallowMedia = legacyState.disallowMedia,
+        disallowSystem = legacyState.disallowSystem,
+        disallowRinger = legacyState.disallowRinger,
+    )
+
+    companion object {
+        const val NO_ACTIVE_STREAM: Int = -1
+    }
+}
+
+private fun <INPUT, OUTPUT> SparseArray<INPUT>.mapToMap(map: (INPUT) -> OUTPUT): Map<Int, OUTPUT> {
+    val resultMap = mutableMapOf<Int, OUTPUT>()
+    for (key in keyIterator()) {
+        val mappedValue: OUTPUT = map(get(key)!!)
+        resultMap[key] = mappedValue
+    }
+    return resultMap
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/model/VolumeDialogStreamStateModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/model/VolumeDialogStreamStateModel.kt
new file mode 100644
index 0000000..a9d367d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/model/VolumeDialogStreamStateModel.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.domain.model
+
+import android.annotation.IntegerRes
+import com.android.systemui.plugins.VolumeDialogController
+
+/** Models a state of an audio stream of the Volume Dialog. */
+data class VolumeDialogStreamStateModel(
+    val isDynamic: Boolean = false,
+    val level: Int = 0,
+    val levelMin: Int = 0,
+    val levelMax: Int = 0,
+    val muted: Boolean = false,
+    val muteSupported: Boolean = false,
+    @IntegerRes val name: Int = 0,
+    val remoteLabel: String? = null,
+    val routedToBluetooth: Boolean = false,
+) {
+    constructor(
+        legacyState: VolumeDialogController.StreamState
+    ) : this(
+        isDynamic = legacyState.dynamic,
+        level = legacyState.level,
+        levelMin = legacyState.levelMin,
+        levelMax = legacyState.levelMax,
+        muted = legacyState.muted,
+        muteSupported = legacyState.muteSupported,
+        name = legacyState.name,
+        remoteLabel = legacyState.remoteLabel,
+        routedToBluetooth = legacyState.routedToBluetooth,
+    )
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/model/VolumeDialogVisibilityModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/model/VolumeDialogVisibilityModel.kt
new file mode 100644
index 0000000..646445d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/model/VolumeDialogVisibilityModel.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.domain.model
+
+/** Models current Volume Dialog visibility state. */
+sealed interface VolumeDialogVisibilityModel {
+
+    /** Dialog is currently visible. */
+    data class Visible(val reason: Int, val keyguardLocked: Boolean, val lockTaskModeState: Int) :
+        VolumeDialogVisibilityModel
+
+    /** Dialog has never been shown. So it's just invisible. */
+    interface Invisible : VolumeDialogVisibilityModel {
+        companion object : Invisible
+    }
+
+    /** Dialog has been shown and then dismissed. */
+    data class Dismissed(val reason: Int) : Invisible
+
+    companion object {
+
+        /**
+         * Creates [VolumeDialogVisibilityModel] from appropriate events and returns null otherwise.
+         */
+        fun fromEvent(event: VolumeDialogEventModel): VolumeDialogVisibilityModel? {
+            return when (event) {
+                is VolumeDialogEventModel.DismissRequested -> Dismissed(event.reason)
+                is VolumeDialogEventModel.ShowRequested ->
+                    Visible(event.reason, event.keyguardLocked, event.lockTaskModeState)
+                else -> null
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/domain/VolumeDialogSettingsButtonInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/domain/VolumeDialogSettingsButtonInteractor.kt
new file mode 100644
index 0000000..db19634
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/domain/VolumeDialogSettingsButtonInteractor.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.settings.domain
+
+import android.app.ActivityManager
+import com.android.app.tracing.coroutines.flow.map
+import com.android.systemui.statusbar.policy.DeviceProvisionedController
+import com.android.systemui.volume.Events
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
+import com.android.systemui.volume.dialog.domain.interactor.VolumeDialogVisibilityInteractor
+import com.android.systemui.volume.dialog.domain.model.VolumeDialogVisibilityModel
+import com.android.systemui.volume.panel.domain.interactor.VolumePanelGlobalStateInteractor
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.filterIsInstance
+import kotlinx.coroutines.flow.stateIn
+
+@VolumeDialogScope
+class VolumeDialogSettingsButtonInteractor
+@Inject
+constructor(
+    @VolumeDialog private val coroutineScope: CoroutineScope,
+    private val deviceProvisionedController: DeviceProvisionedController,
+    private val volumePanelGlobalStateInteractor: VolumePanelGlobalStateInteractor,
+    private val visibilityInteractor: VolumeDialogVisibilityInteractor,
+) {
+
+    val isVisible: StateFlow<Boolean> =
+        visibilityInteractor.dialogVisibility
+            .filterIsInstance(VolumeDialogVisibilityModel.Visible::class)
+            .map { model ->
+                deviceProvisionedController.isCurrentUserSetup() &&
+                    model.lockTaskModeState == ActivityManager.LOCK_TASK_MODE_NONE
+            }
+            .stateIn(coroutineScope, SharingStarted.Eagerly, false)
+
+    fun onButtonClicked() {
+        volumePanelGlobalStateInteractor.setVisible(true)
+        visibilityInteractor.dismissDialog(Events.DISMISS_REASON_SETTINGS_CLICKED)
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/binder/VolumeDialogSettingsButtonViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/binder/VolumeDialogSettingsButtonViewBinder.kt
new file mode 100644
index 0000000..ba08876
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/binder/VolumeDialogSettingsButtonViewBinder.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.settings.ui.binder
+
+import android.view.View
+import com.android.systemui.lifecycle.WindowLifecycleState
+import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.lifecycle.setSnapshotBinding
+import com.android.systemui.lifecycle.viewModel
+import com.android.systemui.res.R
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
+import com.android.systemui.volume.dialog.settings.ui.viewmodel.VolumeDialogSettingsButtonViewModel
+import javax.inject.Inject
+import kotlinx.coroutines.awaitCancellation
+
+@VolumeDialogScope
+class VolumeDialogSettingsButtonViewBinder
+@Inject
+constructor(private val viewModelFactory: VolumeDialogSettingsButtonViewModel.Factory) {
+
+    fun bind(view: View) {
+        with(view) {
+            val button = requireViewById<View>(R.id.settings)
+            repeatWhenAttached {
+                viewModel(
+                    traceName = "VolumeDialogViewBinder",
+                    minWindowLifecycleState = WindowLifecycleState.ATTACHED,
+                    factory = { viewModelFactory.create() },
+                ) { viewModel ->
+                    setSnapshotBinding {
+                        visibility = if (viewModel.isVisible) View.VISIBLE else View.GONE
+                        button.setOnClickListener { viewModel.onButtonClicked() }
+                    }
+
+                    awaitCancellation()
+                }
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/viewmodel/VolumeDialogSettingsButtonViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/viewmodel/VolumeDialogSettingsButtonViewModel.kt
new file mode 100644
index 0000000..2acc33b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/viewmodel/VolumeDialogSettingsButtonViewModel.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.settings.ui.viewmodel
+
+import androidx.compose.runtime.getValue
+import com.android.systemui.lifecycle.ExclusiveActivatable
+import com.android.systemui.lifecycle.Hydrator
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
+import com.android.systemui.volume.dialog.settings.domain.VolumeDialogSettingsButtonInteractor
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+
+class VolumeDialogSettingsButtonViewModel
+@AssistedInject
+constructor(private val interactor: VolumeDialogSettingsButtonInteractor) : ExclusiveActivatable() {
+
+    private val hydrator = Hydrator("VolumeDialog_settings_button")
+
+    val isVisible by hydrator.hydratedStateOf("isVisible", interactor.isVisible)
+
+    override suspend fun onActivated(): Nothing {
+        hydrator.activate()
+    }
+
+    fun onButtonClicked() {
+        interactor.onButtonClicked()
+    }
+
+    @VolumeDialogScope
+    @AssistedFactory
+    interface Factory {
+
+        fun create(): VolumeDialogSettingsButtonViewModel
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/shared/VolumeDialogLogger.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/shared/VolumeDialogLogger.kt
new file mode 100644
index 0000000..59c38c0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/shared/VolumeDialogLogger.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.shared
+
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.core.LogLevel
+import com.android.systemui.log.dagger.VolumeLog
+import com.android.systemui.volume.Events
+import javax.inject.Inject
+
+private const val TAG = "SysUI_VolumeDialog"
+
+/** Logs events related to the Volume Panel. */
+class VolumeDialogLogger @Inject constructor(@VolumeLog private val logBuffer: LogBuffer) {
+
+    fun onShow(reason: Int) {
+        logBuffer.log(
+            TAG,
+            LogLevel.DEBUG,
+            { int1 = reason },
+            { "Show: ${Events.SHOW_REASONS[int1]}" },
+        )
+    }
+
+    fun onDismiss(reason: Int) {
+        logBuffer.log(
+            TAG,
+            LogLevel.DEBUG,
+            { int1 = reason },
+            { "Dismiss: ${Events.DISMISS_REASONS[int1]}" },
+        )
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogBinder.kt
new file mode 100644
index 0000000..9c88303
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogBinder.kt
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.ui.binder
+
+import android.app.Dialog
+import android.graphics.Color
+import android.graphics.PixelFormat
+import android.graphics.drawable.ColorDrawable
+import android.view.ViewGroup
+import android.view.Window
+import android.view.WindowManager
+import com.android.systemui.res.R
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
+import com.android.systemui.volume.dialog.settings.ui.binder.VolumeDialogSettingsButtonViewBinder
+import com.android.systemui.volume.dialog.ui.viewmodel.VolumeDialogGravityViewModel
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onEach
+
+@VolumeDialogScope
+class VolumeDialogBinder
+@Inject
+constructor(
+    @VolumeDialog private val coroutineScope: CoroutineScope,
+    private val volumeDialogViewBinder: VolumeDialogViewBinder,
+    private val settingsButtonViewBinder: VolumeDialogSettingsButtonViewBinder,
+    private val gravityViewModel: VolumeDialogGravityViewModel,
+) {
+
+    fun bind(dialog: Dialog) {
+        with(dialog) {
+            setupWindow(window!!)
+            dialog.setContentView(R.layout.volume_dialog)
+
+            settingsButtonViewBinder.bind(dialog.requireViewById(R.id.settings_container))
+            volumeDialogViewBinder.bind(dialog.requireViewById(R.id.volume_dialog_container))
+        }
+    }
+
+    /** Configures [Window] for the [Dialog]. */
+    private fun setupWindow(window: Window) =
+        with(window) {
+            clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
+            addFlags(
+                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
+                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or
+                    WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or
+                    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
+            )
+            addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY)
+
+            requestFeature(Window.FEATURE_NO_TITLE)
+            setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+            setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY)
+            setWindowAnimations(-1)
+            setFormat(PixelFormat.TRANSLUCENT)
+
+            attributes =
+                attributes.apply {
+                    title = "VolumeDialog" // Not the same as Window#setTitle
+                }
+            setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+
+            gravityViewModel.dialogGravity.onEach { window.setGravity(it) }.launchIn(coroutineScope)
+        }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinder.kt
new file mode 100644
index 0000000..600d176
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinder.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.ui.binder
+
+import android.view.View
+import com.android.systemui.lifecycle.WindowLifecycleState
+import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.lifecycle.setSnapshotBinding
+import com.android.systemui.lifecycle.viewModel
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
+import com.android.systemui.volume.dialog.ui.viewmodel.VolumeDialogViewModel
+import javax.inject.Inject
+import kotlinx.coroutines.awaitCancellation
+
+@VolumeDialogScope
+class VolumeDialogViewBinder
+@Inject
+constructor(private val volumeDialogViewModelFactory: VolumeDialogViewModel.Factory) {
+
+    fun bind(view: View) {
+        view.repeatWhenAttached {
+            view.viewModel(
+                traceName = "VolumeDialogViewBinder",
+                minWindowLifecycleState = WindowLifecycleState.ATTACHED,
+                factory = { volumeDialogViewModelFactory.create() },
+            ) { viewModel ->
+                view.setSnapshotBinding {}
+
+                awaitCancellation()
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogGravityViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogGravityViewModel.kt
new file mode 100644
index 0000000..df6523c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogGravityViewModel.kt
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.ui.viewmodel
+
+import android.content.Context
+import android.content.res.Configuration
+import android.view.Gravity
+import androidx.annotation.GravityInt
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.UiBackground
+import com.android.systemui.res.R
+import com.android.systemui.statusbar.policy.ConfigurationController
+import com.android.systemui.statusbar.policy.DevicePostureController
+import com.android.systemui.statusbar.policy.devicePosture
+import com.android.systemui.statusbar.policy.onConfigChanged
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
+import javax.inject.Inject
+import kotlin.coroutines.CoroutineContext
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.withContext
+
+@VolumeDialogScope
+class VolumeDialogGravityViewModel
+@Inject
+constructor(
+    @Application private val context: Context,
+    @VolumeDialog private val coroutineScope: CoroutineScope,
+    @UiBackground private val uiBackgroundCoroutineContext: CoroutineContext,
+    configurationController: ConfigurationController,
+    private val devicePostureController: DevicePostureController,
+) {
+
+    @GravityInt private var originalGravity: Int = context.getAbsoluteGravity()
+
+    val dialogGravity: Flow<Int> =
+        combine(
+                devicePostureController.devicePosture(),
+                configurationController.onConfigChanged.onEach { onConfigurationChanged() },
+            ) { devicePosture, configuration ->
+                context.calculateGravity(devicePosture, configuration)
+            }
+            .stateIn(
+                scope = coroutineScope,
+                started = SharingStarted.Eagerly,
+                context.calculateGravity(),
+            )
+
+    private suspend fun onConfigurationChanged() {
+        withContext(uiBackgroundCoroutineContext) { originalGravity = context.getAbsoluteGravity() }
+    }
+
+    @GravityInt
+    private fun Context.calculateGravity(
+        devicePosture: Int = devicePostureController.devicePosture,
+        config: Configuration = resources.configuration,
+    ): Int {
+        val isLandscape = config.orientation == Configuration.ORIENTATION_LANDSCAPE
+        val isHalfOpen = devicePosture == DevicePostureController.DEVICE_POSTURE_HALF_OPENED
+        val gravity =
+            if (isLandscape && isHalfOpen) {
+                originalGravity or Gravity.TOP
+            } else {
+                originalGravity
+            }
+        return getAbsoluteGravity(gravity)
+    }
+}
+
+@GravityInt
+private fun Context.getAbsoluteGravity(
+    gravity: Int = resources.getInteger(R.integer.volume_dialog_gravity)
+): Int = with(resources) { Gravity.getAbsoluteGravity(gravity, configuration.layoutDirection) }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogPluginViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogPluginViewModel.kt
new file mode 100644
index 0000000..8aa0d09
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogPluginViewModel.kt
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.ui.viewmodel
+
+import android.app.Dialog
+import com.android.systemui.lifecycle.ExclusiveActivatable
+import com.android.systemui.plugins.VolumeDialogController
+import com.android.systemui.volume.Events
+import com.android.systemui.volume.dialog.dagger.VolumeDialogComponent
+import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPluginScope
+import com.android.systemui.volume.dialog.domain.interactor.VolumeDialogVisibilityInteractor
+import com.android.systemui.volume.dialog.domain.model.VolumeDialogVisibilityModel
+import com.android.systemui.volume.dialog.shared.VolumeDialogLogger
+import javax.inject.Inject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.mapLatest
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.suspendCancellableCoroutine
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@VolumeDialogPluginScope
+class VolumeDialogPluginViewModel
+@Inject
+constructor(
+    private val componentFactory: VolumeDialogComponent.Factory,
+    private val dialogVisibilityInteractor: VolumeDialogVisibilityInteractor,
+    private val controller: VolumeDialogController,
+    private val logger: VolumeDialogLogger,
+) : ExclusiveActivatable() {
+
+    override suspend fun onActivated(): Nothing {
+        coroutineScope {
+            dialogVisibilityInteractor.dialogVisibility
+                .mapLatest { visibilityModel ->
+                    with(visibilityModel) {
+                        if (this is VolumeDialogVisibilityModel.Visible) {
+                            showDialog(reason, keyguardLocked)
+                        }
+                        if (this is VolumeDialogVisibilityModel.Dismissed) {
+                            Events.writeEvent(Events.EVENT_DISMISS_DIALOG, reason)
+                            logger.onDismiss(reason)
+                        }
+                    }
+                }
+                .launchIn(this)
+        }
+        awaitCancellation()
+    }
+
+    suspend fun showDialog(reason: Int, keyguardLocked: Boolean): Unit = coroutineScope {
+        logger.onShow(reason)
+
+        controller.notifyVisible(true)
+
+        val volumeDialogComponent: VolumeDialogComponent = componentFactory.create(this)
+        val dialog =
+            volumeDialogComponent.volumeDialog().apply {
+                setOnDismissListener {
+                    volumeDialogComponent.coroutineScope().cancel()
+                    dialogVisibilityInteractor.dismissDialog(Events.DISMISS_REASON_UNKNOWN)
+                }
+            }
+        launch { dialog.awaitShow() }
+
+        Events.writeEvent(Events.EVENT_SHOW_DIALOG, reason, keyguardLocked)
+    }
+}
+
+/** Shows [Dialog] until suspend function is cancelled. */
+private suspend fun Dialog.awaitShow() =
+    suspendCancellableCoroutine<Unit> {
+        show()
+        it.invokeOnCancellation { dismiss() }
+    }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogViewModel.kt
new file mode 100644
index 0000000..30c8c15
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogViewModel.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.ui.viewmodel
+
+import com.android.systemui.lifecycle.ExclusiveActivatable
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+import kotlinx.coroutines.awaitCancellation
+
+class VolumeDialogViewModel @AssistedInject constructor() : ExclusiveActivatable() {
+
+    override suspend fun onActivated(): Nothing {
+        awaitCancellation()
+    }
+
+    @AssistedFactory
+    interface Factory {
+        fun create(): VolumeDialogViewModel
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualLocationsService.kt b/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualLocationsService.kt
index 3c50c7b..09b1f45 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualLocationsService.kt
+++ b/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualLocationsService.kt
@@ -1,6 +1,7 @@
 package com.android.systemui.wallet.controller
 
 import android.content.Intent
+import android.os.DeadObjectException
 import android.os.IBinder
 import android.util.Log
 import androidx.annotation.VisibleForTesting
@@ -47,7 +48,11 @@
                 controller.allWalletCards.collect { cards ->
                     val cardsSize = cards.size
                     Log.i(TAG, "Number of cards registered $cardsSize")
-                    listener?.registerNewWalletCards(cards)
+                    try {
+                        listener?.registerNewWalletCards(cards)
+                    } catch (e: DeadObjectException) {
+                        Log.e(TAG, "Failed to register wallet cards because IWalletCardsUpdatedListener is dead")
+                    }
                 }
             }
         } else {
@@ -55,7 +60,11 @@
                 controller.allWalletCards.collect { cards ->
                     val cardsSize = cards.size
                     Log.i(TAG, "Number of cards registered $cardsSize")
-                    listener?.registerNewWalletCards(cards)
+                    try {
+                        listener?.registerNewWalletCards(cards)
+                    } catch (e: DeadObjectException) {
+                        Log.e(TAG, "Failed to register wallet cards because IWalletCardsUpdatedListener is dead")
+                    }
                 }
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
index 5f6ad92..02d0b57 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
@@ -61,7 +61,7 @@
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.util.kotlin.JavaAdapter;
 import com.android.wm.shell.desktopmode.DesktopMode;
-import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
+import com.android.wm.shell.desktopmode.DesktopRepository;
 import com.android.wm.shell.onehanded.OneHanded;
 import com.android.wm.shell.onehanded.OneHandedEventCallback;
 import com.android.wm.shell.onehanded.OneHandedTransitionCallback;
@@ -393,7 +393,7 @@
 
     void initDesktopMode(DesktopMode desktopMode) {
         desktopMode.addVisibleTasksListener(
-                new DesktopModeTaskRepository.VisibleTasksListener() {
+                new DesktopRepository.VisibleTasksListener() {
                     @Override
                     public void onTasksVisibilityChanged(int displayId, int visibleTasksCount) {
                         if (displayId == Display.DEFAULT_DISPLAY) {
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java
deleted file mode 100644
index 4bb01ec..0000000
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * 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.keyguard;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-import android.os.SystemClock;
-import android.platform.test.annotations.DisableFlags;
-import android.platform.test.annotations.EnableFlags;
-import android.testing.TestableLooper.RunWithLooper;
-import android.view.KeyEvent;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.android.internal.util.LatencyTracker;
-import com.android.internal.widget.LockPatternUtils;
-import com.android.keyguard.KeyguardAbsKeyInputView.KeyDownListener;
-import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
-import com.android.systemui.Flags;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer;
-import com.android.systemui.classifier.FalsingCollector;
-import com.android.systemui.classifier.FalsingCollectorFake;
-import com.android.systemui.flags.FakeFeatureFlags;
-import com.android.systemui.haptics.msdl.FakeMSDLPlayer;
-import com.android.systemui.kosmos.KosmosJavaAdapter;
-import com.android.systemui.res.R;
-import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
-
-import com.google.android.msdl.data.model.MSDLToken;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-@RunWithLooper
-public class KeyguardAbsKeyInputViewControllerTest extends SysuiTestCase {
-
-    @Mock
-    private KeyguardAbsKeyInputView mAbsKeyInputView;
-    @Mock
-    private PasswordTextView mPasswordEntry;
-    @Mock
-    private BouncerKeyguardMessageArea mKeyguardMessageArea;
-    @Mock
-    private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
-    @Mock
-    private SecurityMode mSecurityMode;
-    @Mock
-    private LockPatternUtils mLockPatternUtils;
-    @Mock
-    private KeyguardSecurityCallback mKeyguardSecurityCallback;
-    @Mock
-    private KeyguardMessageAreaController.Factory mKeyguardMessageAreaControllerFactory;
-    @Mock
-    private KeyguardMessageAreaController mKeyguardMessageAreaController;
-    @Mock
-    private LatencyTracker mLatencyTracker;
-    private final FalsingCollector mFalsingCollector = new FalsingCollectorFake();
-    @Mock
-    private EmergencyButtonController mEmergencyButtonController;
-
-    private FakeFeatureFlags mFeatureFlags;
-    @Mock
-    private SelectedUserInteractor mSelectedUserInteractor;
-    @Mock
-    private UserActivityNotifier mUserActivityNotifier;
-    private KeyguardAbsKeyInputViewController mKeyguardAbsKeyInputViewController;
-    private KosmosJavaAdapter mKosmosJavaAdapter = new KosmosJavaAdapter(this);
-    private final BouncerHapticPlayer mBouncerHapticPlayer =
-            mKosmosJavaAdapter.getBouncerHapticHelper();
-    private final FakeMSDLPlayer mMSDLPlayer = mKosmosJavaAdapter.getMsdlPlayer();
-
-    @Before
-    public void setup() {
-        MockitoAnnotations.initMocks(this);
-        when(mKeyguardMessageAreaControllerFactory.create(any(KeyguardMessageArea.class)))
-                .thenReturn(mKeyguardMessageAreaController);
-        when(mAbsKeyInputView.getPasswordTextViewId()).thenReturn(1);
-        when(mAbsKeyInputView.findViewById(1)).thenReturn(mPasswordEntry);
-        when(mAbsKeyInputView.isAttachedToWindow()).thenReturn(true);
-        when(mAbsKeyInputView.requireViewById(R.id.bouncer_message_area))
-                .thenReturn(mKeyguardMessageArea);
-        when(mAbsKeyInputView.getResources()).thenReturn(getContext().getResources());
-        mFeatureFlags = new FakeFeatureFlags();
-        mKeyguardAbsKeyInputViewController = createTestObject();
-        mKeyguardAbsKeyInputViewController.init();
-        reset(mKeyguardMessageAreaController);  // Clear out implicit call to init.
-    }
-
-    private KeyguardAbsKeyInputViewController createTestObject() {
-        return new KeyguardAbsKeyInputViewController(mAbsKeyInputView,
-                mKeyguardUpdateMonitor, mSecurityMode, mLockPatternUtils, mKeyguardSecurityCallback,
-                mKeyguardMessageAreaControllerFactory, mLatencyTracker, mFalsingCollector,
-                mEmergencyButtonController, mFeatureFlags, mSelectedUserInteractor,
-                mBouncerHapticPlayer, mUserActivityNotifier) {
-            @Override
-            void resetState() {
-            }
-
-            @Override
-            public void onResume(int reason) {
-                super.onResume(reason);
-            }
-
-            @Override
-            protected int getInitialMessageResId() {
-                return 0;
-            }
-        };
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_REVAMPED_BOUNCER_MESSAGES)
-    public void withFeatureFlagOn_oldMessage_isHidden() {
-        KeyguardAbsKeyInputViewController underTest = createTestObject();
-
-        underTest.init();
-
-        verify(mKeyguardMessageAreaController).disable();
-    }
-
-    @Test
-    public void onKeyDown_clearsSecurityMessage() {
-        ArgumentCaptor<KeyDownListener> onKeyDownListenerArgumentCaptor =
-                ArgumentCaptor.forClass(KeyDownListener.class);
-        verify(mAbsKeyInputView).setKeyDownListener(onKeyDownListenerArgumentCaptor.capture());
-        onKeyDownListenerArgumentCaptor.getValue().onKeyDown(
-                KeyEvent.KEYCODE_0, mock(KeyEvent.class));
-        verify(mKeyguardSecurityCallback).userActivity();
-        verify(mKeyguardMessageAreaController).setMessage(eq(""));
-    }
-
-    @Test
-    public void onKeyDown_noSecurityMessageInteraction() {
-        ArgumentCaptor<KeyDownListener> onKeyDownListenerArgumentCaptor =
-                ArgumentCaptor.forClass(KeyDownListener.class);
-        verify(mAbsKeyInputView).setKeyDownListener(onKeyDownListenerArgumentCaptor.capture());
-        onKeyDownListenerArgumentCaptor.getValue().onKeyDown(
-                KeyEvent.KEYCODE_UNKNOWN, mock(KeyEvent.class));
-        verifyZeroInteractions(mKeyguardSecurityCallback);
-        verifyZeroInteractions(mKeyguardMessageAreaController);
-    }
-
-    @Test
-    public void onPromptReasonNone_doesNotSetMessage() {
-        mKeyguardAbsKeyInputViewController.showPromptReason(0);
-        verify(mKeyguardMessageAreaController, never()).setMessage(
-                getContext().getResources().getString(R.string.kg_prompt_reason_restart_password),
-                false);
-    }
-
-    @Test
-    public void onPromptReason_setsMessage() {
-        when(mAbsKeyInputView.getPromptReasonStringRes(1)).thenReturn(
-                R.string.kg_prompt_reason_restart_password);
-        mKeyguardAbsKeyInputViewController.showPromptReason(1);
-        verify(mKeyguardMessageAreaController).setMessage(
-                getContext().getResources().getString(R.string.kg_prompt_reason_restart_password),
-                false);
-    }
-
-
-    @Test
-    public void testReset() {
-        mKeyguardAbsKeyInputViewController.reset();
-        verify(mKeyguardMessageAreaController).setMessage("", false);
-    }
-
-    @Test
-    public void testOnViewAttached() {
-        reset(mLockPatternUtils);
-        mKeyguardAbsKeyInputViewController.onViewAttached();
-        verify(mLockPatternUtils).getLockoutAttemptDeadline(anyInt());
-    }
-
-    @Test
-    public void testLockedOut_verifyPasswordAndUnlock_doesNotEnableViewInput() {
-        mKeyguardAbsKeyInputViewController.handleAttemptLockout(SystemClock.elapsedRealtime());
-        verify(mAbsKeyInputView).setPasswordEntryInputEnabled(false);
-        verify(mAbsKeyInputView).setPasswordEntryEnabled(false);
-        verify(mAbsKeyInputView, never()).setPasswordEntryInputEnabled(true);
-        verify(mAbsKeyInputView, never()).setPasswordEntryEnabled(true);
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_MSDL_FEEDBACK)
-    public void onPasswordChecked_withMSDLFeedback_withMatch_playsUnlockToken() {
-        mKeyguardAbsKeyInputViewController.onPasswordChecked(0, true, 100, true);
-        assertThat(mMSDLPlayer.getLatestTokenPlayed()).isEqualTo(MSDLToken.UNLOCK);
-    }
-
-    @Test
-    @DisableFlags(Flags.FLAG_MSDL_FEEDBACK)
-    public void onPasswordChecked_withoutMSDLFeedback_withMatch_doesNotPlayToken() {
-        mKeyguardAbsKeyInputViewController.onPasswordChecked(0, true, 100, true);
-        assertThat(mMSDLPlayer.getLatestTokenPlayed()).isNull();
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_MSDL_FEEDBACK)
-    public void onPasswordChecked_withMSDLFeedback_withoutMatch_playsFailureToken() {
-        mKeyguardAbsKeyInputViewController.onPasswordChecked(0, false, 100, true);
-        assertThat(mMSDLPlayer.getLatestTokenPlayed()).isEqualTo(MSDLToken.FAILURE);
-    }
-
-    @Test
-    @DisableFlags(Flags.FLAG_MSDL_FEEDBACK)
-    public void onPasswordChecked_withoutMSDLFeedback_withoutMatch_doesNotPlayToken() {
-        mKeyguardAbsKeyInputViewController.onPasswordChecked(0, false, 100, true);
-        assertThat(mMSDLPlayer.getLatestTokenPlayed()).isNull();
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index e609d5f..34ebba8 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -127,6 +127,7 @@
 import com.android.internal.widget.LockPatternUtils;
 import com.android.keyguard.KeyguardUpdateMonitor.BiometricAuthenticated;
 import com.android.keyguard.logging.KeyguardUpdateMonitorLogger;
+import com.android.keyguard.logging.SimLogger;
 import com.android.settingslib.fuelgauge.BatteryStatus;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.biometrics.AuthController;
@@ -267,6 +268,8 @@
     @Mock
     private KeyguardUpdateMonitorLogger mKeyguardUpdateMonitorLogger;
     @Mock
+    private SimLogger mSimLogger;
+    @Mock
     private SessionTracker mSessionTracker;
     @Mock
     private UiEventLogger mUiEventLogger;
@@ -2234,6 +2237,36 @@
     }
 
     @Test
+    public void testOnSimStateChanged_LockedToNotReadyToLocked() {
+        int validSubId = 10;
+        int slotId = 0;
+
+        KeyguardUpdateMonitorCallback keyguardUpdateMonitorCallback = spy(
+                KeyguardUpdateMonitorCallback.class);
+        mKeyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback);
+        // Initially locked
+        mKeyguardUpdateMonitor.handleSimStateChange(validSubId, slotId,
+                TelephonyManager.SIM_STATE_PIN_REQUIRED);
+        verify(keyguardUpdateMonitorCallback).onSimStateChanged(validSubId, slotId,
+                TelephonyManager.SIM_STATE_PIN_REQUIRED);
+
+        reset(keyguardUpdateMonitorCallback);
+        // Not ready, with invalid sub id
+        mKeyguardUpdateMonitor.handleSimStateChange(SubscriptionManager.INVALID_SUBSCRIPTION_ID,
+                slotId, TelephonyManager.SIM_STATE_NOT_READY);
+        verify(keyguardUpdateMonitorCallback).onSimStateChanged(
+                SubscriptionManager.INVALID_SUBSCRIPTION_ID, slotId,
+                TelephonyManager.SIM_STATE_NOT_READY);
+
+        reset(keyguardUpdateMonitorCallback);
+        // Back to PIN required, which notifies listeners
+        mKeyguardUpdateMonitor.handleSimStateChange(validSubId, slotId,
+                TelephonyManager.SIM_STATE_PIN_REQUIRED);
+        verify(keyguardUpdateMonitorCallback).onSimStateChanged(validSubId, slotId,
+                TelephonyManager.SIM_STATE_PIN_REQUIRED);
+    }
+
+    @Test
     public void onAuthEnrollmentChangesCallbacksAreNotified() {
         KeyguardUpdateMonitorCallback callback = mock(KeyguardUpdateMonitorCallback.class);
         ArgumentCaptor<AuthController.Callback> authCallback = ArgumentCaptor.forClass(
@@ -2487,7 +2520,7 @@
                     mStatusBarStateController, mLockPatternUtils,
                     mAuthController, mTelephonyListenerManager,
                     mInteractionJankMonitor, mLatencyTracker, mActiveUnlockConfig,
-                    mKeyguardUpdateMonitorLogger, mUiEventLogger, () -> mSessionTracker,
+                    mKeyguardUpdateMonitorLogger, mSimLogger, mUiEventLogger, () -> mSessionTracker,
                     mTrustManager, mSubscriptionManager, mUserManager,
                     mDreamManager, mDevicePolicyManager, mSensorPrivacyManager, mTelephonyManager,
                     mPackageManager, mFingerprintManager, mBiometricManager,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java
similarity index 100%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java
rename to packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationFrameSpecTest.kt b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationFrameSpecTest.kt
deleted file mode 100644
index 791a26e..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationFrameSpecTest.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.accessibility
-
-import android.testing.AndroidTestingRunner
-import android.util.Size
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.accessibility.WindowMagnificationSettings.MagnificationSize
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
-class WindowMagnificationFrameSpecTest : SysuiTestCase() {
-
-    @Test
-    fun deserializeSpec_validSpec_expectedIndex() {
-        val targetIndex = MagnificationSize.LARGE
-        val targetSize = Size(100, 200)
-        val targetPreference = WindowMagnificationFrameSpec.serialize(targetIndex, targetSize)
-
-        assertThat(WindowMagnificationFrameSpec.deserialize(targetPreference).index)
-            .isEqualTo(targetIndex)
-    }
-
-    @Test
-    fun deserializeSpec_validSpec_expectedSize() {
-        val targetIndex = MagnificationSize.LARGE
-        val targetSize = Size(100, 200)
-        val targetPreference = WindowMagnificationFrameSpec.serialize(targetIndex, targetSize)
-
-        assertThat(WindowMagnificationFrameSpec.deserialize(targetPreference).size)
-            .isEqualTo(targetSize)
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java
index 2d5e3a6..dddaabb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java
@@ -23,10 +23,10 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 
 import android.graphics.PointF;
-import android.testing.AndroidTestingRunner;
+
 import android.testing.TestableLooper;
 import android.view.View;
 import android.view.ViewPropertyAnimator;
@@ -37,6 +37,7 @@
 import androidx.dynamicanimation.animation.FlingAnimation;
 import androidx.dynamicanimation.animation.SpringAnimation;
 import androidx.dynamicanimation.animation.SpringForce;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
 import com.android.systemui.Prefs;
@@ -57,7 +58,7 @@
 import java.util.Optional;
 
 /** Tests for {@link MenuAnimationController}. */
-@RunWith(AndroidTestingRunner.class)
+@RunWith(AndroidJUnit4.class)
 @TestableLooper.RunWithLooper(setAsMainLooper = true)
 @SmallTest
 public class MenuAnimationControllerTest extends SysuiTestCase {
@@ -172,7 +173,7 @@
                 mMenuAnimationController.mPositionAnimations.values().stream().findAny();
         anyAnimation.ifPresent(this::skipAnimationToEnd);
 
-        verifyZeroInteractions(onSpringAnimationsEndCallback);
+        verifyNoMoreInteractions(onSpringAnimationsEndCallback);
     }
 
     @Test
@@ -224,7 +225,7 @@
                 .filter(animation -> animation instanceof SpringAnimation)
                 .forEach(this::skipAnimationToEnd);
 
-        verifyZeroInteractions(onSpringAnimationsEndCallback);
+        verifyNoMoreInteractions(onSpringAnimationsEndCallback);
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ambient/touch/TouchMonitorTest.java b/packages/SystemUI/tests/src/com/android/systemui/ambient/touch/TouchMonitorTest.java
index aa8c6b7..e160ff1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ambient/touch/TouchMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ambient/touch/TouchMonitorTest.java
@@ -28,6 +28,7 @@
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 import android.content.res.Configuration;
@@ -643,6 +644,46 @@
         environment.verifyInputSessionDispose();
     }
 
+    @Test
+    public void testSessionPopAfterDestroy() {
+        final TouchHandler touchHandler = createTouchHandler();
+
+        final Environment environment = new Environment(Stream.of(touchHandler)
+                .collect(Collectors.toCollection(HashSet::new)), mKosmos);
+
+        final InputEvent initialEvent = Mockito.mock(InputEvent.class);
+        environment.publishInputEvent(initialEvent);
+
+        // Ensure session started
+        final InputChannelCompat.InputEventListener eventListener =
+                registerInputEventListener(touchHandler);
+
+        // First event will be missed since we register after the execution loop,
+        final InputEvent event = Mockito.mock(InputEvent.class);
+        environment.publishInputEvent(event);
+        verify(eventListener).onInputEvent(eq(event));
+
+        final ArgumentCaptor<TouchHandler.TouchSession> touchSessionArgumentCaptor =
+                ArgumentCaptor.forClass(TouchHandler.TouchSession.class);
+
+        verify(touchHandler).onSessionStart(touchSessionArgumentCaptor.capture());
+
+        environment.updateLifecycle(Lifecycle.State.DESTROYED);
+
+        // Check to make sure the input session is now disposed.
+        environment.verifyInputSessionDispose();
+
+        clearInvocations(environment.mInputFactory);
+
+        // Pop the session
+        touchSessionArgumentCaptor.getValue().pop();
+
+        environment.executeAll();
+
+        // Ensure no input sessions were created due to the session reset.
+        verifyNoMoreInteractions(environment.mInputFactory);
+    }
+
 
     @Test
     public void testPilfering() {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
similarity index 100%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
rename to packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerPredictiveBackTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerPredictiveBackTest.kt
deleted file mode 100644
index 5cc6454..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerPredictiveBackTest.kt
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.bouncer.ui.composable
-
-import android.app.AlertDialog
-import android.platform.test.annotations.MotionTest
-import android.testing.TestableLooper.RunWithLooper
-import androidx.activity.BackEventCompat
-import androidx.compose.animation.core.Animatable
-import androidx.compose.animation.core.tween
-import androidx.compose.foundation.layout.Box
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.remember
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.isFinite
-import androidx.compose.ui.geometry.isUnspecified
-import androidx.compose.ui.semantics.SemanticsNode
-import androidx.compose.ui.test.junit4.AndroidComposeTestRule
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.LargeTest
-import com.android.compose.animation.scene.ObservableTransitionState
-import com.android.compose.animation.scene.Scale
-import com.android.compose.animation.scene.SceneKey
-import com.android.compose.animation.scene.SceneScope
-import com.android.compose.animation.scene.UserAction
-import com.android.compose.animation.scene.UserActionResult
-import com.android.compose.animation.scene.isElement
-import com.android.compose.animation.scene.testing.lastAlphaForTesting
-import com.android.compose.animation.scene.testing.lastScaleForTesting
-import com.android.compose.theme.PlatformTheme
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.bouncer.domain.interactor.bouncerInteractor
-import com.android.systemui.bouncer.ui.BouncerDialogFactory
-import com.android.systemui.bouncer.ui.viewmodel.BouncerSceneContentViewModel
-import com.android.systemui.bouncer.ui.viewmodel.BouncerUserActionsViewModel
-import com.android.systemui.bouncer.ui.viewmodel.bouncerSceneContentViewModel
-import com.android.systemui.classifier.domain.interactor.falsingInteractor
-import com.android.systemui.flags.EnableSceneContainer
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.kosmos.Kosmos.Fixture
-import com.android.systemui.lifecycle.ExclusiveActivatable
-import com.android.systemui.lifecycle.rememberViewModel
-import com.android.systemui.motion.createSysUiComposeMotionTestRule
-import com.android.systemui.power.domain.interactor.powerInteractor
-import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.scene.domain.startable.sceneContainerStartable
-import com.android.systemui.scene.sceneContainerGestureFilterFactory
-import com.android.systemui.scene.shared.logger.sceneLogger
-import com.android.systemui.scene.shared.model.SceneContainerConfig
-import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.scene.shared.model.sceneDataSourceDelegator
-import com.android.systemui.scene.ui.composable.Scene
-import com.android.systemui.scene.ui.composable.SceneContainer
-import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel
-import com.android.systemui.scene.ui.viewmodel.splitEdgeDetector
-import com.android.systemui.settings.displayTracker
-import com.android.systemui.shade.domain.interactor.shadeInteractor
-import com.android.systemui.testKosmos
-import kotlin.time.Duration.Companion.seconds
-import kotlinx.coroutines.awaitCancellation
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.flowOf
-import org.json.JSONObject
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.MockitoAnnotations
-import platform.test.motion.compose.ComposeFeatureCaptures.positionInRoot
-import platform.test.motion.compose.ComposeRecordingSpec
-import platform.test.motion.compose.MotionControl
-import platform.test.motion.compose.feature
-import platform.test.motion.compose.recordMotion
-import platform.test.motion.compose.runTest
-import platform.test.motion.golden.DataPoint
-import platform.test.motion.golden.DataPointType
-import platform.test.motion.golden.DataPointTypes
-import platform.test.motion.golden.FeatureCapture
-import platform.test.motion.golden.UnknownTypeException
-import platform.test.screenshot.DeviceEmulationSpec
-import platform.test.screenshot.Displays.Phone
-
-/** MotionTest for the Bouncer Predictive Back animation */
-@LargeTest
-@RunWith(AndroidJUnit4::class)
-@RunWithLooper
-@EnableSceneContainer
-@MotionTest
-class BouncerPredictiveBackTest : SysuiTestCase() {
-
-    private val deviceSpec = DeviceEmulationSpec(Phone)
-    private val kosmos = testKosmos()
-
-    @get:Rule val motionTestRule = createSysUiComposeMotionTestRule(kosmos, deviceSpec)
-    private val androidComposeTestRule =
-        motionTestRule.toolkit.composeContentTestRule as AndroidComposeTestRule<*, *>
-
-    private val sceneInteractor by lazy { kosmos.sceneInteractor }
-    private val Kosmos.sceneKeys by Fixture { listOf(Scenes.Lockscreen, Scenes.Bouncer) }
-    private val Kosmos.initialSceneKey by Fixture { Scenes.Bouncer }
-    private val Kosmos.sceneContainerConfig by Fixture {
-        val navigationDistances = mapOf(Scenes.Lockscreen to 1, Scenes.Bouncer to 0)
-        SceneContainerConfig(sceneKeys, initialSceneKey, emptyList(), navigationDistances)
-    }
-
-    private val transitionState by lazy {
-        MutableStateFlow<ObservableTransitionState>(
-            ObservableTransitionState.Idle(kosmos.sceneContainerConfig.initialSceneKey)
-        )
-    }
-    private val sceneContainerViewModel by lazy {
-        SceneContainerViewModel(
-                sceneInteractor = kosmos.sceneInteractor,
-                falsingInteractor = kosmos.falsingInteractor,
-                powerInteractor = kosmos.powerInteractor,
-                shadeInteractor = kosmos.shadeInteractor,
-                splitEdgeDetector = kosmos.splitEdgeDetector,
-                logger = kosmos.sceneLogger,
-                gestureFilterFactory = kosmos.sceneContainerGestureFilterFactory,
-                displayId = kosmos.displayTracker.defaultDisplayId,
-                motionEventHandlerReceiver = {},
-            )
-            .apply { setTransitionState(transitionState) }
-    }
-
-    private val bouncerDialogFactory =
-        object : BouncerDialogFactory {
-            override fun invoke(): AlertDialog {
-                throw AssertionError()
-            }
-        }
-    private val bouncerSceneActionsViewModelFactory =
-        object : BouncerUserActionsViewModel.Factory {
-            override fun create() = BouncerUserActionsViewModel(kosmos.bouncerInteractor)
-        }
-    private lateinit var bouncerSceneContentViewModel: BouncerSceneContentViewModel
-    private val bouncerSceneContentViewModelFactory =
-        object : BouncerSceneContentViewModel.Factory {
-            override fun create() = bouncerSceneContentViewModel
-        }
-    private val bouncerScene =
-        BouncerScene(
-            bouncerSceneActionsViewModelFactory,
-            bouncerSceneContentViewModelFactory,
-            bouncerDialogFactory,
-        )
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-
-        bouncerSceneContentViewModel = kosmos.bouncerSceneContentViewModel
-
-        val startable = kosmos.sceneContainerStartable
-        startable.start()
-    }
-
-    @Test
-    fun bouncerPredictiveBackMotion() =
-        motionTestRule.runTest(timeout = 30.seconds) {
-            val motion =
-                recordMotion(
-                    content = { play ->
-                        PlatformTheme {
-                            BackGestureAnimation(play)
-                            SceneContainer(
-                                viewModel =
-                                    rememberViewModel("BouncerPredictiveBackTest") {
-                                        sceneContainerViewModel
-                                    },
-                                sceneByKey =
-                                    mapOf(
-                                        Scenes.Lockscreen to FakeLockscreen(),
-                                        Scenes.Bouncer to bouncerScene,
-                                    ),
-                                initialSceneKey = Scenes.Bouncer,
-                                overlayByKey = emptyMap(),
-                                dataSourceDelegator = kosmos.sceneDataSourceDelegator,
-                            )
-                        }
-                    },
-                    ComposeRecordingSpec(
-                        MotionControl(
-                            delayRecording = {
-                                awaitCondition {
-                                    sceneInteractor.transitionState.value.isTransitioning()
-                                }
-                            }
-                        ) {
-                            awaitCondition {
-                                sceneInteractor.transitionState.value.isIdle(Scenes.Lockscreen)
-                            }
-                        }
-                    ) {
-                        feature(isElement(Bouncer.Elements.Content), elementAlpha, "content_alpha")
-                        feature(isElement(Bouncer.Elements.Content), elementScale, "content_scale")
-                        feature(
-                            isElement(Bouncer.Elements.Content),
-                            positionInRoot,
-                            "content_offset",
-                        )
-                        feature(
-                            isElement(Bouncer.Elements.Background),
-                            elementAlpha,
-                            "background_alpha",
-                        )
-                    },
-                )
-
-            assertThat(motion).timeSeriesMatchesGolden()
-        }
-
-    @Composable
-    private fun BackGestureAnimation(play: Boolean) {
-        val backProgress = remember { Animatable(0f) }
-
-        LaunchedEffect(play) {
-            if (play) {
-                val dispatcher = androidComposeTestRule.activity.onBackPressedDispatcher
-                androidComposeTestRule.runOnUiThread {
-                    dispatcher.dispatchOnBackStarted(backEvent())
-                }
-                backProgress.animateTo(
-                    targetValue = 1f,
-                    animationSpec = tween(durationMillis = 500),
-                ) {
-                    androidComposeTestRule.runOnUiThread {
-                        dispatcher.dispatchOnBackProgressed(
-                            backEvent(progress = backProgress.value)
-                        )
-                        if (backProgress.value == 1f) {
-                            dispatcher.onBackPressed()
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private fun backEvent(progress: Float = 0f): BackEventCompat {
-        return BackEventCompat(
-            touchX = 0f,
-            touchY = 0f,
-            progress = progress,
-            swipeEdge = BackEventCompat.EDGE_LEFT,
-        )
-    }
-
-    private class FakeLockscreen : ExclusiveActivatable(), Scene {
-        override val key: SceneKey = Scenes.Lockscreen
-        override val userActions: Flow<Map<UserAction, UserActionResult>> = flowOf()
-
-        @Composable
-        override fun SceneScope.Content(modifier: Modifier) {
-            Box(modifier = modifier, contentAlignment = Alignment.Center) {
-                Text(text = "Fake Lockscreen")
-            }
-        }
-
-        override suspend fun onActivated() = awaitCancellation()
-    }
-
-    companion object {
-        private val elementAlpha =
-            FeatureCapture<SemanticsNode, Float>("alpha") {
-                DataPoint.of(it.lastAlphaForTesting, DataPointTypes.float)
-            }
-
-        private val elementScale =
-            FeatureCapture<SemanticsNode, Scale>("scale") {
-                DataPoint.of(it.lastScaleForTesting, scale)
-            }
-
-        private val scale: DataPointType<Scale> =
-            DataPointType(
-                "scale",
-                jsonToValue = {
-                    when (it) {
-                        "unspecified" -> Scale.Unspecified
-                        "default" -> Scale.Default
-                        "zero" -> Scale.Zero
-                        is JSONObject -> {
-                            val pivot = it.get("pivot")
-                            Scale(
-                                scaleX = it.getDouble("x").toFloat(),
-                                scaleY = it.getDouble("y").toFloat(),
-                                pivot =
-                                    when (pivot) {
-                                        "unspecified" -> Offset.Unspecified
-                                        "infinite" -> Offset.Infinite
-                                        is JSONObject ->
-                                            Offset(
-                                                pivot.getDouble("x").toFloat(),
-                                                pivot.getDouble("y").toFloat(),
-                                            )
-                                        else -> throw UnknownTypeException()
-                                    },
-                            )
-                        }
-                        else -> throw UnknownTypeException()
-                    }
-                },
-                valueToJson = {
-                    when (it) {
-                        Scale.Unspecified -> "unspecified"
-                        Scale.Default -> "default"
-                        Scale.Zero -> "zero"
-                        else -> {
-                            JSONObject().apply {
-                                put("x", it.scaleX)
-                                put("y", it.scaleY)
-                                put(
-                                    "pivot",
-                                    when {
-                                        it.pivot.isUnspecified -> "unspecified"
-                                        !it.pivot.isFinite -> "infinite"
-                                        else ->
-                                            JSONObject().apply {
-                                                put("x", it.pivot.x)
-                                                put("y", it.pivot.y)
-                                            }
-                                    },
-                                )
-                            }
-                        }
-                    }
-                },
-            )
-    }
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/classifier/FalsingDataProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java
similarity index 100%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/classifier/FalsingDataProviderTest.java
rename to packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardListenerTest.java b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardListenerTest.java
index d72b72c..d8d53e0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardListenerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardListenerTest.java
@@ -22,15 +22,17 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyBoolean;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 import android.app.KeyguardManager;
 import android.content.ClipData;
 import android.content.ClipDescription;
 import android.content.ClipboardManager;
+import android.os.Build;
 import android.os.PersistableBundle;
 import android.os.UserHandle;
 import android.platform.test.annotations.DisableFlags;
@@ -71,6 +73,8 @@
     private ClipboardToast mClipboardToast;
     @Mock
     private UiEventLogger mUiEventLogger;
+    @Mock
+    private ClipboardOverlaySuppressionController mClipboardOverlaySuppressionController;
 
     private ClipData mSampleClipData;
     private String mSampleSource = "Example source";
@@ -113,7 +117,8 @@
                     return null;
                 },
                 mKeyguardManager,
-                mUiEventLogger);
+                mUiEventLogger,
+                mClipboardOverlaySuppressionController);
     }
 
 
@@ -121,7 +126,7 @@
     public void test_initialization() {
         mClipboardListener.start();
         verify(mClipboardManager).addPrimaryClipChangedListener(any());
-        verifyZeroInteractions(mUiEventLogger);
+        verifyNoMoreInteractions(mUiEventLogger);
     }
 
     @Test
@@ -155,6 +160,7 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_OVERRIDE_SUPPRESS_OVERLAY_CONDITION)
     public void test_shouldSuppressOverlay() {
         // Regardless of the package or emulator, nothing should be suppressed without the flag
         assertFalse(ClipboardListener.shouldSuppressOverlay(mSampleClipData, mSampleSource,
@@ -204,7 +210,7 @@
         verify(mUiEventLogger, times(1)).log(
                 ClipboardOverlayEvent.CLIPBOARD_TOAST_SHOWN, 0, mSampleSource);
         verify(mClipboardToast, times(1)).showCopiedToast();
-        verifyZeroInteractions(mOverlayControllerProvider);
+        verifyNoMoreInteractions(mOverlayControllerProvider);
     }
 
     @Test
@@ -218,7 +224,7 @@
         verify(mUiEventLogger, times(1)).log(
                 ClipboardOverlayEvent.CLIPBOARD_TOAST_SHOWN, 0, mSampleSource);
         verify(mClipboardToast, times(1)).showCopiedToast();
-        verifyZeroInteractions(mOverlayControllerProvider);
+        verifyNoMoreInteractions(mOverlayControllerProvider);
     }
 
     @Test
@@ -232,7 +238,65 @@
         verify(mUiEventLogger, times(1)).log(
                 ClipboardOverlayEvent.CLIPBOARD_OVERLAY_ENTERED, 0, mSampleSource);
         verify(mOverlayController).setClipData(mSampleClipData, mSampleSource);
-        verifyZeroInteractions(mClipboardToast);
+        verifyNoMoreInteractions(mClipboardToast);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_OVERRIDE_SUPPRESS_OVERLAY_CONDITION)
+    public void test_onPrimaryClipChanged_notSuppressOverlay() {
+        when(mClipboardOverlaySuppressionController.shouldSuppressOverlay(any(), any(),
+                anyBoolean())).thenReturn(false);
+
+        mClipboardListener.start();
+        mClipboardListener.onPrimaryClipChanged();
+
+        verify(mClipboardOverlaySuppressionController).shouldSuppressOverlay(mSampleClipData,
+                mSampleSource, Build.IS_EMULATOR);
+        verify(mUiEventLogger, times(1)).log(
+                ClipboardOverlayEvent.CLIPBOARD_OVERLAY_ENTERED, 0, mSampleSource);
+        verify(mOverlayController).setClipData(mSampleClipData, mSampleSource);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_OVERRIDE_SUPPRESS_OVERLAY_CONDITION)
+    public void test_onPrimaryClipChanged_suppressOverlay() {
+        when(mClipboardOverlaySuppressionController.shouldSuppressOverlay(any(), any(),
+                anyBoolean())).thenReturn(true);
+
+        mClipboardListener.start();
+        mClipboardListener.onPrimaryClipChanged();
+
+        verify(mClipboardOverlaySuppressionController).shouldSuppressOverlay(mSampleClipData,
+                mSampleSource, Build.IS_EMULATOR);
+        verifyNoMoreInteractions(mOverlayControllerProvider);
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_OVERRIDE_SUPPRESS_OVERLAY_CONDITION)
+    public void test_onPrimaryClipChanged_legacyBehavior_notSuppressOverlay() {
+        mClipboardListener.start();
+        mClipboardListener.onPrimaryClipChanged();
+
+        verify(mUiEventLogger, times(1)).log(
+                ClipboardOverlayEvent.CLIPBOARD_OVERLAY_ENTERED, 0, mSampleSource);
+        verify(mOverlayController).setClipData(mSampleClipData, mSampleSource);
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_OVERRIDE_SUPPRESS_OVERLAY_CONDITION)
+    public void test_onPrimaryClipChanged_legacyBehavior_suppressOverlay() {
+        ClipDescription desc = new ClipDescription("Test", new String[]{"text/plain"});
+        PersistableBundle bundle = new PersistableBundle();
+        bundle.putBoolean(ClipboardListener.EXTRA_SUPPRESS_OVERLAY, true);
+        desc.setExtras(bundle);
+        ClipData suppressableClipData = new ClipData(desc, new ClipData.Item("Test Item"));
+        when(mClipboardManager.getPrimaryClip()).thenReturn(suppressableClipData);
+        when(mClipboardManager.getPrimaryClipSource()).thenReturn(ClipboardListener.SHELL_PACKAGE);
+
+        mClipboardListener.start();
+        mClipboardListener.onPrimaryClipChanged();
+
+        verifyNoMoreInteractions(mOverlayControllerProvider);
     }
 
     @Test
@@ -242,9 +306,9 @@
         mClipboardListener.start();
         mClipboardListener.onPrimaryClipChanged();
 
-        verifyZeroInteractions(mUiEventLogger);
-        verifyZeroInteractions(mClipboardToast);
-        verifyZeroInteractions(mOverlayControllerProvider);
+        verifyNoMoreInteractions(mUiEventLogger);
+        verifyNoMoreInteractions(mClipboardToast);
+        verifyNoMoreInteractions(mOverlayControllerProvider);
     }
 
     @Test
@@ -259,6 +323,6 @@
         verify(mUiEventLogger, times(1)).log(
                 ClipboardOverlayEvent.CLIPBOARD_TOAST_SHOWN, 0, mSampleSource);
         verify(mClipboardToast, times(1)).showCopiedToast();
-        verifyZeroInteractions(mOverlayControllerProvider);
+        verifyNoMoreInteractions(mOverlayControllerProvider);
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java
index 5fc1971..6061063 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java
@@ -19,6 +19,7 @@
 import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
 
 import static com.android.systemui.Flags.FLAG_CLIPBOARD_SHARED_TRANSITIONS;
+import static com.android.systemui.Flags.FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_ACTION_SHOWN;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_DISMISS_TAPPED;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_EXPANDED_FROM_MINIMIZED;
@@ -104,6 +105,8 @@
 
     @Mock
     private Animator mAnimator;
+    @Mock
+    private Animator mEndAnimator;
     private ArgumentCaptor<Animator.AnimatorListener> mAnimatorListenerCaptor =
             ArgumentCaptor.forClass(Animator.AnimatorListener.class);
 
@@ -123,7 +126,7 @@
         MockitoAnnotations.initMocks(this);
 
         when(mClipboardOverlayView.getEnterAnimation()).thenReturn(mAnimator);
-        when(mClipboardOverlayView.getExitAnimation()).thenReturn(mAnimator);
+        when(mClipboardOverlayView.getExitAnimation()).thenReturn(mEndAnimator);
         when(mClipboardOverlayView.getFadeOutAnimation()).thenReturn(mAnimator);
         when(mClipboardOverlayWindow.getWindowInsets()).thenReturn(
                 getImeInsets(new Rect(0, 0, 0, 0)));
@@ -164,6 +167,7 @@
     }
 
     @Test
+    @DisableFlags(FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE)
     public void test_setClipData_invalidImageData_legacy() {
         initController();
 
@@ -236,6 +240,7 @@
     }
 
     @Test
+    @DisableFlags(FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE)
     public void test_setClipData_invalidImageData() {
         initController();
 
@@ -318,11 +323,11 @@
         mOverlayController.setClipData(mSampleClipData, "");
 
         mCallbacks.onShareButtonTapped();
-        verify(mAnimator).addListener(mAnimatorListenerCaptor.capture());
-        mAnimatorListenerCaptor.getValue().onAnimationEnd(mAnimator);
+        verify(mEndAnimator).addListener(mAnimatorListenerCaptor.capture());
+        mAnimatorListenerCaptor.getValue().onAnimationEnd(mEndAnimator);
 
         verify(mUiEventLogger, times(1)).log(CLIPBOARD_OVERLAY_SHARE_TAPPED, 0, "");
-        verify(mClipboardOverlayView, times(1)).getFadeOutAnimation();
+        verify(mClipboardOverlayView, times(1)).getExitAnimation();
     }
 
     @Test
@@ -343,8 +348,8 @@
         initController();
 
         mCallbacks.onDismissButtonTapped();
-        verify(mAnimator).addListener(mAnimatorListenerCaptor.capture());
-        mAnimatorListenerCaptor.getValue().onAnimationEnd(mAnimator);
+        verify(mEndAnimator).addListener(mAnimatorListenerCaptor.capture());
+        mAnimatorListenerCaptor.getValue().onAnimationEnd(mEndAnimator);
 
         // package name is null since we haven't actually set a source for this test
         verify(mUiEventLogger, times(1)).log(CLIPBOARD_OVERLAY_DISMISS_TAPPED, 0, null);
@@ -403,14 +408,18 @@
 
         mOverlayController.setClipData(mSampleClipData, "first.package");
         mCallbacks.onShareButtonTapped();
+        verify(mEndAnimator).addListener(mAnimatorListenerCaptor.capture());
+        mAnimatorListenerCaptor.getValue().onAnimationEnd(mEndAnimator);
 
         mOverlayController.setClipData(mSampleClipData, "second.package");
         mCallbacks.onShareButtonTapped();
+        verify(mEndAnimator, times(2)).addListener(mAnimatorListenerCaptor.capture());
+        mAnimatorListenerCaptor.getValue().onAnimationEnd(mEndAnimator);
 
-        verify(mUiEventLogger).log(CLIPBOARD_OVERLAY_SHARE_TAPPED, 0, "first.package");
-        verify(mUiEventLogger).log(CLIPBOARD_OVERLAY_SHARE_TAPPED, 0, "second.package");
         verify(mUiEventLogger).log(CLIPBOARD_OVERLAY_SHOWN_EXPANDED, 0, "first.package");
+        verify(mUiEventLogger).log(CLIPBOARD_OVERLAY_SHARE_TAPPED, 0, "first.package");
         verify(mUiEventLogger).log(CLIPBOARD_OVERLAY_SHOWN_EXPANDED, 0, "second.package");
+        verify(mUiEventLogger).log(CLIPBOARD_OVERLAY_SHARE_TAPPED, 0, "second.package");
         verifyNoMoreInteractions(mUiEventLogger);
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlaySuppressionControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlaySuppressionControllerImplTest.kt
new file mode 100644
index 0000000..86788d3
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlaySuppressionControllerImplTest.kt
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2024 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.systemui.clipboardoverlay
+
+import android.content.ClipData
+import android.content.ClipDescription
+import android.os.PersistableBundle
+import androidx.test.filters.SmallTest
+import androidx.test.runner.AndroidJUnit4
+import com.android.systemui.SysuiTestCase
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class ClipboardOverlaySuppressionControllerImplTest : SysuiTestCase() {
+    private lateinit var mSampleClipData: ClipData
+    private lateinit var mSuppressableClipData: ClipData
+    private lateinit var mClipboardOverlaySuppressionControllerImpl:
+        ClipboardOverlaySuppressionControllerImpl
+
+    @Before
+    fun setup() {
+        mSampleClipData = ClipData("Test", arrayOf("text/plain"), ClipData.Item("Test Item"))
+
+        val desc = ClipDescription("Test", arrayOf("text/plain"))
+        val bundle = PersistableBundle()
+        bundle.putBoolean(ClipboardOverlaySuppressionControllerImpl.EXTRA_SUPPRESS_OVERLAY, true)
+        desc.extras = bundle
+        mSuppressableClipData = ClipData(desc, ClipData.Item("Test Item"))
+
+        mClipboardOverlaySuppressionControllerImpl = ClipboardOverlaySuppressionControllerImpl()
+    }
+
+    @Test
+    fun shouldSuppressOverlay_notEmulatorOrShellPackage_returnFalse() {
+        Assert.assertFalse(
+            mClipboardOverlaySuppressionControllerImpl.shouldSuppressOverlay(
+                mSuppressableClipData,
+                EXAMPLE_PACKAGE,
+                false,
+            )
+        )
+    }
+
+    @Test
+    fun shouldSuppressOverlay_nullClipData_returnFalse() {
+        Assert.assertFalse(
+            mClipboardOverlaySuppressionControllerImpl.shouldSuppressOverlay(
+                null,
+                ClipboardOverlaySuppressionControllerImpl.SHELL_PACKAGE,
+                true,
+            )
+        )
+    }
+
+    @Test
+    fun shouldSuppressOverlay_noSuppressOverlayExtra_returnFalse() {
+        // Regardless of the package or emulator, nothing should be suppressed without the flag.
+        Assert.assertFalse(
+            mClipboardOverlaySuppressionControllerImpl.shouldSuppressOverlay(
+                mSampleClipData,
+                EXAMPLE_PACKAGE,
+                true,
+            )
+        )
+        Assert.assertFalse(
+            mClipboardOverlaySuppressionControllerImpl.shouldSuppressOverlay(
+                mSampleClipData,
+                ClipboardOverlaySuppressionControllerImpl.SHELL_PACKAGE,
+                false,
+            )
+        )
+    }
+
+    @Test
+    fun shouldSuppressOverlay_hasSuppressOverlayExtra_returnTrue() {
+        // Clip data with the suppression extra is only honored in the emulator or with the shell
+        // package.
+        Assert.assertTrue(
+            mClipboardOverlaySuppressionControllerImpl.shouldSuppressOverlay(
+                mSuppressableClipData,
+                EXAMPLE_PACKAGE,
+                true,
+            )
+        )
+        Assert.assertTrue(
+            mClipboardOverlaySuppressionControllerImpl.shouldSuppressOverlay(
+                mSuppressableClipData,
+                ClipboardOverlaySuppressionControllerImpl.SHELL_PACKAGE,
+                false,
+            )
+        )
+    }
+
+    companion object {
+        const val EXAMPLE_PACKAGE = "com.example"
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/communal/data/db/CommunalDatabaseMigrationsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/communal/data/db/CommunalDatabaseMigrationsTest.kt
index ad25502..7d5a334 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/communal/data/db/CommunalDatabaseMigrationsTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/communal/data/db/CommunalDatabaseMigrationsTest.kt
@@ -148,6 +148,31 @@
         )
     }
 
+    @Test
+    fun migrate3To4_addSpanYColumn_defaultValuePopulated() {
+        val databaseV3 = migrationTestHelper.createDatabase(DATABASE_NAME, version = 3)
+
+        val fakeWidgetsV3 =
+            listOf(
+                FakeCommunalWidgetItemV3(1, "test_widget_1", 11, 0),
+                FakeCommunalWidgetItemV3(2, "test_widget_2", 12, 10),
+                FakeCommunalWidgetItemV3(3, "test_widget_3", 13, 0),
+            )
+        databaseV3.insertWidgetsV3(fakeWidgetsV3)
+
+        databaseV3.verifyWidgetsV3(fakeWidgetsV3)
+
+        val databaseV4 =
+            migrationTestHelper.runMigrationsAndValidate(
+                name = DATABASE_NAME,
+                version = 4,
+                validateDroppedTables = false,
+                CommunalDatabase.MIGRATION_3_4,
+            )
+
+        databaseV4.verifyWidgetsV4(fakeWidgetsV3.map { it.getV4() })
+    }
+
     private fun SupportSQLiteDatabase.insertWidgetsV1(widgets: List<FakeCommunalWidgetItemV1>) {
         widgets.forEach { widget ->
             execSQL(
@@ -157,6 +182,22 @@
         }
     }
 
+    private fun SupportSQLiteDatabase.insertWidgetsV3(widgets: List<FakeCommunalWidgetItemV3>) {
+        widgets.forEach { widget ->
+            execSQL(
+                "INSERT INTO communal_widget_table(" +
+                    "widget_id, " +
+                    "component_name, " +
+                    "item_id, " +
+                    "user_serial_number) " +
+                    "VALUES(${widget.widgetId}, " +
+                    "'${widget.componentName}', " +
+                    "${widget.itemId}, " +
+                    "${widget.userSerialNumber})"
+            )
+        }
+    }
+
     private fun SupportSQLiteDatabase.verifyWidgetsV1(widgets: List<FakeCommunalWidgetItemV1>) {
         val cursor = query("SELECT * FROM communal_widget_table")
         assertThat(cursor.moveToFirst()).isTrue()
@@ -193,6 +234,42 @@
         assertThat(cursor.isAfterLast).isTrue()
     }
 
+    private fun SupportSQLiteDatabase.verifyWidgetsV3(widgets: List<FakeCommunalWidgetItemV3>) {
+        val cursor = query("SELECT * FROM communal_widget_table")
+        assertThat(cursor.moveToFirst()).isTrue()
+
+        widgets.forEach { widget ->
+            assertThat(cursor.getInt(cursor.getColumnIndex("widget_id"))).isEqualTo(widget.widgetId)
+            assertThat(cursor.getString(cursor.getColumnIndex("component_name")))
+                .isEqualTo(widget.componentName)
+            assertThat(cursor.getInt(cursor.getColumnIndex("item_id"))).isEqualTo(widget.itemId)
+            assertThat(cursor.getInt(cursor.getColumnIndex("user_serial_number")))
+                .isEqualTo(widget.userSerialNumber)
+
+            cursor.moveToNext()
+        }
+        assertThat(cursor.isAfterLast).isTrue()
+    }
+
+    private fun SupportSQLiteDatabase.verifyWidgetsV4(widgets: List<FakeCommunalWidgetItemV4>) {
+        val cursor = query("SELECT * FROM communal_widget_table")
+        assertThat(cursor.moveToFirst()).isTrue()
+
+        widgets.forEach { widget ->
+            assertThat(cursor.getInt(cursor.getColumnIndex("widget_id"))).isEqualTo(widget.widgetId)
+            assertThat(cursor.getString(cursor.getColumnIndex("component_name")))
+                .isEqualTo(widget.componentName)
+            assertThat(cursor.getInt(cursor.getColumnIndex("item_id"))).isEqualTo(widget.itemId)
+            assertThat(cursor.getInt(cursor.getColumnIndex("user_serial_number")))
+                .isEqualTo(widget.userSerialNumber)
+            assertThat(cursor.getInt(cursor.getColumnIndex("span_y"))).isEqualTo(widget.spanY)
+
+            cursor.moveToNext()
+        }
+
+        assertThat(cursor.isAfterLast).isTrue()
+    }
+
     private fun SupportSQLiteDatabase.insertRanks(ranks: List<FakeCommunalItemRank>) {
         ranks.forEach { rank ->
             execSQL("INSERT INTO communal_item_rank_table(rank) VALUES(${rank.rank})")
@@ -238,10 +315,27 @@
         val userSerialNumber: Int,
     )
 
-    private data class FakeCommunalItemRank(
-        val rank: Int,
+    private fun FakeCommunalWidgetItemV3.getV4(): FakeCommunalWidgetItemV4 {
+        return FakeCommunalWidgetItemV4(widgetId, componentName, itemId, userSerialNumber, 3)
+    }
+
+    private data class FakeCommunalWidgetItemV3(
+        val widgetId: Int,
+        val componentName: String,
+        val itemId: Int,
+        val userSerialNumber: Int,
     )
 
+    private data class FakeCommunalWidgetItemV4(
+        val widgetId: Int,
+        val componentName: String,
+        val itemId: Int,
+        val userSerialNumber: Int,
+        val spanY: Int,
+    )
+
+    private data class FakeCommunalItemRank(val rank: Int)
+
     companion object {
         private const val DATABASE_NAME = "communal_db"
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt
deleted file mode 100644
index 9e8914a..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
- * Copyright (C) 2023 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.systemui.controls.start
-
-import android.content.BroadcastReceiver
-import android.content.ComponentName
-import android.content.Context
-import android.content.Intent
-import android.content.IntentFilter
-import android.content.pm.ApplicationInfo
-import android.content.pm.ServiceInfo
-import android.os.UserHandle
-import android.os.UserManager
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.broadcast.BroadcastDispatcher
-import com.android.systemui.common.data.repository.fakePackageChangeRepository
-import com.android.systemui.common.domain.interactor.packageChangeInteractor
-import com.android.systemui.common.shared.model.PackageChangeModel
-import com.android.systemui.controls.ControlsServiceInfo
-import com.android.systemui.controls.controller.ControlsController
-import com.android.systemui.controls.dagger.ControlsComponent
-import com.android.systemui.controls.management.ControlsListingController
-import com.android.systemui.controls.panels.AuthorizedPanelsRepository
-import com.android.systemui.controls.panels.SelectedComponentRepository
-import com.android.systemui.controls.panels.selectedComponentRepository
-import com.android.systemui.controls.ui.SelectedItem
-import com.android.systemui.kosmos.applicationCoroutineScope
-import com.android.systemui.kosmos.testDispatcher
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.settings.UserTracker
-import com.android.systemui.testKosmos
-import com.android.systemui.util.concurrency.FakeExecutor
-import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.argumentCaptor
-import com.android.systemui.util.mockito.capture
-import com.android.systemui.util.mockito.eq
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.nullable
-import com.android.systemui.util.mockito.whenever
-import com.android.systemui.util.time.FakeSystemClock
-import com.google.common.truth.Truth.assertThat
-import java.util.Optional
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.Mockito.anyInt
-import org.mockito.Mockito.doAnswer
-import org.mockito.Mockito.doReturn
-import org.mockito.Mockito.never
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
-import org.mockito.Mockito.`when`
-import org.mockito.MockitoAnnotations
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class ControlsStartableTest : SysuiTestCase() {
-
-    private val kosmos = testKosmos()
-
-    @Mock private lateinit var controlsController: ControlsController
-    @Mock private lateinit var controlsListingController: ControlsListingController
-    @Mock private lateinit var userTracker: UserTracker
-    @Mock private lateinit var authorizedPanelsRepository: AuthorizedPanelsRepository
-    @Mock private lateinit var userManager: UserManager
-    @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher
-
-    private lateinit var preferredPanelsRepository: SelectedComponentRepository
-
-    private lateinit var fakeExecutor: FakeExecutor
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-        whenever(authorizedPanelsRepository.getPreferredPackages()).thenReturn(setOf())
-        whenever(userManager.isUserUnlocked(anyInt())).thenReturn(true)
-        whenever(userTracker.userHandle).thenReturn(UserHandle.of(1))
-
-        fakeExecutor = FakeExecutor(FakeSystemClock())
-        preferredPanelsRepository = kosmos.selectedComponentRepository
-    }
-
-    @Test
-    fun testDisabledNothingIsCalled() {
-        createStartable(enabled = false).apply {
-            start()
-            onBootCompleted()
-        }
-
-        verifyZeroInteractions(controlsController, controlsListingController, userTracker)
-    }
-
-    @Test
-    fun testNothingCalledOnStart() {
-        createStartable(enabled = true).start()
-
-        fakeExecutor.advanceClockToLast()
-        fakeExecutor.runAllReady()
-
-        verifyZeroInteractions(controlsController, controlsListingController, userTracker)
-    }
-
-    @Test
-    fun testNoPreferredPackagesNoDefaultSelected_noNewSelection() {
-        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
-        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
-        setUpControlsListingControls(listings)
-
-        createStartable(enabled = true).onBootCompleted()
-        fakeExecutor.runAllReady()
-
-        verify(controlsController, never()).setPreferredSelection(any())
-    }
-
-    @Test
-    fun testPreferredPackagesNotInstalled_noNewSelection() {
-        whenever(authorizedPanelsRepository.getPreferredPackages())
-            .thenReturn(setOf(TEST_PACKAGE_PANEL))
-        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
-        setUpControlsListingControls(emptyList())
-
-        createStartable(enabled = true).onBootCompleted()
-        fakeExecutor.runAllReady()
-
-        verify(controlsController, never()).setPreferredSelection(any())
-    }
-
-    @Test
-    fun testPreferredPackageNotPanel_noNewSelection() {
-        whenever(authorizedPanelsRepository.getPreferredPackages())
-            .thenReturn(setOf(TEST_PACKAGE_PANEL))
-        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
-        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT, "not panel", hasPanel = false))
-        setUpControlsListingControls(listings)
-
-        createStartable(enabled = true).onBootCompleted()
-        fakeExecutor.runAllReady()
-
-        verify(controlsController, never()).setPreferredSelection(any())
-    }
-
-    @Test
-    fun testExistingSelection_noNewSelection() {
-        whenever(authorizedPanelsRepository.getPreferredPackages())
-            .thenReturn(setOf(TEST_PACKAGE_PANEL))
-        `when`(controlsController.getPreferredSelection())
-            .thenReturn(mock<SelectedItem.PanelItem>())
-        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
-        setUpControlsListingControls(listings)
-
-        createStartable(enabled = true).onBootCompleted()
-        fakeExecutor.runAllReady()
-
-        verify(controlsController, never()).setPreferredSelection(any())
-    }
-
-    @Test
-    fun testPanelAdded() {
-        whenever(authorizedPanelsRepository.getPreferredPackages())
-            .thenReturn(setOf(TEST_PACKAGE_PANEL))
-        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
-        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
-        setUpControlsListingControls(listings)
-
-        createStartable(enabled = true).onBootCompleted()
-        fakeExecutor.runAllReady()
-
-        verify(controlsController).setPreferredSelection(listings[0].toPanelItem())
-    }
-
-    @Test
-    fun testMultiplePreferredOnlyOnePanel_panelAdded() {
-        whenever(authorizedPanelsRepository.getPreferredPackages())
-            .thenReturn(setOf(TEST_PACKAGE_PANEL))
-        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
-        val listings =
-            listOf(
-                ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true),
-                ControlsServiceInfo(ComponentName("other_package", "cls"), "non panel", false)
-            )
-        setUpControlsListingControls(listings)
-
-        createStartable(enabled = true).onBootCompleted()
-        fakeExecutor.runAllReady()
-
-        verify(controlsController).setPreferredSelection(listings[0].toPanelItem())
-    }
-
-    @Test
-    fun testMultiplePreferredMultiplePanels_firstPreferredAdded() {
-        whenever(authorizedPanelsRepository.getPreferredPackages())
-            .thenReturn(setOf(TEST_PACKAGE_PANEL))
-        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
-        val listings =
-            listOf(
-                ControlsServiceInfo(ComponentName("other_package", "cls"), "panel", true),
-                ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)
-            )
-        setUpControlsListingControls(listings)
-
-        createStartable(enabled = true).onBootCompleted()
-        fakeExecutor.runAllReady()
-
-        verify(controlsController).setPreferredSelection(listings[1].toPanelItem())
-    }
-
-    @Test
-    fun testPreferredSelectionIsPanel_bindOnBoot() {
-        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
-        setUpControlsListingControls(listings)
-        `when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem())
-
-        createStartable(enabled = true).onBootCompleted()
-        fakeExecutor.runAllReady()
-
-        verify(controlsController).bindComponentForPanel(TEST_COMPONENT_PANEL)
-    }
-
-    @Test
-    fun testPreferredSelectionIsPanel_userNotUnlocked_notBind() {
-        whenever(userManager.isUserUnlocked(anyInt())).thenReturn(false)
-
-        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
-        setUpControlsListingControls(listings)
-        `when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem())
-
-        createStartable(enabled = true).onBootCompleted()
-        fakeExecutor.runAllReady()
-
-        verify(controlsController, never()).bindComponentForPanel(TEST_COMPONENT_PANEL)
-    }
-
-    @Test
-    fun testPreferredSelectionIsPanel_userNotUnlocked_broadcastRegistered_broadcastSentBinds() {
-        whenever(userManager.isUserUnlocked(anyInt())).thenReturn(false)
-
-        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
-        setUpControlsListingControls(listings)
-        `when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem())
-
-        createStartable(enabled = true).onBootCompleted()
-        fakeExecutor.runAllReady()
-
-        val intentFilterCaptor = argumentCaptor<IntentFilter>()
-        val receiverCaptor = argumentCaptor<BroadcastReceiver>()
-
-        verify(broadcastDispatcher)
-            .registerReceiver(
-                capture(receiverCaptor),
-                capture(intentFilterCaptor),
-                eq(fakeExecutor),
-                nullable(),
-                anyInt(),
-                nullable()
-            )
-        assertThat(intentFilterCaptor.value.matchAction(Intent.ACTION_USER_UNLOCKED)).isTrue()
-
-        // User is unlocked
-        whenever(userManager.isUserUnlocked(anyInt())).thenReturn(true)
-        receiverCaptor.value.onReceive(mock(), Intent(Intent.ACTION_USER_UNLOCKED))
-
-        verify(controlsController).bindComponentForPanel(TEST_COMPONENT_PANEL)
-    }
-
-    @Test
-    fun testPreferredSelectionPanel_listingNoPanel_notBind() {
-        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = false))
-        setUpControlsListingControls(listings)
-        `when`(controlsController.getPreferredSelection())
-            .thenReturn(SelectedItem.PanelItem("panel", TEST_COMPONENT_PANEL))
-
-        createStartable(enabled = true).onBootCompleted()
-        fakeExecutor.runAllReady()
-
-        verify(controlsController, never()).bindComponentForPanel(any())
-    }
-
-    @Test
-    fun testNotPanelSelection_noBind() {
-        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = false))
-        setUpControlsListingControls(listings)
-        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
-
-        createStartable(enabled = true).onBootCompleted()
-        fakeExecutor.runAllReady()
-
-        verify(controlsController, never()).bindComponentForPanel(any())
-    }
-
-    @Test
-    fun testAlreadyAddedPanel_noNewSelection() {
-        preferredPanelsRepository.setShouldAddDefaultComponent(false)
-        whenever(authorizedPanelsRepository.getPreferredPackages())
-            .thenReturn(setOf(TEST_PACKAGE_PANEL))
-        `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
-        val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
-        `when`(controlsListingController.getCurrentServices()).thenReturn(listings)
-
-        createStartable(enabled = true).onBootCompleted()
-
-        verify(controlsController, never()).setPreferredSelection(any())
-    }
-
-    @Test
-    fun testSelectedComponentIsUninstalled() =
-        with(kosmos) {
-            testScope.runTest {
-                val selectedComponent =
-                    SelectedComponentRepository.SelectedComponent(
-                        "panel",
-                        TEST_COMPONENT_PANEL,
-                        isPanel = true
-                    )
-                preferredPanelsRepository.setSelectedComponent(selectedComponent)
-                val activeUser = UserHandle.of(100)
-                whenever(userTracker.userHandle).thenReturn(activeUser)
-
-                createStartable(enabled = true).onBootCompleted()
-                fakeExecutor.runAllReady()
-                runCurrent()
-
-                assertThat(preferredPanelsRepository.getSelectedComponent())
-                    .isEqualTo(selectedComponent)
-                fakePackageChangeRepository.notifyChange(
-                    PackageChangeModel.Uninstalled(
-                        packageName = TEST_PACKAGE_PANEL,
-                        packageUid = UserHandle.getUid(100, 1)
-                    )
-                )
-                runCurrent()
-
-                assertThat(preferredPanelsRepository.getSelectedComponent()).isNull()
-            }
-        }
-
-    @Test
-    fun testSelectedComponentIsChanged() =
-        with(kosmos) {
-            testScope.runTest {
-                val selectedComponent =
-                    SelectedComponentRepository.SelectedComponent(
-                        "panel",
-                        TEST_COMPONENT_PANEL,
-                        isPanel = true
-                    )
-                preferredPanelsRepository.setSelectedComponent(selectedComponent)
-                val activeUser = UserHandle.of(100)
-                whenever(userTracker.userHandle).thenReturn(activeUser)
-
-                createStartable(enabled = true).onBootCompleted()
-                fakeExecutor.runAllReady()
-                runCurrent()
-
-                fakePackageChangeRepository.notifyChange(
-                    PackageChangeModel.Changed(
-                        packageName = TEST_PACKAGE_PANEL,
-                        packageUid = UserHandle.getUid(100, 1)
-                    )
-                )
-                runCurrent()
-
-                assertThat(preferredPanelsRepository.getSelectedComponent())
-                    .isEqualTo(selectedComponent)
-            }
-        }
-
-    @Test
-    fun testOtherPackageIsUninstalled() =
-        with(kosmos) {
-            testScope.runTest {
-                val selectedComponent =
-                    SelectedComponentRepository.SelectedComponent(
-                        "panel",
-                        TEST_COMPONENT_PANEL,
-                        isPanel = true
-                    )
-                preferredPanelsRepository.setSelectedComponent(selectedComponent)
-                val activeUser = UserHandle.of(100)
-                whenever(userTracker.userHandle).thenReturn(activeUser)
-
-                createStartable(enabled = true).onBootCompleted()
-                fakeExecutor.runAllReady()
-                runCurrent()
-
-                fakePackageChangeRepository.notifyChange(
-                    PackageChangeModel.Uninstalled(
-                        packageName = TEST_PACKAGE,
-                        packageUid = UserHandle.getUid(100, 1)
-                    )
-                )
-                runCurrent()
-
-                assertThat(preferredPanelsRepository.getSelectedComponent())
-                    .isEqualTo(selectedComponent)
-            }
-        }
-
-    private fun setUpControlsListingControls(listings: List<ControlsServiceInfo>) {
-        doAnswer { doReturn(listings).`when`(controlsListingController).getCurrentServices() }
-            .`when`(controlsListingController)
-            .forceReload()
-    }
-
-    private fun createStartable(enabled: Boolean): ControlsStartable {
-        val component: ControlsComponent =
-            mock() {
-                `when`(isEnabled()).thenReturn(enabled)
-                if (enabled) {
-                    `when`(getControlsController()).thenReturn(Optional.of(controlsController))
-                    `when`(getControlsListingController())
-                        .thenReturn(Optional.of(controlsListingController))
-                } else {
-                    `when`(getControlsController()).thenReturn(Optional.empty())
-                    `when`(getControlsListingController()).thenReturn(Optional.empty())
-                }
-            }
-        return ControlsStartable(
-            kosmos.applicationCoroutineScope,
-            kosmos.testDispatcher,
-            fakeExecutor,
-            component,
-            userTracker,
-            authorizedPanelsRepository,
-            preferredPanelsRepository,
-            kosmos.packageChangeInteractor,
-            userManager,
-            broadcastDispatcher,
-        )
-    }
-
-    private fun ControlsServiceInfo(
-        componentName: ComponentName,
-        label: CharSequence,
-        hasPanel: Boolean
-    ): ControlsServiceInfo {
-        val serviceInfo =
-            ServiceInfo().apply {
-                applicationInfo = ApplicationInfo()
-                packageName = componentName.packageName
-                name = componentName.className
-            }
-        return FakeControlsServiceInfo(context, serviceInfo, label, hasPanel)
-    }
-
-    private class FakeControlsServiceInfo(
-        context: Context,
-        serviceInfo: ServiceInfo,
-        private val label: CharSequence,
-        hasPanel: Boolean
-    ) : ControlsServiceInfo(context, serviceInfo) {
-
-        init {
-            if (hasPanel) {
-                panelActivity = serviceInfo.componentName
-            }
-        }
-
-        override fun loadLabel(): CharSequence {
-            return label
-        }
-    }
-
-    companion object {
-        private fun ControlsServiceInfo.toPanelItem(): SelectedItem.PanelItem {
-            if (panelActivity == null) {
-                throw IllegalArgumentException("$this is not a panel")
-            }
-            return SelectedItem.PanelItem(loadLabel(), componentName)
-        }
-
-        private const val TEST_PACKAGE = "pkg"
-        private val TEST_COMPONENT = ComponentName(TEST_PACKAGE, "service")
-        private const val TEST_PACKAGE_PANEL = "pkg.panel"
-        private val TEST_COMPONENT_PANEL = ComponentName(TEST_PACKAGE_PANEL, "service")
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorTest.kt
deleted file mode 100644
index 40b2a08..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorTest.kt
+++ /dev/null
@@ -1,655 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.deviceentry.domain.interactor
-
-import android.content.pm.UserInfo
-import android.hardware.biometrics.BiometricFaceConstants
-import android.hardware.biometrics.BiometricSourceType
-import android.os.PowerManager
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.compose.animation.scene.ObservableTransitionState
-import com.android.keyguard.keyguardUpdateMonitor
-import com.android.keyguard.trustManager
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.biometrics.data.repository.CameraInfo
-import com.android.systemui.biometrics.data.repository.FaceSensorInfo
-import com.android.systemui.biometrics.data.repository.facePropertyRepository
-import com.android.systemui.biometrics.shared.model.LockoutMode
-import com.android.systemui.biometrics.shared.model.SensorStrength
-import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
-import com.android.systemui.bouncer.domain.interactor.alternateBouncerInteractor
-import com.android.systemui.bouncer.domain.interactor.primaryBouncerInteractor
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.data.repository.fakeFaceWakeUpTriggersConfig
-import com.android.systemui.deviceentry.shared.FaceAuthUiEvent
-import com.android.systemui.deviceentry.shared.model.ErrorFaceAuthenticationStatus
-import com.android.systemui.flags.EnableSceneContainer
-import com.android.systemui.keyguard.data.repository.fakeBiometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFaceAuthRepository
-import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
-import com.android.systemui.keyguard.shared.model.KeyguardState
-import com.android.systemui.keyguard.shared.model.TransitionState
-import com.android.systemui.keyguard.shared.model.TransitionStep
-import com.android.systemui.kosmos.testDispatcher
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.log.FaceAuthenticationLogger
-import com.android.systemui.log.logcatLogBuffer
-import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
-import com.android.systemui.power.domain.interactor.powerInteractor
-import com.android.systemui.power.shared.model.WakeSleepReason
-import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.testKosmos
-import com.android.systemui.user.data.model.SelectionStatus
-import com.android.systemui.user.data.repository.fakeUserRepository
-import com.android.systemui.util.mockito.eq
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.flowOf
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.Mockito.never
-import org.mockito.Mockito.verify
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
-    private val kosmos = testKosmos()
-    private val testScope: TestScope = kosmos.testScope
-
-    private lateinit var underTest: SystemUIDeviceEntryFaceAuthInteractor
-    private val bouncerRepository = kosmos.fakeKeyguardBouncerRepository
-    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
-    private val keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor
-    private val faceAuthRepository = kosmos.fakeDeviceEntryFaceAuthRepository
-    private val fakeUserRepository = kosmos.fakeUserRepository
-    private val facePropertyRepository = kosmos.facePropertyRepository
-    private val fakeDeviceEntryFingerprintAuthInteractor =
-        kosmos.deviceEntryFingerprintAuthInteractor
-    private val powerInteractor = kosmos.powerInteractor
-    private val fakeBiometricSettingsRepository = kosmos.fakeBiometricSettingsRepository
-
-    private val keyguardUpdateMonitor = kosmos.keyguardUpdateMonitor
-    private val faceWakeUpTriggersConfig = kosmos.fakeFaceWakeUpTriggersConfig
-    private val trustManager = kosmos.trustManager
-    private val deviceEntryFaceAuthStatusInteractor = kosmos.deviceEntryFaceAuthStatusInteractor
-
-    @Before
-    fun setup() {
-        fakeUserRepository.setUserInfos(listOf(primaryUser, secondaryUser))
-        underTest =
-            SystemUIDeviceEntryFaceAuthInteractor(
-                mContext,
-                testScope.backgroundScope,
-                kosmos.testDispatcher,
-                faceAuthRepository,
-                { kosmos.primaryBouncerInteractor },
-                kosmos.alternateBouncerInteractor,
-                keyguardTransitionInteractor,
-                FaceAuthenticationLogger(logcatLogBuffer("faceAuthBuffer")),
-                keyguardUpdateMonitor,
-                fakeDeviceEntryFingerprintAuthInteractor,
-                fakeUserRepository,
-                facePropertyRepository,
-                faceWakeUpTriggersConfig,
-                powerInteractor,
-                fakeBiometricSettingsRepository,
-                trustManager,
-                { kosmos.sceneInteractor },
-                deviceEntryFaceAuthStatusInteractor,
-            )
-    }
-
-    @Test
-    fun faceAuthIsRequestedWhenLockscreenBecomesVisibleFromOffState() =
-        testScope.runTest {
-            underTest.start()
-            runCurrent()
-
-            powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_LID)
-            faceWakeUpTriggersConfig.setTriggerFaceAuthOnWakeUpFrom(
-                setOf(WakeSleepReason.LID.powerManagerWakeReason)
-            )
-
-            keyguardTransitionRepository.sendTransitionStep(
-                TransitionStep(
-                    KeyguardState.OFF,
-                    KeyguardState.LOCKSCREEN,
-                    transitionState = TransitionState.STARTED
-                )
-            )
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(
-                    Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED, true)
-                )
-        }
-
-    @Test
-    fun whenFaceIsLockedOutAnyAttemptsToTriggerFaceAuthMustProvideLockoutError() =
-        testScope.runTest {
-            underTest.start()
-            val authenticationStatus = collectLastValue(underTest.authenticationStatus)
-            faceAuthRepository.setLockedOut(true)
-
-            underTest.onDeviceLifted()
-
-            val outputValue = authenticationStatus()!! as ErrorFaceAuthenticationStatus
-            assertThat(outputValue.msgId)
-                .isEqualTo(BiometricFaceConstants.FACE_ERROR_LOCKOUT_PERMANENT)
-            assertThat(outputValue.msg).isEqualTo("Face Unlock unavailable")
-            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
-        }
-
-    @Test
-    fun faceAuthIsRequestedWhenLockscreenBecomesVisibleFromAodState() =
-        testScope.runTest {
-            underTest.start()
-            runCurrent()
-
-            powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_LID)
-            faceWakeUpTriggersConfig.setTriggerFaceAuthOnWakeUpFrom(
-                setOf(WakeSleepReason.LID.powerManagerWakeReason)
-            )
-
-            keyguardTransitionRepository.sendTransitionStep(
-                TransitionStep(
-                    KeyguardState.AOD,
-                    KeyguardState.LOCKSCREEN,
-                    transitionState = TransitionState.STARTED
-                )
-            )
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(
-                    Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED, true)
-                )
-        }
-
-    @Test
-    fun faceAuthIsNotRequestedWhenLockscreenBecomesVisibleDueToIgnoredWakeReasons() =
-        testScope.runTest {
-            underTest.start()
-
-            powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_LIFT)
-            faceWakeUpTriggersConfig.setTriggerFaceAuthOnWakeUpFrom(
-                setOf(WakeSleepReason.LID.powerManagerWakeReason)
-            )
-
-            keyguardTransitionRepository.sendTransitionStep(
-                TransitionStep(
-                    KeyguardState.DOZING,
-                    KeyguardState.LOCKSCREEN,
-                    transitionState = TransitionState.STARTED
-                )
-            )
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
-        }
-
-    @Test
-    fun faceAuthIsRequestedWhenLockscreenBecomesVisibleFromDozingState() =
-        testScope.runTest {
-            underTest.start()
-            runCurrent()
-
-            powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_LID)
-            faceWakeUpTriggersConfig.setTriggerFaceAuthOnWakeUpFrom(
-                setOf(WakeSleepReason.LID.powerManagerWakeReason)
-            )
-
-            keyguardTransitionRepository.sendTransitionStep(
-                TransitionStep(
-                    KeyguardState.DOZING,
-                    KeyguardState.LOCKSCREEN,
-                    transitionState = TransitionState.STARTED
-                )
-            )
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(
-                    Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED, true)
-                )
-        }
-
-    @Test
-    fun faceAuthLockedOutStateIsUpdatedAfterUserSwitch() =
-        testScope.runTest {
-            underTest.start()
-
-            // User switching has started
-            fakeUserRepository.setSelectedUserInfo(primaryUser, SelectionStatus.SELECTION_COMPLETE)
-            fakeUserRepository.setSelectedUserInfo(
-                primaryUser,
-                SelectionStatus.SELECTION_IN_PROGRESS
-            )
-            runCurrent()
-
-            bouncerRepository.setPrimaryShow(true)
-            // New user is not locked out.
-            facePropertyRepository.setLockoutMode(secondaryUser.id, LockoutMode.NONE)
-            fakeUserRepository.setSelectedUserInfo(
-                secondaryUser,
-                SelectionStatus.SELECTION_COMPLETE
-            )
-            runCurrent()
-
-            assertThat(faceAuthRepository.isLockedOut.value).isFalse()
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value!!.first)
-                .isEqualTo(FaceAuthUiEvent.FACE_AUTH_UPDATED_USER_SWITCHING)
-            assertThat(faceAuthRepository.runningAuthRequest.value!!.second).isEqualTo(false)
-        }
-
-    @Test
-    fun faceAuthIsRequestedWhenPrimaryBouncerIsVisible() =
-        testScope.runTest {
-            underTest.start()
-
-            bouncerRepository.setPrimaryShow(false)
-            runCurrent()
-
-            bouncerRepository.setPrimaryShow(true)
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_PRIMARY_BOUNCER_SHOWN, false))
-        }
-
-    @Test
-    @EnableSceneContainer
-    fun withSceneContainerEnabled_faceAuthIsRequestedWhenPrimaryBouncerIsVisible() =
-        testScope.runTest {
-            underTest.start()
-
-            kosmos.sceneInteractor.changeScene(Scenes.Bouncer, "for-test")
-            kosmos.sceneInteractor.setTransitionState(
-                MutableStateFlow(ObservableTransitionState.Idle(Scenes.Bouncer))
-            )
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_PRIMARY_BOUNCER_SHOWN, false))
-        }
-
-    @Test
-    fun faceAuthIsRequestedWhenAlternateBouncerIsVisible() =
-        testScope.runTest {
-            underTest.start()
-
-            bouncerRepository.setAlternateVisible(false)
-            runCurrent()
-
-            bouncerRepository.setAlternateVisible(true)
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(
-                    Pair(
-                        FaceAuthUiEvent.FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN,
-                        false
-                    )
-                )
-        }
-
-    @Test
-    fun faceAuthIsRequestedWhenUdfpsSensorTouched() =
-        testScope.runTest {
-            underTest.start()
-
-            underTest.onUdfpsSensorTouched()
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_UDFPS_POINTER_DOWN, false))
-        }
-
-    @Test
-    fun faceAuthIsRequestedWhenOnAssistantTriggeredOnLockScreen() =
-        testScope.runTest {
-            underTest.start()
-
-            underTest.onAssistantTriggeredOnLockScreen()
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(
-                    Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_ASSISTANT_VISIBILITY_CHANGED, true)
-                )
-        }
-
-    @Test
-    fun faceAuthIsRequestedWhenDeviceLifted() =
-        testScope.runTest {
-            underTest.start()
-
-            underTest.onDeviceLifted()
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(
-                    Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_PICK_UP_GESTURE_TRIGGERED, true)
-                )
-        }
-
-    @Test
-    fun faceAuthIsRequestedWhenShadeExpansionStarted() =
-        testScope.runTest {
-            underTest.start()
-
-            underTest.onShadeExpansionStarted()
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_QS_EXPANDED, false))
-        }
-
-    @Test
-    @EnableSceneContainer
-    fun faceAuthIsRequestedWhenShadeExpansionIsStarted() =
-        testScope.runTest {
-            underTest.start()
-            faceAuthRepository.canRunFaceAuth.value = true
-            kosmos.sceneInteractor.snapToScene(toScene = Scenes.Lockscreen, "for-test")
-            runCurrent()
-
-            kosmos.sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "for-test")
-            kosmos.sceneInteractor.setTransitionState(
-                MutableStateFlow(
-                    ObservableTransitionState.Transition(
-                        fromScene = Scenes.Lockscreen,
-                        toScene = Scenes.Shade,
-                        currentScene = flowOf(Scenes.Lockscreen),
-                        progress = MutableStateFlow(0.2f),
-                        isInitiatedByUserInput = true,
-                        isUserInputOngoing = flowOf(false),
-                    )
-                )
-            )
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_QS_EXPANDED, false))
-        }
-
-    @Test
-    @EnableSceneContainer
-    fun faceAuthIsRequestedOnlyOnceWhenShadeExpansionStarts() =
-        testScope.runTest {
-            underTest.start()
-            faceAuthRepository.canRunFaceAuth.value = true
-            kosmos.sceneInteractor.snapToScene(toScene = Scenes.Lockscreen, "for-test")
-            runCurrent()
-
-            kosmos.sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "for-test")
-            kosmos.sceneInteractor.setTransitionState(
-                MutableStateFlow(
-                    ObservableTransitionState.Transition(
-                        fromScene = Scenes.Lockscreen,
-                        toScene = Scenes.Shade,
-                        currentScene = flowOf(Scenes.Lockscreen),
-                        progress = MutableStateFlow(0.2f),
-                        isInitiatedByUserInput = true,
-                        isUserInputOngoing = flowOf(false),
-                    )
-                )
-            )
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_QS_EXPANDED, false))
-            faceAuthRepository.runningAuthRequest.value = null
-
-            // expansion progress shouldn't trigger face auth again
-            kosmos.sceneInteractor.setTransitionState(
-                MutableStateFlow(
-                    ObservableTransitionState.Transition(
-                        fromScene = Scenes.Lockscreen,
-                        toScene = Scenes.Shade,
-                        currentScene = flowOf(Scenes.Lockscreen),
-                        progress = MutableStateFlow(0.5f),
-                        isInitiatedByUserInput = true,
-                        isUserInputOngoing = flowOf(false),
-                    )
-                )
-            )
-
-            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
-        }
-
-    @Test
-    fun faceAuthIsRequestedWhenNotificationPanelClicked() =
-        testScope.runTest {
-            underTest.start()
-
-            underTest.onNotificationPanelClicked()
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(
-                    Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_NOTIFICATION_PANEL_CLICKED, true)
-                )
-        }
-
-    @Test
-    fun faceAuthIsCancelledWhenUserInputOnPrimaryBouncer() =
-        testScope.runTest {
-            underTest.start()
-
-            underTest.onSwipeUpOnBouncer()
-
-            runCurrent()
-            assertThat(faceAuthRepository.isAuthRunning.value).isTrue()
-
-            underTest.onPrimaryBouncerUserInput()
-
-            runCurrent()
-
-            assertThat(faceAuthRepository.isAuthRunning.value).isFalse()
-        }
-
-    @Test
-    fun faceAuthIsRequestedWhenSwipeUpOnBouncer() =
-        testScope.runTest {
-            underTest.start()
-
-            underTest.onSwipeUpOnBouncer()
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER, false))
-        }
-
-    @Test
-    fun faceAuthIsRequestedWhenWalletIsLaunchedAndIfFaceAuthIsStrong() =
-        testScope.runTest {
-            underTest.start()
-            facePropertyRepository.setSensorInfo(FaceSensorInfo(1, SensorStrength.STRONG))
-
-            underTest.onWalletLaunched()
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_TRIGGERED_OCCLUDING_APP_REQUESTED, true))
-        }
-
-    @Test
-    fun faceAuthIsNotTriggeredIfFaceAuthIsWeak() =
-        testScope.runTest {
-            underTest.start()
-            facePropertyRepository.setSensorInfo(FaceSensorInfo(1, SensorStrength.WEAK))
-
-            underTest.onWalletLaunched()
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
-        }
-
-    @Test
-    fun faceAuthIsNotTriggeredIfFaceAuthIsConvenience() =
-        testScope.runTest {
-            underTest.start()
-            facePropertyRepository.setSensorInfo(FaceSensorInfo(1, SensorStrength.CONVENIENCE))
-
-            underTest.onWalletLaunched()
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
-        }
-
-    @Test
-    fun faceUnlockIsDisabledWhenFpIsLockedOut() =
-        testScope.runTest {
-            underTest.start()
-            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
-
-            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
-            runCurrent()
-
-            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
-        }
-
-    @Test
-    fun faceLockoutStateIsResetWheneverFingerprintIsNotLockedOut() =
-        testScope.runTest {
-            underTest.start()
-            fakeUserRepository.setSelectedUserInfo(primaryUser, SelectionStatus.SELECTION_COMPLETE)
-            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
-
-            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
-            runCurrent()
-
-            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
-            facePropertyRepository.setLockoutMode(primaryUserId, LockoutMode.NONE)
-
-            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
-            runCurrent()
-
-            assertThat(faceAuthRepository.isLockedOut.value).isFalse()
-        }
-
-    @Test
-    fun faceLockoutStateIsSetToUsersLockoutStateWheneverFingerprintIsNotLockedOut() =
-        testScope.runTest {
-            underTest.start()
-            fakeUserRepository.setSelectedUserInfo(primaryUser, SelectionStatus.SELECTION_COMPLETE)
-            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
-
-            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
-            runCurrent()
-
-            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
-            facePropertyRepository.setLockoutMode(primaryUserId, LockoutMode.TIMED)
-
-            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
-            runCurrent()
-
-            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
-        }
-
-    @Test
-    fun whenIsAuthenticatedFalse_clearFaceBiometrics() =
-        testScope.runTest {
-            underTest.start()
-
-            faceAuthRepository.isAuthenticated.value = true
-            runCurrent()
-            verify(trustManager, never())
-                .clearAllBiometricRecognized(eq(BiometricSourceType.FACE), anyInt())
-
-            faceAuthRepository.isAuthenticated.value = false
-            runCurrent()
-
-            verify(trustManager).clearAllBiometricRecognized(eq(BiometricSourceType.FACE), anyInt())
-        }
-
-    @Test
-    fun faceAuthIsRequestedWhenAuthIsRunningWhileCameraInfoChanged() =
-        testScope.runTest {
-            facePropertyRepository.setCameraIno(null)
-            underTest.start()
-
-            faceAuthRepository.requestAuthenticate(
-                FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED,
-                true
-            )
-            facePropertyRepository.setCameraIno(CameraInfo("0", "1", null))
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value)
-                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_CAMERA_AVAILABLE_CHANGED, true))
-        }
-
-    @Test
-    fun faceAuthIsNotRequestedWhenNoAuthRunningWhileCameraInfoChanged() =
-        testScope.runTest {
-            facePropertyRepository.setCameraIno(null)
-            underTest.start()
-
-            facePropertyRepository.setCameraIno(CameraInfo("0", "1", null))
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
-        }
-
-    @Test
-    fun faceAuthIsNotRequestedWhenAuthIsRunningWhileCameraInfoIsNull() =
-        testScope.runTest {
-            facePropertyRepository.setCameraIno(null)
-            underTest.start()
-
-            facePropertyRepository.setCameraIno(null)
-
-            runCurrent()
-            assertThat(faceAuthRepository.runningAuthRequest.value).isNull()
-        }
-
-    @Test
-    fun lockedOut_providesSameValueFromRepository() =
-        testScope.runTest {
-            assertThat(underTest.isLockedOut).isSameInstanceAs(faceAuthRepository.isLockedOut)
-        }
-
-    @Test
-    fun authenticated_providesSameValueFromRepository() =
-        testScope.runTest {
-            assertThat(underTest.isAuthenticated)
-                .isSameInstanceAs(faceAuthRepository.isAuthenticated)
-        }
-
-    companion object {
-        private const val primaryUserId = 1
-        private val primaryUser = UserInfo(primaryUserId, "test user", UserInfo.FLAG_PRIMARY)
-
-        private val secondaryUser = UserInfo(2, "secondary user", 0)
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt
deleted file mode 100644
index a09d345..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt
+++ /dev/null
@@ -1,729 +0,0 @@
-/*
- * Copyright (C) 2023 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.systemui.haptics.slider
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
-import kotlinx.coroutines.test.advanceTimeBy
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.Mockito.anyFloat
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyNoMoreInteractions
-import org.mockito.Mockito.verifyZeroInteractions
-import org.mockito.MockitoAnnotations
-
-@SmallTest
-@OptIn(ExperimentalCoroutinesApi::class)
-@RunWith(AndroidJUnit4::class)
-class SliderStateTrackerTest : SysuiTestCase() {
-
-    @Mock private lateinit var sliderStateListener: SliderStateListener
-    private val sliderEventProducer = FakeSliderEventProducer()
-    private lateinit var mSliderStateTracker: SliderStateTracker
-
-    @Before
-    fun setup() {
-        MockitoAnnotations.initMocks(this)
-    }
-
-    @Test
-    fun initializeSliderTracker_startsTracking() = runTest {
-        // GIVEN Initialized tracker
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-        // THEN the tracker job is active
-        assertThat(mSliderStateTracker.isTracking).isTrue()
-    }
-
-    @Test
-    fun stopTracking_onAnyState_resetsToIdle() = runTest {
-        enumValues<SliderState>().forEach {
-            // GIVEN Initialized tracker
-            initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-            // GIVEN a state in the state machine
-            mSliderStateTracker.setState(it)
-
-            // WHEN the tracker stops tracking the state and listening to events
-            mSliderStateTracker.stopTracking()
-
-            // THEN The state is idle and the tracker is not active
-            assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-            assertThat(mSliderStateTracker.isTracking).isFalse()
-        }
-    }
-
-    // Tests on the IDLE state
-    @Test
-    fun initializeSliderTracker_isIdle() = runTest {
-        // GIVEN Initialized tracker
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-        // THEN The state is idle and the listener is not called to play haptics
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-        verifyZeroInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun startsTrackingTouch_onIdle_entersWaitState() = runTest {
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-        // GIVEN a start of tracking touch event
-        val progress = 0f
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
-
-        // THEN the tracker moves to the wait state and the timer job begins
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT)
-        verifyZeroInteractions(sliderStateListener)
-        assertThat(mSliderStateTracker.isWaiting).isTrue()
-    }
-
-    // Tests on the WAIT state
-
-    @OptIn(ExperimentalCoroutinesApi::class)
-    @Test
-    fun waitCompletes_onWait_movesToHandleAcquired() = runTest {
-        val config = SeekableSliderTrackerConfig()
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-        // GIVEN a start of tracking touch event that moves the tracker to WAIT
-        val progress = 0f
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
-
-        // WHEN the wait time completes plus a small buffer time
-        advanceTimeBy(config.waitTimeMillis + 10L)
-
-        // THEN the tracker moves to the DRAG_HANDLE_ACQUIRED_BY_TOUCH state
-        assertThat(mSliderStateTracker.currentState)
-            .isEqualTo(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
-        assertThat(mSliderStateTracker.isWaiting).isFalse()
-        verify(sliderStateListener).onHandleAcquiredByTouch()
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun impreciseTouch_onWait_movesToHandleAcquired() = runTest {
-        val config = SeekableSliderTrackerConfig()
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-        // GIVEN a start of tracking touch event that moves the tracker to WAIT at the middle of the
-        // slider
-        var progress = 0.5f
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
-
-        // GIVEN a progress event due to an imprecise touch with a progress below threshold
-        progress += (config.jumpThreshold - 0.01f)
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
-        )
-
-        // THEN the tracker moves to the DRAG_HANDLE_ACQUIRED_BY_TOUCH state without the timer job
-        // being complete
-        assertThat(mSliderStateTracker.currentState)
-            .isEqualTo(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
-        assertThat(mSliderStateTracker.isWaiting).isFalse()
-        verify(sliderStateListener).onHandleAcquiredByTouch()
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun trackJump_onWait_movesToJumpTrackLocationSelected() = runTest {
-        val config = SeekableSliderTrackerConfig()
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-        // GIVEN a start of tracking touch event that moves the tracker to WAIT at the middle of the
-        // slider
-        var progress = 0.5f
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
-
-        // GIVEN a progress event due to a touch on the slider track beyond threshold
-        progress += (config.jumpThreshold + 0.01f)
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
-        )
-
-        // THEN the tracker moves to the jump-track location selected state
-        assertThat(mSliderStateTracker.currentState)
-            .isEqualTo(SliderState.JUMP_TRACK_LOCATION_SELECTED)
-        assertThat(mSliderStateTracker.isWaiting).isFalse()
-        verify(sliderStateListener).onProgressJump(anyFloat())
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun upperBookendSelection_onWait_movesToBookendSelected() = runTest {
-        val config = SeekableSliderTrackerConfig()
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-        // GIVEN a start of tracking touch event that moves the tracker to WAIT at the middle of the
-        // slider
-        var progress = 0.5f
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
-
-        // GIVEN a progress event due to a touch on the slider upper bookend zone.
-        progress = (config.upperBookendThreshold + 0.01f)
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
-        )
-
-        // THEN the tracker moves to the jump-track location selected state
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.JUMP_BOOKEND_SELECTED)
-        assertThat(mSliderStateTracker.isWaiting).isFalse()
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun lowerBookendSelection_onWait_movesToBookendSelected() = runTest {
-        val config = SeekableSliderTrackerConfig()
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-        // GIVEN a start of tracking touch event that moves the tracker to WAIT at the middle of the
-        // slider
-        var progress = 0.5f
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
-
-        // GIVEN a progress event due to a touch on the slider lower bookend zone
-        progress = (config.lowerBookendThreshold - 0.01f)
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
-        )
-
-        // THEN the tracker moves to the JUMP_TRACK_LOCATION_SELECTED state
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.JUMP_BOOKEND_SELECTED)
-        assertThat(mSliderStateTracker.isWaiting).isFalse()
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun stopTracking_onWait_whenWaitingJobIsActive_resetsToIdle() = runTest {
-        val config = SeekableSliderTrackerConfig()
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-        // GIVEN a start of tracking touch event that moves the tracker to WAIT at the middle of the
-        // slider
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, 0.5f))
-        assertThat(mSliderStateTracker.isWaiting).isTrue()
-
-        // GIVEN that the tracker stops tracking the state and listening to events
-        mSliderStateTracker.stopTracking()
-
-        // THEN the tracker moves to the IDLE state without the timer job being complete
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-        assertThat(mSliderStateTracker.isWaiting).isFalse()
-        assertThat(mSliderStateTracker.isTracking).isFalse()
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    // Tests on the JUMP_TRACK_LOCATION_SELECTED state
-
-    @Test
-    fun progressChangeByUser_onJumpTrackLocationSelected_movesToDragHandleDragging() = runTest {
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-        // GIVEN a JUMP_TRACK_LOCATION_SELECTED state
-        mSliderStateTracker.setState(SliderState.JUMP_TRACK_LOCATION_SELECTED)
-
-        // GIVEN a progress event due to dragging the handle
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, 0.5f))
-
-        // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
-        verify(sliderStateListener).onProgress(anyFloat())
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun touchRelease_onJumpTrackLocationSelected_movesToIdle() = runTest {
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-        // GIVEN a JUMP_TRACK_LOCATION_SELECTED state
-        mSliderStateTracker.setState(SliderState.JUMP_TRACK_LOCATION_SELECTED)
-
-        // GIVEN that the slider stopped tracking touch
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
-
-        // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
-        verify(sliderStateListener).onHandleReleasedFromTouch()
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun progressChangeByUser_onJumpBookendSelected_movesToDragHandleDragging() = runTest {
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-        // GIVEN a JUMP_BOOKEND_SELECTED state
-        mSliderStateTracker.setState(SliderState.JUMP_BOOKEND_SELECTED)
-
-        // GIVEN that the slider stopped tracking touch
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, 0.5f))
-
-        // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
-        verify(sliderStateListener).onProgress(anyFloat())
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun touchRelease_onJumpBookendSelected_movesToIdle() = runTest {
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-        // GIVEN a JUMP_BOOKEND_SELECTED state
-        mSliderStateTracker.setState(SliderState.JUMP_BOOKEND_SELECTED)
-
-        // GIVEN that the slider stopped tracking touch
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
-
-        // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
-        verify(sliderStateListener).onHandleReleasedFromTouch()
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    // Tests on the DRAG_HANDLE_ACQUIRED state
-
-    @Test
-    fun progressChangeByUser_onHandleAcquired_movesToDragHandleDragging() = runTest {
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-        // GIVEN a DRAG_HANDLE_ACQUIRED_BY_TOUCH state
-        mSliderStateTracker.setState(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
-
-        // GIVEN a progress change by the user
-        val progress = 0.5f
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
-        )
-
-        // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state
-        verify(sliderStateListener).onProgress(progress)
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun touchRelease_onHandleAcquired_movesToIdle() = runTest {
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-        // GIVEN a DRAG_HANDLE_ACQUIRED_BY_TOUCH state
-        mSliderStateTracker.setState(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
-
-        // GIVEN that the handle stops tracking touch
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
-
-        // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
-        verify(sliderStateListener).onHandleReleasedFromTouch()
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    // Tests on DRAG_HANDLE_DRAGGING
-
-    @Test
-    fun progressChangeByUser_onHandleDragging_progressOutsideOfBookends_doesNotChangeState() =
-        runTest {
-            initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-            // GIVEN a DRAG_HANDLE_DRAGGING state
-            mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
-
-            // GIVEN a progress change by the user outside of bookend bounds
-            val progress = 0.5f
-            sliderEventProducer.sendEvent(
-                SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
-            )
-
-            // THEN the tracker does not change state and executes the onProgress call
-            assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
-            verify(sliderStateListener).onProgress(progress)
-            verifyNoMoreInteractions(sliderStateListener)
-        }
-
-    @Test
-    fun progressChangeByUser_onHandleDragging_reachesLowerBookend_movesToHandleReachedBookend() =
-        runTest {
-            val config = SeekableSliderTrackerConfig()
-            initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-            // GIVEN a DRAG_HANDLE_DRAGGING state
-            mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
-
-            // GIVEN a progress change by the user reaching the lower bookend
-            val progress = config.lowerBookendThreshold - 0.01f
-            sliderEventProducer.sendEvent(
-                SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
-            )
-
-            // THEN the tracker moves to the DRAG_HANDLE_REACHED_BOOKEND state and executes the
-            // corresponding callback
-            assertThat(mSliderStateTracker.currentState)
-                .isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
-            verify(sliderStateListener).onLowerBookend()
-            verifyNoMoreInteractions(sliderStateListener)
-        }
-
-    @Test
-    fun progressChangeByUser_onHandleDragging_reachesUpperBookend_movesToHandleReachedBookend() =
-        runTest {
-            val config = SeekableSliderTrackerConfig()
-            initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-            // GIVEN a DRAG_HANDLE_DRAGGING state
-            mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
-
-            // GIVEN a progress change by the user reaching the upper bookend
-            val progress = config.upperBookendThreshold + 0.01f
-            sliderEventProducer.sendEvent(
-                SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
-            )
-
-            // THEN the tracker moves to the DRAG_HANDLE_REACHED_BOOKEND state and executes the
-            // corresponding callback
-            assertThat(mSliderStateTracker.currentState)
-                .isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
-            verify(sliderStateListener).onUpperBookend()
-            verifyNoMoreInteractions(sliderStateListener)
-        }
-
-    @Test
-    fun touchRelease_onHandleDragging_movesToIdle() = runTest {
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-        // GIVEN a DRAG_HANDLE_DRAGGING state
-        mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
-
-        // GIVEN that the slider stops tracking touch
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
-
-        // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
-        verify(sliderStateListener).onHandleReleasedFromTouch()
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    // Tests on the DRAG_HANDLE_REACHED_BOOKEND state
-
-    @Test
-    fun progressChangeByUser_outsideOfBookendRange_onLowerBookend_movesToDragHandleDragging() =
-        runTest {
-            val config = SeekableSliderTrackerConfig()
-            initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-            // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
-            mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
-
-            // GIVEN a progress event that falls outside of the lower bookend range
-            val progress = config.lowerBookendThreshold + 0.01f
-            sliderEventProducer.sendEvent(
-                SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
-            )
-
-            // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state and executes accordingly
-            verify(sliderStateListener).onProgress(progress)
-            assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
-            verifyNoMoreInteractions(sliderStateListener)
-        }
-
-    @Test
-    fun progressChangeByUser_insideOfBookendRange_onLowerBookend_doesNotChangeState() = runTest {
-        val config = SeekableSliderTrackerConfig()
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-        // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
-        mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
-
-        // GIVEN a progress event that falls inside of the lower bookend range
-        val progress = config.lowerBookendThreshold - 0.01f
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
-        )
-
-        // THEN the tracker stays in the current state and executes accordingly
-        verify(sliderStateListener).onLowerBookend()
-        assertThat(mSliderStateTracker.currentState)
-            .isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun progressChangeByUser_outsideOfBookendRange_onUpperBookend_movesToDragHandleDragging() =
-        runTest {
-            val config = SeekableSliderTrackerConfig()
-            initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-            // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
-            mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
-
-            // GIVEN a progress event that falls outside of the upper bookend range
-            val progress = config.upperBookendThreshold - 0.01f
-            sliderEventProducer.sendEvent(
-                SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
-            )
-
-            // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state and executes accordingly
-            verify(sliderStateListener).onProgress(progress)
-            assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
-            verifyNoMoreInteractions(sliderStateListener)
-        }
-
-    @Test
-    fun progressChangeByUser_insideOfBookendRange_onUpperBookend_doesNotChangeState() = runTest {
-        val config = SeekableSliderTrackerConfig()
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-        // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
-        mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
-
-        // GIVEN a progress event that falls inside of the upper bookend range
-        val progress = config.upperBookendThreshold + 0.01f
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress)
-        )
-
-        // THEN the tracker stays in the current state and executes accordingly
-        verify(sliderStateListener).onUpperBookend()
-        assertThat(mSliderStateTracker.currentState)
-            .isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun touchRelease_onHandleReachedBookend_movesToIdle() = runTest {
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-        // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
-        mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
-
-        // GIVEN that the handle stops tracking touch
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
-
-        // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
-        verify(sliderStateListener).onHandleReleasedFromTouch()
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-        verifyNoMoreInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun onStartedTrackingProgram_atTheMiddle_onIdle_movesToArrowHandleMovedOnce() = runTest {
-        // GIVEN an initialized tracker in the IDLE state
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-
-        // GIVEN a progress due to an external source that lands at the middle of the slider
-        val progress = 0.5f
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress)
-        )
-
-        // THEN the state moves to ARROW_HANDLE_MOVED_ONCE and the listener is called to play
-        // haptics
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.ARROW_HANDLE_MOVED_ONCE)
-        verify(sliderStateListener).onSelectAndArrow(progress)
-    }
-
-    @Test
-    fun onStartedTrackingProgram_atUpperBookend_onIdle_movesToIdle() = runTest {
-        // GIVEN an initialized tracker in the IDLE state
-        val config = SeekableSliderTrackerConfig()
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-        // GIVEN a progress due to an external source that lands at the upper bookend
-        val progress = config.upperBookendThreshold + 0.01f
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress)
-        )
-
-        // THEN the tracker executes upper bookend haptics before moving back to IDLE
-        verify(sliderStateListener).onUpperBookend()
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-    }
-
-    @Test
-    fun onStartedTrackingProgram_atLowerBookend_onIdle_movesToIdle() = runTest {
-        // GIVEN an initialized tracker in the IDLE state
-        val config = SeekableSliderTrackerConfig()
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-
-        // WHEN a progress is recorded due to an external source that lands at the lower bookend
-        val progress = config.lowerBookendThreshold - 0.01f
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress)
-        )
-
-        // THEN the tracker executes lower bookend haptics before moving to IDLE
-        verify(sliderStateListener).onLowerBookend()
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-    }
-
-    @Test
-    fun onArrowUp_onArrowMovedOnce_movesToIdle() = runTest {
-        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVED_ONCE state
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE)
-
-        // WHEN the external stimulus is released
-        val progress = 0.5f
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.STOPPED_TRACKING_PROGRAM, progress)
-        )
-
-        // THEN the tracker moves back to IDLE and there are no haptics
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-        verifyZeroInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun onStartTrackingTouch_onArrowMovedOnce_movesToWait() = runTest {
-        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVED_ONCE state
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE)
-
-        // WHEN the slider starts tracking touch
-        val progress = 0.5f
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
-
-        // THEN the tracker moves back to WAIT and starts the waiting job. Also, there are no
-        // haptics
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT)
-        assertThat(mSliderStateTracker.isWaiting).isTrue()
-        verifyZeroInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun onProgressChangeByProgram_onArrowMovedOnce_movesToArrowMovesContinuously() = runTest {
-        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVED_ONCE state
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE)
-
-        // WHEN the slider gets an external progress change
-        val progress = 0.5f
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress)
-        )
-
-        // THEN the tracker moves to ARROW_HANDLE_MOVES_CONTINUOUSLY and calls the appropriate
-        // haptics
-        assertThat(mSliderStateTracker.currentState)
-            .isEqualTo(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
-        verify(sliderStateListener).onProgress(progress)
-    }
-
-    @Test
-    fun onArrowUp_onArrowMovesContinuously_movesToIdle() = runTest {
-        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
-
-        // WHEN the external stimulus is released
-        val progress = 0.5f
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.STOPPED_TRACKING_PROGRAM, progress)
-        )
-
-        // THEN the tracker moves to IDLE and no haptics are played
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-        verifyZeroInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun onStartTrackingTouch_onArrowMovesContinuously_movesToWait() = runTest {
-        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
-
-        // WHEN the slider starts tracking touch
-        val progress = 0.5f
-        sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
-
-        // THEN the tracker moves to WAIT and the wait job starts.
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT)
-        assertThat(mSliderStateTracker.isWaiting).isTrue()
-        verifyZeroInteractions(sliderStateListener)
-    }
-
-    @Test
-    fun onProgressChangeByProgram_onArrowMovesContinuously_preservesState() = runTest {
-        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
-        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
-
-        // WHEN the slider changes progress programmatically at the middle
-        val progress = 0.5f
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress)
-        )
-
-        // THEN the tracker stays in the same state and haptics are delivered appropriately
-        assertThat(mSliderStateTracker.currentState)
-            .isEqualTo(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
-        verify(sliderStateListener).onProgress(progress)
-    }
-
-    @Test
-    fun onProgramProgress_atLowerBookend_onArrowMovesContinuously_movesToIdle() = runTest {
-        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
-        val config = SeekableSliderTrackerConfig()
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
-
-        // WHEN the slider reaches the lower bookend programmatically
-        val progress = config.lowerBookendThreshold - 0.01f
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress)
-        )
-
-        // THEN the tracker executes lower bookend haptics before moving to IDLE
-        verify(sliderStateListener).onLowerBookend()
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-    }
-
-    @Test
-    fun onProgramProgress_atUpperBookend_onArrowMovesContinuously_movesToIdle() = runTest {
-        // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
-        val config = SeekableSliderTrackerConfig()
-        initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
-        mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
-
-        // WHEN the slider reaches the lower bookend programmatically
-        val progress = config.upperBookendThreshold + 0.01f
-        sliderEventProducer.sendEvent(
-            SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress)
-        )
-
-        // THEN the tracker executes upper bookend haptics before moving to IDLE
-        verify(sliderStateListener).onUpperBookend()
-        assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
-    }
-
-    @OptIn(ExperimentalCoroutinesApi::class)
-    private fun initTracker(
-        scope: CoroutineScope,
-        config: SeekableSliderTrackerConfig = SeekableSliderTrackerConfig(),
-    ) {
-        mSliderStateTracker =
-            SliderStateTracker(sliderStateListener, sliderEventProducer, scope, config)
-        mSliderStateTracker.startTracking()
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinatorTest.kt
deleted file mode 100644
index 9a721fa..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinatorTest.kt
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.keyboard.stickykeys.ui
-
-import android.app.Dialog
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.keyboard.data.repository.FakeStickyKeysRepository
-import com.android.systemui.keyboard.data.repository.keyboardRepository
-import com.android.systemui.keyboard.stickykeys.StickyKeysLogger
-import com.android.systemui.keyboard.stickykeys.shared.model.Locked
-import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey.SHIFT
-import com.android.systemui.keyboard.stickykeys.ui.viewmodel.StickyKeysIndicatorViewModel
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.whenever
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.runCurrent
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class StickyKeysIndicatorCoordinatorTest : SysuiTestCase() {
-
-    private lateinit var coordinator: StickyKeysIndicatorCoordinator
-    private val testScope = TestScope(StandardTestDispatcher())
-    private val stickyKeysRepository = FakeStickyKeysRepository()
-    private val dialog = mock<Dialog>()
-
-    @Before
-    fun setup() {
-        val dialogFactory = mock<StickyKeyDialogFactory>()
-        whenever(dialogFactory.create(any())).thenReturn(dialog)
-        val keyboardRepository = Kosmos().keyboardRepository
-        val viewModel =
-            StickyKeysIndicatorViewModel(
-                stickyKeysRepository,
-                keyboardRepository,
-                testScope.backgroundScope
-            )
-        coordinator =
-            StickyKeysIndicatorCoordinator(
-                testScope.backgroundScope,
-                dialogFactory,
-                viewModel,
-                mock<StickyKeysLogger>()
-            )
-        coordinator.startListening()
-        keyboardRepository.setIsAnyKeyboardConnected(true)
-    }
-
-    @Test
-    fun dialogIsShownWhenStickyKeysAreEmitted() {
-        testScope.run {
-            verifyZeroInteractions(dialog)
-
-            stickyKeysRepository.setStickyKeys(linkedMapOf(SHIFT to Locked(true)))
-            runCurrent()
-
-            verify(dialog).show()
-        }
-    }
-
-    @Test
-    fun dialogDisappearsWhenStickyKeysAreEmpty() {
-        testScope.run {
-            verifyZeroInteractions(dialog)
-
-            stickyKeysRepository.setStickyKeys(linkedMapOf(SHIFT to Locked(true)))
-            runCurrent()
-            stickyKeysRepository.setStickyKeys(linkedMapOf())
-            runCurrent()
-
-            verify(dialog).dismiss()
-        }
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyboard/stickykeys/ui/viewmodel/StickyKeysIndicatorViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyboard/stickykeys/ui/viewmodel/StickyKeysIndicatorViewModelTest.kt
deleted file mode 100644
index 3ccb989..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/keyboard/stickykeys/ui/viewmodel/StickyKeysIndicatorViewModelTest.kt
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.keyboard.stickykeys.ui.viewmodel
-
-import android.hardware.input.InputManager
-import android.hardware.input.StickyModifierState
-import android.provider.Settings.Secure.ACCESSIBILITY_STICKY_KEYS
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.keyboard.data.repository.FakeKeyboardRepository
-import com.android.systemui.keyboard.stickykeys.StickyKeysLogger
-import com.android.systemui.keyboard.stickykeys.data.repository.StickyKeysRepositoryImpl
-import com.android.systemui.keyboard.stickykeys.shared.model.Locked
-import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey
-import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey.ALT
-import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey.ALT_GR
-import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey.CTRL
-import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey.META
-import com.android.systemui.keyboard.stickykeys.shared.model.ModifierKey.SHIFT
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.kosmos.testDispatcher
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.testKosmos
-import com.android.systemui.user.data.repository.fakeUserRepository
-import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.settings.fakeSettings
-import com.android.systemui.util.settings.repository.UserAwareSecureSettingsRepositoryImpl
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentCaptor
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class StickyKeysIndicatorViewModelTest : SysuiTestCase() {
-
-    private val kosmos = testKosmos()
-    private val dispatcher = kosmos.testDispatcher
-    private val testScope = kosmos.testScope
-    private lateinit var viewModel: StickyKeysIndicatorViewModel
-    private val inputManager = mock<InputManager>()
-    private val keyboardRepository = FakeKeyboardRepository()
-    private val secureSettings = kosmos.fakeSettings
-    private val userRepository = Kosmos().fakeUserRepository
-    private val captor =
-        ArgumentCaptor.forClass(InputManager.StickyModifierStateListener::class.java)
-
-    @Before
-    fun setup() {
-        val settingsRepository =
-            UserAwareSecureSettingsRepositoryImpl(secureSettings, userRepository, dispatcher)
-        val stickyKeysRepository =
-            StickyKeysRepositoryImpl(
-                inputManager,
-                dispatcher,
-                settingsRepository,
-                mock<StickyKeysLogger>()
-            )
-        setStickyKeySetting(enabled = false)
-        viewModel =
-            StickyKeysIndicatorViewModel(
-                stickyKeysRepository = stickyKeysRepository,
-                keyboardRepository = keyboardRepository,
-                applicationScope = testScope.backgroundScope,
-            )
-    }
-
-    @Test
-    fun doesntListenToStickyKeysOnlyWhenKeyboardIsConnected() {
-        testScope.runTest {
-            collectLastValue(viewModel.indicatorContent)
-
-            keyboardRepository.setIsAnyKeyboardConnected(true)
-            runCurrent()
-
-            verifyZeroInteractions(inputManager)
-        }
-    }
-
-    @Test
-    fun startsListeningToStickyKeysOnlyWhenKeyboardIsConnectedAndSettingIsOn() {
-        testScope.runTest {
-            collectLastValue(viewModel.indicatorContent)
-            keyboardRepository.setIsAnyKeyboardConnected(true)
-
-            setStickyKeySetting(enabled = true)
-            runCurrent()
-
-            verify(inputManager)
-                .registerStickyModifierStateListener(
-                    any(),
-                    any(InputManager.StickyModifierStateListener::class.java)
-                )
-        }
-    }
-
-    private fun setStickyKeySetting(enabled: Boolean) {
-        val newValue = if (enabled) "1" else "0"
-        val defaultUser = userRepository.getSelectedUserInfo().id
-        secureSettings.putStringForUser(ACCESSIBILITY_STICKY_KEYS, newValue, defaultUser)
-    }
-
-    @Test
-    fun stopsListeningToStickyKeysWhenStickyKeySettingsIsTurnedOff() {
-        testScope.runTest {
-            collectLastValue(viewModel.indicatorContent)
-            setStickyKeysActive()
-            runCurrent()
-
-            setStickyKeySetting(enabled = false)
-            runCurrent()
-
-            verify(inputManager).unregisterStickyModifierStateListener(any())
-        }
-    }
-
-    @Test
-    fun stopsListeningToStickyKeysWhenKeyboardDisconnects() {
-        testScope.runTest {
-            collectLastValue(viewModel.indicatorContent)
-            setStickyKeysActive()
-            runCurrent()
-
-            keyboardRepository.setIsAnyKeyboardConnected(false)
-            runCurrent()
-
-            verify(inputManager).unregisterStickyModifierStateListener(any())
-        }
-    }
-
-    @Test
-    fun emitsStickyKeysListWhenStickyKeyIsPressed() {
-        testScope.runTest {
-            val stickyKeys by collectLastValue(viewModel.indicatorContent)
-            setStickyKeysActive()
-
-            setStickyKeys(mapOf(ALT to false))
-
-            assertThat(stickyKeys).isEqualTo(mapOf(ALT to Locked(false)))
-        }
-    }
-
-    @Test
-    fun emitsEmptyListWhenNoStickyKeysAreActive() {
-        testScope.runTest {
-            val stickyKeys by collectLastValue(viewModel.indicatorContent)
-            setStickyKeysActive()
-
-            setStickyKeys(emptyMap())
-
-            assertThat(stickyKeys).isEqualTo(emptyMap<ModifierKey, Locked>())
-        }
-    }
-
-    @Test
-    fun passesAllStickyKeysToDialog() {
-        testScope.runTest {
-            val stickyKeys by collectLastValue(viewModel.indicatorContent)
-            setStickyKeysActive()
-
-            setStickyKeys(mapOf(ALT to false, META to false, SHIFT to false))
-
-            assertThat(stickyKeys)
-                .isEqualTo(
-                    mapOf(
-                        ALT to Locked(false),
-                        META to Locked(false),
-                        SHIFT to Locked(false),
-                    )
-                )
-        }
-    }
-
-    @Test
-    fun showsOnlyLockedStateIfKeyIsStickyAndLocked() {
-        testScope.runTest {
-            val stickyKeys by collectLastValue(viewModel.indicatorContent)
-            setStickyKeysActive()
-
-            setStickyKeys(mapOf(ALT to false, ALT to true))
-
-            assertThat(stickyKeys).isEqualTo(mapOf(ALT to Locked(true)))
-        }
-    }
-
-    @Test
-    fun doesNotChangeOrderOfKeysIfTheyBecomeLocked() {
-        testScope.runTest {
-            val stickyKeys by collectLastValue(viewModel.indicatorContent)
-            setStickyKeysActive()
-
-            setStickyKeys(
-                mapOf(
-                    META to false,
-                    SHIFT to false, // shift is sticky but not locked
-                    CTRL to false
-                )
-            )
-            val previousShiftIndex = stickyKeys?.toList()?.indexOf(SHIFT to Locked(false))
-
-            setStickyKeys(
-                mapOf(
-                    SHIFT to false,
-                    SHIFT to true, // shift is now locked
-                    META to false,
-                    CTRL to false
-                )
-            )
-            assertThat(stickyKeys?.toList()?.indexOf(SHIFT to Locked(true)))
-                .isEqualTo(previousShiftIndex)
-        }
-    }
-
-    private fun setStickyKeysActive() {
-        keyboardRepository.setIsAnyKeyboardConnected(true)
-        setStickyKeySetting(enabled = true)
-    }
-
-    private fun TestScope.setStickyKeys(keys: Map<ModifierKey, Boolean>) {
-        runCurrent()
-        verify(inputManager).registerStickyModifierStateListener(any(), captor.capture())
-        captor.value.onStickyModifierStateChanged(TestStickyModifierState(keys))
-        runCurrent()
-    }
-
-    private class TestStickyModifierState(private val keys: Map<ModifierKey, Boolean>) :
-        StickyModifierState() {
-
-        private fun isOn(key: ModifierKey) = keys.any { it.key == key && !it.value }
-
-        private fun isLocked(key: ModifierKey) = keys.any { it.key == key && it.value }
-
-        override fun isAltGrModifierLocked() = isLocked(ALT_GR)
-
-        override fun isAltGrModifierOn() = isOn(ALT_GR)
-
-        override fun isAltModifierLocked() = isLocked(ALT)
-
-        override fun isAltModifierOn() = isOn(ALT)
-
-        override fun isCtrlModifierLocked() = isLocked(CTRL)
-
-        override fun isCtrlModifierOn() = isOn(CTRL)
-
-        override fun isMetaModifierLocked() = isLocked(META)
-
-        override fun isMetaModifierOn() = isOn(META)
-
-        override fun isShiftModifierLocked() = isLocked(SHIFT)
-
-        override fun isShiftModifierOn() = isOn(SHIFT)
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
index b0810a9..6608542 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
@@ -100,6 +100,7 @@
 import com.android.systemui.flags.FakeFeatureFlags;
 import com.android.systemui.flags.SystemPropertiesHelper;
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionBootInteractor;
 import com.android.systemui.kosmos.KosmosJavaAdapter;
 import com.android.systemui.log.SessionTracker;
 import com.android.systemui.navigationbar.NavigationModeController;
@@ -199,6 +200,7 @@
     private @Mock ShadeWindowLogger mShadeWindowLogger;
     private @Mock SelectedUserInteractor mSelectedUserInteractor;
     private @Mock KeyguardInteractor mKeyguardInteractor;
+    private @Mock KeyguardTransitionBootInteractor mKeyguardTransitionBootInteractor;
     private @Captor ArgumentCaptor<KeyguardStateController.Callback>
             mKeyguardStateControllerCallback;
     private @Captor ArgumentCaptor<KeyguardUpdateMonitorCallback>
@@ -1294,6 +1296,7 @@
                 () -> mock(WindowManagerLockscreenVisibilityManager.class),
                 mSelectedUserInteractor,
                 mKeyguardInteractor,
+                mKeyguardTransitionBootInteractor,
                 mock(WindowManagerOcclusionManager.class));
         mViewMediator.start();
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt
deleted file mode 100644
index 23fd997..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt
+++ /dev/null
@@ -1,153 +0,0 @@
-package com.android.systemui.keyguard
-
-import android.content.ComponentCallbacks2
-import android.platform.test.flag.junit.SetFlagsRule
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.flags.DisableSceneContainer
-import com.android.systemui.flags.EnableSceneContainer
-import com.android.systemui.flags.fakeFeatureFlagsClassic
-import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
-import com.android.systemui.keyguard.shared.model.KeyguardState
-import com.android.systemui.kosmos.testDispatcher
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
-import com.android.systemui.power.domain.interactor.powerInteractor
-import com.android.systemui.scene.data.repository.Idle
-import com.android.systemui.scene.data.repository.setSceneTransition
-import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.testKosmos
-import com.android.systemui.utils.GlobalWindowManager
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.Mockito.times
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyNoMoreInteractions
-import org.mockito.Mockito.verifyZeroInteractions
-import org.mockito.MockitoAnnotations
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class ResourceTrimmerTest : SysuiTestCase() {
-    val kosmos = testKosmos()
-
-    private val testScope = kosmos.testScope
-    private val keyguardRepository = kosmos.fakeKeyguardRepository
-    private val featureFlags = kosmos.fakeFeatureFlagsClassic
-    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
-    private val powerInteractor = kosmos.powerInteractor
-
-    @Mock private lateinit var globalWindowManager: GlobalWindowManager
-    private lateinit var resourceTrimmer: ResourceTrimmer
-
-    @Rule @JvmField public val setFlagsRule = SetFlagsRule()
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-        keyguardRepository.setDozeAmount(0f)
-        keyguardRepository.setKeyguardGoingAway(false)
-        resourceTrimmer =
-            ResourceTrimmer(
-                keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor,
-                globalWindowManager = globalWindowManager,
-                applicationScope = testScope.backgroundScope,
-                bgDispatcher = kosmos.testDispatcher,
-            )
-        resourceTrimmer.start()
-    }
-
-    @Test
-    fun dozeAodDisabled_sleep_doesntTrimMemory() =
-        testScope.runTest {
-            powerInteractor.setAsleepForTest()
-            testScope.runCurrent()
-            verifyZeroInteractions(globalWindowManager)
-        }
-
-    @Test
-    fun dozeEnabled_sleepWithFullDozeAmount_doesntTrimMemory() =
-        testScope.runTest {
-            keyguardRepository.setDreaming(true)
-            keyguardRepository.setDozeAmount(1f)
-            powerInteractor.setAsleepForTest()
-            testScope.runCurrent()
-            verifyZeroInteractions(globalWindowManager)
-        }
-
-    @Test
-    fun dozeEnabled_sleepWithoutFullDozeAmount_doesntTrimMemory() =
-        testScope.runTest {
-            keyguardRepository.setDreaming(true)
-            keyguardRepository.setDozeAmount(0f)
-            powerInteractor.setAsleepForTest()
-            testScope.runCurrent()
-            verifyZeroInteractions(globalWindowManager)
-        }
-
-    @Test
-    fun aodEnabled_deviceWakesHalfWayThrough_doesNotTrimMemory() {
-        testScope.runTest {
-            keyguardRepository.setDreaming(true)
-            keyguardRepository.setDozeAmount(0f)
-            powerInteractor.setAsleepForTest()
-
-            testScope.runCurrent()
-            verifyZeroInteractions(globalWindowManager)
-
-            generateSequence(0f) { it + 0.1f }
-                .takeWhile { it < 0.8f }
-                .forEach {
-                    keyguardRepository.setDozeAmount(it)
-                    testScope.runCurrent()
-                }
-            verifyZeroInteractions(globalWindowManager)
-
-            generateSequence(0.8f) { it - 0.1f }
-                .takeWhile { it >= 0f }
-                .forEach {
-                    keyguardRepository.setDozeAmount(it)
-                    testScope.runCurrent()
-                }
-
-            keyguardRepository.setDozeAmount(0f)
-            testScope.runCurrent()
-            verifyZeroInteractions(globalWindowManager)
-        }
-    }
-
-    @Test
-    @DisableSceneContainer
-    fun keyguardTransitionsToGone_trimsFontCache() =
-        testScope.runTest {
-            keyguardTransitionRepository.sendTransitionSteps(
-                from = KeyguardState.LOCKSCREEN,
-                to = KeyguardState.GONE,
-                testScope
-            )
-            verify(globalWindowManager, times(1))
-                .trimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN)
-            verifyNoMoreInteractions(globalWindowManager)
-        }
-
-    @Test
-    @EnableSceneContainer
-    fun keyguardTransitionsToGone_trimsFontCache_scene_container() =
-        testScope.runTest {
-            kosmos.setSceneTransition(Idle(Scenes.Gone))
-
-            verify(globalWindowManager, times(1))
-                .trimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN)
-            verifyNoMoreInteractions(globalWindowManager)
-        }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartableTest.kt
deleted file mode 100644
index 5fa194d..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartableTest.kt
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (C) 2023 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.systemui.keyguard.data.quickaffordance
-
-import android.content.Context
-import android.media.AudioManager
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.Observer
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepository
-import com.android.systemui.settings.UserFileManager
-import com.android.systemui.settings.UserTracker
-import com.android.systemui.util.RingerModeTracker
-import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.argumentCaptor
-import com.android.systemui.util.mockito.eq
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.whenever
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.cancelChildren
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestDispatcher
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Assert.assertEquals
-
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
-import org.mockito.MockitoAnnotations
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class MuteQuickAffordanceCoreStartableTest : SysuiTestCase() {
-
-    @Mock
-    private lateinit var userTracker: UserTracker
-    @Mock
-    private lateinit var ringerModeTracker: RingerModeTracker
-    @Mock
-    private lateinit var userFileManager: UserFileManager
-    @Mock
-    private lateinit var keyguardQuickAffordanceRepository: KeyguardQuickAffordanceRepository
-
-    private lateinit var testDispatcher: TestDispatcher
-    private lateinit var testScope: TestScope
-
-    private lateinit var underTest: MuteQuickAffordanceCoreStartable
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-
-        val config: KeyguardQuickAffordanceConfig = mock()
-        whenever(config.key).thenReturn(BuiltInKeyguardQuickAffordanceKeys.MUTE)
-
-        val emission = MutableStateFlow(mapOf("testQuickAffordanceKey" to listOf(config)))
-        whenever(keyguardQuickAffordanceRepository.selections).thenReturn(emission)
-
-        testDispatcher = StandardTestDispatcher()
-        testScope = TestScope(testDispatcher)
-
-        underTest = MuteQuickAffordanceCoreStartable(
-            userTracker,
-            ringerModeTracker,
-            userFileManager,
-            keyguardQuickAffordanceRepository,
-            testScope.backgroundScope,
-            testDispatcher,
-        )
-    }
-
-    @Test
-    fun callToKeyguardQuickAffordanceRepository() = testScope.runTest {
-        //given
-        val ringerModeInternal = mock<MutableLiveData<Int>>()
-        whenever(ringerModeTracker.ringerModeInternal).thenReturn(ringerModeInternal)
-
-        //when
-        underTest.start()
-        runCurrent()
-
-        //then
-        verify(keyguardQuickAffordanceRepository).selections
-        coroutineContext.cancelChildren()
-    }
-
-    @Test
-    fun ringerModeIsChangedToSILENT_doNotSaveToSharedPreferences() = testScope.runTest {
-        //given
-        val ringerModeInternal = mock<MutableLiveData<Int>>()
-        val observerCaptor = argumentCaptor<Observer<Int>>()
-        whenever(ringerModeTracker.ringerModeInternal).thenReturn(ringerModeInternal)
-
-        //when
-        underTest.start()
-        runCurrent()
-        verify(ringerModeInternal).observeForever(observerCaptor.capture())
-        observerCaptor.value.onChanged(AudioManager.RINGER_MODE_SILENT)
-
-        //then
-        verifyZeroInteractions(userFileManager)
-        coroutineContext.cancelChildren()
-    }
-
-    @Test
-    fun ringerModeInternalChangesToSomethingNotSILENT_isSetInSharedpreferences() = testScope.runTest {
-        //given
-        val newRingerMode = 99
-        val observerCaptor = argumentCaptor<Observer<Int>>()
-        val ringerModeInternal = mock<MutableLiveData<Int>>()
-        val sharedPrefs = context.getSharedPreferences("quick_affordance_mute_ringer_mode_cache_test", Context.MODE_PRIVATE)
-        whenever(ringerModeTracker.ringerModeInternal).thenReturn(ringerModeInternal)
-        whenever(
-            userFileManager.getSharedPreferences(eq("quick_affordance_mute_ringer_mode_cache"), any(), any())
-        ).thenReturn(sharedPrefs)
-
-        //when
-        underTest.start()
-        runCurrent()
-        verify(ringerModeInternal).observeForever(observerCaptor.capture())
-        observerCaptor.value.onChanged(newRingerMode)
-        runCurrent()
-        val result = sharedPrefs.getInt("key_last_non_silent_ringer_mode", -1)
-
-        //then
-        assertEquals(newRingerMode, result)
-        coroutineContext.cancelChildren()
-    }
-
-    @Test
-    fun MUTEisInSelections_observeRingerModeInternal() = testScope.runTest {
-        //given
-        val ringerModeInternal = mock<MutableLiveData<Int>>()
-        whenever(ringerModeTracker.ringerModeInternal).thenReturn(ringerModeInternal)
-
-        //when
-        underTest.start()
-        runCurrent()
-
-        //then
-        verify(ringerModeInternal).observeForever(any())
-        coroutineContext.cancelChildren()
-    }
-
-    @Test
-    fun MUTEisInSelections2x_observeRingerModeInternal() = testScope.runTest {
-        //given
-        val config: KeyguardQuickAffordanceConfig = mock()
-        whenever(config.key).thenReturn(BuiltInKeyguardQuickAffordanceKeys.MUTE)
-        val emission = MutableStateFlow(mapOf("testKey" to listOf(config), "testkey2" to listOf(config)))
-        whenever(keyguardQuickAffordanceRepository.selections).thenReturn(emission)
-        val ringerModeInternal = mock<MutableLiveData<Int>>()
-        whenever(ringerModeTracker.ringerModeInternal).thenReturn(ringerModeInternal)
-
-        //when
-        underTest.start()
-        runCurrent()
-
-        //then
-        verify(ringerModeInternal).observeForever(any())
-        coroutineContext.cancelChildren()
-    }
-
-    @Test
-    fun MUTEisNotInSelections_stopObservingRingerModeInternal() = testScope.runTest {
-        //given
-        val config: KeyguardQuickAffordanceConfig = mock()
-        whenever(config.key).thenReturn("notmutequickaffordance")
-        val emission = MutableStateFlow(mapOf("testKey" to listOf(config)))
-        whenever(keyguardQuickAffordanceRepository.selections).thenReturn(emission)
-        val ringerModeInternal = mock<MutableLiveData<Int>>()
-        whenever(ringerModeTracker.ringerModeInternal).thenReturn(ringerModeInternal)
-
-        //when
-        underTest.start()
-        runCurrent()
-
-        //then
-        verify(ringerModeInternal).removeObserver(any())
-        coroutineContext.cancelChildren()
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt
deleted file mode 100644
index e3bdcd7..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt
+++ /dev/null
@@ -1,409 +0,0 @@
-/*
- * Copyright (C) 2022 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.systemui.keyguard.domain.interactor
-
-import android.app.admin.DevicePolicyManager
-import android.content.Intent
-import android.os.UserHandle
-import androidx.test.filters.FlakyTest
-import androidx.test.filters.SmallTest
-import com.android.internal.widget.LockPatternUtils
-import com.android.keyguard.logging.KeyguardQuickAffordancesLogger
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.animation.ActivityTransitionAnimator
-import com.android.systemui.animation.DialogTransitionAnimator
-import com.android.systemui.animation.Expandable
-import com.android.systemui.common.shared.model.ContentDescription
-import com.android.systemui.common.shared.model.Icon
-import com.android.systemui.dock.DockManagerFake
-import com.android.systemui.flags.DisableSceneContainer
-import com.android.systemui.flags.FakeFeatureFlags
-import com.android.systemui.keyguard.data.quickaffordance.BuiltInKeyguardQuickAffordanceKeys
-import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceConfig
-import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceProviderClientFactory
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLegacySettingSyncer
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLocalUserSelectionManager
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceRemoteUserSelectionManager
-import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepository
-import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancePosition
-import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancesMetricsLogger
-import com.android.systemui.plugins.ActivityStarter
-import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.settings.FakeUserTracker
-import com.android.systemui.settings.UserFileManager
-import com.android.systemui.settings.UserTracker
-import com.android.systemui.shade.domain.interactor.shadeInteractor
-import com.android.systemui.statusbar.policy.KeyguardStateController
-import com.android.systemui.testKosmos
-import com.android.systemui.util.FakeSharedPreferences
-import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.whenever
-import com.android.systemui.util.settings.FakeSettings
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.ArgumentMatchers.anyString
-import org.mockito.ArgumentMatchers.eq
-import org.mockito.ArgumentMatchers.same
-import org.mockito.Mock
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
-import org.mockito.MockitoAnnotations
-import platform.test.runner.parameterized.Parameter
-import platform.test.runner.parameterized.ParameterizedAndroidJunit4
-import platform.test.runner.parameterized.Parameters
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@FlakyTest(
-    bugId = 292574995,
-    detail = "on certain architectures all permutations with startActivity=true is causing failures"
-)
-@SmallTest
-@RunWith(ParameterizedAndroidJunit4::class)
-@DisableSceneContainer
-class KeyguardQuickAffordanceInteractorParameterizedTest : SysuiTestCase() {
-
-    companion object {
-        private val INTENT = Intent("some.intent.action")
-        private val DRAWABLE =
-            mock<Icon> {
-                whenever(this.contentDescription)
-                    .thenReturn(
-                        ContentDescription.Resource(
-                            res = CONTENT_DESCRIPTION_RESOURCE_ID,
-                        )
-                    )
-            }
-        private const val CONTENT_DESCRIPTION_RESOURCE_ID = 1337
-
-        @Parameters(
-            name =
-                "needStrongAuthAfterBoot={0}, canShowWhileLocked={1}," +
-                    " keyguardIsUnlocked={2}, needsToUnlockFirst={3}, startActivity={4}"
-        )
-        @JvmStatic
-        fun data() =
-            listOf(
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ false,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ false,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ false,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ false,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ false,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ false,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ true,
-                ),
-            )
-
-        private val IMMEDIATE = Dispatchers.Main.immediate
-    }
-
-    @Mock private lateinit var lockPatternUtils: LockPatternUtils
-    @Mock private lateinit var keyguardStateController: KeyguardStateController
-    @Mock private lateinit var activityStarter: ActivityStarter
-    @Mock private lateinit var animationController: ActivityTransitionAnimator.Controller
-    @Mock private lateinit var expandable: Expandable
-    @Mock private lateinit var launchAnimator: DialogTransitionAnimator
-    @Mock private lateinit var devicePolicyManager: DevicePolicyManager
-    @Mock private lateinit var logger: KeyguardQuickAffordancesLogger
-    @Mock private lateinit var metricsLogger: KeyguardQuickAffordancesMetricsLogger
-
-    private lateinit var underTest: KeyguardQuickAffordanceInteractor
-    private lateinit var testScope: TestScope
-
-    @JvmField @Parameter(0) var needStrongAuthAfterBoot: Boolean = false
-    @JvmField @Parameter(1) var canShowWhileLocked: Boolean = false
-    @JvmField @Parameter(2) var keyguardIsUnlocked: Boolean = false
-    @JvmField @Parameter(3) var needsToUnlockFirst: Boolean = false
-    @JvmField @Parameter(4) var startActivity: Boolean = false
-    private lateinit var homeControls: FakeKeyguardQuickAffordanceConfig
-    private lateinit var dockManager: DockManagerFake
-    private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
-    private lateinit var userTracker: UserTracker
-
-    private val kosmos = testKosmos()
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-        whenever(expandable.activityTransitionController()).thenReturn(animationController)
-
-        userTracker = FakeUserTracker()
-        homeControls =
-            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS)
-        dockManager = DockManagerFake()
-        biometricSettingsRepository = FakeBiometricSettingsRepository()
-        val quickAccessWallet =
-            FakeKeyguardQuickAffordanceConfig(
-                BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
-            )
-        val qrCodeScanner =
-            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.QR_CODE_SCANNER)
-        val scope = CoroutineScope(IMMEDIATE)
-        val localUserSelectionManager =
-            KeyguardQuickAffordanceLocalUserSelectionManager(
-                context = context,
-                userFileManager =
-                    mock<UserFileManager>().apply {
-                        whenever(
-                                getSharedPreferences(
-                                    anyString(),
-                                    anyInt(),
-                                    anyInt(),
-                                )
-                            )
-                            .thenReturn(FakeSharedPreferences())
-                    },
-                userTracker = userTracker,
-                broadcastDispatcher = fakeBroadcastDispatcher,
-            )
-        val remoteUserSelectionManager =
-            KeyguardQuickAffordanceRemoteUserSelectionManager(
-                scope = scope,
-                userTracker = userTracker,
-                clientFactory = FakeKeyguardQuickAffordanceProviderClientFactory(userTracker),
-                userHandle = UserHandle.SYSTEM,
-            )
-        val quickAffordanceRepository =
-            KeyguardQuickAffordanceRepository(
-                appContext = context,
-                scope = scope,
-                localUserSelectionManager = localUserSelectionManager,
-                remoteUserSelectionManager = remoteUserSelectionManager,
-                userTracker = userTracker,
-                legacySettingSyncer =
-                    KeyguardQuickAffordanceLegacySettingSyncer(
-                        scope = scope,
-                        backgroundDispatcher = IMMEDIATE,
-                        secureSettings = FakeSettings(),
-                        selectionsManager = localUserSelectionManager,
-                    ),
-                configs = setOf(homeControls, quickAccessWallet, qrCodeScanner),
-                dumpManager = mock(),
-                userHandle = UserHandle.SYSTEM,
-            )
-        val featureFlags = FakeFeatureFlags()
-        val testDispatcher = StandardTestDispatcher()
-        testScope = TestScope(testDispatcher)
-        underTest =
-            KeyguardQuickAffordanceInteractor(
-                keyguardInteractor =
-                    KeyguardInteractorFactory.create(
-                            featureFlags = featureFlags,
-                        )
-                        .keyguardInteractor,
-                shadeInteractor = kosmos.shadeInteractor,
-                lockPatternUtils = lockPatternUtils,
-                keyguardStateController = keyguardStateController,
-                userTracker = userTracker,
-                activityStarter = activityStarter,
-                featureFlags = featureFlags,
-                repository = { quickAffordanceRepository },
-                launchAnimator = launchAnimator,
-                logger = logger,
-                metricsLogger = metricsLogger,
-                devicePolicyManager = devicePolicyManager,
-                dockManager = dockManager,
-                biometricSettingsRepository = biometricSettingsRepository,
-                backgroundDispatcher = testDispatcher,
-                appContext = mContext,
-                sceneInteractor = { kosmos.sceneInteractor },
-            )
-    }
-
-    @Test
-    fun onQuickAffordanceTriggered() =
-        testScope.runTest {
-            val key = BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS
-            setUpMocks(
-                needStrongAuthAfterBoot = needStrongAuthAfterBoot,
-                keyguardIsUnlocked = keyguardIsUnlocked,
-            )
-
-            homeControls.setState(
-                lockScreenState =
-                    KeyguardQuickAffordanceConfig.LockScreenState.Visible(
-                        icon = DRAWABLE,
-                    )
-            )
-            homeControls.onTriggeredResult =
-                if (startActivity) {
-                    KeyguardQuickAffordanceConfig.OnTriggeredResult.StartActivity(
-                        intent = INTENT,
-                        canShowWhileLocked = canShowWhileLocked,
-                    )
-                } else {
-                    KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled
-                }
-
-            underTest.onQuickAffordanceTriggered(
-                configKey = "${KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId()}::$key",
-                expandable = expandable,
-                slotId = "",
-            )
-
-            if (startActivity) {
-                if (needsToUnlockFirst) {
-                    verify(activityStarter)
-                        .postStartActivityDismissingKeyguard(
-                            any(),
-                            /* delay= */ eq(0),
-                            same(animationController),
-                        )
-                } else {
-                    verify(activityStarter)
-                        .startActivity(
-                            any(),
-                            /* dismissShade= */ eq(true),
-                            same(animationController),
-                            /* showOverLockscreenWhenLocked= */ eq(true),
-                        )
-                }
-            } else {
-                verifyZeroInteractions(activityStarter)
-            }
-        }
-
-    private fun setUpMocks(
-        needStrongAuthAfterBoot: Boolean = true,
-        keyguardIsUnlocked: Boolean = false,
-    ) {
-        whenever(lockPatternUtils.getStrongAuthForUser(any()))
-            .thenReturn(
-                if (needStrongAuthAfterBoot) {
-                    LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT
-                } else {
-                    LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED
-                }
-            )
-        whenever(keyguardStateController.isUnlocked).thenReturn(keyguardIsUnlocked)
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorSceneContainerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorSceneContainerTest.kt
deleted file mode 100644
index 591ce1a..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorSceneContainerTest.kt
+++ /dev/null
@@ -1,409 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.keyguard.domain.interactor
-
-import android.app.admin.DevicePolicyManager
-import android.content.Intent
-import android.os.UserHandle
-import androidx.test.filters.FlakyTest
-import androidx.test.filters.SmallTest
-import com.android.internal.widget.LockPatternUtils
-import com.android.keyguard.logging.KeyguardQuickAffordancesLogger
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.animation.ActivityTransitionAnimator
-import com.android.systemui.animation.DialogTransitionAnimator
-import com.android.systemui.animation.Expandable
-import com.android.systemui.common.shared.model.ContentDescription
-import com.android.systemui.common.shared.model.Icon
-import com.android.systemui.dock.DockManagerFake
-import com.android.systemui.flags.EnableSceneContainer
-import com.android.systemui.flags.FakeFeatureFlags
-import com.android.systemui.keyguard.data.quickaffordance.BuiltInKeyguardQuickAffordanceKeys
-import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceConfig
-import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceProviderClientFactory
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLegacySettingSyncer
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLocalUserSelectionManager
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceRemoteUserSelectionManager
-import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepository
-import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancePosition
-import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancesMetricsLogger
-import com.android.systemui.plugins.ActivityStarter
-import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.settings.FakeUserTracker
-import com.android.systemui.settings.UserFileManager
-import com.android.systemui.settings.UserTracker
-import com.android.systemui.shade.domain.interactor.shadeInteractor
-import com.android.systemui.statusbar.policy.KeyguardStateController
-import com.android.systemui.testKosmos
-import com.android.systemui.util.FakeSharedPreferences
-import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.whenever
-import com.android.systemui.util.settings.FakeSettings
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.ArgumentMatchers.anyString
-import org.mockito.ArgumentMatchers.eq
-import org.mockito.ArgumentMatchers.same
-import org.mockito.Mock
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
-import org.mockito.MockitoAnnotations
-import platform.test.runner.parameterized.Parameter
-import platform.test.runner.parameterized.ParameterizedAndroidJunit4
-import platform.test.runner.parameterized.Parameters
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@FlakyTest(
-    bugId = 292574995,
-    detail = "on certain architectures all permutations with startActivity=true is causing failures"
-)
-@SmallTest
-@RunWith(ParameterizedAndroidJunit4::class)
-@EnableSceneContainer
-class KeyguardQuickAffordanceInteractorSceneContainerTest : SysuiTestCase() {
-
-    companion object {
-        private val INTENT = Intent("some.intent.action")
-        private val DRAWABLE =
-            mock<Icon> {
-                whenever(this.contentDescription)
-                    .thenReturn(
-                        ContentDescription.Resource(
-                            res = CONTENT_DESCRIPTION_RESOURCE_ID,
-                        )
-                    )
-            }
-        private const val CONTENT_DESCRIPTION_RESOURCE_ID = 1337
-
-        @Parameters(
-            name =
-                "needStrongAuthAfterBoot={0}, canShowWhileLocked={1}," +
-                    " keyguardIsUnlocked={2}, needsToUnlockFirst={3}, startActivity={4}"
-        )
-        @JvmStatic
-        fun data() =
-            listOf(
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ false,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ false,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ false,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ false,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ false,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ false,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ false,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ false,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ false,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ false,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ true,
-                ),
-                arrayOf(
-                    /* needStrongAuthAfterBoot= */ true,
-                    /* canShowWhileLocked= */ true,
-                    /* keyguardIsUnlocked= */ true,
-                    /* needsToUnlockFirst= */ true,
-                    /* startActivity= */ true,
-                ),
-            )
-
-        private val IMMEDIATE = Dispatchers.Main.immediate
-    }
-
-    @Mock private lateinit var lockPatternUtils: LockPatternUtils
-    @Mock private lateinit var keyguardStateController: KeyguardStateController
-    @Mock private lateinit var activityStarter: ActivityStarter
-    @Mock private lateinit var animationController: ActivityTransitionAnimator.Controller
-    @Mock private lateinit var expandable: Expandable
-    @Mock private lateinit var launchAnimator: DialogTransitionAnimator
-    @Mock private lateinit var devicePolicyManager: DevicePolicyManager
-    @Mock private lateinit var logger: KeyguardQuickAffordancesLogger
-    @Mock private lateinit var metricsLogger: KeyguardQuickAffordancesMetricsLogger
-
-    private lateinit var underTest: KeyguardQuickAffordanceInteractor
-    private lateinit var testScope: TestScope
-
-    @JvmField @Parameter(0) var needStrongAuthAfterBoot: Boolean = false
-    @JvmField @Parameter(1) var canShowWhileLocked: Boolean = false
-    @JvmField @Parameter(2) var keyguardIsUnlocked: Boolean = false
-    @JvmField @Parameter(3) var needsToUnlockFirst: Boolean = false
-    @JvmField @Parameter(4) var startActivity: Boolean = false
-    private lateinit var homeControls: FakeKeyguardQuickAffordanceConfig
-    private lateinit var dockManager: DockManagerFake
-    private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
-    private lateinit var userTracker: UserTracker
-
-    private val kosmos = testKosmos()
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-        whenever(expandable.activityTransitionController()).thenReturn(animationController)
-
-        userTracker = FakeUserTracker()
-        homeControls =
-            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS)
-        dockManager = DockManagerFake()
-        biometricSettingsRepository = FakeBiometricSettingsRepository()
-        val quickAccessWallet =
-            FakeKeyguardQuickAffordanceConfig(
-                BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
-            )
-        val qrCodeScanner =
-            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.QR_CODE_SCANNER)
-        val scope = CoroutineScope(IMMEDIATE)
-        val localUserSelectionManager =
-            KeyguardQuickAffordanceLocalUserSelectionManager(
-                context = context,
-                userFileManager =
-                    mock<UserFileManager>().apply {
-                        whenever(
-                                getSharedPreferences(
-                                    anyString(),
-                                    anyInt(),
-                                    anyInt(),
-                                )
-                            )
-                            .thenReturn(FakeSharedPreferences())
-                    },
-                userTracker = userTracker,
-                broadcastDispatcher = fakeBroadcastDispatcher,
-            )
-        val remoteUserSelectionManager =
-            KeyguardQuickAffordanceRemoteUserSelectionManager(
-                scope = scope,
-                userTracker = userTracker,
-                clientFactory = FakeKeyguardQuickAffordanceProviderClientFactory(userTracker),
-                userHandle = UserHandle.SYSTEM,
-            )
-        val quickAffordanceRepository =
-            KeyguardQuickAffordanceRepository(
-                appContext = context,
-                scope = scope,
-                localUserSelectionManager = localUserSelectionManager,
-                remoteUserSelectionManager = remoteUserSelectionManager,
-                userTracker = userTracker,
-                legacySettingSyncer =
-                    KeyguardQuickAffordanceLegacySettingSyncer(
-                        scope = scope,
-                        backgroundDispatcher = IMMEDIATE,
-                        secureSettings = FakeSettings(),
-                        selectionsManager = localUserSelectionManager,
-                    ),
-                configs = setOf(homeControls, quickAccessWallet, qrCodeScanner),
-                dumpManager = mock(),
-                userHandle = UserHandle.SYSTEM,
-            )
-        val featureFlags = FakeFeatureFlags()
-        val testDispatcher = StandardTestDispatcher()
-        testScope = TestScope(testDispatcher)
-        underTest =
-            KeyguardQuickAffordanceInteractor(
-                keyguardInteractor =
-                    KeyguardInteractorFactory.create(
-                            featureFlags = featureFlags,
-                        )
-                        .keyguardInteractor,
-                shadeInteractor = kosmos.shadeInteractor,
-                lockPatternUtils = lockPatternUtils,
-                keyguardStateController = keyguardStateController,
-                userTracker = userTracker,
-                activityStarter = activityStarter,
-                featureFlags = featureFlags,
-                repository = { quickAffordanceRepository },
-                launchAnimator = launchAnimator,
-                logger = logger,
-                metricsLogger = metricsLogger,
-                devicePolicyManager = devicePolicyManager,
-                dockManager = dockManager,
-                biometricSettingsRepository = biometricSettingsRepository,
-                backgroundDispatcher = testDispatcher,
-                appContext = mContext,
-                sceneInteractor = { kosmos.sceneInteractor },
-            )
-    }
-
-    @Test
-    fun onQuickAffordanceTriggered() =
-        testScope.runTest {
-            val key = BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS
-            setUpMocks(
-                needStrongAuthAfterBoot = needStrongAuthAfterBoot,
-                keyguardIsUnlocked = keyguardIsUnlocked,
-            )
-
-            homeControls.setState(
-                lockScreenState =
-                    KeyguardQuickAffordanceConfig.LockScreenState.Visible(
-                        icon = DRAWABLE,
-                    )
-            )
-            homeControls.onTriggeredResult =
-                if (startActivity) {
-                    KeyguardQuickAffordanceConfig.OnTriggeredResult.StartActivity(
-                        intent = INTENT,
-                        canShowWhileLocked = canShowWhileLocked,
-                    )
-                } else {
-                    KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled
-                }
-
-            underTest.onQuickAffordanceTriggered(
-                configKey = "${KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId()}::$key",
-                expandable = expandable,
-                slotId = "",
-            )
-
-            if (startActivity) {
-                if (needsToUnlockFirst) {
-                    verify(activityStarter)
-                        .postStartActivityDismissingKeyguard(
-                            any(),
-                            /* delay= */ eq(0),
-                            same(animationController),
-                        )
-                } else {
-                    verify(activityStarter)
-                        .startActivity(
-                            any(),
-                            /* dismissShade= */ eq(true),
-                            same(animationController),
-                            /* showOverLockscreenWhenLocked= */ eq(true),
-                        )
-                }
-            } else {
-                verifyZeroInteractions(activityStarter)
-            }
-        }
-
-    private fun setUpMocks(
-        needStrongAuthAfterBoot: Boolean = true,
-        keyguardIsUnlocked: Boolean = false,
-    ) {
-        whenever(lockPatternUtils.getStrongAuthForUser(any()))
-            .thenReturn(
-                if (needStrongAuthAfterBoot) {
-                    LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT
-                } else {
-                    LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED
-                }
-            )
-        whenever(keyguardStateController.isUnlocked).thenReturn(keyguardIsUnlocked)
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractorTest.kt
index 8a5af09..ad5eeab 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractorTest.kt
@@ -65,7 +65,7 @@
             flowOf(Scenes.Lockscreen),
             progress,
             false,
-            flowOf(false)
+            flowOf(false),
         )
 
     private val goneToLs =
@@ -75,7 +75,7 @@
             flowOf(Scenes.Lockscreen),
             progress,
             false,
-            flowOf(false)
+            flowOf(false),
         )
 
     @Before
@@ -84,7 +84,8 @@
         kosmos.sceneContainerRepository.setTransitionState(sceneTransitions)
         testScope.launch {
             kosmos.realKeyguardTransitionRepository.emitInitialStepsFromOff(
-                KeyguardState.LOCKSCREEN
+                KeyguardState.LOCKSCREEN,
+                testSetup = true,
             )
         }
     }
@@ -105,11 +106,7 @@
             )
 
             progress.value = 0.4f
-            assertTransition(
-                step = currentStep!!,
-                state = TransitionState.RUNNING,
-                progress = 0.4f,
-            )
+            assertTransition(step = currentStep!!, state = TransitionState.RUNNING, progress = 0.4f)
 
             sceneTransitions.value = ObservableTransitionState.Idle(Scenes.Gone)
             assertTransition(
@@ -142,11 +139,7 @@
             )
 
             progress.value = 0.4f
-            assertTransition(
-                step = currentStep!!,
-                state = TransitionState.RUNNING,
-                progress = 0.4f,
-            )
+            assertTransition(step = currentStep!!, state = TransitionState.RUNNING, progress = 0.4f)
 
             sceneTransitions.value = ObservableTransitionState.Idle(Scenes.Lockscreen)
 
@@ -191,7 +184,7 @@
                     from = KeyguardState.LOCKSCREEN,
                     to = KeyguardState.AOD,
                     animator = null,
-                    modeOnCanceled = TransitionModeOnCanceled.RESET
+                    modeOnCanceled = TransitionModeOnCanceled.RESET,
                 )
             )
             sceneTransitions.value = lsToGone
@@ -205,11 +198,7 @@
             )
 
             progress.value = 0.4f
-            assertTransition(
-                step = currentStep!!,
-                state = TransitionState.RUNNING,
-                progress = 0.4f,
-            )
+            assertTransition(step = currentStep!!, state = TransitionState.RUNNING, progress = 0.4f)
 
             sceneTransitions.value = ObservableTransitionState.Idle(Scenes.Lockscreen)
 
@@ -257,11 +246,7 @@
             )
 
             progress.value = 0.4f
-            assertTransition(
-                step = currentStep!!,
-                state = TransitionState.RUNNING,
-                progress = 0.4f,
-            )
+            assertTransition(step = currentStep!!, state = TransitionState.RUNNING, progress = 0.4f)
 
             sceneTransitions.value = ObservableTransitionState.Idle(Scenes.Lockscreen)
 
@@ -297,7 +282,7 @@
                     flowOf(Scenes.Lockscreen),
                     progress,
                     false,
-                    flowOf(false)
+                    flowOf(false),
                 )
 
             assertTransition(
@@ -330,11 +315,7 @@
             )
 
             progress.value = 0.4f
-            assertTransition(
-                step = currentStep!!,
-                state = TransitionState.RUNNING,
-                progress = 0.4f,
-            )
+            assertTransition(step = currentStep!!, state = TransitionState.RUNNING, progress = 0.4f)
 
             sceneTransitions.value = ObservableTransitionState.Idle(Scenes.Gone)
             val stepM3 = allSteps[allSteps.size - 3]
@@ -393,7 +374,7 @@
                     flowOf(Scenes.Lockscreen),
                     progress,
                     false,
-                    flowOf(false)
+                    flowOf(false),
                 )
 
             assertTransition(
@@ -466,7 +447,7 @@
                     flowOf(Scenes.Lockscreen),
                     progress,
                     false,
-                    flowOf(false)
+                    flowOf(false),
                 )
 
             assertTransition(
@@ -523,7 +504,7 @@
                     flowOf(Scenes.Lockscreen),
                     progress,
                     false,
-                    flowOf(false)
+                    flowOf(false),
                 )
 
             assertTransition(
@@ -577,11 +558,7 @@
             )
 
             progress.value = 0.4f
-            assertTransition(
-                step = currentStep!!,
-                state = TransitionState.RUNNING,
-                progress = 0.4f,
-            )
+            assertTransition(step = currentStep!!, state = TransitionState.RUNNING, progress = 0.4f)
 
             kosmos.realKeyguardTransitionRepository.startTransition(
                 TransitionInfo(
@@ -589,7 +566,7 @@
                     from = KeyguardState.LOCKSCREEN,
                     to = KeyguardState.AOD,
                     animator = null,
-                    modeOnCanceled = TransitionModeOnCanceled.RESET
+                    modeOnCanceled = TransitionModeOnCanceled.RESET,
                 )
             )
 
@@ -641,11 +618,7 @@
             )
 
             progress.value = 0.4f
-            assertTransition(
-                step = currentStep!!,
-                state = TransitionState.RUNNING,
-                progress = 0.4f,
-            )
+            assertTransition(step = currentStep!!, state = TransitionState.RUNNING, progress = 0.4f)
 
             kosmos.realKeyguardTransitionRepository.startTransition(
                 TransitionInfo(
@@ -653,7 +626,7 @@
                     from = KeyguardState.LOCKSCREEN,
                     to = KeyguardState.AOD,
                     animator = null,
-                    modeOnCanceled = TransitionModeOnCanceled.RESET
+                    modeOnCanceled = TransitionModeOnCanceled.RESET,
                 )
             )
 
@@ -702,11 +675,7 @@
             )
 
             progress.value = 0.4f
-            assertTransition(
-                step = currentStep!!,
-                state = TransitionState.RUNNING,
-                progress = 0.4f,
-            )
+            assertTransition(step = currentStep!!, state = TransitionState.RUNNING, progress = 0.4f)
 
             kosmos.realKeyguardTransitionRepository.startTransition(
                 TransitionInfo(
@@ -714,7 +683,7 @@
                     from = KeyguardState.LOCKSCREEN,
                     to = KeyguardState.AOD,
                     animator = null,
-                    modeOnCanceled = TransitionModeOnCanceled.RESET
+                    modeOnCanceled = TransitionModeOnCanceled.RESET,
                 )
             )
 
@@ -736,7 +705,7 @@
                     flowOf(Scenes.Lockscreen),
                     progress,
                     false,
-                    flowOf(false)
+                    flowOf(false),
                 )
 
             assertTransition(
@@ -777,7 +746,7 @@
                     from = KeyguardState.LOCKSCREEN,
                     to = KeyguardState.AOD,
                     animator = null,
-                    modeOnCanceled = TransitionModeOnCanceled.RESET
+                    modeOnCanceled = TransitionModeOnCanceled.RESET,
                 )
             )
 
@@ -799,7 +768,7 @@
                     flowOf(Scenes.Lockscreen),
                     progress,
                     false,
-                    flowOf(false)
+                    flowOf(false),
                 )
             allSteps[allSteps.size - 3]
 
@@ -858,7 +827,7 @@
                     from = KeyguardState.LOCKSCREEN,
                     to = KeyguardState.AOD,
                     animator = null,
-                    modeOnCanceled = TransitionModeOnCanceled.RESET
+                    modeOnCanceled = TransitionModeOnCanceled.RESET,
                 )
             )
 
@@ -880,7 +849,7 @@
                     flowOf(Scenes.Lockscreen),
                     progress,
                     false,
-                    flowOf(false)
+                    flowOf(false),
                 )
 
             assertTransition(
@@ -959,7 +928,7 @@
                     from = KeyguardState.LOCKSCREEN,
                     to = KeyguardState.AOD,
                     animator = null,
-                    modeOnCanceled = TransitionModeOnCanceled.RESET
+                    modeOnCanceled = TransitionModeOnCanceled.RESET,
                 )
             )
 
@@ -977,7 +946,7 @@
                     from = KeyguardState.AOD,
                     to = KeyguardState.DOZING,
                     animator = null,
-                    modeOnCanceled = TransitionModeOnCanceled.RESET
+                    modeOnCanceled = TransitionModeOnCanceled.RESET,
                 )
             )
 
@@ -995,7 +964,7 @@
                     from = KeyguardState.DOZING,
                     to = KeyguardState.OCCLUDED,
                     animator = null,
-                    modeOnCanceled = TransitionModeOnCanceled.RESET
+                    modeOnCanceled = TransitionModeOnCanceled.RESET,
                 )
             )
 
@@ -1017,7 +986,7 @@
                     flowOf(Scenes.Lockscreen),
                     progress,
                     false,
-                    flowOf(false)
+                    flowOf(false),
                 )
 
             assertTransition(
@@ -1077,7 +1046,7 @@
                         from = KeyguardState.LOCKSCREEN,
                         to = KeyguardState.AOD,
                         animator = null,
-                        modeOnCanceled = TransitionModeOnCanceled.RESET
+                        modeOnCanceled = TransitionModeOnCanceled.RESET,
                     )
                 )
 
@@ -1092,7 +1061,7 @@
             kosmos.realKeyguardTransitionRepository.updateTransition(
                 ktfUuid!!,
                 1f,
-                TransitionState.FINISHED
+                TransitionState.FINISHED,
             )
 
             assertTransition(
@@ -1110,7 +1079,7 @@
                     flowOf(Scenes.Lockscreen),
                     progress,
                     false,
-                    flowOf(false)
+                    flowOf(false),
                 )
 
             assertTransition(
@@ -1171,7 +1140,7 @@
                     flowOf(Scenes.Lockscreen),
                     progress,
                     false,
-                    flowOf(false)
+                    flowOf(false),
                 )
 
             assertTransition(
@@ -1235,7 +1204,7 @@
                     flowOf(Scenes.Lockscreen),
                     progress,
                     false,
-                    flowOf(false)
+                    flowOf(false),
                 )
 
             assertTransition(
@@ -1291,7 +1260,7 @@
                     flowOf(Scenes.Lockscreen),
                     progress,
                     false,
-                    flowOf(false)
+                    flowOf(false),
                 )
 
             assertTransition(
@@ -1308,7 +1277,7 @@
         from: KeyguardState? = null,
         to: KeyguardState? = null,
         state: TransitionState? = null,
-        progress: Float? = null
+        progress: Float? = null,
     ) {
         if (from != null) assertThat(step.from).isEqualTo(from)
         if (to != null) assertThat(step.to).isEqualTo(to)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityManagerTest.kt
deleted file mode 100644
index 43c7ed6..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityManagerTest.kt
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2023 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.systemui.keyguard.ui.binder
-
-import android.app.IActivityTaskManager
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.keyguard.WindowManagerLockscreenVisibilityManager
-import com.android.systemui.keyguard.domain.interactor.KeyguardDismissTransitionInteractor
-import com.android.systemui.statusbar.policy.KeyguardStateController
-import com.android.systemui.util.concurrency.FakeExecutor
-import com.android.systemui.util.time.FakeSystemClock
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.Mockito.anyInt
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyNoMoreInteractions
-import org.mockito.MockitoAnnotations
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-@kotlinx.coroutines.ExperimentalCoroutinesApi
-class WindowManagerLockscreenVisibilityManagerTest : SysuiTestCase() {
-    private lateinit var underTest: WindowManagerLockscreenVisibilityManager
-    private lateinit var executor: FakeExecutor
-
-    @Mock private lateinit var activityTaskManagerService: IActivityTaskManager
-    @Mock private lateinit var keyguardStateController: KeyguardStateController
-    @Mock private lateinit var keyguardSurfaceBehindAnimator: KeyguardSurfaceBehindParamsApplier
-    @Mock
-    private lateinit var keyguardDismissTransitionInteractor: KeyguardDismissTransitionInteractor
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-        executor = FakeExecutor(FakeSystemClock())
-
-        underTest =
-            WindowManagerLockscreenVisibilityManager(
-                executor = executor,
-                activityTaskManagerService = activityTaskManagerService,
-                keyguardStateController = keyguardStateController,
-                keyguardSurfaceBehindAnimator = keyguardSurfaceBehindAnimator,
-                keyguardDismissTransitionInteractor = keyguardDismissTransitionInteractor,
-            )
-    }
-
-    @Test
-    fun testLockscreenVisible_andAodVisible() {
-        underTest.setLockscreenShown(true)
-        underTest.setAodVisible(true)
-
-        verify(activityTaskManagerService).setLockScreenShown(true, false)
-        verify(activityTaskManagerService).setLockScreenShown(true, true)
-        verifyNoMoreInteractions(activityTaskManagerService)
-    }
-
-    @Test
-    fun testGoingAway_whenLockscreenVisible_thenSurfaceMadeVisible() {
-        underTest.setLockscreenShown(true)
-        underTest.setAodVisible(true)
-
-        verify(activityTaskManagerService).setLockScreenShown(true, false)
-        verify(activityTaskManagerService).setLockScreenShown(true, true)
-        verifyNoMoreInteractions(activityTaskManagerService)
-
-        underTest.setSurfaceBehindVisibility(true)
-
-        verify(activityTaskManagerService).keyguardGoingAway(anyInt())
-        verifyNoMoreInteractions(activityTaskManagerService)
-    }
-
-    @Test
-    fun testSurfaceVisible_whenLockscreenNotShowing_doesNotTriggerGoingAway() {
-        underTest.setLockscreenShown(false)
-        underTest.setAodVisible(false)
-
-        verify(activityTaskManagerService).setLockScreenShown(false, false)
-        verifyNoMoreInteractions(activityTaskManagerService)
-
-        underTest.setSurfaceBehindVisibility(true)
-
-        verifyNoMoreInteractions(activityTaskManagerService)
-    }
-
-    @Test
-    fun testAodVisible_noLockscreenShownCallYet_doesNotShowLockscreenUntilLater() {
-        underTest.setAodVisible(false)
-        verifyNoMoreInteractions(activityTaskManagerService)
-
-        underTest.setLockscreenShown(true)
-        verify(activityTaskManagerService).setLockScreenShown(true, false)
-        verifyNoMoreInteractions(activityTaskManagerService)
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt
deleted file mode 100644
index 1929cd1..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt
+++ /dev/null
@@ -1,771 +0,0 @@
-/*
- * Copyright (C) 2022 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.systemui.keyguard.ui.viewmodel
-
-import android.app.admin.DevicePolicyManager
-import android.content.Intent
-import android.os.UserHandle
-import android.platform.test.flag.junit.FlagsParameterization
-import androidx.test.filters.SmallTest
-import com.android.internal.logging.testing.UiEventLoggerFake
-import com.android.internal.widget.LockPatternUtils
-import com.android.keyguard.logging.KeyguardQuickAffordancesLogger
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.animation.DialogTransitionAnimator
-import com.android.systemui.animation.Expandable
-import com.android.systemui.broadcast.BroadcastDispatcher
-import com.android.systemui.common.shared.model.Icon
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.domain.interactor.deviceEntryFaceAuthInteractor
-import com.android.systemui.dock.DockManagerFake
-import com.android.systemui.doze.util.BurnInHelperWrapper
-import com.android.systemui.flags.FakeFeatureFlags
-import com.android.systemui.flags.Flags
-import com.android.systemui.flags.andSceneContainer
-import com.android.systemui.keyguard.data.quickaffordance.BuiltInKeyguardQuickAffordanceKeys
-import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceConfig
-import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceProviderClientFactory
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLegacySettingSyncer
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLocalUserSelectionManager
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceRemoteUserSelectionManager
-import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor
-import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
-import com.android.systemui.keyguard.domain.interactor.KeyguardQuickAffordanceInteractor
-import com.android.systemui.keyguard.domain.interactor.KeyguardTouchHandlingInteractor
-import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
-import com.android.systemui.keyguard.shared.quickaffordance.ActivationState
-import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancePosition
-import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancesMetricsLogger
-import com.android.systemui.kosmos.testDispatcher
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.plugins.ActivityStarter
-import com.android.systemui.res.R
-import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.settings.UserFileManager
-import com.android.systemui.settings.UserTracker
-import com.android.systemui.shade.domain.interactor.shadeInteractor
-import com.android.systemui.shade.pulsingGestureListener
-import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots
-import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper
-import com.android.systemui.statusbar.policy.KeyguardStateController
-import com.android.systemui.testKosmos
-import com.android.systemui.util.FakeSharedPreferences
-import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.whenever
-import com.android.systemui.util.settings.fakeSettings
-import com.google.common.truth.Truth.assertThat
-import kotlin.math.max
-import kotlin.math.min
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.ArgumentMatchers.anyString
-import org.mockito.Mock
-import org.mockito.Mockito
-import org.mockito.Mockito.verifyZeroInteractions
-import org.mockito.MockitoAnnotations
-import platform.test.runner.parameterized.ParameterizedAndroidJunit4
-import platform.test.runner.parameterized.Parameters
-
-@SmallTest
-@RunWith(ParameterizedAndroidJunit4::class)
-class KeyguardBottomAreaViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
-
-    private val kosmos = testKosmos()
-    private val testDispatcher = kosmos.testDispatcher
-    private val testScope = kosmos.testScope
-    private val settings = kosmos.fakeSettings
-
-    @Mock private lateinit var expandable: Expandable
-    @Mock private lateinit var burnInHelperWrapper: BurnInHelperWrapper
-    @Mock private lateinit var lockPatternUtils: LockPatternUtils
-    @Mock private lateinit var keyguardStateController: KeyguardStateController
-    @Mock private lateinit var userTracker: UserTracker
-    @Mock private lateinit var activityStarter: ActivityStarter
-    @Mock private lateinit var launchAnimator: DialogTransitionAnimator
-    @Mock private lateinit var devicePolicyManager: DevicePolicyManager
-    @Mock private lateinit var logger: KeyguardQuickAffordancesLogger
-    @Mock private lateinit var metricsLogger: KeyguardQuickAffordancesMetricsLogger
-    @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher
-    @Mock private lateinit var accessibilityManager: AccessibilityManagerWrapper
-
-    private lateinit var underTest: KeyguardBottomAreaViewModel
-
-    private lateinit var repository: FakeKeyguardRepository
-    private lateinit var homeControlsQuickAffordanceConfig: FakeKeyguardQuickAffordanceConfig
-    private lateinit var quickAccessWalletAffordanceConfig: FakeKeyguardQuickAffordanceConfig
-    private lateinit var qrCodeScannerAffordanceConfig: FakeKeyguardQuickAffordanceConfig
-    private lateinit var dockManager: DockManagerFake
-    private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
-
-    init {
-        mSetFlagsRule.setFlagsParameterization(flags)
-    }
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-
-        overrideResource(R.bool.custom_lockscreen_shortcuts_enabled, true)
-        overrideResource(
-            R.array.config_keyguardQuickAffordanceDefaults,
-            arrayOf(
-                KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START +
-                    ":" +
-                    BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS,
-                KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END +
-                    ":" +
-                    BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
-            )
-        )
-
-        whenever(burnInHelperWrapper.burnInOffset(anyInt(), any()))
-            .thenReturn(RETURNED_BURN_IN_OFFSET)
-
-        homeControlsQuickAffordanceConfig =
-            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS)
-        quickAccessWalletAffordanceConfig =
-            FakeKeyguardQuickAffordanceConfig(
-                BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
-            )
-        qrCodeScannerAffordanceConfig =
-            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.QR_CODE_SCANNER)
-        dockManager = DockManagerFake()
-        biometricSettingsRepository = FakeBiometricSettingsRepository()
-        val featureFlags =
-            FakeFeatureFlags().apply { set(Flags.LOCK_SCREEN_LONG_PRESS_ENABLED, false) }
-
-        val withDeps = KeyguardInteractorFactory.create(featureFlags = featureFlags)
-        val keyguardInteractor = withDeps.keyguardInteractor
-        repository = withDeps.repository
-
-        whenever(userTracker.userHandle).thenReturn(mock())
-        whenever(lockPatternUtils.getStrongAuthForUser(anyInt()))
-            .thenReturn(LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED)
-        val localUserSelectionManager =
-            KeyguardQuickAffordanceLocalUserSelectionManager(
-                context = context,
-                userFileManager =
-                    mock<UserFileManager>().apply {
-                        whenever(
-                                getSharedPreferences(
-                                    anyString(),
-                                    anyInt(),
-                                    anyInt(),
-                                )
-                            )
-                            .thenReturn(FakeSharedPreferences())
-                    },
-                userTracker = userTracker,
-                broadcastDispatcher = fakeBroadcastDispatcher,
-            )
-        val remoteUserSelectionManager =
-            KeyguardQuickAffordanceRemoteUserSelectionManager(
-                scope = testScope.backgroundScope,
-                userTracker = userTracker,
-                clientFactory = FakeKeyguardQuickAffordanceProviderClientFactory(userTracker),
-                userHandle = UserHandle.SYSTEM,
-            )
-        val quickAffordanceRepository =
-            KeyguardQuickAffordanceRepository(
-                appContext = context,
-                scope = testScope.backgroundScope,
-                localUserSelectionManager = localUserSelectionManager,
-                remoteUserSelectionManager = remoteUserSelectionManager,
-                userTracker = userTracker,
-                legacySettingSyncer =
-                    KeyguardQuickAffordanceLegacySettingSyncer(
-                        scope = testScope.backgroundScope,
-                        backgroundDispatcher = testDispatcher,
-                        secureSettings = settings,
-                        selectionsManager = localUserSelectionManager,
-                    ),
-                configs =
-                    setOf(
-                        homeControlsQuickAffordanceConfig,
-                        quickAccessWalletAffordanceConfig,
-                        qrCodeScannerAffordanceConfig,
-                    ),
-                dumpManager = mock(),
-                userHandle = UserHandle.SYSTEM,
-            )
-        val keyguardTouchHandlingInteractor =
-            KeyguardTouchHandlingInteractor(
-                appContext = mContext,
-                scope = testScope.backgroundScope,
-                transitionInteractor = kosmos.keyguardTransitionInteractor,
-                repository = repository,
-                logger = UiEventLoggerFake(),
-                featureFlags = featureFlags,
-                broadcastDispatcher = broadcastDispatcher,
-                accessibilityManager = accessibilityManager,
-                pulsingGestureListener = kosmos.pulsingGestureListener,
-                faceAuthInteractor = kosmos.deviceEntryFaceAuthInteractor,
-            )
-        underTest =
-            KeyguardBottomAreaViewModel(
-                keyguardInteractor = keyguardInteractor,
-                quickAffordanceInteractor =
-                    KeyguardQuickAffordanceInteractor(
-                        keyguardInteractor = keyguardInteractor,
-                        shadeInteractor = kosmos.shadeInteractor,
-                        lockPatternUtils = lockPatternUtils,
-                        keyguardStateController = keyguardStateController,
-                        userTracker = userTracker,
-                        activityStarter = activityStarter,
-                        featureFlags = featureFlags,
-                        repository = { quickAffordanceRepository },
-                        launchAnimator = launchAnimator,
-                        logger = logger,
-                        metricsLogger = metricsLogger,
-                        devicePolicyManager = devicePolicyManager,
-                        dockManager = dockManager,
-                        biometricSettingsRepository = biometricSettingsRepository,
-                        backgroundDispatcher = testDispatcher,
-                        appContext = mContext,
-                        sceneInteractor = { kosmos.sceneInteractor },
-                    ),
-                bottomAreaInteractor = KeyguardBottomAreaInteractor(repository = repository),
-                burnInHelperWrapper = burnInHelperWrapper,
-                keyguardTouchHandlingViewModel =
-                    KeyguardTouchHandlingViewModel(
-                        interactor = keyguardTouchHandlingInteractor,
-                    ),
-                settingsMenuViewModel =
-                    KeyguardSettingsMenuViewModel(
-                        interactor = keyguardTouchHandlingInteractor,
-                    ),
-            )
-    }
-
-    @Test
-    fun startButton_present_visibleModel_startsActivityOnClick() =
-        testScope.runTest {
-            repository.setKeyguardShowing(true)
-            val latest = collectLastValue(underTest.startButton)
-
-            val testConfig =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = true,
-                    isActivated = true,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = testConfig,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = testConfig,
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun startButton_hiddenWhenDevicePolicyDisablesAllKeyguardFeatures() =
-        testScope.runTest {
-            whenever(devicePolicyManager.getKeyguardDisabledFeatures(null, userTracker.userId))
-                .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_ALL)
-            repository.setKeyguardShowing(true)
-            val latest by collectLastValue(underTest.startButton)
-
-            val testConfig =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = true,
-                    isActivated = true,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = testConfig,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest,
-                testConfig =
-                    TestConfig(
-                        isVisible = false,
-                        slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                    ),
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun startButton_inPreviewMode_visibleEvenWhenKeyguardNotShowing() =
-        testScope.runTest {
-            underTest.enablePreviewMode(
-                initiallySelectedSlotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START,
-                shouldHighlightSelectedAffordance = true,
-            )
-            repository.setKeyguardShowing(false)
-            val latest = collectLastValue(underTest.startButton)
-
-            val icon: Icon = mock()
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig =
-                        TestConfig(
-                            isVisible = true,
-                            isClickable = true,
-                            isActivated = true,
-                            icon = icon,
-                            canShowWhileLocked = false,
-                            intent = Intent("action"),
-                            slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                        ),
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig =
-                    TestConfig(
-                        isVisible = true,
-                        isClickable = false,
-                        isActivated = false,
-                        icon = icon,
-                        canShowWhileLocked = false,
-                        intent = Intent("action"),
-                        isSelected = true,
-                        slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                    ),
-                configKey = configKey,
-            )
-            assertThat(latest()?.isSelected).isTrue()
-        }
-
-    @Test
-    fun endButton_inHiglightedPreviewMode_dimmedWhenOtherIsSelected() =
-        testScope.runTest {
-            underTest.enablePreviewMode(
-                initiallySelectedSlotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START,
-                shouldHighlightSelectedAffordance = true,
-            )
-            repository.setKeyguardShowing(false)
-            val startButton = collectLastValue(underTest.startButton)
-            val endButton = collectLastValue(underTest.endButton)
-
-            val icon: Icon = mock()
-            setUpQuickAffordanceModel(
-                position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                testConfig =
-                    TestConfig(
-                        isVisible = true,
-                        isClickable = true,
-                        isActivated = true,
-                        icon = icon,
-                        canShowWhileLocked = false,
-                        intent = Intent("action"),
-                        slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                    ),
-            )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_END,
-                    testConfig =
-                        TestConfig(
-                            isVisible = true,
-                            isClickable = true,
-                            isActivated = true,
-                            icon = icon,
-                            canShowWhileLocked = false,
-                            intent = Intent("action"),
-                            slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
-                        ),
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = endButton(),
-                testConfig =
-                    TestConfig(
-                        isVisible = true,
-                        isClickable = false,
-                        isActivated = false,
-                        icon = icon,
-                        canShowWhileLocked = false,
-                        intent = Intent("action"),
-                        isDimmed = true,
-                        slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
-                    ),
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun endButton_present_visibleModel_doNothingOnClick() =
-        testScope.runTest {
-            repository.setKeyguardShowing(true)
-            val latest = collectLastValue(underTest.endButton)
-
-            val config =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = true,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent =
-                        null, // This will cause it to tell the system that the click was handled.
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_END,
-                    testConfig = config,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = config,
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun startButton_notPresent_modelIsHidden() =
-        testScope.runTest {
-            val latest = collectLastValue(underTest.startButton)
-
-            val config =
-                TestConfig(
-                    isVisible = false,
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = config,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = config,
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun animateButtonReveal() =
-        testScope.runTest {
-            repository.setKeyguardShowing(true)
-            val testConfig =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = true,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-
-            setUpQuickAffordanceModel(
-                position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                testConfig = testConfig,
-            )
-
-            val value = collectLastValue(underTest.startButton.map { it.animateReveal })
-
-            assertThat(value()).isFalse()
-            repository.setAnimateDozingTransitions(true)
-            assertThat(value()).isTrue()
-            repository.setAnimateDozingTransitions(false)
-            assertThat(value()).isFalse()
-        }
-
-    @Test
-    fun isOverlayContainerVisible() =
-        testScope.runTest {
-            val value = collectLastValue(underTest.isOverlayContainerVisible)
-
-            assertThat(value()).isTrue()
-            repository.setIsDozing(true)
-            assertThat(value()).isFalse()
-            repository.setIsDozing(false)
-            assertThat(value()).isTrue()
-        }
-
-    @Test
-    fun alpha() =
-        testScope.runTest {
-            val value = collectLastValue(underTest.alpha)
-
-            assertThat(value()).isEqualTo(1f)
-            repository.setBottomAreaAlpha(0.1f)
-            assertThat(value()).isEqualTo(0.1f)
-            repository.setBottomAreaAlpha(0.5f)
-            assertThat(value()).isEqualTo(0.5f)
-            repository.setBottomAreaAlpha(0.2f)
-            assertThat(value()).isEqualTo(0.2f)
-            repository.setBottomAreaAlpha(0f)
-            assertThat(value()).isEqualTo(0f)
-        }
-
-    @Test
-    fun alpha_inPreviewMode_doesNotChange() =
-        testScope.runTest {
-            underTest.enablePreviewMode(
-                initiallySelectedSlotId = null,
-                shouldHighlightSelectedAffordance = false,
-            )
-            val value = collectLastValue(underTest.alpha)
-
-            assertThat(value()).isEqualTo(1f)
-            repository.setBottomAreaAlpha(0.1f)
-            assertThat(value()).isEqualTo(1f)
-            repository.setBottomAreaAlpha(0.5f)
-            assertThat(value()).isEqualTo(1f)
-            repository.setBottomAreaAlpha(0.2f)
-            assertThat(value()).isEqualTo(1f)
-            repository.setBottomAreaAlpha(0f)
-            assertThat(value()).isEqualTo(1f)
-        }
-
-    @Test
-    fun isClickable_trueWhenAlphaAtThreshold() =
-        testScope.runTest {
-            repository.setKeyguardShowing(true)
-            repository.setBottomAreaAlpha(
-                KeyguardBottomAreaViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD
-            )
-
-            val testConfig =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = true,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = testConfig,
-                )
-
-            val latest = collectLastValue(underTest.startButton)
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = testConfig,
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun isClickable_trueWhenAlphaAboveThreshold() =
-        testScope.runTest {
-            repository.setKeyguardShowing(true)
-            val latest = collectLastValue(underTest.startButton)
-            repository.setBottomAreaAlpha(
-                min(1f, KeyguardBottomAreaViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD + 0.1f),
-            )
-
-            val testConfig =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = true,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = testConfig,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = testConfig,
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun isClickable_falseWhenAlphaBelowThreshold() =
-        testScope.runTest {
-            repository.setKeyguardShowing(true)
-            val latest = collectLastValue(underTest.startButton)
-            repository.setBottomAreaAlpha(
-                max(0f, KeyguardBottomAreaViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD - 0.1f),
-            )
-
-            val testConfig =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = false,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = testConfig,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = testConfig,
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun isClickable_falseWhenAlphaAtZero() =
-        testScope.runTest {
-            repository.setKeyguardShowing(true)
-            val latest = collectLastValue(underTest.startButton)
-            repository.setBottomAreaAlpha(0f)
-
-            val testConfig =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = false,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = testConfig,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = testConfig,
-                configKey = configKey,
-            )
-        }
-
-    private suspend fun setUpQuickAffordanceModel(
-        position: KeyguardQuickAffordancePosition,
-        testConfig: TestConfig,
-    ): String {
-        val config =
-            when (position) {
-                KeyguardQuickAffordancePosition.BOTTOM_START -> homeControlsQuickAffordanceConfig
-                KeyguardQuickAffordancePosition.BOTTOM_END -> quickAccessWalletAffordanceConfig
-            }
-
-        val lockScreenState =
-            if (testConfig.isVisible) {
-                if (testConfig.intent != null) {
-                    config.onTriggeredResult =
-                        KeyguardQuickAffordanceConfig.OnTriggeredResult.StartActivity(
-                            intent = testConfig.intent,
-                            canShowWhileLocked = testConfig.canShowWhileLocked,
-                        )
-                }
-                KeyguardQuickAffordanceConfig.LockScreenState.Visible(
-                    icon = testConfig.icon ?: error("Icon is unexpectedly null!"),
-                    activationState =
-                        when (testConfig.isActivated) {
-                            true -> ActivationState.Active
-                            false -> ActivationState.Inactive
-                        }
-                )
-            } else {
-                KeyguardQuickAffordanceConfig.LockScreenState.Hidden
-            }
-        config.setState(lockScreenState)
-
-        return "${position.toSlotId()}::${config.key}"
-    }
-
-    private fun assertQuickAffordanceViewModel(
-        viewModel: KeyguardQuickAffordanceViewModel?,
-        testConfig: TestConfig,
-        configKey: String,
-    ) {
-        checkNotNull(viewModel)
-        assertThat(viewModel.isVisible).isEqualTo(testConfig.isVisible)
-        assertThat(viewModel.isClickable).isEqualTo(testConfig.isClickable)
-        assertThat(viewModel.isActivated).isEqualTo(testConfig.isActivated)
-        assertThat(viewModel.isSelected).isEqualTo(testConfig.isSelected)
-        assertThat(viewModel.isDimmed).isEqualTo(testConfig.isDimmed)
-        assertThat(viewModel.slotId).isEqualTo(testConfig.slotId)
-        if (testConfig.isVisible) {
-            assertThat(viewModel.icon).isEqualTo(testConfig.icon)
-            viewModel.onClicked.invoke(
-                KeyguardQuickAffordanceViewModel.OnClickedParameters(
-                    configKey = configKey,
-                    expandable = expandable,
-                    slotId = viewModel.slotId,
-                )
-            )
-            if (testConfig.intent != null) {
-                assertThat(Mockito.mockingDetails(activityStarter).invocations).hasSize(1)
-            } else {
-                verifyZeroInteractions(activityStarter)
-            }
-        } else {
-            assertThat(viewModel.isVisible).isFalse()
-        }
-    }
-
-    private data class TestConfig(
-        val isVisible: Boolean,
-        val isClickable: Boolean = false,
-        val isActivated: Boolean = false,
-        val icon: Icon? = null,
-        val canShowWhileLocked: Boolean = false,
-        val intent: Intent? = null,
-        val isSelected: Boolean = false,
-        val isDimmed: Boolean = false,
-        val slotId: String = ""
-    ) {
-        init {
-            check(!isVisible || icon != null) { "Must supply non-null icon if visible!" }
-        }
-    }
-
-    companion object {
-        private const val DEFAULT_BURN_IN_OFFSET = 5
-        private const val RETURNED_BURN_IN_OFFSET = 3
-
-        @JvmStatic
-        @Parameters(name = "{0}")
-        fun getParams(): List<FlagsParameterization> {
-            return FlagsParameterization.allCombinationsOf().andSceneContainer()
-        }
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt
deleted file mode 100644
index 720f2e1..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt
+++ /dev/null
@@ -1,887 +0,0 @@
-/*
- * Copyright (C) 2023 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.systemui.keyguard.ui.viewmodel
-
-import android.app.admin.DevicePolicyManager
-import android.content.Intent
-import android.os.UserHandle
-import android.platform.test.annotations.EnableFlags
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.internal.widget.LockPatternUtils
-import com.android.keyguard.logging.KeyguardQuickAffordancesLogger
-import com.android.systemui.Flags as AConfigFlags
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.animation.DialogTransitionAnimator
-import com.android.systemui.animation.Expandable
-import com.android.systemui.common.shared.model.Icon
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.dock.DockManagerFake
-import com.android.systemui.flags.FakeFeatureFlags
-import com.android.systemui.flags.Flags
-import com.android.systemui.keyguard.data.quickaffordance.BuiltInKeyguardQuickAffordanceKeys
-import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceConfig
-import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceProviderClientFactory
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLegacySettingSyncer
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLocalUserSelectionManager
-import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceRemoteUserSelectionManager
-import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
-import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
-import com.android.systemui.keyguard.domain.interactor.KeyguardQuickAffordanceInteractor
-import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
-import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
-import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
-import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
-import com.android.systemui.keyguard.shared.model.TransitionStep
-import com.android.systemui.keyguard.shared.quickaffordance.ActivationState
-import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancePosition
-import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancesMetricsLogger
-import com.android.systemui.kosmos.testDispatcher
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.plugins.ActivityStarter
-import com.android.systemui.res.R
-import com.android.systemui.scene.data.repository.Idle
-import com.android.systemui.scene.data.repository.setTransition
-import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.settings.UserFileManager
-import com.android.systemui.settings.UserTracker
-import com.android.systemui.shade.domain.interactor.ShadeInteractor
-import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots
-import com.android.systemui.statusbar.policy.KeyguardStateController
-import com.android.systemui.testKosmos
-import com.android.systemui.util.FakeSharedPreferences
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.whenever
-import com.android.systemui.util.settings.fakeSettings
-import com.google.common.truth.Truth
-import kotlin.math.min
-import kotlin.test.assertEquals
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.emptyFlow
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers
-import org.mockito.Mock
-import org.mockito.Mockito
-import org.mockito.MockitoAnnotations
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() {
-
-    private val kosmos = testKosmos()
-    private val testScope = kosmos.testScope
-    private val settings = kosmos.fakeSettings
-
-    @Mock private lateinit var activityStarter: ActivityStarter
-    @Mock private lateinit var devicePolicyManager: DevicePolicyManager
-    @Mock private lateinit var expandable: Expandable
-    @Mock private lateinit var userTracker: UserTracker
-    @Mock private lateinit var lockPatternUtils: LockPatternUtils
-    @Mock private lateinit var keyguardStateController: KeyguardStateController
-    @Mock private lateinit var launchAnimator: DialogTransitionAnimator
-    @Mock private lateinit var logger: KeyguardQuickAffordancesLogger
-    @Mock private lateinit var metricsLogger: KeyguardQuickAffordancesMetricsLogger
-    @Mock private lateinit var shadeInteractor: ShadeInteractor
-    @Mock
-    private lateinit var aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel
-    @Mock
-    private lateinit var dozingToLockscreenTransitionViewModel:
-        DozingToLockscreenTransitionViewModel
-    @Mock
-    private lateinit var dreamingHostedToLockscreenTransitionViewModel:
-        DreamingHostedToLockscreenTransitionViewModel
-    @Mock
-    private lateinit var dreamingToLockscreenTransitionViewModel:
-        DreamingToLockscreenTransitionViewModel
-    @Mock
-    private lateinit var goneToLockscreenTransitionViewModel: GoneToLockscreenTransitionViewModel
-    @Mock
-    private lateinit var occludedToLockscreenTransitionViewModel:
-        OccludedToLockscreenTransitionViewModel
-    @Mock
-    private lateinit var offToLockscreenTransitionViewModel: OffToLockscreenTransitionViewModel
-    @Mock
-    private lateinit var primaryBouncerToLockscreenTransitionViewModel:
-        PrimaryBouncerToLockscreenTransitionViewModel
-    @Mock
-    private lateinit var lockscreenToAodTransitionViewModel: LockscreenToAodTransitionViewModel
-    @Mock
-    private lateinit var lockscreenToDozingTransitionViewModel:
-        LockscreenToDozingTransitionViewModel
-    @Mock
-    private lateinit var lockscreenToDreamingHostedTransitionViewModel:
-        LockscreenToDreamingHostedTransitionViewModel
-    @Mock
-    private lateinit var lockscreenToDreamingTransitionViewModel:
-        LockscreenToDreamingTransitionViewModel
-    @Mock
-    private lateinit var lockscreenToGoneTransitionViewModel: LockscreenToGoneTransitionViewModel
-    @Mock
-    private lateinit var lockscreenToOccludedTransitionViewModel:
-        LockscreenToOccludedTransitionViewModel
-    @Mock
-    private lateinit var lockscreenToPrimaryBouncerTransitionViewModel:
-        LockscreenToPrimaryBouncerTransitionViewModel
-    @Mock
-    private lateinit var lockscreenToGlanceableHubTransitionViewModel:
-        LockscreenToGlanceableHubTransitionViewModel
-    @Mock
-    private lateinit var glanceableHubToLockscreenTransitionViewModel:
-        GlanceableHubToLockscreenTransitionViewModel
-
-    private lateinit var underTest: KeyguardQuickAffordancesCombinedViewModel
-
-    private lateinit var repository: FakeKeyguardRepository
-    private lateinit var homeControlsQuickAffordanceConfig: FakeKeyguardQuickAffordanceConfig
-    private lateinit var quickAccessWalletAffordanceConfig: FakeKeyguardQuickAffordanceConfig
-    private lateinit var qrCodeScannerAffordanceConfig: FakeKeyguardQuickAffordanceConfig
-    private lateinit var dockManager: DockManagerFake
-    private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
-    private lateinit var keyguardInteractor: KeyguardInteractor
-
-    private val intendedAlphaMutableStateFlow: MutableStateFlow<Float> = MutableStateFlow(1f)
-    // the viewModel does a `map { 1 - it }` on this value, which is why it's different
-    private val intendedShadeAlphaMutableStateFlow: MutableStateFlow<Float> = MutableStateFlow(0f)
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-
-        overrideResource(R.bool.custom_lockscreen_shortcuts_enabled, true)
-        overrideResource(
-            R.array.config_keyguardQuickAffordanceDefaults,
-            arrayOf(
-                KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START +
-                    ":" +
-                    BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS,
-                KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END +
-                    ":" +
-                    BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
-            )
-        )
-
-        homeControlsQuickAffordanceConfig =
-            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS)
-        quickAccessWalletAffordanceConfig =
-            FakeKeyguardQuickAffordanceConfig(
-                BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
-            )
-        qrCodeScannerAffordanceConfig =
-            FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.QR_CODE_SCANNER)
-        dockManager = DockManagerFake()
-        biometricSettingsRepository = FakeBiometricSettingsRepository()
-
-        mSetFlagsRule.enableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
-
-        val featureFlags =
-            FakeFeatureFlags().apply { set(Flags.LOCK_SCREEN_LONG_PRESS_ENABLED, false) }
-
-        val withDeps = KeyguardInteractorFactory.create(featureFlags = featureFlags)
-        keyguardInteractor = withDeps.keyguardInteractor
-        repository = withDeps.repository
-
-        whenever(userTracker.userHandle).thenReturn(mock())
-        whenever(lockPatternUtils.getStrongAuthForUser(ArgumentMatchers.anyInt()))
-            .thenReturn(LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED)
-
-        val localUserSelectionManager =
-            KeyguardQuickAffordanceLocalUserSelectionManager(
-                context = context,
-                userFileManager =
-                    mock<UserFileManager>().apply {
-                        whenever(
-                                getSharedPreferences(
-                                    ArgumentMatchers.anyString(),
-                                    ArgumentMatchers.anyInt(),
-                                    ArgumentMatchers.anyInt(),
-                                )
-                            )
-                            .thenReturn(FakeSharedPreferences())
-                    },
-                userTracker = userTracker,
-                broadcastDispatcher = fakeBroadcastDispatcher,
-            )
-        val remoteUserSelectionManager =
-            KeyguardQuickAffordanceRemoteUserSelectionManager(
-                scope = testScope.backgroundScope,
-                userTracker = userTracker,
-                clientFactory = FakeKeyguardQuickAffordanceProviderClientFactory(userTracker),
-                userHandle = UserHandle.SYSTEM,
-            )
-        val quickAffordanceRepository =
-            KeyguardQuickAffordanceRepository(
-                appContext = context,
-                scope = testScope.backgroundScope,
-                localUserSelectionManager = localUserSelectionManager,
-                remoteUserSelectionManager = remoteUserSelectionManager,
-                userTracker = userTracker,
-                legacySettingSyncer =
-                    KeyguardQuickAffordanceLegacySettingSyncer(
-                        scope = testScope.backgroundScope,
-                        backgroundDispatcher = kosmos.testDispatcher,
-                        secureSettings = settings,
-                        selectionsManager = localUserSelectionManager,
-                    ),
-                configs =
-                    setOf(
-                        homeControlsQuickAffordanceConfig,
-                        quickAccessWalletAffordanceConfig,
-                        qrCodeScannerAffordanceConfig,
-                    ),
-                dumpManager = mock(),
-                userHandle = UserHandle.SYSTEM,
-            )
-
-        intendedAlphaMutableStateFlow.value = 1f
-        intendedShadeAlphaMutableStateFlow.value = 0f
-        whenever(aodToLockscreenTransitionViewModel.shortcutsAlpha)
-            .thenReturn(intendedAlphaMutableStateFlow)
-        whenever(dozingToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
-        whenever(dreamingHostedToLockscreenTransitionViewModel.shortcutsAlpha)
-            .thenReturn(emptyFlow())
-        whenever(dreamingToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
-        whenever(goneToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
-        whenever(occludedToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
-        whenever(offToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
-        whenever(primaryBouncerToLockscreenTransitionViewModel.shortcutsAlpha)
-            .thenReturn(emptyFlow())
-        whenever(lockscreenToAodTransitionViewModel.shortcutsAlpha)
-            .thenReturn(intendedAlphaMutableStateFlow)
-        whenever(lockscreenToDozingTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
-        whenever(lockscreenToDreamingHostedTransitionViewModel.shortcutsAlpha)
-            .thenReturn(emptyFlow())
-        whenever(lockscreenToDreamingTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
-        whenever(lockscreenToGoneTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
-        whenever(lockscreenToOccludedTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
-        whenever(lockscreenToPrimaryBouncerTransitionViewModel.shortcutsAlpha)
-            .thenReturn(emptyFlow())
-        whenever(lockscreenToGlanceableHubTransitionViewModel.shortcutsAlpha)
-            .thenReturn(emptyFlow())
-        whenever(glanceableHubToLockscreenTransitionViewModel.shortcutsAlpha)
-            .thenReturn(emptyFlow())
-        whenever(shadeInteractor.anyExpansion).thenReturn(intendedShadeAlphaMutableStateFlow)
-
-        underTest =
-            KeyguardQuickAffordancesCombinedViewModel(
-                applicationScope = testScope.backgroundScope,
-                quickAffordanceInteractor =
-                    KeyguardQuickAffordanceInteractor(
-                        keyguardInteractor = keyguardInteractor,
-                        shadeInteractor = shadeInteractor,
-                        lockPatternUtils = lockPatternUtils,
-                        keyguardStateController = keyguardStateController,
-                        userTracker = userTracker,
-                        activityStarter = activityStarter,
-                        featureFlags = featureFlags,
-                        repository = { quickAffordanceRepository },
-                        launchAnimator = launchAnimator,
-                        logger = logger,
-                        metricsLogger = metricsLogger,
-                        devicePolicyManager = devicePolicyManager,
-                        dockManager = dockManager,
-                        biometricSettingsRepository = biometricSettingsRepository,
-                        backgroundDispatcher = kosmos.testDispatcher,
-                        appContext = mContext,
-                        sceneInteractor = { kosmos.sceneInteractor },
-                    ),
-                keyguardInteractor = keyguardInteractor,
-                shadeInteractor = shadeInteractor,
-                aodToLockscreenTransitionViewModel = aodToLockscreenTransitionViewModel,
-                dozingToLockscreenTransitionViewModel = dozingToLockscreenTransitionViewModel,
-                dreamingHostedToLockscreenTransitionViewModel =
-                    dreamingHostedToLockscreenTransitionViewModel,
-                dreamingToLockscreenTransitionViewModel = dreamingToLockscreenTransitionViewModel,
-                goneToLockscreenTransitionViewModel = goneToLockscreenTransitionViewModel,
-                occludedToLockscreenTransitionViewModel = occludedToLockscreenTransitionViewModel,
-                offToLockscreenTransitionViewModel = offToLockscreenTransitionViewModel,
-                primaryBouncerToLockscreenTransitionViewModel =
-                    primaryBouncerToLockscreenTransitionViewModel,
-                glanceableHubToLockscreenTransitionViewModel =
-                    glanceableHubToLockscreenTransitionViewModel,
-                lockscreenToAodTransitionViewModel = lockscreenToAodTransitionViewModel,
-                lockscreenToDozingTransitionViewModel = lockscreenToDozingTransitionViewModel,
-                lockscreenToDreamingHostedTransitionViewModel =
-                    lockscreenToDreamingHostedTransitionViewModel,
-                lockscreenToDreamingTransitionViewModel = lockscreenToDreamingTransitionViewModel,
-                lockscreenToGoneTransitionViewModel = lockscreenToGoneTransitionViewModel,
-                lockscreenToOccludedTransitionViewModel = lockscreenToOccludedTransitionViewModel,
-                lockscreenToPrimaryBouncerTransitionViewModel =
-                    lockscreenToPrimaryBouncerTransitionViewModel,
-                lockscreenToGlanceableHubTransitionViewModel =
-                    lockscreenToGlanceableHubTransitionViewModel,
-                transitionInteractor = kosmos.keyguardTransitionInteractor,
-            )
-    }
-
-    @Test
-    fun startButton_present_visibleModel_startsActivityOnClick() =
-        testScope.runTest {
-            repository.setKeyguardShowing(true)
-            val latest = collectLastValue(underTest.startButton)
-
-            val testConfig =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = true,
-                    isActivated = true,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = testConfig,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = testConfig,
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun startButton_hiddenWhenDevicePolicyDisablesAllKeyguardFeatures() =
-        testScope.runTest {
-            whenever(devicePolicyManager.getKeyguardDisabledFeatures(null, userTracker.userId))
-                .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_ALL)
-            repository.setKeyguardShowing(true)
-            val latest by collectLastValue(underTest.startButton)
-
-            val testConfig =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = true,
-                    isActivated = true,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = testConfig,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest,
-                testConfig =
-                    TestConfig(
-                        isVisible = false,
-                        slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                    ),
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    @EnableFlags(com.android.systemui.shared.Flags.FLAG_NEW_CUSTOMIZATION_PICKER_UI)
-    fun startButton_inPreviewMode_onPreviewQuickAffordanceSelected() =
-        testScope.runTest {
-            underTest.onPreviewSlotSelected(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START)
-            underTest.enablePreviewMode(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START, true)
-
-            repository.setKeyguardShowing(false)
-            val latest = collectLastValue(underTest.startButton)
-
-            val icon: Icon = mock()
-            val testConfig =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = true,
-                    isActivated = true,
-                    icon = icon,
-                    canShowWhileLocked = false,
-                    intent = null,
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val defaultConfigKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = testConfig,
-                )
-
-            // Set up the quick access wallet config
-            val quickAccessWalletAffordanceConfigKey =
-                quickAccessWalletAffordanceConfig
-                    .apply {
-                        onTriggeredResult =
-                            KeyguardQuickAffordanceConfig.OnTriggeredResult.StartActivity(
-                                intent = Intent("action"),
-                                canShowWhileLocked = false,
-                            )
-                        setState(
-                            KeyguardQuickAffordanceConfig.LockScreenState.Visible(
-                                icon = icon,
-                                activationState = ActivationState.Active,
-                            )
-                        )
-                    }
-                    .let {
-                        KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId() +
-                            "::${quickAccessWalletAffordanceConfig.key}"
-                    }
-
-            // onPreviewQuickAffordanceSelected should trigger the override with the quick access
-            // wallet quick affordance
-            underTest.onPreviewQuickAffordanceSelected(
-                KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START,
-                BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET,
-            )
-            Truth.assertThat(latest()?.configKey).isEqualTo(quickAccessWalletAffordanceConfigKey)
-
-            // onClearPreviewQuickAffordances should make the default quick affordance shows again
-            underTest.onClearPreviewQuickAffordances()
-            Truth.assertThat(latest()?.configKey).isEqualTo(defaultConfigKey)
-        }
-
-    @Test
-    fun startButton_inPreviewMode_visibleEvenWhenKeyguardNotShowing() =
-        testScope.runTest {
-            underTest.onPreviewSlotSelected(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START)
-            underTest.enablePreviewMode(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START, true)
-
-            repository.setKeyguardShowing(false)
-            val latest = collectLastValue(underTest.startButton)
-
-            val icon: Icon = mock()
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig =
-                        TestConfig(
-                            isVisible = true,
-                            isClickable = true,
-                            isActivated = true,
-                            icon = icon,
-                            canShowWhileLocked = false,
-                            intent = Intent("action"),
-                            slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                        ),
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig =
-                    TestConfig(
-                        isVisible = true,
-                        isClickable = false,
-                        isActivated = false,
-                        icon = icon,
-                        canShowWhileLocked = false,
-                        intent = Intent("action"),
-                        isSelected = true,
-                        slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                    ),
-                configKey = configKey,
-            )
-            Truth.assertThat(latest()?.isSelected).isTrue()
-        }
-
-    @Test
-    fun endButton_inHighlightedPreviewMode_dimmedWhenOtherIsSelected() =
-        testScope.runTest {
-            underTest.onPreviewSlotSelected(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START)
-            underTest.enablePreviewMode(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START, true)
-
-            repository.setKeyguardShowing(false)
-            val endButton = collectLastValue(underTest.endButton)
-
-            val icon: Icon = mock()
-            setUpQuickAffordanceModel(
-                position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                testConfig =
-                    TestConfig(
-                        isVisible = true,
-                        isClickable = true,
-                        isActivated = true,
-                        icon = icon,
-                        canShowWhileLocked = false,
-                        intent = Intent("action"),
-                        slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                    ),
-            )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_END,
-                    testConfig =
-                        TestConfig(
-                            isVisible = true,
-                            isClickable = true,
-                            isActivated = true,
-                            icon = icon,
-                            canShowWhileLocked = false,
-                            intent = Intent("action"),
-                            slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
-                        ),
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = endButton(),
-                testConfig =
-                    TestConfig(
-                        isVisible = true,
-                        isClickable = false,
-                        isActivated = false,
-                        icon = icon,
-                        canShowWhileLocked = false,
-                        intent = Intent("action"),
-                        isDimmed = true,
-                        slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
-                    ),
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun endButton_present_visibleModel_doNothingOnClick() =
-        testScope.runTest {
-            repository.setKeyguardShowing(true)
-            val latest = collectLastValue(underTest.endButton)
-
-            val config =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = true,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent =
-                        null, // This will cause it to tell the system that the click was handled.
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_END,
-                    testConfig = config,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = config,
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun startButton_notPresent_modelIsHidden() =
-        testScope.runTest {
-            val latest = collectLastValue(underTest.startButton)
-
-            val config =
-                TestConfig(
-                    isVisible = false,
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = config,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = config,
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun animateButtonReveal() =
-        testScope.runTest {
-            repository.setKeyguardShowing(true)
-            val testConfig =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = true,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-
-            setUpQuickAffordanceModel(
-                position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                testConfig = testConfig,
-            )
-
-            val value = collectLastValue(underTest.startButton.map { it.animateReveal })
-
-            Truth.assertThat(value()).isFalse()
-            repository.setAnimateDozingTransitions(true)
-            Truth.assertThat(value()).isTrue()
-            repository.setAnimateDozingTransitions(false)
-            Truth.assertThat(value()).isFalse()
-        }
-
-    @Test
-    fun isClickable_trueWhenAlphaAtThreshold() =
-        testScope.runTest {
-            repository.setKeyguardShowing(true)
-            repository.setKeyguardAlpha(
-                KeyguardQuickAffordancesCombinedViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD
-            )
-
-            val testConfig =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = true,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = testConfig,
-                )
-
-            val latest = collectLastValue(underTest.startButton)
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = testConfig,
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun isClickable_trueWhenAlphaAboveThreshold() =
-        testScope.runTest {
-            repository.setKeyguardShowing(true)
-            val latest = collectLastValue(underTest.startButton)
-            repository.setKeyguardAlpha(
-                min(
-                    1f,
-                    KeyguardQuickAffordancesCombinedViewModel
-                        .AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD + 0.1f
-                ),
-            )
-
-            val testConfig =
-                TestConfig(
-                    isVisible = true,
-                    isClickable = true,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = testConfig,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = testConfig,
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun isClickable_falseWhenAlphaBelowThreshold() =
-        testScope.runTest {
-            intendedAlphaMutableStateFlow.value =
-                KeyguardQuickAffordancesCombinedViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD -
-                    .1f
-            // the viewModel does a `map { 1 - it }` on this value, which is why it's different
-            intendedShadeAlphaMutableStateFlow.value =
-                KeyguardQuickAffordancesCombinedViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD +
-                    .1f
-            repository.setKeyguardShowing(true)
-            val latest = collectLastValue(underTest.startButton)
-
-            val testConfig =
-                TestConfig(
-                    isVisible = false,
-                    isClickable = false,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = testConfig,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = testConfig,
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun isClickable_falseWhenAlphaAtZero() =
-        testScope.runTest {
-            intendedAlphaMutableStateFlow.value = 0f
-            intendedShadeAlphaMutableStateFlow.value = 1f
-            repository.setKeyguardShowing(true)
-            val latest = collectLastValue(underTest.startButton)
-
-            val testConfig =
-                TestConfig(
-                    isVisible = false,
-                    isClickable = false,
-                    icon = mock(),
-                    canShowWhileLocked = false,
-                    intent = Intent("action"),
-                    slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
-                )
-            val configKey =
-                setUpQuickAffordanceModel(
-                    position = KeyguardQuickAffordancePosition.BOTTOM_START,
-                    testConfig = testConfig,
-                )
-
-            assertQuickAffordanceViewModel(
-                viewModel = latest(),
-                testConfig = testConfig,
-                configKey = configKey,
-            )
-        }
-
-    @Test
-    fun shadeExpansionAlpha_changes_whenOnLockscreen() =
-        testScope.runTest {
-            kosmos.setTransition(
-                sceneTransition = Idle(Scenes.Lockscreen),
-                stateTransition = TransitionStep(from = AOD, to = LOCKSCREEN)
-            )
-            intendedShadeAlphaMutableStateFlow.value = 0.25f
-            val underTest = collectLastValue(underTest.transitionAlpha)
-            assertEquals(0.75f, underTest())
-
-            intendedShadeAlphaMutableStateFlow.value = 0.3f
-            assertEquals(0.7f, underTest())
-        }
-
-    @Test
-    fun shadeExpansionAlpha_alwaysZero_whenNotOnLockscreen() =
-        testScope.runTest {
-            kosmos.setTransition(
-                sceneTransition = Idle(Scenes.Gone),
-                stateTransition = TransitionStep(from = AOD, to = GONE)
-            )
-            intendedShadeAlphaMutableStateFlow.value = 0.5f
-            val underTest = collectLastValue(underTest.transitionAlpha)
-            assertEquals(0f, underTest())
-
-            intendedShadeAlphaMutableStateFlow.value = 0.25f
-            assertEquals(0f, underTest())
-        }
-
-    private suspend fun setUpQuickAffordanceModel(
-        position: KeyguardQuickAffordancePosition,
-        testConfig: TestConfig,
-    ): String {
-        val config =
-            when (position) {
-                KeyguardQuickAffordancePosition.BOTTOM_START -> homeControlsQuickAffordanceConfig
-                KeyguardQuickAffordancePosition.BOTTOM_END -> quickAccessWalletAffordanceConfig
-            }
-
-        val lockScreenState =
-            if (testConfig.isVisible) {
-                if (testConfig.intent != null) {
-                    config.onTriggeredResult =
-                        KeyguardQuickAffordanceConfig.OnTriggeredResult.StartActivity(
-                            intent = testConfig.intent,
-                            canShowWhileLocked = testConfig.canShowWhileLocked,
-                        )
-                }
-                KeyguardQuickAffordanceConfig.LockScreenState.Visible(
-                    icon = testConfig.icon ?: error("Icon is unexpectedly null!"),
-                    activationState =
-                        when (testConfig.isActivated) {
-                            true -> ActivationState.Active
-                            false -> ActivationState.Inactive
-                        }
-                )
-            } else {
-                KeyguardQuickAffordanceConfig.LockScreenState.Hidden
-            }
-        config.setState(lockScreenState)
-        return "${position.toSlotId()}::${config.key}"
-    }
-
-    private fun assertQuickAffordanceViewModel(
-        viewModel: KeyguardQuickAffordanceViewModel?,
-        testConfig: TestConfig,
-        configKey: String,
-    ) {
-        checkNotNull(viewModel)
-        Truth.assertThat(viewModel.isVisible).isEqualTo(testConfig.isVisible)
-        Truth.assertThat(viewModel.isClickable).isEqualTo(testConfig.isClickable)
-        Truth.assertThat(viewModel.isActivated).isEqualTo(testConfig.isActivated)
-        Truth.assertThat(viewModel.isSelected).isEqualTo(testConfig.isSelected)
-        Truth.assertThat(viewModel.isDimmed).isEqualTo(testConfig.isDimmed)
-        Truth.assertThat(viewModel.slotId).isEqualTo(testConfig.slotId)
-        if (testConfig.isVisible) {
-            Truth.assertThat(viewModel.icon).isEqualTo(testConfig.icon)
-            viewModel.onClicked.invoke(
-                KeyguardQuickAffordanceViewModel.OnClickedParameters(
-                    configKey = configKey,
-                    expandable = expandable,
-                    slotId = viewModel.slotId,
-                )
-            )
-            if (testConfig.intent != null) {
-                Truth.assertThat(Mockito.mockingDetails(activityStarter).invocations).hasSize(1)
-            } else {
-                Mockito.verifyZeroInteractions(activityStarter)
-            }
-        } else {
-            Truth.assertThat(viewModel.isVisible).isFalse()
-        }
-    }
-
-    private data class TestConfig(
-        val isVisible: Boolean,
-        val isClickable: Boolean = false,
-        val isActivated: Boolean = false,
-        val icon: Icon? = null,
-        val canShowWhileLocked: Boolean = false,
-        val intent: Intent? = null,
-        val isSelected: Boolean = false,
-        val isDimmed: Boolean = false,
-        val slotId: String = ""
-    ) {
-        init {
-            check(!isVisible || icon != null) { "Must supply non-null icon if visible!" }
-        }
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImplTest.kt
index d32d8cc..fb376ce 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImplTest.kt
@@ -1890,7 +1890,7 @@
 
         // Callback gets an updated state
         val state = PlaybackState.Builder().setState(PlaybackState.STATE_PLAYING, 0L, 1f).build()
-        stateCallbackCaptor.value.invoke(KEY, state)
+        onStateUpdated(KEY, state)
 
         // Listener is notified of updated state
         verify(listener)
@@ -1911,7 +1911,7 @@
 
         // No media added with this key
 
-        stateCallbackCaptor.value.invoke(KEY, state)
+        onStateUpdated(KEY, state)
         verify(listener, never())
             .onMediaDataLoaded(eq(KEY), any(), any(), anyBoolean(), anyInt(), anyBoolean())
     }
@@ -1928,7 +1928,7 @@
         val state = PlaybackState.Builder().build()
 
         // Then no changes are made
-        stateCallbackCaptor.value.invoke(KEY, state)
+        onStateUpdated(KEY, state)
         verify(listener, never())
             .onMediaDataLoaded(eq(KEY), any(), any(), anyBoolean(), anyInt(), anyBoolean())
     }
@@ -1939,7 +1939,7 @@
         whenever(controller.playbackState).thenReturn(state)
 
         addNotificationAndLoad()
-        stateCallbackCaptor.value.invoke(KEY, state)
+        onStateUpdated(KEY, state)
 
         verify(listener)
             .onMediaDataLoaded(
@@ -1983,7 +1983,7 @@
             backgroundExecutor.runAllReady()
             foregroundExecutor.runAllReady()
 
-            stateCallbackCaptor.value.invoke(PACKAGE_NAME, state)
+            onStateUpdated(PACKAGE_NAME, state)
 
             verify(listener)
                 .onMediaDataLoaded(
@@ -2008,7 +2008,7 @@
                 .build()
 
         addNotificationAndLoad()
-        stateCallbackCaptor.value.invoke(KEY, state)
+        onStateUpdated(KEY, state)
 
         verify(listener)
             .onMediaDataLoaded(
@@ -2518,4 +2518,10 @@
                 eq(false),
             )
     }
+
+    private fun onStateUpdated(key: String, state: PlaybackState) {
+        stateCallbackCaptor.value.invoke(key, state)
+        backgroundExecutor.runAllReady()
+        foregroundExecutor.runAllReady()
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessorTest.kt
index 90af932..7d364bd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessorTest.kt
@@ -1967,7 +1967,7 @@
 
         // Callback gets an updated state
         val state = PlaybackState.Builder().setState(PlaybackState.STATE_PLAYING, 0L, 1f).build()
-        stateCallbackCaptor.value.invoke(KEY, state)
+        testScope.onStateUpdated(KEY, state)
 
         // Listener is notified of updated state
         verify(listener)
@@ -1988,7 +1988,7 @@
 
         // No media added with this key
 
-        stateCallbackCaptor.value.invoke(KEY, state)
+        testScope.onStateUpdated(KEY, state)
         verify(listener, never())
             .onMediaDataLoaded(eq(KEY), any(), any(), anyBoolean(), anyInt(), anyBoolean())
     }
@@ -2005,7 +2005,7 @@
         val state = PlaybackState.Builder().build()
 
         // Then no changes are made
-        stateCallbackCaptor.value.invoke(KEY, state)
+        testScope.onStateUpdated(KEY, state)
         verify(listener, never())
             .onMediaDataLoaded(eq(KEY), any(), any(), anyBoolean(), anyInt(), anyBoolean())
     }
@@ -2016,7 +2016,7 @@
         whenever(controller.playbackState).thenReturn(state)
 
         addNotificationAndLoad()
-        stateCallbackCaptor.value.invoke(KEY, state)
+        testScope.onStateUpdated(KEY, state)
 
         verify(listener)
             .onMediaDataLoaded(
@@ -2059,7 +2059,7 @@
         backgroundExecutor.runAllReady()
         foregroundExecutor.runAllReady()
 
-        stateCallbackCaptor.value.invoke(PACKAGE_NAME, state)
+        testScope.onStateUpdated(PACKAGE_NAME, state)
 
         verify(listener)
             .onMediaDataLoaded(
@@ -2084,7 +2084,7 @@
                 .build()
 
         addNotificationAndLoad()
-        stateCallbackCaptor.value.invoke(KEY, state)
+        testScope.onStateUpdated(KEY, state)
 
         verify(listener)
             .onMediaDataLoaded(
@@ -2603,4 +2603,11 @@
                 eq(false),
             )
     }
+
+    /** Helper function to update state and run executors */
+    private fun TestScope.onStateUpdated(key: String, state: PlaybackState) {
+        stateCallbackCaptor.value.invoke(key, state)
+        runCurrent()
+        advanceUntilIdle()
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListenerTest.kt
index 680df15..dcf32a5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListenerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListenerTest.kt
@@ -137,7 +137,7 @@
             MediaTestUtils.emptyMediaData.copy(
                 app = PACKAGE,
                 packageName = PACKAGE,
-                token = session.sessionToken
+                token = session.sessionToken,
             )
 
         resumeData = mediaData.copy(token = null, active = false, resumption = true)
@@ -237,7 +237,7 @@
         // Assuming we're registered
         testOnMediaDataLoaded_registersPlaybackListener()
 
-        mediaCallbackCaptor.value.onPlaybackStateChanged(
+        onPlaybackStateChanged(
             PlaybackState.Builder().setState(PlaybackState.STATE_PAUSED, 0L, 0f).build()
         )
         assertThat(mainExecutor.numPending()).isEqualTo(1)
@@ -249,7 +249,7 @@
         // Assuming we have a pending timeout
         testOnPlaybackStateChanged_schedulesTimeout_whenPaused()
 
-        mediaCallbackCaptor.value.onPlaybackStateChanged(
+        onPlaybackStateChanged(
             PlaybackState.Builder().setState(PlaybackState.STATE_PLAYING, 0L, 0f).build()
         )
         assertThat(mainExecutor.numPending()).isEqualTo(0)
@@ -261,7 +261,7 @@
         // Assuming we have a pending timeout
         testOnPlaybackStateChanged_schedulesTimeout_whenPaused()
 
-        mediaCallbackCaptor.value.onPlaybackStateChanged(
+        onPlaybackStateChanged(
             PlaybackState.Builder().setState(PlaybackState.STATE_STOPPED, 0L, 0f).build()
         )
         assertThat(mainExecutor.numPending()).isEqualTo(1)
@@ -435,7 +435,7 @@
 
         // When the playback state changes, and has different actions
         val playingState = PlaybackState.Builder().setActions(PlaybackState.ACTION_PLAY).build()
-        mediaCallbackCaptor.value.onPlaybackStateChanged(playingState)
+        onPlaybackStateChanged(playingState)
         assertThat(uiExecutor.runAllReady()).isEqualTo(1)
 
         // Then the callback is invoked
@@ -448,7 +448,7 @@
             PlaybackState.CustomAction.Builder(
                     "ACTION_1",
                     "custom action 1",
-                    android.R.drawable.ic_media_ff
+                    android.R.drawable.ic_media_ff,
                 )
                 .build()
         val pausedState =
@@ -463,7 +463,7 @@
             PlaybackState.CustomAction.Builder(
                     "ACTION_2",
                     "custom action 2",
-                    android.R.drawable.ic_media_rew
+                    android.R.drawable.ic_media_rew,
                 )
                 .build()
         val pausedStateTwoActions =
@@ -472,7 +472,7 @@
                 .addCustomAction(customOne)
                 .addCustomAction(customTwo)
                 .build()
-        mediaCallbackCaptor.value.onPlaybackStateChanged(pausedStateTwoActions)
+        onPlaybackStateChanged(pausedStateTwoActions)
         assertThat(uiExecutor.runAllReady()).isEqualTo(1)
 
         // Then the callback is invoked
@@ -485,7 +485,7 @@
         loadMediaDataWithPlaybackState(stateWithActions)
 
         // When the playback state updates with the same actions
-        mediaCallbackCaptor.value.onPlaybackStateChanged(stateWithActions)
+        onPlaybackStateChanged(stateWithActions)
 
         // Then the callback is not invoked again
         verify(stateCallback, never()).invoke(eq(KEY), any())
@@ -512,7 +512,7 @@
                 .setActions(PlaybackState.ACTION_PAUSE)
                 .addCustomAction(customTwo)
                 .build()
-        mediaCallbackCaptor.value.onPlaybackStateChanged(stateTwo)
+        onPlaybackStateChanged(stateTwo)
 
         // Then the callback is not invoked
         verify(stateCallback, never()).invoke(eq(KEY), any())
@@ -544,7 +544,7 @@
         // When the playback state changes to playing
         val playingState =
             PlaybackState.Builder().setState(PlaybackState.STATE_PLAYING, 0L, 1f).build()
-        mediaCallbackCaptor.value.onPlaybackStateChanged(playingState)
+        onPlaybackStateChanged(playingState)
         uiExecutor.runAllReady()
 
         // Then the callback is invoked
@@ -561,7 +561,7 @@
         // When the playback state is updated, but still not playing
         val playingState =
             PlaybackState.Builder().setState(PlaybackState.STATE_STOPPED, 0L, 0f).build()
-        mediaCallbackCaptor.value.onPlaybackStateChanged(playingState)
+        onPlaybackStateChanged(playingState)
 
         // Then the callback is not invoked
         verify(stateCallback, never()).invoke(eq(KEY), eq(playingState!!))
@@ -571,7 +571,7 @@
     fun testTimeoutCallback_dozedPastTimeout_invokedOnWakeup() {
         // When paused media is loaded
         testOnMediaDataLoaded_registersPlaybackListener()
-        mediaCallbackCaptor.value.onPlaybackStateChanged(
+        onPlaybackStateChanged(
             PlaybackState.Builder().setState(PlaybackState.STATE_PAUSED, 0L, 0f).build()
         )
         verify(statusBarStateController).addCallback(capture(dozingCallbackCaptor))
@@ -597,7 +597,7 @@
         val time = clock.currentTimeMillis()
         clock.setElapsedRealtime(time)
         testOnMediaDataLoaded_registersPlaybackListener()
-        mediaCallbackCaptor.value.onPlaybackStateChanged(
+        onPlaybackStateChanged(
             PlaybackState.Builder().setState(PlaybackState.STATE_PAUSED, 0L, 0f).build()
         )
         verify(statusBarStateController).addCallback(capture(dozingCallbackCaptor))
@@ -706,4 +706,9 @@
         bgExecutor.runAllReady()
         uiExecutor.runAllReady()
     }
+
+    private fun onPlaybackStateChanged(state: PlaybackState) {
+        mediaCallbackCaptor.value.onPlaybackStateChanged(state)
+        bgExecutor.runAllReady()
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerTest.kt
index 03667cf..570c640 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerTest.kt
@@ -21,19 +21,19 @@
 import android.content.res.Configuration
 import android.database.ContentObserver
 import android.os.LocaleList
+import android.platform.test.flag.junit.FlagsParameterization
 import android.provider.Settings
 import android.testing.TestableLooper
 import android.util.MathUtils.abs
 import android.view.View
-import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.compose.animation.scene.SceneKey
 import com.android.internal.logging.InstanceId
 import com.android.keyguard.KeyguardUpdateMonitor
 import com.android.keyguard.KeyguardUpdateMonitorCallback
+import com.android.systemui.Flags.mediaControlsUmoInflationInBackground
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.flags.DisableSceneContainer
@@ -71,7 +71,6 @@
 import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider
 import com.android.systemui.statusbar.policy.ConfigurationController
 import com.android.systemui.testKosmos
-import com.android.systemui.util.concurrency.DelayableExecutor
 import com.android.systemui.util.concurrency.FakeExecutor
 import com.android.systemui.util.settings.GlobalSettings
 import com.android.systemui.util.settings.unconfinedDispatcherFakeSettings
@@ -106,6 +105,8 @@
 import org.mockito.kotlin.any
 import org.mockito.kotlin.capture
 import org.mockito.kotlin.eq
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
 
 private val DATA = MediaTestUtils.emptyMediaData
 
@@ -116,8 +117,8 @@
 @ExperimentalCoroutinesApi
 @SmallTest
 @TestableLooper.RunWithLooper(setAsMainLooper = true)
-@RunWith(AndroidJUnit4::class)
-class MediaCarouselControllerTest : SysuiTestCase() {
+@RunWith(ParameterizedAndroidJunit4::class)
+class MediaCarouselControllerTest(flags: FlagsParameterization) : SysuiTestCase() {
     private val kosmos = testKosmos()
     private val testDispatcher = kosmos.unconfinedTestDispatcher
     private val secureSettings = kosmos.unconfinedDispatcherFakeSettings
@@ -129,7 +130,6 @@
     @Mock lateinit var mediaHostStatesManager: MediaHostStatesManager
     @Mock lateinit var mediaHostState: MediaHostState
     @Mock lateinit var activityStarter: ActivityStarter
-    @Mock @Main private lateinit var executor: DelayableExecutor
     @Mock lateinit var mediaDataManager: MediaDataManager
     @Mock lateinit var configurationController: ConfigurationController
     @Mock lateinit var falsingManager: FalsingManager
@@ -153,16 +153,33 @@
 
     private val clock = FakeSystemClock()
     private lateinit var bgExecutor: FakeExecutor
+    private lateinit var uiExecutor: FakeExecutor
     private lateinit var mediaCarouselController: MediaCarouselController
 
     private var originalResumeSetting =
         Settings.Secure.getInt(context.contentResolver, Settings.Secure.MEDIA_CONTROLS_RESUME, 1)
 
+    companion object {
+        @JvmStatic
+        @Parameters(name = "{0}")
+        fun getParams(): List<FlagsParameterization> {
+            return FlagsParameterization.progressionOf(
+                com.android.systemui.Flags.FLAG_MEDIA_CONTROLS_UMO_INFLATION_IN_BACKGROUND
+            )
+        }
+    }
+
+    init {
+        mSetFlagsRule.setFlagsParameterization(flags)
+    }
+
     @Before
     fun setup() {
         MockitoAnnotations.initMocks(this)
         context.resources.configuration.setLocales(LocaleList(Locale.US, Locale.UK))
         bgExecutor = FakeExecutor(clock)
+        uiExecutor = FakeExecutor(clock)
+
         mediaCarouselController =
             MediaCarouselController(
                 applicationScope = kosmos.applicationCoroutineScope,
@@ -173,7 +190,7 @@
                 activityStarter = activityStarter,
                 systemClock = clock,
                 mainDispatcher = kosmos.testDispatcher,
-                executor = executor,
+                uiExecutor = uiExecutor,
                 bgExecutor = bgExecutor,
                 backgroundDispatcher = testDispatcher,
                 mediaManager = mediaDataManager,
@@ -201,10 +218,11 @@
         whenever(mediaFlags.isPersistentSsCardEnabled()).thenReturn(false)
         MediaPlayerData.clear()
         FakeExecutor.exhaustExecutors(bgExecutor)
+        FakeExecutor.exhaustExecutors(uiExecutor)
         verify(globalSettings)
             .registerContentObserverSync(
                 eq(Settings.Global.getUriFor(Settings.Global.ANIMATOR_DURATION_SCALE)),
-                capture(settingsObserverCaptor)
+                capture(settingsObserverCaptor),
             )
     }
 
@@ -213,7 +231,7 @@
         Settings.Secure.putInt(
             context.contentResolver,
             Settings.Secure.MEDIA_CONTROLS_RESUME,
-            originalResumeSetting
+            originalResumeSetting,
         )
     }
 
@@ -227,9 +245,9 @@
                     active = true,
                     isPlaying = true,
                     playbackLocation = MediaData.PLAYBACK_LOCAL,
-                    resumption = false
+                    resumption = false,
                 ),
-                4500L
+                4500L,
             )
 
         val playingCast =
@@ -239,9 +257,9 @@
                     active = true,
                     isPlaying = true,
                     playbackLocation = MediaData.PLAYBACK_CAST_LOCAL,
-                    resumption = false
+                    resumption = false,
                 ),
-                5000L
+                5000L,
             )
 
         val pausedLocal =
@@ -251,9 +269,9 @@
                     active = true,
                     isPlaying = false,
                     playbackLocation = MediaData.PLAYBACK_LOCAL,
-                    resumption = false
+                    resumption = false,
                 ),
-                1000L
+                1000L,
             )
 
         val pausedCast =
@@ -263,9 +281,9 @@
                     active = true,
                     isPlaying = false,
                     playbackLocation = MediaData.PLAYBACK_CAST_LOCAL,
-                    resumption = false
+                    resumption = false,
                 ),
-                2000L
+                2000L,
             )
 
         val playingRcn =
@@ -275,9 +293,9 @@
                     active = true,
                     isPlaying = true,
                     playbackLocation = MediaData.PLAYBACK_CAST_REMOTE,
-                    resumption = false
+                    resumption = false,
                 ),
-                5000L
+                5000L,
             )
 
         val pausedRcn =
@@ -287,9 +305,9 @@
                     active = true,
                     isPlaying = false,
                     playbackLocation = MediaData.PLAYBACK_CAST_REMOTE,
-                    resumption = false
+                    resumption = false,
                 ),
-                5000L
+                5000L,
             )
 
         val active =
@@ -299,9 +317,9 @@
                     active = true,
                     isPlaying = false,
                     playbackLocation = MediaData.PLAYBACK_LOCAL,
-                    resumption = true
+                    resumption = true,
                 ),
-                250L
+                250L,
             )
 
         val resume1 =
@@ -311,9 +329,9 @@
                     active = false,
                     isPlaying = false,
                     playbackLocation = MediaData.PLAYBACK_LOCAL,
-                    resumption = true
+                    resumption = true,
                 ),
-                500L
+                500L,
             )
 
         val resume2 =
@@ -323,9 +341,9 @@
                     active = false,
                     isPlaying = false,
                     playbackLocation = MediaData.PLAYBACK_LOCAL,
-                    resumption = true
+                    resumption = true,
                 ),
-                1000L
+                1000L,
             )
 
         val activeMoreRecent =
@@ -336,9 +354,9 @@
                     isPlaying = false,
                     playbackLocation = MediaData.PLAYBACK_LOCAL,
                     resumption = true,
-                    lastActive = 2L
+                    lastActive = 2L,
                 ),
-                1000L
+                1000L,
             )
 
         val activeLessRecent =
@@ -349,9 +367,9 @@
                     isPlaying = false,
                     playbackLocation = MediaData.PLAYBACK_LOCAL,
                     resumption = true,
-                    lastActive = 1L
+                    lastActive = 1L,
                 ),
-                1000L
+                1000L,
             )
         // Expected ordering for media players:
         // Actively playing local sessions
@@ -370,7 +388,7 @@
                 pausedRcn,
                 active,
                 resume2,
-                resume1
+                resume1,
             )
 
         expected.forEach {
@@ -380,7 +398,7 @@
                 it.second.copy(notificationKey = it.first),
                 panel,
                 clock,
-                isSsReactivated = false
+                isSsReactivated = false,
             )
         }
 
@@ -403,7 +421,7 @@
             EMPTY_SMARTSPACE_MEDIA_DATA.copy(isActive = true),
             panel,
             true,
-            clock
+            clock,
         )
 
         // Then it should be shown immediately after any actively playing controls
@@ -421,7 +439,7 @@
         listener.value.onSmartspaceMediaDataLoaded(
             SMARTSPACE_KEY,
             EMPTY_SMARTSPACE_MEDIA_DATA.copy(isActive = true),
-            true
+            true,
         )
 
         // Then it should be shown immediately after any actively playing controls
@@ -439,7 +457,7 @@
             EMPTY_SMARTSPACE_MEDIA_DATA.copy(isActive = true),
             panel,
             false,
-            clock
+            clock,
         )
 
         // Then it should be shown at the end of the carousel's active entries
@@ -461,8 +479,8 @@
                 active = true,
                 isPlaying = true,
                 playbackLocation = MediaData.PLAYBACK_LOCAL,
-                resumption = false
-            )
+                resumption = false,
+            ),
         )
         listener.value.onMediaDataLoaded(
             PLAYING_LOCAL,
@@ -471,19 +489,20 @@
                 active = true,
                 isPlaying = false,
                 playbackLocation = MediaData.PLAYBACK_LOCAL,
-                resumption = true
-            )
+                resumption = true,
+            ),
         )
+        runAllReady()
 
         assertEquals(
             MediaPlayerData.getMediaPlayerIndex(PAUSED_LOCAL),
-            mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex
+            mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex,
         )
         // paused player order should stays the same in visibleMediaPLayer map.
         // paused player order should be first in mediaPlayer map.
         assertEquals(
             MediaPlayerData.visiblePlayerKeys().elementAt(3),
-            MediaPlayerData.playerKeys().elementAt(0)
+            MediaPlayerData.playerKeys().elementAt(0),
         )
     }
 
@@ -506,7 +525,7 @@
         mediaCarouselController.onDesiredLocationChanged(
             LOCATION_QS,
             mediaHostState,
-            animate = false
+            animate = false,
         )
         bgExecutor.runAllReady()
         verify(logger).logCarouselPosition(LOCATION_QS)
@@ -517,7 +536,7 @@
         mediaCarouselController.onDesiredLocationChanged(
             MediaHierarchyManager.LOCATION_QQS,
             mediaHostState,
-            animate = false
+            animate = false,
         )
         bgExecutor.runAllReady()
         verify(logger).logCarouselPosition(MediaHierarchyManager.LOCATION_QQS)
@@ -528,7 +547,7 @@
         mediaCarouselController.onDesiredLocationChanged(
             MediaHierarchyManager.LOCATION_LOCKSCREEN,
             mediaHostState,
-            animate = false
+            animate = false,
         )
         bgExecutor.runAllReady()
         verify(logger).logCarouselPosition(MediaHierarchyManager.LOCATION_LOCKSCREEN)
@@ -539,7 +558,7 @@
         mediaCarouselController.onDesiredLocationChanged(
             MediaHierarchyManager.LOCATION_DREAM_OVERLAY,
             mediaHostState,
-            animate = false
+            animate = false,
         )
         bgExecutor.runAllReady()
         verify(logger).logCarouselPosition(MediaHierarchyManager.LOCATION_DREAM_OVERLAY)
@@ -570,8 +589,8 @@
                 active = true,
                 isPlaying = true,
                 playbackLocation = MediaData.PLAYBACK_LOCAL,
-                resumption = false
-            )
+                resumption = false,
+            ),
         )
         listener.value.onMediaDataLoaded(
             PAUSED_LOCAL,
@@ -580,14 +599,15 @@
                 active = true,
                 isPlaying = false,
                 playbackLocation = MediaData.PLAYBACK_LOCAL,
-                resumption = false
-            )
+                resumption = false,
+            ),
         )
+        runAllReady()
         // adding a media recommendation card.
         listener.value.onSmartspaceMediaDataLoaded(
             SMARTSPACE_KEY,
             EMPTY_SMARTSPACE_MEDIA_DATA,
-            false
+            false,
         )
         mediaCarouselController.shouldScrollToKey = true
         // switching between media players.
@@ -598,8 +618,8 @@
                 active = true,
                 isPlaying = false,
                 playbackLocation = MediaData.PLAYBACK_LOCAL,
-                resumption = true
-            )
+                resumption = true,
+            ),
         )
         listener.value.onMediaDataLoaded(
             PAUSED_LOCAL,
@@ -608,13 +628,14 @@
                 active = true,
                 isPlaying = true,
                 playbackLocation = MediaData.PLAYBACK_LOCAL,
-                resumption = false
-            )
+                resumption = false,
+            ),
         )
+        runAllReady()
 
         assertEquals(
             MediaPlayerData.getMediaPlayerIndex(PAUSED_LOCAL),
-            mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex
+            mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex,
         )
     }
 
@@ -626,7 +647,7 @@
         listener.value.onSmartspaceMediaDataLoaded(
             SMARTSPACE_KEY,
             EMPTY_SMARTSPACE_MEDIA_DATA.copy(packageName = "PACKAGE_NAME", isActive = true),
-            false
+            false,
         )
         listener.value.onMediaDataLoaded(
             PLAYING_LOCAL,
@@ -635,14 +656,15 @@
                 active = true,
                 isPlaying = true,
                 playbackLocation = MediaData.PLAYBACK_LOCAL,
-                resumption = false
-            )
+                resumption = false,
+            ),
         )
+        runAllReady()
 
         var playerIndex = MediaPlayerData.getMediaPlayerIndex(PLAYING_LOCAL)
         assertEquals(
             playerIndex,
-            mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex
+            mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex,
         )
         assertEquals(playerIndex, 0)
 
@@ -657,9 +679,10 @@
                 isPlaying = true,
                 playbackLocation = MediaData.PLAYBACK_LOCAL,
                 resumption = false,
-                packageName = "PACKAGE_NAME"
-            )
+                packageName = "PACKAGE_NAME",
+            ),
         )
+        runAllReady()
         playerIndex = MediaPlayerData.getMediaPlayerIndex(PLAYING_LOCAL)
         assertEquals(playerIndex, 0)
     }
@@ -704,7 +727,7 @@
             player1.second.copy(notificationKey = player1.first),
             panel,
             clock,
-            isSsReactivated = false
+            isSsReactivated = false,
         )
 
         assertEquals(mediaCarouselController.getCurrentVisibleMediaContentIntent(), clickIntent1)
@@ -717,7 +740,7 @@
             player2.second.copy(notificationKey = player2.first),
             panel,
             clock,
-            isSsReactivated = false
+            isSsReactivated = false,
         )
 
         // mediaCarouselScrollHandler.visibleMediaIndex is unchanged (= 0), and the new player is
@@ -732,7 +755,7 @@
             player3.second.copy(notificationKey = player3.first),
             panel,
             clock,
-            isSsReactivated = false
+            isSsReactivated = false,
         )
 
         // mediaCarouselScrollHandler.visibleMediaIndex is unchanged (= 0), and the new player is
@@ -822,7 +845,7 @@
         listener.value.onSmartspaceMediaDataLoaded(
             SMARTSPACE_KEY,
             EMPTY_SMARTSPACE_MEDIA_DATA.copy(isActive = true),
-            true
+            true,
         )
 
         // Then the carousel is updated
@@ -841,7 +864,7 @@
         listener.value.onSmartspaceMediaDataLoaded(
             SMARTSPACE_KEY,
             EMPTY_SMARTSPACE_MEDIA_DATA,
-            false
+            false,
         )
 
         // Then it is added to the carousel with correct state
@@ -886,7 +909,7 @@
             transitionRepository.sendTransitionSteps(
                 from = KeyguardState.LOCKSCREEN,
                 to = KeyguardState.GONE,
-                this
+                this,
             )
 
             verify(mediaCarousel).visibility = View.VISIBLE
@@ -932,7 +955,7 @@
             transitionRepository.sendTransitionSteps(
                 from = KeyguardState.GONE,
                 to = KeyguardState.LOCKSCREEN,
-                this
+                this,
             )
 
             assertEquals(true, updatedVisibility)
@@ -961,7 +984,7 @@
             transitionRepository.sendTransitionSteps(
                 from = KeyguardState.GONE,
                 to = KeyguardState.LOCKSCREEN,
-                this
+                this,
             )
 
             assertEquals(true, updatedVisibility)
@@ -1125,12 +1148,14 @@
         Settings.Secure.putInt(context.contentResolver, Settings.Secure.MEDIA_CONTROLS_RESUME, 0)
         val pausedMedia = DATA.copy(isPlaying = false)
         listener.value.onMediaDataLoaded(PAUSED_LOCAL, PAUSED_LOCAL, pausedMedia)
+        runAllReady()
         mediaCarouselController.onSwipeToDismiss()
 
         // When it can be removed immediately on update
         whenever(visualStabilityProvider.isReorderingAllowed).thenReturn(true)
         val inactiveMedia = pausedMedia.copy(active = false)
         listener.value.onMediaDataLoaded(PAUSED_LOCAL, PAUSED_LOCAL, inactiveMedia)
+        runAllReady()
 
         // This is processed as a user-initiated dismissal
         verify(debugLogger).logMediaRemoved(eq(PAUSED_LOCAL), eq(true))
@@ -1148,12 +1173,14 @@
 
         val pausedMedia = DATA.copy(isPlaying = false)
         listener.value.onMediaDataLoaded(PAUSED_LOCAL, PAUSED_LOCAL, pausedMedia)
+        runAllReady()
         mediaCarouselController.onSwipeToDismiss()
 
         // When it can't be removed immediately on update
         whenever(visualStabilityProvider.isReorderingAllowed).thenReturn(false)
         val inactiveMedia = pausedMedia.copy(active = false)
         listener.value.onMediaDataLoaded(PAUSED_LOCAL, PAUSED_LOCAL, inactiveMedia)
+        runAllReady()
         visualStabilityCallback.value.onReorderingAllowed()
 
         // This is processed as a user-initiated dismissal
@@ -1175,8 +1202,8 @@
                 active = true,
                 isPlaying = true,
                 playbackLocation = MediaData.PLAYBACK_LOCAL,
-                resumption = false
-            )
+                resumption = false,
+            ),
         )
         listener.value.onMediaDataLoaded(
             PAUSED_LOCAL,
@@ -1185,18 +1212,20 @@
                 active = true,
                 isPlaying = false,
                 playbackLocation = MediaData.PLAYBACK_LOCAL,
-                resumption = false
-            )
+                resumption = false,
+            ),
         )
+        runAllReady()
 
         val playersSize = MediaPlayerData.players().size
         reset(pageIndicator)
         function()
+        runAllReady()
 
         assertEquals(playersSize, MediaPlayerData.players().size)
         assertEquals(
             MediaPlayerData.getMediaPlayerIndex(PLAYING_LOCAL),
-            mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex
+            mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex,
         )
     }
 
@@ -1225,4 +1254,11 @@
         )
         runCurrent()
     }
+
+    private fun runAllReady() {
+        if (mediaControlsUmoInflationInBackground()) {
+            bgExecutor.runAllReady()
+            uiExecutor.runAllReady()
+        }
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java
index c4f5d62..07e48b9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java
@@ -30,7 +30,7 @@
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 import android.app.KeyguardManager;
@@ -313,7 +313,7 @@
         mMediaSwitchingController.start(mCb);
 
         verify(mSessionMediaController, never()).registerCallback(any());
-        verifyZeroInteractions(mMediaSessionManager);
+        verifyNoMoreInteractions(mMediaSessionManager);
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/taskswitcher/MediaProjectionTaskSwitcherCoreStartableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/taskswitcher/MediaProjectionTaskSwitcherCoreStartableTest.kt
deleted file mode 100644
index 8fe8878..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/taskswitcher/MediaProjectionTaskSwitcherCoreStartableTest.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2023 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.systemui.mediaprojection.taskswitcher
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.Flags.FLAG_PSS_TASK_SWITCHER
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.mediaprojection.taskswitcher.ui.TaskSwitcherNotificationCoordinator
-import com.android.systemui.util.mockito.mock
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
-
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class MediaProjectionTaskSwitcherCoreStartableTest : SysuiTestCase() {
-
-    private val coordinator = mock<TaskSwitcherNotificationCoordinator>()
-
-    private val coreStartable =
-        MediaProjectionTaskSwitcherCoreStartable(notificationCoordinatorLazy = { coordinator })
-
-    @Test
-    fun start_flagEnabled_startsCoordinator() {
-        mSetFlagsRule.enableFlags(FLAG_PSS_TASK_SWITCHER)
-
-        coreStartable.start()
-
-        verify(coordinator).start()
-    }
-
-    @Test
-    fun start_flagDisabled_doesNotStartCoordinator() {
-        mSetFlagsRule.disableFlags(FLAG_PSS_TASK_SWITCHER)
-
-        coreStartable.start()
-
-        verifyZeroInteractions(coordinator)
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepositoryTest.kt
deleted file mode 100644
index 84ec1a5..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepositoryTest.kt
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.mediarouter.data.repository
-
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.statusbar.policy.CastDevice
-import com.android.systemui.statusbar.policy.fakeCastController
-import com.google.common.truth.Truth.assertThat
-import kotlin.test.Test
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-
-@SmallTest
-@OptIn(ExperimentalCoroutinesApi::class)
-class MediaRouterRepositoryTest : SysuiTestCase() {
-    val kosmos = Kosmos()
-    val testScope = kosmos.testScope
-    val castController = kosmos.fakeCastController
-
-    val underTest = kosmos.realMediaRouterRepository
-
-    @Test
-    fun castDevices_empty_isEmpty() =
-        testScope.runTest {
-            val latest by collectLastValue(underTest.castDevices)
-            // Required to let the listener attach before the devices get set
-            runCurrent()
-
-            castController.castDevices = emptyList()
-
-            assertThat(latest).isEmpty()
-        }
-
-    @Test
-    fun castDevices_onlyIncludesMediaRouterOriginDevices() =
-        testScope.runTest {
-            val latest by collectLastValue(underTest.castDevices)
-            // Required to let the listener attach before the devices get set
-            runCurrent()
-
-            val projectionDevice =
-                CastDevice(
-                    id = "idProjection",
-                    name = "name",
-                    description = "desc",
-                    state = CastDevice.CastState.Connected,
-                    origin = CastDevice.CastOrigin.MediaProjection,
-                )
-            val routerDevice1 =
-                CastDevice(
-                    id = "idRouter1",
-                    name = "name",
-                    description = "desc",
-                    state = CastDevice.CastState.Connected,
-                    origin = CastDevice.CastOrigin.MediaRouter,
-                )
-
-            val routerDevice2 =
-                CastDevice(
-                    id = "idRouter2",
-                    name = "name",
-                    description = "desc",
-                    state = CastDevice.CastState.Connected,
-                    origin = CastDevice.CastOrigin.MediaRouter,
-                )
-            castController.setCastDevices(listOf(projectionDevice, routerDevice1, routerDevice2))
-
-            assertThat(latest).containsExactly(routerDevice1, routerDevice2).inOrder()
-        }
-
-    @Test
-    fun stopCasting_notifiesCastController() {
-        val device =
-            CastDevice(
-                id = "id",
-                name = "name",
-                description = "desc",
-                state = CastDevice.CastState.Connected,
-                origin = CastDevice.CastOrigin.MediaRouter,
-            )
-
-        underTest.stopCasting(device)
-
-        assertThat(castController.lastStoppedDevice).isEqualTo(device)
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt
index 80a9e4c..d708489 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt
@@ -83,7 +83,7 @@
 import org.mockito.Mockito.never
 import org.mockito.Mockito.spy
 import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
+import org.mockito.Mockito.verifyNoMoreInteractions
 import org.mockito.MockitoAnnotations
 import org.mockito.kotlin.whenever
 
@@ -177,7 +177,7 @@
             )
 
         verify(eventLogger).logNoteTaskOpened(expectedInfo)
-        verifyZeroInteractions(bubbles, keyguardManager, userManager)
+        verifyNoMoreInteractions(bubbles, keyguardManager, userManager)
     }
 
     @Test
@@ -192,7 +192,7 @@
             )
 
         verify(eventLogger).logNoteTaskClosed(expectedInfo)
-        verifyZeroInteractions(bubbles, keyguardManager, userManager)
+        verifyNoMoreInteractions(bubbles, keyguardManager, userManager)
     }
 
     @Test
@@ -206,7 +206,7 @@
                 key = Bubble.getAppBubbleKeyForApp(expectedInfo.packageName, expectedInfo.user),
             )
 
-        verifyZeroInteractions(bubbles, keyguardManager, userManager, eventLogger)
+        verifyNoMoreInteractions(bubbles, keyguardManager, userManager, eventLogger)
     }
 
     @Test
@@ -220,7 +220,7 @@
                 key = Bubble.getAppBubbleKeyForApp(expectedInfo.packageName, expectedInfo.user),
             )
 
-        verifyZeroInteractions(bubbles, keyguardManager, userManager, eventLogger)
+        verifyNoMoreInteractions(bubbles, keyguardManager, userManager, eventLogger)
     }
 
     @Test
@@ -231,7 +231,7 @@
                 key = "any other key",
             )
 
-        verifyZeroInteractions(bubbles, keyguardManager, userManager, eventLogger)
+        verifyNoMoreInteractions(bubbles, keyguardManager, userManager, eventLogger)
     }
 
     @Test
@@ -242,7 +242,7 @@
                 key = Bubble.getAppBubbleKeyForApp(NOTE_TASK_INFO.packageName, NOTE_TASK_INFO.user),
             )
 
-        verifyZeroInteractions(bubbles, keyguardManager, userManager, eventLogger)
+        verifyNoMoreInteractions(bubbles, keyguardManager, userManager, eventLogger)
     }
 
     // endregion
@@ -275,7 +275,7 @@
         }
         assertThat(userCaptor.value).isEqualTo(user10)
         verify(eventLogger).logNoteTaskOpened(expectedInfo)
-        verifyZeroInteractions(bubbles)
+        verifyNoMoreInteractions(bubbles)
     }
 
     @Test
@@ -299,7 +299,7 @@
         }
         assertThat(userCaptor.value).isEqualTo(userTracker.userHandle)
         verify(eventLogger).logNoteTaskOpened(expectedInfo)
-        verifyZeroInteractions(bubbles)
+        verifyNoMoreInteractions(bubbles)
     }
 
     @Test
@@ -322,7 +322,7 @@
         }
         assertThat(userCaptor.value).isEqualTo(userTracker.userHandle)
         verify(eventLogger).logNoteTaskClosed(expectedInfo)
-        verifyZeroInteractions(bubbles)
+        verifyNoMoreInteractions(bubbles)
     }
 
     @Test
@@ -336,7 +336,7 @@
         // Context package name used to create bubble icon from drawable resource id
         verify(context, atLeastOnce()).packageName
         verifyNoteTaskOpenInBubbleInUser(userTracker.userHandle)
-        verifyZeroInteractions(eventLogger)
+        verifyNoMoreInteractions(eventLogger)
     }
 
     @Test
@@ -352,7 +352,7 @@
         // Context package name used to create bubble icon from drawable resource id
         verify(context, atLeastOnce()).packageName
         verifyNoteTaskOpenInBubbleInUser(userTracker.userHandle)
-        verifyZeroInteractions(eventLogger)
+        verifyNoMoreInteractions(eventLogger)
     }
 
     @Test
@@ -393,14 +393,14 @@
         }
         assertThat(userCaptor.value).isEqualTo(user10)
         verify(eventLogger).logNoteTaskOpened(expectedInfo)
-        verifyZeroInteractions(bubbles)
+        verifyNoMoreInteractions(bubbles)
     }
 
     @Test
     fun showNoteTask_bubblesIsNull_shouldDoNothing() {
         createNoteTaskController(bubbles = null).showNoteTask(entryPoint = TAIL_BUTTON)
 
-        verifyZeroInteractions(bubbles, eventLogger)
+        verifyNoMoreInteractions(bubbles, eventLogger)
     }
 
     @Test
@@ -412,14 +412,14 @@
         noteTaskController.showNoteTask(entryPoint = TAIL_BUTTON)
 
         verify(noteTaskController).showNoDefaultNotesAppToast()
-        verifyZeroInteractions(bubbles, eventLogger)
+        verifyNoMoreInteractions(bubbles, eventLogger)
     }
 
     @Test
     fun showNoteTask_flagDisabled_shouldDoNothing() {
         createNoteTaskController(isEnabled = false).showNoteTask(entryPoint = TAIL_BUTTON)
 
-        verifyZeroInteractions(bubbles, eventLogger)
+        verifyNoMoreInteractions(bubbles, eventLogger)
     }
 
     @Test
@@ -428,7 +428,7 @@
 
         createNoteTaskController().showNoteTask(entryPoint = TAIL_BUTTON)
 
-        verifyZeroInteractions(bubbles, eventLogger)
+        verifyNoMoreInteractions(bubbles, eventLogger)
     }
 
     @Test
@@ -453,7 +453,7 @@
         }
         assertThat(userCaptor.value).isEqualTo(userTracker.userHandle)
         verify(eventLogger).logNoteTaskOpened(expectedInfo)
-        verifyZeroInteractions(bubbles)
+        verifyNoMoreInteractions(bubbles)
     }
 
     // endregion
@@ -550,7 +550,7 @@
 
         createNoteTaskController().showNoteTask(entryPoint = QUICK_AFFORDANCE)
 
-        verifyZeroInteractions(bubbles, eventLogger)
+        verifyNoMoreInteractions(bubbles, eventLogger)
     }
 
     @Test
@@ -566,7 +566,7 @@
 
         createNoteTaskController().showNoteTask(entryPoint = QUICK_AFFORDANCE)
 
-        verifyZeroInteractions(bubbles, eventLogger)
+        verifyNoMoreInteractions(bubbles, eventLogger)
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt
index ab846f1..d88b758 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt
@@ -56,7 +56,7 @@
 import org.mockito.Mockito.never
 import org.mockito.Mockito.times
 import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
+import org.mockito.Mockito.verifyNoMoreInteractions
 import org.mockito.MockitoAnnotations.initMocks
 
 /** atest SystemUITests:NoteTaskInitializerTest */
@@ -135,7 +135,7 @@
 
         underTest.initialize()
 
-        verifyZeroInteractions(
+        verifyNoMoreInteractions(
             commandQueue,
             bubbles,
             controller,
@@ -151,7 +151,7 @@
 
         underTest.initialize()
 
-        verifyZeroInteractions(
+        verifyNoMoreInteractions(
             commandQueue,
             bubbles,
             controller,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java
deleted file mode 100644
index fb58b90..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * 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.systemui.qs;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-import android.content.ClipData;
-import android.content.ClipboardManager;
-import android.testing.TestableLooper;
-import android.view.View;
-import android.widget.TextView;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.plugins.FalsingManager;
-import com.android.systemui.res.R;
-import com.android.systemui.retail.data.repository.FakeRetailModeRepository;
-import com.android.systemui.retail.domain.interactor.RetailModeInteractorImpl;
-import com.android.systemui.settings.UserTracker;
-import com.android.systemui.utils.leaks.LeakCheckedTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class QSFooterViewControllerTest extends LeakCheckedTest {
-
-    @Mock
-    private QSFooterView mView;
-    @Mock
-    private UserTracker mUserTracker;
-    @Mock
-    private QSPanelController mQSPanelController;
-    @Mock
-    private ClipboardManager mClipboardManager;
-    @Mock
-    private TextView mBuildText;
-    @Mock
-    private FalsingManager mFalsingManager;
-    @Mock
-    private ActivityStarter mActivityStarter;
-
-    private FakeRetailModeRepository mRetailModeRepository;
-
-    private QSFooterViewController mController;
-    private View mEditButton;
-
-    @Before
-    public void setup() throws Exception {
-        MockitoAnnotations.initMocks(this);
-
-        mRetailModeRepository = new FakeRetailModeRepository();
-        mRetailModeRepository.setRetailMode(false);
-
-        mEditButton = new View(mContext);
-
-        injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
-
-        mContext.addMockSystemService(ClipboardManager.class, mClipboardManager);
-
-        when(mView.getContext()).thenReturn(mContext);
-        when(mView.getResources()).thenReturn(mContext.getResources());
-        when(mUserTracker.getUserContext()).thenReturn(mContext);
-
-        when(mView.isAttachedToWindow()).thenReturn(true);
-        when(mView.findViewById(R.id.build)).thenReturn(mBuildText);
-        when(mView.findViewById(android.R.id.edit)).thenReturn(mEditButton);
-
-        mController = new QSFooterViewController(mView, mUserTracker, mFalsingManager,
-                mActivityStarter, mQSPanelController,
-                new RetailModeInteractorImpl(mRetailModeRepository));
-
-        mController.init();
-    }
-
-    @Test
-    public void testBuildTextCopy() {
-        String text = "TEST";
-        ArgumentCaptor<View.OnLongClickListener> onLongClickCaptor =
-                ArgumentCaptor.forClass(View.OnLongClickListener.class);
-
-        verify(mBuildText).setOnLongClickListener(onLongClickCaptor.capture());
-
-        when(mBuildText.getText()).thenReturn(text);
-        onLongClickCaptor.getValue().onLongClick(mBuildText);
-
-        ArgumentCaptor<ClipData> captor = ArgumentCaptor.forClass(ClipData.class);
-        verify(mClipboardManager).setPrimaryClip(captor.capture());
-        assertThat(captor.getValue().getItemAt(0).getText()).isEqualTo(text);
-    }
-
-    @Test
-    public void testEditButton_falseTap() {
-        when(mFalsingManager.isFalseTap(anyInt())).thenReturn(true);
-
-        mEditButton.performClick();
-
-        verify(mQSPanelController, never()).showEdit(any());
-        verifyZeroInteractions(mActivityStarter);
-    }
-
-    @Test
-    public void testEditButton_realTap() {
-        when(mFalsingManager.isFalseTap(anyInt())).thenReturn(false);
-
-        mEditButton.performClick();
-
-        ArgumentCaptor<Runnable> captor = ArgumentCaptor.forClass(Runnable.class);
-
-        verify(mActivityStarter).postQSRunnableDismissingKeyguard(captor.capture());
-        captor.getValue().run();
-        verify(mQSPanelController).showEdit(mEditButton);
-    }
-
-    @Test
-    public void testEditButton_notRetailMode_visible() {
-        mRetailModeRepository.setRetailMode(false);
-
-        mController.setVisibility(View.VISIBLE);
-        assertThat(mEditButton.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void testEditButton_retailMode_notVisible() {
-        mRetailModeRepository.setRetailMode(true);
-
-        mController.setVisibility(View.VISIBLE);
-        assertThat(mEditButton.getVisibility()).isEqualTo(View.GONE);
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSImplTest.java
deleted file mode 100644
index 4ce2d7c..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSImplTest.java
+++ /dev/null
@@ -1,716 +0,0 @@
-/*
- * Copyright (C) 2023 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.systemui.qs;
-
-import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
-
-import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
-import static com.android.systemui.statusbar.StatusBarState.SHADE;
-import static com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Mockito.clearInvocations;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.testing.TestableLooper.RunWithLooper;
-import android.view.Display;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-
-import androidx.compose.ui.platform.ComposeView;
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleOwner;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.android.keyguard.BouncerPanelExpansionCalculator;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.dump.DumpManager;
-import com.android.systemui.flags.EnableSceneContainer;
-import com.android.systemui.media.controls.ui.view.MediaHost;
-import com.android.systemui.qs.customize.QSCustomizerController;
-import com.android.systemui.qs.dagger.QSComponent;
-import com.android.systemui.qs.external.TileServiceRequestController;
-import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel;
-import com.android.systemui.qs.logging.QSLogger;
-import com.android.systemui.res.R;
-import com.android.systemui.settings.FakeDisplayTracker;
-import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
-import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.StatusBarState;
-import com.android.systemui.statusbar.SysuiStatusBarStateController;
-import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
-import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController;
-import com.android.systemui.util.animation.UniqueObjectHostView;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-@RunWithLooper(setAsMainLooper = true)
-@SmallTest
-public class QSImplTest extends SysuiTestCase {
-
-    @Mock private QSComponent mQsComponent;
-    @Mock private QSPanelController mQSPanelController;
-    @Mock private MediaHost mQSMediaHost;
-    @Mock private MediaHost mQQSMediaHost;
-    @Mock private KeyguardBypassController mBypassController;
-    @Mock private TileServiceRequestController.Builder mTileServiceRequestControllerBuilder;
-    @Mock private TileServiceRequestController mTileServiceRequestController;
-    @Mock private QSCustomizerController mQsCustomizerController;
-    @Mock private QuickQSPanelController mQuickQSPanelController;
-    @Mock private FooterActionsController mQSFooterActionController;
-    @Mock private QSContainerImplController mQSContainerImplController;
-    @Mock private QSContainerImpl mContainer;
-    @Mock private QSFooter mFooter;
-    @Mock private LayoutInflater mLayoutInflater;
-    @Mock private NonInterceptingScrollView mQSPanelScrollView;
-    @Mock private QuickStatusBarHeader mHeader;
-    @Mock private QSPanel.QSTileLayout mQsTileLayout;
-    @Mock private QSPanel.QSTileLayout mQQsTileLayout;
-    @Mock private QSAnimator mQSAnimator;
-    @Mock private SysuiStatusBarStateController mStatusBarStateController;
-    @Mock private QSSquishinessController mSquishinessController;
-    @Mock private FooterActionsViewModel mFooterActionsViewModel;
-    @Mock private FooterActionsViewModel.Factory mFooterActionsViewModelFactory;
-    @Mock private LargeScreenShadeInterpolator mLargeScreenShadeInterpolator;
-    private ViewGroup mQsView;
-
-    private final CommandQueue mCommandQueue =
-            new CommandQueue(mContext, new FakeDisplayTracker(mContext));
-
-    private QSImpl mUnderTest;
-
-
-    @Before
-    public void setup() {
-        MockitoAnnotations.initMocks(this);
-
-        mUnderTest = instantiate();
-
-        mUnderTest.onComponentCreated(mQsComponent, null);
-    }
-
-    /*
-     * Regression test for b/303180152.
-     */
-    @Test
-    public void testDisableCallbackOnDisabledQuickSettingsUponCreationDoesntCrash() {
-        QSImpl other = instantiate();
-        mCommandQueue.disable(Display.DEFAULT_DISPLAY, 0, DISABLE2_QUICK_SETTINGS);
-
-        other.onComponentCreated(mQsComponent, null);
-    }
-
-    @Test
-    public void testSaveState() {
-        mUnderTest.setListening(true);
-        mUnderTest.setExpanded(true);
-        mUnderTest.setQsVisible(true);
-
-        Bundle bundle = new Bundle();
-        mUnderTest.onSaveInstanceState(bundle);
-
-        // Get a new instance
-        QSImpl other = instantiate();
-        other.onComponentCreated(mQsComponent, bundle);
-
-        assertTrue(other.isListening());
-        assertTrue(other.isExpanded());
-        assertTrue(other.isQsVisible());
-    }
-
-    @Test
-    public void transitionToFullShade_smallScreen_alphaAlways1() {
-        setIsSmallScreen();
-        setStatusBarCurrentAndUpcomingState(StatusBarState.SHADE);
-        boolean isTransitioningToFullShade = true;
-        float transitionProgress = 0.5f;
-        float squishinessFraction = 0.5f;
-
-        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
-                squishinessFraction);
-
-        assertThat(mQsView.getAlpha()).isEqualTo(1f);
-    }
-
-    @Test
-    public void transitionToFullShade_largeScreen_alphaLargeScreenShadeInterpolator() {
-        setIsLargeScreen();
-        setStatusBarCurrentAndUpcomingState(StatusBarState.SHADE);
-        boolean isTransitioningToFullShade = true;
-        float transitionProgress = 0.5f;
-        float squishinessFraction = 0.5f;
-        when(mLargeScreenShadeInterpolator.getQsAlpha(transitionProgress)).thenReturn(123f);
-
-        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
-                squishinessFraction);
-
-        assertThat(mQsView.getAlpha()).isEqualTo(123f);
-    }
-
-    @Test
-    public void
-            transitionToFullShade_onKeyguard_noBouncer_setsAlphaUsingLinearInterpolator() {
-        setStatusBarCurrentAndUpcomingState(KEYGUARD);
-        when(mQSPanelController.isBouncerInTransit()).thenReturn(false);
-        boolean isTransitioningToFullShade = true;
-        float transitionProgress = 0.5f;
-        float squishinessFraction = 0.5f;
-
-        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
-                squishinessFraction);
-
-        assertThat(mQsView.getAlpha()).isEqualTo(transitionProgress);
-    }
-
-    @Test
-    public void
-            transitionToFullShade_onKeyguard_bouncerActive_setsAlphaUsingBouncerInterpolator() {
-        setStatusBarCurrentAndUpcomingState(KEYGUARD);
-        when(mQSPanelController.isBouncerInTransit()).thenReturn(true);
-        boolean isTransitioningToFullShade = true;
-        float transitionProgress = 0.5f;
-        float squishinessFraction = 0.5f;
-
-        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
-                squishinessFraction);
-
-        assertThat(mQsView.getAlpha())
-                .isEqualTo(
-                        BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(
-                                transitionProgress));
-    }
-
-    @Test
-    public void transitionToFullShade_inFullWidth_alwaysSetsAlphaTo1() {
-        mUnderTest.setIsNotificationPanelFullWidth(true);
-
-        boolean isTransitioningToFullShade = true;
-        float transitionProgress = 0.1f;
-        float squishinessFraction = 0.5f;
-        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
-                squishinessFraction);
-        assertThat(mQsView.getAlpha()).isEqualTo(1);
-
-        transitionProgress = 0.5f;
-        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
-                squishinessFraction);
-        assertThat(mQsView.getAlpha()).isEqualTo(1);
-        assertThat(mQsView.getAlpha()).isEqualTo(1);
-
-        transitionProgress = 0.7f;
-        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
-                squishinessFraction);
-        assertThat(mQsView.getAlpha()).isEqualTo(1);
-    }
-
-    @Test
-    public void transitionToFullShade_setsSquishinessOnController() {
-        boolean isTransitioningToFullShade = true;
-        float transitionProgress = 0.123f;
-        float squishinessFraction = 0.456f;
-
-        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
-                squishinessFraction);
-
-        verify(mQsComponent.getQSSquishinessController()).setSquishiness(squishinessFraction);
-    }
-
-    @Test
-    public void setQsExpansion_whenShouldUpdateSquishinessTrue_setsSquishinessBasedOnFraction() {
-        enableSplitShade();
-        when(mStatusBarStateController.getState()).thenReturn(KEYGUARD);
-        float expansion = 0.456f;
-        float panelExpansionFraction = 0.678f;
-        float proposedTranslation = 567f;
-        float squishinessFraction = 0.789f;
-
-        mUnderTest.setShouldUpdateSquishinessOnMedia(true);
-        mUnderTest.setQsExpansion(expansion, panelExpansionFraction, proposedTranslation,
-                squishinessFraction);
-
-        verify(mQSMediaHost).setSquishFraction(squishinessFraction);
-    }
-
-    @Test
-    public void setQsExpansion_whenOnKeyguardAndShouldUpdateSquishinessFalse_setsSquishiness() {
-        // Random test values without any meaning. They just have to be different from each other.
-        float expansion = 0.123f;
-        float panelExpansionFraction = 0.321f;
-        float proposedTranslation = 456f;
-        float squishinessFraction = 0.567f;
-
-        enableSplitShade();
-        setStatusBarCurrentAndUpcomingState(KEYGUARD);
-        mUnderTest.setShouldUpdateSquishinessOnMedia(false);
-        mUnderTest.setQsExpansion(expansion, panelExpansionFraction, proposedTranslation,
-                squishinessFraction);
-
-        verify(mQSMediaHost).setSquishFraction(1.0f);
-    }
-
-    @Test
-    public void setQsExpansion_inSplitShade_setsFooterActionsExpansion_basedOnPanelExpFraction() {
-        // Random test values without any meaning. They just have to be different from each other.
-        float expansion = 0.123f;
-        float panelExpansionFraction = 0.321f;
-        float proposedTranslation = 456f;
-        float squishinessFraction = 0.987f;
-
-        enableSplitShade();
-
-        mUnderTest.setQsExpansion(expansion, panelExpansionFraction, proposedTranslation,
-                squishinessFraction);
-
-        verify(mFooterActionsViewModel).onQuickSettingsExpansionChanged(
-                panelExpansionFraction, /* isInSplitShade= */ true);
-    }
-
-    @Test
-    public void setQsExpansion_notInSplitShade_setsFooterActionsExpansion_basedOnExpansion() {
-        // Random test values without any meaning. They just have to be different from each other.
-        float expansion = 0.123f;
-        float panelExpansionFraction = 0.321f;
-        float proposedTranslation = 456f;
-        float squishinessFraction = 0.987f;
-
-        disableSplitShade();
-
-        mUnderTest.setQsExpansion(expansion, panelExpansionFraction, proposedTranslation,
-                squishinessFraction);
-
-        verify(mFooterActionsViewModel).onQuickSettingsExpansionChanged(
-                expansion, /* isInSplitShade= */ false);
-    }
-
-    @Test
-    public void setQsExpansion_inSplitShade_whenTransitioningToKeyguard_setsAlphaBasedOnShadeTransitionProgress() {
-        enableSplitShade();
-        when(mStatusBarStateController.getState()).thenReturn(SHADE);
-        when(mStatusBarStateController.getCurrentOrUpcomingState()).thenReturn(KEYGUARD);
-        boolean isTransitioningToFullShade = false;
-        float transitionProgress = 0;
-        float squishinessFraction = 0f;
-
-        mUnderTest.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress,
-                squishinessFraction);
-
-        // trigger alpha refresh with non-zero expansion and fraction values
-        mUnderTest.setQsExpansion(/* expansion= */ 1, /* panelExpansionFraction= */1,
-                /* proposedTranslation= */ 0, /* squishinessFraction= */ 1);
-
-        // alpha should follow lockscreen to shade progress, not panel expansion fraction
-        assertThat(mQsView.getAlpha()).isEqualTo(transitionProgress);
-    }
-
-    @Test
-    public void getQsMinExpansionHeight_notInSplitShade_returnsHeaderHeight() {
-        disableSplitShade();
-        when(mHeader.getHeight()).thenReturn(1234);
-
-        int height = mUnderTest.getQsMinExpansionHeight();
-
-        assertThat(height).isEqualTo(mHeader.getHeight());
-    }
-
-    @Test
-    public void getQsMinExpansionHeight_inSplitShade_returnsAbsoluteBottomOfQSContainer() {
-        int top = 1234;
-        int height = 9876;
-        enableSplitShade();
-        setLocationOnScreen(mQsView, top);
-        when(mQsView.getHeight()).thenReturn(height);
-
-        int expectedHeight = top + height;
-        assertThat(mUnderTest.getQsMinExpansionHeight()).isEqualTo(expectedHeight);
-    }
-
-    @Test
-    public void getQsMinExpansionHeight_inSplitShade_returnsAbsoluteBottomExcludingTranslation() {
-        int top = 1234;
-        int height = 9876;
-        float translationY = -600f;
-        enableSplitShade();
-        setLocationOnScreen(mQsView, (int) (top + translationY));
-        when(mQsView.getHeight()).thenReturn(height);
-        when(mQsView.getTranslationY()).thenReturn(translationY);
-
-        int expectedHeight = top + height;
-        assertThat(mUnderTest.getQsMinExpansionHeight()).isEqualTo(expectedHeight);
-    }
-
-    @Test
-    public void hideImmediately_notInSplitShade_movesViewUpByHeaderHeight() {
-        disableSplitShade();
-        when(mHeader.getHeight()).thenReturn(555);
-
-        mUnderTest.hideImmediately();
-
-        assertThat(mQsView.getY()).isEqualTo(-mHeader.getHeight());
-    }
-
-    @Test
-    public void hideImmediately_inSplitShade_movesViewUpByQSAbsoluteBottom() {
-        enableSplitShade();
-        int top = 1234;
-        int height = 9876;
-        setLocationOnScreen(mQsView, top);
-        when(mQsView.getHeight()).thenReturn(height);
-
-        mUnderTest.hideImmediately();
-
-        int qsAbsoluteBottom = top + height;
-        assertThat(mQsView.getY()).isEqualTo(-qsAbsoluteBottom);
-    }
-
-    @Test
-    public void setCollapseExpandAction_passedToControllers() {
-        Runnable action = () -> {};
-        mUnderTest.setCollapseExpandAction(action);
-
-        verify(mQSPanelController).setCollapseExpandAction(action);
-        verify(mQuickQSPanelController).setCollapseExpandAction(action);
-    }
-
-    @Test
-    public void setOverScrollAmount_setsTranslationOnView() {
-        mUnderTest.setOverScrollAmount(123);
-
-        assertThat(mQsView.getTranslationY()).isEqualTo(123);
-    }
-
-    @Test
-    public void setOverScrollAmount_beforeViewCreated_translationIsNotSet() {
-        QSImpl other = instantiate();
-        other.setOverScrollAmount(123);
-
-        assertThat(mQsView.getTranslationY()).isEqualTo(0);
-    }
-
-    private Lifecycle.State getListeningAndVisibilityLifecycleState() {
-        return mUnderTest
-                .getListeningAndVisibilityLifecycleOwner()
-                .getLifecycle()
-                .getCurrentState();
-    }
-
-    @Test
-    public void setListeningFalse_notVisible() {
-        mUnderTest.setQsVisible(false);
-        clearInvocations(mQSContainerImplController, mQSPanelController, mQSFooterActionController);
-
-        mUnderTest.setListening(false);
-        verify(mQSContainerImplController).setListening(false);
-        assertThat(getListeningAndVisibilityLifecycleState()).isEqualTo(Lifecycle.State.CREATED);
-        verify(mQSPanelController).setListening(eq(false), anyBoolean());
-    }
-
-    @Test
-    public void setListeningTrue_notVisible() {
-        mUnderTest.setQsVisible(false);
-        clearInvocations(mQSContainerImplController, mQSPanelController, mQSFooterActionController);
-
-        mUnderTest.setListening(true);
-        verify(mQSContainerImplController).setListening(false);
-        assertThat(getListeningAndVisibilityLifecycleState()).isEqualTo(Lifecycle.State.STARTED);
-        verify(mQSPanelController).setListening(eq(false), anyBoolean());
-    }
-
-    @Test
-    public void setListeningFalse_visible() {
-        mUnderTest.setQsVisible(true);
-        clearInvocations(mQSContainerImplController, mQSPanelController, mQSFooterActionController);
-
-        mUnderTest.setListening(false);
-        verify(mQSContainerImplController).setListening(false);
-        assertThat(getListeningAndVisibilityLifecycleState()).isEqualTo(Lifecycle.State.CREATED);
-        verify(mQSPanelController).setListening(eq(false), anyBoolean());
-    }
-
-    @Test
-    public void setListeningTrue_visible() {
-        mUnderTest.setQsVisible(true);
-        clearInvocations(mQSContainerImplController, mQSPanelController, mQSFooterActionController);
-
-        mUnderTest.setListening(true);
-        verify(mQSContainerImplController).setListening(true);
-        assertThat(getListeningAndVisibilityLifecycleState()).isEqualTo(Lifecycle.State.RESUMED);
-        verify(mQSPanelController).setListening(eq(true), anyBoolean());
-    }
-
-    @Test
-    public void passCorrectExpansionState_inSplitShade() {
-        enableSplitShade();
-        clearInvocations(mQSPanelController);
-
-        mUnderTest.setExpanded(true);
-        verify(mQSPanelController).setExpanded(true);
-
-        mUnderTest.setExpanded(false);
-        verify(mQSPanelController).setExpanded(false);
-    }
-
-    @Test
-    public void startsListeningAfterStateChangeToExpanded_inSplitShade() {
-        enableSplitShade();
-        mUnderTest.setQsVisible(true);
-        clearInvocations(mQSPanelController);
-
-        mUnderTest.setExpanded(true);
-        verify(mQSPanelController).setListening(true, true);
-    }
-
-    @Test
-    public void testUpdateQSBounds_setMediaClipCorrectly() {
-        disableSplitShade();
-
-        Rect mediaHostClip = new Rect();
-        when(mQSPanelController.getPaddingBottom()).thenReturn(50);
-        setLocationOnScreen(mQSPanelScrollView, 25);
-        when(mQSPanelScrollView.getMeasuredHeight()).thenReturn(200);
-        when(mQSMediaHost.getCurrentClipping()).thenReturn(mediaHostClip);
-
-        mUnderTest.updateQsBounds();
-
-        assertEquals(25, mediaHostClip.top);
-        assertEquals(175, mediaHostClip.bottom);
-    }
-
-    @Test
-    public void testQsUpdatesQsAnimatorWithUpcomingState() {
-        setStatusBarCurrentAndUpcomingState(SHADE);
-        mUnderTest.onUpcomingStateChanged(KEYGUARD);
-
-        verify(mQSAnimator).setOnKeyguard(true);
-    }
-
-    @Test
-    @EnableSceneContainer
-    public void testSceneContainerFlagsEnabled_FooterActionsRemoved_controllerNotStarted() {
-        clearInvocations(mFooterActionsViewModel, mFooterActionsViewModelFactory);
-        QSImpl other = instantiate();
-
-        other.onComponentCreated(mQsComponent, null);
-
-        assertThat((View) other.getView().findViewById(R.id.qs_footer_actions)).isNull();
-        verifyZeroInteractions(mFooterActionsViewModel, mFooterActionsViewModelFactory);
-    }
-
-    @Test
-    @EnableSceneContainer
-    public void testSceneContainerFlagsEnabled_statusBarStateIsShade() {
-        mUnderTest.onStateChanged(KEYGUARD);
-        assertThat(mUnderTest.getStatusBarState()).isEqualTo(SHADE);
-
-        mUnderTest.onStateChanged(SHADE_LOCKED);
-        assertThat(mUnderTest.getStatusBarState()).isEqualTo(SHADE);
-    }
-
-    @Test
-    @EnableSceneContainer
-    public void testSceneContainerFlagsEnabled_isKeyguardState_alwaysFalse() {
-        mUnderTest.onStateChanged(KEYGUARD);
-        assertThat(mUnderTest.isKeyguardState()).isFalse();
-
-        when(mStatusBarStateController.getCurrentOrUpcomingState()).thenReturn(KEYGUARD);
-        assertThat(mUnderTest.isKeyguardState()).isFalse();
-    }
-
-    @Test
-    public void testHeaderBounds() {
-        int left = 20;
-        int top = 30;
-        int right = 200;
-        int bottom = 100;
-        setHeaderBounds(left, top, right, bottom);
-
-        assertThat(mUnderTest.getHeaderLeft()).isEqualTo(left);
-        assertThat(mUnderTest.getHeaderTop()).isEqualTo(top);
-        assertThat(mUnderTest.getHeaderBottom()).isEqualTo(bottom);
-        assertThat(mUnderTest.getHeaderHeight()).isEqualTo(bottom - top);
-    }
-
-    @Test
-    public void testHeaderBoundsOnScreen() {
-        Rect bounds = new Rect(0, 10, 100, 200);
-        setHeaderBoundsOnScreen(bounds);
-
-        Rect out = new Rect();
-        mUnderTest.getHeaderBoundsOnScreen(out);
-        assertThat(out).isEqualTo(bounds);
-    }
-
-    private QSImpl instantiate() {
-        setupQsComponent();
-        setUpViews();
-        setUpInflater();
-        setUpMedia();
-        setUpOther();
-
-        return new QSImpl(
-                new RemoteInputQuickSettingsDisabler(
-                        mContext,
-                        mCommandQueue,
-                        new ResourcesSplitShadeStateController(),
-                        mock(ConfigurationController.class)),
-                mStatusBarStateController,
-                mCommandQueue,
-                mQSMediaHost,
-                mQQSMediaHost,
-                mBypassController,
-                mock(QSDisableFlagsLogger.class),
-                mock(DumpManager.class),
-                mock(QSLogger.class),
-                mock(FooterActionsController.class),
-                mFooterActionsViewModelFactory,
-                mLargeScreenShadeInterpolator
-        );
-    }
-
-    private void setUpOther() {
-        when(mTileServiceRequestControllerBuilder.create(any()))
-                .thenReturn(mTileServiceRequestController);
-        when(mQSContainerImplController.getView()).thenReturn(mContainer);
-        when(mQSPanelController.getTileLayout()).thenReturn(mQQsTileLayout);
-        when(mQuickQSPanelController.getTileLayout()).thenReturn(mQsTileLayout);
-        when(mFooterActionsViewModelFactory.create(any(LifecycleOwner.class)))
-                .thenReturn(mFooterActionsViewModel);
-    }
-
-    private void setUpMedia() {
-        when(mQSMediaHost.getCurrentClipping()).thenReturn(new Rect());
-        when(mQSMediaHost.getHostView()).thenReturn(new UniqueObjectHostView(mContext));
-        when(mQQSMediaHost.getHostView()).thenReturn(new UniqueObjectHostView(mContext));
-    }
-
-    private void setUpViews() {
-        mQsView = spy(new FrameLayout(mContext));
-        when(mQsComponent.getRootView()).thenReturn(mQsView);
-
-        when(mQSPanelScrollView.findViewById(R.id.expanded_qs_scroll_view))
-                .thenReturn(mQSPanelScrollView);
-        mQsView.addView(mQSPanelScrollView);
-
-        when(mHeader.findViewById(R.id.header)).thenReturn(mHeader);
-        mQsView.addView(mHeader);
-
-        View customizer = new View(mContext);
-        customizer.setId(android.R.id.edit);
-        mQsView.addView(customizer);
-
-        ComposeView footerActionsView = new ComposeView(mContext);
-        footerActionsView.setId(R.id.qs_footer_actions);
-        mQsView.addView(footerActionsView);
-    }
-
-    private void setUpInflater() {
-        when(mLayoutInflater.cloneInContext(any(Context.class))).thenReturn(mLayoutInflater);
-        when(mLayoutInflater.inflate(anyInt(), nullable(ViewGroup.class), anyBoolean()))
-                .thenAnswer((invocation) -> mQsView);
-        when(mLayoutInflater.inflate(anyInt(), nullable(ViewGroup.class)))
-                .thenAnswer((invocation) -> mQsView);
-        mContext.addMockSystemService(Context.LAYOUT_INFLATER_SERVICE, mLayoutInflater);
-    }
-
-    private void setupQsComponent() {
-        when(mQsComponent.getQSPanelController()).thenReturn(mQSPanelController);
-        when(mQsComponent.getQuickQSPanelController()).thenReturn(mQuickQSPanelController);
-        when(mQsComponent.getQSCustomizerController()).thenReturn(mQsCustomizerController);
-        when(mQsComponent.getQSContainerImplController())
-                .thenReturn(mQSContainerImplController);
-        when(mQsComponent.getQSFooter()).thenReturn(mFooter);
-        when(mQsComponent.getQSFooterActionController())
-                .thenReturn(mQSFooterActionController);
-        when(mQsComponent.getQSAnimator()).thenReturn(mQSAnimator);
-        when(mQsComponent.getQSSquishinessController()).thenReturn(mSquishinessController);
-    }
-
-    private void setStatusBarCurrentAndUpcomingState(int statusBarState) {
-        when(mStatusBarStateController.getState()).thenReturn(statusBarState);
-        when(mStatusBarStateController.getCurrentOrUpcomingState()).thenReturn(statusBarState);
-        mUnderTest.onStateChanged(statusBarState);
-    }
-
-    private void enableSplitShade() {
-        setSplitShadeEnabled(true);
-    }
-
-    private void disableSplitShade() {
-        setSplitShadeEnabled(false);
-    }
-
-    private void setSplitShadeEnabled(boolean enabled) {
-        mUnderTest.setInSplitShade(enabled);
-    }
-
-    private void setLocationOnScreen(View view, int top) {
-        doAnswer(invocation -> {
-            int[] locationOnScreen = invocation.getArgument(/* index= */ 0);
-            locationOnScreen[0] = 0;
-            locationOnScreen[1] = top;
-            return null;
-        }).when(view).getLocationOnScreen(any(int[].class));
-    }
-
-    private void setIsLargeScreen() {
-        mUnderTest.setIsNotificationPanelFullWidth(false);
-    }
-
-    private void setIsSmallScreen() {
-        mUnderTest.setIsNotificationPanelFullWidth(true);
-    }
-
-    private void setHeaderBounds(int left, int top, int right, int bottom) {
-        when(mHeader.getLeft()).thenReturn(left);
-        when(mHeader.getTop()).thenReturn(top);
-        when(mHeader.getRight()).thenReturn(right);
-        when(mHeader.getBottom()).thenReturn(bottom);
-    }
-
-    private void setHeaderBoundsOnScreen(Rect rect) {
-        doAnswer(invocation -> {
-            Rect bounds = invocation.getArgument(/* index= */ 0);
-            bounds.set(rect);
-            return null;
-        }).when(mHeader).getBoundsOnScreen(any(Rect.class));
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt
deleted file mode 100644
index 418d126..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt
+++ /dev/null
@@ -1,420 +0,0 @@
-/*
- * Copyright (C) 2021 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.systemui.qs.tiles
-
-import android.content.ComponentName
-import android.content.Context
-import android.content.Intent
-import android.os.Handler
-import android.provider.Settings
-import android.service.quicksettings.Tile
-import android.testing.TestableLooper
-import androidx.lifecycle.LifecycleOwner
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.internal.logging.MetricsLogger
-import com.android.systemui.res.R
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.animation.ActivityTransitionAnimator
-import com.android.systemui.classifier.FalsingManagerFake
-import com.android.systemui.controls.ControlsServiceInfo
-import com.android.systemui.controls.controller.ControlInfo
-import com.android.systemui.controls.controller.ControlsController
-import com.android.systemui.controls.controller.StructureInfo
-import com.android.systemui.controls.dagger.ControlsComponent
-import com.android.systemui.controls.management.ControlsListingController
-import com.android.systemui.controls.ui.ControlsActivity
-import com.android.systemui.controls.ui.ControlsUiController
-import com.android.systemui.controls.ui.SelectedItem
-import com.android.systemui.plugins.ActivityStarter
-import com.android.systemui.plugins.statusbar.StatusBarStateController
-import com.android.systemui.qs.QSHost
-import com.android.systemui.qs.QsEventLogger
-import com.android.systemui.qs.logging.QSLogger
-import com.android.systemui.qs.tileimpl.QSTileImpl
-import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.capture
-import com.android.systemui.util.mockito.eq
-import com.android.systemui.util.settings.FakeSettings
-import com.android.systemui.util.settings.SecureSettings
-import com.google.common.truth.Truth.assertThat
-import org.junit.After
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentCaptor
-import org.mockito.ArgumentMatchers.anyBoolean
-import org.mockito.Captor
-import org.mockito.Mock
-import org.mockito.Mockito.doNothing
-import org.mockito.Mockito.nullable
-import org.mockito.Mockito.spy
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
-import org.mockito.Mockito.`when`
-import org.mockito.MockitoAnnotations
-import java.util.Optional
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-@TestableLooper.RunWithLooper(setAsMainLooper = true)
-class DeviceControlsTileTest : SysuiTestCase() {
-
-    @Mock
-    private lateinit var qsHost: QSHost
-    @Mock
-    private lateinit var metricsLogger: MetricsLogger
-    @Mock
-    private lateinit var statusBarStateController: StatusBarStateController
-    @Mock
-    private lateinit var activityStarter: ActivityStarter
-    @Mock
-    private lateinit var qsLogger: QSLogger
-    @Mock
-    private lateinit var controlsComponent: ControlsComponent
-    @Mock
-    private lateinit var controlsUiController: ControlsUiController
-    @Mock
-    private lateinit var controlsListingController: ControlsListingController
-    @Mock
-    private lateinit var controlsController: ControlsController
-    @Mock
-    private lateinit var serviceInfo: ControlsServiceInfo
-    @Mock
-    private lateinit var uiEventLogger: QsEventLogger
-    @Captor
-    private lateinit var listingCallbackCaptor:
-            ArgumentCaptor<ControlsListingController.ControlsListingCallback>
-    @Captor
-    private lateinit var intentCaptor: ArgumentCaptor<Intent>
-
-    private lateinit var testableLooper: TestableLooper
-    private lateinit var tile: DeviceControlsTile
-
-    private lateinit var secureSettings: SecureSettings
-    private lateinit var spiedContext: Context
-    private var featureEnabled = true
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-        testableLooper = TestableLooper.get(this)
-        secureSettings = FakeSettings()
-
-        spiedContext = spy(mContext)
-        doNothing().`when`(spiedContext).startActivity(any(Intent::class.java))
-        `when`(qsHost.context).thenReturn(spiedContext)
-        `when`(controlsComponent.isEnabled()).thenReturn(true)
-        `when`(controlsController.getPreferredSelection())
-                .thenReturn(SelectedItem.StructureItem(
-                        StructureInfo(ComponentName("pkg", "cls"), "structure", listOf())))
-        secureSettings.putInt(Settings.Secure.LOCKSCREEN_SHOW_CONTROLS, 1)
-
-        setupControlsComponent()
-
-        tile = createTile()
-    }
-
-    @After
-    fun tearDown() {
-        tile.destroy()
-        testableLooper.processAllMessages()
-    }
-
-    private fun setupControlsComponent() {
-        `when`(controlsComponent.getControlsController()).thenAnswer {
-            if (featureEnabled) {
-                Optional.of(controlsController)
-            } else {
-                Optional.empty()
-            }
-        }
-
-        `when`(controlsComponent.getControlsListingController()).thenAnswer {
-            if (featureEnabled) {
-                Optional.of(controlsListingController)
-            } else {
-                Optional.empty()
-            }
-        }
-
-        `when`(controlsComponent.getControlsUiController()).thenAnswer {
-            if (featureEnabled) {
-                Optional.of(controlsUiController)
-            } else {
-                Optional.empty()
-            }
-        }
-
-        `when`(controlsComponent.getTileTitleId()).thenReturn(R.string.quick_controls_title)
-        `when`(controlsComponent.getTileTitleId()).thenReturn(R.drawable.controls_icon)
-    }
-
-    @Test
-    fun testAvailable() {
-        assertThat(tile.isAvailable).isTrue()
-    }
-
-    @Test
-    fun testNotAvailableControls() {
-        featureEnabled = false
-
-        // Destroy previous tile
-        tile.destroy()
-        tile = createTile()
-
-        assertThat(tile.isAvailable).isFalse()
-    }
-
-    @Test
-    fun testObservingCallback() {
-        verify(controlsListingController).observe(
-                any(LifecycleOwner::class.java),
-                any(ControlsListingController.ControlsListingCallback::class.java)
-        )
-    }
-
-    @Test
-    fun testLongClickIntent() {
-        assertThat(tile.longClickIntent).isNull()
-    }
-
-    @Test
-    fun testDoesNotHandleLongClick() {
-        assertThat(tile.state.handlesLongClick).isFalse()
-    }
-
-    @Test
-    fun testUnavailableByDefault() {
-        assertThat(tile.state.state).isEqualTo(Tile.STATE_UNAVAILABLE)
-    }
-
-    @Test
-    fun testStateUnavailableIfNoListings() {
-        verify(controlsListingController).observe(
-                any(LifecycleOwner::class.java),
-                capture(listingCallbackCaptor)
-        )
-
-        listingCallbackCaptor.value.onServicesUpdated(emptyList())
-        testableLooper.processAllMessages()
-
-        assertThat(tile.state.state).isEqualTo(Tile.STATE_UNAVAILABLE)
-    }
-
-    @Test
-    fun testStateUnavailableIfNotEnabled() {
-        verify(controlsListingController).observe(
-            any(LifecycleOwner::class.java),
-            capture(listingCallbackCaptor)
-        )
-        `when`(controlsComponent.isEnabled()).thenReturn(false)
-
-        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
-        testableLooper.processAllMessages()
-
-        assertThat(tile.state.state).isEqualTo(Tile.STATE_UNAVAILABLE)
-    }
-
-    @Test
-    fun testStateActiveIfListingsHasControlsFavorited() {
-        verify(controlsListingController).observe(
-                any(LifecycleOwner::class.java),
-                capture(listingCallbackCaptor)
-        )
-        `when`(controlsComponent.getVisibility()).thenReturn(ControlsComponent.Visibility.AVAILABLE)
-        `when`(controlsController.getPreferredSelection()).thenReturn(
-            SelectedItem.StructureItem(StructureInfo(
-                ComponentName("pkg", "cls"),
-                "structure",
-                listOf(ControlInfo("id", "title", "subtitle", 1))
-            ))
-        )
-
-        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
-        testableLooper.processAllMessages()
-
-        assertThat(tile.state.state).isEqualTo(Tile.STATE_ACTIVE)
-    }
-
-    @Test
-    fun testStateInactiveIfListingsHasNoControlsFavorited() {
-        verify(controlsListingController).observe(
-                any(LifecycleOwner::class.java),
-                capture(listingCallbackCaptor)
-        )
-        `when`(controlsComponent.getVisibility()).thenReturn(ControlsComponent.Visibility.AVAILABLE)
-        `when`(controlsController.getPreferredSelection())
-                .thenReturn(SelectedItem.StructureItem(
-                        StructureInfo(ComponentName("pkg", "cls"), "structure", listOf())))
-
-        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
-        testableLooper.processAllMessages()
-
-        assertThat(tile.state.state).isEqualTo(Tile.STATE_INACTIVE)
-    }
-
-    @Test
-    fun testStateActiveIfPreferredIsPanel() {
-        verify(controlsListingController).observe(
-                any(LifecycleOwner::class.java),
-                capture(listingCallbackCaptor)
-        )
-        `when`(controlsComponent.getVisibility()).thenReturn(ControlsComponent.Visibility.AVAILABLE)
-        `when`(controlsController.getPreferredSelection())
-                .thenReturn(SelectedItem.PanelItem("appName", ComponentName("pkg", "cls")))
-
-        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
-        testableLooper.processAllMessages()
-
-        assertThat(tile.state.state).isEqualTo(Tile.STATE_ACTIVE)
-    }
-
-    @Test
-    fun testStateInactiveIfLocked() {
-        verify(controlsListingController).observe(
-            any(LifecycleOwner::class.java),
-            capture(listingCallbackCaptor)
-        )
-        `when`(controlsComponent.getVisibility())
-            .thenReturn(ControlsComponent.Visibility.AVAILABLE_AFTER_UNLOCK)
-
-        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
-        testableLooper.processAllMessages()
-
-        assertThat(tile.state.state).isEqualTo(Tile.STATE_INACTIVE)
-    }
-
-    @Test
-    fun testMoveBetweenStates() {
-        verify(controlsListingController).observe(
-                any(LifecycleOwner::class.java),
-                capture(listingCallbackCaptor)
-        )
-
-        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
-        testableLooper.processAllMessages()
-
-        listingCallbackCaptor.value.onServicesUpdated(emptyList())
-        testableLooper.processAllMessages()
-
-        assertThat(tile.state.state).isEqualTo(Tile.STATE_UNAVAILABLE)
-    }
-
-    @Test
-    fun handleClick_unavailable_noActivityStarted() {
-        tile.click(null /* view */)
-        testableLooper.processAllMessages()
-
-        verifyZeroInteractions(activityStarter)
-    }
-
-    @Test
-    fun handleClick_available_shownOverLockscreenWhenLocked() {
-        verify(controlsListingController).observe(
-                any(LifecycleOwner::class.java),
-                capture(listingCallbackCaptor)
-        )
-        `when`(controlsComponent.getVisibility()).thenReturn(ControlsComponent.Visibility.AVAILABLE)
-        `when`(controlsUiController.resolveActivity()).thenReturn(ControlsActivity::class.java)
-        `when`(controlsController.getPreferredSelection()).thenReturn(
-            SelectedItem.StructureItem(StructureInfo(
-                    ComponentName("pkg", "cls"),
-                    "structure",
-                    listOf(ControlInfo("id", "title", "subtitle", 1))
-            ))
-        )
-
-        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
-        testableLooper.processAllMessages()
-
-        tile.click(null /* view */)
-        testableLooper.processAllMessages()
-
-        verify(activityStarter).startActivity(
-                intentCaptor.capture(),
-                eq(true) /* dismissShade */,
-                nullable(ActivityTransitionAnimator.Controller::class.java),
-                eq(true) /* showOverLockscreenWhenLocked */)
-        assertThat(intentCaptor.value.component?.className).isEqualTo(CONTROLS_ACTIVITY_CLASS_NAME)
-    }
-
-    @Test
-    fun handleClick_availableAfterUnlock_notShownOverLockscreenWhenLocked() {
-        verify(controlsListingController).observe(
-            any(LifecycleOwner::class.java),
-            capture(listingCallbackCaptor)
-        )
-        `when`(controlsComponent.getVisibility())
-            .thenReturn(ControlsComponent.Visibility.AVAILABLE_AFTER_UNLOCK)
-        `when`(controlsUiController.resolveActivity()).thenReturn(ControlsActivity::class.java)
-        `when`(controlsController.getPreferredSelection()).thenReturn(
-            SelectedItem.StructureItem(StructureInfo(
-                ComponentName("pkg", "cls"),
-                "structure",
-                listOf(ControlInfo("id", "title", "subtitle", 1))
-            ))
-        )
-
-        listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
-        testableLooper.processAllMessages()
-
-        tile.click(null /* view */)
-        testableLooper.processAllMessages()
-
-        verify(activityStarter).startActivity(
-                intentCaptor.capture(),
-                anyBoolean() /* dismissShade */,
-                nullable(ActivityTransitionAnimator.Controller::class.java),
-                eq(false) /* showOverLockscreenWhenLocked */)
-        assertThat(intentCaptor.value.component?.className).isEqualTo(CONTROLS_ACTIVITY_CLASS_NAME)
-    }
-
-    @Test
-    fun verifyTileEqualsResourceFromComponent() {
-        assertThat(tile.tileLabel)
-            .isEqualTo(
-                context.getText(
-                    controlsComponent.getTileTitleId()))
-    }
-
-    @Test
-    fun verifyTileImageEqualsResourceFromComponent() {
-        assertThat(tile.icon)
-            .isEqualTo(QSTileImpl.ResourceIcon.get(controlsComponent.getTileImageId()))
-    }
-
-    private fun createTile(): DeviceControlsTile {
-        return DeviceControlsTile(
-                qsHost,
-                uiEventLogger,
-                testableLooper.looper,
-                Handler(testableLooper.looper),
-                FalsingManagerFake(),
-                metricsLogger,
-                statusBarStateController,
-                activityStarter,
-                qsLogger,
-                controlsComponent
-        ).also {
-            it.initialize()
-            testableLooper.processAllMessages()
-        }
-    }
-}
-
-private const val CONTROLS_ACTIVITY_CLASS_NAME = "com.android.systemui.controls.ui.ControlsActivity"
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
deleted file mode 100644
index 914bd0e..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
+++ /dev/null
@@ -1,511 +0,0 @@
-/*
- * Copyright (C) 2021 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.systemui.qs.tiles;
-
-import static android.content.pm.PackageManager.FEATURE_NFC_HOST_CARD_EMULATION;
-import static android.provider.Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertFalse;
-import static junit.framework.TestCase.assertNotNull;
-import static junit.framework.TestCase.assertNull;
-import static junit.framework.TestCase.assertTrue;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.graphics.Bitmap;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.service.quickaccesswallet.GetWalletCardsError;
-import android.service.quickaccesswallet.GetWalletCardsResponse;
-import android.service.quickaccesswallet.QuickAccessWalletClient;
-import android.service.quickaccesswallet.QuickAccessWalletService;
-import android.service.quickaccesswallet.WalletCard;
-import android.service.quicksettings.Tile;
-import android.testing.TestableLooper;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.classifier.FalsingManagerFake;
-import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.plugins.qs.QSTile;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.qs.QSHost;
-import com.android.systemui.qs.QsEventLogger;
-import com.android.systemui.qs.logging.QSLogger;
-import com.android.systemui.qs.tileimpl.QSTileImpl;
-import com.android.systemui.res.R;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-import com.android.systemui.util.settings.SecureSettings;
-import com.android.systemui.wallet.controller.QuickAccessWalletController;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.Collections;
-
-@RunWith(AndroidJUnit4.class)
-@TestableLooper.RunWithLooper(setAsMainLooper = true)
-@SmallTest
-public class QuickAccessWalletTileTest extends SysuiTestCase {
-
-    private static final String CARD_ID = "card_id";
-    private static final String LABEL = "QAW";
-    private static final String CARD_DESCRIPTION = "•••• 1234";
-    private static final Icon CARD_IMAGE =
-            Icon.createWithBitmap(Bitmap.createBitmap(70, 50, Bitmap.Config.ARGB_8888));
-    private static final int PRIMARY_USER_ID = 0;
-    private static final int SECONDARY_USER_ID = 10;
-
-    private final Drawable mTileIcon = mContext.getDrawable(R.drawable.ic_qs_wallet);
-    private final Intent mWalletIntent = new Intent(QuickAccessWalletService.ACTION_VIEW_WALLET)
-            .setComponent(new ComponentName(mContext.getPackageName(), "WalletActivity"));
-
-    @Mock
-    private QSHost mHost;
-    @Mock
-    private MetricsLogger mMetricsLogger;
-    @Mock
-    private StatusBarStateController mStatusBarStateController;
-    @Mock
-    private ActivityStarter mActivityStarter;
-    @Mock
-    private QSLogger mQSLogger;
-    @Mock
-    private QsEventLogger mUiEventLogger;
-    @Mock
-    private QuickAccessWalletClient mQuickAccessWalletClient;
-    @Mock
-    private KeyguardStateController mKeyguardStateController;
-    @Mock
-    private PackageManager mPackageManager;
-    @Mock
-    private SecureSettings mSecureSettings;
-    @Mock
-    private QuickAccessWalletController mController;
-    @Mock
-    private Icon mCardImage;
-    @Captor
-    ArgumentCaptor<QuickAccessWalletClient.OnWalletCardsRetrievedCallback> mCallbackCaptor;
-
-    private Context mSpiedContext;
-    private TestableLooper mTestableLooper;
-    private QuickAccessWalletTile mTile;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-
-        mTestableLooper = TestableLooper.get(this);
-        mSpiedContext = spy(mContext);
-
-        doNothing().when(mSpiedContext).startActivity(any(Intent.class));
-        when(mHost.getContext()).thenReturn(mSpiedContext);
-        when(mQuickAccessWalletClient.getServiceLabel()).thenReturn(LABEL);
-        when(mQuickAccessWalletClient.getTileIcon()).thenReturn(mTileIcon);
-        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true);
-        when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
-        when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true);
-        when(mController.getWalletClient()).thenReturn(mQuickAccessWalletClient);
-        when(mCardImage.getType()).thenReturn(Icon.TYPE_URI);
-        when(mCardImage.loadDrawableAsUser(any(), eq(SECONDARY_USER_ID))).thenReturn(null);
-
-        mTile = new QuickAccessWalletTile(
-                mHost,
-                mUiEventLogger,
-                mTestableLooper.getLooper(),
-                new Handler(mTestableLooper.getLooper()),
-                new FalsingManagerFake(),
-                mMetricsLogger,
-                mStatusBarStateController,
-                mActivityStarter,
-                mQSLogger,
-                mKeyguardStateController,
-                mPackageManager,
-                mSecureSettings,
-                mController);
-
-        mTile.initialize();
-        mTestableLooper.processAllMessages();
-    }
-
-    @After
-    public void tearDown() {
-        mTile.destroy();
-        mTestableLooper.processAllMessages();
-    }
-
-    @Test
-    public void testNewTile() {
-        assertFalse(mTile.newTileState().handlesLongClick);
-    }
-
-    @Test
-    public void testWalletServiceUnavailable_recreateWalletClient() {
-        when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false);
-
-        mTile.handleSetListening(true);
-
-        verify(mController, times(1)).reCreateWalletClient();
-    }
-
-    @Test
-    public void testWalletFeatureUnavailable_recreateWalletClient() {
-        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);
-
-        mTile.handleSetListening(true);
-
-        verify(mController, times(1)).reCreateWalletClient();
-    }
-
-    @Test
-    public void testIsAvailable_qawFeatureAvailableWalletUnavailable() {
-        when(mController.isWalletRoleAvailable()).thenReturn(false);
-        when(mPackageManager.hasSystemFeature(FEATURE_NFC_HOST_CARD_EMULATION)).thenReturn(true);
-        when(mPackageManager.hasSystemFeature("org.chromium.arc")).thenReturn(false);
-        when(mSecureSettings.getStringForUser(NFC_PAYMENT_DEFAULT_COMPONENT,
-                UserHandle.USER_CURRENT)).thenReturn("Component");
-
-        assertTrue(mTile.isAvailable());
-    }
-
-    @Test
-    public void testIsAvailable_nfcUnavailableWalletAvailable() {
-        when(mController.isWalletRoleAvailable()).thenReturn(true);
-        when(mHost.getUserId()).thenReturn(PRIMARY_USER_ID);
-        when(mPackageManager.hasSystemFeature(FEATURE_NFC_HOST_CARD_EMULATION)).thenReturn(false);
-        when(mPackageManager.hasSystemFeature("org.chromium.arc")).thenReturn(false);
-
-        assertTrue(mTile.isAvailable());
-    }
-
-    @Test
-    public void testHandleClick_startQuickAccessUiIntent_noCard() {
-        setUpWalletCard(/* hasCard= */ false);
-
-        mTile.handleClick(/* view= */ null);
-        mTestableLooper.processAllMessages();
-
-        verify(mController).startQuickAccessUiIntent(
-                eq(mActivityStarter),
-                eq(null),
-                /* hasCard= */ eq(false));
-    }
-
-    @Test
-    public void testHandleClick_startQuickAccessUiIntent_hasCard() {
-        setUpWalletCard(/* hasCard= */ true);
-
-        mTile.handleClick(null /* view */);
-        mTestableLooper.processAllMessages();
-
-        verify(mController).startQuickAccessUiIntent(
-                eq(mActivityStarter),
-                eq(null),
-                /* hasCard= */ eq(true));
-    }
-
-    @Test
-    public void testHandleUpdateState_updateLabelAndIcon() {
-        QSTile.State state = new QSTile.State();
-
-        mTile.handleUpdateState(state, null);
-
-        assertEquals(LABEL, state.label.toString());
-        assertTrue(state.label.toString().contentEquals(state.contentDescription));
-        assertEquals(mTileIcon, state.icon.getDrawable(mContext));
-    }
-
-    @Test
-    public void testHandleUpdateState_updateLabelAndIcon_noIconFromApi() {
-        when(mQuickAccessWalletClient.getTileIcon()).thenReturn(null);
-        QSTile.State state = new QSTile.State();
-        QSTile.Icon icon = QSTileImpl.ResourceIcon.get(R.drawable.ic_wallet_lockscreen);
-
-        mTile.handleUpdateState(state, null);
-
-        assertEquals(LABEL, state.label.toString());
-        assertTrue(state.label.toString().contentEquals(state.contentDescription));
-        assertEquals(icon, state.icon);
-    }
-
-    @Test
-    public void testGetTileLabel_serviceLabelExists() {
-        assertEquals(LABEL, mTile.getTileLabel().toString());
-    }
-
-    @Test
-    public void testGetTileLabel_serviceLabelDoesNotExist() {
-        when(mQuickAccessWalletClient.getServiceLabel()).thenReturn(null);
-        assertEquals(mContext.getString(R.string.wallet_title), mTile.getTileLabel().toString());
-    }
-
-    @Test
-    public void testHandleUpdateState_walletIsUpdating() {
-        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
-        QSTile.State state = new QSTile.State();
-        GetWalletCardsResponse response =
-                new GetWalletCardsResponse(
-                        Collections.singletonList(createWalletCard(mContext)), 0);
-
-        mTile.handleSetListening(true);
-
-        verify(mController).queryWalletCards(mCallbackCaptor.capture());
-
-        // Wallet cards fetching on its way; wallet updating.
-        mTile.handleUpdateState(state, null);
-
-        assertEquals(Tile.STATE_INACTIVE, state.state);
-        assertEquals(
-                mContext.getString(R.string.wallet_secondary_label_updating), state.secondaryLabel);
-        assertNotNull(state.stateDescription);
-        assertNull(state.sideViewCustomDrawable);
-
-        // Wallet cards fetching completed.
-        mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
-        mTestableLooper.processAllMessages();
-
-        mTile.handleUpdateState(state, null);
-
-        assertEquals(Tile.STATE_ACTIVE, state.state);
-        assertEquals(CARD_DESCRIPTION, state.secondaryLabel);
-        assertNotNull(state.stateDescription);
-        assertNotNull(state.sideViewCustomDrawable);
-    }
-
-    @Test
-    public void testHandleUpdateState_hasCard_deviceLocked_tileInactive() {
-        when(mKeyguardStateController.isUnlocked()).thenReturn(false);
-        QSTile.State state = new QSTile.State();
-        setUpWalletCard(/* hasCard= */ true);
-
-        mTile.handleUpdateState(state, null);
-
-        assertEquals(Tile.STATE_INACTIVE, state.state);
-        assertEquals(CARD_DESCRIPTION, state.secondaryLabel);
-        assertNotNull(state.stateDescription);
-        assertNotNull(state.sideViewCustomDrawable);
-    }
-
-    @Test
-    public void testHandleUpdateState_hasCard_deviceUnlocked_tileActive() {
-        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
-        QSTile.State state = new QSTile.State();
-        setUpWalletCard(/* hasCard= */ true);
-
-        mTile.handleUpdateState(state, null);
-
-        assertEquals(Tile.STATE_ACTIVE, state.state);
-        assertEquals(CARD_DESCRIPTION, state.secondaryLabel);
-        assertNotNull(state.stateDescription);
-        assertNotNull(state.sideViewCustomDrawable);
-    }
-
-
-    @Test
-    public void testHandleUpdateState_noCard_tileInactive() {
-        QSTile.State state = new QSTile.State();
-        setUpWalletCard(/* hasCard= */ false);
-
-        mTile.handleUpdateState(state, null);
-
-        assertEquals(Tile.STATE_INACTIVE, state.state);
-        assertEquals(
-                mContext.getString(R.string.wallet_secondary_label_no_card),
-                state.secondaryLabel);
-        assertNotNull(state.stateDescription);
-        assertNull(state.sideViewCustomDrawable);
-    }
-
-    @Test
-    public void testHandleUpdateState_qawServiceUnavailable_tileUnavailable() {
-        when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false);
-        QSTile.State state = new QSTile.State();
-
-        mTile.handleUpdateState(state, null);
-
-        assertEquals(Tile.STATE_UNAVAILABLE, state.state);
-        assertNull(state.stateDescription);
-        assertNull(state.sideViewCustomDrawable);
-    }
-
-    @Test
-    public void testHandleUpdateState_qawFeatureUnavailable_tileUnavailable() {
-        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);
-        QSTile.State state = new QSTile.State();
-
-        mTile.handleUpdateState(state, null);
-
-        assertEquals(Tile.STATE_UNAVAILABLE, state.state);
-        assertNull(state.stateDescription);
-        assertNull(state.sideViewCustomDrawable);
-    }
-
-    @Test
-    public void testHandleSetListening_queryCards() {
-        mTile.handleSetListening(true);
-
-        verify(mController).queryWalletCards(mCallbackCaptor.capture());
-
-        assertThat(mCallbackCaptor.getValue()).isInstanceOf(
-                QuickAccessWalletClient.OnWalletCardsRetrievedCallback.class);
-    }
-
-    @Test
-    public void testQueryCards_hasCards_updateSideViewDrawable() {
-        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
-        setUpWalletCard(/* hasCard= */ true);
-
-        assertNotNull(mTile.getState().sideViewCustomDrawable);
-    }
-
-    @Test
-    public void testQueryCards_notCurrentUser_hasCards_noSideViewDrawable() {
-        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
-
-        PendingIntent pendingIntent =
-                PendingIntent.getActivity(mContext, 0, mWalletIntent, PendingIntent.FLAG_IMMUTABLE);
-        WalletCard walletCard =
-                new WalletCard.Builder(
-                        CARD_ID, mCardImage, CARD_DESCRIPTION, pendingIntent).build();
-        GetWalletCardsResponse response =
-                new GetWalletCardsResponse(Collections.singletonList(walletCard), 0);
-
-        mTile.handleSetListening(true);
-
-        verify(mController).queryWalletCards(mCallbackCaptor.capture());
-
-        mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
-        mTestableLooper.processAllMessages();
-
-        assertNull(mTile.getState().sideViewCustomDrawable);
-    }
-
-    @Test
-    public void testQueryCards_cardDataPayment_updateSideViewDrawable() {
-        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
-        setUpWalletCardWithType(/* hasCard =*/ true, WalletCard.CARD_TYPE_PAYMENT);
-
-        assertNotNull(mTile.getState().sideViewCustomDrawable);
-    }
-
-    @Test
-    public void testQueryCards_cardDataNonPayment_updateSideViewDrawable() {
-        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
-        setUpWalletCardWithType(/* hasCard =*/ true, WalletCard.CARD_TYPE_NON_PAYMENT);
-
-        assertNull(mTile.getState().sideViewCustomDrawable);
-    }
-
-    @Test
-    public void testQueryCards_noCards_notUpdateSideViewDrawable() {
-        setUpWalletCard(/* hasCard= */ false);
-
-        assertNull(mTile.getState().sideViewCustomDrawable);
-    }
-
-    @Test
-    public void testQueryCards_error_notUpdateSideViewDrawable() {
-        String errorMessage = "getWalletCardsError";
-        GetWalletCardsError error = new GetWalletCardsError(CARD_IMAGE, errorMessage);
-
-        mTile.handleSetListening(true);
-
-        verify(mController).queryWalletCards(mCallbackCaptor.capture());
-
-        mCallbackCaptor.getValue().onWalletCardRetrievalError(error);
-        mTestableLooper.processAllMessages();
-
-        assertNull(mTile.getState().sideViewCustomDrawable);
-    }
-
-    @Test
-    public void testHandleSetListening_notListening_notQueryCards() {
-        mTile.handleSetListening(false);
-
-        verifyZeroInteractions(mQuickAccessWalletClient);
-    }
-
-    private WalletCard createWalletCardWithType(Context context, int cardType) {
-        PendingIntent pendingIntent =
-                PendingIntent.getActivity(context, 0, mWalletIntent, PendingIntent.FLAG_IMMUTABLE);
-        return new WalletCard.Builder(CARD_ID, cardType, CARD_IMAGE, CARD_DESCRIPTION,
-                pendingIntent).build();
-    }
-
-    private void setUpWalletCardWithType(boolean hasCard, int cardType) {
-        GetWalletCardsResponse response =
-                new GetWalletCardsResponse(
-                        hasCard
-                                ? Collections.singletonList(
-                                createWalletCardWithType(mContext, cardType))
-                                : Collections.EMPTY_LIST, 0);
-
-        mTile.handleSetListening(true);
-
-        verify(mController).queryWalletCards(mCallbackCaptor.capture());
-
-        mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
-        mTestableLooper.processAllMessages();
-    }
-
-    private void setUpWalletCard(boolean hasCard) {
-        GetWalletCardsResponse response =
-                new GetWalletCardsResponse(
-                        hasCard
-                                ? Collections.singletonList(createWalletCard(mContext))
-                                : Collections.EMPTY_LIST, 0);
-
-        mTile.handleSetListening(true);
-
-        verify(mController).queryWalletCards(mCallbackCaptor.capture());
-
-        mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
-        mTestableLooper.processAllMessages();
-    }
-
-    private WalletCard createWalletCard(Context context) {
-        PendingIntent pendingIntent =
-                PendingIntent.getActivity(context, 0, mWalletIntent, PendingIntent.FLAG_IMMUTABLE);
-        return new WalletCard.Builder(CARD_ID, CARD_IMAGE, CARD_DESCRIPTION, pendingIntent).build();
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/RecordIssueTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/RecordIssueTileTest.kt
index ca518f9..c7da03d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/RecordIssueTileTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/RecordIssueTileTest.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.qs.tiles
 
 import android.os.Handler
+import android.os.Looper
 import android.service.quicksettings.Tile
 import android.testing.TestableLooper
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -31,9 +32,10 @@
 import com.android.systemui.qs.QsEventLogger
 import com.android.systemui.qs.logging.QSLogger
 import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor
+import com.android.systemui.recordissue.IssueRecordingServiceConnection
 import com.android.systemui.recordissue.IssueRecordingState
 import com.android.systemui.recordissue.RecordIssueDialogDelegate
-import com.android.systemui.recordissue.TraceurMessageSender
+import com.android.systemui.recordissue.TraceurConnection
 import com.android.systemui.res.R
 import com.android.systemui.screenrecord.RecordingController
 import com.android.systemui.settings.UserContextProvider
@@ -75,13 +77,14 @@
     @Mock private lateinit var panelInteractor: PanelInteractor
     @Mock private lateinit var userContextProvider: UserContextProvider
     @Mock private lateinit var issueRecordingState: IssueRecordingState
-    @Mock private lateinit var traceurMessageSender: TraceurMessageSender
     @Mock private lateinit var delegateFactory: RecordIssueDialogDelegate.Factory
     @Mock private lateinit var dialogDelegate: RecordIssueDialogDelegate
     @Mock private lateinit var dialog: SystemUIDialog
 
     private lateinit var testableLooper: TestableLooper
     private lateinit var tile: RecordIssueTile
+    private lateinit var irsConnProvider: IssueRecordingServiceConnection.Provider
+    private lateinit var traceurConnProvider: TraceurConnection.Provider
 
     @Before
     fun setUp() {
@@ -90,6 +93,10 @@
         whenever(delegateFactory.create(any())).thenReturn(dialogDelegate)
         whenever(dialogDelegate.createDialog()).thenReturn(dialog)
 
+        irsConnProvider = IssueRecordingServiceConnection.Provider(userContextProvider)
+        traceurConnProvider =
+            TraceurConnection.Provider(userContextProvider, Looper.getMainLooper())
+
         testableLooper = TestableLooper.get(this)
         tile =
             RecordIssueTile(
@@ -107,7 +114,8 @@
                 dialogLauncherAnimator,
                 panelInteractor,
                 userContextProvider,
-                traceurMessageSender,
+                irsConnProvider,
+                traceurConnProvider,
                 Executors.newSingleThreadExecutor(),
                 issueRecordingState,
                 delegateFactory,
@@ -169,7 +177,7 @@
             .executeWhenUnlocked(
                 isA(ActivityStarter.OnDismissAction::class.java),
                 eq(false),
-                eq(true)
+                eq(true),
             )
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateControllerTest.java
index eea02ee..0b9c06f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateControllerTest.java
@@ -29,6 +29,7 @@
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -887,6 +888,34 @@
     }
 
     @Test
+    public void getActiveAutoSwitchNonDdsSubId_registerCallbackForExistedSubId_notRegister() {
+        mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true);
+
+        // Adds non DDS subId
+        SubscriptionInfo info = mock(SubscriptionInfo.class);
+        doReturn(SUB_ID2).when(info).getSubscriptionId();
+        doReturn(false).when(info).isOpportunistic();
+        when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info);
+
+        mInternetDialogController.getActiveAutoSwitchNonDdsSubId();
+
+        // 1st time is onStart(), 2nd time is getActiveAutoSwitchNonDdsSubId()
+        verify(mTelephonyManager, times(2)).registerTelephonyCallback(any(), any());
+        assertThat(mInternetDialogController.mSubIdTelephonyCallbackMap.size()).isEqualTo(2);
+
+        // Adds non DDS subId again
+        doReturn(SUB_ID2).when(info).getSubscriptionId();
+        doReturn(false).when(info).isOpportunistic();
+        when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info);
+
+        mInternetDialogController.getActiveAutoSwitchNonDdsSubId();
+
+        // Does not add due to cached subInfo in mSubIdTelephonyCallbackMap.
+        verify(mTelephonyManager, times(2)).registerTelephonyCallback(any(), any());
+        assertThat(mInternetDialogController.mSubIdTelephonyCallbackMap.size()).isEqualTo(2);
+    }
+
+    @Test
     public void getMobileNetworkSummary() {
         mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true);
         Resources res1 = mock(Resources.class);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt
index 148a2e5..52266ee 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt
@@ -29,7 +29,6 @@
 import java.util.UUID
 import kotlin.test.Test
 import kotlinx.coroutines.test.runTest
-import org.junit.Before
 import org.junit.runner.RunWith
 import org.mockito.Mockito.verifyNoMoreInteractions
 import org.mockito.kotlin.any
@@ -47,16 +46,11 @@
     private val uiEventLogger = mock<UiEventLogger>()
     private val actionsCallback = mock<ScreenshotActionsController.ActionsCallback>()
 
-    private val request = ScreenshotData.forTesting()
+    private val request = ScreenshotData.forTesting(userHandle = UserHandle.OWNER)
     private val validResult = ScreenshotSavedResult(Uri.EMPTY, Process.myUserHandle(), 0)
 
     private lateinit var actionsProvider: ScreenshotActionsProvider
 
-    @Before
-    fun setUp() {
-        request.userHandle = UserHandle.OWNER
-    }
-
     @Test
     fun previewActionAccessed_beforeScreenshotCompleted_doesNothing() {
         actionsProvider = createActionsProvider()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/MessageContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/MessageContainerControllerTest.kt
index 15da77d..4000d6c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/MessageContainerControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/MessageContainerControllerTest.kt
@@ -47,7 +47,7 @@
     lateinit var screenshotView: ViewGroup
 
     val userHandle = UserHandle.of(5)
-    val screenshotData = ScreenshotData.forTesting()
+    val screenshotData = ScreenshotData.forTesting(userHandle = userHandle)
 
     val appName = "app name"
     lateinit var workProfileData: WorkProfileMessageController.WorkProfileFirstRunData
@@ -61,7 +61,7 @@
                 workProfileMessageController,
                 profileMessageController,
                 screenshotDetectionController,
-                TestScope(UnconfinedTestDispatcher())
+                TestScope(UnconfinedTestDispatcher()),
             )
         screenshotView = ConstraintLayout(mContext)
         workProfileData = WorkProfileMessageController.WorkProfileFirstRunData(appName, icon)
@@ -83,8 +83,6 @@
         container.addView(detectionNoticeView)
 
         messageContainer.setView(screenshotView)
-
-        screenshotData.userHandle = userHandle
     }
 
     @Test
@@ -92,7 +90,7 @@
         val profileData =
             ProfileMessageController.ProfileFirstRunData(
                 LabeledIcon(appName, icon),
-                ProfileMessageController.FirstRunProfile.PRIVATE
+                ProfileMessageController.FirstRunProfile.PRIVATE,
             )
         whenever(profileMessageController.onScreenshotTaken(eq(userHandle))).thenReturn(profileData)
         messageContainer.onScreenshotTaken(screenshotData)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDataTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDataTest.kt
index 3ed0977..4ede90e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDataTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDataTest.kt
@@ -17,12 +17,12 @@
 package com.android.systemui.screenshot
 
 import android.content.ComponentName
-import androidx.test.ext.junit.runners.AndroidJUnit4
 import android.graphics.Insets
 import android.graphics.Rect
 import android.os.UserHandle
 import android.view.Display
 import android.view.WindowManager
+import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.android.internal.util.ScreenshotRequest
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
@@ -53,8 +53,8 @@
 
         assertThat(data.source).isEqualTo(source)
         assertThat(data.type).isEqualTo(type)
-        assertThat(data.screenBounds).isEqualTo(bounds)
-        assertThat(data.insets).isEqualTo(insets)
+        assertThat(data.originalScreenBounds).isEqualTo(bounds)
+        assertThat(data.originalInsets).isEqualTo(insets)
         assertThat(data.taskId).isEqualTo(taskId)
         assertThat(data.userHandle).isEqualTo(UserHandle.of(userId))
         assertThat(data.topComponent).isEqualTo(component)
@@ -71,15 +71,6 @@
     }
 
     @Test
-    fun testNegativeUserId() {
-        val request = ScreenshotRequest.Builder(type, source).setUserId(-1).build()
-
-        val data = ScreenshotData.fromRequest(request)
-
-        assertThat(data.userHandle).isNull()
-    }
-
-    @Test
     fun testPackageNameAsString() {
         val request = ScreenshotRequest.Builder(type, source).setTopComponent(component).build()
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDetectionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDetectionControllerTest.kt
index 1538c72..c5070286 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDetectionControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDetectionControllerTest.kt
@@ -61,8 +61,8 @@
 
     @Test
     fun testMaybeNotifyOfScreenshot_ignoresOverview() {
-        val data = ScreenshotData.forTesting()
-        data.source = WindowManager.ScreenshotSource.SCREENSHOT_OVERVIEW
+        val data =
+            ScreenshotData.forTesting(source = WindowManager.ScreenshotSource.SCREENSHOT_OVERVIEW)
 
         val list = controller.maybeNotifyOfScreenshot(data)
 
@@ -72,8 +72,8 @@
 
     @Test
     fun testMaybeNotifyOfScreenshot_emptySet() {
-        val data = ScreenshotData.forTesting()
-        data.source = WindowManager.ScreenshotSource.SCREENSHOT_KEY_CHORD
+        val data =
+            ScreenshotData.forTesting(source = WindowManager.ScreenshotSource.SCREENSHOT_KEY_CHORD)
 
         whenever(windowManager.notifyScreenshotListeners(eq(Display.DEFAULT_DISPLAY)))
             .thenReturn(listOf())
@@ -85,8 +85,8 @@
 
     @Test
     fun testMaybeNotifyOfScreenshot_oneApp() {
-        val data = ScreenshotData.forTesting()
-        data.source = WindowManager.ScreenshotSource.SCREENSHOT_KEY_CHORD
+        val data =
+            ScreenshotData.forTesting(source = WindowManager.ScreenshotSource.SCREENSHOT_KEY_CHORD)
 
         val component = ComponentName("package1", "class1")
         val appName = "app name"
@@ -95,7 +95,7 @@
         whenever(
                 packageManager.getActivityInfo(
                     eq(component),
-                    any(PackageManager.ComponentInfoFlags::class.java)
+                    any(PackageManager.ComponentInfoFlags::class.java),
                 )
             )
             .thenReturn(activityInfo)
@@ -112,8 +112,8 @@
 
     @Test
     fun testMaybeNotifyOfScreenshot_multipleApps() {
-        val data = ScreenshotData.forTesting()
-        data.source = WindowManager.ScreenshotSource.SCREENSHOT_KEY_CHORD
+        val data =
+            ScreenshotData.forTesting(source = WindowManager.ScreenshotSource.SCREENSHOT_KEY_CHORD)
 
         val component1 = ComponentName("package1", "class1")
         val component2 = ComponentName("package2", "class2")
@@ -129,21 +129,21 @@
         whenever(
                 packageManager.getActivityInfo(
                     eq(component1),
-                    any(PackageManager.ComponentInfoFlags::class.java)
+                    any(PackageManager.ComponentInfoFlags::class.java),
                 )
             )
             .thenReturn(activityInfo1)
         whenever(
                 packageManager.getActivityInfo(
                     eq(component2),
-                    any(PackageManager.ComponentInfoFlags::class.java)
+                    any(PackageManager.ComponentInfoFlags::class.java),
                 )
             )
             .thenReturn(activityInfo2)
         whenever(
                 packageManager.getActivityInfo(
                     eq(component3),
-                    any(PackageManager.ComponentInfoFlags::class.java)
+                    any(PackageManager.ComponentInfoFlags::class.java),
                 )
             )
             .thenReturn(activityInfo3)
@@ -165,11 +165,13 @@
 
     private fun includesFlagBits(@PackageManager.ComponentInfoFlagsBits mask: Int) =
         ComponentInfoFlagMatcher(mask, mask)
+
     private fun excludesFlagBits(@PackageManager.ComponentInfoFlagsBits mask: Int) =
         ComponentInfoFlagMatcher(mask, 0)
 
     private class ComponentInfoFlagMatcher(
-        @PackageManager.ComponentInfoFlagsBits val mask: Int, val value: Int
+        @PackageManager.ComponentInfoFlagsBits val mask: Int,
+        val value: Int,
     ) : ArgumentMatcher<PackageManager.ComponentInfoFlags> {
         override fun matches(flags: PackageManager.ComponentInfoFlags?): Boolean {
             return flags != null && (mask.toLong() and flags.value) == value.toLong()
@@ -182,26 +184,28 @@
 
     @Test
     fun testMaybeNotifyOfScreenshot_disabledApp() {
-        val data = ScreenshotData.forTesting()
-        data.source = WindowManager.ScreenshotSource.SCREENSHOT_KEY_CHORD
+        val data =
+            ScreenshotData.forTesting(source = WindowManager.ScreenshotSource.SCREENSHOT_KEY_CHORD)
 
         val component = ComponentName("package1", "class1")
         val appName = "app name"
         val activityInfo = mock(ActivityInfo::class.java)
 
         whenever(
-            packageManager.getActivityInfo(
-                eq(component),
-                argThat(includesFlagBits(MATCH_DISABLED_COMPONENTS or MATCH_ANY_USER))
+                packageManager.getActivityInfo(
+                    eq(component),
+                    argThat(includesFlagBits(MATCH_DISABLED_COMPONENTS or MATCH_ANY_USER)),
+                )
             )
-        ).thenReturn(activityInfo)
+            .thenReturn(activityInfo)
 
         whenever(
-            packageManager.getActivityInfo(
-                eq(component),
-                argThat(excludesFlagBits(MATCH_DISABLED_COMPONENTS))
+                packageManager.getActivityInfo(
+                    eq(component),
+                    argThat(excludesFlagBits(MATCH_DISABLED_COMPONENTS)),
+                )
             )
-        ).thenThrow(PackageManager.NameNotFoundException::class.java)
+            .thenThrow(PackageManager.NameNotFoundException::class.java)
 
         whenever(windowManager.notifyScreenshotListeners(eq(Display.DEFAULT_DISPLAY)))
             .thenReturn(listOf(component))
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt
index a295981..27e9f07 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt
@@ -3,6 +3,8 @@
 import android.content.ComponentName
 import android.graphics.Bitmap
 import android.net.Uri
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
 import android.view.Display
 import android.view.Display.TYPE_EXTERNAL
 import android.view.Display.TYPE_INTERNAL
@@ -15,8 +17,10 @@
 import androidx.test.filters.SmallTest
 import com.android.internal.logging.testing.UiEventLoggerFake
 import com.android.internal.util.ScreenshotRequest
+import com.android.systemui.Flags
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.display.data.repository.FakeDisplayRepository
+import com.android.systemui.display.data.repository.FakeFocusedDisplayRepository
 import com.android.systemui.display.data.repository.display
 import com.android.systemui.util.mockito.any
 import com.android.systemui.util.mockito.eq
@@ -55,6 +59,7 @@
     private val testScope = TestScope(UnconfinedTestDispatcher())
     private val eventLogger = UiEventLoggerFake()
     private val headlessHandler = mock<HeadlessScreenshotHandler>()
+    private val focusedDisplayRepository = FakeFocusedDisplayRepository()
 
     private val screenshotExecutor =
         TakeScreenshotExecutorImpl(
@@ -65,6 +70,7 @@
             eventLogger,
             notificationControllerFactory,
             headlessHandler,
+            focusedDisplayRepository,
         )
 
     @Before
@@ -75,6 +81,7 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
     fun executeScreenshots_severalDisplays_callsControllerForEachOne() =
         testScope.runTest {
             val internalDisplay = display(TYPE_INTERNAL, id = 0)
@@ -106,6 +113,7 @@
         }
 
     @Test
+    @DisableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
     fun executeScreenshots_providedImageType_callsOnlyDefaultDisplayController() =
         testScope.runTest {
             val internalDisplay = display(TYPE_INTERNAL, id = 0)
@@ -115,7 +123,7 @@
             screenshotExecutor.executeScreenshots(
                 createScreenshotRequest(TAKE_SCREENSHOT_PROVIDED_IMAGE),
                 onSaved,
-                callback
+                callback,
             )
 
             verify(controllerFactory).create(eq(internalDisplay))
@@ -137,6 +145,7 @@
         }
 
     @Test
+    @DisableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
     fun executeScreenshots_onlyVirtualDisplays_noInteractionsWithControllers() =
         testScope.runTest {
             setDisplays(display(TYPE_VIRTUAL, id = 0), display(TYPE_VIRTUAL, id = 1))
@@ -149,6 +158,7 @@
         }
 
     @Test
+    @DisableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
     fun executeScreenshots_allowedTypes_allCaptured() =
         testScope.runTest {
             whenever(controllerFactory.create(any())).thenReturn(controller)
@@ -157,7 +167,7 @@
                 display(TYPE_INTERNAL, id = 0),
                 display(TYPE_EXTERNAL, id = 1),
                 display(TYPE_OVERLAY, id = 2),
-                display(TYPE_WIFI, id = 3)
+                display(TYPE_WIFI, id = 3),
             )
             val onSaved = { _: Uri? -> }
             screenshotExecutor.executeScreenshots(createScreenshotRequest(), onSaved, callback)
@@ -168,6 +178,7 @@
         }
 
     @Test
+    @DisableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
     fun executeScreenshots_reportsOnFinishedOnlyWhenBothFinished() =
         testScope.runTest {
             setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -193,6 +204,7 @@
         }
 
     @Test
+    @DisableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
     fun executeScreenshots_oneFinishesOtherFails_reportFailsOnlyAtTheEnd() =
         testScope.runTest {
             setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -220,6 +232,7 @@
         }
 
     @Test
+    @DisableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
     fun executeScreenshots_allDisplaysFail_reportsFail() =
         testScope.runTest {
             setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -247,6 +260,111 @@
         }
 
     @Test
+    @EnableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
+    fun executeScreenshots_fromOverview_honorsDisplay() =
+        testScope.runTest {
+            val displayId = 1
+            setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = displayId))
+            val onSaved = { _: Uri? -> }
+            screenshotExecutor.executeScreenshots(
+                createScreenshotRequest(
+                    displayId = displayId,
+                    source = WindowManager.ScreenshotSource.SCREENSHOT_OVERVIEW,
+                ),
+                onSaved,
+                callback,
+            )
+
+            val dataCaptor = ArgumentCaptor<ScreenshotData>()
+
+            verify(controller).handleScreenshot(dataCaptor.capture(), any(), any())
+
+            assertThat(dataCaptor.value.displayId).isEqualTo(displayId)
+
+            screenshotExecutor.onDestroy()
+        }
+
+    @Test
+    @EnableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
+    fun executeScreenshots_fromOverviewInvalidDisplay_usesDefault() =
+        testScope.runTest {
+            setDisplays(
+                display(TYPE_INTERNAL, id = Display.DEFAULT_DISPLAY),
+                display(TYPE_EXTERNAL, id = 1),
+            )
+            val onSaved = { _: Uri? -> }
+            screenshotExecutor.executeScreenshots(
+                createScreenshotRequest(
+                    displayId = 5,
+                    source = WindowManager.ScreenshotSource.SCREENSHOT_OVERVIEW,
+                ),
+                onSaved,
+                callback,
+            )
+
+            val dataCaptor = ArgumentCaptor<ScreenshotData>()
+
+            verify(controller).handleScreenshot(dataCaptor.capture(), any(), any())
+
+            assertThat(dataCaptor.value.displayId).isEqualTo(Display.DEFAULT_DISPLAY)
+
+            screenshotExecutor.onDestroy()
+        }
+
+    @Test
+    @EnableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
+    fun executeScreenshots_keyOther_usesFocusedDisplay() =
+        testScope.runTest {
+            val displayId = 1
+            setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = displayId))
+            val onSaved = { _: Uri? -> }
+            focusedDisplayRepository.emit(displayId)
+
+            screenshotExecutor.executeScreenshots(
+                createScreenshotRequest(
+                    source = WindowManager.ScreenshotSource.SCREENSHOT_KEY_OTHER
+                ),
+                onSaved,
+                callback,
+            )
+
+            val dataCaptor = ArgumentCaptor<ScreenshotData>()
+
+            verify(controller).handleScreenshot(dataCaptor.capture(), any(), any())
+
+            assertThat(dataCaptor.value.displayId).isEqualTo(displayId)
+
+            screenshotExecutor.onDestroy()
+        }
+
+    @Test
+    @EnableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
+    fun executeScreenshots_keyOtherInvalidDisplay_usesDefault() =
+        testScope.runTest {
+            setDisplays(
+                display(TYPE_INTERNAL, id = Display.DEFAULT_DISPLAY),
+                display(TYPE_EXTERNAL, id = 1),
+            )
+            focusedDisplayRepository.emit(5) // invalid display
+            val onSaved = { _: Uri? -> }
+            screenshotExecutor.executeScreenshots(
+                createScreenshotRequest(
+                    source = WindowManager.ScreenshotSource.SCREENSHOT_KEY_OTHER
+                ),
+                onSaved,
+                callback,
+            )
+
+            val dataCaptor = ArgumentCaptor<ScreenshotData>()
+
+            verify(controller).handleScreenshot(dataCaptor.capture(), any(), any())
+
+            assertThat(dataCaptor.value.displayId).isEqualTo(Display.DEFAULT_DISPLAY)
+
+            screenshotExecutor.onDestroy()
+        }
+
+    @Test
     fun onDestroy_propagatedToControllers() =
         testScope.runTest {
             setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -319,6 +437,7 @@
         }
 
     @Test
+    @DisableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
     fun executeScreenshots_errorFromProcessor_logsScreenshotRequested() =
         testScope.runTest {
             setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -336,6 +455,7 @@
         }
 
     @Test
+    @DisableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
     fun executeScreenshots_errorFromProcessor_logsUiError() =
         testScope.runTest {
             setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -379,7 +499,8 @@
         }
 
     @Test
-    fun executeScreenshots_errorFromScreenshotController_reportsRequested() =
+    @DisableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
+    fun executeScreenshots_errorFromScreenshotController_multidisplay_reportsRequested() =
         testScope.runTest {
             setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
             val onSaved = { _: Uri? -> }
@@ -399,7 +520,27 @@
         }
 
     @Test
-    fun executeScreenshots_errorFromScreenshotController_reportsError() =
+    @EnableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
+    fun executeScreenshots_errorFromScreenshotController_reportsRequested() =
+        testScope.runTest {
+            setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
+            val onSaved = { _: Uri? -> }
+            whenever(controller.handleScreenshot(any(), any(), any()))
+                .thenThrow(IllegalStateException::class.java)
+
+            screenshotExecutor.executeScreenshots(createScreenshotRequest(), onSaved, callback)
+
+            val screenshotRequested =
+                eventLogger.logs.filter {
+                    it.eventId == ScreenshotEvent.SCREENSHOT_REQUESTED_KEY_OTHER.id
+                }
+            assertThat(screenshotRequested).hasSize(1)
+            screenshotExecutor.onDestroy()
+        }
+
+    @Test
+    @DisableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
+    fun executeScreenshots_errorFromScreenshotController_multidisplay_reportsError() =
         testScope.runTest {
             setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
             val onSaved = { _: Uri? -> }
@@ -419,7 +560,27 @@
         }
 
     @Test
-    fun executeScreenshots_errorFromScreenshotController_showsErrorNotification() =
+    @EnableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
+    fun executeScreenshots_errorFromScreenshotController_reportsError() =
+        testScope.runTest {
+            setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
+            val onSaved = { _: Uri? -> }
+            whenever(controller.handleScreenshot(any(), any(), any()))
+                .thenThrow(IllegalStateException::class.java)
+
+            screenshotExecutor.executeScreenshots(createScreenshotRequest(), onSaved, callback)
+
+            val screenshotRequested =
+                eventLogger.logs.filter {
+                    it.eventId == ScreenshotEvent.SCREENSHOT_CAPTURE_FAILED.id
+                }
+            assertThat(screenshotRequested).hasSize(1)
+            screenshotExecutor.onDestroy()
+        }
+
+    @Test
+    @DisableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
+    fun executeScreenshots_errorFromScreenshotController_multidisplay_showsErrorNotification() =
         testScope.runTest {
             setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
             val onSaved = { _: Uri? -> }
@@ -436,6 +597,21 @@
         }
 
     @Test
+    @EnableFlags(Flags.FLAG_SCREENSHOT_MULTIDISPLAY_FOCUS_CHANGE)
+    fun executeScreenshots_errorFromScreenshotController_showsErrorNotification() =
+        testScope.runTest {
+            setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
+            val onSaved = { _: Uri? -> }
+            whenever(controller.handleScreenshot(any(), any(), any()))
+                .thenThrow(IllegalStateException::class.java)
+
+            screenshotExecutor.executeScreenshots(createScreenshotRequest(), onSaved, callback)
+
+            verify(notificationsController0).notifyScreenshotError(any())
+            screenshotExecutor.onDestroy()
+        }
+
+    @Test
     fun executeScreenshots_finisherCalledWithNullUri_succeeds() =
         testScope.runTest {
             setDisplays(display(TYPE_INTERNAL, id = 0))
@@ -459,9 +635,14 @@
         runCurrent()
     }
 
-    private fun createScreenshotRequest(type: Int = WindowManager.TAKE_SCREENSHOT_FULLSCREEN) =
-        ScreenshotRequest.Builder(type, WindowManager.ScreenshotSource.SCREENSHOT_KEY_OTHER)
+    private fun createScreenshotRequest(
+        type: Int = WindowManager.TAKE_SCREENSHOT_FULLSCREEN,
+        source: Int = WindowManager.ScreenshotSource.SCREENSHOT_KEY_OTHER,
+        displayId: Int = Display.DEFAULT_DISPLAY,
+    ) =
+        ScreenshotRequest.Builder(type, source)
             .setTopComponent(topComponent)
+            .setDisplayId(displayId)
             .also {
                 if (type == TAKE_SCREENSHOT_PROVIDED_IMAGE) {
                     it.setBitmap(Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888))
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/PolicyRequestProcessorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/PolicyRequestProcessorTest.kt
index bab9bbb..e4329a5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/PolicyRequestProcessorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/PolicyRequestProcessorTest.kt
@@ -58,13 +58,13 @@
             ScreenshotData(
                 TAKE_SCREENSHOT_FULLSCREEN,
                 SCREENSHOT_KEY_CHORD,
-                null,
+                UserHandle.CURRENT,
                 topComponent = null,
-                screenBounds = Rect(0, 0, 1, 1),
+                originalScreenBounds = Rect(0, 0, 1, 1),
                 taskId = -1,
-                insets = Insets.NONE,
+                originalInsets = Insets.NONE,
                 bitmap = null,
-                displayId = DEFAULT_DISPLAY
+                displayId = DEFAULT_DISPLAY,
             )
 
         /* Create a policy request processor with no capture policies */
@@ -75,7 +75,7 @@
                 policies = emptyList(),
                 defaultOwner = UserHandle.of(PERSONAL),
                 defaultComponent = ComponentName("default", "Component"),
-                displayTasks = fullScreenWork
+                displayTasks = fullScreenWork,
             )
 
         val result = runBlocking { requestProcessor.process(request) }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
index a6afd0e..0e9ef06 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
@@ -22,10 +22,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static kotlinx.coroutines.flow.FlowKt.emptyFlow;
-import static kotlinx.coroutines.flow.SharedFlowKt.MutableSharedFlow;
-import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow;
-
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyFloat;
@@ -40,6 +36,10 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import static kotlinx.coroutines.flow.FlowKt.emptyFlow;
+import static kotlinx.coroutines.flow.SharedFlowKt.MutableSharedFlow;
+import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow;
+
 import android.animation.Animator;
 import android.annotation.IdRes;
 import android.content.ContentResolver;
@@ -95,6 +95,7 @@
 import com.android.systemui.flags.Flags;
 import com.android.systemui.fragments.FragmentHostManager;
 import com.android.systemui.fragments.FragmentService;
+import com.android.systemui.haptics.msdl.FakeMSDLPlayer;
 import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
 import com.android.systemui.keyguard.KeyguardViewConfigurator;
 import com.android.systemui.keyguard.data.repository.FakeKeyguardClockRepository;
@@ -151,6 +152,7 @@
 import com.android.systemui.statusbar.disableflags.data.repository.FakeDisableFlagsRepository;
 import com.android.systemui.statusbar.notification.ConversationNotificationManager;
 import com.android.systemui.statusbar.notification.DynamicPrivacyController;
+import com.android.systemui.statusbar.notification.HeadsUpTouchHelper;
 import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
 import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinatorLogger;
 import com.android.systemui.statusbar.notification.data.repository.NotificationsKeyguardViewStateRepository;
@@ -167,7 +169,6 @@
 import com.android.systemui.statusbar.phone.ConfigurationControllerImpl;
 import com.android.systemui.statusbar.phone.DozeParameters;
 import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
-import com.android.systemui.statusbar.notification.HeadsUpTouchHelper;
 import com.android.systemui.statusbar.phone.KeyguardBottomAreaView;
 import com.android.systemui.statusbar.phone.KeyguardBottomAreaViewController;
 import com.android.systemui.statusbar.phone.KeyguardBypassController;
@@ -200,12 +201,6 @@
 import com.android.systemui.util.time.SystemClock;
 import com.android.wm.shell.animation.FlingAnimationUtils;
 
-import dagger.Lazy;
-
-import kotlinx.coroutines.CoroutineDispatcher;
-import kotlinx.coroutines.channels.BufferOverflow;
-import kotlinx.coroutines.test.TestScope;
-
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -220,6 +215,11 @@
 import java.util.List;
 import java.util.Optional;
 
+import dagger.Lazy;
+import kotlinx.coroutines.CoroutineDispatcher;
+import kotlinx.coroutines.channels.BufferOverflow;
+import kotlinx.coroutines.test.TestScope;
+
 public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
 
     protected static final int SPLIT_SHADE_FULL_TRANSITION_DISTANCE = 400;
@@ -374,6 +374,7 @@
     protected View.OnLayoutChangeListener mLayoutChangeListener;
     protected KeyguardStatusViewController mKeyguardStatusViewController;
     protected ShadeRepository mShadeRepository;
+    protected FakeMSDLPlayer mMSDLPlayer = mKosmos.getMsdlPlayer();
 
     protected final FalsingManagerFake mFalsingManager = new FalsingManagerFake();
     protected final Optional<SysUIUnfoldComponent> mSysUIUnfoldComponent = Optional.empty();
@@ -555,11 +556,13 @@
             return null;
         }).when(mView).setOnTouchListener(any(NotificationPanelViewController.TouchHandler.class));
 
-        // Dreaming->Lockscreen
+        // Any edge transition
         when(mKeyguardTransitionInteractor.transition(any()))
                 .thenReturn(emptyFlow());
         when(mKeyguardTransitionInteractor.transition(any(), any()))
                 .thenReturn(emptyFlow());
+
+        // Dreaming->Lockscreen
         when(mDreamingToLockscreenTransitionViewModel.getLockscreenAlpha())
                 .thenReturn(emptyFlow());
         when(mDreamingToLockscreenTransitionViewModel.lockscreenTranslationY(anyInt()))
@@ -761,7 +764,8 @@
                 new ResourcesSplitShadeStateController(),
                 mPowerInteractor,
                 mKeyguardClockPositionAlgorithm,
-                mNaturalScrollingSettingObserver);
+                mNaturalScrollingSettingObserver,
+                mMSDLPlayer);
         mNotificationPanelViewController.initDependencies(
                 mCentralSurfaces,
                 null,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
index a7fd160..43dbb40 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
@@ -49,6 +49,7 @@
 import android.platform.test.annotations.DisableFlags;
 import android.platform.test.annotations.EnableFlags;
 import android.testing.TestableLooper;
+import android.view.HapticFeedbackConstants;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.accessibility.AccessibilityNodeInfo;
@@ -69,6 +70,8 @@
 import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
 import com.android.systemui.statusbar.phone.KeyguardClockPositionAlgorithm;
 
+import com.google.android.msdl.data.model.MSDLToken;
+
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -1458,4 +1461,23 @@
 
         assertThat(mNotificationPanelViewController.getFalsingThreshold()).isGreaterThan(14);
     }
+
+    @Test
+    @EnableFlags(com.android.systemui.Flags.FLAG_MSDL_FEEDBACK)
+    public void performHapticFeedback_withMSDL_forGestureStart_deliversDragThresholdToken() {
+        mNotificationPanelViewController
+                .performHapticFeedback(HapticFeedbackConstants.GESTURE_START);
+
+        assertThat(mMSDLPlayer.getLatestTokenPlayed())
+                .isEqualTo(MSDLToken.SWIPE_THRESHOLD_INDICATOR);
+    }
+
+    @Test
+    @EnableFlags(com.android.systemui.Flags.FLAG_MSDL_FEEDBACK)
+    public void performHapticFeedback_withMSDL_forReject_deliversFailureToken() {
+        mNotificationPanelViewController
+                .performHapticFeedback(HapticFeedbackConstants.REJECT);
+
+        assertThat(mMSDLPlayer.getLatestTokenPlayed()).isEqualTo(MSDLToken.FAILURE);
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt
index 90655c3..97441f0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt
@@ -33,7 +33,6 @@
 import com.android.systemui.statusbar.StatusBarState.KEYGUARD
 import com.android.systemui.statusbar.StatusBarState.SHADE
 import com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED
-import com.android.systemui.statusbar.notification.data.repository.FakeHeadsUpRowRepository
 import com.android.systemui.util.mockito.eq
 import com.android.systemui.util.mockito.whenever
 import com.google.common.truth.Truth.assertThat
@@ -157,6 +156,7 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_MSDL_FEEDBACK)
     fun doubleTapRequired_onKeyguard_usesPerformHapticFeedback() = runTest {
         launch(Dispatchers.Main.immediate) {
             val listener = getFalsingTapListener()
@@ -184,6 +184,7 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_MSDL_FEEDBACK)
     fun doubleTapRequired_shadeLocked_usesPerformHapticFeedback() = runTest {
         launch(Dispatchers.Main.immediate) {
             val listener = getFalsingTapListener()
@@ -209,7 +210,7 @@
                     KEYGUARD /*statusBarState*/,
                     false /*keyguardFadingAway*/,
                     false /*goingToFullShade*/,
-                    SHADE /*oldStatusBarState*/
+                    SHADE, /*oldStatusBarState*/
                 )
         }
         advanceUntilIdle()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java
index 308b370..9a8df33 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java
@@ -31,7 +31,7 @@
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
@@ -642,7 +642,7 @@
         when(mShadeCarrier1.isVisibleToUser()).thenReturn(false);
 
         captor.getValue().onClick(mShadeCarrier1);
-        verifyZeroInteractions(mActivityStarter);
+        verifyNoMoreInteractions(mActivityStarter);
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImplTest.kt
index a1750cd..b1ec740 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImplTest.kt
@@ -21,6 +21,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.compose.animation.scene.ObservableTransitionState
+import com.android.compose.animation.scene.OverlayKey
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
 import com.android.systemui.coroutines.collectLastValue
@@ -28,6 +29,7 @@
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
 import com.android.systemui.keyguard.shared.model.StatusBarState
 import com.android.systemui.kosmos.testScope
+import com.android.systemui.scene.data.repository.setSceneTransition
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.shared.model.Overlays
 import com.android.systemui.scene.shared.model.Scenes
@@ -38,9 +40,9 @@
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.test.TestScope
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
-import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -55,14 +57,9 @@
     private val configurationRepository = kosmos.fakeConfigurationRepository
     private val keyguardRepository = kosmos.fakeKeyguardRepository
     private val sceneInteractor = kosmos.sceneInteractor
-    private val shadeTestUtil = kosmos.shadeTestUtil
+    private val shadeTestUtil by lazy { kosmos.shadeTestUtil }
 
-    private lateinit var underTest: ShadeInteractorSceneContainerImpl
-
-    @Before
-    fun setUp() {
-        underTest = kosmos.shadeInteractorSceneContainerImpl
-    }
+    private val underTest by lazy { kosmos.shadeInteractorSceneContainerImpl }
 
     @Test
     fun qsExpansionWhenInSplitShadeAndQsExpanded() =
@@ -600,14 +597,14 @@
 
     @Test
     @EnableFlags(DualShade.FLAG_NAME)
-    fun expandNotificationShade_dualShadeEnabled_opensOverlay() =
+    fun expandNotificationsShade_dualShade_opensOverlay() =
         testScope.runTest {
             val currentScene by collectLastValue(sceneInteractor.currentScene)
             val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
             assertThat(currentOverlays).isEmpty()
 
-            underTest.expandNotificationShade("reason")
+            underTest.expandNotificationsShade("reason")
 
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
             assertThat(currentOverlays).containsExactly(Overlays.NotificationsShade)
@@ -615,14 +612,15 @@
 
     @Test
     @DisableFlags(DualShade.FLAG_NAME)
-    fun expandNotificationShade_dualShadeDisabled_switchesToShadeScene() =
+    fun expandNotificationsShade_singleShade_switchesToShadeScene() =
         testScope.runTest {
+            shadeTestUtil.setSplitShade(false)
             val currentScene by collectLastValue(sceneInteractor.currentScene)
             val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
             assertThat(currentOverlays).isEmpty()
 
-            underTest.expandNotificationShade("reason")
+            underTest.expandNotificationsShade("reason")
 
             assertThat(currentScene).isEqualTo(Scenes.Shade)
             assertThat(currentOverlays).isEmpty()
@@ -630,7 +628,7 @@
 
     @Test
     @EnableFlags(DualShade.FLAG_NAME)
-    fun expandNotificationShade_dualShadeEnabledAndQuickSettingsOpen_replacesOverlay() =
+    fun expandNotificationsShade_dualShadeQuickSettingsOpen_replacesOverlay() =
         testScope.runTest {
             val currentScene by collectLastValue(sceneInteractor.currentScene)
             val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
@@ -638,14 +636,14 @@
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
             assertThat(currentOverlays).containsExactly(Overlays.QuickSettingsShade)
 
-            underTest.expandNotificationShade("reason")
+            underTest.expandNotificationsShade("reason")
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
             assertThat(currentOverlays).containsExactly(Overlays.NotificationsShade)
         }
 
     @Test
     @EnableFlags(DualShade.FLAG_NAME)
-    fun expandQuickSettingsShade_dualShadeEnabled_opensOverlay() =
+    fun expandQuickSettingsShade_dualShade_opensOverlay() =
         testScope.runTest {
             val currentScene by collectLastValue(sceneInteractor.currentScene)
             val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
@@ -660,8 +658,9 @@
 
     @Test
     @DisableFlags(DualShade.FLAG_NAME)
-    fun expandQuickSettingsShade_dualShadeDisabled_switchesToQuickSettingsScene() =
+    fun expandQuickSettingsShade_singleShade_switchesToQuickSettingsScene() =
         testScope.runTest {
+            shadeTestUtil.setSplitShade(false)
             val currentScene by collectLastValue(sceneInteractor.currentScene)
             val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
@@ -674,12 +673,28 @@
         }
 
     @Test
+    @DisableFlags(DualShade.FLAG_NAME)
+    fun expandQuickSettingsShade_splitShade_switchesToShadeScene() =
+        testScope.runTest {
+            shadeTestUtil.setSplitShade(true)
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            assertThat(currentOverlays).isEmpty()
+
+            underTest.expandQuickSettingsShade("reason")
+
+            assertThat(currentScene).isEqualTo(Scenes.Shade)
+            assertThat(currentOverlays).isEmpty()
+        }
+
+    @Test
     @EnableFlags(DualShade.FLAG_NAME)
-    fun expandQuickSettingsShade_dualShadeEnabledAndNotificationsOpen_replacesOverlay() =
+    fun expandQuickSettingsShade_dualShadeNotificationsOpen_replacesOverlay() =
         testScope.runTest {
             val currentScene by collectLastValue(sceneInteractor.currentScene)
             val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
-            underTest.expandNotificationShade("reason")
+            underTest.expandNotificationsShade("reason")
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
             assertThat(currentOverlays).containsExactly(Overlays.NotificationsShade)
 
@@ -687,4 +702,141 @@
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
             assertThat(currentOverlays).containsExactly(Overlays.QuickSettingsShade)
         }
+
+    @Test
+    @EnableFlags(DualShade.FLAG_NAME)
+    fun collapseNotificationsShade_dualShade_hidesOverlay() =
+        testScope.runTest {
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            openShade(Overlays.NotificationsShade)
+
+            underTest.collapseNotificationsShade("reason")
+
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            assertThat(currentOverlays).isEmpty()
+        }
+
+    @Test
+    @DisableFlags(DualShade.FLAG_NAME)
+    fun collapseNotificationsShade_singleShade_switchesToLockscreen() =
+        testScope.runTest {
+            shadeTestUtil.setSplitShade(false)
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            sceneInteractor.changeScene(Scenes.Shade, "reason")
+            assertThat(currentScene).isEqualTo(Scenes.Shade)
+            assertThat(currentOverlays).isEmpty()
+
+            underTest.collapseNotificationsShade("reason")
+
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            assertThat(currentOverlays).isEmpty()
+        }
+
+    @Test
+    @EnableFlags(DualShade.FLAG_NAME)
+    fun collapseQuickSettingsShade_dualShade_hidesOverlay() =
+        testScope.runTest {
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            openShade(Overlays.QuickSettingsShade)
+
+            underTest.collapseQuickSettingsShade("reason")
+
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            assertThat(currentOverlays).isEmpty()
+        }
+
+    @Test
+    @DisableFlags(DualShade.FLAG_NAME)
+    fun collapseQuickSettingsShadeNotBypassingShade_singleShade_switchesToShade() =
+        testScope.runTest {
+            shadeTestUtil.setSplitShade(false)
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            sceneInteractor.changeScene(Scenes.QuickSettings, "reason")
+            assertThat(currentScene).isEqualTo(Scenes.QuickSettings)
+            assertThat(currentOverlays).isEmpty()
+
+            underTest.collapseQuickSettingsShade(
+                loggingReason = "reason",
+                bypassNotificationsShade = false,
+            )
+
+            assertThat(currentScene).isEqualTo(Scenes.Shade)
+            assertThat(currentOverlays).isEmpty()
+        }
+
+    @Test
+    @DisableFlags(DualShade.FLAG_NAME)
+    fun collapseQuickSettingsShadeNotBypassingShade_splitShade_switchesToLockscreen() =
+        testScope.runTest {
+            shadeTestUtil.setSplitShade(true)
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            sceneInteractor.changeScene(Scenes.QuickSettings, "reason")
+            assertThat(currentScene).isEqualTo(Scenes.QuickSettings)
+            assertThat(currentOverlays).isEmpty()
+
+            underTest.collapseQuickSettingsShade(
+                loggingReason = "reason",
+                bypassNotificationsShade = false,
+            )
+
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            assertThat(currentOverlays).isEmpty()
+        }
+
+    @Test
+    @DisableFlags(DualShade.FLAG_NAME)
+    fun collapseQuickSettingsShadeBypassingShade_singleShade_switchesToLockscreen() =
+        testScope.runTest {
+            shadeTestUtil.setSplitShade(false)
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            sceneInteractor.changeScene(Scenes.QuickSettings, "reason")
+            assertThat(currentScene).isEqualTo(Scenes.QuickSettings)
+            assertThat(currentOverlays).isEmpty()
+
+            underTest.collapseQuickSettingsShade(
+                loggingReason = "reason",
+                bypassNotificationsShade = true,
+            )
+
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            assertThat(currentOverlays).isEmpty()
+        }
+
+    @Test
+    @EnableFlags(DualShade.FLAG_NAME)
+    fun collapseEitherShade_dualShade_hidesBothOverlays() =
+        testScope.runTest {
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+            openShade(Overlays.QuickSettingsShade)
+            openShade(Overlays.NotificationsShade)
+            assertThat(currentOverlays)
+                .containsExactly(Overlays.QuickSettingsShade, Overlays.NotificationsShade)
+
+            underTest.collapseEitherShade("reason")
+
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+            assertThat(currentOverlays).isEmpty()
+        }
+
+    private fun TestScope.openShade(overlay: OverlayKey) {
+        val isAnyExpanded by collectLastValue(underTest.isAnyExpanded)
+        val currentScene by collectLastValue(sceneInteractor.currentScene)
+        val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
+        val initialScene = checkNotNull(currentScene)
+        sceneInteractor.showOverlay(overlay, "reason")
+        kosmos.setSceneTransition(
+            ObservableTransitionState.Idle(initialScene, checkNotNull(currentOverlays))
+        )
+        runCurrent()
+        assertThat(currentScene).isEqualTo(initialScene)
+        assertThat(currentOverlays).contains(overlay)
+        assertThat(isAnyExpanded).isTrue()
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextViewTest.kt
new file mode 100644
index 0000000..040a9e9
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextViewTest.kt
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.shared.clocks.FontTextStyle
+import com.android.systemui.shared.clocks.LogUtil
+import com.android.systemui.shared.clocks.view.SimpleDigitalClockTextView
+import org.junit.Assert.assertEquals
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class SimpleDigitalClockTextViewTest : SysuiTestCase() {
+    private val messageBuffer = LogUtil.DEBUG_MESSAGE_BUFFER
+    private lateinit var underTest: SimpleDigitalClockTextView
+    private val defaultLargeClockTextSize = 500F
+    private val smallerTextSize = 300F
+    private val largerTextSize = 800F
+    private val firstMeasureTextSize = 100F
+
+    @Before
+    fun setup() {
+        underTest = SimpleDigitalClockTextView(context, messageBuffer)
+        underTest.textStyle = FontTextStyle()
+        underTest.aodStyle = FontTextStyle()
+        underTest.text = "0"
+        underTest.applyTextSize(defaultLargeClockTextSize)
+    }
+
+    @Test
+    fun applySmallerConstrainedTextSize_applyConstrainedTextSize() {
+        underTest.applyTextSize(smallerTextSize, constrainedByHeight = true)
+        assertEquals(smallerTextSize, underTest.textSize * underTest.fontSizeAdjustFactor)
+    }
+
+    @Test
+    fun applyLargerConstrainedTextSize_applyUnconstrainedTextSize() {
+        underTest.applyTextSize(largerTextSize, constrainedByHeight = true)
+        assertEquals(defaultLargeClockTextSize, underTest.textSize)
+    }
+
+    @Test
+    fun applyFirstMeasureConstrainedTextSize_getConstrainedTextSize() {
+        underTest.applyTextSize(firstMeasureTextSize, constrainedByHeight = true)
+        underTest.applyTextSize(smallerTextSize, constrainedByHeight = true)
+        assertEquals(smallerTextSize, underTest.textSize * underTest.fontSizeAdjustFactor)
+    }
+
+    @Test
+    fun applySmallFirstMeasureConstrainedSizeAndLargerConstrainedTextSize_applyDefaultSize() {
+        underTest.applyTextSize(firstMeasureTextSize, constrainedByHeight = true)
+        underTest.applyTextSize(largerTextSize, constrainedByHeight = true)
+        assertEquals(defaultLargeClockTextSize, underTest.textSize)
+    }
+
+    @Test
+    fun applyFirstMeasureConstrainedTextSize_applyUnconstrainedTextSize() {
+        underTest.applyTextSize(firstMeasureTextSize, constrainedByHeight = true)
+        underTest.applyTextSize(defaultLargeClockTextSize)
+        assertEquals(defaultLargeClockTextSize, underTest.textSize)
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/system/QuickStepContractTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shared/system/QuickStepContractTest.kt
index 6254fb1..ef03fab 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shared/system/QuickStepContractTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shared/system/QuickStepContractTest.kt
@@ -21,7 +21,7 @@
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING
 import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_COMMUNAL_HUB_SHOWING
-import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE
+import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED
 import com.google.common.truth.Truth.assertThat
 import kotlin.test.Test
 import org.junit.runner.RunWith
@@ -41,9 +41,9 @@
     }
 
     @Test
-    fun isBackGestureDisabled_hubAndShadeShowing() {
+    fun isBackGestureDisabled_hubAndQSExpanded() {
         val sysuiStateFlags =
-            SYSUI_STATE_COMMUNAL_HUB_SHOWING and SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE
+            SYSUI_STATE_COMMUNAL_HUB_SHOWING and SYSUI_STATE_QUICK_SETTINGS_EXPANDED
 
         // Gestures are enabled because the shade shows over the hub.
         assertThat(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
index d10ea1f..2b5e014 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
@@ -26,7 +26,6 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
 
 import android.content.ComponentName;
 import android.graphics.Rect;
@@ -393,7 +392,7 @@
         mCommandQueue.addQsTileToFrontOrEnd(c, true);
         waitForIdleSync();
 
-        verifyZeroInteractions(mCallbacks);
+        verifyNoMoreInteractions(mCallbacks);
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsReceiverTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsReceiverTest.java
index e0eb99c..2cb9791 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsReceiverTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsReceiverTest.java
@@ -22,7 +22,7 @@
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 import android.content.Intent;
@@ -138,7 +138,7 @@
 
         mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT);
 
-        verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch);
+        verifyNoMoreInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch);
     }
 
     @Test
@@ -149,7 +149,7 @@
 
         mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT);
 
-        verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch);
+        verifyNoMoreInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch);
     }
 
     @Test
@@ -160,7 +160,7 @@
 
         mKeyboardShortcutsReceiver.onReceive(mContext, DISMISS_INTENT);
 
-        verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch);
+        verifyNoMoreInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch);
     }
 
     @Test
@@ -171,6 +171,6 @@
 
         mKeyboardShortcutsReceiver.onReceive(mContext, DISMISS_INTENT);
 
-        verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch);
+        verifyNoMoreInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch);
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
index 9e6a498..a8618eb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
@@ -60,7 +60,7 @@
 import org.mockito.Mockito.clearInvocations
 import org.mockito.Mockito.never
 import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
+import org.mockito.Mockito.verifyNoMoreInteractions
 import org.mockito.Mockito.`when` as whenever
 import org.mockito.junit.MockitoJUnit
 
@@ -557,7 +557,7 @@
             transitionController.dragDownAmount = 10f
 
             verify(singleShadeOverScroller).expansionDragDownAmount = 10f
-            verifyZeroInteractions(splitShadeOverScroller)
+            verifyNoMoreInteractions(splitShadeOverScroller)
         }
 
     @Test
@@ -568,7 +568,7 @@
             transitionController.dragDownAmount = 10f
 
             verify(splitShadeOverScroller).expansionDragDownAmount = 10f
-            verifyZeroInteractions(singleShadeOverScroller)
+            verifyNoMoreInteractions(singleShadeOverScroller)
         }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScrollerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScrollerTest.kt
index 58473c4..98487f7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScrollerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScrollerTest.kt
@@ -3,6 +3,7 @@
 import android.testing.TestableLooper
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.plugins.qs.QS
@@ -19,7 +20,6 @@
 import org.mockito.Mockito.reset
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.verifyNoMoreInteractions
-import org.mockito.Mockito.verifyZeroInteractions
 import org.mockito.Mockito.`when` as whenever
 import org.mockito.MockitoAnnotations
 
@@ -30,6 +30,7 @@
 
     private val configurationController = FakeConfigurationController()
 
+    @OptIn(ExperimentalCoroutinesApi::class)
     @Mock private lateinit var scrimController: ScrimController
     @Mock private lateinit var statusBarStateController: SysuiStatusBarStateController
     private var qS: QS? = null
@@ -71,9 +72,9 @@
 
         setDragAmount(1000f)
 
-        verifyZeroInteractions(qS)
-        verifyZeroInteractions(scrimController)
-        verifyZeroInteractions(nsslController)
+        verifyNoMoreInteractions(qS)
+        verifyNoMoreInteractions(scrimController)
+        verifyNoMoreInteractions(nsslController)
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarSignalPolicyTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarSignalPolicyTest.kt
deleted file mode 100644
index 593f873..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarSignalPolicyTest.kt
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar
-
-import android.platform.test.annotations.DisableFlags
-import android.platform.test.annotations.EnableFlags
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.internal.R
-import com.android.settingslib.mobile.TelephonyIcons
-import com.android.systemui.Flags.FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.kosmos.testCase
-import com.android.systemui.statusbar.connectivity.IconState
-import com.android.systemui.statusbar.connectivity.NetworkController
-import com.android.systemui.statusbar.phone.StatusBarSignalPolicy
-import com.android.systemui.statusbar.phone.StatusBarSignalPolicy_Factory
-import com.android.systemui.statusbar.phone.ui.StatusBarIconController
-import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.airplaneModeInteractor
-import com.android.systemui.statusbar.policy.SecurityController
-import com.android.systemui.tuner.TunerService
-import com.android.systemui.util.CarrierConfigTracker
-import com.android.systemui.util.kotlin.JavaAdapter
-import com.android.systemui.util.mockito.mock
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.runner.RunWith
-import org.mockito.Mockito.verify
-import org.mockito.kotlin.clearInvocations
-import org.mockito.kotlin.verifyZeroInteractions
-import kotlin.test.Test
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class StatusBarSignalPolicyTest : SysuiTestCase() {
-    private val kosmos = Kosmos().also { it.testCase = this }
-
-    private lateinit var underTest: StatusBarSignalPolicy
-
-    private val testScope = TestScope()
-
-    private val javaAdapter = JavaAdapter(testScope.backgroundScope)
-    private val airplaneModeInteractor = kosmos.airplaneModeInteractor
-
-    private val securityController = mock<SecurityController>()
-    private val tunerService = mock<TunerService>()
-    private val statusBarIconController = mock<StatusBarIconController>()
-    private val networkController = mock<NetworkController>()
-    private val carrierConfigTracker = mock<CarrierConfigTracker>()
-
-    private var slotAirplane: String? = null
-
-    @Before
-    fun setup() {
-        underTest =
-            StatusBarSignalPolicy_Factory.newInstance(
-                mContext,
-                statusBarIconController,
-                carrierConfigTracker,
-                networkController,
-                securityController,
-                tunerService,
-                javaAdapter,
-                airplaneModeInteractor,
-            )
-
-        slotAirplane = mContext.getString(R.string.status_bar_airplane)
-    }
-
-    @Test
-    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
-    fun airplaneModeViaInteractor_statusBarSignalPolicyRefactorFlagEnabled_iconUpdated() =
-        testScope.runTest {
-            underTest.start()
-            airplaneModeInteractor.setIsAirplaneMode(true)
-            runCurrent()
-            verify(statusBarIconController).setIconVisibility(slotAirplane, true)
-
-            airplaneModeInteractor.setIsAirplaneMode(false)
-            runCurrent()
-            verify(statusBarIconController).setIconVisibility(slotAirplane, false)
-        }
-
-    @Test
-    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
-    fun airplaneModeViaSignalCallback_statusBarSignalPolicyRefactorFlagEnabled_iconNotUpdated() =
-        testScope.runTest {
-            underTest.start()
-            runCurrent()
-            clearInvocations(statusBarIconController)
-
-            // Make sure the legacy code path does not change airplane mode when the refactor
-            // flag is enabled.
-            underTest.setIsAirplaneMode(IconState(true, TelephonyIcons.FLIGHT_MODE_ICON, ""))
-            runCurrent()
-            verifyZeroInteractions(statusBarIconController)
-
-            underTest.setIsAirplaneMode(IconState(false, TelephonyIcons.FLIGHT_MODE_ICON, ""))
-            runCurrent()
-            verifyZeroInteractions(statusBarIconController)
-        }
-
-    @Test
-    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
-    fun statusBarSignalPolicyInitialization_statusBarSignalPolicyRefactorFlagEnabled_initNoOp() =
-        testScope.runTest {
-            // Make sure StatusBarSignalPolicy.init does no initialization when
-            // the refactor flag is disabled.
-            underTest.init()
-            verifyZeroInteractions(securityController, networkController, tunerService)
-        }
-
-    @Test
-    @DisableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
-    fun airplaneModeViaSignalCallback_statusBarSignalPolicyRefactorFlagDisabled_iconUpdated() =
-        testScope.runTest {
-            underTest.init()
-
-            underTest.setIsAirplaneMode(IconState(true, TelephonyIcons.FLIGHT_MODE_ICON, ""))
-            runCurrent()
-            verify(statusBarIconController).setIconVisibility(slotAirplane, true)
-
-            underTest.setIsAirplaneMode(IconState(false, TelephonyIcons.FLIGHT_MODE_ICON, ""))
-            runCurrent()
-            verify(statusBarIconController).setIconVisibility(slotAirplane, false)
-        }
-
-    @Test
-    @DisableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
-    fun airplaneModeViaInteractor_statusBarSignalPolicyRefactorFlagDisabled_iconNotUpdated() =
-        testScope.runTest {
-            underTest.init()
-
-            // Make sure changing airplane mode from airplaneModeRepository does nothing
-            // if the StatusBarSignalPolicyRefactor is not enabled.
-            airplaneModeInteractor.setIsAirplaneMode(true)
-            runCurrent()
-            verifyZeroInteractions(statusBarIconController)
-
-            airplaneModeInteractor.setIsAirplaneMode(false)
-            runCurrent()
-            verifyZeroInteractions(statusBarIconController)
-        }
-
-    @Test
-    @DisableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
-    fun statusBarSignalPolicyInitialization_statusBarSignalPolicyRefactorFlagDisabled_startNoOp() =
-        testScope.runTest {
-            // Make sure StatusBarSignalPolicy.start does no initialization when
-            // the refactor flag is disabled.
-            underTest.start()
-            verifyZeroInteractions(securityController, networkController, tunerService)
-        }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java
index 98315d0c..83dbfa0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java
@@ -95,6 +95,7 @@
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 public class NetworkControllerBaseTest extends SysuiTestCase {
@@ -332,10 +333,15 @@
     }
 
     public void setConnectivityViaCallbackInNetworkControllerForVcn(
-            int networkType, boolean validated, boolean isConnected, VcnTransportInfo info) {
+            int networkType,
+            boolean validated,
+            boolean isConnected,
+            VcnTransportInfo info,
+            Network underlyingNetwork) {
         final NetworkCapabilities.Builder builder =
                 new NetworkCapabilities.Builder(mNetCapabilities);
-        builder.setTransportInfo(info);
+        builder.setTransportInfo(info)
+                .setUnderlyingNetworks(Collections.singletonList(underlyingNetwork));
         setConnectivityCommon(builder, networkType, validated, isConnected);
         mDefaultCallbackInNetworkController.onCapabilitiesChanged(
                 mock(Network.class), builder.build());
@@ -385,10 +391,15 @@
     }
 
     public void setConnectivityViaCallbackInWifiTrackerForVcn(
-            int networkType, boolean validated, boolean isConnected, VcnTransportInfo info) {
+            int networkType,
+            boolean validated,
+            boolean isConnected,
+            VcnTransportInfo info,
+            Network underlyingNetwork) {
         final NetworkCapabilities.Builder builder =
                 new NetworkCapabilities.Builder(mNetCapabilities);
-        builder.setTransportInfo(info);
+        builder.setTransportInfo(info)
+                .setUnderlyingNetworks(Collections.singletonList(underlyingNetwork));
         setConnectivityCommon(builder, networkType, validated, isConnected);
         if (networkType == NetworkCapabilities.TRANSPORT_CELLULAR) {
             if (isConnected) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java
index 6c80a97..6febb91 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java
@@ -18,6 +18,7 @@
 
 import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
 import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
 
 import static junit.framework.Assert.assertEquals;
 
@@ -250,6 +251,17 @@
         assertEquals(testSsid, mNetworkController.mWifiSignalController.mCurrentState.ssid);
     }
 
+    private Network newWifiNetwork(WifiInfo wifiInfo) {
+        final Network network = mock(Network.class);
+        final NetworkCapabilities wifiCaps =
+                new NetworkCapabilities.Builder()
+                        .addTransportType(TRANSPORT_WIFI)
+                        .setTransportInfo(wifiInfo)
+                        .build();
+        when(mMockCm.getNetworkCapabilities(network)).thenReturn(wifiCaps);
+        return network;
+    }
+
     @Test
     public void testVcnWithUnderlyingWifi() {
         String testSsid = "Test VCN SSID";
@@ -266,11 +278,19 @@
             setWifiLevelForVcn(testLevel);
 
             setConnectivityViaCallbackInNetworkControllerForVcn(
-                    NetworkCapabilities.TRANSPORT_CELLULAR, true, true, mVcnTransportInfo);
+                    NetworkCapabilities.TRANSPORT_CELLULAR,
+                    true,
+                    true,
+                    mVcnTransportInfo,
+                    newWifiNetwork(mWifiInfo));
             verifyLastMobileDataIndicatorsForVcn(true, testLevel, TelephonyIcons.ICON_CWF, true);
 
             setConnectivityViaCallbackInNetworkControllerForVcn(
-                    NetworkCapabilities.TRANSPORT_CELLULAR, false, true, mVcnTransportInfo);
+                    NetworkCapabilities.TRANSPORT_CELLULAR,
+                    false,
+                    true,
+                    mVcnTransportInfo,
+                    newWifiNetwork(mWifiInfo));
             verifyLastMobileDataIndicatorsForVcn(true, testLevel, TelephonyIcons.ICON_CWF, false);
         }
     }
@@ -391,13 +411,15 @@
     }
 
     protected void setWifiLevelForVcn(int level) {
-        when(mVcnTransportInfo.getWifiInfo()).thenReturn(mWifiInfo);
-        when(mVcnTransportInfo.makeCopy(anyLong())).thenReturn(mVcnTransportInfo);
         when(mWifiInfo.getRssi()).thenReturn(calculateRssiForLevel(level));
         when(mWifiInfo.isCarrierMerged()).thenReturn(true);
         when(mWifiInfo.getSubscriptionId()).thenReturn(1);
         setConnectivityViaCallbackInWifiTrackerForVcn(
-                NetworkCapabilities.TRANSPORT_CELLULAR, false, true, mVcnTransportInfo);
+                NetworkCapabilities.TRANSPORT_CELLULAR,
+                false,
+                true,
+                mVcnTransportInfo,
+                newWifiNetwork(mWifiInfo));
     }
 
     private int calculateRssiForLevel(int level) {
@@ -409,13 +431,15 @@
     }
 
     protected void setWifiStateForVcn(boolean connected, String ssid) {
-        when(mVcnTransportInfo.getWifiInfo()).thenReturn(mWifiInfo);
-        when(mVcnTransportInfo.makeCopy(anyLong())).thenReturn(mVcnTransportInfo);
         when(mWifiInfo.getSSID()).thenReturn(ssid);
         when(mWifiInfo.isCarrierMerged()).thenReturn(true);
         when(mWifiInfo.getSubscriptionId()).thenReturn(1);
         setConnectivityViaCallbackInWifiTrackerForVcn(
-                NetworkCapabilities.TRANSPORT_CELLULAR, false, connected, mVcnTransportInfo);
+                NetworkCapabilities.TRANSPORT_CELLULAR,
+                false,
+                connected,
+                mVcnTransportInfo,
+                newWifiNetwork(mWifiInfo));
     }
 
     protected void verifyLastQsDataDirection(boolean in, boolean out) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/CommandQueueInitializerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/CommandQueueInitializerTest.kt
new file mode 100644
index 0000000..2a196c6
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/CommandQueueInitializerTest.kt
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.core
+
+import android.internal.statusbar.fakeStatusBarService
+import android.platform.test.annotations.EnableFlags
+import android.view.WindowInsets
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.initController
+import com.android.systemui.keyguard.data.repository.fakeCommandQueue
+import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository
+import com.android.systemui.statusbar.mockCommandQueueCallbacks
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.verify
+
+@EnableFlags(StatusBarSimpleFragment.FLAG_NAME)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class CommandQueueInitializerTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+    private val initController = kosmos.initController
+    private val commandQueue = kosmos.fakeCommandQueue
+    private val commandQueueCallbacks = kosmos.mockCommandQueueCallbacks
+    private val statusBarModeRepository = kosmos.fakeStatusBarModeRepository
+    private val fakeStatusBarService = kosmos.fakeStatusBarService
+    private val initializer = kosmos.commandQueueInitializer
+
+    @Test
+    fun start_registersStatusBar() {
+        initializer.start()
+
+        assertThat(fakeStatusBarService.registeredStatusBar).isNotNull()
+    }
+
+    @Test
+    fun start_barResultHasTransientStatusBar_transientStateIsTrue() {
+        fakeStatusBarService.transientBarTypes = WindowInsets.Type.statusBars()
+
+        initializer.start()
+
+        assertThat(statusBarModeRepository.defaultDisplay.isTransientShown.value).isTrue()
+    }
+
+    @Test
+    fun start_barResultDoesNotHaveTransientStatusBar_transientStateIsFalse() {
+        fakeStatusBarService.transientBarTypes = WindowInsets.Type.navigationBars()
+
+        initializer.start()
+
+        assertThat(statusBarModeRepository.defaultDisplay.isTransientShown.value).isFalse()
+    }
+
+    @Test
+    fun start_callsOnSystemBarAttributesChanged_basedOnRegisterBarResult() {
+        initializer.start()
+
+        verify(commandQueueCallbacks)
+            .onSystemBarAttributesChanged(
+                context.displayId,
+                fakeStatusBarService.appearance,
+                fakeStatusBarService.appearanceRegions,
+                fakeStatusBarService.navbarColorManagedByIme,
+                fakeStatusBarService.behavior,
+                fakeStatusBarService.requestedVisibleTypes,
+                fakeStatusBarService.packageName,
+                fakeStatusBarService.letterboxDetails,
+            )
+    }
+
+    @Test
+    fun start_callsSetIcon_basedOnRegisterBarResult() {
+        initializer.start()
+
+        assertThat(commandQueue.icons).isEqualTo(fakeStatusBarService.statusBarIcons)
+    }
+
+    @Test
+    fun start_callsSetImeWindowStatus_basedOnRegisterBarResult() {
+        initializer.start()
+
+        verify(commandQueueCallbacks)
+            .setImeWindowStatus(
+                context.displayId,
+                fakeStatusBarService.imeWindowVis,
+                fakeStatusBarService.imeBackDisposition,
+                fakeStatusBarService.showImeSwitcher,
+            )
+    }
+
+    @Test
+    fun start_afterPostInitTaskExecuted_callsDisableFlags_basedOnRegisterBarResult() {
+        initializer.start()
+
+        initController.executePostInitTasks()
+
+        assertThat(commandQueue.disableFlags1ForDisplay(context.displayId))
+            .isEqualTo(fakeStatusBarService.disabledFlags1)
+        assertThat(commandQueue.disableFlags2ForDisplay(context.displayId))
+            .isEqualTo(fakeStatusBarService.disabledFlags2)
+    }
+
+    @Test
+    fun start_beforePostInitTaskExecuted_doesNotCallsDisableFlags() {
+        initializer.start()
+
+        assertThat(commandQueue.disableFlags1ForDisplay(context.displayId)).isNull()
+        assertThat(commandQueue.disableFlags2ForDisplay(context.displayId)).isNull()
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/StatusBarOrchestratorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/StatusBarOrchestratorTest.kt
new file mode 100644
index 0000000..5803365
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/core/StatusBarOrchestratorTest.kt
@@ -0,0 +1,335 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.core
+
+import android.platform.test.annotations.EnableFlags
+import android.view.View
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.kosmos.unconfinedTestDispatcher
+import com.android.systemui.plugins.DarkIconDispatcher
+import com.android.systemui.plugins.mockPluginDependencyProvider
+import com.android.systemui.plugins.statusbar.StatusBarStateController
+import com.android.systemui.power.data.repository.fakePowerRepository
+import com.android.systemui.power.shared.model.WakeSleepReason
+import com.android.systemui.power.shared.model.WakefulnessState
+import com.android.systemui.shade.mockNotificationShadeWindowViewController
+import com.android.systemui.shade.mockShadeSurface
+import com.android.systemui.statusbar.data.model.StatusBarMode
+import com.android.systemui.statusbar.data.model.StatusBarMode.LIGHTS_OUT
+import com.android.systemui.statusbar.data.model.StatusBarMode.LIGHTS_OUT_TRANSPARENT
+import com.android.systemui.statusbar.data.model.StatusBarMode.OPAQUE
+import com.android.systemui.statusbar.data.model.StatusBarMode.TRANSPARENT
+import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository
+import com.android.systemui.statusbar.phone.mockPhoneStatusBarTransitions
+import com.android.systemui.statusbar.phone.mockPhoneStatusBarViewController
+import com.android.systemui.statusbar.window.data.model.StatusBarWindowState
+import com.android.systemui.statusbar.window.data.repository.fakeStatusBarWindowStateRepositoryStore
+import com.android.systemui.statusbar.window.data.repository.statusBarWindowStateRepositoryStore
+import com.android.systemui.statusbar.window.fakeStatusBarWindowController
+import com.android.systemui.testKosmos
+import com.android.wm.shell.bubbles.bubbles
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.never
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
+
+@EnableFlags(StatusBarSimpleFragment.FLAG_NAME)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class StatusBarOrchestratorTest : SysuiTestCase() {
+
+    private val kosmos =
+        testKosmos().also {
+            it.testDispatcher = it.unconfinedTestDispatcher
+            it.statusBarWindowStateRepositoryStore = it.fakeStatusBarWindowStateRepositoryStore
+        }
+    private val testScope = kosmos.testScope
+    private val statusBarViewController = kosmos.mockPhoneStatusBarViewController
+    private val statusBarWindowController = kosmos.fakeStatusBarWindowController
+    private val statusBarModeRepository = kosmos.fakeStatusBarModeRepository
+    private val pluginDependencyProvider = kosmos.mockPluginDependencyProvider
+    private val notificationShadeWindowViewController =
+        kosmos.mockNotificationShadeWindowViewController
+    private val shadeSurface = kosmos.mockShadeSurface
+    private val bouncerRepository = kosmos.fakeKeyguardBouncerRepository
+    private val fakeStatusBarWindowStateRepositoryStore =
+        kosmos.fakeStatusBarWindowStateRepositoryStore
+    private val fakePowerRepository = kosmos.fakePowerRepository
+    private val mockPhoneStatusBarTransitions = kosmos.mockPhoneStatusBarTransitions
+    private val mockBubbles = kosmos.bubbles
+
+    private val orchestrator = kosmos.statusBarOrchestrator
+
+    @Test
+    fun start_setsUpPluginDependencies() {
+        orchestrator.start()
+
+        verify(pluginDependencyProvider).allowPluginDependency(DarkIconDispatcher::class.java)
+        verify(pluginDependencyProvider).allowPluginDependency(StatusBarStateController::class.java)
+    }
+
+    @Test
+    fun start_attachesWindow() {
+        orchestrator.start()
+
+        assertThat(statusBarWindowController.isAttached).isTrue()
+    }
+
+    @Test
+    fun start_setsStatusBarControllerOnShade() {
+        orchestrator.start()
+
+        verify(notificationShadeWindowViewController)
+            .setStatusBarViewController(statusBarViewController)
+    }
+
+    @Test
+    fun start_updatesShadeExpansion() {
+        orchestrator.start()
+
+        verify(shadeSurface).updateExpansionAndVisibility()
+    }
+
+    @Test
+    fun bouncerShowing_setsImportanceForA11yToNoHideDescendants() =
+        testScope.runTest {
+            orchestrator.start()
+
+            bouncerRepository.setPrimaryShow(isShowing = true)
+
+            verify(statusBarViewController)
+                .setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS)
+        }
+
+    @Test
+    fun bouncerNotShowing_setsImportanceForA11yToNoHideDescendants() =
+        testScope.runTest {
+            orchestrator.start()
+
+            bouncerRepository.setPrimaryShow(isShowing = false)
+
+            verify(statusBarViewController)
+                .setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO)
+        }
+
+    @Test
+    fun deviceGoesToSleep_barTransitionsAnimationsAreFinished() =
+        testScope.runTest {
+            putDeviceToSleep()
+
+            orchestrator.start()
+
+            verify(mockPhoneStatusBarTransitions).finishAnimations()
+        }
+
+    @Test
+    fun deviceIsAwake_barTransitionsAnimationsAreNotFinished() =
+        testScope.runTest {
+            awakeDevice()
+
+            orchestrator.start()
+
+            verify(mockPhoneStatusBarTransitions, never()).finishAnimations()
+        }
+
+    @Test
+    fun statusBarVisible_notifiesBubbles() =
+        testScope.runTest {
+            setStatusBarMode(TRANSPARENT)
+            setStatusBarWindowState(StatusBarWindowState.Showing)
+
+            orchestrator.start()
+
+            verify(mockBubbles).onStatusBarVisibilityChanged(/* visible= */ true)
+        }
+
+    @Test
+    fun statusBarInLightsOutMode_notifiesBubblesWithStatusBarInvisible() =
+        testScope.runTest {
+            setStatusBarMode(LIGHTS_OUT)
+            setStatusBarWindowState(StatusBarWindowState.Showing)
+
+            orchestrator.start()
+
+            verify(mockBubbles).onStatusBarVisibilityChanged(/* visible= */ false)
+        }
+
+    @Test
+    fun statusBarInLightsOutTransparentMode_notifiesBubblesWithStatusBarInvisible() =
+        testScope.runTest {
+            setStatusBarMode(LIGHTS_OUT_TRANSPARENT)
+            setStatusBarWindowState(StatusBarWindowState.Showing)
+
+            orchestrator.start()
+
+            verify(mockBubbles).onStatusBarVisibilityChanged(/* visible= */ false)
+        }
+
+    @Test
+    fun statusBarWindowNotShowing_notifiesBubblesWithStatusBarInvisible() =
+        testScope.runTest {
+            setStatusBarMode(TRANSPARENT)
+            setStatusBarWindowState(StatusBarWindowState.Hidden)
+
+            orchestrator.start()
+
+            verify(mockBubbles).onStatusBarVisibilityChanged(/* visible= */ false)
+        }
+
+    @Test
+    fun statusBarModeChange_transitionsToModeWithAnimation() =
+        testScope.runTest {
+            awakeDevice()
+            clearTransientStatusBar()
+            setStatusBarWindowState(StatusBarWindowState.Showing)
+            setStatusBarMode(TRANSPARENT)
+
+            orchestrator.start()
+
+            verify(mockPhoneStatusBarTransitions)
+                .transitionTo(TRANSPARENT.toTransitionModeInt(), /* animate= */ true)
+        }
+
+    @Test
+    fun statusBarModeChange_keepsTransitioningAsModeChanges() =
+        testScope.runTest {
+            awakeDevice()
+            clearTransientStatusBar()
+            setStatusBarWindowState(StatusBarWindowState.Showing)
+            setStatusBarMode(TRANSPARENT)
+
+            orchestrator.start()
+
+            verify(mockPhoneStatusBarTransitions)
+                .transitionTo(TRANSPARENT.toTransitionModeInt(), /* animate= */ true)
+
+            setStatusBarMode(OPAQUE)
+            verify(mockPhoneStatusBarTransitions)
+                .transitionTo(OPAQUE.toTransitionModeInt(), /* animate= */ true)
+
+            setStatusBarMode(LIGHTS_OUT)
+            verify(mockPhoneStatusBarTransitions)
+                .transitionTo(LIGHTS_OUT.toTransitionModeInt(), /* animate= */ true)
+
+            setStatusBarMode(LIGHTS_OUT_TRANSPARENT)
+            verify(mockPhoneStatusBarTransitions)
+                .transitionTo(LIGHTS_OUT_TRANSPARENT.toTransitionModeInt(), /* animate= */ true)
+        }
+
+    @Test
+    fun statusBarModeChange_transientIsShown_transitionsToModeWithoutAnimation() =
+        testScope.runTest {
+            awakeDevice()
+            setTransientStatusBar()
+            setStatusBarWindowState(StatusBarWindowState.Showing)
+            setStatusBarMode(TRANSPARENT)
+
+            orchestrator.start()
+
+            verify(mockPhoneStatusBarTransitions)
+                .transitionTo(/* mode= */ TRANSPARENT.toTransitionModeInt(), /* animate= */ false)
+        }
+
+    @Test
+    fun statusBarModeChange_windowIsHidden_transitionsToModeWithoutAnimation() =
+        testScope.runTest {
+            awakeDevice()
+            clearTransientStatusBar()
+            setStatusBarWindowState(StatusBarWindowState.Hidden)
+            setStatusBarMode(TRANSPARENT)
+
+            orchestrator.start()
+
+            verify(mockPhoneStatusBarTransitions)
+                .transitionTo(/* mode= */ TRANSPARENT.toTransitionModeInt(), /* animate= */ false)
+        }
+
+    @Test
+    fun statusBarModeChange_deviceIsAsleep_transitionsToModeWithoutAnimation() =
+        testScope.runTest {
+            putDeviceToSleep()
+            clearTransientStatusBar()
+            setStatusBarWindowState(StatusBarWindowState.Showing)
+            setStatusBarMode(TRANSPARENT)
+
+            orchestrator.start()
+
+            verify(mockPhoneStatusBarTransitions)
+                .transitionTo(/* mode= */ TRANSPARENT.toTransitionModeInt(), /* animate= */ false)
+        }
+
+    @Test
+    fun statusBarModeAnimationConditionsChange_withoutBarModeChange_noNewTransitionsHappen() =
+        testScope.runTest {
+            awakeDevice()
+            clearTransientStatusBar()
+            setStatusBarWindowState(StatusBarWindowState.Showing)
+            setStatusBarMode(TRANSPARENT)
+
+            orchestrator.start()
+
+            putDeviceToSleep()
+            awakeDevice()
+            setTransientStatusBar()
+            clearTransientStatusBar()
+
+            verify(mockPhoneStatusBarTransitions, times(1))
+                .transitionTo(TRANSPARENT.toTransitionModeInt(), /* animate= */ true)
+        }
+
+    private fun putDeviceToSleep() {
+        fakePowerRepository.updateWakefulness(
+            rawState = WakefulnessState.ASLEEP,
+            lastWakeReason = WakeSleepReason.KEY,
+            lastSleepReason = WakeSleepReason.KEY,
+            powerButtonLaunchGestureTriggered = true,
+        )
+    }
+
+    private fun awakeDevice() {
+        fakePowerRepository.updateWakefulness(
+            rawState = WakefulnessState.AWAKE,
+            lastWakeReason = WakeSleepReason.KEY,
+            lastSleepReason = WakeSleepReason.KEY,
+            powerButtonLaunchGestureTriggered = true,
+        )
+    }
+
+    private fun setTransientStatusBar() {
+        statusBarModeRepository.defaultDisplay.showTransient()
+    }
+
+    private fun clearTransientStatusBar() {
+        statusBarModeRepository.defaultDisplay.clearTransient()
+    }
+
+    private fun setStatusBarWindowState(state: StatusBarWindowState) {
+        fakeStatusBarWindowStateRepositoryStore.defaultDisplay.setWindowState(state)
+    }
+
+    private fun setStatusBarMode(statusBarMode: StatusBarMode) {
+        statusBarModeRepository.defaultDisplay.statusBarMode.value = statusBarMode
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt
index 7a8533e..fe287ef 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt
@@ -23,6 +23,7 @@
 import android.app.smartspace.SmartspaceTarget
 import android.content.ComponentName
 import android.content.ContentResolver
+import android.content.Context
 import android.content.pm.UserInfo
 import android.database.ContentObserver
 import android.graphics.drawable.Drawable
@@ -207,6 +208,9 @@
     private val userHandleManaged: UserHandle = UserHandle(2)
     private val userHandleSecondary: UserHandle = UserHandle(3)
 
+    @Mock private lateinit var userContextPrimary: Context
+    @Mock private lateinit var userContextSecondary: Context
+
     private val userList = listOf(
             mockUserInfo(userHandlePrimary, isManagedProfile = false),
             mockUserInfo(userHandleManaged, isManagedProfile = true),
@@ -234,7 +238,11 @@
         `when`(deviceProvisionedController.isDeviceProvisioned).thenReturn(true)
         `when`(deviceProvisionedController.isCurrentUserSetup).thenReturn(true)
 
-        setActiveUser(userHandlePrimary)
+        `when`(userContextPrimary.getSystemService(SmartspaceManager::class.java)).thenReturn(
+            smartspaceManager
+        )
+
+        setActiveUser(userHandlePrimary, userContextPrimary)
         setAllowPrivateNotifications(userHandlePrimary, true)
         setAllowPrivateNotifications(userHandleManaged, true)
         setAllowPrivateNotifications(userHandleSecondary, true)
@@ -252,7 +260,6 @@
         controller = LockscreenSmartspaceController(
                 context,
                 featureFlags,
-                smartspaceManager,
                 activityStarter,
                 falsingManager,
                 clock,
@@ -709,7 +716,8 @@
         connectSession()
 
         // WHEN the secondary user becomes the active user
-        setActiveUser(userHandleSecondary)
+        // Note: it doesn't switch to the SmartspaceManager for userContextSecondary
+        setActiveUser(userHandleSecondary, userContextSecondary)
         userListener.onUserChanged(userHandleSecondary.identifier, context)
 
         // WHEN we receive a new list of targets
@@ -912,9 +920,10 @@
         clearInvocations(smartspaceView)
     }
 
-    private fun setActiveUser(userHandle: UserHandle) {
+    private fun setActiveUser(userHandle: UserHandle, userContext: Context) {
         `when`(userTracker.userId).thenReturn(userHandle.identifier)
         `when`(userTracker.userHandle).thenReturn(userHandle)
+        `when`(userTracker.userContext).thenReturn(userContext)
     }
 
     private fun mockUserInfo(userHandle: UserHandle, isManagedProfile: Boolean): UserInfo {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManagerTest.kt
index 0407fc1..ac73882 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManagerTest.kt
@@ -24,7 +24,7 @@
 import com.android.dx.mockito.inline.extended.ExtendedMockito
 import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NOTIFICATIONS_USE_PEOPLE_FILTERING
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.statusbar.notification.shared.NotificationMinimalismPrototype
+import com.android.systemui.statusbar.notification.shared.NotificationMinimalism
 import com.android.systemui.statusbar.notification.shared.PriorityPeopleSection
 import com.android.systemui.util.DeviceConfigProxyFake
 import com.android.systemui.util.Utils
@@ -42,7 +42,7 @@
 @RunWith(AndroidJUnit4::class)
 @SmallTest
 // this class has no testable logic with either of these flags enabled
-@DisableFlags(PriorityPeopleSection.FLAG_NAME, NotificationMinimalismPrototype.FLAG_NAME)
+@DisableFlags(PriorityPeopleSection.FLAG_NAME, NotificationMinimalism.FLAG_NAME)
 class NotificationSectionsFeatureManagerTest : SysuiTestCase() {
     lateinit var manager: NotificationSectionsFeatureManager
     private val proxyFake = DeviceConfigProxyFake()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolverTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolverTest.kt
deleted file mode 100644
index 2ad3c9e..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolverTest.kt
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- *  Copyright (C) 2022 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.systemui.statusbar.notification.collection
-
-import android.app.Notification
-import android.app.NotificationManager
-import android.content.pm.ApplicationInfo
-import android.content.pm.PackageManager
-import android.os.Bundle
-import android.os.UserHandle
-import android.service.notification.NotificationListenerService.Ranking
-import android.service.notification.StatusBarNotification
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
-import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.withArgCaptor
-import junit.framework.Assert.assertEquals
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mockito.anyInt
-import org.mockito.Mockito.anyString
-import org.mockito.Mockito.eq
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
-import org.mockito.Mockito.`when` as whenever
-
-private const val SDK_VERSION = 33
-private const val PACKAGE = "pkg"
-private const val USER_ID = -1
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class TargetSdkResolverTest : SysuiTestCase() {
-    private val packageManager: PackageManager = mock()
-    private val applicationInfo = ApplicationInfo().apply { targetSdkVersion = SDK_VERSION }
-
-    private lateinit var targetSdkResolver: TargetSdkResolver
-    private lateinit var notifListener: NotifCollectionListener
-
-    @Before
-    fun setUp() {
-        targetSdkResolver = TargetSdkResolver(mContext)
-        mContext.setMockPackageManager(packageManager)
-
-        val notifCollection: CommonNotifCollection = mock()
-        targetSdkResolver.initialize(notifCollection)
-        notifListener = withArgCaptor {
-            verify(notifCollection).addCollectionListener(capture())
-        }
-    }
-
-    @Test
-    fun resolveFromNotificationExtras() {
-        val extras = Bundle().apply {
-            putParcelable(Notification.EXTRA_BUILDER_APPLICATION_INFO, applicationInfo)
-        }
-        val notification = Notification().apply { this.extras = extras }
-        val sbn = createSbn(notification)
-        val entry = createNotificationEntry(sbn)
-
-        notifListener.onEntryBind(entry, sbn)
-
-        assertEquals(SDK_VERSION, entry.targetSdk)
-        verifyZeroInteractions(packageManager)
-    }
-
-    @Test
-    fun resolveFromPackageManager() {
-        val sbn = createSbn(Notification())
-        val entry = createNotificationEntry(sbn)
-        whenever(packageManager.getApplicationInfo(anyString(), anyInt()))
-                .thenReturn(applicationInfo)
-
-        notifListener.onEntryBind(entry, sbn)
-
-        assertEquals(SDK_VERSION, entry.targetSdk)
-        verify(packageManager).getApplicationInfo(eq(PACKAGE), anyInt())
-    }
-
-    @Test
-    fun resolveFromPackageManager_andPackageManagerCrashes() {
-        val sbn = createSbn(Notification())
-        val entry = createNotificationEntry(sbn)
-        whenever(packageManager.getApplicationInfo(anyString(), anyInt()))
-                .thenThrow(PackageManager.NameNotFoundException())
-
-        notifListener.onEntryBind(entry, sbn)
-
-        assertEquals(0, entry.targetSdk)
-        verify(packageManager).getApplicationInfo(eq(PACKAGE), anyInt())
-    }
-
-    private fun createSbn(notification: Notification) = StatusBarNotification(
-            PACKAGE, "opPkg", 0, "tag", 0, 0,
-            notification, UserHandle(USER_ID), "", 0
-    )
-
-    private fun createNotificationEntry(sbn: StatusBarNotification) =
-            NotificationEntry(sbn, createRanking(sbn.key), 0)
-
-    private fun createRanking(key: String) = Ranking().apply {
-        populate(
-                key,
-                /* rank = */ 0,
-                /* matchesInterruptionFilter = */ false,
-                /* visibilityOverride = */ 0,
-                /* suppressedVisualEffects = */ 0,
-                /* importance = */ NotificationManager.IMPORTANCE_DEFAULT,
-                /* explanation = */ null,
-                /* overrideGroupKey = */ null,
-                /* channel = */ null,
-                /* overridePeople = */ null,
-                /* snoozeCriteria = */ null,
-                /* showBadge = */ true,
-                /* userSentiment = */ 0,
-                /* hidden = */ false,
-                /* lastAudiblyAlertedMs = */ -1,
-                /* noisy = */ false,
-                /* smartActions = */ null,
-                /* smartReplies = */ null,
-                /* canBubble = */ false,
-                /* isTextChanged = */ false,
-                /* isConversation = */ false,
-                /* shortcutInfo = */ null,
-                /* rankingAdjustment = */ 0,
-                /* isBubble = */ false,
-                /* proposedImportance = */ 0,
-                /* sensitiveContent = */ false
-        )
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinatorTest.java
index 07c29a0..0c65c9c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinatorTest.java
@@ -20,7 +20,6 @@
 
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.never;
@@ -30,15 +29,12 @@
 
 import android.app.Notification.MediaStyle;
 import android.media.session.MediaSession;
-import android.platform.test.annotations.DisableFlags;
-import android.platform.test.annotations.EnableFlags;
 import android.service.notification.NotificationListenerService;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
 import com.android.internal.statusbar.IStatusBarService;
-import com.android.systemui.Flags;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.media.controls.util.MediaFeatureFlag;
 import com.android.systemui.statusbar.notification.InflationException;
@@ -158,8 +154,7 @@
     }
 
     @Test
-    @DisableFlags(Flags.FLAG_NOTIFICATIONS_BACKGROUND_ICONS)
-    public void inflateMediaNotificationIconsMediaEnabled_old() throws InflationException {
+    public void inflateMediaNotificationIconsMediaEnabled() throws InflationException {
         finishSetupWithMediaFeatureFlagEnabled(true);
 
         mListener.onEntryInit(mMediaEntry);
@@ -187,37 +182,7 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_NOTIFICATIONS_BACKGROUND_ICONS)
-    public void inflateMediaNotificationIconsMediaEnabled_new() throws InflationException {
-        finishSetupWithMediaFeatureFlagEnabled(true);
-
-        mListener.onEntryInit(mMediaEntry);
-        mListener.onEntryAdded(mMediaEntry);
-        verify(mIconManager).createIcons(eq(mMediaEntry));
-        verify(mIconManager, never()).updateIcons(eq(mMediaEntry), anyBoolean());
-        clearInvocations(mIconManager);
-
-        mFilter.shouldFilterOut(mMediaEntry, 0);
-        verify(mIconManager, never()).createIcons(eq(mMediaEntry));
-        verify(mIconManager, never()).updateIcons(eq(mMediaEntry), anyBoolean());
-
-        mListener.onEntryUpdated(mMediaEntry);
-        verify(mIconManager, never()).createIcons(eq(mMediaEntry));
-        verify(mIconManager).updateIcons(eq(mMediaEntry), /* usingCache = */ eq(false));
-
-        mListener.onEntryRemoved(mMediaEntry, NotificationListenerService.REASON_CANCEL);
-        mListener.onEntryCleanUp(mMediaEntry);
-        clearInvocations(mIconManager);
-
-        mListener.onEntryInit(mMediaEntry);
-        mListener.onEntryAdded(mMediaEntry);
-        verify(mIconManager).createIcons(eq(mMediaEntry));
-        verify(mIconManager, never()).updateIcons(eq(mMediaEntry), anyBoolean());
-    }
-
-    @Test
-    @DisableFlags(Flags.FLAG_NOTIFICATIONS_BACKGROUND_ICONS)
-    public void inflationException_old() throws InflationException {
+    public void inflationException() throws InflationException {
         finishSetupWithMediaFeatureFlagEnabled(true);
 
         mListener.onEntryInit(mMediaEntry);
@@ -244,31 +209,6 @@
         verify(mIconManager, never()).updateIcons(eq(mMediaEntry), anyBoolean());
     }
 
-    @Test
-    @EnableFlags(Flags.FLAG_NOTIFICATIONS_BACKGROUND_ICONS)
-    public void inflationException_new() throws InflationException {
-        finishSetupWithMediaFeatureFlagEnabled(true);
-
-        doThrow(InflationException.class).when(mIconManager).createIcons(eq(mMediaEntry));
-
-        mListener.onEntryInit(mMediaEntry);
-        mListener.onEntryAdded(mMediaEntry);
-        verify(mIconManager).createIcons(eq(mMediaEntry));
-        verify(mIconManager, never()).updateIcons(eq(mMediaEntry), anyBoolean());
-        clearInvocations(mIconManager);
-
-        mListener.onEntryUpdated(mMediaEntry);
-        verify(mIconManager).createIcons(eq(mMediaEntry));
-        verify(mIconManager, never()).updateIcons(eq(mMediaEntry), anyBoolean());
-        clearInvocations(mIconManager);
-
-        doNothing().when(mIconManager).createIcons(eq(mMediaEntry));
-
-        mListener.onEntryUpdated(mMediaEntry);
-        verify(mIconManager).createIcons(eq(mMediaEntry));
-        verify(mIconManager, never()).updateIcons(eq(mMediaEntry), anyBoolean());
-    }
-
     private void finishSetupWithMediaFeatureFlagEnabled(boolean mediaFeatureFlagEnabled) {
         when(mMediaFeatureFlag.getEnabled()).thenReturn(mediaFeatureFlagEnabled);
         mCoordinator = new MediaCoordinator(mMediaFeatureFlag, mStatusBarService, mIconManager);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RemoteInputCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RemoteInputCoordinatorTest.kt
index deb3fc1..a3f8452 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RemoteInputCoordinatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RemoteInputCoordinatorTest.kt
@@ -15,8 +15,8 @@
  */
 package com.android.systemui.statusbar.notification.collection.coordinator
 
-import android.app.Flags.lifetimeExtensionRefactor
 import android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR
+import android.app.Flags.lifetimeExtensionRefactor
 import android.app.Notification
 import android.app.RemoteInputHistoryItem
 import android.os.Handler
@@ -47,10 +47,10 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mock
-import org.mockito.Mockito.`when`
 import org.mockito.Mockito.never
 import org.mockito.Mockito.times
 import org.mockito.Mockito.verify
+import org.mockito.Mockito.`when`
 import org.mockito.MockitoAnnotations.initMocks
 
 @SmallTest
@@ -78,21 +78,20 @@
     @Before
     fun setUp() {
         initMocks(this)
-        coordinator = RemoteInputCoordinator(
+        coordinator =
+            RemoteInputCoordinator(
                 dumpManager,
                 rebuilder,
                 remoteInputManager,
                 mainHandler,
-                smartReplyController
-        )
+                smartReplyController,
+            )
         `when`(pipeline.addNotificationLifetimeExtender(any())).thenAnswer {
             (it.arguments[0] as NotifLifetimeExtender).setCallback(lifetimeExtensionCallback)
         }
         `when`(pipeline.getInternalNotifUpdater(any())).thenReturn(notifUpdater)
         coordinator.attach(pipeline)
-        listener = withArgCaptor {
-            verify(remoteInputManager).setRemoteInputListener(capture())
-        }
+        listener = withArgCaptor { verify(remoteInputManager).setRemoteInputListener(capture()) }
         entry1 = NotificationEntryBuilder().setId(1).build()
         entry2 = NotificationEntryBuilder().setId(2).build()
         `when`(rebuilder.rebuildForCanceledSmartReplies(any())).thenReturn(sbn)
@@ -101,13 +100,17 @@
         `when`(rebuilder.rebuildWithExistingReplies(any())).thenReturn(sbn)
     }
 
-    val remoteInputActiveExtender get() = coordinator.mRemoteInputActiveExtender
-    val remoteInputHistoryExtender get() = coordinator.mRemoteInputHistoryExtender
-    val smartReplyHistoryExtender get() = coordinator.mSmartReplyHistoryExtender
+    val remoteInputActiveExtender
+        get() = coordinator.mRemoteInputActiveExtender
 
-    val collectionListeners get() = captureMany {
-        verify(pipeline, times(1)).addCollectionListener(capture())
-    }
+    val remoteInputHistoryExtender
+        get() = coordinator.mRemoteInputHistoryExtender
+
+    val smartReplyHistoryExtender
+        get() = coordinator.mSmartReplyHistoryExtender
+
+    val collectionListeners
+        get() = captureMany { verify(pipeline, times(1)).addCollectionListener(capture()) }
 
     @Test
     fun testRemoteInputActive() {
@@ -179,7 +182,8 @@
     @EnableFlags(FLAG_LIFETIME_EXTENSION_REFACTOR)
     fun testRemoteInputLifetimeExtensionListenerTrigger() {
         // Create notification with LIFETIME_EXTENDED_BY_DIRECT_REPLY flag.
-        val entry = NotificationEntryBuilder()
+        val entry =
+            NotificationEntryBuilder()
                 .setId(3)
                 .setTag("entry")
                 .setFlag(mContext, Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY, true)
@@ -187,9 +191,7 @@
         `when`(remoteInputManager.shouldKeepForRemoteInputHistory(entry)).thenReturn(true)
         `when`(remoteInputManager.shouldKeepForSmartReplyHistory(entry)).thenReturn(false)
 
-        collectionListeners.forEach {
-            it.onEntryUpdated(entry, true)
-        }
+        collectionListeners.forEach { it.onEntryUpdated(entry, true) }
 
         verify(rebuilder, times(1)).rebuildForRemoteInputReply(entry)
     }
@@ -198,16 +200,15 @@
     @EnableFlags(FLAG_LIFETIME_EXTENSION_REFACTOR)
     fun testSmartReplyLifetimeExtensionListenerTrigger() {
         // Create notification with LIFETIME_EXTENDED_BY_DIRECT_REPLY flag.
-        val entry = NotificationEntryBuilder()
+        val entry =
+            NotificationEntryBuilder()
                 .setId(3)
                 .setTag("entry")
                 .setFlag(mContext, Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY, true)
                 .build()
         `when`(remoteInputManager.shouldKeepForRemoteInputHistory(entry)).thenReturn(false)
         `when`(remoteInputManager.shouldKeepForSmartReplyHistory(entry)).thenReturn(true)
-        collectionListeners.forEach {
-            it.onEntryUpdated(entry, true)
-        }
+        collectionListeners.forEach { it.onEntryUpdated(entry, true) }
 
         verify(rebuilder, times(1)).rebuildForCanceledSmartReplies(entry)
         verify(smartReplyController, times(1)).stopSending(entry)
@@ -217,25 +218,25 @@
     @EnableFlags(FLAG_LIFETIME_EXTENSION_REFACTOR)
     fun testRepeatedUpdateTriggersRebuild() {
         // Create notification with LIFETIME_EXTENDED_BY_DIRECT_REPLY flag.
-        val entry = NotificationEntryBuilder()
+        val entry =
+            NotificationEntryBuilder()
                 .setId(3)
                 .setTag("entry")
                 .setFlag(mContext, Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY, true)
                 .build()
         `when`(remoteInputManager.shouldKeepForRemoteInputHistory(entry)).thenReturn(false)
         `when`(remoteInputManager.shouldKeepForSmartReplyHistory(entry)).thenReturn(false)
-        collectionListeners.forEach {
-            it.onEntryUpdated(entry, true)
-        }
+        collectionListeners.forEach { it.onEntryUpdated(entry, true) }
 
-        verify(rebuilder, times(1)).rebuildWithExistingReplies(entry)
+        verify(rebuilder, times(1)).rebuildForRemoteInputReply(entry)
     }
 
     @Test
     @EnableFlags(FLAG_LIFETIME_EXTENSION_REFACTOR)
     fun testLifetimeExtensionListenerClearsRemoteInputs() {
         // Create notification with LIFETIME_EXTENDED_BY_DIRECT_REPLY flag.
-        val entry = NotificationEntryBuilder()
+        val entry =
+            NotificationEntryBuilder()
                 .setId(3)
                 .setTag("entry")
                 .setFlag(mContext, Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY, false)
@@ -245,9 +246,7 @@
         `when`(remoteInputManager.shouldKeepForRemoteInputHistory(entry)).thenReturn(false)
         `when`(remoteInputManager.shouldKeepForSmartReplyHistory(entry)).thenReturn(false)
 
-        collectionListeners.forEach {
-            it.onEntryUpdated(entry, true)
-        }
+        collectionListeners.forEach { it.onEntryUpdated(entry, true) }
 
         assertThat(entry.remoteInputs).isNull()
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt
index 3c583f2..56b70bd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt
@@ -45,7 +45,7 @@
 import org.junit.runner.RunWith
 import org.mockito.Mock
 import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
+import org.mockito.Mockito.verifyNoMoreInteractions
 import org.mockito.MockitoAnnotations.initMocks
 import org.mockito.Mockito.`when` as whenever
 
@@ -110,7 +110,7 @@
         whenever(section.bucket).thenReturn(BUCKET_ALERTING)
         afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
         verify(stackController).setNotifStats(NotifStats(1, false, true, false, false))
-        verifyZeroInteractions(activeNotificationsInteractor)
+        verifyNoMoreInteractions(activeNotificationsInteractor)
     }
 
     @Test
@@ -121,7 +121,7 @@
         whenever(section.bucket).thenReturn(BUCKET_ALERTING)
         afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
         verify(stackController).setNotifStats(NotifStats(1, true, false, false, false))
-        verifyZeroInteractions(activeNotificationsInteractor)
+        verifyNoMoreInteractions(activeNotificationsInteractor)
     }
 
     @Test
@@ -130,7 +130,7 @@
         whenever(section.bucket).thenReturn(BUCKET_SILENT)
         afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
         verify(stackController).setNotifStats(NotifStats(1, false, false, false, true))
-        verifyZeroInteractions(activeNotificationsInteractor)
+        verifyNoMoreInteractions(activeNotificationsInteractor)
     }
 
     @Test
@@ -141,7 +141,7 @@
         whenever(section.bucket).thenReturn(BUCKET_SILENT)
         afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
         verify(stackController).setNotifStats(NotifStats(1, false, false, true, false))
-        verifyZeroInteractions(activeNotificationsInteractor)
+        verifyNoMoreInteractions(activeNotificationsInteractor)
     }
 
     @Test
@@ -151,7 +151,7 @@
         afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
         verify(activeNotificationsInteractor)
             .setNotifStats(NotifStats(1, false, true, false, false))
-        verifyZeroInteractions(stackController)
+        verifyNoMoreInteractions(stackController)
     }
 
     @Test
@@ -166,7 +166,7 @@
         afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
         verify(activeNotificationsInteractor)
             .setNotifStats(NotifStats(1, true, false, false, false))
-        verifyZeroInteractions(stackController)
+        verifyNoMoreInteractions(stackController)
     }
 
     @Test
@@ -176,7 +176,7 @@
         afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
         verify(activeNotificationsInteractor)
             .setNotifStats(NotifStats(1, false, false, false, true))
-        verifyZeroInteractions(stackController)
+        verifyNoMoreInteractions(stackController)
     }
 
     @Test
@@ -191,7 +191,7 @@
         afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
         verify(activeNotificationsInteractor)
             .setNotifStats(NotifStats(1, false, false, true, false))
-        verifyZeroInteractions(stackController)
+        verifyNoMoreInteractions(stackController)
     }
 
     @Test
@@ -204,6 +204,6 @@
         afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
         verify(activeNotificationsInteractor)
             .setNotifStats(NotifStats(1, hasNonClearableAlertingNotifs = true, false, false, false))
-        verifyZeroInteractions(stackController)
+        verifyNoMoreInteractions(stackController)
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractorTest.kt
index cea8857..d717fe4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/domain/interactor/HeadsUpNotificationInteractorTest.kt
@@ -48,7 +48,7 @@
     private val kosmos =
         testKosmos().apply {
             fakeKeyguardTransitionRepository =
-                FakeKeyguardTransitionRepository(initInLockscreen = false)
+                FakeKeyguardTransitionRepository(initInLockscreen = false, testScope = testScope)
         }
     private val testScope = kosmos.testScope
     private val faceAuthRepository by lazy { kosmos.fakeDeviceEntryFaceAuthRepository }
@@ -146,9 +146,17 @@
         }
 
     @Test
+    fun activeRows_noRows_isEmpty() =
+        testScope.runTest {
+            val activeHeadsUpRows by collectLastValue(underTest.activeHeadsUpRowKeys)
+
+            assertThat(activeHeadsUpRows).isEmpty()
+        }
+
+    @Test
     fun pinnedRows_noRows_isEmpty() =
         testScope.runTest {
-            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRows)
+            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRowKeys)
 
             assertThat(pinnedHeadsUpRows).isEmpty()
         }
@@ -156,7 +164,7 @@
     @Test
     fun pinnedRows_noPinnedRows_isEmpty() =
         testScope.runTest {
-            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRows)
+            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRowKeys)
             // WHEN no rows are pinned
             headsUpRepository.setNotifications(
                 fakeHeadsUpRowRepository("key 0"),
@@ -170,9 +178,27 @@
         }
 
     @Test
+    fun activeRows_noPinnedRows_containsAllRows() =
+        testScope.runTest {
+            val activeHeadsUpRows by collectLastValue(underTest.activeHeadsUpRowKeys)
+            // WHEN no rows are pinned
+            val rows =
+                arrayListOf(
+                    fakeHeadsUpRowRepository("key 0"),
+                    fakeHeadsUpRowRepository("key 1"),
+                    fakeHeadsUpRowRepository("key 2"),
+                )
+            headsUpRepository.setNotifications(rows)
+            runCurrent()
+
+            // THEN all rows are present
+            assertThat(activeHeadsUpRows).containsExactly(rows[0], rows[1], rows[2])
+        }
+
+    @Test
     fun pinnedRows_hasPinnedRows_containsPinnedRows() =
         testScope.runTest {
-            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRows)
+            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRowKeys)
             // WHEN some rows are pinned
             val rows =
                 arrayListOf(
@@ -188,9 +214,27 @@
         }
 
     @Test
+    fun pinnedRows_hasPinnedRows_containsAllRows() =
+        testScope.runTest {
+            val activeHeadsUpRows by collectLastValue(underTest.activeHeadsUpRowKeys)
+            // WHEN no rows are pinned
+            val rows =
+                arrayListOf(
+                    fakeHeadsUpRowRepository("key 0", isPinned = true),
+                    fakeHeadsUpRowRepository("key 1", isPinned = true),
+                    fakeHeadsUpRowRepository("key 2"),
+                )
+            headsUpRepository.setNotifications(rows)
+            runCurrent()
+
+            // THEN all rows are present
+            assertThat(activeHeadsUpRows).containsExactly(rows[0], rows[1], rows[2])
+        }
+
+    @Test
     fun pinnedRows_rowGetsPinned_containsPinnedRows() =
         testScope.runTest {
-            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRows)
+            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRowKeys)
             // GIVEN some rows are pinned
             val rows =
                 arrayListOf(
@@ -210,9 +254,34 @@
         }
 
     @Test
+    fun activeRows_rowGetsPinned_containsAllRows() =
+        testScope.runTest {
+            val activeHeadsUpRows by collectLastValue(underTest.activeHeadsUpRowKeys)
+            // GIVEN some rows are pinned
+            val rows =
+                arrayListOf(
+                    fakeHeadsUpRowRepository("key 0", isPinned = true),
+                    fakeHeadsUpRowRepository("key 1", isPinned = true),
+                    fakeHeadsUpRowRepository("key 2"),
+                )
+            headsUpRepository.setNotifications(rows)
+            runCurrent()
+
+            // THEN all rows are present
+            assertThat(activeHeadsUpRows).containsExactly(rows[0], rows[1], rows[2])
+
+            // WHEN all rows gets pinned
+            rows[2].isPinned.value = true
+            runCurrent()
+
+            // THEN no change
+            assertThat(activeHeadsUpRows).containsExactly(rows[0], rows[1], rows[2])
+        }
+
+    @Test
     fun pinnedRows_allRowsPinned_containsAllRows() =
         testScope.runTest {
-            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRows)
+            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRowKeys)
             // WHEN all rows are pinned
             val rows =
                 arrayListOf(
@@ -228,9 +297,27 @@
         }
 
     @Test
+    fun activeRows_allRowsPinned_containsAllRows() =
+        testScope.runTest {
+            val activeHeadsUpRows by collectLastValue(underTest.activeHeadsUpRowKeys)
+            // WHEN all rows are pinned
+            val rows =
+                arrayListOf(
+                    fakeHeadsUpRowRepository("key 0", isPinned = true),
+                    fakeHeadsUpRowRepository("key 1", isPinned = true),
+                    fakeHeadsUpRowRepository("key 2", isPinned = true),
+                )
+            headsUpRepository.setNotifications(rows)
+            runCurrent()
+
+            // THEN no rows are filtered
+            assertThat(activeHeadsUpRows).containsExactly(rows[0], rows[1], rows[2])
+        }
+
+    @Test
     fun pinnedRows_rowGetsUnPinned_containsPinnedRows() =
         testScope.runTest {
-            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRows)
+            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRowKeys)
             // GIVEN all rows are pinned
             val rows =
                 arrayListOf(
@@ -250,9 +337,31 @@
         }
 
     @Test
+    fun activeRows_rowGetsUnPinned_containsAllRows() =
+        testScope.runTest {
+            val activeHeadsUpRows by collectLastValue(underTest.activeHeadsUpRowKeys)
+            // GIVEN all rows are pinned
+            val rows =
+                arrayListOf(
+                    fakeHeadsUpRowRepository("key 0", isPinned = true),
+                    fakeHeadsUpRowRepository("key 1", isPinned = true),
+                    fakeHeadsUpRowRepository("key 2", isPinned = true),
+                )
+            headsUpRepository.setNotifications(rows)
+            runCurrent()
+
+            // WHEN a row gets unpinned
+            rows[0].isPinned.value = false
+            runCurrent()
+
+            // THEN all rows are still present
+            assertThat(activeHeadsUpRows).containsExactly(rows[0], rows[1], rows[2])
+        }
+
+    @Test
     fun pinnedRows_rowGetsPinnedAndUnPinned_containsTheSameInstance() =
         testScope.runTest {
-            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRows)
+            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRowKeys)
 
             val rows =
                 arrayListOf(
@@ -332,7 +441,10 @@
             // WHEN a row is pinned
             headsUpRepository.setNotifications(fakeHeadsUpRowRepository("key 0", isPinned = true))
             // AND the lock screen is shown
-            keyguardTransitionRepository.emitInitialStepsFromOff(to = KeyguardState.LOCKSCREEN)
+            keyguardTransitionRepository.emitInitialStepsFromOff(
+                to = KeyguardState.LOCKSCREEN,
+                testSetup = true,
+            )
 
             assertThat(showHeadsUpStatusBar).isFalse()
         }
@@ -345,7 +457,10 @@
             // WHEN a row is pinned
             headsUpRepository.setNotifications(fakeHeadsUpRowRepository("key 0", isPinned = true))
             // AND the lock screen is shown
-            keyguardTransitionRepository.emitInitialStepsFromOff(to = KeyguardState.LOCKSCREEN)
+            keyguardTransitionRepository.emitInitialStepsFromOff(
+                to = KeyguardState.LOCKSCREEN,
+                testSetup = true,
+            )
             // AND bypass is enabled
             faceAuthRepository.isBypassEnabled.value = true
 
@@ -359,7 +474,10 @@
 
             // WHEN no pinned rows
             // AND the lock screen is shown
-            keyguardTransitionRepository.emitInitialStepsFromOff(to = KeyguardState.LOCKSCREEN)
+            keyguardTransitionRepository.emitInitialStepsFromOff(
+                to = KeyguardState.LOCKSCREEN,
+                testSetup = true,
+            )
             // AND bypass is enabled
             faceAuthRepository.isBypassEnabled.value = true
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/viewmodel/FooterViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/viewmodel/FooterViewModelTest.kt
index 83ad18b..46f3a6b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/viewmodel/FooterViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/viewmodel/FooterViewModelTest.kt
@@ -38,6 +38,7 @@
 import com.android.systemui.shared.settings.data.repository.fakeSecureSettingsRepository
 import com.android.systemui.statusbar.notification.collection.render.NotifStats
 import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix
 import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor
 import com.android.systemui.testKosmos
 import com.android.systemui.util.ui.isAnimating
@@ -254,6 +255,39 @@
             assertThat(buttonLabel).isEqualTo(R.string.manage_notifications_history_text)
         }
 
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME)
+    @Test
+    fun manageButtonOnClick_whenHistoryDisabled() =
+        testScope.runTest {
+            val onClick by collectLastValue(underTest.manageOrHistoryButtonClick)
+            runCurrent()
+
+            // WHEN notification history is disabled
+            fakeSecureSettingsRepository.setInt(Settings.Secure.NOTIFICATION_HISTORY_ENABLED, 0)
+
+            // THEN onClick leads to settings page
+            assertThat(onClick?.targetIntent?.action)
+                .isEqualTo(Settings.ACTION_NOTIFICATION_SETTINGS)
+            assertThat(onClick?.backStack).isEmpty()
+        }
+
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME)
+    @Test
+    fun historyButtonOnClick_whenHistoryEnabled() =
+        testScope.runTest {
+            val onClick by collectLastValue(underTest.manageOrHistoryButtonClick)
+            runCurrent()
+
+            // WHEN notification history is enabled
+            fakeSecureSettingsRepository.setInt(Settings.Secure.NOTIFICATION_HISTORY_ENABLED, 1)
+
+            // THEN onClick leads to history page
+            assertThat(onClick?.targetIntent?.action)
+                .isEqualTo(Settings.ACTION_NOTIFICATION_HISTORY)
+            assertThat(onClick?.backStack?.map { it.action })
+                .containsExactly(Settings.ACTION_NOTIFICATION_SETTINGS)
+        }
+
     @Test
     fun manageButtonVisible_whenMessageVisible() =
         testScope.runTest {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/BigPictureIconManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/BigPictureIconManagerTest.kt
deleted file mode 100644
index fda5cd2..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/BigPictureIconManagerTest.kt
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- * Copyright (C) 2023 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.systemui.statusbar.notification.row
-
-import android.graphics.BitmapFactory
-import android.graphics.drawable.BitmapDrawable
-import android.graphics.drawable.Drawable
-import android.graphics.drawable.Icon
-import android.net.Uri
-import android.testing.TestableLooper.RunWithLooper
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.internal.widget.NotificationDrawableConsumer
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.graphics.ImageLoader
-import com.android.systemui.res.R
-import com.android.systemui.util.mockito.argumentCaptor
-import com.android.systemui.util.mockito.mock
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.advanceTimeBy
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.After
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mockito.clearInvocations
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
-
-private const val FREE_IMAGE_DELAY_MS = 4000L
-private const val MAX_IMAGE_SIZE = 512 // size of the test drawables in pixels
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@SmallTest
-@RunWithLooper
-@RunWith(AndroidJUnit4::class)
-class BigPictureIconManagerTest : SysuiTestCase() {
-
-    private val testDispatcher = StandardTestDispatcher()
-    private val testScope = TestScope(testDispatcher)
-    private val testableResources = context.orCreateTestableResources
-    private val imageLoader: ImageLoader = ImageLoader(context, testDispatcher)
-    private val statsManager = BigPictureStatsManager(mock(), testDispatcher, mock())
-    private var mockConsumer: NotificationDrawableConsumer = mock()
-    private val drawableCaptor = argumentCaptor<Drawable>()
-
-    private lateinit var iconManager: BigPictureIconManager
-
-    private val expectedDrawable by lazy {
-        context.resources.getDrawable(R.drawable.dessert_zombiegingerbread, context.theme)
-    }
-    private val supportedIcon by lazy {
-        Icon.createWithContentUri(
-            Uri.parse(
-                "android.resource://${context.packageName}/${R.drawable.dessert_zombiegingerbread}"
-            )
-        )
-    }
-    private val unsupportedIcon by lazy {
-        Icon.createWithBitmap(
-            BitmapFactory.decodeResource(context.resources, R.drawable.dessert_donutburger)
-        )
-    }
-    private val invalidIcon by lazy { Icon.createWithContentUri(Uri.parse("this.is/broken")) }
-
-    @Before
-    fun setUp() {
-        allowTestableLooperAsMainThread()
-        overrideMaxImageSizes()
-        iconManager =
-            BigPictureIconManager(
-                context,
-                imageLoader,
-                statsManager,
-                scope = testScope,
-                mainDispatcher = testDispatcher,
-                bgDispatcher = testDispatcher
-            )
-    }
-
-    @After
-    fun tearDown() {
-        disallowTestableLooperAsMainThread()
-    }
-
-    @Test
-    fun onIconUpdated_supportedType_placeholderLoaded() =
-        testScope.runTest {
-            // WHEN update with a supported icon
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-
-            // THEN consumer is updated with a placeholder
-            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
-            assertIsPlaceHolder(drawableCaptor.value)
-            assertSize(drawableCaptor.value)
-        }
-
-    @Test
-    fun onIconUpdated_unsupportedType_fullImageLoaded() =
-        testScope.runTest {
-            // WHEN update with an unsupported icon
-            iconManager.updateIcon(mockConsumer, unsupportedIcon).run()
-
-            // THEN consumer is updated with the full image
-            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
-            assertIsFullImage(drawableCaptor.value)
-            assertSize(drawableCaptor.value)
-        }
-
-    @Test
-    fun onIconUpdated_withNull_drawableIsNull() =
-        testScope.runTest {
-            // WHEN update with null
-            iconManager.updateIcon(mockConsumer, null).run()
-
-            // THEN consumer is updated with null
-            verify(mockConsumer).setImageDrawable(null)
-        }
-
-    @Test
-    fun onIconUpdated_invalidIcon_drawableIsNull() =
-        testScope.runTest {
-            // WHEN update with an invalid icon
-            iconManager.updateIcon(mockConsumer, invalidIcon).run()
-
-            // THEN consumer is updated with null
-            verify(mockConsumer).setImageDrawable(null)
-        }
-
-    @Test
-    fun onIconUpdated_consumerAlreadySet_newConsumerIsUpdatedWithPlaceholder() =
-        testScope.runTest {
-            // GIVEN a consumer is set
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-            clearInvocations(mockConsumer)
-
-            // WHEN a new consumer is set
-            val newConsumer: NotificationDrawableConsumer = mock()
-            iconManager.updateIcon(newConsumer, supportedIcon).run()
-
-            // THEN the new consumer is updated
-            verify(newConsumer).setImageDrawable(drawableCaptor.capture())
-            assertIsPlaceHolder(drawableCaptor.value)
-            assertSize(drawableCaptor.value)
-            // AND nothing happens on the old consumer
-            verifyZeroInteractions(mockConsumer)
-        }
-
-    @Test
-    fun onIconUpdated_consumerAlreadySet_newConsumerIsUpdatedWithFullImage() =
-        testScope.runTest {
-            // GIVEN a consumer is set
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-            // AND an icon is loaded
-            iconManager.onViewShown(true)
-            runCurrent()
-            clearInvocations(mockConsumer)
-
-            // WHEN a new consumer is set
-            val newConsumer: NotificationDrawableConsumer = mock()
-            iconManager.updateIcon(newConsumer, supportedIcon).run()
-
-            // THEN the new consumer is updated
-            verify(newConsumer).setImageDrawable(drawableCaptor.capture())
-            assertIsFullImage(drawableCaptor.value)
-            assertSize(drawableCaptor.value)
-            // AND nothing happens on the old consumer
-            verifyZeroInteractions(mockConsumer)
-        }
-
-    @Test
-    fun onIconUpdated_iconAlreadySet_loadsNewIcon() =
-        testScope.runTest {
-            // GIVEN an icon is set
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-            clearInvocations(mockConsumer)
-
-            // WHEN a new icon is set
-            iconManager.updateIcon(mockConsumer, unsupportedIcon).run()
-
-            // THEN consumer is updated with the new image
-            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
-            assertIsFullImage(drawableCaptor.value)
-            assertSize(drawableCaptor.value)
-        }
-
-    @Test
-    fun onIconUpdated_iconAlreadySetForTheSameIcon_loadsIconAgain() =
-        testScope.runTest {
-            // GIVEN an icon is set
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-            // AND the view is shown
-            iconManager.onViewShown(true)
-            runCurrent()
-            clearInvocations(mockConsumer)
-            // WHEN the icon is set again
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-
-            // THEN consumer is updated with the new image
-            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
-            assertIsFullImage(drawableCaptor.value)
-            assertSize(drawableCaptor.value)
-        }
-
-    @Test
-    fun onIconUpdated_iconAlreadySetForUnsupportedIcon_loadsNewIcon() =
-        testScope.runTest {
-            // GIVEN an unsupported icon is set
-            iconManager.updateIcon(mockConsumer, unsupportedIcon).run()
-            // AND the view is shown
-            iconManager.onViewShown(true)
-            runCurrent()
-            clearInvocations(mockConsumer)
-
-            // WHEN a new icon is set
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-
-            // THEN consumer is updated with the new image
-            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
-            assertIsFullImage(drawableCaptor.value)
-            assertSize(drawableCaptor.value)
-        }
-
-    @Test
-    fun onIconUpdated_supportedTypeButTooWide_resizedPlaceholderLoaded() =
-        testScope.runTest {
-            // GIVEN the max width is smaller than our image
-            testableResources.addOverride(
-                com.android.internal.R.dimen.notification_big_picture_max_width,
-                20
-            )
-            iconManager.updateMaxImageSizes()
-
-            // WHEN update with a supported icon
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-
-            // THEN consumer is updated with the resized placeholder
-            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
-            assertIsPlaceHolder(drawableCaptor.value)
-            assertSize(drawableCaptor.value, expectedWidth = 20, expectedHeight = 20)
-        }
-
-    @Test
-    fun onIconUpdated_supportedTypeButTooHigh_resizedPlaceholderLoaded() =
-        testScope.runTest {
-            // GIVEN the max height is smaller than our image
-            testableResources.addOverride(
-                com.android.internal.R.dimen.notification_big_picture_max_height,
-                20
-            )
-            iconManager.updateMaxImageSizes()
-
-            // WHEN update with a supported icon
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-
-            // THEN consumer is updated with the resized placeholder
-            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
-            assertIsPlaceHolder(drawableCaptor.value)
-            assertSize(drawableCaptor.value, expectedWidth = 20, expectedHeight = 20)
-        }
-
-    @Test
-    fun onViewShown_placeholderShowing_fullImageLoaded() =
-        testScope.runTest {
-            // GIVEN placeholder is showing
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-            clearInvocations(mockConsumer)
-
-            // WHEN the view is shown
-            iconManager.onViewShown(true)
-            runCurrent()
-
-            // THEN full image is set
-            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
-            assertIsFullImage(drawableCaptor.value)
-            assertSize(drawableCaptor.value)
-        }
-
-    @Test
-    fun onViewHidden_fullImageShowing_placeHolderSet() =
-        testScope.runTest {
-            // GIVEN full image is showing and the view is shown
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-            iconManager.onViewShown(true)
-            runCurrent()
-            clearInvocations(mockConsumer)
-
-            // WHEN the view goes off the screen
-            iconManager.onViewShown(false)
-            // AND we wait a bit
-            advanceTimeBy(FREE_IMAGE_DELAY_MS)
-            runCurrent()
-
-            // THEN placeholder is set
-            verify(mockConsumer).setImageDrawable(drawableCaptor.capture())
-            assertIsPlaceHolder(drawableCaptor.value)
-            assertSize(drawableCaptor.value)
-        }
-
-    @Test
-    fun onViewShownToggled_viewShown_nothingHappens() =
-        testScope.runTest {
-            // GIVEN full image is showing and the view is shown
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-            iconManager.onViewShown(true)
-            runCurrent()
-            clearInvocations(mockConsumer)
-
-            // WHEN the onViewShown is toggled
-            iconManager.onViewShown(false)
-            runCurrent()
-            iconManager.onViewShown(true)
-            // AND we wait a bit
-            advanceTimeBy(FREE_IMAGE_DELAY_MS)
-            runCurrent()
-
-            // THEN nothing happens
-            verifyZeroInteractions(mockConsumer)
-        }
-
-    @Test
-    fun onViewShown_unsupportedIconLoaded_nothingHappens() =
-        testScope.runTest {
-            // GIVEN full image is showing for an unsupported icon
-            iconManager.updateIcon(mockConsumer, unsupportedIcon).run()
-            clearInvocations(mockConsumer)
-
-            // WHEN the view is shown
-            iconManager.onViewShown(true)
-            runCurrent()
-
-            // THEN nothing happens
-            verifyZeroInteractions(mockConsumer)
-        }
-
-    @Test
-    fun onViewShown_nullSetForIcon_nothingHappens() =
-        testScope.runTest {
-            // GIVEN null is set for the icon
-            iconManager.updateIcon(mockConsumer, null).run()
-            clearInvocations(mockConsumer)
-
-            // WHEN the view is shown
-            iconManager.onViewShown(true)
-            runCurrent()
-
-            // THEN nothing happens
-            verifyZeroInteractions(mockConsumer)
-        }
-
-    @Test
-    fun onViewHidden_unsupportedIconLoadedAndViewIsShown_nothingHappens() =
-        testScope.runTest {
-            // GIVEN full image is showing for an unsupported icon
-            iconManager.updateIcon(mockConsumer, unsupportedIcon).run()
-            // AND the view is shown
-            iconManager.onViewShown(true)
-            runCurrent()
-            clearInvocations(mockConsumer)
-
-            // WHEN the view goes off the screen
-            iconManager.onViewShown(false)
-            // AND we wait a bit
-            advanceTimeBy(FREE_IMAGE_DELAY_MS)
-            runCurrent()
-
-            // THEN nothing happens
-            verifyZeroInteractions(mockConsumer)
-        }
-
-    @Test
-    fun onViewHidden_placeholderShowing_nothingHappens() =
-        testScope.runTest {
-            // GIVEN placeholder image is showing
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-            clearInvocations(mockConsumer)
-
-            // WHEN the view is hidden
-            iconManager.onViewShown(false)
-            // AND we wait a bit
-            advanceTimeBy(FREE_IMAGE_DELAY_MS)
-            runCurrent()
-
-            // THEN nothing happens
-            verifyZeroInteractions(mockConsumer)
-        }
-
-    @Test
-    fun onViewShown_alreadyShowing_nothingHappens() =
-        testScope.runTest {
-            // GIVEN full image is showing and the view is shown
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-            iconManager.onViewShown(true)
-            runCurrent()
-            clearInvocations(mockConsumer)
-
-            // WHEN view shown called again
-            iconManager.onViewShown(true)
-            runCurrent()
-
-            // THEN nothing happens
-            verifyZeroInteractions(mockConsumer)
-        }
-
-    @Test
-    fun onViewHidden_alreadyHidden_nothingHappens() =
-        testScope.runTest {
-            // GIVEN placeholder image is showing and the view is hidden
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-            iconManager.onViewShown(false)
-            advanceTimeBy(FREE_IMAGE_DELAY_MS)
-            runCurrent()
-            clearInvocations(mockConsumer)
-
-            // WHEN the view is hidden again
-            iconManager.onViewShown(false)
-            // AND we wait a bit
-            advanceTimeBy(FREE_IMAGE_DELAY_MS)
-            runCurrent()
-
-            // THEN nothing happens
-            verifyZeroInteractions(mockConsumer)
-        }
-
-    @Test
-    fun cancelJobs_freeImageJobRunning_jobCancelled() =
-        testScope.runTest {
-            // GIVEN full image is showing
-            iconManager.updateIcon(mockConsumer, supportedIcon).run()
-            iconManager.onViewShown(true)
-            runCurrent()
-            clearInvocations(mockConsumer)
-            // AND the view has just gone off the screen
-            iconManager.onViewShown(false)
-
-            // WHEN cancelJobs is called
-            iconManager.cancelJobs()
-            // AND we wait a bit
-            advanceTimeBy(FREE_IMAGE_DELAY_MS)
-            runCurrent()
-
-            // THEN no more updates are happening
-            verifyZeroInteractions(mockConsumer)
-        }
-
-    private fun overrideMaxImageSizes() {
-        testableResources.addOverride(
-            com.android.internal.R.dimen.notification_big_picture_max_width,
-            MAX_IMAGE_SIZE
-        )
-        testableResources.addOverride(
-            com.android.internal.R.dimen.notification_big_picture_max_height,
-            MAX_IMAGE_SIZE
-        )
-    }
-
-    private fun assertIsPlaceHolder(drawable: Drawable) {
-        assertThat(drawable).isInstanceOf(PlaceHolderDrawable::class.java)
-    }
-
-    private fun assertIsFullImage(drawable: Drawable) {
-        assertThat(drawable).isInstanceOf(BitmapDrawable::class.java)
-    }
-
-    private fun assertSize(
-        drawable: Drawable,
-        expectedWidth: Int = expectedDrawable.intrinsicWidth,
-        expectedHeight: Int = expectedDrawable.intrinsicHeight
-    ) {
-        assertThat(drawable.intrinsicWidth).isEqualTo(expectedWidth)
-        assertThat(drawable.intrinsicHeight).isEqualTo(expectedHeight)
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt
index 30a1214..48608eb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt
@@ -35,9 +35,6 @@
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.notification.ConversationNotificationProcessor
 import com.android.systemui.statusbar.notification.collection.NotificationEntry
-import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.InflatedContentViewHolder
-import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.KeepExistingView
-import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.NullContentView
 import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.BindParams
 import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.FLAG_CONTENT_VIEW_ALL
 import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.FLAG_CONTENT_VIEW_CONTRACTED
@@ -51,33 +48,23 @@
 import com.android.systemui.statusbar.notification.row.shared.NewRemoteViews
 import com.android.systemui.statusbar.notification.row.shared.NotificationContentModel
 import com.android.systemui.statusbar.notification.row.shared.NotificationRowContentBinderRefactor
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel
-import com.android.systemui.statusbar.notification.row.shared.TimerContentModel
 import com.android.systemui.statusbar.policy.InflatedSmartReplyState
 import com.android.systemui.statusbar.policy.InflatedSmartReplyViewHolder
 import com.android.systemui.statusbar.policy.SmartReplyStateInflater
-import com.google.common.truth.Truth.assertThat
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.Executor
 import java.util.concurrent.TimeUnit
-import kotlinx.coroutines.DisposableHandle
 import org.junit.Assert
 import org.junit.Before
 import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.kotlin.any
-import org.mockito.kotlin.argThat
-import org.mockito.kotlin.clearInvocations
-import org.mockito.kotlin.doReturn
 import org.mockito.kotlin.eq
-import org.mockito.kotlin.inOrder
 import org.mockito.kotlin.mock
-import org.mockito.kotlin.never
 import org.mockito.kotlin.spy
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
-import org.mockito.kotlin.verifyZeroInteractions
 import org.mockito.kotlin.whenever
 
 @SmallTest
@@ -118,45 +105,6 @@
             }
         }
 
-    private var fakeRonContentModel: RichOngoingContentModel? = null
-    private val fakeRonExtractor =
-        object : RichOngoingNotificationContentExtractor {
-            override fun extractContentModel(
-                entry: NotificationEntry,
-                builder: Notification.Builder,
-                systemUIContext: Context,
-                packageContext: Context
-            ): RichOngoingContentModel? = fakeRonContentModel
-        }
-
-    private var fakeContractedRonViewHolder: ContentViewInflationResult = NullContentView
-    private var fakeExpandedRonViewHolder: ContentViewInflationResult = NullContentView
-    private var fakeHeadsUpRonViewHolder: ContentViewInflationResult = NullContentView
-    private var fakeRonViewInflater =
-        spy(
-            object : RichOngoingNotificationViewInflater {
-                override fun inflateView(
-                    contentModel: RichOngoingContentModel,
-                    existingView: View?,
-                    entry: NotificationEntry,
-                    systemUiContext: Context,
-                    parentView: ViewGroup,
-                    viewType: RichOngoingNotificationViewType
-                ): ContentViewInflationResult =
-                    when (viewType) {
-                        RichOngoingNotificationViewType.Contracted -> fakeContractedRonViewHolder
-                        RichOngoingNotificationViewType.Expanded -> fakeExpandedRonViewHolder
-                        RichOngoingNotificationViewType.HeadsUp -> fakeHeadsUpRonViewHolder
-                    }
-
-                override fun canKeepView(
-                    contentModel: RichOngoingContentModel,
-                    existingView: View?,
-                    viewType: RichOngoingNotificationViewType
-                ): Boolean = false
-            }
-        )
-
     @Before
     fun setUp() {
         allowTestableLooperAsMainThread()
@@ -167,15 +115,12 @@
                 .setContentText("Text")
                 .setStyle(Notification.BigTextStyle().bigText("big text"))
         testHelper = NotificationTestHelper(mContext, mDependency)
-        testHelper.setDefaultInflationFlags(FLAG_CONTENT_VIEW_ALL)
         row = spy(testHelper.createRow(builder.build()))
         notificationInflater =
             NotificationRowContentBinderImpl(
                 cache,
                 mock(),
                 mock<ConversationNotificationProcessor>(),
-                fakeRonExtractor,
-                fakeRonViewInflater,
                 mock(),
                 smartReplyStateInflater,
                 layoutInflaterFactoryProvider,
@@ -405,496 +350,6 @@
     }
 
     @Test
-    fun testRonModelRequiredForRonView() {
-        fakeRonContentModel = null
-        val contractedRonView = View(context)
-        val expandedRonView = View(context)
-        val headsUpRonView = View(context)
-        fakeContractedRonViewHolder =
-            InflatedContentViewHolder(view = contractedRonView, binder = mock())
-        fakeExpandedRonViewHolder =
-            InflatedContentViewHolder(view = expandedRonView, binder = mock())
-        fakeHeadsUpRonViewHolder = InflatedContentViewHolder(view = headsUpRonView, binder = mock())
-
-        // WHEN inflater inflates
-        val contentToInflate =
-            FLAG_CONTENT_VIEW_CONTRACTED or FLAG_CONTENT_VIEW_EXPANDED or FLAG_CONTENT_VIEW_HEADS_UP
-        inflateAndWait(notificationInflater, contentToInflate, row)
-        verifyZeroInteractions(fakeRonViewInflater)
-    }
-
-    @Test
-    fun testRonModelCleansUpRemoteViews() {
-        val ronView = View(context)
-
-        val entry = row.entry
-
-        fakeRonContentModel = mock<TimerContentModel>()
-        fakeContractedRonViewHolder =
-            InflatedContentViewHolder(view = ronView, binder = mock<DeferredContentViewBinder>())
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_CONTRACTED, row)
-
-        // VERIFY
-        verify(cache).removeCachedView(eq(entry), eq(FLAG_CONTENT_VIEW_CONTRACTED))
-        verify(cache).removeCachedView(eq(entry), eq(FLAG_CONTENT_VIEW_EXPANDED))
-        verify(cache).removeCachedView(eq(entry), eq(FLAG_CONTENT_VIEW_HEADS_UP))
-    }
-
-    @Test
-    fun testRonModelCleansUpSmartReplies() {
-        val ronView = View(context)
-
-        val privateLayout = spy(row.privateLayout)
-
-        row.privateLayout = privateLayout
-
-        fakeRonContentModel = mock<TimerContentModel>()
-        fakeContractedRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mock())
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_CONTRACTED, row)
-
-        // VERIFY
-        verify(privateLayout).setExpandedInflatedSmartReplies(eq(null))
-        verify(privateLayout).setHeadsUpInflatedSmartReplies(eq(null))
-    }
-
-    @Test
-    fun testRonModelTriggersInflationOfContractedRonView() {
-        val mockRonModel = mock<TimerContentModel>()
-        val ronView = View(context)
-        val mockBinder = mock<DeferredContentViewBinder>()
-
-        val entry = row.entry
-        val privateLayout = row.privateLayout
-
-        fakeRonContentModel = mockRonModel
-        fakeContractedRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mockBinder)
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_CONTRACTED, row)
-
-        // VERIFY that the inflater is invoked
-        verify(fakeRonViewInflater)
-            .inflateView(
-                eq(mockRonModel),
-                any(),
-                eq(entry),
-                any(),
-                eq(privateLayout),
-                eq(RichOngoingNotificationViewType.Contracted)
-            )
-        assertThat(row.privateLayout.contractedChild).isSameInstanceAs(ronView)
-        verify(mockBinder).setupContentViewBinder()
-    }
-
-    @Test
-    fun testRonModelTriggersInflationOfExpandedRonView() {
-        val mockRonModel = mock<TimerContentModel>()
-        val ronView = View(context)
-        val mockBinder = mock<DeferredContentViewBinder>()
-
-        val entry = row.entry
-        val privateLayout = row.privateLayout
-
-        fakeRonContentModel = mockRonModel
-        fakeExpandedRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mockBinder)
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_EXPANDED, row)
-
-        // VERIFY that the inflater is invoked
-        verify(fakeRonViewInflater)
-            .inflateView(
-                eq(mockRonModel),
-                any(),
-                eq(entry),
-                any(),
-                eq(privateLayout),
-                eq(RichOngoingNotificationViewType.Expanded)
-            )
-        assertThat(row.privateLayout.expandedChild).isSameInstanceAs(ronView)
-        verify(mockBinder).setupContentViewBinder()
-    }
-
-    @Test
-    fun testRonModelTriggersInflationOfHeadsUpRonView() {
-        val mockRonModel = mock<TimerContentModel>()
-        val ronView = View(context)
-        val mockBinder = mock<DeferredContentViewBinder>()
-
-        val entry = row.entry
-        val privateLayout = row.privateLayout
-
-        fakeRonContentModel = mockRonModel
-        fakeHeadsUpRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mockBinder)
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_HEADS_UP, row)
-
-        // VERIFY that the inflater is invoked
-        verify(fakeRonViewInflater)
-            .inflateView(
-                eq(mockRonModel),
-                any(),
-                eq(entry),
-                any(),
-                eq(privateLayout),
-                eq(RichOngoingNotificationViewType.HeadsUp)
-            )
-        assertThat(row.privateLayout.headsUpChild).isSameInstanceAs(ronView)
-        verify(mockBinder).setupContentViewBinder()
-    }
-
-    @Test
-    fun keepExistingViewForContractedRonNotChangingContractedChild() {
-        val oldHandle = mock<DisposableHandle>()
-        val mockRonModel = mock<TimerContentModel>()
-
-        row.privateLayout.mContractedBinderHandle = oldHandle
-        val entry = spy(row.entry)
-        row.entry = entry
-        val privateLayout = spy(row.privateLayout)
-        row.privateLayout = privateLayout
-
-        fakeRonContentModel = mockRonModel
-        fakeContractedRonViewHolder = KeepExistingView
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_CONTRACTED, row)
-
-        // THEN  do not dispose old contracted binder handle and change contracted child
-        verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel })
-        verifyZeroInteractions(oldHandle)
-        verify(privateLayout, never()).setContractedChild(any())
-    }
-
-    @Test
-    fun keepExistingViewForExpandedRonNotChangingExpandedChild() {
-        val oldHandle = mock<DisposableHandle>()
-        val mockRonModel = mock<TimerContentModel>()
-
-        row.privateLayout.mExpandedBinderHandle = oldHandle
-        val entry = spy(row.entry)
-        row.entry = entry
-        val privateLayout = spy(row.privateLayout)
-        row.privateLayout = privateLayout
-
-        fakeRonContentModel = mockRonModel
-        fakeExpandedRonViewHolder = KeepExistingView
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_EXPANDED, row)
-
-        // THEN  do not dispose old expanded binder handle and change expanded child
-        verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel })
-        verifyZeroInteractions(oldHandle)
-        verify(privateLayout, never()).setExpandedChild(any())
-    }
-
-    @Test
-    fun keepExistingViewForHeadsUpRonNotChangingHeadsUpChild() {
-        val oldHandle = mock<DisposableHandle>()
-        val mockRonModel = mock<TimerContentModel>()
-
-        row.privateLayout.mHeadsUpBinderHandle = oldHandle
-        val entry = spy(row.entry)
-        row.entry = entry
-        val privateLayout = spy(row.privateLayout)
-        row.privateLayout = privateLayout
-
-        fakeRonContentModel = mockRonModel
-        fakeHeadsUpRonViewHolder = KeepExistingView
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_HEADS_UP, row)
-
-        // THEN - do not dispose old heads up binder handle and change heads up child
-        verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel })
-        verifyZeroInteractions(oldHandle)
-        verify(privateLayout, never()).setHeadsUpChild(any())
-    }
-
-    @Test
-    fun nullContentViewForContractedRonAppliesElementsInOrder() {
-        val oldHandle = mock<DisposableHandle>()
-        val mockRonModel = mock<TimerContentModel>()
-
-        row.privateLayout.mContractedBinderHandle = oldHandle
-        val entry = spy(row.entry)
-        row.entry = entry
-        val privateLayout = spy(row.privateLayout)
-        row.privateLayout = privateLayout
-
-        fakeRonContentModel = mockRonModel
-        fakeContractedRonViewHolder = NullContentView
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_CONTRACTED, row)
-
-        // Validate that these 4 steps happen in this precise order
-        inOrder(oldHandle, entry, privateLayout, cache) {
-            verify(oldHandle).dispose()
-            verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel })
-            verify(privateLayout).setContractedChild(eq(null))
-        }
-    }
-
-    @Test
-    fun nullContentViewForExpandedRonAppliesElementsInOrder() {
-        val oldHandle = mock<DisposableHandle>()
-        val mockRonModel = mock<TimerContentModel>()
-
-        row.privateLayout.mExpandedBinderHandle = oldHandle
-        val entry = spy(row.entry)
-        row.entry = entry
-        val privateLayout = spy(row.privateLayout)
-        row.privateLayout = privateLayout
-
-        fakeRonContentModel = mockRonModel
-        fakeExpandedRonViewHolder = NullContentView
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_EXPANDED, row)
-
-        // Validate that these 4 steps happen in this precise order
-        inOrder(oldHandle, entry, privateLayout, cache) {
-            verify(oldHandle).dispose()
-            verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel })
-            verify(privateLayout).setExpandedChild(eq(null))
-        }
-    }
-
-    @Test
-    fun nullContentViewForHeadsUpRonAppliesElementsInOrder() {
-        val oldHandle = mock<DisposableHandle>()
-        val mockRonModel = mock<TimerContentModel>()
-
-        row.privateLayout.mHeadsUpBinderHandle = oldHandle
-        val entry = spy(row.entry)
-        row.entry = entry
-        val privateLayout = spy(row.privateLayout)
-        row.privateLayout = privateLayout
-
-        fakeRonContentModel = mockRonModel
-        fakeHeadsUpRonViewHolder = NullContentView
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_HEADS_UP, row)
-
-        // Validate that these 4 steps happen in this precise order
-        inOrder(oldHandle, entry, privateLayout, cache) {
-            verify(oldHandle).dispose()
-            verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel })
-            verify(privateLayout).setHeadsUpChild(eq(null))
-        }
-    }
-
-    @Test
-    fun contractedRonViewAppliesElementsInOrder() {
-        val oldHandle = mock<DisposableHandle>()
-        val mockRonModel = mock<TimerContentModel>()
-        val ronView = View(context)
-        val mockBinder = mock<DeferredContentViewBinder>()
-
-        row.privateLayout.mContractedBinderHandle = oldHandle
-        val entry = spy(row.entry)
-        row.entry = entry
-        val privateLayout = spy(row.privateLayout)
-        row.privateLayout = privateLayout
-
-        fakeRonContentModel = mockRonModel
-        fakeContractedRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mockBinder)
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_CONTRACTED, row)
-
-        // Validate that these 4 steps happen in this precise order
-        inOrder(oldHandle, entry, privateLayout, mockBinder) {
-            verify(oldHandle).dispose()
-            verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel })
-            verify(privateLayout).setContractedChild(eq(ronView))
-            verify(mockBinder).setupContentViewBinder()
-        }
-    }
-
-    @Test
-    fun expandedRonViewAppliesElementsInOrder() {
-        val oldHandle = mock<DisposableHandle>()
-        val mockRonModel = mock<TimerContentModel>()
-        val ronView = View(context)
-        val mockBinder = mock<DeferredContentViewBinder>()
-
-        row.privateLayout.mExpandedBinderHandle = oldHandle
-        val entry = spy(row.entry)
-        row.entry = entry
-        val privateLayout = spy(row.privateLayout)
-        row.privateLayout = privateLayout
-
-        fakeRonContentModel = mockRonModel
-        fakeExpandedRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mockBinder)
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_EXPANDED, row)
-
-        // Validate that these 4 steps happen in this precise order
-        inOrder(oldHandle, entry, privateLayout, mockBinder) {
-            verify(oldHandle).dispose()
-            verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel })
-            verify(privateLayout).setExpandedChild(eq(ronView))
-            verify(mockBinder).setupContentViewBinder()
-        }
-    }
-
-    @Test
-    fun headsUpRonViewAppliesElementsInOrder() {
-        val oldHandle = mock<DisposableHandle>()
-        val mockRonModel = mock<TimerContentModel>()
-        val ronView = View(context)
-        val mockBinder = mock<DeferredContentViewBinder>()
-
-        row.privateLayout.mHeadsUpBinderHandle = oldHandle
-        val entry = spy(row.entry)
-        row.entry = entry
-        val privateLayout = spy(row.privateLayout)
-        row.privateLayout = privateLayout
-
-        fakeRonContentModel = mockRonModel
-        fakeHeadsUpRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mockBinder)
-
-        // WHEN inflater inflates
-        inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_HEADS_UP, row)
-
-        // Validate that these 4 steps happen in this precise order
-        inOrder(oldHandle, entry, privateLayout, mockBinder) {
-            verify(oldHandle).dispose()
-            verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel })
-            verify(privateLayout).setHeadsUpChild(eq(ronView))
-            verify(mockBinder).setupContentViewBinder()
-        }
-    }
-
-    @Test
-    fun testRonNotReinflating() {
-        val oldContractedBinderHandle = mock<DisposableHandle>()
-        val oldExpandedBinderHandle = mock<DisposableHandle>()
-        val oldHeadsUpBinderHandle = mock<DisposableHandle>()
-
-        val contractedBinderHandle = mock<DisposableHandle>()
-        val expandedBinderHandle = mock<DisposableHandle>()
-        val headsUpBinderHandle = mock<DisposableHandle>()
-
-        val contractedRonView = View(context)
-        val expandedRonView = View(context)
-        val headsUpRonView = View(context)
-
-        val mockRonModel1 = mock<TimerContentModel>()
-        val mockRonModel2 = mock<TimerContentModel>()
-
-        val mockContractedViewBinder = mock<DeferredContentViewBinder>()
-        val mockExpandedViewBinder = mock<DeferredContentViewBinder>()
-        val mockHeadsUpViewBinder = mock<DeferredContentViewBinder>()
-
-        doReturn(contractedBinderHandle).whenever(mockContractedViewBinder).setupContentViewBinder()
-        doReturn(expandedBinderHandle).whenever(mockExpandedViewBinder).setupContentViewBinder()
-        doReturn(headsUpBinderHandle).whenever(mockHeadsUpViewBinder).setupContentViewBinder()
-
-        row.privateLayout.mContractedBinderHandle = oldContractedBinderHandle
-        row.privateLayout.mExpandedBinderHandle = oldExpandedBinderHandle
-        row.privateLayout.mHeadsUpBinderHandle = oldHeadsUpBinderHandle
-        val entry = spy(row.entry)
-        row.entry = entry
-        val privateLayout = spy(row.privateLayout)
-        row.privateLayout = privateLayout
-
-        // WHEN inflater inflates both a model and a view
-        fakeRonContentModel = mockRonModel1
-        fakeContractedRonViewHolder =
-            InflatedContentViewHolder(view = contractedRonView, binder = mockContractedViewBinder)
-        fakeExpandedRonViewHolder =
-            InflatedContentViewHolder(view = expandedRonView, binder = mockExpandedViewBinder)
-        fakeHeadsUpRonViewHolder =
-            InflatedContentViewHolder(view = headsUpRonView, binder = mockHeadsUpViewBinder)
-
-        val contentToInflate =
-            FLAG_CONTENT_VIEW_CONTRACTED or FLAG_CONTENT_VIEW_EXPANDED or FLAG_CONTENT_VIEW_HEADS_UP
-        inflateAndWait(notificationInflater, contentToInflate, row)
-
-        // Validate that these 4 steps happen in this precise order
-        inOrder(
-            oldContractedBinderHandle,
-            oldExpandedBinderHandle,
-            oldHeadsUpBinderHandle,
-            entry,
-            privateLayout,
-            mockContractedViewBinder,
-            mockExpandedViewBinder,
-            mockHeadsUpViewBinder,
-            contractedBinderHandle,
-            expandedBinderHandle,
-            headsUpBinderHandle
-        ) {
-            verify(oldContractedBinderHandle).dispose()
-            verify(oldExpandedBinderHandle).dispose()
-            verify(oldHeadsUpBinderHandle).dispose()
-
-            verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel1 })
-
-            verify(privateLayout).setContractedChild(eq(contractedRonView))
-            verify(mockContractedViewBinder).setupContentViewBinder()
-
-            verify(privateLayout).setExpandedChild(eq(expandedRonView))
-            verify(mockExpandedViewBinder).setupContentViewBinder()
-
-            verify(privateLayout).setHeadsUpChild(eq(headsUpRonView))
-            verify(mockHeadsUpViewBinder).setupContentViewBinder()
-
-            verify(contractedBinderHandle, never()).dispose()
-            verify(expandedBinderHandle, never()).dispose()
-            verify(headsUpBinderHandle, never()).dispose()
-        }
-
-        clearInvocations(
-            oldContractedBinderHandle,
-            oldExpandedBinderHandle,
-            oldHeadsUpBinderHandle,
-            entry,
-            privateLayout,
-            mockContractedViewBinder,
-            mockExpandedViewBinder,
-            mockHeadsUpViewBinder,
-            contractedBinderHandle,
-            expandedBinderHandle,
-            headsUpBinderHandle
-        )
-
-        // THEN when the inflater inflates just a model
-        fakeRonContentModel = mockRonModel2
-        fakeContractedRonViewHolder = KeepExistingView
-        fakeExpandedRonViewHolder = KeepExistingView
-        fakeHeadsUpRonViewHolder = KeepExistingView
-
-        inflateAndWait(notificationInflater, contentToInflate, row)
-
-        // Validate that for reinflation, the only thing we do us update the model
-        verify(contractedBinderHandle, never()).dispose()
-        verify(expandedBinderHandle, never()).dispose()
-        verify(headsUpBinderHandle, never()).dispose()
-        verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel2 })
-        verify(privateLayout, never()).setContractedChild(any())
-        verify(privateLayout, never()).setExpandedChild(any())
-        verify(privateLayout, never()).setHeadsUpChild(any())
-        verify(mockContractedViewBinder, never()).setupContentViewBinder()
-        verify(mockExpandedViewBinder, never()).setupContentViewBinder()
-        verify(mockHeadsUpViewBinder, never()).setupContentViewBinder()
-        verify(contractedBinderHandle, never()).dispose()
-        verify(expandedBinderHandle, never()).dispose()
-        verify(headsUpBinderHandle, never()).dispose()
-    }
-
-    @Test
     fun testNotificationViewHeightTooSmallFailsValidation() {
         val validationError =
             getValidationError(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt
deleted file mode 100644
index 310fa67..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright (c) 2023 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.systemui.statusbar.notification.row
-
-import android.app.ActivityManager
-import android.database.ContentObserver
-import android.net.Uri
-import android.os.Handler
-import android.provider.Settings.Secure
-import android.testing.TestableLooper
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.settings.UserTracker
-import com.android.systemui.statusbar.notification.row.NotificationSettingsController.Listener
-import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.capture
-import com.android.systemui.util.mockito.eq
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.whenever
-import com.android.systemui.util.settings.SecureSettings
-import org.junit.After
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentCaptor
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.ArgumentMatchers.anyString
-import org.mockito.Captor
-import org.mockito.Mock
-import org.mockito.Mockito
-import org.mockito.Mockito.anyBoolean
-import org.mockito.Mockito.clearInvocations
-import org.mockito.Mockito.never
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyNoMoreInteractions
-import org.mockito.Mockito.verifyZeroInteractions
-import org.mockito.MockitoAnnotations
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-@TestableLooper.RunWithLooper
-class NotificationSettingsControllerTest : SysuiTestCase() {
-
-    val setting1: String = Secure.NOTIFICATION_BUBBLES
-    val setting2: String = Secure.ACCESSIBILITY_ENABLED
-    val settingUri1: Uri = Secure.getUriFor(setting1)
-    val settingUri2: Uri = Secure.getUriFor(setting2)
-
-    @Mock private lateinit var userTracker: UserTracker
-    private lateinit var mainHandler: Handler
-    private lateinit var backgroundHandler: Handler
-    private lateinit var testableLooper: TestableLooper
-    @Mock private lateinit var secureSettings: SecureSettings
-    @Mock private lateinit var dumpManager: DumpManager
-
-    @Captor private lateinit var userTrackerCallbackCaptor: ArgumentCaptor<UserTracker.Callback>
-    @Captor private lateinit var settingsObserverCaptor: ArgumentCaptor<ContentObserver>
-
-    private lateinit var controller: NotificationSettingsController
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-        testableLooper = TestableLooper.get(this)
-        mainHandler = Handler(testableLooper.looper)
-        backgroundHandler = Handler(testableLooper.looper)
-        allowTestableLooperAsMainThread()
-        controller =
-            NotificationSettingsController(
-                userTracker,
-                mainHandler,
-                backgroundHandler,
-                secureSettings,
-                dumpManager
-            )
-    }
-
-    @After
-    fun tearDown() {
-        disallowTestableLooperAsMainThread()
-    }
-
-    @Test
-    fun creationRegistersCallbacks() {
-        verify(userTracker).addCallback(any(), any())
-        verify(dumpManager).registerNormalDumpable(anyString(), eq(controller))
-    }
-
-    @Test
-    fun updateContentObserverRegistration_onUserChange_noSettingsListeners() {
-        verify(userTracker).addCallback(capture(userTrackerCallbackCaptor), any())
-        val userCallback = userTrackerCallbackCaptor.value
-        val userId = 9
-
-        // When: User is changed
-        userCallback.onUserChanged(userId, context)
-
-        // Validate: Nothing to do, since we aren't monitoring settings
-        verify(secureSettings, never()).unregisterContentObserverSync(any())
-        verify(secureSettings, never())
-            .registerContentObserverForUserSync(any(Uri::class.java), anyBoolean(), any(), anyInt())
-    }
-
-    @Test
-    fun updateContentObserverRegistration_onUserChange_withSettingsListeners() {
-        // When: someone is listening to a setting
-        controller.addCallback(settingUri1, Mockito.mock(Listener::class.java))
-
-        verify(userTracker).addCallback(capture(userTrackerCallbackCaptor), any())
-        val userCallback = userTrackerCallbackCaptor.value
-        val userId = 9
-
-        // Then: User is changed
-        userCallback.onUserChanged(userId, context)
-
-        // Validate: The tracker is unregistered and re-registered with the new user
-        verify(secureSettings).unregisterContentObserverSync(any())
-        verify(secureSettings)
-            .registerContentObserverForUserSync(eq(settingUri1), eq(false), any(), eq(userId))
-    }
-
-    @Test
-    fun addCallback_onlyFirstForUriRegistersObserver() {
-        controller.addCallback(settingUri1, Mockito.mock(Listener::class.java))
-        verifyZeroInteractions(secureSettings)
-        testableLooper.processAllMessages()
-        verify(secureSettings)
-            .registerContentObserverForUserSync(
-                eq(settingUri1),
-                eq(false),
-                any(),
-                eq(ActivityManager.getCurrentUser())
-            )
-
-        controller.addCallback(settingUri1, Mockito.mock(Listener::class.java))
-        verify(secureSettings)
-            .registerContentObserverForUserSync(any(Uri::class.java), anyBoolean(), any(), anyInt())
-    }
-
-    @Test
-    fun addCallback_secondUriRegistersObserver() {
-        controller.addCallback(settingUri1, Mockito.mock(Listener::class.java))
-        verifyZeroInteractions(secureSettings)
-        testableLooper.processAllMessages()
-        verify(secureSettings)
-            .registerContentObserverForUserSync(
-                eq(settingUri1),
-                eq(false),
-                any(),
-                eq(ActivityManager.getCurrentUser())
-            )
-        clearInvocations(secureSettings)
-
-        controller.addCallback(settingUri2, Mockito.mock(Listener::class.java))
-        verifyNoMoreInteractions(secureSettings)
-        testableLooper.processAllMessages()
-        verify(secureSettings)
-            .registerContentObserverForUserSync(
-                eq(settingUri2),
-                eq(false),
-                any(),
-                eq(ActivityManager.getCurrentUser())
-            )
-    }
-
-    @Test
-    fun removeCallback_lastUnregistersObserver() {
-        val listenerSetting1: Listener = mock()
-        val listenerSetting2: Listener = mock()
-        controller.addCallback(settingUri1, listenerSetting1)
-        verifyZeroInteractions(secureSettings)
-        testableLooper.processAllMessages()
-        verify(secureSettings)
-            .registerContentObserverForUserSync(
-                eq(settingUri1),
-                eq(false),
-                any(),
-                eq(ActivityManager.getCurrentUser())
-            )
-        clearInvocations(secureSettings)
-
-        controller.addCallback(settingUri2, listenerSetting2)
-        verifyNoMoreInteractions(secureSettings)
-        testableLooper.processAllMessages()
-        verify(secureSettings)
-            .registerContentObserverForUserSync(eq(settingUri2), anyBoolean(), any(), anyInt())
-        clearInvocations(secureSettings)
-
-        controller.removeCallback(settingUri2, listenerSetting2)
-        testableLooper.processAllMessages()
-        verify(secureSettings, never()).unregisterContentObserverSync(any())
-        clearInvocations(secureSettings)
-
-        controller.removeCallback(settingUri1, listenerSetting1)
-        verifyNoMoreInteractions(secureSettings)
-        testableLooper.processAllMessages()
-        verify(secureSettings).unregisterContentObserverSync(any())
-    }
-
-    @Test
-    fun addCallback_updatesCurrentValue() {
-        whenever(secureSettings.getStringForUser(setting1, ActivityManager.getCurrentUser()))
-            .thenReturn("9")
-        whenever(secureSettings.getStringForUser(setting2, ActivityManager.getCurrentUser()))
-            .thenReturn("5")
-
-        val listenerSetting1a: Listener = mock()
-        val listenerSetting1b: Listener = mock()
-        val listenerSetting2: Listener = mock()
-
-        controller.addCallback(settingUri1, listenerSetting1a)
-        controller.addCallback(settingUri1, listenerSetting1b)
-        controller.addCallback(settingUri2, listenerSetting2)
-
-        verifyZeroInteractions(secureSettings)
-        testableLooper.processAllMessages()
-
-        verify(listenerSetting1a)
-            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
-        verify(listenerSetting1b)
-            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
-        verify(listenerSetting2)
-            .onSettingChanged(settingUri2, ActivityManager.getCurrentUser(), "5")
-    }
-
-    @Test
-    fun removeCallback_noMoreUpdates() {
-        whenever(secureSettings.getStringForUser(setting1, ActivityManager.getCurrentUser()))
-            .thenReturn("9")
-
-        val listenerSetting1a: Listener = mock()
-        val listenerSetting1b: Listener = mock()
-
-        // First, register
-        controller.addCallback(settingUri1, listenerSetting1a)
-        controller.addCallback(settingUri1, listenerSetting1b)
-        verifyZeroInteractions(secureSettings)
-        testableLooper.processAllMessages()
-
-        verify(secureSettings)
-            .registerContentObserverForUserSync(
-                any(Uri::class.java),
-                anyBoolean(),
-                capture(settingsObserverCaptor),
-                anyInt()
-            )
-        verify(listenerSetting1a)
-            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
-        verify(listenerSetting1b)
-            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
-        clearInvocations(listenerSetting1b)
-        clearInvocations(listenerSetting1a)
-
-        // Remove one of them
-        controller.removeCallback(settingUri1, listenerSetting1a)
-
-        // On update, only remaining listener should get the callback
-        settingsObserverCaptor.value.onChange(false, settingUri1)
-        testableLooper.processAllMessages()
-
-        verify(listenerSetting1a, never())
-            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
-        verify(listenerSetting1b)
-            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
index 75376e6..2340d02 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
@@ -200,8 +200,6 @@
                                 mock(NotifRemoteViewCache.class),
                                 mock(NotificationRemoteInputManager.class),
                                 mock(ConversationNotificationProcessor.class),
-                                mock(RichOngoingNotificationContentExtractor.class),
-                                mock(RichOngoingNotificationViewInflater.class),
                                 mock(Executor.class),
                                 new MockSmartReplyInflater(),
                                 mock(NotifLayoutInflaterFactory.Provider.class),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/SingleLineViewBinderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/SingleLineViewBinderTest.kt
index 6b3fb5b..503fa78 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/SingleLineViewBinderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/SingleLineViewBinderTest.kt
@@ -29,12 +29,13 @@
 import com.android.systemui.statusbar.notification.row.SingleLineViewInflater.inflatePublicSingleLineView
 import com.android.systemui.statusbar.notification.row.shared.AsyncHybridViewInflation
 import com.android.systemui.statusbar.notification.row.ui.viewbinder.SingleLineViewBinder
-import com.android.systemui.util.mockito.mock
 import kotlin.test.assertEquals
 import kotlin.test.assertNotNull
+import kotlin.test.assertNull
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.kotlin.mock
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
@@ -69,7 +70,7 @@
                 reinflateFlags = FLAG_CONTENT_VIEW_SINGLE_LINE,
                 entry = row.entry,
                 context = context,
-                logger = mock()
+                logger = mock(),
             )
 
         val publicView =
@@ -78,7 +79,7 @@
                 reinflateFlags = FLAG_CONTENT_VIEW_PUBLIC_SINGLE_LINE,
                 entry = row.entry,
                 context = context,
-                logger = mock()
+                logger = mock(),
             )
         assertNotNull(publicView)
 
@@ -114,7 +115,7 @@
                 .addMessage(
                     "How about lunch?",
                     System.currentTimeMillis(),
-                    Person.Builder().setName("user2").build()
+                    Person.Builder().setName("user2").build(),
                 )
                 .setGroupConversation(true)
         notificationBuilder.setStyle(style).setShortcutId(SHORTCUT_ID)
@@ -127,7 +128,7 @@
                 reinflateFlags = FLAG_CONTENT_VIEW_SINGLE_LINE,
                 entry = row.entry,
                 context = context,
-                logger = mock()
+                logger = mock(),
             )
                 as HybridConversationNotificationView
 
@@ -137,7 +138,7 @@
                 reinflateFlags = FLAG_CONTENT_VIEW_PUBLIC_SINGLE_LINE,
                 entry = row.entry,
                 context = context,
-                logger = mock()
+                logger = mock(),
             )
                 as HybridConversationNotificationView
         assertNotNull(publicView)
@@ -150,10 +151,7 @@
                 systemUiContext = context,
             )
         // WHEN: binds the view
-        SingleLineViewBinder.bind(
-            viewModel,
-            view,
-        )
+        SingleLineViewBinder.bind(viewModel, view)
 
         // THEN: the single-line conversation view should be bound with view model's corresponding
         // fields
@@ -161,10 +159,55 @@
         assertEquals(viewModel.contentText, view.textView.text)
         assertEquals(
             viewModel.conversationData?.conversationSenderName,
-            view.conversationSenderNameView.text
+            view.conversationSenderNameView.text,
         )
     }
 
+    @Test
+    @EnableFlags(AsyncHybridViewInflation.FLAG_NAME)
+    fun bindConversationSingleLineView_nonConversationViewModel() {
+        // GIVEN: a ConversationSingleLineView, and a nonConversationViewModel
+        val style = Notification.BigTextStyle().bigText(CONTENT_TEXT)
+        notificationBuilder.setStyle(style)
+        val notification = notificationBuilder.build()
+        val row: ExpandableNotificationRow = helper.createRow(notification)
+
+        val view =
+            inflatePrivateSingleLineView(
+                isConversation = true,
+                reinflateFlags = FLAG_CONTENT_VIEW_SINGLE_LINE,
+                entry = row.entry,
+                context = context,
+                logger = mock(),
+            )
+
+        val publicView =
+            inflatePublicSingleLineView(
+                isConversation = true,
+                reinflateFlags = FLAG_CONTENT_VIEW_PUBLIC_SINGLE_LINE,
+                entry = row.entry,
+                context = context,
+                logger = mock(),
+            )
+        assertNotNull(publicView)
+
+        val viewModel =
+            SingleLineViewInflater.inflateSingleLineViewModel(
+                notification = notification,
+                messagingStyle = null,
+                builder = notificationBuilder,
+                systemUiContext = context,
+            )
+        // WHEN: binds the view with the view model
+        SingleLineViewBinder.bind(viewModel, view)
+
+        // THEN: the single-line view should be bound with view model's corresponding
+        // fields as a normal non-conversation single-line view
+        assertEquals(viewModel.titleText, view?.titleView?.text)
+        assertEquals(viewModel.contentText, view?.textView?.text)
+        assertNull(viewModel.conversationData)
+    }
+
     private companion object {
         const val CHANNEL_ID = "CHANNEL_ID"
         const val CONTENT_TITLE = "A Cool New Feature"
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
index 30556be..7cd306e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
@@ -37,7 +37,7 @@
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 import android.metrics.LogMaker;
@@ -937,7 +937,7 @@
     @DisableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING)
     public void sensitiveNotificationProtectionControllerListenerNotRegistered() {
         initController(/* viewIsAttached= */ true);
-        verifyZeroInteractions(mSensitiveNotificationProtectionController);
+        verifyNoMoreInteractions(mSensitiveNotificationProtectionController);
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
index bb9f12b..8a3e551 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
@@ -88,6 +88,7 @@
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager;
 import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
+import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix;
 import com.android.systemui.statusbar.notification.emptyshade.ui.view.EmptyShadeView;
 import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor;
 import com.android.systemui.statusbar.notification.footer.ui.view.FooterView;
@@ -383,6 +384,7 @@
     }
 
     @Test
+    @DisableFlags(ModesEmptyShadeFix.FLAG_NAME)
     public void updateEmptyView_dndSuppressing() {
         when(mEmptyShadeView.willBeGone()).thenReturn(true);
 
@@ -394,6 +396,7 @@
     }
 
     @Test
+    @DisableFlags(ModesEmptyShadeFix.FLAG_NAME)
     public void updateEmptyView_dndNotSuppressing() {
         mStackScroller.setEmptyShadeView(mEmptyShadeView);
         when(mEmptyShadeView.willBeGone()).thenReturn(true);
@@ -406,6 +409,7 @@
     }
 
     @Test
+    @DisableFlags(ModesEmptyShadeFix.FLAG_NAME)
     public void updateEmptyView_noNotificationsToDndSuppressing() {
         mStackScroller.setEmptyShadeView(mEmptyShadeView);
         when(mEmptyShadeView.willBeGone()).thenReturn(true);
@@ -717,7 +721,7 @@
     }
 
     @Test
-    @DisableFlags(FooterViewRefactor.FLAG_NAME)
+    @DisableFlags({FooterViewRefactor.FLAG_NAME, ModesEmptyShadeFix.FLAG_NAME})
     public void testReInflatesFooterViews() {
         when(mEmptyShadeView.getTextResource()).thenReturn(R.string.empty_shade_text);
         clearInvocations(mStackScroller);
@@ -728,6 +732,7 @@
 
     @Test
     @EnableFlags(FooterViewRefactor.FLAG_NAME)
+    @DisableFlags(ModesEmptyShadeFix.FLAG_NAME)
     public void testReInflatesEmptyShadeView() {
         when(mEmptyShadeView.getTextResource()).thenReturn(R.string.empty_shade_text);
         clearInvocations(mStackScroller);
@@ -1189,7 +1194,7 @@
     }
 
     @Test
-    @DisableFlags(FooterViewRefactor.FLAG_NAME)
+    @DisableFlags({FooterViewRefactor.FLAG_NAME, ModesEmptyShadeFix.FLAG_NAME})
     public void hasFilteredOutSeenNotifs_updateEmptyShadeView() {
         mStackScroller.setHasFilteredOutSeenNotifications(true);
         mStackScroller.updateEmptyShadeView(true, false);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerTest.kt
deleted file mode 100644
index c61756c..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerTest.kt
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
- * Copyright (C) 2023 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.systemui.statusbar.notification.stack.ui.view
-
-import android.service.notification.notificationListenerService
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.internal.statusbar.NotificationVisibility
-import com.android.internal.statusbar.statusBarService
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.statusbar.notification.data.model.activeNotificationModel
-import com.android.systemui.statusbar.notification.logging.nano.Notifications
-import com.android.systemui.statusbar.notification.logging.notificationPanelLogger
-import com.android.systemui.statusbar.notification.stack.ExpandableViewState
-import com.android.systemui.testKosmos
-import com.android.systemui.util.mockito.argumentCaptor
-import com.android.systemui.util.mockito.eq
-import com.google.common.truth.Truth.assertThat
-import java.util.concurrent.Callable
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mockito.clearInvocations
-import org.mockito.Mockito.spy
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class NotificationStatsLoggerTest : SysuiTestCase() {
-
-    private val kosmos = testKosmos()
-
-    private val testScope = kosmos.testScope
-    private val mockNotificationListenerService = kosmos.notificationListenerService
-    private val mockPanelLogger = kosmos.notificationPanelLogger
-    private val mockStatusBarService = kosmos.statusBarService
-
-    private val underTest = kosmos.notificationStatsLogger
-
-    private val visibilityArrayCaptor = argumentCaptor<Array<NotificationVisibility>>()
-    private val stringArrayCaptor = argumentCaptor<Array<String>>()
-    private val notificationListProtoCaptor = argumentCaptor<Notifications.NotificationList>()
-
-    @Test
-    fun onNotificationListUpdated_itemsAdded_logsNewlyVisibleItems() =
-        testScope.runTest {
-            // WHEN new Notifications are added
-            // AND they're visible
-            val (ranks, locations) = fakeNotificationMaps("key0", "key1")
-            val callable = Callable { locations }
-            underTest.onNotificationLocationsChanged(callable, ranks)
-            runCurrent()
-
-            // THEN visibility changes are reported
-            verify(mockStatusBarService)
-                .onNotificationVisibilityChanged(visibilityArrayCaptor.capture(), eq(emptyArray()))
-            verify(mockNotificationListenerService)
-                .setNotificationsShown(stringArrayCaptor.capture())
-            val loggedVisibilities = visibilityArrayCaptor.value
-            val loggedKeys = stringArrayCaptor.value
-            assertThat(loggedVisibilities).hasLength(2)
-            assertThat(loggedKeys).hasLength(2)
-            assertThat(loggedVisibilities[0]).apply {
-                isKeyEqualTo("key0")
-                isRankEqualTo(0)
-                isVisible()
-                isInMainArea()
-                isCountEqualTo(2)
-            }
-            assertThat(loggedVisibilities[1]).apply {
-                isKeyEqualTo("key1")
-                isRankEqualTo(1)
-                isVisible()
-                isInMainArea()
-                isCountEqualTo(2)
-            }
-            assertThat(loggedKeys[0]).isEqualTo("key0")
-            assertThat(loggedKeys[1]).isEqualTo("key1")
-        }
-
-    @Test
-    fun onNotificationListUpdated_itemsRemoved_logsNoLongerVisibleItems() =
-        testScope.runTest {
-            // GIVEN some visible Notifications are reported
-            val (ranks, locations) = fakeNotificationMaps("key0", "key1")
-            val callable = Callable { locations }
-            underTest.onNotificationLocationsChanged(callable, ranks)
-            runCurrent()
-            clearInvocations(mockStatusBarService, mockNotificationListenerService)
-
-            // WHEN the same Notifications are removed
-            val emptyCallable = Callable { emptyMap<String, Int>() }
-            underTest.onNotificationLocationsChanged(emptyCallable, emptyMap())
-            runCurrent()
-
-            // THEN visibility changes are reported
-            verify(mockStatusBarService)
-                .onNotificationVisibilityChanged(eq(emptyArray()), visibilityArrayCaptor.capture())
-            verifyZeroInteractions(mockNotificationListenerService)
-            val noLongerVisible = visibilityArrayCaptor.value
-            assertThat(noLongerVisible).hasLength(2)
-            assertThat(noLongerVisible[0]).apply {
-                isKeyEqualTo("key0")
-                isRankEqualTo(0)
-                notVisible()
-                isInMainArea()
-                isCountEqualTo(0)
-            }
-            assertThat(noLongerVisible[1]).apply {
-                isKeyEqualTo("key1")
-                isRankEqualTo(1)
-                notVisible()
-                isInMainArea()
-                isCountEqualTo(0)
-            }
-        }
-
-    @Test
-    fun onNotificationListUpdated_itemsBecomeInvisible_logsNoLongerVisibleItems() =
-        testScope.runTest {
-            // GIVEN some visible Notifications are reported
-            val (ranks, locations) = fakeNotificationMaps("key0", "key1")
-            val callable = Callable { locations }
-            underTest.onNotificationLocationsChanged(callable, ranks)
-            runCurrent()
-            clearInvocations(mockStatusBarService, mockNotificationListenerService)
-
-            // WHEN the same Notifications are becoming invisible
-            val emptyCallable = Callable { emptyMap<String, Int>() }
-            underTest.onNotificationLocationsChanged(emptyCallable, ranks)
-            runCurrent()
-
-            // THEN visibility changes are reported
-            verify(mockStatusBarService)
-                .onNotificationVisibilityChanged(eq(emptyArray()), visibilityArrayCaptor.capture())
-            verifyZeroInteractions(mockNotificationListenerService)
-            val noLongerVisible = visibilityArrayCaptor.value
-            assertThat(noLongerVisible).hasLength(2)
-            assertThat(noLongerVisible[0]).apply {
-                isKeyEqualTo("key0")
-                isRankEqualTo(0)
-                notVisible()
-                isInMainArea()
-                isCountEqualTo(2)
-            }
-            assertThat(noLongerVisible[1]).apply {
-                isKeyEqualTo("key1")
-                isRankEqualTo(1)
-                notVisible()
-                isInMainArea()
-                isCountEqualTo(2)
-            }
-        }
-
-    @Test
-    fun onNotificationListUpdated_itemsChangedPositions_nothingLogged() =
-        testScope.runTest {
-            // GIVEN some visible Notifications are reported
-            val (ranks, locations) = fakeNotificationMaps("key0", "key1")
-            underTest.onNotificationLocationsChanged({ locations }, ranks)
-            runCurrent()
-            clearInvocations(mockStatusBarService, mockNotificationListenerService)
-
-            // WHEN the reported Notifications are changing positions
-            val (newRanks, newLocations) = fakeNotificationMaps("key1", "key0")
-            underTest.onNotificationLocationsChanged({ newLocations }, newRanks)
-            runCurrent()
-
-            // THEN no visibility changes are reported
-            verifyZeroInteractions(mockStatusBarService, mockNotificationListenerService)
-        }
-
-    @Test
-    fun onNotificationListUpdated_calledTwice_usesTheNewCallable() =
-        testScope.runTest {
-            // GIVEN some visible Notifications are reported
-            val (ranks, locations) = fakeNotificationMaps("key0", "key1", "key2")
-            val callable = spy(Callable { locations })
-            underTest.onNotificationLocationsChanged(callable, ranks)
-            runCurrent()
-            clearInvocations(callable)
-
-            // WHEN a new update comes
-            val otherCallable = spy(Callable { locations })
-            underTest.onNotificationLocationsChanged(otherCallable, ranks)
-            runCurrent()
-
-            // THEN we call the new Callable
-            verifyZeroInteractions(callable)
-            verify(otherCallable).call()
-        }
-
-    @Test
-    fun onLockscreenOrShadeNotInteractive_logsNoLongerVisibleItems() =
-        testScope.runTest {
-            // GIVEN some visible Notifications are reported
-            val (ranks, locations) = fakeNotificationMaps("key0", "key1")
-            val callable = Callable { locations }
-            underTest.onNotificationLocationsChanged(callable, ranks)
-            runCurrent()
-            clearInvocations(mockStatusBarService, mockNotificationListenerService)
-
-            // WHEN the Shade becomes non interactive
-            underTest.onLockscreenOrShadeNotInteractive(emptyList())
-            runCurrent()
-
-            // THEN visibility changes are reported
-            verify(mockStatusBarService)
-                .onNotificationVisibilityChanged(eq(emptyArray()), visibilityArrayCaptor.capture())
-            verifyZeroInteractions(mockNotificationListenerService)
-            val noLongerVisible = visibilityArrayCaptor.value
-            assertThat(noLongerVisible).hasLength(2)
-            assertThat(noLongerVisible[0]).apply {
-                isKeyEqualTo("key0")
-                isRankEqualTo(0)
-                notVisible()
-                isInMainArea()
-                isCountEqualTo(0)
-            }
-            assertThat(noLongerVisible[1]).apply {
-                isKeyEqualTo("key1")
-                isRankEqualTo(1)
-                notVisible()
-                isInMainArea()
-                isCountEqualTo(0)
-            }
-        }
-
-    @Test
-    fun onLockscreenOrShadeInteractive_logsPanelShown() =
-        testScope.runTest {
-            // WHEN the Shade becomes interactive
-            underTest.onLockscreenOrShadeInteractive(
-                isOnLockScreen = true,
-                listOf(
-                    activeNotificationModel(
-                        key = "key0",
-                        uid = 0,
-                        packageName = "com.android.first"
-                    ),
-                    activeNotificationModel(
-                        key = "key1",
-                        uid = 1,
-                        packageName = "com.android.second"
-                    ),
-                )
-            )
-            runCurrent()
-
-            // THEN the Panel shown event is reported
-            verify(mockPanelLogger).logPanelShown(eq(true), notificationListProtoCaptor.capture())
-            val loggedNotifications = notificationListProtoCaptor.value.notifications
-            assertThat(loggedNotifications.size).isEqualTo(2)
-            with(loggedNotifications[0]) {
-                assertThat(uid).isEqualTo(0)
-                assertThat(packageName).isEqualTo("com.android.first")
-            }
-            with(loggedNotifications[1]) {
-                assertThat(uid).isEqualTo(1)
-                assertThat(packageName).isEqualTo("com.android.second")
-            }
-        }
-
-    @Test
-    fun onNotificationExpansionChanged_whenExpandedInVisibleLocation_logsExpansion() =
-        testScope.runTest {
-            // WHEN a Notification is expanded
-            underTest.onNotificationExpansionChanged(
-                key = "key",
-                isExpanded = true,
-                location = ExpandableViewState.LOCATION_MAIN_AREA,
-                isUserAction = true
-            )
-            runCurrent()
-
-            // THEN the Expand event is reported
-            verify(mockStatusBarService)
-                .onNotificationExpansionChanged(
-                    /* key = */ "key",
-                    /* userAction = */ true,
-                    /* expanded = */ true,
-                    NotificationVisibility.NotificationLocation.LOCATION_MAIN_AREA.ordinal
-                )
-        }
-
-    @Test
-    fun onNotificationExpansionChanged_whenCalledTwiceWithTheSameUpdate_doesNotDuplicateLogs() =
-        testScope.runTest {
-            // GIVEN a Notification is expanded
-            underTest.onNotificationExpansionChanged(
-                key = "key",
-                isExpanded = true,
-                location = ExpandableViewState.LOCATION_MAIN_AREA,
-                isUserAction = true
-            )
-            runCurrent()
-            clearInvocations(mockStatusBarService)
-
-            // WHEN the logger receives the same expansion update
-            underTest.onNotificationExpansionChanged(
-                key = "key",
-                isExpanded = true,
-                location = ExpandableViewState.LOCATION_MAIN_AREA,
-                isUserAction = true
-            )
-            runCurrent()
-
-            // THEN the Expand event is not reported again
-            verifyZeroInteractions(mockStatusBarService)
-        }
-
-    @Test
-    fun onNotificationExpansionChanged_whenCalledForNotVisibleItem_nothingLogged() =
-        testScope.runTest {
-            // WHEN a NOT visible Notification is expanded
-            underTest.onNotificationExpansionChanged(
-                key = "key",
-                isExpanded = true,
-                location = ExpandableViewState.LOCATION_BOTTOM_STACK_HIDDEN,
-                isUserAction = true
-            )
-            runCurrent()
-
-            // No events are reported
-            verifyZeroInteractions(mockStatusBarService)
-        }
-
-    @Test
-    fun onNotificationExpansionChanged_whenNotVisibleItemBecomesVisible_logsChanges() =
-        testScope.runTest {
-            // WHEN a NOT visible Notification is expanded
-            underTest.onNotificationExpansionChanged(
-                key = "key",
-                isExpanded = true,
-                location = ExpandableViewState.LOCATION_GONE,
-                isUserAction = false
-            )
-            runCurrent()
-
-            // AND it becomes visible
-            val (ranks, locations) = fakeNotificationMaps("key")
-            val callable = Callable { locations }
-            underTest.onNotificationLocationsChanged(callable, ranks)
-            runCurrent()
-
-            // THEN the Expand event is reported
-            verify(mockStatusBarService)
-                .onNotificationExpansionChanged(
-                    /* key = */ "key",
-                    /* userAction = */ false,
-                    /* expanded = */ true,
-                    NotificationVisibility.NotificationLocation.LOCATION_MAIN_AREA.ordinal
-                )
-        }
-
-    @Test
-    fun onNotificationExpansionChanged_whenUpdatedItemBecomesVisible_logsChanges() =
-        testScope.runTest {
-            // GIVEN a NOT visible Notification is expanded
-            underTest.onNotificationExpansionChanged(
-                key = "key",
-                isExpanded = true,
-                location = ExpandableViewState.LOCATION_GONE,
-                isUserAction = false
-            )
-            runCurrent()
-            // AND we open the shade, so we log its events
-            val (ranks, locations) = fakeNotificationMaps("key")
-            val callable = Callable { locations }
-            underTest.onNotificationLocationsChanged(callable, ranks)
-            runCurrent()
-            // AND we close the shade, so it is NOT visible
-            val emptyCallable = Callable { emptyMap<String, Int>() }
-            underTest.onNotificationLocationsChanged(emptyCallable, ranks)
-            runCurrent()
-            clearInvocations(mockStatusBarService) // clear the previous expand log
-
-            // WHEN it receives an update
-            underTest.onNotificationUpdated("key")
-            // AND it becomes visible again
-            underTest.onNotificationLocationsChanged(callable, ranks)
-            runCurrent()
-
-            // THEN we log its expand event again
-            verify(mockStatusBarService)
-                .onNotificationExpansionChanged(
-                    /* key = */ "key",
-                    /* userAction = */ false,
-                    /* expanded = */ true,
-                    NotificationVisibility.NotificationLocation.LOCATION_MAIN_AREA.ordinal
-                )
-        }
-
-    @Test
-    fun onNotificationExpansionChanged_whenCollapsedForTheFirstTime_nothingLogged() =
-        testScope.runTest {
-            // WHEN a Notification is collapsed, and it is the first interaction
-            underTest.onNotificationExpansionChanged(
-                key = "key",
-                isExpanded = false,
-                location = ExpandableViewState.LOCATION_MAIN_AREA,
-                isUserAction = false
-            )
-            runCurrent()
-
-            // THEN no events are reported, because we consider the Notification initially
-            // collapsed, so only expanded is logged in the first time.
-            verifyZeroInteractions(mockStatusBarService)
-        }
-
-    @Test
-    fun onNotificationExpansionChanged_receivesMultipleUpdates_logsChanges() =
-        testScope.runTest {
-            // GIVEN a Notification is expanded
-            underTest.onNotificationExpansionChanged(
-                key = "key",
-                isExpanded = true,
-                location = ExpandableViewState.LOCATION_MAIN_AREA,
-                isUserAction = true
-            )
-            runCurrent()
-
-            // WHEN the Notification is collapsed
-            verify(mockStatusBarService)
-                .onNotificationExpansionChanged(
-                    /* key = */ "key",
-                    /* userAction = */ true,
-                    /* expanded = */ true,
-                    NotificationVisibility.NotificationLocation.LOCATION_MAIN_AREA.ordinal
-                )
-
-            // AND the Notification is expanded again
-            underTest.onNotificationExpansionChanged(
-                key = "key",
-                isExpanded = false,
-                location = ExpandableViewState.LOCATION_MAIN_AREA,
-                isUserAction = true
-            )
-            runCurrent()
-
-            // THEN the expansion changes are logged
-            verify(mockStatusBarService)
-                .onNotificationExpansionChanged(
-                    /* key = */ "key",
-                    /* userAction = */ true,
-                    /* expanded = */ false,
-                    NotificationVisibility.NotificationLocation.LOCATION_MAIN_AREA.ordinal
-                )
-        }
-
-    @Test
-    fun onNotificationUpdated_clearsTrackedExpansionChanges() =
-        testScope.runTest {
-            // GIVEN some notification updates are posted
-            underTest.onNotificationExpansionChanged(
-                key = "key1",
-                isExpanded = true,
-                location = ExpandableViewState.LOCATION_MAIN_AREA,
-                isUserAction = true
-            )
-            runCurrent()
-            underTest.onNotificationExpansionChanged(
-                key = "key2",
-                isExpanded = true,
-                location = ExpandableViewState.LOCATION_MAIN_AREA,
-                isUserAction = true
-            )
-            runCurrent()
-            clearInvocations(mockStatusBarService)
-
-            // WHEN a Notification is updated
-            underTest.onNotificationUpdated("key1")
-
-            // THEN the tracked expansion changes are updated
-            assertThat(underTest.lastReportedExpansionValues.keys).containsExactly("key2")
-        }
-
-    @Test
-    fun onNotificationRemoved_clearsTrackedExpansionChanges() =
-        testScope.runTest {
-            // GIVEN some notification updates are posted
-            underTest.onNotificationExpansionChanged(
-                key = "key1",
-                isExpanded = true,
-                location = ExpandableViewState.LOCATION_MAIN_AREA,
-                isUserAction = true
-            )
-            runCurrent()
-            underTest.onNotificationExpansionChanged(
-                key = "key2",
-                isExpanded = true,
-                location = ExpandableViewState.LOCATION_MAIN_AREA,
-                isUserAction = true
-            )
-            runCurrent()
-            clearInvocations(mockStatusBarService)
-
-            // WHEN a Notification is removed
-            underTest.onNotificationRemoved("key1")
-
-            // THEN it is removed from the tracked expansion changes
-            assertThat(underTest.lastReportedExpansionValues.keys).doesNotContain("key1")
-        }
-
-    private fun fakeNotificationMaps(
-        vararg keys: String
-    ): Pair<Map<String, Int>, Map<String, Int>> {
-        val ranks: Map<String, Int> = keys.mapIndexed { index, key -> key to index }.toMap()
-        val locations: Map<String, Int> =
-            keys.associateWith { ExpandableViewState.LOCATION_MAIN_AREA }
-
-        return Pair(ranks, locations)
-    }
-
-    private fun assertThat(visibility: NotificationVisibility) =
-        NotificationVisibilitySubject(visibility)
-}
-
-private class NotificationVisibilitySubject(private val visibility: NotificationVisibility) {
-    fun isKeyEqualTo(key: String) = assertThat(visibility.key).isEqualTo(key)
-    fun isRankEqualTo(rank: Int) = assertThat(visibility.rank).isEqualTo(rank)
-    fun isCountEqualTo(count: Int) = assertThat(visibility.count).isEqualTo(count)
-    fun isVisible() = assertThat(this.visibility.visible).isTrue()
-    fun notVisible() = assertThat(this.visibility.visible).isFalse()
-    fun isInMainArea() =
-        assertThat(this.visibility.location)
-            .isEqualTo(NotificationVisibility.NotificationLocation.LOCATION_MAIN_AREA)
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
index c710c56..15ea811 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
@@ -169,6 +169,7 @@
 import com.android.systemui.statusbar.StatusBarState;
 import com.android.systemui.statusbar.StatusBarStateControllerImpl;
 import com.android.systemui.statusbar.core.StatusBarInitializerImpl;
+import com.android.systemui.statusbar.core.StatusBarOrchestrator;
 import com.android.systemui.statusbar.data.repository.FakeStatusBarModeRepository;
 import com.android.systemui.statusbar.notification.NotifPipelineFlags;
 import com.android.systemui.statusbar.notification.NotificationActivityStarter;
@@ -346,6 +347,7 @@
     @Mock private EmergencyGestureIntentFactory mEmergencyGestureIntentFactory;
     @Mock private NotificationSettingsInteractor mNotificationSettingsInteractor;
     @Mock private ViewCaptureAwareWindowManager mViewCaptureAwareWindowManager;
+    @Mock private StatusBarOrchestrator mStatusBarOrchestrator;
     private ShadeController mShadeController;
     private final FakeSystemClock mFakeSystemClock = new FakeSystemClock();
     private final FakeGlobalSettings mFakeGlobalSettings = new FakeGlobalSettings();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt
index 2ed3473..8360042 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt
@@ -160,11 +160,11 @@
         testableLooper = TestableLooper.get(this)
         context.orCreateTestableResources.addOverride(
             com.android.internal.R.string.status_bar_alarm_clock,
-            ALARM_SLOT
+            ALARM_SLOT,
         )
         context.orCreateTestableResources.addOverride(
             com.android.internal.R.string.status_bar_managed_profile,
-            MANAGED_PROFILE_SLOT
+            MANAGED_PROFILE_SLOT,
         )
         whenever(devicePolicyManager.resources).thenReturn(devicePolicyManagerResources)
         whenever(devicePolicyManagerResources.getString(anyString(), any())).thenReturn("")
@@ -430,8 +430,8 @@
                     eq(mContext.packageName),
                     eq(android.R.drawable.ic_lock_lock),
                     any(), // non-null
-                    eq("Bedtime Mode"),
-                    eq(StatusBarIcon.Shape.FIXED_SPACE)
+                    eq("Bedtime Mode is on"),
+                    eq(StatusBarIcon.Shape.FIXED_SPACE),
                 )
 
             zenModeRepository.deactivateMode("bedtime")
@@ -443,8 +443,8 @@
                     eq(null),
                     eq(android.R.drawable.ic_media_play),
                     any(), // non-null
-                    eq("Other Mode"),
-                    eq(StatusBarIcon.Shape.FIXED_SPACE)
+                    eq("Other Mode is on"),
+                    eq(StatusBarIcon.Shape.FIXED_SPACE),
                 )
 
             zenModeRepository.deactivateMode("other")
@@ -538,7 +538,7 @@
             privacyLogger,
             fakeConnectedDisplayStateProvider,
             kosmos.zenModeInteractor,
-            JavaAdapter(testScope.backgroundScope)
+            JavaAdapter(testScope.backgroundScope),
         )
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index 73e3bf4..e804b33 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -40,7 +40,7 @@
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 import android.animation.Animator;
@@ -1229,7 +1229,7 @@
         reset(mScrimBehind);
         mScrimController.setExpansionAffectsAlpha(false);
         mScrimController.setRawPanelExpansionFraction(0.8f);
-        verifyZeroInteractions(mScrimBehind);
+        verifyNoMoreInteractions(mScrimBehind);
         assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha "
                 + "is false", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f);
 
@@ -1441,7 +1441,7 @@
     public void testDoesNotHoldWakeLock_whenUnlocking() {
         mScrimController.legacyTransitionTo(ScrimState.UNLOCKED);
         finishAnimationsImmediately();
-        verifyZeroInteractions(mWakeLock);
+        verifyNoMoreInteractions(mWakeLock);
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
index 7a34e94..cace60c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
@@ -35,7 +35,6 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
 import android.app.ActivityManager;
@@ -352,7 +351,7 @@
                 eq(entry.getKey()), any(NotificationVisibility.class));
 
         // The content intent should NOT be sent on click.
-        verifyZeroInteractions(mContentIntent);
+        verifyNoMoreInteractions(mContentIntent);
 
         // Notification should not be cancelled.
         verify(mOnUserInteractionCallback, never())
@@ -385,7 +384,7 @@
                 eq(entry.getKey()), any(NotificationVisibility.class));
 
         // The content intent should NOT be sent on click.
-        verifyZeroInteractions(mContentIntent);
+        verifyNoMoreInteractions(mContentIntent);
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java
index c523819..81c40dc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java
@@ -36,7 +36,9 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor;
 import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.scene.domain.interactor.SceneInteractor;
 import com.android.systemui.settings.FakeDisplayTracker;
 import com.android.systemui.shade.ShadeController;
 import com.android.systemui.statusbar.ActionClickLogger;
@@ -50,8 +52,11 @@
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.util.concurrency.FakeExecutor;
+import com.android.systemui.util.kotlin.JavaAdapter;
 import com.android.systemui.util.time.FakeSystemClock;
 
+import dagger.Lazy;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -71,8 +76,14 @@
     @Mock private SysuiStatusBarStateController mStatusBarStateController;
     @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
     @Mock private ActivityStarter mActivityStarter;
+    @Mock private Lazy<DeviceUnlockedInteractor> mDeviceUnlockedInteractorLazy;
+    @Mock private Lazy<SceneInteractor> mSceneInteractorLazy;
+    @Mock private JavaAdapter mJavaAdapter;
     private final FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
 
+    @Mock private DeviceUnlockedInteractor mDeviceUnlockedInteractor;
+    @Mock private SceneInteractor mSceneInteractor;
+
     private int mCurrentUserId = 0;
     private StatusBarRemoteInputCallback mRemoteInputCallback;
 
@@ -90,7 +101,8 @@
                 mKeyguardStateController, mStatusBarStateController, mStatusBarKeyguardViewManager,
                 mActivityStarter, mShadeController,
                 new CommandQueue(mContext, new FakeDisplayTracker(mContext)),
-                mock(ActionClickLogger.class), mFakeExecutor));
+                mock(ActionClickLogger.class), mFakeExecutor, mDeviceUnlockedInteractorLazy,
+                mSceneInteractorLazy, mJavaAdapter));
         mRemoteInputCallback.mChallengeReceiver = mRemoteInputCallback.new ChallengeReceiver();
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java
index 63a560f..e57e8d1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java
@@ -66,7 +66,6 @@
 import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerStatusBarViewBinder;
 import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
 import com.android.systemui.statusbar.phone.StatusBarHideIconsForBouncerManager;
-import com.android.systemui.statusbar.phone.StatusBarLocationPublisher;
 import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent;
 import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
 import com.android.systemui.statusbar.phone.ui.DarkIconManager;
@@ -98,7 +97,6 @@
     private ShadeExpansionStateManager mShadeExpansionStateManager;
     private OngoingCallController mOngoingCallController;
     private SystemStatusAnimationScheduler mAnimationScheduler;
-    private StatusBarLocationPublisher mLocationPublisher;
     // Set in instantiate()
     private StatusBarIconController mStatusBarIconController;
     private KeyguardStateController mKeyguardStateController;
@@ -1181,7 +1179,6 @@
         setUpDaggerComponent();
         mOngoingCallController = mock(OngoingCallController.class);
         mAnimationScheduler = mock(SystemStatusAnimationScheduler.class);
-        mLocationPublisher = mock(StatusBarLocationPublisher.class);
         mStatusBarIconController = mock(StatusBarIconController.class);
         mStatusBarStateController = mock(StatusBarStateController.class);
         mKeyguardStateController = mock(KeyguardStateController.class);
@@ -1200,7 +1197,6 @@
                 mStatusBarFragmentComponentFactory,
                 mOngoingCallController,
                 mAnimationScheduler,
-                mLocationPublisher,
                 mShadeExpansionStateManager,
                 mStatusBarIconController,
                 mIconManagerFactory,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt
index af4f647..4d293b9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt
@@ -621,7 +621,7 @@
             val signalStrength by collectLastValue(underTest.signalStrength)
 
             // THEN we have not yet talked to satellite manager, since we are well before MIN_UPTIME
-            Mockito.verifyZeroInteractions(satelliteManager)
+            Mockito.verifyNoMoreInteractions(satelliteManager)
 
             // WHEN enough time has passed
             systemClock.advanceTime(MIN_UPTIME)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerStartableTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerStartableTest.java
index c4a7463..aca2636 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerStartableTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerStartableTest.java
@@ -21,7 +21,7 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 
 import android.os.Handler;
 import android.os.Looper;
@@ -108,6 +108,6 @@
         mBatteryControllerStartable.start();
         mExecutor.runAllReady();
 
-        verifyZeroInteractions(mBroadcastDispatcher);
+        verifyNoMoreInteractions(mBroadcastDispatcher);
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/FlashlightControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/FlashlightControllerImplTest.kt
index 80cc6ec..902caf3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/FlashlightControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/FlashlightControllerImplTest.kt
@@ -41,7 +41,6 @@
 import org.mockito.Mockito.never
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.verifyNoMoreInteractions
-import org.mockito.Mockito.verifyZeroInteractions
 import org.mockito.Mockito.`when`
 import org.mockito.MockitoAnnotations
 
@@ -89,7 +88,7 @@
 
     @Test
     fun testNoCameraManagerInteractionDirectlyOnConstructor() {
-        verifyZeroInteractions(cameraManager)
+        verifyNoMoreInteractions(cameraManager)
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RotationLockControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RotationLockControllerImplTest.java
index ea620a6..3f33d2f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RotationLockControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RotationLockControllerImplTest.java
@@ -19,7 +19,7 @@
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
@@ -61,7 +61,7 @@
     public void whenFlagOff_doesntInteractWithDeviceStateRotationController() {
         createRotationLockController(new String[0]);
 
-        verifyZeroInteractions(mDeviceStateRotationLockSettingController);
+        verifyNoMoreInteractions(mDeviceStateRotationLockSettingController);
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerFlagDisabledTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerFlagDisabledTest.kt
deleted file mode 100644
index 81f0950..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerFlagDisabledTest.kt
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.policy
-
-import android.app.IActivityManager
-import android.content.pm.PackageManager
-import android.media.projection.MediaProjectionManager
-import android.os.Handler
-import android.platform.test.annotations.DisableFlags
-import android.telephony.TelephonyManager
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.server.notification.Flags
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.log.logcatLogBuffer
-import com.android.systemui.util.concurrency.FakeExecutor
-import com.android.systemui.util.settings.FakeGlobalSettings
-import com.android.systemui.util.time.FakeSystemClock
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.Mockito.verifyZeroInteractions
-import org.mockito.MockitoAnnotations
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-@DisableFlags(Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING)
-class SensitiveNotificationProtectionControllerFlagDisabledTest : SysuiTestCase() {
-    private val logger = SensitiveNotificationProtectionControllerLogger(logcatLogBuffer())
-
-    @Mock private lateinit var handler: Handler
-    @Mock private lateinit var activityManager: IActivityManager
-    @Mock private lateinit var mediaProjectionManager: MediaProjectionManager
-    @Mock private lateinit var packageManager: PackageManager
-    @Mock private lateinit var telephonyManager: TelephonyManager
-    private lateinit var controller: SensitiveNotificationProtectionControllerImpl
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-
-        controller =
-            SensitiveNotificationProtectionControllerImpl(
-                mContext,
-                FakeGlobalSettings(),
-                mediaProjectionManager,
-                activityManager,
-                packageManager,
-                telephonyManager,
-                handler,
-                FakeExecutor(FakeSystemClock()),
-                logger
-            )
-    }
-
-    @Test
-    fun init_noRegisterMediaProjectionManagerCallback() {
-        verifyZeroInteractions(mediaProjectionManager)
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerTest.kt
index 2127057..5739275 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerTest.kt
@@ -73,7 +73,6 @@
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.times
 import org.mockito.Mockito.verifyNoMoreInteractions
-import org.mockito.Mockito.verifyZeroInteractions
 import org.mockito.MockitoAnnotations
 import org.mockito.MockitoSession
 import org.mockito.quality.Strictness
@@ -207,7 +206,7 @@
         mediaProjectionCallback.onStart(mediaProjectionInfo)
 
         controller.registerSensitiveStateListener(listener1)
-        verifyZeroInteractions(listener1)
+        verifyNoMoreInteractions(listener1)
 
         mediaProjectionCallback.onStop(mediaProjectionInfo)
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
deleted file mode 100644
index 637a0f1..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2017 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.systemui.statusbar.policy;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.NotificationManager;
-import android.os.Handler;
-import android.provider.Settings;
-import android.service.notification.ZenModeConfig;
-import android.testing.TestableLooper;
-import android.testing.TestableLooper.RunWithLooper;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.dump.DumpManager;
-import com.android.systemui.settings.UserTracker;
-import com.android.systemui.statusbar.policy.ZenModeController.Callback;
-import com.android.systemui.util.settings.FakeGlobalSettings;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-@RunWithLooper
-public class ZenModeControllerImplTest extends SysuiTestCase {
-
-    private Callback mCallback;
-    @Mock
-    NotificationManager mNm;
-    @Mock
-    ZenModeConfig mConfig;
-    @Mock
-    BroadcastDispatcher mBroadcastDispatcher;
-    @Mock
-    DumpManager mDumpManager;
-    @Mock
-    UserTracker mUserTracker;
-    private ZenModeControllerImpl mController;
-
-    private final FakeGlobalSettings mGlobalSettings = new FakeGlobalSettings();
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mContext.addMockSystemService(NotificationManager.class, mNm);
-        when(mNm.getZenModeConfig()).thenReturn(mConfig);
-
-        mController = new ZenModeControllerImpl(
-                mContext,
-                Handler.createAsync(TestableLooper.get(this).getLooper()),
-                Handler.createAsync(TestableLooper.get(this).getLooper()),
-                mBroadcastDispatcher,
-                mDumpManager,
-                mGlobalSettings,
-                mUserTracker);
-    }
-
-    @Test
-    public void testRemoveDuringCallback() {
-        mCallback = new Callback() {
-            @Override
-            public void onConfigChanged(ZenModeConfig config) {
-                mController.removeCallback(mCallback);
-            }
-        };
-        mController.addCallback(mCallback);
-        Callback mockCallback = mock(Callback.class);
-        mController.addCallback(mockCallback);
-        mController.fireConfigChanged(null);
-        verify(mockCallback).onConfigChanged(eq(null));
-    }
-
-    @Test
-    public void testAreNotificationsHiddenInShade_zenOffShadeSuppressed() {
-        mConfig.suppressedVisualEffects =
-                NotificationManager.Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST;
-        mController.updateZenMode(Settings.Global.ZEN_MODE_OFF);
-        mController.updateZenModeConfig();
-
-        assertFalse(mController.areNotificationsHiddenInShade());
-    }
-
-    @Test
-    public void testAreNotificationsHiddenInShade_zenOnShadeNotSuppressed() {
-        NotificationManager.Policy policy = new NotificationManager.Policy(0, 0, 0,
-                NotificationManager.Policy.SUPPRESSED_EFFECT_STATUS_BAR);
-        when(mNm.getConsolidatedNotificationPolicy()).thenReturn(policy);
-        mController.updateConsolidatedNotificationPolicy();
-        mController.updateZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
-
-        assertFalse(mController.areNotificationsHiddenInShade());
-    }
-
-    @Test
-    public void testAreNotificationsHiddenInShade_zenOnShadeSuppressed() {
-        NotificationManager.Policy policy = new NotificationManager.Policy(0, 0, 0,
-                NotificationManager.Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST);
-        when(mNm.getConsolidatedNotificationPolicy()).thenReturn(policy);
-        mController.updateConsolidatedNotificationPolicy();
-        mController.updateZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
-
-        assertTrue(mController.areNotificationsHiddenInShade());
-    }
-
-    @Test
-    public void testModeChange() {
-        List<Integer> states = List.of(
-                Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
-                Settings.Global.ZEN_MODE_NO_INTERRUPTIONS,
-                Settings.Global.ZEN_MODE_ALARMS,
-                Settings.Global.ZEN_MODE_ALARMS
-        );
-
-        for (Integer state : states) {
-            mGlobalSettings.putInt(Settings.Global.ZEN_MODE, state);
-            TestableLooper.get(this).processAllMessages();
-            assertEquals(state.intValue(), mController.getZen());
-        }
-    }
-
-    @Test
-    public void testModeChange_callbackNotified() {
-        final AtomicInteger currentState = new AtomicInteger(-1);
-
-        ZenModeController.Callback callback = new Callback() {
-            @Override
-            public void onZenChanged(int zen) {
-                currentState.set(zen);
-            }
-        };
-
-        mController.addCallback(callback);
-
-        List<Integer> states = List.of(
-                Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
-                Settings.Global.ZEN_MODE_NO_INTERRUPTIONS,
-                Settings.Global.ZEN_MODE_ALARMS,
-                Settings.Global.ZEN_MODE_ALARMS
-        );
-
-        for (Integer state : states) {
-            mGlobalSettings.putInt(Settings.Global.ZEN_MODE, state);
-            TestableLooper.get(this).processAllMessages();
-            assertEquals(state.intValue(), currentState.get());
-        }
-
-    }
-
-    @Test
-    public void testCallbackRemovedWhileDispatching_doesntCrash() {
-        final AtomicBoolean remove = new AtomicBoolean(false);
-        mGlobalSettings.putInt(Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_OFF);
-        TestableLooper.get(this).processAllMessages();
-        final ZenModeController.Callback callback = new ZenModeController.Callback() {
-            @Override
-            public void onZenChanged(int zen) {
-                if (remove.get()) {
-                    mController.removeCallback(this);
-                }
-            }
-        };
-        mController.addCallback(callback);
-        mController.addCallback(new ZenModeController.Callback() {});
-
-        remove.set(true);
-
-        mGlobalSettings.putInt(Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_NO_INTERRUPTIONS);
-        TestableLooper.get(this).processAllMessages();
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt
index e396b56..0598b87 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt
@@ -133,7 +133,10 @@
 
             // WHEN HUN displayed on the bypass lock screen
             headsUpRepository.setNotifications(FakeHeadsUpRowRepository("key 0", isPinned = true))
-            keyguardTransitionRepository.emitInitialStepsFromOff(KeyguardState.LOCKSCREEN)
+            keyguardTransitionRepository.emitInitialStepsFromOff(
+                KeyguardState.LOCKSCREEN,
+                testSetup = true,
+            )
             kosmos.sceneContainerRepository.snapToScene(Scenes.Lockscreen)
             faceAuthRepository.isBypassEnabled.value = true
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusManagerTest.kt
index 0b3dd66..516541d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusManagerTest.kt
@@ -46,7 +46,6 @@
 import org.mockito.Mockito.clearInvocations
 import org.mockito.Mockito.inOrder
 import org.mockito.Mockito.verifyNoMoreInteractions
-import org.mockito.Mockito.verifyZeroInteractions
 import org.mockito.MockitoAnnotations
 import org.mockito.quality.Strictness
 
@@ -175,7 +174,7 @@
     fun startListener_hasStarted_doesNothing() {
         stylusManager.startListener()
 
-        verifyZeroInteractions(inputManager)
+        verifyNoMoreInteractions(inputManager)
     }
 
     @Test
@@ -193,7 +192,7 @@
 
         stylusManager.onInputDeviceAdded(STYLUS_DEVICE_ID)
 
-        verifyZeroInteractions(stylusCallback)
+        verifyNoMoreInteractions(stylusCallback)
     }
 
     @Test
@@ -282,7 +281,7 @@
 
         stylusManager.onInputDeviceChanged(STYLUS_DEVICE_ID)
 
-        verifyZeroInteractions(stylusCallback)
+        verifyNoMoreInteractions(stylusCallback)
     }
 
     @Test
@@ -356,7 +355,7 @@
 
         stylusManager.onInputDeviceRemoved(STYLUS_DEVICE_ID)
 
-        verifyZeroInteractions(stylusCallback)
+        verifyNoMoreInteractions(stylusCallback)
     }
 
     @Test
@@ -565,7 +564,7 @@
 
         stylusManager.onBatteryStateChanged(STYLUS_DEVICE_ID, 1, batteryState)
 
-        verifyZeroInteractions(uiEventLogger)
+        verifyNoMoreInteractions(uiEventLogger)
     }
 
     @Test
@@ -574,7 +573,7 @@
 
         stylusManager.onBatteryStateChanged(STYLUS_DEVICE_ID, 1, batteryState)
 
-        verifyZeroInteractions(uiEventLogger)
+        verifyNoMoreInteractions(uiEventLogger)
     }
 
     @Test
@@ -630,7 +629,7 @@
     fun onBatteryStateChanged_hasNotStarted_doesNothing() {
         stylusManager.onBatteryStateChanged(STYLUS_DEVICE_ID, 1, batteryState)
 
-        verifyZeroInteractions(inputManager)
+        verifyNoMoreInteractions(inputManager)
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusUsiPowerStartableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusUsiPowerStartableTest.kt
index a5e52a4..9592b28 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusUsiPowerStartableTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/stylus/StylusUsiPowerStartableTest.kt
@@ -33,7 +33,6 @@
 import org.mockito.Mockito.times
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.verifyNoMoreInteractions
-import org.mockito.Mockito.verifyZeroInteractions
 import org.mockito.MockitoAnnotations
 
 @RunWith(AndroidTestingRunner::class)
@@ -81,7 +80,7 @@
 
         startable.start()
 
-        verifyZeroInteractions(stylusManager)
+        verifyNoMoreInteractions(stylusManager)
     }
 
     @Test
@@ -109,7 +108,7 @@
     fun onStylusAdded_external_noop() {
         startable.onStylusAdded(EXTERNAL_DEVICE_ID)
 
-        verifyZeroInteractions(stylusUsiPowerUi)
+        verifyNoMoreInteractions(stylusUsiPowerUi)
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java b/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java
index 666bdd6..a3d2695 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java
@@ -30,7 +30,7 @@
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 import android.app.Application;
@@ -437,7 +437,7 @@
 
         verify(mToastLogger).logOnSkipToastForInvalidDisplay(PACKAGE_NAME_1, TOKEN_1.toString(),
                 invalidDisplayId);
-        verifyZeroInteractions(mWindowManager);
+        verifyNoMoreInteractions(mWindowManager);
     }
 
     private View verifyWmAddViewAndAttachToParent() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java
index f62beeb..beba0f0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java
@@ -133,10 +133,6 @@
         when(mRingerModeInternalLiveData.getValue()).thenReturn(-1);
         when(mUserTracker.getUserId()).thenReturn(ActivityManager.getCurrentUser());
         when(mUserTracker.getUserContext()).thenReturn(mContext);
-        // Enable group volume adjustments
-        mContext.getOrCreateTestableResources().addOverride(
-                com.android.internal.R.bool.config_volumeAdjustmentForRemoteGroupSessions,
-                true);
 
         mCallback = mock(VolumeDialogControllerImpl.C.class);
         mThreadFactory.setLooper(TestableLooper.get(this).getLooper());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
index 0d39834..9cfb0bb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -53,7 +53,7 @@
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 import android.app.ActivityManager;
@@ -2362,7 +2362,7 @@
     @DisableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING)
     @Test
     public void doesNotRegisterSensitiveStateListener() {
-        verifyZeroInteractions(mSensitiveNotificationProtectionController);
+        verifyNoMoreInteractions(mSensitiveNotificationProtectionController);
     }
 
     @EnableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/wmshell/BubblesTestActivity.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTestActivity.java
similarity index 100%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/wmshell/BubblesTestActivity.java
rename to packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTestActivity.java
diff --git a/packages/SystemUI/tests/utils/src/android/internal/statusbar/FakeStatusBarService.kt b/packages/SystemUI/tests/utils/src/android/internal/statusbar/FakeStatusBarService.kt
new file mode 100644
index 0000000..cc0597b
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/android/internal/statusbar/FakeStatusBarService.kt
@@ -0,0 +1,355 @@
+/*
+ * Copyright (C) 2024 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 android.internal.statusbar
+
+import android.app.Notification
+import android.content.ComponentName
+import android.graphics.Rect
+import android.graphics.drawable.Icon
+import android.hardware.biometrics.IBiometricContextListener
+import android.hardware.biometrics.IBiometricSysuiReceiver
+import android.hardware.biometrics.PromptInfo
+import android.hardware.fingerprint.IUdfpsRefreshRateRequestCallback
+import android.media.INearbyMediaDevicesProvider
+import android.media.MediaRoute2Info
+import android.net.Uri
+import android.os.Bundle
+import android.os.IBinder
+import android.os.UserHandle
+import android.util.ArrayMap
+import android.view.KeyEvent
+import com.android.internal.logging.InstanceId
+import com.android.internal.statusbar.IAddTileResultCallback
+import com.android.internal.statusbar.ISessionListener
+import com.android.internal.statusbar.IStatusBar
+import com.android.internal.statusbar.IStatusBarService
+import com.android.internal.statusbar.IUndoMediaTransferCallback
+import com.android.internal.statusbar.LetterboxDetails
+import com.android.internal.statusbar.NotificationVisibility
+import com.android.internal.statusbar.RegisterStatusBarResult
+import com.android.internal.statusbar.StatusBarIcon
+import com.android.internal.view.AppearanceRegion
+import org.mockito.kotlin.mock
+
+class FakeStatusBarService : IStatusBarService.Stub() {
+
+    var registeredStatusBar: IStatusBar? = null
+        private set
+
+    var statusBarIcons =
+        ArrayMap<String, StatusBarIcon>().also {
+            it["slot1"] = mock<StatusBarIcon>()
+            it["slot2"] = mock<StatusBarIcon>()
+        }
+    var disabledFlags1 = 1234567
+    var appearance = 123
+    var appearanceRegions =
+        arrayOf(
+            AppearanceRegion(
+                /* appearance = */ 123,
+                /* bounds = */ Rect(/* left= */ 4, /* top= */ 3, /* right= */ 2, /* bottom= */ 1),
+            ),
+            AppearanceRegion(
+                /* appearance = */ 345,
+                /* bounds = */ Rect(/* left= */ 1, /* top= */ 2, /* right= */ 3, /* bottom= */ 4),
+            ),
+        )
+    var imeWindowVis = 987
+    var imeBackDisposition = 654
+    var showImeSwitcher = true
+    var disabledFlags2 = 7654321
+    var navbarColorManagedByIme = true
+    var behavior = 234
+    var requestedVisibleTypes = 345
+    var packageName = "fake.bar.ser.vice"
+    var transientBarTypes = 0
+    var letterboxDetails =
+        arrayOf(
+            LetterboxDetails(
+                /* letterboxInnerBounds = */ Rect(
+                    /* left= */ 5,
+                    /* top= */ 6,
+                    /* right= */ 7,
+                    /* bottom= */ 8,
+                ),
+                /* letterboxFullBounds = */ Rect(
+                    /* left= */ 1,
+                    /* top= */ 2,
+                    /* right= */ 3,
+                    /* bottom= */ 4,
+                ),
+                /* appAppearance = */ 123,
+            )
+        )
+
+    override fun expandNotificationsPanel() {}
+
+    override fun collapsePanels() {}
+
+    override fun togglePanel() {}
+
+    override fun disable(what: Int, token: IBinder, pkg: String) {
+        disableForUser(what, token, pkg, userId = 0)
+    }
+
+    override fun disableForUser(what: Int, token: IBinder, pkg: String, userId: Int) {}
+
+    override fun disable2(what: Int, token: IBinder, pkg: String) {
+        disable2ForUser(what, token, pkg, userId = 0)
+    }
+
+    override fun disable2ForUser(what: Int, token: IBinder, pkg: String, userId: Int) {}
+
+    override fun getDisableFlags(token: IBinder, userId: Int): IntArray {
+        return intArrayOf(disabledFlags1, disabledFlags2)
+    }
+
+    override fun setIcon(
+        slot: String,
+        iconPackage: String,
+        iconId: Int,
+        iconLevel: Int,
+        contentDescription: String,
+    ) {}
+
+    override fun setIconVisibility(slot: String, visible: Boolean) {}
+
+    override fun removeIcon(slot: String) {}
+
+    override fun setImeWindowStatus(
+        displayId: Int,
+        vis: Int,
+        backDisposition: Int,
+        showImeSwitcher: Boolean,
+    ) {}
+
+    override fun expandSettingsPanel(subPanel: String) {}
+
+    override fun registerStatusBar(callbacks: IStatusBar): RegisterStatusBarResult {
+        registeredStatusBar = callbacks
+        return RegisterStatusBarResult(
+            statusBarIcons,
+            disabledFlags1,
+            appearance,
+            appearanceRegions,
+            imeWindowVis,
+            imeBackDisposition,
+            showImeSwitcher,
+            disabledFlags2,
+            navbarColorManagedByIme,
+            behavior,
+            requestedVisibleTypes,
+            packageName,
+            transientBarTypes,
+            letterboxDetails,
+        )
+    }
+
+    override fun onPanelRevealed(clearNotificationEffects: Boolean, numItems: Int) {}
+
+    override fun onPanelHidden() {}
+
+    override fun clearNotificationEffects() {}
+
+    override fun onNotificationClick(key: String, nv: NotificationVisibility) {}
+
+    override fun onNotificationActionClick(
+        key: String,
+        actionIndex: Int,
+        action: Notification.Action,
+        nv: NotificationVisibility,
+        generatedByAssistant: Boolean,
+    ) {}
+
+    override fun onNotificationError(
+        pkg: String,
+        tag: String,
+        id: Int,
+        uid: Int,
+        initialPid: Int,
+        message: String,
+        userId: Int,
+    ) {}
+
+    override fun onClearAllNotifications(userId: Int) {}
+
+    override fun onNotificationClear(
+        pkg: String,
+        userId: Int,
+        key: String,
+        dismissalSurface: Int,
+        dismissalSentiment: Int,
+        nv: NotificationVisibility,
+    ) {}
+
+    override fun onNotificationVisibilityChanged(
+        newlyVisibleKeys: Array<NotificationVisibility>,
+        noLongerVisibleKeys: Array<NotificationVisibility>,
+    ) {}
+
+    override fun onNotificationExpansionChanged(
+        key: String,
+        userAction: Boolean,
+        expanded: Boolean,
+        notificationLocation: Int,
+    ) {}
+
+    override fun onNotificationDirectReplied(key: String) {}
+
+    override fun onNotificationSmartSuggestionsAdded(
+        key: String,
+        smartReplyCount: Int,
+        smartActionCount: Int,
+        generatedByAssistant: Boolean,
+        editBeforeSending: Boolean,
+    ) {}
+
+    override fun onNotificationSmartReplySent(
+        key: String,
+        replyIndex: Int,
+        reply: CharSequence,
+        notificationLocation: Int,
+        modifiedBeforeSending: Boolean,
+    ) {}
+
+    override fun onNotificationSettingsViewed(key: String) {}
+
+    override fun onNotificationBubbleChanged(key: String, isBubble: Boolean, flags: Int) {}
+
+    override fun onBubbleMetadataFlagChanged(key: String, flags: Int) {}
+
+    override fun hideCurrentInputMethodForBubbles(displayId: Int) {}
+
+    override fun grantInlineReplyUriPermission(
+        key: String,
+        uri: Uri,
+        user: UserHandle,
+        packageName: String,
+    ) {}
+
+    override fun clearInlineReplyUriPermissions(key: String) {}
+
+    override fun onNotificationFeedbackReceived(key: String, feedback: Bundle) {}
+
+    override fun onGlobalActionsShown() {}
+
+    override fun onGlobalActionsHidden() {}
+
+    override fun shutdown() {}
+
+    override fun reboot(safeMode: Boolean) {}
+
+    override fun restart() {}
+
+    override fun addTile(tile: ComponentName) {}
+
+    override fun remTile(tile: ComponentName) {}
+
+    override fun clickTile(tile: ComponentName) {}
+
+    override fun handleSystemKey(key: KeyEvent) {}
+
+    override fun getLastSystemKey(): Int {
+        return -1
+    }
+
+    override fun showPinningEnterExitToast(entering: Boolean) {}
+
+    override fun showPinningEscapeToast() {}
+
+    override fun showAuthenticationDialog(
+        promptInfo: PromptInfo,
+        sysuiReceiver: IBiometricSysuiReceiver,
+        sensorIds: IntArray,
+        credentialAllowed: Boolean,
+        requireConfirmation: Boolean,
+        userId: Int,
+        operationId: Long,
+        opPackageName: String,
+        requestId: Long,
+    ) {}
+
+    override fun onBiometricAuthenticated(modality: Int) {}
+
+    override fun onBiometricHelp(modality: Int, message: String) {}
+
+    override fun onBiometricError(modality: Int, error: Int, vendorCode: Int) {}
+
+    override fun hideAuthenticationDialog(requestId: Long) {}
+
+    override fun setBiometicContextListener(listener: IBiometricContextListener) {}
+
+    override fun setUdfpsRefreshRateCallback(callback: IUdfpsRefreshRateRequestCallback) {}
+
+    override fun showInattentiveSleepWarning() {}
+
+    override fun dismissInattentiveSleepWarning(animated: Boolean) {}
+
+    override fun startTracing() {}
+
+    override fun stopTracing() {}
+
+    override fun isTracing(): Boolean {
+        return false
+    }
+
+    override fun suppressAmbientDisplay(suppress: Boolean) {}
+
+    override fun requestTileServiceListeningState(componentName: ComponentName, userId: Int) {}
+
+    override fun requestAddTile(
+        componentName: ComponentName,
+        label: CharSequence,
+        icon: Icon,
+        userId: Int,
+        callback: IAddTileResultCallback,
+    ) {}
+
+    override fun cancelRequestAddTile(packageName: String) {}
+
+    override fun setNavBarMode(navBarMode: Int) {}
+
+    override fun getNavBarMode(): Int {
+        return -1
+    }
+
+    override fun registerSessionListener(sessionFlags: Int, listener: ISessionListener) {}
+
+    override fun unregisterSessionListener(sessionFlags: Int, listener: ISessionListener) {}
+
+    override fun onSessionStarted(sessionType: Int, instanceId: InstanceId) {}
+
+    override fun onSessionEnded(sessionType: Int, instanceId: InstanceId) {}
+
+    override fun updateMediaTapToTransferSenderDisplay(
+        displayState: Int,
+        routeInfo: MediaRoute2Info,
+        undoCallback: IUndoMediaTransferCallback,
+    ) {}
+
+    override fun updateMediaTapToTransferReceiverDisplay(
+        displayState: Int,
+        routeInfo: MediaRoute2Info,
+        appIcon: Icon,
+        appName: CharSequence,
+    ) {}
+
+    override fun registerNearbyMediaDevicesProvider(provider: INearbyMediaDevicesProvider) {}
+
+    override fun unregisterNearbyMediaDevicesProvider(provider: INearbyMediaDevicesProvider) {}
+
+    override fun showRearDisplayDialog(currentBaseState: Int) {}
+}
diff --git a/packages/SystemUI/tests/utils/src/android/internal/statusbar/StatusBarServiceKosmos.kt b/packages/SystemUI/tests/utils/src/android/internal/statusbar/StatusBarServiceKosmos.kt
new file mode 100644
index 0000000..1304161
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/android/internal/statusbar/StatusBarServiceKosmos.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2024 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 android.internal.statusbar
+
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.fakeStatusBarService by Kosmos.Fixture { FakeStatusBarService() }
+
+var Kosmos.statusBarService by Kosmos.Fixture { fakeStatusBarService }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/TestScopeProvider.kt b/packages/SystemUI/tests/utils/src/com/android/keyguard/TestScopeProvider.kt
similarity index 100%
rename from packages/SystemUI/multivalentTests/src/com/android/keyguard/TestScopeProvider.kt
rename to packages/SystemUI/tests/utils/src/com/android/keyguard/TestScopeProvider.kt
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/DemoModeKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/DemoModeKosmos.kt
new file mode 100644
index 0000000..39384fd
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/DemoModeKosmos.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2024 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.systemui
+
+import com.android.systemui.demomode.DemoModeController
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
+
+val Kosmos.mockDemoModeController by Kosmos.Fixture { mock<DemoModeController>() }
+
+var Kosmos.demoModeController by Kosmos.Fixture { mockDemoModeController }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/InitControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/InitControllerKosmos.kt
new file mode 100644
index 0000000..13169e1
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/InitControllerKosmos.kt
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2024 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.systemui
+
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.initController by Kosmos.Fixture { InitController() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalWidgetRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalWidgetRepository.kt
index 5d7e7c7..62d221d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalWidgetRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalWidgetRepository.kt
@@ -6,6 +6,7 @@
 import android.content.pm.ApplicationInfo
 import android.graphics.Bitmap
 import android.os.UserHandle
+import com.android.systemui.communal.shared.model.CommunalContentSize
 import com.android.systemui.communal.shared.model.CommunalWidgetContentModel
 import com.android.systemui.communal.widgets.WidgetConfigurator
 import kotlinx.coroutines.CoroutineScope
@@ -23,6 +24,10 @@
 
     private var nextWidgetId = 1
 
+    private fun updateListFromDatabase() {
+        _communalWidgets.value = fakeDatabase.values.sortedWith(compareBy { it.rank }).toList()
+    }
+
     fun setCommunalWidgets(inventory: List<CommunalWidgetContentModel>) {
         _communalWidgets.value = inventory
     }
@@ -31,7 +36,7 @@
         provider: ComponentName,
         user: UserHandle,
         rank: Int?,
-        configurator: WidgetConfigurator?
+        configurator: WidgetConfigurator?,
     ) {
         coroutineScope.launch {
             val id = nextWidgetId++
@@ -49,6 +54,7 @@
         rank: Int = 0,
         category: Int = AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD,
         userId: Int = 0,
+        spanY: Int = CommunalContentSize.HALF.span,
     ) {
         fakeDatabase[appWidgetId] =
             CommunalWidgetContentModel.Available(
@@ -66,8 +72,9 @@
                                     }
                             }
                     },
+                spanY = spanY,
             )
-        _communalWidgets.value = fakeDatabase.values.toList()
+        updateListFromDatabase()
     }
 
     fun addPendingWidget(
@@ -84,8 +91,9 @@
                 componentName = ComponentName.unflattenFromString(componentName)!!,
                 icon = icon,
                 user = UserHandle(userId),
+                spanY = CommunalContentSize.HALF.span,
             )
-        _communalWidgets.value = fakeDatabase.values.toList()
+        updateListFromDatabase()
     }
 
     override fun deleteWidget(widgetId: Int) {
@@ -93,12 +101,54 @@
         _communalWidgets.value = fakeDatabase.values.toList()
     }
 
+    private fun reorderDatabase(widgetIdToRankMap: Map<Int, Int>) {
+        for ((id, rank) in widgetIdToRankMap) {
+            val widget = fakeDatabase[id] ?: continue
+            fakeDatabase[id] =
+                when (widget) {
+                    is CommunalWidgetContentModel.Available -> {
+                        widget.copy(rank = rank)
+                    }
+                    is CommunalWidgetContentModel.Pending -> {
+                        widget.copy(rank = rank)
+                    }
+                }
+        }
+    }
+
+    override fun updateWidgetOrder(widgetIdToRankMap: Map<Int, Int>) {
+        reorderDatabase(widgetIdToRankMap)
+        updateListFromDatabase()
+    }
+
+    override fun resizeWidget(appWidgetId: Int, spanY: Int, widgetIdToRankMap: Map<Int, Int>) {
+        val widget = fakeDatabase[appWidgetId] ?: return
+
+        fakeDatabase[appWidgetId] =
+            when (widget) {
+                is CommunalWidgetContentModel.Available -> {
+                    widget.copy(spanY = spanY)
+                }
+                is CommunalWidgetContentModel.Pending -> {
+                    widget.copy(spanY = spanY)
+                }
+            }
+        reorderDatabase(widgetIdToRankMap)
+        updateListFromDatabase()
+    }
+
     override fun restoreWidgets(oldToNewWidgetIdMap: Map<Int, Int>) {}
 
     override fun abortRestoreWidgets() {}
 
     private fun onConfigured(id: Int, providerInfo: AppWidgetProviderInfo, rank: Int) {
-        _communalWidgets.value +=
-            listOf(CommunalWidgetContentModel.Available(id, providerInfo, rank))
+        fakeDatabase[id] =
+            CommunalWidgetContentModel.Available(
+                appWidgetId = id,
+                providerInfo = providerInfo,
+                rank = rank,
+                spanY = CommunalContentSize.HALF.span,
+            )
+        updateListFromDatabase()
     }
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModelKosmos.kt
new file mode 100644
index 0000000..1c84133
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/CommunalUserActionsViewModelKosmos.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2024 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.systemui.communal.ui.viewmodel
+
+import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.shade.domain.interactor.shadeInteractor
+
+val Kosmos.communalUserActionsViewModel by Fixture {
+    CommunalUserActionsViewModel(
+        deviceUnlockedInteractor = deviceUnlockedInteractor,
+        shadeInteractor = shadeInteractor,
+    )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModelKosmos.kt
new file mode 100644
index 0000000..8422942
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModelKosmos.kt
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2024 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.systemui.communal.ui.viewmodel
+
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.resizeableItemFrameViewModel by Kosmos.Fixture { ResizeableItemFrameViewModel() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeFocusedDisplayRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeFocusedDisplayRepository.kt
new file mode 100644
index 0000000..83df5d8
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeFocusedDisplayRepository.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 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.systemui.display.data.repository
+
+import android.view.Display
+import com.android.systemui.dagger.SysUISingleton
+import dagger.Binds
+import dagger.Module
+import javax.inject.Inject
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.asStateFlow
+
+@SysUISingleton
+/** Fake [FocusedDisplayRepository] for testing. */
+class FakeFocusedDisplayRepository @Inject constructor() : FocusedDisplayRepository {
+    private val flow = MutableStateFlow<Int>(Display.DEFAULT_DISPLAY)
+
+    override val focusedDisplayId: StateFlow<Int>
+        get() = flow.asStateFlow()
+
+    suspend fun emit(focusedDisplay: Int) = flow.emit(focusedDisplay)
+}
+
+@Module
+interface FakeFocusedDisplayRepositoryModule {
+    @Binds fun bindFake(fake: FakeFocusedDisplayRepository): FocusedDisplayRepository
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/data/repository/FakeKeyboardRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/data/repository/FakeKeyboardRepository.kt
index b37cac1..ba31683 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/data/repository/FakeKeyboardRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/data/repository/FakeKeyboardRepository.kt
@@ -19,8 +19,10 @@
 
 import com.android.systemui.keyboard.data.model.Keyboard
 import com.android.systemui.keyboard.shared.model.BacklightModel
+import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.consumeAsFlow
 import kotlinx.coroutines.flow.filterNotNull
 
 class FakeKeyboardRepository : KeyboardRepository {
@@ -32,8 +34,14 @@
     // filtering to make sure backlight doesn't have default initial value
     override val backlight: Flow<BacklightModel> = _backlightState.filterNotNull()
 
-    private val _newlyConnectedKeyboard: MutableStateFlow<Keyboard?> = MutableStateFlow(null)
-    override val newlyConnectedKeyboard: Flow<Keyboard> = _newlyConnectedKeyboard.filterNotNull()
+    // implemented as channel because original implementation is modeling events: it doesn't hold
+    // state so it won't always emit once connected. And it's bad if some tests depend on that
+    // incorrect behaviour.
+    private val _newlyConnectedKeyboard: Channel<Keyboard> = Channel()
+    override val newlyConnectedKeyboard: Flow<Keyboard> = _newlyConnectedKeyboard.consumeAsFlow()
+
+    private val _connectedKeyboards: MutableStateFlow<Set<Keyboard>> = MutableStateFlow(setOf())
+    override val connectedKeyboards: Flow<Set<Keyboard>> = _connectedKeyboards
 
     fun setBacklight(state: BacklightModel) {
         _backlightState.value = state
@@ -43,7 +51,14 @@
         _isAnyKeyboardConnected.value = connected
     }
 
+    fun setConnectedKeyboards(keyboards: Set<Keyboard>) {
+        _connectedKeyboards.value = keyboards
+        _isAnyKeyboardConnected.value = keyboards.isNotEmpty()
+    }
+
     fun setNewlyConnectedKeyboard(keyboard: Keyboard) {
-        _newlyConnectedKeyboard.value = keyboard
+        _newlyConnectedKeyboard.trySend(keyboard)
+        _connectedKeyboards.value += keyboard
+        _isAnyKeyboardConnected.value = true
     }
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeCommandQueue.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeCommandQueue.kt
index 3a59f6a..601c145 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeCommandQueue.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeCommandQueue.kt
@@ -18,6 +18,8 @@
 package com.android.systemui.keyguard.data.repository
 
 import android.content.Context
+import androidx.collection.ArrayMap
+import com.android.internal.statusbar.StatusBarIcon
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.settings.DisplayTracker
 import com.android.systemui.statusbar.CommandQueue
@@ -31,6 +33,11 @@
     CommandQueue(mock(Context::class.java), mock(DisplayTracker::class.java)) {
     private val callbacks = mutableListOf<Callbacks>()
 
+    val icons = ArrayMap<String, StatusBarIcon>()
+
+    private val perDisplayDisableFlags1 = mutableMapOf<Int, Int>()
+    private val perDisplayDisableFlags2 = mutableMapOf<Int, Int>()
+
     override fun addCallback(callback: Callbacks) {
         callbacks.add(callback)
     }
@@ -44,6 +51,23 @@
     }
 
     fun callbackCount(): Int = callbacks.size
+
+    override fun setIcon(slot: String, icon: StatusBarIcon) {
+        icons[slot] = icon
+    }
+
+    override fun disable(displayId: Int, state1: Int, state2: Int, animate: Boolean) {
+        perDisplayDisableFlags1[displayId] = state1
+        perDisplayDisableFlags2[displayId] = state2
+    }
+
+    override fun disable(displayId: Int, state1: Int, state2: Int) {
+        disable(displayId, state1, state2, /* animate= */ false)
+    }
+
+    fun disableFlags1ForDisplay(displayId: Int) = perDisplayDisableFlags1[displayId]
+
+    fun disableFlags2ForDisplay(displayId: Int) = perDisplayDisableFlags2[displayId]
 }
 
 @Module
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt
index a73c184..70b4f79 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt
@@ -50,12 +50,33 @@
 @SysUISingleton
 class FakeKeyguardTransitionRepository(
     private val initInLockscreen: Boolean = true,
+
+    /**
+     * If true, calls to [startTransition] will automatically emit STARTED, RUNNING, and FINISHED
+     * transition steps from/to the given states.
+     *
+     * [startTransition] is what the From*TransitionInteractors call, so this more closely emulates
+     * the behavior of the real KeyguardTransitionRepository, and reduces the work needed to
+     * manually set up the repository state in each test. For example, setting dreaming=true will
+     * automatically cause FromDreamingTransitionInteractor to call startTransition(DREAMING), and
+     * then we'll send STARTED/RUNNING/FINISHED DREAMING TransitionSteps.
+     *
+     * If your test needs to make assertions at specific points between STARTED/FINISHED, or if it's
+     * difficult to set up all of the conditions to make the transition interactors actually call
+     * startTransition, then construct a FakeKeyguardTransitionRepository with this value false.
+     */
+    private val sendTransitionStepsOnStartTransition: Boolean = true,
+    private val testScope: TestScope,
 ) : KeyguardTransitionRepository {
+
     private val _transitions =
         MutableSharedFlow<TransitionStep>(replay = 3, onBufferOverflow = BufferOverflow.DROP_OLDEST)
     override val transitions: SharedFlow<TransitionStep> = _transitions
 
-    @Inject constructor() : this(initInLockscreen = true)
+    @Inject
+    constructor(
+        testScope: TestScope
+    ) : this(initInLockscreen = true, sendTransitionStepsOnStartTransition = true, testScope)
 
     private val _currentTransitionInfo: MutableStateFlow<TransitionInfo> =
         MutableStateFlow(
@@ -63,7 +84,7 @@
                 ownerName = "",
                 from = KeyguardState.OFF,
                 to = KeyguardState.LOCKSCREEN,
-                animator = null
+                animator = null,
             )
         )
     override var currentTransitionInfoInternal = _currentTransitionInfo.asStateFlow()
@@ -71,12 +92,7 @@
     init {
         // Seed with a FINISHED transition in OFF, same as the real repository.
         _transitions.tryEmit(
-            TransitionStep(
-                KeyguardState.OFF,
-                KeyguardState.OFF,
-                1f,
-                TransitionState.FINISHED,
-            )
+            TransitionStep(KeyguardState.OFF, KeyguardState.OFF, 1f, TransitionState.FINISHED)
         )
 
         if (initInLockscreen) {
@@ -173,7 +189,7 @@
                         transitionState = TransitionState.RUNNING,
                         from = from,
                         to = to,
-                        value = 0.5f
+                        value = 0.5f,
                     )
             )
             testScheduler.runCurrent()
@@ -184,7 +200,7 @@
                         transitionState = TransitionState.RUNNING,
                         from = from,
                         to = to,
-                        value = 1f
+                        value = 1f,
                     )
             )
             testScheduler.runCurrent()
@@ -208,7 +224,7 @@
         this.sendTransitionStep(
             step = step,
             validateStep = validateStep,
-            ownerName = step.ownerName
+            ownerName = step.ownerName,
         )
     }
 
@@ -240,9 +256,9 @@
                 to = to,
                 value = value,
                 transitionState = transitionState,
-                ownerName = ownerName
+                ownerName = ownerName,
             ),
-        validateStep: Boolean = true
+        validateStep: Boolean = true,
     ) {
         if (step.transitionState == TransitionState.STARTED) {
             _currentTransitionInfo.value =
@@ -273,7 +289,7 @@
     fun sendTransitionStepJava(
         coroutineScope: CoroutineScope,
         step: TransitionStep,
-        validateStep: Boolean = true
+        validateStep: Boolean = true,
     ): Job {
         return coroutineScope.launch {
             sendTransitionStep(step = step, validateStep = validateStep)
@@ -283,7 +299,7 @@
     suspend fun sendTransitionSteps(
         steps: List<TransitionStep>,
         testScope: TestScope,
-        validateSteps: Boolean = true
+        validateSteps: Boolean = true,
     ) {
         steps.forEach {
             sendTransitionStep(step = it, validateStep = validateSteps)
@@ -293,10 +309,15 @@
 
     override suspend fun startTransition(info: TransitionInfo): UUID? {
         _currentTransitionInfo.value = info
+
+        if (sendTransitionStepsOnStartTransition) {
+            sendTransitionSteps(from = info.from, to = info.to, testScope = testScope)
+        }
+
         return if (info.animator == null) UUID.randomUUID() else null
     }
 
-    override suspend fun emitInitialStepsFromOff(to: KeyguardState) {
+    override suspend fun emitInitialStepsFromOff(to: KeyguardState, testSetup: Boolean) {
         tryEmitInitialStepsFromOff(to)
     }
 
@@ -318,14 +339,14 @@
                 1f,
                 TransitionState.FINISHED,
                 ownerName = "KeyguardTransitionRepository(boot)",
-            ),
+            )
         )
     }
 
     override suspend fun updateTransition(
         transitionId: UUID,
         @FloatRange(from = 0.0, to = 1.0) value: Float,
-        state: TransitionState
+        state: TransitionState,
     ) = Unit
 }
 
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeLightRevealScrimRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeLightRevealScrimRepository.kt
index f26bb83..805a710 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeLightRevealScrimRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeLightRevealScrimRepository.kt
@@ -35,6 +35,8 @@
     private val _revealAmount: MutableStateFlow<Float> = MutableStateFlow(0.0f)
     override val revealAmount: Flow<Float> = _revealAmount
 
+    val revealAnimatorRequests: MutableList<RevealAnimatorRequest> = arrayListOf()
+
     override val isAnimating: Boolean
         get() = false
 
@@ -44,5 +46,12 @@
         } else {
             _revealAmount.value = 0.0f
         }
+
+        revealAnimatorRequests.add(RevealAnimatorRequest(reveal, duration))
     }
+
+    data class RevealAnimatorRequest(
+        val reveal: Boolean,
+        val duration: Long
+    )
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryKosmos.kt
index 3e69e87..e9eea83 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryKosmos.kt
@@ -18,9 +18,14 @@
 
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.kosmos.testScope
+import org.mockito.Mockito.spy
 
 var Kosmos.keyguardTransitionRepository: KeyguardTransitionRepository by
     Kosmos.Fixture { fakeKeyguardTransitionRepository }
-var Kosmos.fakeKeyguardTransitionRepository by Kosmos.Fixture { FakeKeyguardTransitionRepository() }
+var Kosmos.fakeKeyguardTransitionRepository by
+    Kosmos.Fixture { FakeKeyguardTransitionRepository(testScope = testScope) }
+var Kosmos.fakeKeyguardTransitionRepositorySpy: FakeKeyguardTransitionRepository by
+    Kosmos.Fixture { spy(fakeKeyguardTransitionRepository) }
 var Kosmos.realKeyguardTransitionRepository: KeyguardTransitionRepository by
     Kosmos.Fixture { KeyguardTransitionRepositoryImpl(testDispatcher) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorKosmos.kt
index ef789d1..93a59eb 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorKosmos.kt
@@ -17,7 +17,7 @@
 package com.android.systemui.keyguard.domain.interactor
 
 import com.android.systemui.deviceentry.data.repository.deviceEntryRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.applicationCoroutineScope
 import com.android.systemui.kosmos.testDispatcher
@@ -27,7 +27,7 @@
 val Kosmos.fromAodTransitionInteractor by
     Kosmos.Fixture {
         FromAodTransitionInteractor(
-            transitionRepository = fakeKeyguardTransitionRepository,
+            transitionRepository = keyguardTransitionRepository,
             transitionInteractor = keyguardTransitionInteractor,
             internalTransitionInteractor = internalKeyguardTransitionInteractor,
             scope = applicationCoroutineScope,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorKosmos.kt
index c694114..700d7e9 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorKosmos.kt
@@ -18,8 +18,8 @@
 
 import com.android.systemui.communal.domain.interactor.communalSceneInteractor
 import com.android.systemui.keyguard.data.repository.biometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.data.repository.keyguardRepository
+import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.applicationCoroutineScope
 import com.android.systemui.kosmos.testDispatcher
@@ -29,7 +29,7 @@
 val Kosmos.fromGoneTransitionInteractor by
     Kosmos.Fixture {
         FromGoneTransitionInteractor(
-            transitionRepository = fakeKeyguardTransitionRepository,
+            transitionRepository = keyguardTransitionRepository,
             transitionInteractor = keyguardTransitionInteractor,
             internalTransitionInteractor = internalKeyguardTransitionInteractor,
             scope = applicationCoroutineScope,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorKosmos.kt
index e2b283b..2f13ba4 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorKosmos.kt
@@ -34,11 +34,11 @@
             transitionInteractor = keyguardTransitionInteractor,
             dismissInteractor = keyguardDismissInteractor,
             applicationScope = testScope.backgroundScope,
-            sceneInteractor = { sceneInteractor },
             deviceUnlockedInteractor = { deviceUnlockedInteractor },
             powerInteractor = powerInteractor,
             alternateBouncerInteractor = alternateBouncerInteractor,
             shadeInteractor = { shadeInteractor },
             keyguardInteractor = { keyguardInteractor },
+            sceneInteractor = { sceneInteractor },
         )
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelKosmos.kt
new file mode 100644
index 0000000..fc4f3a5
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelKosmos.kt
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2024 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.systemui.keyguard.ui.viewmodel
+
+import android.content.applicationContext
+import com.android.systemui.common.ui.domain.interactor.configurationInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+@ExperimentalCoroutinesApi
+val Kosmos.deviceEntryBackgroundViewModel by Fixture {
+    DeviceEntryBackgroundViewModel(
+        context = applicationContext,
+        deviceEntryIconViewModel = deviceEntryIconViewModel,
+        configurationInteractor = configurationInteractor,
+        keyguardTransitionInteractor = keyguardTransitionInteractor,
+        alternateBouncerToAodTransitionViewModel = alternateBouncerToAodTransitionViewModel,
+        alternateBouncerToDozingTransitionViewModel = alternateBouncerToDozingTransitionViewModel,
+        aodToLockscreenTransitionViewModel = aodToLockscreenTransitionViewModel,
+        dozingToLockscreenTransitionViewModel = dozingToLockscreenTransitionViewModel,
+        dreamingToAodTransitionViewModel = dreamingToAodTransitionViewModel,
+        dreamingToLockscreenTransitionViewModel = dreamingToLockscreenTransitionViewModel,
+        goneToAodTransitionViewModel = goneToAodTransitionViewModel,
+        goneToDozingTransitionViewModel = goneToDozingTransitionViewModel,
+        goneToLockscreenTransitionViewModel = goneToLockscreenTransitionViewModel,
+        lockscreenToAodTransitionViewModel = lockscreenToAodTransitionViewModel,
+        occludedToAodTransitionViewModel = occludedToAodTransitionViewModel,
+        occludedToDozingTransitionViewModel = occludedToDozingTransitionViewModel,
+        occludedToLockscreenTransitionViewModel = occludedToLockscreenTransitionViewModel,
+        offToLockscreenTransitionViewModel = offToLockscreenTransitionViewModel,
+        primaryBouncerToAodTransitionViewModel = primaryBouncerToAodTransitionViewModel,
+        primaryBouncerToDozingTransitionViewModel = primaryBouncerToDozingTransitionViewModel,
+        primaryBouncerToLockscreenTransitionViewModel =
+            primaryBouncerToLockscreenTransitionViewModel,
+        lockscreenToDozingTransitionViewModel = lockscreenToDozingTransitionViewModel,
+    )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModelKosmos.kt
index 0c538ff..ab7ccb3 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModelKosmos.kt
@@ -18,6 +18,7 @@
 
 import android.os.fakeExecutorHandler
 import com.android.systemui.keyguard.domain.interactor.keyguardBlueprintInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
 import com.android.systemui.kosmos.Kosmos
 
 val Kosmos.keyguardBlueprintViewModel by
@@ -25,5 +26,6 @@
         KeyguardBlueprintViewModel(
             fakeExecutorHandler,
             keyguardBlueprintInteractor,
+            keyguardTransitionInteractor,
         )
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt
index 38626a5..3c87106 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt
@@ -47,6 +47,8 @@
         alternateBouncerToGoneTransitionViewModel = alternateBouncerToGoneTransitionViewModel,
         alternateBouncerToLockscreenTransitionViewModel =
             alternateBouncerToLockscreenTransitionViewModel,
+        alternateBouncerToOccludedTransitionViewModel =
+            alternateBouncerToOccludedTransitionViewModel,
         aodToGoneTransitionViewModel = aodToGoneTransitionViewModel,
         aodToLockscreenTransitionViewModel = aodToLockscreenTransitionViewModel,
         aodToOccludedTransitionViewModel = aodToOccludedTransitionViewModel,
@@ -69,9 +71,12 @@
         lockscreenToOccludedTransitionViewModel = lockscreenToOccludedTransitionViewModel,
         lockscreenToPrimaryBouncerTransitionViewModel =
             lockscreenToPrimaryBouncerTransitionViewModel,
+        occludedToAlternateBouncerTransitionViewModel =
+            occludedToAlternateBouncerTransitionViewModel,
         occludedToAodTransitionViewModel = occludedToAodTransitionViewModel,
         occludedToDozingTransitionViewModel = occludedToDozingTransitionViewModel,
         occludedToLockscreenTransitionViewModel = occludedToLockscreenTransitionViewModel,
+        offToLockscreenTransitionViewModel = offToLockscreenTransitionViewModel,
         primaryBouncerToAodTransitionViewModel = primaryBouncerToAodTransitionViewModel,
         primaryBouncerToGoneTransitionViewModel = primaryBouncerToGoneTransitionViewModel,
         primaryBouncerToLockscreenTransitionViewModel =
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..2acd1b4
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModelKosmos.kt
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.occludedToAlternateBouncerTransitionViewModel by Fixture {
+    OccludedToAlternateBouncerTransitionViewModel(animationFlow = keyguardTransitionAnimationFlow)
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..5d62a0f
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModelKosmos.kt
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2023 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.offToLockscreenTransitionViewModel by Fixture {
+    OffToLockscreenTransitionViewModel(animationFlow = keyguardTransitionAnimationFlow)
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt
index 450f08f..11f0c19 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt
@@ -21,17 +21,20 @@
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.TransitionInfo
 import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
-import com.android.systemui.util.mockito.any
+import com.android.systemui.keyguard.shared.model.TransitionState
 import com.android.systemui.util.mockito.withArgCaptor
 import com.google.common.truth.FailureMetadata
 import com.google.common.truth.Subject
 import com.google.common.truth.Truth
 import com.google.common.truth.Truth.assertAbout
+import com.google.common.truth.Truth.assertThat
 import junit.framework.Assert.assertEquals
 import org.junit.Assert.fail
 import org.mockito.Mockito
 import org.mockito.Mockito.never
 import org.mockito.Mockito.verify
+import org.mockito.kotlin.any
+import org.mockito.kotlin.argumentCaptor
 
 /** [Subject] used to make assertions about a [Mockito.spy] KeyguardTransitionRepository. */
 class KeyguardTransitionRepositorySpySubject
@@ -89,6 +92,20 @@
             }
     }
 
+    /**
+     * Asserts that we started a transition to the given state, optionally verifying additional
+     * params.
+     */
+    suspend fun updatedTransition(value: Float, state: TransitionState) {
+        val valueCaptor = argumentCaptor<Float>()
+        val stateCaptor = argumentCaptor<TransitionState>()
+
+        verify(repository).updateTransition(any(), valueCaptor.capture(), stateCaptor.capture())
+
+        assertThat(value).isEqualTo(valueCaptor.firstValue)
+        assertThat(state).isEqualTo(stateCaptor.firstValue)
+    }
+
     /** Verifies that [KeyguardTransitionRepository.startTransition] was never called. */
     suspend fun noTransitionsStarted() {
         verify(repository, never()).startTransition(any())
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/navigationbar/NavigationBarControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/navigationbar/NavigationBarControllerKosmos.kt
new file mode 100644
index 0000000..9e2039e
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/navigationbar/NavigationBarControllerKosmos.kt
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2024 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.systemui.navigationbar
+
+import com.android.systemui.kosmos.Kosmos
+import org.mockito.kotlin.mock
+
+val Kosmos.mockNavigationBarController by Kosmos.Fixture { mock<NavigationBarController>() }
+
+var Kosmos.navigationBarController by Kosmos.Fixture { mockNavigationBarController }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/FakeVolumeDialogController.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/FakeVolumeDialogController.kt
new file mode 100644
index 0000000..e4a2a87
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/FakeVolumeDialogController.kt
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2024 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.systemui.plugins
+
+import android.media.AudioManager
+import android.media.AudioManager.CsdWarning
+import android.os.Handler
+import android.os.VibrationEffect
+import androidx.core.util.getOrElse
+import java.util.concurrent.CopyOnWriteArraySet
+
+class FakeVolumeDialogController(private val audioManager: AudioManager) : VolumeDialogController {
+
+    var isVisible: Boolean = false
+        private set
+
+    var hasScheduledTouchFeedback: Boolean = false
+        private set
+
+    var vibrationEffect: VibrationEffect? = null
+        private set
+
+    var hasUserActivity: Boolean = false
+        private set
+
+    private var hasVibrator: Boolean = true
+
+    private val state = VolumeDialogController.State()
+    private val callbacks = CopyOnWriteArraySet<VolumeDialogController.Callbacks>()
+
+    override fun setActiveStream(stream: Int) {
+        // ensure streamState existence for the active stream
+        state.states.getOrElse(stream) {
+            VolumeDialogController.StreamState().also { streamState ->
+                state.states.put(stream, streamState)
+            }
+        }
+        state.activeStream = stream
+    }
+
+    override fun setStreamVolume(stream: Int, userLevel: Int) {
+        val streamState =
+            state.states.getOrElse(stream) {
+                VolumeDialogController.StreamState().also { streamState ->
+                    state.states.put(stream, streamState)
+                }
+            }
+        streamState.level = userLevel.coerceIn(streamState.levelMin, streamState.levelMax)
+    }
+
+    override fun setRingerMode(ringerModeNormal: Int, external: Boolean) {
+        if (external) {
+            state.ringerModeExternal = ringerModeNormal
+        } else {
+            state.ringerModeInternal = ringerModeNormal
+        }
+    }
+
+    fun setHasVibrator(hasVibrator: Boolean) {
+        this.hasVibrator = hasVibrator
+    }
+
+    override fun hasVibrator(): Boolean = hasVibrator
+
+    override fun vibrate(effect: VibrationEffect) {
+        vibrationEffect = effect
+    }
+
+    override fun scheduleTouchFeedback() {
+        hasScheduledTouchFeedback = true
+    }
+
+    fun resetScheduledTouchFeedback() {
+        hasScheduledTouchFeedback = false
+    }
+
+    override fun getAudioManager(): AudioManager = audioManager
+
+    override fun notifyVisible(visible: Boolean) {
+        isVisible = visible
+    }
+
+    override fun addCallback(callbacks: VolumeDialogController.Callbacks?, handler: Handler?) {
+        this.callbacks.add(callbacks)
+    }
+
+    override fun removeCallback(callbacks: VolumeDialogController.Callbacks?) {
+        this.callbacks.remove(callbacks)
+    }
+
+    override fun userActivity() {
+        hasUserActivity = true
+    }
+
+    fun resetUserActivity() {
+        hasUserActivity = false
+    }
+
+    override fun getState() {
+        callbacks.sendEvent { it.onStateChanged(state) }
+    }
+
+    /** @see com.android.systemui.plugins.VolumeDialogController.Callbacks.onShowRequested */
+    fun onShowRequested(reason: Int, keyguardLocked: Boolean, lockTaskModeState: Int) {
+        callbacks.sendEvent { it.onShowRequested(reason, keyguardLocked, lockTaskModeState) }
+    }
+
+    /** @see com.android.systemui.plugins.VolumeDialogController.Callbacks.onDismissRequested */
+    fun onDismissRequested(reason: Int) {
+        callbacks.sendEvent { it.onDismissRequested(reason) }
+    }
+
+    /**
+     * @see com.android.systemui.plugins.VolumeDialogController.Callbacks.onLayoutDirectionChanged
+     */
+    fun onLayoutDirectionChanged(layoutDirection: Int) {
+        callbacks.sendEvent { it.onLayoutDirectionChanged(layoutDirection) }
+    }
+
+    /** @see com.android.systemui.plugins.VolumeDialogController.Callbacks.onConfigurationChanged */
+    fun onConfigurationChanged() {
+        callbacks.sendEvent { it.onConfigurationChanged() }
+    }
+
+    /** @see com.android.systemui.plugins.VolumeDialogController.Callbacks.onShowVibrateHint */
+    fun onShowVibrateHint() {
+        callbacks.sendEvent { it.onShowVibrateHint() }
+    }
+
+    /** @see com.android.systemui.plugins.VolumeDialogController.Callbacks.onShowSilentHint */
+    fun onShowSilentHint() {
+        callbacks.sendEvent { it.onShowSilentHint() }
+    }
+
+    /** @see com.android.systemui.plugins.VolumeDialogController.Callbacks.onScreenOff */
+    fun onScreenOff() {
+        callbacks.sendEvent { it.onScreenOff() }
+    }
+
+    /** @see com.android.systemui.plugins.VolumeDialogController.Callbacks.onShowSafetyWarning */
+    fun onShowSafetyWarning(flags: Int) {
+        callbacks.sendEvent { it.onShowSafetyWarning(flags) }
+    }
+
+    /**
+     * @see com.android.systemui.plugins.VolumeDialogController.Callbacks.onAccessibilityModeChanged
+     */
+    fun onAccessibilityModeChanged(showA11yStream: Boolean?) {
+        callbacks.sendEvent { it.onAccessibilityModeChanged(showA11yStream) }
+    }
+
+    /** @see com.android.systemui.plugins.VolumeDialogController.Callbacks.onShowCsdWarning */
+    fun onShowCsdWarning(@CsdWarning csdWarning: Int, durationMs: Int) {
+        callbacks.sendEvent { it.onShowCsdWarning(csdWarning, durationMs) }
+    }
+
+    /** @see com.android.systemui.plugins.VolumeDialogController.Callbacks.onVolumeChangedFromKey */
+    fun onVolumeChangedFromKey() {
+        callbacks.sendEvent { it.onVolumeChangedFromKey() }
+    }
+
+    override fun getCaptionsEnabledState(checkForSwitchState: Boolean) {
+        error("Unsupported for the new Volume Dialog")
+    }
+
+    override fun setCaptionsEnabledState(enabled: Boolean) {
+        error("Unsupported for the new Volume Dialog")
+    }
+
+    override fun getCaptionsComponentState(fromTooltip: Boolean) {
+        error("Unsupported for the new Volume Dialog")
+    }
+}
+
+private inline fun CopyOnWriteArraySet<VolumeDialogController.Callbacks>.sendEvent(
+    event: (callback: VolumeDialogController.Callbacks) -> Unit
+) {
+    for (callback in this) {
+        event(callback)
+    }
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/PluginDependencyKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/PluginDependencyKosmos.kt
new file mode 100644
index 0000000..f1388e9
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/PluginDependencyKosmos.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2024 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.systemui.plugins
+
+import android.testing.LeakCheck
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.utils.leaks.FakePluginManager
+import org.mockito.Mockito.mock
+import org.mockito.kotlin.mock
+
+val Kosmos.leakCheck by Kosmos.Fixture { LeakCheck() }
+
+val Kosmos.fakePluginManager by Kosmos.Fixture { FakePluginManager(leakCheck) }
+
+var Kosmos.pluginManager by Kosmos.Fixture { fakePluginManager }
+
+val Kosmos.pluginDependencyProvider by Kosmos.Fixture { PluginDependencyProvider { pluginManager } }
+
+val Kosmos.mockPluginDependencyProvider by Kosmos.Fixture { mock<PluginDependencyProvider>() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/VolumeDialogControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/VolumeDialogControllerKosmos.kt
new file mode 100644
index 0000000..2f6d4fa
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/VolumeDialogControllerKosmos.kt
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2024 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.systemui.plugins
+
+import com.android.systemui.kosmos.Kosmos
+import org.mockito.kotlin.mock
+
+val Kosmos.fakeVolumeDialogController by Kosmos.Fixture { FakeVolumeDialogController(mock {}) }
+var Kosmos.volumeDialogController: VolumeDialogController by
+    Kosmos.Fixture { fakeVolumeDialogController }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt
index d37d8f3..c218ff6 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt
@@ -19,14 +19,16 @@
 import android.content.res.mainResources
 import androidx.lifecycle.LifecycleCoroutineScope
 import com.android.systemui.common.ui.domain.interactor.configurationInteractor
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.qs.footerActionsController
 import com.android.systemui.qs.footerActionsViewModelFactory
+import com.android.systemui.qs.panels.domain.interactor.tileSquishinessInteractor
+import com.android.systemui.qs.panels.ui.viewmodel.paginatedGridViewModel
 import com.android.systemui.qs.ui.viewmodel.quickSettingsContainerViewModel
 import com.android.systemui.shade.largeScreenHeaderHelper
 import com.android.systemui.shade.transition.largeScreenShadeInterpolator
 import com.android.systemui.statusbar.disableflags.data.repository.disableFlagsRepository
-import com.android.systemui.statusbar.phone.keyguardBypassController
 import com.android.systemui.statusbar.sysuiStatusBarStateController
 
 val Kosmos.qsFragmentComposeViewModelFactory by
@@ -41,11 +43,13 @@
                     footerActionsViewModelFactory,
                     footerActionsController,
                     sysuiStatusBarStateController,
-                    keyguardBypassController,
+                    deviceEntryInteractor,
                     disableFlagsRepository,
                     largeScreenShadeInterpolator,
                     configurationInteractor,
                     largeScreenHeaderHelper,
+                    tileSquishinessInteractor,
+                    paginatedGridViewModel,
                     lifecycleScope,
                 )
             }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/data/repository/TileSquishinessRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/data/repository/TileSquishinessRepositoryKosmos.kt
new file mode 100644
index 0000000..d9fad32
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/data/repository/TileSquishinessRepositoryKosmos.kt
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2024 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.systemui.qs.panels.data.repository
+
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.tileSquishinessRepository by Kosmos.Fixture { TileSquishinessRepository() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/InfiniteGridLayoutKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/InfiniteGridLayoutKosmos.kt
index 3f62b4d..546129f 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/InfiniteGridLayoutKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/InfiniteGridLayoutKosmos.kt
@@ -20,6 +20,9 @@
 import com.android.systemui.qs.panels.ui.compose.infinitegrid.InfiniteGridLayout
 import com.android.systemui.qs.panels.ui.viewmodel.fixedColumnsSizeViewModel
 import com.android.systemui.qs.panels.ui.viewmodel.iconTilesViewModel
+import com.android.systemui.qs.panels.ui.viewmodel.tileSquishinessViewModel
 
 val Kosmos.infiniteGridLayout by
-    Kosmos.Fixture { InfiniteGridLayout(iconTilesViewModel, fixedColumnsSizeViewModel) }
+    Kosmos.Fixture {
+        InfiniteGridLayout(iconTilesViewModel, fixedColumnsSizeViewModel, tileSquishinessViewModel)
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/TileSquishinessInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/TileSquishinessInteractorKosmos.kt
new file mode 100644
index 0000000..23db70f
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/TileSquishinessInteractorKosmos.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2024 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.systemui.qs.panels.domain.interactor
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.qs.panels.data.repository.tileSquishinessRepository
+
+val Kosmos.tileSquishinessInteractor by
+    Kosmos.Fixture { TileSquishinessInteractor(tileSquishinessRepository) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModelKosmos.kt
index 40d2624..babbd50 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModelKosmos.kt
@@ -27,6 +27,7 @@
             currentTilesInteractor,
             fixedColumnsSizeViewModel,
             quickQuickSettingsRowInteractor,
+            tileSquishinessViewModel,
             iconTilesViewModel,
             applicationCoroutineScope,
         )
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/TileSquishinessViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/TileSquishinessViewModelKosmos.kt
new file mode 100644
index 0000000..ecc8cd1
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/TileSquishinessViewModelKosmos.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2024 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.systemui.qs.panels.ui.viewmodel
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.qs.panels.domain.interactor.tileSquishinessInteractor
+
+val Kosmos.tileSquishinessViewModel by
+    Kosmos.Fixture { TileSquishinessViewModel(tileSquishinessInteractor) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelKosmos.kt
index ff8b478..6540ed6 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelKosmos.kt
@@ -18,11 +18,13 @@
 
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.shade.domain.interactor.shadeInteractor
 import com.android.systemui.shade.ui.viewmodel.shadeHeaderViewModelFactory
 
 val Kosmos.quickSettingsShadeOverlayContentViewModel: QuickSettingsShadeOverlayContentViewModel by
     Kosmos.Fixture {
         QuickSettingsShadeOverlayContentViewModel(
+            shadeInteractor = shadeInteractor,
             sceneInteractor = sceneInteractor,
             shadeHeaderViewModelFactory = shadeHeaderViewModelFactory,
             quickSettingsContainerViewModel = quickSettingsContainerViewModel,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneKosmos.kt
index 737aaf2..4f414d9 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneKosmos.kt
@@ -1,23 +1,24 @@
 package com.android.systemui.scene
 
+import android.view.View
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.systemui.classifier.domain.interactor.falsingInteractor
+import com.android.systemui.haptics.msdl.msdlPlayer
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.Kosmos.Fixture
 import com.android.systemui.power.domain.interactor.powerInteractor
 import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.scene.domain.interactor.systemGestureExclusionInteractor
 import com.android.systemui.scene.shared.logger.sceneLogger
 import com.android.systemui.scene.shared.model.Overlays
 import com.android.systemui.scene.shared.model.SceneContainerConfig
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.scene.ui.FakeOverlay
-import com.android.systemui.scene.ui.viewmodel.SceneContainerGestureFilter
+import com.android.systemui.scene.ui.viewmodel.SceneContainerHapticsViewModel
 import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel
 import com.android.systemui.scene.ui.viewmodel.splitEdgeDetector
-import com.android.systemui.settings.displayTracker
 import com.android.systemui.shade.domain.interactor.shadeInteractor
 import kotlinx.coroutines.flow.MutableStateFlow
+import org.mockito.kotlin.mock
 
 var Kosmos.sceneKeys by Fixture {
     listOf(
@@ -27,6 +28,7 @@
         Scenes.Bouncer,
         Scenes.Gone,
         Scenes.Communal,
+        Scenes.Dream,
     )
 }
 
@@ -48,9 +50,10 @@
             Scenes.Gone to 0,
             Scenes.Lockscreen to 0,
             Scenes.Communal to 1,
-            Scenes.Shade to 2,
-            Scenes.QuickSettings to 3,
-            Scenes.Bouncer to 4,
+            Scenes.Dream to 2,
+            Scenes.Shade to 3,
+            Scenes.QuickSettings to 4,
+            Scenes.Bouncer to 5,
         )
 
     SceneContainerConfig(
@@ -68,26 +71,39 @@
 }
 
 val Kosmos.sceneContainerViewModel by Fixture {
-    SceneContainerViewModel(
-            sceneInteractor = sceneInteractor,
-            falsingInteractor = falsingInteractor,
-            powerInteractor = powerInteractor,
-            shadeInteractor = shadeInteractor,
-            splitEdgeDetector = splitEdgeDetector,
-            gestureFilterFactory = sceneContainerGestureFilterFactory,
-            displayId = displayTracker.defaultDisplayId,
-            motionEventHandlerReceiver = {},
-            logger = sceneLogger,
-        )
+    sceneContainerViewModelFactory
+        .create(mock<View>()) {}
         .apply { setTransitionState(transitionState) }
 }
 
-val Kosmos.sceneContainerGestureFilterFactory by Fixture {
-    object : SceneContainerGestureFilter.Factory {
-        override fun create(displayId: Int): SceneContainerGestureFilter {
-            return SceneContainerGestureFilter(
-                interactor = systemGestureExclusionInteractor,
-                displayId = displayId,
+val Kosmos.sceneContainerViewModelFactory by Fixture {
+    object : SceneContainerViewModel.Factory {
+        override fun create(
+            view: View,
+            motionEventHandlerReceiver: (SceneContainerViewModel.MotionEventHandler?) -> Unit,
+        ): SceneContainerViewModel =
+            SceneContainerViewModel(
+                sceneInteractor = sceneInteractor,
+                falsingInteractor = falsingInteractor,
+                powerInteractor = powerInteractor,
+                shadeInteractor = shadeInteractor,
+                splitEdgeDetector = splitEdgeDetector,
+                logger = sceneLogger,
+                hapticsViewModelFactory = sceneContainerHapticsViewModelFactory,
+                view = view,
+                motionEventHandlerReceiver = motionEventHandlerReceiver,
+            )
+    }
+}
+
+val Kosmos.sceneContainerHapticsViewModelFactory by Fixture {
+    object : SceneContainerHapticsViewModel.Factory {
+        override fun create(view: View): SceneContainerHapticsViewModel {
+            return SceneContainerHapticsViewModel(
+                view = view,
+                sceneInteractor = sceneInteractor,
+                shadeInteractor = shadeInteractor,
+                msdlPlayer = msdlPlayer,
             )
         }
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/data/repository/SystemGestureExclusionRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/data/repository/SystemGestureExclusionRepositoryKosmos.kt
deleted file mode 100644
index 15ed1b3..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/data/repository/SystemGestureExclusionRepositoryKosmos.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.scene.data.repository
-
-import android.view.windowManagerService
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.kosmos.Kosmos.Fixture
-
-val Kosmos.systemGestureExclusionRepository by Fixture {
-    SystemGestureExclusionRepository(windowManager = windowManagerService)
-}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SystemGestureExclusionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SystemGestureExclusionInteractorKosmos.kt
deleted file mode 100644
index 3e46c3f..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SystemGestureExclusionInteractorKosmos.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.scene.domain.interactor
-
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.kosmos.Kosmos.Fixture
-import com.android.systemui.scene.data.repository.systemGestureExclusionRepository
-
-val Kosmos.systemGestureExclusionInteractor by Fixture {
-    SystemGestureExclusionInteractor(repository = systemGestureExclusionRepository)
-}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt
index 6d488d2..60141c6 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt
@@ -25,6 +25,7 @@
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.shade.data.repository.FakeShadeRepository
 import com.android.systemui.shade.data.repository.ShadeRepository
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.test.TestScope
@@ -133,7 +134,7 @@
 class ShadeTestUtilLegacyImpl(
     val testScope: TestScope,
     val shadeRepository: FakeShadeRepository,
-    val context: SysuiTestableContext
+    val context: SysuiTestableContext,
 ) : ShadeTestUtilDelegate {
     override fun setShadeAndQsExpansion(shadeExpansion: Float, qsExpansion: Float) {
         shadeRepository.setLegacyShadeExpansion(shadeExpansion)
@@ -191,6 +192,7 @@
 }
 
 /** Sets up shade state for tests when the scene container flag is enabled. */
+@OptIn(ExperimentalCoroutinesApi::class)
 class ShadeTestUtilSceneImpl(
     val testScope: TestScope,
     val sceneInteractor: SceneInteractor,
@@ -269,7 +271,7 @@
         from: SceneKey,
         to: SceneKey,
         progress: Float,
-        isInitiatedByUserInput: Boolean = true
+        isInitiatedByUserInput: Boolean = true,
     ) {
         sceneInteractor.changeScene(from, "test")
         val transitionState =
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeViewControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeViewControllerKosmos.kt
index 1ceab68..a9f9c82 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeViewControllerKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeViewControllerKosmos.kt
@@ -20,3 +20,13 @@
 import com.android.systemui.util.mockito.mock
 
 var Kosmos.shadeViewController by Kosmos.Fixture { mock<ShadeViewController>() }
+
+val Kosmos.mockNotificationShadeWindowViewController by
+    Kosmos.Fixture { mock<NotificationShadeWindowViewController>() }
+
+var Kosmos.notificationShadeWindowViewController by
+    Kosmos.Fixture { mockNotificationShadeWindowViewController }
+
+val Kosmos.mockShadeSurface by Kosmos.Fixture { mock<ShadeSurface>() }
+
+var Kosmos.shadeSurface by Kosmos.Fixture { mockShadeSurface }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/transition/LinearLargeScreenShadeInterpolator.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/transition/LinearLargeScreenShadeInterpolator.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/shade/transition/LinearLargeScreenShadeInterpolator.kt
rename to packages/SystemUI/tests/utils/src/com/android/systemui/shade/transition/LinearLargeScreenShadeInterpolator.kt
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/NotificationsShadeOverlayContentViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/NotificationsShadeOverlayContentViewModelKosmos.kt
index 9cdd519..718347f 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/NotificationsShadeOverlayContentViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/NotificationsShadeOverlayContentViewModelKosmos.kt
@@ -20,6 +20,7 @@
 import com.android.systemui.kosmos.Kosmos.Fixture
 import com.android.systemui.notifications.ui.viewmodel.NotificationsShadeOverlayContentViewModel
 import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.shade.domain.interactor.shadeInteractor
 import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationsPlaceholderViewModelFactory
 
 val Kosmos.notificationsShadeOverlayContentViewModel:
@@ -28,5 +29,6 @@
         shadeHeaderViewModelFactory = shadeHeaderViewModelFactory,
         notificationsPlaceholderViewModelFactory = notificationsPlaceholderViewModelFactory,
         sceneInteractor = sceneInteractor,
+        shadeInteractor = shadeInteractor,
     )
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelKosmos.kt
index 7eb9f34..f5b856d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelKosmos.kt
@@ -20,7 +20,6 @@
 import com.android.systemui.broadcast.broadcastDispatcher
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.plugins.activityStarter
-import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.shade.domain.interactor.privacyChipInteractor
 import com.android.systemui.shade.domain.interactor.shadeHeaderClockInteractor
 import com.android.systemui.shade.domain.interactor.shadeInteractor
@@ -32,7 +31,6 @@
         ShadeHeaderViewModel(
             context = applicationContext,
             activityStarter = activityStarter,
-            sceneInteractor = sceneInteractor,
             shadeInteractor = shadeInteractor,
             mobileIconsInteractor = mobileIconsInteractor,
             mobileIconsViewModel = mobileIconsViewModel,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelKosmos.kt
index 48c5121..0aeea4e 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModelKosmos.kt
@@ -19,11 +19,13 @@
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.Kosmos.Fixture
 import com.android.systemui.qs.ui.adapter.qsSceneAdapter
+import com.android.systemui.scene.domain.interactor.sceneBackInteractor
 import com.android.systemui.shade.domain.interactor.shadeInteractor
 
 val Kosmos.shadeUserActionsViewModel: ShadeUserActionsViewModel by Fixture {
     ShadeUserActionsViewModel(
         qsSceneAdapter = qsSceneAdapter,
         shadeInteractor = shadeInteractor,
+        sceneBackInteractor = sceneBackInteractor,
     )
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/CommandQueueKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/CommandQueueKosmos.kt
index 27f7f68..f571c1b 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/CommandQueueKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/CommandQueueKosmos.kt
@@ -19,4 +19,10 @@
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.util.mockito.mock
 
-var Kosmos.commandQueue by Kosmos.Fixture { mock<CommandQueue>() }
+val Kosmos.mockCommandQueue by Kosmos.Fixture { mock<CommandQueue>() }
+
+var Kosmos.commandQueue by Kosmos.Fixture { mockCommandQueue }
+
+val Kosmos.mockCommandQueueCallbacks by Kosmos.Fixture { mock<CommandQueue.Callbacks>() }
+
+var Kosmos.commandQueueCallbacks by Kosmos.Fixture { mockCommandQueue }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryHelper.java b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/NotificationEntryHelper.java
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryHelper.java
rename to packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/NotificationEntryHelper.java
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/NotificationRemoteInputManagerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/NotificationRemoteInputManagerKosmos.kt
index 554bdbe..d436cd4 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/NotificationRemoteInputManagerKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/NotificationRemoteInputManagerKosmos.kt
@@ -19,5 +19,7 @@
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.util.mockito.mock
 
-var Kosmos.notificationRemoteInputManager by
+val Kosmos.mockNotificationRemoteInputManager by
     Kosmos.Fixture { mock<NotificationRemoteInputManager>() }
+
+var Kosmos.notificationRemoteInputManager by Kosmos.Fixture { mockNotificationRemoteInputManager }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/CommandQueueInitializerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/CommandQueueInitializerKosmos.kt
new file mode 100644
index 0000000..cba4e8e
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/CommandQueueInitializerKosmos.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.core
+
+import android.content.testableContext
+import android.internal.statusbar.fakeStatusBarService
+import com.android.systemui.initController
+import com.android.systemui.keyguard.data.repository.fakeCommandQueue
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.navigationbar.mockNavigationBarController
+import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository
+import com.android.systemui.statusbar.mockCommandQueueCallbacks
+
+var Kosmos.commandQueueInitializer by
+    Kosmos.Fixture {
+        CommandQueueInitializer(
+            testableContext,
+            fakeCommandQueue,
+            { mockCommandQueueCallbacks },
+            fakeStatusBarModeRepository,
+            initController,
+            fakeStatusBarService,
+            mockNavigationBarController,
+        )
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/FakeStatusBarInitializer.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/FakeStatusBarInitializer.kt
new file mode 100644
index 0000000..edd6604
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/FakeStatusBarInitializer.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.core
+
+import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewUpdatedListener
+import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions
+import com.android.systemui.statusbar.phone.PhoneStatusBarViewController
+
+class FakeStatusBarInitializer(
+    private val statusBarViewController: PhoneStatusBarViewController,
+    private val statusBarTransitions: PhoneStatusBarTransitions,
+) : StatusBarInitializer {
+
+    override var statusBarViewUpdatedListener: OnStatusBarViewUpdatedListener? = null
+        set(value) {
+            field = value
+            value?.onStatusBarViewUpdated(statusBarViewController, statusBarTransitions)
+        }
+
+    override fun initializeStatusBar() {}
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarInitializerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarInitializerKosmos.kt
new file mode 100644
index 0000000..d103200
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarInitializerKosmos.kt
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.core
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.statusbar.phone.phoneStatusBarTransitions
+import com.android.systemui.statusbar.phone.phoneStatusBarViewController
+
+val Kosmos.fakeStatusBarInitializer by
+    Kosmos.Fixture {
+        FakeStatusBarInitializer(phoneStatusBarViewController, phoneStatusBarTransitions)
+    }
+
+var Kosmos.statusBarInitializer by Kosmos.Fixture { fakeStatusBarInitializer }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarOrchestratorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarOrchestratorKosmos.kt
new file mode 100644
index 0000000..c53e44d
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarOrchestratorKosmos.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.core
+
+import com.android.systemui.bouncer.domain.interactor.primaryBouncerInteractor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.mockDemoModeController
+import com.android.systemui.plugins.mockPluginDependencyProvider
+import com.android.systemui.power.domain.interactor.powerInteractor
+import com.android.systemui.shade.mockNotificationShadeWindowViewController
+import com.android.systemui.shade.mockShadeSurface
+import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository
+import com.android.systemui.statusbar.mockNotificationRemoteInputManager
+import com.android.systemui.statusbar.phone.mockAutoHideController
+import com.android.systemui.statusbar.window.data.repository.statusBarWindowStateRepositoryStore
+import com.android.systemui.statusbar.window.fakeStatusBarWindowController
+import com.android.wm.shell.bubbles.bubblesOptional
+
+val Kosmos.statusBarOrchestrator by
+    Kosmos.Fixture {
+        StatusBarOrchestrator(
+            applicationCoroutineScope,
+            fakeStatusBarInitializer,
+            fakeStatusBarWindowController,
+            fakeStatusBarModeRepository,
+            mockDemoModeController,
+            mockPluginDependencyProvider,
+            mockAutoHideController,
+            mockNotificationRemoteInputManager,
+            { mockNotificationShadeWindowViewController },
+            mockShadeSurface,
+            bubblesOptional,
+            statusBarWindowStateRepositoryStore,
+            powerInteractor,
+            primaryBouncerInteractor,
+        )
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/domain/interactor/SeenNotificationsInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/domain/interactor/SeenNotificationsInteractorKosmos.kt
index b19e221..3d2bd6c 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/domain/interactor/SeenNotificationsInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/domain/interactor/SeenNotificationsInteractorKosmos.kt
@@ -45,3 +45,17 @@
             UserHandle.USER_CURRENT,
         )
     }
+
+var Kosmos.lockScreenNotificationMinimalismSetting: Boolean
+    get() =
+        fakeSettings.getIntForUser(
+            Settings.Secure.LOCK_SCREEN_NOTIFICATION_MINIMALISM,
+            UserHandle.USER_CURRENT,
+        ) == 1
+    set(value) {
+        fakeSettings.putIntForUser(
+            Settings.Secure.LOCK_SCREEN_NOTIFICATION_MINIMALISM,
+            if (value) 1 else 0,
+            UserHandle.USER_CURRENT,
+        )
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModelKosmos.kt
new file mode 100644
index 0000000..ca33a86
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModelKosmos.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.notification.emptyshade.ui.viewmodel
+
+import android.content.applicationContext
+import com.android.systemui.dump.dumpManager
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.shared.notifications.domain.interactor.notificationSettingsInteractor
+import com.android.systemui.statusbar.notification.domain.interactor.seenNotificationsInteractor
+import com.android.systemui.statusbar.policy.domain.interactor.zenModeInteractor
+
+val Kosmos.emptyShadeViewModel by
+    Kosmos.Fixture {
+        EmptyShadeViewModel(
+            applicationContext,
+            zenModeInteractor,
+            seenNotificationsInteractor,
+            notificationSettingsInteractor,
+            testDispatcher,
+            dumpManager,
+        )
+    }
+
+val Kosmos.emptyShadeViewModelFactory: EmptyShadeViewModel.Factory by
+    Kosmos.Fixture {
+        object : EmptyShadeViewModel.Factory {
+            override fun create() = emptyShadeViewModel
+        }
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt
index 2eb1573..fc4f05d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt
@@ -222,8 +222,6 @@
                     Mockito.mock(NotifRemoteViewCache::class.java, STUB_ONLY),
                     remoteInputManager,
                     conversationProcessor,
-                    Mockito.mock(RichOngoingNotificationContentExtractor::class.java, STUB_ONLY),
-                    Mockito.mock(RichOngoingNotificationViewInflater::class.java, STUB_ONLY),
                     Mockito.mock(Executor::class.java, STUB_ONLY),
                     smartReplyStateInflater,
                     notifLayoutInflaterFactoryProvider,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/data/repository/NotificationRowRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/data/repository/NotificationRowRepositoryKosmos.kt
deleted file mode 100644
index 84ef4b5..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/data/repository/NotificationRowRepositoryKosmos.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.data.repository
-
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.kosmos.Kosmos.Fixture
-import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel
-import kotlinx.coroutines.flow.MutableStateFlow
-
-val Kosmos.fakeNotificationRowRepository by Fixture { FakeNotificationRowRepository() }
-
-class FakeNotificationRowRepository : NotificationRowRepository {
-    override val richOngoingContentModel = MutableStateFlow<RichOngoingContentModel?>(null)
-}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/domain/interactor/NotificationRowInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/domain/interactor/NotificationRowInteractorKosmos.kt
deleted file mode 100644
index 3a7d7ba..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/domain/interactor/NotificationRowInteractorKosmos.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.domain.interactor
-
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.statusbar.notification.row.data.repository.NotificationRowRepository
-
-fun Kosmos.getNotificationRowInteractor(repository: NotificationRowRepository) =
-    NotificationRowInteractor(repository = repository)
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModelKosmos.kt
deleted file mode 100644
index 7e51135..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModelKosmos.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.ui.viewmodel
-
-import com.android.systemui.dump.dumpManager
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.statusbar.notification.row.data.repository.NotificationRowRepository
-import com.android.systemui.statusbar.notification.row.domain.interactor.getNotificationRowInteractor
-
-fun Kosmos.getEnRouteViewModel(repository: NotificationRowRepository) =
-    EnRouteViewModel(
-        dumpManager = dumpManager,
-        rowInteractor = getNotificationRowInteractor(repository),
-    )
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModelKosmos.kt
deleted file mode 100644
index 00f45b2..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModelKosmos.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2024 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.systemui.statusbar.notification.row.ui.viewmodel
-
-import com.android.systemui.dump.dumpManager
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.statusbar.notification.row.data.repository.NotificationRowRepository
-import com.android.systemui.statusbar.notification.row.domain.interactor.getNotificationRowInteractor
-
-fun Kosmos.getTimerViewModel(repository: NotificationRowRepository) =
-    TimerViewModel(
-        dumpManager = dumpManager,
-        rowInteractor = getNotificationRowInteractor(repository),
-    )
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelKosmos.kt
index de8b350..c3bc744 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelKosmos.kt
@@ -23,13 +23,12 @@
 import com.android.systemui.shade.domain.interactor.shadeInteractor
 import com.android.systemui.statusbar.domain.interactor.remoteInputInteractor
 import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor
-import com.android.systemui.statusbar.notification.domain.interactor.seenNotificationsInteractor
+import com.android.systemui.statusbar.notification.emptyshade.ui.viewmodel.emptyShadeViewModelFactory
 import com.android.systemui.statusbar.notification.footer.ui.viewmodel.footerViewModel
 import com.android.systemui.statusbar.notification.shelf.ui.viewmodel.notificationShelfViewModel
 import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor
 import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationStackInteractor
 import com.android.systemui.statusbar.policy.domain.interactor.userSetupInteractor
-import com.android.systemui.statusbar.policy.domain.interactor.zenModeInteractor
 import java.util.Optional
 
 val Kosmos.notificationListViewModel by Fixture {
@@ -37,15 +36,14 @@
         notificationShelfViewModel,
         hideListViewModel,
         Optional.of(footerViewModel),
+        emptyShadeViewModelFactory,
         Optional.of(notificationListLoggerViewModel),
         activeNotificationsInteractor,
         notificationStackInteractor,
         headsUpNotificationInteractor,
         remoteInputInteractor,
-        seenNotificationsInteractor,
         shadeInteractor,
         userSetupInteractor,
-        zenModeInteractor,
         testDispatcher,
         dumpManager,
     )
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt
index a9e117a..237f7e4 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt
@@ -42,6 +42,7 @@
 import com.android.systemui.keyguard.ui.viewmodel.occludedToAodTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.occludedToGoneTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.occludedToLockscreenTransitionViewModel
+import com.android.systemui.keyguard.ui.viewmodel.offToLockscreenTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.primaryBouncerToGoneTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.primaryBouncerToLockscreenTransitionViewModel
 import com.android.systemui.kosmos.Kosmos
@@ -85,6 +86,7 @@
         occludedToAodTransitionViewModel = occludedToAodTransitionViewModel,
         occludedToGoneTransitionViewModel = occludedToGoneTransitionViewModel,
         occludedToLockscreenTransitionViewModel = occludedToLockscreenTransitionViewModel,
+        offToLockscreenTransitionViewModel = offToLockscreenTransitionViewModel,
         primaryBouncerToGoneTransitionViewModel = primaryBouncerToGoneTransitionViewModel,
         primaryBouncerToLockscreenTransitionViewModel =
             primaryBouncerToLockscreenTransitionViewModel,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/AutoHideKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/AutoHideKosmos.kt
new file mode 100644
index 0000000..090ce31
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/AutoHideKosmos.kt
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.phone
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
+
+val Kosmos.mockAutoHideController by Kosmos.Fixture { mock<AutoHideController>() }
+
+var Kosmos.autoHideController by Kosmos.Fixture { mockAutoHideController }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/PhoneStatusBarKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/PhoneStatusBarKosmos.kt
new file mode 100644
index 0000000..603ee08
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/PhoneStatusBarKosmos.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.phone
+
+import com.android.systemui.kosmos.Kosmos
+import org.mockito.Mockito.mock
+
+val Kosmos.mockPhoneStatusBarViewController: PhoneStatusBarViewController by
+    Kosmos.Fixture { mock(PhoneStatusBarViewController::class.java) }
+
+var Kosmos.phoneStatusBarViewController by Kosmos.Fixture { mockPhoneStatusBarViewController }
+
+val Kosmos.mockPhoneStatusBarTransitions: PhoneStatusBarTransitions by
+    Kosmos.Fixture { mock(PhoneStatusBarTransitions::class.java) }
+
+var Kosmos.phoneStatusBarTransitions by Kosmos.Fixture { mockPhoneStatusBarTransitions }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileTelephonyHelpers.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileTelephonyHelpers.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileTelephonyHelpers.kt
rename to packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileTelephonyHelpers.kt
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt
new file mode 100644
index 0000000..528c9d9
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.window
+
+import android.view.View
+import android.view.ViewGroup
+import com.android.systemui.animation.ActivityTransitionAnimator
+import com.android.systemui.fragments.FragmentHostManager
+import java.util.Optional
+
+class FakeStatusBarWindowController : StatusBarWindowController {
+
+    var isAttached = false
+        private set
+
+    override val statusBarHeight: Int = 0
+
+    override fun refreshStatusBarHeight() {}
+
+    override fun attach() {
+        isAttached = true
+    }
+
+    override fun addViewToWindow(view: View, layoutParams: ViewGroup.LayoutParams) {}
+
+    override val backgroundView: View
+        get() = throw NotImplementedError()
+
+    override val fragmentHostManager: FragmentHostManager
+        get() = throw NotImplementedError()
+
+    override fun wrapAnimationControllerIfInStatusBar(
+        rootView: View,
+        animationController: ActivityTransitionAnimator.Controller,
+    ): Optional<ActivityTransitionAnimator.Controller> = Optional.empty()
+
+    override fun setForceStatusBarVisible(forceStatusBarVisible: Boolean) {}
+
+    override fun setOngoingProcessRequiresStatusBarVisible(visible: Boolean) {}
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/StatusBarWindowControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/StatusBarWindowControllerKosmos.kt
new file mode 100644
index 0000000..c198b35
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/StatusBarWindowControllerKosmos.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.window
+
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.fakeStatusBarWindowController by Kosmos.Fixture { FakeStatusBarWindowController() }
+
+var Kosmos.statusBarWindowController by Kosmos.Fixture { fakeStatusBarWindowController }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/FakeStatusBarWindowStatePerDisplayRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/FakeStatusBarWindowStatePerDisplayRepository.kt
new file mode 100644
index 0000000..6532a7e
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/FakeStatusBarWindowStatePerDisplayRepository.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 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.systemui.statusbar.window.data.repository
+
+import android.view.Display
+import com.android.systemui.statusbar.window.data.model.StatusBarWindowState
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+
+class FakeStatusBarWindowStateRepositoryStore : StatusBarWindowStateRepositoryStore {
+
+    private val perDisplayRepos = mutableMapOf<Int, FakeStatusBarWindowStatePerDisplayRepository>()
+
+    override val defaultDisplay: FakeStatusBarWindowStatePerDisplayRepository =
+        forDisplay(Display.DEFAULT_DISPLAY)
+
+    override fun forDisplay(displayId: Int): FakeStatusBarWindowStatePerDisplayRepository =
+        perDisplayRepos.computeIfAbsent(displayId) {
+            FakeStatusBarWindowStatePerDisplayRepository()
+        }
+}
+
+class FakeStatusBarWindowStatePerDisplayRepository : StatusBarWindowStatePerDisplayRepository {
+
+    private val _windowState = MutableStateFlow(StatusBarWindowState.Hidden)
+
+    override val windowState = _windowState.asStateFlow()
+
+    fun setWindowState(state: StatusBarWindowState) {
+        _windowState.value = state
+    }
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/StatusBarWindowStateRepositoryStoreKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/StatusBarWindowStateRepositoryStoreKosmos.kt
index e2b7f5f..2205a3b 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/StatusBarWindowStateRepositoryStoreKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/data/repository/StatusBarWindowStateRepositoryStoreKosmos.kt
@@ -21,6 +21,9 @@
 import com.android.systemui.settings.displayTracker
 import com.android.systemui.statusbar.commandQueue
 
+val Kosmos.fakeStatusBarWindowStateRepositoryStore by
+    Kosmos.Fixture { FakeStatusBarWindowStateRepositoryStore() }
+
 class KosmosStatusBarWindowStatePerDisplayRepositoryFactory(private val kosmos: Kosmos) :
     StatusBarWindowStatePerDisplayRepositoryFactory {
     override fun create(displayId: Int): StatusBarWindowStatePerDisplayRepositoryImpl {
@@ -32,7 +35,7 @@
     }
 }
 
-val Kosmos.statusBarWindowStateRepositoryStore by
+var Kosmos.statusBarWindowStateRepositoryStore: StatusBarWindowStateRepositoryStore by
     Kosmos.Fixture {
         StatusBarWindowStateRepositoryStoreImpl(
             displayId = displayTracker.defaultDisplayId,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/stylus/FixedCapacityBatteryState.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/stylus/FixedCapacityBatteryState.kt
similarity index 100%
rename from packages/SystemUI/tests/src/com/android/systemui/stylus/FixedCapacityBatteryState.kt
rename to packages/SystemUI/tests/utils/src/com/android/systemui/stylus/FixedCapacityBatteryState.kt
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/NoUiThreadTestRule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/util/NoUiThreadTestRule.kt
new file mode 100644
index 0000000..e4c793d
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/util/NoUiThreadTestRule.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2024 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.systemui.util
+
+import android.testing.UiThreadTest
+import org.junit.Assert.fail
+import org.junit.rules.MethodRule
+import org.junit.runners.model.FrameworkMethod
+import org.junit.runners.model.Statement
+
+/**
+ * A Test rule which prevents us from using the UiThreadTest annotation. See
+ * go/android_junit4_uithreadtest (b/352170965)
+ */
+public class NoUiThreadTestRule : MethodRule {
+    override fun apply(base: Statement, method: FrameworkMethod, target: Any): Statement? {
+        if (hasUiThreadAnnotation(method, target)) {
+            fail("UiThreadTest doesn't actually run on the UiThread")
+        }
+        return base
+    }
+
+    private fun hasUiThreadAnnotation(method: FrameworkMethod, target: Any): Boolean {
+        if (method.getAnnotation(UiThreadTest::class.java) != null) {
+            return true
+        } else {
+            return target.javaClass.getAnnotation(UiThreadTest::class.java) != null
+        }
+    }
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/NoUiThreadTestRuleTest.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/util/NoUiThreadTestRuleTest.kt
new file mode 100644
index 0000000..70dd103
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/util/NoUiThreadTestRuleTest.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2024 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.systemui.util
+
+import android.testing.UiThreadTest
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import java.lang.AssertionError
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.model.FrameworkMethod
+import org.junit.runners.model.Statement
+
+/**
+ * Test that NoUiThreadTestRule asserts when it finds a framework method with a UiThreadTest
+ * annotation.
+ */
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+public class NoUiThreadTestRuleTest : SysuiTestCase() {
+
+    class TestStatement : Statement() {
+        override fun evaluate() {}
+    }
+
+    inner class TestInner {
+        @Test @UiThreadTest fun simpleUiTest() {}
+
+        @Test fun simpleTest() {}
+    }
+
+    /**
+     * Test that NoUiThreadTestRule throws an asserts false if a test is annotated
+     * with @UiThreadTest
+     */
+    @Test(expected = AssertionError::class)
+    fun testNoUiThreadFail() {
+        val method = TestInner::class.java.getDeclaredMethod("simpleUiTest")
+        val frameworkMethod = FrameworkMethod(method)
+        val noUiThreadTestRule = NoUiThreadTestRule()
+        val testStatement = TestStatement()
+        // target needs to be non-null
+        val obj = Object()
+        noUiThreadTestRule.apply(testStatement, frameworkMethod, obj)
+    }
+
+    /**
+     * Test that NoUiThreadTestRule throws an asserts false if a test is annotated
+     * with @UiThreadTest
+     */
+    fun testNoUiThreadOK() {
+        val method = TestInner::class.java.getDeclaredMethod("simpleUiTest")
+        val frameworkMethod = FrameworkMethod(method)
+        val noUiThreadTestRule = NoUiThreadTestRule()
+        val testStatement = TestStatement()
+
+        // because target needs to be non-null
+        val obj = Object()
+        val newStatement = noUiThreadTestRule.apply(testStatement, frameworkMethod, obj)
+        Assert.assertEquals(newStatement, testStatement)
+    }
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/UiThread.java b/packages/SystemUI/tests/utils/src/com/android/systemui/util/UiThread.java
new file mode 100644
index 0000000..f81b7de
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/util/UiThread.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2023 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.systemui.util;
+
+import android.os.Looper;
+import android.util.Log;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
+
+/**
+ * A class to launch runnables on the UI thread explicitly.
+ */
+public class UiThread {
+    private static final String TAG = "UiThread";
+
+    /**
+     * Run a runnable on the UI thread using instrumentation.runOnMainSync.
+     *
+     * @param runnable code to run on the UI thread.
+     * @throws Throwable if the code threw an exception, so it can be reported
+     * to the test.
+     */
+    public static void runOnUiThread(final Runnable runnable) throws Throwable {
+        if (Looper.myLooper() == Looper.getMainLooper()) {
+            Log.w(
+                    TAG,
+                    "UiThread.runOnUiThread() should not be called from the "
+                        + "main application thread");
+            runnable.run();
+        } else {
+            FutureTask<Void> task = new FutureTask<>(runnable, null);
+            InstrumentationRegistry.getInstrumentation().runOnMainSync(task);
+            try {
+                task.get();
+            } catch (ExecutionException e) {
+                // Expose the original exception
+                throw e.getCause();
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/UiThreadRunTest.java b/packages/SystemUI/tests/utils/src/com/android/systemui/util/UiThreadRunTest.java
new file mode 100644
index 0000000..abf2e8d
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/util/UiThreadRunTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2023 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.systemui.util;
+
+import android.os.Looper;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+/**
+ * Test that UiThread.runOnUiThread() actually runs on the UI Thread.
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class UiThreadRunTest extends SysuiTestCase {
+
+    @Test
+    public void testUiThread() throws Throwable {
+        UiThread.runOnUiThread(() -> {
+            Assert.assertEquals(Looper.getMainLooper().getThread(), Thread.currentThread());
+        });
+    }
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogCallbacksInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogCallbacksInteractorKosmos.kt
new file mode 100644
index 0000000..db9c48d
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogCallbacksInteractorKosmos.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.domain.interactor
+
+import android.os.Handler
+import android.os.looper
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.plugins.volumeDialogController
+
+val Kosmos.volumeDialogCallbacksInteractor: VolumeDialogCallbacksInteractor by
+    Kosmos.Fixture {
+        VolumeDialogCallbacksInteractor(
+            volumeDialogController = volumeDialogController,
+            coroutineScope = applicationCoroutineScope,
+            bgHandler = Handler(looper),
+        )
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogVisibilityInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogVisibilityInteractorKosmos.kt
new file mode 100644
index 0000000..e73539e
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogVisibilityInteractorKosmos.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2024 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.systemui.volume.dialog.domain.interactor
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.applicationCoroutineScope
+
+val Kosmos.volumeDialogVisibilityInteractor by
+    Kosmos.Fixture {
+        VolumeDialogVisibilityInteractor(applicationCoroutineScope, volumeDialogCallbacksInteractor)
+    }
diff --git a/packages/SystemUI/utils/kairos/Android.bp b/packages/SystemUI/utils/kairos/Android.bp
new file mode 100644
index 0000000..1442591
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/Android.bp
@@ -0,0 +1,49 @@
+//
+// Copyright (C) 2024 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 {
+    default_team: "trendy_team_system_ui_please_use_a_more_specific_subteam_if_possible_",
+    default_applicable_licenses: ["frameworks_base_packages_SystemUI_license"],
+}
+
+java_library {
+    name: "kairos",
+    host_supported: true,
+    kotlincflags: ["-opt-in=com.android.systemui.kairos.ExperimentalFrpApi"],
+    srcs: ["src/**/*.kt"],
+    static_libs: [
+        "kotlin-stdlib",
+        "kotlinx_coroutines",
+    ],
+}
+
+java_test {
+    name: "kairos-test",
+    optimize: {
+        enabled: false,
+    },
+    srcs: [
+        "test/**/*.kt",
+    ],
+    static_libs: [
+        "kairos",
+        "junit",
+        "kotlin-stdlib",
+        "kotlin-test",
+        "kotlinx_coroutines",
+        "kotlinx_coroutines_test",
+    ],
+}
diff --git a/packages/SystemUI/utils/kairos/OWNERS b/packages/SystemUI/utils/kairos/OWNERS
new file mode 100644
index 0000000..8876ad6
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/OWNERS
@@ -0,0 +1,3 @@
+steell@google.com
+nijamkin@google.com
+evanlaird@google.com
diff --git a/packages/SystemUI/utils/kairos/README.md b/packages/SystemUI/utils/kairos/README.md
new file mode 100644
index 0000000..85f622c
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/README.md
@@ -0,0 +1,64 @@
+# Kairos
+
+A functional reactive programming (FRP) library for Kotlin.
+
+This library is **experimental** and should not be used for general production
+code. The APIs within are subject to change, and there may be bugs.
+
+## About FRP
+
+Functional reactive programming is a type of reactive programming system that
+follows a set of clear and composable rules, without sacrificing consistency.
+FRP exposes an API that should be familiar to those versed in Kotlin `Flow`.
+
+### Details for nerds
+
+`Kairos` implements an applicative / monadic flavor of FRP, using a push-pull
+methodology to allow for efficient updates.
+
+"Real" functional reactive programming should be specified with denotational
+semantics ([wikipedia](https://en.wikipedia.org/wiki/Denotational_semantics)):
+you can view the semantics for `Kairos` [here](docs/semantics.md).
+
+## Usage
+
+First, stand up a new `FrpNetwork`. All reactive events and state is kept
+consistent within a single network.
+
+``` kotlin
+val coroutineScope: CoroutineScope = ...
+val frpNetwork = coroutineScope.newFrpNetwork()
+```
+
+You can use the `FrpNetwork` to stand-up a network of reactive events and state.
+Events are modeled with `TFlow` (short for "transactional flow"), and state
+`TState` (short for "transactional state").
+
+``` kotlin
+suspend fun activate(network: FrpNetwork) {
+    network.activateSpec {
+        val input = network.mutableTFlow<Unit>()
+        // Launch a long-running side-effect that emits to the network
+        // every second.
+        launchEffect {
+            while (true) {
+                input.emit(Unit)
+                delay(1.seconds)
+            }
+        }
+        // Accumulate state
+        val count: TState<Int> = input.fold { _, i -> i + 1 }
+        // Observe events to perform side-effects in reaction to them
+        input.observe {
+            println("Got event ${count.sample()} at time: ${System.currentTimeMillis()}")
+        }
+    }
+}
+```
+
+`FrpNetwork.activateSpec` will suspend indefinitely; cancelling the invocation
+will tear-down all effects and obervers running within the lambda.
+
+## Resources
+
+- [Cheatsheet for those coming from Kotlin Flow](docs/flow-to-kairos-cheatsheet.md)
diff --git a/packages/SystemUI/utils/kairos/docs/flow-to-kairos-cheatsheet.md b/packages/SystemUI/utils/kairos/docs/flow-to-kairos-cheatsheet.md
new file mode 100644
index 0000000..9f7fd02
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/docs/flow-to-kairos-cheatsheet.md
@@ -0,0 +1,330 @@
+# From Flows to Kairos
+
+## Key differences
+
+* Kairos evaluates all events (`TFlow` emissions + observers) in a transaction.
+
+* Kairos splits `Flow` APIs into two distinct types: `TFlow` and `TState`
+
+    * `TFlow` is roughly equivalent to `SharedFlow` w/ a replay cache that
+      exists for the duration of the current Kairos transaction and shared with
+      `SharingStarted.WhileSubscribed()`
+
+    * `TState` is roughly equivalent to `StateFlow` shared with
+      `SharingStarted.Eagerly`, but the current value can only be queried within
+      a Kairos transaction, and the value is only updated at the end of the
+      transaction
+
+* Kairos further divides `Flow` APIs based on how they internally use state:
+
+  * **FrpTransactionScope:** APIs that internally query some state need to be
+    performed within an Kairos transaction
+
+    * this scope is available from the other scopes, and from most lambdas
+      passed to other Kairos APIs
+
+  * **FrpStateScope:** APIs that internally accumulate state in reaction to
+    events need to be performed within an FRP State scope (akin to a
+    `CoroutineScope`)
+
+    * this scope is a side-effect-free subset of FrpBuildScope, and so can be
+      used wherever you have an FrpBuildScope
+
+  * **FrpBuildScope:** APIs that perform external side-effects (`Flow.collect`)
+    need to be performed within an FRP Build scope (akin to a `CoroutineScope`)
+
+    * this scope is available from `FrpNetwork.activateSpec { … }`
+
+  * All other APIs can be used anywhere
+
+## emptyFlow()
+
+Use `emptyTFlow`
+
+``` kotlin
+// this TFlow emits nothing
+val noEvents: TFlow<Int> = emptyTFlow
+```
+
+## map { … }
+
+Use `TFlow.map` / `TState.map`
+
+``` kotlin
+val anInt: TState<Int> = …
+val squared: TState<Int> = anInt.map { it * it }
+val messages: TFlow<String> = …
+val messageLengths: TFlow<Int> = messages.map { it.size }
+```
+
+## filter { … } / mapNotNull { … }
+
+### I have a TFlow
+
+Use `TFlow.filter` / `TFlow.mapNotNull`
+
+``` kotlin
+val messages: TFlow<String> = …
+val nonEmpty: TFlow<String> = messages.filter { it.isNotEmpty() }
+```
+
+### I have a TState
+
+Convert the `TState` to `TFlow` using `TState.stateChanges`, then use
+`TFlow.filter` / `TFlow.mapNotNull`
+
+If you need to convert back to `TState`, use `TFlow.hold(initialValue)` on the
+result.
+
+``` kotlin
+tState.stateChanges.filter { … }.hold(initialValue)
+```
+
+Note that `TFlow.hold` is only available within an `FrpStateScope` in order to
+track the lifetime of the state accumulation.
+
+## combine(...) { … }
+
+### I have TStates
+
+Use `combine(TStates)`
+
+``` kotlin
+val someInt: TState<Int> = …
+val someString: TState<String> = …
+val model: TState<MyModel> = combine(someInt, someString) { i, s -> MyModel(i, s) }
+```
+
+### I have TFlows
+
+Convert the TFlows to TStates using `TFlow.hold(initialValue)`, then use
+`combine(TStates)`
+
+If you want the behavior of Flow.combine where nothing is emitted until each
+TFlow has emitted at least once, you can use filter:
+
+``` kotlin
+// null used as an example, can use a different sentinel if needed
+combine(tFlowA.hold(null), tFlowB.hold(null)) { a, b ->
+        a?.let { b?.let { … } }
+    }
+    .filterNotNull()
+```
+
+Note that `TFlow.hold` is only available within an `FrpStateScope` in order to
+track the lifetime of the state accumulation.
+
+#### Explanation
+
+`Flow.combine` always tracks the last-emitted value of each `Flow` it's
+combining. This is a form of state-accumulation; internally, it collects from
+each `Flow`, tracks the latest-emitted value, and when anything changes, it
+re-runs the lambda to combine the latest values.
+
+An effect of this is that `Flow.combine` doesn't emit until each combined `Flow`
+has emitted at least once. This often bites developers. As a workaround,
+developers generally append `.onStart { emit(initialValue) }` to the `Flows`
+that don't immediately emit.
+
+Kairos avoids this gotcha by forcing usage of `TState` for `combine`, thus
+ensuring that there is always a current value to be combined for each input.
+
+## collect { … }
+
+Use `observe { … }`
+
+``` kotlin
+val job: Job = tFlow.observe { println("observed: $it") }
+```
+
+Note that `observe` is only available within an `FrpBuildScope` in order to
+track the lifetime of the observer. `FrpBuildScope` can only come from a
+top-level `FrpNetwork.transaction { … }`, or a sub-scope created by using a
+`-Latest` operator.
+
+## sample(flow) { … }
+
+### I want to sample a TState
+
+Use `TState.sample()` to get the current value of a `TState`. This can be
+invoked anywhere you have access to an `FrpTransactionScope`.
+
+``` kotlin
+// the lambda passed to map receives an FrpTransactionScope, so it can invoke
+// sample
+tFlow.map { tState.sample() }
+```
+
+#### Explanation
+
+To keep all state-reads consistent, the current value of a TState can only be
+queried within a Kairos transaction, modeled with `FrpTransactionScope`. Note
+that both `FrpStateScope` and `FrpBuildScope` extend `FrpTransactionScope`.
+
+### I want to sample a TFlow
+
+Convert to a `TState` by using `TFlow.hold(initialValue)`, then use `sample`.
+
+Note that `hold` is only available within an `FrpStateScope` in order to track
+the lifetime of the state accumulation.
+
+## stateIn(scope, sharingStarted, initialValue)
+
+Use `TFlow.hold(initialValue)`. There is no need to supply a sharingStarted
+argument; all states are accumulated eagerly.
+
+``` kotlin
+val ints: TFlow<Int> = …
+val lastSeenInt: TState<Int> = ints.hold(initialValue = 0)
+```
+
+Note that `hold` is only available within an `FrpStateScope` in order to track
+the lifetime of the state accumulation (akin to the scope parameter of
+`Flow.stateIn`). `FrpStateScope` can only come from a top-level
+`FrpNetwork.transaction { … }`, or a sub-scope created by using a `-Latest`
+operator. Also note that `FrpBuildScope` extends `FrpStateScope`.
+
+## distinctUntilChanged()
+
+Use `distinctUntilChanged` like normal. This is only available for `TFlow`;
+`TStates` are already `distinctUntilChanged`.
+
+## merge(...)
+
+### I have TFlows
+
+Use `merge(TFlows) { … }`. The lambda argument is used to disambiguate multiple
+simultaneous emissions within the same transaction.
+
+#### Explanation
+
+Under Kairos's rules, a `TFlow` may only emit up to once per transaction. This
+means that if we are merging two or more `TFlows` that are emitting at the same
+time (within the same transaction), the resulting merged `TFlow` must emit a
+single value. The lambda argument allows the developer to decide what to do in
+this case.
+
+### I have TStates
+
+If `combine` doesn't satisfy your needs, you can use `TState.stateChanges` to
+convert to a `TFlow`, and then `merge`.
+
+## conflatedCallbackFlow { … }
+
+Use `tFlow { … }`.
+
+As a shortcut, if you already have a `conflatedCallbackFlow { … }`, you can
+convert it to a TFlow via `Flow.toTFlow()`.
+
+Note that `tFlow` is only available within an `FrpBuildScope` in order to track
+the lifetime of the input registration.
+
+## first()
+
+### I have a TState
+
+Use `TState.sample`.
+
+### I have a TFlow
+
+Use `TFlow.nextOnly`, which works exactly like `Flow.first` but instead of
+suspending it returns a `TFlow` that emits once.
+
+The naming is intentionally different because `first` implies that it is the
+first-ever value emitted from the `Flow` (which makes sense for cold `Flows`),
+whereas `nextOnly` indicates that only the next value relative to the current
+transaction (the one `nextOnly` is being invoked in) will be emitted.
+
+Note that `nextOnly` is only available within an `FrpStateScope` in order to
+track the lifetime of the state accumulation.
+
+## flatMapLatest { … }
+
+If you want to use -Latest to cancel old side-effects, similar to what the Flow
+-Latest operators offer for coroutines, see `mapLatest`.
+
+### I have a TState…
+
+#### …and want to switch TStates
+
+Use `TState.flatMap`
+
+``` kotlin
+val flattened = tState.flatMap { a -> getTState(a) }
+```
+
+#### …and want to switch TFlows
+
+Use `TState<TFlow<T>>.switch()`
+
+``` kotlin
+val tFlow = tState.map { a -> getTFlow(a) }.switch()
+```
+
+### I have a TFlow…
+
+#### …and want to switch TFlows
+
+Use `hold` to convert to a `TState<TFlow<T>>`, then use `switch` to switch to
+the latest `TFlow`.
+
+``` kotlin
+val tFlow = tFlowOfFlows.hold(emptyTFlow).switch()
+```
+
+#### …and want to switch TStates
+
+Use `hold` to convert to a `TState<TState<T>>`, then use `flatMap` to switch to
+the latest `TState`.
+
+``` kotlin
+val tState = tFlowOfStates.hold(tStateOf(initialValue)).flatMap { it }
+```
+
+## mapLatest { … } / collectLatest { … }
+
+`FrpStateScope` and `FrpBuildScope` both provide `-Latest` operators that
+automatically cancel old work when new values are emitted.
+
+``` kotlin
+val currentModel: TState<SomeModel> = …
+val mapped: TState<...> = currentModel.mapLatestBuild { model ->
+    effect { "new model in the house: $model" }
+    model.someState.observe { "someState: $it" }
+    val someData: TState<SomeInfo> =
+        getBroadcasts(model.uri)
+            .map { extractInfo(it) }
+            .hold(initialInfo)
+    …
+}
+```
+
+## flowOf(...)
+
+### I want a TState
+
+Use `tStateOf(initialValue)`.
+
+### I want a TFlow
+
+Use `now.map { initialValue }`
+
+Note that `now` is only available within an `FrpTransactionScope`.
+
+#### Explanation
+
+`TFlows` are not cold, and so there isn't a notion of "emit this value once
+there is a collector" like there is for `Flow`. The closest analog would be
+`TState`, since the initial value is retained indefinitely until there is an
+observer. However, it is often useful to immediately emit a value within the
+current transaction, usually when using a `flatMap` or `switch`. In these cases,
+using `now` explicitly models that the emission will occur within the current
+transaction.
+
+``` kotlin
+fun <T> FrpTransactionScope.tFlowOf(value: T): TFlow<T> = now.map { value }
+```
+
+## MutableStateFlow / MutableSharedFlow
+
+Use `MutableTState(frpNetwork, initialValue)` and `MutableTFlow(frpNetwork)`.
diff --git a/packages/SystemUI/utils/kairos/docs/semantics.md b/packages/SystemUI/utils/kairos/docs/semantics.md
new file mode 100644
index 0000000..d43bb44
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/docs/semantics.md
@@ -0,0 +1,225 @@
+# FRP Semantics
+
+`Kairos`'s pure API is based off of the following denotational semantics
+([wikipedia](https://en.wikipedia.org/wiki/Denotational_semantics)).
+
+The semantics model `Kairos` types as time-varying values; by making `Time` a
+first-class value, we can define a referentially-transparent API that allows us
+to reason about the behavior of the pure `Kairos` combinators. This is
+implementation-agnostic; we can compare the behavior of any implementation with
+expected behavior denoted by these semantics to identify bugs.
+
+The semantics are written in pseudo-Kotlin; places where we are deviating from
+real Kotlin are noted with comments.
+
+``` kotlin
+
+sealed class Time : Comparable<Time> {
+  object BigBang : Time()
+  data class At(time: BigDecimal) : Time()
+  object Infinity : Time()
+
+  override final fun compareTo(other: Time): Int =
+    when (this) {
+      BigBang -> if (other === BigBang) 0 else -1
+      is At -> when (other) {
+        BigBang -> 1
+        is At -> time.compareTo(other.time)
+        Infinity -> -1
+      }
+      Infinity -> if (other === Infinity) 0 else 1
+    }
+}
+
+typealias Transactional<T> = (Time) -> T
+
+typealias TFlow<T> = SortedMap<Time, T>
+
+private fun <T> SortedMap<Time, T>.pairwise(): List<Pair<Pair<Time, T>, Pair<Time<T>>>> =
+  // NOTE: pretend evaluation is lazy, so that error() doesn't immediately throw
+  (toList() + Pair(Time.Infinity, error("no value"))).zipWithNext()
+
+class TState<T> internal constructor(
+  internal val current: Transactional<T>,
+  val stateChanges: TFlow<T>,
+)
+
+val emptyTFlow: TFlow<Nothing> = emptyMap()
+
+fun <A, B> TFlow<A>.map(f: FrpTransactionScope.(A) -> B): TFlow<B> =
+  mapValues { (t, a) -> FrpTransactionScope(t).f(a) }
+
+fun <A> TFlow<A>.filter(f: FrpTransactionScope.(A) -> Boolean): TFlow<A> =
+  filter { (t, a) -> FrpTransactionScope(t).f(a) }
+
+fun <A> merge(
+  first: TFlow<A>,
+  second: TFlow<A>,
+  onCoincidence: Time.(A, A) -> A,
+): TFlow<A> =
+  first.toMutableMap().also { result ->
+    second.forEach { (t, a) ->
+      result.merge(t, a) { f, s ->
+        FrpTranscationScope(t).onCoincidence(f, a)
+      }
+    }
+  }.toSortedMap()
+
+fun <A> TState<TFlow<A>>.switch(): TFlow<A> {
+  val truncated = listOf(Pair(Time.BigBang, current.invoke(Time.BigBang))) +
+    stateChanges.dropWhile { (time, _) -> time < time0 }
+  val events =
+    truncated
+      .pairwise()
+      .flatMap { ((t0, sa), (t2, _)) ->
+        sa.filter { (t1, a) -> t0 < t1 && t1 <= t2 }
+      }
+  return events.toSortedMap()
+}
+
+fun <A> TState<TFlow<A>>.switchPromptly(): TFlow<A> {
+  val truncated = listOf(Pair(Time.BigBang, current.invoke(Time.BigBang))) +
+    stateChanges.dropWhile { (time, _) -> time < time0 }
+  val events =
+    truncated
+      .pairwise()
+      .flatMap { ((t0, sa), (t2, _)) ->
+        sa.filter { (t1, a) -> t0 <= t1 && t1 <= t2 }
+      }
+  return events.toSortedMap()
+}
+
+typealias GroupedTFlow<K, V> = TFlow<Map<K, V>>
+
+fun <K, V> TFlow<Map<K, V>>.groupByKey(): GroupedTFlow<K, V> = this
+
+fun <K, V> GroupedTFlow<K, V>.eventsForKey(key: K): TFlow<V> =
+  map { m -> m[k] }.filter { it != null }.map { it!! }
+
+fun <A, B> TState<A>.map(f: (A) -> B): TState<B> =
+  TState(
+    current = { t -> f(current.invoke(t)) },
+    stateChanges = stateChanges.map { f(it) },
+  )
+
+fun <A, B, C> TState<A>.combineWith(
+  other: TState<B>,
+  f: (A, B) -> C,
+): TState<C> =
+  TState(
+    current = { t -> f(current.invoke(t), other.current.invoke(t)) },
+    stateChanges = run {
+      val aChanges =
+        stateChanges
+          .map { a ->
+            val b = other.current.sample()
+            Triple(a, b, f(a, b))
+          }
+      val bChanges =
+        other
+          .stateChanges
+          .map { b ->
+            val a = current.sample()
+            Triple(a, b, f(a, b))
+          }
+      merge(aChanges, bChanges) { (a, _, _), (_, b, _) ->
+          Triple(a, b, f(a, b))
+        }
+        .map { (_, _, zipped) -> zipped }
+    },
+  )
+
+fun <A> TState<TState<A>>.flatten(): TState<A> {
+  val changes =
+    stateChanges
+      .pairwise()
+      .flatMap { ((t0, oldInner), (t2, _)) ->
+        val inWindow =
+          oldInner
+            .stateChanges
+            .filter { (t1, b) -> t0 <= t1 && t1 < t2 }
+        if (inWindow.firstOrNull()?.time != t0) {
+          listOf(Pair(t0, oldInner.current.invoke(t0))) + inWindow
+        } else {
+          inWindow
+        }
+      }
+  return TState(
+    current = { t -> current.invoke(t).current.invoke(t) },
+    stateChanges = changes.toSortedMap(),
+  )
+}
+
+open class FrpTranscationScope internal constructor(
+  internal val currentTime: Time,
+) {
+  val now: TFlow<Unit> =
+    sortedMapOf(currentTime to Unit)
+
+  fun <A> Transactional<A>.sample(): A =
+    invoke(currentTime)
+
+  fun <A> TState<A>.sample(): A =
+    current.sample()
+}
+
+class FrpStateScope internal constructor(
+  time: Time,
+  internal val stopTime: Time,
+): FrpTransactionScope(time) {
+
+  fun <A, B> TFlow<A>.fold(
+    initialValue: B,
+    f: FrpTransactionScope.(B, A) -> B,
+  ): TState<B> {
+    val truncated =
+      dropWhile { (t, _) -> t < currentTime }
+        .takeWhile { (t, _) -> t <= stopTime }
+    val folded =
+      truncated
+        .scan(Pair(currentTime, initialValue)) { (_, b) (t, a) ->
+          Pair(t, FrpTransactionScope(t).f(a, b))
+        }
+    val lookup = { t1 ->
+      folded.lastOrNull { (t0, _) -> t0 < t1 }?.value ?: initialValue
+    }
+    return TState(lookup, folded.toSortedMap())
+  }
+
+  fun <A> TFlow<A>.hold(initialValue: A): TState<A> =
+    fold(initialValue) { _, a -> a }
+
+  fun <K, V> TFlow<Map<K, Maybe<V>>>.foldMapIncrementally(
+    initialValues: Map<K, V>
+  ): TState<Map<K, V>> =
+    fold(initialValues) { patch, map ->
+      val eithers = patch.map { (k, v) ->
+        if (v is Just) Left(k to v.value) else Right(k)
+      }
+      val adds = eithers.filterIsInstance<Left>().map { it.left }
+      val removes = eithers.filterIsInstance<Right>().map { it.right }
+      val removed: Map<K, V> = map - removes.toSet()
+      val updated: Map<K, V> = removed + adds
+      updated
+    }
+
+  fun <K : Any, V> TFlow<Map<K, Maybe<TFlow<V>>>>.mergeIncrementally(
+    initialTFlows: Map<K, TFlow<V>>,
+  ): TFlow<Map<K, V>> =
+    foldMapIncrementally(initialTFlows).map { it.merge() }.switch()
+
+  fun <K, A, B> TFlow<Map<K, Maybe<A>>.mapLatestStatefulForKey(
+    transform: suspend FrpStateScope.(A) -> B,
+  ): TFlow<Map<K, Maybe<B>>> =
+    pairwise().map { ((t0, patch), (t1, _)) ->
+      patch.map { (k, ma) ->
+        ma.map { a ->
+          FrpStateScope(t0, t1).transform(a)
+        }
+      }
+    }
+  }
+
+}
+
+```
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt
new file mode 100644
index 0000000..8bf3a43
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos
+
+import com.android.systemui.kairos.util.These
+import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.none
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.channelFlow
+import kotlinx.coroutines.flow.conflate
+
+/**
+ * Returns a [TFlow] that emits the value sampled from the [Transactional] produced by each emission
+ * of the original [TFlow], within the same transaction of the original emission.
+ */
+fun <A> TFlow<Transactional<A>>.sampleTransactionals(): TFlow<A> = map { it.sample() }
+
+/** @see FrpTransactionScope.sample */
+fun <A, B, C> TFlow<A>.sample(
+    state: TState<B>,
+    transform: suspend FrpTransactionScope.(A, B) -> C,
+): TFlow<C> = map { transform(it, state.sample()) }
+
+/** @see FrpTransactionScope.sample */
+fun <A, B, C> TFlow<A>.sample(
+    transactional: Transactional<B>,
+    transform: suspend FrpTransactionScope.(A, B) -> C,
+): TFlow<C> = map { transform(it, transactional.sample()) }
+
+/**
+ * Like [sample], but if [state] is changing at the time it is sampled ([stateChanges] is emitting),
+ * then the new value is passed to [transform].
+ *
+ * Note that [sample] is both more performant, and safer to use with recursive definitions. You will
+ * generally want to use it rather than this.
+ *
+ * @see sample
+ */
+fun <A, B, C> TFlow<A>.samplePromptly(
+    state: TState<B>,
+    transform: suspend FrpTransactionScope.(A, B) -> C,
+): TFlow<C> =
+    sample(state) { a, b -> These.thiz<Pair<A, B>, B>(a to b) }
+        .mergeWith(state.stateChanges.map { These.that(it) }) { thiz, that ->
+            These.both((thiz as These.This).thiz, (that as These.That).that)
+        }
+        .mapMaybe { these ->
+            when (these) {
+                // both present, transform the upstream value and the new value
+                is These.Both -> just(transform(these.thiz.first, these.that))
+                // no upstream present, so don't perform the sample
+                is These.That -> none()
+                // just the upstream, so transform the upstream and the old value
+                is These.This -> just(transform(these.thiz.first, these.thiz.second))
+            }
+        }
+
+/**
+ * Returns a [TState] containing a map with a snapshot of the current state of each [TState] in the
+ * original map.
+ */
+fun <K, A> Map<K, TState<A>>.combineValues(): TState<Map<K, A>> =
+    asIterable()
+        .map { (k, state) -> state.map { v -> k to v } }
+        .combine()
+        .map { entries -> entries.toMap() }
+
+/**
+ * Returns a cold [Flow] that, when collected, emits from this [TFlow]. [network] is needed to
+ * transactionally connect to / disconnect from the [TFlow] when collection starts/stops.
+ */
+fun <A> TFlow<A>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
+    channelFlow { network.activateSpec { observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, emits from this [TState]. [network] is needed to
+ * transactionally connect to / disconnect from the [TState] when collection starts/stops.
+ */
+fun <A> TState<A>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
+    channelFlow { network.activateSpec { observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, applies this [FrpSpec] in a new transaction in this
+ * [network], and then emits from the returned [TFlow].
+ *
+ * When collection is cancelled, so is the [FrpSpec]. This means all ongoing work is cleaned up.
+ */
+@JvmName("flowSpecToColdConflatedFlow")
+fun <A> FrpSpec<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
+    channelFlow { network.activateSpec { applySpec().observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, applies this [FrpSpec] in a new transaction in this
+ * [network], and then emits from the returned [TState].
+ *
+ * When collection is cancelled, so is the [FrpSpec]. This means all ongoing work is cleaned up.
+ */
+@JvmName("stateSpecToColdConflatedFlow")
+fun <A> FrpSpec<TState<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
+    channelFlow { network.activateSpec { applySpec().observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, applies this [Transactional] in a new transaction in
+ * this [network], and then emits from the returned [TFlow].
+ */
+@JvmName("transactionalFlowToColdConflatedFlow")
+fun <A> Transactional<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
+    channelFlow { network.activateSpec { sample().observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, applies this [Transactional] in a new transaction in
+ * this [network], and then emits from the returned [TState].
+ */
+@JvmName("transactionalStateToColdConflatedFlow")
+fun <A> Transactional<TState<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
+    channelFlow { network.activateSpec { sample().observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, applies this [FrpStateful] in a new transaction in
+ * this [network], and then emits from the returned [TFlow].
+ *
+ * When collection is cancelled, so is the [FrpStateful]. This means all ongoing work is cleaned up.
+ */
+@JvmName("statefulFlowToColdConflatedFlow")
+fun <A> FrpStateful<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
+    channelFlow { network.activateSpec { applyStateful().observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, applies this [Transactional] in a new transaction in
+ * this [network], and then emits from the returned [TState].
+ *
+ * When collection is cancelled, so is the [FrpStateful]. This means all ongoing work is cleaned up.
+ */
+@JvmName("statefulStateToColdConflatedFlow")
+fun <A> FrpStateful<TState<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
+    channelFlow { network.activateSpec { applyStateful().observe { trySend(it) } } }.conflate()
+
+/** Return a [TFlow] that emits from the original [TFlow] only when [state] is `true`. */
+fun <A> TFlow<A>.filter(state: TState<Boolean>): TFlow<A> = filter { state.sample() }
+
+private fun Iterable<Boolean>.allTrue() = all { it }
+
+private fun Iterable<Boolean>.anyTrue() = any { it }
+
+/** Returns a [TState] that is `true` only when all of [states] are `true`. */
+fun allOf(vararg states: TState<Boolean>): TState<Boolean> = combine(*states) { it.allTrue() }
+
+/** Returns a [TState] that is `true` when any of [states] are `true`. */
+fun anyOf(vararg states: TState<Boolean>): TState<Boolean> = combine(*states) { it.anyTrue() }
+
+/** Returns a [TState] containing the inverse of the Boolean held by the original [TState]. */
+fun not(state: TState<Boolean>): TState<Boolean> = state.mapCheapUnsafe { !it }
+
+/**
+ * Represents a modal FRP sub-network.
+ *
+ * When [enabled][enableMode], all network modifications are applied immediately to the FRP network.
+ * When the returned [TFlow] emits a [FrpBuildMode], that mode is enabled and replaces this mode,
+ * undoing all modifications in the process (any registered [observers][FrpBuildScope.observe] are
+ * unregistered, and any pending [side-effects][FrpBuildScope.effect] are cancelled).
+ *
+ * Use [compiledFrpSpec] to compile and stand-up a mode graph.
+ *
+ * @see FrpStatefulMode
+ */
+fun interface FrpBuildMode<out A> {
+    /**
+     * Invoked when this mode is enabled. Returns a value and a [TFlow] that signals a switch to a
+     * new mode.
+     */
+    suspend fun FrpBuildScope.enableMode(): Pair<A, TFlow<FrpBuildMode<A>>>
+}
+
+/**
+ * Returns an [FrpSpec] that, when [applied][FrpBuildScope.applySpec], stands up a modal-transition
+ * graph starting with this [FrpBuildMode], automatically switching to new modes as they are
+ * produced.
+ *
+ * @see FrpBuildMode
+ */
+val <A> FrpBuildMode<A>.compiledFrpSpec: FrpSpec<TState<A>>
+    get() = frpSpec {
+        var modeChangeEvents by TFlowLoop<FrpBuildMode<A>>()
+        val activeMode: TState<Pair<A, TFlow<FrpBuildMode<A>>>> =
+            modeChangeEvents
+                .map { it.run { frpSpec { enableMode() } } }
+                .holdLatestSpec(frpSpec { enableMode() })
+        modeChangeEvents =
+            activeMode.map { statefully { it.second.nextOnly() } }.applyLatestStateful().switch()
+        activeMode.map { it.first }
+    }
+
+/**
+ * Represents a modal FRP sub-network.
+ *
+ * When [enabled][enableMode], all state accumulation is immediately started. When the returned
+ * [TFlow] emits a [FrpBuildMode], that mode is enabled and replaces this mode, stopping all state
+ * accumulation in the process.
+ *
+ * Use [compiledStateful] to compile and stand-up a mode graph.
+ *
+ * @see FrpBuildMode
+ */
+fun interface FrpStatefulMode<out A> {
+    /**
+     * Invoked when this mode is enabled. Returns a value and a [TFlow] that signals a switch to a
+     * new mode.
+     */
+    suspend fun FrpStateScope.enableMode(): Pair<A, TFlow<FrpStatefulMode<A>>>
+}
+
+/**
+ * Returns an [FrpStateful] that, when [applied][FrpStateScope.applyStateful], stands up a
+ * modal-transition graph starting with this [FrpStatefulMode], automatically switching to new modes
+ * as they are produced.
+ *
+ * @see FrpBuildMode
+ */
+val <A> FrpStatefulMode<A>.compiledStateful: FrpStateful<TState<A>>
+    get() = statefully {
+        var modeChangeEvents by TFlowLoop<FrpStatefulMode<A>>()
+        val activeMode: TState<Pair<A, TFlow<FrpStatefulMode<A>>>> =
+            modeChangeEvents
+                .map { it.run { statefully { enableMode() } } }
+                .holdLatestStateful(statefully { enableMode() })
+        modeChangeEvents =
+            activeMode.map { statefully { it.second.nextOnly() } }.applyLatestStateful().switch()
+        activeMode.map { it.first }
+    }
+
+/**
+ * Runs [spec] in this [FrpBuildScope], and then re-runs it whenever [rebuildSignal] emits. Returns
+ * a [TState] that holds the result of the currently-active [FrpSpec].
+ */
+fun <A> FrpBuildScope.rebuildOn(rebuildSignal: TFlow<*>, spec: FrpSpec<A>): TState<A> =
+    rebuildSignal.map { spec }.holdLatestSpec(spec)
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpBuildScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpBuildScope.kt
new file mode 100644
index 0000000..4de6deb
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpBuildScope.kt
@@ -0,0 +1,864 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.kairos
+
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.map
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
+import kotlin.coroutines.RestrictsSuspension
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.FlowCollector
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharedFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.dropWhile
+import kotlinx.coroutines.launch
+
+/** A function that modifies the FrpNetwork. */
+typealias FrpSpec<A> = suspend FrpBuildScope.() -> A
+
+/**
+ * Constructs an [FrpSpec]. The passed [block] will be invoked with an [FrpBuildScope] that can be
+ * used to perform network-building operations, including adding new inputs and outputs to the
+ * network, as well as all operations available in [FrpTransactionScope].
+ */
+@ExperimentalFrpApi
+@Suppress("NOTHING_TO_INLINE")
+inline fun <A> frpSpec(noinline block: suspend FrpBuildScope.() -> A): FrpSpec<A> = block
+
+/** Applies the [FrpSpec] within this [FrpBuildScope]. */
+@ExperimentalFrpApi
+inline operator fun <A> FrpBuildScope.invoke(block: FrpBuildScope.() -> A) = run(block)
+
+/** Operations that add inputs and outputs to an FRP network. */
+@ExperimentalFrpApi
+@RestrictsSuspension
+interface FrpBuildScope : FrpStateScope {
+
+    /** TODO: Javadoc */
+    @ExperimentalFrpApi
+    fun <R> deferredBuildScope(block: suspend FrpBuildScope.() -> R): FrpDeferredValue<R>
+
+    /** TODO: Javadoc */
+    @ExperimentalFrpApi fun deferredBuildScopeAction(block: suspend FrpBuildScope.() -> Unit)
+
+    /**
+     * Returns a [TFlow] containing the results of applying [transform] to each value of the
+     * original [TFlow].
+     *
+     * [transform] can perform modifications to the FRP network via its [FrpBuildScope] receiver.
+     * Unlike [mapLatestBuild], these modifications are not undone with each subsequent emission of
+     * the original [TFlow].
+     *
+     * **NOTE:** This API does not [observe] the original [TFlow], meaning that unless the returned
+     * (or a downstream) [TFlow] is observed separately, [transform] will not be invoked, and no
+     * internal side-effects will occur.
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TFlow<A>.mapBuild(transform: suspend FrpBuildScope.(A) -> B): TFlow<B>
+
+    /**
+     * Invokes [block] whenever this [TFlow] emits a value, allowing side-effects to be safely
+     * performed in reaction to the emission.
+     *
+     * Specifically, [block] is deferred to the end of the transaction, and is only actually
+     * executed if this [FrpBuildScope] is still active by that time. It can be deactivated due to a
+     * -Latest combinator, for example.
+     *
+     * Shorthand for:
+     * ```kotlin
+     *   tFlow.observe { effect { ... } }
+     * ```
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<A>.observe(
+        coroutineContext: CoroutineContext = EmptyCoroutineContext,
+        block: suspend FrpEffectScope.(A) -> Unit = {},
+    ): Job
+
+    /**
+     * Returns a [TFlow] containing the results of applying each [FrpSpec] emitted from the original
+     * [TFlow], and a [FrpDeferredValue] containing the result of applying [initialSpecs]
+     * immediately.
+     *
+     * When each [FrpSpec] is applied, changes from the previously-active [FrpSpec] with the same
+     * key are undone (any registered [observers][observe] are unregistered, and any pending
+     * [side-effects][effect] are cancelled).
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpSpec] will be undone with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A, B> TFlow<Map<K, Maybe<FrpSpec<A>>>>.applyLatestSpecForKey(
+        initialSpecs: FrpDeferredValue<Map<K, FrpSpec<B>>>,
+        numKeys: Int? = null,
+    ): Pair<TFlow<Map<K, Maybe<A>>>, FrpDeferredValue<Map<K, B>>>
+
+    /**
+     * Creates an instance of a [TFlow] with elements that are from [builder].
+     *
+     * [builder] is run in its own coroutine, allowing for ongoing work that can emit to the
+     * provided [MutableTFlow].
+     *
+     * By default, [builder] is only running while the returned [TFlow] is being
+     * [observed][observe]. If you want it to run at all times, simply add a no-op observer:
+     * ```kotlin
+     * tFlow { ... }.apply { observe() }
+     * ```
+     */
+    @ExperimentalFrpApi fun <T> tFlow(builder: suspend FrpProducerScope<T>.() -> Unit): TFlow<T>
+
+    /**
+     * Creates an instance of a [TFlow] with elements that are emitted from [builder].
+     *
+     * [builder] is run in its own coroutine, allowing for ongoing work that can emit to the
+     * provided [MutableTFlow].
+     *
+     * By default, [builder] is only running while the returned [TFlow] is being
+     * [observed][observe]. If you want it to run at all times, simply add a no-op observer:
+     * ```kotlin
+     * tFlow { ... }.apply { observe() }
+     * ```
+     *
+     * In the event of backpressure, emissions are *coalesced* into batches. When a value is
+     * [emitted][FrpCoalescingProducerScope.emit] from [builder], it is merged into the batch via
+     * [coalesce]. Once the batch is consumed by the frp network in the next transaction, the batch
+     * is reset back to [getInitialValue].
+     */
+    @ExperimentalFrpApi
+    fun <In, Out> coalescingTFlow(
+        getInitialValue: () -> Out,
+        coalesce: (old: Out, new: In) -> Out,
+        builder: suspend FrpCoalescingProducerScope<In>.() -> Unit,
+    ): TFlow<Out>
+
+    /**
+     * Creates a new [FrpBuildScope] that is a child of this one.
+     *
+     * This new scope can be manually cancelled via the returned [Job], or will be cancelled
+     * automatically when its parent is cancelled. Cancellation will unregister all
+     * [observers][observe] and cancel all scheduled [effects][effect].
+     *
+     * The return value from [block] can be accessed via the returned [FrpDeferredValue].
+     */
+    @ExperimentalFrpApi fun <A> asyncScope(block: FrpSpec<A>): Pair<FrpDeferredValue<A>, Job>
+
+    // TODO: once we have context params, these can all become extensions:
+
+    /**
+     * Returns a [TFlow] containing the results of applying the given [transform] function to each
+     * value of the original [TFlow].
+     *
+     * Unlike [TFlow.map], [transform] can perform arbitrary asynchronous code. This code is run
+     * outside of the current FRP transaction; when [transform] returns, the returned value is
+     * emitted from the result [TFlow] in a new transaction.
+     *
+     * Shorthand for:
+     * ```kotlin
+     * tflow.mapLatestBuild { a -> asyncTFlow { transform(a) } }.flatten()
+     * ```
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TFlow<A>.mapAsyncLatest(transform: suspend (A) -> B): TFlow<B> =
+        mapLatestBuild { a -> asyncTFlow { transform(a) } }.flatten()
+
+    /**
+     * Invokes [block] whenever this [TFlow] emits a value. [block] receives an [FrpBuildScope] that
+     * can be used to make further modifications to the FRP network, and/or perform side-effects via
+     * [effect].
+     *
+     * @see observe
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<A>.observeBuild(block: suspend FrpBuildScope.(A) -> Unit = {}): Job =
+        mapBuild(block).observe()
+
+    /**
+     * Returns a [StateFlow] whose [value][StateFlow.value] tracks the current
+     * [value of this TState][TState.sample], and will emit at the same rate as
+     * [TState.stateChanges].
+     *
+     * Note that the [value][StateFlow.value] is not available until the *end* of the current
+     * transaction. If you need the current value before this time, then use [TState.sample].
+     */
+    @ExperimentalFrpApi
+    fun <A> TState<A>.toStateFlow(): StateFlow<A> {
+        val uninitialized = Any()
+        var initialValue: Any? = uninitialized
+        val innerStateFlow = MutableStateFlow<Any?>(uninitialized)
+        deferredBuildScope {
+            initialValue = sample()
+            stateChanges.observe {
+                innerStateFlow.value = it
+                initialValue = null
+            }
+        }
+
+        @Suppress("UNCHECKED_CAST")
+        fun getValue(innerValue: Any?): A =
+            when {
+                innerValue !== uninitialized -> innerValue as A
+                initialValue !== uninitialized -> initialValue as A
+                else ->
+                    error(
+                        "Attempted to access StateFlow.value before FRP transaction has completed."
+                    )
+            }
+
+        return object : StateFlow<A> {
+            override val replayCache: List<A>
+                get() = innerStateFlow.replayCache.map(::getValue)
+
+            override val value: A
+                get() = getValue(innerStateFlow.value)
+
+            override suspend fun collect(collector: FlowCollector<A>): Nothing {
+                innerStateFlow.collect { collector.emit(getValue(it)) }
+            }
+        }
+    }
+
+    /**
+     * Returns a [SharedFlow] configured with a replay cache of size [replay] that emits the current
+     * [value][TState.sample] of this [TState] followed by all [stateChanges].
+     */
+    @ExperimentalFrpApi
+    fun <A> TState<A>.toSharedFlow(replay: Int = 0): SharedFlow<A> {
+        val result = MutableSharedFlow<A>(replay, extraBufferCapacity = 1)
+        deferredBuildScope {
+            result.tryEmit(sample())
+            stateChanges.observe { a -> result.tryEmit(a) }
+        }
+        return result
+    }
+
+    /**
+     * Returns a [SharedFlow] configured with a replay cache of size [replay] that emits values
+     * whenever this [TFlow] emits.
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<A>.toSharedFlow(replay: Int = 0): SharedFlow<A> {
+        val result = MutableSharedFlow<A>(replay, extraBufferCapacity = 1)
+        observe { a -> result.tryEmit(a) }
+        return result
+    }
+
+    /**
+     * Returns a [TState] that holds onto the value returned by applying the most recently emitted
+     * [FrpSpec] from the original [TFlow], or the value returned by applying [initialSpec] if
+     * nothing has been emitted since it was constructed.
+     *
+     * When each [FrpSpec] is applied, changes from the previously-active [FrpSpec] are undone (any
+     * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
+     * cancelled).
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<FrpSpec<A>>.holdLatestSpec(initialSpec: FrpSpec<A>): TState<A> {
+        val (changes: TFlow<A>, initApplied: FrpDeferredValue<A>) = applyLatestSpec(initialSpec)
+        return changes.holdDeferred(initApplied)
+    }
+
+    /**
+     * Returns a [TState] containing the value returned by applying the [FrpSpec] held by the
+     * original [TState].
+     *
+     * When each [FrpSpec] is applied, changes from the previously-active [FrpSpec] are undone (any
+     * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
+     * cancelled).
+     */
+    @ExperimentalFrpApi
+    fun <A> TState<FrpSpec<A>>.applyLatestSpec(): TState<A> {
+        val (appliedChanges: TFlow<A>, init: FrpDeferredValue<A>) =
+            stateChanges.applyLatestSpec(frpSpec { sample().applySpec() })
+        return appliedChanges.holdDeferred(init)
+    }
+
+    /**
+     * Returns a [TFlow] containing the results of applying each [FrpSpec] emitted from the original
+     * [TFlow].
+     *
+     * When each [FrpSpec] is applied, changes from the previously-active [FrpSpec] are undone (any
+     * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
+     * cancelled).
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<FrpSpec<A>>.applyLatestSpec(): TFlow<A> = applyLatestSpec(frpSpec {}).first
+
+    /**
+     * Returns a [TFlow] that switches to a new [TFlow] produced by [transform] every time the
+     * original [TFlow] emits a value.
+     *
+     * [transform] can perform modifications to the FRP network via its [FrpBuildScope] receiver.
+     * When the original [TFlow] emits a new value, those changes are undone (any registered
+     * [observers][observe] are unregistered, and any pending [effects][effect] are cancelled).
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TFlow<A>.flatMapLatestBuild(
+        transform: suspend FrpBuildScope.(A) -> TFlow<B>
+    ): TFlow<B> = mapCheap { frpSpec { transform(it) } }.applyLatestSpec().flatten()
+
+    /**
+     * Returns a [TState] by applying [transform] to the value held by the original [TState].
+     *
+     * [transform] can perform modifications to the FRP network via its [FrpBuildScope] receiver.
+     * When the value held by the original [TState] changes, those changes are undone (any
+     * registered [observers][observe] are unregistered, and any pending [effects][effect] are
+     * cancelled).
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TState<A>.flatMapLatestBuild(
+        transform: suspend FrpBuildScope.(A) -> TState<B>
+    ): TState<B> = mapLatestBuild { transform(it) }.flatten()
+
+    /**
+     * Returns a [TState] that transforms the value held inside this [TState] by applying it to the
+     * [transform].
+     *
+     * [transform] can perform modifications to the FRP network via its [FrpBuildScope] receiver.
+     * When the value held by the original [TState] changes, those changes are undone (any
+     * registered [observers][observe] are unregistered, and any pending [effects][effect] are
+     * cancelled).
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TState<A>.mapLatestBuild(transform: suspend FrpBuildScope.(A) -> B): TState<B> =
+        mapCheapUnsafe { frpSpec { transform(it) } }.applyLatestSpec()
+
+    /**
+     * Returns a [TFlow] containing the results of applying each [FrpSpec] emitted from the original
+     * [TFlow], and a [FrpDeferredValue] containing the result of applying [initialSpec]
+     * immediately.
+     *
+     * When each [FrpSpec] is applied, changes from the previously-active [FrpSpec] are undone (any
+     * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
+     * cancelled).
+     */
+    @ExperimentalFrpApi
+    fun <A : Any?, B> TFlow<FrpSpec<B>>.applyLatestSpec(
+        initialSpec: FrpSpec<A>
+    ): Pair<TFlow<B>, FrpDeferredValue<A>> {
+        val (flow, result) =
+            mapCheap { spec -> mapOf(Unit to just(spec)) }
+                .applyLatestSpecForKey(initialSpecs = mapOf(Unit to initialSpec), numKeys = 1)
+        val outFlow: TFlow<B> =
+            flow.mapMaybe {
+                checkNotNull(it[Unit]) { "applyLatest: expected result, but none present in: $it" }
+            }
+        val outInit: FrpDeferredValue<A> = deferredBuildScope {
+            val initResult: Map<Unit, A> = result.get()
+            check(Unit in initResult) {
+                "applyLatest: expected initial result, but none present in: $initResult"
+            }
+            @Suppress("UNCHECKED_CAST")
+            initResult.getOrDefault(Unit) { null } as A
+        }
+        return Pair(outFlow, outInit)
+    }
+
+    /**
+     * Returns a [TFlow] containing the results of applying [transform] to each value of the
+     * original [TFlow].
+     *
+     * [transform] can perform modifications to the FRP network via its [FrpBuildScope] receiver.
+     * With each invocation of [transform], changes from the previous invocation are undone (any
+     * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
+     * cancelled).
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TFlow<A>.mapLatestBuild(transform: suspend FrpBuildScope.(A) -> B): TFlow<B> =
+        mapCheap { frpSpec { transform(it) } }.applyLatestSpec()
+
+    /**
+     * Returns a [TFlow] containing the results of applying [transform] to each value of the
+     * original [TFlow], and a [FrpDeferredValue] containing the result of applying [transform] to
+     * [initialValue] immediately.
+     *
+     * [transform] can perform modifications to the FRP network via its [FrpBuildScope] receiver.
+     * With each invocation of [transform], changes from the previous invocation are undone (any
+     * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
+     * cancelled).
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TFlow<A>.mapLatestBuild(
+        initialValue: A,
+        transform: suspend FrpBuildScope.(A) -> B,
+    ): Pair<TFlow<B>, FrpDeferredValue<B>> =
+        mapLatestBuildDeferred(deferredOf(initialValue), transform)
+
+    /**
+     * Returns a [TFlow] containing the results of applying [transform] to each value of the
+     * original [TFlow], and a [FrpDeferredValue] containing the result of applying [transform] to
+     * [initialValue] immediately.
+     *
+     * [transform] can perform modifications to the FRP network via its [FrpBuildScope] receiver.
+     * With each invocation of [transform], changes from the previous invocation are undone (any
+     * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
+     * cancelled).
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TFlow<A>.mapLatestBuildDeferred(
+        initialValue: FrpDeferredValue<A>,
+        transform: suspend FrpBuildScope.(A) -> B,
+    ): Pair<TFlow<B>, FrpDeferredValue<B>> =
+        mapCheap { frpSpec { transform(it) } }
+            .applyLatestSpec(initialSpec = frpSpec { transform(initialValue.get()) })
+
+    /**
+     * Returns a [TFlow] containing the results of applying each [FrpSpec] emitted from the original
+     * [TFlow], and a [FrpDeferredValue] containing the result of applying [initialSpecs]
+     * immediately.
+     *
+     * When each [FrpSpec] is applied, changes from the previously-active [FrpSpec] with the same
+     * key are undone (any registered [observers][observe] are unregistered, and any pending
+     * [side-effects][effect] are cancelled).
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpSpec] will be undone with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A, B> TFlow<Map<K, Maybe<FrpSpec<A>>>>.applyLatestSpecForKey(
+        initialSpecs: Map<K, FrpSpec<B>>,
+        numKeys: Int? = null,
+    ): Pair<TFlow<Map<K, Maybe<A>>>, FrpDeferredValue<Map<K, B>>> =
+        applyLatestSpecForKey(deferredOf(initialSpecs), numKeys)
+
+    /**
+     * Returns a [TFlow] containing the results of applying each [FrpSpec] emitted from the original
+     * [TFlow].
+     *
+     * When each [FrpSpec] is applied, changes from the previously-active [FrpSpec] with the same
+     * key are undone (any registered [observers][observe] are unregistered, and any pending
+     * [side-effects][effect] are cancelled).
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpSpec] will be undone with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A> TFlow<Map<K, Maybe<FrpSpec<A>>>>.applyLatestSpecForKey(
+        numKeys: Int? = null
+    ): TFlow<Map<K, Maybe<A>>> =
+        applyLatestSpecForKey<K, A, Nothing>(deferredOf(emptyMap()), numKeys).first
+
+    /**
+     * Returns a [TState] containing the latest results of applying each [FrpSpec] emitted from the
+     * original [TFlow].
+     *
+     * When each [FrpSpec] is applied, changes from the previously-active [FrpSpec] with the same
+     * key are undone (any registered [observers][observe] are unregistered, and any pending
+     * [side-effects][effect] are cancelled).
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpSpec] will be undone with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A> TFlow<Map<K, Maybe<FrpSpec<A>>>>.holdLatestSpecForKey(
+        initialSpecs: FrpDeferredValue<Map<K, FrpSpec<A>>>,
+        numKeys: Int? = null,
+    ): TState<Map<K, A>> {
+        val (changes, initialValues) = applyLatestSpecForKey(initialSpecs, numKeys)
+        return changes.foldMapIncrementally(initialValues)
+    }
+
+    /**
+     * Returns a [TState] containing the latest results of applying each [FrpSpec] emitted from the
+     * original [TFlow].
+     *
+     * When each [FrpSpec] is applied, changes from the previously-active [FrpSpec] with the same
+     * key are undone (any registered [observers][observe] are unregistered, and any pending
+     * [side-effects][effect] are cancelled).
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpSpec] will be undone with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A> TFlow<Map<K, Maybe<FrpSpec<A>>>>.holdLatestSpecForKey(
+        initialSpecs: Map<K, FrpSpec<A>> = emptyMap(),
+        numKeys: Int? = null,
+    ): TState<Map<K, A>> = holdLatestSpecForKey(deferredOf(initialSpecs), numKeys)
+
+    /**
+     * Returns a [TFlow] containing the results of applying [transform] to each value of the
+     * original [TFlow], and a [FrpDeferredValue] containing the result of applying [transform] to
+     * [initialValues] immediately.
+     *
+     * [transform] can perform modifications to the FRP network via its [FrpBuildScope] receiver.
+     * With each invocation of [transform], changes from the previous invocation are undone (any
+     * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
+     * cancelled).
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpBuildScope] will be undone with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A, B> TFlow<Map<K, Maybe<A>>>.mapLatestBuildForKey(
+        initialValues: FrpDeferredValue<Map<K, A>>,
+        numKeys: Int? = null,
+        transform: suspend FrpBuildScope.(A) -> B,
+    ): Pair<TFlow<Map<K, Maybe<B>>>, FrpDeferredValue<Map<K, B>>> =
+        map { patch -> patch.mapValues { (_, v) -> v.map { frpSpec { transform(it) } } } }
+            .applyLatestSpecForKey(
+                deferredBuildScope {
+                    initialValues.get().mapValues { (_, v) -> frpSpec { transform(v) } }
+                },
+                numKeys = numKeys,
+            )
+
+    /**
+     * Returns a [TFlow] containing the results of applying [transform] to each value of the
+     * original [TFlow], and a [FrpDeferredValue] containing the result of applying [transform] to
+     * [initialValues] immediately.
+     *
+     * [transform] can perform modifications to the FRP network via its [FrpBuildScope] receiver.
+     * With each invocation of [transform], changes from the previous invocation are undone (any
+     * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
+     * cancelled).
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpBuildScope] will be undone with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A, B> TFlow<Map<K, Maybe<A>>>.mapLatestBuildForKey(
+        initialValues: Map<K, A>,
+        numKeys: Int? = null,
+        transform: suspend FrpBuildScope.(A) -> B,
+    ): Pair<TFlow<Map<K, Maybe<B>>>, FrpDeferredValue<Map<K, B>>> =
+        mapLatestBuildForKey(deferredOf(initialValues), numKeys, transform)
+
+    /**
+     * Returns a [TFlow] containing the results of applying [transform] to each value of the
+     * original [TFlow].
+     *
+     * [transform] can perform modifications to the FRP network via its [FrpBuildScope] receiver.
+     * With each invocation of [transform], changes from the previous invocation are undone (any
+     * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
+     * cancelled).
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpBuildScope] will be undone with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A, B> TFlow<Map<K, Maybe<A>>>.mapLatestBuildForKey(
+        numKeys: Int? = null,
+        transform: suspend FrpBuildScope.(A) -> B,
+    ): TFlow<Map<K, Maybe<B>>> = mapLatestBuildForKey(emptyMap(), numKeys, transform).first
+
+    /** Returns a [Deferred] containing the next value to be emitted from this [TFlow]. */
+    @ExperimentalFrpApi
+    fun <R> TFlow<R>.nextDeferred(): Deferred<R> {
+        lateinit var next: CompletableDeferred<R>
+        val job = nextOnly().observe { next.complete(it) }
+        next = CompletableDeferred<R>(parent = job)
+        return next
+    }
+
+    /** Returns a [TState] that reflects the [StateFlow.value] of this [StateFlow]. */
+    @ExperimentalFrpApi
+    fun <A> StateFlow<A>.toTState(): TState<A> {
+        val initial = value
+        return tFlow { dropWhile { it == initial }.collect { emit(it) } }.hold(initial)
+    }
+
+    /** Returns a [TFlow] that emits whenever this [Flow] emits. */
+    @ExperimentalFrpApi fun <A> Flow<A>.toTFlow(): TFlow<A> = tFlow { collect { emit(it) } }
+
+    /**
+     * Shorthand for:
+     * ```kotlin
+     * flow.toTFlow().hold(initialValue)
+     * ```
+     */
+    @ExperimentalFrpApi
+    fun <A> Flow<A>.toTState(initialValue: A): TState<A> = toTFlow().hold(initialValue)
+
+    /**
+     * Invokes [block] whenever this [TFlow] emits a value. [block] receives an [FrpBuildScope] that
+     * can be used to make further modifications to the FRP network, and/or perform side-effects via
+     * [effect].
+     *
+     * With each invocation of [block], changes from the previous invocation are undone (any
+     * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
+     * cancelled).
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<A>.observeLatestBuild(block: suspend FrpBuildScope.(A) -> Unit = {}): Job =
+        mapLatestBuild { block(it) }.observe()
+
+    /**
+     * Invokes [block] whenever this [TFlow] emits a value, allowing side-effects to be safely
+     * performed in reaction to the emission.
+     *
+     * With each invocation of [block], running effects from the previous invocation are cancelled.
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<A>.observeLatest(block: suspend FrpEffectScope.(A) -> Unit = {}): Job {
+        var innerJob: Job? = null
+        return observeBuild {
+            innerJob?.cancel()
+            innerJob = effect { block(it) }
+        }
+    }
+
+    /**
+     * Invokes [block] with the value held by this [TState], allowing side-effects to be safely
+     * performed in reaction to the state changing.
+     *
+     * With each invocation of [block], running effects from the previous invocation are cancelled.
+     */
+    @ExperimentalFrpApi
+    fun <A> TState<A>.observeLatest(block: suspend FrpEffectScope.(A) -> Unit = {}): Job =
+        launchScope {
+            var innerJob = effect { block(sample()) }
+            stateChanges.observeBuild {
+                innerJob.cancel()
+                innerJob = effect { block(it) }
+            }
+        }
+
+    /**
+     * Applies [block] to the value held by this [TState]. [block] receives an [FrpBuildScope] that
+     * can be used to make further modifications to the FRP network, and/or perform side-effects via
+     * [effect].
+     *
+     * [block] can perform modifications to the FRP network via its [FrpBuildScope] receiver. With
+     * each invocation of [block], changes from the previous invocation are undone (any registered
+     * [observers][observe] are unregistered, and any pending [side-effects][effect] are cancelled).
+     */
+    @ExperimentalFrpApi
+    fun <A> TState<A>.observeLatestBuild(block: suspend FrpBuildScope.(A) -> Unit = {}): Job =
+        launchScope {
+            var innerJob: Job = launchScope { block(sample()) }
+            stateChanges.observeBuild {
+                innerJob.cancel()
+                innerJob = launchScope { block(it) }
+            }
+        }
+
+    /** Applies the [FrpSpec] within this [FrpBuildScope]. */
+    @ExperimentalFrpApi suspend fun <A> FrpSpec<A>.applySpec(): A = this()
+
+    /**
+     * Applies the [FrpSpec] within this [FrpBuildScope], returning the result as an
+     * [FrpDeferredValue].
+     */
+    @ExperimentalFrpApi
+    fun <A> FrpSpec<A>.applySpecDeferred(): FrpDeferredValue<A> = deferredBuildScope { applySpec() }
+
+    /**
+     * Invokes [block] on the value held in this [TState]. [block] receives an [FrpBuildScope] that
+     * can be used to make further modifications to the FRP network, and/or perform side-effects via
+     * [effect].
+     */
+    @ExperimentalFrpApi
+    fun <A> TState<A>.observeBuild(block: suspend FrpBuildScope.(A) -> Unit = {}): Job =
+        launchScope {
+            block(sample())
+            stateChanges.observeBuild(block)
+        }
+
+    /**
+     * Invokes [block] with the current value of this [TState], re-invoking whenever it changes,
+     * allowing side-effects to be safely performed in reaction value changing.
+     *
+     * Specifically, [block] is deferred to the end of the transaction, and is only actually
+     * executed if this [FrpBuildScope] is still active by that time. It can be deactivated due to a
+     * -Latest combinator, for example.
+     *
+     * If the [TState] is changing within the *current* transaction (i.e. [stateChanges] is
+     * presently emitting) then [block] will be invoked for the first time with the new value;
+     * otherwise, it will be invoked with the [current][sample] value.
+     */
+    @ExperimentalFrpApi
+    fun <A> TState<A>.observe(block: suspend FrpEffectScope.(A) -> Unit = {}): Job =
+        now.map { sample() }.mergeWith(stateChanges) { _, new -> new }.observe { block(it) }
+}
+
+/**
+ * Returns a [TFlow] that emits the result of [block] once it completes. [block] is evaluated
+ * outside of the current FRP transaction; when it completes, the returned [TFlow] emits in a new
+ * transaction.
+ *
+ * Shorthand for:
+ * ```
+ * tFlow { emitter: MutableTFlow<A> ->
+ *     val a = block()
+ *     emitter.emit(a)
+ * }
+ * ```
+ */
+@ExperimentalFrpApi
+fun <A> FrpBuildScope.asyncTFlow(block: suspend () -> A): TFlow<A> =
+    tFlow {
+            // TODO: if block completes synchronously, it would be nice to emit within this
+            //  transaction
+            emit(block())
+        }
+        .apply { observe() }
+
+/**
+ * Performs a side-effect in a safe manner w/r/t the current FRP transaction.
+ *
+ * Specifically, [block] is deferred to the end of the current transaction, and is only actually
+ * executed if this [FrpBuildScope] is still active by that time. It can be deactivated due to a
+ * -Latest combinator, for example.
+ *
+ * Shorthand for:
+ * ```kotlin
+ *   now.observe { block() }
+ * ```
+ */
+@ExperimentalFrpApi
+fun FrpBuildScope.effect(block: suspend FrpEffectScope.() -> Unit): Job = now.observe { block() }
+
+/**
+ * Launches [block] in a new coroutine, returning a [Job] bound to the coroutine.
+ *
+ * This coroutine is not actually started until the *end* of the current FRP transaction. This is
+ * done because the current [FrpBuildScope] might be deactivated within this transaction, perhaps
+ * due to a -Latest combinator. If this happens, then the coroutine will never actually be started.
+ *
+ * Shorthand for:
+ * ```kotlin
+ *   effect { frpCoroutineScope.launch { block() } }
+ * ```
+ */
+@ExperimentalFrpApi
+fun FrpBuildScope.launchEffect(block: suspend CoroutineScope.() -> Unit): Job = asyncEffect(block)
+
+/**
+ * Launches [block] in a new coroutine, returning the result as a [Deferred].
+ *
+ * This coroutine is not actually started until the *end* of the current FRP transaction. This is
+ * done because the current [FrpBuildScope] might be deactivated within this transaction, perhaps
+ * due to a -Latest combinator. If this happens, then the coroutine will never actually be started.
+ *
+ * Shorthand for:
+ * ```kotlin
+ *   CompletableDeferred<R>.apply {
+ *       effect { frpCoroutineScope.launch { complete(coroutineScope { block() }) } }
+ *     }
+ *     .await()
+ * ```
+ */
+@ExperimentalFrpApi
+fun <R> FrpBuildScope.asyncEffect(block: suspend CoroutineScope.() -> R): Deferred<R> {
+    val result = CompletableDeferred<R>()
+    val job = now.observe { frpCoroutineScope.launch { result.complete(coroutineScope(block)) } }
+    val handle = job.invokeOnCompletion { result.cancel() }
+    result.invokeOnCompletion {
+        handle.dispose()
+        job.cancel()
+    }
+    return result
+}
+
+/** Like [FrpBuildScope.asyncScope], but ignores the result of [block]. */
+@ExperimentalFrpApi fun FrpBuildScope.launchScope(block: FrpSpec<*>): Job = asyncScope(block).second
+
+/**
+ * Creates an instance of a [TFlow] with elements that are emitted from [builder].
+ *
+ * [builder] is run in its own coroutine, allowing for ongoing work that can emit to the provided
+ * [MutableTFlow].
+ *
+ * By default, [builder] is only running while the returned [TFlow] is being
+ * [observed][FrpBuildScope.observe]. If you want it to run at all times, simply add a no-op
+ * observer:
+ * ```kotlin
+ * tFlow { ... }.apply { observe() }
+ * ```
+ *
+ * In the event of backpressure, emissions are *coalesced* into batches. When a value is
+ * [emitted][FrpCoalescingProducerScope.emit] from [builder], it is merged into the batch via
+ * [coalesce]. Once the batch is consumed by the FRP network in the next transaction, the batch is
+ * reset back to [initialValue].
+ */
+@ExperimentalFrpApi
+fun <In, Out> FrpBuildScope.coalescingTFlow(
+    initialValue: Out,
+    coalesce: (old: Out, new: In) -> Out,
+    builder: suspend FrpCoalescingProducerScope<In>.() -> Unit,
+): TFlow<Out> = coalescingTFlow(getInitialValue = { initialValue }, coalesce, builder)
+
+/**
+ * Creates an instance of a [TFlow] with elements that are emitted from [builder].
+ *
+ * [builder] is run in its own coroutine, allowing for ongoing work that can emit to the provided
+ * [MutableTFlow].
+ *
+ * By default, [builder] is only running while the returned [TFlow] is being
+ * [observed][FrpBuildScope.observe]. If you want it to run at all times, simply add a no-op
+ * observer:
+ * ```kotlin
+ * tFlow { ... }.apply { observe() }
+ * ```
+ *
+ * In the event of backpressure, emissions are *conflated*; any older emissions are dropped and only
+ * the most recent emission will be used when the FRP network is ready.
+ */
+@ExperimentalFrpApi
+fun <T> FrpBuildScope.conflatedTFlow(
+    builder: suspend FrpCoalescingProducerScope<T>.() -> Unit
+): TFlow<T> =
+    coalescingTFlow<T, Any?>(initialValue = Any(), coalesce = { _, new -> new }, builder = builder)
+        .mapCheap {
+            @Suppress("UNCHECKED_CAST")
+            it as T
+        }
+
+/** Scope for emitting to a [FrpBuildScope.coalescingTFlow]. */
+interface FrpCoalescingProducerScope<in T> {
+    /**
+     * Inserts [value] into the current batch, enqueueing it for emission from this [TFlow] if not
+     * already pending.
+     *
+     * Backpressure occurs when [emit] is called while the FRP network is currently in a
+     * transaction; if called multiple times, then emissions will be coalesced into a single batch
+     * that is then processed when the network is ready.
+     */
+    fun emit(value: T)
+}
+
+/** Scope for emitting to a [FrpBuildScope.tFlow]. */
+interface FrpProducerScope<in T> {
+    /**
+     * Emits a [value] to this [TFlow], suspending the caller until the FRP transaction containing
+     * the emission has completed.
+     */
+    suspend fun emit(value: T)
+}
+
+/**
+ * Suspends forever. Upon cancellation, runs [block]. Useful for unregistering callbacks inside of
+ * [FrpBuildScope.tFlow] and [FrpBuildScope.coalescingTFlow].
+ */
+suspend fun awaitClose(block: () -> Unit): Nothing =
+    try {
+        awaitCancellation()
+    } finally {
+        block()
+    }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpEffectScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpEffectScope.kt
new file mode 100644
index 0000000..be2eb43
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpEffectScope.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos
+
+import kotlin.coroutines.RestrictsSuspension
+import kotlinx.coroutines.CoroutineScope
+
+/**
+ * Scope for external side-effects triggered by the Frp network. This still occurs within the
+ * context of a transaction, so general suspending calls are disallowed to prevent blocking the
+ * transaction. You can use [frpCoroutineScope] to [launch] new coroutines to perform long-running
+ * asynchronous work. This scope is alive for the duration of the containing [FrpBuildScope] that
+ * this side-effect scope is running in.
+ */
+@RestrictsSuspension
+@ExperimentalFrpApi
+interface FrpEffectScope : FrpTransactionScope {
+    /**
+     * A [CoroutineScope] whose lifecycle lives for as long as this [FrpEffectScope] is alive. This
+     * is generally until the [Job] returned by [FrpBuildScope.effect] is cancelled.
+     */
+    @ExperimentalFrpApi val frpCoroutineScope: CoroutineScope
+
+    /**
+     * A [FrpNetwork] instance that can be used to transactionally query / modify the FRP network.
+     *
+     * The lambda passed to [FrpNetwork.transact] on this instance will receive an [FrpBuildScope]
+     * that is lifetime-bound to this [FrpEffectScope]. Once this [FrpEffectScope] is no longer
+     * alive, any modifications to the FRP network performed via this [FrpNetwork] instance will be
+     * undone (any registered [observers][FrpBuildScope.observe] are unregistered, and any pending
+     * [side-effects][FrpBuildScope.effect] are cancelled).
+     */
+    @ExperimentalFrpApi val frpNetwork: FrpNetwork
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpNetwork.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpNetwork.kt
new file mode 100644
index 0000000..b688eaf
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpNetwork.kt
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos
+
+import com.android.systemui.kairos.internal.BuildScopeImpl
+import com.android.systemui.kairos.internal.Network
+import com.android.systemui.kairos.internal.StateScopeImpl
+import com.android.systemui.kairos.internal.util.awaitCancellationAndThen
+import com.android.systemui.kairos.internal.util.childScope
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
+import kotlin.coroutines.coroutineContext
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CoroutineName
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.job
+import kotlinx.coroutines.launch
+
+/**
+ * Marks declarations that are still **experimental** and shouldn't be used in general production
+ * code.
+ */
+@RequiresOptIn(
+    message = "This API is experimental and should not be used in general production code."
+)
+@Retention(AnnotationRetention.BINARY)
+annotation class ExperimentalFrpApi
+
+/**
+ * External interface to an FRP network. Can be used to make transactional queries and modifications
+ * to the network.
+ */
+@ExperimentalFrpApi
+interface FrpNetwork {
+    /**
+     * Runs [block] inside of a transaction, suspending until the transaction is complete.
+     *
+     * The [FrpBuildScope] receiver exposes methods that can be used to query or modify the network.
+     * If the network is cancelled while the caller of [transact] is suspended, then the call will
+     * be cancelled.
+     */
+    @ExperimentalFrpApi suspend fun <R> transact(block: suspend FrpTransactionScope.() -> R): R
+
+    /**
+     * Activates [spec] in a transaction, suspending indefinitely. While suspended, all observers
+     * and long-running effects are kept alive. When cancelled, observers are unregistered and
+     * effects are cancelled.
+     */
+    @ExperimentalFrpApi suspend fun activateSpec(spec: FrpSpec<*>)
+
+    /** Returns a [CoalescingMutableTFlow] that can emit values into this [FrpNetwork]. */
+    @ExperimentalFrpApi
+    fun <In, Out> coalescingMutableTFlow(
+        coalesce: (old: Out, new: In) -> Out,
+        getInitialValue: () -> Out,
+    ): CoalescingMutableTFlow<In, Out>
+
+    /** Returns a [MutableTFlow] that can emit values into this [FrpNetwork]. */
+    @ExperimentalFrpApi fun <T> mutableTFlow(): MutableTFlow<T>
+
+    /** Returns a [MutableTState]. with initial state [initialValue]. */
+    @ExperimentalFrpApi
+    fun <T> mutableTStateDeferred(initialValue: FrpDeferredValue<T>): MutableTState<T>
+}
+
+/** Returns a [CoalescingMutableTFlow] that can emit values into this [FrpNetwork]. */
+@ExperimentalFrpApi
+fun <In, Out> FrpNetwork.coalescingMutableTFlow(
+    coalesce: (old: Out, new: In) -> Out,
+    initialValue: Out,
+): CoalescingMutableTFlow<In, Out> =
+    coalescingMutableTFlow(coalesce, getInitialValue = { initialValue })
+
+/** Returns a [MutableTState]. with initial state [initialValue]. */
+@ExperimentalFrpApi
+fun <T> FrpNetwork.mutableTState(initialValue: T): MutableTState<T> =
+    mutableTStateDeferred(deferredOf(initialValue))
+
+/** Returns a [MutableTState]. with initial state [initialValue]. */
+@ExperimentalFrpApi
+fun <T> MutableTState(network: FrpNetwork, initialValue: T): MutableTState<T> =
+    network.mutableTState(initialValue)
+
+/** Returns a [MutableTFlow] that can emit values into this [FrpNetwork]. */
+@ExperimentalFrpApi
+fun <T> MutableTFlow(network: FrpNetwork): MutableTFlow<T> = network.mutableTFlow()
+
+/** Returns a [CoalescingMutableTFlow] that can emit values into this [FrpNetwork]. */
+@ExperimentalFrpApi
+fun <In, Out> CoalescingMutableTFlow(
+    network: FrpNetwork,
+    coalesce: (old: Out, new: In) -> Out,
+    initialValue: Out,
+): CoalescingMutableTFlow<In, Out> = network.coalescingMutableTFlow(coalesce) { initialValue }
+
+/** Returns a [CoalescingMutableTFlow] that can emit values into this [FrpNetwork]. */
+@ExperimentalFrpApi
+fun <In, Out> CoalescingMutableTFlow(
+    network: FrpNetwork,
+    coalesce: (old: Out, new: In) -> Out,
+    getInitialValue: () -> Out,
+): CoalescingMutableTFlow<In, Out> = network.coalescingMutableTFlow(coalesce, getInitialValue)
+
+/**
+ * Activates [spec] in a transaction and invokes [block] with the result, suspending indefinitely.
+ * While suspended, all observers and long-running effects are kept alive. When cancelled, observers
+ * are unregistered and effects are cancelled.
+ */
+@ExperimentalFrpApi
+suspend fun <R> FrpNetwork.activateSpec(spec: FrpSpec<R>, block: suspend (R) -> Unit) {
+    activateSpec {
+        val result = spec.applySpec()
+        launchEffect { block(result) }
+    }
+}
+
+internal class LocalFrpNetwork(
+    private val network: Network,
+    private val scope: CoroutineScope,
+    private val endSignal: TFlow<Any>,
+) : FrpNetwork {
+    override suspend fun <R> transact(block: suspend FrpTransactionScope.() -> R): R {
+        val result = CompletableDeferred<R>(coroutineContext[Job])
+        @Suppress("DeferredResultUnused")
+        network.transaction {
+            val buildScope =
+                BuildScopeImpl(
+                    stateScope = StateScopeImpl(evalScope = this, endSignal = endSignal),
+                    coroutineScope = scope,
+                )
+            buildScope.runInBuildScope { effect { result.complete(block()) } }
+        }
+        return result.await()
+    }
+
+    override suspend fun activateSpec(spec: FrpSpec<*>) {
+        val job =
+            network
+                .transaction {
+                    val buildScope =
+                        BuildScopeImpl(
+                            stateScope = StateScopeImpl(evalScope = this, endSignal = endSignal),
+                            coroutineScope = scope,
+                        )
+                    buildScope.runInBuildScope { launchScope(spec) }
+                }
+                .await()
+        awaitCancellationAndThen { job.cancel() }
+    }
+
+    override fun <In, Out> coalescingMutableTFlow(
+        coalesce: (old: Out, new: In) -> Out,
+        getInitialValue: () -> Out,
+    ): CoalescingMutableTFlow<In, Out> = CoalescingMutableTFlow(coalesce, network, getInitialValue)
+
+    override fun <T> mutableTFlow(): MutableTFlow<T> = MutableTFlow(network)
+
+    override fun <T> mutableTStateDeferred(initialValue: FrpDeferredValue<T>): MutableTState<T> =
+        MutableTState(network, initialValue.unwrapped)
+}
+
+/**
+ * Combination of an [FrpNetwork] and a [Job] that, when cancelled, will cancel the entire FRP
+ * network.
+ */
+@ExperimentalFrpApi
+class RootFrpNetwork
+internal constructor(private val network: Network, private val scope: CoroutineScope, job: Job) :
+    Job by job, FrpNetwork by LocalFrpNetwork(network, scope, emptyTFlow)
+
+/** Constructs a new [RootFrpNetwork] in the given [CoroutineScope]. */
+@ExperimentalFrpApi
+fun CoroutineScope.newFrpNetwork(
+    context: CoroutineContext = EmptyCoroutineContext
+): RootFrpNetwork {
+    val scope = childScope(context)
+    val network = Network(scope)
+    scope.launch(CoroutineName("newFrpNetwork scheduler")) { network.runInputScheduler() }
+    return RootFrpNetwork(network, scope, scope.coroutineContext.job)
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpScope.kt
new file mode 100644
index 0000000..ad6b2c8
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpScope.kt
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos
+
+import kotlin.coroutines.RestrictsSuspension
+import kotlin.coroutines.resume
+import kotlin.coroutines.resumeWithException
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.suspendCancellableCoroutine
+
+/** Denotes [FrpScope] interfaces as [DSL markers][DslMarker]. */
+@DslMarker annotation class FrpScopeMarker
+
+/**
+ * Base scope for all FRP scopes. Used to prevent implicitly capturing other scopes from in lambdas.
+ */
+@FrpScopeMarker
+@RestrictsSuspension
+@ExperimentalFrpApi
+interface FrpScope {
+    /**
+     * Returns the value held by the [FrpDeferredValue], suspending until available if necessary.
+     */
+    @ExperimentalFrpApi
+    @OptIn(ExperimentalCoroutinesApi::class)
+    suspend fun <A> FrpDeferredValue<A>.get(): A = suspendCancellableCoroutine { k ->
+        unwrapped.invokeOnCompletion { ex ->
+            ex?.let { k.resumeWithException(ex) } ?: k.resume(unwrapped.getCompleted())
+        }
+    }
+}
+
+/**
+ * A value that may not be immediately (synchronously) available, but is guaranteed to be available
+ * before this transaction is completed.
+ *
+ * @see FrpScope.get
+ */
+@ExperimentalFrpApi
+class FrpDeferredValue<out A> internal constructor(internal val unwrapped: Deferred<A>)
+
+/**
+ * Returns the value held by this [FrpDeferredValue], or throws [IllegalStateException] if it is not
+ * yet available.
+ *
+ * This API is not meant for general usage within the FRP network. It is made available mainly for
+ * debugging and logging. You should always prefer [get][FrpScope.get] if possible.
+ *
+ * @see FrpScope.get
+ */
+@ExperimentalFrpApi
+@OptIn(ExperimentalCoroutinesApi::class)
+fun <A> FrpDeferredValue<A>.getUnsafe(): A = unwrapped.getCompleted()
+
+/** Returns an already-available [FrpDeferredValue] containing [value]. */
+@ExperimentalFrpApi
+fun <A> deferredOf(value: A): FrpDeferredValue<A> = FrpDeferredValue(CompletableDeferred(value))
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpStateScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpStateScope.kt
new file mode 100644
index 0000000..c7ea680
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpStateScope.kt
@@ -0,0 +1,780 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos
+
+import com.android.systemui.kairos.combine as combinePure
+import com.android.systemui.kairos.map as mapPure
+import com.android.systemui.kairos.util.Just
+import com.android.systemui.kairos.util.Left
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.Right
+import com.android.systemui.kairos.util.WithPrev
+import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.map
+import com.android.systemui.kairos.util.none
+import com.android.systemui.kairos.util.partitionEithers
+import com.android.systemui.kairos.util.zipWith
+import kotlin.coroutines.RestrictsSuspension
+
+typealias FrpStateful<R> = suspend FrpStateScope.() -> R
+
+/**
+ * Returns a [FrpStateful] that, when [applied][FrpStateScope.applyStateful], invokes [block] with
+ * the applier's [FrpStateScope].
+ */
+// TODO: caching story? should each Scope have a cache of applied FrpStateful instances?
+@ExperimentalFrpApi
+@Suppress("NOTHING_TO_INLINE")
+inline fun <A> statefully(noinline block: suspend FrpStateScope.() -> A): FrpStateful<A> = block
+
+/**
+ * Operations that accumulate state within the FRP network.
+ *
+ * State accumulation is an ongoing process that has a lifetime. Use `-Latest` combinators, such as
+ * [mapLatestStateful], to create smaller, nested lifecycles so that accumulation isn't running
+ * longer than needed.
+ */
+@ExperimentalFrpApi
+@RestrictsSuspension
+interface FrpStateScope : FrpTransactionScope {
+
+    /** TODO */
+    @ExperimentalFrpApi
+    // TODO: wish this could just be `deferred` but alas
+    fun <A> deferredStateScope(block: suspend FrpStateScope.() -> A): FrpDeferredValue<A>
+
+    /**
+     * Returns a [TState] that holds onto the most recently emitted value from this [TFlow], or
+     * [initialValue] if nothing has been emitted since it was constructed.
+     *
+     * Note that the value contained within the [TState] is not updated until *after* all [TFlow]s
+     * have been processed; this keeps the value of the [TState] consistent during the entire FRP
+     * transaction.
+     */
+    @ExperimentalFrpApi fun <A> TFlow<A>.holdDeferred(initialValue: FrpDeferredValue<A>): TState<A>
+
+    /**
+     * Returns a [TFlow] that emits from a merged, incrementally-accumulated collection of [TFlow]s
+     * emitted from this, following the same "patch" rules as outlined in [foldMapIncrementally].
+     *
+     * Conceptually this is equivalent to:
+     * ```kotlin
+     *   fun <K, V> TFlow<Map<K, Maybe<TFlow<V>>>>.mergeIncrementally(
+     *     initialTFlows: Map<K, TFlow<V>>,
+     *   ): TFlow<Map<K, V>> =
+     *     foldMapIncrementally(initialTFlows).map { it.merge() }.switch()
+     * ```
+     *
+     * While the behavior is equivalent to the conceptual definition above, the implementation is
+     * significantly more efficient.
+     *
+     * @see merge
+     */
+    @ExperimentalFrpApi
+    fun <K : Any, V> TFlow<Map<K, Maybe<TFlow<V>>>>.mergeIncrementally(
+        initialTFlows: FrpDeferredValue<Map<K, TFlow<V>>>
+    ): TFlow<Map<K, V>>
+
+    /**
+     * Returns a [TFlow] that emits from a merged, incrementally-accumulated collection of [TFlow]s
+     * emitted from this, following the same "patch" rules as outlined in [foldMapIncrementally].
+     *
+     * Conceptually this is equivalent to:
+     * ```kotlin
+     *   fun <K, V> TFlow<Map<K, Maybe<TFlow<V>>>>.mergeIncrementallyPrompt(
+     *     initialTFlows: Map<K, TFlow<V>>,
+     *   ): TFlow<Map<K, V>> =
+     *     foldMapIncrementally(initialTFlows).map { it.merge() }.switchPromptly()
+     * ```
+     *
+     * While the behavior is equivalent to the conceptual definition above, the implementation is
+     * significantly more efficient.
+     *
+     * @see merge
+     */
+    @ExperimentalFrpApi
+    fun <K : Any, V> TFlow<Map<K, Maybe<TFlow<V>>>>.mergeIncrementallyPromptly(
+        initialTFlows: FrpDeferredValue<Map<K, TFlow<V>>>
+    ): TFlow<Map<K, V>>
+
+    // TODO: everything below this comment can be made into extensions once we have context params
+
+    /**
+     * Returns a [TFlow] that emits from a merged, incrementally-accumulated collection of [TFlow]s
+     * emitted from this, following the same "patch" rules as outlined in [foldMapIncrementally].
+     *
+     * Conceptually this is equivalent to:
+     * ```kotlin
+     *   fun <K, V> TFlow<Map<K, Maybe<TFlow<V>>>>.mergeIncrementally(
+     *     initialTFlows: Map<K, TFlow<V>>,
+     *   ): TFlow<Map<K, V>> =
+     *     foldMapIncrementally(initialTFlows).map { it.merge() }.switch()
+     * ```
+     *
+     * While the behavior is equivalent to the conceptual definition above, the implementation is
+     * significantly more efficient.
+     *
+     * @see merge
+     */
+    @ExperimentalFrpApi
+    fun <K : Any, V> TFlow<Map<K, Maybe<TFlow<V>>>>.mergeIncrementally(
+        initialTFlows: Map<K, TFlow<V>> = emptyMap()
+    ): TFlow<Map<K, V>> = mergeIncrementally(deferredOf(initialTFlows))
+
+    /**
+     * Returns a [TFlow] that emits from a merged, incrementally-accumulated collection of [TFlow]s
+     * emitted from this, following the same "patch" rules as outlined in [foldMapIncrementally].
+     *
+     * Conceptually this is equivalent to:
+     * ```kotlin
+     *   fun <K, V> TFlow<Map<K, Maybe<TFlow<V>>>>.mergeIncrementallyPrompt(
+     *     initialTFlows: Map<K, TFlow<V>>,
+     *   ): TFlow<Map<K, V>> =
+     *     foldMapIncrementally(initialTFlows).map { it.merge() }.switchPromptly()
+     * ```
+     *
+     * While the behavior is equivalent to the conceptual definition above, the implementation is
+     * significantly more efficient.
+     *
+     * @see merge
+     */
+    @ExperimentalFrpApi
+    fun <K : Any, V> TFlow<Map<K, Maybe<TFlow<V>>>>.mergeIncrementallyPromptly(
+        initialTFlows: Map<K, TFlow<V>> = emptyMap()
+    ): TFlow<Map<K, V>> = mergeIncrementallyPromptly(deferredOf(initialTFlows))
+
+    /** Applies the [FrpStateful] within this [FrpStateScope]. */
+    @ExperimentalFrpApi suspend fun <A> FrpStateful<A>.applyStateful(): A = this()
+
+    /**
+     * Applies the [FrpStateful] within this [FrpStateScope], returning the result as an
+     * [FrpDeferredValue].
+     */
+    @ExperimentalFrpApi
+    fun <A> FrpStateful<A>.applyStatefulDeferred(): FrpDeferredValue<A> = deferredStateScope {
+        applyStateful()
+    }
+
+    /**
+     * Returns a [TState] that holds onto the most recently emitted value from this [TFlow], or
+     * [initialValue] if nothing has been emitted since it was constructed.
+     *
+     * Note that the value contained within the [TState] is not updated until *after* all [TFlow]s
+     * have been processed; this keeps the value of the [TState] consistent during the entire FRP
+     * transaction.
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<A>.hold(initialValue: A): TState<A> = holdDeferred(deferredOf(initialValue))
+
+    /**
+     * Returns a [TFlow] the emits the result of applying [FrpStatefuls][FrpStateful] emitted from
+     * the original [TFlow].
+     *
+     * Unlike [applyLatestStateful], state accumulation is not stopped with each subsequent emission
+     * of the original [TFlow].
+     */
+    @ExperimentalFrpApi fun <A> TFlow<FrpStateful<A>>.applyStatefuls(): TFlow<A>
+
+    /**
+     * Returns a [TFlow] containing the results of applying [transform] to each value of the
+     * original [TFlow].
+     *
+     * [transform] can perform state accumulation via its [FrpStateScope] receiver. Unlike
+     * [mapLatestStateful], accumulation is not stopped with each subsequent emission of the
+     * original [TFlow].
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TFlow<A>.mapStateful(transform: suspend FrpStateScope.(A) -> B): TFlow<B> =
+        mapPure { statefully { transform(it) } }.applyStatefuls()
+
+    /**
+     * Returns a [TState] the holds the result of applying the [FrpStateful] held by the original
+     * [TState].
+     *
+     * Unlike [applyLatestStateful], state accumulation is not stopped with each state change.
+     */
+    @ExperimentalFrpApi
+    fun <A> TState<FrpStateful<A>>.applyStatefuls(): TState<A> =
+        stateChanges
+            .applyStatefuls()
+            .holdDeferred(initialValue = deferredStateScope { sampleDeferred().get()() })
+
+    /** Returns a [TFlow] that switches to the [TFlow] emitted by the original [TFlow]. */
+    @ExperimentalFrpApi fun <A> TFlow<TFlow<A>>.flatten() = hold(emptyTFlow).switch()
+
+    /**
+     * Returns a [TFlow] containing the results of applying [transform] to each value of the
+     * original [TFlow].
+     *
+     * [transform] can perform state accumulation via its [FrpStateScope] receiver. With each
+     * invocation of [transform], state accumulation from previous invocation is stopped.
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TFlow<A>.mapLatestStateful(transform: suspend FrpStateScope.(A) -> B): TFlow<B> =
+        mapPure { statefully { transform(it) } }.applyLatestStateful()
+
+    /**
+     * Returns a [TFlow] that switches to a new [TFlow] produced by [transform] every time the
+     * original [TFlow] emits a value.
+     *
+     * [transform] can perform state accumulation via its [FrpStateScope] receiver. With each
+     * invocation of [transform], state accumulation from previous invocation is stopped.
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TFlow<A>.flatMapLatestStateful(
+        transform: suspend FrpStateScope.(A) -> TFlow<B>
+    ): TFlow<B> = mapLatestStateful(transform).flatten()
+
+    /**
+     * Returns a [TFlow] containing the results of applying each [FrpStateful] emitted from the
+     * original [TFlow].
+     *
+     * When each [FrpStateful] is applied, state accumulation from the previously-active
+     * [FrpStateful] is stopped.
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<FrpStateful<A>>.applyLatestStateful(): TFlow<A> = applyLatestStateful {}.first
+
+    /**
+     * Returns a [TState] containing the value returned by applying the [FrpStateful] held by the
+     * original [TState].
+     *
+     * When each [FrpStateful] is applied, state accumulation from the previously-active
+     * [FrpStateful] is stopped.
+     */
+    @ExperimentalFrpApi
+    fun <A> TState<FrpStateful<A>>.applyLatestStateful(): TState<A> {
+        val (changes, init) = stateChanges.applyLatestStateful { sample()() }
+        return changes.holdDeferred(init)
+    }
+
+    /**
+     * Returns a [TFlow] containing the results of applying each [FrpStateful] emitted from the
+     * original [TFlow], and a [FrpDeferredValue] containing the result of applying [init]
+     * immediately.
+     *
+     * When each [FrpStateful] is applied, state accumulation from the previously-active
+     * [FrpStateful] is stopped.
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TFlow<FrpStateful<B>>.applyLatestStateful(
+        init: FrpStateful<A>
+    ): Pair<TFlow<B>, FrpDeferredValue<A>> {
+        val (flow, result) =
+            mapCheap { spec -> mapOf(Unit to just(spec)) }
+                .applyLatestStatefulForKey(init = mapOf(Unit to init), numKeys = 1)
+        val outFlow: TFlow<B> =
+            flow.mapMaybe {
+                checkNotNull(it[Unit]) { "applyLatest: expected result, but none present in: $it" }
+            }
+        val outInit: FrpDeferredValue<A> = deferredTransactionScope {
+            val initResult: Map<Unit, A> = result.get()
+            check(Unit in initResult) {
+                "applyLatest: expected initial result, but none present in: $initResult"
+            }
+            @Suppress("UNCHECKED_CAST")
+            initResult.getOrDefault(Unit) { null } as A
+        }
+        return Pair(outFlow, outInit)
+    }
+
+    /**
+     * Returns a [TFlow] containing the results of applying each [FrpStateful] emitted from the
+     * original [TFlow], and a [FrpDeferredValue] containing the result of applying [init]
+     * immediately.
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpStateful] will be stopped with no replacement.
+     *
+     * When each [FrpStateful] is applied, state accumulation from the previously-active
+     * [FrpStateful] with the same key is stopped.
+     */
+    @ExperimentalFrpApi
+    fun <K, A, B> TFlow<Map<K, Maybe<FrpStateful<A>>>>.applyLatestStatefulForKey(
+        init: FrpDeferredValue<Map<K, FrpStateful<B>>>,
+        numKeys: Int? = null,
+    ): Pair<TFlow<Map<K, Maybe<A>>>, FrpDeferredValue<Map<K, B>>>
+
+    /**
+     * Returns a [TFlow] containing the results of applying each [FrpStateful] emitted from the
+     * original [TFlow], and a [FrpDeferredValue] containing the result of applying [init]
+     * immediately.
+     *
+     * When each [FrpStateful] is applied, state accumulation from the previously-active
+     * [FrpStateful] with the same key is stopped.
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpStateful] will be stopped with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A, B> TFlow<Map<K, Maybe<FrpStateful<A>>>>.applyLatestStatefulForKey(
+        init: Map<K, FrpStateful<B>>,
+        numKeys: Int? = null,
+    ): Pair<TFlow<Map<K, Maybe<A>>>, FrpDeferredValue<Map<K, B>>> =
+        applyLatestStatefulForKey(deferredOf(init), numKeys)
+
+    /**
+     * Returns a [TState] containing the latest results of applying each [FrpStateful] emitted from
+     * the original [TFlow].
+     *
+     * When each [FrpStateful] is applied, state accumulation from the previously-active
+     * [FrpStateful] with the same key is stopped.
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpStateful] will be stopped with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A> TFlow<Map<K, Maybe<FrpStateful<A>>>>.holdLatestStatefulForKey(
+        init: FrpDeferredValue<Map<K, FrpStateful<A>>>,
+        numKeys: Int? = null,
+    ): TState<Map<K, A>> {
+        val (changes, initialValues) = applyLatestStatefulForKey(init, numKeys)
+        return changes.foldMapIncrementally(initialValues)
+    }
+
+    /**
+     * Returns a [TState] containing the latest results of applying each [FrpStateful] emitted from
+     * the original [TFlow].
+     *
+     * When each [FrpStateful] is applied, state accumulation from the previously-active
+     * [FrpStateful] with the same key is stopped.
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpStateful] will be stopped with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A> TFlow<Map<K, Maybe<FrpStateful<A>>>>.holdLatestStatefulForKey(
+        init: Map<K, FrpStateful<A>> = emptyMap(),
+        numKeys: Int? = null,
+    ): TState<Map<K, A>> = holdLatestStatefulForKey(deferredOf(init), numKeys)
+
+    /**
+     * Returns a [TFlow] containing the results of applying each [FrpStateful] emitted from the
+     * original [TFlow], and a [FrpDeferredValue] containing the result of applying [init]
+     * immediately.
+     *
+     * When each [FrpStateful] is applied, state accumulation from the previously-active
+     * [FrpStateful] with the same key is stopped.
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpStateful] will be stopped with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A> TFlow<Map<K, Maybe<FrpStateful<A>>>>.applyLatestStatefulForKey(
+        numKeys: Int? = null
+    ): TFlow<Map<K, Maybe<A>>> =
+        applyLatestStatefulForKey(init = emptyMap<K, FrpStateful<*>>(), numKeys = numKeys).first
+
+    /**
+     * Returns a [TFlow] containing the results of applying [transform] to each value of the
+     * original [TFlow], and a [FrpDeferredValue] containing the result of applying [transform] to
+     * [initialValues] immediately.
+     *
+     * [transform] can perform state accumulation via its [FrpStateScope] receiver. With each
+     * invocation of [transform], state accumulation from previous invocation is stopped.
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpStateScope] will be stopped with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A, B> TFlow<Map<K, Maybe<A>>>.mapLatestStatefulForKey(
+        initialValues: FrpDeferredValue<Map<K, A>>,
+        numKeys: Int? = null,
+        transform: suspend FrpStateScope.(A) -> B,
+    ): Pair<TFlow<Map<K, Maybe<B>>>, FrpDeferredValue<Map<K, B>>> =
+        mapPure { patch -> patch.mapValues { (_, v) -> v.map { statefully { transform(it) } } } }
+            .applyLatestStatefulForKey(
+                deferredStateScope {
+                    initialValues.get().mapValues { (_, v) -> statefully { transform(v) } }
+                },
+                numKeys = numKeys,
+            )
+
+    /**
+     * Returns a [TFlow] containing the results of applying [transform] to each value of the
+     * original [TFlow], and a [FrpDeferredValue] containing the result of applying [transform] to
+     * [initialValues] immediately.
+     *
+     * [transform] can perform state accumulation via its [FrpStateScope] receiver. With each
+     * invocation of [transform], state accumulation from previous invocation is stopped.
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpStateScope] will be stopped with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A, B> TFlow<Map<K, Maybe<A>>>.mapLatestStatefulForKey(
+        initialValues: Map<K, A>,
+        numKeys: Int? = null,
+        transform: suspend FrpStateScope.(A) -> B,
+    ): Pair<TFlow<Map<K, Maybe<B>>>, FrpDeferredValue<Map<K, B>>> =
+        mapLatestStatefulForKey(deferredOf(initialValues), numKeys, transform)
+
+    /**
+     * Returns a [TFlow] containing the results of applying [transform] to each value of the
+     * original [TFlow].
+     *
+     * [transform] can perform state accumulation via its [FrpStateScope] receiver. With each
+     * invocation of [transform], state accumulation from previous invocation is stopped.
+     *
+     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * previously-active [FrpStateScope] will be stopped with no replacement.
+     */
+    @ExperimentalFrpApi
+    fun <K, A, B> TFlow<Map<K, Maybe<A>>>.mapLatestStatefulForKey(
+        numKeys: Int? = null,
+        transform: suspend FrpStateScope.(A) -> B,
+    ): TFlow<Map<K, Maybe<B>>> = mapLatestStatefulForKey(emptyMap(), numKeys, transform).first
+
+    /**
+     * Returns a [TFlow] that will only emit the next event of the original [TFlow], and then will
+     * act as [emptyTFlow].
+     *
+     * If the original [TFlow] is emitting an event at this exact time, then it will be the only
+     * even emitted from the result [TFlow].
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<A>.nextOnly(): TFlow<A> =
+        if (this === emptyTFlow) {
+            this
+        } else {
+            TFlowLoop<A>().also {
+                it.loopback = it.mapCheap { emptyTFlow }.hold(this@nextOnly).switch()
+            }
+        }
+
+    /** Returns a [TFlow] that skips the next emission of the original [TFlow]. */
+    @ExperimentalFrpApi
+    fun <A> TFlow<A>.skipNext(): TFlow<A> =
+        if (this === emptyTFlow) {
+            this
+        } else {
+            nextOnly().mapCheap { this@skipNext }.hold(emptyTFlow).switch()
+        }
+
+    /**
+     * Returns a [TFlow] that emits values from the original [TFlow] up until [stop] emits a value.
+     *
+     * If the original [TFlow] emits at the same time as [stop], then the returned [TFlow] will emit
+     * that value.
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<A>.takeUntil(stop: TFlow<*>): TFlow<A> =
+        if (stop === emptyTFlow) {
+            this
+        } else {
+            stop.mapCheap { emptyTFlow }.nextOnly().hold(this).switch()
+        }
+
+    /**
+     * Invokes [stateful] in a new [FrpStateScope] that is a child of this one.
+     *
+     * This new scope is stopped when [stop] first emits a value, or when the parent scope is
+     * stopped. Stopping will end all state accumulation; any [TStates][TState] returned from this
+     * scope will no longer update.
+     */
+    @ExperimentalFrpApi
+    fun <A> childStateScope(stop: TFlow<*>, stateful: FrpStateful<A>): FrpDeferredValue<A> {
+        val (_, init: FrpDeferredValue<Map<Unit, A>>) =
+            stop
+                .nextOnly()
+                .mapPure { mapOf(Unit to none<FrpStateful<A>>()) }
+                .applyLatestStatefulForKey(init = mapOf(Unit to stateful), numKeys = 1)
+        return deferredStateScope { init.get().getValue(Unit) }
+    }
+
+    /**
+     * Returns a [TFlow] that emits values from the original [TFlow] up to and including a value is
+     * emitted that satisfies [predicate].
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<A>.takeUntil(predicate: suspend FrpTransactionScope.(A) -> Boolean): TFlow<A> =
+        takeUntil(filter(predicate))
+
+    /**
+     * Returns a [TState] that is incrementally updated when this [TFlow] emits a value, by applying
+     * [transform] to both the emitted value and the currently tracked state.
+     *
+     * Note that the value contained within the [TState] is not updated until *after* all [TFlow]s
+     * have been processed; this keeps the value of the [TState] consistent during the entire FRP
+     * transaction.
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TFlow<A>.fold(
+        initialValue: B,
+        transform: suspend FrpTransactionScope.(A, B) -> B,
+    ): TState<B> {
+        lateinit var state: TState<B>
+        return mapPure { a -> transform(a, state.sample()) }.hold(initialValue).also { state = it }
+    }
+
+    /**
+     * Returns a [TState] that is incrementally updated when this [TFlow] emits a value, by applying
+     * [transform] to both the emitted value and the currently tracked state.
+     *
+     * Note that the value contained within the [TState] is not updated until *after* all [TFlow]s
+     * have been processed; this keeps the value of the [TState] consistent during the entire FRP
+     * transaction.
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TFlow<A>.foldDeferred(
+        initialValue: FrpDeferredValue<B>,
+        transform: suspend FrpTransactionScope.(A, B) -> B,
+    ): TState<B> {
+        lateinit var state: TState<B>
+        return mapPure { a -> transform(a, state.sample()) }
+            .holdDeferred(initialValue)
+            .also { state = it }
+    }
+
+    /**
+     * Returns a [TState] that holds onto the result of applying the most recently emitted
+     * [FrpStateful] this [TFlow], or [init] if nothing has been emitted since it was constructed.
+     *
+     * When each [FrpStateful] is applied, state accumulation from the previously-active
+     * [FrpStateful] is stopped.
+     *
+     * Note that the value contained within the [TState] is not updated until *after* all [TFlow]s
+     * have been processed; this keeps the value of the [TState] consistent during the entire FRP
+     * transaction.
+     *
+     * Shorthand for:
+     * ```kotlin
+     * val (changes, initApplied) = applyLatestStateful(init)
+     * return changes.toTStateDeferred(initApplied)
+     * ```
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<FrpStateful<A>>.holdLatestStateful(init: FrpStateful<A>): TState<A> {
+        val (changes, initApplied) = applyLatestStateful(init)
+        return changes.holdDeferred(initApplied)
+    }
+
+    /**
+     * Returns a [TFlow] that emits the two most recent emissions from the original [TFlow].
+     * [initialValue] is used as the previous value for the first emission.
+     *
+     * Shorthand for `sample(hold(init)) { new, old -> Pair(old, new) }`
+     */
+    @ExperimentalFrpApi
+    fun <S, T : S> TFlow<T>.pairwise(initialValue: S): TFlow<WithPrev<S, T>> {
+        val previous = hold(initialValue)
+        return mapCheap { new -> WithPrev(previousValue = previous.sample(), newValue = new) }
+    }
+
+    /**
+     * Returns a [TFlow] that emits the two most recent emissions from the original [TFlow]. Note
+     * that the returned [TFlow] will not emit until the original [TFlow] has emitted twice.
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<A>.pairwise(): TFlow<WithPrev<A, A>> =
+        mapCheap { just(it) }
+            .pairwise(none)
+            .mapMaybe { (prev, next) -> prev.zipWith(next, ::WithPrev) }
+
+    /**
+     * Returns a [TState] that holds both the current and previous values of the original [TState].
+     * [initialPreviousValue] is used as the first previous value.
+     *
+     * Shorthand for `sample(hold(init)) { new, old -> Pair(old, new) }`
+     */
+    @ExperimentalFrpApi
+    fun <S, T : S> TState<T>.pairwise(initialPreviousValue: S): TState<WithPrev<S, T>> =
+        stateChanges
+            .pairwise(initialPreviousValue)
+            .holdDeferred(deferredTransactionScope { WithPrev(initialPreviousValue, sample()) })
+
+    /**
+     * Returns a [TState] holding a [Map] that is updated incrementally whenever this emits a value.
+     *
+     * The value emitted is used as a "patch" for the tracked [Map]; for each key [K] in the emitted
+     * map, an associated value of [Just] will insert or replace the value in the tracked [Map], and
+     * an associated value of [none] will remove the key from the tracked [Map].
+     */
+    @ExperimentalFrpApi
+    fun <K, V> TFlow<Map<K, Maybe<V>>>.foldMapIncrementally(
+        initialValues: FrpDeferredValue<Map<K, V>>
+    ): TState<Map<K, V>> =
+        foldDeferred(initialValues) { patch, map ->
+            val (adds: List<Pair<K, V>>, removes: List<K>) =
+                patch
+                    .asSequence()
+                    .map { (k, v) -> if (v is Just) Left(k to v.value) else Right(k) }
+                    .partitionEithers()
+            val removed: Map<K, V> = map - removes.toSet()
+            val updated: Map<K, V> = removed + adds
+            updated
+        }
+
+    /**
+     * Returns a [TState] holding a [Map] that is updated incrementally whenever this emits a value.
+     *
+     * The value emitted is used as a "patch" for the tracked [Map]; for each key [K] in the emitted
+     * map, an associated value of [Just] will insert or replace the value in the tracked [Map], and
+     * an associated value of [none] will remove the key from the tracked [Map].
+     */
+    @ExperimentalFrpApi
+    fun <K, V> TFlow<Map<K, Maybe<V>>>.foldMapIncrementally(
+        initialValues: Map<K, V> = emptyMap()
+    ): TState<Map<K, V>> = foldMapIncrementally(deferredOf(initialValues))
+
+    /**
+     * Returns a [TFlow] that wraps each emission of the original [TFlow] into an [IndexedValue],
+     * containing the emitted value and its index (starting from zero).
+     *
+     * Shorthand for:
+     * ```
+     *   val index = fold(0) { _, oldIdx -> oldIdx + 1 }
+     *   sample(index) { a, idx -> IndexedValue(idx, a) }
+     * ```
+     */
+    @ExperimentalFrpApi
+    fun <A> TFlow<A>.withIndex(): TFlow<IndexedValue<A>> {
+        val index = fold(0) { _, old -> old + 1 }
+        return sample(index) { a, idx -> IndexedValue(idx, a) }
+    }
+
+    /**
+     * Returns a [TFlow] containing the results of applying [transform] to each value of the
+     * original [TFlow] and its index (starting from zero).
+     *
+     * Shorthand for:
+     * ```
+     *   withIndex().map { (idx, a) -> transform(idx, a) }
+     * ```
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TFlow<A>.mapIndexed(transform: suspend FrpTransactionScope.(Int, A) -> B): TFlow<B> {
+        val index = fold(0) { _, i -> i + 1 }
+        return sample(index) { a, idx -> transform(idx, a) }
+    }
+
+    /** Returns a [TFlow] where all subsequent repetitions of the same value are filtered out. */
+    @ExperimentalFrpApi
+    fun <A> TFlow<A>.distinctUntilChanged(): TFlow<A> {
+        val state: TState<Any?> = hold(Any())
+        return filter { it != state.sample() }
+    }
+
+    /**
+     * Returns a new [TFlow] that emits at the same rate as the original [TFlow], but combines the
+     * emitted value with the most recent emission from [other] using [transform].
+     *
+     * Note that the returned [TFlow] will not emit anything until [other] has emitted at least one
+     * value.
+     */
+    @ExperimentalFrpApi
+    fun <A, B, C> TFlow<A>.sample(
+        other: TFlow<B>,
+        transform: suspend FrpTransactionScope.(A, B) -> C,
+    ): TFlow<C> {
+        val state = other.mapCheap { just(it) }.hold(none)
+        return sample(state) { a, b -> b.map { transform(a, it) } }.filterJust()
+    }
+
+    /**
+     * Returns a [TState] that samples the [Transactional] held by the given [TState] within the
+     * same transaction that the state changes.
+     */
+    @ExperimentalFrpApi
+    fun <A> TState<Transactional<A>>.sampleTransactionals(): TState<A> =
+        stateChanges
+            .sampleTransactionals()
+            .holdDeferred(deferredTransactionScope { sample().sample() })
+
+    /**
+     * Returns a [TState] that transforms the value held inside this [TState] by applying it to the
+     * given function [transform].
+     */
+    @ExperimentalFrpApi
+    fun <A, B> TState<A>.map(transform: suspend FrpTransactionScope.(A) -> B): TState<B> =
+        mapPure { transactionally { transform(it) } }.sampleTransactionals()
+
+    /**
+     * Returns a [TState] whose value is generated with [transform] by combining the current values
+     * of each given [TState].
+     *
+     * @see TState.combineWith
+     */
+    @ExperimentalFrpApi
+    fun <A, B, Z> combine(
+        stateA: TState<A>,
+        stateB: TState<B>,
+        transform: suspend FrpTransactionScope.(A, B) -> Z,
+    ): TState<Z> =
+        com.android.systemui.kairos
+            .combine(stateA, stateB) { a, b -> transactionally { transform(a, b) } }
+            .sampleTransactionals()
+
+    /**
+     * Returns a [TState] whose value is generated with [transform] by combining the current values
+     * of each given [TState].
+     *
+     * @see TState.combineWith
+     */
+    @ExperimentalFrpApi
+    fun <A, B, C, D, Z> combine(
+        stateA: TState<A>,
+        stateB: TState<B>,
+        stateC: TState<C>,
+        stateD: TState<D>,
+        transform: suspend FrpTransactionScope.(A, B, C, D) -> Z,
+    ): TState<Z> =
+        com.android.systemui.kairos
+            .combine(stateA, stateB, stateC, stateD) { a, b, c, d ->
+                transactionally { transform(a, b, c, d) }
+            }
+            .sampleTransactionals()
+
+    /** Returns a [TState] by applying [transform] to the value held by the original [TState]. */
+    @ExperimentalFrpApi
+    fun <A, B> TState<A>.flatMap(
+        transform: suspend FrpTransactionScope.(A) -> TState<B>
+    ): TState<B> = mapPure { transactionally { transform(it) } }.sampleTransactionals().flatten()
+
+    /**
+     * Returns a [TState] whose value is generated with [transform] by combining the current values
+     * of each given [TState].
+     *
+     * @see TState.combineWith
+     */
+    @ExperimentalFrpApi
+    fun <A, Z> combine(
+        vararg states: TState<A>,
+        transform: suspend FrpTransactionScope.(List<A>) -> Z,
+    ): TState<Z> = combinePure(*states).map(transform)
+
+    /**
+     * Returns a [TState] whose value is generated with [transform] by combining the current values
+     * of each given [TState].
+     *
+     * @see TState.combineWith
+     */
+    @ExperimentalFrpApi
+    fun <A, Z> Iterable<TState<A>>.combine(
+        transform: suspend FrpTransactionScope.(List<A>) -> Z
+    ): TState<Z> = combinePure().map(transform)
+
+    /**
+     * Returns a [TState] by combining the values held inside the given [TState]s by applying them
+     * to the given function [transform].
+     */
+    @ExperimentalFrpApi
+    fun <A, B, C> TState<A>.combineWith(
+        other: TState<B>,
+        transform: suspend FrpTransactionScope.(A, B) -> C,
+    ): TState<C> = combine(this, other, transform)
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpTransactionScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpTransactionScope.kt
new file mode 100644
index 0000000..a7ae1d9
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpTransactionScope.kt
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos
+
+import kotlin.coroutines.RestrictsSuspension
+
+/**
+ * FRP operations that are available while a transaction is active.
+ *
+ * These operations do not accumulate state, which makes [FrpTransactionScope] weaker than
+ * [FrpStateScope], but allows them to be used in more places.
+ */
+@ExperimentalFrpApi
+@RestrictsSuspension
+interface FrpTransactionScope : FrpScope {
+
+    /**
+     * Returns the current value of this [Transactional] as a [FrpDeferredValue].
+     *
+     * @see sample
+     */
+    @ExperimentalFrpApi fun <A> Transactional<A>.sampleDeferred(): FrpDeferredValue<A>
+
+    /**
+     * Returns the current value of this [TState] as a [FrpDeferredValue].
+     *
+     * @see sample
+     */
+    @ExperimentalFrpApi fun <A> TState<A>.sampleDeferred(): FrpDeferredValue<A>
+
+    /** TODO */
+    @ExperimentalFrpApi
+    fun <A> deferredTransactionScope(
+        block: suspend FrpTransactionScope.() -> A
+    ): FrpDeferredValue<A>
+
+    /** A [TFlow] that emits once, within this transaction, and then never again. */
+    @ExperimentalFrpApi val now: TFlow<Unit>
+
+    /**
+     * Returns the current value held by this [TState]. Guaranteed to be consistent within the same
+     * transaction.
+     */
+    @ExperimentalFrpApi suspend fun <A> TState<A>.sample(): A = sampleDeferred().get()
+
+    /**
+     * Returns the current value held by this [Transactional]. Guaranteed to be consistent within
+     * the same transaction.
+     */
+    @ExperimentalFrpApi suspend fun <A> Transactional<A>.sample(): A = sampleDeferred().get()
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TFlow.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TFlow.kt
new file mode 100644
index 0000000..7ba1aca
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TFlow.kt
@@ -0,0 +1,560 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos
+
+import com.android.systemui.kairos.internal.DemuxImpl
+import com.android.systemui.kairos.internal.Init
+import com.android.systemui.kairos.internal.InitScope
+import com.android.systemui.kairos.internal.InputNode
+import com.android.systemui.kairos.internal.Network
+import com.android.systemui.kairos.internal.NoScope
+import com.android.systemui.kairos.internal.TFlowImpl
+import com.android.systemui.kairos.internal.activated
+import com.android.systemui.kairos.internal.cached
+import com.android.systemui.kairos.internal.constInit
+import com.android.systemui.kairos.internal.filterNode
+import com.android.systemui.kairos.internal.init
+import com.android.systemui.kairos.internal.map
+import com.android.systemui.kairos.internal.mapImpl
+import com.android.systemui.kairos.internal.mapMaybeNode
+import com.android.systemui.kairos.internal.mergeNodes
+import com.android.systemui.kairos.internal.mergeNodesLeft
+import com.android.systemui.kairos.internal.neverImpl
+import com.android.systemui.kairos.internal.switchDeferredImplSingle
+import com.android.systemui.kairos.internal.switchPromptImpl
+import com.android.systemui.kairos.internal.util.hashString
+import com.android.systemui.kairos.util.Either
+import com.android.systemui.kairos.util.Left
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.Right
+import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.map
+import com.android.systemui.kairos.util.toMaybe
+import java.util.concurrent.atomic.AtomicReference
+import kotlin.reflect.KProperty
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.async
+import kotlinx.coroutines.coroutineScope
+
+/** A series of values of type [A] available at discrete points in time. */
+@ExperimentalFrpApi
+sealed class TFlow<out A> {
+    companion object {
+        /** A [TFlow] with no values. */
+        val empty: TFlow<Nothing> = EmptyFlow
+    }
+}
+
+/** A [TFlow] with no values. */
+@ExperimentalFrpApi val emptyTFlow: TFlow<Nothing> = TFlow.empty
+
+/**
+ * A forward-reference to a [TFlow]. Useful for recursive definitions.
+ *
+ * This reference can be used like a standard [TFlow], but will hold up evaluation of the FRP
+ * network until the [loopback] reference is set.
+ */
+@ExperimentalFrpApi
+class TFlowLoop<A> : TFlow<A>() {
+    private val deferred = CompletableDeferred<TFlow<A>>()
+
+    internal val init: Init<TFlowImpl<A>> =
+        init(name = null) { deferred.await().init.connect(evalScope = this) }
+
+    /** The [TFlow] this reference is referring to. */
+    @ExperimentalFrpApi
+    var loopback: TFlow<A>? = null
+        set(value) {
+            value?.let {
+                check(deferred.complete(value)) { "TFlowLoop.loopback has already been set." }
+                field = value
+            }
+        }
+
+    operator fun getValue(thisRef: Any?, property: KProperty<*>): TFlow<A> = this
+
+    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: TFlow<A>) {
+        loopback = value
+    }
+
+    override fun toString(): String = "${this::class.simpleName}@$hashString"
+}
+
+/** TODO */
+@ExperimentalFrpApi fun <A> Lazy<TFlow<A>>.defer(): TFlow<A> = deferInline { value }
+
+/** TODO */
+@ExperimentalFrpApi
+fun <A> FrpDeferredValue<TFlow<A>>.defer(): TFlow<A> = deferInline { unwrapped.await() }
+
+/** TODO */
+@ExperimentalFrpApi
+fun <A> deferTFlow(block: suspend FrpScope.() -> TFlow<A>): TFlow<A> = deferInline {
+    NoScope.runInFrpScope(block)
+}
+
+/** Returns a [TFlow] that emits the new value of this [TState] when it changes. */
+@ExperimentalFrpApi
+val <A> TState<A>.stateChanges: TFlow<A>
+    get() = TFlowInit(init(name = null) { init.connect(evalScope = this).changes })
+
+/**
+ * Returns a [TFlow] that contains only the [just] results of applying [transform] to each value of
+ * the original [TFlow].
+ *
+ * @see mapNotNull
+ */
+@ExperimentalFrpApi
+fun <A, B> TFlow<A>.mapMaybe(transform: suspend FrpTransactionScope.(A) -> Maybe<B>): TFlow<B> {
+    val pulse =
+        mapMaybeNode({ init.connect(evalScope = this) }) { runInTransactionScope { transform(it) } }
+    return TFlowInit(constInit(name = null, pulse))
+}
+
+/**
+ * Returns a [TFlow] that contains only the non-null results of applying [transform] to each value
+ * of the original [TFlow].
+ *
+ * @see mapMaybe
+ */
+@ExperimentalFrpApi
+fun <A, B> TFlow<A>.mapNotNull(transform: suspend FrpTransactionScope.(A) -> B?): TFlow<B> =
+    mapMaybe {
+        transform(it).toMaybe()
+    }
+
+/** Returns a [TFlow] containing only values of the original [TFlow] that are not null. */
+@ExperimentalFrpApi fun <A> TFlow<A?>.filterNotNull(): TFlow<A> = mapNotNull { it }
+
+/** Shorthand for `mapNotNull { it as? A }`. */
+@ExperimentalFrpApi
+inline fun <reified A> TFlow<*>.filterIsInstance(): TFlow<A> = mapNotNull { it as? A }
+
+/** Shorthand for `mapMaybe { it }`. */
+@ExperimentalFrpApi fun <A> TFlow<Maybe<A>>.filterJust(): TFlow<A> = mapMaybe { it }
+
+/**
+ * Returns a [TFlow] containing the results of applying [transform] to each value of the original
+ * [TFlow].
+ */
+@ExperimentalFrpApi
+fun <A, B> TFlow<A>.map(transform: suspend FrpTransactionScope.(A) -> B): TFlow<B> {
+    val mapped: TFlowImpl<B> =
+        mapImpl({ init.connect(evalScope = this) }) { a -> runInTransactionScope { transform(a) } }
+    return TFlowInit(constInit(name = null, mapped.cached()))
+}
+
+/**
+ * Like [map], but the emission is not cached during the transaction. Use only if [transform] is
+ * fast and pure.
+ *
+ * @see map
+ */
+@ExperimentalFrpApi
+fun <A, B> TFlow<A>.mapCheap(transform: suspend FrpTransactionScope.(A) -> B): TFlow<B> =
+    TFlowInit(
+        constInit(
+            name = null,
+            mapImpl({ init.connect(evalScope = this) }) { a ->
+                runInTransactionScope { transform(a) }
+            },
+        )
+    )
+
+/**
+ * Returns a [TFlow] that invokes [action] before each value of the original [TFlow] is emitted.
+ * Useful for logging and debugging.
+ *
+ * ```
+ *   pulse.onEach { foo(it) } == pulse.map { foo(it); it }
+ * ```
+ *
+ * Note that the side effects performed in [onEach] are only performed while the resulting [TFlow]
+ * is connected to an output of the FRP network. If your goal is to reliably perform side effects in
+ * response to a [TFlow], use the output combinators available in [FrpBuildScope], such as
+ * [FrpBuildScope.toSharedFlow] or [FrpBuildScope.observe].
+ */
+@ExperimentalFrpApi
+fun <A> TFlow<A>.onEach(action: suspend FrpTransactionScope.(A) -> Unit): TFlow<A> = map {
+    action(it)
+    it
+}
+
+/**
+ * Returns a [TFlow] containing only values of the original [TFlow] that satisfy the given
+ * [predicate].
+ */
+@ExperimentalFrpApi
+fun <A> TFlow<A>.filter(predicate: suspend FrpTransactionScope.(A) -> Boolean): TFlow<A> {
+    val pulse =
+        filterNode({ init.connect(evalScope = this) }) { runInTransactionScope { predicate(it) } }
+    return TFlowInit(constInit(name = null, pulse.cached()))
+}
+
+/**
+ * Splits a [TFlow] of pairs into a pair of [TFlows][TFlow], where each returned [TFlow] emits half
+ * of the original.
+ *
+ * Shorthand for:
+ * ```kotlin
+ * val lefts = map { it.first }
+ * val rights = map { it.second }
+ * return Pair(lefts, rights)
+ * ```
+ */
+@ExperimentalFrpApi
+fun <A, B> TFlow<Pair<A, B>>.unzip(): Pair<TFlow<A>, TFlow<B>> {
+    val lefts = map { it.first }
+    val rights = map { it.second }
+    return lefts to rights
+}
+
+/**
+ * Merges the given [TFlows][TFlow] into a single [TFlow] that emits events from both.
+ *
+ * Because [TFlow]s can only emit one value per transaction, the provided [transformCoincidence]
+ * function is used to combine coincident emissions to produce the result value to be emitted by the
+ * merged [TFlow].
+ */
+@ExperimentalFrpApi
+fun <A> TFlow<A>.mergeWith(
+    other: TFlow<A>,
+    transformCoincidence: suspend FrpTransactionScope.(A, A) -> A = { a, _ -> a },
+): TFlow<A> {
+    val node =
+        mergeNodes(
+            getPulse = { init.connect(evalScope = this) },
+            getOther = { other.init.connect(evalScope = this) },
+        ) { a, b ->
+            runInTransactionScope { transformCoincidence(a, b) }
+        }
+    return TFlowInit(constInit(name = null, node))
+}
+
+/**
+ * Merges the given [TFlows][TFlow] into a single [TFlow] that emits events from all. All coincident
+ * emissions are collected into the emitted [List], preserving the input ordering.
+ *
+ * @see mergeWith
+ * @see mergeLeft
+ */
+@ExperimentalFrpApi
+fun <A> merge(vararg flows: TFlow<A>): TFlow<List<A>> = flows.asIterable().merge()
+
+/**
+ * Merges the given [TFlows][TFlow] into a single [TFlow] that emits events from all. In the case of
+ * coincident emissions, the emission from the left-most [TFlow] is emitted.
+ *
+ * @see merge
+ */
+@ExperimentalFrpApi
+fun <A> mergeLeft(vararg flows: TFlow<A>): TFlow<A> = flows.asIterable().mergeLeft()
+
+/**
+ * Merges the given [TFlows][TFlow] into a single [TFlow] that emits events from all.
+ *
+ * Because [TFlow]s can only emit one value per transaction, the provided [transformCoincidence]
+ * function is used to combine coincident emissions to produce the result value to be emitted by the
+ * merged [TFlow].
+ */
+// TODO: can be optimized to avoid creating the intermediate list
+fun <A> merge(vararg flows: TFlow<A>, transformCoincidence: (A, A) -> A): TFlow<A> =
+    merge(*flows).map { l -> l.reduce(transformCoincidence) }
+
+/**
+ * Merges the given [TFlows][TFlow] into a single [TFlow] that emits events from all. All coincident
+ * emissions are collected into the emitted [List], preserving the input ordering.
+ *
+ * @see mergeWith
+ * @see mergeLeft
+ */
+@ExperimentalFrpApi
+fun <A> Iterable<TFlow<A>>.merge(): TFlow<List<A>> =
+    TFlowInit(constInit(name = null, mergeNodes { map { it.init.connect(evalScope = this) } }))
+
+/**
+ * Merges the given [TFlows][TFlow] into a single [TFlow] that emits events from all. In the case of
+ * coincident emissions, the emission from the left-most [TFlow] is emitted.
+ *
+ * @see merge
+ */
+@ExperimentalFrpApi
+fun <A> Iterable<TFlow<A>>.mergeLeft(): TFlow<A> =
+    TFlowInit(constInit(name = null, mergeNodesLeft { map { it.init.connect(evalScope = this) } }))
+
+/**
+ * Creates a new [TFlow] that emits events from all given [TFlow]s. All simultaneous emissions are
+ * collected into the emitted [List], preserving the input ordering.
+ *
+ * @see mergeWith
+ */
+@ExperimentalFrpApi fun <A> Sequence<TFlow<A>>.merge(): TFlow<List<A>> = asIterable().merge()
+
+/**
+ * Creates a new [TFlow] that emits events from all given [TFlow]s. All simultaneous emissions are
+ * collected into the emitted [Map], and are given the same key of the associated [TFlow] in the
+ * input [Map].
+ *
+ * @see mergeWith
+ */
+@ExperimentalFrpApi
+fun <K, A> Map<K, TFlow<A>>.merge(): TFlow<Map<K, A>> =
+    asSequence().map { (k, flowA) -> flowA.map { a -> k to a } }.toList().merge().map { it.toMap() }
+
+/**
+ * Returns a [GroupedTFlow] that can be used to efficiently split a single [TFlow] into multiple
+ * downstream [TFlow]s.
+ *
+ * The input [TFlow] emits [Map] instances that specify which downstream [TFlow] the associated
+ * value will be emitted from. These downstream [TFlow]s can be obtained via
+ * [GroupedTFlow.eventsForKey].
+ *
+ * An example:
+ * ```
+ *   val sFoo: TFlow<Map<String, Foo>> = ...
+ *   val fooById: GroupedTFlow<String, Foo> = sFoo.groupByKey()
+ *   val fooBar: TFlow<Foo> = fooById["bar"]
+ * ```
+ *
+ * This is semantically equivalent to `val fooBar = sFoo.mapNotNull { map -> map["bar"] }` but is
+ * significantly more efficient; specifically, using [mapNotNull] in this way incurs a `O(n)`
+ * performance hit, where `n` is the number of different [mapNotNull] operations used to filter on a
+ * specific key's presence in the emitted [Map]. [groupByKey] internally uses a [HashMap] to lookup
+ * the appropriate downstream [TFlow], and so operates in `O(1)`.
+ *
+ * Note that the result [GroupedTFlow] should be cached and re-used to gain the performance benefit.
+ *
+ * @see selector
+ */
+@ExperimentalFrpApi
+fun <K, A> TFlow<Map<K, A>>.groupByKey(numKeys: Int? = null): GroupedTFlow<K, A> =
+    GroupedTFlow(DemuxImpl({ init.connect(this) }, numKeys))
+
+/**
+ * Shorthand for `map { mapOf(extractKey(it) to it) }.groupByKey()`
+ *
+ * @see groupByKey
+ */
+@ExperimentalFrpApi
+fun <K, A> TFlow<A>.groupBy(
+    numKeys: Int? = null,
+    extractKey: suspend FrpTransactionScope.(A) -> K,
+): GroupedTFlow<K, A> = map { mapOf(extractKey(it) to it) }.groupByKey(numKeys)
+
+/**
+ * Returns two new [TFlow]s that contain elements from this [TFlow] that satisfy or don't satisfy
+ * [predicate].
+ *
+ * Using this is equivalent to `upstream.filter(predicate) to upstream.filter { !predicate(it) }`
+ * but is more efficient; specifically, [partition] will only invoke [predicate] once per element.
+ */
+@ExperimentalFrpApi
+fun <A> TFlow<A>.partition(
+    predicate: suspend FrpTransactionScope.(A) -> Boolean
+): Pair<TFlow<A>, TFlow<A>> {
+    val grouped: GroupedTFlow<Boolean, A> = groupBy(numKeys = 2, extractKey = predicate)
+    return Pair(grouped.eventsForKey(true), grouped.eventsForKey(false))
+}
+
+/**
+ * Returns two new [TFlow]s that contain elements from this [TFlow]; [Pair.first] will contain
+ * [Left] values, and [Pair.second] will contain [Right] values.
+ *
+ * Using this is equivalent to using [filterIsInstance] in conjunction with [map] twice, once for
+ * [Left]s and once for [Right]s, but is slightly more efficient; specifically, the
+ * [filterIsInstance] check is only performed once per element.
+ */
+@ExperimentalFrpApi
+fun <A, B> TFlow<Either<A, B>>.partitionEither(): Pair<TFlow<A>, TFlow<B>> {
+    val (left, right) = partition { it is Left }
+    return Pair(left.mapCheap { (it as Left).value }, right.mapCheap { (it as Right).value })
+}
+
+/**
+ * A mapping from keys of type [K] to [TFlow]s emitting values of type [A].
+ *
+ * @see groupByKey
+ */
+@ExperimentalFrpApi
+class GroupedTFlow<in K, out A> internal constructor(internal val impl: DemuxImpl<K, A>) {
+    /**
+     * Returns a [TFlow] that emits values of type [A] that correspond to the given [key].
+     *
+     * @see groupByKey
+     */
+    @ExperimentalFrpApi
+    fun eventsForKey(key: K): TFlow<A> = TFlowInit(constInit(name = null, impl.eventsForKey(key)))
+
+    /**
+     * Returns a [TFlow] that emits values of type [A] that correspond to the given [key].
+     *
+     * @see groupByKey
+     */
+    @ExperimentalFrpApi operator fun get(key: K): TFlow<A> = eventsForKey(key)
+}
+
+/**
+ * Returns a [TFlow] that switches to the [TFlow] contained within this [TState] whenever it
+ * changes.
+ *
+ * This switch does take effect until the *next* transaction after [TState] changes. For a switch
+ * that takes effect immediately, see [switchPromptly].
+ */
+@ExperimentalFrpApi
+fun <A> TState<TFlow<A>>.switch(): TFlow<A> {
+    return TFlowInit(
+        constInit(
+            name = null,
+            switchDeferredImplSingle(
+                getStorage = {
+                    init.connect(this).getCurrentWithEpoch(this).first.init.connect(this)
+                },
+                getPatches = {
+                    mapImpl({ init.connect(this).changes }) { newFlow ->
+                        newFlow.init.connect(this)
+                    }
+                },
+            ),
+        )
+    )
+}
+
+/**
+ * Returns a [TFlow] that switches to the [TFlow] contained within this [TState] whenever it
+ * changes.
+ *
+ * This switch takes effect immediately within the same transaction that [TState] changes. In
+ * general, you should prefer [switch] over this method. It is both safer and more performant.
+ */
+// TODO: parameter to handle coincidental emission from both old and new
+@ExperimentalFrpApi
+fun <A> TState<TFlow<A>>.switchPromptly(): TFlow<A> {
+    val switchNode =
+        switchPromptImpl(
+            getStorage = {
+                mapOf(Unit to init.connect(this).getCurrentWithEpoch(this).first.init.connect(this))
+            },
+            getPatches = {
+                val patches = init.connect(this).changes
+                mapImpl({ patches }) { newFlow -> mapOf(Unit to just(newFlow.init.connect(this))) }
+            },
+        )
+    return TFlowInit(constInit(name = null, mapImpl({ switchNode }) { it.getValue(Unit) }))
+}
+
+/**
+ * A mutable [TFlow] that provides the ability to [emit] values to the flow, handling backpressure
+ * by coalescing all emissions into batches.
+ *
+ * @see FrpNetwork.coalescingMutableTFlow
+ */
+@ExperimentalFrpApi
+class CoalescingMutableTFlow<In, Out>
+internal constructor(
+    internal val coalesce: (old: Out, new: In) -> Out,
+    internal val network: Network,
+    private val getInitialValue: () -> Out,
+    internal val impl: InputNode<Out> = InputNode(),
+) : TFlow<Out>() {
+    internal val name: String? = null
+    internal val storage = AtomicReference(false to getInitialValue())
+
+    override fun toString(): String = "${this::class.simpleName}@$hashString"
+
+    /**
+     * Inserts [value] into the current batch, enqueueing it for emission from this [TFlow] if not
+     * already pending.
+     *
+     * Backpressure occurs when [emit] is called while the FRP network is currently in a
+     * transaction; if called multiple times, then emissions will be coalesced into a single batch
+     * that is then processed when the network is ready.
+     */
+    @ExperimentalFrpApi
+    fun emit(value: In) {
+        val (scheduled, _) = storage.getAndUpdate { (_, old) -> true to coalesce(old, value) }
+        if (!scheduled) {
+            @Suppress("DeferredResultUnused")
+            network.transaction {
+                impl.visit(this, storage.getAndSet(false to getInitialValue()).second)
+            }
+        }
+    }
+}
+
+/**
+ * A mutable [TFlow] that provides the ability to [emit] values to the flow, handling backpressure
+ * by suspending the emitter.
+ *
+ * @see FrpNetwork.coalescingMutableTFlow
+ */
+@ExperimentalFrpApi
+class MutableTFlow<T>
+internal constructor(internal val network: Network, internal val impl: InputNode<T> = InputNode()) :
+    TFlow<T>() {
+    internal val name: String? = null
+
+    private val storage = AtomicReference<Job?>(null)
+
+    override fun toString(): String = "${this::class.simpleName}@$hashString"
+
+    /**
+     * Emits a [value] to this [TFlow], suspending the caller until the FRP transaction containing
+     * the emission has completed.
+     */
+    @ExperimentalFrpApi
+    suspend fun emit(value: T) {
+        coroutineScope {
+            val newEmit =
+                async(start = CoroutineStart.LAZY) {
+                    network.transaction { impl.visit(this, value) }.await()
+                }
+            val jobOrNull = storage.getAndSet(newEmit)
+            if (jobOrNull?.isActive != true) {
+                newEmit.await()
+            } else {
+                jobOrNull.join()
+            }
+        }
+    }
+
+    //    internal suspend fun emitInCurrentTransaction(value: T, evalScope: EvalScope) {
+    //        if (storage.getAndSet(just(value)) is None) {
+    //            impl.visit(evalScope)
+    //        }
+    //    }
+}
+
+private data object EmptyFlow : TFlow<Nothing>()
+
+internal class TFlowInit<out A>(val init: Init<TFlowImpl<A>>) : TFlow<A>() {
+    override fun toString(): String = "${this::class.simpleName}@$hashString"
+}
+
+internal val <A> TFlow<A>.init: Init<TFlowImpl<A>>
+    get() =
+        when (this) {
+            is EmptyFlow -> constInit("EmptyFlow", neverImpl)
+            is TFlowInit -> init
+            is TFlowLoop -> init
+            is CoalescingMutableTFlow<*, A> -> constInit(name, impl.activated())
+            is MutableTFlow -> constInit(name, impl.activated())
+        }
+
+private inline fun <A> deferInline(crossinline block: suspend InitScope.() -> TFlow<A>): TFlow<A> =
+    TFlowInit(init(name = null) { block().init.connect(evalScope = this) })
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TState.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TState.kt
new file mode 100644
index 0000000..a4c6956
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TState.kt
@@ -0,0 +1,492 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos
+
+import com.android.systemui.kairos.internal.DerivedMapCheap
+import com.android.systemui.kairos.internal.Init
+import com.android.systemui.kairos.internal.InitScope
+import com.android.systemui.kairos.internal.Network
+import com.android.systemui.kairos.internal.NoScope
+import com.android.systemui.kairos.internal.Schedulable
+import com.android.systemui.kairos.internal.TFlowImpl
+import com.android.systemui.kairos.internal.TStateImpl
+import com.android.systemui.kairos.internal.TStateSource
+import com.android.systemui.kairos.internal.activated
+import com.android.systemui.kairos.internal.cached
+import com.android.systemui.kairos.internal.constInit
+import com.android.systemui.kairos.internal.constS
+import com.android.systemui.kairos.internal.filterNode
+import com.android.systemui.kairos.internal.flatMap
+import com.android.systemui.kairos.internal.init
+import com.android.systemui.kairos.internal.map
+import com.android.systemui.kairos.internal.mapCheap
+import com.android.systemui.kairos.internal.mapImpl
+import com.android.systemui.kairos.internal.util.hashString
+import com.android.systemui.kairos.internal.zipStates
+import kotlin.reflect.KProperty
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.async
+import kotlinx.coroutines.coroutineScope
+
+/**
+ * A time-varying value with discrete changes. Essentially, a combination of a [Transactional] that
+ * holds a value, and a [TFlow] that emits when the value changes.
+ */
+@ExperimentalFrpApi sealed class TState<out A>
+
+/** A [TState] that never changes. */
+@ExperimentalFrpApi
+fun <A> tStateOf(value: A): TState<A> {
+    val operatorName = "tStateOf"
+    val name = "$operatorName($value)"
+    return TStateInit(constInit(name, constS(name, operatorName, value)))
+}
+
+/** TODO */
+@ExperimentalFrpApi fun <A> Lazy<TState<A>>.defer(): TState<A> = deferInline { value }
+
+/** TODO */
+@ExperimentalFrpApi
+fun <A> FrpDeferredValue<TState<A>>.defer(): TState<A> = deferInline { unwrapped.await() }
+
+/** TODO */
+@ExperimentalFrpApi
+fun <A> deferTState(block: suspend FrpScope.() -> TState<A>): TState<A> = deferInline {
+    NoScope.runInFrpScope(block)
+}
+
+/**
+ * Returns a [TState] containing the results of applying [transform] to the value held by the
+ * original [TState].
+ */
+@ExperimentalFrpApi
+fun <A, B> TState<A>.map(transform: suspend FrpScope.(A) -> B): TState<B> {
+    val operatorName = "map"
+    val name = operatorName
+    return TStateInit(
+        init(name) {
+            init.connect(evalScope = this).map(name, operatorName) {
+                NoScope.runInFrpScope { transform(it) }
+            }
+        }
+    )
+}
+
+/**
+ * Returns a [TState] that transforms the value held inside this [TState] by applying it to the
+ * [transform].
+ *
+ * Note that unlike [map], the result is not cached. This means that not only should [transform] be
+ * fast and pure, it should be *monomorphic* (1-to-1). Failure to do this means that [stateChanges]
+ * for the returned [TState] will operate unexpectedly, emitting at rates that do not reflect an
+ * observable change to the returned [TState].
+ */
+@ExperimentalFrpApi
+fun <A, B> TState<A>.mapCheapUnsafe(transform: suspend FrpScope.(A) -> B): TState<B> {
+    val operatorName = "map"
+    val name = operatorName
+    return TStateInit(
+        init(name) {
+            init.connect(evalScope = this).mapCheap(name, operatorName) {
+                NoScope.runInFrpScope { transform(it) }
+            }
+        }
+    )
+}
+
+/**
+ * Returns a [TState] by combining the values held inside the given [TState]s by applying them to
+ * the given function [transform].
+ */
+@ExperimentalFrpApi
+fun <A, B, C> TState<A>.combineWith(
+    other: TState<B>,
+    transform: suspend FrpScope.(A, B) -> C,
+): TState<C> = combine(this, other, transform)
+
+/**
+ * Splits a [TState] of pairs into a pair of [TFlows][TState], where each returned [TState] holds
+ * hald of the original.
+ *
+ * Shorthand for:
+ * ```kotlin
+ * val lefts = map { it.first }
+ * val rights = map { it.second }
+ * return Pair(lefts, rights)
+ * ```
+ */
+@ExperimentalFrpApi
+fun <A, B> TState<Pair<A, B>>.unzip(): Pair<TState<A>, TState<B>> {
+    val left = map { it.first }
+    val right = map { it.second }
+    return left to right
+}
+
+/**
+ * Returns a [TState] by combining the values held inside the given [TStates][TState] into a [List].
+ *
+ * @see TState.combineWith
+ */
+@ExperimentalFrpApi
+fun <A> Iterable<TState<A>>.combine(): TState<List<A>> {
+    val operatorName = "combine"
+    val name = operatorName
+    return TStateInit(
+        init(name) {
+            zipStates(name, operatorName, states = map { it.init.connect(evalScope = this) })
+        }
+    )
+}
+
+/**
+ * Returns a [TState] by combining the values held inside the given [TStates][TState] into a [Map].
+ *
+ * @see TState.combineWith
+ */
+@ExperimentalFrpApi
+fun <K : Any, A> Map<K, TState<A>>.combine(): TState<Map<K, A>> {
+    val operatorName = "combine"
+    val name = operatorName
+    return TStateInit(
+        init(name) {
+            zipStates(
+                name,
+                operatorName,
+                states = mapValues { it.value.init.connect(evalScope = this) },
+            )
+        }
+    )
+}
+
+/**
+ * Returns a [TState] whose value is generated with [transform] by combining the current values of
+ * each given [TState].
+ *
+ * @see TState.combineWith
+ */
+@ExperimentalFrpApi
+fun <A, B> Iterable<TState<A>>.combine(transform: suspend FrpScope.(List<A>) -> B): TState<B> =
+    combine().map(transform)
+
+/**
+ * Returns a [TState] by combining the values held inside the given [TState]s into a [List].
+ *
+ * @see TState.combineWith
+ */
+@ExperimentalFrpApi
+fun <A> combine(vararg states: TState<A>): TState<List<A>> = states.asIterable().combine()
+
+/**
+ * Returns a [TState] whose value is generated with [transform] by combining the current values of
+ * each given [TState].
+ *
+ * @see TState.combineWith
+ */
+@ExperimentalFrpApi
+fun <A, B> combine(
+    vararg states: TState<A>,
+    transform: suspend FrpScope.(List<A>) -> B,
+): TState<B> = states.asIterable().combine(transform)
+
+/**
+ * Returns a [TState] whose value is generated with [transform] by combining the current values of
+ * each given [TState].
+ *
+ * @see TState.combineWith
+ */
+@ExperimentalFrpApi
+fun <A, B, Z> combine(
+    stateA: TState<A>,
+    stateB: TState<B>,
+    transform: suspend FrpScope.(A, B) -> Z,
+): TState<Z> {
+    val operatorName = "combine"
+    val name = operatorName
+    return TStateInit(
+        init(name) {
+            coroutineScope {
+                val dl1: Deferred<TStateImpl<A>> = async {
+                    stateA.init.connect(evalScope = this@init)
+                }
+                val dl2: Deferred<TStateImpl<B>> = async {
+                    stateB.init.connect(evalScope = this@init)
+                }
+                zipStates(name, operatorName, dl1.await(), dl2.await()) { a, b ->
+                    NoScope.runInFrpScope { transform(a, b) }
+                }
+            }
+        }
+    )
+}
+
+/**
+ * Returns a [TState] whose value is generated with [transform] by combining the current values of
+ * each given [TState].
+ *
+ * @see TState.combineWith
+ */
+@ExperimentalFrpApi
+fun <A, B, C, Z> combine(
+    stateA: TState<A>,
+    stateB: TState<B>,
+    stateC: TState<C>,
+    transform: suspend FrpScope.(A, B, C) -> Z,
+): TState<Z> {
+    val operatorName = "combine"
+    val name = operatorName
+    return TStateInit(
+        init(name) {
+            coroutineScope {
+                val dl1: Deferred<TStateImpl<A>> = async {
+                    stateA.init.connect(evalScope = this@init)
+                }
+                val dl2: Deferred<TStateImpl<B>> = async {
+                    stateB.init.connect(evalScope = this@init)
+                }
+                val dl3: Deferred<TStateImpl<C>> = async {
+                    stateC.init.connect(evalScope = this@init)
+                }
+                zipStates(name, operatorName, dl1.await(), dl2.await(), dl3.await()) { a, b, c ->
+                    NoScope.runInFrpScope { transform(a, b, c) }
+                }
+            }
+        }
+    )
+}
+
+/**
+ * Returns a [TState] whose value is generated with [transform] by combining the current values of
+ * each given [TState].
+ *
+ * @see TState.combineWith
+ */
+@ExperimentalFrpApi
+fun <A, B, C, D, Z> combine(
+    stateA: TState<A>,
+    stateB: TState<B>,
+    stateC: TState<C>,
+    stateD: TState<D>,
+    transform: suspend FrpScope.(A, B, C, D) -> Z,
+): TState<Z> {
+    val operatorName = "combine"
+    val name = operatorName
+    return TStateInit(
+        init(name) {
+            coroutineScope {
+                val dl1: Deferred<TStateImpl<A>> = async {
+                    stateA.init.connect(evalScope = this@init)
+                }
+                val dl2: Deferred<TStateImpl<B>> = async {
+                    stateB.init.connect(evalScope = this@init)
+                }
+                val dl3: Deferred<TStateImpl<C>> = async {
+                    stateC.init.connect(evalScope = this@init)
+                }
+                val dl4: Deferred<TStateImpl<D>> = async {
+                    stateD.init.connect(evalScope = this@init)
+                }
+                zipStates(name, operatorName, dl1.await(), dl2.await(), dl3.await(), dl4.await()) {
+                    a,
+                    b,
+                    c,
+                    d ->
+                    NoScope.runInFrpScope { transform(a, b, c, d) }
+                }
+            }
+        }
+    )
+}
+
+/** Returns a [TState] by applying [transform] to the value held by the original [TState]. */
+@ExperimentalFrpApi
+fun <A, B> TState<A>.flatMap(transform: suspend FrpScope.(A) -> TState<B>): TState<B> {
+    val operatorName = "flatMap"
+    val name = operatorName
+    return TStateInit(
+        init(name) {
+            init.connect(this).flatMap(name, operatorName) { a ->
+                NoScope.runInFrpScope { transform(a) }.init.connect(this)
+            }
+        }
+    )
+}
+
+/** Shorthand for `flatMap { it }` */
+@ExperimentalFrpApi fun <A> TState<TState<A>>.flatten() = flatMap { it }
+
+/**
+ * Returns a [TStateSelector] that can be used to efficiently check if the input [TState] is
+ * currently holding a specific value.
+ *
+ * An example:
+ * ```
+ *   val lInt: TState<Int> = ...
+ *   val intSelector: TStateSelector<Int> = lInt.selector()
+ *   // Tracks if lInt is holding 1
+ *   val isOne: TState<Boolean> = intSelector.whenSelected(1)
+ * ```
+ *
+ * This is semantically equivalent to `val isOne = lInt.map { i -> i == 1 }`, but is significantly
+ * more efficient; specifically, using [TState.map] in this way incurs a `O(n)` performance hit,
+ * where `n` is the number of different [TState.map] operations used to track a specific value.
+ * [selector] internally uses a [HashMap] to lookup the appropriate downstream [TState] to update,
+ * and so operates in `O(1)`.
+ *
+ * Note that the result [TStateSelector] should be cached and re-used to gain the performance
+ * benefit.
+ *
+ * @see groupByKey
+ */
+@ExperimentalFrpApi
+fun <A> TState<A>.selector(numDistinctValues: Int? = null): TStateSelector<A> =
+    TStateSelector(
+        this,
+        stateChanges
+            .map { new -> mapOf(new to true, sampleDeferred().get() to false) }
+            .groupByKey(numDistinctValues),
+    )
+
+/**
+ * Tracks the currently selected value of type [A] from an upstream [TState].
+ *
+ * @see selector
+ */
+@ExperimentalFrpApi
+class TStateSelector<A>
+internal constructor(
+    private val upstream: TState<A>,
+    private val groupedChanges: GroupedTFlow<A, Boolean>,
+) {
+    /**
+     * Returns a [TState] that tracks whether the upstream [TState] is currently holding the given
+     * [value].
+     *
+     * @see selector
+     */
+    @ExperimentalFrpApi
+    fun whenSelected(value: A): TState<Boolean> {
+        val operatorName = "TStateSelector#whenSelected"
+        val name = "$operatorName[$value]"
+        return TStateInit(
+            init(name) {
+                DerivedMapCheap(
+                    name,
+                    operatorName,
+                    upstream = upstream.init.connect(evalScope = this),
+                    changes = groupedChanges.impl.eventsForKey(value),
+                ) {
+                    it == value
+                }
+            }
+        )
+    }
+
+    @ExperimentalFrpApi operator fun get(value: A): TState<Boolean> = whenSelected(value)
+}
+
+/** TODO */
+@ExperimentalFrpApi
+class MutableTState<T>
+internal constructor(internal val network: Network, initialValue: Deferred<T>) : TState<T>() {
+
+    private val input: CoalescingMutableTFlow<Deferred<T>, Deferred<T>?> =
+        CoalescingMutableTFlow(
+            coalesce = { _, new -> new },
+            network = network,
+            getInitialValue = { null },
+        )
+
+    internal val tState = run {
+        val changes = input.impl
+        val name = null
+        val operatorName = "MutableTState"
+        lateinit var state: TStateSource<T>
+        val calm: TFlowImpl<T> =
+            filterNode({ mapImpl(upstream = { changes.activated() }) { it!!.await() } }) { new ->
+                    new != state.getCurrentWithEpoch(evalScope = this).first
+                }
+                .cached()
+        state = TStateSource(name, operatorName, initialValue, calm)
+        @Suppress("DeferredResultUnused")
+        network.transaction {
+            calm.activate(evalScope = this, downstream = Schedulable.S(state))?.let {
+                (connection, needsEval) ->
+                state.upstreamConnection = connection
+                if (needsEval) {
+                    schedule(state)
+                }
+            }
+        }
+        TStateInit(constInit(name, state))
+    }
+
+    /** TODO */
+    @ExperimentalFrpApi fun setValue(value: T) = input.emit(CompletableDeferred(value))
+
+    @ExperimentalFrpApi
+    fun setValueDeferred(value: FrpDeferredValue<T>) = input.emit(value.unwrapped)
+}
+
+/** A forward-reference to a [TState], allowing for recursive definitions. */
+@ExperimentalFrpApi
+class TStateLoop<A> : TState<A>() {
+
+    private val name: String? = null
+
+    private val deferred = CompletableDeferred<TState<A>>()
+
+    internal val init: Init<TStateImpl<A>> =
+        init(name) { deferred.await().init.connect(evalScope = this) }
+
+    /** The [TState] this [TStateLoop] will forward to. */
+    @ExperimentalFrpApi
+    var loopback: TState<A>? = null
+        set(value) {
+            value?.let {
+                check(deferred.complete(value)) { "TStateLoop.loopback has already been set." }
+                field = value
+            }
+        }
+
+    @ExperimentalFrpApi
+    operator fun getValue(thisRef: Any?, property: KProperty<*>): TState<A> = this
+
+    @ExperimentalFrpApi
+    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: TState<A>) {
+        loopback = value
+    }
+
+    override fun toString(): String = "${this::class.simpleName}@$hashString"
+}
+
+internal class TStateInit<A> internal constructor(internal val init: Init<TStateImpl<A>>) :
+    TState<A>() {
+    override fun toString(): String = "${this::class.simpleName}@$hashString"
+}
+
+internal val <A> TState<A>.init: Init<TStateImpl<A>>
+    get() =
+        when (this) {
+            is TStateInit -> init
+            is TStateLoop -> init
+            is MutableTState -> tState.init
+        }
+
+private inline fun <A> deferInline(
+    crossinline block: suspend InitScope.() -> TState<A>
+): TState<A> = TStateInit(init(name = null) { block().init.connect(evalScope = this) })
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Transactional.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Transactional.kt
new file mode 100644
index 0000000..6b1c8c8
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Transactional.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos
+
+import com.android.systemui.kairos.internal.InitScope
+import com.android.systemui.kairos.internal.NoScope
+import com.android.systemui.kairos.internal.TransactionalImpl
+import com.android.systemui.kairos.internal.init
+import com.android.systemui.kairos.internal.transactionalImpl
+import com.android.systemui.kairos.internal.util.hashString
+import kotlinx.coroutines.CompletableDeferred
+
+/**
+ * A time-varying value. A [Transactional] encapsulates the idea of some continuous state; each time
+ * it is "sampled", a new result may be produced.
+ *
+ * Because FRP operates over an "idealized" model of Time that can be passed around as a data type,
+ * [Transactional]s are guaranteed to produce the same result if queried multiple times at the same
+ * (conceptual) time, in order to preserve _referential transparency_.
+ */
+@ExperimentalFrpApi
+class Transactional<out A> internal constructor(internal val impl: TState<TransactionalImpl<A>>) {
+    override fun toString(): String = "${this::class.simpleName}@$hashString"
+}
+
+/** A constant [Transactional] that produces [value] whenever it is sampled. */
+@ExperimentalFrpApi
+fun <A> transactionalOf(value: A): Transactional<A> =
+    Transactional(tStateOf(TransactionalImpl.Const(CompletableDeferred(value))))
+
+/** TODO */
+@ExperimentalFrpApi
+fun <A> FrpDeferredValue<Transactional<A>>.defer(): Transactional<A> = deferInline {
+    unwrapped.await()
+}
+
+/** TODO */
+@ExperimentalFrpApi fun <A> Lazy<Transactional<A>>.defer(): Transactional<A> = deferInline { value }
+
+/** TODO */
+@ExperimentalFrpApi
+fun <A> deferTransactional(block: suspend FrpScope.() -> Transactional<A>): Transactional<A> =
+    deferInline {
+        NoScope.runInFrpScope(block)
+    }
+
+private inline fun <A> deferInline(
+    crossinline block: suspend InitScope.() -> Transactional<A>
+): Transactional<A> =
+    Transactional(TStateInit(init(name = null) { block().impl.init.connect(evalScope = this) }))
+
+/**
+ * Returns a [Transactional]. The passed [block] will be evaluated on demand at most once per
+ * transaction; any subsequent sampling within the same transaction will receive a cached value.
+ */
+@ExperimentalFrpApi
+fun <A> transactionally(block: suspend FrpTransactionScope.() -> A): Transactional<A> =
+    Transactional(tStateOf(transactionalImpl { runInTransactionScope(block) }))
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/debug/Debug.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/debug/Debug.kt
new file mode 100644
index 0000000..4f302a1
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/debug/Debug.kt
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.debug
+
+import com.android.systemui.kairos.MutableTState
+import com.android.systemui.kairos.TState
+import com.android.systemui.kairos.TStateInit
+import com.android.systemui.kairos.TStateLoop
+import com.android.systemui.kairos.internal.DerivedFlatten
+import com.android.systemui.kairos.internal.DerivedMap
+import com.android.systemui.kairos.internal.DerivedMapCheap
+import com.android.systemui.kairos.internal.DerivedZipped
+import com.android.systemui.kairos.internal.Init
+import com.android.systemui.kairos.internal.TStateDerived
+import com.android.systemui.kairos.internal.TStateImpl
+import com.android.systemui.kairos.internal.TStateSource
+import com.android.systemui.kairos.util.Just
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.None
+import com.android.systemui.kairos.util.none
+import com.android.systemui.kairos.util.orElseGet
+
+// object IdGen {
+//    private val counter = AtomicLong()
+//    fun getId() = counter.getAndIncrement()
+// }
+
+typealias StateGraph = Graph<ActivationInfo>
+
+sealed class StateInfo(
+    val name: String,
+    val value: Maybe<Any?>,
+    val operator: String,
+    val epoch: Long?,
+)
+
+class Source(name: String, value: Maybe<Any?>, operator: String, epoch: Long) :
+    StateInfo(name, value, operator, epoch)
+
+class Derived(
+    name: String,
+    val type: DerivedStateType,
+    value: Maybe<Any?>,
+    operator: String,
+    epoch: Long?,
+) : StateInfo(name, value, operator, epoch)
+
+sealed interface DerivedStateType
+
+data object Flatten : DerivedStateType
+
+data class Mapped(val cheap: Boolean) : DerivedStateType
+
+data object Combine : DerivedStateType
+
+sealed class InitInfo(val name: String)
+
+class Uninitialized(name: String) : InitInfo(name)
+
+class Initialized(val state: StateInfo) : InitInfo(state.name)
+
+sealed interface ActivationInfo
+
+class Inactive(val name: String) : ActivationInfo
+
+class Active(val nodeInfo: StateInfo) : ActivationInfo
+
+class Dead(val name: String) : ActivationInfo
+
+data class Edge(val upstream: Any, val downstream: Any, val tag: Any? = null)
+
+data class Graph<T>(val nodes: Map<Any, T>, val edges: List<Edge>)
+
+internal fun TState<*>.dump(infoMap: MutableMap<Any, InitInfo>, edges: MutableList<Edge>) {
+    val init: Init<TStateImpl<Any?>> =
+        when (this) {
+            is TStateInit -> init
+            is TStateLoop -> init
+            is MutableTState -> tState.init
+        }
+    when (val stateMaybe = init.getUnsafe()) {
+        None -> {
+            infoMap[this] = Uninitialized(init.name ?: init.toString())
+        }
+        is Just -> {
+            stateMaybe.value.dump(infoMap, edges)
+        }
+    }
+}
+
+internal fun TStateImpl<*>.dump(infoById: MutableMap<Any, InitInfo>, edges: MutableList<Edge>) {
+    val state = this
+    if (state in infoById) return
+    val stateInfo =
+        when (state) {
+            is TStateDerived -> {
+                val type =
+                    when (state) {
+                        is DerivedFlatten -> {
+                            state.upstream.dump(infoById, edges)
+                            edges.add(
+                                Edge(upstream = state.upstream, downstream = state, tag = "outer")
+                            )
+                            state.upstream
+                                .getUnsafe()
+                                .orElseGet { null }
+                                ?.let {
+                                    edges.add(
+                                        Edge(upstream = it, downstream = state, tag = "inner")
+                                    )
+                                    it.dump(infoById, edges)
+                                }
+                            Flatten
+                        }
+                        is DerivedMap<*, *> -> {
+                            state.upstream.dump(infoById, edges)
+                            edges.add(Edge(upstream = state.upstream, downstream = state))
+                            Mapped(cheap = false)
+                        }
+                        is DerivedZipped<*, *> -> {
+                            state.upstream.forEach { (key, upstream) ->
+                                edges.add(
+                                    Edge(upstream = upstream, downstream = state, tag = "key=$key")
+                                )
+                                upstream.dump(infoById, edges)
+                            }
+                            Combine
+                        }
+                    }
+                Derived(
+                    state.name ?: state.operatorName,
+                    type,
+                    state.getCachedUnsafe(),
+                    state.operatorName,
+                    state.invalidatedEpoch,
+                )
+            }
+            is TStateSource ->
+                Source(
+                    state.name ?: state.operatorName,
+                    state.getStorageUnsafe(),
+                    state.operatorName,
+                    state.writeEpoch,
+                )
+            is DerivedMapCheap<*, *> -> {
+                state.upstream.dump(infoById, edges)
+                edges.add(Edge(upstream = state.upstream, downstream = state))
+                val type = Mapped(cheap = true)
+                Derived(
+                    state.name ?: state.operatorName,
+                    type,
+                    state.getUnsafe(),
+                    state.operatorName,
+                    null,
+                )
+            }
+        }
+    infoById[state] = Initialized(stateInfo)
+}
+
+private fun <A> TStateImpl<A>.getUnsafe(): Maybe<A> =
+    when (this) {
+        is TStateDerived -> getCachedUnsafe()
+        is TStateSource -> getStorageUnsafe()
+        is DerivedMapCheap<*, *> -> none
+    }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt
new file mode 100644
index 0000000..90f1aea
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt
@@ -0,0 +1,363 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.CoalescingMutableTFlow
+import com.android.systemui.kairos.FrpBuildScope
+import com.android.systemui.kairos.FrpCoalescingProducerScope
+import com.android.systemui.kairos.FrpDeferredValue
+import com.android.systemui.kairos.FrpEffectScope
+import com.android.systemui.kairos.FrpNetwork
+import com.android.systemui.kairos.FrpProducerScope
+import com.android.systemui.kairos.FrpSpec
+import com.android.systemui.kairos.FrpStateScope
+import com.android.systemui.kairos.FrpTransactionScope
+import com.android.systemui.kairos.GroupedTFlow
+import com.android.systemui.kairos.LocalFrpNetwork
+import com.android.systemui.kairos.MutableTFlow
+import com.android.systemui.kairos.TFlow
+import com.android.systemui.kairos.TFlowInit
+import com.android.systemui.kairos.groupByKey
+import com.android.systemui.kairos.init
+import com.android.systemui.kairos.internal.util.childScope
+import com.android.systemui.kairos.internal.util.launchOnCancel
+import com.android.systemui.kairos.internal.util.mapValuesParallel
+import com.android.systemui.kairos.launchEffect
+import com.android.systemui.kairos.util.Just
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.None
+import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.map
+import java.util.concurrent.atomic.AtomicReference
+import kotlin.coroutines.Continuation
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
+import kotlin.coroutines.startCoroutine
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CompletableJob
+import kotlinx.coroutines.CoroutineName
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.completeWith
+import kotlinx.coroutines.job
+
+internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope: CoroutineScope) :
+    BuildScope, StateScope by stateScope {
+
+    private val job: Job
+        get() = coroutineScope.coroutineContext.job
+
+    override val frpScope: FrpBuildScope = FrpBuildScopeImpl()
+
+    override suspend fun <R> runInBuildScope(block: suspend FrpBuildScope.() -> R): R {
+        val complete = CompletableDeferred<R>(parent = coroutineContext.job)
+        block.startCoroutine(
+            frpScope,
+            object : Continuation<R> {
+                override val context: CoroutineContext
+                    get() = EmptyCoroutineContext
+
+                override fun resumeWith(result: Result<R>) {
+                    complete.completeWith(result)
+                }
+            },
+        )
+        return complete.await()
+    }
+
+    private fun <A, T : TFlow<A>, S> buildTFlow(
+        constructFlow: (InputNode<A>) -> Pair<T, S>,
+        builder: suspend S.() -> Unit,
+    ): TFlow<A> {
+        var job: Job? = null
+        val stopEmitter = newStopEmitter()
+        val handle = this.job.invokeOnCompletion { stopEmitter.emit(Unit) }
+        // Create a child scope that will be kept alive beyond the end of this transaction.
+        val childScope = coroutineScope.childScope()
+        lateinit var emitter: Pair<T, S>
+        val inputNode =
+            InputNode<A>(
+                activate = {
+                    check(job == null) { "already activated" }
+                    job =
+                        reenterBuildScope(this@BuildScopeImpl, childScope).runInBuildScope {
+                            launchEffect {
+                                builder(emitter.second)
+                                handle.dispose()
+                                stopEmitter.emit(Unit)
+                            }
+                        }
+                },
+                deactivate = {
+                    checkNotNull(job) { "already deactivated" }.cancel()
+                    job = null
+                },
+            )
+        emitter = constructFlow(inputNode)
+        return with(frpScope) { emitter.first.takeUntil(stopEmitter) }
+    }
+
+    private fun <T> tFlowInternal(builder: suspend FrpProducerScope<T>.() -> Unit): TFlow<T> =
+        buildTFlow(
+            constructFlow = { inputNode ->
+                val flow = MutableTFlow(network, inputNode)
+                flow to
+                    object : FrpProducerScope<T> {
+                        override suspend fun emit(value: T) {
+                            flow.emit(value)
+                        }
+                    }
+            },
+            builder = builder,
+        )
+
+    private fun <In, Out> coalescingTFlowInternal(
+        getInitialValue: () -> Out,
+        coalesce: (old: Out, new: In) -> Out,
+        builder: suspend FrpCoalescingProducerScope<In>.() -> Unit,
+    ): TFlow<Out> =
+        buildTFlow(
+            constructFlow = { inputNode ->
+                val flow = CoalescingMutableTFlow(coalesce, network, getInitialValue, inputNode)
+                flow to
+                    object : FrpCoalescingProducerScope<In> {
+                        override fun emit(value: In) {
+                            flow.emit(value)
+                        }
+                    }
+            },
+            builder = builder,
+        )
+
+    private fun <A> asyncScopeInternal(block: FrpSpec<A>): Pair<FrpDeferredValue<A>, Job> {
+        val childScope = mutableChildBuildScope()
+        return FrpDeferredValue(deferAsync { childScope.runInBuildScope(block) }) to childScope.job
+    }
+
+    private fun <R> deferredInternal(block: suspend FrpBuildScope.() -> R): FrpDeferredValue<R> =
+        FrpDeferredValue(deferAsync { runInBuildScope(block) })
+
+    private fun deferredActionInternal(block: suspend FrpBuildScope.() -> Unit) {
+        deferAction { runInBuildScope(block) }
+    }
+
+    private fun <A> TFlow<A>.observeEffectInternal(
+        context: CoroutineContext,
+        block: suspend FrpEffectScope.(A) -> Unit,
+    ): Job {
+        val subRef = AtomicReference<Maybe<Output<A>>>(null)
+        val childScope = coroutineScope.childScope()
+        // When our scope is cancelled, deactivate this observer.
+        childScope.launchOnCancel(CoroutineName("TFlow.observeEffect")) {
+            subRef.getAndSet(None)?.let { output ->
+                if (output is Just) {
+                    @Suppress("DeferredResultUnused")
+                    network.transaction { scheduleDeactivation(output.value) }
+                }
+            }
+        }
+        // Defer so that we don't suspend the caller
+        deferAction {
+            val outputNode =
+                Output<A>(
+                    context = context,
+                    onDeath = { subRef.getAndSet(None)?.let { childScope.cancel() } },
+                    onEmit = { output ->
+                        if (subRef.get() is Just) {
+                            // Not cancelled, safe to emit
+                            val coroutine: suspend FrpEffectScope.() -> Unit = { block(output) }
+                            val complete = CompletableDeferred<Unit>(parent = coroutineContext.job)
+                            coroutine.startCoroutine(
+                                object : FrpEffectScope, FrpTransactionScope by frpScope {
+                                    override val frpCoroutineScope: CoroutineScope = childScope
+                                    override val frpNetwork: FrpNetwork =
+                                        LocalFrpNetwork(network, childScope, endSignal)
+                                },
+                                completion =
+                                    object : Continuation<Unit> {
+                                        override val context: CoroutineContext
+                                            get() = EmptyCoroutineContext
+
+                                        override fun resumeWith(result: Result<Unit>) {
+                                            complete.completeWith(result)
+                                        }
+                                    },
+                            )
+                            complete.await()
+                        }
+                    },
+                )
+            with(frpScope) { this@observeEffectInternal.takeUntil(endSignal) }
+                .init
+                .connect(evalScope = stateScope.evalScope)
+                .activate(evalScope = stateScope.evalScope, outputNode.schedulable)
+                ?.let { (conn, needsEval) ->
+                    outputNode.upstream = conn
+                    if (!subRef.compareAndSet(null, just(outputNode))) {
+                        // Job's already been cancelled, schedule deactivation
+                        scheduleDeactivation(outputNode)
+                    } else if (needsEval) {
+                        outputNode.schedule(evalScope = stateScope.evalScope)
+                    }
+                } ?: childScope.cancel()
+        }
+        return childScope.coroutineContext.job
+    }
+
+    private fun <A, B> TFlow<A>.mapBuildInternal(
+        transform: suspend FrpBuildScope.(A) -> B
+    ): TFlow<B> {
+        val childScope = coroutineScope.childScope()
+        return TFlowInit(
+            constInit(
+                "mapBuild",
+                mapImpl({ init.connect(evalScope = this) }) { spec ->
+                        reenterBuildScope(outerScope = this@BuildScopeImpl, childScope)
+                            .runInBuildScope {
+                                val (result, _) = asyncScope { transform(spec) }
+                                result.get()
+                            }
+                    }
+                    .cached(),
+            )
+        )
+    }
+
+    private fun <K, A, B> TFlow<Map<K, Maybe<FrpSpec<A>>>>.applyLatestForKeyInternal(
+        init: FrpDeferredValue<Map<K, FrpSpec<B>>>,
+        numKeys: Int?,
+    ): Pair<TFlow<Map<K, Maybe<A>>>, FrpDeferredValue<Map<K, B>>> {
+        val eventsByKey: GroupedTFlow<K, Maybe<FrpSpec<A>>> = groupByKey(numKeys)
+        val initOut: Deferred<Map<K, B>> = deferAsync {
+            init.unwrapped.await().mapValuesParallel { (k, spec) ->
+                val newEnd = with(frpScope) { eventsByKey[k].skipNext() }
+                val newScope = childBuildScope(newEnd)
+                newScope.runInBuildScope(spec)
+            }
+        }
+        val childScope = coroutineScope.childScope()
+        val changesNode: TFlowImpl<Map<K, Maybe<A>>> =
+            mapImpl(upstream = { this@applyLatestForKeyInternal.init.connect(evalScope = this) }) {
+                upstreamMap ->
+                reenterBuildScope(this@BuildScopeImpl, childScope).run {
+                    upstreamMap.mapValuesParallel { (k: K, ma: Maybe<FrpSpec<A>>) ->
+                        ma.map { spec ->
+                            val newEnd = with(frpScope) { eventsByKey[k].skipNext() }
+                            val newScope = childBuildScope(newEnd)
+                            newScope.runInBuildScope(spec)
+                        }
+                    }
+                }
+            }
+        val changes: TFlow<Map<K, Maybe<A>>> =
+            TFlowInit(constInit("applyLatestForKey", changesNode.cached()))
+        // Ensure effects are observed; otherwise init will stay alive longer than expected
+        changes.observeEffectInternal(EmptyCoroutineContext) {}
+        return changes to FrpDeferredValue(initOut)
+    }
+
+    private fun newStopEmitter(): CoalescingMutableTFlow<Unit, Unit> =
+        CoalescingMutableTFlow(
+            coalesce = { _, _: Unit -> },
+            network = network,
+            getInitialValue = {},
+        )
+
+    private suspend fun childBuildScope(newEnd: TFlow<Any>): BuildScopeImpl {
+        val newCoroutineScope: CoroutineScope = coroutineScope.childScope()
+        return BuildScopeImpl(
+                stateScope = stateScope.childStateScope(newEnd),
+                coroutineScope = newCoroutineScope,
+            )
+            .apply {
+                // Ensure that once this transaction is done, the new child scope enters the
+                // completing state (kept alive so long as there are child jobs).
+                scheduleOutput(
+                    OneShot {
+                        // TODO: don't like this cast
+                        (newCoroutineScope.coroutineContext.job as CompletableJob).complete()
+                    }
+                )
+                runInBuildScope { endSignal.nextOnly().observe { newCoroutineScope.cancel() } }
+            }
+    }
+
+    private fun mutableChildBuildScope(): BuildScopeImpl {
+        val stopEmitter = newStopEmitter()
+        val childScope = coroutineScope.childScope()
+        childScope.coroutineContext.job.invokeOnCompletion { stopEmitter.emit(Unit) }
+        // Ensure that once this transaction is done, the new child scope enters the completing
+        // state (kept alive so long as there are child jobs).
+        scheduleOutput(
+            OneShot {
+                // TODO: don't like this cast
+                (childScope.coroutineContext.job as CompletableJob).complete()
+            }
+        )
+        return BuildScopeImpl(
+            stateScope = StateScopeImpl(evalScope = stateScope.evalScope, endSignal = stopEmitter),
+            coroutineScope = childScope,
+        )
+    }
+
+    private inner class FrpBuildScopeImpl : FrpBuildScope, FrpStateScope by stateScope.frpScope {
+
+        override fun <T> tFlow(builder: suspend FrpProducerScope<T>.() -> Unit): TFlow<T> =
+            tFlowInternal(builder)
+
+        override fun <In, Out> coalescingTFlow(
+            getInitialValue: () -> Out,
+            coalesce: (old: Out, new: In) -> Out,
+            builder: suspend FrpCoalescingProducerScope<In>.() -> Unit,
+        ): TFlow<Out> = coalescingTFlowInternal(getInitialValue, coalesce, builder)
+
+        override fun <A> asyncScope(block: FrpSpec<A>): Pair<FrpDeferredValue<A>, Job> =
+            asyncScopeInternal(block)
+
+        override fun <R> deferredBuildScope(
+            block: suspend FrpBuildScope.() -> R
+        ): FrpDeferredValue<R> = deferredInternal(block)
+
+        override fun deferredBuildScopeAction(block: suspend FrpBuildScope.() -> Unit) =
+            deferredActionInternal(block)
+
+        override fun <A> TFlow<A>.observe(
+            coroutineContext: CoroutineContext,
+            block: suspend FrpEffectScope.(A) -> Unit,
+        ): Job = observeEffectInternal(coroutineContext, block)
+
+        override fun <A, B> TFlow<A>.mapBuild(transform: suspend FrpBuildScope.(A) -> B): TFlow<B> =
+            mapBuildInternal(transform)
+
+        override fun <K, A, B> TFlow<Map<K, Maybe<FrpSpec<A>>>>.applyLatestSpecForKey(
+            initialSpecs: FrpDeferredValue<Map<K, FrpSpec<B>>>,
+            numKeys: Int?,
+        ): Pair<TFlow<Map<K, Maybe<A>>>, FrpDeferredValue<Map<K, B>>> =
+            applyLatestForKeyInternal(initialSpecs, numKeys)
+    }
+}
+
+private fun EvalScope.reenterBuildScope(
+    outerScope: BuildScopeImpl,
+    coroutineScope: CoroutineScope,
+) =
+    BuildScopeImpl(
+        stateScope = StateScopeImpl(evalScope = this, endSignal = outerScope.endSignal),
+        coroutineScope,
+    )
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/DeferScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/DeferScope.kt
new file mode 100644
index 0000000..f65307c
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/DeferScope.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.internal.util.asyncImmediate
+import com.android.systemui.kairos.internal.util.launchImmediate
+import kotlinx.coroutines.CoroutineName
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.isActive
+
+internal typealias DeferScope = CoroutineScope
+
+internal inline fun DeferScope.deferAction(
+    start: CoroutineStart = CoroutineStart.UNDISPATCHED,
+    crossinline block: suspend () -> Unit,
+): Job {
+    check(isActive) { "Cannot perform deferral, scope already closed." }
+    return launchImmediate(start, CoroutineName("deferAction")) { block() }
+}
+
+internal inline fun <R> DeferScope.deferAsync(
+    start: CoroutineStart = CoroutineStart.UNDISPATCHED,
+    crossinline block: suspend () -> R,
+): Deferred<R> {
+    check(isActive) { "Cannot perform deferral, scope already closed." }
+    return asyncImmediate(start, CoroutineName("deferAsync")) { block() }
+}
+
+internal suspend inline fun <A> deferScope(noinline block: suspend DeferScope.() -> A): A =
+    coroutineScope(block)
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Demux.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Demux.kt
new file mode 100644
index 0000000..e7b9952
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Demux.kt
@@ -0,0 +1,349 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package com.android.systemui.kairos.internal
+
+import com.android.systemui.kairos.internal.util.hashString
+import com.android.systemui.kairos.util.Just
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.flatMap
+import com.android.systemui.kairos.util.getMaybe
+import java.util.concurrent.ConcurrentHashMap
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.async
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.sync.Mutex
+import kotlinx.coroutines.sync.withLock
+
+internal class DemuxNode<K, A>(
+    private val branchNodeByKey: ConcurrentHashMap<K, DemuxBranchNode<K, A>>,
+    val lifecycle: DemuxLifecycle<K, A>,
+    private val spec: DemuxActivator<K, A>,
+) : SchedulableNode {
+
+    val schedulable = Schedulable.N(this)
+
+    inline val mutex
+        get() = lifecycle.mutex
+
+    lateinit var upstreamConnection: NodeConnection<Map<K, A>>
+
+    fun getAndMaybeAddDownstream(key: K): DemuxBranchNode<K, A> =
+        branchNodeByKey.getOrPut(key) { DemuxBranchNode(key, this) }
+
+    override suspend fun schedule(evalScope: EvalScope) {
+        val upstreamResult = upstreamConnection.getPushEvent(evalScope)
+        if (upstreamResult is Just) {
+            coroutineScope {
+                val outerScope = this
+                mutex.withLock {
+                    coroutineScope {
+                        for ((key, _) in upstreamResult.value) {
+                            launch {
+                                branchNodeByKey[key]?.let { branch ->
+                                    outerScope.launch { branch.schedule(evalScope) }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    override suspend fun adjustDirectUpstream(scheduler: Scheduler, oldDepth: Int, newDepth: Int) {
+        coroutineScope {
+            mutex.withLock {
+                for ((_, branchNode) in branchNodeByKey) {
+                    branchNode.downstreamSet.adjustDirectUpstream(
+                        coroutineScope = this,
+                        scheduler,
+                        oldDepth,
+                        newDepth,
+                    )
+                }
+            }
+        }
+    }
+
+    override suspend fun moveIndirectUpstreamToDirect(
+        scheduler: Scheduler,
+        oldIndirectDepth: Int,
+        oldIndirectSet: Set<MuxDeferredNode<*, *>>,
+        newDirectDepth: Int,
+    ) {
+        coroutineScope {
+            mutex.withLock {
+                for ((_, branchNode) in branchNodeByKey) {
+                    branchNode.downstreamSet.moveIndirectUpstreamToDirect(
+                        coroutineScope = this,
+                        scheduler,
+                        oldIndirectDepth,
+                        oldIndirectSet,
+                        newDirectDepth,
+                    )
+                }
+            }
+        }
+    }
+
+    override suspend fun adjustIndirectUpstream(
+        scheduler: Scheduler,
+        oldDepth: Int,
+        newDepth: Int,
+        removals: Set<MuxDeferredNode<*, *>>,
+        additions: Set<MuxDeferredNode<*, *>>,
+    ) {
+        coroutineScope {
+            mutex.withLock {
+                for ((_, branchNode) in branchNodeByKey) {
+                    branchNode.downstreamSet.adjustIndirectUpstream(
+                        coroutineScope = this,
+                        scheduler,
+                        oldDepth,
+                        newDepth,
+                        removals,
+                        additions,
+                    )
+                }
+            }
+        }
+    }
+
+    override suspend fun moveDirectUpstreamToIndirect(
+        scheduler: Scheduler,
+        oldDirectDepth: Int,
+        newIndirectDepth: Int,
+        newIndirectSet: Set<MuxDeferredNode<*, *>>,
+    ) {
+        coroutineScope {
+            mutex.withLock {
+                for ((_, branchNode) in branchNodeByKey) {
+                    branchNode.downstreamSet.moveDirectUpstreamToIndirect(
+                        coroutineScope = this,
+                        scheduler,
+                        oldDirectDepth,
+                        newIndirectDepth,
+                        newIndirectSet,
+                    )
+                }
+            }
+        }
+    }
+
+    override suspend fun removeIndirectUpstream(
+        scheduler: Scheduler,
+        depth: Int,
+        indirectSet: Set<MuxDeferredNode<*, *>>,
+    ) {
+        coroutineScope {
+            mutex.withLock {
+                lifecycle.lifecycleState = DemuxLifecycleState.Dead
+                for ((_, branchNode) in branchNodeByKey) {
+                    branchNode.downstreamSet.removeIndirectUpstream(
+                        coroutineScope = this,
+                        scheduler,
+                        depth,
+                        indirectSet,
+                    )
+                }
+            }
+        }
+    }
+
+    override suspend fun removeDirectUpstream(scheduler: Scheduler, depth: Int) {
+        coroutineScope {
+            mutex.withLock {
+                lifecycle.lifecycleState = DemuxLifecycleState.Dead
+                for ((_, branchNode) in branchNodeByKey) {
+                    branchNode.downstreamSet.removeDirectUpstream(
+                        coroutineScope = this,
+                        scheduler,
+                        depth,
+                    )
+                }
+            }
+        }
+    }
+
+    suspend fun removeDownstreamAndDeactivateIfNeeded(key: K) {
+        val deactivate =
+            mutex.withLock {
+                branchNodeByKey.remove(key)
+                branchNodeByKey.isEmpty()
+            }
+        if (deactivate) {
+            // No need for mutex here; no more concurrent changes to can occur during this phase
+            lifecycle.lifecycleState = DemuxLifecycleState.Inactive(spec)
+            upstreamConnection.removeDownstreamAndDeactivateIfNeeded(downstream = schedulable)
+        }
+    }
+}
+
+internal class DemuxBranchNode<K, A>(val key: K, private val demuxNode: DemuxNode<K, A>) :
+    PushNode<A> {
+
+    private val mutex = Mutex()
+
+    val downstreamSet = DownstreamSet()
+
+    override val depthTracker: DepthTracker
+        get() = demuxNode.upstreamConnection.depthTracker
+
+    override suspend fun hasCurrentValue(transactionStore: TransactionStore): Boolean =
+        demuxNode.upstreamConnection.hasCurrentValue(transactionStore)
+
+    override suspend fun getPushEvent(evalScope: EvalScope): Maybe<A> =
+        demuxNode.upstreamConnection.getPushEvent(evalScope).flatMap { it.getMaybe(key) }
+
+    override suspend fun addDownstream(downstream: Schedulable) {
+        mutex.withLock { downstreamSet.add(downstream) }
+    }
+
+    override suspend fun removeDownstream(downstream: Schedulable) {
+        mutex.withLock { downstreamSet.remove(downstream) }
+    }
+
+    override suspend fun removeDownstreamAndDeactivateIfNeeded(downstream: Schedulable) {
+        val canDeactivate =
+            mutex.withLock {
+                downstreamSet.remove(downstream)
+                downstreamSet.isEmpty()
+            }
+        if (canDeactivate) {
+            demuxNode.removeDownstreamAndDeactivateIfNeeded(key)
+        }
+    }
+
+    override suspend fun deactivateIfNeeded() {
+        if (mutex.withLock { downstreamSet.isEmpty() }) {
+            demuxNode.removeDownstreamAndDeactivateIfNeeded(key)
+        }
+    }
+
+    override suspend fun scheduleDeactivationIfNeeded(evalScope: EvalScope) {
+        if (mutex.withLock { downstreamSet.isEmpty() }) {
+            evalScope.scheduleDeactivation(this)
+        }
+    }
+
+    suspend fun schedule(evalScope: EvalScope) {
+        if (!coroutineScope { mutex.withLock { scheduleAll(downstreamSet, evalScope) } }) {
+            evalScope.scheduleDeactivation(this)
+        }
+    }
+}
+
+internal fun <K, A> DemuxImpl(
+    upstream: suspend EvalScope.() -> TFlowImpl<Map<K, A>>,
+    numKeys: Int?,
+): DemuxImpl<K, A> =
+    DemuxImpl(
+        DemuxLifecycle(
+            object : DemuxActivator<K, A> {
+                override suspend fun activate(
+                    evalScope: EvalScope,
+                    lifecycle: DemuxLifecycle<K, A>,
+                ): Pair<DemuxNode<K, A>, Boolean>? {
+                    val dmux = DemuxNode(ConcurrentHashMap(numKeys ?: 16), lifecycle, this)
+                    return upstream
+                        .invoke(evalScope)
+                        .activate(evalScope, downstream = dmux.schedulable)
+                        ?.let { (conn, needsEval) ->
+                            dmux.apply { upstreamConnection = conn } to needsEval
+                        }
+                }
+            }
+        )
+    )
+
+internal class DemuxImpl<in K, out A>(private val dmux: DemuxLifecycle<K, A>) {
+    fun eventsForKey(key: K): TFlowImpl<A> = TFlowCheap { downstream ->
+        dmux.activate(evalScope = this, key)?.let { (branchNode, needsEval) ->
+            branchNode.addDownstream(downstream)
+            val branchNeedsEval = needsEval && branchNode.getPushEvent(evalScope = this) is Just
+            ActivationResult(
+                connection = NodeConnection(branchNode, branchNode),
+                needsEval = branchNeedsEval,
+            )
+        }
+    }
+}
+
+internal class DemuxLifecycle<K, A>(@Volatile var lifecycleState: DemuxLifecycleState<K, A>) {
+    val mutex = Mutex()
+
+    override fun toString(): String = "TFlowDmuxState[$hashString][$lifecycleState][$mutex]"
+
+    suspend fun activate(evalScope: EvalScope, key: K): Pair<DemuxBranchNode<K, A>, Boolean>? =
+        coroutineScope {
+            mutex
+                .withLock {
+                    when (val state = lifecycleState) {
+                        is DemuxLifecycleState.Dead -> null
+                        is DemuxLifecycleState.Active ->
+                            state.node.getAndMaybeAddDownstream(key) to
+                                async {
+                                    state.node.upstreamConnection.hasCurrentValue(
+                                        evalScope.transactionStore
+                                    )
+                                }
+                        is DemuxLifecycleState.Inactive -> {
+                            state.spec
+                                .activate(evalScope, this@DemuxLifecycle)
+                                .also { result ->
+                                    lifecycleState =
+                                        if (result == null) {
+                                            DemuxLifecycleState.Dead
+                                        } else {
+                                            DemuxLifecycleState.Active(result.first)
+                                        }
+                                }
+                                ?.let { (node, needsEval) ->
+                                    node.getAndMaybeAddDownstream(key) to
+                                        CompletableDeferred(needsEval)
+                                }
+                        }
+                    }
+                }
+                ?.let { (branch, result) -> branch to result.await() }
+        }
+}
+
+internal sealed interface DemuxLifecycleState<out K, out A> {
+    class Inactive<K, A>(val spec: DemuxActivator<K, A>) : DemuxLifecycleState<K, A> {
+        override fun toString(): String = "Inactive"
+    }
+
+    class Active<K, A>(val node: DemuxNode<K, A>) : DemuxLifecycleState<K, A> {
+        override fun toString(): String = "Active(node=$node)"
+    }
+
+    data object Dead : DemuxLifecycleState<Nothing, Nothing>
+}
+
+internal interface DemuxActivator<K, A> {
+    suspend fun activate(
+        evalScope: EvalScope,
+        lifecycle: DemuxLifecycle<K, A>,
+    ): Pair<DemuxNode<K, A>, Boolean>?
+}
+
+internal inline fun <K, A> DemuxLifecycle(onSubscribe: DemuxActivator<K, A>) =
+    DemuxLifecycle(DemuxLifecycleState.Inactive(onSubscribe))
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/EvalScopeImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/EvalScopeImpl.kt
new file mode 100644
index 0000000..815473f
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/EvalScopeImpl.kt
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.FrpDeferredValue
+import com.android.systemui.kairos.FrpTransactionScope
+import com.android.systemui.kairos.TFlow
+import com.android.systemui.kairos.TFlowInit
+import com.android.systemui.kairos.TFlowLoop
+import com.android.systemui.kairos.TState
+import com.android.systemui.kairos.TStateInit
+import com.android.systemui.kairos.Transactional
+import com.android.systemui.kairos.emptyTFlow
+import com.android.systemui.kairos.init
+import com.android.systemui.kairos.mapCheap
+import com.android.systemui.kairos.switch
+import kotlin.coroutines.Continuation
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
+import kotlin.coroutines.startCoroutine
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.completeWith
+import kotlinx.coroutines.job
+
+internal class EvalScopeImpl(networkScope: NetworkScope, deferScope: DeferScope) :
+    EvalScope, NetworkScope by networkScope, DeferScope by deferScope {
+
+    private suspend fun <A> Transactional<A>.sample(): A =
+        impl.sample().sample(this@EvalScopeImpl).await()
+
+    private suspend fun <A> TState<A>.sample(): A =
+        init.connect(evalScope = this@EvalScopeImpl).getCurrentWithEpoch(this@EvalScopeImpl).first
+
+    private val <A> Transactional<A>.deferredValue: FrpDeferredValue<A>
+        get() = FrpDeferredValue(deferAsync { sample() })
+
+    private val <A> TState<A>.deferredValue: FrpDeferredValue<A>
+        get() = FrpDeferredValue(deferAsync { sample() })
+
+    private val nowInternal: TFlow<Unit> by lazy {
+        var result by TFlowLoop<Unit>()
+        result =
+            TStateInit(
+                    constInit(
+                        "now",
+                        mkState(
+                            "now",
+                            "now",
+                            this,
+                            { result.mapCheap { emptyTFlow }.init.connect(evalScope = this) },
+                            CompletableDeferred(
+                                TFlowInit(
+                                    constInit(
+                                        "now",
+                                        TFlowCheap {
+                                            ActivationResult(
+                                                connection = NodeConnection(AlwaysNode, AlwaysNode),
+                                                needsEval = true,
+                                            )
+                                        },
+                                    )
+                                )
+                            ),
+                        ),
+                    )
+                )
+                .switch()
+        result
+    }
+
+    private fun <R> deferredInternal(
+        block: suspend FrpTransactionScope.() -> R
+    ): FrpDeferredValue<R> = FrpDeferredValue(deferAsync { runInTransactionScope(block) })
+
+    override suspend fun <R> runInTransactionScope(block: suspend FrpTransactionScope.() -> R): R {
+        val complete = CompletableDeferred<R>(parent = coroutineContext.job)
+        block.startCoroutine(
+            frpScope,
+            object : Continuation<R> {
+                override val context: CoroutineContext
+                    get() = EmptyCoroutineContext
+
+                override fun resumeWith(result: Result<R>) {
+                    complete.completeWith(result)
+                }
+            },
+        )
+        return complete.await()
+    }
+
+    override val frpScope: FrpTransactionScope = FrpTransactionScopeImpl()
+
+    inner class FrpTransactionScopeImpl : FrpTransactionScope {
+        override fun <A> Transactional<A>.sampleDeferred(): FrpDeferredValue<A> = deferredValue
+
+        override fun <A> TState<A>.sampleDeferred(): FrpDeferredValue<A> = deferredValue
+
+        override fun <R> deferredTransactionScope(
+            block: suspend FrpTransactionScope.() -> R
+        ): FrpDeferredValue<R> = deferredInternal(block)
+
+        override val now: TFlow<Unit>
+            get() = nowInternal
+    }
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/FilterNode.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/FilterNode.kt
new file mode 100644
index 0000000..bc06a36
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/FilterNode.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.util.Just
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.none
+
+internal inline fun <A, B> mapMaybeNode(
+    crossinline getPulse: suspend EvalScope.() -> TFlowImpl<A>,
+    crossinline f: suspend EvalScope.(A) -> Maybe<B>,
+): TFlowImpl<B> {
+    return DemuxImpl(
+            {
+                mapImpl(getPulse) {
+                    val maybeResult = f(it)
+                    if (maybeResult is Just) {
+                        mapOf(Unit to maybeResult.value)
+                    } else {
+                        emptyMap()
+                    }
+                }
+            },
+            numKeys = 1,
+        )
+        .eventsForKey(Unit)
+}
+
+internal inline fun <A> filterNode(
+    crossinline getPulse: suspend EvalScope.() -> TFlowImpl<A>,
+    crossinline f: suspend EvalScope.(A) -> Boolean,
+): TFlowImpl<A> = mapMaybeNode(getPulse) { if (f(it)) just(it) else none }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Graph.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Graph.kt
new file mode 100644
index 0000000..3aec319
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Graph.kt
@@ -0,0 +1,530 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.internal.util.Bag
+import java.util.TreeMap
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+
+/**
+ * Tracks all upstream connections for Mux nodes.
+ *
+ * Connections come in two flavors:
+ * 1. **DIRECT** :: The upstream node may emit events that would cause the owner of this depth
+ *    tracker to also emit.
+ * 2. **INDIRECT** :: The upstream node will not emit events, but may start doing so in a future
+ *    transaction (at which point its depth will change to DIRECT).
+ *
+ * DIRECT connections are the standard, active connections that propagate events through the graph.
+ * They are used to calculate the evaluation depth of a node, so that it is only visited once it is
+ * certain that all DIRECT upstream connections have already been visited (or are not emitting in
+ * the current transaction).
+ *
+ * It is *invalid* for a node to be directly upstream of itself. Doing so is an error.
+ *
+ * INDIRECT connections identify nodes that are still "alive" (should not be garbage-collected) but
+ * are presently "dormant". This only occurs when a MuxDeferredNode has nothing switched-in, but is
+ * still connected to its "patches" upstream node, implying that something *may* be switched-in at a
+ * later time.
+ *
+ * It is *invalid* for a node to be indirectly upstream of itself. These connections are
+ * automatically filtered out.
+ *
+ * When there are no connections, either DIRECT or INDIRECT, a node *dies* and all incoming/outgoing
+ * connections are freed so that it can be garbage-collected.
+ *
+ * Note that there is an edge case where a MuxDeferredNode is connected to itself via its "patches"
+ * upstream node. In this case:
+ * 1. If the node has switched-in upstream nodes, then this is perfectly valid. Downstream nodes
+ *    will see a direct connection to this MuxDeferredNode.
+ * 2. Otherwise, the node would normally be considered "dormant" and downstream nodes would see an
+ *    indirect connection. However, because a node cannot be indirectly upstream of itself, then the
+ *    MuxDeferredNode sees no connection via its patches upstream node, and so is considered "dead".
+ *    Conceptually, this makes some sense: The only way for this recursive MuxDeferredNode to become
+ *    non-dormant is to switch some upstream nodes back in, but since the patches node is itself,
+ *    this will never happen.
+ *
+ * This behavior underpins the recursive definition of `nextOnly`.
+ */
+internal class DepthTracker {
+
+    @Volatile var snapshotIsDirect = true
+    @Volatile private var snapshotIsIndirectRoot = false
+
+    private inline val snapshotIsIndirect: Boolean
+        get() = !snapshotIsDirect
+
+    @Volatile var snapshotIndirectDepth: Int = 0
+    @Volatile var snapshotDirectDepth: Int = 0
+
+    private val _snapshotIndirectRoots = HashSet<MuxDeferredNode<*, *>>()
+    val snapshotIndirectRoots
+        get() = _snapshotIndirectRoots.toSet()
+
+    private val indirectAdditions = HashSet<MuxDeferredNode<*, *>>()
+    private val indirectRemovals = HashSet<MuxDeferredNode<*, *>>()
+    private val dirty_directUpstreamDepths = TreeMap<Int, Int>()
+    private val dirty_indirectUpstreamDepths = TreeMap<Int, Int>()
+    private val dirty_indirectUpstreamRoots = Bag<MuxDeferredNode<*, *>>()
+    @Volatile var dirty_directDepth = 0
+    @Volatile private var dirty_indirectDepth = 0
+    @Volatile private var dirty_depthIsDirect = true
+    @Volatile private var dirty_isIndirectRoot = false
+
+    suspend fun schedule(scheduler: Scheduler, node: MuxNode<*, *, *>) {
+        if (dirty_depthIsDirect) {
+            scheduler.schedule(dirty_directDepth, node)
+        } else {
+            scheduler.scheduleIndirect(dirty_indirectDepth, node)
+        }
+    }
+
+    // only used by MuxDeferred
+    // and only when there is a direct connection to the patch node
+    fun setIsIndirectRoot(isRoot: Boolean): Boolean {
+        if (isRoot != dirty_isIndirectRoot) {
+            dirty_isIndirectRoot = isRoot
+            return !dirty_depthIsDirect
+        }
+        return false
+    }
+
+    // adds an upstream connection, and recalcs depth
+    // returns true if depth has changed
+    fun addDirectUpstream(oldDepth: Int?, newDepth: Int): Boolean {
+        if (oldDepth != null) {
+            dirty_directUpstreamDepths.compute(oldDepth) { _, count ->
+                count?.minus(1)?.takeIf { it > 0 }
+            }
+        }
+        dirty_directUpstreamDepths.compute(newDepth) { _, current -> current?.plus(1) ?: 1 }
+        return recalcDepth()
+    }
+
+    private fun recalcDepth(): Boolean {
+        val newDepth =
+            dirty_directUpstreamDepths.lastEntry()?.let { (maxDepth, _) -> maxDepth + 1 } ?: 0
+
+        val isDirect = dirty_directUpstreamDepths.isNotEmpty()
+        val isDirectChanged = dirty_depthIsDirect != isDirect
+        dirty_depthIsDirect = isDirect
+
+        return (newDepth != dirty_directDepth).also { dirty_directDepth = newDepth } or
+            isDirectChanged
+    }
+
+    private fun recalcIndirDepth(): Boolean {
+        val newDepth =
+            dirty_indirectUpstreamDepths.lastEntry()?.let { (maxDepth, _) -> maxDepth + 1 } ?: 0
+        return (!dirty_depthIsDirect && !dirty_isIndirectRoot && newDepth != dirty_indirectDepth)
+            .also { dirty_indirectDepth = newDepth }
+    }
+
+    fun removeDirectUpstream(depth: Int): Boolean {
+        dirty_directUpstreamDepths.compute(depth) { _, count -> count?.minus(1)?.takeIf { it > 0 } }
+        return recalcDepth()
+    }
+
+    fun addIndirectUpstream(oldDepth: Int?, newDepth: Int): Boolean =
+        if (oldDepth == newDepth) {
+            false
+        } else {
+            if (oldDepth != null) {
+                dirty_indirectUpstreamDepths.compute(oldDepth) { _, current ->
+                    current?.minus(1)?.takeIf { it > 0 }
+                }
+            }
+            dirty_indirectUpstreamDepths.compute(newDepth) { _, current -> current?.plus(1) ?: 1 }
+            recalcIndirDepth()
+        }
+
+    fun removeIndirectUpstream(depth: Int): Boolean {
+        dirty_indirectUpstreamDepths.compute(depth) { _, current ->
+            current?.minus(1)?.takeIf { it > 0 }
+        }
+        return recalcIndirDepth()
+    }
+
+    fun updateIndirectRoots(
+        additions: Set<MuxDeferredNode<*, *>>? = null,
+        removals: Set<MuxDeferredNode<*, *>>? = null,
+        butNot: MuxDeferredNode<*, *>? = null,
+    ): Boolean {
+        val addsChanged =
+            additions
+                ?.let { dirty_indirectUpstreamRoots.addAll(additions, butNot) }
+                ?.let {
+                    indirectAdditions.addAll(indirectRemovals.applyRemovalDiff(it))
+                    true
+                } ?: false
+        val removalsChanged =
+            removals
+                ?.let { dirty_indirectUpstreamRoots.removeAll(removals) }
+                ?.let {
+                    indirectRemovals.addAll(indirectAdditions.applyRemovalDiff(it))
+                    true
+                } ?: false
+        return (!dirty_depthIsDirect && (addsChanged || removalsChanged))
+    }
+
+    private fun <T> HashSet<T>.applyRemovalDiff(changeSet: Set<T>): Set<T> {
+        val remainder = HashSet<T>()
+        for (element in changeSet) {
+            if (!add(element)) {
+                remainder.add(element)
+            }
+        }
+        return remainder
+    }
+
+    suspend fun propagateChanges(scheduler: Scheduler, muxNode: MuxNode<*, *, *>) {
+        if (isDirty()) {
+            schedule(scheduler, muxNode)
+        }
+    }
+
+    fun applyChanges(
+        coroutineScope: CoroutineScope,
+        scheduler: Scheduler,
+        downstreamSet: DownstreamSet,
+        muxNode: MuxNode<*, *, *>,
+    ) {
+        when {
+            dirty_depthIsDirect -> {
+                if (snapshotIsDirect) {
+                    downstreamSet.adjustDirectUpstream(
+                        coroutineScope,
+                        scheduler,
+                        oldDepth = snapshotDirectDepth,
+                        newDepth = dirty_directDepth,
+                    )
+                } else {
+                    downstreamSet.moveIndirectUpstreamToDirect(
+                        coroutineScope,
+                        scheduler,
+                        oldIndirectDepth = snapshotIndirectDepth,
+                        oldIndirectSet =
+                            buildSet {
+                                addAll(snapshotIndirectRoots)
+                                if (snapshotIsIndirectRoot) {
+                                    add(muxNode as MuxDeferredNode<*, *>)
+                                }
+                            },
+                        newDirectDepth = dirty_directDepth,
+                    )
+                }
+            }
+
+            dirty_hasIndirectUpstream() || dirty_isIndirectRoot -> {
+                if (snapshotIsDirect) {
+                    downstreamSet.moveDirectUpstreamToIndirect(
+                        coroutineScope,
+                        scheduler,
+                        oldDirectDepth = snapshotDirectDepth,
+                        newIndirectDepth = dirty_indirectDepth,
+                        newIndirectSet =
+                            buildSet {
+                                addAll(dirty_indirectUpstreamRoots)
+                                if (dirty_isIndirectRoot) {
+                                    add(muxNode as MuxDeferredNode<*, *>)
+                                }
+                            },
+                    )
+                } else {
+                    downstreamSet.adjustIndirectUpstream(
+                        coroutineScope,
+                        scheduler,
+                        oldDepth = snapshotIndirectDepth,
+                        newDepth = dirty_indirectDepth,
+                        removals =
+                            buildSet {
+                                addAll(indirectRemovals)
+                                if (snapshotIsIndirectRoot && !dirty_isIndirectRoot) {
+                                    add(muxNode as MuxDeferredNode<*, *>)
+                                }
+                            },
+                        additions =
+                            buildSet {
+                                addAll(indirectAdditions)
+                                if (!snapshotIsIndirectRoot && dirty_isIndirectRoot) {
+                                    add(muxNode as MuxDeferredNode<*, *>)
+                                }
+                            },
+                    )
+                }
+            }
+
+            else -> {
+                // die
+                muxNode.lifecycle.lifecycleState = MuxLifecycleState.Dead
+
+                if (snapshotIsDirect) {
+                    downstreamSet.removeDirectUpstream(
+                        coroutineScope,
+                        scheduler,
+                        depth = snapshotDirectDepth,
+                    )
+                } else {
+                    downstreamSet.removeIndirectUpstream(
+                        coroutineScope,
+                        scheduler,
+                        depth = snapshotIndirectDepth,
+                        indirectSet =
+                            buildSet {
+                                addAll(snapshotIndirectRoots)
+                                if (snapshotIsIndirectRoot) {
+                                    add(muxNode as MuxDeferredNode<*, *>)
+                                }
+                            },
+                    )
+                }
+                downstreamSet.clear()
+            }
+        }
+        reset()
+    }
+
+    fun dirty_hasDirectUpstream(): Boolean = dirty_directUpstreamDepths.isNotEmpty()
+
+    private fun dirty_hasIndirectUpstream(): Boolean = dirty_indirectUpstreamRoots.isNotEmpty()
+
+    override fun toString(): String =
+        "DepthTracker(" +
+            "sIsDirect=$snapshotIsDirect, " +
+            "sDirectDepth=$snapshotDirectDepth, " +
+            "sIndirectDepth=$snapshotIndirectDepth, " +
+            "sIndirectRoots=$snapshotIndirectRoots, " +
+            "dIsIndirectRoot=$dirty_isIndirectRoot, " +
+            "dDirectDepths=$dirty_directUpstreamDepths, " +
+            "dIndirectDepths=$dirty_indirectUpstreamDepths, " +
+            "dIndirectRoots=$dirty_indirectUpstreamRoots" +
+            ")"
+
+    fun reset() {
+        snapshotIsDirect = dirty_hasDirectUpstream()
+        snapshotDirectDepth = dirty_directDepth
+        snapshotIndirectDepth = dirty_indirectDepth
+        snapshotIsIndirectRoot = dirty_isIndirectRoot
+        if (indirectAdditions.isNotEmpty() || indirectRemovals.isNotEmpty()) {
+            _snapshotIndirectRoots.clear()
+            _snapshotIndirectRoots.addAll(dirty_indirectUpstreamRoots)
+        }
+        indirectAdditions.clear()
+        indirectRemovals.clear()
+        //        check(!isDirty()) { "should not be dirty after a reset" }
+    }
+
+    fun isDirty(): Boolean =
+        when {
+            snapshotIsDirect -> !dirty_depthIsDirect || snapshotDirectDepth != dirty_directDepth
+            snapshotIsIndirectRoot -> dirty_depthIsDirect || !dirty_isIndirectRoot
+            else ->
+                dirty_depthIsDirect ||
+                    dirty_isIndirectRoot ||
+                    snapshotIndirectDepth != dirty_indirectDepth ||
+                    indirectAdditions.isNotEmpty() ||
+                    indirectRemovals.isNotEmpty()
+        }
+
+    fun dirty_depthIncreased(): Boolean =
+        snapshotDirectDepth < dirty_directDepth || snapshotIsIndirect && dirty_hasDirectUpstream()
+}
+
+/**
+ * Tracks downstream nodes to be scheduled when the owner of this DownstreamSet produces a value in
+ * a transaction.
+ */
+internal class DownstreamSet {
+
+    val outputs = HashSet<Output<*>>()
+    val stateWriters = mutableListOf<TStateSource<*>>()
+    val muxMovers = HashSet<MuxDeferredNode<*, *>>()
+    val nodes = HashSet<SchedulableNode>()
+
+    fun add(schedulable: Schedulable) {
+        when (schedulable) {
+            is Schedulable.S -> stateWriters.add(schedulable.state)
+            is Schedulable.M -> muxMovers.add(schedulable.muxMover)
+            is Schedulable.N -> nodes.add(schedulable.node)
+            is Schedulable.O -> outputs.add(schedulable.output)
+        }
+    }
+
+    fun remove(schedulable: Schedulable) {
+        when (schedulable) {
+            is Schedulable.S -> error("WTF: latches are never removed")
+            is Schedulable.M -> muxMovers.remove(schedulable.muxMover)
+            is Schedulable.N -> nodes.remove(schedulable.node)
+            is Schedulable.O -> outputs.remove(schedulable.output)
+        }
+    }
+
+    fun adjustDirectUpstream(
+        coroutineScope: CoroutineScope,
+        scheduler: Scheduler,
+        oldDepth: Int,
+        newDepth: Int,
+    ) =
+        coroutineScope.run {
+            for (node in nodes) {
+                launch { node.adjustDirectUpstream(scheduler, oldDepth, newDepth) }
+            }
+        }
+
+    fun moveIndirectUpstreamToDirect(
+        coroutineScope: CoroutineScope,
+        scheduler: Scheduler,
+        oldIndirectDepth: Int,
+        oldIndirectSet: Set<MuxDeferredNode<*, *>>,
+        newDirectDepth: Int,
+    ) =
+        coroutineScope.run {
+            for (node in nodes) {
+                launch {
+                    node.moveIndirectUpstreamToDirect(
+                        scheduler,
+                        oldIndirectDepth,
+                        oldIndirectSet,
+                        newDirectDepth,
+                    )
+                }
+            }
+            for (mover in muxMovers) {
+                launch {
+                    mover.moveIndirectPatchNodeToDirect(scheduler, oldIndirectDepth, oldIndirectSet)
+                }
+            }
+        }
+
+    fun adjustIndirectUpstream(
+        coroutineScope: CoroutineScope,
+        scheduler: Scheduler,
+        oldDepth: Int,
+        newDepth: Int,
+        removals: Set<MuxDeferredNode<*, *>>,
+        additions: Set<MuxDeferredNode<*, *>>,
+    ) =
+        coroutineScope.run {
+            for (node in nodes) {
+                launch {
+                    node.adjustIndirectUpstream(scheduler, oldDepth, newDepth, removals, additions)
+                }
+            }
+            for (mover in muxMovers) {
+                launch {
+                    mover.adjustIndirectPatchNode(
+                        scheduler,
+                        oldDepth,
+                        newDepth,
+                        removals,
+                        additions,
+                    )
+                }
+            }
+        }
+
+    fun moveDirectUpstreamToIndirect(
+        coroutineScope: CoroutineScope,
+        scheduler: Scheduler,
+        oldDirectDepth: Int,
+        newIndirectDepth: Int,
+        newIndirectSet: Set<MuxDeferredNode<*, *>>,
+    ) =
+        coroutineScope.run {
+            for (node in nodes) {
+                launch {
+                    node.moveDirectUpstreamToIndirect(
+                        scheduler,
+                        oldDirectDepth,
+                        newIndirectDepth,
+                        newIndirectSet,
+                    )
+                }
+            }
+            for (mover in muxMovers) {
+                launch {
+                    mover.moveDirectPatchNodeToIndirect(scheduler, newIndirectDepth, newIndirectSet)
+                }
+            }
+        }
+
+    fun removeIndirectUpstream(
+        coroutineScope: CoroutineScope,
+        scheduler: Scheduler,
+        depth: Int,
+        indirectSet: Set<MuxDeferredNode<*, *>>,
+    ) =
+        coroutineScope.run {
+            for (node in nodes) {
+                launch { node.removeIndirectUpstream(scheduler, depth, indirectSet) }
+            }
+            for (mover in muxMovers) {
+                launch { mover.removeIndirectPatchNode(scheduler, depth, indirectSet) }
+            }
+            for (output in outputs) {
+                launch { output.kill() }
+            }
+        }
+
+    fun removeDirectUpstream(coroutineScope: CoroutineScope, scheduler: Scheduler, depth: Int) =
+        coroutineScope.run {
+            for (node in nodes) {
+                launch { node.removeDirectUpstream(scheduler, depth) }
+            }
+            for (mover in muxMovers) {
+                launch { mover.removeDirectPatchNode(scheduler) }
+            }
+            for (output in outputs) {
+                launch { output.kill() }
+            }
+        }
+
+    fun clear() {
+        outputs.clear()
+        stateWriters.clear()
+        muxMovers.clear()
+        nodes.clear()
+    }
+}
+
+// TODO: remove this indirection
+internal sealed interface Schedulable {
+    data class S constructor(val state: TStateSource<*>) : Schedulable
+
+    data class M constructor(val muxMover: MuxDeferredNode<*, *>) : Schedulable
+
+    data class N constructor(val node: SchedulableNode) : Schedulable
+
+    data class O constructor(val output: Output<*>) : Schedulable
+}
+
+internal fun DownstreamSet.isEmpty() =
+    nodes.isEmpty() && outputs.isEmpty() && muxMovers.isEmpty() && stateWriters.isEmpty()
+
+@Suppress("NOTHING_TO_INLINE") internal inline fun DownstreamSet.isNotEmpty() = !isEmpty()
+
+internal fun CoroutineScope.scheduleAll(
+    downstreamSet: DownstreamSet,
+    evalScope: EvalScope,
+): Boolean {
+    downstreamSet.nodes.forEach { launch { it.schedule(evalScope) } }
+    downstreamSet.muxMovers.forEach { launch { it.scheduleMover(evalScope) } }
+    downstreamSet.outputs.forEach { launch { it.schedule(evalScope) } }
+    downstreamSet.stateWriters.forEach { evalScope.schedule(it) }
+    return downstreamSet.isNotEmpty()
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Init.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Init.kt
new file mode 100644
index 0000000..57db9a4
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Init.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.none
+import java.util.concurrent.atomic.AtomicBoolean
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+/** Performs actions once, when the reactive component is first connected to the network. */
+internal class Init<out A>(val name: String?, private val block: suspend InitScope.() -> A) {
+
+    /** Has the initialization logic been evaluated yet? */
+    private val initialized = AtomicBoolean()
+
+    /**
+     * Stores the result after initialization, as well as the id of the [Network] it's been
+     * initialized with.
+     */
+    private val cache = CompletableDeferred<Pair<Any, A>>()
+
+    suspend fun connect(evalScope: InitScope): A =
+        if (initialized.getAndSet(true)) {
+            // Read from cache
+            val (networkId, result) = cache.await()
+            check(networkId == evalScope.networkId) { "Network mismatch" }
+            result
+        } else {
+            // Write to cache
+            block(evalScope).also { cache.complete(evalScope.networkId to it) }
+        }
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    fun getUnsafe(): Maybe<A> =
+        if (cache.isCompleted) {
+            just(cache.getCompleted().second)
+        } else {
+            none
+        }
+}
+
+internal fun <A> init(name: String?, block: suspend InitScope.() -> A) = Init(name, block)
+
+internal fun <A> constInit(name: String?, value: A) = init(name) { value }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Inputs.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Inputs.kt
new file mode 100644
index 0000000..8efaf79
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Inputs.kt
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.internal.util.Key
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.just
+import java.util.concurrent.atomic.AtomicBoolean
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.sync.Mutex
+import kotlinx.coroutines.sync.withLock
+
+internal class InputNode<A>(
+    private val activate: suspend EvalScope.() -> Unit = {},
+    private val deactivate: () -> Unit = {},
+) : PushNode<A>, Key<A> {
+
+    internal val downstreamSet = DownstreamSet()
+    private val mutex = Mutex()
+    private val activated = AtomicBoolean(false)
+
+    override val depthTracker: DepthTracker = DepthTracker()
+
+    override suspend fun hasCurrentValue(transactionStore: TransactionStore): Boolean =
+        transactionStore.contains(this)
+
+    suspend fun visit(evalScope: EvalScope, value: A) {
+        evalScope.setResult(this, value)
+        coroutineScope {
+            if (!mutex.withLock { scheduleAll(downstreamSet, evalScope) }) {
+                evalScope.scheduleDeactivation(this@InputNode)
+            }
+        }
+    }
+
+    override suspend fun removeDownstream(downstream: Schedulable) {
+        mutex.withLock { downstreamSet.remove(downstream) }
+    }
+
+    override suspend fun deactivateIfNeeded() {
+        if (mutex.withLock { downstreamSet.isEmpty() && activated.getAndSet(false) }) {
+            deactivate()
+        }
+    }
+
+    override suspend fun scheduleDeactivationIfNeeded(evalScope: EvalScope) {
+        if (mutex.withLock { downstreamSet.isEmpty() }) {
+            evalScope.scheduleDeactivation(this)
+        }
+    }
+
+    override suspend fun addDownstream(downstream: Schedulable) {
+        mutex.withLock { downstreamSet.add(downstream) }
+    }
+
+    suspend fun addDownstreamAndActivateIfNeeded(downstream: Schedulable, evalScope: EvalScope) {
+        val needsActivation =
+            mutex.withLock {
+                val wasEmpty = downstreamSet.isEmpty()
+                downstreamSet.add(downstream)
+                wasEmpty && !activated.getAndSet(true)
+            }
+        if (needsActivation) {
+            activate(evalScope)
+        }
+    }
+
+    override suspend fun removeDownstreamAndDeactivateIfNeeded(downstream: Schedulable) {
+        val needsDeactivation =
+            mutex.withLock {
+                downstreamSet.remove(downstream)
+                downstreamSet.isEmpty() && activated.getAndSet(false)
+            }
+        if (needsDeactivation) {
+            deactivate()
+        }
+    }
+
+    override suspend fun getPushEvent(evalScope: EvalScope): Maybe<A> =
+        evalScope.getCurrentValue(this)
+}
+
+internal fun <A> InputNode<A>.activated() = TFlowCheap { downstream ->
+    val input = this@activated
+    addDownstreamAndActivateIfNeeded(downstream, evalScope = this)
+    ActivationResult(connection = NodeConnection(input, input), needsEval = hasCurrentValue(input))
+}
+
+internal data object AlwaysNode : PushNode<Unit> {
+
+    override val depthTracker = DepthTracker()
+
+    override suspend fun hasCurrentValue(transactionStore: TransactionStore): Boolean = true
+
+    override suspend fun removeDownstream(downstream: Schedulable) {}
+
+    override suspend fun deactivateIfNeeded() {}
+
+    override suspend fun scheduleDeactivationIfNeeded(evalScope: EvalScope) {}
+
+    override suspend fun addDownstream(downstream: Schedulable) {}
+
+    override suspend fun removeDownstreamAndDeactivateIfNeeded(downstream: Schedulable) {}
+
+    override suspend fun getPushEvent(evalScope: EvalScope): Maybe<Unit> = just(Unit)
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/InternalScopes.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/InternalScopes.kt
new file mode 100644
index 0000000..af864e6
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/InternalScopes.kt
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.FrpBuildScope
+import com.android.systemui.kairos.FrpStateScope
+import com.android.systemui.kairos.FrpTransactionScope
+import com.android.systemui.kairos.TFlow
+import com.android.systemui.kairos.internal.util.HeteroMap
+import com.android.systemui.kairos.internal.util.Key
+import com.android.systemui.kairos.util.Maybe
+
+internal interface InitScope {
+    val networkId: Any
+}
+
+internal interface EvalScope : NetworkScope, DeferScope {
+    val frpScope: FrpTransactionScope
+
+    suspend fun <R> runInTransactionScope(block: suspend FrpTransactionScope.() -> R): R
+}
+
+internal interface StateScope : EvalScope {
+    override val frpScope: FrpStateScope
+
+    suspend fun <R> runInStateScope(block: suspend FrpStateScope.() -> R): R
+
+    val endSignal: TFlow<Any>
+
+    fun childStateScope(newEnd: TFlow<Any>): StateScope
+}
+
+internal interface BuildScope : StateScope {
+    override val frpScope: FrpBuildScope
+
+    suspend fun <R> runInBuildScope(block: suspend FrpBuildScope.() -> R): R
+}
+
+internal interface NetworkScope : InitScope {
+
+    val epoch: Long
+    val network: Network
+
+    val compactor: Scheduler
+    val scheduler: Scheduler
+
+    val transactionStore: HeteroMap
+
+    fun scheduleOutput(output: Output<*>)
+
+    fun scheduleMuxMover(muxMover: MuxDeferredNode<*, *>)
+
+    fun schedule(state: TStateSource<*>)
+
+    suspend fun schedule(node: MuxNode<*, *, *>)
+
+    fun scheduleDeactivation(node: PushNode<*>)
+
+    fun scheduleDeactivation(output: Output<*>)
+}
+
+internal fun <A> NetworkScope.setResult(node: Key<A>, result: A) {
+    transactionStore[node] = result
+}
+
+internal fun <A> NetworkScope.getCurrentValue(key: Key<A>): Maybe<A> = transactionStore[key]
+
+internal fun NetworkScope.hasCurrentValue(key: Key<*>): Boolean = transactionStore.contains(key)
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Mux.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Mux.kt
new file mode 100644
index 0000000..f7ff15f
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Mux.kt
@@ -0,0 +1,326 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package com.android.systemui.kairos.internal
+
+import com.android.systemui.kairos.internal.util.ConcurrentNullableHashMap
+import com.android.systemui.kairos.internal.util.hashString
+import com.android.systemui.kairos.util.Just
+import java.util.concurrent.ConcurrentHashMap
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.sync.Mutex
+import kotlinx.coroutines.sync.withLock
+
+/** Base class for muxing nodes, which have a potentially dynamic collection of upstream nodes. */
+internal sealed class MuxNode<K : Any, V, Output>(val lifecycle: MuxLifecycle<Output>) :
+    PushNode<Output> {
+
+    inline val mutex
+        get() = lifecycle.mutex
+
+    // TODO: preserve insertion order?
+    val upstreamData = ConcurrentNullableHashMap<K, V>()
+    val switchedIn = ConcurrentHashMap<K, MuxBranchNode<K, V>>()
+    val downstreamSet: DownstreamSet = DownstreamSet()
+
+    // TODO: inline DepthTracker? would need to be added to PushNode signature
+    final override val depthTracker = DepthTracker()
+
+    final override suspend fun addDownstream(downstream: Schedulable) {
+        mutex.withLock { addDownstreamLocked(downstream) }
+    }
+
+    /**
+     * Adds a downstream schedulable to this mux node, such that when this mux node emits a value,
+     * it will be scheduled for evaluation within this same transaction.
+     *
+     * Must only be called when [mutex] is acquired.
+     */
+    fun addDownstreamLocked(downstream: Schedulable) {
+        downstreamSet.add(downstream)
+    }
+
+    final override suspend fun removeDownstream(downstream: Schedulable) {
+        // TODO: return boolean?
+        mutex.withLock { downstreamSet.remove(downstream) }
+    }
+
+    final override suspend fun removeDownstreamAndDeactivateIfNeeded(downstream: Schedulable) {
+        val deactivate =
+            mutex.withLock {
+                downstreamSet.remove(downstream)
+                downstreamSet.isEmpty()
+            }
+        if (deactivate) {
+            doDeactivate()
+        }
+    }
+
+    final override suspend fun deactivateIfNeeded() {
+        if (mutex.withLock { downstreamSet.isEmpty() }) {
+            doDeactivate()
+        }
+    }
+
+    /** visit this node from the scheduler (push eval) */
+    abstract suspend fun visit(evalScope: EvalScope)
+
+    /** perform deactivation logic, propagating to all upstream nodes. */
+    protected abstract suspend fun doDeactivate()
+
+    final override suspend fun scheduleDeactivationIfNeeded(evalScope: EvalScope) {
+        if (mutex.withLock { downstreamSet.isEmpty() }) {
+            evalScope.scheduleDeactivation(this)
+        }
+    }
+
+    suspend fun adjustDirectUpstream(scheduler: Scheduler, oldDepth: Int, newDepth: Int) {
+        mutex.withLock {
+            if (depthTracker.addDirectUpstream(oldDepth, newDepth)) {
+                depthTracker.schedule(scheduler, this)
+            }
+        }
+    }
+
+    suspend fun moveIndirectUpstreamToDirect(
+        scheduler: Scheduler,
+        oldIndirectDepth: Int,
+        oldIndirectRoots: Set<MuxDeferredNode<*, *>>,
+        newDepth: Int,
+    ) {
+        mutex.withLock {
+            if (
+                depthTracker.addDirectUpstream(oldDepth = null, newDepth) or
+                    depthTracker.removeIndirectUpstream(depth = oldIndirectDepth) or
+                    depthTracker.updateIndirectRoots(removals = oldIndirectRoots)
+            ) {
+                depthTracker.schedule(scheduler, this)
+            }
+        }
+    }
+
+    suspend fun adjustIndirectUpstream(
+        scheduler: Scheduler,
+        oldDepth: Int,
+        newDepth: Int,
+        removals: Set<MuxDeferredNode<*, *>>,
+        additions: Set<MuxDeferredNode<*, *>>,
+    ) {
+        mutex.withLock {
+            if (
+                depthTracker.addIndirectUpstream(oldDepth, newDepth) or
+                    depthTracker.updateIndirectRoots(
+                        additions,
+                        removals,
+                        butNot = this as? MuxDeferredNode<*, *>,
+                    )
+            ) {
+                depthTracker.schedule(scheduler, this)
+            }
+        }
+    }
+
+    suspend fun moveDirectUpstreamToIndirect(
+        scheduler: Scheduler,
+        oldDepth: Int,
+        newDepth: Int,
+        newIndirectSet: Set<MuxDeferredNode<*, *>>,
+    ) {
+        mutex.withLock {
+            if (
+                depthTracker.addIndirectUpstream(oldDepth = null, newDepth) or
+                    depthTracker.removeDirectUpstream(oldDepth) or
+                    depthTracker.updateIndirectRoots(
+                        additions = newIndirectSet,
+                        butNot = this as? MuxDeferredNode<*, *>,
+                    )
+            ) {
+                depthTracker.schedule(scheduler, this)
+            }
+        }
+    }
+
+    suspend fun removeDirectUpstream(scheduler: Scheduler, depth: Int, key: K) {
+        mutex.withLock {
+            switchedIn.remove(key)
+            if (depthTracker.removeDirectUpstream(depth)) {
+                depthTracker.schedule(scheduler, this)
+            }
+        }
+    }
+
+    suspend fun removeIndirectUpstream(
+        scheduler: Scheduler,
+        oldDepth: Int,
+        indirectSet: Set<MuxDeferredNode<*, *>>,
+        key: K,
+    ) {
+        mutex.withLock {
+            switchedIn.remove(key)
+            if (
+                depthTracker.removeIndirectUpstream(oldDepth) or
+                    depthTracker.updateIndirectRoots(removals = indirectSet)
+            ) {
+                depthTracker.schedule(scheduler, this)
+            }
+        }
+    }
+
+    suspend fun visitCompact(scheduler: Scheduler) = coroutineScope {
+        if (depthTracker.isDirty()) {
+            depthTracker.applyChanges(coroutineScope = this, scheduler, downstreamSet, this@MuxNode)
+        }
+    }
+
+    abstract fun hasCurrentValueLocked(transactionStore: TransactionStore): Boolean
+}
+
+/** An input branch of a mux node, associated with a key. */
+internal class MuxBranchNode<K : Any, V>(private val muxNode: MuxNode<K, V, *>, val key: K) :
+    SchedulableNode {
+
+    val schedulable = Schedulable.N(this)
+
+    @Volatile lateinit var upstream: NodeConnection<V>
+
+    override suspend fun schedule(evalScope: EvalScope) {
+        val upstreamResult = upstream.getPushEvent(evalScope)
+        if (upstreamResult is Just) {
+            muxNode.upstreamData[key] = upstreamResult.value
+            evalScope.schedule(muxNode)
+        }
+    }
+
+    override suspend fun adjustDirectUpstream(scheduler: Scheduler, oldDepth: Int, newDepth: Int) {
+        muxNode.adjustDirectUpstream(scheduler, oldDepth, newDepth)
+    }
+
+    override suspend fun moveIndirectUpstreamToDirect(
+        scheduler: Scheduler,
+        oldIndirectDepth: Int,
+        oldIndirectSet: Set<MuxDeferredNode<*, *>>,
+        newDirectDepth: Int,
+    ) {
+        muxNode.moveIndirectUpstreamToDirect(
+            scheduler,
+            oldIndirectDepth,
+            oldIndirectSet,
+            newDirectDepth,
+        )
+    }
+
+    override suspend fun adjustIndirectUpstream(
+        scheduler: Scheduler,
+        oldDepth: Int,
+        newDepth: Int,
+        removals: Set<MuxDeferredNode<*, *>>,
+        additions: Set<MuxDeferredNode<*, *>>,
+    ) {
+        muxNode.adjustIndirectUpstream(scheduler, oldDepth, newDepth, removals, additions)
+    }
+
+    override suspend fun moveDirectUpstreamToIndirect(
+        scheduler: Scheduler,
+        oldDirectDepth: Int,
+        newIndirectDepth: Int,
+        newIndirectSet: Set<MuxDeferredNode<*, *>>,
+    ) {
+        muxNode.moveDirectUpstreamToIndirect(
+            scheduler,
+            oldDirectDepth,
+            newIndirectDepth,
+            newIndirectSet,
+        )
+    }
+
+    override suspend fun removeDirectUpstream(scheduler: Scheduler, depth: Int) {
+        muxNode.removeDirectUpstream(scheduler, depth, key)
+    }
+
+    override suspend fun removeIndirectUpstream(
+        scheduler: Scheduler,
+        depth: Int,
+        indirectSet: Set<MuxDeferredNode<*, *>>,
+    ) {
+        muxNode.removeIndirectUpstream(scheduler, depth, indirectSet, key)
+    }
+
+    override fun toString(): String = "MuxBranchNode(key=$key, mux=$muxNode)"
+}
+
+/** Tracks lifecycle of MuxNode in the network. Essentially a mutable ref for MuxLifecycleState. */
+internal class MuxLifecycle<A>(@Volatile var lifecycleState: MuxLifecycleState<A>) : TFlowImpl<A> {
+    val mutex = Mutex()
+
+    override fun toString(): String = "TFlowLifecycle[$hashString][$lifecycleState][$mutex]"
+
+    override suspend fun activate(
+        evalScope: EvalScope,
+        downstream: Schedulable,
+    ): ActivationResult<A>? =
+        mutex.withLock {
+            when (val state = lifecycleState) {
+                is MuxLifecycleState.Dead -> null
+                is MuxLifecycleState.Active -> {
+                    state.node.addDownstreamLocked(downstream)
+                    ActivationResult(
+                        connection = NodeConnection(state.node, state.node),
+                        needsEval = state.node.hasCurrentValueLocked(evalScope.transactionStore),
+                    )
+                }
+                is MuxLifecycleState.Inactive -> {
+                    state.spec
+                        .activate(evalScope, this@MuxLifecycle)
+                        .also { node ->
+                            lifecycleState =
+                                if (node == null) {
+                                    MuxLifecycleState.Dead
+                                } else {
+                                    MuxLifecycleState.Active(node)
+                                }
+                        }
+                        ?.let { node ->
+                            node.addDownstreamLocked(downstream)
+                            ActivationResult(
+                                connection = NodeConnection(node, node),
+                                needsEval = false,
+                            )
+                        }
+                }
+            }
+        }
+}
+
+internal sealed interface MuxLifecycleState<out A> {
+    class Inactive<A>(val spec: MuxActivator<A>) : MuxLifecycleState<A> {
+        override fun toString(): String = "Inactive"
+    }
+
+    class Active<A>(val node: MuxNode<*, *, A>) : MuxLifecycleState<A> {
+        override fun toString(): String = "Active(node=$node)"
+    }
+
+    data object Dead : MuxLifecycleState<Nothing>
+}
+
+internal interface MuxActivator<A> {
+    suspend fun activate(evalScope: EvalScope, lifecycle: MuxLifecycle<A>): MuxNode<*, *, A>?
+}
+
+internal inline fun <A> MuxLifecycle(onSubscribe: MuxActivator<A>): TFlowImpl<A> =
+    MuxLifecycle(MuxLifecycleState.Inactive(onSubscribe))
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt
new file mode 100644
index 0000000..08bee85
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt
@@ -0,0 +1,473 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.internal.util.Key
+import com.android.systemui.kairos.internal.util.associateByIndexTo
+import com.android.systemui.kairos.internal.util.hashString
+import com.android.systemui.kairos.internal.util.mapParallel
+import com.android.systemui.kairos.internal.util.mapValuesNotNullParallelTo
+import com.android.systemui.kairos.util.Just
+import com.android.systemui.kairos.util.Left
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.None
+import com.android.systemui.kairos.util.Right
+import com.android.systemui.kairos.util.These
+import com.android.systemui.kairos.util.flatMap
+import com.android.systemui.kairos.util.getMaybe
+import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.maybeThat
+import com.android.systemui.kairos.util.maybeThis
+import com.android.systemui.kairos.util.merge
+import com.android.systemui.kairos.util.orElseGet
+import com.android.systemui.kairos.util.partitionEithers
+import com.android.systemui.kairos.util.these
+import java.util.TreeMap
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.sync.withLock
+
+internal class MuxDeferredNode<K : Any, V>(
+    lifecycle: MuxLifecycle<Map<K, V>>,
+    val spec: MuxActivator<Map<K, V>>,
+) : MuxNode<K, V, Map<K, V>>(lifecycle), Key<Map<K, V>> {
+
+    val schedulable = Schedulable.M(this)
+
+    @Volatile var patches: NodeConnection<Map<K, Maybe<TFlowImpl<V>>>>? = null
+    @Volatile var patchData: Map<K, Maybe<TFlowImpl<V>>>? = null
+
+    override fun hasCurrentValueLocked(transactionStore: TransactionStore): Boolean =
+        transactionStore.contains(this)
+
+    override suspend fun hasCurrentValue(transactionStore: TransactionStore): Boolean =
+        mutex.withLock { hasCurrentValueLocked(transactionStore) }
+
+    override suspend fun visit(evalScope: EvalScope) {
+        val result = upstreamData.toMap()
+        upstreamData.clear()
+        val scheduleDownstream = result.isNotEmpty()
+        val compactDownstream = depthTracker.isDirty()
+        if (scheduleDownstream || compactDownstream) {
+            coroutineScope {
+                mutex.withLock {
+                    if (compactDownstream) {
+                        depthTracker.applyChanges(
+                            coroutineScope = this,
+                            evalScope.scheduler,
+                            downstreamSet,
+                            muxNode = this@MuxDeferredNode,
+                        )
+                    }
+                    if (scheduleDownstream) {
+                        evalScope.setResult(this@MuxDeferredNode, result)
+                        if (!scheduleAll(downstreamSet, evalScope)) {
+                            evalScope.scheduleDeactivation(this@MuxDeferredNode)
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    override suspend fun getPushEvent(evalScope: EvalScope): Maybe<Map<K, V>> =
+        evalScope.getCurrentValue(key = this)
+
+    private suspend fun compactIfNeeded(evalScope: EvalScope) {
+        depthTracker.propagateChanges(evalScope.compactor, this)
+    }
+
+    override suspend fun doDeactivate() {
+        // Update lifecycle
+        lifecycle.mutex.withLock {
+            if (lifecycle.lifecycleState !is MuxLifecycleState.Active) return@doDeactivate
+            lifecycle.lifecycleState = MuxLifecycleState.Inactive(spec)
+        }
+        // Process branch nodes
+        coroutineScope {
+            switchedIn.values.forEach { branchNode ->
+                branchNode.upstream.let {
+                    launch { it.removeDownstreamAndDeactivateIfNeeded(branchNode.schedulable) }
+                }
+            }
+        }
+        // Process patch node
+        patches?.removeDownstreamAndDeactivateIfNeeded(schedulable)
+    }
+
+    // MOVE phase
+    //  - concurrent moves may be occurring, but no more evals. all depth recalculations are
+    //    deferred to the end of this phase.
+    suspend fun performMove(evalScope: EvalScope) {
+        val patch = patchData ?: return
+        patchData = null
+
+        // TODO: this logic is very similar to what's in MuxPromptMoving, maybe turn into an inline
+        //  fun?
+
+        // We have a patch, process additions/updates and removals
+        val (adds, removes) =
+            patch
+                .asSequence()
+                .map { (k, newUpstream: Maybe<TFlowImpl<V>>) ->
+                    when (newUpstream) {
+                        is Just -> Left(k to newUpstream.value)
+                        None -> Right(k)
+                    }
+                }
+                .partitionEithers()
+
+        val severed = mutableListOf<NodeConnection<*>>()
+
+        coroutineScope {
+            // remove and sever
+            removes.forEach { k ->
+                switchedIn.remove(k)?.let { branchNode: MuxBranchNode<K, V> ->
+                    val conn = branchNode.upstream
+                    severed.add(conn)
+                    launch { conn.removeDownstream(downstream = branchNode.schedulable) }
+                    depthTracker.removeDirectUpstream(conn.depthTracker.snapshotDirectDepth)
+                }
+            }
+
+            // add or replace
+            adds
+                .mapParallel { (k, newUpstream: TFlowImpl<V>) ->
+                    val branchNode = MuxBranchNode(this@MuxDeferredNode, k)
+                    k to
+                        newUpstream.activate(evalScope, branchNode.schedulable)?.let { (conn, _) ->
+                            branchNode.apply { upstream = conn }
+                        }
+                }
+                .forEach { (k, newBranch: MuxBranchNode<K, V>?) ->
+                    // remove old and sever, if present
+                    switchedIn.remove(k)?.let { branchNode ->
+                        val conn = branchNode.upstream
+                        severed.add(conn)
+                        launch { conn.removeDownstream(downstream = branchNode.schedulable) }
+                        depthTracker.removeDirectUpstream(conn.depthTracker.snapshotDirectDepth)
+                    }
+
+                    // add new
+                    newBranch?.let {
+                        switchedIn[k] = newBranch
+                        val branchDepthTracker = newBranch.upstream.depthTracker
+                        if (branchDepthTracker.snapshotIsDirect) {
+                            depthTracker.addDirectUpstream(
+                                oldDepth = null,
+                                newDepth = branchDepthTracker.snapshotDirectDepth,
+                            )
+                        } else {
+                            depthTracker.addIndirectUpstream(
+                                oldDepth = null,
+                                newDepth = branchDepthTracker.snapshotIndirectDepth,
+                            )
+                            depthTracker.updateIndirectRoots(
+                                additions = branchDepthTracker.snapshotIndirectRoots,
+                                butNot = this@MuxDeferredNode,
+                            )
+                        }
+                    }
+                }
+        }
+
+        coroutineScope {
+            for (severedNode in severed) {
+                launch { severedNode.scheduleDeactivationIfNeeded(evalScope) }
+            }
+        }
+
+        compactIfNeeded(evalScope)
+    }
+
+    suspend fun removeDirectPatchNode(scheduler: Scheduler) {
+        mutex.withLock {
+            if (
+                depthTracker.removeIndirectUpstream(depth = 0) or
+                    depthTracker.setIsIndirectRoot(false)
+            ) {
+                depthTracker.schedule(scheduler, this)
+            }
+            patches = null
+        }
+    }
+
+    suspend fun removeIndirectPatchNode(
+        scheduler: Scheduler,
+        depth: Int,
+        indirectSet: Set<MuxDeferredNode<*, *>>,
+    ) {
+        // indirectly connected patches forward the indirectSet
+        mutex.withLock {
+            if (
+                depthTracker.updateIndirectRoots(removals = indirectSet) or
+                    depthTracker.removeIndirectUpstream(depth)
+            ) {
+                depthTracker.schedule(scheduler, this)
+            }
+            patches = null
+        }
+    }
+
+    suspend fun moveIndirectPatchNodeToDirect(
+        scheduler: Scheduler,
+        oldIndirectDepth: Int,
+        oldIndirectSet: Set<MuxDeferredNode<*, *>>,
+    ) {
+        // directly connected patches are stored as an indirect singleton set of the patchNode
+        mutex.withLock {
+            if (
+                depthTracker.updateIndirectRoots(removals = oldIndirectSet) or
+                    depthTracker.removeIndirectUpstream(oldIndirectDepth) or
+                    depthTracker.setIsIndirectRoot(true)
+            ) {
+                depthTracker.schedule(scheduler, this)
+            }
+        }
+    }
+
+    suspend fun moveDirectPatchNodeToIndirect(
+        scheduler: Scheduler,
+        newIndirectDepth: Int,
+        newIndirectSet: Set<MuxDeferredNode<*, *>>,
+    ) {
+        // indirectly connected patches forward the indirectSet
+        mutex.withLock {
+            if (
+                depthTracker.setIsIndirectRoot(false) or
+                    depthTracker.updateIndirectRoots(additions = newIndirectSet, butNot = this) or
+                    depthTracker.addIndirectUpstream(oldDepth = null, newDepth = newIndirectDepth)
+            ) {
+                depthTracker.schedule(scheduler, this)
+            }
+        }
+    }
+
+    suspend fun adjustIndirectPatchNode(
+        scheduler: Scheduler,
+        oldDepth: Int,
+        newDepth: Int,
+        removals: Set<MuxDeferredNode<*, *>>,
+        additions: Set<MuxDeferredNode<*, *>>,
+    ) {
+        // indirectly connected patches forward the indirectSet
+        mutex.withLock {
+            if (
+                depthTracker.updateIndirectRoots(
+                    additions = additions,
+                    removals = removals,
+                    butNot = this,
+                ) or depthTracker.addIndirectUpstream(oldDepth = oldDepth, newDepth = newDepth)
+            ) {
+                depthTracker.schedule(scheduler, this)
+            }
+        }
+    }
+
+    suspend fun scheduleMover(evalScope: EvalScope) {
+        patchData =
+            checkNotNull(patches) { "mux mover scheduled with unset patches upstream node" }
+                .getPushEvent(evalScope)
+                .orElseGet { null }
+        evalScope.scheduleMuxMover(this)
+    }
+
+    override fun toString(): String = "${this::class.simpleName}@$hashString"
+}
+
+internal inline fun <A> switchDeferredImplSingle(
+    crossinline getStorage: suspend EvalScope.() -> TFlowImpl<A>,
+    crossinline getPatches: suspend EvalScope.() -> TFlowImpl<TFlowImpl<A>>,
+): TFlowImpl<A> =
+    mapImpl({
+        switchDeferredImpl(
+            getStorage = { mapOf(Unit to getStorage()) },
+            getPatches = { mapImpl(getPatches) { newFlow -> mapOf(Unit to just(newFlow)) } },
+        )
+    }) { map ->
+        map.getValue(Unit)
+    }
+
+internal fun <K : Any, A> switchDeferredImpl(
+    getStorage: suspend EvalScope.() -> Map<K, TFlowImpl<A>>,
+    getPatches: suspend EvalScope.() -> TFlowImpl<Map<K, Maybe<TFlowImpl<A>>>>,
+): TFlowImpl<Map<K, A>> =
+    MuxLifecycle(
+        object : MuxActivator<Map<K, A>> {
+            override suspend fun activate(
+                evalScope: EvalScope,
+                lifecycle: MuxLifecycle<Map<K, A>>,
+            ): MuxNode<*, *, Map<K, A>>? {
+                val storage: Map<K, TFlowImpl<A>> = getStorage(evalScope)
+                // Initialize mux node and switched-in connections.
+                val muxNode =
+                    MuxDeferredNode(lifecycle, this).apply {
+                        storage.mapValuesNotNullParallelTo(switchedIn) { (key, flow) ->
+                            val branchNode = MuxBranchNode(this@apply, key)
+                            flow.activate(evalScope, branchNode.schedulable)?.let {
+                                (conn, needsEval) ->
+                                branchNode
+                                    .apply { upstream = conn }
+                                    .also {
+                                        if (needsEval) {
+                                            val result = conn.getPushEvent(evalScope)
+                                            if (result is Just) {
+                                                upstreamData[key] = result.value
+                                            }
+                                        }
+                                    }
+                            }
+                        }
+                    }
+                // Update depth based on all initial switched-in nodes.
+                muxNode.switchedIn.values.forEach { branch ->
+                    val conn = branch.upstream
+                    if (conn.depthTracker.snapshotIsDirect) {
+                        muxNode.depthTracker.addDirectUpstream(
+                            oldDepth = null,
+                            newDepth = conn.depthTracker.snapshotDirectDepth,
+                        )
+                    } else {
+                        muxNode.depthTracker.addIndirectUpstream(
+                            oldDepth = null,
+                            newDepth = conn.depthTracker.snapshotIndirectDepth,
+                        )
+                        muxNode.depthTracker.updateIndirectRoots(
+                            additions = conn.depthTracker.snapshotIndirectRoots,
+                            butNot = muxNode,
+                        )
+                    }
+                }
+                // We don't have our patches connection established yet, so for now pretend we have
+                // a direct connection to patches. We will update downstream nodes later if this
+                // turns out to be a lie.
+                muxNode.depthTracker.setIsIndirectRoot(true)
+                muxNode.depthTracker.reset()
+
+                // Setup patches connection; deferring allows for a recursive connection, where
+                // muxNode is downstream of itself via patches.
+                var isIndirect = true
+                evalScope.deferAction {
+                    val (patchesConn, needsEval) =
+                        getPatches(evalScope).activate(evalScope, downstream = muxNode.schedulable)
+                            ?: run {
+                                isIndirect = false
+                                // Turns out we can't connect to patches, so update our depth and
+                                // propagate
+                                muxNode.mutex.withLock {
+                                    if (muxNode.depthTracker.setIsIndirectRoot(false)) {
+                                        muxNode.depthTracker.schedule(evalScope.scheduler, muxNode)
+                                    }
+                                }
+                                return@deferAction
+                            }
+                    muxNode.patches = patchesConn
+
+                    if (!patchesConn.schedulerUpstream.depthTracker.snapshotIsDirect) {
+                        // Turns out patches is indirect, so we are not a root. Update depth and
+                        // propagate.
+                        muxNode.mutex.withLock {
+                            if (
+                                muxNode.depthTracker.setIsIndirectRoot(false) or
+                                    muxNode.depthTracker.addIndirectUpstream(
+                                        oldDepth = null,
+                                        newDepth = patchesConn.depthTracker.snapshotIndirectDepth,
+                                    ) or
+                                    muxNode.depthTracker.updateIndirectRoots(
+                                        additions = patchesConn.depthTracker.snapshotIndirectRoots
+                                    )
+                            ) {
+                                muxNode.depthTracker.schedule(evalScope.scheduler, muxNode)
+                            }
+                        }
+                    }
+                    // Schedule mover to process patch emission at the end of this transaction, if
+                    // needed.
+                    if (needsEval) {
+                        val result = patchesConn.getPushEvent(evalScope)
+                        if (result is Just) {
+                            muxNode.patchData = result.value
+                            evalScope.scheduleMuxMover(muxNode)
+                        }
+                    }
+                }
+
+                // Schedule for evaluation if any switched-in nodes have already emitted within
+                // this transaction.
+                if (muxNode.upstreamData.isNotEmpty()) {
+                    evalScope.schedule(muxNode)
+                }
+                return muxNode.takeUnless { muxNode.switchedIn.isEmpty() && !isIndirect }
+            }
+        }
+    )
+
+internal inline fun <A> mergeNodes(
+    crossinline getPulse: suspend EvalScope.() -> TFlowImpl<A>,
+    crossinline getOther: suspend EvalScope.() -> TFlowImpl<A>,
+    crossinline f: suspend EvalScope.(A, A) -> A,
+): TFlowImpl<A> {
+    val merged =
+        mapImpl({ mergeNodes(getPulse, getOther) }) { these ->
+            these.merge { thiz, that -> f(thiz, that) }
+        }
+    return merged.cached()
+}
+
+internal inline fun <A, B> mergeNodes(
+    crossinline getPulse: suspend EvalScope.() -> TFlowImpl<A>,
+    crossinline getOther: suspend EvalScope.() -> TFlowImpl<B>,
+): TFlowImpl<These<A, B>> {
+    val storage =
+        mapOf(
+            0 to mapImpl(getPulse) { These.thiz<A, B>(it) },
+            1 to mapImpl(getOther) { These.that(it) },
+        )
+    val switchNode = switchDeferredImpl(getStorage = { storage }, getPatches = { neverImpl })
+    val merged =
+        mapImpl({ switchNode }) { mergeResults ->
+            val first = mergeResults.getMaybe(0).flatMap { it.maybeThis() }
+            val second = mergeResults.getMaybe(1).flatMap { it.maybeThat() }
+            these(first, second).orElseGet { error("unexpected missing merge result") }
+        }
+    return merged.cached()
+}
+
+internal inline fun <A> mergeNodes(
+    crossinline getPulses: suspend EvalScope.() -> Iterable<TFlowImpl<A>>
+): TFlowImpl<List<A>> {
+    val switchNode =
+        switchDeferredImpl(
+            getStorage = { getPulses().associateByIndexTo(TreeMap()) },
+            getPatches = { neverImpl },
+        )
+    val merged = mapImpl({ switchNode }) { mergeResults -> mergeResults.values.toList() }
+    return merged.cached()
+}
+
+internal inline fun <A> mergeNodesLeft(
+    crossinline getPulses: suspend EvalScope.() -> Iterable<TFlowImpl<A>>
+): TFlowImpl<A> {
+    val switchNode =
+        switchDeferredImpl(
+            getStorage = { getPulses().associateByIndexTo(TreeMap()) },
+            getPatches = { neverImpl },
+        )
+    val merged =
+        mapImpl({ switchNode }) { mergeResults: Map<Int, A> -> mergeResults.values.first() }
+    return merged.cached()
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt
new file mode 100644
index 0000000..cdfafa9
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt
@@ -0,0 +1,472 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.internal.util.Key
+import com.android.systemui.kairos.internal.util.launchImmediate
+import com.android.systemui.kairos.internal.util.mapParallel
+import com.android.systemui.kairos.internal.util.mapValuesNotNullParallelTo
+import com.android.systemui.kairos.util.Just
+import com.android.systemui.kairos.util.Left
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.None
+import com.android.systemui.kairos.util.Right
+import com.android.systemui.kairos.util.filterJust
+import com.android.systemui.kairos.util.map
+import com.android.systemui.kairos.util.partitionEithers
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.async
+import kotlinx.coroutines.awaitAll
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.sync.withLock
+
+internal class MuxPromptMovingNode<K : Any, V>(
+    lifecycle: MuxLifecycle<Pair<Map<K, V>, Map<K, PullNode<V>>?>>,
+    private val spec: MuxActivator<Pair<Map<K, V>, Map<K, PullNode<V>>?>>,
+) :
+    MuxNode<K, V, Pair<Map<K, V>, Map<K, PullNode<V>>?>>(lifecycle),
+    Key<Pair<Map<K, V>, Map<K, PullNode<V>>?>> {
+
+    @Volatile var patchData: Map<K, Maybe<TFlowImpl<V>>>? = null
+    @Volatile var patches: MuxPromptPatchNode<K, V>? = null
+
+    @Volatile private var reEval: Pair<Map<K, V>, Map<K, PullNode<V>>?>? = null
+
+    override fun hasCurrentValueLocked(transactionStore: TransactionStore): Boolean =
+        transactionStore.contains(this)
+
+    override suspend fun hasCurrentValue(transactionStore: TransactionStore): Boolean =
+        mutex.withLock { hasCurrentValueLocked(transactionStore) }
+
+    override suspend fun visit(evalScope: EvalScope) {
+        val preSwitchResults: Map<K, V> = upstreamData.toMap()
+        upstreamData.clear()
+
+        val patch: Map<K, Maybe<TFlowImpl<V>>>? = patchData
+        patchData = null
+
+        val (reschedule, evalResult) =
+            reEval?.let { false to it }
+                ?: if (preSwitchResults.isNotEmpty() || patch?.isNotEmpty() == true) {
+                    doEval(preSwitchResults, patch, evalScope)
+                } else {
+                    false to null
+                }
+        reEval = null
+
+        if (reschedule || depthTracker.dirty_depthIncreased()) {
+            reEval = evalResult
+            // Can't schedule downstream yet, need to compact first
+            if (depthTracker.dirty_depthIncreased()) {
+                depthTracker.schedule(evalScope.compactor, node = this)
+            }
+            evalScope.schedule(this)
+        } else {
+            val compactDownstream = depthTracker.isDirty()
+            if (evalResult != null || compactDownstream) {
+                coroutineScope {
+                    mutex.withLock {
+                        if (compactDownstream) {
+                            adjustDownstreamDepths(evalScope, coroutineScope = this)
+                        }
+                        if (evalResult != null) {
+                            evalScope.setResult(this@MuxPromptMovingNode, evalResult)
+                            if (!scheduleAll(downstreamSet, evalScope)) {
+                                evalScope.scheduleDeactivation(this@MuxPromptMovingNode)
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private suspend fun doEval(
+        preSwitchResults: Map<K, V>,
+        patch: Map<K, Maybe<TFlowImpl<V>>>?,
+        evalScope: EvalScope,
+    ): Pair<Boolean, Pair<Map<K, V>, Map<K, PullNode<V>>?>?> {
+        val newlySwitchedIn: Map<K, PullNode<V>>? =
+            patch?.let {
+                // We have a patch, process additions/updates and removals
+                val (adds, removes) =
+                    patch
+                        .asSequence()
+                        .map { (k, newUpstream: Maybe<TFlowImpl<V>>) ->
+                            when (newUpstream) {
+                                is Just -> Left(k to newUpstream.value)
+                                None -> Right(k)
+                            }
+                        }
+                        .partitionEithers()
+
+                val additionsAndUpdates = mutableMapOf<K, PullNode<V>>()
+                val severed = mutableListOf<NodeConnection<*>>()
+
+                coroutineScope {
+                    // remove and sever
+                    removes.forEach { k ->
+                        switchedIn.remove(k)?.let { branchNode: MuxBranchNode<K, V> ->
+                            val conn: NodeConnection<V> = branchNode.upstream
+                            severed.add(conn)
+                            launchImmediate {
+                                conn.removeDownstream(downstream = branchNode.schedulable)
+                            }
+                            depthTracker.removeDirectUpstream(conn.depthTracker.snapshotDirectDepth)
+                        }
+                    }
+
+                    // add or replace
+                    adds
+                        .mapParallel { (k, newUpstream: TFlowImpl<V>) ->
+                            val branchNode = MuxBranchNode(this@MuxPromptMovingNode, k)
+                            k to
+                                newUpstream.activate(evalScope, branchNode.schedulable)?.let {
+                                    (conn, _) ->
+                                    branchNode.apply { upstream = conn }
+                                }
+                        }
+                        .forEach { (k, newBranch: MuxBranchNode<K, V>?) ->
+                            // remove old and sever, if present
+                            switchedIn.remove(k)?.let { oldBranch: MuxBranchNode<K, V> ->
+                                val conn: NodeConnection<V> = oldBranch.upstream
+                                severed.add(conn)
+                                launchImmediate {
+                                    conn.removeDownstream(downstream = oldBranch.schedulable)
+                                }
+                                depthTracker.removeDirectUpstream(
+                                    conn.depthTracker.snapshotDirectDepth
+                                )
+                            }
+
+                            // add new
+                            newBranch?.let {
+                                switchedIn[k] = newBranch
+                                additionsAndUpdates[k] = newBranch.upstream.directUpstream
+                                val branchDepthTracker = newBranch.upstream.depthTracker
+                                if (branchDepthTracker.snapshotIsDirect) {
+                                    depthTracker.addDirectUpstream(
+                                        oldDepth = null,
+                                        newDepth = branchDepthTracker.snapshotDirectDepth,
+                                    )
+                                } else {
+                                    depthTracker.addIndirectUpstream(
+                                        oldDepth = null,
+                                        newDepth = branchDepthTracker.snapshotIndirectDepth,
+                                    )
+                                    depthTracker.updateIndirectRoots(
+                                        additions = branchDepthTracker.snapshotIndirectRoots,
+                                        butNot = null,
+                                    )
+                                }
+                            }
+                        }
+                }
+
+                coroutineScope {
+                    for (severedNode in severed) {
+                        launch { severedNode.scheduleDeactivationIfNeeded(evalScope) }
+                    }
+                }
+
+                additionsAndUpdates.takeIf { it.isNotEmpty() }
+            }
+
+        return if (preSwitchResults.isNotEmpty() || newlySwitchedIn != null) {
+            (newlySwitchedIn != null) to (preSwitchResults to newlySwitchedIn)
+        } else {
+            false to null
+        }
+    }
+
+    private suspend fun adjustDownstreamDepths(
+        evalScope: EvalScope,
+        coroutineScope: CoroutineScope,
+    ) {
+        if (depthTracker.dirty_depthIncreased()) {
+            // schedule downstream nodes on the compaction scheduler; this scheduler is drained at
+            // the end of this eval depth, so that all depth increases are applied before we advance
+            // the eval step
+            depthTracker.schedule(evalScope.compactor, node = this@MuxPromptMovingNode)
+        } else if (depthTracker.isDirty()) {
+            // schedule downstream nodes on the eval scheduler; this is more efficient and is only
+            // safe if the depth hasn't increased
+            depthTracker.applyChanges(
+                coroutineScope,
+                evalScope.scheduler,
+                downstreamSet,
+                muxNode = this@MuxPromptMovingNode,
+            )
+        }
+    }
+
+    override suspend fun getPushEvent(
+        evalScope: EvalScope
+    ): Maybe<Pair<Map<K, V>, Map<K, PullNode<V>>?>> = evalScope.getCurrentValue(key = this)
+
+    override suspend fun doDeactivate() {
+        // Update lifecycle
+        lifecycle.mutex.withLock {
+            if (lifecycle.lifecycleState !is MuxLifecycleState.Active) return@doDeactivate
+            lifecycle.lifecycleState = MuxLifecycleState.Inactive(spec)
+        }
+        // Process branch nodes
+        switchedIn.values.forEach { branchNode ->
+            branchNode.upstream.removeDownstreamAndDeactivateIfNeeded(
+                downstream = branchNode.schedulable
+            )
+        }
+        // Process patch node
+        patches?.let { patches ->
+            patches.upstream.removeDownstreamAndDeactivateIfNeeded(downstream = patches.schedulable)
+        }
+    }
+
+    suspend fun removeIndirectPatchNode(
+        scheduler: Scheduler,
+        oldDepth: Int,
+        indirectSet: Set<MuxDeferredNode<*, *>>,
+    ) {
+        mutex.withLock {
+            patches = null
+            if (
+                depthTracker.removeIndirectUpstream(oldDepth) or
+                    depthTracker.updateIndirectRoots(removals = indirectSet)
+            ) {
+                depthTracker.schedule(scheduler, this)
+            }
+        }
+    }
+
+    suspend fun removeDirectPatchNode(scheduler: Scheduler, depth: Int) {
+        mutex.withLock {
+            patches = null
+            if (depthTracker.removeDirectUpstream(depth)) {
+                depthTracker.schedule(scheduler, this)
+            }
+        }
+    }
+}
+
+internal class MuxPromptEvalNode<K, V>(
+    private val movingNode: PullNode<Pair<Map<K, V>, Map<K, PullNode<V>>?>>
+) : PullNode<Map<K, V>> {
+    override suspend fun getPushEvent(evalScope: EvalScope): Maybe<Map<K, V>> =
+        movingNode.getPushEvent(evalScope).map { (preSwitchResults, newlySwitchedIn) ->
+            coroutineScope {
+                newlySwitchedIn
+                    ?.map { (k, v) -> async { v.getPushEvent(evalScope).map { k to it } } }
+                    ?.awaitAll()
+                    ?.asSequence()
+                    ?.filterJust()
+                    ?.toMap(preSwitchResults.toMutableMap()) ?: preSwitchResults
+            }
+        }
+}
+
+// TODO: inner class?
+internal class MuxPromptPatchNode<K : Any, V>(private val muxNode: MuxPromptMovingNode<K, V>) :
+    SchedulableNode {
+
+    val schedulable = Schedulable.N(this)
+
+    lateinit var upstream: NodeConnection<Map<K, Maybe<TFlowImpl<V>>>>
+
+    override suspend fun schedule(evalScope: EvalScope) {
+        val upstreamResult = upstream.getPushEvent(evalScope)
+        if (upstreamResult is Just) {
+            muxNode.patchData = upstreamResult.value
+            evalScope.schedule(muxNode)
+        }
+    }
+
+    override suspend fun adjustDirectUpstream(scheduler: Scheduler, oldDepth: Int, newDepth: Int) {
+        muxNode.adjustDirectUpstream(scheduler, oldDepth, newDepth)
+    }
+
+    override suspend fun moveIndirectUpstreamToDirect(
+        scheduler: Scheduler,
+        oldIndirectDepth: Int,
+        oldIndirectSet: Set<MuxDeferredNode<*, *>>,
+        newDirectDepth: Int,
+    ) {
+        muxNode.moveIndirectUpstreamToDirect(
+            scheduler,
+            oldIndirectDepth,
+            oldIndirectSet,
+            newDirectDepth,
+        )
+    }
+
+    override suspend fun adjustIndirectUpstream(
+        scheduler: Scheduler,
+        oldDepth: Int,
+        newDepth: Int,
+        removals: Set<MuxDeferredNode<*, *>>,
+        additions: Set<MuxDeferredNode<*, *>>,
+    ) {
+        muxNode.adjustIndirectUpstream(scheduler, oldDepth, newDepth, removals, additions)
+    }
+
+    override suspend fun moveDirectUpstreamToIndirect(
+        scheduler: Scheduler,
+        oldDirectDepth: Int,
+        newIndirectDepth: Int,
+        newIndirectSet: Set<MuxDeferredNode<*, *>>,
+    ) {
+        muxNode.moveDirectUpstreamToIndirect(
+            scheduler,
+            oldDirectDepth,
+            newIndirectDepth,
+            newIndirectSet,
+        )
+    }
+
+    override suspend fun removeDirectUpstream(scheduler: Scheduler, depth: Int) {
+        muxNode.removeDirectPatchNode(scheduler, depth)
+    }
+
+    override suspend fun removeIndirectUpstream(
+        scheduler: Scheduler,
+        depth: Int,
+        indirectSet: Set<MuxDeferredNode<*, *>>,
+    ) {
+        muxNode.removeIndirectPatchNode(scheduler, depth, indirectSet)
+    }
+}
+
+internal fun <K : Any, A> switchPromptImpl(
+    getStorage: suspend EvalScope.() -> Map<K, TFlowImpl<A>>,
+    getPatches: suspend EvalScope.() -> TFlowImpl<Map<K, Maybe<TFlowImpl<A>>>>,
+): TFlowImpl<Map<K, A>> {
+    val moving =
+        MuxLifecycle(
+            object : MuxActivator<Pair<Map<K, A>, Map<K, PullNode<A>>?>> {
+                override suspend fun activate(
+                    evalScope: EvalScope,
+                    lifecycle: MuxLifecycle<Pair<Map<K, A>, Map<K, PullNode<A>>?>>,
+                ): MuxNode<*, *, Pair<Map<K, A>, Map<K, PullNode<A>>?>>? {
+                    val storage: Map<K, TFlowImpl<A>> = getStorage(evalScope)
+                    // Initialize mux node and switched-in connections.
+                    val movingNode =
+                        MuxPromptMovingNode(lifecycle, this).apply {
+                            coroutineScope {
+                                launch {
+                                    storage.mapValuesNotNullParallelTo(switchedIn) { (key, flow) ->
+                                        val branchNode = MuxBranchNode(this@apply, key)
+                                        flow
+                                            .activate(
+                                                evalScope = evalScope,
+                                                downstream = branchNode.schedulable,
+                                            )
+                                            ?.let { (conn, needsEval) ->
+                                                branchNode
+                                                    .apply { upstream = conn }
+                                                    .also {
+                                                        if (needsEval) {
+                                                            val result =
+                                                                conn.getPushEvent(evalScope)
+                                                            if (result is Just) {
+                                                                upstreamData[key] = result.value
+                                                            }
+                                                        }
+                                                    }
+                                            }
+                                    }
+                                }
+                                // Setup patches connection
+                                val patchNode = MuxPromptPatchNode(this@apply)
+                                getPatches(evalScope)
+                                    .activate(
+                                        evalScope = evalScope,
+                                        downstream = patchNode.schedulable,
+                                    )
+                                    ?.let { (conn, needsEval) ->
+                                        patchNode.upstream = conn
+                                        patches = patchNode
+
+                                        if (needsEval) {
+                                            val result = conn.getPushEvent(evalScope)
+                                            if (result is Just) {
+                                                patchData = result.value
+                                            }
+                                        }
+                                    }
+                            }
+                        }
+                    // Update depth based on all initial switched-in nodes.
+                    movingNode.switchedIn.values.forEach { branch ->
+                        val conn = branch.upstream
+                        if (conn.depthTracker.snapshotIsDirect) {
+                            movingNode.depthTracker.addDirectUpstream(
+                                oldDepth = null,
+                                newDepth = conn.depthTracker.snapshotDirectDepth,
+                            )
+                        } else {
+                            movingNode.depthTracker.addIndirectUpstream(
+                                oldDepth = null,
+                                newDepth = conn.depthTracker.snapshotIndirectDepth,
+                            )
+                            movingNode.depthTracker.updateIndirectRoots(
+                                additions = conn.depthTracker.snapshotIndirectRoots,
+                                butNot = null,
+                            )
+                        }
+                    }
+                    // Update depth based on patches node.
+                    movingNode.patches?.upstream?.let { conn ->
+                        if (conn.depthTracker.snapshotIsDirect) {
+                            movingNode.depthTracker.addDirectUpstream(
+                                oldDepth = null,
+                                newDepth = conn.depthTracker.snapshotDirectDepth,
+                            )
+                        } else {
+                            movingNode.depthTracker.addIndirectUpstream(
+                                oldDepth = null,
+                                newDepth = conn.depthTracker.snapshotIndirectDepth,
+                            )
+                            movingNode.depthTracker.updateIndirectRoots(
+                                additions = conn.depthTracker.snapshotIndirectRoots,
+                                butNot = null,
+                            )
+                        }
+                    }
+                    movingNode.depthTracker.reset()
+
+                    // Schedule for evaluation if any switched-in nodes or the patches node have
+                    // already emitted within this transaction.
+                    if (movingNode.patchData != null || movingNode.upstreamData.isNotEmpty()) {
+                        evalScope.schedule(movingNode)
+                    }
+
+                    return movingNode.takeUnless { it.patches == null && it.switchedIn.isEmpty() }
+                }
+            }
+        )
+
+    val eval = TFlowCheap { downstream ->
+        moving.activate(evalScope = this, downstream)?.let { (connection, needsEval) ->
+            val evalNode = MuxPromptEvalNode(connection.directUpstream)
+            ActivationResult(
+                connection = NodeConnection(evalNode, connection.schedulerUpstream),
+                needsEval = needsEval,
+            )
+        }
+    }
+    return eval.cached()
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt
new file mode 100644
index 0000000..f0df89d
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt
@@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.TState
+import com.android.systemui.kairos.internal.util.HeteroMap
+import com.android.systemui.kairos.util.Just
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.none
+import java.util.concurrent.ConcurrentHashMap
+import java.util.concurrent.ConcurrentLinkedDeque
+import java.util.concurrent.ConcurrentLinkedQueue
+import java.util.concurrent.atomic.AtomicLong
+import kotlin.coroutines.ContinuationInterceptor
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.job
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.sync.Mutex
+import kotlinx.coroutines.sync.withLock
+import kotlinx.coroutines.yield
+
+private val nextNetworkId = AtomicLong()
+
+internal class Network(val coroutineScope: CoroutineScope) : NetworkScope {
+
+    override val networkId: Any = nextNetworkId.getAndIncrement()
+
+    @Volatile
+    override var epoch: Long = 0L
+        private set
+
+    override val network
+        get() = this
+
+    override val compactor = SchedulerImpl()
+    override val scheduler = SchedulerImpl()
+    override val transactionStore = HeteroMap()
+
+    private val stateWrites = ConcurrentLinkedQueue<TStateSource<*>>()
+    private val outputsByDispatcher =
+        ConcurrentHashMap<ContinuationInterceptor, ConcurrentLinkedQueue<Output<*>>>()
+    private val muxMovers = ConcurrentLinkedQueue<MuxDeferredNode<*, *>>()
+    private val deactivations = ConcurrentLinkedDeque<PushNode<*>>()
+    private val outputDeactivations = ConcurrentLinkedQueue<Output<*>>()
+    private val transactionMutex = Mutex()
+    private val inputScheduleChan = Channel<ScheduledAction<*>>()
+
+    override fun scheduleOutput(output: Output<*>) {
+        val continuationInterceptor =
+            output.context[ContinuationInterceptor] ?: Dispatchers.Unconfined
+        outputsByDispatcher
+            .computeIfAbsent(continuationInterceptor) { ConcurrentLinkedQueue() }
+            .add(output)
+    }
+
+    override fun scheduleMuxMover(muxMover: MuxDeferredNode<*, *>) {
+        muxMovers.add(muxMover)
+    }
+
+    override fun schedule(state: TStateSource<*>) {
+        stateWrites.add(state)
+    }
+
+    // TODO: weird that we have this *and* scheduler exposed
+    override suspend fun schedule(node: MuxNode<*, *, *>) {
+        scheduler.schedule(node.depthTracker.dirty_directDepth, node)
+    }
+
+    override fun scheduleDeactivation(node: PushNode<*>) {
+        deactivations.add(node)
+    }
+
+    override fun scheduleDeactivation(output: Output<*>) {
+        outputDeactivations.add(output)
+    }
+
+    /** Listens for external events and starts FRP transactions. Runs forever. */
+    suspend fun runInputScheduler() = coroutineScope {
+        launch { scheduler.activate() }
+        launch { compactor.activate() }
+        val actions = mutableListOf<ScheduledAction<*>>()
+        for (first in inputScheduleChan) {
+            // Drain and conflate all transaction requests into a single transaction
+            actions.add(first)
+            while (true) {
+                yield()
+                val func = inputScheduleChan.tryReceive().getOrNull() ?: break
+                actions.add(func)
+            }
+            transactionMutex.withLock {
+                // Run all actions
+                evalScope {
+                    for (action in actions) {
+                        launch { action.started(evalScope = this@evalScope) }
+                    }
+                }
+                // Step through the network
+                doTransaction()
+                // Signal completion
+                while (actions.isNotEmpty()) {
+                    actions.removeLast().completed()
+                }
+            }
+        }
+    }
+
+    /** Evaluates [block] inside of a new transaction when the network is ready. */
+    fun <R> transaction(block: suspend EvalScope.() -> R): Deferred<R> =
+        CompletableDeferred<R>(parent = coroutineScope.coroutineContext.job).also { onResult ->
+            val job =
+                coroutineScope.launch {
+                    inputScheduleChan.send(
+                        ScheduledAction(onStartTransaction = block, onResult = onResult)
+                    )
+                }
+            onResult.invokeOnCompletion { job.cancel() }
+        }
+
+    suspend fun <R> evalScope(block: suspend EvalScope.() -> R): R = deferScope {
+        block(EvalScopeImpl(this@Network, this))
+    }
+
+    /** Performs a transactional update of the FRP network. */
+    private suspend fun doTransaction() {
+        // Traverse network, then run outputs
+        do {
+            scheduler.drainEval(this)
+        } while (evalScope { evalOutputs(this) })
+        // Update states
+        evalScope { evalStateWriters(this) }
+        transactionStore.clear()
+        // Perform deferred switches
+        evalScope { evalMuxMovers(this) }
+        // Compact depths
+        scheduler.drainCompact()
+        compactor.drainCompact()
+        // Deactivate nodes with no downstream
+        evalDeactivations()
+        epoch++
+    }
+
+    /** Invokes all [Output]s that have received data within this transaction. */
+    private suspend fun evalOutputs(evalScope: EvalScope): Boolean {
+        // Outputs can enqueue other outputs, so we need two loops
+        if (outputsByDispatcher.isEmpty()) return false
+        while (outputsByDispatcher.isNotEmpty()) {
+            var launchedAny = false
+            coroutineScope {
+                for ((key, outputs) in outputsByDispatcher) {
+                    if (outputs.isNotEmpty()) {
+                        launchedAny = true
+                        launch(key) {
+                            while (outputs.isNotEmpty()) {
+                                val output = outputs.remove()
+                                launch { output.visit(evalScope) }
+                            }
+                        }
+                    }
+                }
+            }
+            if (!launchedAny) outputsByDispatcher.clear()
+        }
+        return true
+    }
+
+    private suspend fun evalMuxMovers(evalScope: EvalScope) {
+        while (muxMovers.isNotEmpty()) {
+            coroutineScope {
+                val toMove = muxMovers.remove()
+                launch { toMove.performMove(evalScope) }
+            }
+        }
+    }
+
+    /** Updates all [TState]es that have changed within this transaction. */
+    private suspend fun evalStateWriters(evalScope: EvalScope) {
+        coroutineScope {
+            while (stateWrites.isNotEmpty()) {
+                val latch = stateWrites.remove()
+                launch { latch.updateState(evalScope) }
+            }
+        }
+    }
+
+    private suspend fun evalDeactivations() {
+        coroutineScope {
+            launch {
+                while (deactivations.isNotEmpty()) {
+                    // traverse in reverse order
+                    //   - deactivations are added in depth-order during the node traversal phase
+                    //   - perform deactivations in reverse order, in case later ones propagate to
+                    //     earlier ones
+                    val toDeactivate = deactivations.removeLast()
+                    launch { toDeactivate.deactivateIfNeeded() }
+                }
+            }
+            while (outputDeactivations.isNotEmpty()) {
+                val toDeactivate = outputDeactivations.remove()
+                launch {
+                    toDeactivate.upstream?.removeDownstreamAndDeactivateIfNeeded(
+                        downstream = toDeactivate.schedulable
+                    )
+                }
+            }
+        }
+        check(deactivations.isEmpty()) { "unexpected lingering deactivations" }
+        check(outputDeactivations.isEmpty()) { "unexpected lingering output deactivations" }
+    }
+}
+
+internal class ScheduledAction<T>(
+    private val onResult: CompletableDeferred<T>? = null,
+    private val onStartTransaction: suspend EvalScope.() -> T,
+) {
+    private var result: Maybe<T> = none
+
+    suspend fun started(evalScope: EvalScope) {
+        result = just(onStartTransaction(evalScope))
+    }
+
+    fun completed() {
+        if (onResult != null) {
+            when (val result = result) {
+                is Just -> onResult.complete(result.value)
+                else -> {}
+            }
+        }
+        result = none
+    }
+}
+
+internal typealias TransactionStore = HeteroMap
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/NoScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/NoScope.kt
new file mode 100644
index 0000000..fbd9689
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/NoScope.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.FrpScope
+import kotlin.coroutines.Continuation
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
+import kotlin.coroutines.coroutineContext
+import kotlin.coroutines.startCoroutine
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.completeWith
+import kotlinx.coroutines.job
+
+internal object NoScope {
+    private object FrpScopeImpl : FrpScope
+
+    suspend fun <R> runInFrpScope(block: suspend FrpScope.() -> R): R {
+        val complete = CompletableDeferred<R>(coroutineContext.job)
+        block.startCoroutine(
+            FrpScopeImpl,
+            object : Continuation<R> {
+                override val context: CoroutineContext
+                    get() = EmptyCoroutineContext
+
+                override fun resumeWith(result: Result<R>) {
+                    complete.completeWith(result)
+                }
+            },
+        )
+        return complete.await()
+    }
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/NodeTypes.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/NodeTypes.kt
new file mode 100644
index 0000000..0002407
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/NodeTypes.kt
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.util.Maybe
+
+/*
+Dmux
+Muxes + Branch
+*/
+internal sealed interface SchedulableNode {
+    /** schedule this node w/ given NodeEvalScope */
+    suspend fun schedule(evalScope: EvalScope)
+
+    suspend fun adjustDirectUpstream(scheduler: Scheduler, oldDepth: Int, newDepth: Int)
+
+    suspend fun moveIndirectUpstreamToDirect(
+        scheduler: Scheduler,
+        oldIndirectDepth: Int,
+        oldIndirectSet: Set<MuxDeferredNode<*, *>>,
+        newDirectDepth: Int,
+    )
+
+    suspend fun adjustIndirectUpstream(
+        scheduler: Scheduler,
+        oldDepth: Int,
+        newDepth: Int,
+        removals: Set<MuxDeferredNode<*, *>>,
+        additions: Set<MuxDeferredNode<*, *>>,
+    )
+
+    suspend fun moveDirectUpstreamToIndirect(
+        scheduler: Scheduler,
+        oldDirectDepth: Int,
+        newIndirectDepth: Int,
+        newIndirectSet: Set<MuxDeferredNode<*, *>>,
+    )
+
+    suspend fun removeIndirectUpstream(
+        scheduler: Scheduler,
+        depth: Int,
+        indirectSet: Set<MuxDeferredNode<*, *>>,
+    )
+
+    suspend fun removeDirectUpstream(scheduler: Scheduler, depth: Int)
+}
+
+/*
+All but Dmux
+ */
+internal sealed interface PullNode<out A> {
+    /**
+     * query the result of this node within the current transaction. if the node is cached, this
+     * will read from the cache, otherwise it will perform a full evaluation, even if invoked
+     * multiple times within a transaction.
+     */
+    suspend fun getPushEvent(evalScope: EvalScope): Maybe<A>
+}
+
+/*
+Muxes + DmuxBranch
+ */
+internal sealed interface PushNode<A> : PullNode<A> {
+
+    suspend fun hasCurrentValue(transactionStore: TransactionStore): Boolean
+
+    val depthTracker: DepthTracker
+
+    suspend fun removeDownstream(downstream: Schedulable)
+
+    /** called during cleanup phase */
+    suspend fun deactivateIfNeeded()
+
+    /** called from mux nodes after severs */
+    suspend fun scheduleDeactivationIfNeeded(evalScope: EvalScope)
+
+    suspend fun addDownstream(downstream: Schedulable)
+
+    suspend fun removeDownstreamAndDeactivateIfNeeded(downstream: Schedulable)
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Output.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Output.kt
new file mode 100644
index 0000000..a3af2d3
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Output.kt
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.util.Just
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
+
+internal class Output<A>(
+    val context: CoroutineContext = EmptyCoroutineContext,
+    val onDeath: suspend () -> Unit = {},
+    val onEmit: suspend EvalScope.(A) -> Unit,
+) {
+
+    val schedulable = Schedulable.O(this)
+
+    @Volatile var upstream: NodeConnection<A>? = null
+    @Volatile var result: Any? = NoResult
+
+    private object NoResult
+
+    // invoked by network
+    suspend fun visit(evalScope: EvalScope) {
+        val upstreamResult = result
+        check(upstreamResult !== NoResult) { "output visited with null upstream result" }
+        result = null
+        @Suppress("UNCHECKED_CAST") evalScope.onEmit(upstreamResult as A)
+    }
+
+    suspend fun kill() {
+        onDeath()
+    }
+
+    suspend fun schedule(evalScope: EvalScope) {
+        val upstreamResult =
+            checkNotNull(upstream) { "output scheduled with null upstream" }.getPushEvent(evalScope)
+        if (upstreamResult is Just) {
+            result = upstreamResult.value
+            evalScope.scheduleOutput(this)
+        }
+    }
+}
+
+internal inline fun OneShot(crossinline onEmit: suspend EvalScope.() -> Unit): Output<Unit> =
+    Output<Unit>(onEmit = { onEmit() }).apply { result = Unit }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/PullNodes.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/PullNodes.kt
new file mode 100644
index 0000000..dac98e0
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/PullNodes.kt
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.internal.util.Key
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.map
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.Deferred
+
+internal val neverImpl: TFlowImpl<Nothing> = TFlowCheap { null }
+
+internal class MapNode<A, B>(val upstream: PullNode<A>, val transform: suspend EvalScope.(A) -> B) :
+    PullNode<B> {
+    override suspend fun getPushEvent(evalScope: EvalScope): Maybe<B> =
+        upstream.getPushEvent(evalScope).map { evalScope.transform(it) }
+}
+
+internal inline fun <A, B> mapImpl(
+    crossinline upstream: suspend EvalScope.() -> TFlowImpl<A>,
+    noinline transform: suspend EvalScope.(A) -> B,
+): TFlowImpl<B> = TFlowCheap { downstream ->
+    upstream().activate(evalScope = this, downstream)?.let { (connection, needsEval) ->
+        ActivationResult(
+            connection =
+                NodeConnection(
+                    directUpstream = MapNode(connection.directUpstream, transform),
+                    schedulerUpstream = connection.schedulerUpstream,
+                ),
+            needsEval = needsEval,
+        )
+    }
+}
+
+internal class CachedNode<A>(val key: Key<Deferred<Maybe<A>>>, val upstream: PullNode<A>) :
+    PullNode<A> {
+    override suspend fun getPushEvent(evalScope: EvalScope): Maybe<A> {
+        val deferred =
+            evalScope.transactionStore.getOrPut(key) {
+                evalScope.deferAsync(CoroutineStart.LAZY) { upstream.getPushEvent(evalScope) }
+            }
+        return deferred.await()
+    }
+}
+
+internal fun <A> TFlowImpl<A>.cached(): TFlowImpl<A> {
+    val key = object : Key<Deferred<Maybe<A>>> {}
+    return TFlowCheap {
+        activate(this, it)?.let { (connection, needsEval) ->
+            ActivationResult(
+                connection =
+                    NodeConnection(
+                        directUpstream = CachedNode(key, connection.directUpstream),
+                        schedulerUpstream = connection.schedulerUpstream,
+                    ),
+                needsEval = needsEval,
+            )
+        }
+    }
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Scheduler.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Scheduler.kt
new file mode 100644
index 0000000..872fb7a
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Scheduler.kt
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.kairos.internal
+
+import java.util.concurrent.ConcurrentHashMap
+import java.util.concurrent.PriorityBlockingQueue
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.launch
+
+internal interface Scheduler {
+    suspend fun schedule(depth: Int, node: MuxNode<*, *, *>)
+
+    suspend fun scheduleIndirect(indirectDepth: Int, node: MuxNode<*, *, *>)
+}
+
+internal class SchedulerImpl : Scheduler {
+    val enqueued = ConcurrentHashMap<MuxNode<*, *, *>, Any>()
+    val scheduledQ = PriorityBlockingQueue<Pair<Int, MuxNode<*, *, *>>>(16, compareBy { it.first })
+    val chan = Channel<Pair<Int, MuxNode<*, *, *>>>(Channel.UNLIMITED)
+
+    override suspend fun schedule(depth: Int, node: MuxNode<*, *, *>) {
+        if (enqueued.putIfAbsent(node, node) == null) {
+            chan.send(Pair(depth, node))
+        }
+    }
+
+    override suspend fun scheduleIndirect(indirectDepth: Int, node: MuxNode<*, *, *>) {
+        schedule(Int.MIN_VALUE + indirectDepth, node)
+    }
+
+    suspend fun activate() {
+        for (nodeSchedule in chan) {
+            scheduledQ.add(nodeSchedule)
+            drainChan()
+        }
+    }
+
+    internal suspend fun drainEval(network: Network) {
+        drain { runStep ->
+            runStep { muxNode -> network.evalScope { muxNode.visit(this) } }
+            // If any visited MuxPromptNodes had their depths increased, eagerly propagate those
+            // depth
+            // changes now before performing further network evaluation.
+            network.compactor.drainCompact()
+        }
+    }
+
+    internal suspend fun drainCompact() {
+        drain { runStep -> runStep { muxNode -> muxNode.visitCompact(scheduler = this) } }
+    }
+
+    private suspend inline fun drain(
+        crossinline onStep:
+            suspend (runStep: suspend (visit: suspend (MuxNode<*, *, *>) -> Unit) -> Unit) -> Unit
+    ): Unit = coroutineScope {
+        while (!chan.isEmpty || scheduledQ.isNotEmpty()) {
+            drainChan()
+            val maxDepth = scheduledQ.peek()?.first ?: error("Unexpected empty scheduler")
+            onStep { visit -> runStep(maxDepth, visit) }
+        }
+    }
+
+    private suspend fun drainChan() {
+        while (!chan.isEmpty) {
+            scheduledQ.add(chan.receive())
+        }
+    }
+
+    private suspend inline fun runStep(
+        maxDepth: Int,
+        crossinline visit: suspend (MuxNode<*, *, *>) -> Unit,
+    ) = coroutineScope {
+        while (scheduledQ.peek()?.first?.let { it <= maxDepth } == true) {
+            val (d, node) = scheduledQ.remove()
+            if (
+                node.depthTracker.dirty_hasDirectUpstream() &&
+                    d < node.depthTracker.dirty_directDepth
+            ) {
+                scheduledQ.add(node.depthTracker.dirty_directDepth to node)
+            } else {
+                launch {
+                    enqueued.remove(node)
+                    visit(node)
+                }
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/StateScopeImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/StateScopeImpl.kt
new file mode 100644
index 0000000..baf4101
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/StateScopeImpl.kt
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.FrpDeferredValue
+import com.android.systemui.kairos.FrpStateScope
+import com.android.systemui.kairos.FrpStateful
+import com.android.systemui.kairos.FrpTransactionScope
+import com.android.systemui.kairos.GroupedTFlow
+import com.android.systemui.kairos.TFlow
+import com.android.systemui.kairos.TFlowInit
+import com.android.systemui.kairos.TFlowLoop
+import com.android.systemui.kairos.TState
+import com.android.systemui.kairos.TStateInit
+import com.android.systemui.kairos.emptyTFlow
+import com.android.systemui.kairos.groupByKey
+import com.android.systemui.kairos.init
+import com.android.systemui.kairos.internal.util.mapValuesParallel
+import com.android.systemui.kairos.mapCheap
+import com.android.systemui.kairos.merge
+import com.android.systemui.kairos.switch
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.map
+import kotlin.coroutines.Continuation
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
+import kotlin.coroutines.startCoroutine
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.completeWith
+import kotlinx.coroutines.job
+
+internal class StateScopeImpl(val evalScope: EvalScope, override val endSignal: TFlow<Any>) :
+    StateScope, EvalScope by evalScope {
+
+    private val endSignalOnce: TFlow<Any> = endSignal.nextOnlyInternal("StateScope.endSignal")
+
+    private fun <A> TFlow<A>.truncateToScope(operatorName: String): TFlow<A> =
+        if (endSignalOnce === emptyTFlow) {
+            this
+        } else {
+            endSignalOnce.mapCheap { emptyTFlow }.toTStateInternal(operatorName, this).switch()
+        }
+
+    private fun <A> TFlow<A>.nextOnlyInternal(operatorName: String): TFlow<A> =
+        if (this === emptyTFlow) {
+            this
+        } else {
+            TFlowLoop<A>().apply {
+                loopback =
+                    mapCheap { emptyTFlow }
+                        .toTStateInternal(operatorName, this@nextOnlyInternal)
+                        .switch()
+            }
+        }
+
+    private fun <A> TFlow<A>.toTStateInternal(operatorName: String, init: A): TState<A> =
+        toTStateInternalDeferred(operatorName, CompletableDeferred(init))
+
+    private fun <A> TFlow<A>.toTStateInternalDeferred(
+        operatorName: String,
+        init: Deferred<A>,
+    ): TState<A> {
+        val changes = this@toTStateInternalDeferred
+        val name = operatorName
+        val impl =
+            mkState(name, operatorName, evalScope, { changes.init.connect(evalScope = this) }, init)
+        return TStateInit(constInit(name, impl))
+    }
+
+    private fun <R> deferredInternal(block: suspend FrpStateScope.() -> R): FrpDeferredValue<R> =
+        FrpDeferredValue(deferAsync { runInStateScope(block) })
+
+    private fun <A> TFlow<A>.toTStateDeferredInternal(
+        initialValue: FrpDeferredValue<A>
+    ): TState<A> {
+        val operatorName = "toTStateDeferred"
+        // Ensure state is only collected until the end of this scope
+        return truncateToScope(operatorName)
+            .toTStateInternalDeferred(operatorName, initialValue.unwrapped)
+    }
+
+    private fun <K : Any, V> TFlow<Map<K, Maybe<TFlow<V>>>>.mergeIncrementallyInternal(
+        storage: TState<Map<K, TFlow<V>>>
+    ): TFlow<Map<K, V>> {
+        val name = "mergeIncrementally"
+        return TFlowInit(
+            constInit(
+                name,
+                switchDeferredImpl(
+                    getStorage = {
+                        storage.init
+                            .connect(this)
+                            .getCurrentWithEpoch(this)
+                            .first
+                            .mapValuesParallel { (_, flow) -> flow.init.connect(this) }
+                    },
+                    getPatches = {
+                        mapImpl({ init.connect(this) }) { patch ->
+                            patch.mapValuesParallel { (_, m) ->
+                                m.map { flow -> flow.init.connect(this) }
+                            }
+                        }
+                    },
+                ),
+            )
+        )
+    }
+
+    private fun <K : Any, V> TFlow<Map<K, Maybe<TFlow<V>>>>.mergeIncrementallyPromptInternal(
+        storage: TState<Map<K, TFlow<V>>>
+    ): TFlow<Map<K, V>> {
+        val name = "mergeIncrementallyPrompt"
+        return TFlowInit(
+            constInit(
+                name,
+                switchPromptImpl(
+                    getStorage = {
+                        storage.init
+                            .connect(this)
+                            .getCurrentWithEpoch(this)
+                            .first
+                            .mapValuesParallel { (_, flow) -> flow.init.connect(this) }
+                    },
+                    getPatches = {
+                        mapImpl({ init.connect(this) }) { patch ->
+                            patch.mapValuesParallel { (_, m) ->
+                                m.map { flow -> flow.init.connect(this) }
+                            }
+                        }
+                    },
+                ),
+            )
+        )
+    }
+
+    private fun <K, A, B> TFlow<Map<K, Maybe<FrpStateful<A>>>>.applyLatestStatefulForKeyInternal(
+        init: FrpDeferredValue<Map<K, FrpStateful<B>>>,
+        numKeys: Int?,
+    ): Pair<TFlow<Map<K, Maybe<A>>>, FrpDeferredValue<Map<K, B>>> {
+        val eventsByKey: GroupedTFlow<K, Maybe<FrpStateful<A>>> = groupByKey(numKeys)
+        val initOut: Deferred<Map<K, B>> = deferAsync {
+            init.unwrapped.await().mapValuesParallel { (k, stateful) ->
+                val newEnd = with(frpScope) { eventsByKey[k].skipNext() }
+                val newScope = childStateScope(newEnd)
+                newScope.runInStateScope(stateful)
+            }
+        }
+        val changesNode: TFlowImpl<Map<K, Maybe<A>>> =
+            mapImpl(
+                upstream = { this@applyLatestStatefulForKeyInternal.init.connect(evalScope = this) }
+            ) { upstreamMap ->
+                upstreamMap.mapValuesParallel { (k: K, ma: Maybe<FrpStateful<A>>) ->
+                    reenterStateScope(this@StateScopeImpl).run {
+                        ma.map { stateful ->
+                            val newEnd = with(frpScope) { eventsByKey[k].skipNext() }
+                            val newScope = childStateScope(newEnd)
+                            newScope.runInStateScope(stateful)
+                        }
+                    }
+                }
+            }
+        val operatorName = "applyLatestStatefulForKey"
+        val name = operatorName
+        val changes: TFlow<Map<K, Maybe<A>>> = TFlowInit(constInit(name, changesNode.cached()))
+        return changes to FrpDeferredValue(initOut)
+    }
+
+    private fun <A> TFlow<FrpStateful<A>>.observeStatefulsInternal(): TFlow<A> {
+        val operatorName = "observeStatefuls"
+        val name = operatorName
+        return TFlowInit(
+            constInit(
+                name,
+                mapImpl(
+                        upstream = { this@observeStatefulsInternal.init.connect(evalScope = this) }
+                    ) { stateful ->
+                        reenterStateScope(outerScope = this@StateScopeImpl)
+                            .runInStateScope(stateful)
+                    }
+                    .cached(),
+            )
+        )
+    }
+
+    override val frpScope: FrpStateScope = FrpStateScopeImpl()
+
+    private inner class FrpStateScopeImpl :
+        FrpStateScope, FrpTransactionScope by evalScope.frpScope {
+
+        override fun <A> deferredStateScope(
+            block: suspend FrpStateScope.() -> A
+        ): FrpDeferredValue<A> = deferredInternal(block)
+
+        override fun <A> TFlow<A>.holdDeferred(initialValue: FrpDeferredValue<A>): TState<A> =
+            toTStateDeferredInternal(initialValue)
+
+        override fun <K : Any, V> TFlow<Map<K, Maybe<TFlow<V>>>>.mergeIncrementally(
+            initialTFlows: FrpDeferredValue<Map<K, TFlow<V>>>
+        ): TFlow<Map<K, V>> {
+            val storage: TState<Map<K, TFlow<V>>> = foldMapIncrementally(initialTFlows)
+            return mergeIncrementallyInternal(storage)
+        }
+
+        override fun <K : Any, V> TFlow<Map<K, Maybe<TFlow<V>>>>.mergeIncrementallyPromptly(
+            initialTFlows: FrpDeferredValue<Map<K, TFlow<V>>>
+        ): TFlow<Map<K, V>> {
+            val storage: TState<Map<K, TFlow<V>>> = foldMapIncrementally(initialTFlows)
+            return mergeIncrementallyPromptInternal(storage)
+        }
+
+        override fun <K, A, B> TFlow<Map<K, Maybe<FrpStateful<A>>>>.applyLatestStatefulForKey(
+            init: FrpDeferredValue<Map<K, FrpStateful<B>>>,
+            numKeys: Int?,
+        ): Pair<TFlow<Map<K, Maybe<A>>>, FrpDeferredValue<Map<K, B>>> =
+            applyLatestStatefulForKeyInternal(init, numKeys)
+
+        override fun <A> TFlow<FrpStateful<A>>.applyStatefuls(): TFlow<A> =
+            observeStatefulsInternal()
+    }
+
+    override suspend fun <R> runInStateScope(block: suspend FrpStateScope.() -> R): R {
+        val complete = CompletableDeferred<R>(parent = coroutineContext.job)
+        block.startCoroutine(
+            frpScope,
+            object : Continuation<R> {
+                override val context: CoroutineContext
+                    get() = EmptyCoroutineContext
+
+                override fun resumeWith(result: Result<R>) {
+                    complete.completeWith(result)
+                }
+            },
+        )
+        return complete.await()
+    }
+
+    override fun childStateScope(newEnd: TFlow<Any>) =
+        StateScopeImpl(evalScope, merge(newEnd, endSignal))
+}
+
+private fun EvalScope.reenterStateScope(outerScope: StateScopeImpl) =
+    StateScopeImpl(evalScope = this, endSignal = outerScope.endSignal)
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TFlowImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TFlowImpl.kt
new file mode 100644
index 0000000..b904b48
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TFlowImpl.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.util.Maybe
+
+/* Initialized TFlow */
+internal fun interface TFlowImpl<out A> {
+    suspend fun activate(evalScope: EvalScope, downstream: Schedulable): ActivationResult<A>?
+}
+
+internal data class ActivationResult<out A>(
+    val connection: NodeConnection<A>,
+    val needsEval: Boolean,
+)
+
+internal inline fun <A> TFlowCheap(crossinline cheap: CheapNodeSubscribe<A>) =
+    TFlowImpl { scope, ds ->
+        scope.cheap(ds)
+    }
+
+internal typealias CheapNodeSubscribe<A> =
+    suspend EvalScope.(downstream: Schedulable) -> ActivationResult<A>?
+
+internal data class NodeConnection<out A>(
+    val directUpstream: PullNode<A>,
+    val schedulerUpstream: PushNode<*>,
+)
+
+internal suspend fun <A> NodeConnection<A>.hasCurrentValue(
+    transactionStore: TransactionStore
+): Boolean = schedulerUpstream.hasCurrentValue(transactionStore)
+
+internal suspend fun <A> NodeConnection<A>.removeDownstreamAndDeactivateIfNeeded(
+    downstream: Schedulable
+) = schedulerUpstream.removeDownstreamAndDeactivateIfNeeded(downstream)
+
+internal suspend fun <A> NodeConnection<A>.scheduleDeactivationIfNeeded(evalScope: EvalScope) =
+    schedulerUpstream.scheduleDeactivationIfNeeded(evalScope)
+
+internal suspend fun <A> NodeConnection<A>.removeDownstream(downstream: Schedulable) =
+    schedulerUpstream.removeDownstream(downstream)
+
+internal suspend fun <A> NodeConnection<A>.getPushEvent(evalScope: EvalScope): Maybe<A> =
+    directUpstream.getPushEvent(evalScope)
+
+internal val <A> NodeConnection<A>.depthTracker: DepthTracker
+    get() = schedulerUpstream.depthTracker
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TStateImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TStateImpl.kt
new file mode 100644
index 0000000..5cec05c
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TStateImpl.kt
@@ -0,0 +1,377 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.internal.util.Key
+import com.android.systemui.kairos.internal.util.associateByIndex
+import com.android.systemui.kairos.internal.util.hashString
+import com.android.systemui.kairos.internal.util.mapValuesParallel
+import com.android.systemui.kairos.util.Just
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.none
+import java.util.concurrent.atomic.AtomicLong
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+internal sealed interface TStateImpl<out A> {
+    val name: String?
+    val operatorName: String
+    val changes: TFlowImpl<A>
+
+    suspend fun getCurrentWithEpoch(evalScope: EvalScope): Pair<A, Long>
+}
+
+internal sealed class TStateDerived<A>(override val changes: TFlowImpl<A>) :
+    TStateImpl<A>, Key<Deferred<Pair<A, Long>>> {
+
+    @Volatile
+    var invalidatedEpoch = Long.MIN_VALUE
+        private set
+
+    @Volatile
+    protected var cache: Any? = EmptyCache
+        private set
+
+    override suspend fun getCurrentWithEpoch(evalScope: EvalScope): Pair<A, Long> =
+        evalScope.transactionStore
+            .getOrPut(this) { evalScope.deferAsync(CoroutineStart.LAZY) { pull(evalScope) } }
+            .await()
+
+    suspend fun pull(evalScope: EvalScope): Pair<A, Long> {
+        @Suppress("UNCHECKED_CAST")
+        return recalc(evalScope)?.also { (a, epoch) -> setCache(a, epoch) }
+            ?: ((cache as A) to invalidatedEpoch)
+    }
+
+    fun setCache(value: A, epoch: Long) {
+        if (epoch > invalidatedEpoch) {
+            cache = value
+            invalidatedEpoch = epoch
+        }
+    }
+
+    fun getCachedUnsafe(): Maybe<A> {
+        @Suppress("UNCHECKED_CAST")
+        return if (cache == EmptyCache) none else just(cache as A)
+    }
+
+    protected abstract suspend fun recalc(evalScope: EvalScope): Pair<A, Long>?
+
+    private data object EmptyCache
+}
+
+internal class TStateSource<A>(
+    override val name: String?,
+    override val operatorName: String,
+    init: Deferred<A>,
+    override val changes: TFlowImpl<A>,
+) : TStateImpl<A> {
+    constructor(
+        name: String?,
+        operatorName: String,
+        init: A,
+        changes: TFlowImpl<A>,
+    ) : this(name, operatorName, CompletableDeferred(init), changes)
+
+    lateinit var upstreamConnection: NodeConnection<A>
+
+    // Note: Don't need to synchronize; we will never interleave reads and writes, since all writes
+    // are performed at the end of a network step, after any reads would have taken place.
+
+    @Volatile private var _current: Deferred<A> = init
+    @Volatile
+    var writeEpoch = 0L
+        private set
+
+    override suspend fun getCurrentWithEpoch(evalScope: EvalScope): Pair<A, Long> =
+        _current.await() to writeEpoch
+
+    /** called by network after eval phase has completed */
+    suspend fun updateState(evalScope: EvalScope) {
+        // write the latch
+        val eventResult = upstreamConnection.getPushEvent(evalScope)
+        if (eventResult is Just) {
+            _current = CompletableDeferred(eventResult.value)
+            writeEpoch = evalScope.epoch
+        }
+    }
+
+    override fun toString(): String = "TStateImpl(changes=$changes, current=$_current)"
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    fun getStorageUnsafe(): Maybe<A> =
+        if (_current.isCompleted) just(_current.getCompleted()) else none
+}
+
+internal fun <A> constS(name: String?, operatorName: String, init: A): TStateImpl<A> =
+    TStateSource(name, operatorName, init, neverImpl)
+
+internal inline fun <A> mkState(
+    name: String?,
+    operatorName: String,
+    evalScope: EvalScope,
+    crossinline getChanges: suspend EvalScope.() -> TFlowImpl<A>,
+    init: Deferred<A>,
+): TStateImpl<A> {
+    lateinit var state: TStateSource<A>
+    val calm: TFlowImpl<A> =
+        filterNode(getChanges) { new -> new != state.getCurrentWithEpoch(evalScope = this).first }
+            .cached()
+    return TStateSource(name, operatorName, init, calm).also {
+        state = it
+        evalScope.scheduleOutput(
+            OneShot {
+                calm.activate(evalScope = this, downstream = Schedulable.S(state))?.let {
+                    (connection, needsEval) ->
+                    state.upstreamConnection = connection
+                    if (needsEval) {
+                        schedule(state)
+                    }
+                }
+            }
+        )
+    }
+}
+
+private inline fun <A> TFlowImpl<A>.calm(
+    crossinline getState: () -> TStateDerived<A>
+): TFlowImpl<A> =
+    filterNode({ this@calm }) { new ->
+            val state = getState()
+            val (current, _) = state.getCurrentWithEpoch(evalScope = this)
+            if (new != current) {
+                state.setCache(new, epoch)
+                true
+            } else {
+                false
+            }
+        }
+        .cached()
+
+internal fun <A, B> TStateImpl<A>.mapCheap(
+    name: String?,
+    operatorName: String,
+    transform: suspend EvalScope.(A) -> B,
+): TStateImpl<B> =
+    DerivedMapCheap(name, operatorName, this, mapImpl({ changes }) { transform(it) }, transform)
+
+internal class DerivedMapCheap<A, B>(
+    override val name: String?,
+    override val operatorName: String,
+    val upstream: TStateImpl<A>,
+    override val changes: TFlowImpl<B>,
+    private val transform: suspend EvalScope.(A) -> B,
+) : TStateImpl<B> {
+
+    override suspend fun getCurrentWithEpoch(evalScope: EvalScope): Pair<B, Long> {
+        val (a, epoch) = upstream.getCurrentWithEpoch(evalScope)
+        return evalScope.transform(a) to epoch
+    }
+
+    override fun toString(): String = "${this::class.simpleName}@$hashString"
+}
+
+internal fun <A, B> TStateImpl<A>.map(
+    name: String?,
+    operatorName: String,
+    transform: suspend EvalScope.(A) -> B,
+): TStateImpl<B> {
+    lateinit var state: TStateDerived<B>
+    val mappedChanges = mapImpl({ changes }) { transform(it) }.cached().calm { state }
+    state = DerivedMap(name, operatorName, transform, this, mappedChanges)
+    return state
+}
+
+internal class DerivedMap<A, B>(
+    override val name: String?,
+    override val operatorName: String,
+    private val transform: suspend EvalScope.(A) -> B,
+    val upstream: TStateImpl<A>,
+    changes: TFlowImpl<B>,
+) : TStateDerived<B>(changes) {
+    override fun toString(): String = "${this::class.simpleName}@$hashString"
+
+    override suspend fun recalc(evalScope: EvalScope): Pair<B, Long>? {
+        val (a, epoch) = upstream.getCurrentWithEpoch(evalScope)
+        return if (epoch > invalidatedEpoch) {
+            evalScope.transform(a) to epoch
+        } else {
+            null
+        }
+    }
+}
+
+internal fun <A> TStateImpl<TStateImpl<A>>.flatten(name: String?, operator: String): TStateImpl<A> {
+    // emits the current value of the new inner state, when that state is emitted
+    val switchEvents = mapImpl({ changes }) { newInner -> newInner.getCurrentWithEpoch(this).first }
+    // emits the new value of the new inner state when that state is emitted, or
+    // falls back to the current value if a new state is *not* being emitted this
+    // transaction
+    val innerChanges =
+        mapImpl({ changes }) { newInner ->
+            mergeNodes({ switchEvents }, { newInner.changes }) { _, new -> new }
+        }
+    val switchedChanges: TFlowImpl<A> =
+        mapImpl({
+            switchPromptImpl(
+                getStorage = {
+                    mapOf(Unit to this@flatten.getCurrentWithEpoch(evalScope = this).first.changes)
+                },
+                getPatches = { mapImpl({ innerChanges }) { new -> mapOf(Unit to just(new)) } },
+            )
+        }) { map ->
+            map.getValue(Unit)
+        }
+    lateinit var state: DerivedFlatten<A>
+    state = DerivedFlatten(name, operator, this, switchedChanges.calm { state })
+    return state
+}
+
+internal class DerivedFlatten<A>(
+    override val name: String?,
+    override val operatorName: String,
+    val upstream: TStateImpl<TStateImpl<A>>,
+    changes: TFlowImpl<A>,
+) : TStateDerived<A>(changes) {
+    override suspend fun recalc(evalScope: EvalScope): Pair<A, Long> {
+        val (inner, epoch0) = upstream.getCurrentWithEpoch(evalScope)
+        val (a, epoch1) = inner.getCurrentWithEpoch(evalScope)
+        return a to maxOf(epoch0, epoch1)
+    }
+
+    override fun toString(): String = "${this::class.simpleName}@$hashString"
+}
+
+@Suppress("NOTHING_TO_INLINE")
+internal inline fun <A, B> TStateImpl<A>.flatMap(
+    name: String?,
+    operatorName: String,
+    noinline transform: suspend EvalScope.(A) -> TStateImpl<B>,
+): TStateImpl<B> = map(null, operatorName, transform).flatten(name, operatorName)
+
+internal fun <A, B, Z> zipStates(
+    name: String?,
+    operatorName: String,
+    l1: TStateImpl<A>,
+    l2: TStateImpl<B>,
+    transform: suspend EvalScope.(A, B) -> Z,
+): TStateImpl<Z> =
+    zipStates(null, operatorName, mapOf(0 to l1, 1 to l2)).map(name, operatorName) {
+        val a = it.getValue(0)
+        val b = it.getValue(1)
+        @Suppress("UNCHECKED_CAST") transform(a as A, b as B)
+    }
+
+internal fun <A, B, C, Z> zipStates(
+    name: String?,
+    operatorName: String,
+    l1: TStateImpl<A>,
+    l2: TStateImpl<B>,
+    l3: TStateImpl<C>,
+    transform: suspend EvalScope.(A, B, C) -> Z,
+): TStateImpl<Z> =
+    zipStates(null, operatorName, mapOf(0 to l1, 1 to l2, 2 to l3)).map(name, operatorName) {
+        val a = it.getValue(0)
+        val b = it.getValue(1)
+        val c = it.getValue(2)
+        @Suppress("UNCHECKED_CAST") transform(a as A, b as B, c as C)
+    }
+
+internal fun <A, B, C, D, Z> zipStates(
+    name: String?,
+    operatorName: String,
+    l1: TStateImpl<A>,
+    l2: TStateImpl<B>,
+    l3: TStateImpl<C>,
+    l4: TStateImpl<D>,
+    transform: suspend EvalScope.(A, B, C, D) -> Z,
+): TStateImpl<Z> =
+    zipStates(null, operatorName, mapOf(0 to l1, 1 to l2, 2 to l3, 3 to l4)).map(
+        name,
+        operatorName,
+    ) {
+        val a = it.getValue(0)
+        val b = it.getValue(1)
+        val c = it.getValue(2)
+        val d = it.getValue(3)
+        @Suppress("UNCHECKED_CAST") transform(a as A, b as B, c as C, d as D)
+    }
+
+internal fun <K : Any, A> zipStates(
+    name: String?,
+    operatorName: String,
+    states: Map<K, TStateImpl<A>>,
+): TStateImpl<Map<K, A>> {
+    if (states.isEmpty()) return constS(name, operatorName, emptyMap())
+    val stateChanges: Map<K, TFlowImpl<A>> = states.mapValues { it.value.changes }
+    lateinit var state: DerivedZipped<K, A>
+    // No need for calm; invariant ensures that changes will only emit when there's a difference
+    val changes: TFlowImpl<Map<K, A>> =
+        mapImpl({
+            switchDeferredImpl(getStorage = { stateChanges }, getPatches = { neverImpl })
+        }) { patch ->
+            states
+                .mapValues { (k, v) ->
+                    if (k in patch) {
+                        patch.getValue(k)
+                    } else {
+                        v.getCurrentWithEpoch(evalScope = this).first
+                    }
+                }
+                .also { state.setCache(it, epoch) }
+        }
+    state = DerivedZipped(name, operatorName, states, changes)
+    return state
+}
+
+internal class DerivedZipped<K : Any, A>(
+    override val name: String?,
+    override val operatorName: String,
+    val upstream: Map<K, TStateImpl<A>>,
+    changes: TFlowImpl<Map<K, A>>,
+) : TStateDerived<Map<K, A>>(changes) {
+    override suspend fun recalc(evalScope: EvalScope): Pair<Map<K, A>, Long> {
+        val newEpoch = AtomicLong()
+        return upstream.mapValuesParallel {
+            val (a, epoch) = it.value.getCurrentWithEpoch(evalScope)
+            newEpoch.accumulateAndGet(epoch, ::maxOf)
+            a
+        } to newEpoch.get()
+    }
+
+    override fun toString(): String = "${this::class.simpleName}@$hashString"
+}
+
+@Suppress("NOTHING_TO_INLINE")
+internal inline fun <A> zipStates(
+    name: String?,
+    operatorName: String,
+    states: List<TStateImpl<A>>,
+): TStateImpl<List<A>> =
+    if (states.isEmpty()) {
+        constS(name, operatorName, emptyList())
+    } else {
+        zipStates(null, operatorName, states.asIterable().associateByIndex()).mapCheap(
+            name,
+            operatorName,
+        ) {
+            it.values.toList()
+        }
+    }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TransactionalImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TransactionalImpl.kt
new file mode 100644
index 0000000..8647bdd
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TransactionalImpl.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal
+
+import com.android.systemui.kairos.internal.util.Key
+import com.android.systemui.kairos.internal.util.hashString
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.Deferred
+
+internal sealed class TransactionalImpl<out A> {
+    data class Const<out A>(val value: Deferred<A>) : TransactionalImpl<A>()
+
+    class Impl<A>(val block: suspend EvalScope.() -> A) : TransactionalImpl<A>(), Key<Deferred<A>> {
+        override fun toString(): String = "${this::class.simpleName}@$hashString"
+    }
+}
+
+@Suppress("NOTHING_TO_INLINE")
+internal inline fun <A> transactionalImpl(
+    noinline block: suspend EvalScope.() -> A
+): TransactionalImpl<A> = TransactionalImpl.Impl(block)
+
+internal fun <A> TransactionalImpl<A>.sample(evalScope: EvalScope): Deferred<A> =
+    when (this) {
+        is TransactionalImpl.Const -> value
+        is TransactionalImpl.Impl ->
+            evalScope.transactionStore
+                .getOrPut(this) {
+                    evalScope.deferAsync(start = CoroutineStart.LAZY) { evalScope.block() }
+                }
+                .also { it.start() }
+    }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/Bag.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/Bag.kt
new file mode 100644
index 0000000..4718519
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/Bag.kt
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal.util
+
+internal class Bag<T> private constructor(private val intMap: MutableMap<T, Int>) :
+    Set<T> by intMap.keys {
+
+    constructor() : this(hashMapOf())
+
+    override fun toString(): String = intMap.toString()
+
+    fun add(element: T): Boolean {
+        val entry = intMap[element]
+        return if (entry != null) {
+            intMap[element] = entry + 1
+            false
+        } else {
+            intMap[element] = 1
+            true
+        }
+    }
+
+    fun remove(element: T): Boolean {
+        val entry = intMap[element]
+        return when {
+            entry == null -> {
+                false
+            }
+            entry <= 1 -> {
+                intMap.remove(element)
+                true
+            }
+            else -> {
+                intMap[element] = entry - 1
+                false
+            }
+        }
+    }
+
+    fun addAll(elements: Iterable<T>, butNot: T? = null): Set<T>? {
+        val newlyAdded = hashSetOf<T>()
+        for (value in elements) {
+            if (value != butNot) {
+                if (add(value)) {
+                    newlyAdded.add(value)
+                }
+            }
+        }
+        return newlyAdded.ifEmpty { null }
+    }
+
+    fun clear() {
+        intMap.clear()
+    }
+
+    fun removeAll(elements: Collection<T>): Set<T>? {
+        val result = hashSetOf<T>()
+        for (element in elements) {
+            if (remove(element)) {
+                result.add(element)
+            }
+        }
+        return result.ifEmpty { null }
+    }
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/ConcurrentNullableHashMap.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/ConcurrentNullableHashMap.kt
new file mode 100644
index 0000000..6c8ae7c
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/ConcurrentNullableHashMap.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal.util
+
+import java.util.concurrent.ConcurrentHashMap
+
+internal class ConcurrentNullableHashMap<K : Any, V>
+private constructor(private val inner: ConcurrentHashMap<K, Any>) {
+    constructor() : this(ConcurrentHashMap())
+
+    @Suppress("UNCHECKED_CAST")
+    operator fun get(key: K): V? = inner[key]?.takeIf { it !== NullValue } as V?
+
+    @Suppress("UNCHECKED_CAST")
+    fun put(key: K, value: V?): V? =
+        inner.put(key, value ?: NullValue)?.takeIf { it !== NullValue } as V?
+
+    operator fun set(key: K, value: V?) {
+        put(key, value)
+    }
+
+    @Suppress("UNCHECKED_CAST")
+    fun toMap(): Map<K, V> = inner.mapValues { (_, v) -> v.takeIf { it !== NullValue } as V }
+
+    fun clear() {
+        inner.clear()
+    }
+
+    fun isNotEmpty(): Boolean = inner.isNotEmpty()
+}
+
+private object NullValue
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/HeteroMap.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/HeteroMap.kt
new file mode 100644
index 0000000..5cee2dd
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/HeteroMap.kt
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal.util
+
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.None
+import com.android.systemui.kairos.util.just
+import java.util.concurrent.ConcurrentHashMap
+
+internal interface Key<A>
+
+private object NULL
+
+internal class HeteroMap {
+
+    private val store = ConcurrentHashMap<Key<*>, Any>()
+
+    @Suppress("UNCHECKED_CAST")
+    operator fun <A> get(key: Key<A>): Maybe<A> =
+        store[key]?.let { just((if (it === NULL) null else it) as A) } ?: None
+
+    operator fun <A> set(key: Key<A>, value: A) {
+        store[key] = value ?: NULL
+    }
+
+    operator fun contains(key: Key<*>): Boolean = store.containsKey(key)
+
+    fun clear() {
+        store.clear()
+    }
+
+    @Suppress("UNCHECKED_CAST")
+    fun <A> remove(key: Key<A>): Maybe<A> =
+        store.remove(key)?.let { just((if (it === NULL) null else it) as A) } ?: None
+
+    @Suppress("UNCHECKED_CAST")
+    fun <A> getOrPut(key: Key<A>, defaultValue: () -> A): A =
+        store.compute(key) { _, value -> value ?: defaultValue() ?: NULL } as A
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/MapUtils.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/MapUtils.kt
new file mode 100644
index 0000000..ebf9a66
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/MapUtils.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.internal.util
+
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.async
+import kotlinx.coroutines.awaitAll
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.yield
+
+// TODO: It's possible that this is less efficient than having each coroutine directly insert into a
+//  ConcurrentHashMap, but then we would lose ordering
+internal suspend inline fun <K, A, B : Any, M : MutableMap<K, B>> Map<K, A>
+    .mapValuesNotNullParallelTo(
+    destination: M,
+    crossinline block: suspend (Map.Entry<K, A>) -> B?,
+): M =
+    destination.also {
+        coroutineScope {
+                mapValues {
+                    async {
+                        yield()
+                        block(it)
+                    }
+                }
+            }
+            .mapValuesNotNullTo(it) { (_, deferred) -> deferred.await() }
+    }
+
+internal inline fun <K, A, B : Any, M : MutableMap<K, B>> Map<K, A>.mapValuesNotNullTo(
+    destination: M,
+    block: (Map.Entry<K, A>) -> B?,
+): M =
+    destination.also {
+        for (entry in this@mapValuesNotNullTo) {
+            block(entry)?.let { destination.put(entry.key, it) }
+        }
+    }
+
+internal suspend fun <A, B> Iterable<A>.mapParallel(transform: suspend (A) -> B): List<B> =
+    coroutineScope {
+        map { async(start = CoroutineStart.LAZY) { transform(it) } }.awaitAll()
+    }
+
+internal suspend fun <K, A, B, M : MutableMap<K, B>> Map<K, A>.mapValuesParallelTo(
+    destination: M,
+    transform: suspend (Map.Entry<K, A>) -> B,
+): Map<K, B> = entries.mapParallel { it.key to transform(it) }.toMap(destination)
+
+internal suspend fun <K, A, B> Map<K, A>.mapValuesParallel(
+    transform: suspend (Map.Entry<K, A>) -> B
+): Map<K, B> = mapValuesParallelTo(mutableMapOf(), transform)
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/Util.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/Util.kt
new file mode 100644
index 0000000..6bb7f9f
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/Util.kt
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.kairos.internal.util
+
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.async
+import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.newCoroutineContext
+
+internal fun <A> CoroutineScope.asyncImmediate(
+    start: CoroutineStart = CoroutineStart.UNDISPATCHED,
+    context: CoroutineContext = EmptyCoroutineContext,
+    block: suspend CoroutineScope.() -> A,
+): Deferred<A> = async(start = start, context = Dispatchers.Unconfined + context, block = block)
+
+internal fun CoroutineScope.launchImmediate(
+    start: CoroutineStart = CoroutineStart.UNDISPATCHED,
+    context: CoroutineContext = EmptyCoroutineContext,
+    block: suspend CoroutineScope.() -> Unit,
+): Job = launch(start = start, context = Dispatchers.Unconfined + context, block = block)
+
+internal suspend fun awaitCancellationAndThen(block: suspend () -> Unit) {
+    try {
+        awaitCancellation()
+    } finally {
+        block()
+    }
+}
+
+internal fun CoroutineScope.launchOnCancel(
+    context: CoroutineContext = EmptyCoroutineContext,
+    block: () -> Unit,
+): Job =
+    launch(context = context, start = CoroutineStart.UNDISPATCHED) {
+        awaitCancellationAndThen(block)
+    }
+
+internal fun CoroutineScope.childScope(
+    context: CoroutineContext = EmptyCoroutineContext
+): CoroutineScope {
+    val newContext = newCoroutineContext(context)
+    val newJob = Job(parent = newContext[Job])
+    return CoroutineScope(newContext + newJob)
+}
+
+internal fun <A> Iterable<A>.associateByIndex(): Map<Int, A> = buildMap {
+    forEachIndexed { index, a -> put(index, a) }
+}
+
+internal fun <A, M : MutableMap<Int, A>> Iterable<A>.associateByIndexTo(destination: M): M =
+    destination.apply { forEachIndexed { index, a -> put(index, a) } }
+
+internal val Any.hashString: String
+    get() = Integer.toHexString(System.identityHashCode(this))
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Either.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Either.kt
new file mode 100644
index 0000000..ad9f7d7
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Either.kt
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package com.android.systemui.kairos.util
+
+/**
+ * Contains a value of two possibilities: `Left<A>` or `Right<B>`
+ *
+ * [Either] generalizes sealed classes the same way that [Pair] generalizes data classes; if a
+ * [Pair] is effectively an anonymous grouping of two instances, then an [Either] is an anonymous
+ * set of two options.
+ */
+sealed class Either<out A, out B>
+
+/** An [Either] that contains a [Left] value. */
+data class Left<out A>(val value: A) : Either<A, Nothing>()
+
+/** An [Either] that contains a [Right] value. */
+data class Right<out B>(val value: B) : Either<Nothing, B>()
+
+/**
+ * Returns an [Either] containing the result of applying [transform] to the [Left] value, or the
+ * [Right] value unchanged.
+ */
+inline fun <A, B, C> Either<A, C>.mapLeft(transform: (A) -> B): Either<B, C> =
+    when (this) {
+        is Left -> Left(transform(value))
+        is Right -> this
+    }
+
+/**
+ * Returns an [Either] containing the result of applying [transform] to the [Right] value, or the
+ * [Left] value unchanged.
+ */
+inline fun <A, B, C> Either<A, B>.mapRight(transform: (B) -> C): Either<A, C> =
+    when (this) {
+        is Left -> this
+        is Right -> Right(transform(value))
+    }
+
+/** Returns a [Maybe] containing the [Left] value held by this [Either], if present. */
+inline fun <A> Either<A, *>.leftMaybe(): Maybe<A> =
+    when (this) {
+        is Left -> just(value)
+        else -> None
+    }
+
+/** Returns the [Left] value held by this [Either], or `null` if this is a [Right] value. */
+inline fun <A> Either<A, *>.leftOrNull(): A? =
+    when (this) {
+        is Left -> value
+        else -> null
+    }
+
+/** Returns a [Maybe] containing the [Right] value held by this [Either], if present. */
+inline fun <B> Either<*, B>.rightMaybe(): Maybe<B> =
+    when (this) {
+        is Right -> just(value)
+        else -> None
+    }
+
+/** Returns the [Right] value held by this [Either], or `null` if this is a [Left] value. */
+inline fun <B> Either<*, B>.rightOrNull(): B? =
+    when (this) {
+        is Right -> value
+        else -> null
+    }
+
+/**
+ * Partitions this sequence of [Either] into two lists; [Pair.first] contains all [Left] values, and
+ * [Pair.second] contains all [Right] values.
+ */
+fun <A, B> Sequence<Either<A, B>>.partitionEithers(): Pair<List<A>, List<B>> {
+    val lefts = mutableListOf<A>()
+    val rights = mutableListOf<B>()
+    for (either in this) {
+        when (either) {
+            is Left -> lefts.add(either.value)
+            is Right -> rights.add(either.value)
+        }
+    }
+    return lefts to rights
+}
+
+/**
+ * Partitions this map of [Either] values into two maps; [Pair.first] contains all [Left] values,
+ * and [Pair.second] contains all [Right] values.
+ */
+fun <K, A, B> Map<K, Either<A, B>>.partitionEithers(): Pair<Map<K, A>, Map<K, B>> {
+    val lefts = mutableMapOf<K, A>()
+    val rights = mutableMapOf<K, B>()
+    for ((k, e) in this) {
+        when (e) {
+            is Left -> lefts[k] = e.value
+            is Right -> rights[k] = e.value
+        }
+    }
+    return lefts to rights
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Maybe.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Maybe.kt
new file mode 100644
index 0000000..c3cae38
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Maybe.kt
@@ -0,0 +1,271 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE", "SuspendCoroutine")
+
+package com.android.systemui.kairos.util
+
+import kotlin.coroutines.Continuation
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
+import kotlin.coroutines.RestrictsSuspension
+import kotlin.coroutines.resume
+import kotlin.coroutines.startCoroutine
+import kotlin.coroutines.suspendCoroutine
+
+/** Represents a value that may or may not be present. */
+sealed class Maybe<out A>
+
+/** A [Maybe] value that is present. */
+data class Just<out A> internal constructor(val value: A) : Maybe<A>()
+
+/** A [Maybe] value that is not present. */
+data object None : Maybe<Nothing>()
+
+/** Utilities to query [Maybe] instances from within a [maybe] block. */
+@RestrictsSuspension
+object MaybeScope {
+    suspend operator fun <A> Maybe<A>.not(): A = suspendCoroutine { k ->
+        if (this is Just) k.resume(value)
+    }
+
+    suspend inline fun guard(crossinline block: () -> Boolean): Unit = suspendCoroutine { k ->
+        if (block()) k.resume(Unit)
+    }
+}
+
+/**
+ * Returns a [Maybe] value produced by evaluating [block].
+ *
+ * [block] can use its [MaybeScope] receiver to query other [Maybe] values, automatically cancelling
+ * execution of [block] and producing [None] when attempting to query a [Maybe] that is not present.
+ *
+ * This can be used instead of Kotlin's built-in nullability (`?.` and `?:`) operators when dealing
+ * with complex combinations of nullables:
+ * ``` kotlin
+ * val aMaybe: Maybe<Any> = ...
+ * val bMaybe: Maybe<Any> = ...
+ * val result: String = maybe {
+ *   val a = !aMaybe
+ *   val b = !bMaybe
+ *   "Got: $a and $b"
+ * }
+ * ```
+ */
+fun <A> maybe(block: suspend MaybeScope.() -> A): Maybe<A> {
+    var maybeResult: Maybe<A> = None
+    val k =
+        object : Continuation<A> {
+            override val context: CoroutineContext = EmptyCoroutineContext
+
+            override fun resumeWith(result: Result<A>) {
+                maybeResult = result.getOrNull()?.let { just(it) } ?: None
+            }
+        }
+    block.startCoroutine(MaybeScope, k)
+    return maybeResult
+}
+
+/** Returns a [Just] containing this value, or [None] if `null`. */
+inline fun <A> (A?).toMaybe(): Maybe<A> = maybe(this)
+
+/** Returns a [Just] containing a non-null [value], or [None] if `null`. */
+inline fun <A> maybe(value: A?): Maybe<A> = value?.let(::just) ?: None
+
+/** Returns a [Just] containing [value]. */
+fun <A> just(value: A): Maybe<A> = Just(value)
+
+/** A [Maybe] that is not present. */
+val none: Maybe<Nothing> = None
+
+/** A [Maybe] that is not present. */
+inline fun <A> none(): Maybe<A> = None
+
+/** Returns the value present in this [Maybe], or `null` if not present. */
+inline fun <A> Maybe<A>.orNull(): A? = orElse(null)
+
+/**
+ * Returns a [Maybe] holding the result of applying [transform] to the value in the original
+ * [Maybe].
+ */
+inline fun <A, B> Maybe<A>.map(transform: (A) -> B): Maybe<B> =
+    when (this) {
+        is Just -> just(transform(value))
+        is None -> None
+    }
+
+/** Returns the result of applying [transform] to the value in the original [Maybe]. */
+inline fun <A, B> Maybe<A>.flatMap(transform: (A) -> Maybe<B>): Maybe<B> =
+    when (this) {
+        is Just -> transform(value)
+        is None -> None
+    }
+
+/** Returns the value present in this [Maybe], or the result of [defaultValue] if not present. */
+inline fun <A> Maybe<A>.orElseGet(defaultValue: () -> A): A =
+    when (this) {
+        is Just -> value
+        is None -> defaultValue()
+    }
+
+/**
+ * Returns the value present in this [Maybe], or invokes [error] with the message returned from
+ * [getMessage].
+ */
+inline fun <A> Maybe<A>.orError(getMessage: () -> Any): A = orElseGet { error(getMessage()) }
+
+/** Returns the value present in this [Maybe], or [defaultValue] if not present. */
+inline fun <A> Maybe<A>.orElse(defaultValue: A): A =
+    when (this) {
+        is Just -> value
+        is None -> defaultValue
+    }
+
+/**
+ * Returns a [Maybe] that contains the present in the original [Maybe], only if it satisfies
+ * [predicate].
+ */
+inline fun <A> Maybe<A>.filter(predicate: (A) -> Boolean): Maybe<A> =
+    when (this) {
+        is Just -> if (predicate(value)) this else None
+        else -> this
+    }
+
+/** Returns a [List] containing all values that are present in this [Iterable]. */
+fun <A> Iterable<Maybe<A>>.filterJust(): List<A> = asSequence().filterJust().toList()
+
+/** Returns a [List] containing all values that are present in this [Sequence]. */
+fun <A> Sequence<Maybe<A>>.filterJust(): Sequence<A> = filterIsInstance<Just<A>>().map { it.value }
+
+// Align
+
+/**
+ * Returns a [Maybe] containing the result of applying the values present in the original [Maybe]
+ * and other, applied to [transform] as a [These].
+ */
+inline fun <A, B, C> Maybe<A>.alignWith(other: Maybe<B>, transform: (These<A, B>) -> C): Maybe<C> =
+    when (this) {
+        is Just -> {
+            val a = value
+            when (other) {
+                is Just -> {
+                    val b = other.value
+                    just(transform(These.both(a, b)))
+                }
+                None -> just(transform(These.thiz(a)))
+            }
+        }
+        None ->
+            when (other) {
+                is Just -> {
+                    val b = other.value
+                    just(transform(These.that(b)))
+                }
+                None -> none
+            }
+    }
+
+// Alt
+
+/** Returns a [Maybe] containing the value present in the original [Maybe], or [other]. */
+infix fun <A> Maybe<A>.orElseMaybe(other: Maybe<A>): Maybe<A> = orElseGetMaybe { other }
+
+/**
+ * Returns a [Maybe] containing the value present in the original [Maybe], or the result of [other].
+ */
+inline fun <A> Maybe<A>.orElseGetMaybe(other: () -> Maybe<A>): Maybe<A> =
+    when (this) {
+        is Just -> this
+        else -> other()
+    }
+
+// Apply
+
+/**
+ * Returns a [Maybe] containing the value present in [argMaybe] applied to the function present in
+ * the original [Maybe].
+ */
+fun <A, B> Maybe<(A) -> B>.apply(argMaybe: Maybe<A>): Maybe<B> = flatMap { f ->
+    argMaybe.map { a -> f(a) }
+}
+
+/**
+ * Returns a [Maybe] containing the result of applying [transform] to the values present in the
+ * original [Maybe] and [other].
+ */
+inline fun <A, B, C> Maybe<A>.zipWith(other: Maybe<B>, transform: (A, B) -> C) = flatMap { a ->
+    other.map { b -> transform(a, b) }
+}
+
+// Bind
+
+/**
+ * Returns a [Maybe] containing the value present in the [Maybe] present in the original [Maybe].
+ */
+fun <A> Maybe<Maybe<A>>.flatten(): Maybe<A> = flatMap { it }
+
+// Semigroup
+
+/**
+ * Returns a [Maybe] containing the result of applying the values present in the original [Maybe]
+ * and other, applied to [transform].
+ */
+fun <A> Maybe<A>.mergeWith(other: Maybe<A>, transform: (A, A) -> A): Maybe<A> =
+    alignWith(other) { it.merge(transform) }
+
+/**
+ * Returns a list containing only the present results of applying [transform] to each element in the
+ * original iterable.
+ */
+fun <A, B> Iterable<A>.mapMaybe(transform: (A) -> Maybe<B>): List<B> =
+    asSequence().mapMaybe(transform).toList()
+
+/**
+ * Returns a sequence containing only the present results of applying [transform] to each element in
+ * the original sequence.
+ */
+fun <A, B> Sequence<A>.mapMaybe(transform: (A) -> Maybe<B>): Sequence<B> =
+    map(transform).filterIsInstance<Just<B>>().map { it.value }
+
+/**
+ * Returns a map with values of only the present results of applying [transform] to each entry in
+ * the original map.
+ */
+inline fun <K, A, B> Map<K, A>.mapMaybeValues(
+    crossinline p: (Map.Entry<K, A>) -> Maybe<B>
+): Map<K, B> = asSequence().mapMaybe { entry -> p(entry).map { entry.key to it } }.toMap()
+
+/** Returns a map with all non-present values filtered out. */
+fun <K, A> Map<K, Maybe<A>>.filterJustValues(): Map<K, A> =
+    asSequence().mapMaybe { (key, mValue) -> mValue.map { key to it } }.toMap()
+
+/**
+ * Returns a pair of [Maybes][Maybe] that contain the [Pair.first] and [Pair.second] values present
+ * in the original [Maybe].
+ */
+fun <A, B> Maybe<Pair<A, B>>.splitPair(): Pair<Maybe<A>, Maybe<B>> =
+    map { it.first } to map { it.second }
+
+/** Returns the value associated with [key] in this map as a [Maybe]. */
+fun <K, V> Map<K, V>.getMaybe(key: K): Maybe<V> {
+    val value = get(key)
+    if (value == null && !containsKey(key)) {
+        return none
+    } else {
+        @Suppress("UNCHECKED_CAST")
+        return just(value as V)
+    }
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/These.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/These.kt
new file mode 100644
index 0000000..aa95e0d
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/These.kt
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.util
+
+/** Contains at least one of two potential values. */
+sealed class These<A, B> {
+    /** Contains a single potential value. */
+    class This<A, B> internal constructor(val thiz: A) : These<A, B>()
+
+    /** Contains a single potential value. */
+    class That<A, B> internal constructor(val that: B) : These<A, B>()
+
+    /** Contains both potential values. */
+    class Both<A, B> internal constructor(val thiz: A, val that: B) : These<A, B>()
+
+    companion object {
+        /** Constructs a [These] containing only [thiz]. */
+        fun <A, B> thiz(thiz: A): These<A, B> = This(thiz)
+
+        /** Constructs a [These] containing only [that]. */
+        fun <A, B> that(that: B): These<A, B> = That(that)
+
+        /** Constructs a [These] containing both [thiz] and [that]. */
+        fun <A, B> both(thiz: A, that: B): These<A, B> = Both(thiz, that)
+    }
+}
+
+/**
+ * Returns a single value from this [These]; either the single value held within, or the result of
+ * applying [f] to both values.
+ */
+inline fun <A> These<A, A>.merge(f: (A, A) -> A): A =
+    when (this) {
+        is These.This -> thiz
+        is These.That -> that
+        is These.Both -> f(thiz, that)
+    }
+
+/** Returns the [These.This] [value][These.This.thiz] present in this [These] as a [Maybe]. */
+fun <A> These<A, *>.maybeThis(): Maybe<A> =
+    when (this) {
+        is These.Both -> just(thiz)
+        is These.That -> None
+        is These.This -> just(thiz)
+    }
+
+/**
+ * Returns the [These.This] [value][These.This.thiz] present in this [These], or `null` if not
+ * present.
+ */
+fun <A : Any> These<A, *>.thisOrNull(): A? =
+    when (this) {
+        is These.Both -> thiz
+        is These.That -> null
+        is These.This -> thiz
+    }
+
+/** Returns the [These.That] [value][These.That.that] present in this [These] as a [Maybe]. */
+fun <A> These<*, A>.maybeThat(): Maybe<A> =
+    when (this) {
+        is These.Both -> just(that)
+        is These.That -> just(that)
+        is These.This -> None
+    }
+
+/**
+ * Returns the [These.That] [value][These.That.that] present in this [These], or `null` if not
+ * present.
+ */
+fun <A : Any> These<*, A>.thatOrNull(): A? =
+    when (this) {
+        is These.Both -> that
+        is These.That -> that
+        is These.This -> null
+    }
+
+/** Returns [These.Both] values present in this [These] as a [Maybe]. */
+fun <A, B> These<A, B>.maybeBoth(): Maybe<Pair<A, B>> =
+    when (this) {
+        is These.Both -> just(thiz to that)
+        else -> None
+    }
+
+/** Returns a [These] containing [thiz] and/or [that] if they are present. */
+fun <A, B> these(thiz: Maybe<A>, that: Maybe<B>): Maybe<These<A, B>> =
+    when (thiz) {
+        is Just ->
+            just(
+                when (that) {
+                    is Just -> These.both(thiz.value, that.value)
+                    else -> These.thiz(thiz.value)
+                }
+            )
+        else ->
+            when (that) {
+                is Just -> just(These.that(that.value))
+                else -> none
+            }
+    }
+
+/**
+ * Returns a [These] containing [thiz] and/or [that] if they are non-null, or `null` if both are
+ * `null`.
+ */
+fun <A : Any, B : Any> theseNull(thiz: A?, that: B?): These<A, B>? =
+    thiz?.let { that?.let { These.both(thiz, that) } ?: These.thiz(thiz) }
+        ?: that?.let { These.that(that) }
+
+/**
+ * Returns two maps, with [Pair.first] containing all [These.This] values and [Pair.second]
+ * containing all [These.That] values.
+ *
+ * If the value is [These.Both], then the associated key with appear in both output maps, bound to
+ * [These.Both.thiz] and [These.Both.that] in each respective output.
+ */
+fun <K, A, B> Map<K, These<A, B>>.partitionThese(): Pair<Map<K, A>, Map<K, B>> {
+    val a = mutableMapOf<K, A>()
+    val b = mutableMapOf<K, B>()
+    for ((k, t) in this) {
+        when (t) {
+            is These.Both -> {
+                a[k] = t.thiz
+                b[k] = t.that
+            }
+            is These.That -> {
+                b[k] = t.that
+            }
+            is These.This -> {
+                a[k] = t.thiz
+            }
+        }
+    }
+    return a to b
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/WithPrev.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/WithPrev.kt
new file mode 100644
index 0000000..5cfaa3e
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/WithPrev.kt
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2024 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.systemui.kairos.util
+
+/** Holds a [newValue] emitted from a `TFlow`, along with the [previousValue] emitted value. */
+data class WithPrev<out S, out T : S>(val previousValue: S, val newValue: T)
diff --git a/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt b/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt
new file mode 100644
index 0000000..165230b
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt
@@ -0,0 +1,1370 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class, ExperimentalFrpApi::class)
+
+package com.android.systemui.kairos
+
+import com.android.systemui.kairos.util.Either
+import com.android.systemui.kairos.util.Left
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.None
+import com.android.systemui.kairos.util.Right
+import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.map
+import com.android.systemui.kairos.util.maybe
+import com.android.systemui.kairos.util.none
+import kotlin.time.Duration
+import kotlin.time.Duration.Companion.seconds
+import kotlin.time.DurationUnit
+import kotlin.time.measureTime
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.async
+import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharedFlow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.flow.toCollection
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Assert.assertNull
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class KairosTests {
+
+    @Test
+    fun basic() = runFrpTest { network ->
+        val emitter = network.mutableTFlow<Int>()
+        var result: Int? = null
+        activateSpec(network) { emitter.observe { result = it } }
+        runCurrent()
+        emitter.emit(3)
+        runCurrent()
+        assertEquals(3, result)
+        runCurrent()
+    }
+
+    @Test
+    fun basicTFlow() = runFrpTest { network ->
+        val emitter = network.mutableTFlow<Int>()
+        println("starting network")
+        val result = activateSpecWithResult(network) { emitter.nextDeferred() }
+        runCurrent()
+        println("emitting")
+        emitter.emit(3)
+        runCurrent()
+        println("awaiting")
+        assertEquals(3, result.await())
+        runCurrent()
+    }
+
+    @Test
+    fun basicTState() = runFrpTest { network ->
+        val emitter = network.mutableTFlow<Int>()
+        val result = activateSpecWithResult(network) { emitter.hold(0).stateChanges.nextDeferred() }
+        runCurrent()
+
+        emitter.emit(3)
+        runCurrent()
+
+        assertEquals(3, result.await())
+    }
+
+    @Test
+    fun basicEvent() = runFrpTest { network ->
+        val emitter = MutableSharedFlow<Int>()
+        val result = activateSpecWithResult(network) { async { emitter.first() } }
+        runCurrent()
+        emitter.emit(1)
+        runCurrent()
+        assertTrue("Result eventual has not completed.", result.isCompleted)
+        assertEquals(1, result.await())
+    }
+
+    @Test
+    fun basicTransactional() = runFrpTest { network ->
+        var value: Int? = null
+        var bSource = 1
+        val emitter = network.mutableTFlow<Unit>()
+        // Sampling this transactional will increment the source count.
+        val transactional = transactionally { bSource++ }
+        measureTime {
+                activateSpecWithResult(network) {
+                        // Two different flows that sample the same transactional.
+                        (0 until 2).map {
+                            val sampled = emitter.sample(transactional) { _, v -> v }
+                            sampled.toSharedFlow()
+                        }
+                    }
+                    .forEach { backgroundScope.launch { it.collect { value = it } } }
+                runCurrent()
+            }
+            .also { println("setup: ${it.toString(DurationUnit.MILLISECONDS, 2)}") }
+
+        measureTime {
+                emitter.emit(Unit)
+                runCurrent()
+            }
+            .also { println("emit 1: ${it.toString(DurationUnit.MILLISECONDS, 2)}") }
+
+        // Even though the transactional would be sampled twice, the first result is cached.
+        assertEquals(2, bSource)
+        assertEquals(1, value)
+
+        measureTime {
+                bSource = 10
+                emitter.emit(Unit)
+                runCurrent()
+            }
+            .also { println("emit 2: ${it.toString(DurationUnit.MILLISECONDS, 2)}") }
+
+        assertEquals(11, bSource)
+        assertEquals(10, value)
+    }
+
+    @Test
+    fun diamondGraph() = runFrpTest { network ->
+        val flow = network.mutableTFlow<Int>()
+        val outFlow =
+            activateSpecWithResult(network) {
+                // map TFlow like we map Flow
+                val left = flow.map { "left" to it }.onEach { println("left: $it") }
+                val right = flow.map { "right" to it }.onEach { println("right: $it") }
+
+                // convert TFlows to TStates so that they can be combined
+                val combined =
+                    left.hold("left" to 0).combineWith(right.hold("right" to 0)) { l, r -> l to r }
+                combined.stateChanges // get TState changes
+                    .onEach { println("merged: $it") }
+                    .toSharedFlow() // convert back to Flow
+            }
+        runCurrent()
+
+        val results = mutableListOf<Pair<Pair<String, Int>, Pair<String, Int>>>()
+        backgroundScope.launch { outFlow.toCollection(results) }
+        runCurrent()
+
+        flow.emit(1)
+        runCurrent()
+
+        flow.emit(2)
+        runCurrent()
+
+        assertEquals(
+            listOf(("left" to 1) to ("right" to 1), ("left" to 2) to ("right" to 2)),
+            results,
+        )
+    }
+
+    @Test
+    fun staticNetwork() = runFrpTest { network ->
+        var finalSum: Int? = null
+
+        val intEmitter = network.mutableTFlow<Int>()
+        val sampleEmitter = network.mutableTFlow<Unit>()
+
+        activateSpecWithResult(network) {
+                val updates = intEmitter.map { a -> { b: Int -> a + b } }
+
+                val sumD =
+                    TStateLoop<Int>().apply {
+                        loopback =
+                            updates
+                                .sample(this) { f, sum -> f(sum) }
+                                .onEach { println("sum update: $it") }
+                                .hold(0)
+                    }
+                sampleEmitter
+                    .onEach { println("sampleEmitter emitted") }
+                    .sample(sumD) { _, sum -> sum }
+                    .onEach { println("sampled: $it") }
+                    .nextDeferred()
+            }
+            .let { launch { finalSum = it.await() } }
+
+        runCurrent()
+
+        (1..5).forEach { i ->
+            println("emitting: $i")
+            intEmitter.emit(i)
+            runCurrent()
+        }
+        runCurrent()
+
+        sampleEmitter.emit(Unit)
+        runCurrent()
+
+        assertEquals(15, finalSum)
+    }
+
+    @Test
+    fun recursiveDefinition() = runFrpTest { network ->
+        var wasSold = false
+        var currentAmt: Int? = null
+
+        val coin = network.mutableTFlow<Unit>()
+        val price = 50
+        val frpSpec = frpSpec {
+            val eSold = TFlowLoop<Unit>()
+
+            val eInsert =
+                coin.map {
+                    { runningTotal: Int ->
+                        println("TEST: $runningTotal - 10 = ${runningTotal - 10}")
+                        runningTotal - 10
+                    }
+                }
+
+            val eReset =
+                eSold.map {
+                    { _: Int ->
+                        println("TEST: Resetting")
+                        price
+                    }
+                }
+
+            val eUpdate = eInsert.mergeWith(eReset) { f, g -> { a -> g(f(a)) } }
+
+            val dTotal = TStateLoop<Int>()
+            dTotal.loopback = eUpdate.sample(dTotal) { f, total -> f(total) }.hold(price)
+
+            val eAmt = dTotal.stateChanges
+            val bAmt = transactionally { dTotal.sample() }
+            eSold.loopback =
+                coin
+                    .sample(bAmt) { coin, total -> coin to total }
+                    .mapMaybe { (_, total) -> maybe { guard { total <= 10 } } }
+
+            val amts = eAmt.filter { amt -> amt >= 0 }
+
+            amts.observe { currentAmt = it }
+            eSold.observe { wasSold = true }
+
+            eSold.nextDeferred()
+        }
+
+        activateSpec(network) { frpSpec.applySpec() }
+
+        runCurrent()
+
+        println()
+        println()
+        coin.emit(Unit)
+        runCurrent()
+
+        assertEquals(40, currentAmt)
+
+        println()
+        println()
+        coin.emit(Unit)
+        runCurrent()
+
+        assertEquals(30, currentAmt)
+
+        println()
+        println()
+        coin.emit(Unit)
+        runCurrent()
+
+        assertEquals(20, currentAmt)
+
+        println()
+        println()
+        coin.emit(Unit)
+        runCurrent()
+
+        assertEquals(10, currentAmt)
+        assertEquals(false, wasSold)
+
+        println()
+        println()
+        coin.emit(Unit)
+        runCurrent()
+
+        assertEquals(true, wasSold)
+        assertEquals(50, currentAmt)
+    }
+
+    @Test
+    fun promptCleanup() = runFrpTest { network ->
+        val emitter = network.mutableTFlow<Int>()
+        val stopper = network.mutableTFlow<Unit>()
+
+        var result: Int? = null
+
+        val flow = activateSpecWithResult(network) { emitter.takeUntil(stopper).toSharedFlow() }
+        backgroundScope.launch { flow.collect { result = it } }
+        runCurrent()
+
+        emitter.emit(2)
+        runCurrent()
+
+        assertEquals(2, result)
+
+        stopper.emit(Unit)
+        runCurrent()
+    }
+
+    @Test
+    fun switchTFlow() = runFrpTest { network ->
+        var currentSum: Int? = null
+
+        val switchHandler = network.mutableTFlow<Pair<TFlow<Int>, String>>()
+        val aHandler = network.mutableTFlow<Int>()
+        val stopHandler = network.mutableTFlow<Unit>()
+        val bHandler = network.mutableTFlow<Int>()
+
+        val sumFlow =
+            activateSpecWithResult(network) {
+                val switchE = TFlowLoop<TFlow<Int>>()
+                switchE.loopback =
+                    switchHandler.mapStateful { (intFlow, name) ->
+                        println("[onEach] Switching to: $name")
+                        val nextSwitch =
+                            switchE.skipNext().onEach { println("[onEach] switched-out") }
+                        val stopEvent =
+                            stopHandler
+                                .onEach { println("[onEach] stopped") }
+                                .mergeWith(nextSwitch) { _, b -> b }
+                        intFlow.takeUntil(stopEvent)
+                    }
+
+                val adderE: TFlow<(Int) -> Int> =
+                    switchE.hold(emptyTFlow).switch().map { a ->
+                        println("[onEach] new number $a")
+                        ({ sum: Int ->
+                            println("$a+$sum=${a + sum}")
+                            sum + a
+                        })
+                    }
+
+                val sumD = TStateLoop<Int>()
+                sumD.loopback =
+                    adderE
+                        .sample(sumD) { f, sum -> f(sum) }
+                        .onEach { println("[onEach] writing sum: $it") }
+                        .hold(0)
+                val sumE = sumD.stateChanges
+
+                sumE.toSharedFlow()
+            }
+
+        runCurrent()
+
+        backgroundScope.launch { sumFlow.collect { currentSum = it } }
+
+        runCurrent()
+
+        switchHandler.emit(aHandler to "A")
+        runCurrent()
+
+        aHandler.emit(1)
+        runCurrent()
+
+        assertEquals(1, currentSum)
+
+        aHandler.emit(2)
+        runCurrent()
+
+        assertEquals(3, currentSum)
+
+        aHandler.emit(3)
+        runCurrent()
+
+        assertEquals(6, currentSum)
+
+        aHandler.emit(4)
+        runCurrent()
+
+        assertEquals(10, currentSum)
+
+        aHandler.emit(5)
+        runCurrent()
+
+        assertEquals(15, currentSum)
+
+        switchHandler.emit(bHandler to "B")
+        runCurrent()
+
+        aHandler.emit(6)
+        runCurrent()
+
+        assertEquals(15, currentSum)
+
+        bHandler.emit(6)
+        runCurrent()
+
+        assertEquals(21, currentSum)
+
+        bHandler.emit(7)
+        runCurrent()
+
+        assertEquals(28, currentSum)
+
+        bHandler.emit(8)
+        runCurrent()
+
+        assertEquals(36, currentSum)
+
+        bHandler.emit(9)
+        runCurrent()
+
+        assertEquals(45, currentSum)
+
+        bHandler.emit(10)
+        runCurrent()
+
+        assertEquals(55, currentSum)
+
+        println()
+        println("Stopping: B")
+        stopHandler.emit(Unit) // bHandler.complete()
+        runCurrent()
+
+        bHandler.emit(20)
+        runCurrent()
+
+        assertEquals(55, currentSum)
+
+        println()
+        println("Switching to: A2")
+        switchHandler.emit(aHandler to "A2")
+        runCurrent()
+
+        println("aHandler.emit(11)")
+        aHandler.emit(11)
+        runCurrent()
+
+        assertEquals(66, currentSum)
+
+        aHandler.emit(12)
+        runCurrent()
+
+        assertEquals(78, currentSum)
+
+        aHandler.emit(13)
+        runCurrent()
+
+        assertEquals(91, currentSum)
+
+        aHandler.emit(14)
+        runCurrent()
+
+        assertEquals(105, currentSum)
+
+        aHandler.emit(15)
+        runCurrent()
+
+        assertEquals(120, currentSum)
+
+        stopHandler.emit(Unit)
+        runCurrent()
+
+        aHandler.emit(100)
+        runCurrent()
+
+        assertEquals(120, currentSum)
+    }
+
+    @Test
+    fun switchIndirect() = runFrpTest { network ->
+        val emitter = network.mutableTFlow<Unit>()
+        activateSpec(network) {
+            emptyTFlow.map { emitter.map { 1 } }.flatten().map { "$it" }.observe()
+        }
+        runCurrent()
+    }
+
+    @Test
+    fun switchInWithResult() = runFrpTest { network ->
+        val emitter = network.mutableTFlow<Unit>()
+        val out =
+            activateSpecWithResult(network) {
+                emitter.map { emitter.map { 1 } }.flatten().toSharedFlow()
+            }
+        val result = out.stateIn(backgroundScope, SharingStarted.Eagerly, null)
+        runCurrent()
+        emitter.emit(Unit)
+        runCurrent()
+        assertEquals(null, result.value)
+    }
+
+    @Test
+    fun switchInCompleted() = runFrpTest { network ->
+        val outputs = mutableListOf<Int>()
+
+        val switchAH = network.mutableTFlow<Unit>()
+        val intAH = network.mutableTFlow<Int>()
+        val stopEmitter = network.mutableTFlow<Unit>()
+
+        val top = frpSpec {
+            val intS = intAH.takeUntil(stopEmitter)
+            val switched = switchAH.map { intS }.flatten()
+            switched.toSharedFlow()
+        }
+        val flow = activateSpecWithResult(network) { top.applySpec() }
+        backgroundScope.launch { flow.collect { outputs.add(it) } }
+        runCurrent()
+
+        switchAH.emit(Unit)
+        runCurrent()
+
+        stopEmitter.emit(Unit)
+        runCurrent()
+
+        // assertEquals(0, intAH.subscriptionCount.value)
+        intAH.emit(10)
+        runCurrent()
+
+        assertEquals(true, outputs.isEmpty())
+
+        switchAH.emit(Unit)
+        runCurrent()
+
+        // assertEquals(0, intAH.subscriptionCount.value)
+        intAH.emit(10)
+        runCurrent()
+
+        assertEquals(true, outputs.isEmpty())
+    }
+
+    @Test
+    fun switchTFlow_outerCompletesFirst() = runFrpTest { network ->
+        var stepResult: Int? = null
+
+        val switchAH = network.mutableTFlow<Unit>()
+        val switchStopEmitter = network.mutableTFlow<Unit>()
+        val intStopEmitter = network.mutableTFlow<Unit>()
+        val intAH = network.mutableTFlow<Int>()
+        val flow =
+            activateSpecWithResult(network) {
+                val intS = intAH.takeUntil(intStopEmitter)
+                val switchS = switchAH.takeUntil(switchStopEmitter)
+
+                val switched = switchS.map { intS }.flatten()
+                switched.toSharedFlow()
+            }
+        backgroundScope.launch { flow.collect { stepResult = it } }
+        runCurrent()
+
+        // assertEquals(0, intAH.subscriptionCount.value)
+        intAH.emit(100)
+        runCurrent()
+
+        assertEquals(null, stepResult)
+
+        switchAH.emit(Unit)
+        runCurrent()
+
+        //            assertEquals(1, intAH.subscriptionCount.value)
+
+        intAH.emit(5)
+        runCurrent()
+
+        assertEquals(5, stepResult)
+
+        println("stop outer")
+        switchStopEmitter.emit(Unit) // switchAH.complete()
+        runCurrent()
+
+        // assertEquals(1, intAH.subscriptionCount.value)
+        // assertEquals(0, switchAH.subscriptionCount.value)
+
+        intAH.emit(10)
+        runCurrent()
+
+        assertEquals(10, stepResult)
+
+        println("stop inner")
+        intStopEmitter.emit(Unit) // intAH.complete()
+        runCurrent()
+
+        // assertEquals(just(10), network.await())
+    }
+
+    @Test
+    fun mapTFlow() = runFrpTest { network ->
+        val emitter = network.mutableTFlow<Int>()
+        var stepResult: Int? = null
+
+        val flow =
+            activateSpecWithResult(network) {
+                val mappedS = emitter.map { it * it }
+                mappedS.toSharedFlow()
+            }
+
+        backgroundScope.launch { flow.collect { stepResult = it } }
+        runCurrent()
+
+        emitter.emit(1)
+        runCurrent()
+
+        assertEquals(1, stepResult)
+
+        emitter.emit(2)
+        runCurrent()
+
+        assertEquals(4, stepResult)
+
+        emitter.emit(10)
+        runCurrent()
+
+        assertEquals(100, stepResult)
+    }
+
+    @Test
+    fun mapTransactional() = runFrpTest { network ->
+        var doubledResult: Int? = null
+        var pullValue = 0
+        val a = transactionally { pullValue }
+        val b = transactionally { a.sample() * 2 }
+        val emitter = network.mutableTFlow<Unit>()
+        val flow =
+            activateSpecWithResult(network) {
+                val sampleB = emitter.sample(b) { _, b -> b }
+                sampleB.toSharedFlow()
+            }
+
+        backgroundScope.launch { flow.collect { doubledResult = it } }
+
+        runCurrent()
+
+        emitter.emit(Unit)
+        runCurrent()
+
+        assertEquals(0, doubledResult)
+
+        pullValue = 5
+        emitter.emit(Unit)
+        runCurrent()
+
+        assertEquals(10, doubledResult)
+    }
+
+    @Test
+    fun mapTState() = runFrpTest { network ->
+        val emitter = network.mutableTFlow<Int>()
+        var stepResult: Int? = null
+        val flow =
+            activateSpecWithResult(network) {
+                val state = emitter.hold(0).map { it + 2 }
+                val stateCurrent = transactionally { state.sample() }
+                val stateChanges = state.stateChanges
+                val sampleState = emitter.sample(stateCurrent) { _, b -> b }
+                val merge = stateChanges.mergeWith(sampleState) { a, b -> a + b }
+                merge.toSharedFlow()
+            }
+        backgroundScope.launch { flow.collect { stepResult = it } }
+        runCurrent()
+
+        emitter.emit(1)
+        runCurrent()
+
+        assertEquals(5, stepResult)
+
+        emitter.emit(10)
+        runCurrent()
+
+        assertEquals(15, stepResult)
+    }
+
+    @Test
+    fun partitionEither() = runFrpTest { network ->
+        val emitter = network.mutableTFlow<Either<Int, Int>>()
+        val result =
+            activateSpecWithResult(network) {
+                val (l, r) = emitter.partitionEither()
+                val pDiamond =
+                    l.map { it * 2 }
+                        .mergeWith(r.map { it * -1 }) { _, _ -> error("unexpected coincidence") }
+                pDiamond.hold(null).toStateFlow()
+            }
+        runCurrent()
+
+        emitter.emit(Left(10))
+        runCurrent()
+
+        assertEquals(20, result.value)
+
+        emitter.emit(Right(30))
+        runCurrent()
+
+        assertEquals(-30, result.value)
+    }
+
+    @Test
+    fun accumTState() = runFrpTest { network ->
+        val emitter = network.mutableTFlow<Int>()
+        val sampler = network.mutableTFlow<Unit>()
+        var stepResult: Int? = null
+        val flow =
+            activateSpecWithResult(network) {
+                val sumState = emitter.map { a -> { b: Int -> a + b } }.fold(0) { f, a -> f(a) }
+
+                sumState.stateChanges
+                    .mergeWith(sampler.sample(sumState) { _, sum -> sum }) { _, _ ->
+                        error("Unexpected coincidence")
+                    }
+                    .toSharedFlow()
+            }
+
+        backgroundScope.launch { flow.collect { stepResult = it } }
+        runCurrent()
+
+        emitter.emit(5)
+        runCurrent()
+        assertEquals(5, stepResult)
+
+        emitter.emit(10)
+        runCurrent()
+        assertEquals(15, stepResult)
+
+        sampler.emit(Unit)
+        runCurrent()
+        assertEquals(15, stepResult)
+    }
+
+    @Test
+    fun mergeTFlows() = runFrpTest { network ->
+        val first = network.mutableTFlow<Int>()
+        val stopFirst = network.mutableTFlow<Unit>()
+        val second = network.mutableTFlow<Int>()
+        val stopSecond = network.mutableTFlow<Unit>()
+        var stepResult: Int? = null
+
+        val flow: SharedFlow<Int>
+        val setupDuration = measureTime {
+            flow =
+                activateSpecWithResult(network) {
+                    val firstS = first.takeUntil(stopFirst)
+                    val secondS = second.takeUntil(stopSecond)
+                    val mergedS =
+                        firstS.mergeWith(secondS) { _, _ -> error("Unexpected coincidence") }
+                    mergedS.toSharedFlow()
+                    // mergedS.last("onComplete")
+                }
+            backgroundScope.launch { flow.collect { stepResult = it } }
+            runCurrent()
+        }
+
+        //            assertEquals(1, first.subscriptionCount.value)
+        //            assertEquals(1, second.subscriptionCount.value)
+
+        val firstEmitDuration = measureTime {
+            first.emit(1)
+            runCurrent()
+        }
+
+        assertEquals(1, stepResult)
+
+        val secondEmitDuration = measureTime {
+            second.emit(2)
+            runCurrent()
+        }
+
+        assertEquals(2, stepResult)
+
+        val stopFirstDuration = measureTime {
+            stopFirst.emit(Unit)
+            runCurrent()
+        }
+
+        // assertEquals(0, first.subscriptionCount.value)
+        val testDeadEmitFirstDuration = measureTime {
+            first.emit(10)
+            runCurrent()
+        }
+
+        assertEquals(2, stepResult)
+
+        //            assertEquals(1, second.subscriptionCount.value)
+
+        val secondEmitDuration2 = measureTime {
+            second.emit(3)
+            runCurrent()
+        }
+
+        assertEquals(3, stepResult)
+
+        val stopSecondDuration = measureTime {
+            stopSecond.emit(Unit)
+            runCurrent()
+        }
+
+        // assertEquals(0, second.subscriptionCount.value)
+        val testDeadEmitSecondDuration = measureTime {
+            second.emit(10)
+            runCurrent()
+        }
+
+        assertEquals(3, stepResult)
+
+        println(
+            """
+                setupDuration: ${setupDuration.toString(DurationUnit.MILLISECONDS, 2)}
+                firstEmitDuration: ${firstEmitDuration.toString(DurationUnit.MILLISECONDS, 2)}
+                secondEmitDuration: ${secondEmitDuration.toString(DurationUnit.MILLISECONDS, 2)}
+                stopFirstDuration: ${stopFirstDuration.toString(DurationUnit.MILLISECONDS, 2)}
+                testDeadEmitFirstDuration: ${
+                    testDeadEmitFirstDuration.toString(
+                        DurationUnit.MILLISECONDS,
+                        2,
+                    )
+                }
+                secondEmitDuration2: ${secondEmitDuration2.toString(DurationUnit.MILLISECONDS, 2)}
+                stopSecondDuration: ${stopSecondDuration.toString(DurationUnit.MILLISECONDS, 2)}
+                testDeadEmitSecondDuration: ${
+                    testDeadEmitSecondDuration.toString(
+                        DurationUnit.MILLISECONDS,
+                        2,
+                    )
+                }
+            """
+                .trimIndent()
+        )
+    }
+
+    @Test
+    fun sampleCancel() = runFrpTest { network ->
+        val updater = network.mutableTFlow<Int>()
+        val stopUpdater = network.mutableTFlow<Unit>()
+        val sampler = network.mutableTFlow<Unit>()
+        val stopSampler = network.mutableTFlow<Unit>()
+        var stepResult: Int? = null
+        val flow =
+            activateSpecWithResult(network) {
+                val stopSamplerFirst = stopSampler
+                val samplerS = sampler.takeUntil(stopSamplerFirst)
+                val stopUpdaterFirst = stopUpdater
+                val updaterS = updater.takeUntil(stopUpdaterFirst)
+                val sampledS = samplerS.sample(updaterS.hold(0)) { _, b -> b }
+                sampledS.toSharedFlow()
+            }
+
+        backgroundScope.launch { flow.collect { stepResult = it } }
+        runCurrent()
+
+        updater.emit(1)
+        runCurrent()
+
+        sampler.emit(Unit)
+        runCurrent()
+
+        assertEquals(1, stepResult)
+
+        stopSampler.emit(Unit)
+        runCurrent()
+
+        // assertEquals(0, updater.subscriptionCount.value)
+        // assertEquals(0, sampler.subscriptionCount.value)
+        updater.emit(10)
+        runCurrent()
+
+        sampler.emit(Unit)
+        runCurrent()
+
+        assertEquals(1, stepResult)
+    }
+
+    @Test
+    fun combineStates_differentUpstreams() = runFrpTest { network ->
+        val a = network.mutableTFlow<Int>()
+        val b = network.mutableTFlow<Int>()
+        var observed: Pair<Int, Int>? = null
+        val tState =
+            activateSpecWithResult(network) {
+                val state = combine(a.hold(0), b.hold(0)) { a, b -> Pair(a, b) }
+                state.stateChanges.observe { observed = it }
+                state
+            }
+        assertEquals(0 to 0, network.transact { tState.sample() })
+        assertEquals(null, observed)
+        a.emit(5)
+        assertEquals(5 to 0, observed)
+        assertEquals(5 to 0, network.transact { tState.sample() })
+        b.emit(3)
+        assertEquals(5 to 3, observed)
+        assertEquals(5 to 3, network.transact { tState.sample() })
+    }
+
+    @Test
+    fun sampleCombinedStates() = runFrpTest { network ->
+        val updater = network.mutableTFlow<Int>()
+        val emitter = network.mutableTFlow<Unit>()
+
+        val result =
+            activateSpecWithResult(network) {
+                val bA = updater.map { it * 2 }.hold(0)
+                val bB = updater.hold(0)
+                val combineD: TState<Pair<Int, Int>> = bA.combineWith(bB) { a, b -> a to b }
+                val sampleS = emitter.sample(combineD) { _, b -> b }
+                sampleS.nextDeferred()
+            }
+        println("launching")
+        runCurrent()
+
+        println("emitting update")
+        updater.emit(10)
+        runCurrent()
+
+        println("emitting sampler")
+        emitter.emit(Unit)
+        runCurrent()
+
+        println("asserting")
+        assertEquals(20 to 10, result.await())
+    }
+
+    @Test
+    fun switchMapPromptly() = runFrpTest { network ->
+        val emitter = network.mutableTFlow<Unit>()
+        val result =
+            activateSpecWithResult(network) {
+                emitter
+                    .map { emitter.map { 1 }.map { it + 1 }.map { it * 2 } }
+                    .hold(emptyTFlow)
+                    .switchPromptly()
+                    .nextDeferred()
+            }
+        runCurrent()
+
+        emitter.emit(Unit)
+        runCurrent()
+
+        assertTrue("Not complete", result.isCompleted)
+        assertEquals(4, result.await())
+    }
+
+    @Test
+    fun switchDeeper() = runFrpTest { network ->
+        val emitter = network.mutableTFlow<Unit>()
+        val e2 = network.mutableTFlow<Unit>()
+        val result =
+            activateSpecWithResult(network) {
+                val tres =
+                    merge(e2.map { 1 }, e2.map { 2 }, transformCoincidence = { a, b -> a + b })
+                tres.observeBuild()
+                val switch = emitter.map { tres }.flatten()
+                merge(switch, e2.map { null }, transformCoincidence = { a, _ -> a })
+                    .filterNotNull()
+                    .nextDeferred()
+            }
+        runCurrent()
+
+        emitter.emit(Unit)
+        runCurrent()
+
+        e2.emit(Unit)
+        runCurrent()
+
+        assertTrue("Not complete", result.isCompleted)
+        assertEquals(3, result.await())
+    }
+
+    @Test
+    fun recursionBasic() = runFrpTest { network ->
+        val add1 = network.mutableTFlow<Unit>()
+        val sub1 = network.mutableTFlow<Unit>()
+        val stepResult: StateFlow<Int> =
+            activateSpecWithResult(network) {
+                val dSum = TStateLoop<Int>()
+                val sAdd1 = add1.sample(dSum) { _, sum -> sum + 1 }
+                val sMinus1 = sub1.sample(dSum) { _, sum -> sum - 1 }
+                dSum.loopback = sAdd1.mergeWith(sMinus1) { a, _ -> a }.hold(0)
+                dSum.toStateFlow()
+            }
+        runCurrent()
+
+        add1.emit(Unit)
+        runCurrent()
+
+        assertEquals(1, stepResult.value)
+
+        add1.emit(Unit)
+        runCurrent()
+
+        assertEquals(2, stepResult.value)
+
+        sub1.emit(Unit)
+        runCurrent()
+
+        assertEquals(1, stepResult.value)
+    }
+
+    @Test
+    fun recursiveTState() = runFrpTest { network ->
+        val e = network.mutableTFlow<Unit>()
+        var changes = 0
+        val state =
+            activateSpecWithResult(network) {
+                val s = TFlowLoop<Unit>()
+                val deferred = s.map { tStateOf(null) }
+                val e3 = e.map { tStateOf(Unit) }
+                val flattened = e3.mergeWith(deferred) { a, _ -> a }.hold(tStateOf(null)).flatten()
+                s.loopback = emptyTFlow
+                flattened.toStateFlow()
+            }
+
+        backgroundScope.launch { state.collect { changes++ } }
+        runCurrent()
+    }
+
+    @Test
+    fun fanOut() = runFrpTest { network ->
+        val e = network.mutableTFlow<Map<String, Int>>()
+        val (fooFlow, barFlow) =
+            activateSpecWithResult(network) {
+                val selector = e.groupByKey()
+                val foos = selector.eventsForKey("foo")
+                val bars = selector.eventsForKey("bar")
+                foos.toSharedFlow() to bars.toSharedFlow()
+            }
+        val stateFlow = fooFlow.stateIn(backgroundScope, SharingStarted.Eagerly, null)
+        backgroundScope.launch { barFlow.collect { error("unexpected bar") } }
+        runCurrent()
+
+        assertEquals(null, stateFlow.value)
+
+        e.emit(mapOf("foo" to 1))
+        runCurrent()
+
+        assertEquals(1, stateFlow.value)
+    }
+
+    @Test
+    fun fanOutLateSubscribe() = runFrpTest { network ->
+        val e = network.mutableTFlow<Map<String, Int>>()
+        val barFlow =
+            activateSpecWithResult(network) {
+                val selector = e.groupByKey()
+                selector
+                    .eventsForKey("foo")
+                    .map { selector.eventsForKey("bar") }
+                    .hold(emptyTFlow)
+                    .switchPromptly()
+                    .toSharedFlow()
+            }
+        val stateFlow = barFlow.stateIn(backgroundScope, SharingStarted.Eagerly, null)
+        runCurrent()
+
+        assertEquals(null, stateFlow.value)
+
+        e.emit(mapOf("foo" to 0, "bar" to 1))
+        runCurrent()
+
+        assertEquals(1, stateFlow.value)
+    }
+
+    @Test
+    fun inputFlowCompleted() = runFrpTest { network ->
+        val results = mutableListOf<Int>()
+        val e = network.mutableTFlow<Int>()
+        activateSpec(network) { e.nextOnly().observe { results.add(it) } }
+        runCurrent()
+
+        e.emit(10)
+        runCurrent()
+
+        assertEquals(listOf(10), results)
+
+        e.emit(20)
+        runCurrent()
+        assertEquals(listOf(10), results)
+    }
+
+    @Test
+    fun fanOutThenMergeIncrementally() = runFrpTest { network ->
+        // A tflow of group updates, where a group is a tflow of child updates, where a child is a
+        // stateflow
+        val e = network.mutableTFlow<Map<Int, Maybe<TFlow<Map<Int, Maybe<StateFlow<String>>>>>>>()
+        println("fanOutMergeInc START")
+        val state =
+            activateSpecWithResult(network) {
+                // Convert nested Flows to nested TFlow/TState
+                val emitter: TFlow<Map<Int, Maybe<TFlow<Map<Int, Maybe<TState<String>>>>>>> =
+                    e.mapBuild { m ->
+                        m.mapValues { (_, mFlow) ->
+                            mFlow.map {
+                                it.mapBuild { m2 ->
+                                    m2.mapValues { (_, mState) ->
+                                        mState.map { stateFlow -> stateFlow.toTState() }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                // Accumulate all of our updates into a single TState
+                val accState: TState<Map<Int, Map<Int, String>>> =
+                    emitter
+                        .mapStateful {
+                            changeMap: Map<Int, Maybe<TFlow<Map<Int, Maybe<TState<String>>>>>> ->
+                            changeMap.mapValues { (groupId, mGroupChanges) ->
+                                mGroupChanges.map {
+                                    groupChanges: TFlow<Map<Int, Maybe<TState<String>>>> ->
+                                    // New group
+                                    val childChangeById = groupChanges.groupByKey()
+                                    val map: TFlow<Map<Int, Maybe<TFlow<Maybe<TState<String>>>>>> =
+                                        groupChanges.mapStateful {
+                                            gChangeMap: Map<Int, Maybe<TState<String>>> ->
+                                            gChangeMap.mapValues { (childId, mChild) ->
+                                                mChild.map { child: TState<String> ->
+                                                    println("new child $childId in the house")
+                                                    // New child
+                                                    val eRemoved =
+                                                        childChangeById
+                                                            .eventsForKey(childId)
+                                                            .filter { it === None }
+                                                            .nextOnly()
+
+                                                    val addChild: TFlow<Maybe<TState<String>>> =
+                                                        now.map { mChild }
+                                                            .onEach {
+                                                                println(
+                                                                    "addChild (groupId=$groupId, childId=$childId) ${child.sample()}"
+                                                                )
+                                                            }
+
+                                                    val removeChild: TFlow<Maybe<TState<String>>> =
+                                                        eRemoved
+                                                            .onEach {
+                                                                println(
+                                                                    "removeChild (groupId=$groupId, childId=$childId)"
+                                                                )
+                                                            }
+                                                            .map { none() }
+
+                                                    addChild.mergeWith(removeChild) { _, _ ->
+                                                        error("unexpected coincidence")
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    val mergeIncrementally: TFlow<Map<Int, Maybe<TState<String>>>> =
+                                        map.onEach { println("merge patch: $it") }
+                                            .mergeIncrementallyPromptly()
+                                    mergeIncrementally
+                                        .onEach { println("patch: $it") }
+                                        .foldMapIncrementally()
+                                        .flatMap { it.combineValues() }
+                                }
+                            }
+                        }
+                        .foldMapIncrementally()
+                        .flatMap { it.combineValues() }
+
+                accState.toStateFlow()
+            }
+        runCurrent()
+
+        assertEquals(emptyMap(), state.value)
+
+        val emitter2 = network.mutableTFlow<Map<Int, Maybe<StateFlow<String>>>>()
+        println()
+        println("init outer 0")
+        e.emit(mapOf(0 to just(emitter2.onEach { println("emitter2 emit: $it") })))
+        runCurrent()
+
+        assertEquals(mapOf(0 to emptyMap()), state.value)
+
+        println()
+        println("init inner 10")
+        emitter2.emit(mapOf(10 to just(MutableStateFlow("(0, 10)"))))
+        runCurrent()
+
+        assertEquals(mapOf(0 to mapOf(10 to "(0, 10)")), state.value)
+
+        // replace
+        println()
+        println("replace inner 10")
+        emitter2.emit(mapOf(10 to just(MutableStateFlow("(1, 10)"))))
+        runCurrent()
+
+        assertEquals(mapOf(0 to mapOf(10 to "(1, 10)")), state.value)
+
+        // remove
+        emitter2.emit(mapOf(10 to none()))
+        runCurrent()
+
+        assertEquals(mapOf(0 to emptyMap()), state.value)
+
+        // add again
+        emitter2.emit(mapOf(10 to just(MutableStateFlow("(2, 10)"))))
+        runCurrent()
+
+        assertEquals(mapOf(0 to mapOf(10 to "(2, 10)")), state.value)
+
+        // batch update
+        emitter2.emit(
+            mapOf(
+                10 to none(),
+                11 to just(MutableStateFlow("(0, 11)")),
+                12 to just(MutableStateFlow("(0, 12)")),
+            )
+        )
+        runCurrent()
+
+        assertEquals(mapOf(0 to mapOf(11 to "(0, 11)", 12 to "(0, 12)")), state.value)
+    }
+
+    @Test
+    fun applyLatestNetworkChanges() = runFrpTest { network ->
+        val newCount = network.mutableTFlow<FrpSpec<Flow<Int>>>()
+        val flowOfFlows: Flow<Flow<Int>> =
+            activateSpecWithResult(network) { newCount.applyLatestSpec().toSharedFlow() }
+        runCurrent()
+
+        val incCount = network.mutableTFlow<Unit>()
+        fun newFlow(): FrpSpec<SharedFlow<Int>> = frpSpec {
+            launchEffect {
+                try {
+                    println("new flow!")
+                    awaitCancellation()
+                } finally {
+                    println("cancelling old flow")
+                }
+            }
+            lateinit var count: TState<Int>
+            count =
+                incCount
+                    .onEach { println("incrementing ${count.sample()}") }
+                    .fold(0) { _, c -> c + 1 }
+            count.stateChanges.toSharedFlow()
+        }
+
+        var outerCount = 0
+        val lastFlows: StateFlow<Pair<StateFlow<Int?>, StateFlow<Int?>>> =
+            flowOfFlows
+                .map { it.stateIn(backgroundScope, SharingStarted.Eagerly, null) }
+                .pairwise(MutableStateFlow(null))
+                .onEach { outerCount++ }
+                .stateIn(
+                    backgroundScope,
+                    SharingStarted.Eagerly,
+                    MutableStateFlow(null) to MutableStateFlow(null),
+                )
+
+        runCurrent()
+
+        newCount.emit(newFlow())
+        runCurrent()
+
+        assertEquals(1, outerCount)
+        //        assertEquals(1, incCount.subscriptionCount)
+        assertNull(lastFlows.value.second.value)
+
+        incCount.emit(Unit)
+        runCurrent()
+
+        println("checking")
+        assertEquals(1, lastFlows.value.second.value)
+
+        incCount.emit(Unit)
+        runCurrent()
+
+        assertEquals(2, lastFlows.value.second.value)
+
+        newCount.emit(newFlow())
+        runCurrent()
+        incCount.emit(Unit)
+        runCurrent()
+
+        // verify old flow is not getting updates
+        assertEquals(2, lastFlows.value.first.value)
+        // but the new one is
+        assertEquals(1, lastFlows.value.second.value)
+    }
+
+    @Test
+    fun effect() = runFrpTest { network ->
+        val input = network.mutableTFlow<Unit>()
+        var effectRunning = false
+        var count = 0
+        activateSpec(network) {
+            val j = launchEffect {
+                effectRunning = true
+                try {
+                    awaitCancellation()
+                } finally {
+                    effectRunning = false
+                }
+            }
+            merge(emptyTFlow, input.nextOnly()).observe {
+                count++
+                j.cancel()
+            }
+        }
+        runCurrent()
+        assertEquals(true, effectRunning)
+        assertEquals(0, count)
+
+        println("1")
+        input.emit(Unit)
+        assertEquals(false, effectRunning)
+        assertEquals(1, count)
+
+        println("2")
+        input.emit(Unit)
+        assertEquals(1, count)
+        println("3")
+        input.emit(Unit)
+        assertEquals(1, count)
+    }
+
+    private fun runFrpTest(
+        timeout: Duration = 3.seconds,
+        block: suspend TestScope.(FrpNetwork) -> Unit,
+    ) {
+        runTest(timeout = timeout) {
+            val network = backgroundScope.newFrpNetwork()
+            runCurrent()
+            block(network)
+        }
+    }
+
+    private fun TestScope.activateSpec(network: FrpNetwork, spec: FrpSpec<*>) =
+        backgroundScope.launch { network.activateSpec(spec) }
+
+    private suspend fun <R> TestScope.activateSpecWithResult(
+        network: FrpNetwork,
+        spec: FrpSpec<R>,
+    ): R =
+        CompletableDeferred<R>()
+            .apply { activateSpec(network) { complete(spec.applySpec()) } }
+            .await()
+}
+
+private fun <T> assertEquals(expected: T, actual: T) =
+    org.junit.Assert.assertEquals(expected, actual)
+
+private fun <A> Flow<A>.pairwise(init: A): Flow<Pair<A, A>> = flow {
+    var prev = init
+    collect {
+        emit(prev to it)
+        prev = it
+    }
+}
diff --git a/packages/VpnDialogs/res/values-kn/strings.xml b/packages/VpnDialogs/res/values-kn/strings.xml
index 4f8d90b..f268af4 100644
--- a/packages/VpnDialogs/res/values-kn/strings.xml
+++ b/packages/VpnDialogs/res/values-kn/strings.xml
@@ -32,7 +32,7 @@
     <string name="always_on_disconnected_message_settings_link" msgid="6172280302829992412">"VPN ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಿ"</string>
     <string name="configure" msgid="4905518375574791375">"ಕಾನ್ಫಿಗರ್ ಮಾಡು"</string>
     <string name="disconnect" msgid="971412338304200056">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string>
-    <string name="open_app" msgid="3717639178595958667">"ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ"</string>
+    <string name="open_app" msgid="3717639178595958667">"ಆ್ಯಪ್ ತೆರೆಯಿರಿ"</string>
     <string name="dismiss" msgid="6192859333764711227">"ವಜಾಗೊಳಿಸಿ"</string>
     <string name="sanitized_vpn_label_with_ellipsis" msgid="7014327474633422235">"<xliff:g id="SANITIZED_VPN_LABEL_WITH_ELLIPSIS_0">%1$s</xliff:g>… ( <xliff:g id="SANITIZED_VPN_LABEL_WITH_ELLIPSIS_1">%2$s</xliff:g>)"</string>
     <string name="sanitized_vpn_label" msgid="1877415015009794766">"<xliff:g id="SANITIZED_VPN_LABEL_0">%1$s</xliff:g> ( <xliff:g id="SANITIZED_VPN_LABEL_1">%2$s</xliff:g>)"</string>
diff --git a/proto/src/system_messages.proto b/proto/src/system_messages.proto
index 994bdb5..6489905 100644
--- a/proto/src/system_messages.proto
+++ b/proto/src/system_messages.proto
@@ -206,7 +206,7 @@
 
     // Inform that DND settings have changed on OS upgrade
     // Package: android
-    NOTE_ZEN_UPGRADE = 48;
+    NOTE_ZEN_UPGRADE = 48  [deprecated = true];
 
     // Notification to suggest automatic battery saver.
     // Package: android
diff --git a/ravenwood/Android.bp b/ravenwood/Android.bp
index 6b1197a..11b66fc 100644
--- a/ravenwood/Android.bp
+++ b/ravenwood/Android.bp
@@ -12,15 +12,6 @@
 }
 
 filegroup {
-    name: "ravenwood-annotations",
-    srcs: [
-        "annotations-src/**/*.java",
-    ],
-    path: "annotations-src",
-    visibility: ["//visibility:public"],
-}
-
-filegroup {
     name: "ravenwood-services-policies",
     srcs: [
         "texts/ravenwood-services-policies.txt",
@@ -52,14 +43,6 @@
     visibility: ["//visibility:public"],
 }
 
-java_library {
-    name: "ravenwood-annotations-lib",
-    srcs: [":ravenwood-annotations"],
-    sdk_version: "core_current",
-    host_supported: true,
-    visibility: ["//visibility:public"],
-}
-
 // This and the next module contain the same classes with different implementations.
 // "ravenwood-runtime-common-device" will be statically linked in device side tests.
 // "ravenwood-runtime-common-ravenwood" will only exist in ravenwood-runtime, which will take
diff --git a/ravenwood/TEST_MAPPING b/ravenwood/TEST_MAPPING
index 86246e2..72f62c5 100644
--- a/ravenwood/TEST_MAPPING
+++ b/ravenwood/TEST_MAPPING
@@ -5,7 +5,8 @@
     { "name": "hoststubgen-test-tiny-test" },
     { "name": "hoststubgen-invoke-test" },
     { "name": "RavenwoodMockitoTest_device" },
-    { "name": "RavenwoodBivalentTest_device" },
+    // TODO(b/371215487): Re-enable when the test is fixed.
+    // { "name": "RavenwoodBivalentTest_device" },
 
     { "name": "RavenwoodBivalentInstTest_nonself_inst" },
     { "name": "RavenwoodBivalentInstTest_self_inst_device" },
diff --git a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodClassLoadHook.java b/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodClassLoadHook.java
deleted file mode 100644
index 7a3142b..0000000
--- a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodClassLoadHook.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2023 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 android.ravenwood.annotation;
-
-import static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * THIS ANNOTATION IS EXPERIMENTAL. REACH OUT TO g/ravenwood BEFORE USING IT, OR YOU HAVE ANY
- * QUESTIONS ABOUT IT.
- *
- * Add this with a fully-specified method name (e.g. {@code "com.package.Class.methodName"})
- * of a callback to get a callback at the class load time.
- *
- * The method must be {@code public static} with a single argument that takes {@link Class}.
- *
- * Typically, this is used with {@link #LIBANDROID_LOADING_HOOK}, which will load the necessary
- * native libraries.
- *
- * @hide
- */
-@Target({TYPE})
-@Retention(RetentionPolicy.CLASS)
-public @interface RavenwoodClassLoadHook {
-    String value();
-
-    /**
-     * Class load hook that loads <code>libandroid_runtime</code>.
-     */
-    public static String LIBANDROID_LOADING_HOOK
-            = "com.android.platform.test.ravenwood.runtimehelper.ClassLoadHook.onClassLoaded";
-}
diff --git a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodKeep.java b/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodKeep.java
deleted file mode 100644
index f02f06c..0000000
--- a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodKeep.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2023 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 android.ravenwood.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * THIS ANNOTATION IS EXPERIMENTAL. REACH OUT TO g/ravenwood BEFORE USING IT, OR YOU HAVE ANY
- * QUESTIONS ABOUT IT.
- *
- * TODO: Javadoc
- *
- * @hide
- */
-@Target({FIELD, METHOD, CONSTRUCTOR})
-@Retention(RetentionPolicy.CLASS)
-public @interface RavenwoodKeep {
-}
diff --git a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodKeepPartialClass.java b/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodKeepPartialClass.java
deleted file mode 100644
index 7847274..0000000
--- a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodKeepPartialClass.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2023 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 android.ravenwood.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * THIS ANNOTATION IS EXPERIMENTAL. REACH OUT TO g/ravenwood BEFORE USING IT, OR YOU HAVE ANY
- * QUESTIONS ABOUT IT.
- *
- * TODO: Javadoc
- *
- * @hide
- */
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface RavenwoodKeepPartialClass {
-}
diff --git a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodKeepStaticInitializer.java b/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodKeepStaticInitializer.java
deleted file mode 100644
index eeebee9..0000000
--- a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodKeepStaticInitializer.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2023 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 android.ravenwood.annotation;
-
-import static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * THIS ANNOTATION IS EXPERIMENTAL. REACH OUT TO g/ravenwood BEFORE USING IT, OR YOU HAVE ANY
- * QUESTIONS ABOUT IT.
- *
- * @hide
- */
-@Target(TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface RavenwoodKeepStaticInitializer {
-}
diff --git a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodKeepWholeClass.java b/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodKeepWholeClass.java
deleted file mode 100644
index d2c77c1..0000000
--- a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodKeepWholeClass.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2023 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 android.ravenwood.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * THIS ANNOTATION IS EXPERIMENTAL. REACH OUT TO g/ravenwood BEFORE USING IT, OR YOU HAVE ANY
- * QUESTIONS ABOUT IT.
- *
- * TODO: Javadoc
- * TODO: Create "whole-class-throw"?
- *
- * @hide
- */
-@Target({TYPE, FIELD, METHOD, CONSTRUCTOR})
-@Retention(RetentionPolicy.CLASS)
-public @interface RavenwoodKeepWholeClass {
-}
diff --git a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodRedirect.java b/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodRedirect.java
deleted file mode 100644
index b582ccf..0000000
--- a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodRedirect.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2024 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 android.ravenwood.annotation;
-
-import static java.lang.annotation.ElementType.METHOD;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * THIS ANNOTATION IS EXPERIMENTAL. REACH OUT TO g/ravenwood BEFORE USING IT, OR YOU HAVE ANY
- * QUESTIONS ABOUT IT.
- *
- * TODO: Javadoc
- *
- * @hide
- */
-@Target({METHOD})
-@Retention(RetentionPolicy.CLASS)
-public @interface RavenwoodRedirect {
-}
diff --git a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodRedirectionClass.java b/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodRedirectionClass.java
deleted file mode 100644
index bee9222..0000000
--- a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodRedirectionClass.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2023 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 android.ravenwood.annotation;
-
-import static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * THIS ANNOTATION IS EXPERIMENTAL. REACH OUT TO g/ravenwood BEFORE USING IT, OR YOU HAVE ANY
- * QUESTIONS ABOUT IT.
- *
- * TODO: Javadoc
- *
- * @hide
- */
-@Target({TYPE})
-@Retention(RetentionPolicy.CLASS)
-public @interface RavenwoodRedirectionClass {
-    String value();
-}
diff --git a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodRemove.java b/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodRemove.java
deleted file mode 100644
index b69c637..0000000
--- a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodRemove.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2023 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 android.ravenwood.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * THIS ANNOTATION IS EXPERIMENTAL. REACH OUT TO g/ravenwood BEFORE USING IT, OR YOU HAVE ANY
- * QUESTIONS ABOUT IT.
- *
- * TODO: Javadoc
- *
- * @hide
- */
-@Target({TYPE, FIELD, METHOD, CONSTRUCTOR})
-@Retention(RetentionPolicy.CLASS)
-public @interface RavenwoodRemove {
-    /**
-     * One or more classes that aren't yet supported by Ravenwood, which is why this method throws.
-     */
-    Class<?>[] blockedBy() default {};
-
-    /**
-     * General free-form description of why this method throws.
-     */
-    String reason() default "";
-
-    /**
-     * Tracking bug number, if any.
-     */
-    long bug() default 0;
-}
diff --git a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodReplace.java b/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodReplace.java
deleted file mode 100644
index 57cdfd2..0000000
--- a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodReplace.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2023 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 android.ravenwood.annotation;
-
-import static java.lang.annotation.ElementType.METHOD;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * THIS ANNOTATION IS EXPERIMENTAL. REACH OUT TO g/ravenwood BEFORE USING IT, OR YOU HAVE ANY
- * QUESTIONS ABOUT IT.
- *
- * TODO: Javadoc
- *
- * @hide
- */
-@Target({METHOD})
-@Retention(RetentionPolicy.CLASS)
-public @interface RavenwoodReplace {
-    /**
-     * One or more classes that aren't yet supported by Ravenwood, which is why this method is
-     * being replaced.
-     */
-    Class<?>[] blockedBy() default {};
-
-    /**
-     * General free-form description of why this method is being replaced.
-     */
-    String reason() default "";
-
-    /**
-     * Tracking bug number, if any.
-     */
-    long bug() default 0;
-}
diff --git a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodThrow.java b/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodThrow.java
deleted file mode 100644
index 19e6af1..0000000
--- a/ravenwood/annotations-src/android/ravenwood/annotation/RavenwoodThrow.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2023 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 android.ravenwood.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.METHOD;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * THIS ANNOTATION IS EXPERIMENTAL. REACH OUT TO g/ravenwood BEFORE USING IT, OR YOU HAVE ANY
- * QUESTIONS ABOUT IT.
- *
- * TODO: Javadoc
- * TODO: Create "whole-class-throw"?
- *
- * @hide
- */
-@Target({METHOD, CONSTRUCTOR})
-@Retention(RetentionPolicy.CLASS)
-public @interface RavenwoodThrow {
-    /**
-     * One or more classes that aren't yet supported by Ravenwood, which is why this method throws.
-     */
-    Class<?>[] blockedBy() default {};
-
-    /**
-     * General free-form description of why this method throws.
-     */
-    String reason() default "";
-
-    /**
-     * Tracking bug number, if any.
-     */
-    long bug() default 0;
-}
diff --git a/ravenwood/bivalenttest/Android.bp b/ravenwood/bivalenttest/Android.bp
deleted file mode 100644
index e897735..0000000
--- a/ravenwood/bivalenttest/Android.bp
+++ /dev/null
@@ -1,85 +0,0 @@
-package {
-    // See: http://go/android-license-faq
-    // A large-scale-change added 'default_applicable_licenses' to import
-    // all of the 'license_kinds' from "frameworks_base_license"
-    // to get the below license kinds:
-    //   SPDX-license-identifier-Apache-2.0
-    default_applicable_licenses: ["frameworks_base_license"],
-}
-
-cc_library_shared {
-    name: "libravenwoodbivalenttest_jni",
-    host_supported: true,
-
-    cflags: [
-        "-Wall",
-        "-Werror",
-        "-Wno-unused-parameter",
-        "-Wthread-safety",
-    ],
-
-    srcs: [
-        "jni/*.cpp",
-    ],
-
-    shared_libs: [
-        "libbase",
-        "liblog",
-        "libnativehelper",
-        "libutils",
-        "libcutils",
-    ],
-}
-
-android_ravenwood_test {
-    name: "RavenwoodBivalentTest",
-
-    static_libs: [
-        "androidx.annotation_annotation",
-        "androidx.test.ext.junit",
-        "androidx.test.rules",
-
-        "junit-params",
-        "platform-parametric-runner-lib",
-
-        // To make sure it won't cause VerifyError (b/324063814)
-        "platformprotosnano",
-    ],
-    srcs: [
-        "test/**/*.java",
-    ],
-    jni_libs: [
-        "libravenwoodbivalenttest_jni",
-    ],
-    auto_gen_config: true,
-}
-
-android_test {
-    name: "RavenwoodBivalentTest_device",
-
-    srcs: [
-        "test/**/*.java",
-    ],
-    static_libs: [
-        "junit",
-        "truth",
-
-        "androidx.annotation_annotation",
-        "androidx.test.ext.junit",
-        "androidx.test.rules",
-
-        "junit-params",
-        "platform-parametric-runner-lib",
-
-        "ravenwood-junit",
-    ],
-    jni_libs: [
-        "libravenwoodbivalenttest_jni",
-    ],
-    test_suites: [
-        "device-tests",
-    ],
-    optimize: {
-        enabled: false,
-    },
-}
diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java
index 6e73b2c..644babb 100644
--- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java
+++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java
@@ -21,6 +21,8 @@
 import static com.android.ravenwood.common.RavenwoodCommonUtils.RAVENWOOD_VERBOSE_LOGGING;
 import static com.android.ravenwood.common.RavenwoodCommonUtils.RAVENWOOD_VERSION_JAVA_SYSPROP;
 
+import static org.junit.Assert.assertThrows;
+
 import android.app.ActivityManager;
 import android.app.Instrumentation;
 import android.app.ResourcesManager;
@@ -167,6 +169,8 @@
         // This will let AndroidJUnit4 use the original runner.
         System.setProperty("android.junit.runner",
                 "androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner");
+
+        assertMockitoVersion();
     }
 
     /**
@@ -377,6 +381,28 @@
         }
     }
 
+    private static final String MOCKITO_ERROR = "FATAL: Unsupported Mockito detected!"
+            + " Your test or its dependencies use one of the \"mockito-target-*\""
+            + " modules as static library, which is unusable on host side."
+            + " Please switch over to use \"mockito-ravenwood-prebuilt\" as shared library, or"
+            + " as a last resort, set `ravenizer: { strip_mockito: true }` in your test module.";
+
+    /**
+     * Assert the Mockito version at runtime to ensure no incorrect Mockito classes are loaded.
+     */
+    private static void assertMockitoVersion() {
+        // DexMaker should not exist
+        assertThrows(
+                MOCKITO_ERROR,
+                ClassNotFoundException.class,
+                () -> Class.forName("com.android.dx.DexMaker"));
+        // Mockito 2 should not exist
+        assertThrows(
+                MOCKITO_ERROR,
+                ClassNotFoundException.class,
+                () -> Class.forName("org.mockito.Matchers"));
+    }
+
     @SuppressWarnings("unused")  // Called from native code (ravenwood_sysprop.cpp)
     private static void checkSystemPropertyAccess(String key, boolean write) {
         boolean result = write ? sProps.isKeyWritable(key) : sProps.isKeyReadable(key);
diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodTestStats.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodTestStats.java
index 428eb57..b4b8715 100644
--- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodTestStats.java
+++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodTestStats.java
@@ -84,10 +84,10 @@
         try {
             mOutputWriter = new PrintWriter(mOutputFile);
         } catch (IOException e) {
-            throw new RuntimeException("Failed to crete logfile. File=" + mOutputFile, e);
+            throw new RuntimeException("Failed to create logfile. File=" + mOutputFile, e);
         }
 
-        // Crete the "latest" symlink.
+        // Create the "latest" symlink.
         Path symlink = Paths.get(tmpdir, basename + "latest.csv");
         try {
             if (Files.exists(symlink)) {
@@ -96,7 +96,7 @@
             Files.createSymbolicLink(symlink, Paths.get(mOutputFile.getName()));
 
         } catch (IOException e) {
-            throw new RuntimeException("Failed to crete logfile. File=" + mOutputFile, e);
+            throw new RuntimeException("Failed to create logfile. File=" + mOutputFile, e);
         }
 
         Log.i(TAG, "Test result stats file: " + mOutputFile);
diff --git a/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodCommonUtils.java b/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodCommonUtils.java
index ef795c6..520f050 100644
--- a/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodCommonUtils.java
+++ b/ravenwood/runtime-common-src/com/android/ravenwood/common/RavenwoodCommonUtils.java
@@ -37,8 +37,6 @@
     private RavenwoodCommonUtils() {
     }
 
-    private static final Object sLock = new Object();
-
     /**
      * If set to "1", we enable the verbose logging.
      *
@@ -68,9 +66,6 @@
 
     public static final String RAVENWOOD_VERSION_JAVA_SYSPROP = "android.ravenwood.version";
 
-    // @GuardedBy("sLock")
-    private static boolean sIntegrityChecked = false;
-
     /**
      * @return if we're running on Ravenwood.
      */
diff --git a/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java b/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java
index 4e7dc5d..ad86135 100644
--- a/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java
+++ b/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java
@@ -32,25 +32,20 @@
 
     public static NativeAllocationRegistry createNonmalloced(
             ClassLoader classLoader, long freeFunction, long size) {
-        return new NativeAllocationRegistry(classLoader, freeFunction, size, false);
+        return new NativeAllocationRegistry(classLoader, freeFunction, size);
     }
 
     public static NativeAllocationRegistry createMalloced(
             ClassLoader classLoader, long freeFunction, long size) {
-        return new NativeAllocationRegistry(classLoader, freeFunction, size, true);
+        return new NativeAllocationRegistry(classLoader, freeFunction, size);
     }
 
     public static NativeAllocationRegistry createMalloced(
             ClassLoader classLoader, long freeFunction) {
-        return new NativeAllocationRegistry(classLoader, freeFunction, 0, true);
+        return new NativeAllocationRegistry(classLoader, freeFunction, 0);
     }
 
     public NativeAllocationRegistry(ClassLoader classLoader, long freeFunction, long size) {
-        this(classLoader, freeFunction, size, size == 0);
-    }
-
-    private NativeAllocationRegistry(ClassLoader classLoader, long freeFunction, long size,
-            boolean mallocAllocation) {
         if (size < 0) {
             throw new IllegalArgumentException("Invalid native allocation size: " + size);
         }
diff --git a/ravenwood/runtime-jni/ravenwood_sysprop.cpp b/ravenwood/runtime-jni/ravenwood_sysprop.cpp
index 4fb61b6..aafc426 100644
--- a/ravenwood/runtime-jni/ravenwood_sysprop.cpp
+++ b/ravenwood/runtime-jni/ravenwood_sysprop.cpp
@@ -56,7 +56,7 @@
     if (key == nullptr || *key == '\0') return false;
     if (value == nullptr) value = "";
     bool read_only = !strncmp(key, "ro.", 3);
-    if (!read_only && strlen(value) >= PROP_VALUE_MAX) return -1;
+    if (!read_only && strlen(value) >= PROP_VALUE_MAX) return false;
 
     std::lock_guard lock(g_properties_lock);
     auto [it, success] = g_properties.emplace(key, value);
diff --git a/ravenwood/tests/bivalenttest/Android.bp b/ravenwood/tests/bivalenttest/Android.bp
new file mode 100644
index 0000000..ac499b9
--- /dev/null
+++ b/ravenwood/tests/bivalenttest/Android.bp
@@ -0,0 +1,87 @@
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "frameworks_base_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["frameworks_base_license"],
+}
+
+cc_library_shared {
+    name: "libravenwoodbivalenttest_jni",
+    host_supported: true,
+
+    cflags: [
+        "-Wall",
+        "-Werror",
+        "-Wno-unused-parameter",
+        "-Wthread-safety",
+    ],
+
+    srcs: [
+        "jni/*.cpp",
+    ],
+
+    shared_libs: [
+        "libbase",
+        "liblog",
+        "libnativehelper",
+        "libutils",
+        "libcutils",
+    ],
+}
+
+android_ravenwood_test {
+    name: "RavenwoodBivalentTest",
+
+    static_libs: [
+        "androidx.annotation_annotation",
+        "androidx.test.ext.junit",
+        "androidx.test.rules",
+
+        "junit-params",
+        "platform-parametric-runner-lib",
+
+        // To make sure it won't cause VerifyError (b/324063814)
+        "platformprotosnano",
+    ],
+    srcs: [
+        "test/**/*.java",
+    ],
+    jni_libs: [
+        "libravenwoodbivalenttest_jni",
+    ],
+    auto_gen_config: true,
+}
+
+// TODO(b/371215487): migrate bivalenttest.ravenizer tests to another architecture
+
+// android_test {
+//     name: "RavenwoodBivalentTest_device",
+//
+//     srcs: [
+//         "test/**/*.java",
+//     ],
+//     static_libs: [
+//         "junit",
+//         "truth",
+//
+//         "androidx.annotation_annotation",
+//         "androidx.test.ext.junit",
+//         "androidx.test.rules",
+//
+//         "junit-params",
+//         "platform-parametric-runner-lib",
+//
+//         "ravenwood-junit",
+//     ],
+//     jni_libs: [
+//         "libravenwoodbivalenttest_jni",
+//     ],
+//     test_suites: [
+//         "device-tests",
+//     ],
+//     optimize: {
+//         enabled: false,
+//     },
+// }
diff --git a/ravenwood/bivalenttest/AndroidManifest.xml b/ravenwood/tests/bivalenttest/AndroidManifest.xml
similarity index 100%
rename from ravenwood/bivalenttest/AndroidManifest.xml
rename to ravenwood/tests/bivalenttest/AndroidManifest.xml
diff --git a/ravenwood/bivalenttest/AndroidTest.xml b/ravenwood/tests/bivalenttest/AndroidTest.xml
similarity index 100%
rename from ravenwood/bivalenttest/AndroidTest.xml
rename to ravenwood/tests/bivalenttest/AndroidTest.xml
diff --git a/ravenwood/bivalenttest/README.md b/ravenwood/tests/bivalenttest/README.md
similarity index 100%
rename from ravenwood/bivalenttest/README.md
rename to ravenwood/tests/bivalenttest/README.md
diff --git a/ravenwood/bivalenttest/jni/ravenwood_core_test_jni.cpp b/ravenwood/tests/bivalenttest/jni/ravenwood_core_test_jni.cpp
similarity index 100%
rename from ravenwood/bivalenttest/jni/ravenwood_core_test_jni.cpp
rename to ravenwood/tests/bivalenttest/jni/ravenwood_core_test_jni.cpp
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodAndroidApiTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodAndroidApiTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodAndroidApiTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodAndroidApiTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodClassRuleDeviceOnlyTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodClassRuleDeviceOnlyTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodClassRuleDeviceOnlyTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodClassRuleDeviceOnlyTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodConfigTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodConfigTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodConfigTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodConfigTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodJniTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodJniTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodJniTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodJniTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodMultipleRuleTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodMultipleRuleTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodMultipleRuleTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodMultipleRuleTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodNativeAllocationRegistryTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodNativeAllocationRegistryTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodNativeAllocationRegistryTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodNativeAllocationRegistryTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodNoConfigNoRuleTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodNoConfigNoRuleTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodNoConfigNoRuleTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodNoConfigNoRuleTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodRuleTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodRuleTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodRuleTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodRuleTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/CallTracker.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/CallTracker.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/CallTracker.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/CallTracker.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodAwareTestRunnerTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodAwareTestRunnerTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodAwareTestRunnerTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodAwareTestRunnerTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitClassRuleDeviceOnlyTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitClassRuleDeviceOnlyTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitClassRuleDeviceOnlyTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitClassRuleDeviceOnlyTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitRuleOrderRewriteTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitRuleOrderRewriteTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitRuleOrderRewriteTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitRuleOrderRewriteTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitRuleShadowingTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitRuleShadowingTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitRuleShadowingTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitRuleShadowingTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitRuleShadowingTestBase.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitRuleShadowingTestBase.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitRuleShadowingTestBase.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodImplicitRuleShadowingTestBase.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodNoRavenizerTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodNoRavenizerTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodNoRavenizerTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodNoRavenizerTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunDisabledTestsReallyDisabledTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunDisabledTestsReallyDisabledTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunDisabledTestsReallyDisabledTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunDisabledTestsReallyDisabledTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunDisabledTestsTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunDisabledTestsTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunDisabledTestsTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunDisabledTestsTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunnerWithAndroidXRunnerTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunnerWithAndroidXRunnerTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunnerWithAndroidXRunnerTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunnerWithAndroidXRunnerTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunnerWithJUnitParamsRunnerTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunnerWithJUnitParamsRunnerTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunnerWithJUnitParamsRunnerTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunnerWithJUnitParamsRunnerTest.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunnerWithParameterizedAndroidJunit4Test.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunnerWithParameterizedAndroidJunit4Test.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunnerWithParameterizedAndroidJunit4Test.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodRunnerWithParameterizedAndroidJunit4Test.java
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodSuiteTest.java b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodSuiteTest.java
similarity index 100%
rename from ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodSuiteTest.java
rename to ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/ravenizer/RavenwoodSuiteTest.java
diff --git a/ravenwood/tests/coretest/Android.bp b/ravenwood/tests/coretest/Android.bp
index d94475c..85f1baf 100644
--- a/ravenwood/tests/coretest/Android.bp
+++ b/ravenwood/tests/coretest/Android.bp
@@ -17,9 +17,15 @@
         "junit-params",
         "platform-parametric-runner-lib",
         "truth",
+
+        // This library should be removed by Ravenizer
+        "mockito-target-minus-junit4",
     ],
     srcs: [
         "test/**/*.java",
     ],
+    ravenizer: {
+        strip_mockito: true,
+    },
     auto_gen_config: true,
 }
diff --git a/ravenwood/tests/coretest/test/com/android/ravenwoodtest/coretest/RavenwoodMockitoTest.java b/ravenwood/tests/coretest/test/com/android/ravenwoodtest/coretest/RavenwoodMockitoTest.java
new file mode 100644
index 0000000..31884b6
--- /dev/null
+++ b/ravenwood/tests/coretest/test/com/android/ravenwoodtest/coretest/RavenwoodMockitoTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2024 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.ravenwoodtest.coretest;
+
+import static org.junit.Assert.assertThrows;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+
+import org.junit.Test;
+
+public class RavenwoodMockitoTest {
+
+    private static class MockClass {
+        void foo() {
+            throw new RuntimeException("Unsupported!!");
+        }
+    }
+
+    @Test
+    public void checkMockitoClasses() {
+        // DexMaker should not exist
+        assertThrows(
+                ClassNotFoundException.class,
+                () -> Class.forName("com.android.dx.DexMaker"));
+        // Mockito 2 should not exist
+        assertThrows(
+                ClassNotFoundException.class,
+                () -> Class.forName("org.mockito.Matchers"));
+    }
+
+    @Test
+    public void checkMockitoActuallyWorks() {
+        var mock = mock(MockClass.class);
+        doNothing().when(mock).foo();
+        mock.foo();
+    }
+}
diff --git a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Ravenizer.kt b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Ravenizer.kt
index f7f9a85..e67c730 100644
--- a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Ravenizer.kt
+++ b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Ravenizer.kt
@@ -85,18 +85,17 @@
 /**
  * Main class.
  */
-class Ravenizer(val options: RavenizerOptions) {
-    fun run() {
+class Ravenizer {
+    fun run(options: RavenizerOptions) {
         val stats = RavenizerStats()
 
-        val fatalValidation = options.fatalValidation.get
-
         stats.totalTime = log.nTime {
             process(
                 options.inJar.get,
                 options.outJar.get,
                 options.enableValidation.get,
-                fatalValidation,
+                options.fatalValidation.get,
+                options.stripMockito.get,
                 stats,
             )
         }
@@ -108,6 +107,7 @@
         outJar: String,
         enableValidation: Boolean,
         fatalValidation: Boolean,
+        stripMockito: Boolean,
         stats: RavenizerStats,
     ) {
         var allClasses = ClassNodes.loadClassStructures(inJar) {
@@ -126,6 +126,9 @@
                 }
             }
         }
+        if (includeUnsupportedMockito(allClasses)) {
+            log.w("Unsupported Mockito detected in $inJar!")
+        }
 
         stats.totalProcessTime = log.vTime("$executableName processing $inJar") {
             ZipFile(inJar).use { inZip ->
@@ -145,6 +148,11 @@
                             )
                         }
 
+                        if (stripMockito && entry.name.isMockitoFile()) {
+                            // Skip this entry
+                            continue
+                        }
+
                         val className = zipEntryNameToClassName(entry.name)
 
                         if (className != null) {
diff --git a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerMain.kt b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerMain.kt
index ff41818..aee4530 100644
--- a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerMain.kt
+++ b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerMain.kt
@@ -36,6 +36,6 @@
         log.v("Options: $options")
 
         // Run.
-        Ravenizer(options).run()
+        Ravenizer().run(options)
     }
 }
diff --git a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerOptions.kt b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerOptions.kt
index 10fe0a3..32dcbe5 100644
--- a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerOptions.kt
+++ b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerOptions.kt
@@ -47,6 +47,9 @@
 
     /** Whether the validation failure is fatal or not. */
     var fatalValidation: SetOnce<Boolean> = SetOnce(false),
+
+    /** Whether to remove mockito and dexmaker classes. */
+    var stripMockito: SetOnce<Boolean> = SetOnce(false),
 ) {
     companion object {
 
@@ -85,6 +88,9 @@
                         "--fatal-validation" -> ret.fatalValidation.set(true)
                         "--no-fatal-validation" -> ret.fatalValidation.set(false)
 
+                        "--strip-mockito" -> ret.stripMockito.set(true)
+                        "--no-strip-mockito" -> ret.stripMockito.set(false)
+
                         else -> throw ArgumentsException("Unknown option: $arg")
                     }
                 } catch (e: SetOnce.SetMoreThanOnceException) {
diff --git a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Utils.kt b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Utils.kt
index 1aa70c08..37a7975 100644
--- a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Utils.kt
+++ b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Utils.kt
@@ -100,3 +100,19 @@
         // TODO -- anything else?
     )
 }
+
+/**
+ * Files that should be removed when "--strip-mockito" is set.
+ */
+fun String.isMockitoFile(): Boolean {
+    return this.startsWithAny(
+        "org/mockito/", // Mockito
+        "com/android/dx/", // DexMaker
+        "mockito-extensions/", // DexMaker overrides
+    )
+}
+
+fun includeUnsupportedMockito(classes: ClassNodes): Boolean {
+    return classes.findClass("com/android/dx/DexMaker") != null
+            || classes.findClass("org/mockito/Matchers") != null
+}
diff --git a/services/accessibility/accessibility.aconfig b/services/accessibility/accessibility.aconfig
index ee3bbca..034127c 100644
--- a/services/accessibility/accessibility.aconfig
+++ b/services/accessibility/accessibility.aconfig
@@ -162,6 +162,13 @@
 }
 
 flag {
+    name: "magnification_enlarge_pointer"
+    namespace: "accessibility"
+    description: "When fullscreen magnification is enabled, pointer icon is enlarged"
+    bug: "355734856"
+}
+
+flag {
     name: "manager_avoid_receiver_timeout"
     namespace: "accessibility"
     description: "Register receivers on background handler so they have more time to complete"
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index 3224b27..73b7b35 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -165,16 +165,27 @@
     protected final AccessibilitySecurityPolicy mSecurityPolicy;
     protected final AccessibilityTrace mTrace;
 
-    // The attribution tag set by the service that is bound to this instance
+    /** The attribution tag set by the client that is bound to this instance */
     protected String mAttributionTag;
 
     protected int mDisplayTypes = DISPLAY_TYPE_DEFAULT;
 
-    // The service that's bound to this instance. Whenever this value is non-null, this
-    // object is registered as a death recipient
-    IBinder mService;
+    /**
+     * Binder of the {@link #mClient}.
+     *
+     * <p>Whenever this value is non-null, it should be registered as a {@link
+     * IBinder.DeathRecipient}
+     */
+    @Nullable IBinder mClientBinder;
 
-    IAccessibilityServiceClient mServiceInterface;
+    /**
+     * The accessibility client this class represents.
+     *
+     * <p>The client is in the application process, i.e., it's a client of system_server. Depending
+     * on the use case, the client can be an {@link AccessibilityService}, a {@code UiAutomation},
+     * etc.
+     */
+    @Nullable IAccessibilityServiceClient mClient;
 
     int mEventTypes;
 
@@ -218,10 +229,10 @@
     int mGenericMotionEventSources;
     int mObservedMotionEventSources;
 
-    // the events pending events to be dispatched to this service
+    /** Pending events to be dispatched to the client */
     final SparseArray<AccessibilityEvent> mPendingEvents = new SparseArray<>();
 
-    /** Whether this service relies on its {@link AccessibilityCache} being up to date */
+    /** Whether the client relies on its {@link AccessibilityCache} being up to date */
     boolean mUsesAccessibilityCache = false;
 
     // Handler only for dispatching accessibility events since we use event
@@ -230,7 +241,7 @@
 
     final SparseArray<IBinder> mOverlayWindowTokens = new SparseArray();
 
-    // All the embedded accessibility overlays that have been added by this service.
+    /** All the embedded accessibility overlays that have been added by the client. */
     private List<SurfaceControl> mOverlays = new ArrayList<>();
 
     /** The timestamp of requesting to take screenshot in milliseconds */
@@ -274,7 +285,8 @@
 
         /**
          * Called back to notify system that the client has changed
-         * @param serviceInfoChanged True if the service's AccessibilityServiceInfo changed.
+         *
+         * @param serviceInfoChanged True if the client's AccessibilityServiceInfo changed.
          */
         void onClientChangeLocked(boolean serviceInfoChanged);
 
@@ -360,21 +372,22 @@
         mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
         mIPlatformCompat = IPlatformCompat.Stub.asInterface(
                 ServiceManager.getService(Context.PLATFORM_COMPAT_SERVICE));
-        mEventDispatchHandler = new Handler(mainHandler.getLooper()) {
-            @Override
-            public void handleMessage(Message message) {
-                final int eventType =  message.what;
-                AccessibilityEvent event = (AccessibilityEvent) message.obj;
-                boolean serviceWantsEvent = message.arg1 != 0;
-                notifyAccessibilityEventInternal(eventType, event, serviceWantsEvent);
-            }
-        };
+        mEventDispatchHandler =
+                new Handler(mainHandler.getLooper()) {
+                    @Override
+                    public void handleMessage(Message message) {
+                        final int eventType = message.what;
+                        AccessibilityEvent event = (AccessibilityEvent) message.obj;
+                        boolean clientWantsEvent = message.arg1 != 0;
+                        notifyAccessibilityEventInternal(eventType, event, clientWantsEvent);
+                    }
+                };
         setDynamicallyConfigurableProperties(accessibilityServiceInfo);
     }
 
     @Override
     public boolean onKeyEvent(KeyEvent keyEvent, int sequenceNumber) {
-        if (!mRequestFilterKeyEvents || (mServiceInterface == null)) {
+        if (!mRequestFilterKeyEvents || (mClient == null)) {
             return false;
         }
         if((mAccessibilityServiceInfo.getCapabilities()
@@ -388,7 +401,7 @@
             if (svcClientTracingEnabled()) {
                 logTraceSvcClient("onKeyEvent", keyEvent + ", " + sequenceNumber);
             }
-            mServiceInterface.onKeyEvent(keyEvent, sequenceNumber);
+            mClient.onKeyEvent(keyEvent, sequenceNumber);
         } catch (RemoteException e) {
             return false;
         }
@@ -470,7 +483,7 @@
     }
 
     public boolean canReceiveEventsLocked() {
-        return (mEventTypes != 0 && mService != null);
+        return (mEventTypes != 0 && mClientBinder != null);
     }
 
     @RequiresNoPermission
@@ -520,7 +533,7 @@
         final long identity = Binder.clearCallingIdentity();
         try {
             synchronized (mLock) {
-                // If the XML manifest had data to configure the service its info
+                // If the XML manifest had data to configure the AccessibilityService, its info
                 // should be already set. In such a case update only the dynamically
                 // configurable properties.
                 boolean oldRequestIme = mRequestImeApis;
@@ -1733,40 +1746,40 @@
         try {
             // Clear the proxy in the other process so this
             // IAccessibilityServiceConnection can be garbage collected.
-            if (mServiceInterface != null) {
+            if (mClient != null) {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient("init", "null, " + mId + ", null");
                 }
-                mServiceInterface.init(null, mId, null);
+                mClient.init(null, mId, null);
             }
         } catch (RemoteException re) {
                 /* ignore */
         }
-        if (mService != null) {
+        if (mClientBinder != null) {
             try {
-                mService.unlinkToDeath(this, 0);
+                mClientBinder.unlinkToDeath(this, 0);
             } catch (NoSuchElementException e) {
                 Slog.e(LOG_TAG, "Failed unregistering death link");
             }
-            mService = null;
+            mClientBinder = null;
         }
 
-        mServiceInterface = null;
+        mClient = null;
         mReceivedAccessibilityButtonCallbackSinceBind = false;
     }
 
     public boolean isConnectedLocked() {
-        return (mService != null);
+        return (mClientBinder != null);
     }
 
     public void notifyAccessibilityEvent(AccessibilityEvent event) {
         synchronized (mLock) {
             final int eventType = event.getEventType();
 
-            final boolean serviceWantsEvent = wantsEventLocked(event);
+            final boolean clientWantsEvent = clientWantsEventLocked(event);
             final boolean requiredForCacheConsistency = mUsesAccessibilityCache
                     && ((AccessibilityCache.CACHE_CRITICAL_EVENTS_MASK & eventType) != 0);
-            if (!serviceWantsEvent && !requiredForCacheConsistency) {
+            if (!clientWantsEvent && !requiredForCacheConsistency) {
                 return;
             }
 
@@ -1774,7 +1787,7 @@
                 return;
             }
             // Make a copy since during dispatch it is possible the event to
-            // be modified to remove its source if the receiving service does
+            // be modified to remove its source if the receiving client does
             // not have permission to access the window content.
             AccessibilityEvent newEvent = AccessibilityEvent.obtain(event);
             Message message;
@@ -1792,22 +1805,20 @@
                 // Send all messages, bypassing mPendingEvents
                 message = mEventDispatchHandler.obtainMessage(eventType, newEvent);
             }
-            message.arg1 = serviceWantsEvent ? 1 : 0;
+            message.arg1 = clientWantsEvent ? 1 : 0;
 
             mEventDispatchHandler.sendMessageDelayed(message, mNotificationTimeout);
         }
     }
 
     /**
-     * Determines if given event can be dispatched to a service based on the package of the
-     * event source. Specifically, a service is notified if it is interested in events from the
-     * package.
+     * Determines if given event can be dispatched to a client based on the package of the event
+     * source. Specifically, a client is notified if it is interested in events from the package.
      *
      * @param event The event.
-     * @return True if the listener should be notified, false otherwise.
+     * @return True if the client should be notified, false otherwise.
      */
-    private boolean wantsEventLocked(AccessibilityEvent event) {
-
+    private boolean clientWantsEventLocked(AccessibilityEvent event) {
         if (!canReceiveEventsLocked()) {
             return false;
         }
@@ -1838,22 +1849,20 @@
     }
 
     /**
-     * Notifies an accessibility service client for a scheduled event given the event type.
+     * Notifies a client for a scheduled event given the event type.
      *
      * @param eventType The type of the event to dispatch.
      */
     private void notifyAccessibilityEventInternal(
-            int eventType,
-            AccessibilityEvent event,
-            boolean serviceWantsEvent) {
-        IAccessibilityServiceClient listener;
+            int eventType, AccessibilityEvent event, boolean clientWantsEvent) {
+        IAccessibilityServiceClient client;
 
         synchronized (mLock) {
-            listener = mServiceInterface;
+            client = mClient;
 
-            // If the service died/was disabled while the message for dispatching
-            // the accessibility event was propagating the listener may be null.
-            if (listener == null) {
+            // If the client (in the application process) died/was disabled while the message for
+            // dispatching the accessibility event was propagating, "client" may be null.
+            if (client == null) {
                 return;
             }
 
@@ -1868,7 +1877,7 @@
                 //   1) A binder thread calls notifyAccessibilityServiceDelayedLocked
                 //      which posts a message for dispatching an event and stores the event
                 //      in mPendingEvents.
-                //   2) The message is pulled from the queue by the handler on the service
+                //   2) The message is pulled from the queue by the handler on the client
                 //      thread and this method is just about to acquire the lock.
                 //   3) Another binder thread acquires the lock in notifyAccessibilityEvent
                 //   4) notifyAccessibilityEvent recycles the event that this method was about
@@ -1876,7 +1885,7 @@
                 //   5) This method grabs the new event, processes it, and removes it from
                 //      mPendingEvents
                 //   6) The second message dispatched in (4) arrives, but the event has been
-                //      remvoved in (5).
+                //      removed in (5).
                 event = mPendingEvents.get(eventType);
                 if (event == null) {
                     return;
@@ -1893,14 +1902,14 @@
 
         try {
             if (svcClientTracingEnabled()) {
-                logTraceSvcClient("onAccessibilityEvent", event + ";" + serviceWantsEvent);
+                logTraceSvcClient("onAccessibilityEvent", event + ";" + clientWantsEvent);
             }
-            listener.onAccessibilityEvent(event, serviceWantsEvent);
+            client.onAccessibilityEvent(event, clientWantsEvent);
             if (DEBUG) {
-                Slog.i(LOG_TAG, "Event " + event + " sent to " + listener);
+                Slog.i(LOG_TAG, "Event " + event + " sent to " + client);
             }
         } catch (RemoteException re) {
-            Slog.e(LOG_TAG, "Error during sending " + event + " to " + listener, re);
+            Slog.e(LOG_TAG, "Error during sending " + event + " to " + client, re);
         } finally {
             event.recycle();
         }
@@ -1978,122 +1987,126 @@
         return (mGenericMotionEventSources & eventSourceWithoutClass) != 0;
     }
 
-
     /**
-     * Called by the invocation handler to notify the service that the
-     * state of magnification has changed.
+     * Called by the invocation handler to notify the client that the state of magnification has
+     * changed.
      */
-    private void notifyMagnificationChangedInternal(int displayId, @NonNull Region region,
-            @NonNull MagnificationConfig config) {
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null) {
+    private void notifyMagnificationChangedInternal(
+            int displayId, @NonNull Region region, @NonNull MagnificationConfig config) {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null) {
             try {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient("onMagnificationChanged", displayId + ", " + region + ", "
                             + config.toString());
                 }
-                listener.onMagnificationChanged(displayId, region, config);
+                client.onMagnificationChanged(displayId, region, config);
             } catch (RemoteException re) {
-                Slog.e(LOG_TAG, "Error sending magnification changes to " + mService, re);
+                Slog.e(LOG_TAG, "Error sending magnification changes to " + mClientBinder, re);
             }
         }
     }
 
     /**
-     * Called by the invocation handler to notify the service that the state of the soft
-     * keyboard show mode has changed.
+     * Called by the invocation handler to notify the client that the state of the soft keyboard
+     * show mode has changed.
      */
     private void notifySoftKeyboardShowModeChangedInternal(int showState) {
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null) {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null) {
             try {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient("onSoftKeyboardShowModeChanged", String.valueOf(showState));
                 }
-                listener.onSoftKeyboardShowModeChanged(showState);
+                client.onSoftKeyboardShowModeChanged(showState);
             } catch (RemoteException re) {
-                Slog.e(LOG_TAG, "Error sending soft keyboard show mode changes to " + mService,
+                Slog.e(
+                        LOG_TAG,
+                        "Error sending soft keyboard show mode changes to " + mClientBinder,
                         re);
             }
         }
     }
 
     private void notifyAccessibilityButtonClickedInternal(int displayId) {
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null) {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null) {
             try {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient("onAccessibilityButtonClicked", String.valueOf(displayId));
                 }
-                listener.onAccessibilityButtonClicked(displayId);
+                client.onAccessibilityButtonClicked(displayId);
             } catch (RemoteException re) {
-                Slog.e(LOG_TAG, "Error sending accessibility button click to " + mService, re);
+                Slog.e(LOG_TAG, "Error sending accessibility button click to " + mClientBinder, re);
             }
         }
     }
 
     private void notifyAccessibilityButtonAvailabilityChangedInternal(boolean available) {
-        // Only notify the service if it's not been notified or the state has changed
+        // Only notify the client if it's not been notified or the state has changed
         if (mReceivedAccessibilityButtonCallbackSinceBind
                 && (mLastAccessibilityButtonCallbackState == available)) {
             return;
         }
         mReceivedAccessibilityButtonCallbackSinceBind = true;
         mLastAccessibilityButtonCallbackState = available;
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null) {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null) {
             try {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient("onAccessibilityButtonAvailabilityChanged",
                             String.valueOf(available));
                 }
-                listener.onAccessibilityButtonAvailabilityChanged(available);
+                client.onAccessibilityButtonAvailabilityChanged(available);
             } catch (RemoteException re) {
-                Slog.e(LOG_TAG,
-                        "Error sending accessibility button availability change to " + mService,
+                Slog.e(
+                        LOG_TAG,
+                        "Error sending accessibility button availability change to "
+                                + mClientBinder,
                         re);
             }
         }
     }
 
     private void notifyGestureInternal(AccessibilityGestureEvent gestureInfo) {
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null) {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null) {
             try {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient("onGesture", gestureInfo.toString());
                 }
-                listener.onGesture(gestureInfo);
+                client.onGesture(gestureInfo);
             } catch (RemoteException re) {
-                Slog.e(LOG_TAG, "Error during sending gesture " + gestureInfo
-                        + " to " + mService, re);
-            }
-        }
-    }
-
-    private void notifySystemActionsChangedInternal() {
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null) {
-            try {
-                if (svcClientTracingEnabled()) {
-                    logTraceSvcClient("onSystemActionsChanged", "");
-                }
-                listener.onSystemActionsChanged();
-            } catch (RemoteException re) {
-                Slog.e(LOG_TAG, "Error sending system actions change to " + mService,
+                Slog.e(
+                        LOG_TAG,
+                        "Error during sending gesture " + gestureInfo + " to " + mClientBinder,
                         re);
             }
         }
     }
 
+    private void notifySystemActionsChangedInternal() {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null) {
+            try {
+                if (svcClientTracingEnabled()) {
+                    logTraceSvcClient("onSystemActionsChanged", "");
+                }
+                client.onSystemActionsChanged();
+            } catch (RemoteException re) {
+                Slog.e(LOG_TAG, "Error sending system actions change to " + mClientBinder, re);
+            }
+        }
+    }
+
     private void notifyClearAccessibilityCacheInternal() {
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null) {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null) {
             try {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient("clearAccessibilityCache", "");
                 }
-                listener.clearAccessibilityCache();
+                client.clearAccessibilityCache();
             } catch (RemoteException re) {
                 Slog.e(LOG_TAG, "Error during requesting accessibility info cache"
                         + " to be cleared.", re);
@@ -2106,70 +2119,66 @@
 
     private void setImeSessionEnabledInternal(IAccessibilityInputMethodSession session,
             boolean enabled) {
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null && session != null) {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null && session != null) {
             try {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient("createImeSession", "");
                 }
-                listener.setImeSessionEnabled(session, enabled);
+                client.setImeSessionEnabled(session, enabled);
             } catch (RemoteException re) {
-                Slog.e(LOG_TAG,
-                        "Error requesting IME session from " + mService, re);
+                Slog.e(LOG_TAG, "Error requesting IME session from " + mClientBinder, re);
             }
         }
     }
 
     private void bindInputInternal() {
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null) {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null) {
             try {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient("bindInput", "");
                 }
-                listener.bindInput();
+                client.bindInput();
             } catch (RemoteException re) {
-                Slog.e(LOG_TAG,
-                        "Error binding input to " + mService, re);
+                Slog.e(LOG_TAG, "Error binding input to " + mClientBinder, re);
             }
         }
     }
 
     private void unbindInputInternal() {
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null) {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null) {
             try {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient("unbindInput", "");
                 }
-                listener.unbindInput();
+                client.unbindInput();
             } catch (RemoteException re) {
-                Slog.e(LOG_TAG,
-                        "Error unbinding input to " + mService, re);
+                Slog.e(LOG_TAG, "Error unbinding input to " + mClientBinder, re);
             }
         }
     }
 
     private void startInputInternal(IRemoteAccessibilityInputConnection connection,
             EditorInfo editorInfo, boolean restarting) {
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null) {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null) {
             try {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient("startInput", "editorInfo=" + editorInfo
                             + " restarting=" + restarting);
                 }
-                listener.startInput(connection, editorInfo, restarting);
+                client.startInput(connection, editorInfo, restarting);
             } catch (RemoteException re) {
-                Slog.e(LOG_TAG,
-                        "Error starting input to " + mService, re);
+                Slog.e(LOG_TAG, "Error starting input to " + mClientBinder, re);
             }
         }
     }
 
-    protected IAccessibilityServiceClient getServiceInterfaceSafely() {
+    protected IAccessibilityServiceClient getClientSafely() {
         synchronized (mLock) {
-            return mServiceInterface;
+            return mClient;
         }
     }
 
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 7580b69..d595d02 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -1435,8 +1435,8 @@
                 interfacesToInterrupt = new ArrayList<>(services.size());
                 for (int i = 0; i < services.size(); i++) {
                     AccessibilityServiceConnection service = services.get(i);
-                    IBinder a11yServiceBinder = service.mService;
-                    IAccessibilityServiceClient a11yServiceInterface = service.mServiceInterface;
+                    IBinder a11yServiceBinder = service.mClientBinder;
+                    IAccessibilityServiceClient a11yServiceInterface = service.mClient;
                     if ((a11yServiceBinder != null) && (a11yServiceInterface != null)) {
                         interfacesToInterrupt.add(a11yServiceInterface);
                     }
@@ -4962,9 +4962,14 @@
                 if (android.permission.flags.Flags.enhancedConfirmationModeApisEnabled()
                         && android.security.Flags.extendEcmToAllSettings()) {
                     try {
-                        return !mContext.getSystemService(EnhancedConfirmationManager.class)
-                                .isRestricted(packageName,
-                                        AppOpsManager.OPSTR_BIND_ACCESSIBILITY_SERVICE);
+                        final EnhancedConfirmationManager userContextEcm =
+                                mContext.createContextAsUser(UserHandle.of(userId), /* flags = */ 0)
+                                        .getSystemService(EnhancedConfirmationManager.class);
+                        if (userContextEcm != null) {
+                            return !userContextEcm.isRestricted(packageName,
+                                    AppOpsManager.OPSTR_BIND_ACCESSIBILITY_SERVICE);
+                        }
+                        return false;
                     } catch (PackageManager.NameNotFoundException e) {
                         Log.e(LOG_TAG, "Exception when retrieving package:" + packageName, e);
                         return false;
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
index 786d167..15999d1 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
@@ -166,8 +166,9 @@
             if (userState.getBindInstantServiceAllowedLocked()) {
                 flags |= Context.BIND_ALLOW_INSTANT;
             }
-            if (mService == null && mContext.bindServiceAsUser(
-                    mIntent, this, flags, new UserHandle(userState.mUserId))) {
+            if (mClientBinder == null
+                    && mContext.bindServiceAsUser(
+                            mIntent, this, flags, new UserHandle(userState.mUserId))) {
                 userState.getBindingServicesLocked().add(mComponentName);
             }
         } finally {
@@ -227,20 +228,20 @@
             addWindowTokensForAllDisplays();
         }
         synchronized (mLock) {
-            if (mService != service) {
-                if (mService != null) {
-                    mService.unlinkToDeath(this, 0);
+            if (mClientBinder != service) {
+                if (mClientBinder != null) {
+                    mClientBinder.unlinkToDeath(this, 0);
                 }
-                mService = service;
+                mClientBinder = service;
                 try {
-                    mService.linkToDeath(this, 0);
+                    mClientBinder.linkToDeath(this, 0);
                 } catch (RemoteException re) {
                     Slog.e(LOG_TAG, "Failed registering death link");
                     binderDied();
                     return;
                 }
             }
-            mServiceInterface = IAccessibilityServiceClient.Stub.asInterface(service);
+            mClient = IAccessibilityServiceClient.Stub.asInterface(service);
             if (userState == null) return;
             userState.addServiceLocked(this);
             mSystemSupport.onClientChangeLocked(false);
@@ -261,7 +262,7 @@
     }
 
     private void initializeService() {
-        IAccessibilityServiceClient serviceInterface = null;
+        IAccessibilityServiceClient client = null;
         synchronized (mLock) {
             AccessibilityUserState userState = mUserStateWeakReference.get();
             if (userState == null) return;
@@ -272,18 +273,17 @@
                 bindingServices.remove(mComponentName);
                 crashedServices.remove(mComponentName);
                 mAccessibilityServiceInfo.crashed = false;
-                serviceInterface = mServiceInterface;
+                client = mClient;
             }
             // There's a chance that service is removed from enabled_accessibility_services setting
             // key, but skip unbinding because of it's in binding state. Unbinds it if it's
             // not in enabled service list.
-            if (serviceInterface != null
-                    && !userState.getEnabledServicesLocked().contains(mComponentName)) {
+            if (client != null && !userState.getEnabledServicesLocked().contains(mComponentName)) {
                 mSystemSupport.onClientChangeLocked(false);
                 return;
             }
         }
-        if (serviceInterface == null) {
+        if (client == null) {
             binderDied();
             return;
         }
@@ -292,10 +292,9 @@
                 logTraceSvcClient("init",
                         this + "," + mId + "," + mOverlayWindowTokens.get(Display.DEFAULT_DISPLAY));
             }
-            serviceInterface.init(this, mId, mOverlayWindowTokens.get(Display.DEFAULT_DISPLAY));
+            client.init(this, mId, mOverlayWindowTokens.get(Display.DEFAULT_DISPLAY));
         } catch (RemoteException re) {
-            Slog.w(LOG_TAG, "Error while setting connection for service: "
-                    + serviceInterface, re);
+            Slog.w(LOG_TAG, "Error while setting connection for service: " + client, re);
             binderDied();
         }
     }
@@ -496,7 +495,7 @@
 
     @Override
     public boolean isCapturingFingerprintGestures() {
-        return (mServiceInterface != null)
+        return (mClient != null)
                 && mSecurityPolicy.canCaptureFingerprintGestures(this)
                 && mCaptureFingerprintGestures;
     }
@@ -506,17 +505,17 @@
         if (!isCapturingFingerprintGestures()) {
             return;
         }
-        IAccessibilityServiceClient serviceInterface;
+        IAccessibilityServiceClient client;
         synchronized (mLock) {
-            serviceInterface = mServiceInterface;
+            client = mClient;
         }
-        if (serviceInterface != null) {
+        if (client != null) {
             try {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient(
                             "onFingerprintCapturingGesturesChanged", String.valueOf(active));
                 }
-                mServiceInterface.onFingerprintCapturingGesturesChanged(active);
+                mClient.onFingerprintCapturingGesturesChanged(active);
             } catch (RemoteException e) {
             }
         }
@@ -527,16 +526,16 @@
         if (!isCapturingFingerprintGestures()) {
             return;
         }
-        IAccessibilityServiceClient serviceInterface;
+        IAccessibilityServiceClient client;
         synchronized (mLock) {
-            serviceInterface = mServiceInterface;
+            client = mClient;
         }
-        if (serviceInterface != null) {
+        if (client != null) {
             try {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient("onFingerprintGesture", String.valueOf(gesture));
                 }
-                mServiceInterface.onFingerprintGesture(gesture);
+                mClient.onFingerprintGesture(gesture);
             } catch (RemoteException e) {
             }
         }
@@ -546,7 +545,7 @@
     @Override
     public void dispatchGesture(int sequence, ParceledListSlice gestureSteps, int displayId) {
         synchronized (mLock) {
-            if (mServiceInterface != null && mSecurityPolicy.canPerformGestures(this)) {
+            if (mClient != null && mSecurityPolicy.canPerformGestures(this)) {
                 final long identity = Binder.clearCallingIdentity();
                 try {
                     MotionEventInjector motionEventInjector =
@@ -557,16 +556,18 @@
                     if (motionEventInjector != null
                             && mWindowManagerService.isTouchOrFaketouchDevice()) {
                         motionEventInjector.injectEvents(
-                                gestureSteps.getList(), mServiceInterface, sequence, displayId);
+                                gestureSteps.getList(), mClient, sequence, displayId);
                     } else {
                         try {
                             if (svcClientTracingEnabled()) {
                                 logTraceSvcClient("onPerformGestureResult", sequence + ", false");
                             }
-                            mServiceInterface.onPerformGestureResult(sequence, false);
+                            mClient.onPerformGestureResult(sequence, false);
                         } catch (RemoteException re) {
-                            Slog.e(LOG_TAG, "Error sending motion event injection failure to "
-                                    + mServiceInterface, re);
+                            Slog.e(
+                                    LOG_TAG,
+                                    "Error sending motion event injection failure to " + mClient,
+                                    re);
                         }
                     }
                 } finally {
@@ -631,48 +632,47 @@
 
     @Override
     protected void createImeSessionInternal() {
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null) {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null) {
             try {
                 if (svcClientTracingEnabled()) {
                     logTraceSvcClient("createImeSession", "");
                 }
                 AccessibilityInputMethodSessionCallback
                         callback = new AccessibilityInputMethodSessionCallback(mUserId);
-                listener.createImeSession(callback);
+                client.createImeSession(callback);
             } catch (RemoteException re) {
-                Slog.e(LOG_TAG,
-                        "Error requesting IME session from " + mService, re);
+                Slog.e(LOG_TAG, "Error requesting IME session from " + mClientBinder, re);
             }
         }
     }
 
     private void notifyMotionEventInternal(MotionEvent event) {
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null) {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null) {
             try {
                 if (mTrace.isA11yTracingEnabled()) {
                     logTraceSvcClient(".onMotionEvent ",
                             event.toString());
                 }
-                listener.onMotionEvent(event);
+                client.onMotionEvent(event);
             } catch (RemoteException re) {
-                Slog.e(LOG_TAG, "Error sending motion event to" + mService, re);
+                Slog.e(LOG_TAG, "Error sending motion event to" + mClientBinder, re);
             }
         }
     }
 
     private void notifyTouchStateInternal(int displayId, int state) {
-        final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
-        if (listener != null) {
+        final IAccessibilityServiceClient client = getClientSafely();
+        if (client != null) {
             try {
                 if (mTrace.isA11yTracingEnabled()) {
                     logTraceSvcClient(".onTouchStateChanged ",
                             TouchInteractionController.stateToString(state));
                 }
-                listener.onTouchStateChanged(displayId, state);
+                client.onTouchStateChanged(displayId, state);
             } catch (RemoteException re) {
-                Slog.e(LOG_TAG, "Error sending motion event to" + mService, re);
+                Slog.e(LOG_TAG, "Error sending motion event to" + mClientBinder, re);
             }
         }
     }
diff --git a/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java
index 4cb3d24..cd97d83 100644
--- a/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java
@@ -109,14 +109,11 @@
         return mDeviceId;
     }
 
-    /**
-     * Called when the proxy is registered.
-     */
-    void initializeServiceInterface(IAccessibilityServiceClient serviceInterface)
-            throws RemoteException {
-        mServiceInterface = serviceInterface;
-        mService = serviceInterface.asBinder();
-        mServiceInterface.init(this, mId, this.mOverlayWindowTokens.get(mDisplayId));
+    /** Called when the proxy is registered. */
+    void initializeClient(IAccessibilityServiceClient client) throws RemoteException {
+        mClient = client;
+        mClientBinder = client.asBinder();
+        mClient.init(this, mId, this.mOverlayWindowTokens.get(mDisplayId));
     }
 
     /**
diff --git a/services/accessibility/java/com/android/server/accessibility/ProxyManager.java b/services/accessibility/java/com/android/server/accessibility/ProxyManager.java
index b4deeb0..da11a76 100644
--- a/services/accessibility/java/com/android/server/accessibility/ProxyManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/ProxyManager.java
@@ -214,7 +214,7 @@
                 mA11yInputFilter.disableFeaturesForDisplayIfInstalled(displayId);
             }
         });
-        connection.initializeServiceInterface(client);
+        connection.initializeClient(client);
     }
 
     private void registerVirtualDeviceListener() {
@@ -561,8 +561,8 @@
             final ProxyAccessibilityServiceConnection proxy =
                     mProxyA11yServiceConnections.valueAt(i);
             if (proxy != null && proxy.getDeviceId() == deviceId) {
-                final IBinder proxyBinder = proxy.mService;
-                final IAccessibilityServiceClient proxyInterface = proxy.mServiceInterface;
+                final IBinder proxyBinder = proxy.mClientBinder;
+                final IAccessibilityServiceClient proxyInterface = proxy.mClient;
                 if ((proxyBinder != null) && (proxyInterface != null)) {
                     interfaces.add(proxyInterface);
                 }
diff --git a/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java b/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java
index f85d786..ed4eeb5 100644
--- a/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java
@@ -107,8 +107,7 @@
                 Binder.getCallingUserHandle().getIdentifier());
         if (mUiAutomationService != null) {
             throw new IllegalStateException(
-                    "UiAutomationService " + mUiAutomationService.mServiceInterface
-                            + "already registered!");
+                    "UiAutomationService " + mUiAutomationService.mClient + "already registered!");
         }
 
         try {
@@ -130,10 +129,9 @@
                 mainHandler, mLock, securityPolicy, systemSupport, trace, windowManagerInternal,
                 systemActionPerformer, awm);
         mUiAutomationServiceOwner = owner;
-        mUiAutomationService.mServiceInterface = serviceClient;
+        mUiAutomationService.mClient = serviceClient;
         try {
-            mUiAutomationService.mServiceInterface.asBinder().linkToDeath(mUiAutomationService,
-                    0);
+            mUiAutomationService.mClient.asBinder().linkToDeath(mUiAutomationService, 0);
         } catch (RemoteException re) {
             Slog.e(LOG_TAG, "Failed registering death link: " + re);
             destroyUiAutomationService();
@@ -149,10 +147,10 @@
         synchronized (mLock) {
             if (useAccessibility()
                     && ((mUiAutomationService == null)
-                    || (serviceClient == null)
-                    || (mUiAutomationService.mServiceInterface == null)
-                    || (serviceClient.asBinder()
-                    != mUiAutomationService.mServiceInterface.asBinder()))) {
+                            || (serviceClient == null)
+                            || (mUiAutomationService.mClient == null)
+                            || (serviceClient.asBinder()
+                                    != mUiAutomationService.mClient.asBinder()))) {
                 throw new IllegalStateException("UiAutomationService " + serviceClient
                         + " not registered!");
             }
@@ -230,8 +228,7 @@
     private void destroyUiAutomationService() {
         synchronized (mLock) {
             if (mUiAutomationService != null) {
-                mUiAutomationService.mServiceInterface.asBinder().unlinkToDeath(
-                        mUiAutomationService, 0);
+                mUiAutomationService.mClient.asBinder().unlinkToDeath(mUiAutomationService, 0);
                 mUiAutomationService.onRemoved();
                 mUiAutomationService.resetLocked();
                 mUiAutomationService = null;
@@ -271,40 +268,48 @@
 
         void connectServiceUnknownThread() {
             // This needs to be done on the main thread
-            mMainHandler.post(() -> {
-                try {
-                    final IAccessibilityServiceClient serviceInterface;
-                    final UiAutomationService uiAutomationService;
-                    synchronized (mLock) {
-                        serviceInterface = mServiceInterface;
-                        uiAutomationService = mUiAutomationService;
-                        if (serviceInterface == null) {
-                            mService = null;
-                        } else {
-                            mService = mServiceInterface.asBinder();
-                            mService.linkToDeath(this, 0);
+            mMainHandler.post(
+                    () -> {
+                        try {
+                            final IAccessibilityServiceClient client;
+                            final UiAutomationService uiAutomationService;
+                            synchronized (mLock) {
+                                client = mClient;
+                                uiAutomationService = mUiAutomationService;
+                                if (client == null) {
+                                    mClientBinder = null;
+                                } else {
+                                    mClientBinder = mClient.asBinder();
+                                    mClientBinder.linkToDeath(this, 0);
+                                }
+                            }
+                            // If the client is null, the UiAutomation has been shut down on
+                            // another thread.
+                            if (client != null && uiAutomationService != null) {
+                                uiAutomationService.addWindowTokensForAllDisplays();
+                                if (mTrace.isA11yTracingEnabledForTypes(
+                                        AccessibilityTrace.FLAGS_ACCESSIBILITY_SERVICE_CLIENT)) {
+                                    mTrace.logTrace(
+                                            "UiAutomationService.connectServiceUnknownThread",
+                                            AccessibilityTrace.FLAGS_ACCESSIBILITY_SERVICE_CLIENT,
+                                            "serviceConnection="
+                                                    + this
+                                                    + ";connectionId="
+                                                    + mId
+                                                    + "windowToken="
+                                                    + mOverlayWindowTokens.get(
+                                                            Display.DEFAULT_DISPLAY));
+                                }
+                                client.init(
+                                        this,
+                                        mId,
+                                        mOverlayWindowTokens.get(Display.DEFAULT_DISPLAY));
+                            }
+                        } catch (RemoteException re) {
+                            Slog.w(LOG_TAG, "Error initializing connection", re);
+                            destroyUiAutomationService();
                         }
-                    }
-                    // If the serviceInterface is null, the UiAutomation has been shut down on
-                    // another thread.
-                    if (serviceInterface != null && uiAutomationService != null) {
-                        uiAutomationService.addWindowTokensForAllDisplays();
-                        if (mTrace.isA11yTracingEnabledForTypes(
-                                AccessibilityTrace.FLAGS_ACCESSIBILITY_SERVICE_CLIENT)) {
-                            mTrace.logTrace("UiAutomationService.connectServiceUnknownThread",
-                                    AccessibilityTrace.FLAGS_ACCESSIBILITY_SERVICE_CLIENT,
-                                    "serviceConnection=" + this + ";connectionId=" + mId
-                                    + "windowToken="
-                                    + mOverlayWindowTokens.get(Display.DEFAULT_DISPLAY));
-                        }
-                        serviceInterface.init(this, mId,
-                                mOverlayWindowTokens.get(Display.DEFAULT_DISPLAY));
-                    }
-                } catch (RemoteException re) {
-                    Slog.w(LOG_TAG, "Error initializing connection", re);
-                    destroyUiAutomationService();
-                }
-            });
+                    });
         }
 
         @Override
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java
index 6b6b39d..a77ba62 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java
@@ -47,7 +47,6 @@
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.TypedValue;
-import android.view.Display;
 import android.view.DisplayInfo;
 import android.view.MagnificationSpec;
 import android.view.View;
@@ -1637,9 +1636,10 @@
      * <strong>if scale is >= {@link MagnificationConstants.PERSISTED_SCALE_MIN_VALUE}</strong>.
      * We assume if the scale is < {@link MagnificationConstants.PERSISTED_SCALE_MIN_VALUE}, there
      * will be no obvious magnification effect.
+     * Only the value of the default display is persisted in user's settings.
      */
     public void persistScale(int displayId) {
-        final float scale = getScale(Display.DEFAULT_DISPLAY);
+        final float scale = getScale(displayId);
         if (scale < MagnificationConstants.PERSISTED_SCALE_MIN_VALUE) {
             return;
         }
diff --git a/services/appfunctions/TEST_MAPPING b/services/appfunctions/TEST_MAPPING
index 91cfa06..851d754 100644
--- a/services/appfunctions/TEST_MAPPING
+++ b/services/appfunctions/TEST_MAPPING
@@ -2,11 +2,6 @@
   "presubmit": [
     {
       "name": "FrameworksAppFunctionsTests"
-    }
-  ],
-  "postsubmit": [
-    {
-      "name": "FrameworksAppFunctionsTests"
     },
     {
       "name": "CtsAppFunctionTestCases"
diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java
index c8f8c2a..d31ced3 100644
--- a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java
+++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java
@@ -16,20 +16,33 @@
 
 package com.android.server.appfunctions;
 
+import static android.app.appfunctions.AppFunctionRuntimeMetadata.APP_FUNCTION_RUNTIME_METADATA_DB;
+import static android.app.appfunctions.AppFunctionRuntimeMetadata.APP_FUNCTION_RUNTIME_NAMESPACE;
+
 import static com.android.server.appfunctions.AppFunctionExecutors.THREAD_POOL_EXECUTOR;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.WorkerThread;
+import android.app.appfunctions.AppFunctionManager;
+import android.app.appfunctions.AppFunctionManagerHelper;
+import android.app.appfunctions.AppFunctionRuntimeMetadata;
 import android.app.appfunctions.AppFunctionStaticMetadataHelper;
 import android.app.appfunctions.ExecuteAppFunctionAidlRequest;
 import android.app.appfunctions.ExecuteAppFunctionResponse;
+import android.app.appfunctions.IAppFunctionEnabledCallback;
 import android.app.appfunctions.IAppFunctionManager;
 import android.app.appfunctions.IAppFunctionService;
+import android.app.appfunctions.ICancellationCallback;
 import android.app.appfunctions.IExecuteAppFunctionCallback;
 import android.app.appfunctions.SafeOneTimeExecuteAppFunctionCallback;
+import android.app.appsearch.AppSearchBatchResult;
 import android.app.appsearch.AppSearchManager;
+import android.app.appsearch.AppSearchManager.SearchContext;
 import android.app.appsearch.AppSearchResult;
+import android.app.appsearch.GenericDocument;
+import android.app.appsearch.GetByDocumentIdRequest;
+import android.app.appsearch.PutDocumentsRequest;
 import android.app.appsearch.observer.DocumentChangeInfo;
 import android.app.appsearch.observer.ObserverCallback;
 import android.app.appsearch.observer.ObserverSpec;
@@ -37,17 +50,26 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.Binder;
+import android.os.CancellationSignal;
+import android.os.IBinder;
+import android.os.ICancellationSignal;
+import android.os.OutcomeReceiver;
+import android.os.ParcelableException;
+import android.os.RemoteException;
 import android.os.UserHandle;
 import android.text.TextUtils;
 import android.util.Slog;
 
+import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.infra.AndroidFuture;
 import com.android.server.SystemService.TargetUser;
 import com.android.server.appfunctions.RemoteServiceCaller.RunServiceCallCallback;
 import com.android.server.appfunctions.RemoteServiceCaller.ServiceUsageCompleteListener;
 
 import java.util.Objects;
 import java.util.concurrent.CompletionException;
+import java.util.concurrent.Executor;
 
 /** Implementation of the AppFunctionManagerService. */
 public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub {
@@ -58,6 +80,7 @@
     private final ServiceHelper mInternalServiceHelper;
     private final ServiceConfig mServiceConfig;
     private final Context mContext;
+    private final Object mLock = new Object();
 
     public AppFunctionManagerServiceImpl(@NonNull Context context) {
         this(
@@ -99,7 +122,7 @@
     }
 
     @Override
-    public void executeAppFunction(
+    public ICancellationSignal executeAppFunction(
             @NonNull ExecuteAppFunctionAidlRequest requestInternal,
             @NonNull IExecuteAppFunctionCallback executeAppFunctionCallback) {
         Objects.requireNonNull(requestInternal);
@@ -120,11 +143,14 @@
                             ExecuteAppFunctionResponse.RESULT_DENIED,
                             exception.getMessage(),
                             /* extras= */ null));
-            return;
+            return null;
         }
 
         int callingUid = Binder.getCallingUid();
-        int callingPid = Binder.getCallingUid();
+        int callingPid = Binder.getCallingPid();
+
+        ICancellationSignal localCancelTransport = CancellationSignal.createTransport();
+
         THREAD_POOL_EXECUTOR.execute(
                 () -> {
                     try {
@@ -132,20 +158,25 @@
                                 requestInternal,
                                 callingUid,
                                 callingPid,
-                                safeExecuteAppFunctionCallback);
+                                localCancelTransport,
+                                safeExecuteAppFunctionCallback,
+                                executeAppFunctionCallback.asBinder());
                     } catch (Exception e) {
                         safeExecuteAppFunctionCallback.onResult(
                                 mapExceptionToExecuteAppFunctionResponse(e));
                     }
                 });
+        return localCancelTransport;
     }
 
     @WorkerThread
     private void executeAppFunctionInternal(
-            ExecuteAppFunctionAidlRequest requestInternal,
+            @NonNull ExecuteAppFunctionAidlRequest requestInternal,
             int callingUid,
             int callingPid,
-            SafeOneTimeExecuteAppFunctionCallback safeExecuteAppFunctionCallback) {
+            @NonNull ICancellationSignal localCancelTransport,
+            @NonNull SafeOneTimeExecuteAppFunctionCallback safeExecuteAppFunctionCallback,
+            @NonNull IBinder callerBinder) {
         UserHandle targetUser = requestInternal.getUserHandle();
         // TODO(b/354956319): Add and honor the new enterprise policies.
         if (mCallerValidator.isUserOrganizationManaged(targetUser)) {
@@ -168,133 +199,268 @@
             return;
         }
 
-        var unused =
-                mCallerValidator
-                        .verifyCallerCanExecuteAppFunction(
-                                callingUid,
-                                callingPid,
-                                requestInternal.getCallingPackage(),
-                                targetPackageName,
-                                requestInternal.getClientRequest().getFunctionIdentifier())
-                        .thenAccept(
-                                canExecute -> {
-                                    if (!canExecute) {
-                                        safeExecuteAppFunctionCallback.onResult(
-                                                ExecuteAppFunctionResponse.newFailure(
-                                                        ExecuteAppFunctionResponse.RESULT_DENIED,
-                                                        "Caller does not have permission to execute"
-                                                                + " the appfunction",
-                                                        /* extras= */ null));
-                                        return;
-                                    }
-                                    Intent serviceIntent =
-                                            mInternalServiceHelper.resolveAppFunctionService(
-                                                    targetPackageName, targetUser);
-                                    if (serviceIntent == null) {
-                                        safeExecuteAppFunctionCallback.onResult(
-                                                ExecuteAppFunctionResponse.newFailure(
-                                                        ExecuteAppFunctionResponse
-                                                                .RESULT_INTERNAL_ERROR,
-                                                        "Cannot find the target service.",
-                                                        /* extras= */ null));
-                                        return;
-                                    }
-                                    bindAppFunctionServiceUnchecked(
-                                            requestInternal,
-                                            serviceIntent,
-                                            targetUser,
-                                            safeExecuteAppFunctionCallback,
-                                            /* bindFlags= */ Context.BIND_AUTO_CREATE
-                                                    | Context.BIND_FOREGROUND_SERVICE);
-                                })
-                        .exceptionally(
-                                ex -> {
-                                    safeExecuteAppFunctionCallback.onResult(
-                                            mapExceptionToExecuteAppFunctionResponse(ex));
-                                    return null;
-                                });
+        mCallerValidator
+                .verifyCallerCanExecuteAppFunction(
+                        callingUid,
+                        callingPid,
+                        targetUser,
+                        requestInternal.getCallingPackage(),
+                        targetPackageName,
+                        requestInternal.getClientRequest().getFunctionIdentifier())
+                .thenAccept(
+                        canExecute -> {
+                            if (!canExecute) {
+                                safeExecuteAppFunctionCallback.onResult(
+                                        ExecuteAppFunctionResponse.newFailure(
+                                                ExecuteAppFunctionResponse.RESULT_DENIED,
+                                                "Caller does not have permission to execute the"
+                                                        + " appfunction",
+                                                /* extras= */ null));
+                            }
+                        })
+                .thenCompose(
+                        isEnabled ->
+                                isAppFunctionEnabled(
+                                        requestInternal.getClientRequest().getFunctionIdentifier(),
+                                        requestInternal.getClientRequest().getTargetPackageName(),
+                                        getAppSearchManagerAsUser(requestInternal.getUserHandle()),
+                                        THREAD_POOL_EXECUTOR))
+                .thenAccept(
+                        isEnabled -> {
+                            if (!isEnabled) {
+                                throw new DisabledAppFunctionException(
+                                        "The app function is disabled");
+                            }
+                        })
+                .thenAccept(
+                        unused -> {
+                            Intent serviceIntent =
+                                    mInternalServiceHelper.resolveAppFunctionService(
+                                            targetPackageName, targetUser);
+                            if (serviceIntent == null) {
+                                safeExecuteAppFunctionCallback.onResult(
+                                        ExecuteAppFunctionResponse.newFailure(
+                                                ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR,
+                                                "Cannot find the target service.",
+                                                /* extras= */ null));
+                                return;
+                            }
+                            bindAppFunctionServiceUnchecked(
+                                    requestInternal,
+                                    serviceIntent,
+                                    targetUser,
+                                    localCancelTransport,
+                                    safeExecuteAppFunctionCallback,
+                                    /* bindFlags= */ Context.BIND_AUTO_CREATE
+                                            | Context.BIND_FOREGROUND_SERVICE,
+                                    callerBinder);
+                        })
+                .exceptionally(
+                        ex -> {
+                            safeExecuteAppFunctionCallback.onResult(
+                                    mapExceptionToExecuteAppFunctionResponse(ex));
+                            return null;
+                        });
+    }
+
+    private static AndroidFuture<Boolean> isAppFunctionEnabled(
+            @NonNull String functionIdentifier,
+            @NonNull String targetPackage,
+            @NonNull AppSearchManager appSearchManager,
+            @NonNull Executor executor) {
+        AndroidFuture<Boolean> future = new AndroidFuture<>();
+        AppFunctionManagerHelper.isAppFunctionEnabled(
+                functionIdentifier,
+                targetPackage,
+                appSearchManager,
+                executor,
+                new OutcomeReceiver<>() {
+                    @Override
+                    public void onResult(@NonNull Boolean result) {
+                        future.complete(result);
+                    }
+
+                    @Override
+                    public void onError(@NonNull Exception error) {
+                        future.completeExceptionally(error);
+                    }
+                });
+        return future;
+    }
+
+    @Override
+    public void setAppFunctionEnabled(
+            @NonNull String callingPackage,
+            @NonNull String functionIdentifier,
+            @NonNull UserHandle userHandle,
+            @AppFunctionManager.EnabledState int enabledState,
+            @NonNull IAppFunctionEnabledCallback callback) {
+        try {
+            mCallerValidator.validateCallingPackage(callingPackage);
+        } catch (SecurityException e) {
+            reportException(callback, e);
+            return;
+        }
+        THREAD_POOL_EXECUTOR.execute(
+                () -> {
+                    try {
+                        // TODO(357551503): Instead of holding a global lock, hold a per-package
+                        //  lock.
+                        synchronized (mLock) {
+                            setAppFunctionEnabledInternalLocked(
+                                    callingPackage, functionIdentifier, userHandle, enabledState);
+                        }
+                        callback.onSuccess();
+                    } catch (Exception e) {
+                        Slog.e(TAG, "Error in setAppFunctionEnabled: ", e);
+                        reportException(callback, e);
+                    }
+                });
+    }
+
+    private static void reportException(
+            @NonNull IAppFunctionEnabledCallback callback, @NonNull Exception exception) {
+        try {
+            callback.onError(new ParcelableException(exception));
+        } catch (RemoteException e) {
+            Slog.w(TAG, "Failed to report the exception", e);
+        }
+    }
+
+    /**
+     * Sets the enabled status of a specified app function.
+     *
+     * <p>Required to hold a lock to call this function to avoid document changes during the
+     * process.
+     */
+    @WorkerThread
+    @GuardedBy("mLock")
+    private void setAppFunctionEnabledInternalLocked(
+            @NonNull String callingPackage,
+            @NonNull String functionIdentifier,
+            @NonNull UserHandle userHandle,
+            @AppFunctionManager.EnabledState int enabledState)
+            throws Exception {
+        AppSearchManager perUserAppSearchManager = getAppSearchManagerAsUser(userHandle);
+
+        if (perUserAppSearchManager == null) {
+            throw new IllegalStateException(
+                    "AppSearchManager not found for user:" + userHandle.getIdentifier());
+        }
+        SearchContext runtimeMetadataSearchContext =
+                new SearchContext.Builder(APP_FUNCTION_RUNTIME_METADATA_DB).build();
+
+        try (FutureAppSearchSession runtimeMetadataSearchSession =
+                new FutureAppSearchSessionImpl(
+                        perUserAppSearchManager,
+                        THREAD_POOL_EXECUTOR,
+                        runtimeMetadataSearchContext)) {
+            AppFunctionRuntimeMetadata existingMetadata =
+                    new AppFunctionRuntimeMetadata(
+                            getRuntimeMetadataGenericDocument(
+                                    callingPackage,
+                                    functionIdentifier,
+                                    runtimeMetadataSearchSession));
+            AppFunctionRuntimeMetadata newMetadata =
+                    new AppFunctionRuntimeMetadata.Builder(existingMetadata)
+                            .setEnabled(enabledState).build();
+            AppSearchBatchResult<String, Void> putDocumentBatchResult =
+                    runtimeMetadataSearchSession
+                            .put(
+                                    new PutDocumentsRequest.Builder()
+                                            .addGenericDocuments(newMetadata)
+                                            .build())
+                            .get();
+            if (!putDocumentBatchResult.isSuccess()) {
+                throw new IllegalStateException(
+                        "Failed writing updated doc to AppSearch due to " + putDocumentBatchResult);
+            }
+        }
+    }
+
+    @WorkerThread
+    @NonNull
+    private AppFunctionRuntimeMetadata getRuntimeMetadataGenericDocument(
+            @NonNull String packageName,
+            @NonNull String functionId,
+            @NonNull FutureAppSearchSession runtimeMetadataSearchSession)
+            throws Exception {
+        String documentId =
+                AppFunctionRuntimeMetadata.getDocumentIdForAppFunction(packageName, functionId);
+        GetByDocumentIdRequest request =
+                new GetByDocumentIdRequest.Builder(APP_FUNCTION_RUNTIME_NAMESPACE)
+                        .addIds(documentId)
+                        .build();
+        AppSearchBatchResult<String, GenericDocument> result =
+                runtimeMetadataSearchSession.getByDocumentId(request).get();
+        if (result.isSuccess()) {
+            return new AppFunctionRuntimeMetadata((result.getSuccesses().get(documentId)));
+        }
+        throw new IllegalArgumentException("Function " + functionId + " does not exist");
     }
 
     private void bindAppFunctionServiceUnchecked(
             @NonNull ExecuteAppFunctionAidlRequest requestInternal,
             @NonNull Intent serviceIntent,
             @NonNull UserHandle targetUser,
+            @NonNull ICancellationSignal cancellationSignalTransport,
             @NonNull SafeOneTimeExecuteAppFunctionCallback safeExecuteAppFunctionCallback,
-            int bindFlags) {
+            int bindFlags,
+            @NonNull IBinder callerBinder) {
+        CancellationSignal cancellationSignal =
+                CancellationSignal.fromTransport(cancellationSignalTransport);
+        ICancellationCallback cancellationCallback =
+                new ICancellationCallback.Stub() {
+                    @Override
+                    public void sendCancellationTransport(
+                            @NonNull ICancellationSignal cancellationTransport) {
+                        cancellationSignal.setRemote(cancellationTransport);
+                    }
+                };
         boolean bindServiceResult =
                 mRemoteServiceCaller.runServiceCall(
                         serviceIntent,
                         bindFlags,
                         targetUser,
-                        new RunServiceCallCallback<IAppFunctionService>() {
-                            @Override
-                            public void onServiceConnected(
-                                    @NonNull IAppFunctionService service,
-                                    @NonNull
-                                            ServiceUsageCompleteListener
-                                                    serviceUsageCompleteListener) {
-                                try {
-                                    service.executeAppFunction(
-                                            requestInternal.getClientRequest(),
-                                            new IExecuteAppFunctionCallback.Stub() {
-                                                @Override
-                                                public void onResult(
-                                                        ExecuteAppFunctionResponse response) {
-                                                    safeExecuteAppFunctionCallback.onResult(
-                                                            response);
-                                                    serviceUsageCompleteListener.onCompleted();
-                                                }
-                                            });
-                                } catch (Exception e) {
-                                    safeExecuteAppFunctionCallback.onResult(
-                                            ExecuteAppFunctionResponse.newFailure(
-                                                    ExecuteAppFunctionResponse
-                                                            .RESULT_APP_UNKNOWN_ERROR,
-                                                    e.getMessage(),
-                                                    /* extras= */ null));
-                                    serviceUsageCompleteListener.onCompleted();
-                                }
-                            }
-
-                            @Override
-                            public void onFailedToConnect() {
-                                Slog.e(TAG, "Failed to connect to service");
-                                safeExecuteAppFunctionCallback.onResult(
-                                        ExecuteAppFunctionResponse.newFailure(
-                                                ExecuteAppFunctionResponse.RESULT_APP_UNKNOWN_ERROR,
-                                                "Failed to connect to AppFunctionService",
-                                                /* extras= */ null));
-                            }
-                        });
+                        mServiceConfig.getExecuteAppFunctionCancellationTimeoutMillis(),
+                        cancellationSignal,
+                        RunAppFunctionServiceCallback.create(
+                                requestInternal,
+                                cancellationCallback,
+                                safeExecuteAppFunctionCallback),
+                        callerBinder);
 
         if (!bindServiceResult) {
             Slog.e(TAG, "Failed to bind to the AppFunctionService");
             safeExecuteAppFunctionCallback.onResult(
                     ExecuteAppFunctionResponse.newFailure(
-                            ExecuteAppFunctionResponse.RESULT_TIMED_OUT,
+                            ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR,
                             "Failed to bind the AppFunctionService.",
                             /* extras= */ null));
         }
     }
 
+    private AppSearchManager getAppSearchManagerAsUser(@NonNull UserHandle userHandle) {
+        return mContext.createContextAsUser(userHandle, /* flags= */ 0)
+                .getSystemService(AppSearchManager.class);
+    }
+
     private ExecuteAppFunctionResponse mapExceptionToExecuteAppFunctionResponse(Throwable e) {
         if (e instanceof CompletionException) {
             e = e.getCause();
         }
-
-        if (e instanceof AppSearchException) {
-            AppSearchException appSearchException = (AppSearchException) e;
-            return ExecuteAppFunctionResponse.newFailure(
+        int resultCode = ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR;
+        if (e instanceof AppSearchException appSearchException) {
+            resultCode =
                     mapAppSearchResultFailureCodeToExecuteAppFunctionResponse(
-                            appSearchException.getResultCode()),
-                    appSearchException.getMessage(),
-                    /* extras= */ null);
+                            appSearchException.getResultCode());
+        } else if (e instanceof SecurityException) {
+            resultCode = ExecuteAppFunctionResponse.RESULT_DENIED;
+        } else if (e instanceof DisabledAppFunctionException) {
+            resultCode = ExecuteAppFunctionResponse.RESULT_DISABLED;
         }
-
         return ExecuteAppFunctionResponse.newFailure(
-                ExecuteAppFunctionResponse.RESULT_INTERNAL_ERROR,
-                e.getMessage(),
-                /* extras= */ null);
+                resultCode, e.getMessage(), /* extras= */ null);
     }
 
     private int mapAppSearchResultFailureCodeToExecuteAppFunctionResponse(int resultCode) {
@@ -409,4 +575,11 @@
             }
         }
     }
+
+    /** Throws when executing a disabled app function. */
+    private static class DisabledAppFunctionException extends RuntimeException {
+        private DisabledAppFunctionException(@NonNull String errorMessage) {
+            super(errorMessage);
+        }
+    }
 }
diff --git a/services/appfunctions/java/com/android/server/appfunctions/CallerValidator.java b/services/appfunctions/java/com/android/server/appfunctions/CallerValidator.java
index 3592ed5..5393b93 100644
--- a/services/appfunctions/java/com/android/server/appfunctions/CallerValidator.java
+++ b/services/appfunctions/java/com/android/server/appfunctions/CallerValidator.java
@@ -64,6 +64,9 @@
      * {@link Manifest.permission#EXECUTE_APP_FUNCTIONS} granted. In some cases, app functions can
      * still opt-out of caller having {@link Manifest.permission#EXECUTE_APP_FUNCTIONS}.
      *
+     * @param callingUid The calling uid.
+     * @param callingPid The calling pid.
+     * @param targetUser The user which the caller is requesting to execute as.
      * @param callerPackageName The calling package (as previously validated).
      * @param targetPackageName The package that owns the app function to execute.
      * @param functionId The id of the app function to execute.
@@ -72,6 +75,7 @@
     AndroidFuture<Boolean> verifyCallerCanExecuteAppFunction(
             int callingUid,
             int callingPid,
+            @NonNull UserHandle targetUser,
             @NonNull String callerPackageName,
             @NonNull String targetPackageName,
             @NonNull String functionId);
diff --git a/services/appfunctions/java/com/android/server/appfunctions/CallerValidatorImpl.java b/services/appfunctions/java/com/android/server/appfunctions/CallerValidatorImpl.java
index 8b6251a..e85a70d 100644
--- a/services/appfunctions/java/com/android/server/appfunctions/CallerValidatorImpl.java
+++ b/services/appfunctions/java/com/android/server/appfunctions/CallerValidatorImpl.java
@@ -93,6 +93,7 @@
     public AndroidFuture<Boolean> verifyCallerCanExecuteAppFunction(
             int callingUid,
             int callingPid,
+            @NonNull UserHandle targetUser,
             @NonNull String callerPackageName,
             @NonNull String targetPackageName,
             @NonNull String functionId) {
@@ -122,7 +123,10 @@
 
         FutureAppSearchSession futureAppSearchSession =
                 new FutureAppSearchSessionImpl(
-                        mContext.getSystemService(AppSearchManager.class),
+                        Objects.requireNonNull(
+                                mContext
+                                        .createContextAsUser(targetUser, 0)
+                                        .getSystemService(AppSearchManager.class)),
                         THREAD_POOL_EXECUTOR,
                         new SearchContext.Builder(APP_FUNCTION_STATIC_METADATA_DB).build());
 
diff --git a/services/appfunctions/java/com/android/server/appfunctions/RemoteServiceCaller.java b/services/appfunctions/java/com/android/server/appfunctions/RemoteServiceCaller.java
index cd5c383..d0e858e 100644
--- a/services/appfunctions/java/com/android/server/appfunctions/RemoteServiceCaller.java
+++ b/services/appfunctions/java/com/android/server/appfunctions/RemoteServiceCaller.java
@@ -17,41 +17,56 @@
 
 import android.annotation.NonNull;
 import android.content.Intent;
+import android.os.CancellationSignal;
+import android.os.IBinder;
 import android.os.UserHandle;
 
 /**
- * Defines a contract for establishing temporary connections to services and executing operations
- * within a specified timeout. Implementations of this interface provide mechanisms to ensure that
- * services are properly unbound after the operation completes or a timeout occurs.
+ * Defines a contract for establishing temporary connections to services and executing operations.
+ * Implementations of this interface provide mechanisms to ensure that services are properly unbound
+ * after the operation completes or a cancellation timeout occurs.
  *
  * @param <T> Class of wrapped service.
  */
 public interface RemoteServiceCaller<T> {
 
     /**
-     * Initiates service binding and executes a provided method when the service connects. Unbinds
-     * the service after execution or upon timeout. Returns the result of the bindService API.
+     * Initiates service binding and executes a provided method when the service connects.
+     *
+     * <p>Unbinds the service after execution or upon cancellation timeout or calling process death.
+     * Returns the result of the bindService API.
      *
      * <p>When the service connection was made successfully, it's the caller responsibility to
      * report the usage is completed and can be unbound by calling {@link
      * ServiceUsageCompleteListener#onCompleted()}.
      *
-     * <p>This method includes a timeout mechanism to prevent the system from being stuck in a state
-     * where a service is bound indefinitely (for example, if the binder method never returns). This
-     * helps ensure that the calling app does not remain alive unnecessarily.
+     * <p>This method includes a timeout mechanism for cancellation to prevent the system from being
+     * stuck in a state where a service is bound indefinitely. If the app to be bound does not
+     * return the result within `cancellationTimeoutMillis` after the cancellation signal is sent,
+     * this method will unbind the service connection.
+     *
+     * <p>This method will also unbind the service after the calling process dies (because a
+     * cancellation signal cannot be sent and system server can become bound forever if otherwise).
      *
      * @param intent An Intent object that describes the service that should be bound.
      * @param bindFlags Flags used to control the binding process See {@link
      *     android.content.Context#bindService}.
      * @param userHandle The UserHandle of the user for which the service should be bound.
+     * @param cancellationTimeoutMillis The timeout before the service is unbound after a
+     *     cancellation signal is issued.
+     * @param cancellationSignal The cancellation signal forwarded to the service.
      * @param callback A callback to be invoked for various events. See {@link
      *     RunServiceCallCallback}.
+     * @param callerBinder The binder of the caller.
      */
     boolean runServiceCall(
             @NonNull Intent intent,
             int bindFlags,
             @NonNull UserHandle userHandle,
-            @NonNull RunServiceCallCallback<T> callback);
+            long cancellationTimeoutMillis,
+            @NonNull CancellationSignal cancellationSignal,
+            @NonNull RunServiceCallCallback<T> callback,
+            @NonNull IBinder callerBinder);
 
     /** An interface for clients to signal that they have finished using a bound service. */
     interface ServiceUsageCompleteListener {
@@ -73,5 +88,8 @@
 
         /** Called when the service connection was failed to establish. */
         void onFailedToConnect();
+
+        /** Called when the caller has cancelled this remote service call. */
+        void onCancelled();
     }
 }
diff --git a/services/appfunctions/java/com/android/server/appfunctions/RemoteServiceCallerImpl.java b/services/appfunctions/java/com/android/server/appfunctions/RemoteServiceCallerImpl.java
index 070a99d..1508159 100644
--- a/services/appfunctions/java/com/android/server/appfunctions/RemoteServiceCallerImpl.java
+++ b/services/appfunctions/java/com/android/server/appfunctions/RemoteServiceCallerImpl.java
@@ -16,15 +16,19 @@
 package com.android.server.appfunctions;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.os.CancellationSignal;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Looper;
+import android.os.RemoteException;
 import android.os.UserHandle;
 import android.util.Log;
+import android.util.Slog;
 
 import java.util.concurrent.Executor;
 import java.util.function.Function;
@@ -63,10 +67,19 @@
             @NonNull Intent intent,
             int bindFlags,
             @NonNull UserHandle userHandle,
-            @NonNull RunServiceCallCallback<T> callback) {
+            long cancellationTimeoutMillis,
+            @NonNull CancellationSignal cancellationSignal,
+            @NonNull RunServiceCallCallback<T> callback,
+            @NonNull IBinder callerBinder) {
         OneOffServiceConnection serviceConnection =
                 new OneOffServiceConnection(
-                        intent, bindFlags, userHandle, callback);
+                        intent,
+                        bindFlags,
+                        userHandle,
+                        cancellationTimeoutMillis,
+                        cancellationSignal,
+                        callback,
+                        callerBinder);
 
         return serviceConnection.bindAndRun();
     }
@@ -77,23 +90,52 @@
         private final int mFlags;
         private final UserHandle mUserHandle;
         private final RunServiceCallCallback<T> mCallback;
+        private final long mCancellationTimeoutMillis;
+        private final CancellationSignal mCancellationSignal;
+        private final Runnable mCancellationTimeoutRunnable;
+        private final IBinder mCallerBinder;
+        @Nullable private IBinder.DeathRecipient mDirectServiceVulture;
 
         OneOffServiceConnection(
                 @NonNull Intent intent,
                 int flags,
                 @NonNull UserHandle userHandle,
-                @NonNull RunServiceCallCallback<T> callback) {
+                long cancellationTimeoutMillis,
+                @NonNull CancellationSignal cancellationSignal,
+                @NonNull RunServiceCallCallback<T> callback,
+                @NonNull IBinder callerBinder) {
             mIntent = intent;
             mFlags = flags;
             mCallback = callback;
             mUserHandle = userHandle;
+            mCancellationTimeoutMillis = cancellationTimeoutMillis;
+            mCancellationSignal = cancellationSignal;
+            mCancellationTimeoutRunnable = this::safeUnbind;
+            mCallerBinder = callerBinder;
         }
 
         public boolean bindAndRun() {
             boolean bindServiceResult =
                     mContext.bindServiceAsUser(mIntent, this, mFlags, mUserHandle);
 
-            if(!bindServiceResult) {
+            if (bindServiceResult) {
+                mCancellationSignal.setOnCancelListener(
+                        () -> {
+                            mCallback.onCancelled();
+                            mHandler.postDelayed(
+                                    mCancellationTimeoutRunnable, mCancellationTimeoutMillis);
+                        });
+                mDirectServiceVulture =
+                        () -> {
+                            Slog.w(TAG, "Caller process onDeath signal received");
+                            mCancellationSignal.cancel();
+                        };
+                try {
+                    mCallerBinder.linkToDeath(mDirectServiceVulture, /* flags= */ 0);
+                } catch (RemoteException e) {
+                    Slog.w(TAG, "Failed to link to death on " + mCallerBinder + ": ", e);
+                }
+            } else {
                 safeUnbind();
             }
 
@@ -127,7 +169,11 @@
 
         private void safeUnbind() {
             try {
+                mHandler.removeCallbacks(mCancellationTimeoutRunnable);
                 mContext.unbindService(this);
+                if (mDirectServiceVulture != null) {
+                    mCallerBinder.unlinkToDeath(mDirectServiceVulture, 0);
+                }
             } catch (Exception ex) {
                 Log.w(TAG, "Failed to unbind", ex);
             }
diff --git a/services/appfunctions/java/com/android/server/appfunctions/RunAppFunctionServiceCallback.java b/services/appfunctions/java/com/android/server/appfunctions/RunAppFunctionServiceCallback.java
new file mode 100644
index 0000000..7820390
--- /dev/null
+++ b/services/appfunctions/java/com/android/server/appfunctions/RunAppFunctionServiceCallback.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2024 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.appfunctions;
+
+import android.annotation.NonNull;
+import android.app.appfunctions.ExecuteAppFunctionAidlRequest;
+import android.app.appfunctions.ExecuteAppFunctionResponse;
+import android.app.appfunctions.IAppFunctionService;
+import android.app.appfunctions.ICancellationCallback;
+import android.app.appfunctions.IExecuteAppFunctionCallback;
+import android.app.appfunctions.SafeOneTimeExecuteAppFunctionCallback;
+import android.util.Slog;
+
+import com.android.server.appfunctions.RemoteServiceCaller.RunServiceCallCallback;
+import com.android.server.appfunctions.RemoteServiceCaller.ServiceUsageCompleteListener;
+
+
+/**
+ * A callback to forward a request to the {@link IAppFunctionService} and report back the result.
+ */
+public class RunAppFunctionServiceCallback implements RunServiceCallCallback<IAppFunctionService> {
+
+    private final ExecuteAppFunctionAidlRequest mRequestInternal;
+    private final SafeOneTimeExecuteAppFunctionCallback mSafeExecuteAppFunctionCallback;
+    private final ICancellationCallback mCancellationCallback;
+
+    private RunAppFunctionServiceCallback(
+            ExecuteAppFunctionAidlRequest requestInternal,
+            ICancellationCallback cancellationCallback,
+            SafeOneTimeExecuteAppFunctionCallback safeExecuteAppFunctionCallback) {
+        this.mRequestInternal = requestInternal;
+        this.mSafeExecuteAppFunctionCallback = safeExecuteAppFunctionCallback;
+        this.mCancellationCallback = cancellationCallback;
+    }
+
+    /**
+     * Creates a new instance of {@link RunAppFunctionServiceCallback}.
+     *
+     * @param requestInternal a request to send to the service.
+     * @param cancellationCallback a callback to forward cancellation signal to the service.
+     * @param safeExecuteAppFunctionCallback a callback to report back the result of the operation.
+     */
+    public static RunAppFunctionServiceCallback create(
+            ExecuteAppFunctionAidlRequest requestInternal,
+            ICancellationCallback cancellationCallback,
+            SafeOneTimeExecuteAppFunctionCallback safeExecuteAppFunctionCallback) {
+        return new RunAppFunctionServiceCallback(
+                requestInternal, cancellationCallback, safeExecuteAppFunctionCallback);
+    }
+
+    @Override
+    public void onServiceConnected(
+            @NonNull IAppFunctionService service,
+            @NonNull ServiceUsageCompleteListener serviceUsageCompleteListener) {
+        try {
+            service.executeAppFunction(
+                    mRequestInternal.getClientRequest(),
+                    mCancellationCallback,
+                    new IExecuteAppFunctionCallback.Stub() {
+                        @Override
+                        public void onResult(ExecuteAppFunctionResponse response) {
+                            mSafeExecuteAppFunctionCallback.onResult(response);
+                            serviceUsageCompleteListener.onCompleted();
+                        }
+                    });
+        } catch (Exception e) {
+            mSafeExecuteAppFunctionCallback.onResult(
+                    ExecuteAppFunctionResponse.newFailure(
+                            ExecuteAppFunctionResponse.RESULT_APP_UNKNOWN_ERROR,
+                            e.getMessage(),
+                            /* extras= */ null));
+            serviceUsageCompleteListener.onCompleted();
+        }
+    }
+
+    @Override
+    public void onFailedToConnect() {
+        Slog.e("AppFunctionManagerServiceImpl", "Failed to connect to service");
+        mSafeExecuteAppFunctionCallback.onResult(
+                ExecuteAppFunctionResponse.newFailure(
+                        ExecuteAppFunctionResponse.RESULT_APP_UNKNOWN_ERROR,
+                        "Failed to connect to AppFunctionService",
+                        /* extras= */ null));
+    }
+
+    @Override
+    public void onCancelled() {
+        mSafeExecuteAppFunctionCallback.disable();
+    }
+}
diff --git a/services/appfunctions/java/com/android/server/appfunctions/ServiceConfig.java b/services/appfunctions/java/com/android/server/appfunctions/ServiceConfig.java
index caa4bf0..8d2d1b2 100644
--- a/services/appfunctions/java/com/android/server/appfunctions/ServiceConfig.java
+++ b/services/appfunctions/java/com/android/server/appfunctions/ServiceConfig.java
@@ -21,6 +21,9 @@
     // TODO(b/357551503): Obtain namespace from DeviceConfig.
     String NAMESPACE_APP_FUNCTIONS = "appfunctions";
 
-    /** Returns the maximum time to wait for an app function execution to be complete. */
-    long getExecuteAppFunctionTimeoutMillis();
+    /**
+     * Returns the timeout for which the system server waits for the app function service to
+     * successfully cancel the execution of an app function before forcefully unbinding the service.
+     */
+    long getExecuteAppFunctionCancellationTimeoutMillis();
 }
diff --git a/services/appfunctions/java/com/android/server/appfunctions/ServiceConfigImpl.java b/services/appfunctions/java/com/android/server/appfunctions/ServiceConfigImpl.java
index f18789b..787f52a 100644
--- a/services/appfunctions/java/com/android/server/appfunctions/ServiceConfigImpl.java
+++ b/services/appfunctions/java/com/android/server/appfunctions/ServiceConfigImpl.java
@@ -20,15 +20,16 @@
 
 /** Implementation of {@link ServiceConfig} */
 public class ServiceConfigImpl implements ServiceConfig {
-    static final String DEVICE_CONFIG_PROPERTY_EXECUTION_TIMEOUT =
-            "execute_app_function_timeout_millis";
-    static final long DEFAULT_EXECUTE_APP_FUNCTION_TIMEOUT_MS = 5000L;
+    static final String DEVICE_CONFIG_PROPERTY_EXECUTION_CANCELLATION_TIMEOUT =
+            "execute_app_function_cancellation_timeout_millis";
+    static final long DEFAULT_EXECUTE_APP_FUNCTION_CANCELLATION_TIMEOUT_MS = 5000L;
+
 
     @Override
-    public long getExecuteAppFunctionTimeoutMillis() {
+    public long getExecuteAppFunctionCancellationTimeoutMillis() {
         return DeviceConfig.getLong(
                 NAMESPACE_APP_FUNCTIONS,
-                DEVICE_CONFIG_PROPERTY_EXECUTION_TIMEOUT,
-                DEFAULT_EXECUTE_APP_FUNCTION_TIMEOUT_MS);
+                DEVICE_CONFIG_PROPERTY_EXECUTION_CANCELLATION_TIMEOUT,
+                DEFAULT_EXECUTE_APP_FUNCTION_CANCELLATION_TIMEOUT_MS);
     }
 }
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index b2c679f..f6ac706 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -1444,7 +1444,7 @@
      * in {@link #allocateAppWidgetId}.
      *
      * @param callingPackage The package that calls this method.
-     * @param appWidgetId The id of theapp widget to bind.
+     * @param appWidgetId The id of the widget to bind.
      * @param providerProfileId The user/profile id of the provider.
      * @param providerComponent The {@link ComponentName} that provides the widget.
      * @param options The options to pass to the provider.
@@ -1738,6 +1738,14 @@
         return false;
     }
 
+    /**
+     * Called by a {@link AppWidgetHost} to remove all records (i.e. {@link Host}
+     * and all {@link Widget} associated with the host) from a specified host.
+     *
+     * @param callingPackage The package that calls this method.
+     * @param hostId id of the {@link Host}.
+     * @see AppWidgetHost#deleteHost()
+     */
     @Override
     public void deleteHost(String callingPackage, int hostId) {
         final int userId = UserHandle.getCallingUserId();
@@ -1771,6 +1779,15 @@
         }
     }
 
+    /**
+     * Called by a host process to remove all records (i.e. {@link Host}
+     * and all {@link Widget} associated with the host) from all hosts associated
+     * with the calling process.
+     *
+     * Typically used in clean up after test execution.
+     *
+     * @see AppWidgetHost#deleteAllHosts()
+     */
     @Override
     public void deleteAllHosts() {
         final int userId = UserHandle.getCallingUserId();
@@ -1805,6 +1822,18 @@
         }
     }
 
+    /**
+     * Returns the {@link AppWidgetProviderInfo} for the specified AppWidget.
+     *
+     * Typically used by launcher during the restore of an AppWidget, the binding
+     * of new AppWidget, and during grid size migration.
+     *
+     * @param callingPackage The package that calls this method.
+     * @param appWidgetId   Id of the widget.
+     * @return The {@link AppWidgetProviderInfo} for the specified widget.
+     *
+     * @see AppWidgetManager#getAppWidgetInfo(int)
+     */
     @Override
     public AppWidgetProviderInfo getAppWidgetInfo(String callingPackage, int appWidgetId) {
         final int userId = UserHandle.getCallingUserId();
@@ -1859,6 +1888,17 @@
         }
     }
 
+    /**
+     * Returns the most recent {@link RemoteViews} of the specified AppWidget.
+     * Typically serves as a cache of the content of the AppWidget.
+     *
+     * @param callingPackage The package that calls this method.
+     * @param appWidgetId   Id of the widget.
+     * @return The {@link RemoteViews} of the specified widget.
+     *
+     * @see AppWidgetHost#updateAppWidgetDeferred(String, int)
+     * @see AppWidgetHost#setListener(int, AppWidgetHostListener)
+     */
     @Override
     public RemoteViews getAppWidgetViews(String callingPackage, int appWidgetId) {
         final int userId = UserHandle.getCallingUserId();
@@ -1886,6 +1926,29 @@
         }
     }
 
+    /**
+     * Update the extras for a given widget instance.
+     * <p>
+     * The extras can be used to embed additional information about this widget to be accessed
+     * by the associated widget's AppWidgetProvider.
+     *
+     * <p>
+     * The new options are merged into existing options using {@link Bundle#putAll} semantics.
+     *
+     * <p>
+     * Typically called by a {@link AppWidgetHost} (e.g. Launcher) to notify
+     * {@link AppWidgetProvider} regarding contextual changes (e.g. sizes) when rendering the
+     * widget.
+     * Calling this method would trigger onAppWidgetOptionsChanged() callback on the provider's
+     * side.
+     *
+     * @param callingPackage The package that calls this method.
+     * @param appWidgetId Id of the widget.
+     * @param options New options associate with this widget.
+     *
+     * @see AppWidgetManager#getAppWidgetOptions(int, Bundle)
+     * @see AppWidgetProvider#onAppWidgetOptionsChanged(Context, AppWidgetManager, int, Bundle)
+     */
     @Override
     public void updateAppWidgetOptions(String callingPackage, int appWidgetId, Bundle options) {
         final int userId = UserHandle.getCallingUserId();
@@ -1919,6 +1982,21 @@
         }
     }
 
+    /**
+     * Get the extras associated with a given widget instance.
+     * <p>
+     * The extras can be used to embed additional information about this widget to be accessed
+     * by the associated widget's AppWidgetProvider.
+     *
+     * Typically called by a host process (e.g. Launcher) to determine if they need to update the
+     * options of the widget.
+     *
+     * @see #updateAppWidgetOptions(String, int, Bundle)
+     *
+     * @param callingPackage The package that calls this method.
+     * @param appWidgetId Id of the widget.
+     * @return The options associated with the specified widget instance.
+     */
     @Override
     public Bundle getAppWidgetOptions(String callingPackage, int appWidgetId) {
         final int userId = UserHandle.getCallingUserId();
@@ -1946,6 +2024,28 @@
         }
     }
 
+    /**
+     * Updates the content of the widgets (as specified by appWidgetIds) using the provided
+     * {@link RemoteViews}.
+     *
+     * Typically called by the provider's process. Either in response to the invocation of
+     * {@link AppWidgetProvider#onUpdate} or upon receiving the
+     * {@link AppWidgetManager#ACTION_APPWIDGET_UPDATE} broadcast.
+     *
+     * <p>
+     * Note that the RemoteViews parameter will be cached by the AppWidgetService, and hence should
+     * contain a complete representation of the widget. For performing partial widget updates, see
+     * {@link #partiallyUpdateAppWidgetIds(String, int[], RemoteViews)}.
+     *
+     * @param callingPackage The package that calls this method.
+     * @param appWidgetIds Ids of the widgets to be updated.
+     * @param views The RemoteViews object containing the update.
+     *
+     * @see AppWidgetProvider#onUpdate(Context, AppWidgetManager, int[])
+     * @see AppWidgetManager#ACTION_APPWIDGET_UPDATE
+     * @see AppWidgetManager#updateAppWidget(int, RemoteViews)
+     * @see AppWidgetManager#updateAppWidget(int[], RemoteViews)
+     */
     @Override
     public void updateAppWidgetIds(String callingPackage, int[] appWidgetIds,
             RemoteViews views) {
@@ -1956,6 +2056,27 @@
         updateAppWidgetIds(callingPackage, appWidgetIds, views, false);
     }
 
+    /**
+     * Perform an incremental update or command on the widget(s) specified by appWidgetIds.
+     * <p>
+     * This update  differs from {@link #updateAppWidgetIds(int[], RemoteViews)} in that the
+     * RemoteViews object which is passed is understood to be an incomplete representation of the
+     * widget, and hence does not replace the cached representation of the widget. As of API
+     * level 17, the new properties set within the views objects will be appended to the cached
+     * representation of the widget, and hence will persist.
+     *
+     * <p>
+     * This method will be ignored if a widget has not received a full update via
+     * {@link #updateAppWidget(int[], RemoteViews)}.
+     *
+     * @param callingPackage   The package that calls this method.
+     * @param appWidgetIds     Ids of the widgets to be updated.
+     * @param views            The RemoteViews object containing the incremental update / command.
+     *
+     * @see AppWidgetManager#partiallyUpdateAppWidget(int[], RemoteViews)
+     * @see RemoteViews#setDisplayedChild(int, int)
+     * @see RemoteViews#setScrollPosition(int, int)
+     */
     @Override
     public void partiallyUpdateAppWidgetIds(String callingPackage, int[] appWidgetIds,
             RemoteViews views) {
@@ -1966,6 +2087,24 @@
         updateAppWidgetIds(callingPackage, appWidgetIds, views, true);
     }
 
+    /**
+     * Callback function which marks specified providers as extended from AppWidgetProvider.
+     *
+     * This information is used to determine if the system can combine
+     * {@link AppWidgetManager#ACTION_APPWIDGET_ENABLED} and
+     * {@link AppWidgetManager#ACTION_APPWIDGET_UPDATE} into a single broadcast.
+     *
+     * Note: The system can only combine the two broadcasts if the provider is extended from
+     * AppWidgetProvider. When they do, they are expected to override the
+     * {@link AppWidgetProvider#onUpdate} callback function to provide updates, as opposed to
+     * listening for {@link AppWidgetManager#ACTION_APPWIDGET_UPDATE} broadcasts directly.
+     *
+     * @see AppWidgetManager#ACTION_APPWIDGET_ENABLED
+     * @see AppWidgetManager#ACTION_APPWIDGET_UPDATE
+     * @see AppWidgetManager#ACTION_APPWIDGET_ENABLE_AND_UPDATE
+     * @see AppWidgetProvider#onReceive(Context, Intent)
+     * @see #sendEnableAndUpdateIntentLocked
+     */
     @Override
     public void notifyProviderInheritance(@Nullable final ComponentName[] componentNames) {
         final int userId = UserHandle.getCallingUserId();
@@ -2000,6 +2139,15 @@
         }
     }
 
+    /**
+     * Notifies the specified collection view in all the specified AppWidget instances
+     * to invalidate their data.
+     *
+     * This method is effectively deprecated since
+     * {@link RemoteViews#setRemoteAdapter(int, Intent)} has been deprecated.
+     *
+     * @see AppWidgetManager#notifyAppWidgetViewDataChanged(int[], int)
+     */
     @Override
     public void notifyAppWidgetViewDataChanged(String callingPackage, int[] appWidgetIds,
             int viewId) {
@@ -2035,6 +2183,18 @@
         }
     }
 
+    /**
+     * Updates the content of all widgets associated with given provider (as specified by
+     * componentName) using the provided {@link RemoteViews}.
+     *
+     * Typically called by the provider's process when there's an update that needs to be supplied
+     * to all instances of the widgets.
+     *
+     * @param componentName The component name of the provider.
+     * @param views The RemoteViews object containing the update.
+     *
+     * @see AppWidgetManager#updateAppWidget(ComponentName, RemoteViews)
+     */
     @Override
     public void updateAppWidgetProvider(ComponentName componentName, RemoteViews views) {
         final int userId = UserHandle.getCallingUserId();
@@ -2068,6 +2228,27 @@
         }
     }
 
+    /**
+     * Updates the info for the supplied AppWidget provider. Apps can use this to change the default
+     * behavior of the widget based on the state of the app (e.g., if the user is logged in
+     * or not). Calling this API completely replaces the previous definition.
+     *
+     * <p>
+     * The manifest entry of the provider should contain an additional meta-data tag similar to
+     * {@link AppWidgetManager#META_DATA_APPWIDGET_PROVIDER} which should point to any alternative
+     * definitions for the provider.
+     *
+     * <p>
+     * This is persisted across device reboots and app updates. If this meta-data key is not
+     * present in the manifest entry, the info reverts to default.
+     *
+     * @param provider {@link ComponentName} for the {@link
+     *    android.content.BroadcastReceiver BroadcastReceiver} provider for your AppWidget.
+     * @param metaDataKey key for the meta-data tag pointing to the new provider info. Use null
+     *    to reset any previously set info.
+     *
+     * @see AppWidgetManager#updateAppWidgetProviderInfo(ComponentName, String)
+     */
     @Override
     public void updateAppWidgetProviderInfo(ComponentName componentName, String metadataKey) {
         final int userId = UserHandle.getCallingUserId();
@@ -2119,6 +2300,11 @@
         }
     }
 
+    /**
+     * Returns true if the default launcher app on the device (the one that currently
+     * holds the android.app.role.HOME role) can support pinning widgets
+     * (typically means adding widgets into home screen).
+     */
     @Override
     public boolean isRequestPinAppWidgetSupported() {
         synchronized (mLock) {
@@ -2133,6 +2319,44 @@
                         LauncherApps.PinItemRequest.REQUEST_TYPE_APPWIDGET);
     }
 
+    /**
+     * Request to pin an app widget on the current launcher. It's up to the launcher to accept this
+     * request (optionally showing a user confirmation). If the request is accepted, the caller will
+     * get a confirmation with extra {@link #EXTRA_APPWIDGET_ID}.
+     *
+     * <p>When a request is denied by the user, the caller app will not get any response.
+     *
+     * <p>Only apps with a foreground activity or a foreground service can call it.  Otherwise
+     * it'll throw {@link IllegalStateException}.
+     *
+     * <p>It's up to the launcher how to handle previous pending requests when the same package
+     * calls this API multiple times in a row.  It may ignore the previous requests,
+     * for example.
+     *
+     * <p>Launcher will not show the configuration activity associated with the provider in this
+     * case. The app could either show the configuration activity as a response to the callback,
+     * or show if before calling the API (various configurations can be encapsulated in
+     * {@code successCallback} to avoid persisting them before the widgetId is known).
+     *
+     * @param provider The {@link ComponentName} for the {@link
+     *    android.content.BroadcastReceiver BroadcastReceiver} provider for your AppWidget.
+     * @param extras If not null, this is passed to the launcher app. For eg {@link
+     *    #EXTRA_APPWIDGET_PREVIEW} can be used for a custom preview.
+     * @param successCallback If not null, this intent will be sent when the widget is created.
+     *
+     * @return {@code TRUE} if the launcher supports this feature. Note the API will return without
+     *    waiting for the user to respond, so getting {@code TRUE} from this API does *not* mean
+     *    the shortcut is pinned. {@code FALSE} if the launcher doesn't support this feature or if
+     *    calling app belongs to a user-profile with items restricted on home screen.
+     *
+     * @see android.content.pm.ShortcutManager#isRequestPinShortcutSupported()
+     * @see android.content.pm.ShortcutManager#requestPinShortcut(ShortcutInfo, IntentSender)
+     * @see AppWidgetManager#isRequestPinAppWidgetSupported()
+     * @see AppWidgetManager#requestPinAppWidget(ComponentName, Bundle, PendingIntent)
+     *
+     * @throws IllegalStateException The caller doesn't have a foreground activity or a foreground
+     * service or when the user is locked.
+     */
     @Override
     public boolean requestPinAppWidget(String callingPackage, ComponentName componentName,
             Bundle extras, IntentSender resultSender) {
@@ -2184,6 +2408,24 @@
                 callingPid, callingUid) == PackageManager.PERMISSION_GRANTED;
     }
 
+    /**
+     * Gets the AppWidget providers for the given user profile. User profile can only
+     * be the current user or a profile of the current user. For example, the current
+     * user may have a corporate profile. In this case the parent user profile has a
+     * child profile, the corporate one.
+     *
+     * @param categoryFilter Will only return providers which register as any of the specified
+     *        specified categories. See {@link AppWidgetProviderInfo#widgetCategory}.
+     * @param profile A profile of the current user which to be queried. The user
+     *        is itself also a profile. If null, the providers only for the current user
+     *        are returned.
+     * @param packageName If specified, will only return providers from the given package.
+     * @return The installed providers.
+     *
+     * @see android.os.Process#myUserHandle()
+     * @see android.os.UserManager#getUserProfiles()
+     * @see AppWidgetManager#getInstalledProvidersForProfile(int, UserHandle, String)
+     */
     @Override
     public ParceledListSlice<AppWidgetProviderInfo> getInstalledProvidersForProfile(int categoryFilter,
             int profileId, String packageName) {
@@ -2244,6 +2486,26 @@
         }
     }
 
+    /**
+     * Updates the content of the widgets (as specified by appWidgetIds) using the provided
+     * {@link RemoteViews}.
+     *
+     * If performing a partial update, the given RemoteViews object is merged into existing
+     * RemoteViews object.
+     *
+     * Fails silently if appWidgetIds is null or empty, or cannot found a widget with the given
+     * appWidgetId.
+     *
+     * @param callingPackage The package that calls this method.
+     * @param appWidgetIds Ids of the widgets to be updated.
+     * @param views The RemoteViews object containing the update.
+     * @param partially Whether it was a partial update.
+     *
+     * @see AppWidgetProvider#onUpdate(Context, AppWidgetManager, int[])
+     * @see AppWidgetManager#ACTION_APPWIDGET_UPDATE
+     * @see AppWidgetManager#updateAppWidget(int, RemoteViews)
+     * @see AppWidgetManager#updateAppWidget(int[], RemoteViews)
+     */
     private void updateAppWidgetIds(String callingPackage, int[] appWidgetIds,
             RemoteViews views, boolean partially) {
         final int userId = UserHandle.getCallingUserId();
@@ -2273,12 +2535,29 @@
         }
     }
 
+    /**
+     * Increment the counter of widget ids and return the new id.
+     *
+     * Typically called by {@link #allocateAppWidgetId} when a instance of widget is created,
+     * either as a result of being pinned by launcher or added during a restore.
+     *
+     * Note: A widget id is a monotonically increasing integer that uniquely identifies the widget
+     * instance.
+     *
+     * TODO: Revisit this method and determine whether we need to alter the widget id during
+     *       the restore since widget id mismatch potentially leads to some issues in the past.
+     */
     private int incrementAndGetAppWidgetIdLocked(int userId) {
         final int appWidgetId = peekNextAppWidgetIdLocked(userId) + 1;
         mNextAppWidgetIds.put(userId, appWidgetId);
         return appWidgetId;
     }
 
+    /**
+     * Called by {@link #readProfileStateFromFileLocked} when widgets/providers/hosts are loaded
+     * from disk, which ensures mNextAppWidgetIds is larger than any existing widget id for given
+     * user.
+     */
     private void setMinAppWidgetIdLocked(int userId, int minWidgetId) {
         final int nextAppWidgetId = peekNextAppWidgetIdLocked(userId);
         if (nextAppWidgetId < minWidgetId) {
diff --git a/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java b/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java
index 71a1822..dbeca82a 100644
--- a/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java
+++ b/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java
@@ -16,8 +16,6 @@
 
 package com.android.server.companion.securechannel;
 
-import static android.security.attestationverification.AttestationVerificationManager.RESULT_SUCCESS;
-
 import android.annotation.NonNull;
 import android.content.Context;
 import android.os.Build;
@@ -498,7 +496,7 @@
 
     private void exchangeAttestation()
             throws IOException, GeneralSecurityException, BadHandleException, CryptoException {
-        if (mVerificationResult == RESULT_SUCCESS) {
+        if (mVerificationResult == 0) {
             Slog.d(TAG, "Remote attestation was already verified.");
             return;
         }
@@ -530,11 +528,11 @@
         sendMessage(MessageType.AVF_RESULT, verificationResult);
         byte[] remoteVerificationResult = readMessage(MessageType.AVF_RESULT);
 
-        if (ByteBuffer.wrap(remoteVerificationResult).getInt() != RESULT_SUCCESS) {
+        if (ByteBuffer.wrap(remoteVerificationResult).getInt() != 0) {
             throw new SecureChannelException("Remote device failed to verify local attestation.");
         }
 
-        if (mVerificationResult != RESULT_SUCCESS) {
+        if (mVerificationResult != 0) {
             throw new SecureChannelException("Failed to verify remote attestation.");
         }
 
@@ -549,7 +547,7 @@
             return false;
         }
         // Is authenticated
-        return mPskVerified || mVerificationResult == RESULT_SUCCESS;
+        return mPskVerified || mVerificationResult == 0;
     }
 
     // First byte indicates message type; 0 = CLIENT INIT, 1 = SERVER INIT
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
index cd2dd3a..3bcca1c 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
@@ -42,6 +42,7 @@
 import android.app.admin.DevicePolicyManager;
 import android.app.compat.CompatChanges;
 import android.companion.AssociationInfo;
+import android.companion.AssociationRequest;
 import android.companion.virtual.ActivityPolicyExemption;
 import android.companion.virtual.IVirtualDevice;
 import android.companion.virtual.IVirtualDeviceActivityListener;
@@ -98,6 +99,7 @@
 import android.os.PowerManager;
 import android.os.RemoteException;
 import android.os.ResultReceiver;
+import android.os.SystemClock;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.ArrayMap;
@@ -153,6 +155,9 @@
 
     private static final String PERSISTENT_ID_PREFIX_CDM_ASSOCIATION = "companion:";
 
+    private static final List<String> DEVICE_PROFILES_ALLOWING_MIRROR_DISPLAYS = List.of(
+            AssociationRequest.DEVICE_PROFILE_APP_STREAMING);
+
     /**
      * Timeout until {@link #launchPendingIntent} stops waiting for an activity to be launched.
      */
@@ -199,6 +204,7 @@
     private IVirtualDeviceSoundEffectListener mSoundEffectListener;
     private final DisplayManagerGlobal mDisplayManager;
     private final DisplayManagerInternal mDisplayManagerInternal;
+    private final PowerManager mPowerManager;
     @GuardedBy("mVirtualDeviceLock")
     private final Map<IBinder, IntentFilter> mIntentInterceptors = new ArrayMap<>();
     @NonNull
@@ -209,6 +215,10 @@
     @GuardedBy("mVirtualDeviceLock")
     @Nullable
     private LocaleList mLocaleList = null;
+    @GuardedBy("mVirtualDeviceLock")
+    private boolean mLockdownActive = false;
+    @GuardedBy("mVirtualDeviceLock")
+    private boolean mRequestedToBeAwake = true;
 
     @NonNull
     private final VirtualDevice mPublicVirtualDeviceObject;
@@ -414,6 +424,7 @@
         mDevicePolicies = params.getDevicePolicies();
         mDisplayManager = displayManager;
         mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
+        mPowerManager = context.getSystemService(PowerManager.class);
         if (inputController == null) {
             mInputController = new InputController(
                     context.getMainThreadHandler(),
@@ -471,6 +482,20 @@
         }
     }
 
+    void onLockdownChanged(boolean lockdownActive) {
+        synchronized (mVirtualDeviceLock) {
+            if (lockdownActive != mLockdownActive) {
+                mLockdownActive = lockdownActive;
+                if (mLockdownActive) {
+                    goToSleepInternal(PowerManager.GO_TO_SLEEP_REASON_DISPLAY_GROUPS_TURNED_OFF);
+                } else if (mRequestedToBeAwake) {
+                    wakeUpInternal(PowerManager.WAKE_REASON_DISPLAY_GROUP_TURNED_ON,
+                            "android.server.companion.virtual:LOCKDOWN_ENDED");
+                }
+            }
+        }
+    }
+
     @VisibleForTesting
     SensorController getSensorControllerForTest() {
         return mSensorController;
@@ -498,6 +523,10 @@
         return mAssociationInfo == null ? mParams.getName() : mAssociationInfo.getDisplayName();
     }
 
+    String getDeviceProfile() {
+        return mAssociationInfo == null ? null : mAssociationInfo.getDeviceProfile();
+    }
+
     /** Returns the public representation of the device. */
     VirtualDevice getPublicVirtualDeviceObject() {
         return mPublicVirtualDeviceObject;
@@ -568,8 +597,45 @@
     }
 
     @Override // Binder call
+    @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+    public void goToSleep() {
+        super.goToSleep_enforcePermission();
+        synchronized (mVirtualDeviceLock) {
+            mRequestedToBeAwake = false;
+        }
+        final long ident = Binder.clearCallingIdentity();
+        try {
+            goToSleepInternal(PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON);
+        } finally {
+            Binder.restoreCallingIdentity(ident);
+        }
+    }
+
+    @Override // Binder call
+    @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+    public void wakeUp() {
+        super.wakeUp_enforcePermission();
+        synchronized (mVirtualDeviceLock) {
+            mRequestedToBeAwake = true;
+            if (mLockdownActive) {
+                Slog.w(TAG, "Cannot wake up device during lockdown.");
+                return;
+            }
+        }
+        final long ident = Binder.clearCallingIdentity();
+        try {
+            wakeUpInternal(PowerManager.WAKE_REASON_POWER_BUTTON,
+                    "android.server.companion.virtual:DEVICE_ON");
+        } finally {
+            Binder.restoreCallingIdentity(ident);
+        }
+    }
+
+    @Override // Binder call
+    @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     public void launchPendingIntent(int displayId, PendingIntent pendingIntent,
             ResultReceiver resultReceiver) {
+        super.launchPendingIntent_enforcePermission();
         Objects.requireNonNull(pendingIntent);
         synchronized (mVirtualDeviceLock) {
             if (!mVirtualDisplays.contains(displayId)) {
@@ -1034,7 +1100,9 @@
     }
 
     @Override // Binder call
+    @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     public int getInputDeviceId(IBinder token) {
+        super.getInputDeviceId_enforcePermission();
         final long ident = Binder.clearCallingIdentity();
         try {
             return mInputController.getInputDeviceId(token);
@@ -1117,7 +1185,9 @@
     }
 
     @Override // Binder call
+    @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     public PointF getCursorPosition(IBinder token) {
+        super.getCursorPosition_enforcePermission();
         final long ident = Binder.clearCallingIdentity();
         try {
             return mInputController.getCursorPosition(token);
@@ -1294,6 +1364,11 @@
         return hasCustomAudioInputSupportInternal();
     }
 
+    @Override
+    public boolean canCreateMirrorDisplays() {
+        return DEVICE_PROFILES_ALLOWING_MIRROR_DISPLAYS.contains(getDeviceProfile());
+    }
+
     private boolean hasCustomAudioInputSupportInternal() {
         if (!Flags.vdmPublicApis()) {
             return false;
@@ -1398,18 +1473,24 @@
         return gwpc;
     }
 
-    int createVirtualDisplay(@NonNull VirtualDisplayConfig virtualDisplayConfig,
-            @NonNull IVirtualDisplayCallback callback, String packageName) {
+    @Override // Binder call
+    @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+    public int createVirtualDisplay(@NonNull VirtualDisplayConfig virtualDisplayConfig,
+            @NonNull IVirtualDisplayCallback callback) {
+        super.createVirtualDisplay_enforcePermission();
         GenericWindowPolicyController gwpc;
         synchronized (mVirtualDeviceLock) {
             gwpc = createWindowPolicyControllerLocked(virtualDisplayConfig.getDisplayCategories());
         }
         int displayId;
         displayId = mDisplayManagerInternal.createVirtualDisplay(virtualDisplayConfig, callback,
-                this, gwpc, packageName);
+                this, gwpc, mOwnerPackageName);
         boolean isMirrorDisplay =
                 mDisplayManagerInternal.getDisplayIdToMirror(displayId) != Display.INVALID_DISPLAY;
         gwpc.setDisplayId(displayId, isMirrorDisplay);
+        boolean isTrustedDisplay =
+                (mDisplayManagerInternal.getDisplayInfo(displayId).flags & Display.FLAG_TRUSTED)
+                        == Display.FLAG_TRUSTED;
 
         boolean showPointer;
         synchronized (mVirtualDeviceLock) {
@@ -1420,7 +1501,8 @@
             }
 
             PowerManager.WakeLock wakeLock = createAndAcquireWakeLockForDisplay(displayId);
-            mVirtualDisplays.put(displayId, new VirtualDisplayWrapper(callback, gwpc, wakeLock));
+            mVirtualDisplays.put(displayId, new VirtualDisplayWrapper(callback, gwpc, wakeLock,
+                    isTrustedDisplay, isMirrorDisplay));
             showPointer = mDefaultShowPointerIcon;
         }
 
@@ -1431,8 +1513,7 @@
             mInputController.setDisplayEligibilityForPointerCapture(/* isEligible= */ false,
                     displayId);
             // WM throws a SecurityException if the display is untrusted.
-            if ((mDisplayManagerInternal.getDisplayInfo(displayId).flags & Display.FLAG_TRUSTED)
-                    == Display.FLAG_TRUSTED) {
+            if (isTrustedDisplay) {
                 mInputController.setDisplayImePolicy(displayId,
                         WindowManager.DISPLAY_IME_POLICY_LOCAL);
             }
@@ -1498,7 +1579,6 @@
         return result;
     }
 
-
     void onVirtualDisplayRemoved(int displayId) {
         /* This is callback invoked by VirtualDeviceManagerService when VirtualDisplay was released
          * by DisplayManager (most probably caused by someone calling VirtualDisplay.close()).
@@ -1549,6 +1629,34 @@
         }
     }
 
+    void goToSleepInternal(@PowerManager.GoToSleepReason int reason) {
+        final long now = SystemClock.uptimeMillis();
+        synchronized (mVirtualDeviceLock) {
+            for (int i = 0; i < mVirtualDisplays.size(); i++) {
+                VirtualDisplayWrapper wrapper = mVirtualDisplays.valueAt(i);
+                if (!wrapper.isTrusted() || wrapper.isMirror()) {
+                    continue;
+                }
+                int displayId = mVirtualDisplays.keyAt(i);
+                mPowerManager.goToSleep(displayId, now, reason, /* flags= */ 0);
+            }
+        }
+    }
+
+    void wakeUpInternal(@PowerManager.WakeReason int reason, String details) {
+        final long now = SystemClock.uptimeMillis();
+        synchronized (mVirtualDeviceLock) {
+            for (int i = 0; i < mVirtualDisplays.size(); i++) {
+                VirtualDisplayWrapper wrapper = mVirtualDisplays.valueAt(i);
+                if (!wrapper.isTrusted() || wrapper.isMirror()) {
+                    continue;
+                }
+                int displayId = mVirtualDisplays.keyAt(i);
+                mPowerManager.wakeUp(now, reason, details, displayId);
+            }
+        }
+    }
+
     /**
      * Release resources tied to virtual display owned by this VirtualDevice instance.
      *
@@ -1652,6 +1760,7 @@
         return mInputController.getInputDeviceDescriptors().values().stream().anyMatch(
                 inputDeviceDescriptor -> inputDeviceDescriptor.getInputDeviceId() == inputDeviceId);
     }
+
     void playSoundEffect(int effectType) {
         try {
             mSoundEffectListener.onPlaySoundEffect(effectType);
@@ -1719,13 +1828,17 @@
         private final IVirtualDisplayCallback mToken;
         private final GenericWindowPolicyController mWindowPolicyController;
         private final PowerManager.WakeLock mWakeLock;
+        private final boolean mIsTrusted;
+        private final boolean mIsMirror;
 
         VirtualDisplayWrapper(@NonNull IVirtualDisplayCallback token,
                 @NonNull GenericWindowPolicyController windowPolicyController,
-                @NonNull PowerManager.WakeLock wakeLock) {
+                @NonNull PowerManager.WakeLock wakeLock, boolean isTrusted, boolean isMirror) {
             mToken = Objects.requireNonNull(token);
             mWindowPolicyController = Objects.requireNonNull(windowPolicyController);
             mWakeLock = Objects.requireNonNull(wakeLock);
+            mIsTrusted = isTrusted;
+            mIsMirror = isMirror;
         }
 
         GenericWindowPolicyController getWindowPolicyController() {
@@ -1736,6 +1849,14 @@
             return mWakeLock;
         }
 
+        boolean isTrusted() {
+            return mIsTrusted;
+        }
+
+        boolean isMirror() {
+            return mIsMirror;
+        }
+
         IVirtualDisplayCallback getToken() {
             return mToken;
         }
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
index 3cd1ca4..41b6a85 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
@@ -44,8 +44,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.hardware.display.DisplayManagerInternal;
-import android.hardware.display.IVirtualDisplayCallback;
-import android.hardware.display.VirtualDisplayConfig;
 import android.os.Binder;
 import android.os.Handler;
 import android.os.IBinder;
@@ -68,6 +66,7 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.DumpUtils;
+import com.android.internal.widget.LockPatternUtils;
 import com.android.modules.expresslog.Counter;
 import com.android.server.LocalServices;
 import com.android.server.SystemService;
@@ -129,6 +128,26 @@
                 }
             };
 
+    private class StrongAuthTracker extends LockPatternUtils.StrongAuthTracker {
+        final Set<Integer> mUsersInLockdown = new ArraySet<>();
+
+        StrongAuthTracker(Context context) {
+            super(context);
+        }
+
+        @Override
+        public synchronized void onStrongAuthRequiredChanged(int userId) {
+            if ((getStrongAuthForUser(userId) & STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN) > 0) {
+                if (mUsersInLockdown.add(userId) && mUsersInLockdown.size() == 1) {
+                    onLockdownChanged(true);
+                }
+            } else if (mUsersInLockdown.remove(userId) && mUsersInLockdown.isEmpty()) {
+                onLockdownChanged(false);
+            }
+        }
+    }
+    private StrongAuthTracker mStrongAuthTracker;
+
     private final RemoteCallbackList<IVirtualDeviceListener> mVirtualDeviceListeners =
             new RemoteCallbackList<>();
 
@@ -201,6 +220,20 @@
                         + " will be available.");
             }
         }
+        if (android.companion.virtualdevice.flags.Flags.deviceAwareDisplayPower()) {
+            mStrongAuthTracker = new StrongAuthTracker(getContext());
+            new LockPatternUtils(getContext()).registerStrongAuthTracker(mStrongAuthTracker);
+        }
+    }
+
+    // Called when the global lockdown state changes, i.e. lockdown is considered active if any user
+    // is in lockdown mode, and inactive if no users are in lockdown mode.
+    void onLockdownChanged(boolean lockdownActive) {
+        synchronized (mVirtualDeviceManagerLock) {
+            for (int i = 0; i < mVirtualDevices.size(); i++) {
+                mVirtualDevices.valueAt(i).onLockdownChanged(lockdownActive);
+            }
+        }
     }
 
     void onCameraAccessBlocked(int appUid) {
@@ -505,37 +538,6 @@
         }
 
         @Override // Binder call
-        public int createVirtualDisplay(VirtualDisplayConfig virtualDisplayConfig,
-                IVirtualDisplayCallback callback, IVirtualDevice virtualDevice, String packageName)
-                throws RemoteException {
-            Objects.requireNonNull(virtualDisplayConfig);
-            final int callingUid = getCallingUid();
-            if (!PermissionUtils.validateCallingPackageName(getContext(), packageName)) {
-                throw new SecurityException(
-                        "Package name " + packageName + " does not belong to calling uid "
-                                + callingUid);
-            }
-            VirtualDeviceImpl virtualDeviceImpl;
-            synchronized (mVirtualDeviceManagerLock) {
-                virtualDeviceImpl = mVirtualDevices.get(virtualDevice.getDeviceId());
-                if (virtualDeviceImpl == null) {
-                    throw new SecurityException(
-                            "Invalid VirtualDevice (deviceId = " + virtualDevice.getDeviceId()
-                                    + ")");
-                }
-            }
-            if (virtualDeviceImpl.getOwnerUid() != callingUid) {
-                throw new SecurityException(
-                        "uid " + callingUid
-                                + " is not the owner of the supplied VirtualDevice (deviceId = "
-                                + virtualDevice.getDeviceId() + ")");
-            }
-
-            return virtualDeviceImpl.createVirtualDisplay(
-                    virtualDisplayConfig, callback, packageName);
-        }
-
-        @Override // Binder call
         public List<VirtualDevice> getVirtualDevices() {
             List<VirtualDevice> virtualDevices = new ArrayList<>();
             synchronized (mVirtualDeviceManagerLock) {
diff --git a/services/core/Android.bp b/services/core/Android.bp
index c6e599e..c738463 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -60,7 +60,7 @@
     tools: ["protologtool"],
     cmd: "$(location protologtool) transform-protolog-calls " +
         "--protolog-class com.android.internal.protolog.ProtoLog " +
-        "--loggroups-class com.android.internal.protolog.ProtoLogGroup " +
+        "--loggroups-class com.android.internal.protolog.WmProtoLogGroups " +
         "--loggroups-jar $(location :protolog-groups) " +
         "--viewer-config-file-path /etc/core.protolog.pb " +
         "--legacy-viewer-config-file-path /system/etc/protolog.conf.json.gz " +
@@ -79,7 +79,7 @@
     tools: ["protologtool"],
     cmd: "$(location protologtool) generate-viewer-config " +
         "--protolog-class com.android.internal.protolog.ProtoLog " +
-        "--loggroups-class com.android.internal.protolog.ProtoLogGroup " +
+        "--loggroups-class com.android.internal.protolog.WmProtoLogGroups " +
         "--loggroups-jar $(location :protolog-groups) " +
         "--viewer-config-type json " +
         "--viewer-config $(out) " +
@@ -96,7 +96,7 @@
     tools: ["protologtool"],
     cmd: "$(location protologtool) generate-viewer-config " +
         "--protolog-class com.android.internal.protolog.ProtoLog " +
-        "--loggroups-class com.android.internal.protolog.ProtoLogGroup " +
+        "--loggroups-class com.android.internal.protolog.WmProtoLogGroups " +
         "--loggroups-jar $(location :protolog-groups) " +
         "--viewer-config-type proto " +
         "--viewer-config $(out) " +
diff --git a/services/core/java/android/os/BatteryStatsInternal.java b/services/core/java/android/os/BatteryStatsInternal.java
index 0713999..60b826b 100644
--- a/services/core/java/android/os/BatteryStatsInternal.java
+++ b/services/core/java/android/os/BatteryStatsInternal.java
@@ -41,6 +41,7 @@
     public static final int CPU_WAKEUP_SUBSYSTEM_SOUND_TRIGGER = 3;
     public static final int CPU_WAKEUP_SUBSYSTEM_SENSOR = 4;
     public static final int CPU_WAKEUP_SUBSYSTEM_CELLULAR_DATA = 5;
+    public static final int CPU_WAKEUP_SUBSYSTEM_BLUETOOTH = 6;
 
     /** @hide */
     @IntDef(prefix = {"CPU_WAKEUP_SUBSYSTEM_"}, value = {
@@ -50,6 +51,7 @@
             CPU_WAKEUP_SUBSYSTEM_SOUND_TRIGGER,
             CPU_WAKEUP_SUBSYSTEM_SENSOR,
             CPU_WAKEUP_SUBSYSTEM_CELLULAR_DATA,
+            CPU_WAKEUP_SUBSYSTEM_BLUETOOTH,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface CpuWakeupSubsystem {
@@ -99,6 +101,14 @@
     public abstract void noteCpuWakingNetworkPacket(Network network, long elapsedMillis, int uid);
 
     /**
+     * Informs battery stats of a sysproxy packet that woke up the CPU
+     *
+     * @param uid The uid that received the packet.
+     * @param elapsedMillis The time of the packet's arrival in elapsed timebase.
+     */
+    public abstract void noteCpuWakingBluetoothProxyPacket(int uid, long elapsedMillis);
+
+    /**
      * Informs battery stats of binder stats for the given work source UID.
      */
     public abstract void noteBinderCallStats(int workSourceUid, long incrementalBinderCallCount,
diff --git a/services/core/java/com/android/server/EventLogTags.logtags b/services/core/java/com/android/server/EventLogTags.logtags
index 5b271a3..7474df2 100644
--- a/services/core/java/com/android/server/EventLogTags.logtags
+++ b/services/core/java/com/android/server/EventLogTags.logtags
@@ -87,7 +87,7 @@
 # replaces 27510 with a row per notification
 27531 notification_visibility (key|3),(visibile|1),(lifespan|1),(freshness|1),(exposure|1),(rank|1)
 # a notification emited noise, vibration, or light
-27532 notification_alert (key|3),(buzz|1),(beep|1),(blink|1),(politeness|1)
+27532 notification_alert (key|3),(buzz|1),(beep|1),(blink|1),(politeness|1),(mute_reason|1)
 # a notification was added to a autogroup
 27533 notification_autogrouped (key|3)
 # notification was removed from an autogroup
diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java
index fbe593f..2acedd5 100644
--- a/services/core/java/com/android/server/PackageWatchdog.java
+++ b/services/core/java/com/android/server/PackageWatchdog.java
@@ -25,6 +25,7 @@
 import static java.lang.annotation.RetentionPolicy.SOURCE;
 
 import android.annotation.IntDef;
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -46,6 +47,7 @@
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.AtomicFile;
+import android.util.EventLog;
 import android.util.IndentingPrintWriter;
 import android.util.LongArrayQueue;
 import android.util.Slog;
@@ -91,6 +93,7 @@
  * Monitors the health of packages on the system and notifies interested observers when packages
  * fail. On failure, the registered observer with the least user impacting mitigation will
  * be notified.
+ * @hide
  */
 public class PackageWatchdog {
     private static final String TAG = "PackageWatchdog";
@@ -108,13 +111,25 @@
     private static final long NUMBER_OF_NATIVE_CRASH_POLLS = 10;
 
 
+    /** Reason for package failure could not be determined. */
     public static final int FAILURE_REASON_UNKNOWN = 0;
+
+    /** The package had a native crash. */
     public static final int FAILURE_REASON_NATIVE_CRASH = 1;
+
+    /** The package failed an explicit health check. */
     public static final int FAILURE_REASON_EXPLICIT_HEALTH_CHECK = 2;
+
+    /** The app crashed. */
     public static final int FAILURE_REASON_APP_CRASH = 3;
+
+    /** The app was not responding. */
     public static final int FAILURE_REASON_APP_NOT_RESPONDING = 4;
+
+    /** The device was boot looping. */
     public static final int FAILURE_REASON_BOOT_LOOP = 5;
 
+    /** @hide */
     @IntDef(prefix = { "FAILURE_REASON_" }, value = {
             FAILURE_REASON_UNKNOWN,
             FAILURE_REASON_NATIVE_CRASH,
@@ -186,7 +201,15 @@
     // aborted.
     private static final String METADATA_FILE = "/metadata/watchdog/mitigation_count.txt";
 
-    @GuardedBy("PackageWatchdog.class")
+    /**
+     * EventLog tags used when logging into the event log. Note the values must be sync with
+     * frameworks/base/services/core/java/com/android/server/EventLogTags.logtags to get correct
+     * name translation.
+     */
+    private static final int LOG_TAG_RESCUE_NOTE = 2900;
+
+    private static final Object sPackageWatchdogLock = new Object();
+    @GuardedBy("sPackageWatchdogLock")
     private static PackageWatchdog sPackageWatchdog;
 
     private final Object mLock = new Object();
@@ -278,8 +301,8 @@
     }
 
     /** Creates or gets singleton instance of PackageWatchdog. */
-    public static PackageWatchdog getInstance(Context context) {
-        synchronized (PackageWatchdog.class) {
+    public static  @NonNull PackageWatchdog getInstance(@NonNull Context context) {
+        synchronized (sPackageWatchdogLock) {
             if (sPackageWatchdog == null) {
                 new PackageWatchdog(context);
             }
@@ -290,6 +313,7 @@
     /**
      * Called during boot to notify when packages are ready on the device so we can start
      * binding.
+     * @hide
      */
     public void onPackagesReady() {
         synchronized (mLock) {
@@ -311,6 +335,7 @@
      *
      * <p>Observers are expected to call this on boot. It does not specify any packages but
      * it will resume observing any packages requested from a previous boot.
+     * @hide
      */
     public void registerHealthObserver(PackageHealthObserver observer) {
         synchronized (mLock) {
@@ -344,6 +369,7 @@
      *
      * <p>If {@code durationMs} is less than 1, a default monitoring duration
      * {@link #DEFAULT_OBSERVING_DURATION_MS} will be used.
+     * @hide
      */
     public void startObservingHealth(PackageHealthObserver observer, List<String> packageNames,
             long durationMs) {
@@ -407,6 +433,7 @@
      * Unregisters {@code observer} from listening to package failure.
      * Additionally, this stops observing any packages that may have previously been observed
      * even from a previous boot.
+     * @hide
      */
     public void unregisterHealthObserver(PackageHealthObserver observer) {
         mLongTaskHandler.post(() -> {
@@ -425,7 +452,7 @@
      *
      * <p>This method could be called frequently if there is a severe problem on the device.
      */
-    public void onPackageFailure(List<VersionedPackage> packages,
+    public void onPackageFailure(@NonNull List<VersionedPackage> packages,
             @FailureReasons int failureReason) {
         if (packages == null) {
             Slog.w(TAG, "Could not resolve a list of failing packages");
@@ -566,6 +593,7 @@
      *
      * Note: PackageWatchdog considers system_server restart loop as bootloop. Full reboots
      * are not counted in bootloop.
+     * @hide
      */
     @SuppressWarnings("GuardedBy")
     public void noteBoot() {
@@ -620,7 +648,7 @@
     // TODO(b/120598832): Optimize write? Maybe only write a separate smaller file? Also
     // avoid holding lock?
     // This currently adds about 7ms extra to shutdown thread
-    /** Writes the package information to file during shutdown. */
+    /** @hide Writes the package information to file during shutdown. */
     public void writeNow() {
         synchronized (mLock) {
             // Must only run synchronous tasks as this runs on the ShutdownThread and no other
@@ -674,6 +702,7 @@
      * Since this method can eventually trigger a rollback, it should be called
      * only once boot has completed {@code onBootCompleted} and not earlier, because the install
      * session must be entirely completed before we try to rollback.
+     * @hide
      */
     public void scheduleCheckAndMitigateNativeCrashes() {
         Slog.i(TAG, "Scheduling " + mNumberOfNativeCrashPollsRemaining + " polls to check "
@@ -695,7 +724,9 @@
         return mPackagesExemptFromImpactLevelThreshold;
     }
 
-    /** Possible severity values of the user impact of a {@link PackageHealthObserver#execute}. */
+    /** Possible severity values of the user impact of a {@link PackageHealthObserver#execute}.
+     * @hide
+     */
     @Retention(SOURCE)
     @IntDef(value = {PackageHealthObserverImpact.USER_IMPACT_LEVEL_0,
                      PackageHealthObserverImpact.USER_IMPACT_LEVEL_10,
@@ -787,7 +818,7 @@
          * Identifier for the observer, should not change across device updates otherwise the
          * watchdog may drop observing packages with the old name.
          */
-        String getUniqueIdentifier();
+        @NonNull String getUniqueIdentifier();
 
         /**
          * An observer will not be pruned if this is set, even if the observer is not explicitly
@@ -804,7 +835,7 @@
          * <p> A persistent observer may choose to start observing certain failing packages, even if
          * it has not explicitly asked to watch the package with {@link #startObservingHealth}.
          */
-        default boolean mayObservePackage(String packageName) {
+        default boolean mayObservePackage(@NonNull String packageName) {
             return false;
         }
     }
@@ -1240,7 +1271,7 @@
         }
     }
 
-    /** Convert a {@code LongArrayQueue} to a String of comma-separated values. */
+    /** @hide Convert a {@code LongArrayQueue} to a String of comma-separated values. */
     public static String longArrayQueueToString(LongArrayQueue queue) {
         if (queue.size() > 0) {
             StringBuilder sb = new StringBuilder();
@@ -1254,7 +1285,7 @@
         return "";
     }
 
-    /** Parse a comma-separated String of longs into a LongArrayQueue. */
+    /** @hide Parse a comma-separated String of longs into a LongArrayQueue. */
     public static LongArrayQueue parseLongArrayQueue(String commaSeparatedValues) {
         LongArrayQueue result = new LongArrayQueue();
         if (!TextUtils.isEmpty(commaSeparatedValues)) {
@@ -1268,7 +1299,17 @@
 
 
     /** Dump status of every observer in mAllObservers. */
-    public void dump(PrintWriter pw) {
+    public void dump(@NonNull PrintWriter pw) {
+        if (Flags.synchronousRebootInRescueParty() && RescueParty.isRecoveryTriggeredReboot()) {
+            dumpInternal(pw);
+        } else {
+            synchronized (mLock) {
+                dumpInternal(pw);
+            }
+        }
+    }
+
+    private void dumpInternal(@NonNull PrintWriter pw) {
         IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ");
         ipw.println("Package Watchdog status");
         ipw.increaseIndent();
@@ -1395,6 +1436,7 @@
         /**
          * Increments failure counts of {@code packageName}.
          * @returns {@code true} if failure threshold is exceeded, {@code false} otherwise
+         * @hide
          */
         @GuardedBy("mLock")
         public boolean onPackageFailureLocked(String packageName) {
@@ -1514,6 +1556,7 @@
         }
     }
 
+    /** @hide */
     @Retention(SOURCE)
     @IntDef(value = {
             HealthCheckState.ACTIVE,
@@ -1603,7 +1646,9 @@
             updateHealthCheckStateLocked();
         }
 
-        /** Writes the salient fields to disk using {@code out}. */
+        /** Writes the salient fields to disk using {@code out}.
+         * @hide
+         */
         @GuardedBy("mLock")
         public void writeLocked(TypedXmlSerializer out) throws IOException {
             out.startTag(null, TAG_PACKAGE);
@@ -1987,7 +2032,7 @@
             } else {
                 int count = getCount() + 1;
                 setCount(count);
-                EventLogTags.writeRescueNote(Process.ROOT_UID, count, window);
+                EventLog.writeEvent(LOG_TAG_RESCUE_NOTE, Process.ROOT_UID, count, window);
                 if (Flags.recoverabilityDetection()) {
                     // After a reboot (e.g. by WARM_REBOOT or mainline rollback) we apply
                     // mitigations without waiting for DEFAULT_BOOT_LOOP_TRIGGER_COUNT.
diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java
deleted file mode 100644
index ef03888..0000000
--- a/services/core/java/com/android/server/PinnerService.java
+++ /dev/null
@@ -1,1571 +0,0 @@
-/*
- * Copyright (C) 2023 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;
-
-import static android.app.ActivityManager.UID_OBSERVER_ACTIVE;
-import static android.app.ActivityManager.UID_OBSERVER_GONE;
-import static android.os.Process.SYSTEM_UID;
-
-import static com.android.server.flags.Flags.pinWebview;
-import static com.android.server.flags.Flags.skipHomeArtPins;
-
-import android.annotation.EnforcePermission;
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.app.ActivityManagerInternal;
-import android.app.IActivityManager;
-import android.app.UidObserver;
-import android.app.pinner.IPinnerService;
-import android.app.pinner.PinnedFileStat;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Handler;
-import android.os.HandlerExecutor;
-import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.ResultReceiver;
-import android.os.ShellCallback;
-import android.os.SystemProperties;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.DeviceConfig;
-import android.provider.DeviceConfigInterface;
-import android.provider.MediaStore;
-import android.provider.Settings;
-import android.system.ErrnoException;
-import android.system.Os;
-import android.system.OsConstants;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.Slog;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.app.ResolverActivity;
-import com.android.internal.os.BackgroundThread;
-import com.android.internal.util.DumpUtils;
-import com.android.internal.util.function.pooled.PooledLambda;
-import com.android.server.wm.ActivityTaskManagerInternal;
-
-import dalvik.system.DexFile;
-import dalvik.system.VMRuntime;
-
-import java.io.Closeable;
-import java.io.DataInputStream;
-import java.io.FileDescriptor;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import sun.misc.Unsafe;
-
-/**
- * <p>PinnerService pins important files for key processes in memory.</p>
- * <p>Files to pin are specified in the config_defaultPinnerServiceFiles
- * overlay.</p>
- * <p>Pin the default camera application if specified in config_pinnerCameraApp.</p>
- * <p>(Optional) Pin experimental carveout regions based on DeviceConfig flags.</p>
- */
-public final class PinnerService extends SystemService {
-    private static final boolean DEBUG = false;
-    private static final String TAG = "PinnerService";
-
-    private static final String PIN_META_FILENAME = "pinlist.meta";
-    private static final int PAGE_SIZE = (int) Os.sysconf(OsConstants._SC_PAGESIZE);
-    private static final int MATCH_FLAGS = PackageManager.MATCH_DEFAULT_ONLY
-            | PackageManager.MATCH_DIRECT_BOOT_AWARE
-            | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
-
-    private static final int KEY_CAMERA = 0;
-    private static final int KEY_HOME = 1;
-    private static final int KEY_ASSISTANT = 2;
-
-    // Pin using pinlist.meta when pinning apps.
-    private static boolean PROP_PIN_PINLIST =
-            SystemProperties.getBoolean("pinner.use_pinlist", true);
-
-    private static final int MAX_CAMERA_PIN_SIZE = 80 * (1 << 20); // 80MB max for camera app.
-    private static final int MAX_ASSISTANT_PIN_SIZE = 60 * (1 << 20); // 60MB max for assistant app.
-
-    public static final String ANON_REGION_STAT_NAME = "[anon]";
-
-    @IntDef({KEY_CAMERA, KEY_HOME, KEY_ASSISTANT})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface AppKey {}
-
-    private final Context mContext;
-    private final Injector mInjector;
-    private final DeviceConfigInterface mDeviceConfigInterface;
-    private final ActivityTaskManagerInternal mAtmInternal;
-    private final ActivityManagerInternal mAmInternal;
-    private final IActivityManager mAm;
-    private final UserManager mUserManager;
-
-    /** The list of the statically pinned files. */
-    @GuardedBy("this") private final ArrayMap<String, PinnedFile> mPinnedFiles = new ArrayMap<>();
-
-    /** The list of the pinned apps. This is a map from {@link AppKey} to a pinned app. */
-    @GuardedBy("this")
-    private final ArrayMap<Integer, PinnedApp> mPinnedApps = new ArrayMap<>();
-
-    /**
-     * The list of the pinned apps that need to be repinned as soon as the all processes of a given
-     * uid are no longer active. Note that with background dex opt, the new dex/vdex files are only
-     * loaded into the processes once it restarts. So in case background dex opt recompiled these
-     * files, we still need to keep the old ones pinned until the processes restart.
-     * <p>
-     * This is a map from uid to {@link AppKey}
-     */
-    @GuardedBy("this")
-    private final ArrayMap<Integer, Integer> mPendingRepin = new ArrayMap<>();
-
-    /**
-     * A set of {@link AppKey} that are configured to be pinned.
-     */
-    @GuardedBy("this")
-    private ArraySet<Integer> mPinKeys;
-
-    // Note that we don't use the `_BOOT` namespace for anonymous pinnings, as we want
-    // them to be responsive to dynamic flag changes for experimentation.
-    private static final String DEVICE_CONFIG_NAMESPACE_ANON_SIZE =
-            DeviceConfig.NAMESPACE_RUNTIME_NATIVE;
-    private static final String DEVICE_CONFIG_KEY_ANON_SIZE = "pin_shared_anon_size";
-    private static final long DEFAULT_ANON_SIZE =
-            SystemProperties.getLong("pinner.pin_shared_anon_size", 0);
-    private static final long MAX_ANON_SIZE = 2L * (1L << 30); // 2GB
-    private long mPinAnonSize;
-    private long mPinAnonAddress;
-    private long mCurrentlyPinnedAnonSize;
-
-    // Resource-configured pinner flags;
-    private final boolean mConfiguredToPinCamera;
-    private final int mConfiguredHomePinBytes;
-    private final boolean mConfiguredToPinAssistant;
-    private final int mConfiguredWebviewPinBytes;
-
-    private BinderService mBinderService;
-    private PinnerHandler mPinnerHandler = null;
-
-    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-          // If an app has updated, update pinned files accordingly.
-          if (Intent.ACTION_PACKAGE_REPLACED.equals(intent.getAction())) {
-                Uri packageUri = intent.getData();
-                String packageName = packageUri.getSchemeSpecificPart();
-                ArraySet<String> updatedPackages = new ArraySet<>();
-                updatedPackages.add(packageName);
-                update(updatedPackages, true /* force */);
-            }
-        }
-    };
-
-    private final DeviceConfig.OnPropertiesChangedListener mDeviceConfigAnonSizeListener =
-            new DeviceConfig.OnPropertiesChangedListener() {
-                @Override
-                public void onPropertiesChanged(DeviceConfig.Properties properties) {
-                    if (DEVICE_CONFIG_NAMESPACE_ANON_SIZE.equals(properties.getNamespace())
-                            && properties.getKeyset().contains(DEVICE_CONFIG_KEY_ANON_SIZE)) {
-                        refreshPinAnonConfig();
-                    }
-                }
-            };
-
-    /** Utility class for testing. */
-    @VisibleForTesting
-    static class Injector {
-        protected DeviceConfigInterface getDeviceConfigInterface() {
-            return DeviceConfigInterface.REAL;
-        }
-
-        protected void publishBinderService(PinnerService service, Binder binderService) {
-            service.publishBinderService("pinner", binderService);
-        }
-
-        protected PinnedFile pinFileInternal(String fileToPin,
-                int maxBytesToPin, boolean attemptPinIntrospection) {
-            return PinnerService.pinFileInternal(fileToPin, maxBytesToPin, attemptPinIntrospection);
-        }
-    }
-
-    public PinnerService(Context context) {
-        this(context, new Injector());
-    }
-
-    @VisibleForTesting
-    PinnerService(Context context, Injector injector) {
-        super(context);
-
-        mContext = context;
-        mInjector = injector;
-        mDeviceConfigInterface = mInjector.getDeviceConfigInterface();
-        mConfiguredToPinCamera = context.getResources().getBoolean(
-                com.android.internal.R.bool.config_pinnerCameraApp);
-        mConfiguredHomePinBytes = context.getResources().getInteger(
-                com.android.internal.R.integer.config_pinnerHomePinBytes);
-        mConfiguredToPinAssistant = context.getResources().getBoolean(
-                com.android.internal.R.bool.config_pinnerAssistantApp);
-        mConfiguredWebviewPinBytes = context.getResources().getInteger(
-                com.android.internal.R.integer.config_pinnerWebviewPinBytes);
-        mPinKeys = createPinKeys();
-        mPinnerHandler = new PinnerHandler(BackgroundThread.get().getLooper());
-
-        mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
-        mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
-        mAm = ActivityManager.getService();
-
-        mUserManager = mContext.getSystemService(UserManager.class);
-
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
-        filter.addDataScheme("package");
-        mContext.registerReceiver(mBroadcastReceiver, filter);
-
-        registerUidListener();
-        registerUserSetupCompleteListener();
-
-        mDeviceConfigInterface.addOnPropertiesChangedListener(
-                DEVICE_CONFIG_NAMESPACE_ANON_SIZE,
-                new HandlerExecutor(mPinnerHandler),
-                mDeviceConfigAnonSizeListener);
-    }
-
-    @Override
-    public void onStart() {
-        if (DEBUG) {
-            Slog.i(TAG, "Starting PinnerService");
-        }
-        mBinderService = new BinderService();
-        mInjector.publishBinderService(this, mBinderService);
-        publishLocalService(PinnerService.class, this);
-
-        mPinnerHandler.obtainMessage(PinnerHandler.PIN_ONSTART_MSG).sendToTarget();
-        sendPinAppsMessage(UserHandle.USER_SYSTEM);
-    }
-
-    /**
-     * Repin apps on user switch.
-     * <p>
-     * If more than one user is using the device each user may set a different preference for the
-     * individual apps. Make sure that user's preference is pinned into memory.
-     */
-    @Override
-    public void onUserSwitching(@Nullable TargetUser from, @NonNull TargetUser to) {
-        int userId = to.getUserIdentifier();
-        if (!mUserManager.isManagedProfile(userId)) {
-            sendPinAppsMessage(userId);
-        }
-    }
-
-    @Override
-    public void onUserUnlocking(@NonNull TargetUser user) {
-        final int userId = user.getUserIdentifier();
-        if (userId != UserHandle.USER_SYSTEM && !mUserManager.isManagedProfile(userId)) {
-            // App pinning for the system should have already been triggered from onStart().
-            sendPinAppsMessage(userId);
-        }
-    }
-
-    /**
-     * Update the currently pinned files.
-     * Specifically, this only updates pinning for the apps that need to be pinned.
-     * The other files pinned in onStart will not need to be updated.
-     */
-    public void update(ArraySet<String> updatedPackages, boolean force) {
-        ArraySet<Integer> pinKeys = getPinKeys();
-        int currentUser = ActivityManager.getCurrentUser();
-        for (int i = pinKeys.size() - 1; i >= 0; i--) {
-            int key = pinKeys.valueAt(i);
-            ApplicationInfo info = getInfoForKey(key, currentUser);
-            if (info != null && updatedPackages.contains(info.packageName)) {
-                Slog.i(TAG, "Updating pinned files for " + info.packageName + " force=" + force);
-                sendPinAppMessage(key, currentUser, force);
-            }
-        }
-    }
-
-    /** Returns information about pinned files and sizes for StatsPullAtomService. */
-    public List<PinnedFileStats> dumpDataForStatsd() {
-        List<PinnedFileStats> pinnedFileStats = new ArrayList<>();
-        synchronized (PinnerService.this) {
-            for (PinnedFile pinnedFile : mPinnedFiles.values()) {
-                pinnedFileStats.add(new PinnedFileStats(SYSTEM_UID, pinnedFile));
-            }
-
-            for (int key : mPinnedApps.keySet()) {
-                PinnedApp app = mPinnedApps.get(key);
-                for (PinnedFile pinnedFile : mPinnedApps.get(key).mFiles) {
-                    pinnedFileStats.add(new PinnedFileStats(app.uid, pinnedFile));
-                }
-            }
-        }
-        return pinnedFileStats;
-    }
-
-    /** Wrapper class for statistics for a pinned file. */
-    public static class PinnedFileStats {
-        public final int uid;
-        public final String filename;
-        public final int sizeKb;
-
-        protected PinnedFileStats(int uid, PinnedFile file) {
-            this.uid = uid;
-            this.filename = file.fileName.substring(file.fileName.lastIndexOf('/') + 1);
-            this.sizeKb = file.bytesPinned / 1024;
-        }
-    }
-
-    /**
-     * Handler for on start pinning message
-     */
-    private void handlePinOnStart() {
-        // Files to pin come from the overlay and can be specified per-device config
-        String[] filesToPin = mContext.getResources().getStringArray(
-            com.android.internal.R.array.config_defaultPinnerServiceFiles);
-        // Continue trying to pin each file even if we fail to pin some of them
-        for (String fileToPin : filesToPin) {
-            PinnedFile pf = mInjector.pinFileInternal(fileToPin, Integer.MAX_VALUE,
-                    /*attemptPinIntrospection=*/false);
-            if (pf == null) {
-                Slog.e(TAG, "Failed to pin file = " + fileToPin);
-                continue;
-            }
-            synchronized (this) {
-                mPinnedFiles.put(pf.fileName, pf);
-            }
-            pf.groupName = "system";
-            pinOptimizedDexDependencies(pf, Integer.MAX_VALUE, null);
-        }
-
-        refreshPinAnonConfig();
-    }
-
-    /**
-     * Registers a listener to repin the home app when user setup is complete, as the home intent
-     * initially resolves to setup wizard, but once setup is complete, it will resolve to the
-     * regular home app.
-     */
-    private void registerUserSetupCompleteListener() {
-        Uri userSetupCompleteUri = Settings.Secure.getUriFor(
-                Settings.Secure.USER_SETUP_COMPLETE);
-        mContext.getContentResolver().registerContentObserver(userSetupCompleteUri,
-                false, new ContentObserver(null) {
-                    @Override
-                    public void onChange(boolean selfChange, Uri uri) {
-                        if (userSetupCompleteUri.equals(uri)) {
-                            if (mConfiguredHomePinBytes > 0) {
-                                sendPinAppMessage(KEY_HOME, ActivityManager.getCurrentUser(),
-                                        true /* force */);
-                            }
-                        }
-                    }
-                }, UserHandle.USER_ALL);
-    }
-
-    private void registerUidListener() {
-        try {
-            mAm.registerUidObserver(new UidObserver() {
-                @Override
-                public void onUidGone(int uid, boolean disabled) {
-                    mPinnerHandler.sendMessage(PooledLambda.obtainMessage(
-                            PinnerService::handleUidGone, PinnerService.this, uid));
-                }
-
-                @Override
-                public void onUidActive(int uid)  {
-                    mPinnerHandler.sendMessage(PooledLambda.obtainMessage(
-                            PinnerService::handleUidActive, PinnerService.this, uid));
-                }
-            }, UID_OBSERVER_GONE | UID_OBSERVER_ACTIVE, 0, null);
-        } catch (RemoteException e) {
-            Slog.e(TAG, "Failed to register uid observer", e);
-        }
-    }
-
-    private void handleUidGone(int uid) {
-        updateActiveState(uid, false /* active */);
-        int key;
-        synchronized (this) {
-
-            // In case we have a pending repin, repin now. See mPendingRepin for more information.
-            key = mPendingRepin.getOrDefault(uid, -1);
-            if (key == -1) {
-                return;
-            }
-            mPendingRepin.remove(uid);
-        }
-        pinApp(key, ActivityManager.getCurrentUser(), false /* force */);
-    }
-
-    private void handleUidActive(int uid) {
-        updateActiveState(uid, true /* active */);
-    }
-
-    private void updateActiveState(int uid, boolean active) {
-        synchronized (this) {
-            for (int i = mPinnedApps.size() - 1; i >= 0; i--) {
-                PinnedApp app = mPinnedApps.valueAt(i);
-                if (app.uid == uid) {
-                    app.active = active;
-                }
-            }
-        }
-    }
-
-    private void unpinApps() {
-        ArraySet<Integer> pinKeys = getPinKeys();
-        for (int i = pinKeys.size() - 1; i >= 0; i--) {
-            int key = pinKeys.valueAt(i);
-            unpinApp(key);
-        }
-    }
-
-    private void unpinApp(@AppKey int key) {
-        ArrayList<PinnedFile> pinnedAppFiles;
-        synchronized (this) {
-            PinnedApp app = mPinnedApps.get(key);
-            if (app == null) {
-                return;
-            }
-            mPinnedApps.remove(key);
-            pinnedAppFiles = new ArrayList<>(app.mFiles);
-        }
-        for (PinnedFile pinnedFile : pinnedAppFiles) {
-            unpinFile(pinnedFile.fileName);
-        }
-    }
-
-    private boolean isResolverActivity(ActivityInfo info) {
-        return ResolverActivity.class.getName().equals(info.name);
-    }
-
-    public int getWebviewPinQuota() {
-        if (!pinWebview()) {
-            return 0;
-        }
-        int quota = mConfiguredWebviewPinBytes;
-        int overrideQuota = SystemProperties.getInt("pinner.pin_webview_size", -1);
-        if (overrideQuota != -1) {
-            // Quota was overridden
-            quota = overrideQuota;
-        }
-        return quota;
-    }
-
-    private ApplicationInfo getCameraInfo(int userHandle) {
-        Intent cameraIntent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
-        ApplicationInfo info = getApplicationInfoForIntent(cameraIntent, userHandle,
-            false /* defaultToSystemApp */);
-
-        // If the STILL_IMAGE_CAMERA intent doesn't resolve, try the _SECURE intent.
-        // We don't use _SECURE first because it will never get set on a device
-        // without File-based Encryption. But if the user has only set the intent
-        // before unlocking their device, we may still be able to identify their
-        // preference using this intent.
-        if (info == null) {
-            cameraIntent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE);
-            info = getApplicationInfoForIntent(cameraIntent, userHandle,
-                false /* defaultToSystemApp */);
-        }
-
-        // If the _SECURE intent doesn't resolve, try the original intent but request
-        // the system app for camera if there was more than one result.
-        if (info == null) {
-            cameraIntent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
-            info = getApplicationInfoForIntent(cameraIntent, userHandle,
-                true /* defaultToSystemApp */);
-        }
-        return info;
-    }
-
-    private ApplicationInfo getHomeInfo(int userHandle) {
-        Intent intent = mAtmInternal.getHomeIntent();
-        return getApplicationInfoForIntent(intent, userHandle, false);
-    }
-
-    private ApplicationInfo getAssistantInfo(int userHandle) {
-        Intent intent = new Intent(Intent.ACTION_ASSIST);
-        return getApplicationInfoForIntent(intent, userHandle, true);
-    }
-
-    private ApplicationInfo getApplicationInfoForIntent(Intent intent, int userHandle,
-            boolean defaultToSystemApp) {
-        if (intent == null) {
-            return null;
-        }
-
-        ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivityAsUser(intent,
-                MATCH_FLAGS, userHandle);
-
-        // If this intent can resolve to only one app, choose that one.
-        // Otherwise, if we've requested to default to the system app, return it;
-        // if we have not requested that default, return null if there's more than one option.
-        // If there's more than one system app, return null since we don't know which to pick.
-        if (resolveInfo == null) {
-            return null;
-        }
-
-        if (!isResolverActivity(resolveInfo.activityInfo)) {
-            return resolveInfo.activityInfo.applicationInfo;
-        }
-
-        if (defaultToSystemApp) {
-            List<ResolveInfo> infoList = mContext.getPackageManager()
-                .queryIntentActivitiesAsUser(intent, MATCH_FLAGS, userHandle);
-            ApplicationInfo systemAppInfo = null;
-            for (ResolveInfo info : infoList) {
-                if ((info.activityInfo.applicationInfo.flags
-                      & ApplicationInfo.FLAG_SYSTEM) != 0) {
-                    if (systemAppInfo == null) {
-                        systemAppInfo = info.activityInfo.applicationInfo;
-                    } else {
-                        // If there's more than one system app, return null due to ambiguity.
-                        return null;
-                    }
-                }
-            }
-            return systemAppInfo;
-        }
-
-        return null;
-    }
-
-    private void sendPinAppsMessage(int userHandle) {
-        mPinnerHandler.sendMessage(PooledLambda.obtainMessage(PinnerService::pinApps, this,
-                userHandle));
-    }
-
-    private void sendPinAppsWithUpdatedKeysMessage(int userHandle) {
-        mPinnerHandler.sendMessage(PooledLambda.obtainMessage(PinnerService::pinAppsWithUpdatedKeys,
-                this, userHandle));
-    }
-    private void sendUnpinAppsMessage() {
-        mPinnerHandler.sendMessage(PooledLambda.obtainMessage(PinnerService::unpinApps, this));
-    }
-
-    private ArraySet<Integer> createPinKeys() {
-        ArraySet<Integer> pinKeys = new ArraySet<>();
-        // Pin the camera application. Default to the system property only if the experiment
-        // phenotype property is not set.
-        boolean shouldPinCamera = mConfiguredToPinCamera
-                && mDeviceConfigInterface.getBoolean(DeviceConfig.NAMESPACE_RUNTIME_NATIVE_BOOT,
-                        "pin_camera",
-                        SystemProperties.getBoolean("pinner.pin_camera", true));
-        if (shouldPinCamera) {
-            pinKeys.add(KEY_CAMERA);
-        } else if (DEBUG) {
-            Slog.i(TAG, "Pinner - skip pinning camera app");
-        }
-
-        if (mConfiguredHomePinBytes > 0) {
-            pinKeys.add(KEY_HOME);
-        }
-        if (mConfiguredToPinAssistant) {
-            pinKeys.add(KEY_ASSISTANT);
-        }
-
-        return pinKeys;
-    }
-
-    private synchronized ArraySet<Integer> getPinKeys() {
-        return mPinKeys;
-    }
-
-    private void pinApps(int userHandle) {
-        pinAppsInternal(userHandle, false);
-    }
-
-    private void pinAppsWithUpdatedKeys(int userHandle) {
-        pinAppsInternal(userHandle, true);
-    }
-
-    /**
-     * @param updateKeys True if the pinned app list has to be updated. This is true only when
-     *                   "pinner repin" shell command is requested.
-     */
-    private void pinAppsInternal(int userHandle, boolean updateKeys) {
-        if (updateKeys) {
-            ArraySet<Integer> newKeys = createPinKeys();
-            synchronized (this) {
-                // This code path demands preceding unpinApps() call.
-                if (!mPinnedApps.isEmpty()) {
-                    Slog.e(TAG, "Attempted to update a list of apps, "
-                            + "but apps were already pinned. Skipping.");
-                    return;
-                }
-
-                mPinKeys = newKeys;
-            }
-        }
-
-        ArraySet<Integer> currentPinKeys = getPinKeys();
-        for (int i = currentPinKeys.size() - 1; i >= 0; i--) {
-            int key = currentPinKeys.valueAt(i);
-            pinApp(key, userHandle, true /* force */);
-        }
-    }
-
-    /**
-     * @see #pinApp(int, int, boolean)
-     */
-    private void sendPinAppMessage(int key, int userHandle, boolean force) {
-        mPinnerHandler.sendMessage(PooledLambda.obtainMessage(PinnerService::pinApp, this,
-                key, userHandle, force));
-    }
-
-    /**
-     * Pins an app of a specific type {@code key}.
-     *
-     * @param force If false, this will not repin the app if it's currently active. See
-     *              {@link #mPendingRepin}.
-     */
-    private void pinApp(int key, int userHandle, boolean force) {
-        int uid = getUidForKey(key);
-
-        // In case the app is currently active, don't repin until next process restart. See
-        // mPendingRepin for more information.
-        if (!force && uid != -1) {
-            synchronized (this) {
-                mPendingRepin.put(uid, key);
-            }
-            return;
-        }
-        unpinApp(key);
-        ApplicationInfo info = getInfoForKey(key, userHandle);
-        if (info != null) {
-            pinApp(key, info);
-        }
-    }
-
-    /**
-     * Checks whether the pinned package with {@code key} is active or not.
-
-     * @return The uid of the pinned app, or {@code -1} otherwise.
-     */
-    private int getUidForKey(@AppKey int key) {
-        synchronized (this) {
-            PinnedApp existing = mPinnedApps.get(key);
-            return existing != null && existing.active
-                    ? existing.uid
-                    : -1;
-        }
-    }
-
-    /**
-     * Retrieves the current application info for the given app type.
-     *
-     * @param key The app type to retrieve the info for.
-     * @param userHandle The user id of the current user.
-     */
-    private @Nullable ApplicationInfo getInfoForKey(@AppKey int key, int userHandle) {
-        switch (key) {
-            case KEY_CAMERA:
-                return getCameraInfo(userHandle);
-            case KEY_HOME:
-                return getHomeInfo(userHandle);
-            case KEY_ASSISTANT:
-                return getAssistantInfo(userHandle);
-            default:
-                return null;
-        }
-    }
-
-    /**
-     * @return The app type name for {@code key}.
-     */
-    private String getNameForKey(@AppKey int key) {
-        switch (key) {
-            case KEY_CAMERA:
-                return "Camera";
-            case KEY_HOME:
-                return "Home";
-            case KEY_ASSISTANT:
-                return "Assistant";
-            default:
-                return "";
-        }
-    }
-
-    /**
-     * Handle any changes in the anon region pinner config.
-     */
-    private void refreshPinAnonConfig() {
-        long newPinAnonSize =
-                mDeviceConfigInterface.getLong(
-                        DEVICE_CONFIG_NAMESPACE_ANON_SIZE,
-                        DEVICE_CONFIG_KEY_ANON_SIZE,
-                        DEFAULT_ANON_SIZE);
-        newPinAnonSize = Math.max(0, Math.min(newPinAnonSize, MAX_ANON_SIZE));
-        if (newPinAnonSize != mPinAnonSize) {
-            mPinAnonSize = newPinAnonSize;
-            pinAnonRegion();
-        }
-    }
-
-    /**
-     * Pin an empty anonymous region. This should only be used for ablation experiments.
-     */
-    private void pinAnonRegion() {
-        if (mPinAnonSize == 0) {
-            Slog.d(TAG, "pinAnonRegion: releasing pinned region");
-            unpinAnonRegion();
-            return;
-        }
-        long alignedPinSize = mPinAnonSize;
-        if (alignedPinSize % PAGE_SIZE != 0) {
-            alignedPinSize -= alignedPinSize % PAGE_SIZE;
-            Slog.e(TAG, "pinAnonRegion: aligning size to " + alignedPinSize);
-        }
-        if (mPinAnonAddress != 0) {
-            if (mCurrentlyPinnedAnonSize == alignedPinSize) {
-                Slog.d(TAG, "pinAnonRegion: already pinned region of size " + alignedPinSize);
-                return;
-            }
-            Slog.d(TAG, "pinAnonRegion: resetting pinned region for new size " + alignedPinSize);
-            unpinAnonRegion();
-        }
-        long address = 0;
-        try {
-            // Map as SHARED to avoid changing rss.anon for system_server (per /proc/*/status).
-            // The mapping is visible in other rss metrics, and as private dirty in smaps/meminfo.
-            address = Os.mmap(0, alignedPinSize,
-                    OsConstants.PROT_READ | OsConstants.PROT_WRITE,
-                    OsConstants.MAP_SHARED | OsConstants.MAP_ANONYMOUS,
-                    new FileDescriptor(), /*offset=*/0);
-
-            Unsafe tempUnsafe = null;
-            Class<sun.misc.Unsafe> clazz = sun.misc.Unsafe.class;
-            for (java.lang.reflect.Field f : clazz.getDeclaredFields()) {
-                f.setAccessible(true);
-                Object obj = f.get(null);
-                if (clazz.isInstance(obj)) {
-                    tempUnsafe = clazz.cast(obj);
-                }
-            }
-            if (tempUnsafe == null) {
-                throw new Exception("Couldn't get Unsafe");
-            }
-            Method setMemory = clazz.getMethod("setMemory", long.class, long.class, byte.class);
-            setMemory.invoke(tempUnsafe, address, alignedPinSize, (byte) 1);
-            Os.mlock(address, alignedPinSize);
-            mCurrentlyPinnedAnonSize = alignedPinSize;
-            mPinAnonAddress = address;
-            address = -1;
-            Slog.w(TAG, "pinAnonRegion success, size=" + mCurrentlyPinnedAnonSize);
-        } catch (Exception ex) {
-            Slog.e(TAG, "Could not pin anon region of size " + alignedPinSize, ex);
-            return;
-        } finally {
-            if (address >= 0) {
-                safeMunmap(address, alignedPinSize);
-            }
-        }
-    }
-
-    private void unpinAnonRegion() {
-        if (mPinAnonAddress != 0) {
-            safeMunmap(mPinAnonAddress, mCurrentlyPinnedAnonSize);
-        }
-        mPinAnonAddress = 0;
-        mCurrentlyPinnedAnonSize = 0;
-    }
-
-    /**
-     * @return The maximum amount of bytes to be pinned for an app of type {@code key}.
-     */
-    private int getSizeLimitForKey(@AppKey int key) {
-        switch (key) {
-            case KEY_CAMERA:
-                return MAX_CAMERA_PIN_SIZE;
-            case KEY_HOME:
-                return mConfiguredHomePinBytes;
-            case KEY_ASSISTANT:
-                return MAX_ASSISTANT_PIN_SIZE;
-            default:
-                return 0;
-        }
-    }
-
-    /**
-     * Pins an application.
-     *
-     * @param key The key of the app to pin.
-     * @param appInfo The corresponding app info.
-     */
-    private void pinApp(@AppKey int key, @Nullable ApplicationInfo appInfo) {
-        if (appInfo == null) {
-            return;
-        }
-
-        PinnedApp pinnedApp = new PinnedApp(appInfo);
-        synchronized (this) {
-            mPinnedApps.put(key, pinnedApp);
-        }
-
-
-        // pin APK
-        final int pinSizeLimit = getSizeLimitForKey(key);
-        List<String> apks = new ArrayList<>();
-        apks.add(appInfo.sourceDir);
-
-        if (appInfo.splitSourceDirs != null) {
-            for (String splitApk : appInfo.splitSourceDirs) {
-                apks.add(splitApk);
-            }
-        }
-
-        int apkPinSizeLimit = pinSizeLimit;
-
-        boolean shouldSkipArtPins = key == KEY_HOME && skipHomeArtPins();
-
-        for (String apk: apks) {
-            if (apkPinSizeLimit <= 0) {
-                Slog.w(TAG, "Reached to the pin size limit. Skipping: " + apk);
-                // Continue instead of break to print all skipped APK names.
-                continue;
-            }
-
-            PinnedFile pf = mInjector.pinFileInternal(apk, apkPinSizeLimit, /*attemptPinIntrospection=*/true);
-            if (pf == null) {
-                Slog.e(TAG, "Failed to pin " + apk);
-                continue;
-            }
-            pf.groupName = getNameForKey(key);
-
-            if (DEBUG) {
-                Slog.i(TAG, "Pinned " + pf.fileName);
-            }
-            synchronized (this) {
-                pinnedApp.mFiles.add(pf);
-                mPinnedFiles.put(pf.fileName, pf);
-            }
-
-            apkPinSizeLimit -= pf.bytesPinned;
-            if (apk.equals(appInfo.sourceDir) && !shouldSkipArtPins) {
-                pinOptimizedDexDependencies(pf, Integer.MAX_VALUE, appInfo);
-            }
-        }
-    }
-
-    /**
-     * Pin file or apk to memory.
-     *
-     * Prefer to use this method instead of {@link #pinFileInternal(String, int, boolean)} as it
-     * takes care of accounting and if pinning an apk, it also pins any extra optimized art files
-     * that related to the file but not within itself.
-     *
-     * @param fileToPin File to pin
-     * @param maxBytesToPin maximum quota allowed for pinning
-     * @return total bytes that were pinned.
-     */
-    public int pinFile(String fileToPin, int maxBytesToPin, @Nullable ApplicationInfo appInfo,
-            @Nullable String groupName) {
-        PinnedFile existingPin;
-        synchronized(this) {
-            existingPin = mPinnedFiles.get(fileToPin);
-        }
-        if (existingPin != null) {
-            if (existingPin.bytesPinned == maxBytesToPin) {
-                // Duplicate pin requesting same amount of bytes, lets just bail out.
-                return 0;
-            } else {
-                // User decided to pin a different amount of bytes than currently pinned
-                // so this is a valid pin request. Unpin the previous version before repining.
-                if (DEBUG) {
-                    Slog.d(TAG, "Unpinning file prior to repin: " + fileToPin);
-                }
-                unpinFile(fileToPin);
-            }
-        }
-
-        boolean isApk = fileToPin.endsWith(".apk");
-        int bytesPinned = 0;
-        PinnedFile pf = mInjector.pinFileInternal(fileToPin, maxBytesToPin,
-                /*attemptPinIntrospection=*/isApk);
-        if (pf == null) {
-            Slog.e(TAG, "Failed to pin file = " + fileToPin);
-            return 0;
-        }
-        pf.groupName = groupName != null ? groupName : "";
-
-        bytesPinned += pf.bytesPinned;
-        maxBytesToPin -= bytesPinned;
-
-        synchronized (this) {
-            mPinnedFiles.put(pf.fileName, pf);
-        }
-        if (maxBytesToPin > 0) {
-            pinOptimizedDexDependencies(pf, maxBytesToPin, appInfo);
-        }
-        return bytesPinned;
-    }
-
-    /**
-     * Pin any dependency optimized files generated by ART.
-     * @param pinnedFile An already pinned file whose dependencies we want pinned.
-     * @param maxBytesToPin Maximum amount of bytes to pin.
-     * @param appInfo Used to determine the ABI in case the application has one custom set, when set
-     *                to null it will use the default supported ABI by the device.
-     * @return total bytes pinned.
-     */
-    private int pinOptimizedDexDependencies(
-            PinnedFile pinnedFile, int maxBytesToPin, @Nullable ApplicationInfo appInfo) {
-        if (pinnedFile == null) {
-            return 0;
-        }
-
-        int bytesPinned = 0;
-        if (pinnedFile.fileName.endsWith(".jar") | pinnedFile.fileName.endsWith(".apk")) {
-            String abi = null;
-            if (appInfo != null) {
-                abi = appInfo.primaryCpuAbi;
-            }
-            if (abi == null) {
-                abi = Build.SUPPORTED_ABIS[0];
-            }
-            // Check whether the runtime has compilation artifacts to pin.
-            String arch = VMRuntime.getInstructionSet(abi);
-            String[] files = null;
-            try {
-                files = DexFile.getDexFileOutputPaths(pinnedFile.fileName, arch);
-            } catch (IOException ioe) {
-            }
-            if (files == null) {
-                return bytesPinned;
-            }
-            for (String file : files) {
-                // Unpin if it was already pinned prior to re-pinning.
-                unpinFile(file);
-
-                PinnedFile df = mInjector.pinFileInternal(file, maxBytesToPin,
-                        /*attemptPinIntrospection=*/false);
-                if (df == null) {
-                    Slog.i(TAG, "Failed to pin ART file = " + file);
-                    return bytesPinned;
-                }
-                df.groupName = pinnedFile.groupName;
-                pinnedFile.pinnedDeps.add(df);
-                maxBytesToPin -= df.bytesPinned;
-                bytesPinned += df.bytesPinned;
-                synchronized (this) {
-                    mPinnedFiles.put(df.fileName, df);
-                }
-            }
-        }
-        return bytesPinned;
-    }
-
-    /** mlock length bytes of fileToPin in memory
-     *
-     * If attemptPinIntrospection is true, then treat the file to pin as a zip file and
-     * look for a "pinlist.meta" file in the archive root directory. The structure of this
-     * file is a PINLIST_META as described below:
-     *
-     * <pre>
-     *   PINLIST_META: PIN_RANGE*
-     *   PIN_RANGE: PIN_START PIN_LENGTH
-     *   PIN_START: big endian i32: offset in bytes of pin region from file start
-     *   PIN_LENGTH: big endian i32: length of pin region in bytes
-     * </pre>
-     *
-     * (We use big endian because that's what DataInputStream is hardcoded to use.)
-     *
-     * If attemptPinIntrospection is false, then we use a single implicit PIN_RANGE of (0,
-     * maxBytesToPin); that is, we attempt to pin the first maxBytesToPin bytes of the file.
-     *
-     * After we open a file, we march through the list of pin ranges and attempt to pin
-     * each one, stopping after we've pinned maxBytesToPin bytes. (We may truncate the last
-     * pinned range to fit.)  In this way, by choosing to emit certain PIN_RANGE pairs
-     * before others, file generators can express pins in priority order, making most
-     * effective use of the pinned-page quota.
-     *
-     * N.B. Each PIN_RANGE is clamped to the actual bounds of the file; all inputs have a
-     * meaningful interpretation. Also, a range locking a single byte of a page locks the
-     * whole page. Any truncated PIN_RANGE at EOF is ignored. Overlapping pinned entries
-     * are legal, but each pin of a byte counts toward the pin quota regardless of whether
-     * that byte has already been pinned, so the generator of PINLIST_META ought to ensure
-     * that ranges are non-overlapping.
-     *
-     * @param fileToPin Path to file to pin
-     * @param maxBytesToPin Maximum number of bytes to pin
-     * @param attemptPinIntrospection If true, try to open file as a
-     *   zip in order to extract the
-     * @return Pinned memory resource owner thing or null on error
-     */
-    private static PinnedFile pinFileInternal(
-            String fileToPin, int maxBytesToPin, boolean attemptPinIntrospection) {
-        if (DEBUG) {
-            Slog.d(TAG, "pin file: " + fileToPin + " use-pinlist: " + attemptPinIntrospection);
-        }
-        ZipFile fileAsZip = null;
-        InputStream pinRangeStream = null;
-        try {
-            if (attemptPinIntrospection) {
-                fileAsZip = maybeOpenZip(fileToPin);
-            }
-
-            if (fileAsZip != null) {
-                pinRangeStream = maybeOpenPinMetaInZip(fileAsZip, fileToPin);
-            }
-            boolean use_pinlist = (pinRangeStream != null);
-            PinRangeSource pinRangeSource = use_pinlist
-                    ? new PinRangeSourceStream(pinRangeStream)
-                    : new PinRangeSourceStatic(0, Integer.MAX_VALUE /* will be clipped */);
-            PinnedFile pinnedFile = pinFileRanges(fileToPin, maxBytesToPin, pinRangeSource);
-            if (pinnedFile != null) {
-                pinnedFile.used_pinlist = use_pinlist;
-            }
-            return pinnedFile;
-        } finally {
-            safeClose(pinRangeStream);
-            safeClose(fileAsZip);  // Also closes any streams we've opened
-        }
-    }
-
-    /**
-     * Attempt to open a file as a zip file. On any sort of corruption, log, swallow the
-     * error, and return null.
-     */
-    private static ZipFile maybeOpenZip(String fileName) {
-        ZipFile zip = null;
-        try {
-            zip = new ZipFile(fileName);
-        } catch (IOException ex) {
-            Slog.w(TAG,
-                   String.format(
-                       "could not open \"%s\" as zip: pinning as blob",
-                                 fileName),
-                   ex);
-        }
-        return zip;
-    }
-
-    /**
-     * Open a pin metadata file in the zip if one is present.
-     *
-     * @param zipFile Zip file to search
-     * @return Open input stream or null on any error
-     */
-    private static InputStream maybeOpenPinMetaInZip(ZipFile zipFile, String fileName) {
-        if (!PROP_PIN_PINLIST) {
-            if (DEBUG) {
-                Slog.i(TAG, "Pin - skip pinlist.meta in " + fileName);
-            }
-            return null;
-        }
-
-        // Looking at root directory is the old behavior but still some apps rely on it so keeping
-        // for backward compatibility. As doing a single item lookup is cheap in the root.
-        ZipEntry pinMetaEntry = zipFile.getEntry(PIN_META_FILENAME);
-
-        if (pinMetaEntry == null) {
-            // It is usually within an apk's control to include files in assets/ directory
-            // so this would be the expected point to have the pinlist.meta coming from.
-            // we explicitly avoid doing an exhaustive search because it may be expensive so
-            // prefer to have a good known location to retrieve the file.
-            pinMetaEntry = zipFile.getEntry("assets/" + PIN_META_FILENAME);
-        }
-
-        InputStream pinMetaStream = null;
-        if (pinMetaEntry != null) {
-            if (DEBUG) {
-                Slog.d(TAG, "Found pinlist.meta for " + fileName);
-            }
-            try {
-                pinMetaStream = zipFile.getInputStream(pinMetaEntry);
-            } catch (IOException ex) {
-                Slog.w(TAG,
-                       String.format("error reading pin metadata \"%s\": pinning as blob",
-                                     fileName),
-                       ex);
-            }
-        } else {
-            Slog.w(TAG,
-                    String.format(
-                            "Could not find pinlist.meta for \"%s\": pinning as blob", fileName));
-        }
-        return pinMetaStream;
-    }
-
-    private static abstract class PinRangeSource {
-        /** Retrive a range to pin.
-         *
-         * @param outPinRange Receives the pin region
-         * @return True if we filled in outPinRange or false if we're out of pin entries
-         */
-        abstract boolean read(PinRange outPinRange);
-    }
-
-    private static final class PinRangeSourceStatic extends PinRangeSource {
-        private final int mPinStart;
-        private final int mPinLength;
-        private boolean mDone = false;
-
-        PinRangeSourceStatic(int pinStart, int pinLength) {
-            mPinStart = pinStart;
-            mPinLength = pinLength;
-        }
-
-        @Override
-        boolean read(PinRange outPinRange) {
-            outPinRange.start = mPinStart;
-            outPinRange.length = mPinLength;
-            boolean done = mDone;
-            mDone = true;
-            return !done;
-        }
-    }
-
-    private static final class PinRangeSourceStream extends PinRangeSource {
-        private final DataInputStream mStream;
-        private boolean mDone = false;
-
-        PinRangeSourceStream(InputStream stream) {
-            mStream = new DataInputStream(stream);
-        }
-
-        @Override
-        boolean read(PinRange outPinRange) {
-            if (!mDone) {
-                try {
-                    outPinRange.start = mStream.readInt();
-                    outPinRange.length = mStream.readInt();
-                } catch (IOException ex) {
-                    mDone = true;
-                }
-            }
-            return !mDone;
-        }
-    }
-
-    /**
-     * Helper for pinFile.
-     *
-     * @param fileToPin Name of file to pin
-     * @param maxBytesToPin Maximum number of bytes to pin
-     * @param pinRangeSource Read PIN_RANGE entries from this stream to tell us what bytes
-     *   to pin.
-     * @return PinnedFile or null on error
-     */
-    private static PinnedFile pinFileRanges(
-        String fileToPin,
-        int maxBytesToPin,
-        PinRangeSource pinRangeSource)
-    {
-        FileDescriptor fd = new FileDescriptor();
-        long address = -1;
-        int mapSize = 0;
-
-        try {
-            int openFlags = (OsConstants.O_RDONLY | OsConstants.O_CLOEXEC);
-            fd = Os.open(fileToPin, openFlags, 0);
-            mapSize = (int) Math.min(Os.fstat(fd).st_size, Integer.MAX_VALUE);
-            address = Os.mmap(0, mapSize,
-                              OsConstants.PROT_READ,
-                              OsConstants.MAP_SHARED,
-                              fd, /*offset=*/0);
-
-            PinRange pinRange = new PinRange();
-            int bytesPinned = 0;
-
-            // We pin at page granularity, so make sure the limit is page-aligned
-            if (maxBytesToPin % PAGE_SIZE != 0) {
-                maxBytesToPin -= maxBytesToPin % PAGE_SIZE;
-            }
-
-            while (bytesPinned < maxBytesToPin && pinRangeSource.read(pinRange)) {
-                int pinStart = pinRange.start;
-                int pinLength = pinRange.length;
-                pinStart = clamp(0, pinStart, mapSize);
-                pinLength = clamp(0, pinLength, mapSize - pinStart);
-                pinLength = Math.min(maxBytesToPin - bytesPinned, pinLength);
-
-                // mlock doesn't require the region to be page-aligned, but we snap the
-                // lock region to page boundaries anyway so that we don't under-count
-                // locking a single byte of a page as a charge of one byte even though the
-                // OS will retain the whole page. Thanks to this adjustment, we slightly
-                // over-count the pin charge of back-to-back pins touching the same page,
-                // but better that than undercounting. Besides: nothing stops pin metafile
-                // creators from making the actual regions page-aligned.
-                pinLength += pinStart % PAGE_SIZE;
-                pinStart -= pinStart % PAGE_SIZE;
-                if (pinLength % PAGE_SIZE != 0) {
-                    pinLength += PAGE_SIZE - pinLength % PAGE_SIZE;
-                }
-                pinLength = clamp(0, pinLength, maxBytesToPin - bytesPinned);
-
-                if (pinLength > 0) {
-                    if (DEBUG) {
-                        Slog.d(TAG,
-                               String.format(
-                                   "pinning at %s %s bytes of %s",
-                                   pinStart, pinLength, fileToPin));
-                    }
-                    Os.mlock(address + pinStart, pinLength);
-                }
-                bytesPinned += pinLength;
-            }
-
-            PinnedFile pinnedFile = new PinnedFile(address, mapSize, fileToPin, bytesPinned);
-            address = -1;  // Ownership transferred
-            return pinnedFile;
-        } catch (ErrnoException ex) {
-            Slog.e(TAG, "Could not pin file " + fileToPin, ex);
-            return null;
-        } finally {
-            safeClose(fd);
-            if (address >= 0) {
-                safeMunmap(address, mapSize);
-            }
-        }
-    }
-    private List<PinnedFile> getAllPinsForGroup(String group) {
-        List<PinnedFile> filesInGroup;
-        synchronized (this) {
-            filesInGroup = mPinnedFiles.values()
-                                   .stream()
-                                   .filter(pf -> pf.groupName.equals(group))
-                                   .toList();
-        }
-        return filesInGroup;
-    }
-    public void unpinGroup(String group) {
-        List<PinnedFile> pinnedFiles = getAllPinsForGroup(group);
-        for (PinnedFile pf : pinnedFiles) {
-            unpinFile(pf.fileName);
-        }
-    }
-
-    public void unpinFile(String filename) {
-        PinnedFile pinnedFile;
-        synchronized (this) {
-            pinnedFile = mPinnedFiles.get(filename);
-        }
-        if (pinnedFile == null) {
-            // File not pinned, nothing to do.
-            return;
-        }
-        pinnedFile.close();
-        synchronized (this) {
-            if (DEBUG) {
-                Slog.d(TAG, "Unpinned file: " + filename);
-            }
-            mPinnedFiles.remove(pinnedFile.fileName);
-            for (PinnedFile dep : pinnedFile.pinnedDeps) {
-                if (dep == null) {
-                    continue;
-                }
-                mPinnedFiles.remove(dep.fileName);
-                if (DEBUG) {
-                    Slog.d(TAG, "Unpinned dependency: " + dep.fileName);
-                }
-            }
-        }
-    }
-
-    private static int clamp(int min, int value, int max) {
-        return Math.max(min, Math.min(value, max));
-    }
-
-    private static void safeMunmap(long address, long mapSize) {
-        try {
-            Os.munmap(address, mapSize);
-        } catch (ErrnoException ex) {
-            Slog.w(TAG, "ignoring error in unmap", ex);
-        }
-    }
-
-    /**
-     * Close FD, swallowing irrelevant errors.
-     */
-    private static void safeClose(@Nullable FileDescriptor fd) {
-        if (fd != null && fd.valid()) {
-            try {
-                Os.close(fd);
-            } catch (ErrnoException ex) {
-                // Swallow the exception: non-EBADF errors in close(2)
-                // indicate deferred paging write errors, which we
-                // don't care about here. The underlying file
-                // descriptor is always closed.
-                if (ex.errno == OsConstants.EBADF) {
-                    throw new AssertionError(ex);
-                }
-            }
-        }
-    }
-
-    /**
-     * Close closeable thing, swallowing errors.
-     */
-    private static void safeClose(@Nullable Closeable thing) {
-        if (thing != null) {
-            try {
-                thing.close();
-            } catch (IOException ex) {
-                Slog.w(TAG, "ignoring error closing resource: " + thing, ex);
-            }
-        }
-    }
-
-    public List<PinnedFileStat> getPinnerStats() {
-        ArrayList<PinnedFileStat> stats = new ArrayList<>();
-        Collection<PinnedFile> pinnedFiles;
-        synchronized(this) {
-            pinnedFiles = mPinnedFiles.values();
-        }
-        for (PinnedFile pf : pinnedFiles) {
-            PinnedFileStat stat = new PinnedFileStat(pf.fileName, pf.bytesPinned, pf.groupName);
-            stats.add(stat);
-        }
-        if (mCurrentlyPinnedAnonSize > 0) {
-            stats.add(new PinnedFileStat(ANON_REGION_STAT_NAME,
-                        mCurrentlyPinnedAnonSize, ANON_REGION_STAT_NAME));
-        }
-        return stats;
-    }
-
-    public final class BinderService extends IPinnerService.Stub {
-        @Override
-        protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-            if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
-            HashSet<PinnedFile> shownPins = new HashSet<>();
-            HashSet<String> groups = new HashSet<>();
-            final int bytesPerMB = 1024 * 1024;
-            synchronized (PinnerService.this) {
-                long totalSize = 0;
-                for (int key : mPinnedApps.keySet()) {
-                    PinnedApp app = mPinnedApps.get(key);
-                    pw.print(getNameForKey(key));
-                    pw.print(" uid="); pw.print(app.uid);
-                    pw.print(" active="); pw.print(app.active);
-                    pw.println();
-                    for (PinnedFile pf : mPinnedApps.get(key).mFiles) {
-                        pw.print("  ");
-                        pw.format("%s pinned:%d bytes (%d MB) pinlist:%b\n", pf.fileName,
-                                pf.bytesPinned, pf.bytesPinned / bytesPerMB, pf.used_pinlist);
-                        totalSize += pf.bytesPinned;
-                        shownPins.add(pf);
-                        for (PinnedFile dep : pf.pinnedDeps) {
-                            pw.print("  ");
-                            pw.format("%s pinned:%d bytes (%d MB) pinlist:%b (Dependency)\n", dep.fileName,
-                                    dep.bytesPinned, dep.bytesPinned / bytesPerMB, dep.used_pinlist);
-                            totalSize += dep.bytesPinned;
-                            shownPins.add(dep);
-                        }
-                    }
-                }
-                pw.println();
-                for (PinnedFile pinnedFile : mPinnedFiles.values()) {
-                    if (!groups.contains(pinnedFile.groupName)) {
-                        groups.add(pinnedFile.groupName);
-                    }
-                }
-                boolean firstPinInGroup = true;
-                for (String group : groups) {
-                    List<PinnedFile> groupPins = getAllPinsForGroup(group);
-                    for (PinnedFile pinnedFile : groupPins) {
-                        if (shownPins.contains(pinnedFile)) {
-                            // Already showed in the dump and accounted for, skip.
-                            continue;
-                        }
-                        if (firstPinInGroup) {
-                            firstPinInGroup = false;
-                            // Ensure we only print when there are pins for groups not yet shown
-                            // in the pinned app section.
-                            pw.print("Group:" + group);
-                            pw.println();
-                        }
-                        pw.format("  %s pinned:%d bytes (%d MB) pinlist:%b\n", pinnedFile.fileName,
-                                pinnedFile.bytesPinned, pinnedFile.bytesPinned / bytesPerMB,
-                                pinnedFile.used_pinlist);
-                        totalSize += pinnedFile.bytesPinned;
-                    }
-                }
-                pw.println();
-                if (mPinAnonAddress != 0) {
-                    pw.format("Pinned anon region: %d (%d MB)\n", mCurrentlyPinnedAnonSize, mCurrentlyPinnedAnonSize / bytesPerMB);
-                    totalSize += mCurrentlyPinnedAnonSize;
-                }
-                pw.format("Total pinned: %s bytes (%s MB)\n", totalSize, totalSize / bytesPerMB);
-                pw.println();
-                if (!mPendingRepin.isEmpty()) {
-                    pw.print("Pending repin: ");
-                    for (int key : mPendingRepin.values()) {
-                        pw.print(getNameForKey(key)); pw.print(' ');
-                    }
-                    pw.println();
-                }
-            }
-        }
-
-        private void repin() {
-            sendUnpinAppsMessage();
-            // TODO(morrita): Consider supporting non-system user.
-            sendPinAppsWithUpdatedKeysMessage(UserHandle.USER_SYSTEM);
-        }
-
-        private void printError(FileDescriptor out, String message) {
-            PrintWriter writer = new PrintWriter(new FileOutputStream(out));
-            writer.println(message);
-            writer.flush();
-        }
-
-        @Override
-        public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
-                String[] args, ShellCallback callback, ResultReceiver resultReceiver) {
-            if (args.length < 1) {
-                printError(out, "Command is not given.");
-                resultReceiver.send(-1, null);
-                return;
-            }
-
-            String command = args[0];
-            switch (command) {
-                case "repin":
-                    repin();
-                    break;
-                default:
-                    printError(out, String.format(
-                            "Unknown pinner command: %s. Supported commands: repin", command));
-                    resultReceiver.send(-1, null);
-                    return;
-            }
-
-            resultReceiver.send(0, null);
-        }
-
-        @EnforcePermission(android.Manifest.permission.DUMP)
-        @Override
-        public List<PinnedFileStat> getPinnerStats() {
-            getPinnerStats_enforcePermission();
-            return PinnerService.this.getPinnerStats();
-        }
-    }
-
-    @VisibleForTesting
-    public static final class PinnedFile implements AutoCloseable {
-        private long mAddress;
-        final int mapSize;
-        final String fileName;
-        final int bytesPinned;
-
-        // Whether this file was pinned using a pinlist
-        boolean used_pinlist;
-
-        // User defined group name for pinner accounting
-        String groupName = "";
-        ArrayList<PinnedFile> pinnedDeps = new ArrayList<>();
-
-        PinnedFile(long address, int mapSize, String fileName, int bytesPinned) {
-             mAddress = address;
-             this.mapSize = mapSize;
-             this.fileName = fileName;
-             this.bytesPinned = bytesPinned;
-        }
-
-        @Override
-        public void close() {
-            if (mAddress >= 0) {
-                safeMunmap(mAddress, mapSize);
-                mAddress = -1;
-            }
-            for (PinnedFile dep : pinnedDeps) {
-                if (dep != null) {
-                    dep.close();
-                }
-            }
-        }
-
-        @Override
-        public void finalize() {
-            close();
-        }
-    }
-
-    final static class PinRange {
-        int start;
-        int length;
-    }
-
-    /**
-     * Represents an app that was pinned.
-     */
-    private final class PinnedApp {
-
-        /**
-         * The uid of the package being pinned. This stays constant while the package stays
-         * installed.
-         */
-        final int uid;
-
-        /** Whether it is currently active, i.e. there is a running process from that package. */
-        boolean active;
-
-        /** List of pinned files. */
-        final ArrayList<PinnedFile> mFiles = new ArrayList<>();
-
-        private PinnedApp(ApplicationInfo appInfo) {
-            uid = appInfo.uid;
-            active = mAmInternal.isUidActive(uid);
-        }
-    }
-
-    final class PinnerHandler extends Handler {
-        static final int PIN_ONSTART_MSG = 4001;
-
-        public PinnerHandler(Looper looper) {
-            super(looper, null, true);
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case PIN_ONSTART_MSG:
-                {
-                    handlePinOnStart();
-                }
-                break;
-
-                default:
-                    super.handleMessage(msg);
-            }
-        }
-    }
-}
diff --git a/services/core/java/com/android/server/RescueParty.java b/services/core/java/com/android/server/RescueParty.java
index a6e21fc..feb5775 100644
--- a/services/core/java/com/android/server/RescueParty.java
+++ b/services/core/java/com/android/server/RescueParty.java
@@ -42,6 +42,7 @@
 import android.sysprop.CrashRecoveryProperties;
 import android.text.TextUtils;
 import android.util.ArraySet;
+import android.util.EventLog;
 import android.util.Log;
 import android.util.Slog;
 
@@ -154,6 +155,14 @@
     private static final int PERSISTENT_MASK = ApplicationInfo.FLAG_PERSISTENT
             | ApplicationInfo.FLAG_SYSTEM;
 
+    /**
+     * EventLog tags used when logging into the event log. Note the values must be sync with
+     * frameworks/base/services/core/java/com/android/server/EventLogTags.logtags to get correct
+     * name translation.
+     */
+    private static final int LOG_TAG_RESCUE_SUCCESS = 2902;
+    private static final int LOG_TAG_RESCUE_FAILURE = 2903;
+
     /** Register the Rescue Party observer as a Package Watchdog health observer */
     public static void registerHealthObserver(Context context) {
         PackageWatchdog.getInstance(context).registerHealthObserver(
@@ -523,7 +532,7 @@
         Slog.w(TAG, "Attempting rescue level " + levelToString(level));
         try {
             executeRescueLevelInternal(context, level, failedPackage);
-            EventLogTags.writeRescueSuccess(level);
+            EventLog.writeEvent(LOG_TAG_RESCUE_SUCCESS, level);
             String successMsg = "Finished rescue level " + levelToString(level);
             if (!TextUtils.isEmpty(failedPackage)) {
                 successMsg += " for package " + failedPackage;
@@ -631,7 +640,8 @@
         // Request the reboot from a separate thread to avoid deadlock on PackageWatchdog
         // when device shutting down.
         setRebootProperty(true);
-        Runnable runnable = () -> {
+
+        if (Flags.synchronousRebootInRescueParty()) {
             try {
                 PowerManager pm = context.getSystemService(PowerManager.class);
                 if (pm != null) {
@@ -640,9 +650,20 @@
             } catch (Throwable t) {
                 logRescueException(level, failedPackage, t);
             }
-        };
-        Thread thread = new Thread(runnable);
-        thread.start();
+        } else {
+            Runnable runnable = () -> {
+                try {
+                    PowerManager pm = context.getSystemService(PowerManager.class);
+                    if (pm != null) {
+                        pm.reboot(TAG);
+                    }
+                } catch (Throwable t) {
+                    logRescueException(level, failedPackage, t);
+                }
+            };
+            Thread thread = new Thread(runnable);
+            thread.start();
+        }
     }
 
     private static void executeFactoryReset(Context context, int level,
@@ -655,18 +676,28 @@
         setFactoryResetProperty(true);
         long now = System.currentTimeMillis();
         setLastFactoryResetTimeMs(now);
-        Runnable runnable = new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    RecoverySystem.rebootPromptAndWipeUserData(context, TAG + "," + failedPackage);
-                } catch (Throwable t) {
-                    logRescueException(level, failedPackage, t);
-                }
+
+        if (Flags.synchronousRebootInRescueParty()) {
+            try {
+                RecoverySystem.rebootPromptAndWipeUserData(context, TAG + "," + failedPackage);
+            } catch (Throwable t) {
+                logRescueException(level, failedPackage, t);
             }
-        };
-        Thread thread = new Thread(runnable);
-        thread.start();
+        } else {
+            Runnable runnable = new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        RecoverySystem.rebootPromptAndWipeUserData(context,
+                            TAG + "," + failedPackage);
+                    } catch (Throwable t) {
+                        logRescueException(level, failedPackage, t);
+                    }
+                }
+            };
+            Thread thread = new Thread(runnable);
+            thread.start();
+        }
     }
 
 
@@ -682,7 +713,7 @@
     private static void logRescueException(int level, @Nullable String failedPackageName,
             Throwable t) {
         final String msg = getCompleteMessage(t);
-        EventLogTags.writeRescueFailure(level, msg);
+        EventLog.writeEvent(LOG_TAG_RESCUE_FAILURE, level, msg);
         String failureMsg = "Failed rescue level " + levelToString(level);
         if (!TextUtils.isEmpty(failedPackageName)) {
             failureMsg += " for package " + failedPackageName;
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index d86bae1..9d27731 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -219,7 +219,7 @@
     public static final int FAILED_MOUNT_RESET_TIMEOUT_SECONDS = 10;
 
     /** Extended timeout for the system server watchdog. */
-    private static final int SLOW_OPERATION_WATCHDOG_TIMEOUT_MS = 20 * 1000;
+    private static final int SLOW_OPERATION_WATCHDOG_TIMEOUT_MS = 30 * 1000;
 
     /** Extended timeout for the system server watchdog for vold#partition operation. */
     private static final int PARTITION_OPERATION_WATCHDOG_TIMEOUT_MS = 3 * 60 * 1000;
@@ -2751,7 +2751,8 @@
         boolean smartIdleMaintEnabled = DeviceConfig.getBoolean(
             DeviceConfig.NAMESPACE_STORAGE_NATIVE_BOOT,
             "smart_idle_maint_enabled",
-            DEFAULT_SMART_IDLE_MAINT_ENABLED);
+                DEFAULT_SMART_IDLE_MAINT_ENABLED)
+                && !SystemProperties.getBoolean("ro.boot.zufs_provisioned", false);
         if (smartIdleMaintEnabled) {
             mLifetimePercentThreshold = DeviceConfig.getInt(
                 DeviceConfig.NAMESPACE_STORAGE_NATIVE_BOOT,
@@ -3251,7 +3252,7 @@
         if (Binder.getCallingUid() != android.os.Process.SYSTEM_UID) {
             throw new SecurityException("no permission to commit checkpoint changes");
         }
-
+        extendWatchdogTimeout("vold#commitChanges might be slow");
         mVold.commitChanges();
     }
 
diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING
index a459ea9..ce66dc3 100644
--- a/services/core/java/com/android/server/TEST_MAPPING
+++ b/services/core/java/com/android/server/TEST_MAPPING
@@ -114,6 +114,9 @@
             "options": [
                 {
                     "include-filter": "android.os.storage.cts.StorageManagerTest"
+                },
+                {
+                    "include-filter": "android.os.storage.cts.StorageStatsManagerTest"
                 }
             ]
         }
@@ -173,15 +176,6 @@
                     "include-filter": "com.android.server.wm.BackgroundActivityStart*"
                 }
             ]
-        },
-        {
-            "name": "CtsOsTestCases",
-            "file_patterns": ["StorageManagerService\\.java"],
-            "options": [
-                {
-                    "include-filter": "android.os.storage.cts.StorageStatsManagerTest"
-                }
-            ]
         }
    ]
 }
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index f32031de..f8857d3 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -17,6 +17,7 @@
 package com.android.server;
 
 import static android.app.Flags.modesApi;
+import static android.app.Flags.enableCurrentModeTypeBinderCache;
 import static android.app.Flags.enableNightModeBinderCache;
 import static android.app.UiModeManager.ContrastUtils.CONTRAST_DEFAULT_VALUE;
 import static android.app.UiModeManager.DEFAULT_PRIORITY;
@@ -138,7 +139,7 @@
 
     private int mLastBroadcastState = Intent.EXTRA_DOCK_STATE_UNDOCKED;
 
-    private final NightMode mNightMode = new NightMode(){
+    private final IntProperty mNightMode = new IntProperty(){
         private int mNightModeValue = UiModeManager.MODE_NIGHT_NO;
 
         @Override
@@ -192,7 +193,22 @@
     // flag set by resource, whether to night mode change for normal all or not.
     private boolean mNightModeLocked = false;
 
-    int mCurUiMode = 0;
+    private final IntProperty mCurUiMode = new IntProperty(){
+        private int mCurrentModeTypeValue = 0;
+
+        @Override
+        public int get() {
+            return mCurrentModeTypeValue;
+        }
+
+        @Override
+        public void set(int mode) {
+            mCurrentModeTypeValue = mode;
+            if (enableCurrentModeTypeBinderCache()) {
+                UiModeManager.invalidateCurrentModeTypeCache();
+            }
+        }
+    };
     private int mSetUiMode = 0;
     private boolean mHoldingConfiguration = false;
     private int mCurrentUser;
@@ -810,7 +826,7 @@
             final long ident = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
-                    return mCurUiMode & Configuration.UI_MODE_TYPE_MASK;
+                    return mCurUiMode.get() & Configuration.UI_MODE_TYPE_MASK;
                 }
             } finally {
                 Binder.restoreCallingIdentity(ident);
@@ -1492,7 +1508,7 @@
             pw.print(" mCarModeEnableFlags="); pw.print(mCarModeEnableFlags);
             pw.print(" mEnableCarDockLaunch="); pw.println(mEnableCarDockLaunch);
 
-            pw.print("  mCurUiMode=0x"); pw.print(Integer.toHexString(mCurUiMode));
+            pw.print("  mCurUiMode=0x"); pw.print(Integer.toHexString(mCurUiMode.get()));
             pw.print(" mUiModeLocked="); pw.print(mUiModeLocked);
             pw.print(" mSetUiMode=0x"); pw.println(Integer.toHexString(mSetUiMode));
 
@@ -1745,7 +1761,7 @@
                     + "; uiMode=" + uiMode);
         }
 
-        mCurUiMode = uiMode;
+        mCurUiMode.set(uiMode);
         if (!mHoldingConfiguration && (!mWaitForDeviceInactive || mPowerSave)) {
             mConfiguration.uiMode = uiMode;
         }
@@ -1892,7 +1908,7 @@
         boolean keepScreenOn = mCharging &&
                 ((mCarModeEnabled && mCarModeKeepsScreenOn &&
                 (mCarModeEnableFlags & UiModeManager.ENABLE_CAR_MODE_ALLOW_SLEEP) == 0) ||
-                (mCurUiMode == Configuration.UI_MODE_TYPE_DESK && mDeskModeKeepsScreenOn));
+                (mCurUiMode.get() == Configuration.UI_MODE_TYPE_DESK && mDeskModeKeepsScreenOn));
         if (keepScreenOn != mWakeLock.isHeld()) {
             if (keepScreenOn) {
                 mWakeLock.acquire();
@@ -2048,12 +2064,14 @@
 
     private void updateComputedNightModeLocked(boolean activate) {
         boolean newComputedValue = activate;
+        boolean appliedOverrides = false;
         if (mNightMode.get() != MODE_NIGHT_YES && mNightMode.get() != UiModeManager.MODE_NIGHT_NO) {
             if (mOverrideNightModeOn && !newComputedValue) {
                 newComputedValue = true;
             } else if (mOverrideNightModeOff && newComputedValue) {
                 newComputedValue = false;
             }
+            appliedOverrides = true;
         }
 
         if (modesApi()) {
@@ -2063,8 +2081,10 @@
                 case (UiModeManager.MODE_ATTENTION_THEME_OVERLAY_DAY) -> false;
                 default -> newComputedValue; // case OFF
             };
-        } else {
-            mComputedNightMode = newComputedValue;
+        }
+
+        if (appliedOverrides) {
+            return;
         }
 
         if (mNightMode.get() != MODE_NIGHT_AUTO || (mTwilightManager != null
@@ -2319,11 +2339,12 @@
     }
 
     /**
-     * Interface to contain the value for system night mode. We make the night mode accessible
-     * through this class to ensure that the reassignment of this value invalidates the cache.
+     * Interface to contain the value for an integral property. We make the property
+     * accessible through this class to ensure that the reassignment of this value invalidates the
+     * cache.
      */
-    private interface NightMode {
+    private interface IntProperty {
         int get();
-        void set(int mode);
+        void set(int value);
     }
 }
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index 88edb12..0ca3b56 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -1773,8 +1773,7 @@
                         // Create a Session for the target user and pass in the bundle
                         completeCloningAccount(response, result, account, toAccounts, userFrom);
                     } else {
-                        // Bundle format is not defined.
-                        super.onResultSkipSanitization(result);
+                        super.onResult(result);
                     }
                 }
             }.bind();
@@ -1861,8 +1860,7 @@
                     // account to avoid retries?
                     // TODO: what we do with the visibility?
 
-                    // Bundle format is not defined.
-                    super.onResultSkipSanitization(result);
+                    super.onResult(result);
                 }
 
                 @Override
@@ -2108,7 +2106,6 @@
         @Override
         public void onResult(Bundle result) {
             Bundle.setDefusable(result, true);
-            result = sanitizeBundle(result);
             IAccountManagerResponse response = getResponseAndClose();
             if (response != null) {
                 try {
@@ -2462,7 +2459,6 @@
         @Override
         public void onResult(Bundle result) {
             Bundle.setDefusable(result, true);
-            result = sanitizeBundle(result);
             if (result != null && result.containsKey(AccountManager.KEY_BOOLEAN_RESULT)
                     && !result.containsKey(AccountManager.KEY_INTENT)) {
                 final boolean removalAllowed = result.getBoolean(AccountManager.KEY_BOOLEAN_RESULT);
@@ -2977,7 +2973,6 @@
                 @Override
                 public void onResult(Bundle result) {
                     Bundle.setDefusable(result, true);
-                    result = sanitizeBundle(result);
                     if (result != null) {
                         String label = result.getString(AccountManager.KEY_AUTH_TOKEN_LABEL);
                         Bundle bundle = new Bundle();
@@ -3155,7 +3150,6 @@
                 @Override
                 public void onResult(Bundle result) {
                     Bundle.setDefusable(result, true);
-                    result = sanitizeBundle(result);
                     if (result != null) {
                         if (result.containsKey(AccountManager.KEY_AUTH_TOKEN_LABEL)) {
                             Intent intent = newGrantCredentialsPermissionIntent(
@@ -3627,12 +3621,6 @@
         @Override
         public void onResult(Bundle result) {
             Bundle.setDefusable(result, true);
-            Bundle sessionBundle = null;
-            if (result != null) {
-                // Session bundle will be removed from result.
-                sessionBundle = result.getBundle(AccountManager.KEY_ACCOUNT_SESSION_BUNDLE);
-            }
-            result = sanitizeBundle(result);
             mNumResults++;
             Intent intent = null;
             if (result != null) {
@@ -3694,6 +3682,7 @@
             // bundle contains data necessary for finishing the session
             // later. The session bundle will be encrypted here and
             // decrypted later when trying to finish the session.
+            Bundle sessionBundle = result.getBundle(AccountManager.KEY_ACCOUNT_SESSION_BUNDLE);
             if (sessionBundle != null) {
                 String accountType = sessionBundle.getString(AccountManager.KEY_ACCOUNT_TYPE);
                 if (TextUtils.isEmpty(accountType)
@@ -4081,7 +4070,6 @@
                 @Override
                 public void onResult(Bundle result) {
                     Bundle.setDefusable(result, true);
-                    result = sanitizeBundle(result);
                     IAccountManagerResponse response = getResponseAndClose();
                     if (response == null) {
                         return;
@@ -4395,7 +4383,6 @@
         @Override
         public void onResult(Bundle result) {
             Bundle.setDefusable(result, true);
-            result = sanitizeBundle(result);
             mNumResults++;
             if (result == null) {
                 onError(AccountManager.ERROR_CODE_INVALID_RESPONSE, "null bundle");
@@ -4952,68 +4939,6 @@
                 callback, resultReceiver);
     }
 
-
-    // All keys for Strings passed from AbstractAccountAuthenticator using Bundle.
-    private static final String[] sStringBundleKeys = new String[] {
-        AccountManager.KEY_ACCOUNT_NAME,
-        AccountManager.KEY_ACCOUNT_TYPE,
-        AccountManager.KEY_AUTHTOKEN,
-        AccountManager.KEY_AUTH_TOKEN_LABEL,
-        AccountManager.KEY_ERROR_MESSAGE,
-        AccountManager.KEY_PASSWORD,
-        AccountManager.KEY_ACCOUNT_STATUS_TOKEN};
-
-    /**
-     * Keep only documented fields in a Bundle received from AbstractAccountAuthenticator.
-     */
-    protected static Bundle sanitizeBundle(Bundle bundle) {
-        if (bundle == null) {
-            return null;
-        }
-        Bundle sanitizedBundle = new Bundle();
-        Bundle.setDefusable(sanitizedBundle, true);
-        int updatedKeysCount = 0;
-        for (String stringKey : sStringBundleKeys) {
-            if (bundle.containsKey(stringKey)) {
-                String value = bundle.getString(stringKey);
-                sanitizedBundle.putString(stringKey, value);
-                updatedKeysCount++;
-            }
-        }
-        String key = AbstractAccountAuthenticator.KEY_CUSTOM_TOKEN_EXPIRY;
-        if (bundle.containsKey(key)) {
-            long expiryMillis = bundle.getLong(key, 0L);
-            sanitizedBundle.putLong(key, expiryMillis);
-            updatedKeysCount++;
-        }
-        key = AccountManager.KEY_BOOLEAN_RESULT;
-        if (bundle.containsKey(key)) {
-            boolean booleanResult = bundle.getBoolean(key, false);
-            sanitizedBundle.putBoolean(key, booleanResult);
-            updatedKeysCount++;
-        }
-        key = AccountManager.KEY_ERROR_CODE;
-        if (bundle.containsKey(key)) {
-            int errorCode = bundle.getInt(key, 0);
-            sanitizedBundle.putInt(key, errorCode);
-            updatedKeysCount++;
-        }
-        key = AccountManager.KEY_INTENT;
-        if (bundle.containsKey(key)) {
-            Intent intent = bundle.getParcelable(key, Intent.class);
-            sanitizedBundle.putParcelable(key, intent);
-            updatedKeysCount++;
-        }
-        if (bundle.containsKey(AccountManager.KEY_ACCOUNT_SESSION_BUNDLE)) {
-            // The field is not copied in sanitized bundle.
-            updatedKeysCount++;
-        }
-        if (updatedKeysCount != bundle.size()) {
-            Log.w(TAG, "Size mismatch after sanitizeBundle call.");
-        }
-        return sanitizedBundle;
-    }
-
     private abstract class Session extends IAccountAuthenticatorResponse.Stub
             implements IBinder.DeathRecipient, ServiceConnection {
         private final Object mSessionLock = new Object();
@@ -5137,6 +5062,8 @@
                     Log.e(TAG, String.format(tmpl, activityName, pkgName, mAccountType));
                     return false;
                 }
+                intent.setComponent(targetActivityInfo.getComponentName());
+                bundle.putParcelable(AccountManager.KEY_INTENT, intent);
                 return true;
             } finally {
                 Binder.restoreCallingIdentity(bid);
@@ -5158,14 +5085,15 @@
             Bundle simulateBundle = p.readBundle();
             p.recycle();
             Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT, Intent.class);
-            if (intent != null && intent.getClass() != Intent.class) {
-                return false;
-            }
             Intent simulateIntent = simulateBundle.getParcelable(AccountManager.KEY_INTENT,
                     Intent.class);
             if (intent == null) {
                 return (simulateIntent == null);
             }
+            if (intent.getClass() != Intent.class || simulateIntent.getClass() != Intent.class) {
+                return false;
+            }
+
             if (!intent.filterEquals(simulateIntent)) {
                 return false;
             }
@@ -5304,15 +5232,10 @@
                 }
             }
         }
+
         @Override
         public void onResult(Bundle result) {
             Bundle.setDefusable(result, true);
-            result = sanitizeBundle(result);
-            onResultSkipSanitization(result);
-        }
-
-        public void onResultSkipSanitization(Bundle result) {
-            Bundle.setDefusable(result, true);
             mNumResults++;
             Intent intent = null;
             if (result != null) {
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 3666524..f9197e3c 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -5077,7 +5077,10 @@
                         + " requires " + r.permission);
                 return new ServiceLookupResult(r.permission);
             } else if ((Manifest.permission.BIND_HOTWORD_DETECTION_SERVICE.equals(r.permission)
-                    || Manifest.permission.BIND_VISUAL_QUERY_DETECTION_SERVICE.equals(r.permission))
+                    || Manifest.permission.BIND_VISUAL_QUERY_DETECTION_SERVICE.equals(r.permission)
+                    || Manifest.permission.BIND_WEARABLE_SENSING_SERVICE.equals(r.permission)
+                    || Manifest.permission.BIND_ON_DEVICE_SANDBOXED_INFERENCE_SERVICE.equals(
+                    r.permission))
                     && callingUid != Process.SYSTEM_UID) {
                 // Hotword detection and visual query detection must run in its own sandbox, and we
                 // don't even trust its enclosing application to bind to it - only the system.
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index 6fd281e..f5a297b 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -685,11 +685,6 @@
     // default. Controlled by Settings.Global.FORCE_ENABLE_PSS_PROFILING
     volatile boolean mForceEnablePssProfiling = false;
 
-    // Indicates whether to use ApplicationInfo to determine launched state instead of PM user state
-    // This is a temporary workaround until the trunk-stable flag is pushed to nextfood.
-    // TODO: b/365979852 - remove this workaround when redundant
-    volatile boolean mFlagUseAppInfoNotLaunched = false;
-
     /**
      * Indicates whether the foreground service background start restriction is enabled for
      * caller app that is targeting S+.
@@ -1022,9 +1017,6 @@
     private static final Uri FORCE_ENABLE_PSS_PROFILING_URI =
             Settings.Global.getUriFor(Settings.Global.FORCE_ENABLE_PSS_PROFILING);
 
-    private static final Uri ENABLE_USE_APP_INFO_NOT_LAUNCHED_URI =
-            Settings.Global.getUriFor(Settings.Global.ENABLE_USE_APP_INFO_NOT_LAUNCHED);
-
     /**
      * The threshold to decide if a given association should be dumped into metrics.
      */
@@ -1487,7 +1479,6 @@
                     false, this);
         }
         mResolver.registerContentObserver(FORCE_ENABLE_PSS_PROFILING_URI, false, this);
-        mResolver.registerContentObserver(ENABLE_USE_APP_INFO_NOT_LAUNCHED_URI, false, this);
         updateConstants();
         if (mSystemServerAutomaticHeapDumpEnabled) {
             updateEnableAutomaticSystemServerHeapDumps();
@@ -1504,7 +1495,6 @@
         updateActivityStartsLoggingEnabled();
         updateForegroundServiceStartsLoggingEnabled();
         updateForceEnablePssProfiling();
-        updateEnableUseAppInfoNotLaunched();
         // Read DropboxRateLimiter params from flags.
         mService.initDropboxRateLimiter();
     }
@@ -1550,8 +1540,6 @@
             updateEnableAutomaticSystemServerHeapDumps();
         } else if (FORCE_ENABLE_PSS_PROFILING_URI.equals(uri)) {
             updateForceEnablePssProfiling();
-        } else if (ENABLE_USE_APP_INFO_NOT_LAUNCHED_URI.equals(uri)) {
-            updateEnableUseAppInfoNotLaunched();
         }
     }
 
@@ -1671,11 +1659,6 @@
                 Settings.Global.FORCE_ENABLE_PSS_PROFILING, 0) == 1;
     }
 
-    private void updateEnableUseAppInfoNotLaunched() {
-        mFlagUseAppInfoNotLaunched = Settings.Global.getInt(mResolver,
-                Settings.Global.ENABLE_USE_APP_INFO_NOT_LAUNCHED, 0) == 1;
-    }
-
     private void updateBackgroundActivityStarts() {
         mFlagBackgroundActivityStartsEnabled = DeviceConfig.getBoolean(
                 DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
@@ -2555,8 +2538,6 @@
         pw.print("  OOMADJ_UPDATE_QUICK="); pw.println(OOMADJ_UPDATE_QUICK);
         pw.print("  ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION=");
         pw.println(mEnableWaitForFinishAttachApplication);
-        pw.print("  FLAG_USE_APP_INFO_NOT_LAUNCHED=");
-        pw.println(mFlagUseAppInfoNotLaunched);
 
         pw.print("  "); pw.print(KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION);
         pw.print("="); pw.println(FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 35323d6..74437cd 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -130,10 +130,11 @@
 import static android.provider.Settings.Global.ALWAYS_FINISH_ACTIVITIES;
 import static android.provider.Settings.Global.DEBUG_APP;
 import static android.provider.Settings.Global.WAIT_FOR_DEBUGGER;
+import static android.security.Flags.preventIntentRedirect;
 import static android.util.FeatureFlagUtils.SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS;
 import static android.view.Display.INVALID_DISPLAY;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_CONFIGURATION;
 import static com.android.internal.util.FrameworkStatsLog.UNSAFE_INTENT_EVENT_REPORTED__EVENT_TYPE__NEW_MUTABLE_IMPLICIT_PENDING_INTENT_RETRIEVED;
 import static com.android.sdksandbox.flags.Flags.sdkSandboxInstrumentationInfo;
 import static com.android.server.am.ActiveServices.FGS_SAW_RESTRICTIONS;
@@ -420,6 +421,7 @@
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.MemInfoReader;
 import com.android.internal.util.Preconditions;
+import com.android.internal.util.function.pooled.PooledLambda;
 import com.android.server.AlarmManagerInternal;
 import com.android.server.BootReceiver;
 import com.android.server.DeviceIdleInternal;
@@ -2420,6 +2422,7 @@
         mBroadcastController = new BroadcastController(mContext, this, mBroadcastQueue);
         mComponentAliasResolver = new ComponentAliasResolver(this);
         mApplicationSharedMemoryReadOnlyFd = null;
+        sCreatorTokenCacheCleaner = new Handler(mHandlerThread.getLooper());
     }
 
     // Note: This method is invoked on the main thread but may need to attach various
@@ -2526,6 +2529,7 @@
         mPendingStartActivityUids = new PendingStartActivityUids();
         mTraceErrorLogger = new TraceErrorLogger();
         mComponentAliasResolver = new ComponentAliasResolver(this);
+        sCreatorTokenCacheCleaner = new Handler(mHandlerThread.getLooper());
         try {
             mApplicationSharedMemoryReadOnlyFd =
                     ApplicationSharedMemory.getInstance().getReadOnlyFileDescriptor();
@@ -5532,6 +5536,7 @@
     public int sendIntentSender(IApplicationThread caller, IIntentSender target,
             IBinder allowlistToken, int code, Intent intent, String resolvedType,
             IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) {
+        addCreatorToken(intent);
         if (target instanceof PendingIntentRecord) {
             final PendingIntentRecord originalRecord = (PendingIntentRecord) target;
 
@@ -8269,7 +8274,16 @@
                         setThreadScheduler(proc.getRenderThreadTid(),
                                 SCHED_FIFO | SCHED_RESET_ON_FORK, 1);
                     } else {
-                        setThreadPriority(proc.getRenderThreadTid(), THREAD_PRIORITY_TOP_APP_BOOST);
+                        if (Flags.resetOnForkEnabled()) {
+                            if (Process.getThreadScheduler(proc.getRenderThreadTid())
+                                    == Process.SCHED_OTHER) {
+                                Process.setThreadScheduler(proc.getRenderThreadTid(),
+                                    Process.SCHED_OTHER | Process.SCHED_RESET_ON_FORK,
+                                    0);
+                            }
+                        }
+                        setThreadPriority(proc.getRenderThreadTid(),
+                            THREAD_PRIORITY_TOP_APP_BOOST);
                     }
                 }
             } else {
@@ -13610,6 +13624,7 @@
             throws TransactionTooLargeException {
         enforceNotIsolatedCaller("startService");
         enforceAllowedToStartOrBindServiceIfSdkSandbox(service);
+        addCreatorToken(service);
         if (service != null) {
             // Refuse possible leaked file descriptors
             if (service.hasFileDescriptors()) {
@@ -13871,6 +13886,7 @@
 
         validateServiceInstanceName(instanceName);
 
+        addCreatorToken(service);
         try {
             if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
                 final ComponentName cn = service.getComponent();
@@ -17148,6 +17164,7 @@
                 Slog.v(TAG_SERVICE,
                         "startServiceInPackage: " + service + " type=" + resolvedType);
             }
+            addCreatorToken(service);
             final long origId = Binder.clearCallingIdentity();
             ComponentName res;
             try {
@@ -17973,6 +17990,11 @@
                         userId, reason, exitInfoReason);
             }
         }
+
+        @Override
+        public void addCreatorToken(Intent intent) {
+            ActivityManagerService.this.addCreatorToken(intent);
+        }
     }
 
     long inputDispatchingTimedOut(int pid, final boolean aboveSystem, TimeoutRecord timeoutRecord) {
@@ -18398,25 +18420,34 @@
                     "Cannot kill the dependents of a package without its name.");
         }
 
+        userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
+                userId, true, ALLOW_FULL_ONLY, "killPackageDependents", null);
+        final int[] userIds = mUserController.expandUserId(userId);
+
         final long callingId = Binder.clearCallingIdentity();
         IPackageManager pm = AppGlobals.getPackageManager();
-        int pkgUid = -1;
         try {
-            pkgUid = pm.getPackageUid(packageName, MATCH_DEBUG_TRIAGED_MISSING, userId);
-        } catch (RemoteException e) {
-        }
-        if (userId != UserHandle.USER_ALL && pkgUid == -1) {
-            throw new IllegalArgumentException(
-                    "Cannot kill dependents of non-existing package " + packageName);
-        }
-        try {
-            synchronized(this) {
-                synchronized (mProcLock) {
-                    mProcessList.killPackageProcessesLSP(packageName, UserHandle.getAppId(pkgUid),
-                            userId, ProcessList.FOREGROUND_APP_ADJ,
-                            ApplicationExitInfo.REASON_DEPENDENCY_DIED,
-                            ApplicationExitInfo.SUBREASON_UNKNOWN,
-                            "dep: " + packageName);
+            for (int targetUserId : userIds) {
+                int pkgUid = -1;
+                try {
+                    pkgUid = pm.getPackageUid(packageName, MATCH_DEBUG_TRIAGED_MISSING,
+                            targetUserId);
+                } catch (RemoteException e) {
+                }
+                if (userId != UserHandle.USER_ALL && pkgUid == -1) {
+                    throw new IllegalArgumentException(
+                            "Cannot kill dependents of non-existing package " + packageName);
+                }
+                synchronized (this) {
+                    synchronized (mProcLock) {
+                        mProcessList.killPackageProcessesLSP(packageName,
+                                UserHandle.getAppId(pkgUid),
+                                targetUserId,
+                                ProcessList.FOREGROUND_APP_ADJ,
+                                ApplicationExitInfo.REASON_DEPENDENCY_DIED,
+                                ApplicationExitInfo.SUBREASON_UNKNOWN,
+                                "dep: " + packageName);
+                    }
                 }
             }
         } finally {
@@ -19105,6 +19136,7 @@
     private static final Map<IntentCreatorToken.Key, WeakReference<IntentCreatorToken>>
             sIntentCreatorTokenCache = new ConcurrentHashMap<>();
 
+    private static Handler sCreatorTokenCacheCleaner;
     /**
      * A binder token used to keep track of which app created the intent. This token can be used to
      * defend against intent redirect attacks. It stores uid of the intent creator and key fields of
@@ -19112,13 +19144,16 @@
      *
      * @hide
      */
+    @VisibleForTesting
     public static final class IntentCreatorToken extends Binder {
         @NonNull
         private final Key mKeyFields;
+        private final WeakReference<IntentCreatorToken> mRef;
 
         public IntentCreatorToken(int creatorUid, Intent intent) {
             super();
             this.mKeyFields = new Key(creatorUid, intent);
+            mRef = new WeakReference<>(this);
         }
 
         public int getCreatorUid() {
@@ -19136,6 +19171,26 @@
                     new Key(token.mKeyFields.mCreatorUid, intent));
         }
 
+        @Override
+        protected void finalize() throws Throwable {
+            try {
+                sCreatorTokenCacheCleaner.sendMessage(PooledLambda.obtainMessage(
+                        IntentCreatorToken::completeFinalize, this));
+            } finally {
+                super.finalize();
+            }
+        }
+
+        private void completeFinalize() {
+            synchronized (sIntentCreatorTokenCache) {
+                WeakReference<IntentCreatorToken> current = sIntentCreatorTokenCache.get(
+                        mKeyFields);
+                if (current == mRef) {
+                    sIntentCreatorTokenCache.remove(mKeyFields);
+                }
+            }
+        }
+
         private static class Key {
             private Key(int creatorUid, Intent intent) {
                 this.mCreatorUid = creatorUid;
@@ -19178,9 +19233,57 @@
             @Override
             public int hashCode() {
                 return Objects.hash(mCreatorUid, mAction, mData, mType, mPackage, mComponent,
-                        mFlags,
-                        mClipDataUris);
+                        mFlags, mClipDataUris);
             }
         }
     }
+
+    /**
+     * Add a creator token for all embedded intents (stored as extra) of the given intent.
+     *
+     * @param intent The given intent
+     * @hide
+     */
+    public void addCreatorToken(@Nullable Intent intent) {
+        if (!preventIntentRedirect()) return;
+
+        if (intent == null || intent.getExtraIntentKeys() == null) return;
+        for (String key : intent.getExtraIntentKeys()) {
+            try {
+                Intent extraIntent = intent.getParcelableExtra(key, Intent.class);
+                if (extraIntent == null) {
+                    Slog.w(TAG, "The key {" + key
+                            + "} does not correspond to an intent in the extra bundle.");
+                    continue;
+                }
+                Slog.wtf(TAG, "A creator token is added to an intent.");
+                IBinder creatorToken = createIntentCreatorToken(extraIntent);
+                if (creatorToken != null) {
+                    extraIntent.setCreatorToken(creatorToken);
+                }
+            } catch (Exception e) {
+                Slog.wtf(TAG,
+                        "Something went wrong when trying to add creator token for embedded "
+                                + "intents of intent: ."
+                                + intent, e);
+            }
+        }
+    }
+
+    private IBinder createIntentCreatorToken(Intent intent) {
+        if (IntentCreatorToken.isValid(intent)) return null;
+        int creatorUid = getCallingUid();
+        IntentCreatorToken.Key key = new IntentCreatorToken.Key(creatorUid, intent);
+        IntentCreatorToken token;
+        synchronized (sIntentCreatorTokenCache) {
+            WeakReference<IntentCreatorToken> ref = sIntentCreatorTokenCache.get(key);
+            if (ref == null || ref.get() == null) {
+                token = new IntentCreatorToken(creatorUid, intent);
+                sIntentCreatorTokenCache.put(key, token.mRef);
+            } else {
+                token = ref.get();
+            }
+        }
+        return token;
+    }
 }
diff --git a/services/core/java/com/android/server/am/AppStartInfoTracker.java b/services/core/java/com/android/server/am/AppStartInfoTracker.java
index 71b6456..aca6d0b 100644
--- a/services/core/java/com/android/server/am/AppStartInfoTracker.java
+++ b/services/core/java/com/android/server/am/AppStartInfoTracker.java
@@ -1005,7 +1005,8 @@
                 case (int) AppsStartInfoProto.Package.USERS:
                     AppStartInfoContainer container =
                             new AppStartInfoContainer(mAppStartInfoHistoryListSize);
-                    int uid = container.readFromProto(proto, AppsStartInfoProto.Package.USERS);
+                    int uid = container.readFromProto(proto, AppsStartInfoProto.Package.USERS,
+                            pkgName);
                     synchronized (mLock) {
                         mData.put(pkgName, uid, container);
                     }
@@ -1403,7 +1404,7 @@
             proto.end(token);
         }
 
-        int readFromProto(ProtoInputStream proto, long fieldId)
+        int readFromProto(ProtoInputStream proto, long fieldId, String packageName)
                 throws IOException, WireTypeMismatchException, ClassNotFoundException {
             long token = proto.start(fieldId);
             for (int next = proto.nextField();
@@ -1418,6 +1419,7 @@
                         // have a create time.
                         ApplicationStartInfo info = new ApplicationStartInfo(0);
                         info.readFromProto(proto, AppsStartInfoProto.Package.User.APP_START_INFO);
+                        info.setPackageName(packageName);
                         mInfos.add(info);
                         break;
                     case (int) AppsStartInfoProto.Package.User.MONITORING_ENABLED:
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 15277ce..4ac42ec 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -25,6 +25,7 @@
 import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
 import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
 import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK;
+import static android.os.BatteryConsumer.POWER_COMPONENT_BASE;
 import static android.os.BatteryStats.POWER_DATA_UNAVAILABLE;
 
 import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
@@ -432,7 +433,8 @@
 
         mPowerStatsStore = new PowerStatsStore(systemDir, mHandler);
         mPowerAttributor = new MultiStatePowerAttributor(mContext, mPowerStatsStore, mPowerProfile,
-                mCpuScalingPolicies, mPowerStatsUidResolver);
+                mCpuScalingPolicies, () -> mStats.getBatteryCapacity(),
+                mPowerStatsUidResolver);
         mPowerStatsScheduler = createPowerStatsScheduler(mContext);
         mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context,
                 mPowerAttributor, mPowerProfile, mCpuScalingPolicies,
@@ -513,6 +515,12 @@
                 BatteryConsumer.POWER_COMPONENT_CPU,
                 Flags.streamlinedBatteryStats());
 
+        mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_WAKELOCK,
+                Flags.streamlinedMiscBatteryStats());
+        attributor.setPowerComponentSupported(
+                BatteryConsumer.POWER_COMPONENT_WAKELOCK,
+                Flags.streamlinedMiscBatteryStats());
+
         mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_SCREEN,
                 Flags.streamlinedMiscBatteryStats());
         attributor.setPowerComponentSupported(
@@ -664,6 +672,8 @@
             } else if (nc.hasTransport(TRANSPORT_CELLULAR)) {
                 return CPU_WAKEUP_SUBSYSTEM_CELLULAR_DATA;
             }
+            // For TRANSPORT_BLUETOOTH, we have a separate channel to catch Bluetooth wakeups.
+            // See noteCpuWakingSysproxyPacket method.
             return CPU_WAKEUP_SUBSYSTEM_UNKNOWN;
         }
 
@@ -686,6 +696,15 @@
         }
 
         @Override
+        public void noteCpuWakingBluetoothProxyPacket(int uid, long elapsedMillis) {
+            if (uid < 0) {
+                Slog.e(TAG, "Invalid uid for waking bluetooth proxy packet: " + uid);
+                return;
+            }
+            noteCpuWakingActivity(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH, elapsedMillis, uid);
+        }
+
+        @Override
         public void noteBinderCallStats(int workSourceUid, long incrementatCallCount,
                 Collection<BinderCallsStats.CallStat> callStats) {
             synchronized (BatteryStatsService.this.mLock) {
@@ -1213,8 +1232,11 @@
 
             final float totalDeviceConsumedPowerMah = (float) deviceConsumer.getConsumedPower();
 
-            for (@BatteryConsumer.PowerComponentId int componentIndex :
+            for (@BatteryConsumer.PowerComponentId int powerComponentId :
                     deviceConsumer.getPowerComponentIds()) {
+                if (powerComponentId == POWER_COMPONENT_BASE) {
+                    continue;
+                }
 
                 for (@BatteryConsumer.ProcessState int processState : UID_PROCESS_STATES) {
 
@@ -1226,7 +1248,7 @@
                             totalDeviceConsumedPowerMah,
                             0,
                             deviceConsumer,
-                            componentIndex)) {
+                            powerComponentId)) {
                         return StatsManager.PULL_SUCCESS;
                     }
                 }
@@ -1242,8 +1264,11 @@
                 final int uid = uidConsumer.getUid();
                 final float totalConsumedPowerMah = (float) uidConsumer.getConsumedPower();
 
-                for (@BatteryConsumer.PowerComponentId int componentIndex :
+                for (@BatteryConsumer.PowerComponentId int powerComponentId :
                         uidConsumer.getPowerComponentIds()) {
+                    if (powerComponentId == POWER_COMPONENT_BASE) {
+                        continue;
+                    }
 
                     for (@BatteryConsumer.ProcessState int processState : UID_PROCESS_STATES) {
 
@@ -1257,7 +1282,7 @@
                                 totalConsumedPowerMah,
                                 timeInProcessStateMs,
                                 uidConsumer,
-                                componentIndex)) {
+                                powerComponentId)) {
                             return StatsManager.PULL_SUCCESS;
                         }
                     }
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 78a0a11..4073ab8 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -458,6 +458,13 @@
         }
 
         void setThreadPriority(int tid, int priority) {
+            if (Flags.resetOnForkEnabled()) {
+                if (Process.getThreadScheduler(tid) == Process.SCHED_OTHER) {
+                    Process.setThreadScheduler(tid,
+                        Process.SCHED_OTHER | Process.SCHED_RESET_ON_FORK,
+                        0);
+                }
+            }
             Process.setThreadPriority(tid, priority);
         }
 
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index a93ae72..57922d5 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -3401,8 +3401,7 @@
         // Check if we should mark the processrecord for first launch after force-stopping
         if (wasStopped) {
             boolean wasEverLaunched = false;
-            if (android.app.Flags.useAppInfoNotLaunched()
-                    || mService.mConstants.mFlagUseAppInfoNotLaunched) {
+            if (android.app.Flags.useAppInfoNotLaunched()) {
                 wasEverLaunched = !info.isNotLaunched();
             } else {
                 try {
@@ -3423,8 +3422,7 @@
                         : STOPPED_STATE_FIRST_LAUNCH;
                 r.getWindowProcessController().setStoppedState(stoppedState);
             } else {
-                if (android.app.Flags.useAppInfoNotLaunched()
-                        || mService.mConstants.mFlagUseAppInfoNotLaunched) {
+                if (android.app.Flags.useAppInfoNotLaunched()) {
                     // If it was launched before, then it must be a force-stop
                     r.setWasForceStopped(wasEverLaunched);
                 } else {
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index a13ce65..a815f72 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -40,6 +40,7 @@
 import android.aconfigd.Aconfigd.StorageReturnMessage;
 import android.aconfigd.Aconfigd.StorageReturnMessages;
 import static com.android.aconfig_new_storage.Flags.enableAconfigStorageDaemon;
+import static com.android.aconfig_new_storage.Flags.supportImmediateLocalOverrides;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
@@ -137,6 +138,7 @@
     // The list is sorted.
     @VisibleForTesting
     static final String[] sDeviceConfigAconfigScopes = new String[] {
+        "aaos_sdv",
         "accessibility",
         "android_core_networking",
         "android_health_services",
@@ -149,6 +151,7 @@
         "art_performance",
         "attack_tools",
         "avic",
+        "desktop_firmware",
         "biometrics",
         "biometrics_framework",
         "biometrics_integration",
@@ -210,6 +213,7 @@
         "preload_safety",
         "printing",
         "privacy_infra_policy",
+        "ravenwood",
         "resource_manager",
         "responsible_apis",
         "rust",
@@ -242,8 +246,10 @@
         "wear_system_health",
         "wear_systems",
         "wear_sysui",
+        "wear_system_managed_surfaces",
         "window_surfaces",
         "windowing_frontend",
+        "xr",
     };
 
     public static final String NAMESPACE_REBOOT_STAGING = "staged";
@@ -491,14 +497,18 @@
     static void writeFlagOverrideRequest(
         ProtoOutputStream proto, String packageName, String flagName, String flagValue,
         boolean isLocal) {
+      int localOverrideTag = supportImmediateLocalOverrides()
+          ? StorageRequestMessage.LOCAL_IMMEDIATE
+          : StorageRequestMessage.LOCAL_ON_REBOOT;
+
       long msgsToken = proto.start(StorageRequestMessages.MSGS);
       long msgToken = proto.start(StorageRequestMessage.FLAG_OVERRIDE_MESSAGE);
       proto.write(StorageRequestMessage.FlagOverrideMessage.PACKAGE_NAME, packageName);
       proto.write(StorageRequestMessage.FlagOverrideMessage.FLAG_NAME, flagName);
       proto.write(StorageRequestMessage.FlagOverrideMessage.FLAG_VALUE, flagValue);
       proto.write(StorageRequestMessage.FlagOverrideMessage.OVERRIDE_TYPE, isLocal
-                ? StorageRequestMessage.LOCAL_ON_REBOOT
-                : StorageRequestMessage.SERVER_ON_REBOOT);
+            ? localOverrideTag
+            : StorageRequestMessage.SERVER_ON_REBOOT);
       proto.end(msgToken);
       proto.end(msgsToken);
     }
diff --git a/services/core/java/com/android/server/am/flags.aconfig b/services/core/java/com/android/server/am/flags.aconfig
index 9b51b6a..7873d34 100644
--- a/services/core/java/com/android/server/am/flags.aconfig
+++ b/services/core/java/com/android/server/am/flags.aconfig
@@ -198,11 +198,23 @@
 
 flag {
     name: "logcat_longer_timeout"
-    namespace: "backstage_power"
+    namespace: "stability"
     description: "Wait longer during the logcat gathering operation"
     bug: "292533246"
     is_fixed_read_only: true
-    metadata {
-        purpose: PURPOSE_BUGFIX
-    }
-}
\ No newline at end of file
+}
+
+flag {
+    name: "defer_display_events_when_frozen"
+    namespace: "system_performance"
+    is_fixed_read_only: true
+    description: "Defer submitting display events to frozen processes."
+    bug: "326315985"
+}
+
+flag {
+    name: "reset_on_fork_enabled"
+    namespace: "system_performance"
+    description: "Set reset_on_fork flag."
+    bug: "370988407"
+}
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index a6389f7..596e375 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -72,6 +72,9 @@
 import static android.content.pm.PermissionInfo.PROTECTION_FLAG_APPOP;
 import static android.permission.flags.Flags.deviceAwareAppOpNewSchemaEnabled;
 
+import static com.android.internal.util.FrameworkStatsLog.APP_OP_NOTE_OP_OR_CHECK_OP_BINDER_API_CALLED__BINDER_API__CHECK_OPERATION;
+import static com.android.internal.util.FrameworkStatsLog.APP_OP_NOTE_OP_OR_CHECK_OP_BINDER_API_CALLED__BINDER_API__NOTE_OPERATION;
+import static com.android.internal.util.FrameworkStatsLog.APP_OP_NOTE_OP_OR_CHECK_OP_BINDER_API_CALLED__BINDER_API__NOTE_PROXY_OPERATION;
 import static com.android.server.appop.AppOpsService.ModeCallback.ALL_OPS;
 
 import android.Manifest;
@@ -160,6 +163,7 @@
 import com.android.internal.pm.pkg.component.ParsedAttribution;
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.DumpUtils;
+import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.Preconditions;
 import com.android.internal.util.XmlUtils;
 import com.android.internal.util.function.pooled.PooledLambda;
@@ -1031,6 +1035,9 @@
         @Override
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
+            if (action == null) {
+                return;
+            }
             String pkgName = intent.getData().getEncodedSchemeSpecificPart().intern();
             int uid = intent.getIntExtra(Intent.EXTRA_UID, Process.INVALID_UID);
 
@@ -2826,12 +2833,26 @@
 
     @Override
     public int checkOperation(int code, int uid, String packageName) {
+        if (Flags.appopAccessTrackingLoggingEnabled()) {
+            FrameworkStatsLog.write(
+                    FrameworkStatsLog.APP_OP_NOTE_OP_OR_CHECK_OP_BINDER_API_CALLED,
+                    uid, code,
+                    APP_OP_NOTE_OP_OR_CHECK_OP_BINDER_API_CALLED__BINDER_API__CHECK_OPERATION,
+                    false);
+        }
         return mCheckOpsDelegateDispatcher.checkOperation(code, uid, packageName, null,
                 Context.DEVICE_ID_DEFAULT, false /*raw*/);
     }
 
     @Override
     public int checkOperationForDevice(int code, int uid, String packageName, int virtualDeviceId) {
+        if (Flags.appopAccessTrackingLoggingEnabled()) {
+            FrameworkStatsLog.write(
+                    FrameworkStatsLog.APP_OP_NOTE_OP_OR_CHECK_OP_BINDER_API_CALLED,
+                    uid, code,
+                    APP_OP_NOTE_OP_OR_CHECK_OP_BINDER_API_CALLED__BINDER_API__CHECK_OPERATION,
+                    false);
+        }
         return mCheckOpsDelegateDispatcher.checkOperation(code, uid, packageName, null,
                 virtualDeviceId, false /*raw*/);
     }
@@ -3012,6 +3033,14 @@
     public SyncNotedAppOp noteProxyOperationWithState(int code,
             AttributionSourceState attributionSourceState, boolean shouldCollectAsyncNotedOp,
             String message, boolean shouldCollectMessage, boolean skipProxyOperation) {
+        if (Flags.appopAccessTrackingLoggingEnabled()) {
+            FrameworkStatsLog.write(
+                    FrameworkStatsLog.APP_OP_NOTE_OP_OR_CHECK_OP_BINDER_API_CALLED,
+                    attributionSourceState.uid, code,
+                    APP_OP_NOTE_OP_OR_CHECK_OP_BINDER_API_CALLED__BINDER_API__NOTE_PROXY_OPERATION,
+                    attributionSourceState.attributionTag != null);
+        }
+
         AttributionSource attributionSource = new AttributionSource(attributionSourceState);
         return mCheckOpsDelegateDispatcher.noteProxyOperation(code, attributionSource,
                 shouldCollectAsyncNotedOp, message, shouldCollectMessage, skipProxyOperation);
@@ -3093,6 +3122,14 @@
     public SyncNotedAppOp noteOperation(int code, int uid, String packageName,
             String attributionTag, boolean shouldCollectAsyncNotedOp, String message,
             boolean shouldCollectMessage) {
+        if (Flags.appopAccessTrackingLoggingEnabled()) {
+            FrameworkStatsLog.write(
+                    FrameworkStatsLog.APP_OP_NOTE_OP_OR_CHECK_OP_BINDER_API_CALLED,
+                    uid, code,
+                    APP_OP_NOTE_OP_OR_CHECK_OP_BINDER_API_CALLED__BINDER_API__NOTE_OPERATION,
+                    attributionTag != null);
+        }
+
         return mCheckOpsDelegateDispatcher.noteOperation(code, uid, packageName,
                 attributionTag, Context.DEVICE_ID_DEFAULT, shouldCollectAsyncNotedOp, message,
                 shouldCollectMessage);
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index 87504154..60dbf3f 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -384,11 +384,13 @@
     /**
      * Indicates if a Bluetooth SCO activation request owner is controlling
      * the SCO audio state itself or not.
-     * @param uid the UI of the SOC request owner app
+     * @param uid the UID of the SOC request owner app
      * @return true if we should control SCO audio state, false otherwise
      */
     private boolean shouldStartScoForUid(int uid) {
-        return !(uid == Process.BLUETOOTH_UID || uid == Process.PHONE_UID);
+        return !(UserHandle.isSameApp(uid, Process.BLUETOOTH_UID)
+                || UserHandle.isSameApp(uid, Process.PHONE_UID)
+                || UserHandle.isSameApp(uid, Process.SYSTEM_UID));
     }
 
     @GuardedBy("mDeviceStateLock")
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index 5fd12c2..09de894 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -385,11 +385,6 @@
                     || !updatedDevice.getDeviceAddress().equals(ads.getDeviceAddress())) {
                 continue;
             }
-            if (mDeviceBroker.isSADevice(updatedDevice) == mDeviceBroker.isSADevice(ads)) {
-                ads.setHasHeadTracker(updatedDevice.hasHeadTracker());
-                ads.setHeadTrackerEnabled(updatedDevice.isHeadTrackerEnabled());
-                ads.setSAEnabled(updatedDevice.isSAEnabled());
-            }
             ads.setAudioDeviceCategory(updatedDevice.getAudioDeviceCategory());
 
             mDeviceBroker.postUpdatedAdiDeviceState(ads, false /*initSA*/);
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 561030e..1563a62 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -286,6 +286,7 @@
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.concurrent.CancellationException;
+import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
@@ -1583,8 +1584,11 @@
 
         synchronized (mCachedAbsVolDrivingStreamsLock) {
             mCachedAbsVolDrivingStreams.forEach((dev, stream) -> {
-                mAudioSystem.setDeviceAbsoluteVolumeEnabled(dev, /*address=*/"", /*enabled=*/true,
-                        stream);
+                boolean enabled = true;
+                if (dev == AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP) {
+                    enabled = mAvrcpAbsVolSupported;
+                }
+                mAudioSystem.setDeviceAbsoluteVolumeEnabled(dev, /*address=*/"", enabled, stream);
             });
         }
     }
@@ -4027,7 +4031,6 @@
                             && isFullVolumeDevice(device);
                     boolean tvConditions = mHdmiTvClient != null
                             && mHdmiSystemAudioSupported
-                            && isFullVolumeDevice(device)
                             && !isAbsoluteVolumeDevice(device)
                             && !isA2dpAbsoluteVolumeDevice(device);
 
@@ -4881,7 +4884,7 @@
                 if (absDev == AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP) {
                     enabled = mAvrcpAbsVolSupported;
                 }
-                if (stream != streamType) {
+                if (stream != streamType || !enabled) {
                     mAudioSystem.setDeviceAbsoluteVolumeEnabled(absDev, /*address=*/"",
                             enabled, streamType);
                 }
@@ -10097,9 +10100,6 @@
 
                 case MSG_INIT_SPATIALIZER:
                     onInitSpatializer();
-                    // the device inventory can only be synchronized after the
-                    // spatializer has been initialized
-                    mDeviceBroker.postSynchronizeAdiDevicesInInventory(null);
                     mAudioEventWakeLock.release();
                     break;
 
@@ -10383,10 +10383,10 @@
     }
 
     /*package*/ void setAvrcpAbsoluteVolumeSupported(boolean support) {
-        mAvrcpAbsVolSupported = support;
-        if (absVolumeIndexFix()) {
-            int a2dpDev = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
-            synchronized (mCachedAbsVolDrivingStreamsLock) {
+        synchronized (mCachedAbsVolDrivingStreamsLock) {
+            mAvrcpAbsVolSupported = support;
+            if (absVolumeIndexFix()) {
+                int a2dpDev = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
                 mCachedAbsVolDrivingStreams.compute(a2dpDev, (dev, stream) -> {
                     if (!mAvrcpAbsVolSupported) {
                         mAudioSystem.setDeviceAbsoluteVolumeEnabled(a2dpDev, /*address=*/
@@ -12499,6 +12499,12 @@
         pw.println("\nLoudness alignment:");
         mLoudnessCodecHelper.dump(pw);
 
+        pw.println("\nAbsolute voume devices:");
+        synchronized (mCachedAbsVolDrivingStreamsLock) {
+            mCachedAbsVolDrivingStreams.forEach((dev, stream) -> pw.println(
+                    "Device type: 0x" + Integer.toHexString(dev) + ", driving stream " + stream));
+        }
+
         mAudioSystem.dump(pw);
     }
 
diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
index 88268cd..a734e73 100644
--- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
@@ -253,7 +253,11 @@
                 updateAllowedCapturePolicy(apc, mAllowedCapturePolicies.get(uid));
             }
         }
-        sEventLogger.enqueue(new NewPlayerEvent(apc));
+        var packages = mContext.getPackageManager().getPackagesForUid(apc.getClientUid());
+        sEventLogger.enqueue(new NewPlayerEvent(
+                    apc,
+                    packages != null && packages.length > 0 ? packages[0] : null
+                ));
         synchronized(mPlayerLock) {
             mPlayers.put(newPiid, apc);
             maybeMutePlayerAwaitingConnection(apc);
@@ -1402,14 +1406,16 @@
         private final int mPlayerIId;
         private final int mPlayerType;
         private final int mClientUid;
+        private final String mClientPackageName;
         private final int mClientPid;
         private final AudioAttributes mPlayerAttr;
         private final int mSessionId;
 
-        NewPlayerEvent(AudioPlaybackConfiguration apc) {
+        NewPlayerEvent(AudioPlaybackConfiguration apc, String packageName) {
             mPlayerIId = apc.getPlayerInterfaceId();
             mPlayerType = apc.getPlayerType();
             mClientUid = apc.getClientUid();
+            mClientPackageName = packageName;
             mClientPid = apc.getClientPid();
             mPlayerAttr = apc.getAudioAttributes();
             mSessionId = apc.getSessionId();
@@ -1418,7 +1424,7 @@
         @Override
         public String eventToString() {
             return new String("new player piid:" + mPlayerIId + " uid/pid:" + mClientUid + "/"
-                    + mClientPid + " type:"
+                    + mClientPid  + " package:" + mClientPackageName + " type:"
                     + AudioPlaybackConfiguration.toLogFriendlyPlayerType(mPlayerType)
                     + " attr:" + mPlayerAttr
                     + " session:" + mSessionId);
diff --git a/services/core/java/com/android/server/biometrics/AuthSession.java b/services/core/java/com/android/server/biometrics/AuthSession.java
index abfbddc..3afecf1 100644
--- a/services/core/java/com/android/server/biometrics/AuthSession.java
+++ b/services/core/java/com/android/server/biometrics/AuthSession.java
@@ -879,6 +879,14 @@
                     );
                     break;
 
+                case BiometricPrompt.DISMISSED_REASON_ERROR_NO_WM:
+                    mClientReceiver.onError(
+                            getEligibleModalities(),
+                            BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
+                            0 /* vendorCode */
+                    );
+                    break;
+
                 default:
                     Slog.w(TAG, "Unhandled reason: " + reason);
                     break;
diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java
index feef540..4c91789 100644
--- a/services/core/java/com/android/server/biometrics/BiometricService.java
+++ b/services/core/java/com/android/server/biometrics/BiometricService.java
@@ -725,7 +725,7 @@
                 return -1;
             }
 
-            if (!Utils.isValidAuthenticatorConfig(promptInfo)) {
+            if (!Utils.isValidAuthenticatorConfig(getContext(), promptInfo)) {
                 throw new SecurityException("Invalid authenticator configuration");
             }
 
@@ -763,7 +763,7 @@
                     + ", Caller=" + callingUserId
                     + ", Authenticators=" + authenticators);
 
-            if (!Utils.isValidAuthenticatorConfig(authenticators)) {
+            if (!Utils.isValidAuthenticatorConfig(getContext(), authenticators)) {
                 throw new SecurityException("Invalid authenticator configuration");
             }
 
@@ -1038,7 +1038,7 @@
                     + ", Caller=" + callingUserId
                     + ", Authenticators=" + authenticators);
 
-            if (!Utils.isValidAuthenticatorConfig(authenticators)) {
+            if (!Utils.isValidAuthenticatorConfig(getContext(), authenticators)) {
                 throw new SecurityException("Invalid authenticator configuration");
             }
 
@@ -1060,7 +1060,7 @@
 
             Slog.d(TAG, "getSupportedModalities: Authenticators=" + authenticators);
 
-            if (!Utils.isValidAuthenticatorConfig(authenticators)) {
+            if (!Utils.isValidAuthenticatorConfig(getContext(), authenticators)) {
                 throw new SecurityException("Invalid authenticator configuration");
             }
 
diff --git a/services/core/java/com/android/server/biometrics/OWNERS b/services/core/java/com/android/server/biometrics/OWNERS
index 4703efb..13bba9d 100644
--- a/services/core/java/com/android/server/biometrics/OWNERS
+++ b/services/core/java/com/android/server/biometrics/OWNERS
@@ -1,14 +1,12 @@
 set noparent
 
 graciecheng@google.com
-ilyamaty@google.com
 jbolinger@google.com
 jeffpu@google.com
 joshmccloskey@google.com
 diyab@google.com
 austindelgado@google.com
 spdonghao@google.com
-wenhuiy@google.com
 
 firewall@google.com
 jasonsfchang@google.com
diff --git a/services/core/java/com/android/server/biometrics/Utils.java b/services/core/java/com/android/server/biometrics/Utils.java
index 407ef1e..8734136 100644
--- a/services/core/java/com/android/server/biometrics/Utils.java
+++ b/services/core/java/com/android/server/biometrics/Utils.java
@@ -16,6 +16,7 @@
 
 package com.android.server.biometrics;
 
+import static android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED;
 import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL;
 import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE;
 import static android.hardware.biometrics.BiometricManager.Authenticators;
@@ -233,17 +234,18 @@
      * @param promptInfo
      * @return
      */
-    static boolean isValidAuthenticatorConfig(PromptInfo promptInfo) {
+    static boolean isValidAuthenticatorConfig(Context context, PromptInfo promptInfo) {
         final int authenticators = promptInfo.getAuthenticators();
-        return isValidAuthenticatorConfig(authenticators);
+        return isValidAuthenticatorConfig(context, authenticators);
     }
 
     /**
-     * Checks if the authenticator configuration is a valid combination of the public APIs
-     * @param authenticators
-     * @return
+     * Checks if the authenticator configuration is a valid combination of the public APIs.
+     *
+     * throws {@link SecurityException} if the caller requests for mandatory biometrics without
+     * {@link SET_BIOMETRIC_DIALOG_ADVANCED} permission
      */
-    static boolean isValidAuthenticatorConfig(int authenticators) {
+    static boolean isValidAuthenticatorConfig(Context context, int authenticators) {
         // The caller is not required to set the authenticators. But if they do, check the below.
         if (authenticators == 0) {
             return true;
@@ -251,9 +253,15 @@
 
         // Check if any of the non-biometric and non-credential bits are set. If so, this is
         // invalid.
-        final int testBits = ~(Authenticators.DEVICE_CREDENTIAL
-                | Authenticators.BIOMETRIC_MIN_STRENGTH
-                | Authenticators.MANDATORY_BIOMETRICS);
+        final int testBits;
+        if (Flags.mandatoryBiometrics()) {
+            testBits = ~(Authenticators.DEVICE_CREDENTIAL
+                    | Authenticators.BIOMETRIC_MIN_STRENGTH
+                    | Authenticators.MANDATORY_BIOMETRICS);
+        } else {
+            testBits = ~(Authenticators.DEVICE_CREDENTIAL
+                    | Authenticators.BIOMETRIC_MIN_STRENGTH);
+        }
         if ((authenticators & testBits) != 0) {
             Slog.e(BiometricService.TAG, "Non-biometric, non-credential bits found."
                     + " Authenticators: " + authenticators);
@@ -271,6 +279,9 @@
         } else if (biometricBits == Authenticators.BIOMETRIC_WEAK) {
             return true;
         } else if (isMandatoryBiometricsRequested(authenticators)) {
+            //TODO(b/347123256): Update CTS test
+            context.enforceCallingOrSelfPermission(SET_BIOMETRIC_DIALOG_ADVANCED,
+                    "Must have SET_BIOMETRIC_DIALOG_ADVANCED permission");
             return true;
         }
 
diff --git a/services/core/java/com/android/server/biometrics/log/BiometricFrameworkStatsLogger.java b/services/core/java/com/android/server/biometrics/log/BiometricFrameworkStatsLogger.java
index bc58501..93b0e66 100644
--- a/services/core/java/com/android/server/biometrics/log/BiometricFrameworkStatsLogger.java
+++ b/services/core/java/com/android/server/biometrics/log/BiometricFrameworkStatsLogger.java
@@ -123,7 +123,8 @@
                 enrollSuccessful,
                 -1, /* sensorId */
                 ambientLightLux,
-                source);
+                source,
+                -1 /* templateId*/);
     }
 
     /** {@see FrameworkStatsLog.BIOMETRIC_ERROR_OCCURRED}. */
diff --git a/services/core/java/com/android/server/crashrecovery/CrashRecoveryModule.java b/services/core/java/com/android/server/crashrecovery/CrashRecoveryModule.java
index 5f2fbce..8a81aaa 100644
--- a/services/core/java/com/android/server/crashrecovery/CrashRecoveryModule.java
+++ b/services/core/java/com/android/server/crashrecovery/CrashRecoveryModule.java
@@ -23,7 +23,10 @@
 import com.android.server.SystemService;
 
 
-/** This class encapsulate the lifecycle methods of CrashRecovery module. */
+/** This class encapsulate the lifecycle methods of CrashRecovery module.
+ *
+ * @hide
+ */
 public class CrashRecoveryModule {
     private static final String TAG = "CrashRecoveryModule";
 
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
index dc263c5..8d96ba9 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
@@ -377,6 +377,7 @@
  *              </point>
  *            </map>
  *          </luxToBrightnessMapping>
+ *          <idleStylusTimeoutMillis>10000</idleStylusTimeoutMillis>
  *      </autoBrightness>
  *
  *      <screenBrightnessRampFastDecrease>0.01</screenBrightnessRampFastDecrease>
@@ -708,6 +709,10 @@
 
     private static final int KEEP_CURRENT_BRIGHTNESS = -1;
 
+    // The default value to 0 which will signify that the stylus usage immediately stopped
+    // after it was started. This will make the system behave as if the stylus was never used
+    private static final int DEFAULT_IDLE_STYLUS_TIMEOUT_MILLIS = 0;
+
     private final Context mContext;
 
     // The details of the ambient light sensor associated with this display.
@@ -754,6 +759,9 @@
     @Nullable
     private DisplayBrightnessMappingConfig mDisplayBrightnessMapping;
 
+    private int mIdleStylusTimeoutMillis =
+            DEFAULT_IDLE_STYLUS_TIMEOUT_MILLIS;
+
     private float mBacklightMinimum = Float.NaN;
     private float mBacklightMaximum = Float.NaN;
     private float mBrightnessDefault = Float.NaN;
@@ -1080,7 +1088,7 @@
      */
     public float[] getNits() {
         if (mEvenDimmerBrightnessData != null) {
-            return mEvenDimmerBrightnessData.mNits;
+            return mEvenDimmerBrightnessData.nits;
         }
         return mNits;
     }
@@ -1093,7 +1101,7 @@
     @VisibleForTesting
     public float[] getBacklight() {
         if (mEvenDimmerBrightnessData != null) {
-            return mEvenDimmerBrightnessData.mBacklight;
+            return mEvenDimmerBrightnessData.backlight;
         }
         return mBacklight;
     }
@@ -1107,7 +1115,7 @@
      */
     public float getBacklightFromBrightness(float brightness) {
         if (mEvenDimmerBrightnessData != null) {
-            return mEvenDimmerBrightnessData.mBrightnessToBacklight.interpolate(brightness);
+            return mEvenDimmerBrightnessData.brightnessToBacklight.interpolate(brightness);
         }
         return mBrightnessToBacklightSpline.interpolate(brightness);
     }
@@ -1120,7 +1128,7 @@
      */
     public float getBrightnessFromBacklight(float backlight) {
         if (mEvenDimmerBrightnessData != null) {
-            return mEvenDimmerBrightnessData.mBacklightToBrightness.interpolate(backlight);
+            return mEvenDimmerBrightnessData.backlightToBrightness.interpolate(backlight);
         }
         return mBacklightToBrightnessSpline.interpolate(backlight);
     }
@@ -1131,7 +1139,7 @@
      */
     private Spline getBacklightToBrightnessSpline() {
         if (mEvenDimmerBrightnessData != null) {
-            return mEvenDimmerBrightnessData.mBacklightToBrightness;
+            return mEvenDimmerBrightnessData.backlightToBrightness;
         }
         return mBacklightToBrightnessSpline;
     }
@@ -1144,11 +1152,11 @@
      */
     public float getNitsFromBacklight(float backlight) {
         if (mEvenDimmerBrightnessData != null) {
-            if (mEvenDimmerBrightnessData.mBacklightToNits == null) {
+            if (mEvenDimmerBrightnessData.backlightToNits == null) {
                 return INVALID_NITS;
             }
             backlight = Math.max(backlight, mBacklightMinimum);
-            return mEvenDimmerBrightnessData.mBacklightToNits.interpolate(backlight);
+            return mEvenDimmerBrightnessData.backlightToNits.interpolate(backlight);
         }
 
         if (mBacklightToNitsSpline == null) {
@@ -1165,14 +1173,14 @@
      */
     public float getBacklightFromNits(float nits) {
         if (mEvenDimmerBrightnessData != null) {
-            return mEvenDimmerBrightnessData.mNitsToBacklight.interpolate(nits);
+            return mEvenDimmerBrightnessData.nitsToBacklight.interpolate(nits);
         }
         return mNitsToBacklightSpline.interpolate(nits);
     }
 
     private Spline getNitsToBacklightSpline() {
         if (mEvenDimmerBrightnessData != null) {
-            return mEvenDimmerBrightnessData.mNitsToBacklight;
+            return mEvenDimmerBrightnessData.nitsToBacklight;
         }
         return mNitsToBacklightSpline;
     }
@@ -1186,7 +1194,7 @@
         if (mEvenDimmerBrightnessData == null) {
             return INVALID_NITS;
         }
-        return mEvenDimmerBrightnessData.mMinLuxToNits.interpolate(lux);
+        return mEvenDimmerBrightnessData.minLuxToNits.interpolate(lux);
     }
 
     /**
@@ -1197,7 +1205,7 @@
         if (mEvenDimmerBrightnessData == null) {
             return PowerManager.BRIGHTNESS_MIN;
         }
-        return mEvenDimmerBrightnessData.mTransitionPoint;
+        return mEvenDimmerBrightnessData.transitionPoint;
     }
 
     /**
@@ -1268,7 +1276,7 @@
      */
     public float[] getBrightness() {
         if (mEvenDimmerBrightnessData != null) {
-            return mEvenDimmerBrightnessData.mBrightness;
+            return mEvenDimmerBrightnessData.brightness;
         }
         return mBrightness;
     }
@@ -1730,6 +1738,7 @@
                 + ", mDisplayBrightnessMapping= " + mDisplayBrightnessMapping
                 + ", mDdcAutoBrightnessAvailable= " + mDdcAutoBrightnessAvailable
                 + ", mAutoBrightnessAvailable= " + mAutoBrightnessAvailable
+                + ", mIdleStylusTimeoutMillis= " + mIdleStylusTimeoutMillis
                 + "\n"
                 + "mDefaultLowBlockingZoneRefreshRate= " + mDefaultLowBlockingZoneRefreshRate
                 + ", mDefaultHighBlockingZoneRefreshRate= " + mDefaultHighBlockingZoneRefreshRate
@@ -2389,10 +2398,19 @@
         loadAutoBrightnessDarkeningLightDebounceIdle(autoBrightness);
         mDisplayBrightnessMapping = new DisplayBrightnessMappingConfig(mContext, mFlags,
                 autoBrightness, getBacklightToBrightnessSpline());
+        loadIdleStylusTimeoutMillis(autoBrightness);
         loadEnableAutoBrightness(autoBrightness);
     }
 
     /**
+     * Gets the timeout post the stylus usage after which the automatic brightness will be enabled
+     * again
+     */
+    public int getIdleStylusTimeoutMillis() {
+        return mIdleStylusTimeoutMillis;
+    }
+
+    /**
      * Loads the auto-brightness brightening light debounce. Internally, this takes care of loading
      * the value from the display config, and if not present, falls back to config.xml.
      */
@@ -2617,13 +2635,13 @@
                 List<NonNegativeFloatToFloatPoint> points = map.getMap().getPoint();
                 for (NonNegativeFloatToFloatPoint point : points) {
                     float lux = point.getFirst().floatValue();
-                    float maxBrightness = point.getSecond().floatValue();
-                    if (maxBrightness > hbmTransitionPoint) {
+                    float maxBacklight = point.getSecond().floatValue();
+                    if (maxBacklight > hbmTransitionPoint) {
                         Slog.wtf(TAG,
-                                "Invalid NBM config: maxBrightness is greater than hbm"
+                                "Invalid NBM config: maxBacklight is greater than hbm"
                                         + ".transitionPoint. type="
-                                        + type + "; lux=" + lux + "; maxBrightness="
-                                        + maxBrightness);
+                                        + type + "; lux=" + lux + "; maxBacklight="
+                                        + maxBacklight);
                         continue;
                     }
                     if (luxToTransitionPointMap.containsKey(lux)) {
@@ -2632,8 +2650,7 @@
                                         + lux);
                         continue;
                     }
-                    luxToTransitionPointMap.put(lux,
-                            getBrightnessFromBacklight(maxBrightness));
+                    luxToTransitionPointMap.put(lux, getBrightnessFromBacklight(maxBacklight));
                 }
                 if (!luxToTransitionPointMap.isEmpty()) {
                     mLuxThrottlingData.put(mappedType, luxToTransitionPointMap);
@@ -2924,6 +2941,16 @@
         return levels;
     }
 
+    private void loadIdleStylusTimeoutMillis(AutoBrightness autoBrightness) {
+        if (autoBrightness == null) {
+            return;
+        }
+        BigInteger idleStylusTimeoutMillis = autoBrightness.getIdleStylusTimeoutMillis();
+        if (idleStylusTimeoutMillis != null) {
+            mIdleStylusTimeoutMillis = idleStylusTimeoutMillis.intValue();
+        }
+    }
+
     private void loadEnableAutoBrightness(AutoBrightness autobrightness) {
         // mDdcAutoBrightnessAvailable is initialised to true, so that we fallback to using the
         // config.xml values if the autobrightness tag is not defined in the ddc file.
diff --git a/services/core/java/com/android/server/display/DisplayGroup.java b/services/core/java/com/android/server/display/DisplayGroup.java
index 2dcd5cc..f73b66c 100644
--- a/services/core/java/com/android/server/display/DisplayGroup.java
+++ b/services/core/java/com/android/server/display/DisplayGroup.java
@@ -87,4 +87,14 @@
     int getIdLocked(int index) {
         return mDisplays.get(index).getDisplayIdLocked();
     }
+
+    /** Returns the IDs of the {@link LogicalDisplay}s belonging to the DisplayGroup. */
+    int[] getIdsLocked() {
+        final int numDisplays = mDisplays.size();
+        final int[] displayIds = new int[numDisplays];
+        for (int i = 0; i < numDisplays; i++) {
+            displayIds[i] = mDisplays.get(i).getDisplayIdLocked();
+        }
+        return displayIds;
+    }
 }
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index ae33b83..179ec63 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -45,9 +45,11 @@
 import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL;
 import static android.os.Process.FIRST_APPLICATION_UID;
 import static android.os.Process.ROOT_UID;
+import static android.provider.Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS;
 import static android.provider.Settings.Secure.RESOLUTION_MODE_FULL;
 import static android.provider.Settings.Secure.RESOLUTION_MODE_HIGH;
 import static android.provider.Settings.Secure.RESOLUTION_MODE_UNKNOWN;
+import static android.text.TextUtils.formatSimple;
 import static android.view.Display.HdrCapabilities.HDR_TYPE_INVALID;
 
 import static com.android.server.display.layout.Layout.Display.POSITION_REAR;
@@ -279,6 +281,8 @@
     private InputManagerInternal mInputManagerInternal;
     private ActivityManagerInternal mActivityManagerInternal;
     private final UidImportanceListener mUidImportanceListener = new UidImportanceListener();
+    private final DisplayFrozenProcessListener mDisplayFrozenProcessListener;
+
     @Nullable
     private IMediaProjectionManager mProjectionService;
     private DeviceStateManagerInternal mDeviceStateManager;
@@ -321,6 +325,12 @@
     @GuardedBy("mSyncRoot")
     private final SparseArray<CallbackRecord> mCallbacks = new SparseArray<>();
 
+    // All callback records indexed by [uid][pid], for fast lookup by uid.
+    // This is only used if {@link deferDisplayEventsWhenFrozen()} is true.
+    @GuardedBy("mSyncRoot")
+    private final SparseArray<SparseArray<CallbackRecord>> mCallbackRecordByPidByUid =
+            new SparseArray<>();
+
     /**
      *  All {@link IVirtualDevice} and {@link DisplayWindowPolicyController}s indexed by
      *  {@link DisplayInfo#displayId}.
@@ -472,6 +482,7 @@
 
     // Pending callback records indexed by calling process uid and pid.
     // Must be used outside of the lock mSyncRoot and should be self-locked.
+    // This is only used when {@link deferDisplayEventsWhenFrozen()} is false.
     @GuardedBy("mPendingCallbackSelfLocked")
     private final SparseArray<SparseArray<PendingCallback>> mPendingCallbackSelfLocked =
             new SparseArray<>();
@@ -611,6 +622,7 @@
         mFlags = injector.getFlags();
         mHandler = new DisplayManagerHandler(displayThreadLooper);
         mHandlerExecutor = new HandlerExecutor(mHandler);
+        mDisplayFrozenProcessListener = new DisplayFrozenProcessListener();
         mUiHandler = UiThread.getHandler();
         mDisplayDeviceRepo = new DisplayDeviceRepository(mSyncRoot, mPersistentDataStore);
         mLogicalDisplayMapper = new LogicalDisplayMapper(mContext,
@@ -644,12 +656,14 @@
         mExtraDisplayLoggingPackageName = DisplayProperties.debug_vri_package().orElse(null);
         mExtraDisplayEventLogging = !TextUtils.isEmpty(mExtraDisplayLoggingPackageName);
 
-        mExternalDisplayStatsService = new ExternalDisplayStatsService(mContext, mHandler);
+        mExternalDisplayStatsService = new ExternalDisplayStatsService(mContext, mHandler,
+                this::isExtendedDisplayEnabled);
         mDisplayNotificationManager = new DisplayNotificationManager(mFlags, mContext,
                 mExternalDisplayStatsService);
         mExternalDisplayPolicy = new ExternalDisplayPolicy(new ExternalDisplayPolicyInjector());
         if (mFlags.isDisplayTopologyEnabled()) {
-            mDisplayTopologyCoordinator = new DisplayTopologyCoordinator();
+            mDisplayTopologyCoordinator =
+                    new DisplayTopologyCoordinator(this::isExtendedDisplayEnabled);
         } else {
             mDisplayTopologyCoordinator = null;
         }
@@ -1034,10 +1048,14 @@
     private class UidImportanceListener implements ActivityManager.OnUidImportanceListener {
         @Override
         public void onUidImportance(int uid, int importance) {
-          onUidImportanceInternal(uid, importance);
+            if (deferDisplayEventsWhenFrozen()) {
+                onUidImportanceFlagged(uid, importance);
+            } else {
+                onUidImportanceUnflagged(uid, importance);
+            }
         }
 
-        private void onUidImportanceInternal(int uid, int importance) {
+        private void onUidImportanceUnflagged(int uid, int importance) {
             synchronized (mPendingCallbackSelfLocked) {
                 if (importance >= IMPORTANCE_GONE) {
                     // Clean up as the app is already gone
@@ -1068,6 +1086,83 @@
                 mPendingCallbackSelfLocked.delete(uid);
             }
         }
+
+        private void onUidImportanceFlagged(int uid, int importance) {
+            final boolean cached = (importance >= IMPORTANCE_CACHED);
+            List<CallbackRecord> readyCallbackRecords = null;
+            synchronized (mSyncRoot) {
+                final SparseArray<CallbackRecord> procs = mCallbackRecordByPidByUid.get(uid);
+                if (procs == null) {
+                    return;
+                }
+                if (cached) {
+                    setCachedLocked(procs);
+                } else {
+                    readyCallbackRecords = setUncachedLocked(procs);
+                }
+            }
+            if (readyCallbackRecords != null) {
+                // Attempt to dispatch pending events if the UID is coming out of cached state.
+                for (int i = 0; i < readyCallbackRecords.size(); i++) {
+                    readyCallbackRecords.get(i).dispatchPending();
+                }
+            }
+        }
+
+        // Set all processes in the list to cached.
+        @GuardedBy("mSyncRoot")
+        private void setCachedLocked(SparseArray<CallbackRecord> procs) {
+            for (int i = 0; i < procs.size(); i++) {
+                final CallbackRecord cb = procs.valueAt(i);
+                if (cb != null) {
+                    cb.setCached(true);
+                }
+            }
+        }
+
+        // Set all processes to uncached and return the list of processes that were modified.
+        @GuardedBy("mSyncRoot")
+        private List<CallbackRecord> setUncachedLocked(SparseArray<CallbackRecord> procs) {
+            ArrayList<CallbackRecord> ready = null;
+            for (int i = 0; i < procs.size(); i++) {
+                final CallbackRecord cb = procs.valueAt(i);
+                if (cb != null) {
+                    if (cb.setCached(false)) {
+                        if (ready == null) ready = new ArrayList<>();
+                        ready.add(cb);
+                    }
+                }
+            }
+            return ready;
+        }
+    }
+
+    private class DisplayFrozenProcessListener
+            implements ActivityManagerInternal.FrozenProcessListener {
+        public void onProcessFrozen(int pid) {
+            synchronized (mSyncRoot) {
+                CallbackRecord callback = mCallbacks.get(pid);
+                if (callback == null) {
+                    return;
+                }
+                callback.setFrozen(true);
+            }
+        }
+
+        public void onProcessUnfrozen(int pid) {
+            // First, see if there is a callback associated with this pid.  If there's no
+            // callback, then there is nothing to do.
+            CallbackRecord callback;
+            synchronized (mSyncRoot) {
+                callback = mCallbacks.get(pid);
+                if (callback == null) {
+                    return;
+                }
+                callback.setFrozen(false);
+            }
+            // Attempt to dispatch pending events if the process is coming out of frozen.
+            callback.dispatchPending();
+        }
     }
 
     private class SettingsObserver extends ContentObserver {
@@ -1314,12 +1409,29 @@
             }
 
             mCallbacks.put(callingPid, record);
+            if (deferDisplayEventsWhenFrozen()) {
+                SparseArray<CallbackRecord> uidPeers = mCallbackRecordByPidByUid.get(record.mUid);
+                if (uidPeers == null) {
+                    uidPeers = new SparseArray<CallbackRecord>();
+                    mCallbackRecordByPidByUid.put(record.mUid, uidPeers);
+                }
+                uidPeers.put(record.mPid, record);
+            }
         }
     }
 
     private void onCallbackDied(CallbackRecord record) {
         synchronized (mSyncRoot) {
             mCallbacks.remove(record.mPid);
+            if (deferDisplayEventsWhenFrozen()) {
+                SparseArray<CallbackRecord> uidPeers = mCallbackRecordByPidByUid.get(record.mUid);
+                if (uidPeers != null) {
+                    uidPeers.remove(record.mPid);
+                    if (uidPeers.size() == 0) {
+                        mCallbackRecordByPidByUid.remove(record.mUid);
+                    }
+                }
+            }
             stopWifiDisplayScanLocked(record);
         }
     }
@@ -1549,33 +1661,49 @@
         return false;
     }
 
+    private boolean hasVideoOutputPermission(String func) {
+        return checkCallingPermission(CAPTURE_VIDEO_OUTPUT, func)
+                || hasSecureVideoOutputPermission(func);
+    }
+
+    private boolean hasSecureVideoOutputPermission(String func) {
+        return checkCallingPermission(CAPTURE_SECURE_VIDEO_OUTPUT, func);
+    }
+
+    private boolean canCreateMirrorDisplays(IVirtualDevice virtualDevice) {
+        if (virtualDevice == null) {
+            return false;
+        }
+        try {
+            return virtualDevice.canCreateMirrorDisplays();
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Unable to query virtual device for permissions", e);
+            return false;
+        }
+    }
+
     private boolean canProjectVideo(IMediaProjection projection) {
-        if (projection != null) {
-            try {
-                if (projection.canProjectVideo()) {
-                    return true;
-                }
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Unable to query projection service for permissions", e);
-            }
+        if (projection == null) {
+            return false;
         }
-        if (checkCallingPermission(CAPTURE_VIDEO_OUTPUT, "canProjectVideo()")) {
-            return true;
+        try {
+            return projection.canProjectVideo();
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Unable to query projection service for permissions", e);
+            return false;
         }
-        return canProjectSecureVideo(projection);
     }
 
     private boolean canProjectSecureVideo(IMediaProjection projection) {
-        if (projection != null) {
-            try {
-                if (projection.canProjectSecureVideo()) {
-                    return true;
-                }
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Unable to query projection service for permissions", e);
-            }
+        if (projection == null) {
+            return false;
         }
-        return checkCallingPermission(CAPTURE_SECURE_VIDEO_OUTPUT, "canProjectSecureVideo()");
+        try {
+            return projection.canProjectSecureVideo();
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Unable to query projection service for permissions", e);
+            return false;
+        }
     }
 
     private boolean checkCallingPermission(String permission, String func) {
@@ -1681,7 +1809,8 @@
                 && (flags & VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR) != 0) {
             // Only a valid media projection or a virtual device can create a mirror virtual
             // display.
-            if (!canProjectVideo(projection) && virtualDevice == null) {
+            if (!canProjectVideo(projection) && !canCreateMirrorDisplays(virtualDevice)
+                    && !hasVideoOutputPermission("createVirtualDisplayInternal")) {
                 throw new SecurityException("Requires CAPTURE_VIDEO_OUTPUT or "
                         + "CAPTURE_SECURE_VIDEO_OUTPUT permission, or an appropriate "
                         + "MediaProjection token in order to create a screen sharing virtual "
@@ -1691,7 +1820,8 @@
             }
         }
         if (callingUid != Process.SYSTEM_UID && (flags & VIRTUAL_DISPLAY_FLAG_SECURE) != 0) {
-            if (!canProjectSecureVideo(projection)) {
+            if (!canProjectSecureVideo(projection)
+                    && !hasSecureVideoOutputPermission("createVirtualDisplayInternal")) {
                 throw new SecurityException("Requires CAPTURE_SECURE_VIDEO_OUTPUT "
                         + "or an appropriate MediaProjection token to create a "
                         + "secure virtual display.");
@@ -1848,7 +1978,7 @@
                         // handles stopping the projection.
                         Slog.w(TAG, "Content Recording: failed to start mirroring - "
                                 + "releasing virtual display " + displayId);
-                        releaseVirtualDisplayInternal(callback.asBinder());
+                        releaseVirtualDisplayInternal(callback.asBinder(), callingUid);
                         return Display.INVALID_DISPLAY;
                     } else if (projection != null) {
                         // Indicate that this projection has been used to record, and can't be used
@@ -1937,7 +2067,7 @@
         // Something weird happened and the logical display was not created.
         Slog.w(TAG, "Rejecting request to create virtual display "
                 + "because the logical display was not created.");
-        mVirtualDisplayAdapter.releaseVirtualDisplayLocked(callback.asBinder());
+        mVirtualDisplayAdapter.releaseVirtualDisplayLocked(callback.asBinder(), callingUid);
         mDisplayDeviceRepo.onDisplayDeviceEvent(device,
                 DisplayAdapter.DISPLAY_DEVICE_EVENT_REMOVED);
         return -1;
@@ -1964,14 +2094,14 @@
         }
     }
 
-    private void releaseVirtualDisplayInternal(IBinder appToken) {
+    private void releaseVirtualDisplayInternal(IBinder appToken, int callingUid) {
         synchronized (mSyncRoot) {
             if (mVirtualDisplayAdapter == null) {
                 return;
             }
 
             DisplayDevice device =
-                    mVirtualDisplayAdapter.releaseVirtualDisplayLocked(appToken);
+                    mVirtualDisplayAdapter.releaseVirtualDisplayLocked(appToken, callingUid);
             Slog.d(TAG, "Virtual Display: Display Device released");
             if (device != null) {
                 // TODO: multi-display - handle virtual displays the same as other display adapters.
@@ -1981,16 +2111,6 @@
         }
     }
 
-    private void setVirtualDisplayStateInternal(IBinder appToken, boolean isOn) {
-        synchronized (mSyncRoot) {
-            if (mVirtualDisplayAdapter == null) {
-                return;
-            }
-
-            mVirtualDisplayAdapter.setVirtualDisplayStateLocked(appToken, isOn);
-        }
-    }
-
     private void setVirtualDisplayRotationInternal(IBinder appToken,
             @Surface.Rotation int rotation) {
         int displayId;
@@ -2153,6 +2273,17 @@
         updateLogicalDisplayState(display);
     }
 
+    private boolean isExtendedDisplayEnabled() {
+        try {
+            return 0 != Settings.Global.getInt(
+                    mContext.getContentResolver(),
+                    DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, 0);
+        } catch (Throwable e) {
+            // Some services might not be initialised yet to be able to call getInt
+            return false;
+        }
+    }
+
     @SuppressLint("AndroidFrameworkRequiresPermission")
     private void handleLogicalDisplayAddedLocked(LogicalDisplay display) {
         final int displayId = display.getDisplayIdLocked();
@@ -2171,6 +2302,9 @@
         updateLogicalDisplayState(display);
 
         mExternalDisplayPolicy.handleLogicalDisplayAddedLocked(display);
+        if (mDisplayTopologyCoordinator != null) {
+            mDisplayTopologyCoordinator.onDisplayAdded(display.getDisplayInfoLocked());
+        }
     }
 
     private void handleLogicalDisplayChangedLocked(@NonNull LogicalDisplay display) {
@@ -2258,6 +2392,9 @@
         } else {
             releaseDisplayAndEmitEvent(display, DisplayManagerGlobal.EVENT_DISPLAY_REMOVED);
         }
+        if (mDisplayTopologyCoordinator != null) {
+            mDisplayTopologyCoordinator.onDisplayRemoved(display.getDisplayIdLocked());
+        }
 
         Slog.i(TAG, "Logical display removed: " + display.getDisplayIdLocked());
     }
@@ -3296,12 +3433,16 @@
         // After releasing the lock, send the notifications out.
         for (int i = 0; i < mTempCallbacks.size(); i++) {
             CallbackRecord callbackRecord = mTempCallbacks.get(i);
-            deliverEventInternal(callbackRecord, displayId, event);
+            if (deferDisplayEventsWhenFrozen()) {
+                deliverEventFlagged(callbackRecord, displayId, event);
+            } else {
+                deliverEventUnflagged(callbackRecord, displayId, event);
+            }
         }
         mTempCallbacks.clear();
     }
 
-    private void deliverEventInternal(CallbackRecord callbackRecord, int displayId, int event) {
+    private void deliverEventUnflagged(CallbackRecord callbackRecord, int displayId, int event) {
         final int uid = callbackRecord.mUid;
         final int pid = callbackRecord.mPid;
         if (isUidCached(uid)) {
@@ -3330,6 +3471,10 @@
         }
     }
 
+    private void deliverEventFlagged(CallbackRecord callbackRecord, int displayId, int event) {
+        callbackRecord.notifyDisplayEventAsync(displayId, event);
+    }
+
     private boolean extraLogging(String packageName) {
         return mExtraDisplayEventLogging && mExtraDisplayLoggingPackageName.equals(packageName);
     }
@@ -3377,10 +3522,18 @@
     private void dumpInternal(PrintWriter pw) {
         pw.println("DISPLAY MANAGER (dumpsys display)");
         BrightnessTracker brightnessTrackerLocal;
+        SparseArray<DisplayPowerController> displayPowerControllersLocal = new SparseArray<>();
+        int displayPowerControllerCount;
 
         synchronized (mSyncRoot) {
             brightnessTrackerLocal = mBrightnessTracker;
 
+            displayPowerControllerCount = mDisplayPowerControllers.size();
+            for (int i = 0; i < displayPowerControllerCount; i++) {
+                displayPowerControllersLocal.put(
+                        mDisplayPowerControllers.keyAt(i), mDisplayPowerControllers.valueAt(i));
+            }
+
             pw.println("  mSafeMode=" + mSafeMode);
             pw.println("  mPendingTraversal=" + mPendingTraversal);
             pw.println("  mViewports=" + mViewports);
@@ -3446,16 +3599,7 @@
             pw.println("Callbacks: size=" + callbackCount);
             pw.println("-----------------");
             for (int i = 0; i < callbackCount; i++) {
-                CallbackRecord callback = mCallbacks.valueAt(i);
-                pw.println("  " + i + ": mPid=" + callback.mPid
-                        + ", mWifiDisplayScanRequested=" + callback.mWifiDisplayScanRequested);
-            }
-
-            final int displayPowerControllerCount = mDisplayPowerControllers.size();
-            pw.println();
-            pw.println("Display Power Controllers: size=" + displayPowerControllerCount);
-            for (int i = 0; i < displayPowerControllerCount; i++) {
-                mDisplayPowerControllers.valueAt(i).dump(pw);
+                pw.println("  " + i + ": " + mCallbacks.valueAt(i).dump());
             }
 
             pw.println();
@@ -3470,6 +3614,12 @@
                 mDisplayWindowPolicyControllers.valueAt(i).second.dump("  ", pw);
             }
         }
+        pw.println();
+        pw.println("Display Power Controllers: size=" + displayPowerControllerCount);
+        for (int i = 0; i < displayPowerControllerCount; i++) {
+            displayPowerControllersLocal.valueAt(i).dump(pw);
+        }
+
         if (brightnessTrackerLocal != null) {
             pw.println();
             brightnessTrackerLocal.dump(pw);
@@ -3848,12 +3998,43 @@
 
         public boolean mWifiDisplayScanRequested;
 
+        // A single pending event.
+        private record Event(int displayId, @DisplayEvent int event) { };
+
+        // The list of pending events.  This is null until there is a pending event to be saved.
+        // This is only used if {@link deferDisplayEventsWhenFrozen()} is true.
+        @GuardedBy("mCallback")
+        private ArrayList<Event> mPendingEvents;
+
+        // Process states: a process is ready to receive events if it is neither cached nor
+        // frozen.
+        @GuardedBy("mCallback")
+        private boolean mCached;
+        @GuardedBy("mCallback")
+        private boolean mFrozen;
+
         CallbackRecord(int pid, int uid, @NonNull IDisplayManagerCallback callback,
                 @EventsMask long eventsMask) {
             mPid = pid;
             mUid = uid;
             mCallback = callback;
             mEventsMask = new AtomicLong(eventsMask);
+            mCached = false;
+            mFrozen = false;
+
+            if (deferDisplayEventsWhenFrozen()) {
+                // Some CallbackRecords are registered very early in system boot, before
+                // mActivityManagerInternal is initialized. If mActivityManagerInternal is null,
+                // do not register the frozen process listener.  However, do verify that all such
+                // registrations are for the self pid (which can never be frozen, so the frozen
+                // process listener does not matter).
+                if (mActivityManagerInternal != null) {
+                    mActivityManagerInternal.addFrozenProcessListener(pid, mHandlerExecutor,
+                            mDisplayFrozenProcessListener);
+                } else if (Process.myPid() != pid) {
+                    Slog.e(TAG, "DisplayListener registered too early");
+                }
+            }
 
             String[] packageNames = mContext.getPackageManager().getPackagesForUid(uid);
             mPackageName = packageNames == null ? null : packageNames[0];
@@ -3863,6 +4044,46 @@
             mEventsMask.set(eventsMask);
         }
 
+        /**
+         * Return true if the process can accept events.
+         */
+        @GuardedBy("mCallback")
+        private boolean isReadyLocked() {
+            return !mCached && !mFrozen;
+        }
+
+        /**
+         * Return true if the process is now ready and has pending events to be delivered.
+         */
+        @GuardedBy("mCallback")
+        private boolean hasPendingAndIsReadyLocked() {
+            return isReadyLocked() && mPendingEvents != null && !mPendingEvents.isEmpty();
+        }
+
+        /**
+         * Set the frozen flag for this process.  Return true if the process is now ready to
+         * receive events and there are pending events to be delivered.
+         * This is only used if {@link deferDisplayEventsWhenFrozen()} is true.
+         */
+        public boolean setFrozen(boolean frozen) {
+            synchronized (mCallback) {
+                mFrozen = frozen;
+                return hasPendingAndIsReadyLocked();
+            }
+        }
+
+        /**
+         * Set the cached flag for this process.  Return true if the process is now ready to
+         * receive events and there are pending events to be delivered.
+         * This is only used if {@link deferDisplayEventsWhenFrozen()} is true.
+         */
+        public boolean setCached(boolean cached) {
+            synchronized (mCallback) {
+                mCached = cached;
+                return hasPendingAndIsReadyLocked();
+            }
+        }
+
         @Override
         public void binderDied() {
             if (DEBUG || extraLogging(mPackageName)) {
@@ -3878,7 +4099,7 @@
         /**
          * @return {@code false} if RemoteException happens; otherwise {@code true} for
          * success.  This returns true even if the event was deferred because the remote client is
-         * cached.
+         * cached or frozen.
          */
         public boolean notifyDisplayEventAsync(int displayId, @DisplayEvent int event) {
             if (!shouldSendEvent(event)) {
@@ -3895,6 +4116,22 @@
                 return true;
             }
 
+            if (deferDisplayEventsWhenFrozen()) {
+                synchronized (mCallback) {
+                    // Add the new event to the pending list if the client frozen or cached (not
+                    // ready) or if there are existing pending events.  The latter condition
+                    // occurs as the client is transitioning to ready but pending events have not
+                    // been dispatched.  The new event must be added to the pending list to
+                    // preserve event ordering.
+                    if (!isReadyLocked() || (mPendingEvents != null && !mPendingEvents.isEmpty())) {
+                        // The client is interested in the event but is not ready to receive it.
+                        // Put the event on the pending list.
+                        addDisplayEvent(displayId, event);
+                        return true;
+                    }
+                }
+            }
+
             return transmitDisplayEvent(displayId, event);
         }
 
@@ -3941,8 +4178,81 @@
                     return true;
             }
         }
+
+        // Add a single event to the pending list, possibly combining or collapsing events in the
+        // list.
+        // This is only used if {@link deferDisplayEventsWhenFrozen()} is true.
+        @GuardedBy("mCallback")
+        private void addDisplayEvent(int displayId, int event) {
+            if (mPendingEvents == null) {
+                mPendingEvents = new ArrayList<>();
+            }
+            if (!mPendingEvents.isEmpty()) {
+                // Ignore redundant events. Further optimization is possible by merging adjacent
+                // events.
+                Event last = mPendingEvents.get(mPendingEvents.size() - 1);
+                if (last.displayId == displayId && last.event == event) {
+                    if (DEBUG) {
+                        Slog.d(TAG, "Ignore redundant display event " + displayId + "/" + event
+                                + " to " + mUid + "/" + mPid);
+                    }
+                    return;
+                }
+            }
+            mPendingEvents.add(new Event(displayId, event));
+        }
+
+        // Send all pending events.  This can safely be called if the process is not ready, but it
+        // would be unusual to do so.  The method returns true on success.
+        // This is only used if {@link deferDisplayEventsWhenFrozen()} is true.
+        public boolean dispatchPending() {
+            synchronized (mCallback) {
+                if (mPendingEvents == null || mPendingEvents.isEmpty()) {
+                    return true;
+                }
+                if (!isReadyLocked()) {
+                    return false;
+                }
+                for (int i = 0; i < mPendingEvents.size(); i++) {
+                    Event displayEvent = mPendingEvents.get(i);
+                    if (DEBUG) {
+                        Slog.d(TAG, "Send pending display event #" + i + " "
+                                + displayEvent.displayId + "/"
+                                + displayEvent.event + " to " + mUid + "/" + mPid);
+                    }
+                    if (!transmitDisplayEvent(displayEvent.displayId, displayEvent.event)) {
+                        Slog.d(TAG, "Drop pending events for dead process " + mPid);
+                        break;
+                    }
+                }
+                mPendingEvents.clear();
+                return true;
+            }
+        }
+
+        // Return a string suitable for dumpsys.
+        private String dump() {
+            if (deferDisplayEventsWhenFrozen()) {
+                final String fmt =
+                        "mPid=%d mUid=%d mWifiDisplayScanRequested=%s"
+                        + " cached=%s frozen=%s pending=%d";
+                synchronized (mCallback) {
+                    return formatSimple(fmt,
+                            mPid, mUid, mWifiDisplayScanRequested, mCached, mFrozen,
+                            (mPendingEvents == null) ? 0 : mPendingEvents.size());
+                }
+            } else {
+                final String fmt =
+                        "mPid=%d mUid=%d mWifiDisplayScanRequested=%s";
+                return formatSimple(fmt,
+                        mPid, mUid, mWifiDisplayScanRequested);
+            }
+        }
     }
 
+    /**
+     * This is only used if {@link deferDisplayEventsWhenFrozen()} is false.
+     */
     private static final class PendingCallback {
         private final CallbackRecord mCallbackRecord;
         private final ArrayList<Pair<Integer, Integer>> mDisplayEvents;
@@ -4310,19 +4620,10 @@
 
         @Override // Binder call
         public void releaseVirtualDisplay(IVirtualDisplayCallback callback) {
+            final int callingUid = Binder.getCallingUid();
             final long token = Binder.clearCallingIdentity();
             try {
-                releaseVirtualDisplayInternal(callback.asBinder());
-            } finally {
-                Binder.restoreCallingIdentity(token);
-            }
-        }
-
-        @Override // Binder call
-        public void setVirtualDisplayState(IVirtualDisplayCallback callback, boolean isOn) {
-            final long token = Binder.clearCallingIdentity();
-            try {
-                setVirtualDisplayStateInternal(callback.asBinder(), isOn);
+                releaseVirtualDisplayInternal(callback.asBinder(), callingUid);
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -4939,10 +5240,9 @@
         }
 
         @Override
-        public boolean isProximitySensorAvailable() {
+        public boolean isProximitySensorAvailable(int displayId) {
             synchronized (mSyncRoot) {
-                return mDisplayPowerControllers.get(Display.DEFAULT_DISPLAY)
-                        .isProximitySensorAvailable();
+                return mDisplayPowerControllers.get(displayId).isProximitySensorAvailable();
             }
         }
 
@@ -5293,6 +5593,31 @@
         }
 
         @Override
+        public int[] getDisplayIdsForGroup(int groupId) {
+            synchronized (mSyncRoot) {
+                return mLogicalDisplayMapper.getDisplayIdsForGroupLocked(groupId);
+            }
+        }
+
+        @Override
+        public SparseArray<int[]> getDisplayIdsByGroupsIds() {
+            synchronized (mSyncRoot) {
+                return mLogicalDisplayMapper.getDisplayIdsByGroupIdLocked();
+            }
+        }
+
+        @Override
+        public IntArray getDisplayIds() {
+            IntArray displayIds = new IntArray();
+            synchronized (mSyncRoot) {
+                mLogicalDisplayMapper.forEachLocked((logicalDisplay -> {
+                    displayIds.add(logicalDisplay.getDisplayIdLocked());
+                }), /* includeDisabled= */ false);
+            }
+            return displayIds;
+        }
+
+        @Override
         public DisplayManagerInternal.DisplayOffloadSession registerDisplayOffloader(
                 int displayId, @NonNull DisplayManagerInternal.DisplayOffloader displayOffloader) {
             if (!mFlags.isDisplayOffloadEnabled()) {
@@ -5327,6 +5652,21 @@
         public void onPresentation(int displayId, boolean isShown) {
             mExternalDisplayPolicy.onPresentation(displayId, isShown);
         }
+
+        @Override
+        public void stylusGestureStarted(long eventTime) {
+            if (mFlags.isBlockAutobrightnessChangesOnStylusUsage()) {
+                DisplayPowerController displayPowerController;
+                synchronized (mSyncRoot) {
+                    displayPowerController = mDisplayPowerControllers.get(
+                            Display.DEFAULT_DISPLAY);
+                }
+                // We assume that the stylus is being used on the default display. This should
+                // be changed to the displayId on which it is being used once we start getting this
+                // information from the input manager service
+                displayPowerController.stylusGestureStarted(eventTime);
+            }
+        }
     }
 
     class DesiredDisplayModeSpecsObserver
@@ -5486,4 +5826,11 @@
             return mExternalDisplayStatsService;
         }
     }
+
+    /**
+     * Return the value of the pause
+     */
+    private static boolean deferDisplayEventsWhenFrozen() {
+        return com.android.server.am.Flags.deferDisplayEventsWhenFrozen();
+    }
 }
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 711bc79..42a62f0 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -22,6 +22,7 @@
 import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT;
 import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DOZE;
 import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE;
+import static com.android.server.display.brightness.BrightnessEvent.FLAG_EVEN_DIMMER;
 import static com.android.server.display.config.DisplayBrightnessMappingConfig.autoBrightnessPresetToString;
 
 import android.animation.Animator;
@@ -166,12 +167,11 @@
     private static final int MSG_SET_DWBC_LOGGING_ENABLED = 16;
     private static final int MSG_SET_BRIGHTNESS_FROM_OFFLOAD = 17;
     private static final int MSG_OFFLOADING_SCREEN_ON_UNBLOCKED = 18;
-
-
+    private static final int MSG_SET_STYLUS_BEING_USED = 19;
+    private static final int MSG_SET_STYLUS_USE_ENDED = 20;
 
     private static final int BRIGHTNESS_CHANGE_STATSD_REPORT_INTERVAL_MS = 500;
 
-
     // State machine constants for tracking initial brightness ramp skipping when enabled.
     private static final int RAMP_STATE_SKIP_NONE = 0;
     private static final int RAMP_STATE_SKIP_INITIAL = 1;
@@ -190,6 +190,10 @@
         0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80,
         90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1200,
         1400, 1600, 1800, 2000, 2250, 2500, 2750, 3000};
+
+    private static final int STYLUS_USAGE_DEBOUNCE_TIME  = 1000;
+    private static final int NANO_SECONDS_TO_MILLI_SECONDS_RATIO  = 1_000_000;
+
     private static final int[] BRIGHTNESS_RANGE_INDEX = {
         FrameworkStatsLog.DISPLAY_BRIGHTNESS_CHANGED__BUCKET_INDEX__RANGE_UNKNOWN,
         FrameworkStatsLog.DISPLAY_BRIGHTNESS_CHANGED__BUCKET_INDEX__RANGE_0_1,
@@ -497,6 +501,11 @@
     @GuardedBy("mLock")
     private int mPendingOverrideDozeScreenStateLocked;
 
+    private long mLastStylusUsageEventTime = -1;
+
+    // The time of inactivity after which the stylus can be assumed to be no longer in use.
+    private long mIdleStylusTimeoutMillisConfig = 0;
+
     /**
      * Creates the display power controller.
      */
@@ -517,6 +526,7 @@
         mSensorManager = sensorManager;
         mHandler = new DisplayControllerHandler(handler.getLooper());
         mDisplayDeviceConfig = mDisplayDevice.getDisplayDeviceConfig();
+        mIdleStylusTimeoutMillisConfig = mDisplayDeviceConfig.getIdleStylusTimeoutMillis();
         mIsEnabled = logicalDisplay.isEnabledLocked();
         mIsInTransition = logicalDisplay.isInTransitionLocked();
         mIsDisplayInternal = displayDeviceInfo.type == Display.TYPE_INTERNAL;
@@ -536,7 +546,8 @@
         mLastBrightnessEvent = new BrightnessEvent(mDisplayId);
         mTempBrightnessEvent = new BrightnessEvent(mDisplayId);
 
-        if (flags.isBatteryStatsEnabledForAllDisplays()) {
+        if (flags.isBatteryStatsEnabledForAllDisplays()
+                && isDisplaySupportedForBatteryStats(displayDeviceInfo)) {
             mBatteryStats = BatteryStatsService.getService();
         } else if (mDisplayId == Display.DEFAULT_DISPLAY) {
             mBatteryStats = BatteryStatsService.getService();
@@ -892,6 +903,7 @@
                 mPhysicalDisplayName = displayName;
                 mDisplayStatsId = mUniqueDisplayId.hashCode();
                 mDisplayDeviceConfig = config;
+                mIdleStylusTimeoutMillisConfig = mDisplayDeviceConfig.getIdleStylusTimeoutMillis();
                 mThermalBrightnessThrottlingDataId = thermalBrightnessThrottlingDataId;
                 loadFromDisplayDeviceConfig(token, info, hbmMetadata);
                 mDisplayPowerProximityStateController.notifyDisplayDeviceChanged(config);
@@ -1479,29 +1491,24 @@
             brightnessState = clampScreenBrightness(brightnessState);
         }
 
-        if (useDozeBrightness) {
-            // TODO(b/329676661): Introduce a config property to choose between this brightness
-            //  strategy and DOZE_DEFAULT
-            // On some devices, when auto-brightness is disabled and the device is dozing, we use
-            // the current brightness setting scaled by the doze scale factor
-            if ((Float.isNaN(brightnessState)
-                    || displayBrightnessState.getDisplayBrightnessStrategyName()
-                    .equals(DisplayBrightnessStrategyConstants.FALLBACK_BRIGHTNESS_STRATEGY_NAME))
-                    && mFlags.isDisplayOffloadEnabled()
-                    && mDisplayOffloadSession != null
+        if (useDozeBrightness && (Float.isNaN(brightnessState)
+                || displayBrightnessState.getDisplayBrightnessStrategyName()
+                .equals(DisplayBrightnessStrategyConstants.FALLBACK_BRIGHTNESS_STRATEGY_NAME))) {
+            if (mFlags.isDisplayOffloadEnabled() && mDisplayOffloadSession != null
                     && (mAutomaticBrightnessController == null
                     || !mAutomaticBrightnessStrategy.shouldUseAutoBrightness())) {
+                // TODO(b/329676661): Introduce a config property to choose between this brightness
+                //  strategy and DOZE_DEFAULT
+                // On some devices, when auto-brightness is disabled and the device is dozing, we
+                // use the current brightness setting scaled by the doze scale factor
                 rawBrightnessState = getDozeBrightnessForOffload();
                 brightnessState = clampScreenBrightness(rawBrightnessState);
                 updateScreenBrightnessSetting = false;
                 mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_MANUAL);
                 mTempBrightnessEvent.setFlags(
                         mTempBrightnessEvent.getFlags() | BrightnessEvent.FLAG_DOZE_SCALE);
-            }
-
-            // Use default brightness when dozing unless overridden.
-            if (Float.isNaN(brightnessState)
-                    && !mDisplayBrightnessController.isAllowAutoBrightnessWhileDozingConfig()) {
+            } else if (!mDisplayBrightnessController.isAllowAutoBrightnessWhileDozingConfig()) {
+                // Use default brightness when dozing unless overridden.
                 rawBrightnessState = mScreenBrightnessDozeConfig;
                 brightnessState = clampScreenBrightness(rawBrightnessState);
                 mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_DEFAULT);
@@ -1755,6 +1762,8 @@
         final float brightnessOnAvailableScale = MathUtils.constrainedMap(0.0f, 1.0f,
                 clampedState.getMinBrightness(), clampedMax,
                 brightnessState);
+        final boolean evenDimmerModeOn =
+                mCdsi != null && mCdsi.getReduceBrightColorsActivatedForEvenDimmer();
         mTempBrightnessEvent.setPercent(Math.round(
                 1000.0f * com.android.internal.display.BrightnessUtils.convertLinearToGamma(
                         brightnessOnAvailableScale) / 10)); // rounded to one dp
@@ -1769,7 +1778,8 @@
         mTempBrightnessEvent.setHbmMode(mBrightnessRangeController.getHighBrightnessMode());
         mTempBrightnessEvent.setFlags(mTempBrightnessEvent.getFlags()
                 | (mIsRbcActive ? BrightnessEvent.FLAG_RBC : 0)
-                | (mPowerRequest.lowPowerMode ? BrightnessEvent.FLAG_LOW_POWER_MODE : 0));
+                | (mPowerRequest.lowPowerMode ? BrightnessEvent.FLAG_LOW_POWER_MODE : 0)
+                | (evenDimmerModeOn ? FLAG_EVEN_DIMMER : 0));
         mTempBrightnessEvent.setRbcStrength(mCdsi != null
                 ? mCdsi.getReduceBrightColorsStrength() : -1);
         mTempBrightnessEvent.setPowerFactor(mPowerRequest.screenLowPowerBrightnessFactor);
@@ -2763,6 +2773,16 @@
         }
     }
 
+    private static boolean isDisplaySupportedForBatteryStats(DisplayDeviceInfo displayDeviceInfo) {
+        switch (displayDeviceInfo.type) {
+            case Display.TYPE_INTERNAL:
+            case Display.TYPE_EXTERNAL:
+                return true;
+            default:
+                return false;
+        }
+    }
+
     private void dumpBrightnessEvents(PrintWriter pw) {
         int size = mBrightnessEventRingBuffer.size();
         if (size < 1) {
@@ -2972,6 +2992,18 @@
         return mDisplayId == Display.DEFAULT_DISPLAY || mBootCompleted;
     }
 
+    public void stylusGestureStarted(long eventTimeNanoSeconds) {
+        long eventTimeMs = eventTimeNanoSeconds / NANO_SECONDS_TO_MILLI_SECONDS_RATIO;
+        if (mLastStylusUsageEventTime == -1
+                || eventTimeMs > mLastStylusUsageEventTime + STYLUS_USAGE_DEBOUNCE_TIME) {
+            synchronized (mLock) {
+                // Add a message to notify the stylus usage has started
+                mHandler.sendEmptyMessageAtTime(MSG_SET_STYLUS_BEING_USED, mClock.uptimeMillis());
+            }
+            mLastStylusUsageEventTime = eventTimeMs;
+        }
+    }
+
     private final class DisplayControllerHandler extends Handler {
         DisplayControllerHandler(Looper looper) {
             super(looper, null, true /*async*/);
@@ -3088,6 +3120,20 @@
                         updatePowerState();
                     }
                     break;
+                case MSG_SET_STYLUS_BEING_USED:
+                    // Remove any MSG_SET_STYLUS_USE_ENDED message from the handler queue and
+                    // post a delayed MSG_SET_STYLUS_USE_ENDED message to delay the stylus
+                    // usage ended event processing
+                    mHandler.removeMessages(MSG_SET_STYLUS_USE_ENDED);
+                    Message message = mHandler.obtainMessage(MSG_SET_STYLUS_USE_ENDED);
+                    mHandler.sendMessageAtTime(message,
+                            mClock.uptimeMillis() + mIdleStylusTimeoutMillisConfig);
+                    mDisplayBrightnessController.setStylusBeingUsed(true);
+                    break;
+                case MSG_SET_STYLUS_USE_ENDED:
+                    mDisplayBrightnessController.setStylusBeingUsed(false);
+                    updatePowerState();
+                    break;
             }
         }
     }
diff --git a/services/core/java/com/android/server/display/DisplayTopology.java b/services/core/java/com/android/server/display/DisplayTopology.java
new file mode 100644
index 0000000..b01d617
--- /dev/null
+++ b/services/core/java/com/android/server/display/DisplayTopology.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) 2024 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.display;
+
+import android.annotation.Nullable;
+import android.util.IndentingPrintWriter;
+import android.util.Pair;
+import android.util.Slog;
+import android.view.Display;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+
+/**
+ * Represents the relative placement of extended displays.
+ */
+class DisplayTopology {
+    private static final String TAG = "DisplayTopology";
+
+    /**
+     * The topology tree
+     */
+    @Nullable
+    @VisibleForTesting
+    TreeNode mRoot;
+
+    /**
+     * The logical display ID of the primary display that will show certain UI elements.
+     * This is not necessarily the same as the default display.
+     */
+    @VisibleForTesting
+    int mPrimaryDisplayId = Display.INVALID_DISPLAY;
+
+    /**
+     * Add a display to the topology.
+     * If this is the second display in the topology, it will be placed above the first display.
+     * Subsequent displays will be places to the left or right of the second display.
+     * @param displayId The logical display ID
+     * @param width The width of the display
+     * @param height The height of the display
+     */
+    void addDisplay(int displayId, double width, double height) {
+        addDisplay(displayId, width, height, /* shouldLog= */ true);
+    }
+
+    /**
+     * Remove a display from the topology.
+     * The default topology is created from the remaining displays, as if they were reconnected
+     * one by one.
+     * @param displayId The logical display ID
+     */
+    void removeDisplay(int displayId) {
+        if (!isDisplayPresent(displayId, mRoot)) {
+            return;
+        }
+        Queue<TreeNode> queue = new LinkedList<>();
+        queue.add(mRoot);
+        mRoot = null;
+        while (!queue.isEmpty()) {
+            TreeNode node = queue.poll();
+            if (node.mDisplayId != displayId) {
+                addDisplay(node.mDisplayId, node.mWidth, node.mHeight, /* shouldLog= */ false);
+            }
+            queue.addAll(node.mChildren);
+        }
+        if (mPrimaryDisplayId == displayId) {
+            if (mRoot != null) {
+                mPrimaryDisplayId = mRoot.mDisplayId;
+            } else {
+                mPrimaryDisplayId = Display.INVALID_DISPLAY;
+            }
+            Slog.i(TAG,  "Primary display with ID " + displayId
+                    + " removed, new primary display: " + mPrimaryDisplayId);
+        } else {
+            Slog.i(TAG, "Display with ID " + displayId + " removed");
+        }
+    }
+
+    /**
+     * Print the object's state and debug information into the given stream.
+     * @param pw The stream to dump information to.
+     */
+    void dump(PrintWriter pw) {
+        pw.println("DisplayTopology:");
+        pw.println("--------------------");
+        IndentingPrintWriter ipw = new IndentingPrintWriter(pw);
+        ipw.increaseIndent();
+
+        ipw.println("mPrimaryDisplayId: " + mPrimaryDisplayId);
+
+        ipw.println("Topology tree:");
+        if (mRoot != null) {
+            ipw.increaseIndent();
+            mRoot.dump(ipw);
+            ipw.decreaseIndent();
+        }
+    }
+
+    private void addDisplay(int displayId, double width, double height, boolean shouldLog) {
+        if (mRoot == null) {
+            mRoot = new TreeNode(displayId, width, height, /* position= */ null, /* offset= */ 0);
+            mPrimaryDisplayId = displayId;
+            if (shouldLog) {
+                Slog.i(TAG, "First display added: " + mRoot);
+            }
+        } else if (mRoot.mChildren.isEmpty()) {
+            // This is the 2nd display. Align the middles of the top and bottom edges.
+            double offset = mRoot.mWidth / 2 - width / 2;
+            TreeNode display = new TreeNode(displayId, width, height,
+                    TreeNode.Position.POSITION_TOP, offset);
+            mRoot.mChildren.add(display);
+            if (shouldLog) {
+                Slog.i(TAG, "Second display added: " + display + ", parent ID: "
+                        + mRoot.mDisplayId);
+            }
+        } else {
+            TreeNode rightMostDisplay = findRightMostDisplay(mRoot, mRoot.mWidth).first;
+            TreeNode newDisplay = new TreeNode(displayId, width, height,
+                    TreeNode.Position.POSITION_RIGHT, /* offset= */ 0);
+            rightMostDisplay.mChildren.add(newDisplay);
+            if (shouldLog) {
+                Slog.i(TAG, "Display added: " + newDisplay + ", parent ID: "
+                        + rightMostDisplay.mDisplayId);
+            }
+        }
+    }
+
+    /**
+     * @param display The display from which the search should start.
+     * @param xPos The x position of the right edge of that display.
+     * @return The display that is the furthest to the right and the x position of the right edge
+     * of that display
+     */
+    private Pair<TreeNode, Double> findRightMostDisplay(TreeNode display, double xPos) {
+        Pair<TreeNode, Double> result = new Pair<>(display, xPos);
+        for (TreeNode child : display.mChildren) {
+            // The x position of the right edge of the child
+            double childXPos;
+            switch (child.mPosition) {
+                case POSITION_LEFT -> childXPos = xPos - display.mWidth;
+                case POSITION_TOP, POSITION_BOTTOM ->
+                        childXPos = xPos - display.mWidth + child.mOffset + child.mWidth;
+                case POSITION_RIGHT -> childXPos = xPos + child.mWidth;
+                default -> throw new IllegalStateException("Unexpected value: " + child.mPosition);
+            }
+
+            // Recursive call - find the rightmost display starting from the child
+            Pair<TreeNode, Double> childResult = findRightMostDisplay(child, childXPos);
+            // Check if the one found is further right
+            if (childResult.second > result.second) {
+                result = new Pair<>(childResult.first, childResult.second);
+            }
+        }
+        return result;
+    }
+
+    private boolean isDisplayPresent(int displayId, TreeNode node) {
+        if (node == null) {
+            return false;
+        }
+        if (node.mDisplayId == displayId) {
+            return true;
+        }
+        for (TreeNode child : node.mChildren) {
+            if (isDisplayPresent(displayId, child)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @VisibleForTesting
+    static class TreeNode {
+
+        /**
+         * The logical display ID
+         */
+        @VisibleForTesting
+        final int mDisplayId;
+
+        /**
+         * The width of the display in density-independent pixels (dp).
+         */
+        @VisibleForTesting
+        double mWidth;
+
+        /**
+         * The height of the display in density-independent pixels (dp).
+         */
+        @VisibleForTesting
+        double mHeight;
+
+        /**
+         * The position of this display relative to its parent.
+         */
+        @VisibleForTesting
+        Position mPosition;
+
+        /**
+         * The distance from the top edge of the parent display to the top edge of this display (in
+         * case of POSITION_LEFT or POSITION_RIGHT) or from the left edge of the parent display
+         * to the left edge of this display (in case of POSITION_TOP or POSITION_BOTTOM). The unit
+         * used is density-independent pixels (dp).
+         */
+        @VisibleForTesting
+        double mOffset;
+
+        @VisibleForTesting
+        final List<TreeNode> mChildren = new ArrayList<>();
+
+        TreeNode(int displayId, double width, double height, Position position,
+                double offset) {
+            mDisplayId = displayId;
+            mWidth = width;
+            mHeight = height;
+            mPosition = position;
+            mOffset = offset;
+        }
+
+        /**
+         * Print the object's state and debug information into the given stream.
+         * @param ipw The stream to dump information to.
+         */
+        void dump(IndentingPrintWriter ipw) {
+            ipw.println(this);
+            ipw.increaseIndent();
+            for (TreeNode child : mChildren) {
+                child.dump(ipw);
+            }
+            ipw.decreaseIndent();
+        }
+
+        @Override
+        public String toString() {
+            return "Display {id=" + mDisplayId + ", width=" + mWidth + ", height=" + mHeight
+                    + ", position=" + mPosition + ", offset=" + mOffset + "}";
+        }
+
+        @VisibleForTesting
+        enum Position {
+            POSITION_LEFT, POSITION_TOP, POSITION_RIGHT, POSITION_BOTTOM
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/display/DisplayTopologyCoordinator.java b/services/core/java/com/android/server/display/DisplayTopologyCoordinator.java
index 631f147..46358dfd 100644
--- a/services/core/java/com/android/server/display/DisplayTopologyCoordinator.java
+++ b/services/core/java/com/android/server/display/DisplayTopologyCoordinator.java
@@ -16,89 +16,101 @@
 
 package com.android.server.display;
 
-import android.annotation.Nullable;
-import android.util.IndentingPrintWriter;
+import android.util.DisplayMetrics;
+import android.view.Display;
+import android.view.DisplayInfo;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
 
 import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.function.BooleanSupplier;
 
 /**
- * This class manages the relative placement (topology) of extended displays. It is responsible for
- * updating and persisting the topology.
+ * Manages the relative placement (topology) of extended displays. Responsible for updating and
+ * persisting the topology.
  */
 class DisplayTopologyCoordinator {
 
-    /**
-     * The topology tree
-     */
-    @Nullable
-    private TopologyTreeNode mRoot;
+    @GuardedBy("mLock")
+    private final DisplayTopology mTopology;
 
     /**
-     * The logical display ID of the primary display that will show certain UI elements.
-     * This is not necessarily the same as the default display.
+     * Check if extended displays are enabled. If not, a topology is not needed.
      */
-    private int mPrimaryDisplayId;
+    private final BooleanSupplier mIsExtendedDisplayEnabled;
+
+    private final Object mLock = new Object();
+
+    DisplayTopologyCoordinator(BooleanSupplier isExtendedDisplayEnabled) {
+        this(new Injector(), isExtendedDisplayEnabled);
+    }
+
+    @VisibleForTesting
+    DisplayTopologyCoordinator(Injector injector, BooleanSupplier isExtendedDisplayEnabled) {
+        mTopology = injector.getTopology();
+        mIsExtendedDisplayEnabled = isExtendedDisplayEnabled;
+    }
+
+    /**
+     * Add a display to the topology.
+     * @param info The display info
+     */
+    void onDisplayAdded(DisplayInfo info) {
+        if (!isDisplayAllowedInTopology(info)) {
+            return;
+        }
+        synchronized (mLock) {
+            mTopology.addDisplay(info.displayId, getWidth(info), getHeight(info));
+        }
+    }
+
+    /**
+     * Remove a display from the topology.
+     * @param displayId The logical display ID
+     */
+    void onDisplayRemoved(int displayId) {
+        synchronized (mLock) {
+            mTopology.removeDisplay(displayId);
+        }
+    }
 
     /**
      * Print the object's state and debug information into the given stream.
      * @param pw The stream to dump information to.
      */
-    public void dump(PrintWriter pw) {
-        pw.println("DisplayTopologyCoordinator:");
-        pw.println("--------------------");
-        IndentingPrintWriter ipw = new IndentingPrintWriter(pw);
-        ipw.increaseIndent();
-
-        ipw.println("mPrimaryDisplayId: " + mPrimaryDisplayId);
-
-        ipw.println("Topology tree:");
-        if (mRoot != null) {
-            ipw.increaseIndent();
-            mRoot.dump(ipw);
-            ipw.decreaseIndent();
+    void dump(PrintWriter pw) {
+        synchronized (mLock) {
+            mTopology.dump(pw);
         }
     }
 
-    private static class TopologyTreeNode {
+    /**
+     * @param info The display info
+     * @return The width of the display in dp
+     */
+    private double getWidth(DisplayInfo info) {
+        return info.logicalWidth * (double) DisplayMetrics.DENSITY_DEFAULT
+                / info.logicalDensityDpi;
+    }
 
-        /**
-         * The logical display ID
-         */
-        private int mDisplayId;
+    /**
+     * @param info The display info
+     * @return The height of the display in dp
+     */
+    private double getHeight(DisplayInfo info) {
+        return info.logicalHeight * (double) DisplayMetrics.DENSITY_DEFAULT
+                / info.logicalDensityDpi;
+    }
 
-        private final List<TopologyTreeNode> mChildren = new ArrayList<>();
+    private boolean isDisplayAllowedInTopology(DisplayInfo info) {
+        return mIsExtendedDisplayEnabled.getAsBoolean()
+                && info.displayGroupId == Display.DEFAULT_DISPLAY_GROUP;
+    }
 
-        /**
-         * The position of this display relative to its parent.
-         */
-        private Position mPosition;
-
-        /**
-         * The distance from the top edge of the parent display to the top edge of this display (in
-         * case of POSITION_LEFT or POSITION_RIGHT) or from the left edge of the parent display
-         * to the left edge of this display (in case of POSITION_TOP or POSITION_BOTTOM). The unit
-         * used is density-independent pixels (dp).
-         */
-        private double mOffset;
-
-        /**
-         * Print the object's state and debug information into the given stream.
-         * @param ipw The stream to dump information to.
-         */
-        void dump(IndentingPrintWriter ipw) {
-            ipw.println("Display {id=" + mDisplayId + ", position=" + mPosition
-                    + ", offset=" + mOffset + "}");
-            ipw.increaseIndent();
-            for (TopologyTreeNode child : mChildren) {
-                child.dump(ipw);
-            }
-            ipw.decreaseIndent();
-        }
-
-        private enum Position {
-            POSITION_LEFT, POSITION_TOP, POSITION_RIGHT, POSITION_BOTTOM
+    static class Injector {
+        DisplayTopology getTopology() {
+            return new DisplayTopology();
         }
     }
 }
diff --git a/services/core/java/com/android/server/display/ExternalDisplayStatsService.java b/services/core/java/com/android/server/display/ExternalDisplayStatsService.java
index 608fb35..666bd26 100644
--- a/services/core/java/com/android/server/display/ExternalDisplayStatsService.java
+++ b/services/core/java/com/android/server/display/ExternalDisplayStatsService.java
@@ -19,7 +19,6 @@
 import static android.media.AudioDeviceInfo.TYPE_HDMI;
 import static android.media.AudioDeviceInfo.TYPE_HDMI_ARC;
 import static android.media.AudioDeviceInfo.TYPE_USB_DEVICE;
-import static android.provider.Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -32,7 +31,6 @@
 import android.media.AudioPlaybackConfiguration;
 import android.os.Handler;
 import android.os.PowerManager;
-import android.provider.Settings;
 import android.util.Slog;
 import android.util.SparseIntArray;
 import android.view.Display;
@@ -44,6 +42,7 @@
 import com.android.server.display.utils.DebugUtils;
 
 import java.util.List;
+import java.util.function.BooleanSupplier;
 
 
 /**
@@ -203,8 +202,9 @@
         }
     };
 
-    ExternalDisplayStatsService(Context context, Handler handler) {
-        this(new Injector(context, handler));
+    ExternalDisplayStatsService(Context context, Handler handler,
+            BooleanSupplier isExtendedDisplayEnabled) {
+        this(new Injector(context, handler, isExtendedDisplayEnabled));
     }
 
     @VisibleForTesting
@@ -599,25 +599,21 @@
         private final Context mContext;
         @NonNull
         private final Handler mHandler;
+        private final BooleanSupplier mIsExtendedDisplayEnabled;
         @Nullable
         private AudioManager mAudioManager;
         @Nullable
         private PowerManager mPowerManager;
 
-        Injector(@NonNull Context context, @NonNull Handler handler) {
+        Injector(@NonNull Context context, @NonNull Handler handler,
+                BooleanSupplier isExtendedDisplayEnabled) {
             mContext = context;
             mHandler = handler;
+            mIsExtendedDisplayEnabled = isExtendedDisplayEnabled;
         }
 
         boolean isExtendedDisplayEnabled() {
-            try {
-                return 0 != Settings.Global.getInt(
-                        mContext.getContentResolver(),
-                        DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, 0);
-            } catch (Throwable e) {
-                // Some services might not be initialised yet to be able to call getInt
-                return false;
-            }
+            return mIsExtendedDisplayEnabled.getAsBoolean();
         }
 
         void registerInteractivityReceiver(BroadcastReceiver interactivityReceiver,
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 0570b2a..5edea0a 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -37,9 +37,9 @@
 import android.os.Trace;
 import android.util.DisplayUtils;
 import android.util.LongSparseArray;
-import android.util.MathUtils;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.Spline;
 import android.view.Display;
 import android.view.DisplayAddress;
 import android.view.DisplayCutout;
@@ -81,10 +81,6 @@
     private static final String UNIQUE_ID_PREFIX = "local:";
 
     private static final String PROPERTY_EMULATOR_CIRCULAR = "ro.boot.emulator.circular";
-    // Min and max strengths for even dimmer feature.
-    private static final float EVEN_DIMMER_MIN_STRENGTH = 0.0f;
-    private static final float EVEN_DIMMER_MAX_STRENGTH = 90.0f;
-    private static final float BRIGHTNESS_MIN = 0.0f;
 
     private final LongSparseArray<LocalDisplayDevice> mDevices = new LongSparseArray<>();
 
@@ -99,7 +95,9 @@
     private Context mOverlayContext;
 
     private int mEvenDimmerStrength = -1;
+    private boolean mEvenDimmerEnabled = false;
     private ColorDisplayService.ColorDisplayServiceInternal mCdsi;
+    private Spline mNitsToEvenDimmerStrength;
 
     // Called with SyncRoot lock held.
     LocalDisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context,
@@ -279,7 +277,7 @@
             mIsFirstDisplay = isFirstDisplay;
             updateDisplayPropertiesLocked(staticDisplayInfo, dynamicInfo, modeSpecs);
             mSidekickInternal = LocalServices.getService(SidekickInternal.class);
-            mBacklightAdapter = new BacklightAdapter(displayToken, isFirstDisplay,
+            mBacklightAdapter = mInjector.getBacklightAdapter(displayToken, isFirstDisplay,
                     mSurfaceControlProxy);
             mActiveSfDisplayModeAtStartId = dynamicInfo.activeDisplayModeId;
         }
@@ -998,26 +996,36 @@
                     }
 
                     private void applyColorMatrixBasedDimming(float brightnessState) {
-                        int strength = (int) (MathUtils.constrainedMap(
-                                // to this range:
-                                EVEN_DIMMER_MAX_STRENGTH, EVEN_DIMMER_MIN_STRENGTH,
-                                // from this range:
-                                BRIGHTNESS_MIN, mDisplayDeviceConfig.getEvenDimmerTransitionPoint(),
-                                // map this (+ rounded up):
-                                brightnessState) + 0.5);
-
-                        if (mEvenDimmerStrength < 0 // uninitialised
-                                || MathUtils.abs(mEvenDimmerStrength - strength) > 1
-                                || strength <= 1) {
-                            mEvenDimmerStrength = strength;
-                        }
-                        boolean enabled = mEvenDimmerStrength > 0.0f;
-
                         if (mCdsi == null) {
                             mCdsi = LocalServices.getService(
                                     ColorDisplayService.ColorDisplayServiceInternal.class);
                         }
-                        if (mCdsi != null) {
+                        if (mCdsi == null) {
+                            return;
+                        }
+
+                        final float minHardwareNits = backlightToNits(brightnessToBacklight(
+                                mDisplayDeviceConfig.getEvenDimmerTransitionPoint()));
+                        final float requestedNits =
+                                backlightToNits(brightnessToBacklight(brightnessState));
+                        mNitsToEvenDimmerStrength =
+                                mCdsi.fetchEvenDimmerSpline(minHardwareNits);
+
+                        if (mNitsToEvenDimmerStrength == null) {
+                            return;
+                        }
+
+                        // Find required dimming strength, rounded up.
+                        int strength = Math.round(mNitsToEvenDimmerStrength
+                                .interpolate(requestedNits));
+                        boolean enabled = strength > 0.0f;
+                        if (mEvenDimmerEnabled != enabled) {
+                            Slog.i(TAG, "Setting Extra Dim; strength: " + strength
+                                    + ", " + (enabled ? "enabled" : "disabled"));
+                        }
+                        if (mEvenDimmerStrength != strength || mEvenDimmerEnabled != enabled) {
+                            mEvenDimmerEnabled = enabled;
+                            mEvenDimmerStrength = strength;
                             mCdsi.applyEvenDimmerColorChanges(enabled, strength);
                         }
                     }
@@ -1290,6 +1298,9 @@
             pw.println("DisplayDeviceConfig: ");
             pw.println("---------------------");
             pw.println(mDisplayDeviceConfig);
+            pw.println("mEvenDimmerEnabled=" + mEvenDimmerEnabled);
+            pw.println("mEvenDimmerStrength=" + mEvenDimmerStrength);
+            pw.println("mNitsToEvenDimmerStrength=" + mNitsToEvenDimmerStrength);
         }
 
         private int findSfDisplayModeIdLocked(int displayModeId, int modeGroup) {
@@ -1461,6 +1472,12 @@
                 long physicalDisplayId, boolean isFirstDisplay, DisplayManagerFlags flags) {
             return DisplayDeviceConfig.create(context, physicalDisplayId, isFirstDisplay, flags);
         }
+
+        public BacklightAdapter getBacklightAdapter(IBinder displayToken, boolean isFirstDisplay,
+                SurfaceControlProxy surfaceControlProxy) {
+            return new BacklightAdapter(displayToken, isFirstDisplay, surfaceControlProxy);
+
+        }
     }
 
     public interface DisplayEventListener {
diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
index c3f6a52..06a9103 100644
--- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java
+++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
@@ -344,6 +344,23 @@
         return displayIds;
     }
 
+    public int[] getDisplayIdsForGroupLocked(int groupId) {
+        DisplayGroup displayGroup = mDisplayGroups.get(groupId);
+        if (displayGroup == null) {
+            return new int[]{};
+        }
+        return displayGroup.getIdsLocked();
+    }
+
+    public SparseArray<int[]> getDisplayIdsByGroupIdLocked() {
+        SparseArray<int[]> displayIdsByGroupIds = new SparseArray<>();
+        for (int i = 0; i < mDisplayGroups.size(); i++) {
+            final int displayGroupId = mDisplayGroups.keyAt(i);
+            displayIdsByGroupIds.put(displayGroupId, getDisplayIdsForGroupLocked(displayGroupId));
+        }
+        return displayIdsByGroupIds;
+    }
+
     public void forEachLocked(Consumer<LogicalDisplay> consumer) {
         forEachLocked(consumer, /* includeDisabled= */ true);
     }
diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
index 9b02f4b..4211453 100644
--- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
@@ -55,12 +55,14 @@
 import android.os.SystemProperties;
 import android.util.ArrayMap;
 import android.util.Slog;
+import android.util.SparseIntArray;
 import android.view.Display;
 import android.view.DisplayCutout;
 import android.view.DisplayShape;
 import android.view.Surface;
 import android.view.SurfaceControl;
 
+import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.display.feature.DisplayManagerFlags;
 
@@ -85,6 +87,11 @@
     private static final AtomicInteger sNextUniqueIndex = new AtomicInteger(0);
 
     private final ArrayMap<IBinder, VirtualDisplayDevice> mVirtualDisplayDevices = new ArrayMap<>();
+
+    private final int mMaxDevices;
+    private final int mMaxDevicesPerPackage;
+    private final SparseIntArray mNoOfDevicesPerPackage = new SparseIntArray();
+
     private final Handler mHandler;
     private final SurfaceControlDisplayFactory mSurfaceControlDisplayFactory;
 
@@ -114,8 +121,31 @@
         super(syncRoot, context, handler, listener, TAG, featureFlags);
         mHandler = handler;
         mSurfaceControlDisplayFactory = surfaceControlDisplayFactory;
+
+        mMaxDevices = context.getResources().getInteger(R.integer.config_virtualDisplayLimit);
+        if (mMaxDevices < 1) {
+            throw new IllegalArgumentException("The limit of virtual displays must be >= 1");
+        }
+        mMaxDevicesPerPackage =
+                context.getResources().getInteger(R.integer.config_virtualDisplayLimitPerPackage);
+        if (mMaxDevicesPerPackage < 1) {
+            throw new IllegalArgumentException(
+                    "The limit of virtual displays per package must be >= 1");
+        }
     }
 
+    /**
+     * Create a virtual display
+     * @param callback The callback
+     * @param projection The media projection
+     * @param ownerUid The UID of the package creating a display
+     * @param ownerPackageName The name of the package creating a display
+     * @param uniqueId The unique ID of the display device
+     * @param surface The surface
+     * @param flags The flags
+     * @param virtualDisplayConfig The config
+     * @return The display device created
+     */
     public DisplayDevice createVirtualDisplayLocked(IVirtualDisplayCallback callback,
             IMediaProjection projection, int ownerUid, String ownerPackageName, String uniqueId,
             Surface surface, int flags, VirtualDisplayConfig virtualDisplayConfig) {
@@ -126,6 +156,22 @@
             return null;
         }
 
+        if (getFeatureFlags().isVirtualDisplayLimitEnabled()
+                && mVirtualDisplayDevices.size() >= mMaxDevices) {
+            Slog.w(TAG, "Rejecting request to create private virtual display because "
+                    + mMaxDevices + " devices already exist.");
+            return null;
+        }
+
+        int noOfDevices = mNoOfDevicesPerPackage.get(ownerUid, /* valueIfKeyNotFound= */ 0);
+        if (getFeatureFlags().isVirtualDisplayLimitEnabled()
+                && noOfDevices >= mMaxDevicesPerPackage) {
+            Slog.w(TAG, "Rejecting request to create private virtual display because "
+                    + mMaxDevicesPerPackage + " devices already exist for package "
+                    + ownerPackageName + ".");
+            return null;
+        }
+
         String name = virtualDisplayConfig.getName();
         boolean secure = (flags & VIRTUAL_DISPLAY_FLAG_SECURE) != 0;
 
@@ -140,6 +186,9 @@
                 projection, mediaProjectionCallback, uniqueId, virtualDisplayConfig);
 
         mVirtualDisplayDevices.put(appToken, device);
+        if (getFeatureFlags().isVirtualDisplayLimitEnabled()) {
+            mNoOfDevicesPerPackage.put(ownerUid, noOfDevices + 1);
+        }
 
         try {
             if (projection != null) {
@@ -150,7 +199,7 @@
             appToken.linkToDeath(device, 0);
         } catch (RemoteException ex) {
             Slog.e(TAG, "Virtual Display: error while setting up VirtualDisplayDevice", ex);
-            mVirtualDisplayDevices.remove(appToken);
+            removeVirtualDisplayDeviceLocked(appToken, ownerUid);
             device.destroyLocked(false);
             return null;
         }
@@ -194,8 +243,15 @@
         }
     }
 
-    public DisplayDevice releaseVirtualDisplayLocked(IBinder appToken) {
-        VirtualDisplayDevice device = mVirtualDisplayDevices.remove(appToken);
+    /**
+     * Release a virtual display that was previously created
+     * @param appToken The token to identify the display
+     * @param ownerUid The UID of the package, used to keep track of and limit the number of
+     *                 displays created per package
+     * @return The display device that has been removed
+     */
+    public DisplayDevice releaseVirtualDisplayLocked(IBinder appToken, int ownerUid) {
+        VirtualDisplayDevice device = removeVirtualDisplayDeviceLocked(appToken, ownerUid);
         if (device != null) {
             Slog.v(TAG, "Release VirtualDisplay " + device.mName);
             device.destroyLocked(true);
@@ -207,13 +263,6 @@
         return device;
     }
 
-    void setVirtualDisplayStateLocked(IBinder appToken, boolean isOn) {
-        VirtualDisplayDevice device = mVirtualDisplayDevices.get(appToken);
-        if (device != null) {
-            device.setDisplayState(isOn);
-        }
-    }
-
     DisplayDevice getDisplayDevice(IBinder appToken) {
         return mVirtualDisplayDevices.get(appToken);
     }
@@ -235,10 +284,6 @@
                 : ("," + uid + "," + config.getName() + "," + sNextUniqueIndex.getAndIncrement()));
     }
 
-    private void handleBinderDiedLocked(IBinder appToken) {
-        mVirtualDisplayDevices.remove(appToken);
-    }
-
     private void handleMediaProjectionStoppedLocked(IBinder appToken) {
         VirtualDisplayDevice device = mVirtualDisplayDevices.get(appToken);
         if (device != null) {
@@ -248,6 +293,18 @@
         }
     }
 
+    private VirtualDisplayDevice removeVirtualDisplayDeviceLocked(IBinder appToken, int ownerUid) {
+        int noOfDevices = mNoOfDevicesPerPackage.get(ownerUid, /* valueIfKeyNotFound= */ 0);
+        if (getFeatureFlags().isVirtualDisplayLimitEnabled()) {
+            if (noOfDevices <= 1) {
+                mNoOfDevicesPerPackage.delete(ownerUid);
+            } else {
+                mNoOfDevicesPerPackage.put(ownerUid, noOfDevices - 1);
+            }
+        }
+        return mVirtualDisplayDevices.remove(appToken);
+    }
+
     private final class VirtualDisplayDevice extends DisplayDevice implements DeathRecipient {
         private static final int PENDING_SURFACE_CHANGE = 0x01;
         private static final int PENDING_RESIZE = 0x02;
@@ -273,7 +330,6 @@
         private boolean mStopped;
         private int mPendingChanges;
         private Display.Mode mMode;
-        private boolean mIsDisplayOn;
         private int mDisplayIdToMirror;
         private boolean mIsWindowManagerMirroring;
         private DisplayCutout mDisplayCutout;
@@ -299,9 +355,8 @@
             mCallback = callback;
             mProjection = projection;
             mMediaProjectionCallback = mediaProjectionCallback;
-            mDisplayState = Display.STATE_UNKNOWN;
+            mDisplayState = Display.STATE_ON;
             mPendingChanges |= PENDING_SURFACE_CHANGE;
-            mIsDisplayOn = surface != null;
             mDisplayIdToMirror = virtualDisplayConfig.getDisplayIdToMirror();
             mIsWindowManagerMirroring = virtualDisplayConfig.isWindowManagerMirroringEnabled();
         }
@@ -309,7 +364,7 @@
         @Override
         public void binderDied() {
             synchronized (getSyncRoot()) {
-                handleBinderDiedLocked(mAppToken);
+                removeVirtualDisplayDeviceLocked(mAppToken, mOwnerUid);
                 Slog.i(TAG, "Virtual display device released because application token died: "
                     + mOwnerPackageName);
                 destroyLocked(false);
@@ -394,6 +449,8 @@
                 float sdrBrightnessState, DisplayOffloadSessionImpl displayOffloadSession) {
             if (state != mDisplayState) {
                 mDisplayState = state;
+                mInfo = null;
+                sendDisplayDeviceEventLocked(this, DISPLAY_DEVICE_EVENT_CHANGED);
                 if (state == Display.STATE_OFF) {
                     mCallback.dispatchDisplayPaused();
                 } else {
@@ -416,12 +473,13 @@
 
         public void setSurfaceLocked(Surface surface) {
             if (!mStopped && mSurface != surface) {
-                if ((mSurface != null) != (surface != null)) {
+                if (mDisplayState == Display.STATE_ON
+                        && ((mSurface == null) != (surface == null))) {
+                    mInfo = null;
                     sendDisplayDeviceEventLocked(this, DISPLAY_DEVICE_EVENT_CHANGED);
                 }
                 sendTraversalRequestLocked();
                 mSurface = surface;
-                mInfo = null;
                 mPendingChanges |= PENDING_SURFACE_CHANGE;
             }
         }
@@ -439,14 +497,6 @@
             }
         }
 
-        void setDisplayState(boolean isOn) {
-            if (mIsDisplayOn != isOn) {
-                mIsDisplayOn = isOn;
-                mInfo = null;
-                sendDisplayDeviceEventLocked(this, DISPLAY_DEVICE_EVENT_CHANGED);
-            }
-        }
-
         public void stopLocked() {
             Slog.d(TAG, "Virtual Display: stopping device " + mName);
             setSurfaceLocked(null);
@@ -567,7 +617,11 @@
                 mInfo.touch = ((mFlags & VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH) == 0) ?
                         DisplayDeviceInfo.TOUCH_NONE : DisplayDeviceInfo.TOUCH_VIRTUAL;
 
-                mInfo.state = mIsDisplayOn ? Display.STATE_ON : Display.STATE_OFF;
+                if (mSurface == null) {
+                    mInfo.state = Display.STATE_OFF;
+                } else {
+                    mInfo.state = mDisplayState;
+                }
 
                 mInfo.ownerUid = mOwnerUid;
                 mInfo.ownerPackageName = mOwnerPackageName;
diff --git a/services/core/java/com/android/server/display/brightness/BrightnessEvent.java b/services/core/java/com/android/server/display/brightness/BrightnessEvent.java
index ad57ebf..9e9b899 100644
--- a/services/core/java/com/android/server/display/brightness/BrightnessEvent.java
+++ b/services/core/java/com/android/server/display/brightness/BrightnessEvent.java
@@ -44,6 +44,7 @@
     public static final int FLAG_DOZE_SCALE = 0x4;
     public static final int FLAG_USER_SET = 0x8;
     public static final int FLAG_LOW_POWER_MODE = 0x20;
+    public static final int FLAG_EVEN_DIMMER = 0x40;
 
     private static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
 
@@ -492,6 +493,7 @@
                 + ((mFlags & FLAG_RBC) != 0 ? "rbc " : "")
                 + ((mFlags & FLAG_INVALID_LUX) != 0 ? "invalid_lux " : "")
                 + ((mFlags & FLAG_DOZE_SCALE) != 0 ? "doze_scale " : "")
-                + ((mFlags & FLAG_LOW_POWER_MODE) != 0 ? "low_power_mode " : "");
+                + ((mFlags & FLAG_LOW_POWER_MODE) != 0 ? "low_power_mode " : "")
+                + ((mFlags & FLAG_EVEN_DIMMER) != 0 ? "even_dimmer " : "");
     }
 }
diff --git a/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java b/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java
index 72a91d5..71fdaf3 100644
--- a/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java
+++ b/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java
@@ -501,6 +501,13 @@
         return true;
     }
 
+    /**
+     * Notifies if the stylus is currently being used or not.
+     */
+    public void setStylusBeingUsed(boolean isEnabled) {
+        // Todo(b/369977976) - Disable the auto-brightness strategy
+    }
+
     @VisibleForTesting
     static class Injector {
         DisplayBrightnessStrategySelector getDisplayBrightnessStrategySelector(Context context,
diff --git a/services/core/java/com/android/server/display/color/ColorDisplayService.java b/services/core/java/com/android/server/display/color/ColorDisplayService.java
index bd759f3..dc59e66 100644
--- a/services/core/java/com/android/server/display/color/ColorDisplayService.java
+++ b/services/core/java/com/android/server/display/color/ColorDisplayService.java
@@ -70,6 +70,7 @@
 import android.util.MathUtils;
 import android.util.Slog;
 import android.util.SparseIntArray;
+import android.util.Spline;
 import android.view.Display;
 import android.view.SurfaceControl;
 import android.view.accessibility.AccessibilityManager;
@@ -114,6 +115,8 @@
         Matrix.setIdentityM(MATRIX_IDENTITY, 0);
     }
 
+    private static final int EVEN_DIMMER_MAX_PERCENT_ALLOWED = 100;
+
     private static final int MSG_USER_CHANGED = 0;
     private static final int MSG_SET_UP = 1;
     private static final int MSG_APPLY_NIGHT_DISPLAY_IMMEDIATE = 2;
@@ -193,6 +196,9 @@
     private final boolean mVisibleBackgroundUsersEnabled;
     private final UserManagerService mUserManager;
 
+    private Spline mEvenDimmerSpline;
+    private boolean mEvenDimmerActivated;
+
     public ColorDisplayService(Context context) {
         super(context);
         mHandler = new TintHandler(DisplayThread.get().getLooper());
@@ -1625,6 +1631,16 @@
         }
 
         /**
+         * Gets the adjusted nits, given a strength and nits.
+         * @param strength of reduce bright colors
+         * @param nits target nits
+         * @return the actual nits that would be output, given input nits and rbc strength.
+         */
+        public float getAdjustedNitsForStrength(float nits, int strength) {
+            return mReduceBrightColorsTintController.getAdjustedNitsForStrength(nits, strength);
+        }
+
+        /**
          * Sets the listener and returns whether reduce bright colors is currently enabled.
          */
         public boolean setReduceBrightColorsListener(ReduceBrightColorsListener listener) {
@@ -1644,6 +1660,14 @@
         }
 
         /**
+         *
+         * @return whether reduce bright colors is on, due to even dimmer being activated
+         */
+        public boolean getReduceBrightColorsActivatedForEvenDimmer() {
+            return mEvenDimmerActivated;
+        }
+
+        /**
          * Gets the computed brightness, in nits, when the reduce bright colors feature is applied
          * at the current strength.
          *
@@ -1667,10 +1691,42 @@
          * Applies tint changes for even dimmer feature.
          */
         public void applyEvenDimmerColorChanges(boolean enabled, int strength) {
+            mEvenDimmerActivated = enabled;
             mReduceBrightColorsTintController.setActivated(enabled);
             mReduceBrightColorsTintController.setMatrix(strength);
             mHandler.sendEmptyMessage(MSG_APPLY_REDUCE_BRIGHT_COLORS);
         }
+
+        /**
+         * Get spline to map between requested nits, and required even dimmer strength.
+         * @return nits to strength spline
+         */
+        public Spline fetchEvenDimmerSpline(float nits) {
+            if (mEvenDimmerSpline == null) {
+                mEvenDimmerSpline = createNitsToStrengthSpline(nits);
+            }
+            return mEvenDimmerSpline;
+        }
+
+        /**
+         * Creates a spline mapping requested nits values, for each resulting strength value
+         * (in percent) for even dimmer.
+         * Returns null if coefficients are not initialised.
+         * @return spline from nits to strength
+         */
+        private Spline createNitsToStrengthSpline(float nits) {
+            final float[] requestedNits = new float[EVEN_DIMMER_MAX_PERCENT_ALLOWED + 1];
+            final float[] resultingStrength = new float[EVEN_DIMMER_MAX_PERCENT_ALLOWED + 1];
+            for (int i = 0; i <= EVEN_DIMMER_MAX_PERCENT_ALLOWED; i++) {
+                resultingStrength[EVEN_DIMMER_MAX_PERCENT_ALLOWED - i] = i;
+                requestedNits[EVEN_DIMMER_MAX_PERCENT_ALLOWED - i] =
+                        getAdjustedNitsForStrength(nits, i);
+                if (requestedNits[EVEN_DIMMER_MAX_PERCENT_ALLOWED - i] == 0) {
+                    return null;
+                }
+            }
+            return new Spline.LinearSpline(requestedNits, resultingStrength);
+        }
     }
 
     /**
diff --git a/services/core/java/com/android/server/display/color/ReduceBrightColorsTintController.java b/services/core/java/com/android/server/display/color/ReduceBrightColorsTintController.java
index f529c4c..4f6fbd0 100644
--- a/services/core/java/com/android/server/display/color/ReduceBrightColorsTintController.java
+++ b/services/core/java/com/android/server/display/color/ReduceBrightColorsTintController.java
@@ -123,6 +123,14 @@
         return computeComponentValue(mStrength) * nits;
     }
 
+    /**
+     * Returns the effective brightness (in nits), which has been adjusted to account for the effect
+     * of the bright color reduction.
+     */
+    public float getAdjustedNitsForStrength(float nits, int strength) {
+        return computeComponentValue(strength) * nits;
+    }
+
     private float computeComponentValue(int strengthLevel) {
         final float percentageStrength = strengthLevel / 100f;
         final float squaredPercentageStrength = percentageStrength * percentageStrength;
diff --git a/services/core/java/com/android/server/display/config/EvenDimmerBrightnessData.java b/services/core/java/com/android/server/display/config/EvenDimmerBrightnessData.java
index 7e2e10a..9a590a2 100644
--- a/services/core/java/com/android/server/display/config/EvenDimmerBrightnessData.java
+++ b/services/core/java/com/android/server/display/config/EvenDimmerBrightnessData.java
@@ -34,72 +34,76 @@
     /**
      * Brightness value at which even dimmer methods are used.
      */
-    public final float mTransitionPoint;
+    public final float transitionPoint;
 
     /**
      * Nits array, maps to mBacklight
      */
-    public final float[] mNits;
+    public final float[] nits;
 
     /**
      * Backlight array, maps to mBrightness and mNits
      */
-    public final float[] mBacklight;
+    public final float[] backlight;
 
     /**
      * Brightness array, maps to mBacklight
      */
-    public final float[] mBrightness;
+    public final float[] brightness;
+
     /**
      * Spline, mapping between backlight and nits
      */
-    public final Spline mBacklightToNits;
+    public final Spline backlightToNits;
+
     /**
      * Spline, mapping between nits and backlight
      */
-    public final Spline mNitsToBacklight;
+    public final Spline nitsToBacklight;
+
     /**
      * Spline, mapping between brightness and backlight
      */
-    public final Spline mBrightnessToBacklight;
+    public final Spline brightnessToBacklight;
+
     /**
      * Spline, mapping between backlight and brightness
      */
-    public final Spline mBacklightToBrightness;
+    public final Spline backlightToBrightness;
 
     /**
      * Spline, mapping the minimum nits for each lux condition.
      */
-    public final Spline mMinLuxToNits;
+    public final Spline minLuxToNits;
 
     @VisibleForTesting
     public EvenDimmerBrightnessData(float transitionPoint, float[] nits,
             float[] backlight, float[] brightness, Spline backlightToNits,
             Spline nitsToBacklight, Spline brightnessToBacklight, Spline backlightToBrightness,
             Spline minLuxToNits) {
-        mTransitionPoint = transitionPoint;
-        mNits = nits;
-        mBacklight = backlight;
-        mBrightness = brightness;
-        mBacklightToNits = backlightToNits;
-        mNitsToBacklight = nitsToBacklight;
-        mBrightnessToBacklight = brightnessToBacklight;
-        mBacklightToBrightness = backlightToBrightness;
-        mMinLuxToNits = minLuxToNits;
+        this.transitionPoint = transitionPoint;
+        this.nits = nits;
+        this.backlight = backlight;
+        this.brightness = brightness;
+        this.backlightToNits = backlightToNits;
+        this.nitsToBacklight = nitsToBacklight;
+        this.brightnessToBacklight = brightnessToBacklight;
+        this.backlightToBrightness = backlightToBrightness;
+        this.minLuxToNits = minLuxToNits;
     }
 
     @Override
     public String toString() {
         return "EvenDimmerBrightnessData {"
-                + "mTransitionPoint: " + mTransitionPoint
-                + ", mNits: " + Arrays.toString(mNits)
-                + ", mBacklight: " + Arrays.toString(mBacklight)
-                + ", mBrightness: " + Arrays.toString(mBrightness)
-                + ", mBacklightToNits: " + mBacklightToNits
-                + ", mNitsToBacklight: " + mNitsToBacklight
-                + ", mBrightnessToBacklight: " + mBrightnessToBacklight
-                + ", mBacklightToBrightness: " + mBacklightToBrightness
-                + ", mMinLuxToNits: " + mMinLuxToNits
+                + "transitionPoint: " + transitionPoint
+                + ", nits: " + Arrays.toString(nits)
+                + ", backlight: " + Arrays.toString(backlight)
+                + ", brightness: " + Arrays.toString(brightness)
+                + ", backlightToNits: " + backlightToNits
+                + ", nitsToBacklight: " + nitsToBacklight
+                + ", brightnessToBacklight: " + brightnessToBacklight
+                + ", backlightToBrightness: " + backlightToBrightness
+                + ", minLuxToNits: " + minLuxToNits
                 + "} ";
     }
 
@@ -122,7 +126,6 @@
         if (map == null) {
             return null;
         }
-        String interpolation = map.getInterpolation();
 
         List<BrightnessPoint> brightnessPoints = map.getBrightnessPoint();
         if (brightnessPoints.isEmpty()) {
@@ -169,22 +172,11 @@
             ++i;
         }
 
-        // Explicitly choose linear interpolation.
-        if ("linear".equals(interpolation)) {
-            return new EvenDimmerBrightnessData(transitionPoint, nits, backlight, brightness,
-                    new Spline.LinearSpline(backlight, nits),
-                    new Spline.LinearSpline(nits, backlight),
-                    new Spline.LinearSpline(brightness, backlight),
-                    new Spline.LinearSpline(backlight, brightness),
-                    new Spline.LinearSpline(minLux, minNits)
-            );
-        }
-
         return new EvenDimmerBrightnessData(transitionPoint, nits, backlight, brightness,
-                Spline.createSpline(backlight, nits),
-                Spline.createSpline(nits, backlight),
-                Spline.createSpline(brightness, backlight),
-                Spline.createSpline(backlight, brightness),
+                new Spline.LinearSpline(backlight, nits),
+                new Spline.LinearSpline(nits, backlight),
+                new Spline.LinearSpline(brightness, backlight),
+                new Spline.LinearSpline(backlight, brightness),
                 Spline.createSpline(minLux, minNits)
         );
     }
diff --git a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
index df66893..eeec369 100644
--- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
+++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
@@ -199,10 +199,19 @@
             Flags.FLAG_IDLE_SCREEN_CONFIG_IN_SUBSCRIBING_LIGHT_SENSOR,
             Flags::idleScreenConfigInSubscribingLightSensor);
 
+    private final FlagState mVirtualDisplayLimit =
+            new FlagState(
+                    Flags.FLAG_VIRTUAL_DISPLAY_LIMIT,
+                    Flags::virtualDisplayLimit);
+
     private final FlagState mNormalBrightnessForDozeParameter = new FlagState(
             Flags.FLAG_NORMAL_BRIGHTNESS_FOR_DOZE_PARAMETER,
             Flags::normalBrightnessForDozeParameter
     );
+    private final FlagState mBlockAutobrightnessChangesOnStylusUsage = new FlagState(
+            Flags.FLAG_BLOCK_AUTOBRIGHTNESS_CHANGES_ON_STYLUS_USAGE,
+            Flags::blockAutobrightnessChangesOnStylusUsage
+    );
 
     private final FlagState mEnableBatteryStatsForAllDisplays = new FlagState(
             Flags.FLAG_ENABLE_BATTERY_STATS_FOR_ALL_DISPLAYS,
@@ -412,6 +421,10 @@
         return mNewHdrBrightnessModifier.isEnabled();
     }
 
+    public boolean isVirtualDisplayLimitEnabled() {
+        return mVirtualDisplayLimit.isEnabled();
+    }
+
     /**
      * @return Whether the useDozeBrightness parameter should be used
      */
@@ -436,6 +449,13 @@
     }
 
     /**
+     * @return {@code true} if autobrightness is to be blocked when stylus is being used
+     */
+    public boolean isBlockAutobrightnessChangesOnStylusUsage() {
+        return mBlockAutobrightnessChangesOnStylusUsage.isEnabled();
+    }
+
+    /**
      * dumps all flagstates
      * @param pw printWriter
      */
@@ -476,9 +496,11 @@
         pw.println(" " + mOffloadDozeOverrideHoldsWakelock);
         pw.println(" " + mOffloadSessionCancelBlockScreenOn);
         pw.println(" " + mNewHdrBrightnessModifier);
+        pw.println(" " + mVirtualDisplayLimit);
         pw.println(" " + mNormalBrightnessForDozeParameter);
         pw.println(" " + mIdleScreenConfigInSubscribingLightSensor);
         pw.println(" " + mEnableBatteryStatsForAllDisplays);
+        pw.println(" " + mBlockAutobrightnessChangesOnStylusUsage);
     }
 
     private static class FlagState {
diff --git a/services/core/java/com/android/server/display/feature/display_flags.aconfig b/services/core/java/com/android/server/display/feature/display_flags.aconfig
index e3ebe5b..20ecd2d 100644
--- a/services/core/java/com/android/server/display/feature/display_flags.aconfig
+++ b/services/core/java/com/android/server/display/feature/display_flags.aconfig
@@ -348,6 +348,14 @@
 }
 
 flag {
+    name: "virtual_display_limit"
+    namespace: "display_manager"
+    description: "Limit the number of virtual displays that can be created."
+    bug: "261791612"
+    is_fixed_read_only: true
+}
+
+flag {
     name: "idle_screen_config_in_subscribing_light_sensor"
     namespace: "display_manager"
     description: "Account for Idle screen refresh rate configs while subscribing to light sensor"
@@ -364,4 +372,12 @@
     description: "Flag to enable battery stats for all displays."
     bug: "366112793"
     is_fixed_read_only: true
-}
\ No newline at end of file
+}
+
+flag {
+    name: "block_autobrightness_changes_on_stylus_usage"
+    namespace: "display_manager"
+    description: "Block the usage of ALS to control the display brightness when stylus is being used"
+    bug: "352411468"
+    is_fixed_read_only: true
+}
diff --git a/services/core/java/com/android/server/flags/pinner.aconfig b/services/core/java/com/android/server/flags/pinner.aconfig
index 2f817db..3453668 100644
--- a/services/core/java/com/android/server/flags/pinner.aconfig
+++ b/services/core/java/com/android/server/flags/pinner.aconfig
@@ -9,8 +9,11 @@
 }
 
 flag {
-    name: "skip_home_art_pins"
-    namespace: "system_performance"
-    description: "Ablation study flag that controls if home app odex/vdex files should be pinned in memory."
-    bug: "340935152"
-}
\ No newline at end of file
+  name: "pin_global_quota"
+  namespace: "system_performance"
+  description: "This flag controls whether pinner will use a global quota or not"
+  bug: "340935152"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java
index b78f8a7..0e7d2b6 100644
--- a/services/core/java/com/android/server/hdmi/Constants.java
+++ b/services/core/java/com/android/server/hdmi/Constants.java
@@ -509,6 +509,21 @@
     static final String PROPERTY_STRIP_AUDIO_TV_NO_SYSTEM_AUDIO =
         "persist.sys.hdmi.property_strip_audio_tv_no_system_audio";
 
+    /**
+     * Property that decides whether CEC should be disabled on standby when the low energy mode
+     * option is used.
+     */
+    static final String PROPERTY_WAS_CEC_DISABLED_ON_STANDBY_BY_LOW_ENERGY_MODE =
+            "persist.sys.hdmi.property_was_cec_disabled_on_standby_by_low_energy_mode";
+
+    /**
+     * Property that checks if CEC was disabled on standby by low energy mode. With the help of this
+     * property we avoid re-enabling CEC if the user explicitly disabled it, unrelated to the
+     * selected energy mode.
+     */
+    static final String PROPERTY_DISABLE_CEC_ON_STANDBY_IN_LOW_ENERGY_MODE =
+            "persist.sys.hdmi.property_disable_cec_on_standby_in_low_energy_mode";
+
     static final int RECORDING_TYPE_DIGITAL_RF = 1;
     static final int RECORDING_TYPE_ANALOGUE_RF = 2;
     static final int RECORDING_TYPE_EXTERNAL_PHYSICAL_ADDRESS = 3;
@@ -644,6 +659,11 @@
     })
     @interface FeatureFlag {}
 
+    /**
+     * Identifier key for Low energy mode.
+     */
+    static final String KEY_LOW_ENERGY_USE = "low_energy_use";
+
     private Constants() {
         /* cannot be instantiated */
     }
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 8e41d18..81be0ba 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -22,6 +22,7 @@
 import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_REMOVE_DEVICE;
 import static android.hardware.hdmi.HdmiControlManager.EARC_FEATURE_DISABLED;
 import static android.hardware.hdmi.HdmiControlManager.EARC_FEATURE_ENABLED;
+import static android.hardware.hdmi.HdmiControlManager.HDMI_CEC_CONTROL_DISABLED;
 import static android.hardware.hdmi.HdmiControlManager.HDMI_CEC_CONTROL_ENABLED;
 import static android.hardware.hdmi.HdmiControlManager.POWER_CONTROL_MODE_NONE;
 import static android.hardware.hdmi.HdmiControlManager.SOUNDBAR_MODE_DISABLED;
@@ -478,7 +479,8 @@
     @Nullable
     private HdmiCecController mCecController;
 
-    private HdmiCecPowerStatusController mPowerStatusController;
+    @VisibleForTesting
+    protected HdmiCecPowerStatusController mPowerStatusController;
 
     @Nullable
     private HdmiEarcController mEarcController;
@@ -3814,7 +3816,32 @@
         mPowerStatusController.setPowerStatus(HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON,
                 false);
         if (mCecController != null) {
-            if (isCecControlEnabled()) {
+            if (isTvDevice() && getWasCecDisabledOnStandbyByLowEnergyMode()) {
+                Slog.w(TAG, "Re-enable CEC on wake-up since it was disabled due to low energy "
+                        + " mode.");
+                getHdmiCecConfig().setIntValue(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
+                        HDMI_CEC_CONTROL_ENABLED);
+                setWasCecDisabledOnStandbyByLowEnergyMode(false);
+                int controlStateChangedReason = -1;
+                switch (wakeUpAction) {
+                    case WAKE_UP_SCREEN_ON:
+                        controlStateChangedReason =
+                                HdmiControlManager.CONTROL_STATE_CHANGED_REASON_WAKEUP;
+                        break;
+                    case WAKE_UP_BOOT_UP:
+                        controlStateChangedReason =
+                                HdmiControlManager.CONTROL_STATE_CHANGED_REASON_START;
+                        break;
+                    default:
+                        Slog.e(TAG, "wakeUpAction " + wakeUpAction + " not defined.");
+                        return;
+
+                }
+                // Since CEC is going to be initialized by the setting value update, we must invoke
+                // the vendor command listeners here with the reason TV woke up.
+                invokeVendorCommandListenersOnControlStateChanged(true,
+                        controlStateChangedReason);
+            } else if (isCecControlEnabled()) {
                 int startReason = -1;
                 switch (wakeUpAction) {
                     case WAKE_UP_SCREEN_ON:
@@ -3988,6 +4015,14 @@
                 if (isAudioSystemDevice() || !isPowerStandby()) {
                     return;
                 }
+                if (isTvDevice() && getDisableCecOnStandbyByLowEnergyMode()
+                        && mPowerManager.isLowPowerStandbyEnabled()) {
+                    Slog.w(TAG, "Disable CEC on standby due to low power energy mode.");
+                    setWasCecDisabledOnStandbyByLowEnergyMode(true);
+                    getHdmiCecConfig().setIntValue(
+                            HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
+                            HDMI_CEC_CONTROL_DISABLED);
+                }
                 mCecController.enableSystemCecControl(false);
                 mMhlController.setOption(OPTION_MHL_SERVICE_CONTROL, DISABLED);
             }
@@ -5148,4 +5183,34 @@
     protected boolean isHdmiControlEnhancedBehaviorFlagEnabled() {
         return hdmiControlEnhancedBehavior();
     }
+
+    /**
+     * Reads the property value that decides whether CEC should be disabled on standby when the low
+     * energy mode option is used.
+     */
+    @VisibleForTesting
+    protected boolean getDisableCecOnStandbyByLowEnergyMode() {
+        return SystemProperties.getBoolean(
+                Constants.PROPERTY_DISABLE_CEC_ON_STANDBY_IN_LOW_ENERGY_MODE, false);
+    }
+
+    /**
+     * Reads the property that checks if CEC was disabled on standby by low energy mode.
+     */
+    @VisibleForTesting
+    protected boolean getWasCecDisabledOnStandbyByLowEnergyMode() {
+        return SystemProperties.getBoolean(
+                Constants.PROPERTY_WAS_CEC_DISABLED_ON_STANDBY_BY_LOW_ENERGY_MODE, false);
+    }
+
+    /**
+     * Sets the truth value of the property that checks if CEC was disabled on standby by low energy
+     * mode.
+     */
+    @VisibleForTesting
+    protected void setWasCecDisabledOnStandbyByLowEnergyMode(boolean value) {
+        writeStringSystemProperty(
+                Constants.PROPERTY_WAS_CEC_DISABLED_ON_STANDBY_BY_LOW_ENERGY_MODE,
+                String.valueOf(value));
+    }
 }
diff --git a/services/core/java/com/android/server/hdmi/HdmiEarcController.java b/services/core/java/com/android/server/hdmi/HdmiEarcController.java
index 46a8f03..1c947e9 100644
--- a/services/core/java/com/android/server/hdmi/HdmiEarcController.java
+++ b/services/core/java/com/android/server/hdmi/HdmiEarcController.java
@@ -87,8 +87,8 @@
             } catch (ServiceSpecificException sse) {
                 HdmiLogger.error(
                         "Could not set eARC enabled to " + enabled + ". Error: ", sse.errorCode);
-            } catch (RemoteException re) {
-                HdmiLogger.error("Could not set eARC enabled to " + enabled + ":. Exception: ", re);
+            } catch (RemoteException | NullPointerException e) {
+                HdmiLogger.error("Could not set eARC enabled to " + enabled + ":. Exception: ", e);
             }
         }
 
@@ -96,8 +96,8 @@
         public boolean nativeIsEarcEnabled() {
             try {
                 return mEarc.isEArcEnabled();
-            } catch (RemoteException re) {
-                HdmiLogger.error("Could not read if eARC is enabled. Exception: ", re);
+            } catch (RemoteException | NullPointerException e) {
+                HdmiLogger.error("Could not read if eARC is enabled. Exception: ", e);
                 return false;
             }
         }
@@ -107,8 +107,8 @@
             mEarcCallback = callback;
             try {
                 mEarc.setCallback(callback);
-            } catch (RemoteException re) {
-                HdmiLogger.error("Could not set callback. Exception: ", re);
+            } catch (RemoteException | NullPointerException e) {
+                HdmiLogger.error("Could not set callback. Exception: ", e);
             }
         }
 
@@ -116,8 +116,8 @@
         public byte nativeGetState(int portId) {
             try {
                 return mEarc.getState(portId);
-            } catch (RemoteException re) {
-                HdmiLogger.error("Could not get eARC state. Exception: ", re);
+            } catch (RemoteException | NullPointerException e) {
+                HdmiLogger.error("Could not get eARC state. Exception: ", e);
                 return -1;
             }
         }
@@ -126,9 +126,9 @@
         public byte[] nativeGetLastReportedAudioCapabilities(int portId) {
             try {
                 return mEarc.getLastReportedAudioCapabilities(portId);
-            } catch (RemoteException re) {
+            } catch (RemoteException | NullPointerException e) {
                 HdmiLogger.error(
-                        "Could not read last reported audio capabilities. Exception: ", re);
+                        "Could not read last reported audio capabilities. Exception: ", e);
                 return null;
             }
         }
diff --git a/services/core/java/com/android/server/hdmi/PowerManagerWrapper.java b/services/core/java/com/android/server/hdmi/PowerManagerWrapper.java
index 7530b3b..5292cbb 100644
--- a/services/core/java/com/android/server/hdmi/PowerManagerWrapper.java
+++ b/services/core/java/com/android/server/hdmi/PowerManagerWrapper.java
@@ -16,6 +16,8 @@
 
 package com.android.server.hdmi;
 
+import static com.android.server.hdmi.Constants.KEY_LOW_ENERGY_USE;
+
 import android.content.Context;
 import android.os.PowerManager;
 
@@ -47,6 +49,12 @@
         return new DefaultWakeLockWrapper(mPowerManager.newWakeLock(levelAndFlags, tag));
     }
 
+    boolean isLowPowerStandbyEnabled() {
+        PowerManager.LowPowerStandbyPolicy lowPowerStandbyPolicy
+                = mPowerManager.getLowPowerStandbyPolicy();
+        return lowPowerStandbyPolicy.getIdentifier().equals(KEY_LOW_ENERGY_USE);
+    }
+
     /**
      * "Default" wrapper for {@link PowerManager.WakeLock}, as opposed to a "Fake" wrapper for
      * testing - see {@link FakePowerManagerWrapper.FakeWakeLockWrapper}.
diff --git a/services/core/java/com/android/server/input/InputManagerInternal.java b/services/core/java/com/android/server/input/InputManagerInternal.java
index 9281267..99f7f12 100644
--- a/services/core/java/com/android/server/input/InputManagerInternal.java
+++ b/services/core/java/com/android/server/input/InputManagerInternal.java
@@ -23,6 +23,7 @@
 import android.hardware.display.DisplayViewport;
 import android.hardware.input.KeyGestureEvent;
 import android.os.IBinder;
+import android.util.SparseBooleanArray;
 import android.view.InputChannel;
 import android.view.inputmethod.InputMethodSubtype;
 
@@ -45,9 +46,11 @@
 
     /**
      * Called by the power manager to tell the input manager whether it should start
-     * watching for wake events.
+     * watching for wake events on given displays.
+     *
+     * @param displayInteractivities Map of display ids to their current interactive state.
      */
-    public abstract void setInteractive(boolean interactive);
+    public abstract void setDisplayInteractivities(SparseBooleanArray displayInteractivities);
 
     /**
      * Toggles Caps Lock state for input device with specific id.
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index fd7479e..8acf583 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -25,6 +25,7 @@
 
 import static com.android.hardware.input.Flags.touchpadVisualizer;
 import static com.android.hardware.input.Flags.useKeyGestureEventHandler;
+import static com.android.server.policy.WindowManagerPolicy.ACTION_PASS_TO_USER;
 
 import android.Manifest;
 import android.annotation.EnforcePermission;
@@ -95,6 +96,7 @@
 import android.provider.DeviceConfig;
 import android.text.TextUtils;
 import android.util.ArrayMap;
+import android.util.ArraySet;
 import android.util.IndentingPrintWriter;
 import android.util.Log;
 import android.util.Slog;
@@ -117,6 +119,7 @@
 import android.view.VerifiedInputEvent;
 import android.view.ViewConfiguration;
 import android.view.WindowManager;
+import android.view.WindowManagerPolicyConstants;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
@@ -325,6 +328,9 @@
     // Manages Sticky modifier state
     private final StickyModifierStateController mStickyModifierStateController;
     private final KeyGestureController mKeyGestureController;
+    /** Fallback actions by key code */
+    private final SparseArray<KeyCharacterMap.FallbackAction> mFallbackActions =
+            new SparseArray<>();
 
     // Manages Keyboard microphone mute led
     private final KeyboardLedController mKeyboardLedController;
@@ -611,6 +617,7 @@
         mKeyRemapper.systemRunning();
         mPointerIconCache.systemRunning();
         mKeyboardGlyphManager.systemRunning();
+        mKeyGestureController.systemRunning();
 
         initKeyGestures();
     }
@@ -2469,6 +2476,14 @@
                 mFocusEventDebugView.reportKeyEvent(event);
             }
         }
+        if (useKeyGestureEventHandler() && mKeyGestureController.interceptKeyBeforeQueueing(event,
+                policyFlags)) {
+            // If key gesture gets triggered, we send the event to policy with KEY_GESTURE flag
+            // indicating, the event is used in triggering a key gesture. We can't block event
+            // like Power or volume keys since policy might still want to handle it to change
+            // certain states.
+            policyFlags |= WindowManagerPolicyConstants.FLAG_KEY_GESTURE_TRIGGERED;
+        }
         return mWindowManagerCallbacks.interceptKeyBeforeQueueing(event, policyFlags);
     }
 
@@ -2511,6 +2526,74 @@
                 null, null, null) == PERMISSION_GRANTED;
     }
 
+    // Native callback.
+    @SuppressWarnings("unused")
+    private KeyEvent dispatchUnhandledKey(IBinder focus, KeyEvent event, int policyFlags) {
+        if (interceptUnhandledKey(event, focus)) {
+            return null;
+        }
+        // TODO(b/358569822): Move fallback logic to KeyGestureController
+        if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) != 0) {
+            return null;
+        }
+        final KeyCharacterMap kcm = event.getKeyCharacterMap();
+        final int keyCode = event.getKeyCode();
+        final int metaState = event.getMetaState();
+        final boolean initialDown = event.getAction() == KeyEvent.ACTION_DOWN
+                && event.getRepeatCount() == 0;
+
+        // Check for fallback actions specified by the key character map.
+        final KeyCharacterMap.FallbackAction fallbackAction;
+        if (initialDown) {
+            fallbackAction = kcm.getFallbackAction(keyCode, metaState);
+        } else {
+            fallbackAction = mFallbackActions.get(keyCode);
+        }
+
+        if (fallbackAction == null) {
+            return null;
+        }
+        KeyEvent fallbackEvent = null;
+        final int flags = event.getFlags() | KeyEvent.FLAG_FALLBACK;
+        fallbackEvent = KeyEvent.obtain(
+                event.getDownTime(), event.getEventTime(),
+                event.getAction(), fallbackAction.keyCode,
+                event.getRepeatCount(), fallbackAction.metaState,
+                event.getDeviceId(), event.getScanCode(),
+                flags, event.getSource(), event.getDisplayId(), null);
+
+        if (!interceptFallback(focus, fallbackEvent, policyFlags)) {
+            fallbackEvent.recycle();
+            fallbackEvent = null;
+        }
+
+        if (initialDown) {
+            mFallbackActions.put(keyCode, fallbackAction);
+        } else if (event.getAction() == KeyEvent.ACTION_UP) {
+            mFallbackActions.remove(keyCode);
+            fallbackAction.recycle();
+        }
+        return fallbackEvent;
+    }
+
+    private boolean interceptFallback(IBinder focusedToken, KeyEvent fallbackEvent,
+            int policyFlags) {
+        int actions = interceptKeyBeforeQueueing(fallbackEvent, policyFlags);
+        if ((actions & ACTION_PASS_TO_USER) == 0) {
+            return false;
+        }
+        long delayMillis = interceptKeyBeforeDispatching(focusedToken, fallbackEvent, policyFlags);
+        return delayMillis == 0 && !interceptUnhandledKey(fallbackEvent, focusedToken);
+    }
+
+    private boolean interceptUnhandledKey(KeyEvent event, IBinder focus) {
+        if (useKeyGestureEventHandler() && mKeyGestureController.interceptUnhandledKey(event,
+                focus)) {
+            return true;
+        }
+        return mWindowManagerCallbacks.interceptUnhandledKey(event, focus);
+    }
+
     private void initKeyGestures() {
         if (!useKeyGestureEventHandler()) {
             return;
@@ -2566,12 +2649,6 @@
 
     // Native callback.
     @SuppressWarnings("unused")
-    private KeyEvent dispatchUnhandledKey(IBinder focus, KeyEvent event, int policyFlags) {
-        return mWindowManagerCallbacks.dispatchUnhandledKey(focus, event, policyFlags);
-    }
-
-    // Native callback.
-    @SuppressWarnings("unused")
     private void onPointerDownOutsideFocus(IBinder touchedToken) {
         mWindowManagerCallbacks.onPointerDownOutsideFocus(touchedToken);
     }
@@ -2617,6 +2694,9 @@
     @SuppressWarnings("unused")
     private void notifyStylusGestureStarted(int deviceId, long eventTime) {
         mBatteryController.notifyStylusGestureStarted(deviceId, eventTime);
+        if (mDisplayManagerInternal != null) {
+            mDisplayManagerInternal.stylusGestureStarted(eventTime);
+        }
     }
 
     /**
@@ -2986,9 +3066,9 @@
         long interceptKeyBeforeDispatching(IBinder token, KeyEvent event, int policyFlags);
 
         /**
-         * Dispatch unhandled key
+         * Intercept unhandled key
          */
-        KeyEvent dispatchUnhandledKey(IBinder token, KeyEvent event, int policyFlags);
+        boolean interceptUnhandledKey(KeyEvent event, IBinder token);
 
         int getPointerLayer();
 
@@ -3261,10 +3341,22 @@
         }
 
         @Override
-        public void setInteractive(boolean interactive) {
-            mNative.setInteractive(interactive);
-            mBatteryController.onInteractiveChanged(interactive);
-            mKeyboardBacklightController.onInteractiveChanged(interactive);
+        public void setDisplayInteractivities(SparseBooleanArray displayInteractivities) {
+            boolean globallyInteractive = false;
+            ArraySet<Integer> nonInteractiveDisplays = new ArraySet<>();
+            for (int i = 0; i < displayInteractivities.size(); i++) {
+                final int displayId = displayInteractivities.keyAt(i);
+                final boolean displayInteractive = displayInteractivities.get(displayId);
+                if (displayInteractive) {
+                    globallyInteractive = true;
+                } else {
+                    nonInteractiveDisplays.add(displayId);
+                }
+            }
+            mNative.setNonInteractiveDisplays(
+                    nonInteractiveDisplays.stream().mapToInt(Integer::intValue).toArray());
+            mBatteryController.onInteractiveChanged(globallyInteractive);
+            mKeyboardBacklightController.onInteractiveChanged(globallyInteractive);
         }
 
         // TODO(b/358569822): Remove this method from InputManagerInternal after key gesture
diff --git a/services/core/java/com/android/server/input/KeyGestureController.java b/services/core/java/com/android/server/input/KeyGestureController.java
index 4538b49..b488db5 100644
--- a/services/core/java/com/android/server/input/KeyGestureController.java
+++ b/services/core/java/com/android/server/input/KeyGestureController.java
@@ -16,14 +16,23 @@
 
 package com.android.server.input;
 
+import static android.content.pm.PackageManager.FEATURE_LEANBACK;
+import static android.content.pm.PackageManager.FEATURE_WATCH;
+import static android.view.WindowManagerPolicyConstants.FLAG_INTERACTIVE;
+
+import static com.android.hardware.input.Flags.useKeyGestureEventHandler;
+import static com.android.hardware.input.Flags.useKeyGestureEventHandlerMultiPressGestures;
 import static com.android.server.flags.Flags.newBugreportKeyboardShortcut;
 
 import android.annotation.BinderThread;
 import android.annotation.MainThread;
 import android.annotation.Nullable;
 import android.annotation.SuppressLint;
+import android.content.ContentResolver;
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.content.res.Resources;
+import android.database.ContentObserver;
 import android.hardware.input.AidlKeyGestureEvent;
 import android.hardware.input.IKeyGestureEventListener;
 import android.hardware.input.IKeyGestureHandler;
@@ -35,18 +44,23 @@
 import android.os.Message;
 import android.os.Process;
 import android.os.RemoteException;
+import android.os.SystemClock;
 import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.provider.Settings;
 import android.util.IndentingPrintWriter;
 import android.util.Log;
 import android.util.Slog;
 import android.util.SparseArray;
 import android.view.Display;
 import android.view.InputDevice;
+import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
 
 import com.android.internal.R;
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.policy.KeyCombinationManager;
 
 import java.util.ArrayDeque;
 import java.util.HashSet;
@@ -82,20 +96,36 @@
     private static final int SEARCH_KEY_BEHAVIOR_TARGET_ACTIVITY = 1;
     private static final int LAST_SEARCH_KEY_BEHAVIOR = SEARCH_KEY_BEHAVIOR_TARGET_ACTIVITY;
 
+    // must match: config_keyChordPowerVolumeUp in config.xml
+    static final int POWER_VOLUME_UP_BEHAVIOR_NOTHING = 0;
+    static final int POWER_VOLUME_UP_BEHAVIOR_MUTE = 1;
+    static final int POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS = 2;
+
     private final Context mContext;
     private final Handler mHandler;
     private final int mSystemPid;
+    private final KeyCombinationManager mKeyCombinationManager;
+    private final SettingsObserver mSettingsObserver;
 
     // Pending actions
     private boolean mPendingMetaAction;
     private boolean mPendingCapsLockToggle;
     private boolean mPendingHideRecentSwitcher;
 
-    // Key behaviors
+    // Platform behaviors
     private boolean mEnableBugReportKeyboardShortcut;
+    private boolean mHasFeatureWatch;
+    private boolean mHasFeatureLeanback;
+
+    // Key behaviors
     private int mSearchKeyBehavior;
     private int mSettingsKeyBehavior;
 
+    // Settings behaviors
+    private int mRingerToggleChord = Settings.Secure.VOLUME_HUSH_OFF;
+    private int mPowerVolUpBehavior;
+
+
     // List of currently registered key gesture event listeners keyed by process pid
     @GuardedBy("mKeyGestureEventListenerRecords")
     private final SparseArray<KeyGestureEventListenerRecord>
@@ -128,12 +158,19 @@
                 return Integer.compare(p1, p2);
             }
         });
+        mKeyCombinationManager = new KeyCombinationManager(mHandler);
+        mSettingsObserver = new SettingsObserver(mHandler);
         initBehaviors();
+        initKeyCombinationRules();
     }
 
     private void initBehaviors() {
         mEnableBugReportKeyboardShortcut = "1".equals(SystemProperties.get("ro.debuggable"));
 
+        PackageManager pm = mContext.getPackageManager();
+        mHasFeatureWatch = pm.hasSystemFeature(FEATURE_WATCH);
+        mHasFeatureLeanback = pm.hasSystemFeature(FEATURE_LEANBACK);
+
         Resources res = mContext.getResources();
         mSearchKeyBehavior = res.getInteger(R.integer.config_searchKeyBehavior);
         if (mSearchKeyBehavior < SEARCH_KEY_BEHAVIOR_DEFAULT_SEARCH
@@ -145,6 +182,251 @@
                 || mSettingsKeyBehavior > LAST_SETTINGS_KEY_BEHAVIOR) {
             mSettingsKeyBehavior = SETTINGS_KEY_BEHAVIOR_SETTINGS_ACTIVITY;
         }
+
+        mHandler.post(this::initBehaviorsFromSettings);
+    }
+
+    private void initBehaviorsFromSettings() {
+        ContentResolver resolver = mContext.getContentResolver();
+        mRingerToggleChord = Settings.Secure.getIntForUser(resolver,
+                Settings.Secure.VOLUME_HUSH_GESTURE, Settings.Secure.VOLUME_HUSH_OFF,
+                UserHandle.USER_CURRENT);
+
+        mPowerVolUpBehavior = Settings.Global.getInt(resolver,
+                Settings.Global.KEY_CHORD_POWER_VOLUME_UP,
+                mContext.getResources().getInteger(
+                        com.android.internal.R.integer.config_keyChordPowerVolumeUp));
+    }
+
+    private void initKeyCombinationRules() {
+        if (!useKeyGestureEventHandler() || !useKeyGestureEventHandlerMultiPressGestures()) {
+            return;
+        }
+        // TODO(b/358569822): Handle Power, Back key properly since key combination gesture is
+        //  captured here and rest of the Power, Back key behaviors are handled in PWM
+        final boolean screenshotChordEnabled = mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_enableScreenshotChord);
+
+        if (screenshotChordEnabled) {
+            mKeyCombinationManager.addRule(
+                    new KeyCombinationManager.TwoKeysCombinationRule(KeyEvent.KEYCODE_VOLUME_DOWN,
+                            KeyEvent.KEYCODE_POWER) {
+                        @Override
+                        public boolean preCondition() {
+                            return isKeyGestureSupported(
+                                    KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD);
+                        }
+
+                        @Override
+                        public void execute() {
+                            handleKeyGesture(
+                                    new int[]{KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_POWER},
+                                    KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD,
+                                    KeyGestureEvent.ACTION_GESTURE_START, 0);
+                        }
+
+                        @Override
+                        public void cancel() {
+                            handleKeyGesture(
+                                    new int[]{KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_POWER},
+                                    KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD,
+                                    KeyGestureEvent.ACTION_GESTURE_COMPLETE,
+                                    KeyGestureEvent.FLAG_CANCELLED);
+                        }
+                    });
+
+            if (mHasFeatureWatch) {
+                mKeyCombinationManager.addRule(
+                        new KeyCombinationManager.TwoKeysCombinationRule(KeyEvent.KEYCODE_POWER,
+                                KeyEvent.KEYCODE_STEM_PRIMARY) {
+                            @Override
+                            public boolean preCondition() {
+                                return isKeyGestureSupported(
+                                        KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD);
+                            }
+
+                            @Override
+                            public void execute() {
+                                handleKeyGesture(new int[]{KeyEvent.KEYCODE_POWER,
+                                                KeyEvent.KEYCODE_STEM_PRIMARY},
+                                        KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD,
+                                        KeyGestureEvent.ACTION_GESTURE_START, 0);
+                            }
+                            @Override
+                            public void cancel() {
+                                handleKeyGesture(new int[]{KeyEvent.KEYCODE_POWER,
+                                                KeyEvent.KEYCODE_STEM_PRIMARY},
+                                        KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD,
+                                        KeyGestureEvent.ACTION_GESTURE_COMPLETE,
+                                        KeyGestureEvent.FLAG_CANCELLED);
+                            }
+                        });
+            }
+        }
+
+        mKeyCombinationManager.addRule(
+                new KeyCombinationManager.TwoKeysCombinationRule(KeyEvent.KEYCODE_VOLUME_DOWN,
+                        KeyEvent.KEYCODE_VOLUME_UP) {
+                    @Override
+                    public boolean preCondition() {
+                        return isKeyGestureSupported(
+                                KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD);
+                    }
+
+                    @Override
+                    public void execute() {
+                        handleKeyGesture(
+                                new int[]{KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_VOLUME_UP},
+                                KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD,
+                                KeyGestureEvent.ACTION_GESTURE_START, 0);
+                    }
+
+                    @Override
+                    public void cancel() {
+                        handleKeyGesture(
+                                new int[]{KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_VOLUME_UP},
+                                KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD,
+                                KeyGestureEvent.ACTION_GESTURE_COMPLETE,
+                                KeyGestureEvent.FLAG_CANCELLED);
+                    }
+                });
+
+        // Volume up + power can either be the "ringer toggle chord" or as another way to
+        // launch GlobalActions. This behavior can change at runtime so we must check behavior
+        // inside the TwoKeysCombinationRule.
+        mKeyCombinationManager.addRule(
+                new KeyCombinationManager.TwoKeysCombinationRule(KeyEvent.KEYCODE_VOLUME_UP,
+                        KeyEvent.KEYCODE_POWER) {
+                    @Override
+                    public boolean preCondition() {
+                        if (!isKeyGestureSupported(getGestureType())) {
+                            return false;
+                        }
+                        switch (mPowerVolUpBehavior) {
+                            case POWER_VOLUME_UP_BEHAVIOR_MUTE:
+                                return mRingerToggleChord != Settings.Secure.VOLUME_HUSH_OFF;
+                            default:
+                                return true;
+                        }
+                    }
+                    @Override
+                    public void execute() {
+                        int gestureType = getGestureType();
+                        if (gestureType == KeyGestureEvent.KEY_GESTURE_TYPE_UNSPECIFIED) {
+                            return;
+                        }
+                        handleKeyGesture(
+                                new int[]{KeyEvent.KEYCODE_VOLUME_UP, KeyEvent.KEYCODE_POWER},
+                                gestureType, KeyGestureEvent.ACTION_GESTURE_START, 0);
+                    }
+                    @Override
+                    public void cancel() {
+                        int gestureType = getGestureType();
+                        if (gestureType == KeyGestureEvent.KEY_GESTURE_TYPE_UNSPECIFIED) {
+                            return;
+                        }
+                        handleKeyGesture(
+                                new int[]{KeyEvent.KEYCODE_VOLUME_UP, KeyEvent.KEYCODE_POWER},
+                                gestureType, KeyGestureEvent.ACTION_GESTURE_COMPLETE,
+                                KeyGestureEvent.FLAG_CANCELLED);
+                    }
+
+                    @KeyGestureEvent.KeyGestureType
+                    private int getGestureType() {
+                        switch (mPowerVolUpBehavior) {
+                            case POWER_VOLUME_UP_BEHAVIOR_MUTE -> {
+                                return KeyGestureEvent.KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD;
+                            }
+                            case POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS -> {
+                                return KeyGestureEvent.KEY_GESTURE_TYPE_GLOBAL_ACTIONS;
+                            }
+                            default -> {
+                                return KeyGestureEvent.KEY_GESTURE_TYPE_UNSPECIFIED;
+                            }
+                        }
+                    }
+                });
+
+        if (mHasFeatureLeanback) {
+            mKeyCombinationManager.addRule(
+                    new KeyCombinationManager.TwoKeysCombinationRule(KeyEvent.KEYCODE_BACK,
+                            KeyEvent.KEYCODE_DPAD_DOWN) {
+                        @Override
+                        public boolean preCondition() {
+                            return isKeyGestureSupported(
+                                    KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD);
+                        }
+
+                        @Override
+                        public void execute() {
+                            handleKeyGesture(
+                                    new int[]{KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_DPAD_DOWN},
+                                    KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD,
+                                    KeyGestureEvent.ACTION_GESTURE_START, 0);
+                        }
+
+                        @Override
+                        public void cancel() {
+                            handleKeyGesture(
+                                    new int[]{KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_DPAD_DOWN},
+                                    KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD,
+                                    KeyGestureEvent.ACTION_GESTURE_COMPLETE,
+                                    KeyGestureEvent.FLAG_CANCELLED);
+                        }
+                        @Override
+                        public long getKeyInterceptDelayMs() {
+                            // Use a timeout of 0 to prevent additional latency in processing of
+                            // this key. This will potentially cause some unwanted UI actions if the
+                            // user does end up triggering the key combination later, but in most
+                            // cases, the user will simply hit a single key, and this will allow us
+                            // to process it without first waiting to see if the combination is
+                            // going to be triggered.
+                            return 0;
+                        }
+                    });
+
+            mKeyCombinationManager.addRule(
+                    new KeyCombinationManager.TwoKeysCombinationRule(KeyEvent.KEYCODE_BACK,
+                            KeyEvent.KEYCODE_DPAD_CENTER) {
+                        @Override
+                        public boolean preCondition() {
+                            return isKeyGestureSupported(
+                                    KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT);
+                        }
+
+                        @Override
+                        public void execute() {
+                            handleKeyGesture(
+                                    new int[]{KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_DPAD_CENTER},
+                                    KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT,
+                                    KeyGestureEvent.ACTION_GESTURE_START, 0);
+                        }
+                        @Override
+                        public void cancel() {
+                            handleKeyGesture(
+                                    new int[]{KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_DPAD_CENTER},
+                                    KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT,
+                                    KeyGestureEvent.ACTION_GESTURE_COMPLETE,
+                                    KeyGestureEvent.FLAG_CANCELLED);
+                        }
+                        @Override
+                        public long getKeyInterceptDelayMs() {
+                            return 0;
+                        }
+                    });
+        }
+    }
+
+    public void systemRunning() {
+        mSettingsObserver.observe();
+    }
+
+    public boolean interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
+        final boolean interactive = (policyFlags & FLAG_INTERACTIVE) != 0;
+        if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
+            return mKeyCombinationManager.interceptKey(event, interactive);
+        }
+        return false;
     }
 
     public long interceptKeyBeforeDispatching(IBinder focusedToken, KeyEvent event,
@@ -153,9 +435,22 @@
         //  KeyGestureHandler (PWM is one of the handlers)
         final int keyCode = event.getKeyCode();
         final int deviceId = event.getDeviceId();
+        final int flags = event.getFlags();
         final long keyConsumed = -1;
         final long keyNotConsumed = 0;
 
+        if (mKeyCombinationManager.isKeyConsumed(event)) {
+            return keyConsumed;
+        }
+
+        if ((flags & KeyEvent.FLAG_FALLBACK) == 0) {
+            final long now = SystemClock.uptimeMillis();
+            final long interceptTimeout = mKeyCombinationManager.getKeyInterceptTimeout(keyCode);
+            if (now < interceptTimeout) {
+                return interceptTimeout - now;
+            }
+        }
+
         Set<Integer> consumedKeys = mConsumedKeysForDevice.get(deviceId);
         if (consumedKeys == null) {
             consumedKeys = new HashSet<>();
@@ -577,10 +872,71 @@
         return false;
     }
 
+    boolean interceptUnhandledKey(KeyEvent event, IBinder focusedToken) {
+        final int keyCode = event.getKeyCode();
+        final int repeatCount = event.getRepeatCount();
+        final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
+        final int metaState = event.getModifiers();
+        final int deviceId = event.getDeviceId();
+        final int displayId = event.getDisplayId();
+
+        switch(keyCode) {
+            case KeyEvent.KEYCODE_SPACE:
+                if (down && repeatCount == 0) {
+                    // Handle keyboard layout switching. (CTRL + SPACE)
+                    if (KeyEvent.metaStateHasModifiers(metaState & ~KeyEvent.META_SHIFT_MASK,
+                            KeyEvent.META_CTRL_ON)) {
+                        return handleKeyGesture(deviceId, new int[]{keyCode},
+                                KeyEvent.META_CTRL_ON | (event.isShiftPressed()
+                                        ? KeyEvent.META_SHIFT_ON : 0),
+                                KeyGestureEvent.KEY_GESTURE_TYPE_LANGUAGE_SWITCH,
+                                KeyGestureEvent.ACTION_GESTURE_COMPLETE, displayId,
+                                focusedToken, /* flags = */0);
+                    }
+                }
+                break;
+            case KeyEvent.KEYCODE_Z:
+                if (down && KeyEvent.metaStateHasModifiers(metaState,
+                        KeyEvent.META_CTRL_ON | KeyEvent.META_ALT_ON)) {
+                    // Intercept the Accessibility keychord (CTRL + ALT + Z) for keyboard users.
+                    return handleKeyGesture(deviceId, new int[]{keyCode},
+                            KeyEvent.META_CTRL_ON | KeyEvent.META_ALT_ON,
+                            KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT,
+                            KeyGestureEvent.ACTION_GESTURE_COMPLETE, displayId,
+                            focusedToken, /* flags = */0);
+                }
+                break;
+            case KeyEvent.KEYCODE_SYSRQ:
+                if (down && repeatCount == 0) {
+                    return handleKeyGesture(deviceId, new int[]{keyCode}, /* modifierState = */0,
+                            KeyGestureEvent.KEY_GESTURE_TYPE_TAKE_SCREENSHOT,
+                            KeyGestureEvent.ACTION_GESTURE_COMPLETE, displayId,
+                            focusedToken, /* flags = */0);
+                }
+                break;
+            case KeyEvent.KEYCODE_ESCAPE:
+                if (down && KeyEvent.metaStateHasNoModifiers(metaState) && repeatCount == 0) {
+                    return handleKeyGesture(deviceId, new int[]{keyCode}, /* modifierState = */0,
+                            KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS,
+                            KeyGestureEvent.ACTION_GESTURE_COMPLETE, displayId,
+                            focusedToken, /* flags = */0);
+                }
+                break;
+        }
+
+        return false;
+    }
+
+    private boolean handleKeyGesture(int[] keycodes,
+            @KeyGestureEvent.KeyGestureType int gestureType, int action, int flags) {
+        return handleKeyGesture(KeyCharacterMap.VIRTUAL_KEYBOARD, keycodes, /* modifierState= */0,
+                gestureType, action, Display.DEFAULT_DISPLAY, /* focusedToken = */null, flags);
+    }
+
     @VisibleForTesting
     boolean handleKeyGesture(int deviceId, int[] keycodes, int modifierState,
             @KeyGestureEvent.KeyGestureType int gestureType, int action, int displayId,
-            IBinder focusedToken, int flags) {
+            @Nullable IBinder focusedToken, int flags) {
         return handleKeyGesture(createKeyGestureEvent(deviceId, keycodes,
                 modifierState, gestureType, action, displayId, flags), focusedToken);
     }
@@ -628,7 +984,7 @@
     @MainThread
     private void notifyKeyGestureEvent(AidlKeyGestureEvent event) {
         InputDevice device = getInputDevice(event.deviceId);
-        if (device == null || device.isVirtual()) {
+        if (device == null) {
             return;
         }
         if (event.action == KeyGestureEvent.ACTION_GESTURE_COMPLETE) {
@@ -822,6 +1178,27 @@
         }
     }
 
+    private class SettingsObserver extends ContentObserver {
+        private SettingsObserver(Handler handler) {
+            super(handler);
+        }
+
+        private void observe() {
+            ContentResolver resolver = mContext.getContentResolver();
+            resolver.registerContentObserver(Settings.Secure.getUriFor(
+                            Settings.Secure.VOLUME_HUSH_GESTURE), false, this,
+                    UserHandle.USER_ALL);
+            resolver.registerContentObserver(Settings.Global.getUriFor(
+                            Settings.Global.KEY_CHORD_POWER_VOLUME_UP), false, this,
+                    UserHandle.USER_ALL);
+        }
+
+        @Override
+        public void onChange(boolean selfChange) {
+            initBehaviorsFromSettings();
+        }
+    }
+
     @Nullable
     private InputDevice getInputDevice(int deviceId) {
         InputManager inputManager = mContext.getSystemService(InputManager.class);
@@ -851,6 +1228,8 @@
         ipw.println("mPendingHideRecentSwitcher = " + mPendingHideRecentSwitcher);
         ipw.println("mSearchKeyBehavior = " + mSearchKeyBehavior);
         ipw.println("mSettingsKeyBehavior = " + mSettingsKeyBehavior);
+        ipw.println("mRingerToggleChord = " + mRingerToggleChord);
+        ipw.println("mPowerVolUpBehavior = " + mPowerVolUpBehavior);
         ipw.print("mKeyGestureEventListenerRecords = {");
         synchronized (mKeyGestureEventListenerRecords) {
             int size = mKeyGestureEventListenerRecords.size();
@@ -881,5 +1260,6 @@
             ipw.println(ev);
         }
         ipw.decreaseIndent();
+        mKeyCombinationManager.dump("", ipw);
     }
 }
diff --git a/services/core/java/com/android/server/input/NativeInputManagerService.java b/services/core/java/com/android/server/input/NativeInputManagerService.java
index d17e256..4404d63 100644
--- a/services/core/java/com/android/server/input/NativeInputManagerService.java
+++ b/services/core/java/com/android/server/input/NativeInputManagerService.java
@@ -141,7 +141,7 @@
 
     void setShowTouches(boolean enabled);
 
-    void setInteractive(boolean interactive);
+    void setNonInteractiveDisplays(int[] displayIds);
 
     void reloadCalibration();
 
@@ -409,7 +409,7 @@
         public native void setShowTouches(boolean enabled);
 
         @Override
-        public native void setInteractive(boolean interactive);
+        public native void setNonInteractiveDisplays(int[] displayIds);
 
         @Override
         public native void reloadCalibration();
diff --git a/services/core/java/com/android/server/inputmethod/HardwareKeyboardShortcutController.java b/services/core/java/com/android/server/inputmethod/HardwareKeyboardShortcutController.java
index 41313fa..ef1220f 100644
--- a/services/core/java/com/android/server/inputmethod/HardwareKeyboardShortcutController.java
+++ b/services/core/java/com/android/server/inputmethod/HardwareKeyboardShortcutController.java
@@ -33,9 +33,6 @@
     @GuardedBy("ImfLock.class")
     private final ArrayList<InputMethodSubtypeHandle> mSubtypeHandles = new ArrayList<>();
 
-    HardwareKeyboardShortcutController() {
-    }
-
     @GuardedBy("ImfLock.class")
     void update(@NonNull InputMethodSettings settings) {
         mSubtypeHandles.clear();
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodDeviceConfigs.java b/services/core/java/com/android/server/inputmethod/InputMethodDeviceConfigs.java
index 6cd2493..fc4c0fc 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodDeviceConfigs.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodDeviceConfigs.java
@@ -40,6 +40,7 @@
                 if (KEY_HIDE_IME_WHEN_NO_EDITOR_FOCUS.equals(name)) {
                     mHideImeWhenNoEditorFocus = properties.getBoolean(name,
                             true /* defaultValue */);
+                    break;
                 }
             }
         };
diff --git a/services/core/java/com/android/server/inputmethod/ZeroJankProxy.java b/services/core/java/com/android/server/inputmethod/ZeroJankProxy.java
index 214aa1d..49d4332 100644
--- a/services/core/java/com/android/server/inputmethod/ZeroJankProxy.java
+++ b/services/core/java/com/android/server/inputmethod/ZeroJankProxy.java
@@ -394,6 +394,7 @@
                                     flags),
                     this::offload).get();
         } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
             throw new RuntimeException(e);
         } catch (ExecutionException e) {
             throw new RuntimeException(e);
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java b/services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java
index 91a4d6f..598901e 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java
@@ -764,6 +764,7 @@
     boolean hasPermissions(List<String> permissions) {
         for (String permission : permissions) {
             if (mContext.checkPermission(permission, mPid, mUid) != PERMISSION_GRANTED) {
+                Log.e(TAG, "no permission for " + permission);
                 return false;
             }
         }
@@ -919,6 +920,14 @@
             }
         }
         if (curAuthState != newAuthState) {
+            if (newAuthState == AUTHORIZATION_DENIED
+                    || newAuthState == AUTHORIZATION_DENIED_GRACE_PERIOD) {
+                Log.e(TAG, "updateNanoAppAuthState auth error: "
+                        + Long.toHexString(nanoAppId) + ", "
+                        + nanoappPermissions + ", "
+                        + gracePeriodExpired + ", "
+                        + forceDenied);
+            }
             // Don't send the callback in the synchronized block or it could end up in a deadlock.
             sendAuthStateCallback(nanoAppId, newAuthState);
         }
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 3780fbd..bbdac56 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -99,6 +99,7 @@
 import android.os.ResultReceiver;
 import android.os.ServiceManager;
 import android.os.ShellCallback;
+import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -126,6 +127,7 @@
 import android.util.ArraySet;
 import android.util.Log;
 import android.util.LongSparseArray;
+import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.SparseIntArray;
@@ -253,6 +255,8 @@
     private static final String MIGRATED_KEYSTORE_NS = "migrated_keystore_namespace";
     private static final String MIGRATED_SP_CE_ONLY = "migrated_all_users_to_sp_and_bound_ce";
     private static final String MIGRATED_SP_FULL = "migrated_all_users_to_sp_and_bound_keys";
+    private static final String MIGRATED_WEAVER_DISABLED_ON_UNSECURED_USERS =
+            "migrated_weaver_disabled_on_unsecured_users";
 
     // Duration that LockSettingsService will store the gatekeeper password for. This allows
     // multiple biometric enrollments without prompting the user to enter their password via
@@ -309,6 +313,10 @@
     @GuardedBy("mUserCreationAndRemovalLock")
     private boolean mThirdPartyAppsStarted;
 
+    // This list contains the (protectorId, userId) of any protectors that were by replaced by a
+    // migration and should be destroyed once rollback to the old build is no longer possible.
+    private ArrayList<Pair<Long, Integer>> mProtectorsToDestroyOnBootCompleted = new ArrayList<>();
+
     // Current password metrics for all secured users on the device. Updated when user unlocks the
     // device or changes password. Removed if user is stopped with its CE key evicted.
     @GuardedBy("this")
@@ -363,6 +371,10 @@
                 mLockSettingsService.migrateOldDataAfterSystemReady();
                 mLockSettingsService.deleteRepairModePersistentDataIfNeeded();
             } else if (phase == PHASE_BOOT_COMPLETED) {
+                // In the case of an upgrade, PHASE_BOOT_COMPLETED means that a rollback to the old
+                // build can no longer occur.  This is the time to destroy any migrated protectors.
+                mLockSettingsService.destroyMigratedProtectors();
+
                 mLockSettingsService.loadEscrowData();
             }
         }
@@ -1076,6 +1088,11 @@
         mStorage.deleteRepairModePersistentData();
     }
 
+    private boolean isWeaverDisabledOnUnsecuredUsers() {
+        return mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_disableWeaverOnUnsecuredUsers);
+    }
+
     // This is called when Weaver is guaranteed to be available (if the device supports Weaver).
     // It does any synthetic password related work that was delayed from earlier in the boot.
     private void onThirdPartyAppsStarted() {
@@ -1114,13 +1131,20 @@
             //
             // - Upgrading from Android 14, where unsecured users didn't have Keystore super keys.
             //
+            // - Upgrading from a build with config_disableWeaverOnUnsecuredUsers=false to one with
+            //   config_disableWeaverOnUnsecuredUsers=true.  (We don't bother to proactively add
+            //   Weaver for the reverse update to false, as it's too late to help in that case.)
+            //
             // The end result is that all users, regardless of whether they are secured or not, have
-            // a synthetic password with all keys initialized and protected by it.
+            // a synthetic password with all keys initialized and protected by it, and honoring
+            // config_disableWeaverOnUnsecuredUsers=true when applicable.
             //
             // Note: if this migration gets interrupted (e.g. by the device powering off), there
             // shouldn't be a problem since this will run again on the next boot, and
             // setCeStorageProtection() and initKeystoreSuperKeys(..., true) are idempotent.
-            if (!getBoolean(MIGRATED_SP_FULL, false, 0)) {
+            if (!getBoolean(MIGRATED_SP_FULL, false, 0)
+                    || (isWeaverDisabledOnUnsecuredUsers()
+                        && !getBoolean(MIGRATED_WEAVER_DISABLED_ON_UNSECURED_USERS, false, 0))) {
                 for (UserInfo user : mUserManager.getAliveUsers()) {
                     removeStateForReusedUserIdIfNecessary(user.id, user.serialNumber);
                     synchronized (mSpManager) {
@@ -1128,6 +1152,9 @@
                     }
                 }
                 setBoolean(MIGRATED_SP_FULL, true, 0);
+                if (isWeaverDisabledOnUnsecuredUsers()) {
+                    setBoolean(MIGRATED_WEAVER_DISABLED_ON_UNSECURED_USERS, true, 0);
+                }
             }
 
             mThirdPartyAppsStarted = true;
@@ -1151,13 +1178,61 @@
                 getGateKeeperService(), protectorId, LockscreenCredential.createNone(), userId,
                 null);
         SyntheticPassword sp = result.syntheticPassword;
-        if (sp == null) {
+        if (isWeaverDisabledOnUnsecuredUsers()) {
+            Slog.i(TAG, "config_disableWeaverOnUnsecuredUsers=true");
+
+            // If config_disableWeaverOnUnsecuredUsers=true, then the Weaver HAL may be buggy and
+            // need multiple retries before it works here to unwrap the SP, if the SP was already
+            // protected by Weaver.  Note that the problematic HAL can also deadlock if called with
+            // the ActivityManagerService lock held, but that should not be a problem here since
+            // that lock isn't held here, unlike unlockUserKeyIfUnsecured() where it is.
+            for (int i = 0; i < 12 && sp == null; i++) {
+                Slog.e(TAG, "Failed to unwrap synthetic password. Waiting 5 seconds to retry.");
+                SystemClock.sleep(5000);
+                result = mSpManager.unlockLskfBasedProtector(getGateKeeperService(), protectorId,
+                            LockscreenCredential.createNone(), userId, null);
+                sp = result.syntheticPassword;
+            }
+            if (sp == null) {
+                throw new IllegalStateException(
+                        "Failed to unwrap synthetic password for unsecured user");
+            }
+            // If the SP is protected by Weaver, then remove the Weaver protection in order to make
+            // config_disableWeaverOnUnsecuredUsers=true take effect.
+            if (result.usedWeaver) {
+                Slog.i(TAG, "Removing Weaver protection from the synthetic password");
+                // Create a new protector, which will not use Weaver.
+                long newProtectorId = mSpManager.createLskfBasedProtector(
+                        getGateKeeperService(), LockscreenCredential.createNone(), sp, userId);
+
+                // Out of paranoia, make sure the new protector really works.
+                result = mSpManager.unlockLskfBasedProtector(getGateKeeperService(),
+                            newProtectorId, LockscreenCredential.createNone(), userId, null);
+                sp = result.syntheticPassword;
+                if (sp == null) {
+                    throw new IllegalStateException("New SP protector does not work");
+                }
+
+                // Replace the protector.  Wait until PHASE_BOOT_COMPLETED to destroy the old
+                // protector, since the Weaver slot erasure and freeing cannot be rolled back.
+                setCurrentLskfBasedProtectorId(newProtectorId, userId);
+                mProtectorsToDestroyOnBootCompleted.add(new Pair(protectorId, userId));
+            } else {
+                Slog.i(TAG, "Synthetic password is already not protected by Weaver");
+            }
+        } else if (sp == null) {
             Slogf.wtf(TAG, "Failed to unwrap synthetic password for unsecured user %d", userId);
             return;
         }
-        // While setCeStorageProtection() is idempotent, it does log some error messages when called
-        // again.  Skip it if we know it was already handled by an earlier upgrade to Android 14.
-        if (getString(MIGRATED_SP_CE_ONLY, null, 0) == null) {
+
+        // Call setCeStorageProtection(), to re-encrypt the CE key with the SP if it's currently
+        // encrypted by an empty secret.  Skip this if it was definitely already done as part of the
+        // upgrade to Android 14, since while setCeStorageProtection() is idempotent it does log
+        // some error messages when called again.  Do not skip this if
+        // config_disableWeaverOnUnsecuredUsers=true, since in that case we'd like to recover from
+        // the case where an earlier upgrade to Android 14 incorrectly skipped this step.
+        if (getString(MIGRATED_SP_CE_ONLY, null, 0) == null
+                || isWeaverDisabledOnUnsecuredUsers()) {
             Slogf.i(TAG, "Encrypting CE key of user %d with synthetic password", userId);
             setCeStorageProtection(userId, sp);
         }
@@ -1165,6 +1240,17 @@
         initKeystoreSuperKeys(userId, sp, /* allowExisting= */ true);
     }
 
+    private void destroyMigratedProtectors() {
+        if (!mProtectorsToDestroyOnBootCompleted.isEmpty()) {
+            synchronized (mSpManager) {
+                for (Pair<Long, Integer> pair : mProtectorsToDestroyOnBootCompleted) {
+                    mSpManager.destroyLskfBasedProtector(pair.first, pair.second);
+                }
+            }
+        }
+        mProtectorsToDestroyOnBootCompleted = null; // The list is no longer needed.
+    }
+
     /**
      * Returns the lowest password quality that still presents the same UI for entering it.
      *
diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
index 3a429b0..47788f2 100644
--- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
+++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
@@ -195,6 +195,8 @@
         // ERROR: password / token fails verification
         // RETRY: password / token verification is throttled at the moment.
         @Nullable public VerifyCredentialResponse gkResponse;
+        // For unlockLskfBasedProtector() this is set to true if the protector uses Weaver.
+        public boolean usedWeaver;
     }
 
     /**
@@ -532,6 +534,11 @@
                 Settings.Global.DEVICE_PROVISIONED, 0) != 0;
     }
 
+    private boolean isWeaverDisabledOnUnsecuredUsers() {
+        return mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_disableWeaverOnUnsecuredUsers);
+    }
+
     @VisibleForTesting
     protected android.hardware.weaver.V1_0.IWeaver getWeaverHidlService() throws RemoteException {
         try {
@@ -1011,7 +1018,13 @@
 
         Slogf.i(TAG, "Creating LSKF-based protector %016x for user %d", protectorId, userId);
 
-        final IWeaver weaver = getWeaverService();
+        final IWeaver weaver;
+        if (credential.isNone() && isWeaverDisabledOnUnsecuredUsers()) {
+            weaver = null;
+            Slog.w(TAG, "Not using Weaver for unsecured user (disabled by config)");
+        } else {
+            weaver = getWeaverService();
+        }
         if (weaver != null) {
             // Weaver is available, so make the protector use it to verify the LSKF.  Do this even
             // if the LSKF is empty, as that gives us support for securely deleting the protector.
@@ -1404,6 +1417,7 @@
         int weaverSlot = loadWeaverSlot(protectorId, userId);
         if (weaverSlot != INVALID_WEAVER_SLOT) {
             // Protector uses Weaver to verify the LSKF
+            result.usedWeaver = true;
             final IWeaver weaver = getWeaverService();
             if (weaver == null) {
                 Slog.e(TAG, "Protector uses Weaver, but Weaver is unavailable");
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index e1b8e9f..d1d5d48 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -1112,19 +1112,12 @@
                 continue;
             }
 
-            Log.w(
-                    TAG,
-                    TextUtils.formatSimple(
-                            "Revoking access to manager record id: %d, package: %s, userId:"
-                                    + " %d",
-                            manager.mManagerId, manager.mOwnerPackageName, userRecord.mUserId));
-
+            Slog.w(TAG, "Revoking access for " + manager.getDebugString());
             unregisterManagerLocked(manager.mManager, /* died */ false);
-
             try {
                 manager.mManager.invalidateInstance();
             } catch (RemoteException ex) {
-                Slog.w(TAG, "Failed to notify manager= " + manager + " of permission revocation.");
+                manager.logRemoteException("invalidateInstance", ex);
             }
         }
     }
@@ -1653,9 +1646,11 @@
                             manager));
         }
 
+        List<MediaRoute2Info> routes =
+                userRecord.mHandler.mLastNotifiedRoutesToPrivilegedRouters.values().stream()
+                        .toList();
         userRecord.mHandler.sendMessage(
-                obtainMessage(
-                        UserHandler::notifyInitialRoutesToManager, userRecord.mHandler, manager));
+                obtainMessage(ManagerRecord::notifyRoutesUpdated, managerRecord, routes));
     }
 
     @GuardedBy("mLock")
@@ -2426,13 +2421,57 @@
             try {
                 mManager.notifyRequestFailed(requestId, reason);
             } catch (RemoteException ex) {
-                Slog.w(
-                        TAG,
-                        "Failed to notify manager of the request failure. Manager probably died.",
-                        ex);
+                logRemoteException("notifyRequestFailed", ex);
             }
         }
 
+        /**
+         * Notifies the corresponding manager of the availability of the given routes.
+         *
+         * @param routes The routes available to the manager that corresponds to this record.
+         */
+        public void notifyRoutesUpdated(List<MediaRoute2Info> routes) {
+            try {
+                mManager.notifyRoutesUpdated(routes);
+            } catch (RemoteException ex) {
+                logRemoteException("notifyRoutesUpdated", ex);
+            }
+        }
+
+        /**
+         * Notifies the corresponding manager of an update in the given session.
+         *
+         * @param sessionInfo The updated session info.
+         */
+        public void notifySessionUpdated(RoutingSessionInfo sessionInfo) {
+            try {
+                mManager.notifySessionUpdated(sessionInfo);
+            } catch (RemoteException ex) {
+                logRemoteException("notifySessionUpdated", ex);
+            }
+        }
+
+        /**
+         * Notifies the corresponding manager that the given session has been released.
+         *
+         * @param sessionInfo The released session info.
+         */
+        public void notifySessionReleased(RoutingSessionInfo sessionInfo) {
+            try {
+                mManager.notifySessionReleased(sessionInfo);
+            } catch (RemoteException ex) {
+                logRemoteException("notifySessionReleased", ex);
+            }
+        }
+
+        private void logRemoteException(String operation, RemoteException exception) {
+            String message =
+                    TextUtils.formatSimple(
+                            "%s failed for %s due to %s",
+                            operation, getDebugString(), exception.toString());
+            Slog.w(TAG, message);
+        }
+
         private void updateScanningState(@ScanningState int scanningState) {
             if (mScanningState == scanningState) {
                 return;
@@ -2445,9 +2484,16 @@
                             UserHandler::updateDiscoveryPreferenceOnHandler, mUserRecord.mHandler));
         }
 
-        @Override
-        public String toString() {
-            return "Manager " + mOwnerPackageName + " (pid " + mOwnerPid + ")";
+        /** Returns a human readable representation of this manager record for logging purposes. */
+        public String getDebugString() {
+            return TextUtils.formatSimple(
+                    "Manager %s (id=%d,pid=%d,userId=%d,uid=%d,targetPkg=%s)",
+                    mOwnerPackageName,
+                    mManagerId,
+                    mOwnerPid,
+                    mUserRecord.mUserId,
+                    mOwnerUid,
+                    mTargetPackageName);
         }
     }
 
@@ -2761,18 +2807,20 @@
                     getRouterRecords(/* hasSystemRoutingPermission= */ true);
             List<RouterRecord> routerRecordsWithoutSystemRoutingPermission =
                     getRouterRecords(/* hasSystemRoutingPermission= */ false);
-            List<IMediaRouter2Manager> managers = getManagers();
+            List<ManagerRecord> managers = getManagerRecords();
 
             // Managers receive all provider updates with all routes.
-            notifyRoutesUpdatedToManagers(
-                    managers, new ArrayList<>(mLastNotifiedRoutesToPrivilegedRouters.values()));
+            List<MediaRoute2Info> routesForPrivilegedRouters =
+                    mLastNotifiedRoutesToPrivilegedRouters.values().stream().toList();
+            for (ManagerRecord manager : managers) {
+                manager.notifyRoutesUpdated(routesForPrivilegedRouters);
+            }
 
             // Routers with system routing access (either via {@link MODIFY_AUDIO_ROUTING} or
             // {@link BLUETOOTH_CONNECT} + {@link BLUETOOTH_SCAN}) receive all provider updates
             // with all routes.
             notifyRoutesUpdatedToRouterRecords(
-                    routerRecordsWithSystemRoutingPermission,
-                    new ArrayList<>(mLastNotifiedRoutesToPrivilegedRouters.values()));
+                    routerRecordsWithSystemRoutingPermission, routesForPrivilegedRouters);
 
             if (!isSystemProvider) {
                 // Regular routers receive updates from all non-system providers with all non-system
@@ -3068,8 +3116,10 @@
 
         private void onSessionInfoChangedOnHandler(@NonNull MediaRoute2Provider provider,
                 @NonNull RoutingSessionInfo sessionInfo) {
-            List<IMediaRouter2Manager> managers = getManagers();
-            notifySessionUpdatedToManagers(managers, sessionInfo);
+            List<ManagerRecord> managers = getManagerRecords();
+            for (ManagerRecord manager : managers) {
+                manager.notifySessionUpdated(sessionInfo);
+            }
 
             // For system provider, notify all routers.
             if (provider == mSystemProvider) {
@@ -3093,8 +3143,10 @@
 
         private void onSessionReleasedOnHandler(@NonNull MediaRoute2Provider provider,
                 @NonNull RoutingSessionInfo sessionInfo) {
-            List<IMediaRouter2Manager> managers = getManagers();
-            notifySessionReleasedToManagers(managers, sessionInfo);
+            List<ManagerRecord> managers = getManagerRecords();
+            for (ManagerRecord manager : managers) {
+                manager.notifySessionReleased(sessionInfo);
+            }
 
             RouterRecord routerRecord = mSessionToRouterMap.get(sessionInfo.getId());
             if (routerRecord == null) {
@@ -3169,20 +3221,6 @@
             return true;
         }
 
-        private List<IMediaRouter2Manager> getManagers() {
-            final List<IMediaRouter2Manager> managers = new ArrayList<>();
-            MediaRouter2ServiceImpl service = mServiceRef.get();
-            if (service == null) {
-                return managers;
-            }
-            synchronized (service.mLock) {
-                for (ManagerRecord managerRecord : mUserRecord.mManagerRecords) {
-                    managers.add(managerRecord.mManager);
-                }
-            }
-            return managers;
-        }
-
         private List<RouterRecord> getRouterRecords() {
             MediaRouter2ServiceImpl service = mServiceRef.get();
             if (service == null) {
@@ -3269,37 +3307,6 @@
             }
         }
 
-        /**
-         * Notifies {@code manager} with all known routes. This only happens once after {@code
-         * manager} is registered through {@link #registerManager(IMediaRouter2Manager, String)
-         * registerManager()}.
-         *
-         * @param manager {@link IMediaRouter2Manager} to be notified.
-         */
-        private void notifyInitialRoutesToManager(@NonNull IMediaRouter2Manager manager) {
-            if (mLastNotifiedRoutesToPrivilegedRouters.isEmpty()) {
-                return;
-            }
-            try {
-                manager.notifyRoutesUpdated(
-                        new ArrayList<>(mLastNotifiedRoutesToPrivilegedRouters.values()));
-            } catch (RemoteException ex) {
-                Slog.w(TAG, "Failed to notify all routes. Manager probably died.", ex);
-            }
-        }
-
-        private void notifyRoutesUpdatedToManagers(
-                @NonNull List<IMediaRouter2Manager> managers,
-                @NonNull List<MediaRoute2Info> routes) {
-            for (IMediaRouter2Manager manager : managers) {
-                try {
-                    manager.notifyRoutesUpdated(routes);
-                } catch (RemoteException ex) {
-                    Slog.w(TAG, "Failed to notify routes changed. Manager probably died.", ex);
-                }
-            }
-        }
-
         private void notifySessionCreatedToManagers(long managerRequestId,
                 @NonNull RoutingSessionInfo session) {
             int requesterId = toRequesterId(managerRequestId);
@@ -3317,32 +3324,6 @@
             }
         }
 
-        private void notifySessionUpdatedToManagers(
-                @NonNull List<IMediaRouter2Manager> managers,
-                @NonNull RoutingSessionInfo sessionInfo) {
-            for (IMediaRouter2Manager manager : managers) {
-                try {
-                    manager.notifySessionUpdated(sessionInfo);
-                } catch (RemoteException ex) {
-                    Slog.w(TAG, "notifySessionUpdatedToManagers: "
-                            + "Failed to notify. Manager probably died.", ex);
-                }
-            }
-        }
-
-        private void notifySessionReleasedToManagers(
-                @NonNull List<IMediaRouter2Manager> managers,
-                @NonNull RoutingSessionInfo sessionInfo) {
-            for (IMediaRouter2Manager manager : managers) {
-                try {
-                    manager.notifySessionReleased(sessionInfo);
-                } catch (RemoteException ex) {
-                    Slog.w(TAG, "notifySessionReleasedToManagers: "
-                            + "Failed to notify. Manager probably died.", ex);
-                }
-            }
-        }
-
         private void notifyDiscoveryPreferenceChangedToManager(@NonNull RouterRecord routerRecord,
                 @NonNull IMediaRouter2Manager manager) {
             try {
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index 0a9109b..d752429 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -16,7 +16,6 @@
 
 package com.android.server.media;
 
-import static android.media.MediaRoute2Info.PLAYBACK_VOLUME_FIXED;
 import static android.media.VolumeProvider.VOLUME_CONTROL_ABSOLUTE;
 import static android.media.VolumeProvider.VOLUME_CONTROL_FIXED;
 import static android.media.VolumeProvider.VOLUME_CONTROL_RELATIVE;
@@ -48,9 +47,7 @@
 import android.media.AudioManager;
 import android.media.AudioSystem;
 import android.media.MediaMetadata;
-import android.media.MediaRouter2Manager;
 import android.media.Rating;
-import android.media.RoutingSessionInfo;
 import android.media.VolumeProvider;
 import android.media.session.ISession;
 import android.media.session.ISessionCallback;
@@ -186,7 +183,6 @@
     private final MediaSessionService mService;
     private final UriGrantsManagerInternal mUgmInternal;
     private final Context mContext;
-    private final boolean mVolumeAdjustmentForRemoteGroupSessions;
 
     private final ForegroundServiceDelegationOptions mForegroundServiceDelegationOptions;
 
@@ -311,8 +307,6 @@
         mAudioAttrs = DEFAULT_ATTRIBUTES;
         mPolicies = policies;
         mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);
-        mVolumeAdjustmentForRemoteGroupSessions = mContext.getResources().getBoolean(
-                com.android.internal.R.bool.config_volumeAdjustmentForRemoteGroupSessions);
 
         mForegroundServiceDelegationOptions = createForegroundServiceDelegationOptions();
 
@@ -659,49 +653,7 @@
             }
             return false;
         }
-        if (mVolumeAdjustmentForRemoteGroupSessions) {
-            if (DEBUG) {
-                Slog.d(
-                        TAG,
-                        "Volume adjustment for remote group sessions allowed so MediaSessionRecord"
-                                + " can handle volume key");
-            }
-            return true;
-        }
-        // See b/228021646 for details.
-        MediaRouter2Manager mRouter2Manager = MediaRouter2Manager.getInstance(mContext);
-        List<RoutingSessionInfo> sessions = mRouter2Manager.getRoutingSessions(mPackageName);
-        boolean foundNonSystemSession = false;
-        boolean remoteSessionAllowVolumeAdjustment = true;
-        if (DEBUG) {
-            Slog.d(
-                    TAG,
-                    "Found "
-                            + sessions.size()
-                            + " routing sessions for package name "
-                            + mPackageName);
-        }
-        for (RoutingSessionInfo session : sessions) {
-            if (DEBUG) {
-                Slog.d(TAG, "Found routingSessionInfo: " + session);
-            }
-            if (!session.isSystemSession()) {
-                foundNonSystemSession = true;
-                if (session.getVolumeHandling() == PLAYBACK_VOLUME_FIXED) {
-                    remoteSessionAllowVolumeAdjustment = false;
-                }
-            }
-        }
-        if (!foundNonSystemSession) {
-            if (DEBUG) {
-                Slog.d(
-                        TAG,
-                        "Package " + mPackageName
-                                + " has a remote media session but no associated routing session");
-            }
-        }
-
-        return foundNonSystemSession && remoteSessionAllowVolumeAdjustment;
+        return true;
     }
 
     @Override
diff --git a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
index 48d24f2..e7e519e 100644
--- a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
+++ b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
@@ -42,6 +42,8 @@
 import android.app.IProcessObserver;
 import android.app.KeyguardManager;
 import android.app.compat.CompatChanges;
+import android.app.role.RoleManager;
+import android.companion.AssociationRequest;
 import android.compat.annotation.ChangeId;
 import android.compat.annotation.EnabledSince;
 import android.content.ComponentName;
@@ -94,7 +96,7 @@
 
 /**
  * Manages MediaProjection sessions.
- *
+ * <p>
  * The {@link MediaProjectionManagerService} manages the creation and lifetime of MediaProjections,
  * as well as the capabilities they grant. Any service using MediaProjection tokens as permission
  * grants <b>must</b> validate the token before use by calling {@link
@@ -137,6 +139,7 @@
     private final PackageManager mPackageManager;
     private final WindowManagerInternal mWmInternal;
     private final KeyguardManager mKeyguardManager;
+    private final RoleManager mRoleManager;
 
     private final MediaRouter mMediaRouter;
     private final MediaRouterCallback mMediaRouterCallback;
@@ -173,6 +176,7 @@
         mKeyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
         mKeyguardManager.addKeyguardLockedStateListener(
                 mContext.getMainExecutor(), this::onKeyguardLockedStateChanged);
+        mRoleManager = mContext.getSystemService(RoleManager.class);
         Watchdog.getInstance().addMonitor(this);
     }
 
@@ -182,6 +186,7 @@
      *   - be one of the bugreport allowlisted packages, or
      *   - hold the OP_PROJECT_MEDIA AppOp.
      */
+    @SuppressWarnings("BooleanMethodIsAlwaysInverted")
     private boolean canCaptureKeyguard() {
         if (!android.companion.virtualdevice.flags.Flags.mediaProjectionKeyguardRestrictions()) {
             return true;
@@ -193,14 +198,23 @@
             if (mPackageManager.checkPermission(RECORD_SENSITIVE_CONTENT,
                     mProjectionGrant.packageName)
                     == PackageManager.PERMISSION_GRANTED) {
+                Slog.v(TAG,
+                        "Allowing keyguard capture for package with RECORD_SENSITIVE_CONTENT "
+                                + "permission");
                 return true;
             }
-            boolean operationActive = mAppOps.isOperationActive(AppOpsManager.OP_PROJECT_MEDIA,
-                    mProjectionGrant.uid,
-                    mProjectionGrant.packageName);
-            if (operationActive) {
+            if (AppOpsManager.MODE_ALLOWED == mAppOps.noteOpNoThrow(AppOpsManager.OP_PROJECT_MEDIA,
+                    mProjectionGrant.uid, mProjectionGrant.packageName, /* attributionTag= */ null,
+                    "recording lockscreen")) {
                 // Some tools use media projection by granting the OP_PROJECT_MEDIA app
                 // op via a shell command. Those tools can be granted keyguard capture
+                Slog.v(TAG,
+                        "Allowing keyguard capture for package with OP_PROJECT_MEDIA AppOp ");
+                return true;
+            }
+            if (isProjectionAppHoldingAppStreamingRoleLocked()) {
+                Slog.v(TAG,
+                        "Allowing keyguard capture for package holding app streaming role.");
                 return true;
             }
             return SystemConfig.getInstance().getBugreportWhitelistedPackages()
@@ -699,6 +713,20 @@
         }
     }
 
+    /**
+     * Application holding the app streaming role
+     * ({@value AssociationRequest#DEVICE_PROFILE_APP_STREAMING}) are allowed to record the
+     * lockscreen.
+     *
+     * @return true if the is held by the recording application.
+     */
+    @GuardedBy("mLock")
+    private boolean isProjectionAppHoldingAppStreamingRoleLocked() {
+        return mRoleManager.getRoleHoldersAsUser(AssociationRequest.DEVICE_PROFILE_APP_STREAMING,
+                        mContext.getUser())
+                .contains(mProjectionGrant.packageName);
+    }
+
     private void dump(final PrintWriter pw) {
         pw.println("MEDIA PROJECTION MANAGER (dumpsys media_projection)");
         synchronized (mLock) {
diff --git a/services/core/java/com/android/server/notification/GroupHelper.java b/services/core/java/com/android/server/notification/GroupHelper.java
index 9d30c56..9b9be4c 100644
--- a/services/core/java/com/android/server/notification/GroupHelper.java
+++ b/services/core/java/com/android/server/notification/GroupHelper.java
@@ -832,8 +832,9 @@
                                       FullyQualifiedGroupKey newGroup) { }
 
     /**
-     * Called when a notification channel is updated, so that this helper can adjust
-     * the aggregate groups by moving children if their section has changed.
+     * Called when a notification channel is updated (channel attributes have changed),
+     * so that this helper can adjust the aggregate groups by moving children
+     * if their section has changed.
      * see {@link #onNotificationPostedWithDelay(NotificationRecord, List, Map)}
      * @param userId the userId of the channel
      * @param pkgName the channel's package
@@ -853,24 +854,48 @@
                 }
             }
 
-            // The list of notification operations required after the channel update
-            final ArrayList<NotificationMoveOp> notificationsToMove = new ArrayList<>();
+            regroupNotifications(userId, pkgName, notificationsToCheck);
+        }
+    }
 
-            // Check any already auto-grouped notifications that may need to be re-grouped
-            // after the channel update
-            notificationsToMove.addAll(
-                    getAutogroupedNotificationsMoveOps(userId, pkgName,
-                        notificationsToCheck));
+    /**
+     * Called when an individuial notification's channel is updated (moved to a new channel),
+     * so that this helper can adjust the aggregate groups by moving children
+     * if their section has changed.
+     * see {@link #onNotificationPostedWithDelay(NotificationRecord, List, Map)}
+     *
+     * @param record the notification which had its channel updated
+     */
+    @FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_FORCE_GROUPING)
+    public void onChannelUpdated(final NotificationRecord record) {
+        synchronized (mAggregatedNotifications) {
+            ArrayMap<String, NotificationRecord> notificationsToCheck = new ArrayMap<>();
+            notificationsToCheck.put(record.getKey(), record);
+            regroupNotifications(record.getUserId(), record.getSbn().getPackageName(),
+                    notificationsToCheck);
+        }
+    }
 
-            // Check any ungrouped notifications that may need to be auto-grouped
-            // after the channel update
-            notificationsToMove.addAll(
-                    getUngroupedNotificationsMoveOps(userId, pkgName, notificationsToCheck));
+    @GuardedBy("mAggregatedNotifications")
+    private void regroupNotifications(int userId, String pkgName,
+            ArrayMap<String, NotificationRecord> notificationsToCheck) {
+        // The list of notification operations required after the channel update
+        final ArrayList<NotificationMoveOp> notificationsToMove = new ArrayList<>();
 
-            // Batch move to new section
-            if (!notificationsToMove.isEmpty()) {
-                moveNotificationsToNewSection(userId, pkgName, notificationsToMove);
-            }
+        // Check any already auto-grouped notifications that may need to be re-grouped
+        // after the channel update
+        notificationsToMove.addAll(
+                getAutogroupedNotificationsMoveOps(userId, pkgName,
+                    notificationsToCheck));
+
+        // Check any ungrouped notifications that may need to be auto-grouped
+        // after the channel update
+        notificationsToMove.addAll(
+                getUngroupedNotificationsMoveOps(userId, pkgName, notificationsToCheck));
+
+        // Batch move to new section
+        if (!notificationsToMove.isEmpty()) {
+            moveNotificationsToNewSection(userId, pkgName, notificationsToMove);
         }
     }
 
@@ -1435,6 +1460,10 @@
                 return false;
             }
 
+            if (record.getSbn().getNotification().isMediaNotification()) {
+                return false;
+            }
+
             return true;
         }
     }
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index 03fc60c..cd0a2a7 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -106,7 +106,8 @@
     protected final String TAG = getClass().getSimpleName().replace('$', '.');
     protected final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
-    private static final int ON_BINDING_DIED_REBIND_DELAY_MS = 10000;
+    protected static final int ON_BINDING_DIED_REBIND_DELAY_MS = 10000;
+    protected static final int ON_BINDING_DIED_REBIND_MSG = 1234;
     protected static final String ENABLED_SERVICES_SEPARATOR = ":";
     private static final String DB_VERSION_1 = "1";
     private static final String DB_VERSION_2 = "2";
@@ -856,7 +857,13 @@
             String approvedItem = getApprovedValue(pkgOrComponent);
 
             if (approvedItem != null) {
+                final ComponentName component = ComponentName.unflattenFromString(approvedItem);
                 if (enabled) {
+                    if (component != null && !isValidService(component, userId)) {
+                        Log.e(TAG, "Skip allowing " + mConfig.caption + " " + pkgOrComponent
+                                + " (userSet: " + userSet + ") for invalid service");
+                        return;
+                    }
                     approved.add(approvedItem);
                 } else {
                     approved.remove(approvedItem);
@@ -954,7 +961,7 @@
                 || isPackageOrComponentAllowed(component.getPackageName(), userId))) {
             return false;
         }
-        return componentHasBindPermission(component, userId);
+        return isValidService(component, userId);
     }
 
     private boolean componentHasBindPermission(ComponentName component, int userId) {
@@ -1306,11 +1313,12 @@
                     if (TextUtils.equals(getPackageName(approvedPackageOrComponent), packageName)) {
                         final ComponentName component = ComponentName.unflattenFromString(
                                 approvedPackageOrComponent);
-                        if (component != null && !componentHasBindPermission(component, userId)) {
+                        if (component != null && !isValidService(component, userId)) {
                             approved.removeAt(j);
                             if (DEBUG) {
                                 Slog.v(TAG, "Removing " + approvedPackageOrComponent
-                                        + " from approved list; no bind permission found "
+                                        + " from approved list; no bind permission or "
+                                        + "service interface filter found "
                                         + mConfig.bindPermission);
                             }
                         }
@@ -1329,6 +1337,11 @@
         }
     }
 
+    protected boolean isValidService(ComponentName component, int userId) {
+        return componentHasBindPermission(component, userId) && queryPackageForServices(
+                component.getPackageName(), userId).contains(component);
+    }
+
     protected boolean isValidEntry(String packageOrComponent, int userId) {
         return hasMatchingServices(packageOrComponent, userId);
     }
@@ -1486,23 +1499,25 @@
      * Called when user switched to unbind all services from other users.
      */
     @VisibleForTesting
-    void unbindOtherUserServices(int currentUser) {
+    void unbindOtherUserServices(int switchedToUser) {
         TimingsTraceAndSlog t = new TimingsTraceAndSlog();
-        t.traceBegin("ManagedServices.unbindOtherUserServices_current" + currentUser);
-        unbindServicesImpl(currentUser, true /* allExceptUser */);
+        t.traceBegin("ManagedServices.unbindOtherUserServices_current" + switchedToUser);
+        unbindServicesImpl(switchedToUser, true /* allExceptUser */);
         t.traceEnd();
     }
 
-    void unbindUserServices(int user) {
+    void unbindUserServices(int removedUser) {
         TimingsTraceAndSlog t = new TimingsTraceAndSlog();
-        t.traceBegin("ManagedServices.unbindUserServices" + user);
-        unbindServicesImpl(user, false /* allExceptUser */);
+        t.traceBegin("ManagedServices.unbindUserServices" + removedUser);
+        unbindServicesImpl(removedUser, false /* allExceptUser */);
         t.traceEnd();
     }
 
     void unbindServicesImpl(int user, boolean allExceptUser) {
         final SparseArray<Set<ComponentName>> componentsToUnbind = new SparseArray<>();
         synchronized (mMutex) {
+            // Remove enqueued rebinds to avoid rebinding services for a switched user
+            mHandler.removeMessages(ON_BINDING_DIED_REBIND_MSG);
             final Set<ManagedServiceInfo> removableBoundServices = getRemovableConnectedServices();
             for (ManagedServiceInfo info : removableBoundServices) {
                 if ((allExceptUser && (info.userid != user))
@@ -1697,6 +1712,7 @@
                             mServicesRebinding.add(servicesBindingTag);
                             mHandler.postDelayed(() ->
                                     reregisterService(name, userid),
+                                    ON_BINDING_DIED_REBIND_MSG,
                                     ON_BINDING_DIED_REBIND_DELAY_MS);
                         } else {
                             Slog.v(TAG, getCaption() + " not rebinding in user " + userid
diff --git a/services/core/java/com/android/server/notification/NotificationAdjustmentExtractor.java b/services/core/java/com/android/server/notification/NotificationAdjustmentExtractor.java
index 97bbc23..2dd4f83 100644
--- a/services/core/java/com/android/server/notification/NotificationAdjustmentExtractor.java
+++ b/services/core/java/com/android/server/notification/NotificationAdjustmentExtractor.java
@@ -15,6 +15,9 @@
 */
 package com.android.server.notification;
 
+import static android.service.notification.Adjustment.KEY_TYPE;
+import static android.service.notification.Flags.notificationForceGrouping;
+
 import android.content.Context;
 import android.util.Slog;
 
@@ -24,6 +27,7 @@
 public class NotificationAdjustmentExtractor implements NotificationSignalExtractor {
     private static final String TAG = "AdjustmentExtractor";
     private static final boolean DBG = false;
+    private GroupHelper mGroupHelper;
 
 
     public void initialize(Context ctx, NotificationUsageStats usageStats) {
@@ -35,8 +39,27 @@
             if (DBG) Slog.d(TAG, "skipping empty notification");
             return null;
         }
+
+        final boolean hasAdjustedClassification = record.hasAdjustment(KEY_TYPE);
         record.applyAdjustments();
 
+        if (notificationForceGrouping()
+                && android.service.notification.Flags.notificationClassification()) {
+            // Classification adjustments trigger regrouping
+            if (mGroupHelper != null && hasAdjustedClassification) {
+                return new RankingReconsideration(record.getKey(), 0) {
+                    @Override
+                    public void work() {
+                    }
+
+                    @Override
+                    public void applyChangesLocked(NotificationRecord record) {
+                        mGroupHelper.onChannelUpdated(record);
+                    }
+                };
+            }
+        }
+
         return null;
     }
 
@@ -49,4 +72,9 @@
     public void setZenHelper(ZenModeHelper helper) {
 
     }
+
+    @Override
+    public void setGroupHelper(GroupHelper groupHelper) {
+        mGroupHelper = groupHelper;
+    }
 }
diff --git a/services/core/java/com/android/server/notification/NotificationAttentionHelper.java b/services/core/java/com/android/server/notification/NotificationAttentionHelper.java
index abb2132..ea4a6db 100644
--- a/services/core/java/com/android/server/notification/NotificationAttentionHelper.java
+++ b/services/core/java/com/android/server/notification/NotificationAttentionHelper.java
@@ -17,6 +17,7 @@
 package com.android.server.notification;
 
 import static android.app.Flags.sortSectionByTime;
+import static android.app.Notification.CATEGORY_MESSAGE;
 import static android.app.Notification.FLAG_INSISTENT;
 import static android.app.Notification.FLAG_ONLY_ALERT_ONCE;
 import static android.app.NotificationManager.IMPORTANCE_MIN;
@@ -42,6 +43,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
+import android.content.pm.ShortcutInfo;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
 import android.database.ContentObserver;
@@ -118,6 +120,37 @@
             Intent.ACTION_MANAGED_PROFILE_AVAILABLE, new Pair<>(Intent.EXTRA_QUIET_MODE, false)
     );
 
+    // Bits 1, 2, 3, 4 are already taken by: beep|buzz|blink|cooldown
+    static final int MUTE_REASON_NOT_MUTED = 0;
+    static final int MUTE_REASON_NOT_AUDIBLE = 1 << 5;
+    static final int MUTE_REASON_SILENT_UPDATE = 1 << 6;
+    static final int MUTE_REASON_POST_SILENTLY = 1 << 7;
+    static final int MUTE_REASON_LISTENER_HINT = 1 << 8;
+    static final int MUTE_REASON_DND = 1 << 9;
+    static final int MUTE_REASON_GROUP_ALERT = 1 << 10;
+    static final int MUTE_REASON_FLAG_SILENT = 1 << 11;
+    static final int MUTE_REASON_RATE_LIMIT = 1 << 12;
+    static final int MUTE_REASON_OTHER_INSISTENT_PLAYING = 1 << 13;
+    static final int MUTE_REASON_SUPPRESSED_BUBBLE = 1 << 14;
+    static final int MUTE_REASON_COOLDOWN = 1 << 15;
+
+    @IntDef(prefix = { "MUTE_REASON_" }, value = {
+        MUTE_REASON_NOT_MUTED,
+        MUTE_REASON_NOT_AUDIBLE,
+        MUTE_REASON_SILENT_UPDATE,
+        MUTE_REASON_POST_SILENTLY,
+        MUTE_REASON_LISTENER_HINT,
+        MUTE_REASON_DND,
+        MUTE_REASON_GROUP_ALERT,
+        MUTE_REASON_FLAG_SILENT,
+        MUTE_REASON_RATE_LIMIT,
+        MUTE_REASON_OTHER_INSISTENT_PLAYING,
+        MUTE_REASON_SUPPRESSED_BUBBLE,
+        MUTE_REASON_COOLDOWN,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    @interface MuteReason {}
+
     private final Context mContext;
     private final PackageManager mPackageManager;
     private final TelephonyManager mTelephonyManager;
@@ -388,6 +421,7 @@
         boolean buzz = false;
         boolean beep = false;
         boolean blink = false;
+        @MuteReason int shouldMuteReason = MUTE_REASON_NOT_MUTED;
 
         final String key = record.getKey();
 
@@ -395,10 +429,6 @@
             Log.d(TAG, "buzzBeepBlinkLocked " + record);
         }
 
-        if (isPoliteNotificationFeatureEnabled(record)) {
-            mStrategy.onNotificationPosted(record);
-        }
-
         // Should this notification make noise, vibe, or use the LED?
         final boolean aboveThreshold =
                 mIsAutomotive
@@ -443,7 +473,8 @@
                 boolean vibrateOnly =
                         hasValidVibrate && mNotificationCooldownVibrateUnlocked && mUserPresent;
                 boolean hasAudibleAlert = hasValidSound || hasValidVibrate;
-                if (hasAudibleAlert && !shouldMuteNotificationLocked(record, signals)) {
+                shouldMuteReason = shouldMuteNotificationLocked(record, signals, hasAudibleAlert);
+                if (shouldMuteReason == MUTE_REASON_NOT_MUTED) {
                     if (!sentAccessibilityEvent) {
                         sendAccessibilityEvent(record);
                         sentAccessibilityEvent = true;
@@ -541,15 +572,17 @@
             }
         }
         final int buzzBeepBlinkLoggingCode =
-                (buzz ? 1 : 0) | (beep ? 2 : 0) | (blink ? 4 : 0) | getPoliteBit(record);
+                (buzz ? 1 : 0) | (beep ? 2 : 0) | (blink ? 4 : 0)
+                | getPoliteBit(record) | shouldMuteReason;
         if (buzzBeepBlinkLoggingCode > 0) {
             MetricsLogger.action(record.getLogMaker()
                     .setCategory(MetricsEvent.NOTIFICATION_ALERT)
                     .setType(MetricsEvent.TYPE_OPEN)
                     .setSubtype(buzzBeepBlinkLoggingCode));
             EventLogTags.writeNotificationAlert(key, buzz ? 1 : 0, beep ? 1 : 0, blink ? 1 : 0,
-                    getPolitenessState(record));
+                    getPolitenessState(record), shouldMuteReason);
         }
+
         if (Flags.politeNotifications()) {
             // Update last alert time
             if (buzz || beep) {
@@ -594,41 +627,46 @@
                 mNMP.getNotificationByKey(mVibrateNotificationKey));
     }
 
-    boolean shouldMuteNotificationLocked(final NotificationRecord record, final Signals signals) {
+    @MuteReason int shouldMuteNotificationLocked(final NotificationRecord record,
+            final Signals signals, boolean hasAudibleAlert) {
+        // Suppressed because no audible alert
+        if (!hasAudibleAlert) {
+            return MUTE_REASON_NOT_AUDIBLE;
+        }
         // Suppressed because it's a silent update
         final Notification notification = record.getNotification();
         if (record.isUpdate && (notification.flags & FLAG_ONLY_ALERT_ONCE) != 0) {
-            return true;
+            return MUTE_REASON_SILENT_UPDATE;
         }
 
         // Suppressed because a user manually unsnoozed something (or similar)
         if (record.shouldPostSilently()) {
-            return true;
+            return MUTE_REASON_POST_SILENTLY;
         }
 
         // muted by listener
         final String disableEffects = disableNotificationEffects(record, signals.listenerHints);
         if (disableEffects != null) {
             ZenLog.traceDisableEffects(record, disableEffects);
-            return true;
+            return MUTE_REASON_LISTENER_HINT;
         }
 
         // suppressed due to DND
         if (record.isIntercepted()) {
-            return true;
+            return MUTE_REASON_DND;
         }
 
         // Suppressed because another notification in its group handles alerting
         if (record.getSbn().isGroup()) {
             if (notification.suppressAlertingDueToGrouping()) {
-                return true;
+                return MUTE_REASON_GROUP_ALERT;
             }
         }
 
         // Suppressed because notification was explicitly flagged as silent
         if (android.service.notification.Flags.notificationSilentFlag()) {
             if (notification.isSilent()) {
-                return true;
+                return MUTE_REASON_FLAG_SILENT;
             }
         }
 
@@ -636,12 +674,12 @@
         final String pkg = record.getSbn().getPackageName();
         if (mUsageStats.isAlertRateLimited(pkg)) {
             Slog.e(TAG, "Muting recently noisy " + record.getKey());
-            return true;
+            return MUTE_REASON_RATE_LIMIT;
         }
 
         // A different looping ringtone, such as an incoming call is playing
         if (isCurrentlyInsistent() && !isInsistentUpdate(record)) {
-            return true;
+            return MUTE_REASON_OTHER_INSISTENT_PLAYING;
         }
 
         // Suppressed since it's a non-interruptive update to a bubble-suppressed notification
@@ -650,11 +688,23 @@
         if (record.isUpdate && !record.isInterruptive() && isBubbleOrOverflowed
                 && record.getNotification().getBubbleMetadata() != null) {
             if (record.getNotification().getBubbleMetadata().isNotificationSuppressed()) {
-                return true;
+                return MUTE_REASON_SUPPRESSED_BUBBLE;
             }
         }
 
-        return false;
+        if (isPoliteNotificationFeatureEnabled(record)) {
+            // Notify the politeness strategy that an alerting notification is posted
+            if (!isInsistentUpdate(record)) {
+                mStrategy.onNotificationPosted(record);
+            }
+
+            // Suppress if politeness is muted and it's not an update for insistent
+            if (getPolitenessState(record) == PolitenessStrategy.POLITE_STATE_MUTED) {
+                return MUTE_REASON_COOLDOWN;
+            }
+        }
+
+        return MUTE_REASON_NOT_MUTED;
     }
 
     private boolean isLoopingRingtoneNotification(final NotificationRecord playingRecord) {
@@ -1201,12 +1251,6 @@
             mApplyPerPackage = applyPerPackage;
         }
 
-        boolean shouldIgnoreNotification(final NotificationRecord record) {
-            // Ignore auto-group summaries => don't count them as app-posted notifications
-            // for the cooldown budget
-            return (record.getSbn().isGroup() && GroupHelper.isAggregatedGroup(record));
-        }
-
         /**
          * Get the key that determines the grouping for the cooldown behavior.
          *
@@ -1358,10 +1402,6 @@
 
         @Override
         public void onNotificationPosted(final NotificationRecord record) {
-            if (shouldIgnoreNotification(record)) {
-                return;
-            }
-
             long timeSinceLastNotif =
                     System.currentTimeMillis() - getLastNotificationUpdateTimeMs(record);
 
@@ -1434,10 +1474,6 @@
         @Override
         void onNotificationPosted(NotificationRecord record) {
             if (isAvalancheActive()) {
-                if (shouldIgnoreNotification(record)) {
-                    return;
-                }
-
                 long timeSinceLastNotif =
                     System.currentTimeMillis() - getLastNotificationUpdateTimeMs(record);
 
@@ -1607,7 +1643,7 @@
             }
 
             // recent conversation
-            if (record.isConversation()
+            if ((record.isConversation() || isConversationMessage(record))
                     && record.getNotification().getWhen() > mLastAvalancheTriggerTimestamp) {
                 return true;
             }
@@ -1622,6 +1658,21 @@
 
             return false;
         }
+
+        // Relaxed signals for conversations messages
+        private boolean isConversationMessage(final NotificationRecord record) {
+            if (!CATEGORY_MESSAGE.equals(record.getSbn().getNotification().category)) {
+                return false;
+            }
+            if (record.getChannel().isDemoted()) {
+                return false;
+            }
+            final ShortcutInfo shortcut = record.getShortcutInfo();
+            if (shortcut == null) {
+                return false;
+            }
+            return true;
+        }
     }
 
     //======================  Observers  =============================
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index bcc2019..6c2d4f7 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -519,6 +519,7 @@
 
     private static final long DELAY_FORCE_REGROUP_TIME = 3000;
 
+
     private static final String ACTION_NOTIFICATION_TIMEOUT =
             NotificationManagerService.class.getSimpleName() + ".TIMEOUT";
     private static final int REQUEST_CODE_TIMEOUT = 1;
@@ -2579,10 +2580,11 @@
                 mNotificationChannelLogger,
                 mAppOps,
                 mUserProfiles,
+                mUgmInternal,
                 mShowReviewPermissionsNotification,
                 Clock.systemUTC());
         mRankingHelper = new RankingHelper(getContext(), mRankingHandler, mPreferencesHelper,
-                mZenModeHelper, mUsageStats, extractorNames, mPlatformCompat);
+                mZenModeHelper, mUsageStats, extractorNames, mPlatformCompat, groupHelper);
         mSnoozeHelper = snoozeHelper;
         mGroupHelper = groupHelper;
         mHistoryManager = historyManager;
@@ -4116,6 +4118,34 @@
         }
 
         @Override
+        @FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION)
+        public void setAdjustmentTypeSupportedState(INotificationListener token,
+                @Adjustment.Keys String key, boolean supported) {
+            final long identity = Binder.clearCallingIdentity();
+            try {
+                synchronized (mNotificationLock) {
+                    final ManagedServiceInfo info = mAssistants.checkServiceTokenLocked(token);
+                    if (key == null) {
+                        return;
+                    }
+                    mAssistants.setAdjustmentTypeSupportedState(info,  key, supported);
+                }
+            } finally {
+                Binder.restoreCallingIdentity(identity);
+            }
+        }
+
+        @Override
+        @FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION)
+        public @NonNull List<String> getUnsupportedAdjustmentTypes() {
+            checkCallerIsSystemOrSystemUiOrShell();
+            synchronized (mNotificationLock) {
+                return new ArrayList(mAssistants.mNasUnsupported.getOrDefault(
+                        UserHandle.getUserId(Binder.getCallingUid()), new HashSet<>()));
+            }
+        }
+
+        @Override
         @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
         public boolean appCanBePromoted(String pkg, int uid) {
             checkCallerIsSystemOrSystemUiOrShell();
@@ -4136,14 +4166,18 @@
         }
 
 
+        /**
+         * Any changes from SystemUI or Settings should be fromUser == true. Any changes the
+         * allowlist should be fromUser == false.
+         */
         @Override
         @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
-        public void setCanBePromoted(String pkg, int uid, boolean promote) {
+        public void setCanBePromoted(String pkg, int uid, boolean promote, boolean fromUser) {
             checkCallerIsSystemOrSystemUiOrShell();
             if (!android.app.Flags.apiRichOngoing()) {
                 return;
             }
-            boolean changed = mPreferencesHelper.setCanBePromoted(pkg, uid, promote);
+            boolean changed = mPreferencesHelper.setCanBePromoted(pkg, uid, promote, fromUser);
             if (changed) {
                 // check for pending/posted notifs from this app and update the flag
                 synchronized (mNotificationLock) {
@@ -6243,6 +6277,7 @@
             int callingUid = Binder.getCallingUid();
             @ZenModeConfig.ConfigOrigin int origin = computeZenOrigin(fromUser);
 
+            boolean isSystemCaller = isCallerSystemOrSystemUiOrShell();
             boolean shouldApplyAsImplicitRule = android.app.Flags.modesApi()
                     && !canManageGlobalZenPolicy(pkg, callingUid);
 
@@ -6279,11 +6314,33 @@
                             policy.priorityCallSenders, policy.priorityMessageSenders,
                             policy.suppressedVisualEffects, currPolicy.priorityConversationSenders);
                 }
+
                 int newVisualEffects = calculateSuppressedVisualEffects(
                             policy, currPolicy, applicationInfo.targetSdkVersion);
-                policy = new Policy(policy.priorityCategories,
-                        policy.priorityCallSenders, policy.priorityMessageSenders,
-                        newVisualEffects, policy.priorityConversationSenders);
+
+                if (android.app.Flags.modesUi()) {
+                    // 1. Callers should not modify STATE_CHANNELS_BYPASSING_DND, which is
+                    // internally calculated and only indicates whether channels that want to bypass
+                    // DND _exist_.
+                    // 2. Only system callers should modify STATE_PRIORITY_CHANNELS_BLOCKED because
+                    // it is @hide.
+                    // 3. If the policy has been modified by the targetSdkVersion checks above then
+                    // it has lost its state flags and that's fine (STATE_PRIORITY_CHANNELS_BLOCKED
+                    // didn't exist until V).
+                    int newState = Policy.STATE_UNSET;
+                    if (isSystemCaller && policy.state != Policy.STATE_UNSET) {
+                        newState = Policy.policyState(
+                                currPolicy.hasPriorityChannels(),
+                                policy.allowPriorityChannels());
+                    }
+                    policy = new Policy(policy.priorityCategories,
+                            policy.priorityCallSenders, policy.priorityMessageSenders,
+                            newVisualEffects, newState, policy.priorityConversationSenders);
+                } else {
+                    policy = new Policy(policy.priorityCategories,
+                            policy.priorityCallSenders, policy.priorityMessageSenders,
+                            newVisualEffects, policy.priorityConversationSenders);
+                }
 
                 if (shouldApplyAsImplicitRule) {
                     mZenModeHelper.applyGlobalPolicyAsImplicitZenRule(pkg, callingUid, policy);
@@ -6668,13 +6725,7 @@
             final Uri originalSoundUri =
                     (originalChannel != null) ? originalChannel.getSound() : null;
             if (soundUri != null && !Objects.equals(originalSoundUri, soundUri)) {
-                Binder.withCleanCallingIdentity(() -> {
-                    mUgmInternal.checkGrantUriPermission(sourceUid, null,
-                            ContentProvider.getUriWithoutUserId(soundUri),
-                            Intent.FLAG_GRANT_READ_URI_PERMISSION,
-                            ContentProvider.getUserIdFromUri(soundUri,
-                            UserHandle.getUserId(sourceUid)));
-                });
+                PermissionHelper.grantUriPermission(mUgmInternal, soundUri, sourceUid);
             }
         }
 
@@ -6821,22 +6872,9 @@
             }
             if (android.service.notification.Flags.notificationClassification()
                     && adjustments.containsKey(KEY_TYPE)) {
-                NotificationChannel newChannel = null;
-                int type = adjustments.getInt(KEY_TYPE);
-                if (TYPE_NEWS == type) {
-                    newChannel = mPreferencesHelper.getNotificationChannel(
-                            r.getSbn().getPackageName(), r.getUid(), NEWS_ID, false);
-                } else if (TYPE_PROMOTION == type) {
-                    newChannel = mPreferencesHelper.getNotificationChannel(
-                            r.getSbn().getPackageName(), r.getUid(), PROMOTIONS_ID, false);
-                } else if (TYPE_SOCIAL_MEDIA == type) {
-                    newChannel = mPreferencesHelper.getNotificationChannel(
-                            r.getSbn().getPackageName(), r.getUid(), SOCIAL_MEDIA_ID, false);
-                } else if (TYPE_CONTENT_RECOMMENDATION == type) {
-                    newChannel = mPreferencesHelper.getNotificationChannel(
-                            r.getSbn().getPackageName(), r.getUid(), RECS_ID, false);
-                }
-                if (newChannel == null) {
+                final NotificationChannel newChannel = getClassificationChannelLocked(r,
+                        adjustments);
+                if (newChannel == null || newChannel.getId().equals(r.getChannel().getId())) {
                     adjustments.remove(KEY_TYPE);
                 } else {
                     // swap app provided type with the real thing
@@ -6852,6 +6890,27 @@
         }
     }
 
+    @GuardedBy("mNotificationLock")
+    @Nullable
+    private NotificationChannel getClassificationChannelLocked(NotificationRecord r,
+            Bundle adjustments) {
+        int type = adjustments.getInt(KEY_TYPE);
+        if (TYPE_NEWS == type) {
+            return mPreferencesHelper.getNotificationChannel(
+                    r.getSbn().getPackageName(), r.getUid(), NEWS_ID, false);
+        } else if (TYPE_PROMOTION == type) {
+            return mPreferencesHelper.getNotificationChannel(
+                    r.getSbn().getPackageName(), r.getUid(), PROMOTIONS_ID, false);
+        } else if (TYPE_SOCIAL_MEDIA == type) {
+            return mPreferencesHelper.getNotificationChannel(
+                    r.getSbn().getPackageName(), r.getUid(), SOCIAL_MEDIA_ID, false);
+        } else if (TYPE_CONTENT_RECOMMENDATION == type) {
+            return mPreferencesHelper.getNotificationChannel(
+                    r.getSbn().getPackageName(), r.getUid(), RECS_ID, false);
+        }
+        return null;
+    }
+
     @SuppressWarnings("GuardedBy")
     @GuardedBy("mNotificationLock")
     void addAutogroupKeyLocked(String key, String groupName, boolean requestSort) {
@@ -7413,7 +7472,7 @@
                 NotificationRecord r = findNotificationLocked(pkg, null, notificationId, userId);
                 if (r != null) {
                     if (DBG) {
-                        final String type = (flag ==  FLAG_FOREGROUND_SERVICE) ? "FGS" : "UIJ";
+                        final String type = (flag == FLAG_FOREGROUND_SERVICE) ? "FGS" : "UIJ";
                         Slog.d(TAG, "Remove " + type + " flag not allow. "
                                 + "Cancel " + type + " notification");
                     }
@@ -7430,7 +7489,11 @@
                         // strip flag from all enqueued notifications. listeners will be informed
                         // in post runnable.
                         StatusBarNotification sbn = r.getSbn();
-                        sbn.getNotification().flags = (r.mOriginalFlags & ~flag);
+                        if (notificationForceGrouping()) {
+                            sbn.getNotification().flags = (r.getFlags() & ~flag);
+                        } else {
+                            sbn.getNotification().flags = (r.mOriginalFlags & ~flag);
+                        }
                     }
                 }
 
@@ -7439,7 +7502,11 @@
                 if (r != null) {
                     // if posted notification exists, strip its flag and tell listeners
                     StatusBarNotification sbn = r.getSbn();
-                    sbn.getNotification().flags = (r.mOriginalFlags & ~flag);
+                    if (notificationForceGrouping()) {
+                        sbn.getNotification().flags = (r.getFlags() & ~flag);
+                    } else {
+                        sbn.getNotification().flags = (r.mOriginalFlags & ~flag);
+                    }
                     mRankingHelper.sort(mNotificationList);
                     mListeners.notifyPostedLocked(r, r);
                 }
@@ -9437,6 +9504,28 @@
     }
 
     /**
+     *  Check if the notification was a summary that has been auto-grouped
+     * @param r the current notification record
+     * @param old the previous notification record
+     * @return true if the notification record was a summary that was auto-grouped
+     */
+    @GuardedBy("mNotificationLock")
+    private boolean wasSummaryAutogrouped(NotificationRecord r, NotificationRecord old) {
+        boolean wasAutogrouped = false;
+        if (old != null) {
+            boolean wasSummary = (old.mOriginalFlags & FLAG_GROUP_SUMMARY) != 0;
+            boolean wasForcedGrouped = (old.getFlags() & FLAG_GROUP_SUMMARY) == 0
+                    && old.getSbn().getOverrideGroupKey() != null;
+            boolean isNotAutogroupSummary = (r.getFlags() & FLAG_AUTOGROUP_SUMMARY) == 0
+                    && (r.getFlags() & FLAG_GROUP_SUMMARY) != 0;
+            if ((wasSummary && wasForcedGrouped) || (wasForcedGrouped && isNotAutogroupSummary)) {
+                wasAutogrouped = true;
+            }
+        }
+        return wasAutogrouped;
+    }
+
+    /**
      * Ensures that grouped notification receive their special treatment.
      *
      * <p>Cancels group children if the new notification causes a group to lose
@@ -9456,14 +9545,9 @@
         }
 
         if (notificationForceGrouping()) {
-            if (old != null) {
-                // If this is an update to a summary that was forced grouped => remove summary flag
-                boolean wasSummary = (old.mOriginalFlags & FLAG_GROUP_SUMMARY) != 0;
-                boolean wasForcedGrouped = (old.getFlags() & FLAG_GROUP_SUMMARY) == 0
-                        && old.getSbn().getOverrideGroupKey() != null;
-                if (n.isGroupSummary() && wasSummary && wasForcedGrouped) {
-                    n.flags &= ~FLAG_GROUP_SUMMARY;
-                }
+            // If this is an update to a summary that was forced grouped => remove summary flag
+            if (wasSummaryAutogrouped(r, old)) {
+                n.flags &= ~FLAG_GROUP_SUMMARY;
             }
         }
 
@@ -11311,12 +11395,16 @@
         static final String TAG_ENABLED_NOTIFICATION_ASSISTANTS = "enabled_assistants";
 
         private static final String ATT_TYPES = "types";
+        private static final String ATT_NAS_UNSUPPORTED = "unsupported_adjustments";
 
         private final Object mLock = new Object();
 
         @GuardedBy("mLock")
         private Set<String> mAllowedAdjustments = new ArraySet<>();
 
+        @GuardedBy("mLock")
+        private Map<Integer, HashSet<String>> mNasUnsupported = new ArrayMap<>();
+
         protected ComponentName mDefaultFromConfig = null;
 
         @Override
@@ -11809,6 +11897,10 @@
                     setNotificationAssistantAccessGrantedForUserInternal(
                             currentComponent, userId, false, userSet);
                 }
+            } else {
+                if (android.service.notification.Flags.notificationClassification()) {
+                    mNasUnsupported.put(userId, new HashSet<>());
+                }
             }
             super.setPackageOrComponentEnabled(pkgOrComponent, userId, isPrimary, enabled, userSet);
         }
@@ -11816,6 +11908,63 @@
         private boolean isVerboseLogEnabled() {
             return Log.isLoggable("notification_assistant", Log.VERBOSE);
         }
+
+        @FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION)
+        @GuardedBy("mNotificationLock")
+        public void setAdjustmentTypeSupportedState(ManagedServiceInfo info,
+                @Adjustment.Keys String key, boolean supported) {
+            if (!android.service.notification.Flags.notificationClassification()) {
+                return;
+            }
+            HashSet<String> disabledAdjustments =
+                    mNasUnsupported.getOrDefault(info.userid, new HashSet<>());
+            if (supported) {
+                disabledAdjustments.remove(key);
+            } else {
+                disabledAdjustments.add(key);
+            }
+            mNasUnsupported.put(info.userid, disabledAdjustments);
+            handleSavePolicyFile();
+        }
+
+        @FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION)
+        @GuardedBy("mNotificationLock")
+        public @NonNull Set<String> getUnsupportedAdjustments(@UserIdInt int userId) {
+            if (!android.service.notification.Flags.notificationClassification()) {
+                return new HashSet<>();
+            }
+            return mNasUnsupported.getOrDefault(userId, new HashSet<>());
+        }
+
+        @Override
+        protected void writeExtraAttributes(TypedXmlSerializer out, @UserIdInt int approvedUserId)
+                throws IOException {
+            if (!android.service.notification.Flags.notificationClassification()) {
+                return;
+            }
+            synchronized (mLock) {
+                if (mNasUnsupported.containsKey(approvedUserId)) {
+                    out.attribute(null, ATT_NAS_UNSUPPORTED,
+                            TextUtils.join(",", mNasUnsupported.get(approvedUserId)));
+                }
+            }
+        }
+
+        @Override
+        protected void readExtraAttributes(String tag, TypedXmlPullParser parser,
+                @UserIdInt int approvedUserId) throws IOException {
+            if (!android.service.notification.Flags.notificationClassification()) {
+                return;
+            }
+            if (ManagedServices.TAG_MANAGED_SERVICES.equals(tag)) {
+                final String types = XmlUtils.readStringAttribute(parser, ATT_NAS_UNSUPPORTED);
+                synchronized (mLock) {
+                    if (!TextUtils.isEmpty(types)) {
+                        mNasUnsupported.put(approvedUserId, new HashSet(List.of(types.split(","))));
+                    }
+                }
+            }
+        }
     }
 
     /**
@@ -11869,6 +12018,10 @@
         if (record != null && (record.getSbn().getNotification().flags
                 & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY) > 0
                 && !record.isCanceledAfterLifetimeExtension()) {
+            // Mark that the notification is being updated due to cancelation, so it won't
+            // be updated again if the app cancels multiple times.
+            record.setCanceledAfterLifetimeExtension(true);
+
             boolean isAppForeground = pkg != null && packageImportance == IMPORTANCE_FOREGROUND;
 
             // Save the original Record's post silently value, so we can restore it after we send
@@ -11884,9 +12037,6 @@
             PostNotificationTracker tracker = mPostNotificationTrackerFactory.newTracker(null);
             tracker.addCleanupRunnable(() -> {
                 synchronized (mNotificationLock) {
-                    // Mark that the notification has been updated due to cancelation, so it won't
-                    // be updated again if the app cancels multiple times.
-                    record.setCanceledAfterLifetimeExtension(true);
                     // Set the post silently status to the record's previous value.
                     record.setPostSilently(savedPostSilentlyState);
                     // Remove FLAG_ONLY_ALERT_ONCE if the notification did not previously have it.
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index b9f0968..3ba9384 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -1493,14 +1493,23 @@
 
             final Notification notification = getNotification();
             notification.visitUris((uri) -> {
-                visitGrantableUri(uri, false, false);
+                if (com.android.server.notification.Flags.notificationVerifyChannelSoundUri()) {
+                    visitGrantableUri(uri, false, false);
+                } else {
+                    oldVisitGrantableUri(uri, false, false);
+                }
             });
 
             if (notification.getChannelId() != null) {
                 NotificationChannel channel = getChannel();
                 if (channel != null) {
-                    visitGrantableUri(channel.getSound(), (channel.getUserLockedFields()
-                            & NotificationChannel.USER_LOCKED_SOUND) != 0, true);
+                    if (com.android.server.notification.Flags.notificationVerifyChannelSoundUri()) {
+                        visitGrantableUri(channel.getSound(), (channel.getUserLockedFields()
+                                & NotificationChannel.USER_LOCKED_SOUND) != 0, true);
+                    } else {
+                        oldVisitGrantableUri(channel.getSound(), (channel.getUserLockedFields()
+                                & NotificationChannel.USER_LOCKED_SOUND) != 0, true);
+                    }
                 }
             }
         } finally {
@@ -1516,7 +1525,7 @@
      * {@link #mGrantableUris}. Otherwise, this will either log or throw
      * {@link SecurityException} depending on target SDK of enqueuing app.
      */
-    private void visitGrantableUri(Uri uri, boolean userOverriddenUri, boolean isSound) {
+    private void oldVisitGrantableUri(Uri uri, boolean userOverriddenUri, boolean isSound) {
         if (uri == null || !ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) return;
 
         if (mGrantableUris != null && mGrantableUris.contains(uri)) {
@@ -1555,6 +1564,45 @@
         }
     }
 
+    /**
+     * Note the presence of a {@link Uri} that should have permission granted to
+     * whoever will be rendering it.
+     * <p>
+     * If the enqueuing app has the ability to grant access, it will be added to
+     * {@link #mGrantableUris}. Otherwise, this will either log or throw
+     * {@link SecurityException} depending on target SDK of enqueuing app.
+     */
+    private void visitGrantableUri(Uri uri, boolean userOverriddenUri,
+            boolean isSound) {
+        if (mGrantableUris != null && mGrantableUris.contains(uri)) {
+            return; // already verified this URI
+        }
+
+        final int sourceUid = getSbn().getUid();
+        try {
+            PermissionHelper.grantUriPermission(mUgmInternal, uri, sourceUid);
+
+            if (mGrantableUris == null) {
+                mGrantableUris = new ArraySet<>();
+            }
+            mGrantableUris.add(uri);
+        } catch (SecurityException e) {
+            if (!userOverriddenUri) {
+                if (isSound) {
+                    mSound = Settings.System.DEFAULT_NOTIFICATION_URI;
+                    Log.w(TAG, "Replacing " + uri + " from " + sourceUid + ": " + e.getMessage());
+                } else {
+                    if (mTargetSdkVersion >= Build.VERSION_CODES.P) {
+                        throw e;
+                    } else {
+                        Log.w(TAG,
+                                "Ignoring " + uri + " from " + sourceUid + ": " + e.getMessage());
+                    }
+                }
+            }
+        }
+    }
+
     public LogMaker getLogMaker(long now) {
         LogMaker lm = getSbn().getLogMaker()
                 .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_CHANNEL_IMPORTANCE, mImportance)
diff --git a/services/core/java/com/android/server/notification/NotificationSignalExtractor.java b/services/core/java/com/android/server/notification/NotificationSignalExtractor.java
index f0358d1..be34bee 100644
--- a/services/core/java/com/android/server/notification/NotificationSignalExtractor.java
+++ b/services/core/java/com/android/server/notification/NotificationSignalExtractor.java
@@ -55,4 +55,9 @@
     void setZenHelper(ZenModeHelper helper);
 
     default void setCompatChangeLogger(IPlatformCompat platformCompat){};
+
+    /**
+     * @param groupHelper Helper for auto-grouping notifications
+     */
+    default void setGroupHelper(GroupHelper groupHelper){};
 }
diff --git a/services/core/java/com/android/server/notification/PermissionHelper.java b/services/core/java/com/android/server/notification/PermissionHelper.java
index b6f4889..1464d48 100644
--- a/services/core/java/com/android/server/notification/PermissionHelper.java
+++ b/services/core/java/com/android/server/notification/PermissionHelper.java
@@ -25,19 +25,25 @@
 import android.annotation.NonNull;
 import android.annotation.UserIdInt;
 import android.companion.virtual.VirtualDeviceManager;
+import android.content.ContentProvider;
+import android.content.ContentResolver;
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ParceledListSlice;
+import android.net.Uri;
 import android.os.Binder;
 import android.os.RemoteException;
+import android.os.UserHandle;
 import android.permission.IPermissionManager;
 import android.util.ArrayMap;
 import android.util.Pair;
 import android.util.Slog;
 
 import com.android.internal.util.ArrayUtils;
+import com.android.server.uri.UriGrantsManagerInternal;
 
 import java.util.Collections;
 import java.util.HashSet;
@@ -58,7 +64,7 @@
     private final IPermissionManager mPermManager;
 
     public PermissionHelper(Context context, IPackageManager packageManager,
-            IPermissionManager permManager) {
+                IPermissionManager permManager) {
         mContext = context;
         mPackageManager = packageManager;
         mPermManager = permManager;
@@ -298,6 +304,19 @@
         return false;
     }
 
+    static void grantUriPermission(final UriGrantsManagerInternal ugmInternal, Uri uri,
+            int sourceUid) {
+        if (uri == null || !ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) return;
+
+        Binder.withCleanCallingIdentity(() -> {
+            // This will throw a SecurityException if the caller can't grant.
+            ugmInternal.checkGrantUriPermission(sourceUid, null,
+                    ContentProvider.getUriWithoutUserId(uri),
+                    Intent.FLAG_GRANT_READ_URI_PERMISSION,
+                    ContentProvider.getUserIdFromUri(uri, UserHandle.getUserId(sourceUid)));
+        });
+    }
+
     public static class PackagePermission {
         public final String packageName;
         public final @UserIdInt int userId;
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
index fdb9f67..9e70f81 100644
--- a/services/core/java/com/android/server/notification/PreferencesHelper.java
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -40,6 +40,7 @@
 import static com.android.internal.util.FrameworkStatsLog.PACKAGE_NOTIFICATION_PREFERENCES__FSI_STATE__DENIED;
 import static com.android.internal.util.FrameworkStatsLog.PACKAGE_NOTIFICATION_PREFERENCES__FSI_STATE__GRANTED;
 import static com.android.internal.util.FrameworkStatsLog.PACKAGE_NOTIFICATION_PREFERENCES__FSI_STATE__NOT_REQUESTED;
+import static com.android.server.notification.PreferencesHelper.LockableAppFields.USER_LOCKED_PROMOTABLE;
 
 import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
@@ -93,6 +94,7 @@
 import com.android.modules.utils.TypedXmlPullParser;
 import com.android.modules.utils.TypedXmlSerializer;
 import com.android.server.notification.PermissionHelper.PackagePermission;
+import com.android.server.uri.UriGrantsManagerInternal;
 
 import org.json.JSONArray;
 import org.json.JSONException;
@@ -192,10 +194,13 @@
     /**
      * All user-lockable fields for a given application.
      */
-    @IntDef({LockableAppFields.USER_LOCKED_IMPORTANCE})
+    @IntDef({LockableAppFields.USER_LOCKED_IMPORTANCE,
+            LockableAppFields.USER_LOCKED_BUBBLE,
+            LockableAppFields.USER_LOCKED_PROMOTABLE})
     public @interface LockableAppFields {
         int USER_LOCKED_IMPORTANCE = 0x00000001;
         int USER_LOCKED_BUBBLE = 0x00000002;
+        int USER_LOCKED_PROMOTABLE = 0x00000004;
     }
 
     private final Object mLock = new Object();
@@ -215,6 +220,7 @@
     private final NotificationChannelLogger mNotificationChannelLogger;
     private final AppOpsManager mAppOps;
     private final ManagedServices.UserProfiles mUserProfiles;
+    private final UriGrantsManagerInternal mUgmInternal;
 
     private SparseBooleanArray mBadgingEnabled;
     private SparseBooleanArray mBubblesEnabled;
@@ -235,6 +241,7 @@
             ZenModeHelper zenHelper, PermissionHelper permHelper, PermissionManager permManager,
             NotificationChannelLogger notificationChannelLogger,
             AppOpsManager appOpsManager, ManagedServices.UserProfiles userProfiles,
+            UriGrantsManagerInternal ugmInternal,
             boolean showReviewPermissionsNotification, Clock clock) {
         mContext = context;
         mZenModeHelper = zenHelper;
@@ -245,6 +252,7 @@
         mNotificationChannelLogger = notificationChannelLogger;
         mAppOps = appOpsManager;
         mUserProfiles = userProfiles;
+        mUgmInternal = ugmInternal;
         mShowReviewPermissionsNotification = showReviewPermissionsNotification;
         mIsMediaNotificationFilteringEnabled = context.getResources()
                 .getBoolean(R.bool.config_quickSettingsShowMediaPlayer);
@@ -858,13 +866,19 @@
     }
 
     @FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
-    public boolean setCanBePromoted(String packageName, int uid, boolean promote) {
+    public boolean setCanBePromoted(String packageName, int uid, boolean promote,
+            boolean fromUser) {
         boolean changed = false;
         synchronized (mLock) {
             PackagePreferences pkgPrefs = getOrCreatePackagePreferencesLocked(packageName, uid);
-            if (pkgPrefs.canHavePromotedNotifs != promote) {
-                pkgPrefs.canHavePromotedNotifs = promote;
-                changed = true;
+            if (fromUser || ((pkgPrefs.lockedAppFields & USER_LOCKED_PROMOTABLE) == 0)) {
+                if (pkgPrefs.canHavePromotedNotifs != promote) {
+                    pkgPrefs.canHavePromotedNotifs = promote;
+                    if (fromUser) {
+                        pkgPrefs.lockedAppFields |= USER_LOCKED_PROMOTABLE;
+                    }
+                    changed = true;
+                }
             }
         }
         // no need to send a ranking update because we need to update the flag value on all pending
@@ -1159,6 +1173,13 @@
                 }
                 clearLockedFieldsLocked(channel);
 
+                // Verify that the app has permission to read the sound Uri
+                // Only check for new channels, as regular apps can only set sound
+                // before creating. See: {@link NotificationChannel#setSound}
+                if (Flags.notificationVerifyChannelSoundUri()) {
+                    PermissionHelper.grantUriPermission(mUgmInternal, channel.getSound(), uid);
+                }
+
                 channel.setImportanceLockedByCriticalDeviceFunction(
                         r.defaultAppLockedImportance || r.fixedImportance);
 
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 03dd935..f06d6405 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -23,7 +23,6 @@
 import static android.text.TextUtils.formatSimple;
 
 import android.annotation.NonNull;
-import android.app.NotificationManager;
 import android.content.Context;
 import android.service.notification.RankingHelperProto;
 import android.util.ArrayMap;
@@ -61,7 +60,7 @@
             })
     public RankingHelper(Context context, RankingHandler rankingHandler, RankingConfig config,
             ZenModeHelper zenHelper, NotificationUsageStats usageStats, String[] extractorNames,
-            IPlatformCompat platformCompat) {
+            IPlatformCompat platformCompat, GroupHelper groupHelper) {
         mContext = context;
         mRankingHandler = rankingHandler;
         if (sortSectionByTime()) {
@@ -80,6 +79,7 @@
                 extractor.initialize(mContext, usageStats);
                 extractor.setConfig(config);
                 extractor.setZenHelper(zenHelper);
+                extractor.setGroupHelper(groupHelper);
                 if (restrictAudioAttributesAlarm() || restrictAudioAttributesMedia()
                         || restrictAudioAttributesCall()) {
                     extractor.setCompatChangeLogger(platformCompat);
diff --git a/services/core/java/com/android/server/notification/ZenModeFiltering.java b/services/core/java/com/android/server/notification/ZenModeFiltering.java
index ff263d1..bdca555 100644
--- a/services/core/java/com/android/server/notification/ZenModeFiltering.java
+++ b/services/core/java/com/android/server/notification/ZenModeFiltering.java
@@ -37,7 +37,6 @@
 import android.util.ArraySet;
 import android.util.Slog;
 
-import com.android.internal.messages.nano.SystemMessageProto;
 import com.android.internal.util.NotificationMessagingUtil;
 
 import java.io.PrintWriter;
@@ -173,13 +172,6 @@
             maybeLogInterceptDecision(record, false, "criticalNotification");
             return false;
         }
-        // Make an exception to policy for the notification saying that policy has changed
-        if (NotificationManager.Policy.areAllVisualEffectsSuppressed(policy.suppressedVisualEffects)
-                && "android".equals(record.getSbn().getPackageName())
-                && SystemMessageProto.SystemMessage.NOTE_ZEN_UPGRADE == record.getSbn().getId()) {
-            maybeLogInterceptDecision(record, false, "systemDndChangedNotification");
-            return false;
-        }
         switch (zen) {
             case Global.ZEN_MODE_NO_INTERRUPTIONS:
                 // #notevenalarms
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 626c3dd..ea211a9 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -54,10 +54,8 @@
 import android.app.AppOpsManager;
 import android.app.AutomaticZenRule;
 import android.app.Flags;
-import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.NotificationManager.Policy;
-import android.app.PendingIntent;
 import android.app.compat.CompatChanges;
 import android.compat.annotation.ChangeId;
 import android.compat.annotation.EnabledSince;
@@ -74,7 +72,6 @@
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
 import android.database.ContentObserver;
-import android.graphics.drawable.Icon;
 import android.media.AudioAttributes;
 import android.media.AudioManager;
 import android.media.AudioManagerInternal;
@@ -90,7 +87,6 @@
 import android.os.Process;
 import android.os.SystemClock;
 import android.os.UserHandle;
-import android.provider.Settings;
 import android.provider.Settings.Global;
 import android.service.notification.Condition;
 import android.service.notification.ConditionProviderService;
@@ -117,8 +113,6 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.config.sysui.SystemUiSystemPropertiesFlags;
 import com.android.internal.logging.MetricsLogger;
-import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
-import com.android.internal.notification.SystemNotificationChannels;
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.XmlUtils;
 import com.android.modules.utils.TypedXmlPullParser;
@@ -309,7 +303,6 @@
         mHandler.postMetricsTimer();
         cleanUpZenRules();
         mIsSystemServicesReady = true;
-        showZenUpgradeNotification(mZenMode);
     }
 
     /**
@@ -485,7 +478,7 @@
             populateZenRule(pkg, automaticZenRule, rule, origin, /* isNew= */ true);
             rule = maybeRestoreRemovedRule(newConfig, pkg, rule, automaticZenRule, origin);
             newConfig.automaticRules.put(rule.id, rule);
-            maybeReplaceDefaultRule(newConfig, automaticZenRule);
+            maybeReplaceDefaultRule(newConfig, null, automaticZenRule);
 
             if (setConfigLocked(newConfig, origin, reason, rule.component, true, callingUid)) {
                 return rule.id;
@@ -535,13 +528,24 @@
         return ruleToRestore;
     }
 
-    private static void maybeReplaceDefaultRule(ZenModeConfig config, AutomaticZenRule addedRule) {
+    /**
+     * Possibly delete built-in rules if a more suitable rule is added or updated.
+     *
+     * <p>Today, this is done in one case: delete a disabled "Sleeping" rule if a Bedtime Mode is
+     * added (or an existing mode is turned into {@link AutomaticZenRule#TYPE_BEDTIME}, when
+     * upgrading). Because only the {@code config_systemWellbeing} package is allowed to use rules
+     * of this type, this will not trigger wantonly.
+     *
+     * @param oldRule If non-null, {@code rule} is updating {@code oldRule}. Otherwise,
+     *                {@code rule} is being added.
+     */
+    private static void maybeReplaceDefaultRule(ZenModeConfig config, @Nullable ZenRule oldRule,
+            AutomaticZenRule rule) {
         if (!Flags.modesApi()) {
             return;
         }
-        if (addedRule.getType() == AutomaticZenRule.TYPE_BEDTIME) {
-            // Delete a built-in disabled "Sleeping" rule when a BEDTIME rule is added; it may have
-            // smarter triggers and it will prevent confusion about which one to use.
+        if (rule.getType() == AutomaticZenRule.TYPE_BEDTIME
+                && (oldRule == null || oldRule.type != rule.getType())) {
             // Note: we must not verify canManageAutomaticZenRule here, since most likely they
             // won't have the same owner (sleeping - system; bedtime - DWB).
             ZenRule sleepingRule = config.automaticRules.get(
@@ -589,6 +593,10 @@
                 // condition) when no changes happen.
                 return true;
             }
+
+            if (Flags.modesUi()) {
+                maybeReplaceDefaultRule(newConfig, oldRule, automaticZenRule);
+            }
             return setConfigLocked(newConfig, origin, reason,
                     newRule.component, true, callingUid);
         }
@@ -1584,8 +1592,6 @@
             String reason, @Nullable String caller, int callingUid) {
         setManualZenMode(zenMode, conditionId, origin, reason, caller, true /*setRingerMode*/,
                 callingUid);
-        Settings.Secure.putInt(mContext.getContentResolver(),
-                Settings.Secure.SHOW_ZEN_SETTINGS_SUGGESTION, 0);
     }
 
     private void setManualZenMode(int zenMode, Uri conditionId, @ConfigOrigin int origin,
@@ -1783,17 +1789,6 @@
                 SystemZenRules.maybeUpgradeRules(mContext, config);
             }
 
-            // Resolve user id for settings.
-            userId = userId == UserHandle.USER_ALL ? UserHandle.USER_SYSTEM : userId;
-            if (config.version < ZenModeConfig.XML_VERSION_ZEN_UPGRADE) {
-                Settings.Secure.putIntForUser(mContext.getContentResolver(),
-                        Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 1, userId);
-            } else {
-                // devices not restoring/upgrading already have updated zen settings
-                Settings.Secure.putIntForUser(mContext.getContentResolver(),
-                        Settings.Secure.ZEN_SETTINGS_UPDATED, 1, userId);
-            }
-
             if (Flags.modesApi() && forRestore) {
                 // Note: forBackup doesn't write deletedRules, but just in case.
                 config.deletedRules.clear();
@@ -2062,7 +2057,6 @@
         Global.putInt(mContext.getContentResolver(), Global.ZEN_MODE, zen);
         ZenLog.traceSetZenMode(Global.getInt(mContext.getContentResolver(), Global.ZEN_MODE, -1),
                 "updated setting");
-        showZenUpgradeNotification(zen);
     }
 
     private int getPreviousRingerModeSetting() {
@@ -2117,12 +2111,6 @@
             for (ZenRule automaticRule : mConfig.automaticRules.values()) {
                 if (automaticRule.isActive()) {
                     if (zenSeverity(automaticRule.zenMode) > zenSeverity(zen)) {
-                        // automatic rule triggered dnd and user hasn't seen update dnd dialog
-                        if (Settings.Secure.getInt(mContext.getContentResolver(),
-                                Settings.Secure.ZEN_SETTINGS_SUGGESTION_VIEWED, 1) == 0) {
-                            Settings.Secure.putInt(mContext.getContentResolver(),
-                                    Settings.Secure.SHOW_ZEN_SETTINGS_SUGGESTION, 1);
-                        }
                         zen = automaticRule.zenMode;
                     }
                 }
@@ -2702,62 +2690,6 @@
         }
     }
 
-    private void showZenUpgradeNotification(int zen) {
-        final boolean isWatch = mContext.getPackageManager().hasSystemFeature(
-            PackageManager.FEATURE_WATCH);
-        final boolean showNotification = mIsSystemServicesReady
-                && zen != Global.ZEN_MODE_OFF
-                && !isWatch
-                && Settings.Secure.getInt(mContext.getContentResolver(),
-                Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 0) != 0
-                && Settings.Secure.getInt(mContext.getContentResolver(),
-                Settings.Secure.ZEN_SETTINGS_UPDATED, 0) != 1;
-
-        if (isWatch) {
-            Settings.Secure.putInt(mContext.getContentResolver(),
-                    Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 0);
-        }
-
-        if (showNotification) {
-            mNotificationManager.notify(TAG, SystemMessage.NOTE_ZEN_UPGRADE,
-                    createZenUpgradeNotification());
-            Settings.Secure.putInt(mContext.getContentResolver(),
-                    Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 0);
-        }
-    }
-
-    @VisibleForTesting
-    protected Notification createZenUpgradeNotification() {
-        final Bundle extras = new Bundle();
-        extras.putString(Notification.EXTRA_SUBSTITUTE_APP_NAME,
-                mContext.getResources().getString(R.string.global_action_settings));
-        int title = R.string.zen_upgrade_notification_title;
-        int content = R.string.zen_upgrade_notification_content;
-        int drawable = R.drawable.ic_zen_24dp;
-        if (NotificationManager.Policy.areAllVisualEffectsSuppressed(
-                getConsolidatedNotificationPolicy().suppressedVisualEffects)) {
-            title = R.string.zen_upgrade_notification_visd_title;
-            content = R.string.zen_upgrade_notification_visd_content;
-            drawable = R.drawable.ic_dnd_block_notifications;
-        }
-
-        Intent onboardingIntent = new Intent(Settings.ZEN_MODE_ONBOARDING);
-        onboardingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-        return new Notification.Builder(mContext, SystemNotificationChannels.DO_NOT_DISTURB)
-                .setAutoCancel(true)
-                .setSmallIcon(R.drawable.ic_settings_24dp)
-                .setLargeIcon(Icon.createWithResource(mContext, drawable))
-                .setContentTitle(mContext.getResources().getString(title))
-                .setContentText(mContext.getResources().getString(content))
-                .setContentIntent(PendingIntent.getActivity(mContext, 0, onboardingIntent,
-                        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE))
-                .setAutoCancel(true)
-                .setLocalOnly(true)
-                .addExtras(extras)
-                .setStyle(new Notification.BigTextStyle())
-                .build();
-    }
-
     private int drawableResNameToResId(String packageName, String resourceName) {
         if (TextUtils.isEmpty(resourceName)) {
             return 0;
diff --git a/services/core/java/com/android/server/notification/flags.aconfig b/services/core/java/com/android/server/notification/flags.aconfig
index be3adc1..0b34177 100644
--- a/services/core/java/com/android/server/notification/flags.aconfig
+++ b/services/core/java/com/android/server/notification/flags.aconfig
@@ -144,6 +144,13 @@
 }
 
 flag {
+  name: "notification_minimalism"
+  namespace: "systemui"
+  description: "Minimize the notifications to show on the lockscreen."
+  bug: "330387368"
+}
+
+flag {
   name: "notification_force_group_singletons"
   namespace: "systemui"
   description: "This flag enables forced auto-grouping singleton groups"
@@ -163,3 +170,13 @@
   description: "This flag enables sound uri with vibration source"
   bug: "358524009"
 }
+
+flag {
+  name: "notification_verify_channel_sound_uri"
+  namespace: "systemui"
+  description: "Verify Uri permission for sound when creating a notification channel"
+  bug: "337775777"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
diff --git a/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java b/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
index 03a34f2..b0d69e6 100644
--- a/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
+++ b/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
@@ -19,6 +19,8 @@
 import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.DEVICE_CONFIG_UPDATE_BUNDLE_KEY;
 import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.MODEL_LOADED_BUNDLE_KEY;
 import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.MODEL_UNLOADED_BUNDLE_KEY;
+import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.MODEL_LOADED_BROADCAST_INTENT;
+import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.MODEL_UNLOADED_BROADCAST_INTENT;
 import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.REGISTER_MODEL_UPDATE_CALLBACK_BUNDLE_KEY;
 
 import static com.android.server.ondeviceintelligence.BundleUtil.sanitizeInferenceParams;
@@ -154,7 +156,7 @@
     @GuardedBy("mLock")
     private String[] mTemporaryBroadcastKeys;
     @GuardedBy("mLock")
-    private String mBroadcastPackageName;
+    private String mBroadcastPackageName = SYSTEM_PACKAGE;
     @GuardedBy("mLock")
     private String mTemporaryConfigNamespace;
 
@@ -921,10 +923,7 @@
             }
         }
 
-        return new String[]{mContext.getResources().getString(
-                R.string.config_onDeviceIntelligenceModelLoadedBroadcastKey),
-                mContext.getResources().getString(
-                        R.string.config_onDeviceIntelligenceModelUnloadedBroadcastKey)};
+        return new String[]{ MODEL_LOADED_BROADCAST_INTENT, MODEL_UNLOADED_BROADCAST_INTENT };
     }
 
     @RequiresPermission(Manifest.permission.USE_ON_DEVICE_INTELLIGENCE)
diff --git a/services/core/java/com/android/server/pdb/PersistentDataBlockService.java b/services/core/java/com/android/server/pdb/PersistentDataBlockService.java
index 8410cff..fe9a859 100644
--- a/services/core/java/com/android/server/pdb/PersistentDataBlockService.java
+++ b/services/core/java/com/android/server/pdb/PersistentDataBlockService.java
@@ -171,7 +171,6 @@
     static final int MAX_DATA_BLOCK_SIZE = 1024 * 100;
 
     public static final int DIGEST_SIZE_BYTES = 32;
-    private static final String OEM_UNLOCK_PROP = "sys.oem_unlock_allowed";
     private static final String FLASH_LOCK_PROP = "ro.boot.flash.locked";
     private static final String FLASH_LOCK_LOCKED = "1";
     private static final String FLASH_LOCK_UNLOCKED = "0";
@@ -275,7 +274,6 @@
             enforceChecksumValidity();
             if (mFrpEnforced) {
                 automaticallyDeactivateFrpIfPossible();
-                setOemUnlockEnabledProperty(doGetOemUnlockEnabled());
                 setOldSettingForBackworkCompatibility(mFrpActive);
             } else {
                 formatIfOemUnlockEnabled();
@@ -303,10 +301,6 @@
         }
     }
 
-    private void setOemUnlockEnabledProperty(boolean oemUnlockEnabled) {
-        setProperty(OEM_UNLOCK_PROP, oemUnlockEnabled ? "1" : "0");
-    }
-
     @Override
     public void onBootPhase(int phase) {
         // Wait for initialization in onStart to finish
@@ -342,7 +336,6 @@
                 formatPartitionLocked(true);
             }
         }
-        setOemUnlockEnabledProperty(enabled);
     }
 
     private void enforceOemUnlockReadPermission() {
@@ -814,17 +807,9 @@
             channel.force(true);
         } catch (IOException e) {
             Slog.e(TAG, "unable to access persistent partition", e);
-            return;
-        } finally {
-            setOemUnlockEnabledProperty(enabled);
         }
     }
 
-    @VisibleForTesting
-    void setProperty(String name, String value) {
-        SystemProperties.set(name, value);
-    }
-
     private boolean doGetOemUnlockEnabled() {
         DataInputStream inputStream;
         try {
diff --git a/services/core/java/com/android/server/pinner/PinRangeSource.java b/services/core/java/com/android/server/pinner/PinRangeSource.java
new file mode 100644
index 0000000..5f96411
--- /dev/null
+++ b/services/core/java/com/android/server/pinner/PinRangeSource.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2024 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.pinner;
+
+/* package */ abstract class PinRangeSource {
+    /**
+     * Retrieve a range to pin.
+     *
+     * @param outPinRange Receives the pin region
+     * @return True if we filled in outPinRange or false if we're out of pin entries
+     */
+    abstract boolean read(PinnerService.PinRange outPinRange);
+}
\ No newline at end of file
diff --git a/services/core/java/com/android/server/pinner/PinRangeSourceStatic.java b/services/core/java/com/android/server/pinner/PinRangeSourceStatic.java
new file mode 100644
index 0000000..d6fc487
--- /dev/null
+++ b/services/core/java/com/android/server/pinner/PinRangeSourceStatic.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2024 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.pinner;
+
+/* package */ class PinRangeSourceStatic extends PinRangeSource {
+    private final int mPinStart;
+    private final int mPinLength;
+    private boolean mDone = false;
+
+    PinRangeSourceStatic(int pinStart, int pinLength) {
+        mPinStart = pinStart;
+        mPinLength = pinLength;
+    }
+
+    @Override
+    boolean read(PinnerService.PinRange outPinRange) {
+        outPinRange.start = mPinStart;
+        outPinRange.length = mPinLength;
+        boolean done = mDone;
+        mDone = true;
+        return !done;
+    }
+}
\ No newline at end of file
diff --git a/services/core/java/com/android/server/pinner/PinRangeSourceStream.java b/services/core/java/com/android/server/pinner/PinRangeSourceStream.java
new file mode 100644
index 0000000..79900b9
--- /dev/null
+++ b/services/core/java/com/android/server/pinner/PinRangeSourceStream.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2024 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.pinner;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/* package */ final class PinRangeSourceStream extends PinRangeSource {
+    private final DataInputStream mStream;
+    private boolean mDone = false;
+
+    PinRangeSourceStream(InputStream stream) {
+        mStream = new DataInputStream(stream);
+    }
+
+    @Override
+    boolean read(PinnerService.PinRange outPinRange) {
+        if (!mDone) {
+            try {
+                outPinRange.start = mStream.readInt();
+                outPinRange.length = mStream.readInt();
+            } catch (IOException ex) {
+                mDone = true;
+            }
+        }
+        return !mDone;
+    }
+}
\ No newline at end of file
diff --git a/services/core/java/com/android/server/pinner/PinnedFile.java b/services/core/java/com/android/server/pinner/PinnedFile.java
new file mode 100644
index 0000000..a8de344
--- /dev/null
+++ b/services/core/java/com/android/server/pinner/PinnedFile.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2024 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.pinner;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.ArrayList;
+
+@VisibleForTesting
+public final class PinnedFile implements AutoCloseable {
+    private long mAddress;
+    final long mapSize;
+    final String fileName;
+    public final long bytesPinned;
+
+    // Whether this file was pinned using a pinlist
+    boolean used_pinlist;
+
+    // User defined group name for pinner accounting
+    String groupName = "";
+    ArrayList<PinnedFile> pinnedDeps = new ArrayList<>();
+
+    public PinnedFile(long address, long mapSize, String fileName, long bytesPinned) {
+        mAddress = address;
+        this.mapSize = mapSize;
+        this.fileName = fileName;
+        this.bytesPinned = bytesPinned;
+    }
+
+    @Override
+    public void close() {
+        if (mAddress >= 0) {
+            PinnerUtils.safeMunmap(mAddress, mapSize);
+            mAddress = -1;
+        }
+        for (PinnedFile dep : pinnedDeps) {
+            if (dep != null) {
+                dep.close();
+            }
+        }
+    }
+
+    @Override
+    public void finalize() {
+        close();
+    }
+}
\ No newline at end of file
diff --git a/services/core/java/com/android/server/pinner/PinnerService.java b/services/core/java/com/android/server/pinner/PinnerService.java
new file mode 100644
index 0000000..d7ac520
--- /dev/null
+++ b/services/core/java/com/android/server/pinner/PinnerService.java
@@ -0,0 +1,1509 @@
+/*
+ * Copyright (C) 2024 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.pinner;
+
+import static android.app.ActivityManager.UID_OBSERVER_ACTIVE;
+import static android.app.ActivityManager.UID_OBSERVER_GONE;
+import static android.os.Process.SYSTEM_UID;
+
+import static com.android.server.flags.Flags.pinGlobalQuota;
+import static com.android.server.flags.Flags.pinWebview;
+
+import android.annotation.EnforcePermission;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
+import android.app.IActivityManager;
+import android.app.UidObserver;
+import android.app.pinner.IPinnerService;
+import android.app.pinner.PinnedFileStat;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Binder;
+import android.os.Build;
+import android.os.Handler;
+import android.os.HandlerExecutor;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ShellCallback;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.DeviceConfig;
+import android.provider.DeviceConfigInterface;
+import android.provider.MediaStore;
+import android.provider.Settings;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Slog;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.app.ResolverActivity;
+import com.android.internal.os.BackgroundThread;
+import com.android.internal.util.DumpUtils;
+import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.server.LocalServices;
+import com.android.server.SystemService;
+import com.android.server.wm.ActivityTaskManagerInternal;
+
+import dalvik.system.DexFile;
+import dalvik.system.VMRuntime;
+
+import java.io.FileDescriptor;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import sun.misc.Unsafe;
+
+/**
+ * <p>PinnerService pins important files for key processes in memory.</p>
+ * <p>Files to pin are specified in the config_defaultPinnerServiceFiles
+ * overlay.</p>
+ * <p>Pin the default camera application if specified in config_pinnerCameraApp.</p>
+ * <p>(Optional) Pin experimental carveout regions based on DeviceConfig flags.</p>
+ */
+public final class PinnerService extends SystemService {
+    private static final boolean DEBUG = false;
+    private static final String TAG = "PinnerService";
+
+    private static final String PIN_META_FILENAME = "pinlist.meta";
+    private static final int PAGE_SIZE = (int) Os.sysconf(OsConstants._SC_PAGESIZE);
+    private static final int MATCH_FLAGS = PackageManager.MATCH_DEFAULT_ONLY
+            | PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
+
+    private static final int KEY_CAMERA = 0;
+    private static final int KEY_HOME = 1;
+    private static final int KEY_ASSISTANT = 2;
+
+    // Pin using pinlist.meta when pinning apps.
+    private static boolean PROP_PIN_PINLIST =
+            SystemProperties.getBoolean("pinner.use_pinlist", true);
+
+    private static final int MAX_CAMERA_PIN_SIZE = 80 * (1 << 20); // 80MB max for camera app.
+    private static final int MAX_ASSISTANT_PIN_SIZE = 60 * (1 << 20); // 60MB max for assistant app.
+
+    public static final String ANON_REGION_STAT_NAME = "[anon]";
+
+    private static final String SYSTEM_GROUP_NAME = "system";
+
+    @IntDef({KEY_CAMERA, KEY_HOME, KEY_ASSISTANT})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface AppKey {}
+
+    private final Context mContext;
+    private final Injector mInjector;
+    private final DeviceConfigInterface mDeviceConfigInterface;
+    private final ActivityTaskManagerInternal mAtmInternal;
+    private final ActivityManagerInternal mAmInternal;
+    private final IActivityManager mAm;
+    private final UserManager mUserManager;
+
+    /** The list of the statically pinned files. */
+    @GuardedBy("this")
+    private final ArrayMap<String, PinnedFile> mPinnedFiles = new ArrayMap<>();
+
+    /** The list of the pinned apps. This is a map from {@link AppKey} to a pinned app. */
+    @GuardedBy("this")
+    private final ArrayMap<Integer, PinnedApp> mPinnedApps = new ArrayMap<>();
+
+    /**
+     * The list of the pinned apps that need to be repinned as soon as the all processes of a given
+     * uid are no longer active. Note that with background dex opt, the new dex/vdex files are only
+     * loaded into the processes once it restarts. So in case background dex opt recompiled these
+     * files, we still need to keep the old ones pinned until the processes restart.
+     * <p>
+     * This is a map from uid to {@link AppKey}
+     */
+    @GuardedBy("this")
+    private final ArrayMap<Integer, Integer> mPendingRepin = new ArrayMap<>();
+
+    /**
+     * A set of {@link AppKey} that are configured to be pinned.
+     */
+    @GuardedBy("this") private
+    ArraySet<Integer> mPinKeys;
+
+    // Note that we don't use the `_BOOT` namespace for anonymous pinnings, as we want
+    // them to be responsive to dynamic flag changes for experimentation.
+    private static final String DEVICE_CONFIG_NAMESPACE_ANON_SIZE =
+            DeviceConfig.NAMESPACE_RUNTIME_NATIVE;
+    private static final String DEVICE_CONFIG_KEY_ANON_SIZE = "pin_shared_anon_size";
+    private static final long DEFAULT_ANON_SIZE =
+            SystemProperties.getLong("pinner.pin_shared_anon_size", 0);
+    private static final long MAX_ANON_SIZE = 2L * (1L << 30); // 2GB
+    private long mPinAnonSize;
+    private long mPinAnonAddress;
+    private long mCurrentlyPinnedAnonSize;
+
+    // Resource-configured pinner flags;
+    private final boolean mConfiguredToPinCamera;
+    private final int mConfiguredHomePinBytes;
+    private final boolean mConfiguredToPinAssistant;
+    private final int mConfiguredWebviewPinBytes;
+
+    // This is the percentage of total device memory that will be used to set the global quota.
+    private final int mConfiguredMaxPinnedMemoryPercentage;
+
+    // This is the global pinner quota that can be pinned.
+    private long mConfiguredMaxPinnedMemory;
+
+    // This is the currently pinned memory.
+    private long mCurrentPinnedMemory = 0;
+
+    private BinderService mBinderService;
+    private PinnerHandler mPinnerHandler = null;
+
+    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            // If an app has updated, update pinned files accordingly.
+            if (Intent.ACTION_PACKAGE_REPLACED.equals(intent.getAction())) {
+                Uri packageUri = intent.getData();
+                String packageName = packageUri.getSchemeSpecificPart();
+                ArraySet<String> updatedPackages = new ArraySet<>();
+                updatedPackages.add(packageName);
+                update(updatedPackages, true /* force */);
+            }
+        }
+    };
+
+    private final DeviceConfig.OnPropertiesChangedListener mDeviceConfigAnonSizeListener =
+            new DeviceConfig.OnPropertiesChangedListener() {
+                @Override
+                public void onPropertiesChanged(DeviceConfig.Properties properties) {
+                    if (DEVICE_CONFIG_NAMESPACE_ANON_SIZE.equals(properties.getNamespace())
+                            && properties.getKeyset().contains(DEVICE_CONFIG_KEY_ANON_SIZE)) {
+                        refreshPinAnonConfig();
+                    }
+                }
+            };
+
+    /** Utility class for testing. */
+    @VisibleForTesting
+    public static class Injector {
+        protected DeviceConfigInterface getDeviceConfigInterface() {
+            return DeviceConfigInterface.REAL;
+        }
+
+        protected void publishBinderService(PinnerService service, Binder binderService) {
+            service.publishBinderService("pinner", binderService);
+        }
+
+        protected PinnedFile pinFileInternal(PinnerService service, String fileToPin,
+                long maxBytesToPin, boolean attemptPinIntrospection) {
+            return service.pinFileInternal(fileToPin, maxBytesToPin, attemptPinIntrospection);
+        }
+    }
+
+    public PinnerService(Context context) {
+        this(context, new Injector());
+    }
+
+    @VisibleForTesting
+    public PinnerService(Context context, Injector injector) {
+        super(context);
+
+        mContext = context;
+        mInjector = injector;
+        mDeviceConfigInterface = mInjector.getDeviceConfigInterface();
+        mConfiguredToPinCamera = context.getResources().getBoolean(
+                com.android.internal.R.bool.config_pinnerCameraApp);
+        mConfiguredHomePinBytes = context.getResources().getInteger(
+                com.android.internal.R.integer.config_pinnerHomePinBytes);
+        mConfiguredToPinAssistant = context.getResources().getBoolean(
+                com.android.internal.R.bool.config_pinnerAssistantApp);
+        mConfiguredWebviewPinBytes = context.getResources().getInteger(
+                com.android.internal.R.integer.config_pinnerWebviewPinBytes);
+        mConfiguredMaxPinnedMemoryPercentage = context.getResources().getInteger(
+                com.android.internal.R.integer.config_pinnerMaxPinnedMemoryPercentage);
+
+        mPinKeys = createPinKeys();
+        mPinnerHandler = new PinnerHandler(BackgroundThread.get().getLooper());
+
+        mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
+        mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
+        mAm = ActivityManager.getService();
+
+        mUserManager = mContext.getSystemService(UserManager.class);
+
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
+        filter.addDataScheme("package");
+        mContext.registerReceiver(mBroadcastReceiver, filter);
+
+        registerUidListener();
+        registerUserSetupCompleteListener();
+
+        mDeviceConfigInterface.addOnPropertiesChangedListener(DEVICE_CONFIG_NAMESPACE_ANON_SIZE,
+                new HandlerExecutor(mPinnerHandler), mDeviceConfigAnonSizeListener);
+    }
+
+    @Override
+    public void onStart() {
+        if (DEBUG) {
+            Slog.i(TAG, "Starting PinnerService");
+        }
+        mConfiguredMaxPinnedMemory =
+                (Process.getTotalMemory()
+                        * Math.clamp(mConfiguredMaxPinnedMemoryPercentage, 0, 100))
+                / 100;
+        mBinderService = new BinderService();
+        mInjector.publishBinderService(this, mBinderService);
+        publishLocalService(PinnerService.class, this);
+
+        mPinnerHandler.obtainMessage(PinnerHandler.PIN_ONSTART_MSG).sendToTarget();
+        sendPinAppsMessage(UserHandle.USER_SYSTEM);
+    }
+
+    /**
+     * Repin apps on user switch.
+     * <p>
+     * If more than one user is using the device each user may set a different preference for the
+     * individual apps. Make sure that user's preference is pinned into memory.
+     */
+    @Override
+    public void onUserSwitching(@Nullable TargetUser from, @NonNull TargetUser to) {
+        int userId = to.getUserIdentifier();
+        if (!mUserManager.isManagedProfile(userId)) {
+            sendPinAppsMessage(userId);
+        }
+    }
+
+    @Override
+    public void onUserUnlocking(@NonNull TargetUser user) {
+        final int userId = user.getUserIdentifier();
+        if (userId != UserHandle.USER_SYSTEM && !mUserManager.isManagedProfile(userId)) {
+            // App pinning for the system should have already been triggered from onStart().
+            sendPinAppsMessage(userId);
+        }
+    }
+
+    /**
+     * Update the currently pinned files.
+     * Specifically, this only updates pinning for the apps that need to be pinned.
+     * The other files pinned in onStart will not need to be updated.
+     */
+    public void update(ArraySet<String> updatedPackages, boolean force) {
+        ArraySet<Integer> pinKeys = getPinKeys();
+        int currentUser = ActivityManager.getCurrentUser();
+        for (int i = pinKeys.size() - 1; i >= 0; i--) {
+            int key = pinKeys.valueAt(i);
+            ApplicationInfo info = getInfoForKey(key, currentUser);
+            if (info != null && updatedPackages.contains(info.packageName)) {
+                Slog.i(TAG, "Updating pinned files for " + info.packageName + " force=" + force);
+                sendPinAppMessage(key, currentUser, force);
+            }
+        }
+    }
+
+    /** Returns information about pinned files and sizes for StatsPullAtomService. */
+    public List<PinnedFileStats> dumpDataForStatsd() {
+        List<PinnedFileStats> pinnedFileStats = new ArrayList<>();
+        synchronized (PinnerService.this) {
+            for (PinnedFile pinnedFile : mPinnedFiles.values()) {
+                pinnedFileStats.add(new PinnedFileStats(SYSTEM_UID, pinnedFile));
+            }
+
+            for (int key : mPinnedApps.keySet()) {
+                PinnedApp app = mPinnedApps.get(key);
+                for (PinnedFile pinnedFile : mPinnedApps.get(key).mFiles) {
+                    pinnedFileStats.add(new PinnedFileStats(app.uid, pinnedFile));
+                }
+            }
+        }
+        return pinnedFileStats;
+    }
+
+    /** Wrapper class for statistics for a pinned file. */
+    public static class PinnedFileStats {
+        public final int uid;
+        public final String filename;
+        public final int sizeKb;
+
+        protected PinnedFileStats(int uid, PinnedFile file) {
+            this.uid = uid;
+            this.filename = file.fileName.substring(file.fileName.lastIndexOf('/') + 1);
+            this.sizeKb = (int) file.bytesPinned / 1024;
+        }
+    }
+
+    /**
+     * Handler for on start pinning message
+     */
+    private void handlePinOnStart() {
+        // Files to pin come from the overlay and can be specified per-device config
+        String[] filesToPin = mContext.getResources().getStringArray(
+                com.android.internal.R.array.config_defaultPinnerServiceFiles);
+        // Continue trying to pin each file even if we fail to pin some of them
+        for (String fileToPin : filesToPin) {
+            pinFile(fileToPin, Integer.MAX_VALUE, /*appInfo=*/null, /*groupName=*/SYSTEM_GROUP_NAME,
+                    true);
+        }
+
+        refreshPinAnonConfig();
+    }
+
+    /**
+     * Registers a listener to repin the home app when user setup is complete, as the home intent
+     * initially resolves to setup wizard, but once setup is complete, it will resolve to the
+     * regular home app.
+     */
+    private void registerUserSetupCompleteListener() {
+        Uri userSetupCompleteUri = Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE);
+        mContext.getContentResolver().registerContentObserver(
+                userSetupCompleteUri, false, new ContentObserver(null) {
+                    @Override
+                    public void onChange(boolean selfChange, Uri uri) {
+                        if (userSetupCompleteUri.equals(uri)) {
+                            if (mConfiguredHomePinBytes > 0) {
+                                sendPinAppMessage(KEY_HOME, ActivityManager.getCurrentUser(),
+                                        true /* force */);
+                            }
+                        }
+                    }
+                }, UserHandle.USER_ALL);
+    }
+
+    private void registerUidListener() {
+        try {
+            mAm.registerUidObserver(new UidObserver() {
+                @Override
+                public void onUidGone(int uid, boolean disabled) {
+                    mPinnerHandler.sendMessage(PooledLambda.obtainMessage(
+                            PinnerService::handleUidGone, PinnerService.this, uid));
+                }
+
+                @Override
+                public void onUidActive(int uid) {
+                    mPinnerHandler.sendMessage(PooledLambda.obtainMessage(
+                            PinnerService::handleUidActive, PinnerService.this, uid));
+                }
+            }, UID_OBSERVER_GONE | UID_OBSERVER_ACTIVE, 0, null);
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Failed to register uid observer", e);
+        }
+    }
+
+    private void handleUidGone(int uid) {
+        updateActiveState(uid, false /* active */);
+        int key;
+        synchronized (this) {
+            // In case we have a pending repin, repin now. See mPendingRepin for more information.
+            key = mPendingRepin.getOrDefault(uid, -1);
+            if (key == -1) {
+                return;
+            }
+            mPendingRepin.remove(uid);
+        }
+        pinApp(key, ActivityManager.getCurrentUser(), false /* force */);
+    }
+
+    private void handleUidActive(int uid) {
+        updateActiveState(uid, true /* active */);
+    }
+
+    private void updateActiveState(int uid, boolean active) {
+        synchronized (this) {
+            for (int i = mPinnedApps.size() - 1; i >= 0; i--) {
+                PinnedApp app = mPinnedApps.valueAt(i);
+                if (app.uid == uid) {
+                    app.active = active;
+                }
+            }
+        }
+    }
+
+    private void unpinApps() {
+        ArraySet<Integer> pinKeys = getPinKeys();
+        for (int i = pinKeys.size() - 1; i >= 0; i--) {
+            int key = pinKeys.valueAt(i);
+            unpinApp(key);
+        }
+    }
+
+    private void unpinApp(@AppKey int key) {
+        ArrayList<PinnedFile> pinnedAppFiles;
+        synchronized (this) {
+            PinnedApp app = mPinnedApps.get(key);
+            if (app == null) {
+                return;
+            }
+            mPinnedApps.remove(key);
+            pinnedAppFiles = new ArrayList<>(app.mFiles);
+        }
+        for (PinnedFile pinnedFile : pinnedAppFiles) {
+            unpinFile(pinnedFile.fileName);
+        }
+    }
+
+    private boolean isResolverActivity(ActivityInfo info) {
+        return ResolverActivity.class.getName().equals(info.name);
+    }
+
+    public int getWebviewPinQuota() {
+        if (!pinWebview()) {
+            return 0;
+        }
+        int quota = mConfiguredWebviewPinBytes;
+        int overrideQuota = SystemProperties.getInt("pinner.pin_webview_size", -1);
+        if (overrideQuota != -1) {
+            // Quota was overridden
+            quota = overrideQuota;
+        }
+        return quota;
+    }
+
+    private ApplicationInfo getCameraInfo(int userHandle) {
+        Intent cameraIntent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
+        ApplicationInfo info = getApplicationInfoForIntent(
+                cameraIntent, userHandle, false /* defaultToSystemApp */);
+
+        // If the STILL_IMAGE_CAMERA intent doesn't resolve, try the _SECURE intent.
+        // We don't use _SECURE first because it will never get set on a device
+        // without File-based Encryption. But if the user has only set the intent
+        // before unlocking their device, we may still be able to identify their
+        // preference using this intent.
+        if (info == null) {
+            cameraIntent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE);
+            info = getApplicationInfoForIntent(
+                    cameraIntent, userHandle, false /* defaultToSystemApp */);
+        }
+
+        // If the _SECURE intent doesn't resolve, try the original intent but request
+        // the system app for camera if there was more than one result.
+        if (info == null) {
+            cameraIntent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
+            info = getApplicationInfoForIntent(
+                    cameraIntent, userHandle, true /* defaultToSystemApp */);
+        }
+        return info;
+    }
+
+    private ApplicationInfo getHomeInfo(int userHandle) {
+        Intent intent = mAtmInternal.getHomeIntent();
+        return getApplicationInfoForIntent(intent, userHandle, false);
+    }
+
+    private ApplicationInfo getAssistantInfo(int userHandle) {
+        Intent intent = new Intent(Intent.ACTION_ASSIST);
+        return getApplicationInfoForIntent(intent, userHandle, true);
+    }
+
+    private ApplicationInfo getApplicationInfoForIntent(
+            Intent intent, int userHandle, boolean defaultToSystemApp) {
+        if (intent == null) {
+            return null;
+        }
+
+        ResolveInfo resolveInfo =
+                mContext.getPackageManager().resolveActivityAsUser(intent, MATCH_FLAGS, userHandle);
+
+        // If this intent can resolve to only one app, choose that one.
+        // Otherwise, if we've requested to default to the system app, return it;
+        // if we have not requested that default, return null if there's more than one option.
+        // If there's more than one system app, return null since we don't know which to pick.
+        if (resolveInfo == null) {
+            return null;
+        }
+
+        if (!isResolverActivity(resolveInfo.activityInfo)) {
+            return resolveInfo.activityInfo.applicationInfo;
+        }
+
+        if (defaultToSystemApp) {
+            List<ResolveInfo> infoList = mContext.getPackageManager().queryIntentActivitiesAsUser(
+                    intent, MATCH_FLAGS, userHandle);
+            ApplicationInfo systemAppInfo = null;
+            for (ResolveInfo info : infoList) {
+                if ((info.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+                    if (systemAppInfo == null) {
+                        systemAppInfo = info.activityInfo.applicationInfo;
+                    } else {
+                        // If there's more than one system app, return null due to ambiguity.
+                        return null;
+                    }
+                }
+            }
+            return systemAppInfo;
+        }
+
+        return null;
+    }
+
+    private void sendPinAppsMessage(int userHandle) {
+        mPinnerHandler.sendMessage(
+                PooledLambda.obtainMessage(PinnerService::pinApps, this, userHandle));
+    }
+
+    private void sendPinAppsWithUpdatedKeysMessage(int userHandle) {
+        mPinnerHandler.sendMessage(PooledLambda.obtainMessage(
+                PinnerService::pinAppsWithUpdatedKeys, this, userHandle));
+    }
+    private void sendUnpinAppsMessage() {
+        mPinnerHandler.sendMessage(PooledLambda.obtainMessage(PinnerService::unpinApps, this));
+    }
+
+    private ArraySet<Integer> createPinKeys() {
+        ArraySet<Integer> pinKeys = new ArraySet<>();
+        // Pin the camera application. Default to the system property only if the experiment
+        // phenotype property is not set.
+        boolean shouldPinCamera = mConfiguredToPinCamera
+                && mDeviceConfigInterface.getBoolean(DeviceConfig.NAMESPACE_RUNTIME_NATIVE_BOOT,
+                        "pin_camera", SystemProperties.getBoolean("pinner.pin_camera", true));
+        if (shouldPinCamera) {
+            pinKeys.add(KEY_CAMERA);
+        } else if (DEBUG) {
+            Slog.i(TAG, "Pinner - skip pinning camera app");
+        }
+
+        if (mConfiguredHomePinBytes > 0) {
+            pinKeys.add(KEY_HOME);
+        }
+        if (mConfiguredToPinAssistant) {
+            pinKeys.add(KEY_ASSISTANT);
+        }
+
+        return pinKeys;
+    }
+
+    private synchronized ArraySet<Integer> getPinKeys() {
+        return mPinKeys;
+    }
+
+    private void pinApps(int userHandle) {
+        pinAppsInternal(userHandle, false);
+    }
+
+    private void pinAppsWithUpdatedKeys(int userHandle) {
+        pinAppsInternal(userHandle, true);
+    }
+
+    /**
+     * @param updateKeys True if the pinned app list has to be updated. This is true only when
+     *                   "pinner repin" shell command is requested.
+     */
+    private void pinAppsInternal(int userHandle, boolean updateKeys) {
+        if (updateKeys) {
+            ArraySet<Integer> newKeys = createPinKeys();
+            synchronized (this) {
+                // This code path demands preceding unpinApps() call.
+                if (!mPinnedApps.isEmpty()) {
+                    Slog.e(TAG,
+                            "Attempted to update a list of apps, "
+                                    + "but apps were already pinned. Skipping.");
+                    return;
+                }
+
+                mPinKeys = newKeys;
+            }
+        }
+
+        ArraySet<Integer> currentPinKeys = getPinKeys();
+        for (int i = currentPinKeys.size() - 1; i >= 0; i--) {
+            int key = currentPinKeys.valueAt(i);
+            pinApp(key, userHandle, true /* force */);
+        }
+    }
+
+    /**
+     * @see #pinApp(int, int, boolean)
+     */
+    private void sendPinAppMessage(int key, int userHandle, boolean force) {
+        mPinnerHandler.sendMessage(
+                PooledLambda.obtainMessage(PinnerService::pinApp, this, key, userHandle, force));
+    }
+
+    /**
+     * Pins an app of a specific type {@code key}.
+     *
+     * @param force If false, this will not repin the app if it's currently active. See
+     *              {@link #mPendingRepin}.
+     */
+    private void pinApp(int key, int userHandle, boolean force) {
+        int uid = getUidForKey(key);
+
+        // In case the app is currently active, don't repin until next process restart. See
+        // mPendingRepin for more information.
+        if (!force && uid != -1) {
+            synchronized (this) {
+                mPendingRepin.put(uid, key);
+            }
+            return;
+        }
+        ApplicationInfo info = getInfoForKey(key, userHandle);
+        unpinApp(key);
+        if (info != null) {
+            pinAppInternal(key, info);
+        }
+    }
+
+    /**
+     * Checks whether the pinned package with {@code key} is active or not.
+
+     * @return The uid of the pinned app, or {@code -1} otherwise.
+     */
+    private int getUidForKey(@AppKey int key) {
+        synchronized (this) {
+            PinnedApp existing = mPinnedApps.get(key);
+            return existing != null && existing.active ? existing.uid : -1;
+        }
+    }
+
+    /**
+     * Retrieves the current application info for the given app type.
+     *
+     * @param key The app type to retrieve the info for.
+     * @param userHandle The user id of the current user.
+     */
+    private @Nullable ApplicationInfo getInfoForKey(@AppKey int key, int userHandle) {
+        switch (key) {
+            case KEY_CAMERA:
+                return getCameraInfo(userHandle);
+            case KEY_HOME:
+                return getHomeInfo(userHandle);
+            case KEY_ASSISTANT:
+                return getAssistantInfo(userHandle);
+            default:
+                return null;
+        }
+    }
+
+    /**
+     * @return The app type name for {@code key}.
+     */
+    private String getNameForKey(@AppKey int key) {
+        switch (key) {
+            case KEY_CAMERA:
+                return "Camera";
+            case KEY_HOME:
+                return "Home";
+            case KEY_ASSISTANT:
+                return "Assistant";
+            default:
+                return "";
+        }
+    }
+
+    /**
+     * Handle any changes in the anon region pinner config.
+     */
+    private void refreshPinAnonConfig() {
+        long newPinAnonSize = mDeviceConfigInterface.getLong(
+                DEVICE_CONFIG_NAMESPACE_ANON_SIZE, DEVICE_CONFIG_KEY_ANON_SIZE, DEFAULT_ANON_SIZE);
+        newPinAnonSize = Math.max(0, Math.min(newPinAnonSize, MAX_ANON_SIZE));
+        if (newPinAnonSize != mPinAnonSize) {
+            mPinAnonSize = newPinAnonSize;
+            pinAnonRegion();
+        }
+    }
+
+    /**
+     * Pin an empty anonymous region. This should only be used for ablation experiments.
+     */
+    private void pinAnonRegion() {
+        if (mPinAnonSize == 0) {
+            Slog.d(TAG, "pinAnonRegion: releasing pinned region");
+            unpinAnonRegion();
+            return;
+        }
+        long alignedPinSize = mPinAnonSize;
+        if (alignedPinSize % PAGE_SIZE != 0) {
+            alignedPinSize -= alignedPinSize % PAGE_SIZE;
+            Slog.e(TAG, "pinAnonRegion: aligning size to " + alignedPinSize);
+        }
+        if (mPinAnonAddress != 0) {
+            if (mCurrentlyPinnedAnonSize == alignedPinSize) {
+                Slog.d(TAG, "pinAnonRegion: already pinned region of size " + alignedPinSize);
+                return;
+            }
+            Slog.d(TAG, "pinAnonRegion: resetting pinned region for new size " + alignedPinSize);
+            unpinAnonRegion();
+        }
+        long address = 0;
+        try {
+            // Map as SHARED to avoid changing rss.anon for system_server (per /proc/*/status).
+            // The mapping is visible in other rss metrics, and as private dirty in smaps/meminfo.
+            address = Os.mmap(0, alignedPinSize, OsConstants.PROT_READ | OsConstants.PROT_WRITE,
+                    OsConstants.MAP_SHARED | OsConstants.MAP_ANONYMOUS, new FileDescriptor(),
+                    /*offset=*/0);
+
+            Unsafe tempUnsafe = null;
+            Class<sun.misc.Unsafe> clazz = sun.misc.Unsafe.class;
+            for (java.lang.reflect.Field f : clazz.getDeclaredFields()) {
+                f.setAccessible(true);
+                Object obj = f.get(null);
+                if (clazz.isInstance(obj)) {
+                    tempUnsafe = clazz.cast(obj);
+                }
+            }
+            if (tempUnsafe == null) {
+                throw new Exception("Couldn't get Unsafe");
+            }
+            Method setMemory = clazz.getMethod("setMemory", long.class, long.class, byte.class);
+            setMemory.invoke(tempUnsafe, address, alignedPinSize, (byte) 1);
+            Os.mlock(address, alignedPinSize);
+            mCurrentlyPinnedAnonSize = alignedPinSize;
+            mPinAnonAddress = address;
+            address = -1;
+            Slog.w(TAG, "pinAnonRegion success, size=" + mCurrentlyPinnedAnonSize);
+        } catch (Exception ex) {
+            Slog.e(TAG, "Could not pin anon region of size " + alignedPinSize, ex);
+            return;
+        } finally {
+            if (address >= 0) {
+                PinnerUtils.safeMunmap(address, alignedPinSize);
+            }
+        }
+    }
+
+    private void unpinAnonRegion() {
+        if (mPinAnonAddress != 0) {
+            PinnerUtils.safeMunmap(mPinAnonAddress, mCurrentlyPinnedAnonSize);
+        }
+        mPinAnonAddress = 0;
+        mCurrentlyPinnedAnonSize = 0;
+    }
+
+    /**
+     * @return The maximum amount of bytes to be pinned for an app of type {@code key}.
+     */
+    private int getSizeLimitForKey(@AppKey int key) {
+        switch (key) {
+            case KEY_CAMERA:
+                return MAX_CAMERA_PIN_SIZE;
+            case KEY_HOME:
+                return mConfiguredHomePinBytes;
+            case KEY_ASSISTANT:
+                return MAX_ASSISTANT_PIN_SIZE;
+            default:
+                return 0;
+        }
+    }
+
+    /**
+     * Retrieves remaining quota for pinner service, once it reaches 0 it will no longer
+     * pin any file.
+     */
+    private long getAvailableGlobalQuota() {
+        return mConfiguredMaxPinnedMemory - mCurrentPinnedMemory;
+    }
+
+    /**
+     * Pins an application.
+     *
+     * @param key The key of the app to pin.
+     * @param appInfo The corresponding app info.
+     */
+    private void pinAppInternal(@AppKey int key, @Nullable ApplicationInfo appInfo) {
+        if (appInfo == null) {
+            return;
+        }
+
+        PinnedApp pinnedApp = new PinnedApp(appInfo);
+        synchronized (this) {
+            mPinnedApps.put(key, pinnedApp);
+        }
+
+        // pin APK
+        final int pinSizeLimit = getSizeLimitForKey(key);
+        List<String> apks = new ArrayList<>();
+        apks.add(appInfo.sourceDir);
+
+        if (appInfo.splitSourceDirs != null) {
+            for (String splitApk : appInfo.splitSourceDirs) {
+                apks.add(splitApk);
+            }
+        }
+
+        long apkPinSizeLimit = pinSizeLimit;
+
+        for (String apk : apks) {
+            if (apkPinSizeLimit <= 0) {
+                Slog.w(TAG, "Reached to the pin size limit. Skipping: " + apk);
+                // Continue instead of break to print all skipped APK names.
+                continue;
+            }
+
+            String pinGroup = getNameForKey(key);
+            boolean shouldPinDeps = apk.equals(appInfo.sourceDir);
+            PinnedFile pf = pinFile(apk, apkPinSizeLimit, appInfo, pinGroup, shouldPinDeps);
+            if (pf == null) {
+                Slog.e(TAG, "Failed to pin " + apk);
+                continue;
+            }
+
+            if (DEBUG) {
+                Slog.i(TAG, "Pinned " + pf.fileName);
+            }
+            synchronized (this) {
+                pinnedApp.mFiles.add(pf);
+            }
+
+            apkPinSizeLimit -= pf.bytesPinned;
+        }
+    }
+
+    /**
+     * Pin file or apk to memory.
+     *
+     * Prefer to use this method instead of {@link #pinFileInternal(String, int, boolean)} as it
+     * takes care of accounting and if pinning an apk, it also pins any extra optimized art files
+     * that related to the file but not within itself.
+     *
+     * @param fileToPin File to pin
+     * @param bytesRequestedToPin maximum bytes requested to pin for {@code fileToPin}.
+     * @param pinOptimizedDeps whether optimized dependencies such as odex,vdex, etc be pinned.
+     *                         Note: {@code bytesRequestedToPin} limit will not apply to optimized
+     *                         dependencies pinned, only global quotas will apply instead.
+     * @return pinned file
+     */
+    public PinnedFile pinFile(String fileToPin, long bytesRequestedToPin,
+            @Nullable ApplicationInfo appInfo, @Nullable String groupName,
+            boolean pinOptimizedDeps) {
+        PinnedFile existingPin;
+        synchronized (this) {
+            existingPin = mPinnedFiles.get(fileToPin);
+        }
+        if (existingPin != null) {
+            if (existingPin.bytesPinned == bytesRequestedToPin) {
+                // Duplicate pin requesting same amount of bytes, lets just bail out.
+                return null;
+            } else {
+                // User decided to pin a different amount of bytes than currently pinned
+                // so this is a valid pin request. Unpin the previous version before repining.
+                if (DEBUG) {
+                    Slog.d(TAG, "Unpinning file prior to repin: " + fileToPin);
+                }
+                unpinFile(fileToPin);
+            }
+        }
+
+        long remainingQuota = getAvailableGlobalQuota();
+
+        if (pinGlobalQuota()) {
+            if (remainingQuota <= 0) {
+                Slog.w(TAG, "Reached pin quota, skipping file: " + fileToPin);
+                return null;
+            }
+            bytesRequestedToPin = Math.min(bytesRequestedToPin, remainingQuota);
+        }
+
+        boolean isApk = fileToPin.endsWith(".apk");
+
+        PinnedFile pf = mInjector.pinFileInternal(this, fileToPin, bytesRequestedToPin,
+                /*attemptPinIntrospection=*/isApk);
+        if (pf == null) {
+            Slog.e(TAG, "Failed to pin file = " + fileToPin);
+            return null;
+        }
+        pf.groupName = groupName != null ? groupName : "";
+
+        mCurrentPinnedMemory += pf.bytesPinned;
+
+        synchronized (this) {
+            mPinnedFiles.put(pf.fileName, pf);
+        }
+
+        if (pinOptimizedDeps) {
+            mCurrentPinnedMemory +=
+                    pinOptimizedDexDependencies(pf, getAvailableGlobalQuota(), appInfo);
+        }
+
+        return pf;
+    }
+
+    /**
+     * Pin any dependency optimized files generated by ART.
+     * @param pinnedFile An already pinned file whose dependencies we want pinned.
+     * @param maxBytesToPin Maximum amount of bytes to pin.
+     * @param appInfo Used to determine the ABI in case the application has one custom set, when set
+     *                to null it will use the default supported ABI by the device.
+     * @return total bytes pinned.
+     */
+    private long pinOptimizedDexDependencies(
+            PinnedFile pinnedFile, long maxBytesToPin, @Nullable ApplicationInfo appInfo) {
+        if (pinnedFile == null) {
+            return 0;
+        }
+
+        long bytesPinned = 0;
+        if (pinnedFile.fileName.endsWith(".jar") | pinnedFile.fileName.endsWith(".apk")) {
+            String abi = null;
+            if (appInfo != null) {
+                abi = appInfo.primaryCpuAbi;
+            }
+            if (abi == null) {
+                abi = Build.SUPPORTED_ABIS[0];
+            }
+            // Check whether the runtime has compilation artifacts to pin.
+            String arch = VMRuntime.getInstructionSet(abi);
+            String[] files = null;
+            try {
+                files = DexFile.getDexFileOutputPaths(pinnedFile.fileName, arch);
+            } catch (IOException ioe) {
+            }
+            if (files == null) {
+                return bytesPinned;
+            }
+            for (String file : files) {
+                // Unpin if it was already pinned prior to re-pinning.
+                unpinFile(file);
+
+                PinnedFile df = mInjector.pinFileInternal(this, file, maxBytesToPin,
+                        /*attemptPinIntrospection=*/false);
+                if (df == null) {
+                    Slog.i(TAG, "Failed to pin ART file = " + file);
+                    return bytesPinned;
+                }
+                df.groupName = pinnedFile.groupName;
+                pinnedFile.pinnedDeps.add(df);
+                maxBytesToPin -= df.bytesPinned;
+                bytesPinned += df.bytesPinned;
+                synchronized (this) {
+                    mPinnedFiles.put(df.fileName, df);
+                }
+            }
+        }
+        return bytesPinned;
+    }
+
+    /**
+     * mlock length bytes of fileToPin in memory
+     *
+     * If attemptPinIntrospection is true, then treat the file to pin as a zip file and
+     * look for a "pinlist.meta" file in the archive root directory. The structure of this
+     * file is a PINLIST_META as described below:
+     *
+     * <pre>
+     *   PINLIST_META: PIN_RANGE*
+     *   PIN_RANGE: PIN_START PIN_LENGTH
+     *   PIN_START: big endian i32: offset in bytes of pin region from file start
+     *   PIN_LENGTH: big endian i32: length of pin region in bytes
+     * </pre>
+     *
+     * (We use big endian because that's what DataInputStream is hardcoded to use.)
+     *
+     * If attemptPinIntrospection is false, then we use a single implicit PIN_RANGE of (0,
+     * maxBytesToPin); that is, we attempt to pin the first maxBytesToPin bytes of the file.
+     *
+     * After we open a file, we march through the list of pin ranges and attempt to pin
+     * each one, stopping after we've pinned maxBytesToPin bytes. (We may truncate the last
+     * pinned range to fit.)  In this way, by choosing to emit certain PIN_RANGE pairs
+     * before others, file generators can express pins in priority order, making most
+     * effective use of the pinned-page quota.
+     *
+     * N.B. Each PIN_RANGE is clamped to the actual bounds of the file; all inputs have a
+     * meaningful interpretation. Also, a range locking a single byte of a page locks the
+     * whole page. Any truncated PIN_RANGE at EOF is ignored. Overlapping pinned entries
+     * are legal, but each pin of a byte counts toward the pin quota regardless of whether
+     * that byte has already been pinned, so the generator of PINLIST_META ought to ensure
+     * that ranges are non-overlapping.
+     *
+     * @param fileToPin Path to file to pin
+     * @param maxBytesToPin Maximum number of bytes to pin
+     * @param attemptPinIntrospection If true, try to open file as a
+     *   zip in order to extract the
+     * @return Pinned memory resource owner thing or null on error
+     */
+    private PinnedFile pinFileInternal(
+            String fileToPin, long maxBytesToPin, boolean attemptPinIntrospection) {
+        if (DEBUG) {
+            Slog.d(TAG, "pin file: " + fileToPin + " use-pinlist: " + attemptPinIntrospection);
+        }
+        ZipFile fileAsZip = null;
+        InputStream pinRangeStream = null;
+        try {
+            if (attemptPinIntrospection) {
+                fileAsZip = maybeOpenZip(fileToPin);
+            }
+
+            if (fileAsZip != null) {
+                pinRangeStream = maybeOpenPinMetaInZip(fileAsZip, fileToPin);
+            }
+            boolean use_pinlist = (pinRangeStream != null);
+            PinRangeSource pinRangeSource = use_pinlist
+                    ? new PinRangeSourceStream(pinRangeStream)
+                    : new PinRangeSourceStatic(0, Integer.MAX_VALUE /* will be clipped */);
+            PinnedFile pinnedFile = pinFileRanges(fileToPin, maxBytesToPin, pinRangeSource);
+            if (pinnedFile != null) {
+                pinnedFile.used_pinlist = use_pinlist;
+            }
+            return pinnedFile;
+        } finally {
+            PinnerUtils.safeClose(pinRangeStream);
+            PinnerUtils.safeClose(fileAsZip); // Also closes any streams we've opened
+        }
+    }
+
+    /**
+     * Attempt to open a file as a zip file. On any sort of corruption, log, swallow the
+     * error, and return null.
+     */
+    private static ZipFile maybeOpenZip(String fileName) {
+        ZipFile zip = null;
+        try {
+            zip = new ZipFile(fileName);
+        } catch (IOException ex) {
+            Slog.w(TAG, String.format("could not open \"%s\" as zip: pinning as blob", fileName),
+                    ex);
+        }
+        return zip;
+    }
+
+    /**
+     * Open a pin metadata file in the zip if one is present.
+     *
+     * @param zipFile Zip file to search
+     * @return Open input stream or null on any error
+     */
+    private static InputStream maybeOpenPinMetaInZip(ZipFile zipFile, String fileName) {
+        if (!PROP_PIN_PINLIST) {
+            if (DEBUG) {
+                Slog.i(TAG, "Pin - skip pinlist.meta in " + fileName);
+            }
+            return null;
+        }
+
+        // Looking at root directory is the old behavior but still some apps rely on it so keeping
+        // for backward compatibility. As doing a single item lookup is cheap in the root.
+        ZipEntry pinMetaEntry = zipFile.getEntry(PIN_META_FILENAME);
+
+        if (pinMetaEntry == null) {
+            // It is usually within an apk's control to include files in assets/ directory
+            // so this would be the expected point to have the pinlist.meta coming from.
+            // we explicitly avoid doing an exhaustive search because it may be expensive so
+            // prefer to have a good known location to retrieve the file.
+            pinMetaEntry = zipFile.getEntry("assets/" + PIN_META_FILENAME);
+        }
+
+        InputStream pinMetaStream = null;
+        if (pinMetaEntry != null) {
+            if (DEBUG) {
+                Slog.d(TAG, "Found pinlist.meta for " + fileName);
+            }
+            try {
+                pinMetaStream = zipFile.getInputStream(pinMetaEntry);
+            } catch (IOException ex) {
+                Slog.w(TAG,
+                        String.format(
+                                "error reading pin metadata \"%s\": pinning as blob", fileName),
+                        ex);
+            }
+        } else {
+            Slog.w(TAG,
+                    String.format(
+                            "Could not find pinlist.meta for \"%s\": pinning as blob", fileName));
+        }
+        return pinMetaStream;
+    }
+
+    /**
+     * Helper for pinFile.
+     *
+     * @param fileToPin Name of file to pin
+     * @param maxBytesToPin Maximum number of bytes to pin
+     * @param pinRangeSource Read PIN_RANGE entries from this stream to tell us what bytes
+     *   to pin.
+     * @return PinnedFile or null on error
+     */
+    private static PinnedFile pinFileRanges(
+            String fileToPin, long maxBytesToPin, PinRangeSource pinRangeSource) {
+        FileDescriptor fd = new FileDescriptor();
+        long address = -1;
+        long mapSize = 0;
+
+        try {
+            int openFlags = (OsConstants.O_RDONLY | OsConstants.O_CLOEXEC);
+            fd = Os.open(fileToPin, openFlags, 0);
+            mapSize = (int) Math.min(Os.fstat(fd).st_size, Integer.MAX_VALUE);
+            address = Os.mmap(
+                    0, mapSize, OsConstants.PROT_READ, OsConstants.MAP_SHARED, fd, /*offset=*/0);
+
+            PinRange pinRange = new PinRange();
+            long bytesPinned = 0;
+
+            // We pin at page granularity, so make sure the limit is page-aligned
+            if (maxBytesToPin % PAGE_SIZE != 0) {
+                maxBytesToPin -= maxBytesToPin % PAGE_SIZE;
+            }
+
+            while (bytesPinned < maxBytesToPin && pinRangeSource.read(pinRange)) {
+                long pinStart = pinRange.start;
+                long pinLength = pinRange.length;
+                pinStart = PinnerUtils.clamp(0, pinStart, mapSize);
+                pinLength = PinnerUtils.clamp(0, pinLength, mapSize - pinStart);
+                pinLength = Math.min(maxBytesToPin - bytesPinned, pinLength);
+
+                // mlock doesn't require the region to be page-aligned, but we snap the
+                // lock region to page boundaries anyway so that we don't under-count
+                // locking a single byte of a page as a charge of one byte even though the
+                // OS will retain the whole page. Thanks to this adjustment, we slightly
+                // over-count the pin charge of back-to-back pins touching the same page,
+                // but better that than undercounting. Besides: nothing stops pin metafile
+                // creators from making the actual regions page-aligned.
+                pinLength += pinStart % PAGE_SIZE;
+                pinStart -= pinStart % PAGE_SIZE;
+                if (pinLength % PAGE_SIZE != 0) {
+                    pinLength += PAGE_SIZE - pinLength % PAGE_SIZE;
+                }
+                pinLength = PinnerUtils.clamp(0, pinLength, maxBytesToPin - bytesPinned);
+
+                if (pinLength > 0) {
+                    if (DEBUG) {
+                        Slog.d(TAG,
+                                String.format("pinning at %s %s bytes of %s", pinStart, pinLength,
+                                        fileToPin));
+                    }
+                    Os.mlock(address + pinStart, pinLength);
+                }
+                bytesPinned += pinLength;
+            }
+
+            PinnedFile pinnedFile = new PinnedFile(address, mapSize, fileToPin, bytesPinned);
+            address = -1; // Ownership transferred
+            return pinnedFile;
+        } catch (ErrnoException ex) {
+            Slog.e(TAG, "Could not pin file " + fileToPin, ex);
+            return null;
+        } finally {
+            PinnerUtils.safeClose(fd);
+            if (address >= 0) {
+                PinnerUtils.safeMunmap(address, mapSize);
+            }
+        }
+    }
+    private List<PinnedFile> getAllPinsForGroup(String group) {
+        List<PinnedFile> filesInGroup;
+        synchronized (this) {
+            filesInGroup = mPinnedFiles.values()
+                                   .stream()
+                                   .filter(pf -> pf.groupName.equals(group))
+                                   .toList();
+        }
+        return filesInGroup;
+    }
+    public void unpinGroup(String group) {
+        List<PinnedFile> pinnedFiles = getAllPinsForGroup(group);
+        for (PinnedFile pf : pinnedFiles) {
+            unpinFile(pf.fileName);
+        }
+    }
+
+    /**
+     * Unpin a file and its optimized dependencies.
+     *
+     * @param filename file to unpin.
+     * @return number of bytes unpinned, 0 in case of failure or nothing to unpin.
+     */
+    public long unpinFile(String filename) {
+        PinnedFile pinnedFile;
+        synchronized (this) {
+            pinnedFile = mPinnedFiles.get(filename);
+        }
+        if (pinnedFile == null) {
+            // File not pinned, nothing to do.
+            return 0;
+        }
+        long unpinnedBytes = pinnedFile.bytesPinned;
+        pinnedFile.close();
+        synchronized (this) {
+            if (DEBUG) {
+                Slog.d(TAG, "Unpinned file: " + filename);
+            }
+            mCurrentPinnedMemory -= pinnedFile.bytesPinned;
+
+            mPinnedFiles.remove(pinnedFile.fileName);
+            for (PinnedFile dep : pinnedFile.pinnedDeps) {
+                if (dep == null) {
+                    continue;
+                }
+                unpinnedBytes -= dep.bytesPinned;
+                mCurrentPinnedMemory -= dep.bytesPinned;
+                mPinnedFiles.remove(dep.fileName);
+                if (DEBUG) {
+                    Slog.d(TAG, "Unpinned dependency: " + dep.fileName);
+                }
+            }
+        }
+
+        return unpinnedBytes;
+    }
+
+    public List<PinnedFileStat> getPinnerStats() {
+        ArrayList<PinnedFileStat> stats = new ArrayList<>();
+        Collection<PinnedFile> pinnedFiles;
+        synchronized (this) {
+            pinnedFiles = mPinnedFiles.values();
+        }
+        for (PinnedFile pf : pinnedFiles) {
+            PinnedFileStat stat = new PinnedFileStat(pf.fileName, pf.bytesPinned, pf.groupName);
+            stats.add(stat);
+        }
+        if (mCurrentlyPinnedAnonSize > 0) {
+            stats.add(new PinnedFileStat(
+                    ANON_REGION_STAT_NAME, mCurrentlyPinnedAnonSize, ANON_REGION_STAT_NAME));
+        }
+        return stats;
+    }
+
+    public final class BinderService extends IPinnerService.Stub {
+        @Override
+        protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+            if (!DumpUtils.checkDumpPermission(mContext, TAG, pw))
+                return;
+            HashSet<PinnedFile> shownPins = new HashSet<>();
+            HashSet<String> shownGroups = new HashSet<>();
+            HashSet<String> groupsToPrint = new HashSet<>();
+            final double bytesPerMB = 1024 * 1024;
+            pw.format("Pinner Configs:\n");
+            pw.format("   Total Pinner quota: %d%% of total device memory\n",
+                    mConfiguredMaxPinnedMemoryPercentage);
+            pw.format("   Maximum Pinner quota: %d bytes (%.2f MB)\n", mConfiguredMaxPinnedMemory,
+                    mConfiguredMaxPinnedMemory / bytesPerMB);
+            pw.format("   Max Home App Pin Bytes (without deps): %d\n", mConfiguredHomePinBytes);
+            pw.format("\nPinned Files:\n");
+            synchronized (PinnerService.this) {
+                long totalSize = 0;
+
+                // We print apps separately from regular pins as they contain extra information that
+                // other pins do not.
+                for (int key : mPinnedApps.keySet()) {
+                    PinnedApp app = mPinnedApps.get(key);
+                    pw.print(getNameForKey(key));
+                    pw.print(" uid=");
+                    pw.print(app.uid);
+                    pw.print(" active=");
+                    pw.print(app.active);
+
+                    if (!app.mFiles.isEmpty()) {
+                        shownGroups.add(app.mFiles.getFirst().groupName);
+                    }
+                    pw.println();
+                    long bytesPinnedForApp = 0;
+                    long bytesPinnedForAppDeps = 0;
+                    for (PinnedFile pf : mPinnedApps.get(key).mFiles) {
+                        pw.print("  ");
+                        pw.format("%s pinned:%d bytes (%.2f MB) pinlist:%b\n", pf.fileName,
+                                pf.bytesPinned, pf.bytesPinned / bytesPerMB, pf.used_pinlist);
+                        totalSize += pf.bytesPinned;
+                        bytesPinnedForApp += pf.bytesPinned;
+                        shownPins.add(pf);
+                        for (PinnedFile dep : pf.pinnedDeps) {
+                            pw.print("  ");
+                            pw.format("%s pinned:%d bytes (%.2f MB) pinlist:%b (Dependency)\n",
+                                    dep.fileName, dep.bytesPinned, dep.bytesPinned / bytesPerMB,
+                                    dep.used_pinlist);
+                            totalSize += dep.bytesPinned;
+                            bytesPinnedForAppDeps += dep.bytesPinned;
+                            shownPins.add(dep);
+                        }
+                    }
+                    long bytesPinnedForAppAndDeps = bytesPinnedForApp + bytesPinnedForAppDeps;
+                    pw.format("Total Pinned = %d (%.2f MB) [App=%d (%.2f MB), "
+                                    + "Dependencies=%d (%.2f MB)]\n\n",
+                            bytesPinnedForAppAndDeps, bytesPinnedForAppAndDeps / bytesPerMB,
+                            bytesPinnedForApp, bytesPinnedForApp / bytesPerMB,
+                            bytesPinnedForAppDeps, bytesPinnedForAppDeps / bytesPerMB);
+                }
+                pw.println();
+                for (PinnedFile pinnedFile : mPinnedFiles.values()) {
+                    if (!groupsToPrint.contains(pinnedFile.groupName)
+                            && !shownGroups.contains(pinnedFile.groupName)) {
+                        groupsToPrint.add(pinnedFile.groupName);
+                    }
+                }
+
+                // Print all the non app groups.
+                for (String group : groupsToPrint) {
+                    List<PinnedFile> groupPins = getAllPinsForGroup(group);
+                    pw.print("\nGroup:" + group);
+                    long bytesPinnedForGroupNoDeps = 0;
+                    long bytesPinnedForGroupDeps = 0;
+                    pw.println();
+                    for (PinnedFile pinnedFile : groupPins) {
+                        if (shownPins.contains(pinnedFile)) {
+                            // Already displayed and accounted for, skip.
+                            continue;
+                        }
+                        pw.format("  %s pinned: %d bytes (%.2f MB) pinlist:%b\n",
+                                pinnedFile.fileName, pinnedFile.bytesPinned,
+                                pinnedFile.bytesPinned / bytesPerMB, pinnedFile.used_pinlist);
+                        totalSize += pinnedFile.bytesPinned;
+                        bytesPinnedForGroupNoDeps += pinnedFile.bytesPinned;
+                        shownPins.add(pinnedFile);
+                        for (PinnedFile dep : pinnedFile.pinnedDeps) {
+                            if (shownPins.contains(dep)) {
+                                // Already displayed and accounted for, skip.
+                                continue;
+                            }
+                            pw.print("  ");
+                            pw.format("%s pinned:%d bytes (%.2f MB) pinlist:%b (Dependency)\n",
+                                    dep.fileName, dep.bytesPinned, dep.bytesPinned / bytesPerMB,
+                                    dep.used_pinlist);
+                            totalSize += dep.bytesPinned;
+                            bytesPinnedForGroupDeps += dep.bytesPinned;
+                            shownPins.add(dep);
+                        }
+                    }
+                    long bytesPinnedForGroup = bytesPinnedForGroupNoDeps + bytesPinnedForGroupDeps;
+                    pw.format("Total Pinned = %d (%.2f MB) [Main=%d (%.2f MB), "
+                                    + "Dependencies=%d (%.2f MB)]\n\n",
+                            bytesPinnedForGroup, bytesPinnedForGroup / bytesPerMB,
+                            bytesPinnedForGroupNoDeps, bytesPinnedForGroupNoDeps / bytesPerMB,
+                            bytesPinnedForGroupDeps, bytesPinnedForGroupDeps / bytesPerMB);
+                }
+                pw.println();
+                if (mPinAnonAddress != 0) {
+                    pw.format("Pinned anon region: %d (%.2f MB)\n", mCurrentlyPinnedAnonSize,
+                            mCurrentlyPinnedAnonSize / bytesPerMB);
+                    totalSize += mCurrentlyPinnedAnonSize;
+                }
+                pw.format("Total pinned: %d bytes (%.2f MB)\n", totalSize, totalSize / bytesPerMB);
+                pw.format("Available Pinner quota: %d bytes (%.2f MB)\n", getAvailableGlobalQuota(),
+                        getAvailableGlobalQuota() / bytesPerMB);
+                pw.println();
+                if (!mPendingRepin.isEmpty()) {
+                    pw.print("Pending repin: ");
+                    for (int key : mPendingRepin.values()) {
+                        pw.print(getNameForKey(key));
+                        pw.print(' ');
+                    }
+                    pw.println();
+                }
+            }
+        }
+
+        private void repin() {
+            sendUnpinAppsMessage();
+            // TODO(morrita): Consider supporting non-system user.
+            sendPinAppsWithUpdatedKeysMessage(UserHandle.USER_SYSTEM);
+        }
+
+        private void printError(FileDescriptor out, String message) {
+            PrintWriter writer = new PrintWriter(new FileOutputStream(out));
+            writer.println(message);
+            writer.flush();
+        }
+
+        @Override
+        public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
+                String[] args, ShellCallback callback, ResultReceiver resultReceiver) {
+            if (args.length < 1) {
+                printError(out, "Command is not given.");
+                resultReceiver.send(-1, null);
+                return;
+            }
+
+            String command = args[0];
+            switch (command) {
+                case "repin":
+                    repin();
+                    break;
+                default:
+                    printError(out,
+                            String.format("Unknown pinner command: %s. Supported commands: repin",
+                                    command));
+                    resultReceiver.send(-1, null);
+                    return;
+            }
+
+            resultReceiver.send(0, null);
+        }
+
+        @EnforcePermission(android.Manifest.permission.DUMP)
+        @Override
+        public List<PinnedFileStat> getPinnerStats() {
+            getPinnerStats_enforcePermission();
+            return PinnerService.this.getPinnerStats();
+        }
+    }
+
+    final static class PinRange {
+        int start;
+        int length;
+    }
+
+    /**
+     * Represents an app that was pinned.
+     */
+    private final class PinnedApp {
+        /**
+         * The uid of the package being pinned. This stays constant while the package stays
+         * installed.
+         */
+        final int uid;
+
+        /** Whether it is currently active, i.e. there is a running process from that package. */
+        boolean active;
+
+        /** List of pinned files. */
+        final ArrayList<PinnedFile> mFiles = new ArrayList<>();
+
+        private PinnedApp(ApplicationInfo appInfo) {
+            uid = appInfo.uid;
+            active = mAmInternal.isUidActive(uid);
+        }
+    }
+
+    final class PinnerHandler extends Handler {
+        static final int PIN_ONSTART_MSG = 4001;
+
+        public PinnerHandler(Looper looper) {
+            super(looper, null, true);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case PIN_ONSTART_MSG: {
+                    handlePinOnStart();
+                } break;
+
+                default:
+                    super.handleMessage(msg);
+            }
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/pinner/PinnerUtils.java b/services/core/java/com/android/server/pinner/PinnerUtils.java
new file mode 100644
index 0000000..a836a83
--- /dev/null
+++ b/services/core/java/com/android/server/pinner/PinnerUtils.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2024 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.pinner;
+
+import android.annotation.Nullable;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
+import android.util.Slog;
+
+import java.io.Closeable;
+import java.io.FileDescriptor;
+import java.io.IOException;
+
+/* package */ final class PinnerUtils {
+    private static final String TAG = "PinnerUtils";
+
+    public static long clamp(long min, long value, long max) {
+        return Math.max(min, Math.min(value, max));
+    }
+
+    public static void safeMunmap(long address, long mapSize) {
+        try {
+            Os.munmap(address, mapSize);
+        } catch (ErrnoException ex) {
+            Slog.w(TAG, "ignoring error in unmap", ex);
+        }
+    }
+
+    /**
+     * Close FD, swallowing irrelevant errors.
+     */
+    public static void safeClose(@Nullable FileDescriptor fd) {
+        if (fd != null && fd.valid()) {
+            try {
+                Os.close(fd);
+            } catch (ErrnoException ex) {
+                // Swallow the exception: non-EBADF errors in close(2)
+                // indicate deferred paging write errors, which we
+                // don't care about here. The underlying file
+                // descriptor is always closed.
+                if (ex.errno == OsConstants.EBADF) {
+                    throw new AssertionError(ex);
+                }
+            }
+        }
+    }
+
+    /**
+     * Close closeable thing, swallowing errors.
+     */
+    public static void safeClose(@Nullable Closeable thing) {
+        if (thing != null) {
+            try {
+                thing.close();
+            } catch (IOException ex) {
+                Slog.w(TAG, "ignoring error closing resource: " + thing, ex);
+            }
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java
index 5d71439e..458b46d 100644
--- a/services/core/java/com/android/server/pm/ApexManager.java
+++ b/services/core/java/com/android/server/pm/ApexManager.java
@@ -592,7 +592,7 @@
                 return apexSessionInfo;
             } catch (RemoteException re) {
                 Slog.e(TAG, "Unable to contact apexservice", re);
-                throw new RuntimeException(re);
+                return null;
             }
         }
 
@@ -607,7 +607,7 @@
                 return result;
             } catch (RemoteException re) {
                 Slog.e(TAG, "Unable to contact apexservice", re);
-                throw new RuntimeException(re);
+                return new SparseArray<>(0);
             }
         }
 
@@ -619,7 +619,9 @@
                 return apexInfoList;
             } catch (RemoteException re) {
                 Slog.e(TAG, "Unable to contact apexservice", re);
-                throw new RuntimeException(re);
+                throw new PackageManagerException(
+                        PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE,
+                        "apexd verification failed : " + re.getMessage());
             } catch (Exception e) {
                 throw new PackageManagerException(
                         PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE,
@@ -633,7 +635,7 @@
                 return waitForApexService().getStagedApexInfos(params);
             } catch (RemoteException re) {
                 Slog.w(TAG, "Unable to contact apexservice" + re.getMessage());
-                throw new RuntimeException(re);
+                return new ApexInfo[0];
             } catch (Exception e) {
                 Slog.w(TAG, "Failed to collect staged apex infos" + e.getMessage());
                 return new ApexInfo[0];
@@ -646,7 +648,9 @@
                 waitForApexService().markStagedSessionReady(sessionId);
             } catch (RemoteException re) {
                 Slog.e(TAG, "Unable to contact apexservice", re);
-                throw new RuntimeException(re);
+                throw new PackageManagerException(
+                        PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE,
+                        "Failed to mark apexd session as ready : " + re.getMessage());
             } catch (Exception e) {
                 throw new PackageManagerException(
                         PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE,
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index 89ced12..4665a72 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -2208,10 +2208,10 @@
             return true;
         }
         boolean permissionGranted = requireFullPermission ? hasPermission(
-                Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingUid)
+                Manifest.permission.INTERACT_ACROSS_USERS_FULL)
                 : (hasPermission(
-                        android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingUid)
-                        || hasPermission(Manifest.permission.INTERACT_ACROSS_USERS, callingUid));
+                        android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
+                        || hasPermission(Manifest.permission.INTERACT_ACROSS_USERS));
         if (!permissionGranted) {
             if (Process.isIsolatedUid(callingUid) && isKnownIsolatedComputeApp(callingUid)) {
                 return checkIsolatedOwnerHasPermission(callingUid, requireFullPermission);
diff --git a/services/core/java/com/android/server/pm/DexOptHelper.java b/services/core/java/com/android/server/pm/DexOptHelper.java
index 9ecc7b9..02afdd6 100644
--- a/services/core/java/com/android/server/pm/DexOptHelper.java
+++ b/services/core/java/com/android/server/pm/DexOptHelper.java
@@ -70,16 +70,17 @@
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.server.LocalManagerRegistry;
 import com.android.server.LocalServices;
-import com.android.server.PinnerService;
 import com.android.server.art.ArtManagerLocal;
 import com.android.server.art.DexUseManagerLocal;
 import com.android.server.art.ReasonMapping;
 import com.android.server.art.model.ArtFlags;
 import com.android.server.art.model.DexoptParams;
 import com.android.server.art.model.DexoptResult;
+import com.android.server.pinner.PinnerService;
 import com.android.server.pm.PackageDexOptimizer.DexOptResult;
 import com.android.server.pm.dex.DexManager;
 import com.android.server.pm.dex.DexoptOptions;
+import com.android.server.pm.local.PackageManagerLocalImpl;
 import com.android.server.pm.pkg.AndroidPackage;
 import com.android.server.pm.pkg.PackageState;
 import com.android.server.pm.pkg.PackageStateInternal;
@@ -819,10 +820,16 @@
         final PackageSetting ps = installRequest.getScannedPackageSetting();
         final String packageName = ps.getPackageName();
 
+        PackageSetting uncommittedPs = null;
+        if (Flags.improveInstallFreeze()) {
+            uncommittedPs = ps;
+        }
+
         PackageManagerLocal packageManagerLocal =
                 LocalManagerRegistry.getManager(PackageManagerLocal.class);
         try (PackageManagerLocal.FilteredSnapshot snapshot =
-                     packageManagerLocal.withFilteredSnapshot()) {
+                     PackageManagerLocalImpl.withFilteredSnapshot(packageManagerLocal,
+                uncommittedPs)) {
             boolean ignoreDexoptProfile =
                     (installRequest.getInstallFlags()
                             & PackageManager.INSTALL_IGNORE_DEXOPT_PROFILE)
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index aca65bf..83292b7 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -148,6 +148,7 @@
 import android.util.ArraySet;
 import android.util.EventLog;
 import android.util.ExceptionUtils;
+import android.util.IntArray;
 import android.util.Log;
 import android.util.Pair;
 import android.util.Slog;
@@ -1014,13 +1015,17 @@
         final Map<String, Settings.VersionInfo> versionInfos = new ArrayMap<>(requests.size());
         try {
             CriticalEventLog.getInstance().logInstallPackagesStarted();
-
             if (prepareInstallPackages(requests)
                     && scanInstallPackages(requests, createdAppId, versionInfos)) {
                 List<ReconciledPackage> reconciledPackages =
                         reconcileInstallPackages(requests, versionInfos);
-                if (reconciledPackages != null
-                        && renameAndUpdatePaths(requests)
+                if (reconciledPackages == null) {
+                    return;
+                }
+                if (Flags.improveInstallFreeze()) {
+                    prepPerformDexoptIfNeeded(reconciledPackages);
+                }
+                if (renameAndUpdatePaths(requests)
                         && commitInstallPackages(reconciledPackages)) {
                     success = true;
                 }
@@ -1031,6 +1036,75 @@
         }
     }
 
+    private int[] getNewUsers(InstallRequest installRequest, int[] allUsers)
+            throws PackageManagerException {
+        final int userId = installRequest.getUserId();
+        if (userId != UserHandle.USER_ALL && userId != UserHandle.USER_CURRENT
+                && !mPm.mUserManager.exists(userId)) {
+            throw new PackageManagerException(PackageManagerException.INTERNAL_ERROR_MISSING_USER,
+                    "User " + userId + " doesn't exist or has been removed");
+        }
+
+        final IntArray newUserIds = new IntArray();
+        if (userId != UserHandle.USER_ALL) {
+            newUserIds.add(userId);
+        } else if (allUsers != null) {
+            final int[] installedForUsers = installRequest.getOriginUsers();
+            for (int currentUserId : allUsers) {
+                final boolean installedForCurrentUser = ArrayUtils.contains(
+                        installedForUsers, currentUserId);
+                final boolean restrictedByPolicy =
+                        mPm.isUserRestricted(currentUserId,
+                                UserManager.DISALLOW_INSTALL_APPS)
+                                || mPm.isUserRestricted(currentUserId,
+                                UserManager.DISALLOW_DEBUGGING_FEATURES);
+                if (installedForCurrentUser || !restrictedByPolicy) {
+                    newUserIds.add(currentUserId);
+                }
+            }
+        }
+
+        if (newUserIds.size() == 0) {
+            throw new PackageManagerException(PackageManagerException.INTERNAL_ERROR_MISSING_USER,
+                    "User " + userId + " doesn't exist or has been removed");
+        } else {
+            return newUserIds.toArray();
+        }
+    }
+
+    private void prepPerformDexoptIfNeeded(List<ReconciledPackage> reconciledPackages) {
+        for (ReconciledPackage reconciledPkg : reconciledPackages) {
+            final InstallRequest request = reconciledPkg.mInstallRequest;
+            // prepare profiles
+            final PackageSetting ps = request.getScannedPackageSetting();
+            final PackageSetting oldPkgSetting = request.getScanRequestOldPackageSetting();
+            final int[] allUsers = mPm.mUserManager.getUserIds();
+            if (reconciledPkg.mCollectedSharedLibraryInfos != null
+                    || (oldPkgSetting != null
+                    && !oldPkgSetting.getSharedLibraryDependencies().isEmpty())) {
+                // Reconcile if the new package or the old package uses shared libraries.
+                // It is possible that the old package uses shared libraries but the new
+                // one doesn't.
+                mSharedLibraries.executeSharedLibrariesUpdate(request.getParsedPackage(), ps,
+                        null, null, reconciledPkg.mCollectedSharedLibraryInfos, allUsers);
+            }
+            try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
+                final int[] newUsers = getNewUsers(request, allUsers);
+                // Hardcode previousAppId to 0 to disable any data migration (http://b/221088088)
+                mAppDataHelper.prepareAppDataPostCommitLIF(ps, 0, newUsers);
+                if (request.isClearCodeCache()) {
+                    mAppDataHelper.clearAppDataLIF(ps.getPkg(), UserHandle.USER_ALL,
+                            FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL
+                                    | Installer.FLAG_CLEAR_CODE_CACHE_ONLY);
+                }
+            } catch (PackageManagerException e) {
+                request.setError(e.error, e.getMessage());
+                return;
+            }
+            DexOptHelper.performDexoptIfNeeded(request, mDexManager, mContext, null);
+        }
+    }
+
     private boolean renameAndUpdatePaths(List<InstallRequest> requests) {
         try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
             for (InstallRequest request : requests) {
@@ -2655,20 +2729,22 @@
                 incrementalStorages.add(storage);
             }
 
-            // Hardcode previousAppId to 0 to disable any data migration (http://b/221088088)
-            mAppDataHelper.prepareAppDataPostCommitLIF(ps, 0, installRequest.getNewUsers());
-            if (installRequest.isClearCodeCache()) {
-                mAppDataHelper.clearAppDataLIF(ps.getPkg(), UserHandle.USER_ALL,
-                        FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL
-                                | Installer.FLAG_CLEAR_CODE_CACHE_ONLY);
-            }
             if (installRequest.isInstallReplace() && pkg != null) {
                 mDexManager.notifyPackageUpdated(packageName,
                         pkg.getBaseApkPath(), pkg.getSplitCodePaths());
             }
+            if (!Flags.improveInstallFreeze()) {
+                // Hardcode previousAppId to 0 to disable any data migration (http://b/221088088)
+                mAppDataHelper.prepareAppDataPostCommitLIF(ps, 0, installRequest.getNewUsers());
+                if (installRequest.isClearCodeCache()) {
+                    mAppDataHelper.clearAppDataLIF(ps.getPkg(), UserHandle.USER_ALL,
+                            FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL
+                                    | Installer.FLAG_CLEAR_CODE_CACHE_ONLY);
+                }
 
-            DexOptHelper.performDexoptIfNeeded(installRequest, mDexManager, mContext,
-                    mPm.mInstallLock.getRawLock());
+                DexOptHelper.performDexoptIfNeeded(installRequest, mDexManager, mContext,
+                        mPm.mInstallLock.getRawLock());
+            }
         }
         PackageManagerServiceUtils.waitForNativeBinariesExtractionForIncremental(
                 incrementalStorages);
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index 8657de2..5653da0 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -716,7 +716,7 @@
                     visiblePackages.add(info.getActivityInfo().packageName);
                 }
                 final List<ApplicationInfo> installedPackages =
-                        mPackageManagerInternal.getInstalledApplicationsCrossUser(
+                        mPackageManagerInternal.getInstalledApplications(
                                 /* flags= */ 0, user.getIdentifier(), callingUid);
                 for (ApplicationInfo applicationInfo : installedPackages) {
                     if (!visiblePackages.contains(applicationInfo.packageName)) {
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 1316df1..34d939b 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -50,6 +50,7 @@
 import android.app.admin.DevicePolicyEventLogger;
 import android.app.admin.DevicePolicyManager;
 import android.app.admin.DevicePolicyManagerInternal;
+import android.app.role.RoleManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentSender;
@@ -125,6 +126,7 @@
 import com.android.server.SystemServiceManager;
 import com.android.server.pm.pkg.PackageStateInternal;
 import com.android.server.pm.utils.RequestThrottle;
+import com.android.server.pm.verify.pkg.VerifierController;
 
 import libcore.io.IoUtils;
 
@@ -201,6 +203,9 @@
             Manifest.permission.USE_FULL_SCREEN_INTENT
     );
 
+    private static final String ROLE_SYSTEM_APP_PROTECTION_SERVICE =
+            "android.app.role.SYSTEM_APP_PROTECTION_SERVICE";
+
     final PackageArchiver mPackageArchiver;
 
     private final Context mContext;
@@ -209,6 +214,7 @@
     private final StagingManager mStagingManager;
 
     private AppOpsManager mAppOps;
+    private final VerifierController mVerifierController;
 
     private final HandlerThread mInstallThread;
     private final Handler mInstallHandler;
@@ -321,6 +327,7 @@
         mGentleUpdateHelper = new GentleUpdateHelper(
                 context, mInstallThread.getLooper(), new AppStateHelper(context));
         mPackageArchiver = new PackageArchiver(mContext, mPm);
+        mVerifierController = new VerifierController(mContext, mInstallHandler);
 
         LocalServices.getService(SystemServiceManager.class).startService(
                 new Lifecycle(context, this));
@@ -517,7 +524,8 @@
                         try {
                             session = PackageInstallerSession.readFromXml(in, mInternalCallback,
                                     mContext, mPm, mInstallThread.getLooper(), mStagingManager,
-                                    mSessionsDir, this, mSilentUpdatePolicy);
+                                    mSessionsDir, this, mSilentUpdatePolicy,
+                                    mVerifierController);
                         } catch (Exception e) {
                             Slog.e(TAG, "Could not read session", e);
                             continue;
@@ -1033,7 +1041,8 @@
                 mSilentUpdatePolicy, mInstallThread.getLooper(), mStagingManager, sessionId,
                 userId, callingUid, installSource, params, createdMillis, 0L, stageDir, stageCid,
                 null, null, false, false, false, false, null, SessionInfo.INVALID_ID,
-                false, false, false, PackageManager.INSTALL_UNKNOWN, "", null);
+                false, false, false, PackageManager.INSTALL_UNKNOWN, "", null,
+                mVerifierController);
 
         synchronized (mSessions) {
             mSessions.put(sessionId, session);
@@ -1043,6 +1052,7 @@
         mCallbacks.notifySessionCreated(session.sessionId, session.userId);
 
         mSettingsWriteRequest.schedule();
+
         if (LOGD) {
             Slog.d(TAG, "Created session id=" + sessionId + " staged=" + params.isStaged);
         }
@@ -1454,6 +1464,12 @@
                     .createEvent(DevicePolicyEnums.UNINSTALL_PACKAGE)
                     .setAdmin(callerPackageName)
                     .write();
+        } else if (isSystemAppProtectionRoleHolder(snapshot, userId, callingUid)) {
+            // Allow the SYSTEM_APP_PROTECTION_SERVICE role holder to silently uninstall, with a
+            // clean calling identity to get DELETE_PACKAGES permission
+            Binder.withCleanCallingIdentity(() ->
+                    mPm.deletePackageVersioned(versionedPackage, adapter.getBinder(), userId, flags)
+            );
         } else {
             ApplicationInfo appInfo = snapshot.getApplicationInfo(callerPackageName, 0, userId);
             if (appInfo.targetSdkVersion >= Build.VERSION_CODES.P) {
@@ -1475,6 +1491,29 @@
         }
     }
 
+    private Boolean isSystemAppProtectionRoleHolder(
+            @NonNull Computer snapshot, int userId, int callingUid) {
+        if (!Flags.deletePackagesSilentlyBackport()) {
+            return false;
+        }
+        String holderPackageName = Binder.withCleanCallingIdentity(() -> {
+            RoleManager roleManager = mPm.mContext.getSystemService(RoleManager.class);
+            if (roleManager == null) {
+                return null;
+            }
+            List<String> holders = roleManager.getRoleHoldersAsUser(
+                    ROLE_SYSTEM_APP_PROTECTION_SERVICE, UserHandle.of(userId));
+            if (holders.isEmpty()) {
+                return null;
+            }
+            return holders.get(0);
+        });
+        if (holderPackageName == null) {
+            return false;
+        }
+        return snapshot.getPackageUid(holderPackageName, /* flags= */ 0, userId) == callingUid;
+    }
+
     @Override
     public void uninstallExistingPackage(VersionedPackage versionedPackage,
             String callerPackageName, IntentSender statusReceiver, int userId) {
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index ff8a69d..897ee431 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -38,6 +38,7 @@
 import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
 import static android.content.pm.PackageManager.INSTALL_STAGED;
 import static android.content.pm.PackageManager.INSTALL_SUCCEEDED;
+import static android.content.pm.verify.pkg.VerificationSession.VERIFICATION_INCOMPLETE_UNKNOWN;
 import static android.os.Process.INVALID_UID;
 import static android.provider.DeviceConfig.NAMESPACE_PACKAGE_MANAGER_SERVICE;
 import static android.system.OsConstants.O_CREAT;
@@ -87,6 +88,7 @@
 import android.content.pm.DataLoaderParams;
 import android.content.pm.DataLoaderParamsParcel;
 import android.content.pm.FileSystemControlParcel;
+import android.content.pm.Flags;
 import android.content.pm.IDataLoader;
 import android.content.pm.IDataLoaderStatusListener;
 import android.content.pm.IOnChecksumsReadyListener;
@@ -108,6 +110,7 @@
 import android.content.pm.PackageManager.PackageInfoFlags;
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.SigningDetails;
+import android.content.pm.SigningInfo;
 import android.content.pm.dex.DexMetadataHelper;
 import android.content.pm.parsing.ApkLite;
 import android.content.pm.parsing.ApkLiteParseUtils;
@@ -115,6 +118,7 @@
 import android.content.pm.parsing.result.ParseResult;
 import android.content.pm.parsing.result.ParseTypeImpl;
 import android.content.pm.verify.domain.DomainSet;
+import android.content.pm.verify.pkg.VerificationStatus;
 import android.content.res.ApkAssets;
 import android.content.res.AssetManager;
 import android.content.res.Configuration;
@@ -122,6 +126,7 @@
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.icu.util.ULocale;
+import android.net.Uri;
 import android.os.Binder;
 import android.os.Build;
 import android.os.Bundle;
@@ -133,6 +138,7 @@
 import android.os.Message;
 import android.os.ParcelFileDescriptor;
 import android.os.ParcelableException;
+import android.os.PersistableBundle;
 import android.os.Process;
 import android.os.RemoteException;
 import android.os.RevocableFileDescriptor;
@@ -190,6 +196,7 @@
 import com.android.server.pm.dex.DexManager;
 import com.android.server.pm.pkg.AndroidPackage;
 import com.android.server.pm.pkg.PackageStateInternal;
+import com.android.server.pm.verify.pkg.VerifierController;
 
 import libcore.io.IoUtils;
 import libcore.util.EmptyArray;
@@ -218,6 +225,7 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Predicate;
+import java.util.function.Supplier;
 
 public class PackageInstallerSession extends IPackageInstallerSession.Stub {
     private static final String TAG = "PackageInstallerSession";
@@ -404,6 +412,7 @@
      * Note all calls must be done outside {@link #mLock} to prevent lock inversion.
      */
     private final StagingManager mStagingManager;
+    @NonNull private final VerifierController mVerifierController;
 
     final int sessionId;
     final int userId;
@@ -1093,6 +1102,17 @@
         final boolean isUpdateOwnershipEnforcementEnabled =
                 mPm.isUpdateOwnershipEnforcementAvailable()
                         && existingUpdateOwnerPackageName != null;
+
+        if (Build.IS_USERDEBUG) {
+            Log.d("updateowner", "PackageInstallerSession computeUserActionRequirement"
+                    + " isUpdateOwnershipEnforcementEnabled= " + isUpdateOwnershipEnforcementEnabled
+                    + ", mPm.isUpdateOwnershipEnforcementAvailable= "
+                    + mPm.isUpdateOwnershipEnforcementAvailable()
+                    + ", existingUpdateOwnerPackageName=" + existingUpdateOwnerPackageName
+                    + ", isUpdateOwner= " + isUpdateOwner + ", getInstallerPackageName()= "
+                    + getInstallerPackageName() + ", isInstallerShell= " + isInstallerShell
+                    + ", mInstallerUid=" + mInstallerUid + ", packageName = " + packageName);
+        }
         // For an installation that un-archives an app, if the installer doesn't have the
         // INSTALL_PACKAGES permission, the user should have already been prompted to confirm the
         // un-archive request. There's no need for another confirmation during the installation.
@@ -1106,6 +1126,10 @@
                 || isInstallUnarchive;
 
         if (noUserActionNecessary) {
+            if (Build.IS_USERDEBUG) {
+                Log.d("updateowner", "PackageInstallerSession computeUserActionRequirement"
+                                + " noUserActionNecessary userActionNotTypicallyNeededResponse");
+            }
             return userActionNotTypicallyNeededResponse;
         }
 
@@ -1115,15 +1139,27 @@
                 && !isInstallerShell
                 // We don't enforce the update ownership for the managed user and profile.
                 && !isFromManagedUserOrProfile) {
+            if (Build.IS_USERDEBUG) {
+                Log.d("updateowner", "PackageInstallerSession computeUserActionRequirement"
+                        + "USER_ACTION_REQUIRED_UPDATE_OWNER_REMINDER");
+            }
             return USER_ACTION_REQUIRED_UPDATE_OWNER_REMINDER;
         }
 
         if (isPermissionGranted) {
+            if (Build.IS_USERDEBUG) {
+                Log.d("updateowner", "PackageInstallerSession computeUserActionRequirement"
+                        + " permission userActionNotTypicallyNeededResponse");
+            }
             return userActionNotTypicallyNeededResponse;
         }
 
         if (snapshot.isInstallDisabledForPackage(getInstallerPackageName(), mInstallerUid,
                 userId)) {
+            if (Build.IS_USERDEBUG) {
+                Log.d("updateowner", "PackageInstallerSession computeUserActionRequirement"
+                        + " disable USER_ACTION_REQUIRED");
+            }
             // show the installer to account for device policy or unknown sources use cases
             return USER_ACTION_REQUIRED;
         }
@@ -1132,9 +1168,17 @@
                 && isUpdateWithoutUserActionPermissionGranted
                 && ((isUpdateOwnershipEnforcementEnabled ? isUpdateOwner
                 : isInstallerOfRecord) || isSelfUpdate)) {
+            if (Build.IS_USERDEBUG) {
+                Log.d("updateowner", "PackageInstallerSession computeUserActionRequirement"
+                        + " USER_ACTION_PENDING_APK_PARSING");
+            }
             return USER_ACTION_PENDING_APK_PARSING;
         }
 
+        if (Build.IS_USERDEBUG) {
+            Log.d("updateowner", "PackageInstallerSession computeUserActionRequirement"
+                    + " USER_ACTION_REQUIRED");
+        }
         return USER_ACTION_REQUIRED;
     }
 
@@ -1156,7 +1200,8 @@
             boolean prepared, boolean committed, boolean destroyed, boolean sealed,
             @Nullable int[] childSessionIds, int parentSessionId, boolean isReady,
             boolean isFailed, boolean isApplied, int sessionErrorCode,
-            String sessionErrorMessage, DomainSet preVerifiedDomains) {
+            String sessionErrorMessage, DomainSet preVerifiedDomains,
+            @NonNull VerifierController verifierController) {
         mCallback = callback;
         mContext = context;
         mPm = pm;
@@ -1165,6 +1210,7 @@
         mSilentUpdatePolicy = silentUpdatePolicy;
         mHandler = new Handler(looper, mHandlerCallback);
         mStagingManager = stagingManager;
+        mVerifierController = verifierController;
 
         this.sessionId = sessionId;
         this.userId = userId;
@@ -1249,6 +1295,14 @@
                         "Archived installation can only use Streaming System DataLoader.");
             }
         }
+
+        if (Flags.verificationService()) {
+            // Start binding to the verification service, if not bound already.
+            mVerifierController.bindToVerifierServiceIfNeeded(() -> pm.snapshotComputer(), userId);
+            if (!TextUtils.isEmpty(params.appPackageName)) {
+                mVerifierController.notifyPackageNameAvailable(params.appPackageName);
+            }
+        }
     }
 
     PackageInstallerHistoricalSession createHistoricalSession() {
@@ -2695,6 +2749,11 @@
         @UserActionRequirement int userActionRequirement = USER_ACTION_NOT_NEEDED;
         // TODO(b/159331446): Move this to makeSessionActiveForInstall and update javadoc
         userActionRequirement = session.computeUserActionRequirement();
+        if (Build.IS_USERDEBUG) {
+            Log.d("updateowner", "PackageInstallerSession checkUserActionRequirement"
+                    + " userActionRequirement= " + userActionRequirement
+                    + ", session.packageName= " + session.getPackageName());
+        }
         session.updateUserActionRequirement(userActionRequirement);
         if (userActionRequirement == USER_ACTION_REQUIRED
                 || userActionRequirement == USER_ACTION_REQUIRED_UPDATE_OWNER_REMINDER) {
@@ -2821,7 +2880,35 @@
             // since installation is in progress.
             activate();
         }
+        if (Flags.verificationService()) {
+            final Supplier<Computer> snapshotSupplier = mPm::snapshotComputer;
+            if (mVerifierController.isVerifierInstalled(snapshotSupplier, userId)) {
+                // TODO: extract shared library declarations
+                final SigningInfo signingInfo;
+                synchronized (mLock) {
+                    signingInfo = new SigningInfo(mSigningDetails);
+                }
+                // Send the request to the verifier and wait for its response before the rest of
+                // the installation can proceed.
+                if (!mVerifierController.startVerificationSession(snapshotSupplier, userId,
+                        sessionId, params.appPackageName, Uri.fromFile(stageDir), signingInfo,
+                        /* declaredLibraries= */null, /* extensionParams= */ null,
+                        new VerifierCallback(), /* retry= */ false)) {
+                    // A verifier is installed but cannot be connected. Installation disallowed.
+                    onSessionVerificationFailure(INSTALL_FAILED_INTERNAL_ERROR,
+                            "A verifier agent is available on device but cannot be connected.");
+                }
+            } else {
+                // Verifier is not installed. Let the installation pass for now.
+                resumeVerify();
+            }
+        } else {
+            // New verification feature is not enabled. Proceed to the rest of the verification.
+            resumeVerify();
+        }
+    }
 
+    private void resumeVerify() {
         if (mVerificationInProgress) {
             Slog.w(TAG, "Verification is already in progress for session " + sessionId);
             return;
@@ -2856,6 +2943,66 @@
         }
     }
 
+    /**
+     * Used for the VerifierController to report status back.
+     */
+    public class VerifierCallback {
+        /**
+         * Called by the VerifierController when the connection has failed.
+         */
+        public void onConnectionFailed() {
+            mHandler.post(() -> {
+                onSessionVerificationFailure(INSTALL_FAILED_VERIFICATION_FAILURE,
+                            "A verifier agent is available on device but cannot be connected.");
+            });
+        }
+        /**
+         * Called by the VerifierController when the verification request has timed out.
+         */
+        public void onTimeout() {
+            mHandler.post(() -> {
+                mVerifierController.notifyVerificationTimeout(sessionId);
+                onSessionVerificationFailure(INSTALL_FAILED_VERIFICATION_FAILURE,
+                        "Verification timed out; missing a response from the verifier within the"
+                                + " time limit");
+            });
+        }
+        /**
+         * Called by the VerifierController when the verification request has received a complete
+         * response.
+         */
+        public void onVerificationCompleteReceived(@NonNull VerificationStatus statusReceived,
+                @Nullable PersistableBundle extensionResponse) {
+            // TODO: handle extension response
+            mHandler.post(() -> {
+                if (statusReceived.isVerified()) {
+                    // Continue with the rest of the verification and installation.
+                    resumeVerify();
+                } else {
+                    StringBuilder sb = new StringBuilder("Verifier rejected the installation");
+                    if (!TextUtils.isEmpty(statusReceived.getFailureMessage())) {
+                        sb.append(" with message: ").append(statusReceived.getFailureMessage());
+                    }
+                    onSessionVerificationFailure(INSTALL_FAILED_VERIFICATION_FAILURE,
+                            sb.toString());
+                }
+            });
+        }
+        /**
+         * Called by the VerifierController when the verification request has received an incomplete
+         * response.
+         */
+        public void onVerificationIncompleteReceived(int incompleteReason) {
+            mHandler.post(() -> {
+                if (incompleteReason == VERIFICATION_INCOMPLETE_UNKNOWN) {
+                    // TODO: change this to a user confirmation and handle other incomplete reasons
+                    onSessionVerificationFailure(INSTALL_FAILED_INTERNAL_ERROR,
+                            "Verification cannot be completed for unknown reasons.");
+                }
+            });
+        }
+    }
+
     private IntentSender getRemoteStatusReceiver() {
         synchronized (mLock) {
             return mRemoteStatusReceiver;
@@ -5369,6 +5516,14 @@
             }
         } catch (InstallerException ignored) {
         }
+        if (Flags.verificationService()
+                && !TextUtils.isEmpty(params.appPackageName)
+                && !isCommitted()) {
+            // Only notify for the cancellation if the verification request has not
+            // been sent out, which happens right after commit() is called.
+            mVerifierController.notifyVerificationCancelled(
+                    params.appPackageName);
+        }
     }
 
     void dump(IndentingPrintWriter pw) {
@@ -5768,7 +5923,8 @@
             @NonNull PackageManagerService pm, Looper installerThread,
             @NonNull StagingManager stagingManager, @NonNull File sessionsDir,
             @NonNull PackageSessionProvider sessionProvider,
-            @NonNull SilentUpdatePolicy silentUpdatePolicy)
+            @NonNull SilentUpdatePolicy silentUpdatePolicy,
+            @NonNull VerifierController verifierController)
             throws IOException, XmlPullParserException {
         final int sessionId = in.getAttributeInt(null, ATTR_SESSION_ID);
         final int userId = in.getAttributeInt(null, ATTR_USER_ID);
@@ -5972,6 +6128,6 @@
                 installerUid, installSource, params, createdMillis, committedMillis, stageDir,
                 stageCid, fileArray, checksumsMap, prepared, committed, destroyed, sealed,
                 childSessionIdsArray, parentSessionId, isReady, isFailed, isApplied,
-                sessionErrorCode, sessionErrorMessage, preVerifiedDomains);
+                sessionErrorCode, sessionErrorMessage, preVerifiedDomains, verifierController);
     }
 }
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 611e0d8..c8cf938 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -340,7 +340,7 @@
     static final boolean DEBUG_UPGRADE = false;
     static final boolean DEBUG_DOMAIN_VERIFICATION = false;
     static final boolean DEBUG_BACKUP = false;
-    public static final boolean DEBUG_INSTALL = false;
+    public static final boolean DEBUG_INSTALL = Build.IS_USERDEBUG;
     public static final boolean DEBUG_REMOVE = false;
     static final boolean DEBUG_PACKAGE_INFO = false;
     static final boolean DEBUG_INTENT_MATCHING = false;
diff --git a/services/core/java/com/android/server/pm/PackageMonitorCallbackHelper.java b/services/core/java/com/android/server/pm/PackageMonitorCallbackHelper.java
index cf5de89..a28e3c1 100644
--- a/services/core/java/com/android/server/pm/PackageMonitorCallbackHelper.java
+++ b/services/core/java/com/android/server/pm/PackageMonitorCallbackHelper.java
@@ -244,7 +244,7 @@
                 return;
             }
             int registerUid = registerUser.getUid();
-            if (allowUids != null && registerUid != Process.SYSTEM_UID
+            if (allowUids != null && !UserHandle.isSameApp(registerUid, Process.SYSTEM_UID)
                     && !ArrayUtils.contains(allowUids, registerUid)) {
                 if (DEBUG) {
                     Slog.w(TAG, "Skip invoke PackageMonitorCallback for " + intent.getAction()
diff --git a/services/core/java/com/android/server/pm/TEST_MAPPING b/services/core/java/com/android/server/pm/TEST_MAPPING
index 21a6df2..94b49e5 100644
--- a/services/core/java/com/android/server/pm/TEST_MAPPING
+++ b/services/core/java/com/android/server/pm/TEST_MAPPING
@@ -101,6 +101,22 @@
       ]
     },
     {
+      "name": "CtsPackageInstallerCUJDeviceAdminTestCases",
+      "file_patterns": [
+        "core/java/.*Install.*",
+        "services/core/.*Install.*",
+        "services/core/java/com/android/server/pm/.*"
+      ],
+      "options":[
+          {
+              "exclude-annotation":"androidx.test.filters.FlakyTest"
+          },
+          {
+              "exclude-annotation":"org.junit.Ignore"
+          }
+      ]
+    },
+    {
       "name": "CtsPackageInstallerCUJInstallationTestCases",
       "file_patterns": [
         "core/java/.*Install.*",
@@ -117,6 +133,22 @@
       ]
     },
     {
+      "name": "CtsPackageInstallerCUJMultiUsersTestCases",
+      "file_patterns": [
+        "core/java/.*Install.*",
+        "services/core/.*Install.*",
+        "services/core/java/com/android/server/pm/.*"
+      ],
+      "options":[
+          {
+              "exclude-annotation":"androidx.test.filters.FlakyTest"
+          },
+          {
+              "exclude-annotation":"org.junit.Ignore"
+          }
+      ]
+    },
+    {
       "name": "CtsPackageInstallerCUJUninstallationTestCases",
       "file_patterns": [
         "core/java/.*Install.*",
diff --git a/services/core/java/com/android/server/pm/local/PackageManagerLocalImpl.java b/services/core/java/com/android/server/pm/local/PackageManagerLocalImpl.java
index 55afb17..c22e382 100644
--- a/services/core/java/com/android/server/pm/local/PackageManagerLocalImpl.java
+++ b/services/core/java/com/android/server/pm/local/PackageManagerLocalImpl.java
@@ -31,6 +31,7 @@
 import com.android.server.pm.PackageManagerLocal;
 import com.android.server.pm.PackageManagerService;
 import com.android.server.pm.pkg.PackageState;
+import com.android.server.pm.pkg.PackageStateInternal;
 import com.android.server.pm.pkg.SharedUserApi;
 import com.android.server.pm.snapshot.PackageDataSnapshot;
 
@@ -71,8 +72,26 @@
     @NonNull
     @Override
     public FilteredSnapshotImpl withFilteredSnapshot(int callingUid, @NonNull UserHandle user) {
+        return withFilteredSnapshot(callingUid, user, /* uncommittedPs= */ null);
+    }
+
+    /**
+     * Creates a {@link FilteredSnapshot} with a uncommitted {@link PackageState} that is used for
+     * dexopt in the art service to get the correct package state before the package is committed.
+     */
+    @NonNull
+    public static FilteredSnapshotImpl withFilteredSnapshot(PackageManagerLocal pm,
+            @NonNull PackageState uncommittedPs) {
+        return ((PackageManagerLocalImpl) pm).withFilteredSnapshot(Binder.getCallingUid(),
+                Binder.getCallingUserHandle(), uncommittedPs);
+    }
+
+    @NonNull
+    private FilteredSnapshotImpl withFilteredSnapshot(int callingUid, @NonNull UserHandle user,
+            @Nullable PackageState uncommittedPs) {
         return new FilteredSnapshotImpl(callingUid, user,
-                mService.snapshotComputer(false /*allowLiveComputer*/), null);
+                mService.snapshotComputer(/* allowLiveComputer= */ false),
+                /* parentSnapshot= */ null, uncommittedPs);
     }
 
     @Override
@@ -145,7 +164,8 @@
 
         @Override
         public FilteredSnapshot filtered(int callingUid, @NonNull UserHandle user) {
-            return new FilteredSnapshotImpl(callingUid, user, mSnapshot, this);
+            return new FilteredSnapshotImpl(callingUid, user, mSnapshot, this,
+                    /* uncommittedPs= */ null);
         }
 
         @SuppressWarnings("RedundantSuppression")
@@ -209,13 +229,18 @@
         @Nullable
         private final UnfilteredSnapshotImpl mParentSnapshot;
 
+        @Nullable
+        private final PackageState mUncommitPackageState;
+
         private FilteredSnapshotImpl(int callingUid, @NonNull UserHandle user,
                 @NonNull PackageDataSnapshot snapshot,
-                @Nullable UnfilteredSnapshotImpl parentSnapshot) {
+                @Nullable UnfilteredSnapshotImpl parentSnapshot,
+                @Nullable PackageState uncommittedPs) {
             super(snapshot);
             mCallingUid = callingUid;
             mUserId = user.getIdentifier();
             mParentSnapshot = parentSnapshot;
+            mUncommitPackageState = uncommittedPs;
         }
 
         @Override
@@ -237,6 +262,10 @@
         @Override
         public PackageState getPackageState(@NonNull String packageName) {
             checkClosed();
+            if (mUncommitPackageState != null
+                    && packageName.equals(mUncommitPackageState.getPackageName())) {
+                return mUncommitPackageState;
+            }
             return mSnapshot.getPackageStateFiltered(packageName, mCallingUid, mUserId);
         }
 
@@ -250,6 +279,11 @@
                 var filteredPackageStates = new ArrayMap<String, PackageState>();
                 for (int index = 0, size = packageStates.size(); index < size; index++) {
                     var packageState = packageStates.valueAt(index);
+                    if (mUncommitPackageState != null
+                            && packageState.getPackageName().equals(
+                            mUncommitPackageState.getPackageName())) {
+                        packageState = (PackageStateInternal) mUncommitPackageState;
+                    }
                     if (!mSnapshot.shouldFilterApplication(packageState, mCallingUid, mUserId)) {
                         filteredPackageStates.put(packageStates.keyAt(index), packageState);
                     }
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index 6e7a009..bc6a40a 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -884,10 +884,13 @@
             }
 
             // Allow voice search on wear
-            grantPermissionsToSystemPackage(pm,
-                    getDefaultSystemHandlerActivityPackage(pm,
-                            SearchManager.INTENT_ACTION_GLOBAL_SEARCH, userId),
-                    userId, PHONE_PERMISSIONS, CALENDAR_PERMISSIONS, NEARBY_DEVICES_PERMISSIONS);
+            String voiceSearchPackage = getDefaultSystemHandlerActivityPackage(pm,
+                    SearchManager.INTENT_ACTION_GLOBAL_SEARCH, userId);
+            grantPermissionsToSystemPackage(pm, voiceSearchPackage,
+                    userId, PHONE_PERMISSIONS, CALENDAR_PERMISSIONS, NEARBY_DEVICES_PERMISSIONS,
+                    COARSE_BACKGROUND_LOCATION_PERMISSIONS);
+            revokeRuntimePermissions(pm, voiceSearchPackage,
+                FINE_LOCATION_PERMISSIONS, false, userId);
         }
 
         // Print Spooler
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index df9f7fb..5fc3e33 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -1015,8 +1015,7 @@
                     permission, attributionSource, message, forDataDelivery, startDataDelivery,
                     fromDatasource, attributedOp);
             // Finish any started op if some step in the attribution chain failed.
-            if (startDataDelivery && result != PermissionChecker.PERMISSION_GRANTED
-                    && result != PermissionChecker.PERMISSION_SOFT_DENIED) {
+            if (startDataDelivery && result != PermissionChecker.PERMISSION_GRANTED) {
                 if (attributedOp == AppOpsManager.OP_NONE) {
                     finishDataDelivery(AppOpsManager.permissionToOpCode(permission),
                             attributionSource.asState(), fromDatasource);
diff --git a/services/core/java/com/android/server/pm/verify/pkg/VerificationStatusTracker.java b/services/core/java/com/android/server/pm/verify/pkg/VerificationStatusTracker.java
new file mode 100644
index 0000000..db747f9
--- /dev/null
+++ b/services/core/java/com/android/server/pm/verify/pkg/VerificationStatusTracker.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2024 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.verify.pkg;
+
+import android.annotation.CurrentTimeMillisLong;
+import android.annotation.NonNull;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+/**
+ * This class keeps record of the current timeout status of a verification request.
+ */
+public final class VerificationStatusTracker {
+    private final @CurrentTimeMillisLong long mStartTime;
+    private @CurrentTimeMillisLong long mTimeoutTime;
+    private final @CurrentTimeMillisLong long mMaxTimeoutTime;
+    @NonNull
+    private final VerifierController.Injector mInjector;
+    // Record the package name associated with the verification result
+    @NonNull
+    private final String mPackageName;
+
+    /**
+     * By default, the timeout time is the default timeout duration plus the current time (when
+     * the timer starts for a verification request). Both the default timeout time and the max
+     * timeout time cannot be changed after the timer has started, but the actual timeout time
+     * can be extended via {@link #extendTimeRemaining} to the maximum allowed.
+     */
+    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED)
+    public VerificationStatusTracker(@NonNull String packageName,
+            long defaultTimeoutMillis, long maxExtendedTimeoutMillis,
+            @NonNull VerifierController.Injector injector) {
+        mPackageName = packageName;
+        mStartTime = injector.getCurrentTimeMillis();
+        mTimeoutTime = mStartTime + defaultTimeoutMillis;
+        mMaxTimeoutTime = mStartTime + maxExtendedTimeoutMillis;
+        mInjector = injector;
+    }
+
+    /**
+     * Used by the controller to inform the verifier agent about the timestamp when the verification
+     * request will timeout.
+     */
+    public @CurrentTimeMillisLong long getTimeoutTime() {
+        return mTimeoutTime;
+    }
+
+    /**
+     * Used by the controller to decide when to check for timeout again.
+     * @return 0 if the timeout time has been reached, otherwise the remaining time in milliseconds
+     * before the timeout is reached.
+     */
+    public @CurrentTimeMillisLong long getRemainingTime() {
+        final long remainingTime = mTimeoutTime - mInjector.getCurrentTimeMillis();
+        if (remainingTime < 0) {
+            return 0;
+        }
+        return remainingTime;
+    }
+
+    /**
+     * Used by the controller to extend the timeout duration of the verification request, upon
+     * receiving the callback from the verifier agent.
+     * @return the amount of time in millis that the timeout has been extended, subject to the max
+     * amount allowed.
+     */
+    public long extendTimeRemaining(@CurrentTimeMillisLong long additionalMs) {
+        if (mTimeoutTime + additionalMs > mMaxTimeoutTime) {
+            additionalMs = mMaxTimeoutTime - mTimeoutTime;
+        }
+        mTimeoutTime += additionalMs;
+        return additionalMs;
+    }
+
+    /**
+     * Used by the controller to get the timeout status of the request.
+     * @return False if the request still has some time left before timeout, otherwise return True.
+     */
+    public boolean isTimeout() {
+        return mInjector.getCurrentTimeMillis() >= mTimeoutTime;
+    }
+
+    @NonNull
+    public String getPackageName() {
+        return mPackageName;
+    }
+}
diff --git a/services/core/java/com/android/server/pm/verify/pkg/VerifierController.java b/services/core/java/com/android/server/pm/verify/pkg/VerifierController.java
new file mode 100644
index 0000000..7eac940
--- /dev/null
+++ b/services/core/java/com/android/server/pm/verify/pkg/VerifierController.java
@@ -0,0 +1,645 @@
+/*
+ * Copyright (C) 2024 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.verify.pkg;
+
+import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
+import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
+import static android.os.Process.SYSTEM_UID;
+import static android.provider.DeviceConfig.NAMESPACE_PACKAGE_MANAGER_SERVICE;
+
+import android.Manifest;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.annotation.SuppressLint;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.SharedLibraryInfo;
+import android.content.pm.SigningInfo;
+import android.content.pm.verify.pkg.IVerificationSessionCallback;
+import android.content.pm.verify.pkg.IVerificationSessionInterface;
+import android.content.pm.verify.pkg.IVerifierService;
+import android.content.pm.verify.pkg.VerificationSession;
+import android.content.pm.verify.pkg.VerificationStatus;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Handler;
+import android.os.PersistableBundle;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.provider.DeviceConfig;
+import android.util.Pair;
+import android.util.Slog;
+import android.util.SparseArray;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.infra.AndroidFuture;
+import com.android.internal.infra.ServiceConnector;
+import com.android.server.pm.Computer;
+import com.android.server.pm.PackageInstallerSession;
+import com.android.server.pm.pkg.PackageStateInternal;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
+
+/**
+ * This class manages the bind to the verifier agent installed on the device that implements
+ * {@link android.content.pm.verify.pkg.VerifierService} and handles all its interactions.
+ */
+public class VerifierController {
+    private static final String TAG = "VerifierController";
+    private static final boolean DEBUG = false;
+
+    /**
+     * Configurable maximum amount of time in milliseconds to wait for a verifier to respond to
+     * a verification request.
+     * Flag type: {@code long}
+     * Namespace: NAMESPACE_PACKAGE_MANAGER_SERVICE
+     */
+    private static final String PROPERTY_VERIFICATION_REQUEST_TIMEOUT_MILLIS =
+            "verification_request_timeout_millis";
+    // Default duration to wait for a verifier to respond to a verification request.
+    private static final long DEFAULT_VERIFICATION_REQUEST_TIMEOUT_MILLIS =
+            TimeUnit.MINUTES.toMillis(1);
+    /**
+     * Configurable maximum amount of time in milliseconds that the verifier can request to extend
+     * the verification request timeout duration to. This is the maximum amount of time the system
+     * can wait for a request before it times out.
+     * Flag type: {@code long}
+     * Namespace: NAMESPACE_PACKAGE_MANAGER_SERVICE
+     */
+    private static final String PROPERTY_MAX_VERIFICATION_REQUEST_EXTENDED_TIMEOUT_MILLIS =
+            "max_verification_request_extended_timeout_millis";
+    // Max duration allowed to wait for a verifier to respond to a verification request.
+    private static final long DEFAULT_MAX_VERIFICATION_REQUEST_EXTENDED_TIMEOUT_MILLIS =
+            TimeUnit.MINUTES.toMillis(10);
+    // The maximum amount of time to wait from the moment when the session requires a verification,
+    // till when the request is delivered to the verifier, pending the connection to be established.
+    private static final long CONNECTION_TIMEOUT_SECONDS = 10;
+    // The maximum amount of time to wait before the system unbinds from the verifier.
+    private static final long UNBIND_TIMEOUT_MILLIS = TimeUnit.HOURS.toMillis(6);
+
+    private final Context mContext;
+    private final Handler mHandler;
+    @Nullable
+    private ServiceConnector<IVerifierService> mRemoteService;
+    @Nullable
+    private ComponentName mRemoteServiceComponentName;
+    @NonNull
+    private Injector mInjector;
+
+    // Repository of active verification sessions and their status, mapping from id to status.
+    @NonNull
+    @GuardedBy("mVerificationStatus")
+    private final SparseArray<VerificationStatusTracker> mVerificationStatus = new SparseArray<>();
+
+    public VerifierController(@NonNull Context context, @NonNull Handler handler) {
+        this(context, handler, new Injector());
+    }
+
+    @VisibleForTesting
+    public VerifierController(@NonNull Context context, @NonNull Handler handler,
+            @NonNull Injector injector) {
+        mContext = context;
+        mHandler = handler;
+        mInjector = injector;
+    }
+
+    /**
+     * Used by the installation session to check if a verifier is installed.
+     */
+    public boolean isVerifierInstalled(Supplier<Computer> snapshotSupplier, int userId) {
+        if (isVerifierConnected()) {
+            // Verifier is connected or is being connected, so it must be installed.
+            return true;
+        }
+        // Verifier has been disconnected, or it hasn't been connected. Check if it's installed.
+        return mInjector.isVerifierInstalled(snapshotSupplier.get(), userId);
+    }
+
+    /**
+     * Called to start querying and binding to a qualified verifier agent.
+     *
+     * @return False if a qualified verifier agent doesn't exist on device, so that the system can
+     * handle this situation immediately after the call.
+     * <p>
+     * Notice that since this is an async call, even if this method returns true, it doesn't
+     * necessarily mean that the binding connection was successful. However, the system will only
+     * try to bind once per installation session, so that it doesn't waste resource by repeatedly
+     * trying to bind if the verifier agent isn't available during a short amount of time.
+     * <p>
+     * If the verifier agent exists but cannot be started for some reason, all the notify* methods
+     * in this class will fail asynchronously and quietly. The system will learn about the failure
+     * after receiving the failure from
+     * {@link PackageInstallerSession.VerifierCallback#onConnectionFailed}.
+     */
+    public boolean bindToVerifierServiceIfNeeded(Supplier<Computer> snapshotSupplier, int userId) {
+        if (DEBUG) {
+            Slog.i(TAG, "Requesting to bind to the verifier service.");
+        }
+        if (mRemoteService != null) {
+            // Already connected
+            if (DEBUG) {
+                Slog.i(TAG, "Verifier service is already connected.");
+            }
+            return true;
+        }
+        Pair<ServiceConnector<IVerifierService>, ComponentName> result =
+                mInjector.getRemoteService(snapshotSupplier.get(), mContext, userId, mHandler);
+        if (result == null || result.first == null) {
+            if (DEBUG) {
+                Slog.i(TAG, "Unable to find a qualified verifier.");
+            }
+            return false;
+        }
+        mRemoteService = result.first;
+        mRemoteServiceComponentName = result.second;
+        if (DEBUG) {
+            Slog.i(TAG, "Connecting to a qualified verifier: " + mRemoteServiceComponentName);
+        }
+        mRemoteService.setServiceLifecycleCallbacks(
+                new ServiceConnector.ServiceLifecycleCallbacks<>() {
+                    @Override
+                    public void onConnected(@NonNull IVerifierService service) {
+                        Slog.i(TAG, "Verifier " + mRemoteServiceComponentName + " is connected");
+                    }
+
+                    @Override
+                    public void onDisconnected(@NonNull IVerifierService service) {
+                        Slog.w(TAG,
+                                "Verifier " + mRemoteServiceComponentName + " is disconnected");
+                        destroy();
+                    }
+
+                    @Override
+                    public void onBinderDied() {
+                        Slog.w(TAG, "Verifier " + mRemoteServiceComponentName + " has died");
+                        destroy();
+                    }
+
+                    private void destroy() {
+                        if (isVerifierConnected()) {
+                            mRemoteService.unbind();
+                            mRemoteService = null;
+                            mRemoteServiceComponentName = null;
+                        }
+                    }
+                });
+        AndroidFuture<IVerifierService> unusedFuture = mRemoteService.connect();
+        return true;
+    }
+
+    private boolean isVerifierConnected() {
+        return mRemoteService != null && mRemoteServiceComponentName != null;
+    }
+
+    /**
+     * Called to notify the bound verifier agent that a package name is available and will soon be
+     * requested for verification.
+     */
+    public void notifyPackageNameAvailable(@NonNull String packageName) {
+        if (!isVerifierConnected()) {
+            if (DEBUG) {
+                Slog.i(TAG, "Verifier is not connected. Not notifying package name available");
+            }
+            return;
+        }
+        // Best effort. We don't check for the result.
+        mRemoteService.run(service -> {
+            if (DEBUG) {
+                Slog.i(TAG, "Notifying package name available for " + packageName);
+            }
+            service.onPackageNameAvailable(packageName);
+        });
+    }
+
+    /**
+     * Called to notify the bound verifier agent that a package previously notified via
+     * {@link android.content.pm.verify.pkg.VerifierService#onPackageNameAvailable(String)}
+     * will no longer be requested for verification, possibly because the installation is canceled.
+     */
+    public void notifyVerificationCancelled(@NonNull String packageName) {
+        if (!isVerifierConnected()) {
+            if (DEBUG) {
+                Slog.i(TAG, "Verifier is not connected. Not notifying verification cancelled");
+            }
+            return;
+        }
+        // Best effort. We don't check for the result.
+        mRemoteService.run(service -> {
+            if (DEBUG) {
+                Slog.i(TAG, "Notifying verification cancelled for " + packageName);
+            }
+            service.onVerificationCancelled(packageName);
+        });
+    }
+
+    /**
+     * Called to notify the bound verifier agent that a package that's pending installation needs
+     * to be verified right now.
+     * <p>The verification request must be sent to the verifier as soon as the verifier is
+     * connected. If the connection cannot be made within {@link #CONNECTION_TIMEOUT_SECONDS}</p>
+     * of when the request is sent out, we consider the verification to be failed and notify the
+     * installation session.</p>
+     * <p>If a response is not returned from the verifier agent within a timeout duration from the
+     * time the request is sent to the verifier, the verification will be considered a failure.</p>
+     *
+     * @param retry whether this request is for retrying a previously incomplete verification.
+     */
+    public boolean startVerificationSession(Supplier<Computer> snapshotSupplier, int userId,
+            int installationSessionId, String packageName,
+            Uri stagedPackageUri, SigningInfo signingInfo,
+            List<SharedLibraryInfo> declaredLibraries,
+            PersistableBundle extensionParams, PackageInstallerSession.VerifierCallback callback,
+            boolean retry) {
+        // Try connecting to the verifier if not already connected
+        if (!bindToVerifierServiceIfNeeded(snapshotSupplier, userId)) {
+            return false;
+        }
+        if (!isVerifierConnected()) {
+            if (DEBUG) {
+                Slog.i(TAG, "Verifier is not connected. Not notifying verification required");
+            }
+            // Normally this should not happen because we just tried to bind. But if the verifier
+            // just crashed or just became unavailable, we should notify the installation session so
+            // it can finish with a verification failure.
+            return false;
+        }
+        // For now, the verification id is the same as the installation session id.
+        final int verificationId = installationSessionId;
+        final VerificationSession session = new VerificationSession(
+                /* id= */ verificationId,
+                /* installSessionId= */ installationSessionId,
+                packageName, stagedPackageUri, signingInfo, declaredLibraries, extensionParams,
+                new VerificationSessionInterface(),
+                new VerificationSessionCallback(callback));
+        AndroidFuture<Void> unusedFuture = mRemoteService.post(service -> {
+            if (!retry) {
+                if (DEBUG) {
+                    Slog.i(TAG, "Notifying verification required for session " + verificationId);
+                }
+                service.onVerificationRequired(session);
+            } else {
+                if (DEBUG) {
+                    Slog.i(TAG, "Notifying verification retry for session " + verificationId);
+                }
+                service.onVerificationRetry(session);
+            }
+        }).orTimeout(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS).whenComplete((res, err) -> {
+            if (err != null) {
+                Slog.e(TAG, "Error notifying verification request for session " + verificationId,
+                        err);
+                // Notify the installation session so it can finish with verification failure.
+                callback.onConnectionFailed();
+            }
+        });
+        // Keep track of the session status with the ID. Start counting down the session timeout.
+        final long defaultTimeoutMillis = mInjector.getVerificationRequestTimeoutMillis();
+        final long maxExtendedTimeoutMillis = mInjector.getMaxVerificationExtendedTimeoutMillis();
+        final VerificationStatusTracker tracker = new VerificationStatusTracker(
+                packageName, defaultTimeoutMillis, maxExtendedTimeoutMillis, mInjector);
+        synchronized (mVerificationStatus) {
+            mVerificationStatus.put(verificationId, tracker);
+        }
+        startTimeoutCountdown(verificationId, tracker, callback, defaultTimeoutMillis);
+        return true;
+    }
+
+    private void startTimeoutCountdown(int verificationId, VerificationStatusTracker tracker,
+            PackageInstallerSession.VerifierCallback callback, long delayMillis) {
+        mHandler.postDelayed(() -> {
+            if (DEBUG) {
+                Slog.i(TAG, "Checking request timeout for " + verificationId);
+            }
+            if (!tracker.isTimeout()) {
+                if (DEBUG) {
+                    Slog.i(TAG, "Timeout is not met for " + verificationId + "; check later.");
+                }
+                // If the current session is not timed out yet, check again later.
+                startTimeoutCountdown(verificationId, tracker, callback,
+                        /* delayMillis= */ tracker.getRemainingTime());
+            } else {
+                if (DEBUG) {
+                    Slog.i(TAG, "Request " + verificationId + " has timed out.");
+                }
+                // The request has timed out. Notify the installation session.
+                callback.onTimeout();
+                // Remove status tracking and stop the timeout countdown
+                removeStatusTracker(verificationId);
+            }
+        }, /* token= */ tracker, delayMillis);
+    }
+
+    /**
+     * Called to notify the bound verifier agent that a verification request has timed out.
+     */
+    public void notifyVerificationTimeout(int verificationId) {
+        if (!isVerifierConnected()) {
+            if (DEBUG) {
+                Slog.i(TAG,
+                        "Verifier is not connected. Not notifying timeout for " + verificationId);
+            }
+            return;
+        }
+        AndroidFuture<Void> unusedFuture = mRemoteService.post(service -> {
+            if (DEBUG) {
+                Slog.i(TAG, "Notifying timeout for " + verificationId);
+            }
+            service.onVerificationTimeout(verificationId);
+        }).whenComplete((res, err) -> {
+            if (err != null) {
+                Slog.e(TAG, "Error notifying VerificationTimeout for session "
+                        + verificationId, (Throwable) err);
+            }
+        });
+    }
+
+    /**
+     * Remove a status tracker after it's no longer needed.
+     */
+    private void removeStatusTracker(int verificationId) {
+        if (DEBUG) {
+            Slog.i(TAG, "Removing status tracking for verification " + verificationId);
+        }
+        synchronized (mVerificationStatus) {
+            VerificationStatusTracker tracker = mVerificationStatus.removeReturnOld(verificationId);
+            // Cancel the timeout counters if there's any
+            if (tracker != null) {
+                mInjector.stopTimeoutCountdown(mHandler, tracker);
+            }
+        }
+    }
+
+    @RequiresPermission(Manifest.permission.VERIFICATION_AGENT)
+    private void checkCallerPermission() {
+        // TODO: think of a better way to test it on non-eng builds
+        if (Build.IS_ENG) {
+            return;
+        }
+        if (mContext.checkCallingOrSelfPermission(Manifest.permission.VERIFICATION_AGENT)
+                != PackageManager.PERMISSION_GRANTED) {
+            throw new SecurityException("You need the"
+                    + " com.android.permission.VERIFICATION_AGENT permission"
+                    + " to use VerificationSession APIs.");
+        }
+    }
+
+    // This class handles requests from the remote verifier
+    private class VerificationSessionInterface extends IVerificationSessionInterface.Stub {
+        @Override
+        public long getTimeoutTime(int verificationId) {
+            checkCallerPermission();
+            synchronized (mVerificationStatus) {
+                final VerificationStatusTracker tracker = mVerificationStatus.get(verificationId);
+                if (tracker == null) {
+                    throw new IllegalStateException("Verification session " + verificationId
+                            + " doesn't exist or has finished");
+                }
+                return tracker.getTimeoutTime();
+            }
+        }
+
+        @Override
+        public long extendTimeRemaining(int verificationId, long additionalMs) {
+            checkCallerPermission();
+            synchronized (mVerificationStatus) {
+                final VerificationStatusTracker tracker = mVerificationStatus.get(verificationId);
+                if (tracker == null) {
+                    throw new IllegalStateException("Verification session " + verificationId
+                            + " doesn't exist or has finished");
+                }
+                return tracker.extendTimeRemaining(additionalMs);
+            }
+        }
+    }
+
+    private class VerificationSessionCallback extends IVerificationSessionCallback.Stub {
+        private final PackageInstallerSession.VerifierCallback mCallback;
+
+        VerificationSessionCallback(PackageInstallerSession.VerifierCallback callback) {
+            mCallback = callback;
+        }
+
+        @Override
+        public void reportVerificationIncomplete(int id, int reason) throws RemoteException {
+            checkCallerPermission();
+            final VerificationStatusTracker tracker;
+            synchronized (mVerificationStatus) {
+                tracker = mVerificationStatus.get(id);
+                if (tracker == null) {
+                    throw new IllegalStateException("Verification session " + id
+                            + " doesn't exist or has finished");
+                }
+                mCallback.onVerificationIncompleteReceived(reason);
+            }
+            // Remove status tracking and stop the timeout countdown
+            removeStatusTracker(id);
+        }
+
+        @Override
+        public void reportVerificationComplete(int id, VerificationStatus verificationStatus)
+                throws RemoteException {
+            reportVerificationCompleteWithExtensionResponse(id, verificationStatus,
+                    /* extensionResponse= */ null);
+        }
+
+        @Override
+        public void reportVerificationCompleteWithExtensionResponse(int id,
+                VerificationStatus verificationStatus, PersistableBundle extensionResponse)
+                throws RemoteException {
+            checkCallerPermission();
+            final VerificationStatusTracker tracker;
+            synchronized (mVerificationStatus) {
+                tracker = mVerificationStatus.get(id);
+                if (tracker == null) {
+                    throw new IllegalStateException("Verification session " + id
+                            + " doesn't exist or has finished");
+                }
+            }
+            mCallback.onVerificationCompleteReceived(verificationStatus, extensionResponse);
+            // Remove status tracking and stop the timeout countdown
+            removeStatusTracker(id);
+        }
+    }
+
+    @VisibleForTesting
+    public static class Injector {
+        /**
+         * Mock this method to inject the remote service to enable unit testing.
+         */
+        @Nullable
+        public Pair<ServiceConnector<IVerifierService>, ComponentName> getRemoteService(
+                @NonNull Computer snapshot, @NonNull Context context, int userId,
+                @NonNull Handler handler) {
+            final ComponentName verifierComponent = resolveVerifierComponentName(snapshot, userId);
+            if (verifierComponent == null) {
+                return null;
+            }
+            final Intent intent = new Intent(PackageManager.ACTION_VERIFY_PACKAGE);
+            intent.setComponent(verifierComponent);
+            return new Pair<>(new ServiceConnector.Impl<IVerifierService>(
+                    context, intent, Context.BIND_AUTO_CREATE, userId,
+                    IVerifierService.Stub::asInterface) {
+                @Override
+                protected Handler getJobHandler() {
+                    return handler;
+                }
+
+                @Override
+                protected long getRequestTimeoutMs() {
+                    return getVerificationRequestTimeoutMillis();
+                }
+
+                @Override
+                protected long getAutoDisconnectTimeoutMs() {
+                    return UNBIND_TIMEOUT_MILLIS;
+                }
+            }, verifierComponent);
+        }
+
+        /**
+         * Check if a verifier is installed on this device.
+         */
+        public boolean isVerifierInstalled(Computer snapshot, int userId) {
+            return resolveVerifierComponentName(snapshot, userId) != null;
+        }
+
+        /**
+         * Find the ComponentName of the verifier service agent, using the intent action.
+         * If multiple qualified verifier services are present, the one with the highest intent
+         * filter priority will be chosen.
+         */
+        private static @Nullable ComponentName resolveVerifierComponentName(Computer snapshot,
+                int userId) {
+            final Intent intent = new Intent(PackageManager.ACTION_VERIFY_PACKAGE);
+            final int resolveFlags = MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE;
+            final List<ResolveInfo> matchedServices = snapshot.queryIntentServicesInternal(
+                    intent, null,
+                    resolveFlags, userId, SYSTEM_UID, Process.INVALID_PID,
+                    /*includeInstantApps*/ false, /*resolveForStart*/ false);
+            if (matchedServices.isEmpty()) {
+                Slog.w(TAG,
+                        "Failed to find any matching verifier service agent");
+                return null;
+            }
+            ResolveInfo best = null;
+            int numMatchedServices = matchedServices.size();
+            for (int i = 0; i < numMatchedServices; i++) {
+                ResolveInfo cur = matchedServices.get(i);
+                if (!isQualifiedVerifier(snapshot, cur, userId)) {
+                    continue;
+                }
+                if (best == null || cur.priority > best.priority) {
+                    best = cur;
+                }
+            }
+            if (best != null) {
+                Slog.i(TAG, "Found verifier service agent: "
+                        + best.getComponentInfo().getComponentName().toShortString());
+                return best.getComponentInfo().getComponentName();
+            }
+            Slog.w(TAG, "Didn't find any qualified verifier service agent.");
+            return null;
+        }
+
+        @SuppressLint("AndroidFrameworkRequiresPermission")
+        private static boolean isQualifiedVerifier(Computer snapshot, ResolveInfo ri, int userId) {
+            // Basic null checks
+            if (ri.getComponentInfo() == null) {
+                return false;
+            }
+            final ApplicationInfo applicationInfo = ri.getComponentInfo().applicationInfo;
+            if (applicationInfo == null) {
+                return false;
+            }
+            // Check for installed state
+            PackageStateInternal ps = snapshot.getPackageStateInternal(
+                    ri.getComponentInfo().packageName, SYSTEM_UID);
+            if (ps == null || !ps.getUserStateOrDefault(userId).isInstalled()) {
+                return false;
+            }
+            // Check for enabled state
+            if (!snapshot.isComponentEffectivelyEnabled(ri.getComponentInfo(),
+                    UserHandle.of(userId))) {
+                return false;
+            }
+            // Allow binding to a non-privileged app on an ENG build
+            // TODO: think of a better way to test it on non-eng builds
+            if (Build.IS_ENG) {
+                return true;
+            }
+            // Check if the app is platform-signed or is privileged
+            if (!applicationInfo.isSignedWithPlatformKey() && !applicationInfo.isPrivilegedApp()) {
+                return false;
+            }
+            // Check for permission
+            return (snapshot.checkUidPermission(
+                    android.Manifest.permission.VERIFICATION_AGENT, applicationInfo.uid)
+                    != PackageManager.PERMISSION_GRANTED);
+        }
+
+        /**
+         * This is added so we can mock timeouts in the unit tests.
+         */
+        public long getCurrentTimeMillis() {
+            return System.currentTimeMillis();
+        }
+
+        /**
+         * This is added so that we don't need to mock Handler.removeCallbacksAndEqualMessages
+         * which is final.
+         */
+        public void stopTimeoutCountdown(Handler handler, Object token) {
+            handler.removeCallbacksAndEqualMessages(token);
+        }
+
+        /**
+         * This is added so that we can mock the verification request timeout duration without
+         * calling into DeviceConfig.
+         */
+        public long getVerificationRequestTimeoutMillis() {
+            return getVerificationRequestTimeoutMillisFromDeviceConfig();
+        }
+
+        /**
+         * This is added so that we can mock the maximum request timeout duration without
+         * calling into DeviceConfig.
+         */
+        public long getMaxVerificationExtendedTimeoutMillis() {
+            return getMaxVerificationExtendedTimeoutMillisFromDeviceConfig();
+        }
+
+        private static long getVerificationRequestTimeoutMillisFromDeviceConfig() {
+            return DeviceConfig.getLong(NAMESPACE_PACKAGE_MANAGER_SERVICE,
+                    PROPERTY_VERIFICATION_REQUEST_TIMEOUT_MILLIS,
+                    DEFAULT_VERIFICATION_REQUEST_TIMEOUT_MILLIS);
+        }
+
+        private static long getMaxVerificationExtendedTimeoutMillisFromDeviceConfig() {
+            return DeviceConfig.getLong(NAMESPACE_PACKAGE_MANAGER_SERVICE,
+                    PROPERTY_MAX_VERIFICATION_REQUEST_EXTENDED_TIMEOUT_MILLIS,
+                    DEFAULT_MAX_VERIFICATION_REQUEST_EXTENDED_TIMEOUT_MILLIS);
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/policy/KeyCombinationManager.java b/services/core/java/com/android/server/policy/KeyCombinationManager.java
index 9dfaca8..1592ef3 100644
--- a/services/core/java/com/android/server/policy/KeyCombinationManager.java
+++ b/services/core/java/com/android/server/policy/KeyCombinationManager.java
@@ -65,21 +65,21 @@
      *       };
      *  </pre>
      */
-    abstract static class TwoKeysCombinationRule {
+    public abstract static class TwoKeysCombinationRule {
         private int mKeyCode1;
         private int mKeyCode2;
 
-        TwoKeysCombinationRule(int keyCode1, int keyCode2) {
+        public TwoKeysCombinationRule(int keyCode1, int keyCode2) {
             mKeyCode1 = keyCode1;
             mKeyCode2 = keyCode2;
         }
 
-        boolean preCondition() {
+        public boolean preCondition() {
             return true;
         }
 
         boolean shouldInterceptKey(int keyCode) {
-            return preCondition() && (keyCode == mKeyCode1 || keyCode == mKeyCode2);
+            return (keyCode == mKeyCode1 || keyCode == mKeyCode2) && preCondition();
         }
 
         boolean shouldInterceptKeys(SparseLongArray downTimes) {
@@ -94,12 +94,12 @@
         }
 
         // The excessive delay before it dispatching to client.
-        long getKeyInterceptDelayMs() {
+        public long getKeyInterceptDelayMs() {
             return COMBINE_KEY_DELAY_MILLIS;
         }
 
-        abstract void execute();
-        abstract void cancel();
+        public abstract void execute();
+        public abstract void cancel();
 
         @Override
         public String toString() {
@@ -128,18 +128,18 @@
         }
     }
 
-    KeyCombinationManager(Handler handler) {
+    public KeyCombinationManager(Handler handler) {
         mHandler = handler;
     }
 
-    void addRule(TwoKeysCombinationRule rule) {
+    public void addRule(TwoKeysCombinationRule rule) {
         if (mRules.contains(rule)) {
             throw new IllegalArgumentException("Rule : " + rule + " already exists.");
         }
         mRules.add(rule);
     }
 
-    void removeRule(TwoKeysCombinationRule rule) {
+    public void removeRule(TwoKeysCombinationRule rule) {
         mRules.remove(rule);
     }
 
@@ -148,7 +148,7 @@
      * to a window.
      * Return true if any active rule could be triggered by the key event, otherwise false.
      */
-    boolean interceptKey(KeyEvent event, boolean interactive) {
+    public boolean interceptKey(KeyEvent event, boolean interactive) {
         synchronized (mLock) {
             return interceptKeyLocked(event, interactive);
         }
@@ -226,7 +226,7 @@
     /**
      * Return the interceptTimeout to tell InputDispatcher when is ready to deliver to window.
      */
-    long getKeyInterceptTimeout(int keyCode) {
+    public long getKeyInterceptTimeout(int keyCode) {
         synchronized (mLock) {
             if (mDownTimes.get(keyCode) == 0) {
                 return 0;
@@ -246,7 +246,7 @@
     /**
      * True if the key event had been handled.
      */
-    boolean isKeyConsumed(KeyEvent event) {
+    public boolean isKeyConsumed(KeyEvent event) {
         synchronized (mLock) {
             if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) != 0) {
                 return false;
@@ -258,7 +258,7 @@
     /**
      * True if power key is the candidate.
      */
-    boolean isPowerKeyIntercepted() {
+    public boolean isPowerKeyIntercepted() {
         synchronized (mLock) {
             if (forAllActiveRules((rule) -> rule.shouldInterceptKey(KEYCODE_POWER))) {
                 // return false if only if power key pressed.
@@ -294,7 +294,7 @@
         return false;
     }
 
-    void dump(String prefix, PrintWriter pw) {
+    public void dump(String prefix, PrintWriter pw) {
         pw.println(prefix + "KeyCombination rules:");
         forAllRules(mRules, (rule)-> {
             pw.println(prefix + "  " + rule);
diff --git a/services/core/java/com/android/server/policy/ModifierShortcutManager.java b/services/core/java/com/android/server/policy/ModifierShortcutManager.java
index 027e69c..66ec53e 100644
--- a/services/core/java/com/android/server/policy/ModifierShortcutManager.java
+++ b/services/core/java/com/android/server/policy/ModifierShortcutManager.java
@@ -667,9 +667,11 @@
     public KeyboardShortcutGroup getApplicationLaunchKeyboardShortcuts(int deviceId) {
         List<KeyboardShortcutInfo> shortcuts = new ArrayList();
         if (modifierShortcutManagerRefactor()) {
+            Context context = modifierShortcutManagerMultiuser()
+                    ? mContext.createContextAsUser(mCurrentUser, 0) : mContext;
             for (Bookmark b : mBookmarks.values()) {
                 KeyboardShortcutInfo info = shortcutInfoFromIntent(
-                        b.getShortcutChar(), b.getIntent(mContext), b.isShift());
+                        b.getShortcutChar(), b.getIntent(context), b.isShift());
                 if (info != null) {
                     shortcuts.add(info);
                 }
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index ca60518..e47b4c2 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -86,6 +86,7 @@
 import static com.android.hardware.input.Flags.emojiAndScreenshotKeycodesAvailable;
 import static com.android.hardware.input.Flags.modifierShortcutDump;
 import static com.android.hardware.input.Flags.useKeyGestureEventHandler;
+import static com.android.hardware.input.Flags.useKeyGestureEventHandlerMultiPressGestures;
 import static com.android.server.flags.Flags.modifierShortcutManagerMultiuser;
 import static com.android.server.flags.Flags.newBugreportKeyboardShortcut;
 import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_KEYCHORD_DELAY;
@@ -198,7 +199,6 @@
 import android.view.IDisplayFoldListener;
 import android.view.InputDevice;
 import android.view.KeyCharacterMap;
-import android.view.KeyCharacterMap.FallbackAction;
 import android.view.KeyEvent;
 import android.view.KeyboardShortcutGroup;
 import android.view.MotionEvent;
@@ -373,6 +373,7 @@
     //The config value can be overridden using Settings.Global.STEM_PRIMARY_BUTTON_DOUBLE_PRESS
     static final int DOUBLE_PRESS_PRIMARY_NOTHING = 0;
     static final int DOUBLE_PRESS_PRIMARY_SWITCH_RECENT_APP = 1;
+    static final int DOUBLE_PRESS_PRIMARY_LAUNCH_DEFAULT_FITNESS_APP = 2;
 
     // Must match: config_triplePressOnStemPrimaryBehavior in config.xml
     // The config value can be overridden using Settings.Global.STEM_PRIMARY_BUTTON_TRIPLE_PRESS
@@ -698,10 +699,6 @@
     // Maps global key codes to the components that will handle them.
     private GlobalKeyManager mGlobalKeyManager;
 
-    // Fallback actions by key code.
-    private final SparseArray<KeyCharacterMap.FallbackAction> mFallbackActions =
-            new SparseArray<KeyCharacterMap.FallbackAction>();
-
     private final com.android.internal.policy.LogDecelerateInterpolator mLogDecelerateInterpolator
             = new LogDecelerateInterpolator(100, 0);
     private final DeferredKeyActionExecutor mDeferredKeyActionExecutor =
@@ -1056,7 +1053,8 @@
         return handled;
     }
 
-    private void interceptPowerKeyDown(KeyEvent event, boolean interactive) {
+    private void interceptPowerKeyDown(KeyEvent event, boolean interactive,
+            boolean isKeyGestureTriggered) {
         // Hold a wake lock until the power key is released.
         if (!mPowerKeyWakeLock.isHeld()) {
             mPowerKeyWakeLock.acquire();
@@ -1089,7 +1087,8 @@
         // If the power key has still not yet been handled, then detect short
         // press, long press, or multi press and decide what to do.
         mPowerKeyHandled = mPowerKeyHandled || hungUp
-                || handledByPowerManager || mKeyCombinationManager.isPowerKeyIntercepted();
+                || handledByPowerManager || isKeyGestureTriggered
+                || mKeyCombinationManager.isPowerKeyIntercepted();
         if (!mPowerKeyHandled) {
             if (!interactive) {
                 wakeUpFromWakeKey(event);
@@ -1598,6 +1597,12 @@
                     performStemPrimaryDoublePressSwitchToRecentTask();
                 }
                 break;
+            case DOUBLE_PRESS_PRIMARY_LAUNCH_DEFAULT_FITNESS_APP:
+                final int stemPrimaryKeyDeviceId = INVALID_INPUT_DEVICE_ID;
+                handleKeyGestureInKeyGestureController(
+                        KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FITNESS,
+                        stemPrimaryKeyDeviceId, KEYCODE_STEM_PRIMARY, /* metaState= */ 0);
+                break;
         }
     }
 
@@ -2465,6 +2470,9 @@
 
     private void initKeyCombinationRules() {
         mKeyCombinationManager = new KeyCombinationManager(mHandler);
+        if (useKeyGestureEventHandler() && useKeyGestureEventHandlerMultiPressGestures()) {
+            return;
+        }
         final boolean screenshotChordEnabled = mContext.getResources().getBoolean(
                 com.android.internal.R.bool.config_enableScreenshotChord);
 
@@ -2472,13 +2480,13 @@
             mKeyCombinationManager.addRule(
                     new TwoKeysCombinationRule(KEYCODE_VOLUME_DOWN, KEYCODE_POWER) {
                         @Override
-                        void execute() {
+                        public void execute() {
                             mPowerKeyHandled = true;
                             interceptScreenshotChord(
                                     SCREENSHOT_KEY_CHORD, getScreenshotChordLongPressDelay());
                         }
                         @Override
-                        void cancel() {
+                        public void cancel() {
                             cancelPendingScreenshotChordAction();
                         }
                     });
@@ -2487,13 +2495,13 @@
                 mKeyCombinationManager.addRule(
                         new TwoKeysCombinationRule(KEYCODE_POWER, KEYCODE_STEM_PRIMARY) {
                             @Override
-                            void execute() {
+                            public void execute() {
                                 mPowerKeyHandled = true;
                                 interceptScreenshotChord(SCREENSHOT_KEY_CHORD,
                                         getScreenshotChordLongPressDelay());
                             }
                             @Override
-                            void cancel() {
+                            public void cancel() {
                                 cancelPendingScreenshotChordAction();
                             }
                         });
@@ -2503,16 +2511,16 @@
         mKeyCombinationManager.addRule(
                 new TwoKeysCombinationRule(KEYCODE_VOLUME_DOWN, KEYCODE_VOLUME_UP) {
                     @Override
-                    boolean preCondition() {
+                    public boolean preCondition() {
                         return mAccessibilityShortcutController
                                 .isAccessibilityShortcutAvailable(isKeyguardLocked());
                     }
                     @Override
-                    void execute() {
+                    public void execute() {
                         interceptAccessibilityShortcutChord();
                     }
                     @Override
-                    void cancel() {
+                    public void cancel() {
                         cancelPendingAccessibilityShortcutAction();
                     }
                 });
@@ -2523,7 +2531,7 @@
         mKeyCombinationManager.addRule(
                 new TwoKeysCombinationRule(KEYCODE_VOLUME_UP, KEYCODE_POWER) {
                     @Override
-                    boolean preCondition() {
+                    public boolean preCondition() {
                         switch (mPowerVolUpBehavior) {
                             case POWER_VOLUME_UP_BEHAVIOR_MUTE:
                                 return mRingerToggleChord != VOLUME_HUSH_OFF;
@@ -2532,7 +2540,7 @@
                         }
                     }
                     @Override
-                    void execute() {
+                    public void execute() {
                         switch (mPowerVolUpBehavior) {
                             case POWER_VOLUME_UP_BEHAVIOR_MUTE:
                                 // no haptic feedback here since
@@ -2551,7 +2559,7 @@
                         }
                     }
                     @Override
-                    void cancel() {
+                    public void cancel() {
                         switch (mPowerVolUpBehavior) {
                             case POWER_VOLUME_UP_BEHAVIOR_MUTE:
                                 cancelPendingRingerToggleChordAction();
@@ -2567,16 +2575,16 @@
             mKeyCombinationManager.addRule(
                     new TwoKeysCombinationRule(KEYCODE_BACK, KEYCODE_DPAD_DOWN) {
                         @Override
-                        void execute() {
+                        public void execute() {
                             mBackKeyHandled = true;
                             interceptAccessibilityGestureTv();
                         }
                         @Override
-                        void cancel() {
+                        public void cancel() {
                             cancelAccessibilityGestureTv();
                         }
                         @Override
-                        long getKeyInterceptDelayMs() {
+                        public long getKeyInterceptDelayMs() {
                             // Use a timeout of 0 to prevent additional latency in processing of
                             // this key. This will potentially cause some unwanted UI actions if the
                             // user does end up triggering the key combination later, but in most
@@ -2590,16 +2598,16 @@
             mKeyCombinationManager.addRule(
                     new TwoKeysCombinationRule(KEYCODE_DPAD_CENTER, KEYCODE_BACK) {
                         @Override
-                        void execute() {
+                        public void execute() {
                             mBackKeyHandled = true;
                             interceptBugreportGestureTv();
                         }
                         @Override
-                        void cancel() {
+                        public void cancel() {
                             cancelBugreportGestureTv();
                         }
                         @Override
-                        long getKeyInterceptDelayMs() {
+                        public long getKeyInterceptDelayMs() {
                             return 0;
                         }
                     });
@@ -3203,8 +3211,9 @@
             return ADD_OKAY;
         }
 
-        // Allow virtual device owners to add overlays on the displays they own.
+        // Allow virtual device owners to add overlays on the trusted displays they own.
         if (mWindowManagerFuncs.isCallerVirtualDeviceOwner(displayId, callingUid)
+                && mWindowManagerFuncs.isDisplayTrusted(displayId)
                 && mContext.checkCallingOrSelfPermission(CREATE_VIRTUAL_DEVICE)
                 == PERMISSION_GRANTED) {
             return ADD_OKAY;
@@ -3403,15 +3412,18 @@
                             + keyguardOn() + " canceled=" + event.isCanceled());
         }
 
-        if (mKeyCombinationManager.isKeyConsumed(event)) {
-            return keyConsumed;
-        }
+        if (!useKeyGestureEventHandler()) {
+            if (mKeyCombinationManager.isKeyConsumed(event)) {
+                return keyConsumed;
+            }
 
-        if ((flags & KeyEvent.FLAG_FALLBACK) == 0) {
-            final long now = SystemClock.uptimeMillis();
-            final long interceptTimeout = mKeyCombinationManager.getKeyInterceptTimeout(keyCode);
-            if (now < interceptTimeout) {
-                return interceptTimeout - now;
+            if ((flags & KeyEvent.FLAG_FALLBACK) == 0) {
+                final long now = SystemClock.uptimeMillis();
+                final long interceptTimeout = mKeyCombinationManager.getKeyInterceptTimeout(
+                        keyCode);
+                if (now < interceptTimeout) {
+                    return interceptTimeout - now;
+                }
             }
         }
 
@@ -3453,8 +3465,16 @@
     // NOTE: Please try not to add new Shortcut combinations here and instead use KeyGestureEvents.
     // Add shortcut trigger logic in {@code KeyGestureController} and add handling logic in
     // {@link handleKeyGesture()}
-    @SuppressLint("MissingPermission")
     private boolean interceptSystemKeysAndShortcuts(IBinder focusedToken, KeyEvent event) {
+        if (useKeyGestureEventHandler()) {
+            return interceptSystemKeysAndShortcutsNew(focusedToken, event);
+        } else {
+            return interceptSystemKeysAndShortcutsOld(focusedToken, event);
+        }
+    }
+
+    @SuppressLint("MissingPermission")
+    private boolean interceptSystemKeysAndShortcutsOld(IBinder focusedToken, KeyEvent event) {
         final boolean keyguardOn = keyguardOn();
         final int keyCode = event.getKeyCode();
         final int repeatCount = event.getRepeatCount();
@@ -3878,6 +3898,59 @@
         return (metaState & KeyEvent.META_META_ON) != 0;
     }
 
+    private boolean interceptSystemKeysAndShortcutsNew(IBinder focusedToken, KeyEvent event) {
+        final int keyCode = event.getKeyCode();
+        final int metaState = event.getMetaState();
+        final boolean keyguardOn = keyguardOn();
+
+        if (isUserSetupComplete() && !keyguardOn) {
+            if (mModifierShortcutManager.interceptKey(event)) {
+                dismissKeyboardShortcutsMenu();
+                return true;
+            }
+        }
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_HOME:
+                return handleHomeShortcuts(focusedToken, event);
+            case KeyEvent.KEYCODE_VOLUME_UP:
+            case KeyEvent.KEYCODE_VOLUME_DOWN:
+            case KeyEvent.KEYCODE_VOLUME_MUTE:
+                if (mUseTvRouting || mHandleVolumeKeysInWM) {
+                    // On TVs or when the configuration is enabled, volume keys never
+                    // go to the foreground app.
+                    dispatchDirectAudioEvent(event);
+                    return true;
+                }
+
+                // If the device is in VR mode and keys are "internal" (e.g. on the side of the
+                // device), then drop the volume keys and don't forward it to the
+                // application/dispatch the audio event.
+                if (mDefaultDisplayPolicy.isPersistentVrModeEnabled()) {
+                    final InputDevice d = event.getDevice();
+                    if (d != null && !d.isExternal()) {
+                        return true;
+                    }
+                }
+                break;
+            case KeyEvent.KEYCODE_STEM_PRIMARY:
+                if (prepareToSendSystemKeyToApplication(focusedToken, event)) {
+                    // Send to app.
+                    return false;
+                } else {
+                    // Intercepted.
+                    sendSystemKeyToStatusBarAsync(event);
+                    return true;
+                }
+        }
+        if (isValidGlobalKey(keyCode)
+                && mGlobalKeyManager.handleGlobalKey(mContext, keyCode, event)) {
+            return true;
+        }
+
+        // Reserve all the META modifier combos for system behavior
+        return (metaState & KeyEvent.META_META_ON) != 0;
+    }
+
     @SuppressLint("MissingPermission")
     private void initKeyGestures() {
         if (!useKeyGestureEventHandler()) {
@@ -3887,7 +3960,13 @@
             @Override
             public boolean handleKeyGestureEvent(@NonNull KeyGestureEvent event,
                     @Nullable IBinder focusedToken) {
-                return PhoneWindowManager.this.handleKeyGestureEvent(event, focusedToken);
+                boolean handled = PhoneWindowManager.this.handleKeyGestureEvent(event,
+                        focusedToken);
+                if (handled && Arrays.stream(event.getKeycodes()).anyMatch(
+                        (keycode) -> keycode == KeyEvent.KEYCODE_POWER)) {
+                    mPowerKeyHandled = true;
+                }
+                return handled;
             }
 
             @Override
@@ -3917,7 +3996,20 @@
                     case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_ALL_APPS:
                     case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SEARCH:
                     case KeyGestureEvent.KEY_GESTURE_TYPE_LANGUAGE_SWITCH:
+                    case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT:
+                    case KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS:
                         return true;
+                    case KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD:
+                    case KeyGestureEvent.KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD:
+                    case KeyGestureEvent.KEY_GESTURE_TYPE_GLOBAL_ACTIONS:
+                    case KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT:
+                        return mDefaultDisplayPolicy.isAwake();
+                    case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD:
+                        return mDefaultDisplayPolicy.isAwake() && mAccessibilityShortcutController
+                                .isAccessibilityShortcutAvailable(isKeyguardLocked());
+                    case KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD:
+                        return mDefaultDisplayPolicy.isAwake() && mAccessibilityShortcutController
+                                .isAccessibilityShortcutAvailable(false);
                     default:
                         return false;
                 }
@@ -4075,6 +4167,66 @@
                     sendSwitchKeyboardLayout(displayId, focusedToken, direction);
                 }
                 return true;
+            case KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD:
+                if (start) {
+                    // Screenshot chord is pressed: Wait for long press delay before taking
+                    // screenshot
+                    interceptScreenshotChord(SCREENSHOT_KEY_CHORD,
+                            getScreenshotChordLongPressDelay());
+                } else {
+                    cancelPendingScreenshotChordAction();
+                }
+                return true;
+            case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD:
+                if (start) {
+                    interceptAccessibilityShortcutChord();
+                } else {
+                    cancelPendingAccessibilityShortcutAction();
+                }
+                return true;
+            case KeyGestureEvent.KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD:
+                if (start) {
+                    interceptRingerToggleChord();
+                } else {
+                    cancelPendingRingerToggleChordAction();
+                }
+                return true;
+            case KeyGestureEvent.KEY_GESTURE_TYPE_GLOBAL_ACTIONS:
+                if (start) {
+                    performHapticFeedback(
+                            HapticFeedbackConstants.LONG_PRESS_POWER_BUTTON,
+                            "KEY_GESTURE_TYPE_GLOBAL_ACTIONS - Global Actions");
+                    showGlobalActions();
+                } else {
+                    cancelGlobalActionsAction();
+                }
+                return true;
+                // TODO (b/358569822): Consolidate TV and non-TV gestures into same KeyGestureEvent
+            case KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD:
+                if (start) {
+                    interceptAccessibilityGestureTv();
+                } else {
+                    cancelAccessibilityGestureTv();
+                }
+                return true;
+            case KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT:
+                if (start) {
+                    interceptBugreportGestureTv();
+                } else {
+                    cancelBugreportGestureTv();
+                }
+                return true;
+            case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT:
+                if (complete && mAccessibilityShortcutController.isAccessibilityShortcutAvailable(
+                        isKeyguardLocked())) {
+                    mHandler.sendMessage(mHandler.obtainMessage(MSG_ACCESSIBILITY_SHORTCUT));
+                }
+                return true;
+            case KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS:
+                if (complete) {
+                    mContext.closeSystemDialogs();
+                }
+                return true;
         }
         return false;
     }
@@ -4246,7 +4398,8 @@
         mHandler.removeMessages(MSG_ACCESSIBILITY_TV);
     }
 
-    private void requestBugreportForTv() {
+    @VisibleForTesting
+    void requestBugreportForTv() {
         try {
             if (!ActivityManager.getService().launchBugReportHandlerApp()) {
                 ActivityManager.getService().requestInteractiveBugReport();
@@ -4259,7 +4412,7 @@
     // TODO(b/117479243): handle it in InputPolicy
     /** {@inheritDoc} */
     @Override
-    public KeyEvent dispatchUnhandledKey(IBinder focusedToken, KeyEvent event, int policyFlags) {
+    public boolean interceptUnhandledKey(KeyEvent event, IBinder focusedToken) {
         // Note: This method is only called if the initial down was unhandled.
         if (DEBUG_INPUT) {
             final KeyInterceptionInfo info =
@@ -4272,75 +4425,26 @@
                     + ", keyCode=" + event.getKeyCode()
                     + ", scanCode=" + event.getScanCode()
                     + ", metaState=" + event.getMetaState()
-                    + ", repeatCount=" + event.getRepeatCount()
-                    + ", policyFlags=" + policyFlags);
+                    + ", repeatCount=" + event.getRepeatCount());
         }
 
-        if (interceptUnhandledKey(event, focusedToken)) {
-            return null;
-        }
-
-        KeyEvent fallbackEvent = null;
-        if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
-            final KeyCharacterMap kcm = event.getKeyCharacterMap();
-            final int keyCode = event.getKeyCode();
-            final int metaState = event.getMetaState();
-            final boolean initialDown = event.getAction() == KeyEvent.ACTION_DOWN
-                    && event.getRepeatCount() == 0;
-
-            // Check for fallback actions specified by the key character map.
-            final FallbackAction fallbackAction;
-            if (initialDown) {
-                fallbackAction = kcm.getFallbackAction(keyCode, metaState);
-            } else {
-                fallbackAction = mFallbackActions.get(keyCode);
-            }
-
-            if (fallbackAction != null) {
-                if (DEBUG_INPUT) {
-                    Slog.d(TAG, "Fallback: keyCode=" + fallbackAction.keyCode
-                            + " metaState=" + Integer.toHexString(fallbackAction.metaState));
-                }
-
-                final int flags = event.getFlags() | KeyEvent.FLAG_FALLBACK;
-                fallbackEvent = KeyEvent.obtain(
-                        event.getDownTime(), event.getEventTime(),
-                        event.getAction(), fallbackAction.keyCode,
-                        event.getRepeatCount(), fallbackAction.metaState,
-                        event.getDeviceId(), event.getScanCode(),
-                        flags, event.getSource(), event.getDisplayId(), null);
-
-                if (!interceptFallback(focusedToken, fallbackEvent, policyFlags)) {
-                    fallbackEvent.recycle();
-                    fallbackEvent = null;
-                }
-
-                if (initialDown) {
-                    mFallbackActions.put(keyCode, fallbackAction);
-                } else if (event.getAction() == KeyEvent.ACTION_UP) {
-                    mFallbackActions.remove(keyCode);
-                    fallbackAction.recycle();
-                }
-            }
-        }
-
-        if (DEBUG_INPUT) {
-            if (fallbackEvent == null) {
-                Slog.d(TAG, "No fallback.");
-            } else {
-                Slog.d(TAG, "Performing fallback: " + fallbackEvent);
-            }
-        }
-        return fallbackEvent;
-    }
-
-    private boolean interceptUnhandledKey(KeyEvent event, IBinder focusedToken) {
         final int keyCode = event.getKeyCode();
         final int repeatCount = event.getRepeatCount();
         final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
         final int metaState = event.getModifiers();
 
-        switch(keyCode) {
+        // TODO(b/358569822): Shift to KeyGestureEvent based handling
+        if (keyCode == KeyEvent.KEYCODE_STEM_PRIMARY) {
+            handleUnhandledSystemKey(event);
+            sendSystemKeyToStatusBarAsync(event);
+            return true;
+        }
+
+        if (useKeyGestureEventHandler()) {
+            return false;
+        }
+
+        switch (keyCode) {
             case KeyEvent.KEYCODE_SPACE:
                 if (down && repeatCount == 0) {
                     // Handle keyboard layout switching. (CTRL + SPACE)
@@ -4377,10 +4481,6 @@
                     return true;
                 }
                 break;
-            case KeyEvent.KEYCODE_STEM_PRIMARY:
-                handleUnhandledSystemKey(event);
-                sendSystemKeyToStatusBarAsync(event);
-                return true;
         }
 
         return false;
@@ -4419,19 +4519,6 @@
                 targetWindowToken);
     }
 
-    private boolean interceptFallback(IBinder focusedToken, KeyEvent fallbackEvent,
-            int policyFlags) {
-        int actions = interceptKeyBeforeQueueing(fallbackEvent, policyFlags);
-        if ((actions & ACTION_PASS_TO_USER) != 0) {
-            long delayMillis = interceptKeyBeforeDispatching(
-                    focusedToken, fallbackEvent, policyFlags);
-            if (delayMillis == 0 && !interceptUnhandledKey(fallbackEvent, focusedToken)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     @Override
     public void setTopFocusedDisplay(int displayId) {
         mTopFocusedDisplayId = displayId;
@@ -4888,6 +4975,7 @@
         final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
         boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
                 || event.isWakeKey();
+        boolean isKeyGestureTriggered = (policyFlags & FLAG_KEY_GESTURE_TRIGGERED) != 0;
 
         // There are key events that perform the operation as the current user,
         // and these should be ignored for visible background users.
@@ -5014,8 +5102,13 @@
         final boolean isDefaultDisplayOn = Display.isOnState(mDefaultDisplay.getState());
         final boolean isDefaultDisplayAwake = mDefaultDisplayPolicy.isAwake();
         final boolean interactiveAndAwake = interactive && isDefaultDisplayAwake;
-        if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
-            handleKeyGesture(event, interactiveAndAwake, isDefaultDisplayOn);
+        if (isKeyGestureTriggered) {
+            // If key gesture is triggered outside policy, reset gesture handlers here
+            mSingleKeyGestureDetector.reset();
+        } else {
+            if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
+                handleKeyGesture(event, interactiveAndAwake, isDefaultDisplayOn);
+            }
         }
 
         // Enable haptics if down and virtual key without multiple repetitions. If this is a hard
@@ -5178,7 +5271,7 @@
                 result &= ~ACTION_PASS_TO_USER;
                 isWakeKey = false; // wake-up will be handled separately
                 if (down) {
-                    interceptPowerKeyDown(event, interactiveAndAwake);
+                    interceptPowerKeyDown(event, interactiveAndAwake, isKeyGestureTriggered);
                 } else {
                     interceptPowerKeyUp(event, canceled);
                 }
@@ -7158,6 +7251,8 @@
                 return "DOUBLE_PRESS_PRIMARY_NOTHING";
             case DOUBLE_PRESS_PRIMARY_SWITCH_RECENT_APP:
                 return "DOUBLE_PRESS_PRIMARY_SWITCH_RECENT_APP";
+            case DOUBLE_PRESS_PRIMARY_LAUNCH_DEFAULT_FITNESS_APP:
+                return "DOUBLE_PRESS_PRIMARY_LAUNCH_DEFAULT_FITNESS_APP";
             default:
                 return Integer.toString(behavior);
         }
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index 892af6b..cc31bb1 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -368,6 +368,11 @@
          * belongs to.
          */
         boolean isCallerVirtualDeviceOwner(int displayId, int callingUid);
+
+        /**
+         * Returns whether the display with the given ID is trusted.
+         */
+        boolean isDisplayTrusted(int displayId);
     }
 
     /**
@@ -754,11 +759,9 @@
      * @param focusedToken Client window token that currently has focus. This is where the key
      *            event will normally go.
      * @param event The key event.
-     * @param policyFlags The policy flags associated with the key.
-     * @return Returns an alternate key event to redispatch as a fallback, or null to give up.
-     * The caller is responsible for recycling the key event.
+     * @return true if the unhandled key is intercepted by the policy.
      */
-    KeyEvent dispatchUnhandledKey(IBinder focusedToken, KeyEvent event, int policyFlags);
+    boolean interceptUnhandledKey(KeyEvent event, IBinder focusedToken);
 
     /**
      * Called when the top focused display is changed.
diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java
index 303828f..eb62b56 100644
--- a/services/core/java/com/android/server/power/Notifier.java
+++ b/services/core/java/com/android/server/power/Notifier.java
@@ -53,6 +53,7 @@
 import android.util.EventLog;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.SparseBooleanArray;
 import android.view.WindowManagerPolicyConstants;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -163,6 +164,7 @@
     }
 
     private final SparseArray<Interactivity> mInteractivityByGroupId = new SparseArray<>();
+    private SparseBooleanArray mDisplayInteractivities = new SparseBooleanArray();
 
     // The current global interactive state.  This is set as soon as an interactive state
     // transition begins so as to capture the reason that it happened.  At some point
@@ -512,8 +514,17 @@
             }
 
             // Start input as soon as we start waking up or going to sleep.
-            mInputManagerInternal.setInteractive(interactive);
             mInputMethodManagerInternal.setInteractive(interactive);
+            if (!mFlags.isPerDisplayWakeByTouchEnabled()) {
+                // Since wakefulness is a global property in original logic, all displays should
+                // be set to the same interactive state, matching system's global wakefulness
+                SparseBooleanArray displayInteractivities = new SparseBooleanArray();
+                int[] displayIds = mDisplayManagerInternal.getDisplayIds().toArray();
+                for (int displayId : displayIds) {
+                    displayInteractivities.put(displayId, interactive);
+                }
+                mInputManagerInternal.setDisplayInteractivities(displayInteractivities);
+            }
 
             // Notify battery stats.
             try {
@@ -680,6 +691,42 @@
     }
 
     /**
+     * Update the interactivities of the displays in given DisplayGroup.
+     *
+     * @param groupId The group id of the DisplayGroup to update display interactivities for.
+     */
+    private void updateDisplayInteractivities(int groupId, boolean interactive) {
+        final int[] displayIds = mDisplayManagerInternal.getDisplayIdsForGroup(groupId);
+        for (int displayId : displayIds) {
+            mDisplayInteractivities.put(displayId, interactive);
+        }
+
+    }
+
+    private void resetDisplayInteractivities() {
+        final SparseArray<int[]> displaysByGroupId =
+                mDisplayManagerInternal.getDisplayIdsByGroupsIds();
+        SparseBooleanArray newDisplayInteractivities = new SparseBooleanArray();
+        for (int i = 0; i < displaysByGroupId.size(); i++) {
+            final int groupId = displaysByGroupId.keyAt(i);
+            for (int displayId : displaysByGroupId.get(groupId)) {
+                // If we already know display interactivity, use that
+                if (mDisplayInteractivities.indexOfKey(displayId) > 0) {
+                    newDisplayInteractivities.put(
+                            displayId, mDisplayInteractivities.get(displayId));
+                } else { // If display is new to Notifier, use the power group's interactive value
+                    final Interactivity groupInteractivity = mInteractivityByGroupId.get(groupId);
+                    // If group Interactivity hasn't been initialized, assume group is interactive
+                    final boolean groupInteractive =
+                            groupInteractivity == null || groupInteractivity.isInteractive;
+                    newDisplayInteractivities.put(displayId, groupInteractive);
+                }
+            }
+        }
+        mDisplayInteractivities = newDisplayInteractivities;
+    }
+
+    /**
      * Called when an individual PowerGroup changes wakefulness.
      */
     public void onGroupWakefulnessChangeStarted(int groupId, int wakefulness, int changeReason,
@@ -707,6 +754,12 @@
             handleEarlyInteractiveChange(groupId);
             mWakefulnessSessionObserver.onWakefulnessChangeStarted(groupId, wakefulness,
                     changeReason, eventTime);
+
+            // Update input on which displays are interactive
+            if (mFlags.isPerDisplayWakeByTouchEnabled()) {
+                updateDisplayInteractivities(groupId, isInteractive);
+                mInputManagerInternal.setDisplayInteractivities(mDisplayInteractivities);
+            }
         }
     }
 
@@ -721,6 +774,16 @@
     }
 
     /**
+     * Called when a PowerGroup has been changed.
+     */
+    public void onGroupChanged() {
+        if (mFlags.isPerDisplayWakeByTouchEnabled()) {
+            resetDisplayInteractivities();
+            mInputManagerInternal.setDisplayInteractivities(mDisplayInteractivities);
+        }
+    }
+
+    /**
      * Called when there has been user activity.
      */
     public void onUserActivity(int displayGroupId, @PowerManager.UserActivityEvent int event,
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index e053964..65f2241 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -125,7 +125,6 @@
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.LatencyTracker;
 import com.android.internal.util.Preconditions;
-import com.android.server.crashrecovery.CrashRecoveryHelper;
 import com.android.server.EventLogTags;
 import com.android.server.LockGuard;
 import com.android.server.ServiceThread;
@@ -133,6 +132,7 @@
 import com.android.server.UiThread;
 import com.android.server.Watchdog;
 import com.android.server.am.BatteryStatsService;
+import com.android.server.crashrecovery.CrashRecoveryHelper;
 import com.android.server.display.feature.DeviceConfigParameterProvider;
 import com.android.server.lights.LightsManager;
 import com.android.server.lights.LogicalLight;
@@ -743,6 +743,7 @@
                 int reason, int uid, int opUid, String opPackageName, String details) {
             mWakefulnessChanging = true;
             mDirty |= DIRTY_WAKEFULNESS;
+            mInjector.invalidateIsInteractiveCaches();
             if (wakefulness == WAKEFULNESS_AWAKE) {
                 // Kick user activity to prevent newly awake group from timing out instantly.
                 // The dream may end without user activity if the dream app crashes / is updated,
@@ -2035,7 +2036,7 @@
     }
 
     @SuppressWarnings("deprecation")
-    private boolean isWakeLockLevelSupportedInternal(int level) {
+    private boolean isWakeLockLevelSupportedInternal(int level, int displayId) {
         synchronized (mLock) {
             switch (level) {
                 case PowerManager.PARTIAL_WAKE_LOCK:
@@ -2047,7 +2048,8 @@
                     return true;
 
                 case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
-                    return mSystemReady && mDisplayManagerInternal.isProximitySensorAvailable();
+                    return mSystemReady
+                            && mDisplayManagerInternal.isProximitySensorAvailable(displayId);
                 case PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK:
                     return mSystemReady && mFeatureFlags.isEarlyScreenTimeoutDetectorEnabled()
                             && mScreenTimeoutOverridePolicy != null;
@@ -2264,7 +2266,6 @@
             int opUid, String opPackageName, String details) {
         mPowerGroups.get(groupId).setWakefulnessLocked(wakefulness, eventTime, uid, reason, opUid,
                 opPackageName, details);
-        mInjector.invalidateIsInteractiveCaches();
     }
 
     @SuppressWarnings("deprecation")
@@ -2329,8 +2330,6 @@
         Trace.traceBegin(Trace.TRACE_TAG_POWER, traceMethodName);
         try {
             // Phase 2: Handle wakefulness change and bookkeeping.
-            // Under lock, invalidate before set ensures caches won't return stale values.
-            mInjector.invalidateIsInteractiveCaches();
             mWakefulnessRaw = newWakefulness;
             mWakefulnessChanging = true;
             mDirty |= DIRTY_WAKEFULNESS;
@@ -2428,6 +2427,7 @@
     void onPowerGroupEventLocked(int event, PowerGroup powerGroup) {
         mWakefulnessChanging = true;
         mDirty |= DIRTY_WAKEFULNESS;
+        mInjector.invalidateIsInteractiveCaches();
         final int groupId = powerGroup.getGroupId();
         if (event == DisplayGroupPowerChangeListener.DISPLAY_GROUP_REMOVED) {
             mPowerGroups.delete(groupId);
@@ -2445,6 +2445,8 @@
                     mClock.uptimeMillis());
         } else if (event == DisplayGroupPowerChangeListener.DISPLAY_GROUP_REMOVED) {
             mNotifier.onGroupRemoved(groupId);
+        } else if (event == DisplayGroupPowerChangeListener.DISPLAY_GROUP_CHANGED) {
+            mNotifier.onGroupChanged();
         }
 
         if (oldWakefulness != newWakefulness) {
@@ -3973,6 +3975,9 @@
 
     private boolean isInteractiveInternal(int displayId, int uid) {
         synchronized (mLock) {
+            if (!mSystemReady) {
+                return isGloballyInteractiveInternal();
+            }
             DisplayInfo displayInfo = mDisplayManagerInternal.getDisplayInfo(displayId);
             if (displayInfo == null) {
                 Slog.w(TAG, "Did not find DisplayInfo for displayId " + displayId);
@@ -5973,7 +5978,17 @@
         public boolean isWakeLockLevelSupported(int level) {
             final long ident = Binder.clearCallingIdentity();
             try {
-                return isWakeLockLevelSupportedInternal(level);
+                return isWakeLockLevelSupportedInternal(level, Display.DEFAULT_DISPLAY);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
+
+        @Override // Binder call
+        public boolean isWakeLockLevelSupportedWithDisplayId(int level, int displayId) {
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                return isWakeLockLevelSupportedInternal(level, displayId);
             } finally {
                 Binder.restoreCallingIdentity(ident);
             }
diff --git a/services/core/java/com/android/server/power/feature/PowerManagerFlags.java b/services/core/java/com/android/server/power/feature/PowerManagerFlags.java
index c6ef89d..fd60e06 100644
--- a/services/core/java/com/android/server/power/feature/PowerManagerFlags.java
+++ b/services/core/java/com/android/server/power/feature/PowerManagerFlags.java
@@ -42,6 +42,11 @@
             Flags::improveWakelockLatency
     );
 
+    private final FlagState mPerDisplayWakeByTouch = new FlagState(
+            Flags.FLAG_PER_DISPLAY_WAKE_BY_TOUCH,
+            Flags::perDisplayWakeByTouch
+    );
+
     /** Returns whether early-screen-timeout-detector is enabled on not. */
     public boolean isEarlyScreenTimeoutDetectorEnabled() {
         return mEarlyScreenTimeoutDetectorFlagState.isEnabled();
@@ -55,6 +60,13 @@
     }
 
     /**
+     * @return Whether per-display wake by touch is enabled or not.
+     */
+    public boolean isPerDisplayWakeByTouchEnabled() {
+        return mPerDisplayWakeByTouch.isEnabled();
+    }
+
+    /**
      * dumps all flagstates
      * @param pw printWriter
      */
@@ -62,6 +74,7 @@
         pw.println("PowerManagerFlags:");
         pw.println(" " + mEarlyScreenTimeoutDetectorFlagState);
         pw.println(" " + mImproveWakelockLatency);
+        pw.println(" " + mPerDisplayWakeByTouch);
     }
 
     private static class FlagState {
diff --git a/services/core/java/com/android/server/power/feature/power_flags.aconfig b/services/core/java/com/android/server/power/feature/power_flags.aconfig
index 3581b2f..9cf3bb6 100644
--- a/services/core/java/com/android/server/power/feature/power_flags.aconfig
+++ b/services/core/java/com/android/server/power/feature/power_flags.aconfig
@@ -17,4 +17,12 @@
     description: "Feature flag for tracking the optimizations to improve the latency of acquiring and releasing a wakelock."
     bug: "339590565"
     is_fixed_read_only: true
-}
\ No newline at end of file
+}
+
+flag {
+    name: "per_display_wake_by_touch"
+    namespace: "power"
+    description: "Feature flag to enable per-display wake by touch"
+    bug: "343295183"
+    is_fixed_read_only: true
+}
diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java
index 1346a29..2c0ce25 100644
--- a/services/core/java/com/android/server/power/hint/HintManagerService.java
+++ b/services/core/java/com/android/server/power/hint/HintManagerService.java
@@ -21,6 +21,7 @@
 import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
 import static com.android.server.power.hint.Flags.adpfSessionTag;
 import static com.android.server.power.hint.Flags.powerhintThreadCleanup;
+import static com.android.server.power.hint.Flags.resetOnForkEnabled;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -1057,6 +1058,25 @@
                     Slogf.w(TAG, errMsg);
                     throw new SecurityException(errMsg);
                 }
+                if (resetOnForkEnabled()){
+                    try {
+                        for (int tid : tids) {
+                            int policy = Process.getThreadScheduler(tid);
+                            // If the thread is not using the default scheduling policy (SCHED_OTHER),
+                            // we don't change it.
+                            if (policy != Process.SCHED_OTHER) {
+                                continue;
+                            }
+                            // set the SCHED_RESET_ON_FORK flag.
+                            int prio = Process.getThreadPriority(tid);
+                            Process.setThreadScheduler(tid, Process.SCHED_OTHER | Process.SCHED_RESET_ON_FORK, 0);
+                            Process.setThreadPriority(tid, prio);
+                        }
+                    } catch (Exception e) {
+                        Slog.e(TAG, "Failed to set SCHED_RESET_ON_FORK for tids "
+                                + Arrays.toString(tids), e);
+                    }
+                }
 
                 if (adpfSessionTag() && tag == SessionTag.APP) {
                     // If the category of the app is a game,
@@ -1282,11 +1302,9 @@
         boolean updateHintAllowedByProcState(boolean allowed) {
             synchronized (this) {
                 if (allowed && !mUpdateAllowedByProcState && !mShouldForcePause) {
-                    Slogf.e(TAG, "ADPF IS GETTING RESUMED? UID: " + mUid + " TAG: " + mTag);
                     resume();
                 }
                 if (!allowed && mUpdateAllowedByProcState) {
-                    Slogf.e(TAG, "ADPF IS GETTING PAUSED? UID: " + mUid + " TAG: " + mTag);
                     pause();
                 }
                 mUpdateAllowedByProcState = allowed;
@@ -1449,6 +1467,25 @@
                             Slogf.w(TAG, errMsg);
                             throw new SecurityException(errMsg);
                         }
+                        if (resetOnForkEnabled()){
+                            try {
+                                for (int tid : tids) {
+                                    int policy = Process.getThreadScheduler(tid);
+                                    // If the thread is not using the default scheduling policy (SCHED_OTHER),
+                                    // we don't change it.
+                                    if (policy != Process.SCHED_OTHER) {
+                                        continue;
+                                    }
+                                    // set the SCHED_RESET_ON_FORK flag.
+                                    int prio = Process.getThreadPriority(tid);
+                                    Process.setThreadScheduler(tid, Process.SCHED_OTHER | Process.SCHED_RESET_ON_FORK, 0);
+                                    Process.setThreadPriority(tid, prio);
+                                }
+                            } catch (Exception e) {
+                                Slog.e(TAG, "Failed to set SCHED_RESET_ON_FORK for tids "
+                                        + Arrays.toString(tids), e);
+                            }
+                        }
                         if (powerhintThreadCleanup()) {
                             synchronized (mNonIsolatedTidsLock) {
                                 for (int i = nonIsolated.size() - 1; i >= 0; i--) {
diff --git a/services/core/java/com/android/server/power/hint/flags.aconfig b/services/core/java/com/android/server/power/hint/flags.aconfig
index 55afa05..e56b68c 100644
--- a/services/core/java/com/android/server/power/hint/flags.aconfig
+++ b/services/core/java/com/android/server/power/hint/flags.aconfig
@@ -14,3 +14,10 @@
     description: "Feature flag for adding session tag to hint session atom"
     bug: "345011125"
 }
+
+flag {
+    name: "reset_on_fork_enabled"
+    namespace: "game"
+    description: "Set reset_on_fork flag."
+    bug: "370988407"
+}
diff --git a/services/core/java/com/android/server/power/stats/BatteryChargeCalculator.java b/services/core/java/com/android/server/power/stats/BatteryChargeCalculator.java
index c2e230e..cc05630 100644
--- a/services/core/java/com/android/server/power/stats/BatteryChargeCalculator.java
+++ b/services/core/java/com/android/server/power/stats/BatteryChargeCalculator.java
@@ -38,13 +38,7 @@
         builder.setDischargePercentage(
                 batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED));
 
-        int batteryCapacityMah = batteryStats.getLearnedBatteryCapacity() / 1000;
-        if (batteryCapacityMah <= 0) {
-            batteryCapacityMah = batteryStats.getMinLearnedBatteryCapacity() / 1000;
-            if (batteryCapacityMah <= 0) {
-                batteryCapacityMah = batteryStats.getEstimatedBatteryCapacity();
-            }
-        }
+        int batteryCapacityMah = batteryStats.getBatteryCapacity();
         builder.setBatteryCapacity(batteryCapacityMah);
 
         final double dischargedPowerLowerBoundMah =
diff --git a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
index 3f1d9a3..936fadf 100644
--- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
+++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
@@ -294,6 +294,7 @@
     private final LongSparseArray<SamplingTimer> mKernelMemoryStats = new LongSparseArray<>();
     private int[] mCpuPowerBracketMap;
     private final CpuPowerStatsCollector mCpuPowerStatsCollector;
+    private final WakelockPowerStatsCollector mWakelockPowerStatsCollector;
     private final ScreenPowerStatsCollector mScreenPowerStatsCollector;
     private final MobileRadioPowerStatsCollector mMobileRadioPowerStatsCollector;
     private final WifiPowerStatsCollector mWifiPowerStatsCollector;
@@ -400,6 +401,48 @@
         }
     }
 
+    private final WakelockPowerStatsCollector.WakelockDurationRetriever mWakelockDurationRetriever =
+            new WakelockPowerStatsCollector.WakelockDurationRetriever() {
+
+                @Override
+                public long getWakelockDurationMillis() {
+                    synchronized (BatteryStatsImpl.this) {
+                        long rawRealtimeUs = mClock.uptimeMillis() * 1000;
+                        long batteryUptimeUs = getBatteryUptime(rawRealtimeUs);
+                        long screenOnTimeUs = getScreenOnTime(rawRealtimeUs,
+                                BatteryStats.STATS_SINCE_CHARGED);
+                        return (batteryUptimeUs - screenOnTimeUs) / 1000;
+                    }
+                }
+
+                @Override
+                public void retrieveUidWakelockDuration(Callback callback) {
+                    synchronized (BatteryStatsImpl.this) {
+                        long rawRealtimeUs = mClock.elapsedRealtime() * 1000;
+                        for (int i = mUidStats.size() - 1; i >= 0; i--) {
+                            Uid u = mUidStats.valueAt(i);
+                            long wakeLockTimeUs = 0;
+                            ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> wakelockStats =
+                                    u.getWakelockStats();
+                            final int wakelockStatsCount = wakelockStats.size();
+                            for (int j = 0; j < wakelockStatsCount; j++) {
+                                final BatteryStats.Uid.Wakelock wakelock = wakelockStats.valueAt(j);
+                                BatteryStats.Timer timer = wakelock.getWakeTime(
+                                        BatteryStats.WAKE_TYPE_PARTIAL);
+                                if (timer != null) {
+                                    wakeLockTimeUs += timer.getTotalTimeLocked(rawRealtimeUs,
+                                            BatteryStats.STATS_SINCE_CHARGED);
+                                }
+                            }
+
+                            if (wakeLockTimeUs != 0) {
+                                callback.onUidWakelockDuration(u.getUid(), wakeLockTimeUs / 1000);
+                            }
+                        }
+                    }
+                }
+            };
+
     public LongSparseArray<SamplingTimer> getKernelMemoryStats() {
         return mKernelMemoryStats;
     }
@@ -2015,7 +2058,7 @@
     private class PowerStatsCollectorInjector implements CpuPowerStatsCollector.Injector,
             ScreenPowerStatsCollector.Injector, MobileRadioPowerStatsCollector.Injector,
             WifiPowerStatsCollector.Injector, BluetoothPowerStatsCollector.Injector,
-            EnergyConsumerPowerStatsCollector.Injector {
+            EnergyConsumerPowerStatsCollector.Injector, WakelockPowerStatsCollector.Injector {
         private PackageManager mPackageManager;
         private PowerStatsCollector.ConsumedEnergyRetriever mConsumedEnergyRetriever;
         private NetworkStatsManager mNetworkStatsManager;
@@ -2132,6 +2175,12 @@
             return () -> mPhoneSignalScanningTimer.getTotalTimeLocked(
                     mClock.elapsedRealtime() * 1000, STATS_SINCE_CHARGED) / 1000;
         }
+
+        @Override
+        public WakelockPowerStatsCollector.WakelockDurationRetriever
+                getWakelockDurationRetriever() {
+            return mWakelockDurationRetriever;
+        }
     }
 
     private final PowerStatsCollectorInjector mPowerStatsCollectorInjector =
@@ -10910,7 +10959,6 @@
             // Make special note of Foreground Services
             final boolean userAwareService = ActivityManager.isForegroundService(procState);
             uidRunningState = BatteryStats.mapToInternalProcessState(procState);
-
             if (mProcessState == uidRunningState && userAwareService == mInForegroundService) {
                 return;
             }
@@ -10949,8 +10997,7 @@
 
                 final int batteryConsumerProcessState =
                         mapUidProcessStateToBatteryConsumerProcessState(uidRunningState);
-                if (mBsi.mSystemReady && mBsi.mPowerStatsCollectorEnabled.get(
-                        BatteryConsumer.POWER_COMPONENT_CPU)) {
+                if (mBsi.mSystemReady) {
                     mBsi.mHistory.recordProcessStateChange(elapsedRealtimeMs, uptimeMs, mUid,
                             batteryConsumerProcessState);
                 }
@@ -11351,6 +11398,10 @@
         mCpuPowerStatsCollector = new CpuPowerStatsCollector(mPowerStatsCollectorInjector);
         mCpuPowerStatsCollector.addConsumer(this::recordPowerStats);
 
+        mWakelockPowerStatsCollector = new WakelockPowerStatsCollector(
+                mPowerStatsCollectorInjector);
+        mWakelockPowerStatsCollector.addConsumer(this::recordPowerStats);
+
         mScreenPowerStatsCollector = new ScreenPowerStatsCollector(mPowerStatsCollectorInjector);
         mScreenPowerStatsCollector.addConsumer(this::recordPowerStats);
 
@@ -14821,6 +14872,10 @@
                 mPowerStatsCollectorEnabled.get(BatteryConsumer.POWER_COMPONENT_CPU));
         mCpuPowerStatsCollector.schedule();
 
+        mWakelockPowerStatsCollector.setEnabled(
+                mPowerStatsCollectorEnabled.get(BatteryConsumer.POWER_COMPONENT_WAKELOCK));
+        mWakelockPowerStatsCollector.schedule();
+
         mScreenPowerStatsCollector.setEnabled(
                 mPowerStatsCollectorEnabled.get(BatteryConsumer.POWER_COMPONENT_SCREEN));
         mScreenPowerStatsCollector.schedule();
@@ -14861,6 +14916,8 @@
         switch (powerComponent) {
             case BatteryConsumer.POWER_COMPONENT_CPU:
                 return mCpuPowerStatsCollector;
+            case BatteryConsumer.POWER_COMPONENT_WAKELOCK:
+                return mWakelockPowerStatsCollector;
             case BatteryConsumer.POWER_COMPONENT_SCREEN:
                 return mScreenPowerStatsCollector;
             case BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO:
@@ -16402,6 +16459,7 @@
         }
 
         mCpuPowerStatsCollector.forceSchedule();
+        mWakelockPowerStatsCollector.forceSchedule();
         mScreenPowerStatsCollector.forceSchedule();
         mMobileRadioPowerStatsCollector.forceSchedule();
         mWifiPowerStatsCollector.forceSchedule();
@@ -16426,6 +16484,7 @@
      */
     public void dumpStatsSample(PrintWriter pw) {
         mCpuPowerStatsCollector.collectAndDump(pw);
+        mWakelockPowerStatsCollector.collectAndDump(pw);
         mScreenPowerStatsCollector.collectAndDump(pw);
         mMobileRadioPowerStatsCollector.collectAndDump(pw);
         mWifiPowerStatsCollector.collectAndDump(pw);
diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
index d66e05b..b466dd2 100644
--- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
+++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
@@ -52,6 +52,7 @@
     private final Clock mClock;
     private final Object mLock = new Object();
     private List<PowerCalculator> mPowerCalculators;
+    private UserPowerCalculator mUserPowerCalculator;
 
     public BatteryUsageStatsProvider(@NonNull Context context,
             @NonNull PowerAttributor powerAttributor,
@@ -63,6 +64,7 @@
         mPowerProfile = powerProfile;
         mCpuScalingPolicies = cpuScalingPolicies;
         mClock = clock;
+        mUserPowerCalculator = new UserPowerCalculator();
 
         mPowerStatsStore.addSectionReader(new BatteryUsageStatsSection.Reader());
         mPowerStatsStore.addSectionReader(new AccumulatedBatteryUsageStatsSection.Reader());
@@ -74,14 +76,20 @@
                 mPowerCalculators = new ArrayList<>();
 
                 // Power calculators are applied in the order of registration
-                mPowerCalculators.add(new BatteryChargeCalculator());
+                if (!mPowerAttributor.isPowerComponentSupported(
+                        BatteryConsumer.POWER_COMPONENT_BASE)) {
+                    mPowerCalculators.add(new BatteryChargeCalculator());
+                }
                 if (!mPowerAttributor.isPowerComponentSupported(
                         BatteryConsumer.POWER_COMPONENT_CPU)) {
                     mPowerCalculators.add(
                             new CpuPowerCalculator(mCpuScalingPolicies, mPowerProfile));
                 }
                 mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile));
-                mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile));
+                if (!mPowerAttributor.isPowerComponentSupported(
+                        BatteryConsumer.POWER_COMPONENT_WAKELOCK)) {
+                    mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile));
+                }
                 if (!BatteryStats.checkWifiOnly(mContext)) {
                     if (!mPowerAttributor.isPowerComponentSupported(
                             BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) {
@@ -138,8 +146,6 @@
                         BatteryConsumer.POWER_COMPONENT_ANY)) {
                     mPowerCalculators.add(new CustomEnergyConsumerPowerCalculator(mPowerProfile));
                 }
-                mPowerCalculators.add(new UserPowerCalculator());
-
                 if (!com.android.server.power.optimization.Flags.disableSystemServicePowerAttr()) {
                     // It is important that SystemServicePowerCalculator be applied last,
                     // because it re-attributes some of the power estimated by the other
@@ -317,58 +323,54 @@
                 & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS) != 0);
         final double minConsumedPowerThreshold = query.getMinConsumedPowerThreshold();
 
-        final BatteryUsageStats.Builder batteryUsageStatsBuilder;
+        String[] customEnergyConsumerNames;
         long monotonicStartTime, monotonicEndTime;
         synchronized (stats) {
+            customEnergyConsumerNames = stats.getCustomEnergyConsumerNames();
             monotonicStartTime = stats.getMonotonicStartTime();
             monotonicEndTime = stats.getMonotonicEndTime();
+        }
 
-            batteryUsageStatsBuilder = new BatteryUsageStats.Builder(
-                    stats.getCustomEnergyConsumerNames(), includePowerModels,
-                    includeProcessStateData, query.isScreenStateDataNeeded(),
-                    query.isPowerStateDataNeeded(), minConsumedPowerThreshold);
+        final BatteryUsageStats.Builder batteryUsageStatsBuilder = new BatteryUsageStats.Builder(
+                customEnergyConsumerNames, includePowerModels,
+                includeProcessStateData, query.isScreenStateDataNeeded(),
+                query.isPowerStateDataNeeded(), minConsumedPowerThreshold);
 
+        synchronized (stats) {
             // TODO(b/188068523): use a monotonic clock to ensure resilience of order and duration
             // of batteryUsageStats sessions to wall-clock adjustments
             batteryUsageStatsBuilder.setStatsStartTimestamp(stats.getStartClockTime());
             batteryUsageStatsBuilder.setStatsEndTimestamp(currentTimeMs);
-            SparseArray<? extends BatteryStats.Uid> uidStats = stats.getUidStats();
-            for (int i = uidStats.size() - 1; i >= 0; i--) {
-                final BatteryStats.Uid uid = uidStats.valueAt(i);
-                if (!includeVirtualUids && uid.getUid() == Process.SDK_SANDBOX_VIRTUAL_UID) {
-                    continue;
-                }
-
-                batteryUsageStatsBuilder.getOrCreateUidBatteryConsumerBuilder(uid)
-                        .setTimeInProcessStateMs(UidBatteryConsumer.PROCESS_STATE_BACKGROUND,
-                                getProcessBackgroundTimeMs(uid, realtimeUs))
-                        .setTimeInProcessStateMs(UidBatteryConsumer.PROCESS_STATE_FOREGROUND,
-                                getProcessForegroundTimeMs(uid, realtimeUs))
-                        .setTimeInProcessStateMs(
-                                UidBatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE,
-                                getProcessForegroundServiceTimeMs(uid, realtimeUs));
-            }
-
-            final int[] powerComponents = query.getPowerComponents();
             final List<PowerCalculator> powerCalculators = getPowerCalculators();
-            for (int i = 0, count = powerCalculators.size(); i < count; i++) {
-                PowerCalculator powerCalculator = powerCalculators.get(i);
-                if (powerComponents != null) {
-                    boolean include = false;
-                    for (int powerComponent : powerComponents) {
-                        if (powerCalculator.isPowerComponentSupported(powerComponent)) {
-                            include = true;
-                            break;
-                        }
-                    }
-                    if (!include) {
+            if (!powerCalculators.isEmpty()) {
+                final int[] powerComponents = query.getPowerComponents();
+                SparseArray<? extends BatteryStats.Uid> uidStats = stats.getUidStats();
+                for (int i = uidStats.size() - 1; i >= 0; i--) {
+                    final BatteryStats.Uid uid = uidStats.valueAt(i);
+                    if (!includeVirtualUids && uid.getUid() == Process.SDK_SANDBOX_VIRTUAL_UID) {
                         continue;
                     }
-                }
-                powerCalculator.calculate(batteryUsageStatsBuilder, stats, realtimeUs, uptimeUs,
-                        query);
-            }
 
+                    batteryUsageStatsBuilder.getOrCreateUidBatteryConsumerBuilder(uid);
+                }
+                for (int i = 0, count = powerCalculators.size(); i < count; i++) {
+                    PowerCalculator powerCalculator = powerCalculators.get(i);
+                    if (powerComponents != null) {
+                        boolean include = false;
+                        for (int powerComponent : powerComponents) {
+                            if (powerCalculator.isPowerComponentSupported(powerComponent)) {
+                                include = true;
+                                break;
+                            }
+                        }
+                        if (!include) {
+                            continue;
+                        }
+                    }
+                    powerCalculator.calculate(batteryUsageStatsBuilder, stats, realtimeUs, uptimeUs,
+                            query);
+                }
+            }
             if ((query.getFlags()
                     & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY) != 0) {
                 batteryUsageStatsBuilder.setBatteryHistory(stats.copyHistory());
@@ -378,9 +380,28 @@
         mPowerAttributor.estimatePowerConsumption(batteryUsageStatsBuilder, stats.getHistory(),
                 monotonicStartTime, monotonicEndTime);
 
+        // Combine apps by the user if necessary
+        mUserPowerCalculator.calculate(batteryUsageStatsBuilder, stats, realtimeUs, uptimeUs,
+                query);
+
+        populateGeneralInfo(batteryUsageStatsBuilder, stats);
         return batteryUsageStatsBuilder;
     }
 
+    private void populateGeneralInfo(BatteryUsageStats.Builder builder, BatteryStatsImpl stats) {
+        builder.setBatteryCapacity(stats.getEstimatedBatteryCapacity());
+        final long batteryTimeRemainingMs = stats.computeBatteryTimeRemaining(
+                mClock.elapsedRealtime() * 1000);
+        if (batteryTimeRemainingMs != -1) {
+            builder.setBatteryTimeRemainingMs(batteryTimeRemainingMs / 1000);
+        }
+        final long chargeTimeRemainingMs = stats.computeChargeTimeRemaining(
+                mClock.elapsedRealtime() * 1000);
+        if (chargeTimeRemainingMs != -1) {
+            builder.setChargeTimeRemainingMs(chargeTimeRemainingMs / 1000);
+        }
+    }
+
     // STOPSHIP(b/229906525): remove verification before shipping
     private static boolean sErrorReported;
 
@@ -423,39 +444,6 @@
         }
     }
 
-    private long getProcessForegroundTimeMs(BatteryStats.Uid uid, long realtimeUs) {
-        final long topStateDurationUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_TOP,
-                realtimeUs, BatteryStats.STATS_SINCE_CHARGED);
-        long foregroundActivityDurationUs = 0;
-        final BatteryStats.Timer foregroundActivityTimer = uid.getForegroundActivityTimer();
-        if (foregroundActivityTimer != null) {
-            foregroundActivityDurationUs = foregroundActivityTimer.getTotalTimeLocked(realtimeUs,
-                    BatteryStats.STATS_SINCE_CHARGED);
-        }
-
-        // Use the min value of STATE_TOP time and foreground activity time, since both of these
-        // times are imprecise
-        long totalForegroundDurationUs = Math.min(topStateDurationUs, foregroundActivityDurationUs);
-
-        totalForegroundDurationUs += uid.getProcessStateTime(
-                BatteryStats.Uid.PROCESS_STATE_FOREGROUND, realtimeUs,
-                BatteryStats.STATS_SINCE_CHARGED);
-
-        return totalForegroundDurationUs / 1000;
-    }
-
-    private long getProcessBackgroundTimeMs(BatteryStats.Uid uid, long realtimeUs) {
-        return uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND,
-                realtimeUs, BatteryStats.STATS_SINCE_CHARGED)
-                / 1000;
-    }
-
-    private long getProcessForegroundServiceTimeMs(BatteryStats.Uid uid, long realtimeUs) {
-        return uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE,
-                realtimeUs, BatteryStats.STATS_SINCE_CHARGED)
-                / 1000;
-    }
-
     private BatteryUsageStats getAggregatedBatteryUsageStats(BatteryStatsImpl stats,
             BatteryUsageStatsQuery query) {
         final boolean includePowerModels = (query.getFlags()
diff --git a/services/core/java/com/android/server/power/stats/BluetoothPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/BluetoothPowerStatsCollector.java
index 539c415..d7aa987 100644
--- a/services/core/java/com/android/server/power/stats/BluetoothPowerStatsCollector.java
+++ b/services/core/java/com/android/server/power/stats/BluetoothPowerStatsCollector.java
@@ -30,6 +30,7 @@
 import com.android.internal.os.PowerStats;
 import com.android.server.power.stats.format.BluetoothPowerStatsLayout;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
@@ -142,6 +143,7 @@
             return null;
         }
 
+        Arrays.fill(mDeviceStats, 0);
         mPowerStats.uidStats.clear();
 
         collectBluetoothActivityInfo();
diff --git a/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java
index 128f14a..dd6484d 100644
--- a/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java
+++ b/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java
@@ -34,6 +34,7 @@
 import com.android.server.power.stats.format.CpuPowerStatsLayout;
 
 import java.io.PrintWriter;
+import java.util.Arrays;
 import java.util.Locale;
 
 /**
@@ -330,7 +331,9 @@
             return null;
         }
 
+        Arrays.fill(mCpuPowerStats.stats, 0);
         mCpuPowerStats.uidStats.clear();
+
         // TODO(b/305120724): additionally retrieve time-in-cluster for each CPU cluster
         long newTimestampNanos = mKernelCpuStatsReader.readCpuStats(this::processUidStats,
                 mLayout.getScalingStepToPowerBracketMap(), mLastUpdateTimestampNanos,
diff --git a/services/core/java/com/android/server/power/stats/EnergyConsumerPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/EnergyConsumerPowerStatsCollector.java
index 1d2e388..079fc3c 100644
--- a/services/core/java/com/android/server/power/stats/EnergyConsumerPowerStatsCollector.java
+++ b/services/core/java/com/android/server/power/stats/EnergyConsumerPowerStatsCollector.java
@@ -24,6 +24,8 @@
 import com.android.internal.os.PowerStats;
 import com.android.server.power.stats.format.EnergyConsumerPowerStatsLayout;
 
+import java.util.Arrays;
+
 public class EnergyConsumerPowerStatsCollector extends PowerStatsCollector {
 
     public interface Injector {
@@ -105,6 +107,7 @@
             return null;
         }
 
+        Arrays.fill(mPowerStats.stats, 0);
         mPowerStats.uidStats.clear();
 
         if (!mConsumedEnergyHelper.collectConsumedEnergy(mPowerStats, mLayout)) {
diff --git a/services/core/java/com/android/server/power/stats/ScreenPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/ScreenPowerStatsCollector.java
index 8371e66..c38904f 100644
--- a/services/core/java/com/android/server/power/stats/ScreenPowerStatsCollector.java
+++ b/services/core/java/com/android/server/power/stats/ScreenPowerStatsCollector.java
@@ -27,6 +27,8 @@
 import com.android.internal.os.PowerStats;
 import com.android.server.power.stats.format.ScreenPowerStatsLayout;
 
+import java.util.Arrays;
+
 public class ScreenPowerStatsCollector extends PowerStatsCollector {
     private static final String TAG = "ScreenPowerStatsCollector";
 
@@ -115,6 +117,9 @@
             return null;
         }
 
+        Arrays.fill(mPowerStats.stats, 0);
+        mPowerStats.uidStats.clear();
+
         mConsumedEnergyHelper.collectConsumedEnergy(mPowerStats, mLayout);
 
         for (int display = 0; display < mDisplayCount; display++) {
@@ -142,8 +147,6 @@
             mLastDozeTime[display] = screenDozeTimeMs;
         }
 
-        mPowerStats.uidStats.clear();
-
         mScreenUsageTimeRetriever.retrieveTopActivityTimes((uid, topActivityTimeMs) -> {
             long topActivityDuration = topActivityTimeMs - mLastTopActivityTime.get(uid);
             if (topActivityDuration == 0) {
diff --git a/services/core/java/com/android/server/power/stats/WakelockPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/WakelockPowerStatsCollector.java
new file mode 100644
index 0000000..e36c994
--- /dev/null
+++ b/services/core/java/com/android/server/power/stats/WakelockPowerStatsCollector.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2024 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.power.stats;
+
+import android.annotation.Nullable;
+import android.os.BatteryConsumer;
+import android.os.Handler;
+import android.os.PersistableBundle;
+import android.util.SparseLongArray;
+
+import com.android.internal.os.Clock;
+import com.android.internal.os.PowerStats;
+import com.android.server.power.stats.format.WakelockPowerStatsLayout;
+
+import java.util.Arrays;
+
+class WakelockPowerStatsCollector extends PowerStatsCollector {
+
+    public interface WakelockDurationRetriever {
+        interface Callback {
+            void onUidWakelockDuration(int uid, long wakelockDurationMs);
+        }
+
+        long getWakelockDurationMillis();
+        void retrieveUidWakelockDuration(Callback callback);
+    }
+
+    public interface Injector {
+        Handler getHandler();
+        Clock getClock();
+        PowerStatsUidResolver getUidResolver();
+        long getPowerStatsCollectionThrottlePeriod(String powerComponentName);
+        WakelockDurationRetriever getWakelockDurationRetriever();
+    }
+
+    private final WakelockDurationRetriever mWakelockDurationRetriever;
+    private WakelockPowerStatsLayout mStatsLayout;
+    private PowerStats.Descriptor mDescriptor;
+    private PowerStats mPowerStats;
+    private boolean mIsInitialized;
+    private boolean mFirstCollection = true;
+    private long mLastCollectionTime;
+    private long mLastWakelockDurationMs;
+    private final SparseLongArray mLastUidWakelockDurations = new SparseLongArray();
+
+    WakelockPowerStatsCollector(Injector injector) {
+        super(injector.getHandler(), injector.getPowerStatsCollectionThrottlePeriod(
+                        BatteryConsumer.powerComponentIdToString(
+                                BatteryConsumer.POWER_COMPONENT_WAKELOCK)),
+                injector.getUidResolver(), injector.getClock());
+        mWakelockDurationRetriever = injector.getWakelockDurationRetriever();
+    }
+
+    private boolean ensureInitialized() {
+        if (mIsInitialized) {
+            return true;
+        }
+
+        if (!isEnabled()) {
+            return false;
+        }
+
+        mStatsLayout = new WakelockPowerStatsLayout();
+        PersistableBundle extras = new PersistableBundle();
+        mStatsLayout.toExtras(extras);
+        mDescriptor = new PowerStats.Descriptor(BatteryConsumer.POWER_COMPONENT_WAKELOCK,
+                mStatsLayout.getDeviceStatsArrayLength(), null, 0,
+                mStatsLayout.getUidStatsArrayLength(), extras);
+        mPowerStats = new PowerStats(mDescriptor);
+        mIsInitialized = true;
+        return true;
+    }
+
+    @Nullable
+    @Override
+    protected PowerStats collectStats() {
+        if (!ensureInitialized()) {
+            return null;
+        }
+
+        Arrays.fill(mPowerStats.stats, 0);
+        mPowerStats.uidStats.clear();
+
+        long elapsedRealtime = mClock.elapsedRealtime();
+        mPowerStats.durationMs = elapsedRealtime - mLastCollectionTime;
+
+        long wakelockDurationMillis = mWakelockDurationRetriever.getWakelockDurationMillis();
+
+        if (!mFirstCollection) {
+            mStatsLayout.setUsageDuration(mPowerStats.stats,
+                    Math.max(0, wakelockDurationMillis - mLastWakelockDurationMs));
+        }
+
+        mLastWakelockDurationMs = wakelockDurationMillis;
+
+        mWakelockDurationRetriever.retrieveUidWakelockDuration((uid, durationMs) -> {
+            if (!mFirstCollection) {
+                long[] uidStats = mPowerStats.uidStats.get(uid);
+                if (uidStats == null) {
+                    uidStats = new long[mDescriptor.uidStatsArrayLength];
+                    mPowerStats.uidStats.put(uid, uidStats);
+                }
+
+                mStatsLayout.setUidUsageDuration(uidStats,
+                        Math.max(0, durationMs - mLastUidWakelockDurations.get(uid)));
+            }
+            mLastUidWakelockDurations.put(uid, durationMs);
+        });
+
+        mLastCollectionTime = elapsedRealtime;
+        mFirstCollection = false;
+
+        return mPowerStats;
+    }
+}
diff --git a/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java
index 7a84b05..1fdeac9 100644
--- a/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java
+++ b/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java
@@ -30,6 +30,7 @@
 import com.android.internal.os.PowerStats;
 import com.android.server.power.stats.format.WifiPowerStatsLayout;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
@@ -151,6 +152,9 @@
             return null;
         }
 
+        Arrays.fill(mDeviceStats, 0);
+        mPowerStats.uidStats.clear();
+
         WifiActivityEnergyInfo activityInfo = null;
         if (mPowerReportingSupported) {
             activityInfo = collectWifiActivityInfo();
@@ -224,8 +228,6 @@
     }
 
     private List<BatteryStatsImpl.NetworkStatsDelta> collectNetworkStats() {
-        mPowerStats.uidStats.clear();
-
         NetworkStats networkStats = mNetworkStatsSupplier.get();
         if (networkStats == null) {
             return null;
diff --git a/services/core/java/com/android/server/power/stats/format/BasePowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/BasePowerStatsLayout.java
new file mode 100644
index 0000000..a9c856c
--- /dev/null
+++ b/services/core/java/com/android/server/power/stats/format/BasePowerStatsLayout.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2024 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.power.stats.format;
+
+import android.annotation.NonNull;
+import android.os.PersistableBundle;
+
+import com.android.internal.os.PowerStats;
+
+public class BasePowerStatsLayout extends PowerStatsLayout {
+    private static final String EXTRA_DEVICE_BATTERY_DISCHARGE = "d-bd";
+    private static final String EXTRA_DEVICE_BATTERY_DISCHARGE_PCT = "d-bdp";
+    private static final String EXTRA_DEVICE_BATTERY_DISCHARGE_DURATION = "d-bdd";
+    private final int mDeviceBatteryDischargePosition;
+    private final int mDeviceBatteryDischargePercentPosition;
+    private final int mDeviceBatteryDischargeDurationPosition;
+
+    public BasePowerStatsLayout() {
+        addDeviceSectionUsageDuration();
+        addUidSectionUsageDuration();
+        mDeviceBatteryDischargePosition = addDeviceSection(1, "discharge");
+        // Stored with a 1000000 multiplier for precision
+        mDeviceBatteryDischargePercentPosition = addDeviceSection(1, "discharge-pct",
+                FLAG_FORMAT_AS_POWER);
+        mDeviceBatteryDischargeDurationPosition = addDeviceSection(1, "discharge-duration");
+    }
+
+    public BasePowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) {
+        super(descriptor);
+        PersistableBundle extras = descriptor.extras;
+        mDeviceBatteryDischargePosition = extras.getInt(EXTRA_DEVICE_BATTERY_DISCHARGE);
+        mDeviceBatteryDischargePercentPosition = extras.getInt(EXTRA_DEVICE_BATTERY_DISCHARGE_PCT);
+        mDeviceBatteryDischargeDurationPosition =
+                extras.getInt(EXTRA_DEVICE_BATTERY_DISCHARGE_DURATION);
+    }
+
+    /**
+     * Copies the elements of the stats array layout into <code>extras</code>
+     */
+    public void toExtras(PersistableBundle extras) {
+        super.toExtras(extras);
+        extras.putInt(EXTRA_DEVICE_BATTERY_DISCHARGE, mDeviceBatteryDischargePosition);
+        extras.putInt(EXTRA_DEVICE_BATTERY_DISCHARGE_PCT, mDeviceBatteryDischargePercentPosition);
+        extras.putInt(EXTRA_DEVICE_BATTERY_DISCHARGE_DURATION,
+                mDeviceBatteryDischargeDurationPosition);
+    }
+
+    /**
+     * Accumulates battery discharge amount.
+     */
+    public void addBatteryDischargeUah(long[] stats, long dischargeUah) {
+        stats[mDeviceBatteryDischargePosition] += dischargeUah;
+    }
+
+    /**
+     * Returns accumulated battery discharge amount.
+     */
+    public long getBatteryDischargeUah(long[] stats) {
+        return stats[mDeviceBatteryDischargePosition];
+    }
+
+    /**
+     * Accumulates battery discharge in percentage points.
+     */
+    public void addBatteryDischargePercent(long[] stats, int dischargePct) {
+        // store pct * 1000000 for better rounding precision
+        stats[mDeviceBatteryDischargePercentPosition] += dischargePct * 1000000L;
+    }
+
+    /**
+     * Returns battery discharge amount as percentage of battery capacity.   May exceed 100% if
+     * the battery was recharged/discharged during the power stats collection session.
+     */
+    public double getBatteryDischargePercent(long[] stats) {
+        return (int) stats[mDeviceBatteryDischargePercentPosition] / 1000000.0;
+    }
+
+    /**
+     * Accumulates battery discharge duration.
+     */
+    public void addBatteryDischargeDuration(long[] stats, long durationMs) {
+        stats[mDeviceBatteryDischargeDurationPosition] += durationMs;
+    }
+
+    /**
+     * Returns accumulated battery discharge duration.
+     */
+    public long getBatteryDischargeDuration(long[] stats) {
+        return (int) stats[mDeviceBatteryDischargeDurationPosition];
+    }
+}
diff --git a/services/core/java/com/android/server/power/stats/format/PowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/PowerStatsLayout.java
index d070919..26c8ed1 100644
--- a/services/core/java/com/android/server/power/stats/format/PowerStatsLayout.java
+++ b/services/core/java/com/android/server/power/stats/format/PowerStatsLayout.java
@@ -181,6 +181,9 @@
      * Extracts the usage duration from the corresponding <code>stats</code> element.
      */
     public long getUsageDuration(long[] stats) {
+        if (mDeviceDurationPosition == UNSUPPORTED) {
+            return 0;
+        }
         return stats[mDeviceDurationPosition];
     }
 
@@ -234,6 +237,9 @@
      * Extracts the power estimate from a device stats array and converts it to mAh.
      */
     public double getDevicePowerEstimate(long[] stats) {
+        if (mDevicePowerEstimatePosition == UNSUPPORTED) {
+            return 0;
+        }
         return stats[mDevicePowerEstimatePosition] / MILLI_TO_NANO_MULTIPLIER;
     }
 
@@ -255,7 +261,7 @@
      * Returns true if power for this component is attributed to UIDs (apps).
      */
     public boolean isUidPowerAttributionSupported() {
-        return mUidPowerEstimatePosition != UNSUPPORTED;
+        return mUidPowerEstimatePosition != UNSUPPORTED || mUidDurationPosition != UNSUPPORTED;
     }
 
     /**
@@ -269,6 +275,9 @@
      * Extracts the usage duration from a UID stats array.
      */
     public long getUidUsageDuration(long[] stats) {
+        if (mUidDurationPosition == UNSUPPORTED) {
+            return 0;
+        }
         return stats[mUidDurationPosition];
     }
 
@@ -314,6 +323,9 @@
      * Extracts the power estimate from a UID stats array and converts it to mAh.
      */
     public double getUidPowerEstimate(long[] stats) {
+        if (mUidPowerEstimatePosition == UNSUPPORTED) {
+            return 0;
+        }
         return stats[mUidPowerEstimatePosition] / MILLI_TO_NANO_MULTIPLIER;
     }
 
diff --git a/services/core/java/com/android/server/power/stats/format/WakelockPowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/WakelockPowerStatsLayout.java
new file mode 100644
index 0000000..c11cf56
--- /dev/null
+++ b/services/core/java/com/android/server/power/stats/format/WakelockPowerStatsLayout.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2024 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.power.stats.format;
+
+import com.android.internal.os.PowerStats;
+
+public class WakelockPowerStatsLayout extends PowerStatsLayout {
+    public WakelockPowerStatsLayout() {
+        addDeviceSectionUsageDuration();
+        addDeviceSectionPowerEstimate();
+        addUidSectionUsageDuration();
+        addUidSectionPowerEstimate();
+    }
+
+    public WakelockPowerStatsLayout(PowerStats.Descriptor descriptor) {
+        super(descriptor);
+    }
+}
diff --git a/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStats.java b/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStats.java
index a4758dd..a783d54 100644
--- a/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStats.java
+++ b/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStats.java
@@ -224,6 +224,13 @@
         }
     }
 
+    public void noteBatteryLevel(int batteryLevel, int batteryChargeUah, long timestampMs) {
+        for (int i = 0; i < mPowerComponentStats.size(); i++) {
+            mPowerComponentStats.valueAt(i).noteBatteryLevel(batteryLevel, batteryChargeUah,
+                    timestampMs);
+        }
+    }
+
     void finish(long timestampMs) {
         for (int i = 0; i < mPowerComponentStats.size(); i++) {
             PowerComponentAggregatedPowerStats component = mPowerComponentStats.valueAt(i);
diff --git a/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStatsConfig.java b/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStatsConfig.java
index eaeda43..9459601 100644
--- a/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStatsConfig.java
+++ b/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStatsConfig.java
@@ -174,36 +174,36 @@
      * standard power component IDs, e.g. {@link BatteryConsumer#POWER_COMPONENT_CPU}, or
      * a custom power component.
      */
-    PowerComponent trackPowerComponent(int powerComponentId) {
+    PowerComponent trackPowerComponent(@BatteryConsumer.PowerComponentId int powerComponentId) {
         PowerComponent builder = new PowerComponent(powerComponentId);
         mPowerComponents.add(builder);
         return builder;
     }
 
     /**
-     * Creates a configuration for the specified power component, which is a subcomponent
-     * of a different power component.  The tracked states will be the same as the parent
-     * component's.
+     * Creates a configuration for the specified power component, whose attribution calculation
+     * depends on a different power component.  The tracked states will be the same as the
+     * "dependsOn" component's.
      */
-    PowerComponent trackPowerComponent(int powerComponentId,
-            int parentPowerComponentId) {
-        PowerComponent parent = null;
+    PowerComponent trackPowerComponent(@BatteryConsumer.PowerComponentId int powerComponentId,
+            @BatteryConsumer.PowerComponentId int dependsOnPowerComponentId) {
+        PowerComponent dependsOnPowerComponent = null;
         for (int i = 0; i < mPowerComponents.size(); i++) {
             PowerComponent powerComponent = mPowerComponents.get(i);
-            if (powerComponent.getPowerComponentId() == parentPowerComponentId) {
-                parent = powerComponent;
+            if (powerComponent.getPowerComponentId() == dependsOnPowerComponentId) {
+                dependsOnPowerComponent = powerComponent;
                 break;
             }
         }
 
-        if (parent == null) {
+        if (dependsOnPowerComponent == null) {
             throw new IllegalArgumentException(
-                    "Parent component " + parentPowerComponentId + " is not configured");
+                    "Required component " + dependsOnPowerComponentId + " is not configured");
         }
 
         PowerComponent powerComponent = trackPowerComponent(powerComponentId);
-        powerComponent.mTrackedDeviceStates = parent.mTrackedDeviceStates;
-        powerComponent.mTrackedUidStates = parent.mTrackedUidStates;
+        powerComponent.mTrackedDeviceStates = dependsOnPowerComponent.mTrackedDeviceStates;
+        powerComponent.mTrackedUidStates = dependsOnPowerComponent.mTrackedUidStates;
         return powerComponent;
     }
 
diff --git a/services/core/java/com/android/server/power/stats/processor/BasePowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/BasePowerStatsProcessor.java
new file mode 100644
index 0000000..1459ff5
--- /dev/null
+++ b/services/core/java/com/android/server/power/stats/processor/BasePowerStatsProcessor.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2024 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.power.stats.processor;
+
+import static android.os.BatteryConsumer.PROCESS_STATE_UNSPECIFIED;
+
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER;
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE;
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN;
+
+import android.os.BatteryConsumer;
+import android.os.PersistableBundle;
+import android.util.SparseLongArray;
+
+import com.android.internal.os.PowerStats;
+import com.android.server.power.stats.format.BasePowerStatsLayout;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.DoubleSupplier;
+
+class BasePowerStatsProcessor extends PowerStatsProcessor {
+    private final DoubleSupplier mBatteryCapacitySupplier;
+    private PowerEstimationPlan mPlan;
+    private long mStartTimestamp;
+    private final SparseLongArray mUidStartTimestamps = new SparseLongArray();
+    private static final BasePowerStatsLayout sStatsLayout = new BasePowerStatsLayout();
+    private final PowerStats.Descriptor mPowerStatsDescriptor;
+    private final long[] mTmpUidStatsArray;
+    private double mBatteryCapacityUah;
+    private int mBatteryLevel;
+    private int mBatteryChargeUah;
+    private long mBatteryLevelTimestampMs;
+    private int mCumulativeDischargePct;
+    private long mCumulativeDischargeUah;
+    private long mCumulativeDischargeDurationMs;
+
+    private static final int UNSPECIFIED = -1;
+
+    BasePowerStatsProcessor(DoubleSupplier batteryCapacitySupplier) {
+        mBatteryCapacitySupplier = batteryCapacitySupplier;
+        PersistableBundle extras = new PersistableBundle();
+        sStatsLayout.toExtras(extras);
+        mPowerStatsDescriptor = new PowerStats.Descriptor(BatteryConsumer.POWER_COMPONENT_BASE,
+                sStatsLayout.getDeviceStatsArrayLength(), null, 0,
+                sStatsLayout.getUidStatsArrayLength(), extras);
+        mTmpUidStatsArray = new long[sStatsLayout.getUidStatsArrayLength()];
+    }
+
+    @Override
+    void start(PowerComponentAggregatedPowerStats stats, long timestampMs) {
+        mStartTimestamp = timestampMs;
+        mUidStartTimestamps.clear();
+        stats.setPowerStatsDescriptor(mPowerStatsDescriptor);
+        mBatteryCapacityUah = mBatteryCapacitySupplier.getAsDouble() * 1000;
+        mBatteryLevel = UNSPECIFIED;
+        mBatteryChargeUah = UNSPECIFIED;
+        mBatteryLevelTimestampMs = UNSPECIFIED;
+        mCumulativeDischargeUah = 0;
+        mCumulativeDischargePct = 0;
+        mCumulativeDischargeDurationMs = 0;
+    }
+
+    @Override
+    public void noteBatteryLevel(int batteryLevel, int batteryChargeUah, long timestampMs) {
+        boolean discharging = false;
+        if (mBatteryLevel != UNSPECIFIED && batteryLevel < mBatteryLevel) {
+            mCumulativeDischargePct += mBatteryLevel - batteryLevel;
+            discharging = true;
+        }
+
+        if (mBatteryChargeUah != UNSPECIFIED && batteryChargeUah != 0
+                && batteryChargeUah < mBatteryChargeUah) {
+            mCumulativeDischargeUah += mBatteryChargeUah - batteryChargeUah;
+            discharging = true;
+        }
+
+        if (discharging) {
+            if (mBatteryLevelTimestampMs != UNSPECIFIED) {
+                mCumulativeDischargeDurationMs += timestampMs - mBatteryLevelTimestampMs;
+            }
+        }
+
+        mBatteryLevel = batteryLevel;
+        mBatteryChargeUah = batteryChargeUah;
+        mBatteryLevelTimestampMs = timestampMs;
+    }
+
+    @Override
+    public void setUidState(PowerComponentAggregatedPowerStats stats, int uid,
+            @AggregatedPowerStatsConfig.TrackedState int stateId, int state, long timestampMs) {
+        super.setUidState(stats, uid, stateId, state, timestampMs);
+        if (stateId == STATE_PROCESS_STATE && mUidStartTimestamps.indexOfKey(uid) < 0) {
+            mUidStartTimestamps.put(uid, timestampMs);
+        }
+    }
+
+    @Override
+    void finish(PowerComponentAggregatedPowerStats stats, long timestampMs) {
+        if (mPlan == null) {
+            mPlan = new PowerEstimationPlan(stats.getConfig());
+        }
+
+        PowerStats powerStats = new PowerStats(mPowerStatsDescriptor);
+        sStatsLayout.setUsageDuration(powerStats.stats, timestampMs - mStartTimestamp);
+
+        sStatsLayout.addBatteryDischargePercent(powerStats.stats, mCumulativeDischargePct);
+        if (mCumulativeDischargeUah != 0) {
+            sStatsLayout.addBatteryDischargeUah(powerStats.stats,
+                    mCumulativeDischargeUah);
+        } else {
+            sStatsLayout.addBatteryDischargeUah(powerStats.stats,
+                    (long) (mCumulativeDischargePct * mBatteryCapacityUah / 100.0));
+        }
+        sStatsLayout.addBatteryDischargeDuration(powerStats.stats, mCumulativeDischargeDurationMs);
+        mCumulativeDischargePct = 0;
+        mCumulativeDischargeUah = 0;
+        mCumulativeDischargeDurationMs = 0;
+
+        List<Integer> uids = new ArrayList<>();
+        stats.collectUids(uids);
+
+        if (!uids.isEmpty()) {
+            for (int i = uids.size() - 1; i >= 0; i--) {
+                Integer uid = uids.get(i);
+                long durationMs = timestampMs - mUidStartTimestamps.get(uid, mStartTimestamp);
+                mUidStartTimestamps.put(uid, timestampMs);
+
+                long[] uidStats = new long[sStatsLayout.getUidStatsArrayLength()];
+                sStatsLayout.setUidUsageDuration(uidStats, durationMs);
+                powerStats.uidStats.put(uid, uidStats);
+            }
+        }
+
+        stats.addPowerStats(powerStats, timestampMs);
+
+        for (int i = mPlan.uidStateEstimates.size() - 1; i >= 0; i--) {
+            UidStateEstimate uidStateEstimate = mPlan.uidStateEstimates.get(i);
+            int[] uidStateValues = new int[stats.getConfig().getUidStateConfig().length];
+            uidStateValues[STATE_PROCESS_STATE] = PROCESS_STATE_UNSPECIFIED;
+
+            for (int j = uids.size() - 1; j >= 0; j--) {
+                int uid = uids.get(j);
+                int[] stateValues = uidStateEstimate.combinedDeviceStateEstimate.stateValues;
+                uidStateValues[STATE_SCREEN] = stateValues[STATE_SCREEN];
+                uidStateValues[STATE_POWER] = stateValues[STATE_POWER];
+                // Erase usage duration for UNSPECIFIED proc state - the app was not running
+                if (stats.getUidStats(mTmpUidStatsArray, uid, uidStateValues)) {
+                    if (sStatsLayout.getUidUsageDuration(mTmpUidStatsArray) != 0) {
+                        sStatsLayout.setUidUsageDuration(mTmpUidStatsArray, 0);
+                        stats.setUidStats(uid, uidStateValues, mTmpUidStatsArray);
+                    }
+                }
+            }
+        }
+
+        mStartTimestamp = timestampMs;
+    }
+}
diff --git a/services/core/java/com/android/server/power/stats/processor/CpuPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/CpuPowerStatsProcessor.java
index 5f7a3da..17ceca6 100644
--- a/services/core/java/com/android/server/power/stats/processor/CpuPowerStatsProcessor.java
+++ b/services/core/java/com/android/server/power/stats/processor/CpuPowerStatsProcessor.java
@@ -16,6 +16,8 @@
 
 package com.android.server.power.stats.processor;
 
+import android.annotation.Nullable;
+import android.os.BatteryConsumer;
 import android.util.ArraySet;
 import android.util.Log;
 
@@ -23,6 +25,7 @@
 import com.android.internal.os.PowerProfile;
 import com.android.internal.os.PowerStats;
 import com.android.server.power.stats.format.CpuPowerStatsLayout;
+import com.android.server.power.stats.format.WakelockPowerStatsLayout;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -73,6 +76,11 @@
     // Temp array for retrieval of UID power stats, to avoid repeated allocations
     private long[] mTmpUidStatsArray;
 
+    private PowerStats.Descriptor mWakelockDescriptor;
+    private WakelockPowerStatsLayout mWakelockPowerStatsLayout;
+    private long[] mTmpWakelockDeviceStats;
+    private long[] mTmpWakelockUidStats;
+
     CpuPowerStatsProcessor(PowerProfile powerProfile, CpuScalingPolicies scalingPolicies) {
         mCpuScalingPolicies = scalingPolicies;
         mCpuScalingStepCount = scalingPolicies.getScalingStepCount();
@@ -109,6 +117,8 @@
 
         mTmpDeviceStatsArray = new long[descriptor.statsArrayLength];
         mTmpUidStatsArray = new long[descriptor.uidStatsArrayLength];
+
+        mWakelockDescriptor = null;
     }
 
     /**
@@ -174,7 +184,9 @@
         }
 
         estimatePowerByScalingStep(intermediates);
-        estimatePowerByDeviceState(stats, intermediates);
+
+        PowerComponentAggregatedPowerStats wakelockStats = getWakelockStats(stats);
+        estimatePowerByDeviceState(stats, intermediates, wakelockStats);
         combineDeviceStateEstimates();
 
         ArrayList<Integer> uids = new ArrayList<>();
@@ -182,13 +194,45 @@
         if (!uids.isEmpty()) {
             for (int uid : uids) {
                 for (int i = 0; i < mPlan.uidStateEstimates.size(); i++) {
-                    estimateUidPowerConsumption(stats, uid, mPlan.uidStateEstimates.get(i));
+                    estimateUidPowerConsumption(stats, uid, mPlan.uidStateEstimates.get(i),
+                            wakelockStats);
                 }
             }
         }
         mPlan.resetIntermediates();
     }
 
+    @Nullable
+    private PowerComponentAggregatedPowerStats getWakelockStats(
+            PowerComponentAggregatedPowerStats stats) {
+        // Wakelock power estimates are only relevant when the CPU power estimates are derived from
+        // EnergyConsumers.
+        if (mStatsLayout.getEnergyConsumerCount() == 0) {
+            return null;
+        }
+
+        PowerComponentAggregatedPowerStats wakelockStats =
+                stats.getAggregatedPowerStats().getPowerComponentStats(
+                        BatteryConsumer.POWER_COMPONENT_WAKELOCK);
+        if (wakelockStats == null) {
+            return null;
+        }
+
+        PowerStats.Descriptor descriptor = wakelockStats.getPowerStatsDescriptor();
+        if (descriptor == null) {
+            return null;
+        }
+
+        if (mWakelockDescriptor == null || !mWakelockDescriptor.equals(descriptor)) {
+            mWakelockDescriptor = descriptor;
+            mWakelockPowerStatsLayout = new WakelockPowerStatsLayout(mWakelockDescriptor);
+            mTmpWakelockDeviceStats = new long[mWakelockDescriptor.statsArrayLength];
+            mTmpWakelockUidStats = new long[mWakelockDescriptor.uidStatsArrayLength];
+        }
+
+        return wakelockStats;
+    }
+
     /*
      * Populate data structures (two maps) needed to use power rail data, aka energy consumers,
      * to attribute power usage to apps.
@@ -345,7 +389,8 @@
     }
 
     private void estimatePowerByDeviceState(PowerComponentAggregatedPowerStats stats,
-            Intermediates intermediates) {
+            Intermediates intermediates,
+            @Nullable PowerComponentAggregatedPowerStats wakelockStats) {
         int cpuScalingStepCount = mStatsLayout.getCpuScalingStepCount();
         int powerBracketCount = mStatsLayout.getCpuPowerBracketCount();
         int[] scalingStepToBracketMap = mStatsLayout.getScalingStepToPowerBracketMap();
@@ -382,6 +427,15 @@
             for (int i = deviceStatsIntermediates.powerByBracket.length - 1; i >= 0; i--) {
                 power += deviceStatsIntermediates.powerByBracket[i];
             }
+
+            if (wakelockStats != null) {
+                wakelockStats.getDeviceStats(mTmpWakelockDeviceStats,
+                        deviceStateEstimation.stateValues);
+                double wakelockPowerEstimate = mWakelockPowerStatsLayout.getDevicePowerEstimate(
+                        mTmpWakelockDeviceStats);
+                power = Math.max(0, power - wakelockPowerEstimate);
+            }
+
             deviceStatsIntermediates.power = power;
             mStatsLayout.setDevicePowerEstimate(mTmpDeviceStatsArray, power);
             stats.setDeviceStats(deviceStateEstimation.stateValues, mTmpDeviceStatsArray);
@@ -454,7 +508,8 @@
     }
 
     private void estimateUidPowerConsumption(PowerComponentAggregatedPowerStats stats, int uid,
-            UidStateEstimate uidStateEstimate) {
+            UidStateEstimate uidStateEstimate,
+            @Nullable PowerComponentAggregatedPowerStats wakelockStats) {
         CombinedDeviceStateEstimate combinedDeviceStateEstimate =
                 uidStateEstimate.combinedDeviceStateEstimate;
         DeviceStatsIntermediates cdsIntermediates =
@@ -482,6 +537,14 @@
                             / cdsIntermediates.timeByBracket[bracket];
             }
 
+            if (wakelockStats != null) {
+                wakelockStats.getUidStats(mTmpWakelockUidStats, uid,
+                        proportionalEstimate.stateValues);
+                double wakelockPowerEstimate = mWakelockPowerStatsLayout.getUidPowerEstimate(
+                        mTmpWakelockUidStats);
+                power = Math.max(0, power - wakelockPowerEstimate);
+            }
+
             mStatsLayout.setUidPowerEstimate(mTmpUidStatsArray, power);
             stats.setUidStats(uid, proportionalEstimate.stateValues, mTmpUidStatsArray);
         }
diff --git a/services/core/java/com/android/server/power/stats/processor/MultiStatePowerAttributor.java b/services/core/java/com/android/server/power/stats/processor/MultiStatePowerAttributor.java
index 2ba4a52..25d50f7 100644
--- a/services/core/java/com/android/server/power/stats/processor/MultiStatePowerAttributor.java
+++ b/services/core/java/com/android/server/power/stats/processor/MultiStatePowerAttributor.java
@@ -35,6 +35,7 @@
 import com.android.server.power.stats.PowerStatsUidResolver;
 
 import java.util.List;
+import java.util.function.DoubleSupplier;
 
 public class MultiStatePowerAttributor implements PowerAttributor {
     private static final String TAG = "MultiStatePowerAttributor";
@@ -48,10 +49,11 @@
     // attribution isolates UIDs are supposed to be long forgotten.
     public MultiStatePowerAttributor(Context context, PowerStatsStore powerStatsStore,
             @NonNull PowerProfile powerProfile, @NonNull CpuScalingPolicies cpuScalingPolicies,
+            @NonNull DoubleSupplier batteryCapacitySupplier,
             @NonNull PowerStatsUidResolver powerStatsUidResolver) {
         this(powerStatsStore, new PowerStatsAggregator(
                 createAggregatedPowerStatsConfig(context, powerProfile, cpuScalingPolicies,
-                        powerStatsUidResolver)));
+                        batteryCapacitySupplier, powerStatsUidResolver)));
     }
 
     @VisibleForTesting
@@ -62,13 +64,14 @@
         mPowerStatsStore.addSectionReader(
                 new AggregatedPowerStatsSection.Reader(mPowerStatsAggregator.getConfig()));
         mPowerStatsExporter = new PowerStatsExporter(mPowerStatsStore, mPowerStatsAggregator);
+        setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_BASE, true);
     }
 
     private static AggregatedPowerStatsConfig createAggregatedPowerStatsConfig(Context context,
             PowerProfile powerProfile, CpuScalingPolicies cpuScalingPolicies,
-            PowerStatsUidResolver powerStatsUidResolver) {
+            DoubleSupplier batteryCapacitySupplier, PowerStatsUidResolver powerStatsUidResolver) {
         AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig();
-        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_CPU)
+        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_BASE)
                 .trackDeviceStates(
                         AggregatedPowerStatsConfig.STATE_POWER,
                         AggregatedPowerStatsConfig.STATE_SCREEN)
@@ -76,6 +79,21 @@
                         AggregatedPowerStatsConfig.STATE_POWER,
                         AggregatedPowerStatsConfig.STATE_SCREEN,
                         AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
+                .setProcessorSupplier(() -> new BasePowerStatsProcessor(batteryCapacitySupplier));
+
+        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_WAKELOCK)
+                .trackDeviceStates(
+                        AggregatedPowerStatsConfig.STATE_POWER,
+                        AggregatedPowerStatsConfig.STATE_SCREEN)
+                .trackUidStates(
+                        AggregatedPowerStatsConfig.STATE_POWER,
+                        AggregatedPowerStatsConfig.STATE_SCREEN,
+                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
+                .setProcessorSupplier(
+                        () -> new WakelockPowerStatsProcessor(powerProfile));
+
+        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_CPU,
+                        BatteryConsumer.POWER_COMPONENT_WAKELOCK)
                 .setProcessorSupplier(
                         () -> new CpuPowerStatsProcessor(powerProfile, cpuScalingPolicies));
 
diff --git a/services/core/java/com/android/server/power/stats/processor/PowerComponentAggregatedPowerStats.java b/services/core/java/com/android/server/power/stats/processor/PowerComponentAggregatedPowerStats.java
index d04c5ba..d4f8fd9 100644
--- a/services/core/java/com/android/server/power/stats/processor/PowerComponentAggregatedPowerStats.java
+++ b/services/core/java/com/android/server/power/stats/processor/PowerComponentAggregatedPowerStats.java
@@ -125,6 +125,10 @@
         mProcessor.noteStateChange(this, item);
     }
 
+    public void noteBatteryLevel(int batteryLevel, int batteryChargeUah, long timestampMs) {
+        mProcessor.noteBatteryLevel(batteryLevel, batteryChargeUah, timestampMs);
+    }
+
     void setState(@AggregatedPowerStatsConfig.TrackedState int stateId, int state,
             long timestampMs) {
         if (mDeviceStats == null) {
@@ -163,6 +167,11 @@
 
     void setUidState(int uid, @AggregatedPowerStatsConfig.TrackedState int stateId, int state,
             long timestampMs) {
+        mProcessor.setUidState(this, uid, stateId, state, timestampMs);
+    }
+
+    void setProcessedUidState(int uid, @AggregatedPowerStatsConfig.TrackedState int stateId,
+            int state, long timestampMs) {
         if (!mUidStateConfig[stateId].isTracked()) {
             return;
         }
diff --git a/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java b/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java
index 32c1056..dcdd3bd 100644
--- a/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java
+++ b/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java
@@ -53,7 +53,11 @@
         return mAggregatedPowerStatsConfig;
     }
 
-    void setPowerComponentEnabled(int powerComponentId, boolean enabled) {
+    /**
+     * Marks the power component as enabled for PowerStats aggregation
+     */
+    @VisibleForTesting
+    public void setPowerComponentEnabled(int powerComponentId, boolean enabled) {
         synchronized (this) {
             if (mStats != null) {
                 mStats = null;
@@ -81,23 +85,23 @@
                 mStats = new AggregatedPowerStats(mAggregatedPowerStatsConfig, mEnabledComponents);
             }
 
-            mStats.start(startTimeMs);
-
-            boolean clockUpdateAdded = false;
+            boolean startedSession = false;
             long baseTime = startTimeMs > 0 ? startTimeMs : UNINITIALIZED;
             long lastTime = 0;
             int lastStates = 0xFFFFFFFF;
             int lastStates2 = 0xFFFFFFFF;
+            int lastBatteryLevel = 0;
             try (BatteryStatsHistoryIterator iterator = history.iterate(startTimeMs, endTimeMs)) {
                 while (iterator.hasNext()) {
                     BatteryStats.HistoryItem item = iterator.next();
 
-                    if (!clockUpdateAdded) {
+                    if (!startedSession) {
+                        mStats.start(item.time);
                         mStats.addClockUpdate(item.time, item.currentTime);
                         if (baseTime == UNINITIALIZED) {
                             baseTime = item.time;
                         }
-                        clockUpdateAdded = true;
+                        startedSession = true;
                     } else if (item.cmd == BatteryStats.HistoryItem.CMD_CURRENT_TIME
                                || item.cmd == BatteryStats.HistoryItem.CMD_RESET) {
                         mStats.addClockUpdate(item.time, item.currentTime);
@@ -105,6 +109,12 @@
 
                     lastTime = item.time;
 
+                    if (item.batteryLevel != lastBatteryLevel) {
+                        mStats.noteBatteryLevel(item.batteryLevel, item.batteryChargeUah,
+                                item.time);
+                        lastBatteryLevel = item.batteryLevel;
+                    }
+
                     int batteryState =
                             (item.states & BatteryStats.HistoryItem.STATE_BATTERY_PLUGGED_FLAG) != 0
                                     ? AggregatedPowerStatsConfig.POWER_STATE_OTHER
diff --git a/services/core/java/com/android/server/power/stats/processor/PowerStatsExporter.java b/services/core/java/com/android/server/power/stats/processor/PowerStatsExporter.java
index fab87d6..c7ad564 100644
--- a/services/core/java/com/android/server/power/stats/processor/PowerStatsExporter.java
+++ b/services/core/java/com/android/server/power/stats/processor/PowerStatsExporter.java
@@ -28,6 +28,7 @@
 import com.android.internal.os.PowerStats;
 import com.android.server.power.stats.PowerStatsSpan;
 import com.android.server.power.stats.PowerStatsStore;
+import com.android.server.power.stats.format.BasePowerStatsLayout;
 import com.android.server.power.stats.format.PowerStatsLayout;
 
 import java.util.ArrayList;
@@ -45,6 +46,13 @@
     private final PowerStatsAggregator mPowerStatsAggregator;
     private final long mBatterySessionTimeSpanSlackMillis;
     private static final long BATTERY_SESSION_TIME_SPAN_SLACK_MILLIS = TimeUnit.MINUTES.toMillis(2);
+    private static final BasePowerStatsLayout sBasePowerStatsLayout = new BasePowerStatsLayout();
+
+    private static class BatteryLevelInfo {
+        public double batteryDischargePct;
+        public double batteryDischargeMah;
+        public long batteryDischargeDurationMs;
+    }
 
     PowerStatsExporter(PowerStatsStore powerStatsStore, PowerStatsAggregator powerStatsAggregator) {
         this(powerStatsStore, powerStatsAggregator, BATTERY_SESSION_TIME_SPAN_SLACK_MILLIS);
@@ -145,6 +153,8 @@
 
         PowerStatsLayout layout = new PowerStatsLayout(descriptor);
         long[] deviceStats = new long[descriptor.statsArrayLength];
+        BatteryLevelInfo batteryLevelInfo = new BatteryLevelInfo();
+
         for (int screenState = 0; screenState < BatteryConsumer.SCREEN_STATE_COUNT; screenState++) {
             if (batteryUsageStatsBuilder.isScreenStateDataNeeded()) {
                 if (screenState == BatteryConsumer.SCREEN_STATE_UNSPECIFIED) {
@@ -159,12 +169,12 @@
                     if (powerState != BatteryConsumer.POWER_STATE_UNSPECIFIED) {
                         populateAggregatedBatteryConsumer(batteryUsageStatsBuilder,
                                 powerComponentStats,
-                                layout, deviceStats, screenState, powerState);
+                                layout, deviceStats, batteryLevelInfo, screenState, powerState);
                     }
                 } else if (powerState == BatteryConsumer.POWER_STATE_BATTERY) {
                     populateAggregatedBatteryConsumer(batteryUsageStatsBuilder,
                             powerComponentStats,
-                            layout, deviceStats, screenState, powerState);
+                            layout, deviceStats, batteryLevelInfo, screenState, powerState);
                 }
             }
         }
@@ -172,14 +182,20 @@
             populateBatteryConsumers(batteryUsageStatsBuilder,
                     powerComponentStats, layout);
         }
+
+        populateBatteryLevelInfo(batteryUsageStatsBuilder, batteryLevelInfo);
     }
 
     private void populateAggregatedBatteryConsumer(
             BatteryUsageStats.Builder batteryUsageStatsBuilder,
             PowerComponentAggregatedPowerStats powerComponentStats, PowerStatsLayout layout,
-            long[] deviceStats, @BatteryConsumer.ScreenState int screenState,
+            long[] deviceStats, BatteryLevelInfo batteryLevelInfo,
+            @BatteryConsumer.ScreenState int screenState,
             @BatteryConsumer.PowerState int powerState) {
         int powerComponentId = powerComponentStats.powerComponentId;
+        boolean hasBatteryLevelProperties = powerComponentId == BatteryConsumer.POWER_COMPONENT_BASE
+                && powerState == BatteryConsumer.POWER_STATE_BATTERY;
+
         double[] totalPower = new double[1];
         MultiStateStats.States.forEachTrackedStateCombination(
                 powerComponentStats.getConfig().getDeviceStateConfig(),
@@ -193,6 +209,10 @@
                     }
 
                     totalPower[0] += layout.getDevicePowerEstimate(deviceStats);
+
+                    if (hasBatteryLevelProperties) {
+                        gatherBatteryLevelInfo(batteryLevelInfo, deviceStats);
+                    }
                 });
 
         AggregateBatteryConsumer.Builder deviceScope =
@@ -208,6 +228,26 @@
                 BatteryConsumer.POWER_MODEL_UNDEFINED);
     }
 
+    private void gatherBatteryLevelInfo(BatteryLevelInfo batteryLevelInfo, long[] deviceStats) {
+        batteryLevelInfo.batteryDischargePct +=
+                sBasePowerStatsLayout.getBatteryDischargePercent(deviceStats);
+        batteryLevelInfo.batteryDischargeMah +=
+                sBasePowerStatsLayout.getBatteryDischargeUah(deviceStats) / 1000.0;
+        batteryLevelInfo.batteryDischargeDurationMs +=
+                sBasePowerStatsLayout.getBatteryDischargeDuration(deviceStats);
+    }
+
+    private void populateBatteryLevelInfo(BatteryUsageStats.Builder builder,
+            BatteryLevelInfo batteryLevelInfo) {
+        builder.setDischargePercentage((int) Math.round(batteryLevelInfo.batteryDischargePct))
+                .setDischargedPowerRange(batteryLevelInfo.batteryDischargeMah,
+                        batteryLevelInfo.batteryDischargeMah)
+                .setDischargeDurationMs(batteryLevelInfo.batteryDischargeDurationMs)
+                .getAggregateBatteryConsumerBuilder(
+                        BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
+                .setConsumedPower(batteryLevelInfo.batteryDischargeMah);
+    }
+
     private void populateBatteryConsumers(
             BatteryUsageStats.Builder batteryUsageStatsBuilder,
             PowerComponentAggregatedPowerStats powerComponentStats,
@@ -216,9 +256,16 @@
         PowerStats.Descriptor descriptor = powerComponentStats.getPowerStatsDescriptor();
         long[] uidStats = new long[descriptor.uidStatsArrayLength];
 
-        boolean breakDownByProcState = batteryUsageStatsBuilder.isProcessStateDataNeeded()
-                && powerComponent
-                .getUidStateConfig()[AggregatedPowerStatsConfig.STATE_PROCESS_STATE].isTracked();
+        boolean breakDownByProcState;
+        if (powerComponent.getPowerComponentId() == BatteryConsumer.POWER_COMPONENT_BASE) {
+            breakDownByProcState = true;
+        } else if (batteryUsageStatsBuilder.isProcessStateDataNeeded()) {
+            breakDownByProcState = powerComponent
+                    .getUidStateConfig()[AggregatedPowerStatsConfig.STATE_PROCESS_STATE]
+                    .isTracked();
+        } else {
+            breakDownByProcState = false;
+        }
 
         ArrayList<Integer> uids = new ArrayList<>();
         powerComponentStats.collectUids(uids);
@@ -263,12 +310,15 @@
                 powerComponentStats.powerComponentId;
         double[] powerByProcState =
                 new double[breakDownByProcState ? BatteryConsumer.PROCESS_STATE_COUNT : 1];
+        long[] durationByProcState =
+                new long[breakDownByProcState ? BatteryConsumer.PROCESS_STATE_COUNT : 1];
         double powerAllApps = 0;
         for (int uid : uids) {
             UidBatteryConsumer.Builder builder =
                     batteryUsageStatsBuilder.getOrCreateUidBatteryConsumerBuilder(uid);
 
             Arrays.fill(powerByProcState, 0);
+            Arrays.fill(durationByProcState, 0);
 
             MultiStateStats.States.forEachTrackedStateCombination(
                     powerComponent.getUidStateConfig(),
@@ -282,6 +332,7 @@
                         }
 
                         double power = layout.getUidPowerEstimate(uidStats);
+                        long duration = layout.getUidUsageDuration(uidStats);
                         if (breakDownByProcState) {
                             int procState = states[AggregatedPowerStatsConfig.STATE_PROCESS_STATE];
                             // There is a difference in how PowerComponentAggregatedPowerStats
@@ -296,8 +347,10 @@
                                 procState = BatteryConsumer.PROCESS_STATE_BACKGROUND;
                             }
                             powerByProcState[procState] += power;
+                            durationByProcState[procState] += duration;
                         }
                         powerByProcState[BatteryConsumer.PROCESS_STATE_UNSPECIFIED] += power;
+                        durationByProcState[BatteryConsumer.PROCESS_STATE_UNSPECIFIED] += duration;
                     });
 
             int resultScreenState = batteryUsageStatsBuilder.isScreenStateDataNeeded()
@@ -306,12 +359,16 @@
                     ? powerState : BatteryConsumer.POWER_STATE_UNSPECIFIED;
             for (int procState = 0; procState < powerByProcState.length; procState++) {
                 double power = powerByProcState[procState];
-                if (power == 0) {
+                long duration = durationByProcState[procState];
+                if (power == 0 && duration == 0) {
                     continue;
                 }
                 BatteryConsumer.Key key = builder.getKey(powerComponentId, procState,
                         resultScreenState, resultPowerState);
-                builder.addConsumedPower(key, power, BatteryConsumer.POWER_MODEL_UNDEFINED);
+                if (key != null) {
+                    builder.addConsumedPower(key, power, BatteryConsumer.POWER_MODEL_UNDEFINED);
+                    builder.addUsageDurationMillis(key, duration);
+                }
             }
 
             if (resultScreenState != BatteryConsumer.SCREEN_STATE_UNSPECIFIED
diff --git a/services/core/java/com/android/server/power/stats/processor/PowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/PowerStatsProcessor.java
index 838fc62..c1a5414 100644
--- a/services/core/java/com/android/server/power/stats/processor/PowerStatsProcessor.java
+++ b/services/core/java/com/android/server/power/stats/processor/PowerStatsProcessor.java
@@ -55,6 +55,14 @@
             BatteryStats.HistoryItem item) {
     }
 
+    public void noteBatteryLevel(int batteryLevel, int batteryChargeUah, long timestampMs) {
+    }
+
+    public void setUidState(PowerComponentAggregatedPowerStats stats, int uid,
+            @AggregatedPowerStatsConfig.TrackedState int stateId, int state, long timestampMs) {
+        stats.setProcessedUidState(uid, stateId, state, timestampMs);
+    }
+
     void addPowerStats(PowerComponentAggregatedPowerStats stats, PowerStats powerStats,
             long timestampMs) {
         stats.addProcessedPowerStats(powerStats, timestampMs);
diff --git a/services/core/java/com/android/server/power/stats/processor/SensorPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/SensorPowerStatsProcessor.java
index 67013ea..0bb028b 100644
--- a/services/core/java/com/android/server/power/stats/processor/SensorPowerStatsProcessor.java
+++ b/services/core/java/com/android/server/power/stats/processor/SensorPowerStatsProcessor.java
@@ -146,7 +146,10 @@
             return;
         }
 
-        if (item.eventTag == null || item.eventTag.string == null
+        if (((item.eventCode & BatteryStats.HistoryItem.EVENT_TYPE_MASK)
+                != BatteryStats.HistoryItem.EVENT_STATE_CHANGE)
+                || item.eventTag == null
+                || item.eventTag.string == null
                 || !item.eventTag.string.startsWith(SENSOR_EVENT_TAG_PREFIX)) {
             return;
         }
diff --git a/services/core/java/com/android/server/power/stats/processor/WakelockPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/WakelockPowerStatsProcessor.java
new file mode 100644
index 0000000..0cb4991
--- /dev/null
+++ b/services/core/java/com/android/server/power/stats/processor/WakelockPowerStatsProcessor.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2024 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.power.stats.processor;
+
+import com.android.internal.os.PowerProfile;
+import com.android.internal.os.PowerStats;
+import com.android.server.power.stats.UsageBasedPowerEstimator;
+import com.android.server.power.stats.format.WakelockPowerStatsLayout;
+
+class WakelockPowerStatsProcessor extends PowerStatsProcessor {
+    private static final WakelockPowerStatsLayout sStatsLayout = new WakelockPowerStatsLayout();
+    private final UsageBasedPowerEstimator mPowerEstimator;
+
+    WakelockPowerStatsProcessor(PowerProfile powerProfile) {
+        mPowerEstimator = new UsageBasedPowerEstimator(
+                powerProfile.getAveragePower(PowerProfile.POWER_CPU_IDLE));
+    }
+
+    @Override
+    void addPowerStats(PowerComponentAggregatedPowerStats stats, PowerStats powerStats,
+            long timestampMs) {
+        long durationMs = sStatsLayout.getUsageDuration(powerStats.stats);
+        if (durationMs == 0) {
+            return;
+        }
+
+        double power = mPowerEstimator.calculatePower(durationMs);
+        sStatsLayout.setDevicePowerEstimate(powerStats.stats, power);
+
+        long totalDuration = 0;
+        for (int i = powerStats.uidStats.size() - 1; i >= 0; i--) {
+            totalDuration += sStatsLayout.getUidUsageDuration(powerStats.uidStats.valueAt(i));
+        }
+
+        if (totalDuration != 0) {
+            for (int i = powerStats.uidStats.size() - 1; i >= 0; i--) {
+                long[] uidStats = powerStats.uidStats.valueAt(i);
+                sStatsLayout.setUidPowerEstimate(uidStats,
+                        power * sStatsLayout.getUidUsageDuration(uidStats) / totalDuration);
+            }
+        }
+
+        super.addPowerStats(stats, powerStats, timestampMs);
+    }
+
+    @Override
+    void finish(PowerComponentAggregatedPowerStats stats, long timestampMs) {
+        // Nothing to do. Power attribution has already been done in `addPowerStats`
+    }
+}
diff --git a/services/core/java/com/android/server/power/stats/wakeups/CpuWakeupStats.java b/services/core/java/com/android/server/power/stats/wakeups/CpuWakeupStats.java
index f047f56..ab630ee 100644
--- a/services/core/java/com/android/server/power/stats/wakeups/CpuWakeupStats.java
+++ b/services/core/java/com/android/server/power/stats/wakeups/CpuWakeupStats.java
@@ -17,6 +17,7 @@
 package com.android.server.power.stats.wakeups;
 
 import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_ALARM;
+import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_BLUETOOTH;
 import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_CELLULAR_DATA;
 import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_SENSOR;
 import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_SOUND_TRIGGER;
@@ -63,6 +64,7 @@
     private static final String SUBSYSTEM_SOUND_TRIGGER_STRING = "Sound_trigger";
     private static final String SUBSYSTEM_SENSOR_STRING = "Sensor";
     private static final String SUBSYSTEM_CELLULAR_DATA_STRING = "Cellular_data";
+    private static final String SUBSYSTEM_BLUETOOTH_STRING = "Bluetooth";
     private static final String TRACE_TRACK_WAKEUP_ATTRIBUTION = "wakeup_attribution";
 
     private static final long WAKEUP_WRITE_DELAY_MS = TimeUnit.SECONDS.toMillis(30);
@@ -512,6 +514,8 @@
                 return CPU_WAKEUP_SUBSYSTEM_SENSOR;
             case SUBSYSTEM_CELLULAR_DATA_STRING:
                 return CPU_WAKEUP_SUBSYSTEM_CELLULAR_DATA;
+            case SUBSYSTEM_BLUETOOTH_STRING:
+                return CPU_WAKEUP_SUBSYSTEM_BLUETOOTH;
         }
         return CPU_WAKEUP_SUBSYSTEM_UNKNOWN;
     }
@@ -528,6 +532,8 @@
                 return SUBSYSTEM_SENSOR_STRING;
             case CPU_WAKEUP_SUBSYSTEM_CELLULAR_DATA:
                 return SUBSYSTEM_CELLULAR_DATA_STRING;
+            case CPU_WAKEUP_SUBSYSTEM_BLUETOOTH:
+                return SUBSYSTEM_BLUETOOTH_STRING;
             case CPU_WAKEUP_SUBSYSTEM_UNKNOWN:
                 return "Unknown";
         }
diff --git a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
index f78c448..d206c66 100644
--- a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
+++ b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
@@ -99,6 +99,7 @@
     // True if needing to roll back only rebootless apexes when native crash happens
     private boolean mTwoPhaseRollbackEnabled;
 
+    /** @hide */
     @VisibleForTesting
     public RollbackPackageHealthObserver(Context context, ApexManager apexManager) {
         mContext = context;
@@ -123,7 +124,7 @@
         }
     }
 
-    RollbackPackageHealthObserver(Context context) {
+    public RollbackPackageHealthObserver(@NonNull Context context) {
         this(context, ApexManager.getInstance());
     }
 
@@ -239,8 +240,8 @@
         return false;
     }
 
-
     @Override
+    @NonNull
     public String getUniqueIdentifier() {
         return NAME;
     }
@@ -251,7 +252,7 @@
     }
 
     @Override
-    public boolean mayObservePackage(String packageName) {
+    public boolean mayObservePackage(@NonNull String packageName) {
         if (getAvailableRollbacks().isEmpty()) {
             return false;
         }
@@ -281,12 +282,14 @@
      * This may cause {@code packages} to be rolled back if they crash too freqeuntly.
      */
     @AnyThread
-    void startObservingHealth(List<String> packages, long durationMs) {
+    @NonNull
+    public void startObservingHealth(@NonNull List<String> packages, @NonNull long durationMs) {
         PackageWatchdog.getInstance(mContext).startObservingHealth(this, packages, durationMs);
     }
 
     @AnyThread
-    void notifyRollbackAvailable(RollbackInfo rollback) {
+    @NonNull
+    public void notifyRollbackAvailable(@NonNull RollbackInfo rollback) {
         mHandler.post(() -> {
             // Enable two-phase rollback when a rebootless apex rollback is made available.
             // We assume the rebootless apex is stable and is less likely to be the cause
@@ -314,7 +317,7 @@
      * to check for native crashes and mitigate them if needed.
      */
     @AnyThread
-    void onBootCompletedAsync() {
+    public void onBootCompletedAsync() {
         mHandler.post(()->onBootCompleted());
     }
 
diff --git a/services/core/java/com/android/server/rollback/WatchdogRollbackLogger.java b/services/core/java/com/android/server/rollback/WatchdogRollbackLogger.java
index 79560ce..9cfed02 100644
--- a/services/core/java/com/android/server/rollback/WatchdogRollbackLogger.java
+++ b/services/core/java/com/android/server/rollback/WatchdogRollbackLogger.java
@@ -51,6 +51,7 @@
 
 /**
  * This class handles the logic for logging Watchdog-triggered rollback events.
+ * @hide
  */
 public final class WatchdogRollbackLogger {
     private static final String TAG = "WatchdogRollbackLogger";
diff --git a/services/core/java/com/android/server/security/AttestationVerificationManagerService.java b/services/core/java/com/android/server/security/AttestationVerificationManagerService.java
index 55f85ea2..22a359b 100644
--- a/services/core/java/com/android/server/security/AttestationVerificationManagerService.java
+++ b/services/core/java/com/android/server/security/AttestationVerificationManagerService.java
@@ -17,10 +17,10 @@
 package com.android.server.security;
 
 import static android.Manifest.permission.USE_ATTESTATION_VERIFICATION_SERVICE;
+import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_CERTS;
+import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_UNSUPPORTED_PROFILE;
 import static android.security.attestationverification.AttestationVerificationManager.PROFILE_PEER_DEVICE;
 import static android.security.attestationverification.AttestationVerificationManager.PROFILE_SELF_TRUSTED;
-import static android.security.attestationverification.AttestationVerificationManager.RESULT_FAILURE;
-import static android.security.attestationverification.AttestationVerificationManager.RESULT_UNKNOWN;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -88,8 +88,8 @@
         public void verifyToken(VerificationToken token, ParcelDuration parcelDuration,
                 AndroidFuture resultCallback) throws RemoteException {
             enforceUsePermission();
-            // TODO(b/201696614): Implement
-            resultCallback.complete(RESULT_UNKNOWN);
+
+            throw new UnsupportedOperationException();
         }
 
         private void enforceUsePermission() {
@@ -123,9 +123,9 @@
             AttestationProfile profile, int localBindingType, Bundle requirements,
             byte[] attestation, AndroidFuture<IVerificationResult> resultCallback) {
         IVerificationResult result = new IVerificationResult();
-        // TODO(b/201696614): Implement
         result.token = null;
-        switch (profile.getAttestationProfileId()) {
+        int profileId = profile.getAttestationProfileId();
+        switch (profileId) {
             case PROFILE_SELF_TRUSTED:
                 Slog.d(TAG, "Verifying Self Trusted profile.");
                 try {
@@ -133,7 +133,7 @@
                             AttestationVerificationSelfTrustedVerifierForTesting.getInstance()
                                     .verifyAttestation(localBindingType, requirements, attestation);
                 } catch (Throwable t) {
-                    result.resultCode = RESULT_FAILURE;
+                    result.resultCode = FLAG_FAILURE_CERTS;
                 }
                 break;
             case PROFILE_PEER_DEVICE:
@@ -142,8 +142,8 @@
                         localBindingType, requirements, attestation);
                 break;
             default:
-                Slog.d(TAG, "No profile found, defaulting.");
-                result.resultCode = RESULT_UNKNOWN;
+                Slog.e(TAG, "Profile [" + profileId + "] is not supported.");
+                result.resultCode = FLAG_FAILURE_UNSUPPORTED_PROFILE;
         }
         resultCallback.complete(result);
     }
diff --git a/services/core/java/com/android/server/security/AttestationVerificationPeerDeviceVerifier.java b/services/core/java/com/android/server/security/AttestationVerificationPeerDeviceVerifier.java
index 41e3d00..dc1f936 100644
--- a/services/core/java/com/android/server/security/AttestationVerificationPeerDeviceVerifier.java
+++ b/services/core/java/com/android/server/security/AttestationVerificationPeerDeviceVerifier.java
@@ -16,11 +16,15 @@
 
 package com.android.server.security;
 
+import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_BOOT_STATE;
+import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_KEYSTORE_REQUIREMENTS;
+import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_CERTS;
+import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS;
+import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_PATCH_LEVEL_DIFF;
+import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_UNKNOWN;
 import static android.security.attestationverification.AttestationVerificationManager.PARAM_CHALLENGE;
 import static android.security.attestationverification.AttestationVerificationManager.PARAM_MAX_PATCH_LEVEL_DIFF_MONTHS;
 import static android.security.attestationverification.AttestationVerificationManager.PARAM_PUBLIC_KEY;
-import static android.security.attestationverification.AttestationVerificationManager.RESULT_FAILURE;
-import static android.security.attestationverification.AttestationVerificationManager.RESULT_SUCCESS;
 import static android.security.attestationverification.AttestationVerificationManager.TYPE_CHALLENGE;
 import static android.security.attestationverification.AttestationVerificationManager.TYPE_PUBLIC_KEY;
 import static android.security.attestationverification.AttestationVerificationManager.localBindingTypeToString;
@@ -35,10 +39,8 @@
 import android.content.Context;
 import android.os.Build;
 import android.os.Bundle;
-import android.security.attestationverification.AttestationVerificationManager;
 import android.security.attestationverification.AttestationVerificationManager.LocalBindingType;
 import android.util.IndentingPrintWriter;
-import android.util.Log;
 import android.util.Slog;
 
 import com.android.internal.R;
@@ -100,7 +102,6 @@
  */
 class AttestationVerificationPeerDeviceVerifier {
     private static final String TAG = "AVF";
-    private static final boolean DEBUG = Build.IS_DEBUGGABLE && Log.isLoggable(TAG, Log.VERBOSE);
     private static final int MAX_PATCH_AGE_MONTHS = 12;
 
     /**
@@ -188,32 +189,24 @@
             @NonNull byte[] attestation,
             @NonNull MyDumpData dumpData) {
         if (mCertificateFactory == null) {
-            debugVerboseLog("Unable to access CertificateFactory");
-            return RESULT_FAILURE;
+            Slog.e(TAG, "Unable to access CertificateFactory");
+            return FLAG_FAILURE_CERTS;
         }
         dumpData.mCertificationFactoryAvailable = true;
 
         if (mCertPathValidator == null) {
-            debugVerboseLog("Unable to access CertPathValidator");
-            return RESULT_FAILURE;
+            Slog.e(TAG, "Unable to access CertPathValidator");
+            return FLAG_FAILURE_CERTS;
         }
         dumpData.mCertPathValidatorAvailable = true;
 
-
-        // Check if the provided local binding type is supported and if the provided requirements
-        // "match" the binding type.
-        if (!validateAttestationParameters(localBindingType, requirements)) {
-            return RESULT_FAILURE;
-        }
-        dumpData.mAttestationParametersOk = true;
-
         // To provide the most information in the dump logs, we track the failure state but keep
         // verifying the rest of the attestation. For code safety, there are no transitions past
-        // here to set failed = false
-        boolean failed = false;
+        // here to set result = 0.
+        int result = 0;
 
         try {
-            // First: parse and validate the certificate chain.
+            // 1. parse and validate the certificate chain.
             final List<X509Certificate> certificateChain = getCertificates(attestation);
             // (returns void, but throws CertificateException and other similar Exceptions)
             validateCertificateChain(certificateChain);
@@ -222,33 +215,38 @@
             final var leafCertificate = certificateChain.get(0);
             final var attestationExtension = fromCertificate(leafCertificate);
 
-            // Second: verify if the attestation satisfies the "peer device" profile.
-            if (!checkAttestationForPeerDeviceProfile(requirements, attestationExtension,
-                    dumpData)) {
-                failed = true;
+            // 2. Check if the provided local binding type is supported and if the provided
+            // requirements "match" the binding type.
+            if (!validateAttestationParameters(localBindingType, requirements)) {
+                return FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS;
             }
+            dumpData.mAttestationParametersOk = true;
 
-            // Third: check if the attestation satisfies local binding requirements.
+            // 3. check if the attestation satisfies local binding requirements.
             if (!checkLocalBindingRequirements(
                     leafCertificate, attestationExtension, localBindingType, requirements,
                     dumpData)) {
-                failed = true;
+                result |= FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS;
             }
+
+            // 4. verify if the attestation satisfies the "peer device" profile.
+            result |= checkAttestationForPeerDeviceProfile(requirements, attestationExtension,
+                    dumpData);
         } catch (CertificateException | CertPathValidatorException
                  | InvalidAlgorithmParameterException | IOException e) {
-            // Catch all non-RuntimeExpceptions (all of these are thrown by either getCertificates()
+            // Catch all non-RuntimeExceptions (all of these are thrown by either getCertificates()
             // or validateCertificateChain() or
             // AndroidKeystoreAttestationVerificationAttributes.fromCertificate())
-            debugVerboseLog("Unable to parse/validate Android Attestation certificate(s)", e);
-            failed = true;
+            Slog.e(TAG, "Unable to parse/validate Android Attestation certificate(s)", e);
+            result = FLAG_FAILURE_CERTS;
         } catch (RuntimeException e) {
-            // Catch everyting else (RuntimeExpcetions), since we don't want to throw any exceptions
-            // out of this class/method.
-            debugVerboseLog("Unexpected error", e);
-            failed = true;
+            // Catch everything else (RuntimeExceptions), since we don't want to throw any
+            // exceptions out of this class/method.
+            Slog.e(TAG, "Unexpected error", e);
+            result = FLAG_FAILURE_UNKNOWN;
         }
 
-        return failed ? RESULT_FAILURE : RESULT_SUCCESS;
+        return result;
     }
 
     @NonNull
@@ -270,22 +268,22 @@
     private boolean validateAttestationParameters(
             @LocalBindingType int localBindingType, @NonNull Bundle requirements) {
         if (localBindingType != TYPE_PUBLIC_KEY && localBindingType != TYPE_CHALLENGE) {
-            debugVerboseLog("Binding type is not supported: " + localBindingType);
+            Slog.e(TAG, "Binding type is not supported: " + localBindingType);
             return false;
         }
 
         if (requirements.size() < 1) {
-            debugVerboseLog("At least 1 requirement is required.");
+            Slog.e(TAG, "At least 1 requirement is required.");
             return false;
         }
 
         if (localBindingType == TYPE_PUBLIC_KEY && !requirements.containsKey(PARAM_PUBLIC_KEY)) {
-            debugVerboseLog("Requirements does not contain key: " + PARAM_PUBLIC_KEY);
+            Slog.e(TAG, "Requirements does not contain key: " + PARAM_PUBLIC_KEY);
             return false;
         }
 
         if (localBindingType == TYPE_CHALLENGE && !requirements.containsKey(PARAM_CHALLENGE)) {
-            debugVerboseLog("Requirements does not contain key: " + PARAM_CHALLENGE);
+            Slog.e(TAG, "Requirements does not contain key: " + PARAM_CHALLENGE);
             return false;
         }
 
@@ -296,7 +294,7 @@
             throws CertificateException, CertPathValidatorException,
             InvalidAlgorithmParameterException {
         if (certificates.size() < 2) {
-            debugVerboseLog("Certificate chain less than 2 in size.");
+            Slog.e(TAG, "Certificate chain less than 2 in size.");
             throw new CertificateException("Certificate chain less than 2 in size.");
         }
 
@@ -355,7 +353,7 @@
                 final boolean publicKeyMatches = checkPublicKey(
                         leafCertificate, requirements.getByteArray(PARAM_PUBLIC_KEY));
                 if (!publicKeyMatches) {
-                    debugVerboseLog(
+                    Slog.e(TAG,
                             "Provided public key does not match leaf certificate public key.");
                     return false;
                 }
@@ -366,7 +364,7 @@
                 final boolean attestationChallengeMatches = checkAttestationChallenge(
                         attestationAttributes, requirements.getByteArray(PARAM_CHALLENGE));
                 if (!attestationChallengeMatches) {
-                    debugVerboseLog(
+                    Slog.e(TAG,
                             "Provided challenge does not match leaf certificate challenge.");
                     return false;
                 }
@@ -386,7 +384,7 @@
                 final boolean ownedBySystem = checkOwnedBySystem(
                         leafCertificate, attestationAttributes);
                 if (!ownedBySystem) {
-                    debugVerboseLog("Certificate public key is not owned by the AndroidSystem.");
+                    Slog.e(TAG, "Certificate public key is not owned by the AndroidSystem.");
                     return false;
                 }
                 dumpData.mSystemOwned = true;
@@ -401,67 +399,67 @@
         return true;
     }
 
-    private boolean checkAttestationForPeerDeviceProfile(
+    private int checkAttestationForPeerDeviceProfile(
             @NonNull Bundle requirements,
             @NonNull AndroidKeystoreAttestationVerificationAttributes attestationAttributes,
             MyDumpData dumpData) {
-        boolean result = true;
+        int result = 0;
 
         // Checks for support of Keymaster 4.
         if (attestationAttributes.getAttestationVersion() < 3) {
-            debugVerboseLog("Attestation version is not at least 3 (Keymaster 4).");
-            result = false;
+            Slog.e(TAG, "Attestation version is not at least 3 (Keymaster 4).");
+            result |= FLAG_FAILURE_KEYSTORE_REQUIREMENTS;
         } else {
             dumpData.mAttestationVersionAtLeast3 = true;
         }
 
         // Checks for support of Keymaster 4.
         if (attestationAttributes.getKeymasterVersion() < 4) {
-            debugVerboseLog("Keymaster version is not at least 4.");
-            result = false;
+            Slog.e(TAG, "Keymaster version is not at least 4.");
+            result |= FLAG_FAILURE_KEYSTORE_REQUIREMENTS;
         } else {
             dumpData.mKeymasterVersionAtLeast4 = true;
         }
 
         // First two characters are Android OS version.
         if (attestationAttributes.getKeyOsVersion() < 100000) {
-            debugVerboseLog("Android OS version is not 10+.");
-            result = false;
+            Slog.e(TAG, "Android OS version is not 10+.");
+            result |= FLAG_FAILURE_KEYSTORE_REQUIREMENTS;
         } else {
             dumpData.mOsVersionAtLeast10 = true;
         }
 
         if (!attestationAttributes.isAttestationHardwareBacked()) {
-            debugVerboseLog("Key is not HW backed.");
-            result = false;
+            Slog.e(TAG, "Key is not HW backed.");
+            result |= FLAG_FAILURE_KEYSTORE_REQUIREMENTS;
         } else {
             dumpData.mKeyHwBacked = true;
         }
 
         if (!attestationAttributes.isKeymasterHardwareBacked()) {
-            debugVerboseLog("Keymaster is not HW backed.");
-            result = false;
+            Slog.e(TAG, "Keymaster is not HW backed.");
+            result |= FLAG_FAILURE_KEYSTORE_REQUIREMENTS;
         } else {
             dumpData.mKeymasterHwBacked = true;
         }
 
         if (attestationAttributes.getVerifiedBootState() != VERIFIED) {
-            debugVerboseLog("Boot state not Verified.");
-            result = false;
+            Slog.e(TAG, "Boot state not Verified.");
+            result |= FLAG_FAILURE_BOOT_STATE;
         } else {
             dumpData.mBootStateIsVerified = true;
         }
 
         try {
             if (!attestationAttributes.isVerifiedBootLocked()) {
-                debugVerboseLog("Verified boot state is not locked.");
-                result = false;
+                Slog.e(TAG, "Verified boot state is not locked.");
+                result |= FLAG_FAILURE_BOOT_STATE;
             } else {
                 dumpData.mVerifiedBootStateLocked = true;
             }
         } catch (IllegalStateException e) {
-            debugVerboseLog("VerifiedBootLocked is not set.", e);
-            result = false;
+            Slog.e(TAG, "VerifiedBootLocked is not set.", e);
+            result = FLAG_FAILURE_BOOT_STATE;
         }
 
         int maxPatchLevelDiffMonths = requirements.getInt(PARAM_MAX_PATCH_LEVEL_DIFF_MONTHS,
@@ -470,8 +468,8 @@
         // Patch level integer YYYYMM is expected to be within maxPatchLevelDiffMonths of today.
         if (!isValidPatchLevel(attestationAttributes.getKeyOsPatchLevel(),
                 maxPatchLevelDiffMonths)) {
-            debugVerboseLog("OS patch level is not within valid range.");
-            result = false;
+            Slog.e(TAG, "OS patch level is not within valid range.");
+            result |= FLAG_FAILURE_PATCH_LEVEL_DIFF;
         } else {
             dumpData.mOsPatchLevelInRange = true;
         }
@@ -479,24 +477,24 @@
         // Patch level integer YYYYMMDD is expected to be within maxPatchLevelDiffMonths of today.
         if (!isValidPatchLevel(attestationAttributes.getKeyBootPatchLevel(),
                 maxPatchLevelDiffMonths)) {
-            debugVerboseLog("Boot patch level is not within valid range.");
-            result = false;
+            Slog.e(TAG, "Boot patch level is not within valid range.");
+            result |= FLAG_FAILURE_PATCH_LEVEL_DIFF;
         } else {
             dumpData.mKeyBootPatchLevelInRange = true;
         }
 
         if (!isValidPatchLevel(attestationAttributes.getKeyVendorPatchLevel(),
                 maxPatchLevelDiffMonths)) {
-            debugVerboseLog("Vendor patch level is not within valid range.");
-            result = false;
+            Slog.e(TAG, "Vendor patch level is not within valid range.");
+            result |= FLAG_FAILURE_PATCH_LEVEL_DIFF;
         } else {
             dumpData.mKeyVendorPatchLevelInRange = true;
         }
 
         if (!isValidPatchLevel(attestationAttributes.getKeyBootPatchLevel(),
                 maxPatchLevelDiffMonths)) {
-            debugVerboseLog("Boot patch level is not within valid range.");
-            result = false;
+            Slog.e(TAG, "Boot patch level is not within valid range.");
+            result |= FLAG_FAILURE_PATCH_LEVEL_DIFF;
         } else {
             dumpData.mKeyBootPatchLevelInRange = true;
         }
@@ -522,7 +520,7 @@
         final Set<String> ownerPackages =
                 attestationAttributes.getApplicationPackageNameVersion().keySet();
         if (!ANDROID_SYSTEM_PACKAGE_NAME_SET.equals(ownerPackages)) {
-            debugVerboseLog("Owner is not system, packages=" + ownerPackages);
+            Slog.e(TAG, "Owner is not system, packages=" + ownerPackages);
             return false;
         }
 
@@ -548,7 +546,7 @@
                 localPatchDate = LocalDate.parse(Build.VERSION.SECURITY_PATCH);
             }
         } catch (Throwable t) {
-            debugVerboseLog("Build.VERSION.SECURITY_PATCH: "
+            Slog.e(TAG, "Build.VERSION.SECURITY_PATCH: "
                     + Build.VERSION.SECURITY_PATCH + " is not in format YYYY-MM-DD");
             return false;
         }
@@ -563,7 +561,7 @@
         // Convert remote patch dates to LocalDate.
         String remoteDeviceDateStr = String.valueOf(patchLevel);
         if (remoteDeviceDateStr.length() != 6 && remoteDeviceDateStr.length() != 8) {
-            debugVerboseLog("Patch level is not in format YYYYMM or YYYYMMDD");
+            Slog.e(TAG, "Patch level is not in format YYYYMM or YYYYMMDD");
             return false;
         }
 
@@ -666,18 +664,6 @@
         }
     }
 
-    private static void debugVerboseLog(String str, Throwable t) {
-        if (DEBUG) {
-            Slog.v(TAG, str, t);
-        }
-    }
-
-    private static void debugVerboseLog(String str) {
-        if (DEBUG) {
-            Slog.v(TAG, str);
-        }
-    }
-
     /* Mutable data class for tracking dump data from verifications. */
     private static class MyDumpData extends AttestationVerificationManagerService.DumpData {
 
@@ -717,9 +703,7 @@
         @SuppressLint("WrongConstant")
         @Override
         public void dumpTo(IndentingPrintWriter writer) {
-            writer.println(
-                    "Result: " + AttestationVerificationManager.verificationResultCodeToString(
-                            mResult));
+            writer.println("Result: " + mResult);
             if (!mCertificationFactoryAvailable) {
                 writer.println("Certificate Factory Unavailable");
                 return;
diff --git a/services/core/java/com/android/server/security/AttestationVerificationSelfTrustedVerifierForTesting.java b/services/core/java/com/android/server/security/AttestationVerificationSelfTrustedVerifierForTesting.java
index 58df2bd..5039f6f 100644
--- a/services/core/java/com/android/server/security/AttestationVerificationSelfTrustedVerifierForTesting.java
+++ b/services/core/java/com/android/server/security/AttestationVerificationSelfTrustedVerifierForTesting.java
@@ -16,17 +16,15 @@
 
 package com.android.server.security;
 
+import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_CERTS;
+import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS;
 import static android.security.attestationverification.AttestationVerificationManager.PARAM_CHALLENGE;
-import static android.security.attestationverification.AttestationVerificationManager.RESULT_FAILURE;
-import static android.security.attestationverification.AttestationVerificationManager.RESULT_SUCCESS;
 import static android.security.attestationverification.AttestationVerificationManager.TYPE_CHALLENGE;
 
 import android.annotation.NonNull;
-import android.os.Build;
 import android.os.Bundle;
 import android.security.keystore.KeyGenParameterSpec;
 import android.security.keystore.KeyProperties;
-import android.util.Log;
 import android.util.Slog;
 
 import com.android.internal.org.bouncycastle.asn1.ASN1InputStream;
@@ -64,7 +62,6 @@
  */
 class AttestationVerificationSelfTrustedVerifierForTesting {
     private static final String TAG = "AVF";
-    private static final boolean DEBUG = Build.IS_DEBUGGABLE && Log.isLoggable(TAG, Log.VERBOSE);
 
     // The OID for the extension Android Keymint puts into device-generated certificates.
     private static final String ANDROID_KEYMINT_KEY_DESCRIPTION_EXTENSION_OID =
@@ -99,18 +96,6 @@
         return sAttestationVerificationSelfTrustedVerifier;
     }
 
-    private static void debugVerboseLog(String str, Throwable t) {
-        if (DEBUG) {
-            Slog.v(TAG, str, t);
-        }
-    }
-
-    private static void debugVerboseLog(String str) {
-        if (DEBUG) {
-            Slog.v(TAG, str);
-        }
-    }
-
     private AttestationVerificationSelfTrustedVerifierForTesting() throws Exception {
         mCertificateFactory = CertificateFactory.getInstance("X.509");
         mCertPathValidator = CertPathValidator.getInstance("PKIX");
@@ -142,23 +127,42 @@
                 certificates.add((X509Certificate) mCertificateFactory.generateCertificate(bis));
             }
         } catch (CertificateException e) {
-            debugVerboseLog("Unable to parse certificates from attestation", e);
-            return RESULT_FAILURE;
+            Slog.e("Unable to parse certificates from attestation", e.getLocalizedMessage());
+            return FLAG_FAILURE_CERTS;
         }
 
-        if (localBindingType == TYPE_CHALLENGE
-                && validateRequirements(requirements)
-                && checkLeafChallenge(requirements, certificates)
-                && verifyCertificateChain(certificates)) {
-            return RESULT_SUCCESS;
+        int result = 0;
+
+        if (localBindingType != TYPE_CHALLENGE
+                || !validateRequirements(requirements)) {
+            Slog.e(TAG, "Local binding requirements verification failure." + localBindingType);
+            return FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS;
         }
 
-        return RESULT_FAILURE;
+        // Verify challenge
+        byte[] challenge;
+        try {
+            challenge = getChallengeFromCert(certificates.get(0));
+        } catch (Throwable t) {
+            Slog.e("Unable to parse challenge from certificate.", t.getLocalizedMessage());
+            result |= FLAG_FAILURE_CERTS;
+            return result;
+        }
+        if (!Arrays.equals(requirements.getByteArray(PARAM_CHALLENGE), challenge)) {
+            Slog.e(TAG, "Self-Trusted validation failed; challenge mismatch.");
+            result |= FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS;
+        }
+
+        if (!verifyCertificateChain(certificates)) {
+            result |= FLAG_FAILURE_CERTS;
+        }
+
+        return result;
     }
 
     private boolean verifyCertificateChain(List<X509Certificate> certificates) {
         if (certificates.size() < 2) {
-            debugVerboseLog("Certificate chain less than 2 in size.");
+            Slog.e(TAG, "Certificate chain less than 2 in size.");
             return false;
         }
 
@@ -170,7 +174,7 @@
             validationParams.setRevocationEnabled(false);
             mCertPathValidator.validate(certificatePath, validationParams);
         } catch (Throwable t) {
-            debugVerboseLog("Invalid certificate chain", t);
+            Slog.e(TAG, "Invalid certificate chain", t);
             return false;
         }
 
@@ -183,34 +187,16 @@
 
     private boolean validateRequirements(Bundle requirements) {
         if (requirements.size() != 1) {
-            debugVerboseLog("Requirements does not contain exactly 1 key.");
+            Slog.e(TAG, "Requirements does not contain exactly 1 key.");
             return false;
         }
         if (!requirements.containsKey(PARAM_CHALLENGE)) {
-            debugVerboseLog("Requirements does not contain key: " + PARAM_CHALLENGE);
+            Slog.e(TAG, "Requirements does not contain key: " + PARAM_CHALLENGE);
             return false;
         }
         return true;
     }
 
-    private boolean checkLeafChallenge(Bundle requirements, List<X509Certificate> certificates) {
-        // Verify challenge
-        byte[] challenge;
-        try {
-            challenge = getChallengeFromCert(certificates.get(0));
-        } catch (Throwable t) {
-            debugVerboseLog("Unable to parse challenge from certificate.", t);
-            return false;
-        }
-
-        if (Arrays.equals(requirements.getByteArray(PARAM_CHALLENGE), challenge)) {
-            return true;
-        } else {
-            debugVerboseLog("Self-Trusted validation failed; challenge mismatch.");
-            return false;
-        }
-    }
-
     private byte[] getChallengeFromCert(@NonNull X509Certificate x509Certificate)
             throws CertificateEncodingException, IOException {
         Certificate certificate = Certificate.getInstance(
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index b35a0a7..9662a87 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -63,6 +63,7 @@
 import static com.android.internal.util.FrameworkStatsLog.TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__TELEPHONY;
 import static com.android.internal.util.FrameworkStatsLog.TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__UNKNOWN;
 import static com.android.server.am.MemoryStatUtil.readMemoryStatFromFilesystem;
+import static com.android.server.stats.Flags.accumulateNetworkStatsSinceBoot;
 import static com.android.server.stats.Flags.addMobileBytesTransferByProcStatePuller;
 import static com.android.server.stats.Flags.applyNetworkStatsPollRateLimit;
 import static com.android.server.stats.pull.IonMemoryUtil.readProcessSystemIonHeapSizesFromDebugfs;
@@ -216,19 +217,20 @@
 import com.android.server.BinderCallsStatsService;
 import com.android.server.LocalManagerRegistry;
 import com.android.server.LocalServices;
-import com.android.server.PinnerService;
-import com.android.server.PinnerService.PinnedFileStats;
 import com.android.server.SystemService;
 import com.android.server.SystemServiceManager;
 import com.android.server.am.MemoryStatUtil.MemoryStat;
 import com.android.server.health.HealthServiceWrapper;
 import com.android.server.notification.NotificationManagerService;
+import com.android.server.pinner.PinnerService;
+import com.android.server.pinner.PinnerService.PinnedFileStats;
 import com.android.server.pm.UserManagerInternal;
 import com.android.server.power.stats.KernelWakelockReader;
 import com.android.server.power.stats.KernelWakelockStats;
 import com.android.server.power.stats.SystemServerCpuThreadReader.SystemServiceCpuThreadTimes;
 import com.android.server.stats.pull.IonMemoryUtil.IonAllocations;
 import com.android.server.stats.pull.ProcfsMemoryUtil.MemorySnapshot;
+import com.android.server.stats.pull.netstats.NetworkStatsAccumulator;
 import com.android.server.stats.pull.netstats.NetworkStatsExt;
 import com.android.server.stats.pull.netstats.SubInfo;
 import com.android.server.storage.DiskStatsFileLogger;
@@ -424,6 +426,14 @@
     @GuardedBy("mDataBytesTransferLock")
     private final ArrayList<NetworkStatsExt> mNetworkStatsBaselines = new ArrayList<>();
 
+    // Accumulates NetworkStats from initialization till the present moment.
+    // It is necessary to accumulate stats internally, because NetworkStats persists data for a
+    // limited amount of time, after which diff becomes incorrect without accumulation.
+    @NonNull
+    @GuardedBy("mDataBytesTransferLock")
+    private final ArrayList<NetworkStatsAccumulator> mNetworkStatsAccumulators =
+            new ArrayList<>();
+
     @GuardedBy("mDataBytesTransferLock")
     private long mLastNetworkStatsPollTime = -NETSTATS_POLL_RATE_LIMIT_MS;
 
@@ -1568,16 +1578,45 @@
     private NetworkStats getUidNetworkStatsSnapshotForTemplateLocked(
             @NonNull NetworkTemplate template, boolean includeTags) {
         final long elapsedMillisSinceBoot = SystemClock.elapsedRealtime();
-        final long currentTimeInMillis = MICROSECONDS.toMillis(SystemClock.currentTimeMicro());
-        final long bucketDuration = Settings.Global.getLong(mContext.getContentResolver(),
+        final long currentTimeMillis = MICROSECONDS.toMillis(SystemClock.currentTimeMicro());
+        final long bootTimeMillis = currentTimeMillis - elapsedMillisSinceBoot;
+        final long bucketDurationMillis = Settings.Global.getLong(mContext.getContentResolver(),
                 NETSTATS_UID_BUCKET_DURATION, NETSTATS_UID_DEFAULT_BUCKET_DURATION_MS);
 
-        // Set startTime before boot so that NetworkStats includes at least one full bucket.
-        // Set endTime in the future so that NetworkStats includes everything in the active bucket.
-        final long startTime = currentTimeInMillis - elapsedMillisSinceBoot - bucketDuration;
-        final long endTime = currentTimeInMillis + bucketDuration;
+        if (accumulateNetworkStatsSinceBoot()) {
+            NetworkStatsAccumulator accumulator = CollectionUtils.find(
+                    mNetworkStatsAccumulators, it -> it.hasEqualParameters(template, includeTags));
+            if (accumulator == null) {
+                accumulator = new NetworkStatsAccumulator(
+                        template,
+                        includeTags,
+                        bucketDurationMillis,
+                        bootTimeMillis - bucketDurationMillis);
+                mNetworkStatsAccumulators.add(accumulator);
+            }
 
-        // NetworkStatsManager#forceUpdate updates stats for all networks
+            return accumulator.queryStats(currentTimeMillis,
+                    (aTemplate, aIncludeTags, aStartTime, aEndTime) -> {
+                        synchronized (mDataBytesTransferLock) {
+                            return getUidNetworkStatsSnapshotForTemplateLocked(aTemplate,
+                                    aIncludeTags, aStartTime, aEndTime);
+                        }
+                    });
+
+        } else {
+            // Set end time in the future to include all stats in the active bucket.
+            return getUidNetworkStatsSnapshotForTemplateLocked(
+                    template, includeTags,
+                    bootTimeMillis - bucketDurationMillis,
+                    currentTimeMillis + bucketDurationMillis);
+        }
+    }
+
+    @GuardedBy("mDataBytesTransferLock")
+    @Nullable
+    private NetworkStats getUidNetworkStatsSnapshotForTemplateLocked(
+            @NonNull NetworkTemplate template, boolean includeTags, long startTime, long endTime) {
+        final long elapsedMillisSinceBoot = SystemClock.elapsedRealtime();
         if (applyNetworkStatsPollRateLimit()) {
             // The new way: rate-limit force-polling for all NetworkStats queries
             if (elapsedMillisSinceBoot - mLastNetworkStatsPollTime >= NETSTATS_POLL_RATE_LIMIT_MS) {
diff --git a/services/core/java/com/android/server/stats/pull/netstats/NetworkStatsAccumulator.java b/services/core/java/com/android/server/stats/pull/netstats/NetworkStatsAccumulator.java
new file mode 100644
index 0000000..cc63968
--- /dev/null
+++ b/services/core/java/com/android/server/stats/pull/netstats/NetworkStatsAccumulator.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2024 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.stats.pull.netstats;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.net.NetworkStats;
+import android.net.NetworkTemplate;
+
+import java.util.Objects;
+
+/**
+ * A class that queries NetworkStats, accumulates query results, and exposes cumulative stats across
+ * the time range covered by the queries. This class is not thread-safe.
+ * <p>
+ * This is class should be used when querying NetworkStats since boot, as NetworkStats persists data
+ * only for a limited period of time.
+ *
+ * @hide
+ */
+public class NetworkStatsAccumulator {
+
+    private final NetworkTemplate mTemplate;
+    private final boolean mWithTags;
+    private final long mBucketDurationMillis;
+    private NetworkStats mSnapshot;
+    private long mSnapshotEndTimeMillis;
+
+    public NetworkStatsAccumulator(@NonNull NetworkTemplate template, boolean withTags,
+            long bucketDurationMillis, long snapshotEndTimeMillis) {
+        mTemplate = template;
+        mWithTags = withTags;
+        mBucketDurationMillis = bucketDurationMillis;
+        mSnapshot = new NetworkStats(0, 1);
+        mSnapshotEndTimeMillis = snapshotEndTimeMillis;
+    }
+
+    /**
+     * Provides cumulative NetworkStats until given timestamp.
+     * <p>
+     * This method method may call {@code queryFunction} more than once, which includes maintaining
+     * an internal cumulative stats snapshot and querying stats after the snapshot.
+     */
+    @Nullable
+    public NetworkStats queryStats(long currentTimeMillis,
+            @NonNull StatsQueryFunction queryFunction) {
+        maybeExpandSnapshot(currentTimeMillis, queryFunction);
+        return snapshotPlusFollowingStats(currentTimeMillis, queryFunction);
+    }
+
+    /**
+     * Returns true if the accumulator is using given query parameters.
+     */
+    public boolean hasEqualParameters(@NonNull NetworkTemplate template, boolean withTags) {
+        return Objects.equals(mTemplate, template) && mWithTags == withTags;
+    }
+
+    /**
+     * Expands the internal cumulative stats snapshot, if possible, by querying NetworkStats.
+     */
+    private void maybeExpandSnapshot(long currentTimeMillis,
+            @NonNull StatsQueryFunction queryFunction) {
+        // Update snapshot only if it is possible to expand it by at least one full bucket, and only
+        // if the new snapshot's end is not in the active bucket.
+        long newEndTimeMillis = currentTimeMillis - mBucketDurationMillis;
+        if (newEndTimeMillis - mSnapshotEndTimeMillis > mBucketDurationMillis) {
+            NetworkStats extraStats = queryFunction.queryNetworkStats(mTemplate, mWithTags,
+                    mSnapshotEndTimeMillis, newEndTimeMillis);
+            if (extraStats != null) {
+                mSnapshot = mSnapshot.add(extraStats);
+                mSnapshotEndTimeMillis = newEndTimeMillis;
+            }
+        }
+    }
+
+    /**
+     * Adds up stats in the internal cumulative snapshot and the stats that follow after it.
+     */
+    @Nullable
+    private NetworkStats snapshotPlusFollowingStats(long currentTimeMillis,
+            @NonNull StatsQueryFunction queryFunction) {
+        // Set end time in the future to include all stats in the active bucket.
+        NetworkStats extraStats = queryFunction.queryNetworkStats(mTemplate, mWithTags,
+                mSnapshotEndTimeMillis, currentTimeMillis + mBucketDurationMillis);
+        return extraStats != null ? mSnapshot.add(extraStats) : null;
+    }
+
+    @FunctionalInterface
+    public interface StatsQueryFunction {
+        /**
+         * Returns network stats during the given time period.
+         */
+        @Nullable
+        NetworkStats queryNetworkStats(@NonNull NetworkTemplate template, boolean includeTags,
+                long startTime, long endTime);
+    }
+}
diff --git a/services/core/java/com/android/server/stats/stats_flags.aconfig b/services/core/java/com/android/server/stats/stats_flags.aconfig
index afea303..8686458f 100644
--- a/services/core/java/com/android/server/stats/stats_flags.aconfig
+++ b/services/core/java/com/android/server/stats/stats_flags.aconfig
@@ -30,3 +30,11 @@
     bug: "352495181"
     is_fixed_read_only: true
 }
+
+flag {
+    name: "accumulate_network_stats_since_boot"
+    namespace: "statsd"
+    description: "Accumulate results of NetworkStats queries to avoid hitting NetworkStats persistence limit"
+    bug: "352537247"
+    is_fixed_read_only: true
+}
diff --git a/services/core/java/com/android/server/uri/UriPermission.java b/services/core/java/com/android/server/uri/UriPermission.java
index 0d1f367..0ff23ea 100644
--- a/services/core/java/com/android/server/uri/UriPermission.java
+++ b/services/core/java/com/android/server/uri/UriPermission.java
@@ -25,6 +25,8 @@
 import android.util.Log;
 import android.util.Slog;
 
+import com.android.internal.annotations.GuardedBy;
+
 import com.google.android.collect.Sets;
 
 import java.io.PrintWriter;
@@ -82,7 +84,9 @@
 
     static final long INVALID_TIME = Long.MIN_VALUE;
 
+    @GuardedBy("this")
     private ArraySet<UriPermissionOwner> mReadOwners;
+    @GuardedBy("this")
     private ArraySet<UriPermissionOwner> mWriteOwners;
 
     private String stringName;
@@ -204,14 +208,16 @@
                 persistedModeFlags &= ~Intent.FLAG_GRANT_READ_URI_PERMISSION;
             }
             globalModeFlags &= ~Intent.FLAG_GRANT_READ_URI_PERMISSION;
-            if (mReadOwners != null && includingOwners) {
-                ownedModeFlags &= ~Intent.FLAG_GRANT_READ_URI_PERMISSION;
-                for (UriPermissionOwner r : mReadOwners) {
-                    if (r != null) {
-                        r.removeReadPermission(this);
+            synchronized (this) {
+                if (mReadOwners != null && includingOwners) {
+                    ownedModeFlags &= ~Intent.FLAG_GRANT_READ_URI_PERMISSION;
+                    for (UriPermissionOwner r : mReadOwners) {
+                        if (r != null) {
+                            r.removeReadPermission(this);
+                        }
                     }
+                    mReadOwners = null;
                 }
-                mReadOwners = null;
             }
         }
         if ((modeFlags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
@@ -220,14 +226,16 @@
                 persistedModeFlags &= ~Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
             }
             globalModeFlags &= ~Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
-            if (mWriteOwners != null && includingOwners) {
-                ownedModeFlags &= ~Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
-                for (UriPermissionOwner r : mWriteOwners) {
-                    if (r != null) {
-                        r.removeWritePermission(this);
+            synchronized (this) {
+                if (mWriteOwners != null && includingOwners) {
+                    ownedModeFlags &= ~Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
+                    for (UriPermissionOwner r : mWriteOwners) {
+                        if (r != null) {
+                            r.removeWritePermission(this);
+                        }
                     }
+                    mWriteOwners = null;
                 }
-                mWriteOwners = null;
             }
         }
 
@@ -256,7 +264,7 @@
         }
     }
 
-    private void addReadOwner(UriPermissionOwner owner) {
+    private synchronized void addReadOwner(UriPermissionOwner owner) {
         if (mReadOwners == null) {
             mReadOwners = Sets.newArraySet();
             ownedModeFlags |= Intent.FLAG_GRANT_READ_URI_PERMISSION;
@@ -270,7 +278,7 @@
     /**
      * Remove given read owner, updating {@Link #modeFlags} as needed.
      */
-    void removeReadOwner(UriPermissionOwner owner) {
+    synchronized void removeReadOwner(UriPermissionOwner owner) {
         if (mReadOwners == null || !mReadOwners.remove(owner)) {
             Slog.wtf(TAG, "Unknown read owner " + owner + " in " + this);
             return;
@@ -282,7 +290,7 @@
         }
     }
 
-    private void addWriteOwner(UriPermissionOwner owner) {
+    private synchronized void addWriteOwner(UriPermissionOwner owner) {
         if (mWriteOwners == null) {
             mWriteOwners = Sets.newArraySet();
             ownedModeFlags |= Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
@@ -296,7 +304,7 @@
     /**
      * Remove given write owner, updating {@Link #modeFlags} as needed.
      */
-    void removeWriteOwner(UriPermissionOwner owner) {
+    synchronized void removeWriteOwner(UriPermissionOwner owner) {
         if (mWriteOwners == null || !mWriteOwners.remove(owner)) {
             Slog.wtf(TAG, "Unknown write owner " + owner + " in " + this);
             return;
@@ -339,20 +347,22 @@
         }
         pw.println();
 
-        if (mReadOwners != null) {
-            pw.print(prefix);
-            pw.println("readOwners:");
-            for (UriPermissionOwner owner : mReadOwners) {
+        synchronized (this) {
+            if (mReadOwners != null) {
                 pw.print(prefix);
-                pw.println("  * " + owner);
+                pw.println("readOwners:");
+                for (UriPermissionOwner owner : mReadOwners) {
+                    pw.print(prefix);
+                    pw.println("  * " + owner);
+                }
             }
-        }
-        if (mWriteOwners != null) {
-            pw.print(prefix);
-            pw.println("writeOwners:");
-            for (UriPermissionOwner owner : mWriteOwners) {
+            if (mWriteOwners != null) {
                 pw.print(prefix);
-                pw.println("  * " + owner);
+                pw.println("writeOwners:");
+                for (UriPermissionOwner owner : mWriteOwners) {
+                    pw.print(prefix);
+                    pw.println("  * " + owner);
+                }
             }
         }
     }
diff --git a/services/core/java/com/android/server/vibrator/ClippingAmplitudeAndFrequencyAdapter.java b/services/core/java/com/android/server/vibrator/ClippingAmplitudeAndFrequencyAdapter.java
index 111e075a..245d902 100644
--- a/services/core/java/com/android/server/vibrator/ClippingAmplitudeAndFrequencyAdapter.java
+++ b/services/core/java/com/android/server/vibrator/ClippingAmplitudeAndFrequencyAdapter.java
@@ -26,10 +26,10 @@
 
 /**
  * Adapter that clips frequency values to the supported range specified by
- * {@link VibratorInfo.FrequencyProfile}, then clips amplitude values to the max supported one at
+ * {@link VibratorInfo.FrequencyProfileLegacy}, then clips amplitude values to the max supported one at
  * each frequency.
  *
- * <p>The {@link VibratorInfo.FrequencyProfile} is only applicable to PWLE compositions. This
+ * <p>The {@link VibratorInfo.FrequencyProfileLegacy} is only applicable to PWLE compositions. This
  * adapter is only applied to {@link RampSegment} and all other segments will remain unchanged.
  */
 final class ClippingAmplitudeAndFrequencyAdapter implements VibrationSegmentsAdapter {
@@ -59,7 +59,7 @@
     }
 
     private float clampFrequency(VibratorInfo info, float frequencyHz) {
-        Range<Float> frequencyRangeHz = info.getFrequencyProfile().getFrequencyRangeHz();
+        Range<Float> frequencyRangeHz = info.getFrequencyProfileLegacy().getFrequencyRangeHz();
         if (frequencyHz == 0 || frequencyRangeHz == null)  {
             return Float.isNaN(info.getResonantFrequencyHz()) ? 0 : info.getResonantFrequencyHz();
         }
@@ -67,7 +67,7 @@
     }
 
     private float clampAmplitude(VibratorInfo info, float frequencyHz, float amplitude) {
-        VibratorInfo.FrequencyProfile mapping = info.getFrequencyProfile();
+        VibratorInfo.FrequencyProfileLegacy mapping = info.getFrequencyProfileLegacy();
         if (mapping.isEmpty()) {
             // No frequency mapping was specified so leave amplitude unchanged.
             // The frequency will be clamped to the device's resonant frequency.
diff --git a/services/core/java/com/android/server/vibrator/ExternalVibrationSession.java b/services/core/java/com/android/server/vibrator/ExternalVibrationSession.java
index b5a7fcb..e650c52 100644
--- a/services/core/java/com/android/server/vibrator/ExternalVibrationSession.java
+++ b/services/core/java/com/android/server/vibrator/ExternalVibrationSession.java
@@ -56,24 +56,26 @@
     }
 
     @Override
+    public long getCreateUptimeMillis() {
+        return stats.getCreateUptimeMillis();
+    }
+
+    @Override
     public CallerInfo getCallerInfo() {
         return callerInfo;
     }
 
     @Override
-    public VibrationSession.DebugInfo getDebugInfo() {
-        return new Vibration.DebugInfoImpl(getStatus(), stats, /* playedEffect= */ null,
-                /* originalEffect= */ null, mScale.scaleLevel, mScale.adaptiveHapticsScale,
-                callerInfo);
+    public IBinder getCallerToken() {
+        return mExternalVibration.getToken();
     }
 
     @Override
-    public VibrationStats.StatsInfo getStatsInfo(long completionUptimeMillis) {
-        return new VibrationStats.StatsInfo(
-                mExternalVibration.getUid(),
-                FrameworkStatsLog.VIBRATION_REPORTED__VIBRATION_TYPE__EXTERNAL,
-                mExternalVibration.getVibrationAttributes().getUsage(), getStatus(), stats,
-                completionUptimeMillis);
+    public VibrationSession.DebugInfo getDebugInfo() {
+        return new Vibration.DebugInfoImpl(getStatus(), callerInfo,
+                FrameworkStatsLog.VIBRATION_REPORTED__VIBRATION_TYPE__EXTERNAL, stats,
+                /* playedEffect= */ null, /* originalEffect= */ null, mScale.scaleLevel,
+                mScale.adaptiveHapticsScale);
     }
 
     @Override
@@ -86,6 +88,12 @@
     }
 
     @Override
+    public boolean wasEndRequested() {
+        // End request is immediate, so just check if vibration has already ended.
+        return hasEnded();
+    }
+
+    @Override
     public boolean linkToDeath(Runnable callback) {
         synchronized (mLock) {
             mBinderDeathCallback = callback;
@@ -104,10 +112,12 @@
 
     @Override
     public void binderDied() {
+        Runnable callback;
         synchronized (mLock) {
-            if (mBinderDeathCallback != null) {
-                mBinderDeathCallback.run();
-            }
+            callback = mBinderDeathCallback;
+        }
+        if (callback != null) {
+            callback.run();
         }
     }
 
@@ -131,6 +141,16 @@
         end(new EndInfo(status, endedBy));
     }
 
+    @Override
+    public void notifyVibratorCallback(int vibratorId, long vibrationId) {
+        // ignored, external control does not expect callbacks from the vibrator
+    }
+
+    @Override
+    public void notifySyncedVibratorsCallback(long vibrationId) {
+        // ignored, external control does not expect callbacks from the vibrator manager
+    }
+
     boolean isHoldingSameVibration(ExternalVibration vib) {
         return mExternalVibration.equals(vib);
     }
diff --git a/services/core/java/com/android/server/vibrator/HalVibration.java b/services/core/java/com/android/server/vibrator/HalVibration.java
index ce9c47b..fbcc856 100644
--- a/services/core/java/com/android/server/vibrator/HalVibration.java
+++ b/services/core/java/com/android/server/vibrator/HalVibration.java
@@ -19,15 +19,16 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.os.CombinedVibration;
-import android.os.IBinder;
 import android.os.VibrationAttributes;
 import android.os.VibrationEffect;
+import android.os.vibrator.PrebakedSegment;
+import android.os.vibrator.VibrationEffectSegment;
 import android.util.SparseArray;
 
-import com.android.internal.util.FrameworkStatsLog;
-
+import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.CountDownLatch;
+import java.util.function.IntFunction;
 
 /**
  * Represents a vibration defined by a {@link CombinedVibration} that will be performed by
@@ -36,7 +37,6 @@
 final class HalVibration extends Vibration {
 
     public final SparseArray<VibrationEffect> mFallbacks = new SparseArray<>();
-    public final IBinder callerToken;
 
     /** A {@link CountDownLatch} to enable waiting for completion. */
     private final CountDownLatch mCompletionLatch = new CountDownLatch(1);
@@ -56,10 +56,9 @@
     private int mScaleLevel;
     private float mAdaptiveScale;
 
-    HalVibration(@NonNull IBinder callerToken, @NonNull CombinedVibration effect,
-            @NonNull VibrationSession.CallerInfo callerInfo) {
+    HalVibration(@NonNull VibrationSession.CallerInfo callerInfo,
+            @NonNull CombinedVibration effect) {
         super(callerInfo);
-        this.callerToken = callerToken;
         mOriginalEffect = effect;
         mEffectToPlay = effect;
         mScaleLevel = VibrationScaler.SCALE_NONE;
@@ -87,11 +86,11 @@
     }
 
     /**
-     * Add a fallback {@link VibrationEffect} to be played when given effect id is not supported,
-     * which might be necessary for replacement in realtime.
+     * Add a fallback {@link VibrationEffect} to be played for each predefined effect id, which
+     * might be necessary for replacement in realtime.
      */
-    public void addFallback(int effectId, VibrationEffect effect) {
-        mFallbacks.put(effectId, effect);
+    public void fillFallbacks(IntFunction<VibrationEffect> fallbackProvider) {
+        fillFallbacksForEffect(mEffectToPlay, fallbackProvider);
     }
 
     /**
@@ -131,11 +130,6 @@
         // No need to update fallback effects, they are already configured per device.
     }
 
-    @Override
-    public boolean isRepeating() {
-        return mOriginalEffect.getDuration() == Long.MAX_VALUE;
-    }
-
     /** Return the effect that should be played by this vibration. */
     public CombinedVibration getEffectToPlay() {
         return mEffectToPlay;
@@ -146,20 +140,9 @@
         // Clear the original effect if it's the same as the effect that was played, for simplicity
         CombinedVibration originalEffect =
                 Objects.equals(mOriginalEffect, mEffectToPlay) ? null : mOriginalEffect;
-        return new Vibration.DebugInfoImpl(getStatus(), stats, mEffectToPlay, originalEffect,
-                mScaleLevel, mAdaptiveScale, callerInfo);
-    }
-
-    @Override
-    public VibrationStats.StatsInfo getStatsInfo(long completionUptimeMillis) {
-        int vibrationType = mEffectToPlay.hasVendorEffects()
-                ? FrameworkStatsLog.VIBRATION_REPORTED__VIBRATION_TYPE__VENDOR
-                : isRepeating()
-                        ? FrameworkStatsLog.VIBRATION_REPORTED__VIBRATION_TYPE__REPEATED
-                        : FrameworkStatsLog.VIBRATION_REPORTED__VIBRATION_TYPE__SINGLE;
-        return new VibrationStats.StatsInfo(
-                callerInfo.uid, vibrationType, callerInfo.attrs.getUsage(), getStatus(),
-                stats, completionUptimeMillis);
+        return new Vibration.DebugInfoImpl(getStatus(), callerInfo,
+                VibrationStats.StatsInfo.findVibrationType(mEffectToPlay), stats, mEffectToPlay,
+                originalEffect, mScaleLevel, mAdaptiveScale);
     }
 
     /**
@@ -174,6 +157,42 @@
         return callerInfo.uid == vib.callerInfo.uid && callerInfo.attrs.isFlagSet(
                 VibrationAttributes.FLAG_PIPELINED_EFFECT)
                 && vib.callerInfo.attrs.isFlagSet(VibrationAttributes.FLAG_PIPELINED_EFFECT)
-                && !isRepeating();
+                && (mOriginalEffect.getDuration() != Long.MAX_VALUE);
+    }
+
+    private void fillFallbacksForEffect(CombinedVibration effect,
+            IntFunction<VibrationEffect> fallbackProvider) {
+        if (effect instanceof CombinedVibration.Mono) {
+            fillFallbacksForEffect(((CombinedVibration.Mono) effect).getEffect(), fallbackProvider);
+        } else if (effect instanceof CombinedVibration.Stereo) {
+            SparseArray<VibrationEffect> effects =
+                    ((CombinedVibration.Stereo) effect).getEffects();
+            for (int i = 0; i < effects.size(); i++) {
+                fillFallbacksForEffect(effects.valueAt(i), fallbackProvider);
+            }
+        } else if (effect instanceof CombinedVibration.Sequential) {
+            List<CombinedVibration> effects =
+                    ((CombinedVibration.Sequential) effect).getEffects();
+            for (int i = 0; i < effects.size(); i++) {
+                fillFallbacksForEffect(effects.get(i), fallbackProvider);
+            }
+        }
+    }
+
+    private void fillFallbacksForEffect(VibrationEffect effect,
+            IntFunction<VibrationEffect> fallbackProvider) {
+        if (!(effect instanceof VibrationEffect.Composed composed)) {
+            return;
+        }
+        int segmentCount = composed.getSegments().size();
+        for (int i = 0; i < segmentCount; i++) {
+            VibrationEffectSegment segment = composed.getSegments().get(i);
+            if ((segment instanceof PrebakedSegment prebaked) && prebaked.shouldFallback()) {
+                VibrationEffect fallback = fallbackProvider.apply(prebaked.getEffectId());
+                if (fallback != null) {
+                    mFallbacks.put(prebaked.getEffectId(), fallback);
+                }
+            }
+        }
     }
 }
diff --git a/services/core/java/com/android/server/vibrator/SingleVibrationSession.java b/services/core/java/com/android/server/vibrator/SingleVibrationSession.java
new file mode 100644
index 0000000..f80407d
--- /dev/null
+++ b/services/core/java/com/android/server/vibrator/SingleVibrationSession.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2024 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.vibrator;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.CombinedVibration;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Slog;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.NoSuchElementException;
+
+/**
+ * A vibration session holding a single {@link CombinedVibration} request, performed by a
+ * {@link VibrationStepConductor}.
+ */
+final class SingleVibrationSession implements VibrationSession, IBinder.DeathRecipient {
+    private static final String TAG = "SingleVibrationSession";
+
+    private final Object mLock = new Object();
+    private final IBinder mCallerToken;
+    private final HalVibration mVibration;
+
+    @GuardedBy("mLock")
+    private VibrationStepConductor mConductor;
+
+    @GuardedBy("mLock")
+    @Nullable
+    private Runnable mBinderDeathCallback;
+
+    SingleVibrationSession(@NonNull IBinder callerToken, @NonNull CallerInfo callerInfo,
+            @NonNull CombinedVibration vibration) {
+        mCallerToken = callerToken;
+        mVibration = new HalVibration(callerInfo, vibration);
+    }
+
+    public void setVibrationConductor(@Nullable VibrationStepConductor conductor) {
+        synchronized (mLock) {
+            mConductor = conductor;
+        }
+    }
+
+    public HalVibration getVibration() {
+        return mVibration;
+    }
+
+    @Override
+    public long getCreateUptimeMillis() {
+        return mVibration.stats.getCreateUptimeMillis();
+    }
+
+    @Override
+    public boolean isRepeating() {
+        return mVibration.getEffectToPlay().getDuration() == Long.MAX_VALUE;
+    }
+
+    @Override
+    public CallerInfo getCallerInfo() {
+        return mVibration.callerInfo;
+    }
+
+    @Override
+    public IBinder getCallerToken() {
+        return mCallerToken;
+    }
+
+    @Override
+    public DebugInfo getDebugInfo() {
+        return mVibration.getDebugInfo();
+    }
+
+    @Override
+    public boolean wasEndRequested() {
+        if (mVibration.hasEnded()) {
+            return true;
+        }
+        synchronized (mLock) {
+            return mConductor != null && mConductor.wasNotifiedToCancel();
+        }
+    }
+
+    @Override
+    public void binderDied() {
+        Slog.d(TAG, "Binder died, cancelling vibration...");
+        requestEnd(Status.CANCELLED_BINDER_DIED, /* endedBy= */ null, /* immediate= */ false);
+        Runnable callback;
+        synchronized (mLock) {
+            callback = mBinderDeathCallback;
+        }
+        if (callback != null) {
+            callback.run();
+        }
+    }
+
+    @Override
+    public boolean linkToDeath(@Nullable Runnable callback) {
+        synchronized (mLock) {
+            mBinderDeathCallback = callback;
+        }
+        try {
+            mCallerToken.linkToDeath(this, 0);
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Error linking vibration to token death", e);
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public void unlinkToDeath() {
+        try {
+            mCallerToken.unlinkToDeath(this, 0);
+        } catch (NoSuchElementException e) {
+            Slog.wtf(TAG, "Failed to unlink vibration to token death", e);
+        }
+        synchronized (mLock) {
+            mBinderDeathCallback = null;
+        }
+    }
+
+    @Override
+    public void requestEnd(@NonNull Status status, @Nullable CallerInfo endedBy,
+            boolean immediate) {
+        synchronized (mLock) {
+            if (mConductor != null) {
+                mConductor.notifyCancelled(new Vibration.EndInfo(status, endedBy), immediate);
+            } else {
+                mVibration.end(new Vibration.EndInfo(status, endedBy));
+            }
+        }
+    }
+
+    @Override
+    public void notifyVibratorCallback(int vibratorId, long vibrationId) {
+        if (vibrationId != mVibration.id) {
+            return;
+        }
+        synchronized (mLock) {
+            if (mConductor != null) {
+                mConductor.notifyVibratorComplete(vibratorId);
+            }
+        }
+    }
+
+    @Override
+    public void notifySyncedVibratorsCallback(long vibrationId) {
+        if (vibrationId != mVibration.id) {
+            return;
+        }
+        synchronized (mLock) {
+            if (mConductor != null) {
+                mConductor.notifySyncedVibrationComplete();
+            }
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/vibrator/Vibration.java b/services/core/java/com/android/server/vibrator/Vibration.java
index 21fd4ce..bb2a17c 100644
--- a/services/core/java/com/android/server/vibrator/Vibration.java
+++ b/services/core/java/com/android/server/vibrator/Vibration.java
@@ -88,15 +88,9 @@
         stats.reportEnded(endInfo.endedBy);
     }
 
-    /** Return true if vibration is a repeating vibration. */
-    abstract boolean isRepeating();
-
     /** Return {@link VibrationSession.DebugInfo} with read-only debug data about this vibration. */
     abstract VibrationSession.DebugInfo getDebugInfo();
 
-    /** Return {@link VibrationStats.StatsInfo} with read-only metrics about this vibration. */
-    abstract VibrationStats.StatsInfo getStatsInfo(long completionUptimeMillis);
-
     /** Immutable info passed as a signal to end a vibration. */
     static final class EndInfo {
         /** The vibration status to be set when it ends with this info. */
@@ -146,35 +140,41 @@
      * potentially expensive or resource-linked objects, such as {@link IBinder}.
      */
     static final class DebugInfoImpl implements VibrationSession.DebugInfo {
-        final VibrationSession.Status mStatus;
-        final long mCreateTime;
-        final VibrationSession.CallerInfo mCallerInfo;
+        private final VibrationSession.Status mStatus;
+        private final VibrationStats.StatsInfo mStatsInfo;
+        private final VibrationSession.CallerInfo mCallerInfo;
         @Nullable
-        final CombinedVibration mPlayedEffect;
-
-        private final long mStartTime;
-        private final long mEndTime;
-        private final long mDurationMs;
+        private final CombinedVibration mPlayedEffect;
         @Nullable
         private final CombinedVibration mOriginalEffect;
         private final int mScaleLevel;
         private final float mAdaptiveScale;
 
-        DebugInfoImpl(VibrationSession.Status status, VibrationStats stats,
-                @Nullable CombinedVibration playedEffect,
-                @Nullable CombinedVibration originalEffect, int scaleLevel,
-                float adaptiveScale, @NonNull VibrationSession.CallerInfo callerInfo) {
+        private final long mCreateUptime;
+        private final long mCreateTime;
+        private final long mStartTime;
+        private final long mEndTime;
+        private final long mDurationMs;
+
+        DebugInfoImpl(VibrationSession.Status status,
+                @NonNull VibrationSession.CallerInfo callerInfo, int vibrationType,
+                VibrationStats stats, @Nullable CombinedVibration playedEffect,
+                @Nullable CombinedVibration originalEffect, int scaleLevel, float adaptiveScale) {
             Objects.requireNonNull(callerInfo);
-            mCreateTime = stats.getCreateTimeDebug();
-            mStartTime = stats.getStartTimeDebug();
-            mEndTime = stats.getEndTimeDebug();
-            mDurationMs = stats.getDurationDebug();
+            mCallerInfo = callerInfo;
+            mStatsInfo = stats.toStatsInfo(callerInfo.uid, vibrationType,
+                    callerInfo.attrs.getUsage(), status);
             mPlayedEffect = playedEffect;
             mOriginalEffect = originalEffect;
             mScaleLevel = scaleLevel;
             mAdaptiveScale = adaptiveScale;
-            mCallerInfo = callerInfo;
             mStatus = status;
+
+            mCreateUptime = stats.getCreateUptimeMillis();
+            mCreateTime = stats.getCreateTimeDebug();
+            mStartTime = stats.getStartTimeDebug();
+            mEndTime = stats.getEndTimeDebug();
+            mDurationMs = stats.getDurationDebug();
         }
 
         @Override
@@ -184,7 +184,7 @@
 
         @Override
         public long getCreateUptimeMillis() {
-            return mCreateTime;
+            return mCreateUptime;
         }
 
         @Override
@@ -216,6 +216,7 @@
         @Override
         public void logMetrics(VibratorFrameworkStatsLogger statsLogger) {
             statsLogger.logVibrationAdaptiveHapticScale(mCallerInfo.uid, mAdaptiveScale);
+            statsLogger.writeVibrationReportedAsync(mStatsInfo);
         }
 
         @Override
diff --git a/services/core/java/com/android/server/vibrator/VibrationSession.java b/services/core/java/com/android/server/vibrator/VibrationSession.java
index 70477a2..4de8f78 100644
--- a/services/core/java/com/android/server/vibrator/VibrationSession.java
+++ b/services/core/java/com/android/server/vibrator/VibrationSession.java
@@ -39,9 +39,18 @@
  */
 interface VibrationSession {
 
+    /** Returns the session creation time from {@link android.os.SystemClock#uptimeMillis()}. */
+    long getCreateUptimeMillis();
+
+    /** Return true if vibration session plays a repeating vibration. */
+    boolean isRepeating();
+
     /** Returns data about the client app that triggered this vibration session. */
     CallerInfo getCallerInfo();
 
+    /** Returns the binder token from the client app attached to this vibration session. */
+    IBinder getCallerToken();
+
     /** Returns debug data for logging and metric reports. */
     DebugInfo getDebugInfo();
 
@@ -58,6 +67,19 @@
     /** Removes link to the app process death. */
     void unlinkToDeath();
 
+    /** Returns true if this session was requested to end by {@link #requestEnd}. */
+    boolean wasEndRequested();
+
+    /**
+     * Request the end of this session, which might be acted upon asynchronously.
+     *
+     * <p>This is the same as {@link #requestEnd(Status, CallerInfo, boolean)}, with no
+     * {@link CallerInfo} and with {@code immediate} flag set to false.
+     */
+    default void requestEnd(@NonNull Status status) {
+        requestEnd(status, /* endedBy= */ null, /* immediate= */ false);
+    }
+
     /**
      * Notify the session end was requested, which might be acted upon asynchronously.
      *
@@ -71,6 +93,25 @@
     void requestEnd(@NonNull Status status, @Nullable CallerInfo endedBy, boolean immediate);
 
     /**
+     * Notify a vibrator has completed the last command during the playback of given vibration.
+     *
+     * <p>This will be called by the vibrator hardware callback indicating the last vibrate call is
+     * complete (e.g. on(), perform(), compose()). This does not mean the vibration is complete,
+     * since its playback might have one or more interactions with the vibrator hardware.
+     */
+    void notifyVibratorCallback(int vibratorId, long vibrationId);
+
+    /**
+     * Notify all synced vibrators have completed the last synchronized command during the playback
+     * of given vibration.
+     *
+     * <p>This will be called by the vibrator manager hardware callback indicating the last
+     * synchronized vibrate call is complete. This does not mean the vibration is complete, since
+     * its playback might have one or more interactions with the vibrator hardware.
+     */
+    void notifySyncedVibratorsCallback(long vibrationId);
+
+    /**
      * Session status with reference to values from vibratormanagerservice.proto for logging.
      */
     enum Status {
diff --git a/services/core/java/com/android/server/vibrator/VibrationStats.java b/services/core/java/com/android/server/vibrator/VibrationStats.java
index fc0c6e7..637a5a1 100644
--- a/services/core/java/com/android/server/vibrator/VibrationStats.java
+++ b/services/core/java/com/android/server/vibrator/VibrationStats.java
@@ -18,6 +18,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.os.CombinedVibration;
 import android.os.SystemClock;
 import android.os.vibrator.PrebakedSegment;
 import android.os.vibrator.PrimitiveSegment;
@@ -37,11 +38,11 @@
     //           vibrate request.
     // - Start: time a vibration started to play, which is closer to the time that the
     //          VibrationEffect started playing the very first segment.
-    // - End: time a vibration ended, even if it never started to play. This can be as soon as the
-    //        vibrator HAL reports it has finished the last command, or before it has even started
-    //        when the vibration is ignored or cancelled.
-    // Create and end times set by VibratorManagerService only, guarded by its lock.
-    // Start times set by VibrationThread only (single-threaded).
+    // - End: time a vibration ended with a status, even if it never started to play. This can be as
+    //        soon as the vibrator HAL reports it has finished the last command, or before it has
+    //        even started when the vibration is ignored or cancelled.
+    // Created and ended times set by VibratorManagerService only, guarded by its lock.
+    // Start time set by VibrationThread only (single-threaded).
     private long mCreateUptimeMillis;
     private long mStartUptimeMillis;
     private long mEndUptimeMillis;
@@ -97,6 +98,10 @@
         mInterruptedUsage = -1;
     }
 
+    StatsInfo toStatsInfo(int uid, int vibrationType, int usage, VibrationSession.Status status) {
+        return new VibrationStats.StatsInfo(uid, vibrationType, usage, status, this);
+    }
+
     long getCreateUptimeMillis() {
         return mCreateUptimeMillis;
     }
@@ -300,7 +305,7 @@
      * {@link com.android.internal.util.FrameworkStatsLog} as a
      * {@link com.android.internal.util.FrameworkStatsLog#VIBRATION_REPORTED}.
      */
-    static final class StatsInfo {
+    public static final class StatsInfo {
         public final int uid;
         public final int vibrationType;
         public final int usage;
@@ -331,7 +336,7 @@
         private boolean mIsWritten;
 
         StatsInfo(int uid, int vibrationType, int usage, VibrationSession.Status status,
-                VibrationStats stats, long completionUptimeMillis) {
+                VibrationStats stats) {
             this.uid = uid;
             this.vibrationType = vibrationType;
             this.usage = usage;
@@ -342,6 +347,9 @@
             interruptedUsage = stats.mInterruptedUsage;
             repeatCount = stats.mRepeatCount;
 
+            // Consider this vibration is being completed now.
+            long completionUptimeMillis = SystemClock.uptimeMillis();
+
             // This duration goes from the time this object was created until the time it was
             // completed. We can use latencies to detect the times between first and last
             // interaction with vibrator.
@@ -419,5 +427,25 @@
             }
             return res;
         }
+
+        /**
+         * Returns the vibration type value from {@code ReportedVibration} that best represents this
+         * {@link CombinedVibration}.
+         *
+         * <p>This does not include external vibrations, as those are not represented by a single
+         * vibration effect.
+         */
+        public static int findVibrationType(@Nullable CombinedVibration effect) {
+            if (effect == null) {
+                return FrameworkStatsLog.VIBRATION_REPORTED__VIBRATION_TYPE__SINGLE;
+            }
+            if (effect.hasVendorEffects()) {
+                return FrameworkStatsLog.VIBRATION_REPORTED__VIBRATION_TYPE__VENDOR;
+            }
+            if (effect.getDuration() == Long.MAX_VALUE) {
+                return FrameworkStatsLog.VIBRATION_REPORTED__VIBRATION_TYPE__REPEATED;
+            }
+            return FrameworkStatsLog.VIBRATION_REPORTED__VIBRATION_TYPE__SINGLE;
+        }
     }
 }
diff --git a/services/core/java/com/android/server/vibrator/VibrationStepConductor.java b/services/core/java/com/android/server/vibrator/VibrationStepConductor.java
index 1d52e3c..4bb0c16 100644
--- a/services/core/java/com/android/server/vibrator/VibrationStepConductor.java
+++ b/services/core/java/com/android/server/vibrator/VibrationStepConductor.java
@@ -20,8 +20,6 @@
 import android.annotation.Nullable;
 import android.os.Build;
 import android.os.CombinedVibration;
-import android.os.IBinder;
-import android.os.RemoteException;
 import android.os.VibrationEffect;
 import android.os.vibrator.Flags;
 import android.os.vibrator.PrebakedSegment;
@@ -39,7 +37,6 @@
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.NoSuchElementException;
 import java.util.PriorityQueue;
 import java.util.Queue;
 import java.util.concurrent.CancellationException;
@@ -55,7 +52,7 @@
  * VibrationThread. The only thread-safe methods for calling from other threads are the "notify"
  * methods (which should never be used from the VibrationThread thread).
  */
-final class VibrationStepConductor implements IBinder.DeathRecipient {
+final class VibrationStepConductor {
     private static final boolean DEBUG = VibrationThread.DEBUG;
     private static final String TAG = VibrationThread.TAG;
 
@@ -346,42 +343,6 @@
     }
 
     /**
-     * Binder death notification. VibrationThread registers this when it's running a conductor.
-     * Note that cancellation could theoretically happen immediately, before the conductor has
-     * started, but in this case it will be processed in the first signals loop.
-     */
-    @Override
-    public void binderDied() {
-        if (DEBUG) {
-            Slog.d(TAG, "Binder died, cancelling vibration...");
-        }
-        notifyCancelled(new Vibration.EndInfo(Status.CANCELLED_BINDER_DIED),
-                /* immediate= */ false);
-    }
-
-    /**
-     * Returns true if successfully linked this conductor to the death of the binder that requested
-     * the vibration.
-     */
-    public boolean linkToDeath() {
-        try {
-            mVibration.callerToken.linkToDeath(this, 0);
-        } catch (RemoteException e) {
-            Slog.e(TAG, "Error linking vibration to token death", e);
-            return false;
-        }
-        return true;
-    }
-
-    public void unlinkToDeath() {
-        try {
-            mVibration.callerToken.unlinkToDeath(this, 0);
-        } catch (NoSuchElementException e) {
-            Slog.wtf(TAG, "Failed to unlink vibration to token death", e);
-        }
-    }
-
-    /**
      * Notify the execution that cancellation is requested. This will be acted upon
      * asynchronously in the VibrationThread.
      *
diff --git a/services/core/java/com/android/server/vibrator/VibratorController.java b/services/core/java/com/android/server/vibrator/VibratorController.java
index c120fc7..6aed00e 100644
--- a/services/core/java/com/android/server/vibrator/VibratorController.java
+++ b/services/core/java/com/android/server/vibrator/VibratorController.java
@@ -57,8 +57,7 @@
     // for a snippet of the current known vibrator state/info.
     private volatile VibratorInfo mVibratorInfo;
     private volatile boolean mVibratorInfoLoadSuccessful;
-    private volatile boolean mIsVibrating;
-    private volatile boolean mIsUnderExternalControl;
+    private volatile VibratorState mCurrentState;
     private volatile float mCurrentAmplitude;
 
     /**
@@ -75,6 +74,11 @@
         void onComplete(int vibratorId, long vibrationId);
     }
 
+    /** Representation of the vibrator state based on the interactions through this controller. */
+    private enum VibratorState {
+        IDLE, VIBRATING, UNDER_EXTERNAL_CONTROL
+    }
+
     VibratorController(int vibratorId, OnVibrationCompleteListener listener) {
         this(vibratorId, listener, new NativeWrapper());
     }
@@ -87,6 +91,7 @@
         VibratorInfo.Builder vibratorInfoBuilder = new VibratorInfo.Builder(vibratorId);
         mVibratorInfoLoadSuccessful = mNativeWrapper.getInfo(vibratorInfoBuilder);
         mVibratorInfo = vibratorInfoBuilder.build();
+        mCurrentState = VibratorState.IDLE;
 
         if (!mVibratorInfoLoadSuccessful) {
             Slog.e(TAG,
@@ -106,7 +111,7 @@
                     return false;
                 }
                 // Notify its callback after new client registered.
-                notifyStateListener(listener, mIsVibrating);
+                notifyStateListener(listener, isVibrating(mCurrentState));
             }
             return true;
         } finally {
@@ -166,7 +171,7 @@
      * automatically notified to any registered {@link IVibratorStateListener} on change.
      */
     public boolean isVibrating() {
-        return mIsVibrating;
+        return isVibrating(mCurrentState);
     }
 
     /**
@@ -184,11 +189,6 @@
         return mCurrentAmplitude;
     }
 
-    /** Return {@code true} if this vibrator is under external control, false otherwise. */
-    public boolean isUnderExternalControl() {
-        return mIsUnderExternalControl;
-    }
-
     /**
      * Check against this vibrator capabilities.
      *
@@ -214,7 +214,7 @@
     /**
      * Set the vibrator control to be external or not, based on given flag.
      *
-     * <p>This will affect the state of {@link #isUnderExternalControl()}.
+     * <p>This will affect the state of {@link #isVibrating()}.
      */
     public void setExternalControl(boolean externalControl) {
         Trace.traceBegin(TRACE_TAG_VIBRATOR,
@@ -224,9 +224,11 @@
             if (!mVibratorInfo.hasCapability(IVibrator.CAP_EXTERNAL_CONTROL)) {
                 return;
             }
+            VibratorState newState =
+                    externalControl ? VibratorState.UNDER_EXTERNAL_CONTROL : VibratorState.IDLE;
             synchronized (mLock) {
-                mIsUnderExternalControl = externalControl;
                 mNativeWrapper.setExternalControl(externalControl);
+                updateStateAndNotifyListenersLocked(newState);
             }
         } finally {
             Trace.traceEnd(TRACE_TAG_VIBRATOR);
@@ -264,7 +266,7 @@
                 if (mVibratorInfo.hasCapability(IVibrator.CAP_AMPLITUDE_CONTROL)) {
                     mNativeWrapper.setAmplitude(amplitude);
                 }
-                if (mIsVibrating) {
+                if (mCurrentState == VibratorState.VIBRATING) {
                     mCurrentAmplitude = amplitude;
                 }
             }
@@ -289,7 +291,7 @@
                 long duration = mNativeWrapper.on(milliseconds, vibrationId);
                 if (duration > 0) {
                     mCurrentAmplitude = -1;
-                    notifyListenerOnVibrating(true);
+                    updateStateAndNotifyListenersLocked(VibratorState.VIBRATING);
                 }
                 return duration;
             }
@@ -319,7 +321,7 @@
                         vendorEffect.getAdaptiveScale(), vibrationId);
                 if (duration > 0) {
                     mCurrentAmplitude = -1;
-                    notifyListenerOnVibrating(true);
+                    updateStateAndNotifyListenersLocked(VibratorState.VIBRATING);
                 }
                 return duration;
             } finally {
@@ -346,7 +348,7 @@
                         prebaked.getEffectStrength(), vibrationId);
                 if (duration > 0) {
                     mCurrentAmplitude = -1;
-                    notifyListenerOnVibrating(true);
+                    updateStateAndNotifyListenersLocked(VibratorState.VIBRATING);
                 }
                 return duration;
             }
@@ -374,7 +376,7 @@
                 long duration = mNativeWrapper.compose(primitives, vibrationId);
                 if (duration > 0) {
                     mCurrentAmplitude = -1;
-                    notifyListenerOnVibrating(true);
+                    updateStateAndNotifyListenersLocked(VibratorState.VIBRATING);
                 }
                 return duration;
             }
@@ -402,7 +404,7 @@
                 long duration = mNativeWrapper.composePwle(primitives, braking, vibrationId);
                 if (duration > 0) {
                     mCurrentAmplitude = -1;
-                    notifyListenerOnVibrating(true);
+                    updateStateAndNotifyListenersLocked(VibratorState.VIBRATING);
                 }
                 return duration;
             }
@@ -422,7 +424,7 @@
             synchronized (mLock) {
                 mNativeWrapper.off();
                 mCurrentAmplitude = 0;
-                notifyListenerOnVibrating(false);
+                updateStateAndNotifyListenersLocked(VibratorState.IDLE);
             }
         } finally {
             Trace.traceEnd(TRACE_TAG_VIBRATOR);
@@ -443,9 +445,8 @@
         return "VibratorController{"
                 + "mVibratorInfo=" + mVibratorInfo
                 + ", mVibratorInfoLoadSuccessful=" + mVibratorInfoLoadSuccessful
-                + ", mIsVibrating=" + mIsVibrating
+                + ", mCurrentState=" + mCurrentState.name()
                 + ", mCurrentAmplitude=" + mCurrentAmplitude
-                + ", mIsUnderExternalControl=" + mIsUnderExternalControl
                 + ", mVibratorStateListeners count="
                 + mVibratorStateListeners.getRegisteredCallbackCount()
                 + '}';
@@ -454,8 +455,7 @@
     void dump(IndentingPrintWriter pw) {
         pw.println("Vibrator (id=" + mVibratorInfo.getId() + "):");
         pw.increaseIndent();
-        pw.println("isVibrating = " + mIsVibrating);
-        pw.println("isUnderExternalControl = " + mIsUnderExternalControl);
+        pw.println("currentState = " + mCurrentState.name());
         pw.println("currentAmplitude = " + mCurrentAmplitude);
         pw.println("vibratorInfoLoadSuccessful = " + mVibratorInfoLoadSuccessful);
         pw.println("vibratorStateListener size = "
@@ -464,14 +464,19 @@
         pw.decreaseIndent();
     }
 
+    /**
+     * Updates current vibrator state and notify listeners if {@link #isVibrating()} result changed.
+     */
     @GuardedBy("mLock")
-    private void notifyListenerOnVibrating(boolean isVibrating) {
-        if (mIsVibrating != isVibrating) {
-            mIsVibrating = isVibrating;
+    private void updateStateAndNotifyListenersLocked(VibratorState state) {
+        boolean previousIsVibrating = isVibrating(mCurrentState);
+        final boolean newIsVibrating = isVibrating(state);
+        mCurrentState = state;
+        if (previousIsVibrating != newIsVibrating) {
             // The broadcast method is safe w.r.t. register/unregister listener methods, but lock
             // is required here to guarantee delivery order.
             mVibratorStateListeners.broadcast(
-                    listener -> notifyStateListener(listener, isVibrating));
+                    listener -> notifyStateListener(listener, newIsVibrating));
         }
     }
 
@@ -483,6 +488,11 @@
         }
     }
 
+    /** Returns true only if given state is not {@link VibratorState#IDLE}. */
+    private static boolean isVibrating(VibratorState state) {
+        return state != VibratorState.IDLE;
+    }
+
     /** Wrapper around the static-native methods of {@link VibratorController} for tests. */
     @VisibleForTesting
     public static class NativeWrapper {
diff --git a/services/core/java/com/android/server/vibrator/VibratorManagerService.java b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
index 95c6483..9b7bdec 100644
--- a/services/core/java/com/android/server/vibrator/VibratorManagerService.java
+++ b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
@@ -51,7 +51,6 @@
 import android.os.ServiceManager;
 import android.os.ShellCallback;
 import android.os.ShellCommand;
-import android.os.SystemClock;
 import android.os.Trace;
 import android.os.VibrationAttributes;
 import android.os.VibrationEffect;
@@ -159,9 +158,9 @@
     @GuardedBy("mLock")
     private final SparseArray<AlwaysOnVibration> mAlwaysOnEffects = new SparseArray<>();
     @GuardedBy("mLock")
-    private VibrationStepConductor mCurrentVibration;
+    private SingleVibrationSession mCurrentVibration;
     @GuardedBy("mLock")
-    private VibrationStepConductor mNextVibration;
+    private SingleVibrationSession mNextVibration;
     @GuardedBy("mLock")
     private ExternalVibrationSession mCurrentExternalVibration;
     @GuardedBy("mLock")
@@ -188,24 +187,20 @@
                     // When the system is entering a non-interactive state, we want to cancel
                     // vibrations in case a misbehaving app has abandoned them.
                     if (shouldCancelOnScreenOffLocked(mNextVibration)) {
-                        clearNextVibrationLocked(new Vibration.EndInfo(
-                                Status.CANCELLED_BY_SCREEN_OFF));
+                        clearNextVibrationLocked(Status.CANCELLED_BY_SCREEN_OFF);
                     }
                     if (shouldCancelOnScreenOffLocked(mCurrentVibration)) {
-                        mCurrentVibration.notifyCancelled(new Vibration.EndInfo(
-                                Status.CANCELLED_BY_SCREEN_OFF), /* immediate= */ false);
+                        mCurrentVibration.requestEnd(Status.CANCELLED_BY_SCREEN_OFF);
                     }
                 }
             } else if (android.multiuser.Flags.addUiForSoundsFromBackgroundUsers()
                     && intent.getAction().equals(BackgroundUserSoundNotifier.ACTION_MUTE_SOUND)) {
                 synchronized (mLock) {
                     if (shouldCancelOnFgUserRequest(mNextVibration)) {
-                        clearNextVibrationLocked(new Vibration.EndInfo(
-                                Status.CANCELLED_BY_FOREGROUND_USER));
+                        clearNextVibrationLocked(Status.CANCELLED_BY_FOREGROUND_USER);
                     }
                     if (shouldCancelOnFgUserRequest(mCurrentVibration)) {
-                        mCurrentVibration.notifyCancelled(new Vibration.EndInfo(
-                                Status.CANCELLED_BY_FOREGROUND_USER), /* immediate= */ false);
+                        mCurrentVibration.requestEnd(Status.CANCELLED_BY_FOREGROUND_USER);
                     }
                 }
             }
@@ -222,12 +217,10 @@
                     }
                     synchronized (mLock) {
                         if (shouldCancelAppOpModeChangedLocked(mNextVibration)) {
-                            clearNextVibrationLocked(new Vibration.EndInfo(
-                                    Status.CANCELLED_BY_APP_OPS));
+                            clearNextVibrationLocked(Status.CANCELLED_BY_APP_OPS);
                         }
                         if (shouldCancelAppOpModeChangedLocked(mCurrentVibration)) {
-                            mCurrentVibration.notifyCancelled(new Vibration.EndInfo(
-                                    Status.CANCELLED_BY_APP_OPS), /* immediate= */ false);
+                            mCurrentVibration.requestEnd(Status.CANCELLED_BY_APP_OPS);
                         }
                     }
                 }
@@ -602,8 +595,9 @@
             return null;
         }
         // Create Vibration.Stats as close to the received request as possible, for tracking.
-        HalVibration vib = new HalVibration(token, effect, callerInfo);
-        fillVibrationFallbacks(vib, effect);
+        SingleVibrationSession session = new SingleVibrationSession(token, callerInfo, effect);
+        HalVibration vib = session.getVibration();
+        vib.fillFallbacks(mVibrationSettings::getFallbackEffect);
 
         if (attrs.isFlagSet(VibrationAttributes.FLAG_INVALIDATE_SETTINGS_CACHE)) {
             // Force update of user settings before checking if this vibration effect should
@@ -617,21 +611,26 @@
             }
 
             // Check if user settings or DnD is set to ignore this vibration.
-            Vibration.EndInfo vibrationEndInfo = shouldIgnoreVibrationLocked(vib.callerInfo);
+            Status ignoreStatus = shouldIgnoreVibrationLocked(callerInfo);
+            CallerInfo ignoredBy = null;
 
             // Check if ongoing vibration is more important than this vibration.
-            if (vibrationEndInfo == null) {
-                vibrationEndInfo = shouldIgnoreVibrationForOngoingLocked(vib);
+            if (ignoreStatus == null) {
+                Vibration.EndInfo vibrationEndInfo = shouldIgnoreVibrationForOngoingLocked(session);
+                if (vibrationEndInfo != null) {
+                    ignoreStatus = vibrationEndInfo.status;
+                    ignoredBy = vibrationEndInfo.endedBy;
+                }
             }
 
             // If not ignored so far then try to start this vibration.
-            if (vibrationEndInfo == null) {
+            if (ignoreStatus == null) {
                 final long ident = Binder.clearCallingIdentity();
                 try {
                     if (mCurrentExternalVibration != null) {
                         vib.stats.reportInterruptedAnotherVibration(
                                 mCurrentExternalVibration.getCallerInfo());
-                        endExternalVibrateLocked(Status.CANCELLED_SUPERSEDED, vib.callerInfo,
+                        endExternalVibrateLocked(Status.CANCELLED_SUPERSEDED, callerInfo,
                                 /* continueExternalControl= */ false);
                     } else if (mCurrentVibration != null) {
                         if (mCurrentVibration.getVibration().canPipelineWith(vib)) {
@@ -645,21 +644,19 @@
                         } else {
                             vib.stats.reportInterruptedAnotherVibration(
                                     mCurrentVibration.getVibration().callerInfo);
-                            mCurrentVibration.notifyCancelled(
-                                    new Vibration.EndInfo(Status.CANCELLED_SUPERSEDED,
-                                            vib.callerInfo),
+                            mCurrentVibration.requestEnd(Status.CANCELLED_SUPERSEDED, callerInfo,
                                     /* immediate= */ false);
                         }
                     }
-                    vibrationEndInfo = startVibrationLocked(vib);
+                    ignoreStatus = startVibrationLocked(session);
                 } finally {
                     Binder.restoreCallingIdentity(ident);
                 }
             }
 
             // Ignored or failed to start the vibration, end it and report metrics right away.
-            if (vibrationEndInfo != null) {
-                endVibrationLocked(vib, vibrationEndInfo);
+            if (ignoreStatus != null) {
+                endVibrationLocked(session, ignoreStatus, ignoredBy);
             }
             return vib;
         }
@@ -677,27 +674,18 @@
                 if (DEBUG) {
                     Slog.d(TAG, "Canceling vibration");
                 }
-                Vibration.EndInfo cancelledByUserInfo =
-                        new Vibration.EndInfo(Status.CANCELLED_BY_USER);
                 final long ident = Binder.clearCallingIdentity();
                 try {
-                    if (mNextVibration != null
-                            && shouldCancelVibration(mNextVibration.getVibration(),
-                            usageFilter, token)) {
-                        clearNextVibrationLocked(cancelledByUserInfo);
+                    if (shouldCancelVibration(mNextVibration, usageFilter, token)) {
+                        clearNextVibrationLocked(Status.CANCELLED_BY_USER);
                     }
-                    if (mCurrentVibration != null
-                            && shouldCancelVibration(mCurrentVibration.getVibration(),
-                            usageFilter, token)) {
-                        mCurrentVibration.notifyCancelled(
-                                cancelledByUserInfo, /* immediate= */false);
+                    if (shouldCancelVibration(mCurrentVibration, usageFilter, token)) {
+                        mCurrentVibration.requestEnd(Status.CANCELLED_BY_USER);
                     }
-                    if (mCurrentExternalVibration != null
-                            && shouldCancelVibration(
-                            mCurrentExternalVibration.getCallerInfo().attrs,
-                            usageFilter)) {
-                        endExternalVibrateLocked(cancelledByUserInfo.status,
-                                cancelledByUserInfo.endedBy, /* continueExternalControl= */ false);
+                    // TODO(b/370948466): investigate why token is not checked here and fix it.
+                    if (shouldCancelVibration(mCurrentExternalVibration, usageFilter, null)) {
+                        endExternalVibrateLocked(Status.CANCELLED_BY_USER,
+                                /* endedBy= */ null, /* continueExternalControl= */ false);
                     }
                 } finally {
                     Binder.restoreCallingIdentity(ident);
@@ -809,17 +797,9 @@
                 mCurrentExternalVibration.getDebugInfo().dump(proto,
                         VibratorManagerServiceDumpProto.CURRENT_EXTERNAL_VIBRATION);
             }
-
-            boolean isVibrating = false;
-            boolean isUnderExternalControl = false;
             for (int i = 0; i < mVibrators.size(); i++) {
                 proto.write(VibratorManagerServiceDumpProto.VIBRATOR_IDS, mVibrators.keyAt(i));
-                isVibrating |= mVibrators.valueAt(i).isVibrating();
-                isUnderExternalControl |= mVibrators.valueAt(i).isUnderExternalControl();
             }
-            proto.write(VibratorManagerServiceDumpProto.IS_VIBRATING, isVibrating);
-            proto.write(VibratorManagerServiceDumpProto.VIBRATOR_UNDER_EXTERNAL_CONTROL,
-                    isUnderExternalControl);
         }
         mVibratorManagerRecords.dump(proto);
         mVibratorControlService.dump(proto);
@@ -850,18 +830,13 @@
                 return;
             }
 
-            HalVibration vib = mCurrentVibration.getVibration();
-            Vibration.EndInfo vibrationEndInfo = shouldIgnoreVibrationLocked(vib.callerInfo);
-
-            if (inputDevicesChanged || (vibrationEndInfo != null)) {
+            Status ignoreStatus = shouldIgnoreVibrationLocked(mCurrentVibration.getCallerInfo());
+            if (inputDevicesChanged || (ignoreStatus != null)) {
                 if (DEBUG) {
                     Slog.d(TAG, "Canceling vibration because settings changed: "
-                            + (inputDevicesChanged ? "input devices changed"
-                            : vibrationEndInfo.status));
+                            + (inputDevicesChanged ? "input devices changed" : ignoreStatus));
                 }
-                mCurrentVibration.notifyCancelled(
-                        new Vibration.EndInfo(Status.CANCELLED_BY_SETTINGS_UPDATE),
-                        /* immediate= */ false);
+                mCurrentVibration.requestEnd(Status.CANCELLED_BY_SETTINGS_UPDATE);
             }
         }
     }
@@ -881,8 +856,8 @@
             if (vibrator == null) {
                 continue;
             }
-            Vibration.EndInfo vibrationEndInfo = shouldIgnoreVibrationLocked(vib.callerInfo);
-            if (vibrationEndInfo == null) {
+            Status ignoreStatus = shouldIgnoreVibrationLocked(vib.callerInfo);
+            if (ignoreStatus == null) {
                 effect = mVibrationScaler.scale(effect, vib.callerInfo.attrs.getUsage());
             } else {
                 // Vibration should not run, use null effect to remove registered effect.
@@ -894,25 +869,21 @@
 
     @GuardedBy("mLock")
     @Nullable
-    private Vibration.EndInfo startVibrationLocked(HalVibration vib) {
+    private Status startVibrationLocked(SingleVibrationSession session) {
         Trace.traceBegin(TRACE_TAG_VIBRATOR, "startVibrationLocked");
         try {
             if (mInputDeviceDelegate.isAvailable()) {
-                return startVibrationOnInputDevicesLocked(vib);
+                return startVibrationOnInputDevicesLocked(session.getVibration());
             }
-
-            VibrationStepConductor conductor = createVibrationStepConductor(vib);
-
             if (mCurrentVibration == null) {
-                return startVibrationOnThreadLocked(conductor);
+                return startVibrationOnThreadLocked(session);
             }
             // If there's already a vibration queued (waiting for the previous one to finish
             // cancelling), end it cleanly and replace it with the new one.
             // Note that we don't consider pipelining here, because new pipelined ones should
             // replace pending non-executing pipelined ones anyway.
-            clearNextVibrationLocked(
-                    new Vibration.EndInfo(Status.IGNORED_SUPERSEDED, vib.callerInfo));
-            mNextVibration = conductor;
+            clearNextVibrationLocked(Status.IGNORED_SUPERSEDED, session.getCallerInfo());
+            mNextVibration = session;
             return null;
         } finally {
             Trace.traceEnd(TRACE_TAG_VIBRATOR);
@@ -921,50 +892,45 @@
 
     @GuardedBy("mLock")
     @Nullable
-    private Vibration.EndInfo startVibrationOnThreadLocked(VibrationStepConductor conductor) {
-        HalVibration vib = conductor.getVibration();
-        int mode = startAppOpModeLocked(vib.callerInfo);
+    private Status startVibrationOnThreadLocked(SingleVibrationSession session) {
+        VibrationStepConductor conductor = createVibrationStepConductor(session.getVibration());
+        session.setVibrationConductor(conductor);
+        int mode = startAppOpModeLocked(session.getCallerInfo());
         switch (mode) {
             case AppOpsManager.MODE_ALLOWED:
                 Trace.asyncTraceBegin(TRACE_TAG_VIBRATOR, "vibration", 0);
                 // Make sure mCurrentVibration is set while triggering the VibrationThread.
-                mCurrentVibration = conductor;
-                if (!mCurrentVibration.linkToDeath()) {
+                mCurrentVibration = session;
+                if (!mCurrentVibration.linkToDeath(null)) {
                     // Shouldn't happen. The method call already logs a wtf.
                     mCurrentVibration = null;  // Aborted.
-                    return new Vibration.EndInfo(Status.IGNORED_ERROR_TOKEN);
+                    return Status.IGNORED_ERROR_TOKEN;
                 }
-                if (!mVibrationThread.runVibrationOnVibrationThread(mCurrentVibration)) {
+                if (!mVibrationThread.runVibrationOnVibrationThread(conductor)) {
                     // Shouldn't happen. The method call already logs a wtf.
+                    mCurrentVibration.setVibrationConductor(null);
                     mCurrentVibration = null;  // Aborted.
-                    return new Vibration.EndInfo(Status.IGNORED_ERROR_SCHEDULING);
+                    return Status.IGNORED_ERROR_SCHEDULING;
                 }
                 return null;
             case AppOpsManager.MODE_ERRORED:
                 Slog.w(TAG, "Start AppOpsManager operation errored for uid "
-                        + vib.callerInfo.uid);
-                return new Vibration.EndInfo(Status.IGNORED_ERROR_APP_OPS);
+                        + session.getCallerInfo().uid);
+                return Status.IGNORED_ERROR_APP_OPS;
             default:
-                return new Vibration.EndInfo(Status.IGNORED_APP_OPS);
+                return Status.IGNORED_APP_OPS;
         }
     }
 
     @GuardedBy("mLock")
-    private void endVibrationLocked(Vibration vib, Status status) {
-        endVibrationLocked(vib, new Vibration.EndInfo(status));
+    private void endVibrationLocked(VibrationSession session, Status status) {
+        endVibrationLocked(session, status, /* endedBy= */ null);
     }
 
     @GuardedBy("mLock")
-    private void endVibrationLocked(Vibration vib, Vibration.EndInfo vibrationEndInfo) {
-        vib.end(vibrationEndInfo);
-        reportEndedVibrationLocked(vib);
-    }
-
-    @GuardedBy("mLock")
-    private void reportEndedVibrationLocked(Vibration vib) {
-        logAndRecordVibration(vib.getDebugInfo());
-        mFrameworkStatsLogger.writeVibrationReportedAsync(
-                vib.getStatsInfo(/* completionUptimeMillis= */ SystemClock.uptimeMillis()));
+    private void endVibrationLocked(VibrationSession session, Status status, CallerInfo endedBy) {
+        session.requestEnd(status, endedBy, /* immediate= */ false);
+        logAndRecordVibration(session.getDebugInfo());
     }
 
     private VibrationStepConductor createVibrationStepConductor(HalVibration vib) {
@@ -983,12 +949,11 @@
                 mFrameworkStatsLogger, requestVibrationParamsFuture, mVibrationThreadCallbacks);
     }
 
-    private Vibration.EndInfo startVibrationOnInputDevicesLocked(HalVibration vib) {
+    private Status startVibrationOnInputDevicesLocked(HalVibration vib) {
         // Scale resolves the default amplitudes from the effect before scaling them.
         vib.scaleEffects(mVibrationScaler);
         mInputDeviceDelegate.vibrateIfAvailable(vib.callerInfo, vib.getEffectToPlay());
-
-        return new Vibration.EndInfo(Status.FORWARDED_TO_INPUT_DEVICES);
+        return Status.FORWARDED_TO_INPUT_DEVICES;
     }
 
     private void logAndRecordPerformHapticFeedbackAttempt(int uid, int deviceId, String opPkg,
@@ -1002,9 +967,10 @@
     private void logAndRecordVibrationAttempt(@Nullable CombinedVibration effect,
             CallerInfo callerInfo, Status status) {
         logAndRecordVibration(
-                new Vibration.DebugInfoImpl(status, new VibrationStats(),
+                new Vibration.DebugInfoImpl(status, callerInfo,
+                        VibrationStats.StatsInfo.findVibrationType(effect), new VibrationStats(),
                         effect, /* originalEffect= */ null, VibrationScaler.SCALE_NONE,
-                        VibrationScaler.ADAPTIVE_SCALE_NONE, callerInfo));
+                        VibrationScaler.ADAPTIVE_SCALE_NONE));
     }
 
     private void logAndRecordVibration(DebugInfo info) {
@@ -1058,39 +1024,25 @@
         }
     }
 
-    @GuardedBy("mLock")
-    private void reportFinishedVibrationLocked() {
-        Trace.asyncTraceEnd(Trace.TRACE_TAG_VIBRATOR, "vibration", 0);
-        mCurrentVibration.unlinkToDeath();
-        HalVibration vib = mCurrentVibration.getVibration();
-        if (DEBUG) {
-            Slog.d(TAG, "Reporting vibration " + vib.id + " finished with " + vib.getStatus());
-        }
-        finishAppOpModeLocked(vib.callerInfo);
-        reportEndedVibrationLocked(vib);
-    }
-
     private void onSyncedVibrationComplete(long vibrationId) {
         synchronized (mLock) {
-            if (mCurrentVibration != null
-                    && mCurrentVibration.getVibration().id == vibrationId) {
+            if (mCurrentVibration != null) {
                 if (DEBUG) {
                     Slog.d(TAG, "Synced vibration " + vibrationId + " complete, notifying thread");
                 }
-                mCurrentVibration.notifySyncedVibrationComplete();
+                mCurrentVibration.notifySyncedVibratorsCallback(vibrationId);
             }
         }
     }
 
     private void onVibrationComplete(int vibratorId, long vibrationId) {
         synchronized (mLock) {
-            if (mCurrentVibration != null
-                    && mCurrentVibration.getVibration().id == vibrationId) {
+            if (mCurrentVibration != null) {
                 if (DEBUG) {
                     Slog.d(TAG, "Vibration " + vibrationId + " on vibrator " + vibratorId
                             + " complete, notifying thread");
                 }
-                mCurrentVibration.notifyVibratorComplete(vibratorId);
+                mCurrentVibration.notifyVibratorCallback(vibratorId, vibrationId);
             }
         }
     }
@@ -1102,14 +1054,14 @@
      */
     @GuardedBy("mLock")
     @Nullable
-    private Vibration.EndInfo shouldIgnoreVibrationForOngoingLocked(Vibration vib) {
+    private Vibration.EndInfo shouldIgnoreVibrationForOngoingLocked(VibrationSession session) {
         if (mCurrentExternalVibration != null) {
-            return shouldIgnoreVibrationForOngoing(vib, mCurrentExternalVibration);
+            return shouldIgnoreVibrationForOngoing(session, mCurrentExternalVibration);
         }
 
         if (mNextVibration != null) {
-            Vibration.EndInfo vibrationEndInfo = shouldIgnoreVibrationForOngoing(vib,
-                    mNextVibration.getVibration());
+            Vibration.EndInfo vibrationEndInfo = shouldIgnoreVibrationForOngoing(session,
+                    mNextVibration);
             if (vibrationEndInfo != null) {
                 // Next vibration has higher importance than the new one, so the new vibration
                 // should be ignored.
@@ -1118,14 +1070,12 @@
         }
 
         if (mCurrentVibration != null) {
-            HalVibration currentVibration = mCurrentVibration.getVibration();
-            if (currentVibration.hasEnded() || mCurrentVibration.wasNotifiedToCancel()) {
-                // Current vibration has ended or is cancelling, should not block incoming
-                // vibrations.
+            if (mCurrentVibration.wasEndRequested()) {
+                // Current session has ended or is cancelling, should not block incoming vibrations.
                 return null;
             }
 
-            return shouldIgnoreVibrationForOngoing(vib, currentVibration);
+            return shouldIgnoreVibrationForOngoing(session, mCurrentVibration);
         }
 
         return null;
@@ -1133,32 +1083,33 @@
 
     /**
      * Checks if the ongoing vibration has higher importance than the new one. If they have similar
-     * importance, then {@link Vibration#isRepeating()} is used as a tiebreaker.
+     * importance, then {@link VibrationSession#isRepeating()} is used as a tiebreaker.
      *
      * @return a Vibration.EndInfo if the vibration should be ignored, null otherwise.
      */
     @Nullable
     private static Vibration.EndInfo shouldIgnoreVibrationForOngoing(
-            @NonNull Vibration newVibration, @NonNull Vibration ongoingVibration) {
+            @NonNull VibrationSession newSession, @NonNull VibrationSession ongoingSession) {
 
-        int newVibrationImportance = getVibrationImportance(newVibration);
-        int ongoingVibrationImportance = getVibrationImportance(ongoingVibration);
+        int newSessionImportance = getVibrationImportance(newSession);
+        int ongoingSessionImportance = getVibrationImportance(ongoingSession);
 
-        if (newVibrationImportance > ongoingVibrationImportance) {
+        if (newSessionImportance > ongoingSessionImportance) {
             // New vibration has higher importance and should not be ignored.
             return null;
         }
 
-        if (ongoingVibrationImportance > newVibrationImportance) {
+        if (ongoingSessionImportance > newSessionImportance) {
             // Existing vibration has higher importance and should not be cancelled.
             return new Vibration.EndInfo(Status.IGNORED_FOR_HIGHER_IMPORTANCE,
-                    ongoingVibration.callerInfo);
+                    ongoingSession.getCallerInfo());
         }
 
         // Same importance, use repeating as a tiebreaker.
-        if (ongoingVibration.isRepeating() && !newVibration.isRepeating()) {
+        if (ongoingSession.isRepeating() && !newSession.isRepeating()) {
             // Ongoing vibration is repeating and new one is not, give priority to ongoing
-            return new Vibration.EndInfo(Status.IGNORED_FOR_ONGOING, ongoingVibration.callerInfo);
+            return new Vibration.EndInfo(Status.IGNORED_FOR_ONGOING,
+                    ongoingSession.getCallerInfo());
         }
         // New vibration is repeating or this is a complete tie between them,
         // give priority to new vibration.
@@ -1172,10 +1123,10 @@
      * @return a numeric representation for the vibration importance, larger values represent a
      * higher importance
      */
-    private static int getVibrationImportance(Vibration vibration) {
-        int usage = vibration.callerInfo.attrs.getUsage();
+    private static int getVibrationImportance(VibrationSession session) {
+        int usage = session.getCallerInfo().attrs.getUsage();
         if (usage == VibrationAttributes.USAGE_UNKNOWN) {
-            if (vibration.isRepeating()) {
+            if (session.isRepeating()) {
                 usage = VibrationAttributes.USAGE_RINGTONE;
             } else {
                 usage = VibrationAttributes.USAGE_TOUCH;
@@ -1209,10 +1160,10 @@
      */
     @GuardedBy("mLock")
     @Nullable
-    private Vibration.EndInfo shouldIgnoreVibrationLocked(CallerInfo callerInfo) {
+    private Status shouldIgnoreVibrationLocked(CallerInfo callerInfo) {
         Status statusFromSettings = mVibrationSettings.shouldIgnoreVibration(callerInfo);
         if (statusFromSettings != null) {
-            return new Vibration.EndInfo(statusFromSettings);
+            return statusFromSettings;
         }
 
         int mode = checkAppOpModeLocked(callerInfo);
@@ -1220,9 +1171,9 @@
             if (mode == AppOpsManager.MODE_ERRORED) {
                 // We might be getting calls from within system_server, so we don't actually
                 // want to throw a SecurityException here.
-                return new Vibration.EndInfo(Status.IGNORED_ERROR_APP_OPS);
+                return Status.IGNORED_ERROR_APP_OPS;
             } else {
-                return new Vibration.EndInfo(Status.IGNORED_APP_OPS);
+                return Status.IGNORED_APP_OPS;
             }
         }
 
@@ -1247,32 +1198,29 @@
     /**
      * Return true if the vibration has the same token and usage belongs to given usage class.
      *
-     * @param vib         The ongoing or pending vibration to be cancelled.
+     * @param session     The ongoing or pending vibration session to be cancelled.
      * @param usageFilter The vibration usages to be cancelled, any bitwise combination of
      *                    VibrationAttributes.USAGE_* values.
-     * @param token       The binder token to identify the vibration origin. Only vibrations
+     * @param tokenFilter The binder token to identify the vibration origin. Only vibrations
      *                    started with the same token can be cancelled with it.
      */
-    private boolean shouldCancelVibration(HalVibration vib, int usageFilter, IBinder token) {
-        return (vib.callerToken == token) && shouldCancelVibration(vib.callerInfo.attrs,
-                usageFilter);
-    }
-
-    /**
-     * Return true if the external vibration usage belongs to given usage class.
-     *
-     * @param attrs       The attributes of an ongoing or pending vibration to be cancelled.
-     * @param usageFilter The vibration usages to be cancelled, any bitwise combination of
-     *                    VibrationAttributes.USAGE_* values.
-     */
-    private boolean shouldCancelVibration(VibrationAttributes attrs, int usageFilter) {
-        if (attrs.getUsage() == VibrationAttributes.USAGE_UNKNOWN) {
+    private boolean shouldCancelVibration(@Nullable VibrationSession session, int usageFilter,
+            @Nullable IBinder tokenFilter) {
+        if (session == null) {
+            return false;
+        }
+        if ((tokenFilter != null) && (tokenFilter != session.getCallerToken())) {
+            // Vibration from a different app, this should not cancel it.
+            return false;
+        }
+        int usage = session.getCallerInfo().attrs.getUsage();
+        if (usage == VibrationAttributes.USAGE_UNKNOWN) {
             // Special case, usage UNKNOWN would match all filters. Instead it should only match if
             // it's cancelling that usage specifically, or if cancelling all usages.
             return usageFilter == VibrationAttributes.USAGE_UNKNOWN
                     || usageFilter == VibrationAttributes.USAGE_FILTER_MATCH_ALL;
         }
-        return (usageFilter & attrs.getUsage()) == attrs.getUsage();
+        return (usageFilter & usage) == usage;
     }
 
     /**
@@ -1348,45 +1296,6 @@
     }
 
     /**
-     * Sets fallback effects to all prebaked ones in given combination of effects, based on {@link
-     * VibrationSettings#getFallbackEffect}.
-     */
-    private void fillVibrationFallbacks(HalVibration vib, CombinedVibration effect) {
-        if (effect instanceof CombinedVibration.Mono) {
-            fillVibrationFallbacks(vib, ((CombinedVibration.Mono) effect).getEffect());
-        } else if (effect instanceof CombinedVibration.Stereo) {
-            SparseArray<VibrationEffect> effects =
-                    ((CombinedVibration.Stereo) effect).getEffects();
-            for (int i = 0; i < effects.size(); i++) {
-                fillVibrationFallbacks(vib, effects.valueAt(i));
-            }
-        } else if (effect instanceof CombinedVibration.Sequential) {
-            List<CombinedVibration> effects =
-                    ((CombinedVibration.Sequential) effect).getEffects();
-            for (int i = 0; i < effects.size(); i++) {
-                fillVibrationFallbacks(vib, effects.get(i));
-            }
-        }
-    }
-
-    private void fillVibrationFallbacks(HalVibration vib, VibrationEffect effect) {
-        if (!(effect instanceof VibrationEffect.Composed composed)) {
-            return;
-        }
-        int segmentCount = composed.getSegments().size();
-        for (int i = 0; i < segmentCount; i++) {
-            VibrationEffectSegment segment = composed.getSegments().get(i);
-            if (segment instanceof PrebakedSegment prebaked) {
-                VibrationEffect fallback = mVibrationSettings.getFallbackEffect(
-                        prebaked.getEffectId());
-                if (prebaked.shouldFallback() && fallback != null) {
-                    vib.addFallback(prebaked.getEffectId(), fallback);
-                }
-            }
-        }
-    }
-
-    /**
      * Return new {@link VibrationAttributes} that only applies flags that this user has permissions
      * to use.
      */
@@ -1483,30 +1392,28 @@
     }
 
     @GuardedBy("mLock")
-    private boolean shouldCancelOnScreenOffLocked(@Nullable VibrationStepConductor conductor) {
-        if (conductor == null) {
+    private boolean shouldCancelOnScreenOffLocked(@Nullable VibrationSession session) {
+        if (session == null) {
             return false;
         }
-        HalVibration vib = conductor.getVibration();
-        return mVibrationSettings.shouldCancelVibrationOnScreenOff(vib.callerInfo,
-                vib.stats.getCreateUptimeMillis());
+        return mVibrationSettings.shouldCancelVibrationOnScreenOff(session.getCallerInfo(),
+                session.getCreateUptimeMillis());
     }
 
     @GuardedBy("mLock")
-    private boolean shouldCancelAppOpModeChangedLocked(@Nullable VibrationStepConductor conductor) {
-        if (conductor == null) {
+    private boolean shouldCancelAppOpModeChangedLocked(@Nullable VibrationSession session) {
+        if (session == null) {
             return false;
         }
-        return checkAppOpModeLocked(conductor.getVibration().callerInfo)
-                != AppOpsManager.MODE_ALLOWED;
+        return checkAppOpModeLocked(session.getCallerInfo()) != AppOpsManager.MODE_ALLOWED;
     }
 
     @GuardedBy("mLock")
-    private boolean shouldCancelOnFgUserRequest(@Nullable VibrationStepConductor conductor) {
-        if (conductor == null) {
+    private boolean shouldCancelOnFgUserRequest(@Nullable VibrationSession session) {
+        if (session == null) {
             return false;
         }
-        return conductor.getVibration().callerInfo.attrs.getUsageClass() == USAGE_CLASS_ALARM;
+        return session.getCallerInfo().attrs.getUsageClass() == USAGE_CLASS_ALARM;
     }
 
     @GuardedBy("mLock")
@@ -1668,17 +1575,21 @@
                     }
                     if (mCurrentVibration != null) {
                         // This is when we consider the current vibration complete, report metrics.
-                        reportFinishedVibrationLocked();
+                        if (DEBUG) {
+                            Slog.d(TAG, "Reporting vibration " + vibrationId + " finished.");
+                        }
+                        mCurrentVibration.unlinkToDeath();
+                        finishAppOpModeLocked(mCurrentVibration.getCallerInfo());
+                        logAndRecordVibration(mCurrentVibration.getDebugInfo());
+                        Trace.asyncTraceEnd(Trace.TRACE_TAG_VIBRATOR, "vibration", 0);
                         mCurrentVibration = null;
                     }
                     if (mNextVibration != null) {
-                        VibrationStepConductor nextConductor = mNextVibration;
+                        SingleVibrationSession nextVibration = mNextVibration;
                         mNextVibration = null;
-                        Vibration.EndInfo vibrationEndInfo = startVibrationOnThreadLocked(
-                                nextConductor);
-                        if (vibrationEndInfo != null) {
-                            // Failed to start the vibration, end it and report metrics right away.
-                            endVibrationLocked(nextConductor.getVibration(), vibrationEndInfo);
+                        Status startErrorStatus = startVibrationOnThreadLocked(nextVibration);
+                        if (startErrorStatus != null) {
+                            endVibrationLocked(nextVibration, startErrorStatus);
                         }
                     }
                 }
@@ -1900,17 +1811,22 @@
             mInfo.dump(proto, fieldId);
         }
     }
+    /** Clears mNextVibration if set, ending it cleanly */
+    @GuardedBy("mLock")
+    private void clearNextVibrationLocked(Status status) {
+        clearNextVibrationLocked(status, /* endedBy= */ null);
+    }
 
     /** Clears mNextVibration if set, ending it cleanly */
     @GuardedBy("mLock")
-    private void clearNextVibrationLocked(Vibration.EndInfo vibrationEndInfo) {
+    private void clearNextVibrationLocked(Status status, CallerInfo endedBy) {
         if (mNextVibration != null) {
             if (DEBUG) {
-                Slog.d(TAG, "Dropping pending vibration " + mNextVibration.getVibration().id
-                        + " with end info: " + vibrationEndInfo);
+                Slog.d(TAG, "Dropping pending vibration from " + mNextVibration.getCallerInfo()
+                        + " with status: " + status);
             }
             // Clearing next vibration before playing it, end it and report metrics right away.
-            endVibrationLocked(mNextVibration.getVibration(), vibrationEndInfo);
+            endVibrationLocked(mNextVibration, status, endedBy);
             mNextVibration = null;
         }
     }
@@ -1935,7 +1851,7 @@
             setExternalControl(false, mCurrentExternalVibration.stats);
         }
         // The external control was turned off, end it and report metrics right away.
-        reportEndedVibrationLocked(mCurrentExternalVibration);
+        logAndRecordVibration(mCurrentExternalVibration.getDebugInfo());
         mCurrentExternalVibration = null;
     }
 
@@ -1995,16 +1911,16 @@
             try {
                 // Create Vibration.Stats as close to the received request as possible, for
                 // tracking.
-                ExternalVibrationSession externalVibration = new ExternalVibrationSession(vib);
+                ExternalVibrationSession session = new ExternalVibrationSession(vib);
                 // Mute the request until we run all the checks and accept the vibration.
-                externalVibration.muteScale();
+                session.muteScale();
                 boolean alreadyUnderExternalControl = false;
                 boolean waitForCompletion = false;
 
                 synchronized (mLock) {
                     if (!hasExternalControlCapability()) {
-                        endVibrationLocked(externalVibration, Status.IGNORED_UNSUPPORTED);
-                        return externalVibration.getScale();
+                        endVibrationLocked(session, Status.IGNORED_UNSUPPORTED);
+                        return session.getScale();
                     }
 
                     if (ActivityManager.checkComponentPermission(
@@ -2014,29 +1930,30 @@
                         Slog.w(TAG, "pkg=" + vib.getPackage() + ", uid=" + vib.getUid()
                                 + " tried to play externally controlled vibration"
                                 + " without VIBRATE permission, ignoring.");
-                        endVibrationLocked(externalVibration, Status.IGNORED_MISSING_PERMISSION);
-                        return externalVibration.getScale();
+                        endVibrationLocked(session, Status.IGNORED_MISSING_PERMISSION);
+                        return session.getScale();
                     }
 
-                    Vibration.EndInfo vibrationEndInfo = shouldIgnoreVibrationLocked(
-                            externalVibration.callerInfo);
+                    Status ignoreStatus = shouldIgnoreVibrationLocked(session.callerInfo);
+                    if (ignoreStatus != null) {
+                        endVibrationLocked(session, ignoreStatus);
+                        return session.getScale();
+                    }
 
-                    if (vibrationEndInfo == null
-                            && mCurrentExternalVibration != null
+                    if (mCurrentExternalVibration != null
                             && mCurrentExternalVibration.isHoldingSameVibration(vib)) {
                         // We are already playing this external vibration, so we can return the same
                         // scale calculated in the previous call to this method.
                         return mCurrentExternalVibration.getScale();
                     }
 
-                    if (vibrationEndInfo == null) {
-                        // Check if ongoing vibration is more important than this vibration.
-                        vibrationEndInfo = shouldIgnoreVibrationForOngoingLocked(externalVibration);
-                    }
-
+                    // Check if ongoing vibration is more important than this vibration.
+                    Vibration.EndInfo vibrationEndInfo =
+                            shouldIgnoreVibrationForOngoingLocked(session);
                     if (vibrationEndInfo != null) {
-                        endVibrationLocked(externalVibration, vibrationEndInfo);
-                        return externalVibration.getScale();
+                        endVibrationLocked(session, vibrationEndInfo.status,
+                                vibrationEndInfo.endedBy);
+                        return session.getScale();
                     }
 
                     if (mCurrentExternalVibration == null) {
@@ -2044,15 +1961,12 @@
                         // vibration that may be playing and ready the vibrator for external
                         // control.
                         if (mCurrentVibration != null) {
-                            externalVibration.stats.reportInterruptedAnotherVibration(
+                            session.stats.reportInterruptedAnotherVibration(
                                     mCurrentVibration.getVibration().callerInfo);
-                            clearNextVibrationLocked(
-                                    new Vibration.EndInfo(Status.IGNORED_FOR_EXTERNAL,
-                                            externalVibration.callerInfo));
-                            mCurrentVibration.notifyCancelled(
-                                    new Vibration.EndInfo(Status.CANCELLED_SUPERSEDED,
-                                            externalVibration.callerInfo),
-                                    /* immediate= */ true);
+                            clearNextVibrationLocked(Status.IGNORED_FOR_EXTERNAL,
+                                    session.callerInfo);
+                            mCurrentVibration.requestEnd(Status.CANCELLED_SUPERSEDED,
+                                    session.callerInfo, /* immediate= */ true);
                             waitForCompletion = true;
                         }
                     } else {
@@ -2068,10 +1982,10 @@
                         // as we would need to mute the old one still if it came from a different
                         // controller.
                         alreadyUnderExternalControl = true;
-                        externalVibration.stats.reportInterruptedAnotherVibration(
+                        session.stats.reportInterruptedAnotherVibration(
                                 mCurrentExternalVibration.getCallerInfo());
                         endExternalVibrateLocked(Status.CANCELLED_SUPERSEDED,
-                                externalVibration.callerInfo, /* continueExternalControl= */ true);
+                                session.callerInfo, /* continueExternalControl= */ true);
                     }
                 }
                 // Wait for lock and interact with HAL to set external control outside main lock.
@@ -2079,8 +1993,8 @@
                     if (!mVibrationThread.waitForThreadIdle(VIBRATION_CANCEL_WAIT_MILLIS)) {
                         Slog.e(TAG, "Timed out waiting for vibration to cancel");
                         synchronized (mLock) {
-                            endVibrationLocked(externalVibration, Status.IGNORED_ERROR_CANCELLING);
-                            return externalVibration.getScale();
+                            endVibrationLocked(session, Status.IGNORED_ERROR_CANCELLING);
+                            return session.getScale();
                         }
                     }
                 }
@@ -2088,7 +2002,7 @@
                     if (DEBUG) {
                         Slog.d(TAG, "Vibrator going under external control.");
                     }
-                    setExternalControl(true, externalVibration.stats);
+                    setExternalControl(true, session.stats);
                 }
                 synchronized (mLock) {
                     if (DEBUG) {
@@ -2103,14 +2017,14 @@
                         mVibrationSettings.update();
                     }
 
-                    mCurrentExternalVibration = externalVibration;
-                    externalVibration.linkToDeath(this::onExternalVibrationBinderDied);
-                    externalVibration.scale(mVibrationScaler, attrs.getUsage());
+                    mCurrentExternalVibration = session;
+                    session.linkToDeath(this::onExternalVibrationBinderDied);
+                    session.scale(mVibrationScaler, attrs.getUsage());
 
                     // Vibrator will start receiving data from external channels after this point.
                     // Report current time as the vibration start time, for debugging.
-                    externalVibration.stats.reportStarted();
-                    return externalVibration.getScale();
+                    session.stats.reportStarted();
+                    return session.getScale();
                 }
             } finally {
                 Trace.traceEnd(TRACE_TAG_VIBRATOR);
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 4754ffb..2d75f35 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -20,6 +20,7 @@
 import static android.Manifest.permission.MANAGE_EXTERNAL_STORAGE;
 import static android.Manifest.permission.READ_WALLPAPER_INTERNAL;
 import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
+import static android.app.Flags.fixWallpaperChanged;
 import static android.app.Flags.removeNextWallpaperComponent;
 import static android.app.WallpaperManager.COMMAND_REAPPLY;
 import static android.app.WallpaperManager.FLAG_LOCK;
@@ -349,7 +350,10 @@
                             if (DEBUG) {
                                 Slog.d(TAG, "publish system wallpaper changed!");
                             }
-                            notifyWallpaperChanged(wallpaper);
+                            notifyWallpaperComplete(wallpaper);
+                            if (fixWallpaperChanged()) {
+                                notifyWallpaperChanged(wallpaper);
+                            }
                         }
                     };
 
@@ -369,7 +373,10 @@
                             if (DEBUG) {
                                 Slog.d(TAG, "publish lock wallpaper changed!");
                             }
-                            notifyWallpaperChanged(wallpaper);
+                            notifyWallpaperComplete(wallpaper);
+                            if (fixWallpaperChanged()) {
+                                notifyWallpaperChanged(wallpaper);
+                            }
                         }
                     };
 
@@ -403,8 +410,11 @@
         }
     }
 
-    private void notifyWallpaperChanged(WallpaperData wallpaper) {
-        // Publish completion *after* we've persisted the changes
+    /*
+     * Calls wallpaper setComplete methods. Called for static wallpapers after the wallpaper is set
+     * and changes are persisted.
+     */
+    private void notifyWallpaperComplete(WallpaperData wallpaper) {
         if (wallpaper.setComplete != null) {
             try {
                 wallpaper.setComplete.onWallpaperChanged();
@@ -1468,7 +1478,7 @@
                         || change == PACKAGE_TEMPORARY_CHANGE) {
                     changed = true;
                     if (doit) {
-                        Slog.w(TAG, "Wallpaper uninstalled, removing: "
+                        Slog.e(TAG, "Wallpaper uninstalled, removing: "
                                 + wallpaper.getComponent());
                         clearWallpaperLocked(wallpaper.mWhich, wallpaper.userId, false, null);
                     }
@@ -1491,7 +1501,7 @@
                             PackageManager.MATCH_DIRECT_BOOT_AWARE
                                     | PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
                 } catch (NameNotFoundException e) {
-                    Slog.w(TAG, "Wallpaper component gone, removing: "
+                    Slog.e(TAG, "Wallpaper component gone, removing: "
                             + wallpaper.getComponent());
                     clearWallpaperLocked(wallpaper.mWhich, wallpaper.userId, false, null);
                 }
@@ -1787,6 +1797,9 @@
                     switchWallpaper(systemWallpaper, null);
                     // TODO(b/278261563): call notifyCallbacksLocked inside switchWallpaper
                     notifyCallbacksLocked(systemWallpaper);
+                    if (fixWallpaperChanged()) {
+                        notifyWallpaperChanged(systemWallpaper);
+                    }
                 }
                 if (mLockWallpaperWaitingForUnlock) {
                     final WallpaperData lockWallpaper =
@@ -1794,6 +1807,9 @@
                     lockWallpaper.mBindSource = BindSource.SWITCH_WALLPAPER_UNLOCK_USER;
                     switchWallpaper(lockWallpaper, null);
                     notifyCallbacksLocked(lockWallpaper);
+                    if (fixWallpaperChanged()) {
+                        notifyWallpaperChanged(lockWallpaper);
+                    }
                 }
 
                 // Make sure that the SELinux labeling of all the relevant files is correct.
@@ -3248,6 +3264,9 @@
                     }
                     newWallpaper.wallpaperId = makeWallpaperIdLocked();
                     notifyCallbacksLocked(newWallpaper);
+                    if (fixWallpaperChanged()) {
+                        notifyWallpaperChanged(newWallpaper);
+                    }
                     shouldNotifyColors = true;
                     if (offloadColorExtraction()) {
                         shouldNotifyColors = false;
@@ -3316,6 +3335,21 @@
         return false;
     }
 
+    /*
+     * Attempt to bind the wallpaper given by `componentName`, returning true on success otherwise
+     * false.
+     *
+     * When called, `wallpaper` is in a deliberately inconsistent state. Most fields have been
+     * updated to describe the desired wallpaper, but the ComponentName is not updated until
+     * binding is successful. This is required for maybeDetachWallpapers() to work correctly.
+     *
+     * The late update of the component field should cause multi-threading headaches with
+     * WallpaperConnection#onServiceConnected, but doesn't because onServiceConnected required
+     * `mLock` and `bindWallpaperComponentLocked` is always called with that lock, which prevents a
+     * race condition.
+     *
+     * This is a major motivation for making WallpaperData immutable per b/267170056.
+     */
     boolean bindWallpaperComponentLocked(ComponentName componentName, boolean force,
             boolean fromUser, WallpaperData wallpaper, IRemoteCallback reply) {
         if (DEBUG_LIVE) {
@@ -3610,8 +3644,18 @@
         }
         wallpaper.callbacks.finishBroadcast();
 
+        if (!fixWallpaperChanged()) {
+            final Intent intent = new Intent(Intent.ACTION_WALLPAPER_CHANGED);
+            intent.putExtra(WallpaperManager.EXTRA_FROM_FOREGROUND_APP,
+                    wallpaper.fromForegroundApp);
+            mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId));
+        }
+    }
+
+    private void notifyWallpaperChanged(WallpaperData wallpaper) {
         final Intent intent = new Intent(Intent.ACTION_WALLPAPER_CHANGED);
         intent.putExtra(WallpaperManager.EXTRA_FROM_FOREGROUND_APP, wallpaper.fromForegroundApp);
+        intent.putExtra(WallpaperManager.EXTRA_WHICH_WALLPAPER_CHANGED, wallpaper.mWhich);
         mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId));
     }
 
diff --git a/services/core/java/com/android/server/webkit/SystemImpl.java b/services/core/java/com/android/server/webkit/SystemImpl.java
index 6740153..ab5316f 100644
--- a/services/core/java/com/android/server/webkit/SystemImpl.java
+++ b/services/core/java/com/android/server/webkit/SystemImpl.java
@@ -41,7 +41,8 @@
 
 import com.android.internal.util.XmlUtils;
 import com.android.server.LocalServices;
-import com.android.server.PinnerService;
+import com.android.server.pinner.PinnedFile;
+import com.android.server.pinner.PinnerService;
 
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -318,8 +319,9 @@
             if (webviewPinQuota <= 0) {
                 break;
             }
-            int bytesPinned = pinnerService.pinFile(apk, webviewPinQuota, appInfo, PIN_GROUP);
-            webviewPinQuota -= bytesPinned;
+            PinnedFile pf = pinnerService.pinFile(
+                    apk, webviewPinQuota, appInfo, PIN_GROUP, /*pinOptimizedDeps=*/true);
+            webviewPinQuota -= pf.bytesPinned;
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java
index c1e859d..ae30fcd 100644
--- a/services/core/java/com/android/server/wm/ActivityClientController.java
+++ b/services/core/java/com/android/server/wm/ActivityClientController.java
@@ -42,8 +42,8 @@
 import static android.view.WindowManager.TRANSIT_TO_BACK;
 import static android.view.WindowManager.TRANSIT_TO_FRONT;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IMMERSIVE;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_CONFIGURATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_IMMERSIVE;
 import static com.android.server.wm.ActivityRecord.State.DESTROYED;
 import static com.android.server.wm.ActivityRecord.State.DESTROYING;
 import static com.android.server.wm.ActivityRecord.State.PAUSING;
@@ -442,6 +442,8 @@
             throw new IllegalArgumentException("File descriptors passed in Intent");
         }
 
+        mService.mAmInternal.addCreatorToken(resultData);
+
         final ActivityRecord r;
         synchronized (mGlobalLock) {
             r = ActivityRecord.isInRootTaskLocked(token);
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 12d733f..31f4d08 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -127,19 +127,19 @@
 import static android.window.TransitionInfo.FLAG_IS_OCCLUDED;
 import static android.window.TransitionInfo.FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ANIM;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS_ANIM;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONTAINERS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS_LIGHT;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STARTING_WINDOW;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STATES;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_SWITCH;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ADD_REMOVE;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ANIM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS_ANIM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_CONFIGURATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_CONTAINERS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS_LIGHT;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STARTING_WINDOW;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STATES;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SWITCH;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN;
 import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_ASPECT_RATIO;
 import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_FIXED_ORIENTATION;
 import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_SIZE_COMPAT_MODE;
@@ -230,6 +230,7 @@
 import static com.android.server.wm.IdentifierProto.TITLE;
 import static com.android.server.wm.IdentifierProto.USER_ID;
 import static com.android.server.wm.StartingData.AFTER_TRANSACTION_COPY_TO_CLIENT;
+import static com.android.server.wm.StartingData.AFTER_TRANSACTION_IDLE;
 import static com.android.server.wm.StartingData.AFTER_TRANSACTION_REMOVE_DIRECTLY;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_PREDICT_BACK;
@@ -286,6 +287,9 @@
 import android.app.servertransaction.TopResumedActivityChangeItem;
 import android.app.servertransaction.TransferSplashScreenViewStateItem;
 import android.app.usage.UsageEvents.Event;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledAfter;
+import android.compat.annotation.Overridable;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -465,6 +469,11 @@
     // finished destroying itself.
     private static final int DESTROY_TIMEOUT = 10 * 1000;
 
+    @ChangeId
+    @Overridable
+    @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    static final long UNIVERSAL_RESIZABLE_BY_DEFAULT = 357141415;
+
     final ActivityTaskManagerService mAtmService;
     final ActivityCallerState mCallerState;
     @NonNull
@@ -871,8 +880,6 @@
     })
     @interface SplashScreenBehavior { }
 
-    // TODO: Have a WindowContainer state for tracking exiting/deferred removal.
-    boolean mIsExiting;
     // Force an app transition to be ran in the case the visibility of the app did not change.
     // We use this for the case of moving a Root Task to the back with multiple activities, and the
     // top activity enters PIP; the bottom activity's visibility stays the same, but we need to
@@ -1218,10 +1225,9 @@
             pw.print(" lastAllDrawn="); pw.print(mLastAllDrawn);
             pw.println(")");
         }
-        if (mStartingData != null || firstWindowDrawn || mIsExiting) {
+        if (mStartingData != null || firstWindowDrawn) {
             pw.print(prefix); pw.print("startingData="); pw.print(mStartingData);
-            pw.print(" firstWindowDrawn="); pw.print(firstWindowDrawn);
-            pw.print(" mIsExiting="); pw.println(mIsExiting);
+            pw.print(" firstWindowDrawn="); pw.println(firstWindowDrawn);
         }
         if (mStartingWindow != null || mStartingData != null || mStartingSurface != null
                 || startingMoved || mVisibleSetFromTransferredStartingWindow) {
@@ -2154,7 +2160,10 @@
         }
         mAtmService.mPackageConfigPersister.updateConfigIfNeeded(this, mUserId, packageName);
 
-        mActivityRecordInputSink = new ActivityRecordInputSink(this, sourceRecord);
+        final boolean appOptInTouchPassThrough =
+                options != null && options.isAllowPassThroughOnTouchOutside();
+        mActivityRecordInputSink = new ActivityRecordInputSink(
+                this, sourceRecord, appOptInTouchPassThrough);
 
         mAppActivityEmbeddingSplitsEnabled = isAppActivityEmbeddingSplitsEnabled();
         mAllowUntrustedEmbeddingStateSharing = getAllowUntrustedEmbeddingStateSharingProperty();
@@ -2632,8 +2641,10 @@
         if (finishing || !mHandleExitSplashScreen || mStartingSurface == null
                 || mStartingWindow == null
                 || mTransferringSplashScreenState == TRANSFER_SPLASH_SCREEN_FINISH
-                // skip copy splash screen to client if it was resized
-                || (mStartingData != null && mStartingData.mResizedFromTransfer)
+                // Skip copy splash screen to client if it was resized, or the starting data already
+                // requested to be removed after transaction commit.
+                || (mStartingData != null && (mStartingData.mResizedFromTransfer
+                        || mStartingData.mRemoveAfterTransaction != AFTER_TRANSACTION_IDLE))
                 || isRelaunching()) {
             return false;
         }
@@ -3171,14 +3182,32 @@
         return getWindowConfiguration().canReceiveKeys() && !mWaitForEnteringPinnedMode;
     }
 
-    boolean isResizeable() {
-        return isResizeable(/* checkPictureInPictureSupport */ true);
+    /**
+     * Returns {@code true} if the fixed orientation, aspect ratio, resizability of this activity
+     * will be ignored.
+     */
+    boolean isUniversalResizeable() {
+        if (info.applicationInfo.category == ApplicationInfo.CATEGORY_GAME) {
+            return false;
+        }
+        final boolean compatEnabled = Flags.universalResizableByDefault()
+                && mDisplayContent != null && mDisplayContent.getConfiguration()
+                    .smallestScreenWidthDp >= WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP
+                && mDisplayContent.getIgnoreOrientationRequest()
+                && info.isChangeEnabled(UNIVERSAL_RESIZABLE_BY_DEFAULT);
+        if (!compatEnabled && !mWmService.mConstants.mIgnoreActivityOrientationRequest) {
+            return false;
+        }
+        // If the user preference respects aspect ratio, then it becomes non-resizable.
+        return !mAppCompatController.getAppCompatOverrides().getAppCompatAspectRatioOverrides()
+                .shouldApplyUserMinAspectRatioOverride();
     }
 
-    boolean isResizeable(boolean checkPictureInPictureSupport) {
+    boolean isResizeable() {
         return mAtmService.mForceResizableActivities
                 || ActivityInfo.isResizeableMode(info.resizeMode)
-                || (info.supportsPictureInPicture() && checkPictureInPictureSupport)
+                || info.supportsPictureInPicture()
+                || isUniversalResizeable()
                 // If the activity can be embedded, it should inherit the bounds of task fragment.
                 || isEmbedded();
     }
@@ -4338,21 +4367,6 @@
         super.removeImmediately();
     }
 
-    @Override
-    void removeIfPossible() {
-        mIsExiting = false;
-        removeAllWindowsIfPossible();
-        removeImmediately();
-    }
-
-    @Override
-    boolean handleCompleteDeferredRemoval() {
-        if (mIsExiting) {
-            removeIfPossible();
-        }
-        return super.handleCompleteDeferredRemoval();
-    }
-
     void onRemovedFromDisplay() {
         if (mRemovingFromDisplay) {
             return;
@@ -6397,7 +6411,7 @@
             // and the token could be null.
             return;
         }
-        r.mDisplayContent.mAppCompatCameraPolicy.onActivityRefreshed(r);
+        AppCompatCameraPolicy.onActivityRefreshed(r);
     }
 
     static void splashScreenAttachedLocked(IBinder token) {
@@ -8162,11 +8176,8 @@
     @Override
     @ActivityInfo.ScreenOrientation
     protected int getOverrideOrientation() {
-        final int candidateOrientation;
-        if (!mWmService.mConstants.mIgnoreActivityOrientationRequest
-                || info.applicationInfo.category == ApplicationInfo.CATEGORY_GAME) {
-            candidateOrientation = super.getOverrideOrientation();
-        } else {
+        int candidateOrientation = super.getOverrideOrientation();
+        if (ActivityInfo.isFixedOrientation(candidateOrientation) && isUniversalResizeable()) {
             candidateOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
         }
         return mAppCompatController.getOrientationPolicy()
@@ -9442,8 +9453,8 @@
         if (!shouldBeResumed(/* activeActivity */ null)) {
             return;
         }
-        mDisplayContent.mAppCompatCameraPolicy.onActivityConfigurationChanging(
-                this, newConfig, lastReportedConfig);
+
+        AppCompatCameraPolicy.onActivityConfigurationChanging(this, newConfig, lastReportedConfig);
     }
 
     /** Get process configuration, or global config if the process is not set. */
@@ -10025,7 +10036,7 @@
         }
         StringBuilder sb = new StringBuilder(128);
         sb.append("ActivityRecord{");
-        sb.append(Integer.toHexString(System.identityHashCode(this)));
+        sb.append(System.identityHashCode(this));
         sb.append(" u");
         sb.append(mUserId);
         sb.append(' ');
diff --git a/services/core/java/com/android/server/wm/ActivityRecordInputSink.java b/services/core/java/com/android/server/wm/ActivityRecordInputSink.java
index 1a19787..fa5beca 100644
--- a/services/core/java/com/android/server/wm/ActivityRecordInputSink.java
+++ b/services/core/java/com/android/server/wm/ActivityRecordInputSink.java
@@ -16,13 +16,18 @@
 
 package com.android.server.wm;
 
+import android.app.ActivityOptions;
 import android.app.compat.CompatChanges;
 import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledSince;
+import android.os.Build;
 import android.os.InputConfig;
 import android.view.InputWindowHandle;
 import android.view.SurfaceControl;
 import android.view.WindowManager;
 
+import com.android.window.flags.Flags;
+
 /**
  * Creates a InputWindowHandle that catches all touches that would otherwise pass through an
  * Activity.
@@ -35,6 +40,21 @@
     @ChangeId
     static final long ENABLE_TOUCH_OPAQUE_ACTIVITIES = 194480991L;
 
+    // TODO(b/369605358) Update EnabledSince when SDK 36 version code is available.
+    /**
+     * If the app's target SDK is 36+, pass-through touches from a cross-uid overlaying activity is
+     * blocked by default. The activity may opt in to receive pass-through touches using
+     * {@link ActivityOptions#setAllowPassThroughOnTouchOutside}, which allows the to-be-launched
+     * cross-uid overlaying activity and other activities in that app to pass through touches. The
+     * activity needs to ensure that it trusts the overlaying app and its content is not vulnerable
+     * to UI redressing attacks.
+     *
+     * @see ActivityOptions#setAllowPassThroughOnTouchOutside
+     */
+    @ChangeId
+    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT)
+    static final long ENABLE_OVERLAY_TOUCH_PASS_THROUGH_OPT_IN_ENFORCEMENT = 358129114L;
+
     private final ActivityRecord mActivityRecord;
     private final boolean mIsCompatEnabled;
     private final String mName;
@@ -42,13 +62,24 @@
     private InputWindowHandleWrapper mInputWindowHandleWrapper;
     private SurfaceControl mSurfaceControl;
 
-    ActivityRecordInputSink(ActivityRecord activityRecord, ActivityRecord sourceRecord) {
+    ActivityRecordInputSink(ActivityRecord activityRecord, ActivityRecord sourceRecord,
+            boolean appOptInTouchPassThrough) {
         mActivityRecord = activityRecord;
         mIsCompatEnabled = CompatChanges.isChangeEnabled(ENABLE_TOUCH_OPAQUE_ACTIVITIES,
                 mActivityRecord.getUid());
         mName = Integer.toHexString(System.identityHashCode(this)) + " ActivityRecordInputSink "
                 + mActivityRecord.mActivityComponent.flattenToShortString();
-        if (sourceRecord != null) {
+
+        if (sourceRecord == null) {
+            return;
+        }
+        // If the source activity has target sdk 36+, it is required to opt in to receive
+        // pass-through touches from the overlaying activity.
+        final boolean isTouchPassThroughOptInEnforced = CompatChanges.isChangeEnabled(
+                ENABLE_OVERLAY_TOUCH_PASS_THROUGH_OPT_IN_ENFORCEMENT,
+                sourceRecord.getUid());
+        if (!Flags.touchPassThroughOptIn() || !isTouchPassThroughOptInEnforced
+                || appOptInTouchPassThrough) {
             sourceRecord.mAllowedTouchUid = mActivityRecord.getUid();
         }
     }
diff --git a/services/core/java/com/android/server/wm/ActivityRefresher.java b/services/core/java/com/android/server/wm/ActivityRefresher.java
index dcc325e..5243a10 100644
--- a/services/core/java/com/android/server/wm/ActivityRefresher.java
+++ b/services/core/java/com/android/server/wm/ActivityRefresher.java
@@ -18,7 +18,7 @@
 import static android.app.servertransaction.ActivityLifecycleItem.ON_PAUSE;
 import static android.app.servertransaction.ActivityLifecycleItem.ON_STOP;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STATES;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STATES;
 
 import android.annotation.NonNull;
 import android.app.servertransaction.RefreshCallbackItem;
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index d29ff54..87fa62a 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -60,8 +60,8 @@
 import static android.view.WindowManager.TRANSIT_TO_FRONT;
 import static android.window.TaskFragmentOperation.OP_TYPE_START_ACTIVITY_IN_TASK_FRAGMENT;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TASKS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_CONFIGURATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_TASKS;
 import static com.android.server.pm.PackageArchiver.isArchivingEnabled;
 import static com.android.server.wm.ActivityRecord.State.RESUMED;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_PERMISSIONS_REVIEW;
@@ -100,6 +100,7 @@
 import android.app.WaitResult;
 import android.app.WindowConfiguration;
 import android.compat.annotation.ChangeId;
+import android.compat.annotation.Disabled;
 import android.compat.annotation.EnabledSince;
 import android.content.IIntentSender;
 import android.content.Intent;
@@ -182,7 +183,7 @@
      * Feature flag for go/activity-security rules
      */
     @ChangeId
-    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    @Disabled
     static final long ASM_RESTRICTIONS = 230590090L;
 
     private final ActivityTaskManagerService mService;
@@ -1028,6 +1029,7 @@
                 if (requestCode >= 0 && !sourceRecord.finishing) {
                     resultRecord = sourceRecord;
                 }
+                request.logMessage.append(" (sr=" + System.identityHashCode(sourceRecord) + ")");
             }
         }
 
@@ -2757,10 +2759,7 @@
             mInTask = null;
             // Launch ResolverActivity in the source task, so that it stays in the task bounds
             // when in freeform workspace.
-            // Also put noDisplay activities in the source task. These by itself can be placed
-            // in any task/root-task, however it could launch other activities like
-            // ResolverActivity, and we want those to stay in the original task.
-            if ((mStartActivity.isResolverOrDelegateActivity() || mStartActivity.noDisplay)
+            if (mStartActivity.isResolverOrDelegateActivity()
                     && mSourceRecord != null && mSourceRecord.inFreeformWindowingMode()) {
                 mAddingToTask = true;
             }
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index de95d1b..3dfc8f4 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -71,12 +71,12 @@
 import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_LAUNCHER_CLEAR_SNAPSHOT;
 import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_DREAM;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IMMERSIVE;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_LOCKTASK;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TASKS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_CONFIGURATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_DREAM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_IMMERSIVE;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_LOCKTASK;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_TASKS;
 import static com.android.sdksandbox.flags.Flags.sandboxActivitySdkBasedContext;
 import static com.android.server.am.ActivityManagerService.STOCK_PM_FLAGS;
 import static com.android.server.am.ActivityManagerServiceDumpActivitiesProto.ROOT_WINDOW_CONTAINER;
@@ -1228,6 +1228,7 @@
             String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
             String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
             Bundle bOptions) {
+        mAmInternal.addCreatorToken(intent);
         return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
                 resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions,
                 UserHandle.getCallingUserId());
@@ -1240,6 +1241,11 @@
         assertPackageMatchesCallingUid(callingPackage);
         final String reason = "startActivities";
         enforceNotIsolatedCaller(reason);
+        if (intents != null) {
+            for (Intent intent : intents) {
+                mAmInternal.addCreatorToken(intent);
+            }
+        }
         userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, reason);
         // TODO: Switch to user app stacks here.
         return getActivityStartController().startActivities(caller, -1, 0, -1, callingPackage,
@@ -1269,6 +1275,7 @@
             @Nullable String callingFeatureId, Intent intent, String resolvedType,
             IBinder resultTo, String resultWho, int requestCode, int startFlags,
             ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {
+        mAmInternal.addCreatorToken(intent);
         final SafeActivityOptions opts = SafeActivityOptions.fromBundle(bOptions);
 
         assertPackageMatchesCallingUid(callingPackage);
@@ -1323,6 +1330,7 @@
             }
             // Remove existing mismatch flag so it can be properly updated later
             fillInIntent.removeExtendedFlags(Intent.EXTENDED_FLAG_FILTER_MISMATCH);
+            mAmInternal.addCreatorToken(fillInIntent);
         }
 
         if (!(target instanceof PendingIntentRecord)) {
@@ -1352,6 +1360,9 @@
         if (intent != null && intent.hasFileDescriptors()) {
             throw new IllegalArgumentException("File descriptors passed in Intent");
         }
+
+        mAmInternal.addCreatorToken(intent);
+
         SafeActivityOptions options = SafeActivityOptions.fromBundle(bOptions);
 
         synchronized (mGlobalLock) {
diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
index 9a3ad2d..4f71719 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
@@ -52,8 +52,8 @@
 import static android.view.WindowManager.TRANSIT_TO_BACK;
 import static android.view.WindowManager.TRANSIT_TO_FRONT;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STATES;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TASKS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STATES;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_TASKS;
 import static com.android.server.wm.ActivityRecord.State.PAUSED;
 import static com.android.server.wm.ActivityRecord.State.PAUSING;
 import static com.android.server.wm.ActivityRecord.State.RESTARTING_PROCESS;
diff --git a/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java b/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java
index f245efd..d59046f 100644
--- a/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java
+++ b/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java
@@ -255,13 +255,10 @@
                 mActivityRecord.getOverrideOrientation());
         final AppCompatCameraOverrides cameraOverrides =
                 mActivityRecord.mAppCompatController.getAppCompatCameraOverrides();
-        final AppCompatCameraPolicy cameraPolicy =
-                mActivityRecord.mAppCompatController.getAppCompatCameraPolicy();
         // Don't resize to split screen size when in book mode if letterbox position is centered
         return (isBookMode && isNotCenteredHorizontally || isTabletopMode && isLandscape)
                 || cameraOverrides.isCameraCompatSplitScreenAspectRatioAllowed()
-                && (cameraPolicy != null
-                    && cameraPolicy.isTreatmentEnabledForActivity(mActivityRecord));
+                && AppCompatCameraPolicy.isTreatmentEnabledForActivity(mActivityRecord);
     }
 
     /**
diff --git a/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java b/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java
index 51ef87d..548c0a3 100644
--- a/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java
+++ b/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java
@@ -72,6 +72,13 @@
 
     float getDesiredAspectRatio(@NonNull Configuration newParentConfig,
             @NonNull Rect parentBounds) {
+        // If in camera compat mode, aspect ratio from the camera compat policy has priority over
+        // default letterbox aspect ratio.
+        if (AppCompatCameraPolicy.shouldCameraCompatControlAspectRatio(
+                mActivityRecord)) {
+            return AppCompatCameraPolicy.getCameraCompatAspectRatio(mActivityRecord);
+        }
+
         final float letterboxAspectRatioOverride =
                 mAppCompatOverrides.getAppCompatAspectRatioOverrides()
                         .getFixedOrientationLetterboxAspectRatio(newParentConfig);
@@ -114,20 +121,16 @@
             return mTransparentPolicy.getInheritedMinAspectRatio();
         }
         final ActivityInfo info = mActivityRecord.info;
-        if (info.applicationInfo == null) {
-            return info.getMinAspectRatio();
-        }
         final AppCompatAspectRatioOverrides aspectRatioOverrides =
                 mAppCompatOverrides.getAppCompatAspectRatioOverrides();
         if (aspectRatioOverrides.shouldApplyUserMinAspectRatioOverride()) {
             return aspectRatioOverrides.getUserMinAspectRatio();
         }
-        final DisplayContent displayContent = mActivityRecord.getDisplayContent();
-        final boolean shouldOverrideMinAspectRatioForCamera = displayContent != null
-                && displayContent.mAppCompatCameraPolicy.shouldOverrideMinAspectRatioForCamera(
-                        mActivityRecord);
         if (!aspectRatioOverrides.shouldOverrideMinAspectRatio()
-                && !shouldOverrideMinAspectRatioForCamera) {
+                && !AppCompatCameraPolicy.shouldOverrideMinAspectRatioForCamera(mActivityRecord)) {
+            if (mActivityRecord.isUniversalResizeable()) {
+                return 0;
+            }
             return info.getMinAspectRatio();
         }
 
@@ -170,6 +173,9 @@
         if (mTransparentPolicy.isRunning()) {
             return mTransparentPolicy.getInheritedMaxAspectRatio();
         }
+        if (mActivityRecord.isUniversalResizeable()) {
+            return 0;
+        }
         return mActivityRecord.info.getMaxAspectRatio();
     }
 
diff --git a/services/core/java/com/android/server/wm/AppCompatCameraOverrides.java b/services/core/java/com/android/server/wm/AppCompatCameraOverrides.java
index 241390c1..fbf9478 100644
--- a/services/core/java/com/android/server/wm/AppCompatCameraOverrides.java
+++ b/services/core/java/com/android/server/wm/AppCompatCameraOverrides.java
@@ -170,7 +170,7 @@
      * </ul>
      */
     boolean shouldApplyFreeformTreatmentForCameraCompat() {
-        return Flags.cameraCompatForFreeform() && !isChangeEnabled(mActivityRecord,
+        return Flags.enableCameraCompatForDesktopWindowing() && !isChangeEnabled(mActivityRecord,
                 OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT);
     }
 
diff --git a/services/core/java/com/android/server/wm/AppCompatCameraPolicy.java b/services/core/java/com/android/server/wm/AppCompatCameraPolicy.java
index 67bfd76..8c5689c1 100644
--- a/services/core/java/com/android/server/wm/AppCompatCameraPolicy.java
+++ b/services/core/java/com/android/server/wm/AppCompatCameraPolicy.java
@@ -18,8 +18,11 @@
 
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
 
+import static com.android.server.wm.AppCompatConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.app.CameraCompatTaskInfo;
 import android.content.pm.ActivityInfo.ScreenOrientation;
 import android.content.res.Configuration;
 import android.widget.Toast;
@@ -48,8 +51,9 @@
         // without the need to restart the device.
         final boolean needsDisplayRotationCompatPolicy =
                 wmService.mAppCompatConfiguration.isCameraCompatTreatmentEnabledAtBuildTime();
-        final boolean needsCameraCompatFreeformPolicy = Flags.cameraCompatForFreeform()
-                && DesktopModeHelper.canEnterDesktopMode(wmService.mContext);
+        final boolean needsCameraCompatFreeformPolicy =
+                Flags.enableCameraCompatForDesktopWindowing()
+                        && DesktopModeHelper.canEnterDesktopMode(wmService.mContext);
         if (needsDisplayRotationCompatPolicy || needsCameraCompatFreeformPolicy) {
             mCameraStateMonitor = new CameraStateMonitor(displayContent, wmService.mH);
             mActivityRefresher = new ActivityRefresher(wmService, wmService.mH);
@@ -67,22 +71,30 @@
         }
     }
 
-    void onActivityRefreshed(@NonNull ActivityRecord activity) {
-        if (mActivityRefresher != null) {
-            mActivityRefresher.onActivityRefreshed(activity);
+    static void onActivityRefreshed(@NonNull ActivityRecord activity) {
+        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
+        if (cameraPolicy != null && cameraPolicy.mActivityRefresher != null) {
+            cameraPolicy.mActivityRefresher.onActivityRefreshed(activity);
         }
     }
 
+    @Nullable
+    static AppCompatCameraPolicy getAppCompatCameraPolicy(@NonNull ActivityRecord activityRecord) {
+        return activityRecord.mDisplayContent != null
+                ? activityRecord.mDisplayContent.mAppCompatCameraPolicy : null;
+    }
+
     /**
      * "Refreshes" activity by going through "stopped -> resumed" or "paused -> resumed" cycle.
      * This allows to clear cached values in apps (e.g. display or camera rotation) that influence
      * camera preview and can lead to sideways or stretching issues persisting even after force
      * rotation.
      */
-    void onActivityConfigurationChanging(@NonNull ActivityRecord activity,
+    static void onActivityConfigurationChanging(@NonNull ActivityRecord activity,
             @NonNull Configuration newConfig, @NonNull Configuration lastReportedConfig) {
-        if (mActivityRefresher != null) {
-            mActivityRefresher.onActivityConfigurationChanging(activity, newConfig,
+        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
+        if (cameraPolicy != null && cameraPolicy.mActivityRefresher != null) {
+            cameraPolicy.mActivityRefresher.onActivityConfigurationChanging(activity, newConfig,
                     lastReportedConfig);
         }
     }
@@ -99,11 +111,11 @@
         }
     }
 
-    boolean isActivityEligibleForOrientationOverride(@NonNull ActivityRecord activity) {
-        if (mDisplayRotationCompatPolicy != null) {
-            return mDisplayRotationCompatPolicy.isActivityEligibleForOrientationOverride(activity);
-        }
-        return false;
+    static boolean isActivityEligibleForOrientationOverride(@NonNull ActivityRecord activity) {
+        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
+        return cameraPolicy != null && cameraPolicy.mDisplayRotationCompatPolicy != null
+                && cameraPolicy.mDisplayRotationCompatPolicy
+                        .isActivityEligibleForOrientationOverride(activity);
     }
 
     /**
@@ -116,11 +128,11 @@
      *     <li>The activity has fixed orientation but not "locked" or "nosensor" one.
      * </ul>
      */
-    boolean isTreatmentEnabledForActivity(@Nullable ActivityRecord activity) {
-        if (mDisplayRotationCompatPolicy != null) {
-            return mDisplayRotationCompatPolicy.isTreatmentEnabledForActivity(activity);
-        }
-        return false;
+    static boolean isTreatmentEnabledForActivity(@NonNull ActivityRecord activity) {
+        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
+        return cameraPolicy != null && cameraPolicy.mDisplayRotationCompatPolicy != null
+                && cameraPolicy.mDisplayRotationCompatPolicy
+                        .isTreatmentEnabledForActivity(activity);
     }
 
     void start() {
@@ -166,28 +178,93 @@
                 : SCREEN_ORIENTATION_UNSPECIFIED;
     }
 
+    // TODO(b/369070416): have policies implement the same interface.
+    static boolean shouldCameraCompatControlOrientation(@NonNull ActivityRecord activity) {
+        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
+        if (cameraPolicy == null) {
+            return false;
+        }
+        return (cameraPolicy.mDisplayRotationCompatPolicy != null
+                        && cameraPolicy.mDisplayRotationCompatPolicy
+                                .shouldCameraCompatControlOrientation(activity))
+                || (cameraPolicy.mCameraCompatFreeformPolicy != null
+                        && cameraPolicy.mCameraCompatFreeformPolicy
+                                .shouldCameraCompatControlOrientation(activity));
+    }
+
+    // TODO(b/369070416): have policies implement the same interface.
+    static boolean shouldCameraCompatControlAspectRatio(@NonNull ActivityRecord activity) {
+        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
+        if (cameraPolicy == null) {
+            return false;
+        }
+        return (cameraPolicy.mDisplayRotationCompatPolicy != null
+                        && cameraPolicy.mDisplayRotationCompatPolicy
+                                .shouldCameraCompatControlAspectRatio(activity))
+                || (cameraPolicy.mCameraCompatFreeformPolicy != null
+                        && cameraPolicy.mCameraCompatFreeformPolicy
+                                .shouldCameraCompatControlAspectRatio(activity));
+    }
+
+    // TODO(b/369070416): have policies implement the same interface.
     /**
-     * @return {@code true} if the Camera is active for the provided {@link ActivityRecord}.
+     * @return {@code true} if the Camera is active for the provided {@link ActivityRecord} and
+     * any camera compat treatment could be triggered for the current windowing mode.
      */
-    boolean isCameraActive(@NonNull ActivityRecord activity, boolean mustBeFullscreen) {
-        return mDisplayRotationCompatPolicy != null
-                && mDisplayRotationCompatPolicy.isCameraActive(activity, mustBeFullscreen);
+    private static boolean isCameraRunningAndWindowingModeEligible(
+            @NonNull ActivityRecord activity) {
+        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
+        if (cameraPolicy == null) {
+            return false;
+        }
+        return (cameraPolicy.mDisplayRotationCompatPolicy != null
+                && cameraPolicy.mDisplayRotationCompatPolicy
+                        .isCameraRunningAndWindowingModeEligible(activity,
+                                /* mustBeFullscreen */ true))
+                || (cameraPolicy.mCameraCompatFreeformPolicy != null
+                        && cameraPolicy.mCameraCompatFreeformPolicy
+                                .isCameraRunningAndWindowingModeEligible(activity));
     }
 
     @Nullable
     String getSummaryForDisplayRotationHistoryRecord() {
-        if (mDisplayRotationCompatPolicy != null) {
-            return mDisplayRotationCompatPolicy.getSummaryForDisplayRotationHistoryRecord();
+        return mDisplayRotationCompatPolicy != null
+                ? mDisplayRotationCompatPolicy.getSummaryForDisplayRotationHistoryRecord()
+                : null;
+    }
+
+    // TODO(b/369070416): have policies implement the same interface.
+    static float getCameraCompatAspectRatio(@NonNull ActivityRecord activity) {
+        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
+        if (cameraPolicy == null) {
+            return 1.0f;
         }
-        return null;
+        float displayRotationCompatPolicyAspectRatio =
+                cameraPolicy.mDisplayRotationCompatPolicy != null
+                ? cameraPolicy.mDisplayRotationCompatPolicy.getCameraCompatAspectRatio(activity)
+                : MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
+        float cameraCompatFreeformPolicyAspectRatio =
+                cameraPolicy.mCameraCompatFreeformPolicy != null
+                ? cameraPolicy.mCameraCompatFreeformPolicy.getCameraCompatAspectRatio(activity)
+                : MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
+        return Math.max(displayRotationCompatPolicyAspectRatio,
+                cameraCompatFreeformPolicyAspectRatio);
+    }
+
+    @CameraCompatTaskInfo.FreeformCameraCompatMode
+    static int getCameraCompatFreeformMode(@NonNull ActivityRecord activity) {
+        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
+        return cameraPolicy != null && cameraPolicy.mCameraCompatFreeformPolicy != null
+                ? cameraPolicy.mCameraCompatFreeformPolicy.getCameraCompatMode(activity)
+                : CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_NONE;
     }
 
     /**
      * Whether we should apply the min aspect ratio per-app override only when an app is connected
      * to the camera.
      */
-    boolean shouldOverrideMinAspectRatioForCamera(@NonNull ActivityRecord activityRecord) {
-        return isCameraActive(activityRecord, /* mustBeFullscreen= */ true)
+    static boolean shouldOverrideMinAspectRatioForCamera(@NonNull ActivityRecord activityRecord) {
+        return AppCompatCameraPolicy.isCameraRunningAndWindowingModeEligible(activityRecord)
                 && activityRecord.mAppCompatController.getAppCompatCameraOverrides()
                         .isOverrideMinAspectRatioForCameraEnabled();
     }
diff --git a/services/core/java/com/android/server/wm/AppCompatConfiguration.java b/services/core/java/com/android/server/wm/AppCompatConfiguration.java
index 42378aa..38c6de1 100644
--- a/services/core/java/com/android/server/wm/AppCompatConfiguration.java
+++ b/services/core/java/com/android/server/wm/AppCompatConfiguration.java
@@ -290,6 +290,10 @@
     // is enabled and activity is connected to the camera in fullscreen.
     private final boolean mIsCameraCompatSplitScreenAspectRatioEnabled;
 
+    // Which aspect ratio to use when camera compat treatment is enabled and an activity eligible
+    // for treatment is connected to the camera.
+    private float mCameraCompatAspectRatio;
+
     // Whether activity "refresh" in camera compatibility treatment is enabled.
     // See RefreshCallbackItem for context.
     private boolean mIsCameraCompatTreatmentRefreshEnabled = true;
@@ -363,6 +367,8 @@
                         .config_letterboxIsDisplayAspectRatioForFixedOrientationLetterboxEnabled);
         mIsCameraCompatSplitScreenAspectRatioEnabled = mContext.getResources().getBoolean(
                 R.bool.config_isWindowManagerCameraCompatSplitScreenAspectRatioEnabled);
+        mCameraCompatAspectRatio = mContext.getResources().getFloat(
+                R.dimen.config_windowManagerCameraCompatAspectRatio);
         mIsPolicyForIgnoringRequestedOrientationEnabled = mContext.getResources().getBoolean(
                 R.bool.config_letterboxIsPolicyForIgnoringRequestedOrientationEnabled);
 
@@ -1320,6 +1326,31 @@
     }
 
     /**
+     * Overrides aspect ratio to use when camera compat treatment is enabled and an activity
+     * eligible for treatment is connected to the camera.
+     */
+    void setCameraCompatAspectRatio(float aspectRatio) {
+        mCameraCompatAspectRatio = aspectRatio;
+    }
+
+    /**
+     * Which aspect ratio to use when camera compat treatment is enabled and an activity eligible
+     * for treatment is connected to the camera.
+     */
+    float getCameraCompatAspectRatio() {
+        return mCameraCompatAspectRatio;
+    }
+
+    /**
+     * Resets aspect ratio to use when camera compat treatment is enabled and an activity eligible
+     * for treatment is connected to the camera.
+     */
+    void resetCameraCompatAspectRatio() {
+        mCameraCompatAspectRatio = mContext.getResources().getFloat(R.dimen
+                .config_windowManagerCameraCompatAspectRatio);
+    }
+
+    /**
      * Checks whether rotation compat policy for immersive apps that prevents auto rotation
      * into non-optimal screen orientation while in fullscreen is enabled at build time. This is
      * used when we need to safely initialize a component before the {@link DeviceConfig} flag
diff --git a/services/core/java/com/android/server/wm/AppCompatController.java b/services/core/java/com/android/server/wm/AppCompatController.java
index 173362c..6c344c6 100644
--- a/services/core/java/com/android/server/wm/AppCompatController.java
+++ b/services/core/java/com/android/server/wm/AppCompatController.java
@@ -16,7 +16,6 @@
 package com.android.server.wm;
 
 import android.annotation.NonNull;
-import android.annotation.Nullable;
 import android.content.pm.PackageManager;
 
 import com.android.server.wm.utils.OptPropFactory;
@@ -118,14 +117,6 @@
         return mAppCompatOverrides.getAppCompatResizeOverrides();
     }
 
-    @Nullable
-    AppCompatCameraPolicy getAppCompatCameraPolicy() {
-        if (mActivityRecord.mDisplayContent != null) {
-            return mActivityRecord.mDisplayContent.mAppCompatCameraPolicy;
-        }
-        return null;
-    }
-
     @NonNull
     AppCompatReachabilityPolicy getAppCompatReachabilityPolicy() {
         return mAppCompatReachabilityPolicy;
diff --git a/services/core/java/com/android/server/wm/AppCompatOrientationOverrides.java b/services/core/java/com/android/server/wm/AppCompatOrientationOverrides.java
index bd01351..c84711d 100644
--- a/services/core/java/com/android/server/wm/AppCompatOrientationOverrides.java
+++ b/services/core/java/com/android/server/wm/AppCompatOrientationOverrides.java
@@ -16,6 +16,7 @@
 
 package com.android.server.wm;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.content.pm.ActivityInfo.OVERRIDE_ANY_ORIENTATION;
 import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED;
 import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION;
@@ -106,6 +107,16 @@
         return isChangeEnabled(mActivityRecord, OVERRIDE_RESPECT_REQUESTED_ORIENTATION);
     }
 
+    boolean shouldRespectRequestedOrientationDueToOverride() {
+        // Checking TaskFragment rather than ActivityRecord to ensure that transition
+        // between fullscreen and PiP would work well. Checking TaskFragment rather than
+        // Task to ensure that Activity Embedding is excluded.
+        return mActivityRecord.isVisibleRequested() && mActivityRecord.getTaskFragment() != null
+                && mActivityRecord.getTaskFragment().getWindowingMode() == WINDOWING_MODE_FULLSCREEN
+                && mActivityRecord.mAppCompatController.getAppCompatOrientationOverrides()
+                    .isOverrideRespectRequestedOrientationEnabled();
+    }
+
     /**
      * Whether an app is calling {@link android.app.Activity#setRequestedOrientation}
      * in a loop and orientation request should be ignored.
diff --git a/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java b/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java
index 7477c62..f5d58ea 100644
--- a/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java
+++ b/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java
@@ -58,16 +58,15 @@
                 && displayContent.getIgnoreOrientationRequest();
         final boolean shouldApplyUserFullscreenOverride = mAppCompatOverrides
                 .getAppCompatAspectRatioOverrides().shouldApplyUserFullscreenOverride();
-        final boolean isCameraActive = displayContent != null
-                && displayContent.mAppCompatCameraPolicy.isCameraActive(mActivityRecord,
-                        /* mustBeFullscreen */ true);
+        final boolean shouldCameraCompatControlOrientation =
+                AppCompatCameraPolicy.shouldCameraCompatControlOrientation(mActivityRecord);
         if (shouldApplyUserFullscreenOverride && isIgnoreOrientationRequestEnabled
                 // Do not override orientation to fullscreen for camera activities.
                 // Fixed-orientation activities are rarely tested in other orientations, and it
                 // often results in sideways or stretched previews. As the camera compat treatment
                 // targets fixed-orientation activities, overriding the orientation disables the
                 // treatment.
-                && !isCameraActive) {
+                && !shouldCameraCompatControlOrientation) {
             Slog.v(TAG, "Requested orientation " + screenOrientationToString(candidate)
                     + " for " + mActivityRecord + " is overridden to "
                     + screenOrientationToString(SCREEN_ORIENTATION_USER)
@@ -97,7 +96,7 @@
         if (displayContent != null
                 && mAppCompatOverrides.getAppCompatCameraOverrides()
                     .isOverrideOrientationOnlyForCameraEnabled()
-                && !displayContent.mAppCompatCameraPolicy
+                && !AppCompatCameraPolicy
                     .isActivityEligibleForOrientationOverride(mActivityRecord)) {
             return candidate;
         }
@@ -113,7 +112,7 @@
                 // often results in sideways or stretched previews. As the camera compat treatment
                 // targets fixed-orientation activities, overriding the orientation disables the
                 // treatment.
-                && !isCameraActive) {
+                && !shouldCameraCompatControlOrientation) {
             Slog.v(TAG, "Requested orientation  " + screenOrientationToString(candidate)
                     + " for " + mActivityRecord + " is overridden to "
                     + screenOrientationToString(SCREEN_ORIENTATION_USER));
@@ -192,8 +191,9 @@
                         + mActivityRecord);
                 return true;
             }
-            final AppCompatCameraPolicy cameraPolicy = mActivityRecord.mAppCompatController
-                    .getAppCompatCameraPolicy();
+
+            final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy
+                    .getAppCompatCameraPolicy(mActivityRecord);
             if (cameraPolicy != null
                     && cameraPolicy.isTreatmentEnabledForActivity(mActivityRecord)) {
                 Slog.w(TAG, "Ignoring orientation update to "
@@ -211,5 +211,4 @@
         }
         return false;
     }
-
 }
diff --git a/services/core/java/com/android/server/wm/AppCompatUtils.java b/services/core/java/com/android/server/wm/AppCompatUtils.java
index 69421d0..8d84248 100644
--- a/services/core/java/com/android/server/wm/AppCompatUtils.java
+++ b/services/core/java/com/android/server/wm/AppCompatUtils.java
@@ -185,8 +185,8 @@
                         && aspectRatioOverrides.shouldEnableUserAspectRatioSettings();
         appCompatTaskInfo.setEligibleForUserAspectRatioButton(eligibleForAspectRatioButton);
         appCompatTaskInfo.setTopActivityLetterboxed(top.areBoundsLetterboxed());
-        appCompatTaskInfo.cameraCompatTaskInfo.freeformCameraCompatMode = top.mAppCompatController
-                .getAppCompatCameraOverrides().getFreeformCameraCompatMode();
+        appCompatTaskInfo.cameraCompatTaskInfo.freeformCameraCompatMode =
+                AppCompatCameraPolicy.getCameraCompatFreeformMode(top);
         appCompatTaskInfo.setHasMinAspectRatioOverride(top.mAppCompatController
                 .getDesktopAppCompatAspectRatioPolicy().hasMinAspectRatioOverride(task));
     }
diff --git a/services/core/java/com/android/server/wm/AppTaskImpl.java b/services/core/java/com/android/server/wm/AppTaskImpl.java
index d699af8..4d17ed2 100644
--- a/services/core/java/com/android/server/wm/AppTaskImpl.java
+++ b/services/core/java/com/android/server/wm/AppTaskImpl.java
@@ -160,6 +160,7 @@
             Intent intent, String resolvedType, Bundle bOptions) {
         checkCallerOrSystemOrRoot();
         mService.assertPackageMatchesCallingUid(callingPackage);
+        mService.mAmInternal.addCreatorToken(intent);
 
         int callingUser = UserHandle.getCallingUserId();
         Task task;
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 90d33fb..932f268 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -88,9 +88,9 @@
 import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
 import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation;
 import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ANIM;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS_ANIM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ANIM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS_ANIM;
 import static com.android.server.wm.AppTransitionProto.APP_TRANSITION_STATE;
 import static com.android.server.wm.AppTransitionProto.LAST_USED_APP_TRANSITION;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
index ab02d49..741eefa 100644
--- a/services/core/java/com/android/server/wm/AppTransitionController.java
+++ b/services/core/java/com/android/server/wm/AppTransitionController.java
@@ -57,8 +57,8 @@
 import static android.view.WindowManager.TRANSIT_TO_BACK;
 import static android.view.WindowManager.TRANSIT_TO_FRONT;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS_ANIM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS_ANIM;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
 import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_SNAPSHOT;
diff --git a/services/core/java/com/android/server/wm/BLASTSyncEngine.java b/services/core/java/com/android/server/wm/BLASTSyncEngine.java
index 4554b21..7deb6a8 100644
--- a/services/core/java/com/android/server/wm/BLASTSyncEngine.java
+++ b/services/core/java/com/android/server/wm/BLASTSyncEngine.java
@@ -18,7 +18,7 @@
 
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_SYNC_ENGINE;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SYNC_ENGINE;
 import static com.android.server.wm.WindowState.BLAST_TIMEOUT_DURATION;
 
 import android.annotation.NonNull;
diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java
index dd86a14..94cd2e6 100644
--- a/services/core/java/com/android/server/wm/BackNavigationController.java
+++ b/services/core/java/com/android/server/wm/BackNavigationController.java
@@ -27,7 +27,7 @@
 import static android.view.WindowManager.TRANSIT_PREPARE_BACK_NAVIGATION;
 import static android.view.WindowManager.TRANSIT_TO_BACK;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_BACK_PREVIEW;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_BACK_PREVIEW;
 import static com.android.server.wm.BackNavigationProto.ANIMATION_IN_PROGRESS;
 import static com.android.server.wm.BackNavigationProto.ANIMATION_RUNNING;
 import static com.android.server.wm.BackNavigationProto.LAST_BACK_TYPE;
diff --git a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
index 2259b5a..515f148 100644
--- a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
+++ b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
@@ -1120,7 +1120,9 @@
             @Nullable Task targetTask, int launchFlags, int balCode, int callingUid,
             int realCallingUid, TaskDisplayArea preferredTaskDisplayArea) {
         // BAL Exception allowed in all cases
-        if (balCode == BAL_ALLOW_ALLOWLISTED_UID) {
+        if (balCode == BAL_ALLOW_ALLOWLISTED_UID
+                || (android.security.Flags.asmReintroduceGracePeriod()
+                    && balCode == BAL_ALLOW_GRACE_PERIOD)) {
             return true;
         }
 
@@ -1173,10 +1175,15 @@
                 ArrayList<Task> visibleTasks = displayArea.getVisibleTasks();
                 for (int i = 0; i < visibleTasks.size(); i++) {
                     Task task = visibleTasks.get(i);
-                    if (visibleTasks.size() == 1 && task.isActivityTypeHomeOrRecents()) {
-                        bas.optedIn(task.getTopMostActivity());
-                    } else {
+                    if (android.security.Flags.asmReintroduceGracePeriod()) {
                         bas = checkTopActivityForAsm(task, callingUid, /*sourceRecord*/null, bas);
+                    } else {
+                        if (visibleTasks.size() == 1 && task.isActivityTypeHomeOrRecents()) {
+                            bas.optedIn(task.getTopMostActivity());
+                        } else {
+                            bas = checkTopActivityForAsm(
+                                task, callingUid, /*sourceRecord*/null, bas);
+                        }
                     }
                 }
             }
diff --git a/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java b/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java
index 1073713..264c8be 100644
--- a/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java
+++ b/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java
@@ -146,7 +146,7 @@
                     "process bound by foreground uid");
         }
         // Allow if the caller has an activity in any foreground task.
-        if (checkConfiguration.checkVisibility && hasActivityInVisibleTask
+        if (checkConfiguration.checkOtherExemptions && hasActivityInVisibleTask
                 && appSwitchState != APP_SWITCH_DISALLOW) {
             return new BalVerdict(BAL_ALLOW_FOREGROUND, /*background*/ false,
                     "process has activity in foreground task");
diff --git a/services/core/java/com/android/server/wm/BlackFrame.java b/services/core/java/com/android/server/wm/BlackFrame.java
index ba4ab7d..7d6cf002 100644
--- a/services/core/java/com/android/server/wm/BlackFrame.java
+++ b/services/core/java/com/android/server/wm/BlackFrame.java
@@ -16,7 +16,7 @@
 
 package com.android.server.wm;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_SURFACE_ALLOC;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_SURFACE_ALLOC;
 
 import android.graphics.Rect;
 import android.view.Surface.OutOfResourcesException;
diff --git a/services/core/java/com/android/server/wm/CameraCompatFreeformPolicy.java b/services/core/java/com/android/server/wm/CameraCompatFreeformPolicy.java
index e3232e0..2a0252a 100644
--- a/services/core/java/com/android/server/wm/CameraCompatFreeformPolicy.java
+++ b/services/core/java/com/android/server/wm/CameraCompatFreeformPolicy.java
@@ -21,6 +21,8 @@
 import static android.app.CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_NONE;
 import static android.app.CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE;
 import static android.app.CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_PORTRAIT;
+import static android.app.WindowConfiguration.WINDOW_CONFIG_APP_BOUNDS;
+import static android.app.WindowConfiguration.WINDOW_CONFIG_DISPLAY_ROTATION;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LOCKED;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
 import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
@@ -29,11 +31,13 @@
 import static android.view.Surface.ROTATION_0;
 import static android.view.Surface.ROTATION_180;
 
+import static com.android.server.wm.AppCompatConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.app.CameraCompatTaskInfo;
 import android.content.pm.ActivityInfo;
 import android.content.res.Configuration;
 import android.view.DisplayInfo;
@@ -41,7 +45,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.protolog.ProtoLog;
-import com.android.internal.protolog.ProtoLogGroup;
+import com.android.internal.protolog.WmProtoLogGroups;
 import com.android.window.flags.Flags;
 
 /**
@@ -63,8 +67,6 @@
     @NonNull
     private final CameraStateMonitor mCameraStateMonitor;
 
-    private boolean mIsCameraCompatTreatmentPending = false;
-
     @Nullable
     private Task mCameraTask;
 
@@ -99,13 +101,27 @@
         return mIsRunning;
     }
 
-    // Refreshing only when configuration changes after rotation or camera split screen aspect ratio
-    // treatment is enabled.
+    // Refreshing only when configuration changes after applying camera compat treatment.
     @Override
     public boolean shouldRefreshActivity(@NonNull ActivityRecord activity,
             @NonNull Configuration newConfig,
             @NonNull Configuration lastReportedConfig) {
-        return isTreatmentEnabledForActivity(activity) && mIsCameraCompatTreatmentPending;
+        return isTreatmentEnabledForActivity(activity, /* shouldCheckOrientation= */ true)
+                && haveCameraCompatAttributesChanged(newConfig, lastReportedConfig);
+    }
+
+    private boolean haveCameraCompatAttributesChanged(@NonNull Configuration newConfig,
+            @NonNull Configuration lastReportedConfig) {
+        // Camera compat treatment changes the following:
+        // - Letterboxes app bounds to camera compat aspect ratio in app's requested orientation,
+        // - Changes display rotation so it matches what the app expects in its chosen orientation,
+        // - Rotate-and-crop camera feed to match that orientation (this changes iff the display
+        //     rotation changes, so no need to check).
+        final long diff = newConfig.windowConfiguration.diff(lastReportedConfig.windowConfiguration,
+                /* compareUndefined= */ true);
+        final boolean appBoundsChanged = (diff & WINDOW_CONFIG_APP_BOUNDS) != 0;
+        final boolean displayRotationChanged = (diff & WINDOW_CONFIG_DISPLAY_ROTATION) != 0;
+        return appBoundsChanged || displayRotationChanged;
     }
 
     /**
@@ -123,30 +139,34 @@
      * </ul>
      */
     @VisibleForTesting
-    boolean shouldApplyFreeformTreatmentForCameraCompat(@NonNull ActivityRecord activity) {
-        return Flags.cameraCompatForFreeform() && !activity.info.isChangeEnabled(
+    boolean isCameraCompatForFreeformEnabledForActivity(@NonNull ActivityRecord activity) {
+        return Flags.enableCameraCompatForDesktopWindowing() && !activity.info.isChangeEnabled(
                 ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT);
     }
 
     @Override
     public void onCameraOpened(@NonNull ActivityRecord cameraActivity,
             @NonNull String cameraId) {
-        if (!isTreatmentEnabledForActivity(cameraActivity)) {
+        // Do not check orientation outside of the config recompute, as the app's orientation intent
+        // might be obscured by a fullscreen override. Especially for apps which have a camera
+        // functionality which is not the main focus of the app: while most of the app might work
+        // well in fullscreen, often the camera setup still assumes it will run on a portrait device
+        // in its natural orientation and comes out stretched or sideways.
+        // Config recalculation will later check the original orientation to avoid applying
+        // treatment to apps optimized for large screens.
+        if (!isTreatmentEnabledForActivity(cameraActivity, /* shouldCheckOrientation= */ false)) {
             return;
         }
-        final int existingCameraCompatMode = cameraActivity.mAppCompatController
-                .getAppCompatCameraOverrides()
-                        .getFreeformCameraCompatMode();
-        final int newCameraCompatMode = getCameraCompatMode(cameraActivity);
-        if (newCameraCompatMode != existingCameraCompatMode) {
-            mIsCameraCompatTreatmentPending = true;
-            mCameraTask = cameraActivity.getTask();
-            cameraActivity.mAppCompatController.getAppCompatCameraOverrides()
-                    .setFreeformCameraCompatMode(newCameraCompatMode);
-            forceUpdateActivityAndTask(cameraActivity);
-        } else {
-            mIsCameraCompatTreatmentPending = false;
-        }
+
+        cameraActivity.recomputeConfiguration();
+        updateCameraCompatMode(cameraActivity);
+        cameraActivity.getTask().dispatchTaskInfoChangedIfNeeded(/* force= */ true);
+        cameraActivity.ensureActivityConfiguration(/* ignoreVisibility= */ false);
+    }
+
+    private void updateCameraCompatMode(@NonNull ActivityRecord cameraActivity) {
+        cameraActivity.mAppCompatController.getAppCompatCameraOverrides()
+                .setFreeformCameraCompatMode(getCameraCompatMode(cameraActivity));
     }
 
     @Override
@@ -158,7 +178,7 @@
                 : null;
         if (topActivity != null) {
             if (isActivityForCameraIdRefreshing(topActivity, cameraId)) {
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_STATES,
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_STATES,
                         "Display id=%d is notified that Camera %s is closed but activity is"
                                 + " still refreshing. Rescheduling an update.",
                         mDisplayContent.mDisplayId, cameraId);
@@ -166,20 +186,43 @@
             }
         }
         mCameraTask = null;
-        mIsCameraCompatTreatmentPending = false;
         return true;
     }
 
-    private void forceUpdateActivityAndTask(ActivityRecord cameraActivity) {
-        cameraActivity.recomputeConfiguration();
-        cameraActivity.updateReportedConfigurationAndSend();
-        Task cameraTask = cameraActivity.getTask();
-        if (cameraTask != null) {
-            cameraTask.dispatchTaskInfoChangedIfNeeded(/* force= */ true);
-        }
+    boolean shouldCameraCompatControlOrientation(@NonNull ActivityRecord activity) {
+        return isCameraRunningAndWindowingModeEligible(activity);
     }
 
-    private static int getCameraCompatMode(@NonNull ActivityRecord topActivity) {
+    boolean isCameraRunningAndWindowingModeEligible(@NonNull ActivityRecord activity) {
+        return activity.inFreeformWindowingMode()
+                && mCameraStateMonitor.isCameraRunningForActivity(activity);
+    }
+
+    boolean shouldCameraCompatControlAspectRatio(@NonNull ActivityRecord activity) {
+        // Camera compat should direct aspect ratio when in camera compat mode, unless an app has a
+        // different camera compat aspect ratio set: this allows per-app camera compat override
+        // aspect ratio to be smaller than the default.
+        return isInFreeformCameraCompatMode(activity) && !activity.mAppCompatController
+                .getAppCompatCameraOverrides().isOverrideMinAspectRatioForCameraEnabled();
+    }
+
+    boolean isInFreeformCameraCompatMode(@NonNull ActivityRecord activity) {
+        return getCameraCompatMode(activity) != CAMERA_COMPAT_FREEFORM_NONE;
+    }
+
+    float getCameraCompatAspectRatio(@NonNull ActivityRecord activityRecord) {
+        if (shouldCameraCompatControlAspectRatio(activityRecord)) {
+            return activityRecord.mWmService.mAppCompatConfiguration.getCameraCompatAspectRatio();
+        }
+
+        return MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
+    }
+
+    @CameraCompatTaskInfo.FreeformCameraCompatMode
+    int getCameraCompatMode(@NonNull ActivityRecord topActivity) {
+        if (!isTreatmentEnabledForActivity(topActivity, /* shouldCheckOrientation= */ true)) {
+            return CAMERA_COMPAT_FREEFORM_NONE;
+        }
         final int appOrientation = topActivity.getRequestedConfigurationOrientation();
         // It is very important to check the original (actual) display rotation, and not the
         // sandboxed rotation that camera compat treatment sets.
@@ -219,15 +262,24 @@
      * <ul>
      *     <li>Treatment is enabled.
      *     <li>Camera is active for the package.
-     *     <li>The app has a fixed orientation.
+     *     <li>The app has a fixed orientation if {@code checkOrientation} is true.
      *     <li>The app is in freeform windowing mode.
      * </ul>
+     *
+     * @param checkOrientation Whether to take apps orientation into account for this check. Only
+     *                         fixed-orientation apps should be targeted, but this might be
+     *                         obscured by OEMs via fullscreen override and the app's original
+     *                         intent inaccessible when the camera opens. Thus, policy would pass
+     *                         {@code false} here when considering whether to trigger config
+     *                         recalculation, and later pass {@code true} during recalculation.
      */
-    private boolean isTreatmentEnabledForActivity(@NonNull ActivityRecord activity) {
+    @VisibleForTesting
+    boolean isTreatmentEnabledForActivity(@NonNull ActivityRecord activity,
+            boolean checkOrientation) {
         int orientation = activity.getRequestedConfigurationOrientation();
-        return shouldApplyFreeformTreatmentForCameraCompat(activity)
+        return isCameraCompatForFreeformEnabledForActivity(activity)
                 && mCameraStateMonitor.isCameraRunningForActivity(activity)
-                && orientation != ORIENTATION_UNDEFINED
+                && (!checkOrientation || orientation != ORIENTATION_UNDEFINED)
                 && activity.inFreeformWindowingMode()
                 // "locked" and "nosensor" values are often used by camera apps that can't
                 // handle dynamic changes so we shouldn't force-letterbox them.
@@ -239,7 +291,7 @@
 
     private boolean isActivityForCameraIdRefreshing(@NonNull ActivityRecord topActivity,
             @NonNull String cameraId) {
-        if (!isTreatmentEnabledForActivity(topActivity)
+        if (!isTreatmentEnabledForActivity(topActivity, /* checkOrientation= */ true)
                 || mCameraStateMonitor.isCameraWithIdRunningForActivity(topActivity, cameraId)) {
             return false;
         }
diff --git a/services/core/java/com/android/server/wm/CameraStateMonitor.java b/services/core/java/com/android/server/wm/CameraStateMonitor.java
index 8bfef6d..3b6e30a 100644
--- a/services/core/java/com/android/server/wm/CameraStateMonitor.java
+++ b/services/core/java/com/android/server/wm/CameraStateMonitor.java
@@ -15,7 +15,7 @@
  */
 package com.android.server.wm;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STATES;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STATES;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 
diff --git a/services/core/java/com/android/server/wm/CompatModePackages.java b/services/core/java/com/android/server/wm/CompatModePackages.java
index 44202a2..a63ae2e 100644
--- a/services/core/java/com/android/server/wm/CompatModePackages.java
+++ b/services/core/java/com/android/server/wm/CompatModePackages.java
@@ -16,7 +16,7 @@
 
 package com.android.server.wm;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_CONFIGURATION;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.CompatScaleProvider.COMPAT_SCALE_MODE_SYSTEM_FIRST;
diff --git a/services/core/java/com/android/server/wm/ContentRecorder.java b/services/core/java/com/android/server/wm/ContentRecorder.java
index 7e7073c..bc33946 100644
--- a/services/core/java/com/android/server/wm/ContentRecorder.java
+++ b/services/core/java/com/android/server/wm/ContentRecorder.java
@@ -23,7 +23,7 @@
 import static android.view.ContentRecordingSession.RECORD_CONTENT_TASK;
 import static android.view.ViewProtoEnums.DISPLAY_STATE_OFF;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONTENT_RECORDING;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_CONTENT_RECORDING;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
diff --git a/services/core/java/com/android/server/wm/ContentRecordingController.java b/services/core/java/com/android/server/wm/ContentRecordingController.java
index 283f819..dd7675f 100644
--- a/services/core/java/com/android/server/wm/ContentRecordingController.java
+++ b/services/core/java/com/android/server/wm/ContentRecordingController.java
@@ -16,7 +16,7 @@
 
 package com.android.server.wm;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONTENT_RECORDING;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_CONTENT_RECORDING;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
diff --git a/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java b/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java
index 3a2cffb..3dc035e 100644
--- a/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java
+++ b/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java
@@ -18,7 +18,7 @@
 
 import static android.view.WindowManager.TRANSIT_CHANGE;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS;
 import static com.android.server.wm.ActivityTaskManagerService.POWER_MODE_REASON_CHANGE_DISPLAY;
 import static com.android.server.wm.utils.DisplayInfoOverrides.WM_OVERRIDE_FIELDS;
 import static com.android.server.wm.utils.DisplayInfoOverrides.copyDisplayInfoFields;
diff --git a/services/core/java/com/android/server/wm/DesktopAppCompatAspectRatioPolicy.java b/services/core/java/com/android/server/wm/DesktopAppCompatAspectRatioPolicy.java
index 1924691..c8cb621 100644
--- a/services/core/java/com/android/server/wm/DesktopAppCompatAspectRatioPolicy.java
+++ b/services/core/java/com/android/server/wm/DesktopAppCompatAspectRatioPolicy.java
@@ -188,21 +188,17 @@
         }
 
         final ActivityInfo info = mActivityRecord.info;
-        if (info.applicationInfo == null) {
-            return info.getMinAspectRatio();
-        }
-
         final AppCompatAspectRatioOverrides aspectRatioOverrides =
                 mAppCompatOverrides.getAppCompatAspectRatioOverrides();
         if (shouldApplyUserMinAspectRatioOverride(task)) {
             return aspectRatioOverrides.getUserMinAspectRatio();
         }
 
-        final DisplayContent dc = task.mDisplayContent;
-        final boolean shouldOverrideMinAspectRatioForCamera = dc != null
-                && dc.mAppCompatCameraPolicy.shouldOverrideMinAspectRatioForCamera(mActivityRecord);
         if (!aspectRatioOverrides.shouldOverrideMinAspectRatio()
-                && !shouldOverrideMinAspectRatioForCamera) {
+                && !AppCompatCameraPolicy.shouldOverrideMinAspectRatioForCamera(mActivityRecord)) {
+            if (mActivityRecord.isUniversalResizeable()) {
+                return 0;
+            }
             return info.getMinAspectRatio();
         }
 
@@ -246,6 +242,9 @@
         if (mTransparentPolicy.isRunning()) {
             return mTransparentPolicy.getInheritedMaxAspectRatio();
         }
+        if (mActivityRecord.isUniversalResizeable()) {
+            return 0;
+        }
         return mActivityRecord.info.getMaxAspectRatio();
     }
 
diff --git a/services/core/java/com/android/server/wm/DesktopModeBoundsCalculator.java b/services/core/java/com/android/server/wm/DesktopModeBoundsCalculator.java
index 34b5f6a..1a8f5fc 100644
--- a/services/core/java/com/android/server/wm/DesktopModeBoundsCalculator.java
+++ b/services/core/java/com/android/server/wm/DesktopModeBoundsCalculator.java
@@ -30,7 +30,6 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityOptions;
-import android.app.TaskInfo;
 import android.content.pm.ActivityInfo.ScreenOrientation;
 import android.content.pm.ActivityInfo.WindowLayout;
 import android.graphics.Rect;
@@ -98,7 +97,6 @@
     private static Rect calculateInitialBounds(@NonNull Task task,
             @NonNull ActivityRecord activity, @NonNull Rect stableBounds
     ) {
-        final TaskInfo taskInfo = task.getTaskInfo();
         // Display bounds not taking into account insets.
         final TaskDisplayArea displayArea = task.getDisplayArea();
         final Rect screenBounds = displayArea.getBounds();
@@ -118,14 +116,15 @@
         float appAspectRatio = desktopAppCompatAspectRatioPolicy.calculateAspectRatio(task);
         final float tdaWidth = stableBounds.width();
         final float tdaHeight = stableBounds.height();
+        final int taskConfigOrientation = task.getConfiguration().orientation;
         final int activityOrientation = getActivityOrientation(activity, task);
-        final Size initialSize = switch (taskInfo.configuration.orientation) {
+        final Size initialSize = switch (taskConfigOrientation) {
             case ORIENTATION_LANDSCAPE -> {
                 // Device in landscape orientation.
                 if (appAspectRatio == 0) {
                     appAspectRatio = 1;
                 }
-                if (canChangeAspectRatio(desktopAppCompatAspectRatioPolicy, taskInfo, task)) {
+                if (canChangeAspectRatio(desktopAppCompatAspectRatioPolicy, task)) {
                     if (isFixedOrientationPortrait(activityOrientation)) {
                         // For portrait resizeable activities, respect apps fullscreen width but
                         // apply ideal size height.
@@ -143,7 +142,7 @@
                 // Device in portrait orientation.
                 final int customPortraitWidthForLandscapeApp = screenBounds.width()
                         - (DESKTOP_MODE_LANDSCAPE_APP_PADDING * 2);
-                if (canChangeAspectRatio(desktopAppCompatAspectRatioPolicy, taskInfo, task)) {
+                if (canChangeAspectRatio(desktopAppCompatAspectRatioPolicy, task)) {
                     if (isFixedOrientationLandscape(activityOrientation)) {
                         if (appAspectRatio == 0) {
                             appAspectRatio = tdaWidth / (tdaWidth - 1);
@@ -182,8 +181,8 @@
      */
     private static boolean canChangeAspectRatio(
             @NonNull DesktopAppCompatAspectRatioPolicy desktopAppCompatAspectRatioPolicy,
-            @NonNull TaskInfo taskInfo, @NonNull Task task) {
-        return taskInfo.isResizeable
+            @NonNull Task task) {
+        return task.isResizeable()
                 && !desktopAppCompatAspectRatioPolicy.hasMinAspectRatioOverride(task);
     }
 
diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java
index c5643ea..4824c16 100644
--- a/services/core/java/com/android/server/wm/Dimmer.java
+++ b/services/core/java/com/android/server/wm/Dimmer.java
@@ -16,11 +16,12 @@
 
 package com.android.server.wm;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_DIMMER;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_DIMMER;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.graphics.Rect;
 import android.util.Log;
 import android.view.Surface;
@@ -128,7 +129,7 @@
         /**
          * Set the parameters to prepare the dim to be relative parented to the dimming container
          */
-        void prepareReparent(@NonNull WindowContainer<?> geometryParent,
+        void prepareReparent(@Nullable WindowContainer<?> geometryParent,
                 @NonNull WindowState relativeParent) {
             mAnimationHelper.setRequestedRelativeParent(relativeParent);
             mAnimationHelper.setRequestedGeometryParent(geometryParent);
@@ -221,7 +222,7 @@
      * @param dimmingContainer      The container that is dimming. The dim layer will be rel-z
      *                              parented below it
      */
-    public void adjustPosition(@NonNull WindowContainer<?> geometryParent,
+    public void adjustPosition(@Nullable WindowContainer<?> geometryParent,
                                     @NonNull WindowState dimmingContainer) {
         if (mDimState != null) {
             mDimState.prepareReparent(geometryParent, dimmingContainer);
diff --git a/services/core/java/com/android/server/wm/DimmerAnimationHelper.java b/services/core/java/com/android/server/wm/DimmerAnimationHelper.java
index bc18895..3999e03 100644
--- a/services/core/java/com/android/server/wm/DimmerAnimationHelper.java
+++ b/services/core/java/com/android/server/wm/DimmerAnimationHelper.java
@@ -16,7 +16,7 @@
 
 package com.android.server.wm;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_DIMMER;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_DIMMER;
 import static com.android.server.wm.AlphaAnimationSpecProto.DURATION_MS;
 import static com.android.server.wm.AlphaAnimationSpecProto.FROM;
 import static com.android.server.wm.AlphaAnimationSpecProto.TO;
@@ -108,7 +108,7 @@
     }
 
     // Sets the requested layer to reparent the dim to without applying it immediately
-    void setRequestedGeometryParent(WindowContainer<?> geometryParent) {
+    void setRequestedGeometryParent(@Nullable WindowContainer<?> geometryParent) {
         if (geometryParent != null) {
             mRequestedProperties.mGeometryParent = geometryParent;
         }
diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java
index ca5485e..29ffda7 100644
--- a/services/core/java/com/android/server/wm/DisplayArea.java
+++ b/services/core/java/com/android/server/wm/DisplayArea.java
@@ -16,7 +16,6 @@
 
 package com.android.server.wm;
 
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@@ -24,7 +23,7 @@
 import static android.window.DisplayAreaOrganizer.FEATURE_UNDEFINED;
 import static android.window.DisplayAreaOrganizer.FEATURE_WINDOW_TOKENS;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
 import static com.android.internal.util.Preconditions.checkState;
 import static com.android.server.wm.DisplayAreaProto.FEATURE_ID;
 import static com.android.server.wm.DisplayAreaProto.IS_IGNORING_ORIENTATION_REQUEST;
@@ -260,15 +259,14 @@
         if (mDisplayContent == null) {
             return false;
         }
-        ActivityRecord activity = mDisplayContent.topRunningActivity(
-                /* considerKeyguardState= */ true);
-        return activity != null && activity.getTaskFragment() != null
-                // Checking TaskFragment rather than ActivityRecord to ensure that transition
-                // between fullscreen and PiP would work well. Checking TaskFragment rather than
-                // Task to ensure that Activity Embedding is excluded.
-                && activity.getTaskFragment().getWindowingMode() == WINDOWING_MODE_FULLSCREEN
-                && activity.mAppCompatController.getAppCompatOrientationOverrides()
-                    .isOverrideRespectRequestedOrientationEnabled();
+
+        // Top running activity can be freeform and ignore orientation request from bottom activity
+        // that should be respected, Check all activities in display to make sure any eligible
+        // activity should be respected.
+        final ActivityRecord activity = mDisplayContent.getActivity((r) ->
+                r.mAppCompatController.getAppCompatOrientationOverrides()
+                    .shouldRespectRequestedOrientationDueToOverride());
+        return activity != null;
     }
 
     boolean getIgnoreOrientationRequest() {
diff --git a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java
index 8f471d7..afeeaf7 100644
--- a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java
+++ b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java
@@ -18,7 +18,7 @@
 
 import static android.window.DisplayAreaOrganizer.FEATURE_RUNTIME_TASK_CONTAINER_FIRST;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WINDOW_ORGANIZER;
 import static com.android.server.wm.DisplayArea.Type.ANY;
 
 import android.annotation.Nullable;
diff --git a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java
index bb596cc..8a2b8b65 100644
--- a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java
+++ b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java
@@ -29,7 +29,7 @@
 import static android.window.DisplayAreaOrganizer.FEATURE_WINDOWING_LAYER;
 import static android.window.DisplayAreaOrganizer.KEY_ROOT_DISPLAY_AREA_ID;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WINDOW_ORGANIZER;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 21212e5..d6ded51 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -88,17 +88,17 @@
 import static android.window.DisplayAreaOrganizer.FEATURE_IME;
 import static android.window.DisplayAreaOrganizer.FEATURE_ROOT;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_BOOT;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONTENT_RECORDING;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS_LIGHT;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IME;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_KEEP_SCREEN_ON;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_SCREEN_ON;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WALLPAPER;
-import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_BOOT;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_CONTENT_RECORDING;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS_LIGHT;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_IME;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_KEEP_SCREEN_ON;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SCREEN_ON;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WALLPAPER;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_TRANSACTIONS;
 import static com.android.internal.util.LatencyTracker.ACTION_ROTATE_SCREEN;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index e6f6215..04a625b 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -71,14 +71,15 @@
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_RIGHT;
 import static android.window.DisplayAreaOrganizer.FEATURE_UNDEFINED;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ANIM;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_SCREEN_ON;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ANIM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SCREEN_ON;
 import static com.android.server.policy.PhoneWindowManager.TOAST_WINDOW_TIMEOUT;
 import static com.android.server.policy.WindowManagerPolicy.TRANSIT_PREVIEW_DONE;
 import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
+import static com.android.window.flags.Flags.enableFullyImmersiveInDesktop;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -1073,7 +1074,8 @@
 
         final String systemUiPermission =
                 mService.isCallerVirtualDeviceOwner(mDisplayContent.getDisplayId(), callingUid)
-                        // Allow virtual device owners to add system windows on their displays.
+                        && mDisplayContent.isTrusted()
+                        // Virtual device owners can add system windows on their trusted displays.
                         ? android.Manifest.permission.CREATE_VIRTUAL_DEVICE
                         : android.Manifest.permission.STATUS_BAR_SERVICE;
 
@@ -2156,6 +2158,11 @@
         }
         mDecorInsets.invalidate();
         mDecorInsets.mInfoForRotation[rotation].set(newInfo);
+        if (!mService.mDisplayEnabled) {
+            // There could be other pending changes during booting. It might be better to let the
+            // clients receive the new states earlier.
+            return true;
+        }
         return !sameConfigFrame;
     }
 
@@ -2509,10 +2516,16 @@
                 defaultTaskDisplayArea.getRootTask(task -> task.isVisible()
                         && task.getTopLeafTask().getAdjacentTask() != null)
                         != null;
-        final boolean freeformRootTaskVisible =
-                defaultTaskDisplayArea.isRootTaskVisible(WINDOWING_MODE_FREEFORM);
+        final Task topFreeformTask = defaultTaskDisplayArea
+                .getTopRootTaskInWindowingMode(WINDOWING_MODE_FREEFORM);
+        final boolean freeformRootTaskVisible = topFreeformTask != null
+                && topFreeformTask.isVisible();
+        final boolean inNonFullscreenFreeformMode = freeformRootTaskVisible
+                && !topFreeformTask.getBounds().equals(mDisplayContent.getBounds());
 
-        getInsetsPolicy().updateSystemBars(win, adjacentTasksVisible, freeformRootTaskVisible);
+        getInsetsPolicy().updateSystemBars(win, adjacentTasksVisible,
+                enableFullyImmersiveInDesktop()
+                        ? inNonFullscreenFreeformMode : freeformRootTaskVisible);
 
         final boolean topAppHidesStatusBar = topAppHidesSystemBar(Type.statusBars());
         if (getStatusBar() != null) {
diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java
index 8c06cfe..4cf1fb4 100644
--- a/services/core/java/com/android/server/wm/DisplayRotation.java
+++ b/services/core/java/com/android/server/wm/DisplayRotation.java
@@ -27,8 +27,8 @@
 import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE;
 import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ANIM;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ANIM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
 import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_OPEN;
 import static com.android.server.wm.DisplayRotationProto.FIXED_TO_USER_ROTATION_MODE;
 import static com.android.server.wm.DisplayRotationProto.FROZEN_TO_USER_ROTATION;
diff --git a/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java b/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java
index efc3843..0ccc0fe 100644
--- a/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java
@@ -29,7 +29,8 @@
 import static android.content.res.Configuration.ORIENTATION_UNDEFINED;
 import static android.view.Display.TYPE_INTERNAL;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
+import static com.android.server.wm.AppCompatConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
 import static com.android.server.wm.DisplayRotationReversionController.REVERSION_TYPE_CAMERA_COMPAT;
 
 import android.annotation.NonNull;
@@ -133,6 +134,11 @@
         return mLastReportedOrientation;
     }
 
+    float getCameraCompatAspectRatio(@NonNull ActivityRecord unusedActivity) {
+        // This policy does not apply camera compat aspect ratio by default, only via overrides.
+        return MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
+    }
+
     @ScreenOrientation
     private synchronized int getOrientationInternal() {
         if (!isTreatmentEnabledForDisplay()) {
@@ -271,7 +277,7 @@
 
     boolean isActivityEligibleForOrientationOverride(@NonNull ActivityRecord activity) {
         return isTreatmentEnabledForDisplay()
-                && isCameraActive(activity, /* mustBeFullscreen */ true)
+                && isCameraRunningAndWindowingModeEligible(activity, /* mustBeFullscreen */ true)
                 && activity.mAppCompatController.getAppCompatCameraOverrides()
                     .shouldForceRotateForCameraCompat();
     }
@@ -290,7 +296,17 @@
         return isTreatmentEnabledForActivity(activity, /* mustBeFullscreen */ true);
     }
 
-    boolean isCameraActive(@NonNull ActivityRecord activity, boolean mustBeFullscreen) {
+    boolean shouldCameraCompatControlOrientation(@NonNull ActivityRecord activity) {
+        return isCameraRunningAndWindowingModeEligible(activity, /* mustBeFullscreen= */ true);
+    }
+
+    boolean shouldCameraCompatControlAspectRatio(@NonNull ActivityRecord unusedActivity) {
+        // This policy does not apply camera compat aspect ratio by default, only via overrides.
+        return false;
+    }
+
+    boolean isCameraRunningAndWindowingModeEligible(@NonNull ActivityRecord activity,
+            boolean mustBeFullscreen) {
         // Checking windowing mode on activity level because we don't want to
         // apply treatment in case of activity embedding.
         return (!mustBeFullscreen || !activity.inMultiWindowMode())
@@ -299,7 +315,8 @@
 
     private boolean isTreatmentEnabledForActivity(@Nullable ActivityRecord activity,
             boolean mustBeFullscreen) {
-        return activity != null && isCameraActive(activity, mustBeFullscreen)
+        return activity != null
+                && isCameraRunningAndWindowingModeEligible(activity, mustBeFullscreen)
                 && activity.getRequestedConfigurationOrientation() != ORIENTATION_UNDEFINED
                 // "locked" and "nosensor" values are often used by camera apps that can't
                 // handle dynamic changes so we shouldn't force rotate them.
@@ -428,6 +445,7 @@
     private boolean shouldOverrideMinAspectRatio(@NonNull ActivityRecord activityRecord) {
         return activityRecord.mAppCompatController.getAppCompatCameraOverrides()
                 .isOverrideMinAspectRatioForCameraEnabled()
-                        && isCameraActive(activityRecord, /* mustBeFullscreen= */ true);
+                        && isCameraRunningAndWindowingModeEligible(activityRecord,
+                                /* mustBeFullscreen= */ true);
     }
 }
diff --git a/services/core/java/com/android/server/wm/DisplayRotationReversionController.java b/services/core/java/com/android/server/wm/DisplayRotationReversionController.java
index b955738..930d4b1 100644
--- a/services/core/java/com/android/server/wm/DisplayRotationReversionController.java
+++ b/services/core/java/com/android/server/wm/DisplayRotationReversionController.java
@@ -19,7 +19,7 @@
 import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
 import static com.android.server.policy.WindowManagerPolicy.USER_ROTATION_LOCKED;
 
 import android.annotation.Nullable;
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index b09d63f..2a5a3a5 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -24,8 +24,8 @@
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_INTERCEPT_GLOBAL_DRAG_AND_DROP;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
-import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_TRANSACTIONS;
 import static com.android.server.wm.DragDropController.MSG_ANIMATION_END;
 import static com.android.server.wm.DragDropController.MSG_DRAG_END_TIMEOUT;
 import static com.android.server.wm.DragDropController.MSG_REMOVE_DRAG_SURFACE_TIMEOUT;
diff --git a/services/core/java/com/android/server/wm/EmbeddedWindowController.java b/services/core/java/com/android/server/wm/EmbeddedWindowController.java
index e007b1d..5ac4cf8 100644
--- a/services/core/java/com/android/server/wm/EmbeddedWindowController.java
+++ b/services/core/java/com/android/server/wm/EmbeddedWindowController.java
@@ -17,7 +17,7 @@
 package com.android.server.wm;
 
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_EMBEDDED_WINDOWS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_EMBEDDED_WINDOWS;
 import static com.android.server.wm.IdentifierProto.HASH_CODE;
 import static com.android.server.wm.IdentifierProto.TITLE;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
index 8cc2fd1..6a23aaa 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -19,7 +19,7 @@
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
 import static android.view.InsetsSource.ID_IME;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IME;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_IME;
 import static com.android.server.wm.DisplayContent.IME_TARGET_CONTROL;
 import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
 import static com.android.server.wm.ImeInsetsSourceProviderProto.IME_TARGET_FROM_IME;
diff --git a/services/core/java/com/android/server/wm/InputManagerCallback.java b/services/core/java/com/android/server/wm/InputManagerCallback.java
index 232c3b6..dcf0319 100644
--- a/services/core/java/com/android/server/wm/InputManagerCallback.java
+++ b/services/core/java/com/android/server/wm/InputManagerCallback.java
@@ -188,9 +188,8 @@
      * the application did not handle.
      */
     @Override
-    public KeyEvent dispatchUnhandledKey(
-            IBinder focusedToken, KeyEvent event, int policyFlags) {
-        return mService.mPolicy.dispatchUnhandledKey(focusedToken, event, policyFlags);
+    public boolean interceptUnhandledKey(KeyEvent event, IBinder focusedToken) {
+        return mService.mPolicy.interceptUnhandledKey(event, focusedToken);
     }
 
     /** Callback to get pointer layer. */
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java
index ddbfd70..16e88a3 100644
--- a/services/core/java/com/android/server/wm/InputMonitor.java
+++ b/services/core/java/com/android/server/wm/InputMonitor.java
@@ -41,7 +41,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
 import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS_LIGHT;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS_LIGHT;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_INPUT;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 import static com.android.server.wm.WindowManagerService.LOGTAG_INPUT_FOCUS;
@@ -222,7 +222,8 @@
             UserHandle clientUser) {
         final InputConsumerImpl existingConsumer = getInputConsumer(name);
         if (existingConsumer != null && existingConsumer.mClientUser.equals(clientUser)) {
-            throw new IllegalStateException("Existing input consumer found with name: " + name
+            destroyInputConsumer(existingConsumer.mToken);
+            Slog.w(TAG_WM, "Replacing existing input consumer found with name: " + name
                     + ", display: " + mDisplayId + ", user: " + clientUser);
         }
 
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index b414a862..24a6f118 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -47,6 +47,7 @@
 import android.view.WindowInsetsAnimation;
 import android.view.WindowInsetsAnimation.Bounds;
 import android.view.WindowManager;
+import android.view.inputmethod.Flags;
 import android.view.inputmethod.ImeTracker;
 import android.view.inputmethod.InputMethodManager;
 
@@ -412,6 +413,22 @@
                 state.addSource(imeSource);
                 return state;
             }
+        } else if (Flags.refactorInsetsController()
+                && (w.mMergedExcludeInsetsTypes & WindowInsets.Type.ime()) != 0) {
+            // In some cases (e.g. split screen from when the IME was requested and the animation
+            // actually starts) the insets should not be send, unless the flag is unset.
+            final InsetsSource originalImeSource = originalState.peekSource(ID_IME);
+            if (originalImeSource != null && originalImeSource.isVisible()) {
+                final InsetsState state = copyState
+                        ? new InsetsState(originalState)
+                        : originalState;
+                final InsetsSource imeSource = new InsetsSource(originalImeSource);
+                // Setting the height to zero, pretending we're in floating mode
+                imeSource.setFrame(0, 0, 0, 0);
+                imeSource.setVisibleFrame(imeSource.getFrame());
+                state.addSource(imeSource);
+                return state;
+            }
         }
         return originalState;
     }
@@ -611,8 +628,9 @@
         return (mForcedShowingTypes & types) == types;
     }
 
-    void updateSystemBars(WindowState win, boolean inSplitScreenMode, boolean inFreeformMode) {
-        mForcedShowingTypes = (inSplitScreenMode || inFreeformMode)
+    void updateSystemBars(WindowState win, boolean inSplitScreenMode,
+            boolean inNonFullscreenFreeformMode) {
+        mForcedShowingTypes = (inSplitScreenMode || inNonFullscreenFreeformMode)
                 ? (Type.statusBars() | Type.navigationBars())
                 : forceShowingNavigationBars(win)
                         ? Type.navigationBars()
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index 4f8332a..8f28f59 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -16,7 +16,7 @@
 
 package com.android.server.wm;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_INSETS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WINDOW_INSETS;
 import static com.android.server.wm.InsetsSourceProviderProto.CAPTURED_LEASH;
 import static com.android.server.wm.InsetsSourceProviderProto.CLIENT_VISIBLE;
 import static com.android.server.wm.InsetsSourceProviderProto.CONTROL;
@@ -162,6 +162,12 @@
         return mSource;
     }
 
+    @VisibleForTesting
+    @NonNull
+    Rect getSourceFrame() {
+        return mSourceFrame;
+    }
+
     /**
      * @return Whether the current flag configuration allows to control this source.
      */
diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java
index 03fadba..5dddf36 100644
--- a/services/core/java/com/android/server/wm/InsetsStateController.java
+++ b/services/core/java/com/android/server/wm/InsetsStateController.java
@@ -24,7 +24,7 @@
 import static android.view.WindowInsets.Type.mandatorySystemGestures;
 import static android.view.WindowInsets.Type.systemGestures;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IME;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_IME;
 import static com.android.server.wm.DisplayContentProto.IME_INSETS_SOURCE_PROVIDER;
 import static com.android.server.wm.DisplayContentProto.INSETS_SOURCE_PROVIDERS;
 
@@ -458,6 +458,12 @@
         mDisplayContent.notifyInsetsChanged(mDispatchInsetsChanged);
     }
 
+    void notifyInsetsChanged(ArraySet<WindowState> changedWindows) {
+        for (int i = changedWindows.size() - 1; i >= 0; i--) {
+            mDispatchInsetsChanged.accept(changedWindows.valueAt(i));
+        }
+    }
+
     /**
      * Checks if the control target has pending controls.
      *
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java
index 0c489d6..2fde5aa 100644
--- a/services/core/java/com/android/server/wm/KeyguardController.java
+++ b/services/core/java/com/android/server/wm/KeyguardController.java
@@ -62,6 +62,7 @@
 import com.android.internal.policy.IKeyguardDismissCallback;
 import com.android.server.inputmethod.InputMethodManagerInternal;
 import com.android.server.policy.WindowManagerPolicy;
+import com.android.window.flags.Flags;
 
 import java.io.PrintWriter;
 
@@ -73,6 +74,9 @@
  */
 class KeyguardController {
 
+    private static final boolean ENABLE_NEW_KEYGUARD_SHELL_TRANSITIONS =
+            Flags.ensureKeyguardDoesTransitionStarting();
+
     private static final String TAG = TAG_WITH_CLASS_NAME ? "KeyguardController" : TAG_ATM;
 
     static final String KEYGUARD_SLEEP_TOKEN_TAG = "keyguard";
@@ -201,6 +205,19 @@
             setWakeTransitionReady();
             return;
         }
+
+        if (ENABLE_NEW_KEYGUARD_SHELL_TRANSITIONS) {
+            final TransitionController transitionController =
+                    mWindowManager.mAtmService.getTransitionController();
+            final Transition transition = transitionController.getCollectingTransition();
+            if (transition != null && displayId == DEFAULT_DISPLAY) {
+                if (!keyguardShowing && state.mKeyguardShowing) {
+                    transition.addFlag(TRANSIT_FLAG_KEYGUARD_GOING_AWAY);
+                } else if (keyguardShowing && !state.mKeyguardShowing) {
+                    transition.addFlag(TRANSIT_FLAG_KEYGUARD_APPEARING);
+                }
+            }
+        }
         // Update the task snapshot if the screen will not be turned off. To make sure that the
         // unlocking animation can animate consistent content. The conditions are:
         // - Either AOD or keyguard changes to be showing. So if the states change individually,
@@ -231,8 +248,10 @@
                     || (keyguardShowing && !Display.isOffState(dc.getDisplayInfo().state))) {
                 // Keyguard decided to show or stopped going away. Send a transition to animate back
                 // to the locked state before holding the sleep token again
-                dc.requestTransitionAndLegacyPrepare(
-                        TRANSIT_TO_FRONT, TRANSIT_FLAG_KEYGUARD_APPEARING);
+                if (!ENABLE_NEW_KEYGUARD_SHELL_TRANSITIONS) {
+                    dc.requestTransitionAndLegacyPrepare(
+                            TRANSIT_TO_FRONT, TRANSIT_FLAG_KEYGUARD_APPEARING);
+                }
                 dc.mWallpaperController.adjustWallpaperWindows();
                 dc.executeAppTransition();
             }
diff --git a/services/core/java/com/android/server/wm/Letterbox.java b/services/core/java/com/android/server/wm/Letterbox.java
index 252590e..ca47133 100644
--- a/services/core/java/com/android/server/wm/Letterbox.java
+++ b/services/core/java/com/android/server/wm/Letterbox.java
@@ -19,6 +19,7 @@
 import static android.os.InputConstants.DEFAULT_DISPATCHING_TIMEOUT_MILLIS;
 import static android.view.SurfaceControl.HIDDEN;
 import static android.window.TaskConstants.TASK_CHILD_LAYER_LETTERBOX_BACKGROUND;
+import static android.window.TaskConstants.TASK_CHILD_LAYER_TASK_OVERLAY;
 
 import android.annotation.NonNull;
 import android.graphics.Color;
@@ -37,6 +38,7 @@
 import android.view.WindowManager;
 
 import com.android.server.UiThread;
+import com.android.window.flags.Flags;
 
 import java.util.function.Supplier;
 
@@ -66,6 +68,7 @@
     // for overlaping an app window and letterbox surfaces.
     private final LetterboxSurface mFullWindowSurface = new LetterboxSurface("fullWindow");
     private final LetterboxSurface[] mSurfaces = { mLeft, mTop, mRight, mBottom };
+
     @NonNull
     private final AppCompatReachabilityPolicy mAppCompatReachabilityPolicy;
     @NonNull
@@ -222,12 +225,14 @@
 
     void onMovedToDisplay(int displayId) {
         for (LetterboxSurface surface : mSurfaces) {
-            if (surface.mInputInterceptor != null) {
-                surface.mInputInterceptor.mWindowHandle.displayId = displayId;
-            }
+            setSurfaceDisplayID(surface, displayId);
         }
-        if (mFullWindowSurface.mInputInterceptor != null) {
-            mFullWindowSurface.mInputInterceptor.mWindowHandle.displayId = displayId;
+        setSurfaceDisplayID(mFullWindowSurface, displayId);
+    }
+
+    private void setSurfaceDisplayID(LetterboxSurface surface, int displayId) {
+        if (surface.mInputInterceptor != null) {
+            surface.mInputInterceptor.mWindowHandle.displayId = displayId;
         }
     }
 
@@ -242,14 +247,13 @@
     private final class TapEventReceiver extends InputEventReceiver {
 
         private final GestureDetector mDoubleTapDetector;
-        private final DoubleTapListener mDoubleTapListener;
 
         TapEventReceiver(InputChannel inputChannel, WindowManagerService wmService,
                 Handler uiHandler) {
             super(inputChannel, uiHandler.getLooper());
-            mDoubleTapListener = new DoubleTapListener(wmService);
-            mDoubleTapDetector = new GestureDetector(wmService.mContext, mDoubleTapListener,
-                    uiHandler);
+            final DoubleTapListener doubleTapListener = new DoubleTapListener(wmService);
+            mDoubleTapDetector =
+                    new GestureDetector(wmService.mContext, doubleTapListener, uiHandler);
         }
 
         @Override
@@ -293,7 +297,8 @@
         InputInterceptor(String namePrefix, WindowState win) {
             mWmService = win.mWmService;
             mHandler = UiThread.getHandler();
-            final String name = namePrefix + (win.mActivityRecord != null ? win.mActivityRecord : win);
+            final String name = namePrefix
+                    + (win.mActivityRecord != null ? win.mActivityRecord : win);
             mClientChannel = mWmService.mInputManager.createInputChannel(name);
             mInputEventReceiver = new TapEventReceiver(mClientChannel, mWmService, mHandler);
 
@@ -303,12 +308,15 @@
                     win.getDisplayId());
             mWindowHandle.name = name;
             mWindowHandle.token = mToken;
-            mWindowHandle.layoutParamsType = WindowManager.LayoutParams.TYPE_INPUT_CONSUMER;
+            mWindowHandle.layoutParamsType = Flags.scrollingFromLetterbox()
+                    ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
+                    : WindowManager.LayoutParams.TYPE_INPUT_CONSUMER;
             mWindowHandle.dispatchingTimeoutMillis = DEFAULT_DISPATCHING_TIMEOUT_MILLIS;
             mWindowHandle.ownerPid = WindowManagerService.MY_PID;
             mWindowHandle.ownerUid = WindowManagerService.MY_UID;
             mWindowHandle.scaleFactor = 1.0f;
-            mWindowHandle.inputConfig = InputConfig.NOT_FOCUSABLE | InputConfig.SLIPPERY;
+            mWindowHandle.inputConfig = InputConfig.NOT_FOCUSABLE
+                    | (Flags.scrollingFromLetterbox() ? InputConfig.SPY : InputConfig.SLIPPERY);
         }
 
         void updateTouchableRegion(Rect frame) {
@@ -341,6 +349,7 @@
 
         private final String mType;
         private SurfaceControl mSurface;
+        private SurfaceControl mInputSurface;
         private Color mColor;
         private boolean mHasWallpaperBackground;
         private SurfaceControl mParentSurface;
@@ -373,22 +382,36 @@
                     .setColorSpaceAgnostic(mSurface, true);
         }
 
+        private void createInputSurface(SurfaceControl.Transaction t) {
+            mInputSurface = mSurfaceControlFactory.get()
+                    .setName("LetterboxInput - " + mType)
+                    .setFlags(HIDDEN)
+                    .setContainerLayer()
+                    .setOpaque(true)
+                    .setCallsite("LetterboxSurface.createInputSurface")
+                    .build();
+
+            t.setLayer(mInputSurface, TASK_CHILD_LAYER_TASK_OVERLAY);
+        }
+
         void attachInput(WindowState win) {
             if (mInputInterceptor != null) {
                 mInputInterceptor.dispose();
             }
+            // TODO(b/371179559): only detect double tap on LB surfaces not used for cutout area.
+            // Potentially, the input interceptor may still be needed for slippery feature.
             mInputInterceptor = new InputInterceptor("Letterbox_" + mType + "_", win);
         }
 
-        boolean isRemoved() {
-            return mSurface != null || mInputInterceptor != null;
-        }
-
         public void remove() {
             if (mSurface != null) {
                 mTransactionFactory.get().remove(mSurface).apply();
                 mSurface = null;
             }
+            if (mInputSurface != null) {
+                mTransactionFactory.get().remove(mInputSurface).apply();
+                mInputSurface = null;
+            }
             if (mInputInterceptor != null) {
                 mInputInterceptor.dispose();
                 mInputInterceptor = null;
@@ -415,28 +438,54 @@
                     createSurface(t);
                 }
 
+                if (Flags.scrollingFromLetterbox()
+                        && mInputInterceptor != null
+                        && mInputSurface == null) {
+                    createInputSurface(inputT);
+                }
+
                 mColor = mAppCompatLetterboxOverrides.getLetterboxBackgroundColor();
                 mParentSurface = mParentSurfaceSupplier.get();
                 t.setColor(mSurface, getRgbColorArray());
-                t.setPosition(mSurface, mSurfaceFrameRelative.left, mSurfaceFrameRelative.top);
-                t.setWindowCrop(mSurface, mSurfaceFrameRelative.width(),
-                        mSurfaceFrameRelative.height());
-                t.reparent(mSurface, mParentSurface);
+                setPositionAndReparent(t, mSurface);
 
                 mHasWallpaperBackground = mAppCompatLetterboxOverrides
                         .hasWallpaperBackgroundForLetterbox();
                 updateAlphaAndBlur(t);
 
                 t.show(mSurface);
-            } else if (mSurface != null) {
-                t.hide(mSurface);
+
+                if (mInputSurface != null) {
+                    setPositionAndReparent(inputT, mInputSurface);
+                    inputT.setTrustedOverlay(mInputSurface, true);
+                    inputT.show(mInputSurface);
+                }
+
+            } else {
+                if (mSurface != null) {
+                    t.hide(mSurface);
+                }
+                if (mInputSurface != null) {
+                    inputT.hide(mInputSurface);
+                }
             }
-            if (mSurface != null && mInputInterceptor != null) {
+
+            SurfaceControl surfaceWithInput =
+                    Flags.scrollingFromLetterbox() ? mInputSurface : mSurface;
+            if (surfaceWithInput != null && mInputInterceptor != null) {
                 mInputInterceptor.updateTouchableRegion(mSurfaceFrameRelative);
-                inputT.setInputWindowInfo(mSurface, mInputInterceptor.mWindowHandle);
+                inputT.setInputWindowInfo(surfaceWithInput, mInputInterceptor.mWindowHandle);
             }
         }
 
+        private void setPositionAndReparent(@NonNull SurfaceControl.Transaction t,
+                @NonNull SurfaceControl surface) {
+            t.setPosition(surface, mSurfaceFrameRelative.left, mSurfaceFrameRelative.top);
+            t.setWindowCrop(surface, mSurfaceFrameRelative.width(),
+                    mSurfaceFrameRelative.height());
+            t.reparent(surface, mParentSurface);
+        }
+
         private void updateAlphaAndBlur(SurfaceControl.Transaction t) {
             if (!mHasWallpaperBackground) {
                 // Opaque
diff --git a/services/core/java/com/android/server/wm/LockTaskController.java b/services/core/java/com/android/server/wm/LockTaskController.java
index e65396e..0604953 100644
--- a/services/core/java/com/android/server/wm/LockTaskController.java
+++ b/services/core/java/com/android/server/wm/LockTaskController.java
@@ -32,7 +32,7 @@
 import static android.os.UserHandle.USER_CURRENT;
 import static android.telecom.TelecomManager.EMERGENCY_DIALER_COMPONENT;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_LOCKTASK;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_LOCKTASK;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_LOCKTASK;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
diff --git a/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java b/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java
index 403d3bd..91598c5 100644
--- a/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java
+++ b/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java
@@ -22,7 +22,7 @@
 import static android.view.WindowManager.TRANSIT_OLD_TASK_TO_FRONT;
 import static android.view.WindowManager.TRANSIT_OLD_WALLPAPER_CLOSE;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_REMOTE_ANIMATIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_REMOTE_ANIMATIONS;
 import static com.android.server.wm.AnimationAdapterProto.REMOTE;
 import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION;
diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java
index 9da848a..9de96f14 100644
--- a/services/core/java/com/android/server/wm/RecentTasks.java
+++ b/services/core/java/com/android/server/wm/RecentTasks.java
@@ -24,6 +24,8 @@
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
 import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
@@ -37,7 +39,7 @@
 import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
 import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TASKS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_TASKS;
 import static com.android.launcher3.Flags.enableRefactorTaskThumbnail;
 import static com.android.server.wm.ActivityRecord.State.RESUMED;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_RECENTS;
@@ -549,6 +551,12 @@
         long currentElapsedTime = SystemClock.elapsedRealtime();
         for (int i = 0; i < tasks.size(); i++) {
             Task task = tasks.get(i);
+            // Remove the task restored from xml if any existing tasks match.
+            if (findRemoveIndexForAddTask(task) >= 0) {
+                tasks.remove(i);
+                i--;
+                continue;
+            }
             task.lastActiveTime = currentElapsedTime - i;
         }
 
@@ -559,6 +567,7 @@
         if (existedTaskIds.size() > 0) {
             syncPersistentTaskIdsLocked();
         }
+        mTaskNotificationController.notifyTaskListUpdated();
     }
 
     private boolean isRecentTasksLoaded(int userId) {
@@ -677,27 +686,35 @@
         if (isRecentTasksLoaded(userId)) {
             Slog.i(TAG, "Unloading recents for user " + userId + " from memory.");
             mUsersWithRecentsLoaded.delete(userId);
-            removeTasksForUserLocked(userId);
+            removeTasksForUserFromMemoryLocked(userId);
         }
         mPersistedTaskIds.delete(userId);
         mTaskPersister.unloadUserDataFromMemory(userId);
     }
 
     /** Remove recent tasks for a user. */
-    private void removeTasksForUserLocked(int userId) {
+    private void removeTasksForUserFromMemoryLocked(int userId) {
         if (userId <= 0) {
             Slog.i(TAG, "Can't remove recent task on user " + userId);
             return;
         }
 
+        boolean notifyTaskUpdated = false;
         for (int i = mTasks.size() - 1; i >= 0; --i) {
             Task task = mTasks.get(i);
             if (task.mUserId == userId) {
                 ProtoLog.i(WM_DEBUG_TASKS, "remove RecentTask %s when finishing user "
                         + "%d", task, userId);
-                remove(task);
+                mTasks.remove(task);
+                mService.mWindowManager.mSnapshotController.mTaskSnapshotController
+                        .removeSnapshotCache(task.mTaskId);
+                // Only notify if list has changed.
+                notifyTaskUpdated = true;
             }
         }
+        if (notifyTaskUpdated) {
+            mTaskNotificationController.notifyTaskListUpdated();
+        }
     }
 
     void onPackagesSuspendedChanged(String[] packages, boolean suspended, int userId) {
@@ -2040,10 +2057,15 @@
         final boolean isOtherUndefinedMode = otherWindowingMode == WINDOWING_MODE_UNDEFINED;
 
         // An activity type and windowing mode is compatible if they are the exact same type/mode,
-        // or if one of the type/modes is undefined
+        // or if one of the type/modes is undefined. This is with the exception of
+        // freeform/fullscreen where both modes are assumed to be compatible with each other.
         final boolean isCompatibleType = activityType == otherActivityType
                 || isUndefinedType || isOtherUndefinedType;
         final boolean isCompatibleMode = windowingMode == otherWindowingMode
+                || (windowingMode == WINDOWING_MODE_FREEFORM
+                && otherWindowingMode == WINDOWING_MODE_FULLSCREEN)
+                || (windowingMode == WINDOWING_MODE_FULLSCREEN
+                && otherWindowingMode == WINDOWING_MODE_FREEFORM)
                 || isUndefinedMode || isOtherUndefinedMode;
 
         return isCompatibleType && isCompatibleMode;
diff --git a/services/core/java/com/android/server/wm/RecentsAnimation.java b/services/core/java/com/android/server/wm/RecentsAnimation.java
index c06efc7..0b13671 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimation.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimation.java
@@ -23,7 +23,7 @@
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_RECENTS_ANIMATIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_RECENTS_ANIMATIONS;
 import static com.android.server.wm.ActivityRecord.State.STOPPED;
 import static com.android.server.wm.ActivityRecord.State.STOPPING;
 
diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java
index 432089f..b3b2c57 100644
--- a/services/core/java/com/android/server/wm/RemoteAnimationController.java
+++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java
@@ -18,7 +18,7 @@
 
 import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_UNOCCLUDE;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_REMOTE_ANIMATIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_REMOTE_ANIMATIONS;
 import static com.android.server.wm.AnimationAdapterProto.REMOTE;
 import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
diff --git a/services/core/java/com/android/server/wm/RemoteDisplayChangeController.java b/services/core/java/com/android/server/wm/RemoteDisplayChangeController.java
index e4962bf..0c1641c 100644
--- a/services/core/java/com/android/server/wm/RemoteDisplayChangeController.java
+++ b/services/core/java/com/android/server/wm/RemoteDisplayChangeController.java
@@ -16,7 +16,7 @@
 
 package com.android.server.wm;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_CONFIGURATION;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
diff --git a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java
index 243dbc7..0b48615 100644
--- a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java
+++ b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java
@@ -16,8 +16,8 @@
 
 package com.android.server.wm;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TASKS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ADD_REMOVE;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_TASKS;
 
 import android.app.ActivityOptions;
 import android.content.Intent;
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 84072e2..266fdbb 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -38,13 +38,14 @@
 import static android.view.WindowManager.TRANSIT_TO_BACK;
 import static android.view.WindowManager.TRANSIT_WAKE;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS_LIGHT;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_KEEP_SCREEN_ON;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STATES;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TASKS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WALLPAPER;
-import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_SURFACE_ALLOC;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS_LIGHT;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_KEEP_SCREEN_ON;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SLEEP_TOKEN;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STATES;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_TASKS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WALLPAPER;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_SURFACE_ALLOC;
 import static com.android.server.policy.PhoneWindowManager.SYSTEM_DIALOG_REASON_ASSIST;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
@@ -2867,7 +2868,8 @@
             token = new SleepToken(tag, displayId);
             mSleepTokens.put(tokenKey, token);
             display.mAllSleepTokens.add(token);
-            ProtoLog.d(WM_DEBUG_STATES, "Create sleep token: tag=%s, displayId=%d", tag, displayId);
+            ProtoLog.d(WM_DEBUG_SLEEP_TOKEN, "Create SleepToken: tag=%s, displayId=%d",
+                    tag, displayId);
         } else {
             throw new RuntimeException("Create the same sleep token twice: " + token);
         }
@@ -2886,8 +2888,8 @@
             return;
         }
 
-        ProtoLog.d(WM_DEBUG_STATES, "Remove sleep token: tag=%s, displayId=%d", token.mTag,
-                token.mDisplayId);
+        ProtoLog.d(WM_DEBUG_SLEEP_TOKEN, "Remove SleepToken: tag=%s, displayId=%d",
+                token.mTag, token.mDisplayId);
         display.mAllSleepTokens.remove(token);
         if (display.mAllSleepTokens.isEmpty()) {
             mService.updateSleepIfNeededLocked();
diff --git a/services/core/java/com/android/server/wm/ScreenRecordingCallbackController.java b/services/core/java/com/android/server/wm/ScreenRecordingCallbackController.java
index ad4faab..38e0115 100644
--- a/services/core/java/com/android/server/wm/ScreenRecordingCallbackController.java
+++ b/services/core/java/com/android/server/wm/ScreenRecordingCallbackController.java
@@ -18,7 +18,7 @@
 
 import static android.content.Context.MEDIA_PROJECTION_SERVICE;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_ERROR;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_ERROR;
 
 import android.media.projection.IMediaProjectionManager;
 import android.media.projection.IMediaProjectionWatcherCallback;
diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
index db0374e..0d3fa1b 100644
--- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -20,8 +20,8 @@
 import static android.util.RotationUtils.deltaRotation;
 import static android.view.WindowManagerPolicyConstants.SCREEN_FREEZE_LAYER_BASE;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
-import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_SURFACE_ALLOC;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_SURFACE_ALLOC;
 import static com.android.server.wm.AnimationSpecProto.ROTATE;
 import static com.android.server.wm.RotationAnimationSpecProto.DURATION_MS;
 import static com.android.server.wm.RotationAnimationSpecProto.END_LUMA;
@@ -815,8 +815,7 @@
                 if (mDisplayContent.getRotationAnimation() == ScreenRotationAnimation.this) {
                     // It also invokes kill().
                     mDisplayContent.setRotationAnimation(null);
-                    mDisplayContent.mAppCompatCameraPolicy
-                            .onScreenRotationAnimationFinished();
+                    mDisplayContent.mAppCompatCameraPolicy.onScreenRotationAnimationFinished();
                 } else {
                     kill();
                 }
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index d295378..077127c 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -37,7 +37,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
 import static android.view.WindowManager.LayoutParams.isSystemAlertWindowType;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IME;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_IME;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java
index 57f9be0..3f6e915 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimator.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java
@@ -16,7 +16,7 @@
 
 package com.android.server.wm;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ANIM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ANIM;
 import static com.android.server.wm.SurfaceAnimatorProto.ANIMATION_ADAPTER;
 import static com.android.server.wm.SurfaceAnimatorProto.ANIMATION_START_DELAYED;
 import static com.android.server.wm.SurfaceAnimatorProto.LEASH;
diff --git a/services/core/java/com/android/server/wm/SurfaceFreezer.java b/services/core/java/com/android/server/wm/SurfaceFreezer.java
index 34abf23..e126ed6 100644
--- a/services/core/java/com/android/server/wm/SurfaceFreezer.java
+++ b/services/core/java/com/android/server/wm/SurfaceFreezer.java
@@ -16,7 +16,7 @@
 
 package com.android.server.wm;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_TRANSACTIONS;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_SCREEN_ROTATION;
 
 import android.annotation.NonNull;
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 86bb75a..98919d9 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -62,10 +62,11 @@
 import static android.view.WindowManager.TRANSIT_TO_FRONT;
 import static android.window.DisplayAreaOrganizer.FEATURE_UNDEFINED;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_LOCKTASK;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STATES;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TASKS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ADD_REMOVE;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_LOCKTASK;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STATES;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_TASKS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN;
 import static com.android.server.wm.ActivityRecord.State.PAUSED;
 import static com.android.server.wm.ActivityRecord.State.PAUSING;
 import static com.android.server.wm.ActivityRecord.State.RESUMED;
@@ -169,6 +170,7 @@
 import android.view.InsetsState;
 import android.view.RemoteAnimationAdapter;
 import android.view.SurfaceControl;
+import android.view.WindowInsets;
 import android.view.WindowManager;
 import android.window.ITaskOrganizer;
 import android.window.PictureInPictureSurfaceTransaction;
@@ -1474,7 +1476,7 @@
             // The starting window should keep covering its task when a pure TaskFragment is added
             // because its bounds may not fill the task.
             final ActivityRecord top = getTopMostActivity();
-            if (top != null) {
+            if (top != null && !top.hasFixedRotationTransform()) {
                 top.associateStartingWindowWithTaskIfNeeded();
             }
         }
@@ -3399,6 +3401,9 @@
         info.isTopActivityTransparent = top != null && !top.fillsParent();
         info.isTopActivityStyleFloating = top != null && top.isStyleFloating();
         info.lastNonFullscreenBounds = topTask.mLastNonFullscreenBounds;
+        final WindowState windowState = top != null ? top.findMainWindow() : null;
+        info.requestedVisibleTypes = (windowState != null && Flags.enableFullyImmersiveInDesktop())
+                ? windowState.getRequestedVisibleTypes() : WindowInsets.Type.defaultVisible();
         AppCompatUtils.fillAppCompatTaskInfo(this, info, top);
     }
 
@@ -4706,8 +4711,13 @@
                         // If the moveToFront is a part of finishing transition, then make sure
                         // the z-order of tasks are up-to-date.
                         if (topActivity.mTransitionController.inFinishingTransition(topActivity)) {
-                            Transition.assignLayers(taskDisplayArea,
-                                    taskDisplayArea.getPendingTransaction());
+                            final SurfaceControl.Transaction tx =
+                                    taskDisplayArea.getPendingTransaction();
+                            Transition.assignLayers(taskDisplayArea, tx);
+                            final SurfaceControl leash = topActivity.getFixedRotationLeash();
+                            if (leash != null) {
+                                tx.setLayer(leash, topActivity.getLastLayer());
+                            }
                         }
                     }
                 }
@@ -6177,6 +6187,8 @@
 
     void maybeApplyLastRecentsAnimationTransaction() {
         if (mLastRecentsAnimationTransaction != null) {
+            ProtoLog.d(WM_DEBUG_WINDOW_TRANSITIONS_MIN,
+                    "Applying last recents animation transaction.");
             final SurfaceControl.Transaction tx = getPendingTransaction();
             if (mLastRecentsAnimationOverlay != null) {
                 tx.reparent(mLastRecentsAnimationOverlay, mSurfaceControl);
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index 42ea5a8..5dd3bbc 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -30,7 +30,7 @@
 import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
 import static android.view.Display.INVALID_DISPLAY;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
 import static com.android.server.wm.ActivityRecord.State.RESUMED;
 import static com.android.server.wm.ActivityTaskManagerService.TAG_ROOT_TASK;
 import static com.android.server.wm.DisplayContent.alwaysCreateRootTask;
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java
index f58b322..3ffeacf 100644
--- a/services/core/java/com/android/server/wm/TaskFragment.java
+++ b/services/core/java/com/android/server/wm/TaskFragment.java
@@ -49,7 +49,7 @@
 import static android.view.WindowManager.TRANSIT_NONE;
 import static android.view.WindowManager.TRANSIT_OPEN;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STATES;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STATES;
 import static com.android.server.wm.ActivityRecord.State.PAUSED;
 import static com.android.server.wm.ActivityRecord.State.PAUSING;
 import static com.android.server.wm.ActivityRecord.State.RESUMED;
diff --git a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java
index 83e714d..c6a1679 100644
--- a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java
@@ -27,7 +27,7 @@
 import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_PARENT_INFO_CHANGED;
 import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_VANISHED;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WINDOW_ORGANIZER;
 import static com.android.server.wm.ActivityTaskManagerService.enforceTaskPermission;
 import static com.android.server.wm.TaskFragment.EMBEDDING_ALLOWED;
 import static com.android.server.wm.WindowOrganizerController.configurationsAreEqualForOrganizer;
@@ -61,7 +61,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.protolog.ProtoLog;
-import com.android.internal.protolog.ProtoLogGroup;
+import com.android.internal.protolog.WmProtoLogGroups;
 import com.android.window.flags.Flags;
 
 import java.lang.annotation.Retention;
@@ -482,7 +482,7 @@
             }
             final int transitionId = mWindowOrganizerController.getTransitionController()
                     .getCollectingTransitionId();
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                     "Defer transition id=%d for TaskFragmentTransaction=%s", transitionId,
                     transaction.getTransactionToken());
             mDeferredTransitions.put(transaction.getTransactionToken(), transitionId);
@@ -503,13 +503,13 @@
                     || mWindowOrganizerController.getTransitionController()
                     .getCollectingTransitionId() != transitionId) {
                 // This can happen when the transition is timeout or abort.
-                ProtoLog.w(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                ProtoLog.w(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                         "Deferred transition id=%d has been continued before the"
                                 + " TaskFragmentTransaction=%s is finished",
                         transitionId, transactionToken);
                 return;
             }
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                     "Continue transition id=%d for TaskFragmentTransaction=%s", transitionId,
                     transactionToken);
             mWindowOrganizerController.getTransitionController().continueTransitionReady();
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index de2e4f5..eefc544 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -21,7 +21,7 @@
 import static android.window.StartingWindowRemovalInfo.DEFER_MODE_NORMAL;
 import static android.window.StartingWindowRemovalInfo.DEFER_MODE_ROTATION;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WINDOW_ORGANIZER;
 import static com.android.server.wm.ActivityTaskManagerService.enforceTaskPermission;
 import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_STARTING_REVEAL;
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 2451ca8..1659f7b 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -109,7 +109,7 @@
 import com.android.internal.graphics.ColorUtils;
 import com.android.internal.policy.TransitionAnimation;
 import com.android.internal.protolog.ProtoLog;
-import com.android.internal.protolog.ProtoLogGroup;
+import com.android.internal.protolog.WmProtoLogGroups;
 import com.android.internal.util.function.pooled.PooledLambda;
 import com.android.server.inputmethod.InputMethodManagerInternal;
 import com.android.server.statusbar.StatusBarManagerInternal;
@@ -385,7 +385,7 @@
             if (b == null || b.isEmpty()) continue;
             final boolean transientLaunch = b.getBoolean(ActivityOptions.KEY_TRANSIENT_LAUNCH);
             if (transientLaunch) {
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                         "Starting a Recents transition which can be parallel.");
                 mParallelCollectType = PARALLEL_TYPE_RECENTS;
             }
@@ -443,7 +443,7 @@
             activity.getTask().setCanAffectSystemUiFlags(false);
         }
 
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Transition %d: Set %s as "
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "Transition %d: Set %s as "
                 + "transient-launch", mSyncId, activity);
     }
 
@@ -556,8 +556,6 @@
             snapshotStartState(ar);
             mChanges.get(ar).mFlags |= ChangeInfo.FLAG_CHANGE_CONFIG_AT_END;
         });
-        snapshotStartState(wc);
-        mChanges.get(wc).mFlags |= ChangeInfo.FLAG_CHANGE_CONFIG_AT_END;
     }
 
     /** Set a transition to be a seamless-rotation. */
@@ -582,7 +580,7 @@
         if (top != null) {
             mIsSeamlessRotation = true;
             top.mSyncMethodOverride = BLASTSyncEngine.METHOD_BLAST;
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Override sync-method for %s "
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "Override sync-method for %s "
                     + "because seamless rotating", top.getName());
         }
     }
@@ -699,7 +697,7 @@
             return;
         }
         mState = STATE_STARTED;
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Starting Transition %d",
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "Starting Transition %d",
                 mSyncId);
         applyReady();
 
@@ -719,7 +717,7 @@
             // Too late, transition already started playing, so don't collect.
             return;
         }
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Collecting in transition %d: %s",
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "Collecting in transition %d: %s",
                 mSyncId, wc);
         // Snapshot before checking if this is a participant in case it has been re-parented.
         snapshotStartState(getAnimatableParent(wc));
@@ -758,7 +756,7 @@
             mChanges.put(curr, info);
             if (isReadyGroup(curr)) {
                 mReadyTrackerOld.addGroup(curr);
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, " Creating Ready-group for"
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, " Creating Ready-group for"
                         + " Transition %d with root=%s", mSyncId, curr);
             }
         }
@@ -831,8 +829,8 @@
             // Too late to collect. Don't check too-early here since `collect` will check that.
             return;
         }
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Existence Changed in transition %d:"
-                + " %s", mSyncId, wc);
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
+                "Existence Changed in transition %d: %s", mSyncId, wc);
         collect(wc);
         mChanges.get(wc).mExistenceChanged = true;
     }
@@ -997,7 +995,7 @@
         } else {
             ready = mReadyTrackerOld.allReady();
         }
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                 "Set transition ready=%b %d", ready, mSyncId);
         boolean changed = mSyncEngine.setReady(mSyncId, ready);
         if (changed && ready) {
@@ -1083,7 +1081,8 @@
             // For config-at-end, the end-transform will be reset after the config is actually
             // applied in the client (since the transform depends on config). The other properties
             // remain here because shell might want to persistently override them.
-            if ((mTargets.get(i).mFlags & ChangeInfo.FLAG_CHANGE_CONFIG_AT_END) == 0) {
+            if (target.asActivityRecord() == null
+                    || (mTargets.get(i).mFlags & ChangeInfo.FLAG_CHANGE_CONFIG_AT_END) == 0) {
                 resetSurfaceTransform(t, target, targetLeash);
             }
         }
@@ -1312,7 +1311,7 @@
                     // Avoid commit visibility if entering pip or else we will get a sudden
                     // "flash" / surface going invisible for a split second.
                     if (commitVisibility) {
-                        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                                 "  Commit activity becoming invisible: %s", ar);
                         final SnapshotController snapController = mController.mSnapshotController;
                         if (mTransientLaunches != null && !task.isVisibleRequested()
@@ -1326,7 +1325,7 @@
                             if (lastSnapshotTimeNs < startTimeNs) {
                                 snapController.mTaskSnapshotController.recordSnapshot(task);
                             } else {
-                                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                                         "  Skipping post-transition snapshot for task %d",
                                         task.mTaskId);
                             }
@@ -1397,7 +1396,7 @@
             final boolean isWallpaperVisibleAtEnd =
                     wt.isVisibleRequested() || mVisibleAtTransitionEndTokens.contains(wt);
             if (isTargetInvisible || !isWallpaperVisibleAtEnd) {
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                         "  Commit wallpaper becoming invisible: %s", wt);
                 wt.commitVisibility(false /* visible */);
             }
@@ -1564,46 +1563,33 @@
         if (mConfigAtEndActivities == null || mConfigAtEndActivities.isEmpty()) {
             return;
         }
-        final SurfaceControl.Transaction t =
-                mController.mAtm.mWindowManager.mTransactionFactory.get();
-        for (int i = 0; i < mTargets.size(); ++i) {
-            final WindowContainer target = mTargets.get(i).mContainer;
-            if (target.getParent() == null || (mTargets.get(i).mFlags
-                    & ChangeInfo.FLAG_CHANGE_CONFIG_AT_END) == 0) {
-                continue;
+        // Now resume the configuration dispatch, wait until the now resumed configs have been
+        // drawn, and then apply everything together. Any activities that are already in an
+        // active sync will remain on that sync instead of the new one.
+        int syncId = -1;
+        for (int i = 0; i < mConfigAtEndActivities.size(); ++i) {
+            final ActivityRecord target = mConfigAtEndActivities.get(i);
+            final SurfaceControl targetLeash = target.getSurfaceControl();
+            if (target.getSyncGroup() == null || target.getSyncGroup().isIgnoring(target)) {
+                if (syncId < 0) {
+                    final BLASTSyncEngine.SyncGroup sg = mSyncEngine.prepareSyncSet(
+                            (mSyncId, transaction) -> transaction.apply(),
+                            "ConfigAtTransitEnd");
+                    syncId = sg.mSyncId;
+                    mSyncEngine.startSyncSet(sg, BLAST_TIMEOUT_DURATION, true /* parallel */);
+                    mSyncEngine.setSyncMethod(syncId, BLASTSyncEngine.METHOD_BLAST);
+                }
+                mSyncEngine.addToSyncSet(syncId, target);
             }
-            final SurfaceControl targetLeash = getLeashSurface(target, null /* t */);
             // Reset surface state here (since it was skipped in buildFinishTransaction). Since
             // we are resuming config to the "current" state, we have to calculate the matching
             // surface state now (rather than snapshotting it at animation start).
-            resetSurfaceTransform(t, target, targetLeash);
+            resetSurfaceTransform(target.getSyncTransaction(), target, targetLeash);
+            target.resumeConfigurationDispatch();
         }
-
-        // Now we resume the configuration dispatch, wait until the now resumed configs have been
-        // drawn, and then apply everything together.
-        final BLASTSyncEngine.SyncGroup sg = mSyncEngine.prepareSyncSet(
-                new BLASTSyncEngine.TransactionReadyListener() {
-                    @Override
-                    public void onTransactionReady(int mSyncId,
-                            SurfaceControl.Transaction transaction) {
-                        t.merge(transaction);
-                        t.apply();
-                    }
-
-                    @Override
-                    public void onTransactionCommitTimeout() {
-                        t.apply();
-                    }
-                }, "ConfigAtTransitEnd");
-        final int syncId = sg.mSyncId;
-        mSyncEngine.startSyncSet(sg, BLAST_TIMEOUT_DURATION, true /* parallel */);
-        mSyncEngine.setSyncMethod(syncId, BLASTSyncEngine.METHOD_BLAST);
-        for (int i = 0; i < mConfigAtEndActivities.size(); ++i) {
-            final ActivityRecord ar = mConfigAtEndActivities.get(i);
-            mSyncEngine.addToSyncSet(syncId, ar);
-            ar.resumeConfigurationDispatch();
+        if (syncId >= 0) {
+            mSyncEngine.setReady(syncId);
         }
-        mSyncEngine.setReady(syncId);
     }
 
     @Nullable
@@ -1662,7 +1648,8 @@
         if (mState != STATE_COLLECTING && mState != STATE_STARTED) {
             throw new IllegalStateException("Too late to abort. state=" + mState);
         }
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Aborting Transition: %d", mSyncId);
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
+                "Aborting Transition: %d", mSyncId);
         mState = STATE_ABORT;
         mLogger.mAbortTimeNs = SystemClock.elapsedRealtimeNanos();
         mController.mTransitionTracer.logAbortedTransition(this);
@@ -1677,7 +1664,7 @@
         if (!(mState == STATE_COLLECTING || mState == STATE_STARTED)) {
             return;
         }
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Force Playing Transition: %d",
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "Force Playing Transition: %d",
                 mSyncId);
         mForcePlaying = true;
         // backwards since conditions are removed.
@@ -1718,7 +1705,54 @@
         change.mFlags |= ChangeInfo.FLAG_CHANGE_NO_ANIMATION;
     }
 
-    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+    void prepareConfigAtEnd(SurfaceControl.Transaction transact, ArrayList<ChangeInfo> targets) {
+        if (mConfigAtEndActivities == null) return;
+        for (int i = 0; i < mConfigAtEndActivities.size(); ++i) {
+            final ActivityRecord ar = mConfigAtEndActivities.get(i);
+            if (!ar.isVisibleRequested()) continue;
+            final SurfaceControl sc = ar.getSurfaceControl();
+            if (sc == null) continue;
+            final Task task = ar.getTask();
+            if (task == null) continue;
+            // If task isn't animating, then it means shell is animating activity directly (within
+            // task), so don't do any setup.
+            if (!containsChangeFor(task, targets)) continue;
+            final ChangeInfo change = mChanges.get(ar);
+            final Rect startBounds = change.mAbsoluteBounds;
+            Rect hintRect = null;
+            if (ar.getWindowingMode() == WINDOWING_MODE_PINNED && ar.pictureInPictureArgs != null
+                    && ar.pictureInPictureArgs.getSourceRectHint() != null) {
+                hintRect = ar.pictureInPictureArgs.getSourceRectHint();
+            }
+            if (hintRect == null) {
+                hintRect = new Rect(startBounds);
+                hintRect.offsetTo(0, 0);
+            }
+            final Rect endBounds = ar.getBounds();
+            final Rect taskEndBounds = task.getBounds();
+            // FA = final activity bounds (absolute)
+            // FT = final task bounds (absolute)
+            // SA = start activity bounds (absolute)
+            // H = source hint (relative to start activity bounds)
+            // We want to transform the activity so that when the task is at FT, H overlaps with FA
+
+            // This scales the activity such that the hint rect has the same dimensions
+            // as the final activity bounds.
+            float hintToEndScaleX = ((float) endBounds.width()) / ((float) hintRect.width());
+            float hintToEndScaleY = ((float) endBounds.height()) / ((float) hintRect.height());
+            // top-left needs to be (FA.tl - FT.tl) - H.tl * hintToEnd . H is relative to the
+            // activity; so, for example, if shrinking H to FA (hintToEnd < 1), then the tl of the
+            // shrunk SA is closer to H than expected, so we need to reduce how much we offset SA
+            // to get H.tl to match.
+            float startActPosInTaskEndX =
+                    (endBounds.left - taskEndBounds.left) - hintRect.left * hintToEndScaleX;
+            float startActPosInTaskEndY =
+                    (endBounds.top - taskEndBounds.top) - hintRect.top * hintToEndScaleY;
+            transact.setScale(sc, hintToEndScaleX, hintToEndScaleY);
+            transact.setPosition(sc, startActPosInTaskEndX, startActPosInTaskEndY);
+        }
+    }
+
     static boolean containsChangeFor(WindowContainer wc, ArrayList<ChangeInfo> list) {
         for (int i = list.size() - 1; i >= 0; --i) {
             if (list.get(i).mContainer == wc) return true;
@@ -1735,7 +1769,7 @@
 
         if (mController.useFullReadyTracking()) {
             for (int i = 0; i < mReadyTracker.mMet.size(); ++i) {
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "#%d: Met condition: %s",
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "#%d: Met condition: %s",
                         mSyncId, mReadyTracker.mMet.get(i));
             }
         }
@@ -1799,6 +1833,7 @@
 
         // Resolve the animating targets from the participants.
         mTargets = calculateTargets(mParticipants, mChanges);
+        prepareConfigAtEnd(transaction, mTargets);
 
         // Check whether the participants were animated from back navigation.
         mController.mAtm.mBackNavigationController.onTransactionReady(this, mTargets,
@@ -1911,9 +1946,10 @@
         mCleanupTransaction = mController.mAtm.mWindowManager.mTransactionFactory.get();
         buildCleanupTransaction(mCleanupTransaction, info);
         if (mController.getTransitionPlayer() != null && mIsPlayerEnabled) {
-            mController.dispatchLegacyAppTransitionStarting(info, mStatusBarTransitionDelay);
+            mController.dispatchLegacyAppTransitionStarting(participantDisplays,
+                    mStatusBarTransitionDelay);
             try {
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                         "Calling onTransitionReady: %s", info);
                 mLogger.mSendTimeNs = SystemClock.elapsedRealtimeNanos();
                 mLogger.mInfo = info;
@@ -1939,8 +1975,9 @@
             // No player registered or it's not enabled, so just finish/apply immediately
             if (!mIsPlayerEnabled) {
                 mLogger.mSendTimeNs = SystemClock.uptimeNanos();
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Apply and finish immediately"
-                        + " because player is disabled for transition #%d .", mSyncId);
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
+                        "Apply and finish immediately because player is disabled "
+                                + "for transition #%d .", mSyncId);
             }
             postCleanupOnFailure();
         }
@@ -2151,32 +2188,34 @@
             for (int i = onTopTasksEnd.size() - 1; i >= 0; --i) {
                 final Task task = onTopTasksEnd.get(i);
                 if (task.getDisplayId() != displayId) continue;
-                if (!enableDisplayFocusInShellTransitions()
-                        || mOnTopDisplayStart == onTopDisplayEnd
-                        || displayId != onTopDisplayEnd.mDisplayId) {
-                    // If it didn't change since last report, don't report
-                    if (reportedOnTop == null) {
-                        if (mOnTopTasksStart.contains(task)) continue;
-                    } else if (reportedOnTop.contains(task)) {
-                        continue;
-                    }
+                if (reportedOnTop == null) {
+                    if (mOnTopTasksStart.contains(task)) continue;
+                } else if (reportedOnTop.contains(task)) {
+                    continue;
                 }
-                // Need to report it.
-                mParticipants.add(task);
-                int changeIdx = mChanges.indexOfKey(task);
-                if (changeIdx < 0) {
-                    mChanges.put(task, new ChangeInfo(task));
-                    changeIdx = mChanges.indexOfKey(task);
-                }
-                mChanges.valueAt(changeIdx).mFlags |= ChangeInfo.FLAG_CHANGE_MOVED_TO_TOP;
+                addToTopChange(task);
             }
             // Swap in the latest on-top tasks.
             mController.mLatestOnTopTasksReported.put(displayId, onTopTasksEnd);
             onTopTasksEnd = reportedOnTop != null ? reportedOnTop : new ArrayList<>();
             onTopTasksEnd.clear();
+
+            if (enableDisplayFocusInShellTransitions()
+                    && mOnTopDisplayStart != onTopDisplayEnd
+                    && displayId == onTopDisplayEnd.mDisplayId) {
+                addToTopChange(onTopDisplayEnd);
+            }
         }
     }
 
+    private void addToTopChange(@NonNull WindowContainer wc) {
+        mParticipants.add(wc);
+        if (!mChanges.containsKey(wc)) {
+            mChanges.put(wc, new ChangeInfo(wc));
+        }
+        mChanges.get(wc).mFlags |= ChangeInfo.FLAG_CHANGE_MOVED_TO_TOP;
+    }
+
     private void postCleanupOnFailure() {
         mController.mAtm.mH.post(() -> {
             synchronized (mController.mAtm.mGlobalLock) {
@@ -2547,12 +2586,12 @@
         final ChangeInfo parentChange = changes.get(parent);
         if (!parent.canCreateRemoteAnimationTarget()
                 || parentChange == null || !parentChange.hasChanged()) {
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "      SKIP: %s",
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "      SKIP: %s",
                     "parent can't be target " + parent);
             return false;
         }
         if (isWallpaper(target)) {
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "      SKIP: is wallpaper");
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "      SKIP: is wallpaper");
             return false;
         }
 
@@ -2566,27 +2605,27 @@
         for (int i = parent.getChildCount() - 1; i >= 0; --i) {
             final WindowContainer<?> sibling = parent.getChildAt(i);
             if (target == sibling) continue;
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "      check sibling %s",
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "      check sibling %s",
                     sibling);
             final ChangeInfo siblingChange = changes.get(sibling);
             if (siblingChange == null || !targets.wasParticipated(siblingChange)) {
                 if (sibling.isVisibleRequested()) {
                     // Sibling is visible but not animating, so no promote.
-                    ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                    ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                             "        SKIP: sibling is visible but not part of transition");
                     return false;
                 }
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                         "        unrelated invisible sibling %s", sibling);
                 continue;
             }
 
             final int siblingMode = siblingChange.getTransitMode(sibling);
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                     "        sibling is a participant with mode %s",
                     TransitionInfo.modeToString(siblingMode));
             if (reduceMode(mode) != reduceMode(siblingMode)) {
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                         "          SKIP: common mode mismatch. was %s",
                         TransitionInfo.modeToString(mode));
                 return false;
@@ -2616,10 +2655,10 @@
         for (int i = targets.mArray.size() - 1; i >= 0; --i) {
             final ChangeInfo targetChange = targets.mArray.valueAt(i);
             final WindowContainer<?> target = targetChange.mContainer;
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "    checking %s", target);
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "    checking %s", target);
             final WindowContainer<?> parent = target.getParent();
             if (parent == lastNonPromotableParent) {
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                         "      SKIP: its sibling was rejected");
                 continue;
             }
@@ -2628,16 +2667,16 @@
                 continue;
             }
             if (reportIfNotTop(target)) {
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                         "        keep as target %s", target);
             } else {
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                         "        remove from targets %s", target);
                 targets.remove(i);
             }
             final ChangeInfo parentChange = changes.get(parent);
             if (targets.mArray.indexOfValue(parentChange) < 0) {
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                         "      CAN PROMOTE: promoting to parent %s", parent);
                 // The parent has lower depth, so it will be checked in the later iteration.
                 i++;
@@ -2648,9 +2687,6 @@
             } else {
                 parentChange.mFlags |= ChangeInfo.FLAG_CHANGE_YES_ANIMATION;
             }
-            if ((targetChange.mFlags & ChangeInfo.FLAG_CHANGE_CONFIG_AT_END) != 0) {
-                parentChange.mFlags |= ChangeInfo.FLAG_CHANGE_CONFIG_AT_END;
-            }
         }
     }
 
@@ -2662,7 +2698,7 @@
     @NonNull
     static ArrayList<ChangeInfo> calculateTargets(ArraySet<WindowContainer> participants,
             ArrayMap<WindowContainer, ChangeInfo> changes) {
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                 "Start calculating TransitionInfo based on participants: %s", participants);
 
         // Add all valid participants to the target container.
@@ -2670,7 +2706,7 @@
         for (int i = participants.size() - 1; i >= 0; --i) {
             final WindowContainer<?> wc = participants.valueAt(i);
             if (!wc.isAttached()) {
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                         "  Rejecting as detached: %s", wc);
                 continue;
             }
@@ -2680,13 +2716,13 @@
             final ChangeInfo changeInfo = changes.get(wc);
             // Reject no-ops
             if (!changeInfo.hasChanged()) {
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                         "  Rejecting as no-op: %s  vis: %b", wc, wc.isVisibleRequested());
                 continue;
             }
             targets.add(changeInfo);
         }
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "  Initial targets: %s",
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "  Initial targets: %s",
                 targets.mArray);
         // Combine the targets from bottom to top if possible.
         tryPromote(targets, changes);
@@ -2694,7 +2730,7 @@
         populateParentChanges(targets, changes);
 
         final ArrayList<ChangeInfo> targetList = targets.getListSortedByZ();
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "  Final targets: %s", targetList);
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "  Final targets: %s", targetList);
         return targetList;
     }
 
@@ -2742,14 +2778,6 @@
                     } else {
                         intermediates.add(parentChange);
                     }
-                    // for config-at-end, we want to promote the flag based on the end-state even
-                    // if the activity was reparented because it operates after the animation. So,
-                    // check that here since the promote code skips reparents.
-                    if ((targetChange.mFlags & ChangeInfo.FLAG_CHANGE_CONFIG_AT_END) != 0
-                            && targetChange.mContainer.asActivityRecord() != null
-                            && targetChange.mContainer.getParent() == p) {
-                        parentChange.mFlags |= ChangeInfo.FLAG_CHANGE_CONFIG_AT_END;
-                    }
                     foundParentInTargets = true;
                     break;
                 } else if (reportIfNotTop(p) && !skipIntermediateReports) {
@@ -3797,7 +3825,7 @@
             }
             mConditions.add(condition);
             condition.mTracker = this;
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, " Add condition %s for #%d",
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, " Add condition %s for #%d",
                     condition, mTransition.mSyncId);
             condition.startTracking();
         }
@@ -3819,7 +3847,7 @@
                 }
             }
             condition.mMet = true;
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, " Met condition %s for #%d (%d"
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, " Met condition %s for #%d (%d"
                     + " left)", condition, mTransition.mSyncId, mConditions.size());
             mMet.add(condition);
             mTransition.applyReady();
@@ -3888,8 +3916,8 @@
             while (current != null) {
                 if (isReadyGroup(current)) {
                     mReadyGroups.put(current, ready);
-                    ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, " Setting Ready-group to"
-                            + " %b. group=%s from %s", ready, current, wc);
+                    ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
+                            " Setting Ready-group to %b. group=%s from %s", ready, current, wc);
                     break;
                 }
                 current = current.getParent();
@@ -3898,14 +3926,14 @@
 
         /** Marks this as ready regardless of individual groups. */
         void setAllReady() {
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, " Setting allReady override");
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, " Setting allReady override");
             mUsed = true;
             mReadyOverride = true;
         }
 
         /** @return true if all tracked subtrees are ready. */
         boolean allReady() {
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                     " allReady query: used=%b " + "override=%b defer=%d states=[%s]", mUsed,
                     mReadyOverride, mDeferReadyDepth, groupsToString());
             // If the readiness has never been touched, mUsed will be false. We never want to
@@ -4043,7 +4071,7 @@
                 }
             }
 
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Screenshotting %s [%s]",
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "Screenshotting %s [%s]",
                     wc.toString(), bounds.toString());
 
             Rect cropBounds = new Rect(bounds);
diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java
index 1d2a605..87bdfa4 100644
--- a/services/core/java/com/android/server/wm/TransitionController.java
+++ b/services/core/java/com/android/server/wm/TransitionController.java
@@ -53,7 +53,7 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.protolog.ProtoLog;
-import com.android.internal.protolog.ProtoLogGroup;
+import com.android.internal.protolog.WmProtoLogGroups;
 import com.android.server.FgThread;
 import com.android.window.flags.Flags;
 
@@ -303,7 +303,8 @@
                     + " possible.");
         }
         Transition transit = new Transition(type, flags, this, mSyncEngine);
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Creating Transition: %s", transit);
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
+                "Creating Transition: %s", transit);
         moveToCollecting(transit);
         return transit;
     }
@@ -324,21 +325,21 @@
         final long timeoutMs =
                 transition.mType == TRANSIT_CHANGE ? CHANGE_TIMEOUT_MS : DEFAULT_TIMEOUT_MS;
         mCollectingTransition.startCollecting(timeoutMs);
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Start collecting in Transition: %s",
-                mCollectingTransition);
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
+                "Start collecting in Transition: %s", mCollectingTransition);
     }
 
     void registerTransitionPlayer(@Nullable ITransitionPlayer player,
             @Nullable WindowProcessController playerProc) {
         if (!mTransitionPlayers.isEmpty()) {
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Registering transition "
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Registering transition "
                     + "player %s over %d other players", player.asBinder(),
                     mTransitionPlayers.size());
             // flush currently running transitions so that the new player doesn't get
             // intermediate state
             flushRunningTransitions();
         } else {
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Registering transition "
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Registering transition "
                     + "player %s ", player.asBinder());
         }
         mTransitionPlayers.add(new TransitionPlayerRecord(player, playerProc));
@@ -351,18 +352,18 @@
             if (mTransitionPlayers.get(idx).mPlayer.asBinder() == player.asBinder()) break;
         }
         if (idx < 0) {
-            ProtoLog.w(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Attempt to unregister "
+            ProtoLog.w(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Attempt to unregister "
                     + "transition player %s but it isn't registered", player.asBinder());
             return;
         }
         final boolean needsFlush = idx == (mTransitionPlayers.size() - 1);
         final TransitionPlayerRecord record = mTransitionPlayers.remove(idx);
         if (needsFlush) {
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Unregistering active "
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Unregistering active "
                     + "transition player %s at index=%d leaving %d in stack", player.asBinder(),
                     idx, mTransitionPlayers.size());
         } else {
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Unregistering transition "
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Unregistering transition "
                     + "player %s at index=%d leaving %d in stack", player.asBinder(), idx,
                     mTransitionPlayers.size());
         }
@@ -470,6 +471,16 @@
         return false;
     }
 
+    /** Returns {@code true} if the `wc` is a target of a playing transition. */
+    boolean isPlayingTarget(@NonNull WindowContainer<?> wc) {
+        for (int i = mPlayingTransitions.size() - 1; i >= 0; --i) {
+            if (Transition.containsChangeFor(wc, mPlayingTransitions.get(i).mTargets)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     /** Returns {@code true} if the finishing transition contains `wc`. */
     boolean inFinishingTransition(WindowContainer<?> wc) {
         return mFinishingTransition != null && mFinishingTransition.isInTransition(wc);
@@ -741,8 +752,9 @@
             @Nullable RemoteTransition remoteTransition,
             @Nullable TransitionRequestInfo.DisplayChange displayChange) {
         if (mIsWaitingForDisplayEnabled) {
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Disabling player for transition"
-                    + " #%d because display isn't enabled yet", transition.getSyncId());
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
+                    "Disabling player for transition #%d because display isn't enabled yet",
+                    transition.getSyncId());
             transition.mIsPlayerEnabled = false;
             transition.mLogger.mRequestTimeNs = SystemClock.uptimeNanos();
             mAtm.mH.post(() -> mAtm.mWindowOrganizerController.startTransition(
@@ -758,7 +770,7 @@
             return transition;
         }
         try {
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                     "Requesting StartTransition: %s", transition);
             ActivityManager.RunningTaskInfo startTaskInfo = null;
             ActivityManager.RunningTaskInfo pipTaskInfo = null;
@@ -935,7 +947,7 @@
             Slog.e(TAG, "Trying to finish a non-playing transition " + record);
             return;
         }
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Finish Transition: %s", record);
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "Finish Transition: %s", record);
         mPlayingTransitions.remove(record);
         if (!inTransition()) {
             // reset track-count now since shell-side is idle.
@@ -1056,8 +1068,8 @@
             // If it's a legacy sync, then it needs to wait until there is no collecting transition.
             if (queued.mTransition == null) return;
             if (!canStartCollectingNow(queued.mTransition)) return;
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Moving #%d from collecting"
-                    + " to waiting.", mCollectingTransition.getSyncId());
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN,
+                    "Moving #%d from collecting to waiting.", mCollectingTransition.getSyncId());
             mWaitingTransitions.add(mCollectingTransition);
             mCollectingTransition = null;
         } else if (mSyncEngine.hasActiveSync()) {
@@ -1220,8 +1232,8 @@
             // Didn't overlap with anything, so give it its own track
             track = mTrackCount;
             if (track > 0) {
-                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Playing #%d in parallel on "
-                        + "track #%d", transition.getSyncId(), track);
+                ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
+                        "Playing #%d in parallel on track #%d", transition.getSyncId(), track);
             }
         }
         transition.mAnimationTrack = track;
@@ -1230,8 +1242,8 @@
         if (sync && mTrackCount > 1) {
             // If there are >1 tracks, mark as sync so that all tracks finish.
             info.setFlags(info.getFlags() | TransitionInfo.FLAG_SYNC);
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Marking #%d animation as SYNC.",
-                    transition.getSyncId());
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
+                    "Marking #%d animation as SYNC.", transition.getSyncId());
         }
     }
 
@@ -1354,12 +1366,13 @@
         }
     }
 
-    void dispatchLegacyAppTransitionStarting(TransitionInfo info, long statusBarTransitionDelay) {
+    void dispatchLegacyAppTransitionStarting(DisplayContent[] participantDisplays,
+            long statusBarTransitionDelay) {
         final long now = SystemClock.uptimeMillis();
         for (int i = 0; i < mLegacyListeners.size(); ++i) {
             final WindowManagerInternal.AppTransitionListener listener = mLegacyListeners.get(i);
-            for (int j = 0; j < info.getRootCount(); ++j) {
-                final int displayId = info.getRoot(j).getDisplayId();
+            for (int j = 0; j < participantDisplays.length; ++j) {
+                final int displayId = participantDisplays[j].mDisplayId;
                 if (shouldDispatchLegacyListener(listener, displayId)) {
                     listener.onAppTransitionStartingLocked(
                             now + statusBarTransitionDelay,
@@ -1409,7 +1422,7 @@
     /** Returns {@code true} if it started collecting, {@code false} if it was queued. */
     private void queueTransition(Transition transit, OnStartCollect onStartCollect) {
         mQueuedTransitions.add(new QueuedTransition(transit, onStartCollect));
-        ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN,
+        ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN,
                 "Queueing transition: %s", transit);
     }
 
@@ -1425,7 +1438,7 @@
                 // Check if we can run in parallel here.
                 if (canStartCollectingNow(transit)) {
                     // start running in parallel.
-                    ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Moving #%d from"
+                    ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Moving #%d from"
                             + " collecting to waiting.", mCollectingTransition.getSyncId());
                     mWaitingTransitions.add(mCollectingTransition);
                     mCollectingTransition = null;
@@ -1464,7 +1477,7 @@
                 // Check if we can run in parallel here.
                 if (canStartCollectingNow(null /* transit */)) {
                     // create and collect in parallel.
-                    ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Moving #%d from"
+                    ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Moving #%d from"
                             + " collecting to waiting.", mCollectingTransition.getSyncId());
                     mWaitingTransitions.add(mCollectingTransition);
                     mCollectingTransition = null;
@@ -1488,7 +1501,7 @@
             // Just add to queue since we already have a queue.
             mQueuedTransitions.add(new QueuedTransition(syncGroup,
                     (deferred) -> applySync.accept(true /* deferred */)));
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN,
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN,
                     "Queueing legacy sync-set: %s", syncGroup.mSyncId);
             return;
         }
@@ -1683,9 +1696,10 @@
         }
 
         void logOnSend() {
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "%s", buildOnSendLog());
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "    startWCT=%s", mStartWCT);
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "    info=%s",
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "%s", buildOnSendLog());
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN,
+                    "    startWCT=%s", mStartWCT);
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "    info=%s",
                     mInfo.toString("    " /* prefix */));
         }
 
@@ -1708,7 +1722,7 @@
         }
 
         void logOnFinish() {
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "%s", buildOnFinishLog());
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "%s", buildOnFinishLog());
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java b/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java
index c0dc424..2428836 100644
--- a/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java
+++ b/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java
@@ -21,7 +21,7 @@
 import static android.graphics.Matrix.MSKEW_X;
 import static android.graphics.Matrix.MSKEW_Y;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TPL;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_TPL;
 
 import android.graphics.Matrix;
 import android.graphics.Rect;
@@ -156,7 +156,7 @@
 
     Listeners mRegisteredListeners = new Listeners();
 
-    private InputWindowHandle[] mLastWindowHandles;
+    private Pair<InputWindowHandle[], WindowInfosListener.DisplayInfo[]> mLastWindowHandles;
 
     private void startHandlerThreadIfNeeded() {
         synchronized (mHandlerThreadLock) {
@@ -222,10 +222,10 @@
             @Override
             public void onWindowInfosChanged(InputWindowHandle[] windowHandles,
                     DisplayInfo[] displayInfos) {
-                mHandler.post(() -> computeTpl(windowHandles));
+                mHandler.post(() -> computeTpl(new Pair<>(windowHandles, displayInfos)));
             }
         };
-        mLastWindowHandles = mWindowInfosListener.register().first;
+        mLastWindowHandles = mWindowInfosListener.register();
     }
 
     private void unregisterWindowInfosListener() {
@@ -238,28 +238,52 @@
         mLastWindowHandles = null;
     }
 
-    private void computeTpl(InputWindowHandle[] windowHandles) {
+    private void computeTpl(
+            Pair<InputWindowHandle[], WindowInfosListener.DisplayInfo[]> windowHandles) {
         mLastWindowHandles = windowHandles;
-        if (mLastWindowHandles == null || mLastWindowHandles.length == 0
+        if (mLastWindowHandles == null || mLastWindowHandles.first.length == 0
                 || mRegisteredListeners.isEmpty()) {
             return;
         }
 
         Rect tmpRect = new Rect();
+        RectF tmpRectF = new RectF();
+        Rect tmpLogicalDisplaySize = new Rect();
         Matrix tmpInverseMatrix = new Matrix();
         float[] tmpMatrix = new float[9];
         Region coveredRegionsAbove = new Region();
         long currTimeMs = System.currentTimeMillis();
-        ProtoLog.v(WM_DEBUG_TPL, "Checking %d windows", mLastWindowHandles.length);
+        ProtoLog.v(WM_DEBUG_TPL, "Checking %d windows", mLastWindowHandles.first.length);
 
         ArrayMap<ITrustedPresentationListener, Pair<IntArray, IntArray>> listenerUpdates =
                 new ArrayMap<>();
-        for (var windowHandle : mLastWindowHandles) {
+        for (var windowHandle : mLastWindowHandles.first) {
             if (!windowHandle.canOccludePresentation) {
                 ProtoLog.v(WM_DEBUG_TPL, "Skipping %s", windowHandle.name);
                 continue;
             }
-            tmpRect.set(windowHandle.frame);
+            var displayFound = false;
+            tmpRectF.set(windowHandle.frame);
+            for (var displayHandle : mLastWindowHandles.second) {
+                if (displayHandle.mDisplayId == windowHandle.displayId) {
+                    // Transform the window frame into display logical space and then
+                    // crop by the logical display size
+                    displayHandle.mTransform.mapRect(tmpRectF);
+                    tmpRectF.round(tmpRect);
+                    tmpLogicalDisplaySize.set(0, 0, displayHandle.mLogicalSize.getWidth(),
+                            displayHandle.mLogicalSize.getHeight());
+                    tmpRect.intersect(tmpLogicalDisplaySize);
+                    displayFound = true;
+                    break;
+                }
+            }
+
+            if (!displayFound) {
+                ProtoLog.v(WM_DEBUG_TPL, "Skipping %s, no associated display %d", windowHandle.name,
+                        windowHandle.displayId);
+                continue;
+            }
+
             var listeners = mRegisteredListeners.get(windowHandle.getWindowToken());
             if (listeners != null) {
                 Region region = new Region();
diff --git a/services/core/java/com/android/server/wm/WallpaperAnimationAdapter.java b/services/core/java/com/android/server/wm/WallpaperAnimationAdapter.java
index fffe692..c3e85b1 100644
--- a/services/core/java/com/android/server/wm/WallpaperAnimationAdapter.java
+++ b/services/core/java/com/android/server/wm/WallpaperAnimationAdapter.java
@@ -15,7 +15,7 @@
  */
 package com.android.server.wm;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_REMOTE_ANIMATIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_REMOTE_ANIMATIONS;
 import static com.android.server.wm.AnimationAdapterProto.REMOTE;
 import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION;
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index 06010bb..7565b5d 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -23,7 +23,7 @@
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WALLPAPER;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WALLPAPER;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
 import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
 import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
index 89ad564..2c926fc 100644
--- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java
+++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
@@ -19,8 +19,8 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WALLPAPER;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WALLPAPER;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index 2342de3..49c8559 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -16,7 +16,7 @@
 
 package com.android.server.wm;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_TRANSACTIONS;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_ALL;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_SCREEN_ROTATION;
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 1c03ba5..af57c84 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -32,16 +32,17 @@
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
 import static android.os.UserHandle.USER_NULL;
 import static android.view.SurfaceControl.Transaction;
+import static android.view.WindowInsets.Type.InsetsType;
 import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE;
 import static android.view.WindowManager.TRANSIT_CHANGE;
 import static android.window.TaskFragmentAnimationParams.DEFAULT_ANIMATION_BACKGROUND_COLOR;
 import static android.window.flags.DesktopModeFlags.ENABLE_CAPTION_COMPAT_INSET_FORCE_CONSUMPTION;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ANIM;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS_ANIM;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_SYNC_ENGINE;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ANIM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS_ANIM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SYNC_ENGINE;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
 import static com.android.server.wm.AppTransition.MAX_APP_TRANSITION_DURATION;
 import static com.android.server.wm.AppTransition.isActivityTransitOld;
@@ -173,6 +174,13 @@
      */
     protected SparseArray<InsetsSourceProvider> mInsetsSourceProviders = null;
 
+    /**
+     * The combined excluded insets types (combined mExcludeInsetsTypes and the
+     * mMergedExcludeInsetsTypes from its parent)
+     */
+    protected @InsetsType int mMergedExcludeInsetsTypes = 0;
+    private @InsetsType int mExcludeInsetsTypes = 0;
+
     @Nullable
     private ArrayMap<IBinder, DeathRecipient> mInsetsOwnerDeathRecipientMap;
 
@@ -555,6 +563,49 @@
         return mControllableInsetProvider;
     }
 
+    /**
+     * Sets the excludeInsetsTypes of this window and updates the mMergedExcludeInsetsTypes of
+     * all child nodes in the hierarchy.
+     *
+     * @param excludeInsetsTypes the excluded {@link InsetsType} that should be set on this
+     *                           WindowContainer
+     */
+    void setExcludeInsetsTypes(@InsetsType int excludeInsetsTypes) {
+        if (excludeInsetsTypes == mExcludeInsetsTypes) {
+            return;
+        }
+        mExcludeInsetsTypes = excludeInsetsTypes;
+        mergeExcludeInsetsTypesAndNotifyInsetsChanged(
+                mParent != null ? mParent.mMergedExcludeInsetsTypes : 0);
+    }
+
+    private void mergeExcludeInsetsTypesAndNotifyInsetsChanged(
+            @InsetsType int excludeInsetsTypesFromParent) {
+        final ArraySet<WindowState> changedWindows = new ArraySet<>();
+        updateMergedExcludeInsetsTypes(excludeInsetsTypesFromParent, changedWindows);
+        if (getDisplayContent() != null) {
+            getDisplayContent().getInsetsStateController().notifyInsetsChanged(changedWindows);
+        }
+    }
+
+    private void updateMergedExcludeInsetsTypes(
+            @InsetsType int excludeInsetsTypesFromParent, ArraySet<WindowState> changedWindows) {
+        final int newMergedExcludeInsetsTypes = mExcludeInsetsTypes | excludeInsetsTypesFromParent;
+        if (newMergedExcludeInsetsTypes == mMergedExcludeInsetsTypes) {
+            return;
+        }
+        mMergedExcludeInsetsTypes = newMergedExcludeInsetsTypes;
+
+        final WindowState win = asWindowState();
+        if (win != null) {
+            changedWindows.add(win);
+        }
+        // Apply to all children
+        for (int i = mChildren.size() - 1; i >= 0; i--) {
+            final WindowContainer<?> child = mChildren.get(i);
+            child.updateMergedExcludeInsetsTypes(mMergedExcludeInsetsTypes, changedWindows);
+        }
+    }
 
     @Override
     final protected WindowContainer getParent() {
@@ -653,6 +704,7 @@
     void onParentChanged(ConfigurationContainer newParent, ConfigurationContainer oldParent) {
         super.onParentChanged(newParent, oldParent);
         if (mParent == null) {
+            mergeExcludeInsetsTypesAndNotifyInsetsChanged(0);
             return;
         }
 
@@ -667,6 +719,7 @@
             // new parent.
             reparentSurfaceControl(getSyncTransaction(), mParent.mSurfaceControl);
         }
+        mergeExcludeInsetsTypesAndNotifyInsetsChanged(mParent.mMergedExcludeInsetsTypes);
 
         // Either way we need to ask the parent to assign us a Z-order.
         mParent.assignChildLayers();
diff --git a/services/core/java/com/android/server/wm/WindowContainerThumbnail.java b/services/core/java/com/android/server/wm/WindowContainerThumbnail.java
index 80f3c44..ae477e1 100644
--- a/services/core/java/com/android/server/wm/WindowContainerThumbnail.java
+++ b/services/core/java/com/android/server/wm/WindowContainerThumbnail.java
@@ -19,7 +19,7 @@
 import static android.view.SurfaceControl.METADATA_OWNER_UID;
 import static android.view.SurfaceControl.METADATA_WINDOW_TYPE;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_TRANSACTIONS;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
 import static com.android.server.wm.WindowContainerThumbnailProto.HEIGHT;
 import static com.android.server.wm.WindowContainerThumbnailProto.SURFACE_ANIMATOR;
diff --git a/services/core/java/com/android/server/wm/WindowContextListenerController.java b/services/core/java/com/android/server/wm/WindowContextListenerController.java
index 87e120c..809745e 100644
--- a/services/core/java/com/android/server/wm/WindowContextListenerController.java
+++ b/services/core/java/com/android/server/wm/WindowContextListenerController.java
@@ -21,8 +21,8 @@
 import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE;
 import static android.window.WindowProviderService.isWindowProviderService;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE;
-import static com.android.internal.protolog.ProtoLogGroup.WM_ERROR;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ADD_REMOVE;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_ERROR;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index b8f47cc..f4ad030 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -101,18 +101,18 @@
 import static android.view.flags.Flags.sensitiveContentAppProtection;
 import static android.window.WindowProviderService.isWindowProviderService;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ANIM;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_BOOT;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS_LIGHT;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IME;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_SCREEN_ON;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STARTING_WINDOW;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_MOVEMENT;
-import static com.android.internal.protolog.ProtoLogGroup.WM_ERROR;
-import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ADD_REMOVE;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ANIM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_BOOT;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS_LIGHT;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_IME;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SCREEN_ON;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STARTING_WINDOW;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WINDOW_MOVEMENT;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_ERROR;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_TRANSACTIONS;
 import static com.android.internal.util.FrameworkStatsLog.SENSITIVE_NOTIFICATION_APP_PROTECTION_APPLIED;
 import static com.android.internal.util.LatencyTracker.ACTION_ROTATE_SCREEN;
 import static com.android.server.LockGuard.INDEX_WINDOW;
@@ -335,7 +335,7 @@
 import com.android.internal.policy.KeyInterceptionInfo;
 import com.android.internal.protolog.LegacyProtoLogImpl;
 import com.android.internal.protolog.ProtoLog;
-import com.android.internal.protolog.ProtoLogGroup;
+import com.android.internal.protolog.WmProtoLogGroups;
 import com.android.internal.util.DumpUtils;
 import com.android.internal.util.FastPrintWriter;
 import com.android.internal.util.FrameworkStatsLog;
@@ -2109,7 +2109,7 @@
         ProtoLog.v(WM_DEBUG_ADD_REMOVE, "Removing %s from %s", win, token);
         // Window will already be removed from token before this post clean-up method is called.
         if (token.isEmpty() && !token.mPersistOnEmpty) {
-            token.removeImmediately();
+            token.removeIfPossible();
         }
 
         if (win.mActivityRecord != null) {
@@ -3890,8 +3890,8 @@
 
         synchronized (mGlobalLock) {
             mAtmService.getTransitionController().mIsWaitingForDisplayEnabled = false;
-            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Notified TransitionController "
-                    + "that the display is ready.");
+            ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
+                    "Notified TransitionController that the display is ready.");
         }
     }
 
@@ -6810,30 +6810,36 @@
      * @param logLevel  Determines the amount of data to be written to the Protobuf.
      */
     void dumpDebugLocked(ProtoOutputStream proto, @WindowTracingLogLevel int logLevel) {
-        mPolicy.dumpDebug(proto, POLICY);
-        mRoot.dumpDebug(proto, ROOT_WINDOW_CONTAINER, logLevel);
-        final DisplayContent topFocusedDisplayContent = mRoot.getTopFocusedDisplayContent();
-        if (topFocusedDisplayContent.mCurrentFocus != null) {
-            topFocusedDisplayContent.mCurrentFocus.writeIdentifierToProto(proto, FOCUSED_WINDOW);
-        }
-        if (topFocusedDisplayContent.mFocusedApp != null) {
-            topFocusedDisplayContent.mFocusedApp.writeNameToProto(proto, FOCUSED_APP);
-        }
-        final WindowState imeWindow = mRoot.getCurrentInputMethodWindow();
-        if (imeWindow != null) {
-            imeWindow.writeIdentifierToProto(proto, INPUT_METHOD_WINDOW);
-        }
-        proto.write(DISPLAY_FROZEN, mDisplayFrozen);
-        proto.write(FOCUSED_DISPLAY_ID, topFocusedDisplayContent.getDisplayId());
-        proto.write(HARD_KEYBOARD_AVAILABLE, mHardKeyboardAvailable);
+        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "dumpDebugLocked");
+        try {
+            mPolicy.dumpDebug(proto, POLICY);
+            mRoot.dumpDebug(proto, ROOT_WINDOW_CONTAINER, logLevel);
+            final DisplayContent topFocusedDisplayContent = mRoot.getTopFocusedDisplayContent();
+            if (topFocusedDisplayContent.mCurrentFocus != null) {
+                topFocusedDisplayContent.mCurrentFocus
+                        .writeIdentifierToProto(proto, FOCUSED_WINDOW);
+            }
+            if (topFocusedDisplayContent.mFocusedApp != null) {
+                topFocusedDisplayContent.mFocusedApp.writeNameToProto(proto, FOCUSED_APP);
+            }
+            final WindowState imeWindow = mRoot.getCurrentInputMethodWindow();
+            if (imeWindow != null) {
+                imeWindow.writeIdentifierToProto(proto, INPUT_METHOD_WINDOW);
+            }
+            proto.write(DISPLAY_FROZEN, mDisplayFrozen);
+            proto.write(FOCUSED_DISPLAY_ID, topFocusedDisplayContent.getDisplayId());
+            proto.write(HARD_KEYBOARD_AVAILABLE, mHardKeyboardAvailable);
 
-        // This is always true for now since we still update the window frames at the server side.
-        // Once we move the window layout to the client side, this can be false when we are waiting
-        // for the frames.
-        proto.write(WINDOW_FRAMES_VALID, true);
+            // This is always true for now since we still update the window frames at the server
+            // side. Once we move the window layout to the client side, this can be false when we
+            // are waiting for the frames.
+            proto.write(WINDOW_FRAMES_VALID, true);
 
-        // Write the BackNavigationController's state into the protocol buffer
-        mAtmService.mBackNavigationController.dumpDebug(proto, BACK_NAVIGATION);
+            // Write the BackNavigationController's state into the protocol buffer
+            mAtmService.mBackNavigationController.dumpDebug(proto, BACK_NAVIGATION);
+        } finally {
+            Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
+        }
     }
 
     private void dumpWindowsLocked(PrintWriter pw, boolean dumpAll,
@@ -9007,7 +9013,9 @@
 
         final boolean isInputTargetNotFocused =
                 mFocusedInputTarget != t && mFocusedInputTarget != null;
-        if (!isInputTargetNotFocused) {
+        final boolean isTouchOnFocusedDisplay = mFocusedInputTarget != null
+                && t.getDisplayId() == mFocusedInputTarget.getDisplayId();
+        if (!(isInputTargetNotFocused && isTouchOnFocusedDisplay)) {
             return false;
         }
 
@@ -10170,6 +10178,22 @@
         }
     }
 
+    /**
+     * Returns whether the display with the given ID is trusted.
+     */
+    @Override
+    public boolean isDisplayTrusted(int displayId) {
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            synchronized (mGlobalLock) {
+                DisplayContent dc = mRoot.getDisplayContent(displayId);
+                return dc != null && dc.isTrusted();
+            }
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
     @RequiresPermission(ACCESS_SURFACE_FLINGER)
     @Override
     public boolean replaceContentOnDisplay(int displayId, SurfaceControl sc) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
index 06d8c37..21ed8d7 100644
--- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
+++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
@@ -16,6 +16,9 @@
 
 package com.android.server.wm;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 import static android.os.Build.IS_USER;
 import static android.view.CrossWindowBlurListeners.CROSS_WINDOW_BLUR_SUPPORTED;
 
@@ -30,6 +33,7 @@
 import static com.android.server.wm.AppCompatConfiguration.LETTERBOX_VERTICAL_REACHABILITY_POSITION_CENTER;
 import static com.android.server.wm.AppCompatConfiguration.LETTERBOX_VERTICAL_REACHABILITY_POSITION_TOP;
 
+import android.app.WindowConfiguration;
 import android.content.res.Resources.NotFoundException;
 import android.graphics.Color;
 import android.graphics.Point;
@@ -157,6 +161,10 @@
                     return runReset(pw);
                 case "disable-blur":
                     return runSetBlurDisabled(pw);
+                case "set-display-windowing-mode":
+                    return runSetDisplayWindowingMode(pw);
+                case "get-display-windowing-mode":
+                    return runGetDisplayWindowingMode(pw);
                 case "shell":
                     return runWmShellCommand(pw);
                 default:
@@ -1038,6 +1046,25 @@
         return 0;
     }
 
+    private int runSetCameraCompatAspectRatio(PrintWriter pw) throws RemoteException {
+        final float aspectRatio;
+        try {
+            String arg = getNextArgRequired();
+            aspectRatio = Float.parseFloat(arg);
+        } catch (NumberFormatException e) {
+            getErrPrintWriter().println("Error: bad aspect ratio format " + e);
+            return -1;
+        } catch (IllegalArgumentException e) {
+            getErrPrintWriter().println(
+                    "Error: aspect ratio should be provided as an argument " + e);
+            return -1;
+        }
+        synchronized (mInternal.mGlobalLock) {
+            mAppCompatConfiguration.setCameraCompatAspectRatio(aspectRatio);
+        }
+        return 0;
+    }
+
     private int runSetLetterboxStyle(PrintWriter pw) throws RemoteException {
         if (peekNextArg() == null) {
             getErrPrintWriter().println("Error: No arguments provided.");
@@ -1129,6 +1156,9 @@
                     runSetBooleanFlag(pw,
                             mAppCompatConfiguration::setCameraCompatRefreshCycleThroughStopEnabled);
                     break;
+                case "--cameraCompatAspectRatio":
+                    runSetCameraCompatAspectRatio(pw);
+                    break;
                 default:
                     getErrPrintWriter().println(
                             "Error: Unrecognized letterbox style option: " + arg);
@@ -1220,6 +1250,9 @@
                         mAppCompatConfiguration
                                 .resetCameraCompatRefreshCycleThroughStopEnabled();
                         break;
+                    case "cameraCompatAspectRatio":
+                        mAppCompatConfiguration.resetCameraCompatAspectRatio();
+                        break;
                     default:
                         getErrPrintWriter().println(
                                 "Error: Unrecognized letterbox style option: " + arg);
@@ -1330,6 +1363,7 @@
             mAppCompatConfiguration.resetUserAppAspectRatioFullscreenEnabled();
             mAppCompatConfiguration.resetCameraCompatRefreshEnabled();
             mAppCompatConfiguration.resetCameraCompatRefreshCycleThroughStopEnabled();
+            mAppCompatConfiguration.resetCameraCompatAspectRatio();
         }
     }
 
@@ -1408,6 +1442,35 @@
         return 0;
     }
 
+    private int runSetDisplayWindowingMode(PrintWriter pw) throws RemoteException {
+        int displayId = Display.DEFAULT_DISPLAY;
+        String arg = getNextArgRequired();
+        if ("-d".equals(arg)) {
+            displayId = Integer.parseInt(getNextArgRequired());
+            arg = getNextArgRequired();
+        }
+
+        final int windowingMode = Integer.parseInt(arg);
+        mInterface.setWindowingMode(displayId, windowingMode);
+
+        return 0;
+    }
+
+    private int runGetDisplayWindowingMode(PrintWriter pw) throws RemoteException {
+        int displayId = Display.DEFAULT_DISPLAY;
+        final String arg = getNextArg();
+        if ("-d".equals(arg)) {
+            displayId = Integer.parseInt(getNextArgRequired());
+        }
+
+        final int windowingMode = mInterface.getWindowingMode(displayId);
+        pw.println("display windowing mode="
+                + WindowConfiguration.windowingModeToString(windowingMode) + " for displayId="
+                + displayId);
+
+        return 0;
+    }
+
     private int runWmShellCommand(PrintWriter pw) {
         String arg = getNextArg();
 
@@ -1486,6 +1549,9 @@
         // set-multi-window-config
         runResetMultiWindowConfig();
 
+        // set-display-windowing-mode
+        mInternal.setWindowingMode(displayId, WINDOWING_MODE_UNDEFINED);
+
         pw.println("Reset all settings for displayId=" + displayId);
         return 0;
     }
@@ -1526,6 +1592,12 @@
         printLetterboxHelp(pw);
         printMultiWindowConfigHelp(pw);
 
+        pw.println("  set-display-windowing-mode [-d DISPLAY_ID] [mode_id]");
+        pw.println("    As mode_id, use " + WINDOWING_MODE_UNDEFINED + " for undefined, "
+                + WINDOWING_MODE_FREEFORM + " for freeform, " + WINDOWING_MODE_FULLSCREEN + " for"
+                + " fullscreen");
+        pw.println("  get-display-windowing-mode [-d DISPLAY_ID]");
+
         pw.println("  reset [-d DISPLAY_ID]");
         pw.println("    Reset all override settings.");
         if (!IS_USER) {
@@ -1619,6 +1691,11 @@
         pw.println("        Whether activity \"refresh\" in camera compatibility treatment should");
         pw.println("        happen using the \"stopped -> resumed\" cycle rather than");
         pw.println("        \"paused -> resumed\" cycle.");
+        pw.println("      --cameraCompatAspectRatio aspectRatio");
+        pw.println("        Aspect ratio of letterbox for fixed-orientation camera apps, during ");
+        pw.println("        freeform camera compat mode. If aspectRatio <= "
+                + AppCompatConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO);
+        pw.println("        it will be ignored.");
         pw.println("  reset-letterbox-style [aspectRatio|cornerRadius|backgroundType");
         pw.println("      |backgroundColor|wallpaperBlurRadius|wallpaperDarkScrimAlpha");
         pw.println("      |horizontalPositionMultiplier|verticalPositionMultiplier");
@@ -1627,7 +1704,8 @@
         pw.println("      |isTranslucentLetterboxingEnabled|isUserAppAspectRatioSettingsEnabled");
         pw.println("      |persistentPositionMultiplierForHorizontalReachability");
         pw.println("      |persistentPositionMultiplierForVerticalReachability");
-        pw.println("      |defaultPositionMultiplierForVerticalReachability]");
+        pw.println("      |defaultPositionMultiplierForVerticalReachability");
+        pw.println("      |cameraCompatAspectRatio]");
         pw.println("    Resets overrides to default values for specified properties separated");
         pw.println("    by space, e.g. 'reset-letterbox-style aspectRatio cornerRadius'.");
         pw.println("    If no arguments provided, all values will be reset.");
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 476443a..2229807 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -51,6 +51,7 @@
 import static android.window.WindowContainerTransaction.Change.CHANGE_FORCE_TRANSLUCENT;
 import static android.window.WindowContainerTransaction.Change.CHANGE_HIDDEN;
 import static android.window.WindowContainerTransaction.Change.CHANGE_RELATIVE_BOUNDS;
+import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_KEYGUARD_STATE;
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_ADD_INSETS_FRAME_PROVIDER;
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_ADD_TASK_FRAGMENT_OPERATION;
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT;
@@ -67,13 +68,14 @@
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_RESTORE_TRANSIENT_ORDER;
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS;
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_ALWAYS_ON_TOP;
+import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_EXCLUDE_INSETS_TYPES;
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_IS_TRIMMABLE;
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT;
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_LAUNCH_ROOT;
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_REPARENT_LEAF_TASK_IF_RELAUNCH;
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_START_SHORTCUT;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WINDOW_ORGANIZER;
 import static com.android.server.wm.ActivityRecord.State.PAUSING;
 import static com.android.server.wm.ActivityRecord.State.RESUMED;
 import static com.android.server.wm.ActivityTaskManagerService.enforceTaskPermission;
@@ -120,6 +122,7 @@
 import android.window.ITransitionPlayer;
 import android.window.IWindowContainerTransactionCallback;
 import android.window.IWindowOrganizerController;
+import android.window.KeyguardState;
 import android.window.RemoteTransition;
 import android.window.TaskFragmentAnimationParams;
 import android.window.TaskFragmentCreationParams;
@@ -130,7 +133,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.protolog.ProtoLog;
-import com.android.internal.protolog.ProtoLogGroup;
+import com.android.internal.protolog.WmProtoLogGroups;
 import com.android.internal.util.ArrayUtils;
 import com.android.server.LocalServices;
 import com.android.server.pm.LauncherAppsService.LauncherAppsServiceInternal;
@@ -571,7 +574,7 @@
                     // {@link #applySyncTransaction} with Shell transition.
                     // We still want to apply and merge the transaction to the active sync
                     // because {@code shouldApplyIndependently} is {@code false}.
-                    ProtoLog.w(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
+                    ProtoLog.w(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS,
                             "TaskFragmentTransaction changes are not collected in transition"
                                     + " because there is an ongoing sync for"
                                     + " applySyncTransaction().");
@@ -799,7 +802,12 @@
             }
         } finally {
             if (deferTransitionReady) {
-                chain.mTransition.continueTransitionReady();
+                if (chain.mTransition.isCollecting()) {
+                    chain.mTransition.continueTransitionReady();
+                } else {
+                    Slog.wtf(TAG, "Too late, transition : " + chain.mTransition.getSyncId()
+                            + " state: " + chain.mTransition.getState() + " is not collecting");
+                }
             }
             mService.mTaskSupervisor.setDeferRootVisibilityUpdate(false /* deferUpdate */);
             if (deferResume) {
@@ -1247,6 +1255,10 @@
                         caller, errorCallbackToken, organizer);
                 break;
             }
+            case HIERARCHY_OP_TYPE_SET_KEYGUARD_STATE: {
+                effects |= applyKeyguardState(hop);
+                break;
+            }
             case HIERARCHY_OP_TYPE_PENDING_INTENT: {
                 final Bundle launchOpts = hop.getLaunchOptions();
                 ActivityOptions activityOptions = launchOpts != null
@@ -1444,6 +1456,16 @@
                 }
                 break;
             }
+            case HIERARCHY_OP_TYPE_SET_EXCLUDE_INSETS_TYPES: {
+                final WindowContainer container = WindowContainer.fromBinder(hop.getContainer());
+                if (container == null) {
+                    Slog.e(TAG, "Attempt to operate on unknown or detached container: "
+                            + container);
+                    break;
+                }
+                container.setExcludeInsetsTypes(hop.getExcludeInsetsTypes());
+                break;
+            }
         }
         return effects;
     }
@@ -1772,6 +1794,19 @@
         return effects;
     }
 
+    private int applyKeyguardState(@NonNull WindowContainerTransaction.HierarchyOp hop) {
+        int effects = TRANSACT_EFFECTS_NONE;
+
+        final KeyguardState keyguardState = hop.getKeyguardState();
+        if (keyguardState != null) {
+            int displayId = keyguardState.getDisplayId();
+            boolean keyguardShowing = keyguardState.getKeyguardShowing();
+            boolean aodShowing = keyguardState.getAodShowing();
+            mService.mKeyguardController.setKeyguardShown(displayId, keyguardShowing, aodShowing);
+        }
+        return effects;
+    }
+
     /**
      * Executes the provided {@code runnable} after the {@code transition}. If the
      * {@code transition} is {@code null}, the {@code runnable} is executed immediately.
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index 2d9e848..86adc19 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -27,7 +27,7 @@
 import static android.view.WindowManager.TRANSIT_CLOSE;
 import static android.view.WindowManager.TRANSIT_FLAG_APP_CRASHED;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_CONFIGURATION;
 import static com.android.internal.util.Preconditions.checkArgument;
 import static com.android.server.am.ProcessList.INVALID_ADJ;
 import static com.android.server.wm.ActivityRecord.State.DESTROYED;
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 4c4b4f6..76f2437 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -100,19 +100,19 @@
 import static android.view.WindowManagerPolicyConstants.TYPE_LAYER_OFFSET;
 
 import static com.android.input.flags.Flags.removeInputChannelFromWindowstate;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ANIM;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_BACK_PREVIEW;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_DIMMER;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS_LIGHT;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_RESIZE;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STARTING_WINDOW;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_SYNC_ENGINE;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_INSETS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ADD_REMOVE;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ANIM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_BACK_PREVIEW;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_DIMMER;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS_LIGHT;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_RESIZE;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STARTING_WINDOW;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SYNC_ENGINE;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WINDOW_INSETS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_TRANSACTIONS;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
 import static com.android.server.policy.WindowManagerPolicy.TRANSIT_ENTER;
 import static com.android.server.policy.WindowManagerPolicy.TRANSIT_EXIT;
@@ -1378,6 +1378,11 @@
             // should be updated after the new given insets are sent to window manager.
             return;
         }
+        if (!mRelayoutCalled) {
+            // The window was not laid out yet. The source frame should be updated after the window
+            // is laid out.
+            return;
+        }
         final SparseArray<InsetsSourceProvider> providers = getInsetsSourceProviders();
         for (int i = providers.size() - 1; i >= 0; i--) {
             providers.valueAt(i).updateSourceFrame(winFrame);
@@ -1969,6 +1974,13 @@
     boolean isReadyForDisplay() {
         final boolean parentAndClientVisible = !isParentWindowHidden()
                 && mViewVisibility == View.VISIBLE;
+        // TODO(b/338426357): Remove this once the last target using legacy transitions is moved to
+        // shell transitions
+        if (!mTransitionController.isShellTransitionsEnabled()) {
+            return mHasSurface && isVisibleByPolicy() && !mDestroying
+                    && ((parentAndClientVisible && mToken.isVisible())
+                    || isAnimating(TRANSITION | PARENTS));
+        }
         return mHasSurface && isVisibleByPolicy() && !mDestroying && mToken.isVisible()
                 && (parentAndClientVisible || isAnimating(TRANSITION | PARENTS));
     }
@@ -2765,6 +2777,9 @@
         }
 
         if (mTmpRect.isEmpty()) {
+            // TODO(b/371182877) If the app does not draw under cutout region, the touchable region
+            // should not include cutout regions (if scrolling from letterbox feature is not desired
+            // for this region).
             final Rect transformedBounds = mActivityRecord.getFixedRotationTransformDisplayBounds();
             if (transformedBounds != null) {
                 // Task is in the same orientation as display, so the rotated bounds should be
@@ -5203,7 +5218,7 @@
             // but not window manager visible (!isVisibleNow()), it can still be the parent of the
             // dim, but can not create a new surface or continue a dim alone.
             Dimmer dimmer;
-            WindowContainer<?> geometryParent = task;
+            WindowContainer<?> geometryParent = null;
             if (Flags.useTasksDimOnly()) {
                 geometryParent = getDimParent();
                 dimmer = getDimController();
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 82fa9d4..a934eea 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -27,12 +27,12 @@
 import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
 import static android.view.WindowManager.TRANSIT_OLD_NONE;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ANIM;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_DRAW;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STARTING_WINDOW;
-import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_SURFACE_ALLOC;
-import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ANIM;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_DRAW;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STARTING_WINDOW;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_SURFACE_ALLOC;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_TRANSACTIONS;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION;
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index 67bd5cb..5bde8b5 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -18,10 +18,10 @@
 
 import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
 
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_MOVEMENT;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ADD_REMOVE;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS;
+import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WINDOW_MOVEMENT;
 import static com.android.server.wm.WindowContainerChildProto.WINDOW_TOKEN;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
@@ -90,6 +90,9 @@
     // Is key dispatching paused for this token?
     boolean paused = false;
 
+    /** Whether this container should be removed when it no longer animates. */
+    boolean mIsExiting;
+
     /** The owner has {@link android.Manifest.permission#MANAGE_APP_TOKENS} */
     final boolean mOwnerCanManageAppTokens;
 
@@ -276,6 +279,28 @@
         }
     }
 
+    @Override
+    void removeIfPossible() {
+        if (mTransitionController.isPlayingTarget(this)) {
+            // Defer removing this container until the transition is finished. So the removal can
+            // execute after the finish transaction (see Transition#buildFinishTransaction) which
+            // may reparent it to original parent.
+            mIsExiting = true;
+            return;
+        }
+        mIsExiting = false;
+        removeAllWindowsIfPossible();
+        removeImmediately();
+    }
+
+    @Override
+    boolean handleCompleteDeferredRemoval() {
+        if (mIsExiting) {
+            removeIfPossible();
+        }
+        return super.handleCompleteDeferredRemoval();
+    }
+
     /**
      * @return The scale for applications running in compatibility mode. Multiply the size in the
      *         application by this scale will be the size in the screen.
@@ -725,6 +750,9 @@
             pw.print("fixedRotationConfig=");
             pw.println(mFixedRotationTransformState.mRotatedOverrideConfiguration);
         }
+        if (mIsExiting) {
+            pw.print(prefix); pw.println("isExiting=true");
+        }
     }
 
     @Override
diff --git a/services/core/java/com/android/server/wm/WindowTracing.java b/services/core/java/com/android/server/wm/WindowTracing.java
index fe26726..6883437 100644
--- a/services/core/java/com/android/server/wm/WindowTracing.java
+++ b/services/core/java/com/android/server/wm/WindowTracing.java
@@ -167,12 +167,7 @@
 
             long token = os.start(WINDOW_MANAGER_SERVICE);
             synchronized (mGlobalLock) {
-                Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "dumpDebugLocked");
-                try {
-                    mService.dumpDebugLocked(os, logLevel);
-                } finally {
-                    Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
-                }
+                mService.dumpDebugLocked(os, logLevel);
             }
             os.end(token);
         } catch (Exception e) {
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 5cd117b..efca902 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -56,6 +56,7 @@
 #include <nativehelper/ScopedPrimitiveArray.h>
 #include <nativehelper/ScopedUtfChars.h>
 #include <server_configurable_flags/get_flags.h>
+#include <ui/LogicalDisplayId.h>
 #include <ui/Region.h>
 #include <utils/Log.h>
 #include <utils/Looper.h>
@@ -64,6 +65,7 @@
 
 #include <atomic>
 #include <cinttypes>
+#include <map>
 #include <vector>
 
 #include "android_hardware_display_DisplayViewport.h"
@@ -343,7 +345,7 @@
     void setTouchpadRightClickZoneEnabled(bool enabled);
     void setInputDeviceEnabled(uint32_t deviceId, bool enabled);
     void setShowTouches(bool enabled);
-    void setInteractive(bool interactive);
+    void setNonInteractiveDisplays(const std::set<ui::LogicalDisplayId>& displayIds);
     void reloadCalibration();
     void reloadPointerIcons();
     void requestPointerCapture(const sp<IBinder>& windowToken, bool enabled);
@@ -508,9 +510,11 @@
 
         // Keycodes to be remapped.
         std::map<int32_t /* fromKeyCode */, int32_t /* toKeyCode */> keyRemapping{};
+
+        // Displays which are non-interactive.
+        std::set<ui::LogicalDisplayId> nonInteractiveDisplays;
     } mLocked GUARDED_BY(mLock);
 
-    std::atomic<bool> mInteractive;
     void updateInactivityTimeoutLocked();
     void handleInterceptActions(jint wmActions, nsecs_t when, uint32_t& policyFlags);
     void ensureSpriteControllerLocked();
@@ -524,12 +528,13 @@
     void forEachPointerControllerLocked(std::function<void(PointerController&)> apply)
             REQUIRES(mLock);
     PointerIcon loadPointerIcon(JNIEnv* env, ui::LogicalDisplayId displayId, PointerIconStyle type);
+    bool isDisplayInteractive(ui::LogicalDisplayId displayId);
 
     static inline JNIEnv* jniEnv() { return AndroidRuntime::getJNIEnv(); }
 };
 
 NativeInputManager::NativeInputManager(jobject serviceObj, const sp<Looper>& looper)
-      : mLooper(looper), mInteractive(true) {
+      : mLooper(looper) {
     JNIEnv* env = jniEnv();
 
     mServiceObj = env->NewGlobalRef(serviceObj);
@@ -547,9 +552,13 @@
 
 void NativeInputManager::dump(std::string& dump) {
     dump += "Input Manager State:\n";
-    dump += StringPrintf(INDENT "Interactive: %s\n", toString(mInteractive.load()));
     { // acquire lock
         std::scoped_lock _l(mLock);
+        auto logicalDisplayIdToString = [](const ui::LogicalDisplayId& displayId) {
+            return std::to_string(displayId.val());
+        };
+        dump += StringPrintf(INDENT "Display not interactive: %s\n",
+                             dumpSet(mLocked.nonInteractiveDisplays, streamableToString).c_str());
         dump += StringPrintf(INDENT "System UI Lights Out: %s\n",
                              toString(mLocked.systemUiLightsOut));
         dump += StringPrintf(INDENT "Pointer Speed: %" PRId32 "\n", mLocked.pointerSpeed);
@@ -1476,8 +1485,10 @@
     mInputManager->getDispatcher().requestPointerCapture(windowToken, enabled);
 }
 
-void NativeInputManager::setInteractive(bool interactive) {
-    mInteractive = interactive;
+void NativeInputManager::setNonInteractiveDisplays(
+        const std::set<ui::LogicalDisplayId>& displayIds) {
+    std::scoped_lock _l(mLock);
+    mLocked.nonInteractiveDisplays = displayIds;
 }
 
 void NativeInputManager::reloadCalibration() {
@@ -1606,7 +1617,7 @@
     // - Ignore untrusted events and pass them along.
     // - Ask the window manager what to do with normal events and trusted injected events.
     // - For normal events wake and brighten the screen if currently off or dim.
-    const bool interactive = mInteractive.load();
+    const bool interactive = isDisplayInteractive(keyEvent.getDisplayId());
     if (interactive) {
         policyFlags |= POLICY_FLAG_INTERACTIVE;
     }
@@ -1644,7 +1655,7 @@
     // - No special filtering for injected events required at this time.
     // - Filter normal events based on screen state.
     // - For normal events brighten (but do not wake) the screen if currently dim.
-    const bool interactive = mInteractive.load();
+    const bool interactive = isDisplayInteractive(displayId);
     if (interactive) {
         policyFlags |= POLICY_FLAG_INTERACTIVE;
     }
@@ -1683,6 +1694,24 @@
     }
 }
 
+bool NativeInputManager::isDisplayInteractive(ui::LogicalDisplayId displayId) {
+    // If an input event doesn't have an associated id, use the default display id
+    if (displayId == ui::LogicalDisplayId::INVALID) {
+        displayId = ui::LogicalDisplayId::DEFAULT;
+    }
+
+    { // acquire lock
+        std::scoped_lock _l(mLock);
+
+        auto it = mLocked.nonInteractiveDisplays.find(displayId);
+        if (it != mLocked.nonInteractiveDisplays.end()) {
+            return false;
+        }
+    } // release lock
+
+    return true;
+}
+
 nsecs_t NativeInputManager::interceptKeyBeforeDispatching(const sp<IBinder>& token,
                                                           const KeyEvent& keyEvent,
                                                           uint32_t policyFlags) {
@@ -2372,10 +2401,17 @@
     im->setShowTouches(enabled);
 }
 
-static void nativeSetInteractive(JNIEnv* env, jobject nativeImplObj, jboolean interactive) {
+static void nativeSetNonInteractiveDisplays(JNIEnv* env, jobject nativeImplObj,
+                                            jintArray displayIds) {
     NativeInputManager* im = getNativeInputManager(env, nativeImplObj);
 
-    im->setInteractive(interactive);
+    const std::vector displayIdsVec = getIntArray(env, displayIds);
+    std::set<ui::LogicalDisplayId> logicalDisplayIds;
+    for (int displayId : displayIdsVec) {
+        logicalDisplayIds.emplace(ui::LogicalDisplayId{displayId});
+    }
+
+    im->setNonInteractiveDisplays(logicalDisplayIds);
 }
 
 static void nativeReloadCalibration(JNIEnv* env, jobject nativeImplObj) {
@@ -3021,7 +3057,7 @@
          (void*)nativeSetShouldNotifyTouchpadHardwareState},
         {"setTouchpadRightClickZoneEnabled", "(Z)V", (void*)nativeSetTouchpadRightClickZoneEnabled},
         {"setShowTouches", "(Z)V", (void*)nativeSetShowTouches},
-        {"setInteractive", "(Z)V", (void*)nativeSetInteractive},
+        {"setNonInteractiveDisplays", "([I)V", (void*)nativeSetNonInteractiveDisplays},
         {"reloadCalibration", "()V", (void*)nativeReloadCalibration},
         {"vibrate", "(I[J[III)V", (void*)nativeVibrate},
         {"vibrateCombined", "(I[JLandroid/util/SparseArray;II)V", (void*)nativeVibrateCombined},
diff --git a/services/core/jni/com_android_server_vibrator_VibratorController.cpp b/services/core/jni/com_android_server_vibrator_VibratorController.cpp
index 39c0c3e..bcd0b94 100644
--- a/services/core/jni/com_android_server_vibrator_VibratorController.cpp
+++ b/services/core/jni/com_android_server_vibrator_VibratorController.cpp
@@ -41,8 +41,8 @@
 
 static JavaVM* sJvm = nullptr;
 static jmethodID sMethodIdOnComplete;
-static jclass sFrequencyProfileClass;
-static jmethodID sFrequencyProfileCtor;
+static jclass sFrequencyProfileLegacyClass;
+static jmethodID sFrequencyProfileLegacyCtor;
 static struct {
     jmethodID setCapabilities;
     jmethodID setSupportedEffects;
@@ -53,7 +53,7 @@
     jmethodID setPrimitiveDelayMax;
     jmethodID setCompositionSizeMax;
     jmethodID setQFactor;
-    jmethodID setFrequencyProfile;
+    jmethodID setFrequencyProfileLegacy;
     jmethodID setMaxEnvelopeEffectSize;
     jmethodID setMinEnvelopeEffectControlPointDurationMillis;
     jmethodID setMaxEnvelopeEffectControlPointDurationMillis;
@@ -517,11 +517,12 @@
         env->SetFloatArrayRegion(maxAmplitudes, 0, amplitudes.size(),
                                  reinterpret_cast<jfloat*>(amplitudes.data()));
     }
-    jobject frequencyProfile =
-            env->NewObject(sFrequencyProfileClass, sFrequencyProfileCtor, resonantFrequency,
-                           minFrequency, frequencyResolution, maxAmplitudes);
-    env->CallObjectMethod(vibratorInfoBuilder, sVibratorInfoBuilderClassInfo.setFrequencyProfile,
-                          frequencyProfile);
+    jobject frequencyProfileLegacy =
+            env->NewObject(sFrequencyProfileLegacyClass, sFrequencyProfileLegacyCtor,
+                           resonantFrequency, minFrequency, frequencyResolution, maxAmplitudes);
+    env->CallObjectMethod(vibratorInfoBuilder,
+                          sVibratorInfoBuilderClassInfo.setFrequencyProfileLegacy,
+                          frequencyProfileLegacy);
 
     return info.shouldRetry() ? JNI_FALSE : JNI_TRUE;
 }
@@ -566,9 +567,12 @@
     sRampClassInfo.endFrequencyHz = GetFieldIDOrDie(env, rampClass, "mEndFrequencyHz", "F");
     sRampClassInfo.duration = GetFieldIDOrDie(env, rampClass, "mDuration", "I");
 
-    jclass frequencyProfileClass = FindClassOrDie(env, "android/os/VibratorInfo$FrequencyProfile");
-    sFrequencyProfileClass = static_cast<jclass>(env->NewGlobalRef(frequencyProfileClass));
-    sFrequencyProfileCtor = GetMethodIDOrDie(env, sFrequencyProfileClass, "<init>", "(FFF[F)V");
+    jclass frequencyProfileLegacyClass =
+            FindClassOrDie(env, "android/os/VibratorInfo$FrequencyProfileLegacy");
+    sFrequencyProfileLegacyClass =
+            static_cast<jclass>(env->NewGlobalRef(frequencyProfileLegacyClass));
+    sFrequencyProfileLegacyCtor =
+            GetMethodIDOrDie(env, sFrequencyProfileLegacyClass, "<init>", "(FFF[F)V");
 
     jclass vibratorInfoBuilderClass = FindClassOrDie(env, "android/os/VibratorInfo$Builder");
     sVibratorInfoBuilderClassInfo.setCapabilities =
@@ -598,9 +602,9 @@
     sVibratorInfoBuilderClassInfo.setQFactor =
             GetMethodIDOrDie(env, vibratorInfoBuilderClass, "setQFactor",
                              "(F)Landroid/os/VibratorInfo$Builder;");
-    sVibratorInfoBuilderClassInfo.setFrequencyProfile =
-            GetMethodIDOrDie(env, vibratorInfoBuilderClass, "setFrequencyProfile",
-                             "(Landroid/os/VibratorInfo$FrequencyProfile;)"
+    sVibratorInfoBuilderClassInfo.setFrequencyProfileLegacy =
+            GetMethodIDOrDie(env, vibratorInfoBuilderClass, "setFrequencyProfileLegacy",
+                             "(Landroid/os/VibratorInfo$FrequencyProfileLegacy;)"
                              "Landroid/os/VibratorInfo$Builder;");
     sVibratorInfoBuilderClassInfo.setMaxEnvelopeEffectSize =
             GetMethodIDOrDie(env, vibratorInfoBuilderClass, "setMaxEnvelopeEffectSize",
diff --git a/services/core/xsd/display-device-config/display-device-config.xsd b/services/core/xsd/display-device-config/display-device-config.xsd
index 0eafb59..776de2e 100644
--- a/services/core/xsd/display-device-config/display-device-config.xsd
+++ b/services/core/xsd/display-device-config/display-device-config.xsd
@@ -512,8 +512,6 @@
                 <xs:annotation name="final"/>
             </xs:element>
         </xs:sequence>
-        <!-- valid value of interpolation if specified: linear -->
-        <xs:attribute name="interpolation" type="xs:string" use="optional"/>
     </xs:complexType>
 
     <xs:complexType name="brightnessPoint">
@@ -714,6 +712,12 @@
                         minOccurs="0" maxOccurs="unbounded">
                 <xs:annotation name="final"/>
             </xs:element>
+            <!-- The time after which the stylus is to be assumed to be not under use. This will
+             enable the logic of changing the brightness with ambient light changes -->
+            <xs:element name="idleStylusTimeoutMillis" type="xs:nonNegativeInteger"
+                minOccurs="0" maxOccurs="1">
+                <xs:annotation name="final"/>
+            </xs:element>
         </xs:sequence>
     </xs:complexType>
 
diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt
index 355b0ab..110a5a2 100644
--- a/services/core/xsd/display-device-config/schema/current.txt
+++ b/services/core/xsd/display-device-config/schema/current.txt
@@ -8,12 +8,14 @@
     method public final java.math.BigInteger getDarkeningLightDebounceIdleMillis();
     method public final java.math.BigInteger getDarkeningLightDebounceMillis();
     method public boolean getEnabled();
+    method public final java.math.BigInteger getIdleStylusTimeoutMillis();
     method public final java.util.List<com.android.server.display.config.LuxToBrightnessMapping> getLuxToBrightnessMapping();
     method public final void setBrighteningLightDebounceIdleMillis(java.math.BigInteger);
     method public final void setBrighteningLightDebounceMillis(java.math.BigInteger);
     method public final void setDarkeningLightDebounceIdleMillis(java.math.BigInteger);
     method public final void setDarkeningLightDebounceMillis(java.math.BigInteger);
     method public void setEnabled(boolean);
+    method public final void setIdleStylusTimeoutMillis(java.math.BigInteger);
   }
 
   public enum AutoBrightnessModeName {
@@ -91,8 +93,6 @@
   public class ComprehensiveBrightnessMap {
     ctor public ComprehensiveBrightnessMap();
     method @NonNull public final java.util.List<com.android.server.display.config.BrightnessPoint> getBrightnessPoint();
-    method public String getInterpolation();
-    method public void setInterpolation(String);
   }
 
   public class Density {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
index 4beb6a8..a58da81 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
@@ -42,7 +42,6 @@
 import android.app.admin.PolicyValue;
 import android.app.admin.TargetUser;
 import android.app.admin.UserRestrictionPolicyKey;
-import android.app.admin.flags.Flags;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -2100,17 +2099,13 @@
                 String tag = parser.getName();
                 switch (tag) {
                     case TAG_POLICY_KEY_ENTRY:
-                        if (Flags.dontReadPolicyDefinition()) {
-                            policyDefinition = PolicyDefinition.readFromXml(parser);
-                            if (policyDefinition != null) {
-                                policyKey = policyDefinition.getPolicyKey();
-                            }
-                        } else {
-                            policyKey = PolicyDefinition.readPolicyKeyFromXml(parser);
+                        policyDefinition = PolicyDefinition.readFromXml(parser);
+                        if (policyDefinition != null) {
+                            policyKey = policyDefinition.getPolicyKey();
                         }
                         break;
                     case TAG_POLICY_STATE_ENTRY:
-                        if (Flags.dontReadPolicyDefinition() && policyDefinition == null) {
+                        if (policyDefinition == null) {
                             Slogf.w(TAG, "Skipping policy state - unknown policy definition");
                         } else {
                             policyState = PolicyState.readFromXml(policyDefinition, parser);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index b6a4481..2be999f 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -4152,8 +4152,10 @@
     }
 
     private void checkAllUsersAreAffiliatedWithDevice() {
-        Preconditions.checkCallAuthorization(areAllUsersAffiliatedWithDeviceLocked(),
-                "operation not allowed when device has unaffiliated users");
+        synchronized (getLockObject()) {
+            Preconditions.checkCallAuthorization(areAllUsersAffiliatedWithDeviceLocked(),
+                    "operation not allowed when device has unaffiliated users");
+        }
     }
 
     @Override
@@ -8029,8 +8031,7 @@
                 "DevicePolicyManager.wipeDataWithReason() from %s, organization-owned? %s",
                 adminName, calledByProfileOwnerOnOrgOwnedDevice);
 
-        wipeDataNoLock(adminComp, flags, internalReason, wipeReasonForUser, userId,
-                calledOnParentInstance, factoryReset);
+        wipeDataNoLock(adminComp, flags, internalReason, wipeReasonForUser, userId, factoryReset);
     }
 
     private String getGenericWipeReason(
@@ -8186,17 +8187,16 @@
      *                     factory reset
      */
     private void wipeDataNoLock(@Nullable ComponentName admin, int flags, String internalReason,
-            String wipeReasonForUser, int userId, boolean calledOnParentInstance,
-            @Nullable Boolean factoryReset) {
+            String wipeReasonForUser, int userId, @Nullable Boolean factoryReset) {
         wtfIfInLock();
         final String adminPackage;
         if (admin != null) {
             adminPackage = admin.getPackageName();
         } else {
-            int callerId = mInjector.binderGetCallingUid();
-            String[] adminPackages = mInjector.getPackageManager().getPackagesForUid(callerId);
+            int callerUid = mInjector.binderGetCallingUid();
+            String[] adminPackages = mInjector.getPackageManager().getPackagesForUid(callerUid);
             Preconditions.checkState(adminPackages.length > 0,
-                    "Caller %s does not have any associated packages", callerId);
+                    "Caller %s does not have any associated packages", callerUid);
             adminPackage = adminPackages[0];
         }
         mInjector.binderWithCleanCallingIdentity(() -> {
@@ -8218,32 +8218,22 @@
                 throw new SecurityException("Cannot wipe data. " + restriction
                         + " restriction is set for user " + userId);
             }
-        });
 
-        boolean isSystemUser = userId == UserHandle.USER_SYSTEM;
-        boolean isMainUser = userId == getMainUserId();
-        boolean wipeDevice;
-        if (factoryReset == null || !mInjector.isChangeEnabled(EXPLICIT_WIPE_BEHAVIOUR,
-                adminPackage,
-                userId)) {
-            // Legacy mode
-            wipeDevice = getHeadlessDeviceOwnerModeForDeviceOwner()
-                    == HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER ? isMainUser : isSystemUser;
-        } else {
-            // Explicit behaviour
-            if (factoryReset) {
-                EnforcingAdmin enforcingAdmin = enforcePermissionsAndGetEnforcingAdmin(
-                        /*admin=*/ null,
-                        /*permission=*/ new String[]{MANAGE_DEVICE_POLICY_WIPE_DATA,
-                                MASTER_CLEAR},
-                        USES_POLICY_WIPE_DATA,
-                        adminPackage,
-                        factoryReset ? UserHandle.USER_ALL :
-                                getAffectedUser(calledOnParentInstance));
-                wipeDevice = true;
+            boolean isSystemUser = userId == UserHandle.USER_SYSTEM;
+            boolean isMainUser = userId == getMainUserId();
+            boolean wipeDevice;
+            if (factoryReset == null || !mInjector.isChangeEnabled(EXPLICIT_WIPE_BEHAVIOUR,
+                    adminPackage,
+                    userId)) {
+                // Legacy mode
+                wipeDevice = getHeadlessDeviceOwnerModeForDeviceOwner()
+                        == HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER ? isMainUser : isSystemUser;
             } else {
-                mInjector.binderWithCleanCallingIdentity(() -> {
-                    Preconditions.checkCallAuthorization(!isSystemUser,
+                // Explicit behaviour
+                if (factoryReset) {
+                    wipeDevice = true;
+                } else {
+                    Preconditions.checkState(!isSystemUser,
                             "User %s is a system user and cannot be removed", userId);
                     boolean isLastNonHeadlessUser = getUserInfo(userId).isFull()
                             && mUserManager.getAliveUsers().stream()
@@ -8251,13 +8241,11 @@
                             .noneMatch(UserInfo::isFull);
                     Preconditions.checkState(!isLastNonHeadlessUser,
                             "Removing user %s would leave the device without any active users. "
-                                    + "Consider factory resetting the device instead.",
-                            userId);
-                });
-                wipeDevice = false;
+                                    + "Consider factory resetting the device instead.", userId);
+                    wipeDevice = false;
+                }
             }
-        }
-        mInjector.binderWithCleanCallingIdentity(() -> {
+
             if (wipeDevice) {
                 forceWipeDeviceNoLock(
                         (flags & WIPE_EXTERNAL_STORAGE) != 0,
@@ -8598,7 +8586,6 @@
                         /* reason= */ "reportFailedPasswordAttempt()",
                         getFailedPasswordAttemptWipeMessage(),
                         userId,
-                        /* calledOnParentInstance= */ parent,
                         // factoryReset=null to enable U- behaviour
                         /* factoryReset= */ null);
             } catch (SecurityException e) {
@@ -11362,7 +11349,7 @@
         if (mOwners.hasDeviceOwner()) {
             return false;
         }
-        
+
         final ComponentName profileOwner = getProfileOwnerAsUser(userId);
         if (profileOwner == null) {
             return false;
@@ -11371,7 +11358,7 @@
         if (isManagedProfile(userId)) {
             return false;
         }
-        
+
         return true;
     }
     private void enforceCanQueryLockTaskLocked(ComponentName who, String callerPackageName) {
@@ -18213,6 +18200,7 @@
         return false;
     }
 
+    @GuardedBy("getLockObject()")
     private boolean areAllUsersAffiliatedWithDeviceLocked() {
         return mInjector.binderWithCleanCallingIdentity(() -> {
             final List<UserInfo> userInfos = mUserManager.getAliveUsers();
@@ -18310,10 +18298,12 @@
 
         final CallerIdentity caller = getCallerIdentity(admin, packageName);
         if (isPermissionCheckFlagEnabled()) {
-            Preconditions.checkCallAuthorization(isOrganizationOwnedDeviceWithManagedProfile()
-                    || areAllUsersAffiliatedWithDeviceLocked());
-            enforcePermission(MANAGE_DEVICE_POLICY_SECURITY_LOGGING, caller.getPackageName(),
-                    UserHandle.USER_ALL);
+            synchronized (getLockObject()) {
+                Preconditions.checkCallAuthorization(isOrganizationOwnedDeviceWithManagedProfile()
+                        || areAllUsersAffiliatedWithDeviceLocked());
+                enforcePermission(MANAGE_DEVICE_POLICY_SECURITY_LOGGING, caller.getPackageName(),
+                        UserHandle.USER_ALL);
+            }
         } else {
             if (admin != null) {
                 Preconditions.checkCallAuthorization(
@@ -18325,8 +18315,10 @@
                         isCallerDelegate(caller, DELEGATION_SECURITY_LOGGING));
             }
 
-            Preconditions.checkCallAuthorization(isOrganizationOwnedDeviceWithManagedProfile()
-                    || areAllUsersAffiliatedWithDeviceLocked());
+            synchronized (getLockObject()) {
+                Preconditions.checkCallAuthorization(isOrganizationOwnedDeviceWithManagedProfile()
+                        || areAllUsersAffiliatedWithDeviceLocked());
+            }
         }
 
         DevicePolicyEventLogger
@@ -24540,7 +24532,8 @@
             }
         });
     }
-    
+
+    @GuardedBy("getLockObject()")
     private void migrateUserControlDisabledPackagesLocked() {
         Binder.withCleanCallingIdentity(() -> {
             List<UserInfo> users = mUserManager.getUsers();
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyState.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyState.java
index b813489..a4fa089 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyState.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyState.java
@@ -225,9 +225,11 @@
     }
 
     void saveToXml(TypedXmlSerializer serializer) throws IOException {
-        serializer.startTag(/* namespace= */ null, TAG_POLICY_DEFINITION_ENTRY);
-        mPolicyDefinition.saveToXml(serializer);
-        serializer.endTag(/* namespace= */ null, TAG_POLICY_DEFINITION_ENTRY);
+        if (!Flags.dontWritePolicyDefinition()) {
+            serializer.startTag(/* namespace= */ null, TAG_POLICY_DEFINITION_ENTRY);
+            mPolicyDefinition.saveToXml(serializer);
+            serializer.endTag(/* namespace= */ null, TAG_POLICY_DEFINITION_ENTRY);
+        }
 
         if (mCurrentResolvedPolicy != null) {
             serializer.startTag(/* namespace= */ null, TAG_RESOLVED_VALUE_ENTRY);
@@ -298,18 +300,6 @@
                                 + (value == null ? "null" : value));
                     }
                     break;
-                case TAG_POLICY_DEFINITION_ENTRY:
-                    if (Flags.dontReadPolicyDefinition()) {
-                        // Should be passed by the caller.
-                        Objects.requireNonNull(policyDefinition);
-                    } else {
-                        policyDefinition = PolicyDefinition.readFromXml(parser);
-                        if (policyDefinition == null) {
-                            Slogf.wtf(TAG, "Error Parsing TAG_POLICY_DEFINITION_ENTRY, "
-                                    + "PolicyDefinition is null");
-                        }
-                    }
-                    break;
 
                 case TAG_RESOLVED_VALUE_ENTRY:
                     if (policyDefinition == null) {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 5cf260a..7ea1dcd 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -109,7 +109,7 @@
 import com.android.internal.policy.AttributeCache;
 import com.android.internal.protolog.ProtoLog;
 import com.android.internal.protolog.ProtoLogConfigurationServiceImpl;
-import com.android.internal.protolog.ProtoLogGroup;
+import com.android.internal.protolog.WmProtoLogGroups;
 import com.android.internal.util.ConcurrentUtils;
 import com.android.internal.util.EmergencyAffordanceManager;
 import com.android.internal.util.FrameworkStatsLog;
@@ -205,6 +205,7 @@
 import com.android.server.pdb.PersistentDataBlockService;
 import com.android.server.people.PeopleService;
 import com.android.server.permission.access.AccessCheckingService;
+import com.android.server.pinner.PinnerService;
 import com.android.server.pm.ApexManager;
 import com.android.server.pm.ApexSystemServiceInfo;
 import com.android.server.pm.BackgroundInstallControlService;
@@ -1113,7 +1114,7 @@
         }
 
         t.traceBegin("InitializeProtoLog");
-        ProtoLog.init(ProtoLogGroup.values());
+        ProtoLog.init(WmProtoLogGroups.values());
         t.traceEnd();
 
         // Platform compat service is used by ActivityManagerService, PackageManagerService, and
diff --git a/services/net/Android.bp b/services/net/Android.bp
index 927146d..62748e8 100644
--- a/services/net/Android.bp
+++ b/services/net/Android.bp
@@ -31,7 +31,6 @@
 filegroup {
     name: "services-tethering-shared-srcs",
     srcs: [
-        ":framework-annotations",
         "java/android/net/util/NetworkConstants.java",
     ],
     visibility: [
diff --git a/services/profcollect/src/com/android/server/profcollect/Utils.java b/services/profcollect/src/com/android/server/profcollect/Utils.java
index 8508802..a8016a0 100644
--- a/services/profcollect/src/com/android/server/profcollect/Utils.java
+++ b/services/profcollect/src/com/android/server/profcollect/Utils.java
@@ -19,15 +19,20 @@
 import static com.android.server.profcollect.ProfcollectForwardingService.LOG_TAG;
 
 import android.os.RemoteException;
+import android.os.ServiceSpecificException;
 import android.provider.DeviceConfig;
 import android.util.Log;
 
 import com.android.internal.os.BackgroundThread;
 
+import java.time.Instant;
 import java.util.concurrent.ThreadLocalRandom;
 
 public final class Utils {
 
+    private static Instant lastTraceTime = Instant.EPOCH;
+    private static final int TRACE_COOLDOWN_SECONDS = 30;
+
     public static boolean withFrequency(String configName, int defaultFrequency) {
         int threshold = DeviceConfig.getInt(
                 DeviceConfig.NAMESPACE_PROFCOLLECT_NATIVE_BOOT, configName, defaultFrequency);
@@ -39,10 +44,13 @@
         if (mIProfcollect == null) {
             return false;
         }
+        if (isInCooldownOrReset()) {
+            return false;
+        }
         BackgroundThread.get().getThreadHandler().post(() -> {
             try {
                 mIProfcollect.trace_system(eventName);
-            } catch (RemoteException e) {
+            } catch (RemoteException | ServiceSpecificException e) {
                 Log.e(LOG_TAG, "Failed to initiate trace: " + e.getMessage());
             }
         });
@@ -53,10 +61,13 @@
         if (mIProfcollect == null) {
             return false;
         }
+        if (isInCooldownOrReset()) {
+            return false;
+        }
         BackgroundThread.get().getThreadHandler().postDelayed(() -> {
             try {
                 mIProfcollect.trace_system(eventName);
-            } catch (RemoteException e) {
+            } catch (RemoteException | ServiceSpecificException e) {
                 Log.e(LOG_TAG, "Failed to initiate trace: " + e.getMessage());
             }
         }, delayMs);
@@ -68,15 +79,30 @@
         if (mIProfcollect == null) {
             return false;
         }
+        if (isInCooldownOrReset()) {
+            return false;
+        }
         BackgroundThread.get().getThreadHandler().post(() -> {
             try {
                 mIProfcollect.trace_process(eventName,
                         processName,
                         durationMs);
-            } catch (RemoteException e) {
+            } catch (RemoteException | ServiceSpecificException e) {
                 Log.e(LOG_TAG, "Failed to initiate trace: " + e.getMessage());
             }
         });
         return true;
     }
-}
\ No newline at end of file
+
+    /**
+     * Returns true if the last trace is within the cooldown period. If the last trace is outside
+     * the cooldown period, the last trace time is reset to the current time.
+     */
+    private static boolean isInCooldownOrReset() {
+        if (!Instant.now().isBefore(lastTraceTime.plusSeconds(TRACE_COOLDOWN_SECONDS))) {
+            lastTraceTime = Instant.now();
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt b/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt
index 7d5532f..5c4716d 100644
--- a/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt
+++ b/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt
@@ -57,7 +57,6 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
-import org.mockito.ArgumentMatchers.eq
 import org.mockito.Mockito.any
 import org.mockito.Mockito.anyInt
 import org.mockito.Mockito.doReturn
@@ -384,10 +383,6 @@
                     android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)) {
                 PackageManager.PERMISSION_GRANTED
             }
-            whenever(this.checkPermission(
-                eq(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL), anyInt(), anyInt())) {
-                PackageManager.PERMISSION_GRANTED
-            }
         }
         val mockSharedLibrariesImpl: SharedLibrariesImpl = mock {
             whenever(this.snapshot()) { this@mock }
diff --git a/services/tests/PackageManagerServiceTests/appenumeration/src/com/android/server/pm/test/appenumeration/CrossUserPackageVisibilityTests.java b/services/tests/PackageManagerServiceTests/appenumeration/src/com/android/server/pm/test/appenumeration/CrossUserPackageVisibilityTests.java
index e33ca77..70a2d48 100644
--- a/services/tests/PackageManagerServiceTests/appenumeration/src/com/android/server/pm/test/appenumeration/CrossUserPackageVisibilityTests.java
+++ b/services/tests/PackageManagerServiceTests/appenumeration/src/com/android/server/pm/test/appenumeration/CrossUserPackageVisibilityTests.java
@@ -45,7 +45,7 @@
 
 import com.android.bedstead.harrier.BedsteadJUnit4;
 import com.android.bedstead.harrier.DeviceState;
-import com.android.bedstead.harrier.annotations.EnsureHasSecondaryUser;
+import com.android.bedstead.multiuser.annotations.EnsureHasSecondaryUser;
 import com.android.bedstead.nene.users.UserReference;
 import com.android.compatibility.common.util.PollingCheck;
 import com.android.compatibility.common.util.TestUtils;
diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageInstallerSessionTest.kt b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageInstallerSessionTest.kt
index 7aa2ff5..cbca434 100644
--- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageInstallerSessionTest.kt
+++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageInstallerSessionTest.kt
@@ -30,6 +30,7 @@
 import android.util.Slog
 import android.util.Xml
 import com.android.internal.os.BackgroundThread
+import com.android.server.pm.verify.pkg.VerifierController
 import com.android.server.testutils.whenever
 import com.google.common.truth.Truth.assertThat
 import libcore.io.IoUtils
@@ -195,7 +196,8 @@
             /* isApplied */ false,
             /* stagedSessionErrorCode */ PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE,
             /* stagedSessionErrorMessage */ "some error",
-            /* preVerifiedDomains */ DomainSet(setOf("com.foo", "com.bar"))
+            /* preVerifiedDomains */ DomainSet(setOf("com.foo", "com.bar")),
+            /* VerifierController */ mock(VerifierController::class.java)
         )
     }
 
@@ -249,7 +251,8 @@
                                 mock(StagingManager::class.java),
                                 mTmpDir,
                                 mock(PackageSessionProvider::class.java),
-                                mock(SilentUpdatePolicy::class.java)
+                                mock(SilentUpdatePolicy::class.java),
+                                mock(VerifierController::class.java)
                             )
                             ret.add(session)
                         } catch (e: Exception) {
@@ -343,4 +346,4 @@
         assertThat(expected.mInitiatingPackageName).isEqualTo(actual.mInitiatingPackageName)
         assertThat(expected.mOriginatingPackageName).isEqualTo(actual.mOriginatingPackageName)
     }
-}
\ No newline at end of file
+}
diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/verify/pkg/VerificationStatusTrackerTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/verify/pkg/VerificationStatusTrackerTest.java
new file mode 100644
index 0000000..fa076db
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/verify/pkg/VerificationStatusTrackerTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2024 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.verify.pkg;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.concurrent.TimeUnit;
+
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class VerificationStatusTrackerTest {
+    private static final String TEST_PACKAGE_NAME = "com.foo";
+    private static final long TEST_REQUEST_START_TIME = 100L;
+    private static final long TEST_TIMEOUT_DURATION_MILLIS = TimeUnit.MINUTES.toMillis(1);
+    private static final long TEST_TIMEOUT_EXTENDED_MILLIS = TimeUnit.MINUTES.toMillis(2);
+    private static final long TEST_MAX_TIMEOUT_DURATION_MILLIS =
+            TimeUnit.MINUTES.toMillis(10);
+
+    @Mock
+    VerifierController.Injector mInjector;
+    private VerificationStatusTracker mTracker;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mInjector.getVerificationRequestTimeoutMillis()).thenReturn(
+                TEST_TIMEOUT_DURATION_MILLIS);
+        when(mInjector.getMaxVerificationExtendedTimeoutMillis()).thenReturn(
+                TEST_MAX_TIMEOUT_DURATION_MILLIS);
+        // Mock time forward as the code continues to check for the current time
+        when(mInjector.getCurrentTimeMillis())
+                .thenReturn(TEST_REQUEST_START_TIME)
+                .thenReturn(TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS - 1)
+                .thenReturn(TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS)
+                .thenReturn(TEST_REQUEST_START_TIME + TEST_MAX_TIMEOUT_DURATION_MILLIS - 100)
+                .thenReturn(TEST_REQUEST_START_TIME + TEST_MAX_TIMEOUT_DURATION_MILLIS);
+        mTracker = new VerificationStatusTracker(TEST_PACKAGE_NAME, TEST_TIMEOUT_DURATION_MILLIS,
+                TEST_MAX_TIMEOUT_DURATION_MILLIS, mInjector);
+    }
+
+    @Test
+    public void testTimeout() {
+        assertThat(mTracker.getTimeoutTime()).isEqualTo(
+                TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS);
+        // It takes two calls to set the timeout, because the timeout time hasn't been reached for
+        // the first calls
+        assertThat(mTracker.isTimeout()).isFalse();
+        assertThat(mTracker.isTimeout()).isTrue();
+    }
+
+    @Test
+    public void testTimeoutExtended() {
+        assertThat(mTracker.getTimeoutTime()).isEqualTo(
+                TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS);
+        assertThat(mTracker.extendTimeRemaining(TEST_TIMEOUT_EXTENDED_MILLIS))
+                .isEqualTo(TEST_TIMEOUT_EXTENDED_MILLIS);
+        assertThat(mTracker.getTimeoutTime()).isEqualTo(
+                TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS
+                        + TEST_TIMEOUT_EXTENDED_MILLIS);
+
+        // It would take 3 calls to set the timeout, because the timeout time hasn't been reached
+        // for the first 2 time checks, but querying the remaining time also does a time check.
+        assertThat(mTracker.isTimeout()).isFalse();
+        assertThat(mTracker.getRemainingTime()).isGreaterThan(0);
+        assertThat(mTracker.isTimeout()).isTrue();
+        assertThat(mTracker.getRemainingTime()).isEqualTo(0);
+    }
+
+    @Test
+    public void testTimeoutExtendedExceedsMax() {
+        assertThat(mTracker.getTimeoutTime()).isEqualTo(
+                TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS);
+        assertThat(mTracker.extendTimeRemaining(TEST_MAX_TIMEOUT_DURATION_MILLIS))
+                .isEqualTo(TEST_MAX_TIMEOUT_DURATION_MILLIS - TEST_TIMEOUT_DURATION_MILLIS);
+        assertThat(mTracker.getTimeoutTime()).isEqualTo(
+                TEST_REQUEST_START_TIME + TEST_MAX_TIMEOUT_DURATION_MILLIS);
+        // It takes 4 calls to set the timeout, because the timeout time hasn't been reached for
+        // the first 3 calls
+        assertThat(mTracker.isTimeout()).isFalse();
+        assertThat(mTracker.isTimeout()).isFalse();
+        assertThat(mTracker.isTimeout()).isFalse();
+        assertThat(mTracker.isTimeout()).isTrue();
+        assertThat(mTracker.getRemainingTime()).isEqualTo(0);
+    }
+}
diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/verify/pkg/VerifierControllerTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/verify/pkg/VerifierControllerTest.java
new file mode 100644
index 0000000..be094b0
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/verify/pkg/VerifierControllerTest.java
@@ -0,0 +1,502 @@
+/*
+ * Copyright (C) 2024 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.verify.pkg;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.expectThrows;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.SharedLibraryInfo;
+import android.content.pm.SigningInfo;
+import android.content.pm.VersionedPackage;
+import android.content.pm.verify.pkg.IVerifierService;
+import android.content.pm.verify.pkg.VerificationSession;
+import android.content.pm.verify.pkg.VerificationStatus;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Message;
+import android.os.PersistableBundle;
+import android.platform.test.annotations.Presubmit;
+import android.util.Pair;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import com.android.internal.infra.AndroidFuture;
+import com.android.internal.infra.ServiceConnector;
+import com.android.server.pm.Computer;
+import com.android.server.pm.PackageInstallerSession;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
+
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class VerifierControllerTest {
+    private static final int TEST_ID = 100;
+    private static final String TEST_PACKAGE_NAME = "com.foo";
+    private static final ComponentName TEST_VERIFIER_COMPONENT_NAME =
+            new ComponentName("com.verifier", "com.verifier.Service");
+    private static final Uri TEST_PACKAGE_URI = Uri.parse("test://test");
+    private static final SigningInfo TEST_SIGNING_INFO = new SigningInfo();
+    private static final SharedLibraryInfo TEST_SHARED_LIBRARY_INFO1 =
+            new SharedLibraryInfo("sharedLibPath1", TEST_PACKAGE_NAME,
+                    Collections.singletonList("path1"), "sharedLib1", 101,
+                    SharedLibraryInfo.TYPE_DYNAMIC, new VersionedPackage(TEST_PACKAGE_NAME, 1),
+                    null, null, false);
+    private static final SharedLibraryInfo TEST_SHARED_LIBRARY_INFO2 =
+            new SharedLibraryInfo("sharedLibPath2", TEST_PACKAGE_NAME,
+                    Collections.singletonList("path2"), "sharedLib2", 102,
+                    SharedLibraryInfo.TYPE_DYNAMIC,
+                    new VersionedPackage(TEST_PACKAGE_NAME, 2), null, null, false);
+    private static final String TEST_KEY = "test key";
+    private static final String TEST_VALUE = "test value";
+    private static final String TEST_FAILURE_MESSAGE = "verification failed!";
+    private static final long TEST_REQUEST_START_TIME = 0L;
+    private static final long TEST_TIMEOUT_DURATION_MILLIS = TimeUnit.MINUTES.toMillis(1);
+    private static final long TEST_MAX_TIMEOUT_DURATION_MILLIS =
+            TimeUnit.MINUTES.toMillis(10);
+
+    private final ArrayList<SharedLibraryInfo> mTestDeclaredLibraries = new ArrayList<>();
+    private final PersistableBundle mTestExtensionParams = new PersistableBundle();
+    @Mock
+    Context mContext;
+    @Mock
+    Handler mHandler;
+    @Mock
+    VerifierController.Injector mInjector;
+    @Mock
+    ServiceConnector<IVerifierService> mMockServiceConnector;
+    @Mock
+    IVerifierService mMockService;
+    @Mock
+    Computer mSnapshot;
+    Supplier<Computer> mSnapshotSupplier = () -> mSnapshot;
+    @Mock
+    PackageInstallerSession.VerifierCallback mSessionCallback;
+
+    private VerifierController mVerifierController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mInjector.isVerifierInstalled(any(Computer.class), anyInt())).thenReturn(true);
+        when(mInjector.getRemoteService(
+                any(Computer.class), any(Context.class), anyInt(), any(Handler.class)
+        )).thenReturn(new Pair<>(mMockServiceConnector, TEST_VERIFIER_COMPONENT_NAME));
+        when(mInjector.getVerificationRequestTimeoutMillis()).thenReturn(
+                TEST_TIMEOUT_DURATION_MILLIS);
+        when(mInjector.getMaxVerificationExtendedTimeoutMillis()).thenReturn(
+                TEST_MAX_TIMEOUT_DURATION_MILLIS);
+        // Mock time forward as the code continues to check for the current time
+        when(mInjector.getCurrentTimeMillis())
+                .thenReturn(TEST_REQUEST_START_TIME)
+                .thenReturn(TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS + 1);
+        when(mMockServiceConnector.post(any(ServiceConnector.VoidJob.class)))
+                .thenAnswer(
+                        i -> {
+                            ((ServiceConnector.VoidJob) i.getArguments()[0]).run(mMockService);
+                            return new AndroidFuture<>();
+                        });
+        when(mMockServiceConnector.run(any(ServiceConnector.VoidJob.class)))
+                .thenAnswer(
+                        i -> {
+                            ((ServiceConnector.VoidJob) i.getArguments()[0]).run(mMockService);
+                            return true;
+                        });
+
+        mTestDeclaredLibraries.add(TEST_SHARED_LIBRARY_INFO1);
+        mTestDeclaredLibraries.add(TEST_SHARED_LIBRARY_INFO2);
+        mTestExtensionParams.putString(TEST_KEY, TEST_VALUE);
+
+        mVerifierController = new VerifierController(mContext, mHandler, mInjector);
+    }
+
+    @Test
+    public void testVerifierNotInstalled() {
+        when(mInjector.isVerifierInstalled(any(Computer.class), anyInt())).thenReturn(false);
+        when(mInjector.getRemoteService(
+                any(Computer.class), any(Context.class), anyInt(), any(Handler.class)
+        )).thenReturn(null);
+        assertThat(mVerifierController.isVerifierInstalled(mSnapshotSupplier, 0)).isFalse();
+        assertThat(mVerifierController.bindToVerifierServiceIfNeeded(mSnapshotSupplier, 0))
+                .isFalse();
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false)).isFalse();
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ true)).isFalse();
+        verifyZeroInteractions(mSessionCallback);
+    }
+
+    @Test
+    public void testRebindService() {
+        assertThat(mVerifierController.bindToVerifierServiceIfNeeded(mSnapshotSupplier, 0))
+                .isTrue();
+    }
+
+    @Test
+    public void testVerifierAvailableButNotConnected() {
+        assertThat(mVerifierController.isVerifierInstalled(mSnapshotSupplier, 0)).isTrue();
+        when(mInjector.getRemoteService(
+                any(Computer.class), any(Context.class), anyInt(), any(Handler.class)
+        )).thenReturn(null);
+        assertThat(mVerifierController.bindToVerifierServiceIfNeeded(mSnapshotSupplier, 0))
+                .isFalse();
+        // Test that nothing crashes if the verifier is available even though there's no bound
+        mVerifierController.notifyPackageNameAvailable(TEST_PACKAGE_NAME);
+        mVerifierController.notifyVerificationCancelled(TEST_PACKAGE_NAME);
+        mVerifierController.notifyVerificationTimeout(-1);
+        // Since there was no bound, no call is made to the verifier
+        verifyZeroInteractions(mMockService);
+    }
+
+    @Test
+    public void testUnbindService() throws Exception {
+        ArgumentCaptor<ServiceConnector.ServiceLifecycleCallbacks> captor = ArgumentCaptor.forClass(
+                ServiceConnector.ServiceLifecycleCallbacks.class);
+        assertThat(mVerifierController.bindToVerifierServiceIfNeeded(mSnapshotSupplier, 0))
+                .isTrue();
+        verify(mMockServiceConnector).setServiceLifecycleCallbacks(captor.capture());
+        ServiceConnector.ServiceLifecycleCallbacks<IVerifierService> callbacks = captor.getValue();
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false)).isTrue();
+        verify(mMockService, times(1)).onVerificationRequired(any(VerificationSession.class));
+        callbacks.onBinderDied();
+        // Test that nothing crashes if the service connection is lost
+        assertThat(mVerifierController.isVerifierInstalled(mSnapshotSupplier, 0)).isTrue();
+        mVerifierController.notifyPackageNameAvailable(TEST_PACKAGE_NAME);
+        mVerifierController.notifyVerificationCancelled(TEST_PACKAGE_NAME);
+        mVerifierController.notifyVerificationTimeout(TEST_ID);
+        verifyNoMoreInteractions(mMockService);
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false)).isTrue();
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ true)).isTrue();
+        mVerifierController.notifyVerificationTimeout(TEST_ID);
+        verify(mMockService, times(1)).onVerificationTimeout(eq(TEST_ID));
+    }
+
+    @Test
+    public void testNotifyPackageNameAvailable() throws Exception {
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false)).isTrue();
+        mVerifierController.notifyPackageNameAvailable(TEST_PACKAGE_NAME);
+        verify(mMockService).onPackageNameAvailable(eq(TEST_PACKAGE_NAME));
+    }
+
+    @Test
+    public void testNotifyVerificationCancelled() throws Exception {
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false)).isTrue();
+        mVerifierController.notifyVerificationCancelled(TEST_PACKAGE_NAME);
+        verify(mMockService).onVerificationCancelled(eq(TEST_PACKAGE_NAME));
+    }
+
+    @Test
+    public void testStartVerificationSession() throws Exception {
+        ArgumentCaptor<VerificationSession> captor =
+                ArgumentCaptor.forClass(VerificationSession.class);
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false)).isTrue();
+        verify(mMockService).onVerificationRequired(captor.capture());
+        VerificationSession session = captor.getValue();
+        assertThat(session.getId()).isEqualTo(TEST_ID);
+        assertThat(session.getInstallSessionId()).isEqualTo(TEST_ID);
+        assertThat(session.getPackageName()).isEqualTo(TEST_PACKAGE_NAME);
+        assertThat(session.getStagedPackageUri()).isEqualTo(TEST_PACKAGE_URI);
+        assertThat(session.getSigningInfo().getSigningDetails())
+                .isEqualTo(TEST_SIGNING_INFO.getSigningDetails());
+        List<SharedLibraryInfo> declaredLibraries = session.getDeclaredLibraries();
+        // SharedLibraryInfo doesn't have a "equals" method, so we have to check it indirectly
+        assertThat(declaredLibraries.getFirst().toString())
+                .isEqualTo(TEST_SHARED_LIBRARY_INFO1.toString());
+        assertThat(declaredLibraries.get(1).toString())
+                .isEqualTo(TEST_SHARED_LIBRARY_INFO2.toString());
+        // We can't directly test with PersistableBundle.equals() because the parceled bundle's
+        // structure is different, but all the key/value pairs should be preserved as before.
+        assertThat(session.getExtensionParams().getString(TEST_KEY))
+                .isEqualTo(mTestExtensionParams.getString(TEST_KEY));
+    }
+
+    @Test
+    public void testNotifyVerificationRetry() throws Exception {
+        ArgumentCaptor<VerificationSession> captor =
+                ArgumentCaptor.forClass(VerificationSession.class);
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ true)).isTrue();
+        verify(mMockService).onVerificationRetry(captor.capture());
+        VerificationSession session = captor.getValue();
+        assertThat(session.getId()).isEqualTo(TEST_ID);
+        assertThat(session.getInstallSessionId()).isEqualTo(TEST_ID);
+        assertThat(session.getPackageName()).isEqualTo(TEST_PACKAGE_NAME);
+        assertThat(session.getStagedPackageUri()).isEqualTo(TEST_PACKAGE_URI);
+        assertThat(session.getSigningInfo().getSigningDetails())
+                .isEqualTo(TEST_SIGNING_INFO.getSigningDetails());
+        List<SharedLibraryInfo> declaredLibraries = session.getDeclaredLibraries();
+        // SharedLibraryInfo doesn't have a "equals" method, so we have to check it indirectly
+        assertThat(declaredLibraries.getFirst().toString())
+                .isEqualTo(TEST_SHARED_LIBRARY_INFO1.toString());
+        assertThat(declaredLibraries.get(1).toString())
+                .isEqualTo(TEST_SHARED_LIBRARY_INFO2.toString());
+        // We can't directly test with PersistableBundle.equals() because the parceled bundle's
+        // structure is different, but all the key/value pairs should be preserved as before.
+        assertThat(session.getExtensionParams().getString(TEST_KEY))
+                .isEqualTo(mTestExtensionParams.getString(TEST_KEY));
+    }
+
+    @Test
+    public void testNotifyVerificationTimeout() throws Exception {
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ true)).isTrue();
+        mVerifierController.notifyVerificationTimeout(TEST_ID);
+        verify(mMockService).onVerificationTimeout(eq(TEST_ID));
+    }
+
+    @Test
+    public void testRequestTimeout() {
+        // Let the mock handler set request to TIMEOUT, immediately after the request is sent.
+        // We can't mock postDelayed because it's final, but we can mock the method it calls.
+        when(mHandler.sendMessageAtTime(any(Message.class), anyLong())).thenAnswer(
+                i -> {
+                    ((Message) i.getArguments()[0]).getCallback().run();
+                    return true;
+                });
+        ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false)).isTrue();
+        verify(mHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
+        verify(mSessionCallback, times(1)).onTimeout();
+        verify(mInjector, times(2)).getCurrentTimeMillis();
+        verify(mInjector, times(1)).stopTimeoutCountdown(eq(mHandler), any());
+    }
+
+    @Test
+    public void testRequestTimeoutWithRetryPass() throws Exception {
+        // Only let the first request timeout and let the second one pass
+        when(mHandler.sendMessageAtTime(any(Message.class), anyLong())).thenAnswer(
+                        i -> {
+                            ((Message) i.getArguments()[0]).getCallback().run();
+                            return true;
+                        })
+                .thenAnswer(i -> true);
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false)).isTrue();
+        verify(mHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
+        verify(mSessionCallback, times(1)).onTimeout();
+        verify(mInjector, times(2)).getCurrentTimeMillis();
+        verify(mInjector, times(1)).stopTimeoutCountdown(eq(mHandler), any());
+        // Then retry
+        ArgumentCaptor<VerificationSession> captor =
+                ArgumentCaptor.forClass(VerificationSession.class);
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ true)).isTrue();
+        verify(mMockService).onVerificationRetry(captor.capture());
+        VerificationSession session = captor.getValue();
+        VerificationStatus status = new VerificationStatus.Builder().setVerified(true).build();
+        session.reportVerificationComplete(status);
+        verify(mSessionCallback, times(1)).onVerificationCompleteReceived(
+                eq(status), eq(null));
+        verify(mInjector, times(2)).stopTimeoutCountdown(eq(mHandler), any());
+    }
+
+    @Test
+    public void testRequestIncomplete() throws Exception {
+        ArgumentCaptor<VerificationSession> captor =
+                ArgumentCaptor.forClass(VerificationSession.class);
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false)).isTrue();
+        verify(mMockService).onVerificationRequired(captor.capture());
+        VerificationSession session = captor.getValue();
+        session.reportVerificationIncomplete(VerificationSession.VERIFICATION_INCOMPLETE_UNKNOWN);
+        verify(mSessionCallback, times(1)).onVerificationIncompleteReceived(
+                eq(VerificationSession.VERIFICATION_INCOMPLETE_UNKNOWN));
+        verify(mInjector, times(1)).stopTimeoutCountdown(eq(mHandler), any());
+    }
+
+    @Test
+    public void testRequestCompleteWithSuccessWithExtensionResponse() throws Exception {
+        ArgumentCaptor<VerificationSession> captor =
+                ArgumentCaptor.forClass(VerificationSession.class);
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false)).isTrue();
+        verify(mMockService).onVerificationRequired(captor.capture());
+        VerificationSession session = captor.getValue();
+        VerificationStatus status = new VerificationStatus.Builder().setVerified(true).build();
+        PersistableBundle bundle = new PersistableBundle();
+        session.reportVerificationComplete(status, bundle);
+        verify(mSessionCallback, times(1)).onVerificationCompleteReceived(
+                eq(status), eq(bundle));
+        verify(mInjector, times(1)).stopTimeoutCountdown(eq(mHandler), any());
+    }
+
+    @Test
+    public void testRequestCompleteWithFailure() throws Exception {
+        ArgumentCaptor<VerificationSession> captor =
+                ArgumentCaptor.forClass(VerificationSession.class);
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false)).isTrue();
+        verify(mMockService).onVerificationRequired(captor.capture());
+        VerificationSession session = captor.getValue();
+        VerificationStatus status = new VerificationStatus.Builder()
+                .setVerified(false)
+                .setFailureMessage(TEST_FAILURE_MESSAGE)
+                .build();
+        session.reportVerificationComplete(status);
+        verify(mSessionCallback, times(1)).onVerificationCompleteReceived(
+                eq(status), eq(null));
+        verify(mInjector, times(1)).stopTimeoutCountdown(eq(mHandler), any());
+    }
+
+    @Test
+    public void testRepeatedRequestCompleteShouldThrow() throws Exception {
+        ArgumentCaptor<VerificationSession> captor =
+                ArgumentCaptor.forClass(VerificationSession.class);
+        assertThat(mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false)).isTrue();
+        verify(mMockService).onVerificationRequired(captor.capture());
+        VerificationSession session = captor.getValue();
+        VerificationStatus status = new VerificationStatus.Builder().setVerified(true).build();
+        session.reportVerificationComplete(status);
+        // getters should throw after the report
+        expectThrows(IllegalStateException.class, () -> session.getTimeoutTime());
+        // Report again should fail with exception
+        expectThrows(IllegalStateException.class, () -> session.reportVerificationComplete(status));
+    }
+
+    @Test
+    public void testExtendTimeRemaining() throws Exception {
+        ArgumentCaptor<VerificationSession> captor =
+                ArgumentCaptor.forClass(VerificationSession.class);
+        mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false);
+        verify(mMockService).onVerificationRequired(captor.capture());
+        VerificationSession session = captor.getValue();
+        final long initialTimeoutTime = TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS;
+        assertThat(session.getTimeoutTime()).isEqualTo(initialTimeoutTime);
+        final long extendTimeMillis = TEST_TIMEOUT_DURATION_MILLIS;
+        assertThat(session.extendTimeRemaining(extendTimeMillis)).isEqualTo(extendTimeMillis);
+        assertThat(session.getTimeoutTime()).isEqualTo(initialTimeoutTime + extendTimeMillis);
+    }
+
+    @Test
+    public void testExtendTimeExceedsMax() throws Exception {
+        ArgumentCaptor<VerificationSession> captor =
+                ArgumentCaptor.forClass(VerificationSession.class);
+        mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false);
+        verify(mMockService).onVerificationRequired(captor.capture());
+        VerificationSession session = captor.getValue();
+        final long initialTimeoutTime = TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS;
+        final long maxTimeoutTime = TEST_REQUEST_START_TIME + TEST_MAX_TIMEOUT_DURATION_MILLIS;
+        assertThat(session.getTimeoutTime()).isEqualTo(initialTimeoutTime);
+        final long extendTimeMillis = TEST_MAX_TIMEOUT_DURATION_MILLIS;
+        assertThat(session.extendTimeRemaining(extendTimeMillis)).isEqualTo(
+                TEST_MAX_TIMEOUT_DURATION_MILLIS - TEST_TIMEOUT_DURATION_MILLIS);
+        assertThat(session.getTimeoutTime()).isEqualTo(maxTimeoutTime);
+    }
+
+    @Test
+    public void testTimeoutChecksMultipleTimes() {
+        // Mock message handling
+        when(mHandler.sendMessageAtTime(any(Message.class), anyLong())).thenAnswer(
+                        i -> {
+                            ((Message) i.getArguments()[0]).getCallback().run();
+                            return true;
+                        });
+        // Mock time forward as the code continues to check for the current time
+        when(mInjector.getCurrentTimeMillis())
+                // First called when the tracker is created
+                .thenReturn(TEST_REQUEST_START_TIME)
+                // Then mock the first timeout check when the timeout time isn't reached yet
+                .thenReturn(TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS - 1000)
+                // Then mock the same time used to check the remaining time
+                .thenReturn(TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS - 1000)
+                // Then mock the second timeout check when the timeout time isn't reached yet
+                .thenReturn(TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS - 100)
+                // Then mock the same time used to check the remaining time
+                .thenReturn(TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS - 100)
+                // Then mock the third timeout check when the timeout time has been reached
+                .thenReturn(TEST_REQUEST_START_TIME + TEST_TIMEOUT_DURATION_MILLIS + 1);
+        mVerifierController.startVerificationSession(
+                mSnapshotSupplier, 0, TEST_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI,
+                TEST_SIGNING_INFO, mTestDeclaredLibraries, mTestExtensionParams, mSessionCallback,
+                /* retry= */ false);
+        verify(mHandler, times(3)).sendMessageAtTime(any(Message.class), anyLong());
+        verify(mInjector, times(6)).getCurrentTimeMillis();
+        verify(mSessionCallback, times(1)).onTimeout();
+    }
+}
diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/pkg/PackageStateTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/pkg/PackageStateTest.kt
index b21c349..2144785 100644
--- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/pkg/PackageStateTest.kt
+++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/pkg/PackageStateTest.kt
@@ -94,6 +94,7 @@
             ParsedService::getIntents,
             ParsedService::getProperties,
             Intent::getCategories,
+            Intent::getExtraIntentKeys,
             PackageUserState::getDisabledComponents,
             PackageUserState::getEnabledComponents,
             PackageUserState::getSharedLibraryOverlayPaths,
diff --git a/services/tests/RemoteProvisioningServiceTests/Android.bp b/services/tests/RemoteProvisioningServiceTests/Android.bp
index 19c9136..3a73c39 100644
--- a/services/tests/RemoteProvisioningServiceTests/Android.bp
+++ b/services/tests/RemoteProvisioningServiceTests/Android.bp
@@ -31,7 +31,6 @@
         "service-rkp.impl",
         "services.core",
         "truth",
-        "truth-java8-extension",
     ],
     test_suites: [
         "device-tests",
diff --git a/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningShellCommandTest.java b/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningShellCommandTest.java
index 007c0db..a1616c6 100644
--- a/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningShellCommandTest.java
+++ b/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningShellCommandTest.java
@@ -17,7 +17,6 @@
 package com.android.server.security.rkp;
 
 import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
diff --git a/services/tests/appfunctions/Android.bp b/services/tests/appfunctions/Android.bp
index 9560ec9..c841643 100644
--- a/services/tests/appfunctions/Android.bp
+++ b/services/tests/appfunctions/Android.bp
@@ -36,6 +36,7 @@
         "androidx.test.core",
         "androidx.test.runner",
         "androidx.test.ext.truth",
+        "kotlin-test",
         "platform-test-annotations",
         "services.appfunctions",
         "servicestests-core-utils",
diff --git a/services/tests/appfunctions/src/android/app/appfunctions/AppFunctionRuntimeMetadataTest.kt b/services/tests/appfunctions/src/android/app/appfunctions/AppFunctionRuntimeMetadataTest.kt
index da3e94f..d326204 100644
--- a/services/tests/appfunctions/src/android/app/appfunctions/AppFunctionRuntimeMetadataTest.kt
+++ b/services/tests/appfunctions/src/android/app/appfunctions/AppFunctionRuntimeMetadataTest.kt
@@ -15,8 +15,12 @@
  */
 package android.app.appfunctions
 
+import android.app.appfunctions.AppFunctionManager.APP_FUNCTION_STATE_DEFAULT
+import android.app.appfunctions.AppFunctionManager.APP_FUNCTION_STATE_DISABLED
+import android.app.appfunctions.AppFunctionManager.APP_FUNCTION_STATE_ENABLED
 import android.app.appsearch.AppSearchSchema
 import com.google.common.truth.Truth.assertThat
+import kotlin.test.assertFailsWith
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -108,32 +112,43 @@
 
         assertThat(runtimeMetadata.packageName).isEqualTo("com.pkg")
         assertThat(runtimeMetadata.functionId).isEqualTo("funcId")
-        assertThat(runtimeMetadata.enabled).isNull()
+        assertThat(runtimeMetadata.enabled).isEqualTo(APP_FUNCTION_STATE_DEFAULT)
         assertThat(runtimeMetadata.appFunctionStaticMetadataQualifiedId)
             .isEqualTo("android\$apps-db/app_functions#com.pkg/funcId")
     }
 
     @Test
-    fun setEnabled_true() {
+    fun setEnabled_enabled() {
         val runtimeMetadata =
-            AppFunctionRuntimeMetadata.Builder("com.pkg", "funcId").setEnabled(true).build()
+            AppFunctionRuntimeMetadata.Builder("com.pkg", "funcId").setEnabled(APP_FUNCTION_STATE_ENABLED).build()
 
-        assertThat(runtimeMetadata.enabled).isTrue()
+        assertThat(runtimeMetadata.enabled).isEqualTo(APP_FUNCTION_STATE_ENABLED)
     }
 
     @Test
-    fun setEnabled_false() {
+    fun setEnabled_disabled() {
         val runtimeMetadata =
-            AppFunctionRuntimeMetadata.Builder("com.pkg", "funcId").setEnabled(false).build()
+            AppFunctionRuntimeMetadata.Builder("com.pkg", "funcId").setEnabled(
+                APP_FUNCTION_STATE_DISABLED).build()
 
-        assertThat(runtimeMetadata.enabled).isFalse()
+        assertThat(runtimeMetadata.enabled).isEqualTo(APP_FUNCTION_STATE_DISABLED)
     }
 
     @Test
-    fun setEnabled_null() {
+    fun setEnabled_default() {
         val runtimeMetadata =
-            AppFunctionRuntimeMetadata.Builder("com.pkg", "funcId").setEnabled(null).build()
+            AppFunctionRuntimeMetadata.Builder("com.pkg", "funcId").setEnabled(
+                APP_FUNCTION_STATE_DEFAULT).build()
 
-        assertThat(runtimeMetadata.enabled).isNull()
+        assertThat(runtimeMetadata.enabled).isEqualTo(APP_FUNCTION_STATE_DEFAULT)
+    }
+
+    @Test
+    fun setEnabled_illegalArgument() {
+        val runtimeMetadataBuilder =
+            AppFunctionRuntimeMetadata.Builder("com.pkg", "funcId")
+        assertFailsWith<IllegalArgumentException>("Value of EnabledState is unsupported.") {
+            runtimeMetadataBuilder.setEnabled(-1)
+        }
     }
 }
diff --git a/services/tests/appfunctions/src/android/app/appfunctions/GenericDocumentWrapperTest.kt b/services/tests/appfunctions/src/android/app/appfunctions/GenericDocumentWrapperTest.kt
new file mode 100644
index 0000000..413eb31
--- /dev/null
+++ b/services/tests/appfunctions/src/android/app/appfunctions/GenericDocumentWrapperTest.kt
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2024 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 android.app.appfunctions
+
+import android.app.appsearch.GenericDocument
+import android.os.Parcel
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+
+@RunWith(JUnit4::class)
+class GenericDocumentWrapperTest {
+
+    @Test
+    fun parcelUnparcel() {
+        val doc =
+            GenericDocument.Builder<GenericDocument.Builder<*>>("", "", "")
+                .setPropertyLong("test", 42)
+                .build()
+        val wrapper = GenericDocumentWrapper(doc)
+
+        val recovered = parcelUnparcel(wrapper)
+
+        assertThat(recovered.value.getPropertyLong("test")).isEqualTo(42)
+    }
+
+    @Test
+    fun parcelUnparcel_afterGetValue() {
+        val doc =
+            GenericDocument.Builder<GenericDocument.Builder<*>>("", "", "")
+                .setPropertyLong("test", 42)
+                .build()
+        val wrapper = GenericDocumentWrapper(doc)
+        assertThat(wrapper.value.getPropertyLong("test")).isEqualTo(42)
+
+        val recovered = parcelUnparcel(wrapper)
+
+        assertThat(recovered.value.getPropertyLong("test")).isEqualTo(42)
+    }
+
+
+    @Test
+    fun getValue() {
+        val doc =
+            GenericDocument.Builder<GenericDocument.Builder<*>>("", "", "")
+                .setPropertyLong("test", 42)
+                .build()
+        val wrapper = GenericDocumentWrapper(doc)
+
+        assertThat(wrapper.value.getPropertyLong("test")).isEqualTo(42)
+    }
+
+    private fun parcelUnparcel(obj: GenericDocumentWrapper): GenericDocumentWrapper {
+        val parcel = Parcel.obtain()
+        try {
+            obj.writeToParcel(parcel, 0)
+            parcel.setDataPosition(0)
+            return GenericDocumentWrapper.CREATOR.createFromParcel(parcel)
+        } finally {
+            parcel.recycle()
+        }
+    }
+}
\ No newline at end of file
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java
index fd05b26..3976ea4 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java
@@ -157,6 +157,7 @@
                 .getIdleScreenRefreshRateTimeoutLuxThresholdPoint());
         assertNull(mDisplayDeviceConfig.getTempSensor().name);
         assertTrue(mDisplayDeviceConfig.isAutoBrightnessAvailable());
+        assertEquals(0, mDisplayDeviceConfig.getIdleStylusTimeoutMillis());
     }
 
     @Test
@@ -253,6 +254,7 @@
                 .getLux().intValue());
         assertEquals(800, idleScreenRefreshRateTimeoutLuxThresholdPoints.get(1)
                 .getTimeout().intValue());
+        assertEquals(1000, mDisplayDeviceConfig.getIdleStylusTimeoutMillis());
     }
 
     @Test
@@ -392,7 +394,7 @@
     public void testInvalidLuxThrottling() throws Exception {
         setupDisplayDeviceConfigFromDisplayConfigFile(
                 getContent(getInvalidLuxThrottling(), getValidProxSensor(),
-                        /* includeIdleMode= */ true, /* enableEvenDimmer */ false));
+                        /* includeIdleMode= */ true, /* enableEvenDimmer= */ false));
 
         Map<DisplayDeviceConfig.BrightnessLimitMapType, Map<Float, Float>> luxThrottlingData =
                 mDisplayDeviceConfig.getLuxThrottlingData();
@@ -600,7 +602,7 @@
     public void testProximitySensorWithEmptyValuesFromDisplayConfig() throws IOException {
         setupDisplayDeviceConfigFromDisplayConfigFile(
                 getContent(getValidLuxThrottling(), getProxSensorWithEmptyValues(),
-                        /* includeIdleMode= */ true, /* enableEvenDimmer */ false));
+                        /* includeIdleMode= */ true, /* enableEvenDimmer= */ false));
         assertNull(mDisplayDeviceConfig.getProximitySensor());
     }
 
@@ -608,7 +610,7 @@
     public void testProximitySensorWithRefreshRatesFromDisplayConfig() throws IOException {
         setupDisplayDeviceConfigFromDisplayConfigFile(
                 getContent(getValidLuxThrottling(), getValidProxSensorWithRefreshRateAndVsyncRate(),
-                        /* includeIdleMode= */ true, /* enableEvenDimmer */ false));
+                        /* includeIdleMode= */ true, /* enableEvenDimmer= */ false));
         assertEquals("test_proximity_sensor",
                 mDisplayDeviceConfig.getProximitySensor().type);
         assertEquals("Test Proximity Sensor",
@@ -803,7 +805,7 @@
     @Test
     public void testBrightnessRamps_IdleFallsBackToConfigInteractive() throws IOException {
         setupDisplayDeviceConfigFromDisplayConfigFile(getContent(getValidLuxThrottling(),
-                getValidProxSensor(), /* includeIdleMode= */ false, /* enableEvenDimmer */ false));
+                getValidProxSensor(), /* includeIdleMode= */ false, /* enableEvenDimmer= */ false));
 
         assertEquals(mDisplayDeviceConfig.getBrightnessRampDecreaseMaxMillis(), 3000);
         assertEquals(mDisplayDeviceConfig.getBrightnessRampIncreaseMaxMillis(), 2000);
@@ -820,14 +822,14 @@
     @Test
     public void testBrightnessCapForWearBedtimeMode() throws IOException {
         setupDisplayDeviceConfigFromDisplayConfigFile(getContent(getValidLuxThrottling(),
-                getValidProxSensor(), /* includeIdleMode= */ false, /* enableEvenDimmer */ false));
+                getValidProxSensor(), /* includeIdleMode= */ false, /* enableEvenDimmer= */ false));
         assertEquals(0.1f, mDisplayDeviceConfig.getBrightnessCapForWearBedtimeMode(), ZERO_DELTA);
     }
 
     @Test
     public void testAutoBrightnessBrighteningLevels() throws IOException {
         setupDisplayDeviceConfigFromDisplayConfigFile(getContent(getValidLuxThrottling(),
-                getValidProxSensor(), /* includeIdleMode= */ false, /* enableEvenDimmer */ false));
+                getValidProxSensor(), /* includeIdleMode= */ false, /* enableEvenDimmer= */ false));
 
         assertArrayEquals(new float[]{0.0f, 80},
                 mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(
@@ -890,7 +892,7 @@
         when(mFlags.areAutoBrightnessModesEnabled()).thenReturn(false);
         setupDisplayDeviceConfigFromConfigResourceFile();
         setupDisplayDeviceConfigFromDisplayConfigFile(getContent(getValidLuxThrottling(),
-                getValidProxSensor(), /* includeIdleMode= */ false, /* enableEvenDimmer */ false));
+                getValidProxSensor(), /* includeIdleMode= */ false, /* enableEvenDimmer= */ false));
 
         assertArrayEquals(new float[]{brightnessIntToFloat(50), brightnessIntToFloat(100),
                         brightnessIntToFloat(150)},
@@ -929,7 +931,7 @@
         when(mFlags.isEvenDimmerEnabled()).thenReturn(true);
         when(mResources.getBoolean(R.bool.config_evenDimmerEnabled)).thenReturn(true);
         setupDisplayDeviceConfigFromDisplayConfigFile(getContent(getValidLuxThrottling(),
-                getValidProxSensor(), /* includeIdleMode= */ false, /* enableEvenDimmer */ true));
+                getValidProxSensor(), /* includeIdleMode= */ false, /* enableEvenDimmer= */ true));
 
         assertTrue(mDisplayDeviceConfig.isEvenDimmerAvailable());
         assertEquals(0.01f, mDisplayDeviceConfig.getBacklightFromBrightness(0.002f), ZERO_DELTA);
@@ -1365,7 +1367,7 @@
 
     private String getContent() {
         return getContent(getValidLuxThrottling(), getValidProxSensor(),
-                /* includeIdleMode= */ true, false);
+                /* includeIdleMode= */ true, /* enableEvenDimmer= */ false);
     }
 
     private String getContent(String brightnessCapConfig, String proxSensor,
@@ -1479,6 +1481,7 @@
                 +               "</point>\n"
                 +           "</map>\n"
                 +       "</luxToBrightnessMapping>\n"
+                +       "<idleStylusTimeoutMillis>1000</idleStylusTimeoutMillis>\n"
                 +   "</autoBrightness>\n"
                 +  getPowerThrottlingConfig()
                 +   "<highBrightnessMode enabled=\"true\">\n"
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayEventDeliveryTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayEventDeliveryTest.java
index 90f6257..d00e2c6 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayEventDeliveryTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayEventDeliveryTest.java
@@ -25,6 +25,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
 
 import android.app.ActivityManager;
 import android.app.Instrumentation;
@@ -38,6 +39,9 @@
 import android.os.Message;
 import android.os.Messenger;
 import android.platform.test.annotations.AppModeSdkSandbox;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 import android.util.Log;
 import android.util.SparseArray;
 
@@ -46,15 +50,19 @@
 import androidx.test.platform.app.InstrumentationRegistry;
 
 import com.android.compatibility.common.util.SystemUtil;
+import com.android.compatibility.common.util.TestUtils;
+import com.android.server.am.Flags;
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameter;
 import org.junit.runners.Parameterized.Parameters;
 
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.LinkedBlockingQueue;
@@ -68,6 +76,10 @@
 public class DisplayEventDeliveryTest {
     private static final String TAG = "DisplayEventDeliveryTest";
 
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule =
+            DeviceFlagsValueProvider.createCheckFlagsRule();
+
     private static final String NAME = TAG;
     private static final int WIDTH = 720;
     private static final int HEIGHT = 480;
@@ -149,7 +161,6 @@
             mExpectations.offer(event);
         }
 
-
         /**
          * Assert that there isn't any unexpected display event from the test activity
          */
@@ -189,19 +200,9 @@
     @Parameter(0)
     public int mDisplayCount;
 
-    /**
-     * True if running the test activity in cached mode
-     * False if running it in non-cached mode
-     */
-    @Parameter(1)
-    public boolean mCached;
-
-    @Parameters(name = "#{index}: {0} {1}")
+    @Parameters(name = "#{index}: {0}")
     public static Iterable<? extends Object> data() {
-        return Arrays.asList(new Object[][]{
-                {1, false}, {2, false}, {3, false}, {10, false},
-                {1, true}, {2, true}, {3, true}, {10, true}
-        });
+        return Arrays.asList(new Object[][]{ {1}, {2}, {3}, {10} });
     }
 
     private class TestHandler extends Handler {
@@ -289,20 +290,51 @@
     }
 
     /**
-     * Create virtual displays, change their configurations and release them
-     * mDisplays: the amount of virtual displays to be created
-     * mCached: true to run the test activity in cached mode; false in non-cached mode
+     * Return true if the freezer is enabled on this platform.
      */
-    @Test
-    public void testDisplayEvents() {
-        Log.d(TAG, "Start test testDisplayEvents " + mDisplayCount + " " + mCached);
-        // Launch DisplayEventActivity and start listening to display events
-        launchTestActivity();
+    private boolean isAppFreezerEnabled() {
+        try {
+            return mActivityManager.getService().isAppFreezerEnabled();
+        } catch (Exception e) {
+            Log.e(TAG, "isAppFreezerEnabled() failed: " + e);
+            return false;
+        }
+    }
 
-        if (mCached) {
-            // The test activity in cached mode won't receive the pending display events
+    private void waitForProcessFreeze(int pid, long timeoutMs) {
+        // TODO: Add a listener to monitor freezer state changes.
+        SystemUtil.runWithShellPermissionIdentity(() -> {
+            TestUtils.waitUntil("Timed out waiting for test process to be frozen; pid=" + pid,
+                    (int) TimeUnit.MILLISECONDS.toSeconds(timeoutMs),
+                    () -> mActivityManager.isProcessFrozen(pid));
+        });
+    }
+
+    private void waitForProcessUnfreeze(int pid, long timeoutMs) {
+        // TODO: Add a listener to monitor freezer state changes.
+        SystemUtil.runWithShellPermissionIdentity(() -> {
+            TestUtils.waitUntil("Timed out waiting for test process to be frozen; pid=" + pid,
+                    (int) TimeUnit.MILLISECONDS.toSeconds(timeoutMs),
+                    () -> !mActivityManager.isProcessFrozen(pid));
+        });
+    }
+
+    /**
+     * Create virtual displays, change their configurations and release them.  The number of
+     * displays is set by the {@link #mDisplays} variable.
+     */
+    private void testDisplayEventsInternal(boolean cached, boolean frozen) {
+        Log.d(TAG, "Start test testDisplayEvents " + mDisplayCount + " " + cached + " " + frozen);
+        // Launch DisplayEventActivity and start listening to display events
+        int pid = launchTestActivity();
+
+        // The test activity in cached or frozen mode won't receive the pending display events.
+        if (cached) {
             makeTestActivityCached();
         }
+        if (frozen) {
+            makeTestActivityFrozen(pid);
+        }
 
         // Create new virtual displays
         for (int i = 0; i < mDisplayCount; i++) {
@@ -315,8 +347,8 @@
         }
 
         for (int i = 0; i < mDisplayCount; i++) {
-            if (mCached) {
-                // DISPLAY_ADDED should be deferred for cached process
+            if (cached || frozen) {
+                // DISPLAY_ADDED should be deferred for a cached or frozen process.
                 displayBundleAt(i).assertNoDisplayEvents();
             } else {
                 // DISPLAY_ADDED should arrive immediately for non-cached process
@@ -331,8 +363,8 @@
         }
 
         for (int i = 0; i < mDisplayCount; i++) {
-            if (mCached) {
-                // DISPLAY_CHANGED should be deferred for cached process
+            if (cached || frozen) {
+                // DISPLAY_CHANGED should be deferred for cached or frozen  process.
                 displayBundleAt(i).assertNoDisplayEvents();
             } else {
                 // DISPLAY_CHANGED should arrive immediately for non-cached process
@@ -340,10 +372,16 @@
             }
         }
 
-        if (mCached) {
-            // The test activity becomes non-cached and should receive the pending display events
+        // Unfreeze the test activity, if it was frozen.
+        if (frozen) {
+            makeTestActivityUnfrozen(pid);
+        }
+
+        if (cached || frozen) {
+            // Always ensure the test activity is not cached.
             bringTestActivityTop();
 
+            // The test activity becomes non-cached and should receive the pending display events
             for (int i = 0; i < mDisplayCount; i++) {
                 // The pending DISPLAY_ADDED & DISPLAY_CHANGED should arrive now
                 displayBundleAt(i).waitDisplayEvent(DISPLAY_ADDED);
@@ -363,9 +401,48 @@
     }
 
     /**
-     * Launch the test activity that would listen to display events
+     * Create virtual displays, change their configurations and release them.
      */
-    private void launchTestActivity() {
+    @Test
+    public void testDisplayEvents() {
+        testDisplayEventsInternal(false, false);
+    }
+
+    /**
+     * Create virtual displays, change their configurations and release them.  The display app is
+     * moved to cached and the test verifies that no events are delivered to the cached app.
+     */
+    @Test
+    public void testDisplayEventsCached() {
+        testDisplayEventsInternal(true, false);
+    }
+
+    /**
+     * Create virtual displays, change their configurations and release them.  The display app is
+     * frozen and the test verifies that no events are delivered to the frozen app.
+     */
+    @RequiresFlagsEnabled(Flags.FLAG_DEFER_DISPLAY_EVENTS_WHEN_FROZEN)
+    @Test
+    public void testDisplayEventsFrozen() {
+        assumeTrue(isAppFreezerEnabled());
+        testDisplayEventsInternal(false, true);
+    }
+
+    /**
+     * Create virtual displays, change their configurations and release them.  The display app is
+     * cached and frozen and the test verifies that no events are delivered to the app.
+     */
+    @RequiresFlagsEnabled(Flags.FLAG_DEFER_DISPLAY_EVENTS_WHEN_FROZEN)
+    @Test
+    public void testDisplayEventsCachedFrozen() {
+        assumeTrue(isAppFreezerEnabled());
+        testDisplayEventsInternal(true, true);
+    }
+
+    /**
+     * Launch the test activity that would listen to display events. Return its process ID.
+     */
+    private int launchTestActivity() {
         Intent intent = new Intent(Intent.ACTION_MAIN);
         intent.setClassName(TEST_PACKAGE, TEST_ACTIVITY);
         intent.putExtra(TEST_MESSENGER, mMessenger);
@@ -377,6 +454,18 @@
                 },
                 android.Manifest.permission.START_ACTIVITIES_FROM_SDK_SANDBOX);
         waitLatch(mLatchActivityLaunch);
+
+        try {
+            String cmd = "pidof " + TEST_PACKAGE;
+            String result = SystemUtil.runShellCommand(mInstrumentation, cmd);
+            return Integer.parseInt(result.trim());
+        } catch (IOException e) {
+            fail("failed to get pid of test package");
+            return 0;
+        } catch (NumberFormatException e) {
+            fail("failed to parse pid " + e);
+            return 0;
+        }
     }
 
     /**
@@ -415,6 +504,45 @@
         waitLatch(mLatchActivityCached);
     }
 
+    // Sleep, ignoring interrupts.
+    private void pause(int s) {
+        try { Thread.sleep(s * 1000); } catch (Exception e) { }
+    }
+
+    /**
+     * Freeze the test activity.
+     */
+    private void makeTestActivityFrozen(int pid) {
+        // The delay here is meant to allow pending binder transactions to drain.  A process
+        // cannot be frozen if it has pending binder transactions, and attempting to freeze such a
+        // process more than a few times will result in the system killing the process.
+        pause(5);
+        try {
+            String cmd = "am freeze --sticky ";
+            SystemUtil.runShellCommand(mInstrumentation, cmd + TEST_PACKAGE);
+        } catch (IOException e) {
+            fail(e.toString());
+        }
+        // Wait for the freeze to complete in the kernel and for the frozen process
+        // notification to settle out.
+        waitForProcessFreeze(pid, 5 * 1000);
+    }
+
+    /**
+     * Freeze the test activity.
+     */
+    private void makeTestActivityUnfrozen(int pid) {
+        try {
+            String cmd = "am unfreeze --sticky ";
+            SystemUtil.runShellCommand(mInstrumentation, cmd + TEST_PACKAGE);
+        } catch (IOException e) {
+            fail(e.toString());
+        }
+        // Wait for the freeze to complete in the kernel and for the frozen process
+        // notification to settle out.
+        waitForProcessUnfreeze(pid, 5 * 1000);
+    }
+
     /**
      * Create a virtual display
      *
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java
index 255dcb0..1a1c8e5 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java
@@ -37,6 +37,7 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
@@ -49,6 +50,7 @@
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.atLeastOnce;
@@ -1308,6 +1310,38 @@
     }
 
     /**
+     * Tests that it's not allowed to create an auto-mirror virtual display without
+     * CAPTURE_VIDEO_OUTPUT permission or a virtual device that can mirror displays
+     */
+    @Test
+    public void createAutoMirrorDisplay_withoutPermissionOrAllowedVirtualDevice_throwsException()
+            throws Exception {
+        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
+        DisplayManagerInternal localService = displayManager.new LocalService();
+        registerDefaultDisplays(displayManager);
+        when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
+        IVirtualDevice virtualDevice = mock(IVirtualDevice.class);
+        when(virtualDevice.getDeviceId()).thenReturn(1);
+        when(virtualDevice.canCreateMirrorDisplays()).thenReturn(false);
+        when(mIVirtualDeviceManager.isValidVirtualDeviceId(1)).thenReturn(true);
+        when(mContext.checkCallingPermission(CAPTURE_VIDEO_OUTPUT)).thenReturn(
+                PackageManager.PERMISSION_DENIED);
+
+        final VirtualDisplayConfig.Builder builder =
+                new VirtualDisplayConfig.Builder(VIRTUAL_DISPLAY_NAME, 600, 800, 320)
+                        .setFlags(VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR)
+                        .setUniqueId("uniqueId --- mirror display");
+        assertThrows(SecurityException.class, () -> {
+            localService.createVirtualDisplay(
+                    builder.build(),
+                    mMockAppToken /* callback */,
+                    virtualDevice /* virtualDeviceToken */,
+                    mock(DisplayWindowPolicyController.class),
+                    PACKAGE_NAME);
+        });
+    }
+
+    /**
      * Tests that the virtual display is added to the default display group when created with
      * VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR using a virtual device.
      */
@@ -1319,6 +1353,7 @@
         when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
         IVirtualDevice virtualDevice = mock(IVirtualDevice.class);
         when(virtualDevice.getDeviceId()).thenReturn(1);
+        when(virtualDevice.canCreateMirrorDisplays()).thenReturn(true);
         when(mIVirtualDeviceManager.isValidVirtualDeviceId(1)).thenReturn(true);
 
         // Create an auto-mirror virtual display using a virtual device.
@@ -1351,6 +1386,7 @@
         when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
         IVirtualDevice virtualDevice = mock(IVirtualDevice.class);
         when(virtualDevice.getDeviceId()).thenReturn(1);
+        when(virtualDevice.canCreateMirrorDisplays()).thenReturn(true);
         when(mIVirtualDeviceManager.isValidVirtualDeviceId(1)).thenReturn(true);
 
         // Create an auto-mirror virtual display using a virtual device.
@@ -1417,6 +1453,7 @@
         when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
         IVirtualDevice virtualDevice = mock(IVirtualDevice.class);
         when(virtualDevice.getDeviceId()).thenReturn(1);
+        when(virtualDevice.canCreateMirrorDisplays()).thenReturn(true);
         when(mIVirtualDeviceManager.isValidVirtualDeviceId(1)).thenReturn(true);
         when(mContext.checkCallingPermission(ADD_ALWAYS_UNLOCKED_DISPLAY))
                 .thenReturn(PackageManager.PERMISSION_GRANTED);
@@ -1452,6 +1489,7 @@
         when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
         IVirtualDevice virtualDevice = mock(IVirtualDevice.class);
         when(virtualDevice.getDeviceId()).thenReturn(1);
+        when(virtualDevice.canCreateMirrorDisplays()).thenReturn(true);
         when(mIVirtualDeviceManager.isValidVirtualDeviceId(1)).thenReturn(true);
 
         // Create an auto-mirror virtual display using a virtual device.
@@ -1524,6 +1562,47 @@
     }
 
     @Test
+    public void testGetDisplayIdsForGroup() throws Exception {
+        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
+        displayManager.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+        DisplayManagerInternal localService = displayManager.new LocalService();
+        LogicalDisplayMapper logicalDisplayMapper = displayManager.getLogicalDisplayMapper();
+        // Create display 1
+        FakeDisplayDevice displayDevice1 =
+                createFakeDisplayDevice(displayManager, new float[]{60f}, Display.TYPE_INTERNAL);
+        LogicalDisplay display1 = logicalDisplayMapper.getDisplayLocked(displayDevice1);
+        final int groupId1 = display1.getDisplayInfoLocked().displayGroupId;
+        // Create display 2
+        FakeDisplayDevice displayDevice2 =
+                createFakeDisplayDevice(displayManager, new float[]{60f}, Display.TYPE_INTERNAL);
+        LogicalDisplay display2 = logicalDisplayMapper.getDisplayLocked(displayDevice2);
+        final int groupId2 = display2.getDisplayInfoLocked().displayGroupId;
+        // Both displays should be in the same display group
+        assertEquals(groupId1, groupId2);
+        final int[] expectedDisplayIds = new int[]{
+                display1.getDisplayIdLocked(), display2.getDisplayIdLocked()};
+
+        final int[] displayIds = localService.getDisplayIdsForGroup(groupId1);
+
+        assertArrayEquals(expectedDisplayIds, displayIds);
+    }
+
+    @Test
+    public void testGetDisplayIdsForUnknownGroup() throws Exception {
+        final int unknownDisplayGroupId = 999;
+        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
+        displayManager.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+        DisplayManagerInternal localService = displayManager.new LocalService();
+        LogicalDisplayMapper logicalDisplayMapper = displayManager.getLogicalDisplayMapper();
+        // Verify that display manager does not have display group
+        assertNull(logicalDisplayMapper.getDisplayGroupLocked(unknownDisplayGroupId));
+
+        final int[] displayIds = localService.getDisplayIdsForGroup(unknownDisplayGroupId);
+
+        assertEquals(0, displayIds.length);
+    }
+
+    @Test
     public void testCreateVirtualDisplay_isValidProjection_notValid()
             throws RemoteException {
         when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
@@ -3367,6 +3446,31 @@
         verify(dpc).onDisplayChanged(/* hbmMetadata= */ null, Layout.NO_LEAD_DISPLAY);
     }
 
+    @Test
+    public void testCreateAndReleaseVirtualDisplay_CalledWithTheSameUid() {
+        DisplayManagerService displayManager =
+                new DisplayManagerService(mContext, mShortMockedInjector);
+        registerDefaultDisplays(displayManager);
+        DisplayManagerService.BinderService bs = displayManager.new BinderService();
+        VirtualDisplayConfig config = mock(VirtualDisplayConfig.class);
+        Surface surface = mock(Surface.class);
+        when(config.getSurface()).thenReturn(surface);
+        int callingUid = Binder.getCallingUid();
+        IBinder binder = mock(IBinder.class);
+        when(mMockAppToken.asBinder()).thenReturn(binder);
+        String uniqueId = "123";
+        when(config.getUniqueId()).thenReturn(uniqueId);
+
+        bs.createVirtualDisplay(config, mMockAppToken, /* projection= */ null, PACKAGE_NAME);
+        verify(mMockVirtualDisplayAdapter).createVirtualDisplayLocked(eq(mMockAppToken),
+                /* projection= */ isNull(), eq(callingUid), eq(PACKAGE_NAME),
+                eq("virtual:" + PACKAGE_NAME + ":" + uniqueId), eq(surface), /* flags= */ anyInt(),
+                eq(config));
+
+        bs.releaseVirtualDisplay(mMockAppToken);
+        verify(mMockVirtualDisplayAdapter).releaseVirtualDisplayLocked(binder, callingUid);
+    }
+
     private void initDisplayPowerController(DisplayManagerInternal localService) {
         localService.initPowerManagement(new DisplayManagerInternal.DisplayPowerCallbacks() {
             @Override
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
index c70bf8a..01b2d3e 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
@@ -35,6 +35,7 @@
 import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.description;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.reset;
@@ -2278,29 +2279,44 @@
             throws Exception {
         when(mDisplayManagerFlagsMock.isBatteryStatsEnabledForAllDisplays()).thenReturn(false);
 
-        verifyNoteScreenState(Display.DEFAULT_DISPLAY, /* expectNote= */ true);
+        verifyNoteScreenState(
+                Display.DEFAULT_DISPLAY, Display.TYPE_INTERNAL, /* expectNote= */ true);
     }
 
     @Test
     public void testBatteryStatNotes_enabledOnDefaultDisplayWhenEnabledOnOthers() throws Exception {
         when(mDisplayManagerFlagsMock.isBatteryStatsEnabledForAllDisplays()).thenReturn(true);
 
-        verifyNoteScreenState(Display.DEFAULT_DISPLAY, /* expectNote= */ true);
+        verifyNoteScreenState(
+                Display.DEFAULT_DISPLAY, Display.TYPE_INTERNAL, /* expectNote= */ true);
     }
 
     @Test
-    public void testBatteryStatNotes_flagGuardedOnNonDefaultDisplays() throws Exception {
+    public void testBatteryStatNotes_flagOff_disabledForNonDefaultDisplays() throws Exception {
         when(mDisplayManagerFlagsMock.isBatteryStatsEnabledForAllDisplays()).thenReturn(false);
 
-        verifyNoteScreenState(/* displayId= */ 2, /* expectNote= */ false);
-
-        when(mDisplayManagerFlagsMock.isBatteryStatsEnabledForAllDisplays()).thenReturn(true);
-
-        verifyNoteScreenState(/* displayId= */ 2, /* expectNote= */ true);
+        verifyNoteScreenState(/* displayId= */ 2, Display.TYPE_INTERNAL, /* expectNote= */ false);
     }
 
-    private void verifyNoteScreenState(int displayId, boolean expectNote) throws Exception {
-        mHolder = createDisplayPowerController(displayId, UNIQUE_ID);
+    @Test
+    public void testBatteryStatNotes_enabledOnlyOnInternalOrExternalDisplays() throws Exception {
+        when(mDisplayManagerFlagsMock.isBatteryStatsEnabledForAllDisplays()).thenReturn(true);
+
+        for (int displayType = 0; displayType < Display.TYPE_MAX; displayType++) {
+            boolean expectNote =
+                    (displayType == Display.TYPE_INTERNAL)
+                            || (displayType == Display.TYPE_EXTERNAL);
+            verifyNoteScreenState(/* displayId= */ 2, displayType, expectNote);
+        }
+    }
+
+    private void verifyNoteScreenState(int displayId, int displayDeviceType, boolean expectNote)
+            throws Exception {
+        clearInvocations(mMockBatteryStats);
+        DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo();
+        deviceInfo.type = displayDeviceType;
+        deviceInfo.uniqueId = UNIQUE_ID;
+        mHolder = createDisplayPowerController(displayId, deviceInfo);
         DisplayPowerRequest dpr = new DisplayPowerRequest();
         dpr.policy = DisplayPowerRequest.POLICY_BRIGHT;
         when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_ON);
@@ -2308,14 +2324,22 @@
         mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
         advanceTime(1); // Run updatePowerState
 
+        final String baseErrorMessage =
+                String.format("[display id=%d type=%d]", displayId, displayDeviceType);
+        final String errorMessage;
         if (expectNote) {
-            verify(mMockBatteryStats)
+            errorMessage = "Expected battery stats: " + baseErrorMessage;
+            verify(mMockBatteryStats, description(errorMessage))
                     .noteScreenState(
                             displayId, Display.STATE_ON, Display.STATE_REASON_DEFAULT_POLICY);
-            verify(mMockBatteryStats).noteScreenBrightness(eq(displayId), anyInt());
+            verify(mMockBatteryStats, description(errorMessage))
+                    .noteScreenBrightness(eq(displayId), anyInt());
         } else {
-            verify(mMockBatteryStats, never()).noteScreenState(anyInt(), anyInt(), anyInt());
-            verify(mMockBatteryStats, never()).noteScreenBrightness(anyInt(), anyInt());
+            errorMessage = "Expected no battery stats: " + baseErrorMessage;
+            verify(mMockBatteryStats, never().description(errorMessage))
+                    .noteScreenState(anyInt(), anyInt(), anyInt());
+            verify(mMockBatteryStats, never().description(errorMessage))
+                    .noteScreenBrightness(anyInt(), anyInt());
         }
     }
 
@@ -2350,17 +2374,16 @@
     private void setUpDisplay(int displayId, String uniqueId, LogicalDisplay logicalDisplayMock,
             DisplayDevice displayDeviceMock, DisplayDeviceConfig displayDeviceConfigMock,
             boolean isEnabled) {
-
-        setUpDisplay(displayId, uniqueId, logicalDisplayMock, displayDeviceMock,
+        DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo();
+        deviceInfo.uniqueId = uniqueId;
+        setUpDisplay(displayId, deviceInfo, logicalDisplayMock, displayDeviceMock,
                 displayDeviceConfigMock, isEnabled, "display_name");
     }
 
-    private void setUpDisplay(int displayId, String uniqueId, LogicalDisplay logicalDisplayMock,
-            DisplayDevice displayDeviceMock, DisplayDeviceConfig displayDeviceConfigMock,
-            boolean isEnabled, String displayName) {
+    private void setUpDisplay(int displayId, DisplayDeviceInfo deviceInfo,
+            LogicalDisplay logicalDisplayMock, DisplayDevice displayDeviceMock,
+            DisplayDeviceConfig displayDeviceConfigMock, boolean isEnabled, String displayName) {
         DisplayInfo info = new DisplayInfo();
-        DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo();
-        deviceInfo.uniqueId = uniqueId;
 
         when(logicalDisplayMock.getDisplayIdLocked()).thenReturn(displayId);
         when(logicalDisplayMock.getPrimaryDisplayDeviceLocked()).thenReturn(displayDeviceMock);
@@ -2368,7 +2391,7 @@
         when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled);
         when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false);
         when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo);
-        when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId);
+        when(displayDeviceMock.getUniqueId()).thenReturn(deviceInfo.uniqueId);
         when(displayDeviceMock.getNameLocked()).thenReturn(displayName);
         when(displayDeviceMock.getDisplayDeviceConfig()).thenReturn(displayDeviceConfigMock);
         when(displayDeviceConfigMock.getProximitySensor()).thenReturn(
@@ -2415,6 +2438,12 @@
                 hysteresisLevels);
     }
 
+    private DisplayPowerControllerHolder createDisplayPowerController(
+            int displayId, DisplayDeviceInfo info) {
+        return createDisplayPowerController(
+                displayId, info, /* isEnabled= */ true, /* isAutoBrightnessAvailable= */ true);
+    }
+
     private DisplayPowerControllerHolder createDisplayPowerController(int displayId,
             String uniqueId) {
         return createDisplayPowerController(displayId, uniqueId, /* isEnabled= */ true);
@@ -2428,6 +2457,14 @@
 
     private DisplayPowerControllerHolder createDisplayPowerController(int displayId,
             String uniqueId, boolean isEnabled, boolean isAutoBrightnessAvailable) {
+        DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo();
+        deviceInfo.uniqueId = uniqueId;
+        return createDisplayPowerController(
+                displayId, deviceInfo, isEnabled, isAutoBrightnessAvailable);
+    }
+
+    private DisplayPowerControllerHolder createDisplayPowerController(int displayId,
+            DisplayDeviceInfo deviceInfo, boolean isEnabled, boolean isAutoBrightnessAvailable) {
         final DisplayPowerState displayPowerState = mock(DisplayPowerState.class);
         final DualRampAnimator<DisplayPowerState> animator = mock(DualRampAnimator.class);
         final AutomaticBrightnessController automaticBrightnessController =
@@ -2469,7 +2506,7 @@
         when(config.getScreenBrightnessHysteresis()).thenReturn(hysteresisLevels);
         when(config.getScreenBrightnessIdleHysteresis()).thenReturn(hysteresisLevels);
 
-        setUpDisplay(displayId, uniqueId, display, device, config, isEnabled);
+        setUpDisplay(displayId, deviceInfo, display, device, config, isEnabled, "display_name");
         when(config.isAutoBrightnessAvailable()).thenReturn(isAutoBrightnessAvailable);
 
         final DisplayPowerController dpc = new DisplayPowerController(
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayTopologyCoordinatorTest.kt b/services/tests/displayservicetests/src/com/android/server/display/DisplayTopologyCoordinatorTest.kt
new file mode 100644
index 0000000..17af633
--- /dev/null
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayTopologyCoordinatorTest.kt
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2024 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.display
+
+import android.util.DisplayMetrics
+import android.view.Display
+import android.view.DisplayInfo
+import org.junit.Before
+import org.junit.Test
+import org.mockito.ArgumentMatchers.anyDouble
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.never
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+import java.util.function.BooleanSupplier
+
+class DisplayTopologyCoordinatorTest {
+    private lateinit var coordinator: DisplayTopologyCoordinator
+    private val displayInfo = DisplayInfo()
+
+    private val mockTopology = mock<DisplayTopology>()
+    private val mockIsExtendedDisplayEnabled = mock<BooleanSupplier>()
+
+    @Before
+    fun setUp() {
+        displayInfo.displayId = 2
+        displayInfo.logicalWidth = 300
+        displayInfo.logicalHeight = 200
+        displayInfo.logicalDensityDpi = 100
+
+        val injector = object : DisplayTopologyCoordinator.Injector() {
+            override fun getTopology() = mockTopology
+        }
+        coordinator = DisplayTopologyCoordinator(injector, mockIsExtendedDisplayEnabled)
+    }
+
+    @Test
+    fun addDisplay() {
+        whenever(mockIsExtendedDisplayEnabled.asBoolean).thenReturn(true)
+
+        coordinator.onDisplayAdded(displayInfo)
+
+        val widthDp = displayInfo.logicalWidth * (DisplayMetrics.DENSITY_DEFAULT.toDouble()
+                / displayInfo.logicalDensityDpi)
+        val heightDp = displayInfo.logicalHeight * (DisplayMetrics.DENSITY_DEFAULT.toDouble()
+                / displayInfo.logicalDensityDpi)
+        verify(mockTopology).addDisplay(displayInfo.displayId, widthDp, heightDp)
+    }
+
+    @Test
+    fun addDisplay_extendedDisplaysDisabled() {
+        whenever(mockIsExtendedDisplayEnabled.asBoolean).thenReturn(false)
+
+        coordinator.onDisplayAdded(displayInfo)
+
+        verify(mockTopology, never()).addDisplay(anyInt(), anyDouble(), anyDouble())
+    }
+
+    @Test
+    fun addDisplay_notInDefaultDisplayGroup() {
+        whenever(mockIsExtendedDisplayEnabled.asBoolean).thenReturn(true)
+        displayInfo.displayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1
+
+        coordinator.onDisplayAdded(displayInfo)
+
+        verify(mockTopology, never()).addDisplay(anyInt(), anyDouble(), anyDouble())
+    }
+}
\ No newline at end of file
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayTopologyTest.kt b/services/tests/displayservicetests/src/com/android/server/display/DisplayTopologyTest.kt
new file mode 100644
index 0000000..f3a8d841
--- /dev/null
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayTopologyTest.kt
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2024 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.display
+
+import android.view.Display
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+
+class DisplayTopologyTest {
+    private val topology = DisplayTopology()
+
+    @Test
+    fun addOneDisplay() {
+        val displayId = 1
+        val width = 800.0
+        val height = 600.0
+
+        topology.addDisplay(displayId, width, height)
+
+        assertThat(topology.mPrimaryDisplayId).isEqualTo(displayId)
+
+        val display = topology.mRoot!!
+        assertThat(display.mDisplayId).isEqualTo(displayId)
+        assertThat(display.mWidth).isEqualTo(width)
+        assertThat(display.mHeight).isEqualTo(height)
+        assertThat(display.mChildren).isEmpty()
+    }
+
+    @Test
+    fun addTwoDisplays() {
+        val displayId1 = 1
+        val width1 = 800.0
+        val height1 = 600.0
+
+        val displayId2 = 2
+        val width2 = 1000.0
+        val height2 = 1500.0
+
+        topology.addDisplay(displayId1, width1, height1)
+        topology.addDisplay(displayId2, width2, height2)
+
+        assertThat(topology.mPrimaryDisplayId).isEqualTo(displayId1)
+
+        val display1 = topology.mRoot!!
+        assertThat(display1.mDisplayId).isEqualTo(displayId1)
+        assertThat(display1.mWidth).isEqualTo(width1)
+        assertThat(display1.mHeight).isEqualTo(height1)
+        assertThat(display1.mChildren).hasSize(1)
+
+        val display2 = display1.mChildren[0]
+        assertThat(display2.mDisplayId).isEqualTo(displayId2)
+        assertThat(display2.mWidth).isEqualTo(width2)
+        assertThat(display2.mHeight).isEqualTo(height2)
+        assertThat(display2.mChildren).isEmpty()
+        assertThat(display2.mPosition).isEqualTo(
+            DisplayTopology.TreeNode.Position.POSITION_TOP)
+        assertThat(display2.mOffset).isEqualTo(width1 / 2 - width2 / 2)
+    }
+
+    @Test
+    fun addManyDisplays() {
+        val displayId1 = 1
+        val width1 = 800.0
+        val height1 = 600.0
+
+        val displayId2 = 2
+        val width2 = 1000.0
+        val height2 = 1500.0
+
+        topology.addDisplay(displayId1, width1, height1)
+        topology.addDisplay(displayId2, width2, height2)
+
+        val noOfDisplays = 30
+        for (i in 3..noOfDisplays) {
+            topology.addDisplay(/* displayId= */ i, width1, height1)
+        }
+
+        assertThat(topology.mPrimaryDisplayId).isEqualTo(displayId1)
+
+        val display1 = topology.mRoot!!
+        assertThat(display1.mDisplayId).isEqualTo(displayId1)
+        assertThat(display1.mWidth).isEqualTo(width1)
+        assertThat(display1.mHeight).isEqualTo(height1)
+        assertThat(display1.mChildren).hasSize(1)
+
+        val display2 = display1.mChildren[0]
+        assertThat(display2.mDisplayId).isEqualTo(displayId2)
+        assertThat(display2.mWidth).isEqualTo(width2)
+        assertThat(display2.mHeight).isEqualTo(height2)
+        assertThat(display2.mChildren).hasSize(1)
+        assertThat(display2.mPosition).isEqualTo(
+            DisplayTopology.TreeNode.Position.POSITION_TOP)
+        assertThat(display2.mOffset).isEqualTo(width1 / 2 - width2 / 2)
+
+        var display = display2
+        for (i in 3..noOfDisplays) {
+            display = display.mChildren[0]
+            assertThat(display.mDisplayId).isEqualTo(i)
+            assertThat(display.mWidth).isEqualTo(width1)
+            assertThat(display.mHeight).isEqualTo(height1)
+            // The last display should have no children
+            assertThat(display.mChildren).hasSize(if (i < noOfDisplays) 1 else 0)
+            assertThat(display.mPosition).isEqualTo(
+                DisplayTopology.TreeNode.Position.POSITION_RIGHT)
+            assertThat(display.mOffset).isEqualTo(0)
+        }
+    }
+
+    @Test
+    fun removeDisplays() {
+        val displayId1 = 1
+        val width1 = 800.0
+        val height1 = 600.0
+
+        val displayId2 = 2
+        val width2 = 1000.0
+        val height2 = 1500.0
+
+        topology.addDisplay(displayId1, width1, height1)
+        topology.addDisplay(displayId2, width2, height2)
+
+        val noOfDisplays = 30
+        for (i in 3..noOfDisplays) {
+            topology.addDisplay(/* displayId= */ i, width1, height1)
+        }
+
+        var removedDisplays = arrayOf(20)
+        topology.removeDisplay(20)
+
+        assertThat(topology.mPrimaryDisplayId).isEqualTo(displayId1)
+
+        var display1 = topology.mRoot!!
+        assertThat(display1.mDisplayId).isEqualTo(displayId1)
+        assertThat(display1.mWidth).isEqualTo(width1)
+        assertThat(display1.mHeight).isEqualTo(height1)
+        assertThat(display1.mChildren).hasSize(1)
+
+        var display2 = display1.mChildren[0]
+        assertThat(display2.mDisplayId).isEqualTo(displayId2)
+        assertThat(display2.mWidth).isEqualTo(width2)
+        assertThat(display2.mHeight).isEqualTo(height2)
+        assertThat(display2.mChildren).hasSize(1)
+        assertThat(display2.mPosition).isEqualTo(
+            DisplayTopology.TreeNode.Position.POSITION_TOP)
+        assertThat(display2.mOffset).isEqualTo(width1 / 2 - width2 / 2)
+
+        var display = display2
+        for (i in 3..noOfDisplays) {
+            if (i in removedDisplays) {
+                continue
+            }
+            display = display.mChildren[0]
+            assertThat(display.mDisplayId).isEqualTo(i)
+            assertThat(display.mWidth).isEqualTo(width1)
+            assertThat(display.mHeight).isEqualTo(height1)
+            // The last display should have no children
+            assertThat(display.mChildren).hasSize(if (i < noOfDisplays) 1 else 0)
+            assertThat(display.mPosition).isEqualTo(
+                DisplayTopology.TreeNode.Position.POSITION_RIGHT)
+            assertThat(display.mOffset).isEqualTo(0)
+        }
+
+        topology.removeDisplay(22)
+        removedDisplays += 22
+        topology.removeDisplay(23)
+        removedDisplays += 23
+        topology.removeDisplay(25)
+        removedDisplays += 25
+
+        assertThat(topology.mPrimaryDisplayId).isEqualTo(displayId1)
+
+        display1 = topology.mRoot!!
+        assertThat(display1.mDisplayId).isEqualTo(displayId1)
+        assertThat(display1.mWidth).isEqualTo(width1)
+        assertThat(display1.mHeight).isEqualTo(height1)
+        assertThat(display1.mChildren).hasSize(1)
+
+        display2 = display1.mChildren[0]
+        assertThat(display2.mDisplayId).isEqualTo(displayId2)
+        assertThat(display2.mWidth).isEqualTo(width2)
+        assertThat(display2.mHeight).isEqualTo(height2)
+        assertThat(display2.mChildren).hasSize(1)
+        assertThat(display2.mPosition).isEqualTo(
+            DisplayTopology.TreeNode.Position.POSITION_TOP)
+        assertThat(display2.mOffset).isEqualTo(width1 / 2 - width2 / 2)
+
+        display = display2
+        for (i in 3..noOfDisplays) {
+            if (i in removedDisplays) {
+                continue
+            }
+            display = display.mChildren[0]
+            assertThat(display.mDisplayId).isEqualTo(i)
+            assertThat(display.mWidth).isEqualTo(width1)
+            assertThat(display.mHeight).isEqualTo(height1)
+            // The last display should have no children
+            assertThat(display.mChildren).hasSize(if (i < noOfDisplays) 1 else 0)
+            assertThat(display.mPosition).isEqualTo(
+                DisplayTopology.TreeNode.Position.POSITION_RIGHT)
+            assertThat(display.mOffset).isEqualTo(0)
+        }
+    }
+
+    @Test
+    fun removeAllDisplays() {
+        val displayId = 1
+        val width = 800.0
+        val height = 600.0
+
+        topology.addDisplay(displayId, width, height)
+        topology.removeDisplay(displayId)
+
+        assertThat(topology.mPrimaryDisplayId).isEqualTo(Display.INVALID_DISPLAY)
+        assertThat(topology.mRoot).isNull()
+    }
+
+    @Test
+    fun removeDisplayThatDoesNotExist() {
+        val displayId = 1
+        val width = 800.0
+        val height = 600.0
+
+        topology.addDisplay(displayId, width, height)
+        topology.removeDisplay(3)
+
+        assertThat(topology.mPrimaryDisplayId).isEqualTo(displayId)
+
+        val display = topology.mRoot!!
+        assertThat(display.mDisplayId).isEqualTo(displayId)
+        assertThat(display.mWidth).isEqualTo(width)
+        assertThat(display.mHeight).isEqualTo(height)
+        assertThat(display.mChildren).isEmpty()
+    }
+}
\ No newline at end of file
diff --git a/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
index 120cc84..f5bed99 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
@@ -29,8 +29,10 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyFloat;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
@@ -45,6 +47,7 @@
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Looper;
+import android.util.Spline;
 import android.view.Display;
 import android.view.DisplayAddress;
 import android.view.SurfaceControl;
@@ -59,6 +62,7 @@
 import com.android.internal.R;
 import com.android.server.LocalServices;
 import com.android.server.display.LocalDisplayAdapter.BacklightAdapter;
+import com.android.server.display.color.ColorDisplayService;
 import com.android.server.display.feature.DisplayManagerFlags;
 import com.android.server.display.mode.DisplayModeDirector;
 import com.android.server.display.notifications.DisplayNotificationManager;
@@ -119,6 +123,8 @@
     private DisplayManagerFlags mFlags;
     @Mock
     private DisplayPowerController mMockedDisplayPowerController;
+    @Mock
+    private ColorDisplayService.ColorDisplayServiceInternal mMockedColorDisplayServiceInternal;
 
     private Handler mHandler;
 
@@ -133,6 +139,11 @@
     private Injector mInjector;
 
     @Mock
+    private DisplayDeviceConfig mMockDisplayDeviceConfig;
+    @Mock
+    private BacklightAdapter mMockBacklightAdapter;
+
+    @Mock
     private LocalDisplayAdapter.SurfaceControlProxy mSurfaceControlProxy;
     private static final float[] DISPLAY_RANGE_NITS = { 2.685f, 478.5f };
     private static final int[] BACKLIGHT_RANGE = { 1, 255 };
@@ -150,6 +161,9 @@
         doReturn(mMockedResources).when(mMockedContext).getResources();
         LocalServices.removeServiceForTest(LightsManager.class);
         LocalServices.addService(LightsManager.class, mMockedLightsManager);
+        LocalServices.removeServiceForTest(ColorDisplayService.ColorDisplayServiceInternal.class);
+        LocalServices.addService(ColorDisplayService.ColorDisplayServiceInternal.class,
+                mMockedColorDisplayServiceInternal);
         mInjector = new Injector();
         when(mSurfaceControlProxy.getBootDisplayModeSupport()).thenReturn(true);
         mAdapter = new LocalDisplayAdapter(mMockedSyncRoot, mMockedContext, mHandler,
@@ -211,7 +225,15 @@
         when(mMockedResources.getIntArray(
                 com.android.internal.R.array.config_autoBrightnessLcdBacklightValues))
                 .thenReturn(new int[]{});
+
+        when(mMockedColorDisplayServiceInternal.fetchEvenDimmerSpline(3)).thenReturn(
+                new Spline.LinearSpline(
+                        new float[]{2f, 3.0f, 500f, 2000f},
+                        new float[]{100, 0, 0, 0}));
+        when(mMockDisplayDeviceConfig.isEvenDimmerAvailable()).thenReturn(true);
+
         doReturn(true).when(mFlags).isDisplayOffloadEnabled();
+        doReturn(true).when(mFlags).isEvenDimmerEnabled();
         initDisplayOffloadSession();
     }
 
@@ -222,6 +244,122 @@
         }
     }
 
+    @Test
+    public void testEvenDimmer() throws InterruptedException {
+        // Set up
+        FakeDisplay display = new FakeDisplay(PORT_A);
+        setUpDisplay(display);
+        updateAvailableDisplays();
+        mAdapter.registerLocked();
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        assertThat(mListener.addedDisplays.size()).isEqualTo(1);
+        DisplayDevice displayDevice = mListener.addedDisplays.get(0);
+
+        // brightness|backlight| nits | strength
+        //  0.5      |   0.45  | 600  |  0     // initial setup value
+        //  0.4      |   0.35  | 500  |  0     // normal range value
+        //  0.31     |   0.2   |   3  |  0     // transition point
+        //  0.16     |  0.125  | 2.5  |  50    // mid point of even dimmer
+        //  0.1      |   0.05  |   2  |  100   // bottom of even dimmer range
+        //  0.05     |   0.01  |   1  |  100+ // beyond strength=100 range (should still return 100)
+        when(mMockDisplayDeviceConfig.getEvenDimmerTransitionPoint()).thenReturn(0.31f);
+        when(mMockDisplayDeviceConfig.getBacklightFromBrightness(0.5f)).thenReturn(0.45f);
+        when(mMockDisplayDeviceConfig.getBacklightFromBrightness(0.4f)).thenReturn(0.35f);
+        when(mMockDisplayDeviceConfig.getBacklightFromBrightness(0.31f)).thenReturn(0.2f);
+        when(mMockDisplayDeviceConfig.getBacklightFromBrightness(0.16f)).thenReturn(0.125f);
+        when(mMockDisplayDeviceConfig.getBacklightFromBrightness(0.1f)).thenReturn(0.05f);
+        when(mMockDisplayDeviceConfig.getBacklightFromBrightness(0.05f)).thenReturn(0.01f);
+        when(mMockDisplayDeviceConfig.getNitsFromBacklight(0.45f)).thenReturn(600f);
+        when(mMockDisplayDeviceConfig.getNitsFromBacklight(0.35f)).thenReturn(500f);
+        when(mMockDisplayDeviceConfig.getNitsFromBacklight(0.2f)).thenReturn(3f);
+        when(mMockDisplayDeviceConfig.getNitsFromBacklight(0.125f)).thenReturn(2.5f);
+        when(mMockDisplayDeviceConfig.getNitsFromBacklight(0.05f)).thenReturn(2f);
+        when(mMockDisplayDeviceConfig.getNitsFromBacklight(0.01f)).thenReturn(1f);
+
+        // initialise brightness to 0.5
+        Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON,
+                0.5f, 0.5f, null);
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        changeStateRunnable.run();
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        verify(mSurfaceControlProxy).setDisplayPowerMode(any(), anyInt());
+        verify(mMockBacklightAdapter).setBacklight(anyFloat(), anyFloat(), anyFloat(), anyFloat());
+        verify(mMockedColorDisplayServiceInternal).applyEvenDimmerColorChanges(eq(false), eq(0));
+        verify(mMockedColorDisplayServiceInternal).fetchEvenDimmerSpline(eq(3.0f));
+
+        // set up normal brightness range
+        changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0.4f, 0.4f,
+                null);
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        changeStateRunnable.run();
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        // verify normal brightness range
+        verify(mMockBacklightAdapter).setBacklight(0.35f, 500f, 0.35f, 500f);
+        verify(mMockedColorDisplayServiceInternal,
+                times(1)) // no more, since the strength is the same
+                .applyEvenDimmerColorChanges(eq(false), eq(0));
+        verify(mMockedColorDisplayServiceInternal, times(2)).fetchEvenDimmerSpline(eq(3.0f));
+
+        // set up even dimmer edge range
+        changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0.31f,
+                0.31f, null);
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        changeStateRunnable.run();
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        // verify even dimmer edge range
+        verify(mMockBacklightAdapter).setBacklight(0.2f, 3f, 0.2f, 3f);
+        // verify no more times, since the strength and enabled-ness is the same
+        verify(mMockedColorDisplayServiceInternal, times(1)).applyEvenDimmerColorChanges(eq(false),
+                eq(0));
+        verify(mMockedColorDisplayServiceInternal, times(3)).fetchEvenDimmerSpline(eq(3.0f));
+
+        // set up mid point of even dimmer range
+        changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0.16f,
+                0.16f, null);
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        changeStateRunnable.run();
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        // verify within even dimmer range
+        verify(mMockBacklightAdapter).setBacklight(0.125f, 2.5f, 0.125f, 2.5f);
+        verify(mMockedColorDisplayServiceInternal).applyEvenDimmerColorChanges(eq(true), eq(50));
+        verify(mMockedColorDisplayServiceInternal, times(4)).fetchEvenDimmerSpline(eq(3.0f));
+
+        // set up within even dimmer range
+        changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0.1f, 0.1f,
+                null);
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        changeStateRunnable.run();
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        // verify within even dimmer range
+        verify(mMockBacklightAdapter).setBacklight(0.05f, 2f, 0.05f, 2f);
+        verify(mMockedColorDisplayServiceInternal).applyEvenDimmerColorChanges(eq(true), eq(100));
+        verify(mMockedColorDisplayServiceInternal, times(5)).fetchEvenDimmerSpline(eq(3.0f));
+
+        // set up below even dimmer range
+        changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0.05f,
+                0.05f, null);
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        changeStateRunnable.run();
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        // verify within even dimmer range
+        verify(mMockBacklightAdapter).setBacklight(0.01f, 1f, 0.01f, 1f);
+        // ensure no greater than 100 strength is returned, therefore not called again.
+        verify(mMockedColorDisplayServiceInternal).applyEvenDimmerColorChanges(eq(true), eq(100));
+        verify(mMockedColorDisplayServiceInternal, times(6)).fetchEvenDimmerSpline(eq(3.0f));
+
+        // set up return to normal range
+        changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0.4f, 0.4f,
+                null);
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        changeStateRunnable.run();
+        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+        // verify return to normal range
+        verify(mMockBacklightAdapter, times(2)).setBacklight(0.35f, 500f, 0.35f, 500f);
+        verify(mMockedColorDisplayServiceInternal, times(2)).applyEvenDimmerColorChanges(eq(false),
+                anyInt());
+        verify(mMockedColorDisplayServiceInternal, times(7)).fetchEvenDimmerSpline(eq(3.0f));
+    }
+
     /**
      * Confirm that display is marked as private when it is listed in
      * com.android.internal.R.array.config_localPrivateDisplayPorts.
@@ -1461,15 +1599,16 @@
             return mSurfaceControlProxy;
         }
 
-        // Instead of using DisplayDeviceConfig.create(context, physicalDisplayId, isFirstDisplay)
-        // we should use DisplayDeviceConfig.create(context, isFirstDisplay) for the test to ensure
-        // that real device DisplayDeviceConfig is not loaded for FakeDisplay and we are getting
-        // consistent behaviour. Please also note that context passed to this method, is
-        // mMockContext and values will be loaded from mMockResources.
         @Override
         public DisplayDeviceConfig createDisplayDeviceConfig(Context context,
                 long physicalDisplayId, boolean isFirstDisplay, DisplayManagerFlags flags) {
-            return DisplayDeviceConfig.create(context, isFirstDisplay, flags);
+            return mMockDisplayDeviceConfig;
+        }
+
+        @Override
+        public BacklightAdapter getBacklightAdapter(IBinder displayToken, boolean isFirstDisplay,
+                LocalDisplayAdapter.SurfaceControlProxy surfaceControlProxy) {
+            return mMockBacklightAdapter;
         }
     }
 
diff --git a/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java b/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java
index 81e6cc3..3ac7fb0 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java
@@ -21,71 +21,104 @@
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.when;
 
-import android.content.Context;
 import android.hardware.display.IVirtualDisplayCallback;
 import android.hardware.display.VirtualDisplayConfig;
+import android.media.projection.IMediaProjection;
 import android.os.IBinder;
 import android.os.Process;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.testing.TestableContext;
+import android.view.Surface;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
 
+import com.android.internal.R;
 import com.android.server.display.feature.DisplayManagerFlags;
 import com.android.server.testutils.TestHandler;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 public class VirtualDisplayAdapterTest {
 
-    @Mock
-    Context mContextMock;
+    private static final int MAX_DEVICES = 3;
+    private static final int MAX_DEVICES_PER_PACKAGE = 2;
+
+    @Rule
+    public final TestableContext mContext = new TestableContext(
+            InstrumentationRegistry.getInstrumentation().getContext());
 
     @Mock
-    VirtualDisplayAdapter.SurfaceControlDisplayFactory mMockSufaceControlDisplayFactory;
+    private VirtualDisplayAdapter.SurfaceControlDisplayFactory mMockSufaceControlDisplayFactory;
 
     @Mock
-    DisplayAdapter.Listener mMockListener;
+    private DisplayAdapter.Listener mMockListener;
 
     @Mock
-    IVirtualDisplayCallback mMockCallback;
+    private IVirtualDisplayCallback mMockCallback;
 
     @Mock
-    IBinder mMockBinder;
+    private IBinder mMockBinder;
+
+    @Mock
+    private IMediaProjection mMediaProjectionMock;
+
+    @Mock
+    private Surface mSurfaceMock;
+
+    @Mock
+    private VirtualDisplayConfig mVirtualDisplayConfigMock;
 
     private TestHandler mHandler;
 
-    private VirtualDisplayAdapter mVirtualDisplayAdapter;
-
     @Mock
     private DisplayManagerFlags mFeatureFlags;
 
+    private VirtualDisplayAdapter mAdapter;
+
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+
+        mContext.getOrCreateTestableResources().addOverride(R.integer.config_virtualDisplayLimit,
+                MAX_DEVICES);
+        mContext.getOrCreateTestableResources().addOverride(
+                R.integer.config_virtualDisplayLimitPerPackage, MAX_DEVICES_PER_PACKAGE);
+
         mHandler = new TestHandler(null);
-        mVirtualDisplayAdapter = new VirtualDisplayAdapter(new DisplayManagerService.SyncRoot(),
-                mContextMock, mHandler, mMockListener, mMockSufaceControlDisplayFactory,
-                mFeatureFlags);
+        mAdapter = new VirtualDisplayAdapter(new DisplayManagerService.SyncRoot(), mContext,
+                mHandler, mMockListener, mMockSufaceControlDisplayFactory, mFeatureFlags);
 
         when(mMockCallback.asBinder()).thenReturn(mMockBinder);
     }
 
     @Test
-    public void testCreatesVirtualDisplay() {
+    public void testCreateAndReleaseVirtualDisplay() {
         VirtualDisplayConfig config = new VirtualDisplayConfig.Builder("test", /* width= */ 1,
                 /* height= */ 1, /* densityDpi= */ 1).build();
+        int ownerUid = 10;
 
-        DisplayDevice result = mVirtualDisplayAdapter.createVirtualDisplayLocked(mMockCallback,
-                /* projection= */ null, /* ownerUid= */ 10, /* packageName= */ "testpackage",
+        DisplayDevice result = mAdapter.createVirtualDisplayLocked(mMockCallback,
+                /* projection= */ null, ownerUid, /* packageName= */ "testpackage",
                 /* uniqueId= */ "uniqueId", /* surface= */ null, /* flags= */ 0, config);
+        assertNotNull(result);
 
+        result = mAdapter.releaseVirtualDisplayLocked(mMockBinder, ownerUid);
         assertNotNull(result);
     }
 
@@ -98,7 +131,7 @@
         final String displayUniqueId = VirtualDisplayAdapter.generateDisplayUniqueId(
                 packageName, Process.myUid(), config);
 
-        DisplayDevice result = mVirtualDisplayAdapter.createVirtualDisplayLocked(
+        DisplayDevice result = mAdapter.createVirtualDisplayLocked(
                 mMockCallback, /* projection= */ null, /* ownerUid= */ 10,
                 packageName, displayUniqueId, /* surface= */ null, /* flags= */ 0, config);
 
@@ -114,14 +147,194 @@
                 /* height= */ 1, /* densityDpi= */ 1).build();
         VirtualDisplayConfig config2 = new VirtualDisplayConfig.Builder("test2", /* width= */ 1,
                 /* height= */ 1, /* densityDpi= */ 1).build();
-        mVirtualDisplayAdapter.createVirtualDisplayLocked(mMockCallback, /* projection= */ null,
-                /* ownerUid= */ 10, /* packageName= */ "testpackage", /* uniqueId= */ "uniqueId1",
-                /* surface= */ null, /* flags= */ 0, config1);
 
-        DisplayDevice result = mVirtualDisplayAdapter.createVirtualDisplayLocked(mMockCallback,
+        DisplayDevice result = mAdapter.createVirtualDisplayLocked(mMockCallback,
+                /* projection= */ null, /* ownerUid= */ 10, /* packageName= */ "testpackage",
+                /* uniqueId= */ "uniqueId1", /* surface= */ null, /* flags= */ 0, config1);
+        assertNotNull(result);
+
+        result = mAdapter.createVirtualDisplayLocked(mMockCallback,
                 /* projection= */ null, /* ownerUid= */ 10, /* packageName= */ "testpackage",
                 /* uniqueId= */ "uniqueId2", /* surface= */ null, /* flags= */ 0, config2);
-
         assertNull(result);
     }
+
+    @Test
+    public void testCreateManyVirtualDisplays_LimitFlagDisabled() {
+        when(mFeatureFlags.isVirtualDisplayLimitEnabled()).thenReturn(false);
+
+        // Displays for the same package
+        for (int i = 0; i < MAX_DEVICES_PER_PACKAGE * 2; i++) {
+            // Same owner UID
+            IVirtualDisplayCallback callback = createCallback();
+            DisplayDevice device = mAdapter.createVirtualDisplayLocked(callback,
+                    mMediaProjectionMock, 1234, "test.package", "123",
+                    mSurfaceMock, /* flags= */ 0, mVirtualDisplayConfigMock);
+            assertNotNull(device);
+        }
+
+        // Displays for different packages
+        for (int i = 0; i < MAX_DEVICES * 2; i++) {
+            // Same owner UID
+            IVirtualDisplayCallback callback = createCallback();
+            DisplayDevice device = mAdapter.createVirtualDisplayLocked(callback,
+                    mMediaProjectionMock, 1234 + i, "test.package", "123",
+                    mSurfaceMock, /* flags= */ 0, mVirtualDisplayConfigMock);
+            assertNotNull(device);
+        }
+    }
+
+    @Test
+    public void testCreateVirtualDisplay_MaxDisplaysPerPackage() {
+        when(mFeatureFlags.isVirtualDisplayLimitEnabled()).thenReturn(true);
+        List<IVirtualDisplayCallback> callbacks = new ArrayList<>();
+        int ownerUid = 1234;
+
+        for (int i = 0; i < MAX_DEVICES_PER_PACKAGE * 2; i++) {
+            // Same owner UID
+            IVirtualDisplayCallback callback = createCallback();
+            DisplayDevice device = mAdapter.createVirtualDisplayLocked(callback,
+                    mMediaProjectionMock, ownerUid, "test.package", "123",
+                    mSurfaceMock, /* flags= */ 0, mVirtualDisplayConfigMock);
+            if (i < MAX_DEVICES_PER_PACKAGE) {
+                assertNotNull(device);
+                callbacks.add(callback);
+            } else {
+                assertNull(device);
+            }
+        }
+
+        // Release one display
+        DisplayDevice device = mAdapter.releaseVirtualDisplayLocked(callbacks.get(0).asBinder(),
+                ownerUid);
+        assertNotNull(device);
+        callbacks.remove(0);
+
+        // We should be able to create another display
+        IVirtualDisplayCallback callback = createCallback();
+        device = mAdapter.createVirtualDisplayLocked(callback, mMediaProjectionMock, ownerUid,
+                "test.package", "123", mSurfaceMock, /* flags= */ 0,
+                mVirtualDisplayConfigMock);
+        assertNotNull(device);
+        callbacks.add(callback);
+
+        // But only one
+        callback = createCallback();
+        device = mAdapter.createVirtualDisplayLocked(callback, mMediaProjectionMock, ownerUid,
+                "test.package", "123", mSurfaceMock, /* flags= */ 0,
+                mVirtualDisplayConfigMock);
+        assertNull(device);
+
+        // Release all the displays
+        for (IVirtualDisplayCallback cb : callbacks) {
+            device = mAdapter.releaseVirtualDisplayLocked(cb.asBinder(), ownerUid);
+            assertNotNull(device);
+        }
+        callbacks.clear();
+
+        // We should be able to create the max number of displays again
+        for (int i = 0; i < MAX_DEVICES_PER_PACKAGE * 2; i++) {
+            // Same owner UID
+            callback = createCallback();
+            device = mAdapter.createVirtualDisplayLocked(callback, mMediaProjectionMock, ownerUid,
+                    "test.package", "123", mSurfaceMock, /* flags= */ 0,
+                    mVirtualDisplayConfigMock);
+            if (i < MAX_DEVICES_PER_PACKAGE) {
+                assertNotNull(device);
+                callbacks.add(callback);
+            } else {
+                assertNull(device);
+            }
+        }
+
+        // We should be able to create a display for a different package
+        callback = createCallback();
+        device = mAdapter.createVirtualDisplayLocked(callback, mMediaProjectionMock, ownerUid + 1,
+                "test.package", "123", mSurfaceMock, /* flags= */ 0,
+                mVirtualDisplayConfigMock);
+        assertNotNull(device);
+        callbacks.add(callback);
+    }
+
+    @Test
+    public void testCreateVirtualDisplay_MaxDisplays() {
+        when(mFeatureFlags.isVirtualDisplayLimitEnabled()).thenReturn(true);
+        List<IVirtualDisplayCallback> callbacks = new ArrayList<>();
+        int firstOwnerUid = 1000;
+
+        for (int i = 0; i < MAX_DEVICES * 2; i++) {
+            // Different owner UID
+            IVirtualDisplayCallback callback = createCallback();
+            DisplayDevice device = mAdapter.createVirtualDisplayLocked(callback,
+                    mMediaProjectionMock, firstOwnerUid + i, "test.package",
+                    "123", mSurfaceMock, /* flags= */ 0, mVirtualDisplayConfigMock);
+            if (i < MAX_DEVICES) {
+                assertNotNull(device);
+                callbacks.add(callback);
+            } else {
+                assertNull(device);
+            }
+        }
+
+        // Release one display
+        DisplayDevice device = mAdapter.releaseVirtualDisplayLocked(callbacks.get(0).asBinder(),
+                firstOwnerUid);
+        assertNotNull(device);
+        callbacks.remove(0);
+
+        // We should be able to create another display
+        IVirtualDisplayCallback callback = createCallback();
+        device = mAdapter.createVirtualDisplayLocked(callback, mMediaProjectionMock,
+                firstOwnerUid, "test.package", "123", mSurfaceMock, /* flags= */ 0,
+                mVirtualDisplayConfigMock);
+        assertNotNull(device);
+        callbacks.add(callback);
+
+        // But only one
+        callback = createCallback();
+        device = mAdapter.createVirtualDisplayLocked(callback, mMediaProjectionMock,
+                firstOwnerUid, "test.package", "123", mSurfaceMock, /* flags= */ 0,
+                mVirtualDisplayConfigMock);
+        assertNull(device);
+
+        // Release all the displays
+        for (int i = 0; i < callbacks.size(); i++) {
+            device = mAdapter.releaseVirtualDisplayLocked(callbacks.get(i).asBinder(),
+                    firstOwnerUid + i);
+            assertNotNull(device);
+        }
+        callbacks.clear();
+
+        // We should be able to create the max number of displays again
+        for (int i = 0; i < MAX_DEVICES * 2; i++) {
+            // Different owner UID
+            callback = createCallback();
+            device = mAdapter.createVirtualDisplayLocked(callback, mMediaProjectionMock,
+                    firstOwnerUid + i, "test.package", "123", mSurfaceMock,
+                    /* flags= */ 0, mVirtualDisplayConfigMock);
+            if (i < MAX_DEVICES) {
+                assertNotNull(device);
+                callbacks.add(callback);
+            } else {
+                assertNull(device);
+            }
+        }
+    }
+
+    private IVirtualDisplayCallback createCallback() {
+        return new IVirtualDisplayCallback.Stub() {
+
+            @Override
+            public void onPaused() {
+            }
+
+            @Override
+            public void onResumed() {
+            }
+
+            @Override
+            public void onStopped() {
+            }
+        };
+    }
 }
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java
index 809e13c..6ccc037 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -29,6 +29,7 @@
 import static android.app.ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND;
 import static android.app.ActivityManager.PROCESS_STATE_UNKNOWN;
 import static android.content.ContentResolver.SCHEME_CONTENT;
+import static android.content.Intent.FILL_IN_ACTION;
 import static android.os.PowerExemptionManager.REASON_DENIED;
 import static android.os.UserHandle.USER_ALL;
 import static android.util.DebugUtils.valueToString;
@@ -1300,6 +1301,45 @@
                 .containsExactly(new Pair<>(USER_ID, 42));
     }
 
+    @Test
+    @RequiresFlagsEnabled(android.security.Flags.FLAG_PREVENT_INTENT_REDIRECT)
+    public void testAddCreatorToken() {
+        Intent intent = new Intent();
+        Intent extraIntent = new Intent("EXTRA_INTENT_ACTION");
+        intent.putExtra("EXTRA_INTENT0", extraIntent);
+
+        intent.collectExtraIntentKeys();
+        mAms.addCreatorToken(intent);
+
+        ActivityManagerService.IntentCreatorToken token =
+                (ActivityManagerService.IntentCreatorToken) extraIntent.getCreatorToken();
+        assertThat(token).isNotNull();
+        assertThat(token.getCreatorUid()).isEqualTo(mInjector.getCallingUid());
+    }
+
+    @Test
+    @RequiresFlagsEnabled(android.security.Flags.FLAG_PREVENT_INTENT_REDIRECT)
+    public void testAddCreatorTokenForFillingIntent() {
+        Intent intent = new Intent();
+        Intent extraIntent = new Intent("EXTRA_INTENT_ACTION");
+        intent.putExtra("EXTRA_INTENT0", extraIntent);
+        Intent fillinIntent = new Intent();
+        Intent fillinExtraIntent = new Intent("FILLIN_EXTRA_INTENT_ACTION");
+        fillinIntent.putExtra("FILLIN_EXTRA_INTENT0", fillinExtraIntent);
+
+        fillinIntent.collectExtraIntentKeys();
+        intent.fillIn(fillinIntent, FILL_IN_ACTION);
+
+        mAms.addCreatorToken(fillinIntent);
+
+        fillinExtraIntent = intent.getParcelableExtra("FILLIN_EXTRA_INTENT0", Intent.class);
+
+        ActivityManagerService.IntentCreatorToken token =
+                (ActivityManagerService.IntentCreatorToken) fillinExtraIntent.getCreatorToken();
+        assertThat(token).isNotNull();
+        assertThat(token.getCreatorUid()).isEqualTo(mInjector.getCallingUid());
+    }
+
     private void verifyWaitingForNetworkStateUpdate(long curProcStateSeq,
             long lastNetworkUpdatedProcStateSeq,
             final long procStateSeqToWait, boolean expectWait) throws Exception {
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ApplicationStartInfoTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ApplicationStartInfoTest.java
index e863f15..e678acc 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/ApplicationStartInfoTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/ApplicationStartInfoTest.java
@@ -39,6 +39,7 @@
 import android.os.FileUtils;
 import android.os.Handler;
 import android.os.HandlerThread;
+import android.os.Parcel;
 import android.os.Process;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.annotations.Presubmit;
@@ -580,6 +581,50 @@
         assertTrue(mAppStartInfoTracker.mMonotonicClock.monotonicTime() >= originalMonotonicTime);
     }
 
+    /**
+     * Test to confirm that parcel read and write implementations match, correctly loading records
+     * with the same values and leaving no data unread.
+     */
+    @Test
+    public void testParcelReadWriteMatch() throws Exception {
+        // Create a start info records with all fields set.
+        ApplicationStartInfo startInfo = new ApplicationStartInfo(1234L);
+        startInfo.setPid(123);
+        startInfo.setRealUid(987);
+        startInfo.setPackageUid(654);
+        startInfo.setDefiningUid(321);
+        startInfo.setReason(ApplicationStartInfo.START_REASON_LAUNCHER);
+        startInfo.setStartupState(ApplicationStartInfo.STARTUP_STATE_FIRST_FRAME_DRAWN);
+        startInfo.setStartType(ApplicationStartInfo.START_TYPE_WARM);
+        startInfo.setLaunchMode(ApplicationStartInfo.LAUNCH_MODE_SINGLE_TOP);
+        startInfo.setPackageName(APP_1_PACKAGE_NAME);
+        startInfo.setProcessName(APP_1_PROCESS_NAME);
+        startInfo.addStartupTimestamp(ApplicationStartInfo.START_TIMESTAMP_LAUNCH, 999L);
+        startInfo.addStartupTimestamp(ApplicationStartInfo.START_TIMESTAMP_FIRST_FRAME, 888L);
+        startInfo.setForceStopped(true);
+        startInfo.setStartComponent(ApplicationStartInfo.START_COMPONENT_OTHER);
+        startInfo.setIntent(buildIntent(COMPONENT));
+
+        // Write the start info to a parcel.
+        Parcel parcel = Parcel.obtain();
+        startInfo.writeToParcel(parcel, 0 /* flags */);
+
+        // Set the data position back to 0 so it's ready to be read.
+        parcel.setDataPosition(0);
+
+        // Now load the record from the parcel.
+        ApplicationStartInfo startInfoFromParcel = new ApplicationStartInfo(parcel);
+
+        // Make sure there is no unread data remaining in the parcel, and confirm that the loaded
+        // start info object is equal to the one it was written from. Check dataAvail first as if
+        // that check fails then the next check will fail too, but knowing the status of this check
+        // will tell us that we're missing a read or write. Check the objects are equals second as
+        // if the avail check passes and equals fails, then we know we're reading all the data just
+        // not to the correct fields.
+        assertEquals(0, parcel.dataAvail());
+        assertTrue(startInfo.equals(startInfoFromParcel));
+    }
+
     private static <T> void setFieldValue(Class clazz, Object obj, String fieldName, T val) {
         try {
             Field field = clazz.getDeclaredField(fieldName);
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/ApexManagerTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/ApexManagerTest.java
index d08cdc7..769f071 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/ApexManagerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/ApexManagerTest.java
@@ -265,19 +265,19 @@
     }
 
     @Test
-    public void testSubmitStagedSession_throwRunTimeException() throws RemoteException {
+    public void testSubmitStagedSession_throwPackageManagerExceptionOnRemoteException()
+             throws RemoteException {
         doThrow(RemoteException.class).when(mApexService).submitStagedSession(any(), any());
 
-        assertThrows(RuntimeException.class,
+        assertThrows(PackageManagerException.class,
                 () -> mApexManager.submitStagedSession(testParamsWithChildren()));
     }
 
     @Test
-    public void testGetStagedApexInfos_throwRunTimeException() throws RemoteException {
+    public void testGetStagedApexInfos_returnsEmptyOnRemoteException() throws RemoteException {
         doThrow(RemoteException.class).when(mApexService).getStagedApexInfos(any());
 
-        assertThrows(RuntimeException.class,
-                () -> mApexManager.getStagedApexInfos(testParamsWithChildren()));
+        assertThat(mApexManager.getStagedApexInfos(testParamsWithChildren())).hasLength(0);
     }
 
     @Test
@@ -298,10 +298,11 @@
     }
 
     @Test
-    public void testMarkStagedSessionReady_throwRunTimeException() throws RemoteException {
+    public void testMarkStagedSessionReady_throwPackageManagerExceptionOnRemoteException()
+            throws RemoteException {
         doThrow(RemoteException.class).when(mApexService).markStagedSessionReady(anyInt());
 
-        assertThrows(RuntimeException.class,
+        assertThrows(PackageManagerException.class,
                 () -> mApexManager.markStagedSessionReady(TEST_SESSION_ID));
     }
 
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/OWNERS b/services/tests/mockingservicestests/src/com/android/server/pm/OWNERS
index 5181af1..aa22790 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/OWNERS
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/OWNERS
@@ -2,3 +2,4 @@
 
 per-file BackgroundDexOptServiceUnitTest.java = file:/services/core/java/com/android/server/pm/dex/OWNERS
 per-file StagingManagerTest.java = dariofreni@google.com, ioffe@google.com, olilan@google.com
+per-file ApexManagerTest.java = dariofreni@google.com, ioffe@google.com, olilan@google.com
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/PackageMonitorCallbackHelperTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/PackageMonitorCallbackHelperTest.java
index 24e7242..54ee2a3 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/PackageMonitorCallbackHelperTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/PackageMonitorCallbackHelperTest.java
@@ -33,6 +33,7 @@
 import android.os.IRemoteCallback;
 import android.os.Looper;
 import android.os.Process;
+import android.os.UserHandle;
 import android.util.SparseArray;
 
 import org.junit.After;
@@ -340,6 +341,24 @@
         verify(callback, after(WAIT_CALLBACK_CALLED_IN_MS).times(1)).sendResult(any());
     }
 
+    @Test
+    public void registerPackageMonitor_callbackNotInAllowListSystemUidSecondUser_callbackIsCalled()
+            throws Exception {
+        IRemoteCallback callback = createMockPackageMonitorCallback();
+        int userId = 10;
+        int fakeAppId = 12345;
+        SparseArray<int[]> broadcastAllowList = new SparseArray<>();
+        broadcastAllowList.put(userId, new int[]{UserHandle.getUid(userId, fakeAppId)});
+
+        mPackageMonitorCallbackHelper.registerPackageMonitorCallback(callback, userId,
+                UserHandle.getUid(userId, Process.SYSTEM_UID));
+        mPackageMonitorCallbackHelper.notifyPackageMonitor(Intent.ACTION_PACKAGE_ADDED,
+                FAKE_PACKAGE_NAME, createFakeBundle(), new int[]{userId},
+                null /* instantUserIds */, broadcastAllowList, mHandler, null /* filterExtras */);
+
+        verify(callback, after(WAIT_CALLBACK_CALLED_IN_MS).times(1)).sendResult(any());
+    }
+
     private IRemoteCallback createMockPackageMonitorCallback() {
         return spy(new IRemoteCallback.Stub() {
             @Override
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/StagingManagerTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/StagingManagerTest.java
index 6f9b8df..39acd8d 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/StagingManagerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/StagingManagerTest.java
@@ -756,7 +756,8 @@
                 /* isApplied */false,
                 /* stagedSessionErrorCode */ PackageManager.INSTALL_UNKNOWN,
                 /* stagedSessionErrorMessage */ "no error",
-                /* preVerifiedDomains */ null);
+                /* preVerifiedDomains */ null,
+                /* verifierController */ null);
 
         StagingManager.StagedSession stagedSession = spy(session.mStagedSession);
         doReturn(packageName).when(stagedSession).getPackageName();
diff --git a/services/tests/powerservicetests/src/com/android/server/power/LowPowerStandbyControllerTest.java b/services/tests/powerservicetests/src/com/android/server/power/LowPowerStandbyControllerTest.java
index 0e815d0..3e731a3 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/LowPowerStandbyControllerTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/LowPowerStandbyControllerTest.java
@@ -163,6 +163,7 @@
         addLocalServiceMock(ActivityManagerInternal.class, mActivityManagerInternalMock);
 
         when(mIPowerManagerMock.isInteractive()).thenReturn(true);
+        when(mIPowerManagerMock.isDisplayInteractive(anyInt())).thenReturn(true);
 
         when(mDeviceConfigWrapperMock.enableCustomPolicy()).thenReturn(true);
         when(mDeviceConfigWrapperMock.enableStandbyPorts()).thenReturn(true);
@@ -899,11 +900,13 @@
 
     private void setInteractive() throws Exception {
         when(mIPowerManagerMock.isInteractive()).thenReturn(true);
+        when(mIPowerManagerMock.isDisplayInteractive(anyInt())).thenReturn(true);
         mContextSpy.sendBroadcast(new Intent(Intent.ACTION_SCREEN_ON));
     }
 
     private void setNonInteractive() throws Exception {
         when(mIPowerManagerMock.isInteractive()).thenReturn(false);
+        when(mIPowerManagerMock.isDisplayInteractive(anyInt())).thenReturn(false);
         mContextSpy.sendBroadcast(new Intent(Intent.ACTION_SCREEN_OFF));
     }
 
diff --git a/services/tests/powerservicetests/src/com/android/server/power/NotifierTest.java b/services/tests/powerservicetests/src/com/android/server/power/NotifierTest.java
index fc4d8d8..a1db182 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/NotifierTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/NotifierTest.java
@@ -16,6 +16,9 @@
 
 package com.android.server.power;
 
+import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP;
+import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE;
+
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.mockito.ArgumentMatchers.any;
@@ -31,11 +34,13 @@
 import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
+import android.app.ActivityManagerInternal;
 import android.app.AppOpsManager;
 import android.content.Context;
 import android.content.res.Resources;
 import android.hardware.SensorManager;
 import android.hardware.display.AmbientDisplayConfiguration;
+import android.hardware.display.DisplayManagerInternal;
 import android.os.BatteryStats;
 import android.os.Handler;
 import android.os.IWakeLockCallback;
@@ -48,11 +53,18 @@
 import android.os.test.TestLooper;
 import android.provider.Settings;
 import android.testing.TestableContext;
+import android.util.IntArray;
+import android.util.SparseBooleanArray;
+import android.view.Display;
+import android.view.DisplayAddress;
+import android.view.DisplayInfo;
 
 import androidx.test.InstrumentationRegistry;
 
 import com.android.internal.app.IBatteryStats;
 import com.android.server.LocalServices;
+import com.android.server.input.InputManagerInternal;
+import com.android.server.inputmethod.InputMethodManagerInternal;
 import com.android.server.policy.WindowManagerPolicy;
 import com.android.server.power.batterysaver.BatterySaverStateMachine;
 import com.android.server.power.feature.PowerManagerFlags;
@@ -71,6 +83,8 @@
 public class NotifierTest {
     private static final String SYSTEM_PROPERTY_QUIESCENT = "ro.boot.quiescent";
     private static final int USER_ID = 0;
+    private static final int DISPLAY_PORT = 0xFF;
+    private static final long DISPLAY_MODEL = 0xEEEEEEEEL;
 
     @Mock private BatterySaverStateMachine mBatterySaverStateMachineMock;
     @Mock private PowerManagerService.NativeWrapper mNativeWrapperMock;
@@ -81,10 +95,16 @@
     @Mock private InattentiveSleepWarningController mInattentiveSleepWarningControllerMock;
     @Mock private Vibrator mVibrator;
     @Mock private StatusBarManagerInternal mStatusBarManagerInternal;
+    @Mock private InputManagerInternal mInputManagerInternal;
+    @Mock private InputMethodManagerInternal mInputMethodManagerInternal;
+    @Mock private DisplayManagerInternal mDisplayManagerInternal;
+    @Mock private ActivityManagerInternal mActivityManagerInternal;
     @Mock private WakeLockLog mWakeLockLog;
 
     @Mock private IBatteryStats mBatteryStats;
 
+    @Mock private WindowManagerPolicy mPolicy;
+
     @Mock private PowerManagerFlags mPowerManagerFlags;
 
     @Mock private AppOpsManager mAppOpsManager;
@@ -96,6 +116,8 @@
     private FakeExecutor mTestExecutor = new FakeExecutor();
     private Notifier mNotifier;
 
+    private DisplayInfo mDefaultDisplayInfo = new DisplayInfo();
+
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
@@ -103,11 +125,25 @@
         LocalServices.removeServiceForTest(StatusBarManagerInternal.class);
         LocalServices.addService(StatusBarManagerInternal.class, mStatusBarManagerInternal);
 
+        LocalServices.removeServiceForTest(InputManagerInternal.class);
+        LocalServices.addService(InputManagerInternal.class, mInputManagerInternal);
+        LocalServices.removeServiceForTest(InputMethodManagerInternal.class);
+        LocalServices.addService(InputMethodManagerInternal.class, mInputMethodManagerInternal);
+
+        LocalServices.removeServiceForTest(ActivityManagerInternal.class);
+        LocalServices.addService(ActivityManagerInternal.class, mActivityManagerInternal);
+
+        mDefaultDisplayInfo.address = DisplayAddress.fromPortAndModel(DISPLAY_PORT, DISPLAY_MODEL);
+        LocalServices.removeServiceForTest(DisplayManagerInternal.class);
+        LocalServices.addService(DisplayManagerInternal.class, mDisplayManagerInternal);
+
         mContextSpy = spy(new TestableContext(InstrumentationRegistry.getContext()));
         mResourcesSpy = spy(mContextSpy.getResources());
         when(mContextSpy.getResources()).thenReturn(mResourcesSpy);
         when(mSystemPropertiesMock.get(eq(SYSTEM_PROPERTY_QUIESCENT), anyString())).thenReturn("");
         when(mContextSpy.getSystemService(Vibrator.class)).thenReturn(mVibrator);
+        when(mDisplayManagerInternal.getDisplayInfo(Display.DEFAULT_DISPLAY)).thenReturn(
+                mDefaultDisplayInfo);
 
         mService = new PowerManagerService(mContextSpy, mInjector);
     }
@@ -232,6 +268,122 @@
     }
 
     @Test
+    public void testOnGlobalWakefulnessChangeStarted() {
+        createNotifier();
+        // GIVEN system is currently non-interactive
+        when(mPowerManagerFlags.isPerDisplayWakeByTouchEnabled()).thenReturn(false);
+        final int displayId1 = 101;
+        final int displayId2 = 102;
+        final int[] displayIds = new int[]{displayId1, displayId2};
+        when(mDisplayManagerInternal.getDisplayIds()).thenReturn(IntArray.wrap(displayIds));
+        mNotifier.onGlobalWakefulnessChangeStarted(WAKEFULNESS_ASLEEP,
+                PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, /* eventTime= */ 1000);
+        mTestLooper.dispatchAll();
+
+        // WHEN a global wakefulness change to interactive starts
+        mNotifier.onGlobalWakefulnessChangeStarted(WAKEFULNESS_AWAKE,
+                PowerManager.WAKE_REASON_TAP, /* eventTime= */ 2000);
+        mTestLooper.dispatchAll();
+
+        // THEN input is notified of all displays being interactive
+        final SparseBooleanArray expectedDisplayInteractivities = new SparseBooleanArray();
+        expectedDisplayInteractivities.put(displayId1, true);
+        expectedDisplayInteractivities.put(displayId2, true);
+        verify(mInputManagerInternal).setDisplayInteractivities(expectedDisplayInteractivities);
+        verify(mInputMethodManagerInternal).setInteractive(/* interactive= */ true);
+    }
+
+    @Test
+    public void testOnGroupWakefulnessChangeStarted_newPowerGroup_perDisplayWakeDisabled() {
+        createNotifier();
+        // GIVEN power group is not yet known to Notifier and per-display wake by touch is disabled
+        final int groupId = 123;
+        final int changeReason = PowerManager.WAKE_REASON_TAP;
+        when(mPowerManagerFlags.isPerDisplayWakeByTouchEnabled()).thenReturn(false);
+
+        // WHEN a power group wakefulness change starts
+        mNotifier.onGroupWakefulnessChangeStarted(
+                groupId, WAKEFULNESS_AWAKE, changeReason, /* eventTime= */ 999);
+        mTestLooper.dispatchAll();
+
+        // THEN window manager policy is informed that device has started waking up
+        verify(mPolicy).startedWakingUp(groupId, changeReason);
+        verify(mDisplayManagerInternal, never()).getDisplayIds();
+        verify(mInputManagerInternal, never()).setDisplayInteractivities(any());
+    }
+
+    @Test
+    public void testOnGroupWakefulnessChangeStarted_interactivityNoChange_perDisplayWakeDisabled() {
+        createNotifier();
+        // GIVEN power group is not interactive and per-display wake by touch is disabled
+        final int groupId = 234;
+        final int changeReason = PowerManager.GO_TO_SLEEP_REASON_TIMEOUT;
+        when(mPowerManagerFlags.isPerDisplayWakeByTouchEnabled()).thenReturn(false);
+        mNotifier.onGroupWakefulnessChangeStarted(
+                groupId, WAKEFULNESS_ASLEEP, changeReason, /* eventTime= */ 999);
+        mTestLooper.dispatchAll();
+        verify(mPolicy, times(1)).startedGoingToSleep(groupId, changeReason);
+
+        // WHEN a power wakefulness change to not interactive starts
+        mNotifier.onGroupWakefulnessChangeStarted(
+                groupId, WAKEFULNESS_ASLEEP, changeReason, /* eventTime= */ 999);
+        mTestLooper.dispatchAll();
+
+        // THEN policy is only informed once of non-interactive wakefulness change
+        verify(mPolicy, times(1)).startedGoingToSleep(groupId, changeReason);
+        verify(mDisplayManagerInternal, never()).getDisplayIds();
+        verify(mInputManagerInternal, never()).setDisplayInteractivities(any());
+    }
+
+    @Test
+    public void testOnGroupWakefulnessChangeStarted_interactivityChange_perDisplayWakeDisabled() {
+        createNotifier();
+        // GIVEN power group is not interactive and per-display wake by touch is disabled
+        final int groupId = 345;
+        final int firstChangeReason = PowerManager.GO_TO_SLEEP_REASON_TIMEOUT;
+        when(mPowerManagerFlags.isPerDisplayWakeByTouchEnabled()).thenReturn(false);
+        mNotifier.onGroupWakefulnessChangeStarted(
+                groupId, WAKEFULNESS_ASLEEP, firstChangeReason, /* eventTime= */ 999);
+        mTestLooper.dispatchAll();
+
+        // WHEN a power wakefulness change to interactive starts
+        final int secondChangeReason = PowerManager.WAKE_REASON_TAP;
+        mNotifier.onGroupWakefulnessChangeStarted(
+                groupId, WAKEFULNESS_AWAKE, secondChangeReason, /* eventTime= */ 999);
+        mTestLooper.dispatchAll();
+
+        // THEN policy is informed of the change
+        verify(mPolicy).startedWakingUp(groupId, secondChangeReason);
+        verify(mDisplayManagerInternal, never()).getDisplayIds();
+        verify(mInputManagerInternal, never()).setDisplayInteractivities(any());
+    }
+
+    @Test
+    public void testOnGroupWakefulnessChangeStarted_perDisplayWakeByTouchEnabled() {
+        createNotifier();
+        // GIVEN per-display wake by touch flag is enabled
+        when(mPowerManagerFlags.isPerDisplayWakeByTouchEnabled()).thenReturn(true);
+        final int groupId = 456;
+        final int displayId1 = 1001;
+        final int displayId2 = 1002;
+        final int[] displays = new int[]{displayId1, displayId2};
+        when(mDisplayManagerInternal.getDisplayIds()).thenReturn(IntArray.wrap(displays));
+        when(mDisplayManagerInternal.getDisplayIdsForGroup(groupId)).thenReturn(displays);
+        final int changeReason = PowerManager.WAKE_REASON_TAP;
+
+        // WHEN power group wakefulness change started
+        mNotifier.onGroupWakefulnessChangeStarted(
+                groupId, WAKEFULNESS_AWAKE, changeReason, /* eventTime= */ 999);
+        mTestLooper.dispatchAll();
+
+        // THEN native input manager is updated that the displays are interactive
+        final SparseBooleanArray expectedDisplayInteractivities = new SparseBooleanArray();
+        expectedDisplayInteractivities.put(displayId1, true);
+        expectedDisplayInteractivities.put(displayId2, true);
+        verify(mInputManagerInternal).setDisplayInteractivities(expectedDisplayInteractivities);
+    }
+
+    @Test
     public void testOnWakeLockListener_RemoteException_NoRethrow() throws RemoteException {
         when(mPowerManagerFlags.improveWakelockLatency()).thenReturn(true);
         createNotifier();
@@ -551,7 +703,7 @@
                 mContextSpy,
                 mBatteryStats,
                 mInjector.createSuspendBlocker(mService, "testBlocker"),
-                null,
+                mPolicy,
                 null,
                 null,
                 mTestExecutor, mPowerManagerFlags, injector);
diff --git a/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
index 54a02cf..e9e21de 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -1659,6 +1659,64 @@
     }
 
     @Test
+    public void testIsWakeLockLevelSupported_returnsCorrectValue() {
+        createService();
+        startSystem();
+        PowerManagerService.BinderService service = mService.getBinderServiceInstance();
+        assertThat(service.isWakeLockLevelSupported(PowerManager.PARTIAL_WAKE_LOCK)).isTrue();
+        assertThat(service.isWakeLockLevelSupported(PowerManager.SCREEN_BRIGHT_WAKE_LOCK)).isTrue();
+        assertThat(service.isWakeLockLevelSupported(PowerManager.FULL_WAKE_LOCK)).isTrue();
+        assertThat(service.isWakeLockLevelSupported(PowerManager.DOZE_WAKE_LOCK)).isTrue();
+        assertThat(service.isWakeLockLevelSupported(PowerManager.DRAW_WAKE_LOCK)).isTrue();
+
+        when(mDisplayManagerInternalMock.isProximitySensorAvailable(eq(Display.DEFAULT_DISPLAY)))
+                .thenReturn(true);
+        assertThat(service.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK))
+                .isTrue();
+
+        when(mDisplayManagerInternalMock.isProximitySensorAvailable(eq(Display.DEFAULT_DISPLAY)))
+                .thenReturn(false);
+        assertThat(service.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK))
+                .isFalse();
+    }
+
+    @Test
+    public void testIsWakeLockLevelSupportedWithDisplayId_nonDefaultDisplay_returnsCorrectValue() {
+        createService();
+        startSystem();
+        int displayId = Display.DEFAULT_DISPLAY + 1;
+        PowerManagerService.BinderService service = mService.getBinderServiceInstance();
+        assertThat(service.isWakeLockLevelSupportedWithDisplayId(
+                PowerManager.PARTIAL_WAKE_LOCK, displayId))
+                .isTrue();
+        assertThat(service.isWakeLockLevelSupportedWithDisplayId(
+                PowerManager.SCREEN_BRIGHT_WAKE_LOCK, displayId))
+                .isTrue();
+        assertThat(service.isWakeLockLevelSupportedWithDisplayId(
+                PowerManager.FULL_WAKE_LOCK, displayId))
+                .isTrue();
+        assertThat(service.isWakeLockLevelSupportedWithDisplayId(
+                PowerManager.DOZE_WAKE_LOCK, displayId))
+                .isTrue();
+        assertThat(service.isWakeLockLevelSupportedWithDisplayId(
+                PowerManager.DRAW_WAKE_LOCK, displayId))
+                .isTrue();
+
+        when(mDisplayManagerInternalMock.isProximitySensorAvailable(eq(displayId)))
+                .thenReturn(true);
+        assertThat(service.isWakeLockLevelSupportedWithDisplayId(
+                PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, displayId))
+                .isTrue();
+
+        when(mDisplayManagerInternalMock.isProximitySensorAvailable(eq(displayId)))
+                .thenReturn(false);
+        assertThat(service.isWakeLockLevelSupportedWithDisplayId(
+                PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, displayId))
+                .isFalse();
+    }
+
+
+    @Test
     public void testWakeLock_affectsProperDisplayGroup() {
         final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1;
         final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener =
@@ -1699,6 +1757,47 @@
     }
 
     @Test
+    public void testWakeLock_nonDefaultDisplay_affectsProperDisplayGroup() {
+        final int nonDefaultDisplayId = Display.DEFAULT_DISPLAY + 1;
+        final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1;
+        final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener =
+                new AtomicReference<>();
+        doAnswer((Answer<Void>) invocation -> {
+            listener.set(invocation.getArgument(0));
+            return null;
+        }).when(mDisplayManagerInternalMock).registerDisplayGroupListener(any());
+        final DisplayInfo info = new DisplayInfo();
+        info.displayGroupId = nonDefaultDisplayGroupId;
+        when(mDisplayManagerInternalMock.getDisplayInfo(nonDefaultDisplayId)).thenReturn(info);
+
+        final String pkg = mContextSpy.getOpPackageName();
+        final Binder token = new Binder();
+        final String tag = "testWakeLock_nonDefaultDisplay_affectsProperDisplayGroup";
+
+        setMinimumScreenOffTimeoutConfig(5);
+        createService();
+        startSystem();
+        listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId);
+
+        mService.getBinderServiceInstance().acquireWakeLock(token,
+                PowerManager.SCREEN_BRIGHT_WAKE_LOCK, tag, pkg,
+                null /* workSource */, null /* historyTag */, nonDefaultDisplayId, null);
+
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+        assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo(
+                WAKEFULNESS_AWAKE);
+        assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo(
+                WAKEFULNESS_AWAKE);
+
+        advanceTime(15000);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+        assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo(
+                WAKEFULNESS_ASLEEP);
+        assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo(
+                WAKEFULNESS_AWAKE);
+    }
+
+    @Test
     public void testInvalidDisplayGroupWakeLock_affectsAllDisplayGroups() {
         final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1;
         final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener =
@@ -2590,14 +2689,15 @@
         when(mDisplayManagerInternalMock.getDisplayInfo(nonDefaultDisplay)).thenReturn(info);
         createService();
         startSystem();
-        listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId);
-
         verify(mInvalidateInteractiveCachesMock).call();
 
+        listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId);
+        verify(mInvalidateInteractiveCachesMock, times(2)).call();
+
         mService.setWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP, WAKEFULNESS_ASLEEP,
                 mClock.now(), 0, PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0, null, null);
 
-        verify(mInvalidateInteractiveCachesMock, times(2)).call();
+        verify(mInvalidateInteractiveCachesMock, times(3)).call();
     }
 
     @Test
@@ -2616,14 +2716,15 @@
         when(mDisplayManagerInternalMock.getDisplayInfo(nonDefaultDisplay)).thenReturn(info);
         createService();
         startSystem();
-        listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId);
-
         verify(mInvalidateInteractiveCachesMock).call();
 
+        listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId);
+        verify(mInvalidateInteractiveCachesMock, times(2)).call();
+
         mService.setWakefulnessLocked(nonDefaultDisplayGroupId, WAKEFULNESS_ASLEEP, mClock.now(),
                 0, PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0, null, null);
 
-        verify(mInvalidateInteractiveCachesMock, times(2)).call();
+        verify(mInvalidateInteractiveCachesMock, times(3)).call();
     }
 
     @Test
diff --git a/services/tests/powerstatstests/res/xml/irq_device_map_3.xml b/services/tests/powerstatstests/res/xml/irq_device_map_3.xml
index fd55428..c3df078 100644
--- a/services/tests/powerstatstests/res/xml/irq_device_map_3.xml
+++ b/services/tests/powerstatstests/res/xml/irq_device_map_3.xml
@@ -32,4 +32,7 @@
     <device name="test.sensor.device">
         <subsystem>Sensor</subsystem>
     </device>
+    <device name="test.bluetooth.device">
+        <subsystem>Bluetooth</subsystem>
+    </device>
 </irq-device-map>
\ No newline at end of file
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsAtomTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsAtomTest.java
index c5157b3..7d2bc17 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsAtomTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsAtomTest.java
@@ -24,6 +24,7 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockingDetails;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 
@@ -56,6 +57,7 @@
     @Rule
     public final RavenwoodRule mRavenwood = new RavenwoodRule();
 
+    private static final boolean DEBUG = false;
     private static final int UID_0 = 1000;
     private static final int UID_1 = 2000;
     private static final int UID_2 = 3000;
@@ -70,6 +72,10 @@
         List<StatsEvent> actual = new ArrayList<>();
         new BatteryStatsService.StatsPerUidLogger(statsLogger).logStats(bus, actual);
 
+        if (DEBUG) {
+            System.out.println(mockingDetails(statsLogger).printInvocations());
+        }
+
         // Device-wide totals
         verify(statsLogger).buildStatsEvent(
                 1000L,
@@ -609,7 +615,7 @@
 
         BatteryUsageStats batteryUsageStats = builder.build();
         final byte[] bytes = batteryUsageStats.getStatsProto();
-        assertThat(bytes.length).isGreaterThan(40000);
+        assertThat(bytes.length).isGreaterThan(20000);
         assertThat(bytes.length).isLessThan(50000);
 
         BatteryUsageStatsAtomsProto proto;
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java
index 0e60156..b30224b 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java
@@ -47,6 +47,7 @@
 
 import com.android.internal.os.BatteryStatsHistoryIterator;
 import com.android.internal.os.PowerProfile;
+import com.android.server.power.stats.processor.MultiStatePowerAttributor;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -74,7 +75,8 @@
             new BatteryUsageStatsRule(12345)
                     .createTempDirectory()
                     .setAveragePower(PowerProfile.POWER_FLASHLIGHT, 360.0)
-                    .setAveragePower(PowerProfile.POWER_AUDIO, 720.0);
+                    .setAveragePower(PowerProfile.POWER_AUDIO, 720.0)
+                    .setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 4000.0);
 
     private MockClock mMockClock = mStatsRule.getMockClock();
     private Context mContext;
@@ -92,14 +94,7 @@
 
     @Test
     public void test_getBatteryUsageStats() {
-        BatteryStatsImpl batteryStats = prepareBatteryStats();
-
-        BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext,
-                mock(PowerAttributor.class), mStatsRule.getPowerProfile(),
-                mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), mMockClock);
-
-        final BatteryUsageStats batteryUsageStats =
-                provider.getBatteryUsageStats(batteryStats, BatteryUsageStatsQuery.DEFAULT);
+        final BatteryUsageStats batteryUsageStats = prepareBatteryUsageStats(false);
 
         final List<UidBatteryConsumer> uidBatteryConsumers =
                 batteryUsageStats.getUidBatteryConsumers();
@@ -128,8 +123,22 @@
     }
 
     @Test
+    public void batteryLevelInfo_charging() {
+        final BatteryUsageStats batteryUsageStats = prepareBatteryUsageStats(true);
+        assertThat(batteryUsageStats.getBatteryCapacity()).isEqualTo(4000.0);
+        assertThat(batteryUsageStats.getChargeTimeRemainingMs()).isEqualTo(1_200_000);
+    }
+
+    @Test
+    public void batteryLevelInfo_onBattery() {
+        final BatteryUsageStats batteryUsageStats = prepareBatteryUsageStats(false);
+        assertThat(batteryUsageStats.getBatteryCapacity()).isEqualTo(4000.0);
+        assertThat(batteryUsageStats.getBatteryTimeRemainingMs()).isEqualTo(600_000);
+    }
+
+    @Test
     public void test_selectPowerComponents() {
-        BatteryStatsImpl batteryStats = prepareBatteryStats();
+        BatteryStatsImpl batteryStats = prepareBatteryStats(false);
 
         BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext,
                 mock(PowerAttributor.class), mStatsRule.getPowerProfile(),
@@ -155,8 +164,15 @@
                 .isEqualTo(0);
     }
 
-    private BatteryStatsImpl prepareBatteryStats() {
+    private BatteryStatsImpl prepareBatteryStats(boolean plugInAtTheEnd) {
         BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();
+        batteryStats.onSystemReady(mContext);
+
+        synchronized (batteryStats) {
+            batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING,
+                    100, /* plugType */ 0, 90, 72, 3700, 3_600_000, 4_000_000, 0, 0,
+                    0, 0);
+        }
 
         mStatsRule.setTime(10 * MINUTE_IN_MS, 10 * MINUTE_IN_MS);
         synchronized (batteryStats) {
@@ -197,23 +213,64 @@
                     ActivityManager.PROCESS_STATE_CACHED_EMPTY);
         }
         synchronized (batteryStats) {
-            batteryStats.noteFlashlightOnLocked(APP_UID, 1000, 1000);
+            batteryStats.noteFlashlightOnLocked(APP_UID, 80 * MINUTE_IN_MS, 80 * MINUTE_IN_MS);
         }
         synchronized (batteryStats) {
-            batteryStats.noteFlashlightOffLocked(APP_UID, 5000, 5000);
+            batteryStats.noteFlashlightOffLocked(APP_UID, 80 * MINUTE_IN_MS + 4000,
+                    80 * MINUTE_IN_MS + 4000);
         }
 
         synchronized (batteryStats) {
-            batteryStats.noteAudioOnLocked(APP_UID, 10000, 10000);
+            batteryStats.noteAudioOnLocked(APP_UID, 90 * MINUTE_IN_MS, 90 * MINUTE_IN_MS);
         }
         synchronized (batteryStats) {
-            batteryStats.noteAudioOffLocked(APP_UID, 20000, 20000);
+            batteryStats.noteAudioOffLocked(APP_UID, 90 * MINUTE_IN_MS + 10000,
+                    90 * MINUTE_IN_MS + 10000);
+        }
+
+        synchronized (batteryStats) {
+            batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING,
+                    100, /* plugType */ 0, 60, 72, 3700, 2_600_000, 4_000_000, 0,
+                    100 * MINUTE_IN_MS, 100 * MINUTE_IN_MS, 21000);
+        }
+
+        synchronized (batteryStats) {
+            batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING,
+                    100, /* plugType */ 0, 30, 72, 3700, 1_600_000, 4_000_000, 0,
+                    110 * MINUTE_IN_MS, 110 * MINUTE_IN_MS, 21000);
+        }
+
+        if (plugInAtTheEnd) {
+            synchronized (batteryStats) {
+                batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_CHARGING,
+                        100, /* plugType */ BatteryManager.BATTERY_PLUGGED_USB, 30, 72, 3700,
+                        1_600_000, 4_000_000, /* chargeTimeToFullSeconds */ 20 * 60,
+                        120 * MINUTE_IN_MS, 120 * MINUTE_IN_MS, 22000);
+            }
         }
 
         mStatsRule.setCurrentTime(54321);
         return batteryStats;
     }
 
+    private BatteryUsageStats prepareBatteryUsageStats(boolean plugInAtTheEnd) {
+        BatteryStatsImpl batteryStats = prepareBatteryStats(plugInAtTheEnd);
+
+        MultiStatePowerAttributor powerAttributor = new MultiStatePowerAttributor(mContext,
+                mock(PowerStatsStore.class), mStatsRule.getPowerProfile(),
+                mStatsRule.getCpuScalingPolicies(), () -> 3500, new PowerStatsUidResolver());
+        powerAttributor.setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_AUDIO,
+                true);
+        powerAttributor.setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT,
+                true);
+
+        BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext,
+                powerAttributor, mStatsRule.getPowerProfile(),
+                mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), mMockClock);
+
+        return provider.getBatteryUsageStats(batteryStats, BatteryUsageStatsQuery.DEFAULT);
+    }
+
     @Test
     public void testWriteAndReadHistory() {
         MockBatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java
index 624b189..52675f6 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java
@@ -376,6 +376,23 @@
         return mBatteryStats.getUidStatsLocked(uid);
     }
 
+    /**
+     * Adds the supplied duration to all three: current time, elapsed time and uptime
+     */
+    public void advanceTime(long millis) {
+        mMockClock.currentTime += millis;
+        mMockClock.realtime += millis;
+        mMockClock.uptime += millis;
+    }
+
+    /**
+     * Adds the supplied duration to current time and elapsed time, but not to uptime
+     */
+    public void advanceSuspendedTime(long millis) {
+        mMockClock.currentTime += millis;
+        mMockClock.realtime += millis;
+    }
+
     public void setTime(long realtimeMs, long uptimeMs) {
         mMockClock.currentTime = realtimeMs;
         mMockClock.realtime = realtimeMs;
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java
index 3ae4c32..88624f2 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java
@@ -173,7 +173,9 @@
         assertThat(dump).containsMatch(quote("(not on battery, screen off/doze)") + "\\s*"
                 + "cpu: 123 apps: 123 duration: 456ms");
         assertThat(dump).containsMatch(
-                "UID 271: 1200 fg: 1777 bg: 2388 fgs: 1999 cached: 123\\s*"
+                quote("UID 271: 1200 "
+                        + "fg: 1777 (1s 0ms) bg: 2388 (1s 500ms) fgs: 1999 (500ms) cached: 123")
+                        + "\\s*"
                         + quote("screen=300 cpu=400 (600ms) cpu:fg=1777 (7s 771ms) "
                         + "cpu:bg=1888 (8s 881ms) cpu:fgs=1999 (9s 991ms) "
                         + "cpu:cached=123 (456ms) FOO=500 (800ms) FOO:bg=500 (800ms)") + "\\s*"
@@ -199,7 +201,9 @@
         assertThat(dump).contains("cpu: 20100 apps: 10100 duration: 20s 300ms");
         assertThat(dump).contains("FOO: 20200 apps: 10200 duration: 20s 400ms");
         assertThat(dump).containsMatch(
-                "UID 271: 1200 fg: 1777 bg: 2388 fgs: 1999 cached: 123\\s*"
+                quote("UID 271: 1200 "
+                        + "fg: 1777 (1s 0ms) bg: 2388 (1s 500ms) fgs: 1999 (500ms) cached: 123")
+                        + "\\s*"
                         + quote("screen=300 cpu=400 (600ms) cpu:fg=1777 (7s 771ms) "
                         + "cpu:bg=1888 (8s 881ms) cpu:fgs=1999 (9s 991ms) "
                         + "cpu:cached=123 (456ms) FOO=500 (800ms) FOO:bg=500 (800ms)"));
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/WakelockPowerStatsCollectorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/WakelockPowerStatsCollectorTest.java
new file mode 100644
index 0000000..dd5df76
--- /dev/null
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/WakelockPowerStatsCollectorTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2024 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.power.stats;
+
+import static android.os.BatteryConsumer.POWER_COMPONENT_WAKELOCK;
+import static android.os.BatteryStats.WAKE_TYPE_PARTIAL;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+
+import android.content.Context;
+import android.os.Process;
+import android.platform.test.ravenwood.RavenwoodConfig;
+import android.platform.test.ravenwood.RavenwoodConfig.Config;
+
+import com.android.internal.os.PowerStats;
+import com.android.server.power.stats.format.WakelockPowerStatsLayout;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class WakelockPowerStatsCollectorTest {
+
+    @Config
+    public static final RavenwoodConfig sConfig = new RavenwoodConfig.Builder()
+            .setProvideMainThread(true)
+            .build();
+
+    @Rule
+    public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule();
+
+    private static final int APP_UID1 = Process.FIRST_APPLICATION_UID + 42;
+    private static final int APP_UID2 = Process.FIRST_APPLICATION_UID + 101;
+
+    private MockBatteryStatsImpl mBatteryStats;
+
+    private final MockClock mClock = mStatsRule.getMockClock();
+    private PowerStats mPowerStats;
+    private WakelockPowerStatsLayout mStatsLayout = new WakelockPowerStatsLayout();
+
+    @Before
+    public void setup() {
+        mBatteryStats = new MockBatteryStatsImpl(mClock);
+        mBatteryStats.setPowerStatsCollectorEnabled(POWER_COMPONENT_WAKELOCK, true);
+        mBatteryStats.getPowerStatsCollector(POWER_COMPONENT_WAKELOCK)
+                .addConsumer(ps -> mPowerStats = ps);
+        mBatteryStats.onSystemReady(mock(Context.class));
+    }
+
+    @Test
+    public void collectStats() {
+        PowerStatsCollector powerStatsCollector = mBatteryStats.getPowerStatsCollector(
+                POWER_COMPONENT_WAKELOCK);
+
+        // Establish a baseline
+        powerStatsCollector.collectAndDeliverStats();
+
+        mBatteryStats.forceRecordAllHistory();
+
+        mStatsRule.advanceSuspendedTime(1000);
+
+        synchronized (mBatteryStats) {
+            mBatteryStats.setOnBatteryLocked(mClock.realtime, mClock.uptime, true, 0, 90, 1000);
+        }
+
+        mStatsRule.advanceSuspendedTime(3000);
+        synchronized (mBatteryStats) {
+            mBatteryStats.noteStartWakeLocked(APP_UID1, 0, null, "one", null, WAKE_TYPE_PARTIAL,
+                    false);
+        }
+
+        mStatsRule.advanceTime(1000);
+        powerStatsCollector.collectAndDeliverStats();
+
+        assertThat(mStatsLayout.getUsageDuration(mPowerStats.stats)).isEqualTo(1000);
+        assertThat(mStatsLayout.getUidUsageDuration(mPowerStats.uidStats.get(APP_UID1)))
+                .isEqualTo(1000);
+
+        mStatsRule.advanceTime(3000);
+        synchronized (mBatteryStats) {
+            mBatteryStats.noteStartWakeLocked(APP_UID2, 0, null, "two", null, WAKE_TYPE_PARTIAL,
+                    false);
+        }
+
+        mStatsRule.advanceTime(2000);
+        synchronized (mBatteryStats) {
+            mBatteryStats.noteStopWakeLocked(APP_UID1, 0, null, "one", null, WAKE_TYPE_PARTIAL);
+        }
+
+        mStatsRule.advanceTime(5000);
+        synchronized (mBatteryStats) {
+            mBatteryStats.noteStopWakeLocked(APP_UID2, 0, null, "two", null, WAKE_TYPE_PARTIAL);
+        }
+        mStatsRule.advanceSuspendedTime(7000);
+
+        // Plug in
+        synchronized (mBatteryStats) {
+            mBatteryStats.setOnBatteryLocked(mClock.realtime, mClock.uptime, false, 0, 90, 1000);
+        }
+
+        mStatsRule.advanceSuspendedTime(1000);
+        powerStatsCollector.collectAndDeliverStats();
+
+        // Based on the uptime, the device was awake for (3000+2000+5000) = 10000 ms
+        assertThat(mStatsLayout.getUsageDuration(mPowerStats.stats)).isEqualTo(10000);
+        assertThat(mStatsLayout.getUidUsageDuration(mPowerStats.uidStats.get(APP_UID1)))
+                .isEqualTo(4000);  // 3000 + (2000/2) -- the 2000 ms overlap is split two-way
+        assertThat(mStatsLayout.getUidUsageDuration(mPowerStats.uidStats.get(APP_UID2)))
+                .isEqualTo(6000);  // (2000/2) + 5000
+    }
+}
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BasePowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BasePowerStatsProcessorTest.java
new file mode 100644
index 0000000..f7a1638
--- /dev/null
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BasePowerStatsProcessorTest.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2024 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.power.stats.processor;
+
+import static android.os.BatteryConsumer.POWER_COMPONENT_BASE;
+import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND;
+import static android.os.BatteryConsumer.PROCESS_STATE_CACHED;
+import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND;
+import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE;
+import static android.os.BatteryConsumer.PROCESS_STATE_UNSPECIFIED;
+
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_BATTERY;
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON;
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER;
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER;
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE;
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+
+import android.os.BatteryConsumer;
+import android.os.BatteryUsageStats;
+import android.os.Process;
+import android.os.UidBatteryConsumer;
+
+import com.android.internal.os.PowerStats;
+import com.android.server.power.stats.PowerStatsStore;
+import com.android.server.power.stats.format.BasePowerStatsLayout;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.List;
+
+public class BasePowerStatsProcessorTest {
+    private static final int APP_UID1 = Process.FIRST_APPLICATION_UID + 42;
+    private static final int APP_UID2 = Process.FIRST_APPLICATION_UID + 101;
+
+    private static AggregatedPowerStatsConfig sAggregatedPowerStatsConfig;
+
+    @BeforeClass
+    public static void setup() {
+        sAggregatedPowerStatsConfig = new AggregatedPowerStatsConfig();
+        sAggregatedPowerStatsConfig.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_BASE)
+                .trackDeviceStates(
+                        AggregatedPowerStatsConfig.STATE_POWER,
+                        AggregatedPowerStatsConfig.STATE_SCREEN)
+                .trackUidStates(
+                        AggregatedPowerStatsConfig.STATE_POWER,
+                        AggregatedPowerStatsConfig.STATE_SCREEN,
+                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
+                .setProcessorSupplier(() -> new BasePowerStatsProcessor(() -> 4000));
+    }
+
+    @Test
+    public void processPowerStats() {
+        AggregatedPowerStats aggregatedPowerStats = prepareAggregatedPowerStats(true);
+
+        PowerComponentAggregatedPowerStats stats = aggregatedPowerStats.getPowerComponentStats(
+                BatteryConsumer.POWER_COMPONENT_BASE);
+
+        PowerStats.Descriptor descriptor = stats.getPowerStatsDescriptor();
+        BasePowerStatsLayout statsLayout = new BasePowerStatsLayout(descriptor);
+
+        long[] deviceStats = new long[descriptor.statsArrayLength];
+        stats.getDeviceStats(deviceStats, states(POWER_STATE_BATTERY, SCREEN_STATE_ON));
+        assertThat(statsLayout.getUsageDuration(deviceStats)).isEqualTo(2500);
+
+        stats.getDeviceStats(deviceStats, states(POWER_STATE_BATTERY, SCREEN_STATE_OTHER));
+        assertThat(statsLayout.getUsageDuration(deviceStats)).isEqualTo(8500);
+
+        long[] uidStats = new long[descriptor.uidStatsArrayLength];
+        stats.getUidStats(uidStats, APP_UID1,
+                states(POWER_STATE_BATTERY, SCREEN_STATE_ON, PROCESS_STATE_FOREGROUND));
+        assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(2500);
+        stats.getUidStats(uidStats, APP_UID1,
+                states(POWER_STATE_BATTERY, SCREEN_STATE_OTHER, PROCESS_STATE_BACKGROUND));
+        assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(2500);
+        stats.getUidStats(uidStats, APP_UID1,
+                states(POWER_STATE_BATTERY, SCREEN_STATE_OTHER, PROCESS_STATE_FOREGROUND_SERVICE));
+        assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(5000);
+        stats.getUidStats(uidStats, APP_UID1,
+                states(POWER_STATE_BATTERY, SCREEN_STATE_OTHER, PROCESS_STATE_UNSPECIFIED));
+        assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(0);
+
+        stats.getUidStats(uidStats, APP_UID2,
+                states(POWER_STATE_BATTERY, SCREEN_STATE_ON, PROCESS_STATE_CACHED));
+        assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(2500);
+        stats.getUidStats(uidStats, APP_UID2,
+                states(POWER_STATE_BATTERY, SCREEN_STATE_OTHER, PROCESS_STATE_CACHED));
+        assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(8500);
+        stats.getUidStats(uidStats, APP_UID2,
+                states(POWER_STATE_BATTERY, SCREEN_STATE_OTHER, PROCESS_STATE_UNSPECIFIED));
+        assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(0);
+    }
+
+    @Test
+    public void fuelgaugeAvailable() {
+        AggregatedPowerStats aggregatedPowerStats = prepareAggregatedPowerStats(true);
+
+        PowerComponentAggregatedPowerStats stats = aggregatedPowerStats.getPowerComponentStats(
+                BatteryConsumer.POWER_COMPONENT_BASE);
+
+        PowerStats.Descriptor descriptor = stats.getPowerStatsDescriptor();
+        BasePowerStatsLayout statsLayout = new BasePowerStatsLayout(descriptor);
+
+        long[] deviceStats = new long[descriptor.statsArrayLength];
+        double dischargeDuration = 0;
+        stats.getDeviceStats(deviceStats, states(POWER_STATE_BATTERY, SCREEN_STATE_ON));
+        dischargeDuration += statsLayout.getBatteryDischargeDuration(deviceStats);
+        assertThat(statsLayout.getBatteryDischargePercent(deviceStats)).isWithin(0.1).of(2.5);
+        // (2,000,000 uAh - 900,000 uAh) * 2,500 ms / 11,000 ms
+        assertThat(statsLayout.getBatteryDischargeUah(deviceStats)).isEqualTo(250_000);
+
+        stats.getDeviceStats(deviceStats, states(POWER_STATE_BATTERY, SCREEN_STATE_OTHER));
+        dischargeDuration += statsLayout.getBatteryDischargeDuration(deviceStats);
+        assertThat(statsLayout.getBatteryDischargePercent(deviceStats)).isWithin(0.1).of(8.5);
+        // (2,000,000 uAh - 900,000 uAh) * 8,500 ms / 11,000 ms
+        assertThat(statsLayout.getBatteryDischargeUah(deviceStats)).isEqualTo(850_000);
+
+        // Allow for rounding errors
+        assertThat(dischargeDuration).isWithin(5).of(6000);
+    }
+
+    @Test
+    public void fuelgaugeUnavailable() {
+        AggregatedPowerStats aggregatedPowerStats = prepareAggregatedPowerStats(false);
+
+        PowerComponentAggregatedPowerStats stats = aggregatedPowerStats.getPowerComponentStats(
+                BatteryConsumer.POWER_COMPONENT_BASE);
+
+        PowerStats.Descriptor descriptor = stats.getPowerStatsDescriptor();
+        BasePowerStatsLayout statsLayout = new BasePowerStatsLayout(descriptor);
+
+        long[] deviceStats = new long[descriptor.statsArrayLength];
+        double dischargeDuration = 0;
+        stats.getDeviceStats(deviceStats, states(POWER_STATE_BATTERY, SCREEN_STATE_ON));
+        dischargeDuration += statsLayout.getBatteryDischargeDuration(deviceStats);
+        assertThat(statsLayout.getBatteryDischargePercent(deviceStats)).isWithin(0.1).of(2.5);
+        // 11% * 4_000_000 uAh * 2,500 ms / 11,000 ms
+        assertThat(statsLayout.getBatteryDischargeUah(deviceStats)).isEqualTo(100_000);
+
+        stats.getDeviceStats(deviceStats, states(POWER_STATE_BATTERY, SCREEN_STATE_OTHER));
+        dischargeDuration += statsLayout.getBatteryDischargeDuration(deviceStats);
+        assertThat(statsLayout.getBatteryDischargePercent(deviceStats)).isWithin(0.1).of(8.5);
+        assertThat(statsLayout.getBatteryDischargeUah(deviceStats)).isEqualTo(340_000);
+
+        // Allow for rounding errors
+        assertThat(dischargeDuration).isWithin(5).of(6000);
+    }
+
+    @Test
+    public void exporter() throws Exception {
+        AggregatedPowerStats aggregatedPowerStats = prepareAggregatedPowerStats(true);
+
+        PowerStatsStore powerStatsStore = mock(PowerStatsStore.class);
+        PowerStatsAggregator powerStatsAggregator = new PowerStatsAggregator(
+                sAggregatedPowerStatsConfig);
+        PowerStatsExporter exporter = new PowerStatsExporter(powerStatsStore,
+                powerStatsAggregator, /* batterySessionTimeSpanSlackMillis */ 0);
+
+        BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(new String[0],
+                /* includePowerModels */ false,
+                /* includeProcessStateData */ true,
+                /* includeScreenStateData */ true,
+                /* includesPowerStateData */ true,
+                /* minConsumedPowerThreshold */ 0);
+        exporter.populateBatteryUsageStatsBuilder(builder, aggregatedPowerStats);
+        BatteryUsageStats batteryUsageStats = builder.build();
+
+        List<UidBatteryConsumer> uidBatteryConsumers = batteryUsageStats.getUidBatteryConsumers();
+        UidBatteryConsumer app1 = uidBatteryConsumers.stream()
+                .filter(u->u.getUid() == APP_UID1).findAny().get();
+        assertThat(app1.getUsageDurationMillis(
+                new BatteryConsumer.Dimensions(POWER_COMPONENT_BASE, PROCESS_STATE_FOREGROUND,
+                        BatteryConsumer.SCREEN_STATE_ON, BatteryConsumer.POWER_STATE_BATTERY)))
+                .isEqualTo(2500);
+        assertThat(app1.getUsageDurationMillis(
+                new BatteryConsumer.Dimensions(POWER_COMPONENT_BASE, PROCESS_STATE_BACKGROUND,
+                        BatteryConsumer.SCREEN_STATE_OTHER, BatteryConsumer.POWER_STATE_BATTERY)))
+                .isEqualTo(2500);
+        assertThat(app1.getUsageDurationMillis(
+                new BatteryConsumer.Dimensions(POWER_COMPONENT_BASE,
+                        PROCESS_STATE_FOREGROUND_SERVICE,
+                        BatteryConsumer.SCREEN_STATE_OTHER, BatteryConsumer.POWER_STATE_BATTERY)))
+                .isEqualTo(5000);
+
+        assertThat(app1.getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND)).isEqualTo(2500);
+        assertThat(app1.getTimeInProcessStateMs(PROCESS_STATE_BACKGROUND)).isEqualTo(2500);
+        assertThat(app1.getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND_SERVICE)).isEqualTo(5000);
+        assertThat(app1.getTimeInProcessStateMs(PROCESS_STATE_UNSPECIFIED)).isEqualTo(0);
+
+        UidBatteryConsumer app2 = uidBatteryConsumers.stream()
+                .filter(u->u.getUid() == APP_UID2).findAny().get();
+        assertThat(app2.getUsageDurationMillis(
+                new BatteryConsumer.Dimensions(POWER_COMPONENT_BASE, PROCESS_STATE_CACHED,
+                        BatteryConsumer.SCREEN_STATE_ON, BatteryConsumer.POWER_STATE_BATTERY)))
+                .isEqualTo(2500);
+        assertThat(app2.getUsageDurationMillis(
+                new BatteryConsumer.Dimensions(POWER_COMPONENT_BASE, PROCESS_STATE_CACHED,
+                        BatteryConsumer.SCREEN_STATE_OTHER, BatteryConsumer.POWER_STATE_BATTERY)))
+                .isEqualTo(8500);
+
+        assertThat(app2.getTimeInProcessStateMs(PROCESS_STATE_CACHED)).isEqualTo(11_000);
+        assertThat(app2.getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND)).isEqualTo(0);
+        assertThat(app2.getTimeInProcessStateMs(PROCESS_STATE_BACKGROUND)).isEqualTo(0);
+        assertThat(app2.getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND_SERVICE)).isEqualTo(0);
+        assertThat(app2.getTimeInProcessStateMs(PROCESS_STATE_UNSPECIFIED)).isEqualTo(0);
+
+        batteryUsageStats.close();
+    }
+
+    private static AggregatedPowerStats prepareAggregatedPowerStats(boolean fuelgaugeAvailable) {
+        AggregatedPowerStats stats = new AggregatedPowerStats(sAggregatedPowerStatsConfig);
+        stats.getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_BASE);
+        stats.start(0);
+
+        stats.noteBatteryLevel(50, fuelgaugeAvailable ? 2_000_000 : 0, 0);
+
+        stats.setDeviceState(STATE_POWER, POWER_STATE_BATTERY, 0);
+        stats.setDeviceState(STATE_SCREEN, SCREEN_STATE_ON, 0);
+        stats.setUidState(APP_UID1, STATE_PROCESS_STATE, PROCESS_STATE_FOREGROUND, 0);
+        stats.setUidState(APP_UID2, STATE_PROCESS_STATE, PROCESS_STATE_CACHED, 0);
+
+        // Turn the screen off after 2.5 seconds
+        stats.setDeviceState(STATE_SCREEN, SCREEN_STATE_OTHER, 2500);
+        stats.setUidState(APP_UID1, STATE_PROCESS_STATE, PROCESS_STATE_BACKGROUND, 2500);
+        stats.noteBatteryLevel(45, fuelgaugeAvailable ? 1_400_000 : 0, 3000);
+        stats.setUidState(APP_UID1, STATE_PROCESS_STATE, PROCESS_STATE_FOREGROUND_SERVICE, 5000);
+        stats.noteBatteryLevel(39, fuelgaugeAvailable ? 900_000 : 0, 6000);
+
+        // Kill the app at the 10_000 mark
+        stats.setUidState(APP_UID1, STATE_PROCESS_STATE, PROCESS_STATE_UNSPECIFIED, 10_000);
+
+        stats.noteBatteryLevel(49, fuelgaugeAvailable ? 1_200_000 : 0, 10_000);
+
+        stats.finish(11_000);
+        return stats;
+    }
+
+    private int[] states(int... states) {
+        return states;
+    }
+}
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java
index 6dfc220..2c580e5 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java
@@ -479,6 +479,7 @@
                 new AggregatedPowerStats(config).getPowerComponentStats(
                         BatteryConsumer.POWER_COMPONENT_BLUETOOTH);
 
+        aggregatedStats.start(0);
         aggregatedStats.setState(STATE_POWER, POWER_STATE_OTHER, 0);
         aggregatedStats.setState(STATE_SCREEN, SCREEN_STATE_ON, 0);
         aggregatedStats.setUidState(APP_UID1, STATE_PROCESS_STATE, PROCESS_STATE_FOREGROUND, 0);
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CpuPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CpuPowerStatsProcessorTest.java
index 6938615..cb9d9b1 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CpuPowerStatsProcessorTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CpuPowerStatsProcessorTest.java
@@ -43,6 +43,7 @@
 import com.android.internal.os.PowerStats;
 import com.android.server.power.stats.BatteryUsageStatsRule;
 import com.android.server.power.stats.format.CpuPowerStatsLayout;
+import com.android.server.power.stats.format.WakelockPowerStatsLayout;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -78,21 +79,37 @@
             .setCpuPowerBracket(0, 1, 1)
             .setCpuPowerBracket(2, 0, 2);
 
-    private AggregatedPowerStatsConfig.PowerComponent mConfig;
+    private AggregatedPowerStatsConfig mConfig;
+    private AggregatedPowerStatsConfig.PowerComponent mCpuPowerComponentConfig;
+    private AggregatedPowerStats mAggregatedPowerStats;
     private MockPowerComponentAggregatedPowerStats mStats;
+    private WakelockPowerStatsLayout mWakelockStatsLayout;
+    private PowerStats.Descriptor mWakelockDescriptor;
 
     @Before
     public void setup() {
-        mConfig = new AggregatedPowerStatsConfig.PowerComponent(BatteryConsumer.POWER_COMPONENT_CPU)
+        mConfig = new AggregatedPowerStatsConfig();
+        mConfig.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_WAKELOCK)
                 .trackDeviceStates(STATE_POWER, STATE_SCREEN)
-                .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE)
+                .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE);
+        mCpuPowerComponentConfig = mConfig.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_CPU,
+                        BatteryConsumer.POWER_COMPONENT_WAKELOCK)
                 .setProcessorSupplier(() -> new CpuPowerStatsProcessor(mStatsRule.getPowerProfile(),
                         mStatsRule.getCpuScalingPolicies()));
+        mAggregatedPowerStats = new AggregatedPowerStats(mConfig);
+
+        mWakelockStatsLayout = new WakelockPowerStatsLayout();
+        PersistableBundle extras = new PersistableBundle();
+        mWakelockStatsLayout.toExtras(extras);
+        mWakelockDescriptor = new PowerStats.Descriptor(BatteryConsumer.POWER_COMPONENT_WAKELOCK,
+                mWakelockStatsLayout.getDeviceStatsArrayLength(), null, 0,
+                mWakelockStatsLayout.getUidStatsArrayLength(), extras);
     }
 
     @Test
     public void powerProfileModel() {
-        mStats = new MockPowerComponentAggregatedPowerStats(mConfig, false);
+        mStats = new MockPowerComponentAggregatedPowerStats(mAggregatedPowerStats,
+                mCpuPowerComponentConfig, false);
         mStats.start(0);
 
         mStats.setDeviceStats(
@@ -136,7 +153,23 @@
 
     @Test
     public void energyConsumerModel() {
-        mStats = new MockPowerComponentAggregatedPowerStats(mConfig, true);
+        PowerComponentAggregatedPowerStats wakelockStats =
+                mAggregatedPowerStats.getPowerComponentStats(
+                        BatteryConsumer.POWER_COMPONENT_WAKELOCK);
+
+        wakelockStats.setPowerStatsDescriptor(mWakelockDescriptor);
+        long[] wakelockDeviceStats = new long[mWakelockDescriptor.statsArrayLength];
+        mWakelockStatsLayout.setDevicePowerEstimate(wakelockDeviceStats, 1.000);
+        wakelockStats.setDeviceStats(states(POWER_STATE_BATTERY, SCREEN_STATE_ON),
+                wakelockDeviceStats);
+        long[] wakelockUidStats = new long[mWakelockDescriptor.uidStatsArrayLength];
+        mWakelockStatsLayout.setUidPowerEstimate(wakelockUidStats, 0.100);
+        wakelockStats.setUidStats(42,
+                states(POWER_STATE_BATTERY, SCREEN_STATE_ON, PROCESS_STATE_BACKGROUND),
+                wakelockUidStats);
+
+        mStats = new MockPowerComponentAggregatedPowerStats(mAggregatedPowerStats,
+                mCpuPowerComponentConfig, true);
         mStats.start(0);
 
         mStats.setDeviceStats(
@@ -146,7 +179,7 @@
                         values(2000, 1000),                 // clusters
                         values(5000),                       // uptime
                         values(5_000_000L, 6_000_000L)),    // energy, uC
-                3.055555);
+                2.055555);          // 3.055555 - 1.000 (wakelock power)
         mStats.setDeviceStats(
                 states(POWER_STATE_OTHER, SCREEN_STATE_ON),
                 concat(
@@ -171,7 +204,8 @@
                 values(900, 1000, 1500), 1.161902);
         mStats.setUidStats(42,
                 states(POWER_STATE_BATTERY, SCREEN_STATE_ON, PROCESS_STATE_BACKGROUND),
-                values(600, 500, 300), 0.355406);
+                values(600, 500, 300),
+                0.255406);      // 0.355406 - 0.100 (wakelock power)
         mStats.setUidStats(42,
                 states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED),
                 values(1500, 2000, 1000), 0.80773);
@@ -209,10 +243,10 @@
         private final HashMap<String, Double> mExpectedDevicePower = new HashMap<>();
         private final HashMap<String, Double> mExpectedUidPower = new HashMap<>();
 
-        MockPowerComponentAggregatedPowerStats(
-                AggregatedPowerStatsConfig.PowerComponent config,
+        MockPowerComponentAggregatedPowerStats(AggregatedPowerStats aggregatedPowerStats,
+                AggregatedPowerStatsConfig.PowerComponent powerComponent,
                 boolean useEnergyConsumers) {
-            super(new AggregatedPowerStats(new AggregatedPowerStatsConfig()), config);
+            super(aggregatedPowerStats, powerComponent);
             mStatsLayout = new CpuPowerStatsLayout(useEnergyConsumers ? 2 : 0, 2,
                     new int[]{0, 1, 2});
             PersistableBundle extras = new PersistableBundle();
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java
index 80358c5..4ed44a0 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java
@@ -182,6 +182,7 @@
         PowerComponentAggregatedPowerStats aggregatedStats = new AggregatedPowerStats(config)
                 .getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO);
 
+        aggregatedStats.start(0);
         aggregatedStats.setState(STATE_POWER, POWER_STATE_OTHER, 0);
         aggregatedStats.setState(STATE_SCREEN, SCREEN_STATE_ON, 0);
         aggregatedStats.setUidState(APP_UID, STATE_PROCESS_STATE, PROCESS_STATE_FOREGROUND, 0);
@@ -419,6 +420,7 @@
         PowerComponentAggregatedPowerStats aggregatedStats = new AggregatedPowerStats(config)
                 .getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO);
 
+        aggregatedStats.start(0);
         aggregatedStats.setState(STATE_POWER, POWER_STATE_OTHER, 0);
         aggregatedStats.setState(STATE_SCREEN, SCREEN_STATE_ON, 0);
         aggregatedStats.setUidState(APP_UID, STATE_PROCESS_STATE, PROCESS_STATE_FOREGROUND, 0);
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java
index 024743d..8475d56 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java
@@ -132,7 +132,7 @@
                 null, 0, mCpuStatsArrayLayout.getUidStatsArrayLength(), extras);
 
         mPowerAttributor = new MultiStatePowerAttributor(mock(Context.class), mPowerStatsStore,
-                mock(PowerProfile.class), mock(CpuScalingPolicies.class),
+                mock(PowerProfile.class), mock(CpuScalingPolicies.class), () -> 3500,
                 mock(PowerStatsUidResolver.class));
     }
 
@@ -340,8 +340,7 @@
             AggregatedPowerStats aps,
             boolean includeProcessStateData, boolean includeScreenStateData,
             boolean includesPowerStateData) {
-        PowerStatsExporter
-                exporter = new PowerStatsExporter(mPowerStatsStore,
+        PowerStatsExporter exporter = new PowerStatsExporter(mPowerStatsStore,
                 mPowerStatsAggregator, /* batterySessionTimeSpanSlackMillis */ 0);
 
         BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(new String[0], false,
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WakelockPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WakelockPowerStatsProcessorTest.java
new file mode 100644
index 0000000..f64dc08
--- /dev/null
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WakelockPowerStatsProcessorTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2024 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.power.stats.processor;
+
+import static android.os.BatteryConsumer.POWER_COMPONENT_WAKELOCK;
+import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND;
+import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND;
+import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE;
+
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_BATTERY;
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_OTHER;
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON;
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER;
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE;
+import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+
+import android.os.BatteryConsumer;
+import android.os.PersistableBundle;
+import android.os.Process;
+import android.platform.test.ravenwood.RavenwoodConfig;
+
+import com.android.internal.os.BatteryStatsHistory;
+import com.android.internal.os.MonotonicClock;
+import com.android.internal.os.PowerProfile;
+import com.android.internal.os.PowerStats;
+import com.android.server.power.stats.BatteryUsageStatsRule;
+import com.android.server.power.stats.format.WakelockPowerStatsLayout;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class WakelockPowerStatsProcessorTest {
+    @RavenwoodConfig.Config
+    public static final RavenwoodConfig sConfig = new RavenwoodConfig.Builder()
+            .setProvideMainThread(true)
+            .build();
+
+    @Rule
+    public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule()
+            .setAveragePower(PowerProfile.POWER_CPU_IDLE, 720);
+
+    public static final int START_TIME = 12345;
+    private static final int APP_UID1 = Process.FIRST_APPLICATION_UID + 42;
+    private static final int APP_UID2 = Process.FIRST_APPLICATION_UID + 101;
+    private static final double PRECISION = 0.00001;
+
+    private PowerStatsAggregator mPowerStatsAggregator;
+
+    @Before
+    public void setup() {
+        AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig();
+        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_WAKELOCK)
+                .trackDeviceStates(STATE_POWER, STATE_SCREEN)
+                .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE)
+                .setProcessorSupplier(
+                        () -> new WakelockPowerStatsProcessor(mStatsRule.getPowerProfile()));
+        mPowerStatsAggregator = new PowerStatsAggregator(config);
+    }
+
+    @Test
+    public void wakelockDuration() {
+        BatteryStatsHistory history = prepareBatteryStatsHistory();
+        mPowerStatsAggregator.aggregatePowerStats(history, 0, Long.MAX_VALUE,
+                this::assertAggregatedPowerStats);
+    }
+
+    private BatteryStatsHistory prepareBatteryStatsHistory() {
+        WakelockPowerStatsLayout statsLayout = new WakelockPowerStatsLayout();
+        PersistableBundle extras = new PersistableBundle();
+        statsLayout.toExtras(extras);
+        PowerStats.Descriptor descriptor = new PowerStats.Descriptor(
+                BatteryConsumer.POWER_COMPONENT_WAKELOCK,
+                statsLayout.getDeviceStatsArrayLength(), null, 0,
+                statsLayout.getUidStatsArrayLength(), extras);
+        PowerStats ps = new PowerStats(descriptor);
+        long[] uidStats = new long[descriptor.uidStatsArrayLength];
+
+        BatteryStatsHistory history = new BatteryStatsHistory(null, null, 0, 10000,
+                mock(BatteryStatsHistory.HistoryStepDetailsCalculator.class),
+                mStatsRule.getMockClock(),
+                new MonotonicClock(START_TIME, mStatsRule.getMockClock()), null, null);
+        history.forceRecordAllHistory();
+        history.startRecordingHistory(0, 0, false);
+        history.recordProcessStateChange(0, 0, APP_UID1, PROCESS_STATE_BACKGROUND);
+        history.recordProcessStateChange(0, 0, APP_UID2, PROCESS_STATE_FOREGROUND);
+
+        // Establish a baseline
+        history.recordPowerStats(0, 0, ps);
+
+        ps.durationMs = 5000;
+        statsLayout.setUsageDuration(ps.stats, 2000);
+        statsLayout.setUidUsageDuration(uidStats, 2000);
+        ps.uidStats.put(APP_UID1, uidStats.clone());
+
+        history.recordPowerStats(5000, 2000, ps);
+
+        history.recordProcessStateChange(14000, 11000, APP_UID1, PROCESS_STATE_FOREGROUND_SERVICE);
+
+        history.setPluggedInState(true);
+        history.writeHistoryItem(18500, 15500);
+
+        ps.durationMs = 18000;
+        statsLayout.setUsageDuration(ps.stats, 10000);
+        statsLayout.setUidUsageDuration(uidStats, 2000);
+        ps.uidStats.put(APP_UID1, uidStats.clone());
+        statsLayout.setUidUsageDuration(uidStats, 8000);
+        ps.uidStats.put(APP_UID2, uidStats.clone());
+
+        history.recordPowerStats(23000, 20000, ps);
+
+        return history;
+    }
+
+    private void assertAggregatedPowerStats(AggregatedPowerStats aggregatedPowerStats) {
+        PowerComponentAggregatedPowerStats stats =
+                aggregatedPowerStats.getPowerComponentStats(POWER_COMPONENT_WAKELOCK);
+        PowerStats.Descriptor descriptor = stats.getPowerStatsDescriptor();
+        WakelockPowerStatsLayout statsLayout = new WakelockPowerStatsLayout(descriptor);
+        long[] deviceStats = new long[descriptor.statsArrayLength];
+        long[] uidStats = new long[descriptor.uidStatsArrayLength];
+
+        stats.getDeviceStats(deviceStats, states(POWER_STATE_BATTERY, SCREEN_STATE_ON));
+        assertThat(statsLayout.getUsageDuration(deviceStats)).isEqualTo(7500);
+        assertThat(statsLayout.getDevicePowerEstimate(deviceStats)).isWithin(PRECISION).of(1.50);
+
+        stats.getDeviceStats(deviceStats, states(POWER_STATE_OTHER, SCREEN_STATE_ON));
+        assertThat(statsLayout.getUsageDuration(deviceStats)).isEqualTo(2500);
+        assertThat(statsLayout.getDevicePowerEstimate(deviceStats)).isWithin(PRECISION).of(0.50);
+
+        stats.getUidStats(uidStats, APP_UID1,
+                states(POWER_STATE_BATTERY, SCREEN_STATE_ON, PROCESS_STATE_BACKGROUND));
+        assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(1000);
+        assertThat(statsLayout.getUidPowerEstimate(uidStats)).isWithin(PRECISION).of(0.20);
+
+        stats.getUidStats(uidStats, APP_UID1,
+                states(POWER_STATE_BATTERY, SCREEN_STATE_ON, PROCESS_STATE_FOREGROUND_SERVICE));
+        assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(500);
+        assertThat(statsLayout.getUidPowerEstimate(uidStats)).isWithin(PRECISION).of(0.10);
+
+        stats.getUidStats(uidStats, APP_UID1,
+                states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_FOREGROUND_SERVICE));
+        assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(500);
+        assertThat(statsLayout.getUidPowerEstimate(uidStats)).isWithin(PRECISION).of(0.10);
+
+        stats.getUidStats(uidStats, APP_UID2,
+                states(POWER_STATE_BATTERY, SCREEN_STATE_ON, PROCESS_STATE_FOREGROUND));
+        assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(6000);
+        assertThat(statsLayout.getUidPowerEstimate(uidStats)).isWithin(PRECISION).of(1.20);
+
+        stats.getUidStats(uidStats, APP_UID2,
+                states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_FOREGROUND));
+        assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(2000);
+        assertThat(statsLayout.getUidPowerEstimate(uidStats)).isWithin(PRECISION).of(0.40);
+    }
+
+    private int[] states(int... states) {
+        return states;
+    }
+}
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java
index baf468e..1e09769 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java
@@ -536,6 +536,7 @@
         PowerComponentAggregatedPowerStats aggregatedStats = new AggregatedPowerStats(config)
                 .getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_WIFI);
 
+        aggregatedStats.start(0);
         aggregatedStats.setState(STATE_POWER, POWER_STATE_OTHER, 0);
         aggregatedStats.setState(STATE_SCREEN, SCREEN_STATE_ON, 0);
         aggregatedStats.setUidState(APP_UID1, STATE_PROCESS_STATE, PROCESS_STATE_FOREGROUND, 0);
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/wakeups/CpuWakeupStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/wakeups/CpuWakeupStatsTest.java
index 0dc836b..fe4d971 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/wakeups/CpuWakeupStatsTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/wakeups/CpuWakeupStatsTest.java
@@ -17,6 +17,7 @@
 package com.android.server.power.stats.wakeups;
 
 import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_ALARM;
+import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_BLUETOOTH;
 import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_CELLULAR_DATA;
 import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_SENSOR;
 import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_SOUND_TRIGGER;
@@ -52,6 +53,7 @@
     private static final String KERNEL_REASON_SOUND_TRIGGER_IRQ = "129 test.sound_trigger.device";
     private static final String KERNEL_REASON_SENSOR_IRQ = "15 test.sensor.device";
     private static final String KERNEL_REASON_CELLULAR_DATA_IRQ = "18 test.cellular_data.device";
+    private static final String KERNEL_REASON_BLUETOOTH_IRQ = "19 test.bluetooth.device";
     private static final String KERNEL_REASON_UNKNOWN_IRQ = "140 test.unknown.device";
     private static final String KERNEL_REASON_UNKNOWN_FORMAT = "free-form-reason test.alarm.device";
     private static final String KERNEL_REASON_ALARM_ABNORMAL = "-1 test.alarm.device";
@@ -62,12 +64,14 @@
     private static final int TEST_UID_3 = 92261423;
     private static final int TEST_UID_4 = 56926423;
     private static final int TEST_UID_5 = 76421423;
+    private static final int TEST_UID_6 = 62345353;
 
     private static final int TEST_PROC_STATE_1 = 72331;
     private static final int TEST_PROC_STATE_2 = 792351;
     private static final int TEST_PROC_STATE_3 = 138831;
     private static final int TEST_PROC_STATE_4 = 23231;
     private static final int TEST_PROC_STATE_5 = 42;
+    private static final int TEST_PROC_STATE_6 = 129942;
 
     private static final Context sContext = InstrumentationRegistry.getTargetContext();
     private final Handler mHandler = Mockito.mock(Handler.class);
@@ -79,6 +83,7 @@
         obj.mUidProcStates.put(TEST_UID_3, TEST_PROC_STATE_3);
         obj.mUidProcStates.put(TEST_UID_4, TEST_PROC_STATE_4);
         obj.mUidProcStates.put(TEST_UID_5, TEST_PROC_STATE_5);
+        obj.mUidProcStates.put(TEST_UID_6, TEST_PROC_STATE_6);
     }
 
     @Test
@@ -118,6 +123,7 @@
                 CPU_WAKEUP_SUBSYSTEM_SOUND_TRIGGER,
                 CPU_WAKEUP_SUBSYSTEM_SENSOR,
                 CPU_WAKEUP_SUBSYSTEM_CELLULAR_DATA,
+                CPU_WAKEUP_SUBSYSTEM_BLUETOOTH,
         };
 
         final String[] kernelReasons = new String[] {
@@ -126,10 +132,11 @@
                 KERNEL_REASON_SOUND_TRIGGER_IRQ,
                 KERNEL_REASON_SENSOR_IRQ,
                 KERNEL_REASON_CELLULAR_DATA_IRQ,
+                KERNEL_REASON_BLUETOOTH_IRQ,
         };
 
         final int[] uids = new int[] {
-                TEST_UID_2, TEST_UID_3, TEST_UID_4, TEST_UID_1, TEST_UID_5
+                TEST_UID_2, TEST_UID_3, TEST_UID_4, TEST_UID_1, TEST_UID_5, TEST_UID_6
         };
 
         final int[] procStates = new int[] {
@@ -137,7 +144,8 @@
                 TEST_PROC_STATE_3,
                 TEST_PROC_STATE_4,
                 TEST_PROC_STATE_1,
-                TEST_PROC_STATE_5
+                TEST_PROC_STATE_5,
+                TEST_PROC_STATE_6
         };
 
         final int total = subsystems.length;
@@ -285,6 +293,40 @@
     }
 
     @Test
+    public void bluetoothIrqAttributionSolo() {
+        final CpuWakeupStats obj = new CpuWakeupStats(sContext, R.xml.irq_device_map_3, mHandler);
+        final long wakeupTime = 1236121;
+
+        populateDefaultProcStates(obj);
+
+        obj.noteWakeupTimeAndReason(wakeupTime, 1, KERNEL_REASON_BLUETOOTH_IRQ);
+
+        // Outside the window, so should be ignored.
+        obj.noteWakingActivity(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH,
+                wakeupTime - obj.mConfig.WAKEUP_MATCHING_WINDOW_MS - 1, TEST_UID_1);
+        obj.noteWakingActivity(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH,
+                wakeupTime + obj.mConfig.WAKEUP_MATCHING_WINDOW_MS + 1, TEST_UID_2);
+        // Should be attributed
+        obj.noteWakingActivity(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH, wakeupTime + 5, TEST_UID_3,
+                TEST_UID_5);
+
+        final SparseArray<SparseIntArray> attribution = obj.mWakeupAttribution.get(wakeupTime);
+        assertThat(attribution).isNotNull();
+        assertThat(attribution.size()).isEqualTo(1);
+        assertThat(attribution.contains(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH)).isTrue();
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH).indexOfKey(
+                TEST_UID_1)).isLessThan(0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH).indexOfKey(
+                TEST_UID_2)).isLessThan(0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH).get(TEST_UID_3)).isEqualTo(
+                TEST_PROC_STATE_3);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH).indexOfKey(
+                TEST_UID_4)).isLessThan(0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH).get(TEST_UID_5)).isEqualTo(
+                TEST_PROC_STATE_5);
+    }
+
+    @Test
     public void alarmAndWifiIrqAttribution() {
         final CpuWakeupStats obj = new CpuWakeupStats(sContext, R.xml.irq_device_map_3, mHandler);
         final long wakeupTime = 92123210;
@@ -400,6 +442,47 @@
     }
 
     @Test
+    public void unknownAndBluetoothAttribution() {
+        final CpuWakeupStats obj = new CpuWakeupStats(sContext, R.xml.irq_device_map_3, mHandler);
+        final long wakeupTime = 92123520;
+
+        populateDefaultProcStates(obj);
+
+        obj.noteWakeupTimeAndReason(wakeupTime, 24,
+                KERNEL_REASON_UNKNOWN_IRQ + ":" + KERNEL_REASON_BLUETOOTH_IRQ);
+
+        // Bluetooth activity
+        // Outside the window, so should be ignored.
+        obj.noteWakingActivity(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH,
+                wakeupTime - obj.mConfig.WAKEUP_MATCHING_WINDOW_MS - 1, TEST_UID_4);
+        // Should be attributed
+        obj.noteWakingActivity(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH, wakeupTime + 2, TEST_UID_1);
+        obj.noteWakingActivity(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH, wakeupTime - 1, TEST_UID_3,
+                TEST_UID_5);
+
+        // Unrelated, should be ignored.
+        obj.noteWakingActivity(CPU_WAKEUP_SUBSYSTEM_ALARM, wakeupTime + 5, TEST_UID_3);
+
+        final SparseArray<SparseIntArray> attribution = obj.mWakeupAttribution.get(wakeupTime);
+        assertThat(attribution).isNotNull();
+        assertThat(attribution.size()).isEqualTo(2);
+        assertThat(attribution.contains(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH)).isTrue();
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH).get(TEST_UID_1)).isEqualTo(
+                TEST_PROC_STATE_1);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH)
+                .indexOfKey(TEST_UID_2)).isLessThan(0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH).get(TEST_UID_3)).isEqualTo(
+                TEST_PROC_STATE_3);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH)
+                .indexOfKey(TEST_UID_4)).isLessThan(0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_BLUETOOTH).get(TEST_UID_5)).isEqualTo(
+                TEST_PROC_STATE_5);
+        assertThat(attribution.contains(CPU_WAKEUP_SUBSYSTEM_UNKNOWN)).isTrue();
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_UNKNOWN)).isNull();
+        assertThat(attribution.contains(CPU_WAKEUP_SUBSYSTEM_ALARM)).isFalse();
+    }
+
+    @Test
     public void unknownFormatWakeupIgnored() {
         final CpuWakeupStats obj = new CpuWakeupStats(sContext, R.xml.irq_device_map_3, mHandler);
         final long wakeupTime = 72123210;
diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp
index ac1b7c6..6ede334 100644
--- a/services/tests/servicestests/Android.bp
+++ b/services/tests/servicestests/Android.bp
@@ -52,6 +52,7 @@
         "services.credentials",
         "services.devicepolicy",
         "services.flags",
+        "com.android.server.flags.services-aconfig-java",
         "services.net",
         "services.people",
         "services.supervision",
@@ -81,6 +82,7 @@
         // TODO: remove once Android migrates to JUnit 4.12,
         // which provides assertThrows
         "testng",
+        "flag-junit",
         "junit",
         "junit-params",
         "ActivityContext",
@@ -228,6 +230,20 @@
 }
 
 java_library {
+    name: "servicestests-utils-ravenwood",
+    srcs: [
+        "utils/**/*.java",
+        "utils/**/*.kt",
+        "utils-mockito/**/*.kt",
+    ],
+    libs: [
+        "android.test.runner.stubs.system",
+        "junit",
+        "mockito-ravenwood-prebuilt",
+    ],
+}
+
+java_library {
     name: "mockito-test-utils",
     srcs: [
         "utils-mockito/**/*.kt",
diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index 2724149..c645c08 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -113,6 +113,7 @@
     <uses-permission android:name="android.permission.MANAGE_ROLE_HOLDERS" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.CAMERA" />
+    <uses-permission android:name="android.permission.CREATE_VIRTUAL_DEVICE" />
 
     <queries>
         <package android:name="com.android.servicestests.apps.suspendtestapp" />
diff --git a/services/tests/servicestests/src/com/android/server/PinnerServiceTest.java b/services/tests/servicestests/src/com/android/server/PinnerServiceTest.java
index ec78bce..c18faef 100644
--- a/services/tests/servicestests/src/com/android/server/PinnerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/PinnerServiceTest.java
@@ -31,6 +31,9 @@
 import android.os.Binder;
 import android.os.Handler;
 import android.os.Looper;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.provider.DeviceConfig;
 import android.provider.DeviceConfigInterface;
 import android.testing.TestableContext;
@@ -43,6 +46,9 @@
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.server.flags.Flags;
+import com.android.server.pinner.PinnedFile;
+import com.android.server.pinner.PinnerService;
 import com.android.server.testutils.FakeDeviceConfigInterface;
 import com.android.server.wm.ActivityTaskManagerInternal;
 
@@ -73,15 +79,18 @@
 
     private static final long WAIT_FOR_PINNER_TIMEOUT = TimeUnit.SECONDS.toMillis(2);
 
+    private static final int MEMORY_PERCENTAGE_FOR_QUOTA = 10;
+
     @Rule
     public TestableContext mContext =
             new TestableContext(InstrumentationRegistry.getContext(), null);
 
+    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
     private final ArraySet<String> mUpdatedPackages = new ArraySet<>();
     private ResolveInfo mHomePackageResolveInfo;
     private FakeDeviceConfigInterface mFakeDeviceConfigInterface;
     private PinnerService.Injector mInjector;
-
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
@@ -114,6 +123,8 @@
         resources.addOverride(com.android.internal.R.bool.config_pinnerCameraApp, false);
         resources.addOverride(com.android.internal.R.integer.config_pinnerHomePinBytes, 0);
         resources.addOverride(com.android.internal.R.bool.config_pinnerAssistantApp, false);
+        resources.addOverride(com.android.internal.R.integer.config_pinnerMaxPinnedMemoryPercentage,
+                MEMORY_PERCENTAGE_FOR_QUOTA);
 
         mFakeDeviceConfigInterface = new FakeDeviceConfigInterface();
         setDeviceConfigPinnedAnonSize(0);
@@ -138,10 +149,9 @@
             }
 
             @Override
-            protected PinnerService.PinnedFile pinFileInternal(String fileToPin,
-                    int maxBytesToPin, boolean attemptPinIntrospection) {
-                return new PinnerService.PinnedFile(-1,
-                        maxBytesToPin, fileToPin, maxBytesToPin);
+            protected PinnedFile pinFileInternal(PinnerService service, String fileToPin,
+                    long maxBytesToPin, boolean attemptPinIntrospection) {
+                return new PinnedFile(-1, maxBytesToPin, fileToPin, maxBytesToPin);
             }
         };
     }
@@ -167,6 +177,12 @@
         unpinAnonRegionMethod.invoke(pinnerService);
     }
 
+    private long getGlobalPinQuota(PinnerService service) throws Exception {
+        Method getQuotaMethod = PinnerService.class.getDeclaredMethod("getAvailableGlobalQuota");
+        getQuotaMethod.setAccessible(true);
+        return (long) getQuotaMethod.invoke(service);
+    }
+
     private void waitForPinnerService(PinnerService pinnerService)
             throws NoSuchFieldException, IllegalAccessException {
         // There's no notification/callback when pinning finished
@@ -315,15 +331,121 @@
         PinnerService pinnerService = new PinnerService(mContext, mInjector);
         pinnerService.onStart();
 
-        pinnerService.pinFile("test_file", 4096, null, "my_group");
+        pinnerService.pinFile("test_file", 4096, null, "my_group", false);
 
-        assertThat(getPinnedSize(pinnerService)).isGreaterThan(0);
-        assertThat(getTotalPinnedFiles(pinnerService)).isGreaterThan(0);
+        assertThat(getPinnedSize(pinnerService)).isEqualTo(4096);
+        assertThat(getTotalPinnedFiles(pinnerService)).isEqualTo(1);
 
         unpinAll(pinnerService);
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_PIN_GLOBAL_QUOTA)
+    public void testPinAllQuota() throws Exception {
+        PinnerService pinnerService = new PinnerService(mContext, mInjector);
+        pinnerService.onStart();
+
+        long quota = getGlobalPinQuota(pinnerService);
+
+        pinnerService.pinFile("test_file", Long.MAX_VALUE, null, "my_group", false);
+
+        assertThat(getPinnedSize(pinnerService)).isEqualTo(quota);
+
+        unpinAll(pinnerService);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PIN_GLOBAL_QUOTA)
+    public void testGlobalPinQuotaAsDevicePercentage() throws Exception {
+        PinnerService pinnerService = new PinnerService(mContext, mInjector);
+        pinnerService.onStart();
+        long origQuota = getGlobalPinQuota(pinnerService);
+
+        long totalMem = android.os.Process.getTotalMemory();
+
+        // Verify that pin quota is the set percentage of device total memory
+        assertThat(origQuota).isEqualTo((totalMem * MEMORY_PERCENTAGE_FOR_QUOTA) / 100);
+
+        pinnerService.pinFile("test_file", 4096, null, "my_group", false);
+        assertThat(getGlobalPinQuota(pinnerService)).isEqualTo(origQuota - 4096);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PIN_GLOBAL_QUOTA)
+    public void testGlobalPinWhenNoQuota() throws Exception {
+        TestableResources resources = mContext.getOrCreateTestableResources();
+        resources.addOverride(
+                com.android.internal.R.integer.config_pinnerMaxPinnedMemoryPercentage, 0);
+
+        PinnerService pinnerService = new PinnerService(mContext, mInjector);
+        pinnerService.onStart();
+
+        // Verify that pin quota is zero
+        assertThat(getGlobalPinQuota(pinnerService)).isEqualTo(0);
+
+        pinnerService.pinFile("test_file", 4096, null, "my_group", false);
+        assertThat(getTotalPinnedFiles(pinnerService)).isEqualTo(0);
+    }
+
+    /**
+     * This test is temporary, it should be cleaned up when removing the pin_global_quota bugfix
+     * flag.
+     */
+    @Test
+    @DisableFlags(Flags.FLAG_PIN_GLOBAL_QUOTA)
+    public void testGlobalQuotaDisabled() throws Exception {
+        TestableResources resources = mContext.getOrCreateTestableResources();
+        resources.addOverride(
+                com.android.internal.R.integer.config_pinnerMaxPinnedMemoryPercentage, 0);
+
+        PinnerService pinnerService = new PinnerService(mContext, mInjector);
+        pinnerService.onStart();
+
+        // The quota parameter exists but it should have no effect on pinning
+        long quota = getGlobalPinQuota(pinnerService);
+
+        pinnerService.pinFile("test_file", quota + 1, null, "my_group", false);
+
+        // Verify that we can pin past the quota as it is disabled
+        assertThat(getPinnedSize(pinnerService)).isEqualTo(quota + 1);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PIN_GLOBAL_QUOTA)
+    public void testUnpinReleasesQuota() throws Exception {
+        PinnerService pinnerService = new PinnerService(mContext, mInjector);
+        pinnerService.onStart();
+        long origQuota = getGlobalPinQuota(pinnerService);
+
+        // Verify that pin quota exists and is non zero.
+        assertThat(getGlobalPinQuota(pinnerService)).isGreaterThan(0);
+
+        pinnerService.pinFile("test_file", origQuota, null, "my_group", false);
+
+        // Make sure all the quota was consumed
+        assertThat(getPinnedSize(pinnerService)).isEqualTo(origQuota);
+
+        // Unpin the file and verify that the quota has been released.
+        pinnerService.unpinFile("test_file");
+        assertThat(getPinnedSize(pinnerService)).isEqualTo(0);
+        assertThat(getGlobalPinQuota(pinnerService)).isEqualTo(origQuota);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PIN_GLOBAL_QUOTA)
+    public void testGlobalPinQuotaNegative() throws Exception {
+        TestableResources resources = mContext.getOrCreateTestableResources();
+        resources.addOverride(
+                com.android.internal.R.integer.config_pinnerMaxPinnedMemoryPercentage, -10);
+
+        PinnerService pinnerService = new PinnerService(mContext, mInjector);
+        pinnerService.onStart();
+
+        // Verify that pin quota is zero
+        assertThat(getGlobalPinQuota(pinnerService)).isEqualTo(0);
+    }
+
+    @Test
     public void testPinAnonRegion() throws Exception {
         setDeviceConfigPinnedAnonSize(32768);
 
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java
index 6e6d5a8..8dfd54f 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java
@@ -174,8 +174,8 @@
     @Mock private AccessibilityTrace mMockA11yTrace;
     @Mock private WindowManagerInternal mMockWindowManagerInternal;
     @Mock private SystemActionPerformer mMockSystemActionPerformer;
-    @Mock private IBinder mMockService;
-    @Mock private IAccessibilityServiceClient mMockServiceInterface;
+    @Mock private IBinder mMockClientBinder;
+    @Mock private IAccessibilityServiceClient mMockClient;
     @Mock private KeyEventDispatcher mMockKeyEventDispatcher;
     @Mock private IAccessibilityInteractionConnection mMockIA11yInteractionConnection;
     @Mock private IAccessibilityInteractionConnectionCallback mMockCallback;
@@ -247,9 +247,9 @@
                 mSpyServiceInfo, SERVICE_ID, mHandler, new Object(), mMockSecurityPolicy,
                 mMockSystemSupport, mMockA11yTrace, mMockWindowManagerInternal,
                 mMockSystemActionPerformer, mMockA11yWindowManager);
-        // Assume that the service is connected
-        mServiceConnection.mService = mMockService;
-        mServiceConnection.mServiceInterface = mMockServiceInterface;
+        // Assume that the client is connected
+        mServiceConnection.mClientBinder = mMockClientBinder;
+        mServiceConnection.mClient = mMockClient;
 
         // Update security policy for this service
         when(mMockSecurityPolicy.checkAccessibilityAccess(mServiceConnection)).thenReturn(true);
@@ -273,7 +273,7 @@
         final KeyEvent mockKeyEvent = mock(KeyEvent.class);
 
         mServiceConnection.onKeyEvent(mockKeyEvent, sequenceNumber);
-        verify(mMockServiceInterface).onKeyEvent(mockKeyEvent, sequenceNumber);
+        verify(mMockClient).onKeyEvent(mockKeyEvent, sequenceNumber);
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
index 566feb7..7481fc8 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
@@ -63,8 +63,11 @@
 import android.Manifest;
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.accessibilityservice.IAccessibilityServiceClient;
+import android.annotation.NonNull;
 import android.app.PendingIntent;
 import android.app.RemoteAction;
+import android.app.admin.DevicePolicyManager;
+import android.app.ecm.EnhancedConfirmationManager;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -212,6 +215,7 @@
     @Mock private FullScreenMagnificationController mMockFullScreenMagnificationController;
     @Mock private ProxyManager mProxyManager;
     @Mock private StatusBarManagerInternal mStatusBarManagerInternal;
+    @Mock private DevicePolicyManager mDevicePolicyManager;
     @Spy private IUserInitializationCompleteCallback mUserInitializationCompleteCallback;
     @Captor private ArgumentCaptor<Intent> mIntentArgumentCaptor;
     private IAccessibilityManager mA11yManagerServiceOnDevice;
@@ -241,6 +245,7 @@
                 UserManagerInternal.class, mMockUserManagerInternal);
         LocalServices.addService(StatusBarManagerInternal.class, mStatusBarManagerInternal);
         mInputFilter = mock(FakeInputFilter.class);
+        mTestableContext.addMockSystemService(DevicePolicyManager.class, mDevicePolicyManager);
 
         when(mMockMagnificationController.getMagnificationConnectionManager()).thenReturn(
                 mMockMagnificationConnectionManager);
@@ -2160,6 +2165,24 @@
                 .isEqualTo(SOFTWARE);
     }
 
+    @Test
+    @EnableFlags({android.permission.flags.Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED,
+            android.security.Flags.FLAG_EXTEND_ECM_TO_ALL_SETTINGS})
+    public void isAccessibilityTargetAllowed_nonSystemUserId_useEcmWithNonSystemUserId() {
+        String fakePackageName = "FAKE_PACKAGE_NAME";
+        int uid = 0; // uid is not used in the actual implementation when flags are on
+        int userId = mTestableContext.getUserId() + 1234;
+        when(mDevicePolicyManager.getPermittedAccessibilityServices(userId)).thenReturn(
+                List.of(fakePackageName));
+        Context mockUserContext = mock(Context.class);
+        mTestableContext.addMockUserContext(userId, mockUserContext);
+
+        mA11yms.isAccessibilityTargetAllowed(fakePackageName, uid, userId);
+
+        verify(mockUserContext).getSystemService(EnhancedConfirmationManager.class);
+    }
+
+
     private Set<String> readStringsFromSetting(String setting) {
         final Set<String> result = new ArraySet<>();
         mA11yms.readColonDelimitedSettingToSet(
@@ -2280,6 +2303,7 @@
 
         private final Context mMockContext;
         private final Map<String, List<BroadcastReceiver>> mBroadcastReceivers = new ArrayMap<>();
+        private ArrayMap<Integer, Context> mMockUserContexts = new ArrayMap<>();
 
         A11yTestableContext(Context base) {
             super(base);
@@ -2317,6 +2341,19 @@
             return mMockContext;
         }
 
+        public void addMockUserContext(int userId, Context context) {
+            mMockUserContexts.put(userId, context);
+        }
+
+        @Override
+        @NonNull
+        public Context createContextAsUser(UserHandle user, int flags) {
+            if (mMockUserContexts.containsKey(user.getIdentifier())) {
+                return mMockUserContexts.get(user.getIdentifier());
+            }
+            return super.createContextAsUser(user, flags);
+        }
+
         Map<String, List<BroadcastReceiver>> getBroadcastReceivers() {
             return mBroadcastReceivers;
         }
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java
index 1426d5d..c4b4afd 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java
@@ -69,6 +69,7 @@
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.internal.R;
+import com.android.internal.os.BackgroundThread;
 import com.android.internal.util.ConcurrentUtils;
 import com.android.internal.util.test.FakeSettingsProvider;
 import com.android.server.LocalServices;
@@ -92,6 +93,8 @@
 import org.testng.Assert;
 
 import java.util.Locale;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
 
 @RunWith(AndroidJUnit4.class)
 public class FullScreenMagnificationControllerTest {
@@ -1440,19 +1443,42 @@
 
     @Test
     public void persistScale_setValueWhenScaleIsOne_nothingChanged() {
+        register(TEST_DISPLAY);
         final float persistedScale =
                 mFullScreenMagnificationController.getPersistedScale(TEST_DISPLAY);
 
         PointF pivotPoint = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER;
-        mFullScreenMagnificationController.setScale(DISPLAY_0, 1.0f, pivotPoint.x, pivotPoint.y,
+        mFullScreenMagnificationController.setScale(TEST_DISPLAY, 1.0f, pivotPoint.x, pivotPoint.y,
                 false, SERVICE_ID_1);
         mFullScreenMagnificationController.persistScale(TEST_DISPLAY);
 
+        // persistScale may post a task to a background thread. Let's wait for it completes.
+        waitForBackgroundThread();
         Assert.assertEquals(mFullScreenMagnificationController.getPersistedScale(TEST_DISPLAY),
                 persistedScale);
     }
 
     @Test
+    public void persistScale_setValuesOnMultipleDisplays() {
+        register(DISPLAY_0);
+        register(DISPLAY_1);
+        final PointF pivotPoint = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER;
+        mFullScreenMagnificationController.setScale(DISPLAY_0, 3.0f, pivotPoint.x, pivotPoint.y,
+                false, SERVICE_ID_1);
+        mFullScreenMagnificationController.persistScale(DISPLAY_0);
+        mFullScreenMagnificationController.setScale(DISPLAY_1, 4.0f, pivotPoint.x, pivotPoint.y,
+                false, SERVICE_ID_1);
+        mFullScreenMagnificationController.persistScale(DISPLAY_1);
+
+        // persistScale may post a task to a background thread. Let's wait for it completes.
+        waitForBackgroundThread();
+        Assert.assertEquals(mFullScreenMagnificationController.getPersistedScale(DISPLAY_0),
+                3.0f);
+        Assert.assertEquals(mFullScreenMagnificationController.getPersistedScale(DISPLAY_1),
+                4.0f);
+    }
+
+    @Test
     public void testOnContextChanged_alwaysOnFeatureDisabled_resetMagnification() {
         setScaleToMagnifying();
 
@@ -1494,6 +1520,15 @@
         );
     }
 
+    private static void waitForBackgroundThread() {
+        final CompletableFuture<Void> future = new CompletableFuture<>();
+        BackgroundThread.getHandler().post(() -> future.complete(null));
+        try {
+            future.get();
+        } catch (InterruptedException | ExecutionException ignore) {
+        }
+    }
+
     private void setScaleToMagnifying() {
         register(DISPLAY_0);
         float scale = 2.0f;
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionManagerTest.java
index 87fe6cf..6aa8a32 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionManagerTest.java
@@ -300,7 +300,8 @@
         mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
         mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 2.5f, NaN, NaN);
 
-        mMagnificationConnectionManager.setScale(TEST_DISPLAY, 10.0f);
+        mMagnificationConnectionManager.setScale(TEST_DISPLAY,
+                MagnificationScaleProvider.MAX_SCALE * 2.f);
 
         assertEquals(mMagnificationConnectionManager.getScale(TEST_DISPLAY),
                 MagnificationScaleProvider.MAX_SCALE);
diff --git a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
index b9ce8ad..0c92abc 100644
--- a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
@@ -1163,6 +1163,16 @@
 
         verify(mMockAccountManagerResponse).onResult(mBundleCaptor.capture());
         Bundle result = mBundleCaptor.getValue();
+        Bundle sessionBundle = result.getBundle(AccountManager.KEY_ACCOUNT_SESSION_BUNDLE);
+        assertNotNull(sessionBundle);
+        // Assert that session bundle is decrypted and hence data is visible.
+        assertEquals(AccountManagerServiceTestFixtures.SESSION_DATA_VALUE_1,
+                sessionBundle.getString(AccountManagerServiceTestFixtures.SESSION_DATA_NAME_1));
+        // Assert finishSessionAsUser added calling uid and pid into the sessionBundle
+        assertTrue(sessionBundle.containsKey(AccountManager.KEY_CALLER_UID));
+        assertTrue(sessionBundle.containsKey(AccountManager.KEY_CALLER_PID));
+        assertEquals(sessionBundle.getString(
+                AccountManager.KEY_ANDROID_PACKAGE_NAME), "APCT.package");
 
         // Verify response data
         assertNull(result.getString(AccountManager.KEY_AUTHTOKEN, null));
@@ -2111,6 +2121,12 @@
                 result.getString(AccountManager.KEY_ACCOUNT_NAME));
         assertEquals(AccountManagerServiceTestFixtures.ACCOUNT_TYPE_1,
                 result.getString(AccountManager.KEY_ACCOUNT_TYPE));
+
+        Bundle optionBundle = result.getParcelable(
+                AccountManagerServiceTestFixtures.KEY_OPTIONS_BUNDLE);
+        // Assert addAccountAsUser added calling uid and pid into the option bundle
+        assertTrue(optionBundle.containsKey(AccountManager.KEY_CALLER_UID));
+        assertTrue(optionBundle.containsKey(AccountManager.KEY_CALLER_PID));
     }
 
     @SmallTest
@@ -3441,52 +3457,6 @@
                 + (readTotalTime.doubleValue() / readerCount / loopSize));
     }
 
-    @SmallTest
-    public void testSanitizeBundle_expectedFields() throws Exception {
-        Bundle bundle = new Bundle();
-        bundle.putString(AccountManager.KEY_ACCOUNT_NAME, "name");
-        bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, "type");
-        bundle.putString(AccountManager.KEY_AUTHTOKEN, "token");
-        bundle.putString(AccountManager.KEY_AUTH_TOKEN_LABEL, "label");
-        bundle.putString(AccountManager.KEY_ERROR_MESSAGE, "error message");
-        bundle.putString(AccountManager.KEY_PASSWORD, "password");
-        bundle.putString(AccountManager.KEY_ACCOUNT_STATUS_TOKEN, "status");
-
-        bundle.putLong(AbstractAccountAuthenticator.KEY_CUSTOM_TOKEN_EXPIRY, 123L);
-        bundle.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
-        bundle.putInt(AccountManager.KEY_ERROR_CODE, 456);
-
-        Bundle sanitizedBundle = AccountManagerService.sanitizeBundle(bundle);
-        assertEquals(sanitizedBundle.getString(AccountManager.KEY_ACCOUNT_NAME), "name");
-        assertEquals(sanitizedBundle.getString(AccountManager.KEY_ACCOUNT_TYPE), "type");
-        assertEquals(sanitizedBundle.getString(AccountManager.KEY_AUTHTOKEN), "token");
-        assertEquals(sanitizedBundle.getString(AccountManager.KEY_AUTH_TOKEN_LABEL), "label");
-        assertEquals(sanitizedBundle.getString(AccountManager.KEY_ERROR_MESSAGE), "error message");
-        assertEquals(sanitizedBundle.getString(AccountManager.KEY_PASSWORD), "password");
-        assertEquals(sanitizedBundle.getString(AccountManager.KEY_ACCOUNT_STATUS_TOKEN), "status");
-
-        assertEquals(sanitizedBundle.getLong(
-                AbstractAccountAuthenticator.KEY_CUSTOM_TOKEN_EXPIRY, 0), 123L);
-        assertEquals(sanitizedBundle.getBoolean(AccountManager.KEY_BOOLEAN_RESULT, false), true);
-        assertEquals(sanitizedBundle.getInt(AccountManager.KEY_ERROR_CODE, 0), 456);
-    }
-
-    @SmallTest
-    public void testSanitizeBundle_filtersUnexpectedFields() throws Exception {
-        Bundle bundle = new Bundle();
-        bundle.putString(AccountManager.KEY_ACCOUNT_NAME, "name");
-        bundle.putString("unknown_key", "value");
-        Bundle sessionBundle = new Bundle();
-        bundle.putBundle(AccountManager.KEY_ACCOUNT_SESSION_BUNDLE, sessionBundle);
-
-        Bundle sanitizedBundle = AccountManagerService.sanitizeBundle(bundle);
-
-        assertEquals(sanitizedBundle.getString(AccountManager.KEY_ACCOUNT_NAME), "name");
-        assertFalse(sanitizedBundle.containsKey("unknown_key"));
-        // It is a valid response from Authenticator which will be accessed using original Bundle
-        assertFalse(sanitizedBundle.containsKey(AccountManager.KEY_ACCOUNT_SESSION_BUNDLE));
-    }
-
     private void waitForCyclicBarrier(CyclicBarrier cyclicBarrier) {
         try {
             cyclicBarrier.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java
index c970a3e..840e5c5 100644
--- a/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java
@@ -65,7 +65,6 @@
             VirtualDeviceRule.withAdditionalPermissions(
                     Manifest.permission.GRANT_RUNTIME_PERMISSIONS,
                     Manifest.permission.REVOKE_RUNTIME_PERMISSIONS,
-                    Manifest.permission.CREATE_VIRTUAL_DEVICE,
                     Manifest.permission.GET_APP_OPS_STATS
             );
     private static final long NOTIFICATION_TIMEOUT_MILLIS = 5000;
diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsDeviceAwareServiceTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsDeviceAwareServiceTest.java
index 7f2327aa..e3eca6d 100644
--- a/services/tests/servicestests/src/com/android/server/appop/AppOpsDeviceAwareServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsDeviceAwareServiceTest.java
@@ -58,7 +58,6 @@
             VirtualDeviceRule.withAdditionalPermissions(
                     Manifest.permission.GRANT_RUNTIME_PERMISSIONS,
                     Manifest.permission.REVOKE_RUNTIME_PERMISSIONS,
-                    Manifest.permission.CREATE_VIRTUAL_DEVICE,
                     Manifest.permission.GET_APP_OPS_STATS);
 
     private static final String ATTRIBUTION_TAG_1 = "attributionTag1";
diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java
index 1abd4eb..b0846f6 100644
--- a/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java
@@ -22,16 +22,14 @@
 import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
 
 import android.app.AppOpsManager;
 import android.app.AppOpsManager.OnOpNotedListener;
 import android.companion.virtual.VirtualDeviceManager;
-import android.companion.virtual.VirtualDeviceParams;
 import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Process;
-import android.virtualdevice.cts.common.FakeAssociationRule;
+import android.virtualdevice.cts.common.VirtualDeviceRule;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
@@ -42,8 +40,6 @@
 import org.junit.runner.RunWith;
 import org.mockito.InOrder;
 
-import java.util.concurrent.atomic.AtomicInteger;
-
 /**
  * Tests watching noted ops.
  */
@@ -51,7 +47,7 @@
 @RunWith(AndroidJUnit4.class)
 public class AppOpsNotedWatcherTest {
     @Rule
-    public FakeAssociationRule mFakeAssociationRule = new FakeAssociationRule();
+    public VirtualDeviceRule mVirtualDeviceRule = VirtualDeviceRule.createDefault();
     private static final long NOTIFICATION_TIMEOUT_MILLIS = 5000;
 
     @Test
@@ -119,19 +115,12 @@
     public void testWatchNotedOpsForExternalDevice() {
         final AppOpsManager.OnOpNotedListener listener = mock(
                 AppOpsManager.OnOpNotedListener.class);
-        final VirtualDeviceManager virtualDeviceManager = getContext().getSystemService(
-                VirtualDeviceManager.class);
-        AtomicInteger virtualDeviceId = new AtomicInteger();
-        runWithShellPermissionIdentity(() -> {
-            final VirtualDeviceManager.VirtualDevice virtualDevice =
-                    virtualDeviceManager.createVirtualDevice(
-                            mFakeAssociationRule.getAssociationInfo().getId(),
-                            new VirtualDeviceParams.Builder().setName("virtual_device").build());
-            virtualDeviceId.set(virtualDevice.getDeviceId());
-        });
+        final VirtualDeviceManager.VirtualDevice virtualDevice =
+                mVirtualDeviceRule.createManagedVirtualDevice();
+        final int virtualDeviceId = virtualDevice.getDeviceId();
         AttributionSource attributionSource = new AttributionSource(Process.myUid(),
                 getContext().getOpPackageName(), getContext().getAttributionTag(),
-                virtualDeviceId.get());
+                virtualDeviceId);
 
         final AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class);
         appOpsManager.startWatchingNoted(new int[]{AppOpsManager.OP_FINE_LOCATION,
@@ -142,7 +131,7 @@
         verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
                 .times(1)).onOpNoted(eq(AppOpsManager.OPSTR_FINE_LOCATION),
                 eq(Process.myUid()), eq(getContext().getOpPackageName()),
-                eq(getContext().getAttributionTag()), eq(virtualDeviceId.get()),
+                eq(getContext().getAttributionTag()), eq(virtualDeviceId),
                 eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED));
 
         appOpsManager.finishOp(getContext().getAttributionSource().getToken(),
diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java
index 8a6ba4d..d46fb90 100644
--- a/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java
@@ -16,8 +16,6 @@
 
 package com.android.server.appop;
 
-import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
-
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.mock;
@@ -28,11 +26,10 @@
 import android.app.AppOpsManager;
 import android.app.AppOpsManager.OnOpStartedListener;
 import android.companion.virtual.VirtualDeviceManager;
-import android.companion.virtual.VirtualDeviceParams;
 import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Process;
-import android.virtualdevice.cts.common.FakeAssociationRule;
+import android.virtualdevice.cts.common.VirtualDeviceRule;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
@@ -43,15 +40,13 @@
 import org.junit.runner.RunWith;
 import org.mockito.InOrder;
 
-import java.util.concurrent.atomic.AtomicInteger;
-
 /** Tests watching started ops. */
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 public class AppOpsStartedWatcherTest {
 
     @Rule
-    public FakeAssociationRule mFakeAssociationRule = new FakeAssociationRule();
+    public VirtualDeviceRule mVirtualDeviceRule = VirtualDeviceRule.createDefault();
     private static final long NOTIFICATION_TIMEOUT_MILLIS = 5000;
 
     @Test
@@ -124,20 +119,13 @@
 
     @Test
     public void testWatchStartedOpsForExternalDevice() {
-        final VirtualDeviceManager virtualDeviceManager = getContext().getSystemService(
-                VirtualDeviceManager.class);
-        AtomicInteger virtualDeviceId = new AtomicInteger();
-        runWithShellPermissionIdentity(() -> {
-            final VirtualDeviceManager.VirtualDevice virtualDevice =
-                    virtualDeviceManager.createVirtualDevice(
-                            mFakeAssociationRule.getAssociationInfo().getId(),
-                            new VirtualDeviceParams.Builder().setName("virtual_device").build());
-            virtualDeviceId.set(virtualDevice.getDeviceId());
-        });
+        final VirtualDeviceManager.VirtualDevice virtualDevice =
+                mVirtualDeviceRule.createManagedVirtualDevice();
+        final int virtualDeviceId = virtualDevice.getDeviceId();
         final OnOpStartedListener listener = mock(OnOpStartedListener.class);
         AttributionSource attributionSource = new AttributionSource(Process.myUid(),
                 getContext().getOpPackageName(), getContext().getAttributionTag(),
-                virtualDeviceId.get());
+                virtualDeviceId);
 
         final AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class);
         appOpsManager.startWatchingStarted(new int[]{AppOpsManager.OP_FINE_LOCATION,
@@ -150,7 +138,7 @@
         verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
                 .times(1)).onOpStarted(eq(AppOpsManager.OP_FINE_LOCATION),
                 eq(Process.myUid()), eq(getContext().getOpPackageName()),
-                eq(getContext().getAttributionTag()), eq(virtualDeviceId.get()),
+                eq(getContext().getAttributionTag()), eq(virtualDeviceId),
                 eq(AppOpsManager.OP_FLAG_SELF),
                 eq(AppOpsManager.MODE_ALLOWED), eq(OnOpStartedListener.START_TYPE_STARTED),
                 eq(AppOpsManager.ATTRIBUTION_FLAGS_NONE),
diff --git a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceVolumeManagerTest.java b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceVolumeManagerTest.java
index 4645156..3e2949d6 100644
--- a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceVolumeManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceVolumeManagerTest.java
@@ -16,7 +16,9 @@
 
 package com.android.server.audio;
 
+import static com.android.media.audio.Flags.FLAG_ABS_VOLUME_INDEX_FIX;
 import static com.android.media.audio.Flags.FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME;
+import static com.android.media.audio.Flags.absVolumeIndexFix;
 
 import static org.mockito.Mockito.atLeast;
 import static org.mockito.Mockito.mock;
@@ -116,7 +118,7 @@
     }
 
     @Test
-    @RequiresFlagsDisabled(FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME)
+    @RequiresFlagsDisabled({FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME, FLAG_ABS_VOLUME_INDEX_FIX})
     public void configurablePreScaleAbsoluteVolume_checkIndex() throws Exception {
         AudioManager am = mContext.getSystemService(AudioManager.class);
         final int minIndex = am.getStreamMinVolume(AudioManager.STREAM_MUSIC);
@@ -177,6 +179,7 @@
         final AudioDeviceAttributes bleDevice = new AudioDeviceAttributes(
                 /*native type*/ AudioSystem.DEVICE_OUT_BLE_HEADSET, /*address*/ "bla");
         final int maxPreScaleIndex = 3;
+        int passedIndex = maxIndex;
 
         for (int i = 0; i < maxPreScaleIndex; i++) {
             final VolumeInfo volCur = new VolumeInfo.Builder(volMedia)
@@ -185,9 +188,12 @@
             mAudioService.setDeviceVolume(volCur, bleDevice, mPackageName);
             mTestLooper.dispatchAll();
 
+            if (absVolumeIndexFix()) {
+                passedIndex = i + 1;
+            }
             // Stream volume changes
             verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS(
-                            AudioManager.STREAM_MUSIC, maxIndex,
+                            AudioManager.STREAM_MUSIC, passedIndex,
                             AudioSystem.DEVICE_OUT_BLE_HEADSET);
         }
 
@@ -197,8 +203,11 @@
         mAudioService.setDeviceVolume(volIndex4, bleDevice, mPackageName);
         mTestLooper.dispatchAll();
 
+        if (absVolumeIndexFix()) {
+            passedIndex = 4;
+        }
         verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS(
-                        AudioManager.STREAM_MUSIC, maxIndex,
+                        AudioManager.STREAM_MUSIC, passedIndex,
                         AudioSystem.DEVICE_OUT_BLE_HEADSET);
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java b/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java
index beed0a3d..dc8c1b9 100644
--- a/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java
@@ -39,8 +39,9 @@
 import static android.view.KeyEvent.ACTION_DOWN;
 import static android.view.KeyEvent.KEYCODE_VOLUME_UP;
 
-import static com.android.media.audio.Flags.FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME;
 import static com.android.media.audio.Flags.FLAG_ABS_VOLUME_INDEX_FIX;
+import static com.android.media.audio.Flags.FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME;
+import static com.android.media.audio.Flags.absVolumeIndexFix;
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
@@ -289,6 +290,9 @@
     // --------------- Volume Stream APIs ---------------
     @Test
     public void setStreamVolume_callsASSetStreamVolumeIndex() throws Exception {
+        assumeFalse("Skipping setStreamVolume_callsASSetStreamVolumeIndex on automotive",
+                mIsAutomotive);
+
         int newIndex = circularNoMinMaxIncrementVolume(STREAM_MUSIC);
 
         mAudioService.setDeviceForStream(STREAM_MUSIC, DEVICE_OUT_USB_DEVICE);
@@ -312,6 +316,9 @@
 
     @Test
     public void adjustStreamVolume_callsASSetStreamVolumeIndex() throws Exception {
+        assumeFalse("Skipping adjustStreamVolume_callsASSetStreamVolumeIndex on automotive",
+                mIsAutomotive);
+
         mAudioService.setDeviceForStream(STREAM_MUSIC, DEVICE_OUT_USB_DEVICE);
         mAudioService.adjustStreamVolume(STREAM_MUSIC, ADJUST_LOWER, /*flags=*/0,
                 mContext.getOpPackageName());
@@ -323,6 +330,9 @@
 
     @Test
     public void handleVolumeKey_callsASSetStreamVolumeIndex() throws Exception {
+        assumeFalse("Skipping handleVolumeKey_callsASSetStreamVolumeIndex on automotive",
+                mIsAutomotive);
+
         final KeyEvent keyEvent = new KeyEvent(ACTION_DOWN, KEYCODE_VOLUME_UP);
 
         mAudioService.setDeviceForStream(STREAM_MUSIC, DEVICE_OUT_USB_DEVICE);
@@ -338,6 +348,9 @@
 
     @Test
     public void setVolumeGroupVolumeIndex_callsASSetVolumeIndexForAttributes() throws Exception {
+        assumeFalse(
+                "Skipping setVolumeGroupVolumeIndex_callsASSetVolumeIndexForAttributes on "
+                        + "automotive", mIsAutomotive);
         assumeNotNull(mAudioMusicVolumeGroup);
 
         mAudioService.setDeviceForStream(STREAM_MUSIC, DEVICE_OUT_USB_DEVICE);
@@ -346,8 +359,8 @@
                 mContext.getOpPackageName(),  /*attributionTag*/null);
         mTestLooper.dispatchAll();
 
-        verify(mSpyAudioSystem).setVolumeIndexForAttributes(
-                any(), anyInt(), eq(DEVICE_OUT_USB_DEVICE));
+        verify(mSpyAudioSystem).setVolumeIndexForAttributes(any(), anyInt(),
+                eq(DEVICE_OUT_USB_DEVICE));
     }
 
     @Test
@@ -365,6 +378,7 @@
 
     @Test
     public void check_getVolumeGroupVolumeIndex() throws Exception {
+        assumeFalse("Skipping check_getVolumeGroupVolumeIndex on automotive", mIsAutomotive);
         assumeNotNull(mAudioMusicVolumeGroup);
 
         int newIndex = circularNoMinMaxIncrementVolume(STREAM_MUSIC);
@@ -373,10 +387,9 @@
                 newIndex, /*flags=*/0, mContext.getOpPackageName(),  /*attributionTag*/null);
         mTestLooper.dispatchAll();
 
-        assertEquals(mAudioService.getVolumeGroupVolumeIndex(mAudioMusicVolumeGroup.getId()),
-                newIndex);
-        assertEquals(mAudioService.getStreamVolume(STREAM_MUSIC),
-                newIndex);
+        assertEquals(newIndex,
+                mAudioService.getVolumeGroupVolumeIndex(mAudioMusicVolumeGroup.getId()));
+        assertEquals(newIndex, mAudioService.getStreamVolume(STREAM_MUSIC));
     }
 
     @Test
@@ -431,6 +444,7 @@
 
     @Test
     public void flagAbsVolume_onBtDevice_changesVolume() throws Exception {
+        assumeFalse("Skipping flagAbsVolume_onBtDevice_changesVolume on automotive", mIsAutomotive);
         mAudioService.setDeviceForStream(STREAM_NOTIFICATION, DEVICE_OUT_BLE_SPEAKER);
 
         int newIndex = circularNoMinMaxIncrementVolume(STREAM_NOTIFICATION);
@@ -493,7 +507,7 @@
                 mContext.getOpPackageName());
         mTestLooper.dispatchAll();
 
-        assertEquals(mAudioService.getRingerModeInternal(), RINGER_MODE_VIBRATE);
+        assertEquals(RINGER_MODE_VIBRATE, mAudioService.getRingerModeInternal());
     }
 
     // --------------------- Permission tests ---------------------
@@ -537,6 +551,7 @@
     // ----------------- AudioDeviceVolumeManager -----------------
     @Test
     public void setDeviceVolume_checkIndex() {
+        assumeFalse("Skipping setDeviceVolume_checkIndex on automotive", mIsAutomotive);
         final int minIndex = mAm.getStreamMinVolume(STREAM_MUSIC);
         final int maxIndex = mAm.getStreamMaxVolume(STREAM_MUSIC);
         final int midIndex = (minIndex + maxIndex) / 2;
@@ -552,21 +567,17 @@
         mAudioService.setDeviceVolume(volMin, usbDevice, mContext.getOpPackageName());
         mTestLooper.dispatchAll();
 
-        if (!mIsAutomotive) {
-            // there is a min/max index mismatch in automotive
-            assertEquals(mAudioService.getDeviceVolume(volMin, usbDevice,
-                    mContext.getOpPackageName()), volMin);
-        }
+        // there is a min/max index mismatch in automotive
+        assertEquals(volMin, mAudioService.getDeviceVolume(volMin, usbDevice,
+                mContext.getOpPackageName()));
         verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS(
                 eq(STREAM_MUSIC), anyInt(), eq(AudioSystem.DEVICE_OUT_USB_DEVICE));
 
         mAudioService.setDeviceVolume(volMid, usbDevice, mContext.getOpPackageName());
         mTestLooper.dispatchAll();
-        if (!mIsAutomotive) {
-            // there is a min/max index mismatch in automotive
-            assertEquals(mAudioService.getDeviceVolume(volMid, usbDevice,
-                    mContext.getOpPackageName()), volMid);
-        }
+        // there is a min/max index mismatch in automotive
+        assertEquals(volMid, mAudioService.getDeviceVolume(volMid, usbDevice,
+                mContext.getOpPackageName()));
         verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS(
                 eq(STREAM_MUSIC), anyInt(), eq(AudioSystem.DEVICE_OUT_USB_DEVICE));
     }
@@ -602,9 +613,8 @@
             mAudioService.setDeviceVolume(volCur, bleDevice, mContext.getOpPackageName());
             mTestLooper.dispatchAll();
 
-            assertEquals(
-                    mAudioService.getDeviceVolume(volCur, bleDevice, mContext.getOpPackageName()),
-                    volCur);
+            assertEquals(volCur,
+                    mAudioService.getDeviceVolume(volCur, bleDevice, mContext.getOpPackageName()));
             // Stream volume changes
             verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS(
                     STREAM_MUSIC, targetIndex,
@@ -617,9 +627,8 @@
         mAudioService.setDeviceVolume(volIndex4, bleDevice, mContext.getOpPackageName());
         mTestLooper.dispatchAll();
 
-        assertEquals(
-                mAudioService.getDeviceVolume(volIndex4, bleDevice, mContext.getOpPackageName()),
-                volIndex4);
+        assertEquals(volIndex4,
+                mAudioService.getDeviceVolume(volIndex4, bleDevice, mContext.getOpPackageName()));
         verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS(
                 STREAM_MUSIC, maxIndex,
                 AudioSystem.DEVICE_OUT_BLE_HEADSET);
@@ -627,7 +636,6 @@
 
     @Test
     @RequiresFlagsEnabled(FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME)
-    @RequiresFlagsDisabled(FLAG_ABS_VOLUME_INDEX_FIX)
     public void disablePreScaleAbsoluteVolume_checkIndex() throws Exception {
         final int minIndex = mAm.getStreamMinVolume(STREAM_MUSIC);
         final int maxIndex = mAm.getStreamMaxVolume(STREAM_MUSIC);
@@ -638,6 +646,7 @@
         final AudioDeviceAttributes bleDevice = new AudioDeviceAttributes(
                 /*native type*/ AudioSystem.DEVICE_OUT_BLE_HEADSET, /*address*/ "bla");
         final int maxPreScaleIndex = 3;
+        int passedIndex = maxIndex;
 
         for (int i = 0; i < maxPreScaleIndex; i++) {
             final VolumeInfo volCur = new VolumeInfo.Builder(volMedia)
@@ -646,9 +655,12 @@
             mAudioService.setDeviceVolume(volCur, bleDevice, mContext.getOpPackageName());
             mTestLooper.dispatchAll();
 
+            if (absVolumeIndexFix()) {
+                passedIndex = i + 1;
+            }
             // Stream volume changes
             verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS(
-                    STREAM_MUSIC, maxIndex,
+                    STREAM_MUSIC, passedIndex,
                     AudioSystem.DEVICE_OUT_BLE_HEADSET);
         }
 
@@ -658,8 +670,11 @@
         mAudioService.setDeviceVolume(volIndex4, bleDevice, mContext.getOpPackageName());
         mTestLooper.dispatchAll();
 
+        if (absVolumeIndexFix()) {
+            passedIndex = 4;
+        }
         verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS(
-                STREAM_MUSIC, maxIndex,
+                STREAM_MUSIC, passedIndex,
                 AudioSystem.DEVICE_OUT_BLE_HEADSET);
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/UtilsTest.java b/services/tests/servicestests/src/com/android/server/biometrics/UtilsTest.java
index 14cb22d..1bea371 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/UtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/UtilsTest.java
@@ -16,12 +16,20 @@
 
 package com.android.server.biometrics;
 
+import static android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED;
 import static android.hardware.biometrics.BiometricManager.Authenticators;
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertTrue;
 
+import static org.junit.Assert.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+
+import android.content.Context;
 import android.hardware.biometrics.BiometricAuthenticator;
 import android.hardware.biometrics.BiometricConstants;
 import android.hardware.biometrics.BiometricManager;
@@ -36,8 +44,12 @@
 
 import androidx.test.filters.SmallTest;
 
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
 
 @Presubmit
 @SmallTest
@@ -45,6 +57,17 @@
     @Rule
     public final CheckFlagsRule mCheckFlagsRule =
             DeviceFlagsValueProvider.createCheckFlagsRule();
+    @Rule
+    public MockitoRule mockitorule = MockitoJUnit.rule();
+
+    @Mock
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        doThrow(SecurityException.class).when(mContext).enforceCallingOrSelfPermission(
+                eq(SET_BIOMETRIC_DIALOG_ADVANCED), any());
+    }
 
     @Test
     public void testCombineAuthenticatorBundles_withKeyDeviceCredential_andKeyAuthenticators() {
@@ -162,28 +185,45 @@
 
     @Test
     public void testIsValidAuthenticatorConfig() {
-        assertTrue(Utils.isValidAuthenticatorConfig(Authenticators.EMPTY_SET));
+        assertTrue(Utils.isValidAuthenticatorConfig(mContext, Authenticators.EMPTY_SET));
 
-        assertTrue(Utils.isValidAuthenticatorConfig(Authenticators.BIOMETRIC_STRONG));
+        assertTrue(Utils.isValidAuthenticatorConfig(mContext, Authenticators.BIOMETRIC_STRONG));
 
-        assertTrue(Utils.isValidAuthenticatorConfig(Authenticators.BIOMETRIC_WEAK));
+        assertTrue(Utils.isValidAuthenticatorConfig(mContext, Authenticators.BIOMETRIC_WEAK));
 
-        assertTrue(Utils.isValidAuthenticatorConfig(Authenticators.DEVICE_CREDENTIAL));
+        assertTrue(Utils.isValidAuthenticatorConfig(mContext, Authenticators.DEVICE_CREDENTIAL));
 
-        assertTrue(Utils.isValidAuthenticatorConfig(Authenticators.DEVICE_CREDENTIAL
+        assertTrue(Utils.isValidAuthenticatorConfig(mContext, Authenticators.DEVICE_CREDENTIAL
                 | Authenticators.BIOMETRIC_STRONG));
 
-        assertTrue(Utils.isValidAuthenticatorConfig(Authenticators.DEVICE_CREDENTIAL
+        assertTrue(Utils.isValidAuthenticatorConfig(mContext, Authenticators.DEVICE_CREDENTIAL
                 | Authenticators.BIOMETRIC_WEAK));
 
-        assertFalse(Utils.isValidAuthenticatorConfig(Authenticators.BIOMETRIC_CONVENIENCE));
+        assertFalse(Utils.isValidAuthenticatorConfig(
+                mContext, Authenticators.BIOMETRIC_CONVENIENCE));
 
-        assertFalse(Utils.isValidAuthenticatorConfig(Authenticators.BIOMETRIC_CONVENIENCE
+        assertFalse(Utils.isValidAuthenticatorConfig(mContext, Authenticators.BIOMETRIC_CONVENIENCE
                 | Authenticators.DEVICE_CREDENTIAL));
 
-        assertFalse(Utils.isValidAuthenticatorConfig(Authenticators.BIOMETRIC_MAX_STRENGTH));
+        assertFalse(Utils.isValidAuthenticatorConfig(
+                mContext, Authenticators.BIOMETRIC_MAX_STRENGTH));
 
-        assertFalse(Utils.isValidAuthenticatorConfig(Authenticators.BIOMETRIC_MIN_STRENGTH));
+        assertFalse(Utils.isValidAuthenticatorConfig(
+                mContext, Authenticators.BIOMETRIC_MIN_STRENGTH));
+
+        assertThrows(SecurityException.class, () -> Utils.isValidAuthenticatorConfig(
+                        mContext, Authenticators.MANDATORY_BIOMETRICS));
+
+        doNothing().when(mContext).enforceCallingOrSelfPermission(
+                eq(SET_BIOMETRIC_DIALOG_ADVANCED), any());
+
+        if (Flags.mandatoryBiometrics()) {
+            assertTrue(Utils.isValidAuthenticatorConfig(mContext,
+                    Authenticators.MANDATORY_BIOMETRICS));
+        } else {
+            assertFalse(Utils.isValidAuthenticatorConfig(mContext,
+                    Authenticators.MANDATORY_BIOMETRICS));
+        }
 
         // The rest of the bits are not allowed to integrate with the public APIs
         for (int i = 8; i < 32; i++) {
@@ -192,7 +232,7 @@
                     || authenticator == Authenticators.MANDATORY_BIOMETRICS) {
                 continue;
             }
-            assertFalse(Utils.isValidAuthenticatorConfig(1 << i));
+            assertFalse(Utils.isValidAuthenticatorConfig(mContext, 1 << i));
         }
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java
index 4d067f6..98b1191 100644
--- a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java
@@ -50,7 +50,6 @@
 import static org.mockito.Mockito.when;
 import static org.testng.Assert.assertThrows;
 
-import android.Manifest;
 import android.app.WindowConfiguration;
 import android.app.admin.DevicePolicyManager;
 import android.companion.AssociationInfo;
@@ -113,10 +112,11 @@
 import android.view.DisplayInfo;
 import android.view.KeyEvent;
 import android.view.WindowManager;
+import android.virtualdevice.cts.common.VirtualDeviceRule;
 
 import androidx.test.platform.app.InstrumentationRegistry;
 
-import com.android.compatibility.common.util.AdoptShellPermissionsRule;
+import com.android.compatibility.common.util.SystemUtil;
 import com.android.internal.app.BlockedAppStreamingActivity;
 import com.android.internal.os.BackgroundThread;
 import com.android.server.LocalServices;
@@ -150,6 +150,7 @@
     private static final String NONBLOCKED_APP_PACKAGE_NAME = "com.someapp";
     private static final String PERMISSION_CONTROLLER_PACKAGE_NAME =
             "com.android.permissioncontroller";
+    private static final String VIRTUAL_DEVICE_OWNER_PACKAGE = "com.android.virtualdevice.test";
     private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
     private static final String VENDING_PACKAGE_NAME = "com.android.vending";
     private static final String GOOGLE_DIALER_PACKAGE_NAME = "com.google.android.dialer";
@@ -223,9 +224,7 @@
     public SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
     @Rule
-    public AdoptShellPermissionsRule mAdoptShellPermissionsRule = new AdoptShellPermissionsRule(
-            InstrumentationRegistry.getInstrumentation().getUiAutomation(),
-            Manifest.permission.CREATE_VIRTUAL_DEVICE);
+    public VirtualDeviceRule mVirtualDeviceRule = VirtualDeviceRule.createDefault();
 
     private Context mContext;
     private InputManagerMockHelper mInputManagerMockHelper;
@@ -296,11 +295,10 @@
     private Intent createRestrictedActivityBlockedIntent(Set<String> displayCategories,
             String targetDisplayCategory) {
         when(mDisplayManagerInternalMock.createVirtualDisplay(any(), any(), any(), any(),
-                eq(NONBLOCKED_APP_PACKAGE_NAME))).thenReturn(DISPLAY_ID_1);
+                eq(VIRTUAL_DEVICE_OWNER_PACKAGE))).thenReturn(DISPLAY_ID_1);
         VirtualDisplayConfig config = new VirtualDisplayConfig.Builder("display", 640, 480,
                 420).setDisplayCategories(displayCategories).build();
-        mDeviceImpl.createVirtualDisplay(config, mVirtualDisplayCallback,
-                NONBLOCKED_APP_PACKAGE_NAME);
+        mDeviceImpl.createVirtualDisplay(config, mVirtualDisplayCallback);
         GenericWindowPolicyController gwpc = mDeviceImpl.getDisplayWindowPolicyControllerForTest(
                 DISPLAY_ID_1);
         doNothing().when(mContext).startActivityAsUser(any(), any(), any());
@@ -1069,64 +1067,65 @@
     @Test
     public void createVirtualDpad_noPermission_failsSecurityException() {
         addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1);
-        try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) {
-            assertThrows(SecurityException.class,
-                    () -> mDeviceImpl.createVirtualDpad(DPAD_CONFIG, BINDER));
-        }
+        // Shell doesn't have CREATE_VIRTUAL_DEVICE permission.
+        SystemUtil.runWithShellPermissionIdentity(() ->
+                assertThrows(SecurityException.class,
+                        () -> mDeviceImpl.createVirtualDpad(DPAD_CONFIG, BINDER)));
     }
 
     @Test
     public void createVirtualKeyboard_noPermission_failsSecurityException() {
         addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1);
-        try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) {
-            assertThrows(SecurityException.class,
-                    () -> mDeviceImpl.createVirtualKeyboard(KEYBOARD_CONFIG, BINDER));
-        }
+        // Shell doesn't have CREATE_VIRTUAL_DEVICE permission.
+        SystemUtil.runWithShellPermissionIdentity(() ->
+                assertThrows(SecurityException.class,
+                        () -> mDeviceImpl.createVirtualKeyboard(KEYBOARD_CONFIG, BINDER)));
     }
 
     @Test
     public void createVirtualMouse_noPermission_failsSecurityException() {
         addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1);
-        try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) {
-            assertThrows(SecurityException.class,
-                    () -> mDeviceImpl.createVirtualMouse(MOUSE_CONFIG, BINDER));
-        }
+        // Shell doesn't have CREATE_VIRTUAL_DEVICE permission.
+        SystemUtil.runWithShellPermissionIdentity(() ->
+                assertThrows(SecurityException.class,
+                        () -> mDeviceImpl.createVirtualMouse(MOUSE_CONFIG, BINDER)));
     }
 
     @Test
     public void createVirtualTouchscreen_noPermission_failsSecurityException() {
         addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1);
-        try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) {
-            assertThrows(SecurityException.class,
-                    () -> mDeviceImpl.createVirtualTouchscreen(TOUCHSCREEN_CONFIG, BINDER));
-        }
+        // Shell doesn't have CREATE_VIRTUAL_DEVICE permission.
+        SystemUtil.runWithShellPermissionIdentity(() ->
+                assertThrows(SecurityException.class,
+                        () -> mDeviceImpl.createVirtualTouchscreen(TOUCHSCREEN_CONFIG, BINDER)));
     }
 
     @Test
     public void createVirtualNavigationTouchpad_noPermission_failsSecurityException() {
         addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1);
-        try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) {
-            assertThrows(SecurityException.class,
-                    () -> mDeviceImpl.createVirtualNavigationTouchpad(NAVIGATION_TOUCHPAD_CONFIG,
-                            BINDER));
-        }
+        // Shell doesn't have CREATE_VIRTUAL_DEVICE permission.
+        SystemUtil.runWithShellPermissionIdentity(() ->
+                assertThrows(SecurityException.class,
+                        () -> mDeviceImpl.createVirtualNavigationTouchpad(
+                                NAVIGATION_TOUCHPAD_CONFIG,
+                                BINDER)));
     }
 
     @Test
     public void onAudioSessionStarting_noPermission_failsSecurityException() {
         addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1);
-        try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) {
-            assertThrows(SecurityException.class,
-                    () -> mDeviceImpl.onAudioSessionStarting(
-                            DISPLAY_ID_1, mRoutingCallback, mConfigChangedCallback));
-        }
+        // Shell doesn't have CREATE_VIRTUAL_DEVICE permission.
+        SystemUtil.runWithShellPermissionIdentity(() ->
+                assertThrows(SecurityException.class,
+                        () -> mDeviceImpl.onAudioSessionStarting(
+                                DISPLAY_ID_1, mRoutingCallback, mConfigChangedCallback)));
     }
 
     @Test
     public void onAudioSessionEnded_noPermission_failsSecurityException() {
-        try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) {
-            assertThrows(SecurityException.class, () -> mDeviceImpl.onAudioSessionEnded());
-        }
+        // Shell doesn't have CREATE_VIRTUAL_DEVICE permission.
+        SystemUtil.runWithShellPermissionIdentity(() ->
+                assertThrows(SecurityException.class, () -> mDeviceImpl.onAudioSessionEnded()));
     }
 
     @Test
@@ -1950,7 +1949,7 @@
                         mVirtualDeviceLog,
                         new Binder(),
                         new AttributionSource(
-                                ownerUid, "com.android.virtualdevice.test", "virtualdevice"),
+                                ownerUid, VIRTUAL_DEVICE_OWNER_PACKAGE, "virtualdevice"),
                         virtualDeviceId,
                         mInputController,
                         mCameraAccessController,
@@ -1971,8 +1970,7 @@
     private void addVirtualDisplay(VirtualDeviceImpl virtualDevice, int displayId) {
         when(mDisplayManagerInternalMock.createVirtualDisplay(any(), eq(mVirtualDisplayCallback),
                 eq(virtualDevice), any(), any())).thenReturn(displayId);
-        virtualDevice.createVirtualDisplay(VIRTUAL_DISPLAY_CONFIG, mVirtualDisplayCallback,
-                NONBLOCKED_APP_PACKAGE_NAME);
+        virtualDevice.createVirtualDisplay(VIRTUAL_DISPLAY_CONFIG, mVirtualDisplayCallback);
         final String uniqueId = UNIQUE_ID + displayId;
         doAnswer(inv -> {
             final DisplayInfo displayInfo = new DisplayInfo();
@@ -2002,18 +2000,4 @@
                 /* notifyOnDeviceNearby= */ false, /* revoked= */ false, /* pending= */ false,
                 /* timeApprovedMs= */0, /* lastTimeConnectedMs= */0, /* systemDataSyncFlags= */ -1);
     }
-
-    /** Helper class to drop permissions temporarily and restore them at the end of a test. */
-    static final class DropShellPermissionsTemporarily implements AutoCloseable {
-        DropShellPermissionsTemporarily() {
-            InstrumentationRegistry.getInstrumentation().getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-
-        @Override
-        public void close() {
-            InstrumentationRegistry.getInstrumentation().getUiAutomation()
-                    .adoptShellPermissionIdentity();
-        }
-    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/FakePowerManagerWrapper.java b/services/tests/servicestests/src/com/android/server/hdmi/FakePowerManagerWrapper.java
index 04f921f..629f968 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/FakePowerManagerWrapper.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/FakePowerManagerWrapper.java
@@ -26,6 +26,7 @@
     private boolean mInteractive;
     private WakeLockWrapper mWakeLock;
     private boolean mWasWakeLockInstanceCreated = false;
+    private boolean mIsLowPowerStandbyEnabled = false;
 
 
     FakePowerManagerWrapper(@NonNull Context context) {
@@ -60,6 +61,15 @@
     }
 
     @Override
+    boolean isLowPowerStandbyEnabled() {
+        return mIsLowPowerStandbyEnabled;
+    }
+
+    void setIsLowPowerStandbyEnabled(boolean isLowPowerStandbyEnabled) {
+        mIsLowPowerStandbyEnabled = isLowPowerStandbyEnabled;
+    }
+
+    @Override
     WakeLockWrapper newWakeLock(int levelAndFlags, String tag) {
         if (mWakeLock == null) {
             mWakeLock = new FakeWakeLockWrapper();
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
index 2d95740..935c8b8 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
@@ -70,6 +70,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 @SmallTest
@@ -113,6 +114,10 @@
     private boolean mWokenUp;
     private boolean mEarcBlocksArc;
     private List<DeviceEventListener> mDeviceEventListeners = new ArrayList<>();
+    private List<VendorCommandListener> mVendorCommandListeners = new ArrayList<>();
+    private boolean mDisableCecOnStandbyByLowEnergyMode;
+    private boolean mWasCecDisabledOnStandbyByLowEnergyMode;
+    private boolean mUseHdmiCecPowerStatusController;
 
     private class DeviceEventListener {
         private HdmiDeviceInfo mDevice;
@@ -132,6 +137,30 @@
         }
     }
 
+    private class VendorCommandListener {
+        private boolean mEnabled;
+        private int mReason;
+
+        VendorCommandListener(boolean enabled, int reason) {
+            this.mEnabled = enabled;
+            this.mReason = reason;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (!(obj instanceof VendorCommandListener)) {
+                return false;
+            }
+            VendorCommandListener other = (VendorCommandListener) obj;
+            return other.mReason == mReason && other.mEnabled == mEnabled;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(mEnabled, mReason);
+        }
+    }
+
     private FakeAudioFramework mAudioFramework;
     private AudioManagerWrapper mAudioManager;
 
@@ -169,6 +198,9 @@
 
                     @Override
                     boolean isPowerStandby() {
+                        if (mUseHdmiCecPowerStatusController) {
+                            return mPowerStatusController.isPowerStatusStandby();
+                        }
                         return false;
                     }
 
@@ -188,6 +220,13 @@
                     }
 
                     @Override
+                    boolean invokeVendorCommandListenersOnControlStateChanged(
+                            boolean enabled, int reason) {
+                        mVendorCommandListeners.add(new VendorCommandListener(enabled, reason));
+                        return true;
+                    }
+
+                    @Override
                     protected boolean earcBlocksArcConnection() {
                         return mEarcBlocksArc;
                     }
@@ -196,6 +235,21 @@
                     protected void sendBroadcastAsUser(@RequiresPermission Intent intent) {
                         // do nothing
                     }
+
+                    @Override
+                    protected boolean getDisableCecOnStandbyByLowEnergyMode() {
+                        return mDisableCecOnStandbyByLowEnergyMode;
+                    }
+
+                    @Override
+                    protected boolean getWasCecDisabledOnStandbyByLowEnergyMode() {
+                        return mWasCecDisabledOnStandbyByLowEnergyMode;
+                    }
+
+                    @Override
+                    protected void setWasCecDisabledOnStandbyByLowEnergyMode(boolean value) {
+                        mWasCecDisabledOnStandbyByLowEnergyMode = value;
+                    }
                 };
 
         mHdmiControlService.setIoLooper(mMyLooper);
@@ -241,6 +295,9 @@
             mHdmiControlService.getHdmiCecConfig().setIntValue(
                     sad, HdmiControlManager.QUERY_SAD_DISABLED);
         }
+        mWasCecDisabledOnStandbyByLowEnergyMode = false;
+        mDisableCecOnStandbyByLowEnergyMode = false;
+        mUseHdmiCecPowerStatusController = false;
         mNativeWrapper.clearResultMessages();
     }
 
@@ -2238,6 +2295,92 @@
         assertThat(mHdmiCecLocalDeviceTv.getActions(SystemAudioActionFromTv.class)).hasSize(1);
     }
 
+    @Test
+    public void lowEnergyMode_disableCecOnStandby_reEnableOnWakeup() {
+        mDisableCecOnStandbyByLowEnergyMode = true;
+        mUseHdmiCecPowerStatusController = true;
+        mPowerManager.setIsLowPowerStandbyEnabled(true);
+
+        assertEquals(mHdmiCecLocalDeviceTv.mService.getHdmiCecConfig().getIntValue(
+                HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED),
+                HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
+        mHdmiControlService.onStandby(STANDBY_SCREEN_OFF);
+        mTestLooper.dispatchAll();
+
+        assertEquals(mHdmiCecLocalDeviceTv.mService.getHdmiCecConfig().getIntValue(
+                        HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED),
+                HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
+        assertTrue(mWasCecDisabledOnStandbyByLowEnergyMode);
+        mHdmiControlService.onWakeUp(WAKE_UP_SCREEN_ON);
+        mTestLooper.dispatchAll();
+
+        assertEquals(mHdmiCecLocalDeviceTv.mService.getHdmiCecConfig().getIntValue(
+                        HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED),
+                HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
+        assertFalse(mWasCecDisabledOnStandbyByLowEnergyMode);
+    }
+
+    @Test
+    public void lowEnergyMode_disableCecBeforeStandby_cecStaysDisabledOnWakeup() {
+        mDisableCecOnStandbyByLowEnergyMode = true;
+        mUseHdmiCecPowerStatusController = true;
+        mPowerManager.setIsLowPowerStandbyEnabled(true);
+
+        assertEquals(mHdmiCecLocalDeviceTv.mService.getHdmiCecConfig().getIntValue(
+                        HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED),
+                HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
+        mHdmiCecLocalDeviceTv.mService.getHdmiCecConfig().setIntValue(
+                HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
+                HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
+        mTestLooper.dispatchAll();
+
+        mHdmiControlService.onStandby(STANDBY_SCREEN_OFF);
+        mTestLooper.dispatchAll();
+
+        assertEquals(mHdmiCecLocalDeviceTv.mService.getHdmiCecConfig().getIntValue(
+                        HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED),
+                HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
+        assertFalse(mWasCecDisabledOnStandbyByLowEnergyMode);
+        mHdmiControlService.onWakeUp(WAKE_UP_SCREEN_ON);
+        mTestLooper.dispatchAll();
+
+        assertEquals(mHdmiCecLocalDeviceTv.mService.getHdmiCecConfig().getIntValue(
+                        HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED),
+                HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
+    }
+
+    @Test
+    public void lowEnergyMode_onWakeUp_reEnableCec_invokeVendorCommandListeners() {
+        mDisableCecOnStandbyByLowEnergyMode = true;
+        mUseHdmiCecPowerStatusController = true;
+        mPowerManager.setIsLowPowerStandbyEnabled(true);
+        VendorCommandListener vendorCommandListenerInvocationWakeup = new VendorCommandListener(
+                true, HdmiControlManager.CONTROL_STATE_CHANGED_REASON_WAKEUP);
+        VendorCommandListener vendorCommandListenerInvocationSettingChange =
+                new VendorCommandListener(true,
+                        HdmiControlManager.CONTROL_STATE_CHANGED_REASON_WAKEUP);
+
+        assertEquals(mHdmiCecLocalDeviceTv.mService.getHdmiCecConfig().getIntValue(
+                        HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED),
+                HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
+        mHdmiControlService.onStandby(STANDBY_SCREEN_OFF);
+        mTestLooper.dispatchAll();
+
+        assertEquals(mHdmiCecLocalDeviceTv.mService.getHdmiCecConfig().getIntValue(
+                        HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED),
+                HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
+        assertTrue(mWasCecDisabledOnStandbyByLowEnergyMode);
+        mVendorCommandListeners.clear();
+        mTestLooper.dispatchAll();
+
+        mHdmiControlService.onWakeUp(WAKE_UP_SCREEN_ON);
+        mTestLooper.dispatchAll();
+
+        assertThat(mVendorCommandListeners.size()).isEqualTo(2);
+        assertTrue(mVendorCommandListeners.contains(vendorCommandListenerInvocationWakeup));
+        assertTrue(mVendorCommandListeners.contains(vendorCommandListenerInvocationSettingChange));
+    }
+
     protected static class MockTvDevice extends HdmiCecLocalDeviceTv {
         MockTvDevice(HdmiControlService service) {
             super(service);
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/RebootEscrowManagerTests.java b/services/tests/servicestests/src/com/android/server/locksettings/RebootEscrowManagerTests.java
index d071c15..ae781dc 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/RebootEscrowManagerTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/RebootEscrowManagerTests.java
@@ -60,6 +60,7 @@
 import android.os.ServiceSpecificException;
 import android.os.UserManager;
 import android.platform.test.annotations.Presubmit;
+import android.platform.test.annotations.RequiresFlagsDisabled;
 import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.CheckFlagsRule;
 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
@@ -130,6 +131,7 @@
     private SecretKey mAesKey;
     private MockInjector mMockInjector;
     private Handler mHandler;
+    private Network mNetwork;
 
     public interface MockableRebootEscrowInjected {
         int getBootCount();
@@ -342,6 +344,7 @@
         when(mCallbacks.isUserSecure(NONSECURE_SECONDARY_USER_ID)).thenReturn(false);
         when(mCallbacks.isUserSecure(SECURE_SECONDARY_USER_ID)).thenReturn(true);
         mInjected = mock(MockableRebootEscrowInjected.class);
+        mNetwork = mock(Network.class);
         mMockInjector =
                 new MockInjector(
                         mContext,
@@ -351,6 +354,10 @@
                         mKeyStoreManager,
                         mStorage,
                         mInjected);
+        mMockInjector.mNetworkConsumer =
+                (callback) -> {
+                    callback.onAvailable(mNetwork);
+                };
         HandlerThread thread = new HandlerThread("RebootEscrowManagerTest");
         thread.start();
         mHandler = new Handler(thread.getLooper());
@@ -367,6 +374,10 @@
                         mKeyStoreManager,
                         mStorage,
                         mInjected);
+        mMockInjector.mNetworkConsumer =
+                (callback) -> {
+                    callback.onAvailable(mNetwork);
+                };
         mService = new RebootEscrowManager(mMockInjector, mCallbacks, mStorage, mHandler);
     }
 
@@ -621,7 +632,7 @@
         // pretend reboot happens here
         when(mInjected.getBootCount()).thenReturn(1);
 
-        mService.loadRebootEscrowDataIfAvailable(null);
+        mService.loadRebootEscrowDataIfAvailable(mHandler);
         verify(mServiceConnection, never()).unwrap(any(), anyLong());
         verify(mCallbacks, never()).onRebootEscrowRestored(anyByte(), any(), anyInt());
     }
@@ -678,7 +689,7 @@
         when(mServiceConnection.unwrap(any(), anyLong()))
                 .thenAnswer(invocation -> invocation.getArgument(0));
 
-        mService.loadRebootEscrowDataIfAvailable(null);
+        mService.loadRebootEscrowDataIfAvailable(mHandler);
 
         verify(mServiceConnection).unwrap(any(), anyLong());
         verify(mCallbacks).onRebootEscrowRestored(anyByte(), any(), eq(PRIMARY_USER_ID));
@@ -734,7 +745,7 @@
         when(mServiceConnection.unwrap(any(), anyLong()))
                 .thenAnswer(invocation -> invocation.getArgument(0));
 
-        mService.loadRebootEscrowDataIfAvailable(null);
+        mService.loadRebootEscrowDataIfAvailable(mHandler);
 
         verify(mServiceConnection).unwrap(any(), anyLong());
         verify(mCallbacks).onRebootEscrowRestored(anyByte(), any(), eq(PRIMARY_USER_ID));
@@ -783,7 +794,7 @@
 
         when(mServiceConnection.unwrap(any(), anyLong()))
                 .thenAnswer(invocation -> invocation.getArgument(0));
-        mService.loadRebootEscrowDataIfAvailable(null);
+        mService.loadRebootEscrowDataIfAvailable(mHandler);
         verify(mServiceConnection).unwrap(any(), anyLong());
         assertTrue(metricsSuccessCaptor.getValue());
         verify(mKeyStoreManager).clearKeyStoreEncryptionKey();
@@ -827,7 +838,7 @@
                         anyInt());
 
         when(mServiceConnection.unwrap(any(), anyLong())).thenThrow(RemoteException.class);
-        mService.loadRebootEscrowDataIfAvailable(null);
+        mService.loadRebootEscrowDataIfAvailable(mHandler);
         verify(mServiceConnection).unwrap(any(), anyLong());
         assertFalse(metricsSuccessCaptor.getValue());
         assertEquals(
@@ -836,6 +847,7 @@
     }
 
     @Test
+    @RequiresFlagsDisabled(Flags.FLAG_WAIT_FOR_INTERNET_ROR)
     public void loadRebootEscrowDataIfAvailable_ServerBasedIoError_RetryFailure() throws Exception {
         setServerBasedRebootEscrowProvider();
 
@@ -930,114 +942,6 @@
 
     @Test
     @RequiresFlagsEnabled(Flags.FLAG_WAIT_FOR_INTERNET_ROR)
-    public void loadRebootEscrowDataIfAvailable_serverBasedWaitForInternet_success()
-            throws Exception {
-        setServerBasedRebootEscrowProvider();
-
-        when(mInjected.getBootCount()).thenReturn(0);
-        RebootEscrowListener mockListener = mock(RebootEscrowListener.class);
-        mService.setRebootEscrowListener(mockListener);
-        mService.prepareRebootEscrow();
-
-        clearInvocations(mServiceConnection);
-        callToRebootEscrowIfNeededAndWait(PRIMARY_USER_ID);
-        verify(mockListener).onPreparedForReboot(eq(true));
-        verify(mServiceConnection, never()).wrapBlob(any(), anyLong(), anyLong());
-
-        // Use x -> x for both wrap & unwrap functions.
-        when(mServiceConnection.wrapBlob(any(), anyLong(), anyLong()))
-                .thenAnswer(invocation -> invocation.getArgument(0));
-        assertEquals(ARM_REBOOT_ERROR_NONE, mService.armRebootEscrowIfNeeded());
-        verify(mServiceConnection).wrapBlob(any(), anyLong(), anyLong());
-        assertTrue(mStorage.hasRebootEscrowServerBlob());
-
-        // pretend reboot happens here
-        when(mInjected.getBootCount()).thenReturn(1);
-        ArgumentCaptor<Boolean> metricsSuccessCaptor = ArgumentCaptor.forClass(Boolean.class);
-        doNothing()
-                .when(mInjected)
-                .reportMetric(
-                        metricsSuccessCaptor.capture(),
-                        eq(0) /* error code */,
-                        eq(2) /* Server based */,
-                        eq(1) /* attempt count */,
-                        anyInt(),
-                        eq(0) /* vbmeta status */,
-                        anyInt());
-
-        // load escrow data
-        when(mServiceConnection.unwrap(any(), anyLong()))
-                .thenAnswer(invocation -> invocation.getArgument(0));
-        Network mockNetwork = mock(Network.class);
-        mMockInjector.mNetworkConsumer =
-                (callback) -> {
-                    callback.onAvailable(mockNetwork);
-                };
-
-        mService.loadRebootEscrowDataIfAvailable(mHandler);
-        verify(mServiceConnection).unwrap(any(), anyLong());
-        assertTrue(metricsSuccessCaptor.getValue());
-        verify(mKeyStoreManager).clearKeyStoreEncryptionKey();
-        assertNull(mMockInjector.mNetworkCallback);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(Flags.FLAG_WAIT_FOR_INTERNET_ROR)
-    public void loadRebootEscrowDataIfAvailable_serverBasedWaitForInternetRemoteException_Failure()
-            throws Exception {
-        setServerBasedRebootEscrowProvider();
-
-        when(mInjected.getBootCount()).thenReturn(0);
-        RebootEscrowListener mockListener = mock(RebootEscrowListener.class);
-        mService.setRebootEscrowListener(mockListener);
-        mService.prepareRebootEscrow();
-
-        clearInvocations(mServiceConnection);
-        callToRebootEscrowIfNeededAndWait(PRIMARY_USER_ID);
-        verify(mockListener).onPreparedForReboot(eq(true));
-        verify(mServiceConnection, never()).wrapBlob(any(), anyLong(), anyLong());
-
-        // Use x -> x for both wrap & unwrap functions.
-        when(mServiceConnection.wrapBlob(any(), anyLong(), anyLong()))
-                .thenAnswer(invocation -> invocation.getArgument(0));
-        assertEquals(ARM_REBOOT_ERROR_NONE, mService.armRebootEscrowIfNeeded());
-        verify(mServiceConnection).wrapBlob(any(), anyLong(), anyLong());
-        assertTrue(mStorage.hasRebootEscrowServerBlob());
-
-        // pretend reboot happens here
-        when(mInjected.getBootCount()).thenReturn(1);
-        ArgumentCaptor<Boolean> metricsSuccessCaptor = ArgumentCaptor.forClass(Boolean.class);
-        ArgumentCaptor<Integer> metricsErrorCodeCaptor = ArgumentCaptor.forClass(Integer.class);
-        doNothing()
-                .when(mInjected)
-                .reportMetric(
-                        metricsSuccessCaptor.capture(),
-                        metricsErrorCodeCaptor.capture(),
-                        eq(2) /* Server based */,
-                        eq(1) /* attempt count */,
-                        anyInt(),
-                        eq(0) /* vbmeta status */,
-                        anyInt());
-
-        // load escrow data
-        when(mServiceConnection.unwrap(any(), anyLong())).thenThrow(RemoteException.class);
-        Network mockNetwork = mock(Network.class);
-        mMockInjector.mNetworkConsumer =
-                (callback) -> {
-                    callback.onAvailable(mockNetwork);
-                };
-
-        mService.loadRebootEscrowDataIfAvailable(mHandler);
-        verify(mServiceConnection).unwrap(any(), anyLong());
-        assertFalse(metricsSuccessCaptor.getValue());
-        assertEquals(
-                Integer.valueOf(RebootEscrowManager.ERROR_LOAD_ESCROW_KEY),
-                metricsErrorCodeCaptor.getValue());
-        assertNull(mMockInjector.mNetworkCallback);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(Flags.FLAG_WAIT_FOR_INTERNET_ROR)
     public void loadRebootEscrowDataIfAvailable_waitForInternet_networkUnavailable()
             throws Exception {
         setServerBasedRebootEscrowProvider();
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/WeaverBasedSyntheticPasswordTests.java b/services/tests/servicestests/src/com/android/server/locksettings/WeaverBasedSyntheticPasswordTests.java
index 50f3a88..5bcddc4 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/WeaverBasedSyntheticPasswordTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/WeaverBasedSyntheticPasswordTests.java
@@ -1,6 +1,10 @@
 package com.android.server.locksettings;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
 
 import android.platform.test.annotations.Presubmit;
 
@@ -56,4 +60,44 @@
         mService.initializeSyntheticPassword(userId); // This should allocate a Weaver slot.
         assertEquals(Sets.newHashSet(0), mPasswordSlotManager.getUsedSlots());
     }
+
+    private int getNumUsedWeaverSlots() {
+        return mPasswordSlotManager.getUsedSlots().size();
+    }
+
+    @Test
+    public void testDisableWeaverOnUnsecuredUsers_false() {
+        final int userId = PRIMARY_USER_ID;
+        when(mResources.getBoolean(eq(
+                        com.android.internal.R.bool.config_disableWeaverOnUnsecuredUsers)))
+                .thenReturn(false);
+        assertEquals(0, getNumUsedWeaverSlots());
+        mService.initializeSyntheticPassword(userId);
+        assertEquals(1, getNumUsedWeaverSlots());
+        assertTrue(mService.setLockCredential(newPassword("password"), nonePassword(), userId));
+        assertEquals(1, getNumUsedWeaverSlots());
+        assertTrue(mService.setLockCredential(nonePassword(), newPassword("password"), userId));
+        assertEquals(1, getNumUsedWeaverSlots());
+    }
+
+    @Test
+    public void testDisableWeaverOnUnsecuredUsers_true() {
+        final int userId = PRIMARY_USER_ID;
+        when(mResources.getBoolean(eq(
+                        com.android.internal.R.bool.config_disableWeaverOnUnsecuredUsers)))
+                .thenReturn(true);
+        assertEquals(0, getNumUsedWeaverSlots());
+        mService.initializeSyntheticPassword(userId);
+        assertEquals(0, getNumUsedWeaverSlots());
+        assertTrue(mService.setLockCredential(newPassword("password"), nonePassword(), userId));
+        assertEquals(1, getNumUsedWeaverSlots());
+        assertTrue(mService.setLockCredential(nonePassword(), newPassword("password"), userId));
+        assertEquals(0, getNumUsedWeaverSlots());
+    }
+
+    @Test
+    public void testDisableWeaverOnUnsecuredUsers_defaultsToFalse() {
+        assertFalse(mResources.getBoolean(
+                    com.android.internal.R.bool.config_disableWeaverOnUnsecuredUsers));
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java
index abc9ce3..7e22d74 100644
--- a/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java
@@ -33,11 +33,13 @@
 import static android.view.Display.INVALID_DISPLAY;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
@@ -50,11 +52,15 @@
 import static org.mockito.Mockito.when;
 import static org.testng.Assert.assertThrows;
 
+import android.Manifest;
 import android.annotation.SuppressLint;
 import android.app.ActivityManagerInternal;
 import android.app.ActivityOptions.LaunchCookie;
 import android.app.AppOpsManager;
+import android.app.Instrumentation;
 import android.app.KeyguardManager;
+import android.app.role.RoleManager;
+import android.companion.AssociationRequest;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
@@ -67,6 +73,7 @@
 import android.os.Binder;
 import android.os.IBinder;
 import android.os.Looper;
+import android.os.Process;
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.os.test.TestLooper;
@@ -87,15 +94,18 @@
 import com.android.server.wm.WindowManagerInternal;
 
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Answers;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.Objects;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -174,8 +184,8 @@
     private PackageManager mPackageManager;
     @Mock
     private KeyguardManager mKeyguardManager;
-    @Mock
-    AppOpsManager mAppOpsManager;
+
+    private AppOpsManager mAppOpsManager;
     @Mock
     private IMediaProjectionWatcherCallback mWatcherCallback;
     @Mock
@@ -193,6 +203,7 @@
         LocalServices.removeServiceForTest(WindowManagerInternal.class);
         LocalServices.addService(WindowManagerInternal.class, mWindowManagerInternal);
 
+        mAppOpsManager = mockAppOpsManager();
         mContext.addMockSystemService(AppOpsManager.class, mAppOpsManager);
         mContext.addMockSystemService(KeyguardManager.class, mKeyguardManager);
         mContext.setMockPackageManager(mPackageManager);
@@ -206,6 +217,17 @@
         mService = new MediaProjectionManagerService(mContext);
     }
 
+    private static AppOpsManager mockAppOpsManager() {
+        return mock(AppOpsManager.class, invocationOnMock -> {
+            if (invocationOnMock.getMethod().getName().startsWith("noteOp")) {
+                // Mockito will return 0 for non-stubbed method which corresponds to MODE_ALLOWED
+                // and is not what we want.
+                return AppOpsManager.MODE_IGNORED;
+            }
+            return Answers.RETURNS_DEFAULTS.answer(invocationOnMock);
+        });
+    }
+
     @After
     public void tearDown() {
         LocalServices.removeServiceForTest(ActivityManagerInternal.class);
@@ -298,15 +320,16 @@
         assertThat(mService.getActiveProjectionInfo()).isNotNull();
     }
 
-    @SuppressLint("MissingPermission")
     @EnableFlags(android.companion.virtualdevice.flags
             .Flags.FLAG_MEDIA_PROJECTION_KEYGUARD_RESTRICTIONS)
     @Test
     public void testCreateProjection_keyguardLocked_AppOpMediaProjection()
             throws NameNotFoundException {
         MediaProjectionManagerService.MediaProjection projection = startProjectionPreconditions();
-        doReturn(true).when(mAppOpsManager).isOperationActive(eq(AppOpsManager.OP_PROJECT_MEDIA),
-                eq(projection.uid), eq(projection.packageName));
+        doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager)
+                .noteOpNoThrow(eq(AppOpsManager.OP_PROJECT_MEDIA),
+                        eq(projection.uid), eq(projection.packageName), nullable(String.class),
+                        nullable(String.class));
         doReturn(true).when(mKeyguardManager).isKeyguardLocked();
 
         doReturn(PackageManager.PERMISSION_DENIED).when(mPackageManager).checkPermission(
@@ -319,6 +342,36 @@
         assertThat(mService.getActiveProjectionInfo()).isNotNull();
     }
 
+    @EnableFlags(android.companion.virtualdevice.flags
+            .Flags.FLAG_MEDIA_PROJECTION_KEYGUARD_RESTRICTIONS)
+    @Test
+    public void testCreateProjection_keyguardLocked_RoleHeld() {
+        runWithRole(AssociationRequest.DEVICE_PROFILE_APP_STREAMING, () -> {
+            try {
+                mAppInfo.privateFlags |= PRIVATE_FLAG_PRIVILEGED;
+                doReturn(mAppInfo).when(mPackageManager).getApplicationInfoAsUser(anyString(),
+                        any(ApplicationInfoFlags.class), any(UserHandle.class));
+                MediaProjectionManagerService.MediaProjection projection =
+                        mService.createProjectionInternal(Process.myUid(),
+                                mContext.getPackageName(),
+                                TYPE_MIRRORING, /* isPermanentGrant= */ false, UserHandle.CURRENT);
+                doReturn(true).when(mKeyguardManager).isKeyguardLocked();
+                doReturn(PackageManager.PERMISSION_DENIED).when(
+                        mPackageManager).checkPermission(
+                        RECORD_SENSITIVE_CONTENT, projection.packageName);
+
+                projection.start(mIMediaProjectionCallback);
+                projection.notifyVirtualDisplayCreated(10);
+
+                // The projection was started because it was allowed to capture the keyguard.
+                assertWithMessage("Failed to run projection")
+                        .that(mService.getActiveProjectionInfo()).isNotNull();
+            } catch (NameNotFoundException e) {
+                throw new RuntimeException(e);
+            }
+        });
+    }
+
     @Test
     public void testCreateProjection_attemptReuse_noPriorProjectionGrant()
             throws NameNotFoundException {
@@ -1159,7 +1212,7 @@
         doReturn(mAppInfo).when(mPackageManager).getApplicationInfoAsUser(anyString(),
                 any(ApplicationInfoFlags.class), any(UserHandle.class));
         return service.createProjectionInternal(UID, PACKAGE_NAME,
-                TYPE_MIRRORING, /* isPermanentGrant= */ true, UserHandle.CURRENT);
+                TYPE_MIRRORING, /* isPermanentGrant= */ false, UserHandle.CURRENT);
     }
 
     // Set up preconditions for starting a projection, with no foreground service requirements.
@@ -1186,6 +1239,48 @@
         return mService.getProjectionInternal(UID, PACKAGE_NAME);
     }
 
+    /**
+     * Run the provided block giving the current context's package the provided role.
+     */
+    @SuppressWarnings("SameParameterValue")
+    private void runWithRole(String role, Runnable block) {
+        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        String packageName = mContext.getPackageName();
+        UserHandle user = instrumentation.getTargetContext().getUser();
+        RoleManager roleManager = Objects.requireNonNull(
+                mContext.getSystemService(RoleManager.class));
+        try {
+            CountDownLatch latch = new CountDownLatch(1);
+            instrumentation.getUiAutomation().adoptShellPermissionIdentity(
+                    Manifest.permission.MANAGE_ROLE_HOLDERS,
+                    Manifest.permission.BYPASS_ROLE_QUALIFICATION);
+
+            roleManager.setBypassingRoleQualification(true);
+            roleManager.addRoleHolderAsUser(role, packageName,
+                    /* flags= */ RoleManager.MANAGE_HOLDERS_FLAG_DONT_KILL_APP, user,
+                    mContext.getMainExecutor(), success -> {
+                        if (success) {
+                            latch.countDown();
+                        } else {
+                            Assert.fail("Couldn't set role for test (failure) " + role);
+                        }
+                    });
+            assertWithMessage("Couldn't set role for test (timeout) : " + role)
+                    .that(latch.await(1, TimeUnit.SECONDS)).isTrue();
+            block.run();
+
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        } finally {
+            roleManager.removeRoleHolderAsUser(role, packageName,
+                    /* flags= */ RoleManager.MANAGE_HOLDERS_FLAG_DONT_KILL_APP, user,
+                    mContext.getMainExecutor(), (aBool) -> {});
+            roleManager.setBypassingRoleQualification(false);
+            instrumentation.getUiAutomation()
+                    .dropShellPermissionIdentity();
+        }
+    }
+
     private static class FakeIMediaProjectionCallback extends IMediaProjectionCallback.Stub {
         CountDownLatch mLatch = new CountDownLatch(1);
         @Override
diff --git a/services/tests/servicestests/src/com/android/server/pdb/PersistentDataBlockServiceTest.java b/services/tests/servicestests/src/com/android/server/pdb/PersistentDataBlockServiceTest.java
index f91f77a..cdfc521 100644
--- a/services/tests/servicestests/src/com/android/server/pdb/PersistentDataBlockServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/pdb/PersistentDataBlockServiceTest.java
@@ -86,7 +86,6 @@
     private File mDataBlockFile;
     private File mFrpSecretFile;
     private File mFrpSecretTmpFile;
-    private String mOemUnlockPropertyValue;
     private boolean mIsUpgradingFromPreV = false;
 
     @Mock private UserManager mUserManager;
@@ -105,13 +104,6 @@
         }
 
         @Override
-        void setProperty(String key, String value) {
-            // Override to capture the value instead of actually setting the property.
-            assertThat(key).isEqualTo("sys.oem_unlock_allowed");
-            mOemUnlockPropertyValue = value;
-        }
-
-        @Override
         boolean isUpgradingFromPreVRelease() {
             return mIsUpgradingFromPreV;
         }
@@ -598,7 +590,6 @@
 
         mInterface.setOemUnlockEnabled(true);
         assertThat(mInterface.getOemUnlockEnabled()).isTrue();
-        assertThat(mOemUnlockPropertyValue).isEqualTo("1");
     }
 
     @Test
@@ -635,7 +626,6 @@
         // The current implementation does not check digest before set or get the oem unlock bit.
         tamperWithDigest();
         mInterface.setOemUnlockEnabled(true);
-        assertThat(mOemUnlockPropertyValue).isEqualTo("1");
         tamperWithDigest();
         assertThat(mInterface.getOemUnlockEnabled()).isTrue();
     }
@@ -676,7 +666,6 @@
 
         mInternalInterface.forceOemUnlockEnabled(true);
 
-        assertThat(mOemUnlockPropertyValue).isEqualTo("1");
         assertThat(readBackingFile(mPdbService.getOemUnlockDataOffset(), 1).array())
                 .isEqualTo(new byte[] { 1 });
     }
diff --git a/services/tests/servicestests/src/com/android/server/stats/pull/netstats/NetworkStatsAccumulatorTest.kt b/services/tests/servicestests/src/com/android/server/stats/pull/netstats/NetworkStatsAccumulatorTest.kt
new file mode 100644
index 0000000..7280c69
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/stats/pull/netstats/NetworkStatsAccumulatorTest.kt
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2024 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.stats.pull.netstats
+
+import android.net.NetworkStats
+import android.net.NetworkStats.DEFAULT_NETWORK_YES
+import android.net.NetworkStats.METERED_NO
+import android.net.NetworkStats.ROAMING_NO
+import android.net.NetworkStats.SET_DEFAULT
+import android.net.NetworkStats.TAG_NONE
+import android.net.NetworkTemplate
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.testutils.assertNetworkStatsEquals
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class NetworkStatsAccumulatorTest {
+
+    @Test
+    fun hasEqualParameters_differentParameters_returnsFalse() {
+        val wifiTemplate = NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build()
+        val mobileTemplate = NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE).build()
+
+        val snapshot = NetworkStatsAccumulator(wifiTemplate, false, 0, 0)
+
+        assertThat(snapshot.hasEqualParameters(mobileTemplate, false)).isFalse()
+        assertThat(snapshot.hasEqualParameters(wifiTemplate, true)).isFalse()
+    }
+
+    @Test
+    fun hasSameParameters_equalParameters_returnsTrue() {
+        val wifiTemplate1 = NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build()
+        val wifiTemplate2 = NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build()
+
+        val snapshot = NetworkStatsAccumulator(wifiTemplate1, false, 0, 0)
+
+        assertThat(snapshot.hasEqualParameters(wifiTemplate1, false)).isTrue()
+        assertThat(snapshot.hasEqualParameters(wifiTemplate2, false)).isTrue()
+    }
+
+    @Test
+    fun queryStats_lessThanOneBucketFromSnapshotEndTime_returnsAllStats() {
+        val snapshot = NetworkStatsAccumulator(TEMPLATE, false, 200, 1000)
+
+        // Accumulator has data until 1000 (= 0), and its end-point is still in the history period.
+        // Current time is less than one bucket away from snapshot end-point: 1050 - 1000 < 200
+        val stats = snapshot.queryStats(1050, FakeStats(500, 1050, 1))!!
+
+        // After the query at 1050, accumulator should have 1 * (1050 - 1000) = 50 bytes.
+        assertNetworkStatsEquals(stats, networkStatsWithBytes(50))
+    }
+
+    @Test
+    fun queryStats_oneBucketFromSnapshotEndTime_returnsCumulativeStats() {
+        val snapshot = NetworkStatsAccumulator(TEMPLATE, false, 200, 1000)
+
+        // Accumulator has data until 1000 (= 0), and its end-point is still in the history period.
+        // Current time is one bucket away from snapshot end-point: 1250 - 1000 > 200
+        val stats = snapshot.queryStats(1250, FakeStats(550, 1250, 2))!!
+
+        // After the query at 1250, accumulator should have 2 * (1250 - 1000) = 500 bytes.
+        assertNetworkStatsEquals(stats, networkStatsWithBytes(500))
+    }
+
+    @Test
+    fun queryStats_twoBucketsFromSnapshotEndTime_returnsCumulativeStats() {
+        val snapshot = NetworkStatsAccumulator(TEMPLATE, false, 200, 1000)
+
+        // Accumulator has data until 1000 (= 0), and its end-point is in the history period.
+        // Current time is two buckets away from snapshot end-point: 1450 - 1000 > 2*200
+        val stats = snapshot.queryStats(1450, FakeStats(600, 1450, 3))!!
+
+        // After the query at 1450, accumulator should have 3 * (1450 - 1000) = 1350 bytes.
+        assertNetworkStatsEquals(stats, networkStatsWithBytes(1350))
+    }
+
+    @Test
+    fun queryStats_manyBucketsFromSnapshotEndTime_returnsCumulativeStats() {
+        val snapshot = NetworkStatsAccumulator(TEMPLATE, false, 200, 1000)
+
+        // Accumulator has data until 1000 (= 0), and its end-point is still in the history period.
+        // Current time is many buckets away from snapshot end-point
+        val stats = snapshot.queryStats(6100, FakeStats(900, 6100, 1))!!
+
+        // After the query at 6100, accumulator should have 1 * (6100 - 1000) = 5100 bytes.
+        assertNetworkStatsEquals(stats, networkStatsWithBytes(5100))
+    }
+
+    @Test
+    fun queryStats_multipleQueriesAndSameHistoryWindow_returnsCumulativeStats() {
+        val snapshot = NetworkStatsAccumulator(TEMPLATE, false, 200, 1000)
+
+        // Accumulator is queried within the history period, whose starting point stays the same.
+        // After each query, accumulator should contain bytes from the initial end-point until now.
+        val stats1 = snapshot.queryStats(5100, FakeStats(900, 5100, 1))!!
+        val stats2 = snapshot.queryStats(10100, FakeStats(900, 10100, 1))!!
+        val stats3 = snapshot.queryStats(15100, FakeStats(900, 15100, 1))!!
+
+        assertNetworkStatsEquals(stats1, networkStatsWithBytes(4100))
+        assertNetworkStatsEquals(stats2, networkStatsWithBytes(9100))
+        assertNetworkStatsEquals(stats3, networkStatsWithBytes(14100))
+    }
+
+    @Test
+    fun queryStats_multipleQueriesAndSlidingHistoryWindow_returnsCumulativeStats() {
+        val snapshot = NetworkStatsAccumulator(TEMPLATE, false, 200, 1000)
+
+        // Accumulator is queried within the history period, whose starting point is moving.
+        // After each query, accumulator should contain bytes from the initial end-point until now.
+        val stats1 = snapshot.queryStats(5100, FakeStats(900, 5100, 1))!!
+        val stats2 = snapshot.queryStats(10100, FakeStats(4000, 10100, 1))!!
+        val stats3 = snapshot.queryStats(15100, FakeStats(7000, 15100, 1))!!
+
+        assertNetworkStatsEquals(stats1, networkStatsWithBytes(4100))
+        assertNetworkStatsEquals(stats2, networkStatsWithBytes(9100))
+        assertNetworkStatsEquals(stats3, networkStatsWithBytes(14100))
+    }
+
+    @Test
+    fun queryStats_withSnapshotEndTimeBeforeHistoryStart_addsOnlyStatsWithinHistory() {
+        val snapshot = NetworkStatsAccumulator(TEMPLATE, false, 200, 1900)
+
+        // Accumulator has data until 1000 (= 0), but its end-point is not in the history period.
+        // After the query, accumulator should add only those bytes that are covered by the history.
+        val stats = snapshot.queryStats(2700, FakeStats(2200, 2700, 1))!!
+
+        assertNetworkStatsEquals(stats, networkStatsWithBytes(500))
+    }
+
+    /**
+     * Simulates equally distributed traffic stats persisted over a set period of time.
+     */
+    private class FakeStats(
+        val historyStartMillis: Long, val currentTimeMillis: Long, val bytesPerMilli: Long
+    ) : NetworkStatsAccumulator.StatsQueryFunction {
+
+        override fun queryNetworkStats(
+            template: NetworkTemplate, includeTags: Boolean, startTime: Long, endTime: Long
+        ): NetworkStats {
+            val overlap = overlap(startTime, endTime, historyStartMillis, currentTimeMillis)
+            return networkStatsWithBytes(overlap * bytesPerMilli)
+        }
+    }
+
+    companion object {
+
+        private val TEMPLATE = NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build()
+
+        fun networkStatsWithBytes(bytes: Long): NetworkStats {
+            val stats = NetworkStats(0, 1).addEntry(
+                NetworkStats.Entry(
+                    null,
+                    0,
+                    SET_DEFAULT,
+                    TAG_NONE,
+                    METERED_NO,
+                    ROAMING_NO,
+                    DEFAULT_NETWORK_YES,
+                    bytes,
+                    bytes / 100,
+                    bytes,
+                    bytes / 100,
+                    0
+                )
+            )
+            return stats
+        }
+
+        fun overlap(aStart: Long, aEnd: Long, bStart: Long, bEnd: Long): Long {
+            return maxOf(0L, minOf(aEnd, bEnd) - maxOf(aStart, bStart))
+        }
+    }
+}
\ No newline at end of file
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java
index 585df84..22a4f85 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java
@@ -2662,6 +2662,17 @@
         when(n.isColorized()).thenReturn(true);
         when(n.isStyle(Notification.CallStyle.class)).thenReturn(false);
         assertThat(GroupHelper.getSection(notification_colorFg)).isNull();
+
+        NotificationRecord notification_media = spy(getNotificationRecord(mPkg, 0, "", mUser,
+                "", false, IMPORTANCE_LOW));
+        n = mock(Notification.class);
+        sbn = spy(getSbn("package", 0, "0", UserHandle.SYSTEM));
+        when(notification_media.isConversation()).thenReturn(false);
+        when(notification_media.getNotification()).thenReturn(n);
+        when(notification_media.getSbn()).thenReturn(sbn);
+        when(sbn.getNotification()).thenReturn(n);
+        when(n.isMediaNotification()).thenReturn(true);
+        assertThat(GroupHelper.getSection(notification_media)).isNull();
     }
 
     @Test
@@ -2756,7 +2767,7 @@
     @Test
     @EnableFlags({FLAG_NOTIFICATION_FORCE_GROUPING, FLAG_NOTIFICATION_FORCE_GROUP_CONVERSATIONS})
     public void testNonGroupableNotifications_forceGroupConversations() {
-        // Check that there is no valid section for: calls, foreground services
+        // Check that there is no valid section for: calls, foreground services, media notifications
         NotificationRecord notification_call = spy(getNotificationRecord(mPkg, 0, "", mUser,
                 "", false, IMPORTANCE_LOW));
         Notification n = mock(Notification.class);
@@ -2780,6 +2791,17 @@
         when(n.isColorized()).thenReturn(true);
         when(n.isStyle(Notification.CallStyle.class)).thenReturn(false);
         assertThat(GroupHelper.getSection(notification_colorFg)).isNull();
+
+        NotificationRecord notification_media = spy(getNotificationRecord(mPkg, 0, "", mUser,
+                "", false, IMPORTANCE_LOW));
+        n = mock(Notification.class);
+        sbn = spy(getSbn("package", 0, "0", UserHandle.SYSTEM));
+        when(notification_media.isConversation()).thenReturn(false);
+        when(notification_media.getNotification()).thenReturn(n);
+        when(notification_media.getSbn()).thenReturn(sbn);
+        when(sbn.getNotification()).thenReturn(n);
+        when(n.isMediaNotification()).thenReturn(true);
+        assertThat(GroupHelper.getSection(notification_media)).isNull();
     }
 
     @Test
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
index 48bc9d7..3bbc6b2 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
@@ -63,11 +63,13 @@
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.IInterface;
+import android.os.Looper;
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.platform.test.annotations.EnableFlags;
 import android.provider.Settings;
+import android.testing.TestableLooper;
 import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.ArraySet;
@@ -82,6 +84,7 @@
 
 import com.google.android.collect.Lists;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
@@ -103,6 +106,7 @@
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 
+
 public class ManagedServicesTest extends UiServiceTestCase {
 
     @Mock
@@ -115,6 +119,7 @@
     private ManagedServices.UserProfiles mUserProfiles;
     @Mock private DevicePolicyManager mDpm;
     Object mLock = new Object();
+    private TestableLooper mTestableLooper;
 
     UserInfo mZero = new UserInfo(0, "zero", 0);
     UserInfo mTen = new UserInfo(10, "ten", 0);
@@ -142,6 +147,7 @@
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
+        mTestableLooper = new TestableLooper(Looper.getMainLooper());
 
         mContext.setMockPackageManager(mPm);
         mContext.addMockSystemService(Context.USER_SERVICE, mUm);
@@ -199,6 +205,11 @@
                 mIpm, APPROVAL_BY_COMPONENT);
     }
 
+    @After
+    public void tearDown() throws Exception {
+        mTestableLooper.destroy();
+    }
+
     @Test
     public void testBackupAndRestore_migration() throws Exception {
         for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
@@ -888,7 +899,7 @@
             return true;
         });
 
-        mockServiceInfoWithMetaData(List.of(cn), service, new ArrayMap<>());
+        mockServiceInfoWithMetaData(List.of(cn), service, pm, new ArrayMap<>());
         service.addApprovedList("a", 0, true);
 
         service.reregisterService(cn, 0);
@@ -919,7 +930,7 @@
             return true;
         });
 
-        mockServiceInfoWithMetaData(List.of(cn), service, new ArrayMap<>());
+        mockServiceInfoWithMetaData(List.of(cn), service, pm, new ArrayMap<>());
         service.addApprovedList("a", 0, false);
 
         service.reregisterService(cn, 0);
@@ -950,7 +961,7 @@
             return true;
         });
 
-        mockServiceInfoWithMetaData(List.of(cn), service, new ArrayMap<>());
+        mockServiceInfoWithMetaData(List.of(cn), service, pm, new ArrayMap<>());
         service.addApprovedList("a/a", 0, true);
 
         service.reregisterService(cn, 0);
@@ -981,7 +992,7 @@
             return true;
         });
 
-        mockServiceInfoWithMetaData(List.of(cn), service, new ArrayMap<>());
+        mockServiceInfoWithMetaData(List.of(cn), service, pm, new ArrayMap<>());
         service.addApprovedList("a/a", 0, false);
 
         service.reregisterService(cn, 0);
@@ -1053,6 +1064,77 @@
     }
 
     @Test
+    public void registerService_bindingDied_rebindIsClearedOnUserSwitch() throws Exception {
+        Context context = mock(Context.class);
+        PackageManager pm = mock(PackageManager.class);
+        ApplicationInfo ai = new ApplicationInfo();
+        ai.targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT;
+
+        when(context.getPackageName()).thenReturn(mPkg);
+        when(context.getUserId()).thenReturn(mUser.getIdentifier());
+        when(context.getPackageManager()).thenReturn(pm);
+        when(pm.getApplicationInfo(anyString(), anyInt())).thenReturn(ai);
+
+        ManagedServices service = new TestManagedServices(context, mLock, mUserProfiles, mIpm,
+                APPROVAL_BY_PACKAGE);
+        service = spy(service);
+        ComponentName cn = ComponentName.unflattenFromString("a/a");
+
+        // Trigger onBindingDied for component when registering
+        //  => will schedule a rebind in 10 seconds
+        when(context.bindServiceAsUser(any(), any(), anyInt(), any())).thenAnswer(invocation -> {
+            Object[] args = invocation.getArguments();
+            ServiceConnection sc = (ServiceConnection) args[1];
+            sc.onBindingDied(cn);
+            return true;
+        });
+        service.registerService(cn, 0);
+        assertThat(service.isBound(cn, 0)).isFalse();
+
+        // Switch to user 10
+        service.onUserSwitched(10);
+
+        // Check that the scheduled rebind for user 0 was cleared
+        mTestableLooper.moveTimeForward(ManagedServices.ON_BINDING_DIED_REBIND_DELAY_MS);
+        mTestableLooper.processAllMessages();
+        verify(service, never()).reregisterService(any(), anyInt());
+    }
+
+    @Test
+    public void registerService_bindingDied_rebindIsExecutedAfterTimeout() throws Exception {
+        Context context = mock(Context.class);
+        PackageManager pm = mock(PackageManager.class);
+        ApplicationInfo ai = new ApplicationInfo();
+        ai.targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT;
+
+        when(context.getPackageName()).thenReturn(mPkg);
+        when(context.getUserId()).thenReturn(mUser.getIdentifier());
+        when(context.getPackageManager()).thenReturn(pm);
+        when(pm.getApplicationInfo(anyString(), anyInt())).thenReturn(ai);
+
+        ManagedServices service = new TestManagedServices(context, mLock, mUserProfiles, mIpm,
+                APPROVAL_BY_PACKAGE);
+        service = spy(service);
+        ComponentName cn = ComponentName.unflattenFromString("a/a");
+
+        // Trigger onBindingDied for component when registering
+        //  => will schedule a rebind in 10 seconds
+        when(context.bindServiceAsUser(any(), any(), anyInt(), any())).thenAnswer(invocation -> {
+            Object[] args = invocation.getArguments();
+            ServiceConnection sc = (ServiceConnection) args[1];
+            sc.onBindingDied(cn);
+            return true;
+        });
+        service.registerService(cn, 0);
+        assertThat(service.isBound(cn, 0)).isFalse();
+
+        // Check that the scheduled rebind is run
+        mTestableLooper.moveTimeForward(ManagedServices.ON_BINDING_DIED_REBIND_DELAY_MS);
+        mTestableLooper.processAllMessages();
+        verify(service, times(1)).reregisterService(eq(cn), eq(0));
+    }
+
+    @Test
     public void testPackageUninstall_packageNoLongerInApprovedList() throws Exception {
         for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
             ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
@@ -1211,6 +1293,64 @@
     }
 
     @Test
+    public void testUpgradeAppNoIntentFilterNoRebind() throws Exception {
+        Context context = spy(getContext());
+        doReturn(true).when(context).bindServiceAsUser(any(), any(), anyInt(), any());
+
+        ManagedServices service = new TestManagedServices(context, mLock, mUserProfiles,
+                mIpm, APPROVAL_BY_COMPONENT);
+
+        List<String> packages = new ArrayList<>();
+        packages.add("package");
+        addExpectedServices(service, packages, 0);
+
+        final ComponentName unapprovedComponent = ComponentName.unflattenFromString("package/C1");
+        final ComponentName approvedComponent = ComponentName.unflattenFromString("package/C2");
+
+        // Both components are approved initially
+        mExpectedPrimaryComponentNames.clear();
+        mExpectedPrimaryPackages.clear();
+        mExpectedPrimaryComponentNames.put(0, "package/C1:package/C2");
+        mExpectedSecondaryComponentNames.clear();
+        mExpectedSecondaryPackages.clear();
+
+        loadXml(service);
+
+        //Component package/C1 loses serviceInterface intent filter
+        ManagedServices.Config config = service.getConfig();
+        when(mPm.queryIntentServicesAsUser(any(), anyInt(), anyInt()))
+                .thenAnswer(new Answer<List<ResolveInfo>>() {
+                    @Override
+                    public List<ResolveInfo> answer(InvocationOnMock invocationOnMock)
+                            throws Throwable {
+                        Object[] args = invocationOnMock.getArguments();
+                        Intent invocationIntent = (Intent) args[0];
+                        if (invocationIntent != null) {
+                            if (invocationIntent.getAction().equals(config.serviceInterface)
+                                    && packages.contains(invocationIntent.getPackage())) {
+                                List<ResolveInfo> dummyServices = new ArrayList<>();
+                                ResolveInfo resolveInfo = new ResolveInfo();
+                                ServiceInfo serviceInfo = new ServiceInfo();
+                                serviceInfo.packageName = invocationIntent.getPackage();
+                                serviceInfo.name = approvedComponent.getClassName();
+                                serviceInfo.permission = service.getConfig().bindPermission;
+                                resolveInfo.serviceInfo = serviceInfo;
+                                dummyServices.add(resolveInfo);
+                                return dummyServices;
+                            }
+                        }
+                        return new ArrayList<>();
+                    }
+                });
+
+        // Trigger package update
+        service.onPackagesChanged(false, new String[]{"package"}, new int[]{0});
+
+        assertFalse(service.isComponentEnabledForCurrentProfiles(unapprovedComponent));
+        assertTrue(service.isComponentEnabledForCurrentProfiles(approvedComponent));
+    }
+
+    @Test
     public void testSetPackageOrComponentEnabled() throws Exception {
         for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
             ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
@@ -1223,6 +1363,21 @@
                             "user10package1/K", "user10.3/Component", "user10package2/L",
                             "user10.4/Component"}));
 
+            // mock permissions for services
+            PackageManager pm = mock(PackageManager.class);
+            when(getContext().getPackageManager()).thenReturn(pm);
+            List<ComponentName> enabledComponents = List.of(
+                    ComponentName.unflattenFromString("package/Comp"),
+                    ComponentName.unflattenFromString("package/C2"),
+                    ComponentName.unflattenFromString("again/M4"),
+                    ComponentName.unflattenFromString("user10package/B"),
+                    ComponentName.unflattenFromString("user10/Component"),
+                    ComponentName.unflattenFromString("user10package1/K"),
+                    ComponentName.unflattenFromString("user10.3/Component"),
+                    ComponentName.unflattenFromString("user10package2/L"),
+                    ComponentName.unflattenFromString("user10.4/Component"));
+            mockServiceInfoWithMetaData(enabledComponents, service, pm, new ArrayMap<>());
+
             for (int userId : expectedEnabled.keySet()) {
                 ArrayList<String> expectedForUser = expectedEnabled.get(userId);
                 for (int i = 0; i < expectedForUser.size(); i++) {
@@ -1944,7 +2099,7 @@
         metaDataAutobindAllow.putBoolean(META_DATA_DEFAULT_AUTOBIND, true);
         metaDatas.put(cn_allowed, metaDataAutobindAllow);
 
-        mockServiceInfoWithMetaData(componentNames, service, metaDatas);
+        mockServiceInfoWithMetaData(componentNames, service, pm, metaDatas);
 
         service.addApprovedList(cn_allowed.flattenToString(), 0, true);
         service.addApprovedList(cn_disallowed.flattenToString(), 0, true);
@@ -1989,7 +2144,7 @@
         metaDataAutobindDisallow.putBoolean(META_DATA_DEFAULT_AUTOBIND, false);
         metaDatas.put(cn_disallowed, metaDataAutobindDisallow);
 
-        mockServiceInfoWithMetaData(componentNames, service, metaDatas);
+        mockServiceInfoWithMetaData(componentNames, service, pm, metaDatas);
 
         service.addApprovedList(cn_disallowed.flattenToString(), 0, true);
 
@@ -2028,7 +2183,7 @@
         metaDataAutobindDisallow.putBoolean(META_DATA_DEFAULT_AUTOBIND, false);
         metaDatas.put(cn_disallowed, metaDataAutobindDisallow);
 
-        mockServiceInfoWithMetaData(componentNames, service, metaDatas);
+        mockServiceInfoWithMetaData(componentNames, service, pm, metaDatas);
 
         service.addApprovedList(cn_disallowed.flattenToString(), 0, true);
 
@@ -2099,8 +2254,8 @@
     }
 
     private void mockServiceInfoWithMetaData(List<ComponentName> componentNames,
-            ManagedServices service, ArrayMap<ComponentName, Bundle> metaDatas)
-            throws RemoteException {
+            ManagedServices service, PackageManager packageManager,
+            ArrayMap<ComponentName, Bundle> metaDatas) throws RemoteException {
         when(mIpm.getServiceInfo(any(), anyLong(), anyInt())).thenAnswer(
                 (Answer<ServiceInfo>) invocation -> {
                     ComponentName invocationCn = invocation.getArgument(0);
@@ -2115,6 +2270,39 @@
                     return null;
                 }
         );
+
+        // add components to queryIntentServicesAsUser response
+        final List<String> packages = new ArrayList<>();
+        for (ComponentName cn: componentNames) {
+            packages.add(cn.getPackageName());
+        }
+        ManagedServices.Config config = service.getConfig();
+        when(packageManager.queryIntentServicesAsUser(any(), anyInt(), anyInt())).
+                thenAnswer(new Answer<List<ResolveInfo>>() {
+                @Override
+                public List<ResolveInfo> answer(InvocationOnMock invocationOnMock)
+                    throws Throwable {
+                    Object[] args = invocationOnMock.getArguments();
+                    Intent invocationIntent = (Intent) args[0];
+                    if (invocationIntent != null) {
+                        if (invocationIntent.getAction().equals(config.serviceInterface)
+                            && packages.contains(invocationIntent.getPackage())) {
+                            List<ResolveInfo> dummyServices = new ArrayList<>();
+                            for (ComponentName cn: componentNames) {
+                                ResolveInfo resolveInfo = new ResolveInfo();
+                                ServiceInfo serviceInfo = new ServiceInfo();
+                                serviceInfo.packageName = invocationIntent.getPackage();
+                                serviceInfo.name = cn.getClassName();
+                                serviceInfo.permission = service.getConfig().bindPermission;
+                                resolveInfo.serviceInfo = serviceInfo;
+                                dummyServices.add(resolveInfo);
+                            }
+                            return dummyServices;
+                        }
+                    }
+                    return new ArrayList<>();
+                }
+            });
     }
 
     private void resetComponentsAndPackages() {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java
index 18ca09b..bf0586c 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java
@@ -18,11 +18,21 @@
 
 import static android.app.NotificationManager.IMPORTANCE_LOW;
 
+import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
+import static android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION;
+import static android.service.notification.Flags.FLAG_NOTIFICATION_FORCE_GROUPING;
+
+import static com.google.common.truth.Truth.assertThat;
+
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertNull;
 import static junit.framework.Assert.assertTrue;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
 import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.PendingIntent;
@@ -30,12 +40,16 @@
 import android.graphics.drawable.Icon;
 import android.os.Bundle;
 import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.service.notification.Adjustment;
 import android.service.notification.SnoozeCriterion;
 import android.service.notification.StatusBarNotification;
 
 import com.android.server.UiServiceTestCase;
 
+import org.junit.Rule;
 import org.junit.Test;
 
 import java.util.ArrayList;
@@ -43,6 +57,9 @@
 
 public class NotificationAdjustmentExtractorTest extends UiServiceTestCase {
 
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT);
+
     @Test
     public void testExtractsAdjustment() {
         NotificationAdjustmentExtractor extractor = new NotificationAdjustmentExtractor();
@@ -111,6 +128,44 @@
         assertEquals(snoozeCriteria, r.getSnoozeCriteria());
     }
 
+    @Test
+    @EnableFlags({FLAG_NOTIFICATION_CLASSIFICATION, FLAG_NOTIFICATION_FORCE_GROUPING})
+    public void testClassificationAdjustments_triggerRegrouping() {
+        GroupHelper groupHelper = mock(GroupHelper.class);
+        NotificationAdjustmentExtractor extractor = new NotificationAdjustmentExtractor();
+        extractor.setGroupHelper(groupHelper);
+
+        NotificationRecord r = generateRecord();
+
+        Bundle classificationAdj = new Bundle();
+        classificationAdj.putParcelable(Adjustment.KEY_TYPE, mock(NotificationChannel.class));
+        Adjustment adjustment = new Adjustment("pkg", r.getKey(), classificationAdj, "", 0);
+        r.addAdjustment(adjustment);
+
+        RankingReconsideration regroupingTask = extractor.process(r);
+        assertThat(regroupingTask).isNotNull();
+        regroupingTask.applyChangesLocked(r);
+        verify(groupHelper, times(1)).onChannelUpdated(r);
+    }
+
+    @Test
+    @DisableFlags({FLAG_NOTIFICATION_CLASSIFICATION, FLAG_NOTIFICATION_FORCE_GROUPING})
+    public void testClassificationAdjustments_notTriggerRegrouping_flagsDisabled() {
+        GroupHelper groupHelper = mock(GroupHelper.class);
+        NotificationAdjustmentExtractor extractor = new NotificationAdjustmentExtractor();
+        extractor.setGroupHelper(groupHelper);
+
+        NotificationRecord r = generateRecord();
+
+        Bundle classificationAdj = new Bundle();
+        classificationAdj.putParcelable(Adjustment.KEY_TYPE, mock(NotificationChannel.class));
+        Adjustment adjustment = new Adjustment("pkg", r.getKey(), classificationAdj, "", 0);
+        r.addAdjustment(adjustment);
+
+        RankingReconsideration regroupingTask = extractor.process(r);
+        assertThat(regroupingTask).isNull();
+    }
+
     private NotificationRecord generateRecord() {
         NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_LOW);
         final Notification.Builder builder = new Notification.Builder(getContext())
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
index a45b102..7e4ae67 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
@@ -15,13 +15,17 @@
  */
 package com.android.server.notification;
 
+import static android.os.UserHandle.USER_ALL;
+
+import static com.google.common.truth.Truth.assertThat;
+
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertNotNull;
 import static junit.framework.Assert.assertTrue;
 
-import static junit.framework.Assert.fail;
 import static org.junit.Assert.assertNull;
+
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Matchers.any;
@@ -33,6 +37,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.Manifest;
 import android.app.ActivityManager;
 import android.app.INotificationManager;
 import android.content.ComponentName;
@@ -42,24 +47,28 @@
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
 import android.content.pm.UserInfo;
-import android.os.UserHandle;
 import android.os.UserManager;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.service.notification.Adjustment;
 import android.testing.TestableContext;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.IntArray;
 import android.util.Xml;
-import android.Manifest;
+
+import androidx.test.runner.AndroidJUnit4;
 
 import com.android.internal.util.CollectionUtils;
-import com.android.internal.util.function.TriPredicate;
 import com.android.modules.utils.TypedXmlPullParser;
 import com.android.modules.utils.TypedXmlSerializer;
 import com.android.server.UiServiceTestCase;
 import com.android.server.notification.NotificationManagerService.NotificationAssistants;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
@@ -71,8 +80,12 @@
 import java.util.Arrays;
 import java.util.List;
 
+@RunWith(AndroidJUnit4.class)
 public class NotificationAssistantsTest extends UiServiceTestCase {
 
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
     @Mock
     private PackageManager mPm;
     @Mock
@@ -98,6 +111,35 @@
 
     ComponentName mCn = new ComponentName("a", "b");
 
+
+    // Helper function to hold mApproved lock, avoid GuardedBy lint errors
+    private boolean isUserSetServicesEmpty(NotificationAssistants assistant, int userId) {
+        synchronized (assistant.mApproved) {
+            return assistant.mUserSetServices.get(userId).isEmpty();
+        }
+    }
+
+    private void writeXmlAndReload(int userId) throws Exception {
+        TypedXmlSerializer serializer = Xml.newFastSerializer();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
+        serializer.startDocument(null, true);
+        mAssistants.writeXml(serializer, false, userId);
+        serializer.endDocument();
+        serializer.flush();
+
+        //fail(baos.toString("UTF-8"));
+
+        final TypedXmlPullParser parser = Xml.newFastPullParser();
+        parser.setInput(new BufferedInputStream(
+                new ByteArrayInputStream(baos.toByteArray())), null);
+
+        parser.nextTag();
+        mAssistants = spy(mNm.new NotificationAssistants(mContext, mLock, mUserProfiles, miPm));
+        mAssistants.readXml(parser, mNm::canUseManagedServices, false, USER_ALL);
+    }
+
+
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
@@ -152,6 +194,8 @@
     public void testWriteXml_userTurnedOffNAS() throws Exception {
         int userId = ActivityManager.getCurrentUser();
 
+        doReturn(true).when(mAssistants).isValidService(eq(mCn), eq(userId));
+
         mAssistants.loadDefaultsFromConfig(true);
 
         mAssistants.setPackageOrComponentEnabled(mCn.flattenToString(), userId, true,
@@ -164,25 +208,7 @@
         mAssistants.setPackageOrComponentEnabled(current.flattenToString(), userId, true, false,
                 true);
 
-        TypedXmlSerializer serializer = Xml.newFastSerializer();
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
-        serializer.startDocument(null, true);
-        mAssistants.writeXml(serializer, true, userId);
-        serializer.endDocument();
-        serializer.flush();
-
-        //fail(baos.toString("UTF-8"));
-
-        final TypedXmlPullParser parser = Xml.newFastPullParser();
-        parser.setInput(new BufferedInputStream(
-                new ByteArrayInputStream(baos.toByteArray())), null);
-        TriPredicate<String, Integer, String> allowedManagedServicePackages =
-                mNm::canUseManagedServices;
-
-        parser.nextTag();
-        mAssistants = spy(mNm.new NotificationAssistants(mContext, mLock, mUserProfiles, miPm));
-        mAssistants.readXml(parser, allowedManagedServicePackages, false, UserHandle.USER_ALL);
+        writeXmlAndReload(USER_ALL);
 
         ArrayMap<Boolean, ArraySet<String>> approved = mAssistants.mApproved.get(0);
         // approved should not be null
@@ -203,11 +229,9 @@
         final TypedXmlPullParser parser = Xml.newFastPullParser();
         parser.setInput(new BufferedInputStream(
                 new ByteArrayInputStream(xml.toString().getBytes())), null);
-        TriPredicate<String, Integer, String> allowedManagedServicePackages =
-                mNm::canUseManagedServices;
 
         parser.nextTag();
-        mAssistants.readXml(parser, allowedManagedServicePackages, false, UserHandle.USER_ALL);
+        mAssistants.readXml(parser, mNm::canUseManagedServices, false, USER_ALL);
 
         ArrayMap<Boolean, ArraySet<String>> approved = mAssistants.mApproved.get(0);
 
@@ -226,11 +250,9 @@
         final TypedXmlPullParser parser = Xml.newFastPullParser();
         parser.setInput(new BufferedInputStream(
                 new ByteArrayInputStream(xml.toString().getBytes())), null);
-        TriPredicate<String, Integer, String> allowedManagedServicePackages =
-                mNm::canUseManagedServices;
 
         parser.nextTag();
-        mAssistants.readXml(parser, allowedManagedServicePackages, true,
+        mAssistants.readXml(parser, mNm::canUseManagedServices, true,
                 ActivityManager.getCurrentUser());
 
         ArrayMap<Boolean, ArraySet<String>> approved = mAssistants.mApproved.get(0);
@@ -253,11 +275,9 @@
         final TypedXmlPullParser parser = Xml.newFastPullParser();
         parser.setInput(new BufferedInputStream(
                 new ByteArrayInputStream(xml.toString().getBytes())), null);
-        TriPredicate<String, Integer, String> allowedManagedServicePackages =
-                mNm::canUseManagedServices;
 
         parser.nextTag();
-        mAssistants.readXml(parser, allowedManagedServicePackages, false, UserHandle.USER_ALL);
+        mAssistants.readXml(parser, mNm::canUseManagedServices, false, USER_ALL);
 
         verify(mAssistants, times(1)).upgradeUserSet();
         assertTrue(mAssistants.mIsUserChanged.get(0));
@@ -273,11 +293,9 @@
         final TypedXmlPullParser parser = Xml.newFastPullParser();
         parser.setInput(new BufferedInputStream(
                 new ByteArrayInputStream(xml.toString().getBytes())), null);
-        TriPredicate<String, Integer, String> allowedManagedServicePackages =
-                mNm::canUseManagedServices;
 
         parser.nextTag();
-        mAssistants.readXml(parser, allowedManagedServicePackages, false, UserHandle.USER_ALL);
+        mAssistants.readXml(parser, mNm::canUseManagedServices, false, USER_ALL);
 
         verify(mAssistants, times(0)).upgradeUserSet();
         assertTrue(isUserSetServicesEmpty(mAssistants, 0));
@@ -294,11 +312,9 @@
         final TypedXmlPullParser parser = Xml.newFastPullParser();
         parser.setInput(new BufferedInputStream(
                 new ByteArrayInputStream(xml.toString().getBytes())), null);
-        TriPredicate<String, Integer, String> allowedManagedServicePackages =
-                mNm::canUseManagedServices;
 
         parser.nextTag();
-        mAssistants.readXml(parser, allowedManagedServicePackages, false, UserHandle.USER_ALL);
+        mAssistants.readXml(parser, mNm::canUseManagedServices, false, USER_ALL);
 
         verify(mAssistants, times(0)).upgradeUserSet();
         assertTrue(isUserSetServicesEmpty(mAssistants, 0));
@@ -314,11 +330,9 @@
         final TypedXmlPullParser parser = Xml.newFastPullParser();
         parser.setInput(new BufferedInputStream(
                 new ByteArrayInputStream(xml.toString().getBytes())), null);
-        TriPredicate<String, Integer, String> allowedManagedServicePackages =
-                mNm::canUseManagedServices;
 
         parser.nextTag();
-        mAssistants.readXml(parser, allowedManagedServicePackages, false, UserHandle.USER_ALL);
+        mAssistants.readXml(parser, mNm::canUseManagedServices, false, USER_ALL);
 
         verify(mAssistants, times(1)).upgradeUserSet();
         assertTrue(isUserSetServicesEmpty(mAssistants, 0));
@@ -334,11 +348,9 @@
         final TypedXmlPullParser parser = Xml.newFastPullParser();
         parser.setInput(new BufferedInputStream(
                 new ByteArrayInputStream(xml.toString().getBytes())), null);
-        TriPredicate<String, Integer, String> allowedManagedServicePackages =
-                mNm::canUseManagedServices;
 
         parser.nextTag();
-        mAssistants.readXml(parser, allowedManagedServicePackages, false, UserHandle.USER_ALL);
+        mAssistants.readXml(parser, mNm::canUseManagedServices, false, USER_ALL);
 
         verify(mAssistants, times(1)).upgradeUserSet();
         assertTrue(isUserSetServicesEmpty(mAssistants, 0));
@@ -361,7 +373,7 @@
                 new ByteArrayInputStream(xml.toString().getBytes())), null);
 
         parser.nextTag();
-        mAssistants.readXml(parser, null, false, UserHandle.USER_ALL);
+        mAssistants.readXml(parser, null, false, USER_ALL);
 
         assertEquals(1, mAssistants.getAllowedComponents(0).size());
         assertEquals(new ArrayList(Arrays.asList(new ComponentName("a", "a"))),
@@ -378,7 +390,7 @@
         parser.setInput(new BufferedInputStream(
                 new ByteArrayInputStream(xml.toString().getBytes())), null);
         parser.nextTag();
-        mAssistants.readXml(parser, null, false, UserHandle.USER_ALL);
+        mAssistants.readXml(parser, null, false, USER_ALL);
 
         verify(mNm, never()).setDefaultAssistantForUser(anyInt());
         verify(mAssistants, times(1)).addApprovedList(
@@ -389,6 +401,10 @@
     public void testSetPackageOrComponentEnabled_onlyOnePackage() throws Exception {
         ComponentName component1 = ComponentName.unflattenFromString("package/Component1");
         ComponentName component2 = ComponentName.unflattenFromString("package/Component2");
+
+        doReturn(true).when(mAssistants).isValidService(eq(component1), eq(mZero.id));
+        doReturn(true).when(mAssistants).isValidService(eq(component2), eq(mZero.id));
+
         mAssistants.setPackageOrComponentEnabled(component1.flattenToString(), mZero.id, true,
                 true, true);
         verify(mNm, never()).setNotificationAssistantAccessGrantedForUserInternal(
@@ -529,10 +545,69 @@
         assertEquals(new ArraySet<>(), mAssistants.getDefaultComponents());
     }
 
-    // Helper function to hold mApproved lock, avoid GuardedBy lint errors
-    private boolean isUserSetServicesEmpty(NotificationAssistants assistant, int userId) {
-        synchronized (assistant.mApproved) {
-            return assistant.mUserSetServices.get(userId).isEmpty();
-        }
+    @Test
+    @EnableFlags(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION)
+    public void testSetAdjustmentTypeSupportedState() throws Exception {
+        int userId = ActivityManager.getCurrentUser();
+
+        doReturn(true).when(mAssistants).isValidService(eq(mCn), eq(userId));
+        mAssistants.loadDefaultsFromConfig(true);
+        mAssistants.setPackageOrComponentEnabled(mCn.flattenToString(), userId, true,
+                true, true);
+        ComponentName current = CollectionUtils.firstOrNull(
+                mAssistants.getAllowedComponents(userId));
+        assertNotNull(current);
+
+        assertThat(mAssistants.getUnsupportedAdjustments(userId).size()).isEqualTo(0);
+
+        ManagedServices.ManagedServiceInfo info =
+                mAssistants.new ManagedServiceInfo(null, mCn, userId, false, null, 35, 2345256);
+        mAssistants.setAdjustmentTypeSupportedState(info, Adjustment.KEY_NOT_CONVERSATION, false);
+
+        assertThat(mAssistants.getUnsupportedAdjustments(userId)).contains(
+                Adjustment.KEY_NOT_CONVERSATION);
+        assertThat(mAssistants.getUnsupportedAdjustments(userId).size()).isEqualTo(1);
     }
-}
+
+    @Test
+    @EnableFlags(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION)
+    public void testSetAdjustmentTypeSupportedState_readWriteXml_entries() throws Exception {
+        int userId = ActivityManager.getCurrentUser();
+
+        doReturn(true).when(mAssistants).isValidService(eq(mCn), eq(userId));
+        mAssistants.loadDefaultsFromConfig(true);
+        mAssistants.setPackageOrComponentEnabled(mCn.flattenToString(), userId, true,
+                true, true);
+        ComponentName current = CollectionUtils.firstOrNull(
+                mAssistants.getAllowedComponents(userId));
+        assertNotNull(current);
+
+        ManagedServices.ManagedServiceInfo info =
+                mAssistants.new ManagedServiceInfo(null, mCn, userId, false, null, 35, 2345256);
+        mAssistants.setAdjustmentTypeSupportedState(info, Adjustment.KEY_NOT_CONVERSATION, false);
+
+        writeXmlAndReload(USER_ALL);
+
+        assertThat(mAssistants.getUnsupportedAdjustments(userId)).contains(
+                Adjustment.KEY_NOT_CONVERSATION);
+        assertThat(mAssistants.getUnsupportedAdjustments(userId).size()).isEqualTo(1);
+    }
+
+    @Test
+    @EnableFlags(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION)
+    public void testSetAdjustmentTypeSupportedState_readWriteXml_empty() throws Exception {
+        int userId = ActivityManager.getCurrentUser();
+
+        doReturn(true).when(mAssistants).isValidService(eq(mCn), eq(userId));
+        mAssistants.loadDefaultsFromConfig(true);
+        mAssistants.setPackageOrComponentEnabled(mCn.flattenToString(), userId, true,
+                true, true);
+        ComponentName current = CollectionUtils.firstOrNull(
+                mAssistants.getAllowedComponents(userId));
+        assertNotNull(current);
+
+        writeXmlAndReload(USER_ALL);
+
+        assertThat(mAssistants.getUnsupportedAdjustments(userId).size()).isEqualTo(0);
+    }
+}
\ No newline at end of file
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAttentionHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAttentionHelperTest.java
index 62e5b9a..592eec5 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAttentionHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAttentionHelperTest.java
@@ -31,6 +31,12 @@
 import static android.media.AudioAttributes.USAGE_NOTIFICATION;
 import static android.media.AudioAttributes.USAGE_NOTIFICATION_RINGTONE;
 
+import static com.android.server.notification.NotificationAttentionHelper.MUTE_REASON_COOLDOWN;
+import static com.android.server.notification.NotificationAttentionHelper.MUTE_REASON_FLAG_SILENT;
+import static com.android.server.notification.NotificationAttentionHelper.MUTE_REASON_GROUP_ALERT;
+import static com.android.server.notification.NotificationAttentionHelper.MUTE_REASON_NOT_MUTED;
+import static com.android.server.notification.NotificationAttentionHelper.MUTE_REASON_OTHER_INSISTENT_PLAYING;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertEquals;
@@ -106,6 +112,7 @@
 import com.android.internal.config.sysui.TestableFlagResolver;
 import com.android.internal.logging.InstanceIdSequence;
 import com.android.internal.logging.InstanceIdSequenceFake;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.util.IntPair;
 import com.android.server.UiServiceTestCase;
 import com.android.server.lights.LightsManager;
@@ -1276,7 +1283,8 @@
         verifyNeverBeep();
         assertFalse(r.isInterruptive());
         assertEquals(-1, r.getLastAudiblyAlertedMs());
-        assertTrue(mAttentionHelper.shouldMuteNotificationLocked(r, DEFAULT_SIGNALS));
+        assertThat(mAttentionHelper.shouldMuteNotificationLocked(r, DEFAULT_SIGNALS,
+                true)).isEqualTo(MUTE_REASON_FLAG_SILENT);
     }
 
     @Test
@@ -1295,7 +1303,8 @@
         verifyNeverBeep();
         assertFalse(r.isInterruptive());
         assertEquals(-1, r.getLastAudiblyAlertedMs());
-        assertTrue(mAttentionHelper.shouldMuteNotificationLocked(r, DEFAULT_SIGNALS));
+        assertThat(mAttentionHelper.shouldMuteNotificationLocked(r, DEFAULT_SIGNALS,
+                true)).isEqualTo(MUTE_REASON_GROUP_ALERT);
     }
 
     @Test
@@ -1861,7 +1870,9 @@
         verifyBeepLooped();
 
         NotificationRecord interrupter = getBeepyOtherNotification();
-        assertTrue(mAttentionHelper.shouldMuteNotificationLocked(interrupter, DEFAULT_SIGNALS));
+        assertThat(
+                mAttentionHelper.shouldMuteNotificationLocked(interrupter, DEFAULT_SIGNALS,
+                true)).isEqualTo(MUTE_REASON_OTHER_INSISTENT_PLAYING);
         mAttentionHelper.buzzBeepBlinkLocked(interrupter, DEFAULT_SIGNALS);
 
         verifyBeep(1);
@@ -1879,16 +1890,16 @@
         ringtoneChannel.enableVibration(true);
         NotificationRecord ringtoneNotification = getCallRecord(1, ringtoneChannel, true);
         mService.addNotification(ringtoneNotification);
-        assertFalse(mAttentionHelper.shouldMuteNotificationLocked(ringtoneNotification,
-            DEFAULT_SIGNALS));
+        assertThat(mAttentionHelper.shouldMuteNotificationLocked(ringtoneNotification,
+                DEFAULT_SIGNALS, true)).isEqualTo(MUTE_REASON_NOT_MUTED);
         mAttentionHelper.buzzBeepBlinkLocked(ringtoneNotification, DEFAULT_SIGNALS);
         verifyBeepLooped();
         verifyDelayedVibrateLooped();
         Mockito.reset(mVibrator);
         Mockito.reset(mRingtonePlayer);
 
-        assertFalse(mAttentionHelper.shouldMuteNotificationLocked(ringtoneNotification,
-            DEFAULT_SIGNALS));
+        assertThat(mAttentionHelper.shouldMuteNotificationLocked(ringtoneNotification,
+                DEFAULT_SIGNALS, true)).isEqualTo(MUTE_REASON_NOT_MUTED);
         mAttentionHelper.buzzBeepBlinkLocked(ringtoneNotification, DEFAULT_SIGNALS);
 
         // beep wasn't reset
@@ -1907,8 +1918,8 @@
         ringtoneChannel.enableVibration(true);
         NotificationRecord ringtoneNotification = getCallRecord(1, ringtoneChannel, true);
         mService.addNotification(ringtoneNotification);
-        assertFalse(mAttentionHelper.shouldMuteNotificationLocked(ringtoneNotification,
-            DEFAULT_SIGNALS));
+        assertThat(mAttentionHelper.shouldMuteNotificationLocked(ringtoneNotification,
+                DEFAULT_SIGNALS, true)).isEqualTo(MUTE_REASON_NOT_MUTED);
         mAttentionHelper.buzzBeepBlinkLocked(ringtoneNotification, DEFAULT_SIGNALS);
         verifyBeepLooped();
         verifyDelayedVibrateLooped();
@@ -1930,8 +1941,8 @@
         ringtoneChannel.enableVibration(true);
         NotificationRecord ringtoneNotification = getCallRecord(1, ringtoneChannel, true);
         mService.addNotification(ringtoneNotification);
-        assertFalse(mAttentionHelper.shouldMuteNotificationLocked(ringtoneNotification,
-            DEFAULT_SIGNALS));
+        assertThat(mAttentionHelper.shouldMuteNotificationLocked(ringtoneNotification,
+                DEFAULT_SIGNALS, true)).isEqualTo(MUTE_REASON_NOT_MUTED);
         mAttentionHelper.buzzBeepBlinkLocked(ringtoneNotification, DEFAULT_SIGNALS);
         verifyBeepLooped();
         verifyNeverVibrate();
@@ -1951,14 +1962,15 @@
             new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION_RINGTONE).build());
         ringtoneChannel.enableVibration(true);
         NotificationRecord ringtoneNotification = getCallRecord(1, ringtoneChannel, true);
-        assertFalse(mAttentionHelper.shouldMuteNotificationLocked(ringtoneNotification,
-            DEFAULT_SIGNALS));
+        assertThat(mAttentionHelper.shouldMuteNotificationLocked(ringtoneNotification,
+                DEFAULT_SIGNALS, true)).isEqualTo(MUTE_REASON_NOT_MUTED);
 
         mAttentionHelper.buzzBeepBlinkLocked(ringtoneNotification, DEFAULT_SIGNALS);
         verifyVibrateLooped();
 
         NotificationRecord interrupter = getBuzzyOtherNotification();
-        assertTrue(mAttentionHelper.shouldMuteNotificationLocked(interrupter, DEFAULT_SIGNALS));
+        assertThat(mAttentionHelper.shouldMuteNotificationLocked(interrupter,
+                DEFAULT_SIGNALS, true)).isEqualTo(MUTE_REASON_OTHER_INSISTENT_PLAYING);
         mAttentionHelper.buzzBeepBlinkLocked(interrupter, DEFAULT_SIGNALS);
 
         verifyVibrate(1);
@@ -2260,10 +2272,13 @@
 
         // 2nd update should beep at 0% volume
         Mockito.reset(mRingtonePlayer);
-        mAttentionHelper.buzzBeepBlinkLocked(r, DEFAULT_SIGNALS);
-        verifyBeepVolume(0.0f);
+        int buzzBeepBlink = mAttentionHelper.buzzBeepBlinkLocked(r, DEFAULT_SIGNALS);
+        verifyNeverBeep();
+        assertThat(buzzBeepBlink).isEqualTo(MetricsEvent.ALERT_MUTED | MUTE_REASON_COOLDOWN);
+        assertThat(mAttentionHelper.shouldMuteNotificationLocked(r, DEFAULT_SIGNALS, true))
+                .isEqualTo(MUTE_REASON_COOLDOWN);
 
-        verify(mAccessibilityService, times(3)).sendAccessibilityEvent(any(), anyInt());
+        verify(mAccessibilityService, times(2)).sendAccessibilityEvent(any(), anyInt());
         assertEquals(-1, r.getLastAudiblyAlertedMs());
     }
 
@@ -2276,10 +2291,7 @@
         flagResolver.setFlagOverride(NotificationFlags.NOTIF_VOLUME2, 0);
         initAttentionHelper(flagResolver);
 
-        // Trigger avalanche trigger intent
-        final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
-        intent.putExtra("state", false);
-        mAvalancheBroadcastReceiver.onReceive(getContext(), intent);
+        triggerAvalancheEvent();
 
         NotificationRecord r = getBeepyNotification();
 
@@ -2305,8 +2317,9 @@
 
         // 2nd update should beep at 0% volume
         Mockito.reset(mRingtonePlayer);
-        mAttentionHelper.buzzBeepBlinkLocked(r3, DEFAULT_SIGNALS);
-        verifyBeepVolume(0.0f);
+        int buzzBeepBlink = mAttentionHelper.buzzBeepBlinkLocked(r3, DEFAULT_SIGNALS);
+        verifyNeverBeep();
+        assertThat(buzzBeepBlink).isEqualTo(MetricsEvent.ALERT_MUTED | MUTE_REASON_COOLDOWN);
 
         verify(mAccessibilityService, times(3)).sendAccessibilityEvent(any(), anyInt());
         assertEquals(-1, r3.getLastAudiblyAlertedMs());
@@ -2322,10 +2335,7 @@
         flagResolver.setFlagOverride(NotificationFlags.NOTIF_VOLUME2, 0);
         initAttentionHelper(flagResolver);
 
-        // Trigger avalanche trigger intent
-        final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
-        intent.putExtra("state", false);
-        mAvalancheBroadcastReceiver.onReceive(getContext(), intent);
+        triggerAvalancheEvent();
 
         NotificationRecord r = getBeepyNotification();
 
@@ -2363,10 +2373,7 @@
         flagResolver.setFlagOverride(NotificationFlags.NOTIF_VOLUME2, 0);
         initAttentionHelper(flagResolver);
 
-        // Trigger avalanche trigger intent
-        final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
-        intent.putExtra("state", false);
-        mAvalancheBroadcastReceiver.onReceive(getContext(), intent);
+        triggerAvalancheEvent();
 
         NotificationRecord r = getBeepyNotification();
 
@@ -2381,9 +2388,10 @@
                 false, null, Notification.GROUP_ALERT_ALL, false, mUser, "anotherPkg");
 
         // update should beep at 0% volume
-        mAttentionHelper.buzzBeepBlinkLocked(r2, DEFAULT_SIGNALS);
+        int buzzBeepBlink = mAttentionHelper.buzzBeepBlinkLocked(r2, DEFAULT_SIGNALS);
         assertEquals(-1, r2.getLastAudiblyAlertedMs());
-        verifyBeepVolume(0.0f);
+        verifyNeverBeep();
+        assertThat(buzzBeepBlink).isEqualTo(MetricsEvent.ALERT_MUTED | MUTE_REASON_COOLDOWN);
 
         // Use different package for next notifications
         NotificationRecord r3 = getNotificationRecord(mId, false /* insistent */, false /* once */,
@@ -2392,8 +2400,9 @@
 
         // 2nd update should beep at 0% volume
         Mockito.reset(mRingtonePlayer);
-        mAttentionHelper.buzzBeepBlinkLocked(r3, DEFAULT_SIGNALS);
-        verifyBeepVolume(0.0f);
+        buzzBeepBlink = mAttentionHelper.buzzBeepBlinkLocked(r3, DEFAULT_SIGNALS);
+        verifyNeverBeep();
+        assertThat(buzzBeepBlink).isEqualTo(MetricsEvent.ALERT_MUTED | MUTE_REASON_COOLDOWN);
 
         verify(mAccessibilityService, times(3)).sendAccessibilityEvent(any(), anyInt());
         assertEquals(-1, r3.getLastAudiblyAlertedMs());
@@ -2410,10 +2419,7 @@
         flagResolver.setFlagOverride(NotificationFlags.NOTIF_VOLUME2, 0);
         initAttentionHelper(flagResolver);
 
-        // Trigger avalanche trigger intent
-        final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
-        intent.putExtra("state", false);
-        mAvalancheBroadcastReceiver.onReceive(getContext(), intent);
+        triggerAvalancheEvent();
 
         NotificationRecord r = getBeepyNotification();
         r.getNotification().category = Notification.CATEGORY_EVENT;
@@ -2486,15 +2492,13 @@
         flagResolver.setFlagOverride(NotificationFlags.NOTIF_VOLUME2, 0);
         initAttentionHelper(flagResolver);
 
-        // Trigger avalanche trigger intent
-        final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
-        intent.putExtra("state", false);
-        mAvalancheBroadcastReceiver.onReceive(getContext(), intent);
+        triggerAvalancheEvent();
 
         // Regular notification: should beep at 0% volume
         NotificationRecord r = getBeepyNotification();
-        mAttentionHelper.buzzBeepBlinkLocked(r, DEFAULT_SIGNALS);
-        verifyBeepVolume(0.0f);
+        int buzzBeepBlink = mAttentionHelper.buzzBeepBlinkLocked(r, DEFAULT_SIGNALS);
+        verifyNeverBeep();
+        assertThat(buzzBeepBlink).isEqualTo(MetricsEvent.ALERT_MUTED | MUTE_REASON_COOLDOWN);
         assertEquals(-1, r.getLastAudiblyAlertedMs());
         Mockito.reset(mRingtonePlayer);
 
@@ -2525,8 +2529,9 @@
 
         // 2nd update should beep at 0% volume
         Mockito.reset(mRingtonePlayer);
-        mAttentionHelper.buzzBeepBlinkLocked(r3, DEFAULT_SIGNALS);
-        verifyBeepVolume(0.0f);
+        buzzBeepBlink = mAttentionHelper.buzzBeepBlinkLocked(r3, DEFAULT_SIGNALS);
+        verifyNeverBeep();
+        assertThat(buzzBeepBlink).isEqualTo(MetricsEvent.ALERT_MUTED | MUTE_REASON_COOLDOWN);
 
         // Set important conversation
         mChannel.setImportantConversation(true);
@@ -2554,10 +2559,7 @@
         flagResolver.setFlagOverride(NotificationFlags.NOTIF_VOLUME2, 0);
         initAttentionHelper(flagResolver);
 
-        // Trigger avalanche trigger intent
-        final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
-        intent.putExtra("state", false);
-        mAvalancheBroadcastReceiver.onReceive(getContext(), intent);
+        triggerAvalancheEvent();
 
         NotificationRecord r = getBeepyNotification();
 
@@ -2582,10 +2584,7 @@
         flagResolver.setFlagOverride(NotificationFlags.NOTIF_VOLUME2, 0);
         initAttentionHelper(flagResolver);
 
-        // Trigger avalanche trigger intent
-        final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
-        intent.putExtra("state", false);
-        mAvalancheBroadcastReceiver.onReceive(getContext(), intent);
+        triggerAvalancheEvent();
 
         // CATEGORY_ALARM is exempted
         NotificationRecord r = getBeepyNotification();
@@ -2617,6 +2616,70 @@
     }
 
     @Test
+    public void testBeepVolume_politeNotif_AvalancheStrategy_exempt_msgCategory() throws Exception {
+        mSetFlagsRule.enableFlags(Flags.FLAG_POLITE_NOTIFICATIONS);
+        mSetFlagsRule.enableFlags(Flags.FLAG_CROSS_APP_POLITE_NOTIFICATIONS);
+        mSetFlagsRule.enableFlags(Flags.FLAG_POLITE_NOTIFICATIONS_ATTN_UPDATE);
+        TestableFlagResolver flagResolver = new TestableFlagResolver();
+        flagResolver.setFlagOverride(NotificationFlags.NOTIF_VOLUME1, 50);
+        flagResolver.setFlagOverride(NotificationFlags.NOTIF_VOLUME2, 0);
+        initAttentionHelper(flagResolver);
+
+        triggerAvalancheEvent();
+
+        // Create a conversation group with GROUP_ALERT_SUMMARY behavior
+        // Where the summary is not MessagingStyle
+        final String groupKey = "grup_name";
+        final String shortcutId = "shortcut";
+        NotificationRecord summary = getBeepyNotificationRecord(groupKey, GROUP_ALERT_SUMMARY);
+        summary.getNotification().flags |= Notification.FLAG_GROUP_SUMMARY;
+        summary.getNotification().category = Notification.CATEGORY_MESSAGE;
+        ShortcutInfo.Builder sb = new ShortcutInfo.Builder(getContext());
+        summary.setShortcutInfo(sb.setId(shortcutId).build());
+
+        // Should beep at 100% volume
+        mAttentionHelper.buzzBeepBlinkLocked(summary, DEFAULT_SIGNALS);
+        verifyBeepVolume(1.0f);
+        assertNotEquals(-1, summary.getLastAudiblyAlertedMs());
+        Mockito.reset(mRingtonePlayer);
+
+        // Post child notifications with GROUP_ALERT_SUMMARY
+        NotificationRecord child = getConversationNotificationRecord(mId, false /* insistent */,
+                false /* once */, true /* noisy */, false /* buzzy*/, false /* lights */, true,
+                true, false, groupKey, Notification.GROUP_ALERT_SUMMARY, false, mUser, mPkg,
+                shortcutId);
+
+        // Should not beep
+        mAttentionHelper.buzzBeepBlinkLocked(child, DEFAULT_SIGNALS);
+        verifyNeverBeep();
+        assertFalse(child.isInterruptive());
+        assertEquals(-1, child.getLastAudiblyAlertedMs());
+        Mockito.reset(mRingtonePlayer);
+
+        // 2nd update for summary should beep at 50% volume
+        mAttentionHelper.buzzBeepBlinkLocked(summary, DEFAULT_SIGNALS);
+        verifyBeepVolume(0.5f);
+        assertNotEquals(-1, summary.getLastAudiblyAlertedMs());
+        Mockito.reset(mRingtonePlayer);
+
+        // 3rd update for summary should not beep
+        mAttentionHelper.buzzBeepBlinkLocked(summary, DEFAULT_SIGNALS);
+        verifyNeverBeep();
+        assertFalse(summary.isInterruptive());
+        assertEquals(-1, summary.getLastAudiblyAlertedMs());
+    }
+
+    private void triggerAvalancheEvent() throws Exception {
+        // Trigger avalanche trigger intent
+        final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+        intent.putExtra("state", false);
+        mAvalancheBroadcastReceiver.onReceive(getContext(), intent);
+        // Wait after avalanche trigger before posting notifications
+        // so that notification#getWhen() is not the same value
+        Thread.sleep(100);
+    }
+
+    @Test
     public void testBeepVolume_politeNotif_exemptEmergency() throws Exception {
         mSetFlagsRule.enableFlags(Flags.FLAG_POLITE_NOTIFICATIONS);
         mSetFlagsRule.disableFlags(Flags.FLAG_CROSS_APP_POLITE_NOTIFICATIONS);
@@ -2751,9 +2814,10 @@
         Mockito.reset(mRingtonePlayer);
 
         // next update at 0% volume
-        mAttentionHelper.buzzBeepBlinkLocked(summary, DEFAULT_SIGNALS);
+        int buzzBeepBlink = mAttentionHelper.buzzBeepBlinkLocked(summary, DEFAULT_SIGNALS);
         assertEquals(-1, summary.getLastAudiblyAlertedMs());
-        verifyBeepVolume(0.0f);
+        verifyNeverBeep();
+        assertThat(buzzBeepBlink).isEqualTo(MetricsEvent.ALERT_MUTED | MUTE_REASON_COOLDOWN);
 
         verify(mAccessibilityService, times(3)).sendAccessibilityEvent(any(), anyInt());
     }
@@ -2823,9 +2887,10 @@
 
         // 2nd update should beep at 0% volume
         Mockito.reset(mRingtonePlayer);
-        mAttentionHelper.buzzBeepBlinkLocked(r2, DEFAULT_SIGNALS);
+        int buzzBeepBlink = mAttentionHelper.buzzBeepBlinkLocked(r2, DEFAULT_SIGNALS);
         assertEquals(-1, r2.getLastAudiblyAlertedMs());
-        verifyBeepVolume(0.0f);
+        verifyNeverBeep();
+        assertThat(buzzBeepBlink).isEqualTo(MetricsEvent.ALERT_MUTED | MUTE_REASON_COOLDOWN);
 
         // Use different package for next notifications
         NotificationRecord r3 = getNotificationRecord(mId, false /* insistent */, false /* once */,
@@ -2891,6 +2956,94 @@
     }
 
     @Test
+    public void testBeepVolume_politeNotif_groupAlertSummary() throws Exception {
+        mSetFlagsRule.enableFlags(Flags.FLAG_POLITE_NOTIFICATIONS);
+        mSetFlagsRule.disableFlags(Flags.FLAG_CROSS_APP_POLITE_NOTIFICATIONS);
+        TestableFlagResolver flagResolver = new TestableFlagResolver();
+        flagResolver.setFlagOverride(NotificationFlags.NOTIF_VOLUME1, 50);
+        flagResolver.setFlagOverride(NotificationFlags.NOTIF_VOLUME2, 0);
+        // NOTIFICATION_COOLDOWN_ALL setting is enabled
+        Settings.System.putInt(getContext().getContentResolver(),
+                Settings.System.NOTIFICATION_COOLDOWN_ALL, 1);
+        initAttentionHelper(flagResolver);
+
+        // child should beep at 0% volume
+        NotificationRecord child = getBeepyNotificationRecord("a", GROUP_ALERT_SUMMARY);
+        mAttentionHelper.buzzBeepBlinkLocked(child, DEFAULT_SIGNALS);
+        verifyNeverBeep();
+        assertFalse(child.isInterruptive());
+        assertEquals(-1, child.getLastAudiblyAlertedMs());
+        Mockito.reset(mRingtonePlayer);
+
+        // child should beep at 0% volume
+        child = getBeepyNotificationRecord("a", GROUP_ALERT_SUMMARY);
+        mAttentionHelper.buzzBeepBlinkLocked(child, DEFAULT_SIGNALS);
+        verifyNeverBeep();
+        assertFalse(child.isInterruptive());
+        assertEquals(-1, child.getLastAudiblyAlertedMs());
+        Mockito.reset(mRingtonePlayer);
+
+        // summary 100% volume (GROUP_ALERT_SUMMARY)
+        NotificationRecord summary = getBeepyNotificationRecord("a", GROUP_ALERT_SUMMARY);
+        summary.getNotification().flags |= Notification.FLAG_GROUP_SUMMARY;
+        mAttentionHelper.buzzBeepBlinkLocked(summary, DEFAULT_SIGNALS);
+        assertNotEquals(-1, summary.getLastAudiblyAlertedMs());
+        verifyBeepVolume(1.0f);
+        Mockito.reset(mRingtonePlayer);
+
+        // next update at 50% volume because only summary was tracked as alerting
+        mAttentionHelper.buzzBeepBlinkLocked(summary, DEFAULT_SIGNALS);
+        assertNotEquals(-1, summary.getLastAudiblyAlertedMs());
+        verifyBeepVolume(0.5f);
+
+        verify(mAccessibilityService, times(4)).sendAccessibilityEvent(any(), anyInt());
+    }
+
+    @Test
+    public void testBeepVolume_politeNotif_groupAlertChildren() throws Exception {
+        mSetFlagsRule.enableFlags(Flags.FLAG_POLITE_NOTIFICATIONS);
+        mSetFlagsRule.disableFlags(Flags.FLAG_CROSS_APP_POLITE_NOTIFICATIONS);
+        TestableFlagResolver flagResolver = new TestableFlagResolver();
+        flagResolver.setFlagOverride(NotificationFlags.NOTIF_VOLUME1, 50);
+        flagResolver.setFlagOverride(NotificationFlags.NOTIF_VOLUME2, 0);
+        // NOTIFICATION_COOLDOWN_ALL setting is enabled
+        Settings.System.putInt(getContext().getContentResolver(),
+                Settings.System.NOTIFICATION_COOLDOWN_ALL, 1);
+        initAttentionHelper(flagResolver);
+
+        // summary 0% volume (GROUP_ALERT_CHILDREN)
+        NotificationRecord summary = getBeepyNotificationRecord("a", GROUP_ALERT_CHILDREN);
+        summary.getNotification().flags |= Notification.FLAG_GROUP_SUMMARY;
+        mAttentionHelper.buzzBeepBlinkLocked(summary, DEFAULT_SIGNALS);
+        verifyNeverBeep();
+        assertFalse(summary.isInterruptive());
+        assertEquals(-1, summary.getLastAudiblyAlertedMs());
+        Mockito.reset(mRingtonePlayer);
+
+        // child should beep at 100% volume
+        NotificationRecord child = getBeepyNotificationRecord("a", GROUP_ALERT_CHILDREN);
+        mAttentionHelper.buzzBeepBlinkLocked(child, DEFAULT_SIGNALS);
+        assertNotEquals(-1, child.getLastAudiblyAlertedMs());
+        verifyBeepVolume(1.0f);
+        Mockito.reset(mRingtonePlayer);
+
+        // child should beep at 50% volume
+        child = getBeepyNotificationRecord("a", GROUP_ALERT_CHILDREN);
+        mAttentionHelper.buzzBeepBlinkLocked(child, DEFAULT_SIGNALS);
+        assertNotEquals(-1, child.getLastAudiblyAlertedMs());
+        verifyBeepVolume(0.5f);
+        Mockito.reset(mRingtonePlayer);
+
+        // child should beep at 0% volume
+        mAttentionHelper.buzzBeepBlinkLocked(child, DEFAULT_SIGNALS);
+        verifyNeverBeep();
+        assertTrue(child.isInterruptive());
+        assertEquals(-1, child.getLastAudiblyAlertedMs());
+
+        verify(mAccessibilityService, times(4)).sendAccessibilityEvent(any(), anyInt());
+    }
+
+    @Test
     public void testVibrationIntensity_politeNotif() throws Exception {
         mSetFlagsRule.enableFlags(Flags.FLAG_POLITE_NOTIFICATIONS);
         TestableFlagResolver flagResolver = new TestableFlagResolver();
@@ -2914,8 +3067,9 @@
         Mockito.reset(vibratorHelper);
 
         // 2nd update should buzz at 0% intensity
-        mAttentionHelper.buzzBeepBlinkLocked(r, DEFAULT_SIGNALS);
-        verify(vibratorHelper, times(1)).scale(any(), eq(0.0f));
+        int buzzBeepBlink = mAttentionHelper.buzzBeepBlinkLocked(r, DEFAULT_SIGNALS);
+        verifyNeverVibrate();
+        assertThat(buzzBeepBlink).isEqualTo(MetricsEvent.ALERT_MUTED | MUTE_REASON_COOLDOWN);
     }
 
     @Test
@@ -3007,10 +3161,11 @@
 
         // 2nd update should beep at 0% volume
         Mockito.reset(mRingtonePlayer);
-        mAttentionHelper.buzzBeepBlinkLocked(r, WORK_PROFILE_SIGNALS);
-        verifyBeepVolume(0.0f);
+        int buzzBeepBlink = mAttentionHelper.buzzBeepBlinkLocked(r, WORK_PROFILE_SIGNALS);
+        verifyNeverBeep();
+        assertThat(buzzBeepBlink).isEqualTo(MetricsEvent.ALERT_MUTED | MUTE_REASON_COOLDOWN);
 
-        verify(mAccessibilityService, times(3)).sendAccessibilityEvent(any(), anyInt());
+        verify(mAccessibilityService, times(2)).sendAccessibilityEvent(any(), anyInt());
         assertEquals(-1, r.getLastAudiblyAlertedMs());
     }
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index d69d678..1349ee0 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -33,6 +33,7 @@
 import static android.app.Notification.FLAG_BUBBLE;
 import static android.app.Notification.FLAG_CAN_COLORIZE;
 import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
+import static android.app.Notification.FLAG_GROUP_SUMMARY;
 import static android.app.Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
 import static android.app.Notification.FLAG_NO_CLEAR;
 import static android.app.Notification.FLAG_NO_DISMISS;
@@ -193,6 +194,7 @@
 import android.app.NotificationChannel;
 import android.app.NotificationChannelGroup;
 import android.app.NotificationManager;
+import android.app.NotificationManager.Policy;
 import android.app.PendingIntent;
 import android.app.Person;
 import android.app.RemoteInput;
@@ -655,7 +657,8 @@
         when(mAtm.getTaskToShowPermissionDialogOn(anyString(), anyInt()))
                 .thenReturn(INVALID_TASK_ID);
         mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class));
-        when(mUm.getProfileIds(eq(mUserId), eq(false))).thenReturn(new int[] { mUserId });
+        when(mUm.getProfileIds(eq(mUserId), anyBoolean())).thenReturn(new int[]{mUserId});
+        when(mUmInternal.getProfileIds(eq(mUserId), anyBoolean())).thenReturn(new int[]{mUserId});
         when(mAmi.getCurrentUserId()).thenReturn(mUserId);
 
         when(mPackageManagerClient.hasSystemFeature(FEATURE_TELECOM)).thenReturn(true);
@@ -2870,6 +2873,131 @@
     }
 
     @Test
+    @EnableFlags(FLAG_NOTIFICATION_FORCE_GROUPING)
+    public void testEnqueueNotification_forceGrouped_clearsSummaryFlag() throws Exception {
+        final String originalGroupName = "originalGroup";
+        final String aggregateGroupName = "Aggregate_Test";
+
+        // Old record was a summary and it was auto-grouped
+        final NotificationRecord r =
+                generateNotificationRecord(mTestNotificationChannel, 0, originalGroupName, true);
+        mService.addNotification(r);
+        mService.convertSummaryToNotificationLocked(r.getKey());
+        mService.addAutogroupKeyLocked(r.getKey(), aggregateGroupName, true);
+
+        assertThat(mService.mNotificationList).hasSize(1);
+
+        // Update record is a summary
+        final Notification updatedNotification = generateNotificationRecord(
+                mTestNotificationChannel, 0, originalGroupName, true).getNotification();
+        assertThat(updatedNotification.flags & FLAG_GROUP_SUMMARY).isEqualTo(FLAG_GROUP_SUMMARY);
+
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
+                r.getSbn().getId(), updatedNotification, r.getSbn().getUserId());
+        waitForIdle();
+
+        // Check that FLAG_GROUP_SUMMARY was removed
+        assertThat(mService.mNotificationList).hasSize(1);
+        assertThat(mService.mNotificationList.get(0).getFlags() & FLAG_GROUP_SUMMARY).isEqualTo(0);
+    }
+
+    @Test
+    @EnableFlags(FLAG_NOTIFICATION_FORCE_GROUPING)
+    public void testEnqueueNotification_forceGroupedRegular_updatedAsSummary_clearsSummaryFlag()
+            throws Exception {
+        final String originalGroupName = "originalGroup";
+        final String aggregateGroupName = "Aggregate_Test";
+
+        // Old record was not summary and it was auto-grouped
+        final NotificationRecord r =
+                generateNotificationRecord(mTestNotificationChannel, 0, originalGroupName, false);
+        mService.addNotification(r);
+        mService.addAutogroupKeyLocked(r.getKey(), aggregateGroupName, true);
+        assertThat(mService.mNotificationList).hasSize(1);
+
+        // Update record is a summary
+        final Notification updatedNotification = generateNotificationRecord(
+                mTestNotificationChannel, 0, originalGroupName, true).getNotification();
+        assertThat(updatedNotification.flags & FLAG_GROUP_SUMMARY).isEqualTo(FLAG_GROUP_SUMMARY);
+
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
+                r.getSbn().getId(), updatedNotification, r.getSbn().getUserId());
+        waitForIdle();
+
+        // Check that FLAG_GROUP_SUMMARY was removed
+        assertThat(mService.mNotificationList).hasSize(1);
+        assertThat(mService.mNotificationList.get(0).getFlags() & FLAG_GROUP_SUMMARY).isEqualTo(0);
+    }
+
+    @Test
+    @EnableFlags(FLAG_NOTIFICATION_FORCE_GROUPING)
+    public void testEnqueueNotification_notForceGrouped_dontClearSummaryFlag()
+            throws Exception {
+        final String originalGroupName = "originalGroup";
+
+        // Old record was a summary and it was not auto-grouped
+        final NotificationRecord r =
+                generateNotificationRecord(mTestNotificationChannel, 0, originalGroupName, true);
+        mService.addNotification(r);
+        assertThat(mService.mNotificationList).hasSize(1);
+
+        // Update record is a summary
+        final Notification updatedNotification = generateNotificationRecord(
+                mTestNotificationChannel, 0, originalGroupName, true).getNotification();
+        assertThat(updatedNotification.flags & FLAG_GROUP_SUMMARY).isEqualTo(FLAG_GROUP_SUMMARY);
+
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
+                r.getSbn().getId(), updatedNotification, r.getSbn().getUserId());
+        waitForIdle();
+
+        // Check that FLAG_GROUP_SUMMARY was not removed
+        assertThat(mService.mNotificationList).hasSize(1);
+        assertThat(mService.mNotificationList.get(0).getFlags() & FLAG_GROUP_SUMMARY).isEqualTo(
+                FLAG_GROUP_SUMMARY);
+    }
+
+    @Test
+    @EnableFlags(FLAG_NOTIFICATION_FORCE_GROUPING)
+    public void testRemoveFGSFlagFromNotification_enqueued_forceGrouped_clearsSummaryFlag() {
+        final String originalGroupName = "originalGroup";
+        final String aggregateGroupName = "Aggregate_Test";
+
+        final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel, 0, null,
+                originalGroupName, true);
+        r.getSbn().getNotification().flags &= ~FLAG_GROUP_SUMMARY;
+        r.setOverrideGroupKey(aggregateGroupName);
+        mService.addEnqueuedNotification(r);
+
+        mInternalService.removeForegroundServiceFlagFromNotification(
+                mPkg, r.getSbn().getId(), r.getSbn().getUserId());
+        waitForIdle();
+
+        assertThat(mService.mEnqueuedNotifications).hasSize(1);
+        assertThat(mService.mEnqueuedNotifications.get(0).getFlags() & FLAG_GROUP_SUMMARY)
+                .isEqualTo(0);
+    }
+
+    @Test
+    @EnableFlags(FLAG_NOTIFICATION_FORCE_GROUPING)
+    public void testRemoveFGSFlagFromNotification_posted_forceGrouped_clearsSummaryFlag() {
+        final String originalGroupName = "originalGroup";
+        final String aggregateGroupName = "Aggregate_Test";
+
+        final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel, 0, null,
+                originalGroupName, true);
+        r.getSbn().getNotification().flags &= ~FLAG_GROUP_SUMMARY;
+        r.setOverrideGroupKey(aggregateGroupName);
+        mService.addNotification(r);
+
+        mInternalService.removeForegroundServiceFlagFromNotification(
+                mPkg, r.getSbn().getId(), r.getSbn().getUserId());
+        waitForIdle();
+
+        assertThat(mService.mNotificationList).hasSize(1);
+        assertThat(mService.mNotificationList.get(0).getFlags() & FLAG_GROUP_SUMMARY).isEqualTo(0);
+    }
+
+    @Test
     public void testCancelAllNotifications_IgnoreForegroundService() throws Exception {
         when(mAmi.applyForegroundServiceNotification(
                 any(), anyString(), anyInt(), anyString(), anyInt())).thenReturn(SHOW_IMMEDIATELY);
@@ -3078,7 +3206,6 @@
         // Send two cancelations.
         mBinderService.cancelNotificationWithTag(mPkg, mPkg, sbn.getTag(), sbn.getId(),
                 sbn.getUserId());
-        waitForIdle();
         mBinderService.cancelNotificationWithTag(mPkg, mPkg, sbn.getTag(), sbn.getId(),
                 sbn.getUserId());
         waitForIdle();
@@ -4652,7 +4779,42 @@
 
         doThrow(new SecurityException("no access")).when(mUgmInternal)
                 .checkGrantUriPermission(eq(Process.myUid()), any(), eq(soundUri),
-                    anyInt(), eq(Process.myUserHandle().getIdentifier()));
+                anyInt(), eq(Process.myUserHandle().getIdentifier()));
+
+        mBinderService.updateNotificationChannelFromPrivilegedListener(
+                null, mPkg, Process.myUserHandle(), updatedNotificationChannel);
+
+        verify(mPreferencesHelper, times(1)).updateNotificationChannel(
+                anyString(), anyInt(), any(), anyBoolean(),  anyInt(), anyBoolean());
+
+        verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
+                eq(Process.myUserHandle()), eq(mTestNotificationChannel),
+                eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
+    }
+
+    @Test
+    public void
+        testUpdateNotificationChannelFromPrivilegedListener_oldSoundNoUriPerm_newSoundHasUriPerm()
+            throws Exception {
+        mService.setPreferencesHelper(mPreferencesHelper);
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
+                .thenReturn(singletonList(mock(AssociationInfo.class)));
+        when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
+                eq(mTestNotificationChannel.getId()), anyBoolean()))
+                .thenReturn(mTestNotificationChannel);
+
+        // Missing Uri permissions for the old channel sound
+        final Uri oldSoundUri = Settings.System.DEFAULT_NOTIFICATION_URI;
+        doThrow(new SecurityException("no access")).when(mUgmInternal)
+                .checkGrantUriPermission(eq(Process.myUid()), any(), eq(oldSoundUri),
+                anyInt(), eq(Process.myUserHandle().getIdentifier()));
+
+        // Has Uri permissions for the old channel sound
+        final Uri newSoundUri = Uri.parse("content://media/test/sound/uri");
+        final NotificationChannel updatedNotificationChannel = new NotificationChannel(
+                TEST_CHANNEL_ID, TEST_CHANNEL_ID, IMPORTANCE_DEFAULT);
+        updatedNotificationChannel.setSound(newSoundUri,
+                updatedNotificationChannel.getAudioAttributes());
 
         mBinderService.updateNotificationChannelFromPrivilegedListener(
                 null, mPkg, Process.myUserHandle(), updatedNotificationChannel);
@@ -15936,6 +16098,57 @@
         assertThat(updatedRule.getValue().isEnabled()).isFalse();
     }
 
+    @Test
+    @EnableFlags({android.app.Flags.FLAG_MODES_API, android.app.Flags.FLAG_MODES_UI})
+    public void setNotificationPolicy_fromSystemApp_appliesPriorityChannelsAllowed()
+            throws Exception {
+        setUpRealZenTest();
+        // Start with hasPriorityChannels=true, allowPriorityChannels=true ("default").
+        mService.mZenModeHelper.setNotificationPolicy(new Policy(0, 0, 0, 0,
+                        Policy.policyState(true, true), 0),
+                ZenModeConfig.ORIGIN_SYSTEM, Process.SYSTEM_UID);
+
+        // The caller will supply states with "wrong" hasPriorityChannels.
+        int stateBlockingPriorityChannels = Policy.policyState(false, false);
+        mBinderService.setNotificationPolicy(mPkg,
+                new Policy(1, 0, 0, 0, stateBlockingPriorityChannels, 0), false);
+
+        // hasPriorityChannels is untouched and allowPriorityChannels was updated.
+        assertThat(mBinderService.getNotificationPolicy(mPkg).priorityCategories).isEqualTo(1);
+        assertThat(mBinderService.getNotificationPolicy(mPkg).state).isEqualTo(
+                Policy.policyState(true, false));
+
+        // Same but setting allowPriorityChannels to true.
+        int stateAllowingPriorityChannels = Policy.policyState(false, true);
+        mBinderService.setNotificationPolicy(mPkg,
+                new Policy(2, 0, 0, 0, stateAllowingPriorityChannels, 0), false);
+
+        assertThat(mBinderService.getNotificationPolicy(mPkg).priorityCategories).isEqualTo(2);
+        assertThat(mBinderService.getNotificationPolicy(mPkg).state).isEqualTo(
+                Policy.policyState(true, true));
+    }
+
+    @Test
+    @EnableFlags({android.app.Flags.FLAG_MODES_API, android.app.Flags.FLAG_MODES_UI})
+    @DisableCompatChanges(NotificationManagerService.MANAGE_GLOBAL_ZEN_VIA_IMPLICIT_RULES)
+    public void setNotificationPolicy_fromRegularAppThatCanModifyPolicy_ignoresState()
+            throws Exception {
+        setUpRealZenTest();
+        // Start with hasPriorityChannels=true, allowPriorityChannels=true ("default").
+        mService.mZenModeHelper.setNotificationPolicy(new Policy(0, 0, 0, 0,
+                        Policy.policyState(true, true), 0),
+                ZenModeConfig.ORIGIN_SYSTEM, Process.SYSTEM_UID);
+        mService.setCallerIsNormalPackage();
+
+        mBinderService.setNotificationPolicy(mPkg,
+                new Policy(1, 0, 0, 0, Policy.policyState(false, false), 0), false);
+
+        // Policy was updated but the attempt to change state was ignored (it's a @hide API).
+        assertThat(mBinderService.getNotificationPolicy(mPkg).priorityCategories).isEqualTo(1);
+        assertThat(mBinderService.getNotificationPolicy(mPkg).state).isEqualTo(
+                Policy.policyState(true, true));
+    }
+
     /** Prepares for a zen-related test that uses the real {@link ZenModeHelper}. */
     private void setUpRealZenTest() throws Exception {
         when(mConditionProviders.isPackageOrComponentAllowed(anyString(), anyInt()))
@@ -16611,7 +16824,7 @@
         mService.addNotification(r);
         mService.addEnqueuedNotification(r1);
 
-        mBinderService.setCanBePromoted(mPkg, mUid, true);
+        mBinderService.setCanBePromoted(mPkg, mUid, true, true);
 
         waitForIdle();
 
@@ -16651,9 +16864,9 @@
 
         mService.addNotification(r);
 
-        mBinderService.setCanBePromoted(mPkg, mUid, true);
+        mBinderService.setCanBePromoted(mPkg, mUid, true, true);
         waitForIdle();
-        mBinderService.setCanBePromoted(mPkg, mUid, true);
+        mBinderService.setCanBePromoted(mPkg, mUid, true, true);
         waitForIdle();
 
         ArgumentCaptor<NotificationRecord> captor =
@@ -16668,7 +16881,7 @@
         mContext.getTestablePermissions().setPermission(
                 android.Manifest.permission.USE_COLORIZED_NOTIFICATIONS, PERMISSION_GRANTED);
         // start from true state
-        mBinderService.setCanBePromoted(mPkg, mUid, true);
+        mBinderService.setCanBePromoted(mPkg, mUid, true, true);
 
         // qualifying posted notification
         Notification n = new Notification.Builder(mContext, mTestNotificationChannel.getId())
@@ -16709,7 +16922,7 @@
         mService.addNotification(r);
         mService.addEnqueuedNotification(r1);
 
-        mBinderService.setCanBePromoted(mPkg, mUid, false);
+        mBinderService.setCanBePromoted(mPkg, mUid, false, true);
 
         waitForIdle();
 
@@ -16733,7 +16946,7 @@
         mContext.getTestablePermissions().setPermission(
                 android.Manifest.permission.USE_COLORIZED_NOTIFICATIONS, PERMISSION_GRANTED);
         // start from true state
-        mBinderService.setCanBePromoted(mPkg, mUid, true);
+        mBinderService.setCanBePromoted(mPkg, mUid, true, true);
 
         // qualifying posted notification
         Notification n = new Notification.Builder(mContext, mTestNotificationChannel.getId())
@@ -16751,9 +16964,9 @@
 
         mService.addNotification(r);
 
-        mBinderService.setCanBePromoted(mPkg, mUid, false);
+        mBinderService.setCanBePromoted(mPkg, mUid, false, true);
         waitForIdle();
-        mBinderService.setCanBePromoted(mPkg, mUid, false);
+        mBinderService.setCanBePromoted(mPkg, mUid, false, true);
         waitForIdle();
 
         ArgumentCaptor<NotificationRecord> captor =
@@ -16765,7 +16978,7 @@
     @Test
     @EnableFlags(android.app.Flags.FLAG_API_RICH_ONGOING)
     public void testPostPromotableNotification() throws Exception {
-        mBinderService.setCanBePromoted(mPkg, mUid, true);
+        mBinderService.setCanBePromoted(mPkg, mUid, true, true);
         assertThat(mBinderService.appCanBePromoted(mPkg, mUid)).isTrue();
         mContext.getTestablePermissions().setPermission(
                 android.Manifest.permission.USE_COLORIZED_NOTIFICATIONS, PERMISSION_GRANTED);
@@ -16823,7 +17036,7 @@
     @Test
     @EnableFlags(android.app.Flags.FLAG_API_RICH_ONGOING)
     public void testPostPromotableNotification_unimportantNotification() throws Exception {
-        mBinderService.setCanBePromoted(mPkg, mUid, true);
+        mBinderService.setCanBePromoted(mPkg, mUid, true, true);
         mContext.getTestablePermissions().setPermission(
                 android.Manifest.permission.USE_COLORIZED_NOTIFICATIONS, PERMISSION_GRANTED);
         Notification n = new Notification.Builder(mContext, mMinChannel.getId())
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
index 7d63062..d64b9e8 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -45,11 +45,13 @@
 import static android.app.NotificationManager.IMPORTANCE_NONE;
 import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
 import static android.app.NotificationManager.VISIBILITY_NO_OVERRIDE;
+import static android.content.ContentResolver.SCHEME_ANDROID_RESOURCE;
+import static android.content.ContentResolver.SCHEME_CONTENT;
+import static android.content.ContentResolver.SCHEME_FILE;
 import static android.media.AudioAttributes.CONTENT_TYPE_SONIFICATION;
 import static android.media.AudioAttributes.USAGE_NOTIFICATION;
 import static android.os.UserHandle.USER_ALL;
 import static android.os.UserHandle.USER_SYSTEM;
-
 import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
 import static android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION;
 import static android.service.notification.Flags.notificationClassification;
@@ -59,9 +61,11 @@
 import static com.android.internal.util.FrameworkStatsLog.PACKAGE_NOTIFICATION_PREFERENCES__FSI_STATE__GRANTED;
 import static com.android.internal.util.FrameworkStatsLog.PACKAGE_NOTIFICATION_PREFERENCES__FSI_STATE__NOT_REQUESTED;
 import static com.android.server.notification.Flags.FLAG_ALL_NOTIFS_NEED_TTL;
+import static com.android.server.notification.Flags.FLAG_NOTIFICATION_VERIFY_CHANNEL_SOUND_URI;
 import static com.android.server.notification.Flags.FLAG_PERSIST_INCOMPLETE_RESTORE_DATA;
 import static com.android.server.notification.NotificationChannelLogger.NotificationChannelEvent.NOTIFICATION_CHANNEL_UPDATED_BY_USER;
 import static com.android.server.notification.PreferencesHelper.DEFAULT_BUBBLE_PREFERENCE;
+import static com.android.server.notification.PreferencesHelper.LockableAppFields.USER_LOCKED_PROMOTABLE;
 import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_COUNT_LIMIT;
 import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT;
 import static com.android.server.notification.PreferencesHelper.UNKNOWN_UID;
@@ -83,6 +87,7 @@
 import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.reset;
@@ -368,10 +373,10 @@
 
         mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                 mPermissionHelper, mPermissionManager, mLogger, mAppOpsManager, mUserProfiles,
-                false, mClock);
+                mUgmInternal, false, mClock);
         mXmlHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                 mPermissionHelper, mPermissionManager, mLogger, mAppOpsManager, mUserProfiles,
-                false, mClock);
+                mUgmInternal, false, mClock);
         resetZenModeHelper();
 
         mAudioAttributes = new AudioAttributes.Builder()
@@ -643,7 +648,7 @@
 
         mHelper.setShowBadge(PKG_N_MR1, UID_N_MR1, true);
         if (android.app.Flags.uiRichOngoing()) {
-            mHelper.setCanBePromoted(PKG_N_MR1, UID_N_MR1, true);
+            mHelper.setCanBePromoted(PKG_N_MR1, UID_N_MR1, true, true);
         }
 
         ByteArrayOutputStream baos = writeXmlAndPurge(PKG_N_MR1, UID_N_MR1, false,
@@ -657,6 +662,8 @@
         assertTrue(mXmlHelper.canShowBadge(PKG_N_MR1, UID_N_MR1));
         if (android.app.Flags.uiRichOngoing()) {
             assertThat(mXmlHelper.canBePromoted(PKG_N_MR1, UID_N_MR1)).isTrue();
+            assertThat(mXmlHelper.getAppLockedFields(PKG_N_MR1, UID_N_MR1) & USER_LOCKED_PROMOTABLE)
+                    .isNotEqualTo(0);
         }
         assertEquals(channel1,
                 mXmlHelper.getNotificationChannel(PKG_N_MR1, UID_N_MR1, channel1.getId(), false));
@@ -780,7 +787,7 @@
     public void testReadXml_oldXml_migrates() throws Exception {
         mXmlHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                 mPermissionHelper, mPermissionManager, mLogger, mAppOpsManager, mUserProfiles,
-                /* showReviewPermissionsNotification= */ true, mClock);
+                mUgmInternal, /* showReviewPermissionsNotification= */ true, mClock);
 
         String xml = "<ranking version=\"2\">\n"
                 + "<package name=\"" + PKG_N_MR1 + "\" uid=\"" + UID_N_MR1
@@ -916,7 +923,7 @@
     public void testReadXml_newXml_noMigration_showPermissionNotification() throws Exception {
         mXmlHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                 mPermissionHelper, mPermissionManager, mLogger, mAppOpsManager, mUserProfiles,
-                /* showReviewPermissionsNotification= */ true, mClock);
+                mUgmInternal, /* showReviewPermissionsNotification= */ true, mClock);
 
         String xml = "<ranking version=\"3\">\n"
                 + "<package name=\"" + PKG_N_MR1 + "\" show_badge=\"true\">\n"
@@ -975,7 +982,7 @@
     public void testReadXml_newXml_permissionNotificationOff() throws Exception {
         mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                 mPermissionHelper, mPermissionManager, mLogger, mAppOpsManager, mUserProfiles,
-                /* showReviewPermissionsNotification= */ false, mClock);
+                mUgmInternal, /* showReviewPermissionsNotification= */ false, mClock);
 
         String xml = "<ranking version=\"3\">\n"
                 + "<package name=\"" + PKG_N_MR1 + "\" show_badge=\"true\">\n"
@@ -1034,7 +1041,7 @@
     public void testReadXml_newXml_noMigration_noPermissionNotification() throws Exception {
         mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                 mPermissionHelper, mPermissionManager, mLogger, mAppOpsManager, mUserProfiles,
-                /* showReviewPermissionsNotification= */ true, mClock);
+                mUgmInternal, /* showReviewPermissionsNotification= */ true, mClock);
 
         String xml = "<ranking version=\"4\">\n"
                 + "<package name=\"" + PKG_N_MR1 + "\" show_badge=\"true\">\n"
@@ -1706,7 +1713,7 @@
         // simulate load after reboot
         mXmlHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                 mPermissionHelper, mPermissionManager, mLogger, mAppOpsManager, mUserProfiles,
-                false, mClock);
+                mUgmInternal, false, mClock);
         loadByteArrayXml(baos.toByteArray(), false, USER_ALL);
 
         // Trigger 2nd restore pass
@@ -1761,7 +1768,7 @@
         // simulate load after reboot
         mXmlHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                 mPermissionHelper, mPermissionManager, mLogger, mAppOpsManager, mUserProfiles,
-                false, mClock);
+                mUgmInternal, false, mClock);
         loadByteArrayXml(xml.getBytes(), false, USER_ALL);
 
         // Trigger 2nd restore pass
@@ -1839,10 +1846,10 @@
 
         mHelper = new PreferencesHelper(mContext, mPm, mHandler, mMockZenModeHelper,
                 mPermissionHelper, mPermissionManager, mLogger, mAppOpsManager, mUserProfiles,
-                false, mClock);
+                mUgmInternal, false, mClock);
         mXmlHelper = new PreferencesHelper(mContext, mPm, mHandler, mMockZenModeHelper,
                 mPermissionHelper, mPermissionManager, mLogger, mAppOpsManager, mUserProfiles,
-                false, mClock);
+                mUgmInternal, false, mClock);
 
         NotificationChannel channel =
                 new NotificationChannel("id", "name", IMPORTANCE_LOW);
@@ -3046,6 +3053,64 @@
     }
 
     @Test
+    @EnableFlags(FLAG_NOTIFICATION_VERIFY_CHANNEL_SOUND_URI)
+    public void testCreateChannel_noSoundUriPermission_contentSchemeVerified() {
+        final Uri sound = Uri.parse(SCHEME_CONTENT + "://media/test/sound/uri");
+
+        doThrow(new SecurityException("no access")).when(mUgmInternal)
+                .checkGrantUriPermission(eq(UID_N_MR1), any(), eq(sound),
+                    anyInt(), eq(Process.myUserHandle().getIdentifier()));
+
+        final NotificationChannel channel = new NotificationChannel("id2", "name2",
+                NotificationManager.IMPORTANCE_DEFAULT);
+        channel.setSound(sound, mAudioAttributes);
+
+        assertThrows(SecurityException.class,
+                () -> mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, channel,
+                    true, false, UID_N_MR1, false));
+        assertThat(mHelper.getNotificationChannel(PKG_N_MR1, UID_N_MR1, channel.getId(), true))
+                .isNull();
+    }
+
+    @Test
+    @EnableFlags(FLAG_NOTIFICATION_VERIFY_CHANNEL_SOUND_URI)
+    public void testCreateChannel_noSoundUriPermission_fileSchemaIgnored() {
+        final Uri sound = Uri.parse(SCHEME_FILE + "://path/sound");
+
+        doThrow(new SecurityException("no access")).when(mUgmInternal)
+                .checkGrantUriPermission(eq(UID_N_MR1), any(), any(),
+                    anyInt(), eq(Process.myUserHandle().getIdentifier()));
+
+        final NotificationChannel channel = new NotificationChannel("id2", "name2",
+                NotificationManager.IMPORTANCE_DEFAULT);
+        channel.setSound(sound, mAudioAttributes);
+
+        mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, channel, true, false, UID_N_MR1,
+                false);
+        assertThat(mHelper.getNotificationChannel(PKG_N_MR1, UID_N_MR1, channel.getId(), true)
+                .getSound()).isEqualTo(sound);
+    }
+
+    @Test
+    @EnableFlags(FLAG_NOTIFICATION_VERIFY_CHANNEL_SOUND_URI)
+    public void testCreateChannel_noSoundUriPermission_resourceSchemaIgnored() {
+        final Uri sound = Uri.parse(SCHEME_ANDROID_RESOURCE + "://resId/sound");
+
+        doThrow(new SecurityException("no access")).when(mUgmInternal)
+                .checkGrantUriPermission(eq(UID_N_MR1), any(), any(),
+                    anyInt(), eq(Process.myUserHandle().getIdentifier()));
+
+        final NotificationChannel channel = new NotificationChannel("id2", "name2",
+                NotificationManager.IMPORTANCE_DEFAULT);
+        channel.setSound(sound, mAudioAttributes);
+
+        mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, channel, true, false, UID_N_MR1,
+                false);
+        assertThat(mHelper.getNotificationChannel(PKG_N_MR1, UID_N_MR1, channel.getId(), true)
+                .getSound()).isEqualTo(sound);
+    }
+
+    @Test
     public void testPermanentlyDeleteChannels() throws Exception {
         NotificationChannel channel1 =
                 new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
@@ -6311,20 +6376,30 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_UI_RICH_ONGOING)
+    @EnableFlags(android.app.Flags.FLAG_API_RICH_ONGOING)
     public void testNoAppHasPermissionToPromoteByDefault() {
         mHelper.setShowBadge(PKG_P, UID_P, true);
         assertThat(mHelper.canBePromoted(PKG_P, UID_P)).isFalse();
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_UI_RICH_ONGOING)
+    @EnableFlags(android.app.Flags.FLAG_API_RICH_ONGOING)
     public void testSetCanBePromoted() {
-        mHelper.setCanBePromoted(PKG_P, UID_P, true);
+        mHelper.setCanBePromoted(PKG_P, UID_P, true, true);
         assertThat(mHelper.canBePromoted(PKG_P, UID_P)).isTrue();
 
-        mHelper.setCanBePromoted(PKG_P, UID_P, false);
+        mHelper.setCanBePromoted(PKG_P, UID_P, false, true);
         assertThat(mHelper.canBePromoted(PKG_P, UID_P)).isFalse();
         verify(mHandler, never()).requestSort();
     }
+
+    @Test
+    @EnableFlags(android.app.Flags.FLAG_API_RICH_ONGOING)
+    public void testSetCanBePromoted_allowlistNotOverrideUser() {
+        mHelper.setCanBePromoted(PKG_P, UID_P, true, true);
+        assertThat(mHelper.canBePromoted(PKG_P, UID_P)).isTrue();
+
+        mHelper.setCanBePromoted(PKG_P, UID_P, false, false);
+        assertThat(mHelper.canBePromoted(PKG_P, UID_P)).isTrue();
+    }
 }
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
index 9a6e818..5d4382a 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -92,6 +92,7 @@
     @Mock ZenModeHelper mMockZenModeHelper;
     @Mock RankingConfig mConfig;
     @Mock Vibrator mVibrator;
+    @Mock GroupHelper mGroupHelper;
 
     private NotificationManager.Policy mTestNotificationPolicy;
     private Notification mNotiGroupGSortA;
@@ -157,7 +158,7 @@
         when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
         mHelper = new RankingHelper(getContext(), mHandler, mConfig, mMockZenModeHelper,
                 mUsageStats, new String[] {ImportanceExtractor.class.getName()},
-                mock(IPlatformCompat.class));
+                mock(IPlatformCompat.class), mGroupHelper);
 
         mNotiGroupGSortA = new Notification.Builder(mContext, TEST_CHANNEL_ID)
                 .setContentTitle("A")
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java
index 84c4f62..5709d88 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java
@@ -1010,7 +1010,39 @@
 
     @Test
     @EnableFlags(Flags.FLAG_MODES_UI)
-    public void testConfigXml_manualRule_upgradeWhenExisting() throws Exception {
+    public void testConfigXml_manualRuleWithoutCondition_upgradeWhenExisting() throws Exception {
+        // prior to modes_ui, it's possible to have a non-null manual rule that doesn't have much
+        // data on it because it's meant to indicate that the manual rule is on by merely existing.
+        ZenModeConfig config = new ZenModeConfig();
+        config.manualRule = new ZenModeConfig.ZenRule();
+        config.manualRule.enabled = true;
+        config.manualRule.pkg = "android";
+        config.manualRule.zenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS;
+        config.manualRule.conditionId = null;
+        config.manualRule.enabler = "test";
+
+        // write out entire config xml
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        writeConfigXml(config, XML_VERSION_MODES_API, /* forBackup= */ false, baos);
+        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+        ZenModeConfig fromXml = readConfigXml(bais);
+
+
+        // The result should be valid and contain a manual rule; the rule should have a non-null
+        // ZenPolicy and a condition whose state is true. The conditionId should be default.
+        assertThat(fromXml.isValid()).isTrue();
+        assertThat(fromXml.manualRule).isNotNull();
+        assertThat(fromXml.manualRule.zenPolicy).isNotNull();
+        assertThat(fromXml.manualRule.condition).isNotNull();
+        assertThat(fromXml.manualRule.condition.state).isEqualTo(STATE_TRUE);
+        assertThat(fromXml.manualRule.conditionId).isEqualTo(Uri.EMPTY);
+        assertThat(fromXml.manualRule.enabler).isEqualTo("test");
+        assertThat(fromXml.isManualActive()).isTrue();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_MODES_UI)
+    public void testConfigXml_manualRuleWithCondition_upgradeWhenExisting() throws Exception {
         // prior to modes_ui, it's possible to have a non-null manual rule that doesn't have much
         // data on it because it's meant to indicate that the manual rule is on by merely existing.
         ZenModeConfig config = new ZenModeConfig();
@@ -1029,6 +1061,7 @@
 
         // The result should have a manual rule; it should have a non-null ZenPolicy and a condition
         // whose state is true. The conditionId and enabler data should also be preserved.
+        assertThat(fromXml.isValid()).isTrue();
         assertThat(fromXml.manualRule).isNotNull();
         assertThat(fromXml.manualRule.zenPolicy).isNotNull();
         assertThat(fromXml.manualRule.condition).isNotNull();
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeDiffTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeDiffTest.java
index 91eb2ed..c6cc941 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeDiffTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeDiffTest.java
@@ -60,6 +60,7 @@
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -69,6 +70,7 @@
 import platform.test.runner.parameterized.ParameterizedAndroidJunit4;
 import platform.test.runner.parameterized.Parameters;
 
+
 @SmallTest
 @RunWith(ParameterizedAndroidJunit4.class)
 @TestableLooper.RunWithLooper
@@ -127,7 +129,7 @@
         ArrayMap<String, Object> expectedFrom = new ArrayMap<>();
         ArrayMap<String, Object> expectedTo = new ArrayMap<>();
         List<Field> fieldsForDiff = getFieldsForDiffCheck(
-                ZenModeConfig.ZenRule.class, getZenRuleExemptFields());
+                ZenModeConfig.ZenRule.class, getZenRuleExemptFields(), false);
         generateFieldDiffs(r1, r2, fieldsForDiff, expectedFrom, expectedTo);
 
         ZenModeDiff.RuleDiff d = new ZenModeDiff.RuleDiff(r1, r2);
@@ -145,6 +147,337 @@
         }
     }
 
+    @Test
+    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    public void testRuleDiff_toStringNoChangeAddRemove() throws Exception {
+        // Start with two identical rules
+        ZenModeConfig.ZenRule r1 = makeRule();
+        ZenModeConfig.ZenRule r2 = makeRule();
+
+        ZenModeDiff.RuleDiff d = new ZenModeDiff.RuleDiff(r1, r2);
+        assertThat(d.toString()).isEqualTo("ZenRuleDiff{no changes}");
+
+        d = new ZenModeDiff.RuleDiff(r1, null);
+        assertThat(d.toString()).isEqualTo("ZenRuleDiff{removed}");
+
+        d = new ZenModeDiff.RuleDiff(null, r2);
+        assertThat(d.toString()).isEqualTo("ZenRuleDiff{added}");
+    }
+
+    @Test
+    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    public void testRuleDiff_toString() throws Exception {
+        // Start with two identical rules
+        ZenModeConfig.ZenRule r1 = makeRule();
+        ZenModeConfig.ZenRule r2 = makeRule();
+
+        ArrayMap<String, Object> expectedFrom = new ArrayMap<>();
+        ArrayMap<String, Object> expectedTo = new ArrayMap<>();
+        List<Field> fieldsForDiff = getFieldsForDiffCheck(
+                ZenModeConfig.ZenRule.class, getZenRuleExemptFields(), false);
+        generateFieldDiffs(r1, r2, fieldsForDiff, expectedFrom, expectedTo);
+
+        ZenModeDiff.RuleDiff d = new ZenModeDiff.RuleDiff(r1, r2);
+        assertThat(d.toString()).isEqualTo("ZenRuleDiff{"
+                + "enabled:true->false, "
+                + "conditionOverride:2->1, "
+                + "name:string1->string2, "
+                + "zenMode:2->1, "
+                + "conditionId:null->, "
+                + "condition:null->Condition["
+                + "state=STATE_TRUE,"
+                + "id=hello:,"
+                + "summary=,"
+                + "line1=,"
+                + "line2=,"
+                + "icon=-1,"
+                + "source=SOURCE_UNKNOWN,"
+                + "flags=2], "
+                + "component:null->ComponentInfo{b/b}, "
+                + "configurationActivity:null->ComponentInfo{a/a}, "
+                + "id:string1->string2, "
+                + "creationTime:200->100, "
+                + "enabler:string1->string2, "
+                + "zenPolicy:ZenPolicyDiff{"
+                + "mPriorityCategories_Reminders:1->2, "
+                + "mPriorityCategories_Events:1->2, "
+                + "mPriorityCategories_Messages:1->2, "
+                + "mPriorityCategories_Calls:1->2, "
+                + "mPriorityCategories_RepeatCallers:1->2, "
+                + "mPriorityCategories_Alarms:1->2, "
+                + "mPriorityCategories_Media:1->2, "
+                + "mPriorityCategories_System:1->2, "
+                + "mPriorityCategories_Conversations:1->2, "
+                + "mVisualEffects_FullScreenIntent:1->2, "
+                + "mVisualEffects_Lights:1->2, "
+                + "mVisualEffects_Peek:1->2, "
+                + "mVisualEffects_StatusBar:1->2, "
+                + "mVisualEffects_Badge:1->2, "
+                + "mVisualEffects_Ambient:1->2, "
+                + "mVisualEffects_NotificationList:1->2, "
+                + "mPriorityMessages:2->1, "
+                + "mPriorityCalls:2->1, "
+                + "mConversationSenders:2->1, "
+                + "mAllowChannels:2->1}, "
+                + "modified:true->false, "
+                + "pkg:string1->string2, "
+                + "zenDeviceEffects:ZenDeviceEffectsDiff{"
+                + "mGrayscale:true->false, "
+                + "mSuppressAmbientDisplay:true->false, "
+                + "mDimWallpaper:true->false, "
+                + "mNightMode:true->false, "
+                + "mDisableAutoBrightness:true->false, "
+                + "mDisableTapToWake:true->false, "
+                + "mDisableTiltToWake:true->false, "
+                + "mDisableTouch:true->false, "
+                + "mMinimizeRadioUsage:true->false, "
+                + "mMaximizeDoze:true->false, "
+                + "mExtraEffects:[effect1]->[effect2]}, "
+                + "triggerDescription:string1->string2, "
+                + "type:2->1, "
+                + "allowManualInvocation:true->false, "
+                + "iconResName:string1->string2, "
+                + "legacySuppressedEffects:2->1}");
+    }
+
+    @Test
+    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    public void testRuleDiff_toStringNullStartPolicy() throws Exception {
+        // Start with two identical rules
+        ZenModeConfig.ZenRule r1 = makeRule();
+        ZenModeConfig.ZenRule r2 = makeRule();
+
+        ArrayMap<String, Object> expectedFrom = new ArrayMap<>();
+        ArrayMap<String, Object> expectedTo = new ArrayMap<>();
+        List<Field> fieldsForDiff = getFieldsForDiffCheck(
+                ZenModeConfig.ZenRule.class, getZenRuleExemptFields(), false);
+        generateFieldDiffs(r1, r2, fieldsForDiff, expectedFrom, expectedTo);
+
+        // Create a ZenRule with ZenDeviceEffects and ZenPolicy as null.
+        r1.zenPolicy = null;
+        r1.zenDeviceEffects = null;
+        ZenModeDiff.RuleDiff d = new ZenModeDiff.RuleDiff(r1, r2);
+        assertThat(d.toString()).isEqualTo("ZenRuleDiff{"
+                + "enabled:true->false, "
+                + "conditionOverride:2->1, "
+                + "name:string1->string2, "
+                + "zenMode:2->1, "
+                + "conditionId:null->, "
+                + "condition:null->Condition["
+                + "state=STATE_TRUE,"
+                + "id=hello:,"
+                + "summary=,"
+                + "line1=,"
+                + "line2=,"
+                + "icon=-1,"
+                + "source=SOURCE_UNKNOWN,"
+                + "flags=2], "
+                + "component:null->ComponentInfo{b/b}, "
+                + "configurationActivity:null->ComponentInfo{a/a}, "
+                + "id:string1->string2, "
+                + "creationTime:200->100, "
+                + "enabler:string1->string2, "
+                + "zenPolicy:ZenPolicyDiff{added}, "
+                + "modified:true->false, "
+                + "pkg:string1->string2, "
+                + "zenDeviceEffects:ZenDeviceEffectsDiff{added}, "
+                + "triggerDescription:string1->string2, "
+                + "type:2->1, "
+                + "allowManualInvocation:true->false, "
+                + "iconResName:string1->string2, "
+                + "legacySuppressedEffects:2->1}");
+    }
+
+    @Test
+    public void testDeviceEffectsDiff_addRemoveSame() {
+        // Test add, remove, and both sides same
+        ZenDeviceEffects effects = new ZenDeviceEffects.Builder().build();
+
+        // Both sides same rule
+        ZenModeDiff.DeviceEffectsDiff dSame = new ZenModeDiff.DeviceEffectsDiff(effects, effects);
+        assertFalse(dSame.hasDiff());
+
+        // from existent rule to null: expect deleted
+        ZenModeDiff.DeviceEffectsDiff deleted = new ZenModeDiff.DeviceEffectsDiff(effects, null);
+        assertTrue(deleted.hasDiff());
+        assertTrue(deleted.wasRemoved());
+
+        // from null to new rule: expect added
+        ZenModeDiff.DeviceEffectsDiff added = new ZenModeDiff.DeviceEffectsDiff(null, effects);
+        assertTrue(added.hasDiff());
+        assertTrue(added.wasAdded());
+    }
+
+    @Test
+    public void testDeviceEffectsDiff_fieldDiffs() throws Exception {
+        // Start these the same
+        ZenDeviceEffects effects1 = new ZenDeviceEffects.Builder().build();
+        ZenDeviceEffects effects2 = new ZenDeviceEffects.Builder().build();
+
+        // maps mapping field name -> expected output value as we set diffs
+        ArrayMap<String, Object> expectedFrom = new ArrayMap<>();
+        ArrayMap<String, Object> expectedTo = new ArrayMap<>();
+        List<Field> fieldsForDiff = getFieldsForDiffCheck(
+                ZenDeviceEffects.class, Collections.emptySet() /*no exempt fields*/, true);
+        generateFieldDiffs(effects1, effects2, fieldsForDiff, expectedFrom, expectedTo);
+
+        ZenModeDiff.DeviceEffectsDiff d = new ZenModeDiff.DeviceEffectsDiff(effects1, effects2);
+        assertTrue(d.hasDiff());
+
+        // Now diff them and check that each of the fields has a diff
+        for (Field f : fieldsForDiff) {
+            String name = f.getName();
+            assertNotNull("diff not found for field: " + name, d.getDiffForField(name));
+            assertTrue(d.getDiffForField(name).hasDiff());
+            assertTrue("unexpected field: " + name, expectedFrom.containsKey(name));
+            assertTrue("unexpected field: " + name, expectedTo.containsKey(name));
+            assertEquals(expectedFrom.get(name), d.getDiffForField(name).from());
+            assertEquals(expectedTo.get(name), d.getDiffForField(name).to());
+        }
+    }
+
+    @Test
+    public void testDeviceEffectsDiff_toString() throws Exception {
+        // Ensure device effects toString is readable.
+        ZenDeviceEffects effects1 = new ZenDeviceEffects.Builder().build();
+        ZenDeviceEffects effects2 = new ZenDeviceEffects.Builder().build();
+
+        ZenModeDiff.DeviceEffectsDiff d = new ZenModeDiff.DeviceEffectsDiff(effects1, effects2);
+        assertThat(d.toString()).isEqualTo("ZenDeviceEffectsDiff{no changes}");
+
+        d = new ZenModeDiff.DeviceEffectsDiff(effects1, null);
+        assertThat(d.toString()).isEqualTo("ZenDeviceEffectsDiff{removed}");
+
+        d = new ZenModeDiff.DeviceEffectsDiff(null, effects2);
+        assertThat(d.toString()).isEqualTo("ZenDeviceEffectsDiff{added}");
+
+        ArrayMap<String, Object> expectedFrom = new ArrayMap<>();
+        ArrayMap<String, Object> expectedTo = new ArrayMap<>();
+        List<Field> fieldsForDiff = getFieldsForDiffCheck(
+                ZenDeviceEffects.class, Collections.emptySet() /*no exempt fields*/, true);
+        generateFieldDiffs(effects1, effects2, fieldsForDiff, expectedFrom, expectedTo);
+
+        d = new ZenModeDiff.DeviceEffectsDiff(effects1, effects2);
+        assertThat(d.toString()).isEqualTo("ZenDeviceEffectsDiff{"
+                + "mGrayscale:true->false, "
+                + "mSuppressAmbientDisplay:true->false, "
+                + "mDimWallpaper:true->false, "
+                + "mNightMode:true->false, "
+                + "mDisableAutoBrightness:true->false, "
+                + "mDisableTapToWake:true->false, "
+                + "mDisableTiltToWake:true->false, "
+                + "mDisableTouch:true->false, "
+                + "mMinimizeRadioUsage:true->false, "
+                + "mMaximizeDoze:true->false, "
+                + "mExtraEffects:[effect1]->[effect2]}");
+    }
+
+
+    @Test
+    public void testPolicyDiff_addRemoveSame() {
+        // Test add, remove, and both sides same
+        ZenPolicy effects = new ZenPolicy.Builder().build();
+
+        // Both sides same rule
+        ZenModeDiff.PolicyDiff dSame = new ZenModeDiff.PolicyDiff(effects, effects);
+        assertFalse(dSame.hasDiff());
+
+        // from existent rule to null: expect deleted
+        ZenModeDiff.PolicyDiff deleted = new ZenModeDiff.PolicyDiff(effects, null);
+        assertTrue(deleted.hasDiff());
+        assertTrue(deleted.wasRemoved());
+
+        // from null to new rule: expect added
+        ZenModeDiff.PolicyDiff added = new ZenModeDiff.PolicyDiff(null, effects);
+        assertTrue(added.hasDiff());
+        assertTrue(added.wasAdded());
+    }
+
+    @Test
+    public void testPolicyDiff_fieldDiffs() throws Exception {
+        // Start these the same
+        ZenPolicy policy1 = new ZenPolicy.Builder().build();
+        ZenPolicy policy2 = new ZenPolicy.Builder().build();
+
+        // maps mapping field name -> expected output value as we set diffs
+        ArrayMap<String, Object> expectedFrom = new ArrayMap<>();
+        ArrayMap<String, Object> expectedTo = new ArrayMap<>();
+
+        List<Field> fieldsForDiff = getFieldsForDiffCheck(ZenPolicy.class, Collections.emptySet(),
+                false);
+        generateFieldDiffsForZenPolicy(policy1, policy2, fieldsForDiff, expectedFrom, expectedTo);
+
+        ZenModeDiff.PolicyDiff d = new ZenModeDiff.PolicyDiff(policy1, policy2);
+        assertTrue(d.hasDiff());
+
+        // Now diff them and check that each of the fields has a diff.
+        // Because ZenPolicy consolidates priority category and visual effect fields in a list,
+        // we cannot use reflection on ZenPolicy to get the list of fields.
+        ArrayList<String> diffFields = new ArrayList<>();
+        Field[] fields = ZenModeDiff.PolicyDiff.class.getDeclaredFields();
+
+        for (Field field : fields) {
+            int m = field.getModifiers();
+            if (Modifier.isStatic(m) && Modifier.isFinal(m)) {
+                diffFields.add((String) field.get(policy1));
+            }
+        }
+
+        for (String name : diffFields) {
+            assertNotNull("diff not found for field: " + name, d.getDiffForField(name));
+            assertTrue(d.getDiffForField(name).hasDiff());
+            assertTrue("unexpected field: " + name, expectedFrom.containsKey(name));
+            assertTrue("unexpected field: " + name, expectedTo.containsKey(name));
+            assertEquals(expectedFrom.get(name), d.getDiffForField(name).from());
+            assertEquals(expectedTo.get(name), d.getDiffForField(name).to());
+        }
+    }
+
+    @Test
+    public void testPolicyDiff_toString() throws Exception {
+        // Ensure device effects toString is readable.
+        ZenPolicy policy1 = new ZenPolicy.Builder().build();
+        ZenPolicy policy2 = new ZenPolicy.Builder().build();
+
+        ZenModeDiff.PolicyDiff d = new ZenModeDiff.PolicyDiff(policy1, policy2);
+        assertThat(d.toString()).isEqualTo("ZenPolicyDiff{no changes}");
+
+        d = new ZenModeDiff.PolicyDiff(policy1, null);
+        assertThat(d.toString()).isEqualTo("ZenPolicyDiff{removed}");
+
+        d = new ZenModeDiff.PolicyDiff(null, policy2);
+        assertThat(d.toString()).isEqualTo("ZenPolicyDiff{added}");
+
+        ArrayMap<String, Object> expectedFrom = new ArrayMap<>();
+        ArrayMap<String, Object> expectedTo = new ArrayMap<>();
+        List<Field> fieldsForDiff = getFieldsForDiffCheck(
+                ZenPolicy.class, Collections.emptySet() /*no exempt fields*/, false);
+        generateFieldDiffsForZenPolicy(policy1, policy2, fieldsForDiff, expectedFrom, expectedTo);
+
+        d = new ZenModeDiff.PolicyDiff(policy1, policy2);
+        assertThat(d.toString()).isEqualTo("ZenPolicyDiff{"
+                + "mPriorityCategories_Reminders:1->2, "
+                + "mPriorityCategories_Events:1->2, "
+                + "mPriorityCategories_Messages:1->2, "
+                + "mPriorityCategories_Calls:1->2, "
+                + "mPriorityCategories_RepeatCallers:1->2, "
+                + "mPriorityCategories_Alarms:1->2, "
+                + "mPriorityCategories_Media:1->2, "
+                + "mPriorityCategories_System:1->2, "
+                + "mPriorityCategories_Conversations:1->2, "
+                + "mVisualEffects_FullScreenIntent:1->2, "
+                + "mVisualEffects_Lights:1->2, "
+                + "mVisualEffects_Peek:1->2, "
+                + "mVisualEffects_StatusBar:1->2, "
+                + "mVisualEffects_Badge:1->2, "
+                + "mVisualEffects_Ambient:1->2, "
+                + "mVisualEffects_NotificationList:1->2, "
+                + "mPriorityMessages:2->1, "
+                + "mPriorityCalls:2->1, "
+                + "mConversationSenders:2->1, "
+                + "mAllowChannels:2->1}");
+    }
+
     private static Set<String> getZenRuleExemptFields() {
         // "Metadata" fields are never compared.
         Set<String> exemptFields = new LinkedHashSet<>(
@@ -194,7 +527,7 @@
         ArrayMap<String, Object> expectedFrom = new ArrayMap<>();
         ArrayMap<String, Object> expectedTo = new ArrayMap<>();
         List<Field> fieldsForDiff = getFieldsForDiffCheck(
-                ZenModeConfig.class, getConfigExemptAndFlaggedFields());
+                ZenModeConfig.class, getConfigExemptAndFlaggedFields(), false);
         generateFieldDiffs(c1, c2, fieldsForDiff, expectedFrom, expectedTo);
 
         ZenModeDiff.ConfigDiff d = new ZenModeDiff.ConfigDiff(c1, c2);
@@ -223,7 +556,7 @@
         ArrayMap<String, Object> expectedFrom = new ArrayMap<>();
         ArrayMap<String, Object> expectedTo = new ArrayMap<>();
         List<Field> fieldsForDiff = getFieldsForDiffCheck(
-                ZenModeConfig.class, ZEN_MODE_CONFIG_EXEMPT_FIELDS);
+                ZenModeConfig.class, ZEN_MODE_CONFIG_EXEMPT_FIELDS, false);
         generateFieldDiffs(c1, c2, fieldsForDiff, expectedFrom, expectedTo);
 
         ZenModeDiff.ConfigDiff d = new ZenModeDiff.ConfigDiff(c1, c2);
@@ -359,17 +692,23 @@
 
     // Get the fields on which we would want to check a diff. The requirements are: not final or/
     // static (as these should/can never change), and not in a specific list that's exempted.
-    private List<Field> getFieldsForDiffCheck(Class<?> c, Set<String> exemptNames)
+    private List<Field> getFieldsForDiffCheck(Class<?> c, Set<String> exemptNames,
+                                              boolean includeFinal)
             throws SecurityException {
         Field[] fields = c.getDeclaredFields();
         ArrayList<Field> out = new ArrayList<>();
 
         for (Field field : fields) {
             // Check for exempt reasons
+            // Anything in provided exemptNames is skipped.
+            if (exemptNames.contains(field.getName())) {
+                continue;
+            }
             int m = field.getModifiers();
-            if (Modifier.isFinal(m)
-                    || Modifier.isStatic(m)
-                    || exemptNames.contains(field.getName())) {
+            if (Modifier.isStatic(m)) {
+                continue;
+            }
+            if (!includeFinal && Modifier.isFinal(m)) {
                 continue;
             }
             out.add(field);
@@ -377,6 +716,106 @@
         return out;
     }
 
+    // Generate a set of diffs for two ZenPolicy objects. Store the results in the provided
+    // expectation maps.
+    private void generateFieldDiffsForZenPolicy(ZenPolicy a, ZenPolicy b, List<Field> fields,
+            ArrayMap<String, Object> expectedA, ArrayMap<String, Object> expectedB)
+            throws Exception {
+        // Loop through fields for which we want to check diffs, set a diff and keep track of
+        // what we set.
+        for (Field f : fields) {
+            f.setAccessible(true);
+            // Just double-check also that the fields actually are for the class declared
+            assertEquals(f.getDeclaringClass(), a.getClass());
+            Class<?> t = f.getType();
+
+            if (int.class.equals(t)) {
+                // these will not be valid for arbitrary int enums, but should suffice for a diff.
+                f.setInt(a, 2);
+                expectedA.put(f.getName(), 2);
+                f.setInt(b, 1);
+                expectedB.put(f.getName(), 1);
+            } else if (List.class.equals(t)) {
+                // Fieds mPriorityCategories and mVisualEffects store multiple values and
+                // must be treated separately.
+                List<Integer> aList = (ArrayList<Integer>) f.get(a);
+                List<Integer> bList = (ArrayList<Integer>) f.get(b);
+                if (f.getName().equals("mPriorityCategories")) {
+                    // PRIORITY_CATEGORY_REMINDERS
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 0,
+                            "mPriorityCategories_Reminders");
+                    // PRIORITY_CATEGORY_EVENTS
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 1,
+                            "mPriorityCategories_Events");
+                    // PRIORITY_CATEGORY_MESSAGES
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 2,
+                            "mPriorityCategories_Messages");
+                    // PRIORITY_CATEGORY_CALLS
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 3,
+                            "mPriorityCategories_Calls");
+                    // PRIORITY_CATEGORY_REPEAT_CALLERS
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 4,
+                            "mPriorityCategories_RepeatCallers");
+                    // PRIORITY_CATEGORY_ALARMS
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 5,
+                            "mPriorityCategories_Alarms");
+                    // PRIORITY_CATEGORY_MEDIA
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 6,
+                            "mPriorityCategories_Media");
+                    // PRIORITY_CATEGORY_SYSTEM
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 7,
+                            "mPriorityCategories_System");
+                    // PRIORITY_CATEGORY_CONVERSATIONS
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 8,
+                            "mPriorityCategories_Conversations");
+                    // Assert that we've set every PriorityCategory enum value.
+                    assertThat(Collections.frequency(aList, ZenPolicy.STATE_ALLOW))
+                            .isEqualTo(ZenPolicy.NUM_PRIORITY_CATEGORIES);
+                } else if (f.getName().equals("mVisualEffects")) {
+                    // VISUAL_EFFECT_FULL_SCREEN_INTENT
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 0,
+                            "mVisualEffects_FullScreenIntent");
+                    // VISUAL_EFFECT_LIGHTS
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 1,
+                            "mVisualEffects_Lights");
+                    // VISUAL_EFFECT_PEEK
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 2,
+                            "mVisualEffects_Peek");
+                    // VISUAL_EFFECT_STATUS_BAR
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 3,
+                            "mVisualEffects_StatusBar");
+                    // VISUAL_EFFECT_BADGE
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 4,
+                            "mVisualEffects_Badge");
+                    // VISUAL_EFFECT_AMBIENT
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 5,
+                            "mVisualEffects_Ambient");
+                    // VISUAL_EFFECT_NOTIFICATION_LIST
+                    setPolicyListValueDiff(aList, bList, expectedA, expectedB, 6,
+                            "mVisualEffects_NotificationList");
+                    // Assert that we've set every VisualeEffect enum value.
+                    assertThat(Collections.frequency(aList, ZenPolicy.STATE_ALLOW))
+                            .isEqualTo(ZenPolicy.NUM_VISUAL_EFFECTS);
+                } else {
+                    // Any other lists that are added should be added to the diff.
+                    fail("could not generate field diffs for policy list: " + f.getName());
+                }
+            }
+        }
+    }
+
+    // Helper function to create a diff in two list values at a given index, and record that
+    // diff's values in the associated expected maps under the provided field name.
+    private void setPolicyListValueDiff(List<Integer> aList, List<Integer> bList,
+                                        ArrayMap<String, Object> expectedA,
+                                        ArrayMap<String, Object> expectedB,
+                                        int index, String fieldName) {
+        aList.set(index, ZenPolicy.STATE_ALLOW);
+        expectedA.put(fieldName, ZenPolicy.STATE_ALLOW);
+        bList.set(index, ZenPolicy.STATE_DISALLOW);
+        expectedB.put(fieldName, ZenPolicy.STATE_DISALLOW);
+    }
+
     // Generate a set of generic diffs for the specified two objects and the fields to generate
     // diffs for, and store the results in the provided expectation maps to be able to check the
     // output later.
@@ -420,6 +859,44 @@
                 expectedA.put(f.getName(), "string1");
                 f.set(b, "string2");
                 expectedB.put(f.getName(), "string2");
+            } else if (Set.class.equals(t)) {
+                Set<String> aSet = Set.of("effect1");
+                Set<String> bSet = Set.of("effect2");
+                f.set(a, aSet);
+                expectedA.put(f.getName(), aSet);
+                f.set(b, bSet);
+                expectedB.put(f.getName(), bSet);
+            } else if (ZenDeviceEffects.class.equals(t)) {
+                // Recurse into generating field diffs for ZenDeviceEffects.
+                ZenDeviceEffects effects1 = new ZenDeviceEffects.Builder().build();
+                ZenDeviceEffects effects2 = new ZenDeviceEffects.Builder().build();
+                // maps mapping field name -> expected output value as we set diffs
+                ArrayMap<String, Object> expectedFrom = new ArrayMap<>();
+                ArrayMap<String, Object> expectedTo = new ArrayMap<>();
+
+                List<Field> fieldsForDiff = getFieldsForDiffCheck(
+                        ZenDeviceEffects.class, Collections.emptySet() /*no exempt fields*/, true);
+                generateFieldDiffs(effects1, effects2, fieldsForDiff, expectedFrom, expectedTo);
+                f.set(a, effects1);
+                expectedA.put(f.getName(), effects1);
+                f.set(b, effects2);
+                expectedB.put(f.getName(), effects2);
+            } else if (ZenPolicy.class.equals(t)) {
+                // Recurse into generating field diffs for ZenPolicy.
+                ZenPolicy policy1 = new ZenPolicy.Builder().build();
+                ZenPolicy policy2 = new ZenPolicy.Builder().build();
+                // maps mapping field name -> expected output value as we set diffs
+                ArrayMap<String, Object> expectedFrom = new ArrayMap<>();
+                ArrayMap<String, Object> expectedTo = new ArrayMap<>();
+
+                List<Field> fieldsForDiff = getFieldsForDiffCheck(ZenPolicy.class,
+                        Collections.emptySet(), false);
+                generateFieldDiffsForZenPolicy(policy1, policy2, fieldsForDiff, expectedFrom,
+                        expectedTo);
+                f.set(a, policy1);
+                expectedA.put(f.getName(), policy1);
+                f.set(b, policy2);
+                expectedB.put(f.getName(), policy2);
             } else {
                 // catch-all for other types: have the field be "added"
                 f.set(a, null);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeFilteringTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeFilteringTest.java
index b997f5d..a49f5a8 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeFilteringTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeFilteringTest.java
@@ -26,8 +26,6 @@
 import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_MESSAGES;
 import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_REPEAT_CALLERS;
 import static android.app.NotificationManager.Policy.PRIORITY_SENDERS_ANY;
-import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_STATUS_BAR;
-import static android.provider.Settings.Global.ZEN_MODE_ALARMS;
 import static android.provider.Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
 import static android.provider.Settings.Global.ZEN_MODE_NO_INTERRUPTIONS;
 import static android.provider.Settings.Global.ZEN_MODE_OFF;
@@ -57,7 +55,6 @@
 
 import androidx.test.filters.SmallTest;
 
-import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
 import com.android.internal.util.NotificationMessagingUtil;
 import com.android.server.UiServiceTestCase;
 
@@ -188,49 +185,6 @@
     }
 
     @Test
-    public void testSuppressDNDInfo_yes_VisEffectsAllowed() {
-        NotificationRecord r = getNotificationRecord();
-        when(r.getSbn().getPackageName()).thenReturn("android");
-        when(r.getSbn().getId()).thenReturn(SystemMessage.NOTE_ZEN_UPGRADE);
-        Policy policy = new Policy(0, 0, 0, Policy.getAllSuppressedVisualEffects()
-                - SUPPRESSED_EFFECT_STATUS_BAR, 0);
-
-        assertTrue(mZenModeFiltering.shouldIntercept(ZEN_MODE_IMPORTANT_INTERRUPTIONS, policy, r));
-    }
-
-    @Test
-    public void testSuppressDNDInfo_yes_WrongId() {
-        NotificationRecord r = getNotificationRecord();
-        when(r.getSbn().getPackageName()).thenReturn("android");
-        when(r.getSbn().getId()).thenReturn(SystemMessage.NOTE_ACCOUNT_CREDENTIAL_PERMISSION);
-        Policy policy = new Policy(0, 0, 0, Policy.getAllSuppressedVisualEffects(), 0);
-
-        assertTrue(mZenModeFiltering.shouldIntercept(ZEN_MODE_IMPORTANT_INTERRUPTIONS, policy, r));
-    }
-
-    @Test
-    public void testSuppressDNDInfo_yes_WrongPackage() {
-        NotificationRecord r = getNotificationRecord();
-        when(r.getSbn().getPackageName()).thenReturn("android2");
-        when(r.getSbn().getId()).thenReturn(SystemMessage.NOTE_ZEN_UPGRADE);
-        Policy policy = new Policy(0, 0, 0, Policy.getAllSuppressedVisualEffects(), 0);
-
-        assertTrue(mZenModeFiltering.shouldIntercept(ZEN_MODE_IMPORTANT_INTERRUPTIONS, policy, r));
-    }
-
-    @Test
-    public void testSuppressDNDInfo_no() {
-        NotificationRecord r = getNotificationRecord();
-        when(r.getSbn().getPackageName()).thenReturn("android");
-        when(r.getSbn().getId()).thenReturn(SystemMessage.NOTE_ZEN_UPGRADE);
-        Policy policy = new Policy(0, 0, 0, Policy.getAllSuppressedVisualEffects(), 0);
-
-        assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_IMPORTANT_INTERRUPTIONS, policy, r));
-        assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_ALARMS, policy, r));
-        assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_NO_INTERRUPTIONS, policy, r));
-    }
-
-    @Test
     public void testSuppressAnything_yes_ZenModeOff() {
         NotificationRecord r = getNotificationRecord();
         when(r.getSbn().getPackageName()).thenReturn("bananas");
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
index d4cba8d..294027b 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
@@ -169,7 +169,6 @@
 
 import com.android.internal.R;
 import com.android.internal.config.sysui.TestableFlagResolver;
-import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
 import com.android.modules.utils.TypedXmlPullParser;
 import com.android.modules.utils.TypedXmlSerializer;
 import com.android.os.AtomsProto;
@@ -747,54 +746,6 @@
     }
 
     @Test
-    public void testZenUpgradeNotification() {
-        /**
-         * Commit a485ec65b5ba947d69158ad90905abf3310655cf disabled DND status change
-         * notification on watches. So, assume that the device is not watch.
-         */
-        when(mContext.getPackageManager()).thenReturn(mPackageManager);
-        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH)).thenReturn(false);
-
-        // shows zen upgrade notification if stored settings says to shows,
-        // zen has not been updated, boot is completed
-        // and we're setting zen mode on
-        Settings.Secure.putInt(mContentResolver, Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 1);
-        Settings.Secure.putInt(mContentResolver, Settings.Secure.ZEN_SETTINGS_UPDATED, 0);
-        mZenModeHelper.mIsSystemServicesReady = true;
-        mZenModeHelper.mConsolidatedPolicy = new Policy(0, 0, 0, 0, 0, 0);
-        mZenModeHelper.setZenModeSetting(ZEN_MODE_IMPORTANT_INTERRUPTIONS);
-
-        verify(mNotificationManager, times(1)).notify(eq(ZenModeHelper.TAG),
-                eq(SystemMessage.NOTE_ZEN_UPGRADE), any());
-        assertEquals(0, Settings.Secure.getInt(mContentResolver,
-                Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, -1));
-    }
-
-    @Test
-    public void testNoZenUpgradeNotification() {
-        // doesn't show upgrade notification if stored settings says don't show
-        Settings.Secure.putInt(mContentResolver, Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 0);
-        Settings.Secure.putInt(mContentResolver, Settings.Secure.ZEN_SETTINGS_UPDATED, 0);
-        mZenModeHelper.mIsSystemServicesReady = true;
-        mZenModeHelper.setZenModeSetting(ZEN_MODE_IMPORTANT_INTERRUPTIONS);
-
-        verify(mNotificationManager, never()).notify(eq(ZenModeHelper.TAG),
-                eq(SystemMessage.NOTE_ZEN_UPGRADE), any());
-    }
-
-    @Test
-    public void testNoZenUpgradeNotificationZenUpdated() {
-        // doesn't show upgrade notification since zen was already updated
-        Settings.Secure.putInt(mContentResolver, Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 0);
-        Settings.Secure.putInt(mContentResolver, Settings.Secure.ZEN_SETTINGS_UPDATED, 1);
-        mZenModeHelper.mIsSystemServicesReady = true;
-        mZenModeHelper.setZenModeSetting(ZEN_MODE_IMPORTANT_INTERRUPTIONS);
-
-        verify(mNotificationManager, never()).notify(eq(ZenModeHelper.TAG),
-                eq(SystemMessage.NOTE_ZEN_UPGRADE), any());
-    }
-
-    @Test
     public void testZenSetInternalRinger_AllPriorityNotificationSoundsMuted() {
         AudioManagerInternal mAudioManager = mock(AudioManagerInternal.class);
         mZenModeHelper.mAudioManager = mAudioManager;
@@ -3032,6 +2983,33 @@
     }
 
     @Test
+    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    public void updateAutomaticZenRule_withTypeBedtime_replacesDisabledSleeping() {
+        ZenRule sleepingRule = createCustomAutomaticRule(ZEN_MODE_IMPORTANT_INTERRUPTIONS,
+                ZenModeConfig.EVERY_NIGHT_DEFAULT_RULE_ID);
+        sleepingRule.enabled = false;
+        sleepingRule.userModifiedFields = 0;
+        sleepingRule.name = "ZZZZZZZ...";
+        mZenModeHelper.mConfig.automaticRules.clear();
+        mZenModeHelper.mConfig.automaticRules.put(sleepingRule.id, sleepingRule);
+
+        AutomaticZenRule futureBedtime = new AutomaticZenRule.Builder("Bedtime (?)", CONDITION_ID)
+                .build();
+        String bedtimeRuleId = mZenModeHelper.addAutomaticZenRule(mPkg, futureBedtime,
+                ORIGIN_APP, "reason", CUSTOM_PKG_UID);
+        assertThat(mZenModeHelper.mConfig.automaticRules.keySet())
+                .containsExactly(sleepingRule.id, bedtimeRuleId);
+
+        AutomaticZenRule bedtime = new AutomaticZenRule.Builder("Bedtime (!)", CONDITION_ID)
+                .setType(TYPE_BEDTIME)
+                .build();
+        mZenModeHelper.updateAutomaticZenRule(bedtimeRuleId, bedtime, ORIGIN_APP, "reason",
+                CUSTOM_PKG_UID);
+
+        assertThat(mZenModeHelper.mConfig.automaticRules.keySet()).containsExactly(bedtimeRuleId);
+    }
+
+    @Test
     @EnableFlags(FLAG_MODES_API)
     public void testSetManualZenMode() {
         setupZenConfig();
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/RampToStepAdapterTest.java b/services/tests/vibrator/src/com/android/server/vibrator/RampToStepAdapterTest.java
index 867c061..8103682 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/RampToStepAdapterTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/RampToStepAdapterTest.java
@@ -39,8 +39,8 @@
     private static final int TEST_STEP_DURATION = 5;
     private static final float[] TEST_AMPLITUDE_MAP = new float[]{
             /* 50Hz= */ 0.1f, 0.2f, 0.4f, 0.8f, /* 150Hz= */ 1f, 0.9f, /* 200Hz= */ 0.8f};
-    private static final VibratorInfo.FrequencyProfile TEST_FREQUENCY_PROFILE =
-            new VibratorInfo.FrequencyProfile(
+    private static final VibratorInfo.FrequencyProfileLegacy TEST_FREQUENCY_PROFILE =
+            new VibratorInfo.FrequencyProfileLegacy(
                     /* resonantFrequencyHz= */ 150f, /* minFrequencyHz= */ 50f,
                     /* frequencyResolutionHz= */ 25f, TEST_AMPLITUDE_MAP);
     private static final VibratorInfo EMPTY_VIBRATOR_INFO = createVibratorInfo();
@@ -121,7 +121,7 @@
     private static VibratorInfo createVibratorInfo(int... capabilities) {
         return new VibratorInfo.Builder(0)
                 .setCapabilities(IntStream.of(capabilities).reduce((a, b) -> a | b).orElse(0))
-                .setFrequencyProfile(TEST_FREQUENCY_PROFILE)
+                .setFrequencyProfileLegacy(TEST_FREQUENCY_PROFILE)
                 .build();
     }
 }
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/SplitSegmentsAdapterTest.java b/services/tests/vibrator/src/com/android/server/vibrator/SplitSegmentsAdapterTest.java
index 6630cca..f2c3726 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/SplitSegmentsAdapterTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/SplitSegmentsAdapterTest.java
@@ -41,8 +41,8 @@
     private static final float[] TEST_AMPLITUDE_MAP = new float[]{
             /* 50Hz= */ 0.1f, 0.2f, 0.4f, 0.8f, /* 150Hz= */ 1f, 0.9f, /* 200Hz= */ 0.8f};
 
-    private static final VibratorInfo.FrequencyProfile TEST_FREQUENCY_PROFILE =
-            new VibratorInfo.FrequencyProfile(
+    private static final VibratorInfo.FrequencyProfileLegacy TEST_FREQUENCY_PROFILE =
+            new VibratorInfo.FrequencyProfileLegacy(
                     /* resonantFrequencyHz= */ 150f, /* minFrequencyHz= */ 50f,
                     /* frequencyResolutionHz= */ 25f, TEST_AMPLITUDE_MAP);
 
@@ -125,7 +125,7 @@
         VibratorInfo vibratorInfo = new VibratorInfo.Builder(0)
                 .setCapabilities(IVibrator.CAP_COMPOSE_PWLE_EFFECTS)
                 .setPwlePrimitiveDurationMax(10)
-                .setFrequencyProfile(TEST_FREQUENCY_PROFILE)
+                .setFrequencyProfileLegacy(TEST_FREQUENCY_PROFILE)
                 .build();
 
         // Update repeat index to skip the ramp splits.
@@ -137,7 +137,7 @@
     private static VibratorInfo createVibratorInfo(int... capabilities) {
         return new VibratorInfo.Builder(0)
                 .setCapabilities(IntStream.of(capabilities).reduce((a, b) -> a | b).orElse(0))
-                .setFrequencyProfile(TEST_FREQUENCY_PROFILE)
+                .setFrequencyProfileLegacy(TEST_FREQUENCY_PROFILE)
                 .setPwlePrimitiveDurationMax(PWLE_COMPOSITION_PRIMITIVE_DURATION_MAX)
                 .build();
     }
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/StepToRampAdapterTest.java b/services/tests/vibrator/src/com/android/server/vibrator/StepToRampAdapterTest.java
index 82deff0..d501dba 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/StepToRampAdapterTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/StepToRampAdapterTest.java
@@ -38,8 +38,8 @@
 public class StepToRampAdapterTest {
     private static final float[] TEST_AMPLITUDE_MAP = new float[]{
             /* 50Hz= */ 0.1f, 0.2f, 0.4f, 0.8f, /* 150Hz= */ 1f, 0.9f, /* 200Hz= */ 0.8f};
-    private static final VibratorInfo.FrequencyProfile TEST_FREQUENCY_PROFILE =
-            new VibratorInfo.FrequencyProfile(
+    private static final VibratorInfo.FrequencyProfileLegacy TEST_FREQUENCY_PROFILE =
+            new VibratorInfo.FrequencyProfileLegacy(
                     /* resonantFrequencyHz= */ 150f, /* minFrequencyHz= */ 50f,
                     /* frequencyResolutionHz= */ 25f, TEST_AMPLITUDE_MAP);
     private static final VibratorInfo EMPTY_VIBRATOR_INFO = createVibratorInfo();
@@ -153,7 +153,7 @@
     private static VibratorInfo createVibratorInfo(int... capabilities) {
         return new VibratorInfo.Builder(0)
                 .setCapabilities(IntStream.of(capabilities).reduce((a, b) -> a | b).orElse(0))
-                .setFrequencyProfile(TEST_FREQUENCY_PROFILE)
+                .setFrequencyProfileLegacy(TEST_FREQUENCY_PROFILE)
                 .build();
     }
 }
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java b/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
index e83a4b2..7536f5f 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
@@ -47,7 +47,6 @@
 import android.hardware.vibrator.IVibratorManager;
 import android.os.CombinedVibration;
 import android.os.Handler;
-import android.os.IBinder;
 import android.os.PersistableBundle;
 import android.os.PowerManager;
 import android.os.Process;
@@ -119,7 +118,6 @@
     @Mock private PackageManagerInternal mPackageManagerInternalMock;
     @Mock private VibrationThread.VibratorManagerHooks mManagerHooks;
     @Mock private VibratorController.OnVibrationCompleteListener mControllerCallbacks;
-    @Mock private IBinder mVibrationToken;
     @Mock private VibrationConfig mVibrationConfigMock;
     @Mock private VibratorFrameworkStatsLogger mStatsLoggerMock;
 
@@ -668,7 +666,7 @@
         VibrationEffect fallback = VibrationEffect.createOneShot(10, 100);
         HalVibration vibration = createVibration(CombinedVibration.createParallel(
                 VibrationEffect.get(VibrationEffect.EFFECT_CLICK)));
-        vibration.addFallback(VibrationEffect.EFFECT_CLICK, fallback);
+        vibration.fillFallbacks(unused -> fallback);
         startThreadAndDispatcher(vibration);
         waitForCompletion();
 
@@ -848,7 +846,7 @@
                 .addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 0.5f)
                 .compose();
         HalVibration vibration = createVibration(CombinedVibration.createParallel(effect));
-        vibration.addFallback(VibrationEffect.EFFECT_TICK, fallback);
+        vibration.fillFallbacks(unused -> fallback);
         startThreadAndDispatcher(vibration);
         waitForCompletion();
 
@@ -954,7 +952,8 @@
         assertTrue(mThread.isRunningVibrationId(vibration.id));
         assertTrue(mControllers.get(VIBRATOR_ID).isVibrating());
 
-        mVibrationConductor.binderDied();
+        mVibrationConductor.notifyCancelled(
+                new Vibration.EndInfo(Status.CANCELLED_BINDER_DIED), /* immediate= */ false);
         waitForCompletion();
         assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
 
@@ -1575,7 +1574,8 @@
                 TEST_TIMEOUT_MILLIS));
         assertTrue(mThread.isRunningVibrationId(vibration.id));
 
-        mVibrationConductor.binderDied();
+        mVibrationConductor.notifyCancelled(
+                new Vibration.EndInfo(Status.CANCELLED_BINDER_DIED), /* immediate= */ false);
         waitForCompletion();
 
         verifyCallbacksTriggered(vibration, Status.CANCELLED_BINDER_DIED);
@@ -1865,9 +1865,9 @@
         VibrationAttributes attrs = new VibrationAttributes.Builder()
                 .setUsage(usage)
                 .build();
-        HalVibration vib = new HalVibration(mVibrationToken,
-                CombinedVibration.createParallel(effect),
-                new CallerInfo(attrs, UID, DEVICE_ID, PACKAGE_NAME, "reason"));
+        HalVibration vib = new HalVibration(
+                new CallerInfo(attrs, UID, DEVICE_ID, PACKAGE_NAME, "reason"),
+                CombinedVibration.createParallel(effect));
         return startThreadAndDispatcher(vib, requestVibrationParamsFuture);
     }
 
@@ -1903,8 +1903,8 @@
     }
 
     private HalVibration createVibration(CombinedVibration effect) {
-        return new HalVibration(mVibrationToken, effect,
-                new CallerInfo(ATTRS, UID, DEVICE_ID, PACKAGE_NAME, "reason"));
+        return new HalVibration(new CallerInfo(ATTRS, UID, DEVICE_ID, PACKAGE_NAME, "reason"),
+                effect);
     }
 
     private SparseArray<VibratorController> createVibratorControllers() {
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/VibratorControllerTest.java b/services/tests/vibrator/src/com/android/server/vibrator/VibratorControllerTest.java
index 0d13be6..8179369 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibratorControllerTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibratorControllerTest.java
@@ -127,13 +127,13 @@
     public void setExternalControl_withCapability_enablesExternalControl() {
         mockVibratorCapabilities(IVibrator.CAP_EXTERNAL_CONTROL);
         VibratorController controller = createController();
-        assertFalse(controller.isUnderExternalControl());
+        assertFalse(controller.isVibrating());
 
         controller.setExternalControl(true);
-        assertTrue(controller.isUnderExternalControl());
+        assertTrue(controller.isVibrating());
 
         controller.setExternalControl(false);
-        assertFalse(controller.isUnderExternalControl());
+        assertFalse(controller.isVibrating());
 
         InOrder inOrderVerifier = inOrder(mNativeWrapperMock);
         inOrderVerifier.verify(mNativeWrapperMock).setExternalControl(eq(true));
@@ -143,10 +143,10 @@
     @Test
     public void setExternalControl_withNoCapability_ignoresExternalControl() {
         VibratorController controller = createController();
-        assertFalse(controller.isUnderExternalControl());
+        assertFalse(controller.isVibrating());
 
         controller.setExternalControl(true);
-        assertFalse(controller.isUnderExternalControl());
+        assertFalse(controller.isVibrating());
 
         verify(mNativeWrapperMock, never()).setExternalControl(anyBoolean());
     }
@@ -181,6 +181,38 @@
     }
 
     @Test
+    public void setAmplitude_vibratorIdle_ignoresAmplitude() {
+        VibratorController controller = createController();
+        assertFalse(controller.isVibrating());
+
+        controller.setAmplitude(1);
+        assertEquals(0, controller.getCurrentAmplitude(), /* delta= */ 0);
+    }
+
+    @Test
+    public void setAmplitude_vibratorUnderExternalControl_ignoresAmplitude() {
+        mockVibratorCapabilities(IVibrator.CAP_EXTERNAL_CONTROL);
+        VibratorController controller = createController();
+        controller.setExternalControl(true);
+        assertTrue(controller.isVibrating());
+
+        controller.setAmplitude(1);
+        assertEquals(0, controller.getCurrentAmplitude(), /* delta= */ 0);
+    }
+
+    @Test
+    public void setAmplitude_vibratorVibrating_setsAmplitude() {
+        when(mNativeWrapperMock.on(anyLong(), anyLong())).thenAnswer(args -> args.getArgument(0));
+        VibratorController controller = createController();
+        controller.on(100, /* vibrationId= */ 1);
+        assertTrue(controller.isVibrating());
+        assertEquals(-1, controller.getCurrentAmplitude(), /* delta= */ 0);
+
+        controller.setAmplitude(1);
+        assertEquals(1, controller.getCurrentAmplitude(), /* delta= */ 0);
+    }
+
+    @Test
     public void on_withDuration_turnsVibratorOn() {
         when(mNativeWrapperMock.on(anyLong(), anyLong())).thenAnswer(args -> args.getArgument(0));
         VibratorController controller = createController();
@@ -302,13 +334,14 @@
     }
 
     private void mockVibratorCapabilities(int capabilities) {
-        VibratorInfo.FrequencyProfile frequencyProfile = new VibratorInfo.FrequencyProfile(
+        VibratorInfo.FrequencyProfileLegacy
+                frequencyProfile = new VibratorInfo.FrequencyProfileLegacy(
                 Float.NaN, Float.NaN, Float.NaN, null);
         when(mNativeWrapperMock.getInfo(any(VibratorInfo.Builder.class)))
                 .then(invocation -> {
                     ((VibratorInfo.Builder) invocation.getArgument(0))
                             .setCapabilities(capabilities)
-                            .setFrequencyProfile(frequencyProfile);
+                            .setFrequencyProfileLegacy(frequencyProfile);
                     return true;
                 });
     }
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/VibratorFrameworkStatsLoggerTest.java b/services/tests/vibrator/src/com/android/server/vibrator/VibratorFrameworkStatsLoggerTest.java
index cd057b6..1d1b4e2 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibratorFrameworkStatsLoggerTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibratorFrameworkStatsLoggerTest.java
@@ -115,6 +115,6 @@
     }
 
     private static VibrationStats.StatsInfo newEmptyStatsInfo() {
-        return new VibrationStats.StatsInfo(0, 0, 0, Status.FINISHED, new VibrationStats(), 0L);
+        return new VibrationStats.StatsInfo(0, 0, 0, Status.FINISHED, new VibrationStats());
     }
 }
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
index d99b20c6..b782162 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
@@ -266,12 +266,13 @@
     @After
     public void tearDown() throws Exception {
         if (mService != null) {
-            if (!mPendingVibrations.stream().allMatch(HalVibration::hasEnded)) {
-                // Cancel any pending vibration from tests.
-                cancelVibrate(mService);
-                for (HalVibration vibration : mPendingVibrations) {
-                    vibration.waitForEnd();
-                }
+            // Make sure we have permission to cancel test vibrations, even if the test denied them.
+            grantPermission(android.Manifest.permission.VIBRATE);
+            // Cancel any pending vibration from tests, including external vibrations.
+            cancelVibrate(mService);
+            // Wait until pending vibrations end asynchronously.
+            for (HalVibration vibration : mPendingVibrations) {
+                vibration.waitForEnd();
             }
             // Wait until all vibrators have stopped vibrating, waiting for ramp-down.
             // Note: if a test is flaky here something is wrong with the vibration finalization.
@@ -1790,28 +1791,6 @@
     }
 
     @Test
-    public void performHapticFeedback_usesServiceAsToken() throws Exception {
-        VibratorManagerService service = createSystemReadyService();
-
-        HalVibration vibration =
-                performHapticFeedbackAndWaitUntilFinished(
-                        service, HapticFeedbackConstants.SCROLL_TICK, /* always= */ true);
-
-        assertTrue(vibration.callerToken == service);
-    }
-
-    @Test
-    public void performHapticFeedbackForInputDevice_usesServiceAsToken() throws Exception {
-        VibratorManagerService service = createSystemReadyService();
-
-        HalVibration vibration = performHapticFeedbackForInputDeviceAndWaitUntilFinished(
-                service, HapticFeedbackConstants.SCROLL_TICK, /* inputDeviceId= */ 0,
-                InputDevice.SOURCE_ROTARY_ENCODER, /* always= */ true);
-
-        assertTrue(vibration.callerToken == service);
-    }
-
-    @Test
     @RequiresFlagsEnabled(android.os.vibrator.Flags.FLAG_VENDOR_VIBRATION_EFFECTS)
     public void vibrate_vendorEffectsWithoutPermission_doesNotVibrate() throws Exception {
         // Deny permission to vibrate with vendor effects
@@ -2146,6 +2125,27 @@
     }
 
     @Test
+    public void cancelVibrate_externalVibration_cancelWithDifferentToken() {
+        mockVibrators(1);
+        mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_EXTERNAL_CONTROL);
+        createSystemReadyService();
+
+        IBinder vibrationBinderToken = mock(IBinder.class);
+        ExternalVibration externalVibration = new ExternalVibration(UID, PACKAGE_NAME,
+                AUDIO_ALARM_ATTRS,
+                mock(IExternalVibrationController.class), vibrationBinderToken);
+        ExternalVibrationScale scale = mExternalVibratorService.onExternalVibrationStart(
+                externalVibration);
+
+        IBinder cancelBinderToken = mock(IBinder.class);
+        mService.cancelVibrate(VibrationAttributes.USAGE_FILTER_MATCH_ALL, cancelBinderToken);
+
+        assertNotEquals(ExternalVibrationScale.ScaleLevel.SCALE_MUTE, scale.scaleLevel);
+        assertEquals(Arrays.asList(false, true, false),
+                mVibratorProviders.get(1).getExternalControlStates());
+    }
+
+    @Test
     public void onExternalVibration_ignoreVibrationFromVirtualDevices() {
         mockVibrators(1);
         mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_EXTERNAL_CONTROL);
@@ -2242,7 +2242,7 @@
         VibratorManagerService service = createSystemReadyService();
 
         VibrationEffect effect = VibrationEffect.createOneShot(10 * TEST_TIMEOUT_MILLIS, 100);
-        vibrate(service, effect, HAPTIC_FEEDBACK_ATTRS);
+        HalVibration vibration = vibrate(service, effect, HAPTIC_FEEDBACK_ATTRS);
 
         // VibrationThread will start this vibration async, so wait until vibration is triggered.
         assertTrue(waitUntil(s -> s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
@@ -2255,7 +2255,8 @@
         assertNotEquals(ExternalVibrationScale.ScaleLevel.SCALE_MUTE, scale.scaleLevel);
 
         // Vibration is cancelled.
-        assertTrue(waitUntil(s -> !s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
+        vibration.waitForEnd();
+        assertThat(vibration.getStatus()).isEqualTo(Status.CANCELLED_SUPERSEDED);
         assertEquals(Arrays.asList(false, true),
                 mVibratorProviders.get(1).getExternalControlStates());
     }
@@ -2296,7 +2297,7 @@
 
         VibrationEffect repeatingEffect = VibrationEffect.createWaveform(
                 new long[]{100, 200, 300}, new int[]{128, 255, 255}, 1);
-        vibrate(service, repeatingEffect, ALARM_ATTRS);
+        HalVibration repeatingVibration = vibrate(service, repeatingEffect, ALARM_ATTRS);
 
         // VibrationThread will start this vibration async, so wait until vibration is triggered.
         assertTrue(waitUntil(s -> s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
@@ -2308,7 +2309,8 @@
         assertNotEquals(ExternalVibrationScale.ScaleLevel.SCALE_MUTE, scale.scaleLevel);
 
         // Vibration is cancelled.
-        assertTrue(waitUntil(s -> !s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
+        repeatingVibration.waitForEnd();
+        assertThat(repeatingVibration.getStatus()).isEqualTo(Status.CANCELLED_SUPERSEDED);
         assertEquals(Arrays.asList(false, true),
                 mVibratorProviders.get(1).getExternalControlStates());
     }
diff --git a/services/tests/vibrator/utils/com/android/server/vibrator/FakeVibratorControllerProvider.java b/services/tests/vibrator/utils/com/android/server/vibrator/FakeVibratorControllerProvider.java
index 946e1ea..f96177d 100644
--- a/services/tests/vibrator/utils/com/android/server/vibrator/FakeVibratorControllerProvider.java
+++ b/services/tests/vibrator/utils/com/android/server/vibrator/FakeVibratorControllerProvider.java
@@ -218,7 +218,7 @@
             }
             infoBuilder.setCompositionSizeMax(mCompositionSizeMax);
             infoBuilder.setQFactor(mQFactor);
-            infoBuilder.setFrequencyProfile(new VibratorInfo.FrequencyProfile(
+            infoBuilder.setFrequencyProfileLegacy(new VibratorInfo.FrequencyProfileLegacy(
                     mResonantFrequency, mMinFrequency, mFrequencyResolution, mMaxAmplitudes));
             infoBuilder.setMaxEnvelopeEffectSize(mMaxEnvelopeEffectSize);
             infoBuilder.setMinEnvelopeEffectControlPointDurationMillis(
diff --git a/services/tests/wmtests/Android.bp b/services/tests/wmtests/Android.bp
index 4e59fe5..ab00bfd 100644
--- a/services/tests/wmtests/Android.bp
+++ b/services/tests/wmtests/Android.bp
@@ -29,7 +29,7 @@
     tools: ["protologtool"],
     cmd: "$(location protologtool) transform-protolog-calls " +
         "--protolog-class com.android.internal.protolog.ProtoLog " +
-        "--loggroups-class com.android.internal.protolog.ProtoLogGroup " +
+        "--loggroups-class com.android.internal.protolog.WmProtoLogGroups " +
         "--loggroups-jar $(location :protolog-groups) " +
         // Used for the ProtoLogIntegrationTest, where don't test decoding or writing to file
         // so the parameters below are irrelevant.
diff --git a/services/tests/wmtests/src/com/android/server/policy/CombinationKeyTests.java b/services/tests/wmtests/src/com/android/server/policy/CombinationKeyTests.java
index 1c33116..6f9c890 100644
--- a/services/tests/wmtests/src/com/android/server/policy/CombinationKeyTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/CombinationKeyTests.java
@@ -22,6 +22,7 @@
 import static com.android.server.policy.PhoneWindowManager.POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS;
 import static com.android.server.policy.PhoneWindowManager.POWER_VOLUME_UP_BEHAVIOR_MUTE;
 
+import android.platform.test.annotations.DisableFlags;
 import android.view.ViewConfiguration;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -39,6 +40,7 @@
  */
 @MediumTest
 @RunWith(AndroidJUnit4.class)
+@DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER_MULTI_PRESS_GESTURES)
 public class CombinationKeyTests extends ShortcutKeyTestBase {
     private static final long A11Y_KEY_HOLD_MILLIS = 3500;
 
diff --git a/services/tests/wmtests/src/com/android/server/policy/KeyCombinationManagerTests.java b/services/tests/wmtests/src/com/android/server/policy/KeyCombinationManagerTests.java
index 487390d..8b5f68a 100644
--- a/services/tests/wmtests/src/com/android/server/policy/KeyCombinationManagerTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/KeyCombinationManagerTests.java
@@ -71,12 +71,12 @@
                 new KeyCombinationManager.TwoKeysCombinationRule(KEYCODE_VOLUME_DOWN,
                         KEYCODE_POWER) {
                     @Override
-                    void execute() {
+                    public void execute() {
                         mAction1Triggered.countDown();
                     }
 
                     @Override
-                    void cancel() {
+                    public void cancel() {
                     }
                 });
 
@@ -85,21 +85,21 @@
                 new KeyCombinationManager.TwoKeysCombinationRule(KEYCODE_VOLUME_DOWN,
                         KEYCODE_VOLUME_UP) {
                     @Override
-                    boolean preCondition() {
+                    public boolean preCondition() {
                         return mPreCondition;
                     }
 
                     @Override
-                    void execute() {
+                    public void execute() {
                         mAction2Triggered.countDown();
                     }
 
                     @Override
-                    void cancel() {
+                    public void cancel() {
                     }
 
                     @Override
-                    long getKeyInterceptDelayMs() {
+                    public long getKeyInterceptDelayMs() {
                         return 0;
                     }
                 });
@@ -115,12 +115,12 @@
                     };
 
                     @Override
-                    void execute() {
+                    public void execute() {
                         mHandler.postDelayed(mAction, SCHEDULE_TIME);
                     }
 
                     @Override
-                    void cancel() {
+                    public void cancel() {
                         mHandler.removeCallbacks(mAction);
                     }
                 });
@@ -235,12 +235,12 @@
                 new KeyCombinationManager.TwoKeysCombinationRule(KEYCODE_VOLUME_DOWN,
                         KEYCODE_POWER) {
                     @Override
-                    void execute() {
+                    public void execute() {
                         mAction1Triggered.countDown();
                     }
 
                     @Override
-                    void cancel() {
+                    public void cancel() {
                     }
                 };
 
diff --git a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java
index 3d978e4..cdb4542 100644
--- a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java
@@ -22,10 +22,13 @@
 import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_HOME_ALL_APPS;
 import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_HOME_ASSIST;
 import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_HOME_NOTIFICATION_PANEL;
+import static com.android.server.policy.PhoneWindowManager.POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS;
+import static com.android.server.policy.PhoneWindowManager.POWER_VOLUME_UP_BEHAVIOR_MUTE;
 import static com.android.server.policy.PhoneWindowManager.SETTINGS_KEY_BEHAVIOR_NOTIFICATION_PANEL;
 
 import android.hardware.input.KeyGestureEvent;
 import android.os.RemoteException;
+import android.platform.test.annotations.DisableFlags;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.annotations.Presubmit;
 import android.view.KeyEvent;
@@ -56,88 +59,15 @@
     private static final int CTRL_ON = MODIFIER.get(KeyEvent.KEYCODE_CTRL_LEFT);
 
     @Keep
-    private static Object[][] shortcutTestArguments() {
+    private static Object[][] shortcutTestArgumentsNotMigratedToKeyGestureController() {
         // testName, testKeys, expectedKeyGestureType, expectedKey, expectedModifierState
         return new Object[][]{
-                {"Meta + H -> Open Home", new int[]{META_KEY, KeyEvent.KEYCODE_H},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_HOME, KeyEvent.KEYCODE_H, META_ON},
-                {"Meta + Enter -> Open Home", new int[]{META_KEY, KeyEvent.KEYCODE_ENTER},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_HOME, KeyEvent.KEYCODE_ENTER,
-                        META_ON},
                 {"HOME key -> Open Home", new int[]{KeyEvent.KEYCODE_HOME},
                         KeyGestureEvent.KEY_GESTURE_TYPE_HOME,
                         KeyEvent.KEYCODE_HOME, 0},
-                {"RECENT_APPS key -> Open Overview", new int[]{KeyEvent.KEYCODE_RECENT_APPS},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS,
-                        KeyEvent.KEYCODE_RECENT_APPS, 0},
-                {"Meta + Tab -> Open Overview", new int[]{META_KEY, KeyEvent.KEYCODE_TAB},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS, KeyEvent.KEYCODE_TAB,
-                        META_ON},
-                {"Alt + Tab -> Open Overview", new int[]{ALT_KEY, KeyEvent.KEYCODE_TAB},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS, KeyEvent.KEYCODE_TAB,
-                        ALT_ON},
                 {"BACK key -> Go back", new int[]{KeyEvent.KEYCODE_BACK},
                         KeyGestureEvent.KEY_GESTURE_TYPE_BACK,
                         KeyEvent.KEYCODE_BACK, 0},
-                {"Meta + Escape -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_ESCAPE},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_BACK, KeyEvent.KEYCODE_ESCAPE,
-                        META_ON},
-                {"Meta + Left arrow -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_DPAD_LEFT},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_BACK, KeyEvent.KEYCODE_DPAD_LEFT,
-                        META_ON},
-                {"Meta + Del -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_DEL},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_BACK, KeyEvent.KEYCODE_DEL, META_ON},
-                {"APP_SWITCH key -> Open App switcher", new int[]{KeyEvent.KEYCODE_APP_SWITCH},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_APP_SWITCH,
-                        KeyEvent.KEYCODE_APP_SWITCH, 0},
-                {"ASSIST key -> Launch assistant", new int[]{KeyEvent.KEYCODE_ASSIST},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT,
-                        KeyEvent.KEYCODE_ASSIST, 0},
-                {"Meta + A -> Launch assistant", new int[]{META_KEY, KeyEvent.KEYCODE_A},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT, KeyEvent.KEYCODE_A,
-                        META_ON},
-                {"VOICE_ASSIST key -> Launch Voice Assistant",
-                        new int[]{KeyEvent.KEYCODE_VOICE_ASSIST},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT,
-                        KeyEvent.KEYCODE_VOICE_ASSIST, 0},
-                {"Meta + I -> Launch System Settings", new int[]{META_KEY, KeyEvent.KEYCODE_I},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS,
-                        KeyEvent.KEYCODE_I, META_ON},
-                {"Meta + N -> Toggle Notification panel", new int[]{META_KEY, KeyEvent.KEYCODE_N},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL,
-                        KeyEvent.KEYCODE_N, META_ON},
-                {"NOTIFICATION key -> Toggle Notification Panel",
-                        new int[]{KeyEvent.KEYCODE_NOTIFICATION},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL,
-                        KeyEvent.KEYCODE_NOTIFICATION,
-                        0},
-                {"Meta + Ctrl + S -> Take Screenshot",
-                        new int[]{META_KEY, CTRL_KEY, KeyEvent.KEYCODE_S},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_TAKE_SCREENSHOT, KeyEvent.KEYCODE_S,
-                        META_ON | CTRL_ON},
-                {"Meta + / -> Open Shortcut Helper", new int[]{META_KEY, KeyEvent.KEYCODE_SLASH},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER,
-                        KeyEvent.KEYCODE_SLASH, META_ON},
-                {"BRIGHTNESS_UP key -> Increase Brightness",
-                        new int[]{KeyEvent.KEYCODE_BRIGHTNESS_UP},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_BRIGHTNESS_UP,
-                        KeyEvent.KEYCODE_BRIGHTNESS_UP, 0},
-                {"BRIGHTNESS_DOWN key -> Decrease Brightness",
-                        new int[]{KeyEvent.KEYCODE_BRIGHTNESS_DOWN},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_BRIGHTNESS_DOWN,
-                        KeyEvent.KEYCODE_BRIGHTNESS_DOWN, 0},
-                {"KEYBOARD_BACKLIGHT_UP key -> Increase Keyboard Backlight",
-                        new int[]{KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_UP},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP,
-                        KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_UP, 0},
-                {"KEYBOARD_BACKLIGHT_DOWN key -> Decrease Keyboard Backlight",
-                        new int[]{KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_DOWN},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN,
-                        KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_DOWN, 0},
-                {"KEYBOARD_BACKLIGHT_TOGGLE key -> Toggle Keyboard Backlight",
-                        new int[]{KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_TOGGLE},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE,
-                        KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_TOGGLE, 0},
                 {"VOLUME_UP key -> Increase Volume", new int[]{KeyEvent.KEYCODE_VOLUME_UP},
                         KeyGestureEvent.KEY_GESTURE_TYPE_VOLUME_UP,
                         KeyEvent.KEYCODE_VOLUME_UP, 0},
@@ -147,53 +77,9 @@
                 {"VOLUME_MUTE key -> Mute Volume", new int[]{KeyEvent.KEYCODE_VOLUME_MUTE},
                         KeyGestureEvent.KEY_GESTURE_TYPE_VOLUME_MUTE,
                         KeyEvent.KEYCODE_VOLUME_MUTE, 0},
-                {"ALL_APPS key -> Open App Drawer",
-                        new int[]{KeyEvent.KEYCODE_ALL_APPS},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS,
-                        KeyEvent.KEYCODE_ALL_APPS, 0},
-                {"SEARCH key -> Launch Search Activity", new int[]{KeyEvent.KEYCODE_SEARCH},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SEARCH,
-                        KeyEvent.KEYCODE_SEARCH, 0},
-                {"LANGUAGE_SWITCH key -> Switch Keyboard Language",
-                        new int[]{KeyEvent.KEYCODE_LANGUAGE_SWITCH},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_LANGUAGE_SWITCH,
-                        KeyEvent.KEYCODE_LANGUAGE_SWITCH, 0},
-                {"META key -> Open App Drawer", new int[]{META_KEY},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS, META_KEY,
-                        META_ON},
-                {"Meta + Alt -> Toggle CapsLock", new int[]{META_KEY, ALT_KEY},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK, ALT_KEY,
-                        META_ON | ALT_ON},
-                {"Alt + Meta -> Toggle CapsLock", new int[]{ALT_KEY, META_KEY},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK, META_KEY,
-                        META_ON | ALT_ON},
-                {"CAPS_LOCK key -> Toggle CapsLock", new int[]{KeyEvent.KEYCODE_CAPS_LOCK},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK,
-                        KeyEvent.KEYCODE_CAPS_LOCK, 0},
                 {"MUTE key -> Mute System Microphone", new int[]{KeyEvent.KEYCODE_MUTE},
                         KeyGestureEvent.KEY_GESTURE_TYPE_SYSTEM_MUTE, KeyEvent.KEYCODE_MUTE,
                         0},
-                {"Meta + Ctrl + DPAD_UP -> Split screen navigation",
-                        new int[]{META_KEY, CTRL_KEY, KeyEvent.KEYCODE_DPAD_UP},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION,
-                        KeyEvent.KEYCODE_DPAD_UP,
-                        META_ON | CTRL_ON},
-                {"Meta + Ctrl + DPAD_LEFT -> Split screen navigation",
-                        new int[]{META_KEY, CTRL_KEY, KeyEvent.KEYCODE_DPAD_LEFT},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT,
-                        KeyEvent.KEYCODE_DPAD_LEFT,
-                        META_ON | CTRL_ON},
-                {"Meta + Ctrl + DPAD_RIGHT -> Split screen navigation",
-                        new int[]{META_KEY, CTRL_KEY, KeyEvent.KEYCODE_DPAD_RIGHT},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT,
-                        KeyEvent.KEYCODE_DPAD_RIGHT,
-                        META_ON | CTRL_ON},
-                {"Meta + L -> Lock Homescreen", new int[]{META_KEY, KeyEvent.KEYCODE_L},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_LOCK_SCREEN, KeyEvent.KEYCODE_L,
-                        META_ON},
-                {"Meta + Ctrl + N -> Open Notes", new int[]{META_KEY, CTRL_KEY, KeyEvent.KEYCODE_N},
-                        KeyGestureEvent.KEY_GESTURE_TYPE_OPEN_NOTES, KeyEvent.KEYCODE_N,
-                        META_ON | CTRL_ON},
                 {"POWER key -> Toggle Power", new int[]{KeyEvent.KEYCODE_POWER},
                         KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_POWER, KeyEvent.KEYCODE_POWER,
                         0},
@@ -279,7 +165,130 @@
                 {"Meta + S -> Launch Default Messaging App",
                         new int[]{META_KEY, KeyEvent.KEYCODE_S},
                         KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MESSAGING,
-                        KeyEvent.KEYCODE_S, META_ON},
+                        KeyEvent.KEYCODE_S, META_ON}};
+    }
+
+    @Keep
+    private static Object[][] shortcutTestArgumentsMigratedToKeyGestureController() {
+        // testName, testKeys, expectedKeyGestureType, expectedKey, expectedModifierState
+        return new Object[][]{
+                {"Meta + H -> Open Home", new int[]{META_KEY, KeyEvent.KEYCODE_H},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_HOME, KeyEvent.KEYCODE_H, META_ON},
+                {"Meta + Enter -> Open Home", new int[]{META_KEY, KeyEvent.KEYCODE_ENTER},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_HOME, KeyEvent.KEYCODE_ENTER,
+                        META_ON},
+                {"RECENT_APPS key -> Open Overview", new int[]{KeyEvent.KEYCODE_RECENT_APPS},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS,
+                        KeyEvent.KEYCODE_RECENT_APPS, 0},
+                {"Meta + Tab -> Open Overview", new int[]{META_KEY, KeyEvent.KEYCODE_TAB},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS, KeyEvent.KEYCODE_TAB,
+                        META_ON},
+                {"Alt + Tab -> Open Overview", new int[]{ALT_KEY, KeyEvent.KEYCODE_TAB},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS, KeyEvent.KEYCODE_TAB,
+                        ALT_ON},
+                {"Meta + Escape -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_ESCAPE},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_BACK, KeyEvent.KEYCODE_ESCAPE,
+                        META_ON},
+                {"Meta + Left arrow -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_DPAD_LEFT},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_BACK, KeyEvent.KEYCODE_DPAD_LEFT,
+                        META_ON},
+                {"Meta + Del -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_DEL},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_BACK, KeyEvent.KEYCODE_DEL, META_ON},
+                {"APP_SWITCH key -> Open App switcher", new int[]{KeyEvent.KEYCODE_APP_SWITCH},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_APP_SWITCH,
+                        KeyEvent.KEYCODE_APP_SWITCH, 0},
+                {"ASSIST key -> Launch assistant", new int[]{KeyEvent.KEYCODE_ASSIST},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT,
+                        KeyEvent.KEYCODE_ASSIST, 0},
+                {"Meta + A -> Launch assistant", new int[]{META_KEY, KeyEvent.KEYCODE_A},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT, KeyEvent.KEYCODE_A,
+                        META_ON},
+                {"VOICE_ASSIST key -> Launch Voice Assistant",
+                        new int[]{KeyEvent.KEYCODE_VOICE_ASSIST},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT,
+                        KeyEvent.KEYCODE_VOICE_ASSIST, 0},
+                {"Meta + I -> Launch System Settings", new int[]{META_KEY, KeyEvent.KEYCODE_I},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS,
+                        KeyEvent.KEYCODE_I, META_ON},
+                {"Meta + N -> Toggle Notification panel", new int[]{META_KEY, KeyEvent.KEYCODE_N},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL,
+                        KeyEvent.KEYCODE_N, META_ON},
+                {"NOTIFICATION key -> Toggle Notification Panel",
+                        new int[]{KeyEvent.KEYCODE_NOTIFICATION},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL,
+                        KeyEvent.KEYCODE_NOTIFICATION,
+                        0},
+                {"Meta + Ctrl + S -> Take Screenshot",
+                        new int[]{META_KEY, CTRL_KEY, KeyEvent.KEYCODE_S},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_TAKE_SCREENSHOT, KeyEvent.KEYCODE_S,
+                        META_ON | CTRL_ON},
+                {"Meta + / -> Open Shortcut Helper", new int[]{META_KEY, KeyEvent.KEYCODE_SLASH},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER,
+                        KeyEvent.KEYCODE_SLASH, META_ON},
+                {"BRIGHTNESS_UP key -> Increase Brightness",
+                        new int[]{KeyEvent.KEYCODE_BRIGHTNESS_UP},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_BRIGHTNESS_UP,
+                        KeyEvent.KEYCODE_BRIGHTNESS_UP, 0},
+                {"BRIGHTNESS_DOWN key -> Decrease Brightness",
+                        new int[]{KeyEvent.KEYCODE_BRIGHTNESS_DOWN},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_BRIGHTNESS_DOWN,
+                        KeyEvent.KEYCODE_BRIGHTNESS_DOWN, 0},
+                {"KEYBOARD_BACKLIGHT_UP key -> Increase Keyboard Backlight",
+                        new int[]{KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_UP},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP,
+                        KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_UP, 0},
+                {"KEYBOARD_BACKLIGHT_DOWN key -> Decrease Keyboard Backlight",
+                        new int[]{KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_DOWN},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN,
+                        KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_DOWN, 0},
+                {"KEYBOARD_BACKLIGHT_TOGGLE key -> Toggle Keyboard Backlight",
+                        new int[]{KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_TOGGLE},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE,
+                        KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_TOGGLE, 0},
+                {"ALL_APPS key -> Open App Drawer",
+                        new int[]{KeyEvent.KEYCODE_ALL_APPS},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS,
+                        KeyEvent.KEYCODE_ALL_APPS, 0},
+                {"SEARCH key -> Launch Search Activity", new int[]{KeyEvent.KEYCODE_SEARCH},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SEARCH,
+                        KeyEvent.KEYCODE_SEARCH, 0},
+                {"LANGUAGE_SWITCH key -> Switch Keyboard Language",
+                        new int[]{KeyEvent.KEYCODE_LANGUAGE_SWITCH},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_LANGUAGE_SWITCH,
+                        KeyEvent.KEYCODE_LANGUAGE_SWITCH, 0},
+                {"META key -> Open App Drawer", new int[]{META_KEY},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS, META_KEY,
+                        META_ON},
+                {"Meta + Alt -> Toggle CapsLock", new int[]{META_KEY, ALT_KEY},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK, ALT_KEY,
+                        META_ON | ALT_ON},
+                {"Alt + Meta -> Toggle CapsLock", new int[]{ALT_KEY, META_KEY},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK, META_KEY,
+                        META_ON | ALT_ON},
+                {"CAPS_LOCK key -> Toggle CapsLock", new int[]{KeyEvent.KEYCODE_CAPS_LOCK},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK,
+                        KeyEvent.KEYCODE_CAPS_LOCK, 0},
+                {"Meta + Ctrl + DPAD_UP -> Split screen navigation",
+                        new int[]{META_KEY, CTRL_KEY, KeyEvent.KEYCODE_DPAD_UP},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION,
+                        KeyEvent.KEYCODE_DPAD_UP,
+                        META_ON | CTRL_ON},
+                {"Meta + Ctrl + DPAD_LEFT -> Split screen navigation",
+                        new int[]{META_KEY, CTRL_KEY, KeyEvent.KEYCODE_DPAD_LEFT},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT,
+                        KeyEvent.KEYCODE_DPAD_LEFT,
+                        META_ON | CTRL_ON},
+                {"Meta + Ctrl + DPAD_RIGHT -> Split screen navigation",
+                        new int[]{META_KEY, CTRL_KEY, KeyEvent.KEYCODE_DPAD_RIGHT},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT,
+                        KeyEvent.KEYCODE_DPAD_RIGHT,
+                        META_ON | CTRL_ON},
+                {"Meta + L -> Lock Homescreen", new int[]{META_KEY, KeyEvent.KEYCODE_L},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_LOCK_SCREEN, KeyEvent.KEYCODE_L,
+                        META_ON},
+                {"Meta + Ctrl + N -> Open Notes", new int[]{META_KEY, CTRL_KEY, KeyEvent.KEYCODE_N},
+                        KeyGestureEvent.KEY_GESTURE_TYPE_OPEN_NOTES, KeyEvent.KEYCODE_N,
+                        META_ON | CTRL_ON},
                 {"Meta + Ctrl + DPAD_DOWN -> Enter desktop mode",
                         new int[]{META_KEY, CTRL_KEY, KeyEvent.KEYCODE_DPAD_DOWN},
                         KeyGestureEvent.KEY_GESTURE_TYPE_DESKTOP_MODE,
@@ -296,72 +305,14 @@
                         new int[]{KeyEvent.KEYCODE_HOME}, LONG_PRESS_HOME_NOTIFICATION_PANEL,
                         KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL,
                         KeyEvent.KEYCODE_HOME, 0},
-                {"Long press META + ENTER -> Toggle Notification panel",
-                        new int[]{META_KEY, KeyEvent.KEYCODE_ENTER},
-                        LONG_PRESS_HOME_NOTIFICATION_PANEL,
-                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL,
-                        KeyEvent.KEYCODE_ENTER,
-                        META_ON},
-                {"Long press META + H -> Toggle Notification panel",
-                        new int[]{META_KEY, KeyEvent.KEYCODE_H}, LONG_PRESS_HOME_NOTIFICATION_PANEL,
-                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL,
-                        KeyEvent.KEYCODE_H, META_ON},
                 {"Long press HOME key -> Launch assistant",
                         new int[]{KeyEvent.KEYCODE_HOME}, LONG_PRESS_HOME_ASSIST,
                         KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT,
                         KeyEvent.KEYCODE_HOME, 0},
-                {"Long press META + ENTER -> Launch assistant",
-                        new int[]{META_KEY, KeyEvent.KEYCODE_ENTER}, LONG_PRESS_HOME_ASSIST,
-                        KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT,
-                        KeyEvent.KEYCODE_ENTER, META_ON},
-                {"Long press META + H -> Launch assistant",
-                        new int[]{META_KEY, KeyEvent.KEYCODE_H}, LONG_PRESS_HOME_ASSIST,
-                        KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT, KeyEvent.KEYCODE_H,
-                        META_ON},
                 {"Long press HOME key -> Open App Drawer",
                         new int[]{KeyEvent.KEYCODE_HOME}, LONG_PRESS_HOME_ALL_APPS,
                         KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS,
-                        KeyEvent.KEYCODE_HOME, 0},
-                {"Long press META + ENTER -> Open App Drawer",
-                        new int[]{META_KEY, KeyEvent.KEYCODE_ENTER}, LONG_PRESS_HOME_ALL_APPS,
-                        KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS,
-                        KeyEvent.KEYCODE_ENTER, META_ON},
-                {"Long press META + H -> Open App Drawer",
-                        new int[]{META_KEY, KeyEvent.KEYCODE_H},
-                        LONG_PRESS_HOME_ALL_APPS,
-                        KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS,
-                        KeyEvent.KEYCODE_H, META_ON}};
-    }
-
-    @Keep
-    private static Object[][] doubleTapOnHomeTestArguments() {
-        // testName, testKeys, doubleTapOnHomeBehavior, expectedKeyGestureType, expectedKey,
-        // expectedModifierState
-        return new Object[][]{
-                {"Double tap HOME -> Open App switcher",
-                        new int[]{KeyEvent.KEYCODE_HOME}, DOUBLE_TAP_HOME_RECENT_SYSTEM_UI,
-                        KeyGestureEvent.KEY_GESTURE_TYPE_APP_SWITCH, KeyEvent.KEYCODE_HOME,
-                        0},
-                {"Double tap META + ENTER -> Open App switcher",
-                        new int[]{META_KEY, KeyEvent.KEYCODE_ENTER},
-                        DOUBLE_TAP_HOME_RECENT_SYSTEM_UI,
-                        KeyGestureEvent.KEY_GESTURE_TYPE_APP_SWITCH,
-                        KeyEvent.KEYCODE_ENTER, META_ON},
-                {"Double tap META + H -> Open App switcher",
-                        new int[]{META_KEY, KeyEvent.KEYCODE_H}, DOUBLE_TAP_HOME_RECENT_SYSTEM_UI,
-                        KeyGestureEvent.KEY_GESTURE_TYPE_APP_SWITCH, KeyEvent.KEYCODE_H,
-                        META_ON}};
-    }
-
-    @Keep
-    private static Object[][] settingsKeyTestArguments() {
-        // testName, testKeys, settingsKeyBehavior, expectedKeyGestureType, expectedKey,
-        // expectedModifierState
-        return new Object[][]{
-                {"SETTINGS key -> Toggle Notification panel", new int[]{KeyEvent.KEYCODE_SETTINGS},
-                        SETTINGS_KEY_BEHAVIOR_NOTIFICATION_PANEL,
-                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL,
-                        KeyEvent.KEYCODE_SETTINGS, 0}};
+                        KeyEvent.KEYCODE_HOME, 0}};
     }
 
     @Before
@@ -381,8 +332,18 @@
     }
 
     @Test
-    @Parameters(method = "shortcutTestArguments")
-    public void testShortcut(String testName, int[] testKeys,
+    @Parameters(method = "shortcutTestArgumentsNotMigratedToKeyGestureController")
+    public void testShortcuts_notMigratedToKeyGestureController(String testName,
+            int[] testKeys, @KeyGestureEvent.KeyGestureType int expectedKeyGestureType,
+            int expectedKey, int expectedModifierState) {
+        testShortcutInternal(testName, testKeys, expectedKeyGestureType, expectedKey,
+                expectedModifierState);
+    }
+
+    @Test
+    @Parameters(method = "shortcutTestArgumentsMigratedToKeyGestureController")
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
+    public void testShortcuts_migratedToKeyGestureController(String testName, int[] testKeys,
             @KeyGestureEvent.KeyGestureType int expectedKeyGestureType, int expectedKey,
             int expectedModifierState) {
         testShortcutInternal(testName, testKeys, expectedKeyGestureType, expectedKey,
@@ -402,31 +363,29 @@
     }
 
     @Test
-    @Parameters(method = "doubleTapOnHomeTestArguments")
-    public void testDoubleTapOnHomeBehavior(String testName, int[] testKeys,
-            int doubleTapOnHomeBehavior,
-            @KeyGestureEvent.KeyGestureType int expectedKeyGestureType, int expectedKey,
-            int expectedModifierState) {
-        mPhoneWindowManager.overriderDoubleTapOnHomeBehavior(doubleTapOnHomeBehavior);
-        sendKeyCombination(testKeys, 0 /* duration */);
-        sendKeyCombination(testKeys, 0 /* duration */);
+    public void testDoubleTapOnHomeBehavior_AppSwitchBehavior() {
+        mPhoneWindowManager.overriderDoubleTapOnHomeBehavior(DOUBLE_TAP_HOME_RECENT_SYSTEM_UI);
+        sendKeyCombination(new int[]{KeyEvent.KEYCODE_HOME}, 0 /* duration */);
+        sendKeyCombination(new int[]{KeyEvent.KEYCODE_HOME}, 0 /* duration */);
         mPhoneWindowManager.assertKeyGestureCompleted(
-                new int[]{expectedKey}, expectedModifierState, expectedKeyGestureType,
-                "Failed while executing " + testName);
+                new int[]{KeyEvent.KEYCODE_HOME}, /* modifierState = */0,
+                KeyGestureEvent.KEY_GESTURE_TYPE_APP_SWITCH,
+                "Failed while executing Double tap HOME -> Open App switcher");
     }
 
     @Test
-    @Parameters(method = "settingsKeyTestArguments")
-    public void testSettingsKey(String testName, int[] testKeys, int settingsKeyBehavior,
-            @KeyGestureEvent.KeyGestureType int expectedKeyGestureType, int expectedKey,
-            int expectedModifierState) {
-        mPhoneWindowManager.overrideSettingsKeyBehavior(settingsKeyBehavior);
-        testShortcutInternal(testName, testKeys, expectedKeyGestureType, expectedKey,
-                expectedModifierState);
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
+    public void testSettingsKey_ToggleNotificationBehavior() {
+        mPhoneWindowManager.overrideSettingsKeyBehavior(SETTINGS_KEY_BEHAVIOR_NOTIFICATION_PANEL);
+        testShortcutInternal("SETTINGS key -> Toggle Notification panel",
+                new int[]{KeyEvent.KEYCODE_SETTINGS},
+                KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL,
+                KeyEvent.KEYCODE_SETTINGS, 0);
     }
 
     @Test
     @EnableFlags(com.android.server.flags.Flags.FLAG_NEW_BUGREPORT_KEYBOARD_SHORTCUT)
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testBugreportShortcutPress() {
         testShortcutInternal("Meta + Ctrl + Del -> Trigger bug report",
                 new int[]{META_KEY, CTRL_KEY, KeyEvent.KEYCODE_DEL},
@@ -599,4 +558,145 @@
                 sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SEARCH));
         mPhoneWindowManager.assertLaunchSearch();
     }
+
+    @Test
+    public void testKeyGestureScreenshotChord() {
+        Assert.assertTrue(
+                sendKeyGestureEventStart(KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD));
+        mPhoneWindowManager.moveTimeForward(500);
+        Assert.assertTrue(
+                sendKeyGestureEventCancel(KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD));
+        mPhoneWindowManager.assertTakeScreenshotCalled();
+    }
+
+    @Test
+    public void testKeyGestureScreenshotChordCancelled() {
+        Assert.assertTrue(
+                sendKeyGestureEventStart(KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD));
+        Assert.assertTrue(
+                sendKeyGestureEventCancel(KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD));
+        mPhoneWindowManager.assertTakeScreenshotNotCalled();
+    }
+
+    @Test
+    public void testKeyGestureAccessibilityShortcutChord() {
+        Assert.assertTrue(
+                sendKeyGestureEventStart(
+                        KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD));
+        mPhoneWindowManager.moveTimeForward(5000);
+        Assert.assertTrue(
+                sendKeyGestureEventCancel(
+                        KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD));
+        mPhoneWindowManager.assertAccessibilityKeychordCalled();
+    }
+
+    @Test
+    public void testKeyGestureAccessibilityShortcutChordCancelled() {
+        Assert.assertTrue(
+                sendKeyGestureEventStart(
+                        KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD));
+        Assert.assertTrue(
+                sendKeyGestureEventCancel(
+                        KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD));
+        mPhoneWindowManager.assertAccessibilityKeychordNotCalled();
+    }
+
+    @Test
+    public void testKeyGestureRingerToggleChord() {
+        mPhoneWindowManager.overridePowerVolumeUp(POWER_VOLUME_UP_BEHAVIOR_MUTE);
+        Assert.assertTrue(
+                sendKeyGestureEventStart(KeyGestureEvent.KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD));
+        mPhoneWindowManager.moveTimeForward(500);
+        Assert.assertTrue(
+                sendKeyGestureEventCancel(KeyGestureEvent.KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD));
+        mPhoneWindowManager.assertVolumeMute();
+    }
+
+    @Test
+    public void testKeyGestureRingerToggleChordCancelled() {
+        mPhoneWindowManager.overridePowerVolumeUp(POWER_VOLUME_UP_BEHAVIOR_MUTE);
+        Assert.assertTrue(
+                sendKeyGestureEventStart(KeyGestureEvent.KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD));
+        Assert.assertTrue(
+                sendKeyGestureEventCancel(KeyGestureEvent.KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD));
+        mPhoneWindowManager.assertVolumeNotMuted();
+    }
+
+    @Test
+    public void testKeyGestureGlobalAction() {
+        mPhoneWindowManager.overridePowerVolumeUp(POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS);
+        Assert.assertTrue(
+                sendKeyGestureEventStart(KeyGestureEvent.KEY_GESTURE_TYPE_GLOBAL_ACTIONS));
+        mPhoneWindowManager.moveTimeForward(500);
+        Assert.assertTrue(
+                sendKeyGestureEventCancel(KeyGestureEvent.KEY_GESTURE_TYPE_GLOBAL_ACTIONS));
+        mPhoneWindowManager.assertShowGlobalActionsCalled();
+    }
+
+    @Test
+    public void testKeyGestureGlobalActionCancelled() {
+        mPhoneWindowManager.overridePowerVolumeUp(POWER_VOLUME_UP_BEHAVIOR_GLOBAL_ACTIONS);
+        Assert.assertTrue(
+                sendKeyGestureEventStart(KeyGestureEvent.KEY_GESTURE_TYPE_GLOBAL_ACTIONS));
+        Assert.assertTrue(
+                sendKeyGestureEventCancel(KeyGestureEvent.KEY_GESTURE_TYPE_GLOBAL_ACTIONS));
+        mPhoneWindowManager.assertShowGlobalActionsNotCalled();
+    }
+
+    @Test
+    public void testKeyGestureAccessibilityTvShortcutChord() {
+        Assert.assertTrue(
+                sendKeyGestureEventStart(
+                        KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD));
+        mPhoneWindowManager.moveTimeForward(5000);
+        Assert.assertTrue(
+                sendKeyGestureEventCancel(
+                        KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD));
+        mPhoneWindowManager.assertAccessibilityKeychordCalled();
+    }
+
+    @Test
+    public void testKeyGestureAccessibilityTvShortcutChordCancelled() {
+        Assert.assertTrue(
+                sendKeyGestureEventStart(
+                        KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD));
+        Assert.assertTrue(
+                sendKeyGestureEventCancel(
+                        KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD));
+        mPhoneWindowManager.assertAccessibilityKeychordNotCalled();
+    }
+
+    @Test
+    public void testKeyGestureTvTriggerBugReport() {
+        Assert.assertTrue(
+                sendKeyGestureEventStart(KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT));
+        mPhoneWindowManager.moveTimeForward(1000);
+        Assert.assertTrue(
+                sendKeyGestureEventCancel(KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT));
+        mPhoneWindowManager.assertBugReportTakenForTv();
+    }
+
+    @Test
+    public void testKeyGestureTvTriggerBugReportCancelled() {
+        Assert.assertTrue(
+                sendKeyGestureEventStart(KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT));
+        Assert.assertTrue(
+                sendKeyGestureEventCancel(KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT));
+        mPhoneWindowManager.assertBugReportNotTakenForTv();
+    }
+
+    @Test
+    public void testKeyGestureAccessibilityShortcut() {
+        Assert.assertTrue(
+                sendKeyGestureEventComplete(
+                        KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT));
+        mPhoneWindowManager.assertAccessibilityKeychordCalled();
+    }
+
+    @Test
+    public void testKeyGestureCloseAllDialogs() {
+        Assert.assertTrue(
+                sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS));
+        mPhoneWindowManager.assertCloseAllDialogs();
+    }
 }
diff --git a/services/tests/wmtests/src/com/android/server/policy/ModifierShortcutTests.java b/services/tests/wmtests/src/com/android/server/policy/ModifierShortcutTests.java
index 43171f8..c186a03 100644
--- a/services/tests/wmtests/src/com/android/server/policy/ModifierShortcutTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/ModifierShortcutTests.java
@@ -119,6 +119,7 @@
      * ALT + TAB to show recent apps.
      */
     @Test
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testAltTab() {
         mPhoneWindowManager.overrideStatusBarManagerInternal();
         sendKeyCombination(new int[]{KEYCODE_ALT_LEFT, KEYCODE_TAB}, 0);
@@ -129,6 +130,7 @@
      * CTRL + SPACE to switch keyboard layout.
      */
     @Test
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testCtrlSpace() {
         sendKeyCombination(new int[]{KEYCODE_CTRL_LEFT, KEYCODE_SPACE}, /* duration= */ 0,
                 ANY_DISPLAY_ID);
@@ -139,6 +141,7 @@
      * CTRL + SHIFT + SPACE to switch keyboard layout backwards.
      */
     @Test
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testCtrlShiftSpace() {
         sendKeyCombination(new int[]{KEYCODE_CTRL_LEFT, KEYCODE_SHIFT_LEFT, KEYCODE_SPACE},
                 /* duration= */ 0, ANY_DISPLAY_ID);
@@ -149,6 +152,7 @@
      * CTRL + ALT + Z to enable accessibility service.
      */
     @Test
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testCtrlAltZ() {
         sendKeyCombination(new int[]{KEYCODE_CTRL_LEFT, KEYCODE_ALT_LEFT, KEYCODE_Z}, 0);
         mPhoneWindowManager.assertAccessibilityKeychordCalled();
@@ -158,6 +162,7 @@
      * META + CTRL+ S to take screenshot.
      */
     @Test
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testMetaCtrlS() {
         sendKeyCombination(new int[]{KEYCODE_META_LEFT, KEYCODE_CTRL_LEFT, KEYCODE_S}, 0);
         mPhoneWindowManager.assertTakeScreenshotCalled();
@@ -167,6 +172,7 @@
      * META + N to expand notification panel.
      */
     @Test
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testMetaN() throws RemoteException {
         mPhoneWindowManager.overrideTogglePanel();
         sendKeyCombination(new int[]{KEYCODE_META_LEFT, KEYCODE_N}, 0);
@@ -177,6 +183,7 @@
      * META + SLASH to toggle shortcuts menu.
      */
     @Test
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testMetaSlash() {
         mPhoneWindowManager.overrideStatusBarManagerInternal();
         sendKeyCombination(new int[]{KEYCODE_META_LEFT, KEYCODE_SLASH}, 0);
@@ -187,6 +194,7 @@
      * META  + ALT to toggle Cap Lock.
      */
     @Test
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testMetaAlt() {
         sendKeyCombination(new int[]{KEYCODE_META_LEFT, KEYCODE_ALT_LEFT}, 0);
         mPhoneWindowManager.assertToggleCapsLock();
@@ -196,6 +204,7 @@
      * META + H to go to homescreen
      */
     @Test
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testMetaH() {
         mPhoneWindowManager.overrideLaunchHome();
         sendKeyCombination(new int[]{KEYCODE_META_LEFT, KEYCODE_H}, 0);
@@ -206,6 +215,7 @@
      * META + ENTER to go to homescreen
      */
     @Test
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testMetaEnter() {
         mPhoneWindowManager.overrideLaunchHome();
         sendKeyCombination(new int[]{KEYCODE_META_LEFT, KEYCODE_ENTER}, 0);
@@ -216,6 +226,7 @@
      * Sends a KEYCODE_BRIGHTNESS_DOWN event and validates the brightness is decreased as expected;
      */
     @Test
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testKeyCodeBrightnessDown() {
         float[] currentBrightness = new float[]{0.1f, 0.05f, 0.0f};
         float[] newBrightness = new float[]{0.065738f, 0.0275134f, 0.0f};
@@ -231,9 +242,9 @@
      * Sends a KEYCODE_SCREENSHOT and validates screenshot is taken if flag is enabled
      */
     @Test
+    @EnableFlags(com.android.hardware.input.Flags.FLAG_EMOJI_AND_SCREENSHOT_KEYCODES_AVAILABLE)
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testTakeScreenshot_flagEnabled() {
-        mSetFlagsRule.enableFlags(com.android.hardware.input.Flags
-                .FLAG_EMOJI_AND_SCREENSHOT_KEYCODES_AVAILABLE);
         sendKeyCombination(new int[]{KEYCODE_SCREENSHOT}, 0);
         mPhoneWindowManager.assertTakeScreenshotCalled();
     }
@@ -242,9 +253,9 @@
      * Sends a KEYCODE_SCREENSHOT and validates screenshot is not taken if flag is disabled
      */
     @Test
+    @DisableFlags({com.android.hardware.input.Flags.FLAG_EMOJI_AND_SCREENSHOT_KEYCODES_AVAILABLE,
+            com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER})
     public void testTakeScreenshot_flagDisabled() {
-        mSetFlagsRule.disableFlags(com.android.hardware.input.Flags
-                .FLAG_EMOJI_AND_SCREENSHOT_KEYCODES_AVAILABLE);
         sendKeyCombination(new int[]{KEYCODE_SCREENSHOT}, 0);
         mPhoneWindowManager.assertTakeScreenshotNotCalled();
     }
@@ -254,6 +265,7 @@
      */
     @Test
     @EnableFlags(com.android.server.flags.Flags.FLAG_NEW_BUGREPORT_KEYBOARD_SHORTCUT)
+    @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testTakeBugReport_flagEnabled() throws RemoteException {
         sendKeyCombination(new int[]{KEYCODE_META_LEFT, KEYCODE_CTRL_LEFT, KEYCODE_DEL}, 0);
         mPhoneWindowManager.assertTakeBugreport(true);
@@ -263,7 +275,8 @@
      * META+CTRL+BACKSPACE for taking a bugreport does nothing when the flag is disabledd.
      */
     @Test
-    @DisableFlags(com.android.server.flags.Flags.FLAG_NEW_BUGREPORT_KEYBOARD_SHORTCUT)
+    @DisableFlags({com.android.server.flags.Flags.FLAG_NEW_BUGREPORT_KEYBOARD_SHORTCUT,
+            com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER})
     public void testTakeBugReport_flagDisabled() throws RemoteException {
         sendKeyCombination(new int[]{KEYCODE_META_LEFT, KEYCODE_CTRL_LEFT, KEYCODE_DEL}, 0);
         mPhoneWindowManager.assertTakeBugreport(false);
diff --git a/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java b/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java
index 50b7db4..9e47a00 100644
--- a/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java
+++ b/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java
@@ -241,6 +241,13 @@
                         KeyGestureEvent.ACTION_GESTURE_COMPLETE).build());
     }
 
+    boolean sendKeyGestureEventCancel(int gestureType) {
+        return mPhoneWindowManager.sendKeyGestureEvent(
+                new KeyGestureEvent.Builder().setKeyGestureType(gestureType).setAction(
+                        KeyGestureEvent.ACTION_GESTURE_COMPLETE).setFlags(
+                        KeyGestureEvent.FLAG_CANCELLED).build());
+    }
+
     boolean sendKeyGestureEventComplete(int gestureType, int modifierState) {
         return mPhoneWindowManager.sendKeyGestureEvent(
                 new KeyGestureEvent.Builder().setModifierState(modifierState).setKeyGestureType(
@@ -276,7 +283,7 @@
         if ((actions & ACTION_PASS_TO_USER) != 0) {
             if (0 == mPhoneWindowManager.interceptKeyBeforeDispatching(keyEvent)) {
                 if (!mDispatchedKeyHandler.onKeyDispatched(keyEvent)) {
-                    mPhoneWindowManager.dispatchUnhandledKey(keyEvent);
+                    mPhoneWindowManager.interceptUnhandledKey(keyEvent);
                 }
             }
         }
diff --git a/services/tests/wmtests/src/com/android/server/policy/StemKeyGestureTests.java b/services/tests/wmtests/src/com/android/server/policy/StemKeyGestureTests.java
index 9b92ff4..3ea3235 100644
--- a/services/tests/wmtests/src/com/android/server/policy/StemKeyGestureTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/StemKeyGestureTests.java
@@ -23,6 +23,7 @@
 import static android.view.KeyEvent.KEYCODE_STEM_PRIMARY;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static com.android.server.policy.PhoneWindowManager.DOUBLE_PRESS_PRIMARY_LAUNCH_DEFAULT_FITNESS_APP;
 import static com.android.server.policy.PhoneWindowManager.DOUBLE_PRESS_PRIMARY_SWITCH_RECENT_APP;
 import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_PRIMARY_LAUNCH_VOICE_ASSISTANT;
 import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_PRIMARY_LAUNCH_ALL_APPS;
@@ -32,6 +33,7 @@
 import android.app.ActivityManager.RecentTaskInfo;
 import android.app.ActivityTaskManager.RootTaskInfo;
 import android.content.ComponentName;
+import android.hardware.input.KeyGestureEvent;
 import android.os.RemoteException;
 import android.provider.Settings;
 import android.view.Display;
@@ -236,6 +238,19 @@
     }
 
     @Test
+    public void stemDoubleKey_behaviorIsLaunchFitness_gestureEventFired() {
+        overrideBehavior(
+                STEM_PRIMARY_BUTTON_DOUBLE_PRESS, DOUBLE_PRESS_PRIMARY_LAUNCH_DEFAULT_FITNESS_APP);
+        setUpPhoneWindowManager(/* supportSettingsUpdate= */ true);
+
+        sendKey(KEYCODE_STEM_PRIMARY);
+        sendKey(KEYCODE_STEM_PRIMARY);
+
+        mPhoneWindowManager.assertKeyGestureEventSentToKeyGestureController(
+                KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FITNESS);
+    }
+
+    @Test
     public void stemTripleKey_EarlyShortPress_AllAppsThenBackToOriginalThenToggleA11y()
             throws RemoteException {
         overrideBehavior(STEM_PRIMARY_BUTTON_SHORT_PRESS, SHORT_PRESS_PRIMARY_LAUNCH_ALL_APPS);
diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
index 98401b3..a85f866 100644
--- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
+++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
@@ -418,8 +418,8 @@
                 mKeyEventPolicyFlags);
     }
 
-    void dispatchUnhandledKey(KeyEvent event) {
-        mPhoneWindowManager.dispatchUnhandledKey(mInputToken, event, FLAG_INTERACTIVE);
+    void interceptUnhandledKey(KeyEvent event) {
+        mPhoneWindowManager.interceptUnhandledKey(event, mInputToken);
     }
 
     boolean sendKeyGestureEvent(KeyGestureEvent event) {
@@ -657,16 +657,36 @@
         verify(mPowerManager).userActivity(anyLong(), anyBoolean());
     }
 
+    void assertShowGlobalActionsNotCalled() {
+        mTestLooper.dispatchAll();
+        verify(mGlobalActions, never()).showDialog(anyBoolean(), anyBoolean());
+        verify(mPowerManager, never()).userActivity(anyLong(), anyBoolean());
+    }
+
     void assertVolumeMute() {
         mTestLooper.dispatchAll();
         verify(mAudioManagerInternal).silenceRingerModeInternal(eq("volume_hush"));
     }
 
+    void assertVolumeNotMuted() {
+        mTestLooper.dispatchAll();
+        verify(mAudioManagerInternal, never()).silenceRingerModeInternal(any());
+    }
+
     void assertAccessibilityKeychordCalled() {
         mTestLooper.dispatchAll();
         verify(mAccessibilityShortcutController).performAccessibilityShortcut();
     }
 
+    void assertAccessibilityKeychordNotCalled() {
+        mTestLooper.dispatchAll();
+        verify(mAccessibilityShortcutController, never()).performAccessibilityShortcut();
+    }
+
+    void assertCloseAllDialogs() {
+        verify(mContext).closeSystemDialogs();
+    }
+
     void assertDreamRequest() {
         mTestLooper.dispatchAll();
         verify(mDreamManagerInternal).requestDream();
@@ -809,6 +829,16 @@
 
     }
 
+    void assertBugReportTakenForTv() {
+        mTestLooper.dispatchAll();
+        verify(mPhoneWindowManager).requestBugreportForTv();
+    }
+
+    void assertBugReportNotTakenForTv() {
+        mTestLooper.dispatchAll();
+        verify(mPhoneWindowManager, never()).requestBugreportForTv();
+    }
+
     void assertTogglePanel() throws RemoteException {
         mTestLooper.dispatchAll();
         verify(mPhoneWindowManager.mStatusBarService).togglePanel();
@@ -889,4 +919,9 @@
         mTestLooper.dispatchAll();
         Assert.assertEquals(expectEnabled, mIsTalkBackEnabled);
     }
+
+    void assertKeyGestureEventSentToKeyGestureController(int gestureType) {
+        verify(mInputManagerInternal)
+                .handleKeyGestureInKeyGestureController(anyInt(), any(), anyInt(), eq(gestureType));
+    }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityOptionsTest.java b/services/tests/wmtests/src/com/android/server/wm/ActivityOptionsTest.java
index 5787780..4cd75d5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityOptionsTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityOptionsTest.java
@@ -308,6 +308,8 @@
                     // KEY_PENDING_INTENT_CREATOR_BACKGROUND_ACTIVITY_START_MODE
                 case "android.activity.launchCookie": // KEY_LAUNCH_COOKIE
                 case "android:activity.animAbortListener": // KEY_ANIM_ABORT_LISTENER
+                case "android.activity.allowPassThroughOnTouchOutside":
+                    // KEY_ALLOW_PASS_THROUGH_ON_TOUCH_OUTSIDE
                     // Existing keys
 
                     break;
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java
index 8227ed9..c8a3559 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java
@@ -179,14 +179,23 @@
                 .getAppCompatAspectRatioPolicy()).isLetterboxedForFixedOrientationAndAspectRatio();
     }
 
-    void enableTreatmentForTopActivity(boolean enabled) {
-        doReturn(enabled).when(mDisplayContent.mAppCompatCameraPolicy)
-                .isTreatmentEnabledForActivity(eq(mActivityStack.top()));
+    void enableFullscreenCameraCompatTreatmentForTopActivity(boolean enabled) {
+        if (mDisplayContent.mAppCompatCameraPolicy.hasDisplayRotationCompatPolicy()) {
+            doReturn(enabled).when(
+                    mDisplayContent.mAppCompatCameraPolicy.mDisplayRotationCompatPolicy)
+                        .isTreatmentEnabledForActivity(eq(mActivityStack.top()));
+        }
     }
 
-    void setTopActivityCameraActive(boolean enabled) {
+    void setIsCameraRunningAndWindowingModeEligibleFullscreen(boolean enabled) {
         doReturn(enabled).when(getTopDisplayRotationCompatPolicy())
-                .isCameraActive(eq(mActivityStack.top()), /* mustBeFullscreen= */ eq(true));
+                .isCameraRunningAndWindowingModeEligible(eq(mActivityStack.top()),
+                        /* mustBeFullscreen= */ eq(true));
+    }
+
+    void setIsCameraRunningAndWindowingModeEligibleFreeform(boolean enabled) {
+        doReturn(enabled).when(getTopCameraCompatFreeformPolicy())
+                .isCameraRunningAndWindowingModeEligible(eq(mActivityStack.top()));
     }
 
     void setTopActivityEligibleForOrientationOverride(boolean enabled) {
@@ -230,6 +239,10 @@
         mDisplayContent.setIgnoreOrientationRequest(enabled);
     }
 
+    void setTopActivityOrganizedTask() {
+        doReturn(mTaskStack.top()).when(mActivityStack.top()).getOrganizedTask();
+    }
+
     void setTopTaskInMultiWindowMode(boolean inMultiWindowMode) {
         doReturn(inMultiWindowMode).when(mTaskStack.top()).inMultiWindowMode();
     }
@@ -503,8 +516,13 @@
     }
 
     private DisplayRotationCompatPolicy getTopDisplayRotationCompatPolicy() {
-        return mActivityStack.top().mDisplayContent
-                .mAppCompatCameraPolicy.mDisplayRotationCompatPolicy;
+        return mActivityStack.top().mDisplayContent.mAppCompatCameraPolicy
+                .mDisplayRotationCompatPolicy;
+    }
+
+    private CameraCompatFreeformPolicy getTopCameraCompatFreeformPolicy() {
+        return mActivityStack.top().mDisplayContent.mAppCompatCameraPolicy
+                .mCameraCompatFreeformPolicy;
     }
 
     // We add the activity to the stack and spyOn() on its properties.
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatAspectRatioOverridesTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatAspectRatioOverridesTest.java
index 1e40aa0..b839113 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppCompatAspectRatioOverridesTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatAspectRatioOverridesTest.java
@@ -282,7 +282,8 @@
             robot.activity().createActivityWithComponentInNewTaskAndDisplay();
             robot.checkFixedOrientationLetterboxAspectRatioForTopParent(/* expected */ 1.5f);
 
-            robot.activity().enableTreatmentForTopActivity(/* enabled */ true);
+            robot.activity().enableFullscreenCameraCompatTreatmentForTopActivity(
+                    /* enabled */ true);
             robot.checkAspectRatioForTopParentIsSplitScreenRatio(/* expected */ true);
         });
     }
@@ -308,6 +309,12 @@
         void onPostDisplayContentCreation(@NonNull DisplayContent displayContent) {
             super.onPostDisplayContentCreation(displayContent);
             spyOn(displayContent.mAppCompatCameraPolicy);
+            if (displayContent.mAppCompatCameraPolicy.hasDisplayRotationCompatPolicy()) {
+                spyOn(displayContent.mAppCompatCameraPolicy.mDisplayRotationCompatPolicy);
+            }
+            if (displayContent.mAppCompatCameraPolicy.hasCameraCompatFreeformPolicy()) {
+                spyOn(displayContent.mAppCompatCameraPolicy.mCameraCompatFreeformPolicy);
+            }
         }
 
         @Override
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraOverridesTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraOverridesTest.java
index d66c21a..b91a5b7 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraOverridesTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraOverridesTest.java
@@ -28,7 +28,7 @@
 import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM;
+import static com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING;
 
 import android.compat.testing.PlatformCompatChangeRule;
 import android.platform.test.annotations.DisableFlags;
@@ -218,7 +218,7 @@
     }
 
     @Test
-    @DisableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @DisableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testShouldApplyCameraCompatFreeformTreatment_flagIsDisabled_returnsFalse() {
         runTestScenario((robot) -> {
             robot.activity().createActivityWithComponentInNewTask();
@@ -229,7 +229,7 @@
 
     @Test
     @EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT})
-    @EnableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testShouldApplyCameraCompatFreeformTreatment_overrideEnabled_returnsFalse() {
         runTestScenario((robot) -> {
             robot.activity().createActivityWithComponentInNewTask();
@@ -240,7 +240,7 @@
 
     @Test
     @EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT})
-    @EnableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testShouldApplyCameraCompatFreeformTreatment_disabledByOverride_returnsFalse() {
         runTestScenario((robot) -> {
             robot.activity().createActivityWithComponentInNewTask();
@@ -250,7 +250,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testShouldApplyCameraCompatFreeformTreatment_notDisabledByOverride_returnsTrue() {
         runTestScenario((robot) -> {
             robot.activity().createActivityWithComponentInNewTask();
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraPolicyTest.java
index d91b38e..cb5afd8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraPolicyTest.java
@@ -18,13 +18,13 @@
 
 import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA;
 
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM;
+import static com.android.server.wm.AppCompatCameraPolicy.isTreatmentEnabledForActivity;
+import static com.android.server.wm.AppCompatCameraPolicy.shouldOverrideMinAspectRatioForCamera;
+import static com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
 
 import android.compat.testing.PlatformCompatChangeRule;
 import android.platform.test.annotations.DisableFlags;
@@ -85,50 +85,50 @@
     }
 
     @Test
-    @EnableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testCameraCompatFreeformPolicy_presentWhenEnabledAndDW() {
         runTestScenario((robot) -> {
-            robot.allowEnterDesktopMode(/* isAllowed= */ true);
+            robot.dw().allowEnterDesktopMode(/* isAllowed= */ true);
             robot.activity().createActivityWithComponentInNewTaskAndDisplay();
             robot.checkTopActivityHasCameraCompatFreeformPolicy(/* exists= */ true);
         });
     }
 
     @Test
-    @EnableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testCameraCompatFreeformPolicy_notPresentWhenNoDW() {
         runTestScenario((robot) -> {
-            robot.allowEnterDesktopMode(/* isAllowed= */ false);
+            robot.dw().allowEnterDesktopMode(/* isAllowed= */ false);
             robot.activity().createActivityWithComponentInNewTaskAndDisplay();
             robot.checkTopActivityHasCameraCompatFreeformPolicy(/* exists= */ false);
         });
     }
 
     @Test
-    @DisableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @DisableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testCameraCompatFreeformPolicy_notPresentWhenNoFlag() {
         runTestScenario((robot) -> {
-            robot.allowEnterDesktopMode(/* isAllowed= */ true);
+            robot.dw().allowEnterDesktopMode(/* isAllowed= */ true);
             robot.activity().createActivityWithComponentInNewTaskAndDisplay();
             robot.checkTopActivityHasCameraCompatFreeformPolicy(/* exists= */ false);
         });
     }
 
     @Test
-    @EnableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testCameraCompatFreeformPolicy_notPresentWhenNoFlagAndNoDW() {
         runTestScenario((robot) -> {
-            robot.allowEnterDesktopMode(/* isAllowed= */ false);
+            robot.dw().allowEnterDesktopMode(/* isAllowed= */ false);
             robot.activity().createActivityWithComponentInNewTaskAndDisplay();
             robot.checkTopActivityHasCameraCompatFreeformPolicy(/* exists= */ false);
         });
     }
 
     @Test
-    @EnableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testCameraCompatFreeformPolicy_startedWhenEnabledAndDW() {
         runTestScenario((robot) -> {
-            robot.allowEnterDesktopMode(/* isAllowed= */ true);
+            robot.dw().allowEnterDesktopMode(/* isAllowed= */ true);
             robot.activity().createActivityWithComponentInNewTaskAndDisplay();
             robot.checkTopActivityHasCameraCompatFreeformPolicy(/* exists= */ true);
             robot.checkTopActivityCameraCompatFreeformPolicyIsRunning();
@@ -136,10 +136,10 @@
     }
 
     @Test
-    @EnableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testCameraStateManager_existsWhenCameraCompatFreeformExists() {
         runTestScenario((robot) -> {
-            robot.allowEnterDesktopMode(true);
+            robot.dw().allowEnterDesktopMode(true);
             robot.activity().createActivityWithComponentInNewTaskAndDisplay();
             robot.checkTopActivityHasCameraCompatFreeformPolicy(/* exists= */ true);
             robot.checkTopActivityHasCameraStateMonitor(/* exists= */ true);
@@ -147,10 +147,10 @@
     }
 
     @Test
-    @EnableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testCameraStateManager_startedWhenCameraCompatFreeformExists() {
         runTestScenario((robot) -> {
-            robot.allowEnterDesktopMode(true);
+            robot.dw().allowEnterDesktopMode(true);
             robot.activity().createActivityWithComponentInNewTaskAndDisplay();
             robot.checkTopActivityHasCameraCompatFreeformPolicy(/* exists= */ true);
             robot.checkTopActivityHasCameraStateMonitor(/* exists= */ true);
@@ -180,7 +180,7 @@
     }
 
     @Test
-    @DisableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @DisableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testCameraStateManager_doesNotExistWhenNoPolicyExists() {
         runTestScenario((robot) -> {
             robot.conf().enableCameraCompatTreatmentAtBuildTime(/* enabled= */ false);
@@ -194,9 +194,10 @@
     @Test
     public void testIsCameraCompatTreatmentActive_whenTreatmentForTopActivityIsEnabled() {
         runTestScenario((robot) -> {
+            robot.conf().enableCameraCompatTreatmentAtBuildTime(/* enabled= */ true);
             robot.applyOnActivity((a)-> {
-                a.createActivityWithComponent();
-                a.enableTreatmentForTopActivity(/* enabled */ true);
+                a.createActivityWithComponentInNewTaskAndDisplay();
+                a.enableFullscreenCameraCompatTreatmentForTopActivity(/* enabled */ true);
             });
 
             robot.checkIsCameraCompatTreatmentActiveForTopActivity(/* active */ true);
@@ -206,9 +207,10 @@
     @Test
     public void testIsCameraCompatTreatmentNotActive_whenTreatmentForTopActivityIsDisabled() {
         runTestScenario((robot) -> {
+            robot.conf().enableCameraCompatTreatmentAtBuildTime(/* enabled= */ true);
             robot.applyOnActivity((a)-> {
                 a.createActivityWithComponent();
-                a.enableTreatmentForTopActivity(/* enabled */ false);
+                a.enableFullscreenCameraCompatTreatmentForTopActivity(/* enabled */ false);
             });
 
             robot.checkIsCameraCompatTreatmentActiveForTopActivity(/* active */ false);
@@ -220,9 +222,10 @@
     public void testShouldOverrideMinAspectRatioForCamera_whenCameraIsNotRunning() {
         runTestScenario((robot) -> {
             robot.applyOnActivity((a)-> {
+                robot.dw().allowEnterDesktopMode(true);
                 robot.conf().enableCameraCompatTreatmentAtBuildTime(/* enabled= */ true);
                 a.createActivityWithComponentInNewTaskAndDisplay();
-                a.setTopActivityCameraActive(/* active */ false);
+                a.setIsCameraRunningAndWindowingModeEligibleFullscreen(/* enabled */ false);
             });
 
             robot.checkShouldOverrideMinAspectRatioForCamera(/* active */ false);
@@ -234,9 +237,10 @@
     public void testShouldOverrideMinAspectRatioForCamera_whenCameraIsRunning_overrideDisabled() {
         runTestScenario((robot) -> {
             robot.applyOnActivity((a)-> {
+                robot.dw().allowEnterDesktopMode(true);
                 robot.conf().enableCameraCompatTreatmentAtBuildTime(/* enabled= */ true);
                 a.createActivityWithComponentInNewTaskAndDisplay();
-                a.setTopActivityCameraActive(/* active */ true);
+                a.setIsCameraRunningAndWindowingModeEligibleFullscreen(/* active */ true);
             });
 
             robot.checkShouldOverrideMinAspectRatioForCamera(/* active */ false);
@@ -245,12 +249,28 @@
 
     @Test
     @EnableCompatChanges(OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA)
-    public void testShouldOverrideMinAspectRatioForCamera_whenCameraIsRunning_overrideEnabled() {
+    public void testShouldOverrideMinAspectRatioForCameraFullscr_cameraIsRunning_overrideEnabled() {
         runTestScenario((robot) -> {
             robot.applyOnActivity((a)-> {
                 robot.conf().enableCameraCompatTreatmentAtBuildTime(/* enabled= */ true);
                 a.createActivityWithComponentInNewTaskAndDisplay();
-                a.setTopActivityCameraActive(/* active */ true);
+                a.setIsCameraRunningAndWindowingModeEligibleFullscreen(/* active */ true);
+            });
+
+            robot.checkShouldOverrideMinAspectRatioForCamera(/* active */ true);
+        });
+    }
+
+
+    @Test
+    @EnableCompatChanges(OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA)
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
+    public void testShouldOverrideMinAspectRatioForCameraFreeform_cameraRunning_overrideEnabled() {
+        runTestScenario((robot) -> {
+            robot.applyOnActivity((a)-> {
+                robot.dw().allowEnterDesktopMode(true);
+                a.createActivityWithComponentInNewTaskAndDisplay();
+                a.setIsCameraRunningAndWindowingModeEligibleFreeform(/* active */ true);
             });
 
             robot.checkShouldOverrideMinAspectRatioForCamera(/* active */ true);
@@ -318,23 +338,11 @@
         }
 
         void checkIsCameraCompatTreatmentActiveForTopActivity(boolean active) {
-            assertEquals(getTopAppCompatCameraPolicy()
-                    .isTreatmentEnabledForActivity(activity().top()), active);
+            assertEquals(active, isTreatmentEnabledForActivity(activity().top()));
         }
 
         void checkShouldOverrideMinAspectRatioForCamera(boolean expected) {
-            assertEquals(getTopAppCompatCameraPolicy()
-                    .shouldOverrideMinAspectRatioForCamera(activity().top()), expected);
-        }
-
-        // TODO(b/350460645): Create Desktop Windowing Robot to reuse common functionalities.
-        void allowEnterDesktopMode(boolean isAllowed) {
-            doReturn(isAllowed).when(() ->
-                    DesktopModeHelper.canEnterDesktopMode(any()));
-        }
-
-        private AppCompatCameraPolicy getTopAppCompatCameraPolicy() {
-            return activity().top().mDisplayContent.mAppCompatCameraPolicy;
+            assertEquals(expected, shouldOverrideMinAspectRatioForCamera(activity().top()));
         }
     }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationOverridesTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationOverridesTest.java
index d9b5f37..8747cfa 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationOverridesTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationOverridesTest.java
@@ -17,11 +17,13 @@
 
 import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED;
 import static android.content.pm.ActivityInfo.OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
 import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
 import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
 import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE;
 import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED;
 
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
 import static com.android.server.wm.AppCompatOrientationOverrides.OrientationOverridesState.MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP;
 import static com.android.server.wm.AppCompatOrientationOverrides.OrientationOverridesState.SET_ORIENTATION_REQUEST_COUNTER_TIMEOUT_MS;
@@ -31,6 +33,7 @@
 import static org.junit.Assert.assertTrue;
 
 import android.compat.testing.PlatformCompatChangeRule;
+import android.content.pm.ActivityInfo.ScreenOrientation;
 import android.platform.test.annotations.Presubmit;
 
 import androidx.annotation.NonNull;
@@ -228,6 +231,25 @@
         });
     }
 
+    @Test
+    public void testOverrideRespectRequestedOrientationIsEnabled_bottomOrientationIsRespected() {
+        runTestScenario((robot) -> {
+            robot.applyOnActivity((a) -> {
+                a.setIgnoreOrientationRequest(true);
+                a.createActivityWithComponentInNewTask();
+                robot.setOverrideRespectRequestedOrientationEnabled(true);
+                a.configureUnresizableTopActivity(SCREEN_ORIENTATION_LANDSCAPE);
+                robot.checkDisplayShouldIgnoreOrientationRequest(SCREEN_ORIENTATION_LANDSCAPE,
+                        /* expected */ false);
+
+                a.createActivityWithComponentInNewTask();
+                a.setTopActivityInFreeformWindowingMode(true);
+            });
+            robot.checkDisplayShouldIgnoreOrientationRequest(SCREEN_ORIENTATION_LANDSCAPE,
+                    /* expected */ false);
+        });
+    }
+
     /**
      * Runs a test scenario providing a Robot.
      */
@@ -291,6 +313,22 @@
             }
         }
 
+        void setOverrideRespectRequestedOrientationEnabled(boolean override) {
+            spyOn(getTopOrientationOverrides());
+            doReturn(override).when(getTopOrientationOverrides())
+                    .isOverrideRespectRequestedOrientationEnabled();
+        }
+
+        void checkDisplayShouldIgnoreOrientationRequest(@ScreenOrientation int candidate,
+                boolean expected) {
+            assertEquals(expected, activity().displayContent()
+                    .shouldIgnoreOrientationRequest(candidate));
+        }
+
+        void checkExpectedDisplayOrientation(@ScreenOrientation int expected) {
+            assertEquals(expected, activity().displayContent().getOrientation());
+        }
+
         void checkShouldUseDisplayLandscapeNaturalOrientation(boolean expected) {
             assertEquals(expected,
                     getTopOrientationOverrides().shouldUseDisplayLandscapeNaturalOrientation());
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationPolicyTest.java
index 9057b6c..09ed9ba 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationPolicyTest.java
@@ -38,6 +38,7 @@
 import static android.view.WindowManager.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
+import static com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.verify;
@@ -45,6 +46,7 @@
 import android.compat.testing.PlatformCompatChangeRule;
 import android.content.pm.ActivityInfo;
 import android.content.res.Configuration;
+import android.platform.test.annotations.EnableFlags;
 import android.platform.test.annotations.Presubmit;
 
 import androidx.annotation.NonNull;
@@ -321,7 +323,22 @@
             });
             robot.applyOnActivity((a) -> {
                 a.createActivityWithComponentInNewTaskAndDisplay();
-                a.setTopActivityCameraActive(false);
+                a.setIsCameraRunningAndWindowingModeEligibleFullscreen(false);
+            });
+
+            robot.checkOverrideOrientation(/* candidate */ SCREEN_ORIENTATION_PORTRAIT,
+                    /* expected */ SCREEN_ORIENTATION_PORTRAIT);
+        });
+    }
+
+    @Test
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
+    public void testOverrideOrientationIfNeeded_fullscrOverrideFreeform_cameraActivity_unchanged() {
+        runTestScenario((robot) -> {
+            robot.applyOnActivity((a) -> {
+                robot.dw().allowEnterDesktopMode(true);
+                a.createActivityWithComponentInNewTaskAndDisplay();
+                a.setIsCameraRunningAndWindowingModeEligibleFreeform(false);
             });
 
             robot.checkOverrideOrientation(/* candidate */ SCREEN_ORIENTATION_PORTRAIT,
@@ -426,8 +443,8 @@
                 c.enablePolicyForIgnoringRequestedOrientation(true);
             });
             robot.applyOnActivity((a) -> {
-                a.createActivityWithComponentInNewTask();
-                a.enableTreatmentForTopActivity(true);
+                a.createActivityWithComponentInNewTaskAndDisplay();
+                a.enableFullscreenCameraCompatTreatmentForTopActivity(true);
             });
             robot.prepareRelaunchingAfterRequestedOrientationChanged(false);
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatRobotBase.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatRobotBase.java
index 5f2a63a..0d929ab 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppCompatRobotBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatRobotBase.java
@@ -39,6 +39,8 @@
     private final AppCompatComponentPropRobot mOptPropRobot;
     @NonNull
     private final AppCompatResourcesRobot mResourcesRobot;
+    @NonNull
+    private final DesktopWindowingRobot mDesktopWindowingRobot;
 
     AppCompatRobotBase(@NonNull WindowManagerService wm,
             @NonNull ActivityTaskManagerService atm,
@@ -51,6 +53,7 @@
                 new AppCompatConfigurationRobot(wm.mAppCompatConfiguration);
         mOptPropRobot = new AppCompatComponentPropRobot(wm);
         mResourcesRobot = new AppCompatResourcesRobot(wm.mContext.getResources());
+        mDesktopWindowingRobot = new DesktopWindowingRobot();
     }
 
     AppCompatRobotBase(@NonNull WindowManagerService wm,
@@ -111,6 +114,11 @@
         return mResourcesRobot;
     }
 
+    @NonNull
+    DesktopWindowingRobot dw() {
+        return mDesktopWindowingRobot;
+    }
+
     void applyOnResources(@NonNull Consumer<AppCompatResourcesRobot> consumer) {
         consumer.accept(mResourcesRobot);
     }
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatUtilsTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatUtilsTest.java
index 21fac9b..50c2c2f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppCompatUtilsTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatUtilsTest.java
@@ -16,14 +16,28 @@
 
 package com.android.server.wm;
 
+import static android.app.CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
 
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.when;
 
+import android.app.CameraCompatTaskInfo.FreeformCameraCompatMode;
+import android.app.TaskInfo;
+import android.platform.test.annotations.EnableFlags;
 import android.platform.test.annotations.Presubmit;
+import android.view.DisplayInfo;
+import android.view.Surface;
 
 import androidx.annotation.NonNull;
 
+import com.android.window.flags.Flags;
+
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -114,6 +128,76 @@
         });
     }
 
+    @Test
+    public void testTopActivityEligibleForUserAspectRatioButton_eligible() {
+        runTestScenario((robot) -> {
+            robot.applyOnActivity((a) -> {
+                a.createActivityWithComponentInNewTask();
+                a.setIgnoreOrientationRequest(true);
+            });
+            robot.conf().enableUserAppAspectRatioSettings(true);
+
+            robot.checkTaskInfoEligibleForUserAspectRatioButton(true);
+        });
+    }
+
+    @Test
+    public void testTopActivityEligibleForUserAspectRatioButton_disabled_notEligible() {
+        runTestScenario((robot) -> {
+            robot.applyOnActivity((a) -> {
+                a.createActivityWithComponentInNewTask();
+                a.setIgnoreOrientationRequest(true);
+            });
+            robot.conf().enableUserAppAspectRatioSettings(false);
+
+            robot.checkTaskInfoEligibleForUserAspectRatioButton(false);
+        });
+    }
+
+    @Test
+    public void testTopActivityEligibleForUserAspectRatioButton_inSizeCompatMode_notEligible() {
+        runTestScenario((robot) -> {
+            robot.applyOnActivity((a) -> {
+                a.createActivityWithComponentInNewTask();
+                a.setIgnoreOrientationRequest(true);
+                a.setTopActivityOrganizedTask();
+                a.setTopActivityInSizeCompatMode(true);
+                a.setTopActivityVisible(true);
+            });
+            robot.conf().enableUserAppAspectRatioSettings(true);
+
+            robot.checkTaskInfoEligibleForUserAspectRatioButton(false);
+        });
+    }
+
+    @Test
+    public void testTopActivityEligibleForUserAspectRatioButton_transparentTop_notEligible() {
+        runTestScenario((robot) -> {
+            robot.transparentActivity((ta) -> {
+                ta.launchTransparentActivityInTask();
+                ta.activity().setIgnoreOrientationRequest(true);
+            });
+            robot.conf().enableUserAppAspectRatioSettings(true);
+
+            robot.checkTaskInfoEligibleForUserAspectRatioButton(false);
+        });
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
+    public void getTaskInfoPropagatesCameraCompatMode() {
+        runTestScenario((robot) -> {
+            robot.dw().allowEnterDesktopMode(/* isAllowed= */ true);
+            robot.applyOnActivity(
+                    AppCompatActivityRobot::createActivityWithComponentInNewTaskAndDisplay);
+            robot.setCameraCompatTreatmentEnabledForActivity(/* enabled= */ true);
+
+            robot.setFreeformCameraCompatMode(CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE);
+            robot.checkTaskInfoFreeformCameraCompatMode(
+                    CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE);
+        });
+    }
+
     /**
      * Runs a test scenario providing a Robot.
      */
@@ -125,11 +209,14 @@
     private static class AppCompatUtilsRobotTest extends AppCompatRobotBase {
 
         private final WindowState mWindowState;
+        @NonNull
+        private final AppCompatTransparentActivityRobot mTransparentActivityRobot;
 
         AppCompatUtilsRobotTest(@NonNull WindowManagerService wm,
                 @NonNull ActivityTaskManagerService atm,
                 @NonNull ActivityTaskSupervisor supervisor) {
             super(wm, atm, supervisor);
+            mTransparentActivityRobot = new AppCompatTransparentActivityRobot(activity());
             mWindowState = Mockito.mock(WindowState.class);
         }
 
@@ -139,6 +226,21 @@
             spyOn(activity.mAppCompatController.getAppCompatAspectRatioPolicy());
         }
 
+        @Override
+        void onPostDisplayContentCreation(@NonNull DisplayContent displayContent) {
+            super.onPostDisplayContentCreation(displayContent);
+            mockPortraitDisplay(displayContent);
+            if (displayContent.mAppCompatCameraPolicy.hasCameraCompatFreeformPolicy()) {
+                spyOn(displayContent.mAppCompatCameraPolicy.mCameraCompatFreeformPolicy);
+            }
+        }
+
+        void transparentActivity(@NonNull Consumer<AppCompatTransparentActivityRobot> consumer) {
+            // We always create at least an opaque activity in a Task.
+            activity().createNewTaskWithBaseActivity();
+            consumer.accept(mTransparentActivityRobot);
+        }
+
         void setIsLetterboxedForFixedOrientationAndAspectRatio(
                 boolean forFixedOrientationAndAspectRatio) {
             when(activity().top().mAppCompatController.getAppCompatAspectRatioPolicy()
@@ -155,11 +257,48 @@
             when(mWindowState.isLetterboxedForDisplayCutout()).thenReturn(displayCutout);
         }
 
+        void setFreeformCameraCompatMode(@FreeformCameraCompatMode int mode) {
+            doReturn(mode).when(activity().top().mDisplayContent.mAppCompatCameraPolicy
+                    .mCameraCompatFreeformPolicy).getCameraCompatMode(activity().top());
+        }
+
         void checkTopActivityLetterboxReason(@NonNull String expected) {
             Assert.assertEquals(expected,
                     AppCompatUtils.getLetterboxReasonString(activity().top(), mWindowState));
         }
 
-    }
+        @NonNull
+        TaskInfo getTopTaskInfo() {
+            return activity().top().getTask().getTaskInfo();
+        }
 
+        void checkTaskInfoEligibleForUserAspectRatioButton(boolean eligible) {
+            Assert.assertEquals(eligible, getTopTaskInfo().appCompatTaskInfo
+                    .eligibleForUserAspectRatioButton());
+        }
+
+        void checkTaskInfoFreeformCameraCompatMode(@FreeformCameraCompatMode int mode) {
+            Assert.assertEquals(mode, getTopTaskInfo().appCompatTaskInfo
+                    .cameraCompatTaskInfo.freeformCameraCompatMode);
+        }
+
+        void setCameraCompatTreatmentEnabledForActivity(boolean enabled) {
+            doReturn(enabled).when(activity().displayContent().mAppCompatCameraPolicy
+                    .mCameraCompatFreeformPolicy).isTreatmentEnabledForActivity(
+                            eq(activity().top()), anyBoolean());
+        }
+
+        private void mockPortraitDisplay(DisplayContent displayContent) {
+            doAnswer(invocation -> {
+                DisplayInfo displayInfo = new DisplayInfo();
+                displayContent.getDisplay().getDisplayInfo(displayInfo);
+                displayInfo.rotation = Surface.ROTATION_90;
+                // Set height and width so that the natural orientation (when rotation is 0) is
+                // portrait.
+                displayInfo.logicalHeight = 600;
+                displayInfo.logicalWidth =  800;
+                return displayInfo;
+            }).when(displayContent.mWmService.mDisplayManagerInternal).getDisplayInfo(anyInt());
+        }
+    }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java
index a48813d..a07fd23 100644
--- a/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java
@@ -26,6 +26,7 @@
 import static android.app.servertransaction.ActivityLifecycleItem.ON_PAUSE;
 import static android.app.servertransaction.ActivityLifecycleItem.ON_STOP;
 import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_FULL_USER;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@@ -35,7 +36,8 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
-import static com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM;
+import static com.android.server.wm.AppCompatConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
+import static com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -60,6 +62,7 @@
 import android.graphics.Rect;
 import android.hardware.camera2.CameraManager;
 import android.os.Handler;
+import android.platform.test.annotations.EnableFlags;
 import android.platform.test.annotations.Presubmit;
 import android.view.DisplayInfo;
 import android.view.Surface;
@@ -135,7 +138,6 @@
                 });
 
         mActivityRefresher = new ActivityRefresher(mDisplayContent.mWmService, mMockHandler);
-        mSetFlagsRule.enableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM);
         CameraStateMonitor cameraStateMonitor =
                 new CameraStateMonitor(mDisplayContent, mMockHandler);
         mCameraCompatFreeformPolicy =
@@ -147,6 +149,7 @@
         cameraStateMonitor.startListeningToCameraState();
     }
 
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     @Test
     public void testFullscreen_doesNotActivateCameraCompatMode() {
         configureActivity(SCREEN_ORIENTATION_PORTRAIT, WINDOWING_MODE_FULLSCREEN);
@@ -157,6 +160,7 @@
         assertNotInCameraCompatMode();
     }
 
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     @Test
     public void testOrientationUnspecified_doesNotActivateCameraCompatMode() {
         configureActivity(SCREEN_ORIENTATION_UNSPECIFIED);
@@ -164,12 +168,14 @@
         assertNotInCameraCompatMode();
     }
 
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     @Test
     public void testNoCameraConnection_doesNotActivateCameraCompatMode() {
         configureActivity(SCREEN_ORIENTATION_PORTRAIT);
         assertNotInCameraCompatMode();
     }
 
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     @Test
     public void testCameraConnected_deviceInPortrait_portraitCameraCompatMode() throws Exception {
         configureActivity(SCREEN_ORIENTATION_PORTRAIT);
@@ -210,16 +216,20 @@
         assertActivityRefreshRequested(/* refreshRequested */ false);
     }
 
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     @Test
     public void testCameraReconnected_cameraCompatModeAndRefresh() throws Exception {
         configureActivity(SCREEN_ORIENTATION_PORTRAIT);
         setDisplayRotation(Surface.ROTATION_270);
 
         mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);
-        callOnActivityConfigurationChanging(mActivity);
+        callOnActivityConfigurationChanging(mActivity, /* letterboxNew= */ true,
+                /* lastLetterbox= */ false);
         mCameraAvailabilityCallback.onCameraClosed(CAMERA_ID_1);
         mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);
-        callOnActivityConfigurationChanging(mActivity);
+        // Activity is letterboxed from the previous configuration change.
+        callOnActivityConfigurationChanging(mActivity, /* letterboxNew= */ true,
+                /* lastLetterbox= */ true);
 
         assertInCameraCompatMode(CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE);
         assertActivityRefreshRequested(/* refreshRequested */ true);
@@ -235,25 +245,70 @@
     }
 
     @Test
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     @EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT})
     public void testShouldApplyCameraCompatFreeformTreatment_overrideEnabled_returnsFalse() {
         configureActivity(SCREEN_ORIENTATION_PORTRAIT);
 
         assertTrue(mActivity.info
                 .isChangeEnabled(OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT));
-        assertFalse(mCameraCompatFreeformPolicy
-                .shouldApplyFreeformTreatmentForCameraCompat(mActivity));
+        assertFalse(mCameraCompatFreeformPolicy.isCameraCompatForFreeformEnabledForActivity(
+                mActivity));
     }
 
     @Test
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testShouldApplyCameraCompatFreeformTreatment_notDisabledByOverride_returnsTrue() {
         configureActivity(SCREEN_ORIENTATION_PORTRAIT);
 
-        assertTrue(mCameraCompatFreeformPolicy
-                .shouldApplyFreeformTreatmentForCameraCompat(mActivity));
+        assertTrue(mCameraCompatFreeformPolicy.isCameraCompatForFreeformEnabledForActivity(
+                mActivity));
     }
 
     @Test
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
+    public void testShouldRefreshActivity_appBoundsChanged_returnsTrue() {
+        configureActivity(SCREEN_ORIENTATION_PORTRAIT);
+        Configuration oldConfiguration = createConfiguration(/* letterbox= */ false);
+        Configuration newConfiguration = createConfiguration(/* letterbox= */ true);
+        mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);
+
+        assertTrue(mCameraCompatFreeformPolicy.shouldRefreshActivity(mActivity, newConfiguration,
+                oldConfiguration));
+    }
+
+    @Test
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
+    public void testShouldRefreshActivity_displayRotationChanged_returnsTrue() {
+        configureActivity(SCREEN_ORIENTATION_PORTRAIT);
+        Configuration oldConfiguration = createConfiguration(/* letterbox= */ true);
+        Configuration newConfiguration = createConfiguration(/* letterbox= */ true);
+
+        oldConfiguration.windowConfiguration.setDisplayRotation(0);
+        newConfiguration.windowConfiguration.setDisplayRotation(90);
+        mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);
+
+        assertTrue(mCameraCompatFreeformPolicy.shouldRefreshActivity(mActivity, newConfiguration,
+                oldConfiguration));
+    }
+
+    @Test
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
+    public void testShouldRefreshActivity_appBoundsNorDisplayChanged_returnsFalse() {
+        configureActivity(SCREEN_ORIENTATION_PORTRAIT);
+        Configuration oldConfiguration = createConfiguration(/* letterbox= */ true);
+        Configuration newConfiguration = createConfiguration(/* letterbox= */ true);
+
+        oldConfiguration.windowConfiguration.setDisplayRotation(0);
+        newConfiguration.windowConfiguration.setDisplayRotation(0);
+        mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);
+
+        assertFalse(mCameraCompatFreeformPolicy.shouldRefreshActivity(mActivity, newConfiguration,
+                oldConfiguration));
+    }
+
+    @Test
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testOnActivityConfigurationChanging_refreshDisabledViaFlag_noRefresh()
             throws Exception {
         configureActivity(SCREEN_ORIENTATION_PORTRAIT);
@@ -268,6 +323,7 @@
     }
 
     @Test
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testOnActivityConfigurationChanging_cycleThroughStopDisabled() throws Exception {
         when(mAppCompatConfiguration.isCameraCompatRefreshCycleThroughStopEnabled())
                 .thenReturn(false);
@@ -281,6 +337,7 @@
     }
 
     @Test
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     public void testOnActivityConfigurationChanging_cycleThroughStopDisabledForApp()
             throws Exception {
         configureActivity(SCREEN_ORIENTATION_PORTRAIT);
@@ -293,6 +350,51 @@
         assertActivityRefreshRequested(/* refreshRequested */ true, /* cycleThroughStop */ false);
     }
 
+    @Test
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
+    public void testGetCameraCompatAspectRatio_activityNotInCameraCompat_returnsDefaultAspRatio() {
+        configureActivity(SCREEN_ORIENTATION_FULL_USER);
+
+        mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);
+        callOnActivityConfigurationChanging(mActivity);
+
+        assertEquals(MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO,
+                mCameraCompatFreeformPolicy.getCameraCompatAspectRatio(mActivity),
+                /* delta= */ 0.001);
+    }
+
+    @Test
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
+    public void testGetCameraCompatAspectRatio_activityInCameraCompat_returnsConfigAspectRatio() {
+        configureActivity(SCREEN_ORIENTATION_PORTRAIT);
+        final float configAspectRatio = 1.5f;
+        mWm.mAppCompatConfiguration.setCameraCompatAspectRatio(configAspectRatio);
+
+        mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);
+        callOnActivityConfigurationChanging(mActivity);
+
+        assertEquals(configAspectRatio,
+                mCameraCompatFreeformPolicy.getCameraCompatAspectRatio(mActivity),
+                /* delta= */ 0.001);
+    }
+
+    @Test
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
+    public void testGetCameraCompatAspectRatio_inCameraCompatPerAppOverride_returnDefAspectRatio() {
+        configureActivity(SCREEN_ORIENTATION_PORTRAIT);
+        final float configAspectRatio = 1.5f;
+        mWm.mAppCompatConfiguration.setCameraCompatAspectRatio(configAspectRatio);
+        doReturn(true).when(mActivity.mAppCompatController.getAppCompatCameraOverrides())
+                .isOverrideMinAspectRatioForCameraEnabled();
+
+        mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);
+        callOnActivityConfigurationChanging(mActivity);
+
+        assertEquals(MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO,
+                mCameraCompatFreeformPolicy.getCameraCompatAspectRatio(mActivity),
+                /* delta= */ 0.001);
+    }
+
     private void configureActivity(@ScreenOrientation int activityOrientation) {
         configureActivity(activityOrientation, WINDOWING_MODE_FREEFORM);
     }
@@ -356,9 +458,15 @@
     }
 
     private void callOnActivityConfigurationChanging(ActivityRecord activity) {
+        callOnActivityConfigurationChanging(activity, /* letterboxNew= */ true,
+                /* lastLetterbox= */false);
+    }
+
+    private void callOnActivityConfigurationChanging(ActivityRecord activity, boolean letterboxNew,
+            boolean lastLetterbox) {
         mActivityRefresher.onActivityConfigurationChanging(activity,
-                /* newConfig */ createConfiguration(/*letterbox=*/ true),
-                /* lastReportedConfig */ createConfiguration(/*letterbox=*/ false));
+                /* newConfig */ createConfiguration(letterboxNew),
+                /* lastReportedConfig */ createConfiguration(lastLetterbox));
     }
 
     private Configuration createConfiguration(boolean letterbox) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/DesktopWindowingRobot.java b/services/tests/wmtests/src/com/android/server/wm/DesktopWindowingRobot.java
new file mode 100644
index 0000000..285a5e2
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/DesktopWindowingRobot.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2024 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.wm;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+
+import static org.mockito.ArgumentMatchers.any;
+
+/** Robot for changing desktop windowing properties. */
+class DesktopWindowingRobot {
+    void allowEnterDesktopMode(boolean isAllowed) {
+        doReturn(isAllowed).when(() -> DesktopModeHelper.canEnterDesktopMode(any()));
+    }
+}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index 85cb1bc..5c0d424 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -83,7 +83,7 @@
 import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
 import static com.android.server.wm.WindowContainer.POSITION_TOP;
 import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
-import static com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM;
+import static com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING;
 import static com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -2820,7 +2820,7 @@
         verify(mWm.mUmInternal, never()).isUserVisible(userId2, displayId);
     }
 
-    @EnableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     @Test
     public void cameraCompatFreeformFlagEnabled_cameraCompatFreeformPolicyNotNull() {
         doReturn(true).when(() ->
@@ -2829,7 +2829,7 @@
         assertTrue(createNewDisplay().mAppCompatCameraPolicy.hasCameraCompatFreeformPolicy());
     }
 
-    @DisableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @DisableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     @Test
     public void cameraCompatFreeformFlagNotEnabled_cameraCompatFreeformPolicyIsNull() {
         doReturn(true).when(() ->
@@ -2838,7 +2838,7 @@
         assertFalse(createNewDisplay().mAppCompatCameraPolicy.hasCameraCompatFreeformPolicy());
     }
 
-    @EnableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM)
+    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
     @DisableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
     @Test
     public void desktopWindowingFlagNotEnabled_cameraCompatFreeformPolicyIsNull() {
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java
index 7a0961d..1015651 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java
@@ -84,6 +84,7 @@
         // Disabling this call for most tests since it can override the systemUiFlags when called.
         doNothing().when(mDisplayPolicy).updateSystemBarAttributes();
 
+        makeWindowVisible(mStatusBarWindow, mNavBarWindow);
         updateDisplayFrames();
     }
 
@@ -154,6 +155,7 @@
         };
         addWindow(win);
         win.getFrame().set(0, 0, 500, 100);
+        makeWindowVisible(win);
         win.updateSourceFrame(win.getFrame());
         mDisplayContent.getInsetsStateController().onPostLayout();
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
index 6a89178..3bd5747 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
@@ -540,6 +540,7 @@
         final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
 
         mDisplayContent.setInputMethodWindowLocked(mImeWindow);
+        makeWindowVisible(mImeWindow);
         mImeWindow.getControllableInsetProvider().setServerVisible(true);
 
         mImeWindow.mGivenContentInsets.set(0, 10, 0, 0);
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java
index 8cf593f..35c9e3f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java
@@ -544,39 +544,35 @@
     }
 
     @Test
-    public void testIsCameraActiveWhenCallbackInvokedNoMultiWindow_returnTrue() {
+    public void testShouldCameraCompatControlOrientationWhenInvokedNoMultiWindow_returnTrue() {
         configureActivity(SCREEN_ORIENTATION_PORTRAIT);
         mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);
 
-        assertTrue(
-                mDisplayRotationCompatPolicy.isCameraActive(mActivity, /* mustBeFullscreen*/ true));
+        assertTrue(mDisplayRotationCompatPolicy.shouldCameraCompatControlOrientation(mActivity));
     }
 
     @Test
-    public void testIsCameraActiveWhenCallbackNotInvokedNoMultiWindow_returnFalse() {
+    public void testShouldCameraCompatControlOrientationWhenNotInvokedNoMultiWindow_returnFalse() {
         configureActivity(SCREEN_ORIENTATION_PORTRAIT);
 
-        assertFalse(
-                mDisplayRotationCompatPolicy.isCameraActive(mActivity, /* mustBeFullscreen*/ true));
+        assertFalse(mDisplayRotationCompatPolicy.shouldCameraCompatControlOrientation(mActivity));
     }
 
     @Test
-    public void testIsCameraActiveWhenCallbackNotInvokedMultiWindow_returnFalse() {
+    public void testShouldCameraCompatControlOrientationWhenNotInvokedMultiWindow_returnFalse() {
         configureActivity(SCREEN_ORIENTATION_PORTRAIT);
         when(mActivity.inMultiWindowMode()).thenReturn(true);
 
-        assertFalse(
-                mDisplayRotationCompatPolicy.isCameraActive(mActivity, /* mustBeFullscreen*/ true));
+        assertFalse(mDisplayRotationCompatPolicy.shouldCameraCompatControlOrientation(mActivity));
     }
 
     @Test
-    public void testIsCameraActiveWhenCallbackInvokedMultiWindow_returnFalse() {
+    public void testShouldCameraCompatControlOrientationWhenInvokedMultiWindow_returnFalse() {
         configureActivity(SCREEN_ORIENTATION_PORTRAIT);
         when(mActivity.inMultiWindowMode()).thenReturn(true);
         mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);
 
-        assertFalse(
-                mDisplayRotationCompatPolicy.isCameraActive(mActivity, /* mustBeFullscreen*/ true));
+        assertFalse(mDisplayRotationCompatPolicy.shouldCameraCompatControlOrientation(mActivity));
     }
 
     private void configureActivity(@ScreenOrientation int activityOrientation) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
index b26c267..d2cf03d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
@@ -41,7 +41,10 @@
 import static org.mockito.Mockito.verify;
 
 import android.app.StatusBarManager;
+import android.graphics.Rect;
 import android.os.Binder;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
 import android.platform.test.annotations.Presubmit;
 import android.view.InsetsFrameProvider;
 import android.view.InsetsSource;
@@ -52,6 +55,7 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.server.statusbar.StatusBarManagerInternal;
+import com.android.window.flags.Flags;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -95,6 +99,7 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
     public void testControlsForDispatch_freeformTaskVisible() {
         addStatusBar();
         addNavigationBar();
@@ -108,6 +113,37 @@
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+    public void testControlsForDispatch_fullscreenFreeformTaskVisible() {
+        addStatusBar();
+        addNavigationBar();
+
+        final WindowState win = createWindow(null, WINDOWING_MODE_FREEFORM,
+                ACTIVITY_TYPE_STANDARD, TYPE_APPLICATION, mDisplayContent, "app");
+        win.setBounds(new Rect());
+        final InsetsSourceControl[] controls = addWindowAndGetControlsForDispatch(win);
+
+        // The freeform (w/fullscreen bounds) app window can control both system bars.
+        assertNotNull(controls);
+        assertEquals(2, controls.length);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+    public void testControlsForDispatch_nonFullscreenFreeformTaskVisible() {
+        addStatusBar();
+        addNavigationBar();
+
+        final WindowState win = createWindow(null, WINDOWING_MODE_FREEFORM,
+                ACTIVITY_TYPE_STANDARD, TYPE_APPLICATION, mDisplayContent, "app");
+        win.getTask().setBounds(new Rect(1, 1, 10, 10));
+        final InsetsSourceControl[] controls = addWindowAndGetControlsForDispatch(win);
+
+        // The freeform (but not fullscreen bounds) app window must not control any system bars.
+        assertNull(controls);
+    }
+
+    @Test
     public void testControlsForDispatch_forceStatusBarVisible() {
         addStatusBar().mAttrs.forciblyShownTypes |= statusBars();
         addNavigationBar();
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
index d0d7c06..66a66a1 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
@@ -291,6 +291,8 @@
         final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
         final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
 
+        makeWindowVisible(statusBar);
+
         // IME cannot be the IME target.
         ime.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxAttachInputTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxAttachInputTest.java
new file mode 100644
index 0000000..7e1de47
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxAttachInputTest.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright 2024 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.wm;
+
+import static com.android.server.testutils.MockitoUtilsKt.eq;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.graphics.Color;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.os.InputConfig;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.annotations.Presubmit;
+import android.view.InputWindowHandle;
+import android.view.SurfaceControl;
+import android.view.WindowManager;
+
+import com.android.server.testutils.StubTransaction;
+import com.android.window.flags.Flags;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+
+/**
+ * Test class for {@link Letterbox}.
+ * <p>
+ * Build/Install/Run:
+ * atest WmTests:LetterboxAttachInputTest
+ */
+@Presubmit
+@RunWith(WindowTestRunner.class)
+public class LetterboxAttachInputTest extends WindowTestsBase {
+
+    private Letterbox mLetterbox;
+    private LetterboxTest.SurfaceControlMocker mSurfaces;
+
+    @Before
+    public void setUp() throws Exception {
+        mSurfaces = new LetterboxTest.SurfaceControlMocker();
+        AppCompatLetterboxOverrides letterboxOverrides = mock(AppCompatLetterboxOverrides.class);
+        doReturn(false).when(letterboxOverrides).shouldLetterboxHaveRoundedCorners();
+        doReturn(Color.valueOf(Color.BLACK)).when(letterboxOverrides)
+                .getLetterboxBackgroundColor();
+        doReturn(false).when(letterboxOverrides).hasWallpaperBackgroundForLetterbox();
+        doReturn(0).when(letterboxOverrides).getLetterboxWallpaperBlurRadiusPx();
+        doReturn(0.5f).when(letterboxOverrides).getLetterboxWallpaperDarkScrimAlpha();
+        mLetterbox = new Letterbox(mSurfaces, StubTransaction::new,
+                mock(AppCompatReachabilityPolicy.class), letterboxOverrides,
+                () -> mock(SurfaceControl.class));
+        mTransaction = spy(StubTransaction.class);
+    }
+
+    @DisableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
+    @Test
+    public void testSurface_createdHasSlipperyInput_scrollingFromLetterboxDisabled() {
+        mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
+
+        attachInput();
+        applySurfaceChanges();
+
+        assertNotNull(mSurfaces.top);
+        ArgumentCaptor<InputWindowHandle> handleCaptor =
+                ArgumentCaptor.forClass(InputWindowHandle.class);
+        verify(mTransaction).setInputWindowInfo(eq(mSurfaces.top), handleCaptor.capture());
+        InputWindowHandle capturedHandle = handleCaptor.getValue();
+        assertTrue((capturedHandle.inputConfig & InputConfig.SLIPPERY) != 0);
+        assertFalse((capturedHandle.inputConfig & InputConfig.SPY) != 0);
+    }
+
+    @DisableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
+    @Test
+    public void testInputSurface_notCreated_scrollingFromLetterboxDisabled() {
+        mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
+
+        attachInput();
+        applySurfaceChanges();
+
+        assertNull(mSurfaces.topInput);
+    }
+
+    @EnableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
+    @Test
+    public void testSurface_createdHasNoInput_scrollingFromLetterboxEnabled() {
+        mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
+
+        attachInput();
+        applySurfaceChanges();
+
+        assertNotNull(mSurfaces.top);
+        verify(mTransaction, never()).setInputWindowInfo(eq(mSurfaces.top), any());
+
+    }
+
+    @EnableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
+    @Test
+    public void testInputSurface_createdHasSpyInput_scrollingFromLetterboxEnabled() {
+        mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
+
+        attachInput();
+        applySurfaceChanges();
+
+        assertNotNull(mSurfaces.topInput);
+        ArgumentCaptor<InputWindowHandle> handleCaptor =
+                ArgumentCaptor.forClass(InputWindowHandle.class);
+        verify(mTransaction).setInputWindowInfo(eq(mSurfaces.topInput), handleCaptor.capture());
+        InputWindowHandle capturedHandle = handleCaptor.getValue();
+        assertTrue((capturedHandle.inputConfig & InputConfig.SPY) != 0);
+        assertFalse((capturedHandle.inputConfig & InputConfig.SLIPPERY) != 0);
+    }
+
+    @EnableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
+    @Test
+    public void testInputSurfaceOrigin_applied_scrollingFromLetterboxEnabled() {
+        mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
+
+        attachInput();
+        applySurfaceChanges();
+
+        verify(mTransaction).setPosition(mSurfaces.topInput, -1000, -2000);
+    }
+
+    @EnableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
+    @Test
+    public void testInputSurfaceOrigin_changeCausesReapply_scrollingFromLetterboxEnabled() {
+        mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
+
+        attachInput();
+        applySurfaceChanges();
+        clearInvocations(mTransaction);
+        mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(0, 0));
+
+        assertTrue(mLetterbox.needsApplySurfaceChanges());
+
+        applySurfaceChanges();
+
+        verify(mTransaction).setPosition(mSurfaces.topInput, 0, 0);
+    }
+
+    private void applySurfaceChanges() {
+        mLetterbox.applySurfaceChanges(/* syncTransaction */ mTransaction,
+                /* pendingTransaction */ mTransaction);
+    }
+
+    private void attachInput() {
+        final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams();
+        final WindowToken windowToken = createTestWindowToken(0, mDisplayContent);
+        WindowState windowState = createWindowState(attrs, windowToken);
+        mLetterbox.attachInput(windowState);
+    }
+}
diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
index 400fe8b..0baa517 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
@@ -33,14 +33,19 @@
 import android.graphics.Color;
 import android.graphics.Point;
 import android.graphics.Rect;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
 import android.platform.test.annotations.Presubmit;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.view.SurfaceControl;
 
 import androidx.test.filters.SmallTest;
 
 import com.android.server.testutils.StubTransaction;
+import com.android.window.flags.Flags;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.invocation.InvocationOnMock;
 
@@ -56,9 +61,12 @@
 @Presubmit
 public class LetterboxTest {
 
-    Letterbox mLetterbox;
-    SurfaceControlMocker mSurfaces;
-    SurfaceControl.Transaction mTransaction;
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    private Letterbox mLetterbox;
+    private SurfaceControlMocker mSurfaces;
+    private SurfaceControl.Transaction mTransaction;
 
     private SurfaceControl mParentSurface = mock(SurfaceControl.class);
     private AppCompatLetterboxOverrides mLetterboxOverrides;
@@ -183,6 +191,38 @@
         verify(mTransaction).setPosition(mSurfaces.top, -1000, -2000);
     }
 
+    @DisableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
+    @Test
+    public void testSurface_created_scrollingFromLetterboxDisabled() {
+        mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
+        applySurfaceChanges();
+        assertNotNull(mSurfaces.top);
+    }
+
+    @DisableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
+    @Test
+    public void testInputSurface_notCreated_scrollingFromLetterboxDisabled() {
+        mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
+        applySurfaceChanges();
+        assertNull(mSurfaces.topInput);
+    }
+
+    @EnableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
+    @Test
+    public void testSurface_created_scrollingFromLetterboxEnabled() {
+        mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
+        applySurfaceChanges();
+        assertNotNull(mSurfaces.top);
+    }
+
+    @EnableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
+    @Test
+    public void testInputSurface_notCreated_notAttachedInputAndScrollingFromLetterboxEnabled() {
+        mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
+        applySurfaceChanges();
+        assertNull(mSurfaces.topInput);
+    }
+
     @Test
     public void testApplySurfaceChanges_setColor() {
         mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(1000, 2000));
@@ -283,15 +323,11 @@
                 /* pendingTransaction */ mTransaction);
     }
 
-    class SurfaceControlMocker implements Supplier<SurfaceControl.Builder> {
-        private SurfaceControl.Builder mLeftBuilder;
-        public SurfaceControl left;
+    static class SurfaceControlMocker implements Supplier<SurfaceControl.Builder> {
         private SurfaceControl.Builder mTopBuilder;
         public SurfaceControl top;
-        private SurfaceControl.Builder mRightBuilder;
-        public SurfaceControl right;
-        private SurfaceControl.Builder mBottomBuilder;
-        public SurfaceControl bottom;
+        private SurfaceControl.Builder mTopInputBuilder;
+        public SurfaceControl topInput;
         private SurfaceControl.Builder mFullWindowSurfaceBuilder;
         public SurfaceControl fullWindowSurface;
 
@@ -300,32 +336,24 @@
             final SurfaceControl.Builder builder = mock(SurfaceControl.Builder.class,
                     InvocationOnMock::getMock);
             when(builder.setName(anyString())).then((i) -> {
-                if (((String) i.getArgument(0)).contains("left")) {
-                    mLeftBuilder = (SurfaceControl.Builder) i.getMock();
-                } else if (((String) i.getArgument(0)).contains("top")) {
+                if (((String) i.getArgument(0)).contains("Letterbox - top")) {
                     mTopBuilder = (SurfaceControl.Builder) i.getMock();
-                } else if (((String) i.getArgument(0)).contains("right")) {
-                    mRightBuilder = (SurfaceControl.Builder) i.getMock();
-                } else if (((String) i.getArgument(0)).contains("bottom")) {
-                    mBottomBuilder = (SurfaceControl.Builder) i.getMock();
-                } else if (((String) i.getArgument(0)).contains("fullWindow")) {
+                } else if (((String) i.getArgument(0)).contains("Letterbox - fullWindow")) {
                     mFullWindowSurfaceBuilder = (SurfaceControl.Builder) i.getMock();
+                } else if (((String) i.getArgument(0)).contains("LetterboxInput - top")) {
+                    mTopInputBuilder = (SurfaceControl.Builder) i.getMock();
                 }
                 return i.getMock();
             });
 
             doAnswer((i) -> {
                 final SurfaceControl control = mock(SurfaceControl.class);
-                if (i.getMock() == mLeftBuilder) {
-                    left = control;
-                } else if (i.getMock() == mTopBuilder) {
+                if (i.getMock() == mTopBuilder) {
                     top = control;
-                } else if (i.getMock() == mRightBuilder) {
-                    right = control;
-                } else if (i.getMock() == mBottomBuilder) {
-                    bottom = control;
                 } else if (i.getMock() == mFullWindowSurfaceBuilder) {
                     fullWindowSurface = control;
+                } else if (i.getMock() == mTopInputBuilder) {
+                    topInput = control;
                 }
                 return control;
             }).when(builder).build();
diff --git a/services/tests/wmtests/src/com/android/server/wm/ProtoLogIntegrationTest.java b/services/tests/wmtests/src/com/android/server/wm/ProtoLogIntegrationTest.java
index 35cff7a..1a4cc55 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ProtoLogIntegrationTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ProtoLogIntegrationTest.java
@@ -26,8 +26,8 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.internal.protolog.ProtoLog;
-import com.android.internal.protolog.ProtoLogGroup;
 import com.android.internal.protolog.ProtoLogImpl;
+import com.android.internal.protolog.WmProtoLogGroups;
 import com.android.internal.protolog.common.IProtoLog;
 import com.android.internal.protolog.common.LogLevel;
 
@@ -51,13 +51,13 @@
     public void testProtoLogToolIntegration() {
         IProtoLog mockedProtoLog = mock(IProtoLog.class);
         runWith(mockedProtoLog, this::testProtoLog);
-        verify(mockedProtoLog).log(eq(LogLevel.ERROR), eq(ProtoLogGroup.TEST_GROUP),
+        verify(mockedProtoLog).log(eq(LogLevel.ERROR), eq(WmProtoLogGroups.TEST_GROUP),
                 anyInt(), eq(0b0010010111),
                 eq(new Object[]{true, 1L, 2L, 0.3, "ok"}));
     }
 
     private void testProtoLog() {
-        ProtoLog.e(ProtoLogGroup.TEST_GROUP,
+        ProtoLog.e(WmProtoLogGroups.TEST_GROUP,
                 "Test completed successfully: %b %d %x %f %% %s",
                 true, 1, 2, 0.3, "ok");
     }
diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
index e0344d7..df17cd1 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
@@ -432,6 +432,29 @@
     }
 
     @Test
+    public void testAddTaskCompatibleWindowingMode_withFreeformAndFullscreen_expectRemove() {
+        Task task1 = createTaskBuilder(".Task1")
+                .setFlags(FLAG_ACTIVITY_NEW_TASK)
+                .build();
+        doReturn(WINDOWING_MODE_FREEFORM).when(task1).getWindowingMode();
+        mRecentTasks.add(task1);
+        mCallbacksRecorder.clear();
+
+        Task task2 = createTaskBuilder(".Task1")
+                .setWindowingMode(WINDOWING_MODE_FULLSCREEN)
+                .setFlags(FLAG_ACTIVITY_NEW_TASK)
+                .build();
+        assertEquals(WINDOWING_MODE_FULLSCREEN, task2.getWindowingMode());
+        mRecentTasks.add(task2);
+
+        assertThat(mCallbacksRecorder.mAdded).hasSize(1);
+        assertThat(mCallbacksRecorder.mAdded).contains(task2);
+        assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+        assertThat(mCallbacksRecorder.mRemoved).hasSize(1);
+        assertThat(mCallbacksRecorder.mRemoved).contains(task1);
+    }
+
+    @Test
     public void testAddTaskIncompatibleWindowingMode_expectNoRemove() {
         Task task1 = createTaskBuilder(".Task1")
                 .setWindowingMode(WINDOWING_MODE_FULLSCREEN)
diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
index 8fa4667..72f4fa91 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -4849,6 +4849,58 @@
     }
 
     @Test
+    public void testUniversalResizeable() {
+        mWm.mConstants.mIgnoreActivityOrientationRequest = true;
+        setUpApp(mDisplayContent);
+        final float maxAspect = 1.8f;
+        final float minAspect = 1.5f;
+        prepareLimitedBounds(mActivity, maxAspect, minAspect,
+                ActivityInfo.SCREEN_ORIENTATION_LOCKED, true /* isUnresizable */);
+
+        assertTrue(mActivity.isUniversalResizeable());
+        assertTrue(mActivity.isResizeable());
+        assertFalse(mActivity.shouldCreateAppCompatDisplayInsets());
+        assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, mActivity.getOverrideOrientation());
+        assertEquals(mActivity.getTask().getBounds(), mActivity.getBounds());
+        final AppCompatAspectRatioPolicy aspectRatioPolicy = mActivity.mAppCompatController
+                .getAppCompatAspectRatioPolicy();
+        assertEquals(0, aspectRatioPolicy.getMaxAspectRatio(), 0 /* delta */);
+        assertEquals(0, aspectRatioPolicy.getMinAspectRatio(), 0 /* delta */);
+
+        // Compat override can still take effect.
+        final AppCompatAspectRatioOverrides aspectRatioOverrides =
+                mActivity.mAppCompatController.getAppCompatAspectRatioOverrides();
+        spyOn(aspectRatioOverrides);
+        doReturn(true).when(aspectRatioOverrides).shouldOverrideMinAspectRatio();
+        assertEquals(minAspect, aspectRatioPolicy.getMinAspectRatio(), 0 /* delta */);
+
+        // User override can still take effect.
+        doReturn(true).when(aspectRatioOverrides).shouldApplyUserMinAspectRatioOverride();
+        assertFalse(mActivity.isResizeable());
+        assertEquals(maxAspect, aspectRatioPolicy.getMaxAspectRatio(), 0 /* delta */);
+        assertNotEquals(SCREEN_ORIENTATION_UNSPECIFIED, mActivity.getOverrideOrientation());
+    }
+
+
+    @Test
+    @EnableCompatChanges({ActivityRecord.UNIVERSAL_RESIZABLE_BY_DEFAULT})
+    public void testUniversalResizeableByDefault() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT);
+        mDisplayContent.setIgnoreOrientationRequest(false);
+        setUpApp(mDisplayContent);
+        assertFalse(mActivity.isUniversalResizeable());
+
+        mDisplayContent.setIgnoreOrientationRequest(true);
+        final int swDp = mDisplayContent.getConfiguration().smallestScreenWidthDp;
+        if (swDp < WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP) {
+            final int height = 100 + (int) (mDisplayContent.getDisplayMetrics().density
+                    * WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP);
+            resizeDisplay(mDisplayContent, 100 + height, height);
+        }
+        assertTrue(mActivity.isUniversalResizeable());
+    }
+
+    @Test
     public void testClearSizeCompat_resetOverrideConfig() {
         final int origDensity = 480;
         final int newDensity = 520;
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
index 4b03483..e4512c3 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
@@ -18,7 +18,6 @@
 
 
 import static android.app.ActivityTaskManager.INVALID_TASK_ID;
-import static android.app.CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
@@ -705,50 +704,6 @@
     }
 
     @Test
-    public void testTopActivityEligibleForUserAspectRatioButton() {
-        DisplayContent display = mAtm.mRootWindowContainer.getDefaultDisplay();
-        final Task rootTask = new TaskBuilder(mSupervisor).setCreateActivity(true)
-                .setWindowingMode(WINDOWING_MODE_FULLSCREEN).setDisplay(display).build();
-        final Task task = rootTask.getBottomMostTask();
-        final ActivityRecord root = task.getTopNonFinishingActivity();
-        spyOn(mWm.mAppCompatConfiguration);
-        spyOn(root);
-        spyOn(root.mAppCompatController.getAppCompatAspectRatioOverrides());
-
-        doReturn(true).when(root).fillsParent();
-        doReturn(true).when(
-                root.mAppCompatController.getAppCompatAspectRatioOverrides())
-                    .shouldEnableUserAspectRatioSettings();
-        doReturn(false).when(root).inSizeCompatMode();
-        doReturn(task).when(root).getOrganizedTask();
-
-        // The button should be eligible to be displayed
-        assertTrue(task.getTaskInfo()
-                .appCompatTaskInfo.eligibleForUserAspectRatioButton());
-
-        // When shouldApplyUserMinAspectRatioOverride is disable the button is not enabled
-        doReturn(false).when(
-                root.mAppCompatController.getAppCompatAspectRatioOverrides())
-                    .shouldEnableUserAspectRatioSettings();
-        assertFalse(task.getTaskInfo()
-                .appCompatTaskInfo.eligibleForUserAspectRatioButton());
-        doReturn(true).when(root.mAppCompatController
-                .getAppCompatAspectRatioOverrides()).shouldEnableUserAspectRatioSettings();
-
-        // When in size compat mode the button is not enabled
-        doReturn(true).when(root).inSizeCompatMode();
-        assertFalse(task.getTaskInfo()
-                .appCompatTaskInfo.eligibleForUserAspectRatioButton());
-        doReturn(false).when(root).inSizeCompatMode();
-
-        // When the top activity is transparent, the button is not enabled
-        doReturn(false).when(root).fillsParent();
-        assertFalse(task.getTaskInfo()
-                .appCompatTaskInfo.eligibleForUserAspectRatioButton());
-        doReturn(true).when(root).fillsParent();
-    }
-
-    @Test
     public void testIsTopActivityTranslucent() {
         DisplayContent display = mAtm.mRootWindowContainer.getDefaultDisplay();
         final Task rootTask = new TaskBuilder(mSupervisor).setCreateActivity(true)
@@ -2112,17 +2067,6 @@
     }
 
     @Test
-    public void getTaskInfoPropagatesCameraCompatMode() {
-        final Task task = new TaskBuilder(mSupervisor).setCreateActivity(true).build();
-        final ActivityRecord activity = task.getTopMostActivity();
-        activity.mAppCompatController.getAppCompatCameraOverrides().setFreeformCameraCompatMode(
-                CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE);
-
-        assertEquals(CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE,
-                task.getTaskInfo().appCompatTaskInfo.cameraCompatTaskInfo.freeformCameraCompatMode);
-    }
-
-    @Test
     public void testUpdateTaskDescriptionOnReparent() {
         final Task rootTask1 = createTask(mDisplayContent);
         final Task rootTask2 = createTask(mDisplayContent);
diff --git a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
index eebb487..9e9874b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -103,8 +103,8 @@
     }
 
     @Override
-    public KeyEvent dispatchUnhandledKey(IBinder focusedToken, KeyEvent event, int policyFlags) {
-        return null;
+    public boolean interceptUnhandledKey(KeyEvent event, IBinder focusedToken) {
+        return false;
     }
 
     @Override
diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
index 064b434..5b3fd53 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
@@ -34,7 +34,6 @@
 import static android.view.WindowManager.TRANSIT_CLOSE;
 import static android.view.WindowManager.TRANSIT_OPEN;
 import static android.view.WindowManager.TRANSIT_TO_BACK;
-import static android.window.TransitionInfo.FLAG_CONFIG_AT_END;
 import static android.window.TransitionInfo.FLAG_CROSS_PROFILE_OWNER_THUMBNAIL;
 import static android.window.TransitionInfo.FLAG_FILLS_TASK;
 import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY;
@@ -2935,9 +2934,6 @@
         controller.requestStartTransition(transit, task, null, null);
         player.start();
         assertTrue(activity.isConfigurationDispatchPaused());
-        // config-at-end flag must propagate up to task if activity was promoted.
-        assertTrue(player.mLastReady.getChange(
-                task.mRemoteToken.toWindowContainerToken()).hasFlags(FLAG_CONFIG_AT_END));
         player.finish();
         assertFalse(activity.isConfigurationDispatchPaused());
     }
@@ -2966,11 +2962,9 @@
 
         controller.requestStartTransition(transit, task, null, null);
         player.start();
-        // config-at-end flag must propagate up to task even when reparented (since config-at-end
-        // only cares about after-end state).
-        assertTrue(player.mLastReady.getChange(
-                task.mRemoteToken.toWindowContainerToken()).hasFlags(FLAG_CONFIG_AT_END));
+        assertTrue(activity.isConfigurationDispatchPaused());
         player.finish();
+        assertFalse(activity.isConfigurationDispatchPaused());
     }
 
     @Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
index 401964c..1fa6578 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -23,6 +23,10 @@
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
 import static android.view.InsetsSource.FLAG_FORCE_CONSUMING;
+import static android.view.WindowInsets.Type.captionBar;
+import static android.view.WindowInsets.Type.ime;
+import static android.view.WindowInsets.Type.navigationBars;
+import static android.view.WindowInsets.Type.statusBars;
 import static android.view.WindowInsets.Type.systemOverlays;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
@@ -36,6 +40,7 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyFloat;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
@@ -80,6 +85,8 @@
 import android.os.ShellCallback;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.annotations.Presubmit;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.util.ArraySet;
 import android.view.IRemoteAnimationFinishedCallback;
 import android.view.IRemoteAnimationRunner;
 import android.view.InsetsFrameProvider;
@@ -103,6 +110,7 @@
 import java.io.FileDescriptor;
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.List;
 import java.util.NoSuchElementException;
 
 
@@ -967,7 +975,7 @@
         Rect insetsRect = new Rect(0, 200, 1080, 700);
         final int flags = FLAG_FORCE_CONSUMING;
         final InsetsFrameProvider provider =
-                new InsetsFrameProvider(owner, 1, WindowInsets.Type.captionBar())
+                new InsetsFrameProvider(owner, 1, captionBar())
                         .setArbitraryRectangle(insetsRect)
                         .setFlags(flags);
         task.addLocalInsetsFrameProvider(provider, owner);
@@ -1678,6 +1686,178 @@
         assertFalse("The source must be removed.", hasLocalSource(task, provider.getId()));
     }
 
+    @Test
+    public void testSetExcludeInsetsTypes_appliedOnNodeAndChildren() {
+        final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
+        final TestWindowContainer root = builder.setLayer(0).build();
+
+        final TestWindowContainer child1 = root.addChildWindow();
+        final TestWindowContainer child2 = root.addChildWindow();
+        final TestWindowContainer child11 = child1.addChildWindow();
+        final TestWindowContainer child12 = child1.addChildWindow();
+        final TestWindowContainer child21 = child2.addChildWindow();
+
+        assertEquals(0, root.mMergedExcludeInsetsTypes);
+        assertEquals(0, child1.mMergedExcludeInsetsTypes);
+        assertEquals(0, child11.mMergedExcludeInsetsTypes);
+        assertEquals(0, child12.mMergedExcludeInsetsTypes);
+        assertEquals(0, child2.mMergedExcludeInsetsTypes);
+        assertEquals(0, child21.mMergedExcludeInsetsTypes);
+
+        child1.setExcludeInsetsTypes(ime());
+        assertEquals(0, root.mMergedExcludeInsetsTypes);
+        assertEquals(ime(), child1.mMergedExcludeInsetsTypes);
+        assertEquals(ime(), child11.mMergedExcludeInsetsTypes);
+        assertEquals(ime(), child12.mMergedExcludeInsetsTypes);
+        assertEquals(0, child2.mMergedExcludeInsetsTypes);
+        assertEquals(0, child21.mMergedExcludeInsetsTypes);
+
+        child11.setExcludeInsetsTypes(navigationBars());
+        assertEquals(0, root.mMergedExcludeInsetsTypes);
+        assertEquals(ime(), child1.mMergedExcludeInsetsTypes);
+        assertEquals(ime() | navigationBars(), child11.mMergedExcludeInsetsTypes);
+        assertEquals(ime(), child12.mMergedExcludeInsetsTypes);
+        assertEquals(0, child2.mMergedExcludeInsetsTypes);
+        assertEquals(0, child21.mMergedExcludeInsetsTypes);
+
+        // overwriting the same value has no change
+        for (int i = 0; i < 2; i++) {
+            root.setExcludeInsetsTypes(statusBars());
+            assertEquals(statusBars(), root.mMergedExcludeInsetsTypes);
+            assertEquals(statusBars() | ime(), child1.mMergedExcludeInsetsTypes);
+            assertEquals(statusBars() | ime() | navigationBars(),
+                    child11.mMergedExcludeInsetsTypes);
+            assertEquals(statusBars() | ime(), child12.mMergedExcludeInsetsTypes);
+            assertEquals(statusBars(), child2.mMergedExcludeInsetsTypes);
+            assertEquals(statusBars(), child21.mMergedExcludeInsetsTypes);
+        }
+
+        // set and reset type statusBars on child. Should have no effect because of parent
+        child2.setExcludeInsetsTypes(statusBars());
+        assertEquals(statusBars(), root.mMergedExcludeInsetsTypes);
+        assertEquals(statusBars() | ime(), child1.mMergedExcludeInsetsTypes);
+        assertEquals(statusBars() | ime() | navigationBars(), child11.mMergedExcludeInsetsTypes);
+        assertEquals(statusBars() | ime(), child12.mMergedExcludeInsetsTypes);
+        assertEquals(statusBars(), child2.mMergedExcludeInsetsTypes);
+        assertEquals(statusBars(), child21.mMergedExcludeInsetsTypes);
+
+        // reset
+        child2.setExcludeInsetsTypes(0);
+        assertEquals(statusBars(), root.mMergedExcludeInsetsTypes);
+        assertEquals(statusBars() | ime(), child1.mMergedExcludeInsetsTypes);
+        assertEquals(statusBars() | ime() | navigationBars(), child11.mMergedExcludeInsetsTypes);
+        assertEquals(statusBars() | ime(), child12.mMergedExcludeInsetsTypes);
+        assertEquals(statusBars(), child2.mMergedExcludeInsetsTypes);
+        assertEquals(statusBars(), child21.mMergedExcludeInsetsTypes);
+
+        // when parent has statusBars also removed, it should be cleared from all children in the
+        // hierarchy
+        root.setExcludeInsetsTypes(0);
+        assertEquals(0, root.mMergedExcludeInsetsTypes);
+        assertEquals(ime(), child1.mMergedExcludeInsetsTypes);
+        assertEquals(ime() | navigationBars(), child11.mMergedExcludeInsetsTypes);
+        assertEquals(ime(), child12.mMergedExcludeInsetsTypes);
+        assertEquals(0, child2.mMergedExcludeInsetsTypes);
+        assertEquals(0, child21.mMergedExcludeInsetsTypes);
+
+        // change on node should have no effect on siblings
+        child12.setExcludeInsetsTypes(captionBar());
+        assertEquals(0, root.mMergedExcludeInsetsTypes);
+        assertEquals(ime(), child1.mMergedExcludeInsetsTypes);
+        assertEquals(ime() | navigationBars(), child11.mMergedExcludeInsetsTypes);
+        assertEquals(captionBar() | ime(), child12.mMergedExcludeInsetsTypes);
+        assertEquals(0, child2.mMergedExcludeInsetsTypes);
+        assertEquals(0, child21.mMergedExcludeInsetsTypes);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(android.view.inputmethod.Flags.FLAG_REFACTOR_INSETS_CONTROLLER)
+    public void testSetExcludeInsetsTypes_appliedAfterReparenting() {
+        final SurfaceControl mockSurfaceControl = mock(SurfaceControl.class);
+        final DisplayContent mockDisplayContent = mock(DisplayContent.class);
+        final var mockInsetsStateController = mock(InsetsStateController.class);
+        doReturn(mockInsetsStateController).when(mockDisplayContent).getInsetsStateController();
+
+        final WindowContainer root1 = createWindowContainerSpy(mockSurfaceControl,
+                mockDisplayContent);
+        final WindowContainer root2 = createWindowContainerSpy(mockSurfaceControl,
+                mockDisplayContent);
+        final WindowContainer child = createWindowContainerSpy(mockSurfaceControl,
+                mockDisplayContent);
+        doNothing().when(child).onConfigurationChanged(any());
+
+        root1.setExcludeInsetsTypes(ime());
+        root2.setExcludeInsetsTypes(captionBar());
+        assertEquals(ime(), root1.mMergedExcludeInsetsTypes);
+        assertEquals(captionBar(), root2.mMergedExcludeInsetsTypes);
+        assertEquals(0, child.mMergedExcludeInsetsTypes);
+        clearInvocations(mockInsetsStateController);
+
+        root1.addChild(child, 0);
+        assertEquals(ime(), child.mMergedExcludeInsetsTypes);
+        verify(mockInsetsStateController).notifyInsetsChanged(
+                new ArraySet<>(List.of(child.asWindowState())));
+        clearInvocations(mockInsetsStateController);
+
+        // Make sure that reparenting does not call notifyInsetsChanged twice
+        child.reparent(root2, 0);
+        assertEquals(captionBar(), child.mMergedExcludeInsetsTypes);
+        verify(mockInsetsStateController).notifyInsetsChanged(
+                new ArraySet<>(List.of(child.asWindowState())));
+    }
+
+    @Test
+    @RequiresFlagsEnabled(android.view.inputmethod.Flags.FLAG_REFACTOR_INSETS_CONTROLLER)
+    public void testSetExcludeInsetsTypes_notifyInsetsAfterChange() {
+        final var mockDisplayContent = mock(DisplayContent.class);
+        final var mockInsetsStateController = mock(InsetsStateController.class);
+        doReturn(mockInsetsStateController).when(mockDisplayContent).getInsetsStateController();
+
+        final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
+        final WindowState mockRootWs = mock(WindowState.class);
+        final TestWindowContainer root = builder.setLayer(0).setAsWindowState(mockRootWs).build();
+        root.mDisplayContent = mockDisplayContent;
+        verify(mockInsetsStateController, never()).notifyInsetsChanged(any());
+
+        root.setExcludeInsetsTypes(ime());
+        assertEquals(ime(), root.mMergedExcludeInsetsTypes);
+        verify(mockInsetsStateController).notifyInsetsChanged(
+                new ArraySet<>(List.of(root.asWindowState())));
+        clearInvocations(mockInsetsStateController);
+
+        // adding a child (while parent has set excludedInsetsTypes) should trigger
+        // notifyInsetsChanged
+        final WindowState mockChildWs = mock(WindowState.class);
+        final TestWindowContainer child1 = builder.setLayer(0).setAsWindowState(
+                mockChildWs).build();
+        child1.mDisplayContent = mockDisplayContent;
+        root.addChildWindow(child1);
+        // TestWindowContainer overrides onParentChanged and therefore doesn't call into
+        // mergeExcludeInsetsTypesAndNotifyInsetsChanged. This is checked in another test
+        assertTrue(child1.mOnParentChangedCalled);
+        child1.setExcludeInsetsTypes(ime());
+        assertEquals(ime(), child1.mMergedExcludeInsetsTypes);
+        verify(mockInsetsStateController).notifyInsetsChanged(
+                new ArraySet<>(List.of(child1.asWindowState())));
+        clearInvocations(mockInsetsStateController);
+
+        // not changing excludedInsetsTypes should not trigger notifyInsetsChanged again
+        root.setExcludeInsetsTypes(ime());
+        assertEquals(ime(), root.mMergedExcludeInsetsTypes);
+        assertEquals(ime(), child1.mMergedExcludeInsetsTypes);
+        verify(mockInsetsStateController, never()).notifyInsetsChanged(any());
+    }
+
+    private WindowContainer<?> createWindowContainerSpy(SurfaceControl mockSurfaceControl,
+            DisplayContent mockDisplayContent) {
+        final WindowContainer<?> wc = spy(new WindowContainer<>(mWm));
+        final WindowState mocWs = mock(WindowState.class);
+        doReturn(mocWs).when(wc).asWindowState();
+        wc.mSurfaceControl = mockSurfaceControl;
+        wc.mDisplayContent = mockDisplayContent;
+        return wc;
+    }
+
     private static boolean hasLocalSource(WindowContainer container, int sourceId) {
         if (container.mLocalInsetsSources == null) {
             return false;
@@ -1693,6 +1873,7 @@
         private boolean mFillsParent;
         private boolean mWaitForTransitStart;
         private Integer mOrientation;
+        private WindowState mWindowState;
 
         private boolean mOnParentChangedCalled;
         private boolean mOnDescendantOverrideCalled;
@@ -1714,7 +1895,7 @@
         };
 
         TestWindowContainer(WindowManagerService wm, int layer, boolean isAnimating,
-                boolean isVisible, boolean waitTransitStart, Integer orientation) {
+                boolean isVisible, boolean waitTransitStart, Integer orientation, WindowState ws) {
             super(wm);
 
             mLayer = layer;
@@ -1723,6 +1904,7 @@
             mFillsParent = true;
             mOrientation = orientation;
             mWaitForTransitStart = waitTransitStart;
+            mWindowState = ws;
             spyOn(mSurfaceAnimator);
             doReturn(mIsAnimating).when(mSurfaceAnimator).isAnimating();
             doReturn(ANIMATION_TYPE_APP_TRANSITION).when(mSurfaceAnimator).getAnimationType();
@@ -1790,6 +1972,11 @@
         boolean isWaitingForTransitionStart() {
             return mWaitForTransitStart;
         }
+
+        @Override
+        WindowState asWindowState() {
+            return mWindowState;
+        }
     }
 
     private static class TestWindowContainerBuilder {
@@ -1799,6 +1986,7 @@
         private boolean mIsVisible;
         private boolean mIsWaitTransitStart;
         private Integer mOrientation;
+        private WindowState mWindowState;
 
         TestWindowContainerBuilder(WindowManagerService wm) {
             mWm = wm;
@@ -1806,6 +1994,7 @@
             mIsAnimating = false;
             mIsVisible = false;
             mOrientation = null;
+            mWindowState = null;
         }
 
         TestWindowContainerBuilder setLayer(int layer) {
@@ -1828,6 +2017,11 @@
             return this;
         }
 
+        TestWindowContainerBuilder setAsWindowState(WindowState ws) {
+            mWindowState = ws;
+            return this;
+        }
+
         TestWindowContainerBuilder setWaitForTransitionStart(boolean waitTransitStart) {
             mIsWaitTransitStart = waitTransitStart;
             return this;
@@ -1835,7 +2029,7 @@
 
         TestWindowContainer build() {
             return new TestWindowContainer(mWm, mLayer, mIsAnimating, mIsVisible,
-                    mIsWaitTransitStart, mOrientation);
+                    mIsWaitTransitStart, mOrientation, mWindowState);
         }
     }
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
index 2d5e5da..e7e184c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
@@ -483,6 +483,32 @@
         assertFalse(statusBar.isVisible());
     }
 
+    /**
+     * Verifies that the InsetsSourceProvider frame cannot be updated by WindowState before
+     * relayout is called.
+     */
+    @SetupWindows(addWindows = { W_STATUS_BAR })
+    @Test
+    public void testUpdateSourceFrameBeforeRelayout() {
+        final WindowState statusBar = mStatusBarWindow;
+        statusBar.mHasSurface = true;
+        assertTrue(statusBar.isVisible());
+        final int statusBarId = InsetsSource.createId(null, 0, statusBars());
+        final var statusBarProvider = mDisplayContent.getInsetsStateController()
+                .getOrCreateSourceProvider(statusBarId, statusBars());
+        statusBarProvider.setWindowContainer(statusBar, null /* frameProvider */,
+                        null /* imeFrameProvider */);
+
+        statusBar.updateSourceFrame(new Rect(0, 0, 500, 200));
+        assertTrue("InsetsSourceProvider frame should not be updated before relayout",
+                statusBarProvider.getSourceFrame().isEmpty());
+
+        makeWindowVisible(statusBar);
+        statusBar.updateSourceFrame(new Rect(0, 0, 500, 100));
+        assertEquals("InsetsSourceProvider frame should be updated after relayout",
+                new Rect(0, 0, 500, 100), statusBarProvider.getSourceFrame());
+    }
+
     @Test
     public void testIsSelfOrAncestorWindowAnimating() {
         final WindowState root = createWindow(null, TYPE_APPLICATION, "root");
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
index 714eb4b..35328a0e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
@@ -23,6 +23,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
 import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
 
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
 import static com.android.server.policy.WindowManagerPolicy.TRANSIT_EXIT;
 
@@ -157,7 +158,16 @@
         // Verify that the other token window is still around.
         assertEquals(1, token.getWindowsCount());
 
+        final TransitionController transitionController = token.mTransitionController;
+        spyOn(transitionController);
+        doReturn(true).when(transitionController).isPlayingTarget(token);
         window2.removeImmediately();
+        assertTrue(token.mIsExiting);
+        assertNotNull("Defer removal for playing transition", token.getParent());
+
+        doReturn(false).when(transitionController).isPlayingTarget(token);
+        token.handleCompleteDeferredRemoval();
+        assertFalse(token.mIsExiting);
         // Verify that the token is no-longer attached to its parent
         assertNull(token.getParent());
         // Verify that the token windows are no longer attached to it.
diff --git a/services/usb/java/com/UsbDataSignalDisableRequesters.java b/services/usb/java/com/UsbDataSignalDisableRequesters.java
new file mode 100644
index 0000000..d4d6492
--- /dev/null
+++ b/services/usb/java/com/UsbDataSignalDisableRequesters.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2024 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.usb;
+
+import android.util.ArraySet;
+
+/**
+ * A helper class to store and manage the request for disabling USB port data signaling.
+ *
+ * External requesters are identified by UIDs.
+ * Internal requesters are identified by a reason code enumerated in UsbManagerInternal.
+ *
+ * @hide
+ */
+public final class UsbDataSignalDisableRequesters {
+    final ArraySet<Integer> mExternalUids = new ArraySet<>();
+    final ArraySet<Integer> mInternalReasons  = new ArraySet<>();
+
+    public boolean isEmpty() {
+        return mExternalUids.isEmpty() && mInternalReasons.isEmpty();
+    }
+}
\ No newline at end of file
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index 6c1e1a4..1294945 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -1027,28 +1027,36 @@
             boolean enabled = (mCurrentFunctions & UsbManager.FUNCTION_MIDI) != 0;
             if (enabled != mMidiEnabled) {
                 if (enabled) {
+                    boolean midiDeviceFound = false;
                     if (android.hardware.usb.flags.Flags.enableUsbSysfsMidiIdentification()) {
                         try {
                             getMidiCardDevice();
+                            midiDeviceFound = true;
                         } catch (FileNotFoundException e) {
-                            Slog.e(TAG, "could not identify MIDI device", e);
-                            enabled = false;
+                            Slog.w(TAG, "could not identify MIDI device", e);
                         }
-                    } else {
+                    }
+                    // For backward compatibility with older kernels without
+                    // https://lore.kernel.org/r/20240307030922.3573161-1-royluo@google.com
+                    if (!midiDeviceFound) {
                         Scanner scanner = null;
                         try {
                             scanner = new Scanner(new File(MIDI_ALSA_PATH));
                             mMidiCard = scanner.nextInt();
                             mMidiDevice = scanner.nextInt();
+                            midiDeviceFound = true;
                         } catch (FileNotFoundException e) {
                             Slog.e(TAG, "could not open MIDI file", e);
-                            enabled = false;
                         } finally {
                             if (scanner != null) {
                                 scanner.close();
                             }
                         }
                     }
+                    if (!midiDeviceFound) {
+                        Slog.e(TAG, "Failed to enable MIDI function");
+                        enabled = false;
+                    }
                 }
                 mMidiEnabled = enabled;
             }
diff --git a/services/usb/java/com/android/server/usb/UsbManagerInternal.java b/services/usb/java/com/android/server/usb/UsbManagerInternal.java
new file mode 100644
index 0000000..c97df6b
--- /dev/null
+++ b/services/usb/java/com/android/server/usb/UsbManagerInternal.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 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.usb;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.hardware.usb.IUsbOperationInternal;
+import android.hardware.usb.UsbPort;
+import android.util.ArraySet;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * UsbManagerInternal provides internal APIs for the UsbService to
+ * reduce IPC overhead costs and support internal USB data signal stakers.
+ *
+ * @hide Only for use within the system server.
+ */
+public abstract class UsbManagerInternal {
+
+  public static final int OS_USB_DISABLE_REASON_AAPM = 0;
+
+  @Retention(RetentionPolicy.SOURCE)
+  @IntDef(value = {OS_USB_DISABLE_REASON_AAPM})
+  public @interface OsUsbDisableReason {
+  }
+
+  public abstract boolean enableUsbData(String portId, boolean enable,
+      int operationId, IUsbOperationInternal callback, @OsUsbDisableReason int disableReason);
+
+  public abstract UsbPort[] getPorts();
+
+}
\ No newline at end of file
diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java
index 9470c0a..ba9dff6 100644
--- a/services/usb/java/com/android/server/usb/UsbService.java
+++ b/services/usb/java/com/android/server/usb/UsbService.java
@@ -46,6 +46,7 @@
 import android.hardware.usb.UsbManager;
 import android.hardware.usb.UsbPort;
 import android.hardware.usb.UsbPortStatus;
+
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.Looper;
@@ -69,6 +70,7 @@
 import com.android.internal.util.dump.DualDumpOutputStream;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.server.FgThread;
+import com.android.server.LocalServices;
 import com.android.server.SystemServerInitThreadPool;
 import com.android.server.SystemService;
 
@@ -165,8 +167,10 @@
     private final Object mLock = new Object();
 
     // Key: USB port id
-    // Value: A set of UIDs of requesters who request disabling usb data
-    private final ArrayMap<String, ArraySet<Integer>> mUsbDisableRequesters = new ArrayMap<>();
+    // Value: UsbDataSignalDisableRequesters: UIDs of requesters who request
+    // disabling usb data and disable request reasons by local service callers
+    private final ArrayMap<String, UsbDataSignalDisableRequesters>
+        mUsbDisableRequesters = new ArrayMap<>();
 
     /**
      * @return the {@link UsbUserSettingsManager} for the given userId
@@ -221,6 +225,9 @@
         filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
         filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
         mContext.registerReceiverAsUser(receiver, UserHandle.ALL, filter, null, null);
+        if(android.hardware.usb.flags.Flags.enableUsbDataSignalStakingInternal()) {
+            LocalServices.addService(UsbManagerInternal.class, new UsbManagerInternalImpl());
+        }
     }
 
     // Ideally we should use the injector pattern so we wouldn't need this constructor  for test
@@ -236,6 +243,10 @@
         mUserManager = userManager;
         mSettingsManager = usbSettingsManager;
         mPermissionManager = new UsbPermissionManager(context, this);
+
+        if(android.hardware.usb.flags.Flags.enableUsbDataSignalStakingInternal()) {
+            LocalServices.addService(UsbManagerInternal.class, new UsbManagerInternalImpl());
+        }
     }
 
     /**
@@ -903,15 +914,21 @@
     @Override
     public boolean enableUsbData(String portId, boolean enable, int operationId,
                                  IUsbOperationInternal callback) {
-        return enableUsbDataInternal(portId, enable, operationId, callback, Binder.getCallingUid());
+        return enableUsbDataInternal(portId, enable, operationId, callback,
+            Binder.getCallingUid(), false);
     }
 
     /**
-     *  Internal function abstracted for testing with callerUid
+     *  Manages the enablement of USB data. Requester field could mean two things:
+     *  1. UID of the app that requested USB data to be disabled if caller is external.
+     *  2. Enumberated disable request reason if the caller is internal.
+     *
+     *  For internal requests, isInternalRequest should be set to true. Since
+     * internal requests all share the same UID, the request managed separately.
      */
     @VisibleForTesting
     boolean enableUsbDataInternal(String portId, boolean enable, int operationId,
-            IUsbOperationInternal callback, int callerUid) {
+            IUsbOperationInternal callback, int requester, boolean isInternalRequest) {
         Objects.requireNonNull(portId, "enableUsbData: portId must not be null. opId:"
                 + operationId);
         Objects.requireNonNull(callback, "enableUsbData: callback must not be null. opId:"
@@ -919,7 +936,7 @@
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
 
         if (android.hardware.usb.flags.Flags.enableUsbDataSignalStaking()) {
-            if (!shouldUpdateUsbSignaling(portId, enable, callerUid)) {
+            if (!shouldUpdateUsbSignaling(portId, enable, requester, isInternalRequest)) {
                 try {
                     callback.onOperationComplete(USB_OPERATION_ERROR_INTERNAL);
                 } catch (RemoteException e) {
@@ -949,25 +966,42 @@
     }
 
     /**
+     * Function to determine if USB data signaling state should be updated.
+     * Depending on if request is internal, input requester should be UID or enumerated disable
+     * reason.
+     *
      * If enable = true, exclude UID from update list.
      * If enable = false, include UID in update list.
      * Return false if enable = true and the list is empty (no updates).
      * Return true otherwise (let downstream decide on updates).
      */
-    private boolean shouldUpdateUsbSignaling(String portId, boolean enable, int uid) {
+    private boolean shouldUpdateUsbSignaling(String portId, boolean enable,
+        int requester, boolean isInternalRequest) {
+        if(isInternalRequest &&
+               !android.hardware.usb.flags.Flags.enableUsbDataSignalStakingInternal())
+          return false;
         synchronized (mUsbDisableRequesters) {
             if (!mUsbDisableRequesters.containsKey(portId)) {
-                mUsbDisableRequesters.put(portId, new ArraySet<>());
+                mUsbDisableRequesters.put(portId, new UsbDataSignalDisableRequesters());
             }
-
-            ArraySet<Integer> uidsOfDisableRequesters = mUsbDisableRequesters.get(portId);
+            UsbDataSignalDisableRequesters disableRequests =
+                mUsbDisableRequesters.get(portId);
 
             if (enable) {
-                uidsOfDisableRequesters.remove(uid);
-                // re-enable USB port (return true) if there are no other disable requesters
-                return uidsOfDisableRequesters.isEmpty();
+                if(isInternalRequest) {
+                    disableRequests.mInternalReasons.remove(requester);
+                } else {
+                    disableRequests.mExternalUids.remove(requester);
+                }
+                // re-enable USB port (return true) if there are no other
+                // disable requesters
+                return disableRequests.isEmpty();
             } else {
-                uidsOfDisableRequesters.add(uid);
+                if(isInternalRequest) {
+                    disableRequests.mInternalReasons.add(requester);
+                } else {
+                    disableRequests.mExternalUids.add(requester);
+                }
             }
         }
         return true;
@@ -976,7 +1010,8 @@
     @Override
     public void enableUsbDataWhileDocked(String portId, int operationId,
                                          IUsbOperationInternal callback) {
-        enableUsbDataWhileDockedInternal(portId, operationId, callback, Binder.getCallingUid());
+        enableUsbDataWhileDockedInternal(portId, operationId, callback,
+            Binder.getCallingUid(), false);
     }
 
     /**
@@ -984,7 +1019,7 @@
      */
     @VisibleForTesting
      void enableUsbDataWhileDockedInternal(String portId, int operationId,
-            IUsbOperationInternal callback, int callerUid) {
+            IUsbOperationInternal callback, int callerUid, boolean isInternalRequest) {
         Objects.requireNonNull(portId, "enableUsbDataWhileDocked: portId must not be null. opId:"
                 + operationId);
         Objects.requireNonNull(callback,
@@ -993,7 +1028,7 @@
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
 
         if (android.hardware.usb.flags.Flags.enableUsbDataSignalStaking()) {
-            if (!shouldUpdateUsbSignaling(portId, true, callerUid)) {
+            if (!shouldUpdateUsbSignaling(portId, true, callerUid, isInternalRequest)) {
                 try {
                     callback.onOperationComplete(USB_OPERATION_ERROR_INTERNAL);
                 } catch (RemoteException e) {
@@ -1455,10 +1490,11 @@
         public void onUidRemoved(int uid) {
             synchronized (mUsbDisableRequesters) {
                 for (String portId : mUsbDisableRequesters.keySet()) {
-                    ArraySet<Integer> disabledUid = mUsbDisableRequesters.get(portId);
-                    if (disabledUid != null) {
-                        disabledUid.remove(uid);
-                        if (disabledUid.isEmpty()) {
+                    UsbDataSignalDisableRequesters disableRequesters =
+                        mUsbDisableRequesters.get(portId);
+                    if (disableRequesters != null) {
+                        disableRequesters.mExternalUids.remove(uid);
+                        if (disableRequesters.isEmpty()) {
                             enableUsbData(portId, true, PACKAGE_MONITOR_OPERATION_ID,
                                     new IUsbOperationInternal.Default());
                         }
@@ -1496,4 +1532,19 @@
             }
         }
     }
+
+    private class UsbManagerInternalImpl extends UsbManagerInternal {
+        @Override
+        public boolean enableUsbData(String portId, boolean enable,
+                int operationId, IUsbOperationInternal callback,
+            @OsUsbDisableReason int disableReason) {
+            return enableUsbDataInternal(portId, enable, operationId, callback,
+                disableReason, true);
+        }
+
+        @Override
+        public UsbPort[] getPorts() {
+            return mPortManager.getPorts();
+        }
+    }
 }
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
index dc5f6e9..fb031bd 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
@@ -842,7 +842,7 @@
             return;
         }
 
-        model.setRequested(config.allowMultipleTriggers);
+        model.setRequested(config.isAllowMultipleTriggers());
         // TODO: Remove this block if the lower layer supports multiple triggers.
         if (model.isRequested()) {
             updateRecognitionLocked(model, true);
@@ -964,7 +964,7 @@
         RecognitionConfig config = modelData.getRecognitionConfig();
         if (config != null) {
             // Whether we should continue by starting this again.
-            modelData.setRequested(config.allowMultipleTriggers);
+            modelData.setRequested(config.isAllowMultipleTriggers());
         }
         // TODO: Remove this block if the lower layer supports multiple triggers.
         if (modelData.isRequested()) {
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
index 862aff9..1a42e80 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
@@ -687,6 +687,7 @@
         @Override
         public int startRecognitionForService(ParcelUuid soundModelId, Bundle params,
                 ComponentName detectionService, SoundTrigger.RecognitionConfig config) {
+            final UserHandle userHandle = Binder.getCallingUserHandle();
             mEventLogger.enqueue(new SessionEvent(Type.START_RECOGNITION_SERVICE,
                         getUuid(soundModelId)));
             try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
@@ -699,7 +700,7 @@
 
                 IRecognitionStatusCallback callback =
                         new RemoteSoundTriggerDetectionService(soundModelId.getUuid(), params,
-                                detectionService, Binder.getCallingUserHandle(), config);
+                                detectionService, userHandle, config);
 
                 synchronized (mLock) {
                     SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid());
@@ -1439,7 +1440,7 @@
                 runOrAddOperation(new Operation(
                         // always execute:
                         () -> {
-                            if (!mRecognitionConfig.allowMultipleTriggers) {
+                            if (!mRecognitionConfig.isAllowMultipleTriggers()) {
                                 // Unregister this remoteService once op is done
                                 synchronized (mCallbacksLock) {
                                     mCallbacks.remove(mPuuid.getUuid());
diff --git a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
index ff9cba2..f001232 100644
--- a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
+++ b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
@@ -33,6 +33,7 @@
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.flags.Flags;
 import com.android.internal.telephony.util.TelephonyUtils;
 
 import java.util.ArrayList;
@@ -185,11 +186,7 @@
                 if (hasPrivileges) {
                     // Only update enabled state for the app on /system. Once it has been
                     // updated we shouldn't touch it.
-                    if (!isUpdatedSystemApp(ai) && enabledSetting
-                            == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
-                            || enabledSetting
-                            == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
-                            || (ai.flags & ApplicationInfo.FLAG_INSTALLED) == 0) {
+                    if (shouldUpdateEnabledState(ai, enabledSetting)) {
                         Log.i(TAG, "Update state (" + packageName + "): ENABLED for user "
                                 + userId);
                         context.createContextAsUser(UserHandle.of(userId), 0)
@@ -330,6 +327,21 @@
         }
     }
 
+    private static boolean shouldUpdateEnabledState(ApplicationInfo appInfo, int enabledSetting) {
+        if (Flags.cleanupCarrierAppUpdateEnabledStateLogic()) {
+            return !isUpdatedSystemApp(appInfo)
+                    && (enabledSetting == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
+                            || enabledSetting
+                                    == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
+                            || (appInfo.flags & ApplicationInfo.FLAG_INSTALLED) == 0);
+        } else {
+            return !isUpdatedSystemApp(appInfo)
+                            && enabledSetting == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
+                    || enabledSetting == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
+                    || (appInfo.flags & ApplicationInfo.FLAG_INSTALLED) == 0;
+        }
+    }
+
     /**
      * Returns the list of "default" carrier apps.
      *
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 3e226cc..f01cfc1 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -2298,13 +2298,9 @@
      *
      * See {@link #getImei(int)} for details on the required permissions and behavior
      * when the caller does not hold sufficient permissions.
-     *
-     * @throws UnsupportedOperationException If the device does not have
-     *          {@link PackageManager#FEATURE_TELEPHONY_GSM}.
      */
     @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
     @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
-    @RequiresFeature(PackageManager.FEATURE_TELEPHONY_GSM)
     public String getImei() {
         return getImei(getSlotIndex());
     }
@@ -2343,13 +2339,9 @@
      * </ul>
      *
      * @param slotIndex of which IMEI is returned
-     *
-     * @throws UnsupportedOperationException If the device does not have
-     *          {@link PackageManager#FEATURE_TELEPHONY_GSM}.
      */
     @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
     @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
-    @RequiresFeature(PackageManager.FEATURE_TELEPHONY_GSM)
     public String getImei(int slotIndex) {
         ITelephony telephony = getITelephony();
         if (telephony == null) return null;
@@ -2366,11 +2358,7 @@
     /**
      * Returns the Type Allocation Code from the IMEI. Return null if Type Allocation Code is not
      * available.
-     *
-     * @throws UnsupportedOperationException If the device does not have
-     *          {@link PackageManager#FEATURE_TELEPHONY_GSM}.
      */
-    @RequiresFeature(PackageManager.FEATURE_TELEPHONY_GSM)
     @Nullable
     public String getTypeAllocationCode() {
         return getTypeAllocationCode(getSlotIndex());
@@ -2381,11 +2369,7 @@
      * available.
      *
      * @param slotIndex of which Type Allocation Code is returned
-     *
-     * @throws UnsupportedOperationException If the device does not have
-     *          {@link PackageManager#FEATURE_TELEPHONY_GSM}.
      */
-    @RequiresFeature(PackageManager.FEATURE_TELEPHONY_GSM)
     @Nullable
     public String getTypeAllocationCode(int slotIndex) {
         ITelephony telephony = getITelephony();
@@ -2757,7 +2741,7 @@
 
     /**
      * Returns a constant indicating the device phone type.  This
-     * indicates the type of radio used to transmit voice calls.
+     * indicates the type of radio used to transmit voice/data calls.
      *
      * @see #PHONE_TYPE_NONE
      * @see #PHONE_TYPE_GSM
@@ -2769,7 +2753,7 @@
      */
     @RequiresFeature(PackageManager.FEATURE_TELEPHONY)
     public int getPhoneType() {
-        if (!isVoiceCapable()) {
+        if (!isVoiceCapable() && !isDataCapable()) {
             return PHONE_TYPE_NONE;
         }
         return getCurrentPhoneType();
@@ -10613,20 +10597,31 @@
         return null;
     }
 
-    /** @hide */
+    /**
+     * Get the names of packages with carrier privileges for the current subscription.
+     *
+     * @throws UnsupportedOperationException If the device does not have {@link
+     *     PackageManager#FEATURE_TELEPHONY_SUBSCRIPTION}
+     * @hide
+     */
+    @FlaggedApi(android.os.Flags.FLAG_MAINLINE_VCN_PLATFORM_API)
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
     @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
-    public List<String> getPackagesWithCarrierPrivileges() {
+    @RequiresFeature(PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION)
+    @NonNull
+    public Set<String> getPackagesWithCarrierPrivileges() {
+        final Set<String> result = new HashSet<>();
         try {
             ITelephony telephony = getITelephony();
             if (telephony != null) {
-                return telephony.getPackagesWithCarrierPrivileges(getPhoneId());
+                result.addAll(telephony.getPackagesWithCarrierPrivileges(getPhoneId()));
             }
         } catch (RemoteException ex) {
             Rlog.e(TAG, "getPackagesWithCarrierPrivileges RemoteException", ex);
         } catch (NullPointerException ex) {
             Rlog.e(TAG, "getPackagesWithCarrierPrivileges NPE", ex);
         }
-        return Collections.EMPTY_LIST;
+        return result;
     }
 
     /**
@@ -19367,12 +19362,9 @@
      * </ul>
      *
      * @return Primary IMEI of type string
-     * @throws UnsupportedOperationException If the device does not have
-     *          {@link PackageManager#FEATURE_TELEPHONY_GSM}.
      * @throws SecurityException if the caller does not have the required permission/privileges
      */
     @NonNull
-    @RequiresFeature(PackageManager.FEATURE_TELEPHONY_GSM)
     public String getPrimaryImei() {
         try {
             ITelephony telephony = getITelephony();
@@ -19426,4 +19418,48 @@
                 return "UNKNOWN(" + state + ")";
         }
     }
+
+    /**
+     * This API can be used by only CTS to override the Euicc UI component.
+     *
+     * @param componentName ui component to be launched for testing. {@code null} to reset.
+     *
+     * @hide
+     */
+    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+    public void setTestEuiccUiComponent(@Nullable ComponentName componentName) {
+        try {
+            ITelephony telephony = getITelephony();
+            if (telephony == null) {
+                Rlog.e(TAG, "setTestEuiccUiComponent(): ITelephony instance is NULL");
+                throw new IllegalStateException("Telephony service not available.");
+            }
+            telephony.setTestEuiccUiComponent(componentName);
+        } catch (RemoteException ex) {
+            Rlog.e(TAG, "setTestEuiccUiComponent() RemoteException : " + ex);
+            throw ex.rethrowAsRuntimeException();
+        }
+    }
+
+    /**
+     * This API can be used by only CTS to retrieve the Euicc UI component.
+     *
+     * @return The Euicc UI component for testing. {@code null} if not available.
+     * @hide
+     */
+    @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+    @Nullable
+    public ComponentName getTestEuiccUiComponent() {
+        try {
+            ITelephony telephony = getITelephony();
+            if (telephony == null) {
+                Rlog.e(TAG, "getTestEuiccUiComponent(): ITelephony instance is NULL");
+                throw new IllegalStateException("Telephony service not available.");
+            }
+            return telephony.getTestEuiccUiComponent();
+        } catch (RemoteException ex) {
+            Rlog.e(TAG, "getTestEuiccUiComponent() RemoteException : " + ex);
+            throw ex.rethrowAsRuntimeException();
+        }
+    }
 }
diff --git a/telephony/java/android/telephony/UiccAccessRule.java b/telephony/java/android/telephony/UiccAccessRule.java
index 38b551b..65e3254 100644
--- a/telephony/java/android/telephony/UiccAccessRule.java
+++ b/telephony/java/android/telephony/UiccAccessRule.java
@@ -169,18 +169,21 @@
     }
 
     private final byte[] mCertificateHash;
+    private final int mCertificateHashHashCode;
     private final @Nullable String mPackageName;
     // This bit is not currently used, but reserved for future use.
     private final long mAccessType;
 
     public UiccAccessRule(byte[] certificateHash, @Nullable String packageName, long accessType) {
         this.mCertificateHash = certificateHash;
+        this.mCertificateHashHashCode = getCertificateHashHashCode(this.mCertificateHash);
         this.mPackageName = packageName;
         this.mAccessType = accessType;
     }
 
     UiccAccessRule(Parcel in) {
         mCertificateHash = in.createByteArray();
+        mCertificateHashHashCode = getCertificateHashHashCode(mCertificateHash);
         mPackageName = in.readString();
         mAccessType = in.readLong();
     }
@@ -247,7 +250,7 @@
     public int getCarrierPrivilegeStatus(Signature signature, String packageName) {
         byte[] certHash256 = getCertHash(signature, "SHA-256");
         // Check SHA-256 first as it's the new standard.
-        if (matches(certHash256, packageName)) {
+        if (hasMatchingCertificateHashAndPackageName(certHash256, packageName)) {
             return TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
         }
 
@@ -255,7 +258,7 @@
         // in the near future when GPD_SPE_068 fully replaces GPD_SPE_013.
         if (this.mCertificateHash.length == 20) {
             byte[] certHash = getCertHash(signature, "SHA-1");
-            if (matches(certHash, packageName)) {
+            if (hasMatchingCertificateHashAndPackageName(certHash, packageName)) {
                 return TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
             }
         }
@@ -267,15 +270,41 @@
      * Returns true if the given certificate and package name match this rule's values.
      * @hide
      */
-    public boolean matches(@Nullable String certHash, @Nullable String packageName) {
-        return matches(IccUtils.hexStringToBytes(certHash), packageName);
+    public boolean hasMatchingCertificateHashAndPackageName(
+            @Nullable String certHash, @Nullable String packageName) {
+        return hasMatchingCertificateHashAndPackageName(
+                IccUtils.hexStringToBytes(certHash), packageName);
     }
 
-    private boolean matches(byte[] certHash, String packageName) {
+    /**
+     * Returns true if the given certificate and package name match this rule's values.
+     * @hide
+     */
+    public boolean hasMatchingCertificateHashAndPackageName(
+            @Nullable byte[] certHash, @Nullable String packageName) {
         return certHash != null && Arrays.equals(this.mCertificateHash, certHash) &&
                 (TextUtils.isEmpty(this.mPackageName) || this.mPackageName.equals(packageName));
     }
 
+    /**
+     * Returns true if the given certificate hash hash
+     * and package name both match this rules' values.
+     *
+     * @hide
+     */
+    public boolean hasMatchingCertificateHashHashAndPackageName(
+            int certHashHashCode, String packageName) {
+        return certHashHashCode == this.mCertificateHashHashCode
+                && (TextUtils.isEmpty(this.mPackageName) || this.mPackageName.equals(packageName));
+    }
+
+    /**
+     * @hide
+     */
+    public static int getCertificateHashHashCode(byte[] certHash) {
+        return Arrays.hashCode(certHash);
+    }
+
     @Override
     public boolean equals(@Nullable Object obj) {
         if (this == obj) {
diff --git a/telephony/java/android/telephony/data/ApnSetting.java b/telephony/java/android/telephony/data/ApnSetting.java
index 44d3fca..567314b 100644
--- a/telephony/java/android/telephony/data/ApnSetting.java
+++ b/telephony/java/android/telephony/data/ApnSetting.java
@@ -128,6 +128,12 @@
     /** APN type for RCS (Rich Communication Services). */
     @FlaggedApi(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG)
     public static final int TYPE_RCS = ApnTypes.RCS;
+    /** APN type for OEM_PAID networks (Automotive PANS) */
+    @FlaggedApi(Flags.FLAG_OEM_PAID_PRIVATE)
+    public static final int TYPE_OEM_PAID = 1 << 16; // TODO(b/366194627): ApnTypes.OEM_PAID;
+    /** APN type for OEM_PRIVATE networks (Automotive PANS) */
+    @FlaggedApi(Flags.FLAG_OEM_PAID_PRIVATE)
+    public static final int TYPE_OEM_PRIVATE = 1 << 17; // TODO(b/366194627): ApnTypes.OEM_PRIVATE;
 
     /** @hide */
     @IntDef(flag = true, prefix = {"TYPE_"}, value = {
@@ -146,7 +152,9 @@
             TYPE_BIP,
             TYPE_VSIM,
             TYPE_ENTERPRISE,
-            TYPE_RCS
+            TYPE_RCS,
+            TYPE_OEM_PAID,
+            TYPE_OEM_PRIVATE,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ApnType {
@@ -375,6 +383,27 @@
     @SystemApi
     public static final String TYPE_RCS_STRING = "rcs";
 
+    /**
+     * APN type for OEM_PAID networks (Automotive PANS)
+     *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
+     * @hide
+     */
+    @FlaggedApi(Flags.FLAG_OEM_PAID_PRIVATE)
+    @SystemApi
+    public static final String TYPE_OEM_PAID_STRING = "oem_paid";
+
+    /**
+     * APN type for OEM_PRIVATE networks (Automotive PANS)
+     *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
+     * @hide
+     */
+    @FlaggedApi(Flags.FLAG_OEM_PAID_PRIVATE)
+    @SystemApi
+    public static final String TYPE_OEM_PRIVATE_STRING = "oem_private";
 
     /** @hide */
     @IntDef(prefix = { "AUTH_TYPE_" }, value = {
@@ -489,6 +518,8 @@
         APN_TYPE_STRING_MAP.put(TYPE_VSIM_STRING, TYPE_VSIM);
         APN_TYPE_STRING_MAP.put(TYPE_BIP_STRING, TYPE_BIP);
         APN_TYPE_STRING_MAP.put(TYPE_RCS_STRING, TYPE_RCS);
+        APN_TYPE_STRING_MAP.put(TYPE_OEM_PAID_STRING, TYPE_OEM_PAID);
+        APN_TYPE_STRING_MAP.put(TYPE_OEM_PRIVATE_STRING, TYPE_OEM_PRIVATE);
 
         APN_TYPE_INT_MAP = new ArrayMap<>();
         APN_TYPE_INT_MAP.put(TYPE_DEFAULT, TYPE_DEFAULT_STRING);
@@ -507,6 +538,8 @@
         APN_TYPE_INT_MAP.put(TYPE_VSIM, TYPE_VSIM_STRING);
         APN_TYPE_INT_MAP.put(TYPE_BIP, TYPE_BIP_STRING);
         APN_TYPE_INT_MAP.put(TYPE_RCS, TYPE_RCS_STRING);
+        APN_TYPE_INT_MAP.put(TYPE_OEM_PAID, TYPE_OEM_PAID_STRING);
+        APN_TYPE_INT_MAP.put(TYPE_OEM_PRIVATE, TYPE_OEM_PRIVATE_STRING);
 
         PROTOCOL_STRING_MAP = new ArrayMap<>();
         PROTOCOL_STRING_MAP.put("IP", PROTOCOL_IP);
@@ -2383,7 +2416,8 @@
         public ApnSetting build() {
             if ((mApnTypeBitmask & (TYPE_DEFAULT | TYPE_MMS | TYPE_SUPL | TYPE_DUN | TYPE_HIPRI
                     | TYPE_FOTA | TYPE_IMS | TYPE_CBS | TYPE_IA | TYPE_EMERGENCY | TYPE_MCX
-                    | TYPE_XCAP | TYPE_VSIM | TYPE_BIP | TYPE_ENTERPRISE | TYPE_RCS)) == 0
+                    | TYPE_XCAP | TYPE_VSIM | TYPE_BIP | TYPE_ENTERPRISE | TYPE_RCS | TYPE_OEM_PAID
+                    | TYPE_OEM_PRIVATE)) == 0
                 || TextUtils.isEmpty(mApnName) || TextUtils.isEmpty(mEntryName)) {
                 return null;
             }
diff --git a/telephony/java/android/telephony/satellite/SatelliteManager.java b/telephony/java/android/telephony/satellite/SatelliteManager.java
index 4eefaac..49ca6f3 100644
--- a/telephony/java/android/telephony/satellite/SatelliteManager.java
+++ b/telephony/java/android/telephony/satellite/SatelliteManager.java
@@ -249,6 +249,13 @@
     public static final String KEY_PROVISION_SATELLITE_TOKENS = "provision_satellite";
 
     /**
+     * Bundle key to get the response from
+     * {@link #deprovisionSatellite(List, Executor, OutcomeReceiver)}.
+     * @hide
+     */
+    public static final String KEY_DEPROVISION_SATELLITE_TOKENS = "deprovision_satellite";
+
+    /**
      * The request was successfully processed.
      */
     @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
@@ -1113,6 +1120,12 @@
      * @hide
      */
     public static final int DATAGRAM_TYPE_SMS = 6;
+    /**
+     * Datagram type indicating that the message to be sent is an SMS checking
+     * for pending incoming SMS.
+     * @hide
+     */
+    public static final int DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS = 7;
 
     /** @hide */
     @IntDef(prefix = "DATAGRAM_TYPE_", value = {
@@ -1122,7 +1135,8 @@
             DATAGRAM_TYPE_KEEP_ALIVE,
             DATAGRAM_TYPE_LAST_SOS_MESSAGE_STILL_NEED_HELP,
             DATAGRAM_TYPE_LAST_SOS_MESSAGE_NO_HELP_NEEDED,
-            DATAGRAM_TYPE_SMS
+            DATAGRAM_TYPE_SMS,
+            DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface DatagramType {}
@@ -2784,6 +2798,61 @@
         }
     }
 
+    /**
+     * Deliver the list of deprovisioned satellite subscriber infos.
+     *
+     * @param list The list of deprovisioned satellite subscriber infos.
+     * @param executor The executor on which the callback will be called.
+     * @param callback The callback object to which the result will be delivered.
+     *
+     * @throws SecurityException if the caller doesn't have required permission.
+     * @hide
+     */
+    @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION)
+    @FlaggedApi(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN)
+    public void deprovisionSatellite(@NonNull List<SatelliteSubscriberInfo> list,
+            @NonNull @CallbackExecutor Executor executor,
+            @NonNull OutcomeReceiver<Boolean, SatelliteException> callback) {
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(callback);
+
+        try {
+            ITelephony telephony = getITelephony();
+            if (telephony != null) {
+                ResultReceiver receiver = new ResultReceiver(null) {
+                    @Override
+                    protected void onReceiveResult(int resultCode, Bundle resultData) {
+                        if (resultCode == SATELLITE_RESULT_SUCCESS) {
+                            if (resultData.containsKey(KEY_DEPROVISION_SATELLITE_TOKENS)) {
+                                boolean isUpdated =
+                                        resultData.getBoolean(KEY_DEPROVISION_SATELLITE_TOKENS);
+                                executor.execute(() -> Binder.withCleanCallingIdentity(() ->
+                                        callback.onResult(isUpdated)));
+                            } else {
+                                loge("KEY_DEPROVISION_SATELLITE_TOKENS does not exist.");
+                                executor.execute(() -> Binder.withCleanCallingIdentity(() ->
+                                        callback.onError(new SatelliteException(
+                                                SATELLITE_RESULT_REQUEST_FAILED))));
+                            }
+                        } else {
+                            executor.execute(() -> Binder.withCleanCallingIdentity(() ->
+                                    callback.onError(new SatelliteException(resultCode))));
+                        }
+                    }
+                };
+                telephony.deprovisionSatellite(list, receiver);
+            } else {
+                loge("deprovisionSatellite() invalid telephony");
+                executor.execute(() -> Binder.withCleanCallingIdentity(() -> callback.onError(
+                        new SatelliteException(SATELLITE_RESULT_ILLEGAL_STATE))));
+            }
+        } catch (RemoteException ex) {
+            loge("deprovisionSatellite() RemoteException: " + ex);
+            executor.execute(() -> Binder.withCleanCallingIdentity(() -> callback.onError(
+                    new SatelliteException(SATELLITE_RESULT_ILLEGAL_STATE))));
+        }
+    }
+
     @Nullable
     private static ITelephony getITelephony() {
         ITelephony binder = ITelephony.Stub.asInterface(TelephonyFrameworkInitializer
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index e57c207..61f0146 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -3017,6 +3017,14 @@
     boolean setSatelliteListeningTimeoutDuration(in long timeoutMillis);
 
     /**
+     * This API can be used by only CTS to control ingoring cellular service state event.
+     *
+     * @param enabled Whether to enable boolean config.
+     * @return {@code true} if the value is set successfully, {@code false} otherwise.
+     */
+    boolean setSatelliteIgnoreCellularServiceState(in boolean enabled);
+
+    /**
      * This API can be used by only CTS to update satellite pointing UI app package and class names.
      *
      * @param packageName The package name of the satellite pointing UI app.
@@ -3409,4 +3417,42 @@
      * @hide
      */
     boolean setSatelliteSubscriberIdListChangedIntentComponent(in String name);
+
+    /**
+     * This API can be used by only CTS to override the Euicc UI component.
+     *
+     * @param componentName ui component to be launched for testing
+     * @hide
+     */
+    void setTestEuiccUiComponent(in ComponentName componentName);
+
+    /**
+     * This API can be used by only CTS to retrieve the Euicc UI component.
+     *
+     * @return The Euicc UI component for testing.
+     * @hide
+     */
+    ComponentName getTestEuiccUiComponent();
+
+    /**
+     * This API can be used only for test purpose to override the carrier romaing Ntn eligibility
+     *
+     * @param status to update Ntn Eligibility.
+     * @param resetRequired to reset the overridden flag in satellite controller.
+     * @return {@code true} if the shell command is successful, {@code false} otherwise.
+     * @hide
+     */
+    boolean overrideCarrierRoamingNtnEligibilityChanged(
+            in boolean status, in boolean resetRequired);
+
+    /**
+     * Deliver the list of deprovisioned satellite subscriber infos.
+     *
+     * @param list The list of deprovisioned satellite subscriber infos.
+     * @param result The result receiver that returns whether deliver success or fail.
+     * @hide
+     */
+    @JavaPassthrough(annotation="@android.annotation.RequiresPermission("
+            + "android.Manifest.permission.SATELLITE_COMMUNICATION)")
+    void deprovisionSatellite(in List<SatelliteSubscriberInfo> list, in ResultReceiver result);
 }
diff --git a/tests/AttestationVerificationTest/src/android/security/attestationverification/PeerDeviceSystemAttestationVerificationTest.kt b/tests/AttestationVerificationTest/src/android/security/attestationverification/PeerDeviceSystemAttestationVerificationTest.kt
index ad95fbc..88ebf3e 100644
--- a/tests/AttestationVerificationTest/src/android/security/attestationverification/PeerDeviceSystemAttestationVerificationTest.kt
+++ b/tests/AttestationVerificationTest/src/android/security/attestationverification/PeerDeviceSystemAttestationVerificationTest.kt
@@ -2,10 +2,11 @@
 
 import android.app.Activity
 import android.os.Bundle
+import android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_CERTS
+import android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS
 import android.security.attestationverification.AttestationVerificationManager.PARAM_CHALLENGE
 import android.security.attestationverification.AttestationVerificationManager.PARAM_PUBLIC_KEY
 import android.security.attestationverification.AttestationVerificationManager.PROFILE_PEER_DEVICE
-import android.security.attestationverification.AttestationVerificationManager.RESULT_FAILURE
 import android.security.attestationverification.AttestationVerificationManager.TYPE_CHALLENGE
 import android.security.attestationverification.AttestationVerificationManager.TYPE_PUBLIC_KEY
 import android.security.attestationverification.AttestationVerificationManager.TYPE_UNKNOWN
@@ -54,7 +55,7 @@
             future.complete(result)
         }
 
-        assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+        assertThat(future.getSoon()).isEqualTo(FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS)
     }
 
     @Test
@@ -66,7 +67,7 @@
             future.complete(result)
         }
 
-        assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+        assertThat(future.getSoon()).isEqualTo(FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS)
     }
 
     @Test
@@ -80,7 +81,7 @@
             future.complete(result)
         }
 
-        assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+        assertThat(future.getSoon()).isEqualTo(FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS)
 
         val future2 = CompletableFuture<Int>()
         val challengeRequirements = Bundle()
@@ -90,7 +91,7 @@
             future2.complete(result)
         }
 
-        assertThat(future2.getSoon()).isEqualTo(RESULT_FAILURE)
+        assertThat(future2.getSoon()).isEqualTo(FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS)
     }
 
     @Test
@@ -104,7 +105,7 @@
             future.complete(result)
         }
 
-        assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+        assertThat(future.getSoon()).isEqualTo(FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS)
     }
 
     @Test
@@ -118,7 +119,7 @@
             future.complete(result)
         }
 
-        assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+        assertThat(future.getSoon()).isEqualTo(FLAG_FAILURE_CERTS)
     }
 
     @Test
@@ -131,7 +132,7 @@
             invalidAttestationByteArray, activity.mainExecutor) { result, _ ->
             future.complete(result)
         }
-        assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+        assertThat(future.getSoon()).isEqualTo(FLAG_FAILURE_CERTS)
     }
 
     private fun <T> CompletableFuture<T>.getSoon(): T {
diff --git a/tests/AttestationVerificationTest/src/android/security/attestationverification/SystemAttestationVerificationTest.kt b/tests/AttestationVerificationTest/src/android/security/attestationverification/SystemAttestationVerificationTest.kt
index 8f06b4a2..e77364d 100644
--- a/tests/AttestationVerificationTest/src/android/security/attestationverification/SystemAttestationVerificationTest.kt
+++ b/tests/AttestationVerificationTest/src/android/security/attestationverification/SystemAttestationVerificationTest.kt
@@ -2,6 +2,9 @@
 
 import android.os.Bundle
 import android.app.Activity
+import android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_CERTS
+import android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS
+import android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_UNSUPPORTED_PROFILE
 import androidx.test.ext.junit.rules.ActivityScenarioRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
@@ -14,9 +17,6 @@
 import android.security.attestationverification.AttestationVerificationManager.PARAM_CHALLENGE
 import android.security.attestationverification.AttestationVerificationManager.PROFILE_SELF_TRUSTED
 import android.security.attestationverification.AttestationVerificationManager.PROFILE_UNKNOWN
-import android.security.attestationverification.AttestationVerificationManager.RESULT_FAILURE
-import android.security.attestationverification.AttestationVerificationManager.RESULT_SUCCESS
-import android.security.attestationverification.AttestationVerificationManager.RESULT_UNKNOWN
 import android.security.attestationverification.AttestationVerificationManager.TYPE_PUBLIC_KEY
 import android.security.attestationverification.AttestationVerificationManager.TYPE_CHALLENGE
 import android.security.keystore.KeyGenParameterSpec
@@ -58,19 +58,19 @@
             future.complete(result)
         }
 
-        assertThat(future.getSoon()).isEqualTo(RESULT_UNKNOWN)
+        assertThat(future.getSoon()).isEqualTo(FLAG_FAILURE_UNSUPPORTED_PROFILE)
     }
 
     @Test
     fun verifyAttestation_returnsFailureWithEmptyAttestation() {
         val future = CompletableFuture<Int>()
-        val profile = AttestationProfile(PROFILE_SELF_TRUSTED)
-        avm.verifyAttestation(profile, TYPE_CHALLENGE, Bundle(), ByteArray(0),
-            activity.mainExecutor) { result, _ ->
+        val selfTrusted = TestSelfTrustedAttestation("test", "challengeStr")
+        avm.verifyAttestation(selfTrusted.profile, selfTrusted.localBindingType,
+            selfTrusted.requirements, ByteArray(0), activity.mainExecutor) { result, _ ->
             future.complete(result)
         }
 
-        assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+        assertThat(future.getSoon()).isEqualTo(FLAG_FAILURE_CERTS)
     }
 
     @Test
@@ -81,7 +81,7 @@
             Bundle(), selfTrusted.attestation, activity.mainExecutor) { result, _ ->
             future.complete(result)
         }
-        assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+        assertThat(future.getSoon()).isEqualTo(FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS)
     }
 
     @Test
@@ -92,7 +92,7 @@
             selfTrusted.requirements, selfTrusted.attestation, activity.mainExecutor) { result, _ ->
             future.complete(result)
         }
-        assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+        assertThat(future.getSoon()).isEqualTo(FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS)
     }
 
     @Test
@@ -106,7 +106,7 @@
             wrongKeyRequirements, selfTrusted.attestation, activity.mainExecutor) { result, _ ->
             future.complete(result)
         }
-        assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+        assertThat(future.getSoon()).isEqualTo(FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS)
     }
 
     @Test
@@ -119,7 +119,7 @@
             wrongChallengeRequirements, selfTrusted.attestation, activity.mainExecutor) {
                 result, _ -> future.complete(result)
         }
-        assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+        assertThat(future.getSoon()).isEqualTo(FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS)
     }
 
     // TODO(b/216144791): Add more failure tests for PROFILE_SELF_TRUSTED.
@@ -131,20 +131,7 @@
             selfTrusted.requirements, selfTrusted.attestation, activity.mainExecutor) { result, _ ->
             future.complete(result)
         }
-        assertThat(future.getSoon()).isEqualTo(RESULT_SUCCESS)
-    }
-
-    @Test
-    fun verifyToken_returnsUnknown() {
-        val future = CompletableFuture<Int>()
-        val profile = AttestationProfile(PROFILE_SELF_TRUSTED)
-        avm.verifyAttestation(profile, TYPE_PUBLIC_KEY, Bundle(), ByteArray(0),
-                activity.mainExecutor) { _, token ->
-            val result = avm.verifyToken(profile, TYPE_PUBLIC_KEY, Bundle(), token, null)
-            future.complete(result)
-        }
-
-        assertThat(future.getSoon()).isEqualTo(RESULT_UNKNOWN)
+        assertThat(future.getSoon()).isEqualTo(0)
     }
 
     @Test
diff --git a/tests/AttestationVerificationTest/src/com/android/server/security/AttestationVerificationPeerDeviceVerifierTest.kt b/tests/AttestationVerificationTest/src/com/android/server/security/AttestationVerificationPeerDeviceVerifierTest.kt
index 4712d6b..4d1a1a5 100644
--- a/tests/AttestationVerificationTest/src/com/android/server/security/AttestationVerificationPeerDeviceVerifierTest.kt
+++ b/tests/AttestationVerificationTest/src/com/android/server/security/AttestationVerificationPeerDeviceVerifierTest.kt
@@ -3,11 +3,12 @@
 import android.app.Activity
 import android.content.Context
 import android.os.Bundle
+import android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_CERTS
+import android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS
+import android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_PATCH_LEVEL_DIFF
 import android.security.attestationverification.AttestationVerificationManager.PARAM_CHALLENGE
 import android.security.attestationverification.AttestationVerificationManager.PARAM_MAX_PATCH_LEVEL_DIFF_MONTHS
 import android.security.attestationverification.AttestationVerificationManager.PARAM_PUBLIC_KEY
-import android.security.attestationverification.AttestationVerificationManager.RESULT_FAILURE
-import android.security.attestationverification.AttestationVerificationManager.RESULT_SUCCESS
 import android.security.attestationverification.AttestationVerificationManager.TYPE_CHALLENGE
 import android.security.attestationverification.AttestationVerificationManager.TYPE_PUBLIC_KEY
 import android.util.IndentingPrintWriter
@@ -72,7 +73,7 @@
             TYPE_CHALLENGE, challengeRequirements,
             TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray()
         )
-        assertThat(result).isEqualTo(RESULT_SUCCESS)
+        assertThat(result).isEqualTo(0)
     }
 
     @Test
@@ -88,7 +89,7 @@
             TYPE_CHALLENGE, challengeRequirements,
             TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray()
         )
-        assertThat(result).isEqualTo(RESULT_SUCCESS)
+        assertThat(result).isEqualTo(0)
     }
 
     @Test
@@ -108,7 +109,7 @@
             TYPE_PUBLIC_KEY, pkRequirements,
             TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray()
         )
-        assertThat(result).isEqualTo(RESULT_SUCCESS)
+        assertThat(result).isEqualTo(0)
     }
 
     @Test
@@ -126,7 +127,7 @@
             TEST_OWNED_BY_SYSTEM_FILENAME.fromPEMFileToByteArray()
         )
 
-        assertThat(result).isEqualTo(RESULT_SUCCESS)
+        assertThat(result).isEqualTo(0)
     }
 
     @Test
@@ -143,7 +144,7 @@
             TYPE_CHALLENGE, challengeRequirements,
             TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray()
         )
-        assertThat(result).isEqualTo(RESULT_FAILURE)
+        assertThat(result).isEqualTo(FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS)
     }
 
     @Test
@@ -159,7 +160,7 @@
             TYPE_CHALLENGE, challengeRequirements,
             TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray()
         )
-        assertThat(result).isEqualTo(RESULT_FAILURE)
+        assertThat(result).isEqualTo(FLAG_FAILURE_PATCH_LEVEL_DIFF)
     }
 
     @Test
@@ -176,7 +177,7 @@
             TYPE_CHALLENGE, challengeRequirements,
             TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray()
         )
-        assertThat(result).isEqualTo(RESULT_SUCCESS)
+        assertThat(result).isEqualTo(0)
     }
 
     @Test
@@ -191,10 +192,28 @@
 
         val result = verifier.verifyAttestation(
             TYPE_CHALLENGE, challengeRequirements,
-            // The patch date of this file is early 2022
             TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray()
         )
-        assertThat(result).isEqualTo(RESULT_FAILURE)
+        assertThat(result).isEqualTo(FLAG_FAILURE_PATCH_LEVEL_DIFF)
+    }
+
+    @Test
+    fun verifyAttestation_returnsFailureOwnedBySystemAndPatchDataNotWithinMaxPatchDiff() {
+        val verifier = AttestationVerificationPeerDeviceVerifier(
+            context, dumpLogger, trustAnchors, false, LocalDate.of(2024, 10, 1),
+            LocalDate.of(2024, 9, 1)
+        )
+        val challengeRequirements = Bundle()
+        challengeRequirements.putByteArray(PARAM_CHALLENGE, "player456".encodeToByteArray())
+        challengeRequirements.putBoolean("android.key_owned_by_system", true)
+        challengeRequirements.putInt(PARAM_MAX_PATCH_LEVEL_DIFF_MONTHS, 24)
+
+        val result = verifier.verifyAttestation(
+            TYPE_CHALLENGE, challengeRequirements,
+            TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray()
+        )
+        // Both "owned by system" and "patch level diff" checks should fail.
+        assertThat(result).isEqualTo(FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS or FLAG_FAILURE_PATCH_LEVEL_DIFF)
     }
 
     @Test
@@ -210,7 +229,7 @@
             TYPE_CHALLENGE, challengeRequirements,
             TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray()
         )
-        assertThat(result).isEqualTo(RESULT_FAILURE)
+        assertThat(result).isEqualTo(FLAG_FAILURE_CERTS)
     }
 
     @Test
@@ -232,7 +251,7 @@
             TYPE_CHALLENGE, challengeRequirements,
             TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray()
         )
-        assertThat(result).isEqualTo(RESULT_FAILURE)
+        assertThat(result).isEqualTo(FLAG_FAILURE_CERTS)
     }
 
     fun verifyAttestation_returnsFailureChallenge() {
@@ -247,7 +266,7 @@
             TYPE_CHALLENGE, challengeRequirements,
             TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray()
         )
-        assertThat(result).isEqualTo(RESULT_FAILURE)
+        assertThat(result).isEqualTo(FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS)
     }
 
     private fun String.fromPEMFileToCerts(): Collection<Certificate> {
@@ -281,6 +300,7 @@
     companion object {
         private const val TAG = "AVFTest"
         private const val TEST_ROOT_CERT_FILENAME = "test_root_certs.pem"
+        // Local patch date is 20220105
         private const val TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME =
             "test_attestation_with_root_certs.pem"
         private const val TEST_ATTESTATION_CERT_FILENAME = "test_attestation_wrong_root_certs.pem"
diff --git a/tests/FlickerTests/ActivityEmbedding/Android.bp b/tests/FlickerTests/ActivityEmbedding/Android.bp
index c681ce9..529f84a 100644
--- a/tests/FlickerTests/ActivityEmbedding/Android.bp
+++ b/tests/FlickerTests/ActivityEmbedding/Android.bp
@@ -24,71 +24,6 @@
     default_applicable_licenses: ["frameworks_base_license"],
 }
 
-////////////////////////////////////////////////////////////////////////////////
-// Begin to cleanup after CL merges
-
-filegroup {
-    name: "FlickerTestsOtherCommon-src",
-    srcs: ["src/**/ActivityEmbeddingTestBase.kt"],
-}
-
-filegroup {
-    name: "FlickerTestsOtherOpen-src",
-    srcs: ["src/**/open/*"],
-}
-
-filegroup {
-    name: "FlickerTestsOtherRotation-src",
-    srcs: ["src/**/rotation/*"],
-}
-
-java_library {
-    name: "FlickerTestsOtherCommon",
-    defaults: ["FlickerTestsDefault"],
-    srcs: [":FlickerTestsOtherCommon-src"],
-    static_libs: ["FlickerTestsBase"],
-}
-
-java_defaults {
-    name: "FlickerTestsOtherDefaults",
-    defaults: ["FlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    package_name: "com.android.server.wm.flicker",
-    instrumentation_target_package: "com.android.server.wm.flicker",
-    test_config_template: "AndroidTestTemplate.xml",
-    static_libs: [
-        "FlickerTestsBase",
-        "FlickerTestsOtherCommon",
-    ],
-    data: ["trace_config/*"],
-}
-
-android_test {
-    name: "FlickerTestsOtherOpen",
-    defaults: ["FlickerTestsOtherDefaults"],
-    srcs: [":FlickerTestsOtherOpen-src"],
-}
-
-android_test {
-    name: "FlickerTestsOtherRotation",
-    defaults: ["FlickerTestsOtherDefaults"],
-    srcs: [":FlickerTestsOtherRotation-src"],
-}
-
-android_test {
-    name: "FlickerTestsOther",
-    defaults: ["FlickerTestsOtherDefaults"],
-    srcs: ["src/**/*"],
-    exclude_srcs: [
-        ":FlickerTestsOtherOpen-src",
-        ":FlickerTestsOtherRotation-src",
-        ":FlickerTestsOtherCommon-src",
-    ],
-}
-
-// End to cleanup after CL merges
-////////////////////////////////////////////////////////////////////////////////
-
 android_test {
     name: "FlickerTestsActivityEmbedding",
     defaults: ["FlickerTestsDefault"],
@@ -97,10 +32,7 @@
     instrumentation_target_package: "com.android.server.wm.flicker",
     test_config_template: "AndroidTestTemplate.xml",
     srcs: ["src/**/*"],
-    static_libs: [
-        "FlickerTestsBase",
-        "FlickerTestsOtherCommon",
-    ],
+    static_libs: ["FlickerTestsBase"],
     data: ["trace_config/*"],
 }
 
diff --git a/tests/FlickerTests/ActivityEmbedding/AndroidTestTemplate.xml b/tests/FlickerTests/ActivityEmbedding/AndroidTestTemplate.xml
index 82de070..8b65efd 100644
--- a/tests/FlickerTests/ActivityEmbedding/AndroidTestTemplate.xml
+++ b/tests/FlickerTests/ActivityEmbedding/AndroidTestTemplate.xml
@@ -12,6 +12,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/tests/FlickerTests/ActivityEmbedding/OWNERS b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/OWNERS
similarity index 100%
rename from tests/FlickerTests/ActivityEmbedding/OWNERS
rename to tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/OWNERS
diff --git a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/close/CloseSecondaryActivityInSplitTest.kt b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/close/CloseSecondaryActivityInSplitTest.kt
index 519b429..f44e282 100644
--- a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/close/CloseSecondaryActivityInSplitTest.kt
+++ b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/close/CloseSecondaryActivityInSplitTest.kt
@@ -38,7 +38,7 @@
  * Setup: Launch A|B in split with B being the secondary activity. Transitions: Finish B and expect
  * A to become fullscreen.
  *
- * To run this test: `atest FlickerTestsOther:CloseSecondaryActivityInSplitTest`
+ * To run this test: `atest FlickerTestsActivityEmbedding:CloseSecondaryActivityInSplitTest`
  */
 @RequiresDevice
 @RunWith(Parameterized::class)
diff --git a/tests/FlickerTests/ActivityEmbedding/OWNERS b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/close/OWNERS
similarity index 100%
copy from tests/FlickerTests/ActivityEmbedding/OWNERS
copy to tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/close/OWNERS
diff --git a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/layoutchange/HorizontalSplitChangeRatioTest.kt b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/layoutchange/HorizontalSplitChangeRatioTest.kt
index 4cd6d15b..7a76dd9 100644
--- a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/layoutchange/HorizontalSplitChangeRatioTest.kt
+++ b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/layoutchange/HorizontalSplitChangeRatioTest.kt
@@ -39,7 +39,7 @@
  * windows are equal in size. B is on the top and A is on the bottom. Transitions: Change the split
  * ratio to A:B=0.7:0.3, expect bounds change for both A and B.
  *
- * To run this test: `atest FlickerTestsOther:HorizontalSplitChangeRatioTest`
+ * To run this test: `atest FlickerTestsActivityEmbedding:HorizontalSplitChangeRatioTest`
  */
 @RequiresDevice
 @RunWith(Parameterized::class)
diff --git a/tests/FlickerTests/ActivityEmbedding/OWNERS b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/layoutchange/OWNERS
similarity index 100%
copy from tests/FlickerTests/ActivityEmbedding/OWNERS
copy to tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/layoutchange/OWNERS
diff --git a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/MainActivityStartsSecondaryWithAlwaysExpandTest.kt b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/MainActivityStartsSecondaryWithAlwaysExpandTest.kt
index 5df8b572..08b5f38 100644
--- a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/MainActivityStartsSecondaryWithAlwaysExpandTest.kt
+++ b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/MainActivityStartsSecondaryWithAlwaysExpandTest.kt
@@ -39,7 +39,7 @@
  * Setup: Launch A|B in split with B being the secondary activity. Transitions: A start C with
  * alwaysExpand=true, expect C to launch in fullscreen and cover split A|B.
  *
- * To run this test: `atest FlickerTestsOther:MainActivityStartsSecondaryWithAlwaysExpandTest`
+ * To run this test: `atest FlickerTestsActivityEmbedding:MainActivityStartsSecondaryWithAlwaysExpandTest`
  */
 @RequiresDevice
 @RunWith(Parameterized::class)
diff --git a/tests/FlickerTests/ActivityEmbedding/OWNERS b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OWNERS
similarity index 100%
copy from tests/FlickerTests/ActivityEmbedding/OWNERS
copy to tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OWNERS
diff --git a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenActivityEmbeddingPlaceholderSplitTest.kt b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenActivityEmbeddingPlaceholderSplitTest.kt
index 5009c7c..1f002a0 100644
--- a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenActivityEmbeddingPlaceholderSplitTest.kt
+++ b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenActivityEmbeddingPlaceholderSplitTest.kt
@@ -34,7 +34,7 @@
  * Test opening an activity that will launch another activity as ActivityEmbedding placeholder in
  * split.
  *
- * To run this test: `atest FlickerTestsOther:OpenActivityEmbeddingPlaceholderSplitTest`
+ * To run this test: `atest FlickerTestsActivityEmbedding:OpenActivityEmbeddingPlaceholderSplitTest`
  */
 @RequiresDevice
 @RunWith(Parameterized::class)
diff --git a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenActivityEmbeddingSecondaryToSplitTest.kt b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenActivityEmbeddingSecondaryToSplitTest.kt
index 6327d92..b78c3ec 100644
--- a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenActivityEmbeddingSecondaryToSplitTest.kt
+++ b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenActivityEmbeddingSecondaryToSplitTest.kt
@@ -34,7 +34,7 @@
 /**
  * Test opening a secondary activity that will split with the main activity.
  *
- * To run this test: `atest FlickerTestsOther:OpenActivityEmbeddingSecondaryToSplitTest`
+ * To run this test: `atest FlickerTestsActivityEmbedding:OpenActivityEmbeddingSecondaryToSplitTest`
  */
 @RequiresDevice
 @RunWith(Parameterized::class)
diff --git a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenThirdActivityOverSplitTest.kt b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenThirdActivityOverSplitTest.kt
index 78004cc..10167d71 100644
--- a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenThirdActivityOverSplitTest.kt
+++ b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/open/OpenThirdActivityOverSplitTest.kt
@@ -39,7 +39,7 @@
  *
  * Transitions: Let B start C, expect C to cover B and end up in split A|C.
  *
- * To run this test: `atest FlickerTestsOther:OpenThirdActivityOverSplitTest`
+ * To run this test: `atest FlickerTestsActivityEmbedding:OpenThirdActivityOverSplitTest`
  */
 @RequiresDevice
 @RunWith(Parameterized::class)
diff --git a/tests/FlickerTests/ActivityEmbedding/OWNERS b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/pip/OWNERS
similarity index 100%
copy from tests/FlickerTests/ActivityEmbedding/OWNERS
copy to tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/pip/OWNERS
diff --git a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/pip/SecondaryActivityEnterPipTest.kt b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/pip/SecondaryActivityEnterPipTest.kt
index eed9225..a0b910b 100644
--- a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/pip/SecondaryActivityEnterPipTest.kt
+++ b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/pip/SecondaryActivityEnterPipTest.kt
@@ -41,7 +41,7 @@
  * Setup: Start from a split A|B. Transition: B enters PIP, observe the window first goes fullscreen
  * then shrink to the bottom right corner on screen.
  *
- * To run this test: `atest FlickerTestsOther:SecondaryActivityEnterPipTest`
+ * To run this test: `atest FlickerTestsActivityEmbedding:SecondaryActivityEnterPipTest`
  */
 @RequiresDevice
 @RunWith(Parameterized::class)
diff --git a/tests/FlickerTests/ActivityEmbedding/OWNERS b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rotation/OWNERS
similarity index 100%
copy from tests/FlickerTests/ActivityEmbedding/OWNERS
copy to tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rotation/OWNERS
diff --git a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rotation/RotateSplitNoChangeTest.kt b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rotation/RotateSplitNoChangeTest.kt
index f5e6c78..ea13f5f 100644
--- a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rotation/RotateSplitNoChangeTest.kt
+++ b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rotation/RotateSplitNoChangeTest.kt
@@ -36,7 +36,7 @@
  * Setup: Launch A|B in split with B being the secondary activity. Transitions: Rotate display, and
  * expect A and B to split evenly in new rotation.
  *
- * To run this test: `atest FlickerTestsOther:RotateSplitNoChangeTest`
+ * To run this test: `atest FlickerTestsActivityEmbedding:RotateSplitNoChangeTest`
  */
 @RequiresDevice
 @RunWith(Parameterized::class)
diff --git a/tests/FlickerTests/ActivityEmbedding/OWNERS b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rtl/OWNERS
similarity index 100%
copy from tests/FlickerTests/ActivityEmbedding/OWNERS
copy to tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rtl/OWNERS
diff --git a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rtl/RTLStartSecondaryWithPlaceholderTest.kt b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rtl/RTLStartSecondaryWithPlaceholderTest.kt
index 65a23e8..2a177d5 100644
--- a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rtl/RTLStartSecondaryWithPlaceholderTest.kt
+++ b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rtl/RTLStartSecondaryWithPlaceholderTest.kt
@@ -37,7 +37,7 @@
  * PlaceholderPrimary, which is configured to launch with PlaceholderSecondary in RTL. Expect split
  * PlaceholderSecondary|PlaceholderPrimary covering split B|A.
  *
- * To run this test: `atest FlickerTestsOther:RTLStartSecondaryWithPlaceholderTest`
+ * To run this test: `atest FlickerTestsActivityEmbedding:RTLStartSecondaryWithPlaceholderTest`
  */
 @RequiresDevice
 @RunWith(Parameterized::class)
diff --git a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/splitscreen/EnterSystemSplitTest.kt b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/splitscreen/EnterSystemSplitTest.kt
index c3e1a1f..0ca8f37 100644
--- a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/splitscreen/EnterSystemSplitTest.kt
+++ b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/splitscreen/EnterSystemSplitTest.kt
@@ -47,7 +47,7 @@
  * Setup: Launch A|B in split and secondaryApp, return to home. Transitions: Let AE Split A|B enter
  * splitscreen with secondaryApp. Resulting in A|B|secondaryApp.
  *
- * To run this test: `atest FlickerTestsOther:EnterSystemSplitTest`
+ * To run this test: `atest FlickerTestsActivityEmbedding:EnterSystemSplitTest`
  */
 @RequiresDevice
 @RunWith(Parameterized::class)
diff --git a/tests/FlickerTests/ActivityEmbedding/OWNERS b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/splitscreen/OWNERS
similarity index 100%
copy from tests/FlickerTests/ActivityEmbedding/OWNERS
copy to tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/splitscreen/OWNERS
diff --git a/tests/FlickerTests/Android.bp b/tests/FlickerTests/Android.bp
index 27e9ffa..1e997b3 100644
--- a/tests/FlickerTests/Android.bp
+++ b/tests/FlickerTests/Android.bp
@@ -47,7 +47,6 @@
 
 java_library {
     name: "wm-flicker-common-assertions",
-    platform_apis: true,
     optimize: {
         enabled: false,
     },
diff --git a/tests/FlickerTests/AppClose/AndroidTestTemplate.xml b/tests/FlickerTests/AppClose/AndroidTestTemplate.xml
index 4ffb11a..3382c1e 100644
--- a/tests/FlickerTests/AppClose/AndroidTestTemplate.xml
+++ b/tests/FlickerTests/AppClose/AndroidTestTemplate.xml
@@ -12,6 +12,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/tests/FlickerTests/AppClose/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt b/tests/FlickerTests/AppClose/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt
index e19e1ce..56b718a 100644
--- a/tests/FlickerTests/AppClose/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt
+++ b/tests/FlickerTests/AppClose/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt
@@ -31,7 +31,7 @@
 /**
  * Test app closes by pressing back button
  *
- * To run this test: `atest FlickerTests:CloseAppBackButtonTest`
+ * To run this test: `atest FlickerTestsAppClose:CloseAppBackButtonTest`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/AppClose/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt b/tests/FlickerTests/AppClose/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
index 47ed642..5deacaf 100644
--- a/tests/FlickerTests/AppClose/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
+++ b/tests/FlickerTests/AppClose/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
@@ -31,7 +31,7 @@
 /**
  * Test app closes by pressing home button
  *
- * To run this test: `atest FlickerTests:CloseAppHomeButtonTest`
+ * To run this test: `atest FlickerTestsAppClose:CloseAppHomeButtonTest`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/AppLaunch/Android.bp b/tests/FlickerTests/AppLaunch/Android.bp
index b61739f..17d0f96 100644
--- a/tests/FlickerTests/AppLaunch/Android.bp
+++ b/tests/FlickerTests/AppLaunch/Android.bp
@@ -24,69 +24,13 @@
     default_applicable_licenses: ["frameworks_base_license"],
 }
 
-////////////////////////////////////////////////////////////////////////////////
-// Begin to cleanup after CL merges
-
-filegroup {
-    name: "FlickerTestsAppLaunchCommon-src",
-    srcs: ["src/**/common/*"],
-}
-
-filegroup {
-    name: "FlickerTestsAppLaunch1-src",
-    srcs: ["src/**/OpenAppFrom*"],
-}
-
-java_library {
-    name: "FlickerTestsAppLaunchCommon",
-    defaults: ["FlickerTestsDefault"],
-    srcs: [":FlickerTestsAppLaunchCommon-src"],
-    static_libs: ["FlickerTestsBase"],
-}
-
-android_test {
-    name: "FlickerTestsAppLaunch1",
-    defaults: ["FlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    test_config_template: "AndroidTestTemplate.xml",
-    srcs: [":FlickerTestsAppLaunch1-src"],
-    static_libs: [
-        "FlickerTestsBase",
-        "FlickerTestsAppLaunchCommon",
-    ],
-    data: ["trace_config/*"],
-}
-
-android_test {
-    name: "FlickerTestsAppLaunch2",
-    defaults: ["FlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    test_config_template: "AndroidTestTemplate.xml",
-    srcs: ["src/**/*"],
-    exclude_srcs: [
-        ":FlickerTestsAppLaunchCommon-src",
-        ":FlickerTestsAppLaunch1-src",
-    ],
-    static_libs: [
-        "FlickerTestsBase",
-        "FlickerTestsAppLaunchCommon",
-    ],
-    data: ["trace_config/*"],
-}
-
-// End to cleanup after CL merges
-////////////////////////////////////////////////////////////////////////////////
-
 android_test {
     name: "FlickerTestsAppLaunch",
     defaults: ["FlickerTestsDefault"],
     manifest: "AndroidManifest.xml",
     test_config_template: "AndroidTestTemplate.xml",
     srcs: ["src/**/*"],
-    static_libs: [
-        "FlickerTestsBase",
-        "FlickerTestsAppLaunchCommon",
-    ],
+    static_libs: ["FlickerTestsBase"],
     data: ["trace_config/*"],
 }
 
diff --git a/tests/FlickerTests/AppLaunch/AndroidTestTemplate.xml b/tests/FlickerTests/AppLaunch/AndroidTestTemplate.xml
index 0fa4d07..e941e79 100644
--- a/tests/FlickerTests/AppLaunch/AndroidTestTemplate.xml
+++ b/tests/FlickerTests/AppLaunch/AndroidTestTemplate.xml
@@ -12,6 +12,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/ActivityTransitionTest.kt b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/ActivityTransitionTest.kt
index ffa90a3..01cdbb8 100644
--- a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/ActivityTransitionTest.kt
+++ b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/ActivityTransitionTest.kt
@@ -35,7 +35,7 @@
 /**
  * Test the back and forward transition between 2 activities.
  *
- * To run this test: `atest FlickerTests:ActivitiesTransitionTest`
+ * To run this test: `atest FlickerTestsAppLaunch:ActivitiesTransitionTest`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIconColdTest.kt b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIconColdTest.kt
index 8c285bd..3d9321c 100644
--- a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIconColdTest.kt
+++ b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIconColdTest.kt
@@ -30,7 +30,7 @@
 /**
  * Test cold launching an app from launcher
  *
- * To run this test: `atest FlickerTests:OpenAppColdFromIcon`
+ * To run this test: `atest FlickerTestsAppLaunch:OpenAppColdFromIcon`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIntentColdAfterCameraTest.kt b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIntentColdAfterCameraTest.kt
index 57da05f..9207530 100644
--- a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIntentColdAfterCameraTest.kt
+++ b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIntentColdAfterCameraTest.kt
@@ -30,7 +30,7 @@
 /**
  * Test launching an app after cold opening camera
  *
- * To run this test: `atest FlickerTests:OpenAppAfterCameraTest`
+ * To run this test: `atest FlickerTestsAppLaunch:OpenAppAfterCameraTest`
  *
  * Notes: Some default assertions are inherited [OpenAppTransition]
  */
diff --git a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIntentColdTest.kt b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIntentColdTest.kt
index 267f282..cbe7c32 100644
--- a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIntentColdTest.kt
+++ b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIntentColdTest.kt
@@ -35,7 +35,7 @@
 /**
  * Test cold launching an app from launcher
  *
- * To run this test: `atest FlickerTests:OpenAppColdTest`
+ * To run this test: `atest FlickerTestsAppLaunch:OpenAppColdTest`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIntentWarmTest.kt b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIntentWarmTest.kt
index 83065de..b2941e7 100644
--- a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIntentWarmTest.kt
+++ b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromIntentWarmTest.kt
@@ -34,7 +34,7 @@
 /**
  * Test warm launching an app from launcher
  *
- * To run this test: `atest FlickerTests:OpenAppWarmTest`
+ * To run this test: `atest FlickerTestsAppLaunch:OpenAppWarmTest`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromLockscreenViaIntentTest.kt b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromLockscreenViaIntentTest.kt
index 6e6a327..4048e0c 100644
--- a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromLockscreenViaIntentTest.kt
+++ b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromLockscreenViaIntentTest.kt
@@ -41,7 +41,7 @@
  *
  * This test assumes the device doesn't have AOD enabled
  *
- * To run this test: `atest FlickerTests:OpenAppNonResizeableTest`
+ * To run this test: `atest FlickerTestsAppLaunch:OpenAppNonResizeableTest`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
index 6d3eaeb..064c76f 100644
--- a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
+++ b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
@@ -35,7 +35,7 @@
 /**
  * Test launching an app from the recents app view (the overview)
  *
- * To run this test: `atest FlickerTests:OpenAppFromOverviewTest`
+ * To run this test: `atest FlickerTestsAppLaunch:OpenAppFromOverviewTest`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenCameraFromHomeOnDoubleClickPowerButtonTest.kt b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenCameraFromHomeOnDoubleClickPowerButtonTest.kt
index bec02d0..41423fd 100644
--- a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenCameraFromHomeOnDoubleClickPowerButtonTest.kt
+++ b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenCameraFromHomeOnDoubleClickPowerButtonTest.kt
@@ -41,7 +41,7 @@
 /**
  * Test cold launching camera from launcher by double pressing power button
  *
- * To run this test: `atest FlickerTests:OpenCameraOnDoubleClickPowerButton`
+ * To run this test: `atest FlickerTestsAppLaunch:OpenCameraOnDoubleClickPowerButton`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenTransferSplashscreenAppFromLauncherTransition.kt b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenTransferSplashscreenAppFromLauncherTransition.kt
index e0aef8d..9d7a9c6 100644
--- a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenTransferSplashscreenAppFromLauncherTransition.kt
+++ b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OpenTransferSplashscreenAppFromLauncherTransition.kt
@@ -34,7 +34,7 @@
 /**
  * Test cold launching an app from launcher
  *
- * To run this test: `atest FlickerTests:OpenTransferSplashscreenAppFromLauncherTransition`
+ * To run this test: `atest FlickerTestsAppLaunch:OpenTransferSplashscreenAppFromLauncherTransition`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OverrideTaskTransitionTest.kt b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OverrideTaskTransitionTest.kt
index f114499..7e2d472 100644
--- a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OverrideTaskTransitionTest.kt
+++ b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/OverrideTaskTransitionTest.kt
@@ -42,7 +42,7 @@
 /**
  * Test the [android.app.ActivityOptions.makeCustomTaskAnimation].
  *
- * To run this test: `atest FlickerTests:OverrideTaskTransitionTest`
+ * To run this test: `atest FlickerTestsAppLaunch:OverrideTaskTransitionTest`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/TaskTransitionTest.kt b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/TaskTransitionTest.kt
index a71599d..95e8126 100644
--- a/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/TaskTransitionTest.kt
+++ b/tests/FlickerTests/AppLaunch/src/com/android/server/wm/flicker/launch/TaskTransitionTest.kt
@@ -49,7 +49,7 @@
 /**
  * Test the back and forward transition between 2 activities.
  *
- * To run this test: `atest FlickerTests:TaskTransitionTest`
+ * To run this test: `atest FlickerTestsAppLaunch:TaskTransitionTest`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/FlickerService/AndroidTestTemplate.xml b/tests/FlickerTests/FlickerService/AndroidTestTemplate.xml
index 4d9fefb..4e06dca 100644
--- a/tests/FlickerTests/FlickerService/AndroidTestTemplate.xml
+++ b/tests/FlickerTests/FlickerService/AndroidTestTemplate.xml
@@ -12,6 +12,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/tests/FlickerTests/IME/Android.bp b/tests/FlickerTests/IME/Android.bp
index f80e6b4..cba3d09 100644
--- a/tests/FlickerTests/IME/Android.bp
+++ b/tests/FlickerTests/IME/Android.bp
@@ -24,27 +24,6 @@
     default_applicable_licenses: ["frameworks_base_license"],
 }
 
-////////////////////////////////////////////////////////////////////////////////
-// Begin to cleanup after CL merges
-
-filegroup {
-    name: "FlickerTestsImeCommon-src",
-    srcs: ["src/**/common/*"],
-}
-
-filegroup {
-    name: "FlickerTestsIme1-src",
-    srcs: ["src/**/Close*"],
-}
-
-filegroup {
-    name: "FlickerTestsIme2-src",
-    srcs: ["src/**/ShowImeOnAppStart*"],
-}
-
-// End to cleanup after CL merges
-////////////////////////////////////////////////////////////////////////////////
-
 android_test {
     name: "FlickerTestsIme",
     defaults: ["FlickerTestsDefault"],
@@ -60,67 +39,6 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// Begin to cleanup after CL merges
-
-java_library {
-    name: "FlickerTestsImeCommon",
-    defaults: ["FlickerTestsDefault"],
-    srcs: [":FlickerTestsImeCommon-src"],
-    static_libs: ["FlickerTestsBase"],
-}
-
-android_test {
-    name: "FlickerTestsIme1",
-    defaults: ["FlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    test_config_template: "AndroidTestTemplate.xml",
-    test_suites: [
-        "device-tests",
-        "device-platinum-tests",
-    ],
-    srcs: [":FlickerTestsIme1-src"],
-    static_libs: [
-        "FlickerTestsBase",
-        "FlickerTestsImeCommon",
-    ],
-    data: ["trace_config/*"],
-}
-
-android_test {
-    name: "FlickerTestsIme2",
-    defaults: ["FlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    test_config_template: "AndroidTestTemplate.xml",
-    srcs: [":FlickerTestsIme2-src"],
-    static_libs: [
-        "FlickerTestsBase",
-        "FlickerTestsImeCommon",
-    ],
-    data: ["trace_config/*"],
-}
-
-android_test {
-    name: "FlickerTestsIme3",
-    defaults: ["FlickerTestsDefault"],
-    manifest: "AndroidManifest.xml",
-    test_config_template: "AndroidTestTemplate.xml",
-    srcs: ["src/**/*"],
-    exclude_srcs: [
-        ":FlickerTestsIme1-src",
-        ":FlickerTestsIme2-src",
-        ":FlickerTestsImeCommon-src",
-    ],
-    static_libs: [
-        "FlickerTestsBase",
-        "FlickerTestsImeCommon",
-    ],
-    data: ["trace_config/*"],
-}
-
-// End to cleanup after CL merges
-////////////////////////////////////////////////////////////////////////////////
-
-////////////////////////////////////////////////////////////////////////////////
 // Begin breakdowns for FlickerTestsIme module
 
 test_module_config {
diff --git a/tests/FlickerTests/IME/AndroidTestTemplate.xml b/tests/FlickerTests/IME/AndroidTestTemplate.xml
index b879c54..0cadd68 100644
--- a/tests/FlickerTests/IME/AndroidTestTemplate.xml
+++ b/tests/FlickerTests/IME/AndroidTestTemplate.xml
@@ -12,6 +12,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- enable AOD -->
         <option name="set-secure-setting" key="doze_always_on" value="1" />
         <!-- prevents the phone from restarting -->
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeOnDismissPopupDialogTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeOnDismissPopupDialogTest.kt
index 2b6ddcb..48ca36f 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeOnDismissPopupDialogTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeOnDismissPopupDialogTest.kt
@@ -33,7 +33,7 @@
 import org.junit.runners.Parameterized
 
 /**
- * To run this test: `atest FlickerTestsIme1:CloseImeOnDismissPopupDialogTest`
+ * To run this test: `atest FlickerTestsIme:CloseImeOnDismissPopupDialogTest`
  */
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeOnGoHomeTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeOnGoHomeTest.kt
index 0344197..e3f3aca 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeOnGoHomeTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeOnGoHomeTest.kt
@@ -34,7 +34,7 @@
 
 /**
  * Test IME window closing to home transitions.
- * To run this test: `atest FlickerTestsIme1:CloseImeOnGoHomeTest`
+ * To run this test: `atest FlickerTestsIme:CloseImeOnGoHomeTest`
  */
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartOnGoHomeTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartOnGoHomeTest.kt
index fde1373..3509e5b 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartOnGoHomeTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartOnGoHomeTest.kt
@@ -42,7 +42,7 @@
  *
  * More details on b/190352379
  *
- * To run this test: `atest FlickerTestsIme1:CloseImeShownOnAppStartOnGoHomeTest`
+ * To run this test: `atest FlickerTestsIme:CloseImeShownOnAppStartOnGoHomeTest`
  */
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartToAppOnPressBackTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartToAppOnPressBackTest.kt
index ed6e8df..53d7a3f 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartToAppOnPressBackTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartToAppOnPressBackTest.kt
@@ -43,7 +43,7 @@
  *
  * More details on b/190352379
  *
- * To run this test: `atest FlickerTestsIme1:CloseImeShownOnAppStartToAppOnPressBackTest`
+ * To run this test: `atest FlickerTestsIme:CloseImeShownOnAppStartToAppOnPressBackTest`
  */
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeToAppOnPressBackTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeToAppOnPressBackTest.kt
index 522c68b..4bc2705 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeToAppOnPressBackTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeToAppOnPressBackTest.kt
@@ -35,7 +35,7 @@
 
 /**
  * Test IME window closing back to app window transitions.
- * To run this test: `atest FlickerTestsIme1:CloseImeToAppOnPressBackTest`
+ * To run this test: `atest FlickerTestsIme:CloseImeToAppOnPressBackTest`
  */
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeToHomeOnFinishActivityTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeToHomeOnFinishActivityTest.kt
index 05771e8..6117bb0 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeToHomeOnFinishActivityTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/CloseImeToHomeOnFinishActivityTest.kt
@@ -40,7 +40,7 @@
  * Unlike {@link OpenImeWindowTest} testing IME window opening transitions, this test also verify
  * there is no flickering when back to the simple activity without requesting IME to show.
  *
- * To run this test: `atest FlickerTestsIme1:CloseImeToHomeOnFinishActivityTest`
+ * To run this test: `atest FlickerTestsIme:CloseImeToHomeOnFinishActivityTest`
  */
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/OpenImeWindowToFixedPortraitAppTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/OpenImeWindowToFixedPortraitAppTest.kt
index 336fe6f..9b8d86d 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/OpenImeWindowToFixedPortraitAppTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/OpenImeWindowToFixedPortraitAppTest.kt
@@ -37,7 +37,7 @@
 
 /**
  * Test IME window shown on the app with fixing portrait orientation.
- * To run this test: `atest FlickerTestsIme2:OpenImeWindowToFixedPortraitAppTest`
+ * To run this test: `atest FlickerTestsIme:OpenImeWindowToFixedPortraitAppTest`
  */
 @RequiresDevice
 @RunWith(Parameterized::class)
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromOverviewTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromOverviewTest.kt
index 34a7085..f806fae 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromOverviewTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromOverviewTest.kt
@@ -34,7 +34,7 @@
 
 /**
  * Test IME window opening transitions.
- * To run this test: `atest FlickerTestsIme2:ShowImeOnAppStartWhenLaunchingAppFromOverviewTest`
+ * To run this test: `atest FlickerTestsIme:ShowImeOnAppStartWhenLaunchingAppFromOverviewTest`
  */
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromQuickSwitchTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromQuickSwitchTest.kt
index 7c72c31..cc19f62 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromQuickSwitchTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromQuickSwitchTest.kt
@@ -36,7 +36,7 @@
 
 /**
  * Test IME windows switching with 2-Buttons or gestural navigation.
- * To run this test: `atest FlickerTestsIme2:ShowImeOnAppStartWhenLaunchingAppFromQuickSwitchTest`
+ * To run this test: `atest FlickerTestsIme:ShowImeOnAppStartWhenLaunchingAppFromQuickSwitchTest`
  */
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppTest.kt
index fe5320c..4a4d372 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppTest.kt
@@ -36,7 +36,7 @@
 /**
  * Launch an app that automatically displays the IME
  *
- * To run this test: `atest FlickerTestsIme2:ShowImeOnAppStartWhenLaunchingAppTest`
+ * To run this test: `atest FlickerTestsIme:ShowImeOnAppStartWhenLaunchingAppTest`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnUnlockScreenTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnUnlockScreenTest.kt
index 82e53c8..d47e7ad 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnUnlockScreenTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeOnUnlockScreenTest.kt
@@ -36,7 +36,7 @@
 
 /**
  * Test IME window closing on lock and opening on screen unlock.
- * To run this test: `atest FlickerTestsIme2:ShowImeOnUnlockScreenTest`
+ * To run this test: `atest FlickerTestsIme:ShowImeOnUnlockScreenTest`
  */
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeWhenFocusingOnInputFieldTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeWhenFocusingOnInputFieldTest.kt
index 9eaf998..47bf324 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeWhenFocusingOnInputFieldTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeWhenFocusingOnInputFieldTest.kt
@@ -33,7 +33,7 @@
 
 /**
  * Test IME window opening transitions.
- * To run this test: `atest FlickerTestsIme2:ShowImeWhenFocusingOnInputFieldTest`
+ * To run this test: `atest FlickerTestsIme:ShowImeWhenFocusingOnInputFieldTest`
  */
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeWhileDismissingThemedPopupDialogTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeWhileDismissingThemedPopupDialogTest.kt
index 7186a2c..e3118b4 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeWhileDismissingThemedPopupDialogTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeWhileDismissingThemedPopupDialogTest.kt
@@ -41,7 +41,7 @@
 
 /**
  * Test IME snapshot mechanism won't apply when transitioning from non-IME focused dialog activity.
- * To run this test: `atest FlickerTestsIme2:ShowImeWhileDismissingThemedPopupDialogTest`
+ * To run this test: `atest FlickerTestsIme:ShowImeWhileDismissingThemedPopupDialogTest`
  */
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
diff --git a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeWhileEnteringOverviewTest.kt b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeWhileEnteringOverviewTest.kt
index eb63e49..064c07e 100644
--- a/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeWhileEnteringOverviewTest.kt
+++ b/tests/FlickerTests/IME/src/com/android/server/wm/flicker/ime/ShowImeWhileEnteringOverviewTest.kt
@@ -39,7 +39,7 @@
 
 /**
  * Test IME window layer will be associated with the app task when going to the overview screen.
- * To run this test: `atest FlickerTestsIme2:ShowImeWhileEnteringOverviewTest`
+ * To run this test: `atest FlickerTestsIme:ShowImeWhileEnteringOverviewTest`
  */
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
diff --git a/tests/FlickerTests/Notification/AndroidTestTemplate.xml b/tests/FlickerTests/Notification/AndroidTestTemplate.xml
index 04b312a..f32e8bed 100644
--- a/tests/FlickerTests/Notification/AndroidTestTemplate.xml
+++ b/tests/FlickerTests/Notification/AndroidTestTemplate.xml
@@ -12,6 +12,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/tests/FlickerTests/QuickSwitch/AndroidTestTemplate.xml b/tests/FlickerTests/QuickSwitch/AndroidTestTemplate.xml
index 8acdabc..68ae4f1 100644
--- a/tests/FlickerTests/QuickSwitch/AndroidTestTemplate.xml
+++ b/tests/FlickerTests/QuickSwitch/AndroidTestTemplate.xml
@@ -12,6 +12,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/tests/FlickerTests/QuickSwitch/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt b/tests/FlickerTests/QuickSwitch/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt
index 9bb62e1..1a32f20 100644
--- a/tests/FlickerTests/QuickSwitch/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt
+++ b/tests/FlickerTests/QuickSwitch/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt
@@ -38,7 +38,7 @@
 /**
  * Test quick switching back to previous app from last opened app
  *
- * To run this test: `atest FlickerTests:QuickSwitchBetweenTwoAppsBackTest`
+ * To run this test: `atest FlickerTestsQuickswitch:QuickSwitchBetweenTwoAppsBackTest`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/QuickSwitch/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsForwardTest.kt b/tests/FlickerTests/QuickSwitch/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsForwardTest.kt
index 491b994..d82dddd 100644
--- a/tests/FlickerTests/QuickSwitch/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsForwardTest.kt
+++ b/tests/FlickerTests/QuickSwitch/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsForwardTest.kt
@@ -37,7 +37,7 @@
 /**
  * Test quick switching back to previous app from last opened app
  *
- * To run this test: `atest FlickerTests:QuickSwitchBetweenTwoAppsForwardTest`
+ * To run this test: `atest FlickerTestsQuickswitch:QuickSwitchBetweenTwoAppsForwardTest`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/QuickSwitch/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt b/tests/FlickerTests/QuickSwitch/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt
index de54c95..ab36628 100644
--- a/tests/FlickerTests/QuickSwitch/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt
+++ b/tests/FlickerTests/QuickSwitch/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt
@@ -38,7 +38,7 @@
 /**
  * Test quick switching to last opened app from launcher
  *
- * To run this test: `atest FlickerTests:QuickSwitchFromLauncherTest`
+ * To run this test: `atest FlickerTestsQuickswitch:QuickSwitchFromLauncherTest`
  *
  * Actions:
  * ```
diff --git a/tests/FlickerTests/Rotation/AndroidTestTemplate.xml b/tests/FlickerTests/Rotation/AndroidTestTemplate.xml
index 91ece21..ec186723 100644
--- a/tests/FlickerTests/Rotation/AndroidTestTemplate.xml
+++ b/tests/FlickerTests/Rotation/AndroidTestTemplate.xml
@@ -12,6 +12,10 @@
         <option name="run-command" value="setprop debug.wm.disable_deprecated_target_sdk_dialog 1"/>
         <!-- keeps the screen on during tests -->
         <option name="screen-always-on" value="on"/>
+        <!-- Turns off Wi-fi -->
+        <option name="wifi" value="off"/>
+        <!-- Turns off Bluetooth -->
+        <option name="bluetooth" value="off"/>
         <!-- prevents the phone from restarting -->
         <option name="force-skip-system-props" value="true"/>
         <!-- set WM tracing verbose level to all -->
diff --git a/tests/FlickerTests/Rotation/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt b/tests/FlickerTests/Rotation/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
index 05ab364..49e2553 100644
--- a/tests/FlickerTests/Rotation/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
+++ b/tests/FlickerTests/Rotation/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
@@ -48,7 +48,7 @@
  *     Stop tracing
  * ```
  *
- * To run this test: `atest FlickerTests:ChangeAppRotationTest`
+ * To run this test: `atest FlickerTestsRotation:ChangeAppRotationTest`
  *
  * To run only the presubmit assertions add: `--
  *
diff --git a/tests/FlickerTests/Rotation/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt b/tests/FlickerTests/Rotation/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
index a413628..d7f91e0 100644
--- a/tests/FlickerTests/Rotation/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
+++ b/tests/FlickerTests/Rotation/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
@@ -55,7 +55,7 @@
  *     Stop tracing
  * ```
  *
- * To run this test: `atest FlickerTests:SeamlessAppRotationTest`
+ * To run this test: `atest FlickerTestsRotation:SeamlessAppRotationTest`
  *
  * To run only the presubmit assertions add: `--
  *
diff --git a/tests/FlickerTests/test-apps/app-helpers/Android.bp b/tests/FlickerTests/test-apps/app-helpers/Android.bp
index fc4d71c..e8bb64a 100644
--- a/tests/FlickerTests/test-apps/app-helpers/Android.bp
+++ b/tests/FlickerTests/test-apps/app-helpers/Android.bp
@@ -25,7 +25,6 @@
 
 java_library {
     name: "wm-flicker-common-app-helpers",
-    platform_apis: true,
     optimize: {
         enabled: false,
     },
diff --git a/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt b/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt
index ba36007..4ae06a4 100644
--- a/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt
+++ b/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt
@@ -18,6 +18,8 @@
 
 import android.content.Context
 import android.content.ContextWrapper
+import android.content.pm.PackageManager
+import android.content.res.Resources
 import android.hardware.input.IInputManager
 import android.hardware.input.AidlKeyGestureEvent
 import android.hardware.input.IKeyGestureEventListener
@@ -25,15 +27,20 @@
 import android.hardware.input.InputManager
 import android.hardware.input.InputManagerGlobal
 import android.hardware.input.KeyGestureEvent
-import android.hardware.input.KeyGestureEvent.KeyGestureType
 import android.os.IBinder
 import android.os.Process
+import android.os.SystemClock
+import android.os.SystemProperties
 import android.os.test.TestLooper
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
 import android.platform.test.annotations.Presubmit
+import android.platform.test.flag.junit.SetFlagsRule
 import android.view.InputDevice
-import android.view.KeyCharacterMap
 import android.view.KeyEvent
+import android.view.WindowManagerPolicyConstants.FLAG_INTERACTIVE
 import androidx.test.core.app.ApplicationProvider
+import com.android.internal.R
 import com.android.internal.annotations.Keep
 import com.android.internal.util.FrameworkStatsLog
 import com.android.modules.utils.testing.ExtendedMockitoRule
@@ -78,32 +85,60 @@
             KeyEvent.KEYCODE_META_LEFT to (KeyEvent.META_META_LEFT_ON or KeyEvent.META_META_ON),
             KeyEvent.KEYCODE_META_RIGHT to (KeyEvent.META_META_RIGHT_ON or KeyEvent.META_META_ON),
         )
+        const val SEARCH_KEY_BEHAVIOR_DEFAULT_SEARCH = 0
+        const val SEARCH_KEY_BEHAVIOR_TARGET_ACTIVITY = 1
+        const val SETTINGS_KEY_BEHAVIOR_SETTINGS_ACTIVITY = 0
+        const val SETTINGS_KEY_BEHAVIOR_NOTIFICATION_PANEL = 1
+        const val SETTINGS_KEY_BEHAVIOR_NOTHING = 2
     }
 
     @JvmField
     @Rule
     val extendedMockitoRule = ExtendedMockitoRule.Builder(this)
-        .mockStatic(FrameworkStatsLog::class.java).build()!!
+        .mockStatic(FrameworkStatsLog::class.java)
+        .mockStatic(SystemProperties::class.java).build()!!
+
+    @JvmField
+    @Rule
+    val rule = SetFlagsRule()
 
     @Mock
     private lateinit var iInputManager: IInputManager
 
+    @Mock
+    private lateinit var resources: Resources
+
+    @Mock
+    private lateinit var packageManager: PackageManager
+
     private var currentPid = 0
-    private lateinit var keyGestureController: KeyGestureController
     private lateinit var context: Context
     private lateinit var inputManagerGlobalSession: InputManagerGlobal.TestSession
     private lateinit var testLooper: TestLooper
     private var events = mutableListOf<KeyGestureEvent>()
-    private var handleEvents = mutableListOf<KeyGestureEvent>()
 
     @Before
     fun setup() {
         context = Mockito.spy(ContextWrapper(ApplicationProvider.getApplicationContext()))
+        Mockito.`when`(context.resources).thenReturn(resources)
         inputManagerGlobalSession = InputManagerGlobal.createTestSession(iInputManager)
         setupInputDevices()
+        setupBehaviors()
         testLooper = TestLooper()
         currentPid = Process.myPid()
-        keyGestureController = KeyGestureController(context, testLooper.looper)
+    }
+
+    private fun setupBehaviors() {
+        Mockito.`when`(
+            resources.getBoolean(
+                com.android.internal.R.bool.config_enableScreenshotChord
+            )
+        ).thenReturn(true)
+        Mockito.`when`(packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
+            .thenReturn(true)
+        Mockito.`when`(packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK))
+            .thenReturn(true)
+        Mockito.`when`(context.packageManager).thenReturn(packageManager)
     }
 
     private fun setupInputDevices() {
@@ -116,19 +151,22 @@
         Mockito.`when`(iInputManager.getInputDevice(DEVICE_ID)).thenReturn(keyboardDevice)
     }
 
-    private fun notifyHomeGestureCompleted() {
-        keyGestureController.notifyKeyGestureCompleted(DEVICE_ID, intArrayOf(KeyEvent.KEYCODE_H),
+    private fun notifyHomeGestureCompleted(keyGestureController: KeyGestureController) {
+        keyGestureController.notifyKeyGestureCompleted(
+            DEVICE_ID, intArrayOf(KeyEvent.KEYCODE_H),
             KeyEvent.META_META_ON or KeyEvent.META_META_LEFT_ON,
-            KeyGestureEvent.KEY_GESTURE_TYPE_HOME)
+            KeyGestureEvent.KEY_GESTURE_TYPE_HOME
+        )
     }
 
     @Test
     fun testKeyGestureEvent_registerUnregisterListener() {
+        val keyGestureController = KeyGestureController(context, testLooper.looper)
         val listener = KeyGestureEventListener()
 
         // Register key gesture event listener
         keyGestureController.registerKeyGestureEventListener(listener, 0)
-        notifyHomeGestureCompleted()
+        notifyHomeGestureCompleted(keyGestureController)
         testLooper.dispatchAll()
         assertEquals(
             "Listener should get callbacks on key gesture event completed",
@@ -144,7 +182,7 @@
         // Unregister listener
         events.clear()
         keyGestureController.unregisterKeyGestureEventListener(listener, 0)
-        notifyHomeGestureCompleted()
+        notifyHomeGestureCompleted(keyGestureController)
         testLooper.dispatchAll()
         assertEquals(
             "Listener should not get callback after being unregistered",
@@ -155,20 +193,22 @@
 
     @Test
     fun testKeyGestureEvent_multipleGestureHandlers() {
+        val keyGestureController = KeyGestureController(context, testLooper.looper)
+
         // Set up two callbacks.
         var callbackCount1 = 0
         var callbackCount2 = 0
         var selfCallback = 0
         val externalHandler1 = KeyGestureHandler { _, _ ->
-            callbackCount1++;
+            callbackCount1++
             true
         }
         val externalHandler2 = KeyGestureHandler { _, _ ->
-            callbackCount2++;
+            callbackCount2++
             true
         }
         val selfHandler = KeyGestureHandler { _, _ ->
-            selfCallback++;
+            selfCallback++
             false
         }
 
@@ -406,6 +446,14 @@
                 intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
             ),
             TestData(
+                "META + / -> Open Shortcut Helper",
+                intArrayOf(KeyEvent.KEYCODE_META_LEFT, KeyEvent.KEYCODE_SLASH),
+                KeyGestureEvent.KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER,
+                intArrayOf(KeyEvent.KEYCODE_SLASH),
+                KeyEvent.META_META_ON,
+                intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+            ),
+            TestData(
                 "BRIGHTNESS_UP -> Brightness Up",
                 intArrayOf(KeyEvent.KEYCODE_BRIGHTNESS_UP),
                 KeyGestureEvent.KEY_GESTURE_TYPE_BRIGHTNESS_UP,
@@ -528,12 +576,314 @@
                     KeyGestureEvent.ACTION_GESTURE_COMPLETE
                 )
             ),
+            TestData(
+                "CTRL + SPACE -> Switch Language Forward",
+                intArrayOf(KeyEvent.KEYCODE_CTRL_LEFT, KeyEvent.KEYCODE_SPACE),
+                KeyGestureEvent.KEY_GESTURE_TYPE_LANGUAGE_SWITCH,
+                intArrayOf(KeyEvent.KEYCODE_SPACE),
+                KeyEvent.META_CTRL_ON,
+                intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+            ),
+            TestData(
+                "CTRL + SHIFT + SPACE -> Switch Language Backward",
+                intArrayOf(
+                    KeyEvent.KEYCODE_CTRL_LEFT,
+                    KeyEvent.KEYCODE_SHIFT_LEFT,
+                    KeyEvent.KEYCODE_SPACE
+                ),
+                KeyGestureEvent.KEY_GESTURE_TYPE_LANGUAGE_SWITCH,
+                intArrayOf(KeyEvent.KEYCODE_SPACE),
+                KeyEvent.META_CTRL_ON or KeyEvent.META_SHIFT_ON,
+                intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+            ),
+            TestData(
+                "CTRL + ALT + Z -> Accessibility Shortcut",
+                intArrayOf(
+                    KeyEvent.KEYCODE_CTRL_LEFT,
+                    KeyEvent.KEYCODE_ALT_LEFT,
+                    KeyEvent.KEYCODE_Z
+                ),
+                KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT,
+                intArrayOf(KeyEvent.KEYCODE_Z),
+                KeyEvent.META_CTRL_ON or KeyEvent.META_ALT_ON,
+                intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+            ),
+            TestData(
+                "SYSRQ -> Take screenshot",
+                intArrayOf(KeyEvent.KEYCODE_SYSRQ),
+                KeyGestureEvent.KEY_GESTURE_TYPE_TAKE_SCREENSHOT,
+                intArrayOf(KeyEvent.KEYCODE_SYSRQ),
+                0,
+                intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+            ),
+            TestData(
+                "ESC -> Close All Dialogs",
+                intArrayOf(KeyEvent.KEYCODE_ESCAPE),
+                KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS,
+                intArrayOf(KeyEvent.KEYCODE_ESCAPE),
+                0,
+                intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+            ),
         )
     }
 
     @Test
     @Parameters(method = "keyGestureEventHandlerTestArguments")
     fun testKeyGestures(test: TestData) {
+        val keyGestureController = KeyGestureController(context, testLooper.looper)
+        testKeyGestureInternal(keyGestureController, test)
+    }
+
+    @Test
+    fun testKeycodesFullyConsumed_irrespectiveOfHandlers() {
+        val keyGestureController = KeyGestureController(context, testLooper.looper)
+        val testKeys = intArrayOf(
+            KeyEvent.KEYCODE_RECENT_APPS,
+            KeyEvent.KEYCODE_APP_SWITCH,
+            KeyEvent.KEYCODE_BRIGHTNESS_UP,
+            KeyEvent.KEYCODE_BRIGHTNESS_DOWN,
+            KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_DOWN,
+            KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_UP,
+            KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_TOGGLE,
+            KeyEvent.KEYCODE_ALL_APPS,
+            KeyEvent.KEYCODE_NOTIFICATION,
+            KeyEvent.KEYCODE_SETTINGS,
+            KeyEvent.KEYCODE_LANGUAGE_SWITCH,
+            KeyEvent.KEYCODE_SCREENSHOT,
+            KeyEvent.KEYCODE_META_LEFT,
+            KeyEvent.KEYCODE_META_RIGHT,
+            KeyEvent.KEYCODE_ASSIST,
+            KeyEvent.KEYCODE_VOICE_ASSIST,
+            KeyEvent.KEYCODE_STYLUS_BUTTON_PRIMARY,
+            KeyEvent.KEYCODE_STYLUS_BUTTON_SECONDARY,
+            KeyEvent.KEYCODE_STYLUS_BUTTON_TERTIARY,
+            KeyEvent.KEYCODE_STYLUS_BUTTON_TAIL,
+        )
+
+        val handler = KeyGestureHandler { _, _ -> false }
+        keyGestureController.registerKeyGestureHandler(handler, 0)
+
+        for (key in testKeys) {
+            sendKeys(keyGestureController, intArrayOf(key), assertNotSentToApps = true)
+        }
+    }
+
+    @Test
+    fun testSearchKeyGestures_defaultSearch() {
+        Mockito.`when`(resources.getInteger(R.integer.config_searchKeyBehavior))
+            .thenReturn(SEARCH_KEY_BEHAVIOR_DEFAULT_SEARCH)
+        val keyGestureController = KeyGestureController(context, testLooper.looper)
+        testKeyGestureNotProduced(
+            keyGestureController,
+            "SEARCH -> Default Search",
+            intArrayOf(KeyEvent.KEYCODE_SEARCH),
+        )
+    }
+
+    @Test
+    fun testSearchKeyGestures_searchActivity() {
+        Mockito.`when`(resources.getInteger(R.integer.config_searchKeyBehavior))
+            .thenReturn(SEARCH_KEY_BEHAVIOR_TARGET_ACTIVITY)
+        val keyGestureController = KeyGestureController(context, testLooper.looper)
+        testKeyGestureInternal(
+            keyGestureController,
+            TestData(
+                "SEARCH -> Launch Search Activity",
+                intArrayOf(KeyEvent.KEYCODE_SEARCH),
+                KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SEARCH,
+                intArrayOf(KeyEvent.KEYCODE_SEARCH),
+                0,
+                intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+            )
+        )
+    }
+
+    @Test
+    fun testSettingKeyGestures_doNothing() {
+        Mockito.`when`(resources.getInteger(R.integer.config_settingsKeyBehavior))
+            .thenReturn(SETTINGS_KEY_BEHAVIOR_NOTHING)
+        val keyGestureController = KeyGestureController(context, testLooper.looper)
+        testKeyGestureNotProduced(
+            keyGestureController,
+            "SETTINGS -> Do Nothing",
+            intArrayOf(KeyEvent.KEYCODE_SETTINGS),
+        )
+    }
+
+    @Test
+    fun testSettingKeyGestures_settingsActivity() {
+        Mockito.`when`(resources.getInteger(R.integer.config_settingsKeyBehavior))
+            .thenReturn(SETTINGS_KEY_BEHAVIOR_SETTINGS_ACTIVITY)
+        val keyGestureController = KeyGestureController(context, testLooper.looper)
+        testKeyGestureInternal(
+            keyGestureController,
+            TestData(
+                "SETTINGS -> Launch Settings Activity",
+                intArrayOf(KeyEvent.KEYCODE_SETTINGS),
+                KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS,
+                intArrayOf(KeyEvent.KEYCODE_SETTINGS),
+                0,
+                intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+            )
+        )
+    }
+
+    @Test
+    fun testSettingKeyGestures_notificationPanel() {
+        Mockito.`when`(resources.getInteger(R.integer.config_settingsKeyBehavior))
+            .thenReturn(SETTINGS_KEY_BEHAVIOR_NOTIFICATION_PANEL)
+        val keyGestureController = KeyGestureController(context, testLooper.looper)
+        testKeyGestureInternal(
+            keyGestureController,
+            TestData(
+                "SETTINGS -> Toggle Notification Panel",
+                intArrayOf(KeyEvent.KEYCODE_SETTINGS),
+                KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL,
+                intArrayOf(KeyEvent.KEYCODE_SETTINGS),
+                0,
+                intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+            )
+        )
+    }
+
+    @Test
+    @EnableFlags(com.android.server.flags.Flags.FLAG_NEW_BUGREPORT_KEYBOARD_SHORTCUT)
+    fun testTriggerBugReport() {
+        Mockito.`when`(SystemProperties.get("ro.debuggable")).thenReturn("1")
+        val keyGestureController = KeyGestureController(context, testLooper.looper)
+        testKeyGestureInternal(
+            keyGestureController,
+            TestData(
+                "META + CTRL + DEL -> Trigger Bug Report",
+                intArrayOf(
+                    KeyEvent.KEYCODE_META_LEFT,
+                    KeyEvent.KEYCODE_CTRL_LEFT,
+                    KeyEvent.KEYCODE_DEL
+                ),
+                KeyGestureEvent.KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT,
+                intArrayOf(KeyEvent.KEYCODE_DEL),
+                KeyEvent.META_META_ON or KeyEvent.META_CTRL_ON,
+                intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+            )
+        )
+    }
+
+    @Test
+    @DisableFlags(com.android.server.flags.Flags.FLAG_NEW_BUGREPORT_KEYBOARD_SHORTCUT)
+    fun testTriggerBugReport_flagDisabled() {
+        Mockito.`when`(SystemProperties.get("ro.debuggable")).thenReturn("1")
+        val keyGestureController = KeyGestureController(context, testLooper.looper)
+        testKeyGestureInternal(
+            keyGestureController,
+            TestData(
+                "META + CTRL + DEL -> Not Trigger Bug Report (Fallback to BACK)",
+                intArrayOf(
+                    KeyEvent.KEYCODE_META_LEFT,
+                    KeyEvent.KEYCODE_CTRL_LEFT,
+                    KeyEvent.KEYCODE_DEL
+                ),
+                KeyGestureEvent.KEY_GESTURE_TYPE_BACK,
+                intArrayOf(KeyEvent.KEYCODE_DEL),
+                KeyEvent.META_META_ON,
+                intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+            )
+        )
+    }
+
+    @Test
+    fun testCapsLockPressNotified() {
+        val keyGestureController = KeyGestureController(context, testLooper.looper)
+        val listener = KeyGestureEventListener()
+
+        keyGestureController.registerKeyGestureEventListener(listener, 0)
+        sendKeys(keyGestureController, intArrayOf(KeyEvent.KEYCODE_CAPS_LOCK))
+        testLooper.dispatchAll()
+        assertEquals(
+            "Listener should get callbacks on key gesture event completed",
+            1,
+            events.size
+        )
+        assertEquals(
+            "Listener should get callback for Toggle Caps Lock key gesture complete event",
+            KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK,
+            events[0].keyGestureType
+        )
+    }
+
+    @Keep
+    private fun keyGestureEventHandlerTestArguments_forKeyCombinations(): Array<TestData> {
+        return arrayOf(
+            TestData(
+                "VOLUME_DOWN + POWER -> Screenshot Chord",
+                intArrayOf(KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_POWER),
+                KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD,
+                intArrayOf(KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_POWER),
+                0,
+                intArrayOf(
+                    KeyGestureEvent.ACTION_GESTURE_START,
+                    KeyGestureEvent.ACTION_GESTURE_COMPLETE
+                )
+            ),
+            TestData(
+                "POWER + STEM_PRIMARY -> Screenshot Chord",
+                intArrayOf(KeyEvent.KEYCODE_POWER, KeyEvent.KEYCODE_STEM_PRIMARY),
+                KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD,
+                intArrayOf(KeyEvent.KEYCODE_POWER, KeyEvent.KEYCODE_STEM_PRIMARY),
+                0,
+                intArrayOf(
+                    KeyGestureEvent.ACTION_GESTURE_START,
+                    KeyGestureEvent.ACTION_GESTURE_COMPLETE
+                )
+            ),
+            TestData(
+                "VOLUME_DOWN + VOLUME_UP -> Accessibility Chord",
+                intArrayOf(KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_VOLUME_UP),
+                KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD,
+                intArrayOf(KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_VOLUME_UP),
+                0,
+                intArrayOf(
+                    KeyGestureEvent.ACTION_GESTURE_START,
+                    KeyGestureEvent.ACTION_GESTURE_COMPLETE
+                )
+            ),
+            TestData(
+                "BACK + DPAD_DOWN -> TV Accessibility Chord",
+                intArrayOf(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_DPAD_DOWN),
+                KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD,
+                intArrayOf(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_DPAD_DOWN),
+                0,
+                intArrayOf(
+                    KeyGestureEvent.ACTION_GESTURE_START,
+                    KeyGestureEvent.ACTION_GESTURE_COMPLETE
+                )
+            ),
+            TestData(
+                "BACK + DPAD_CENTER -> TV Trigger Bug Report",
+                intArrayOf(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_DPAD_CENTER),
+                KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT,
+                intArrayOf(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_DPAD_CENTER),
+                0,
+                intArrayOf(
+                    KeyGestureEvent.ACTION_GESTURE_START,
+                    KeyGestureEvent.ACTION_GESTURE_COMPLETE
+                )
+            ),
+        )
+    }
+
+    @Test
+    @Parameters(method = "keyGestureEventHandlerTestArguments_forKeyCombinations")
+    @EnableFlags(
+        com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER,
+        com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER_MULTI_PRESS_GESTURES
+    )
+    fun testKeyCombinationGestures(test: TestData) {
+        val keyGestureController = KeyGestureController(context, testLooper.looper)
+        testKeyGestureInternal(keyGestureController, test)
+    }
+
+    private fun testKeyGestureInternal(keyGestureController: KeyGestureController, test: TestData) {
+        var handleEvents = mutableListOf<KeyGestureEvent>()
         val handler = KeyGestureHandler { event, _ ->
             handleEvents.add(KeyGestureEvent(event))
             true
@@ -541,7 +891,7 @@
         keyGestureController.registerKeyGestureHandler(handler, 0)
         handleEvents.clear()
 
-        sendKeys(test.keys, /* assertAllConsumed = */ false)
+        sendKeys(keyGestureController, test.keys)
 
         assertEquals(
             "Test: $test doesn't produce correct number of key gesture events",
@@ -575,55 +925,37 @@
         keyGestureController.unregisterKeyGestureHandler(handler, 0)
     }
 
-    @Test
-    fun testKeycodesFullyConsumed_irrespectiveOfHandlers() {
-        val testKeys = intArrayOf(
-            KeyEvent.KEYCODE_RECENT_APPS,
-            KeyEvent.KEYCODE_APP_SWITCH,
-            KeyEvent.KEYCODE_BRIGHTNESS_UP,
-            KeyEvent.KEYCODE_BRIGHTNESS_DOWN,
-            KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_DOWN,
-            KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_UP,
-            KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_TOGGLE,
-            KeyEvent.KEYCODE_ALL_APPS,
-            KeyEvent.KEYCODE_NOTIFICATION,
-            KeyEvent.KEYCODE_SETTINGS,
-            KeyEvent.KEYCODE_LANGUAGE_SWITCH,
-            KeyEvent.KEYCODE_SCREENSHOT,
-            KeyEvent.KEYCODE_META_LEFT,
-            KeyEvent.KEYCODE_META_RIGHT,
-            KeyEvent.KEYCODE_ASSIST,
-            KeyEvent.KEYCODE_VOICE_ASSIST,
-            KeyEvent.KEYCODE_STYLUS_BUTTON_PRIMARY,
-            KeyEvent.KEYCODE_STYLUS_BUTTON_SECONDARY,
-            KeyEvent.KEYCODE_STYLUS_BUTTON_TERTIARY,
-            KeyEvent.KEYCODE_STYLUS_BUTTON_TAIL,
-        )
-
-        val handler = KeyGestureHandler { _, _ -> false }
-        keyGestureController.registerKeyGestureHandler(handler, 0)
-
-        for (key in testKeys) {
-            sendKeys(intArrayOf(key), /* assertAllConsumed = */ true)
+    private fun testKeyGestureNotProduced(
+        keyGestureController: KeyGestureController,
+        testName: String,
+        testKeys: IntArray
+    ) {
+        var handleEvents = mutableListOf<KeyGestureEvent>()
+        val handler = KeyGestureHandler { event, _ ->
+            handleEvents.add(KeyGestureEvent(event))
+            true
         }
+        keyGestureController.registerKeyGestureHandler(handler, 0)
+        handleEvents.clear()
+
+        sendKeys(keyGestureController, testKeys)
+        assertEquals("Test: $testName should not produce Key gesture", 0, handleEvents.size)
     }
 
-    private fun sendKeys(testKeys: IntArray, assertAllConsumed: Boolean) {
+    private fun sendKeys(
+        keyGestureController: KeyGestureController,
+        testKeys: IntArray,
+        assertNotSentToApps: Boolean = false
+    ) {
         var metaState = 0
+        val now = SystemClock.uptimeMillis()
         for (key in testKeys) {
             val downEvent = KeyEvent(
-                /* downTime = */0, /* eventTime = */ 0, KeyEvent.ACTION_DOWN, key,
-                0 /*repeat*/, metaState, KeyCharacterMap.VIRTUAL_KEYBOARD, 0 /*scancode*/,
-                0 /*flags*/, InputDevice.SOURCE_KEYBOARD
+                now, now, KeyEvent.ACTION_DOWN, key, 0 /*repeat*/, metaState,
+                DEVICE_ID, 0 /*scancode*/, 0 /*flags*/,
+                InputDevice.SOURCE_KEYBOARD
             )
-            val consumed =
-                keyGestureController.interceptKeyBeforeDispatching(null, downEvent, 0) == -1L
-            if (assertAllConsumed) {
-                assertTrue(
-                    "interceptKeyBeforeDispatching should consume all events $downEvent",
-                    consumed
-                )
-            }
+            interceptKey(keyGestureController, downEvent, assertNotSentToApps)
             metaState = metaState or MODIFIER.getOrDefault(key, 0)
 
             downEvent.recycle()
@@ -632,24 +964,39 @@
 
         for (key in testKeys.reversed()) {
             val upEvent = KeyEvent(
-                /* downTime = */0, /* eventTime = */ 0, KeyEvent.ACTION_UP, key,
-                0 /*repeat*/, metaState, KeyCharacterMap.VIRTUAL_KEYBOARD, 0 /*scancode*/,
-                0 /*flags*/, InputDevice.SOURCE_KEYBOARD
+                now, now, KeyEvent.ACTION_UP, key, 0 /*repeat*/, metaState,
+                DEVICE_ID, 0 /*scancode*/, 0 /*flags*/,
+                InputDevice.SOURCE_KEYBOARD
             )
-            val consumed =
-                keyGestureController.interceptKeyBeforeDispatching(null, upEvent, 0) == -1L
-            if (assertAllConsumed) {
-                assertTrue(
-                    "interceptKeyBeforeDispatching should consume all events $upEvent",
-                    consumed
-                )
-            }
+            interceptKey(keyGestureController, upEvent, assertNotSentToApps)
+            metaState = metaState and MODIFIER.getOrDefault(key, 0).inv()
 
             upEvent.recycle()
             testLooper.dispatchAll()
         }
     }
 
+    private fun interceptKey(
+        keyGestureController: KeyGestureController,
+        event: KeyEvent,
+        assertNotSentToApps: Boolean
+    ) {
+        keyGestureController.interceptKeyBeforeQueueing(event, FLAG_INTERACTIVE)
+        testLooper.dispatchAll()
+
+        val consumed =
+            keyGestureController.interceptKeyBeforeDispatching(null, event, 0) == -1L
+        if (assertNotSentToApps) {
+            assertTrue(
+                "interceptKeyBeforeDispatching should consume all events $event",
+                consumed
+            )
+        }
+        if (!consumed) {
+            keyGestureController.interceptUnhandledKey(event, null)
+        }
+    }
+
     inner class KeyGestureEventListener : IKeyGestureEventListener.Stub() {
         override fun onKeyGestureEvent(event: AidlKeyGestureEvent) {
             events.add(KeyGestureEvent(event))
diff --git a/tests/Input/src/com/android/test/input/UinputRecordingIntegrationTests.kt b/tests/Input/src/com/android/test/input/UinputRecordingIntegrationTests.kt
index c61a250..9f4df90 100644
--- a/tests/Input/src/com/android/test/input/UinputRecordingIntegrationTests.kt
+++ b/tests/Input/src/com/android/test/input/UinputRecordingIntegrationTests.kt
@@ -39,6 +39,7 @@
 import junit.framework.Assert.fail
 import org.hamcrest.Matchers.allOf
 import org.junit.Before
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.rules.TestName
@@ -107,6 +108,7 @@
         parser = InputJsonParser(instrumentation.context)
     }
 
+    @Ignore("b/366602644")
     @Test
     fun testEvemuRecording() {
         VirtualDisplayActivityScenario.AutoClose<CaptureEventActivity>(
diff --git a/tests/Internal/src/com/android/internal/os/ApplicationSharedMemoryTest.java b/tests/Internal/src/com/android/internal/os/ApplicationSharedMemoryTest.java
index e3a129f..d03ad5c 100644
--- a/tests/Internal/src/com/android/internal/os/ApplicationSharedMemoryTest.java
+++ b/tests/Internal/src/com/android/internal/os/ApplicationSharedMemoryTest.java
@@ -61,8 +61,13 @@
     @Test
     public void canRead() {
         ApplicationSharedMemory instance = ApplicationSharedMemory.getInstance();
-        instance.getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis();
-        // Don't actually care about the value of the above.
+        try {
+            instance.getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis();
+            // Don't actually care about the value of the above.
+        } catch (java.time.DateTimeException e) {
+            // This exception is okay during testing.  It means there was no time source, which
+            // could be because of network problems or a feature being flagged off.
+        }
     }
 
     /** Application processes should not have mutable access. */
diff --git a/tests/Internal/src/com/android/internal/os/OWNERS b/tests/Internal/src/com/android/internal/os/OWNERS
new file mode 100644
index 0000000..64ffa46
--- /dev/null
+++ b/tests/Internal/src/com/android/internal/os/OWNERS
@@ -0,0 +1,2 @@
+# ApplicationSharedMemory
+per-file *ApplicationSharedMemory* = file:/PERFORMANCE_OWNERS
diff --git a/tests/Tracing/src/com/android/internal/protolog/ProtoLogTest.java b/tests/Tracing/src/com/android/internal/protolog/ProtoLogTest.java
index 9d56a92..8ecddaa 100644
--- a/tests/Tracing/src/com/android/internal/protolog/ProtoLogTest.java
+++ b/tests/Tracing/src/com/android/internal/protolog/ProtoLogTest.java
@@ -16,6 +16,8 @@
 
 package com.android.internal.protolog;
 
+import static org.junit.Assert.assertThrows;
+
 import android.platform.test.annotations.Presubmit;
 
 import com.android.internal.protolog.common.IProtoLogGroup;
@@ -44,8 +46,29 @@
                 .containsExactly(TEST_GROUP_1, TEST_GROUP_2);
     }
 
+    @Test
+    public void throwOnRegisteringDuplicateGroup() {
+        final var assertion = assertThrows(RuntimeException.class,
+                () -> ProtoLog.init(TEST_GROUP_1, TEST_GROUP_1, TEST_GROUP_2));
+
+        Truth.assertThat(assertion).hasMessageThat().contains("" + TEST_GROUP_1.getId());
+        Truth.assertThat(assertion).hasMessageThat().contains("duplicate");
+    }
+
+    @Test
+    public void throwOnRegisteringGroupsWithIdCollisions() {
+        final var assertion = assertThrows(RuntimeException.class,
+                () -> ProtoLog.init(TEST_GROUP_1, TEST_GROUP_WITH_COLLISION, TEST_GROUP_2));
+
+        Truth.assertThat(assertion).hasMessageThat()
+            .contains("" + TEST_GROUP_WITH_COLLISION.getId());
+        Truth.assertThat(assertion).hasMessageThat().contains("collision");
+    }
+
     private static final IProtoLogGroup TEST_GROUP_1 = new ProtoLogGroup("TEST_TAG_1", 1);
     private static final IProtoLogGroup TEST_GROUP_2 = new ProtoLogGroup("TEST_TAG_2", 2);
+    private static final IProtoLogGroup TEST_GROUP_WITH_COLLISION =
+            new ProtoLogGroup("TEST_TAG_WITH_COLLISION", 1);
 
     private static class ProtoLogGroup implements IProtoLogGroup {
         private final boolean mEnabled;
diff --git a/tests/UsbTests/src/com/android/server/usb/UsbServiceTest.java b/tests/UsbTests/src/com/android/server/usb/UsbServiceTest.java
index 56845ae..51d57f0 100644
--- a/tests/UsbTests/src/com/android/server/usb/UsbServiceTest.java
+++ b/tests/UsbTests/src/com/android/server/usb/UsbServiceTest.java
@@ -18,6 +18,10 @@
 
 import static android.hardware.usb.UsbOperationInternal.USB_OPERATION_ERROR_INTERNAL;
 
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
@@ -31,12 +35,15 @@
 import android.content.Context;
 import android.hardware.usb.IUsbOperationInternal;
 import android.hardware.usb.flags.Flags;
+import android.hardware.usb.UsbPort;
 import android.os.RemoteException;
 import android.os.UserManager;
 import android.platform.test.flag.junit.SetFlagsRule;
 
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.server.LocalServices;
+
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -71,26 +78,38 @@
 
     private static final int TEST_SECOND_CALLER_ID = 2000;
 
+    private static final int TEST_INTERNAL_REQUESTER_REASON_1 = 100;
+
+    private static final int TEST_INTERNAL_REQUESTER_REASON_2 = 200;
+
     private UsbService mUsbService;
 
+    private UsbManagerInternal mUsbManagerInternal;
+
     @Rule
     public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
     @Before
     public void setUp() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_USB_DATA_SIGNAL_STAKING);
+        mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_USB_DATA_SIGNAL_STAKING_INTERNAL);
+        LocalServices.removeAllServicesForTest();
         MockitoAnnotations.initMocks(this);
 
-        when(mUsbPortManager.enableUsbData(eq(TEST_PORT_ID), anyBoolean(), eq(TEST_TRANSACTION_ID),
-                eq(mCallback), any())).thenReturn(true);
+        when(mUsbPortManager.enableUsbData(eq(TEST_PORT_ID), anyBoolean(),
+                 eq(TEST_TRANSACTION_ID), eq(mCallback), any())).thenReturn(true);
 
         mUsbService = new UsbService(mContext, mUsbPortManager, mUsbAlsaManager,
                 mUserManager, mUsbSettingsManager);
+        mUsbManagerInternal = LocalServices.getService(UsbManagerInternal.class);
+        assertWithMessage("LocalServices.getService(UsbManagerInternal.class)")
+            .that(mUsbManagerInternal).isNotNull();
     }
 
-    private void assertToggleUsbSuccessfully(int uid, boolean enable) {
+    private void assertToggleUsbSuccessfully(int requester, boolean enable,
+        boolean isInternalRequest) {
         assertTrue(mUsbService.enableUsbDataInternal(TEST_PORT_ID, enable,
-                TEST_TRANSACTION_ID, mCallback, uid));
+                TEST_TRANSACTION_ID, mCallback, requester, isInternalRequest));
 
         verify(mUsbPortManager).enableUsbData(TEST_PORT_ID,
                 enable, TEST_TRANSACTION_ID, mCallback, null);
@@ -100,9 +119,10 @@
         clearInvocations(mCallback);
     }
 
-    private void assertToggleUsbFailed(int uid, boolean enable) throws Exception {
+    private void assertToggleUsbFailed(int requester, boolean enable,
+        boolean isInternalRequest) throws Exception {
         assertFalse(mUsbService.enableUsbDataInternal(TEST_PORT_ID, enable,
-                TEST_TRANSACTION_ID, mCallback, uid));
+                TEST_TRANSACTION_ID, mCallback, requester, isInternalRequest));
 
         verifyZeroInteractions(mUsbPortManager);
         verify(mCallback).onOperationComplete(USB_OPERATION_ERROR_INTERNAL);
@@ -116,15 +136,16 @@
      */
     @Test
     public void disableUsb_successfullyDisable() {
-        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, false);
+        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, false, false);
     }
 
     /**
-     * Verify enableUsbData successfully enables USB port without error given no other stakers
+     * Verify enableUsbData successfully enables USB port without error given
+     * no other stakers
      */
     @Test
     public void enableUsbWhenNoOtherStakers_successfullyEnable() {
-        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, true);
+        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, true, false);
     }
 
     /**
@@ -132,47 +153,132 @@
      */
     @Test
     public void enableUsbPortWithOtherStakers_failsToEnable() throws Exception {
-        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, false);
+        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, false, false);
 
-        assertToggleUsbFailed(TEST_SECOND_CALLER_ID, true);
+        assertToggleUsbFailed(TEST_SECOND_CALLER_ID, true, false);
     }
 
     /**
-     * Verify enableUsbData successfully enables USB port when the last staker is removed
+     * Verify enableUsbData successfully enables USB port when the last staker
+     * is removed
      */
     @Test
     public void enableUsbByTheOnlyStaker_successfullyEnable() {
-        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, false);
+        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, false, false);
 
-        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, true);
+        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, true, false);
     }
 
     /**
-     * Verify enableUsbDataWhileDockedInternal does not enable USB port if other stakers are present
+     * Verify enableUsbDataWhileDockedInternal does not enable USB port if other
+     * stakers are present
      */
     @Test
     public void enableUsbWhileDockedWhenThereAreOtherStakers_failsToEnable()
             throws RemoteException {
-        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, false);
+        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, false, false);
 
         mUsbService.enableUsbDataWhileDockedInternal(TEST_PORT_ID, TEST_TRANSACTION_ID,
-                mCallback, TEST_SECOND_CALLER_ID);
+                mCallback, TEST_SECOND_CALLER_ID, false);
 
         verifyZeroInteractions(mUsbPortManager);
         verify(mCallback).onOperationComplete(USB_OPERATION_ERROR_INTERNAL);
     }
 
     /**
-     * Verify enableUsbDataWhileDockedInternal does enable USB port if other stakers are
-     * not present
+     * Verify enableUsbDataWhileDockedInternal does enable USB port if other
+     * stakers are not present
      */
     @Test
     public void enableUsbWhileDockedWhenThereAreNoStakers_SuccessfullyEnable() {
         mUsbService.enableUsbDataWhileDockedInternal(TEST_PORT_ID, TEST_TRANSACTION_ID,
-                mCallback, TEST_SECOND_CALLER_ID);
+                mCallback, TEST_SECOND_CALLER_ID, false);
 
         verify(mUsbPortManager).enableUsbDataWhileDocked(TEST_PORT_ID, TEST_TRANSACTION_ID,
                         mCallback, null);
         verifyZeroInteractions(mCallback);
     }
+
+    /**
+     * Verify enableUsbData successfully enables USB port without error given no
+     * other stakers for internal requests
+     */
+    @Test
+    public void enableUsbWhenNoOtherStakers_forInternalRequest_successfullyEnable() {
+        assertToggleUsbSuccessfully(TEST_INTERNAL_REQUESTER_REASON_1, true, true);
+    }
+
+    /**
+     * Verify enableUsbData does not enable USB port if other internal stakers
+     * are present for internal requests
+     */
+    @Test
+    public void enableUsbPortWithOtherInternalStakers_forInternalRequest_failsToEnable()
+        throws Exception {
+        assertToggleUsbSuccessfully(TEST_INTERNAL_REQUESTER_REASON_1, false, true);
+
+        assertToggleUsbFailed(TEST_INTERNAL_REQUESTER_REASON_2, true, true);
+    }
+
+    /**
+     * Verify enableUsbData does not enable USB port if other external stakers
+     * are present for internal requests
+     */
+    @Test
+    public void enableUsbPortWithOtherExternalStakers_forInternalRequest_failsToEnable()
+        throws Exception {
+        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, false, false);
+
+        assertToggleUsbFailed(TEST_INTERNAL_REQUESTER_REASON_2, true, true);
+    }
+
+    /**
+     * Verify enableUsbData does not enable USB port if other internal stakers
+     * are present for external requests
+     */
+    @Test
+    public void enableUsbPortWithOtherInternalStakers_forExternalRequest_failsToEnable()
+        throws Exception {
+        assertToggleUsbSuccessfully(TEST_INTERNAL_REQUESTER_REASON_1, false, true);
+
+        assertToggleUsbFailed(TEST_FIRST_CALLER_ID, true, false);
+    }
+
+    /**
+     * Verify enableUsbData successfully enables USB port when the last staker
+     * is removed for internal requests
+     */
+    @Test
+    public void enableUsbByTheOnlyStaker_forInternalRequest_successfullyEnable() {
+        assertToggleUsbSuccessfully(TEST_INTERNAL_REQUESTER_REASON_1, false, false);
+
+        assertToggleUsbSuccessfully(TEST_INTERNAL_REQUESTER_REASON_1, true, false);
+    }
+
+    /**
+     * Verify USB Manager internal calls mPortManager to get UsbPorts
+     */
+    @Test
+    public void usbManagerInternal_getPorts_callsPortManager() {
+        when(mUsbPortManager.getPorts()).thenReturn(new UsbPort[] {});
+
+        UsbPort[] ports = mUsbManagerInternal.getPorts();
+
+        verify(mUsbPortManager).getPorts();
+        assertEquals(ports.length, 0);
+    }
+
+    @Test
+    public void usbManagerInternal_enableUsbData_successfullyEnable() {
+        boolean desiredEnableState = true;
+
+        assertTrue(mUsbManagerInternal.enableUsbData(TEST_PORT_ID, desiredEnableState,
+        TEST_TRANSACTION_ID, mCallback, TEST_INTERNAL_REQUESTER_REASON_1));
+
+        verify(mUsbPortManager).enableUsbData(TEST_PORT_ID,
+                desiredEnableState, TEST_TRANSACTION_ID, mCallback, null);
+        verifyZeroInteractions(mCallback);
+        clearInvocations(mUsbPortManager);
+        clearInvocations(mCallback);
+    }
 }
diff --git a/tests/broadcasts/unit/TEST_MAPPING b/tests/broadcasts/unit/TEST_MAPPING
index 0e824c5..8919fdc 100644
--- a/tests/broadcasts/unit/TEST_MAPPING
+++ b/tests/broadcasts/unit/TEST_MAPPING
@@ -1,5 +1,5 @@
 {
-    "postsubmit": [
+    "presubmit": [
         {
             "name": "BroadcastUnitTests",
             "options": [
diff --git a/tests/testables/Android.bp b/tests/testables/Android.bp
index 7596ee7..f211185 100644
--- a/tests/testables/Android.bp
+++ b/tests/testables/Android.bp
@@ -25,7 +25,10 @@
 
 java_library {
     name: "testables",
-    srcs: ["src/**/*.java"],
+    srcs: [
+        "src/**/*.java",
+        "src/**/*.kt",
+    ],
     libs: [
         "android.test.runner.stubs.system",
         "android.test.mock.stubs.system",
diff --git a/tests/testables/src/android/testing/TestWithLooperRule.java b/tests/testables/src/android/testing/TestWithLooperRule.java
index 37b39c3..10df17f 100644
--- a/tests/testables/src/android/testing/TestWithLooperRule.java
+++ b/tests/testables/src/android/testing/TestWithLooperRule.java
@@ -34,13 +34,13 @@
  * Looper for the Statement.
  */
 public class TestWithLooperRule implements MethodRule {
-
     /*
      * This rule requires to be the inner most Rule, so the next statement is RunAfters
      * instead of another rule. You can set it by '@Rule(order = Integer.MAX_VALUE)'
      */
     @Override
     public Statement apply(Statement base, FrameworkMethod method, Object target) {
+
         // getting testRunner check, if AndroidTestingRunning then we skip this rule
         RunWith runWithAnnotation = target.getClass().getAnnotation(RunWith.class);
         if (runWithAnnotation != null) {
@@ -97,6 +97,9 @@
                     case "InvokeParameterizedMethod":
                         this.wrapFieldMethodFor(next, "frameworkMethod", method, target);
                         return;
+                    case "ExpectException":
+                        next = this.getNextStatement(next, "next");
+                        break;
                     default:
                         throw new Exception(
                                 String.format("Unexpected Statement received: [%s]",
diff --git a/tests/testables/tests/Android.bp b/tests/testables/tests/Android.bp
index 1eb36fa..c23f41a 100644
--- a/tests/testables/tests/Android.bp
+++ b/tests/testables/tests/Android.bp
@@ -34,6 +34,7 @@
         "androidx.core_core-animation",
         "androidx.core_core-ktx",
         "androidx.test.rules",
+        "androidx.test.ext.junit",
         "hamcrest-library",
         "mockito-target-inline-minus-junit4",
         "testables",
diff --git a/tests/testables/tests/src/android/testing/TestableLooperJUnit4Test.java b/tests/testables/tests/src/android/testing/TestableLooperJUnit4Test.java
new file mode 100644
index 0000000..b7d5e0e
--- /dev/null
+++ b/tests/testables/tests/src/android/testing/TestableLooperJUnit4Test.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 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 android.testing;
+
+import android.testing.TestableLooper.RunWithLooper;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Test that TestableLooper now handles expected exceptions in tests
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+@RunWithLooper
+public class TestableLooperJUnit4Test {
+    @Rule
+    public final TestWithLooperRule mTestWithLooperRule = new TestWithLooperRule();
+
+    @Test(expected = Exception.class)
+    public void testException() throws Exception {
+        throw new Exception("this exception is expected");
+    }
+}
+
diff --git a/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java b/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java
index 81814b6..7bc9970 100644
--- a/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java
+++ b/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java
@@ -25,6 +25,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
 
 import android.net.NetworkCapabilities;
 import android.net.wifi.WifiConfiguration;
@@ -39,6 +40,7 @@
     private static final int SUB_ID = 1;
     private static final int NETWORK_ID = 5;
     private static final int MIN_UDP_PORT_4500_NAT_TIMEOUT = 120;
+    private static final int MIN_UDP_PORT_4500_NAT_TIMEOUT_INVALID = 119;
     private static final WifiInfo WIFI_INFO =
             new WifiInfo.Builder().setNetworkId(NETWORK_ID).build();
 
@@ -48,6 +50,27 @@
             new VcnTransportInfo(WIFI_INFO, MIN_UDP_PORT_4500_NAT_TIMEOUT);
 
     @Test
+    public void testBuilder() {
+        final VcnTransportInfo transportInfo =
+                new VcnTransportInfo.Builder()
+                        .setMinUdpPort4500NatTimeoutSeconds(MIN_UDP_PORT_4500_NAT_TIMEOUT)
+                        .build();
+
+        assertEquals(
+                MIN_UDP_PORT_4500_NAT_TIMEOUT, transportInfo.getMinUdpPort4500NatTimeoutSeconds());
+    }
+
+    @Test
+    public void testBuilder_withInvalidNatTimeout() {
+        try {
+            new VcnTransportInfo.Builder()
+                    .setMinUdpPort4500NatTimeoutSeconds(MIN_UDP_PORT_4500_NAT_TIMEOUT_INVALID);
+            fail("Expected to fail due to invalid NAT timeout");
+        } catch (Exception expected) {
+        }
+    }
+
+    @Test
     public void testGetWifiInfo() {
         assertEquals(WIFI_INFO, WIFI_UNDERLYING_INFO.getWifiInfo());
 
diff --git a/tests/vcn/java/android/net/vcn/VcnUtilsTest.java b/tests/vcn/java/android/net/vcn/VcnUtilsTest.java
new file mode 100644
index 0000000..3ce6c8f
--- /dev/null
+++ b/tests/vcn/java/android/net/vcn/VcnUtilsTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2021 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 android.net.vcn;
+
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.TelephonyNetworkSpecifier;
+import android.net.wifi.WifiInfo;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+public class VcnUtilsTest {
+    private static final int SUB_ID = 1;
+
+    private static final WifiInfo WIFI_INFO = new WifiInfo.Builder().build();
+    private static final TelephonyNetworkSpecifier TEL_NETWORK_SPECIFIER =
+            new TelephonyNetworkSpecifier.Builder().setSubscriptionId(SUB_ID).build();
+    private static final VcnTransportInfo VCN_TRANSPORT_INFO =
+            new VcnTransportInfo.Builder().build();
+
+    private ConnectivityManager mMockConnectivityManager;
+    private Network mMockWifiNetwork;
+    private Network mMockCellNetwork;
+
+    private NetworkCapabilities mVcnCapsWithUnderlyingWifi;
+    private NetworkCapabilities mVcnCapsWithUnderlyingCell;
+
+    @Before
+    public void setUp() {
+        mMockConnectivityManager = mock(ConnectivityManager.class);
+
+        mMockWifiNetwork = mock(Network.class);
+        mVcnCapsWithUnderlyingWifi = newVcnCaps(VCN_TRANSPORT_INFO, mMockWifiNetwork);
+        final NetworkCapabilities wifiCaps =
+                new NetworkCapabilities.Builder()
+                        .addTransportType(TRANSPORT_WIFI)
+                        .setTransportInfo(WIFI_INFO)
+                        .build();
+        when(mMockConnectivityManager.getNetworkCapabilities(mMockWifiNetwork))
+                .thenReturn(wifiCaps);
+
+        mMockCellNetwork = mock(Network.class);
+        mVcnCapsWithUnderlyingCell = newVcnCaps(VCN_TRANSPORT_INFO, mMockCellNetwork);
+        final NetworkCapabilities cellCaps =
+                new NetworkCapabilities.Builder()
+                        .addTransportType(TRANSPORT_CELLULAR)
+                        .setNetworkSpecifier(TEL_NETWORK_SPECIFIER)
+                        .build();
+        when(mMockConnectivityManager.getNetworkCapabilities(mMockCellNetwork))
+                .thenReturn(cellCaps);
+    }
+
+    private static NetworkCapabilities newVcnCaps(
+            VcnTransportInfo vcnTransportInfo, Network underlyingNetwork) {
+        return new NetworkCapabilities.Builder()
+                .setTransportInfo(vcnTransportInfo)
+                .setUnderlyingNetworks(Collections.singletonList(underlyingNetwork))
+                .build();
+    }
+
+    @Test
+    public void getWifiInfoFromVcnCaps() {
+        assertEquals(
+                WIFI_INFO,
+                VcnUtils.getWifiInfoFromVcnCaps(
+                        mMockConnectivityManager, mVcnCapsWithUnderlyingWifi));
+    }
+
+    @Test
+    public void getWifiInfoFromVcnCaps_onVcnWithUnderlyingCell() {
+        assertNull(
+                VcnUtils.getWifiInfoFromVcnCaps(
+                        mMockConnectivityManager, mVcnCapsWithUnderlyingCell));
+    }
+
+    @Test
+    public void getSubIdFromVcnCaps() {
+        assertEquals(
+                SUB_ID,
+                VcnUtils.getSubIdFromVcnCaps(mMockConnectivityManager, mVcnCapsWithUnderlyingCell));
+    }
+
+    @Test
+    public void getSubIdFromVcnCaps_onVcnWithUnderlyingWifi() {
+        assertEquals(
+                INVALID_SUBSCRIPTION_ID,
+                VcnUtils.getSubIdFromVcnCaps(mMockConnectivityManager, mVcnCapsWithUnderlyingWifi));
+    }
+
+    @Test
+    public void getSubIdFromVcnCaps_onNonVcnNetwork() {
+        assertEquals(
+                INVALID_SUBSCRIPTION_ID,
+                VcnUtils.getSubIdFromVcnCaps(
+                        mMockConnectivityManager, new NetworkCapabilities.Builder().build()));
+    }
+
+    @Test
+    public void getSubIdFromVcnCaps_withMultipleUnderlyingNetworks() {
+        final NetworkCapabilities vcnCaps =
+                new NetworkCapabilities.Builder(mVcnCapsWithUnderlyingCell)
+                        .setUnderlyingNetworks(
+                                Arrays.asList(
+                                        new Network[] {mMockCellNetwork, mock(Network.class)}))
+                        .build();
+        assertEquals(SUB_ID, VcnUtils.getSubIdFromVcnCaps(mMockConnectivityManager, vcnCaps));
+    }
+}
diff --git a/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java b/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
index b5cc553..f1f74bc 100644
--- a/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
+++ b/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
@@ -206,7 +206,7 @@
                 .getAllSubscriptionInfoList();
 
         doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(anyInt());
-        setPrivilegedPackagesForMock(Collections.singletonList(PACKAGE_NAME));
+        setPrivilegedPackagesForMock(Collections.singleton(PACKAGE_NAME));
     }
 
     private IntentFilter getIntentFilter() {
@@ -293,7 +293,7 @@
                 Collections.singletonMap(TEST_SUBSCRIPTION_ID_1, TEST_CARRIER_CONFIG_WRAPPER));
     }
 
-    private void setPrivilegedPackagesForMock(@NonNull List<String> privilegedPackages) {
+    private void setPrivilegedPackagesForMock(@NonNull Set<String> privilegedPackages) {
         doReturn(privilegedPackages).when(mTelephonyManager).getPackagesWithCarrierPrivileges();
     }
 
@@ -390,7 +390,7 @@
     @Test
     public void testOnSubscriptionsChangedFired_onActiveSubIdsChanged() throws Exception {
         setupReadySubIds();
-        setPrivilegedPackagesForMock(Collections.emptyList());
+        setPrivilegedPackagesForMock(Collections.emptySet());
 
         doReturn(TEST_SUBSCRIPTION_ID_2).when(mDeps).getActiveDataSubscriptionId();
         final ActiveDataSubscriptionIdListener listener = getActiveDataSubscriptionIdListener();
@@ -411,7 +411,7 @@
     public void testOnSubscriptionsChangedFired_WithReadySubidsNoPrivilegedPackages()
             throws Exception {
         setupReadySubIds();
-        setPrivilegedPackagesForMock(Collections.emptyList());
+        setPrivilegedPackagesForMock(Collections.emptySet());
 
         final OnSubscriptionsChangedListener listener = getOnSubscriptionsChangedListener();
         listener.onSubscriptionsChanged();
@@ -567,7 +567,7 @@
         verify(mCallback).onNewSnapshot(eq(buildExpectedSnapshot(TEST_PRIVILEGED_PACKAGES)));
 
         // Simulate a loss of carrier privileges
-        setPrivilegedPackagesForMock(Collections.emptyList());
+        setPrivilegedPackagesForMock(Collections.emptySet());
         listener.onSubscriptionsChanged();
         mTestLooper.dispatchAll();
 
diff --git a/tools/aapt/StringPool.cpp b/tools/aapt/StringPool.cpp
index 1af8d6f..b2e48bd 100644
--- a/tools/aapt/StringPool.cpp
+++ b/tools/aapt/StringPool.cpp
@@ -40,7 +40,7 @@
 void printStringPool(const ResStringPool* pool)
 {
     if (pool->getError() == NO_INIT) {
-        printf("String pool is unitialized.\n");
+        printf("String pool is uninitialized.\n");
         return;
     } else if (pool->getError() != NO_ERROR) {
         printf("String pool is corrupt/invalid.\n");
diff --git a/tools/aapt2/Debug.cpp b/tools/aapt2/Debug.cpp
index df1d51e..2527dcd 100644
--- a/tools/aapt2/Debug.cpp
+++ b/tools/aapt2/Debug.cpp
@@ -346,6 +346,21 @@
             value->value->Accept(&body_printer);
             printer->Undent();
           }
+          printer->Println("Flag disabled values:");
+          for (const auto& value : entry.flag_disabled_values) {
+            printer->Print("(");
+            printer->Print(value->config.to_string());
+            printer->Print(") ");
+            value->value->Accept(&headline_printer);
+            if (options.show_sources && !value->value->GetSource().path.empty()) {
+              printer->Print(" src=");
+              printer->Print(value->value->GetSource().to_string());
+            }
+            printer->Println();
+            printer->Indent();
+            value->value->Accept(&body_printer);
+            printer->Undent();
+          }
           printer->Undent();
         }
       }
@@ -430,7 +445,7 @@
   using namespace android;
 
   if (pool->getError() == NO_INIT) {
-    printer->Print("String pool is unitialized.\n");
+    printer->Print("String pool is uninitialized.\n");
     return;
   } else if (pool->getError() != NO_ERROR) {
     printer->Print("String pool is corrupt/invalid.\n");
diff --git a/tools/aapt2/Resource.h b/tools/aapt2/Resource.h
index a274f04..0d261ab 100644
--- a/tools/aapt2/Resource.h
+++ b/tools/aapt2/Resource.h
@@ -71,6 +71,17 @@
 
 enum class FlagStatus { NoFlag = 0, Disabled = 1, Enabled = 2 };
 
+struct FeatureFlagAttribute {
+  std::string name;
+  bool negated = false;
+
+  std::string ToString() {
+    return (negated ? "!" : "") + name;
+  }
+
+  bool operator==(const FeatureFlagAttribute& o) const = default;
+};
+
 android::StringPiece to_string(ResourceType type);
 
 /**
@@ -232,6 +243,12 @@
 
   // Exported symbols
   std::vector<SourcedResourceName> exported_symbols;
+
+  // Flag status
+  FlagStatus flag_status = FlagStatus::NoFlag;
+
+  // Flag
+  std::optional<FeatureFlagAttribute> flag;
 };
 
 /**
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp
index a5aecc8..fb576df 100644
--- a/tools/aapt2/ResourceParser.cpp
+++ b/tools/aapt2/ResourceParser.cpp
@@ -107,9 +107,10 @@
   Visibility::Level visibility_level = Visibility::Level::kUndefined;
   bool staged_api = false;
   bool allow_new = false;
-  FlagStatus flag_status = FlagStatus::NoFlag;
   std::optional<OverlayableItem> overlayable_item;
   std::optional<StagedId> staged_alias;
+  std::optional<FeatureFlagAttribute> flag;
+  FlagStatus flag_status = FlagStatus::NoFlag;
 
   std::string comment;
   std::unique_ptr<Value> value;
@@ -151,6 +152,7 @@
   }
 
   if (res->value != nullptr) {
+    res->value->SetFlag(res->flag);
     res->value->SetFlagStatus(res->flag_status);
     // Attach the comment, source and config to the value.
     res->value->SetComment(std::move(res->comment));
@@ -162,8 +164,6 @@
     res_builder.SetStagedId(res->staged_alias.value());
   }
 
-  res_builder.SetFlagStatus(res->flag_status);
-
   bool error = false;
   if (!res->name.entry.empty()) {
     if (!table->AddResource(res_builder.Build(), diag)) {
@@ -546,12 +546,26 @@
       {"symbol", std::mem_fn(&ResourceParser::ParseSymbol)},
   });
 
-  std::string resource_type = parser->element_name();
-  auto flag_status = GetFlagStatus(parser);
-  if (!flag_status) {
-    return false;
+  std::string_view resource_type = parser->element_name();
+  if (auto flag = ParseFlag(xml::FindAttribute(parser, xml::kSchemaAndroid, "featureFlag"))) {
+    if (options_.flag) {
+      diag_->Error(android::DiagMessage(source_.WithLine(parser->line_number()))
+                   << "Resource flag are not allowed both in the path and in the file");
+      return false;
+    }
+    out_resource->flag = std::move(flag);
+    std::string error;
+    auto flag_status = GetFlagStatus(out_resource->flag, options_.feature_flag_values, &error);
+    if (flag_status) {
+      out_resource->flag_status = flag_status.value();
+    } else {
+      diag_->Error(android::DiagMessage(source_.WithLine(parser->line_number())) << error);
+      return false;
+    }
+  } else if (options_.flag) {
+    out_resource->flag = options_.flag;
+    out_resource->flag_status = options_.flag_status;
   }
-  out_resource->flag_status = flag_status.value();
 
   // The value format accepted for this resource.
   uint32_t resource_format = 0u;
@@ -567,7 +581,7 @@
 
     // Items have their type encoded in the type attribute.
     if (std::optional<StringPiece> maybe_type = xml::FindNonEmptyAttribute(parser, "type")) {
-      resource_type = std::string(maybe_type.value());
+      resource_type = maybe_type.value();
     } else {
       diag_->Error(android::DiagMessage(source_.WithLine(parser->line_number()))
                    << "<item> must have a 'type' attribute");
@@ -590,7 +604,7 @@
 
     // Bags have their type encoded in the type attribute.
     if (std::optional<StringPiece> maybe_type = xml::FindNonEmptyAttribute(parser, "type")) {
-      resource_type = std::string(maybe_type.value());
+      resource_type = maybe_type.value();
     } else {
       diag_->Error(android::DiagMessage(source_.WithLine(parser->line_number()))
                    << "<bag> must have a 'type' attribute");
@@ -733,33 +747,6 @@
   return false;
 }
 
-std::optional<FlagStatus> ResourceParser::GetFlagStatus(xml::XmlPullParser* parser) {
-  auto flag_status = FlagStatus::NoFlag;
-
-  std::optional<StringPiece> flag = xml::FindAttribute(parser, xml::kSchemaAndroid, "featureFlag");
-  if (flag) {
-    auto flag_it = options_.feature_flag_values.find(flag.value());
-    if (flag_it == options_.feature_flag_values.end()) {
-      diag_->Error(android::DiagMessage(source_.WithLine(parser->line_number()))
-                   << "Resource flag value undefined");
-      return {};
-    }
-    const auto& flag_properties = flag_it->second;
-    if (!flag_properties.read_only) {
-      diag_->Error(android::DiagMessage(source_.WithLine(parser->line_number()))
-                   << "Only read only flags may be used with resources");
-      return {};
-    }
-    if (!flag_properties.enabled.has_value()) {
-      diag_->Error(android::DiagMessage(source_.WithLine(parser->line_number()))
-                   << "Only flags with a value may be used with resources");
-      return {};
-    }
-    flag_status = flag_properties.enabled.value() ? FlagStatus::Enabled : FlagStatus::Disabled;
-  }
-  return flag_status;
-}
-
 bool ResourceParser::ParseItem(xml::XmlPullParser* parser,
                                ParsedResource* out_resource,
                                const uint32_t format) {
@@ -1542,13 +1529,34 @@
   ResolvePackage(parser, &maybe_key.value());
   maybe_key.value().SetSource(source);
 
+  auto flag = ParseFlag(xml::FindAttribute(parser, xml::kSchemaAndroid, "featureFlag"));
+
   std::unique_ptr<Item> value = ParseXml(parser, 0, kAllowRawString);
   if (!value) {
     diag_->Error(android::DiagMessage(source) << "could not parse style item");
     return false;
   }
 
-  style->entries.push_back(Style::Entry{std::move(maybe_key.value()), std::move(value)});
+  if (flag) {
+    if (options_.flag) {
+      diag_->Error(android::DiagMessage(source_.WithLine(parser->line_number()))
+                   << "Resource flag are not allowed both in the path and in the file");
+      return false;
+    }
+    std::string error;
+    auto flag_status = GetFlagStatus(flag, options_.feature_flag_values, &error);
+    if (flag_status) {
+      value->SetFlagStatus(flag_status.value());
+      value->SetFlag(std::move(flag));
+    } else {
+      diag_->Error(android::DiagMessage(source_.WithLine(parser->line_number())) << error);
+      return false;
+    }
+  }
+
+  if (value->GetFlagStatus() != FlagStatus::Disabled) {
+    style->entries.push_back(Style::Entry{std::move(maybe_key.value()), std::move(value)});
+  }
   return true;
 }
 
@@ -1666,21 +1674,25 @@
     const std::string& element_namespace = parser->element_namespace();
     const std::string& element_name = parser->element_name();
     if (element_namespace.empty() && element_name == "item") {
-      auto flag_status = GetFlagStatus(parser);
-      if (!flag_status) {
-        error = true;
-        continue;
-      }
+      auto flag = ParseFlag(xml::FindAttribute(parser, xml::kSchemaAndroid, "featureFlag"));
       std::unique_ptr<Item> item = ParseXml(parser, typeMask, kNoRawString);
       if (!item) {
         diag_->Error(android::DiagMessage(item_source) << "could not parse array item");
         error = true;
         continue;
       }
-      item->SetFlagStatus(flag_status.value());
+      item->SetFlag(flag);
+      std::string err;
+      auto status = GetFlagStatus(flag, options_.feature_flag_values, &err);
+      if (status) {
+        item->SetFlagStatus(status.value());
+      } else {
+        diag_->Error(android::DiagMessage(item_source) << err);
+        error = true;
+        continue;
+      }
       item->SetSource(item_source);
       array->elements.emplace_back(std::move(item));
-
     } else if (!ShouldIgnoreElement(element_namespace, element_name)) {
       diag_->Error(android::DiagMessage(source_.WithLine(parser->line_number()))
                    << "unknown tag <" << element_namespace << ":" << element_name << ">");
diff --git a/tools/aapt2/ResourceParser.h b/tools/aapt2/ResourceParser.h
index 442dea8..90690d5 100644
--- a/tools/aapt2/ResourceParser.h
+++ b/tools/aapt2/ResourceParser.h
@@ -57,6 +57,11 @@
   std::optional<Visibility::Level> visibility;
 
   FeatureFlagValues feature_flag_values;
+
+  // The flag that should be applied to all resources parsed
+  std::optional<FeatureFlagAttribute> flag;
+
+  FlagStatus flag_status = FlagStatus::NoFlag;
 };
 
 struct FlattenedXmlSubTree {
@@ -85,8 +90,6 @@
  private:
   DISALLOW_COPY_AND_ASSIGN(ResourceParser);
 
-  std::optional<FlagStatus> GetFlagStatus(xml::XmlPullParser* parser);
-
   std::optional<FlattenedXmlSubTree> CreateFlattenSubTree(xml::XmlPullParser* parser);
 
   // Parses the XML subtree as a StyleString (flattened XML representation for strings with
diff --git a/tools/aapt2/ResourceTable.cpp b/tools/aapt2/ResourceTable.cpp
index 9751459..5435cba2 100644
--- a/tools/aapt2/ResourceTable.cpp
+++ b/tools/aapt2/ResourceTable.cpp
@@ -101,6 +101,21 @@
   }
 };
 
+struct ConfigFlagKey {
+  const ConfigDescription* config;
+  StringPiece product;
+  const FeatureFlagAttribute& flag;
+};
+
+struct lt_config_flag_key_ref {
+  template <typename T>
+  bool operator()(const T& lhs, const ConfigFlagKey& rhs) const noexcept {
+    return std::tie(lhs->config, lhs->product, lhs->value->GetFlag()->name,
+                    lhs->value->GetFlag()->negated) <
+           std::tie(*rhs.config, rhs.product, rhs.flag.name, rhs.flag.negated);
+  }
+};
+
 }  // namespace
 
 ResourceTable::ResourceTable(ResourceTable::Validation validation) : validation_(validation) {
@@ -213,6 +228,25 @@
   return results;
 }
 
+ResourceConfigValue* ResourceEntry::FindOrCreateFlagDisabledValue(
+    const FeatureFlagAttribute& flag, const android::ConfigDescription& config,
+    android::StringPiece product) {
+  auto iter = std::lower_bound(flag_disabled_values.begin(), flag_disabled_values.end(),
+                               ConfigFlagKey{&config, product, flag}, lt_config_flag_key_ref());
+  if (iter != flag_disabled_values.end()) {
+    ResourceConfigValue* value = iter->get();
+    const auto value_flag = value->value->GetFlag().value();
+    if (value_flag.name == flag.name && value_flag.negated == flag.negated &&
+        value->config == config && value->product == product) {
+      return value;
+    }
+  }
+  ResourceConfigValue* newValue =
+      flag_disabled_values.insert(iter, util::make_unique<ResourceConfigValue>(config, product))
+          ->get();
+  return newValue;
+}
+
 bool ResourceEntry::HasDefaultValue() const {
   // The default config should be at the top of the list, since the list is sorted.
   return !values.empty() && values.front()->config == ConfigDescription::DefaultConfig();
@@ -375,13 +409,14 @@
   }
 };
 
-void InsertEntryIntoTableView(ResourceTableView& table, const ResourceTablePackage* package,
-                              const ResourceTableType* type, const std::string& entry_name,
-                              const std::optional<ResourceId>& id, const Visibility& visibility,
-                              const std::optional<AllowNew>& allow_new,
-                              const std::optional<OverlayableItem>& overlayable_item,
-                              const std::optional<StagedId>& staged_id,
-                              const std::vector<std::unique_ptr<ResourceConfigValue>>& values) {
+void InsertEntryIntoTableView(
+    ResourceTableView& table, const ResourceTablePackage* package, const ResourceTableType* type,
+    const std::string& entry_name, const std::optional<ResourceId>& id,
+    const Visibility& visibility, const std::optional<AllowNew>& allow_new,
+    const std::optional<OverlayableItem>& overlayable_item,
+    const std::optional<StagedId>& staged_id,
+    const std::vector<std::unique_ptr<ResourceConfigValue>>& values,
+    const std::vector<std::unique_ptr<ResourceConfigValue>>& flag_disabled_values) {
   SortedVectorInserter<ResourceTablePackageView, PackageViewComparer> package_inserter;
   SortedVectorInserter<ResourceTableTypeView, TypeViewComparer> type_inserter;
   SortedVectorInserter<ResourceTableEntryView, EntryViewComparer> entry_inserter;
@@ -408,6 +443,9 @@
   for (auto& value : values) {
     new_entry.values.emplace_back(value.get());
   }
+  for (auto& value : flag_disabled_values) {
+    new_entry.flag_disabled_values.emplace_back(value.get());
+  }
 
   entry_inserter.Insert(view_type->entries, std::move(new_entry));
 }
@@ -426,6 +464,21 @@
   return nullptr;
 }
 
+const ResourceConfigValue* ResourceTableEntryView::FindFlagDisabledValue(
+    const FeatureFlagAttribute& flag, const ConfigDescription& config,
+    android::StringPiece product) const {
+  auto iter = std::lower_bound(flag_disabled_values.begin(), flag_disabled_values.end(),
+                               ConfigFlagKey{&config, product, flag}, lt_config_flag_key_ref());
+  if (iter != values.end()) {
+    const ResourceConfigValue* value = *iter;
+    if (value->value->GetFlag() == flag && value->config == config &&
+        StringPiece(value->product) == product) {
+      return value;
+    }
+  }
+  return nullptr;
+}
+
 ResourceTableView ResourceTable::GetPartitionedView(const ResourceTableViewOptions& options) const {
   ResourceTableView view;
   for (const auto& package : packages) {
@@ -433,13 +486,13 @@
       for (const auto& entry : type->entries) {
         InsertEntryIntoTableView(view, package.get(), type.get(), entry->name, entry->id,
                                  entry->visibility, entry->allow_new, entry->overlayable_item,
-                                 entry->staged_id, entry->values);
+                                 entry->staged_id, entry->values, entry->flag_disabled_values);
 
         if (options.create_alias_entries && entry->staged_id) {
           auto alias_id = entry->staged_id.value().id;
           InsertEntryIntoTableView(view, package.get(), type.get(), entry->name, alias_id,
                                    entry->visibility, entry->allow_new, entry->overlayable_item, {},
-                                   entry->values);
+                                   entry->values, entry->flag_disabled_values);
         }
       }
     }
@@ -587,6 +640,25 @@
     entry->staged_id = res.staged_id.value();
   }
 
+  if (res.value != nullptr && res.value->GetFlagStatus() == FlagStatus::Disabled) {
+    auto disabled_config_value =
+        entry->FindOrCreateFlagDisabledValue(res.value->GetFlag().value(), res.config, res.product);
+    if (!disabled_config_value->value) {
+      // Resource does not exist, add it now.
+      // Must clone the value since it might be in the values vector as well
+      CloningValueTransformer cloner(&string_pool);
+      disabled_config_value->value = res.value->Transform(cloner);
+    } else {
+      diag->Error(android::DiagMessage(source)
+                  << "duplicate value for resource '" << res.name << "' " << "with config '"
+                  << res.config << "' and flag '"
+                  << (res.value->GetFlag().value().negated ? "!" : "")
+                  << res.value->GetFlag().value().name << "'");
+      diag->Error(android::DiagMessage(source) << "resource previously defined here");
+      return false;
+    }
+  }
+
   if (res.value != nullptr) {
     auto config_value = entry->FindOrCreateValue(res.config, res.product);
     if (!config_value->value) {
@@ -595,9 +667,9 @@
     } else {
       // When validation is enabled, ensure that a resource cannot have multiple values defined for
       // the same configuration unless protected by flags.
-      auto result =
-          validate ? ResolveFlagCollision(config_value->value->GetFlagStatus(), res.flag_status)
-                   : CollisionResult::kKeepBoth;
+      auto result = validate ? ResolveFlagCollision(config_value->value->GetFlagStatus(),
+                                                    res.value->GetFlagStatus())
+                             : CollisionResult::kKeepBoth;
       if (result == CollisionResult::kConflict) {
         result = ResolveValueCollision(config_value->value.get(), res.value.get());
       }
@@ -771,11 +843,6 @@
   return *this;
 }
 
-NewResourceBuilder& NewResourceBuilder::SetFlagStatus(FlagStatus flag_status) {
-  res_.flag_status = flag_status;
-  return *this;
-}
-
 NewResource NewResourceBuilder::Build() {
   return std::move(res_);
 }
diff --git a/tools/aapt2/ResourceTable.h b/tools/aapt2/ResourceTable.h
index cba6b70..b0e1855 100644
--- a/tools/aapt2/ResourceTable.h
+++ b/tools/aapt2/ResourceTable.h
@@ -136,6 +136,9 @@
   // The resource's values for each configuration.
   std::vector<std::unique_ptr<ResourceConfigValue>> values;
 
+  // The resource's values that are behind disabled flags.
+  std::vector<std::unique_ptr<ResourceConfigValue>> flag_disabled_values;
+
   explicit ResourceEntry(android::StringPiece name) : name(name) {
   }
 
@@ -148,6 +151,13 @@
                                          android::StringPiece product);
   std::vector<ResourceConfigValue*> FindAllValues(const android::ConfigDescription& config);
 
+  // Either returns the existing ResourceConfigValue in the disabled list with the given flag,
+  // config, and product or creates a new one and returns that. In either case the returned value
+  // does not have the flag set on the value so it must be set by the caller.
+  ResourceConfigValue* FindOrCreateFlagDisabledValue(const FeatureFlagAttribute& flag,
+                                                     const android::ConfigDescription& config,
+                                                     android::StringPiece product = {});
+
   template <typename Func>
   std::vector<ResourceConfigValue*> FindValuesIf(Func f) {
     std::vector<ResourceConfigValue*> results;
@@ -215,9 +225,14 @@
   std::optional<OverlayableItem> overlayable_item;
   std::optional<StagedId> staged_id;
   std::vector<const ResourceConfigValue*> values;
+  std::vector<const ResourceConfigValue*> flag_disabled_values;
 
   const ResourceConfigValue* FindValue(const android::ConfigDescription& config,
                                        android::StringPiece product = {}) const;
+
+  const ResourceConfigValue* FindFlagDisabledValue(const FeatureFlagAttribute& flag,
+                                                   const android::ConfigDescription& config,
+                                                   android::StringPiece product = {}) const;
 };
 
 struct ResourceTableTypeView {
@@ -269,7 +284,6 @@
   std::optional<AllowNew> allow_new;
   std::optional<StagedId> staged_id;
   bool allow_mangled = false;
-  FlagStatus flag_status = FlagStatus::NoFlag;
 };
 
 struct NewResourceBuilder {
@@ -283,7 +297,6 @@
   NewResourceBuilder& SetAllowNew(AllowNew allow_new);
   NewResourceBuilder& SetStagedId(StagedId id);
   NewResourceBuilder& SetAllowMangled(bool allow_mangled);
-  NewResourceBuilder& SetFlagStatus(FlagStatus flag_status);
   NewResource Build();
 
  private:
diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp
index b75e87c..723cfc0 100644
--- a/tools/aapt2/ResourceValues.cpp
+++ b/tools/aapt2/ResourceValues.cpp
@@ -1102,6 +1102,7 @@
 std::unique_ptr<T> CopyValueFields(std::unique_ptr<T> new_value, const T* value) {
   new_value->SetSource(value->GetSource());
   new_value->SetComment(value->GetComment());
+  new_value->SetFlag(value->GetFlag());
   new_value->SetFlagStatus(value->GetFlagStatus());
   return new_value;
 }
diff --git a/tools/aapt2/ResourceValues.h b/tools/aapt2/ResourceValues.h
index a1b1839..e000c65 100644
--- a/tools/aapt2/ResourceValues.h
+++ b/tools/aapt2/ResourceValues.h
@@ -65,10 +65,21 @@
     return translatable_;
   }
 
+  void SetFlag(std::optional<FeatureFlagAttribute> val) {
+    flag_ = val;
+  }
+
+  std::optional<FeatureFlagAttribute> GetFlag() const {
+    return flag_;
+  }
+
   void SetFlagStatus(FlagStatus val) {
     flag_status_ = val;
   }
 
+  // If the value is behind a flag this returns whether that flag was enabled when the value was
+  // parsed by comparing it to the flags passed on the command line to aapt2 (taking into account
+  // negation if necessary). If there was no flag, FlagStatus::NoFlag is returned instead.
   FlagStatus GetFlagStatus() const {
     return flag_status_;
   }
@@ -128,6 +139,7 @@
   std::string comment_;
   bool weak_ = false;
   bool translatable_ = true;
+  std::optional<FeatureFlagAttribute> flag_;
   FlagStatus flag_status_ = FlagStatus::NoFlag;
 
  private:
diff --git a/tools/aapt2/Resources.proto b/tools/aapt2/Resources.proto
index 5c64089..fe9b4a8 100644
--- a/tools/aapt2/Resources.proto
+++ b/tools/aapt2/Resources.proto
@@ -240,6 +240,9 @@
 
   // The staged resource ID of this finalized resource.
   StagedId staged_id = 7;
+
+  // The set of values defined for this entry which are behind disabled flags
+  repeated ConfigValue flag_disabled_config_value = 8;
 }
 
 // A Configuration/Value pair.
@@ -283,6 +286,8 @@
 
   // The status of the flag the value is behind if any
   uint32 flag_status = 8;
+  bool flag_negated = 9;
+  string flag_name = 10;
 }
 
 // A CompoundValue is an abstract type. It represents a value that is a made of other values.
@@ -297,6 +302,11 @@
     Plural plural = 5;
     MacroBody macro = 6;
   }
+
+  // The status of the flag the value is behind if any
+  uint32 flag_status = 7;
+  bool flag_negated = 8;
+  string flag_name = 9;
 }
 
 // Message holding a boolean, so it can be optionally encoded.
diff --git a/tools/aapt2/ResourcesInternal.proto b/tools/aapt2/ResourcesInternal.proto
index b0ed3da3..f4735a2 100644
--- a/tools/aapt2/ResourcesInternal.proto
+++ b/tools/aapt2/ResourcesInternal.proto
@@ -49,4 +49,9 @@
 
   // Any symbols this file auto-generates/exports (eg. @+id/foo in an XML file).
   repeated Symbol exported_symbol = 5;
+
+  // The status of the flag the file is behind if any
+  uint32 flag_status = 6;
+  bool flag_negated = 7;
+  string flag_name = 8;
 }
diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp
index 2a978a5..52372fa 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -67,6 +67,7 @@
   std::string resource_dir;
   std::string name;
   std::string extension;
+  std::string flag_name;
 
   // Original config str. We keep this because when we parse the config, we may add on
   // version qualifiers. We want to preserve the original input so the output is easily
@@ -81,6 +82,22 @@
                                                                std::string* out_error,
                                                                const CompileOptions& options) {
   std::vector<std::string> parts = util::Split(path, dir_sep);
+
+  std::string flag_name;
+  // Check for a flag
+  for (auto iter = parts.begin(); iter != parts.end();) {
+    if (iter->starts_with("flag(") && iter->ends_with(")")) {
+      if (!flag_name.empty()) {
+        if (out_error) *out_error = "resource path cannot contain more than one flag directory";
+        return {};
+      }
+      flag_name = iter->substr(5, iter->size() - 6);
+      iter = parts.erase(iter);
+    } else {
+      ++iter;
+    }
+  }
+
   if (parts.size() < 2) {
     if (out_error) *out_error = "bad resource path";
     return {};
@@ -131,6 +148,7 @@
                           std::string(dir_str),
                           std::string(name),
                           std::string(extension),
+                          std::move(flag_name),
                           std::string(config_str),
                           config};
 }
@@ -142,6 +160,9 @@
     name << "-" << data.config_str;
   }
   name << "_" << data.name;
+  if (!data.flag_name.empty()) {
+    name << ".(" << data.flag_name << ")";
+  }
   if (!data.extension.empty()) {
     name << "." << data.extension;
   }
@@ -163,7 +184,6 @@
                                        << "failed to open file: " << fin->GetError());
       return false;
     }
-
     // Parse the values file from XML.
     xml::XmlPullParser xml_parser(fin.get());
 
@@ -176,6 +196,18 @@
     // If visibility was forced, we need to use it when creating a new resource and also error if
     // we try to parse the <public>, <public-group>, <java-symbol> or <symbol> tags.
     parser_options.visibility = options.visibility;
+    parser_options.flag = ParseFlag(path_data.flag_name);
+
+    if (parser_options.flag) {
+      std::string error;
+      auto flag_status = GetFlagStatus(parser_options.flag, options.feature_flag_values, &error);
+      if (flag_status) {
+        parser_options.flag_status = std::move(flag_status.value());
+      } else {
+        context->GetDiagnostics()->Error(android::DiagMessage(path_data.source) << error);
+        return false;
+      }
+    }
 
     ResourceParser res_parser(context->GetDiagnostics(), &table, path_data.source, path_data.config,
         parser_options);
@@ -402,6 +434,18 @@
   xmlres->file.config = path_data.config;
   xmlres->file.source = path_data.source;
   xmlres->file.type = ResourceFile::Type::kProtoXml;
+  xmlres->file.flag = ParseFlag(path_data.flag_name);
+
+  if (xmlres->file.flag) {
+    std::string error;
+    auto flag_status = GetFlagStatus(xmlres->file.flag, options.feature_flag_values, &error);
+    if (flag_status) {
+      xmlres->file.flag_status = flag_status.value();
+    } else {
+      context->GetDiagnostics()->Error(android::DiagMessage(path_data.source) << error);
+      return false;
+    }
+  }
 
   // Collect IDs that are defined here.
   XmlIdCollector collector;
@@ -491,6 +535,27 @@
   res_file.source = path_data.source;
   res_file.type = ResourceFile::Type::kPng;
 
+  if (!path_data.flag_name.empty()) {
+    FeatureFlagAttribute flag;
+    auto name = path_data.flag_name;
+    if (name.starts_with('!')) {
+      flag.negated = true;
+      flag.name = name.substr(1);
+    } else {
+      flag.name = name;
+    }
+    res_file.flag = flag;
+
+    std::string error;
+    auto flag_status = GetFlagStatus(flag, options.feature_flag_values, &error);
+    if (flag_status) {
+      res_file.flag_status = flag_status.value();
+    } else {
+      context->GetDiagnostics()->Error(android::DiagMessage(path_data.source) << error);
+      return false;
+    }
+  }
+
   {
     auto data = file->OpenAsData();
     if (!data) {
diff --git a/tools/aapt2/cmd/Diff.cpp b/tools/aapt2/cmd/Diff.cpp
index 6da3176..d3750a6 100644
--- a/tools/aapt2/cmd/Diff.cpp
+++ b/tools/aapt2/cmd/Diff.cpp
@@ -138,6 +138,22 @@
     }
   }
 
+  for (const ResourceConfigValue* config_value_a : entry_a.flag_disabled_values) {
+    auto config_value_b = entry_b.FindFlagDisabledValue(config_value_a->value->GetFlag().value(),
+                                                        config_value_a->config);
+    if (!config_value_b) {
+      std::stringstream str_stream;
+      str_stream << "missing disabled value " << pkg_a.name << ":" << type_a.named_type << "/"
+                 << entry_a.name << " config=" << config_value_a->config
+                 << " flag=" << config_value_a->value->GetFlag()->ToString();
+      EmitDiffLine(apk_b->GetSource(), str_stream.str());
+      diff = true;
+    } else {
+      diff |= EmitResourceConfigValueDiff(context, apk_a, pkg_a, type_a, entry_a, config_value_a,
+                                          apk_b, pkg_b, type_b, entry_b, config_value_b);
+    }
+  }
+
   // Check for any newly added config values.
   for (const ResourceConfigValue* config_value_b : entry_b.values) {
     auto config_value_a = entry_a.FindValue(config_value_b->config);
@@ -149,6 +165,18 @@
       diff = true;
     }
   }
+  for (const ResourceConfigValue* config_value_b : entry_b.flag_disabled_values) {
+    auto config_value_a = entry_a.FindFlagDisabledValue(config_value_b->value->GetFlag().value(),
+                                                        config_value_b->config);
+    if (!config_value_a) {
+      std::stringstream str_stream;
+      str_stream << "new disabled config " << pkg_b.name << ":" << type_b.named_type << "/"
+                 << entry_b.name << " config=" << config_value_b->config
+                 << " flag=" << config_value_b->value->GetFlag()->ToString();
+      EmitDiffLine(apk_b->GetSource(), str_stream.str());
+      diff = true;
+    }
+  }
   return diff;
 }
 
diff --git a/tools/aapt2/cmd/Util.cpp b/tools/aapt2/cmd/Util.cpp
index 7739171..08f8f0d 100644
--- a/tools/aapt2/cmd/Util.cpp
+++ b/tools/aapt2/cmd/Util.cpp
@@ -34,6 +34,44 @@
 
 namespace aapt {
 
+std::optional<FeatureFlagAttribute> ParseFlag(std::optional<std::string_view> flag_text) {
+  if (!flag_text || flag_text->empty()) {
+    return {};
+  }
+  FeatureFlagAttribute flag;
+  if (flag_text->starts_with('!')) {
+    flag.negated = true;
+    flag.name = flag_text->substr(1);
+  } else {
+    flag.name = flag_text.value();
+  }
+  return flag;
+}
+
+std::optional<FlagStatus> GetFlagStatus(const std::optional<FeatureFlagAttribute>& flag,
+                                        const FeatureFlagValues& feature_flag_values,
+                                        std::string* out_err) {
+  if (!flag) {
+    return FlagStatus::NoFlag;
+  }
+  auto flag_it = feature_flag_values.find(flag->name);
+  if (flag_it == feature_flag_values.end()) {
+    *out_err = "Resource flag value undefined: " + flag->name;
+    return {};
+  }
+  const auto& flag_properties = flag_it->second;
+  if (!flag_properties.read_only) {
+    *out_err = "Only read only flags may be used with resources: " + flag->name;
+    return {};
+  }
+  if (!flag_properties.enabled.has_value()) {
+    *out_err = "Only flags with a value may be used with resources: " + flag->name;
+    return {};
+  }
+  return (flag_properties.enabled.value() != flag->negated) ? FlagStatus::Enabled
+                                                            : FlagStatus::Disabled;
+}
+
 std::optional<uint16_t> ParseTargetDensityParameter(StringPiece arg, android::IDiagnostics* diag) {
   ConfigDescription preferred_density_config;
   if (!ConfigDescription::Parse(arg, &preferred_density_config)) {
diff --git a/tools/aapt2/cmd/Util.h b/tools/aapt2/cmd/Util.h
index 6b8813b..d32e532 100644
--- a/tools/aapt2/cmd/Util.h
+++ b/tools/aapt2/cmd/Util.h
@@ -49,6 +49,12 @@
 
 using FeatureFlagValues = std::map<std::string, FeatureFlagProperties, std::less<>>;
 
+std::optional<FeatureFlagAttribute> ParseFlag(std::optional<std::string_view> flag_text);
+
+std::optional<FlagStatus> GetFlagStatus(const std::optional<FeatureFlagAttribute>& flag,
+                                        const FeatureFlagValues& feature_flag_values,
+                                        std::string* out_err);
+
 // Parses a configuration density (ex. hdpi, xxhdpi, 234dpi, anydpi, etc).
 // Returns Nothing and logs a human friendly error message if the string was not legal.
 std::optional<uint16_t> ParseTargetDensityParameter(android::StringPiece arg,
diff --git a/tools/aapt2/format/proto/ProtoDeserialize.cpp b/tools/aapt2/format/proto/ProtoDeserialize.cpp
index 55f5e56..91ec348 100644
--- a/tools/aapt2/format/proto/ProtoDeserialize.cpp
+++ b/tools/aapt2/format/proto/ProtoDeserialize.cpp
@@ -536,6 +536,32 @@
 
         config_value->value = DeserializeValueFromPb(pb_config_value.value(), src_pool, config,
                                                      &out_table->string_pool, files, out_error);
+
+        if (config_value->value == nullptr) {
+          return false;
+        }
+      }
+
+      // flag disabled
+      for (const pb::ConfigValue& pb_config_value : pb_entry.flag_disabled_config_value()) {
+        const pb::Configuration& pb_config = pb_config_value.config();
+
+        ConfigDescription config;
+        if (!DeserializeConfigFromPb(pb_config, &config, out_error)) {
+          return false;
+        }
+
+        ResourceConfigValue* config_value = entry->FindOrCreateFlagDisabledValue(
+            FeatureFlagAttribute{.name = pb_config_value.value().item().flag_name(),
+                                 .negated = pb_config_value.value().item().flag_negated()},
+            config, pb_config.product());
+        if (config_value->value != nullptr) {
+          *out_error = "duplicate configuration in resource table";
+          return false;
+        }
+
+        config_value->value = DeserializeValueFromPb(pb_config_value.value(), src_pool, config,
+                                                     &out_table->string_pool, files, out_error);
         if (config_value->value == nullptr) {
           return false;
         }
@@ -615,6 +641,12 @@
   out_file->source.path = pb_file.source_path();
   out_file->type = DeserializeFileReferenceTypeFromPb(pb_file.type());
 
+  out_file->flag_status = (FlagStatus)pb_file.flag_status();
+  if (!pb_file.flag_name().empty()) {
+    out_file->flag =
+        FeatureFlagAttribute{.name = pb_file.flag_name(), .negated = pb_file.flag_negated()};
+  }
+
   std::string config_error;
   if (!DeserializeConfigFromPb(pb_file.config(), &out_file->config, &config_error)) {
     std::ostringstream error;
@@ -748,7 +780,6 @@
     if (value == nullptr) {
       return {};
     }
-
   } else if (pb_value.has_compound_value()) {
     const pb::CompoundValue& pb_compound_value = pb_value.compound_value();
     switch (pb_compound_value.value_case()) {
@@ -863,6 +894,9 @@
         LOG(FATAL) << "unknown compound value: " << (int)pb_compound_value.value_case();
         break;
     }
+    value->SetFlagStatus((FlagStatus)pb_compound_value.flag_status());
+    value->SetFlag(FeatureFlagAttribute{.name = pb_compound_value.flag_name(),
+                                        .negated = pb_compound_value.flag_negated()});
   } else {
     LOG(FATAL) << "unknown value: " << (int)pb_value.value_case();
     return {};
@@ -1018,6 +1052,10 @@
       DeserializeItemFromPbInternal(pb_item, src_pool, config, value_pool, files, out_error);
   if (item) {
     item->SetFlagStatus((FlagStatus)pb_item.flag_status());
+    if (!pb_item.flag_name().empty()) {
+      item->SetFlag(
+          FeatureFlagAttribute{.name = pb_item.flag_name(), .negated = pb_item.flag_negated()});
+    }
   }
   return item;
 }
diff --git a/tools/aapt2/format/proto/ProtoSerialize.cpp b/tools/aapt2/format/proto/ProtoSerialize.cpp
index 5772b3b..fcc77d5 100644
--- a/tools/aapt2/format/proto/ProtoSerialize.cpp
+++ b/tools/aapt2/format/proto/ProtoSerialize.cpp
@@ -427,6 +427,14 @@
           SerializeValueToPb(*config_value->value, pb_config_value->mutable_value(),
                              source_pool.get());
         }
+
+        for (const ResourceConfigValue* config_value : entry.flag_disabled_values) {
+          pb::ConfigValue* pb_config_value = pb_entry->add_flag_disabled_config_value();
+          SerializeConfig(config_value->config, pb_config_value->mutable_config());
+          pb_config_value->mutable_config()->set_product(config_value->product);
+          SerializeValueToPb(*config_value->value, pb_config_value->mutable_value(),
+                             source_pool.get());
+        }
       }
     }
   }
@@ -721,6 +729,18 @@
   }
   if (out_value->has_item()) {
     out_value->mutable_item()->set_flag_status((uint32_t)value.GetFlagStatus());
+    if (value.GetFlag()) {
+      const auto& flag = value.GetFlag();
+      out_value->mutable_item()->set_flag_negated(flag->negated);
+      out_value->mutable_item()->set_flag_name(flag->name);
+    }
+  } else if (out_value->has_compound_value()) {
+    out_value->mutable_compound_value()->set_flag_status((uint32_t)value.GetFlagStatus());
+    if (value.GetFlag()) {
+      const auto& flag = value.GetFlag();
+      out_value->mutable_compound_value()->set_flag_negated(flag->negated);
+      out_value->mutable_compound_value()->set_flag_name(flag->name);
+    }
   }
 }
 
@@ -730,6 +750,11 @@
   item.Accept(&serializer);
   out_item->MergeFrom(value.item());
   out_item->set_flag_status((uint32_t)item.GetFlagStatus());
+  if (item.GetFlag()) {
+    const auto& flag = item.GetFlag();
+    out_item->set_flag_negated(flag->negated);
+    out_item->set_flag_name(flag->name);
+  }
 }
 
 void SerializeCompiledFileToPb(const ResourceFile& file, pb::internal::CompiledFile* out_file) {
@@ -737,6 +762,11 @@
   out_file->set_source_path(file.source.path);
   out_file->set_type(SerializeFileReferenceTypeToPb(file.type));
   SerializeConfig(file.config, out_file->mutable_config());
+  out_file->set_flag_status((uint32_t)file.flag_status);
+  if (file.flag) {
+    out_file->set_flag_negated(file.flag->negated);
+    out_file->set_flag_name(file.flag->name);
+  }
 
   for (const SourcedResourceName& exported : file.exported_symbols) {
     pb::internal::CompiledFile_Symbol* pb_symbol = out_file->add_exported_symbol();
diff --git a/tools/aapt2/integration-tests/FlaggedResourcesTest/Android.bp b/tools/aapt2/integration-tests/FlaggedResourcesTest/Android.bp
index c456e5c..1b0f997 100644
--- a/tools/aapt2/integration-tests/FlaggedResourcesTest/Android.bp
+++ b/tools/aapt2/integration-tests/FlaggedResourcesTest/Android.bp
@@ -30,14 +30,32 @@
         "res/values/bools2.xml",
         "res/values/ints.xml",
         "res/values/strings.xml",
+        "res/values/styles.xml",
         "res/layout/layout1.xml",
+        "res/layout/layout3.xml",
+        "res/flag(test.package.falseFlag)/values/bools.xml",
+        "res/flag(test.package.falseFlag)/layout/layout2.xml",
+        "res/flag(test.package.falseFlag)/drawable/removedpng.png",
+        "res/flag(test.package.trueFlag)/layout/layout3.xml",
+        "res/values/flag(test.package.trueFlag)/bools.xml",
+        "res/values/flag(!test.package.trueFlag)/bools.xml",
+        "res/values/flag(!test.package.falseFlag)/bools.xml",
     ],
     out: [
+        "drawable_removedpng.(test.package.falseFlag).png.flat",
         "values_bools.arsc.flat",
+        "values_bools.(test.package.falseFlag).arsc.flat",
+        "values_bools.(test.package.trueFlag).arsc.flat",
+        "values_bools.(!test.package.falseFlag).arsc.flat",
+        "values_bools.(!test.package.trueFlag).arsc.flat",
         "values_bools2.arsc.flat",
         "values_ints.arsc.flat",
         "values_strings.arsc.flat",
+        "values_styles.arsc.flat",
         "layout_layout1.xml.flat",
+        "layout_layout2.(test.package.falseFlag).xml.flat",
+        "layout_layout3.xml.flat",
+        "layout_layout3.(test.package.trueFlag).xml.flat",
     ],
     cmd: "$(location aapt2) compile $(in) -o $(genDir) " +
         "--feature-flags test.package.falseFlag:ro=false,test.package.trueFlag:ro=true",
diff --git "a/tools/aapt2/integration-tests/FlaggedResourcesTest/res/flag\050test.package.falseFlag\051/drawable/removedpng.png" "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/flag\050test.package.falseFlag\051/drawable/removedpng.png"
new file mode 100644
index 0000000..8a9e698
--- /dev/null
+++ "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/flag\050test.package.falseFlag\051/drawable/removedpng.png"
Binary files differ
diff --git "a/tools/aapt2/integration-tests/FlaggedResourcesTest/res/flag\050test.package.falseFlag\051/layout/layout2.xml" "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/flag\050test.package.falseFlag\051/layout/layout2.xml"
new file mode 100644
index 0000000..dec5de7
--- /dev/null
+++ "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/flag\050test.package.falseFlag\051/layout/layout2.xml"
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical" >
+</LinearLayout>
\ No newline at end of file
diff --git "a/tools/aapt2/integration-tests/FlaggedResourcesTest/res/flag\050test.package.falseFlag\051/values/bools.xml" "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/flag\050test.package.falseFlag\051/values/bools.xml"
new file mode 100644
index 0000000..c46c4d4
--- /dev/null
+++ "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/flag\050test.package.falseFlag\051/values/bools.xml"
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <bool name="bool7">false</bool>
+</resources>
\ No newline at end of file
diff --git "a/tools/aapt2/integration-tests/FlaggedResourcesTest/res/flag\050test.package.trueFlag\051/layout/layout3.xml" "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/flag\050test.package.trueFlag\051/layout/layout3.xml"
new file mode 100644
index 0000000..5aeee0e
--- /dev/null
+++ "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/flag\050test.package.trueFlag\051/layout/layout3.xml"
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical" >
+    <TextView android:id="@+id/text1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="foobar" />
+</LinearLayout>
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/FlaggedResourcesTest/res/layout/layout3.xml b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/layout/layout3.xml
new file mode 100644
index 0000000..dec5de7
--- /dev/null
+++ b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/layout/layout3.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical" >
+</LinearLayout>
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/bools.xml b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/bools.xml
index 1ed0c8a..35975ed 100644
--- a/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/bools.xml
+++ b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/bools.xml
@@ -9,4 +9,15 @@
     <bool name="bool3">false</bool>
 
     <bool name="bool4" android:featureFlag="test.package.falseFlag">true</bool>
+
+    <bool name="bool5">false</bool>
+    <bool name="bool5" android:featureFlag="!test.package.falseFlag">true</bool>
+
+    <bool name="bool6">true</bool>
+    <bool name="bool6" android:featureFlag="!test.package.trueFlag">false</bool>
+
+    <bool name="bool7">true</bool>
+    <bool name="bool8">false</bool>
+    <bool name="bool9">true</bool>
+    <bool name="bool10">false</bool>
 </resources>
\ No newline at end of file
diff --git "a/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/flag\050\041test.package.falseFlag\051/bools.xml" "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/flag\050\041test.package.falseFlag\051/bools.xml"
new file mode 100644
index 0000000..a63749c
--- /dev/null
+++ "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/flag\050\041test.package.falseFlag\051/bools.xml"
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <bool name="bool10">true</bool>
+</resources>
\ No newline at end of file
diff --git "a/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/flag\050\041test.package.trueFlag\051/bools.xml" "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/flag\050\041test.package.trueFlag\051/bools.xml"
new file mode 100644
index 0000000..bb5526e
--- /dev/null
+++ "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/flag\050\041test.package.trueFlag\051/bools.xml"
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <bool name="bool9">false</bool>
+</resources>
\ No newline at end of file
diff --git "a/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/flag\050test.package.trueFlag\051/bools.xml" "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/flag\050test.package.trueFlag\051/bools.xml"
new file mode 100644
index 0000000..eba780e
--- /dev/null
+++ "b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/flag\050test.package.trueFlag\051/bools.xml"
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <bool name="bool8">true</bool>
+</resources>
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/styles.xml b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/styles.xml
new file mode 100644
index 0000000..604129c
--- /dev/null
+++ b/tools/aapt2/integration-tests/FlaggedResourcesTest/res/values/styles.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+    <style name="style1">
+        <item name="android:windowIsTranslucent">true</item>
+    </style>
+    <style name="style1" android:featureFlag="test.package.falseFlag">
+        <item name="android:windowIsTranslucent">false</item>
+    </style>
+
+    <style name="style2">
+        <item name="android:windowIsTranslucent">false</item>
+    </style>
+    <style name="style2" android:featureFlag="test.package.trueFlag">
+        <item name="android:windowIsTranslucent">true</item>
+    </style>
+
+    <style name="style3">
+        <item name="android:windowIsTranslucent" android:featureFlag="!test.package.trueFlag">false</item>
+        <item name="android:windowIsTranslucent" android:featureFlag="test.package.trueFlag">true</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/tools/aapt2/link/FlaggedResources_test.cpp b/tools/aapt2/link/FlaggedResources_test.cpp
index 3db37c2..6293008 100644
--- a/tools/aapt2/link/FlaggedResources_test.cpp
+++ b/tools/aapt2/link/FlaggedResources_test.cpp
@@ -17,6 +17,7 @@
 #include "LoadedApk.h"
 #include "cmd/Dump.h"
 #include "io/StringStream.h"
+#include "test/Common.h"
 #include "test/Test.h"
 #include "text/Printer.h"
 
@@ -75,6 +76,10 @@
 
   std::string output;
   DumpResourceTableToString(loaded_apk.get(), &output);
+  ASSERT_EQ(output.find("bool4"), std::string::npos);
+  ASSERT_EQ(output.find("str1"), std::string::npos);
+  ASSERT_EQ(output.find("layout2"), std::string::npos);
+  ASSERT_EQ(output.find("removedpng"), std::string::npos);
 }
 
 TEST_F(FlaggedResourcesTest, DisabledResourcesRemovedFromTableChunks) {
@@ -86,6 +91,8 @@
 
   ASSERT_EQ(output.find("bool4"), std::string::npos);
   ASSERT_EQ(output.find("str1"), std::string::npos);
+  ASSERT_EQ(output.find("layout2"), std::string::npos);
+  ASSERT_EQ(output.find("removedpng"), std::string::npos);
 }
 
 TEST_F(FlaggedResourcesTest, DisabledResourcesInRJava) {
@@ -98,4 +105,47 @@
   ASSERT_NE(r_contents.find("public static final int str1"), std::string::npos);
 }
 
+TEST_F(FlaggedResourcesTest, TwoValuesSameDisabledFlag) {
+  test::TestDiagnosticsImpl diag;
+  const std::string compiled_files_dir = GetTestPath("compiled");
+  ASSERT_FALSE(CompileFile(
+      GetTestPath("res/values/values.xml"),
+      R"(<resources xmlns:android="http://schemas.android.com/apk/res/android">
+           <bool name="bool1" android:featureFlag="test.package.falseFlag">false</bool>
+           <bool name="bool1" android:featureFlag="test.package.falseFlag">true</bool>
+         </resources>)",
+      compiled_files_dir, &diag,
+      {"--feature-flags", "test.package.falseFlag:ro=false,test.package.trueFlag:ro=true"}));
+  ASSERT_TRUE(diag.GetLog().contains("duplicate value for resource 'bool/bool1'"));
+}
+
+TEST_F(FlaggedResourcesTest, TwoValuesSameDisabledFlagDifferentFiles) {
+  test::TestDiagnosticsImpl diag;
+  const std::string compiled_files_dir = GetTestPath("compiled");
+  ASSERT_TRUE(CompileFile(
+      GetTestPath("res/values/values1.xml"),
+      R"(<resources xmlns:android="http://schemas.android.com/apk/res/android">
+           <bool name="bool1" android:featureFlag="test.package.falseFlag">false</bool>
+         </resources>)",
+      compiled_files_dir, &diag,
+      {"--feature-flags", "test.package.falseFlag:ro=false,test.package.trueFlag:ro=true"}));
+  ASSERT_TRUE(CompileFile(
+      GetTestPath("res/values/values2.xml"),
+      R"(<resources xmlns:android="http://schemas.android.com/apk/res/android">
+           <bool name="bool1" android:featureFlag="test.package.falseFlag">true</bool>
+         </resources>)",
+      compiled_files_dir, &diag,
+      {"--feature-flags", "test.package.falseFlag:ro=false,test.package.trueFlag:ro=true"}));
+  const std::string out_apk = GetTestPath("out.apk");
+  std::vector<std::string> link_args = {
+      "--manifest",
+      GetDefaultManifest(),
+      "-o",
+      out_apk,
+  };
+
+  ASSERT_FALSE(Link(link_args, compiled_files_dir, &diag));
+  ASSERT_TRUE(diag.GetLog().contains("duplicate value for resource 'bool1'"));
+}
+
 }  // namespace aapt
diff --git a/tools/aapt2/link/TableMerger.cpp b/tools/aapt2/link/TableMerger.cpp
index 37a039e..1bef5f8 100644
--- a/tools/aapt2/link/TableMerger.cpp
+++ b/tools/aapt2/link/TableMerger.cpp
@@ -321,6 +321,30 @@
           }
         }
       }
+
+      // disabled values
+      for (auto& src_config_value : src_entry->flag_disabled_values) {
+        auto dst_config_value = dst_entry->FindOrCreateFlagDisabledValue(
+            src_config_value->value->GetFlag().value(), src_config_value->config,
+            src_config_value->product);
+        if (!dst_config_value->value) {
+          // Resource does not exist, add it now.
+          // Must clone the value since it might be in the values vector as well
+          CloningValueTransformer cloner(&main_table_->string_pool);
+          dst_config_value->value = src_config_value->value->Transform(cloner);
+        } else {
+          error = true;
+          context_->GetDiagnostics()->Error(
+              android::DiagMessage(src_config_value->value->GetSource())
+              << "duplicate value for resource '" << src_entry->name << "' " << "with config '"
+              << src_config_value->config << "' and flag '"
+              << (src_config_value->value->GetFlag()->negated ? "!" : "")
+              << src_config_value->value->GetFlag()->name << "'");
+          context_->GetDiagnostics()->Note(
+              android::DiagMessage(dst_config_value->value->GetSource())
+              << "resource previously defined here");
+        }
+      }
     }
   }
   return !error;
@@ -353,6 +377,8 @@
   file_ref->SetSource(file_desc.source);
   file_ref->type = file_desc.type;
   file_ref->file = file;
+  file_ref->SetFlagStatus(file_desc.flag_status);
+  file_ref->SetFlag(file_desc.flag);
 
   ResourceTablePackage* pkg = table.FindOrCreatePackage(file_desc.name.package);
   pkg->FindOrCreateType(file_desc.name.type)
diff --git a/tools/aapt2/test/Common.cpp b/tools/aapt2/test/Common.cpp
index cdf24534..c7dd4c9 100644
--- a/tools/aapt2/test/Common.cpp
+++ b/tools/aapt2/test/Common.cpp
@@ -21,23 +21,6 @@
 namespace aapt {
 namespace test {
 
-struct TestDiagnosticsImpl : public android::IDiagnostics {
-  void Log(Level level, android::DiagMessageActual& actual_msg) override {
-    switch (level) {
-      case Level::Note:
-        return;
-
-      case Level::Warn:
-        std::cerr << actual_msg.source << ": warn: " << actual_msg.message << "." << std::endl;
-        break;
-
-      case Level::Error:
-        std::cerr << actual_msg.source << ": error: " << actual_msg.message << "." << std::endl;
-        break;
-    }
-  }
-};
-
 android::IDiagnostics* GetDiagnostics() {
   static TestDiagnosticsImpl diag;
   return &diag;
diff --git a/tools/aapt2/test/Common.h b/tools/aapt2/test/Common.h
index 0437980..b06c432 100644
--- a/tools/aapt2/test/Common.h
+++ b/tools/aapt2/test/Common.h
@@ -37,6 +37,32 @@
 namespace aapt {
 namespace test {
 
+struct TestDiagnosticsImpl : public android::IDiagnostics {
+  void Log(Level level, android::DiagMessageActual& actual_msg) override {
+    switch (level) {
+      case Level::Note:
+        return;
+
+      case Level::Warn:
+        std::cerr << actual_msg.source << ": warn: " << actual_msg.message << "." << std::endl;
+        log << actual_msg.source << ": warn: " << actual_msg.message << "." << std::endl;
+        break;
+
+      case Level::Error:
+        std::cerr << actual_msg.source << ": error: " << actual_msg.message << "." << std::endl;
+        log << actual_msg.source << ": error: " << actual_msg.message << "." << std::endl;
+        break;
+    }
+  }
+
+  std::string GetLog() {
+    return log.str();
+  }
+
+ private:
+  std::ostringstream log;
+};
+
 android::IDiagnostics* GetDiagnostics();
 
 inline ResourceName ParseNameOrDie(android::StringPiece str) {
diff --git a/tools/aapt2/test/Fixture.cpp b/tools/aapt2/test/Fixture.cpp
index b91abe5..570bcf1 100644
--- a/tools/aapt2/test/Fixture.cpp
+++ b/tools/aapt2/test/Fixture.cpp
@@ -91,10 +91,13 @@
 }
 
 bool CommandTestFixture::CompileFile(const std::string& path, const std::string& contents,
-                                     android::StringPiece out_dir, android::IDiagnostics* diag) {
+                                     android::StringPiece out_dir, android::IDiagnostics* diag,
+                                     const std::vector<android::StringPiece>& additional_args) {
   WriteFile(path, contents);
   CHECK(file::mkdirs(out_dir.data()));
-  return CompileCommand(diag).Execute({path, "-o", out_dir, "-v"}, &std::cerr) == 0;
+  std::vector<android::StringPiece> args = {path, "-o", out_dir, "-v"};
+  args.insert(args.end(), additional_args.begin(), additional_args.end());
+  return CompileCommand(diag).Execute(args, &std::cerr) == 0;
 }
 
 bool CommandTestFixture::Link(const std::vector<std::string>& args, android::IDiagnostics* diag) {
diff --git a/tools/aapt2/test/Fixture.h b/tools/aapt2/test/Fixture.h
index 14298d16..178d011 100644
--- a/tools/aapt2/test/Fixture.h
+++ b/tools/aapt2/test/Fixture.h
@@ -73,7 +73,8 @@
   // Wries the contents of the file to the specified path. The file is compiled and the flattened
   // file is written to the out directory.
   bool CompileFile(const std::string& path, const std::string& contents,
-                   android::StringPiece flat_out_dir, android::IDiagnostics* diag);
+                   android::StringPiece flat_out_dir, android::IDiagnostics* diag,
+                   const std::vector<android::StringPiece>& additional_args = {});
 
   // Executes the link command with the specified arguments.
   bool Link(const std::vector<std::string>& args, android::IDiagnostics* diag);
diff --git a/tools/processors/property_cache/Android.bp b/tools/processors/property_cache/Android.bp
new file mode 100644
index 0000000..81fab7a
--- /dev/null
+++ b/tools/processors/property_cache/Android.bp
@@ -0,0 +1,57 @@
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "frameworks_base_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["frameworks_base_license"],
+    default_team: "trendy_team_framework_android_multiuser",
+}
+
+java_library_host {
+    name: "libcached-property-annotation-processor",
+    srcs: [
+        ":framework-annotations",
+        "src/**/*.java",
+    ],
+    static_libs: [
+        "codegen-version-info",
+        "android.multiuser.flags-aconfig-java-host",
+        "guava",
+    ],
+    use_tools_jar: true,
+}
+
+java_plugin {
+    name: "cached-property-annotation-processor",
+    processor_class: "android.processor.property_cache.CachedPropertyProcessor",
+    static_libs: ["libcached-property-annotation-processor"],
+}
+
+java_aconfig_library {
+    name: "android.multiuser.flags-aconfig-java-host",
+    aconfig_declarations: "android.multiuser.flags-aconfig",
+    host_supported: true,
+    defaults: ["framework-minus-apex-aconfig-java-defaults"],
+}
+
+java_test_host {
+    name: "cached-property-annotation-processor-test",
+    srcs: ["test/java/**/*.java"],
+    java_resources: [":CachedPropertyAnnotationJavaTestSource"],
+    static_libs: [
+        "compile-testing-prebuilt",
+        "truth",
+        "junit",
+        "guava",
+        "libcached-property-annotation-processor",
+    ],
+    test_suites: ["general-tests"],
+}
+
+filegroup {
+    name: "CachedPropertyAnnotationJavaTestSource",
+    srcs: ["test/resources/*.java"],
+    path: "test/resources/",
+    visibility: ["//visibility:private"],
+}
diff --git a/tools/processors/property_cache/OWNERS b/tools/processors/property_cache/OWNERS
new file mode 100644
index 0000000..78650168
--- /dev/null
+++ b/tools/processors/property_cache/OWNERS
@@ -0,0 +1,3 @@
+include /ACTIVITY_MANAGER_OWNERS
+include /BROADCASTS_OWNERS
+include /MULTIUSER_OWNERS
\ No newline at end of file
diff --git a/tools/processors/property_cache/TEST_MAPPING b/tools/processors/property_cache/TEST_MAPPING
new file mode 100644
index 0000000..7177abc
--- /dev/null
+++ b/tools/processors/property_cache/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "postsubmit": [
+    {
+      "name": "cached-property-annotation-processor-test"
+    }
+  ]
+}
diff --git a/tools/processors/property_cache/src/java/android/processor/property_cache/CacheConfig.java b/tools/processors/property_cache/src/java/android/processor/property_cache/CacheConfig.java
new file mode 100644
index 0000000..c665c84
--- /dev/null
+++ b/tools/processors/property_cache/src/java/android/processor/property_cache/CacheConfig.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2024 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 android.processor.property_cache;
+
+import com.android.internal.annotations.CachedProperty;
+import com.android.internal.annotations.CachedPropertyDefaults;
+
+import com.google.common.base.CaseFormat;
+
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.TypeElement;
+
+public class CacheConfig {
+    private final CacheModifiers mModifiers;
+    private final int mMaxSize;
+    private final String mModuleName;
+    private final String mApiName;
+    private final String mClassName;
+    private final String mQualifiedName;
+    private String mPropertyName;
+    private String mMethodName;
+    private int mNumberOfParams = 0;
+    private String mInputType = Constants.JAVA_LANG_VOID;
+    private String mResultType;
+
+    public CacheConfig(TypeElement classElement, ExecutableElement method) {
+        CachedPropertyDefaults classAnnotation = classElement.getAnnotation(
+                CachedPropertyDefaults.class);
+        CachedProperty methodAnnotation = method.getAnnotation(CachedProperty.class);
+
+        mModuleName = methodAnnotation.module().isEmpty() ? classAnnotation.module()
+                : methodAnnotation.module();
+        mClassName = classElement.getSimpleName().toString();
+        mQualifiedName = classElement.getQualifiedName().toString();
+        mModifiers = new CacheModifiers(methodAnnotation.modsFlagOnOrNone());
+        mMethodName = method.getSimpleName().toString();
+        mPropertyName = getPropertyName(mMethodName);
+        mApiName = methodAnnotation.api().isEmpty() ? getUniqueApiName(mClassName, mPropertyName)
+                : methodAnnotation.api();
+        mMaxSize = methodAnnotation.max() == -1 ? classAnnotation.max() : methodAnnotation.max();
+        mNumberOfParams = method.getParameters().size();
+        if (mNumberOfParams > 0) {
+            mInputType = primitiveTypeToObjectEquivalent(
+                method.getParameters().get(0).asType().toString());
+        }
+        mResultType = primitiveTypeToObjectEquivalent(method.getReturnType().toString());
+    }
+
+    public CacheModifiers getModifiers() {
+        return mModifiers;
+    }
+
+    public int getMaxSize() {
+        return mMaxSize;
+    }
+
+    public String getApiName() {
+        return mApiName;
+    }
+
+    public String getClassName() {
+        return mClassName;
+    }
+
+    public String getQualifiedName() {
+        return mQualifiedName;
+    }
+
+    public String getModuleName() {
+        return mModuleName;
+    }
+
+    public String getMethodName() {
+        return mMethodName;
+    }
+
+    public String getPropertyName() {
+        return mPropertyName;
+    }
+
+    public String getPropertyVariable() {
+        return (mModifiers.isStatic() ? "s" : "m") + mPropertyName;
+    }
+
+    private String getPropertyName(String methodName) {
+        if (methodName.startsWith("get")) {
+            return methodName.substring(3);
+        } else if (methodName.startsWith("is")) {
+            return methodName.substring(2);
+        } else {
+            return CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, methodName);
+        }
+    }
+
+    public int getNumberOfParams() {
+        return mNumberOfParams;
+    }
+
+    public String getInputType() {
+        return mInputType;
+    }
+
+    public String getResultType() {
+        return mResultType;
+    }
+
+    /**
+     * This method returns the unique api name for a given class and property name.
+     * Property name is retrieved from the method name.
+     * Both names are combined and converted to lower snake case.
+     *
+     * @param className    The name of the class that contains the property.
+     * @param propertyName The name of the property.
+     * @return The registration name for the property.
+     */
+    private String getUniqueApiName(String className, String propertyName) {
+        return CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, className + propertyName);
+    }
+
+    private String primitiveTypeToObjectEquivalent(String simpleType) {
+        // checking against primitive types
+        return Constants.PRIMITIVE_TYPE_MAP.getOrDefault(simpleType, simpleType);
+    }
+}
diff --git a/tools/processors/property_cache/src/java/android/processor/property_cache/CacheModifiers.java b/tools/processors/property_cache/src/java/android/processor/property_cache/CacheModifiers.java
new file mode 100644
index 0000000..fda9b2c
--- /dev/null
+++ b/tools/processors/property_cache/src/java/android/processor/property_cache/CacheModifiers.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 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 android.processor.property_cache;
+
+import com.android.internal.annotations.CacheModifier;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class CacheModifiers {
+    private final boolean mIsStatic;
+    private static final String STATIC_MODIFIER_STRING = "static ";
+
+    CacheModifiers(CacheModifier[] modifierArray) {
+        final List<CacheModifier> modifiers = Arrays.asList(modifierArray);
+        mIsStatic = modifiers.contains(CacheModifier.STATIC);
+    }
+
+    public boolean isStatic() {
+        return mIsStatic;
+    }
+
+    public String getStaticModifier() {
+        return mIsStatic ? STATIC_MODIFIER_STRING : Constants.EMPTY_STRING;
+    }
+}
diff --git a/tools/processors/property_cache/src/java/android/processor/property_cache/CachedPropertyProcessor.java b/tools/processors/property_cache/src/java/android/processor/property_cache/CachedPropertyProcessor.java
new file mode 100644
index 0000000..0361012
--- /dev/null
+++ b/tools/processors/property_cache/src/java/android/processor/property_cache/CachedPropertyProcessor.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2024 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 android.processor.property_cache;
+
+import com.android.internal.annotations.CachedProperty;
+import com.android.internal.annotations.CachedPropertyDefaults;
+
+import com.google.common.collect.ImmutableSet;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.Filer;
+import javax.annotation.processing.RoundEnvironment;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.util.ElementFilter;
+import javax.tools.JavaFileObject;
+
+public class CachedPropertyProcessor extends AbstractProcessor {
+
+    IpcDataCacheComposer mIpcDataCacheComposer =
+            new IpcDataCacheComposer();
+
+    @Override
+    public Set<String> getSupportedAnnotationTypes() {
+        return new HashSet<String>(
+                ImmutableSet.of(CachedPropertyDefaults.class.getCanonicalName()));
+    }
+
+    @Override
+    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+        for (Element element : roundEnv.getElementsAnnotatedWith(CachedPropertyDefaults.class)) {
+            try {
+                generateCachedClass((TypeElement) element, processingEnv.getFiler());
+            } catch (IOException e) {
+                e.printStackTrace();
+                return false;
+            }
+        }
+        return false;
+    }
+
+    private void generateCachedClass(TypeElement classElement, Filer filer) throws IOException {
+        String packageName =
+                processingEnv
+                        .getElementUtils()
+                        .getPackageOf(classElement)
+                        .getQualifiedName()
+                        .toString();
+        String className = classElement.getSimpleName().toString() + "Cache";
+        JavaFileObject jfo = filer.createSourceFile(packageName + "." + className);
+        Writer writer = jfo.openWriter();
+        writer.write("package " + packageName + ";\n\n");
+        writer.write("import android.os.IpcDataCache;\n");
+        writer.write("\n    /** \n    * This class is auto-generated \n    * @hide \n    **/");
+        writer.write("\npublic class " + className + " {\n");
+
+        List<ExecutableElement> methods =
+                ElementFilter.methodsIn(classElement.getEnclosedElements());
+        String initCache = String.format(Constants.METHOD_COMMENT,
+                " - initialise all caches for class " + className)
+                + "\npublic static void initCache() {";
+        for (ExecutableElement method : methods) {
+            if (method.getAnnotation(CachedProperty.class) != null) {
+                mIpcDataCacheComposer.generatePropertyCache(writer, classElement, method);
+                initCache += "\n    " + mIpcDataCacheComposer.generateInvalidatePropertyCall();
+            }
+        }
+        initCache += "\n}";
+        writer.write(initCache);
+        writer.write("\n}");
+        writer.write("\n");
+        writer.close();
+    }
+}
diff --git a/tools/processors/property_cache/src/java/android/processor/property_cache/Constants.java b/tools/processors/property_cache/src/java/android/processor/property_cache/Constants.java
new file mode 100644
index 0000000..03961bc
--- /dev/null
+++ b/tools/processors/property_cache/src/java/android/processor/property_cache/Constants.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 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 android.processor.property_cache;
+
+import com.google.common.collect.ImmutableMap;
+
+public final class Constants {
+    public static final String EMPTY_STRING = "";
+    public static final String JAVA_LANG_VOID = "java.lang.Void";
+    public static final ImmutableMap<String, String> PRIMITIVE_TYPE_MAP =
+            ImmutableMap.of(
+                    "int", "java.lang.Integer",
+                    "boolean", "java.lang.Boolean",
+                    "long", "java.lang.Long",
+                    "float", "java.lang.Float",
+                    "double", "java.lang.Double",
+                    "byte", "java.lang.Byte",
+                    "short", "java.lang.Short",
+                    "char", "java.lang.Character");
+
+    public static final String METHOD_COMMENT = "\n    /**"
+            + "\n    * This method is auto-generated%s"
+            + "\n    * "
+            + "\n    * @hide"
+            + "\n    */";
+}
diff --git a/tools/processors/property_cache/src/java/android/processor/property_cache/IpcDataCacheComposer.java b/tools/processors/property_cache/src/java/android/processor/property_cache/IpcDataCacheComposer.java
new file mode 100644
index 0000000..8526a04
--- /dev/null
+++ b/tools/processors/property_cache/src/java/android/processor/property_cache/IpcDataCacheComposer.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2024 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 android.processor.property_cache;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.TypeElement;
+
+public class IpcDataCacheComposer {
+
+    private static final String PROPERTY_DEFINITION_LINE = "private %s%s %s;\n";
+    private static final String METHOD_NAME_LINE = "\npublic %s%s %s(%s%s%s\n) {\n";
+    private static final String RETURN_IF_NOT_NULL_LINE =
+            "if (%s != null) {\n   return %s.%s;\n  }";
+
+    private CacheConfig mCacheConfig;
+
+    /**
+     * Generates code for property cache.
+     *
+     * @param writer       writer to write code to.
+     * @param classElement class element to generate code for.
+     * @param method       method element to generate code for.
+     * @throws IOException if writer throws IOException.
+     */
+    public void generatePropertyCache(Writer writer, TypeElement classElement,
+            ExecutableElement method) throws IOException {
+
+        mCacheConfig = new CacheConfig(classElement, method);
+
+        ParamComposer inputParam = new ParamComposer(null, null);
+        ParamComposer binderParam = new ParamComposer(
+                String.format("IpcDataCache.RemoteCall<%s, %s>", mCacheConfig.getInputType(),
+                        mCacheConfig.getResultType()), "binderCall");
+
+        ParamComposer bypassParam = new ParamComposer(null, null); // empty if method have no params
+        String queryCall = "query(null)";
+        if (mCacheConfig.getNumberOfParams() > 0) {
+            bypassParam = new ParamComposer(
+                    String.format("IpcDataCache.BypassCall<%s> ", mCacheConfig.getInputType()),
+                    "bypassPredicate");
+            inputParam = new ParamComposer(mCacheConfig.getInputType(), "query");
+            queryCall = "query(query)";
+        }
+        String propertyClass =
+                "IpcDataCache<" + mCacheConfig.getInputType() + ", " + mCacheConfig.getResultType()
+                        + ">";
+        String invalidateName = "invalidate" + mCacheConfig.getPropertyName();
+        String lockObject = mCacheConfig.getPropertyVariable() + "Lock";
+        writer.write("private " + mCacheConfig.getModifiers().getStaticModifier() + "final Object "
+                + lockObject + " = new Object();\n");
+        writer.write(String.format(PROPERTY_DEFINITION_LINE,
+                mCacheConfig.getModifiers().getStaticModifier(), propertyClass,
+                mCacheConfig.getPropertyVariable()));
+
+        writer.write(propertyInvalidatedCacheMethod(binderParam, bypassParam, inputParam, queryCall,
+                lockObject));
+
+        // If binder param is not empty then generate getter without binder param to be called
+        if (!bypassParam.getParam().isEmpty()) {
+            writer.write(propertyInvalidatedCacheMethod(binderParam, new ParamComposer(null, null),
+                    inputParam, queryCall, lockObject));
+        }
+        writer.write(String.format(Constants.METHOD_COMMENT,
+                "- invalidate cache for {@link  " + mCacheConfig.getQualifiedName() + "#"
+                        + mCacheConfig.getMethodName() + "}"));
+        writer.write("\n public static final void " + invalidateName + "() {");
+        writer.write(
+                "\n     IpcDataCache.invalidateCache(\"" + mCacheConfig.getModuleName() + "\", \""
+                        + mCacheConfig.getApiName() + "\");");
+        writer.write("\n }");
+        writer.write("\n");
+        writer.write("\n");
+    }
+
+    /**
+     * Generates code to call cache invalidation.
+     *
+     * @return code string calling cache invalidation.
+     */
+    public String generateInvalidatePropertyCall() {
+        String invalidateName = "invalidate" + mCacheConfig.getPropertyName();
+        return mCacheConfig.getClassName() + "Cache." + invalidateName + "();";
+    }
+
+    /**
+     * Generates code for getter that returns cached value or calls binder and caches result.
+     *
+     * @param binderParam parameter for binder call.
+     * @param bypassParam parameter for bypass predicate.
+     * @param inputParam  parameter for input value.
+     * @param queryCall   cache query call syntax.
+     * @param lockObject  object to synchronize on.
+     * @return String with code for method.
+     */
+    private String propertyInvalidatedCacheMethod(ParamComposer binderParam,
+            ParamComposer bypassParam, ParamComposer inputParam, String queryCall,
+            String lockObject) {
+        String result = "\n";
+        CacheModifiers modifiers = mCacheConfig.getModifiers();
+        String paramsComments = binderParam.getParamComment(
+                "lambda for remote call" + " {@link  " + mCacheConfig.getQualifiedName() + "#"
+                        + mCacheConfig.getMethodName() + " }") + bypassParam.getParamComment(
+                "lambda to bypass remote call") + inputParam.getParamComment(
+                "parameter to call remote lambda");
+        result += String.format(Constants.METHOD_COMMENT, paramsComments);
+        result += String.format(METHOD_NAME_LINE, modifiers.getStaticModifier(),
+                mCacheConfig.getResultType(), mCacheConfig.getMethodName(),
+                binderParam.getParam(), bypassParam.getNextParam(),
+                inputParam.getNextParam());
+        result += String.format(RETURN_IF_NOT_NULL_LINE, mCacheConfig.getPropertyVariable(),
+                mCacheConfig.getPropertyVariable(), queryCall);
+        result += "\n  synchronized (" + lockObject + " ) {";
+        result += "\n    if (" + mCacheConfig.getPropertyVariable() + " == null) {";
+        result += "\n      " + mCacheConfig.getPropertyVariable() + " = new IpcDataCache" + "("
+                + generateCreateIpcConfig() + ", " + binderParam.getName()
+                + bypassParam.getNextName() + ");\n";
+        result += "\n   }";
+        result += "\n  }";
+        result += "\n  return " + mCacheConfig.getPropertyVariable() + "." + queryCall + ";";
+        result += "\n }";
+        result += "\n";
+        return result;
+    }
+
+    /**
+     * Generates code for new IpcDataCache.Config object for given configuration.
+     *
+     * @return String with code for new IpcDataCache.Config object.
+     */
+    public String generateCreateIpcConfig() {
+        return "new IpcDataCache.Config(" + mCacheConfig.getMaxSize() + ", " + "\""
+                + mCacheConfig.getModuleName() + "\"" + ", " + "\"" + mCacheConfig.getApiName()
+                + "\"" + ", " + "\"" + mCacheConfig.getPropertyName() + "\"" + ")";
+    }
+}
diff --git a/tools/processors/property_cache/src/java/android/processor/property_cache/ParamComposer.java b/tools/processors/property_cache/src/java/android/processor/property_cache/ParamComposer.java
new file mode 100644
index 0000000..307443a
--- /dev/null
+++ b/tools/processors/property_cache/src/java/android/processor/property_cache/ParamComposer.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2024 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 android.processor.property_cache;
+
+public class ParamComposer {
+    private String mType;
+    private String mName;
+
+    /** Creates ParamComposer with given type and name.
+     *
+     * @param type type of parameter.
+     * @param name name of parameter.
+     */
+    public ParamComposer(String type, String name) {
+        mType = type;
+        mName = name;
+    }
+
+    /** Returns name of parameter.
+     *
+     * @return name of parameter.
+     */
+    public String getName() {
+        if (mName != null) {
+            return mName;
+        }
+        return Constants.EMPTY_STRING;
+    }
+
+    /** Returns name of parameter for next parameter followed by comma.
+     *
+     * @return name of parameter for next parameter if exists, empty string otherwise.
+     */
+    public String getNextName() {
+        if (!getName().isEmpty()) {
+            return ", " + getName();
+        }
+        return Constants.EMPTY_STRING;
+    }
+
+    /**
+     * Returns type of parameter.
+     *
+     * @return type of parameter.
+     */
+    public String getType() {
+        if (mType != null) {
+            return mType;
+        }
+        return Constants.EMPTY_STRING;
+    }
+
+    /**
+     * Returns type and name of parameter.
+     *
+     * @return type and name of parameter if exists, empty string otherwise.
+     */
+    public String getParam() {
+        if (!getType().isEmpty() && !getName().isEmpty()) {
+            return getType() + " " + getName();
+        }
+        return Constants.EMPTY_STRING;
+    }
+
+    /**
+     * Returns type and name of parameter for next parameter followed by comma.
+     *
+     * @return type and name of parameter for next parameter if exists, empty string otherwise.
+     */
+    public String getNextParam() {
+        if (!getType().isEmpty() && !getName().isEmpty()) {
+            return ", " + getParam();
+        }
+        return Constants.EMPTY_STRING;
+    }
+
+    /**
+     * Returns comment for parameter.
+     *
+     * @param description of parameter.
+     * @return comment for parameter if exists, empty string otherwise.
+     */
+    public String getParamComment(String description) {
+        if (!getType().isEmpty() && !getName().isEmpty()) {
+            return "\n    * @param " + getName() + " - " + description;
+        }
+        return Constants.EMPTY_STRING;
+    }
+}
diff --git a/tools/processors/property_cache/test/java/android/processor/property_cache/CachedPropertyProcessorTest.java b/tools/processors/property_cache/test/java/android/processor/property_cache/CachedPropertyProcessorTest.java
new file mode 100644
index 0000000..1e23c78
--- /dev/null
+++ b/tools/processors/property_cache/test/java/android/processor/property_cache/CachedPropertyProcessorTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2024 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 android.processor.property_cache.test;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.testing.compile.CompilationSubject.assertThat;
+
+import android.processor.property_cache.CachedPropertyProcessor;
+
+import com.google.testing.compile.Compilation;
+import com.google.testing.compile.Compiler;
+import com.google.testing.compile.JavaFileObjects;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import javax.tools.JavaFileObject;
+import javax.tools.StandardLocation;
+
+/** Tests the {@link CachedPropertyProcessor}. */
+@RunWith(JUnit4.class)
+public class CachedPropertyProcessorTest {
+    private final Compiler mCompiler =
+            Compiler.javac().withProcessors(new CachedPropertyProcessor());
+
+    @Test
+    public void testDefaultValues() {
+        JavaFileObject expectedJava = JavaFileObjects.forResource("DefaultCache.java");
+
+        Compilation compilation = mCompiler.compile(JavaFileObjects.forResource("Default.java"));
+        assertThat(compilation).succeeded();
+        assertThat(compilation)
+                .generatedFile(StandardLocation.SOURCE_OUTPUT,
+                        "android/processor/property_cache/test/DefaultCache.java")
+                .hasSourceEquivalentTo(expectedJava);
+    }
+
+    @Test
+    public void testCustomValues() {
+        JavaFileObject expectedJava = JavaFileObjects.forResource("CustomCache.java");
+
+        Compilation compilation = mCompiler.compile(JavaFileObjects.forResource("Custom.java"));
+        assertThat(compilation).succeeded();
+        assertThat(compilation)
+                .generatedFile(StandardLocation.SOURCE_OUTPUT,
+                        "android/processor/property_cache/test/CustomCache.java")
+                .hasSourceEquivalentTo(expectedJava);
+    }
+}
diff --git a/tools/processors/property_cache/test/java/android/processor/property_cache/shadows/IpcDataCache.java b/tools/processors/property_cache/test/java/android/processor/property_cache/shadows/IpcDataCache.java
new file mode 100644
index 0000000..e5ef48c
--- /dev/null
+++ b/tools/processors/property_cache/test/java/android/processor/property_cache/shadows/IpcDataCache.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2024 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 android.os;
+
+// Mocked class for generation compilation tests purposes only.
+public class IpcDataCache<Input, Output> {
+    public static class Config {
+        public Config(int max, String module, String api, String name) {
+        }
+    }
+
+    /** Shadow method for generated code compilation tests purposes only.
+     *
+     * @param query - shadow parameter from IpcDataCache in Frameworks.
+     * @return null
+     */
+    public Output query(Input query) {
+        return null;
+    }
+
+    /** Shadow method for generated code compilation tests purposes only.
+     *
+     * @param key - shadow parameter from IpcDataCache in Frameworks;
+     */
+    public static void invalidateCache(String key) {
+    }
+
+    /** Shadow method for generated code compilation tests purposes only.
+     *
+     * @param query - shadow parameter from IpcDataCache in Frameworks;
+     * @return null
+     */
+    public Output recompute(Input query) {
+        return null;
+    }
+
+    /** Shadow method for generated code compilation tests purposes only.
+     *
+     * @param query - parameter equivalent to IpcDataCache in android framework.
+     * @param query - shadow parameter from IpcDataCache in Frameworks;
+     * @return false
+     */
+    public boolean bypass(Input query) {
+        return false;
+    }
+
+    /** Shadow method for generated code compilation tests purposes only.
+     *
+     * @param module - parameter equivalent to IpcDataCache in android framework.
+     * @param key - parameter equivalent to IpcDataCache in android framework.
+     * @return module + key sttring
+     */
+    public static String createPropertyName(String module, String key) {
+        return module + key;
+    }
+
+    public abstract static class QueryHandler<Input, Output> {
+        /** Shadow method for generated code compilation tests purposes only.
+         *
+         * @param query - parameter equivalent to IpcDataCache.QueryHandler in android framework.
+         * @return expected value
+         */
+        public abstract Output apply(Input query);
+        /** Shadow method for generated code compilation tests purposes only.
+         *
+         * @param query - parameter equivalent to IpcDataCache.QueryHandler in android framework.
+         */
+        public boolean shouldBypassCache(Input query) {
+            return false;
+        }
+    }
+
+    public interface RemoteCall<Input, Output> {
+        /** Shadow method for generated code compilation tests purposes only.
+         *
+         * @param query - parameter equivalent to IpcDataCache.RemoteCall in android framework.
+         */
+        Output apply(Input query);
+    }
+
+    public interface BypassCall<Input> {
+        /** Shadow method for generated code compilation tests purposes only.
+         *
+         * @param query - parameter equivalent to IpcDataCache.BypassCall in android framework.
+         */
+        boolean apply(Input query);
+    }
+
+    public IpcDataCache(
+            int maxEntries,
+            String module,
+            String api,
+            String cacheName,
+            QueryHandler<Input, Output> computer) {
+    }
+
+    public IpcDataCache(Config config, QueryHandler<Input, Output> computer) {
+    }
+
+    public IpcDataCache(Config config, RemoteCall<Input, Output> computer) {
+    }
+
+    public IpcDataCache(Config config, RemoteCall<Input, Output> computer,
+            BypassCall<Input> bypassCall) {
+    }
+
+    /** Shadow method for generated code compilation tests purposes only.*/
+    public void invalidateCache() {
+    }
+
+
+    /** Shadow method for generated code compilation tests purposes only.
+     *
+     * @param module - shadow parameter from IpcDataCache in Frameworks.
+     * @param api - shadow parameter from IpcDataCache in Frameworks.
+     */
+    public static void invalidateCache(String module, String api) {
+    }
+
+}
diff --git a/tools/processors/property_cache/test/resources/Custom.java b/tools/processors/property_cache/test/resources/Custom.java
new file mode 100644
index 0000000..05024da
--- /dev/null
+++ b/tools/processors/property_cache/test/resources/Custom.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2024 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 android.processor.property_cache.test;
+
+import com.android.internal.annotations.CacheModifier;
+import com.android.internal.annotations.CachedProperty;
+import com.android.internal.annotations.CachedPropertyDefaults;
+
+import java.util.Date;
+
+@CachedPropertyDefaults(max = 4, module = "bluetooth")
+public class Custom {
+    BirthdayManagerService mService = new BirthdayManagerService();
+    Object mCache = new CustomCache();
+
+    public Custom() {
+        CustomCache.initCache();
+    }
+
+    /**
+     * Testing custom class values to generate static IpcDataCache
+     *
+     * @param userId - user Id
+     * @return birthday date of given user Id
+     */
+    @CachedProperty()
+    public Date getBirthday(int userId) {
+        return CustomCache.getBirthday(mService::getBirthday, userId);
+    }
+
+    /**
+     * Testing custom class values to generate static IpcDataCache
+     *
+     * @param userId - user Id
+     * @return number of days till birthday of given user Id
+     */
+    @CachedProperty(modsFlagOnOrNone = {CacheModifier.STATIC})
+    public int getDaysTillBirthday(int userId) {
+        return CustomCache.getDaysTillBirthday(mService::getDaysTillBirthday, userId);
+    }
+
+    /**
+     * Testing custom class values to generate non-static IpcDataCache
+     *
+     * @param userId - user Id
+     * @return number of days since birthday of given user Id
+     */
+    @CachedProperty(modsFlagOnOrNone = {})
+    public int getDaysSinceBirthday(int userId) {
+        return ((CustomCache) mCache).getDaysSinceBirthday(mService::getDaysSinceBirthday, userId);
+    }
+
+    /**
+     * Testing custom class values to generate static IpcDataCache with max capasity of 1
+     *
+     * @return number of days till birthay of current user
+     */
+    @CachedProperty(modsFlagOnOrNone = {CacheModifier.STATIC}, max = 1)
+    public int getDaysTillMyBirthday() {
+        return CustomCache.getDaysTillMyBirthday((Void) -> mService.getDaysTillMyBirthday());
+    }
+
+    /**
+     * Testing custom class values to generate static IpcDataCache with max capasity of 1 and custom
+     * api
+     *
+     * @return number of days since birthay of current user
+     */
+    @CachedProperty(modsFlagOnOrNone = {}, max = 1, api = "my_unique_key")
+    public int getDaysSinceMyBirthday() {
+        return ((CustomCache) mCache).getDaysSinceMyBirthday(
+                (Void) -> mService.getDaysSinceMyBirthday());
+    }
+
+    /**
+     * Testing custom class values to generate static IpcDataCache with custom module name
+     *
+     * @return birthday wishes of given user Id
+     */
+    @CachedProperty(module = "telephony")
+    public String getBirthdayWishesFromUser(int userId) {
+        return CustomCache.getBirthdayWishesFromUser(mService::getBirthdayWishesFromUser,
+                userId);
+    }
+
+    class BirthdayManagerService {
+        int mDaysTillBirthday = 182;
+
+        public Date getBirthday(int userId) {
+            return new Date(2024, 6, 1 + userId);
+        }
+
+        public int getDaysTillBirthday(int userId) {
+            return mDaysTillBirthday + userId;
+        }
+
+        public int getDaysSinceBirthday(int userId) {
+            return 365 - getDaysTillBirthday(userId);
+        }
+
+        public int getDaysTillMyBirthday() {
+            return 0;
+        }
+
+        public int getDaysSinceMyBirthday() {
+            return 365;
+        }
+
+        public String getBirthdayWishesFromUser(int userId) {
+            return "Happy Birthday!\n- " + userId;
+        }
+    }
+}
diff --git a/tools/processors/property_cache/test/resources/CustomCache.java b/tools/processors/property_cache/test/resources/CustomCache.java
new file mode 100644
index 0000000..326467f
--- /dev/null
+++ b/tools/processors/property_cache/test/resources/CustomCache.java
@@ -0,0 +1,384 @@
+/*
+ * Copyright (C) 2024 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 android.processor.property_cache.test;
+
+import android.os.IpcDataCache;
+
+/**
+ * This class is auto-generated
+ *
+ * @hide
+ **/
+public class CustomCache {
+    private static final Object sBirthdayLock = new Object();
+    private static IpcDataCache<java.lang.Integer, java.util.Date> sBirthday;
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall      - lambda for remote call
+     *                        {@link  android.processor.property_cache.test.Custom#getBirthday }
+     * @param bypassPredicate - lambda to bypass remote call
+     * @param query           - parameter to call remote lambda
+     * @hide
+     */
+    public static java.util.Date getBirthday(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.util.Date> binderCall,
+            IpcDataCache.BypassCall<java.lang.Integer> bypassPredicate, java.lang.Integer query) {
+        if (sBirthday != null) {
+            return sBirthday.query(query);
+        }
+        synchronized (sBirthdayLock) {
+            if (sBirthday == null) {
+                sBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(4, "bluetooth", "custom_birthday", "Birthday"),
+                        binderCall, bypassPredicate);
+
+            }
+        }
+        return sBirthday.query(query);
+    }
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall - lambda for remote call
+     *                   {@link  android.processor.property_cache.test.Custom#getBirthday }
+     * @param query      - parameter to call remote lambda
+     * @hide
+     */
+    public static java.util.Date getBirthday(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.util.Date> binderCall,
+            java.lang.Integer query) {
+        if (sBirthday != null) {
+            return sBirthday.query(query);
+        }
+        synchronized (sBirthdayLock) {
+            if (sBirthday == null) {
+                sBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(4, "bluetooth", "custom_birthday", "Birthday"),
+                        binderCall);
+            }
+        }
+        return sBirthday.query(query);
+    }
+
+    /**
+     * This method is auto-generated- invalidate cache for
+     * {@link  android.processor.property_cache.test.Custom#getBirthday}
+     *
+     * @hide
+     */
+    public static final void invalidateBirthday() {
+        IpcDataCache.invalidateCache("bluetooth", "custom_birthday");
+    }
+
+    private static final Object sDaysTillBirthdayLock = new Object();
+    private static IpcDataCache<java.lang.Integer, java.lang.Integer> sDaysTillBirthday;
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall      - lambda for remote call
+     *                        {@link
+     *                        android.processor.property_cache.test.Custom#getDaysTillBirthday }
+     * @param bypassPredicate - lambda to bypass remote call
+     * @param query           - parameter to call remote lambda
+     * @hide
+     */
+    public static java.lang.Integer getDaysTillBirthday(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.lang.Integer> binderCall,
+            IpcDataCache.BypassCall<java.lang.Integer> bypassPredicate, java.lang.Integer query) {
+        if (sDaysTillBirthday != null) {
+            return sDaysTillBirthday.query(query);
+        }
+        synchronized (sDaysTillBirthdayLock) {
+            if (sDaysTillBirthday == null) {
+                sDaysTillBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(4, "bluetooth", "custom_days_till_birthday",
+                                "DaysTillBirthday"), binderCall, bypassPredicate);
+
+            }
+        }
+        return sDaysTillBirthday.query(query);
+    }
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall - lambda for remote call
+     *                   {@link  android.processor.property_cache.test.Custom#getDaysTillBirthday }
+     * @param query      - parameter to call remote lambda
+     * @hide
+     */
+    public static java.lang.Integer getDaysTillBirthday(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.lang.Integer> binderCall,
+            java.lang.Integer query) {
+        if (sDaysTillBirthday != null) {
+            return sDaysTillBirthday.query(query);
+        }
+        synchronized (sDaysTillBirthdayLock) {
+            if (sDaysTillBirthday == null) {
+                sDaysTillBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(4, "bluetooth", "custom_days_till_birthday",
+                                "DaysTillBirthday"), binderCall);
+
+            }
+        }
+        return sDaysTillBirthday.query(query);
+    }
+
+    /**
+     * This method is auto-generated- invalidate cache for
+     * {@link  android.processor.property_cache.test.Custom#getDaysTillBirthday}
+     *
+     * @hide
+     */
+    public static final void invalidateDaysTillBirthday() {
+        IpcDataCache.invalidateCache("bluetooth", "custom_days_till_birthday");
+    }
+
+    private final Object mDaysSinceBirthdayLock = new Object();
+    private IpcDataCache<java.lang.Integer, java.lang.Integer> mDaysSinceBirthday;
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall      - lambda for remote call
+     *                        {@link
+     *                        android.processor.property_cache.test.Custom#getDaysSinceBirthday }
+     * @param bypassPredicate - lambda to bypass remote call
+     * @param query           - parameter to call remote lambda
+     * @hide
+     */
+    public java.lang.Integer getDaysSinceBirthday(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.lang.Integer> binderCall,
+            IpcDataCache.BypassCall<java.lang.Integer> bypassPredicate, java.lang.Integer query) {
+        if (mDaysSinceBirthday != null) {
+            return mDaysSinceBirthday.query(query);
+        }
+        synchronized (mDaysSinceBirthdayLock) {
+            if (mDaysSinceBirthday == null) {
+                mDaysSinceBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(4, "bluetooth", "custom_days_since_birthday",
+                                "DaysSinceBirthday"), binderCall, bypassPredicate);
+
+            }
+        }
+        return mDaysSinceBirthday.query(query);
+    }
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall - lambda for remote call
+     *                   {@link  android.processor.property_cache.test.Custom#getDaysSinceBirthday
+     *                   }
+     * @param query      - parameter to call remote lambda
+     * @hide
+     */
+    public java.lang.Integer getDaysSinceBirthday(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.lang.Integer> binderCall,
+            java.lang.Integer query) {
+        if (mDaysSinceBirthday != null) {
+            return mDaysSinceBirthday.query(query);
+        }
+        synchronized (mDaysSinceBirthdayLock) {
+            if (mDaysSinceBirthday == null) {
+                mDaysSinceBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(4, "bluetooth", "custom_days_since_birthday",
+                                "DaysSinceBirthday"), binderCall);
+
+            }
+        }
+        return mDaysSinceBirthday.query(query);
+    }
+
+    /**
+     * This method is auto-generated- invalidate cache for
+     * {@link  android.processor.property_cache.test.Custom#getDaysSinceBirthday}
+     *
+     * @hide
+     */
+    public static final void invalidateDaysSinceBirthday() {
+        IpcDataCache.invalidateCache("bluetooth", "custom_days_since_birthday");
+    }
+
+    private static final Object sDaysTillMyBirthdayLock = new Object();
+    private static IpcDataCache<java.lang.Void, java.lang.Integer> sDaysTillMyBirthday;
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall - lambda for remote call
+     *                   {@link  android.processor.property_cache.test.Custom#getDaysTillMyBirthday
+     *                   }
+     * @hide
+     */
+    public static java.lang.Integer getDaysTillMyBirthday(
+            IpcDataCache.RemoteCall<java.lang.Void, java.lang.Integer> binderCall) {
+        if (sDaysTillMyBirthday != null) {
+            return sDaysTillMyBirthday.query(null);
+        }
+        synchronized (sDaysTillMyBirthdayLock) {
+            if (sDaysTillMyBirthday == null) {
+                sDaysTillMyBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(1, "bluetooth", "custom_days_till_my_birthday",
+                                "DaysTillMyBirthday"), binderCall);
+
+            }
+        }
+        return sDaysTillMyBirthday.query(null);
+    }
+
+    /**
+     * This method is auto-generated- invalidate cache for
+     * {@link  android.processor.property_cache.test.Custom#getDaysTillMyBirthday}
+     *
+     * @hide
+     */
+    public static final void invalidateDaysTillMyBirthday() {
+        IpcDataCache.invalidateCache("bluetooth", "custom_days_till_my_birthday");
+    }
+
+    private final Object mDaysSinceMyBirthdayLock = new Object();
+    private IpcDataCache<java.lang.Void, java.lang.Integer> mDaysSinceMyBirthday;
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall - lambda for remote call
+     *                   {@link  android.processor.property_cache.test.Custom#getDaysSinceMyBirthday
+     *                   }
+     * @hide
+     */
+    public java.lang.Integer getDaysSinceMyBirthday(
+            IpcDataCache.RemoteCall<java.lang.Void, java.lang.Integer> binderCall) {
+        if (mDaysSinceMyBirthday != null) {
+            return mDaysSinceMyBirthday.query(null);
+        }
+        synchronized (mDaysSinceMyBirthdayLock) {
+            if (mDaysSinceMyBirthday == null) {
+                mDaysSinceMyBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(1, "bluetooth", "my_unique_key",
+                                "DaysSinceMyBirthday"), binderCall);
+
+            }
+        }
+        return mDaysSinceMyBirthday.query(null);
+    }
+
+    /**
+     * This method is auto-generated- invalidate cache for
+     * {@link  android.processor.property_cache.test.Custom#getDaysSinceMyBirthday}
+     *
+     * @hide
+     */
+    public static final void invalidateDaysSinceMyBirthday() {
+        IpcDataCache.invalidateCache("bluetooth", "my_unique_key");
+    }
+
+    private static final Object sBirthdayWishesFromUserLock = new Object();
+    private static IpcDataCache<java.lang.Integer, java.lang.String> sBirthdayWishesFromUser;
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall      - lambda for remote call
+     *                        {@link
+     *                        android.processor.property_cache.test.Custom#getBirthdayWishesFromUser
+     *                        }
+     * @param bypassPredicate - lambda to bypass remote call
+     * @param query           - parameter to call remote lambda
+     * @hide
+     */
+    public static java.lang.String getBirthdayWishesFromUser(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.lang.String> binderCall,
+            IpcDataCache.BypassCall<java.lang.Integer> bypassPredicate, java.lang.Integer query) {
+        if (sBirthdayWishesFromUser != null) {
+            return sBirthdayWishesFromUser.query(query);
+        }
+        synchronized (sBirthdayWishesFromUserLock) {
+            if (sBirthdayWishesFromUser == null) {
+                sBirthdayWishesFromUser = new IpcDataCache(
+                        new IpcDataCache.Config(4, "telephony", "custom_birthday_wishes_from_user",
+                                "BirthdayWishesFromUser"), binderCall, bypassPredicate);
+
+            }
+        }
+        return sBirthdayWishesFromUser.query(query);
+    }
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall - lambda for remote call
+     *                   {@link
+     *                   android.processor.property_cache.test.Custom#getBirthdayWishesFromUser }
+     * @param query      - parameter to call remote lambda
+     * @hide
+     */
+    public static java.lang.String getBirthdayWishesFromUser(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.lang.String> binderCall,
+            java.lang.Integer query) {
+        if (sBirthdayWishesFromUser != null) {
+            return sBirthdayWishesFromUser.query(query);
+        }
+        synchronized (sBirthdayWishesFromUserLock) {
+            if (sBirthdayWishesFromUser == null) {
+                sBirthdayWishesFromUser = new IpcDataCache(
+                        new IpcDataCache.Config(4, "telephony", "custom_birthday_wishes_from_user",
+                                "BirthdayWishesFromUser"), binderCall);
+
+            }
+        }
+        return sBirthdayWishesFromUser.query(query);
+    }
+
+    /**
+     * This method is auto-generated- invalidate cache for
+     * {@link  android.processor.property_cache.test.Custom#getBirthdayWishesFromUser}
+     *
+     * @hide
+     */
+    public static final void invalidateBirthdayWishesFromUser() {
+        IpcDataCache.invalidateCache("telephony", "custom_birthday_wishes_from_user");
+    }
+
+
+    /**
+     * This method is auto-generated - initialise all caches for class CustomCache
+     *
+     * @hide
+     */
+    public static void initCache() {
+        CustomCache.invalidateBirthday();
+        CustomCache.invalidateDaysTillBirthday();
+        CustomCache.invalidateDaysSinceBirthday();
+        CustomCache.invalidateDaysTillMyBirthday();
+        CustomCache.invalidateDaysSinceMyBirthday();
+        CustomCache.invalidateBirthdayWishesFromUser();
+    }
+}
diff --git a/tools/processors/property_cache/test/resources/Default.java b/tools/processors/property_cache/test/resources/Default.java
new file mode 100644
index 0000000..d2449aa
--- /dev/null
+++ b/tools/processors/property_cache/test/resources/Default.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2024 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 android.processor.property_cache.test;
+
+import com.android.internal.annotations.CacheModifier;
+import com.android.internal.annotations.CachedProperty;
+import com.android.internal.annotations.CachedPropertyDefaults;
+
+import java.util.Date;
+
+@CachedPropertyDefaults()
+public class Default {
+    BirthdayManagerService mService = new BirthdayManagerService();
+    Object mCache = new DefaultCache();
+
+    /** Testing default class values to generate static IpcDataCache
+     *
+     * @param userId - user Id
+     * @return birthday date of given user Id
+     */
+    @CachedProperty()
+    public Date getBirthday(int userId) {
+        return DefaultCache.getBirthday(mService::getBirthday, userId);
+    }
+
+    /** Testing default class values to generate static IpcDataCache
+     *
+     * @param userId - user Id
+     * @return number of days till birthday of given user Id
+     */
+    @CachedProperty(modsFlagOnOrNone = {CacheModifier.STATIC})
+    public int getDaysTillBirthday(int userId) {
+        return DefaultCache.getDaysTillBirthday(mService::getDaysTillBirthday, userId);
+    }
+
+    /** Testing generate non-static IpcDataCache
+     *
+     * @param userId - user Id
+     * @return number of days since birthday of given user Id
+     */
+    @CachedProperty(modsFlagOnOrNone = {})
+    public int getDaysSinceBirthday(int userId) {
+        return ((DefaultCache) mCache).getDaysSinceBirthday(mService::getDaysSinceBirthday, userId);
+    }
+
+    /** Testing default class values to generate static IpcDataCache with max capacity of 1
+     *
+     * @return number of days till birthay of current user
+     */
+    @CachedProperty(
+            modsFlagOnOrNone = {CacheModifier.STATIC},
+            max = 1)
+    public int getDaysTillMyBirthday() {
+        return DefaultCache.getDaysTillMyBirthday((Void) -> mService.getDaysTillMyBirthday());
+    }
+
+    /** Testing default class values to generate static IpcDataCache with max capacity of 1 and
+    custom api
+     *
+     * @return number of days since birthay of current user
+     */
+    @CachedProperty(
+            modsFlagOnOrNone = {},
+            max = 1,
+            api = "my_unique_key")
+    public int getDaysSinceMyBirthday() {
+        return ((DefaultCache) mCache).getDaysSinceMyBirthday(
+                (Void) -> mService.getDaysSinceMyBirthday());
+    }
+
+    /** Testing default class values to generate static IpcDataCache with custom module name
+     *
+     * @return birthday wishes of given user Id
+     */
+    @CachedProperty(module = "telephony")
+    public String getBirthdayWishesFromUser(int userId) {
+        return DefaultCache.getBirthdayWishesFromUser(mService::getBirthdayWishesFromUser,
+                userId);
+    }
+
+    class BirthdayManagerService {
+
+        BirthdayManagerService() {
+            DefaultCache.initCache();
+        }
+
+        public Date getBirthday(int userId) {
+            return new Date();
+        }
+
+        public int getDaysTillBirthday(int userId) {
+            return 0;
+        }
+
+        public int getDaysSinceBirthday(int userId) {
+            return 0;
+        }
+
+        public int getDaysTillMyBirthday() {
+            return 0;
+        }
+
+        public int getDaysSinceMyBirthday() {
+            return 0;
+        }
+
+        public String getBirthdayWishesFromUser(int userId) {
+            return "Happy Birthday!\n- " + userId;
+        }
+    }
+}
diff --git a/tools/processors/property_cache/test/resources/DefaultCache.java b/tools/processors/property_cache/test/resources/DefaultCache.java
new file mode 100644
index 0000000..9531118
--- /dev/null
+++ b/tools/processors/property_cache/test/resources/DefaultCache.java
@@ -0,0 +1,402 @@
+/*
+ * Copyright (C) 2024 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 android.processor.property_cache.test;
+
+import android.os.IpcDataCache;
+
+/**
+ * This class is auto-generated
+ *
+ * @hide
+ **/
+public class DefaultCache {
+    private static final Object sBirthdayLock = new Object();
+    private static IpcDataCache<java.lang.Integer, java.util.Date> sBirthday;
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall      - lambda for remote call
+     *                        {@link  android.processor.property_cache.test.Default#getBirthday }
+     * @param bypassPredicate - lambda to bypass remote call
+     * @param query           - parameter to call remote lambda
+     * @hide
+     */
+    public static java.util.Date getBirthday(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.util.Date> binderCall,
+            IpcDataCache.BypassCall<java.lang.Integer> bypassPredicate, java.lang.Integer query
+    ) {
+        if (sBirthday != null) {
+            return sBirthday.query(query);
+        }
+        synchronized (sBirthdayLock) {
+            if (sBirthday == null) {
+                sBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(32, "system_server",
+                                "default_birthday", "Birthday"),
+                        binderCall, bypassPredicate);
+
+            }
+        }
+        return sBirthday.query(query);
+    }
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall - lambda for remote call
+     *                   {@link  android.processor.property_cache.test.Default#getBirthday }
+     * @param query      - parameter to call remote lambda
+     * @hide
+     */
+    public static java.util.Date getBirthday(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.util.Date> binderCall,
+            java.lang.Integer query
+    ) {
+        if (sBirthday != null) {
+            return sBirthday.query(query);
+        }
+        synchronized (sBirthdayLock) {
+            if (sBirthday == null) {
+                sBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(32, "system_server",
+                                "default_birthday", "Birthday"),
+                        binderCall);
+
+            }
+        }
+        return sBirthday.query(query);
+    }
+
+    /**
+     * This method is auto-generated- invalidate cache for
+     * {@link  android.processor.property_cache.test.Default#getBirthday}
+     *
+     * @hide
+     */
+    public static final void invalidateBirthday() {
+        IpcDataCache.invalidateCache("system_server", "default_birthday");
+    }
+
+    private static final Object sDaysTillBirthdayLock = new Object();
+    private static IpcDataCache<java.lang.Integer, java.lang.Integer> sDaysTillBirthday;
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall      - lambda for remote call
+     *                        {@link
+     *                        android.processor.property_cache.test.Default#getDaysTillBirthday }
+     * @param bypassPredicate - lambda to bypass remote call
+     * @param query           - parameter to call remote lambda
+     * @hide
+     */
+    public static java.lang.Integer getDaysTillBirthday(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.lang.Integer> binderCall,
+            IpcDataCache.BypassCall<java.lang.Integer> bypassPredicate, java.lang.Integer query
+    ) {
+        if (sDaysTillBirthday != null) {
+            return sDaysTillBirthday.query(query);
+        }
+        synchronized (sDaysTillBirthdayLock) {
+            if (sDaysTillBirthday == null) {
+                sDaysTillBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(32, "system_server", "default_days_till_birthday",
+                                "DaysTillBirthday"), binderCall, bypassPredicate);
+
+            }
+        }
+        return sDaysTillBirthday.query(query);
+    }
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall - lambda for remote call
+     *                   {@link  android.processor.property_cache.test.Default#getDaysTillBirthday
+     *                   }
+     * @param query      - parameter to call remote lambda
+     * @hide
+     */
+    public static java.lang.Integer getDaysTillBirthday(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.lang.Integer> binderCall,
+            java.lang.Integer query
+    ) {
+        if (sDaysTillBirthday != null) {
+            return sDaysTillBirthday.query(query);
+        }
+        synchronized (sDaysTillBirthdayLock) {
+            if (sDaysTillBirthday == null) {
+                sDaysTillBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(32, "system_server", "default_days_till_birthday",
+                                "DaysTillBirthday"), binderCall);
+
+            }
+        }
+        return sDaysTillBirthday.query(query);
+    }
+
+    /**
+     * This method is auto-generated- invalidate cache for
+     * {@link  android.processor.property_cache.test.Default#getDaysTillBirthday}
+     *
+     * @hide
+     */
+    public static final void invalidateDaysTillBirthday() {
+        IpcDataCache.invalidateCache("system_server", "default_days_till_birthday");
+    }
+
+    private final Object mDaysSinceBirthdayLock = new Object();
+    private IpcDataCache<java.lang.Integer, java.lang.Integer> mDaysSinceBirthday;
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall      - lambda for remote call
+     *                        {@link
+     *                        android.processor.property_cache.test.Default#getDaysSinceBirthday }
+     * @param bypassPredicate - lambda to bypass remote call
+     * @param query           - parameter to call remote lambda
+     * @hide
+     */
+    public java.lang.Integer getDaysSinceBirthday(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.lang.Integer> binderCall,
+            IpcDataCache.BypassCall<java.lang.Integer> bypassPredicate, java.lang.Integer query
+    ) {
+        if (mDaysSinceBirthday != null) {
+            return mDaysSinceBirthday.query(query);
+        }
+        synchronized (mDaysSinceBirthdayLock) {
+            if (mDaysSinceBirthday == null) {
+                mDaysSinceBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(32, "system_server", "default_days_since_birthday",
+                                "DaysSinceBirthday"), binderCall, bypassPredicate);
+
+            }
+        }
+        return mDaysSinceBirthday.query(query);
+    }
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall - lambda for remote call
+     *                   {@link  android.processor.property_cache.test.Default#getDaysSinceBirthday
+     *                   }
+     * @param query      - parameter to call remote lambda
+     * @hide
+     */
+    public java.lang.Integer getDaysSinceBirthday(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.lang.Integer> binderCall,
+            java.lang.Integer query
+    ) {
+        if (mDaysSinceBirthday != null) {
+            return mDaysSinceBirthday.query(query);
+        }
+        synchronized (mDaysSinceBirthdayLock) {
+            if (mDaysSinceBirthday == null) {
+                mDaysSinceBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(32, "system_server", "default_days_since_birthday",
+                                "DaysSinceBirthday"), binderCall);
+
+            }
+        }
+        return mDaysSinceBirthday.query(query);
+    }
+
+    /**
+     * This method is auto-generated- invalidate cache for
+     * {@link  android.processor.property_cache.test.Default#getDaysSinceBirthday}
+     *
+     * @hide
+     */
+    public static final void invalidateDaysSinceBirthday() {
+        IpcDataCache.invalidateCache("system_server", "default_days_since_birthday");
+    }
+
+    private static final Object sDaysTillMyBirthdayLock = new Object();
+    private static IpcDataCache<java.lang.Void, java.lang.Integer> sDaysTillMyBirthday;
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall - lambda for remote call
+     *                   {@link  android.processor.property_cache.test.Default#getDaysTillMyBirthday
+     *                   }
+     * @hide
+     */
+    public static java.lang.Integer getDaysTillMyBirthday(
+            IpcDataCache.RemoteCall<java.lang.Void, java.lang.Integer> binderCall
+    ) {
+        if (sDaysTillMyBirthday != null) {
+            return sDaysTillMyBirthday.query(null);
+        }
+        synchronized (sDaysTillMyBirthdayLock) {
+            if (sDaysTillMyBirthday == null) {
+                sDaysTillMyBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(1, "system_server", "default_days_till_my_birthday",
+                                "DaysTillMyBirthday"), binderCall);
+
+            }
+        }
+        return sDaysTillMyBirthday.query(null);
+    }
+
+    /**
+     * This method is auto-generated- invalidate cache for
+     * {@link  android.processor.property_cache.test.Default#getDaysTillMyBirthday}
+     *
+     * @hide
+     */
+    public static final void invalidateDaysTillMyBirthday() {
+        IpcDataCache.invalidateCache("system_server", "default_days_till_my_birthday");
+    }
+
+    private final Object mDaysSinceMyBirthdayLock = new Object();
+    private IpcDataCache<java.lang.Void, java.lang.Integer> mDaysSinceMyBirthday;
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall - lambda for remote call
+     *                   {@link
+     *                   android.processor.property_cache.test.Default#getDaysSinceMyBirthday }
+     * @hide
+     */
+    public java.lang.Integer getDaysSinceMyBirthday(
+            IpcDataCache.RemoteCall<java.lang.Void, java.lang.Integer> binderCall
+    ) {
+        if (mDaysSinceMyBirthday != null) {
+            return mDaysSinceMyBirthday.query(null);
+        }
+        synchronized (mDaysSinceMyBirthdayLock) {
+            if (mDaysSinceMyBirthday == null) {
+                mDaysSinceMyBirthday = new IpcDataCache(
+                        new IpcDataCache.Config(1, "system_server", "my_unique_key",
+                                "DaysSinceMyBirthday"), binderCall);
+
+            }
+        }
+        return mDaysSinceMyBirthday.query(null);
+    }
+
+    /**
+     * This method is auto-generated- invalidate cache for
+     * {@link  android.processor.property_cache.test.Default#getDaysSinceMyBirthday}
+     *
+     * @hide
+     */
+    public static final void invalidateDaysSinceMyBirthday() {
+        IpcDataCache.invalidateCache("system_server", "my_unique_key");
+    }
+
+    private static final Object sBirthdayWishesFromUserLock = new Object();
+    private static IpcDataCache<java.lang.Integer, java.lang.String> sBirthdayWishesFromUser;
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall      - lambda for remote call
+     *                        {@link
+     *
+     *                       android.processor.property_cache.test.Default#getBirthdayWishesFromUser
+     *                        }
+     * @param bypassPredicate - lambda to bypass remote call
+     * @param query           - parameter to call remote lambda
+     * @hide
+     */
+    public static java.lang.String getBirthdayWishesFromUser(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.lang.String> binderCall,
+            IpcDataCache.BypassCall<java.lang.Integer> bypassPredicate, java.lang.Integer query
+    ) {
+        if (sBirthdayWishesFromUser != null) {
+            return sBirthdayWishesFromUser.query(query);
+        }
+        synchronized (sBirthdayWishesFromUserLock) {
+            if (sBirthdayWishesFromUser == null) {
+                sBirthdayWishesFromUser = new IpcDataCache(
+                        new IpcDataCache.Config(32, "telephony",
+                                "default_birthday_wishes_from_user",
+                                "BirthdayWishesFromUser"), binderCall, bypassPredicate);
+
+            }
+        }
+        return sBirthdayWishesFromUser.query(query);
+    }
+
+
+    /**
+     * This method is auto-generated
+     *
+     * @param binderCall - lambda for remote call
+     *                   {@link
+     *                   android.processor.property_cache.test.Default#getBirthdayWishesFromUser }
+     * @param query      - parameter to call remote lambda
+     * @hide
+     */
+    public static java.lang.String getBirthdayWishesFromUser(
+            IpcDataCache.RemoteCall<java.lang.Integer, java.lang.String> binderCall,
+            java.lang.Integer query
+    ) {
+        if (sBirthdayWishesFromUser != null) {
+            return sBirthdayWishesFromUser.query(query);
+        }
+        synchronized (sBirthdayWishesFromUserLock) {
+            if (sBirthdayWishesFromUser == null) {
+                sBirthdayWishesFromUser = new IpcDataCache(
+                        new IpcDataCache.Config(32, "telephony",
+                                "default_birthday_wishes_from_user",
+                                "BirthdayWishesFromUser"), binderCall);
+
+            }
+        }
+        return sBirthdayWishesFromUser.query(query);
+    }
+
+    /**
+     * This method is auto-generated- invalidate cache for
+     * {@link  android.processor.property_cache.test.Default#getBirthdayWishesFromUser}
+     *
+     * @hide
+     */
+    public static final void invalidateBirthdayWishesFromUser() {
+        IpcDataCache.invalidateCache("telephony", "default_birthday_wishes_from_user");
+    }
+
+
+    /**
+     * This method is auto-generated - initialise all caches for class DefaultCache
+     *
+     * @hide
+     */
+    public static void initCache() {
+        DefaultCache.invalidateBirthday();
+        DefaultCache.invalidateDaysTillBirthday();
+        DefaultCache.invalidateDaysSinceBirthday();
+        DefaultCache.invalidateDaysTillMyBirthday();
+        DefaultCache.invalidateDaysSinceMyBirthday();
+        DefaultCache.invalidateBirthdayWishesFromUser();
+    }
+}